diff --git a/.bra.toml b/.bra.toml deleted file mode 100644 index 3fd4e0c68ed..00000000000 --- a/.bra.toml +++ /dev/null @@ -1,19 +0,0 @@ -[run] -init_cmds = [ - ["make", "build-dev"], - ["./gogs", "web"] -] -watch_all = true -watch_dirs = [ - "$WORKDIR/cmd", - "$WORKDIR/models", - "$WORKDIR/modules", - "$WORKDIR/routers" -] -watch_exts = [".go"] -ignore_files = [".+_test.go"] -build_delay = 1500 -cmds = [ - ["make", "build-dev"], # TAGS=sqlite cert pam tidb - ["./gogs", "web"] -] \ No newline at end of file diff --git a/.claude/commands/ghsa.md b/.claude/commands/ghsa.md new file mode 100644 index 00000000000..2c575628316 --- /dev/null +++ b/.claude/commands/ghsa.md @@ -0,0 +1,13 @@ +Analyze and help fix the GitHub Security Advisory (GHSA) at: $ARGUMENTS + +Steps: +1. Fetch the GHSA page using `gh api repos/gogs/gogs/security-advisories` and understand the vulnerability details (description, severity, affected versions, CWE). +2. Verify the reported vulnerability actually exists, and why. +3. Identify the affected code in this repository. +4. Propose a fix with a clear explanation of the root cause and how the fix addresses it. Check for prior art in the codebase to stay consistent with existing patterns. +5. Implement the fix. Only add tests when there is something meaningful to test at our layer. +6. Run all the usual build and test commands. +7. If a changelog entry is warranted (user will specify), add it to CHANGELOG.md with a placeholder for the PR link. +8. Create a branch named after the GHSA ID, commit, and push. +9. Create a pull request with a proper title and description, do not reveal too much detail and link the GHSA. +10. If a changelog entry was added, update it with the PR link, then commit and push again. diff --git a/.codebeatignore b/.codebeatignore deleted file mode 100644 index bfb9b911bea..00000000000 --- a/.codebeatignore +++ /dev/null @@ -1,7 +0,0 @@ -conf/** -docker/** -modules/bindata/** -packager/** -public/** -scripts/** -templates/** \ No newline at end of file diff --git a/.codebeatsettings b/.codebeatsettings deleted file mode 100644 index c6ee5c9815f..00000000000 --- a/.codebeatsettings +++ /dev/null @@ -1,7 +0,0 @@ -{ - "GOLANG": { - "TOTAL_LOC": [500, 999, 1999, 9999], - "TOO_MANY_FUNCTIONS": [50, 99, 199, 999], - "TOO_MANY_IVARS": [20, 50, 70, 99] - } -} \ No newline at end of file diff --git a/.dockerignore b/.dockerignore index b33dbf58a80..0183843a0d7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,19 +1,16 @@ -.git -.git/** -packager -packager/** scripts scripts/** .github/ .github/** -config.codekit .dockerignore *.yml *.md -.bra.toml .editorconfig .gitignore Dockerfile* -vendor -vendor/** gogs +node_modules +**/node_modules +public/dist +**/*.tsbuildinfo +**/.vite diff --git a/.editorconfig b/.editorconfig index 3fbca8424f5..850f222667e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,6 @@ root = true [*] charset = utf-8 -end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true @@ -16,10 +15,9 @@ indent_size = 4 indent_style = tab indent_size = 2 -[*.{less,yml}] +[*.{less, yml}] indent_style = space indent_size = 2 [*.js] -indent_style = space -indent_size = 4 +indent_size = 2 diff --git a/.gitattributes b/.gitattributes index 09dfc210fc7..4b8882075cc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,11 +1,8 @@ -public/conf/gitignore/* linguist-vendored -public/conf/license/* linguist-vendored -public/assets/* linguist-vendored -public/plugins/* linguist-vendored -public/plugins/* linguist-vendored -public/css/themes/* linguist-vendored -public/css/github.min.css linguist-vendored -public/css/semantic-2.2.1.min.css linguist-vendored -public/js/libs/* linguist-vendored -public/js/jquery-1.11.3.min.js linguist-vendored -public/js/semantic-2.2.1.min.js linguist-vendored \ No newline at end of file +conf/gitignore/** linguist-vendored +conf/license/** linguist-vendored +public/assets/** linguist-vendored +public/plugins/** linguist-vendored +public/css/themes/** linguist-vendored +public/css/semantic-* linguist-vendored +public/js/libs/** linguist-vendored +public/js/semantic-* linguist-vendored diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000000..fe71742058d --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +# Default +* @unknwon diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index bd4ff087459..742dc641024 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,63 +1,77 @@ -# Contributing to Gogs +# Welcome to Gogs contributing guide -> This guidelines sheet is forked from [CONTRIBUTING.md](https://github.com/drone/drone/blob/8d9c7cee56d6c2eac81dc156ce27be6716d97e68/CONTRIBUTING.md). +Thank you for investing your time in contributing to our projects! -Gogs is not perfect, and it has bugs or incomplete features in rare cases. You're welcome to tell us, or to contribute some code. This document describes details about how can you contribute to Gogs project. +Read our [Code of Conduct](https://go.dev/conduct) to keep our community approachable and respectable. -## Contribution guidelines +In this guide you will get an overview of the contribution workflow from opening an issue, creating a PR, reviewing, and merging the PR. -Depends on the situation, you will: +Use the table of contents icon on the top left corner of this document to get to a specific section of this guide quickly. -- Find a bug and create an issue -- Need more functionality and make a feature request -- Want to contribute code and open a pull request -- Run into issue and need help +## New contributor guide -### Bug Report +To get an overview of the project, read the [README](/README.md). Here are some resources to help you get started with open source contributions: -If you find something you consider a bug, please create a issue on [GitHub](https://github.com/gogits/gogs/issues). To avoid wasting time and reduce back-and-forth communication with team members, please include at least the following information in a form comfortable for you: +- [Finding ways to contribute to open source on GitHub](https://docs.github.com/en/get-started/exploring-projects-on-github/finding-ways-to-contribute-to-open-source-on-github) +- [Set up Git](https://docs.github.com/en/get-started/quickstart/set-up-git) +- [GitHub flow](https://docs.github.com/en/get-started/quickstart/github-flow) +- [Collaborating with pull requests](https://docs.github.com/en/github/collaborating-with-pull-requests) +- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) +- [Talk, then code](https://www.craft.do/s/kyHVs6OoE4Dj5V) -- Bug Description -- Gogs Version -- Git Version -- System Type -- Error Log -- Other information +In addition to the general guides with open source contributions, you would also need to: -Please take a moment to check that an issue on [GitHub](https://github.com/gogits/gogs/issues) doesn't already exist documenting your bug report or improvement proposal. If it does, it never hurts to add a quick "+1" or "I have this problem too". This will help prioritize the most common problems and requests. +- Have basic knowledge about web applications development, database management systems and programming in [Go](https://go.dev/). +- Have a working local development setup with a reasonable good IDE or editor like [Visual Studio Code](https://code.visualstudio.com/docs/languages/go), [GoLand](https://www.jetbrains.com/go/) or [Vim](https://github.com/fatih/vim-go). +- [Set up your development environment](/docs/dev/local_development.md). -#### Bug Report Example +## Issues -Gogs crashed when creating a repository with a license, using v0.5.13.0207, SQLite3, Git 1.9.0, Ubuntu 12.04. +### Ask for help -Error log: +Before opening an issue, please make sure the problem you're encountering isn't already addressed on the [Troubleshooting](https://gogs.io/asking/troubleshooting) and [FAQs](https://gogs.io/asking/faq) pages. -``` -2014/09/01 07:21:49 [E] nil pointer -``` +### Create a new issue -### Feature Request +- For questions, ask in [Discussions](https://github.com/gogs/gogs/discussions). +- [Check to make sure](https://docs.github.com/en/github/searching-for-information-on-github/searching-on-github/searching-issues-and-pull-requests#search-by-the-title-body-or-comments) someone hasn't already opened a similar [issue](https://github.com/gogs/gogs/issues). +- If a similar issue doesn't exist, open a new issue using a relevant [issue form](https://github.com/gogs/gogs/issues/new/choose). +- Blank issues that are not coming from maintainers will be closed without a response. -There is no standard form of making a feature request. Just try to describe the feature as clearly as possible, because team members may not have experience with the functionality you're talking about. +### Pick up an issue to solve -### Pull Request +- Scan through our [existing issues](https://github.com/gogs/gogs/issues) to find one that interests you. +- The [👋 good first issue](https://github.com/gogs/gogs/issues?q=is%3Aissue+is%3Aopen+label%3A%22%F0%9F%91%8B+good+first+issue%22) is a good place to start exploring issues that are well-groomed for newcomers. +- Do not hesitate to ask for more details or clarifying questions on the issue! +- Communicate on the issue you are intended to pick up _before_ starting working on it. +- Every issue that gets picked up will have an expected timeline for the implementation, the issue may be reassigned after the expected timeline. Please be responsible and proactive on the communication 🙇‍♂️ -Please read detailed information on [Wiki](https://github.com/gogits/gogs/wiki/Contributing-Code). +## Add new features or make big changes -### Ask For Help +New features or big changes require proposals before we may be able to accept any contribution. Proposals should be posted to the [Discussions - Proposal](https://github.com/gogs/gogs/discussions/categories/proposal) category for review and discussions. GitHub Discussions provides sub-threading which is much more suitable than GitHub Issues for discussions to happen. Please read [Write a proposal for open source contributions](https://unknwon.io/posts/220210-write-a-proposal-for-open-source-contributions/) to begin with. -Before opening an issue, please make sure your problem isn't already addressed on the [Troubleshooting](https://gogs.io/docs/intro/troubleshooting.html) and [FAQs](https://gogs.io/docs/intro/faqs.html) pages. +## Pull requests -## Code of conduct +When you're finished with the changes, create a pull request, or a series of pull requests if necessary. -As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. +Contributing to another codebase is not as simple as code changes, it is also about contributing influence to the design. Therefore, we kindly ask you that: -We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion. +- Please acknowledge that no pull request is guaranteed to be merged. +- Please always do a self-review before requesting reviews from others. +- Please expect code review to be strict and may have multiple rounds. +- Please make self-contained incremental changes, pull requests with huge diff may be rejected for review. +- Please use English in code comments and docstring. +- Please do not force push unless absolutely necessary. Force pushes make review much harder in multiple rounds, and we use [Squash and merge](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-pull-request-commits) so you don't need to worry about messy commits and just focus on the changes. -Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. +### Things we do not accept -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team. +1. Updates to locale files (`conf/locale_xx-XX.ini`) other than the `conf/locale_en-US.ini`. Please read the [guide for localizing Gogs](https://gogs.io/advancing/localization). +1. Docker compose files. -Instances of abusive, harassing, or otherwise unacceptable behavior can be reported by emailing u@gogs.io +### Coding guidelines -This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/) +1. Please read the Sourcegraph's [Go style guide](https://github.com/sourcegraph/sourcegraph-public-snapshot/blob/main/doc/dev/background-information/languages/go.md). + +## Your PR is merged! + +Congratulations 🎉🎉 Thanks again for taking the effort to have this journey with us 🌟 diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index da434e203c0..00000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,25 +0,0 @@ -The issue will be closed without any reasons if it does not satisfy any of following requirements: - -1. Please speak English, we have forum in [Chinese](https://discuss.gogs.io/c/getting-help/getting-help-chinese). -2. Please post questions or config/deploy problems on our forum: https://discuss.gogs.io, here are bugs and feature requests only. -3. Please take a moment to search that an issue doesn't already exist. -4. Please give all relevant information below for bug reports; incomplete details considered invalid report. - -**You MUST delete above content including this line before posting; too lazy to take this action considered invalid report.** - -- Gogs version (or commit ref): -- Git version: -- Operating system: -- Database (use `[x]`): - - [ ] PostgreSQL - - [ ] MySQL - - [ ] SQLite -- Can you reproduce the bug at https://try.gogs.io: - - [ ] Yes (provide example URL) - - [ ] No - - [ ] Not relevant -- Log gist: - -## Description - -... diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000000..75cadc947d8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,82 @@ +name: Bug report +description: File a bug report to help us improve +labels: ["\U0001F48A bug"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + + - Please use English :) + - For questions, ask in [Discussions](https://github.com/gogs/gogs/discussions). + - Before you file an issue read the [Contributing guide](https://github.com/gogs/gogs/blob/main/.github/CONTRIBUTING.md). + - Check to make sure someone hasn't already opened a similar [issue](https://github.com/gogs/gogs/issues). + - type: input + attributes: + label: Gogs version + description: | + Please specify the exact Gogs version you're reporting for, e.g. "0.12.3". You can find the version information in the admin dashboard (`/admin`). + + _Note that "gogs/gogs:latest" is not a Gogs version, it does not mean anything._ + validations: + required: true + - type: textarea + attributes: + label: Git version + description: | + Please specify the exact Git version you're using of both server and client. You can find the version information by running `git version`. + value: | + - Server: + - Client: + validations: + required: true + - type: input + attributes: + label: Operating system + description: | + Please specify the exact operating system name and version you're reporting for, e.g. "Windows 10", "CentOS 7", "Ubuntu 20.04". + validations: + required: true + - type: input + attributes: + label: Database + description: | + Please specify the exact database and version you're reporting for, e.g. "PostgreSQL 9.6", "MySQL 5.7", "SQLite 3". + validations: + required: true + - type: textarea + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + attributes: + label: To reproduce + description: The steps to reproduce the problem described above. + validations: + required: true + - type: textarea + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + - type: textarea + attributes: + label: Additional context + description: | + Links? References? Suggestions? Anything that will give us more context about the issue you are encountering! + + Please include any error logs found in the `log/gogs.log` file. Otherwise, we probably won't be able to help you much. + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false + - type: checkboxes + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://go.dev/conduct) + options: + - label: I agree to follow this project's Code of Conduct + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000000..0fd65e42e27 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: Ask questions + url: https://github.com/gogs/gogs/discussions + about: Please ask questions in Discussions. + - name: Make a proposal + url: https://github.com/gogs/gogs/discussions/categories/proposal + about: Please make proposals in Discussions. diff --git a/.github/ISSUE_TEMPLATE/dev_release_minor_version.md b/.github/ISSUE_TEMPLATE/dev_release_minor_version.md new file mode 100644 index 00000000000..5bf57d1dca9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/dev_release_minor_version.md @@ -0,0 +1,46 @@ +--- +name: "Dev: Release a minor version" +about: ONLY USED BY MAINTAINERS. +assignees: "unknwon" +title: "Release [VERSION]" +labels: 📸 release +--- + +_This is generated from the [minor release template](https://github.com/gogs/gogs/blob/main/.github/ISSUE_TEMPLATE/dev_release_minor_version.md)._ + +## Before release + +On the `main` branch: + +- [ ] Close stale issues with the label [status: needs feedback](https://github.com/gogs/gogs/issues?q=is%3Aissue+is%3Aopen+label%3A%22status%3A+needs+feedback%22). +- [ ] [Sync locales from Crowdin](https://github.com/gogs/gogs/blob/main/docs/dev/import_locale.md). +- [ ] [Update CHANGELOG](https://github.com/gogs/gogs/commit/f1102a7a7c545ec221d2906f02fa19170d96f96d) to include entries for the current minor release. + - Do not forget adding entries for GHSA patches. +- [ ] Cut a new release branch `release/.`, e.g. `release/0.14`. + +## During release + +On the release branch: + +- [ ] [Update the hard-coded version](https://github.com/gogs/gogs/commit/f0e3cd90f8d7695960eeef2e4e54b2e717302f6c) to the current release, e.g. `0.14.0+dev` -> `0.14.0`. +- [ ] Wait for GitHub Actions to complete and no failed jobs. +- [ ] Publish new RC releases (e.g. `v0.14.0-rc.1`, `v0.14.0-rc.2`) ⚠️ **on the release branch** ⚠️ and ensure Docker and release workflows both succeed. + - [ ] Pull down the Docker image and [run through application setup](https://github.com/gogs/gogs/blob/main/docker/README.md) to make sure nothing blows up. + - [ ] Download one of the release archives and run through application setup to make sure nothing blows up. +- [ ] Publish a new [GitHub release](https://github.com/gogs/gogs/releases) ⚠️ **on the release branch** ⚠️ with entries from [CHANGELOG](https://github.com/gogs/gogs/blob/main/CHANGELOG.md) for the current minor release. +- [ ] [Wait for new image tags for the current release](https://github.com/gogs/gogs/actions/workflows/docker.yml?query=event%3Arelease) to be created automatically on both [Docker Hub](https://hub.docker.com/r/gogs/gogs/tags) and [GitHub Container registry](https://github.com/gogs/gogs/pkgs/container/gogs). + - Pull down the Docker image and [run through application setup](https://github.com/gogs/gogs/blob/main/docker/README.md) to make sure nothing blows up. +- [ ] Download all release archives and [generate SHA256 checksum](https://github.com/gogs/gogs/blob/main/docs/dev/release/sha256.sh) for all binaries to the file `checksum_sha256.txt`. +- [ ] Upload all archives and `checksum_sha256.txt` to https://dl.gogs.io. + +## After release + +On the `main` branch: + +- [ ] Update the repository mirror on [Gitee](https://gitee.com/unknwon/gogs). +- [ ] Create a new release announcement in [Discussions](https://github.com/gogs/gogs/discussions/categories/announcements). +- [ ] Send a tweet on the [official Twitter account](https://twitter.com/GogsHQ) for the minor release. +- [ ] Close the milestone for the minor release. +- [ ] [Bump the hard-coded version](https://github.com/gogs/gogs/commit/a98968436cd5841cf691bb0b80c54c81470d1676) to the new develop version, e.g. `0.14.0+dev` -> `0.15.0+dev`. +- [ ] Run `grep -rnw "\(LEGACY\|Deprecated\)" internal` to identify deprecated code that is aimed to be removed in current develop version. +- [ ] **After 14 days**, publish [GitHub security advisories](https://github.com/gogs/gogs/security) for security patches included in the release. diff --git a/.github/ISSUE_TEMPLATE/dev_release_patch_version.md b/.github/ISSUE_TEMPLATE/dev_release_patch_version.md new file mode 100644 index 00000000000..d76e9babf29 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/dev_release_patch_version.md @@ -0,0 +1,49 @@ +--- +name: "Dev: Release a patch version" +about: ONLY USED BY MAINTAINERS. +assignees: "unknwon" +title: "Release [VERSION]" +labels: 📸 release +--- + +_This is generated from the [patch release template](https://github.com/gogs/gogs/blob/main/.github/ISSUE_TEMPLATE/dev_release_patch_version.md)._ + +## Before release + +On the release branch: + +- [ ] Make sure all commits are cherry-picked from the `main` branch by checking the patch milestone. + - Run `moon run gogs:build-prod --force` for every cherry-picked commit to make sure there is no compilation error. +- [ ] [Update CHANGELOG on the `main` branch](https://github.com/gogs/gogs/commit/f1102a7a7c545ec221d2906f02fa19170d96f96d) to include entries for the current patch release. + +## During release + +On the release branch: + +- [ ] [Update the hard-coded version](https://github.com/gogs/gogs/commit/f0e3cd90f8d7695960eeef2e4e54b2e717302f6c) to the current release, e.g. `0.12.0` -> `0.12.1`. +- [ ] Wait for GitHub Actions to complete and no failed jobs. +- [ ] Publish new RC releases in [GitHub release](https://github.com/gogs/gogs/releases) (e.g. `v0.12.0-rc.1`, `v0.12.0-rc.2`) ⚠️ **on the release branch** ⚠️ and ensure Docker workflow succeeds. + - [ ] Pull down the Docker image and [run through application setup](https://github.com/gogs/gogs/blob/main/docker/README.md) to make sure nothing blows up. + - [ ] Download one of the release archives and run through application setup to make sure nothing blows up. +- [ ] Publish a new [GitHub release](https://github.com/gogs/gogs/releases) ⚠️ **on the release branch** ⚠️ with entries from [CHANGELOG](https://github.com/gogs/gogs/blob/main/CHANGELOG.md) for the current patch release and all previous releases with same minor version. +- [ ] Update all previous GitHub releases with same minor version with the warning: + ``` + **ℹ️ Heads up! There is a new patch release [0.12.1](https://github.com/gogs/gogs/releases/tag/v0.12.1) available, we recommend directly installing or upgrading to that version.** + ``` +- [ ] [Wait for new image tags for the current release](https://github.com/gogs/gogs/actions/workflows/docker.yml?query=event%3Arelease) to be created automatically on both [Docker Hub](https://hub.docker.com/r/gogs/gogs/tags) and [GitHub Container registry](https://github.com/gogs/gogs/pkgs/container/gogs). + - Pull down the Docker image and [run through application setup](https://github.com/gogs/gogs/blob/main/docker/README.md) to make sure nothing blows up. +- [ ] Download all release archives and [generate SHA256 checksum](https://github.com/gogs/gogs/blob/main/docs/dev/release/sha256.sh) for all binaries to the file `checksum_sha256.txt`. +- [ ] Upload all archives and `checksum_sha256.txt` to https://dl.gogs.io. + +## After release + +On the `main` branch: + +- [ ] Post the following message on issues that are included in the patch milestone: + ``` + The .. has been released that includes the patch of the reported issue. + ``` +- [ ] Create a new release announcement in [Discussions](https://github.com/gogs/gogs/discussions/categories/announcements). +- [ ] Send a tweet on the [official Twitter account](https://twitter.com/GogsHQ) for the patch release. +- [ ] Close the milestone for the patch release. +- [ ] **After 14 days**, publish [GitHub security advisories](https://github.com/gogs/gogs/security) for security patches included in the release. diff --git a/.github/ISSUE_TEMPLATE/documentation.yml b/.github/ISSUE_TEMPLATE/documentation.yml new file mode 100644 index 00000000000..99a37267c44 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation.yml @@ -0,0 +1,32 @@ +name: Improve documentation +description: Suggest an idea or a patch for documentation +labels: ["📖 documentation"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this form! + + - Please use English :) + - For questions, ask in [Discussions](https://github.com/gogs/gogs/discussions). + - Before you file an issue read the [Contributing guide](https://github.com/gogs/gogs/blob/main/.github/CONTRIBUTING.md). + - Check to make sure someone hasn't already opened a similar [issue](https://github.com/gogs/gogs/issues). + - type: textarea + attributes: + label: What needs to be improved? Please describe + description: A clear and concise description of what is wrong or missing. + validations: + required: true + - type: textarea + attributes: + label: Why do you think it is important? + description: A clear and concise explanation of the rationale. + validations: + required: true + - type: checkboxes + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://go.dev/conduct) + options: + - label: I agree to follow this project's Code of Conduct + required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000000..55295adc924 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,47 @@ +name: Feature request +description: Suggest an idea for this project +labels: ["\U0001F3AF feature"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this form! + + - Please use English :) + - For questions, ask in [Discussions](https://github.com/gogs/gogs/discussions). + - Before you file an issue read the [Contributing guide](https://github.com/gogs/gogs/blob/main/.github/CONTRIBUTING.md). + - Check to make sure someone hasn't already opened a similar [issue](https://github.com/gogs/gogs/issues). + - type: textarea + attributes: + label: Describe the feature + description: A clear and concise description of what the feature is, e.g. I think it is reasonable to have [...] + validations: + required: true + - type: textarea + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: true + - type: textarea + attributes: + label: Additional context + description: | + Links? References? Suggestions? Anything that will give us more context about the feature you are requesting! + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. + validations: + required: false + - type: checkboxes + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://go.dev/conduct) + options: + - label: I agree to follow this project's Code of Conduct + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index b1cf1a4ecaf..00000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,9 +0,0 @@ -The pull request will be closed without any reasons if it does not satisfy any of following requirements: - -1. Please make sure you are targeting the `develop` branch. -2. Please read contributing guidelines: -https://github.com/gogits/gogs/wiki/Contributing-Code -3. Please describe what your pull request does and which issue you're targeting -4. ... if it is not related to any particular issues, explain why we should not reject your pull request. - -**You MUST delete above content including this line before posting; too lazy to take this action considered invalid pull request.** diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..fb014a2362e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,9 @@ +# Docs: https://git.io/JCUAY +version: 2 +updates: + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "monthly" + commit-message: + prefix: "mod:" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000000..f3617342498 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,16 @@ +## Describe the pull request + +A clear and concise description of what the pull request is about, i.e. what problem should be fixed? + +Link to the issue: + +## Checklist + +- [ ] I agree to follow the [Code of Conduct](https://go.dev/conduct) by submitting this pull request. +- [ ] I have read and acknowledge the [Contributing guide](https://github.com/gogs/gogs/blob/main/.github/CONTRIBUTING.md). +- [ ] I have added test cases to cover the new code or have provided the test plan. (if applicable) +- [ ] I have added an entry to [CHANGELOG](https://github.com/gogs/gogs/blob/main/CHANGELOG.md). (if applicable) + +## Test plan + + diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000000..77625bf0c94 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,75 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ main ] + pull_request: + paths: + - '.github/workflows/codeql.yml' + schedule: + - cron: '0 19 * * 0' + +permissions: + contents: read + security-events: write + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + language: [ 'go' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Check out repository + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@fdbfb4d2750291e159f0156def62b853c2798ca2 # v3.28.3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@fdbfb4d2750291e159f0156def62b853c2798ca2 # v3.28.3 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@fdbfb4d2750291e159f0156def62b853c2798ca2 # v3.28.3 diff --git a/.github/workflows/digitalocean_gc.yml b/.github/workflows/digitalocean_gc.yml new file mode 100644 index 00000000000..42344729c38 --- /dev/null +++ b/.github/workflows/digitalocean_gc.yml @@ -0,0 +1,26 @@ +name: DigitalOcean +on: + workflow_dispatch: + workflow_call: + +jobs: + garbage-collection: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Install doctl + uses: digitalocean/action-doctl@5727c67aa3c2c34ae9462d5a0ecfea8a1b31e5ce # v2 + with: + token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} + - name: Run garbage collection + run: | + # --force: Required for CI to skip confirmation prompts + # --include-untagged-manifests: Deletes unreferenced manifests to maximize space + doctl registry garbage-collection start --force --include-untagged-manifests + - name: Send email on failure + uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 + if: ${{ failure() }} + with: + smtp_username: ${{ secrets.SMTP_USERNAME }} + smtp_password: ${{ secrets.SMTP_PASSWORD }} diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000000..4fc78b7e732 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,397 @@ +name: Docker +on: + push: + branches: + - main + pull_request: + paths: + - '.trivy.yaml' + - 'Dockerfile' + - 'Dockerfile.next' + - 'docker/**' + - 'docker-next/**' + - '.github/workflows/docker.yml' + release: + types: [ published ] + +jobs: + buildx-next: + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository == 'gogs/gogs' }} + concurrency: + group: ${{ github.workflow }}-next-${{ github.ref }} + cancel-in-progress: true + runs-on: ubuntu-latest + permissions: + actions: write + contents: read + packages: write + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Set up QEMU + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 + with: + platforms: linux/amd64,linux/arm64,linux/arm/v7 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + - name: Inspect builder + run: | + echo "Name: ${{ steps.buildx.outputs.name }}" + echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" + echo "Status: ${{ steps.buildx.outputs.status }}" + echo "Flags: ${{ steps.buildx.outputs.flags }}" + echo "Platforms: ${{ steps.buildx.outputs.platforms }}" + - name: Login to Docker Hub + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GitHub Container registry + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Login to DigitalOcean Container registry + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + with: + registry: registry.digitalocean.com + username: ${{ secrets.DIGITALOCEAN_USERNAME }} + password: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} + - name: Build and push next-gen images + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + context: . + file: Dockerfile.next + platforms: linux/amd64,linux/arm64,linux/arm/v7 + push: true + tags: | + gogs/gogs:edge + ghcr.io/gogs/gogs:edge + registry.digitalocean.com/gogs/gogs:edge + - name: Scan for container vulnerabilities + uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # 0.35.0 + with: + image-ref: gogs/gogs:edge + exit-code: '1' + - name: Send email on failure + uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 + if: ${{ failure() }} + with: + smtp_username: ${{ secrets.SMTP_USERNAME }} + smtp_password: ${{ secrets.SMTP_PASSWORD }} + + deploy-demo: + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository == 'gogs/gogs' }} + needs: buildx-next + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Configure kubectl + run: | + mkdir -p ~/.kube + echo "${KUBECONFIG}" | base64 -d > ~/.kube/config + env: + KUBECONFIG: ${{ secrets.DIGITALOCEAN_K8S_CLUSTER_KUBECONFIG }} + - name: Restart gogs-demo deployment + timeout-minutes: 5 + run: | + set -ex + kubectl rollout restart deployment gogs-demo -n gogs + kubectl rollout status deployment gogs-demo -n gogs + - name: Send email on failure + uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 + if: ${{ failure() }} + with: + smtp_username: ${{ secrets.SMTP_USERNAME }} + smtp_password: ${{ secrets.SMTP_PASSWORD }} + + buildx-pull-request: + if: ${{ github.event_name == 'pull_request'}} + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + with: + config-inline: | + [worker.oci] + max-parallelism = 2 + - name: Inspect builder + run: | + echo "Name: ${{ steps.buildx.outputs.name }}" + echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" + echo "Status: ${{ steps.buildx.outputs.status }}" + echo "Flags: ${{ steps.buildx.outputs.flags }}" + echo "Platforms: ${{ steps.buildx.outputs.platforms }}" + - name: Compute short commit SHA + id: short-sha + uses: benjlevesque/short-sha@599815c8ee942a9616c92bcfb4f947a3b670ab0b # v3.0 + - name: Build and push images + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + context: . + platforms: linux/amd64 + push: true + tags: | + ttl.sh/gogs/gogs-${{ steps.short-sha.outputs.sha }}:7d + - name: Scan for container vulnerabilities + uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # 0.35.0 + with: + image-ref: ttl.sh/gogs/gogs-${{ steps.short-sha.outputs.sha }}:7d + exit-code: '1' + + buildx-next-pull-request: + if: ${{ github.event_name == 'pull_request'}} + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + with: + config-inline: | + [worker.oci] + max-parallelism = 2 + - name: Inspect builder + run: | + echo "Name: ${{ steps.buildx.outputs.name }}" + echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" + echo "Status: ${{ steps.buildx.outputs.status }}" + echo "Flags: ${{ steps.buildx.outputs.flags }}" + echo "Platforms: ${{ steps.buildx.outputs.platforms }}" + - name: Compute short commit SHA + id: short-sha + uses: benjlevesque/short-sha@599815c8ee942a9616c92bcfb4f947a3b670ab0b # v3.0 + - name: Build and push next-gen images + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + context: . + file: Dockerfile.next + platforms: linux/amd64 + push: true + tags: | + ttl.sh/gogs/gogs-next-${{ steps.short-sha.outputs.sha }}:7d + - name: Scan for container vulnerabilities + uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # 0.35.0 + with: + image-ref: ttl.sh/gogs/gogs-next-${{ steps.short-sha.outputs.sha }}:7d + exit-code: '1' + + # Updates to the following section needs to be synced to all release branches within their lifecycles. + buildx-release: + if: ${{ github.event_name == 'release' }} + runs-on: ubuntu-latest + permissions: + actions: write + contents: read + packages: write + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + with: + # Full history with tags is required so the next step can determine + # whether this release is the highest stable version across the repo. + fetch-depth: 0 + fetch-tags: true + - name: Compute image tags + run: | + IMAGE_TAG=$(echo $GITHUB_REF_NAME | cut -c 2-) + echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV + + TAGS="gogs/gogs:$IMAGE_TAG + ghcr.io/gogs/gogs:$IMAGE_TAG" + + # For stable releases (no prerelease suffix per semver), add the + # minor-version tag only if this release is the highest patch of that + # minor line, and add `latest` only if this release is the highest + # stable version across the repository. Back-patches on older lines + # must not clobber moving tags. + if [[ ! "$IMAGE_TAG" =~ - ]]; then + STABLE_TAGS=$(git tag --list 'v*' | sed 's/^v//' | grep -v -- '-' || true) + HIGHEST_STABLE=$(echo "$STABLE_TAGS" | sort -V | tail -n 1) + MINOR_TAG=$(echo "$IMAGE_TAG" | cut -d. -f1,2) + # `|| true` keeps the step running when `grep` finds no matches, + # since bash runs with `-e -o pipefail` in GitHub Actions. + HIGHEST_IN_MINOR=$(echo "$STABLE_TAGS" | { grep "^${MINOR_TAG}\." || true; } | sort -V | tail -n 1) + + if [[ "$IMAGE_TAG" == "$HIGHEST_IN_MINOR" ]]; then + TAGS="$TAGS + gogs/gogs:$MINOR_TAG + ghcr.io/gogs/gogs:$MINOR_TAG" + fi + if [[ "$IMAGE_TAG" == "$HIGHEST_STABLE" ]]; then + TAGS="$TAGS + gogs/gogs:latest + ghcr.io/gogs/gogs:latest" + fi + fi + + echo "TAGS<> $GITHUB_ENV + echo "$TAGS" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + - name: Set up QEMU + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 + with: + platforms: linux/amd64,linux/arm64,linux/arm/v7 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + - name: Inspect builder + run: | + echo "Name: ${{ steps.buildx.outputs.name }}" + echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" + echo "Status: ${{ steps.buildx.outputs.status }}" + echo "Flags: ${{ steps.buildx.outputs.flags }}" + echo "Platforms: ${{ steps.buildx.outputs.platforms }}" + - name: Login to Docker Hub + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GitHub Container registry + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push images + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + context: . + platforms: linux/amd64,linux/arm64,linux/arm/v7 + push: true + tags: ${{ env.TAGS }} + - name: Scan for container vulnerabilities + uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # 0.35.0 + with: + image-ref: gogs/gogs:${{ env.IMAGE_TAG }} + exit-code: '1' + - name: Send email on failure + uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 + if: ${{ failure() }} + with: + smtp_username: ${{ secrets.SMTP_USERNAME }} + smtp_password: ${{ secrets.SMTP_PASSWORD }} + + # Updates to the following section needs to be synced to all release branches within their lifecycles. + buildx-next-release: + if: ${{ github.event_name == 'release' }} + runs-on: ubuntu-latest + permissions: + actions: write + contents: read + packages: write + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + with: + # Full history with tags is required so the next step can determine + # whether this release is the highest stable version across the repo. + fetch-depth: 0 + fetch-tags: true + - name: Compute image tags + run: | + IMAGE_TAG=$(echo $GITHUB_REF_NAME | cut -c 2-) + echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV + + TAGS="gogs/gogs:next-$IMAGE_TAG + ghcr.io/gogs/gogs:next-$IMAGE_TAG" + + # For stable releases (no prerelease suffix per semver), add the + # minor-version tag only if this release is the highest patch of that + # minor line, and add `next-latest` only if this release is the + # highest stable version across the repository. Back-patches on older + # lines must not clobber moving tags. + if [[ ! "$IMAGE_TAG" =~ - ]]; then + STABLE_TAGS=$(git tag --list 'v*' | sed 's/^v//' | grep -v -- '-' || true) + HIGHEST_STABLE=$(echo "$STABLE_TAGS" | sort -V | tail -n 1) + MINOR_TAG=$(echo "$IMAGE_TAG" | cut -d. -f1,2) + # `|| true` keeps the step running when `grep` finds no matches, + # since bash runs with `-e -o pipefail` in GitHub Actions. + HIGHEST_IN_MINOR=$(echo "$STABLE_TAGS" | { grep "^${MINOR_TAG}\." || true; } | sort -V | tail -n 1) + + if [[ "$IMAGE_TAG" == "$HIGHEST_IN_MINOR" ]]; then + TAGS="$TAGS + gogs/gogs:next-$MINOR_TAG + ghcr.io/gogs/gogs:next-$MINOR_TAG" + fi + if [[ "$IMAGE_TAG" == "$HIGHEST_STABLE" ]]; then + TAGS="$TAGS + gogs/gogs:next-latest + ghcr.io/gogs/gogs:next-latest" + fi + fi + + echo "TAGS<> $GITHUB_ENV + echo "$TAGS" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + - name: Set up QEMU + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 + with: + platforms: linux/amd64,linux/arm64,linux/arm/v7 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + - name: Inspect builder + run: | + echo "Name: ${{ steps.buildx.outputs.name }}" + echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" + echo "Status: ${{ steps.buildx.outputs.status }}" + echo "Flags: ${{ steps.buildx.outputs.flags }}" + echo "Platforms: ${{ steps.buildx.outputs.platforms }}" + - name: Login to Docker Hub + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GitHub Container registry + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push next-gen images + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + context: . + file: Dockerfile.next + platforms: linux/amd64,linux/arm64,linux/arm/v7 + push: true + tags: ${{ env.TAGS }} + - name: Scan for container vulnerabilities + uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # 0.35.0 + with: + image-ref: gogs/gogs:next-${{ env.IMAGE_TAG }} + exit-code: '1' + - name: Send email on failure + uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 + if: ${{ failure() }} + with: + smtp_username: ${{ secrets.SMTP_USERNAME }} + smtp_password: ${{ secrets.SMTP_PASSWORD }} + + digitalocean-gc: + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository == 'gogs/gogs' }} + needs: buildx-next + permissions: + contents: read + uses: ./.github/workflows/digitalocean_gc.yml + secrets: inherit + + digitalocean-gc-pull-request: + if: ${{ github.event_name == 'pull_request' && github.repository == 'gogs/gogs' }} + needs: buildx-next-pull-request + permissions: + contents: read + uses: ./.github/workflows/digitalocean_gc.yml + secrets: inherit diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 00000000000..46b6ba22f4f --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,172 @@ +name: Go +on: + push: + branches: + - main + - 'release/**' + paths: + - '**.go' + - 'go.mod' + - '.golangci.yml' + - '.github/workflows/go.yml' + pull_request: + paths: + - '**.go' + - 'go.mod' + - '.golangci.yml' + - '.github/workflows/go.yml' +env: + GOPROXY: "https://proxy.golang.org" + +permissions: + contents: read + +jobs: + lint: + permissions: + contents: read # for actions/checkout to fetch code + pull-requests: read # for golangci/golangci-lint-action to fetch pull requests + name: Lint + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Install Go + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version: 1.26.x + - name: Check Go module tidiness and generated files + shell: bash + run: | + go mod tidy + go generate ./... + STATUS=$(git status --porcelain) + if [ ! -z "$STATUS" ]; then + echo "Unstaged files:" + echo $STATUS + echo "Run 'go mod tidy' or 'go generate ./...' and commit them" + exit 1 + fi + - name: Run golangci-lint + uses: golangci/golangci-lint-action@9fae48acfc02a90574d7c304a1758ef9895495fa # v7.0.1 + with: + version: latest + args: --timeout=30m + + test: + name: Test + strategy: + matrix: + go-version: [ 1.26.x ] + platform: [ ubuntu-latest, macos-latest ] + runs-on: ${{ matrix.platform }} + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Install Go + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version: ${{ matrix.go-version }} + - name: Run tests with coverage + run: | + go test -shuffle=on -v -race -coverprofile=coverage -covermode=atomic -json ./... > test-report.json + go install github.com/mfridman/tparse@latest + tparse -all -file=test-report.json + - name: Send email on failure + uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 + if: ${{ failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' }} + with: + smtp_username: ${{ secrets.SMTP_USERNAME }} + smtp_password: ${{ secrets.SMTP_PASSWORD }} + + # Running tests with race detection consumes too much memory on Windows, + # see https://github.com/golang/go/issues/46099 for details. + test-windows: + name: Test Windows + strategy: + matrix: + go-version: [ 1.26.x ] + platform: [ windows-latest ] + runs-on: ${{ matrix.platform }} + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Install Go + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version: ${{ matrix.go-version }} + - name: Run tests with coverage + run: go test -shuffle=on -v -coverprofile=coverage -covermode=atomic ./... + - name: Send email on failure + uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 + if: ${{ failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' }} + with: + smtp_username: ${{ secrets.SMTP_USERNAME }} + smtp_password: ${{ secrets.SMTP_PASSWORD }} + + postgres: + name: Postgres + strategy: + matrix: + go-version: [ 1.26.x ] + platform: [ ubuntu-latest ] + runs-on: ${{ matrix.platform }} + services: + postgres: + image: postgres:9.6 + env: + POSTGRES_PASSWORD: postgres + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Install Go + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version: ${{ matrix.go-version }} + - name: Run tests with coverage + run: | + go test -shuffle=on -v -race -coverprofile=coverage -covermode=atomic -json ./internal/database/... > test-report.json + go install github.com/mfridman/tparse@latest + tparse -all -file=test-report.json + env: + GOGS_DATABASE_TYPE: postgres + PGPORT: 5432 + PGHOST: localhost + PGUSER: postgres + PGPASSWORD: postgres + PGSSLMODE: disable + + mysql: + name: MySQL + strategy: + matrix: + go-version: [ 1.26.x ] + platform: [ ubuntu-22.04 ] # Use the lowest version possible for backwards compatibility + runs-on: ${{ matrix.platform }} + steps: + - name: Start MySQL server + run: sudo systemctl start mysql + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Install Go + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version: ${{ matrix.go-version }} + - name: Run tests with coverage + run: | + go test -shuffle=on -v -race -coverprofile=coverage -covermode=atomic -json ./internal/database/... > test-report.json + go install github.com/mfridman/tparse@latest + tparse -all -file=test-report.json + env: + GOGS_DATABASE_TYPE: mysql + MYSQL_USER: root + MYSQL_PASSWORD: root + MYSQL_HOST: localhost + MYSQL_PORT: 3306 diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml new file mode 100644 index 00000000000..431efde3da9 --- /dev/null +++ b/.github/workflows/lock.yml @@ -0,0 +1,25 @@ +name: 'Lock Threads' + +on: + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + +permissions: + issues: write + pull-requests: write + +concurrency: + group: lock + +jobs: + action: + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1 + with: + github-token: ${{ github.token }} + issue-inactive-days: '90' + issue-lock-reason: 'resolved' + pr-inactive-days: '365' + pr-lock-reason: 'resolved' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000000..edf577ee4d9 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,157 @@ +name: Release + +on: + release: + types: [published] + push: + branches: + - main + pull_request: + paths: + - '.github/workflows/release.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + GOPROXY: "https://proxy.golang.org" + +permissions: + contents: write + +jobs: + build: + name: Build ${{ matrix.goos }}/${{ matrix.goarch }}${{ matrix.suffix }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - {goos: linux, goarch: amd64} + - {goos: linux, goarch: arm64} + - {goos: linux, goarch: "386"} + - {goos: darwin, goarch: amd64} + - {goos: darwin, goarch: arm64} + - {goos: windows, goarch: amd64} + - {goos: windows, goarch: arm64} + - {goos: windows, goarch: "386"} + - {goos: windows, goarch: amd64, suffix: "_mws", tags: minwinsvc} + - {goos: windows, goarch: arm64, suffix: "_mws", tags: minwinsvc} + - {goos: windows, goarch: "386", suffix: "_mws", tags: minwinsvc} + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Set up Go + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version: 1.26.x + - name: Set up pnpm + uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8 + - name: Set up Node + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: 24 + cache: pnpm + - name: Build web assets + run: | + pnpm install --frozen-lockfile + pnpm --filter gogs-web run build + - name: Determine version + id: version + run: | + if [ "${{ github.event_name }}" = "release" ]; then + echo "version=${{ github.event.release.tag_name }}" | sed 's/version=v/version=/' >> "$GITHUB_OUTPUT" + echo "release_tag=${{ github.event.release.tag_name }}" >> "$GITHUB_OUTPUT" + elif [ "${{ github.event_name }}" = "push" ] && [ "${{ github.ref }}" = "refs/heads/main" ]; then + echo "version=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT" + echo "release_tag=latest-commit-build" >> "$GITHUB_OUTPUT" + else + echo "version=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT" + echo "release_tag=release-archive-testing" >> "$GITHUB_OUTPUT" + fi + - name: Build binary + env: + GOOS: ${{ matrix.goos }} + GOARCH: ${{ matrix.goarch }} + CGO_ENABLED: "0" + run: | + BINARY_NAME="gogs" + if [ "${{ matrix.goos }}" = "windows" ]; then + BINARY_NAME="gogs.exe" + fi + + TAGS="prod" + if [ -n "${{ matrix.tags }}" ]; then + TAGS="$TAGS ${{ matrix.tags }}" + fi + + go build -v \ + -ldflags " + -X \"gogs.io/gogs/internal/conf.BuildTime=$(date -u '+%Y-%m-%d %I:%M:%S %Z')\" + -X \"gogs.io/gogs/internal/conf.BuildCommit=$(git rev-parse HEAD)\" + " \ + -tags "$TAGS" \ + -trimpath -o "$BINARY_NAME" ./cmd/gogs + - name: Prepare archive contents + run: | + mkdir -p dist/gogs + BINARY_NAME="gogs" + if [ "${{ matrix.goos }}" = "windows" ]; then + BINARY_NAME="gogs.exe" + fi + cp "$BINARY_NAME" dist/gogs/ + cp LICENSE README.md dist/gogs/ + cp -r scripts dist/gogs/ + - name: Create archives + working-directory: dist + run: | + VERSION="${{ steps.version.outputs.version }}" + ARCHIVE_BASE="gogs_${VERSION}_${{ matrix.goos }}_${{ matrix.goarch }}${{ matrix.suffix }}" + + zip -r "${ARCHIVE_BASE}.zip" gogs + + if [ "${{ matrix.goos }}" = "linux" ]; then + tar -czvf "${ARCHIVE_BASE}.tar.gz" gogs + fi + - name: Upload to release + env: + GH_TOKEN: ${{ github.token }} + run: | + RELEASE_TAG="${{ steps.version.outputs.release_tag }}" + + if [ "${{ github.event_name }}" != "release" ]; then + git tag -f "$RELEASE_TAG" + git push origin "$RELEASE_TAG" --force || true + + RELEASE_TITLE="Release archive testing" + RELEASE_NOTES="Automated testing release for workflow development." + if [ "$RELEASE_TAG" = "latest-commit-build" ]; then + RELEASE_TITLE="Latest commit build" + RELEASE_NOTES="Automated build from the latest commit on main branch. This release is updated automatically with every push to main." + fi + + gh release view "$RELEASE_TAG" || gh release create "$RELEASE_TAG" --title "$RELEASE_TITLE" --notes "$RELEASE_NOTES" --prerelease + fi + + PATTERN="_${{ matrix.goos }}_${{ matrix.goarch }}${{ matrix.suffix }}\." + gh release view "$RELEASE_TAG" --json assets --jq ".assets[].name" | grep "$PATTERN" | while read -r asset; do + gh release delete-asset "$RELEASE_TAG" "$asset" --yes || true + done + + gh release upload "$RELEASE_TAG" dist/gogs_*.zip --clobber + if [ "${{ matrix.goos }}" = "linux" ]; then + gh release upload "$RELEASE_TAG" dist/gogs_*.tar.gz --clobber + fi + + notify-failure: + name: Notify on failure + runs-on: ubuntu-latest + needs: [build] + if: ${{ failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' }} + steps: + - name: Send email on failure + uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 + with: + smtp_username: ${{ secrets.SMTP_USERNAME }} + smtp_password: ${{ secrets.SMTP_PASSWORD }} diff --git a/.github/workflows/shell.yml b/.github/workflows/shell.yml new file mode 100644 index 00000000000..d7c0e0b4699 --- /dev/null +++ b/.github/workflows/shell.yml @@ -0,0 +1,17 @@ +name: Shell +on: + push: + branches: [ main ] + pull_request: + +permissions: + contents: read + +jobs: + shellcheck: + name: Shellcheck + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Run ShellCheck + uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # 2.0.0 diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml new file mode 100644 index 00000000000..76b3ddeb00d --- /dev/null +++ b/.github/workflows/web.yml @@ -0,0 +1,54 @@ +name: Web +on: + push: + branches: + - main + - 'release/**' + paths: + - 'web/**' + - 'pnpm-lock.yaml' + - 'pnpm-workspace.yaml' + - 'package.json' + - 'conf/locale/locale_*.ini' + - '.github/workflows/web.yml' + pull_request: + paths: + - 'web/**' + - 'pnpm-lock.yaml' + - 'pnpm-workspace.yaml' + - 'package.json' + - 'conf/locale/locale_*.ini' + - '.github/workflows/web.yml' + +permissions: + contents: read + +jobs: + web: + name: Lint and build + runs-on: ubuntu-latest + env: + MOON_COLOR: "true" + FORCE_COLOR: "1" + steps: + - name: Check out code + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + with: + fetch-depth: 0 + - name: Set up pnpm + uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8 + - name: Set up Node + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: 24 + cache: pnpm + - name: Set up moon + uses: moonrepo/setup-toolchain@261c62cb5b0f580c7be7c8cd0f023a2e96756095 # v0.6.4 + with: + auto-install: false + - name: Lint + run: moon run web:lint + - name: Build + run: moon run web:build + - name: Check for uncommitted changes + run: git diff --exit-code --stat diff --git a/.gitignore b/.gitignore index a13d3460ff1..9f09adfc14c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,19 @@ -.DS_Store -*.db -*.log +# Build artifacts and cache +.bin/ +dist/ +.moon/cache/ +node_modules/ +.agents/skills/ +.claude/skills + +# Runtime data log/ custom/ data/ -.vendor/ + +# Configuration and application files .idea/ -*.iml -public/img/avatar/ -*.exe -*.exe~ -/gogs -profile/ -*.pem -output* -gogs.sublime-project -gogs.sublime-workspace -/release -vendor +.envrc + +# System junk +.DS_Store diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000000..c426559c4df --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,42 @@ +version: "2" +linters: + enable: + - nakedret + - rowserrcheck + - unconvert + - unparam + settings: + govet: + disable: + # printf: non-constant format string in call to fmt.Errorf (govet) + # showing up since golangci-lint version 1.60.1 + - printf + staticcheck: + checks: + - all + - "-SA1019" # This project is under active refactoring and not all code is up to date. + - "-QF1001" # I'm a math noob + - "-ST1016" # Some legit code uses this pattern + nakedret: + max-func-lines: 0 # Disallow any unnamed return statement + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/.gopmfile b/.gopmfile deleted file mode 100644 index eb6a28a4f7d..00000000000 --- a/.gopmfile +++ /dev/null @@ -1,60 +0,0 @@ -[target] -path = github.com/gogits/gogs - -[deps] -github.com/bradfitz/gomemcache = commit:fb1f79c -github.com/urfave/cli = commit:1efa31f -github.com/go-macaron/binding = commit:9440f33 -github.com/go-macaron/cache = commit:5617353 -github.com/go-macaron/captcha = commit:8aa5919 -github.com/go-macaron/csrf = commit:6a9a7df -github.com/go-macaron/gzip = commit:cad1c65 -github.com/go-macaron/i18n = commit:ef57533 -github.com/go-macaron/inject = commit:c5ab7bf -github.com/go-macaron/session = commit:66031fc -github.com/go-macaron/toolbox = commit:82b5115 -github.com/go-sql-driver/mysql = commit:0b58b37 -github.com/go-xorm/builder = commit:cd42e83 -github.com/go-xorm/core = commit:2ec3936 -github.com/go-xorm/xorm = commit:311abf2 -github.com/gogits/chardet = commit:2404f77 -github.com/gogits/cron = commit:7f3990a -github.com/gogits/git-module = commit:5e0c133 -github.com/gogits/go-gogs-client = commit:c52f7ee -github.com/gogits/go-libravatar = commit:cd1abbd -github.com/issue9/identicon = commit:d36b545 -github.com/jaytaylor/html2text = commit:52d9b78 -github.com/kardianos/minwinsvc = commit:cad6b2b -github.com/klauspost/compress = commit:14eb9c4 -github.com/klauspost/cpuid = commit:09cded8 -github.com/klauspost/crc32 = commit:19b0b33 -github.com/lib/pq = commit:80f8150 -github.com/mattn/go-sqlite3 = commit:e118d44 -github.com/mcuadros/go-version = commit:d52711f -github.com/microcosm-cc/bluemonday = commit:9dc1992 -github.com/msteinert/pam = commit:02ccfbf -github.com/nfnt/resize = commit:891127d -github.com/russross/blackfriday = commit:93622da -github.com/satori/go.uuid = commit:0aa62d5 -github.com/sergi/go-diff = commit:ec7fdbb -github.com/shurcooL/sanitized_anchor_name = commit:10ef21a -github.com/Unknwon/cae = commit:7f5e046 -github.com/Unknwon/com = commit:28b053d -github.com/Unknwon/i18n = commit:39d6f27 -github.com/Unknwon/paginater = commit:7748a72 -golang.org/x/crypto = commit:bc89c49 -golang.org/x/net = commit:57bfaa8 -golang.org/x/sys = commit:a646d33 -golang.org/x/text = commit:2910a50 -gopkg.in/alexcesaro/quotedprintable.v3 = commit:2caba25 -gopkg.in/asn1-ber.v1 = commit:4e86f43 -gopkg.in/bufio.v1 = commit:567b2bf -gopkg.in/editorconfig/editorconfig-core-go.v1 = commit:a872f05 -gopkg.in/gomail.v2 = commit:81ebce5 -gopkg.in/ini.v1 = commit:cf53f92 -gopkg.in/ldap.v2 = commit:d0a5ced -gopkg.in/macaron.v1 = commit:826ddf1 -gopkg.in/redis.v2 = commit:e617904 - -[res] -include = public|scripts|templates diff --git a/.mailmap b/.mailmap index 88ff1591a4a..968e4a73648 100644 --- a/.mailmap +++ b/.mailmap @@ -1,2 +1,4 @@ -Unknwon -Unknwon 无闻 +Joe Chen Unknwon +Joe Chen 无闻 +Joe Chen ᴜɴᴋɴᴡᴏɴ +Joe Chen ᴜɴᴋɴᴡᴏɴ diff --git a/.moon/tasks.yml b/.moon/tasks.yml new file mode 100644 index 00000000000..01c1edaffd2 --- /dev/null +++ b/.moon/tasks.yml @@ -0,0 +1,4 @@ +$schema: "https://moonrepo.dev/schemas/tasks.json" + +taskOptions: + outputStyle: "stream" diff --git a/.moon/workspace.yml b/.moon/workspace.yml new file mode 100644 index 00000000000..01c79131eb9 --- /dev/null +++ b/.moon/workspace.yml @@ -0,0 +1,9 @@ +$schema: "https://moonrepo.dev/schemas/workspace.json" + +projects: + gogs: "." + web: "web" + +vcs: + client: "git" + defaultBranch: "main" diff --git a/.pkgr.yml b/.pkgr.yml deleted file mode 100644 index 9fa60ccbac2..00000000000 --- a/.pkgr.yml +++ /dev/null @@ -1,27 +0,0 @@ -targets: - debian-7: &debian - build_dependencies: - - libpam0g-dev - dependencies: - - libpam0g - - git - debian-8: - <<: *debian - ubuntu-14.04: - <<: *debian - ubuntu-12.04: - <<: *debian - centos-6: &el - build_dependencies: - - pam-devel - dependencies: - - pam - - git - centos-7: - <<: *el -before: - - mv packager/Procfile . - - mv packager/.godir . -after: - - mv bin/main gogs -after_install: ./packager/hooks/postinst diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6eba760d65a..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: go - -go: - - 1.5 - - 1.6 - - 1.7 - -before_install: - - sudo apt-get update -qq - - sudo apt-get install -y libpam-dev - - go get github.com/msteinert/pam - -install: - - go get -t -v ./... - -script: - - go build -v -tags "pam" - - go test -v -cover -race ./... - -notifications: - email: - - u@gogs.io - slack: gophercn:o5pSanyTeNhnfYc3QnG0X7Wx - webhooks: - urls: - - https://webhooks.gitter.im/e/b590f8e03882f7aedc3e - on_success: change - on_failure: always - on_start: never diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000000..a3b1592ed10 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,46 @@ +## Core principles + +- Stop telling me "You're right", it just shows how incompetent you are. Do it right on your first try, fact-check and review after changes. If you are not sure, ask for help. +- When you see changes made outside your knowledge, use the current version as your new starting point. Do not blindly overwrite those changes or you suck. Even if you have to update the code, always respect the pattern in the surrounding context! + +## Style and mechanics + +This applies to all texts, including but not limited to UI, documentation, code comments. + +- Use sentence case. Preserve original casing for brand names. +- End with a period for a full sentence. +- Never use em dashes (`—`) or en dashes (`–`) in prose. Rewrite the sentence with a comma, period, colon, or parentheses instead. Exception: em/en dashes are allowed as visual separators in UI design (e.g., between a title and description, in a terminal prompt label) where they function as a graphic element rather than punctuation. +- Do not overuse semicolons. Two short sentences are almost always clearer than one sentence joined by a semicolon. Reserve the semicolon for the rare case where the two clauses are so tightly coupled that splitting them loses meaning, never as a default em-dash replacement or a way to chain related thoughts. +- Do not add comments that repeat what the code is doing, always prefer more descriptive names. Do add comments for intentions that aren't obvious via reading the code alone. This rule takes precedence over matching existing patterns. + +## Coding guidelines + +- Use `github.com/cockroachdb/errors` for error handling. +- Use `github.com/stretchr/testify` for assertions in tests. Be mindful about the choice of `require` and `assert`, the former should be used when the test cannot proceed meaningfully after a failed assertion. + +## Localization + +- Only edit `conf/locale/locale_en-US.ini`. The other `locale_*.ini` files are community-maintained translations. Do not add, remove, or rewrite keys in them, even when removing keys that are dead on the Go/template side. + +## UI guidelines + +- Design mobile-friendly. Every UI must look and work well on narrow viewports before adding desktop refinements via responsive breakpoints. Test at ~375px width before considering a UI done. +- Meet WCAG 2.2 AA at minimum. Specifically: every interactive control has a discernible accessible name (visible label or `aria-label`); color is never the sole carrier of information (pair with text, icon, or shape); text and meaningful icons meet 4.5:1 contrast against their background (3:1 for large text and UI components); focus is always visible and never trapped; touch targets are at least 24×24 CSS px (40×40 preferred). When unsure, lean toward more contrast, larger targets, and explicit labels. +- For work under `web/`, follow the patterns in [`web/DESIGN.md`](web/DESIGN.md) (typography, color hierarchy, surface chrome, file naming, accessibility specifics). Update that doc when a pattern is used in two places. +- When a page needs server data to render, fetch it in the TanStack Router route's `loader` so the page only mounts after the response arrives. Do not fire that fetch from a `useEffect` inside the page component, which causes a flash of empty UI before the data lands. + +## Build instructions + +- Prefer `moon run :` over vanilla `go` or `pnpm` commands when available (e.g. `moon run gogs:build`, `moon run web:dev`). Pass `--force` to bypass cache when necessary. +- Run `moon run gogs:lint` after every time you finish changing Go code, and `moon run web:lint` after changing frontend code; fix all linter errors. + +## Tool-use guidance + +- Use `gh` CLI to access information on github.com that is not publicly available. + +## Source code control + +- When pushing changes to a pull request from a fork, use SSH address and do not add remote. +- Never commit on the `main` branch directly unless being explicitly asked to do so. A single ask only grants a single commit action on the `main` branch. +- Never amend commits unless being explicitly asked to do so. +- When creating a git worktree, the worktree directory name must match its branch name. Do not use random or generated suffixes. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000000..93619099697 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,332 @@ +# Changelog + +All notable changes to Gogs are documented in this file. + +## 0.15.0+dev (`main`) + +### Changed + +- Docker builds from `main` are now published only as `gogs/gogs:edge`, using the next-generation `Dockerfile.next`. The legacy `Dockerfile` no longer produces `main` builds. The `gogs/gogs:latest` and `gogs/gogs:next-latest` tags now always point to the highest published stable release, never to a back-patch on an older line. [#8278](https://github.com/gogs/gogs/pull/8278) + +### Fixed + +- _Security:_ Denial of service in repository and wiki file listing pages via crafted file names. [#8116](https://github.com/gogs/gogs/pull/8116) - [GHSA-3qq3-668m-v9mj](https://github.com/gogs/gogs/security/advisories/GHSA-3qq3-668m-v9mj) +- _Security:_ Reverse proxy authentication header was honored from any remote address, allowing user impersonation when Gogs was reachable directly. The header is now only trusted from addresses listed in `[auth] TRUSTED_PROXY_IPS`. [#8264](https://github.com/gogs/gogs/pull/8264) - [GHSA-w6j9-vw59-27wv](https://github.com/gogs/gogs/security/advisories/GHSA-w6j9-vw59-27wv) +- _Security:_ Server-side request forgery in webhook deliveries via HTTP redirects to local network addresses. [#8263](https://github.com/gogs/gogs/pull/8263) - [GHSA-c4v7-xg93-qf8g](https://github.com/gogs/gogs/security/advisories/GHSA-c4v7-xg93-qf8g) +- _Security:_ The "remember me" auto-login cookie was derived from database columns, so an attacker with a database dump could forge a valid cookie for any user. The auto-login cookie path has been removed entirely. Persistence is now provided by the server-issued session cookie. [#8289](https://github.com/gogs/gogs/pull/8289) - [GHSA-4pph-25p3-pw73](https://github.com/gogs/gogs/security/advisories/GHSA-4pph-25p3-pw73) + +### Removed + +- The `gogs cert` subcommand. [#8153](https://github.com/gogs/gogs/pull/8153) +- The `[email] DISABLE_HELO` configuration option. HELO/EHLO is now always sent during SMTP handshake. [#8164](https://github.com/gogs/gogs/pull/8164) +- Support for MSSQL as the database backend. Stay on 0.14 for continued usage. [#8173](https://github.com/gogs/gogs/pull/8173) +- Support for `memcache` as the cache adapter. Stay on 0.14 for continued usage. [#8270](https://github.com/gogs/gogs/pull/8270) +- The `/debug`, `/debug/pprof/*`, `/debug/profile/*`, and `/urlmap.json` endpoints. [#8271](https://github.com/gogs/gogs/pull/8271) + +## 0.14.2 + +### Fixed + +- _Security:_ Cross-repository LFS object overwrite via missing content hash verification. [#8166](https://github.com/gogs/gogs/pull/8166) - [GHSA-gmf8-978x-2fg2](https://github.com/gogs/gogs/security/advisories/GHSA-gmf8-978x-2fg2) +- _Security:_ Stored XSS via data URI in issue comments. [#8174](https://github.com/gogs/gogs/pull/8174) - [GHSA-xrcr-gmf5-2r8j](https://github.com/gogs/gogs/security/advisories/GHSA-xrcr-gmf5-2r8j) +- _Security:_ Release tag option injection in release deletion. [#8175](https://github.com/gogs/gogs/pull/8175) - [GHSA-v9vm-r24h-6rqm](https://github.com/gogs/gogs/security/advisories/GHSA-v9vm-r24h-6rqm) +- _Security:_ Stored XSS in branch and wiki views through author and committer names. [#8176](https://github.com/gogs/gogs/pull/8176) - [GHSA-vgvf-m4fw-938j](https://github.com/gogs/gogs/security/advisories/GHSA-vgvf-m4fw-938j) +- _Security:_ DOM-based XSS via issue meta selection on the issue page. [#8178](https://github.com/gogs/gogs/pull/8178) - [GHSA-vgjm-2cpf-4g7c](https://github.com/gogs/gogs/security/advisories/GHSA-vgjm-2cpf-4g7c) +- Unable to update files via web editor and API. [#8184](https://github.com/gogs/gogs/pull/8184) + +### Removed + +- Support for passing API access tokens via URL query parameters (`token`, `access_token`). Use the `Authorization` header instead. [#8177](https://github.com/gogs/gogs/pull/8177) - [GHSA-x9p5-w45c-7ffc](https://github.com/gogs/gogs/security/advisories/GHSA-x9p5-w45c-7ffc) + +## 0.14.1 + +### Added + +- Support comparing tags in addition to branches. [#6141](https://github.com/gogs/gogs/issues/6141) +- Show file name in browser tab title when viewing files. [#5896](https://github.com/gogs/gogs/pull/5896) +- Support using TLS for Redis session provider using `[session] PROVIDER_CONFIG = ...,tls=true`. [#7860](https://github.com/gogs/gogs/pull/7860) +- Support expanading values in `app.ini` from environment variables, e.g. `[database] PASSWORD = ${DATABASE_PASSWORD}`. [#8057](https://github.com/gogs/gogs/pull/8057) +- Support custom logout URL that users get redirected to after sign out using `[auth] CUSTOM_LOGOUT_URL`. [#8089](https://github.com/gogs/gogs/pull/8089) +- Start publishing next-generation, security-focused Docker image via `gogs/gogs:next-latest`, which will become the default image distribution (`gogs/gogs:latest`) starting 0.16.0. While not all container options support have been added in the next-generation image, the use of current legacy Docker image is deprecated, it will be published as `gogs/gogs:legacy-latest` starting 0.16.0, and be completely removed no earlier than 0.17.0. [#8061](https://github.com/gogs/gogs/pull/8061) + +### Changed + +- The required Go version to compile source code changed to 1.25. +- The build tag `cert` has been removed, and the `gogs cert` subcommand is now always available. [#7883](https://github.com/gogs/gogs/pull/7883) +- Switched to pure-Go SQLite driver, CGO is no longer required to compile Gogs. [#7882](https://github.com/gogs/gogs/issues/7882) +- Updated Mermaid JS to 11.9.0. [#8009](https://github.com/gogs/gogs/pull/8009) +- Halt the repository creation and leave the directory untouched if the repository root already exists. [#8091](https://github.com/gogs/gogs/pull/8091) + +### Fixed + +- _Security:_ Unauthenticated file upload. [#8128](https://github.com/gogs/gogs/pull/8128) - [GHSA-fc3h-92p8-h36f](https://github.com/gogs/gogs/security/advisories/GHSA-fc3h-92p8-h36f) +- _Security:_ Protected branch bypass in web UI. [#8124](https://github.com/gogs/gogs/pull/8124) - [GHSA-2c6v-8r3v-gh6p](https://github.com/gogs/gogs/security/advisories/GHSA-2c6v-8r3v-gh6p) +- _Security:_ Authorization bypass allows cross-repository label modification. [#8123](https://github.com/gogs/gogs/pull/8123) - [GHSA-cv22-72px-f4gh](https://github.com/gogs/gogs/security/advisories/GHSA-cv22-72px-f4gh) +- _Security:_ Cross-repository comment deletion. [#8119](https://github.com/gogs/gogs/pull/8119) - [GHSA-jj5m-h57j-5gv7](https://github.com/gogs/gogs/security/advisories/GHSA-jj5m-h57j-5gv7) +- 500 error on repository watchers and stargazers pages when using MSSQL. [#5482](https://github.com/gogs/gogs/issues/5482) +- Submodules using `ssh://` protocol and a port number are not rendered correctly. [#4941](https://github.com/gogs/gogs/issues/4941) +- Missing link to user profile on the first commit in commits history page. [#7404](https://github.com/gogs/gogs/issues/7404) +- Unable to delete or display files with special characters in their names. [#7596](https://github.com/gogs/gogs/issues/7596) +- Docker healthcheck fails when `HTTP_PROXY` or `HTTPS_PROXY` environment variables are set. [#7529](https://github.com/gogs/gogs/issues/7529) + +## 0.13.4 + +### Fixed + +- _Security:_ DoS in repository mirror sync. [#8065](https://github.com/gogs/gogs/pull/8065) - [GHSA-cr88-6mqm-4g57](https://github.com/gogs/gogs/security/advisories/GHSA-cr88-6mqm-4g57) +- _Security:_ RCE in repository put contents API. [#8082](https://github.com/gogs/gogs/pull/8082) - [GHSA-gg64-xxr9-qhjp](https://github.com/gogs/gogs/security/advisories/GHSA-gg64-xxr9-qhjp) +- _Security:_ Arbitrary file deletion via path traversal in wiki page update. [#8099](https://github.com/gogs/gogs/pull/8099) - [GHSA-jp7c-wj6q-3qf2](https://github.com/gogs/gogs/security/advisories/GHSA-jp7c-wj6q-3qf2) +- _Security:_ 2FA bypass via recovery code. [#8100](https://github.com/gogs/gogs/pull/8100) - [GHSA-p6x6-9mx6-26wj](https://github.com/gogs/gogs/security/advisories/GHSA-p6x6-9mx6-26wj) +- _Security:_ Authorization bypass in repository deletion API. [#8101](https://github.com/gogs/gogs/pull/8101) - [GHSA-rjv5-9px2-fqw6](https://github.com/gogs/gogs/security/advisories/GHSA-rjv5-9px2-fqw6) +- _Security:_ Update repository content via API with read-only permission. [#8102](https://github.com/gogs/gogs/pull/8102) - [GHSA-5qhx-gwfj-6jqr](https://github.com/gogs/gogs/security/advisories/GHSA-5qhx-gwfj-6jqr) +- _Security:_ Arbitrary file read/write via path traversal in Git hook editing. [#8103](https://github.com/gogs/gogs/pull/8103) - [GHSA-mrph-w4hh-gx3g](https://github.com/gogs/gogs/security/advisories/GHSA-mrph-w4hh-gx3g) +- _Security:_ Stored XSS via Mermaid diagrams. [`2c88cd4`](https://github.com/gogs/gogs/commit/2c88cd4d9fdc346d8e06d82f5368d657c10e79c2) - [GHSA-26gq-grmh-6xm6](https://github.com/gogs/gogs/security/advisories/GHSA-26gq-grmh-6xm6) +- Route `GET /api/v1/user/repos` responses 500 when accessible repositories contain forks. [#8069](https://github.com/gogs/gogs/pull/8069) +- Newer Git versions that uses default branch `main` cause wiki initialization to fail. [#8094](https://github.com/gogs/gogs/pull/8094) + +## 0.13.3 + +### Fixed + +- _Security:_ Stored XSS in PDF renderer. [GHSA-xh32-cx6c-cp4v](https://github.com/gogs/gogs/security/advisories/GHSA-xh32-cx6c-cp4v) +- _Security:_ Path Traversal in file editing UI. [GHSA-wj44-9vcg-wjq7](https://github.com/gogs/gogs/security/advisories/GHSA-wj44-9vcg-wjq7) +- Randomly timeout on repository file uploads. [#7890](https://github.com/gogs/gogs/pull/7890) +- Unable to override email templates in custom directory. [#7905](https://github.com/gogs/gogs/pull/7905) + +## 0.13.2 + +### Fixed + +- _Security:_ Path Traversal in file editing UI. [GHSA-r7j8-5h9c-f6fx](https://github.com/gogs/gogs/security/advisories/GHSA-r7j8-5h9c-f6fx) +- _Security:_ Path Traversal in file update API. [GHSA-qf5v-rp47-55gg](https://github.com/gogs/gogs/security/advisories/GHSA-qf5v-rp47-55gg) +- _Security:_ Argument Injection in the built-in SSH server. [GHSA-vm62-9jw3-c8w3](https://github.com/gogs/gogs/security/advisories/GHSA-vm62-9jw3-c8w3) +- _Security:_ Deletion of internal files. [GHSA-ccqv-43vm-4f3w](https://github.com/gogs/gogs/security/advisories/GHSA-ccqv-43vm-4f3w) +- _Security:_ Argument Injection during changes preview. [GHSA-9pp6-wq8c-3w2c](https://github.com/gogs/gogs/security/advisories/GHSA-9pp6-wq8c-3w2c) +- _Security:_ Argument Injection when tagging new releases. [GHSA-m27m-h5gj-wwmg](https://github.com/gogs/gogs/security/advisories/GHSA-m27m-h5gj-wwmg) +- Use the non-deprecated section name `[email]` during installation for email settings. [#7704](https://github.com/gogs/gogs/pull/7704) +- Use the non-deprecated section name `[email] PASSWORD` during installation for email password. [#7807](https://github.com/gogs/gogs/pull/7807) +- Make purple template label color to actually use the hexcode of purple. [#7722](https://github.com/gogs/gogs/pull/7722) + +## 0.13.0 + +### Added + +- Support using personal access token in the password field. [#3866](https://github.com/gogs/gogs/issues/3866) +- An unlisted option is added when create or migrate a repository. Unlisted repositories are public but not being listed for users without direct access in the UI. [#5733](https://github.com/gogs/gogs/issues/5733) +- New API endpoint `PUT /repos/:owner/:repo/contents/:path` for creating and update repository contents. [#5967](https://github.com/gogs/gogs/issues/5967) +- New configuration option `[git.timeout] DIFF` for customizing operation timeout of `git diff`. [#6315](https://github.com/gogs/gogs/issues/6315) +- New configuration option `[server] SSH_SERVER_MACS` for setting list of accepted MACs for connections to builtin SSH server. [#6434](https://github.com/gogs/gogs/issues/6434) +- New configuration option `[repository] DEFAULT_BRANCH` for setting default branch name for new repositories. [#7291](https://github.com/gogs/gogs/issues/7291) +- New configuration option `[server] SSH_SERVER_ALGORITHMS` for specifying the list of accepted key exchange algorithms for connections to builtin SSH server. [#7345](https://github.com/gogs/gogs/pull/7345) +- Support specifying custom schema for PostgreSQL. [#6695](https://github.com/gogs/gogs/pull/6695) +- Support rendering Mermaid diagrams in Markdown. [#6776](https://github.com/gogs/gogs/pull/6776) +- Docker: Allow passing extra arguments to the `backup` command. [#7060](https://github.com/gogs/gogs/pull/7060) +- New languages support: Mongolian, Romanian. [#6510](https://github.com/gogs/gogs/pull/6510) [#7082](https://github.com/gogs/gogs/pull/7082) + +### Changed + +- The default branch has been changed to `main`. [#6285](https://github.com/gogs/gogs/pull/6285) +- MSSQL as database backend is deprecated, installation page no longer shows it as an option. Existing installations and manually craft configuration file continue to work. [#6295](https://github.com/gogs/gogs/pull/6295) +- Use [Task](https://github.com/go-task/task) as the build tool. [#6297](https://github.com/gogs/gogs/pull/6297) +- The required Go version to compile source code changed to 1.18. +- Access tokens are now stored using their SHA256 hashes instead of raw values. [#7008](https://github.com/gogs/gogs/pull/7008) + +### Fixed + +- Unable to use LDAP authentication on ARM machines. [#6761](https://github.com/gogs/gogs/issues/6761) +- Unable to choose "Lookup Avatar by mail" in user settings without deleting custom avatar. [#7267](https://github.com/gogs/gogs/pull/7267) +- Mistakenly include the "data" directory under the custom directory in the Docker setup. [#7343](https://github.com/gogs/gogs/pull/7343) +- Unable to start after data recovery with an outdated migration version. [#7125](https://github.com/gogs/gogs/issues/7125) + +### Removed + +- ⚠️ Migrations before 0.12 are removed, installations not on 0.12 should upgrade to it to run the migrations and then upgrade to 0.13. +- Configuration section `[mailer]` is no longer used, please use `[email]`. +- Configuration section `[service]` is no longer used, please use `[auth]`. +- Configuration option `APP_NAME` is no longer used, please use `BRAND_NAME`. +- Configuration option `[security] REVERSE_PROXY_AUTHENTICATION_USER` is no longer used, please use `[auth] REVERSE_PROXY_AUTHENTICATION_HEADER`. +- Configuration option `[auth] ACTIVE_CODE_LIVE_MINUTES` is no longer used, please use `[auth] ACTIVATE_CODE_LIVES`. +- Configuration option `[auth] RESET_PASSWD_CODE_LIVE_MINUTES` is no longer used, please use `[auth] RESET_PASSWORD_CODE_LIVES`. +- Configuration option `[auth] ENABLE_CAPTCHA` is no longer used, please use `[auth] ENABLE_REGISTRATION_CAPTCHA`. +- Configuration option `[auth] ENABLE_NOTIFY_MAIL` is no longer used, please use `[user] ENABLE_EMAIL_NOTIFICATION`. +- Configuration option `[auth] REGISTER_EMAIL_CONFIRM` is no longer used, please use `[auth] REQUIRE_EMAIL_CONFIRMATION`. +- Configuration option `[session] GC_INTERVAL_TIME` is no longer used, please use `[session] GC_INTERVAL`. +- Configuration option `[session] SESSION_LIFE_TIME` is no longer used, please use `[session] MAX_LIFE_TIME`. +- Configuration option `[server] ROOT_URL` is no longer used, please use `[server] EXTERNAL_URL`. +- Configuration option `[server] LANDING_PAGE` is no longer used, please use `[server] LANDING_URL`. +- Configuration option `[database] DB_TYPE` is no longer used, please use `[database] TYPE`. +- Configuration option `[database] PASSWD` is no longer used, please use `[database] PASSWORD`. +- Remove option to use Makefile as the build tool. [#6980](https://github.com/gogs/gogs/pull/6980) + +## 0.12.11 + +### Fixed + +- _Security:_ Stored XSS for issue assignees. [#7145](https://github.com/gogs/gogs/issues/7145) +- _Security:_ OS Command Injection in repo editor on case-insensitive file systems. [#7030](https://github.com/gogs/gogs/issues/7030) +- Unable to render repository pages with implicit submodules (e.g. `get submodule "REDACTED": revision does not exist`). [#6436](https://github.com/gogs/gogs/issues/6436) + +## 0.12.10 + +### Changed + +- Support using `[security] LOCAL_NETWORK_ALLOWLIST = *` to allow all hostnames. [#7111](https://github.com/gogs/gogs/pull/7111) + +### Fixed + +- Unable to send webhooks to local network addresses after configured `[security] LOCAL_NETWORK_ALLOWLIST`. [#7074](https://github.com/gogs/gogs/issues/7074) + +## 0.12.9 + +### Fixed + +- _Security:_ OS Command Injection in file editor. [#7000](https://github.com/gogs/gogs/issues/7000) +- _Security:_ Sanitize `DisplayName` in repository issue list. [#7009](https://github.com/gogs/gogs/pull/7009) +- _Security:_ Path Traversal in file editor on Windows. [#7001](https://github.com/gogs/gogs/issues/7001) +- _Security:_ Path Traversal in Git HTTP endpoints. [#7002](https://github.com/gogs/gogs/issues/7002) +- Unable to init repository during creation on Windows. [#6967](https://github.com/gogs/gogs/issues/6967) +- Mysterious panic on `Value not found for type *repo.HTTPContext`. [#6963](https://github.com/gogs/gogs/issues/6963) + +## 0.12.8 + +### Changed + +- All users (including admins) need to use the configuration option `[security] LOCAL_NETWORK_ALLOWLIST` to allow repository migration and webhooks to be able to access local network addresses, which is a comma separated list of hostnames. [#6988](https://github.com/gogs/gogs/pull/6988) + +### Fixed + +- _Security:_ SSRF in webhook. [#6901](https://github.com/gogs/gogs/issues/6901) +- _Security:_ XSS in cookies. [#6953](https://github.com/gogs/gogs/issues/6953) +- _Security:_ OS Command Injection in file uploading. [#6968](https://github.com/gogs/gogs/issues/6968) +- _Security:_ Remote Command Execution in file editing. [#6555](https://github.com/gogs/gogs/issues/6555) + +## 0.12.7 + +### Fixed + +- _Security:_ Stored XSS in issues. [#6919](https://github.com/gogs/gogs/issues/6919) +- Invalid character in `Access-Control-Allow-Credentials` response header. [#4983](https://github.com/gogs/gogs/issues/4983) +- Mysterious `ssh: overflow reading version string` errors from builtin SSH server. [#6882](https://github.com/gogs/gogs/issues/6882) + +## 0.12.6 + +### Fixed + +- _Security:_ Remote command execution in file uploading. [#6833](https://github.com/gogs/gogs/issues/6833) +- _Regression:_ Unable to migrate repository from other local Git hosting. Added a new configuration option `[security] LOCAL_NETWORK_ALLOWLIST`, which is a comma separated list of hostnames that are explicitly allowed to be accessed within the local network. [#6841](https://github.com/gogs/gogs/issues/6841) +- Slow start of Docker containers using NAS devices. [#6554](https://github.com/gogs/gogs/issues/6554) + +## 0.12.5 + +### Fixed + +- _Security:_ Potential SSRF in repository migration. [#6754](https://github.com/gogs/gogs/issues/6754) +- _Security:_ Improper PAM authorization handling. [#6810](https://github.com/gogs/gogs/issues/6810) + +## 0.12.4 + +### Fixed + +- _Security:_ Potential SSRF attack by CRLF injection via repository migration. [#6413](https://github.com/gogs/gogs/issues/6413) +- _Regression:_ Fixed smart links for issues stops rendering. [#6506](https://github.com/gogs/gogs/issues/6506) +- Added `X-Frame-Options` header to prevent Clickjacking. [#6409](https://github.com/gogs/gogs/issues/6409) + +## 0.12.3 + +### Fixed + +- _Regression:_ When running Gogs on Windows, push commits no longer fail on a daily basis with the error "pre-receive hook declined". [#6316](https://github.com/gogs/gogs/issues/6316) +- Auto-linked commit SHAs now have correct links. [#6300](https://github.com/gogs/gogs/issues/6300) +- Git LFS client (with version >= 2.5.0) wasn't able to upload files with known format (e.g. PNG, JPEG), and the server is expecting the HTTP Header `Content-Type` to be `application/octet-stream`. The server now tells the LFS client to always use `Content-Type: application/octet-stream` when upload files. + +## 0.12.2 + +### Fixed + +- _Regression:_ Pages are correctly rendered when requesting `?go-get=1` for subdirectories. [#6314](https://github.com/gogs/gogs/issues/6314) +- _Regression:_ Submodule with a relative path is linked correctly. [#6319](https://github.com/gogs/gogs/issues/6319) +- Backup can be processed when `--target` is specified on Windows. [#6339](https://github.com/gogs/gogs/issues/6339) +- Commit message contains keywords look like an issue reference no longer fails the push entirely. [#6289](https://github.com/gogs/gogs/issues/6289) + +## 0.12.1 + +### Fixed + +- The `updated_at` field is now correctly updated when updates an issue. [#6209](https://github.com/gogs/gogs/issues/6209) +- Fixed a regression which created `login_source.cfg` column to have `VARCHAR(255)` instead of `TEXT` in MySQL. [#6280](https://github.com/gogs/gogs/issues/6280) + +## 0.12.0 + +### Added + +- Support for Git LFS, you can read documentation for both [user](https://github.com/gogs/gogs/blob/main/docs/user/lfs.md) and [admin](https://github.com/gogs/gogs/blob/main/docs/admin/lfs.md). [#1322](https://github.com/gogs/gogs/issues/1322) +- Allow admin to remove observers from the repository. [#5803](https://github.com/gogs/gogs/pull/5803) +- Use `Last-Modified` HTTP header for raw files. [#5811](https://github.com/gogs/gogs/issues/5811) +- Support syntax highlighting for SAS code files (i.e. `.r`, `.sas`, `.tex`, `.yaml`). [#5856](https://github.com/gogs/gogs/pull/5856) +- Able to fill in pull request title with a template. [#5901](https://github.com/gogs/gogs/pull/5901) +- Able to override static files under `public/` directory, please refer to [documentation](https://gogs.io/docs/features/custom_template) for usage. [#5920](https://github.com/gogs/gogs/pull/5920) +- New API endpoint `GET /admin/teams/:teamid/members` to list members of a team. [#5877](https://github.com/gogs/gogs/issues/5877) +- Support backup with retention policy for Docker deployments. [#6140](https://github.com/gogs/gogs/pull/6140) + +### Changed + +- The organization profile page has changed to display at most 12 members. [#5506](https://github.com/gogs/gogs/issues/5506) +- The required Go version to compile source code changed to 1.14. +- All assets are now embedded into binary and served from memory by default. Set `[server] LOAD_ASSETS_FROM_DISK = true` to load them from disk. [#5920](https://github.com/gogs/gogs/pull/5920) +- Application and Go versions are removed from page footer and only show in the admin dashboard. +- Build tag for running as Windows Service has been changed from `miniwinsvc` to `minwinsvc`. +- Configuration option `APP_NAME` is deprecated and will end support in 0.13.0, please start using `BRAND_NAME`. +- Configuration option `[server] ROOT_URL` is deprecated and will end support in 0.13.0, please start using `[server] EXTERNAL_URL`. +- Configuration option `[server] LANDING_PAGE` is deprecated and will end support in 0.13.0, please start using `[server] LANDING_URL`. +- Configuration option `[database] DB_TYPE` is deprecated and will end support in 0.13.0, please start using `[database] TYPE`. +- Configuration option `[database] PASSWD` is deprecated and will end support in 0.13.0, please start using `[database] PASSWORD`. +- Configuration option `[security] REVERSE_PROXY_AUTHENTICATION_USER` is deprecated and will end support in 0.13.0, please start using `[auth] REVERSE_PROXY_AUTHENTICATION_HEADER`. +- Configuration section `[mailer]` is deprecated and will end support in 0.13.0, please start using `[email]`. +- Configuration section `[service]` is deprecated and will end support in 0.13.0, please start using `[auth]`. +- Configuration option `[auth] ACTIVE_CODE_LIVE_MINUTES` is deprecated and will end support in 0.13.0, please start using `[auth] ACTIVATE_CODE_LIVES`. +- Configuration option `[auth] RESET_PASSWD_CODE_LIVE_MINUTES` is deprecated and will end support in 0.13.0, please start using `[auth] RESET_PASSWORD_CODE_LIVES`. +- Configuration option `[auth] REGISTER_EMAIL_CONFIRM` is deprecated and will end support in 0.13.0, please start using `[auth] REQUIRE_EMAIL_CONFIRMATION`. +- Configuration option `[auth] ENABLE_CAPTCHA` is deprecated and will end support in 0.13.0, please start using `[auth] ENABLE_REGISTRATION_CAPTCHA`. +- Configuration option `[auth] ENABLE_NOTIFY_MAIL` is deprecated and will end support in 0.13.0, please start using `[user] ENABLE_EMAIL_NOTIFICATION`. +- Configuration option `[session] GC_INTERVAL_TIME` is deprecated and will end support in 0.13.0, please start using `[session] GC_INTERVAL`. +- Configuration option `[session] SESSION_LIFE_TIME` is deprecated and will end support in 0.13.0, please start using `[session] MAX_LIFE_TIME`. +- The name `-` is reserved and cannot be used for users or organizations. + +### Fixed + +- [Security] Potential open redirection with i18n. +- [Security] Potential ability to delete files outside a repository. +- [Security] Potential ability to set primary email on others' behalf from their verified emails. +- [Security] Potential XSS attack via `.ipynb`. [#5170](https://github.com/gogs/gogs/issues/5170) +- [Security] Potential SSRF attack via webhooks. [#5366](https://github.com/gogs/gogs/issues/5366) +- [Security] Potential CSRF attack in admin panel. [#5367](https://github.com/gogs/gogs/issues/5367) +- [Security] Potential stored XSS attack in some browsers. [#5397](https://github.com/gogs/gogs/issues/5397) +- [Security] Potential RCE on mirror repositories. [#5767](https://github.com/gogs/gogs/issues/5767) +- [Security] Potential XSS attack with raw markdown API. [#5907](https://github.com/gogs/gogs/pull/5907) +- File both modified and renamed within a commit treated as separate files. [#5056](https://github.com/gogs/gogs/issues/5056) +- Unable to restore the database backup to MySQL 8.0 with syntax error. [#5602](https://github.com/gogs/gogs/issues/5602) +- Open/close milestone redirects to a 404 page. [#5677](https://github.com/gogs/gogs/issues/5677) +- Disallow multiple tokens with same name. [#5587](https://github.com/gogs/gogs/issues/5587) [#5820](https://github.com/gogs/gogs/pull/5820) +- Enable Federated Avatar Lookup could cause server to crash. [#5848](https://github.com/gogs/gogs/issues/5848) +- Private repositories are hidden in the organization's view. [#5869](https://github.com/gogs/gogs/issues/5869) +- Users have access to base repository cannot view commits in forks. [#5878](https://github.com/gogs/gogs/issues/5878) +- Server error when changing email address in user settings page. [#5899](https://github.com/gogs/gogs/issues/5899) +- Fall back to use RFC 3339 as time layout when misconfigured. [#6098](https://github.com/gogs/gogs/issues/6098) +- Unable to update team with server error. [#6185](https://github.com/gogs/gogs/issues/6185) +- Webhooks are not fired after push when `[service] REQUIRE_SIGNIN_VIEW = true`. +- Files with identical content are randomly displayed one of them. + +### Removed + +- Configuration option `[other] SHOW_FOOTER_VERSION` +- Configuration option `[server] STATIC_ROOT_PATH` +- Configuration option `[repository] MIRROR_QUEUE_LENGTH` +- Configuration option `[repository] PULL_REQUEST_QUEUE_LENGTH` +- Configuration option `[session] ENABLE_SET_COOKIE` +- Configuration option `[release.attachment] PATH` +- Configuration option `[webhook] QUEUE_LENGTH` +- Build tag `sqlite`, which means CGO is now required. + +--- + +**Older change logs can be found on [GitHub](https://github.com/gogs/gogs/releases?after=v0.12.0).** diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 00000000000..47dc3e3d863 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000000..dd3d002b026 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,2 @@ +# Default +* @gogs/core diff --git a/Dockerfile b/Dockerfile index 3a3c4051183..821d89f1a13 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,56 @@ -FROM alpine:3.3 -MAINTAINER jp@roemer.im +FROM --platform=$BUILDPLATFORM node:24-alpine AS webbuilder +RUN corepack enable +WORKDIR /src +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY web ./web +COPY conf/locale ./conf/locale +RUN pnpm install --frozen-lockfile +RUN pnpm --filter gogs-web run build -# Install system utils & Gogs runtime dependencies -ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-amd64 /usr/sbin/gosu -RUN chmod +x /usr/sbin/gosu \ - && apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh socat tzdata +FROM golang:1.26-alpine3.23 AS binarybuilder +RUN apk --no-cache --no-progress add --virtual \ + build-deps \ + build-base \ + git \ + linux-pam-dev -ENV GOGS_CUSTOM /data/gogs +WORKDIR /gogs.io/gogs +COPY . . +COPY --from=webbuilder /src/public/dist ./public/dist -COPY . /app/gogs/ -WORKDIR /app/gogs/ -RUN ./docker/build.sh +RUN go build -v -trimpath -tags "pam prod" \ + -ldflags "-X 'gogs.io/gogs/internal/conf.BuildTime=$(date -u '+%Y-%m-%d %I:%M:%S %Z')' -X 'gogs.io/gogs/internal/conf.BuildCommit=$(git rev-parse HEAD)'" \ + -o .bin/gogs ./cmd/gogs -# Configure LibC Name Service +FROM alpine:3.23 +RUN apk --no-cache --no-progress add \ + bash \ + ca-certificates \ + curl \ + git \ + linux-pam \ + openssh \ + s6 \ + shadow \ + socat \ + tzdata \ + rsync \ + "zlib>1.3.2" + +ENV GOGS_CUSTOM=/data/gogs + +# Configure LibC Name Service COPY docker/nsswitch.conf /etc/nsswitch.conf -# Configure Docker Container -VOLUME ["/data"] +WORKDIR /app/gogs +COPY docker ./docker +COPY --from=binarybuilder /gogs.io/gogs/.bin/gogs . + +RUN ./docker/build/finalize.sh + +# Configure Docker Container +VOLUME ["/data", "/backup"] EXPOSE 22 3000 -ENTRYPOINT ["docker/start.sh"] -CMD ["/bin/s6-svscan", "/app/gogs/docker/s6/"] +HEALTHCHECK CMD (curl --noproxy localhost -o /dev/null -sS http://localhost:3000/healthcheck) || exit 1 +ENTRYPOINT ["/app/gogs/docker/start.sh"] +CMD ["/usr/bin/s6-svscan", "/app/gogs/docker/s6/"] diff --git a/Dockerfile.next b/Dockerfile.next new file mode 100644 index 00000000000..e2f9694934d --- /dev/null +++ b/Dockerfile.next @@ -0,0 +1,62 @@ +FROM --platform=$BUILDPLATFORM node:24-alpine AS webbuilder +RUN corepack enable +WORKDIR /src +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY web ./web +COPY conf/locale ./conf/locale +RUN pnpm install --frozen-lockfile +RUN pnpm --filter gogs-web run build + +FROM golang:1.26-alpine3.23 AS binarybuilder +RUN apk --no-cache --no-progress add --virtual \ + build-deps \ + build-base \ + git \ + linux-pam-dev + +WORKDIR /gogs.io/gogs +COPY . . +COPY --from=webbuilder /src/public/dist ./public/dist + +RUN go build -v -trimpath -tags "pam prod" \ + -ldflags "-X 'gogs.io/gogs/internal/conf.BuildTime=$(date -u '+%Y-%m-%d %I:%M:%S %Z')' -X 'gogs.io/gogs/internal/conf.BuildCommit=$(git rev-parse HEAD)'" \ + -o .bin/gogs ./cmd/gogs + +FROM alpine:3.23 + +# Create git user and group with fixed UID/GID at build time for better K8s security context support. +# Using 1000:1000 as it's a common non-root UID/GID that works well with most volume permission setups. +ARG GOGS_UID=1000 +ARG GOGS_GID=1000 +RUN addgroup -g ${GOGS_GID} -S git && \ + adduser -u ${GOGS_UID} -G git -H -D -g 'Gogs Git User' -h /data/git -s /bin/sh git + +RUN apk --no-cache --no-progress add \ + bash \ + ca-certificates \ + curl \ + git \ + linux-pam \ + openssh-keygen \ + "zlib>1.3.2" + +ENV GOGS_CUSTOM=/data/gogs + +WORKDIR /app/gogs +COPY --from=binarybuilder /gogs.io/gogs/.bin/gogs . +COPY docker-next/start.sh . +RUN chmod +x start.sh && \ + mkdir -p /data && \ + ln -s /data/git /home/git && \ + chown -R git:git /app/gogs /data + +# Configure Docker Container +VOLUME ["/data", "/backup"] +EXPOSE 22 3000 +HEALTHCHECK CMD (curl --noproxy localhost -o /dev/null -sS http://localhost:3000/healthcheck) || exit 1 + +# Run as non-root user by default for better K8s security context support. +USER git:git + +ENTRYPOINT ["/app/gogs/start.sh"] +CMD ["/app/gogs/gogs", "web"] diff --git a/Dockerfile.rpi b/Dockerfile.rpi deleted file mode 100644 index 8fbe8252b69..00000000000 --- a/Dockerfile.rpi +++ /dev/null @@ -1,25 +0,0 @@ -FROM hypriot/rpi-alpine-scratch:v3.2 -MAINTAINER jp@roemer.im, raxetul@gmail.com - -# Install system utils & Gogs runtime dependencies -ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-armhf /usr/sbin/gosu -RUN chmod +x /usr/sbin/gosu \ - && echo "http://dl-4.alpinelinux.org/alpine/v3.3/main/" | tee /etc/apk/repositories \ - && echo "http://dl-4.alpinelinux.org/alpine/v3.3/community/" | tee -a /etc/apk/repositories \ - && apk -U --no-progress upgrade && rm -f /var/cache/apk/APKINDEX.* \ - && apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh socat tzdata - -ENV GOGS_CUSTOM /data/gogs - -COPY . /app/gogs/ -WORKDIR /app/gogs/ -RUN ./docker/build.sh - -# Configure LibC Name Service -COPY docker/nsswitch.conf /etc/nsswitch.conf - -# Configure Docker Container -VOLUME ["/data"] -EXPOSE 22 3000 -ENTRYPOINT ["docker/start.sh"] -CMD ["/bin/s6-svscan", "/app/gogs/docker/s6/"] diff --git a/Makefile b/Makefile deleted file mode 100644 index c321f82badf..00000000000 --- a/Makefile +++ /dev/null @@ -1,74 +0,0 @@ -LDFLAGS += -X "github.com/gogits/gogs/modules/setting.BuildTime=$(shell date -u '+%Y-%m-%d %I:%M:%S %Z')" -LDFLAGS += -X "github.com/gogits/gogs/modules/setting.BuildGitHash=$(shell git rev-parse HEAD)" - -DATA_FILES := $(shell find conf | sed 's/ /\\ /g') -LESS_FILES := $(wildcard public/less/gogs.less public/less/_*.less) -GENERATED := modules/bindata/bindata.go public/css/gogs.css - -TAGS = "" -BUILD_FLAGS = "-v" - -RELEASE_ROOT = "release" -RELEASE_GOGS = "release/gogs" -NOW = $(shell date -u '+%Y%m%d%I%M%S') -GOVET = go tool vet -composites=false -methods=false -structtags=false - -.PHONY: build pack release bindata clean - -.IGNORE: public/css/gogs.css - -all: build - -check: test - -dist: release - -govet: - $(GOVET) gogs.go - $(GOVET) models modules routers - -build: $(GENERATED) - go install $(BUILD_FLAGS) -ldflags '$(LDFLAGS)' -tags '$(TAGS)' - cp '$(GOPATH)/bin/gogs' . - -build-dev: $(GENERATED) govet - go install $(BUILD_FLAGS) -tags '$(TAGS)' - cp '$(GOPATH)/bin/gogs' . - -build-dev-race: $(GENERATED) govet - go install $(BUILD_FLAGS) -race -tags '$(TAGS)' - cp '$(GOPATH)/bin/gogs' . - -pack: - rm -rf $(RELEASE_GOGS) - mkdir -p $(RELEASE_GOGS) - cp -r gogs LICENSE README.md README_ZH.md templates public scripts $(RELEASE_GOGS) - rm -rf $(RELEASE_GOGS)/public/config.codekit $(RELEASE_GOGS)/public/less - cd $(RELEASE_ROOT) && zip -r gogs.$(NOW).zip "gogs" - -release: build pack - -bindata: modules/bindata/bindata.go - -modules/bindata/bindata.go: $(DATA_FILES) - go-bindata -o=$@ -ignore="\\.DS_Store|README.md|TRANSLATORS" -pkg=bindata conf/... - -less: public/css/gogs.css - -public/css/gogs.css: $(LESS_FILES) - lessc $< $@ - -clean: - go clean -i ./... - -clean-mac: clean - find . -name ".DS_Store" -print0 | xargs -0 rm - -test: - go test -cover -race ./... - -fixme: - grep -rnw "FIXME" routers models modules - -todo: - grep -rnw "TODO" routers models modules diff --git a/README.md b/README.md index 8e10c59af8d..f381854e9e3 100644 --- a/README.md +++ b/README.md @@ -1,138 +1,111 @@ -Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/gogs/localized.svg)](https://crowdin.com/project/gogs) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -===================== -![](https://github.com/gogits/gogs/blob/master/public/img/gogs-large-resize.png?raw=true) - -##### Current tip version: 0.9.100 (see [Releases](https://github.com/gogits/gogs/releases) for binary versions or submit a task on [alpha stage automated binary building system](https://build.gogs.io/)) - -| Web | UI | Preview | -|:-------------:|:-------:|:-------:| -|![Dashboard](https://gogs.io/img/screenshots/1.png)|![Repository](https://gogs.io/img/screenshots/2.png)|![Commits History](https://gogs.io/img/screenshots/3.png)| -|![Profile](https://gogs.io/img/screenshots/4.png)|![Admin Dashboard](https://gogs.io/img/screenshots/5.png)|![Diff](https://gogs.io/img/screenshots/6.png)| -|![Issues](https://gogs.io/img/screenshots/7.png)|![Releases](https://gogs.io/img/screenshots/8.png)|![Organization](https://gogs.io/img/screenshots/9.png)| - -### Important Notes - -1. **YOU MUST READ [Contributing Code](https://github.com/gogits/gogs/wiki/Contributing-Code) BEFORE STARTING TO WORK ON A PULL REQUEST**. -2. Due to testing purpose, data of [try.gogs.io](https://try.gogs.io) was reset in **Jan 28, 2015** and will reset multiple times after. Please do **NOT** put your important data on the site. -3. The demo site [try.gogs.io](https://try.gogs.io) is running under `develop` branch. -4. If you think there are vulnerabilities in the project, please talk privately to **u@gogs.io**. Thanks! -5. If you're interested in using APIs, we have experimental support with [documentation](https://github.com/gogits/go-gogs-client/wiki). -6. If your team/company is using Gogs and would like to put your logo on [our website](https://gogs.io), contact us by any means. - -[简体中文](README_ZH.md) - -## Purpose - -The goal of this project is to make the easiest, fastest, and most painless way of setting up a self-hosted Git service. With Go, this can be done with an independent binary distribution across **ALL platforms** that Go supports, including Linux, Mac OS X, Windows and ARM. - -## Overview - -- Please see the [Documentation](https://gogs.io/docs/intro) for common usages and change log. -- See the [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team. +

+

+ Gogs + Gogs +
+
+ GitHub Workflow Status + Sourcegraph +
+
+ 👉 Deploy on DigitalOcean and get $200 in free credits! +
+

+ +## 🔮 Vision + +The Gogs (`/gɑgz/`) project aims to build a simple, stable and extensible self-hosted Git service that can be set up in the most painless way. With Go, this can be done with an independent binary distribution across all platforms that Go supports, including Linux, macOS, Windows and ARM-based systems. + +## 📡 Overview + +- Please visit [our home page](https://gogs.io) for user documentation. +- Please refer to [CHANGELOG.md](CHANGELOG.md) for list of changes in each releases. - Want to try it before doing anything else? Do it [online](https://try.gogs.io/gogs/gogs)! -- Having trouble? Get help with [Troubleshooting](https://gogs.io/docs/intro/troubleshooting.html) or [User Forum](https://discuss.gogs.io/). -- Want to help with localization? Check out the [guide](https://gogs.io/docs/features/i18n.html)! - -## Features - -- Activity timeline -- SSH and HTTP/HTTPS protocols -- SMTP/LDAP/Reverse proxy authentication -- Reverse proxy with sub-path -- Account/Organization/Repository management -- Add/Remove repository collaborators -- Repository/Organization webhooks (including Slack) -- Repository Git hooks/deploy keys -- Repository issues, pull requests and wiki -- Migrate and mirror repository and its wiki -- Web editor for repository files and wiki -- Gravatar and Federated avatar with custom source -- Mail service -- Administration panel -- Supports MySQL, PostgreSQL, SQLite3 and [TiDB](https://github.com/pingcap/tidb) (experimental) -- Multi-language support ([20 languages](https://crowdin.com/project/gogs)) - -## System Requirements - -- A cheap Raspberry Pi is powerful enough for basic functionality. -- 2 CPU cores and 1GB RAM would be the baseline for teamwork. - -## Browser Support +- Having trouble? Help yourself with [troubleshooting](https://gogs.io/asking/troubleshooting) or ask questions in [Discussions](https://github.com/gogs/gogs/discussions). +- Want to help with localization? Check out the [localization documentation](https://gogs.io/advancing/localization). +- Ready to get hands dirty? Read our [contributing guide](.github/CONTRIBUTING.md). +- Hmm... What about APIs? We have experimental support with [documentation](https://gogs.io/api-reference). + +## 💌 Features + +- User dashboard, user profile and activity timeline. +- Access repositories via SSH, HTTP and HTTPS protocols. +- User, organization and repository management. +- Repository and organization webhooks, including Slack, Discord and Dingtalk. +- Repository Git hooks, deploy keys and Git LFS. +- Repository issues, pull requests, wiki, protected branches and collaboration. +- Migrate and mirror repositories with wiki from other code hosts. +- Web editor for quick editing repository files and wiki. +- Jupyter Notebook and PDF rendering. +- Authentication via SMTP, LDAP, reverse proxy, GitHub.com and GitHub Enterprise with 2FA. +- Customize HTML templates, static files and many others. +- Rich database backend support, including PostgreSQL, MySQL, SQLite3 or any database backend that speaks one of those protocols. +- Have localization over [31 languages](https://crowdin.com/project/gogs). + +## 💾 Hardware requirements + +- A Raspberry Pi or $5 Digital Ocean Droplet is more than enough to get you started. Some even use 64MB RAM Docker [CaaS](https://www.docker.com/blog/containers-as-a-service-caas/). +- 2 CPU cores and 512MB RAM would be the baseline for teamwork. +- Increase CPU cores when your team size gets significantly larger, memory footprint remains low. + +## 💻 Browser support - Please see [Semantic UI](https://github.com/Semantic-Org/Semantic-UI#browser-support) for specific versions of supported browsers. -- The official support minimal size is **1024*768**, UI may still looks right in smaller size but no promises and fixes. +- The smallest resolution officially supported is **1024*768**, however the UI may still look right in smaller resolutions, but no promises or fixes. -## Installation +## 📜 Installation -Make sure you install the [prerequisites](https://gogs.io/docs/installation) first. +Please follow [the guide in our documentation](https://gogs.io/getting-started/installation). -There are 5 ways to install Gogs: +### Deploy to cloud -- [Install from binary](https://gogs.io/docs/installation/install_from_binary.html) -- [Install from source](https://gogs.io/docs/installation/install_from_source.html) -- [Install from packages](https://gogs.io/docs/installation/install_from_packages.html) -- [Ship with Docker](https://github.com/gogits/gogs/tree/master/docker) -- [Install with Vagrant](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs) +- [Cloudron](https://www.cloudron.io/store/io.gogs.cloudronapp.html) +- [YunoHost](https://github.com/YunoHost-Apps/gogs_ynh) +- [alwaysdata](https://www.alwaysdata.com/en/marketplace/gogs/) ### Tutorials +- [Private Git Web Portal in Raspberry PI With Gogs](https://peppe8o.com/private-git-web-portal-in-raspberry-pi-with-gogs/) - [How To Set Up Gogs on Ubuntu 14.04](https://www.digitalocean.com/community/tutorials/how-to-set-up-gogs-on-ubuntu-14-04) -- [Run your own GitHub-like service with the help of Docker](http://blog.hypriot.com/post/run-your-own-github-like-service-with-docker/) -- [Dockerized Gogs git server and alpine postgres in 20 minutes or less](http://garthwaite.org/docker-gogs.html) -- [Host Your Own Private GitHub with Gogs.io](https://eladnava.com/host-your-own-private-github-with-gogs-io/) -- [使用 Gogs 搭建自己的 Git 服务器](https://mynook.info/blog/post/host-your-own-git-server-using-gogs) (Chinese) -- [阿里云上 Ubuntu 14.04 64 位安装 Gogs](http://my.oschina.net/luyao/blog/375654) (Chinese) +- [Run your own GitHub-like service with the help of Docker](https://blog.hypriot.com/post/run-your-own-github-like-service-with-docker/) +- [Dockerized Gogs git server and alpine postgres in 20 minutes or less](https://garthwaite.org/docker-gogs.html) +- [Host Your Own Private GitHub with Gogs](https://eladnava.com/host-your-own-private-github-with-gogs-io/) +- [使用 Gogs 搭建自己的 Git 服务器](https://blog.mynook.info/post/host-your-own-git-server-using-gogs/) (Chinese) +- [阿里云上 Ubuntu 14.04 64 位安装 Gogs](https://my.oschina.net/luyao/blog/375654) (Chinese) - [Installing Gogs on FreeBSD](https://www.codejam.info/2015/03/installing-gogs-on-freebsd.html) -- [Gogs on Raspberry Pi](http://blog.meinside.pe.kr/Gogs-on-Raspberry-Pi/) -- [Cloudflare Full SSL with GOGS (Go Git Service) using NGINX](http://www.listekconsulting.com/articles/cloudflare-full-ssl-with-gogs-go-git-service-using-nginx/) - -### Screencasts - - [How to install Gogs on a Linux Server (DigitalOcean)](https://www.youtube.com/watch?v=deSfX0gqefE) -- [Instalando Gogs no Ubuntu](https://www.youtube.com/watch?v=4UkHAR1F7ZA) (Português) - -### Deploy to Cloud -- [OpenShift](https://github.com/tkisme/gogs-openshift) -- [Cloudron](https://cloudron.io/appstore.html#io.gogs.cloudronapp) -- [Scaleway](https://www.scaleway.com/imagehub/gogs/) -- [Portal](https://portaldemo.xyz/cloud/) -- [Sandstorm](https://github.com/cem/gogs-sandstorm) -- [sloppy.io](https://github.com/sloppyio/quickstarters/tree/master/gogs) -- [YunoHost](https://github.com/mbugeia/gogs_ynh) -- [DPlatform](https://github.com/j8r/DPlatform) +## 📦 Software, service and product support -## Software and Service Support - -- [Drone](https://github.com/drone/drone) (CI) -- [Fabric8](http://fabric8.io/) (DevOps) -- [Taiga](https://taiga.io/) (Project Management) -- [Puppet](https://forge.puppetlabs.com/Siteminds/gogs) (IT) -- [Kanboard](http://kanboard.net/plugin/gogs-webhook) (Project Management) -- [BearyChat](https://bearychat.com/) (Team Communication) -- [HiWork](http://www.hiwork.cc/) (Team Communication) +- [Jenkins](https://plugins.jenkins.io/gogs-webhook/) (CI) +- [Puppet](https://forge.puppet.com/modules/Siteminds/gogs) (IT) +- [Synology](https://www.synology.com) (Docker) +- [Syncloud](https://syncloud.org/) (App Store) -### Product Support +## 🙇‍♂️ Acknowledgments -- [Synology](https://www.synology.com) (Docker) -- [One Space](http://www.onespace.cc) (App Store) +

This project is proudly supported by:

+

+ + + +

-## Acknowledgments +Other acknowledgments: -- Router and middleware mechanism of [Macaron](https://github.com/go-macaron/macaron). -- System Monitor Status is inspired by [GoBlog](https://github.com/fuxiaohei/goblog). -- Thanks [Rocker](http://weibo.com/rocker1989) for designing Logo. -- Thanks [Crowdin](https://crowdin.com/project/gogs) for providing open source translation plan. -- Thanks [DigitalOcean](https://www.digitalocean.com) for hosting home and demo sites. -- Thanks [KeyCDN](https://www.keycdn.com/) and [QiNiu](http://www.qiniu.com/) for providing CDN service. +- Thanks [Egon Elbre](https://twitter.com/egonelbre) for designing the original version of the logo. +- Thanks [Mintlify](https://mintlify.com) for sponsoring open source documentation plan. +- Thanks [Crowdin](https://crowdin.com) for sponsoring open source translation plan. +- Thanks [Buildkite](https://buildkite.com) for sponsoring open source CI/CD plan. -## Contributors +## 👋 Contributors -- Ex-team members [@lunny](https://github.com/lunny), [@fuxiaohei](https://github.com/fuxiaohei) and [@slene](https://github.com/slene). -- See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors. +- See [contributors page](https://github.com/gogs/gogs/graphs/contributors) for top 100 contributors. - See [TRANSLATORS](conf/locale/TRANSLATORS) for public list of translators. -## License +## ⚖️ License -This project is under the MIT License. See the [LICENSE](https://github.com/gogits/gogs/blob/master/LICENSE) file for the full license text. +This project is under the MIT License. See the [LICENSE](https://github.com/gogs/gogs/blob/main/LICENSE) file for the full license text. diff --git a/README_ZH.md b/README_ZH.md deleted file mode 100644 index fd02e986569..00000000000 --- a/README_ZH.md +++ /dev/null @@ -1,107 +0,0 @@ -Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) -===================== - -Gogs (Go Git Service) 是一款极易搭建的自助 Git 服务。 - -## 开发目的 - -Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 **所有平台**,包括 Linux、Mac OS X、Windows 以及 ARM 平台。 - -## 项目概览 - -- 有关基本用法和变更日志,请通过 [使用手册](https://gogs.io/docs/intro/) 查看。 -- 您可以到 [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) 跟随开发团队的脚步。 -- 想要先睹为快?直接去 [在线体验](https://try.gogs.io/gogs/gogs) 。 -- 使用过程中遇到问题?尝试从 [故障排查](https://gogs.io/docs/intro/troubleshooting.html) 页面或 [用户论坛](https://discuss.gogs.io/) 获取帮助。 -- 希望帮助多国语言界面的翻译吗?请立即访问 [详情页面](https://gogs.io/docs/features/i18n.html)! - -## 功能特性 - -- 支持活动时间线 -- 支持 SSH 以及 HTTP/HTTPS 协议 -- 支持 SMTP、LDAP 和反向代理的用户认证 -- 支持反向代理子路径 -- 支持用户、组织和仓库管理系统 -- 支持添加和删除仓库协作者 -- 支持仓库和组织级别 Web 钩子(包括 Slack 集成) -- 支持仓库 Git 钩子和部署密钥 -- 支持仓库工单(Issue)、合并请求(Pull Request)以及 Wiki -- 支持迁移和镜像仓库以及它的 Wiki -- 支持在线编辑仓库文件和 Wiki -- 支持自定义源的 Gravatar 和 Federated Avatar -- 支持邮件服务 -- 支持后台管理面板 -- 支持 MySQL、PostgreSQL、SQLite3 和 [TiDB](https://github.com/pingcap/tidb)(实验性支持) 数据库 -- 支持多语言本地化([20 种语言]([more](https://crowdin.com/project/gogs))) - -## 系统要求 - -- 最低的系统硬件要求为一个廉价的树莓派 -- 如果用于团队项目,建议使用 2 核 CPU 及 1GB 内存 - -## 浏览器支持 - -- 请根据 [Semantic UI](https://github.com/Semantic-Org/Semantic-UI#browser-support) 查看具体支持的浏览器版本。 -- 官方支持的最小 UI 尺寸为 **1024*768**,UI 不一定会在更小尺寸的设备上被破坏,但我们无法保证且不会修复。 - -## 安装部署 - -在安装 Gogs 之前,您需要先安装 [基本环境](https://gogs.io/docs/installation)。 - -然后,您可以通过以下 5 种方式来安装 Gogs: - -- [二进制安装](https://gogs.io/docs/installation/install_from_binary.html) -- [源码安装](https://gogs.io/docs/installation/install_from_source.html) -- [包管理安装](https://gogs.io/docs/installation/install_from_packages.html) -- [采用 Docker 部署](https://github.com/gogits/gogs/tree/master/docker) -- [通过 Vagrant 安装](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs) - -### 使用教程 - -- [使用 Gogs 搭建自己的 Git 服务器](https://mynook.info/blog/post/host-your-own-git-server-using-gogs) -- [阿里云上 Ubuntu 14.04 64 位安装 Gogs](http://my.oschina.net/luyao/blog/375654) - -### 云端部署 - -- [OpenShift](https://github.com/tkisme/gogs-openshift) -- [Cloudron](https://cloudron.io/appstore.html#io.gogs.cloudronapp) -- [Scaleway](https://www.scaleway.com/imagehub/gogs/) -- [Portal](https://portaldemo.xyz/cloud/) -- [Sandstorm](https://github.com/cem/gogs-sandstorm) -- [sloppy.io](https://github.com/sloppyio/quickstarters/tree/master/gogs) -- [YunoHost](https://github.com/mbugeia/gogs_ynh) -- [DPlatform](https://github.com/j8r/DPlatform) - -## 软件及服务支持 - -- [Drone](https://github.com/drone/drone)(CI) -- [Fabric8](http://fabric8.io/)(DevOps) -- [Taiga](https://taiga.io/)(项目管理) -- [Puppet](https://forge.puppetlabs.com/Siteminds/gogs)(IT) -- [Kanboard](http://kanboard.net/plugin/gogs-webhook)(项目管理) -- [BearyChat](https://bearychat.com/)(团队交流) -- [HiWork](http://www.hiwork.cc/)(团队交流) - -### 产品支持 - -- [Synology](https://www.synology.com)(Docker) -- [One Space](http://www.onespace.cc)(应用商店) - -## 特别鸣谢 - -- 基于 [Macaron](https://github.com/go-macaron/macaron) 的路由与中间件机制。 -- 基于 [GoBlog](https://github.com/fuxiaohei/goblog) 修改的系统监视状态。 -- 感谢 [Rocker](http://weibo.com/rocker1989) 设计的 Logo。 -- 感谢 [Crowdin](https://crowdin.com/project/gogs) 提供免费的开源项目本地化支持。 -- 感谢 [DigitalOcean](https://www.digitalocean.com) 提供主站和体验站点的服务器赞助。 -- 感谢 [KeyCDN](https://www.keycdn.com/) 和 [七牛云存储](http://www.qiniu.com/) 提供 CDN 服务赞助。 - -## 贡献成员 - -- 前团队成员 [@lunny](https://github.com/lunny)、[@fuxiaohei](https://github.com/fuxiaohei) 和 [@slene](https://github.com/slene)。 -- 您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。 -- 您可以通过查看 [TRANSLATORS](conf/locale/TRANSLATORS) 文件获取公开的翻译人员列表。 - -## 授权许可 - -本项目采用 MIT 开源授权许可证,完整的授权说明已放置在 [LICENSE](https://github.com/gogits/gogs/blob/master/LICENSE) 文件中。 diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000000..cccfb3cfd94 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,27 @@ +# Security policy + +## Supported versions + +Only the latest minor version releases are supported (e.g., 0.14) for patching vulnerabilities. You can find the latest minor version in the [GitHub releases](https://github.com/gogs/gogs/releases) page. + +Existing vulnerability reports are being tracked in [GitHub Security Advisories](https://github.com/gogs/gogs/security/advisories). Not all accepted GHSA are published. + +## Vulnerability lifecycle + +> [!important] +> Starting **Nov 9, 2023 00:00 UTC**, only security vulnerabilities reported through [GitHub Security Advisories](https://github.com/gogs/gogs/security/advisories/new) are accepted. +> Pre-existing vulnerability reported through https://huntr.dev/ or email (`security@gogs.io`) will continue to be worked through. + +1. Report an advisory for the vulnerability. + - Please be aware that **only advisories reported in plain English** will be reviewed. + - We DO NOT accept vulnerabilities cannot be reproduced on the latest `main` commit. +1. Project maintainers review the advisory: + - Ask clarifying questions + - Make sure there was no prior advisory exists for the same vulnerability + - Confirm or deny the vulnerability +1. Once the advisory is accepted, the reporter may submit a patch or wait for project maintainers to patch. + - The latter is usually significantly slower. +1. Patch releases will be made for the supported versions. +1. After 14 days of the release, publish the corresponding advisory on [GitHub Security Advisories](https://github.com/gogs/gogs/security/advisories). + +Thank you for making open source community a better place! diff --git a/cmd/admin.go b/cmd/admin.go deleted file mode 100644 index bad36b1c85c..00000000000 --- a/cmd/admin.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2016 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 cmd - -import ( - "fmt" - - "github.com/urfave/cli" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/setting" -) - -var ( - CmdAdmin = cli.Command{ - Name: "admin", - Usage: "Preform admin operations on command line", - Description: `Allow using internal logic of Gogs without hacking into the source code -to make automatic initialization process more smoothly`, - Subcommands: []cli.Command{ - subcmdCreateUser, - }, - } - - subcmdCreateUser = cli.Command{ - Name: "create-user", - Usage: "Create a new user in database", - Action: runCreateUser, - Flags: []cli.Flag{ - stringFlag("name", "", "Username"), - stringFlag("password", "", "User password"), - stringFlag("email", "", "User email address"), - boolFlag("admin", "User is an admin"), - stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), - }, - } -) - -func runCreateUser(c *cli.Context) error { - if !c.IsSet("name") { - return fmt.Errorf("Username is not specified") - } else if !c.IsSet("password") { - return fmt.Errorf("Password is not specified") - } else if !c.IsSet("email") { - return fmt.Errorf("Email is not specified") - } - - if c.IsSet("config") { - setting.CustomConf = c.String("config") - } - - setting.NewContext() - models.LoadConfigs() - models.SetEngine() - - if err := models.CreateUser(&models.User{ - Name: c.String("name"), - Email: c.String("email"), - Passwd: c.String("password"), - IsActive: true, - IsAdmin: c.Bool("admin"), - }); err != nil { - return fmt.Errorf("CreateUser: %v", err) - } - - fmt.Printf("New user '%s' has been successfully created!\n", c.String("name")) - return nil -} diff --git a/cmd/cert.go b/cmd/cert.go deleted file mode 100644 index 6cd5bfade4f..00000000000 --- a/cmd/cert.go +++ /dev/null @@ -1,163 +0,0 @@ -// +build cert - -// Copyright 2009 The Go Authors. All rights reserved. -// Copyright 2014 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 cmd - -import ( - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "crypto/x509/pkix" - "encoding/pem" - "log" - "math/big" - "net" - "os" - "strings" - "time" - - "github.com/urfave/cli" -) - -var CmdCert = cli.Command{ - Name: "cert", - Usage: "Generate self-signed certificate", - Description: `Generate a self-signed X.509 certificate for a TLS server. -Outputs to 'cert.pem' and 'key.pem' and will overwrite existing files.`, - Action: runCert, - Flags: []cli.Flag{ - stringFlag("host", "", "Comma-separated hostnames and IPs to generate a certificate for"), - stringFlag("ecdsa-curve", "", "ECDSA curve to use to generate a key. Valid values are P224, P256, P384, P521"), - intFlag("rsa-bits", 2048, "Size of RSA key to generate. Ignored if --ecdsa-curve is set"), - stringFlag("start-date", "", "Creation date formatted as Jan 1 15:04:05 2011"), - durationFlag("duration", 365*24*time.Hour, "Duration that certificate is valid for"), - boolFlag("ca", "whether this cert should be its own Certificate Authority"), - }, -} - -func publicKey(priv interface{}) interface{} { - switch k := priv.(type) { - case *rsa.PrivateKey: - return &k.PublicKey - case *ecdsa.PrivateKey: - return &k.PublicKey - default: - return nil - } -} - -func pemBlockForKey(priv interface{}) *pem.Block { - switch k := priv.(type) { - case *rsa.PrivateKey: - return &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)} - case *ecdsa.PrivateKey: - b, err := x509.MarshalECPrivateKey(k) - if err != nil { - log.Fatalf("Unable to marshal ECDSA private key: %v\n", err) - } - return &pem.Block{Type: "EC PRIVATE KEY", Bytes: b} - default: - return nil - } -} - -func runCert(ctx *cli.Context) error { - if len(ctx.String("host")) == 0 { - log.Fatal("Missing required --host parameter") - } - - var priv interface{} - var err error - switch ctx.String("ecdsa-curve") { - case "": - priv, err = rsa.GenerateKey(rand.Reader, ctx.Int("rsa-bits")) - case "P224": - priv, err = ecdsa.GenerateKey(elliptic.P224(), rand.Reader) - case "P256": - priv, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - case "P384": - priv, err = ecdsa.GenerateKey(elliptic.P384(), rand.Reader) - case "P521": - priv, err = ecdsa.GenerateKey(elliptic.P521(), rand.Reader) - default: - log.Fatalf("Unrecognized elliptic curve: %q", ctx.String("ecdsa-curve")) - } - if err != nil { - log.Fatalf("Failed to generate private key: %s", err) - } - - var notBefore time.Time - if len(ctx.String("start-date")) == 0 { - notBefore = time.Now() - } else { - notBefore, err = time.Parse("Jan 2 15:04:05 2006", ctx.String("start-date")) - if err != nil { - log.Fatalf("Failed to parse creation date: %s", err) - } - } - - notAfter := notBefore.Add(ctx.Duration("duration")) - - serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) - serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) - if err != nil { - log.Fatalf("Failed to generate serial number: %s", err) - } - - template := x509.Certificate{ - SerialNumber: serialNumber, - Subject: pkix.Name{ - Organization: []string{"Acme Co"}, - CommonName: "Gogs", - }, - NotBefore: notBefore, - NotAfter: notAfter, - - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, - BasicConstraintsValid: true, - } - - hosts := strings.Split(ctx.String("host"), ",") - for _, h := range hosts { - if ip := net.ParseIP(h); ip != nil { - template.IPAddresses = append(template.IPAddresses, ip) - } else { - template.DNSNames = append(template.DNSNames, h) - } - } - - if ctx.Bool("ca") { - template.IsCA = true - template.KeyUsage |= x509.KeyUsageCertSign - } - - derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, publicKey(priv), priv) - if err != nil { - log.Fatalf("Failed to create certificate: %s", err) - } - - certOut, err := os.Create("cert.pem") - if err != nil { - log.Fatalf("Failed to open cert.pem for writing: %s", err) - } - pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) - certOut.Close() - log.Println("Written cert.pem") - - keyOut, err := os.OpenFile("key.pem", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - log.Fatalf("Failed to open key.pem for writing: %v\n", err) - } - pem.Encode(keyOut, pemBlockForKey(priv)) - keyOut.Close() - log.Println("Written key.pem") - - return nil -} diff --git a/cmd/cert_stub.go b/cmd/cert_stub.go deleted file mode 100644 index 1c076f64952..00000000000 --- a/cmd/cert_stub.go +++ /dev/null @@ -1,28 +0,0 @@ -// +build !cert - -// Copyright 2009 The Go Authors. All rights reserved. -// Copyright 2014 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 cmd - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -var CmdCert = cli.Command{ - Name: "cert", - Usage: "Generate self-signed certificate", - Description: `Please use build tags "cert" to rebuild Gogs in order to have this ability`, - Action: runCert, -} - -func runCert(ctx *cli.Context) error { - fmt.Println("Command cert not available, please use build tags 'cert' to rebuild.") - os.Exit(1) - - return nil -} diff --git a/cmd/cmd.go b/cmd/cmd.go deleted file mode 100644 index 29afa625d39..00000000000 --- a/cmd/cmd.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2015 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 cmd - -import ( - "time" - - "github.com/urfave/cli" -) - -func stringFlag(name, value, usage string) cli.StringFlag { - return cli.StringFlag{ - Name: name, - Value: value, - Usage: usage, - } -} - -func boolFlag(name, usage string) cli.BoolFlag { - return cli.BoolFlag{ - Name: name, - Usage: usage, - } -} - -func intFlag(name string, value int, usage string) cli.IntFlag { - return cli.IntFlag{ - Name: name, - Value: value, - Usage: usage, - } -} - -func durationFlag(name string, value time.Duration, usage string) cli.DurationFlag { - return cli.DurationFlag{ - Name: name, - Value: value, - Usage: usage, - } -} diff --git a/cmd/dump.go b/cmd/dump.go deleted file mode 100644 index c1361f93285..00000000000 --- a/cmd/dump.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2014 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 cmd - -import ( - "fmt" - "log" - "os" - "path" - "time" - - "io/ioutil" - - "github.com/Unknwon/cae/zip" - "github.com/urfave/cli" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/setting" -) - -var CmdDump = cli.Command{ - Name: "dump", - Usage: "Dump Gogs files and database", - Description: `Dump compresses all related files and database into zip file. -It can be used for backup and capture Gogs server image to send to maintainer`, - Action: runDump, - Flags: []cli.Flag{ - stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), - boolFlag("verbose, v", "Show process details"), - stringFlag("tempdir, t", os.TempDir(), "Temporary dir path"), - }, -} - -func runDump(ctx *cli.Context) error { - if ctx.IsSet("config") { - setting.CustomConf = ctx.String("config") - } - setting.NewContext() - models.LoadConfigs() - models.SetEngine() - - tmpDir := ctx.String("tempdir") - if _, err := os.Stat(tmpDir); os.IsNotExist(err) { - log.Fatalf("Path does not exist: %s", tmpDir) - } - TmpWorkDir, err := ioutil.TempDir(tmpDir, "gogs-dump-") - if err != nil { - log.Fatalf("Fail to create tmp work directory: %v", err) - } - log.Printf("Creating tmp work dir: %s", TmpWorkDir) - - reposDump := path.Join(TmpWorkDir, "gogs-repo.zip") - dbDump := path.Join(TmpWorkDir, "gogs-db.sql") - - log.Printf("Dumping local repositories...%s", setting.RepoRootPath) - zip.Verbose = ctx.Bool("verbose") - if err := zip.PackTo(setting.RepoRootPath, reposDump, true); err != nil { - log.Fatalf("Fail to dump local repositories: %v", err) - } - - log.Printf("Dumping database...") - if err := models.DumpDatabase(dbDump); err != nil { - log.Fatalf("Fail to dump database: %v", err) - } - - fileName := fmt.Sprintf("gogs-dump-%d.zip", time.Now().Unix()) - log.Printf("Packing dump files...") - z, err := zip.Create(fileName) - if err != nil { - os.Remove(fileName) - log.Fatalf("Fail to create %s: %v", fileName, err) - } - - if err := z.AddFile("gogs-repo.zip", reposDump); err != nil { - log.Fatalf("Fail to include gogs-repo.zip: %v", err) - } - if err := z.AddFile("gogs-db.sql", dbDump); err != nil { - log.Fatalf("Fail to include gogs-db.sql: %v", err) - } - customDir, err := os.Stat(setting.CustomPath) - if err == nil && customDir.IsDir() { - if err := z.AddDir("custom", setting.CustomPath); err != nil { - log.Fatalf("Fail to include custom: %v", err) - } - } else { - log.Printf("Custom dir %s doesn't exist, skipped", setting.CustomPath) - } - if err := z.AddDir("log", setting.LogRootPath); err != nil { - log.Fatalf("Fail to include log: %v", err) - } - // FIXME: SSH key file. - if err = z.Close(); err != nil { - os.Remove(fileName) - log.Fatalf("Fail to save %s: %v", fileName, err) - } - - if err := os.Chmod(fileName, 0600); err != nil { - log.Printf("Can't change file access permissions mask to 0600: %v", err) - } - - log.Printf("Removing tmp work dir: %s", TmpWorkDir) - os.RemoveAll(TmpWorkDir) - log.Printf("Finish dumping in file %s", fileName) - - return nil -} diff --git a/cmd/gogs/admin.go b/cmd/gogs/admin.go new file mode 100644 index 00000000000..b596a81a584 --- /dev/null +++ b/cmd/gogs/admin.go @@ -0,0 +1,189 @@ +package main + +import ( + "context" + "fmt" + "reflect" + "runtime" + + "github.com/cockroachdb/errors" + "github.com/urfave/cli/v3" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" +) + +var ( + adminCommand = cli.Command{ + Name: "admin", + Usage: "Perform admin operations on command line", + Description: `Allow using internal logic of Gogs without hacking into the source code +to make automatic initialization process more smoothly`, + Commands: []*cli.Command{ + &subcmdCreateUser, + &subcmdDeleteInactivateUsers, + &subcmdDeleteRepositoryArchives, + &subcmdDeleteMissingRepositories, + &subcmdGitGcRepos, + &subcmdRewriteAuthorizedKeys, + &subcmdSyncRepositoryHooks, + &subcmdReinitMissingRepositories, + }, + } + + subcmdCreateUser = cli.Command{ + Name: "create-user", + Usage: "Create a new user in database", + Action: runCreateUser, + Flags: []cli.Flag{ + stringFlag("name", "", "Username"), + stringFlag("password", "", "User password"), + stringFlag("email", "", "User email address"), + boolFlag("admin", "User is an admin"), + stringFlag("config, c", "", "Custom configuration file path"), + }, + } + + subcmdDeleteInactivateUsers = cli.Command{ + Name: "delete-inactive-users", + Usage: "Delete all inactive accounts", + Action: adminDashboardOperation( + func() error { return database.Handle.Users().DeleteInactivated() }, + "All inactivated accounts have been deleted successfully", + ), + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + }, + } + + subcmdDeleteRepositoryArchives = cli.Command{ + Name: "delete-repository-archives", + Usage: "Delete all repositories archives", + Action: adminDashboardOperation( + database.DeleteRepositoryArchives, + "All repositories archives have been deleted successfully", + ), + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + }, + } + + subcmdDeleteMissingRepositories = cli.Command{ + Name: "delete-missing-repositories", + Usage: "Delete all repository records that lost Git files", + Action: adminDashboardOperation( + database.DeleteMissingRepositories, + "All repositories archives have been deleted successfully", + ), + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + }, + } + + subcmdGitGcRepos = cli.Command{ + Name: "collect-garbage", + Usage: "Do garbage collection on repositories", + Action: adminDashboardOperation( + database.GitGcRepos, + "All repositories have done garbage collection successfully", + ), + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + }, + } + + subcmdRewriteAuthorizedKeys = cli.Command{ + Name: "rewrite-authorized-keys", + Usage: "Rewrite '.ssh/authorized_keys' file (caution: non-Gogs keys will be lost)", + Action: adminDashboardOperation( + database.RewriteAuthorizedKeys, + "All public keys have been rewritten successfully", + ), + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + }, + } + + subcmdSyncRepositoryHooks = cli.Command{ + Name: "resync-hooks", + Usage: "Resync pre-receive, update and post-receive hooks", + Action: adminDashboardOperation( + database.SyncRepositoryHooks, + "All repositories' pre-receive, update and post-receive hooks have been resynced successfully", + ), + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + }, + } + + subcmdReinitMissingRepositories = cli.Command{ + Name: "reinit-missing-repositories", + Usage: "Reinitialize all repository records that lost Git files", + Action: adminDashboardOperation( + database.ReinitMissingRepositories, + "All repository records that lost Git files have been reinitialized successfully", + ), + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + }, + } +) + +func runCreateUser(ctx context.Context, cmd *cli.Command) error { + if !cmd.IsSet("name") { + return errors.New("Username is not specified") + } else if !cmd.IsSet("password") { + return errors.New("Password is not specified") + } else if !cmd.IsSet("email") { + return errors.New("Email is not specified") + } + + err := conf.Init(configFromLineage(cmd)) + if err != nil { + return errors.Wrap(err, "init configuration") + } + conf.InitLogging(true) + + if _, err = database.SetEngine(); err != nil { + return errors.Wrap(err, "set engine") + } + + user, err := database.Handle.Users().Create( + ctx, + cmd.String("name"), + cmd.String("email"), + database.CreateUserOptions{ + Password: cmd.String("password"), + Activated: true, + Admin: cmd.Bool("admin"), + }, + ) + if err != nil { + return errors.Wrap(err, "create user") + } + + fmt.Printf("New user %q has been successfully created!\n", user.Name) + return nil +} + +func adminDashboardOperation(operation func() error, successMessage string) func(context.Context, *cli.Command) error { + return func(_ context.Context, cmd *cli.Command) error { + err := conf.Init(configFromLineage(cmd)) + if err != nil { + return errors.Wrap(err, "init configuration") + } + conf.InitLogging(true) + + if _, err = database.SetEngine(); err != nil { + return errors.Wrap(err, "set engine") + } + + if err := operation(); err != nil { + functionName := runtime.FuncForPC(reflect.ValueOf(operation).Pointer()).Name() + return errors.Newf("%s: %v", functionName, err) + } + + fmt.Printf("%s\n", successMessage) + return nil + } +} diff --git a/cmd/gogs/backup.go b/cmd/gogs/backup.go new file mode 100644 index 00000000000..0ba38efe2c9 --- /dev/null +++ b/cmd/gogs/backup.go @@ -0,0 +1,194 @@ +package main + +import ( + "context" + "fmt" + "os" + "path" + "path/filepath" + "strconv" + "time" + + "github.com/cockroachdb/errors" + "github.com/unknwon/cae/zip" + "github.com/urfave/cli/v3" + "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/osx" +) + +var backupCommand = cli.Command{ + Name: "backup", + Usage: "Backup files and database", + Description: `Backup dumps and compresses all related files and database into zip file, +which can be used for migrating Gogs to another server. The output format is meant to be +portable among all supported database engines.`, + Action: runBackup, + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + boolFlag("verbose, v", "Show process details"), + stringFlag("tempdir, t", os.TempDir(), "Temporary directory path"), + stringFlag("target", "./", "Target directory path to save backup archive"), + stringFlag("archive-name", fmt.Sprintf("gogs-backup-%s.zip", time.Now().Format("20060102150405")), "Name of backup archive"), + boolFlag("database-only", "Only dump database"), + boolFlag("exclude-mirror-repos", "Exclude mirror repositories"), + boolFlag("exclude-repos", "Exclude repositories"), + }, +} + +const ( + currentBackupFormatVersion = 1 + archiveRootDir = "gogs-backup" +) + +func runBackup(ctx context.Context, cmd *cli.Command) error { + zip.Verbose = cmd.Bool("verbose") + + err := conf.Init(configFromLineage(cmd)) + if err != nil { + return errors.Wrap(err, "init configuration") + } + conf.InitLogging(true) + + conn, err := database.SetEngine() + if err != nil { + return errors.Wrap(err, "set engine") + } + + tmpDir := cmd.String("tempdir") + if !osx.Exist(tmpDir) { + log.Fatal("'--tempdir' does not exist: %s", tmpDir) + } + rootDir, err := os.MkdirTemp(tmpDir, "gogs-backup-") + if err != nil { + log.Fatal("Failed to create backup root directory '%s': %v", rootDir, err) + } + log.Info("Backup root directory: %s", rootDir) + + // Metadata + metaFile := path.Join(rootDir, "metadata.ini") + metadata := ini.Empty() + metadata.Section("").Key("VERSION").SetValue(strconv.Itoa(currentBackupFormatVersion)) + metadata.Section("").Key("DATE_TIME").SetValue(time.Now().String()) + metadata.Section("").Key("GOGS_VERSION").SetValue(conf.App.Version) + if err = metadata.SaveTo(metaFile); err != nil { + log.Fatal("Failed to save metadata '%s': %v", metaFile, err) + } + + archiveName := filepath.Join(cmd.String("target"), cmd.String("archive-name")) + log.Info("Packing backup files to: %s", archiveName) + + z, err := zip.Create(archiveName) + if err != nil { + log.Fatal("Failed to create backup archive '%s': %v", archiveName, err) + } + if err = z.AddFile(archiveRootDir+"/metadata.ini", metaFile); err != nil { + log.Fatal("Failed to include 'metadata.ini': %v", err) + } + + // Database + dbDir := filepath.Join(rootDir, "db") + if err = database.DumpDatabase(ctx, conn, dbDir, cmd.Bool("verbose")); err != nil { + log.Fatal("Failed to dump database: %v", err) + } + if err = z.AddDir(archiveRootDir+"/db", dbDir); err != nil { + log.Fatal("Failed to include 'db': %v", err) + } + + if !cmd.Bool("database-only") { + // Custom files + err = addCustomDirToBackup(z) + if err != nil { + log.Fatal("Failed to add custom directory to backup: %v", err) + } + + // Data files + for _, dir := range []string{"ssh", "attachments", "avatars", "repo-avatars"} { + dirPath := filepath.Join(conf.Server.AppDataPath, dir) + if !osx.IsDir(dirPath) { + continue + } + + if err = z.AddDir(path.Join(archiveRootDir+"/data", dir), dirPath); err != nil { + log.Fatal("Failed to include 'data': %v", err) + } + } + } + + // Repositories + if !cmd.Bool("exclude-repos") && !cmd.Bool("database-only") { + reposDump := filepath.Join(rootDir, "repositories.zip") + log.Info("Dumping repositories in %q", conf.Repository.Root) + if cmd.Bool("exclude-mirror-repos") { + repos, err := database.GetNonMirrorRepositories() + if err != nil { + log.Fatal("Failed to get non-mirror repositories: %v", err) + } + reposZip, err := zip.Create(reposDump) + if err != nil { + log.Fatal("Failed to create %q: %v", reposDump, err) + } + baseDir := filepath.Base(conf.Repository.Root) + for _, r := range repos { + name := r.FullName() + ".git" + if err := reposZip.AddDir(filepath.Join(baseDir, name), filepath.Join(conf.Repository.Root, name)); err != nil { + log.Fatal("Failed to add %q: %v", name, err) + } + } + if err = reposZip.Close(); err != nil { + log.Fatal("Failed to save %q: %v", reposDump, err) + } + } else { + if err = zip.PackTo(conf.Repository.Root, reposDump, true); err != nil { + log.Fatal("Failed to dump repositories: %v", err) + } + } + log.Info("Repositories dumped to: %s", reposDump) + + if err = z.AddFile(archiveRootDir+"/repositories.zip", reposDump); err != nil { + log.Fatal("Failed to include %q: %v", reposDump, err) + } + } + + if err = z.Close(); err != nil { + log.Fatal("Failed to save backup archive '%s': %v", archiveName, err) + } + + _ = os.RemoveAll(rootDir) + log.Info("Backup succeed! Archive is located at: %s", archiveName) + log.Stop() + return nil +} + +func addCustomDirToBackup(z *zip.ZipArchive) error { + customDir := conf.CustomDir() + entries, err := os.ReadDir(customDir) + if err != nil { + return errors.Wrap(err, "list custom directory entries") + } + + for _, e := range entries { + if e.Name() == "data" { + // Skip the "data" directory because it lives under the "custom" directory in + // the Docker setup and will be backed up separately. + log.Trace(`Skipping "data" directory in custom directory`) + continue + } + + add := z.AddFile + if e.IsDir() { + add = z.AddDir + } + err = add( + fmt.Sprintf("%s/custom/%s", archiveRootDir, e.Name()), + filepath.Join(customDir, e.Name()), + ) + if err != nil { + return errors.Wrapf(err, "add %q", e.Name()) + } + } + return nil +} diff --git a/cmd/gogs/cmd.go b/cmd/gogs/cmd.go new file mode 100644 index 00000000000..7331b0c2d9a --- /dev/null +++ b/cmd/gogs/cmd.go @@ -0,0 +1,56 @@ +package main + +import ( + "strings" + + "github.com/urfave/cli/v3" +) + +func stringFlag(name, value, usage string) *cli.StringFlag { + parts := strings.SplitN(name, ", ", 2) + f := &cli.StringFlag{ + Name: parts[0], + Value: value, + Usage: usage, + } + if len(parts) > 1 { + f.Aliases = []string{parts[1]} + } + return f +} + +// configFromLineage walks the command lineage to find the --config flag value. +// This is needed because subcommands may not directly see flags set on parent commands. +func configFromLineage(cmd *cli.Command) string { + for _, c := range cmd.Lineage() { + if c.IsSet("config") { + return c.String("config") + } + } + return "" +} + +func intFlag(name string, value int, usage string) *cli.IntFlag { + parts := strings.SplitN(name, ", ", 2) + f := &cli.IntFlag{ + Name: parts[0], + Value: value, + Usage: usage, + } + if len(parts) > 1 { + f.Aliases = []string{parts[1]} + } + return f +} + +func boolFlag(name, usage string) *cli.BoolFlag { + parts := strings.SplitN(name, ", ", 2) + f := &cli.BoolFlag{ + Name: parts[0], + Usage: usage, + } + if len(parts) > 1 { + f.Aliases = []string{parts[1]} + } + return f +} diff --git a/cmd/gogs/hook.go b/cmd/gogs/hook.go new file mode 100644 index 00000000000..8c31797ddec --- /dev/null +++ b/cmd/gogs/hook.go @@ -0,0 +1,273 @@ +package main + +import ( + "bufio" + "bytes" + "context" + "crypto/tls" + "fmt" + "net/url" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + + "github.com/urfave/cli/v3" + log "unknwon.dev/clog/v2" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/email" + "gogs.io/gogs/internal/httplib" + "gogs.io/gogs/internal/osx" +) + +var ( + hookCommand = cli.Command{ + Name: "hook", + Usage: "Delegate commands to corresponding Git hooks", + Description: "All sub-commands should only be called by Git", + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + }, + Commands: []*cli.Command{ + &subcmdHookPreReceive, + &subcmdHookUpadte, + &subcmdHookPostReceive, + }, + } + + subcmdHookPreReceive = cli.Command{ + Name: "pre-receive", + Usage: "Delegate pre-receive Git hook", + Description: "This command should only be called by Git", + Action: runHookPreReceive, + } + subcmdHookUpadte = cli.Command{ + Name: "update", + Usage: "Delegate update Git hook", + Description: "This command should only be called by Git", + Action: runHookUpdate, + } + subcmdHookPostReceive = cli.Command{ + Name: "post-receive", + Usage: "Delegate post-receive Git hook", + Description: "This command should only be called by Git", + Action: runHookPostReceive, + } +) + +func runHookPreReceive(_ context.Context, cmd *cli.Command) error { + if os.Getenv("SSH_ORIGINAL_COMMAND") == "" { + return nil + } + setup(cmd, "pre-receive.log", true) + + isWiki := strings.Contains(os.Getenv(database.EnvRepoCustomHooksPath), ".wiki.git/") + + buf := bytes.NewBuffer(nil) + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + buf.Write(scanner.Bytes()) + buf.WriteByte('\n') + + if isWiki { + continue + } + + fields := bytes.Fields(scanner.Bytes()) + if len(fields) != 3 { + continue + } + oldCommitID := string(fields[0]) + newCommitID := string(fields[1]) + branchName := git.RefShortName(string(fields[2])) + + // Branch protection + repoID, _ := strconv.ParseInt(os.Getenv(database.EnvRepoID), 10, 64) + protectBranch, err := database.GetProtectBranchOfRepoByName(repoID, branchName) + if err != nil { + if database.IsErrBranchNotExist(err) { + continue + } + fail("Internal error", "GetProtectBranchOfRepoByName [repo_id: %d, branch: %s]: %v", repoID, branchName, err) + } + if !protectBranch.Protected { + continue + } + + // Whitelist users can bypass require pull request check + bypassRequirePullRequest := false + + // Check if user is in whitelist when enabled + userID, _ := strconv.ParseInt(os.Getenv(database.EnvAuthUserID), 10, 64) + if protectBranch.EnableWhitelist { + if !database.IsUserInProtectBranchWhitelist(repoID, userID, branchName) { + fail(fmt.Sprintf("Branch '%s' is protected and you are not in the push whitelist", branchName), "") + } + + bypassRequirePullRequest = true + } + + // Check if branch allows direct push + if !bypassRequirePullRequest && protectBranch.RequirePullRequest { + fail(fmt.Sprintf("Branch '%s' is protected and commits must be merged through pull request", branchName), "") + } + + // check and deletion + if newCommitID == git.EmptyID { + fail(fmt.Sprintf("Branch '%s' is protected from deletion", branchName), "") + } + + // Check force push + output, err := git.NewCommand("rev-list", "--max-count=1", oldCommitID, "^"+newCommitID). + RunInDir(database.RepoPath(os.Getenv(database.EnvRepoOwnerName), os.Getenv(database.EnvRepoName))) + if err != nil { + fail("Internal error", "Failed to detect force push: %v", err) + } else if len(output) > 0 { + fail(fmt.Sprintf("Branch '%s' is protected from force push", branchName), "") + } + } + + customHooksPath := filepath.Join(os.Getenv(database.EnvRepoCustomHooksPath), "pre-receive") + if !osx.IsFile(customHooksPath) { + return nil + } + + var hookCmd *exec.Cmd + if conf.IsWindowsRuntime() { + hookCmd = exec.Command("bash.exe", "custom_hooks/pre-receive") + } else { + hookCmd = exec.Command(customHooksPath) + } + hookCmd.Dir = database.RepoPath(os.Getenv(database.EnvRepoOwnerName), os.Getenv(database.EnvRepoName)) + hookCmd.Stdout = os.Stdout + hookCmd.Stdin = buf + hookCmd.Stderr = os.Stderr + if err := hookCmd.Run(); err != nil { + fail("Internal error", "Failed to execute custom pre-receive hook: %v", err) + } + return nil +} + +func runHookUpdate(_ context.Context, cmd *cli.Command) error { + if os.Getenv("SSH_ORIGINAL_COMMAND") == "" { + return nil + } + setup(cmd, "update.log", false) + + args := cmd.Args().Slice() + if len(args) != 3 { + fail("Arguments received are not equal to three", "Arguments received are not equal to three") + } else if args[0] == "" { + fail("First argument 'refName' is empty", "First argument 'refName' is empty") + } + + customHooksPath := filepath.Join(os.Getenv(database.EnvRepoCustomHooksPath), "update") + if !osx.IsFile(customHooksPath) { + return nil + } + + var hookCmd *exec.Cmd + if conf.IsWindowsRuntime() { + hookCmd = exec.Command("bash.exe", append([]string{"custom_hooks/update"}, args...)...) + } else { + hookCmd = exec.Command(customHooksPath, args...) + } + hookCmd.Dir = database.RepoPath(os.Getenv(database.EnvRepoOwnerName), os.Getenv(database.EnvRepoName)) + hookCmd.Stdout = os.Stdout + hookCmd.Stdin = os.Stdin + hookCmd.Stderr = os.Stderr + if err := hookCmd.Run(); err != nil { + fail("Internal error", "Failed to execute custom pre-receive hook: %v", err) + } + return nil +} + +func runHookPostReceive(_ context.Context, cmd *cli.Command) error { + if os.Getenv("SSH_ORIGINAL_COMMAND") == "" { + return nil + } + setup(cmd, "post-receive.log", true) + + // Post-receive hook does more than just gather Git information, + // so we need to setup additional services for email notifications. + email.NewContext() + + isWiki := strings.Contains(os.Getenv(database.EnvRepoCustomHooksPath), ".wiki.git/") + + buf := bytes.NewBuffer(nil) + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + buf.Write(scanner.Bytes()) + buf.WriteByte('\n') + + // TODO: support news feeds for wiki + if isWiki { + continue + } + + fields := bytes.Fields(scanner.Bytes()) + if len(fields) != 3 { + continue + } + + pusherID, _ := strconv.ParseInt(os.Getenv(database.EnvAuthUserID), 10, 64) + options := database.PushUpdateOptions{ + OldCommitID: string(fields[0]), + NewCommitID: string(fields[1]), + FullRefspec: string(fields[2]), + PusherID: pusherID, + PusherName: os.Getenv(database.EnvAuthUserName), + RepoUserName: os.Getenv(database.EnvRepoOwnerName), + RepoName: os.Getenv(database.EnvRepoName), + } + if err := database.PushUpdate(options); err != nil { + log.Error("PushUpdate: %v", err) + } + + // Ask for running deliver hook and test pull request tasks + q := make(url.Values) + q.Add("branch", git.RefShortName(options.FullRefspec)) + q.Add("secret", os.Getenv(database.EnvRepoOwnerSaltMd5)) + q.Add("pusher", os.Getenv(database.EnvAuthUserID)) + reqURL := fmt.Sprintf("%s%s/%s/tasks/trigger?%s", conf.Server.LocalRootURL, options.RepoUserName, options.RepoName, q.Encode()) + log.Trace("Trigger task: %s", reqURL) + + resp, err := httplib.Get(reqURL). + SetTLSClientConfig(&tls.Config{ + InsecureSkipVerify: true, + }).Response() + if err == nil { + _ = resp.Body.Close() + if resp.StatusCode/100 != 2 { + log.Error("Failed to trigger task: unsuccessful response code %d", resp.StatusCode) + } + } else { + log.Error("Failed to trigger task: %v", err) + } + } + + customHooksPath := filepath.Join(os.Getenv(database.EnvRepoCustomHooksPath), "post-receive") + if !osx.IsFile(customHooksPath) { + return nil + } + + var hookCmd *exec.Cmd + if conf.IsWindowsRuntime() { + hookCmd = exec.Command("bash.exe", "custom_hooks/post-receive") + } else { + hookCmd = exec.Command(customHooksPath) + } + hookCmd.Dir = database.RepoPath(os.Getenv(database.EnvRepoOwnerName), os.Getenv(database.EnvRepoName)) + hookCmd.Stdout = os.Stdout + hookCmd.Stdin = buf + hookCmd.Stderr = os.Stderr + if err := hookCmd.Run(); err != nil { + fail("Internal error", "Failed to execute custom post-receive hook: %v", err) + } + return nil +} diff --git a/cmd/gogs/import.go b/cmd/gogs/import.go new file mode 100644 index 00000000000..fe40a58c63d --- /dev/null +++ b/cmd/gogs/import.go @@ -0,0 +1,108 @@ +package main + +import ( + "bufio" + "bytes" + "context" + "fmt" + "os" + "path/filepath" + "time" + + "github.com/cockroachdb/errors" + "github.com/urfave/cli/v3" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/osx" +) + +var ( + importCommand = cli.Command{ + Name: "import", + Usage: "Import portable data as local Gogs data", + Description: `Allow user import data from other Gogs installations to local instance +without manually hacking the data files`, + Commands: []*cli.Command{ + &subcmdImportLocale, + }, + } + + subcmdImportLocale = cli.Command{ + Name: "locale", + Usage: "Import locale files to local repository", + Action: runImportLocale, + Flags: []cli.Flag{ + stringFlag("source", "", "Source directory that stores new locale files"), + stringFlag("target", "", "Target directory that stores old locale files"), + stringFlag("config, c", "", "Custom configuration file path"), + }, + } +) + +func runImportLocale(_ context.Context, cmd *cli.Command) error { + if !cmd.IsSet("source") { + return errors.New("source directory is not specified") + } else if !cmd.IsSet("target") { + return errors.New("target directory is not specified") + } + if !osx.IsDir(cmd.String("source")) { + return errors.Newf("source directory %q does not exist or is not a directory", cmd.String("source")) + } else if !osx.IsDir(cmd.String("target")) { + return errors.Newf("target directory %q does not exist or is not a directory", cmd.String("target")) + } + + err := conf.Init(configFromLineage(cmd)) + if err != nil { + return errors.Wrap(err, "init configuration") + } + + now := time.Now() + + var line []byte + badChars := []byte(`="`) + escapedQuotes := []byte(`\"`) + regularQuotes := []byte(`"`) + // Cut out en-US. + for _, lang := range conf.I18n.Langs[1:] { + name := fmt.Sprintf("locale_%s.ini", lang) + source := filepath.Join(cmd.String("source"), name) + target := filepath.Join(cmd.String("target"), name) + if !osx.IsFile(source) { + continue + } + + // Crowdin surrounds double quotes for strings contain quotes inside, + // this breaks INI parser, we need to fix that. + sr, err := os.Open(source) + if err != nil { + return errors.Newf("open: %v", err) + } + + tw, err := os.Create(target) + if err != nil { + return errors.Newf("create: %v", err) + } + + scanner := bufio.NewScanner(sr) + for scanner.Scan() { + line = scanner.Bytes() + idx := bytes.Index(line, badChars) + if idx > -1 && line[len(line)-1] == '"' { + // We still want the "=" sign + line = append(line[:idx+1], line[idx+2:len(line)-1]...) + line = bytes.ReplaceAll(line, escapedQuotes, regularQuotes) + } + _, _ = tw.Write(line) + _, _ = tw.WriteString("\n") + } + _ = sr.Close() + _ = tw.Close() + + // Modification time of files from Crowdin often ahead of current, + // so we need to set back to current. + _ = os.Chtimes(target, now, now) + } + + fmt.Println("Locale files has been successfully imported!") + return nil +} diff --git a/cmd/gogs/internal/web/web.go b/cmd/gogs/internal/web/web.go new file mode 100644 index 00000000000..218360fefa9 --- /dev/null +++ b/cmd/gogs/internal/web/web.go @@ -0,0 +1,843 @@ +package web + +import ( + "crypto/tls" + "encoding/json" + "fmt" + "io" + "net" + "net/http" + "net/http/fcgi" + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/cockroachdb/errors" + "github.com/flamego/flamego" + "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/prometheus/client_golang/prometheus/promhttp" + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + embedConf "gogs.io/gogs/conf" + "gogs.io/gogs/internal/app" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/route" + "gogs.io/gogs/internal/route/admin" + apiv1 "gogs.io/gogs/internal/route/api/v1" + "gogs.io/gogs/internal/route/dev" + "gogs.io/gogs/internal/route/lfs" + "gogs.io/gogs/internal/route/org" + "gogs.io/gogs/internal/route/repo" + "gogs.io/gogs/internal/route/user" + "gogs.io/gogs/internal/template" + "gogs.io/gogs/public" + "gogs.io/gogs/templates" +) + +// Run starts the web server with the given configuration path and port override. +func Run(configPath string, portOverride int) error { + err := route.GlobalInit(configPath) + if err != nil { + return errors.Wrap(err, "initialize application") + } + + m, err := newMacaron() + if err != nil { + return errors.Wrap(err, "initialize macaron") + } + + webHandler, err := newRoutingHandler() + if err != nil { + return errors.Wrap(err, "initialize web handler") + } + + reqSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: true}) + ignSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: conf.Auth.RequireSigninView}) + reqSignOut := context.Toggle(&context.ToggleOptions{SignOutRequired: true}) + + bindIgnErr := binding.BindIgnErr + + m.SetAutoHead(true) + + m.Group("", func() { + m.Get("/", ignSignIn, route.Home) + m.Group("/explore", func() { + m.Get("", func(c *context.Context) { + c.Redirect(conf.Server.Subpath + "/explore/repos") + }) + m.Get("/repos", route.ExploreRepos) + m.Get("/users", route.ExploreUsers) + m.Get("/organizations", route.ExploreOrganizations) + }, ignSignIn) + m.Combo("/install", route.InstallInit).Get(route.Install). + Post(bindIgnErr(form.Install{}), route.InstallPost) + m.Get("/^:type(issues|pulls)$", reqSignIn, user.Issues) + + // ***** START: User ***** + m.Group("/user", func() { + m.Get("/sign_up", user.SignUp) + m.Post("/sign_up", bindIgnErr(form.Register{}), user.SignUpPost) + m.Get("/reset_password", user.ResetPasswd) + m.Post("/reset_password", user.ResetPasswdPost) + }, reqSignOut) + + m.Group("/user/settings", func() { + m.Get("", user.Settings) + m.Post("", bindIgnErr(form.UpdateProfile{}), user.SettingsPost) + m.Combo("/avatar").Get(user.SettingsAvatar). + Post(binding.MultipartForm(form.Avatar{}), user.SettingsAvatarPost) + m.Post("/avatar/delete", user.SettingsDeleteAvatar) + m.Combo("/email").Get(user.SettingsEmails). + Post(bindIgnErr(form.AddEmail{}), user.SettingsEmailPost) + m.Post("/email/delete", user.DeleteEmail) + m.Get("/password", user.SettingsPassword) + m.Post("/password", bindIgnErr(form.ChangePassword{}), user.SettingsPasswordPost) + m.Combo("/ssh").Get(user.SettingsSSHKeys). + Post(bindIgnErr(form.AddSSHKey{}), user.SettingsSSHKeysPost) + m.Post("/ssh/delete", user.DeleteSSHKey) + m.Group("/security", func() { + m.Get("", user.SettingsSecurity) + m.Combo("/two_factor_enable").Get(user.SettingsTwoFactorEnable). + Post(user.SettingsTwoFactorEnablePost) + m.Combo("/two_factor_recovery_codes").Get(user.SettingsTwoFactorRecoveryCodes). + Post(user.SettingsTwoFactorRecoveryCodesPost) + m.Post("/two_factor_disable", user.SettingsTwoFactorDisable) + }) + m.Group("/repositories", func() { + m.Get("", user.SettingsRepos) + m.Post("/leave", user.SettingsLeaveRepo) + }) + m.Group("/organizations", func() { + m.Get("", user.SettingsOrganizations) + m.Post("/leave", user.SettingsLeaveOrganization) + }) + + settingsHandler := user.NewSettingsHandler(user.NewSettingsStore()) + m.Combo("/applications").Get(settingsHandler.Applications()). + Post(bindIgnErr(form.NewAccessToken{}), settingsHandler.ApplicationsPost()) + m.Post("/applications/delete", settingsHandler.DeleteApplication()) + m.Route("/delete", "GET,POST", user.SettingsDelete) + }, reqSignIn, func(c *context.Context) { + c.Data["PageIsUserSettings"] = true + }) + + m.Group("/user", func() { + 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.Post("/logout", user.SignOut) + }) + // ***** END: User ***** + + reqAdmin := context.Toggle(&context.ToggleOptions{SignInRequired: true, AdminRequired: true}) + + // ***** START: Admin ***** + m.Group("/admin", func() { + m.Combo("").Get(admin.Dashboard).Post(admin.Operation) // "/admin" + 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(form.AdminCrateUser{}), admin.NewUserPost) + m.Combo("/:userid").Get(admin.EditUser).Post(bindIgnErr(form.AdminEditUser{}), 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(form.Authentication{}), admin.NewAuthSourcePost) + m.Combo("/:authid").Get(admin.EditAuthSource). + Post(bindIgnErr(form.Authentication{}), 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) + }) + }, reqAdmin) + // ***** 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("/stars", user.Stars) + }, context.InjectParamsUser()) + + m.Get("/attachments/:uuid", func(c *context.Context) { + attach, err := database.GetAttachmentByUUID(c.Params(":uuid")) + if err != nil { + c.NotFoundOrError(err, "get attachment by UUID") + return + } else if !osx.IsFile(attach.LocalPath()) { + c.NotFound() + return + } + + fr, err := os.Open(attach.LocalPath()) + if err != nil { + c.Error(err, "open attachment file") + return + } + defer fr.Close() + + c.Header().Set("Content-Security-Policy", "default-src 'none'; style-src 'unsafe-inline'; sandbox") + c.Header().Set("Cache-Control", "public,max-age=86400") + c.Header().Set("Content-Disposition", fmt.Sprintf(`inline; filename="%s"`, attach.Name)) + + if _, err = io.Copy(c.Resp, fr); err != nil { + c.Error(err, "copy from file to response") + return + } + }) + }, ignSignIn) + + m.Group("", func() { + m.Post("/issues/attachments", repo.UploadIssueAttachment) + m.Post("/releases/attachments", repo.UploadReleaseAttachment) + }, reqSignIn) + + m.Group("/:username", func() { + m.Post("/action/:action", user.Action) + }, reqSignIn, context.InjectParamsUser()) + + if macaron.Env == macaron.DEV { + m.Get("/template/*", dev.TemplatePreview) + } + + reqRepoAdmin := context.RequireRepoAdmin() + reqRepoWriter := context.RequireRepoWriter() + + webhookRoutes := func() { + m.Group("", func() { + m.Get("", repo.Webhooks) + m.Post("/delete", repo.DeleteWebhook) + m.Get("/:type/new", repo.WebhooksNew) + m.Post("/gogs/new", bindIgnErr(form.NewWebhook{}), repo.WebhooksNewPost) + m.Post("/slack/new", bindIgnErr(form.NewSlackHook{}), repo.WebhooksSlackNewPost) + m.Post("/discord/new", bindIgnErr(form.NewDiscordHook{}), repo.WebhooksDiscordNewPost) + m.Post("/dingtalk/new", bindIgnErr(form.NewDingtalkHook{}), repo.WebhooksDingtalkNewPost) + m.Get("/:id", repo.WebhooksEdit) + m.Post("/gogs/:id", bindIgnErr(form.NewWebhook{}), repo.WebhooksEditPost) + m.Post("/slack/:id", bindIgnErr(form.NewSlackHook{}), repo.WebhooksSlackEditPost) + m.Post("/discord/:id", bindIgnErr(form.NewDiscordHook{}), repo.WebhooksDiscordEditPost) + m.Post("/dingtalk/:id", bindIgnErr(form.NewDingtalkHook{}), repo.WebhooksDingtalkEditPost) + }, repo.InjectOrgRepoContext()) + } + + // ***** START: Organization ***** + m.Group("/org", func() { + m.Group("", func() { + m.Get("/create", org.Create) + m.Post("/create", bindIgnErr(form.CreateOrg{}), org.CreatePost) + }, func(c *context.Context) { + if !c.User.CanCreateOrganization() { + c.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(form.CreateTeam{}), org.NewTeamPost) + m.Get("/teams/:team/edit", org.EditTeam) + m.Post("/teams/:team/edit", bindIgnErr(form.CreateTeam{}), org.EditTeamPost) + m.Post("/teams/:team/delete", org.DeleteTeam) + + m.Group("/settings", func() { + m.Combo("").Get(org.Settings). + Post(bindIgnErr(form.UpdateOrgSetting{}), org.SettingsPost) + m.Post("/avatar", binding.MultipartForm(form.Avatar{}), org.SettingsAvatar) + m.Post("/avatar/delete", org.SettingsDeleteAvatar) + m.Group("/hooks", webhookRoutes) + 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(form.CreateRepo{}), repo.CreatePost) + m.Get("/migrate", repo.Migrate) + m.Post("/migrate", bindIgnErr(form.MigrateRepo{}), repo.MigratePost) + m.Combo("/fork/:repoid").Get(repo.Fork). + Post(bindIgnErr(form.CreateRepo{}), repo.ForkPost) + }, reqSignIn) + + m.Group("/:username/:reponame", func() { + m.Group("/settings", func() { + m.Combo("").Get(repo.Settings). + Post(bindIgnErr(form.RepoSetting{}), repo.SettingsPost) + m.Combo("/avatar").Get(repo.SettingsAvatar). + Post(binding.MultipartForm(form.Avatar{}), repo.SettingsAvatarPost) + m.Post("/avatar/delete", repo.SettingsDeleteAvatar) + m.Group("/collaboration", func() { + m.Combo("").Get(repo.SettingsCollaboration).Post(repo.SettingsCollaborationPost) + m.Post("/access_mode", repo.ChangeCollaborationAccessMode) + m.Post("/delete", repo.DeleteCollaboration) + }) + m.Group("/branches", func() { + m.Get("", repo.SettingsBranches) + m.Post("/default_branch", repo.UpdateDefaultBranch) + m.Combo("/*").Get(repo.SettingsProtectedBranch). + Post(bindIgnErr(form.ProtectBranch{}), repo.SettingsProtectedBranchPost) + }, func(c *context.Context) { + if c.Repo.Repository.IsMirror { + c.NotFound() + return + } + }) + + m.Group("/hooks", func() { + webhookRoutes() + + m.Group("/:id", func() { + m.Post("/test", repo.TestWebhook) + m.Post("/redelivery", repo.RedeliveryWebhook) + }) + + m.Group("/git", func() { + m.Get("", repo.SettingsGitHooks) + m.Combo("/:name").Get(repo.SettingsGitHooksEdit). + Post(repo.SettingsGitHooksEditPost) + }, context.GitHookService()) + }) + + m.Group("/keys", func() { + m.Combo("").Get(repo.SettingsDeployKeys). + Post(bindIgnErr(form.AddSSHKey{}), repo.SettingsDeployKeysPost) + m.Post("/delete", repo.DeleteDeployKey) + }) + }, func(c *context.Context) { + c.Data["PageIsSettings"] = true + }) + }, reqSignIn, context.RepoAssignment(), reqRepoAdmin, context.RepoRef()) + + m.Post("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), repo.Action) + m.Group("/:username/:reponame", func() { + m.Get("/issues", repo.RetrieveLabels, repo.Issues) + m.Get("/issues/:index", repo.ViewIssue) + m.Get("/labels/", repo.RetrieveLabels, repo.Labels) + m.Get("/milestones", repo.Milestones) + }, ignSignIn, context.RepoAssignment(true)) + m.Group("/:username/:reponame", func() { + // FIXME: should use different URLs but mostly same logic for comments of issue and pull request. + // 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(form.NewIssue{}), repo.NewIssuePost) + + m.Group("/:index", func() { + m.Post("/title", repo.UpdateIssueTitle) + m.Post("/content", repo.UpdateIssueContent) + m.Combo("/comments").Post(bindIgnErr(form.CreateComment{}), repo.NewComment) + }) + }) + m.Group("/comments/:id", func() { + m.Post("", repo.UpdateCommentContent) + m.Post("/delete", repo.DeleteComment) + }) + }, reqSignIn, context.RepoAssignment(true)) + m.Group("/:username/:reponame", func() { + m.Group("/wiki", func() { + m.Get("/?:page", repo.Wiki) + m.Get("/_pages", repo.WikiPages) + }, repo.MustEnableWiki, context.RepoRef()) + }, ignSignIn, context.RepoAssignment(false, true)) + + m.Group("/:username/:reponame", func() { + // FIXME: should use different URLs but mostly same logic for comments of issue and pull request. + // So they can apply their own enable/disable logic on routers. + m.Group("/issues", func() { + m.Group("/:index", func() { + m.Post("/label", repo.UpdateIssueLabel) + m.Post("/milestone", repo.UpdateIssueMilestone) + m.Post("/assignee", repo.UpdateIssueAssignee) + }, reqRepoWriter) + }) + m.Group("/labels", func() { + m.Post("/new", bindIgnErr(form.CreateLabel{}), repo.NewLabel) + m.Post("/edit", bindIgnErr(form.CreateLabel{}), repo.UpdateLabel) + m.Post("/delete", repo.DeleteLabel) + m.Post("/initialize", bindIgnErr(form.InitializeLabels{}), repo.InitializeLabels) + }, reqRepoWriter, context.RepoRef()) + m.Group("/milestones", func() { + m.Combo("/new").Get(repo.NewMilestone). + Post(bindIgnErr(form.CreateMilestone{}), repo.NewMilestonePost) + m.Get("/:id/edit", repo.EditMilestone) + m.Post("/:id/edit", bindIgnErr(form.CreateMilestone{}), 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(form.NewRelease{}), repo.NewReleasePost) + m.Post("/delete", repo.DeleteRelease) + m.Get("/edit/*", repo.EditRelease) + m.Post("/edit/*", bindIgnErr(form.EditRelease{}), repo.EditReleasePost) + }, repo.MustBeNotBare, reqRepoWriter, func(c *context.Context) { + c.Data["PageIsViewFiles"] = true + }) + + // FIXME: Should use c.Repo.PullRequest to unify template, currently we have inconsistent URL + // for PR in same repository. After select branch on the page, the URL contains redundant head user name. + // e.g. /org1/test-repo/compare/master...org1:develop + // which should be /org1/test-repo/compare/master...develop + m.Combo("/compare/*", repo.MustAllowPulls).Get(repo.CompareAndPullRequest). + Post(bindIgnErr(form.NewIssue{}), repo.CompareAndPullRequestPost) + + m.Group("", func() { + m.Combo("/_edit/*").Get(repo.EditFile). + Post(bindIgnErr(form.EditRepoFile{}), repo.EditFilePost) + m.Combo("/_new/*").Get(repo.NewFile). + Post(bindIgnErr(form.EditRepoFile{}), repo.NewFilePost) + m.Post("/_preview/*", bindIgnErr(form.EditPreviewDiff{}), repo.DiffPreviewPost) + m.Combo("/_delete/*").Get(repo.DeleteFile). + Post(bindIgnErr(form.DeleteRepoFile{}), repo.DeleteFilePost) + + m.Group("", func() { + m.Combo("/_upload/*").Get(repo.UploadFile). + Post(bindIgnErr(form.UploadRepoFile{}), repo.UploadFilePost) + m.Post("/upload-file", repo.UploadFileToServer) + m.Post("/upload-remove", bindIgnErr(form.RemoveUploadFile{}), repo.RemoveUploadFileFromServer) + }, func(c *context.Context) { + if !conf.Repository.Upload.Enabled { + c.NotFound() + return + } + }) + }, repo.MustBeNotBare, reqRepoWriter, context.RepoRef(), func(c *context.Context) { + if !c.Repo.CanEnableEditor() { + c.NotFound() + return + } + + c.Data["PageIsViewFiles"] = true + }) + }, reqSignIn, context.RepoAssignment()) + + m.Group("/:username/:reponame", func() { + m.Group("", func() { + m.Get("/releases", repo.MustBeNotBare, repo.Releases) + m.Get("/pulls", repo.RetrieveLabels, repo.Pulls) + m.Get("/pulls/:index", repo.ViewPull) + }, context.RepoRef()) + + m.Group("/branches", func() { + m.Get("", repo.Branches) + m.Get("/all", repo.AllBranches) + m.Post("/delete/*", reqSignIn, reqRepoWriter, repo.DeleteBranchPost) + }, repo.MustBeNotBare, func(c *context.Context) { + c.Data["PageIsViewFiles"] = true + }) + + m.Group("/wiki", func() { + m.Group("", func() { + m.Combo("/_new").Get(repo.NewWiki). + Post(bindIgnErr(form.NewWiki{}), repo.NewWikiPost) + m.Combo("/:page/_edit").Get(repo.EditWiki). + Post(bindIgnErr(form.NewWiki{}), repo.EditWikiPost) + m.Post("/:page/delete", repo.DeleteWikiPagePost) + }, reqSignIn, reqRepoWriter) + }, repo.MustEnableWiki, context.RepoRef()) + + m.Get("/archive/*", repo.MustBeNotBare, repo.Download) + + m.Group("/pulls/:index", func() { + m.Get("/commits", context.RepoRef(), repo.ViewPullCommits) + m.Get("/files", context.RepoRef(), repo.ViewPullFiles) + m.Post("/merge", reqRepoWriter, repo.MergePullRequest) + }, repo.MustAllowPulls) + + m.Group("", func() { + m.Get("/src/*", repo.Home) + m.Get("/raw/*", repo.SingleDownload) + m.Get("/commits/*", repo.RefCommits) + m.Get("/commit/:sha([a-f0-9]{7,40})$", repo.Diff) + m.Get("/forks", repo.Forks) + }, repo.MustBeNotBare, context.RepoRef()) + m.Get("/commit/:sha([a-f0-9]{7,40})\\.:ext(patch|diff)", repo.MustBeNotBare, repo.RawDiff) + + m.Get("/compare/:before([a-z0-9]{40})\\.\\.\\.:after([a-z0-9]{40})", repo.MustBeNotBare, context.RepoRef(), repo.CompareDiff) + }, ignSignIn, context.RepoAssignment()) + m.Group("/:username/:reponame", func() { + m.Get("", repo.Home) + m.Get("/stars", repo.Stars) + m.Get("/watchers", repo.Watchers) + }, context.ServeGoGet(), ignSignIn, context.RepoAssignment(), context.RepoRef()) + // ***** END: Repository ***** + + // ********************** + // ----- API routes ----- + // ********************** + + // TODO: Without session and CSRF + m.Group("/api", func() { + apiv1.RegisterRoutes(m) + }, ignSignIn) + + m.Any("/api/web/*", bridgeToWebAPI(webHandler)) + m.Get("/redirect", bridgeToWebAPI(webHandler)) + m.Any("/*", func(c *context.Context) { c.ServeWeb() }) + }, + session.Sessioner(session.Options{ + Provider: conf.Session.Provider, + ProviderConfig: conf.Session.ProviderConfig, + CookieName: conf.Session.CookieName, + CookiePath: conf.Server.Subpath, + Gclifetime: conf.Session.GCInterval, + Maxlifetime: conf.Session.MaxLifeTime, + Secure: conf.Session.CookieSecure, + CookieLifeTime: 86400 * conf.Security.LoginRememberDays, + }), + csrf.Csrfer(csrf.Options{ + Secret: conf.Security.SecretKey, + Header: "X-CSRF-Token", + Cookie: conf.Session.CSRFCookieName, + CookieDomain: conf.Server.URL.Hostname(), + CookiePath: conf.Server.Subpath, + CookieHttpOnly: true, + SetCookie: true, + Secure: conf.Server.URL.Scheme == "https", + }), + context.Contexter(context.NewStore(), webHandler), + ) + + // *************************** + // ----- HTTP Git routes ----- + // *************************** + + m.Group("/:username/:reponame", func() { + m.Get("/tasks/trigger", repo.TriggerTask) + + m.Group("/info/lfs", func() { + lfs.RegisterRoutes(m.Router) + }) + + gitHTTP := []macaron.Handler{context.ServeGoGet(), repo.HTTPContexter(repo.NewStore()), repo.HTTP} + m.Route("/info/refs", "GET,OPTIONS", gitHTTP...) + m.Route("/HEAD", "GET,OPTIONS", gitHTTP...) + m.Route("/git-upload-pack", "POST,OPTIONS", gitHTTP...) + m.Route("/git-receive-pack", "POST,OPTIONS", gitHTTP...) + m.Route("/objects/info/alternates", "GET,OPTIONS", gitHTTP...) + m.Route("/objects/info/http-alternates", "GET,OPTIONS", gitHTTP...) + m.Route("/objects/info/packs", "GET,OPTIONS", gitHTTP...) + m.Route("/objects/info/*", "GET,OPTIONS", gitHTTP...) + m.Route("/objects/:prefix([0-9a-f]{2})/:suffix([0-9a-f]{38})", "GET,OPTIONS", gitHTTP...) + m.Route("/objects/pack/pack-:sha([0-9a-f]{40}).pack", "GET,OPTIONS", gitHTTP...) + m.Route("/objects/pack/pack-:sha([0-9a-f]{40}).idx", "GET,OPTIONS", gitHTTP...) + }) + + // *************************** + // ----- Internal routes ----- + // *************************** + + m.Group("/-", func() { + m.Get("/metrics", app.MetricsFilter(), promhttp.Handler()) // "/-/metrics" + + m.Group("/api", func() { + m.Post("/sanitize_ipynb", app.SanitizeIpynb()) // "/-/api/sanitize_ipynb" + }) + }) + + // ********************** + // ----- robots.txt ----- + // ********************** + + m.Get("/robots.txt", func(w http.ResponseWriter, r *http.Request) { + if conf.HasRobotsTxt { + http.ServeFile(w, r, filepath.Join(conf.CustomDir(), "robots.txt")) + } else { + w.WriteHeader(http.StatusNotFound) + } + }) + + // Flag for port number in case first time run conflict. + if portOverride > 0 { + port := strconv.Itoa(portOverride) + conf.Server.URL.Host = strings.Replace(conf.Server.URL.Host, ":"+conf.Server.URL.Port(), ":"+port, 1) + conf.Server.ExternalURL = conf.Server.URL.String() + conf.Server.HTTPPort = portOverride + } + + var listenAddr string + if conf.Server.Protocol == "unix" { + listenAddr = conf.Server.HTTPAddr + } else { + listenAddr = fmt.Sprintf("%s:%d", conf.Server.HTTPAddr, conf.Server.HTTPPort) + } + log.Info("Available on %s", conf.Server.ExternalURL) + + switch conf.Server.Protocol { + case "http": + err = http.ListenAndServe(listenAddr, m) + + case "https": + tlsMinVersion := tls.VersionTLS12 + switch conf.Server.TLSMinVersion { + case "TLS13": + tlsMinVersion = tls.VersionTLS13 + case "TLS12": + tlsMinVersion = tls.VersionTLS12 + case "TLS11": + tlsMinVersion = tls.VersionTLS11 + case "TLS10": + tlsMinVersion = tls.VersionTLS10 + } + server := &http.Server{ + Addr: listenAddr, + TLSConfig: &tls.Config{ + MinVersion: uint16(tlsMinVersion), + CurvePreferences: []tls.CurveID{tls.X25519, tls.CurveP256, tls.CurveP384, tls.CurveP521}, + PreferServerCipherSuites: true, + CipherSuites: []uint16{ + tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, + tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, + }, + }, Handler: m, + } + err = server.ListenAndServeTLS(conf.Server.CertFile, conf.Server.KeyFile) + + case "fcgi": + err = fcgi.Serve(nil, m) + + case "unix": + if osx.Exist(listenAddr) { + err = os.Remove(listenAddr) + if err != nil { + return errors.Wrap(err, "remove existing Unix domain socket") + } + } + + var listener *net.UnixListener + listener, err = net.ListenUnix("unix", &net.UnixAddr{Name: listenAddr, Net: "unix"}) + if err != nil { + return errors.Wrap(err, "listen on Unix network") + } + + // FIXME: add proper implementation of signal capture on all protocols + // execute this on SIGTERM or SIGINT: listener.Close() + if err = os.Chmod(listenAddr, conf.Server.UnixSocketMode); err != nil { + return errors.Wrap(err, "change permission of Unix domain socket") + } + err = http.Serve(listener, m) + + default: + return errors.Newf("unexpected server protocol: %s", conf.Server.Protocol) + } + + if err != nil { + return errors.Wrap(err, "start server") + } + + return nil +} + +func newRoutingHandler() (http.Handler, error) { + f := flamego.New() + f.Use(flamego.Recovery()) + + mountWebAPIRoutes(f) + + if err := mountWebRoutes(f); err != nil { + return nil, errors.Wrap(err, "mount web routes") + } + return f, nil +} + +// newMacaron initializes Macaron instance. +func newMacaron() (*macaron.Macaron, error) { + m := macaron.New() + if !conf.Server.DisableRouterLog { + m.Use(macaron.Logger()) + } + m.Use(macaron.Recovery()) + if conf.Server.EnableGzip { + m.Use(gzip.Gziper()) + } + if conf.Server.Protocol == "fcgi" { + m.SetURLPrefix(conf.Server.Subpath) + } + + // Register custom middleware first to make it possible to override files under "public". + m.Use(macaron.Static( + filepath.Join(conf.CustomDir(), "public"), + macaron.StaticOptions{ + SkipLogging: conf.Server.DisableRouterLog, + }, + )) + var publicFs http.FileSystem + if !conf.Server.LoadAssetsFromDisk { + publicFs = http.FS(public.Files) + } + m.Use(macaron.Static( + filepath.Join(conf.WorkDir(), "public"), + macaron.StaticOptions{ + ETag: true, + SkipLogging: conf.Server.DisableRouterLog, + FileSystem: publicFs, + }, + )) + + m.Use(macaron.Static( + conf.Picture.AvatarUploadPath, + macaron.StaticOptions{ + ETag: true, + Prefix: conf.UsersAvatarPathPrefix, + SkipLogging: conf.Server.DisableRouterLog, + }, + )) + m.Use(macaron.Static( + conf.Picture.RepositoryAvatarUploadPath, + macaron.StaticOptions{ + ETag: true, + Prefix: database.RepoAvatarURLPrefix, + SkipLogging: conf.Server.DisableRouterLog, + }, + )) + + customDir := filepath.Join(conf.CustomDir(), "templates") + renderOpt := macaron.RenderOptions{ + Directory: filepath.Join(conf.WorkDir(), "templates"), + AppendDirectories: []string{customDir}, + Funcs: template.FuncMap(), + IndentJSON: macaron.Env != macaron.PROD, + } + if !conf.Server.LoadAssetsFromDisk { + renderOpt.TemplateFileSystem = templates.NewTemplateFileSystem("", customDir) + } + m.Use(macaron.Renderer(renderOpt)) + + localeNames, err := embedConf.FileNames("locale") + if err != nil { + return nil, errors.Wrap(err, "list locale files") + } + localeFiles := make(map[string][]byte) + for _, name := range localeNames { + localeFiles[name], err = embedConf.Files.ReadFile("locale/" + name) + if err != nil { + return nil, errors.Wrapf(err, "read locale file %q", name) + } + } + m.Use(i18n.I18n(i18n.Options{ + SubURL: conf.Server.Subpath, + Files: localeFiles, + CustomDirectory: filepath.Join(conf.CustomDir(), "conf", "locale"), + Langs: conf.I18n.Langs, + Names: conf.I18n.Names, + DefaultLang: "en-US", + Redirect: true, + })) + m.Use(cache.Cacher(cache.Options{ + Adapter: conf.Cache.Adapter, + AdapterConfig: conf.Cache.Host, + Interval: conf.Cache.Interval, + })) + m.Use(captcha.Captchaer(captcha.Options{ + SubURL: conf.Server.Subpath, + })) + m.Route("/healthcheck", http.MethodHead+","+http.MethodGet, healthCheck) + return m, nil +} + +// renderIndex returns the index.html shell with per-request substitutions +// applied for the given WebContext. +func renderIndex(index []byte, wc context.WebContext) ([]byte, error) { + // json.Marshal escapes <, >, and & to their \uXXXX forms by default, so + // the payload cannot break out of the surrounding " + // even if a field carries attacker-influenced text. + payload, err := json.Marshal(struct { + Lang string `json:"lang"` + SubURL string `json:"subURL"` + }{ + Lang: wc.Lang, + SubURL: wc.SubURL, + }) + if err != nil { + return nil, errors.Wrap(err, "marshal web context") + } + script := `` + + pairs := []string{ + "{{.WebContext}}", script, + } + if wc.SubURL != "" { + // Vite bakes absolute root paths into the bundle output. Prefix them + // with the subpath so they resolve correctly under non-root mounts. + pairs = append(pairs, + `src="/assets/`, `src="`+wc.SubURL+`/assets/`, + `href="/assets/`, `href="`+wc.SubURL+`/assets/`, + `src="/src/`, `src="`+wc.SubURL+`/src/`, + `href="/img/`, `href="`+wc.SubURL+`/img/`, + ) + } + return []byte(strings.NewReplacer(pairs...).Replace(string(index))), nil +} + +func healthCheck(w http.ResponseWriter, r *http.Request) { + if err := database.Ping(); err != nil { + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.WriteHeader(http.StatusServiceUnavailable) + _, _ = fmt.Fprintf(w, "* Database connection: %s\n", err) + return + } + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.WriteHeader(http.StatusOK) + if r.Method == http.MethodHead { + return + } + _, _ = w.Write([]byte("* Database connection: OK\n")) +} diff --git a/cmd/gogs/internal/web/web_dev.go b/cmd/gogs/internal/web/web_dev.go new file mode 100644 index 00000000000..635e335ec85 --- /dev/null +++ b/cmd/gogs/internal/web/web_dev.go @@ -0,0 +1,62 @@ +//go:build !prod + +package web + +import ( + "bytes" + "io" + "net/http" + "net/http/httputil" + "net/url" + "strconv" + "strings" + + "github.com/cockroachdb/errors" + "github.com/flamego/flamego" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/context" +) + +func mountWebRoutes(f *flamego.Flame) error { + viteURL, err := url.Parse("http://localhost:5173") + if err != nil { + return errors.Wrap(err, "parse Vite URL") + } + proxy := httputil.NewSingleHostReverseProxy(viteURL) + proxy.ModifyResponse = func(resp *http.Response) error { + if !strings.HasPrefix(resp.Header.Get("Content-Type"), "text/html") { + return nil + } + raw, err := io.ReadAll(resp.Body) + if err != nil { + return errors.Wrap(err, "read Vite response body") + } + _ = resp.Body.Close() + wc := context.WebContextFrom(resp.Request) + body, err := renderIndex(raw, wc) + if err != nil { + log.Error("Failed to render index: %v", err) + body = []byte("Internal Server Error\n") + resp.StatusCode = http.StatusInternalServerError + resp.Status = http.StatusText(http.StatusInternalServerError) + resp.Header.Set("Content-Type", "text/plain; charset=utf-8") + } else if wc.StatusCode > 0 { + resp.StatusCode = wc.StatusCode + resp.Status = http.StatusText(wc.StatusCode) + } + resp.Body = io.NopCloser(bytes.NewReader(body)) + resp.ContentLength = int64(len(body)) + resp.Header.Set("Content-Length", strconv.Itoa(len(body))) + // The upstream validators describe the unmodified body. Drop them + // so the browser does not satisfy a conditional request from a + // cached copy that has a stale injected lang attribute. + resp.Header.Del("ETag") + resp.Header.Del("Last-Modified") + return nil + } + f.Any("/{**}", func(w http.ResponseWriter, r *http.Request) { + proxy.ServeHTTP(w, r) + }) + return nil +} diff --git a/cmd/gogs/internal/web/web_prod.go b/cmd/gogs/internal/web/web_prod.go new file mode 100644 index 00000000000..35f711cbdd3 --- /dev/null +++ b/cmd/gogs/internal/web/web_prod.go @@ -0,0 +1,68 @@ +//go:build prod + +package web + +import ( + "io/fs" + "net/http" + + "github.com/cockroachdb/errors" + "github.com/flamego/flamego" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/public" +) + +func mountWebRoutes(f *flamego.Flame) error { + webFS, err := fs.Sub(public.WebAssets, "dist") + if err != nil { + return errors.Wrap(err, "load embedded web assets") + } + // Prefix matches the path rewrites renderIndex applies to the index + // shell. Without it the browser fetches //assets/... and the + // static handler looks them up in webFS at "/assets/...", + // which has no directory, so every asset would 404 and fall + // through to the wildcard handler as text/html. + // + // Index is set to a sentinel that does not exist in the FS so flamego.Static + // never serves the raw index.html for "/" requests. The catch-all below + // always renders the shell through renderIndex instead, ensuring template + // substitutions are applied. + f.Use(flamego.Static(flamego.StaticOptions{ + FileSystem: http.FS(webFS), + Prefix: conf.Server.Subpath, + Index: "__disabled__", + })) + + index, err := public.WebAssets.ReadFile("dist/index.html") + if err != nil { + return errors.Wrap(err, `read "dist/index.html"`) + } + + f.Get("/{**}", func(w http.ResponseWriter, r *http.Request) { + wc := context.WebContextFrom(r) + body, err := renderIndex(index, wc) + if err != nil { + log.Error("Failed to render index: %v", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + // The body is rewritten per request (lang injection, future + // runtime config), so caching it would serve stale content to + // any user whose request resolves to a different locale. Use + // no-store rather than no-cache so the browser cannot keep a + // copy at all, not even for revalidation. Static assets keep + // their normal caching via flamego.Static. + w.Header().Set("Cache-Control", "no-store") + status := wc.StatusCode + if status <= 0 { + status = http.StatusOK + } + w.WriteHeader(status) + _, _ = w.Write(body) + }) + return nil +} diff --git a/cmd/gogs/internal/web/webapi.go b/cmd/gogs/internal/web/webapi.go new file mode 100644 index 00000000000..5a1d92dbf19 --- /dev/null +++ b/cmd/gogs/internal/web/webapi.go @@ -0,0 +1,404 @@ +package web + +import ( + stdctx "context" + "encoding/json" + "net/http" + "reflect" + "strings" + + "github.com/cockroachdb/errors" + "github.com/flamego/binding" + "github.com/flamego/flamego" + "github.com/flamego/validator" + "github.com/go-macaron/cache" + "github.com/go-macaron/i18n" + "github.com/go-macaron/session" + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/urlx" + "gogs.io/gogs/internal/userx" +) + +type ( + webAPIUserKey struct{} + webAPISessionKey struct{} + webAPIMacaronKey struct{} + webAPILocaleKey struct{} + webAPICacheKey struct{} +) + +func bridgeToWebAPI(webHandler http.Handler) func(c *context.Context, l i18n.Locale, ca cache.Cache) { + return func(c *context.Context, l i18n.Locale, ca cache.Cache) { + ctx := c.Req.Context() + ctx = stdctx.WithValue(ctx, webAPIUserKey{}, c.User) + ctx = stdctx.WithValue(ctx, webAPISessionKey{}, c.Session) + ctx = stdctx.WithValue(ctx, webAPIMacaronKey{}, c.Context) + ctx = stdctx.WithValue(ctx, webAPILocaleKey{}, l) + ctx = stdctx.WithValue(ctx, webAPICacheKey{}, ca) + webHandler.ServeHTTP(c.Resp, c.Req.WithContext(ctx)) + } +} + +func webAPIInjector(c flamego.Context) { + ctx := c.Request().Context() + user, _ := ctx.Value(webAPIUserKey{}).(*database.User) + sess, _ := ctx.Value(webAPISessionKey{}).(session.Store) + mc, _ := ctx.Value(webAPIMacaronKey{}).(*macaron.Context) + l, _ := ctx.Value(webAPILocaleKey{}).(i18n.Locale) + ca, _ := ctx.Value(webAPICacheKey{}).(cache.Cache) + c.Map(user, sess, mc, l, ca) +} + +func webAPIBodyLimiter(c flamego.Context) { + r := c.Request().Request + r.Body = http.MaxBytesReader(c.ResponseWriter(), r.Body, 4*1024) // 4 KiB +} + +// webAPIValidator is the shared validator instance used by every webapi +// binding. Registering the json-tag name function makes validation errors +// carry the wire field name (e.g. "recoveryCode") via ve.Field(), so the +// 400 payload keys match what the React client sends and reads. +var webAPIValidator = func() *validator.Validate { + v := validator.New() + v.RegisterTagNameFunc(func(fld reflect.StructField) string { + name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0] + if name == "-" { + return "" + } + return name + }) + return v +}() + +// bindJSON binds the request body to T. On binding or validation failure it +// short-circuits with a 400 carrying the standard renderBindingErrors payload, +// so downstream handlers can drop the `if len(bindErrs) > 0` boilerplate and +// the binding.Errors parameter entirely. +func bindJSON(model any) flamego.Handler { + return binding.JSON(model, binding.Options{ + Validator: webAPIValidator, + ErrorHandler: func(c flamego.Context, l i18n.Locale, errs binding.Errors) { + w := c.ResponseWriter() + w.Header().Set("Cache-Control", "no-store") + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(http.StatusBadRequest) + _ = json.NewEncoder(w).Encode(renderBindingErrors(l, errs)) + }, + }) +} + +func mountWebAPIRoutes(f *flamego.Flame) { + f.ReturnHandler(func(c flamego.Context, statusCode int, resp any, err error) { + w := c.ResponseWriter() + w.Header().Set("Cache-Control", "no-store") + if err != nil { + msg := err.Error() + if statusCode >= http.StatusInternalServerError && conf.IsProdMode() { + msg = "Internal server error" + } + resp = map[string]any{"error": msg} + } + if resp == nil { + w.WriteHeader(statusCode) + return + } + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(statusCode) + _ = json.NewEncoder(w).Encode(resp) + }) + + f.Group("/api/web", func() { + f.Group("/user", func() { + f.Get("/info", getUserInfo) + f.Combo("/sign-in"). + Get(getUserSignIn). + Post(bindJSON(userSignInRequest{}), postUserSignIn) + f.Group("/mfa", func() { + f.Combo(""). + Get(getUserMFA). + Post(bindJSON(userMFARequest{}), postUserMFA) + f.Post("/recovery", bindJSON(userMFARecoveryRequest{}), postUserMFARecovery) + }) + f.Post("/sign-out", postUserSignOut) + }) + }, webAPIBodyLimiter, webAPIInjector) + + f.Get("/redirect", getRedirect) +} + +func getRedirect(c flamego.Context) { + to := c.Request().URL.Query().Get("to") + if !urlx.IsSameSite(to) { + to = conf.Server.Subpath + "/" + } + c.Redirect(to, http.StatusSeeOther) +} + +// fieldErrors maps JSON field names to per-field localized messages. A non-nil +// value renders inline under the input. A nil value marks the input as +// invalid (highlight + focus eligibility) without duplicating text. Used in +// concert with bindingErrorResponse.Error to surface one banner message while +// highlighting multiple inputs. +type fieldErrors map[string]*string + +// bindingErrorResponse carries form-validation failures. Error is the top-level +// message shown as a banner above the form (used when the failure is not tied +// to a specific input, e.g. malformed body, bad credentials). +type bindingErrorResponse struct { + Error string `json:"error,omitempty"` + Fields fieldErrors `json:"fields,omitempty"` +} + +// ruleSuffixKeys maps a validator tag to the shared "form.*_error" suffix key +// (e.g. "max" -> "form.max_size_error"). Messages are composed as +// + , mirroring the legacy Macaron binding behavior. +var ruleSuffixKeys = map[string]string{ + "required": "form.require_error", + "max": "form.max_size_error", + "min": "form.min_size_error", + "len": "form.size_error", + "email": "form.email_error", + "url": "form.url_error", +} + +// renderBindingErrors maps binding.Errors to the response shape, looking up +// localized messages via the request's locale. The per-field label comes from +// "form." (e.g. "form.UserName"); the rule suffix comes from +// ruleSuffixKeys. Rule parameters (e.g. "254" for `max=254`) are passed +// through to the suffix translation for %s expansion. Always HTTP 400. +func renderBindingErrors(l i18n.Locale, errs binding.Errors) *bindingErrorResponse { + for _, e := range errs { + if e.Category == binding.ErrorCategoryDeserialization { + return &bindingErrorResponse{Error: l.Tr("form.invalid_request") + ": " + e.Err.Error()} + } + } + + out := make(fieldErrors) + for _, e := range errs { + var ves validator.ValidationErrors + ok := errors.As(e.Err, &ves) + if !ok { + continue + } + for _, ve := range ves { + field := ve.Field() + if _, exists := out[field]; exists { + // Keep the first rule that failed for a given field so the client renders one + // message per input. Subsequent rules surface only after the first is fixed. + continue + } + label := l.Tr("form." + ve.StructField()) + suffixKey, known := ruleSuffixKeys[ve.Tag()] + var msg string + switch { + case !known: + msg = l.Tr("form.unknown_error") + " " + ve.Tag() + case ve.Param() != "": + msg = label + l.Tr(suffixKey, ve.Param()) + default: + msg = label + l.Tr(suffixKey) + } + out[field] = &msg + } + } + return &bindingErrorResponse{Fields: out} +} + +type loginSource struct { + ID int64 `json:"id"` + Name string `json:"name"` + IsDefault bool `json:"isDefault"` +} + +type userSignInPageResponse struct { + LoginSources []loginSource `json:"loginSources"` +} + +func getUserSignIn(r *http.Request) (statusCode int, resp *userSignInPageResponse, err error) { + sources, err := database.Handle.LoginSources().List(r.Context(), database.ListLoginSourceOptions{OnlyActivated: true}) + if err != nil { + log.Error("getUserSignIn: list activated login sources: %v", err) + return http.StatusInternalServerError, nil, errors.Wrap(err, "list activated login sources") + } + loginSources := make([]loginSource, 0, len(sources)) + for _, s := range sources { + loginSources = append(loginSources, loginSource{ID: s.ID, Name: s.Name, IsDefault: s.IsDefault}) + } + return http.StatusOK, &userSignInPageResponse{LoginSources: loginSources}, nil +} + +type userSignInRequest struct { + Username string `json:"username" validate:"required,max=254"` + Password string `json:"password" validate:"required,max=255"` + LoginSource int64 `json:"loginSource"` +} + +type userSignInResponse struct { + // MFA is true when the account has MFA enabled and the password step + // succeeded but a second factor is still required. The client should + // navigate to /user/mfa to complete the challenge. + MFA bool `json:"mfa,omitempty"` +} + +func postUserSignIn(r *http.Request, sess session.Store, mc *macaron.Context, l i18n.Locale, req userSignInRequest) (statusCode int, resp any, err error) { + u, err := database.Handle.Users().Authenticate(r.Context(), req.Username, req.Password, req.LoginSource) + if err != nil { + switch { + case auth.IsErrBadCredentials(err): + return http.StatusUnauthorized, &bindingErrorResponse{ + Error: l.Tr("form.username_password_incorrect"), + Fields: fieldErrors{"username": nil, "password": nil}, + }, nil + case database.IsErrLoginSourceMismatch(err): + return http.StatusUnprocessableEntity, nil, errors.New(l.Tr("form.auth_source_mismatch")) + default: + log.Error("postUserSignIn: authenticate user %q: %v", req.Username, err) + return http.StatusInternalServerError, nil, errors.Wrap(err, "authenticate user") + } + } + + if database.Handle.TwoFactors().IsEnabled(r.Context(), u.ID) { + _ = sess.Set("mfaUserID", u.ID) + return http.StatusOK, &userSignInResponse{MFA: true}, nil + } + + completeSignIn(sess, mc, u) + return http.StatusOK, &userSignInResponse{}, nil +} + +// completeSignIn finalizes the sign-in session for u: writes the auth session, +// clears any in-flight MFA state, and sets the login-status cookie. The +// caller is responsible for navigating to a post-login destination via +// /redirect?to=. +func completeSignIn(sess session.Store, mc *macaron.Context, u *database.User) { + _ = sess.Set("uid", u.ID) + _ = sess.Set("uname", u.Name) + _ = sess.Delete("mfaUserID") + + mc.SetCookie(conf.Session.CSRFCookieName, "", -1, conf.Server.Subpath) + if conf.Security.EnableLoginStatusCookie { + mc.SetCookie(conf.Security.LoginStatusCookieName, "true", 0, conf.Server.Subpath) + } +} + +func getUserMFA(sess session.Store) (statusCode int, resp any, err error) { + if _, ok := sess.Get("mfaUserID").(int64); !ok { + return http.StatusNotFound, nil, nil + } + return http.StatusNoContent, nil, nil +} + +type userMFARequest struct { + Passcode string `json:"passcode" validate:"required,len=6"` +} + +type userMFAResponse struct{} + +func postUserMFA(r *http.Request, sess session.Store, mc *macaron.Context, ca cache.Cache, l i18n.Locale, req userMFARequest) (statusCode int, resp any, err error) { + userID, ok := sess.Get("mfaUserID").(int64) + if !ok { + return http.StatusUnauthorized, &bindingErrorResponse{Error: l.Tr("auth.mfa_session_expired")}, nil + } + + t, err := database.Handle.TwoFactors().GetByUserID(r.Context(), userID) + if err != nil { + log.Error("postUserMFA: get two factor by user ID %d: %v", userID, err) + return http.StatusInternalServerError, nil, errors.Wrap(err, "get two factor by user ID") + } + + valid, err := t.ValidateTOTP(req.Passcode) + if err != nil { + log.Error("postUserMFA: validate TOTP for user %d: %v", userID, err) + return http.StatusInternalServerError, nil, errors.Wrap(err, "validate TOTP") + } + if !valid { + msg := l.Tr("auth.mfa_invalid_passcode") + return http.StatusUnauthorized, &bindingErrorResponse{ + Fields: fieldErrors{"passcode": &msg}, + }, nil + } + + if ca.IsExist(userx.TwoFactorCacheKey(userID, req.Passcode)) { + msg := l.Tr("auth.mfa_reused_passcode") + return http.StatusUnauthorized, &bindingErrorResponse{ + Fields: fieldErrors{"passcode": &msg}, + }, nil + } + if err = ca.Put(userx.TwoFactorCacheKey(userID, req.Passcode), 1, 60); err != nil { + log.Error("postUserMFA: cache two factor passcode for user %d: %v", userID, err) + } + + u, err := database.Handle.Users().GetByID(r.Context(), userID) + if err != nil { + log.Error("postUserMFA: get user by ID %d: %v", userID, err) + return http.StatusInternalServerError, nil, errors.Wrap(err, "get user by ID") + } + + completeSignIn(sess, mc, u) + return http.StatusOK, &userMFAResponse{}, nil +} + +type userMFARecoveryRequest struct { + RecoveryCode string `json:"recoveryCode" validate:"required,len=11"` +} + +func postUserMFARecovery(r *http.Request, sess session.Store, mc *macaron.Context, l i18n.Locale, req userMFARecoveryRequest) (statusCode int, resp any, err error) { + userID, ok := sess.Get("mfaUserID").(int64) + if !ok { + return http.StatusUnauthorized, &bindingErrorResponse{Error: l.Tr("auth.mfa_session_expired")}, nil + } + + if err := database.Handle.TwoFactors().UseRecoveryCode(r.Context(), userID, req.RecoveryCode); err != nil { + if database.IsTwoFactorRecoveryCodeNotFound(err) { + msg := l.Tr("auth.mfa_invalid_recovery_code") + return http.StatusUnauthorized, &bindingErrorResponse{ + Fields: fieldErrors{"recoveryCode": &msg}, + }, nil + } + log.Error("postUserMFARecovery: use recovery code for user %d: %v", userID, err) + return http.StatusInternalServerError, nil, errors.Wrap(err, "use recovery code") + } + + u, err := database.Handle.Users().GetByID(r.Context(), userID) + if err != nil { + log.Error("postUserMFARecovery: get user by ID %d: %v", userID, err) + return http.StatusInternalServerError, nil, errors.Wrap(err, "get user by ID") + } + + completeSignIn(sess, mc, u) + return http.StatusOK, &userMFAResponse{}, nil +} + +type userInfo struct { + Username string `json:"username"` + AvatarURL string `json:"avatarURL"` + IsAdmin bool `json:"isAdmin"` + CanCreateOrganization bool `json:"canCreateOrganization"` +} + +func getUserInfo(user *database.User) (statusCode int, resp *userInfo, err error) { + if user == nil { + return http.StatusNoContent, nil, nil + } + return http.StatusOK, + &userInfo{ + Username: user.Name, + AvatarURL: user.AvatarURL(), + IsAdmin: user.IsAdmin, + CanCreateOrganization: user.CanCreateOrganization(), + }, + nil +} + +func postUserSignOut(sess session.Store, mc *macaron.Context) (statusCode int, resp any, err error) { + _ = sess.Flush() + _ = sess.Destory(mc) + mc.SetCookie(conf.Session.CSRFCookieName, "", -1, conf.Server.Subpath) + return http.StatusNoContent, nil, nil +} diff --git a/cmd/gogs/main.go b/cmd/gogs/main.go new file mode 100644 index 00000000000..45d40c89cf2 --- /dev/null +++ b/cmd/gogs/main.go @@ -0,0 +1,55 @@ +// Gogs is a painless self-hosted Git Service. +package main + +import ( + "context" + "os" + "path/filepath" + + "github.com/urfave/cli/v3" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/cmd/gogs/internal/web" + "gogs.io/gogs/internal/conf" +) + +func init() { + conf.App.Version = "0.15.0+dev" +} + +var webCommand = cli.Command{ + Name: "web", + Usage: "Start the web server", + Description: "Serves the web interface, API, and HTTP Git endpoints.", + Action: func(_ context.Context, cmd *cli.Command) error { + var portOverride int + if cmd.IsSet("port") { + portOverride = cmd.Int("port") + } + return web.Run(configFromLineage(cmd), portOverride) + }, + Flags: []cli.Flag{ + intFlag("port, p", 3000, "Alternative listening port to use"), + stringFlag("config, c", filepath.Join(conf.CustomDir(), "conf", "app.ini"), "Custom configuration file path"), + }, +} + +func main() { + cmd := &cli.Command{ + Name: "Gogs", + Usage: "The painless way to host your own Git service", + Version: conf.App.Version, + Commands: []*cli.Command{ + &webCommand, + &servCommand, + &hookCommand, + &adminCommand, + &importCommand, + &backupCommand, + &restoreCommand, + }, + } + if err := cmd.Run(context.Background(), os.Args); err != nil { + log.Fatal("Failed to start application: %v", err) + } +} diff --git a/cmd/gogs/restore.go b/cmd/gogs/restore.go new file mode 100644 index 00000000000..53b9a015c1f --- /dev/null +++ b/cmd/gogs/restore.go @@ -0,0 +1,161 @@ +package main + +import ( + "context" + "os" + "path" + "path/filepath" + + "github.com/cockroachdb/errors" + "github.com/unknwon/cae/zip" + "github.com/urfave/cli/v3" + "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/semverx" +) + +var restoreCommand = cli.Command{ + Name: "restore", + Usage: "Restore files and database from backup", + Description: `Restore imports all related files and database from a backup archive. +The backup version must lower or equal to current Gogs version. You can also import +backup from other database engines, which is useful for database migrating. + +If corresponding files or database tables are not presented in the archive, they will +be skipped and remain unchanged.`, + Action: runRestore, + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + boolFlag("verbose, v", "Show process details"), + stringFlag("tempdir, t", os.TempDir(), "Temporary directory path"), + stringFlag("from", "", "Path to backup archive"), + boolFlag("database-only", "Only import database"), + boolFlag("exclude-repos", "Exclude repositories"), + }, +} + +// lastSupportedVersionOfFormat returns the last supported version of the backup archive +// format that is able to import. +var lastSupportedVersionOfFormat = map[int]string{} + +func runRestore(ctx context.Context, cmd *cli.Command) error { + zip.Verbose = cmd.Bool("verbose") + + tmpDir := cmd.String("tempdir") + if !osx.IsDir(tmpDir) { + log.Fatal("'--tempdir' does not exist: %s", tmpDir) + } + archivePath := path.Join(tmpDir, archiveRootDir) + + // Make sure there was no leftover and also clean up afterwards + err := os.RemoveAll(archivePath) + if err != nil { + log.Fatal("Failed to clean up previous leftover in %q: %v", archivePath, err) + } + defer func() { _ = os.RemoveAll(archivePath) }() + + log.Info("Restoring backup from: %s", cmd.String("from")) + err = zip.ExtractTo(cmd.String("from"), tmpDir) + if err != nil { + log.Fatal("Failed to extract backup archive: %v", err) + } + + // Check backup version + metaFile := filepath.Join(archivePath, "metadata.ini") + if !osx.IsFile(metaFile) { + log.Fatal("File 'metadata.ini' is missing") + } + metadata, err := ini.Load(metaFile) + if err != nil { + log.Fatal("Failed to load metadata '%s': %v", metaFile, err) + } + backupVersion := metadata.Section("").Key("GOGS_VERSION").MustString("999.0") + if semverx.Compare(conf.App.Version, "<", backupVersion) { + log.Fatal("Current Gogs version is lower than backup version: %s < %s", conf.App.Version, backupVersion) + } + formatVersion := metadata.Section("").Key("VERSION").MustInt() + if formatVersion == 0 { + log.Fatal("Failed to determine the backup format version from metadata '%s': %s", metaFile, "VERSION is not presented") + } + if formatVersion != currentBackupFormatVersion { + log.Fatal("Backup format version found is %d but this binary only supports %d\nThe last known version that is able to import your backup is %s", + formatVersion, currentBackupFormatVersion, lastSupportedVersionOfFormat[formatVersion]) + } + + // If config file is not present in backup, user must set this file via flag. + // Otherwise, it's optional to set config file flag. + configFile := filepath.Join(archivePath, "custom", "conf", "app.ini") + var customConf string + if lineageConf := configFromLineage(cmd); lineageConf != "" { + customConf = lineageConf + } else if !osx.IsFile(configFile) { + log.Fatal("'--config' is not specified and custom config file is not found in backup") + } else { + customConf = configFile + } + + err = conf.Init(customConf) + if err != nil { + return errors.Wrap(err, "init configuration") + } + conf.InitLogging(true) + + conn, err := database.SetEngine() + if err != nil { + return errors.Wrap(err, "set engine") + } + + // Database + dbDir := path.Join(archivePath, "db") + if err = database.ImportDatabase(ctx, conn, dbDir, cmd.Bool("verbose")); err != nil { + log.Fatal("Failed to import database: %v", err) + } + + if !cmd.Bool("database-only") { + // Custom files + if osx.IsDir(conf.CustomDir()) { + if err = os.Rename(conf.CustomDir(), conf.CustomDir()+".bak"); err != nil { + log.Fatal("Failed to backup current 'custom': %v", err) + } + } + if err = os.Rename(filepath.Join(archivePath, "custom"), conf.CustomDir()); err != nil { + log.Fatal("Failed to import 'custom': %v", err) + } + + // Data files + _ = os.MkdirAll(conf.Server.AppDataPath, os.ModePerm) + for _, dir := range []string{"attachments", "avatars", "repo-avatars"} { + // Skip if backup archive does not have corresponding data + srcPath := filepath.Join(archivePath, "data", dir) + if !osx.IsDir(srcPath) { + continue + } + + dirPath := filepath.Join(conf.Server.AppDataPath, dir) + if osx.IsDir(dirPath) { + if err = os.Rename(dirPath, dirPath+".bak"); err != nil { + log.Fatal("Failed to backup current 'data': %v", err) + } + } + if err = os.Rename(srcPath, dirPath); err != nil { + log.Fatal("Failed to import 'data': %v", err) + } + } + } + + // Repositories + reposPath := filepath.Join(archivePath, "repositories.zip") + if !cmd.Bool("exclude-repos") && !cmd.Bool("database-only") && osx.IsFile(reposPath) { + if err := zip.ExtractTo(reposPath, filepath.Dir(conf.Repository.Root)); err != nil { + log.Fatal("Failed to extract 'repositories.zip': %v", err) + } + } + + log.Info("Restore succeed!") + log.Stop() + return nil +} diff --git a/cmd/gogs/serv.go b/cmd/gogs/serv.go new file mode 100644 index 00000000000..f81ce772f9a --- /dev/null +++ b/cmd/gogs/serv.go @@ -0,0 +1,274 @@ +package main + +import ( + "context" + "fmt" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/urfave/cli/v3" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" +) + +const ( + accessDeniedMessage = "Repository does not exist or you do not have access" +) + +var servCommand = cli.Command{ + Name: "serv", + Usage: "This command should only be called by SSH shell", + Description: `Serv provide access auth for repositories`, + Action: runServ, + Flags: []cli.Flag{ + stringFlag("config, c", "", "Custom configuration file path"), + }, +} + +// fail prints user message to the Git client (i.e. os.Stderr) and +// logs error message on the server side. When not in "prod" mode, +// error message is also printed to the client for easier debugging. +func fail(userMessage, errMessage string, args ...any) { + _, _ = fmt.Fprintln(os.Stderr, "Gogs:", userMessage) + + if len(errMessage) > 0 { + if !conf.IsProdMode() { + fmt.Fprintf(os.Stderr, errMessage+"\n", args...) + } + log.Error(errMessage, args...) + } + + log.Stop() + os.Exit(1) +} + +func setup(cmd *cli.Command, logFile string, connectDB bool) { + conf.HookMode = true + + customConf := configFromLineage(cmd) + + err := conf.Init(customConf) + if err != nil { + fail("Internal error", "Failed to init configuration: %v", err) + } + conf.InitLogging(true) + + level := log.LevelTrace + if conf.IsProdMode() { + level = log.LevelError + } + + err = log.NewFile(log.FileConfig{ + Level: level, + Filename: filepath.Join(conf.Log.RootPath, "hooks", logFile), + FileRotationConfig: log.FileRotationConfig{ + Rotate: true, + Daily: true, + MaxDays: 3, + }, + }) + if err != nil { + fail("Internal error", "Failed to init file logger: %v", err) + } + log.Remove(log.DefaultConsoleName) // Remove the primary logger + + if !connectDB { + return + } + + if conf.UseSQLite3 { + _ = os.Chdir(conf.WorkDir()) + } + + if _, err := database.SetEngine(); err != nil { + fail("Internal error", "Failed to set database engine: %v", err) + } +} + +func parseSSHCmd(cmd string) (string, string) { + ss := strings.SplitN(cmd, " ", 2) + if len(ss) != 2 { + return "", "" + } + return ss[0], strings.Replace(ss[1], "'/", "'", 1) +} + +func checkDeployKey(key *database.PublicKey, repo *database.Repository) { + // Check if this deploy key belongs to current repository. + if !database.HasDeployKey(key.ID, repo.ID) { + fail("Key access denied", "Deploy key access denied: [key_id: %d, repo_id: %d]", key.ID, repo.ID) + } + + // Update deploy key activity. + deployKey, err := database.GetDeployKeyByRepo(key.ID, repo.ID) + if err != nil { + fail("Internal error", "GetDeployKey: %v", err) + } + + deployKey.Updated = time.Now() + if err = database.UpdateDeployKey(deployKey); err != nil { + fail("Internal error", "UpdateDeployKey: %v", err) + } +} + +var allowedCommands = map[string]database.AccessMode{ + "git-upload-pack": database.AccessModeRead, + "git-upload-archive": database.AccessModeRead, + "git-receive-pack": database.AccessModeWrite, +} + +func runServ(ctx context.Context, cmd *cli.Command) error { + setup(cmd, "serv.log", true) + + if conf.SSH.Disabled { + println("Gogs: SSH has been disabled") + return nil + } + + if cmd.Args().Len() < 1 { + fail("Not enough arguments", "Not enough arguments") + } + + sshCmd := os.Getenv("SSH_ORIGINAL_COMMAND") + if sshCmd == "" { + println("Hi there, You've successfully authenticated, but Gogs does not provide shell access.") + println("If this is unexpected, please log in with password and setup Gogs under another user.") + return nil + } + + verb, args := parseSSHCmd(sshCmd) + repoFullName := strings.ToLower(strings.Trim(args, "'")) + repoFields := strings.SplitN(repoFullName, "/", 2) + if len(repoFields) != 2 { + fail("Invalid repository path", "Invalid repository path: %v", args) + } + ownerName := strings.ToLower(repoFields[0]) + repoName := strings.TrimSuffix(strings.ToLower(repoFields[1]), ".git") + repoName = strings.TrimSuffix(repoName, ".wiki") + + owner, err := database.Handle.Users().GetByUsername(ctx, ownerName) + if err != nil { + if database.IsErrUserNotExist(err) { + fail("Repository owner does not exist", "Unregistered owner: %s", ownerName) + } + fail("Internal error", "Failed to get repository owner '%s': %v", ownerName, err) + } + + repo, err := database.GetRepositoryByName(owner.ID, repoName) + if err != nil { + if database.IsErrRepoNotExist(err) { + fail(accessDeniedMessage, "Repository does not exist: %s/%s", owner.Name, repoName) + } + fail("Internal error", "Failed to get repository: %v", err) + } + repo.Owner = owner + + requestMode, ok := allowedCommands[verb] + if !ok { + fail("Unknown git command", "Unknown git command '%s'", verb) + } + + // Prohibit push to mirror repositories. + if requestMode > database.AccessModeRead && repo.IsMirror { + fail("Mirror repository is read-only", "") + } + + // Allow anonymous (user is nil) clone for public repositories. + var user *database.User + + keyID, _ := strconv.ParseInt(strings.TrimPrefix(cmd.Args().Get(0), "key-"), 10, 64) + key, err := database.GetPublicKeyByID(keyID) + if err != nil { + fail("Invalid key ID", "Invalid key ID '%s': %v", cmd.Args().Get(0), err) + } + + if requestMode == database.AccessModeWrite || repo.IsPrivate { + // Check deploy key or user key. + if key.IsDeployKey() { + if key.Mode < requestMode { + fail("Key permission denied", "Cannot push with deployment key: %d", key.ID) + } + checkDeployKey(key, repo) + } else { + user, err = database.Handle.Users().GetByKeyID(ctx, key.ID) + if err != nil { + fail("Internal error", "Failed to get user by key ID '%d': %v", key.ID, err) + } + + mode := database.Handle.Permissions().AccessMode(ctx, user.ID, repo.ID, + database.AccessModeOptions{ + OwnerID: repo.OwnerID, + Private: repo.IsPrivate, + }, + ) + if mode < requestMode { + clientMessage := accessDeniedMessage + if mode >= database.AccessModeRead { + clientMessage = "You do not have sufficient authorization for this action" + } + fail(clientMessage, + "User '%s' does not have level '%v' access to repository '%s'", + user.Name, requestMode, repoFullName) + } + } + } else { + // Check if the key can access to the repository in case of it is a deploy key (a deploy keys != user key). + // A deploy key doesn't represent a signed in user, so in a site with Auth.RequireSignInView enabled, + // we should give read access only in repositories where this deploy key is in use. In other cases, + // a server or system using an active deploy key can get read access to all repositories on a Gogs instance. + if key.IsDeployKey() && conf.Auth.RequireSigninView { + checkDeployKey(key, repo) + } + } + + // Update user key activity. + if key.ID > 0 { + key, err := database.GetPublicKeyByID(key.ID) + if err != nil { + fail("Internal error", "GetPublicKeyByID: %v", err) + } + + key.Updated = time.Now() + if err = database.UpdatePublicKey(key); err != nil { + fail("Internal error", "UpdatePublicKey: %v", err) + } + } + + // Special handle for Windows. + if conf.IsWindowsRuntime() { + verb = strings.Replace(verb, "-", " ", 1) + } + + var gitCmd *exec.Cmd + verbs := strings.Split(verb, " ") + if len(verbs) == 2 { + gitCmd = exec.Command(verbs[0], verbs[1], repoFullName) + } else { + gitCmd = exec.Command(verb, repoFullName) + } + if requestMode == database.AccessModeWrite { + gitCmd.Env = append(os.Environ(), database.ComposeHookEnvs(database.ComposeHookEnvsOptions{ + AuthUser: user, + OwnerName: owner.Name, + OwnerSalt: owner.Salt, + RepoID: repo.ID, + RepoName: repo.Name, + RepoPath: repo.RepoPath(), + })...) + } + gitCmd.Dir = conf.Repository.Root + gitCmd.Stdout = os.Stdout + gitCmd.Stdin = os.Stdin + gitCmd.Stderr = os.Stderr + if err = gitCmd.Run(); err != nil { + fail("Internal error", "Failed to execute git command: %v", err) + } + + return nil +} diff --git a/cmd/serve.go b/cmd/serve.go deleted file mode 100644 index 53d33b2edd5..00000000000 --- a/cmd/serve.go +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright 2014 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 cmd - -import ( - "crypto/tls" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - "time" - - "github.com/Unknwon/com" - git "github.com/gogits/git-module" - gouuid "github.com/satori/go.uuid" - "github.com/urfave/cli" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/httplib" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -const ( - _ACCESS_DENIED_MESSAGE = "Repository does not exist or you do not have access" -) - -var CmdServ = cli.Command{ - Name: "serv", - Usage: "This command should only be called by SSH shell", - Description: `Serv provide access auth for repositories`, - Action: runServ, - Flags: []cli.Flag{ - stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), - }, -} - -func setup(logPath string) { - setting.NewContext() - log.NewGitLogger(filepath.Join(setting.LogRootPath, logPath)) - - models.LoadConfigs() - - if setting.UseSQLite3 || setting.UseTiDB { - workDir, _ := setting.WorkDir() - os.Chdir(workDir) - } - - models.SetEngine() -} - -func parseCmd(cmd string) (string, string) { - ss := strings.SplitN(cmd, " ", 2) - if len(ss) != 2 { - return "", "" - } - return ss[0], strings.Replace(ss[1], "'/", "'", 1) -} - -var ( - allowedCommands = map[string]models.AccessMode{ - "git-upload-pack": models.ACCESS_MODE_READ, - "git-upload-archive": models.ACCESS_MODE_READ, - "git-receive-pack": models.ACCESS_MODE_WRITE, - } -) - -func fail(userMessage, logMessage string, args ...interface{}) { - fmt.Fprintln(os.Stderr, "Gogs:", userMessage) - - if len(logMessage) > 0 { - if !setting.ProdMode { - fmt.Fprintf(os.Stderr, logMessage+"\n", args...) - } - log.GitLogger.Fatal(3, logMessage, args...) - return - } - - log.GitLogger.Close() - os.Exit(1) -} - -func handleUpdateTask(uuid string, user, repoUser *models.User, reponame string, isWiki bool) { - task, err := models.GetUpdateTaskByUUID(uuid) - if err != nil { - if models.IsErrUpdateTaskNotExist(err) { - log.GitLogger.Trace("No update task is presented: %s", uuid) - return - } - log.GitLogger.Fatal(2, "GetUpdateTaskByUUID: %v", err) - } else if err = models.DeleteUpdateTaskByUUID(uuid); err != nil { - log.GitLogger.Fatal(2, "DeleteUpdateTaskByUUID: %v", err) - } - - if isWiki { - return - } - - if err = models.PushUpdate(models.PushUpdateOptions{ - RefFullName: task.RefName, - OldCommitID: task.OldCommitID, - NewCommitID: task.NewCommitID, - PusherID: user.ID, - PusherName: user.Name, - RepoUserName: repoUser.Name, - RepoName: reponame, - }); err != nil { - log.GitLogger.Error(2, "Update: %v", err) - } - - // Ask for running deliver hook and test pull request tasks. - reqURL := setting.LocalURL + repoUser.Name + "/" + reponame + "/tasks/trigger?branch=" + - strings.TrimPrefix(task.RefName, git.BRANCH_PREFIX) + "&secret=" + base.EncodeMD5(repoUser.Salt) + "&pusher=" + com.ToStr(user.ID) - 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, "Fail to trigger task: not 2xx response code") - } - } else { - log.GitLogger.Error(2, "Fail to trigger task: %v", err) - } -} - -func runServ(c *cli.Context) error { - if c.IsSet("config") { - setting.CustomConf = c.String("config") - } - - setup("serv.log") - - if setting.SSH.Disabled { - println("Gogs: SSH has been disabled") - return nil - } - - if len(c.Args()) < 1 { - fail("Not enough arguments", "Not enough arguments") - } - - cmd := os.Getenv("SSH_ORIGINAL_COMMAND") - if len(cmd) == 0 { - println("Hi there, You've successfully authenticated, but Gogs does not provide shell access.") - println("If this is unexpected, please log in with password and setup Gogs under another user.") - return nil - } - - verb, args := parseCmd(cmd) - repoPath := strings.ToLower(strings.Trim(args, "'")) - rr := strings.SplitN(repoPath, "/", 2) - if len(rr) != 2 { - fail("Invalid repository path", "Invalid repository path: %v", args) - } - username := strings.ToLower(rr[0]) - reponame := strings.ToLower(strings.TrimSuffix(rr[1], ".git")) - - isWiki := false - if strings.HasSuffix(reponame, ".wiki") { - isWiki = true - reponame = reponame[:len(reponame)-5] - } - - repoUser, err := models.GetUserByName(username) - if err != nil { - if models.IsErrUserNotExist(err) { - fail("Repository owner does not exist", "Unregistered owner: %s", username) - } - fail("Internal error", "Failed to get repository owner (%s): %v", username, err) - } - - repo, err := models.GetRepositoryByName(repoUser.ID, reponame) - if err != nil { - if models.IsErrRepoNotExist(err) { - fail(_ACCESS_DENIED_MESSAGE, "Repository does not exist: %s/%s", repoUser.Name, reponame) - } - fail("Internal error", "Failed to get repository: %v", err) - } - - requestedMode, has := allowedCommands[verb] - if !has { - fail("Unknown git command", "Unknown git command %s", verb) - } - - // Prohibit push to mirror repositories. - if requestedMode > models.ACCESS_MODE_READ && repo.IsMirror { - fail("mirror repository is read-only", "") - } - - // Allow anonymous clone for public repositories. - var ( - keyID int64 - user *models.User - ) - if requestedMode == models.ACCESS_MODE_WRITE || repo.IsPrivate { - keys := strings.Split(c.Args()[0], "-") - if len(keys) != 2 { - fail("Key ID format error", "Invalid key argument: %s", c.Args()[0]) - } - - key, err := models.GetPublicKeyByID(com.StrTo(keys[1]).MustInt64()) - if err != nil { - fail("Invalid key ID", "Invalid key ID[%s]: %v", c.Args()[0], err) - } - keyID = key.ID - - // Check deploy key or user key. - if key.Type == models.KEY_TYPE_DEPLOY { - if key.Mode < requestedMode { - fail("Key permission denied", "Cannot push with deployment key: %d", key.ID) - } - // Check if this deploy key belongs to current repository. - if !models.HasDeployKey(key.ID, repo.ID) { - fail("Key access denied", "Deploy key access denied: [key_id: %d, repo_id: %d]", key.ID, repo.ID) - } - - // Update deploy key activity. - deployKey, err := models.GetDeployKeyByRepo(key.ID, repo.ID) - if err != nil { - fail("Internal error", "GetDeployKey: %v", err) - } - - deployKey.Updated = time.Now() - if err = models.UpdateDeployKey(deployKey); err != nil { - fail("Internal error", "UpdateDeployKey: %v", err) - } - } else { - user, err = models.GetUserByKeyID(key.ID) - if err != nil { - fail("internal error", "Failed to get user by key ID(%d): %v", keyID, err) - } - - mode, err := models.AccessLevel(user, repo) - if err != nil { - fail("Internal error", "Fail to check access: %v", err) - } else if mode < requestedMode { - clientMessage := _ACCESS_DENIED_MESSAGE - if mode >= models.ACCESS_MODE_READ { - clientMessage = "You do not have sufficient authorization for this action" - } - fail(clientMessage, - "User %s does not have level %v access to repository %s", - user.Name, requestedMode, repoPath) - } - } - } - - uuid := gouuid.NewV4().String() - os.Setenv("uuid", uuid) - - // Special handle for Windows. - if setting.IsWindows { - verb = strings.Replace(verb, "-", " ", 1) - } - - var gitcmd *exec.Cmd - verbs := strings.Split(verb, " ") - if len(verbs) == 2 { - gitcmd = exec.Command(verbs[0], verbs[1], repoPath) - } else { - gitcmd = exec.Command(verb, repoPath) - } - gitcmd.Dir = setting.RepoRootPath - gitcmd.Stdout = os.Stdout - gitcmd.Stdin = os.Stdin - gitcmd.Stderr = os.Stderr - if err = gitcmd.Run(); err != nil { - fail("Internal error", "Failed to execute git command: %v", err) - } - - if requestedMode == models.ACCESS_MODE_WRITE { - handleUpdateTask(uuid, user, repoUser, reponame, isWiki) - } - - // 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 { - fail("Internal error", "UpdatePublicKey: %v", err) - } - } - - return nil -} diff --git a/cmd/update.go b/cmd/update.go deleted file mode 100644 index bebc1016093..00000000000 --- a/cmd/update.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2014 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 cmd - -import ( - "os" - - "github.com/urfave/cli" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -var CmdUpdate = cli.Command{ - Name: "update", - Usage: "This command should only be called by Git hook", - Description: `Update get pushed info and insert into database`, - Action: runUpdate, - Flags: []cli.Flag{ - stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), - }, -} - -func runUpdate(c *cli.Context) error { - if c.IsSet("config") { - setting.CustomConf = c.String("config") - } - - setup("update.log") - - if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { - log.GitLogger.Trace("SSH_ORIGINAL_COMMAND is empty") - return nil - } - - args := c.Args() - if len(args) != 3 { - log.GitLogger.Fatal(2, "Arguments received are not equal to three") - } else if len(args[0]) == 0 { - log.GitLogger.Fatal(2, "First argument 'refName' is empty, shouldn't use") - } - - task := models.UpdateTask{ - UUID: os.Getenv("uuid"), - RefName: args[0], - OldCommitID: args[1], - NewCommitID: args[2], - } - - if err := models.AddUpdateTask(&task); err != nil { - log.GitLogger.Fatal(2, "AddUpdateTask: %v", err) - } - - return nil -} diff --git a/cmd/web.go b/cmd/web.go deleted file mode 100644 index 97f6a0f15c7..00000000000 --- a/cmd/web.go +++ /dev/null @@ -1,676 +0,0 @@ -// Copyright 2014 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 cmd - -import ( - "crypto/tls" - "fmt" - "io/ioutil" - "net" - "net/http" - "net/http/fcgi" - "os" - "path" - "strings" - - "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" - "github.com/go-xorm/xorm" - "github.com/mcuadros/go-version" - "github.com/urfave/cli" - "gopkg.in/ini.v1" - "gopkg.in/macaron.v1" - - "github.com/gogits/git-module" - "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/auth" - "github.com/gogits/gogs/modules/bindata" - "github.com/gogits/gogs/modules/context" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" - "github.com/gogits/gogs/modules/template" - "github.com/gogits/gogs/routers" - "github.com/gogits/gogs/routers/admin" - apiv1 "github.com/gogits/gogs/routers/api/v1" - "github.com/gogits/gogs/routers/dev" - "github.com/gogits/gogs/routers/org" - "github.com/gogits/gogs/routers/repo" - "github.com/gogits/gogs/routers/user" -) - -var CmdWeb = cli.Command{ - Name: "web", - Usage: "Start Gogs web server", - Description: `Gogs web server is the only thing you need to run, -and it takes care of all the other things for you`, - Action: runWeb, - Flags: []cli.Flag{ - stringFlag("port, p", "3000", "Temporary port number to prevent conflict"), - stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"), - }, -} - -type VerChecker struct { - ImportPath string - Version func() string - Expected string -} - -// checkVersion checks if binary matches the version of templates files. -func checkVersion() { - // Templates. - data, err := ioutil.ReadFile(setting.StaticRootPath + "/templates/.VERSION") - if err != nil { - log.Fatal(4, "Fail to read 'templates/.VERSION': %v", err) - } - tplVer := string(data) - if tplVer != setting.AppVer { - if version.Compare(tplVer, setting.AppVer, ">") { - log.Fatal(4, "Binary version is lower than template file version, did you forget to recompile Gogs?") - } else { - log.Fatal(4, "Binary version is higher than template file version, did you forget to update template files?") - } - } - - // Check dependency version. - checkers := []VerChecker{ - {"github.com/go-xorm/xorm", func() string { return xorm.Version }, "0.5.5"}, - {"github.com/go-macaron/binding", binding.Version, "0.3.2"}, - {"github.com/go-macaron/cache", cache.Version, "0.1.2"}, - {"github.com/go-macaron/csrf", csrf.Version, "0.1.0"}, - {"github.com/go-macaron/i18n", i18n.Version, "0.3.0"}, - {"github.com/go-macaron/session", session.Version, "0.1.6"}, - {"github.com/go-macaron/toolbox", toolbox.Version, "0.1.0"}, - {"gopkg.in/ini.v1", ini.Version, "1.8.4"}, - {"gopkg.in/macaron.v1", macaron.Version, "1.1.7"}, - {"github.com/gogits/git-module", git.Version, "0.4.1"}, - {"github.com/gogits/go-gogs-client", gogs.Version, "0.12.1"}, - } - for _, c := range checkers { - if !version.Compare(c.Version(), c.Expected, ">=") { - log.Fatal(4, `Dependency outdated! -Package '%s' current version (%s) is below requirement (%s), -please use following command to update this package and recompile Gogs: -go get -u %[1]s`, c.ImportPath, c.Version(), c.Expected) - } - } -} - -// 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(macaron.Static( - path.Join(setting.StaticRootPath, "public"), - macaron.StaticOptions{ - SkipLogging: setting.DisableRouterLog, - }, - )) - m.Use(macaron.Static( - setting.AvatarUploadPath, - macaron.StaticOptions{ - Prefix: "avatars", - SkipLogging: setting.DisableRouterLog, - }, - )) - - funcMap := template.NewFuncMap() - m.Use(macaron.Renderer(macaron.RenderOptions{ - Directory: path.Join(setting.StaticRootPath, "templates"), - AppendDirectories: []string{path.Join(setting.CustomPath, "templates")}, - Funcs: funcMap, - IndentJSON: macaron.Env != macaron.PROD, - })) - models.InitMailRender(path.Join(setting.StaticRootPath, "templates/mail"), - path.Join(setting.CustomPath, "templates/mail"), funcMap) - - localeNames, err := bindata.AssetDir("conf/locale") - if err != nil { - log.Fatal(4, "Fail to list locale files: %v", err) - } - localFiles := make(map[string][]byte) - for _, name := range localeNames { - localFiles[name] = bindata.MustAsset("conf/locale/" + name) - } - m.Use(i18n.I18n(i18n.Options{ - SubURL: setting.AppSubUrl, - Files: localFiles, - CustomDirectory: path.Join(setting.CustomPath, "conf/locale"), - 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{ - &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") - } - routers.GlobalInit() - checkVersion() - - 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 - - // 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) - }, 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) - }, 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.AdminCrateUserForm{}), 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("/stars", user.Stars) - }) - - 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() - - ctx.Header().Set("Cache-Control", "public,max-age=86400") - ctx.Header().Set("Content-Disposition", fmt.Sprintf(`inline; filename="%s"`, attach.Name)) - // Fix #312. Attachments with , in their name are not handled correctly by Google Chrome. - // We must put the name in " manually. - if err = repo.ServeData(ctx, "\""+attach.Name+"\"", fr); err != nil { - ctx.Handle(500, "ServeData", err) - return - } - }) - m.Post("/issues/attachments", repo.UploadIssueAttachment) - }, 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.Get("/create", org.Create) - m.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.CreatePost) - - 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("/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 - }) - }, 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).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) - - 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.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.Get("/archive/*", repo.Download) - - m.Group("/pulls/:index", func() { - m.Get("/commits", context.RepoRef(), repo.ViewPullCommits) - m.Get("/files", context.RepoRef(), repo.ViewPullFiles) - m.Post("/merge", reqRepoWriter, repo.MergePullRequest) - }, repo.MustAllowPulls) - - m.Group("", func() { - m.Get("/src/*", repo.Home) - m.Get("/raw/*", repo.SingleDownload) - m.Get("/commits/*", repo.RefCommits) - m.Get("/commit/:sha([a-z0-9]{7,40})$", repo.Diff) - m.Get("/forks", repo.Forks) - }, context.RepoRef()) - m.Get("/commit/:sha([a-z0-9]{7,40})\\.:ext(patch|diff)", repo.RawDiff) - - m.Get("/compare/:before([a-z0-9]{7,40})\\.\\.\\.:after([a-z0-9]{7,40})", repo.CompareDiff) - }, ignSignIn, context.RepoAssignment(), repo.MustBeNotBare) - m.Group("/:username/:reponame", func() { - m.Get("/stars", repo.Stars) - m.Get("/watchers", repo.Watchers) - }, ignSignIn, context.RepoAssignment(), context.RepoRef()) - - m.Group("/:username", func() { - m.Group("/:reponame", func() { - m.Get("", repo.Home) - m.Get("\\.git$", repo.Home) - }, ignSignIn, context.RepoAssignment(true), context.RepoRef()) - - m.Group("/:reponame", func() { - m.Any("/*", ignSignInAndCsrf, repo.HTTP) - m.Head("/tasks/trigger", repo.TriggerTask) - }) - }) - // ***** END: Repository ***** - - 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) - - // Flag for port number in case first time run conflict. - if ctx.IsSet("port") { - setting.AppUrl = strings.Replace(setting.AppUrl, setting.HTTPPort, ctx.String("port"), 1) - setting.HTTPPort = ctx.String("port") - } - - var listenAddr string - if setting.Protocol == setting.UNIX_SOCKET { - listenAddr = fmt.Sprintf("%s", setting.HTTPAddr) - } else { - listenAddr = fmt.Sprintf("%s:%s", setting.HTTPAddr, setting.HTTPPort) - } - log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubUrl) - - var err error - switch setting.Protocol { - case setting.HTTP: - err = http.ListenAndServe(listenAddr, m) - case setting.HTTPS: - server := &http.Server{Addr: listenAddr, TLSConfig: &tls.Config{MinVersion: tls.VersionTLS10}, Handler: m} - err = server.ListenAndServeTLS(setting.CertFile, setting.KeyFile) - case setting.FCGI: - err = fcgi.Serve(nil, m) - case setting.UNIX_SOCKET: - os.Remove(listenAddr) - - var listener *net.UnixListener - listener, err = net.ListenUnix("unix", &net.UnixAddr{listenAddr, "unix"}) - if err != nil { - break // Handle error after switch - } - - // FIXME: add proper implementation of signal capture on all protocols - // execute this on SIGTERM or SIGINT: listener.Close() - if err = os.Chmod(listenAddr, os.FileMode(setting.UnixSocketPermission)); err != nil { - log.Fatal(4, "Failed to set permission of unix socket: %v", err) - } - err = http.Serve(listener, m) - default: - log.Fatal(4, "Invalid protocol: %s", setting.Protocol) - } - - if err != nil { - log.Fatal(4, "Fail to start server: %v", err) - } - - return nil -} diff --git a/conf/README.md b/conf/README.md deleted file mode 100644 index ee197505aa0..00000000000 --- a/conf/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Execute following command in ROOT directory when anything is changed: - -$ make bindata \ No newline at end of file diff --git a/conf/app.ini b/conf/app.ini index c907bc5c0c4..303d3571ce2 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -1,122 +1,27 @@ -# NEVER EVER MODIFY THIS FILE -# PLEASE MAKE CHANGES ON CORRESPONDING CUSTOM CONFIG FILE - -; App name that shows on every page title -APP_NAME = Gogs: Go Git Service -; Change it if you run locally +# !!! NEVER EVER MODIFY THIS FILE !!! +# !!! PLEASE MAKE CHANGES ON CORRESPONDING CUSTOM CONFIG FILE !!! +# !!! IF YOU ARE PACKAGING PROVIDER, PLEASE MAKE OWN COPY OF IT !!! + +; The brand name of the application, can be your company or team name. +BRAND_NAME = Gogs +; The system user who should be running the applications. It has no effect on Windows, +; otherwise, it should match the value of $USER environment variable. RUN_USER = git -; Either "dev", "prod" or "test", default is "dev" +; The running mode of the application, can be either "dev", "prod" or "test". RUN_MODE = dev -[repository] -ROOT = -SCRIPT_TYPE = bash -; Default ANSI charset -ANSI_CHARSET = -; Force every new repository to be private -FORCE_PRIVATE = false -; Global maximum creation limit of repository per user, -1 means no limit -MAX_CREATION_LIMIT = -1 -; Mirror sync queue length, increase if mirror syncing starts hanging -MIRROR_QUEUE_LENGTH = 1000 -; Patch test queue length, increase if pull request patch testing starts hanging -PULL_REQUEST_QUEUE_LENGTH = 1000 -; Preferred Licenses to place at the top of the List -; Name must match file name in conf/license or custom/conf/license -PREFERRED_LICENSES = Apache License 2.0,MIT License - -[repository.editor] -; List of file extensions that should have line wraps in the CodeMirror editor -; Separate extensions with a comma. To line wrap files w/o extension, just put a comma -LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd, -; Valid file modes that have a preview API associated with them, such as api/v1/markdown -; Separate values by commas. Preview tab in edit mode won't show if the file extension doesn't match -PREVIEWABLE_FILE_MODES = markdown - -[repository.upload] -; Whether repository file uploads are enabled. Defaults to `true` -ENABLED = true -; Path for uploads. Defaults to `data/tmp/uploads` (tmp gets deleted on gogs restart) -TEMP_PATH = data/tmp/uploads -; One or more allowed types, e.g. image/jpeg|image/png. Nothing means any file type -ALLOWED_TYPES = -; Max size of each file in MB. Defaults to 3MB -FILE_MAX_SIZE = 3 -; Max number of files per upload. Defaults to 5 -MAX_FILES = 5 - -[ui] -; Number of repositories that are showed in one explore page -EXPLORE_PAGING_NUM = 20 -; Number of issues that are showed in one page -ISSUE_PAGING_NUM = 10 -; Number of maximum commits showed in one activity feed -FEED_MAX_COMMIT_NUM = 5 -; Value of `theme-color` meta tag, used by Android >= 5.0 -; An invalid color like "none" or "disable" will have the default style -; More info: https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android -THEME_COLOR_META_TAG = `#ff5343` -; Max size of files to be displayed (defaults is 8MiB) -MAX_DISPLAY_FILE_SIZE = 8388608 - -[ui.admin] -; Number of users that are showed in one page -USER_PAGING_NUM = 50 -; Number of repos that are showed in one page -REPO_PAGING_NUM = 50 -; Number of notices that are showed in one page -NOTICE_PAGING_NUM = 25 -; Number of organization that are showed in one page -ORG_PAGING_NUM = 50 - -[ui.user] -; Number of repos that are showed in one page -REPO_PAGING_NUM = 15 - -[markdown] -; Enable hard line break extension -ENABLE_HARD_LINE_BREAK = false -; List of custom URL-Schemes that are allowed as links when rendering Markdown -; for example git,magnet -CUSTOM_URL_SCHEMES = -; List of file extensions that should be rendered/edited as Markdown -; Separate extensions with a comma. To render files w/o extension as markdown, just put a comma -FILE_EXTENSIONS = .md,.markdown,.mdown,.mkd - [server] -PROTOCOL = http +; The public-facing URL for the application. +EXTERNAL_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ +; The public-facing domain name for the application. DOMAIN = localhost -ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ +; The protocol that is used to serve direct traffic to the application. +; Currently supports "http", "https", "fcgi" and "unix". +PROTOCOL = http +; The address to be listened by the application. HTTP_ADDR = 0.0.0.0 +; The port number to be listened by the application. HTTP_PORT = 3000 -; Permission for unix socket -UNIX_SOCKET_PERMISSION = 666 -; Local (DMZ) URL for Gogs workers (such as SSH update) accessing web service. -; In most cases you do not need to change the default value. -; Alter it only if your SSH server node is not the same as HTTP node. -LOCAL_ROOT_URL = %(PROTOCOL)s://%(HTTP_ADDR)s:%(HTTP_PORT)s/ -; Disable SSH feature when not available -DISABLE_SSH = false -; Whether use builtin SSH server or not. -START_SSH_SERVER = false -; Domain name to be exposed in clone URL -SSH_DOMAIN = %(DOMAIN)s -; Port number to be exposed in clone URL -SSH_PORT = 22 -; Port number builtin SSH server listens on -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, -; 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 -; Indicate whether to check minimum key size with corresponding type -MINIMUM_KEY_SIZE_CHECK = false -; Disable CDN even in "prod" mode -OFFLINE_MODE = false -DISABLE_ROUTER_LOG = false ; Generate steps: ; $ ./gogs cert -ca=true -duration=8760h0m0s -host=myhost.example.com ; @@ -126,224 +31,395 @@ DISABLE_ROUTER_LOG = false ; $ openssl pkcs12 -in cert.pfx -out key.pem -nocerts -nodes CERT_FILE = custom/https/cert.pem KEY_FILE = custom/https/key.pem -; Upper level of template and static file path -; default is the path where Gogs is executed -STATIC_ROOT_PATH = -; Default path for App data -APP_DATA_PATH = data -; Application level GZIP support +; The minimum allowed TLS version, currently supports "TLS10", "TLS11", "TLS12", and "TLS13". +TLS_MIN_VERSION = TLS12 +; File permission when serve traffic via Unix domain socket. +UNIX_SOCKET_PERMISSION = 666 +; Local (DMZ) URL for workers (e.g. SSH update) accessing web service. +; In most cases you do not need to change the default value. +; Alter it only if your SSH server node is not the same as HTTP node. +LOCAL_ROOT_URL = %(PROTOCOL)s://%(HTTP_ADDR)s:%(HTTP_PORT)s/ + +; Whether to disable using CDN for static files regardless. +OFFLINE_MODE = false +; Whether to disable logging in router. +DISABLE_ROUTER_LOG = true +; Whether to enable application level GZIP compression. ENABLE_GZIP = false -; Landing page for non-logged users, can be "home" or "explore" -LANDING_PAGE = home -; Define allowed algorithms and their minimum key length (use -1 to disable a type) +; The path for storing application specific data. +APP_DATA_PATH = data +; Whether to enable to load assets (i.e. "conf", "templates", "public") from disk instead of embedded bindata. +LOAD_ASSETS_FROM_DISK = false + +; The landing page URL for anonymous users, the value should not include +; subpath that is handled by the reverse proxy. +LANDING_URL = / + +; Whether to disable SSH access to the application entirely. +DISABLE_SSH = false +; The domain name to be exposed in SSH clone URL. +SSH_DOMAIN = %(DOMAIN)s +; The port number to be exposed in SSH clone URL. +SSH_PORT = 22 +; The path of SSH root directory, default is "$HOME/.ssh". +SSH_ROOT_PATH = +; The path to ssh-keygen, default is "ssh-keygen" and let shell find out which one to call. +SSH_KEYGEN_PATH = ssh-keygen +; The directory to create temporary files when test a public key using ssh-keygen, +; default is the system temporary directory. +SSH_KEY_TEST_PATH = +; Whether to check minimum public key size with corresponding type. +MINIMUM_KEY_SIZE_CHECK = false +; Whether to rewrite "~/.ssh/authorized_keys" file at start, ignored when use builtin SSH server. +REWRITE_AUTHORIZED_KEYS_AT_START = false +; Whether to start a builtin SSH server. +START_SSH_SERVER = false +; The network interface for builtin SSH server to listen on. +SSH_LISTEN_HOST = 0.0.0.0 +; The port number for builtin SSH server to listen on. +SSH_LISTEN_PORT = %(SSH_PORT)s +; The list of accepted ciphers for connections to builtin SSH server. +SSH_SERVER_CIPHERS = aes128-ctr, aes192-ctr, aes256-ctr, aes128-gcm@openssh.com, arcfour256, arcfour128 +; The list of accepted MACs for connections to builtin SSH server. +SSH_SERVER_MACS = hmac-sha2-256-etm@openssh.com, hmac-sha2-256, hmac-sha1 +; The list of accepted key exchange algorithms for connections to builtin SSH server. +SSH_SERVER_ALGORITHMS = rsa, ecdsa, ed25519 + +; Define allowed algorithms and their minimum key length (use -1 to disable a type). [ssh.minimum_key_sizes] ED25519 = 256 ECDSA = 256 RSA = 2048 DSA = 1024 +[repository] +; The root path for storing managed repositories, default is "~/gogs-repositories" +ROOT = +; The script type server supports, sometimes could be "sh". +SCRIPT_TYPE = bash +; Default ANSI charset for an unrecognized charset. +ANSI_CHARSET = +; Whether to force every new repository to be private. +FORCE_PRIVATE = false +; The global limit of number of repositories a user can create, -1 means no limit. +MAX_CREATION_LIMIT = -1 +; Preferred Licenses to place at the top of the list. +; Name must match file name in "conf/license" or "custom/conf/license". +PREFERRED_LICENSES = Apache License 2.0, MIT License +; Whether to disable Git interaction with repositories via HTTP/HTTPS protocol. +DISABLE_HTTP_GIT = false +; Whether to enable ability to migrate repository by server local path. +ENABLE_LOCAL_PATH_MIGRATION = false +; Whether to enable render mode for raw file. There are potential security risks. +ENABLE_RAW_FILE_RENDER_MODE = false +; The maximum number of goroutines that can be run at the same time for a single +; fetch request. Usually, the value depend of how many CPU (cores) you have. If +; the value is non-positive, it matches the number of CPUs available to the application. +COMMITS_FETCH_CONCURRENCY = 0 +; Default branch name when creating new repositories. +DEFAULT_BRANCH = master + +[repository.editor] +; List of file extensions that should have line wraps in the CodeMirror editor. +; Separate extensions with a comma. +LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd +; Valid file modes that have a preview API associated with them, such as "/api/v1/markdown". +; Separate values by commas. Preview tab in edit mode won't show if the file extension doesn't match. +PREVIEWABLE_FILE_MODES = markdown + +[repository.upload] +; Whether to enable repository file uploads. +ENABLED = true +; The path to temporarily store uploads (content under this path gets wiped out on every start). +TEMP_PATH = data/tmp/uploads +; File types that are allowed to be uploaded, e.g. "image/jpeg|image/png". Leave empty to allow any file type. +ALLOWED_TYPES = +; The maximum size of each file in MB. +FILE_MAX_SIZE = 3 +; The maximum number of files per upload. +MAX_FILES = 5 + [database] -; Either "mysql", "postgres" or "sqlite3", it's your choice -DB_TYPE = mysql -HOST = 127.0.0.1:3306 +; The database backend, either "postgres", "mysql" or "sqlite3". +TYPE = postgres +HOST = 127.0.0.1:5432 NAME = gogs -USER = root -PASSWD = -; For "postgres" only, either "disable", "require" or "verify-full" +USER = gogs +PASSWORD = +; For "postgres" only +SCHEMA = public +; For "postgres" only, either "disable", "require" or "verify-full". SSL_MODE = disable -; For "sqlite3" and "tidb", use absolute path when you start as service +; For "sqlite3" only, make sure to use absolute path. PATH = data/gogs.db - -[admin] +; The maximum open connections of the pool. +MAX_OPEN_CONNS = 30 +; The maximum idle connections of the pool. +MAX_IDLE_CONNS = 30 [security] +; Whether to show the install page, set this to "true" to bypass it. INSTALL_LOCK = false +; The secret to encrypt cookie values, 2FA code, etc. ; !!CHANGE THIS TO KEEP YOUR USER DATA SAFE!! SECRET_KEY = !#@FDEWREWR&*( -; Auto-login remember days +; The number of days a sign-in session persists across browser restarts. LOGIN_REMEMBER_DAYS = 7 -COOKIE_USERNAME = gogs_awesome -COOKIE_REMEMBER_NAME = gogs_incredible -; Reverse proxy authentication header name of user name -REVERSE_PROXY_AUTHENTICATION_USER = X-WEBAUTH-USER - -[service] -ACTIVE_CODE_LIVE_MINUTES = 180 -RESET_PASSWD_CODE_LIVE_MINUTES = 180 -; User need to confirm e-mail for registration -REGISTER_EMAIL_CONFIRM = false -; Does not allow register and admin create account only -DISABLE_REGISTRATION = false -; User must sign in to view anything. +; Whether to set secure cookie. +COOKIE_SECURE = false +; Whether to set cookie to indicate user login status. +ENABLE_LOGIN_STATUS_COOKIE = false +; The cookie name to store user login status. +LOGIN_STATUS_COOKIE_NAME = login_status +; A comma separated list of hostnames that are explicitly allowed to be accessed within the local network. +; Use "*" to allow all hostnames. +LOCAL_NETWORK_ALLOWLIST = + +[email] +; Whether to enable the email service. +ENABLED = false +; The prefix prepended to the subject line. +SUBJECT_PREFIX = `[%(BRAND_NAME)s] ` +; The SMTP server with its port, e.g. smtp.mailgun.org:587, smtp.gmail.com:587, smtp.qq.com:465 +; If the port ends is "465", SMTPS will be used. Using STARTTLS on port 587 is recommended per RFC 6409. +; If the server supports STARTTLS it will always be used. +HOST = smtp.mailgun.org:587 +; The email from address (RFC 5322). This can be just an email address, or the `"Name" ` format. +FROM = noreply@gogs.localhost +; The login user. +USER = noreply@gogs.localhost +; The login password. +PASSWORD = + +; The custom hostname for HELO operation, default is from system. +HELO_HOSTNAME = + +; Whether to skip verifying the certificate of the server. Only use this for self-signed certificates. +SKIP_VERIFY = false +; Whether to use client certificates. +USE_CERTIFICATE = false +CERT_FILE = custom/email/cert.pem +KEY_FILE = custom/email/key.pem + +; Whether to use "text/plain" as content format. +USE_PLAIN_TEXT = false +; Whether to attach a plaintext alternative to the MIME message while sending HTML emails. +; It is used to support older mail clients and make spam filters happier. +ADD_PLAIN_TEXT_ALT = false + +[auth] +; The valid duration of activate code in minutes. +ACTIVATE_CODE_LIVES = 180 +; The valid duration of reset password code in minutes. +RESET_PASSWORD_CODE_LIVES = 180 +; Whether to require email confirmation for adding new email addresses. +; Enable this option will also require user to confirm the email for registration. +REQUIRE_EMAIL_CONFIRMATION = false +; Whether to disallow anonymous users visiting the site. REQUIRE_SIGNIN_VIEW = false -; Mail notification -ENABLE_NOTIFY_MAIL = false -; More detail: https://github.com/gogits/gogs/issues/165 +; Whether to disable self-registration. When disabled, accounts would have to be created by admins. +DISABLE_REGISTRATION = false +; Whether to enable captcha validation for registration +ENABLE_REGISTRATION_CAPTCHA = true + +; Whether to enable reverse proxy authentication via HTTP header. ENABLE_REVERSE_PROXY_AUTHENTICATION = false +; Whether to automatically create new users for reverse proxy authentication. ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false -; Enable captcha validation for registration -ENABLE_CAPTCHA = true +; The HTTP header used as username for reverse proxy authentication. +REVERSE_PROXY_AUTHENTICATION_HEADER = X-WEBAUTH-USER +; Lists the IPs or CIDR ranges whose requests are allowed to set the reverse +; proxy authentication header. +TRUSTED_PROXY_IPS = 127.0.0.0/8,::1/128 -[webhook] -; Hook task queue length, increase if webhook shooting starts hanging -QUEUE_LENGTH = 1000 -; Deliver timeout in seconds -DELIVER_TIMEOUT = 5 -; Allow insecure certification -SKIP_TLS_VERIFY = false -; Number of history information in each page -PAGING_NUM = 10 +[user] +; Whether to enable email notifications for users. +ENABLE_EMAIL_NOTIFICATION = false -[mailer] -ENABLED = false -; Buffer length of channel, keep it as it is if you don't know what it is. -SEND_BUFFER_LEN = 100 -; Name displayed in mail title -SUBJECT = %(APP_NAME)s -; Mail server -; Gmail: smtp.gmail.com:587 -; QQ: smtp.qq.com:465 -; Note, if the port ends with "465", SMTPS will be used. Using STARTTLS on port 587 is recommended per RFC 6409. If the server supports STARTTLS it will always be used. -HOST = -; Disable HELO operation when hostname are different. -DISABLE_HELO = -; Custom hostname for HELO operation, default is from system. -HELO_HOSTNAME = -; Do not verify the certificate of the server. Only use this for self-signed certificates -SKIP_VERIFY = -; Use client certificate -USE_CERTIFICATE = false -CERT_FILE = custom/mailer/cert.pem -KEY_FILE = custom/mailer/key.pem -; Mail from address, RFC 5322. This can be just an email address, or the `"Name" ` format -FROM = -; Mailer user name and password -USER = -PASSWD = -; Use text/html as alternative format of content -ENABLE_HTML_ALTERNATIVE = false +[session] +; The session provider, either "memory", "file", or "redis". +PROVIDER = memory +; The configuration for respective provider: +; - memory: does not need any config yet +; - file: session file path, e.g. `data/sessions` +; - redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180,tls=true +PROVIDER_CONFIG = data/sessions +; The cookie name to store the session identifier. +COOKIE_NAME = i_like_gogs +; Whether to set cookie in HTTPS only. +COOKIE_SECURE = false +; The GC interval in seconds for session data. +GC_INTERVAL = 3600 +; The maximum idle time in seconds before a session record is garbage-collected. +; Set lower than `[security] LOGIN_REMEMBER_DAYS * 86400` to enforce a sliding +; idle timeout. Otherwise the session lives for the full cookie lifetime. +MAX_LIFE_TIME = 604800 +; The cookie name for CSRF token. +CSRF_COOKIE_NAME = _csrf [cache] -; Either "memory", "redis", or "memcache", default is "memory" +; The cache adapter, either "memory" or "redis". ADAPTER = memory -; For "memory" only, GC interval in seconds, default is 60 +; For "memory" only, GC interval in seconds. INTERVAL = 60 -; For "redis" and "memcache", connection host address -; redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180 -; memcache: `127.0.0.1:11211` +; For "redis", connection host address: +; - redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180 HOST = -[session] -; Either "memory", "file", or "redis", default is "memory" -PROVIDER = memory -; Provider config options -; memory: not have any config yet -; file: session file path, e.g. `data/sessions` -; redis: network=tcp,addr=:6379,password=macaron,db=0,pool_size=100,idle_timeout=180 -; mysql: go-sql-driver/mysql dsn config string, e.g. `root:password@/session_table` -PROVIDER_CONFIG = data/sessions -; Session cookie name -COOKIE_NAME = i_like_gogits -; If you use session in https only, default is false -COOKIE_SECURE = false -; Enable set cookie, default is true -ENABLE_SET_COOKIE = true -; Session GC time interval, default is 86400 -GC_INTERVAL_TIME = 86400 -; Session life time, default is 86400 -SESSION_LIFE_TIME = 86400 +[http] +; The value for "Access-Control-Allow-Origin" header, default is not to present. +ACCESS_CONTROL_ALLOW_ORIGIN = -[picture] -AVATAR_UPLOAD_PATH = data/avatars -; Chinese users can choose "duoshuo" -; or a custom avatar source, like: http://cn.gravatar.com/avatar/ -GRAVATAR_SOURCE = gravatar -; This value will be forced to be true in offline mode. -DISABLE_GRAVATAR = false -; Federated avatar lookup uses DNS to discover avatar associated -; with emails, see https://www.libravatar.org -; This value will be forced to be false in offline mode or Gravatar is disbaled. -ENABLE_FEDERATED_AVATAR = false +[lfs] +; The storage backend for uploading new objects. +STORAGE = local +; The root path to store LFS objects on local file system. +OBJECTS_PATH = data/lfs-objects +; The path to temporarily store LFS objects during upload verification. +OBJECTS_TEMP_PATH = data/tmp/lfs-objects [attachment] -; Whether attachments are enabled. Defaults to `true` -ENABLE = true -; Path for attachments. Defaults to `data/attachments` +; Whether to enabled upload attachments in general. +ENABLED = true +; The path to store attachments on the file system. PATH = data/attachments -; One or more allowed types, e.g. image/jpeg|image/png +; File types that are allowed to be uploaded, e.g. "image/jpeg|image/png". Leave empty to allow any file type. ALLOWED_TYPES = image/jpeg|image/png -; Max size of each file. Defaults to 32MB +; The maximum size of each file in MB. MAX_SIZE = 4 -; Max number of files per upload. Defaults to 10 +; The maximum number of files per upload. MAX_FILES = 5 +[release.attachment] +; Whether to enabled upload attachments for releases. +ENABLED = true +; File types that are allowed to be uploaded, e.g. "image/jpeg|image/png". Leave empty to allow any file type. +ALLOWED_TYPES = */* +; The maximum size of each file in MB. +MAX_SIZE = 32 +; The maximum number of files per upload. +MAX_FILES = 10 + [time] -; Specifies the format for fully outputed dates. Defaults to RFC1123 -; Special supported values are ANSIC, UnixDate, RubyDate, RFC822, RFC822Z, RFC850, RFC1123, RFC1123Z, RFC3339, RFC3339Nano, Kitchen, Stamp, StampMilli, StampMicro and StampNano -; For more information about the format see http://golang.org/pkg/time/#pkg-constants -FORMAT = +; Specifies the format for fully outputed dates. +; Values should be one of the following: +; ANSIC, UnixDate, RubyDate, RFC822, RFC822Z, RFC850, RFC1123, RFC1123Z, RFC3339, RFC3339Nano, Kitchen, Stamp, StampMilli, StampMicro and StampNano. +; For more information about the format see http://golang.org/pkg/time/#pkg-constants. +FORMAT = RFC1123 +[picture] +; The path to store user avatars on the file system. +AVATAR_UPLOAD_PATH = data/avatars +; The path to store repository avatars on the file system. +REPOSITORY_AVATAR_UPLOAD_PATH = data/repo-avatars +; Chinese users can use a custom avatar source, such as http://cn.gravatar.com/avatar/. +GRAVATAR_SOURCE = gravatar +; Whether to disable Gravatar, this value will be forced to be true in offline mode. +DISABLE_GRAVATAR = false +; Whether to enable federated avatar lookup uses DNS to discover avatar associated +; with emails, see https://www.libravatar.org for details. +; This value will be forced to be false in offline mode or when Gravatar is disabled. +ENABLE_FEDERATED_AVATAR = false + +[markdown] +; Whether to enable hard line break extension. +ENABLE_HARD_LINE_BREAK = false +; The list of custom URL schemes that are allowed as links when rendering Markdown. +; For example, "git" (for "git://") and "magnet" (for "magnet://"). +CUSTOM_URL_SCHEMES = +; The list of file extensions that should be rendered/edited as Markdown. +; Separate extensions with a comma. To render files with no extension as markdown, just put a comma. +FILE_EXTENSIONS = .md,.markdown,.mdown,.mkd + +[smartypants] +; Whether to enable the Smartypants extension. +ENABLED = false +FRACTIONS = true +DASHES = true +LATEX_DASHES = true +ANGLED_QUOTES = true + +[admin] +; Whether to disable regular (non-admin) users to create organizations. +DISABLE_REGULAR_ORG_CREATION = false + +[webhook] +; The list of enabled types for users to use, can be "gogs", "slack", "discord", "dingtalk". +TYPES = gogs, slack, discord, dingtalk +; Deliver timeout in seconds. +DELIVER_TIMEOUT = 15 +; Whether to allow insecure certification. +SKIP_TLS_VERIFY = false +; The number of history information in each page. +PAGING_NUM = 10 + +; General settings of loggers. [log] +; The root path for all log files, default is "log/" subdirectory. ROOT_PATH = -; Either "console", "file", "conn", "smtp" or "database", default is "console" +; Can be "console", "file", "slack" and "discord". ; Use comma to separate multiple modes, e.g. "console, file" MODE = console ; Buffer length of channel, keep it as it is if you don't know what it is. -BUFFER_LEN = 10000 -; Either "Trace", "Debug", "Info", "Warn", "Error", "Critical", default is "Trace" +BUFFER_LEN = 100 +; Either "Trace", "Info", "Warn", "Error", "Fatal", default is "Trace" LEVEL = Trace ; For "console" mode only [log.console] -LEVEL = +; Comment out to inherit +; LEVEL = ; For "file" mode only [log.file] -LEVEL = -; This enables automated log rotate(switch of following options), default is true +; Comment out to inherit +; LEVEL = +; Whether to enable automated log rotate (switch of following options). LOG_ROTATE = true -; Max line number of single file, default is 1000000 -MAX_LINES = 1000000 -; Max size shift of single file, default is 28 means 1 << 28, 256MB -MAX_SIZE_SHIFT = 28 -; Segment log daily, default is true +; Whether to segment log files daily. DAILY_ROTATE = true -; Expired days of log file(delete after max days), default is 7 +; The maximum size shift of single file, default is 28 means 1 << 28 = 256MB. +MAX_SIZE_SHIFT = 28 +; The maximum number of lines of single file. +MAX_LINES = 1000000 +; The expired days of log file (delete after max days). MAX_DAYS = 7 -; For "conn" mode only -[log.conn] -LEVEL = -; Reconnect host for every single message, default is false -RECONNECT_ON_MSG = false -; Try to reconnect when connection is lost, default is false -RECONNECT = false -; Either "tcp", "unix" or "udp", default is "tcp" -PROTOCOL = tcp -; Host address -ADDR = - -; For "smtp" mode only -[log.smtp] -LEVEL = -; Name displayed in mail title, default is "Diagnostic message from server" -SUBJECT = Diagnostic message from server -; Mail server -HOST = -; Mailer user name and password -USER = -PASSWD = -; Receivers, can be one or more, e.g. ["1@example.com","2@example.com"] -RECEIVERS = - -; For "database" mode only -[log.database] -LEVEL = -; Either "mysql" or "postgres" -DRIVER = -; Based on xorm, e.g.: root:root@localhost/gogs?charset=utf8 -CONN = +; For "slack" mode only +[log.slack] +; Comment out to inherit +; LEVEL = +; Webhook URL +URL = + +[log.discord] +; Comment out to inherit +; LEVEL = +; Webhook URL +URL = +; The username to be displayed in notification. +USERNAME = %(BRAND_NAME)s + +[log.xorm] +; Enable file rotation +ROTATE = true +; Rotate every day +ROTATE_DAILY = true +; Rotate once file size excesses x MB +MAX_SIZE = 100 +; Maximum days to keep logger files +MAX_DAYS = 3 + +[log.gorm] +; Whether to enable file rotation. +ROTATE = true +; Whether to rotate file every day. +ROTATE_DAILY = true +; The maximum file size in MB before next rotate. +MAX_SIZE = 100 +; The maximum days to keep files. +MAX_DAYS = 3 [cron] ; Enable running cron tasks periodically. @@ -351,8 +427,8 @@ ENABLED = true ; Run cron tasks when Gogs starts. RUN_AT_START = false -; Update mirrors [cron.update_mirrors] +; Defines how often the mirror syncer checks if any mirror needs to be synchronized (based on the mirror update interval). SCHEDULE = @every 10m ; Repository health check @@ -368,15 +444,22 @@ ARGS = RUN_AT_START = true SCHEDULE = @every 24h +; Cleanup repository archives +[cron.repo_archive_cleanup] +RUN_AT_START = false +SCHEDULE = @every 24h +; Time duration to check if archive should be cleaned +OLDER_THAN = 24h + [git] ; Disables highlight of added and removed changes DISABLE_DIFF_HIGHLIGHT = false +; Max number of files shown in diff view +MAX_GIT_DIFF_FILES = 100 ; 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 number of files shown in diff view -MAX_GIT_DIFF_FILES = 100 +MAX_GIT_DIFF_LINE_CHARACTERS = 2000 ; Arguments for command 'git gc', e.g. "--aggressive --auto" ; see more on http://git-scm.com/docs/git-gc/1.7.5 GC_ARGS = @@ -387,21 +470,70 @@ MIGRATE = 600 MIRROR = 300 CLONE = 300 PULL = 300 +DIFF = 60 GC = 60 [mirror] -; Default interval in hours between each check +; Defines the default interval (in hours) until the next sync for a mirror (after a successful mirror sync). +; It can be overridden individually for each mirror repository in the settings. DEFAULT_INTERVAL = 8 [api] ; Max number of items will response in a page MAX_RESPONSE_ITEMS = 50 +[ui] +; Number of repositories that are showed in one explore page +EXPLORE_PAGING_NUM = 20 +; Number of issues that are showed in one page +ISSUE_PAGING_NUM = 10 +; Number of maximum commits showed in one activity feed +FEED_MAX_COMMIT_NUM = 5 +; Value of "theme-color" meta tag, used by Android >= 5.0 +; An invalid color like "none" or "disable" will have the default style +; More info: https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android +THEME_COLOR_META_TAG = `#ff5343` +; Max size in bytes of files to be displayed (default is 8MB) +MAX_DISPLAY_FILE_SIZE = 8388608 + +[ui.admin] +; Number of users that are showed in one page +USER_PAGING_NUM = 50 +; Number of repos that are showed in one page +REPO_PAGING_NUM = 50 +; Number of notices that are showed in one page +NOTICE_PAGING_NUM = 25 +; Number of organization that are showed in one page +ORG_PAGING_NUM = 50 + +[ui.user] +; Number of repos that are showed in one page +REPO_PAGING_NUM = 15 +; Number of news feeds that are showed in one page +NEWS_FEED_PAGING_NUM = 20 +; Number of commits that are showed in one page +COMMITS_PAGING_NUM = 30 + +[prometheus] +; Whether to enable Prometheus metrics. +ENABLED = true +; Whether to enable HTTP Basic Authentication to protect metrics data. +ENABLE_BASIC_AUTH = false +; The username for HTTP Basic Authentication. +BASIC_AUTH_USERNAME = +; The password for HTTP Basic Authentication. +BASIC_AUTH_PASSWORD = + +; Extension mapping to highlight class +; e.g. .toml=ini +[highlight.mapping] + [i18n] -LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE -NAMES = English,简体中文,繁體中文(香港),繁體中文(台湾),Deutsch,Français,Nederlands,Latviešu,Русский,日本語,Español,Português do Brasil,Polski,български,Italiano,Suomalainen,Türkçe,čeština,Српски,Svenska +LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN,pt-PT,mn-MN,ro-RO +NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese,Português,Монгол,Română -; Used for datetimepicker +; Used for jQuery DateTimePicker, +; list of supported languages in https://xdsoft.net/jqplugins/datetimepicker/#lang [i18n.datelang] en-US = en zh-CN = zh @@ -423,14 +555,19 @@ tr-TR = tr cs-CZ = cs-CZ sr-SP = sr sv-SE = sv - -; Extension mapping to highlight class -; e.g. .toml=ini -[highlight.mapping] +ko-KR = ko +gl-ES = gl +uk-UA = uk +en-GB = en-GB +hu-HU = hu +sk-SK = sk +id-ID = id +fa-IR = fa +vi-VN = vi +pt-PT = pt +mn-MN = mn +ro-RO = ro [other] -SHOW_FOOTER_BRANDING = false -; Show version information about Gogs and Go in the footer -SHOW_FOOTER_VERSION = true ; Show time of template execution in the footer SHOW_FOOTER_TEMPLATE_LOAD_TIME = true diff --git a/conf/auth.d/github.conf.example b/conf/auth.d/github.conf.example new file mode 100644 index 00000000000..f222a85d8ea --- /dev/null +++ b/conf/auth.d/github.conf.example @@ -0,0 +1,10 @@ +# This is an example of GitHub authentication +# +id = 105 +type = github +name = GitHub +is_activated = true + +[config] +api_endpoint = https://api.github.com/ + diff --git a/conf/auth.d/ldap_bind_dn.conf.example b/conf/auth.d/ldap_bind_dn.conf.example new file mode 100644 index 00000000000..d2400f07099 --- /dev/null +++ b/conf/auth.d/ldap_bind_dn.conf.example @@ -0,0 +1,29 @@ +# This is an example of LDAP (BindDN) authentication +# +id = 101 +type = ldap_bind_dn +name = LDAP BindDN +is_activated = true + +[config] +host = mydomain.com +port = 636 +# 0 - Unencrypted, 1 - LDAPS, 2 - StartTLS +security_protocol = 0 +skip_verify = false +bind_dn = +bind_password = +user_base = ou=Users,dc=mydomain,dc=com +attribute_username = +attribute_name = +attribute_surname = +attribute_mail = mail +attributes_in_bind = false +filter = (&(objectClass=posixAccount)(cn=%s)) +admin_filter = +group_enabled = false +group_dn = +group_filter = +group_member_uid = +user_uid = + diff --git a/conf/auth.d/ldap_simple_auth.conf.example b/conf/auth.d/ldap_simple_auth.conf.example new file mode 100644 index 00000000000..5e50a74c57a --- /dev/null +++ b/conf/auth.d/ldap_simple_auth.conf.example @@ -0,0 +1,30 @@ +# This is an example of LDAP (simple auth) authentication +# +id = 102 +type = ldap_simple_auth +name = LDAP Simple Auth +is_activated = true + +[config] +host = mydomain.com +port = 636 +# 0 - Unencrypted, 1 - LDAPS, 2 - StartTLS +security_protocol = 0 +skip_verify = false +bind_dn = +bind_password = +user_base = +user_dn = cn=%s,ou=Users,dc=mydomain,dc=com +attribute_username = +attribute_name = +attribute_surname = +attribute_mail = mail +attributes_in_bind = false +filter = (&(objectClass=posixAccount)(cn=%s)) +admin_filter = +group_enabled = false +group_dn = +group_filter = +group_member_uid = +user_uid = + diff --git a/conf/auth.d/pam.conf.example b/conf/auth.d/pam.conf.example new file mode 100644 index 00000000000..12f8d58f121 --- /dev/null +++ b/conf/auth.d/pam.conf.example @@ -0,0 +1,10 @@ +# This is an example of PAM authentication +# +id = 104 +type = pam +name = System Auth +is_activated = true + +[config] +service_name = system-auth + diff --git a/conf/auth.d/smtp.conf.example b/conf/auth.d/smtp.conf.example new file mode 100644 index 00000000000..b8881daeac3 --- /dev/null +++ b/conf/auth.d/smtp.conf.example @@ -0,0 +1,16 @@ +# This is an example of SMTP authentication +# +id = 103 +type = smtp +name = GMail +is_activated = true + +[config] +# Either "PLAIN" or "LOGIN" +auth = PLAIN +host = smtp.gmail.com +port = 587 +allowed_domains = +tls = true +skip_verify = false + diff --git a/conf/embed.go b/conf/embed.go new file mode 100644 index 00000000000..d3bb0725b43 --- /dev/null +++ b/conf/embed.go @@ -0,0 +1,23 @@ +package conf + +import ( + "embed" +) + +//go:embed app.ini **/* +var Files embed.FS + +// FileNames returns a list of filenames exists in the given direction within +// Files. The list includes names of subdirectories. +func FileNames(dir string) ([]string, error) { + entries, err := Files.ReadDir(dir) + if err != nil { + return nil, err + } + + fileNames := make([]string, 0, len(entries)) + for _, entry := range entries { + fileNames = append(fileNames, entry.Name()) + } + return fileNames, nil +} diff --git a/conf/embed_test.go b/conf/embed_test.go new file mode 100644 index 00000000000..a93ebc4083d --- /dev/null +++ b/conf/embed_test.go @@ -0,0 +1,16 @@ +package conf + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestFileNames(t *testing.T) { + names, err := FileNames(".") + require.NoError(t, err) + + want := []string{"app.ini", "auth.d", "gitignore", "label", "license", "locale", "readme"} + assert.Equal(t, want, names) +} diff --git a/conf/gitignore/OSX b/conf/gitignore/OSX deleted file mode 100644 index 660b31353e8..00000000000 --- a/conf/gitignore/OSX +++ /dev/null @@ -1,24 +0,0 @@ -.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 diff --git a/conf/gitignore/PhpStorm b/conf/gitignore/PhpStorm new file mode 100644 index 00000000000..dee8ce88ce0 --- /dev/null +++ b/conf/gitignore/PhpStorm @@ -0,0 +1,63 @@ +# 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 + +# Sensitive or high-churn files: +.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 + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Ruby plugin and RubyMine +/.rakeTasks + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### PhpStorm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint \ No newline at end of file diff --git a/conf/gitignore/UnrealEngine b/conf/gitignore/UnrealEngine new file mode 100644 index 00000000000..19e27dcfd8e --- /dev/null +++ b/conf/gitignore/UnrealEngine @@ -0,0 +1,76 @@ +# Visual Studio 2015 user specific files +.vs/ + +# 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/* +Plugins/*/Binaries/* + +# Builds +Build/* + +# Whitelist PakBlacklist-.txt files +!Build/*/ +Build/*/** +!Build/*/PakBlacklist*.txt + +# 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/* +Plugins/*/Intermediate/* + +# Cache files for the editor to use +DerivedDataCache/* + + diff --git a/conf/gitignore/WebStorm b/conf/gitignore/WebStorm new file mode 100644 index 00000000000..6fd0846e24c --- /dev/null +++ b/conf/gitignore/WebStorm @@ -0,0 +1,63 @@ +# 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 + +# Sensitive or high-churn files: +.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 + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Ruby plugin and RubyMine +/.rakeTasks + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### WebStorm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint \ No newline at end of file diff --git a/conf/gitignore/macOS b/conf/gitignore/macOS new file mode 100644 index 00000000000..d80290051c8 --- /dev/null +++ b/conf/gitignore/macOS @@ -0,0 +1,25 @@ +.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 diff --git a/conf/locale/TRANSLATORS b/conf/locale/TRANSLATORS index d3538971350..9014c056867 100644 --- a/conf/locale/TRANSLATORS +++ b/conf/locale/TRANSLATORS @@ -7,22 +7,34 @@ Akihiro YAGASAKI Aleksejs Grocevs Aleksey Tarakin Alexander Steinhöfer +Alexandre Espinosa Menor Alexandre Magno +Anders B. Hansen +András Schenkerik Andrey Nering +Andrey Paskal Andrey Solomatin Antoine GIRARD Arthur Aslanyan Aurelien Darragon Barış Arda Yılmaz +Bo-Yi Wu +Breton Corentin Camille Baronnet +Changwoo Ryu Christoph Kisfeld Cysioland +Damaris Padieu Daniel Speichert David Yzaguirre +Denys Khomenko Dmitriy Nogay Enrico Testori hypertesto AT gmail DOT com Ezequiel Gonzalez Rial +Farhan Naysee +Flávio Monteiro Gabriel Dugny +Ganesha Gregor Santner Halil Kaya Hamid Feizabadi @@ -30,33 +42,47 @@ Huimin Wang ilko Ilya Makarov Jamie Mansfield +Javier Ortiz Bultron Jean THOMAS +John Behm +Jonas De Kegel Joubert RedRat Juraj Bubniak Lafriks Lauri Ojansivu -Luc Stepniewski Luca Bozzo Luca Kröger +Luc Stepniewski +Łukasz Jan Niemier Marc Schiller Marvin Menzerath +Mathias Rangel Wulff Michael Härtl Miguel de la Cruz Mikhail Burdin +Mohammad Gholami Morten Sørensen Muhammad Fawwaz Orabi Nakao Takamasa Natan Albuquerque Odilon Junior +Oleksandr Yermakov +Óscar García Amor +Pablo Saavedra +Pierre Prinetti >meatqrawldotnet< Richard Bukovansky Robert Nuske Robin Hübner +Rste Risafov SeongJae Park +Sergey Stepanov +Simona Iacob Thomas Fanninger Tilmann Bach Toni Villena Jiménez +Vincent AMSTOUTZ Vladimir Jigulin mogaika AT yandex DOT ru Vladimir Vissoultchev +Vongola YJSoft -Łukasz Jan Niemier -Pablo Saavedra +Oscar Quisbert diff --git a/conf/locale/locale_bg-BG.ini b/conf/locale/locale_bg-BG.ini index 4fe30e31fde..a491db07b2b 100644 --- a/conf/locale/locale_bg-BG.ini +++ b/conf/locale/locale_bg-BG.ini @@ -9,7 +9,6 @@ sign_out=Изход sign_up=Регистрирайте се register=Регистрация website=Уебсайт -version=Версия page=Страница template=Шаблон language=Език @@ -44,23 +43,27 @@ issues=Задачи cancel=Отказ +[status] +page_not_found=Страницата не е намерена +internal_server_error=Вътрешна грешка в сървър + [install] install=Инсталация title=Стъпки за инсталиране при първоначално стартиране docker_helper=Ако Gogs е стартиран в Docker контейнер, моля прочетете нашите указания внимателно, преди да правите промени по настройките на тази страница! -requite_db_desc=Gogs изисква MySQL, PostgreSQL, SQLite3 или TiDB. +requite_db_desc=Gogs изисква MySQL, PostgreSQL, SQLite3 или TiDB (през MySQL протокол). db_title=Настройки на базата данни db_type=Тип на база данни host=Сървър user=Потребител password=Парола db_name=Име на база данни +db_schema=Схема db_helper=Моля, използвайте INNODB engine с utf8_general_ci кодиране на знаци за MySQL. ssl_mode=Режим SSL path=Път -sqlite_helper=Файл на SQLite3 или TiDB база данни.
Моля използвайте абсолютен път до файл когато стартирате Gogs като услуга. -err_empty_db_path=Пътят до SQLite3 или TiDB база данни не може да е празен. -err_invalid_tidb_name=TiDB не позволява "." и "-" в името на базата данни. +sqlite_helper=Път към файл на SQLite3 база от данни.
Моля използвайте абсолютен път, когато стартирате gogs като услуга. +err_empty_db_path=Пътят към SQLite3 базата от данни не може да бъде празен. no_admin_and_disable_registration=Невъзможно изключване на регистрациите без предварително да е създаден поне един административен профил. err_empty_admin_password=Паролата на администратор не може да е празна. @@ -75,12 +78,17 @@ domain=Домейн domain_helper=Тази настройка влияе на URL адреса за клониране чрез SSH. ssh_port=SSH порт ssh_port_helper=Номер на порт на SSH сървъра. Оставете празно за да изключите достъп през SSH. +use_builtin_ssh_server=Използване на вграден SSH сървър +use_builtin_ssh_server_popup=Стартиране на вграден SSH сървър за Git операции, различен от системния SSH демон. http_port=HTTP порт http_port_helper=Порт, на който приложението ще слуша. app_url=URL адрес на приложението app_url_helper=Този настройка променя HTTP/HTTPS адреса за клониране, а понякога и адреса на ел. поща. log_root_path=Път към журналите log_root_path_helper=Директория в която се записват журналите. +enable_console_mode=Включване на конзолен режим +enable_console_mode_popup=Изписване на логовете в конзолата, в допълнение към файловият режим. +default_branch=Клон по подразбиране optional_title=Опционални настройки email_title=Настройки на пощенска услуга @@ -104,7 +112,7 @@ enable_captcha=Включи Captcha enable_captcha_popup=Изисква валидиране с captcha при саморегистрация на потребители. require_sign_in_view=Включи задължително вписване за преглед на страници require_sign_in_view_popup=Само вписани потребители могат да виждат страниците, анонимните посетители виждат само страниците за регистрация и вход. -admin_setting_desc=Няма нужда от създаване на администраторски профил в момента, защото потребителят с първо ID в базата автоматично получава администраторски достъп. +admin_setting_desc=Няма нужда да създавате администраторски профил в момента, защото потребителят с първо ID в базата автоматично получава администраторски достъп. admin_title=Настройки на профил на администратора admin_name=Потребителско име admin_password=Парола @@ -116,7 +124,10 @@ sqlite3_not_available=Вашата версия не поддържа SQLite3, invalid_db_setting=Настройките на базата данни са некоректни: %v invalid_repo_path=Основният път към хранилищата е невалиден: %v run_user_not_match=Потребителският контекст на приложението не е на текущия потребител: %s -> %s +smtp_host_missing_port=Липсва порт в зададения SMTP адрес. +invalid_smtp_from=Невалидно поле От: %v save_config_failed=Неуспешно запазване на конфигурация: %v +init_failed=Грешка при инициализация на приложение: %v invalid_admin_setting=Настройките на профил на администратора са невалидни: %v install_success=Добре дошли! Радваме се, че избрахте Gogs, и Ви пожелаваме приятна работа и сърдечни поздрави! invalid_log_root_path=Основният път към журналите е невалиден: %v @@ -137,6 +148,7 @@ issues.in_your_repos=Във Вашите хранилища [explore] repos=Хранилища users=Потребители +organizations=Организации search=Търсене [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Вече имате профил? Впишете се сег social_register_hepler_msg=Вече имате профил? Свържете се сега! disable_register_prompt=За съжаление създаването на нови регистрации е изключено. Обърнете се към администратора на сайта. disable_register_mail=За съжаление потвърждението на регистрации е изключено. +auth_source=Източник за удостоверяване +local=Локален remember_me=Запомни ме forgot_password=Забравена парола forget_password=Забравена парола? @@ -156,7 +170,6 @@ prohibit_login_desc=Вашият профил е със забрана за вл resent_limit_prompt=За съжаление Вие съвсем наскоро изпратихте писмо за активация. Моля изчакайте 3 минути, след което опитайте отново. has_unconfirmed_mail=Здравейте %s, имате непотвърден адрес на ел. поща (%s). Ако не сте получили писмо за потвърждение или имате нужда да се изпрати ново писмо, моля щракнете бутона по-долу. resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение -email_not_associate=Този адрес на ел. поща не е свързан с никой профил. send_reset_mail=Щракнете тук, за да получите (отново) писмо за нулиране на паролата reset_password=Нулиране на паролата invalid_code=За съжаление Вашия код за потвърждение е изтекъл или е невалиден. @@ -164,6 +177,14 @@ reset_password_helper=Щракнете тук, за да нулирате пар password_too_short=Размерът на паролата не може да бъде по-малък от 6 знака. non_local_account=Нелокални потребители не могат да сменят паролата си през Gogs. +login_two_factor=Двуфакторно удостоверяване +login_two_factor_passcode=Парола за удостоверяване +login_two_factor_enter_recovery_code=Въведете двуфакторен код за възстановяване +login_two_factor_recovery=Двуфакторно възстановяване +login_two_factor_recovery_code=Код за възстановяване +login_two_factor_enter_passcode=Въведете двуфакторен код +login_two_factor_invalid_recovery_code=Този код за възстановяване вече е бил използван или не е валиден. + [mail] activate_account=Моля активирайте Вашия профил activate_email=Провери адрес на ел. поща @@ -199,6 +220,7 @@ Content=Съдържание require_error=` не може да бъде празен.` alpha_dash_error=` трябва да e валидна буква, число или тире(-_).` alpha_dash_dot_error=` трябва да e валидна буква, число, тире(-_) или точка.` +alpha_dash_dot_slash_error=` must be alphanumeric, dash (-_), dot or slash characters.` size_error=` трябва да е с размер %s.` min_size_error=` трябва да съдържа поне %s знака.` max_size_error=` трябва да съдържа най-много %s знака.` @@ -215,6 +237,7 @@ org_name_been_taken=Името на организацията вече се п team_name_been_taken=Името на екипа вече се ползва. email_been_used=Този адрес на ел. поща вече се ползва. username_password_incorrect=Потребителското име или паролата не са верни. +auth_source_mismatch=The authentication source selected is not associated with the user. enterred_invalid_repo_name=Моля уверете се, че въведеното име на хранилище е вярно. enterred_invalid_owner_name=Моля уверете се, че въведеното име на притежател е вярно. enterred_invalid_password=Моля уверете се, че въведената парола е вярна. @@ -232,7 +255,7 @@ org_still_own_repo=Тази организация все още притежа target_branch_not_exist=Целевият клон не съществува. [user] -change_avatar=Проми своя аватар +change_avatar=Промени своя аватар join_on=Регистриран repositories=Хранилища activity=Публична дейност @@ -242,19 +265,18 @@ following=Следване follow=Следване unfollow=Не следвай -form.name_reserved=Потребителското име '%s' е запазено. -form.name_pattern_not_allowed=Потребителското име '%s' не е допустимо. +form.name_not_allowed=User name or pattern %q is not allowed. [settings] profile=Профил password=Парола avatar=Аватар ssh_keys=SSH ключове -social=Социални профили -applications=Приложения +security=Сигурност +repos=Хранилища orgs=Организации +applications=Приложения delete=Изтрий профил -uid=UID public_profile=Публичен профил profile_desc=Вашият адрес на ел. поща е публичен и ще бъде използван за всички свързани с профила Ви уведомления и всички уеб базирани операции, направени чрез сайта. @@ -295,6 +317,7 @@ delete_email=Изтрий email_deletion=Изтрий ел. поща email_deletion_desc=При изтриване на тази ел. поща ще се премахне свързаната информация от Вашия профил. Желаете ли да продължите? email_deletion_success=Ел. пощата беше изтрита успешно! +email_deletion_primary=Cannot delete primary email address. add_new_email=Добавяне на нов адрес на ел. поща add_email=Добави ел. поща add_email_confirmation_sent=Ново писмо за потвърждение е изпратено до '%s'. Моля проверете пощенската си кутия в рамките на следващите %d часа, за да завършите процеса на регистрация. @@ -320,14 +343,36 @@ no_activity=Няма скорошна дейност key_state_desc=Този ключ е използван през последните 7 дни token_state_desc=Този API ключ е използван през последните 7 дни -manage_social=Управление на свързани профили в социалните мрежи -social_desc=Това е списък на свързани профили в социалните мрежи. Премахнете всички, които не разпознавате. -unbind=Освобождаване -unbind_success=Социалния профил е освободен. +two_factor=Two-factor Authentication +two_factor_status=Статус: +two_factor_on=Вкл. +two_factor_off=Изкл. +two_factor_enable=Активиране +two_factor_disable=Деактивиране +two_factor_view_recovery_codes=View and save your recovery codes in a safe place. You can use them as passcode if you lose access to your authentication application. +two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use Personal Access Token as your credential, e.g. %[3]s. +two_factor_enable_title=Enable Two-factor Authentication +two_factor_scan_qr=Please use your authentication application to scan the image: +two_factor_or_enter_secret=Or enter the secret: +two_factor_then_enter_passcode=След това въведете паролата: +two_factor_verify=Потвърждаване +two_factor_invalid_passcode=Въведената парола е невалидна! Моля опитайте отново. +two_factor_reused_passcode=The passcode you entered has already been used, please try another one! +two_factor_enable_error=Enable Two-factor authentication failed: %v +two_factor_enable_success=Two-factor authentication has enabled for your account successfully! +two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes +two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, please keep these codes in a safe place. +two_factor_regenerate_recovery_codes=Ново генериране на кодове за възстановяване +two_factor_regenerate_recovery_codes_error=Неуспешно генериране на кодове за възстановяване: %v +two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully! +two_factor_disable_title=Disable Two-factor Authentication +two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue? +two_factor_disable_success=Two-factor authentication has disabled successfully! manage_access_token=Управление на индивидуални API ключове за достъп generate_new_token=Генериране на нов API ключ tokens_desc=Генерирани API ключове, които могат да се използват за достъп до API на Gogs. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=Всеки API ключ ще има пълен достъп до Вашия профил. token_name=Име на API ключ generate_token=Генериране на API ключ @@ -336,6 +381,16 @@ delete_token=Изтрий access_token_deletion=Изтрий индивидуален API ключ за достъп access_token_deletion_desc=При изтриване на този индивидуален API ключ за достъп ще се премахнат всички свързани права на приложението. Желаете ли да продължите? delete_token_success=Индивидуалният API ключ за достъп е изтрит успешно! Не забравяйте да преконфигурирате приложението също. +token_name_exists=Token with same name already exists. + +orgs.none=Не сте член на никоя организация. +orgs.leave_title=Напусни организация +orgs.leave_desc=Ще загубите достъп до всички хранилища и екипи, след като напуснете организацията. Желаете ли да продължите? + +repos.leave=Напускане +repos.leave_title=Напускане на хранилище +repos.leave_desc=You will lose access to the repository after you left. Do you want to continue? +repos.leave_success=Вие успешно напуснахте хранилище "%s"! delete_account=Изтриване на собствения профил delete_prompt=Тази операция ще изтрие Вашия профил завинаги и тя НЕ МОЖЕ да бъде отменена в последствие! @@ -348,7 +403,9 @@ owner=Притежател repo_name=Име на хранилището repo_name_helper=Добро име на хранилище е име, състоящо от кратки, запомнящи се и уникални ключови думи. visibility=Видимост +unlisted=Unlisted visiblity_helper=Това хранилище е Частно +unlisted_helper=This repository is Unlisted visiblity_helper_forced=Административна настройка задължава всички нови хранилища да бъдат Частни visiblity_fork_helper=(Промяна на тази стойност ще се отрази на всички разклонения) clone_helper=Нуждаете се от помощ при клониране? Посетете Помощ! @@ -374,24 +431,26 @@ mirror_last_synced=Последна синхр. watchers=Наблюдаващи stargazers=Харесващи forks=Разклонения +repo_description_helper=Description of repository. Maximum 512 characters length. +repo_description_length=Available characters form.reach_limit_of_creation=Притежателят е достигнал настроения лимит от %d брой хранилища. -form.name_reserved=Името на хранилището '%s' е запазено. -form.name_pattern_not_allowed=Име на хранилището от вида '%s' не е позволено. +form.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=Изисква потребител и парола migrate_type=Тип мигриране migrate_type_helper=Това хранилище ще бъде огледало migrate_repo=Мигрирай хранилище migrate.clone_address=Адрес за клониране -migrate.clone_address_desc=Това може да е HTTP/HTTPS/GIT адрес или локален път на сървъра. +migrate.clone_address_desc=Може да използвате HTTP/HTTPS/GIT адрес. +migrate.clone_address_desc_import_local=Можете да мигрирате хранилище от локален път на сървъра. migrate.permission_denied=Недостатъчни права за импорт на локални хранилища. migrate.invalid_local_path=Невалиден път - не съществува или не е директория. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Грешка при миграция: %v mirror_from=огледало от forked_from=разклонено от -fork_from_self=Не можете да разклоните хранилище което си е Ваше! copy_link=Копирай copy_link_success=Копирано! copy_link_error=Натиснете ⌘-C или Ctrl-C за да копирате @@ -407,9 +466,9 @@ quick_guide=Бърз справочник clone_this_repo=Клонирай хранилището create_new_repo_command=Създай ново хранилище чрез командния ред push_exist_repo=Предай съществуващо хранилище през командния ред -repo_is_empty=Това хранилище е празно. Моля проверете по-късно пак! +bare_message=Това хранилище все още не съдържа нищо. -code=Код +files=Файлове branch=Клон tree=ИН на ревизия filter_branch_and_tag=Филтър по маркер или клон @@ -420,12 +479,23 @@ pulls=Заявки за сливане labels=Етикети milestones=Етапи commits=Ревизии +git_branches=Клонове releases=Версии file_raw=Директен файл file_history=История file_view_raw=Виж директен файл file_permalink=Постоянна връзка file_too_large=Този файл е твърде голям за да се визуализира +video_not_supported_in_browser=Вашият браузър не поддържа HTML5 видео тагове. + +branches.overview=Преглед +branches.active_branches=Активни клонове +branches.stale_branches=Застинали клонове +branches.all=Всички клонове +branches.updated_by=Актуализирани %[1]s от %[2]s +branches.change_default_branch=Промяна на клон по подразбиране +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Нов файл editor.upload_file=Качи файл @@ -455,16 +525,19 @@ editor.cancel=Отказ editor.filename_cannot_be_empty=Името не може да бъде празно. editor.branch_already_exists=Клон '%s' вече съществува в това хранилище. editor.directory_is_a_file=Частта '%s' в пътя е файл, не директория в това хранилище. +editor.file_is_a_symlink=Файл "%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 +editor.fail_to_delete_file=Failed to delete file '%s' with error: %v editor.add_subdir=Добави поддиректория... editor.unable_to_upload_files=Невъзможно качване на файлове в '%s' заради грешка: %v editor.upload_files_to_dir=Качи файлове в '%s' +commits.commit_history=Commit History commits.commits=Ревизии commits.search=Търсене в ревизии commits.find=Намери @@ -562,6 +635,7 @@ pulls.compare_compare=сравни pulls.filter_branch=Филтър по клон pulls.no_results=Няма резултати. pulls.nothing_to_compare=Няма нищо за сравняване, защото родителският клон и върхът са еднакви. +pulls.nothing_merge_base=Няма нищо за сравняване, защото двата клона имат напълно различна история. pulls.has_pull_request=`Вече има заявка за сливане между тези две цели: %[2]s#%[3]d` pulls.create=Създай заявка за сливане pulls.title_desc=заяви обединяване на %[1]d ревизии от %[2]s във %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=Проверката за конфликт все още е в pulls.can_auto_merge_desc=Може да се извърши обединяване на тази заявка за сливане. pulls.cannot_auto_merge_desc=Не може да се извърши обединяване, защото съществуват конфликти между ревизиите. pulls.cannot_auto_merge_helper=Моля, използвайте инструменти на командния ред за да разрешите конфликтите. +pulls.create_merge_commit=Create a merge commit +pulls.rebase_before_merging=Rebase before merging +pulls.commit_description=Commit Description pulls.merge_pull_request=Обедини заявка за сливане pulls.open_unmerged_pull_exists=`Невъзможно повторно отваряне, защото вече съществува заявка за сливане (#%d) от същото хранилище със същата информация за обединяване, която чака да бъде извършена` +pulls.delete_branch=Изтрий клон +pulls.delete_branch_has_new_commits=Клонът не може да бъде изтрит, защото има ревизии след последното обединяване. milestones.new=Нов етап milestones.open_tab=%d отворени @@ -629,6 +708,29 @@ settings.collaboration.admin=За администрация settings.collaboration.write=За писане settings.collaboration.read=За четене settings.collaboration.undefined=Недефинирано +settings.branches=Клонове +settings.branches_bare=You cannot manage branches for bare repository. Please push some content first. +settings.default_branch=Клон по подразбиране +settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing. +settings.update=Update +settings.update_default_branch_unsupported=Промяна на клон по подразбиране не се поддържа от тази версия на Git сървъра. +settings.update_default_branch_success=Default branch of this repository has been updated successfully! +settings.protected_branches=Защитени клонове +settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers. +settings.choose_a_branch=Избор на клон... +settings.branch_protection=Защита на клон +settings.branch_protection_desc=Please choose protect options for branch %s. +settings.protect_this_branch=Protect this branch +settings.protect_this_branch_desc=Disable force pushes and prevent from deletion. +settings.protect_require_pull_request=Require pull request instead direct pushing +settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request. +settings.protect_whitelist_committers=Списък на всички, които могат да изпращат към този клон +settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check. +settings.protect_whitelist_users=Потребители, които могат да изпращат към този клон +settings.protect_whitelist_search_users=Търсене на потребители +settings.protect_whitelist_teams=Teams for which members of them can push to this branch +settings.protect_whitelist_search_teams=Търсене на екипи +settings.update_protect_branch_success=Protect options for this branch has been updated successfully! settings.hooks=Уеб-куки settings.githooks=Git куки settings.basic_settings=Основни настройки @@ -641,19 +743,26 @@ settings.change_reponame_prompt=Тази промяна ще засегне вр settings.advanced_settings=Разширени настройки settings.wiki_desc=Включи система за уики settings.use_internal_wiki=Използвай вградено уики +settings.allow_public_wiki_desc=Allow public access to wiki when repository is private settings.use_external_wiki=Използвай външно уики settings.external_wiki_url=URL адрес на външно уики settings.external_wiki_url_desc=Посетителите ще бъдат пренасочени към този URL адрес от връзката за раздел уики. settings.issues_desc=Включи система за проследяване на задачи settings.use_internal_issue_tracker=Изполвай вградена система за проследяване на задачи +settings.allow_public_issues_desc=Allow public access to issues when repository is private settings.use_external_issue_tracker=Използвай външна система за проследяване на задачи +settings.external_tracker_url=URL адрес на външна система за проследяване на задачи +settings.external_tracker_url_desc=Посетителите ще бъдат пренасочени към този URL адрес от връзката на раздела. settings.tracker_url_format=Формат на URL адрес на външна система за проследяване на задачи settings.tracker_issue_style=Стил на именуване на външна система за проследяване на задачи: settings.tracker_issue_style.numeric=Цифров settings.tracker_issue_style.alphanumeric=Символен settings.tracker_url_format_desc=Можете да използвате текстови маркери {user} {repo} {index} за потребителско име, име на хранилище и индекс на задача съответно. -settings.pulls_desc=Включва заявки за сливане за да може да се приемат външни доработки +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Ignore changes in whitespace +settings.pulls.allow_rebase_merge=Allow use rebase to merge commits settings.danger_zone=Опасна зона +settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner. settings.new_owner_has_same_repo=Новият притежател вече има хранилище със същото име. Изберете друго име. settings.convert=Промени към редовно хранилище settings.convert_desc=Можете да промените това огледало към редовно хранилище. Конверсията не може да се отмени. @@ -672,7 +781,7 @@ settings.wiki_deletion_success=Данните за уики на това хра settings.delete=Изтрий това хранилище settings.delete_desc=След като изтриете хранилището, няма връщане назад. Моля, бъдете сигурни. settings.delete_notices_1=- Тази операция НЕ МОЖЕ да бъде отменена в последствие. -settings.delete_notices_2=- Тази операция ще изтрие всичко от това хранилище, включително Git данни, задачи, коментари и достъпа на сътрудници. +settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access. settings.delete_notices_fork_1=- Всички разклонения ще станат независими след изтриването. settings.deletion_success=Хранилището е изтрито успешно! settings.update_settings_success=Настройките на хранилището са запазени успешно. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Този потребител няма да settings.remove_collaborator_success=Сътрудникът е премахнат. settings.search_user_placeholder=Име на потребител... settings.org_not_allowed_to_be_collaborator=Невъзможно добавяне на организация като сътрудник. -settings.user_is_org_member=Потребителят вече участва в организацията и не може да бъде добавен като сътрудник. -settings.add_webhook=Добави уеб-кука settings.hooks_desc=Уеб-куките много приличат на обикновен HTTP POST тригер. Когато нещо се случи в Gogs, ние ще изпратим уведомление до сървъра, който посочите. Научете повече в Ръководство за уеб-куки. +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=Добави уеб-кука 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.redelivery=Redelivery +settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. settings.webhook.request=Заявка settings.webhook.response=Отговор settings.webhook.headers=Заглавки settings.webhook.payload=Съдържание settings.webhook.body=Тяло +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Git куките се изпълняват от Git. Вие може да промените файловете с поддържаните куки в списъка по-долу, за да изпълните външни операции. settings.githook_edit_desc=Ако куката е неактивна, ще бъде представено примерно съдържание. Ако оставите съдържанието празно, то тази кука ще бъде изключена. settings.githook_name=Име на куката @@ -711,6 +825,7 @@ settings.add_webhook_desc=Gogs ще изпрати POST заявк settings.payload_url=URL адрес на изпращане settings.content_type=Тип на съдържанието settings.secret=Тайна +settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. settings.slack_username=Потребителско име settings.slack_icon_url=URL адрес на икона settings.slack_color=Цвят @@ -720,10 +835,20 @@ settings.event_send_everything=При всички събити settings.event_choose=Нека избера от какво имам нужда. settings.event_create=Създаване settings.event_create_desc=Създаване на клон или маркер -settings.event_pull_request=Заявка за сливане -settings.event_pull_request_desc=Заявка за сливане е отворена, затворена, отворена повторно, редактирана, възложена, отменена, при модифициран етикет, при премахнат етикет или е синхронизирана. +settings.event_delete=Изтриване +settings.event_delete_desc=Изтрит клон или етикет +settings.event_fork=Fork +settings.event_fork_desc=Repository forked settings.event_push=Предаване settings.event_push_desc=Git предаване към хранилището +settings.event_issues=Issues +settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned. +settings.event_pull_request=Заявка за сливане +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=Issue Comment +settings.event_issue_comment_desc=Issue comment created, edited, or deleted. +settings.event_release=Release +settings.event_release_desc=Release published in a repository. settings.active=Активна settings.active_helper=Подробности относно събитието, което е задействало куката, също ще бъдат изпратени. settings.add_hook_success=Новата уеб-кука е добавена успешно. @@ -733,10 +858,13 @@ settings.delete_webhook=Изтрий уеб-куката settings.recent_deliveries=Последни изпращания settings.hook_type=Тип на куката settings.add_slack_hook_desc=Добавяне на интеграция със Slack във Вашето хранилище. +settings.add_discord_hook_desc=Добавяне на интеграция с Discord към хранилището. +settings.add_dingtalk_hook_desc=Добавяне на интеграция с Dingtalk към хранилището. settings.slack_token=API ключ settings.slack_domain=Домейн settings.slack_channel=Канал settings.deploy_keys=Ключове за внедряване +settings.deploy_keys_helper=Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. settings.add_deploy_key=Добави ключ за внедряване settings.deploy_key_desc=Този ключ за внедряване има права само за четене. Това не е същото като SSH ключове на персонален потребител. settings.no_deploy_keys=Все още няма настроен никакъв ключ за внедряване. @@ -748,6 +876,8 @@ settings.add_key_success=Новият ключ за внедряване '%s' е settings.deploy_key_deletion=Изтрий ключ за внедряване settings.deploy_key_deletion_desc=При изтриването на този ключ за внедряване ще се премахнат свързаните права за достъп до това хранилище. Желаете ли да продължите? settings.deploy_key_deletion_success=Ключът за внедряване е изтрит успешно! +settings.description_desc=Description of repository. Maximum 512 characters length. +settings.description_length=Available characters diff.browse_source=Преглед на файлове diff.parent=родител @@ -766,7 +896,6 @@ release.releases=Версии release.new_release=Нова версия release.draft=Чернови release.prerelease=Предварителни -release.stable=Стабилни release.edit=редактиране release.ahead=%d ревизии на %s след тази версия release.source_code=Изходен код @@ -813,8 +942,8 @@ team_name_helper=Ще използвате това име при спомена team_desc_helper=Каква е целта на този екип? team_permission_desc=Какво ниво на достъп трябва да има този екип? -form.name_reserved=Името на организацията '%s' е запазено. -form.name_pattern_not_allowed=Име на организацията от вида '%s' не е разрешено. +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=Настройки settings.options=Опции @@ -886,12 +1015,19 @@ first_page=Първа last_page=Последна total=Общо: %d +dashboard.build_info=Build Information +dashboard.app_ver=Application version +dashboard.git_version=Git version +dashboard.go_version=Go version +dashboard.build_time=Build time +dashboard.build_commit=Build commit dashboard.statistic=Статистика dashboard.operations=Операции dashboard.system_status=Наблюдение на системния статус dashboard.statistic_info=Gogs базата данни има %d потребители, %d организации, %d публични ключове, %d хранилища, %d наблюдавания, %d харесвания, %d действия, %d достъпи, %d задачи, %d коментари, %d социални регистрации, %d последователи, %d огледала, %d версии, %d начини на удостоверяване, %d уеб-куки, %d етапи, %d етикети, %d задачи на куки, %d екипи, %d задачи при актуализация, %d прикачени файлове. dashboard.operation_name=Име на операцията dashboard.operation_switch=Превключи +dashboard.select_operation_to_run=Please select operation to run dashboard.operation_run=Изпълни dashboard.clean_unbind_oauth=Почисти несвързани OAuthes dashboard.clean_unbind_oauth_success=Всички несвързани OAuthes са изтрити успешно. @@ -905,8 +1041,8 @@ dashboard.git_gc_repos=Почисти изтрити данни в хранил dashboard.git_gc_repos_success=Всички хранилища са почистени от изтрити данни успешно. dashboard.resync_all_sshkeys=Презапис на ".ssh/authorized_keys" файл (внимание: не-Gogs ключове ще бъдат загубени) dashboard.resync_all_sshkeys_success=Всички публични ключове са презаписани успешно. -dashboard.resync_all_update_hooks=Презапис на всички куки, закачени на актуализация на хранилищата (необходимо, когато се ползва собствен път за конфигурацията) -dashboard.resync_all_update_hooks_success=Всички куки, закачени на актуализация на хранилищата, са презаписани успешно. +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=Реинициализира всички записи за хранилища dashboard.reinit_missing_repos_success=Всички записи за хранилища със загубени Git файлове са реинициализирани успешно. @@ -981,12 +1117,14 @@ repos.private=Частно repos.watches=Наблюдавания repos.stars=Харесвания repos.issues=Задачи +repos.size=Размер -auths.auth_manage_panel=Управление на удостоверявания +auths.auth_sources=Authentication Sources auths.new=Добави нов начин на удостоверяване auths.name=Име auths.type=Тип auths.enabled=Активно +auths.default=Default auths.updated=Последна модификация auths.auth_type=Тип на удостоверяване auths.auth_name=Име на удостоверяване @@ -995,15 +1133,21 @@ auths.domain=Домейн auths.host=Сървър auths.port=Порт auths.bind_dn=Име (DN) за свръзка +auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s auths.bind_password=Парола за свръзка auths.bind_password_helper=Внимание: Тази парола се запазва некриптирана. Моля използвайте потребител, който няма административен достъп. auths.user_base=Базов OU за търсене auths.user_dn=Име (DN) на потребител auths.attribute_username=Атрибут за име auths.attribute_username_placeholder=Оставете празно за да използва потребителското име от форма за вписване. -auths.attribute_name=Атрибут за име +auths.attribute_name=First Name Attribute auths.attribute_surname=Атрибут за фамилия auths.attribute_mail=Атрибут за ел. поща +auths.verify_group_membership=Verify group membership +auths.group_search_base_dn=Group Search Base DN +auths.group_filter=Group Filter +auths.group_attribute_contain_user_list=Group Attribute Containing List of Users +auths.user_attribute_listed_in_group=User Attribute Listed in Group auths.attributes_in_bind=Извличане на атрибути от контекста на име (DN) за свръзка auths.filter=Филтър за потребител auths.admin_filter=Филтър за администратор @@ -1017,9 +1161,9 @@ 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.default_auth=This authentication is default login source auths.new_success=Новото удостоверяване '%s' е добавено успешно. auths.update_success=Настройките за удостоверяване са запазени успешно. auths.update=Запази настройки за удостоверяване @@ -1028,107 +1172,189 @@ auths.delete_auth_title=Изтрий удостоверяването auths.delete_auth_desc=Това удостоверяване ще бъде изтрито. Желаете ли да продължите? auths.still_in_used=Това удостоверяване все още се използва от някои потребители. Моля изтрийте ги или ги конвертирайте до друг тип на влизане първо. auths.deletion_success=Удостоверяването е изтрито успешно! +auths.login_source_exist=Източник за валидация на потребители "%s" вече съществува. +auths.github_api_endpoint=API Endpoint +config.not_set=(not set) config.server_config=Сървърни настройки -config.app_name=Име на приложението -config.app_ver=Версия на приложението -config.app_url=URL адрес на приложението -config.domain=Домейн -config.offline_mode=Офлайн режим -config.disable_router_log=Изключи журнал на маршрутизатора +config.brand_name=Brand name config.run_user=Потребителски контекст config.run_mode=Режим на изпълнение -config.repo_root_path=Основен път към хранилища -config.static_file_root_path=Път към статични файлове -config.log_file_root_path=Път към журнал -config.script_type=Тип на скрипта -config.reverse_auth_user=Потребителско име при обратно удостоверяване +config.server.external_url=External URL +config.server.domain=Domain +config.server.protocol=Protocol +config.server.http_addr=HTTP address +config.server.http_port=HTTP port +config.server.cert_file=Certificate file +config.server.key_file=Key file +config.server.tls_min_version=Minimum TLS version +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Enable Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL config.ssh_config=SSH конфигурация -config.ssh_enabled=Активен -config.ssh_start_builtin_server=Стартирай вграден сървър -config.ssh_domain=Домейн -config.ssh_port=Порт -config.ssh_listen_port=Порт за слушане -config.ssh_root_path=Основен път -config.ssh_key_test_path=Път до ключове -config.ssh_keygen_path=Път до генератор ('ssh-keygen') -config.ssh_minimum_key_size_check=Проверка за минимален размер на ключове -config.ssh_minimum_key_sizes=Минимален размер на ключове +config.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Конфигурация на хранилище +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=Настройки на базата данни -config.db_type=Тип -config.db_host=Сървър -config.db_name=Име -config.db_user=Потребител -config.db_ssl_mode=SSL режим -config.db_ssl_mode_helper=(само за postgres) -config.db_path=Път -config.db_path_helper=(за "sqlite3" и "tidb") - -config.service_config=Настройка на услугата -config.register_email_confirm=Изисквай потвърждение на адреси на ел. поща -config.disable_register=Изключи нови регистрации -config.show_registration_button=Покажи бутон за регистрация -config.require_sign_in_view=Изисквай вписване за преглед -config.mail_notify=Уведомяване по ел. поща -config.disable_key_size_check=Изключи проверка минимален размер на ключ -config.enable_captcha=Включи Captcha -config.active_code_lives=Кодове за активиране -config.reset_password_code_lives=Кодове за изчистване на парола +config.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -config.webhook_config=Конфигурация на уеб-куки -config.queue_length=Дължина на опашка -config.deliver_timeout=Време за отказ при изпращане -config.skip_tls_verify=Пропусни проверка на TLS - -config.mailer_config=Конфигурация на мейлър -config.mailer_enabled=Активен -config.mailer_disable_helo=Изключи HELO -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 конфигурация -config.oauth_enabled=Активна +config.session_config=Конфигурация на сесии +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Конфигурация на кеша -config.cache_adapter=Кеш адаптер -config.cache_interval=Кеш интервал -config.cache_conn=Кеш на връзката - -config.session_config=Конфигурация на сесии -config.session_provider=Доставчик на сесии -config.provider_config=Конфигурация на доставчик -config.cookie_name=Име на бисквитката -config.enable_set_cookie=Включи използване на бисквитки -config.gc_interval_time=GC през интервал -config.session_life_time=Период на валидност на сесиите -config.https_only=HTTPS само -config.cookie_life_time=Период на валидност на бисквитките +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=Конфигуриране на HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Конфигурация на изображения -config.picture_service=Услуги за снимки -config.disable_gravatar=Изключи Gravatar -config.enable_federated_avatar=Включи външни аватари +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Конфигурация на уеб-куки +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify config.git_config=Конфигурация на git -config.git_disable_diff_highlight=Забрани оцветяване на синтаксис при преглед на разлики -config.git_max_diff_lines=Максимален брой различни редове (за файл) -config.git_max_diff_line_characters=Максимален брой различни символи (на ред) -config.git_max_diff_files=Максимален брой променени файлове (при показване) -config.git_gc_args=Аргументи на GC -config.git_migrate_timeout=Време за отказ при миграция -config.git_mirror_timeout=Време за отказ при синхр. на огледало -config.git_clone_timeout=Време за отказ при клониране -config.git_pull_timeout=Време за отказ при сливане -config.git_gc_timeout=Време за отказ при GC +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path config.log_config=Конфигурация на журнал -config.log_mode=Режим на журнал +config.log_file_root_path=Път към журнал +config.log_mode=Режим +config.log_options=Настройки monitor.cron=Cron задачи monitor.name=Име @@ -1159,17 +1385,24 @@ notices.delete_success=Системните съобщения са изтрит create_repo=създаде хранилище %s rename_repo=преименува хранилище от %[1]s на %[3]s commit_repo=предаде към %[3]s в %[4]s +compare_commits=Сравнение между тези %d ревизии +transfer_repo=прехвърли хранилище %s към %s create_issue=`отвори задача %s#%[2]s"` close_issue=`затвори %s#%[2]s` reopen_issue=`повторно отвори %s#%[2]s` +comment_issue=`коментира задача %s#%[2]s"` create_pull_request=`създаде заявка за сливане %s#%[2]s` close_pull_request=`затвори заявка за сливане %s#%[2]s` reopen_pull_request=`повторно отвори заявка за сливане %s#%[2]s` -comment_issue=`коментира задача %s#%[2]s"` merge_pull_request=`обедини заявка за сливане %s#%[2]s` -transfer_repo=прехвърли хранилище %s към %s +create_branch=създаде клон %[3]s % [4]s +delete_branch=изтри клон %[2]s % [3]s push_tag=предаде маркер %[2]s към [3]s -compare_commits=Сравнение между тези %d ревизии +delete_tag=изтри етикет %[2]s % [3]s +fork_repo=forked a repository to %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror [tool] ago=преди @@ -1191,6 +1424,7 @@ months=%[2]s %[1]d месеца years=%[2]s %[1]d години raw_seconds=секунди raw_minutes=минути +raw_hours=hours [dropzone] default_message=Тук пуснете файлове с влачене или просто щракнете за избор на файл за качване. diff --git a/conf/locale/locale_cs-CZ.ini b/conf/locale/locale_cs-CZ.ini index 73182b081f8..b6c8c7240d8 100644 --- a/conf/locale/locale_cs-CZ.ini +++ b/conf/locale/locale_cs-CZ.ini @@ -1,4 +1,4 @@ -app_desc=Bezbolestná soukromá Git služba +app_desc=Snadná soukromá služba Git home=Domů dashboard=Přehled @@ -9,16 +9,15 @@ sign_out=Odhlásit se sign_up=Registrovat se register=Registrovat se website=Webové stránky -version=Verze page=Strana template=Šablona language=Jazyk -create_new=Vytořit... +create_new=Vytvořit... user_profile_and_more=Uživatelský profil a další signed_in_as=Přihlášen jako username=Uživatelské jméno -email=E-Mail +email=E-mail password=Heslo re_type=Znovu zadat captcha=CAPTCHA @@ -27,7 +26,7 @@ repository=Repozitář organization=Organizace mirror=Zrcadlo new_repo=Nový repozitář -new_migrate=Nová migrace +new_migrate=Nové přenesení new_mirror=Nové zrcadlo new_fork=Nový repositář rozštěpení new_org=Nová organizace @@ -39,28 +38,32 @@ your_profile=Váš profil your_settings=Vaše nastavení activities=Aktivity -pull_requests=Požadavek na natažení +pull_requests=Požadavky na natažení issues=Úkoly cancel=Zrušit +[status] +page_not_found=Page Not Found +internal_server_error=Internal Server Error + [install] install=Instalace -title=Kroky instalace pro první běh +title=Kroky instalace pro první spuštění docker_helper=Spouštíte-li Gogs 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=Gogs vyžaduje MySQL, PostgreSQL, SQLite3 nebo TiDB. +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title=Nastavení databáze db_type=Typ databáze -host=Hostitel +host=Server 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 +db_schema=Schema +db_helper=Prosím, pro MySQL použijte INNODB engine se znakovou sadou utf8_general_ci. +ssl_mode=SSL režim 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 "-". +sqlite_helper=Cesta k SQLite3 databázi.
Prosím, použijte absolutní cestu, pokud startujete Gogs jako službu. +err_empty_db_path=Cesta k SQLite3 databázi nemůže být prázdná. 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é. @@ -75,12 +78,17 @@ 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. +use_builtin_ssh_server=Použít vestavěný SSH server +use_builtin_ssh_server_popup=Pro Git operace spustit vestavěný SSH server, aby byl rozpoznán od systémové SSH služby. 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. +log_root_path=Adresář systémových záznamů +log_root_path_helper=Adresář, kam se budou zapisovat soubory se systémovými záznamy. +enable_console_mode=Povolit režim konzole +enable_console_mode_popup=Mimo zápisu do souboru vytisknout systémové záznamy i do konzole. +default_branch=Default Branch optional_title=Dodatečná nastavení email_title=Nastavení e-mailové služby @@ -92,17 +100,17 @@ 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=Povolit 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=Enable Federated Avatars Lookup -federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. -disable_registration=Vypnout možnost se zaregistrovat -disable_registration_popup=Vypnout možnost registrace, pouze správce může vytvořit účty. +federated_avatar_lookup=Povolit vyhledání ikon uživatelů z veřejných zdrojů +federated_avatar_lookup_popup=Povolit vyhledání ikon uživatelů z veřejných zdrojů pro využití služeb založených na libravatar. +disable_registration=Vypnout možnost uživatelské registrace +disable_registration_popup=Vypnout možnost uživatelské zaregistrovat, pouze správce může vytvořit účty. 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=Povolit 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 @@ -112,14 +120,17 @@ confirm_password=Potvrdit heslo admin_email=E-mailová adresa správce install_gogs=Nainstalovat Gogs test_git_failed=Chyba při testu příkazu 'git': %v -sqlite3_not_available=Vaše verze vydání Gogs nepodporuje SQLite3, prosíme stáhněte si oficiální binární balíček z %s, ne gobuild verzi. +sqlite3_not_available=Vaše verze vydání Gogs nepodporuje SQLite3, prosím 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 +smtp_host_missing_port=V adrese SMTP serveru chybí číslo portu. +invalid_smtp_from=Hodnota položky SMTP Od: není zadána správně: %v save_config_failed=Uložení konfigurace se nezdařilo: %v +init_failed=Nepodařilo se inicializovat aplikaci: %v invalid_admin_setting=Nastavení účtu správce není správné: %v install_success=Vítejte! Jsme rádi, že jste si vybrali Gogs. Bavte se a opatrujte se. -invalid_log_root_path=Kořenový adresář logů není správný: %v +invalid_log_root_path=Kořenový adresář souborů systémových záznamů není správný: %v [home] uname_holder=Uživatelské jméno nebo e-mailová adresa @@ -137,38 +148,48 @@ issues.in_your_repos=Ve vašich repositářích [explore] repos=Repositáře users=Uživatelé +organizations=Organizace search=Vyhledat [auth] create_new_account=Vytvořit nový účet register_hepler_msg=Již máte účet? Přihlašte se! social_register_hepler_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. +disable_register_prompt=Omlouváme se, ale registrace jsou vypnuty. Kontaktujte správce systému. +disable_register_mail=Omlouváme se, ale e-mailové služby jsou vypnuté. Kontaktujte správce systému. +auth_source=Zdroj ověření +local=Lokální 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. +confirmation_mail_sent_prompt=Na adresu %s byl zaslán nový potvrzovací e-mail. Zkontrolujte prosím vaši doručenou poštu během následujících %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 +prohibit_login_desc=Vašemu účtu je zakázáno se přihlásit, kontaktujte prosím správce serveru. +resent_limit_prompt=Omlouváme se, ale před chvílí jste požádal o zaslání aktivačního e-mailu. Počkejte prosím 3 minuty a pak to zkuste znovu. +has_unconfirmed_mail=Zdravím, %s, máte nepotvrzenou e-mailovou adresu (%s). Pokud jste nedostali potvrzovací e-mail nebo potřebujete zaslat nový, klikněte prosím na tlačítko níže. +resend_mail=Klikněte zde pro opakované odeslání aktivačního e-mailu +send_reset_mail=Klikněte zde pro (opakované) odeslání e-mailu pro obnovu 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ý. +invalid_code=Omlouváme se, ale kód z vašeho potvrzovacího e-mailu už 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ě 6 znaků. -non_local_account=Non-local accounts cannot change passwords through Gogs. +non_local_account=Externí účty nemohou měnit hesla přes Gogs. + +login_two_factor=Dvoufaktorové ověření +login_two_factor_passcode=Přístupový kód ověření +login_two_factor_enter_recovery_code=Zadejte obnovovací kód dvoufaktorového ověření +login_two_factor_recovery=Obnovení dvoufaktorového ověření +login_two_factor_recovery_code=Obnovovací kód +login_two_factor_enter_passcode=Zadejte přístupový kód dvoufaktorového ověření +login_two_factor_invalid_recovery_code=Obnovovací kód již byl použit nebo není platný. [mail] -activate_account=Prosíme, aktivujte si váš účet +activate_account=Prosím, 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_success=Vítejte, váš účet byl zaregistrován register_notify=Vítejte [modal] @@ -182,7 +203,7 @@ RepoName=Název repositáře Email=E-mailová adresa Password=Heslo Retype=Zadejte znovu heslo -SSHTitle=Název klíče SSH +SSHTitle=Název SSH klíče HttpsUrl=HTTPS URL PayloadUrl=URL nákladu TeamName=Název týmu @@ -197,17 +218,18 @@ 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.` +alpha_dash_error=` smí obsahovat pouze písmena, číslice, pomlčku a podtržítko.` +alpha_dash_dot_error=` smí obsahovat pouze písmena, číslice, tečku, čárku, pomlčku a podtržítko.` +alpha_dash_dot_slash_error=` smí obsahovat pouze písmena, číslice, tečku, čárku, pomlčku, podtržítko a lomítko.` +size_error=` musí mít velikost %s.` min_size_error=` musí obsahovat nejméně %s znaků.` max_size_error=` musí obsahovat maximálně %s znaků.` -email_error=` není správná e-mailová adresa.` -url_error=` není správná URL.` +email_error=` není platná e-mailová adresa.` +url_error=` není platná 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é. +password_not_match=Heslo a jeho potvrzení se neshodují. username_been_taken=Uživatelské jméno je již obsazeno. repo_name_been_taken=Název repositáře je již obsazen. @@ -215,26 +237,27 @@ 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. +auth_source_mismatch=Vybraný zdroj ověření není propojen s uživatelem. 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. +last_org_owner=Odstranění posledního uživatele z týmu vlastníků není dovoleno, protože každá organizace musí mít alespoň jednoho vlastníka. -invalid_ssh_key=Omlouváme se, ale není možné ověřit váš klíč SSH: %s -unable_verify_ssh_key=Gogs nemohl ověřit váš klíč SSH, ale předpokládáme, že je platný, nicméně zkontrolujte jej prosím. +invalid_ssh_key=Omlouváme se, ale váš SSH klíč není možné ověřit: %s +unable_verify_ssh_key=Gogs nemohl ověřit váš SSH klíč, ale budeme předpokládat, že je platný. Přesto ho prosím zkontrolujte. 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í. +still_own_repo=Váš účet stále vlastní nějaké repositáře. Nejdříve je musíte smazat nebo někomu předat. +still_has_org=Váš účet je stále členem nějaké organizace. Je nutné ji nejdříve opustit nebo se vzdát č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. [user] change_avatar=Změnit vaši uživatelskou ikonu -join_on=Připojil se dne -repositories=Repositáře +join_on=Zaregistroval se dne +repositories=Repozitáře activity=Veřejná aktivita followers=Sledující starred=Oblíbené repositáře @@ -242,19 +265,18 @@ 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. +form.name_not_allowed=User name or pattern %q is not allowed. [settings] profile=Profil password=Heslo avatar=Uživatelská ikona -ssh_keys=Klíče SSH -social=Sociální účty -applications=Aplikace +ssh_keys=SSH klíče +security=Bezpečnost +repos=Repositáře orgs=Organizace +applications=Aplikace 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. @@ -263,17 +285,17 @@ 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. +update_profile_success=Váš profil byl 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 lookup_avatar_by_mail=Vyhledávat uživatelskou ikonu podle emailu -federated_avatar_lookup=Federated Avatar Lookup +federated_avatar_lookup=Vyhledání ikon uživatelů ve veřejných zdrojích enable_custom_avatar=Povolit uživatelskou ikonu uživatele choose_new_avatar=Vybrat novou ikonu uživatele -update_avatar=Aktualizovat nastavení ikony uživatele +update_avatar=Změnit 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. @@ -281,9 +303,9 @@ 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 +retype_new_password=Zadat znovu nové 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. +change_password_success=Vaše heslo bylo 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 @@ -294,48 +316,81 @@ 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! +email_deletion_success=E-mailová adresa byla smazána! +email_deletion_primary=Cannot delete primary email address. 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. +add_email_confirmation_sent=Nový potvrzovací e-mail byl odeslán na adresu '%s', prosím 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 přidána. -manage_ssh_keys=Správa klíčů SSH +manage_ssh_keys=Správa SSH klíčů 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_desc=Toto je seznam SSH klíčů vašeho účtu. Jelikož SSH klíče umožňují komukoliv plný přístup k vašim repositářům, je velmi důležité, abyste si byli jistí, že jsou skutečně vaše. +ssh_helper=Nevíte jak? Podívejte se do příručky GitHubu jak si vytvořit vlastní SSH klíč, nebo na řešení častých problémů, na které můžete narazit při používání SSH. +add_new_key=Přidat SSH klíč 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! +add_key_success=Byl přidán nový SSH klíč '%s'! 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 +ssh_key_deletion=Smazání SSH klíče +ssh_key_deletion_desc=Smazání tohoto klíče SSH odstraní všechny související přístupy k vašemu účtu. Chcete pokračovat? +ssh_key_deletion_success=SSH klíč byl úspěšně smazán! +add_on=Přidán dne +last_used=Naposledy použit 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. +two_factor=Dvoufaktorové ověření +two_factor_status=Stav: +two_factor_on=Zapnuto +two_factor_off=Vypnuto +two_factor_enable=Povoleno +two_factor_disable=Zakázáno +two_factor_view_recovery_codes=Uložte vaše obnovovací kódy na bezpečném místě. Můžete je použít jako přístupové kódy v případě, kdy ztratíte přístup k vaší ověřovací aplikaci. +two_factor_http=Již nebudete mít možnost použít vaše přihlašovací údaje pro operace přes HTTP/HTTPS. Prosíme, vytvořte a používejte osobní přístupové poukázky jako vaše přístupové údaje, např. %[3]s. +two_factor_enable_title=Povolit dvoufaktorové ověřování +two_factor_scan_qr=Prosím, použijte vaši ověřovací aplikaci pro naskenování tohoto obrázku: +two_factor_or_enter_secret=Nebo zadejte tajný kód: +two_factor_then_enter_passcode=Pak zadejte přístupový kód: +two_factor_verify=Ověřit +two_factor_invalid_passcode=Zadaný přístupový kód není platný, prosím, zkuste to znova! +two_factor_reused_passcode=Kód, který jste zadali už byl použit. Prosím, zkuste jiný! +two_factor_enable_error=Povolení dvoufaktorového ověření selhalo: %v +two_factor_enable_success=Dvoufaktorové ověření bylo pro váš účet povoleno! +two_factor_recovery_codes_title=Obnovovací kódy dvoufaktorového ověření +two_factor_recovery_codes_desc=Obnovovací kódy se používají, když dočasně ztratíte přístup k vaší ověřovací aplikaci. Každý obnovovací kód může být použit pouze jednou, prosím, uchovejte tyto kódy na bezpečném míste. +two_factor_regenerate_recovery_codes=Vygenerovat znovu obnovovací kódy +two_factor_regenerate_recovery_codes_error=Vygenerování obnovovacích kódů selhalo: %v +two_factor_regenerate_recovery_codes_success=Nové obnovovací kódy byly vygenerovány! +two_factor_disable_title=Zakázat dvoufaktorové ověření +two_factor_disable_desc=Úroveň zabezpečení vaše účtu se s vypnutím dvoufaktorového ověření sníží. Chcete pokračovat? +two_factor_disable_success=Dvoufaktorové ověření bylo zakázáno! 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 Gogs API. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. 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é! +generate_token_succees=Vaše přístupová poukázka byl vygenerována. 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. +access_token_deletion_desc=Smazáním této osobní přístupové poukázky odstraní všechen související přístup aplikace. Chcete pokračovat? +delete_token_success=Osobní přístupová poukázka byla odstraněna! Nezapomeňte také změnit nastavení vaší aplikace. +token_name_exists=Poukázka se stejným jménem již existtuje. + +orgs.none=Nejste členem žádné organizace. +orgs.leave_title=Opustit organizaci +orgs.leave_desc=Opuštěním organizace ztratíte přístup do všech jejích repositářů a k jejích týmům. Chcete pokračovat? + +repos.leave=Opustit +repos.leave_title=Opustit repositář +repos.leave_desc=Potom, co opustíte repositář, ztratíte k němu přístup. Chcete pokračovat? +repos.leave_success=Opustil jste repositář '%s'! delete_account=Smazat váš účet delete_prompt=Tato operace permanentně smaže váš účet a tato změna nemůže být vrácena! @@ -348,7 +403,9 @@ 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 +unlisted=Unlisted visiblity_helper=Tento repositář je soukromý +unlisted_helper=This repository is Unlisted 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! @@ -362,11 +419,11 @@ license=Licence license_helper=Vyberte licenční soubor readme=Soubor README readme_helper=Vyberte šablonu souboru README -auto_init=Inicializovat tento repositář s vybranými soubory a šablonou +auto_init=Založit 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=Remove any remote-tracking references that no longer exist on the remote +mirror_prune_desc=Odstranit odkazy sledování vzdálených větví, které již ve vzdáleném repositář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. @@ -374,24 +431,26 @@ mirror_last_synced=Naposledy synchronizováno watchers=Sledující stargazers=Sledující forks=Rozštěpení +repo_description_helper=Popis repozitáře. Maximální délka 512 znaků. +repo_description_length=Dostupné znaky 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. +form.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=Ověření je vyžadováno -migrate_type=Typ migrace +migrate_type=Typ přenesení migrate_type_helper=Tento repositář bude zrcadlem migrate_repo=Přenést repositář migrate.clone_address=Naklonovat adresu -migrate.clone_address_desc=Tím může být HTTP/HTTPS/GIT URL nebo cesta k lokálnímu serveru. -migrate.permission_denied=Není dovoleno importovat místní repositáře. +migrate.clone_address_desc=Toto může být HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=Máte povoleno přenést repositář pomocí lokální cesty na serveru. +migrate.permission_denied=Není vám dovoleno importovat místní repositáře. migrate.invalid_local_path=Neplatná místní cesta, buď neexistuje nebo není adresářem. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Přenesení selhalo: %v mirror_from=zrcadlo forked_from=rozštěpen z -fork_from_self=Nemůžete rozštěpit repositář, který již vlastníte! copy_link=Kopie copy_link_success=Zkopírováno! copy_link_error=Pro zkopírování stiskněte ⌘-C nebo Ctrl-C @@ -406,26 +465,37 @@ 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! +push_exist_repo=Odeslat existující repositář z příkazové řádky +bare_message=Tento repositář ještě nemá obsah. -code=Zdrojový kód +files=Soubory branch=Větev tree=Strom filter_branch_and_tag=Filtr pro větev nebo značku branches=Větve tags=Značky issues=Úkoly -pulls=Požadavky na natažení +pulls=Pull Requesty labels=Štítky -milestones=Mezníky +milestones=Milníky commits=Revize +git_branches=Větve releases=Vydání file_raw=Surový file_history=Historie file_view_raw=Zobrazit v surovém stavu file_permalink=Trvalý odkaz file_too_large=Tento soubor je příliš velký pro zobrazení +video_not_supported_in_browser=Váš prohlížeč nepodporuje značku pro HTML5 video. + +branches.overview=Přehled +branches.active_branches=Aktivní větve +branches.stale_branches=Zastaralé větve +branches.all=Všechny větve +branches.updated_by=%[2]s změnil %[1]s +branches.change_default_branch=Změnit výchozí větev +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Nový soubor editor.upload_file=Nahrát soubor @@ -434,37 +504,40 @@ 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 -editor.delete_this_file=Odstranit tento soubor +editor.fork_before_edit=Musíte provést rozštěpení repositáře před úpravou souboru +editor.delete_this_file=Smazat tento soubor editor.must_have_write_access=Musíte mít přístup pro zápis pro dělání či navrhování změn tohoto souboru -editor.file_delete_success=Soubor '%s' byl úspěšně odstraněn! +editor.file_delete_success=Soubor '%s' byl smazán! editor.name_your_file=Pojmenujte váš soubor... -editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. +editor.filename_help=Pro vložení adresáře prostě napište jméno a přidejte /. K odstranění adresáře běžte na začátek pole a stiskněte backspace. editor.or=nebo editor.cancel_lower=zrušit -editor.commit_changes=Uložit změny revize +editor.commit_changes=Zapsat změny revize editor.add_tmpl=Přidat '%s/' editor.add=Přidat '%s' -editor.update=Aktualizovat "%s" +editor.update=Změnit "%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. -editor.create_new_branch=Vytvořit novou větev pro tuto revizi a spustit požadavek na stažení. +editor.commit_directly_to_this_branch=Zapište změny revize přímo do větve %s. +editor.create_new_branch=Vytvořit novou větev pro tuto revizi a vytvořit požadavek na natažení. editor.new_branch_name_desc=Nový název větve... editor.cancel=Zrušit editor.filename_cannot_be_empty=Název souboru nemůže být prázdný. editor.branch_already_exists=Repositář větev '%s' již obsahuje. -editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. -editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. -editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. -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=A file with name '%s' already exists in this repository. -editor.no_changes_to_show=There are no changes to show. -editor.fail_to_update_file=Failed to update/create file '%s' with error: %v +editor.directory_is_a_file=Položka '%s' v nadřazené cestě je v tomto repositáři soubor, ne adresář. +editor.file_is_a_symlink=Soubor '%s' je symbolický odkaz a nemůže být změněn pomocí webového editoru. +editor.filename_is_a_directory=Jméno souboru '%s' v tomto repositáři koliduje se jménem adresáře. +editor.file_editing_no_longer_exists=Soubor '%s', který upravujete, již v tomto repositáři neexistuje. +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 Znovu zapsat změny pro přepsání změn. +editor.file_already_exists=Soubor '%s' již v tomto repositáři existuje. +editor.no_changes_to_show=Žádné změny k zobrazení. +editor.fail_to_update_file=Vytvoření nebo změna souboru '%s' skončila chybou: %v +editor.fail_to_delete_file=Nepodařilo se smazat soubor '%s' kvůli chybě: %v editor.add_subdir=Přidat podadresář... -editor.unable_to_upload_files=Nepodařilo se nahrát soubor '%s'. Chyba: %v +editor.unable_to_upload_files=Nepodařilo se nahrát soubor do '%s'. Chyba: %v editor.upload_files_to_dir=Nahrát soubory do '%s' +commits.commit_history=Historie revizí commits.commits=Revize commits.search=Hledání revizí commits.find=Hledat @@ -491,7 +564,7 @@ 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.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 @@ -511,16 +584,16 @@ issues.filter_type.mentioning_you=Zmiňující vás issues.filter_sort=Seřadit issues.filter_sort.latest=Nejnovější issues.filter_sort.oldest=Nejstarší -issues.filter_sort.recentupdate=Nedávno aktualizované -issues.filter_sort.leastupdate=Nejdřívější změny +issues.filter_sort.recentupdate=Nedávno změněné +issues.filter_sort.leastupdate=Poslední změny issues.filter_sort.mostcomment=Nejvíce komentované issues.filter_sort.leastcomment=Nejméně komentované issues.opened_by=otevřeno %[1]s uživatelem %[3]s issues.opened_by_fake=otevřeno %[1]s uživatelem %[2]s issues.previous=Předchozí issues.next=Další -issues.open_title=otevřený -issues.closed_title=zavřený +issues.open_title=Otevřený +issues.closed_title=Zavřený issues.num_comments=%d komentářů issues.commented_at=`okomentoval %s` issues.delete_comment_confirm=Jste si jist, že chcete smazat tento komentář? @@ -536,7 +609,7 @@ issues.commit_ref_at=`odkázal na tento úkol z revize Přihlašte se pro zapojení do konverzace. +issues.sign_in_require_desc=Přihlaste se pro zapojení do konverzace. issues.edit=Upravit issues.cancel=Zrušit issues.save=Uložit @@ -549,19 +622,20 @@ 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.label_deletion_success=Štítek byl 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"` pulls.new=Nový požadavek na natažení pulls.compare_changes=Porovnat změny -pulls.compare_changes_desc=Porovnat dvě větve a vytvořit pro změny žádost na natažení. -pulls.compare_base=základní +pulls.compare_changes_desc=Porovnat dvě větve a vytvořit pro změny požadavek na natažení. +pulls.compare_base=základ pulls.compare_compare=porovnat pulls.filter_branch=Filtrovat větev pulls.no_results=Nebyly nalezeny žádné výsledky. -pulls.nothing_to_compare=Není co porovnávat, protože základní a hlavní větve jsou shodné. +pulls.nothing_to_compare=Není co porovnávat, protože základ a hlavní větve jsou shodné. +pulls.nothing_merge_base=Není co porovnávat, protože tyto dvě větve mají úplně jinou historii. pulls.has_pull_request=`Požadavek na natažení mezi těmito větvemi již existuje: %[2]s#%[3]d` pulls.create=Vytvořit požadavek na natažení pulls.title_desc=chce sloučit %[1]d revizí z větve %[2]s do větve %[3]s @@ -569,22 +643,27 @@ 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.reopen_to_merge=Prosím, znovuotevřete 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.has_merged=Tento požadavek na natažení byl sloučen! +pulls.data_broken=Data tohoto požadavku na natažení byla narušena z důvodu smazání informace o rozštěpení. +pulls.is_checking=Kontrola rozporů stále pokračuje, prosím 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).` +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í rozpory. +pulls.cannot_auto_merge_helper=Prosím proveďte sloučení ručně, aby byly vyřešeny rozpory. +pulls.create_merge_commit=Vytvořit slučovací commit +pulls.rebase_before_merging=Rebase před slučováním +pulls.commit_description=Popis Commitu +pulls.merge_pull_request=Sloučit požadavek na natažení +pulls.open_unmerged_pull_exists=`Nemůžete znovuotevřít požadavek na natažení, neboť požadavek na natažení ze stejného repositáře se stejnými informacemi pro sloučení již existuje (#%d) a čeká na sloučení.` +pulls.delete_branch=Smazat větev +pulls.delete_branch_has_new_commits=Větev nemůže být smazána, neboť po sloučení jsou v ní nové revize. milestones.new=Nový milník milestones.open_tab=%d otevřených milestones.close_tab=%d zavřených -milestones.closed=Zavřen dne %s -milestones.no_due_date=Bez lhůty dokončení +milestones.closed=Zavřen %s +milestones.no_due_date=Bez termínu dokončení milestones.open=Otevřít milestones.close=Zavřít milestones.new_subheader=Vytvořte milníky k organizaci vašich úkolů. @@ -593,34 +672,34 @@ milestones.title=Název milestones.desc=Popis milestones.due_date=Termín (volitelný) 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.invalid_due_date_format=Formát data termínu je neplatný, musí být 'rrrr-mm-dd'. +milestones.create_success=Milník '%s' byl vytvořen! milestones.edit=Upravit milník -milestones.edit_subheader=Zadejte lepší popis milníků, aby lidé nebyli zmateni. +milestones.edit_subheader=Zadejte lepší popis milníků pro snazší orientaci ostatních. milestones.cancel=Zrušit milestones.modify=Změnit milník -milestones.edit_success=Změny milníku '%s' byly úspěšně uloženy! +milestones.edit_success=Změny milníku '%s' byly 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! +milestones.deletion_desc=Smazání tohoto milníku jej smaže také ze všech návazných úkolů. Chcete pokračovat? +milestones.deletion_success=Milník byl smazán! wiki=Wiki 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.welcome_desc=Wiki je místo pro vaši společnou dokumentaci projektu a návody, 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.default_commit_message=Napište (volitelnou) poznámku k této změně. 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.edit_page_button=Upravit 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 +wiki.last_updated=Naposledy změněné: %s settings=Nastavení settings.options=Možnosti @@ -629,6 +708,29 @@ settings.collaboration.admin=Správce settings.collaboration.write=Zápis settings.collaboration.read=Čtení settings.collaboration.undefined=Neurčeno +settings.branches=Větve +settings.branches_bare=Nemůžete spravovat větve pro holý repositář. Prosím, odešlete nejdříve nějaký obsah. +settings.default_branch=Výchozí větev +settings.default_branch_desc=Výchozí větev je považována za "hlavní" větev pro zápisy změn revizí, požadavky na natažení a on-line úpravy. +settings.update=Změnit +settings.update_default_branch_unsupported=Změna výchozí větve není podporována verzí Gitu, která je na serveru. +settings.update_default_branch_success=Výchozí větev tohoto repositáře byla změněna! +settings.protected_branches=Chráněné větve +settings.protected_branches_desc=Ochrana větví před vynuceným odesláním, náhodným smazáním a uživateli na schváleném seznamu. +settings.choose_a_branch=Vyberte větev... +settings.branch_protection=Ochrana větví +settings.branch_protection_desc=Prosím vyberte možnosti ochrany větve %s. +settings.protect_this_branch=Chránit tuto větev +settings.protect_this_branch_desc=Vypnout vynucená odeslání a zabránit smazání. +settings.protect_require_pull_request=Vyžaduje požadavek na natažení místo přímého odeslání +settings.protect_require_pull_request_desc=Tato možnost zakáže přímé odeslání do větve. Revize musí být odeslány do jiné nechráněné větve a sloučeny do této větvě pomocí požadavku na natažení. +settings.protect_whitelist_committers=Seznam uživatelů, kteří mohou odesílat do této větve +settings.protect_whitelist_committers_desc=Přidejte uživatele a týmy, které mají povolení odesílat do této větve. Tito uživatelé mohou obejít kontrolu na požadavek na natažení. +settings.protect_whitelist_users=Uživatelé, kteří mohou odesílat do této větvě +settings.protect_whitelist_search_users=Vyhledat uživatele +settings.protect_whitelist_teams=Týmy, jejichž členové mohou odesílat do této větve +settings.protect_whitelist_search_teams=Vyhledat týmy +settings.update_protect_branch_success=Možnosti ochrany této větve byly změněny! settings.hooks=Webové háčky settings.githooks=Háčky Gitu settings.basic_settings=Základní nastavení @@ -641,44 +743,51 @@ settings.change_reponame_prompt=Tato změna ovlivní vztah odkazů k repositář settings.advanced_settings=Pokročilá nastavení settings.wiki_desc=Povolit systém Wiki settings.use_internal_wiki=Použít vestavěný systém Wiki +settings.allow_public_wiki_desc=Povolit veřejný přístup k wiki, přestože se jedná o soukromý repositář settings.use_external_wiki=Používat externí Wiki settings.external_wiki_url=URL externí Wiki -settings.external_wiki_url_desc=Návštěvníci budou při kliknutí na záložku přesměrování na tuto URL. +settings.external_wiki_url_desc=Návštěvníci budou po kliknutí na danou záložku přesměrováni na tuto URL. settings.issues_desc=Povolit systém úkolů settings.use_internal_issue_tracker=Povolit věstavěný odlehčený systém úkolů +settings.allow_public_issues_desc=Povolit veřejný přístup k úkolům, přestože se jedná o soukromý repositář settings.use_external_issue_tracker=Použít externí systém úkolů +settings.external_tracker_url=URL externí evidence úkolů +settings.external_tracker_url_desc=Návštěvníci budou po kliknutí na danou záložku přesměrováni na tuto URL. settings.tracker_url_format=Formát URL externího systému úkolů -settings.tracker_issue_style=Styl pojmenování externího systému úkolů: +settings.tracker_issue_style=Styl pojmenování úkolů v externím systému úkolů: settings.tracker_issue_style.numeric=Číselný settings.tracker_issue_style.alphanumeric=Alfanumerický -settings.tracker_url_format_desc=Můžete použít zástupné výrazy {user} {repo} {index} pro uživatelské jméno, název repositáře a index úkolu. -settings.pulls_desc=Povolit požadavky na stažení, aby veřejné příspěvky mohly být akceptovány +settings.tracker_url_format_desc=Můžete použít zástupné výrazy {user} {repo} {index} pro uživatelské jméno, název repositáře a číslo úkolu. +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Ignorovat změny v netisknutelných znacích +settings.pulls.allow_rebase_merge=Povolit použití rebase pro sloučení revizí 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.cannot_fork_to_same_owner=Nemůžete rozštěpit repositář jejímu vlastníkovi. +settings.new_owner_has_same_repo=Nový vlastník již repositář se stejným názvem má. Vyberte, prosím, 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.convert_succeed=Repositář byl 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_notices_2=- Přístup vám bude zachován, pokud nový vlastník je organizace a vy jste jedním z jejích 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.wiki_deletion_success=Data Wiki tohoto repositáře byla 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=- All forks will become independent after deletion. -settings.deletion_success=Repositář byl úspěšně smazán! -settings.update_settings_success=Možnosti repositáře byly úspěšně změněny. +settings.delete_notices_fork_1=- Po smazání se všechny forky se stanou nezávislé. +settings.deletion_success=Repositář byl smazán! +settings.update_settings_success=Možnosti repositáře byly 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.transfer_succeed=Repositář byl 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. @@ -688,66 +797,87 @@ settings.collaborator_deletion_desc=Tento uživatel po tom, co bude smazán, ji settings.remove_collaborator_success=Spolupracovník byl smazán. 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 Gogs, 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.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=Přidat webový háček 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_deletion_success=Webový háček byl 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_desc=Odeslat falešnou událost doručení odeslá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.redelivery=Opětovné doručení +settings.webhook.redelivery_success=Úloha háčku '%s' byla znova přidána do doručovací fronty. Zabere to přibližně pár sekund, než bude změněn stav doručení v historii. settings.webhook.request=Požadavek settings.webhook.response=Odpověď settings.webhook.headers=Hlavičky settings.webhook.payload=Datová část settings.webhook.body=Tělo zprávy +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Jelikož háčky Gitu jsou spravovány Gitem samotným, můžete v seznamu níže upravit soubory podporovaných háčku k provádění uživatelských operací. settings.githook_edit_desc=Je-li háček neaktivní, bude zobrazen vzorový obsah. Nebude-li zadán žádný obsah, háček bude vypnut. settings.githook_name=Název háčku settings.githook_content=Obsah háčku -settings.update_githook=Upravit háček +settings.update_githook=Změnit háček settings.add_webhook_desc=Gogs 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.payload_url=URL nákladu settings.content_type=Typ obsahu settings.secret=Tajný klíč +settings.secret_desc=Tajný klíč bude odeslán jako SHA256 HMAC hexadecimální přehled nákladu použítím hlavičky X-Gogs-Signature. settings.slack_username=Uživatelské jméno settings.slack_icon_url=URL ikony uživatele settings.slack_color=Barva -settings.event_desc=Kdyby měl být webový háček spouštěn? -settings.event_push_only=Jen pouze při událost nahrání. +settings.event_desc=Kdyby měl být tento webový háček spouštěn? +settings.event_push_only=Jen pouze při události odeslání. settings.event_send_everything=Potřebuji vše. settings.event_choose=Nech mne vybrat, co potřebuji. settings.event_create=Vytvořit settings.event_create_desc=Větev nebo značka byla vytvořena -settings.event_pull_request=Požadavek na stažení -settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. -settings.event_push=Nahrát -settings.event_push_desc=Nahrání pomocí Gitu do repositáře +settings.event_delete=Smazat +settings.event_delete_desc=Větev nebo značka smazána +settings.event_fork=Rozštěpení +settings.event_fork_desc=Repositář rozštěpen +settings.event_push=Odeslat +settings.event_push_desc=Odeslání pomocí Gitu do repositáře +settings.event_issues=Úkoly +settings.event_issues_desc=Úkol, který je otevřen, uzavřen, znovuotevřen, změněn, přiřazen, nepřiřazen, mající změněn štítek, smazán štítek, mající přiřazen milník, nemající přiřazen milník. +settings.event_pull_request=Požadavek na natažení +settings.event_pull_request_desc=Požadavek na natažení otevřen, uzavřen, znovuotevřen, změněn, přiřazen, nepřiřazen, změněn štítek, smazán štítek, mající nastaven štítek, zrušeno nastavení štítku nebo synchronizován. +settings.event_issue_comment=Komentář k úkolu +settings.event_issue_comment_desc=Komentář k úkolu vytvořen, upraven nebo smazán. +settings.event_release=Vydání +settings.event_release_desc=Vydání vystaveno v repositáři. 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. +settings.update_webhook=Změnit webový háček +settings.update_hook_success=Webový háček byl změněn. settings.delete_webhook=Smazat webový háček settings.recent_deliveries=Nedávné dodávky settings.hook_type=Typ háčku settings.add_slack_hook_desc=Přidat integraci Slacku do vašeho repositáře. +settings.add_discord_hook_desc=Přidat integraci Discord do vašeho repositáře. +settings.add_dingtalk_hook_desc=Přidat integraci Dingtalk do vašeho repositáře. settings.slack_token=Poukázka settings.slack_domain=Doména settings.slack_channel=Kanál settings.deploy_keys=Klíče pro nasazení +settings.deploy_keys_helper=Přichycen při činu! Pokud chcete přidat osobní veřejné klíče, zadejte je prosím v nastavení vašeho účtu. settings.add_deploy_key=Přidat klíč pro nasazení -settings.deploy_key_desc=Klíče pro nasazení mají pouze přístup ke čtení. Nejsou stejné jako osobní klíče SSH. +settings.deploy_key_desc=Klíče pro nasazení mají pouze přístup ke čtení. Nejsou stejné jako SSH klíče osobního účtu. settings.no_deploy_keys=Žádné klíče pro nasazení nebyly ještě přidány. settings.title=Název settings.deploy_key_content=Obsah 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.add_key_success=Nový klíč pro nasazení '%s' byl 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! +settings.deploy_key_deletion_success=Klíč pro nasazení byl smazán! +settings.description_desc=Popis repozitáře. Maximální délka 512 znaků. +settings.description_length=Dostupné znaky diff.browse_source=Procházet zdrojové kódy diff.parent=rodič @@ -755,18 +885,17 @@ 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 +diff.show_unified_view=Jednotné zobrazení diff.stats_desc= %d změnil soubory, kde provedl %d přidání a %d odebrání diff.bin=binární diff.view_file=Zobrazit soubor -diff.file_suppressed=File diff suppressed because it is too large -diff.too_many_files=Některé soubory nejsou zobrazny, neboť je v této revizi změněno mnoho souborů +diff.file_suppressed=Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký +diff.too_many_files=Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů release.releases=Vydání release.new_release=Nové vydání release.draft=Koncept release.prerelease=Předběžná verze -release.stable=Stabilní release.edit=upravit release.ahead=%d revizí do větve %s od tohoto vydání release.source_code=Zdrojový kód @@ -774,7 +903,7 @@ 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.tag_helper=Vyberte existující značku nebo vytvořte novou při vydání. release.title=Název release.content=Obsah release.write=Zapsat @@ -789,9 +918,9 @@ 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.deletion_success=Vydání bylo 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.tag_name_invalid=Název značky není platný. release.downloads=Soubory ke stažení [org] @@ -799,12 +928,12 @@ org_name_holder=Název organizace org_full_name_holder=Celý název organizace org_name_helper=Skvělé názvy organizací jsou krátké a zapamatovatelné. create_org=Vytvořit organizaci -repo_updated=Upraveno +repo_updated=Změněné people=Lidé invite_someone=Přizvěte někoho teams=Týmy lower_members=členové -lower_repositories=repositáře +lower_repositories=repozitáře create_new_team=Vytvořit nový tým org_desc=Popis team_name=Název týmu @@ -813,18 +942,18 @@ team_name_helper=Tento název budete používat při zmiňovaní týmu v konverz 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. +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=Nastavení settings.options=Možnosti 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.update_settings=Změnit nastavení +settings.update_setting_success=Nastavení organizace bylo změněno. 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.update_avatar_success=Nastavení ikony organizace bylo 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! @@ -841,7 +970,7 @@ members.private_helper=označit jako veřejný members.member_role=Role člena: members.owner=Vlastník members.member=Člen -members.remove=Smazat +members.remove=Odstranit members.leave=Opustit members.invite_desc=Přidat nového člena do %s: members.invite_now=Pozvat teď @@ -851,33 +980,33 @@ 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.write_access_helper=Tento tým bude schopen jak číst své repositáře, tak do nich odesílat. 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. teams.members=Členové týmu -teams.update_settings=Upravit nastavení +teams.update_settings=Změnit nastavení teams.delete_team=Smazat tento tým -teams.add_team_member=Přidát člena týmu +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.delete_team_success=Daný tým byl 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. -teams.repositories=Repositáře týmu +teams.write_permission_desc=Členství v tom týmu poskytuje právo zápisu: členové mohou číst z a odesílat do repositářů týmu. +teams.admin_permission_desc=Členství v tom týmu poskytuje právo správce: členové mohou číst z, odesílat do a přidávat spolupracovníky do repositářů týmu. +teams.repositories=Repozitáře týmu teams.search_repo_placeholder=Hledat repositář... -teams.add_team_repository=Přidat repositář týmu -teams.remove_repo=Smazat -teams.add_nonexistent_repo=Repositář, který se snažíte přidat, neexistuje. Prosím, nejdříve jej vytvořte. +teams.add_team_repository=Přidat repozitář týmu +teams.remove_repo=Odstranit +teams.add_nonexistent_repo=Repositář, který se snažíte přidat, neexistuje. Nejdříve jej vytvořte, prosím. [admin] dashboard=Přehled users=Uživatelé organizations=Organizace -repositories=Repositáře +repositories=Repozitáře authentication=Způsoby ověření config=Nastavení notices=Systémová oznámení @@ -886,29 +1015,36 @@ first_page=První last_page=Poslední total=Celkem: %d +dashboard.build_info=Informace o sestavení +dashboard.app_ver=Verze aplikace +dashboard.git_version=Git verze +dashboard.go_version=Go verze +dashboard.build_time=Čas sestavení +dashboard.build_commit=Commit sestavení dashboard.statistic=Statistika dashboard.operations=Operace dashboard.system_status=Stav sledování systému -dashboard.statistic_info=Databáze Gogs obsahuje %d uživatelů, %d organizací, %d veřejných klíčů, %d repositářů, %d hlídání, %d oblíbení, %d akcí, %d přístupů, %d úkolů, %d komentářů, %d sociálních účtů, %d sledování, %d zrcadel, %d vydání, %d zdrojů přihlášení, %d webových háčků, %d milníků, %d štítků, %d háčků, %d týmů, %d úkolu změn, %d příloh. +dashboard.statistic_info=Databáze Gogs obsahuje %d uživatelů, %d organizací, %d veřejných klíčů, %d repositářů, %d hlídání, %d oblíbení, %d akcí, %d přístupů, %d úkolů, %d komentářů, %d sociálních účtů, %d sledování, %d zrcadel, %d vydání, %d zdrojů přihlášení, %d webových háčků, %d milníků, %d štítků, %d háčků, %d týmů, %d úkolů změn, %d příloh. dashboard.operation_name=Název operace dashboard.operation_switch=Přepnout +dashboard.select_operation_to_run=Please select operation to run dashboard.operation_run=Spustit -dashboard.clean_unbind_oauth=Smazat nepřipojené asociace OAuth2 -dashboard.clean_unbind_oauth_success=Všechny nepřipojené asociace OAuth2 byly úspěšně smazány. +dashboard.clean_unbind_oauth=Smazat odpojené asociace OAuth2 +dashboard.clean_unbind_oauth_success=Všechny odpojené asociace OAuth2 byly smazány. dashboard.delete_inactivate_accounts=Smazat všechny neaktivní účty -dashboard.delete_inactivate_accounts_success=Všechny neaktivní účty byly úspěšně smazány. +dashboard.delete_inactivate_accounts_success=Všechny neaktivní účty byly smazány. dashboard.delete_repo_archives=Smazat všechny archívy repositářů -dashboard.delete_repo_archives_success=Všechny archívy repositářů byly úspěšně smazány. +dashboard.delete_repo_archives_success=Všechny archívy repositářů byly smazány. dashboard.delete_missing_repos=Smazat všechny záznamy repositářů, které ztratily soubory Gitu -dashboard.delete_missing_repos_success=Všechny repositáře, které ztratily soubory Gity, byly úspěšně smazány. -dashboard.git_gc_repos=Provést úklid nad repositáři -dashboard.git_gc_repos_success=Úklid nad všemi repositáři byl úspěšně proveden. +dashboard.delete_missing_repos_success=Všechny repositáře, které ztratily soubory Gitu, byly smazány. +dashboard.git_gc_repos=Provést úklid GC nad repositáři +dashboard.git_gc_repos_success=Úklid GC nad všemi repositáři byl proveden. dashboard.resync_all_sshkeys=Přepsat soubor '.ssh/authorized_keys' (upozornění: klíče nevzniklé v Gogs budou ztraceny) -dashboard.resync_all_sshkeys_success=Všechny veřejné klíče byly úspěšně přepsány. -dashboard.resync_all_update_hooks=Přepsat háček úprav všech repositářů (potřebný v momentě změny cesty k uživatelskému konfiguračnímu souboru) -dashboard.resync_all_update_hooks_success=Háček úprav všech repositářů byl úspěšně přepsán. +dashboard.resync_all_sshkeys_success=Všechny veřejné klíče byly přepsány. +dashboard.resync_all_hooks=Sesynchronizovat háčky před-získání, změny a po-získání pro všechny repositáře +dashboard.resync_all_hooks_success=Všechny háčky repositáře pro před-získání, změnu a po-získání byly sesynchronizovány. dashboard.reinit_missing_repos=Znovu inicializovat záznamy všech repositářů, které ztratily soubory Gitu -dashboard.reinit_missing_repos_success=Záznamy všech repositářů, které ztratily soubory Gitu, byly znovu úspěšně inicializovány. +dashboard.reinit_missing_repos_success=Záznamy všech repositářů, které ztratily soubory Gitu, byly znovu inicializovány. dashboard.server_uptime=Doba provozu serveru dashboard.current_goroutine=Aktuální Goroutines @@ -940,7 +1076,7 @@ dashboard.total_gc_pause=Celková pauza GC dashboard.last_gc_pause=Poslední pauza GC dashboard.gc_times=Časy GC -users.user_manage_panel=Uživatelský panel +users.user_manage_panel=Panel správy uživatelů users.new_account=Vytvořit nový účet users.name=Jméno users.activated=Aktivován @@ -948,26 +1084,26 @@ users.admin=Správce users.repos=Repositáře users.created=Vytvořen users.send_register_notify=Poslat upozornění na registraci uživateli -users.new_success=Nový účet '%s' byl úspěšně vytvořen. +users.new_success=Nový účet '%s' byl vytvořen. users.edit=Upravit users.auth_source=Zdroj způsobu ověření users.local=Místní users.auth_login_name=Přihlašovací jméno způsobu ověření users.password_helper=Nechte prázdné, pokud se nemá změnit. -users.update_profile_success=Profil účtu byl úspěšně změněn. +users.update_profile_success=Profil účtu byl změněn. users.edit_account=Upravit účet users.max_repo_creation=Limit počtu vytvořených repositářů users.max_repo_creation_desc=(Nastavte na -1 pro použití výchozího systémového limitu) users.is_activated=Tento účet je aktivován users.prohibit_login=Tento účet má zakázáno přihlášení users.is_admin=Tento účet je správce -users.allow_git_hook=Tento účet má právo vytváře háčky Gitu +users.allow_git_hook=Tento účet má právo vytvářet háčky Gitu users.allow_import_local=Tento účet má právo importovat místní repositáře -users.update_profile=Upravil profil účtu +users.update_profile=Změnit profil účtu users.delete_account=Smazat tento účet users.still_own_repo=Tento účet je stále vlastníkem nejméně jednoho repositáře, je potřeba repositář nejdříve smazat nebo předat. users.still_has_org=Tento účet je členem minimálně jedné organizace, musíte nejdříve dané organizace opustit nebo je smazat. -users.deletion_success=Účet byl úspěšně smazán! +users.deletion_success=Účet byl smazán! orgs.org_manage_panel=Panel správy organizací orgs.name=Název @@ -978,16 +1114,18 @@ repos.repo_manage_panel=Panel správy repositářů repos.owner=Vlastník repos.name=Název repos.private=Soukromý -repos.watches=Sledovače +repos.watches=Sledujících repos.stars=Oblíbení repos.issues=Úkoly +repos.size=Velikost -auths.auth_manage_panel=Panel správy způsobů ověřování +auths.auth_sources=Zdroje ověření auths.new=Přidat nový zdroj auths.name=Název auths.type=Typ auths.enabled=Povolený -auths.updated=Upravený +auths.default=Výchozí +auths.updated=Změněné auths.auth_type=Typ ověření auths.auth_name=Název ověření auths.security_protocol=Protokol zabezpečení @@ -995,15 +1133,21 @@ auths.domain=Doména auths.host=Server auths.port=Port auths.bind_dn=Připojení DN +auths.bind_dn_helper=Můžete použít '%s' jako zástupný znak pro uživatelské jméno, například DOM\%s auths.bind_password=Heslo připojení auths.bind_password_helper=Upozornění: Toto heslo je ukládáno nešifrované. Nepoužívejte pro správcovské účty. -auths.user_base=Výchozí bod hledání uživatelů +auths.user_base=Výchozí místo hledání uživatelů auths.user_dn=DN uživatele auths.attribute_username=Atribut uživatelského jména -auths.attribute_username_placeholder=Zanechat prázdné pro použití hodnoty pole uživatelského jména z přihlašovacího formuláře. -auths.attribute_name=Křestní jméno -auths.attribute_surname=Příjmení -auths.attribute_mail=E-mailová adresa +auths.attribute_username_placeholder=Nechte toto pole prázdné pro použití hodnoty pole uživatelského jména z přihlašovacího formuláře. +auths.attribute_name=Atribut křestního jména +auths.attribute_surname=Atribut příjmení +auths.attribute_mail=Atribut e-mailové adresy +auths.verify_group_membership=Ověřovat členství ve skupině +auths.group_search_base_dn=Základní DN pro vyhledávání skupin +auths.group_filter=Skupinový filtr +auths.group_attribute_contain_user_list=Skupinový atribut, který obsahuje seznam uživatelů +auths.user_attribute_listed_in_group=Atribut uživatele (ve skupině) auths.attributes_in_bind=Vyzvednout atributy v kontextu Bind DN auths.filter=Uživatelský filtr auths.admin_filter=Správcovský filtr @@ -1017,118 +1161,200 @@ auths.enable_tls=Povolit šifrování TLS auths.skip_tls_verify=Přeskočit ověření TLS auths.pam_service_name=Název služby PAM auths.enable_auto_register=Povolit zaregistrování se -auths.tips=Tipy auths.edit=Upravit nastavení ověřování auths.activated=Tento způsob ověřování je aktivní -auths.new_success=Nový způsob ověřování '%s' byl úspěšně přidán. -auths.update_success=Nastavení ověřování bylo úspěšně změněno. +auths.default_auth=Toto ověření je výchozí zdroj přihlášení +auths.new_success=Nový způsob ověřování '%s' byl přidán. +auths.update_success=Nastavení ověřování bylo změněno. auths.update=Změnit nastavení ověřování auths.delete=Smazat tento způsob ověřování auths.delete_auth_title=Smazání způsobu ověřování auths.delete_auth_desc=Tento způsob ověřování bude smazán, chcete pokračovat? auths.still_in_used=Tento způsob ověřování je stále používán některými uživateli. Prosím, nejdříve změňte u těchto uživatelů typ ověřování na jiný. -auths.deletion_success=Způsob ověřování byl úspěšně smazán! +auths.deletion_success=Způsob ověřování byl smazán! +auths.login_source_exist=Zdroj přihlášení '%s' již existuje. +auths.github_api_endpoint=Koncový bod API +config.not_set=(není nastaveno) config.server_config=Nastavení serveru -config.app_name=Název aplikace -config.app_ver=Verze aplikace -config.app_url=URL aplikace -config.domain=Doména -config.offline_mode=Režim off-line -config.disable_router_log=Vypnout log směrovače +config.brand_name=Název značky config.run_user=Účet pro spouštění config.run_mode=Režim spouštění -config.repo_root_path=Kořenový adresář repositářů -config.static_file_root_path=Kořenový adresář statického souboru -config.log_file_root_path=Kořenový adresář souboru logu -config.script_type=Typ skriptu -config.reverse_auth_user=Uživatel obráceného ověření +config.server.external_url=Externí URL +config.server.domain=Doména +config.server.protocol=Protokol +config.server.http_addr=HTTP adresa +config.server.http_port=HTTP port +config.server.cert_file=Soubor certifikátu +config.server.key_file=Soubor klíče +config.server.tls_min_version=Minimální verze TLS +config.server.unix_socket_permission=Oprávnění Unix socket +config.server.local_root_url=Místní URL kořenového adresáře +config.server.offline_mode=Offline režim +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Povolit Gzip +config.server.app_data_path=Cesta dat aplikace +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL config.ssh_config=Nastavení SSH -config.ssh_enabled=Zapnutý -config.ssh_start_builtin_server=Spustit vestavěný server -config.ssh_domain=Doména -config.ssh_port=Port -config.ssh_listen_port=Port pro naslouchání -config.ssh_root_path=Kořenová cesta -config.ssh_key_test_path=Cesta testu klíčů -config.ssh_keygen_path=Cesta ke generátoru klíčů ('ssh-keygen') -config.ssh_minimum_key_size_check=Kontrola minimální velikosti klíčů -config.ssh_minimum_key_sizes=Minimální velikost klíčů +config.ssh.enabled=Povoleno +config.ssh.domain=Vystavená doména +config.ssh.port=Vystavený port +config.ssh.root_path=Kořenová cesta +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Kontrola minimální velikosti klíčů +config.ssh.minimum_key_sizes=Minimální velikost klíčů +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Serverové šifry +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Nastavení repositáře +config.repo.root_path=Kořenová cesta +config.repo.script_type=Typ skriptu +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Upřednostňované licence +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=Nastavení databáze -config.db_type=Typ -config.db_host=Server -config.db_name=Název -config.db_user=Uživatel -config.db_ssl_mode=Režim SSL -config.db_ssl_mode_helper=(pouze pro 'postgres') -config.db_path=Cesta -config.db_path_helper=(pro "sqlite3" a "tidb") - -config.service_config=Nastavení služby -config.register_email_confirm=Vyžadovat potvrzení e-mailem -config.disable_register=Vypnout registraci -config.show_registration_button=Ukázat tlačítko registrace -config.require_sign_in_view=Vyžadovat zobrazení přihlášení -config.mail_notify=Upozornění e-mailem -config.disable_key_size_check=Vypnout kontrolu minimální velikosti klíčů -config.enable_captcha=Povolit službu CAPTCHA -config.active_code_lives=Doba života aktivního kódu -config.reset_password_code_lives=Lhůta kódu pro obnovu hesla +config.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -config.webhook_config=Nastavení webových háčků -config.queue_length=Délka fronty -config.deliver_timeout=Časový limit doručení -config.skip_tls_verify=Přeskočit ověření TLS - -config.mailer_config=Nastavení odesílání e-mailů -config.mailer_enabled=Zapnutý -config.mailer_disable_helo=Zakázat HELO -config.mailer_name=Název -config.mailer_host=Server -config.mailer_user=Uživatel -config.send_test_mail=Odeslat zkušební E-mail -config.test_mail_failed=Odeslání testovacího e-mailu na '%s' selhalo: %v -config.test_mail_sent=Zkušební e-mail byl odeslán na '%s'. - -config.oauth_config=Nastavení ověření OAuth -config.oauth_enabled=Zapnutý +config.session_config=Nastavení relace +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Nastavení mezipaměti -config.cache_adapter=Adaptér mezipaměti -config.cache_interval=Interval mezipaměti -config.cache_conn=Připojení mezipaměti - -config.session_config=Nastavení relace -config.session_provider=Poskytovatel relace -config.provider_config=Nastavení poskytovatele -config.cookie_name=Název souboru cookie -config.enable_set_cookie=Povolit nastavení cookie -config.gc_interval_time=Čas intervalu GC -config.session_life_time=Doba trvání relace -config.https_only=Pouze protokol HTTPS -config.cookie_life_time=Doba života souboru cookie +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=Nastavení HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Nastavení ikony uživatele -config.picture_service=Služba ikon uživatelů -config.disable_gravatar=Zakázat službu Gravatar -config.enable_federated_avatar=Enable Federated Avatars +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Nastavení webových háčků +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify config.git_config=Konfigurace Gitu -config.git_disable_diff_highlight=Zakázat zvýraznění syntaxe v rozdílovém zobrazení -config.git_max_diff_lines=Maximální počet rozdílových řádků jednoho souboru -config.git_max_diff_line_characters=Maximální počet zobrazených rozdílových znaků -config.git_max_diff_files=Maximální počet zobrazených rozdílových souborů -config.git_gc_args=Parametry GC -config.git_migrate_timeout=Časový limit migrace -config.git_mirror_timeout=Časový limit aktualizace zrcadla -config.git_clone_timeout=Časový limit operace naklonování -config.git_pull_timeout=Časový limit operace stažení -config.git_gc_timeout=Časový limit operace GC - -config.log_config=Nastavení logů -config.log_mode=Způsob logování +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path + +config.log_config=Nastavení systémových záznamů +config.log_file_root_path=Kořenový adresář souboru systémových záznamů +config.log_mode=Režim +config.log_options=Možnosti monitor.cron=Naplánované úlohy monitor.name=Název @@ -1146,55 +1372,63 @@ notices.view_detail_header=Zobrazit detail oznámení notices.actions=Akce notices.select_all=Vybrat vše notices.deselect_all=Zrušit výběr všech -notices.inverse_selection=Inverzní výběr +notices.inverse_selection=Převrátit výběr notices.delete_selected=Smazat vybrané notices.delete_all=Smazat všechna oznámení notices.type=Typ notices.type_1=Repositář notices.desc=Popis notices.op=Op. -notices.delete_success=Systémová upozornění byla úspěšně smazána. +notices.delete_success=Systémová upozornění byla smazána. [action] create_repo=vytvořil repositář %s rename_repo=přejmenoval repositář z %[1]s na %[3]s -commit_repo=odeslal do %[3]s v %[4]s +commit_repo=odeslal do větve %[3]s v repositáři %[4]s +compare_commits=Zobrazit porovnání pro tyto %d revize +transfer_repo=předal repositář %s uživateli/organizaci %s create_issue=`vytvořil úkol %s#%[2]s` close_issue=`uzavřel úkol %s#%[2]s` reopen_issue=`znovuotevřel úkol %s#%[2]s` -create_pull_request=`vytvořil požadavek na stažení %s#%[2]s` -close_pull_request=`zavřel požadavek na stažení %s#%[2]s` -reopen_pull_request=`znovuotevřel požadavek na stažení %s#%[2]s` -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 +comment_issue=`okomentoval úkol %s#%[2]s` +create_pull_request=`vytvořil požadavek na natažení %s#%[2]s` +close_pull_request=`zavřel požadavek na natažení %s#%[2]s` +reopen_pull_request=`znovuotevřel požadavek na natažení %s#%[2]s` +merge_pull_request=`sloučil požadavek na natažení %s#%[2]s` +create_branch=vytvořil novou větev %[3]s v %[4]s +delete_branch=smazal větev %[2]s v %[3]s +push_tag=odeslal značku %[2]s do repositáře %[3]s +delete_tag=smazána značka %[2]s v %[3]s +fork_repo=rozštěpil repositář do %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synchronizoval/a novou referenci %[2]s do %[3]s ze zrcadla +mirror_sync_delete=synchronizoval/a a smazal/a referenci %[2]s v %[3]s ze zrcadla [tool] ago=před from_now=od teď now=nyní 1s=%s 1 sekundou -1m=%s před jednou minutou -1h=%s jednou hodinou +1m=%s 1 minutou +1h=%s 1 hodinou 1d=%s 1 dnem 1w=%s 1 týdnem 1mon=%s 1 měsícem 1y=%s 1 rokem -seconds=%s %d sekundami -minutes=%s %d minutami -hours=%s %d hodinami -days=%s %d dny -weeks=%s %d týdny -months=%s %d měsíci -years=%s %d roky -raw_seconds=sekund -raw_minutes=minut +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 +raw_seconds=sekundy +raw_minutes=minuty +raw_hours=hours [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 +remove_file=Odstranit soubor diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 978aacb9377..07fc5aa46f2 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -9,7 +9,6 @@ sign_out=Abmelden sign_up=Registrieren register=Registrieren website=Webseite -version=Version page=Seite template=Vorlage language=Sprache @@ -44,23 +43,27 @@ issues=Issues cancel=Abbrechen +[status] +page_not_found=Seite nicht gefunden +internal_server_error=Interner Serverfehler + [install] install=Installation title=Installationsschritte für den ersten Start -docker_helper=Wenn Gogs innerhalb von Docker läuft, lesen Sie sich bitte den Leitfaden genau durch, bevor Sie irgendwas auf dieser Seite ändern! -requite_db_desc=Gogs benötigt MySQL, PostgreSQL, SQLite3 oder TiDB. +docker_helper=Wenn Gogs innerhalb von Docker läuft, lesen Sie sich bitte den Leitfaden genau durch, bevor Sie etwas auf dieser Seite ändern! +requite_db_desc=Gogs benötigt MySQL, PostgreSQL, SQLite3 oder TiDB (mit MySQL-Protokoll) db_title=Datenbankeinstellungen db_type=Datenbanktyp host=Host user=Benutzer password=Passwort db_name=Datenbankname +db_schema=Schema db_helper=Bitte verwenden Sie in MySQL die InnoDB-Engine mit dem Zeichensatz utf8_general_ci. ssl_mode=SSL-Modus path=Pfad -sqlite_helper=Der Dateipfad zur SQLite3- oder TiDB-Datenbank.
Bitte verwenden Sie einen absoluten Pfad, wenn Gogs als Service gestartet wird. -err_empty_db_path=SQLite3 oder TiDB Datenbankpfad darf nicht leer sein. -err_invalid_tidb_name=Der TiDB Datenbankname darf nicht "." und "-" enthalten. +sqlite_helper=Der Dateipfad zur SQLite3-Datenbank.
Bitte verwenden Sie einen absoluten Pfad, wenn Gogs als Service gestartet wird. +err_empty_db_path=SQLite3 Datenbankpfad darf nicht leer sein. no_admin_and_disable_registration=Sie können die Registrierung nicht deaktivieren, ohne ein Administratorkonto zu erstellen. err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein. @@ -75,12 +78,17 @@ domain=Domain domain_helper=Dies hat Auswirkung auf die SSH Klon-URLs. ssh_port=SSH Port ssh_port_helper=Der Port Ihres SSH-Servers. Leer lassen um SSH zu deaktivieren. +use_builtin_ssh_server=Eingebauten SSH-Server verwenden +use_builtin_ssh_server_popup=Starte eingebauten SSH-Server für git-Aufgaben, um es vom System-SSH-Dämon zu trennen. http_port=HTTP Port http_port_helper=Auf dieser Port Nummer wird Gogs erreichbar sein. app_url=Anwendungs-URL app_url_helper=Dies hat Auswirkung auf die HTTP/HTTPS Klon-URLs und den Inhalt der E-Mails. log_root_path=Logdateipfad log_root_path_helper=Verzeichnis in das Logdateien geschrieben werden. +enable_console_mode=Konsolen-Modus einschalten +enable_console_mode_popup=Zusätzlich zum Datei-Modus, zeige Logs auch in der Konsole. +default_branch=Standard Branch optional_title=Optionale Einstellungen email_title=E-Mail-Service Einstellungen @@ -116,7 +124,10 @@ sqlite3_not_available=Ihre Gogs-Version unterstützt SQLite3 nicht. Bitte laden invalid_db_setting=Datenbankeinstellungen sind nicht korrekt: %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 +smtp_host_missing_port=In der Adresse des SMTP Host fehlt die Portnummer. +invalid_smtp_from=SMTP Absender Feld ist nicht gültig: %v save_config_failed=Fehler beim Speichern der Konfiguration: %v +init_failed=Fehler beim Initialisieren der Anwendung: %v invalid_admin_setting=Admin-Konto Einstellungen sind ungültig: %v install_success=Herzlich Willkommen! Wir sind froh, dass Sie sich für Gogs entschieden haben. Wir wünschen viel Vergnügen damit. invalid_log_root_path=Pfad zum Log-Verzeichnis ist ungültig: %v @@ -137,6 +148,7 @@ issues.in_your_repos=In Ihren Repositories [explore] repos=Repositories users=Benutzer +organizations=Organisationen search=Suche [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Haben Sie bereits ein Konto? Jetzt anmelden! social_register_hepler_msg=Haben Sie bereits ein Konto? Jetzt verknüpfen! disable_register_prompt=Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wenden Sie sich an den Administrator. disable_register_mail=Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert. +auth_source=Authentifizierungsquelle +local=Lokal remember_me=Angemeldet bleiben forgot_password=Passwort vergessen forget_password=Passwort vergessen? @@ -156,7 +170,6 @@ prohibit_login_desc=Ihrem Konto ist es nicht gestattet sich anzumelden. Bitte ko resent_limit_prompt=Es tut uns leid, aber Sie haben bereits eine Aktivierungs-E-Mail angefordert. Bitte warten Sie 3 Minuten und probieren Sie es dann nochmal. has_unconfirmed_mail=Hallo %s, Sie haben eine unbestätigte E-Mail-Adresse (%s). Wenn Sie keine Bestätigungs-E-Mail erhalten haben oder eine neue benötigen, klicken Sie 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. send_reset_mail=Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden reset_password=Passwort zurücksetzen invalid_code=Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig. @@ -164,6 +177,14 @@ reset_password_helper=Hier klicken, um das Passwort zurückzusetzen password_too_short=Das Passwort muss mindenstens 6 Zeichen lang sein. non_local_account=Nicht-lokale Konten können Passwörter nicht via Gogs ändern. +login_two_factor=Zwei-Faktor-Authentifizierung +login_two_factor_passcode=PIN +login_two_factor_enter_recovery_code=Geben Sie einen Wiederherstellungscode für die Zwei-Faktor-Authentifizierung ein +login_two_factor_recovery=Zwei-Faktor-Wiederherstellung +login_two_factor_recovery_code=Wiederherstellungscode +login_two_factor_enter_passcode=Geben Sie die Zwei-Faktor-Authentifizierungs PIN ein +login_two_factor_invalid_recovery_code=Der Wiederherstellungscode wurde schon benutzt oder ist nicht gültig. + [mail] activate_account=Bitte aktivieren Sie Ihr Konto activate_email=Bestätigen Sie Ihre E-Mail-Adresse @@ -199,6 +220,7 @@ 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_dot_slash_error=` kann ausschließlich alphanumerische Zeichen und ".-_/" enthalten.` 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.` @@ -215,6 +237,7 @@ org_name_been_taken=Organisationsname ist bereits vergeben. team_name_been_taken=Teamname ist bereits vergeben. email_been_used=E-Mail-Adresse wird bereits verwendet. username_password_incorrect=Benutzername oder Passwort ist nicht korrekt. +auth_source_mismatch=Die ausgewählte Authentifizierungsquelle ist dem Benutzer nicht zugeordnet. enterred_invalid_repo_name=Bitte achten Sie darauf, dass der von Ihnen eingegebene Repository-Name korrekt ist. enterred_invalid_owner_name=Bitte achten Sie darauf, dass der eingegebene Name des Besitzers korrekt ist. enterred_invalid_password=Bitte achten Sie darauf, dass das eingegebene Passwort richtig ist. @@ -242,19 +265,18 @@ following=Folge ich follow=Folgen unfollow=Nicht mehr folgen -form.name_reserved=Der Benutzername '%s' ist reserviert. -form.name_pattern_not_allowed=Benutzernamen der Form '%s' sind nicht erlaubt. +form.name_not_allowed=Benutzername oder Muster %q ist nicht erlaubt. [settings] profile=Profil password=Passwort avatar=Profilbild ssh_keys=SSH-Schlüssel -social=Soziale Konten -applications=Anwendungen +security=Sicherheit +repos=Repositories orgs=Organisationen +applications=Anwendungen delete=Konto löschen -uid=Uid public_profile=Öffentliches Profil profile_desc=Ihre E-Mail-Adresse ist öffentlich einsehbar und dient dazu, Ihnen Benachrichtigungen bezüglich Ihres Kontos und Aktivitäten auf der Webseite zu schicken. @@ -295,6 +317,7 @@ 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_success=E-Mail-Adresse wurde erfolgreich gelöscht! +email_deletion_primary=Die primäre E-Mail-Adresse kann nicht gelöscht werden. add_new_email=Neue E-Mail-Adresse hinzufügen add_email=E-Mail-Adresse hinzufügen add_email_confirmation_sent=Eine neue Bestätigungsmail wurde an '%s' gesendet, bitte überprüfen Sie Ihren Posteingang innerhalb von %d Stunden um die Bestätigung abzuschließen. @@ -305,7 +328,7 @@ add_key=Schlüssel hinzufügen ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die Ihrem Konto zugeordnet sind. Bitte entfernen Sie alle Schlüssel, die Ihnen nicht bekannt sind. ssh_helper=Brauchen Sie Hilfe? Hier ist eine Anleitung zum Erzeugen von SSH-Schlüsseln oder Lösen einfacher SSH-Probleme. add_new_key=SSH-Schlüssel hinzufügen -ssh_key_been_used=Inhalt des öffentlichen Schlüssels wurde verwendet. +ssh_key_been_used=Inhalt des öffentlichen Schlüssels wurde bereits verwendet. ssh_key_name_used=Ein öffentlicher Schlüssel mit diesem Namen existiert bereits. key_name=Schlüsselname key_content=Inhalt @@ -320,14 +343,36 @@ 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 -manage_social=Verknüpfte soziale Konten verwalten -social_desc=Dies ist eine Liste verknüpfter sozialer Konten. Bitte entfernen Sie alle Verknüpfungen, die Ihnen nicht bekannt sind. -unbind=Verknüpfung entfernen -unbind_success=Die Verknüpfung zum sozialen Konto wurde entfernt. +two_factor=Zwei-Faktor-Authentifizierung +two_factor_status=Status: +two_factor_on=Ein +two_factor_off=Aus +two_factor_enable=Aktivieren +two_factor_disable=Deaktivieren +two_factor_view_recovery_codes=Betrachten und verwahren Sie Ihre Wiederherstellungscodes an einem sicheren Ort. Sie können diese als Passwort-Code nutzen, auch wenn Sie den Zugriff zu Ihrer Authentifizierungsanwendung verloren haben. +two_factor_http=Für HTTP/HTTPS-Operationen können Sie keine schlichten Benutzernamen und Passwörter mehr nutzen. Bitte erstellen und benutzen Sie ein Persönliches Zugriffs-Token als Ihre Anmeldeinformation, z.B. %[3]s. +two_factor_enable_title=Zwei-Faktor-Authentifizierung aktivieren +two_factor_scan_qr=Bitte benutzen Sie Ihre Authentifizierungsanwendung, um das Bild zu scannen: +two_factor_or_enter_secret=Oder geben Sie Ihren Geheim-Code ein: +two_factor_then_enter_passcode=Geben Sie die PIN ein: +two_factor_verify=Bestätigen +two_factor_invalid_passcode=Die eingegebene PIN ist ungültig. Bitte versuchen Sie es erneut! +two_factor_reused_passcode=Der von dir eingegebene Passcode wurde bereits verwendet, bitte probiere einen anderen! +two_factor_enable_error=Einschalten der Zwei-Faktor-Authentifizierung ist fehlgeschlagen: %v +two_factor_enable_success=Die Zwei-Faktor-Authentifizierung wurde für Ihr Konto erfolgreich aktiviert! +two_factor_recovery_codes_title=Zwei-Faktor-Authentifizierung-Wiederherstellungscodes +two_factor_recovery_codes_desc=Wiederherstellungscodes sind dazu gedacht, verwendet zu werden, wenn Sie vorübergehend keinen Zugriff zu Ihrer Authentifizierungsanwendung haben. Jeder Wiederherstellungscode kann nur einmal verwendet werden. Bitte bewahren Sie diese Codes an einem sicheren Ort auf. +two_factor_regenerate_recovery_codes=Wiederherstellungscodes neu generieren +two_factor_regenerate_recovery_codes_error=Das erneute Generieren der Wiederherstellungscodes ist fehlgeschlagen: %v +two_factor_regenerate_recovery_codes_success=Die neuen Wiederherstellungscodes wurden erfolgreich generiert! +two_factor_disable_title=Zwei-Faktor-Authentifizierung deaktivieren +two_factor_disable_desc=Das Sicherheitsniveau Ihres Kontos wird deutlich reduziert sein, nachdem die Zwei-Faktor-Authentifizierung deaktiviert wurde. Möchten Sie fortfahren? +two_factor_disable_success=Die Zwei-Faktor-Authentifizierung wurde erfolgreich deaktiviert! manage_access_token=Verwaltung persönlicher Zugangs-Token -generate_new_token=Neuen Token erzeugen +generate_new_token=Neues Token erzeugen tokens_desc=Die von Ihnen erzeugten Token können zum Zugriff auf die Gogs-API verwendet werden. +access_token_tips=Der persönliche Zugangs-Token kann entweder als Benutzername oder als Passwort verwendet werden. Es wird empfohlen den "x-access-token" als Benutzernamen und den persönlichen Zugangs-Token als Passwort für Git-Anwendungen zu verwenden. new_token_desc=Jeder Token erlaubt vollen Zugriff auf ihr Konto. token_name=Token-Name generate_token=Token generieren @@ -336,6 +381,16 @@ 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öchten Sie fortfahren? delete_token_success=Persönlicher Zugriffs-Token wurde erfolgreich entfernt! Vergessen Sie nicht Ihre Anwendung zu aktualisieren. +token_name_exists=Token mit dem gleichen Namen existiert bereits. + +orgs.none=Sie sind kein Mitglied einer Organisation. +orgs.leave_title=Organisation verlassen +orgs.leave_desc=Sie verlieren den Zugriff auf alle Repositories und Teams nach dem Verlassen der Organisation. Möchten Sie fortfahren? + +repos.leave=Verlassen +repos.leave_title=Repository verlassen +repos.leave_desc=Der Zugang zum Repository wird verloren gehen, wenn Sie es verlassen. Möchten Sie fortfahren? +repos.leave_success=Sie haben das Repository '%s' erfolgreich verlassen! delete_account=Konto löschen delete_prompt=Diese Aktion wird Ihr Konto dauerhaft löschen und kann NICHT rückgängig gemacht werden! @@ -348,10 +403,12 @@ 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. visibility=Sichtbarkeit +unlisted=Ungelistet visiblity_helper=Dieses Repository ist privat +unlisted_helper=Dieses Repository ist nicht gelistet visiblity_helper_forced=Der Administrator hat festgelegt, dass alle neuen Repositories privat sein müssen visiblity_fork_helper=(Eine Änderung dieses Wertes wirkt sich auf alle Forks aus) -clone_helper=Sie brauchen Hilfe beim Klonen? Öffnen Sie die Hilfe! +clone_helper=Brauchen Sie Hilfe beim Klonen? Hier gibt es Hilfe! fork_repo=Repository forken fork_from=Fork von fork_visiblity_helper=Die Sichtbarkeit von geforkten Repositories ist nicht veränderbar. @@ -374,24 +431,26 @@ mirror_last_synced=Zuletzt synchronisiert watchers=Beobachter stargazers=In Favoriten von forks=Forks +repo_description_helper=Beschreibung des Repository. Maximal 512 Zeichen. +repo_description_length=Verfügbare Zeichen 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.name_pattern_not_allowed=Repository-Namen der Form '%s' sind nicht erlaubt. +form.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=Authorisierung benötigt migrate_type=Migrationstyp migrate_type_helper=Dieses Repository wird ein Mirror sein 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_address_desc=Dies kann eine HTTP/HTTPS/GIT-URL sein. +migrate.clone_address_desc_import_local=Sie dürfen auch ein Repository vom lokalen Serverpfad migrieren. migrate.permission_denied=Ihnen fehlen die Rechte zum Importieren lokaler Repositories. migrate.invalid_local_path=Der lokale Pfad ist ungültig, existiert nicht oder ist kein Ordner. +migrate.clone_address_resolved_to_blocked_local_address=Klonadresse in eine lokale Netzwerkadresse aufgelöst, die implizit blockiert ist. migrate.failed=Fehler bei Migration: %v mirror_from=Mirror von forked_from=geforkt von -fork_from_self=Sie können kein Repository forken, das Ihnen gehört! copy_link=Kopieren copy_link_success=Kopiert! copy_link_error=Drücken Sie ⌘-C oder Strg-C zum Kopieren @@ -407,9 +466,9 @@ quick_guide=Kurzanleitung clone_this_repo=Dieses Repository klonen create_new_repo_command=Erstellen Sie ein neues Repository mittels der Kommandozeile push_exist_repo=Bestehendes Repository von der Kommandozeile pushen -repo_is_empty=Dieses Repository ist leer. Bitte kommen Sie später wieder! +bare_message=Dieses Repository hat noch keinen Inhalt. -code=Code +files=Dateien branch=Branch tree=Struktur filter_branch_and_tag=Nach Branch oder Tag filtern @@ -420,12 +479,23 @@ pulls=Pull-Requests labels=Label milestones=Meilensteine commits=Commits +git_branches=Branches releases=Releases file_raw=Originalformat file_history=Verlauf file_view_raw=Ansicht im Originalformat file_permalink=Permalink file_too_large=Diese Datei ist zu groß zum Anzeigen +video_not_supported_in_browser=Ihr Browser unterstützt HTML5 Video-Tags nicht. + +branches.overview=Übersicht +branches.active_branches=Aktive Branches +branches.stale_branches=Alte Branches +branches.all=Alle Branches +branches.updated_by=Aktualisiert %[1]s von %[2]s +branches.change_default_branch=Ändere Standard-Branch +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Neue Datei editor.upload_file=Datei hochladen @@ -455,16 +525,19 @@ editor.cancel=Abbrechen editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein. editor.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. editor.directory_is_a_file='%s' im übergeordneten Verzeichnis ist eine Datei und kein Verzeichnis. +editor.file_is_a_symlink=Die Datei '%s' ist ein Symlink, der im Webeditor nicht bearbeitet werden kann. editor.filename_is_a_directory=Die Datei '%s' existiert bereits als Verzeichnis in diesem Repository. editor.file_editing_no_longer_exists=Die Datei '%s', welche Sie bearbeiten, existiert in diesem Repository nicht mehr. editor.file_changed_while_editing=Seit dem Start der Bearbeitung hat sich die Datei geändert. Hier klicken um die Änderungen zu sehen, oder nochmals Commit drücken um die Änderungen zu überschreiben. editor.file_already_exists=Eine Datei mit dem Namen '%s' existiert bereits in diesem Repository. editor.no_changes_to_show=Keine Änderungen vorhanden. editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v +editor.fail_to_delete_file=Fehler beim Löschen der Datei '%s'. Fehler: %v 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' +commits.commit_history=Commit Verlauf commits.commits=Commits commits.search=Commits durchsuchen commits.find=Finden @@ -562,6 +635,7 @@ pulls.compare_compare=vergleichen pulls.filter_branch=Branch filtern pulls.no_results=Keine Ergebnisse verfügbar. pulls.nothing_to_compare=Es gibt nichts zu vergleichen, da Base- und Head-Branch gleich sind. +pulls.nothing_merge_base=Es gibt nichts zu vergleichen, da beide Zweige eine komplett unterschiedliche Historie haben. pulls.has_pull_request=`Es existiert bereits ein Pull-Request zwischen diesen beiden Zielen: %[2]s#%[3]d` pulls.create=Pull-Request erstellen pulls.title_desc=möchte %[1]d Commits von %[2]s nach %[3]s zusammenführen @@ -577,16 +651,21 @@ pulls.is_checking=Die Konfliktprüfung läuft noch. Bitte aktualisieren Sie die 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.create_merge_commit=Erstelle einen Merge-Commit +pulls.rebase_before_merging=Rebase vor dem Zusammenführen +pulls.commit_description=Commit Beschreibung 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.delete_branch=Zweig löschen +pulls.delete_branch_has_new_commits=Zweig kann nicht gelöscht werden, da er noch weitere Commits nach dem Zusammenführen enthält. 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=Erstellen Sie Meilensteine, um ihre Issues zu organisieren. milestones.create=Meilenstein erstellen milestones.title=Titel @@ -629,6 +708,29 @@ settings.collaboration.admin=Adminrechte settings.collaboration.write=Schreibrechte settings.collaboration.read=Leserechte settings.collaboration.undefined=Nicht definiert +settings.branches=Branches +settings.branches_bare=Branches leerer Repositories können nicht verwaltet werden. Bitte erst Datei(en) pushen. +settings.default_branch=Standard-Branch +settings.default_branch_desc=Der Standard-Branch gilt als Basis für Commits, Pull-Requests und Online-Bearbeitung. +settings.update=Aktualisieren +settings.update_default_branch_unsupported=Die Änderung des Standard-Branch wird von der Git-Version auf dem Server nicht unterstützt. +settings.update_default_branch_success=Standard-Branch dieses Repositories wurde erfolgreich aktualisiert! +settings.protected_branches=Protected Branches +settings.protected_branches_desc=Schützt Branches vor forcierten Pushes und versehentlichem Löschen. Comitter können freigeschaltet werden. +settings.choose_a_branch=Wählen Sie einen Branch... +settings.branch_protection=Branch-Schutz +settings.branch_protection_desc=Bitte wählen Sie Schutzoptionen für den Branch %s. +settings.protect_this_branch=Diesen Branch schützen +settings.protect_this_branch_desc=Verhindere forcierte Pushes sowie Löschungen. +settings.protect_require_pull_request=Verlange Pull-Request an Stelle von direkten Pushes +settings.protect_require_pull_request_desc=Aktivieren Sie diese Option, um direktes Pushen in diesen Branch zu verhindern. Commits müssen in einen anderen, ungeschützten Branch gepusht werden und dann per Pull-Request in diesen Branch überführt werden. +settings.protect_whitelist_committers=Hinzufügen von Benutzern oder Teams zur Whitelist, die in diesen Branch pushen dürfen +settings.protect_whitelist_committers_desc=Fügt Benutzer oder Teams zur Push-Whitelist dieses Branches hinzu. Auf der Whitelist geführte Benutze können können ohne Prüfung von Pull-Requests pushen. +settings.protect_whitelist_users=Benutzer, die in diesen Branch pushen können +settings.protect_whitelist_search_users=Benutzer suchen +settings.protect_whitelist_teams=Teams, deren Mitglieder in diesen Branch pushen können +settings.protect_whitelist_search_teams=Teams suchen +settings.update_protect_branch_success=Schutzoptionen für diesen Branch wurden erfolgreich aktualisiert! settings.hooks=Webhooks settings.githooks=Git-Hooks settings.basic_settings=Grundeinstellungen @@ -641,19 +743,26 @@ settings.change_reponame_prompt=Diese Änderung wirkt sich darauf aus, wie sich settings.advanced_settings=Erweiterte Einstellungen settings.wiki_desc=Wiki einschalten settings.use_internal_wiki=Eingebautes Wiki verwenden +settings.allow_public_wiki_desc=Erlaube öffentlichen Zugang zum Wiki, auch wenn das Repository privat ist settings.use_external_wiki=Externes Wiki verwenden settings.external_wiki_url=Externe Wiki URL 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.allow_public_issues_desc=Erlaube öffentlichen Zugriff auf Issues, auch wenn das Repository privat ist settings.use_external_issue_tracker=Externes Issue-System verwenden +settings.external_tracker_url=URL eines externen Issue Trackers +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: settings.tracker_issue_style.numeric=Numerisch settings.tracker_issue_style.alphanumeric=Alphanumerisch settings.tracker_url_format_desc=Sie können die Platzhalter {user} {repo} {index} für den Benutzernamen, den Namen des Repositories und die Issue-Nummer verwenden. -settings.pulls_desc=Pull-Requests aktivieren, um öffentliche Mitwirkung zu ermöglichen +settings.pulls_desc=Erlaube Pull-Requests zur Zusammenarbeit von Repositories und Branches +settings.pulls.ignore_whitespace=Ignoriere whitespace Änderungen +settings.pulls.allow_rebase_merge=Die Verwendung von Rebase erlauben, um Commits zu mergen settings.danger_zone=Gefahrenzone +settings.cannot_fork_to_same_owner=Besitzer kann das Repository nicht forken. settings.new_owner_has_same_repo=Der neue Eigentümer hat bereits ein Repository mit dem gleichen Namen. Bitte wählen Sie einen anderen Namen. settings.convert=In ein normales Repository umwandeln settings.convert_desc=Dieser Mirror kann in ein normales Repository umgewandelt werden. Dies kann nicht rückgängig gemacht werden. @@ -661,12 +770,12 @@ settings.convert_notices_1=- Dieser Vorgang wandelt das Mirror-Repository in ein settings.convert_confirm=Umwandlung bestätigen settings.convert_succeed=Das Repository wurde erfolgreich in ein normales Repository umgewandelt. settings.transfer=Besitz übertragen -settings.transfer_desc=Dieses Repository auf einen anderen Benutzer bzw. eine Organisation in der Sie Admin-Rechte haben übertragen. +settings.transfer_desc=Dieses Repository auf einen anderen Benutzer oder eine Organisation, in der Sie Admin-Rechte haben, übertragen. settings.transfer_notices_1=- Sie werden keinen Zugriff mehr haben, wenn der neue Besitzer ein individueller Benutzer ist. settings.transfer_notices_2=- Sie werden weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und Sie einer der Besitzer sind. settings.transfer_form_title=Bitte geben Sie 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_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.delete=Dieses Repository löschen @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Nach dem Löschen wird dieser Benutzer keine settings.remove_collaborator_success=Mitarbeiter wurde entfernt. settings.search_user_placeholder=Benutzer suchen... settings.org_not_allowed_to_be_collaborator=Eine Organisation kann nicht als Mitarbeiter hinzugefügt werden. -settings.user_is_org_member=Benutzer ist ein Organisationsmitglied und kann nicht als Mitarbeiter hinzugefügt werden. -settings.add_webhook=Webhook hinzufügen settings.hooks_desc=Webhooks erlauben es Ihnen, externe Dienste zu informieren, wenn etwas Bestimmtes in Ihrem Repository passiert. Gogs sendet dann einen POST-Request an alle angegebenen URLs. Erfahren Sie mehr in unserem Webhooks Guide. +settings.webhooks.add_new=Einen neuen Webhook hinzufügen: +settings.webhooks.choose_a_type=Typ auswählen... +settings.add_webhook=Webhook hinzufügen settings.webhook_deletion=Webhook entfernen settings.webhook_deletion_desc=Das Löschen dieses Webhooks wird alle zugehörigen Informationen und den Übertragungsverlauf entfernen. Wirklich fortfahren? 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.redelivery=Erneuter Versand +settings.webhook.redelivery_success=Hook-Task '%s' wurde wieder zur Auslieferungswarteschlange hinzugefügt. Es kann einige Sekunden, bis sich der Auslieferungsstatus in der History aktualisiert hat. settings.webhook.request=Anfrage settings.webhook.response=Antwort settings.webhook.headers=Kopfzeilen settings.webhook.payload=Nutzdaten settings.webhook.body=Inhalt +settings.webhook.err_cannot_parse_payload_url=Payload URL kann nicht analysiert werden: %v +settings.webhook.url_resolved_to_blocked_local_address=Die Payload-URL wurde in eine lokale Netzwerkadresse aufgelöst, die implizit blockiert ist. settings.githooks_desc=Git-Hooks werden von Git selbst bereitgestellt. Sie können die Dateien der unterstützten Hooks in der Liste unten bearbeiten, um eigene Operationen einzubinden. settings.githook_edit_desc=Wenn ein Hook inaktiv ist, wird der Standardinhalt benutzt. Lassen Sie den Inhalt leer, um den Hook zu deaktivieren. settings.githook_name=Hook-Name @@ -711,6 +825,7 @@ settings.add_webhook_desc=Gogs sendet einen POST-Request an die unt settings.payload_url=Payload URL settings.content_type=Inhaltstyp settings.secret=Secret +settings.secret_desc=Das Secret wird im X-Gogs-Signature Header als hexadezimalem SHA256 HMAC Stempel der Nutzlast. settings.slack_username=Benutzername settings.slack_icon_url=Icon URL settings.slack_color=Farbe @@ -720,10 +835,20 @@ settings.event_send_everything=Ich brauche alles. settings.event_choose=Lass mich auswählen, was ich brauche. settings.event_create=Erstellen settings.event_create_desc=Branch/Tag erstellt -settings.event_pull_request=Pull-Request -settings.event_pull_request_desc=Pull-Request geöffnet, geschlossen, wieder geöffnet, bearbeitet, zugewiesen, nicht zugewiesen, Label aktualisiert, Label gelöscht oder synchronisiert. +settings.event_delete=Löschen +settings.event_delete_desc=Branch/Tag gelöscht +settings.event_fork=Fork +settings.event_fork_desc=Repository geforkt settings.event_push=Push settings.event_push_desc=Git push auf ein Repository +settings.event_issues=Issues +settings.event_issues_desc=Issue geöffnet, geschlossen, wieder geöffnet, bearbeitet, zugewiesen, nicht zugewiesen, Label aktualisiert, Label gelöscht, einem Meilenstein zugewiesen oder davon entfernt. +settings.event_pull_request=Pull-Request +settings.event_pull_request_desc=Pull-Request geöffnet, geschlossen, wieder geöffnet, bearbeitet, zugewiesen, nicht zugewiesen, Label aktualisiert, Label gelöscht, einem Meilenstein zugewiesen, davon entfernt oder synchronisiert. +settings.event_issue_comment=Issue-Kommentar +settings.event_issue_comment_desc=Issue-Kommentar angelegt, geändert oder gelöscht. +settings.event_release=Release +settings.event_release_desc=Release in Repository veröffentlicht. settings.active=Aktiv settings.active_helper=Details über das auslösende Ereignis des Webhooks werden ebenfalls mit gesendet settings.add_hook_success=Webhook hinzugefügt @@ -733,10 +858,13 @@ settings.delete_webhook=Webhook löschen settings.recent_deliveries=Letzte Zustellungen settings.hook_type=Hook Typ settings.add_slack_hook_desc=Fügen Sie Slack-Integration zu Ihrem Repository hinzu. +settings.add_discord_hook_desc=Fügen Sie Discord-Integration zu Ihrem Repository hinzu. +settings.add_dingtalk_hook_desc=Dingtalk-Integration zu deinem Repository hinzufügen. settings.slack_token=Token settings.slack_domain=Domain settings.slack_channel=Kanal settings.deploy_keys=Deploy-Schlüssel +settings.deploy_keys_helper=Häufiger Fehler! Wenn Sie öffentliche Schlüssel hinzufügen wollen, gehen Sie zu Ihren Kontoeinstellungen. settings.add_deploy_key=Deploy-Schlüssel hinzufügen settings.deploy_key_desc=Deploy-Schlüssel haben nur lesenden Zugriff. Sie sind nicht identisch mit dem SSH-Schlüssel des persönlichen Kontos. settings.no_deploy_keys=Sie haben noch keine Deploy-Schlüssel hinzugefügt. @@ -748,6 +876,8 @@ settings.add_key_success=Der Deploy-Schlüssel '%s' wurde erfolgreich hinzugefü 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öchten Sie wirklich fortfahren? settings.deploy_key_deletion_success=Deploy-Schlüssel wurde erfolgreich gelöscht! +settings.description_desc=Beschreibung des Repository. Maximal 512 Zeichen. +settings.description_length=Verfügbare Zeichen diff.browse_source=Quellcode durchsuchen diff.parent=Ursprung @@ -766,7 +896,6 @@ release.releases=Releases release.new_release=Neues Release release.draft=Entwurf release.prerelease=Pre-Release -release.stable=Stabil release.edit=bearbeiten release.ahead=%d Commits zu %s seit diesem Release release.source_code=Quelltext @@ -813,8 +942,8 @@ team_name_helper=Unter diesem Namen können Sie in Diskussionen auf das Team ver team_desc_helper=Worum geht es bei diesem Team? team_permission_desc=Welche Berechtigungsstufe soll das Team haben? -form.name_reserved=Organisationsname '%s' ist bereits vergeben. -form.name_pattern_not_allowed=Organisationsnamen der Form '%s' sind nicht erlaubt. +form.name_not_allowed=Organisationsname oder Muster %q ist nicht zulässig. +form.team_name_not_allowed=Benutzername oder Muster %q ist nicht erlaubt. settings=Einstellungen settings.options=Optionen @@ -886,12 +1015,19 @@ first_page=Erste last_page=Letzte total=Gesamt: %d +dashboard.build_info=Build-Informationen +dashboard.app_ver=Anwendungsversion +dashboard.git_version=Git-Version +dashboard.go_version=Go-Version +dashboard.build_time=Build-Zeit +dashboard.build_commit=Build-Commit dashboard.statistic=Statistik dashboard.operations=Operationen dashboard.system_status=Systemmonitor-Status dashboard.statistic_info=Gogs Datenbank hat %d Benutzer, %d Organisationen, %d öffentliche Schlüssel, %d Repositories, %d Beobachtet, %d Favoriten, %d Aktionen, %d Zugriffe, %d Issues, %d Kommentare, %d Konten sozialer Medien, %d Folgende, %d Mirror, %d Releases, %d Login-Quellen, %d Webhooks, %d Meilensteine, %d Label, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. dashboard.operation_name=Name der Operation dashboard.operation_switch=Wechseln +dashboard.select_operation_to_run=Bitte wählen Sie den auszuführenden Vorgang aus 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. @@ -905,8 +1041,8 @@ 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 Gogs gehören gehen verloren) 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.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 Repositorien wurden erfolgreich synchronisiert. 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. @@ -981,12 +1117,14 @@ repos.private=Privat repos.watches=Beobachtungen repos.stars=Favoriten repos.issues=Issues +repos.size=Größe -auths.auth_manage_panel=Authentifizierung +auths.auth_sources=Authentifizierungsquelle auths.new=Neue Quelle hinzufügen auths.name=Name auths.type=Typ auths.enabled=Aktiviert +auths.default=Standard auths.updated=Aktualisiert auths.auth_type=Authentifizierungstyp auths.auth_name=Authentifizierungsname @@ -995,15 +1133,21 @@ auths.domain=Domain auths.host=Host auths.port=Port auths.bind_dn=DN binden +auths.bind_dn_helper=Sie können "%s" als Platzhalter für den Benutzernamen einsetzen, z.B. DOM\%s auths.bind_password=Passwort binden auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. Benutzen Sie kein Konto mit hoher Berechtigungsstufe. auths.user_base=Basis für Benutzersuche -auths.user_dn=Benutzer DN +auths.user_dn=Benutzer-DN auths.attribute_username=Attribut Benutzername auths.attribute_username_placeholder=Leer lassen, um den Wert aus dem Anmeldeformular als Benutzernamen zu verwenden. -auths.attribute_name=Attribut Vorname +auths.attribute_name=Vornamenattribut auths.attribute_surname=Attribut Nachname auths.attribute_mail=Attribut E-Mail +auths.verify_group_membership=Überprüfen der Gruppenmitgliedschaft +auths.group_search_base_dn=Gruppensuche Basisdomainname +auths.group_filter=Gruppenfilter +auths.group_attribute_contain_user_list=Gruppenattribut, beinhaltet die Benutzerliste +auths.user_attribute_listed_in_group=Benutzerattribut in der Gruppenliste auths.attributes_in_bind=Hole Attribute im Bind-Kontext auths.filter=Benutzerfilter auths.admin_filter=Admin Filter @@ -1017,9 +1161,9 @@ auths.enable_tls=TLS-Verschlüsselung aktivieren auths.skip_tls_verify=TLS-Prüfung überspringen auths.pam_service_name=PAM Dienstname auths.enable_auto_register=Automatische Registrierung aktivieren -auths.tips=Tipps auths.edit=Authentifizierungseinstellungen bearbeiten auths.activated=Diese Authentifizierung ist aktiv +auths.default_auth=Diese Authentifizierungsmethode ist die Vorgabe auths.new_success=Neue Authentifizierung '%s' wurde erfolgreich hinzugefügt. auths.update_success=Die Authentifizierungseinstellungen wurden erfolgreich aktualisiert. auths.update=Authentifizierungseinstellungen aktualisieren @@ -1028,107 +1172,189 @@ auths.delete_auth_title=Authentifizierung löschen auths.delete_auth_desc=Diese Authentifizierung wird gelöscht. Möchten Sie fortfahren? auths.still_in_used=Diese Authentifizierung wird noch von einigen Benutzern verwendet. Bitte löschen Sie diese Benutzer oder ändern Sie deren Anmeldetyp. auths.deletion_success=Authentifizierung wurde erfolgreich gelöscht! +auths.login_source_exist=Login-Quelle '%s' ist bereits vorhanden. +auths.github_api_endpoint=API Endpunkt +config.not_set=(nicht festgelegt) config.server_config=Serverkonfiguration -config.app_name=Name der Anwendung -config.app_ver=Anwendungsversion -config.app_url=Anwendungs-URL -config.domain=Domain -config.offline_mode=Offline-Modus -config.disable_router_log=Router-Log deaktivieren +config.brand_name=Markenname config.run_user=Ausführender Benutzer config.run_mode=Laufzeit-Modus -config.repo_root_path=Repository-Verzeichnis -config.static_file_root_path=Verzeichnis für statische Dateien -config.log_file_root_path=Log-Verzeichnis -config.script_type=Skript-Typ -config.reverse_auth_user=Nutzer bei Reverse-Authentifizierung +config.server.external_url=Externe URL +config.server.domain=Domäne +config.server.protocol=Protokoll +config.server.http_addr=HTTP-Adresse +config.server.http_port=HTTP-Port +config.server.cert_file=Zertifikatsdatei +config.server.key_file=Schlüsseldatei +config.server.tls_min_version=Minimale TLS-Version +config.server.unix_socket_permission=Unix-Socket-Berechtigung +config.server.local_root_url=Lokale Root-URL +config.server.offline_mode=Offline-Modus +config.server.disable_router_log=Router-Log deaktivieren +config.server.enable_gzip=Gzip aktivieren +config.server.app_data_path=Anwendungsdatenpfad +config.server.load_assets_from_disk=Assets von Festplatte laden +config.server.landing_url=Startseite config.ssh_config=SSH Konfiguration -config.ssh_enabled=Aktiviert -config.ssh_start_builtin_server=Eingebauten Server starten -config.ssh_domain=Domain -config.ssh_port=Port -config.ssh_listen_port=Listen Port -config.ssh_root_path=Verzeichnis -config.ssh_key_test_path=Schlüssel-Test-Pfad -config.ssh_keygen_path=Keygen ('ssh-keygen') Pfad -config.ssh_minimum_key_size_check=Prüfung der Mindestschlüssellänge -config.ssh_minimum_key_sizes=Minimale Schlüssellängen +config.ssh.enabled=Aktiviert +config.ssh.domain=Exponierte Domain +config.ssh.port=Exponierter Port +config.ssh.root_path=Wurzelpfad +config.ssh.keygen_path=Keygenpfad +config.ssh.key_test_path=Schlüsseltestpfad +config.ssh.minimum_key_size_check=Prüfung der Mindestschlüssellänge +config.ssh.minimum_key_sizes=Mindestschlüssellängen +config.ssh.rewrite_authorized_keys_at_start=Beim Start "authorized_keys" umschreiben +config.ssh.start_builtin_server=Eingebauten Server starten +config.ssh.listen_host=Listen-Host +config.ssh.listen_port=Listen-Port +config.ssh.server_ciphers=Serverchiffren +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server-Algorithmen + +config.repo_config=Repository-Konfiguration +config.repo.root_path=Wurzelpfad +config.repo.script_type=Skript-Typ +config.repo.ansi_chatset=ANSI-Zeichensatz +config.repo.force_private=Privat erzwingen +config.repo.max_creation_limit=Maximales Erstellungslimit +config.repo.preferred_licenses=Bevorzugte Lizenzen +config.repo.disable_http_git=HTTP-Git deaktivieren +config.repo.enable_local_path_migration=Lokale Pfadmigration aktivieren +config.repo.enable_raw_file_render_mode=Darstellen von Roh-Dateien aktivieren +config.repo.commits_fetch_concurrency=Anzahl gleichzeitiger Commit-/Fetch-Prozesse +config.repo.editor.line_wrap_extensions=Editor Erweiterungen für Zeilenumbrüche +config.repo.editor.previewable_file_modes=Vorschau der Dateimodi des Editors +config.repo.upload.enabled=Upload aktiviert +config.repo.upload.temp_path=Temporärer Pfad für Uploads +config.repo.upload.allowed_types=Erlaubte Upload-Typen +config.repo.upload.file_max_size=Upload-Dateigrößenlimit +config.repo.upload.max_files=Upload-Dateilimit config.db_config=Datenbankkonfiguration -config.db_type=Typ -config.db_host=Host -config.db_name=Name -config.db_user=Benutzer -config.db_ssl_mode=SSL-Modus -config.db_ssl_mode_helper=(nur für "postgres") -config.db_path=Verzeichnis -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.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.db.type=Typ +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(nur für "postgres") +config.db.user=Benutzer +config.db.ssl_mode=SSL-Modus +config.db.ssl_mode_helper=(nur für "postgres") +config.db.path=Pfad +config.db.path_helper=(nur für "sqlite3") +config.db.max_open_conns=Maximale Anzahl offener Verbindungen +config.db.max_idle_conns=Maximale Leerlaufverbindungen + +config.security_config=Sicherheitskonfiguration +config.security.login_remember_days=Anzahl Tage zum Speichern des Logins +config.security.cookie_remember_name=Cookie merken +config.security.cookie_username=Benutzernamen-Cookie +config.security.cookie_secure=Sicheres Cookie aktivieren +config.security.reverse_proxy_auth_user=Reverse-Proxy-Authentifizierungs-Header +config.security.enable_login_status_cookie=Login-Status-Cookie aktivieren +config.security.login_status_cookie_name=Login-Status-Cookie +config.security.local_network_allowlist=Zulassungsliste für lokale Netzwerke + +config.email_config=E-Mail-Konfiguration +config.email.enabled=Aktiviert +config.email.subject_prefix=Betreff-Präfix +config.email.host=Host +config.email.from=Von +config.email.user=Benutzer +config.email.disable_helo=HELO deaktivieren +config.email.helo_hostname=HELO Hostname +config.email.skip_verify=Zertifikatsüberprüfung überspringen +config.email.use_certificate=Benutzerdefiniertes Zertifikat verwenden +config.email.cert_file=Zertifikatsdatei +config.email.key_file=Schlüsseldatei +config.email.use_plain_text=Klartext verwenden +config.email.add_plain_text_alt=Klartext-Alternative hinzufügen +config.email.send_test_mail=Test-E-Mail senden +config.email.test_mail_failed=Fehler beim Senden der Test-E-Mail an '%s': %v +config.email.test_mail_sent=Test-E-Mail wurde an '%s ' gesendet. + +config.auth_config=Authentifizierungskonfiguration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Aktivierungscode Lebensdauer +config.auth.reset_password_code_lives=Gültigkeitsdauer Zurücksetzungs-Code +config.auth.require_email_confirm=E-Mail-Bestätigung erforderlich +config.auth.require_sign_in_view=Anmeldung erforderlich +config.auth.disable_registration=Registrierung deaktivieren +config.auth.enable_registration_captcha=Registrierungs-Captcha aktivieren +config.auth.enable_reverse_proxy_authentication=Reverse-Proxy-Authentifizierung aktivieren +config.auth.enable_reverse_proxy_auto_registration=Automatische Reverse-Proxy-Registrierung aktivieren +config.auth.reverse_proxy_authentication_header=Reverse-Proxy-Authentifizierungs-Header + +config.user_config=Benutzerkonfiguration +config.user.enable_email_notify=E-Mail-Benachrichtigung aktivieren -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.mailer_config=Mailer-Konfiguration -config.mailer_enabled=Aktiviert -config.mailer_disable_helo=HELO Deaktivieren -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_sent=Test-E-Mail wurde an '%s' gesendet. - -config.oauth_config=OAuth-Konfiguration -config.oauth_enabled=Aktiviert +config.session_config=Session-Konfiguration +config.session.provider=Anbieter +config.session.provider_config=Anbieter-Konfiguration +config.session.cookie_name=Cookie +config.session.https_only=Nur HTTPS +config.session.gc_interval=GC-Intervall +config.session.max_life_time=Maximale Lebensdauer +config.session.csrf_cookie_name=CSRF-Cookie config.cache_config=Cache-Konfiguration -config.cache_adapter=Cache-Adapter -config.cache_interval=Cache-Intervall -config.cache_conn=Cache-Anbindung - -config.session_config=Session-Konfiguration -config.session_provider=Session-Provider -config.provider_config=Provider-Einstellungen -config.cookie_name=Cookie-Name -config.enable_set_cookie=Cookies verwenden -config.gc_interval_time=GC-Intervall -config.session_life_time=Session-Lebensdauer -config.https_only=Nur HTTPS -config.cookie_life_time=Cookie-Lebensdauer +config.cache.adapter=Adapter +config.cache.interval=GC-Intervall +config.cache.host=Host + +config.http_config=HTTP-Konfiguration +config.http.access_control_allow_origin=Access-Control-Allow-Origin + +config.attachment_config=Anhang-Konfiguration +config.attachment.enabled=Aktiviert +config.attachment.path=Pfad +config.attachment.allowed_types=Erlaubte Typen +config.attachment.max_size=Größenlimit +config.attachment.max_files=Dateilimit + +config.release_config=Release-Konfiguration +config.release.attachment.enabled=Anhang aktiviert +config.release.attachment.allowed_types=Erlaubte Anhang-Typen +config.release.attachment.max_size=Größenlimit für Anhang +config.release.attachment.max_files=Dateilimit für Anhang config.picture_config=Konfiguration der Profilbilder -config.picture_service=Bildservice -config.disable_gravatar=Gravatar deaktivieren -config.enable_federated_avatar=Föderierte Profilbilder einschalten +config.picture.avatar_upload_path=Benutzer-Avatar Upload-Pfad +config.picture.repo_avatar_upload_path=Repository-Avatar Upload-Pfad +config.picture.gravatar_source=Gravatar-Quelle +config.picture.disable_gravatar=Gravatar deaktivieren +config.picture.enable_federated_avatar=Föderierte Avatare aktivieren + +config.mirror_config=Mirror-Konfiguration +config.mirror.default_interval=Standardintervall + +config.webhook_config=Webhook-Konfiguration +config.webhook.types=Typen +config.webhook.deliver_timeout=Zeitlimit für Zustellung +config.webhook.skip_tls_verify=TLS-Prüfung überspringen config.git_config=Git Konfiguration -config.git_disable_diff_highlight=Diff Syntaxhervorhebung ausschalten -config.git_max_diff_lines=Max Diff Zeilen (in einer Datei) -config.git_max_diff_line_characters=Max Diff Zeichen (in einer Zeile) -config.git_max_diff_files=Max Diff Dateien (Anzeige) -config.git_gc_args=GC-Argumente -config.git_migrate_timeout=Zeitlimit für Migration -config.git_mirror_timeout=Zeitlimit für Mirror-Aktualisierung -config.git_clone_timeout=Zeitlimit für Clone -config.git_pull_timeout=Zeitlimit für Pull -config.git_gc_timeout=Zeitlimit für GC +config.git.disable_diff_highlight=Diff-Syntaxhervorhebung ausschalten +config.git.max_diff_lines=Zeilenlimit für Diff (für eine einzelne Datei) +config.git.max_diff_line_characters=Zeichenlimit für Diff (für eine einzelne Datei) +config.git.max_diff_files=Dateilimit für Diff (für einen einzelnen Diff) +config.git.gc_args=GC-Argumente +config.git.migrate_timeout=Zeitlimit für Migration +config.git.mirror_timeout=Zeitlimit zum Spiegeln +config.git.clone_timeout=Clone-Timeout +config.git.pull_timeout=Pull-Timeout +config.git.gc_timeout=GC-Timeout + +config.lfs_config=LFS-Konfiguration +config.lfs.storage=Speicher +config.lfs.objects_path=Objektpfad config.log_config=Konfiguration des Loggings -config.log_mode=Log-Modus +config.log_file_root_path=Log-Verzeichnis +config.log_mode=Modus +config.log_options=Optionen monitor.cron=Cron-Tasks monitor.name=Name @@ -1159,17 +1385,24 @@ notices.delete_success=Systemmitteilungen wurden erfolgreich gelöscht. create_repo=hat das Repository %s erstellt rename_repo=hat das Repository von %[1]s zu %[3]s umbenannt commit_repo=hat auf %[3]s in %[4]s gepusht +compare_commits=Zeige Vergleich für diese %d Commits +transfer_repo=hat Repository %s transferiert an %s create_issue=`hat Issue %s#%[2]s geöffnet` close_issue=`hat Issue %s#%[2]s geschlossen` reopen_issue=`hat Issue %s#%[2]s wieder geöffnet` +comment_issue=`hat Issue %s#%[2]s kommentiert` create_pull_request=`hat Pull-Request %s#%[2]s erstellt` close_pull_request=`hat Pull-Request %s#%[2]s geschlossen` reopen_pull_request=`hat den Pull-Request %s#%[2]s wieder geöffnet` -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 +merge_pull_request=`hat Pull-Request %s#%[2]s zusammengeführt` +create_branch=hat neuen Branch %[3]s in %[4]s angelegt +delete_branch=hat Branch %[2]s in %[3]s gelöscht push_tag=hat Tag %[2]s auf %[3]s gepusht -compare_commits=Zeige Vergleich für diese %d Commits +delete_tag=hat Tag %[2]s in %[3]s gelöscht +fork_repo=hat das Repository nach %s geforkt +mirror_sync_push=hat auf %[3]s in %[4]s gepusht +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror [tool] ago=vor @@ -1191,6 +1424,7 @@ months=%[2]s %[1]d Monaten years=%[2]s %[1]d Jahren raw_seconds=Sekunden raw_minutes=Minuten +raw_hours=Stunden [dropzone] default_message=Zum Hochladen hier klicken oder Datei hier ablegen. diff --git a/conf/locale/locale_en-GB.ini b/conf/locale/locale_en-GB.ini new file mode 100644 index 00000000000..294506ff412 --- /dev/null +++ b/conf/locale/locale_en-GB.ini @@ -0,0 +1,1511 @@ +app_desc=A painless self-hosted Git service + +home=Home +dashboard=Dashboard +explore=Explore +help=Help +sign_in=Sign In +sign_out=Sign Out +sign_up=Sign Up +register=Register +website=Website +page=Page +template=Template +language=Language +create_new=Create... +user_profile_and_more=User profile and more +signed_in_as=Signed in as + +username=Username +email=Email +password=Password +re_type=Re-Type +captcha=Captcha + +repository=Repository +organization=Organisation +mirror=Mirror +new_repo=New Repository +new_migrate=New Migration +new_mirror=New Mirror +new_fork=New Fork Repository +new_org=New Organisation +manage_org=Manage Organisations +admin_panel=Admin Panel +account_settings=Account Settings +settings=Settings +your_profile=Your Profile +your_settings=Your Settings + +activities=Activities +pull_requests=Pull Requests +issues=Issues + +cancel=Cancel + +[status] +page_not_found=Page Not Found +internal_server_error=Internal Server Error + +[install] +install=Installation +title=Install Steps For First-time Run +docker_helper=If you're running Gogs inside Docker, please read Guidelines carefully before you change anything in this page! +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). +db_title=Database Settings +db_type=Database Type +host=Host +user=User +password=Password +db_name=Database Name +db_schema=Schema +db_helper=Please use 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 absolute path when you start as service. +err_empty_db_path=SQLite3 or TiDB database path cannot be empty. +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 +app_name=Application Name +app_name_helper=Put your organisation name here huge and loud! +repo_path=Repository Root Path +repo_path_helper=All Git remote repositories will be saved to this directory. +run_user=Run User +run_user_helper=The user must have access to Repository Root Path and run Gogs. +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. +use_builtin_ssh_server=Use Builtin SSH Server +use_builtin_ssh_server_popup=Start builtin SSH server for Git operations to distinguish from system SSH daemon. +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. +log_root_path=Log Path +log_root_path_helper=Directory to write log files to. +enable_console_mode=Enable Console Mode +enable_console_mode_popup=In addition to file mode, also print logs to console. +default_branch=Default Branch + +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. +mailer_user=Sender Email +mailer_password=Sender Password +register_confirm=Enable Register Confirmation +mail_notify=Enable Mail Notification +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. +disable_gravatar=Disable Gravatar Service +disable_gravatar_popup=Disable Gravatar and custom sources, all avatars are uploaded by users or default. +federated_avatar_lookup=Enable Federated Avatars Lookup +federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Disable Self-registration +disable_registration_popup=Disable user self-registration, only admin can create accounts. +enable_captcha=Enable Captcha +enable_captcha_popup=Require validate 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, user whoever ID=1 will gain admin access automatically. +admin_title=Admin Account Settings +admin_name=Username +admin_password=Password +confirm_password=Confirm Password +admin_email=Admin Email +install_gogs=Install Gogs +test_git_failed=Fail to 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 +invalid_repo_path=Repository root path is invalid: %v +run_user_not_match=Run user isn't the current user: %s -> %s +smtp_host_missing_port=SMTP Host is missing port in address. +invalid_smtp_from=SMTP From field is not valid: %v +save_config_failed=Fail to save configuration: %v +init_failed=Failed to initialize application: %v +invalid_admin_setting=Admin account setting is invalid: %v +install_success=Welcome! We're glad that you chose Gogs, have fun and take care. +invalid_log_root_path=Log root path is invalid: %v + +[home] +uname_holder=Username or email +password_holder=Password +switch_dashboard_context=Switch Dashboard Context +my_repos=My Repositories +show_more_repos=Show more repositories... +collaborative_repos=Collaborative Repositories +my_orgs=My Organisations +my_mirrors=My Mirrors +view_home=View %s + +issues.in_your_repos=In your repositories + +[explore] +repos=Repositories +users=Users +organizations=Organisations +search=Search + +[auth] +create_new_account=Create New Account +register_hepler_msg=Already have an account? Sign in now! +social_register_hepler_msg=Already have an account? Bind now! +disable_register_prompt=Sorry, registration has been disabled. Please contact the site administrator. +disable_register_mail=Sorry, Register Mail Confirmation has been disabled. +auth_source=Authentication Source +local=Local +remember_me=Remember Me +forgot_password=Forgot Password +forget_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. +active_your_account=Activate Your Account +prohibit_login=Login Prohibited +prohibit_login_desc=Your account is prohibited to login, please contact site admin. +resent_limit_prompt=Sorry, you 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 +send_reset_mail=Click here to (re)send your password reset email +reset_password=Reset Your Password +invalid_code=Sorry, your confirmation code has expired or not valid. +reset_password_helper=Click here to reset your password +password_too_short=Password length cannot be less then 6. +non_local_account=Non-local accounts cannot change passwords through Gogs. + +login_two_factor=Two-factor Authentication +login_two_factor_passcode=Authentication Passcode +login_two_factor_enter_recovery_code=Enter a two-factor recovery code +login_two_factor_recovery=Two-factor Recovery +login_two_factor_recovery_code=Recovery Code +login_two_factor_enter_passcode=Enter a two-factor passcode +login_two_factor_invalid_recovery_code=Recovery code has been used or does not valid. + +[mail] +activate_account=Please activate your account +activate_email=Verify your email address +reset_password=Reset your password +register_success=Registration successful, welcome +register_notify=Welcome on board + +[modal] +yes=Yes +no=No +modify=Modify + +[form] +UserName=Username +RepoName=Repository name +Email=Email address +Password=Password +Retype=Re-type password +SSHTitle=SSH key name +HttpsUrl=HTTPS URL +PayloadUrl=Payload URL +TeamName=Team name +AuthName=Authorisation name +AdminEmail=Admin email + +NewBranchName=New branch name +CommitSummary=Commit summary +CommitMessage=Commit message +CommitChoice=Commit choice +TreeName=File path +Content=Content + +require_error=` cannot be empty.` +alpha_dash_error=` must be valid alpha or numeric or dash(-_) characters.` +alpha_dash_dot_error=` must be valid alpha or numeric or dash(-_) or dot characters.` +alpha_dash_dot_slash_error=` must be valid alpha or numeric or dash(-_) or dot characters or slashes.` +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 didn't match. +password_not_match=Password and confirm password are not same. + +username_been_taken=Username has already been taken. +repo_name_been_taken=Repository name has already been taken. +org_name_been_taken=Organisation 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. +auth_source_mismatch=The authentication source selected is not associated with the user. + +enterred_invalid_repo_name=Please make sure that the repository name you have entered is correct. +enterred_invalid_owner_name=Please make sure that the owner name you have entered is correct. +enterred_invalid_password=Please make sure the that password you have entered is correct. +user_not_exist=Given user does not exist. +last_org_owner=Removing the last user from a owner team isn't allowed, as there must always be at least one owner in any given organisation. + +invalid_ssh_key=Sorry, we're not able to verify your SSH key: %s +unable_verify_ssh_key=Gogs cannot verify your SSH key, but we assume that it is valid, please double-check it. +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 organisation, you have to leave or delete your memberships first. +org_still_own_repo=This organisation still has ownership of repositories, you must delete or transfer them first. + +target_branch_not_exist=Target branch does not exist. + +[user] +change_avatar=Change your avatar +join_on=Joined on +repositories=Repositories +activity=Public Activity +followers=Followers +starred=Starred repositories +following=Following +follow=Follow +unfollow=Unfollow + +form.name_not_allowed=Username or pattern %q is not allowed. + + +[settings] +profile=Profile +password=Password +avatar=Avatar +ssh_keys=SSH Keys +security=Security +repos=Repositories +orgs=Organisations +applications=Applications +delete=Delete Account + +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. +full_name=Full Name +website=Website +location=Location +update_profile=Update Profile +update_profile_success=Your profile has been updated successfully. +change_username=Username Changed +change_username_prompt=This change will affect the way how links relate to your account. +continue=Continue +cancel=Cancel + +lookup_avatar_by_mail=Lookup Avatar by mail +federated_avatar_lookup=Federated Avatar Lookup +enable_custom_avatar=Use Custom Avatar +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. + +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. +change_password_success=Your password was successfully changed. You can now sign using this new password. +password_change_disabled=Non-local type users are not allowed to change their password. + +emails=Email Addresses +manage_emails=Manage email 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 related information from your account. Do you want to continue? +email_deletion_success=Email has been deleted successfully! +email_deletion_primary=Cannot delete primary email address. +add_new_email=Add new email address +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_email_success=Your new email address was successfully added. + +manage_ssh_keys=Manage SSH Keys +add_key=Add Key +ssh_desc=This is a list of SSH keys associated with your account. As these keys allow anyone using them to gain access to your repositories, it is highly important that you make sure you recognise 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. +add_new_key=Add SSH Key +ssh_key_been_used=Public key content has been used. +ssh_key_name_used=Public key with same name already exists. +key_name=Key Name +key_content=Content +add_key_success=New SSH key '%s' has been added successfully! +delete_key=Delete +ssh_key_deletion=SSH Key Deletion +ssh_key_deletion_desc=Deleting this SSH key will remove all related accesses for your account. Do you want to continue? +ssh_key_deletion_success=SSH key has been deleted successfully! +add_on=Added on +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 + +two_factor=Two-factor Authentication +two_factor_status=Status: +two_factor_on=On +two_factor_off=Off +two_factor_enable=Enable +two_factor_disable=Disable +two_factor_view_recovery_codes=View and save your recovery codes in a safe place. You can use them as passcode if you lose access to your authentication application. +two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use Personal Access Token as your credential, e.g. %[3]s. +two_factor_enable_title=Enable Two-factor Authentication +two_factor_scan_qr=Please use your authentication application to scan the image: +two_factor_or_enter_secret=Or enter the secret: +two_factor_then_enter_passcode=Then enter passcode: +two_factor_verify=Verify +two_factor_invalid_passcode=The passcode you entered is not valid, please try again! +two_factor_reused_passcode=The passcode you entered has already been used, please try another one! + +two_factor_enable_error=Enable Two-factor authentication failed: %v +two_factor_enable_success=Two-factor authentication has enabled for your account successfully! +two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes +two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, please keep these codes in a safe place. +two_factor_regenerate_recovery_codes=Regenerate Recovery Codes +two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v +two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully! +two_factor_disable_title=Disable Two-factor Authentication +two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue? +two_factor_disable_success=Two-factor authentication has disabled successfully! + +manage_access_token=Manage Personal Access Tokens +generate_new_token=Generate New Token +tokens_desc=Tokens you have generated that can be used to access the Gogs APIs. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. +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! Make sure to copy it right now, as you won't 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 remove all related accesses of application. Do you want to continue? +delete_token_success=Personal access token has been removed successfully! Don't forget to update your application as well. +token_name_exists=Token with same name already exists. + + +orgs.none=You are not a member of any organisations. +orgs.leave_title=Leave organisation +orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue? + +repos.leave=Leave +repos.leave_title=Leave repository +repos.leave_desc=You will lose access to the repository after you left. Do you want to continue? +repos.leave_success=You have left repository '%s' successfully! + +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? + +[repo] +owner=Owner +repo_name=Repository Name +repo_name_helper=A good repository name is usually composed of short, memorable and unique keywords. +visibility=Visibility +unlisted=Unlisted +visiblity_helper=This repository is Private +unlisted_helper=This repository is Unlisted +visiblity_helper_forced=Site admin 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. +repo_desc=Description +repo_lang=Language +repo_gitignore_helper=Select .gitignore templates +license=Licence +license_helper=Select a licence file +readme=Readme +readme_helper=Select a readme template +auto_init=Initialise 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_address=Mirror Address +mirror_address_desc=Please include necessary user credentials in the address. +mirror_last_synced=Last Synced +watchers=Watchers +stargazers=Stargazers +forks=Forks +repo_description_helper=Description of repository. Maximum 512 characters length. + +repo_description_length=Available characters + + +form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories. +form.name_not_allowed=Repository name or pattern %q is not allowed. + + +need_auth=Need Authorisation +migrate_type=Migration Type +migrate_type_helper=This repository will be a mirror +migrate_repo=Migrate Repository +migrate.clone_address=Clone Address +migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by 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.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. +migrate.failed=Migration failed: %v + +mirror_from=mirror of +forked_from=forked from +copy_link=Copy +copy_link_success=Copied! +copy_link_error=Press ⌘-C or Ctrl-C to copy +copied=Copied OK +unwatch=Unwatch +watch=Watch +unstar=Unstar +star=Star +fork=Fork + +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 +bare_message=This repository does not have any content yet. + +files=Files +branch=Branch +tree=Tree +filter_branch_and_tag=Filter branch or tag +branches=Branches +tags=Tags +issues=Issues +pulls=Pull Requests +labels=Labels +milestones=Milestones +commits=Commits +git_branches=Branches +releases=Releases +file_raw=Raw +file_history=History +file_view_raw=View Raw +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. + +branches.overview=Overview +branches.active_branches=Active Branches +branches.stale_branches=Stale Branches +branches.all=All Branches +branches.updated_by=Updated %[1]s by %[2]s +branches.change_default_branch=Change Default Branch +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +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.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 +editor.delete_this_file=Delete this file +editor.must_have_write_access=You must have write access to make or propose changes to this file +editor.file_delete_success=File '%s' has been deleted successfully! +editor.name_your_file=Name your file... +editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. +editor.or=or +editor.cancel_lower=cancel +editor.commit_changes=Commit Changes +editor.add_tmpl=Add '%s/' +editor.add=Add '%s' +editor.update=Update '%s' +editor.delete=Delete '%s' +editor.commit_message_desc=Add an optional extended description... +editor.commit_directly_to_this_branch=Commit directly to the %s branch. +editor.create_new_branch=Create a new branch for this commit and start a pull request. +editor.new_branch_name_desc=New branch name... +editor.cancel=Cancel +editor.filename_cannot_be_empty=Filename cannot be empty. +editor.branch_already_exists=Branch '%s' already exists in this repository. +editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. +editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor. +editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. +editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. +editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. +editor.file_already_exists=A file with name '%s' already exists in this repository. +editor.no_changes_to_show=There are no changes to show. +editor.fail_to_update_file=Failed to update/create file '%s' with error: %v +editor.fail_to_delete_file=Failed to delete 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' + +commits.commit_history=Commit History +commits.commits=Commits +commits.search=Search commits +commits.find=Find +commits.author=Author +commits.message=Message +commits.date=Date +commits.older=Older +commits.newer=Newer + +issues.new=New Issue +issues.new.labels=Labels +issues.new.no_label=No Label +issues.new.clear_labels=Clear labels +issues.new.milestone=Milestone +issues.new.no_milestone=No Milestone +issues.new.clear_milestone=Clear milestone +issues.new.open_milestone=Open Milestones +issues.new.closed_milestone=Closed Milestones +issues.new.assignee=Assignee +issues.new.clear_assignee=Clear assignee +issues.new.no_assignee=No assignee +issues.create=Create Issue +issues.new_label=New Label +issues.new_label_placeholder=Label name... +issues.create_label=Create Label +issues.label_templates.title=Load a predefined set of labels +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.helper=Select a label set +issues.label_templates.use=Use this label set +issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v +issues.open_tab=%d Open +issues.close_tab=%d Closed +issues.filter_label=Label +issues.filter_label_no_select=No selected label +issues.filter_milestone=Milestone +issues.filter_milestone_no_select=No selected milestone +issues.filter_assignee=Assignee +issues.filter_assginee_no_select=No selected Assignee +issues.filter_type=Type +issues.filter_type.all_issues=All issues +issues.filter_type.assigned_to_you=Assigned to you +issues.filter_type.created_by_you=Created by you +issues.filter_type.mentioning_you=Mentioning you +issues.filter_sort=Sort +issues.filter_sort.latest=Newest +issues.filter_sort.oldest=Oldest +issues.filter_sort.recentupdate=Recently updated +issues.filter_sort.leastupdate=Least recently updated +issues.filter_sort.mostcomment=Most commented +issues.filter_sort.leastcomment=Least commented +issues.opened_by=opened %[1]s by %[3]s +issues.opened_by_fake=opened %[1]s by %[2]s +issues.previous=Previous +issues.next=Next +issues.open_title=Open +issues.closed_title=Closed +issues.num_comments=%d comments +issues.commented_at=`commented %s` +issues.delete_comment_confirm=Are you sure you want to delete this comment? +issues.no_content=There is no content yet. +issues.close_issue=Close +issues.close_comment_issue=Comment and close +issues.reopen_issue=Reopen +issues.reopen_comment_issue=Comment and reopen +issues.create_comment=Comment +issues.closed_at=`closed %[2]s` +issues.reopened_at=`reopened %[2]s` +issues.commit_ref_at=`referenced this issue from a commit %[2]s` +issues.poster=Poster +issues.collaborator=Collaborator +issues.owner=Owner +issues.sign_in_require_desc=Sign in to join this conversation. +issues.edit=Edit +issues.cancel=Cancel +issues.save=Save +issues.label_title=Label name +issues.label_color=Label colour +issues.label_count=%d labels +issues.label_open_issues=%d open issues +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. Do you want to continue? +issues.label_deletion_success=Label has been deleted successfully! +issues.num_participants=%d Participants +issues.attachment.open_tab=`Click to see "%s" in a new tab` +issues.attachment.download=`Click to download "%s"` + +pulls.new=New Pull Request +pulls.compare_changes=Compare Changes +pulls.compare_changes_desc=Compare two branches and make a pull request for changes. +pulls.compare_base=base +pulls.compare_compare=compare +pulls.filter_branch=Filter branch +pulls.no_results=No results found. +pulls.nothing_to_compare=There is nothing to compare because base and head branches are even. +pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history. +pulls.has_pull_request=`There is already a pull request between these two targets: %[2]s#%[3]d` +pulls.create=Create Pull Request +pulls.title_desc=wants to merge %[1]d commits from %[2]s into %[3]s +pulls.merged_title_desc=merged %[1]d commits from %[2]s into %[3]s %[4]s +pulls.tab_conversation=Conversation +pulls.tab_commits=Commits +pulls.tab_files=Files changed +pulls.reopen_to_merge=Please reopen this pull request to perform merge operation. +pulls.merged=Merged +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 can't be merged automatically because there are conflicts. +pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts. +pulls.create_merge_commit=Create a merge commit + +pulls.rebase_before_merging=Rebase before merging +pulls.commit_description=Commit Description +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.delete_branch=Delete Branch +pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence. + +milestones.new=New Milestone +milestones.open_tab=%d Open +milestones.close_tab=%d Closed +milestones.closed=Closed %s +milestones.no_due_date=No due date +milestones.open=Open +milestones.close=Close +milestones.new_subheader=Create milestones to organise your issues. +milestones.create=Create Milestone +milestones.title=Title +milestones.desc=Description +milestones.due_date=Due Date (optional) +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.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_success=Milestone has been deleted successfully! + +wiki=Wiki +wiki.welcome=Welcome to Wiki! +wiki.welcome_desc=Wiki is the place where you would like to document your project together and make it better. +wiki.create_first_page=Create the first page +wiki.page=Page +wiki.filter_page=Filter page +wiki.new_page=Create New Page +wiki.default_commit_message=Write a note about this update (optional). +wiki.save_page=Save Page +wiki.last_commit_info=%s edited this page %s +wiki.edit_page_button=Edit +wiki.new_page_button=New Page +wiki.delete_page_button=Delete Page +wiki.delete_page_notice_1=This will delete the page "%s". Please be certain. +wiki.page_already_exists=Wiki page with same name already exists. +wiki.pages=Pages +wiki.last_updated=Last updated %s + +settings=Settings +settings.options=Options +settings.collaboration=Collaboration +settings.collaboration.admin=Admin +settings.collaboration.write=Write +settings.collaboration.read=Read +settings.collaboration.undefined=Undefined +settings.branches=Branches +settings.branches_bare=You cannot manage branches for bare repository. Please push some content first. +settings.default_branch=Default Branch +settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing. +settings.update=Update +settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server. +settings.update_default_branch_success=Default branch of this repository has been updated successfully! +settings.protected_branches=Protected Branches +settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers. +settings.choose_a_branch=Choose a branch... +settings.branch_protection=Branch Protection +settings.branch_protection_desc=Please choose protect options for branch %s. +settings.protect_this_branch=Protect this branch +settings.protect_this_branch_desc=Disable force pushes and prevent from deletion. +settings.protect_require_pull_request=Require pull request instead direct pushing +settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request. +settings.protect_whitelist_committers=Whitelist who can push to this branch +settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check. +settings.protect_whitelist_users=Users who can push to this branch +settings.protect_whitelist_search_users=Search users +settings.protect_whitelist_teams=Teams for which members of them can push to this branch +settings.protect_whitelist_search_teams=Search teams +settings.update_protect_branch_success=Protect options for this branch has been updated successfully! +settings.hooks=Webhooks +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.site=Official Site +settings.update_settings=Update Settings +settings.change_reponame_prompt=This change will affect how links relate to the repository. +settings.advanced_settings=Advanced Settings +settings.wiki_desc=Enable wiki system +settings.use_internal_wiki=Use builtin wiki +settings.allow_public_wiki_desc=Allow public access to wiki when repository is private +settings.use_external_wiki=Use external wiki +settings.external_wiki_url=External Wiki URL +settings.external_wiki_url_desc=Visitors will be redirected to URL when they click on the tab. +settings.issues_desc=Enable issue tracker +settings.use_internal_issue_tracker=Use builtin lightweight issue tracker +settings.allow_public_issues_desc=Allow public access to issues when repository is private +settings.use_external_issue_tracker=Use external issue tracker +settings.external_tracker_url=External Issue Tracker URL +settings.external_tracker_url_desc=Visitors will be redirected to URL when they click on the tab. +settings.tracker_url_format=External Issue Tracker URL Format +settings.tracker_issue_style=External Issue Tracker Naming Style: +settings.tracker_issue_style.numeric=Numeric +settings.tracker_issue_style.alphanumeric=Alphanumeric +settings.tracker_url_format_desc=You can use placeholder {user} {repo} {index} for user name, repository name and issue index. +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches + +settings.pulls.ignore_whitespace=Ignore changes in whitespace + +settings.pulls.allow_rebase_merge=Allow use rebase to merge commits + +settings.danger_zone=Danger Zone +settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner. +settings.new_owner_has_same_repo=The new owner already has a repository with same name. Please choose another name. +settings.convert=Convert To Regular Repository +settings.convert_desc=You can convert this mirror to a regular repository. This cannot be reversed. +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 regular type successfully. +settings.transfer=Transfer Ownership +settings.transfer_desc=Transfer this repository to another user or to an organisation in which you have admin rights. +settings.transfer_notices_1=- You will lose access if new owner is a individual user. +settings.transfer_notices_2=- You will conserve access if new owner is an organisation and if you're one of the owners. +settings.transfer_form_title=Please enter following information to confirm your operation: +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.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 everything in this repository, including Git data, issues, comments and collaborator access. + +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.transfer_owner=New Owner +settings.make_transfer=Make Transfer +settings.transfer_succeed=Repository ownership has been transferred successfully. +settings.confirm_delete=Confirm Deletion +settings.add_collaborator=Add New Collaborator +settings.add_collaborator_success=New collaborator has been added. +settings.delete_collaborator=Delete +settings.collaborator_deletion=Collaborator Deletion +settings.collaborator_deletion_desc=This user will no longer have collaboration access to this repository after deletion. Do you want to continue? +settings.remove_collaborator_success=Collaborator has been removed. +settings.search_user_placeholder=Search user... +settings.org_not_allowed_to_be_collaborator=Organisation is not allowed to be added as a collaborator. +settings.hooks_desc=Webhooks are much like basic HTTP POST event triggers. Whenever something occurs in Gogs, we will handle the notification to the target host you specify. Learn more in this Webhooks Guide. +settings.webhooks.add_new=Add a new webhook: + +settings.webhooks.choose_a_type=Choose a type... + +settings.add_webhook=Add Webhook +settings.webhook_deletion=Delete Webhook +settings.webhook_deletion_desc=Delete this webhook will remove its information and all delivery history. Do you want to continue? +settings.webhook_deletion_success=Webhook has been deleted successfully! +settings.webhook.test_delivery=Test Delivery +settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings +settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history. +settings.webhook.redelivery=Redelivery +settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. +settings.webhook.request=Request +settings.webhook.response=Response +settings.webhook.headers=Headers +settings.webhook.payload=Payload +settings.webhook.body=Body +settings.webhook.err_cannot_parse_payload_url=Cannot parse the payload URL: %v + +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. +settings.githooks_desc=Git Hooks are powered by Git itself, you can edit files of supported hooks in the list below to perform custom operations. +settings.githook_edit_desc=If the hook is inactive, sample content will be presented. Leaving content to an empty value will disable this hook. +settings.githook_name=Hook Name +settings.githook_content=Hook Content +settings.update_githook=Update Hook +settings.add_webhook_desc=Gogs 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.payload_url=Payload URL +settings.content_type=Content Type +settings.secret=Secret +settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. +settings.slack_username=Username +settings.slack_icon_url=Icon URL +settings.slack_color=Colour +settings.event_desc=When should this webhook be triggered? +settings.event_push_only=Just the push event. +settings.event_send_everything=I need everything. +settings.event_choose=Let me choose what I need. +settings.event_create=Create +settings.event_create_desc=Branch or tag created +settings.event_delete=Delete +settings.event_delete_desc=Branch or tag deleted +settings.event_fork=Fork +settings.event_fork_desc=Repository forked +settings.event_push=Push +settings.event_push_desc=Git push to a repository +settings.event_issues=Issues +settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=Issue Comment +settings.event_issue_comment_desc=Issue comment created, edited, or deleted. +settings.event_release=Release +settings.event_release_desc=Release published in a repository. +settings.active=Active +settings.active_helper=Details regarding the event which triggered the hook will be delivered as well. +settings.add_hook_success=New webhook has been added. +settings.update_webhook=Update Webhook +settings.update_hook_success=Webhook has been updated. +settings.delete_webhook=Delete Webhook +settings.recent_deliveries=Recent Deliveries +settings.hook_type=Hook Type +settings.add_slack_hook_desc=Add Slack integration to your repository. +settings.add_discord_hook_desc=Add Discord integration to your repository. +settings.add_dingtalk_hook_desc=Add Dingtalk integration to your repository. +settings.slack_token=Token +settings.slack_domain=Domain +settings.slack_channel=Channel +settings.deploy_keys=Deploy Keys +settings.deploy_keys_helper=Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. +settings.add_deploy_key=Add Deploy Key +settings.deploy_key_desc=Deploy keys have read-only access. They are not the same as personal account SSH keys. +settings.no_deploy_keys=You haven't added any deploy keys. +settings.title=Title +settings.deploy_key_content=Content +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_success=Deploy key has been deleted successfully! +settings.description_desc=Description of repository. Maximum 512 characters length. + +settings.description_length=Available characters + + +diff.browse_source=Browse Source +diff.parent=parent +diff.commit=commit +diff.data_not_available=Diff Data Not Available. +diff.show_diff_stats=Show Diff Stats +diff.show_split_view=Split View +diff.show_unified_view=Unified View +diff.stats_desc= %d changed files with %d additions and %d deletions +diff.bin=BIN +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 + +release.releases=Releases +release.new_release=New Release +release.draft=Draft +release.prerelease=Pre-Release +release.edit=edit +release.ahead=%d commits to %s since this release +release.source_code=Source Code +release.new_subheader=Publish releases to iterate product. +release.edit_subheader=Detailed change log can help users understand what has been improved. +release.tag_name=Tag name +release.target=Target +release.tag_helper=Choose an existing tag, or create a new tag on publish. +release.title=Title +release.content=Content +release.write=Write +release.preview=Preview +release.loading=Loading... +release.prerelease_desc=This is a pre-release +release.prerelease_helper=We'll point out that this release is not production-ready. +release.cancel=Cancel +release.publish=Publish Release +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.tag_name_already_exist=Release with this tag name already exists. +release.tag_name_invalid=Tag name is not valid. +release.downloads=Downloads + +[org] +org_name_holder=Organisation Name +org_full_name_holder=Organisation Full Name +org_name_helper=Great organisation names are short and memorable. +create_org=Create Organisation +repo_updated=Updated +people=People +invite_someone=Invite Someone +teams=Teams +lower_members=members +lower_repositories=repositories +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_desc_helper=What is this team all about? +team_permission_desc=What permission level should this team have? + +form.name_not_allowed=Organization name or pattern %q is not allowed. + +form.team_name_not_allowed=Team name or pattern %q is not allowed. + + +settings=Settings +settings.options=Options +settings.full_name=Full Name +settings.website=Website +settings.location=Location +settings.update_settings=Update Settings +settings.update_setting_success=Organisation settings has been updated successfully. +settings.change_orgname_prompt=This change will affect how links relate to the organisation. +settings.update_avatar_success=Organisation avatar setting has been updated successfully. +settings.delete=Delete Organisation +settings.delete_account=Delete This Organisation +settings.delete_prompt=The organisation will be permanently removed, and this CANNOT be undone! +settings.confirm_delete_account=Confirm Deletion +settings.delete_org_title=Organisation Deletion +settings.delete_org_desc=This organisation 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 organisation. + +members.membership_visibility=Membership Visibility: +members.public=Public +members.public_helper=make private +members.private=Private +members.private_helper=make public +members.member_role=Member Role: +members.owner=Owner +members.member=Member +members.remove=Remove +members.leave=Leave +members.invite_desc=Add a new member to %s: +members.invite_now=Invite Now + +teams.join=Join +teams.leave=Leave +teams.read_access=Read Access +teams.read_access_helper=This team will be able to view and clone its repositories. +teams.write_access=Write Access +teams.write_access_helper=This team will be able to read its repositories, as well as push to them. +teams.admin_access=Admin Access +teams.admin_access_helper=This team will be able to push/pull to its repositories, as well as add other collaborators to them. +teams.no_desc=This team has no description +teams.settings=Settings +teams.owners_permission_desc=Owners have full access to all repositories and have admin rights to the organisation. +teams.members=Team Members +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.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. +teams.repositories=Team Repositories +teams.search_repo_placeholder=Search repository... +teams.add_team_repository=Add Team Repository +teams.remove_repo=Remove +teams.add_nonexistent_repo=The repository you're trying to add does not exist, please create it first. + +[admin] +dashboard=Dashboard +users=Users +organizations=Organisations +repositories=Repositories +authentication=Authentications +config=Configuration +notices=System Notices +monitor=Monitoring +first_page=First +last_page=Last +total=Total: %d + +dashboard.build_info=Build Information + +dashboard.app_ver=Application version + +dashboard.git_version=Git version + +dashboard.go_version=Go version + +dashboard.build_time=Build time + +dashboard.build_commit=Build commit + +dashboard.statistic=Statistics +dashboard.operations=Operations +dashboard.system_status=System Monitor Status +dashboard.statistic_info=Gogs database has %d users, %d organisations, %d public keys, %d repositories, %d watches, %d stars, %d actions, %d accesses, %d issues, %d comments, %d social accounts, %d follows, %d mirrors, %d releases, %d login sources, %d webhooks, %d milestones, %d labels, %d hook tasks, %d teams, %d update tasks, %d attachments. +dashboard.operation_name=Operation Name +dashboard.operation_switch=Switch +dashboard.select_operation_to_run=Please select an operation to run + +dashboard.operation_run=Run +dashboard.clean_unbind_oauth=Clean unbound OAuthes +dashboard.clean_unbind_oauth_success=All unbind OAuthes have been deleted successfully. +dashboard.delete_inactivate_accounts=Delete all inactive accounts +dashboard.delete_inactivate_accounts_success=All inactivate accounts have been deleted successfully. +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 that lost Git files +dashboard.delete_missing_repos_success=All repository records that lost Git files have been deleted successfully. +dashboard.git_gc_repos=Do garbage collection on repositories +dashboard.git_gc_repos_success=All repositories have done garbage collection successfully. +dashboard.resync_all_sshkeys=Rewrite '.ssh/authorized_keys' file (caution: non-Gogs keys will be lost) +dashboard.resync_all_sshkeys_success=All public keys have been rewritten successfully. +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 repository records that lost Git files +dashboard.reinit_missing_repos_success=All repository records that lost Git files have been reinitialised successfully. + +dashboard.server_uptime=Server Uptime +dashboard.current_goroutine=Current Goroutines +dashboard.current_memory_usage=Current Memory Usage +dashboard.total_memory_allocated=Total Memory Allocated +dashboard.memory_obtained=Memory Obtained +dashboard.pointer_lookup_times=Pointer Lookup Times +dashboard.memory_allocate_times=Memory Allocate Times +dashboard.memory_free_times=Memory Free Times +dashboard.current_heap_usage=Current Heap Usage +dashboard.heap_memory_obtained=Heap Memory Obtained +dashboard.heap_memory_idle=Heap Memory Idle +dashboard.heap_memory_in_use=Heap Memory In Use +dashboard.heap_memory_released=Heap Memory Released +dashboard.heap_objects=Heap Objects +dashboard.bootstrap_stack_usage=Bootstrap Stack Usage +dashboard.stack_memory_obtained=Stack Memory Obtained +dashboard.mspan_structures_usage=MSpan Structures Usage +dashboard.mspan_structures_obtained=MSpan Structures Obtained +dashboard.mcache_structures_usage=MCache Structures Usage +dashboard.mcache_structures_obtained=MCache Structures Obtained +dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtained +dashboard.gc_metadata_obtained=GC Metadata Obtained +dashboard.other_system_allocation_obtained=Other System Allocation Obtained +dashboard.next_gc_recycle=Next GC Recycle +dashboard.last_gc_time=Since Last GC Time +dashboard.total_gc_time=Total GC Pause +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.new_account=Create New Account +users.name=Name +users.activated=Activated +users.admin=Admin +users.repos=Repos +users.created=Created +users.send_register_notify=Send Registration Notification To User +users.new_success=New account '%s' has been created successfully. +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.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_admin=This account has administrator permissions +users.allow_git_hook=This account has permissions to create Git hooks +users.allow_import_local=This account has permissions to import local repositories +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 have to delete or transfer them first. +users.still_has_org=This account still has membership in at least one organisation, you have to leave or delete the organisations first. +users.deletion_success=Account has been deleted successfully! + +orgs.org_manage_panel=Organisation Manage Panel +orgs.name=Name +orgs.teams=Teams +orgs.members=Members + +repos.repo_manage_panel=Repository Manage Panel +repos.owner=Owner +repos.name=Name +repos.private=Private +repos.watches=Watches +repos.stars=Stars +repos.issues=Issues +repos.size=Size + +auths.auth_sources=Authentication Sources +auths.new=Add New Source +auths.name=Name +auths.type=Type +auths.enabled=Enabled +auths.default=Default +auths.updated=Updated +auths.auth_type=Authentication Type +auths.auth_name=Authentication Name +auths.security_protocol=Security Protocol +auths.domain=Domain +auths.host=Host +auths.port=Port +auths.bind_dn=Bind DN +auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s + +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.user_base=User Search Base +auths.user_dn=User DN +auths.attribute_username=Username attribute +auths.attribute_username_placeholder=Leave empty to use sign-in form field value for user name. +auths.attribute_name=First Name Attribute +auths.attribute_surname=Surname Attribute +auths.attribute_mail=Email Attribute +auths.verify_group_membership=Verify group membership +auths.group_search_base_dn=Group Search Base DN +auths.group_filter=Group Filter +auths.group_attribute_contain_user_list=Group Attribute Containing List of Users +auths.user_attribute_listed_in_group=User Attribute Listed in Group +auths.attributes_in_bind=Fetch attributes in Bind DN context +auths.filter=User Filter +auths.admin_filter=Admin Filter +auths.ms_ad_sa=Ms Ad SA +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.enable_tls=Enable TLS Encryption +auths.skip_tls_verify=Skip TLS Verify +auths.pam_service_name=PAM Service Name +auths.enable_auto_register=Enable Auto Registration +auths.edit=Edit Authentication Setting +auths.activated=This authentication is activated +auths.default_auth=This authentication is the default login page + +auths.new_success=New authentication '%s' has been added successfully. +auths.update_success=Authentication setting has been updated successfully. +auths.update=Update Authentication Setting +auths.delete=Delete This Authentication +auths.delete_auth_title=Authentication Deletion +auths.delete_auth_desc=This authentication is going to be deleted, do you want to continue? +auths.still_in_used=This authentication 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. +auths.github_api_endpoint=API Endpoint + +config.not_set=(not set) + +config.server_config=Server Configuration +config.brand_name=Brand name + +config.run_user=Run User +config.run_mode=Run Mode +config.server.external_url=External URL + +config.server.domain=Domain + +config.server.protocol=Protocol +config.server.http_addr=HTTP address + +config.server.http_port=HTTP port + +config.server.cert_file=Certificate file + +config.server.key_file=Key file + +config.server.tls_min_version=Minimum TLS version + +config.server.unix_socket_permission=Unix socket permission + +config.server.local_root_url=Local root URL + +config.server.offline_mode=Offline mode + +config.server.disable_router_log=Disable router log + +config.server.enable_gzip=Enable Gzip + +config.server.app_data_path=Application data path + +config.server.load_assets_from_disk=Load assets from disk + +config.server.landing_url=Landing URL + + +config.ssh_config=SSH Configuration +config.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check + +config.ssh.minimum_key_sizes=Minimum key sizes + +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start + +config.ssh.start_builtin_server=Start builtin server + +config.ssh.listen_host=Listen host + +config.ssh.listen_port=Listen port + +config.ssh.server_ciphers=Server ciphers + +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Repository Configuration +config.repo.root_path=Root path + +config.repo.script_type=Script type + +config.repo.ansi_chatset=ANSI charset + +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit + +config.db_config=Database Configuration +config.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled + +config.email.subject_prefix=Subject prefix + +config.email.host=Host + +config.email.from=From + +config.email.user=User +config.email.disable_helo=Disable HELO + +config.email.helo_hostname=HELO hostname + +config.email.skip_verify=Skip certificate verify + +config.email.use_certificate=Use custom certificate + +config.email.cert_file=Certificate file + +config.email.key_file=Key file + +config.email.use_plain_text=Use plain text + +config.email.add_plain_text_alt=Add plain text alternative + +config.email.send_test_mail=Send test email + +config.email.test_mail_failed=Failed to send test email to '%s': %v + +config.email.test_mail_sent=Test email has been sent to '%s'. + + +config.auth_config=Authentication configuration + +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives + +config.auth.reset_password_code_lives=Reset password code lives + +config.auth.require_email_confirm=Require email confirmation + +config.auth.require_sign_in_view=Require sign in view + +config.auth.disable_registration=Disable registration + +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification + +config.session_config=Session Configuration +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie + +config.cache_config=Cache Configuration +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP Configuration +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit + +config.picture_config=Picture Configuration +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Webhook Configuration +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Git Configuration +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path + +config.log_config=Log Configuration +config.log_file_root_path=Log File Root Path +config.log_mode=Mode +config.log_options=Options + +monitor.cron=Cron Tasks +monitor.name=Name +monitor.schedule=Schedule +monitor.next=Next Time +monitor.previous=Previous Time +monitor.execute_times=Execute Times +monitor.process=Running Processes +monitor.desc=Description +monitor.start=Start Time +monitor.execute_time=Execution Time + +notices.system_notice_list=System Notices +notices.view_detail_header=View Notice Detail +notices.actions=Actions +notices.select_all=Select All +notices.deselect_all=Deselect All +notices.inverse_selection=Inverse Selection +notices.delete_selected=Delete Selected +notices.delete_all=Delete All Notices +notices.type=Type +notices.type_1=Repository +notices.desc=Description +notices.op=Op. +notices.delete_success=System notices have been deleted successfully. + +[action] +create_repo=created repository %s +rename_repo=renamed repository from %[1]s to %[3]s +commit_repo=pushed to %[3]s at %[4]s +compare_commits=View comparison for these %d commits +transfer_repo=transfered repository %s to %s +create_issue=`opened issue %s#%[2]s` +close_issue=`closed issue %s#%[2]s` +reopen_issue=`reopened issue %s#%[2]s` +comment_issue=`commented on issue %s#%[2]s` +create_pull_request=`created pull request %s#%[2]s` +close_pull_request=`closed pull request %s#%[2]s` +reopen_pull_request=`reopened pull request %s#%[2]s` +merge_pull_request=`merged pull request %s#%[2]s` +create_branch=created new branch %[3]s at %[4]s +delete_branch=deleted branch %[2]s at %[3]s +push_tag=pushed tag %[2]s to %[3]s +delete_tag=deleted tag %[2]s at %[3]s +fork_repo=forked a repository to %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror + +[tool] +ago=ago +from_now=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 +raw_seconds=seconds +raw_minutes=minutes +raw_hours=hours + +[dropzone] +default_message=Drop files here or click to upload. +invalid_input_type=You can't upload files of this type. +file_too_big=File size ({{filesize}} MB) exceeds maximum size ({{maxFilesize}} MB). +remove_file=Remove file + diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 90f6c60e783..8e9890ff263 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -1,15 +1,14 @@ -app_desc = A painless self-hosted Git service +app_desc = The painless way to host your own Git service home = Home dashboard = Dashboard explore = Explore help = Help -sign_in = Sign In -sign_out = Sign Out +sign_in = Sign in +sign_out = Sign out sign_up = Sign Up -register = Register +register = Create account website = Website -version = Version page = Page template = Template language = Language @@ -18,49 +17,59 @@ user_profile_and_more = User profile and more signed_in_as = Signed in as username = Username +username_placeholder = Enter your username or email email = Email password = Password +password_placeholder = Enter your password re_type = Re-Type captcha = Captcha repository = Repository organization = Organization mirror = Mirror -new_repo = New Repository -new_migrate = New Migration -new_mirror = New Mirror -new_fork = New Fork Repository -new_org = New Organization -manage_org = Manage Organizations -admin_panel = Admin Panel +new_repo = New repository +new_migrate = New migration +new_mirror = New mirror +new_fork = New fork repository +new_org = New organization +manage_org = Manage organizations +admin_panel = Admin panel account_settings = Account Settings settings = Settings -your_profile = Your Profile -your_settings = Your Settings +theme = Theme +theme_light = Light +theme_dark = Dark +theme_system = System +your_profile = Your profile +your_settings = Your settings activities = Activities -pull_requests = Pull Requests +pull_requests = Pull requests issues = Issues cancel = Cancel +[status] +page_not_found = Page not found +internal_server_error = Internal Server Error + [install] install = Installation title = Install Steps For First-time Run docker_helper = If you're running Gogs inside Docker, please read Guidelines carefully before you change anything in this page! -requite_db_desc = Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB. +requite_db_desc = Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title = Database Settings db_type = Database Type host = Host user = User password = Password db_name = Database Name +db_schema = Schema db_helper = Please use 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 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 "-". +sqlite_helper = The file path of SQLite3 database.
Please use absolute path when you start as service. +err_empty_db_path = SQLite3 database path cannot be empty. no_admin_and_disable_registration = You cannot disable registration without creating an admin account. err_empty_admin_password = Admin password cannot be empty. @@ -75,12 +84,17 @@ 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. +use_builtin_ssh_server = Use Builtin SSH Server +use_builtin_ssh_server_popup = Start builtin SSH server for Git operations to distinguish from system SSH daemon. 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. log_root_path = Log Path log_root_path_helper = Directory to write log files to. +enable_console_mode = Enable Console Mode +enable_console_mode_popup = In addition to file mode, also print logs to console. +default_branch = Default Branch optional_title = Optional Settings email_title = Email Service Settings @@ -104,19 +118,21 @@ enable_captcha = Enable Captcha enable_captcha_popup = Require validate 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, user whoever ID=1 will gain admin access automatically. +admin_setting_desc = You don't need to create an admin account right now. The first user in the users table will be automatically granted admin access. admin_title = Admin Account Settings admin_name = Username admin_password = Password confirm_password = Confirm Password admin_email = Admin Email install_gogs = Install Gogs -test_git_failed = Fail to 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. +test_git_failed = Failed to test 'git' command: %v invalid_db_setting = Database setting is not correct: %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 +smtp_host_missing_port = SMTP Host port missing from address. +invalid_smtp_from = SMTP From field is invalid: %v +save_config_failed = Failed to save configuration: %v +init_failed = Failed to initialize application: %v invalid_admin_setting = Admin account setting is invalid: %v install_success = Welcome! We're glad that you chose Gogs, have fun and take care. invalid_log_root_path = Log root path is invalid: %v @@ -142,27 +158,46 @@ search = Search [auth] create_new_account = Create New Account +sign_in_submitting = Signing in... +sign_in_failed = Could not sign in, please try again. +show_password = Show password +hide_password = Hide password +back_to_sign_in = Back to sign in +mfa_title = Multi-factor authentication +mfa_passcode = Passcode +mfa_passcode_placeholder = Enter the 6-digit code from your authenticator +mfa_recovery_code = Recovery code +mfa_recovery_code_placeholder = Enter a recovery code +mfa_use_recovery_code = Use a recovery code instead +mfa_use_passcode = Use a passcode instead +mfa_verify = Verify +mfa_verifying = Verifying... +mfa_session_expired = Your sign-in session has expired. Please sign in again. +mfa_verify_failed = Verification failed. Please try again. +mfa_invalid_passcode = The passcode you entered is not valid. +mfa_reused_passcode = The passcode you entered has already been used, please try another one. +mfa_invalid_recovery_code = Recovery code already used or invalid. register_hepler_msg = Already have an account? Sign in now! social_register_hepler_msg = Already have an account? Bind 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 +disable_register_mail = Sorry, email services are disabled. Please contact the site administrator. +auth_source = Authentication source +local = Local forgot_password= Forgot Password forget_password = Forgot password? -sign_up_now = Need an account? Sign up now. +sign_up_now = Create a new account 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. active_your_account = Activate Your Account prohibit_login = Login Prohibited -prohibit_login_desc = Your account is prohibited to login, please contact site admin. +prohibit_login_desc = Your account is prohibited from logging in. Please contact the site admin. resent_limit_prompt = Sorry, you 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. +has_unconfirmed_mail = Hi %s, you have an unconfirmed email address (%s). If you haven't received a confirmation email or need to receive a new one, please click 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 reset_password = Reset Your Password invalid_code = Sorry, your confirmation code has expired or not valid. reset_password_helper = Click here to reset your password -password_too_short = Password length cannot be less then 6. +password_too_short = Password length must be at least 6 characters. non_local_account = Non-local accounts cannot change passwords through Gogs. [mail] @@ -178,7 +213,9 @@ no = No modify = Modify [form] +invalid_request = The request could not be processed UserName = Username +Username = Username RepoName = Repository name Email = Email address Password = Password @@ -189,6 +226,8 @@ PayloadUrl = Payload URL TeamName = Team name AuthName = Authorization name AdminEmail = Admin email +Passcode = Passcode +RecoveryCode = Recovery code NewBranchName = New branch name CommitSummary = Commit summary @@ -198,9 +237,10 @@ TreeName = File path Content = Content require_error = ` cannot be empty.` -alpha_dash_error = ` must be valid alpha or numeric or dash(-_) characters.` -alpha_dash_dot_error = ` must be valid alpha or numeric or dash(-_) or dot characters.` -size_error = ` must be size %s.` +alpha_dash_error = ` must be alphanumeric or dash(-_) characters.` +alpha_dash_dot_error = ` must be alphanumeric or dash(-_) or dot characters.` +alpha_dash_dot_slash_error = ` must be alphanumeric, dash (-_), dot or slash characters.` +size_error = ` size must be %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.` @@ -215,15 +255,16 @@ repo_name_been_taken = Repository name has already been taken. 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. +username_password_incorrect = Username or password is incorrect. +auth_source_mismatch = The authentication source selected is not associated with the user. 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 = Given user does not exist. -last_org_owner = Removing the last user from a owner team isn't allowed, as there must always be at least one owner in any given organization. +last_org_owner = Removing the last remaining user from an owner team is not allowed, as an organization must always have at least one owner. -invalid_ssh_key = Sorry, we're not able to verify your SSH key: %s -unable_verify_ssh_key = Gogs cannot verify your SSH key, but we assume that it is valid, please double-check it. +invalid_ssh_key = Sorry, verification of your SSH key failed: %s +unable_verify_ssh_key = Gogs cannot verify your SSH key, but it's assumed to be valid. Please double-check it. 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. @@ -243,19 +284,18 @@ 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_not_allowed = User name or pattern %q is not allowed. [settings] profile = Profile password = Password avatar = Avatar ssh_keys = SSH Keys -social = Social Accounts -applications = Applications +security = Security +repos = Repositories orgs = Organizations +applications = Applications delete = Delete Account -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. @@ -284,7 +324,7 @@ old_password = Current Password new_password = New Password retype_new_password = Retype New Password password_incorrect = Current password is not correct. -change_password_success = Your password was successfully changed. You can now sign using this new password. +change_password_success = Your password was successfully changed and can now be used for logging in. password_change_disabled = Non-local type users are not allowed to change their password. emails = Email Addresses @@ -296,8 +336,9 @@ delete_email = Delete email_deletion = Email Deletion email_deletion_desc = Deleting this email address will remove related information from your account. Do you want to continue? email_deletion_success = Email has been deleted successfully! +email_deletion_primary = Cannot delete primary email address. add_new_email = Add new email address -add_email = Add email +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_email_success = Your new email address was successfully added. @@ -321,14 +362,36 @@ 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 -manage_social = Manage Associated Social Accounts -social_desc = This is a list of associated social accounts. Remove any binding that you do not recognize. -unbind = Unbind -unbind_success = Social account has been unbound. +two_factor = Two-factor Authentication +two_factor_status = Status: +two_factor_on = On +two_factor_off = Off +two_factor_enable = Enable +two_factor_disable = Disable +two_factor_view_recovery_codes = View and save your recovery codes in a safe place. You can use them as passcode if you lose access to your authentication application. +two_factor_http = For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use Personal Access Token as your credential, e.g. %[3]s. +two_factor_enable_title = Enable Two-factor Authentication +two_factor_scan_qr = Please use your authentication application to scan the image: +two_factor_or_enter_secret = Or enter the secret: +two_factor_then_enter_passcode = Then enter passcode: +two_factor_verify = Verify +two_factor_invalid_passcode = The passcode you entered is not valid, please try again! +two_factor_reused_passcode = The passcode you entered has already been used, please try another one! +two_factor_enable_error = Enable Two-factor authentication failed: %v +two_factor_enable_success = Two-factor authentication has enabled for your account successfully! +two_factor_recovery_codes_title = Two-factor Authentication Recovery Codes +two_factor_recovery_codes_desc = Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, please keep these codes in a safe place. +two_factor_regenerate_recovery_codes = Regenerate Recovery Codes +two_factor_regenerate_recovery_codes_error = Regenerate recovery codes failed: %v +two_factor_regenerate_recovery_codes_success = New recovery codes has been generated successfully! +two_factor_disable_title = Disable Two-factor Authentication +two_factor_disable_desc = Your account security level will decrease after disabled two-factor authentication. Do you want to continue? +two_factor_disable_success = Two-factor authentication has disabled successfully! manage_access_token = Manage Personal Access Tokens generate_new_token = Generate New Token tokens_desc = Tokens you have generated that can be used to access the Gogs APIs. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc = Each token will have full access to your account. token_name = Token Name generate_token = Generate Token @@ -337,6 +400,16 @@ delete_token = Delete access_token_deletion = Personal Access Token Deletion access_token_deletion_desc = Delete this personal access token will remove all related accesses of application. Do you want to continue? delete_token_success = Personal access token has been removed successfully! Don't forget to update your application as well. +token_name_exists = Token with same name already exists. + +orgs.none = You are not a member of any organizations. +orgs.leave_title = Leave organization +orgs.leave_desc = You will lose access to all repositories and teams after you left the organization. Do you want to continue? + +repos.leave = Leave +repos.leave_title = Leave repository +repos.leave_desc = You will lose access to the repository after you left. Do you want to continue? +repos.leave_success = You have left repository '%s' successfully! delete_account = Delete Your Account delete_prompt = The operation will delete your account permanently, and CANNOT be undone! @@ -349,7 +422,9 @@ owner = Owner repo_name = Repository Name repo_name_helper = A good repository name is usually composed of short, memorable and unique keywords. visibility = Visibility +unlisted = Unlisted visiblity_helper = This repository is Private +unlisted_helper = This repository is Unlisted visiblity_helper_forced = Site admin 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! @@ -375,24 +450,26 @@ mirror_last_synced = Last Synced watchers = Watchers stargazers = Stargazers forks = Forks +repo_description_helper = Description of repository. Maximum 512 characters length. +repo_description_length = Available characters form.reach_limit_of_creation = The owner has reached maximum creation limit of %d repositories. -form.name_reserved = Repository name '%s' is reserved. -form.name_pattern_not_allowed = Repository name pattern '%s' is not allowed. +form.name_not_allowed = Repository name or pattern %q is not allowed. need_auth = Need Authorization migrate_type = Migration Type migrate_type_helper = This repository will be a mirror migrate_repo = Migrate Repository migrate.clone_address = Clone Address -migrate.clone_address_desc = This can be a HTTP/HTTPS/GIT URL or local server path. +migrate.clone_address_desc = This can be a HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local = You're also allowed to migrate a repository by 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.clone_address_resolved_to_blocked_local_address = Clone address resolved to a local network address that is implicitly blocked. migrate.failed = Migration failed: %v 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 @@ -408,9 +485,9 @@ 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! +bare_message = This repository does not have any content yet. -code = Code +files = Files branch = Branch tree = Tree filter_branch_and_tag = Filter branch or tag @@ -421,12 +498,23 @@ pulls = Pull Requests labels = Labels milestones = Milestones commits = Commits +git_branches = Branches releases = Releases file_raw = Raw file_history = History file_view_raw = View Raw 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. + +branches.overview = Overview +branches.active_branches = Active Branches +branches.stale_branches = Stale Branches +branches.all = All Branches +branches.updated_by = Updated %[1]s by %[2]s +branches.change_default_branch = Change Default Branch +branches.default_deletion_not_allowed = Cannot delete the default branch. +branches.protected_deletion_not_allowed = Cannot delete a protected branch. editor.new_file = New file editor.upload_file = Upload file @@ -456,16 +544,19 @@ editor.cancel = Cancel editor.filename_cannot_be_empty = Filename cannot be empty. editor.branch_already_exists = Branch '%s' already exists in this repository. editor.directory_is_a_file = Entry '%s' in the parent path is a file not a directory in this repository. +editor.file_is_a_symlink = The file '%s' is a symlink that cannot be modified from the web editor. editor.filename_is_a_directory = The filename '%s' is an existing directory in this repository. editor.file_editing_no_longer_exists = The file '%s' you are editing no longer exists in the repository. editor.file_changed_while_editing = File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. editor.file_already_exists = A file with name '%s' already exists in this repository. editor.no_changes_to_show = There are no changes to show. editor.fail_to_update_file = Failed to update/create file '%s' with error: %v +editor.fail_to_delete_file = Failed to delete 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' +commits.commit_history = Commit History commits.commits = Commits commits.search = Search commits commits.find = Find @@ -492,7 +583,7 @@ issues.new_label = New Label issues.new_label_placeholder = Label name... issues.create_label = Create Label issues.label_templates.title = Load a predefined set of labels -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.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.helper = Select a label set issues.label_templates.use = Use this label set issues.label_templates.fail_to_load_file = Failed to load label template file '%s': %v @@ -563,6 +654,7 @@ pulls.compare_compare = compare pulls.filter_branch = Filter branch pulls.no_results = No results found. pulls.nothing_to_compare = There is nothing to compare because base and head branches are even. +pulls.nothing_merge_base = There is nothing to compare because two branches have completely different history. pulls.has_pull_request = `There is already a pull request between these two targets: %[2]s#%[3]d` pulls.create = Create Pull Request pulls.title_desc = wants to merge %[1]d commits from %[2]s into %[3]s @@ -578,8 +670,13 @@ pulls.is_checking = The conflict checking is still in progress, please refresh p pulls.can_auto_merge_desc = This pull request can be merged automatically. pulls.cannot_auto_merge_desc = This pull request can't be merged automatically because there are conflicts. pulls.cannot_auto_merge_helper = Please merge manually in order to resolve the conflicts. +pulls.create_merge_commit = Create a merge commit +pulls.rebase_before_merging = Rebase before merging +pulls.commit_description = Commit Description 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.delete_branch = Delete Branch +pulls.delete_branch_has_new_commits = Branch cannot be deleted because it has new commits after mergence. milestones.new = New Milestone milestones.open_tab = %d Open @@ -630,6 +727,29 @@ settings.collaboration.admin = Admin settings.collaboration.write = Write settings.collaboration.read = Read settings.collaboration.undefined = Undefined +settings.branches = Branches +settings.branches_bare = You cannot manage branches for bare repository. Please push some content first. +settings.default_branch = Default Branch +settings.default_branch_desc = The default branch is considered the "base" branch for code commits, pull requests and online editing. +settings.update = Update +settings.update_default_branch_unsupported = Change default branch is not supported by the Git version on server. +settings.update_default_branch_success = Default branch of this repository has been updated successfully! +settings.protected_branches = Protected Branches +settings.protected_branches_desc = Protect branches from force pushing, accidental deletion and whitelist code committers. +settings.choose_a_branch = Choose a branch... +settings.branch_protection = Branch Protection +settings.branch_protection_desc = Please choose protect options for branch %s. +settings.protect_this_branch = Protect this branch +settings.protect_this_branch_desc = Disable force pushes and prevent from deletion. +settings.protect_require_pull_request = Require pull request instead direct pushing +settings.protect_require_pull_request_desc = Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request. +settings.protect_whitelist_committers = Whitelist who can push to this branch +settings.protect_whitelist_committers_desc = Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check. +settings.protect_whitelist_users = Users who can push to this branch +settings.protect_whitelist_search_users = Search users +settings.protect_whitelist_teams = Teams for which members of them can push to this branch +settings.protect_whitelist_search_teams = Search teams +settings.update_protect_branch_success = Protect options for this branch has been updated successfully! settings.hooks = Webhooks settings.githooks = Git Hooks settings.basic_settings = Basic Settings @@ -642,19 +762,26 @@ settings.change_reponame_prompt = This change will affect how links relate to th settings.advanced_settings = Advanced Settings settings.wiki_desc = Enable wiki system settings.use_internal_wiki = Use builtin wiki +settings.allow_public_wiki_desc = Allow public access to wiki when repository is private settings.use_external_wiki = Use external wiki settings.external_wiki_url = External Wiki URL settings.external_wiki_url_desc = Visitors will be redirected to URL when they click on the tab. settings.issues_desc = Enable issue tracker settings.use_internal_issue_tracker = Use builtin lightweight issue tracker +settings.allow_public_issues_desc = Allow public access to issues when repository is private settings.use_external_issue_tracker = Use external issue tracker +settings.external_tracker_url = External Issue Tracker URL +settings.external_tracker_url_desc = Visitors will be redirected to URL when they click on the tab. settings.tracker_url_format = External Issue Tracker URL Format settings.tracker_issue_style = External Issue Tracker Naming Style: settings.tracker_issue_style.numeric = Numeric settings.tracker_issue_style.alphanumeric = Alphanumeric settings.tracker_url_format_desc = You can use placeholder {user} {repo} {index} for user name, repository name and issue index. -settings.pulls_desc = Enable pull requests to accept public contributions +settings.pulls_desc = Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace = Ignore changes in whitespace +settings.pulls.allow_rebase_merge = Allow use rebase to merge commits settings.danger_zone = Danger Zone +settings.cannot_fork_to_same_owner = You cannot fork a repository to its original owner. settings.new_owner_has_same_repo = The new owner already has a repository with same name. Please choose another name. settings.convert = Convert To Regular Repository settings.convert_desc = You can convert this mirror to a regular repository. This cannot be reversed. @@ -673,7 +800,7 @@ settings.wiki_deletion_success = Repository wiki data have been erased successfu 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_2 = - This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access. 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. @@ -689,42 +816,58 @@ settings.collaborator_deletion_desc = This user will no longer have collaboratio settings.remove_collaborator_success = Collaborator has been removed. 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 Gogs, 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 Gogs, we will handle the notification to the target host you specify. +settings.webhooks.add_new = Add a new webhook: +settings.webhooks.choose_a_type = Choose a type... +settings.add_webhook = Add webhook settings.webhook_deletion = Delete Webhook settings.webhook_deletion_desc = Delete this webhook will remove its information and all delivery history. Do you want to continue? settings.webhook_deletion_success = Webhook has been deleted successfully! settings.webhook.test_delivery = Test Delivery settings.webhook.test_delivery_desc = Send a fake push event delivery to test your webhook settings settings.webhook.test_delivery_success = Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history. +settings.webhook.redelivery = Redelivery +settings.webhook.redelivery_success = Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. settings.webhook.request = Request settings.webhook.response = Response settings.webhook.headers = Headers settings.webhook.payload = Payload settings.webhook.body = Body +settings.webhook.err_cannot_parse_payload_url = Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address = Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc = Git Hooks are powered by Git itself, you can edit files of supported hooks in the list below to perform custom operations. settings.githook_edit_desc = If the hook is inactive, sample content will be presented. Leaving content to an empty value will disable this hook. settings.githook_name = Hook Name settings.githook_content = Hook Content settings.update_githook = Update Hook -settings.add_webhook_desc = Gogs 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 = Gogs will send a POST request to the URL you specify, along with details regarding the event that occurred. 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.payload_url = Payload URL settings.content_type = Content Type settings.secret = Secret +settings.secret_desc = Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. settings.slack_username = Username settings.slack_icon_url = Icon URL settings.slack_color = Color settings.event_desc = When should this webhook be triggered? -settings.event_push_only = Just the push event. -settings.event_send_everything = I need everything. -settings.event_choose = Let me choose what I need. +settings.event_push_only = Just the push event +settings.event_send_everything = I need everything +settings.event_choose = Let me choose what I need settings.event_create = Create -settings.event_create_desc = Branch, or tag created -settings.event_pull_request = Pull Request -settings.event_pull_request_desc = Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. +settings.event_create_desc = Branch or tag created +settings.event_delete = Delete +settings.event_delete_desc = Branch or tag deleted +settings.event_fork = Fork +settings.event_fork_desc = Repository forked settings.event_push = Push settings.event_push_desc = Git push to a repository +settings.event_issues = Issues +settings.event_issues_desc = Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned. +settings.event_pull_request = Pull Request +settings.event_pull_request_desc = Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment = Issue Comment +settings.event_issue_comment_desc = Issue comment created, edited, or deleted. +settings.event_release = Release +settings.event_release_desc = Release published in a repository. settings.active = Active settings.active_helper = Details regarding the event which triggered the hook will be delivered as well. settings.add_hook_success = New webhook has been added. @@ -734,10 +877,13 @@ settings.delete_webhook = Delete Webhook settings.recent_deliveries = Recent Deliveries settings.hook_type = Hook Type settings.add_slack_hook_desc = Add Slack integration to your repository. +settings.add_discord_hook_desc = Add Discord integration to your repository. +settings.add_dingtalk_hook_desc = Add Dingtalk integration to your repository. settings.slack_token = Token settings.slack_domain = Domain settings.slack_channel = Channel settings.deploy_keys = Deploy Keys +settings.deploy_keys_helper = Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. settings.add_deploy_key = Add Deploy Key settings.deploy_key_desc = Deploy keys have read-only access. They are not the same as personal account SSH keys. settings.no_deploy_keys = You haven't added any deploy keys. @@ -749,6 +895,8 @@ 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_success = Deploy key has been deleted successfully! +settings.description_desc = Description of repository. Maximum 512 characters length. +settings.description_length = Available characters diff.browse_source = Browse Source diff.parent = parent @@ -767,7 +915,6 @@ release.releases = Releases release.new_release = New Release release.draft = Draft release.prerelease = Pre-Release -release.stable = Stable release.edit = edit release.ahead = %d commits to %s since this release release.source_code = Source Code @@ -814,8 +961,8 @@ team_name_helper = You'll use this name to mention this team in conversations. team_desc_helper = What is this team all about? team_permission_desc = What permission level should this team have? -form.name_reserved = Organization name '%s' is reserved. -form.name_pattern_not_allowed = Organization name pattern '%s' is not allowed. +form.name_not_allowed = Organization name or pattern %q is not allowed. +form.team_name_not_allowed = Team name or pattern %q is not allowed. settings = Settings settings.options = Options @@ -865,9 +1012,9 @@ 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.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. +teams.read_permission_desc = Membership in this team grants Read access: members can view and clone the team's repositories. +teams.write_permission_desc = Membership in this team grants Write access: members can read from and push to the team's repositories. +teams.admin_permission_desc = Membership in this team grants Admin access: members can read from, push to, and add collaborators to the team's repositories. teams.repositories = Team Repositories teams.search_repo_placeholder = Search repository... teams.add_team_repository = Add Team Repository @@ -887,12 +1034,19 @@ first_page = First last_page = Last total = Total: %d -dashboard.statistic = Statistic +dashboard.build_info = Build Information +dashboard.app_ver = Application version +dashboard.git_version = Git version +dashboard.go_version = Go version +dashboard.build_time = Build time +dashboard.build_commit = Build commit +dashboard.statistic = Statistics dashboard.operations = Operations dashboard.system_status = System Monitor Status dashboard.statistic_info = Gogs database has %d users, %d organizations, %d public keys, %d repositories, %d watches, %d stars, %d actions, %d accesses, %d issues, %d comments, %d social accounts, %d follows, %d mirrors, %d releases, %d login sources, %d webhooks, %d milestones, %d labels, %d hook tasks, %d teams, %d update tasks, %d attachments. dashboard.operation_name = Operation Name dashboard.operation_switch = Switch +dashboard.select_operation_to_run = Please select operation to run dashboard.operation_run = Run dashboard.clean_unbind_oauth = Clean unbound OAuthes dashboard.clean_unbind_oauth_success = All unbind OAuthes have been deleted successfully. @@ -906,8 +1060,8 @@ dashboard.git_gc_repos = Do garbage collection on repositories dashboard.git_gc_repos_success = All repositories have done garbage collection successfully. dashboard.resync_all_sshkeys = Rewrite '.ssh/authorized_keys' file (caution: non-Gogs keys will be lost) dashboard.resync_all_sshkeys_success = All public keys have been rewritten successfully. -dashboard.resync_all_update_hooks = Rewrite all update hook of repositories (needed when custom config path is changed) -dashboard.resync_all_update_hooks_success = All repositories' update hook have been rewritten successfully. +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 repository records that lost Git files dashboard.reinit_missing_repos_success = All repository records that lost Git files have been reinitialized successfully. @@ -951,7 +1105,7 @@ users.created = Created users.send_register_notify = Send Registration Notification To User users.new_success = New account '%s' has been created successfully. users.edit = Edit -users.auth_source = Authentication Source +users.auth_source = Authentication source users.local = Local users.auth_login_name = Authentication Login Name users.password_helper = Leave it empty to remain unchanged. @@ -982,12 +1136,14 @@ repos.private = Private repos.watches = Watches repos.stars = Stars repos.issues = Issues +repos.size = Size -auths.auth_manage_panel = Authentication Manage Panel +auths.auth_sources = Authentication sources auths.new = Add New Source auths.name = Name auths.type = Type auths.enabled = Enabled +auths.default = Default auths.updated = Updated auths.auth_type = Authentication Type auths.auth_name = Authentication Name @@ -996,15 +1152,21 @@ auths.domain = Domain auths.host = Host auths.port = Port auths.bind_dn = Bind DN +auths.bind_dn_helper = You can use '%s' as placeholder for username, e.g. DOM\%s 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.user_base = User Search Base auths.user_dn = User DN -auths.attribute_username = Username attribute +auths.attribute_username = Username Attribute auths.attribute_username_placeholder = Leave empty to use sign-in form field value for user name. -auths.attribute_name = First name attribute -auths.attribute_surname = Surname attribute -auths.attribute_mail = Email attribute +auths.attribute_name = First Name Attribute +auths.attribute_surname = Surname Attribute +auths.attribute_mail = Email Attribute +auths.verify_group_membership = Verify group membership +auths.group_search_base_dn = Group Search Base DN +auths.group_filter = Group Filter +auths.group_attribute_contain_user_list = Group Attribute Containing List of Users +auths.user_attribute_listed_in_group = User Attribute Listed in Group auths.attributes_in_bind = Fetch attributes in Bind DN context auths.filter = User Filter auths.admin_filter = Admin Filter @@ -1018,9 +1180,9 @@ auths.enable_tls = Enable TLS Encryption auths.skip_tls_verify = Skip TLS Verify auths.pam_service_name = PAM Service Name auths.enable_auto_register = Enable Auto Registration -auths.tips = Tips auths.edit = Edit Authentication Setting auths.activated = This authentication is activated +auths.default_auth = This authentication is default login source auths.new_success = New authentication '%s' has been added successfully. auths.update_success = Authentication setting has been updated successfully. auths.update = Update Authentication Setting @@ -1030,107 +1192,186 @@ auths.delete_auth_desc = This authentication is going to be deleted, do you want auths.still_in_used = This authentication 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. - -config.server_config = Server Configuration -config.app_name = Application Name -config.app_ver = Application Version -config.app_url = Application URL -config.domain = Domain -config.offline_mode = Offline Mode -config.disable_router_log = Disable Router Log -config.run_user = Run User -config.run_mode = Run Mode -config.repo_root_path = Repository Root Path -config.static_file_root_path = Static File Root Path -config.log_file_root_path = Log File Root Path -config.script_type = Script Type -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_domain = Domain -config.ssh_port = Port -config.ssh_listen_port = Listen Port -config.ssh_root_path = Root Path -config.ssh_key_test_path = Key Test Path -config.ssh_keygen_path = Keygen ('ssh-keygen') Path -config.ssh_minimum_key_size_check = Minimum Key Size Check -config.ssh_minimum_key_sizes = Minimum Key Sizes - -config.db_config = Database Configuration -config.db_type = Type -config.db_host = Host -config.db_name = Name -config.db_user = User -config.db_ssl_mode = SSL Mode -config.db_ssl_mode_helper = (for "postgres" only) -config.db_path = Path -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.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.webhook_config = Webhook Configuration -config.queue_length = Queue Length -config.deliver_timeout = Deliver Timeout -config.skip_tls_verify = Skip TLS Verify - -config.mailer_config = Mailer Configuration -config.mailer_enabled = Enabled -config.mailer_disable_helo = Disable HELO -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_sent = Test email has been sent to '%s'. - -config.oauth_config = OAuth Configuration -config.oauth_enabled = Enabled - -config.cache_config = Cache Configuration -config.cache_adapter = Cache Adapter -config.cache_interval = Cache Interval -config.cache_conn = Cache Connection - -config.session_config = Session Configuration -config.session_provider = Session Provider -config.provider_config = Provider Config -config.cookie_name = Cookie Name -config.enable_set_cookie = Enable Set Cookie -config.gc_interval_time = GC Interval Time -config.session_life_time = Session Life Time -config.https_only = HTTPS Only -config.cookie_life_time = Cookie Life Time - -config.picture_config = Picture Configuration -config.picture_service = Picture Service -config.disable_gravatar = Disable Gravatar -config.enable_federated_avatar = Enable Federated Avatars - -config.git_config = Git Configuration -config.git_disable_diff_highlight = Disable Diff Syntax Highlight -config.git_max_diff_lines = Max Diff Lines (for a single file) -config.git_max_diff_line_characters = Max Diff Characters (for a single line) -config.git_max_diff_files = Max Diff Files (to be shown) -config.git_gc_args = GC Arguments -config.git_migrate_timeout = Migration Timeout -config.git_mirror_timeout = Mirror Update Timeout -config.git_clone_timeout = Clone Operation Timeout -config.git_pull_timeout = Pull Operation Timeout -config.git_gc_timeout = GC Operation Timeout - -config.log_config = Log Configuration -config.log_mode = Log Mode +auths.github_api_endpoint = API Endpoint + +config.not_set = (not set) +config.server_config = Server configuration +config.brand_name = Brand name +config.run_user = Run user +config.run_mode = Run mode +config.server.external_url = External URL +config.server.domain = Domain +config.server.protocol = Protocol +config.server.http_addr = HTTP address +config.server.http_port = HTTP port +config.server.cert_file = Certificate file +config.server.key_file = Key file +config.server.tls_min_version = Minimum TLS version +config.server.unix_socket_permission = Unix socket permission +config.server.local_root_url = Local root URL +config.server.offline_mode = Offline mode +config.server.disable_router_log = Disable router log +config.server.enable_gzip = Enable Gzip +config.server.app_data_path = Application data path +config.server.load_assets_from_disk = Load assets from disk +config.server.landing_url = Landing URL + +config.ssh_config = SSH configuration +config.ssh.enabled = Enabled +config.ssh.domain = Exposed domain +config.ssh.port = Exposed port +config.ssh.root_path = Root path +config.ssh.keygen_path = Keygen path +config.ssh.key_test_path = Key test path +config.ssh.minimum_key_size_check = Minimum key size check +config.ssh.minimum_key_sizes = Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start = Rewrite "authorized_keys" at start +config.ssh.start_builtin_server = Start builtin server +config.ssh.listen_host = Listen host +config.ssh.listen_port = Listen port +config.ssh.server_ciphers = Server ciphers +config.ssh.server_macs = Server MACs +config.ssh.server_algorithms = Server algorithms + +config.repo_config = Repository configuration +config.repo.root_path = Root path +config.repo.script_type = Script type +config.repo.ansi_chatset = ANSI charset +config.repo.force_private = Force private +config.repo.max_creation_limit = Max creation limit +config.repo.preferred_licenses = Preferred licenses +config.repo.disable_http_git = Disable HTTP Git +config.repo.enable_local_path_migration = Enable local path migration +config.repo.enable_raw_file_render_mode = Enable raw file render mode +config.repo.commits_fetch_concurrency = Commits fetch concurrency +config.repo.editor.line_wrap_extensions = Editor line wrap extensions +config.repo.editor.previewable_file_modes = Editor previewable file modes +config.repo.upload.enabled = Upload enabled +config.repo.upload.temp_path = Upload temporary path +config.repo.upload.allowed_types = Upload allowed types +config.repo.upload.file_max_size = Upload file size limit +config.repo.upload.max_files = Upload files limit + +config.db_config = Database configuration +config.db.type = Type +config.db.host = Host +config.db.name = Name +config.db.schema = Schema +config.db.schema_helper = (for "postgres" only) +config.db.user = User +config.db.ssl_mode = SSL mode +config.db.ssl_mode_helper = (for "postgres" only) +config.db.path = Path +config.db.path_helper = (for "sqlite3"only) +config.db.max_open_conns = Maximum open connections +config.db.max_idle_conns = Maximum idle connections + +config.security_config = Security configuration +config.security.login_remember_days = Login remember days +config.security.cookie_secure = Enable secure cookie +config.security.reverse_proxy_auth_user = Reverse proxy authentication header +config.security.enable_login_status_cookie = Enable login status cookie +config.security.login_status_cookie_name = Login status cookie +config.security.local_network_allowlist = Local network allowlist + +config.email_config = Email configuration +config.email.enabled = Enabled +config.email.subject_prefix = Subject prefix +config.email.host = Host +config.email.from = From +config.email.user = User +config.email.helo_hostname = HELO hostname +config.email.skip_verify = Skip certificate verify +config.email.use_certificate = Use custom certificate +config.email.cert_file = Certificate file +config.email.key_file = Key file +config.email.use_plain_text = Use plain text +config.email.add_plain_text_alt = Add plain text alternative +config.email.send_test_mail = Send test email +config.email.test_mail_failed = Failed to send test email to '%s': %v +config.email.test_mail_sent = Test email has been sent to '%s'. + +config.auth_config = Authentication configuration +config.auth_custom_logout_url = Custom logout URL +config.auth.activate_code_lives = Activate code lives +config.auth.reset_password_code_lives = Reset password code lives +config.auth.require_email_confirm = Require email confirmation +config.auth.require_sign_in_view = Require sign in view +config.auth.disable_registration = Disable registration +config.auth.enable_registration_captcha = Enable registration captcha +config.auth.enable_reverse_proxy_authentication = Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration = Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header = Reverse proxy authentication header +config.auth.trusted_proxy_ips = Trusted proxy IPs + +config.user_config = User configuration +config.user.enable_email_notify = Enable email notification + +config.session_config = Session configuration +config.session.provider = Provider +config.session.provider_config = Provider config +config.session.cookie_name = Cookie +config.session.https_only = HTTPS only +config.session.gc_interval = GC interval +config.session.max_life_time = Max life time +config.session.csrf_cookie_name = CSRF cookie + +config.cache_config = Cache configuration +config.cache.adapter = Adapter +config.cache.interval = GC interval +config.cache.host = Host + +config.http_config = HTTP configuration +config.http.access_control_allow_origin = Access control allow origin + +config.attachment_config = Attachment configuration +config.attachment.enabled = Enabled +config.attachment.path = Path +config.attachment.allowed_types = Allowed types +config.attachment.max_size = Size limit +config.attachment.max_files = Files limit + +config.release_config = Release configuration +config.release.attachment.enabled = Attachment enabled +config.release.attachment.allowed_types = Attachment allowed types +config.release.attachment.max_size = Attachment size limit +config.release.attachment.max_files = Attachment files limit + +config.picture_config = Picture configuration +config.picture.avatar_upload_path = User avatar upload path +config.picture.repo_avatar_upload_path = Repository avatar upload path +config.picture.gravatar_source = Gravatar source +config.picture.disable_gravatar = Disable Gravatar +config.picture.enable_federated_avatar = Enable federated avatars + +config.mirror_config = Mirror configuration +config.mirror.default_interval = Default interval + +config.webhook_config = Webhook configuration +config.webhook.types = Types +config.webhook.deliver_timeout = Deliver timeout +config.webhook.skip_tls_verify = Skip TLS verify + +config.git_config = Git configuration +config.git.disable_diff_highlight = Disable diff syntax highlight +config.git.max_diff_lines = Diff lines limit (for a single file) +config.git.max_diff_line_characters = Diff characters limit (for a single line) +config.git.max_diff_files = Diff files limit (for a single diff) +config.git.gc_args = GC arguments +config.git.migrate_timeout = Migration timeout +config.git.mirror_timeout = Mirror fetch timeout +config.git.clone_timeout = Clone timeout +config.git.pull_timeout = Pull timeout +config.git.gc_timeout = GC timeout + +config.lfs_config = LFS configuration +config.lfs.storage = Storage +config.lfs.objects_path = Objects path + +config.log_config = Log configuration +config.log_file_root_path = Log file root path +config.log_mode = Mode +config.log_options = Options monitor.cron = Cron Tasks monitor.name = Name @@ -1161,17 +1402,24 @@ notices.delete_success = System notices have been deleted successfully. create_repo = created repository %s rename_repo = renamed repository from %[1]s to %[3]s commit_repo = pushed to %[3]s at %[4]s +compare_commits = View comparison for these %d commits +transfer_repo = transfered repository %s to %s create_issue = `opened issue %s#%[2]s` close_issue = `closed issue %s#%[2]s` reopen_issue = `reopened issue %s#%[2]s` +comment_issue = `commented on issue %s#%[2]s` create_pull_request = `created pull request %s#%[2]s` close_pull_request = `closed pull request %s#%[2]s` reopen_pull_request = `reopened pull request %s#%[2]s` -comment_issue = `commented on issue %s#%[2]s` merge_pull_request = `merged pull request %s#%[2]s` -transfer_repo = transfered repository %s to %s +create_branch = created new branch %[3]s at %[4]s +delete_branch = deleted branch %[2]s at %[3]s push_tag = pushed tag %[2]s to %[3]s -compare_commits = View comparison for these %d commits +delete_tag = deleted tag %[2]s at %[3]s +fork_repo = forked a repository to %s +mirror_sync_push = synced commits to %[3]s at %[4]s from mirror +mirror_sync_create = synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete = synced and deleted reference %[2]s at %[3]s from mirror [tool] ago = ago @@ -1193,6 +1441,7 @@ months = %d months %s years = %d years %s raw_seconds = seconds raw_minutes = minutes +raw_hours = hours [dropzone] default_message = Drop files here or click to upload. diff --git a/conf/locale/locale_es-ES.ini b/conf/locale/locale_es-ES.ini index 8ac5366104e..6369bc58e59 100644 --- a/conf/locale/locale_es-ES.ini +++ b/conf/locale/locale_es-ES.ini @@ -9,7 +9,6 @@ sign_out=Cerrar sesión sign_up=Registro register=Registro website=Página web -version=Versión page=Página template=Plantilla language=Idioma @@ -44,23 +43,27 @@ issues=Incidencias cancel=Cancelar +[status] +page_not_found=Página no encontrada +internal_server_error=Error Interno del Servidor + [install] install=Instalación title=Pasos de la instalación por primera vez docker_helper=Si está ejecutando Gogs usando Docker, ¡por favor lea estas pautas antes de cambiar nada en esta página! -requite_db_desc=Gogs requiere una base de datos MySQL, PostgreSQL, SQLite3 o TiDB. +requite_db_desc=Gogs requiere MySQL, PostgreSQL, SQLite3 o TiDB (a través del protocolo MySQL). db_title=Configuración de base de datos db_type=Tipo de base de datos host=Host user=Usuario password=Contraseña db_name=Nombre de la base de datos +db_schema=Esquema 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 "-". +sqlite_helper=La ruta del archivo de base de datos de SQLite3.
Por favor usar una ruta absoluta al iniciar Gogs como servicio. +err_empty_db_path=La ruta de la base de datos SQLite3 no puede estar vacía. 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. @@ -75,12 +78,17 @@ 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. +use_builtin_ssh_server=Usar Builtin SSH Server +use_builtin_ssh_server_popup=Iniciar servidor SSH integrado para operaciones con Git para distinguirlo del demonio SSH del sistema. 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. +enable_console_mode=Activar Modo Consola +enable_console_mode_popup=Además del modo archivo, también imprime los registros en consola. +default_branch=Rama por defecto optional_title=Configuración opcional email_title=Configuración del servicio de correo @@ -111,12 +119,15 @@ admin_password=Contraseña confirm_password=Confirmar Contraseña admin_email=Correo electrónico del administrador install_gogs=Instalar Gogs -test_git_failed=Fallo al probar el comando 'git': %v +test_git_failed=Error 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 +smtp_host_missing_port=No se ha definido el puerto para el host SMTP. +invalid_smtp_from=El campo SMTP no es válido: %v save_config_failed=Error al guardar la configuración: %v +init_failed=Error al inicializar la aplicació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 Gogs, diviértete y cuídate. invalid_log_root_path=La ruta para los registros es inválida: %v @@ -137,6 +148,7 @@ issues.in_your_repos=En tus repositorios [explore] repos=Repositorios users=Usuarios +organizations=Organizaciones search=Buscar [auth] @@ -145,6 +157,8 @@ register_hepler_msg=¿Ya tienes una cuenta? ¡Inicia sesión! social_register_hepler_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. +auth_source=Authentication Source +local=Local remember_me=Recuérdame forgot_password=He olvidado mi contraseña forget_password=¿Has olvidado tu contraseña? @@ -154,16 +168,23 @@ 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. +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 te 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 6. +password_too_short=La longitud de la contraseña no puede ser menor de 6 caracteres. non_local_account=Cuentas que no son locales no pueden cambiar las contraseñas a través de Gogs. +login_two_factor=Autenticación en dos pasos +login_two_factor_passcode=Pin de autenticación +login_two_factor_enter_recovery_code=Introduce un código de recuperación de autenticación en dos pasos +login_two_factor_recovery=Recuperación de autenticación en dos pasos +login_two_factor_recovery_code=Código de recuperación +login_two_factor_enter_passcode=Introduce un Pin de autenticación a dos pasos +login_two_factor_invalid_recovery_code=El código de recuperación ya se ha utilizado o no es válido. + [mail] activate_account=Por favor, active su cuenta activate_email=Verifique su correo electrónico @@ -197,8 +218,9 @@ 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.` +alpha_dash_error=` los caracteres deben ser alfanuméricos o un guión (-_).` +alpha_dash_dot_error=` debe ser un carácter alfanumérico válido, un guión (-_) o un signo de puntuación.` +alpha_dash_dot_slash_error=` deben ser caracteres alfanuméricos, guiones(-_), puntos o barras.` 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.` @@ -215,6 +237,7 @@ 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. +auth_source_mismatch=The authentication source selected is not associated with the user. 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. @@ -242,19 +265,18 @@ 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. +form.name_not_allowed=El nombre de usuario o patrón %q no está permitido. [settings] profile=Perfil password=Contraseña avatar=Avatar ssh_keys=Claves SSH -social=Redes Sociales -applications=Aplicaciones +security=Seguridad +repos=Repositorios orgs=Organizaciones +applications=Aplicaciones delete=Eliminar cuenta -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. @@ -295,6 +317,7 @@ 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! +email_deletion_primary=Cannot delete primary email address. 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. @@ -320,14 +343,36 @@ 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. +two_factor=Autenticación en dos pasos +two_factor_status=Estado: +two_factor_on=Activado +two_factor_off=Desactivado +two_factor_enable=Activar +two_factor_disable=Desactivar +two_factor_view_recovery_codes=Guarda tus códigos de recuperación en un lugar seguro. Podrás usarlos como código de acceso si pierdes el acceso a tu aplicación de autenticación. +two_factor_http=Para las operaciones sobre HTTP/HTTPS, no puedes usar un usuario y contraseña. Por favor, cree y utilice un token de acceso personal como su credencial de acceso, por ejemplo, %[3]s. +two_factor_enable_title=Habilitar autenticación en dos pasos +two_factor_scan_qr=Por favor, use su aplicación de autenticación para escanear la imagen: +two_factor_or_enter_secret=O introduzca el secreto: +two_factor_then_enter_passcode=Introduce el Pin: +two_factor_verify=Verificar +two_factor_invalid_passcode=¡El Pin que has introducido no es válido, por favor, inténtalo de nuevo! +two_factor_reused_passcode=¡El pin de autenticación que has introducido ya ha sido usado, por favor intenta con otro! +two_factor_enable_error=Ha fallado la activación de la autenticación en dos pasos: %v +two_factor_enable_success=¡La autenticación en dos pasos se ha activado en tu cuenta correctamente! +two_factor_recovery_codes_title=Códigos de recuperación para la autenticación en dos pasos +two_factor_recovery_codes_desc=Los códigos de recuperación se usan cuando pierdes temporalmente el acceso a tu aplicación de autenticación. Cada código de recuperación solo puede utilizarse en una ocasión, por favor, mantén estos códigos en lugar seguro. +two_factor_regenerate_recovery_codes=Regenerar códigos de recuperación +two_factor_regenerate_recovery_codes_error=Ha fallado la regeneración de códigos de recuperación: %v +two_factor_regenerate_recovery_codes_success=¡Nuevos códigos de recuperación han sido generados con éxito! +two_factor_disable_title=Deshabilitar autenticación en dos pasos +two_factor_disable_desc=El nivel de seguridad de tu cuenta se verá reducido después de desactivar la autenticación en dos pasos. ¿Deseas continuar? +two_factor_disable_success=¡La autenticación en dos pasos ha sido deshabilitada satisfactoriamente! manage_access_token=Gestionar los Tokens de Acceso personales generate_new_token=Generar nuevo Token tokens_desc=Tokens usados para acceder al API de Gogs. +access_token_tips=El token de acceso personal puede utilizarse como nombre de usuario o como contraseña. Se recomienda utilizar el "x-access-token" como nombre de usuario y el token de acceso personal como contraseña para las aplicaciones Git. new_token_desc=Desde ahora, todos los tokens tendrán acceso completo a tu cuenta. token_name=Nombre del Token generate_token=Generar Token @@ -336,6 +381,16 @@ 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. +token_name_exists=Ya existe un token con el mismo nombre. + +orgs.none=No eres un miembro de ninguna organización. +orgs.leave_title=Salir de una organización +orgs.leave_desc=Perderá el acceso a todos los repositorios y equipos después dejar la organización. ¿Desea continuar? + +repos.leave=Salir +repos.leave_title=Dejar repositorio +repos.leave_desc=Perderás acceso al repositorio cuando salgas. ¿Quieres continuar? +repos.leave_success=¡Has dejado el repositorio '%s' con éxito! delete_account=Elimina tu cuenta delete_prompt=La operación eliminará tu cuenta de forma permanente y ¡NO se puede deshacer! @@ -348,7 +403,9 @@ owner=Propietario repo_name=Nombre del repositorio repo_name_helper=Los grandes nombres de repositorios son cortos, memorables y únicos. visibility=Visibilidad +unlisted=Sin listar visiblity_helper=Este repositorio es privado +unlisted_helper=Este repositorio no está en la lista 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! @@ -366,7 +423,7 @@ auto_init=Inicializar los archivos seleccionados y plantillas de este repositori create_repo=Crear repositorio default_branch=Rama por defecto mirror_prune=Purgar -mirror_prune_desc=Remover referencias remotas que no existan remotamente +mirror_prune_desc=Elimina cualquier referencia de seguimiento remoto que ya no exista en el remoto 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. @@ -374,24 +431,26 @@ mirror_last_synced=Última sincronización watchers=Seguidores stargazers=Fans forks=Forks +repo_description_helper=Descripción del repositorio. Longitud máxima de 512 caracteres. +repo_description_length=Caracteres disponibles 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. +form.name_not_allowed=El nombre de repositorio o patrón %q no está permitido. need_auth=Requiere autorización migrate_type=Tipo de migración migrate_type_helper=Este repositorio será una réplica migrate_repo=Migrar Repositorio migrate.clone_address=Clonar dirección -migrate.clone_address_desc=Puede ser una URL HTTP/HTTPS/GIT o una ruta local del servidor. +migrate.clone_address_desc=Esto puede ser una dirección URL HTTP/HTTPS/GIT. +migrate.clone_address_desc_import_local=También se le permite migrar un repositorio por la ruta del servidor local. migrate.permission_denied=No te está permitido importar repositorios locales. migrate.invalid_local_path=Rutal local inválida, no existe o no es un directorio. +migrate.clone_address_resolved_to_blocked_local_address=La dirección de clonado se ha resuelto a una dirección de red local que está implícitamente bloqueada. migrate.failed=Migración fallida: %v mirror_from=espejo de forked_from=forked de -fork_from_self=¡No puedes crear un fork de un repositorio que ya es tuyo! copy_link=Copiar copy_link_success=¡Copiado! copy_link_error=Presione ⌘ + C o Ctrl-C para copiar @@ -407,9 +466,9 @@ 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! +bare_message=Este repositorio aun no tiene contenido alguno. -code=Código +files=Archivos branch=Rama tree=Árbol filter_branch_and_tag=Filtrar por rama o etiqueta @@ -420,12 +479,23 @@ pulls=Pull Requests labels=Etiquetas milestones=Milestones commits=Commits +git_branches=Ramas releases=Releases file_raw=Raw file_history=Histórico file_view_raw=Ver Raw file_permalink=Permalink file_too_large=Este archivo es demasiado grande para ser mostrado +video_not_supported_in_browser=Su navegador no soporta el tag video de HTML5. + +branches.overview=Resumen +branches.active_branches=Ramas activas +branches.stale_branches=Ramas Viejas +branches.all=Todas las Ramas +branches.updated_by=%[1]s actualizado por %[2]s +branches.change_default_branch=Cambiar la Rama por Defecto +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Nuevo archivo editor.upload_file=Subir archivo @@ -455,16 +525,19 @@ 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 de la 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 +editor.fail_to_delete_file=Error al borrar el fichero '%s', error: %v 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.commit_history=Historial de Commits commits.commits=Commits commits.search=Buscar commits commits.find=Buscar @@ -522,7 +595,7 @@ issues.next=Página Siguiente issues.open_title=Abierta issues.closed_title=Cerrada issues.num_comments=%d comentarios -issues.commented_at='comentado %s' +issues.commented_at=`comentado %s` issues.delete_comment_confirm=¿Seguro que deseas eliminar este comentario? issues.no_content=Aún no existe contenido. issues.close_issue=Cerrar @@ -562,6 +635,7 @@ pulls.compare_compare=comparar con pulls.filter_branch=Filtrar rama pulls.no_results=Sin resultados. pulls.nothing_to_compare=Nada que comparar. Las dos ramas coinciden. +pulls.nothing_merge_base=No hay nada que comparar porque las dos ramas tienen una historia completamente distinta. pulls.has_pull_request=`Ya existe un pull request entre estas dos ramas: %[2]s#%[3]d` pulls.create=Crear Pull Request pulls.title_desc=desea fusionar %[1]d commits de %[2]s en %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=Se está procediendo a la búsqueda de conflictos, por favor a 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.create_merge_commit=Crear un commit del fusionado +pulls.rebase_before_merging=Hacer rebase antes de fusionar +pulls.commit_description=Descripción del commit 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` +pulls.delete_branch=Eliminar la rama +pulls.delete_branch_has_new_commits=La rama no se puede eliminar porque tiene nuevos commits después de la fusión. milestones.new=Nuevo Milestone milestones.open_tab=%d abiertas @@ -629,6 +708,29 @@ settings.collaboration.admin=Administrador settings.collaboration.write=Escritura settings.collaboration.read=Lectura settings.collaboration.undefined=Indefinido +settings.branches=Ramas +settings.branches_bare=No puedes gestionar ramas en un repositorio vacío. Por favor sube algún contenido primero. +settings.default_branch=Rama predeterminada +settings.default_branch_desc=Se considera la rama «base» como la rama por defecto para commits de código, las solicitudes pull y edición en línea. +settings.update=Actualizar +settings.update_default_branch_unsupported=El cambio de rama por defecto no esta soportado por la versión de Git en el servidor. +settings.update_default_branch_success=¡La Rama por defecto de este repositorio ha sido actualizado con éxito! +settings.protected_branches=Ramas protegidas +settings.protected_branches_desc=Proteger ramas force pushing, de eliminación accidental y lista blanca de committers de código. +settings.choose_a_branch=Elegir una rama... +settings.branch_protection=Protección de la rama +settings.branch_protection_desc=Por favor, elija una opción de protección para la rama %s. +settings.protect_this_branch=Proteger esta rama +settings.protect_this_branch_desc=Desactivar force pushes y evite la eliminación. +settings.protect_require_pull_request=Requiere una solicitud pull, en lugar de un push directo +settings.protect_require_pull_request_desc=Active esta opción para deshabilitar un push directo a esta rama. Los commits tienen que ser empujados a otra rama no protegida y fusionados a esta rama a través de la solicitud pull. +settings.protect_whitelist_committers=Lista blanca de quienes pueden empujar a esta rama +settings.protect_whitelist_committers_desc=Añadir personas o equipos a la lista blanca de push directo a esta rama. Los usuarios en esta lista se saltan la comprobación de pull request. +settings.protect_whitelist_users=Usuarios que pueden hacer push a esta rama +settings.protect_whitelist_search_users=Buscar usuarios +settings.protect_whitelist_teams=Equipos cuyos miembros pueden hacer push a esta rama +settings.protect_whitelist_search_teams=Buscar equipos +settings.update_protect_branch_success=¡Las opciones de protección para esta rama se han actualizado con éxito! settings.hooks=Webhooks settings.githooks=Git Hooks settings.basic_settings=Configuración Básica @@ -641,19 +743,26 @@ settings.change_reponame_prompt=Este cambio afectará a los enlaces al repositor settings.advanced_settings=Ajustes avanzados settings.wiki_desc=Activar sistema de wiki settings.use_internal_wiki=Usar wiki integrada +settings.allow_public_wiki_desc=Permitir acceso público a la wiki cuando el repositorio es privado settings.use_external_wiki=Usar Wiki externa settings.external_wiki_url=URL externa de la Wiki settings.external_wiki_url_desc=Los visitantes serán redireccionados a la URL cuando hagan click en la barra. settings.issues_desc=Habilitar rastreo de incidencias settings.use_internal_issue_tracker=Usar rastreo de incidencias ligero incluido +settings.allow_public_issues_desc=Permitir acceso público a las incidencias cuando el repositorio es privado settings.use_external_issue_tracker=Usar tracker externo de incidencias +settings.external_tracker_url=URL de seguimiento de problemas externos +settings.external_tracker_url_desc=Los visitantes serán redirigidos a la URL cuando hagan click en la barra. 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 settings.tracker_issue_style.alphanumeric=Alfanumérico settings.tracker_url_format_desc=Puedes usar las plantillas {user} {repo} {index} para el nombre de usuario, nombre del repositorio e índice de la incidencia. -settings.pulls_desc=Habilitar Pull Requests para aceptar contribuciones públicas +settings.pulls_desc=Permitir pull requests para aceptar contribuciones entre repositorios y ramas +settings.pulls.ignore_whitespace=Ignorar los cambios en el espacio en blanco +settings.pulls.allow_rebase_merge=Permite usar rebase para fusionar los commits settings.danger_zone=Zona de Peligro +settings.cannot_fork_to_same_owner=No puedes hacer fork del repositorio a su propietario original. 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. @@ -672,7 +781,7 @@ settings.wiki_deletion_success=Los datos de la wiki del repositorio han sido bor 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_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. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Este usuario no podrá colaborar en este rep settings.remove_collaborator_success=El colaborador ha sido eliminado. 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 Gogs. 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.webhooks.add_new=Añadir un nuevo webhook: +settings.webhooks.choose_a_type=Elige un tipo... +settings.add_webhook=Añadir Webhook 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.redelivery=Reenviar +settings.webhook.redelivery_success=La tarea del Hook '%s' ha sido reañadida en la cola de entrega. Puede tardar unos segundos en actualizarse el historial de estado de la cola. settings.webhook.request=Petición settings.webhook.response=Respuesta settings.webhook.headers=Encabezado settings.webhook.payload=Payload settings.webhook.body=Cuerpo del mensaje +settings.webhook.err_cannot_parse_payload_url=No se puede analizar la URL de payload: %v +settings.webhook.url_resolved_to_blocked_local_address=La URL de payload se ha resuelto a una dirección de red local que está implícitamente bloqueada. settings.githooks_desc=Los Git Hooks son una funcionalidad del propio Git, puedes editar los ficheros de los hooks soportados en la siguiente lista para aplicar operaciones personalizadas. settings.githook_edit_desc=Si el hook no está activo, se mostrará contenido de ejemplo. Dejar el contenido vacío deshabilitará este hook. settings.githook_name=Nombre del Hook @@ -711,6 +825,7 @@ settings.add_webhook_desc=Enviaremos una petición POST a la siguie settings.payload_url=URL de Payload settings.content_type=Tipo de contenido settings.secret=Secreto +settings.secret_desc=El secreto será enviado como un payload SHA256 HMAC hex digest vía cabecera X-Gogs-Signature. settings.slack_username=Nombre de usuario settings.slack_icon_url=URL de icono settings.slack_color=Color @@ -720,10 +835,20 @@ settings.event_send_everything=Necesito todo. settings.event_choose=Déjeme elegir lo que necesito. settings.event_create=Crear settings.event_create_desc=Rama o etiqueta creada -settings.event_pull_request=Pull Request -settings.event_pull_request_desc=Pull request, abierta, cerrada, reabierta, editada, asignada, desasignada, con etiqueta actualizada, con etiqueta eliminada, o sincronizada. +settings.event_delete=Borrar +settings.event_delete_desc=Rama o etiqueta borrada +settings.event_fork=Fork +settings.event_fork_desc=Repositorio forked settings.event_push=Push settings.event_push_desc=Git push a un repositorio +settings.event_issues=Incidencias +settings.event_issues_desc=Incidencia abierta, cerrada, reabierta, editada, asignada, desasignada, etiqueta actualizada, etiqueta limpiada, hito marcado, o desmarcado,. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull request abierto, cerrado, reabierto, editado, asignado, desasignado, etiqueta actualizada, etiqueta limpiada, hito marcado, hito desmarcado, o sincronizado. +settings.event_issue_comment=Comentario de incidencia +settings.event_issue_comment_desc=Comentario de incidencias creado, editado o borrado. +settings.event_release=Lanzamiento +settings.event_release_desc=Lanzamiento publicado en 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. @@ -733,10 +858,13 @@ 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.add_discord_hook_desc=Añade integración con Discord a tu repositorio. +settings.add_dingtalk_hook_desc=Añade integración con Dingtalk a tu repositorio. settings.slack_token=Token settings.slack_domain=Dominio settings.slack_channel=Canal settings.deploy_keys=Claves de Despliegue +settings.deploy_keys_helper=Gotcha! Si usted está buscando agregar claves públicas personales, por favor, agréguelos en la configuración de la cuenta. settings.add_deploy_key=Añadir Clave de Despliegue settings.deploy_key_desc=La clave de desarrollo tiene sólo acceso de lectura. No es igual que las claves SSH de las cuentas personales. settings.no_deploy_keys=No has añadido ninguna clave de despliegue. @@ -748,6 +876,8 @@ settings.add_key_success=¡La nueva clave de desplieque '%s' ha sido creada con 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! +settings.description_desc=Descripción del repositorio. Longitud máxima de 512 caracteres. +settings.description_length=Caracteres disponibles diff.browse_source=Explorar el Código diff.parent=padre @@ -766,7 +896,6 @@ release.releases=Releases release.new_release=Nueva Release release.draft=Borrador release.prerelease=Pre-Release -release.stable=Estable release.edit=editar release.ahead=%d commits en %s desde esta release release.source_code=Código Fuente @@ -813,8 +942,8 @@ team_name_helper=Utiliza este nombre para mencionar a este equipo en las convers 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. +form.name_not_allowed=El nombre de la organización o patrón %q no está permitido. +form.team_name_not_allowed=El nombre del equipo o patrón %q no está permitido. settings=Configuración settings.options=Opciones @@ -886,12 +1015,19 @@ first_page=Primera last_page=Última total=Total: %d +dashboard.build_info=Build Information +dashboard.app_ver=Versión de la aplicación +dashboard.git_version=Versión de Git +dashboard.go_version=Versión de Go +dashboard.build_time=Tiempo de compilación +dashboard.build_commit=Build commit dashboard.statistic=Estadísticas dashboard.operations=Operaciones dashboard.system_status=Estado del Monitor del Sistema dashboard.statistic_info=La base de datos de Gogs contiene %d usuarios, %d organizaciones, %d claves públicas, %d repositorios, %d vigilados, %d destacados, %d acciones, %d accesos, %d incidencias, %d comentarios, %d cuentas de redes sociales, %d seguidores, %d mirrors, %d releases, %d fuentes de login, %d webhooks, %d milestones, %d etiquetas, %d hooks, %d equipos, %d tareas actualizadas, %d adjuntos. dashboard.operation_name=Nombre de la operación dashboard.operation_switch=Interruptor +dashboard.select_operation_to_run=Please select operation to run 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. @@ -905,8 +1041,8 @@ 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 Gogs) 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.resync_all_hooks=Resincroniza los "hooks" de pre-recepción, actualización y post-recepción en todos los repositorios +dashboard.resync_all_hooks_success=Se han vuelto a sincronizar todos los "hooks" de pre-recepción, actualización y post-recepción de los repositorios con éxito. 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. @@ -981,12 +1117,14 @@ repos.private=Privado repos.watches=Vigilantes repos.stars=Estrellas repos.issues=Incidencias +repos.size=Tamaño -auths.auth_manage_panel=Panel de administración de autenticación +auths.auth_sources=Fuentes de autentificación auths.new=Añadir nuevo origen auths.name=Nombre auths.type=Tipo auths.enabled=Activo +auths.default=Por defecto auths.updated=Actualizado auths.auth_type=Tipo de autenticación auths.auth_name=Nombre de autenticación @@ -995,6 +1133,7 @@ auths.domain=Dominio auths.host=Host auths.port=Puerto auths.bind_dn=Bind DN +auths.bind_dn_helper=Puedes usar '%s' como marcador de posición para el nombre de usuario, ej. DOM\%s 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 @@ -1004,6 +1143,11 @@ auths.attribute_username_placeholder=Dejar vacío para usar el campo de inicio d auths.attribute_name=Atributo nombre auths.attribute_surname=Atributo apellido auths.attribute_mail=Atributo correo electrónico +auths.verify_group_membership=Verificar pertenencia a grupo +auths.group_search_base_dn=Base DN para la búsqueda de grupos +auths.group_filter=Filtro de grupo +auths.group_attribute_contain_user_list=Atributo de grupo que contiene la lista de usuarios +auths.user_attribute_listed_in_group=Atributo de usuario listado en grupo auths.attributes_in_bind=Buscar atributos en el contexto del Bind DN auths.filter=Filtro de usuario auths.admin_filter=Filtro de aministrador @@ -1017,9 +1161,9 @@ 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.default_auth=Esta autenticación es la fuente de inicio de sesión predeterminada 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 @@ -1028,107 +1172,189 @@ 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! +auths.login_source_exist=El origen de autenticación '%s' ya existe. +auths.github_api_endpoint=Endpoint de la API +config.not_set=(sin definir) config.server_config=Configuración del servidor -config.app_name=Nombre de la Aplicación -config.app_ver=Versión de la Aplicación -config.app_url=URL de la Aplicación -config.domain=Dominio -config.offline_mode=Modo Sin Conexión -config.disable_router_log=Deshabilitar Log del Router +config.brand_name=Nombre de la marca config.run_user=Ejecutada como Usuario config.run_mode=Modo de ejecución -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 -config.script_type=Tipo de Script -config.reverse_auth_user=Autenticación Inversa de Usuario +config.server.external_url=URL externa +config.server.domain=Dominio +config.server.protocol=Protocolo +config.server.http_addr=Dirección HTTP +config.server.http_port=Puerto HTTP +config.server.cert_file=Archivo de certificado +config.server.key_file=Archivo de claves +config.server.tls_min_version=Versión mínima de TLS +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Enable Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL 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 -config.ssh_root_path=Ruta raíz -config.ssh_key_test_path=Ruta de la clave de prueba -config.ssh_keygen_path=Ruta del generador de claves ('ssh-keygen') -config.ssh_minimum_key_size_check=Tamaño mínimo de la clave de verificación -config.ssh_minimum_key_sizes=Tamaños de clave mínimos +config.ssh.enabled=Activado +config.ssh.domain=Dominio expuesto +config.ssh.port=Puerto expuesto +config.ssh.root_path=Root path +config.ssh.keygen_path=Ruta del generador de claves +config.ssh.key_test_path=Ruta de la clave de prueba +config.ssh.minimum_key_size_check=Comprobación del tamaño mínimo de la clave +config.ssh.minimum_key_sizes=Tamaño mínimo de las claves +config.ssh.rewrite_authorized_keys_at_start=Reescribir "authorized_keys" al inicio +config.ssh.start_builtin_server=Iniciar servidor integrado +config.ssh.listen_host=Host de escucha +config.ssh.listen_port=Puerto de escucha +config.ssh.server_ciphers=Cifrados del servidor +config.ssh.server_macs=MACs del servidor +config.ssh.server_algorithms=Algoritmos del servidor + +config.repo_config=Configuración del repositorio +config.repo.root_path=Ruta raíz +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Licencias preferidas +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=Configuración de la Base de Datos -config.db_type=Tipo -config.db_host=Host -config.db_name=Nombre -config.db_user=Usuario -config.db_ssl_mode=Modo SSL -config.db_ssl_mode_helper=(sólo para "postgres") -config.db_path=Ruta -config.db_path_helper=(para "sqlite3" y "tidb") - -config.service_config=Configuración del servicio -config.register_email_confirm=Solicitar Confirmación por Correo Electrónico -config.disable_register=Deshabilitar el Registro -config.show_registration_button=Mostrar Botón de Registro -config.require_sign_in_view=Solicitar la Vista de Inicio de Sesión -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.db.type=Tipo +config.db.host=Host +config.db.name=Nombre +config.db.schema=Esquema +config.db.schema_helper=(sólo para "postgres") +config.db.user=Usuario +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(sólo para "postgres") +config.db.path=Ruta +config.db.path_helper=(sólo para "sqlite3") +config.db.max_open_conns=Número máximo de conexiones abiertas +config.db.max_idle_conns=Número máximo de conexiones inactivas + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Archivo de claves +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Enviar correo de prueba +config.email.test_mail_failed=Error al enviar correo electrónico de prueba a '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -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 -config.mailer_disable_helo=Desactivar HELO -config.mailer_name=Nombre -config.mailer_host=Host -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 -config.oauth_enabled=Activado +config.session_config=Configuración de la Sesión +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Configuración de la Caché -config.cache_adapter=Adaptador de la Caché -config.cache_interval=Intervalo de la Caché -config.cache_conn=Conexión de la Caché - -config.session_config=Configuración de la Sesión -config.session_provider=Proveedor de la Sesión -config.provider_config=Configuración del Proveedor -config.cookie_name=Nombre de la Cookie -config.enable_set_cookie=Activar Establecimiento de Cookie -config.gc_interval_time=Intervalo de tiempo del GC -config.session_life_time=Tiempo de Vida de la Sesión -config.https_only=Sólo HTTPS -config.cookie_life_time=Tiempo de Vida de la Cookie +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=Configuración HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Configuración de Imagen -config.picture_service=Servicio de Imágen -config.disable_gravatar=Desactivar Gravatar -config.enable_federated_avatar=Habilitar Avatares Federados +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Intervalo por defecto + +config.webhook_config=Configuración de Webhooks +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify config.git_config=Configuración de Git -config.git_disable_diff_highlight=Desactivar resaltado de sintaxis del Diff -config.git_max_diff_lines=Líneas de Diff máximas (por un solo archivo) -config.git_max_diff_line_characters=Carácteres de Diff máximos (para una sola línea) -config.git_max_diff_files=Máximo de archivos de Diff (que se mostrarán) -config.git_gc_args=Argumentos de GC -config.git_migrate_timeout=Tiempo de espera de migración -config.git_mirror_timeout=Tiempo de espera de actualización de réplicas -config.git_clone_timeout=Tiempo de espera de operación de clones -config.git_pull_timeout=Tiempo de espera de operación de pull -config.git_gc_timeout=Tiempo de espera de operación de GC +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path config.log_config=Configuración del Log -config.log_mode=Modo del Log +config.log_file_root_path=Ruta de los Ficheros de Log +config.log_mode=Modo +config.log_options=Opciones monitor.cron=Tareas de Cron monitor.name=Nombre @@ -1159,17 +1385,24 @@ notices.delete_success=Las notificaciones del sistema han sido eliminadas satisf create_repo=creó el repositorio %s rename_repo=repositorio renombrado de %[1]s a %[3]s commit_repo=hizo push a %[3]s en %[4]s +compare_commits=Ver comparación de estos %d commits +transfer_repo=transfirió el repositorio %s a %s create_issue=`incidencia abierta %s#%[2]s` close_issue=`cerró la incidencia %s#%[2]s` reopen_issue=`reabrió la incidencia %s#%[2]s` +comment_issue=`comentó en la incidencia %s#%[2]s` create_pull_request=`creado pull request %s#%[2]s` close_pull_request=`cerró el pull request %s#%[2]s` reopen_pull_request=`reabrió el pull request %s#%[2]s` -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 +merge_pull_request=`fusionó el pull request %s#%[2]s` +create_branch=nueva rama %[3]s creada en %[4]s +delete_branch=borrada rama %[2]s at %[3]s push_tag=hizo push del tag %[2]s a %[3]s -compare_commits=Ver comparación de estos %d commits +delete_tag=borrada etiqueta %[2]s en %[3]s +fork_repo=ha hecho un Fork en %s +mirror_sync_push=sincronizados commits a %[3]s en %[4]s desde la réplica +mirror_sync_create=sincronizada nueva referencia %[2]s a %[3]s desde la réplica +mirror_sync_delete=sincronizada y eliminada referencia %[2]s en %[3]s desde la réplica [tool] ago=hace @@ -1191,6 +1424,7 @@ months=%[2]s %[1]d meses years=%[2]s %[1]d años raw_seconds=segundos raw_minutes=minutos +raw_hours=hours [dropzone] default_message=Suéltelos aquí o pulse para cargar archivos. diff --git a/conf/locale/locale_fa-IR.ini b/conf/locale/locale_fa-IR.ini new file mode 100644 index 00000000000..0c31d210941 --- /dev/null +++ b/conf/locale/locale_fa-IR.ini @@ -0,0 +1,1436 @@ +app_desc=یک سرویس گیت بی‌درد سر و راحت + +home=صفحهٔ اصلی +dashboard=میز کار +explore=گشت‌و‌گذار +help=راهنما +sign_in=ورود +sign_out=خروج +sign_up=ثبت‌نام کنید +register=ثبت نام +website=وب‌سایت +page=صفحه +template=قالب +language=زبان +create_new=ایجاد... +user_profile_and_more=پروفایل کاربر و … +signed_in_as=ورود به عنوان + +username=نام کاربری +email=ایمیل +password=رمز عبور +re_type=تایپ مجدد +captcha=تصویر امنیتی + +repository=مخزن +organization=سازمان +mirror=قرینه +new_repo=مخزن جدید +new_migrate=انتقال جدید +new_mirror=قرینه ای جدید +new_fork=ایجاد یک انشعاب مخزن جدید +new_org=سازمان جدید +manage_org=مدیریت سازمان‌ها +admin_panel=پنل مدیریت +account_settings=تنظیمات حساب +settings=تنظيمات +your_profile=پروفایل شما +your_settings=تنظیمات شما + +activities=فعالیت‌ها +pull_requests=پول ریکوست +issues=مسائل + +cancel=لغو + +[status] +page_not_found=صفحه مورد نظر یافت نشد. +internal_server_error=خطای داخلی سرور + +[install] +install=نصب +title=مراحل نصب برای اولین اجرا +docker_helper=اگر شما Gogs را با استفاده از Docker اجرا می‌کنید، لطفا قبل از انجام هرگونه تغییر این راهنما را به دقت مطالعه فرمایید! +requite_db_desc=Gogs جهت راه‌اندازی نیازمند یکی از پایگاه داده‌های MySQL، PostgreSql، SQLite3 و TIDB می‌باشد. +db_title=تنظیمات پایگاه داده +db_type=نوع پایگاه داده +host=میزبان +user=کاربر +password=رمز عبور +db_name=نام پایگاه داده +db_schema=Schema +db_helper=در صورت استفاده از MySQL لطفا از موتور INNODB و کد کاراکتری utf8_general_ci استفاده نمایید. +ssl_mode=حالت امن (SSL) +path=مسیر +sqlite_helper=مسیر فایل بانک اطلاعاتی اس‌کیو‌ال لایت۳ یا تی‌دی‌بی.
لطفا هنگامی که به عنوان سرویس استفاده می‌کنید مسیر کامل را وارد کنید. +err_empty_db_path=مسیر پایگاه داده SQLite3 نباید خالی باشد. +no_admin_and_disable_registration=شما بدون ایجاد حساب‌ کاربری مدیر نمی‌توانید عضویت را غیر فعال کنید. +err_empty_admin_password=رمز عبور مدیر نمی‌تواند خالی باشد. + +general_title=تنظیمات کلی برنامه +app_name=نام برنامه +app_name_helper=نام سازمان/شرکت خود را در اینجا قراردهید! +repo_path=مسیر پوشه اصلی (روت) برای مخزن کد +repo_path_helper=تمام مخازن کد راه دور در این پوشه ذخیره می‌شوند. +run_user=کاربر اجرا‌کننده +run_user_helper=کاربر باید به مسیر پوشه اصلی دسترسی داشته باشد و بتواند Gogs را اجرا کند. +domain=دامنه +domain_helper=این مقدار بر آدرس‌های مخازن کد که از طریق SSH مدیریت می‌شوند، تاثیر می‌گذارد. +ssh_port=پرت SSH +ssh_port_helper=شماره پورت که سرویس SSH شما در حال اجرا بر روی آن است، در صورت عدم نیاز به سرویس SSH این بخش را خالی بگذارید. +use_builtin_ssh_server=استفاده از SSH سرور داخلی +use_builtin_ssh_server_popup=استفاده از SSH سرور داخلی برای عملیات گیت جهت جدا کردن از SSH daemon سیستم. +http_port=پورت HTTP +http_port_helper=شماره پورت مورد نظر که نرم‌افزار Gogs بر روی آن اجرا خواهد شد. +app_url=آدرس اینترنتی (URL) نرم‌افزار +app_url_helper=این مورد بر روی آدرس‌های مخازن کد که با پیشکار HTTP یا HTTPS کار می‌کنند و یا در ایمیل‌ها تاثیر می‌گذارد. +log_root_path=مسیر گزارش‌ها +log_root_path_helper=پوشه‌ای برای نوشتن فایل گزارش. +enable_console_mode=فعال کردن حالت کنسول +enable_console_mode_popup=لاگ‌ها علاوه بر ذخیره در فایل، در کنسول نیز به نمایش در آید. +default_branch=Default Branch + +optional_title=تنظیمات اختیاری +email_title=تنظیمات سرویس ایمیل +smtp_host=SMTP میزبان +smtp_from=از +smtp_from_helper=آدرس مبدا ایمیل (From) بر اساس RFC 5322. مقدار آن می‌تواند یک آدرس ایمیل و یا یک نام با فرمت باشد. +mailer_user=ایمیل فرستنده +mailer_password=رمز عبور فرستنده +register_confirm=فعال‌سازی تایید ثبت‌نام +mail_notify=فعال‌سازی نوتیفکیشن ایمیل +server_service_title=تنظیمات سرور و سرویس‌های دیگر +offline_mode=فعال‌سازی حالت آفلاین +offline_mode_popup=غیرفعال نمودن CDN حتی در حالت استفاده نهایی (production)، تمامی فایل‌ها از سیستم محلی ارسال خواهند شد. +disable_gravatar=غیر فعال کردن سرویس Gravatar +disable_gravatar_popup=غیرفعال نمودن Gravatar و تصاویر اختصاصی، تمامی آواتارها توسط کاربران آپلود خواهند شد یا در حالت صورت پیش‌فرض قرار می‌گیرند. +federated_avatar_lookup=فعال سازی جستجو برای آواتار مشترک +federated_avatar_lookup_popup=فعال سازی جستجو برای آواتار مشترک برای استفاده از سرویس منبع باز و مشترک بر پایه ی libavatar. +disable_registration=غیر فعال‌کردن ثبت نام +disable_registration_popup=غیرفعال نمودن عضویت توسط کاربران، فقط کاربر مدیر می‌تواند کاربر جدید ایجاد نماید. +enable_captcha=فعال‌کردن تصویر امنیتی +enable_captcha_popup=برای عضویت افراد نیازمند به کپچا (captcha) می‌باشد. +require_sign_in_view=فعال‌سازی نیازمند به ورود در هنگام مشاهده صفحات +require_sign_in_view_popup=تنها کسانی که وارد شده‌اند می‌توانند صفحات را مشاهده کنند، مشاهده کنندگان تنها می‌توانند صفحات ثبت‌نام و ورود را مشاهده کنند. +admin_setting_desc=نیازی نیست الان شما حساب‌کاربری مدیر ایجاد کنید، به صورت خودکار کاربری که شماره کاربری او ۱ می‌باشد به عنوان مدیر شناخته خواهد شد. +admin_title=تنظیمات حساب مدیر +admin_name=نام کاربری +admin_password=رمز عبور +confirm_password=تأیید رمز عبور +admin_email=ایمیل مدیر +install_gogs=نصب Gogs +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 +smtp_host_missing_port=شماره پورت در آدرس میزبان SMTP وارد نشده است. +invalid_smtp_from=مقدار وارد شده در فرم SMTP معتبر نیست: %v +save_config_failed=تنظیمات ذخیره نشد: %v +init_failed=بارگزاری برنامه به مشکل برخورد: %v +invalid_admin_setting=تنظیمات حساب مدیر نامعتبر است: %v +install_success=خوش آمدی! ما خوشحالیم که شما Gogs را انتخاب کردید. لذت ببرید و مراقب خودتون باشید. +invalid_log_root_path=آدرس روت فایل لاگ صحیح نیست: %v + +[home] +uname_holder=نام کاربری یا ایمیل +password_holder=رمز عبور +switch_dashboard_context=تغییر مفاد داشبورد +my_repos=مخازن من +show_more_repos=نمایش مخازن بیشتر... +collaborative_repos=مخازن همکاری +my_orgs=گروه‌های من +my_mirrors=آدرس های دیگر من +view_home=نمایش %s + +issues.in_your_repos=در مخازن شما + +[explore] +repos=مخازن +users=کاربران +organizations=سازمان ها +search=جستجو + +[auth] +create_new_account=ایجاد حساب جدید +register_hepler_msg=قبلا ثبت نام کردید؟ از اینجا وارد شوید! +social_register_hepler_msg=تا به حال حسابی داشته اید؟ به ما بپیوندید! +disable_register_prompt=با عرض پوزش، ثبت نام غیرفعال شده است. لطفا با مدیر سایت تماس بگیرید. +disable_register_mail=با عرض پوزش، تایید ایمیل ثبت نام غیر فعال شده است. +auth_source=محل احراز هویت +local=محلی +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=با عرض پوزش، شما به تازگی یک ایمیل فعالسازی را درخواست کرده اید. لطفا سه دقیقه منتظر بمانید سپس درخواست خود را تکرار کنید. +has_unconfirmed_mail=سلام %s, شما آدرس ایمیل (%s) را تایید نکرده اید. لطفا اگر شما ایمیلی دریافت نکرداید و یا نیاز به ارسال دوباره دارید، بر روید دکمه زیر کلیک نمایید. +resend_mail=برای ارسال نامه فعال سازی اینجا را کلیک کنید +send_reset_mail=اینجا کلیک کنید تا (مجددا) ایمیل تغییر رمز عبور برایتان ارسال شود +reset_password=تنظیم مجدد رمز عبور +invalid_code=با عرض پوزش، کد تایید شما منقضی شده است و یا معتبر نیست. +reset_password_helper=اینجا کلیک کنید تا رمز عبور خود را تغییر دهید +password_too_short=طول رمز عبور نمی‌تواند کوتاه‌تر از ۶ باشد. +non_local_account=حساب های کاربری غیر محلی قادر به تغییر رمز عبور از طریق Gogs نمی باشند. + +login_two_factor=احراز هویت دوگانه +login_two_factor_passcode=کد رمز احراز هویت +login_two_factor_enter_recovery_code=کد بازیابی دوگانه را وارد کنید +login_two_factor_recovery=بازیابی دوگانه +login_two_factor_recovery_code=کد بازیابی +login_two_factor_enter_passcode=کد عبور دوگانه را وارد کنید +login_two_factor_invalid_recovery_code=کد بازیابی قبلا استفاده شده و یا معتبر نیست. + +[mail] +activate_account=لطفا حساب خود را فعال کنید +activate_email=آدرس ایمیل خود را تایید کنید +reset_password=تنظیم مجدد رمز عبور +register_success=ثبت نام با موفقیت انجام شد، خوش‌امدید +register_notify=خوش آمدید + +[modal] +yes=بله +no=خیر +modify=اصلاح + +[form] +UserName=نام کاربری +RepoName=نام مخزن +Email=آدرس ایمیل +Password=رمز عبور +Retype=تکرار رمز عبور +SSHTitle=نام کلید SSH +HttpsUrl=آدرس HTTPS +PayloadUrl=آدرس Payload +TeamName=نام تیم +AuthName=نام مجوز +AdminEmail=ایمیل مدیر + +NewBranchName=نام شاخه ی جدید +CommitSummary=خلاصه ی کامیت +CommitMessage=پیام کامیت +CommitChoice=انتخاب در کامیت +TreeName=مسیر فایل +Content=محتوا + +require_error=` نمی تواند خالی باشد.` +alpha_dash_error=` باید شامل کاراکترهای حروف الفبا یا اعداد یا خط تیره (-_) باشد` +alpha_dash_dot_error=` باید شامل کاراکترهای حروف الفبا یا اعداد یا خط تیره (-_) یا نقطه باشد` +alpha_dash_dot_slash_error=` باید شامل کاراکترهای حروف الفبا یا اعداد یا خط تیره (-_) یا نقطه یا اسلش( \ /) باشد` +size_error=` باید به اندازه %s باشد.` +min_size_error=` حداقل باید شامل %s کاراکتر باشد.` +max_size_error=` حداکثر باید شامل %s کاراکتر باشد.` +email_error=` ساختار آدرس ایمیل صحیح نیست.` +url_error=` ساختار آدرس صحیح نیست.` +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=نام کاربری یا رمز عبور صحیح نیست. +auth_source_mismatch=محل احراز هویت انتخاب شده با کاربر در ارتباط نمی‌باشد. +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=Gogs قادر به تایید کلید SSH شما نیست، اما ما فرض می کنیم که این کلید معتبر است، لطفا آن را به دقت بررسی کنید. +auth_failed=ورود انجام نشد: %v + +still_own_repo=حساب شما در حال حاضر حداقل مالک یک مخزن است، شما ابتدا باید آن ها را حذف یا منتقل کنید. +still_has_org=حساب شما در حال حاضر حداقل عضو یک سازمان است، شما ابتدا باید عضویت خود را حذف یا سازمان را ترک کنید. +org_still_own_repo=این سازمان در حال حاضر مالک برخی مخازن است، شما ابتدا باید آن ها را حذف یا منتقل کنید. + +target_branch_not_exist=شاخه مورد نظر وجود ندارد. + +[user] +change_avatar=تغییر آواتار +join_on=ملحق شد در +repositories=مخازن +activity=فعالیت های عمومی +followers=دنبال‌کننده‌ها +starred=مخان ستاره دار +following=دنبال می کند +follow=دنبال کردن +unfollow=لغو دنبال کردن + +form.name_not_allowed=الگوی نام کاربری '%s' مجاز نیست. + +[settings] +profile=پروفایل +password=رمز عبور +avatar=آواتار +ssh_keys=کلید‌‌های SSH +security=امنیت +repos=مخازن +orgs=گروه‌ها +applications=برنامه‌ها +delete=حذف حساب + +public_profile=پروفایل عمومی +profile_desc=آدرس ایمیل شما در دید عموم بوده و برای ارسال پیام‌های مربوط به حساب یا هر عملیات سیستمی دیگر مورد استفاده قرار میگیرد. +password_username_disabled=کاربران غیر بومی مجاز به تغییر نام کاربری نیستند. +full_name=نام کامل +website=وب‌سایت +location=مکان +update_profile=بروز‌رسانی پروفایل +update_profile_success=حساب شما با موفقیت به روز شد. +change_username=نام کاربری تغییر یافت +change_username_prompt=این بر روی نحوه ارتباط لینک‌ها با حساب شما تاثیر خواهد گذاشت. +continue=ادامه +cancel=لغو + +lookup_avatar_by_mail=جستجوی آواتار از طریق ایمیل +federated_avatar_lookup=جستجو برای آواتار مشترک +enable_custom_avatar=فعال‌سازی آواتار دلخواه +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=مدیریت آدرس‌های ایمیل +email_desc=آدرس ایمیل اولیه را برای آگاه سازی و دیگر عملیات مورد استفاده قرار می‌گیرد. +primary=اصلی +primary_email=تنظیم به عنوان اصلی +delete_email=حذف +email_deletion=حذف ایمیل +email_deletion_desc=حذف این آدرس ایمیل دیگر اطلاعات مربوط به آن را هم از حساب شما حذف می‌کند. آیا مایلید ادامه دهید؟ +email_deletion_success=ایمیل با موفقیت حذف شد! +email_deletion_primary=Cannot delete primary email address. +add_new_email=اضافه کردن آدرس ایمیل جدید +add_email=اضافه کردن ایمیل +add_email_confirmation_sent=یک ایمیل تایید به آدرس %s ارسال شد, لطفا صندوق خود را حداکثر تا %d ساعت دیگر برای تکمیل فرایند تایید بررسی کنید. +add_email_success=آدرس جدید ایمیل با موفقیت اضافه شد. + +manage_ssh_keys=مدیریت کلیدهای اس‌اس‌اچ +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=این کلید در ۷ روز گذشته استفاده شده است +token_state_desc=این توکن در ۷ روز گذشته استفاده شده است + +two_factor=احراز هویت دوگانه +two_factor_status=وضعیت: +two_factor_on=روشن +two_factor_off=خاموش +two_factor_enable=فعال +two_factor_disable=غیرفعال +two_factor_view_recovery_codes=مشاهده و ذخیرهکد بازیابی در محیطی امن. در صورتیکه به برنامه ی احرازهویت خود دسترسی ندارید،میتوانید از آنها به عنوان کد عبور استفاده کنید. +two_factor_http=برای عملیات های HTTP/HTTPS مجاز به استفاده از نام کاربری و رمزعبور نمی باشید. لطفا توکن امنیتیخود را ایجاد و به عنوان اعتبارنامه ی خود استفاده کنید. برای مثال :%[3]s +two_factor_enable_title=فعال‌کردن احراز هویت دوگانه +two_factor_scan_qr=لطفا با استفاده از نرم افزار احراز هویت خود تصویر زیر را اسکن کنید: +two_factor_or_enter_secret=و یا رمز را پارد کنید: +two_factor_then_enter_passcode=سپس رمز عبور را وارد کنید: +two_factor_verify=تایید‌کنید +two_factor_invalid_passcode=رمز عبور وارد شده معتبر نیست, لطفا دوباره سعی کنید! +two_factor_reused_passcode=رمز وارد شده قبلا استفاده شده، لطفا یک عبارت دیگر را امتحان کنید! +two_factor_enable_error=فعال کردن احراز هویت دوگانه ناموفق بود: %v +two_factor_enable_success=احراز هویت دوگانه با موفقیت برای حساب شما فعال شد! +two_factor_recovery_codes_title=کدهای بازیابی احراز هویت دوگانه +two_factor_recovery_codes_desc=کد های بازیابی زمانی استفاده می شوند که شما به صورت موقت به نرم افزار احراز هویت خود دسترسی ندارید. هر کد بازیابی تنها یکبار قابل استفاده است، لطفا این کد را در محلی امن نگهداری کنید. +two_factor_regenerate_recovery_codes=ایجاد مجدد کدهای بازیابی +two_factor_regenerate_recovery_codes_error=ایجاد مجدد کدهای بازیابی ناموفق بود: %v +two_factor_regenerate_recovery_codes_success=کد جدید بازیابی با موفقیت تولید شد! +two_factor_disable_title=غیرفعال‌کردن احراز هویت دوگانه +two_factor_disable_desc=پس از غیر فعال کردن سیستم احراز هویت دوعاملی ، سطح امنیت حساب کاربری شما کاهش پیدا میکند. آیا ادامه می دهید؟ +two_factor_disable_success=احراز هویت دوعاملی با موفقیت غیر فعال شد! + +manage_access_token=مدیریت توکن دسترسی شخصی +generate_new_token=تولید توکن جدید +tokens_desc=نشانه ایجاد شده که می تواند برای دسترسی به رابط های برنامه کاربردی Gogs مورد استفاده قرار گیرد. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. +new_token_desc=هر توکن می تواند دسترسی کامل به حساب شما داشته باشد. +token_name=نام توکن +generate_token=تولید توکن +generate_token_succees=توکن دسترسی شما با موفقیت ساخته شد! از اینکه آن را کپی کرده اید مطمئن شوید ، زیرا در آینده شما قادر به دیدن محدد آن نخواهید بود! +delete_token=حذف +access_token_deletion=حذف توکن دسترسی شخصی +access_token_deletion_desc=حذف این توکن دسترسی شخصی ، تمام دسترسی های مرتبط به برنامه را حذف خواهد کرد. آیا ادامه می دهید؟ +delete_token_success=رمز دسترسی شخصی با موفقیت حذف شد! به روز رسانی نرم افزار خود را نیز فراموش نکنید. +token_name_exists=نشان امنیتی با این نام از قبل وجود دارد + +orgs.none=شما عضو هیچ سازمانی نیستید. +orgs.leave_title=ترک یک سازمان +orgs.leave_desc=پس از ترک یک سازمان، دسترسی تان به همه تیم ها و مخزن ها را از دست می دهید. ادامه می دهید؟ + +repos.leave=ترک‌کردن +repos.leave_title=ترک‌کردن مخزن +repos.leave_desc=پس از ترک ، دسترسی خود به مخزن را از دست خواهید داد. آیا ادامه می‌دهید؟ +repos.leave_success=شما با موفقیت مخزن '%s' را ترک کردید! + +delete_account=حذف حساب کاربری +delete_prompt=این کار حساب کاربری شما را برای همیشه حذف خواهد کرد و این کار غیرقابل بازگشت است! +confirm_delete_account=تایید حذف +delete_account_title=حذف حساب کاربری +delete_account_desc=این حساب به طور دائمی حذف می شود ، آیا ادامه می دهید؟ + +[repo] +owner=صاحب +repo_name=نام مخزن +repo_name_helper=نام خوب مخزن معمولا از کلمات کلیدی کوتاه و به یاد ماندنی و منحصر به فرد تشکیل شده است. +visibility=قابل مشاهده بودن +unlisted=Unlisted +visiblity_helper=این مخزن خصوصی است +unlisted_helper=This repository is Unlisted +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_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=انشعاب ها +repo_description_helper=توضیحات مخرن. حداکثر طول ۵۱۲ کاراکتر. +repo_description_length=کاراکترهای موجود + +form.reach_limit_of_creation=مخزن های دارنده حساب به حداکثر تعداد مجاز %d رسیده است. +form.name_not_allowed=الگو یا نام مخزن %s مجاز نیست. + +need_auth=نیاز به مجوز +migrate_type=نوع انتقال +migrate_type_helper=این مخزن به عنوان مادر خواهد بود +migrate_repo=همگام سازی مخزن +migrate.clone_address=کپی آدرس +migrate.clone_address_desc=آدرس می تواند از نوع HTTP/HTTPS/GIT باشد. +migrate.clone_address_desc_import_local=شما همچنین می توانید یک مخزن را با یک آدرس لوکال همگام سازی نمایید. +migrate.permission_denied=شما مجاز به بارگزاری مخازن لوکال نیستید. +migrate.invalid_local_path=مسیر محلی غیر‌معتبر، این مسیر یا موجود نیست و یا یک دارکتوری نیست. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. +migrate.failed=انتقال انجام نشد: %v + +mirror_from=mirrorاز +forked_from=برگرفته از +copy_link=کپی +copy_link_success=کپی انجام شد! +copy_link_error=⌘-C یا کنترل-C را برای کپی فشار دهید +copied=کپی موفقیت‌امیز بود +unwatch=زیر نظر نگرفتن +watch=دنبال کردن +unstar=برداشتن ستاره +star=ستاره دار +fork=انشعاب + +no_desc=بدون توضیح +quick_guide=راهنمای سریع +clone_this_repo=همسان‌سازی این مخزن +create_new_repo_command=ایجاد یک مخزن جدید در خط فرمان +push_exist_repo=اعمال تغییرات از مخزن موجود از خط فرمان +bare_message=این مخزن هنوز هیچ محتوایی ندارد. + +files=پرونده‌ها +branch=شاخه +tree=درخت +filter_branch_and_tag=فیلتر شعبه یا تگ +branches=شاخه‌ها +tags=تگ‌ها +issues=مشکلات +pulls=درخواست واکشی +labels=برچسب‌ها +milestones=نقاط عطف +commits=کامیت‌ها +git_branches=شاخه‌ها +releases=انتشارها +file_raw=خام +file_history=تاريخچه +file_view_raw=مشاهده خام +file_permalink=لینک دائمی +file_too_large=حجم این فایل بیشتر از آن است که قابل نمایش باشد +video_not_supported_in_browser=مرورگر شما از تگ video که در HTML5 تعریف شده است، پشتیبانی نمی کند. + +branches.overview=نمای کلی +branches.active_branches=شاخه های فعال +branches.stale_branches=شاخه های قدیمی +branches.all=همه شاخه +branches.updated_by=%[1]s به روزشده توسط %[2]s +branches.change_default_branch=تغییر شاخه ی پیش فرض +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +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=شما باید قبل از ویرایش انشعابی از این مخزن ایجاد کنید +editor.delete_this_file=حذف این پرونده +editor.must_have_write_access=شما برای ویرایش و یا ایجاد تغییرات در این پرونده نیاز به دسترسی نوشتن دارید +editor.file_delete_success=فایل '%s' با موفقیت حذف شد! +editor.name_your_file=نام فایل شما... +editor.filename_help=برای ایجاد پوشه، نام آن را وارد کرده و سپس عبارت / را در انتهای آن تایپ نمایید. برای حذف پوشه نیز نشانگر را به ابتدای فیلد برده و عبارت \ را تایپ نمایید. +editor.or=یا +editor.cancel_lower=انصراف +editor.commit_changes=اعمال تغییرات +editor.add_tmpl=افزودن '%s ' +editor.add=افزودن '%s' +editor.update=به روزرسانی %s +editor.delete=حذف '%s' +editor.commit_message_desc=توضیحی تخصصی به دلخواه اضافه نمایید... +editor.commit_directly_to_this_branch=ثبت تغییر به صورت مستقیم در انشعاب %s . +editor.create_new_branch=یک شاخه جدید برای این commit ایجاد کنید و درخواست واکشی را شروع کنید. +editor.new_branch_name_desc=نام انشعاب جدید... +editor.cancel=لغو +editor.filename_cannot_be_empty=نام پرونده نمی تواند خالی باشد. +editor.branch_already_exists=انشعاب '%s' از قبل در این مخزن وجود دارد. +editor.directory_is_a_file=در این مخزن ، مدخل '%s' در دایرکتوری والد یک فایل است نه یک پوشه. +editor.file_is_a_symlink=فایل %s یک symlink است و نمتوان با مرورگر آن را ویرایش کرد. +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=خطا در ساخت/به روزرسانی فایل %. خطای رخ داده : %v +editor.fail_to_delete_file=خطا در حذف فایل '%s' رخ داده است. خطای رخ داده %v +editor.add_subdir=افزودن زیرپوشه... +editor.unable_to_upload_files=عدم موفقیت در آپلود فایل به '%s' با خطا: %v +editor.upload_files_to_dir=آپلود فایل به '%s' + +commits.commit_history=تاریخچه Commit ها +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=بدون برچسب +issues.new.clear_labels=پاک‌کردن برچسب‌ها +issues.new.milestone=نقطه عطف +issues.new.no_milestone=بدون نقطه عطف +issues.new.clear_milestone=ایجاد نقطه عطف +issues.new.open_milestone=نقاط عطف باز +issues.new.closed_milestone=نقاط عطف بسته +issues.new.assignee=مسئول رسیدگی +issues.new.clear_assignee=پاک کردن مسئول رسیدگی +issues.new.no_assignee=بدون مسئول رسیدگی +issues.create=افزودن مشکل +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' +issues.open_tab=%d باز +issues.close_tab=%d بسته +issues.filter_label=برچسب +issues.filter_label_no_select=هیچ بر‌چسبی انتخاب نشده +issues.filter_milestone=Milestone +issues.filter_milestone_no_select=هیچ نقطه عطفی انتخاب نشده +issues.filter_assignee=مسئول رسیدگی +issues.filter_assginee_no_select=بدون مسئول رسیدگی +issues.filter_type=نوع +issues.filter_type.all_issues=همه مسائل +issues.filter_type.assigned_to_you=به شما محول شده +issues.filter_type.created_by_you=ایجاد شده توسط شما +issues.filter_type.mentioning_you=اشاره به شما +issues.filter_sort=مرتب سازی +issues.filter_sort.latest=جدیدترین +issues.filter_sort.oldest=قدیمی‌ترین +issues.filter_sort.recentupdate=اخیرا به روز شده +issues.filter_sort.leastupdate=به تازگی به روز شده +issues.filter_sort.mostcomment=بیشترین دیدگاه‌ها +issues.filter_sort.leastcomment=کمترین دیدگاه‌ها +issues.opened_by=%[1]s باز شده توسط %[3]s +issues.opened_by_fake=%[1]s باز شده توسط %[2]s +issues.previous=قبلی +issues.next=بعدی +issues.open_title=باز‌کردن +issues.closed_title=بسته‌شده +issues.num_comments=%d دیدگاه +issues.commented_at=`نظر %s` +issues.delete_comment_confirm=آیا مطمئن هستید که می خواهید این نظر را حذف کنید؟ +issues.no_content=هنوز محتوایی ایجاد نشده. +issues.close_issue=بستن +issues.close_comment_issue=ثبت دیدگاه و بستن +issues.reopen_issue=دوباره باز‌کردن +issues.reopen_comment_issue=ثبت دیدگاه و باز‌کردن دوباره +issues.create_comment=دیدگاه +issues.closed_at=`%[2]s بسته شد` +issues.reopened_at=`%[2]s بازگشایی شد` +issues.commit_ref_at=`ارجاع این مسئله به کامیت %[2]s` +issues.poster=نویسنده +issues.collaborator=همكار +issues.owner=مالک +issues.sign_in_require_desc=برای پیوستن به گفتگو، وارد شودید. +issues.edit=ويرايش +issues.cancel=لغو +issues.save=ذخيره +issues.label_title=نام برچسب +issues.label_color=رنگ برچسب +issues.label_count=%d برچسب‌ها +issues.label_open_issues=%d مشکل حل نشده +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" کلیک کنید` + +pulls.new=ایجاد درخواست ادغام +pulls.compare_changes=مقایسه تغییرات +pulls.compare_changes_desc=مقایسه ی دو شاخه و ایجاد درخواست واکشی pull request برای تغییرات. +pulls.compare_base=پایه +pulls.compare_compare=مقایسه +pulls.filter_branch=فیلتر کردن انشعاب +pulls.no_results=نتیجه ای یافت نشد. +pulls.nothing_to_compare=هیچ چیز برای مقایسه وجود ندارد زیرا شاخه ی پایه و head همانند اند. +pulls.nothing_merge_base=چیزی برای مقایسه وجود ندارد زیرا این دو شاخه تاریخچه ی کاملا متفاوتی با یکدیگر دارند. +pulls.has_pull_request=`درخواست pull request برای این دو هدف انتخابی وجود دارد: %[2]s#%[3]d` +pulls.create=ایجاد درخواست ادغام +pulls.title_desc=قصد ادغام %[1]d تغییر را از %[2]s به %[3]s دارد +pulls.merged_title_desc=%[1]d کامیت ادغام شده از %[2]s به %[3]s %[4]s +pulls.tab_conversation=گفتگو +pulls.tab_commits=کامیت‌ها +pulls.tab_files=پرونده تغییر کرده +pulls.reopen_to_merge=برای انجام عملیات ادغام، لطفا این درخواست ادغام را مجددا باز نمایید. +pulls.merged=ادغام شده +pulls.has_merged=درخواست pull request با موفقیت ادغام شد! +pulls.data_broken=به علت حذف اطلاعات انشعاب شده٬ داده های pull reqest خراب شده است. +pulls.is_checking=بررسی تداخل همچنان در جریان است، لطفا چند دقیقه دیگر صفحه را بارگیری مجدد کنید. +pulls.can_auto_merge_desc=این pull request می تواند به صورت خودکار ادغام شود. +pulls.cannot_auto_merge_desc=این pull request به علت تداخل نمی تواند به صورت خودکار ادغام شود. +pulls.cannot_auto_merge_helper=لطفا عملیات ادغام را به صورت دستی انجام دهید تا این تداخل برطرف شود. +pulls.create_merge_commit=ایجاد یک کامیت برای ادغام سازی +pulls.rebase_before_merging=Rebase قبل از ادغام +pulls.commit_description=توضیحات کامیت +pulls.merge_pull_request=ایجاد درخواست ادغام +pulls.open_unmerged_pull_exists=`به علت باز بودن pull request (#%d) از مخزنی مشابه و به همراه اطلاعات ادغام مشابه که در انتظار ادغام می باشد، بازگشایی مجدد مقدور نیست` +pulls.delete_branch=حذف شاخه +pulls.delete_branch_has_new_commits=به علت وجود commit بعد از merge ، امکان حذف branch وجود ندارد. + +milestones.new=نقطه عطف جدید +milestones.open_tab=%d باز +milestones.close_tab=%d بسته +milestones.closed=بسته %s +milestones.no_due_date=بدون موعد مقرر +milestones.open=باز‌کردن +milestones.close=بستن +milestones.new_subheader=جهت سازماندهی مسائل ، نقاط عطف ایجاد کنید. +milestones.create=ایجاد نقطه عطف +milestones.title=عنوان +milestones.desc=توضیحات +milestones.due_date=موعد مقرر (اختیاری) +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.filter_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 + +settings=تنظيمات +settings.options=گزینه‌‌‌‌‌‌ها +settings.collaboration=همکاری +settings.collaboration.admin=مدیریت +settings.collaboration.write=نوشتن +settings.collaboration.read=خواندن +settings.collaboration.undefined=تعریف‌نشده +settings.branches=شاخه‌ها +settings.branches_bare=شما نمی توانید شاخه های مخازن تهی را مدیریت کنید. ابتدا محتوایی را push کنید. +settings.default_branch=شاخه پیش‌فرض +settings.default_branch_desc=شاخه پیش فرض، به عنوان شاخه ی پایه برای کامیت ، درخواست واکشی و ویرایش آنلاین درنظر گرفته می شود. +settings.update=به‌روز رسانی +settings.update_default_branch_unsupported=تغییر شاخه ی پیش فرض با نسخه ی Git روی سرور پشتیبانی نمی شود. +settings.update_default_branch_success=شاخه پیش فرض این مخزن با موفقیت به روز شد! +settings.protected_branches=شاخه های حفاظت شده +settings.protected_branches_desc=محافظت از شاخه ها در برابر force push ، حذف تصادفی و کامیت کنندگان کد که در لیست سفید اند. +settings.choose_a_branch=یک شاخه را انتخاب کنید... +settings.branch_protection=حفاظت از شاخه +settings.branch_protection_desc=لطفا گزینه ی محافظت برای شاخه ی %s انتخاب کنید. +settings.protect_this_branch=محافظت از این شاخه +settings.protect_this_branch_desc=غیرفعال سازی force push و ممانعت از حذف. +settings.protect_require_pull_request=مستلزم ایجاد درخواست واکشی (pull request) بجای بارگذاری مستقیم +settings.protect_require_pull_request_desc=برای جلوگیری از push مستقیم در این شاخه، این گزینه را فعال کنید. کامیت ها باید در شاخه های حفاظت نشده push شوند و از طریق pull request ادغام می شوند. +settings.protect_whitelist_committers=لیست سفید شامل افرادی که میتوانند در این شاخه push انجام دهند +settings.protect_whitelist_committers_desc=افراد یا تیم ها را برای push مستقیم به لیست سفید این شاخه بیفزایید. کاربران لیست سفید الزام بررسی برای درخواست pull request را ندارند. +settings.protect_whitelist_users=کاربرانی که میتوانند در این شاخه push کنند +settings.protect_whitelist_search_users=جستجوی کاربران +settings.protect_whitelist_teams=تیم هایی که اعضای آنها می توانند در این شاخه push کنند +settings.protect_whitelist_search_teams=جستجوی تیم ها +settings.update_protect_branch_success=گزینه های حفاظتی این شاخه با موفقیت به روز شد! +settings.hooks=Webhooks +settings.githooks=Git Hooks +settings.basic_settings=تنظیمات پایه +settings.mirror_settings=تنظیمات mirror +settings.sync_mirror=هم‌اکنون همگام‌سازی کنید +settings.mirror_sync_in_progress=همگام سازی mirror در جریان است، لطفا تا دقیقه ای دیگر صفحه خود را رفرش کنید. +settings.site=سایت رسمی +settings.update_settings=به‌ روزرسانی تنظیمات +settings.change_reponame_prompt=این تغییر تمامی لینک های به این مخزن را تحا تاثیر میگذارد. +settings.advanced_settings=تنظیمات پیشرفته +settings.wiki_desc=فعال کردن سیستم ویکی +settings.use_internal_wiki=استفاده از ویکی درون برنامه ای +settings.allow_public_wiki_desc=مجاز بودن دسترسی به ویکی درحالتی که مخزن خصوصی است +settings.use_external_wiki=استفاده از ویکی های بیرونی +settings.external_wiki_url=آدرس خارجی ویکی +settings.external_wiki_url_desc=زمانی که کاربران بر رور زبانه کلیک کنند به آدرس URL هدایت میشوند. +settings.issues_desc=فعال سازی سیستم رهگیری مسائل issue tracker +settings.use_internal_issue_tracker=استفاده از سیستم سبک پیگیری مسائل داخلی +settings.allow_public_issues_desc=دسترسی عمومی دادن به ویکی زمانیکه مخزن در حالت خصوصی است +settings.use_external_issue_tracker=استفاده از سیستم رهگیری مسئله خارجی +settings.external_tracker_url=آدرس سیستم خارجی رهگیری مسایل +settings.external_tracker_url_desc=کاربران به آدرس هدایت می شوند زمانیکه روی زبانه جدید کلیک کنند. +settings.tracker_url_format=قالب آدرس سیستم Issue Tracker خارجی +settings.tracker_issue_style=سبک نامگذاری Issue Tracker خارجی: +settings.tracker_issue_style.numeric=عددی +settings.tracker_issue_style.alphanumeric=عددی و الفبایی +settings.tracker_url_format_desc=شما میتوانید از {user} {repo} {index} برای نام کاربری ، نام مخزن و صفحه ی اول بخش مسائل استفاده کنید. +settings.pulls_desc=پول ریکویست ها را فعال کنید تا برای مخازن و شاخه ها مشارکت را قبول کنید +settings.pulls.ignore_whitespace=نادیده گرفتن تغییرات در فضاهای خالی +settings.pulls.allow_rebase_merge=مجاز کردن rebase برای ادغام کردن کامیت ها +settings.danger_zone=منطقه خطر +settings.cannot_fork_to_same_owner=نمی توانید انشعاب به مالک مخزن ایجاد کنید. +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=- این عملیات تمامی اطلاعات این مخزن شامل اطلاعات گیت ، مسائل ، نظرات و دسترسی همکاران را برای همیشه پاک خواهد کرد. +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=همکار جدید اضافه شد. +settings.delete_collaborator=حذف +settings.collaborator_deletion=حذف همكار +settings.collaborator_deletion_desc=این کاربر پس از حذف دیگر دسترسی برای همکاری در این مخرن را نخواهد داشت. آیا ادامه میدهید؟ +settings.remove_collaborator_success=همكار حذف شد. +settings.search_user_placeholder=جستجوی کاربر... +settings.org_not_allowed_to_be_collaborator=سازمان ها را نمیتوان به عنوان همکار افزود. +settings.hooks_desc=Webhook ها مانند یک درخواست POST در HTTP اند. هرگاه رخدادی در gogs رخ می دهد، ما نوتیفیکیشنی برای هاستی که شما تعریف کرده اید ارسال می کنیم. برای اطلاعات بیشتر راهنمای webhook را مطالعه کنید. +settings.webhooks.add_new=یک webhook جدید اضافه کن: +settings.webhooks.choose_a_type=نوع را انتخاب کن... +settings.add_webhook=اضافه‌کردن Webhook +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.redelivery=باز تحویل +settings.webhook.redelivery_success=ارسال %s به لیست تحویل مجددا افزوده شد. ممکن است چند ثانیه ای طول بکشد تا در تارخچه تحویل به روزرسانی شود. +settings.webhook.request=درخواست +settings.webhook.response=پاسخ +settings.webhook.headers=هدر +settings.webhook.payload=Payload +settings.webhook.body=بدنه +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. +settings.githooks_desc=Git Hook ها توسط تیم Git ایجاد شده اند، شما می توانید فایل hook های پشتیبانی شده را ویرایش کنید تا بتوانید عملیات دلخواه خودتان را انجام دهید. +settings.githook_edit_desc=در صورتیکه hook غیرفعال باشد، محتوای نمونه ای موجود در آن ارائه خواهد شد. برای اینکه به کلی غیر فعال شود، محتوا را پاک کنید تا خالی شود. +settings.githook_name=نام hook +settings.githook_content=محتوای هوک +settings.update_githook=به روزرسانی hook +settings.add_webhook_desc=سیستم Gogs یک درخواست POST به آدرس تعیین شده توسط شما ارسال می کند، همراه با جزئیات مربوط به رویدادی که رخ داده است. همچنین شما میتوانید نوع داده ای hook را زمانی که اجرا میشود تعیین کنید(JSON, x-www-form-urlencoded, XML, ...). اطلاعات بیشتر در راهنمای webhook موجود است. +settings.payload_url=آدرس Payload +settings.content_type=نوع محتوا Content-Type +settings.secret=رمز +settings.secret_desc=کد امنیتی در هِدری به نام X-Gogs-Signature با کدگذاری SHA256 HMAC در پیلود ارسال شد. +settings.slack_username=نام کاربری +settings.slack_icon_url=آدرس آیکون +settings.slack_color=رنگ +settings.event_desc=این webhook چه زمان می بایست راه اندازی شود؟ +settings.event_push_only=فقط رخداد های push. +settings.event_send_everything=من به همه چیز نیاز دارم. +settings.event_choose=اجازه دهید انتخاب کنم به چه چیزی نیاز است. +settings.event_create=ایجاد +settings.event_create_desc=شاخه یا برچسب ایجاد شد +settings.event_delete=حذف +settings.event_delete_desc=شاخه یا برچسب حذف شده +settings.event_fork=انشعاب +settings.event_fork_desc=انشعاب از مخزن ایجاد شد +settings.event_push=درج کردن +settings.event_push_desc=درج در مخزن توسط گیت +settings.event_issues=مسائل +settings.event_issues_desc=مسئله ای باز شده ، بسته شده، بازگشایی شده، ویرایش شده، به فردی تخصیص یافته، لغو تخصیص از فردی شده، برچسب آن به روزرسانی شده، برچسب آن پاک شده، نقطه عطف برای آن تعیین شده یا نقطه عطف از آن حذف شده. +settings.event_pull_request=درخواست ادغام +settings.event_pull_request_desc=Pull request باز، بسته، بازگشایی شده، ویرایش شده، تخصیص داده به فردی، لغو تخصیص از فرد شده، برچسب آن به روز شده، برچسبی برای آن ساخته شده، نقطه عطف برای آن تعیین شده، نقطه عطف تعیین شده آن حذف شده، یا همگام سازی شده. +settings.event_issue_comment=نظرات در مسئله +settings.event_issue_comment_desc=نظر در مسئله ایجاد شد، ویرایش شد یا حذف شد. +settings.event_release=انتشار نسخه +settings.event_release_desc=Release در مخزن منتشر شد. +settings.active=فعال +settings.active_helper=اطلاعات در مورد رویدادی که هوک را اجرا نموده نیز منتقل خواهند شد. +settings.add_hook_success=یک هوک تحت وب جدید افزوده شده است. +settings.update_webhook=به روزرسانی webhook +settings.update_hook_success=Webhook به روز شد. +settings.delete_webhook=حذف Webhook +settings.recent_deliveries=دلیوری های اخیر +settings.hook_type=نوع هوک +settings.add_slack_hook_desc=پشتیبانی ازSlack را به مخرن خود بیفزایید. +settings.add_discord_hook_desc=پشتیبانی از Discord را به مخرن خود بیفزایید. +settings.add_dingtalk_hook_desc=پشتیبانی از Dingtalk را به مخرن خود بیفزایید. +settings.slack_token=توکن +settings.slack_domain=دامنه +settings.slack_channel=کانال +settings.deploy_keys=کلید های Deploy +settings.deploy_keys_helper=درصورتیکه به دنبال افزودن کلید عمومی خود هستید، آنها را از قسمت تنظیمات حساب بیفزایید. +settings.add_deploy_key=افزودن کلید Deploy +settings.deploy_key_desc=دسترسی به کلید های Deploy به صورت فقط خواندنی است. آنها همانند کلید های SSH برای حساب کاربری نیستند. +settings.no_deploy_keys=تاکنون کلید deploy نیفزوده اید. +settings.title=عنوان +settings.deploy_key_content=محتوا +settings.key_been_used=محتوای کلید Deploy مورد استفاده قرار گرفته است. +settings.key_name_used=کلیدDeploy با همین نام موجود است. +settings.add_key_success=کلیدDeploy جدید %s با موفقیت افزوده شد! +settings.deploy_key_deletion=حذف کلید Deploy +settings.deploy_key_deletion_desc=با حذف کلید Deploy، تمام دسترسی ها به این مخزن از طریق این کلید از بین میرود. آیا ادامه می دهید؟ +settings.deploy_key_deletion_success=کلید Deploy با موفقیت حذف شد! +settings.description_desc=توضیحات مخرن. حداکثر طول ۵۱۲ کاراکتر. +settings.description_length=کاراکترهای موجود + +diff.browse_source=فهرست منبع +diff.parent=والد +diff.commit=کامیت +diff.data_not_available=اطلاعات تفاوت ها موجود نیست. +diff.show_diff_stats=نمایش آمار تفاوت ها +diff.show_split_view=مشاهده تقسیم شده +diff.show_unified_view=نمای یکپارچه +diff.stats_desc= %dفایلهای تغییر یافته به همراه%d افزوده شده و %d حذف شده +diff.bin=BIN +diff.view_file=مشاهده فایل +diff.file_suppressed=تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است +diff.too_many_files=برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است + +release.releases=انتشارها +release.new_release=نسخه جدید +release.draft=پیش‌نویس +release.prerelease=پیش-انتشار +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=نوشتن +release.preview=پیش‌نمایش +release.loading=درحال بارگذاری... +release.prerelease_desc=این یک پیش نشر است +release.prerelease_helper=ما اشاره خواهیم کرد که این نسخه آماده ی نهایی محصول نیست. +release.cancel=لغو +release.publish=نشر نسخه انتشار یافته +release.save_draft=ذخیره پیش نویس +release.edit_release=ویرایش انتشار +release.delete_release=این انتشار را حذف کن +release.deletion=حذف نسخه انتشار +release.deletion_desc=با حذف این نسخه از انتشار، تگ منتاظر در Git نیز حذف خواهد شد. آیا ادامه میدهید؟ +release.deletion_success=نسخه ی انتشار(release) با موفقیت حذف شد! +release.tag_name_already_exist=انتشاری با این نام موجود است. +release.tag_name_invalid=نام برچسب معتبر نمی باشد. +release.downloads=دانلودها + +[org] +org_name_holder=نام سازمان +org_full_name_holder=نام کامل سازمان +org_name_helper=بهترین نام برای سازمان، نام کوتاه و به یاد ماندنی است. +create_org=سازمان جدید +repo_updated=به روز رسانی شده +people=افراد +invite_someone=دعوت از کسی +teams=تیم‌ها +lower_members=اعضا +lower_repositories=مخازن +create_new_team=ایجاد تیم جدید +org_desc=توضیح +team_name=نام تیم +team_desc=توضیح +team_name_helper=ما از این نام برای اشاره به این تیم در گفتوگو ها استفاده میکنیم. +team_desc_helper=این تیم درکل در مورد چیست؟ +team_permission_desc=این تیم چه سطح دسترسی میتواند داشته باشد؟ + +form.name_not_allowed=نام سازمان یا الگوی q% مجاز نیست. +form.team_name_not_allowed=نام تیم یا الگوی %q مجاز نیست. + +settings=تنظيمات +settings.options=گزینه‌‌‌‌‌‌ها +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=عمومی +members.public_helper=خصوصی کردن +members.private=خصوصی +members.private_helper=عمومی کردن +members.member_role=نقش عضو: +members.owner=مالک +members.member=عضو +members.remove=حذف +members.leave=ترک‌کردن +members.invite_desc=افزودن عضو جدید به %s: +members.invite_now=درخواست حضور + +teams.join=پیوستن +teams.leave=ترک‌کردن +teams.read_access=دسترسی خواندن +teams.read_access_helper=این تیم قادر خواهد بود مخازن خود را مشاهده و کپی نماید. +teams.write_access=دسترسی نوشتن +teams.write_access_helper=این تیم قادر خواهد بود مخازن را مشاهده و تغییراتی را در آن ایجاد نماید. +teams.admin_access=دسترسی مدیر +teams.admin_access_helper=این تیم قادر است که در تمام مخازنش pull/push انجام دهد، و همچنین همکاران دیگری را به تیم بیفزایند. +teams.no_desc=توضیحی برای این تیم ثبت نشده‌است +teams.settings=تنظيمات +teams.owners_permission_desc=مالک ها دسترسی کامل به تمام مخازن و دسترسی مدیریت به سازمان را دارند. +teams.members=اعضای تیم +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=این تیم دسترسی نوشتن خواهد داشت: اعضا خواهند توانست مخازن تیم را خوانده ، تغییراتی در آنها اعمال کرده و یا همکارانشان را به مخازن اضافه نمایند. +teams.repositories=مخازن تیم +teams.search_repo_placeholder=جستجوی مخزن... +teams.add_team_repository=افزودن مخزن تیمی +teams.remove_repo=حذف +teams.add_nonexistent_repo=مخزنی را که شما قصد افزودن آن را دارید موجود نیست، لطفا ابتدا آن را ایجاد کنید. + +[admin] +dashboard=داشبورد +users=کاربران +organizations=سازمان ها +repositories=مخازن +authentication=اهراز هویت +config=پیکربندی +notices=هشدارهای سیستم +monitor=مانیتورینگ +first_page=اولین +last_page=آخرين +total=مجموع: %d + +dashboard.build_info=اطلاعات ساخت +dashboard.app_ver=نسخه برنامه +dashboard.git_version=نسخه‌ی Git +dashboard.go_version=نسخه‌ی Go +dashboard.build_time=زمان ساخت +dashboard.build_commit=کامیت ساخت +dashboard.statistic=آمار +dashboard.operations=عملیات +dashboard.system_status=سیستم مانیتور وضعیت +dashboard.statistic_info=دیتابیس gogs شامل %d کاربران, %d سازمان ها, %d کلید های عمومی, %d مخازن, %d مشاهده ها, %d ستاره دار ها, %d فعالیت ها, %d دسترسی ها, %d مسائل, %d نظرات, %d حساب ها کاربری شبکه های اجتماعی, %d دنیال کردن ها, %dmirror, %d ریلیز ها, %d نقاط ورود به سیستم, %d webhooks, %d نقاط عطف یا milestone ها, %d برچسب, %d hook وظایف, %d تیم, %d به روزرسانی ها وظایف افراد, %d پیوست هاست. +dashboard.operation_name=نام عملیات +dashboard.operation_switch=سویچ +dashboard.select_operation_to_run=Please select operation to run +dashboard.operation_run=اجرا +dashboard.clean_unbind_oauth=پاک کردن OAuthe های ناخواسته +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=انجام جمع آوری زباله در مخازن +dashboard.git_gc_repos_success=عولیات garbage collection در تمام مخازن با موفقیت انجام شد. +dashboard.resync_all_sshkeys=بازنویسی فایل '.ssh/authorized_keys' (توجه: کلید های غیر Gogs از بین خواهند رفت) +dashboard.resync_all_sshkeys_success=تمام کلید های عمومی با موفقیت بازنویسی شدند. +dashboard.resync_all_hooks=همگام سازی مجدد hook های pre-receive و update و post-receive برای تمامی مخازن +dashboard.resync_all_hooks_success=همگام سازی مجدد hook های pre-receive و update و post-receive برای تمامی مخازن با موفقیت انجام شد. +dashboard.reinit_missing_repos=بازتعریف مخازنی که فایل های Git آنها از دست رفته است +dashboard.reinit_missing_repos_success=بازتعریف مخازنی که فایل های Git آنها از دست رفته است با موفقی انجام شد. + +dashboard.server_uptime=آپ تایم سرور +dashboard.current_goroutine=Goroutine های فعلی +dashboard.current_memory_usage=میزان استفاده فعلی از حافظه +dashboard.total_memory_allocated=کل حافظه اختصاص داده شده +dashboard.memory_obtained=حافظه به دست آمده +dashboard.pointer_lookup_times=زمان سنج Pointer Lookup +dashboard.memory_allocate_times=زمان های تخصیص حافظه +dashboard.memory_free_times=زمان های آزادی حافظه +dashboard.current_heap_usage=میزان مصرف پشته فعلی +dashboard.heap_memory_obtained=حافظه به دست آمده +dashboard.heap_memory_idle=بیکار بودن Heap Memory +dashboard.heap_memory_in_use=Heap Memory درحال استفاده +dashboard.heap_memory_released=Heap Memory آزادسازی شد +dashboard.heap_objects=اشیاء Heap +dashboard.bootstrap_stack_usage=میزان استفاده از پشته ی Bootstrap +dashboard.stack_memory_obtained=حافظه پشته به دست آمده +dashboard.mspan_structures_usage=میزان استفاده‌ی ساختار های MSpan +dashboard.mspan_structures_obtained=ساختار های MSpan به دست آمده +dashboard.mcache_structures_usage=میزان استفاده از ساختار های MCache +dashboard.mcache_structures_obtained=ساختار های MCache به دست آمده +dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table به دست آمده +dashboard.gc_metadata_obtained=متادیتاهای بدست امده از GC +dashboard.other_system_allocation_obtained=تخصیص های حافظه در سایر قسمت های سیستم +dashboard.next_gc_recycle=بازیافت GC بعدی +dashboard.last_gc_time=زمان از آخرین GC +dashboard.total_gc_time=کل زمان مکث GC +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=فعال شده +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=خصوصی +repos.watches=تماشا شده +repos.stars=ستاره ها +repos.issues=مسائل +repos.size=اندازه + +auths.auth_sources=منابع احراز هویت +auths.new=اضافه کردن منبع جدید +auths.name=نام +auths.type=نوع +auths.enabled=فعال شده +auths.default=پیش فرض +auths.updated=به روز رسانی شده +auths.auth_type=نوع تأیید اعتبار +auths.auth_name=نام مجوز احراز هویت +auths.security_protocol=پروتکل امنیتی +auths.domain=دامنه +auths.host=میزبان +auths.port=پورت +auths.bind_dn=DN متصل شده +auths.bind_dn_helper=شما قادرید که از %s به عنوان یک placeholder برای نام کاربری استفاده کنید، برای مثال DOM\%s +auths.bind_password=اتصال رمز عبور +auths.bind_password_helper=اخطار: این رمز عبور به صورت متن ساده ذخیره می شود. برای حساب های کابری با دسترسی های زیاد استفاده نکنید. +auths.user_base=پایگاه جستجوی کاربر +auths.user_dn=کاربر DN +auths.attribute_username=ویژگی نام کاربری +auths.attribute_username_placeholder=برای استفاده از مقدار نام کاربری در فرم ورود، این مقدار را خالی بگذارید. +auths.attribute_name=ویژگی نام +auths.attribute_surname=ویژگی نام خانوادگی +auths.attribute_mail=ویژگی ایمیل +auths.verify_group_membership=تایید عضویت در گروه +auths.group_search_base_dn=جستجوی گروهی Base DN +auths.group_filter=فیلتر سازی گروه +auths.group_attribute_contain_user_list=گروه خصیصه ای شامل لیستی از کاربران +auths.user_attribute_listed_in_group=خصیصه های کاربران لیست شده در گروه +auths.attributes_in_bind=واکشی خصیصه های Bind DN در متن زمینه +auths.filter=فیلترسازی کاربر +auths.admin_filter=فیلتر سازی مدیر +auths.ms_ad_sa=Ms Ad SA +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.edit=ویرایش تنظیمات تأیید اعتبار +auths.activated=متد احراز هویت فعال شده است +auths.default_auth=این احراز هویت پیش فرض منبع ورود می باشد +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=متد احرازهویت با موفقیت حذف شد! +auths.login_source_exist=مدخل لاگین %s قبلا موجود بوده است. +auths.github_api_endpoint=نشانه پایانی API + +config.not_set=(تنظیم نشده) +config.server_config=پیکربندی سرور +config.brand_name=نام برند +config.run_user=کاربر در حال اجرا +config.run_mode=حالت اجرا +config.server.external_url=آدرس خارجی +config.server.domain=دامنه +config.server.protocol=پروتکل +config.server.http_addr=آدرس HTTP +config.server.http_port=پورت HTTP +config.server.cert_file=فایل گواهی +config.server.key_file=فایل کلید +config.server.tls_min_version=کمترین نسخه TLS +config.server.unix_socket_permission=مجوز سوکت یونیکس +config.server.local_root_url=Local root URL +config.server.offline_mode=حالت آفلاین +config.server.disable_router_log=غیرفعال کردن لاگ مسیریاب +config.server.enable_gzip=فعال کردن Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL + +config.ssh_config=پیکربندی SSH +config.ssh.enabled=فعال شده +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=پیکربندی مخزن +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit + +config.db_config=تنظیمات پایگاه داده +config.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification + +config.session_config=پیکربندی Session ها +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie + +config.cache_config=پیکربندی cache +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=تنظیمات HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit + +config.picture_config=تنظیمات تصویر +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=تنظیمات Webhook +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=پیکربندی Git +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path + +config.log_config=پیکربندی لاگ +config.log_file_root_path=مسیر ریشه ی فایل لاگ +config.log_mode=حالت +config.log_options=گزینه‌‌‌‌‌‌ها + +monitor.cron=وظایف Cron +monitor.name=نام +monitor.schedule=زمان بندی +monitor.next=زمان بعدی +monitor.previous=زمان قبلی +monitor.execute_times=زمان اجرا +monitor.process=پرازش در حال اجرا +monitor.desc=توضیحات +monitor.start=زمان شروع +monitor.execute_time=زمان مورد نیاز برای اجرا + +notices.system_notice_list=هشدارهای سیستم +notices.view_detail_header=مشاهده جزئیات اخطار +notices.actions=اقدامات +notices.select_all=انتخاب همه +notices.deselect_all=لغو انتخاب همه +notices.inverse_selection=انتخاب معکوس +notices.delete_selected=حذف انتخاب شده ها +notices.delete_all=حذف همه اخطارها +notices.type=نوع +notices.type_1=مخزن +notices.desc=توضیحات +notices.op=عملیات. +notices.delete_success=اخطار های سیستم با موفقیت حذف شده باشد. + +[action] +create_repo=مخزن ایجاد شده %s +rename_repo=مخزن تغییر نام داد از %[1]s به %[3]s +commit_repo=پوش کردن به %[3]s در %[4]s +compare_commits=مشاهده مقایسه برای کامیت %d +transfer_repo=مخزن از %s به %sمنتقل شده است +create_issue=`مسايل رسیدگی نشده%s#%[2]s` +close_issue=`مسائل رسیدگی شده%s#%[2]s` +reopen_issue=`مسايل بازگشایی شده %s#%[2]s` +comment_issue=`در مسئله ی %s#%[2]s اظهار نظر کرده` +create_pull_request=`درخواست واکشی برای %s#%[2]sایجاد شده است` +close_pull_request=`درخواست واکشی %s#%[2]s بسته شد` +reopen_pull_request=`درخواست واکشی%s#%[2]sبازگشایی شد` +merge_pull_request=`merged pull request %s#%[2]s` +create_branch=شاخه ی جدید %[3]sدر%[4]s ایجاد شد +delete_branch=شاخه ی حذف شده ی %[2]s در%[3]s +push_tag=تگ %[2]sدر %[3]sپوش شد +delete_tag=برچسب %[2]s در %[3]s حذف شده +fork_repo=انشعاب مخزن به %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror + +[tool] +ago=پیش +from_now=از هم اکنون +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 +raw_seconds=ثانیه +raw_minutes=دقیقه ها +raw_hours=ساعت + +[dropzone] +default_message=فایل را در این محل رها کنید یا دکمه ی آپلود یا بارگزاری را فشار دهید. +invalid_input_type=شما قادر به ارسال فایل های از این نوع نیستید. +file_too_big=حجم فایل ({{filesize}} MB) بیش از حداکثر مجاز است ({{maxFilesize}} مگابایت). +remove_file=حذف فایل + diff --git a/conf/locale/locale_fi-FI.ini b/conf/locale/locale_fi-FI.ini index 6350156d81f..21926a7f6b4 100644 --- a/conf/locale/locale_fi-FI.ini +++ b/conf/locale/locale_fi-FI.ini @@ -9,7 +9,6 @@ sign_out=Kirjaudu ulos sign_up=Rekisteröidy register=Rekisteröidy website=Nettisivut -version=Versio page=Sivu template=Malli language=Kieli @@ -23,13 +22,13 @@ password=Salasana re_type=Kirjoita uudelleen captcha=Captcha -repository=Repo +repository=Tietosäilö organization=Organisaatio mirror=Peili -new_repo=Uusi repo +new_repo=Uusi tietosäilö new_migrate=Uusi migraatio new_mirror=Uusi peilaus -new_fork=Uusi haara reposta +new_fork=Uusi tietosäilö haarautuksesta new_org=Uusi organisaatio manage_org=Ylläpidä organisaatioita admin_panel=Ylläpito paneeli @@ -39,85 +38,97 @@ your_profile=Profiilisi your_settings=Asetuksesi activities=Toimet -pull_requests=Pull requestit -issues=Ongelmat +pull_requests=Vetopyynnöt +issues=Esitykset cancel=Peruuta +[status] +page_not_found=Sivua ei löydy +internal_server_error=Sisäinen palvelinvirhe + [install] install=Asennus title=Asennusvaiheet ottaessa ensi kertaa käyttöön docker_helper=Jos käytät Gogsia Dockerin sisällä, ole hyvä ja lue ohjeet huolellisesti ennen kuin muutat mitään tältä sivulta! -requite_db_desc=Gogs tarvitsee MySQL, PostgreSQL, SQLite3 tai TiDB. -db_title=Tietokanta asetukset -db_type=Tietokanta tyyppi +requite_db_desc=Gogs tarvitsee tietokannakseen MySQL, PostgreSQL, SQLite3 tai TiDB (MySQL-protkollan kautta). +db_title=Tietokannan asetukset +db_type=Tietokannan tyyppi host=Isäntä user=Käyttäjä password=Salasana db_name=Tietokannan nimi +db_schema=Skeema db_helper=Ole hyvä ja käytä INNODB moottoria ja utf8_general_ci merkistöä MySQLssä. -ssl_mode=SSL tila +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ä. +sqlite_helper=Tiedostopolku SQLite3-tietokantaan.
Käytä absoluuttista polkua ajaessasi palveluna. +err_empty_db_path=SQLite3-tietokantapolku ei voi olla tyhjä. +no_admin_and_disable_registration=Et voi poistaa käytöstä rekisteröintiä luomatta ylläpitotiliä. err_empty_admin_password=Ylläpito salasana ei voi olla tyhjä. general_title=Sovellus yleiset asetukset -app_name=Sovellus nimi +app_name=Sovelluksen 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. +repo_path=Tietosäilön juurihakemisto +repo_path_helper=Kaikki Git-etätietosäilöt tullaan tallentamaan tähän hakemistoon. run_user=Suorita käyttäjänä -run_user_helper=Käyttäjällä täytyy olla pääsy repo juuri polkuun ja suorittaa Gogs. +run_user_helper=Käyttäjällä täytyy olla oikeus repositoryn juuripolkuun. Käyttäjällä täytyy myös olla oikeus suorittaa Gogs. domain=Verkkotunnus -domain_helper=Tämä vaikuttaa SSH klooni URLeihin. -ssh_port=SSH portti +domain_helper=Tämä vaikuttaa SSH-kloonausosoitteisiin. +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. +use_builtin_ssh_server=Käytä sisäänrakennettua SSH-palvelinta +use_builtin_ssh_server_popup=Käynnistä sisäänrakennettu SSH-palvelin Git-operaatioille, järjestelmän SSH-palvelusta erottautumiseksi. +http_port=HTTP-portti +http_port_helper=Porttinumero, jota sovellus tulee kuuntelemaan. +app_url=Sovelluksen osoite +app_url_helper=Tämä vaikuttaa HTTP/HTTPS-klooniosoitteisiin ja joihinkin sähköposteihin. log_root_path=Lokin polku log_root_path_helper=Lokien tallennushakemisto. +enable_console_mode=Ota käyttöön konsoli tila +enable_console_mode_popup=Tiedosto tilan lisäksi tulosta logit konsoliin. +default_branch=Oletus haara 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. +smtp_from_helper=Sähköpostin lähettäjän osoite, RFC 5322. Se voi olla pelkkä sähköpostiosoite 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 +register_confirm=Ota käyttöön rekisteröintivarmistus 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 +offline_mode=Ota käyttöön yhteydetön tila +offline_mode_popup=Poista käytöstä CDN myös tuotantotilassa, kaikki resurssitiedostot 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=Enable Federated Avatars Lookup -federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +federated_avatar_lookup=Käytä ulkopuolista profiilikuvien hakua +federated_avatar_lookup_popup=Ota ulkopuolinen profiilikuvien haku käyttöön käyttääksesi avoimen lähdekoodin libravatar-palvelua. disable_registration=Poista käytöstä itse-rekisteröinti -disable_registration_popup=Poista käyttäjän itse rekisteröinti, vain ylläpito voi luoda tilejä. +disable_registration_popup=Poista käyttäjän itserekisteröinti, vain ylläpito voi luoda tilejä. 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 +require_sign_in_view_popup=Vain sisäänkirjautuneet käyttäjät voivat nähdä sivut, vierailijat tulevat näkemään vain kirjautumis-/rekisteröintisivut. +admin_setting_desc=Sinun ei tarvitse luoda ylläpitotiliä nyt, ensimmäinen käyttäjä ID=1 saa ylläpito-oikeudet automaattisesti. +admin_title=Ylläpitotilin asetukset admin_name=Käyttäjätunnus admin_password=Salasana confirm_password=Varmista salasana admin_email=Ylläpito sähköposti install_gogs=Asenna Gogs 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. +sqlite3_not_available=Julkaisuversiosi ei tue SQLite3:a, ole hyvä ja lataa virallinen binääriversio osoitteesta %s, EI gobuild-versiota. invalid_db_setting=Tietokanta asetus ei ole oikea: %v -invalid_repo_path=Repo juuri polku on virheellinen: %v +invalid_repo_path=Tietosäilön juurihakemisto on virheellinen: %v run_user_not_match=Suoritus käyttäjä ei ole nykyinen käyttäjä: %s -> %s +smtp_host_missing_port=SMTP-isännältä puuttuu portin osoite. +invalid_smtp_from=SMTP From kenttä ei ole kelvollinen: %v save_config_failed=Asetuksien tallennus epäonnistui: %v -invalid_admin_setting=Ylläpito tili asetus virheellinen: %v +init_failed=Sovelluksen alustus epäonnistui: %v +invalid_admin_setting=Ylläpitotilin asetus on virheellinen: %v install_success=Tervetuloa! Olemme iloisia että valitsit Gogs, pidä hauskaa ja pidä huolta itsestäsi. invalid_log_root_path=Loki juurihakemisto ei kelpaa: %v @@ -125,44 +136,54 @@ invalid_log_root_path=Loki juurihakemisto ei kelpaa: %v uname_holder=Käyttäjätunnus tai sähköposti password_holder=Salasana switch_dashboard_context=Vaihda kojelaudan kontekstia -my_repos=Reponi -show_more_repos=Show more repositories... -collaborative_repos=Yhteistyö repot +my_repos=Minun tietosäilöt +show_more_repos=Näytä lisää tietosäilöjä... +collaborative_repos=Yhteistyötietosäilöt my_orgs=Organisaationi -my_mirrors=Peilini +my_mirrors=Peilaukseni view_home=Näytä %s -issues.in_your_repos=Repoissasi +issues.in_your_repos=Sinun tietosäilöissäsi [explore] -repos=Repot -users=Users -search=Search +repos=Tietosäilöt +users=Käyttäjät +organizations=Organisaatiot +search=Hae [auth] create_new_account=Luo uusi tili -register_hepler_msg=On jo tili? Kirjaudu sisään nyt! +register_hepler_msg=Onko sinulla jo tili? Kirjaudu sisään nyt! social_register_hepler_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ä. +disable_register_prompt=Valitettavasti rekisteröinti on poistettu käytöstä. Ole hyvä ja ota yhteyttä sivuston ylläpitoon. +disable_register_mail=Valitettavasti sähköpostipalvelut ovat poissa käytöstä. Otathan yhteyttä sivuston ylläpitoon. +auth_source=Todennuslähde +local=Paikallinen 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. +confirmation_mail_sent_prompt=Uusi varmistussä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=Login Prohibited -prohibit_login_desc=Your account is prohibited to login, please contact site admin. +prohibit_login=Kirjautuminen kielletty +prohibit_login_desc=Käyttäjätilisi kirjautuminen on estetty. Ota yhteys sivuston ylläpitäjään. 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 +has_unconfirmed_mail=Hei %s, sinulla on varmistamaton sähköpostiosoite (%s). Jos et ole saanut varmistussähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja napsauta allaolevaa painiketta. +resend_mail=Napsauta tästä uudelleenlähettääksesi aktivointisähköpostisi +send_reset_mail=Napsauta tästä (uudelleen)lähettääksesi salasanan alustussähköpostin reset_password=Nollaa salasanasi invalid_code=Sori, varmistuskoodisi on vanhentunut tai väärä. -reset_password_helper=Klikkaa tästä nollataksesi salasanasi +reset_password_helper=Napsauta tästä nollataksesi salasanasi password_too_short=Salasanan pituus ei voi olla vähemmän kuin 6 merkkiä. -non_local_account=Non-local accounts cannot change passwords through Gogs. +non_local_account=Vain paikallisten käyttäjätilien salasanan vaihto onnistuu Gogsin kautta. + +login_two_factor=Kaksivaiheinen todennus +login_two_factor_passcode=Todennuksen salasana +login_two_factor_enter_recovery_code=Kirjoita kaksivaiheisen todennuksen palautuskoodi +login_two_factor_recovery=Kaksivaiheisen todennuksen palautus +login_two_factor_recovery_code=Palautuskoodi +login_two_factor_enter_passcode=Kirjoita kaksivaiheisen todennuksen salasana +login_two_factor_invalid_recovery_code=Palautuskoodi on käytetty tai ei ole kelvollinen. [mail] activate_account=Ole hyvä ja aktivoi tilisi @@ -178,27 +199,28 @@ modify=Muokkaa [form] UserName=Käyttäjätunnus -RepoName=Repon nimi -Email=Sähköposti osoite +RepoName=Tietosäilön nimi +Email=Sähköpostiosoite Password=Salasana Retype=Kirjoita salasana uudelleen -SSHTitle=SSH avain nimi -HttpsUrl=HTTPS URL +SSHTitle=SSH-avaimen nimi +HttpsUrl=HTTPS-osoite PayloadUrl=Payload URL TeamName=Tiimin nimi AuthName=Luvan nimi AdminEmail=Ylläpito sähköposti -NewBranchName=New branch name -CommitSummary=Commit summary -CommitMessage=Commit message -CommitChoice=Commit choice -TreeName=File path -Content=Content +NewBranchName=Uuden haaran nimi +CommitSummary=Sitoutuksen yhteenveto +CommitMessage=Sitoutuksen viesti +CommitChoice=Commitin valinta +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ä.` +alpha_dash_dot_slash_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ä.` @@ -210,31 +232,32 @@ 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ä. +repo_name_been_taken=Tietosäilön 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. +auth_source_mismatch=Valittua todennuslähdettä ei liitetä käyttäjään. +enterred_invalid_repo_name=Ole hyvä ja varmista että kirjoittamasi tietosäilön 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=Gogs ei voi varmistaa SSH avaintasi, mutta oletamme että se on toimiva, ole hyvä ja tarkista se. +invalid_ssh_key=Pahoittelut, emme pystyneet varmistamaan SSH-avainta: %s +unable_verify_ssh_key=Gogs 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_own_repo=Tililläsi on yhä omistajuus ainakin yhteen tietosäilöön, 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. +org_still_own_repo=Tällä organisaatiolla on yhä omistajuus tietosäilöön, sinun täytyy poistaa tai siirtää ne ensin. -target_branch_not_exist=Kohde branchia ei ole olemassa. +target_branch_not_exist=Kohde haaraa ei ole olemassa. [user] -change_avatar=Change your avatar +change_avatar=Vaihda profiilikuvasi join_on=Liitytty -repositories=Repot +repositories=Tietosäilöt activity=Julkinen toiminta followers=Seuraajat starred=Äänestetty @@ -242,22 +265,21 @@ 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. +form.name_not_allowed=Käyttäjätunnusta tai mallia %q ei ole sallittu. [settings] profile=Profiili password=Salasana -avatar=Avatar +avatar=Profiilikuva ssh_keys=SSH avaimet -social=Sosiaaliset tilit -applications=Sovellukset +security=Turvallisuus +repos=Tietosäilö orgs=Organisaatiot +applications=Sovellukset delete=Poista tili -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. +profile_desc=Sähköpostiosoitteesi 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 @@ -269,8 +291,8 @@ change_username_prompt=Tämä muutos vaikuttaa tapaan kuinka linkit liittyvät t continue=Jatka cancel=Peruuta -lookup_avatar_by_mail=Lookup Avatar by mail -federated_avatar_lookup=Federated Avatar Lookup +lookup_avatar_by_mail=Hae profiilikuva sähköpostiosoitteen avulla +federated_avatar_lookup=Ulkopuolinen profiilikuvan haku enable_custom_avatar=Ota käyttöön mukautettu profiilikuva choose_new_avatar=Valitse uusi profiilikuva update_avatar=Päivitä profiilikuva asetus @@ -286,23 +308,24 @@ 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 +emails=Sähköpostiosoite +manage_emails=Hallitse sähköpostiosoitteita email_desc=Ensisijaista sähköpostiosoitettasi käytetään ilmoituksiin ja muihin toimintoihin. 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_desc=Tämän sähköpostiosoitteen poistaminen poistaa siihen liittyvät tiedot tililtäsi. Haluatko jatkaa? email_deletion_success=Sähköposti on poistettu onnistuneesti! +email_deletion_primary=Pääsähköpostin poistaminen ei onnistu. 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_confirmation_sent=Uusi varmistussä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_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. @@ -320,14 +343,36 @@ 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. +two_factor=Kaksivaiheinen todennus +two_factor_status=Tila: +two_factor_on=Käytössä +two_factor_off=Pois käytöstä +two_factor_enable=Ota käyttöön +two_factor_disable=Poista käytöstä +two_factor_view_recovery_codes=Katso ja tallenna palautuskoodejasi turvallisessa paikassa. Voit käyttää niitä salasanoina, jos menetän pääsyn todennussovellukseen. +two_factor_http=HTTP/HTTPS-toimintoihin et voi enää käyttää pelkkää käyttäjänimeä ja salasanaa. Luo ja käytä henkilökohtaisia pääsymerkkejä tunnuksinasi, esimerkiksi %[3]s. +two_factor_enable_title=Ota käyttöön kaksivaiheinen todennus +two_factor_scan_qr=Käytä todennus sovellustasi lukeaksesi kuvan: +two_factor_or_enter_secret=Tai kirjoita salaisuus: +two_factor_then_enter_passcode=Sitten kirjoita salasana: +two_factor_verify=Vahvista +two_factor_invalid_passcode=Kirjoittamasi salasana ei kelpaa, yritä uudelleen! +two_factor_reused_passcode=Antamasi salasana on jo käytetty, kokeile toista! +two_factor_enable_error=Ota käyttöön kaksivaiheinen todennus epäonnistui: %v +two_factor_enable_success=Kaksivaiheinen todennus on otettu käyttöön tilissäsi menestyksekkäästi! +two_factor_recovery_codes_title=Kaksivaiheinen todennus palautuskoodit +two_factor_recovery_codes_desc=Palautuskoodeja käytetään kun väliaikaisesti menetät pääsyb todennus sovellukseesi. Kukin palautuskoodi voidaan käyttää vain kerran, pidä näitä koodeja turvallisessa paikassa. +two_factor_regenerate_recovery_codes=Uudista palautuskoodit +two_factor_regenerate_recovery_codes_error=Uudista palautuskoodit epäonnistui: %v +two_factor_regenerate_recovery_codes_success=Uusien palautuskoodien luonti onnistui! +two_factor_disable_title=Poista kaksivaiheinen todennus käytöstä +two_factor_disable_desc=Käyttäjätilisi turvallisuustaso vähenee kun poistat käytöstä kaksivaiheisen todennuksen. Haluatko jatkaa? +two_factor_disable_success=Kaksivaiheinen todennus on poistettu käytöstä onnistuneesti! manage_access_token=Hallitse henkilökohtaisia pääsymerkkejä generate_new_token=Luo uusi pääsymerkki tokens_desc=Luomiasi pääsymerkkejä voidaan käyttää Gogs APIn kanssa. +access_token_tips=Henkilökohtaista pääsytunnusta voidaan käyttää joko käyttäjätunnuksena tai salasanana. On suositeltavaa käyttää "x-access-token" käyttäjätunnuksena ja henkilökohtaista pääsytunnusta Git-sovellusten salasanana. new_token_desc=Joka pääsymerkillä on täysi pääsy tiliisi. token_name=Pääsymerkin nimi generate_token=Luo pääsymerkki @@ -336,6 +381,16 @@ 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. +token_name_exists=Saman nimen tunnus on jo olemassa. + +orgs.none=Et ole yhdenkään organisaation jäsen. +orgs.leave_title=Poistu organisaatiosta +orgs.leave_desc=Menetät oikeudet kaikkiin niihin repoihin ja tiimeihin joihin organisaatio on sinulle oikeudet antanut. Haluatko varmasti jatkaa? + +repos.leave=Poistu +repos.leave_title=Poistu tietosäilöstä +repos.leave_desc=Menetät pääsyn tietosäilöön poistuessasi. Haluatko jatkaa? +repos.leave_success=Olet poistunut tietosäilöstä '%s' onnistuneesti! delete_account=Poista tilisi delete_prompt=Toiminto poistaa tilisi pysyvästi ja tätä EI VOI peruuttaa myöhemmin! @@ -345,53 +400,57 @@ 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. +repo_name=Tietosäilön nimi +repo_name_helper=Hyvä tietosäilö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) +unlisted=Listaamaton +visiblity_helper=Tämä tietosäilö on yksityinen +unlisted_helper=Tämä tietosäilö on listaamaton +visiblity_helper_forced=Sivuston ylläpito on pakottanut kaikkien uusien tietosäilöjen olevan yksityisiä +visiblity_fork_helper=(Arvon vaihtaminen vaikuttaa kaikkiin haarautuksiin) 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ä. +fork_repo=Haarauta tietosäilö +fork_from=Haarauta lähteestä +fork_visiblity_helper=Et voi muuttaa haarautetun tietosäilön näkyvyyttä. repo_desc=Kuvaus repo_lang=Kieli -repo_gitignore_helper=Select .gitignore templates +repo_gitignore_helper=Valitse .gitignore malli license=Lisenssi license_helper=Valitse lisenssitiedosto readme=Lueminut-tiedosto readme_helper=Valitse Lueminut-malli -auto_init=Alusta tämä repo valituilla tiedostoilla ja mallilla -create_repo=Luo repo -default_branch=Oletus branch -mirror_prune=Prune -mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote +auto_init=Alusta tämä tietosäilö valituilla tiedostoilla ja mallilla +create_repo=Luo tietosäilö +default_branch=Oletus haara +mirror_prune=Karsi +mirror_prune_desc=Poista kaikki paikalliset seurantahaarat joiden vastaavia etähaaroja ei ole enää olemassa 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=Last Synced +mirror_last_synced=Synkronoitu viimeksi watchers=Tarkkailijat stargazers=Tähtiharrastajat -forks=Haarat +forks=Haarautukset +repo_description_helper=Repon kuvaus. Enintään 512 merkkiä. +repo_description_length=Käytettävissä olevat merkit 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. +form.name_not_allowed=Repon nimeä tai mallia %q ei ole sallittu. need_auth=Tarvitaan lupa migrate_type=Siirtotyyppi migrate_type_helper=Tämä repo tulee olemaan peili migrate_repo=Siirrä repo -migrate.clone_address=Kloonaa osoite -migrate.clone_address_desc=Tämä voi olla HTTP/HTTPS/GIT URL tai paikallisen palvelimen polku. +migrate.clone_address=Monistuksen osoite +migrate.clone_address_desc=Tämä voi olla HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=Paikallisen palvelimen kansiopolun käyttö repon migraatiossa on myös salittua. migrate.permission_denied=Sinun ei sallita tuovan paikallisia repoja. migrate.invalid_local_path=Virheellinen paikallinen polku, ei ole olemassa tai ei ole hakemisto. +migrate.clone_address_resolved_to_blocked_local_address=Kloonausosoite ratkeaa paikallisverkko-osoitteeksi joka on täysin estetty. migrate.failed=Siirto epäonnistui: %v mirror_from=peilaus alkaen -forked_from=forkattu lähteestä -fork_from_self=Et voi forkata repoa jonka jo omistat! +forked_from=haarautettu lähteestä copy_link=Kopioi copy_link_success=Kopioitu! copy_link_error=Paina ⌘-C tai Ctrl-C kopioidaksesi @@ -400,73 +459,87 @@ unwatch=Lopeta tarkkailu watch=Tarkkaile unstar=Peru ääni star=Äänestä -fork=Fork +fork=Haarauta 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! +push_exist_repo=Työnnä olemassa oleva tietosäilö komentoriviltä +bare_message=Tässä repossa ei ole mitään sisältöä vielä. -code=Koodi -branch=Branch +files=Tiedostot +branch=Haara tree=Puu -filter_branch_and_tag=Suodata haara tai tagi -branches=Branchit -tags=Tagit -issues=Ongelmat -pulls=Pull-pyynnöt -labels=Tunnisteet +filter_branch_and_tag=Suodata haara tai tunniste +branches=Haarat +tags=Tunnisteet +issues=Esitykset +pulls=Vetopyynnöt +labels=Leimat milestones=Merkkipaalut -commits=Commitit +commits=Sitoutukset +git_branches=Haarat releases=Julkaisut file_raw=Raaka file_history=Historia file_view_raw=Näytä raaka file_permalink=Pysyvä linkki -file_too_large=This file is too large to be shown - -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.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 -editor.delete_this_file=Delete this file -editor.must_have_write_access=You must have write access to make or propose changes to this file -editor.file_delete_success=File '%s' has been deleted successfully! -editor.name_your_file=Name your file... -editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. -editor.or=or -editor.cancel_lower=cancel -editor.commit_changes=Commit Changes -editor.add_tmpl=Add '%s/' -editor.add=Add '%s' -editor.update=Update '%s' -editor.delete=Delete '%s' -editor.commit_message_desc=Add an optional extended description... -editor.commit_directly_to_this_branch=Commit directly to the %s branch. -editor.create_new_branch=Create a new branch for this commit and start a pull request. -editor.new_branch_name_desc=New branch name... -editor.cancel=Cancel -editor.filename_cannot_be_empty=Filename cannot be empty. -editor.branch_already_exists=Branch '%s' already exists in this repository. -editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. -editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. -editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. -editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. -editor.file_already_exists=A file with name '%s' already exists in this repository. -editor.no_changes_to_show=There are no changes to show. -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' - -commits.commits=Commitit -commits.search=Etsi commiteista +file_too_large=Tämä tiedosto on liian suuri näytettäväksi +video_not_supported_in_browser=Selaimesi ei tue HTML5 video-avainsanaa. + +branches.overview=Yleiskatsaus +branches.active_branches=Aktiiviset haarat +branches.stale_branches=Passivoituneet haarat +branches.all=Kaikki haarat +branches.updated_by=Päivitetty %[1]s %[2]s +branches.change_default_branch=Muuta oletushaaraa +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=Uusi tiedosto +editor.upload_file=Liitä tiedosto +editor.edit_file=Muokkaa tiedostoa +editor.preview_changes=Muutosten esikatselu +editor.cannot_edit_non_text_files=Voit editoida vain tekstitiedostoja +editor.edit_this_file=Muokkaa tätä tiedostoa +editor.must_be_on_a_branch=Haara täytyy olla valittuna jotta voit tehdä tai ehdottaa muutoksia tähän tiedostoon +editor.fork_before_edit=Sinun täytyy haarautaa tästä tietosäilöstä ennen tiedoston muokkaamista +editor.delete_this_file=Poista tämä tiedosto +editor.must_have_write_access=Sinulla on kirjoitusoikeus tai ehdottaa muutoksia tiedostoon +editor.file_delete_success=Tiedosto "%s" on poistettu onnistuneesti! +editor.name_your_file=Nimeä tiedostosi... +editor.filename_help=Lisää hakemisto, kirjoita se ja paina /. Poista hakemisto, siirry kentän alkuun ja paina ASKELPALAUTINTA. +editor.or=tai +editor.cancel_lower=peruuta +editor.commit_changes=Sitouta muutokset +editor.add_tmpl=Lisää '%s/' +editor.add=Lisää "%s" +editor.update=Päivitä '%s' +editor.delete=Poista "%s" +editor.commit_message_desc=Lisää valinnainen pidennetty kuvaus... +editor.commit_directly_to_this_branch=Sitouta suoraan haaraan %s. +editor.create_new_branch=Luo uusi kehityshaara tälle sitoutukselle tai tee vetopyyntö. +editor.new_branch_name_desc=Uuden haaran nimi... +editor.cancel=Peruuta +editor.filename_cannot_be_empty=Tiedostonimi ei voi olla tyhjä. +editor.branch_already_exists=Haara '%s' on jo olemassa tässä repossa. +editor.directory_is_a_file=Annettu nimi '%s' on tiedosto, ei kansio. +editor.file_is_a_symlink=Tiedosto '%s' on symlinkki jota ei voi muokata web-selaimesta. +editor.filename_is_a_directory=Kansio nimeltä '%s' on jo olemassa tässä repossa. +editor.file_editing_no_longer_exists=Tiedostoa '%s' jota olet muokkaamassa ei ole enää olemassa tässä repossa. +editor.file_changed_while_editing=Tiedoston sisältöä on muutettu aloittamisesi jälkeen. Napsauta tästä nähdäksesi mitä on muutettu tai paina sitouta uudelleen kirjoittaaksesi muutosten päälle. +editor.file_already_exists=Tiedosto '%s' on jo olemassa tässä repossa. +editor.no_changes_to_show=Ei muutoksia näytettäväksi. +editor.fail_to_update_file=Tiedoston '%s' päivitys/luonti epäonnistui virheeseen: %v +editor.fail_to_delete_file=Tiedoston '%s' poistaminen epäonnistui virheellä: %v +editor.add_subdir=Lisää alikansio... +editor.unable_to_upload_files=Tiedostojen lataus epäonnistui kansioon '%s' virheellä: %v +editor.upload_files_to_dir=Lataa tiedostoja kansioon '%s' + +commits.commit_history=Sitoutushistoria +commits.commits=Sitoutukset +commits.search=Etsi sitoutuksista commits.find=Etsi commits.author=Tekijä commits.message=Viesti @@ -474,10 +547,10 @@ 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 -issues.new.clear_labels=Tyhjennä tunnisteet +issues.new=Uusi esitys +issues.new.labels=Leimat +issues.new.no_label=Ei leimaa +issues.new.clear_labels=Tyhjennä leimavalinta issues.new.milestone=Merkkipaalu issues.new.no_milestone=Ei merkkipaalua issues.new.clear_milestone=Tyhjennä merkkipaalu @@ -486,25 +559,25 @@ issues.new.closed_milestone=Suljetut merkkipaalut issues.new.assignee=Osoitettu issues.new.clear_assignee=Tyhjennä osoitettu issues.new.no_assignee=Ei osoitettua -issues.create=Ilmoita ongelma -issues.new_label=Uusi tunniste -issues.new_label_placeholder=Tunnisteen nimi... -issues.create_label=Luo tunniste -issues.label_templates.title=Load a predefined set of labels -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.helper=Select a label set -issues.label_templates.use=Use this label set -issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v +issues.create=Luo esitys +issues.new_label=Uusi leima +issues.new_label_placeholder=Leiman nimi... +issues.create_label=Luo leima +issues.label_templates.title=Lataa ennaltamääritelty leimajoukko +issues.label_templates.info=Täällä ei ole vielä leimoja. Voit luoda uuden napsauttamalla "Uusi leima" tai käyttää ennaltamääriteltyä leimajoukkoa alta. +issues.label_templates.helper=Valitse leimajoukko +issues.label_templates.use=Käytä tätä leimajoukkoa +issues.label_templates.fail_to_load_file=Leimamallin lataus epäonnistui tiedostosta '%s': %v issues.open_tab=%d avoinna issues.close_tab=%d suljettu -issues.filter_label=Tunniste -issues.filter_label_no_select=Ei valittua tunnistetta +issues.filter_label=Leima +issues.filter_label_no_select=Ei leimaa valittuna issues.filter_milestone=Merkkipaalu issues.filter_milestone_no_select=Ei valittua merkkipaalua issues.filter_assignee=Osoitettu issues.filter_assginee_no_select=Ei valittua osoitettua issues.filter_type=Tyyppi -issues.filter_type.all_issues=Kaikki ongelmat +issues.filter_type.all_issues=Kaikki esitykset issues.filter_type.assigned_to_you=Osoitettu sinulle issues.filter_type.created_by_you=Ilmoittamasi issues.filter_type.mentioning_you=Jotka mainitsee sinut @@ -522,8 +595,8 @@ issues.next=Seuraava issues.open_title=Avoinna issues.closed_title=Suljettu issues.num_comments=%d kommenttia -issues.commented_at=`commented %s` -issues.delete_comment_confirm=Are you sure you want to delete this comment? +issues.commented_at=`kommentoitu %s` +issues.delete_comment_confirm=Haluatko varmasti poistaa tämän kommentin? issues.no_content=Sisältöä ei vielä ole. issues.close_issue=Sulje issues.close_comment_issue=Kommentoi ja sulje @@ -532,53 +605,59 @@ issues.reopen_comment_issue=Kommentoi ja avaa uudelleen issues.create_comment=Kommentoi issues.closed_at=`suljettu %[2]s` issues.reopened_at=`avattu uudelleen %[2]s` -issues.commit_ref_at=`viittasi tähän ongelmaan commitissa %[2]s` +issues.commit_ref_at=`viittasi tähän esitykseen sitoutuksesta %[2]s` issues.poster=Tekijä issues.collaborator=Yhteistyökumppani issues.owner=Omistaja -issues.sign_in_require_desc=Sign in to join this conversation. +issues.sign_in_require_desc=Kirjaudu sisään osallistuaksesi tähän keskusteluun. issues.edit=Muokkaa issues.cancel=Peruuta issues.save=Tallenna -issues.label_title=Tunnisteen nimi -issues.label_color=Tunnisteen väri -issues.label_count=%d tunnistetta -issues.label_open_issues=%d avointa ongelmaa +issues.label_title=Leiman nimi +issues.label_color=Leiman väri +issues.label_count=%d leimaa +issues.label_open_issues=%d avointa esitystä 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_modify=Leiman muokkaus +issues.label_deletion=Leiman poistaminen +issues.label_deletion_desc=Tämän leiman poistaminen kadottaa sen kaikista esityksistä. Haluatko jatkaa? +issues.label_deletion_success=Leima on poistettu onnistuneesti! issues.num_participants=%d osallistujaa -issues.attachment.open_tab=`Click to see "%s" in a new tab` -issues.attachment.download=`Click to download "%s"` +issues.attachment.open_tab=`Napsauta nähdäksesi "%s" uudessa välilehdessä` +issues.attachment.download=`Napsauta ladataksesi "%s"` -pulls.new=Uusi pull pyyntö +pulls.new=Uusi vetopyyntö pulls.compare_changes=Vertaa muutoksia -pulls.compare_changes_desc=Vertaa kahta branchia ja tee pull-pyyntö muutoksista. -pulls.compare_base=base +pulls.compare_changes_desc=Vertaa kahta haaraa ja tee vetopyyntö muutoksista. +pulls.compare_base=pohja pulls.compare_compare=vertaa -pulls.filter_branch=Suodata branch +pulls.filter_branch=Suodata haara pulls.no_results=Tuloksia ei löytynyt. pulls.nothing_to_compare=Ei ole mitään verrattavaa koska base ja head branchit ovat tasoissa. +pulls.nothing_merge_base=Ei ole mitään verrattavaa, koska kahdella haaralla on täysin erilainen historia. pulls.has_pull_request=`On olemassa jo pull pyyntö näiden kohteiden välillä: %[2]s#%[3]d` -pulls.create=Luo Pull-pyyntö -pulls.title_desc=haluaa yhdistää %[1]d committia lähteestä %[2]s kohteeseen %[3]s -pulls.merged_title_desc=yhdistetty %[1]d committia lähteestä %[2]s kohteeseen %[3]s %[4]s +pulls.create=Luo vetopyyntö +pulls.title_desc=haluaa liittää %[1]d sitoutusta lähteestä %[2]s kohteeseen %[3]s +pulls.merged_title_desc=liitetty %[1]d sitoutusta lähteestä %[2]s kohteeseen %[3]s %[4]s pulls.tab_conversation=Keskustelu -pulls.tab_commits=Commitit -pulls.tab_files=Muuttuneet tiedostot -pulls.reopen_to_merge=Ole hyvä ja avaa uudelleen tämä pull-pyyntö suorittaaksesi yhdistämisen. -pulls.merged=Yhdistetty -pulls.has_merged=Tämä pull-pyyntö on yhdistetty onnistuneesti! -pulls.data_broken=Tämän pull-pyynnön tiedot ovat rikkoutuneet koska fork tiedot on poistettu. +pulls.tab_commits=Sitoutukset +pulls.tab_files=Muutetut tiedostot +pulls.reopen_to_merge=Ole hyvä ja avaa tämä vetopyyntö uudelleen liittääksesi. +pulls.merged=Liitetty +pulls.has_merged=Tämä vetopyyntö on liitetty onnistuneesti! +pulls.data_broken=Tämän vetopyynnön tiedot ovat hajonneet poistettujen haarautustietojen vuoksi. pulls.is_checking=Konfliktin tarkistus on yhä meneillään, ole hyvä ja päivitä sivu hetken kuluttua. -pulls.can_auto_merge_desc=Tämä pull-pyyntö voidaan yhdistää automaattisesti. -pulls.cannot_auto_merge_desc=Tätä pull-pyyntöä ei voi yhdistää automaattisesti koska on konflikteja. -pulls.cannot_auto_merge_helper=Ole hyvä ja yhdistä manuaalisesti konfliktien ratkaisemiseksi. -pulls.merge_pull_request=Yhdistä Pull-pyyntö +pulls.can_auto_merge_desc=Tämä vetopyyntö voidaan yhdistää automaattisesti. +pulls.cannot_auto_merge_desc=Tätä vetopyyntöä ei voi liittää automaattisesti konfliktien takia. +pulls.cannot_auto_merge_helper=Ole hyvä ja liitä manuaalisesti konfliktien ratkaisemiseksi. +pulls.create_merge_commit=Luo liitossitoutus +pulls.rebase_before_merging=Sulauta ennen yhdistämistä +pulls.commit_description=Sitoutuksen kuvaus +pulls.merge_pull_request=Liitä vetopyyntö pulls.open_unmerged_pull_exists=`Et voi suorittaa uudelleenavaus toimintoa koska on jo olemassa pull-pyyntö (#%d) samasta reposta samoilla yhdistämistiedoilla ja odottaa yhdistämistä.` +pulls.delete_branch=Poista haara +pulls.delete_branch_has_new_commits=Kehityshaaraa ei voida poistaa, koska siihen on tullut uusia sitoutuksia liitoksen jälkeen. milestones.new=Uusi merkkipaalu milestones.open_tab=%d avoinna @@ -611,7 +690,7 @@ wiki.create_first_page=Luo ensimmäinen sivu wiki.page=Sivu wiki.filter_page=Suodatin sivu wiki.new_page=Luo uusi sivu -wiki.default_commit_message=Kirjoita huomautus tähän päivitykseen (valinnainen). +wiki.default_commit_message=Kirjoita viesti tästä päivityksestä (valinnainen). wiki.save_page=Tallenna sivu wiki.last_commit_info=%s muokkasi tätä sivua %s wiki.edit_page_button=Muokkaa @@ -625,35 +704,65 @@ wiki.last_updated=Viimeksi päivitetty: %s settings=Asetukset settings.options=Valinnaiset settings.collaboration=Yhteistyö -settings.collaboration.admin=Admin -settings.collaboration.write=Write -settings.collaboration.read=Read -settings.collaboration.undefined=Undefined +settings.collaboration.admin=Ylläpitäjä +settings.collaboration.write=Kirjoita +settings.collaboration.read=Lue +settings.collaboration.undefined=Määrittelemätön +settings.branches=Haarat +settings.branches_bare=Et voi hallita haaroja tyhjässä repossa. Lisää jotain sisältöä ensin. +settings.default_branch=Oletushaara +settings.default_branch_desc=Oletushaaraa käytetään "pohjahaarana" sitoutuksille, vetopyynnöille ja sivustolla toteutetuille muokkauksille. +settings.update=Päivitä +settings.update_default_branch_unsupported=Palvelimella oleva Git-versio ei tue oletushaaran vaihtamista. +settings.update_default_branch_success=Repositoryn oletushaara päivitetty! +settings.protected_branches=Suojatut haarat +settings.protected_branches_desc=Suojaa kehityshaaroja pakkotyönnöiltä, vahinkopoistamisilta ja sallituilta sitouttajilta. +settings.choose_a_branch=Valitse haara... +settings.branch_protection=Haaran suojaus +settings.branch_protection_desc=Valitse suojausasetus haaralle %s. +settings.protect_this_branch=Suojaa tämä haara +settings.protect_this_branch_desc=Kiellä pakoteut push-operaatiot ja estä poistaminen. +settings.protect_require_pull_request=Vaadi pull-pyyntö suoran push-operaation sijaan +settings.protect_require_pull_request_desc=Ota tämä asetus käyttöön estääksesi suorat työnnöt tähän kehityshaaraan. Sitoutukset täytyy työntää ei-suojattuun kehityshaaraan ja liittää tähän kehityshaaraan vetopyynnön kautta. +settings.protect_whitelist_committers=Lista sallituista, jotka voivat työntää tähän kehityshaaraan +settings.protect_whitelist_committers_desc=Lisää käyttäjiä tai tiimejä sallittuihin jotka saavat työntää tähän kehityshaaraan. Sallitut käyttäjät voivat ohittaa vaatimuksen vetopyyntöjen tekemisestä. +settings.protect_whitelist_users=Käyttäjät jotka voivat pushata tähän haaraan +settings.protect_whitelist_search_users=Etsi käyttäjiä +settings.protect_whitelist_teams=Tiimit joiden jäsenet voivat pushata tähän haaraan +settings.protect_whitelist_search_teams=Etsi tiimejä +settings.update_protect_branch_success=Tämän haaran suojausasetukset on päivitetty! settings.hooks=Webkoukut -settings.githooks=Git koukut +settings.githooks=Git-koukut settings.basic_settings=Perusasetukset -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_settings=Peilauksen asetukset +settings.sync_mirror=Synkronisoi nyt +settings.mirror_sync_in_progress=Peilaus käynnissä. Päivitä sivu minuutin kuluttua uudelleen. settings.site=Virallinen sivusto settings.update_settings=Päivitä asetukset settings.change_reponame_prompt=Tämä muutos vaikuttaa siihen miten linkit liittyvät repoon. settings.advanced_settings=Lisäasetukset -settings.wiki_desc=Enable wiki system -settings.use_internal_wiki=Use builtin wiki +settings.wiki_desc=Ota wiki käyttöön +settings.use_internal_wiki=Käytä sisäänrakennettua wikiä +settings.allow_public_wiki_desc=Salli julkinen pääsy wikiin kun repo on yksityinen settings.use_external_wiki=Käytä ulkoista wikiä -settings.external_wiki_url=Ulkoinen Wiki URL -settings.external_wiki_url_desc=Vierailijat uudelleenohjataan URL-osoitteeseen kun he klikkaavat välilehteä. -settings.issues_desc=Enable issue tracker -settings.use_internal_issue_tracker=Use builtin lightweight issue tracker -settings.use_external_issue_tracker=Käytä ulkoista vikaseurantaa -settings.tracker_url_format=Ulkoisen vikaseurannan URL muoto -settings.tracker_issue_style=External Issue Tracker Naming Style: -settings.tracker_issue_style.numeric=Numeric -settings.tracker_issue_style.alphanumeric=Alphanumeric +settings.external_wiki_url=Ulkoisen wikin osoite +settings.external_wiki_url_desc=Vierailijat uudelleenohjataan URL-osoitteeseen kun he napsauttavat välilehteä. +settings.issues_desc=Ota esitystenseuranta käyttöön +settings.use_internal_issue_tracker=Käytä kevyttä, sisäänrakennettua esitystenseurantaa +settings.allow_public_issues_desc=Salli julkinen pääsy esityksiin tietosäilön ollessa yksityinen +settings.use_external_issue_tracker=Käytä ulkoista esitystenseurantaa +settings.external_tracker_url=Ulkoisen virheenseurannan URL +settings.external_tracker_url_desc=Vierailijat ohjataan URL-osoitteeseen kun he napsauttavat välilehteä. +settings.tracker_url_format=Ulkoisen vikaseurannan osoitteen muoto +settings.tracker_issue_style=Ulkoisen esitystenseurannan nimeämistyyli: +settings.tracker_issue_style.numeric=Numeerinen +settings.tracker_issue_style.alphanumeric=Aakkosnumeerinen settings.tracker_url_format_desc=Voit käyttää paikkamerkkiä {user} {repo} {index} käyttäjänimelle, reponimelle ja vikanumerolle. -settings.pulls_desc=Ota käyttöön pull-pyynnöt salliaksesi julkiset koodilahjoitukset +settings.pulls_desc=Ota käyttöön pull-pyynnöt hyväksyäksesi vastaanotettua koodia repojen ja haarojen välillä +settings.pulls.ignore_whitespace=Ohita tyhjämerkkien muutokset +settings.pulls.allow_rebase_merge=Salli sitoutusten sulauttaminen settings.danger_zone=Vaaravyöhyke +settings.cannot_fork_to_same_owner=Et voi haarauttaa tietosäilöä alkuperäiselle omistajalle. 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. @@ -673,9 +782,9 @@ 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.delete_notices_fork_1=- All forks will become independent after deletion. +settings.delete_notices_fork_1=- Kaikki haarautukset muuttuvat itsenäisiksi poiston jälkeen. settings.deletion_success=Repo on poistettu onnistuneesti! -settings.update_settings_success=Repom asetukset on päivitetty onnistuneesti. +settings.update_settings_success=Repon asetukset on päivitetty onnistuneesti. settings.transfer_owner=Uusi omistaja settings.make_transfer=Tee siirto settings.transfer_succeed=Arkiston omistusoikeus on siirretty onnistuneesti. @@ -684,46 +793,62 @@ settings.add_collaborator=Lisää uusi yhteistyökumppani settings.add_collaborator_success=Uusi yhteistyökumppani on lisätty. settings.delete_collaborator=Poista settings.collaborator_deletion=Yhteistyökumppanin poistaminen -settings.collaborator_deletion_desc=Tällä käyttäjällä ei tule enää olemaan yhteistyö pääsyä tähän repoon poistamisen jälkeen. Haluatko jatkaa? +settings.collaborator_deletion_desc=Tällä käyttäjällä ei tule enää olemaan yhteistyöpääsyä tähän repoon poistamisen jälkeen. Haluatko jatkaa? settings.remove_collaborator_success=Yhteistyökumppani on poistettu. 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.hooks_desc=Webkoukut muistuttavat paljon perus HTTP POST -tapahtumalaukaisimia. Aina kun jotain tapahtuu Gogsissa, käsittelemme ilmoituksen määrittäämääsi kohteeseen. Lisätietoja webkoukku-oppaassa. +settings.webhooks.add_new=Lisää uusi webkoukku: +settings.webhooks.choose_a_type=Valitse tyyppi... settings.add_webhook=Lisää webkoukku -settings.hooks_desc=Webkoukut muistuttavat paljon perus HTTP POST tapahtuma laukaisimia. Aina kun jotain tapahtuu Gogsissa, 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.redelivery=Uudelleentoimitus +settings.webhook.redelivery_success=Koukku tehtävä "%s" on lisätty uudelleen toimitusjonoon. Toimitustilan päivittäminen toimitushistoriaan voi kestää muutaman sekunnin. settings.webhook.request=Pyyntö settings.webhook.response=Vastaus settings.webhook.headers=Otsikot settings.webhook.payload=Payload settings.webhook.body=Body +settings.webhook.err_cannot_parse_payload_url=Ei voida jäsentää hyötykuorman URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Tietokuorman URL-osoite ratkaistiin paikallisverkko-osoitteeksi, joka on erityisesti estetty. settings.githooks_desc=Git koukkujen voimanlähteenä on Git itse, voit muokata tuettujen koukkujen tiedostoja allaolevassa luettelossa suorittaaksesi mukautettuja toimintoja. settings.githook_edit_desc=Jos koukku ei ole käytössä, esitellään esimerkkisisältö. Sisällön jättäminen tyhjäksi arvoksi poistaa tämän koukun käytöstä. settings.githook_name=Koukun nimi settings.githook_content=Koukun sisältö settings.update_githook=Päivitys koukku -settings.add_webhook_desc=Gogs 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.add_webhook_desc=Gogs lähettää POST-pyynnön määrittämääsi osoitteeseen, sekä tapahtunutta tapahtumaa koskevat lisätiedot. Voit myös määrittää millaisen tiedostomuodon haluat saada koukun lauettua (JSON, x-www-form-urlencoded, XML, jne). Lisätietoa löytyy koukut-oppaastamme. settings.payload_url=Payload URL settings.content_type=Sisältötyyppi settings.secret=Salaus +settings.secret_desc=Salaisuus lähetetään SHA256 HMAC hex digest payloadina X-Gogs-Signature headerilla. settings.slack_username=Käyttäjätunnus settings.slack_icon_url=Kuvakkeen URL settings.slack_color=Väri settings.event_desc=Milloin pitäisi tämän webkoukun laueta? -settings.event_push_only=Vain push tilanteessa. +settings.event_push_only=Vain push-komennolla. settings.event_send_everything=Tarvitsen kaiken. settings.event_choose=Haluan valita, mitä tarvitsen. settings.event_create=Luo -settings.event_create_desc=Branch, tai tagi luotu -settings.event_pull_request=Pull Request -settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. -settings.event_push=Push -settings.event_push_desc=Git push repoon +settings.event_create_desc=Kehityshaara tai tunniste luotu +settings.event_delete=Poista +settings.event_delete_desc=Kehityshaara tai tunniste poistettu +settings.event_fork=Haarautus +settings.event_fork_desc=Tietosäilö haarautettu +settings.event_push=Työntö +settings.event_push_desc=Git työntö tietosäilöön +settings.event_issues=Esitykset +settings.event_issues_desc=Esitys avattu, suljettu, uudelleenavattu, muokattu, annettu, anto vedottu, leima päivitetty, leima poistettu, merkkipaalutettu, tai merkkipaalutus vedottu. +settings.event_pull_request=Pull-pyyntö +settings.event_pull_request_desc=Vetopyyntö avattu, suljettu, uudelleenavattu, muokattu, annettu, anto vedottu, leima päivitetty, leima poistettu, merkkipaalutettu, merkkipaalutus vedottu, tai synkronoitu. +settings.event_issue_comment=Ongelman kommentti +settings.event_issue_comment_desc=Ongelman kommentti luotu, muokattu, tai poistettu. +settings.event_release=Julkaisu +settings.event_release_desc=Julkaisu julkaistu 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. @@ -732,11 +857,14 @@ settings.update_hook_success=Webkoukku on päivitetty. settings.delete_webhook=Poista webkoukku settings.recent_deliveries=Viimeisimmät toimitukset settings.hook_type=Koukkutyyppi -settings.add_slack_hook_desc=Lisää Slack integraatio repoosi. +settings.add_slack_hook_desc=Lisää Slack-integraatio repoosi. +settings.add_discord_hook_desc=Lisää Discord-integraatio repositoryysi. +settings.add_dingtalk_hook_desc=Lisää Dingtalk-integraatio repositoryysi. settings.slack_token=Pääsymerkki settings.slack_domain=Verkkotunnus settings.slack_channel=Kanava settings.deploy_keys=Deploy avaimet +settings.deploy_keys_helper=Huomautus! Voit lisätä julkiset avaimesi tilisi asetuksissa. settings.add_deploy_key=Lisää deploy avain settings.deploy_key_desc=Deploy avaimilla on vain luku-oikeudet. Ne eivät ole sama asia kuin henkilökohtaiset SSH avaimet. settings.no_deploy_keys=Et ole lisännyt yhtään deploy avainta. @@ -748,10 +876,12 @@ 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! +settings.description_desc=Repon kuvaus. Enintään 512 merkkiä. +settings.description_length=Käytettävissä olevat merkit diff.browse_source=Selaa lähdekoodia diff.parent=vanhempi -diff.commit=commit +diff.commit=sitoutus 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ä @@ -759,22 +889,21 @@ diff.show_unified_view=Yhdistetty näkymä diff.stats_desc=%d muutettua tiedostoa jossa %d lisäystä ja %d poistoa diff.bin=BIN diff.view_file=Näytä tiedosto -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 +diff.file_suppressed=Tiedoston diff-näkymää rajattu, sillä se on liian suuri +diff.too_many_files=Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä release.releases=Julkaisut release.new_release=Uusi julkaisu release.draft=Työversio release.prerelease=Esiversio -release.stable=Vakaa release.edit=muokkaa -release.ahead=%d committia kohteeseen %s version jälkeen +release.ahead=%d sitoutusta kehityshaaraan %s tämän julkaisun 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.tag_name=Tunnisteen nimi release.target=Kohde -release.tag_helper=Valitse olemassaoleva tagi, tai luo uusi tagi julkaistaessa. +release.tag_helper=Valitse olemassa oleva tunniste, tai luo uusi tunniste julkaistaessa. release.title=Otsikko release.content=Sisältö release.write=Kirjoita @@ -788,10 +917,10 @@ 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_desc=Tämän julkaisun poistaminen poistaa vastaavan Git-tunnisteen. 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=Tag name is not valid. +release.tag_name_already_exist=Julkaisu tällä tunniste nimellä on jo olemassa. +release.tag_name_invalid=Tunnisteen nimi ei kelpaa. release.downloads=Lataukset [org] @@ -813,8 +942,8 @@ team_name_helper=Käytät tätä nimeä mainitessasi tämän tiimin keskusteluis 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. +form.name_not_allowed=Organisaation nimi tai malli %q ei ole sallittu. +form.team_name_not_allowed=Tiimin nimi tai malli %q ei ole sallittu. settings=Asetukset settings.options=Valinnaiset @@ -869,7 +998,7 @@ teams.write_permission_desc=Tämä tiimi myöntää kirjoitusoikeuden
ylläpito-oikeuden: jäsenet voivat lukea, pushata, ja lisätä yhteistyökumppaneita tiimin repoihin. teams.repositories=Tiimin repot teams.search_repo_placeholder=Etsi repo... -teams.add_team_repository=Lisää tiimirepo +teams.add_team_repository=Lisää tiimi-repository teams.remove_repo=Poista teams.add_nonexistent_repo=Repo jota yrität lisätä ei ole vielä olemassa, ole hyvä ja luo se ensin. @@ -886,12 +1015,19 @@ first_page=Ensimmäinen last_page=Viimeisin total=Yhteensä: %d +dashboard.build_info=Rakentamistiedot +dashboard.app_ver=Sovellus versio +dashboard.git_version=Git-versio +dashboard.go_version=Go-versio +dashboard.build_time=Rakentamisaika +dashboard.build_commit=Koontisitoutus dashboard.statistic=Statistiikka dashboard.operations=Toiminnot dashboard.system_status=Järjestelmänvalvonnan tila -dashboard.statistic_info=Gogs tietokannassa on %d käyttäjää, %d organisaatiota, %d julkista avainta, %d repoa, %d tarkkailijaa, %d tähteä, %d toimea, %d sisäänkirjautunutta, %d ongelmaa, %d kommenttia, %d sosiaalista tiliä, %d seuraajaa, %d peiliä, %d julkaisua, %d kirjautumis lähdettä, %d webkoukkua, %d merkkipaalua, %d tunnistetta, %d koukku tehtävää, %d tiimiä, %d päivitys tehtävää, %d liitetiedostoa. +dashboard.statistic_info=Gogs-tietokannassa on %d käyttäjää, %d organisaatiota, %d julkista avainta, %d repoa, %d tarkkailijaa, %d tähteä, %d toimea, %d sisäänkirjautunutta, %d ongelmaa, %d kommenttia, %d sosiaalista tiliä, %d seuraajaa, %d peiliä, %d julkaisua, %d kirjautumislähdettä, %d webkoukkua, %d merkkipaalua, %d tunnistetta, %d koukkutehtävää, %d tiimiä, %d päivitystehtävää, %d liitetiedostoa. dashboard.operation_name=Toiminnon nimi dashboard.operation_switch=Vaihda +dashboard.select_operation_to_run=Valitse suoritettava toiminto dashboard.operation_run=Suorita dashboard.clean_unbind_oauth=Puhdista ei-liitetyt OAuthit dashboard.clean_unbind_oauth_success=Kaikki ei-liitetyt OAuthit on poistettu onnistuneesti. @@ -903,10 +1039,10 @@ dashboard.delete_missing_repos=Poista kaikki repo tietueet jotka menettivät Git dashboard.delete_missing_repos_success=Kaikki repo tietueet jotka menettivät Git tiedostoja on poistettu onnistuneesti. dashboard.git_gc_repos=Suorita roskienkeruu repoille dashboard.git_gc_repos_success=Kaikki repot ovat tehneet roskienkeruun onnistuneesti. -dashboard.resync_all_sshkeys=Uudelleenkirjoita '.ssh/authorized_keys' tiedosto (varoitus: ei-Gogs avaimet menetetään) +dashboard.resync_all_sshkeys=Uudelleenkirjoita '.ssh/authorized_keys' -tiedosto (varoitus: ei-Gogs-avaimet menetetään) dashboard.resync_all_sshkeys_success=Kaikki julkiset avaimet on uudelleenkirjoitettu onnistuneesti. -dashboard.resync_all_update_hooks=Uudelleenkirjoita kaikki päivityskoukut repoista (tarvitaan mukautetun asetuspolun muuttuessa) -dashboard.resync_all_update_hooks_success=Kaikki repojen päivityskoukut on uudelleenkirjoitettu onnistuneesti. +dashboard.resync_all_hooks=Uudelleensynkronoi kaikkien repositoryjen "pre-receive, update ja post-receive" hookit. +dashboard.resync_all_hooks_success=Kaikkien repositoryjen "pre-receive, update ja post-receive" hookit synkronoitu. dashboard.reinit_missing_repos=Resetoi kaikki repo tietueet jotka menettivät Git tiedostoja dashboard.reinit_missing_repos_success=Kaikki repo tietueet jotka menettivät Git tiedostoja on resetoitu onnistuneesti. @@ -959,7 +1095,7 @@ users.edit_account=Muokkaa tiliä users.max_repo_creation=Maksimi repojen määrä jonka voi luoda users.max_repo_creation_desc=(Aseta -1 käyttääksesi globaalia oletusrajaa) users.is_activated=Tämä tili on aktivoitu -users.prohibit_login=This account is prohibited to login +users.prohibit_login=Tämän käyttäjätilin sisäänkirjautuminen on estetty users.is_admin=Tällä tilillä on ylläpito-oikeudet users.allow_git_hook=Tällä tilillä on oikeudet luoda Git koukkuja users.allow_import_local=Tällä tilillä on oikeudet tuoda paikallisia repoja @@ -981,20 +1117,23 @@ repos.private=Yksityinen repos.watches=Tarkkailijat repos.stars=Äänet repos.issues=Ongelmat +repos.size=Koko -auths.auth_manage_panel=Todennus hallintapaneeli +auths.auth_sources=Todennuslähteet auths.new=Lisää uusi lähde auths.name=Nimi auths.type=Tyyppi auths.enabled=Käytössä +auths.default=Oletus auths.updated=Päivitetty auths.auth_type=Todennustyyppi auths.auth_name=Todennusnimi -auths.security_protocol=Security Protocol +auths.security_protocol=Suojausprotokolla auths.domain=Verkkotunnus auths.host=Isäntä auths.port=Portti auths.bind_dn=Liitä DN +auths.bind_dn_helper=Voit käyttää '%s' käyttäjänimen paikkamerkkinä, esim. DOM\%s auths.bind_password=Liitä salasana auths.bind_password_helper=Varoitus: Tämä salasana tallennetaan tavallisena tekstinä. Älä käytä korkeasti etuoikeutetulla tilillä. auths.user_base=Käyttäjä hakuperuste @@ -1004,6 +1143,11 @@ auths.attribute_username_placeholder=Jätä tyhjäksi käyttääksesi kirjautumi auths.attribute_name=Etunimen määrite auths.attribute_surname=Sukunimen määrite auths.attribute_mail=Sähköposti määrite +auths.verify_group_membership=Varmista ryhmäjäsenyys +auths.group_search_base_dn=Ryhmähaun perusosoite DN +auths.group_filter=Ryhmäsuodatus +auths.group_attribute_contain_user_list=Ryhmän määrite joka sisältää listan käyttäjistä +auths.user_attribute_listed_in_group=Käyttäjän määrite listattuna ryhmässä auths.attributes_in_bind=Nouda määritteet liitä DN sisällöstä auths.filter=Käyttäjäsuodatin auths.admin_filter=Ylläpitosuodatin @@ -1017,9 +1161,9 @@ auths.enable_tls=Ota käyttöön TLS-salaus auths.skip_tls_verify=Ohita TLS tarkistaminen auths.pam_service_name=PAM palvelun nimi auths.enable_auto_register=Ota käyttöön automaattinen rekisteröinti -auths.tips=Vinkit auths.edit=Muokkaa todennusasetusta auths.activated=Tämä todennus on aktivoitu +auths.default_auth=Tämä todennus on oletuskirjautumislähde auths.new_success=Uusi todennus '%s' on luotu onnistuneesti. auths.update_success=Todennusasetus on päivitetty onnistuneesti. auths.update=Päivitä todennusasetus @@ -1028,107 +1172,189 @@ auths.delete_auth_title=Todennuksen poistaminen auths.delete_auth_desc=Tämä todennus poistetaan, haluatko jatkaa? auths.still_in_used=Tämä todennus on yhä joidenkin käyttäjien käytössä, ole hyvä ja poista tai muunna nämä käyttäjät toiselle kirjaututumistyypille ensin. auths.deletion_success=Todennus on poistettu onnistuneesti! +auths.login_source_exist=Kirjautumislähde '%s' on jo olemassa +auths.github_api_endpoint=API päätepiste -config.server_config=Palvelin asetukset -config.app_name=Sovellus nimi -config.app_ver=Sovellus versio -config.app_url=Sovellus URL -config.domain=Verkkotunnus -config.offline_mode=Offline-tila -config.disable_router_log=Poista käytöstä reitittimen loki +config.not_set=(ei ole asetettu) +config.server_config=Palvelinasetukset +config.brand_name=Tuotemerkin nimi config.run_user=Suorita käyttäjänä config.run_mode=Suoritustila -config.repo_root_path=Repon juuren polku -config.static_file_root_path=Staattisen tiedoston juuren polku -config.log_file_root_path=Lokitiedoston juuren polku -config.script_type=Komentosarjan tyyppi -config.reverse_auth_user=Käänteinen todennus käyttäjä +config.server.external_url=Ulkoinen osoite +config.server.domain=Verkkotunnus +config.server.protocol=Protokolla +config.server.http_addr=HTTP-osoite +config.server.http_port=HTTP-portti +config.server.cert_file=Varmennetiedosto +config.server.key_file=Avaintiedosto +config.server.tls_min_version=Minimi TLS versio +config.server.unix_socket_permission=Unix socketin käyttöoikeus +config.server.local_root_url=Paikallinen ROOT-URL +config.server.offline_mode=Yhteydetön tila +config.server.disable_router_log=Poista käytöstä URL-reitittimen loki +config.server.enable_gzip=Ota käyttöön Gzip +config.server.app_data_path=Sovelluksen tietojen polku +config.server.load_assets_from_disk=Lataa resurssit levyltä +config.server.landing_url=Laskeutumis URL config.ssh_config=SSH asetukset -config.ssh_enabled=Käytössä -config.ssh_start_builtin_server=Käynnistä sisäänrakennettu palvelin -config.ssh_domain=Verkkotunnus -config.ssh_port=Portti -config.ssh_listen_port=Kuuntele porttia -config.ssh_root_path=Juuren polku -config.ssh_key_test_path=Polku jossa avaimet testataan -config.ssh_keygen_path=Keygen ('ssh-keygen') polku -config.ssh_minimum_key_size_check=Avaimen vähimmäiskoko tarkistus -config.ssh_minimum_key_sizes=Avaimen vähimmäiskoot +config.ssh.enabled=Käytössä +config.ssh.domain=Paljastettu verkkotunnus +config.ssh.port=Paljastettu portti +config.ssh.root_path=Juuripolku +config.ssh.keygen_path=Avaingeneraattorin polku +config.ssh.key_test_path=Polku jossa avaimet testataan +config.ssh.minimum_key_size_check=Avaimen vähimmäiskoko tarkistus +config.ssh.minimum_key_sizes=Avaimen vähimmäiskoot +config.ssh.rewrite_authorized_keys_at_start=Uudelleenkirjoita "authorized_keys" alussa +config.ssh.start_builtin_server=Käynnistä sisäänrakennettu palvelin +config.ssh.listen_host=Kuuntele porttia +config.ssh.listen_port=Kuuntele porttia +config.ssh.server_ciphers=Palvelimen cipherit +config.ssh.server_macs=Serverin MAC-osoite +config.ssh.server_algorithms=Palvelinalgoritmit + +config.repo_config=Repositoryn asetukset +config.repo.root_path=Juuripolku +config.repo.script_type=Komentosarjan tyyppi +config.repo.ansi_chatset=ANSI merkkisetti +config.repo.force_private=Pakota yksityiseksi +config.repo.max_creation_limit=Enimmäis-luontiraja +config.repo.preferred_licenses=Ensisijaiset lisenssit +config.repo.disable_http_git=Poista käytöstä HTTP Git +config.repo.enable_local_path_migration=Ota käyttöön paikallisen polun migraatio +config.repo.enable_raw_file_render_mode=Ota käyttöön raakatiedoston renderöinti tila +config.repo.commits_fetch_concurrency=Sitoutus noudon samanaikaisuus +config.repo.editor.line_wrap_extensions=Muokkaimen rivityksen laajennukset +config.repo.editor.previewable_file_modes=Muokkaimen tiedostomuodot joita voi esikatsella +config.repo.upload.enabled=Tiedoston liittäminen käytössä +config.repo.upload.temp_path=Tiedoston liittämisen väliaikainen polku +config.repo.upload.allowed_types=Liitä sallitut tyypit +config.repo.upload.file_max_size=Liitettyjen tiedostojen kokoraja +config.repo.upload.max_files=Liitettyjen tiedostojen määrän raja config.db_config=Tietokannan asetukset -config.db_type=Tyyppi -config.db_host=Isäntä -config.db_name=Nimi -config.db_user=Käyttäjä -config.db_ssl_mode=SSL tila -config.db_ssl_mode_helper=(vain "postgres") -config.db_path=Polku -config.db_path_helper=("sqlite3" ja "tidb") - -config.service_config=Palvelu asetukset -config.register_email_confirm=Vaadi sähköpostivahvistus -config.disable_register=Poista käytöstä rekisteröinti -config.show_registration_button=Näytä rekisteröidy painike -config.require_sign_in_view=Vaadi sisäänkirjautuminen nähdäksesi -config.mail_notify=Sähköposti ilmoitukset -config.disable_key_size_check=Poista käytöstä avaimen vähimmäiskoko tarkistus -config.enable_captcha=Ota käyttöön Captcha -config.active_code_lives=Aktiivinen koodi elämät ennen vanhenemista -config.reset_password_code_lives=Nollaa salasana koodi elämät +config.db.type=Tyyppi +config.db.host=Isäntä +config.db.name=Nimi +config.db.schema=Skeema +config.db.schema_helper=(koskee vain "postgresia") +config.db.user=Käyttäjä +config.db.ssl_mode=SSL-tila +config.db.ssl_mode_helper=(vain "postgres") +config.db.path=Polku +config.db.path_helper=(vain "sqlite3") +config.db.max_open_conns=Avointen yhteyksien enimmäismäärä +config.db.max_idle_conns=Avointen joutokäyntiyhteyksien enimmäismäärä + +config.security_config=Turvallisuuden asetukset +config.security.login_remember_days=Muista kirjautuminen päiviä +config.security.cookie_remember_name=Muista eväste +config.security.cookie_username=Käyttäjänimi eväste +config.security.cookie_secure=Ota käyttöön turvallinen eväste +config.security.reverse_proxy_auth_user=Käänteinen välityspalvelimen todennusotsikko +config.security.enable_login_status_cookie=Ota käyttöön kirjautumisen tilaeväste +config.security.login_status_cookie_name=Kirjautumisen tila eväste +config.security.local_network_allowlist=Paikallisverkkopääsylista + +config.email_config=Sähköpostiasetukset +config.email.enabled=Käytössä +config.email.subject_prefix=Aiheen etuliite +config.email.host=Isäntä +config.email.from=Lähettäjä +config.email.user=Käyttäjä +config.email.disable_helo=Poista käytöstä HELO +config.email.helo_hostname=HELO isäntänimi +config.email.skip_verify=Ohita varmenteen tarkistaminen +config.email.use_certificate=Käytä mukautettua varmennetta +config.email.cert_file=Varmennetiedosto +config.email.key_file=Avaintiedosto +config.email.use_plain_text=Käytä pelkkää tekstiä +config.email.add_plain_text_alt=Lisää pelkän tekstin vaihtoehto +config.email.send_test_mail=Lähetä testisähköposti +config.email.test_mail_failed=Testisähköpostin lähettäminen vastaanottajalle '%s' epäonnistui: %v +config.email.test_mail_sent=Testi sähköposti on lähetetty vastaanottajalle '%s'. + +config.auth_config=Todennuksen asetukset +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Aktiivinen koodi elämät ennen vanhenemista +config.auth.reset_password_code_lives=Nollaa salasana koodi elämät +config.auth.require_email_confirm=Vaadi sähköpostivahvistus +config.auth.require_sign_in_view=Vaadi sisäänkirjautuminen nähdäksesi +config.auth.disable_registration=Poista käytöstä rekisteröinti +config.auth.enable_registration_captcha=Ota rekisteröityminen captcha käyttöön +config.auth.enable_reverse_proxy_authentication=Ota käyttöön käänteinen välityspalvelimen todennus +config.auth.enable_reverse_proxy_auto_registration=Ota käyttöön käänteinen välityspalvelimen automaattinen rekisteröinti +config.auth.reverse_proxy_authentication_header=Käänteinen välityspalvelimen todennusotsikko + +config.user_config=Käyttäjän asetukset +config.user.enable_email_notify=Ota käyttöön sähköposti ilmoitukset -config.webhook_config=Webkoukku asetukset -config.queue_length=Jonon pituus -config.deliver_timeout=Toimitus aikakatkaisu -config.skip_tls_verify=Ohita TLS tarkistaminen - -config.mailer_config=Sähköpostipalvelin asetukset -config.mailer_enabled=Käytössä -config.mailer_disable_helo=Poista käytöstä HELO -config.mailer_name=Nimi -config.mailer_host=Isäntä -config.mailer_user=Käyttäjä -config.send_test_mail=Lähetä testi sähköposti -config.test_mail_failed=Testi sähköpostin lähettäminen vastaanottajalle '%s': %v epäonnistui -config.test_mail_sent=Testi sähköposti on lähetetty vastaanottajalle '%s'. - -config.oauth_config=OAuth asetukset -config.oauth_enabled=Käytössä +config.session_config=Istunnon asetukset +config.session.provider=Tarjoaja +config.session.provider_config=Tarjoajan asetukset +config.session.cookie_name=Eväste +config.session.https_only=Vain HTTPS +config.session.gc_interval=Roskienkeruun väli +config.session.max_life_time=Maksimi elinaika +config.session.csrf_cookie_name=CSRF-eväste config.cache_config=Välimuistin asetukset -config.cache_adapter=Välimuistin sovitin -config.cache_interval=Välimuistin aikaväli -config.cache_conn=Välimuistin yhteys merkkijono - -config.session_config=Istunnon asetukset -config.session_provider=Istunnon toimittaja -config.provider_config=Toimittajan asetukset -config.cookie_name=Evästenimi -config.enable_set_cookie=Ota käyttöön aseta eväste -config.gc_interval_time=GC aikaväli aika -config.session_life_time=Istunnon elinikä -config.https_only=Vain HTTPS -config.cookie_life_time=Evästeen elinikä +config.cache.adapter=Adapteri +config.cache.interval=Roskienkeruun väli +config.cache.host=Isäntä + +config.http_config=HTTP-asetukset +config.http.access_control_allow_origin=Käyttöoikeuden valvonta salli alkuperä + +config.attachment_config=Liitteen asetukset +config.attachment.enabled=Käytössä +config.attachment.path=Polku +config.attachment.allowed_types=Sallitut tyypit +config.attachment.max_size=Kokoraja +config.attachment.max_files=Tiedostojen määrän raja + +config.release_config=Julkaisu asetukset +config.release.attachment.enabled=Liite käytössä +config.release.attachment.allowed_types=Liitteen sallitut tyypit +config.release.attachment.max_size=Liitteen kokoraja +config.release.attachment.max_files=Liitteiden määrän raja config.picture_config=Kuva asetukset -config.picture_service=Kuva palvelu -config.disable_gravatar=Poista käytöstä Gravatar -config.enable_federated_avatar=Enable Federated Avatars - -config.git_config=Git Configuration -config.git_disable_diff_highlight=Disable Diff Syntax Highlight -config.git_max_diff_lines=Max Diff Lines (for a single file) -config.git_max_diff_line_characters=Max Diff Characters (for a single line) -config.git_max_diff_files=Max Diff Files (to be shown) -config.git_gc_args=GC Arguments -config.git_migrate_timeout=Migration Timeout -config.git_mirror_timeout=Mirror Update Timeout -config.git_clone_timeout=Clone Operation Timeout -config.git_pull_timeout=Pull Operation Timeout -config.git_gc_timeout=GC Operation Timeout +config.picture.avatar_upload_path=Käyttäjän profiilikuvan tiedoston liittämisen polku +config.picture.repo_avatar_upload_path=Repon profiilikuvan tiedoston liittämisen polku +config.picture.gravatar_source=Gravatar-lähde +config.picture.disable_gravatar=Poista Gravatar käytöstä +config.picture.enable_federated_avatar=Ota käyttöön ulkopuoliset profiilikuvat + +config.mirror_config=Peilauksen asetukset +config.mirror.default_interval=Oletus aikaväli + +config.webhook_config=Webkoukku asetukset +config.webhook.types=Tyypit +config.webhook.deliver_timeout=Toimitus aikakatkaisu +config.webhook.skip_tls_verify=Ohita TLS tarkistaminen + +config.git_config=Git asetukset +config.git.disable_diff_highlight=Poista koodinväritys käytöstä diff-näkymässä +config.git.max_diff_lines=Vertaa rivien rajaa (yhden tiedoston osalta) +config.git.max_diff_line_characters=Vertaa merkkien rajaa (yhden tiedoston osalta) +config.git.max_diff_files=Vertaa tiedostojen rajaa (yhden diffin osalta) +config.git.gc_args=Roskienkeruun parametrit +config.git.migrate_timeout=Migraation aikakatkaisu +config.git.mirror_timeout=Peilauksen haun aikakatkaisu +config.git.clone_timeout=Kloonauksen aikakatkaisu +config.git.pull_timeout=Pull aikakatkaisu +config.git.gc_timeout=Roskienkeruun aikakatkaisu + +config.lfs_config=LFS asetukset +config.lfs.storage=Tallennustila +config.lfs.objects_path=Objektien polku config.log_config=Loki asetukset -config.log_mode=Loki tila +config.log_file_root_path=Lokitiedoston juuren polku +config.log_mode=Tila +config.log_options=Valinnaiset monitor.cron=Cron tehtävät monitor.name=Nimi @@ -1158,18 +1384,25 @@ notices.delete_success=Järjestelmän ilmoitukset on poistettu onnistuneesti. [action] create_repo=luotu repo %s rename_repo=uudelleennimetty repo %[1]s nimelle %[3]s -commit_repo=pushattu kohteeseen %[3]s paikassa %[4]s -create_issue=`avasi ongelman %s#%[2]s` -close_issue=`sulki ongelman %s#%[2]s` -reopen_issue=`avasi uudelleen ongelman %s#%[2]s` +commit_repo=työnnetty kehityshaara %[3]s paikassa %[4]s +compare_commits=Näytä vertailu näille %d sitoutuksille +transfer_repo=siirretty repo %s kohteeseen %s +create_issue=`loi esityksen %s#%[2]s` +close_issue=`käsitteli esityksen %s#%[2]s` +reopen_issue=`uudelleenavasi esityksen %s#%[2]s` +comment_issue=`kommentoi esitystä %s#%[2]s` create_pull_request=`luotu pull-pyyntö %s#%[2]s` close_pull_request=`sulki pull-pyynnön %s#%[2]s` reopen_pull_request=`avasi uudelleen pull-pyynnön %s#%[2]s` -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 +merge_pull_request=`yhdistetty vetopyyntö %s#%[2]s` +create_branch=luotu uusi haara %[3]s kohteeseen %[4]s +delete_branch=poistettu haara %[2]s kohteesta %[3]s +push_tag=työnnettiin tunniste %[2]s kohteeseen %[3]s +delete_tag=poistettiin tunniste %[2]s kohteesta %[3]s +fork_repo=haarautettiin tietosäilö kohteeseen %s +mirror_sync_push=synkronoitiin sitoutukset kohteeseen %[3]s paikassa %[4]s peilauksesta +mirror_sync_create=synkattu uusi viite %[2]s kohteeseen %[3]s peilistä +mirror_sync_delete=synkattu ja poistettu viite %[2]s paikassa %[3]s peilistä [tool] ago=sitten @@ -1191,9 +1424,10 @@ months=%d kuukautta %s years=%d vuotta %s raw_seconds=sekuntia raw_minutes=minuuttia +raw_hours=tuntia [dropzone] -default_message=Pudota tiedostot tähän tai klikkaa lataamista varten. +default_message=Pudota tiedostot tähän tai napsauta 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 diff --git a/conf/locale/locale_fr-FR.ini b/conf/locale/locale_fr-FR.ini index 89901dd93fc..98426d54f83 100644 --- a/conf/locale/locale_fr-FR.ini +++ b/conf/locale/locale_fr-FR.ini @@ -1,4 +1,4 @@ -app_desc=Un service Git auto-hébergé sans prise de tête +app_desc=Un service Git auto-hébergé et indolore. home=Accueil dashboard=Tableau de bord @@ -9,7 +9,6 @@ sign_out=Déconnexion sign_up=Inscription register=S'inscrire website=Site web -version=Version page=Page template=Modèle language=Langue @@ -29,7 +28,7 @@ mirror=Miroir new_repo=Nouveau dépôt new_migrate=Nouvelle migration new_mirror=Nouveau miroir -new_fork=Nouveau fork +new_fork=Nouveau dépôt séparé new_org=Nouvelle organisation manage_org=Gérer les organisations admin_panel=Administration @@ -39,48 +38,57 @@ your_profile=Votre profil your_settings=Vos paramètres activities=Activités -pull_requests=Pull Requests +pull_requests=Demandes d'admission issues=Tickets cancel=Annuler +[status] +page_not_found=Page non trouvée +internal_server_error=Erreur interne du serveur + [install] install=Installation title=Instructions pour la première exécution -docker_helper=Si vous exécutez Gogs grâce à Docker, merci de lire la procédure attentivement avant de modifier quoi que ce soit sur cette page ! -requite_db_desc=Gogs requiert MySQL, PostgreSQL, SQLite3 ou TiDB. +docker_helper=Si vous exécutez Gogs au sein de Docker, lisez la procédure attentivement avant toute altération de cette page ! +requite_db_desc=Gogs exige MySQL, PostgreSQL, SQLite3 or TiDB (via le protocole MySQL) db_title=Paramètres de la base de données db_type=Type de base de données host=Hôte user=Utilisateur password=Mot de passe db_name=Nom de base de données -db_helper=Veuillez utiliser le moteur INNODB avec le jeu de caractères utf8_general_ci pour MySQL. +db_schema=Schéma +db_helper=Employez le moteur INNODB pour MySQL avec l'encodage utf8_general_ci. ssl_mode=Mode SSL path=Emplacement -sqlite_helper=Le chemin du fichier de base de données SQLite3 ou TiDB.
Utilisez un chemin absolu lorsque vous démarrez en tant que service. -err_empty_db_path=Le chemin de la base de données SQLite3 ou TiDB ne peut être vide. -err_invalid_tidb_name=Le nom de la base de données TiDB ne peut contenir les caractères "." ou "-". +sqlite_helper=Le chemin du fichier de base de données SQLite3.
Utilisez un chemin absolu lorsque vous démarrez en tant que service. +err_empty_db_path=Le chemin de la base de données SQLite3 ne peut être vide. 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 Gogs +general_title=Réglages Généraux d'Application app_name=Nom de l'application app_name_helper=Inscrivez fièrement le nom de votre organisation ici ! -repo_path=Emplacement racine des dépôts +repo_path=Chemin Racine des Dépôts repo_path_helper=Tous les dépôts Git distants seront sauvegardés ici. -run_user=Utilisateur système -run_user_helper=L'utilisateur doit avoir accès à la racine des dépôts et exécuter Gogs. +run_user=Utilisateur +run_user_helper=L'utilisateur doit avoir accès à la Racine des Dépôts et exécuter Gogs. domain=Domaine domain_helper=Cela affecte les doublons d'URL SSH. ssh_port=Port SSH ssh_port_helper=Numéro de port utilisé par votre serveur SSH, le laisser vide pour désactiver la fonctionnalité. +use_builtin_ssh_server=Utiliser le serveur SSH incorporé +use_builtin_ssh_server_popup=Démarrer le serveur SSH incorporé pour les opérations Git afin de le distinguer du démon SSH système. http_port=Port HTTP http_port_helper=Numéro de port que l'application écoutera. app_url=URL de l'application app_url_helper=Cela affecte les doublons d'URL HTTP/HTTPS et le contenu d'e-mail. log_root_path=Chemin des fichiers log log_root_path_helper=Répertoire d'écriture des fichiers de log. +enable_console_mode=Activer le mode Console +enable_console_mode_popup=En plus du mode fichier, également imprimer des journaux à la console. +default_branch=Branchepar défaut optional_title=Paramètres facultatifs email_title=Paramètres du service de messagerie @@ -116,7 +124,10 @@ sqlite3_not_available=Votre version publiée ne prend pas en charge SQLite3. Veu invalid_db_setting=Paramètres de base de données incorrects : %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 +smtp_host_missing_port=Le numéro de port est manquant dans l'adresse de l'Hôte SMTP. +invalid_smtp_from=Le champ SMTP Provenant de n'est pas valide: %v save_config_failed=La sauvegarde de la configuration a échoué : %v +init_failed=L'initialisation de l'application a échoué. invalid_admin_setting=Paramètres du compte administrateur invalides : %v install_success=Bienvenue ! Nous sommes heureux que vous ayez choisi Gogs, amusez-vous et prenez soin de vous. invalid_log_root_path=L'emplacement racine des fichiers logs est invalide : %v @@ -137,6 +148,7 @@ issues.in_your_repos=Dans vos dépôts [explore] repos=Dépôts users=Utilisateurs +organizations=Organisations search=Rechercher [auth] @@ -144,7 +156,9 @@ create_new_account=Créer un nouveau compte register_hepler_msg=Déjà enregistré ? Connectez-vous ! social_register_hepler_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. +disable_register_mail=Désolé, la confirmation par courriel des enregistrements a été désactivée. +auth_source=Sources d'authentification +local=Locale remember_me=Se souvenir de moi forgot_password=Mot de passe oublié forget_password=Mot de passe oublié ? @@ -152,11 +166,10 @@ 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. +prohibit_login_desc=La connexion avec ce compte est interdite ; contactez l'administrateur du site. resent_limit_prompt=Désolé, vos tentatives d'activation sont trop fréquentes. 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é. @@ -164,6 +177,14 @@ reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe password_too_short=Le mot de passe doit contenir 6 caractères minimum. non_local_account=Les comptes non locaux ne peuvent pas changer leur mot de passe via Gogs. +login_two_factor=Authentification en deux étapes +login_two_factor_passcode=Mot de passe d'authentification +login_two_factor_enter_recovery_code=Entrez un code de récupération en deux étapes +login_two_factor_recovery=Récupération en deux étapes +login_two_factor_recovery_code=Code de récupération +login_two_factor_enter_passcode=Entrez un code d'authentification en deux étapes +login_two_factor_invalid_recovery_code=Code de récupération a été utilisé ou n'est pas valide. + [mail] activate_account=Veuillez activer votre compte activate_email=Veuillez vérifier votre adresse e-mail @@ -199,6 +220,7 @@ 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.` +alpha_dash_dot_slash_error=doit contenir uniquement des caractères alphanumériques, des tirets (-), des points (.) ou des slash (/) size_error=` doit être à la taille de %s.` min_size_error=` %s caractères minimum ` max_size_error=` %s caractères maximum ` @@ -215,6 +237,7 @@ org_name_been_taken=Nom d'organisation déjà pris. team_name_been_taken=Nom d'équipe déjà pris. email_been_used=Adresse e-mail déjà utilisée. username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect. +auth_source_mismatch=La source d’authentification sélectionnée n’est pas associée à l’utilisateur. 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. @@ -242,19 +265,18 @@ following=Abonnements follow=Suivre unfollow=Ne plus suivre -form.name_reserved=Le nom '%s' est réservé. -form.name_pattern_not_allowed=Motif '%s' interdit pour les noms d'utilisateur. +form.name_not_allowed=Le nom de l'utilisateur ou le schéma n'est pas autorisé [settings] profile=Profil password=Mot de Passe avatar=Avatar ssh_keys=Clés SSH -social=Réseaux Sociaux -applications=Applications +security=Sécurité +repos=Dépôts orgs=Organisations +applications=Applications delete=Supprimer le compte -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. @@ -295,6 +317,7 @@ 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_success=L'adresse e-mail a été supprimée avec succès ! +email_deletion_primary=Impossible de supprimer l'adresse de courrier principale 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. @@ -320,22 +343,54 @@ 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 -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é. +two_factor=Authentification en deux étapes +two_factor_status=État : +two_factor_on=Activé +two_factor_off=Désactivé +two_factor_enable=Activer +two_factor_disable=Désactiver +two_factor_view_recovery_codes=Voir et sauvegarder vos codes de récupération dans un endroit sécurisé. Vois pouvez les utiliser comme mot de passe si vous perdez l'accès à l'application d'authentification. +two_factor_http=Vous ne pouvez plus utiliser un nom d'utilisateur et mot de passe en clair pour les opérations en HTTP/HTTPS. Merci de créer et d'utiliser un jeton d'accès personnel comme moyen d'identification, par exemple %[3]s. +two_factor_enable_title=Activer l'authentification en deux étapes +two_factor_scan_qr=Veuillez utiliser votre application d'authentification pour numériser l'image : +two_factor_or_enter_secret=Ou entrez la phrase secrète : +two_factor_then_enter_passcode=Puis entrez le mot de passe : +two_factor_verify=Vérifier +two_factor_invalid_passcode=Le mot de passe que vous avez entré n'est pas valide, veuillez réessayer. +two_factor_reused_passcode=Le mot de passe que vous avez entré a déjà été utilisé, veuillez en essayez un autre ! +two_factor_enable_error=L'activation de l'authentification en deux étapes a échoué : %v +two_factor_enable_success=L'authentification en deux étapes a été bien été activée pour votre compte. +two_factor_recovery_codes_title=Codes de secours pour l'authentification en deux étapes +two_factor_recovery_codes_desc=Les codes de récupération sont utilisés quand vous perdez temporairement l'accès à votre application d'authentification. Chaque code de récupération ne peut être utilisé qu'une fois, merci de les garder dans un endroit sécurisé. +two_factor_regenerate_recovery_codes=Regénérer les codes de récupération +two_factor_regenerate_recovery_codes_error=La regénération des codes de récupération a échouée : %v +two_factor_regenerate_recovery_codes_success=Les nouveaux codes de récupération ont été générés avec succès ! +two_factor_disable_title=Désactiver l'authentification à deux facteurs +two_factor_disable_desc=Le niveau de sécurité de votre compte va baisser après avoir désactiver l'authentification à deux facteurs. Voulez-vous continuer ? +two_factor_disable_success=L'authentification à deux facteurs a été désactivée avec succès ! 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 Gogs. +access_token_tips=Le jeton d'accès personnel est employé soit comme nom d'utilisateur soit comme mot de passe. L'emploi du « x-access-token » comme nom d'utilisateur et le jeton d'accès personnel comme mot de passe est recommandé pour les applications Git 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=Suppression du jeton d'accès personnel 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. +delete_token_success=Le jeton d'accès a été supprimé avec succès ! N'oubliez pas de mettre à jour vos applications. +token_name_exists=Un jeton avec le même nom existe déjà. + +orgs.none=Vous n'êtes membre d'aucune organisation. +orgs.leave_title=Quitter une organisation +orgs.leave_desc=Vous perdrez accès à tous les dépôts et équipes après que vous ayez quitté l'organisation. Voulez-vous continuer ? + +repos.leave=Quitter +repos.leave_title=Quitter le dépôt +repos.leave_desc=Vous perdrez l'accès à ce dépôt après l'avoir quitté. Voulez-vous continuer ? +repos.leave_success=Vous avez quitté le dépôt '%s' avec succès ! delete_account=Supprimer votre compte delete_prompt=Votre compte sera définitivement supprimé et cette opération est irréversible ! @@ -348,9 +403,11 @@ 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é +unlisted=Non répertorié visiblity_helper=Ce dépôt est privé +unlisted_helper=Ce dépôt n'est pas répertorié 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 changements de cette valeur affecteront tous les forks) clone_helper=Besoin d'aide pour dupliquer ? Visitez l'aide ! fork_repo=Créer un fork du dépôt fork_from=Fork de @@ -374,31 +431,33 @@ mirror_last_synced=Dernière synchronisation watchers=Observateurs stargazers=Stargazers forks=Forks +repo_description_helper=Description du dépôt. 512 caractères maximum. +repo_description_length=Caractères disponibles 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_not_allowed=Le nom de l'utilisateur ou le schéma n'est pas autorisé -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 migrate.clone_address=Adresse du clone -migrate.clone_address_desc=Cela peut être une URL HTTP/HTTPS/GIT ou un chemin d'accès local. +migrate.clone_address_desc=Cela peut être une URL HTTP/HTTPS/GIT. +migrate.clone_address_desc_import_local=Vous êtes aussi autorisé à migrer un dépôt via un chemin local du serveur. migrate.permission_denied=Vous n'êtes pas autorisé à importer des dépôts locaux. migrate.invalid_local_path=Chemin local non valide, non existant ou n'étant pas un dossier. +migrate.clone_address_resolved_to_blocked_local_address=L'adresse de clonage correspond à une adresse réseau locale, qui est bloquée implicitement. migrate.failed=Echec de migration: %v mirror_from=miroir de forked_from=forké depuis -fork_from_self=Vous ne pouvez pas forker un dépôt que vous possédez déja ! copy_link=Copier -copy_link_success=Copié! +copy_link_success=Copié ! copy_link_error=Appuyez sur ⌘-C ou Ctrl-C pour copier copied=Copié unwatch=Ne plus suivre watch=Suivre -unstar=Retirer le vote +unstar=Retirer des favoris star=Voter fork=Fork @@ -407,9 +466,9 @@ 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 ! +bare_message=Ce dépôt n'a pas de contenu pour l'instant. -code=Code +files=Fichiers branch=Branche tree=Aborescence filter_branch_and_tag=Filtrer une branche ou un tag @@ -417,15 +476,26 @@ branches=Branches tags=Tags issues=Tickets pulls=Pull Requests -labels=Etiquettes +labels=Étiquettes milestones=Jalons commits=Commits +git_branches=Branches releases=Publications file_raw=Raw file_history=Historique file_view_raw=Voir le Raw file_permalink=Lien permanent -file_too_large=Ce fichier est trop gros pour être afficher +file_too_large=Ce fichier est trop gros pour être affiché +video_not_supported_in_browser=Votre navigateur ne supporte pas la balise video HTML5. + +branches.overview=Résumé +branches.active_branches=Branches Actives +branches.stale_branches=Branches stagnantes +branches.all=Toutes les Branches +branches.updated_by=Mise à jour %[1]s par %[2]s +branches.change_default_branch=Changer la Branche par Défaut +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Nouveau fichier editor.upload_file=Téléverser un fichier @@ -443,10 +513,10 @@ editor.filename_help=Pour ajouter un répertoire, il suffit de le taper puis d'a editor.or=ou editor.cancel_lower=annuler editor.commit_changes=Commit les modifications -editor.add_tmpl=Ajouter '%s/' -editor.add=Ajouter '%s' -editor.update=Mettre à jour '%s' -editor.delete=Supprimer '%s' +editor.add_tmpl=Ajout de '%s/' +editor.add=Ajout de '%s' +editor.update=Mise à jour de '%s' +editor.delete=Suppression de '%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 pull request. @@ -454,17 +524,20 @@ 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. editor.branch_already_exists=La branche '%s' existe déjà dans ce dépôt. -editor.directory_is_a_file=L'entrée '%s' dans le chemin d’accès parent est un fichier pas un répertoire dans ce dépôt. +editor.directory_is_a_file=L'entrée '%s' dans le chemin d'accès parent est un fichier, pas un répertoire dans ce dépôt. +editor.file_is_a_symlink=Le fichier « %s » est un lien symbolique qui ne peut être modifié depuis 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 +editor.fail_to_update_file=Échec lors de la mise à jour/création du fichier '%s' avec l'erreur : %v +editor.fail_to_delete_file=Impossible de supprimer le fichier «%s» avec l’erreur : %v editor.add_subdir=Ajouter un sous-répertoire... -editor.unable_to_upload_files=Échec lors de l'envoie du fichier '%s' avec l’erreur : %v +editor.unable_to_upload_files=Échec lors de l'envoie du fichier '%s' avec l'erreur : %v editor.upload_files_to_dir=Transférer les fichiers vers '%s' +commits.commit_history=Historique des commits commits.commits=Commits commits.search=Rechercher des commits commits.find=Trouver @@ -475,7 +548,7 @@ 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 @@ -530,7 +603,7 @@ issues.close_comment_issue=Commenter et fermer issues.reopen_issue=Réouvrir issues.reopen_comment_issue=Commenter et réouvrir issues.create_comment=Créer un commentaire -issues.closed_at=`fermé à %[2]s"` +issues.closed_at=`fermé à %[2]s` issues.reopened_at=`réouvert à %[2]s` issues.commit_ref_at=`a référencé ce problème à partir d'un commit %[2]s` issues.poster=Publier @@ -562,14 +635,15 @@ 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.has_pull_request=`Il y a déjà une demande de tirer entre ces deux cibles : %[2]s#%[3]d` -pulls.create=Creer une Pull Request +pulls.nothing_merge_base=Il n'y a rien à comparer parce que les deux branches ont un historique complètement différent. +pulls.has_pull_request=`Il y a déjà une pull request entre ces deux cibles : %[2]s#%[3]d` +pulls.create=Créer une Pull Request pulls.title_desc=veut fusionner %[1]d commits à partir de %[2]s vers %[3]s -pulls.merged_title_desc=à fusionné %[1]d commits à partir de %[2]s vers %[3]s %[4]s +pulls.merged_title_desc=a fusionné %[1]d commits à partir de %[2]s vers %[3]s %[4]s pulls.tab_conversation=Conversation pulls.tab_commits=Commits 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 Pull Request pour effectuer l'opération de fusion. pulls.merged=Fusionné pulls.has_merged=Cette Pull Request 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. @@ -577,8 +651,13 @@ pulls.is_checking=La recherche de conflits est toujours en cours, veuillez rafra pulls.can_auto_merge_desc=Cette pull request peut être fusionnée automatiquement. pulls.cannot_auto_merge_desc=Cette pull request ne peut être fusionnée automatiquement à cause de conflits. pulls.cannot_auto_merge_helper=Fusionner manuellement afin de résoudre les conflits. +pulls.create_merge_commit=Créer un commit de fusion +pulls.rebase_before_merging=Rebaser avant la fusion +pulls.commit_description=Description du commit pulls.merge_pull_request=Fusionner la Pull Request 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.` +pulls.delete_branch=Supprimer la branche +pulls.delete_branch_has_new_commits=La branche ne peut pas être supprimée car de nouveaux commits ont été effectuées après la fusion. milestones.new=Nouveau Jalon milestones.open_tab=%d Ouvert @@ -629,6 +708,29 @@ settings.collaboration.admin=Administrateur settings.collaboration.write=Écrire settings.collaboration.read=Lire settings.collaboration.undefined=Indéfini +settings.branches=Branches +settings.branches_bare=Vous ne pouvez pas gérer les branches d'un dépôt vide. Merci de publier du contenu dans un premier temps. +settings.default_branch=Branche par défaut +settings.default_branch_desc=La branche par défaut est considérée comme la branche « originale » pour les commits de code, les requêtes de fusion et l'édition en ligne. +settings.update=Actualiser +settings.update_default_branch_unsupported=Le changement de branche par défaut n'est pas supporté par la version de Git sur ce serveur. +settings.update_default_branch_success=La branche par défaut de ce dépôt a bien été mise à jour. +settings.protected_branches=Branches protégées +settings.protected_branches_desc=Protéger les branches du push forcé, de la suppression accidentelle et des publicateurs de code en liste blanche. +settings.choose_a_branch=Choisir une branche… +settings.branch_protection=Protection de branche +settings.branch_protection_desc=Sélectionnez les options de protection pour la branche %s. +settings.protect_this_branch=Protéger cette branche +settings.protect_this_branch_desc=Interdire les push forcés et empêcher la suppression. +settings.protect_require_pull_request=Exiger une pull request plutôt qu'un push immédiat +settings.protect_require_pull_request_desc=Activez cette option pour empêcher la publication immédiate vers cette branche. Les commits devront être publiés vers une autre branche (non protégée) et fusionnée dans cette branche avec une requête de fusion. +settings.protect_whitelist_committers=Liste blanche de personnes pouvant publier sur cette branche +settings.protect_whitelist_committers_desc=Ajouter des personnes ou des équipes à la liste blanche des fusions directes de cette branche. Les utilisateurs dans cette liste blanche passeront outre la nécessité de valider leurs requêtes de fusion. +settings.protect_whitelist_users=Utilisateurs qui peuvent pousser sur cette branche +settings.protect_whitelist_search_users=Rechercher des utilisateurs +settings.protect_whitelist_teams=Les équipes pour lesquelles les membres peuvent pousser sur cette branche +settings.protect_whitelist_search_teams=Rechercher des équipes +settings.update_protect_branch_success=Les options de protection de cette branches ont été mises à jour avec succès. settings.hooks=Webhooks settings.githooks=Git Hooks settings.basic_settings=Paramètres de base @@ -641,19 +743,26 @@ settings.change_reponame_prompt=Ce changement affectera comment les liens sont r settings.advanced_settings=Paramètres avancés settings.wiki_desc=Activer le wiki settings.use_internal_wiki=Utiliser le wiki interne +settings.allow_public_wiki_desc=Autoriser l'accès public au wiki quand le dépôt est privé settings.use_external_wiki=Utiliser un wiki externe settings.external_wiki_url=URL Wiki externe 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.allow_public_issues_desc=Permettre l'accès du public aux tickets lorsque le dépôt est privé settings.use_external_issue_tracker=Utiliser un bug-tracker externe +settings.external_tracker_url=Adresse de l'issue tracker 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_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. -settings.pulls_desc=Activer les pull requests pour accepter les contributions publiques +settings.pulls_desc=Activer les pull requests pour accepter les contributions depuis des dépôts et des branches +settings.pulls.ignore_whitespace=Ignorer les changements quand ce sont des espaces +settings.pulls.allow_rebase_merge=Autoriser l'utilisation de rebase pour fusionner les validations settings.danger_zone=Zone de danger +settings.cannot_fork_to_same_owner=Vous ne pouvez par créer un fork d'un dépot à son propriétaire actuel. 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. @@ -673,7 +782,7 @@ settings.delete=Supprimer ce dépôt settings.delete_desc=Attention, cette action est action 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.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 @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Cet utilisateur n'aura plus accès pour coll 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 Gogs, une notification sera envoyée vers l'hôte cible préalablement spécifié. Apprenez-en davantage dans le Guide des Webhooks. +settings.webhooks.add_new=Ajouter un nouveau rappel HTTP +settings.webhooks.choose_a_type=Choisis le type de... +settings.add_webhook=Ajouter un Webhook 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.redelivery=Redistribution +settings.webhook.redelivery_success=La tâche crochet '%s' a été réajoutée à la liste de livraison. La mise à jour de l'état de livraison dans l'historique peut prendre quelques secondes. settings.webhook.request=Requête settings.webhook.response=Réponse settings.webhook.headers=Entêtes  settings.webhook.payload=Payload settings.webhook.body=Corps +settings.webhook.err_cannot_parse_payload_url=Impossible d'analyser l'URL : %v +settings.webhook.url_resolved_to_blocked_local_address=L'URL du contenu correspond à une adresse réseau locale qui est bloquée implicitement. 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.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 @@ -711,19 +825,30 @@ settings.add_webhook_desc=Une requête POST sera transmise vers l'U settings.payload_url=URL des Données Utiles settings.content_type=Type de contenu settings.secret=Confidentiel +settings.secret_desc=Le secret sera envoyé comme digest de payload SHA256 HMAC hex avec l'entête X-Gogs-Signature. settings.slack_username=Nom d'utilisateur settings.slack_icon_url=URL de l'icône settings.slack_color=Couleur -settings.event_desc=Quel évènement ce Webhook doit-il déclencher ? +settings.event_desc=Quand ce webhook doit-il être déclenché ? settings.event_push_only=Uniquement les push (soumissions). settings.event_send_everything=J'ai besoin de tout. settings.event_choose=Permettez-moi de choisir ce dont j'ai besoin. settings.event_create=Créer settings.event_create_desc=Branche, ou Tag créé -settings.event_pull_request=Pull Request -settings.event_pull_request_desc=Pull request ouvert, fermé, rouvert, édité, attribuée, non attribuées, étiquette mise à jour, étiquette désactivée ou synchronisé. +settings.event_delete=Supprimer +settings.event_delete_desc=Branche ou tag supprimé +settings.event_fork=Fork +settings.event_fork_desc=Dépôt dédoublé settings.event_push=Push settings.event_push_desc=Git push vers un dépôt +settings.event_issues=Tickets +settings.event_issues_desc=Ticket ouvert, fermé, réouvert, modifié, assigné, non-assigné, étiquette mise à jour, étiquette nettoyée, jalonnée, ou déjalonnée. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull requests ouverte, fermée, réouverte, modifiée, assignée, non-assignée, étiquette mise à jour, étiquette nettoyée, jalonnée, déjalonnée, ou synchronisée. +settings.event_issue_comment=Commentaire du ticket +settings.event_issue_comment_desc=Commentaire du ticket créé, modifié, ou supprimé. +settings.event_release=Version publiée +settings.event_release_desc=Version publiée dans 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é. @@ -733,10 +858,13 @@ settings.delete_webhook=Supprimer le Webhook settings.recent_deliveries=Livraisons récentes settings.hook_type=Type de Hook settings.add_slack_hook_desc=Intégrer Slack à votre dépôt. +settings.add_discord_hook_desc=Ajouter l'intégration de Discord à votre dépôt. +settings.add_dingtalk_hook_desc=Ajouter l'intégration de Dingtalk à votre dépôt. settings.slack_token=Jeton settings.slack_domain=Domaine settings.slack_channel=Canal settings.deploy_keys=Clés de déploiement +settings.deploy_keys_helper=Gotcha commun ! Si vous cherchez à ajouter des clés publiques personnelles, ajoutez-les dans vos paramètres de compte. 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.no_deploy_keys=Vous n'avez ajouté aucune clé de déploiement. @@ -748,8 +876,10 @@ settings.add_key_success=La nouvelle clé de déploiement '%s' a été ajoutée 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.description_desc=Description du dépôt. 512 caractères maximum. +settings.description_length=Caractères disponibles -diff.browse_source=Parcourir la Source +diff.browse_source=Parcourir la source diff.parent=Parent diff.commit=commit diff.data_not_available=Données Diff indisponibles. @@ -766,7 +896,6 @@ release.releases=Versions release.new_release=Nouvelle version release.draft=Brouillon release.prerelease=Pré-publication -release.stable=Stable release.edit=Éditer release.ahead=%d commits jusqu'à %s depuis cette publication release.source_code=Code source @@ -813,8 +942,8 @@ team_name_helper=Ce nom sera utilisé pour mentionner l'équipe dans les convers team_desc_helper=Présentation de l'équipe team_permission_desc=Quel niveau d'accès cette équipe devrait-elle posséder ? -form.name_reserved=Le nom d'organisation '%s' est réservé. -form.name_pattern_not_allowed=Motif '%s' interdit pour les noms d'organisation. +form.name_not_allowed=Le nom de l'organisation ou le modèle n'est pas autorisé. +form.team_name_not_allowed=Le nom de l'équipe ou le pattern %q n'est pas autorisé. settings=Paramètres settings.options=Options @@ -831,7 +960,7 @@ settings.delete_prompt=Cela supprimera cette organisation définitivement. Cette 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 vebhooks qui seront activés pour tous les dépôts de cette organisation. +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 @@ -886,12 +1015,19 @@ first_page=Première last_page=Dernière total=Total : %d +dashboard.build_info=Informations sur la construction +dashboard.app_ver=Version de l'application +dashboard.git_version=Version de Git +dashboard.go_version=Version de Go +dashboard.build_time=Temps de compilation +dashboard.build_commit=Commit dashboard.statistic=Statistiques dashboard.operations=Opérations dashboard.system_status=État du système dashboard.statistic_info=La base de données Gogs contient %d utilisateurs, %d organisations, %d clés publiques, %d dépôts, %d surveillances de dépôts, %d votes, %d actions, %d accès, %d tickets, %d commentaires, %d comptes de réseaux sociaux, %d abonnements, %d miroirs, %d versions, %d connexions d'origine, %d webhooks, %d versions, %d labels, %d tâches hook, %d équipes, %d tâches de mise à jour, %d fichiers. dashboard.operation_name=Nom de l'Opération dashboard.operation_switch=Basculer +dashboard.select_operation_to_run=Veuillez sélectionner l'opération à exécuter 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. @@ -905,8 +1041,8 @@ 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-Gogs 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.resync_all_hooks=Re-synchroniser les crochets pre-receive, update et post-receive de tous les dépôts. +dashboard.resync_all_hooks_success=Tous les crochets pre-receive, update et post-receive ont bien été resynchronisé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. @@ -981,12 +1117,14 @@ 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.auth_sources=Sources d'authentification auths.new=Ajouter une nouvelle source d'authentification auths.name=Nom auths.type=Type auths.enabled=Activé +auths.default=Par défaut auths.updated=Mis à jour auths.auth_type=Type d'authentification auths.auth_name=Nom de l'authentification @@ -995,6 +1133,7 @@ auths.domain=Domaine auths.host=Hôte auths.port=Port auths.bind_dn=Bind DN +auths.bind_dn_helper=Vous pouvez utiliser « %s » qui sera remplacé par le nom d'utilisateur, par exemple « DOM\%s » 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 @@ -1004,6 +1143,11 @@ auths.attribute_username_placeholder=Laisser vide pour utiliser la valeur du for auths.attribute_name=Attribut du prénom auths.attribute_surname=Attribut du nom de famille auths.attribute_mail=Attribut de l'e-mail +auths.verify_group_membership=Vérifier l'appartenance à un groupe +auths.group_search_base_dn=Recherche de groupe basée sur le nom de domaine +auths.group_filter=Filtre par groupe +auths.group_attribute_contain_user_list=Attribut de groupe contenant la liste des utilisateurs +auths.user_attribute_listed_in_group=Attribut de l'utilisateur listé dans le groupe auths.attributes_in_bind=Aller chercher les attributs dans le contexte de liaison DN auths.filter=Filtre utilisateur auths.admin_filter=Filtre administrateur @@ -1017,9 +1161,9 @@ 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.default_auth=Cette authentification est la source de connexion par défaut 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 @@ -1028,107 +1172,189 @@ 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 de connexion « %s » existe déjà. +auths.github_api_endpoint=API Endpoint +config.not_set=(non défini) 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 -config.domain=Domaine -config.offline_mode=Mode hors-ligne -config.disable_router_log=Désactiver la Journalisation du Routeur +config.brand_name=Nom de la marque config.run_user=Utilisateur système config.run_mode=Mode d'Éxécution -config.repo_root_path=Emplacement des Dépôts -config.static_file_root_path=Chemin statique des fichiers racines -config.log_file_root_path=Emplacement Racine du Fichier Journal -config.script_type=Type de Script -config.reverse_auth_user=Annuler l'Authentification de l'Utilisateur +config.server.external_url=URL externe +config.server.domain=Domaine +config.server.protocol=Protocole +config.server.http_addr=Adresse HTTP +config.server.http_port=Port HTTP +config.server.cert_file=Fichier de certificat +config.server.key_file=Fichier de la clé +config.server.tls_min_version=Version minimale de TLS +config.server.unix_socket_permission=Autorisation du socket Unix +config.server.local_root_url=URL racine locale +config.server.offline_mode=Mode hors connexion +config.server.disable_router_log=Désactiver la journalisation du routeur +config.server.enable_gzip=Activer Gzip +config.server.app_data_path=Chemin des données de l'application +config.server.load_assets_from_disk=Charger les ressources depuis le disque +config.server.landing_url=URL de destination (collecte) 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 -config.ssh_root_path=Emplacement racine -config.ssh_key_test_path=Chemin de test des clés -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.ssh.enabled=Activé +config.ssh.domain=Domaine exposé +config.ssh.port=Port exposé +config.ssh.root_path=Emplacement racine +config.ssh.keygen_path=Chemin de la clé +config.ssh.key_test_path=Chemin de test de la clé +config.ssh.minimum_key_size_check=Vérification de la taille minimale des clés +config.ssh.minimum_key_sizes=Taille minimale des clés +config.ssh.rewrite_authorized_keys_at_start=Réécriture de "authorized_keys" au démarrage +config.ssh.start_builtin_server=Démarrer le serveur intégré +config.ssh.listen_host=Hôte en écoute +config.ssh.listen_port=Port d'écoute +config.ssh.server_ciphers=Suites de chiffrement +config.ssh.server_macs=Adresses MAC du serveur +config.ssh.server_algorithms=Algorithmes de serveur + +config.repo_config=Configuration du dépôt +config.repo.root_path=Emplacement racine +config.repo.script_type=Type de script +config.repo.ansi_chatset=Jeu de caractères ANSI +config.repo.force_private=Forcer en tant que privé +config.repo.max_creation_limit=Limite de création +config.repo.preferred_licenses=Licences préférées +config.repo.disable_http_git=Désactiver Git HTTP +config.repo.enable_local_path_migration=Activer la migration de chemin locale +config.repo.enable_raw_file_render_mode=Activer le mode de rendu des fichiers de manière brute +config.repo.commits_fetch_concurrency=Récupération simultanée des commits +config.repo.editor.line_wrap_extensions=Extensions de retour à la ligne de l'éditeur +config.repo.editor.previewable_file_modes=Modes de prévisualisation des fichiers de l'éditeur +config.repo.upload.enabled=Publication activée +config.repo.upload.temp_path=Chemin du téléchargement temporaire +config.repo.upload.allowed_types=Types de publications autorisées +config.repo.upload.file_max_size=Taille maximale des fichiers envoyés +config.repo.upload.max_files=Limite sur les fichiers publiés config.db_config=Configuration de la Base de Données -config.db_type=Type -config.db_host=Hôte -config.db_name=Nom -config.db_user=Utilisateur -config.db_ssl_mode=Mode SSL -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.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 -config.require_sign_in_view=Connexion obligatoire pour visualiser -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.db.type=Type +config.db.host=Serveur hôte +config.db.name=Nom +config.db.schema=Schéma +config.db.schema_helper=(pour "postgres" uniquement) +config.db.user=Utilisateur +config.db.ssl_mode=Mode SSL +config.db.ssl_mode_helper=("postgres" uniquement) +config.db.path=Chemin +config.db.path_helper=(pour "sqlite3" seulement) +config.db.max_open_conns=Nombre maximum de connexions ouvertes +config.db.max_idle_conns=Nombre maximum de connexions inactives + +config.security_config=Configuration de sécurité +config.security.login_remember_days=Rester connecté plusieurs jours +config.security.cookie_remember_name=Mémoriser le cookie +config.security.cookie_username=Cookie du nom d'utilisateur +config.security.cookie_secure=Activer les cookies sécurisés +config.security.reverse_proxy_auth_user=Inverser l'en-tête d'authentification du proxy +config.security.enable_login_status_cookie=Activer le cookie d'état de connexion +config.security.login_status_cookie_name=Cookie de statut de connexion +config.security.local_network_allowlist=liste des autorisations de réseau local + +config.email_config=Configuration de l’e-mail +config.email.enabled=Activé +config.email.subject_prefix=Préfixe du sujet +config.email.host=Hôte +config.email.from=De: +config.email.user=Utilisateur +config.email.disable_helo=Désactiver HELO +config.email.helo_hostname=Nom d’hôte HELO +config.email.skip_verify=Ignorer la vérification du certificat +config.email.use_certificate=Utiliser un certificat personnalisé +config.email.cert_file=Fichier de certificat +config.email.key_file=Fichier de la clé +config.email.use_plain_text=Utiliser le texte brut +config.email.add_plain_text_alt=Ajouter une alternative au texte brut +config.email.send_test_mail=Envoyer un e-mail de test +config.email.test_mail_failed=Impossible d'envoyer un e-mail de test à '%s' : +config.email.test_mail_sent=Un e-mail de test à été envoyé à '%s'. + +config.auth_config=Configuration de l'authentification +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activer les vies sur les codes +config.auth.reset_password_code_lives=Vies sur les codes de réinitialisation des mots de passes +config.auth.require_email_confirm=Nécessite une confirmation par e-mail +config.auth.require_sign_in_view=Connexion obligatoire pour visualiser +config.auth.disable_registration=Désactiver les inscriptions +config.auth.enable_registration_captcha=Activer le CAPTCHA à l'inscription +config.auth.enable_reverse_proxy_authentication=Activer l'authentification par proxy inversé +config.auth.enable_reverse_proxy_auto_registration=Activer l'enregistrement automatique du proxy inversé +config.auth.reverse_proxy_authentication_header=En-tête d'authentification du proxy inversé + +config.user_config=Configuration de l'utilisateur +config.user.enable_email_notify=Activer les notifications par e-mail -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é -config.mailer_disable_helo=Désactiver HELO -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.session_config=Configuration de session +config.session.provider=Fournisseur +config.session.provider_config=Configuration du fournisseur +config.session.cookie_name=Cookie +config.session.https_only=HTTPS uniquement +config.session.gc_interval=Intervalle du GC +config.session.max_life_time=Durée de vie maximale +config.session.csrf_cookie_name=Cookie CSRF config.cache_config=Configuration du Cache -config.cache_adapter=Adaptateur du Cache -config.cache_interval=Intervales du Cache -config.cache_conn=Liaison du Cache - -config.session_config=Configuration de session -config.session_provider=Fournisseur de session -config.provider_config=Configuration du fournisseur -config.cookie_name=Nom du cookie -config.enable_set_cookie=Activer les cookies -config.gc_interval_time=Intervals GC -config.session_life_time=Durée des sessions -config.https_only=HTTPS uniquement -config.cookie_life_time=Expiration du cookie +config.cache.adapter=Adaptateur +config.cache.interval=Intervalle du GC +config.cache.host=Serveur hôte + +config.http_config=Configuration HTTP +config.http.access_control_allow_origin=Autoriser le partage d’accès avec l’origine + +config.attachment_config=Configuration des pièces jointes +config.attachment.enabled=Activé +config.attachment.path=Chemin +config.attachment.allowed_types=Types autorisés +config.attachment.max_size=Taille limite +config.attachment.max_files=Limite de fichiers + +config.release_config=Configuration de la version +config.release.attachment.enabled=Pièces jointes activées +config.release.attachment.allowed_types=Types de pièces jointes autorisés +config.release.attachment.max_size=Limite de taille des pièces jointes +config.release.attachment.max_files=Limite du nombre de fichiers joints config.picture_config=Configuration d'Image -config.picture_service=Service d'Imagerie -config.disable_gravatar=Désactiver Gravatar -config.enable_federated_avatar=Activer les avatars unifiés +config.picture.avatar_upload_path=Chemin de téléchargement de l'avatar de l'utilisateur +config.picture.repo_avatar_upload_path=Chemin de téléchargement de l'avatar du référentiel de versions +config.picture.gravatar_source=Origine Gravatar +config.picture.disable_gravatar=Désactiver Gravatar +config.picture.enable_federated_avatar=Activer les avatars unifiés + +config.mirror_config=Configuration de mise en miroir +config.mirror.default_interval=Intervalle par défaut + +config.webhook_config=Configuration Webhook +config.webhook.types=Types +config.webhook.deliver_timeout=Délai de livraison +config.webhook.skip_tls_verify=Ignorer la vérification TLS config.git_config=Configuration de Git -config.git_disable_diff_highlight=Désactiver la surbrillance syntaxique de Diff -config.git_max_diff_lines=Lignes de Diff Max (pour un seul fichier) -config.git_max_diff_line_characters=Nombre max de caractères de Diff (pour une seule ligne) -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.disable_diff_highlight=Désactiver la coloration syntaxique des différences +config.git.max_diff_lines=Limite de lignes différentes (pour un seul fichier) +config.git.max_diff_line_characters=Limite de caractères différents (pour une seule ligne) +config.git.max_diff_files=Limite de fichiers différents (pour une seule différence) +config.git.gc_args=Arguments GC +config.git.migrate_timeout=Délai de migration dépassé +config.git.mirror_timeout=Délai de récupération du miroir dépassé +config.git.clone_timeout=Délai de clonage dépassé +config.git.pull_timeout=Délai de récupération des sources dépassé +config.git.gc_timeout=GB délai expiré + +config.lfs_config=Configuration LFS +config.lfs.storage=Espace de stockage +config.lfs.objects_path=Chemin d'accès des objets config.log_config=Configuration du Journal -config.log_mode=Mode du journal +config.log_file_root_path=Emplacement Racine du Fichier Journal +config.log_mode=Mode +config.log_options=Options monitor.cron=Tâches Cron monitor.name=Nom @@ -1147,7 +1373,7 @@ notices.actions=Actions notices.select_all=Tout Sélectionner notices.deselect_all=Tous déselectionner notices.inverse_selection=Inverser la sélection -notices.delete_selected=Supprimé les éléments sélectionnés +notices.delete_selected=Supprimer les éléments sélectionnés notices.delete_all=Supprimer toutes les notifications notices.type=Type notices.type_1=Dépôt @@ -1158,18 +1384,25 @@ notices.delete_success=Notifications système supprimées avec succès. [action] create_repo=a créé le dépôt %s rename_repo=a rebaptisé le dépôt de %[1]s vers %[3]s -commit_repo=a soumis à %[3]s sur %[4]s +commit_repo=a commité dans %[3]s sur %[4]s +compare_commits=Comparer ces %d commits +transfer_repo=a transféré le dépôt %s à %s create_issue=`a ouvert un problème %s#%[2]s` close_issue=`tickets clos %s#%[2]s` reopen_issue=`tickets ré-ouverts %s#%[2]s` +comment_issue=`a commenté le problème %s#%[2]s` create_pull_request=`pull request créée le %s#%[2]s` -close_pull_request=`pull request fermé %s#%[2]s` +close_pull_request=`pull request fermée %s#%[2]s` reopen_pull_request=`pull request ré-ouverte %s#%[2]s` -comment_issue=`a commenté le problème %s#%[2]s` merge_pull_request=`pull request fusionné le %s#%[2]s` -transfer_repo=a transféré le dépôt %s à %s +create_branch=nouvelle branche créée %[3]s sur %[4]s +delete_branch=branche supprimée %[2]s sur %[3]s push_tag=a soumis le tag %[2]s sur %[3]s -compare_commits=Comparer ces %d commits +delete_tag=étiquette supprimée %[2]s sur %[3]s +fork_repo=a créé sa branche du dépôt vers %s +mirror_sync_push=a commité dans %[3]s sur %[4]s +mirror_sync_create=a synchronisé la nouvelle référence %[2]s vers %[3]s depuis le miroir +mirror_sync_delete=Référence synchronisés et supprimé %[2]s sur %[3]s [tool] ago=il y a @@ -1191,6 +1424,7 @@ months=%[2]s %[1]d mois years=%[2]s %[1]d ans raw_seconds=secondes raw_minutes=minutes +raw_hours=heures [dropzone] default_message=Déposez les fichiers ici ou cliquez pour télécharger. diff --git a/conf/locale/locale_gl-ES.ini b/conf/locale/locale_gl-ES.ini new file mode 100644 index 00000000000..cec2baf6760 --- /dev/null +++ b/conf/locale/locale_gl-ES.ini @@ -0,0 +1,1435 @@ +app_desc=Un servizo de Git auto aloxado e sen complicacións + +home=Inicio +dashboard=Panel de control +explore=Explorar +help=Axuda +sign_in=Iniciar sesión +sign_out=Cerrar sesión +sign_up=Rexistro +register=Rexistro +website=Páxina web +page=Páxina +template=Modelo +language=Idioma +create_new=Crear… +user_profile_and_more=Perfil de usuario/a e máis +signed_in_as=Identificado/a como + +username=Nome da persoa usuaria +email=Correo electrónico +password=Contrasinal +re_type=Ingrese de novo +captcha=Captcha=Captcha + +repository=Repositorio +organization=Organización +mirror=Réplica +new_repo=Novo repositorio +new_migrate=Nova migración +new_mirror=Nova réplica +new_fork=Novo fork do repositorio +new_org=Nova organización +manage_org=Administrar organizacións +admin_panel=Panel de administración +account_settings=Configuracións da conta +settings=Configuracións +your_profile=O teu perfil +your_settings=A túa configuración + +activities=Actividade +pull_requests=Solicitudes de integración +issues=Incidencias + +cancel=Cancelar + +[status] +page_not_found=Page Not Found +internal_server_error=Internal Server Error + +[install] +install=Instalación +title=Pasos da instalación por primeira vez +docker_helper=Se está executando Gogs usando Docker, por favor lea estas pautas antes de cambiar nada nesta páxina! +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). +db_title=Configuración de base de datos +db_type=Tipo de base de datos +host=Host +user=Persoa usuaria +password=Contrasinal +db_name=Nome da base de datos +db_schema=Schema +db_helper=Por favor, empregue o motor INNODB coa configuración de caracteres utf8_general_ci para MySQL. +ssl_mode=Modo SSL +path=Ruta +sqlite_helper=A ruta do ficheiro da base de datos SQLite3.
Utilice a ruta absoluta cando arrique o servicio. +err_empty_db_path=A ruta da base de datos SQLite3 non pode estar baleira. +no_admin_and_disable_registration=Non pode deshabilitar o rexistro sen crear unha conta de administrador. +err_empty_admin_password=O contrasinal de administrador non pode estar baleiro. + +general_title=Configuración xeral de Gogs +app_name=Nome da aplicación +app_name_helper=Pon aquí o nome da túa organización, alto e claro! +repo_path=Ruta do repositorio de Raiz (Root) +repo_path_helper=Todos os repositorios remotos de Git gardaranse neste directorio. +run_user=Executar como usuario +run_user_helper=A persoa usuaria necesita ter acceso á ruta raíz do repositorio e executar Gogs. +domain=Dominio +domain_helper=Isto afecta ás URLs para clonar por SSH. +ssh_port=Porto SSH +ssh_port_helper=Número de porto do seu servidor SSH, déixeo en branco para desactivar SSH. +use_builtin_ssh_server=Utilizar Builin en Sevidor SSH +use_builtin_ssh_server_popup=Inicia o servidor SSH integrado para que as operacións de Git sexan distintas do demonio SSH do sistema. +http_port=Porto HTTP +http_port_helper=Porto no que escoitará a aplicación. +app_url=URL da aplicación +app_url_helper=Isto afecta ás URLs para clonar por HTTP/HTTPS e a algúns correos electrónicos. +log_root_path=Ruta do rexistro +log_root_path_helper=Directorio onde almacenar os rexistros. +enable_console_mode=Habilitar Modo Consola +enable_console_mode_popup=Ademáis do modo de ficheiro, tamén imprime os rexistros para a consola. +default_branch=Default Branch + +optional_title=Configuración opcional +email_title=Configuración do servizo de correo +smtp_host=SMTP Host +smtp_from=Dende +smtp_from_helper=Remitente do correo electrónico, RFC 5322. Pode ser soamente un enderezo de correo electrónico, ou estar no formato "Nome" . +mailer_user=Remitente do correo electrónico +mailer_password=Contrasinal do remitente +register_confirm=Habilitar a confirmación no rexistro +mail_notify=Habilitar as notificacións de correo +server_service_title=Configuración do servidor e outros servizos +offline_mode=Activar o modo Sen conexión +offline_mode_popup=Desactivar o CDN incluso no modo de produción, todos os recursos serviranse localmente. +disable_gravatar=Desactivar o servizo Gravatar +disable_gravatar_popup=Desactivar Gravatar e calquera outra fonte personalizada. Todos os avatares deben ser cargados polas persoas usuarias ou no seu defecto mostrarase o avatar predeterminado. +federated_avatar_lookup=Habilitar busca de avatares federados +federated_avatar_lookup_popup=Habilitar busca de avatares federados para usar o servizo federado de código aberto baseado en libravatar. +disable_registration=Desactivar auto-rexistro +disable_registration_popup=Desactivar auto-rexistro da persoa usuaria, só a persoa administradora poderá crear contas novas. +enable_captcha=Activar a captcha +enable_captcha_popup=Require validar a captcha para o auto-rexistro de persoa usuaria. +require_sign_in_view=Activar o inicio de sesión obrigatorio para ver páxinas +require_sign_in_view_popup=Só as persoas usuarias logueadas poden ver páxinas, as visitantes anónimas só poderán ver as páxinas de login/rexistro. +admin_setting_desc=Non é necesario crear unha conta de administrador agora mesmo, a persoa usuaria que teña ID=1 obterá privilexios de administradora automaticamente. +admin_title=Configuración da conta de administrador +admin_name=Nome de persoa usuaria +admin_password=Contrasinal +confirm_password=Confirmar contrasinal +admin_email=Correo electrónico da persoa administradora +install_gogs=Instalar Gogs +test_git_failed=Fallo ao probar o comando 'git': %v +sqlite3_not_available=A túa versión non soporta SQLite3, por favor, descarga o binario oficial dende %s, NON a versión de gobuild. +invalid_db_setting=A configuración da base de datos non é correcta: %v +invalid_repo_path=A ruta da raíz do repositorio é inválida: %v +run_user_not_match=A persoa usuaria que está executando a aplicación non é a persoa usuaria actual: %s -> %s +smtp_host_missing_port=Falta o porto do Host SMTP + +invalid_smtp_from=O campo From do SMTP non é valido: %v +save_config_failed=Erro ao gardar a configuración: %v +init_failed=Failed to initialize application: %v +invalid_admin_setting=A configuración da conta de administración é inválida: %v +install_success=Benvido/a! Estamos encantados de que escolleses Gogs, divírtete e cóidate. +invalid_log_root_path=A ruta para os rexistros é inválida: %v + +[home] +uname_holder=Nome de usuario/a ou correo electrónico +password_holder=Contrasinal +switch_dashboard_context=Cambiar o contexto do Dashboard +my_repos=Os meus repositorios +show_more_repos=Mostrar máis repositorios... +collaborative_repos=Repositorios colaborativos +my_orgs=As miñas organizacións +my_mirrors=As miñas réplicas +view_home=Ver %s + +issues.in_your_repos=Nos teus repositorios + +[explore] +repos=Repositorios +users=Persoas usuarias +organizations=Organizacións +search=Buscar + +[auth] +create_new_account=Crear unha nova conta +register_hepler_msg=Xa tes unha conta? Inicia sesión! +social_register_hepler_msg=Xa tes unha conta? Enlázaa! +disable_register_prompt=Sentímolo, o rexistro está deshabilitado. Por favor, contacta co administrador do sitio. +disable_register_mail=Sentímolo. Os correos de confirmación de rexistro están deshabilitados. +auth_source=Fonte de Autenticación +local=Configuración rexional +remember_me=Recórdame +forgot_password=Esquecín o meu contrasinal +forget_password=Esqueciches o teu contrasinal? +sign_up_now=Necesitas unha conta? Rexístrate agora. +confirmation_mail_sent_prompt=Un novo correo de confirmación enviouse a %s. Por favor, comproba a túa bandexa de entrada nas seguintes %d horas para completar o proceso de rexistro. +active_your_account=Activa a túa conta +prohibit_login=Ingreso prohibido +prohibit_login_desc=A túa conta ten prohibido ingresar ao sistema, por favor, contacta coa persoa administradora do sistema. +resent_limit_prompt=Sentímolo, estás solicitando o reenvío do correo de activación con demasiada frecuencia. Por favor, agarda 3 minutos. +has_unconfirmed_mail=Ola %s, o teu correo electrónico (%s) non está confirmado. Se non recibiches un correo de confirmación ou necesitas que o enviemos de novo, por favor, preme no seguinte botón. +resend_mail=Preme aquí para reenviar o teu correo electrónico de activación +send_reset_mail=Prema aquí para (re)enviar o correo para o restablecemento do contrasinal +reset_password=Restablecer o teu contrasinal +invalid_code=Sentímolo, o teu código de confirmación expirou ou non é válido. +reset_password_helper=Prema aquí para restablecer o seu contrasinal +password_too_short=A lonxitude do contrasinal non pode ser menor de 6. +non_local_account=Contas que non son locais non poden cambiar os contrasinais a través de Gogs. + +login_two_factor=Autenticación en dous pasos +login_two_factor_passcode=Código de Autenticación +login_two_factor_enter_recovery_code=Introduza o código de recuperación da verificación en dous pasos +login_two_factor_recovery=Recuperación en dous pasos +login_two_factor_recovery_code=Codigo de Recuperación +login_two_factor_enter_passcode=Introduza o código de acceso en dous pasos +login_two_factor_invalid_recovery_code=O código de recuperación foi usado ou non é válido. + +[mail] +activate_account=Por favor, activa a túa conta +activate_email=Verifica o teu correo electrónico +reset_password=Restablece o teu contrasinal +register_success=Rexistro completado, benvido/a +register_notify=Benvido/a a bordo + +[modal] +yes=Si +no=Non +modify=Editar + +[form] +UserName=Nome da persoa usuaria +RepoName=Nome do repositorio +Email=Enderezo de correo electrónico +Password=Contrasinal +Retype=Volva escribir o contrasinal +SSHTitle=Nome da clave de SSH +HttpsUrl=HTTPS URL +PayloadUrl=URL de carga +TeamName=Nome do equipo +AuthName=Nome de autorización +AdminEmail=Correo electrónico da persoa administradora + +NewBranchName=Novo nome de rama +CommitSummary=Resumo da achega +CommitMessage=Mensaxe da achega +CommitChoice=Preferencia da achega +TreeName=Ruta do arquivo +Content=Contido + +require_error=` non pode estar baleiro.` +alpha_dash_error=` os caracteres deben ser alfanuméricos ou dash(-_).` +alpha_dash_dot_error=` debe ser un carácter alfanumérivo válido, un guión alto ou baixo (-_) ou un signo de puntuación.` +alpha_dash_dot_slash_error=` debe ser un carácter válido : numérico, alfabético, guión(-_) puntos ou barras.` +size_error=` debe ser de tamaño %s.` +min_size_error=` debe conter polo menos %s caracteres.` +max_size_error=` debe conter como máximo %s caracteres.` +email_error=` non é un enderezo de correo válido.` +url_error=` non é unha URL válida.` +include_error=` debe conter a subcadea '%s'.` +unknown_error=Erro descoñecido: +captcha_incorrect=O captcha non é válido. +password_not_match=O contrasinal de confirmación non coincide. + +username_been_taken=Xa existe unha persoa usuaria con este nome. +repo_name_been_taken=Xa existe un repositorio con este nome. +org_name_been_taken=Xa existe unha organización con este nome. +team_name_been_taken=Xa existe un equipo con este nome. +email_been_used=Este enderezo de correo electrónico xa está en uso. +username_password_incorrect=Nome de usuario ou contrasinal incorrectos. +auth_source_mismatch=A fonte de autenticación seleccionada non está asociada co usuario. +enterred_invalid_repo_name=Por favor, asegúrate de que introduciches correctamente o nome do repositorio. +enterred_invalid_owner_name=Por favor, asegúrate de que introduciches correctamente o nome do propietario. +enterred_invalid_password=Por favor, asegúrate de que introduciches correctamente o teu contrasinal. +user_not_exist=A persoa usuaria indicada non existe. +last_org_owner=O usuario que se intenta eliminar é o último membro do equipo de propietarios. Debe existir outro propietario. + +invalid_ssh_key=Sentímolo, non somos capaces de verificar a túa clave SSH: %s +unable_verify_ssh_key=Gogs non pode verificar a túa clave SSH, pero asumimos que é válida. Por favor, asegúrate de que é así. +auth_failed=Erro de autenticación: %v + +still_own_repo=A túa conta é a propietaria dun ou máis repositorios, tes que borralos ou transferilos primeiro. +still_has_org=A túa conta é membro dunha ou máis organizacións, tes que abandonalas ou eliminalas primeiro. +org_still_own_repo=Esta organización é dona dun ou máis repositorios, tes que eliminalos ou transferilos primeiro. + +target_branch_not_exist=A rama de destino non existe + +[user] +change_avatar=Cambiar o teu avatar +join_on=Rexistrado o +repositories=Repositorios +activity=Actividade pública +followers=Seguidores +starred=Destacados +following=Seguindo +follow=Seguir +unfollow=Deixar de seguir + +form.name_not_allowed=User name or pattern %q is not allowed. + +[settings] +profile=Perfil +password=Contrasinal +avatar=Avatar +ssh_keys=Claves SSH +security=Seguridade +repos=Repositorios +orgs=Organizacións +applications=Aplicacións +delete=Eliminar conta + +public_profile=Perfil público +profile_desc=O teu correo electrónico é público e será usado para todas as notificacións relacionadas con calquera conta e calquera operación feita a través da web. +password_username_disabled=Os usuarios que non son locais non teñen permitido cambiar o seu nome de usuario. +full_name=Nome completo +website=Páxina web +location=Localización +update_profile=Actualizar perfil +update_profile_success=O teu perfil actualizouse correctamente. +change_username=Nome de usuario modificado +change_username_prompt=Este cambio afectaralles ás ligazóns que fan referencia á túa conta. +continue=Continuar +cancel=Cancelar + +lookup_avatar_by_mail=Buscar avatar por correo +federated_avatar_lookup=Busca de avatar federado +enable_custom_avatar=Activar avatar personalizado +choose_new_avatar=Selecciona novo avatar +update_avatar=Actualizar configuración do avatar +delete_current_avatar=Eliminar avatar +uploaded_avatar_not_a_image=O arquivo enviado non é unha imaxe. +update_avatar_success=A configuración do teu avatar actualizouse correctamente. + +change_password=Cambiar contrasinal +old_password=Contrasinal actual +new_password=Novo contrasinal +retype_new_password=Confirmar novo contrasinal +password_incorrect=Contrasinal actual incorrecto. +change_password_success=O contrasinal modificouse correctamente. Xa podes iniciar sesión co teu novo contrasinal. +password_change_disabled=Os usuarios que non son locais non teñen permitido cambiar o teu contrasinal. + +emails=Enderezos de correo electrónico +manage_emails=Xestionar enderezos de correo electrónico +email_desc=O teu enderezo de correo principal empregarase para as notificacións e outras operacións. +primary=Principal +primary_email=Marcar como principal +delete_email=Eliminar +email_deletion=Eliminar correo electrónico +email_deletion_desc=Ao eliminar este enderezo de correo electrónico eliminarase toda a información asociada a esta. Desexas continuar? +email_deletion_success=O correo electrónico foi eliminado correctamente! +email_deletion_primary=Cannot delete primary email address. +add_new_email=Engadir novo enderezo de correo electrónico +add_email=Engadir correo electrónico +add_email_confirmation_sent=Un novo correo de confirmación foi enviado a '%s'. Por favor, comproba a túa bandexa de entrada nas próximas %d horas para completar o proceso. +add_email_success=O teu novo correo electrónico engadiuse correctamente. + +manage_ssh_keys=Xestionar claves SSH +add_key=Engadir clave +ssh_desc=Esta é a lista de claves SSH asociadas coa túa conta. Elimina calquera clave que non recoñezas. +ssh_helper=Necesitas axuda? Consulta a guía de GitHub para xerar claves SSH ou solucionar problemas comúns ao usar SSH. +add_new_key=Engadir clave SSH +ssh_key_been_used=O contido da clave pública utilizouse. +ssh_key_name_used=Xa existe unha clave pública co mesmo nome. +key_name=Nome da clave +key_content=Contido +add_key_success=Nova clave SSH '%s' engadida correctamente! +delete_key=Eliminar +ssh_key_deletion=Borrado de clave SSH +ssh_key_deletion_desc=Se elimina esta clave SSH non poderá volvela usar para acceder á súa conta. Desexa continuar? +ssh_key_deletion_success=A clave SSH foi eliminada con éxito! +add_on=Engadido en +last_used=Empregado por última vez en +no_activity=Non hai actividade recente +key_state_desc=Esta clave foi usada nos últimos 7 días +token_state_desc=Token usado nos últimos 7 días + +two_factor=Autenticación en Dous Pasos +two_factor_status=Estado: +two_factor_on=Si +two_factor_off=Non +two_factor_enable=Activar +two_factor_disable=Desactivar +two_factor_view_recovery_codes=View and save your recovery codes in a safe place. You can use them as passcode if you lose access to your authentication application. +two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use Personal Access Token as your credential, e.g. %[3]s. +two_factor_enable_title=Enable Two-factor Authentication +two_factor_scan_qr=Please use your authentication application to scan the image: +two_factor_or_enter_secret=Or enter the secret: +two_factor_then_enter_passcode=A continuación, introduza o código: +two_factor_verify=Verificar +two_factor_invalid_passcode=The passcode you entered is not valid, please try again! +two_factor_reused_passcode=The passcode you entered has already been used, please try another one! +two_factor_enable_error=Enable Two-factor authentication failed: %v +two_factor_enable_success=Two-factor authentication has enabled for your account successfully! +two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes +two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, please keep these codes in a safe place. +two_factor_regenerate_recovery_codes=Rexenerar Códigos de Recuperación +two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v +two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully! +two_factor_disable_title=Desactivar a verificación en dous pasos +two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue? +two_factor_disable_success=Two-factor authentication has disabled successfully! + +manage_access_token=Xestionar os tokens de acceso persoais +generate_new_token=Xerar novo token +tokens_desc=Tokens usados para acceder ao API de Gogs. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. +new_token_desc=Dende agora, todos os tokens terán acceso completo á túa conta. +token_name=Nome do token +generate_token=Xerar token +generate_token_succees=Os novos tokens de acceso xeráronse correctamente! Asegúrate de copiar o teu novo token de acceso persoal. Non o poderás ver de novo! +delete_token=Eliminar +access_token_deletion=Borrado de Token de Acceso Persoal +access_token_deletion_desc=Se elimina este token de acceso persoal a aplicación asociada perderá o permiso de acceso. Desexa continuar? +delete_token_success=O token de acceso persoal foi eliminado con éxito! Non esqueza actualizar tamén as aplicacións asociadas. +token_name_exists=Token with same name already exists. + +orgs.none=Non es membro de nengunha organización. +orgs.leave_title=Deixar unha organización +orgs.leave_desc=Deixarás de ter aceso ao tódolos repositorios e equipos despois de deixar a organización. Desexas abandonala? + +repos.leave=Abandoar +repos.leave_title=Deixar repositorio +repos.leave_desc=You will lose access to the repository after you left. Do you want to continue? +repos.leave_success=You have left repository '%s' successfully! + +delete_account=Elimina a túa conta +delete_prompt=A operación eliminará a túa conta de forma permanente e NON se pode desfacer! +confirm_delete_account=Confirmar eliminación +delete_account_title=Eliminación de conta +delete_account_desc=Esta conta vaise eliminar permanentemente, queres continuar? + +[repo] +owner=Propietario +repo_name=Nome do repositorio +repo_name_helper=Os grandes nomes de repositorios son curtos, memorables e únicos. +visibility=Visibilidade +unlisted=Unlisted +visiblity_helper=Este repositorio é privado +unlisted_helper=This repository is Unlisted +visiblity_helper_forced=O administrador web obrigou a todos os repositorios novos a ser privados +visiblity_fork_helper=(Este cambio afectará a todos os forks) +clone_helper=Necesitas axuda co clone? Consulta a Axuda! +fork_repo=Facer Fork do repositorio +fork_from=Crear un Fork desde +fork_visiblity_helper=Non é posible cambiar a visibilidade dun Fork +repo_desc=Descrición +repo_lang=Idioma +repo_gitignore_helper=Seleccionar modelos de .gitignore +license=Licenza +license_helper=Selecciona un ficheiro de licenza +readme=Readme +readme_helper=Seleccione un modelo de arquivo Readme +auto_init=Inicializar os arquivos seleccionados e modelos deste repositorio +create_repo=Crear repositorio +default_branch=Rama por defecto +mirror_prune=Purgar +mirror_prune_desc=Remover referencias remotas que non existan remotamente +mirror_interval=Intervalo da réplica (en horas) +mirror_address=Enderezo da réplica +mirror_address_desc=Por favor, inclúa as credenciais de usuario necesarias no enderezo. +mirror_last_synced=Sincronizado por última vez +watchers=Seguidores +stargazers=Fans +forks=Forks +repo_description_helper=Description of repository. Maximum 512 characters length. +repo_description_length=Available characters + +form.reach_limit_of_creation=El propietario ha alcanzado el límite máximo de %d repositorios creados.=O propietario acadou o límite máximo de %d repositorios creados. +form.name_not_allowed=Repository name or pattern %q is not allowed. + +need_auth=Requiere autorización=Require autorización +migrate_type=Tipo de migración +migrate_type_helper=Este repositorio será unha réplica +migrate_repo=Migrar repositorio +migrate.clone_address=Clonar enderezo +migrate.clone_address_desc=Pode ser unha URL HTTP/HTTPS/GIT. +migrate.clone_address_desc_import_local=Tamén podes migrar un repositorio mediante a ruta do servidor local. +migrate.permission_denied=Non che está permitido importar repositorios locais. +migrate.invalid_local_path=Rutal local inválida, non existe ou non é un directorio. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. +migrate.failed=Migración fallida: %v + +mirror_from=réplica de +forked_from=Fork de +copy_link=Copiar +copy_link_success=Copiado! +copy_link_error=Presione ⌘ + C ou Ctrl-C para copiar +copied=Copiado correctamente +unwatch=Deixar de vixiar +watch=Seguir +unstar=Eliminar destacado +star=Destacar +fork=Fork + +no_desc=Sen descrición +quick_guide=Guía rápida +clone_this_repo=Clonar este repositorio +create_new_repo_command=Crear un novo repositorio desde liña de comandos +push_exist_repo=Facer Push dun repositorio existente desde liña de comandos +bare_message=This repository does not have any content yet. + +files=Ficheiros +branch=Rama +tree=Árbore +filter_branch_and_tag=Filtrar por rama ou etiqueta +branches=Ramas +tags=Etiquetas +issues=Incidencias +pulls=Pull Requests +labels=Etiquetas +milestones=Fitos +commits=Achegas +git_branches=Branches +releases=Lanzamentos +file_raw=Raw +file_history=Histórico +file_view_raw=Ver Raw +file_permalink=Permalink +file_too_large=Este arquivo é demasiado grande para ser mostrado +video_not_supported_in_browser=O teu navegador non soporte a etiqueta video de HTML5. + +branches.overview=Overview +branches.active_branches=Active Branches +branches.stale_branches=Stale Branches +branches.all=All Branches +branches.updated_by=Updated %[1]s by %[2]s +branches.change_default_branch=Change Default Branch +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=Novo arquivo +editor.upload_file=Subir arquivo +editor.edit_file=Editar arquivo +editor.preview_changes=Previsualizar cambios +editor.cannot_edit_non_text_files=Non podes editar arquivos que non sexan texto +editor.edit_this_file=Editar este arquivo +editor.must_be_on_a_branch=Debes estar nunha rama para facer ou propoñer cambios neste arquivo +editor.fork_before_edit=Debes facer un Fork deste repositorio antes de poder editalo +editor.delete_this_file=Borrar este arquivo +editor.must_have_write_access=Debes ter acceso de escritura para facer ou propoñer cambios neste arquivo +editor.file_delete_success=O arquivo '%s' foi borrado con éxito! +editor.name_your_file=Nomea o teu arquivo... +editor.filename_help=Para engadir un cartafol, so escribeo e preme /. Para eliminar un cartafol, vai ao comezo do campo e preme backspace. +editor.or=ou +editor.cancel_lower=cancelar +editor.commit_changes=Incorporar cambios +editor.add_tmpl=Engadir '%s/' +editor.add=Engadir '%s' +editor.update=Actualizar '%s' +editor.delete=Borrar '%s' +editor.commit_message_desc=Engadir unha descrición adicional... +editor.commit_directly_to_this_branch=Incorporar os cambios directamente á rama %s. +editor.create_new_branch=Crear unha nova rama para esta achega e inicia unha solicitude de integración. +editor.new_branch_name_desc=Novo nome da rama... +editor.cancel=Cancelar +editor.filename_cannot_be_empty=O nome do arquivo non pode estar baleiro +editor.branch_already_exists=A rama '%s' xa existe no repositorio. +editor.directory_is_a_file='%s' na ruta é un arquivo, non un cartafol neste repositorio. +editor.file_is_a_symlink=O ficheiro '%s' é un enlace simbólico que non pode ser modificado desde o editor web. +editor.filename_is_a_directory=O nome de arquivo '%s' é un cartafol neste repositorio. +editor.file_editing_no_longer_exists=O arquivo '%s' que estas editando xa non existe no repositorio. +editor.file_changed_while_editing=O contido do arquivo cambiou desde que comezaches a editalo. Preme aquí para ver o que cambiou ou solicita outra achega para sobreescribir os cambios. +editor.file_already_exists=Un arquivo co nome '%s' xa existe no repositorio. +editor.no_changes_to_show=Non hai cambios que mostrar. +editor.fail_to_update_file=Fallou o actualizar/crear o arquivo '%s' co erro: %v +editor.fail_to_delete_file=Failed to delete file '%s' with error: %v +editor.add_subdir=Engadir subdirectorio... +editor.unable_to_upload_files=Fallou ao subir arquivos a '%s' co erro: %v +editor.upload_files_to_dir=Subir arquivos a '%s' + +commits.commit_history=Commit History +commits.commits=Achegas +commits.search=Buscar achegas +commits.find=Buscar +commits.author=Autor +commits.message=Mensaxe +commits.date=Data +commits.older=Anterior +commits.newer=Posterior + +issues.new=Nova incidencia +issues.new.labels=Etiquetas +issues.new.no_label=Sen etiquetas +issues.new.clear_labels=Limpar etiquetas +issues.new.milestone=Fito +issues.new.no_milestone=Sen fito +issues.new.clear_milestone=Limpar fito +issues.new.open_milestone=Fitos abertos +issues.new.closed_milestone=Fitos cerrados +issues.new.assignee=Asignado a +issues.new.clear_assignee=Limpar asignado +issues.new.no_assignee=Sen asignado +issues.create=Crear incidencia +issues.new_label=Nova etiqueta +issues.new_label_placeholder=Nome etiqueta... +issues.create_label=Crear etiqueta +issues.label_templates.title=Carga un conxunto predefinido de etiquetas +issues.label_templates.info=Aínda non hai etiquetas. Podes premer en "Nova etiqueta" para crear unha ou usar un conxunto predefinido a continuación. +issues.label_templates.helper=Elixe un conxunto de etiquetas +issues.label_templates.use=Usa este conxunto de etiquetas +issues.label_templates.fail_to_load_file=Fallou ao cargar o arquivo co modelo da etiqueta '%s': %v +issues.open_tab=%d abertas +issues.close_tab=%d cerradas +issues.filter_label=Etiqueta +issues.filter_label_no_select=Ningunha etiqueta seleccionada +issues.filter_milestone=Fito +issues.filter_milestone_no_select=Ningún fito seleccionado +issues.filter_assignee=Asignada a +issues.filter_assginee_no_select=Sen asignar +issues.filter_type=Tipo +issues.filter_type.all_issues=Todas as incidencias +issues.filter_type.assigned_to_you=Asignadas a ti +issues.filter_type.created_by_you=Creadas por ti +issues.filter_type.mentioning_you=Citado en +issues.filter_sort=Ordenar +issues.filter_sort.latest=Máis recentes +issues.filter_sort.oldest=Máis antigas +issues.filter_sort.recentupdate=Actualizada recentemente +issues.filter_sort.leastupdate=Actualizada menos recentemente +issues.filter_sort.mostcomment=Máis comentadas +issues.filter_sort.leastcomment=Menos comentadas +issues.opened_by=aberta %[1]s por %[3]s +issues.opened_by_fake=aberta %[1]s por %[2]s +issues.previous=Páxina anterior +issues.next=Páxina seguinte +issues.open_title=Aberta +issues.closed_title=Cerrada +issues.num_comments=%d comentarios +issues.commented_at=`comentado %s'` +issues.delete_comment_confirm=Seguro que desexas eliminar este comentario? +issues.no_content=Aínda non existe contido. +issues.close_issue=Cerrar +issues.close_comment_issue=Comentar e cerrar +issues.reopen_issue=Reabrir +issues.reopen_comment_issue=Comentar e reabrir +issues.create_comment=Comentar +issues.closed_at=`cerrou %[2]s` +issues.reopened_at=`reabriu %[2]s` +issues.commit_ref_at=`mencionada esta incidencia nunha achega %[2]s` +issues.poster=Autor +issues.collaborator=Colaborador +issues.owner=Propietario +issues.sign_in_require_desc=Accede para unirte á conversa. +issues.edit=Editar +issues.cancel=Cancelar +issues.save=Gardar +issues.label_title=Nome etiqueta +issues.label_color=Cor etiqueta +issues.label_count=%d etiquetas +issues.label_open_issues=%d incidencias abertas +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=Ao borrar a etiqueta a súa información será eliminada de todas as incidencias relacionadas. Desexa continuar? +issues.label_deletion_success=Etiqueta borrada con éxito! +issues.num_participants=%d participantes +issues.attachment.open_tab=`Click to see "%s" in a new tab` +issues.attachment.download=`Click to download "%s"` + +pulls.new=Novo Pull Request +pulls.compare_changes=Comparar cambios +pulls.compare_changes_desc=Comparar dúas ramas e xerar un pull request coas diferenzas. +pulls.compare_base=base +pulls.compare_compare=comparar con +pulls.filter_branch=Filtrar rama +pulls.no_results=Sen resultados. +pulls.nothing_to_compare=Nada que comparar. As dúas ramas coinciden. +pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history. +pulls.has_pull_request=`Xa existe un pull request entre estas dúas ramas: %[2]s#%[3]d` +pulls.create=Crear Pull Request +pulls.title_desc=desexa fusionar %[1]d achegas de %[2]s en %[3]s +pulls.merged_title_desc=fusionadas %[1]d achegas de %[2]s en %[3]s %[4]s +pulls.tab_conversation=Conversa +pulls.tab_commits=Achegas +pulls.tab_files=Arquivos modificados +pulls.reopen_to_merge=Por favor reabra este Pull Request para proceder coa operación de fusionado. +pulls.merged=Fusionado +pulls.has_merged=Este pull request completouse con éxito! +pulls.data_broken=Os datos deste pull request xa non están dispoñibles porque se eliminou a información do fork. +pulls.is_checking=Estase procedendo á busca de conflitos, por favor, actualice a páxina nuns momentos. +pulls.can_auto_merge_desc=Este Pull Request pode ser fusionado automaticamente. +pulls.cannot_auto_merge_desc=Este Pull Request non pode ser fusionado automaticamente porque hai conflitos. +pulls.cannot_auto_merge_helper=Por favor, fusiona manualmente para resolver os conflitos. +pulls.create_merge_commit=Create a merge commit +pulls.rebase_before_merging=Rebase before merging +pulls.commit_description=Commit Description +pulls.merge_pull_request=Fusionar Pull Request +pulls.open_unmerged_pull_exists=`Vostede non pode realizar a operación de reapertura porque nestes momentos existe unha solicitude de pull request (#%d) para o mesmo repositorio coa mesma información que se encontra á espera de aprobación` +pulls.delete_branch=Eliminar branch +pulls.delete_branch_has_new_commits=O branch non se pode borrar porque apareceron novos commits despois de mergear. + +milestones.new=Novo fito +milestones.open_tab=%d abertas +milestones.close_tab=%d cerradas +milestones.closed=Cerrada %s +milestones.no_due_date=Sen data límite +milestones.open=Abrir +milestones.close=Cerrar +milestones.new_subheader=Cree milestones para organizar as incidencias. +milestones.create=Novo fito +milestones.title=Título +milestones.desc=Descrición +milestones.due_date=Data límite (opcional) +milestones.clear=Eliminar +milestones.invalid_due_date_format=O formato da data límite non é válido, debe ser 'yyyy-mm-dd'. +milestones.create_success=O fito '%s' foi creado con éxito! +milestones.edit=Editar fito +milestones.edit_subheader=Use unha boa descrición no fito para non confundir o resto de persoas usuarias. +milestones.cancel=Cancelar +milestones.modify=Modificar fito +milestones.edit_success=Os cambios ao fito '%s' gardáronse con éxito! +milestones.deletion=Borrar fito +milestones.deletion_desc=Eliminar este fito eliminará a súa información e as incidencias asociadas. Desexa continuar? +milestones.deletion_success=O fito foi eliminado con éxito! + +wiki=Wiki +wiki.welcome=Benvido á Wiki! +wiki.welcome_desc=A Wiki é o lugar onde vos gustaría documentar xuntos o voso proxecto e facelo mellor. +wiki.create_first_page=Crear a primeira páxina +wiki.page=Páxina +wiki.filter_page=Filtrar páxina +wiki.new_page=Crear nova páxina +wiki.default_commit_message=Escribe unha nota sobre esta achega (opcional). +wiki.save_page=Gardar páxina +wiki.last_commit_info=%s editou esta páxina %s +wiki.edit_page_button=Editar +wiki.new_page_button=Nova páxina +wiki.delete_page_button=Eliminar páxina +wiki.delete_page_notice_1=Isto eliminará a páxina "%s". Por favor, asegúrate de que é o que queres. +wiki.page_already_exists=Xa existe unha páxina co mesmo nome. +wiki.pages=Páxinas +wiki.last_updated=Última actualización %s + +settings=Configuración +settings.options=Opcións +settings.collaboration=Colaboración +settings.collaboration.admin=Administrador +settings.collaboration.write=Escritura +settings.collaboration.read=Lectura +settings.collaboration.undefined=Indefinido +settings.branches=Branches +settings.branches_bare=You cannot manage branches for bare repository. Please push some content first. +settings.default_branch=Default Branch +settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing. +settings.update=Update +settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server. +settings.update_default_branch_success=Default branch of this repository has been updated successfully! +settings.protected_branches=Protected Branches +settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers. +settings.choose_a_branch=Choose a branch... +settings.branch_protection=Branch Protection +settings.branch_protection_desc=Please choose protect options for branch %s. +settings.protect_this_branch=Protect this branch +settings.protect_this_branch_desc=Disable force pushes and prevent from deletion. +settings.protect_require_pull_request=Require pull request instead direct pushing +settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request. +settings.protect_whitelist_committers=Whitelist who can push to this branch +settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check. +settings.protect_whitelist_users=Users who can push to this branch +settings.protect_whitelist_search_users=Search users +settings.protect_whitelist_teams=Teams for which members of them can push to this branch +settings.protect_whitelist_search_teams=Search teams +settings.update_protect_branch_success=Protect options for this branch has been updated successfully! +settings.hooks=Webhooks +settings.githooks=Git Hooks +settings.basic_settings=Configuración básica +settings.mirror_settings=Configuración da réplica +settings.sync_mirror=Sincroniza agora +settings.mirror_sync_in_progress=A sincronización da réplica está en progreso, por favor actualiza a páxina nun minuto. +settings.site=Sitio oficial +settings.update_settings=Actualizar configuración +settings.change_reponame_prompt=Este cambio afectaralles ás ligazóns ao repositorio. +settings.advanced_settings=Axustes avanzados +settings.wiki_desc=Activar sistema de wiki +settings.use_internal_wiki=Usar wiki integrada +settings.allow_public_wiki_desc=Allow public access to wiki when repository is private +settings.use_external_wiki=Usar Wiki externa +settings.external_wiki_url=URL externa da Wiki +settings.external_wiki_url_desc=Os visitantes serán redireccionados á URL cando preman na barra. +settings.issues_desc=Habilitar rastrexo de incidencias +settings.use_internal_issue_tracker=Usar rastrexo de incidencias lixeiro incluído +settings.allow_public_issues_desc=Allow public access to issues when repository is private +settings.use_external_issue_tracker=Usar tracker externo de incidencias +settings.external_tracker_url=URL de seguimento de problemas externos +settings.external_tracker_url_desc=Os visitantes serán redireccionados á URL cando preman na barra. +settings.tracker_url_format=Formato URL do tracker de incidencias externo +settings.tracker_issue_style=Estilo de etiquetaxe do tracker externo de incidencias: +settings.tracker_issue_style.numeric=Numérico +settings.tracker_issue_style.alphanumeric=Alfanumérico +settings.tracker_url_format_desc=Podes usar os modelos {user} {repo} {index} para o nome de usuario, nome do repositorio e índice da incidencia. +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Ignore changes in whitespace +settings.pulls.allow_rebase_merge=Allow use rebase to merge commits +settings.danger_zone=Zona de perigo +settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner. +settings.new_owner_has_same_repo=O novo propietario ten un repositorio co mesmo nome. +settings.convert=Converter nun repositorio normal +settings.convert_desc=Podes converter este repositorio nun repositorio normal. Este cambio non se pode desfacer. +settings.convert_notices_1=- Esta operación converterá este repositorio espello nun repositorio normal e non se poderá desfacer. +settings.convert_confirm=Confirmar conversión +settings.convert_succeed=O repositorio foi convertido en normal satisfactoriamente. +settings.transfer=Transferir a propiedade +settings.transfer_desc=Transferir este repositorio a outro usuario ou organización onde teñas permisos de administración. +settings.transfer_notices_1=- Perderá o permiso de acceso se o novo propietario é outro usuario. +settings.transfer_notices_2=- Conservará o privilexio de acceso se o novo propietario é unha organización e vostede é un dos propietarios da dita organización. +settings.transfer_form_title=Por favor introduza esta información para confirmar a operación: +settings.wiki_delete=Eliminar datos da wiki +settings.wiki_delete_desc=Unha vez borrados os datos da wiki non haberá volta atrás. Por favor, asegúrate de que é o que queres. +settings.wiki_delete_notices_1=- Isto eliminará e deshabilitará a wiki para %s +settings.wiki_deletion_success=Os datos da wiki do repositorio foron borrados correctamente. +settings.delete=Eliminar este repositorio +settings.delete_desc=Unha vez que eliminaches un repositorio, non hai volta atrás. Por favor, asegúrate de que é o que queres. +settings.delete_notices_1=- Esta operación NON SE PODE reverter. +settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access. +settings.delete_notices_fork_1=- Todos os forks converteranse en independentes tras o borrado. +settings.deletion_success=O repositorio foi eliminado satisfactoriamente! +settings.update_settings_success=As opcións do repositorio actualizáronse correctamente. +settings.transfer_owner=Novo propietario +settings.make_transfer=Transferir +settings.transfer_succeed=A propiedade do repositorio foi transferida exitosamente. +settings.confirm_delete=Confirmar eliminación +settings.add_collaborator=Engadir novo colaborador +settings.add_collaborator_success=O novo colaborador foi engadido. +settings.delete_collaborator=Eliminar +settings.collaborator_deletion=Eliminar colaborador +settings.collaborator_deletion_desc=Este usuario non poderá colaborar neste repositorio tras eliminalo. Desexa continuar? +settings.remove_collaborator_success=O colaborador foi eliminado. +settings.search_user_placeholder=Buscar usuario... +settings.org_not_allowed_to_be_collaborator=As organizacións non teñen permitido ser engadidas como colaboradores. +settings.hooks_desc=Os Webhooks permiten a servizos externos recibir notificacións cando sucedan certos eventos en Gogs. Cando sucedan os eventos especificados, enviaremos unha petición POST a cada unha das URLs indicadas. Para obter máis información, consulta a nosa Guía de Webhooks. +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=Engadir Webhook +settings.webhook_deletion=Eliminar Webhook +settings.webhook_deletion_desc=Ao borrar este webhook eliminarase a súa información e todo o seu historial. Desexa 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 os teus axustes de webhook +settings.webhook.test_delivery_success=Probar que os webhook foron engadidos á cola de entrega. Isto pode levar algúns segundos antes de aparecer no historial de entregas. +settings.webhook.redelivery=Redelivery +settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. +settings.webhook.request=Petición +settings.webhook.response=Resposta +settings.webhook.headers=Encabezado +settings.webhook.payload=Payload +settings.webhook.body=Corpo da mensaxe +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. +settings.githooks_desc=Os Git Hooks son unha funcionalidade do propio Git, podes editar os ficheiros dos hooks soportados na seguinte lista para aplicar operacións personalizadas. +settings.githook_edit_desc=Se o hook non está activo, mostrarase contido de exemplo. Deixar o contido baleiro deshabilitará este hook. +settings.githook_name=Nome do Hook +settings.githook_content=Contido do Hook +settings.update_githook=Actualizar Hook +settings.add_webhook_desc=Enviaremos unha petición POST á seguinte URL cos detalles de calquera evento subscrito. Tamén podes especificar que formato de datos che gustaría recibir (JSON, x-www-form-urlencoded, etc). Podes atopar máis información na Guía de Webhooks. +settings.payload_url=URL de Payload +settings.content_type=Tipo de contido +settings.secret=Secreto +settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. +settings.slack_username=Nome da persoa usuaria +settings.slack_icon_url=URL da icona +settings.slack_color=Cor +settings.event_desc=Que eventos che gustaría que desencadeasen este webhook? +settings.event_push_only=Só o evento push. +settings.event_send_everything=Necesito todo. +settings.event_choose=Déixeme elixir o que necesito. +settings.event_create=Crear +settings.event_create_desc=Rama ou etiqueta creada +settings.event_delete=Delete +settings.event_delete_desc=Branch or tag deleted +settings.event_fork=Fork +settings.event_fork_desc=Repository forked +settings.event_push=Push +settings.event_push_desc=Git push a un repositorio +settings.event_issues=Issues +settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=Issue Comment +settings.event_issue_comment_desc=Issue comment created, edited, or deleted. +settings.event_release=Release +settings.event_release_desc=Release published in a repository. +settings.active=Activo +settings.active_helper=Enviaremos detalles do evento cando este hook se dispare. +settings.add_hook_success=Engadiuse un novo webhook. +settings.update_webhook=Actualizar Webhook +settings.update_hook_success=Actualizouse o Webhook. +settings.delete_webhook=Borrar Webhook +settings.recent_deliveries=Envíos recentes +settings.hook_type=Tipo de Hook +settings.add_slack_hook_desc=Engade integración con Slack ao teu repositorio. +settings.add_discord_hook_desc=Add Discord integration to your repository. +settings.add_dingtalk_hook_desc=Add Dingtalk integration to your repository. +settings.slack_token=Token +settings.slack_domain=Dominio +settings.slack_channel=Canle +settings.deploy_keys=Claves de despregamento +settings.deploy_keys_helper=Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. +settings.add_deploy_key=Engadir clave de despregamento +settings.deploy_key_desc=A clave de desenvolvemento ten só acceso de lectura. Non é igual cás claves SSH das contas persoais. +settings.no_deploy_keys=Non engadiches ningunha clave de despregamento. +settings.title=Título +settings.deploy_key_content=Contido +settings.key_been_used=Usouse a clave de despregamento. +settings.key_name_used=Xa existe unha clave de despregamento co mesmo nome. +settings.add_key_success=A nova clave de despregamento '%s' foi creada con éxito! +settings.deploy_key_deletion=Eliminar clave de despregamento +settings.deploy_key_deletion_desc=Ao eliminar esta clave de despregamento perderase o permiso de acceso a este repositorio coa dita clave. Desexas continuar? +settings.deploy_key_deletion_success=Clave de despregamento eliminada con éxito! +settings.description_desc=Description of repository. Maximum 512 characters length. +settings.description_length=Available characters + +diff.browse_source=Explorar o código +diff.parent=pai +diff.commit=achega +diff.data_not_available=Os datos das diferenzas Diff non están dispoñibles. +diff.show_diff_stats=Mostrar estatísticas de Diff +diff.show_split_view=Dividir vista +diff.show_unified_view=Unificar vista +diff.stats_desc=Modificáronse %d ficheiros con %d adicións e %d borrados +diff.bin=BIN=BIN +diff.view_file=Ver ficheiro +diff.file_suppressed=A diferenza do arquivo foi suprimida porque é demasiado grande +diff.too_many_files=Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio + +release.releases=Lanzamentos +release.new_release=Novo lanzamento +release.draft=Borrador=Borrador +release.prerelease=Pre-Release=Pre-Lanzamento +release.edit=editar=editar +release.ahead=%d achegas en %s desde este release +release.source_code=Código fonte +release.new_subheader=Publicar releases do proxecto. +release.edit_subheader=Un rexistro de cambios detallado axudaralles ás persoas usuarias a comprender o que se mellorou. +release.tag_name=Nome da etiqueta +release.target=Destino +release.tag_helper=Escolle unha etiqueta ou crea unha nova ao publicar +release.title=Título +release.content=Contido +release.write=Escribir +release.preview=Vista previa +release.loading=Cargando... +release.prerelease_desc=Este é un pre-lanzamento +release.prerelease_helper=Este lanzamento está marcado como non apto para produción +release.cancel=Cancelar +release.publish=Publicar lanzamento +release.save_draft=Gardar borrador +release.edit_release=Editar lanzamento +release.delete_release=Borrar este lanzamento +release.deletion=Eliminar lanzamento +release.deletion_desc=Eliminar este lanzamento eliminará a etiqueta correspondente. Desexa continuar? +release.deletion_success=O lanzamento foi eliminado correctamente! +release.tag_name_already_exist=Xa existe un lanzamento con esta etiqueta. +release.tag_name_invalid=O nome da etiqueta non é válido. +release.downloads=Descargas + +[org] +org_name_holder=Nome da organización +org_full_name_holder=Nome completo da organización +org_name_helper=Os grandes nomes de organizacións son curtos e memorables. +create_org=Crear organización +repo_updated=Actualizado +people=Persoas +invite_someone=Invitar a alguén +teams=Equipos +lower_members=membros +lower_repositories=repositorios +create_new_team=Crear un novo equipo +org_desc=Descrición +team_name=Nome do equipo +team_desc=Descrición +team_name_helper=Utiliza este nome para mencionar este equipo nas conversas. +team_desc_helper=En que consiste este equipo? +team_permission_desc=Que nivel de permisos debería ter este equipo? + +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. + +settings=Configuración +settings.options=Opcións +settings.full_name=Nome completo +settings.website=Páxina web +settings.location=Localización +settings.update_settings=Actualizar configuración +settings.update_setting_success=A configuración da organización actualizouse correctamente. +settings.change_orgname_prompt=Este cambio afectaralles ás ligazóns que fan referencia á organización. +settings.update_avatar_success=A configuración de avatar da organización foi 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 maneira permanente, e NON SE PODE desfacer! +settings.confirm_delete_account=Confirmar eliminación +settings.delete_org_title=Eliminación da organización +settings.delete_org_desc=Esta organización vaise eliminar permanentemente, queres continuar? +settings.hooks_desc=Engadir webhooks que serán executados para todos os repositorios desta organización. + +members.membership_visibility=Visibilidade de membresía: +members.public=Público +members.public_helper=converter en privado +members.private=Privado +members.private_helper=converter en público +members.member_role=Rol do membro: +members.owner=Propietario +members.member=Membro +members.remove=Eliminar +members.leave=Abandonar +members.invite_desc=Engadir un membro novo a %s: +members.invite_now=Invitar + +teams.join=Unirse +teams.leave=Abandonar +teams.read_access=Acceso de lectura +teams.read_access_helper=Este equipo poderá ver e clonar os seus repositorios. +teams.write_access=Acceso de escritura +teams.write_access_helper=Este equipo poderá ler os seus repositorios, así como facer push neles. +teams.admin_access=Acceso de administrador +teams.admin_access_helper=Este equipo poderá facer push/pull nos seus repositorios, así como engadir colaboradores a eles. +teams.no_desc=Este equipo non ten descrición +teams.settings=Configuración +teams.owners_permission_desc=Os propietarios teñen acceso completo a todos os repositorios e teñen dereitos de administración na organización. +teams.members=Membros do equipo +teams.update_settings=Actualizar configuración +teams.delete_team=Eliminar este equipo +teams.add_team_member=Engadir membro ao equipo +teams.delete_team_title=Eliminar equipo +teams.delete_team_desc=Este equipo vai ser eliminado, seguro que queres continuar? Os membros deste equipo poden perder acceso a algúns repositorios. +teams.delete_team_success=O equipo foi eliminado correctamente. +teams.read_permission_desc=Este equipo ten permisos de lectura: os seus membros poden ver e clonar os repositorios do equipo. +teams.write_permission_desc=Este equipo ten permisos de escritura: os seus membros poden ler e facer push aos repositorios do equipo. +teams.admin_permission_desc=Este equipo ten permisos de administración: os seus membros poden leer, facer push e engadir colaboradores aos repositorios do equipo. +teams.repositories=Repositorios do equipo +teams.search_repo_placeholder=Buscar repositorio... +teams.add_team_repository=Engadir repositorio ao equipo +teams.remove_repo=Eliminar +teams.add_nonexistent_repo=O repositorio que estás intentando engadir non existe, por favor, créao primeiro. + +[admin] +dashboard=Panel de control +users=Persoas usuarias +organizations=Organizacións +repositories=Repositorios +authentication=Autenticacións +config=Configuración +notices=Notificacións do sistema +monitor=Monitorización +first_page=Primeira +last_page=Última +total=Total: %d + +dashboard.build_info=Build Information +dashboard.app_ver=Application version +dashboard.git_version=Git version +dashboard.go_version=Go version +dashboard.build_time=Build time +dashboard.build_commit=Build commit +dashboard.statistic=Estatísticas +dashboard.operations=Operacións +dashboard.system_status=Estado do Monitor do Sistema +dashboard.statistic_info=A base de datos de Gogs contén %d usuarios, %d organizacións, %d claves públicas, %d repositorios, %d vixiados, %d destacados, %d accións, %d accesos, %d incidencias, %d comentarios, %d contas de redes sociais, %d seguidores, %d mirrors, %d releases, %d fontes de login, %d webhooks, %d milestones, %d etiquetas, %d hooks, %d equipos, %d tarefas actualizadas, %d adxuntos. +dashboard.operation_name=Nome da operación +dashboard.operation_switch=Interruptor +dashboard.select_operation_to_run=Please select operation to run +dashboard.operation_run=Executar +dashboard.clean_unbind_oauth=Limpar solicitudes de OAuth sen confirmar +dashboard.clean_unbind_oauth_success=As solicitudes de OAuth sen confirmar elimináronse correctamente. +dashboard.delete_inactivate_accounts=Eliminar todas as contas inactivas +dashboard.delete_inactivate_accounts_success=Todas as contas inactivas foron eliminadas correctamente. +dashboard.delete_repo_archives=Eliminar todos os arquivos de repositorios +dashboard.delete_repo_archives_success=Todos os arquivos de repositorios elimináronse correctamente. +dashboard.delete_missing_repos=Borrar todos os rexistros dos repositorios para os que xa non se dispón dos arquivos Git +dashboard.delete_missing_repos_success=Todos os rexistros de repositorios para os que xa non se dispón dos arquivos Git elimináronse correctamente. +dashboard.git_gc_repos=Executar a recolección de lixo nos repositorios +dashboard.git_gc_repos_success=Todos os repositorios executaron correctamente o recolector de lixo. +dashboard.resync_all_sshkeys=Reescribir o ficheiro '.ssh/authorized_keys'(atención: perderanse as claves que non pertenzan a Gogs) +dashboard.resync_all_sshkeys_success=Todas as claves públicas reescribíronse correctamente. +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=Reinicializar todos os rexistros do repositorio que teñen arquivos Git eliminados +dashboard.reinit_missing_repos_success=Todos os rexistros do repositorio con arquivos Git eliminados foron reinicializados con éxito. + +dashboard.server_uptime=Tempo de actividade do servidor +dashboard.current_goroutine=Gorutinas actuais +dashboard.current_memory_usage=Uso de memoria actual +dashboard.total_memory_allocated=Total de memoria reservada +dashboard.memory_obtained=Memoria obtida +dashboard.pointer_lookup_times=Tempos de busca de punteiros +dashboard.memory_allocate_times=Tempos de reserva de memoria +dashboard.memory_free_times=Tempos de liberado de memoria +dashboard.current_heap_usage=Uso de Heap actual +dashboard.heap_memory_obtained=Memoria de Heap obtida +dashboard.heap_memory_idle=Memoria de Heap inactiva +dashboard.heap_memory_in_use=Memoria de Heap en uso +dashboard.heap_memory_released=Memoria de Heap liberada +dashboard.heap_objects=Obxectos no Heap +dashboard.bootstrap_stack_usage=Uso da Pila de Bootstrap +dashboard.stack_memory_obtained=Memoria de Pila obtida +dashboard.mspan_structures_usage=Uso de estruturas MSpan +dashboard.mspan_structures_obtained=Estruturas MSpan obtidas +dashboard.mcache_structures_usage=Uso de estruturas MCache +dashboard.mcache_structures_obtained=Estruturas MCache obtidas +dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table obtido +dashboard.gc_metadata_obtained=Metadatos do recolector de lixo obtidos +dashboard.other_system_allocation_obtained=Outros recursos do sistema asignados +dashboard.next_gc_recycle=Seguinte reciclado do recolector de lixo +dashboard.last_gc_time=Tempo desde o último GC +dashboard.total_gc_time=Tempo total por GC +dashboard.total_gc_pause=Pausa total por GC +dashboard.last_gc_pause=Última pausa por GC +dashboard.gc_times=Execucións GC + +users.user_manage_panel=Panel de xestión de usuarios +users.new_account=Crear nova conta +users.name=Nome +users.activated=Activado +users.admin=Administrador +users.repos=Repositorios +users.created=Creado +users.send_register_notify=Enviar notificación de rexistro á persoa usuaria +users.new_success=A conta '%s' foi creada con éxito. +users.edit=Editar +users.auth_source=Fonte de autenticación +users.local=Local +users.auth_login_name=Nome de inicio de sesión de autenticación +users.password_helper=Deixe o campo baleiro se non desexa cambiar o contrasinal. +users.update_profile_success=O perfil da conta actualizouse correctamente. +users.edit_account=Editar conta +users.max_repo_creation=Límite máximo de repositorios +users.max_repo_creation_desc=(Configura a -1 para usar o límite global por defecto) +users.is_activated=Esta conta está activada +users.prohibit_login=Esta conta non ten permitido ingresar +users.is_admin=Esta conta ten permisos de administrador +users.allow_git_hook=Esta conta ten permisos para crear hooks de Git +users.allow_import_local=Esta conta dispón de permisos para importar repositorios locais +users.update_profile=Actualizar o perfil da conta +users.delete_account=Eliminar esta conta +users.still_own_repo=Esta conta é propietaria dun ou máis repositorios, tes que borralos ou transferilos primeiro. +users.still_has_org=Esta conta é membro dunha ou máis organizacións, tes que abandonalas ou eliminalas primeiro. +users.deletion_success=A túa conta foi eliminada correctamente! + +orgs.org_manage_panel=Panel de xestión de organización +orgs.name=Nome +orgs.teams=Equipos +orgs.members=Membros + +repos.repo_manage_panel=Panel de xestión de repositorios +repos.owner=Propietario +repos.name=Nome +repos.private=Privado +repos.watches=Vixilantes +repos.stars=Estrelas +repos.issues=Incidencias +repos.size=Size + +auths.auth_sources=Authentication Sources +auths.new=Engadir nova orixe +auths.name=Nome +auths.type=Tipo +auths.enabled=Activo +auths.default=Default +auths.updated=Actualizado +auths.auth_type=Tipo de autenticación +auths.auth_name=Nome de autenticación +auths.security_protocol=Protocolo de seguridade +auths.domain=Dominio +auths.host=Host +auths.port=Porto +auths.bind_dn=Bind DN +auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s +auths.bind_password=Contrasinal Bind +auths.bind_password_helper=Advertencia: o contrasinal almacénase como texto plano. Non empregue unha conta con privilexios elevados. +auths.user_base=Base de busca de usuarios +auths.user_dn=DN de persoas usuarias +auths.attribute_username=Atributo de nome de usuario +auths.attribute_username_placeholder=Deixar baleiro para usar o campo de inicio de sesión como nome de usuario. +auths.attribute_name=First Name Attribute +auths.attribute_surname=Atributo apelido +auths.attribute_mail=Atributo correo electrónico +auths.verify_group_membership=Verify group membership +auths.group_search_base_dn=Group Search Base DN +auths.group_filter=Group Filter +auths.group_attribute_contain_user_list=Group Attribute Containing List of Users +auths.user_attribute_listed_in_group=User Attribute Listed in Group +auths.attributes_in_bind=Buscar atributos no contexto do Bind DN +auths.filter=Filtro de usuario +auths.admin_filter=Filtro de aministrador +auths.ms_ad_sa=Ms Ad SA +auths.smtp_auth=Tipo de autenticación SMTP +auths.smtphost=SMTP Host +auths.smtpport=Porto SMTP +auths.allowed_domains=Dominios permitidos +auths.allowed_domains_helper=Deixe o campo baleiro se non desexa restrinxir ningún dominio. Para restrinxir máis dun, separe os dominios cunha coma ','. +auths.enable_tls=Habilitar cifrado TLS +auths.skip_tls_verify=Omitir a verificación TLS +auths.pam_service_name=Nome do servizo PAM +auths.enable_auto_register=Habilitar auto-rexistro +auths.edit=Editar a configuración de autenticación +auths.activated=Esta autenticación foi activada +auths.default_auth=This authentication is default login source +auths.new_success=A autenticación '%s' foi engadida con éxito! +auths.update_success=A configuración de autenticación foi actualizada con éxito. +auths.update=Actualizar a 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. Desexas continuar? +auths.still_in_used=Este método de autentificación aínda é utilizado por algúns usuarios, por favor elimine ou converta estes usuarios a outro tipo de autentificación. +auths.deletion_success=A autenticación foi eliminada con éxito! +auths.login_source_exist=Login source '%s' xa existe. +auths.github_api_endpoint=API Endpoint + +config.not_set=(not set) +config.server_config=Configuración do servidor +config.brand_name=Brand name +config.run_user=Executada como usuario +config.run_mode=Modo de execución +config.server.external_url=External URL +config.server.domain=Domain +config.server.protocol=Protocol +config.server.http_addr=HTTP address +config.server.http_port=HTTP port +config.server.cert_file=Certificate file +config.server.key_file=Key file +config.server.tls_min_version=Minimum TLS version +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Enable Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL + +config.ssh_config=Configuración SSH +config.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Repository configuration +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit + +config.db_config=Configuración da base de datos +config.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification + +config.session_config=Configuración da sesión +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie + +config.cache_config=Configuración da caché +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP configuration +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit + +config.picture_config=Configuración de imaxe +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Configuración de Webhooks +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Configuración de git +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path + +config.log_config=Configuración do log +config.log_file_root_path=Ruta dos ficheiros de log +config.log_mode=Mode +config.log_options=Options + +monitor.cron=Tarefas de cron +monitor.name=Nome +monitor.schedule=Axenda +monitor.next=Seguinte +monitor.previous=Anterior +monitor.execute_times=Execucións +monitor.process=Procesos en execución +monitor.desc=Descrición +monitor.start=Hora de inicio +monitor.execute_time=Tempo de execución + +notices.system_notice_list=Notificacións do sistema +notices.view_detail_header=Ver detalles da notificación +notices.actions=Accións +notices.select_all=Seleccionar todo +notices.deselect_all=Deseleccionar todo +notices.inverse_selection=Selección inversa +notices.delete_selected=Eliminar seleccionado +notices.delete_all=Eliminar todas as notificacións +notices.type=Tipo +notices.type_1=Repositorio +notices.desc=Descrición +notices.op=Op. +notices.delete_success=As notificacións do sistema foron eliminadas satisfactoriamente. + +[action] +create_repo=creou o repositorio %s +rename_repo=repositorio renomeado de %[1]s a %[3]s +commit_repo=fixo push a %[3]s en %[4]s +compare_commits=Ver comparación destas %d achegas +transfer_repo=transferiu o repositorio %s a %s +create_issue=`incidencia aberta %s#%[2]s` +close_issue=`cerrou a incidencia %s#%[2]s` +reopen_issue=`reabriu a incidencia %s#%[2]s` +comment_issue=`comentou na incidencia %s#%[2]s` +create_pull_request=`creado pull request %s#%[2]s` +close_pull_request=`cerrou o pull request %s#%[2]s` +reopen_pull_request=`reabriu o pull request %s#%[2]s` +merge_pull_request=`fusionado pull request %s#%[2]s` +create_branch=created new branch %[3]s at %[4]s +delete_branch=deleted branch %[2]s at %[3]s +push_tag=fixo push do tag %[2]s a %[3]s +delete_tag=deleted tag %[2]s at %[3]s +fork_repo=forked a repository to %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror + +[tool] +ago=hai +from_now=dende agora +now=agora +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 ano +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=%s %d anos +raw_seconds=segundos +raw_minutes=minutos +raw_hours=hours + +[dropzone] +default_message=Sólteos aquí ou pulse para cargar arquivos. +invalid_input_type=Non está permitido cargar arquivos deste tipo. +file_too_big=O tamaño do arquivo ({{filesize}} MB) excede o tamaño máximo ({{maxFilesize}} MB). +remove_file=Eliminar arquivo + diff --git a/conf/locale/locale_hu-HU.ini b/conf/locale/locale_hu-HU.ini new file mode 100644 index 00000000000..01a042eb76b --- /dev/null +++ b/conf/locale/locale_hu-HU.ini @@ -0,0 +1,1434 @@ +app_desc=Fájdalommentes, saját gépre telepíthető Git szolgáltatás + +home=Kezdőlap +dashboard=Áttekintés +explore=Felfedezés +help=Súgó +sign_in=Bejelentkezés +sign_out=Kijelentkezés +sign_up=Regisztráció +register=Regisztráció +website=Weboldal +page=Oldal +template=Sablon +language=Nyelv +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=Ellenőrző kó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 tároló másolása +new_org=Új szervezet +manage_org=Szervezetek kezelése +admin_panel=Rendszergazdai felület +account_settings=Fiók beállításai +settings=Beállítások +your_profile=Profilom +your_settings=Beállításaim + +activities=Tevékenységek +pull_requests=Pull request-ek +issues=Problémák + +cancel=Mégse + +[status] +page_not_found=Az oldal nem található +internal_server_error=Belső kiszolgálóhiba + +[install] +install=Telepítés +title=Telepítés első indításkor +docker_helper=Ha Docker alatt fut a Gogs, akkor kérjük, figyelmesen olvassa el az irányelveket, mielőtt bármit megváltoztat ezen az oldalon! +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). +db_title=Adatbázis beállításai +db_type=Adatbázis-kezelő +host=Kiszolgáló +user=Felhasználónév +password=Jelszó +db_name=Adatbázis neve +db_schema=Schema +db_helper=MySQL szerveren kérjük használjon INNODB motort utf8_general_ci karakterkészlettel. +ssl_mode=SSL mód +path=Elérési út +sqlite_helper=SQLite3 vagy a TiDB adatbázis fájljának elérési útvonala.
Kérjük használja az abszolút elérési utat, a szolgáltatás indításakor. +err_empty_db_path=SQLite3 adatbázis elérési út nem lehet üres. +no_admin_and_disable_registration=Nem tilthatja le a regisztrációt, amíg nem hoz létre egy rendszergazdai fiókot. +err_empty_admin_password=Rendszergazdai jelszó nem lehet üres. + +general_title=Alkalmazás általános beállításai +app_name=Alkalmazás neve +app_name_helper=Adjon meg valami izgalmas nevet! +repo_path=Tárolók alapkönyvtára +repo_path_helper=Ebben a könyvtárban lesznek a Git tárolók. +run_user=Futtató felhasználó +run_user_helper=Ezen felhasználónak jogosultnak kell lennie a tárolók elérésére és a Gogs futtatására. +domain=Tartomány +domain_helper=Ez befolyásolja az SSH klón URL-eket. +ssh_port=SSH port +ssh_port_helper=Ezt a portot fogja használni az SSH szerver, hagyja üresen az SSH letiltásához. +use_builtin_ssh_server=Beépített SSH szerver használata +use_builtin_ssh_server_popup=Indítsa el a beépített SSH szervert a Git műveletekhez elkülönítve a rendszer SSH démontól. +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 a HTTP/HTTPS másolás URL címében és e-mailekben használatos. +log_root_path=Naplófájl elérési útja +log_root_path_helper=Naplófájlok könyvtára. +enable_console_mode=Konzol-üzemmód engedélyezése +enable_console_mode_popup=Naplófájl írása mellett a naplóbejegyzések nyomtatása a konzolra. +default_branch=Default Branch + +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ója, RFC 5322. Lehet pusztán e-mail cím, vagy "Név" formátumú. +mailer_user=Felhasználónév +mailer_password=Jelszó +register_confirm=Regisztráció megerősítésének engedélyezése +mail_notify=Email értesítés engedélyezése +server_service_title=Szerver és egyéb szolgáltatások beállítása +offline_mode=Kapcsolat nélküli mód engedélyezése +offline_mode_popup=CDN kikapcsolása éles üzemmódban is, minden fájl helyi példányát adjuk. +disable_gravatar=Gravatar kikapcsolása +disable_gravatar_popup=Gravatar és egyedi források kikapcsolása, minden avatárt a felhasználók töltenek fel. +federated_avatar_lookup=Engedélyezi a független avatarokat +federated_avatar_lookup_popup=Eggyesített profilkép keresés a nyílt forráskódú libravatar szolgáltatás segítségével. +disable_registration=Önregisztráció kikapcsolása +disable_registration_popup=Ön-regisztráció kikapcsolása, csak a rendszergazda hozhat létre fiókot. +enable_captcha=Ellenőrző kód engedélyezése +enable_captcha_popup=Ellenőrző kódot kér a felhasználói regisztrációná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ő oldalt láthatják. +admin_setting_desc=Nem szükséges most beállítania rendszergazdai fiókot, mert az első felhasználó (ID=1) automatikusan rendszergazdai jogokat 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=Rendszergazda e-mail +install_gogs=Gogs telepítése +test_git_failed=Hibát adott a 'git' parancs: %v +sqlite3_not_available=Ez a verzió nem támogatja az SQLite3-at, kérlek töltsd le a hivatalos bináris verziót (%s), NE a gobuild változatot. +invalid_db_setting=Hibás adatbázis-beállítás: %v +invalid_repo_path=Hibás tároló-alapkönyvtár: %v +run_user_not_match=Futtató felhasználó más, mint az aktuális felhasználó: %s -> %s +smtp_host_missing_port=Az SMTP kiszolgáló címéből hiányzik a portszám. +invalid_smtp_from=Érvénytelen SMTP Feladó mező: %v +save_config_failed=Hiba a beállítások tárolásakor: %v +init_failed=Nem sikerült inicializálni az alkalmazást: %v +invalid_admin_setting=Hibás a rendszergazdai fiók beállítása: %v +install_success=Üdv! Örülünk, hogy a Gogs-ot választottad, érezd jól magad és viseld gondját. +invalid_log_root_path=Naplózás gyökérmappa érvénytelen: %v + +[home] +uname_holder=Felhasználónév vagy email +password_holder=Jelszó +switch_dashboard_context=Vezérlőpult környezet váltása +my_repos=Tárolóim +show_more_repos=Mutassa a többi tárolót... +collaborative_repos=Együttműködő tárolók +my_orgs=Szervezeteim +my_mirrors=Tükreim +view_home=%s megtekintése + +issues.in_your_repos=A tárolóidban + +[explore] +repos=Tárolók +users=Felhasználók +organizations=Szervezetek +search=Keresés + +[auth] +create_new_account=Új fiók létrehozása +register_hepler_msg=Van már felhasználói fiókja? Jelentkezz be! +social_register_hepler_msg=Van már fiókod? Csatold most! +disable_register_prompt=Elnézést, a regisztrációt kikapcsolták. Kérlek szólj az oldal adminisztrátorának. +disable_register_mail=Elnézést, az email regisztráció megerősítését kikapcsolták. +auth_source=Hitelesítési forrás +local=Helyi +remember_me=Emlékezz rám +forgot_password=Elfelejtett jelszó +forget_password=Elfelejtette a jelszavát? +sign_up_now=Szeretne bejelentkezni? Regisztráljon most. +confirmation_mail_sent_prompt=Új megerősítő emailt küldtünk %s címre, kérlek keresd a postafiókodban az elkövetkező %d órában, hogy befejezhesd a regisztrációs folyamatot. +active_your_account=Aktiváld a fiókod +prohibit_login=A bejelentkezés tiltva +prohibit_login_desc=A fiókjával bejelentkezés le van tiltva, vegye fel a kapcsolatot az adminisztátorral. +resent_limit_prompt=Elnézést, nemrég kértél aktiváló emailt. Kérlek várj 3 percet, aztán próbáld újra. +has_unconfirmed_mail=Szia %s, van egy nem megerősített email címed (%s). Ha még nem kapták megerősítő emailt, vagy újat küldenél, kérlek kattints az alábbi gombra. +resend_mail=Kattints ide hogy újraküldd az aktiváló emailt +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, a megerősítő kód lejárt vagy hibás. +reset_password_helper=A jelszó visszaállításához kattintson ide +password_too_short=A jelszó nem lehet 6-nál rövidebb. +non_local_account=Nem helyi felhasználó nem cserélhet jelszót a Gogsban. + +login_two_factor=Kétlépcsős hitelesítés +login_two_factor_passcode=Hitelesítő kód +login_two_factor_enter_recovery_code=Adja meg a kétlépcsős hitelesítés helyreállító kódját +login_two_factor_recovery=Kétlépcsős hitelesítés helyreállítása +login_two_factor_recovery_code=Helyreállító kód +login_two_factor_enter_passcode=Adja meg a kétlépcsős hitelesítés kódját +login_two_factor_invalid_recovery_code=Helyreállító kód már felhasználásra került, vagy nem érvényes. + +[mail] +activate_account=Kérlek aktiváld a fiókod +activate_email=Ellenőrizd az email címed +reset_password=Állítsd vissza a jelszavad +register_success=Sikeres regisztráció, üdvözöljük +register_notify=Üdvözlünk a fedélzeten + +[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=Csapat neve +AuthName=Engedélyezési név +AdminEmail=Rendszergazdai e-mail + +NewBranchName=Az új branch neve +CommitSummary=Commit összegzés +CommitMessage=Commit üzenet +CommitChoice=Véglegesítés választása +TreeName=Elérési út +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.` +alpha_dash_dot_slash_error=` betű, szám, kötőjel (-_) illetve pont vagy perjel karakterek lehetnek.` +size_error=` %s hosszú kell.` +min_size_error=` legalább %s karaktert kell tartalmaznia.` +max_size_error=` legfeljebb %s karaktert tartalmazhat.` +email_error=` nem valódi email cím.` +url_error=` nem érvényes URL.` +include_error=` tartalmaznia kell a '%s' karakterláncot.` +unknown_error=Ismeretlen hiba: +captcha_incorrect=Az ellenőrző kód hibás. +password_not_match=A jelszó és megerősítése nem egyeztek meg. + +username_been_taken=A 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=Az a csapatnév már foglalt. +email_been_used=Ezt az email címet már felhasználták. +username_password_incorrect=Felhasználó név vagy jelszó hibás. +auth_source_mismatch=A kijelölt hitelesítési forráshoz nincs társítva a felhasználó. +enterred_invalid_repo_name=Kérjük, ellenőrizze, hogy a tároló neve helyes. +enterred_invalid_owner_name=Kérjük, ellenőrizze, hogy a tulajdonos neve helyes. +enterred_invalid_password=Kérlek ellenőrizd, hogy a beírt jelszó helyes. +user_not_exist=A megadott felhasználó nem létezik. +last_org_owner=Az utolsó felhasználót nem lehet eltávolítani a csapatból, mert egy tulajdonos kell legyen minden szervezetben. + +invalid_ssh_key=Elnézést, nem tudtuk ellenőrizni az SSH kulcsod: %s +unable_verify_ssh_key=A Gogs nem tudja ellenőrizni a SSH kulcsod, de azt feltételezzük, hogy az érvényes, Kérem figyelmesen ellenőrizze. +auth_failed=Hitelesítési hiba: %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 átadni másnak a tulajdonjogaikat. +still_has_org=A fiókod még mindig tagja legalább egy szervezetnek. Először ki kell lépned vagy törölnöd kell a tagságodat. +org_still_own_repo=Ez a szervezet továbbra is tulajdonosa tárolóknak, ezért előbb törölje vagy adja át másnak a tárolókat. + +target_branch_not_exist=Cél branch nem létezik. + +[user] +change_avatar=Profilkép megváltoztatása +join_on=Csatlakozott +repositories=Tárolók +activity=Nyilvános működés +followers=Követők +starred=Kedvencek +following=Követve +follow=Követés +unfollow=Követés törlése + +form.name_not_allowed=A %q felhasználónév, vagy minta nem engedélyezett. + +[settings] +profile=Profil +password=Jelszó +avatar=Profilkép +ssh_keys=SSH kulcsok +security=Biztonság +repos=Tárolók +orgs=Szervezetek +applications=Alkalmazások +delete=Fiók törlése + +public_profile=Nyilvános profil +profile_desc=Az e-mail címe nyilvános, és ezt fogják használni a fiókkal kapcsolatos bármilyen értesítéshez, illetve az oldalon keresztül elvégzett bármilyen webalapú művelethez. +password_username_disabled=A nem helyi típusú felhasználók nem változtathatják meg felhasználónevüket. +full_name=Teljes név +website=Weboldal +location=Lakhely +update_profile=Profil frissítése +update_profile_success=A profilod frissítése megtörtént. +change_username=Felhasználónév megváltoztatva +change_username_prompt=Ez a változtatás kihat a fiókoddal kapcsolatos hivatkozásokra. +continue=Tovább +cancel=Mégse + +lookup_avatar_by_mail=Profilkép keresése e-mail alapján +federated_avatar_lookup=Összevont profilkép keresés +enable_custom_avatar=Egyedi profilkép engedélyezése +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=Az profilkép beállításaid frissítése megtörtént. + +change_password=Jelszó megváltoztatása +old_password=Eddigi jelszó +new_password=Új jelszó +retype_new_password=Új jelszó megerősítése +password_incorrect=A megadott jelszó helytelen. +change_password_success=Jelszavad sikeresen megváltozott. Most már az új jelszavadat használhatod. +password_change_disabled=Csak helyi felhasználók változtathatják meg jelszavukat. + +emails=E-mail címek +manage_emails=E-mail címek kezelése +email_desc=Elsődleges e-mail címét 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=E-mail cím törlése +email_deletion_desc=Az e-mail cím törlése kapcsolódó adatokat is eltávolít a fiókjából. Biztosan folytatja? +email_deletion_success=Az e-mail címet töröltük! +email_deletion_primary=Cannot delete primary email address. +add_new_email=Új email cím felvétele +add_email=Email felvétele +add_email_confirmation_sent=Egy új megerősítő e-mailt küldtünk a(z) '%s' címre. Kérlek ellenőrizd a beérkező üzeneteidet %d órán belül, hogy befejezd a megerősítési folyamatot. +add_email_success=Az új email címed felvétele megtörtént. + +manage_ssh_keys=SSH Kulcsok Kezelése +add_key=Kulcs hozzáadása +ssh_desc=Ez a fiókodhoz társított összes SSH kulcs listája. Mivel ezek a kulcsok a birtokosuknak hozzáférést adnak a repository-jaidhoz, ezért különösen fontos, hogy felismerd mindegyiket. +ssh_helper=Nem tudod hogyan? Nézd meg a GitHub útmutatóját saját SSH kulcsok generálásához vagy nézz utána a gyakori problémáknak amikkel az SSH használata közben találkozhatsz. +add_new_key=SSH kulcs hozzáadása +ssh_key_been_used=Nyilvános kulcs tartalma már fel lett használva. +ssh_key_name_used=Már létezik egy ilyen nevű nyilvános kulcs. +key_name=Kulcs neve +key_content=Tartalom +add_key_success=Az új SSH kulcsot ('%s') sikeresen hozzáadtuk! +delete_key=Törlés +ssh_key_deletion=SSH kulcs törlése +ssh_key_deletion_desc=Az SSH kulcs törlése minden kapcsolódó hozzáférést töröl a fiókodból. Biztosan folytatod? +ssh_key_deletion_success=Az SSH kulcsot sikeresen töröltük! +add_on=Hozzáadva +last_used=Utolsó használat +no_activity=Mostanság nem használt +key_state_desc=Ezt a kulcsot az utóbbi 7 napban használták +token_state_desc=Ezt a jegyet az utóbbi 7 napban használták + +two_factor=Kétlépcsős hitelesítés +two_factor_status=Állapot: +two_factor_on=Be +two_factor_off=Ki +two_factor_enable=Engedélyezés +two_factor_disable=Letiltás +two_factor_view_recovery_codes=Nézze meg és mentse el a helyreállító kódjait egy biztonságos helyre. Használhatja őket mint jelkód, ha elveszti a hozzáférést az alkalmazáshoz. +two_factor_http=HTTP/HTTPS műveletekhez nem használhatja többet a felhasználónevét és jelszavát, helyette hozzon létre személyes hozzáférési tokent és használja azt. Pl.: %[3]s. +two_factor_enable_title=Kétlépcsős hitelesítés engedélyezése +two_factor_scan_qr=Kérjük, használja a hitelesítési alkalmazását és olvassa be vele az alábbi képet: +two_factor_or_enter_secret=Vagy adja meg a titkos kódot: +two_factor_then_enter_passcode=Ezután írja be ezt a jelkódot: +two_factor_verify=Ellenőrzés +two_factor_invalid_passcode=Érvénytelen a megadott jelkód, próbálja meg újra! +two_factor_reused_passcode=A megadott PIN-kód már használatban van. Kérem válasszon másikat! +two_factor_enable_error=Kétlépcsős hitelesítés engedélyezése sikertelen: %v +two_factor_enable_success=Kétlépcsős hitelesítés sikeresen engedélyezve a fiókjához! +two_factor_recovery_codes_title=Kettőlépcsős hitelesítés helyreállítási kódok +two_factor_recovery_codes_desc=A helyreállítási kódok akkor használhatóak, ha elveszti hozzáférését az alkalmazáshoz. Minden kód csak egyszer használható, kérjük tartsa biztonságos helyen. +two_factor_regenerate_recovery_codes=A helyreállító kódok újragenerálása +two_factor_regenerate_recovery_codes_error=A helyreállító kódok újragenerálása sikertelen: %v +two_factor_regenerate_recovery_codes_success=A helyreállítókódok sikeresen újragenerálva! +two_factor_disable_title=Kétlépcsős hitelesítés letiltása +two_factor_disable_desc=A fiók biztonsági szintje csökken, miután kikacsolja a kétlépcsős hitelesítést. Biztosan folytatja? +two_factor_disable_success=Kétlépcsős hitelesítés sikeresen letiltva a fiókjához! + +manage_access_token=Személyes hozzáférési jegyek kezelése +generate_new_token=Új jegy generálása +tokens_desc=A generált jegyekkel hozzáférhetsz a Gogs API-hoz. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. +new_token_desc=Minden jegy teljes hozzáférést ad a fiókodhoz. +token_name=Jegy neve +generate_token=Jegy generálása +generate_token_succees=A hozzáférési jegy sikeresen elkészült! Másold le most azonnal, később már nem látod viszont! +delete_token=Törlés +access_token_deletion=Személyes hozzáférési jegy törlése +access_token_deletion_desc=Az SSH kulcs törlése minden kapcsolódó hozzáférést töröl a fiókodból. Biztosan folytatod? +delete_token_success=A személyes hozzáférési tokened eltávolítása megtörtént! Ne felejtsd el frissíteni az alkalmazásod is. +token_name_exists=Már létezik ilyen nevű szerepkör. + +orgs.none=Nem vagy tagja egy szervezeti elemnek sem. +orgs.leave_title=Szervezet elhagyása +orgs.leave_desc=Elveszít minden jogosultágot a tárolókhoz és csoportokhoz miután elhagyja a szervezetet. Biztosan folytatja? + +repos.leave=Elhagyás +repos.leave_title=Tároló elhagyása +repos.leave_desc=Elveszik minden jogosultsága a tárolóhoz miután távozik. Biztosan folytatja? +repos.leave_success=Sikeresen elhagyta a '%s' tárolót! + +delete_account=Fiók Törlése +delete_prompt=Ez a művelet véglegesen törli a fiókod és NEM vonható vissza! +confirm_delete_account=Törlés megerősítése +delete_account_title=Fióktörlés +delete_account_desc=Ez a fiók véglegesen törölve lesz, szeretné folytatni? + +[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 +unlisted=Unlisted +visiblity_helper=Ez egy privát tároló +unlisted_helper=This repository is Unlisted +visiblity_helper_forced=Az oldal adminisztrátora kötelezővé tette, hogy minden új repository Privát legyen +visiblity_fork_helper=(Az érték megváltoztatása kihat minden fork-ra) +clone_helper=Segítség kell a klónozáshoz? Látogasd meg a Súgót! +fork_repo=Tároló forkolása +fork_from=Másolás innen +fork_visiblity_helper=Nem módosíthatod egy fork-olt repository láthatóságát. +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 readme 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 branch +mirror_prune=Prune +mirror_prune_desc=Minden olyan követési referencia törlése, mely már nem érhető el a távoli oldalon +mirror_interval=Tükrözés Időköze (óra) +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 szinkr. +watchers=Figyelők +stargazers=Csillagvizsgálók +forks=Másolások +repo_description_helper=Tároló leírása. Maximum 512 karakter hosszúságú. +repo_description_length=Rendelkezésre álló karakterek + +form.reach_limit_of_creation=A tulajdonos túllépte a maximum létrehozható tárolók számát (%d). +form.name_not_allowed=A %q repository név, vagy minta nem engedélyezett. + +need_auth=Hitelesítés szükséges +migrate_type=Migráció típusa +migrate_type_helper=Ez a repository tükörként fog működni +migrate_repo=Tároló migrálása +migrate.clone_address=Klón cím +migrate.clone_address_desc=Ez lehet egy HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=Migrálhat tárolót a helyi fájlrendszerből is az útvonal megadásával. +migrate.permission_denied=Az Ön számára nem engedélyezett a helyi tároló importálása. +migrate.invalid_local_path=Érvénytelen helyi elérési út; nem létezik vagy nem mappára mutat. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. +migrate.failed=Migráció sikertelen: %v + +mirror_from=tükrözi: +forked_from=másolva +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=Nem Kedvenc +star=Kedvenc +fork=Másolás + +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ő repository feltöltése parancssorból +bare_message=A tároló nem tartalmaz semmit, üres. + +files=Fájlok +branch=Branch +tree=Fa +filter_branch_and_tag=Branch vagy tag szűrése +branches=Branch-ok +tags=Tag-ek +issues=Problémák +pulls=Beolvasztási kérések +labels=Címkék +milestones=Mérföldkövek +commits=Commit-ok +git_branches=Ágak +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 ahhoz, hogy megjelenítsük +video_not_supported_in_browser=A böngésző nem támogatja a HTML5 video elemet. + +branches.overview=Összefoglaló +branches.active_branches=Aktív ág +branches.stale_branches=Elavult ágak +branches.all=Minden ág +branches.updated_by=Frissítve ekkor: %[1]s %[2]s által +branches.change_default_branch=Alapértelmezett ág megváltoztatása +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=Új fájl +editor.upload_file=Fájl feltöltése +editor.edit_file=Fájl szerkesztése +editor.preview_changes=Előnézet +editor.cannot_edit_non_text_files=Csak szöveges állomány szerkeszthető +editor.edit_this_file=Fájl szerkesztése +editor.must_be_on_a_branch=Egy ágat kell használnia, hogy változtatásokat végezhessen, vagy javasolhasson ehhez a fájlhoz +editor.fork_before_edit=Forkolnod kell a repot, hogy szerkeszthesd a fájlt +editor.delete_this_file=A fájl törlése +editor.must_have_write_access=Írási jogosultság szükséges hogy módosíthassa, vagy módosításokat javasolhasson ehhez a fájlhoz +editor.file_delete_success='%s' fájl sikeresen törölve lett! +editor.name_your_file=Adj nevet a fájlnak... +editor.filename_help=Egy könyvtár hozzáadásához használja a /-t. Egy könyvtár eltávolításához menyjen a mező elejére és nyomjon backspacet. +editor.or=vagy +editor.cancel_lower=mégsem +editor.commit_changes=Változások véglegesítése +editor.add_tmpl=Adja hozzá a '%s/' +editor.add=Hozzáadás a(z) "%s" +editor.update=Frissítés "%s" +editor.delete=Törölje a "%s" +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=Új ág létrehozása ennek a véglegesítésére és beolvasztási kérés indítása. +editor.new_branch_name_desc=Új ág neve... +editor.cancel=Mégse +editor.filename_cannot_be_empty=A fájlnév nem lehet üres. +editor.branch_already_exists=A(z) '%s' branch már létezik ebben a repositoryban. +editor.directory_is_a_file=A '%s' útvonal egy fájl és nem egy könyvtár a tárolóban. +editor.file_is_a_symlink=A '%s' egy szimbolikus hivatkozás, ami nem módosítható a webes szerkesztőből. +editor.filename_is_a_directory=A(z) '%s' fájlnév egy létező könyvtár ebben a tárolóban. +editor.file_editing_no_longer_exists=A(z) '%s' fájl amit szerkeszt már nem létezik a tárolóban. +editor.file_changed_while_editing=A fájl tartalma megváltozott mióta elkezdte szerkeszteni. Kattintson ide hogy megtekintse mi változott vagy nyomja meg a commit-ot újra, hogy felülírja a változá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 frissíteni/létrehozni a következő fájlt: '%s' A hiba oka: %v +editor.fail_to_delete_file=Nem sikerült törölni 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 '%s' + +commits.commit_history=Commit történet +commits.commits=Commit-ok +commits.search=Commit-ok Keresése +commits.find=Keresés +commits.author=Szerző +commits.message=Üzenet +commits.date=Dátum +commits.older=Korábbi +commits.newer=Újabb + +issues.new=Új probléma +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ő kiürítése +issues.new.open_milestone=Nyitott mérföldkövek +issues.new.closed_milestone=Zárt mérföldkövek +issues.new.assignee=Megbízott +issues.new.clear_assignee=Megbízott kiürítése +issues.new.no_assignee=Nincs megbízott +issues.create=Problémák 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 cimkék. Kattintson az "Új Címke" gombra felül egy új létrehozásához, vagy választhat egyet a már létezőt a lenti listából. +issues.label_templates.helper=Címke ké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.open_tab=%d nyitott +issues.close_tab=%d zárt +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=Összes probléma +issues.filter_type.assigned_to_you=Önhöz rendelt +issues.filter_type.created_by_you=Az Ön által létrehozott +issues.filter_type.mentioning_you=Megemlíti önt +issues.filter_sort=Rendezés +issues.filter_sort.latest=Legújabb +issues.filter_sort.oldest=Legrégebbi +issues.filter_sort.recentupdate=Legfrissebbek +issues.filter_sort.leastupdate=Legkevésbbé friss +issues.filter_sort.mostcomment=Legtöbbet hozzászólt +issues.filter_sort.leastcomment=Legkevesebbet hozzászólt +issues.opened_by=megnyitva ekkor: %[1]s %[3]s által +issues.opened_by_fake=megnyitva ekkor: %[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 benne, hogy törölni akarja ezt a hozzászólást? +issues.no_content=Még nincs tartalom. +issues.close_issue=Bezárás +issues.close_comment_issue=Hozzászólás és bezárás +issues.reopen_issue=Újbóli megnyitás +issues.reopen_comment_issue=Hozzászólás és újra megnyitás +issues.create_comment=Hozzászólás +issues.closed_at=`lezárta ekkor: %[2]s` +issues.reopened_at=`kinyitotta ekkor: %[2]s` +issues.commit_ref_at=`hivatkozott erre a hibajegyre egy commit-ban ekkor: %[2]s` +issues.poster=Bejelentő +issues.collaborator=Közreműködő +issues.owner=Tulajdonos +issues.sign_in_require_desc=Jelentkezzen be hogy csatlakozhasson a beszélgetéshez. +issues.edit=Szerkesztés +issues.cancel=Mégse +issues.save=Mentés +issues.label_title=Cimke 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ésével minden vele kapcsolatos információ törlésre kerül a hibajegyekből. Folytatod? +issues.label_deletion_success=A címke törlése megtörtént! +issues.num_participants=%d Résztvevő +issues.attachment.open_tab=`Megnyitás "%s" új fülön` +issues.attachment.download=`Letöltéshez kattints "%s"` + +pulls.new=Új beolvasztási kérés +pulls.compare_changes=Összehasonlítás +pulls.compare_changes_desc=Hasonlíts össze két branch-ot és készíts pull kérést a változtatásokkal. +pulls.compare_base=base +pulls.compare_compare=összehasonlítás +pulls.filter_branch=Branch szűrése +pulls.no_results=Nincs találat. +pulls.nothing_to_compare=Nincs mit összehasonlítani, mert a base és a head branch egyezik. +pulls.nothing_merge_base=Nincs mit összehasonlítani, mert két ág teljes mértékben különböző előzményekkel rendelkezik. +pulls.has_pull_request=`Már létezik egy pull kérés a két cél között: %[2]s#%[3]d` +pulls.create=Pull Kérés Létrehozása +pulls.title_desc=szeretne %[1]d commit-ot egyesíteni innen: %[2]s ide: %[3]s +pulls.merged_title_desc=%[1]d commit egyesítve innen: %[2]s ide: %[3]s ekkor: %[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 a beolvasztási kérést az egyesítés végrehajtásához. +pulls.merged=Egyesítve +pulls.has_merged=Ez a beolvasztási kérés sikeresen egyesítve lett! +pulls.data_broken=A pull kérés adatai sérültek a fork információ hiányossága miatt. +pulls.is_checking=Az ütközés ellenőrzés még folyamatban van, frissítsd az oldalt pár másodperc múlva. +pulls.can_auto_merge_desc=Ez a beolvasztási kérés automatikusán egyesíthető. +pulls.cannot_auto_merge_desc=Ez a beolvasztási kérés ütközések miatt nem egyesíthető automatikusan. +pulls.cannot_auto_merge_helper=Kérlek, egyesítsd kézileg a konfliktusok megoldásához. +pulls.create_merge_commit=Eggyesítő commit létrehozása +pulls.rebase_before_merging=Rebase eggyesítés előtt +pulls.commit_description=Commit leírása +pulls.merge_pull_request=Beolvasztási kérés egyesítése +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.` +pulls.delete_branch=Ág törlése +pulls.delete_branch_has_new_commits=Ág nem törölhető, mert tartalmaz olyan új változásokat melyek nem lettek még egyesítve. + +milestones.new=Új mérföldkő +milestones.open_tab=%d Nyitott +milestones.close_tab=%d Lezárt +milestones.closed=Lezárva ekkor: %s +milestones.no_due_date=Nincs határidő +milestones.open=Nyitott +milestones.close=Lezárás +milestones.new_subheader=Hozz létre mérföldköveket a hibajegyek rendszerezéséhez. +milestones.create=Mérföldkő létrehozása +milestones.title=Név +milestones.desc=Leírás +milestones.due_date=Határidő (nem kötelező) +milestones.clear=Törlés +milestones.invalid_due_date_format=Érvénytelen határidő formátum, várt: 'éééé-hh-nn'. +milestones.create_success=A mérföldkő ('%s') hozzáadása megtörtént! +milestones.edit=Mérföldkő Szerkesztése +milestones.edit_subheader=Használj egy jobb leírást a mérföldkövekhez, hogy ne zavarjon össze senkit. +milestones.cancel=Mégse +milestones.modify=Mérföldkő Szerkesztése +milestones.edit_success=A mérföldkő ('%s') módosítása megtörtént! +milestones.deletion=Mérföldkő Törlése +milestones.deletion_desc=A mérföldkő törlésével minden vele kapcsolatos információ törlésre kerül a hibajegyekből. Folytatod? +milestones.deletion_success=A mérföldkő törlése megtörtént! + +wiki=Wiki +wiki.welcome=Üdv a Wiki-ben! +wiki.welcome_desc=A Wiki az a hely, ahol közösen dokumentálhatod és teheted jobbá a projekted a többiekkel. +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=Röviden foglald össze a módosításokat (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 +wiki.new_page_button=Új oldal +wiki.delete_page_button=Oldal Törlése +wiki.delete_page_notice_1=Ez ki fogja törölni a(z) "%s" oldalt. Jól gondold meg. +wiki.page_already_exists=Már létezik ilyen nevű oldal a Wiki-n. +wiki.pages=Oldalak +wiki.last_updated=Utoljára módosítva: %s + +settings=Beállítások +settings.options=Beállítások +settings.collaboration=Együttműködés +settings.collaboration.admin=Admin +settings.collaboration.write=Írás +settings.collaboration.read=Olvasás +settings.collaboration.undefined=Nem definiált +settings.branches=Ágak +settings.branches_bare=Egy üres tárolóban nem lehet ágakat kezelni. Töltsön fel először tartalmat. +settings.default_branch=Alapértelmezett ág +settings.default_branch_desc=Az alapértelmezett ág tartalmazza a kód "alapját", egyesítési kéréseket és online szerkesztési lehetőséget. +settings.update=Frissítés +settings.update_default_branch_unsupported=Az alapértelmezett ág cseréje nem támogatott a kiszolgálóra telepített GIT verzióban. +settings.update_default_branch_success=Az alapértelmezett ág sikeresen frissítve! +settings.protected_branches=Védett ágak +settings.protected_branches_desc=A védett ágak megóvják a tárolót a véletlen törléstől és a force push-tól. +settings.choose_a_branch=Válasszon egy ágat... +settings.branch_protection=Ág védeleme +settings.branch_protection_desc=Válassza a védett ág opciót ehhez az ághoz: %s. +settings.protect_this_branch=Ezen ág védelme +settings.protect_this_branch_desc=Letiltja az ág törlését és a force pusht. +settings.protect_require_pull_request=Beolvasztási kérést követel meg a direkt küldés helyett +settings.protect_require_pull_request_desc=Ennek az opciónak a bekapcsolásával letiltható a közvetlen küldés az ágra. A véglegesítéseket egy másik, nem védett ágra kell küldeni, majd beolvasztási kérést kell nyitni. +settings.protect_whitelist_committers=Fehérlista, hogy ki push-olhat az ágra +settings.protect_whitelist_committers_desc=Felhasználók vagy csoportok hozzáadása az ág közvetlen beküldési fehér listájára. A fehér listával ki lehet kerülni a kötelező beolvasztási kéréseket. +settings.protect_whitelist_users=Felhasználók, akik push-olhatnak az ágra +settings.protect_whitelist_search_users=Felhasználók keresése +settings.protect_whitelist_teams=Csoportok, melyeknek tagjai pusholhatnak az ágra +settings.protect_whitelist_search_teams=Csapatok keresése +settings.update_protect_branch_success=Védelmi lehetőségek az ághoz sikeresen frissítve! +settings.hooks=Webhook-ok +settings.githooks=Git Hook-ok +settings.basic_settings=Alapbeállítások +settings.mirror_settings=Beállítások tükrözése +settings.sync_mirror=Szinkronizálás +settings.mirror_sync_in_progress=A tükör szinkronozálása folyamatban van, egy perc múlva frissítse az oldalt. +settings.site=Hivatalos weboldal +settings.update_settings=Beállítások mentése +settings.change_reponame_prompt=Ez meg fogja változtatni a repository-ra mutató linkeket. +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.allow_public_wiki_desc=Publikus hozzáférés engedélyezése a Wikihez ha a tároló privát +settings.use_external_wiki=Külső wiki használata +settings.external_wiki_url=Külső Wiki URL +settings.external_wiki_url_desc=A látogatók ide lesznek átirányítva, ha a fülre kattintanak. +settings.issues_desc=Hibajegykezelő engedélyezése +settings.use_internal_issue_tracker=Beépített, egyszerű hibajegykezelő használata +settings.allow_public_issues_desc=Publikus hozzáférés engedélyezése a problémákhoz ha a tároló privát +settings.use_external_issue_tracker=Külső hibajegykezelő használata +settings.external_tracker_url=Külső hibajegykezelő URL +settings.external_tracker_url_desc=A látogatók ide lesznek átirányítva, ha a fülre kattintanak. +settings.tracker_url_format=Külső Hibajegykezelő URL Formátuma +settings.tracker_issue_style=Külső hibajegykezelő elnevezési stílus: +settings.tracker_issue_style.numeric=Numerikus +settings.tracker_issue_style.alphanumeric=Alfanumerikus +settings.tracker_url_format_desc=Az alábbiak helyettesítik a felhasználónevet, repository nevet és hibajegy számot: {user} {repo} {index}. +settings.pulls_desc=Beolvasztási kérések engedélyezése tárolók és ágak közi hozzájárulásokhoz +settings.pulls.ignore_whitespace=Whitespacek figyelmen kívül hagyása +settings.pulls.allow_rebase_merge=Rebase engedélyezése eggyesítő commitokhoz +settings.danger_zone=Veszélyes terület +settings.cannot_fork_to_same_owner=Nem másolható a tároló az eredeti tulajdonosához. +settings.new_owner_has_same_repo=Az új tulaj már rendelkezik ilyen nevű repository-val. Kérlek, válassz másik nevet. +settings.convert=Egyszerű Repository-vá Alakítás +settings.convert_desc=Átalakíthatod ezt a tükrözött repository-t egyszerűvé. Nem visszavonható. +settings.convert_notices_1=- Ez a művelet átalakítja ezt a tükör repository-t egy egyszerű repository-vá és nem vonható vissza. +settings.convert_confirm=Átalakítás Megerősítése +settings.convert_succeed=A repository típusa sikeresen egyszerűre lett módosítva. +settings.transfer=Tulajdonjog átadása +settings.transfer_desc=Tároló átadása másik felhasználónak vagy szervezetnek, ahol rendszergazdai jogosultsága van. +settings.transfer_notices_1=- Ha az új tulaj egy felhasználó, elvész a hozzáférésed. +settings.transfer_notices_2=- A hozzáférésed megmarad ha az új tulaj egy szervezet melynek tulajdonosai közt szerepelsz. +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örölted a wiki adatokat nincs visszaút. Jól gondold meg. +settings.wiki_delete_notices_1=- Ez törli és kikapcsolja a wiki-t itt: %s +settings.wiki_deletion_success=A repository-hoz tartozó wiki adatok törlése sikeres. +settings.delete=Repository Törlése +settings.delete_desc=Miután kitörölted a repository-t nincs visszaút. Jól gondold meg. +settings.delete_notices_1=- Ez a művelet NEM vonható vissza. +settings.delete_notices_2=- Ez a művelet véglegesen töröl minden repository-val kapcsolatos dolgot, beleértve a Git adatokat, hibajegyeket, megjegyzéseket és a közreműködők hozzáférési jogát. +settings.delete_notices_fork_1=- Minden fork önállóvá válik a törlés után. +settings.deletion_success=A tároló sikeresen törölve! +settings.update_settings_success=A tároló beállításai sikeresen frissítve. +settings.transfer_owner=Új tulajdonos +settings.make_transfer=Átadás végrehajtása +settings.transfer_succeed=A tároló tulajdonának átadása sikeresen megtörtént. +settings.confirm_delete=Törlés megerősítése +settings.add_collaborator=Új együttműködő hozzáadása +settings.add_collaborator_success=Az eggyüttműködő hozzáadva. +settings.delete_collaborator=Törlés +settings.collaborator_deletion=Eggyüttműködő törlése +settings.collaborator_deletion_desc=Ennek a felhasználónak nem lesz joga közreműködni a repository-hoz a törlés után. Biztos, hogy folytatni akarod? +settings.remove_collaborator_success=Az eggyü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.hooks_desc=A Webhook-ok olyanok, mint az alapvető HTTP POST esemény triggerek. Amikor valami történik a Gogsban, akkor küldünk róla értesítést a címre amit beállítasz. Többet olvashatsz erről a Webhooks Guide-ban. +settings.webhooks.add_new=Új webhook készítése: +settings.webhooks.choose_a_type=Válassz egy típust... +settings.add_webhook=Webhook hozzáadása +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. Biztosan folytatja? +settings.webhook_deletion_success=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álhasd +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.redelivery=Újrabeküldés +settings.webhook.redelivery_success=Hook '%s' újra felvéve a végrehajtási listába. Néhány másodpercbe telik, mire a kézbesítés belekerül a frissítési naplóba. +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.webhook.err_cannot_parse_payload_url=Nem sikerült feldolgozni a végpont URL címet: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. +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 minta sablon lesz mutatva. Ha a tartalmát üresen hagyja, 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 Gogs küldeni fog egy POST kérést az URL-re amit megadsz, azzal az eseménnyel együtt ami történt. Azt is megadhatod, hogy milyen formátumban tegye ezt (JSON, x-www-form-urlencoded, XML, stb). Több információt a Webhooks Guide-ban találhatsz róla. +settings.payload_url=Tartalom URL +settings.content_type=Tartalomtípus +settings.secret=Titkos kód +settings.secret_desc=A titkos kód a tartalom SHA256 HMAC hex digestjeként lesz küldve az X-Gogs-Signature fejlécben. +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ény. +settings.event_send_everything=Minden esemény szükséges. +settings.event_choose=Kiválasztom, amik kellenek. +settings.event_create=Létrehoz +settings.event_create_desc=Branch vagy tag létrehozva +settings.event_delete=Törlés +settings.event_delete_desc=Ág vagy cimke törölve +settings.event_fork=Másolat +settings.event_fork_desc=Tároló másolva +settings.event_push=Push +settings.event_push_desc=Push-olás egy repository-ba +settings.event_issues=Problémák +settings.event_issues_desc=A probléma meg left nyitva, le left zárva, újranyitva, szerkesztve, hozzárendelve, visszarendelve, cimkézve, cimketelenítve, mérföldkövezve, vagy mérföldkőtelenítve. +settings.event_pull_request=Beolvasztási kérés +settings.event_pull_request_desc=Beolvasztási kérés megnyitva, lezárva, újranyitva, hozzárendelve, visszarendelve, címkézve, címke eltávolítva, mérföldkövezve, mérföldkő eltávolítva vagy szinkronizálva. +settings.event_issue_comment=Probléma hozzászólás +settings.event_issue_comment_desc=Probléma megjegyzés létrehozva, szerkesztve vagy törölve. +settings.event_release=Kiadás +settings.event_release_desc=Kiadás publikálva a tárolóban. +settings.active=Aktív +settings.active_helper=A hook-ot aktiváló esemény részletei is továbbításra kerülnek. +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 repository-hoz. +settings.add_discord_hook_desc=Discord integráció hozzáadva a térolóhoz. +settings.add_dingtalk_hook_desc=Dingtalk integráció hozzáadása a tárolóhoz. +settings.slack_token=Token +settings.slack_domain=Domain +settings.slack_channel=Csatorna +settings.deploy_keys=Deploy kulcsok +settings.deploy_keys_helper=Hasznos tipp! ha saját személyes publikus kulcsait szeretné hozzáadni, azt a fiók beállítások oldalon teheti meg. +settings.add_deploy_key=Deploy Kulcs Hozzáadása +settings.deploy_key_desc=A deploy kulcsok csak olvasásra jogosítanak fel, nem azonosak a személyes SSH kulcsokkal. +settings.no_deploy_keys=Még nem adott hozzá deploy kulcsot. +settings.title=Név +settings.deploy_key_content=Tartalom +settings.key_been_used=Deploy kulcs tartalma már fel lett használva. +settings.key_name_used=Már létezik ilyen nevű deploy kulcs. +settings.add_key_success=Az új deploy kulcsot ('%s') sikeresen hozzáadtuk! +settings.deploy_key_deletion=Deploy Kulcs Törlése +settings.deploy_key_deletion_desc=A deploy kulcs törlése minden kapcsolódó hozzáférést töröl a repository-ból. Biztosan folytatod? +settings.deploy_key_deletion_success=A deploy kulcs sikeresen törölve! +settings.description_desc=Tároló leírása. Maximum 512 karakter hosszúságú. +settings.description_length=Rendelkezésre álló karakterek + +diff.browse_source=Forráskód Böngészése +diff.parent=szülő +diff.commit=commit +diff.data_not_available=Diff Adat Nem Elérhető. +diff.show_diff_stats=Diff Statisztika Mutatása +diff.show_split_view=Osztott Nézet +diff.show_unified_view=Egyesített Nézet +diff.stats_desc= %d módosított fájl, %d hozzáadás és %d törlés +diff.bin=BIN +diff.view_file=Fájl Megtekintése +diff.file_suppressed=A különbségek nem kerülnek megjelenítésre, 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 + +release.releases=Kiadások +release.new_release=Új Kiadás +release.draft=Piszkozat +release.prerelease=Elő-Kiadás +release.edit=szerkesztés +release.ahead=%d commit a %s branch-on a kiadás óta +release.source_code=Forráskód +release.new_subheader=Publikáljon kiadásokat a termék iterációjához. +release.edit_subheader=A részletes változási naplók segítenek a módosítások megértésben. +release.tag_name=Címke neve +release.target=Cél +release.tag_helper=Válassz egy meglévő tag-et vagy hozz létre egyet publikáláskor. +release.title=Név +release.content=Tartalom +release.write=Írás +release.preview=Előnézet +release.loading=Töltés... +release.prerelease_desc=Kiadás előtti +release.prerelease_helper=Megjelöljük, hogy a kiadás nem használatkész. +release.cancel=Mégse +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ó cimke is törlésre kerül. A tárolóban adatvesztés is előfodulhat. Szeretné folytatni? +release.deletion_success=A kiadás sikeresen törölve lett! +release.tag_name_already_exist=Kiadás ilyen cimkével már létezik. +release.tag_name_invalid=Érvénytelen cimkenév. +release.downloads=Letöltések + +[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=Meghívás +teams=Csapatok +lower_members=tag +lower_repositories=tároló +create_new_team=Új csapat létrehozása +org_desc=Leírás +team_name=Csapat neve +team_desc=Leírás +team_name_helper=Ezzel a névvel tudsz majd a csapatra hivatkozni. +team_desc_helper=Miről szól ez a csapat? +team_permission_desc=Milyen jogosultsága legyen ennek a csapatnak? + +form.name_not_allowed=A szervezetnév, vagy minta '%q' nem engedélyezett. +form.team_name_not_allowed=A '%q' csapatnév, vagy minta nem engedélyezett + +settings=Beállítások +settings.options=Opciók +settings.full_name=Teljes név +settings.website=Weboldal +settings.location=Hely +settings.update_settings=Beállítások frissítése +settings.update_setting_success=A szervezeti beállításai sikeresen frissültek. +settings.change_orgname_prompt=Ez meg fogja változtatni a szervezet tárolóira mutató linkeket. +settings.update_avatar_success=A szervezet profilképe sikeresen frissítve lett. +settings.delete=Szervezet törlése +settings.delete_account=Szervezet törlése +settings.delete_prompt=A szervezet véglegesen eltávolításra kerül, ez a művelet VISSZAVONHATATLAN! +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=Adj hozzá webhook-okat amik minden szervezeten belüli repository által aktiválódnak. + +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=Szerepkör: +members.owner=Tulajdonos +members.member=Tag +members.remove=Eltávolítás +members.leave=Elhagyá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=Elhagyás +teams.read_access=Olvasási Jog +teams.read_access_helper=Ez a csapat képes lesz megtekinteni és klónozni a saját repository-jait. +teams.write_access=Írási Jog +teams.write_access_helper=Ez a csapat képes lesz olvasni a repository-jait és push-olni is tud beléjük. +teams.admin_access=Adminisztrátori Jog +teams.admin_access_helper=Ez a csapat képes lesz írni/olvasni a repository-jait és hozzájuk tud majd adni közreműködőket. +teams.no_desc=Ennek a csapatnak nincs leírása +teams.settings=Beállítások +teams.owners_permission_desc=A tulajdonosoknak teljes hozzáférése van minden repository-hoz és adminisztrátori joguk van a szervezethez. +teams.members=Csapattagok +teams.update_settings=Beállítások mentése +teams.delete_team=Csapat Törlése +teams.add_team_member=Csapattag hozzáadása +teams.delete_team_title=Csapat Törlése +teams.delete_team_desc=Mivel a csapat törlésre kerül, a tagjai elveszíthetik a hozzáférésüket néhány repository-hoz. Folytatod? +teams.delete_team_success=A csapat sikeresen törölve. +teams.read_permission_desc=A csoport olvasási jogosultságai: a tagok olvasási jogosultsággal rendelkeznek a csoport tárolóihoz. +teams.write_permission_desc=A csoport írási jogosultságai: a tagok olvasási és írási jogosultsággal rendelkeznek a csoport tárolóihoz. +teams.admin_permission_desc=A csoport adminisztátori jogosultságai: 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ók +teams.search_repo_placeholder=Tároló keresés... +teams.add_team_repository=Új csapat szintű 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=Vezérlőpult +users=Felhasználók +organizations=Szervezetek +repositories=Tárolók +authentication=Hitelesítés +config=Konfiguráció +notices=Rendszer-értesítés +monitor=Figyelés +first_page=Első +last_page=Utolsó +total=Összesen: %d + +dashboard.build_info=Program építési információi +dashboard.app_ver=Alkalmazás verziója +dashboard.git_version=Git verzió +dashboard.go_version=Go verzió +dashboard.build_time=Program építésének időtartama +dashboard.build_commit=Program építési commit-ja +dashboard.statistic=Statisztika +dashboard.operations=Műveletek +dashboard.system_status=Rendszerfigyelő Állapota +dashboard.statistic_info=Az adatbázisban található: %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 probléma, %d megjegyzés, %d közösségi fiók, %d követő, %d tükör, %d kiadás, %d authentikáció, %d webhook, %d mérföldkő, %d cimke, %d hook feladat, %d csoport, %d frissítési feladat, %d csatolmány. +dashboard.operation_name=Művelet neve +dashboard.operation_switch=Átváltás +dashboard.select_operation_to_run=Kérlek válaszd ki a futtatandó műveletet +dashboard.operation_run=Futtatás +dashboard.clean_unbind_oauth=A nem használt OAuthok kitakarítása +dashboard.clean_unbind_oauth_success=Minden nem használt OAuth sikeresen kitakarítva. +dashboard.delete_inactivate_accounts=Minden inaktív fiók törlése +dashboard.delete_inactivate_accounts_success=Minden inaktív fiók sikeresen törölve. +dashboard.delete_repo_archives=Összes tároló archívum törlése +dashboard.delete_repo_archives_success=Az összes tároló archívum sikeresen 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 elveszett rekordfájl sikeresen törölve a tárolókban. +dashboard.git_gc_repos=Memóriaszemét-gyüjtő futtatása az összes tárolón +dashboard.git_gc_repos_success=Minden repository sikeresen elvégezte a szemétszedést. +dashboard.resync_all_sshkeys='.ssh/authorized_keys' file újraírása (figyelem: nem Gogs által hozzáadott kulcsok elvesznek) +dashboard.resync_all_sshkeys_success=Minden publikus kulcs sikeresen újraírva. +dashboard.resync_all_hooks=pre-receive, update és post-receive hook-ok újraszinkronizálása az összes repository-ban +dashboard.resync_all_hooks_success=Az összes tároló pre-receive, update és post-receive hook-ja sikeresen szinkronizálva lett. +dashboard.reinit_missing_repos=Az összes tárolóban az elveszett GIT fájl rekordok újrainicializálása +dashboard.reinit_missing_repos_success=Az összes elveszett rekordfájl sikeresen újrainicializálva a tárolókban. + +dashboard.server_uptime=Kiszolgáló futási ideje +dashboard.current_goroutine=Aktuális Gorutinok +dashboard.current_memory_usage=Jelenlegi memória használat +dashboard.total_memory_allocated=Teljes lefoglalt memória +dashboard.memory_obtained=Megszerzett memória +dashboard.pointer_lookup_times=Mutató követési idő +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=Megszerzett heap memória +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ó Bucket 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ő szemétgyűjtő (GC) ciklus +dashboard.last_gc_time=Utolsó szemétgyyűjtés (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 futások + +users.user_manage_panel=Felhasználó kezelő Panel +users.new_account=Új Fiók Létrehozása +users.name=Név +users.activated=Aktivált +users.admin=Admin +users.repos=Tárolók +users.created=Létrehozva +users.send_register_notify=Regisztráció értesítés küldése a felhasználónak +users.new_success=Az új fiók ('%s') 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=Profil frissítése sikeresen megtörtént. +users.edit_account=Fiók szerkesztése +users.max_repo_creation=Tárolók maximális számának korlátja +users.max_repo_creation_desc=(Állítsa -1-re, hogy az alapértelmezett limitet használatához) +users.is_activated=Ez a fiók aktivált +users.prohibit_login=Ez a fiók 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 rendelkezik jogosultsággal a helyi tárolókat importálásához +users.update_profile=Fiók frissítése +users.delete_account=A fiók törlése +users.still_own_repo=A fiókja még legalább egy tároló tulajdonosa, először törölnie kell őket vagy átadni másnak a tulajdonjogaikat. +users.still_has_org=Ez a felhasználó még mindig tagja legalább egy szervezetnek, először távoznia kell onnan, vagy a szervezetet törölni. +users.deletion_success=Fiók sikeresen törölve! + +orgs.org_manage_panel=Szervezetek kezelése panel +orgs.name=Név +orgs.teams=Csapatok +orgs.members=Tagok + +repos.repo_manage_panel=Tárolók kezelése panel +repos.owner=Tulajdonos +repos.name=Név +repos.private=Privát +repos.watches=Figyelők +repos.stars=Csillagok +repos.issues=Problémák +repos.size=Méret + +auths.auth_sources=Hitelesítési források +auths.new=Új forrás hozzáadása +auths.name=Név +auths.type=Típus +auths.enabled=Engedélyezett +auths.default=Alapértelmezett +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=Állomás +auths.port=Port +auths.bind_dn=Bind DN +auths.bind_dn_helper=Használhatja a '%s'-t felhasználónév helyett, pl.: DOM\%s +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=A felhasználók tartománya +auths.attribute_username=Felhasználónév attribútum +auths.attribute_username_placeholder=Hagy üresen, hogy a bejelentkező form 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.verify_group_membership=Csoport tagság ellenőrzése +auths.group_search_base_dn=Csoportos keresés DN alapja +auths.group_filter=Csoport szűrő +auths.group_attribute_contain_user_list=Felhasználó listát tartalmazó csoport attribútum +auths.user_attribute_listed_in_group=Felhasználónév attribútum a csoportban +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-hitelesítés 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 domain sem korlátozva. Ha több domaint 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ése mellőzése +auths.pam_service_name=PAM szolgáltatás neve +auths.enable_auto_register=Automatikus regisztráció engedélyezése +auths.edit=Hitelesítési beállítások szerkesztése +auths.activated=Ez a hitelesítés mód aktiválva van +auths.default_auth=Ez a hitelesítés az alapértelmezett bejelentkezési forrás +auths.new_success=Az új hitelesítési mód '%s' sikeresen hozzáadva. +auths.update_success=A hitelesítési beállítások sikeresen firssí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és +auths.delete_auth_desc=A hitelesítési mód 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. +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. +auths.github_api_endpoint=API végpont + +config.not_set=(nincs beállítva) +config.server_config=Kiszolgáló konfiguráció +config.brand_name=Oldalnév kiválasztása +config.run_user=Futtató felhasználó +config.run_mode=Futtatás módja +config.server.external_url=Külső URL +config.server.domain=Domain +config.server.protocol=Protokoll +config.server.http_addr=HTTP cím +config.server.http_port=HTTP port +config.server.cert_file=Tanusítvány fájl +config.server.key_file=Kulcsfájl +config.server.tls_min_version=Legalacsonyabb TLS verzió +config.server.unix_socket_permission=Unix socket engedély +config.server.local_root_url=Helyi gyökér URL +config.server.offline_mode=Offline mód +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Gzip bekapcsolása +config.server.app_data_path=Alkalmazás adatok elérési útvonala +config.server.load_assets_from_disk=Program hozzávalók betöltése lemezről +config.server.landing_url=Beérkezési URL + +config.ssh_config=SSH konfiguráció +config.ssh.enabled=Bekapcsolva +config.ssh.domain=Külső domain +config.ssh.port=Nyitott port +config.ssh.root_path=Gyökér elérési útvonal +config.ssh.keygen_path=ssh-keygen elérési útvonala +config.ssh.key_test_path=Kulcs ellenőrzés útvonala +config.ssh.minimum_key_size_check=Minimális kulcsméret ellenőrzés +config.ssh.minimum_key_sizes=Kulcsok minimális mérete +config.ssh.rewrite_authorized_keys_at_start=SSH "authorized_keys" fájl újraírása indításnál +config.ssh.start_builtin_server=Beépített kiszolgáló indítása +config.ssh.listen_host=Hallgatási cím +config.ssh.listen_port=Hallgatási port +config.ssh.server_ciphers=Kiszolgáló titkosítás módszerei +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Tároló konfiguráció +config.repo.root_path=Gyökér elérési útvonal +config.repo.script_type=Szkript típus +config.repo.ansi_chatset=ANSI karakterkészlet +config.repo.force_private=Privát erőltetése +config.repo.max_creation_limit=Maximum repo létrehozási korlát +config.repo.preferred_licenses=Előnyben részesített licencek +config.repo.disable_http_git=HTTP-n keresztüli git kikapcsolása +config.repo.enable_local_path_migration=Engedélyezi a migrációt helyi elérési út alapján +config.repo.enable_raw_file_render_mode=nyers fájl kijelzés bekapcsolása +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Feltöltés bekapcsolva +config.repo.upload.temp_path=Ideiglenes feltöltési útvonal +config.repo.upload.allowed_types=Feltöltésnél engedélyezett típusok +config.repo.upload.file_max_size=Maximálisan feltölthető fájlméret +config.repo.upload.max_files=Upload files limit + +config.db_config=Adatbázis konfiguráció +config.db.type=Típus +config.db.host=Kiszolgáló +config.db.name=Név +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=Felhasználó +config.db.ssl_mode=SSL mód +config.db.ssl_mode_helper=(csak "postgres" esetében) +config.db.path=Útvonal +config.db.path_helper=(csak "sqlite3" esetében) +config.db.max_open_conns=Maximum egyszerre nyitott csatlakozások +config.db.max_idle_conns=Maximum tétlen kapcsolatok száma + +config.security_config=Biztonsági beállítások +config.security.login_remember_days=Bejelentkezési adatok megjegyzésének napjai +config.security.cookie_remember_name=Emlékezési süti elnevezése +config.security.cookie_username=Felhasználónév süti +config.security.cookie_secure=Biztonságos sütik engedélyezése +config.security.reverse_proxy_auth_user=Fordított proxy hitelesítési fejléc +config.security.enable_login_status_cookie=Bejelentkezési állapot süti bekapcsolása +config.security.login_status_cookie_name=Bejelentkezési állapot süti neve +config.security.local_network_allowlist=Local network allowlist + +config.email_config=E-mail beállítások +config.email.enabled=Bekapcsolva +config.email.subject_prefix=Tárgy előtag +config.email.host=Kiszolgáló +config.email.from=Tól/től +config.email.user=Felhasználó +config.email.disable_helo=HELO letiltása +config.email.helo_hostname=HELO állományneve +config.email.skip_verify=Tanusítvány igazolásának átugrása +config.email.use_certificate=Egyedi tanusítvány használata +config.email.cert_file=Tanusítvány fájl +config.email.key_file=Kulcsfájl +config.email.use_plain_text=Sima szöveg (plaintext) használata +config.email.add_plain_text_alt=Sima szöveg (plaintext) alternatív szövege +config.email.send_test_mail=Teszt e-mail küldése +config.email.test_mail_failed=Nem sikerült kiküldeni a teszt e-mailt '%s'-nek: %v +config.email.test_mail_sent=Teszt e-mail kiküldve '%s'-nek. + +config.auth_config=Hitelesítési beállítások +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Jelszó visszaállítási kód élettartama +config.auth.require_email_confirm=E-mail megerősítés szükségessé tétele +config.auth.require_sign_in_view=Bejelentkező nézet követelése +config.auth.disable_registration=Regisztráció kikapcsolása +config.auth.enable_registration_captcha=CAPTCHA engedélyezése regisztrációhoz +config.auth.enable_reverse_proxy_authentication=Fordított proxy hitelesítés bekapcsolása +config.auth.enable_reverse_proxy_auto_registration=Fordított proxy automatikus regisztrációjának bekapcsolása +config.auth.reverse_proxy_authentication_header=Fordított proxy hitelesítési fejléc + +config.user_config=Felhasználói beállítások +config.user.enable_email_notify=Email értesítés engedélyezése + +config.session_config=Munkamenet beállítások +config.session.provider=Session ellátó +config.session.provider_config=Session ellátó konfigurációja +config.session.cookie_name=Süti +config.session.https_only=Csak HTTPS +config.session.gc_interval=Szemétgyűjtés intervalluma +config.session.max_life_time=Maximális élettartam +config.session.csrf_cookie_name=CSRF süti neve + +config.cache_config=Cache beállítás +config.cache.adapter=Adapter +config.cache.interval=Szemétgyűjtés intervalluma +config.cache.host=Kiszolgáló + +config.http_config=HTTP beállítások +config.http.access_control_allow_origin=Access-Control-Allow-Origin fejléc + +config.attachment_config=Melléklet beállítás +config.attachment.enabled=Bekapcsolva +config.attachment.path=Elérési útvonal +config.attachment.allowed_types=Engedélyezett típusok +config.attachment.max_size=Maximum méret +config.attachment.max_files=Maximálisan feltölthető fájlok mennyisége + +config.release_config=Szoftver kiadás beállítás +config.release.attachment.enabled=Mellékletek bekapcsolva +config.release.attachment.allowed_types=Engedélyezett melléklet típusok +config.release.attachment.max_size=Melléklet maximális mérete +config.release.attachment.max_files=Maximális mellékelt fájlok mennyisége + +config.picture_config=Kép beállítások +config.picture.avatar_upload_path=Profilkép feltöltési útvonal +config.picture.repo_avatar_upload_path=Repository kép feltöltési útvonal +config.picture.gravatar_source=Gravatar forrás +config.picture.disable_gravatar=Gravatar Kikapcsolása +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Tükrözés beállítás +config.mirror.default_interval=Alapértelmezett intervallum + +config.webhook_config=Webhook beállítás +config.webhook.types=Típusok +config.webhook.deliver_timeout=Kézbesítési időtúllépés +config.webhook.skip_tls_verify=TLS ellenőrzés kihagyása + +config.git_config=Git konfiguráció +config.git.disable_diff_highlight=Különbségi szintakszis kiemelésének kikapcsolása +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=Szemétgyűjtő (GC) argumentumok +config.git.migrate_timeout=Migráció időtúllépés +config.git.mirror_timeout=Tükör fetch időtúllépés +config.git.clone_timeout=Klónozási időtúllépés +config.git.pull_timeout=Lehúzási időtúllépés +config.git.gc_timeout=Szemétgyűjtés időtúllépése + +config.lfs_config=LFS Beállítások +config.lfs.storage=Tárhely +config.lfs.objects_path=Objektumok elérési útvonala + +config.log_config=Naplózás beállítása +config.log_file_root_path=Naplófájl gyökérútvonal +config.log_mode=Mód +config.log_options=Opciók + +monitor.cron=Cron feladatok +monitor.name=Név +monitor.schedule=Ütemezés +monitor.next=Legközelebb +monitor.previous=Legutóbb +monitor.execute_times=Végrehajtási idő +monitor.process=Futó folyamatok +monitor.desc=Leírás +monitor.start=Kezdési időpont +monitor.execute_time=Végrehajtási idő + +notices.system_notice_list=Rendszer-értesítés +notices.view_detail_header=Értesítés részletei +notices.actions=Műveletek +notices.select_all=Összes kiválasztása +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 sikeresen törölve. + +[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 ágba ide: %[4]s +compare_commits=%d commit összehasonlítása +transfer_repo=áthelyezett egy tárolót innen: %s ide: %s +create_issue=`problémát jelentett: %s#%[2]s` +close_issue=`megoldott egy problémát: %s#%[2]s` +reopen_issue=`újranyitott egy problémát: %s#%[2]s` +comment_issue=`hozzászólt egy problémához: %s#%[2]s` +create_pull_request=`létrehozott egy beolvasztási kérést: %s#%[2]s` +close_pull_request=`lezárt egy beolvasztási kérést: %s#%[2]s` +reopen_pull_request=`újranyitott egy beolvasztási kérést: %s#%[2]s` +merge_pull_request=`egyesített egy beolvasztási kérést: %s#%[2]s` +create_branch=létrehozott egy új %[3]s ágat ebben: %[4]s +delete_branch=törölt egy ágat %[2]s ekkor: %[3]s +push_tag=feltöltött egy cimkét: %[2]s ide: %[3]s +delete_tag=törölt egy cimkét %[2]s ekkor: %[3]s +fork_repo=lemásolta a(z) %s tárolót +mirror_sync_push=commitok szinkronizálva a %[3]s ágba a %[4]s tárolóban, tükörről +mirror_sync_create=új hivatkozás szinkronizálva: %[2]s a %[3]s tárolóban, tükörről +mirror_sync_delete=szinkronizálva és törölve a %[2]s hivatkozás a %[3]s tárolóból, tükörről + +[tool] +ago= +from_now=mostantól +now=most +1s=1 másodperce %s +1m=1 perce %s +1h=1 órája %s +1d=1 napja %s +1w=1 hete %s +1mon=1 hónapja %s +1y=1 éve %s +seconds=%d másodperce %s +minutes=%d perce %s +hours=%d órája %s +days=%d napja %s +weeks=%d hete %s +months=%d hónapja %s +years=%d éve %s +raw_seconds=másodperc +raw_minutes=perc +raw_hours=órák + +[dropzone] +default_message=Húzz ide fájlokat vagy kattints a feltöltéshez. +invalid_input_type=Ilyen típusú fájlt nem tölthetsz fel. +file_too_big=A fájl mérete ({{filesize}} MB) meghaladja a feltölthető legnagyobb méretet ({{maxFilesize}} MB). +remove_file=Fájl(ok) eltávolítása + diff --git a/conf/locale/locale_id-ID.ini b/conf/locale/locale_id-ID.ini new file mode 100644 index 00000000000..7b1fe574ee2 --- /dev/null +++ b/conf/locale/locale_id-ID.ini @@ -0,0 +1,1434 @@ +app_desc=Sebuah layanan Git hosting-pribadi yang mudah + +home=Halaman utama +dashboard=Dasbor +explore=Jelajahi +help=Bantuan +sign_in=Masuk +sign_out=Keluar +sign_up=Daftar +register=Daftar +website=Situs web +page=Halaman +template=Templat +language=Bahasa +create_new=Buat... +user_profile_and_more=Profil pengguna dan lebih +signed_in_as=Masuk sebagai + +username=Nama pengguna +email=Email +password=Sandi +re_type=Ketik ulang +captcha=Captcha + +repository=Repositori +organization=Organisasi +mirror=Mirror +new_repo=Repositori Baru +new_migrate=Migrasi Baru +new_mirror=Mirror Baru +new_fork=Cabang Repositori Baru +new_org=Organisasi Baru +manage_org=Mengelola Organisasi +admin_panel=Panel Admin +account_settings=Pengaturan Akun +settings=Pengaturan +your_profile=Profile Anda +your_settings=Pengaturanmu + +activities=Aktivitas +pull_requests=Permintaan Tarik +issues=Masalah + +cancel=Batal + +[status] +page_not_found=Halaman tidak ditemukan +internal_server_error=Kesalahan Server Internal + +[install] +install=Instalasi +title=Langkah-langkah untuk Menjalankan Pertama Kali +docker_helper=Jika Anda menjalankan Gogs dalam Docker, silakan baca Petunjuk dengan hati-hati sebelum Anda mengubah sesuatu di Halaman ini! +requite_db_desc=Gogs memerlukan MySQL, PostgreSQL, SQLite3 atau TiDB. +db_title=Pengaturan Basisdata +db_type=Tipe Basisdata +host=Host +user=Pengguna +password=Sandi +db_name=Nama Basisdata +db_schema=Skema +db_helper=Harap menggunakan INNODB engine dengan charset utf8_general_ci untuk MySQL. +ssl_mode=Mode SSL +path=Path +sqlite_helper=Path berkas SQLIte3 database.
Silakan menggunakan path absolut ketika Anda memulai sebagai layanan. +err_empty_db_path=SQLite3 database path tak boleh kosong. +no_admin_and_disable_registration=Anda tidak dapat menonaktifkan pendaftaran tanpa membuat akun admin. +err_empty_admin_password=Sandi admin tidak boleh kosong. + +general_title=Pengaturan Umum Aplikasi +app_name=Nama Aplikasi +app_name_helper=Letakkan nama organisasi Anda di sini dengan besar dan keras! +repo_path=Path akar repositori +repo_path_helper=Semua repositori Git akan disimpan ke direktori ini. +run_user=Menjalankan pengguna +run_user_helper=Pengguna harus memiliki akses ke path akar repositori dan menjalankan Gogs. +domain=Domain +domain_helper=Ini memengaruhi URL kloning SSH. +ssh_port=Port SSH +ssh_port_helper=Nomor port yang menggunakan SSH server, biarkan kosong untuk menonaktifkan fitur SSH. +use_builtin_ssh_server=Menggunakan Builtin SSH Server +use_builtin_ssh_server_popup=Mulai dibangun di server SSH untuk operasi Git untuk membedakan daemon sistem SSH. +http_port=Port HTTP +http_port_helper=Nomor port aplikasi. +app_url=URL Aplikasi +app_url_helper=Ini mempengaruhi URL klon HTTP/HTTPS dan di suatu tempat dalam email. +log_root_path=Path log +log_root_path_helper=Direktori untuk menulis berkas log. +enable_console_mode=Mengaktifkan Mode Konsol +enable_console_mode_popup=Selain mode file, juga mencetak log ke konsol. +default_branch=Default Branch + +optional_title=Pengaturan opsional +email_title=Pengaturan layanan email +smtp_host=Host SMTP +smtp_from=Dari +smtp_from_helper=Alamat Dari email, RFC 5322. Hal ini dapat hanya alamat email, atau format "Nama" . +mailer_user=Email pengirim +mailer_password=Sandi pengirim +register_confirm=Mengaktifkan konfirmasi pendaftaran +mail_notify=Mengaktifkan notifikasi email +server_service_title=Pengaturan server dan layanan lainnya +offline_mode=Mengaktifkan mode Offline +offline_mode_popup=Menonaktifkan CDN bahkan dalam mode produksi, semua sumber file akan disajikan secara lokal. +disable_gravatar=Menonaktifkan layanan Gravatar +disable_gravatar_popup=Menonaktifkan Gravatar dan sumber-sumber kustom, avatar semua upload oleh pengguna atau default. +federated_avatar_lookup=Aktifkan Pencarian Avatar Representasi +federated_avatar_lookup_popup=Aktifkan avatar avatar federasi untuk menggunakan layanan buka sumber federasi berbasis libravatar. +disable_registration=Menonaktifkan Swa-pendaftaran +disable_registration_popup=Menonaktifkan registrasi mandiri pengguna, hanya admin yang dapat membuat akun. +enable_captcha=Mengaktifkan Captcha +enable_captcha_popup=Memerlukan validasi captcha untuk registrasi mandiri pengguna. +require_sign_in_view=Aktifkan memerlukan masuk untuk lihat halaman +require_sign_in_view_popup=Hanya pengguna yang sudah masuk yang dapat melihat halaman, pengunjung hanya dapat melihat halaman masuk. +admin_setting_desc=Anda tidak perlu membuat account admin sekarang, pengguna siapa ID = 1 akan mendapatkan akses admin secara otomatis. +admin_title=Pengaturan akun admin +admin_name=Nama pengguna +admin_password=Sandi +confirm_password=Konfirmasi sandi +admin_email=Email Admin +install_gogs=Menginstall Gogs +test_git_failed=Gagal untuk menguji perintah 'git': %v +sqlite3_not_available=Versi rilis Anda tidak mendukung SQLite3, silahkan download versi biner resmi dari %s, BUKAN versi gobuild. +invalid_db_setting=Pengaturan basisdata tidak benar: %v +invalid_repo_path=Path akar repositori tidak valid: %v +run_user_not_match=Pengguna yang sedang menjalankan bukanlah pengguna saat ini: %s -> %s +smtp_host_missing_port=Alamat Host SMTP hilang di alamat. +invalid_smtp_from=SMTP Dari lapangan tidak sesuai: %v +save_config_failed=Gagal untuk menyimpan konfigurasi: %v +init_failed=Gagal melakukan inisialiasi aplikasi: %v +invalid_admin_setting=Pengaturan akun admin tidak valid: %v +install_success=Selamat datang! Kami senang bahwa Anda memilih Gogs, bersenang-senang dan berhati-hatilah. +invalid_log_root_path=Path akar log tidak valid: %v + +[home] +uname_holder=Nama pengguna atau email +password_holder=Sandi +switch_dashboard_context=Beralih Konteks Dasbor +my_repos=Repositori Saya +show_more_repos=Tampilkan lebih banyak repositori lain... +collaborative_repos=Repositori Kolaboratif +my_orgs=Organisasi Saya +my_mirrors=Mirror Saya +view_home=Lihat %s + +issues.in_your_repos=Dalam repositori Anda + +[explore] +repos=Repositori +users=Pengguna +organizations=Organisasi +search=Cari + +[auth] +create_new_account=Buat akun baru +register_hepler_msg=Sudah memiliki account? Sign in sekarang! +social_register_hepler_msg=Sudah memiliki account? Ikat sekarang! +disable_register_prompt=Maaf, pendaftaran telah dinonaktifkan. Hubungi administrator situs. +disable_register_mail=Maaf, konfirmasi pendaftaran melalui email telah dinonaktifkan. +auth_source=Sumber Autentikasi +local=Lokal +remember_me=Ingat saya +forgot_password=Lupa Sandi +forget_password=Lupa sandi? +sign_up_now=Membutuhkan akun? Daftar sekarang. +confirmation_mail_sent_prompt=Email konfirmasi baru telah terkirim ke %s, silakan cek inbox Anda dalam waktu %d jam untuk menyelesaikan proses pendaftaran. +active_your_account=Aktifkan Akun Anda +prohibit_login=Login tidak diperbolehkan +prohibit_login_desc=Akun Anda tidak diperbolehkan untuk masuk, silakan hubungi admin situs. +resent_limit_prompt=Maaf, Anda telah meminta email aktivasi beberapa saat lalu. Silakan tunggu 3 menit kemudian untuk dapat mencoba lagi. +has_unconfirmed_mail=Hi %s, Anda memiliki alamat email yang belum terkonfirmasi (%s). Jika Anda belum menerima email konfirmasi atau perlu untuk mengirim ulang yang baru, silakan klik pada tombol di bawah ini. +resend_mail=Klik di sini untuk mengirim kembali email aktivasi +send_reset_mail=Klik di sini untuk mengirimkan (ulang) email untuk mengatur ulang sandi +reset_password=Atur Ulang Sandi +invalid_code=Maaf, kode konfirmasi Anda telah kadaluarsa atau tidak valid. +reset_password_helper=Klik di sini untuk menyetel ulang sandi +password_too_short=Panjang sandi tidak bisa kurang dari 6 huruf. +non_local_account=Akun non-lokal tidak dapat mengganti password lewat Gogs. + +login_two_factor=Autentikasi Dua Faktor +login_two_factor_passcode=Kode Akses Autentikasi +login_two_factor_enter_recovery_code=Masukkan kode pemulihan dua faktor +login_two_factor_recovery=Pemulihan Dua Faktor +login_two_factor_recovery_code=Kode pemulihan +login_two_factor_enter_passcode=Masukkan kode akses dua faktor +login_two_factor_invalid_recovery_code=Kode pemulihan telah digunakan atau tidak sesuai. + +[mail] +activate_account=Silakan aktifkan akun Anda +activate_email=Silakan cek alamat email Anda +reset_password=Atur ulang sandi anda +register_success=Pendaftaran sukses, Selamat datang +register_notify=Selamat bergabung + +[modal] +yes=Ya +no=Tidak +modify=Ubah + +[form] +UserName=Nama pengguna +RepoName=Nama repository +Email=Alamat email +Password=Sandi +Retype=Ketik ulang sandi +SSHTitle=Nama kunci SSH +HttpsUrl=URL HTTPS +PayloadUrl=URL Muatan +TeamName=Nama tim +AuthName=Nama Otorisasi +AdminEmail=Email admin + +NewBranchName=Nama branch baru +CommitSummary=Ringkasan Commit +CommitMessage=Pesan Commit +CommitChoice=Pilihan Commit +TreeName=Lokasi File +Content=Konten + +require_error=` tidak boleh kosong.` +alpha_dash_error=` harus berupa alfanumerik yang valid atau karakter penghubung (-_).` +alpha_dash_dot_error=` harus berupa alfanumerik yang valid atau karakter penghubung (-_) atau karakter titik.` +alpha_dash_dot_slash_error=harus valid alpha atau numeric atau dash(-_) atau dot characters atau slashes` +size_error=` harus berukuran %s.` +min_size_error=` harus mengandung setidaknya %s karakter.` +max_size_error=` harus mengandung paling banyak %s karakter.` +email_error=` bukanlah alamat email yang valid.` +url_error=` bukanlah URL yang valid.` +include_error=` harus mengandung substring '%s'.` +unknown_error=Kesalahan yang tidak dikenal: +captcha_incorrect=Captcha tidak cocok. +password_not_match=Sandi dan konfirmasi sandi tidak sama. + +username_been_taken=Nama pengguna sudah diambil. +repo_name_been_taken=Nama repositori sudah diambil. +org_name_been_taken=Nama organisasi telah diambil. +team_name_been_taken=Nama tim telah diambil. +email_been_used=Alamat email telah digunakan. +username_password_incorrect=Nama pengguna atau sandi tidak benar. +auth_source_mismatch=Sumber autentikasi yang dipilih tidak terkait dengan pengguna. +enterred_invalid_repo_name=Pastikan bahwa nama repositori yang Anda masukkan benar. +enterred_invalid_owner_name=Pastikan bahwa nama pemilik yang Anda masukkan benar. +enterred_invalid_password=Harap pastikan bahwa sandi yang Anda masukkan benar. +user_not_exist=Pengguna yang diinginkan tidak ditemukan. +last_org_owner=Menghapus pengguna terakhir dari tim pemilik tidak diperbolehkan, karena dibutuhkan paling tidak satu pemilik dari sebuah organisasi. + +invalid_ssh_key=Maaf, kami tidak dapat memverifikasi kunci SSH Anda: %s +unable_verify_ssh_key=Gogs tidak dapat memverifikasi kunci SSH Anda, tetapi kita menganggap bahwa itu sah, silakan periksa kembali. +auth_failed=Autentikasi gagal: %v + +still_own_repo=Akun Anda masih memiliki kepemilikan atas setidaknya satu repositori, Anda harus menghapus atau mentransfernya terlebih dahulu. +still_has_org=Akun Anda masih memiliki keanggotaan dalam setidaknya satu organisasi, Anda harus meninggalkan atau menghapus keanggotaan Anda terlebih dahulu. +org_still_own_repo=Organisasi ini masih memiliki kepemilikan atas repositori, Anda harus menghapus atau mentransfernya terlebih dahulu. + +target_branch_not_exist=Cabang yang ditargetkan tidak ada. + +[user] +change_avatar=Ubah Avatarmu +join_on=Bergabung pada +repositories=Repositori +activity=Aktivitas publik +followers=Pengikut +starred=Bintangnya repositori +following=Mengikuti +follow=Ikuti +unfollow=Berhenti mengikuti + +form.name_not_allowed=Nama pengguna atau pola %q tidak diizinkan. + +[settings] +profile=Profil +password=Sandi +avatar=Avatar +ssh_keys=Kunci SSH +security=Keamanan +repos=Repositori +orgs=Organisasi +applications=Aplikasi +delete=Menghapus akun + +public_profile=Profil publik +profile_desc=Alamat email Anda bersifat publik dan akan digunakan untuk setiap akun yang terkait pemberitahuan dan setiap operasi berbasis web yang dilakukan melalui situs. +password_username_disabled=Pengguna jenis bebas-lokal tidak diperbolehkan untuk mengubah nama pengguna mereka. +full_name=Nama lengkap +website=Situs web +location=Lokasi +update_profile=Ubah profil +update_profile_success=Profil Anda telah diperbarui berhasil. +change_username=Nama pengguna berubah +change_username_prompt=Perubahan ini akan mempengaruhi cara link yang berhubungan dengan akun Anda. +continue=Lanjutkan +cancel=Batal + +lookup_avatar_by_mail=Cari avatar dari email +federated_avatar_lookup=Aktifkan Pencarian Avatar Representasi +enable_custom_avatar=Gunakan Avatar Kostum +choose_new_avatar=Pilih avatar baru +update_avatar=Ubah pengaturan avatar +delete_current_avatar=Hapus avatar terkini +uploaded_avatar_not_a_image=Berkas yang diunggah bukanlah sebuah gambar. +update_avatar_success=Pengaturan avatar Anda telah berhasil diperbarui. + +change_password=Ubah sandi +old_password=Sandi terkini +new_password=Sandi baru +retype_new_password=Ketik ulang sandi baru +password_incorrect=Sandi saat ini tidak benar. +change_password_success=Sandi berhasil diubah. Anda sekarang dapat masuk menggunakan sandi baru ini. +password_change_disabled=Pengguna jenis bebas-lokal tidak diperbolehkan untuk mengubah sandi mereka. + +emails=Alamat email +manage_emails=Mengelola alamat email +email_desc=Alamat email utama akan digunakan untuk pemberitahuan dan operasi lainnya. +primary=Utama +primary_email=Set sebagai utama +delete_email=Hapus +email_deletion=Penghapusan email +email_deletion_desc=Menghapus alamat email ini akan menghapus informasi yang berhubungan dengan akun Anda. Lanjutkan? +email_deletion_success=Email telah berhasil diperbarui! +email_deletion_primary=Tidak bisa menghapus email utama +add_new_email=Menambah alamat email baru +add_email=Tambahkan email +add_email_confirmation_sent=Email konfirmasi baru telah dikirim ke '%s', silakan cek inboxmu dalam waktu %d jam untuk menyelesaikan proses konfirmasi. +add_email_success=Alamat email barumu telah berhasil ditambahkan. + +manage_ssh_keys=Kelola Kunci SSH +add_key=Tambah kunci +ssh_desc=Ini adalah daftar kunci SSH yang terkait dengan akun Anda. Karena kunci ini memungkinkan seseorang menggunakannya untuk mendapatkan akses ke repositori Anda, sangat penting bagi Anda untuk memastikan Anda mengenalinya. +ssh_helper=Tidak tahu caranya? Kunjungi petunjuk GitHub untuk membuat kunci SSH Anda sendiri atau perbaiki masalah umum yang mungkin sedang Anda alami dengan SSH. +add_new_key=Tambah kunci SSH +ssh_key_been_used=Public key telah digunakan. +ssh_key_name_used=Public key dengan nama itu udah pernah ada. +key_name=Nama kunci +key_content=Konten Kunci +add_key_success=Kunci SSH baru '%s' telah berhasil ditambahkan! +delete_key=Hapus +ssh_key_deletion=Penghapusan kunci SSH +ssh_key_deletion_desc=Menghapus kunci SSH ini akan menghapus seluruh akses yang terkait pada akunmu. Lanjutkan saja? +ssh_key_deletion_success=Kunci SSH telah berhasil dihapus! +add_on=Ditambahkan pada +last_used=Terakhir digunakan pada +no_activity=Tidak ada aktifitas terakhir +key_state_desc=Kunci ini digunakan dalam 7 hari terakhir +token_state_desc=Token ini digunakan dalam 7 hari terakhir + +two_factor=Autentikasi dua faktor +two_factor_status=Status: +two_factor_on=Nyala +two_factor_off=Mati +two_factor_enable=Aktifkan +two_factor_disable=Nonaktifkan +two_factor_view_recovery_codes=Lihat dan simpan kode pemulihan anda di tempat yang aman. Anda dapat menggunakannya sebagai kode akses jika Anda kehilangan akses otentikasi aplikasi. +two_factor_http=Untuk operasi HTTP/HTTPS, Anda tidak lagi mampu menggunakan nama pengguna dan kata sandi. Silakan membuat dan menggunakan Token akses pribadi sebagai kredensial Anda, misalnya %[3]s. +two_factor_enable_title=Aktifkan Autentikasi Dua Faktor +two_factor_scan_qr=Silakan gunakan aplikasi autentikasi Anda untuk memindai gambar: +two_factor_or_enter_secret=Atau masukkan rahasianya: +two_factor_then_enter_passcode=Kemudian, masukkan kode akses: +two_factor_verify=Verifikasi +two_factor_invalid_passcode=Kode akses yang Anda masukkan tidak sah, silakan coba lagi! +two_factor_reused_passcode=Kode akses yang Anda masukkan sudah digunakan, coba yang lain! +two_factor_enable_error=Gagal mengaktifkan autentikasi Dua Faktor: %v +two_factor_enable_success=Autentikasi Dua faktor untuk akun Anda berhasil diaktifkan! +two_factor_recovery_codes_title=Kode Pemulihan Autentikasi Dua Faktor +two_factor_recovery_codes_desc=Kode pemulihan digunakan saat Anda sementara kehilangan akses ke aplikasi autentikasi Anda. Setiap kode pemulihan hanya dapat digunakan satu kali, simpan kode ini di tempat yang aman . +two_factor_regenerate_recovery_codes=Regenerate Recovery Codes +two_factor_regenerate_recovery_codes_error=Regenerasi kode pemulihan gagal: %v +two_factor_regenerate_recovery_codes_success=Kode pemulihan baru telah berhasil dibuat! +two_factor_disable_title=Nonaktifkan Autentikasi Dua Faktor +two_factor_disable_desc=Tingkat keamanan akun Anda akan menurun setelah autentikasi dua faktor dinonaktifkan. Apakah Anda ingin melanjutkan? +two_factor_disable_success=Autentikasi dua faktor telah berhasil dilakukan! + +manage_access_token=Kelola Akses Token pribadi +generate_new_token=Buat Token Baru +tokens_desc=Token yang Anda buat dapat digunakan untuk mengakses API-nya Gogs. +access_token_tips=Personal access token mungkin digunakan sebagai username atau password. Sangatn direkomendasikan untuk menggunakan "x-access-token" sebagai username atau personal access token sebagai password untuk aplikasi git. +new_token_desc=Setiap token akan memiliki akses penuh ke akunmu. +token_name=Nama Token +generate_token=Buat Token +generate_token_succees=Akses Token berhasil dibuat! Pastikan di-copy dulu, karena kamu nggak akan bisa ngeliat itu lagi nanti! +delete_token=Hapus +access_token_deletion=Penghapusan Akses Token Pribadi +access_token_deletion_desc=Hapus token akses pribadi ini akan menghapus semua akses aplikasi yang terkait. Apakah Anda ingin melanjutkan? +delete_token_success=Token akses pribadi telah berhasil dihapus! Jangan lupa untuk mengupdate aplikasi anda juga. +token_name_exists=Token dengan nama yang sama telah digunakan. + +orgs.none=Anda bukan anggota organisasi manapun. +orgs.leave_title=Meninggalkan organisasi +orgs.leave_desc=Anda akan kehilangan akses ke semua repositori dan tim setelah Anda meninggalkan organisasi. Apakah Anda ingin melanjutkan? + +repos.leave=Meninggalkan +repos.leave_title=Meninggalkan repositori +repos.leave_desc=Anda akan kehilangan akses ke repositori setelah Anda meninggalkan. Apakah Anda ingin melanjutkan? +repos.leave_success=Anda telah berhasil meninggalkan repositori '%s'! + +delete_account=Hapus Akun Anda +delete_prompt=Operasi akan menghapus account Anda secara permanen, dan TIDAK dapat dibatalkan! +confirm_delete_account=Konfirmasi Penghapusan +delete_account_title=Penghapusan account +delete_account_desc=Akun ini akan dihapus secara permanen, Apakah Anda ingin melanjutkan? + +[repo] +owner=Pemilik +repo_name=Nama Repositori +repo_name_helper=Nama repositori yang baik biasanya terdiri dari kata kunci yang pendek, mudah diingat dan unik. +visibility=Visibilitas +unlisted=Tidak terdaftar +visiblity_helper=Repositori ini Pribadi +unlisted_helper=This repository is Unlisted +visiblity_helper_forced=Situs admin telah memaksa semua repositori baru menjadi Pribadi +visiblity_fork_helper=(Perubahan nilai ini akan mempengaruhi semua garpu) +clone_helper=Butuh bantuan kloning? Kunjungi Bantuan! +fork_repo=Fork Repositori +fork_from=Garpu dari +fork_visiblity_helper=Anda tidak dapat mengubah visibilitas repositori bercabang. +repo_desc=Deskripsi +repo_lang=Bahasa +repo_gitignore_helper=Pilih template .gitignore +license=Lisensi +license_helper=Pilih berkas lisensi +readme=Readme +readme_helper=Pilih template readme +auto_init=Menginisialisasi repositori ini dengan berkas dan template yang dipilih +create_repo=Membuat repositori +default_branch=Cabang Default +mirror_prune=Memangkas +mirror_prune_desc=Hapus semua referensi pelacakan jarak jauh yang tidak lagi ada di remote +mirror_interval=Interval Cermin (jam) +mirror_address=Alamat Cermin +mirror_address_desc=Harap sertakan kredensial pengguna yang diperlukan di alamat. +mirror_last_synced=Terakhir disinkronkan +watchers=Watchers +stargazers=Stargazers +forks=Forks +repo_description_helper=Deskripsi repositori maksimal 512 karakter. +repo_description_length=Karakter tersedia + +form.reach_limit_of_creation=Pemiliknya telah mencapai batas pembuatan maksimum %d repositori. +form.name_not_allowed=Nama atau pola repositori %q tidak diizinkan. + +need_auth=Butuh Otorisasi +migrate_type=Jenis migrasi +migrate_type_helper=Repositori ini akan menjadi mirror +migrate_repo=Migrasi Repositori +migrate.clone_address=Alamat kloning +migrate.clone_address_desc=Ini bisa berupa HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=Anda juga diizinkan untuk memindahkan repositori dengan jalur server lokal. +migrate.permission_denied=Anda tidak diperbolehkan mengimpor repositori lokal. +migrate.invalid_local_path=Jalur lokal tidak valid, tidak ada atau tidaknya sebuah direktori. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. +migrate.failed=Migrasi gagal: %v + +mirror_from=cermin dari +forked_from=ter-fork dari +copy_link=Copy +copy_link_success=Ter-copy! +copy_link_error=Pencet ⌘-C atau Ctrl-C buat nge-copy +copied=Ter-copy, ok +unwatch=Batal liatin +watch=Liatin +unstar=Batal Bintangi +star=Bintangi +fork=Fork + +no_desc=Tidak Ada Deskripsi +quick_guide=Petunjuk Cepat +clone_this_repo=Kloning repositori ini +create_new_repo_command=Buat repositori baru di command line +push_exist_repo=Dorong repositori yang ada dari baris perintah +bare_message=Ini repositori tidak memiliki konten apa pun. + +files=Berkas +branch=Cabang +tree=Pohon +filter_branch_and_tag=Filter cabang atau tag +branches=Ranting +tags=Tag +issues=Masalah +pulls=Permintaan Tarik +labels=Label +milestones=Tonggak sejarah +commits=Komitmen +git_branches=Ranting +releases=Rilis +file_raw=Mentahan +file_history=Riwayat +file_view_raw=Lihat mentahan +file_permalink=Permalink +file_too_large=File ini terlalu besar untuk ditampilkan +video_not_supported_in_browser=Browser Anda tidak mendukung tag video HTML5. + +branches.overview=Ikhtisar +branches.active_branches=Cabang Aktif +branches.stale_branches=Cabang Basi +branches.all=Semua Cabang +branches.updated_by=Diperbarui %[1]s oleh %[2]s +branches.change_default_branch=Ubah Cabang Default +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=Berkas baru +editor.upload_file=Unggah Berkas +editor.edit_file=Edit berkas +editor.preview_changes=Tinjau Perubahan +editor.cannot_edit_non_text_files=Tidak dapat mengedit berkas non-teks +editor.edit_this_file=Edit berkas ini +editor.must_be_on_a_branch=Anda harus berada di cabang untuk membuat atau mengusulkan perubahan pada file ini +editor.fork_before_edit=Anda harus garpu ini repositori sebelum mengedit file +editor.delete_this_file=Hapus berkas ini +editor.must_have_write_access=Anda harus memiliki akses tulis untuk membuat atau mengusulkan perubahan pada file ini +editor.file_delete_success=File ' % s ' telah berhasil dihapus! +editor.name_your_file=Nama berkas... +editor.filename_help=Untuk menambahkan direktori, ketik saja dan tekan /. Untuk menghapus sebuah direktori, masuk ke awal bidang dan tekan backspace. +editor.or=atau +editor.cancel_lower=batal +editor.commit_changes=Perubahan Komitmen +editor.add_tmpl=Tambah '%s/' +editor.add=Tambah '%s' +editor.update=Perbarui '%s' +editor.delete=Hapus '%s' +editor.commit_message_desc=Tambahkan deskripsi perluasan opsional... +editor.commit_directly_to_this_branch=Komit langsung ke cabang %s branch. +editor.create_new_branch=Buat cabang baru untuk komit ini dan mulai permintaan tarik. +editor.new_branch_name_desc=Nama cabang baru... +editor.cancel=Batal +editor.filename_cannot_be_empty=Nama berkas tidak boleh kosong. +editor.branch_already_exists=Cabang '%s' sudah ada di repositori ini. +editor.directory_is_a_file=Entri '%s' di jalur induk adalah file bukan direktori dalam repositori ini. +editor.file_is_a_symlink=File '%s' adalah symlink yang tidak bisa diubah dari web editor. +editor.filename_is_a_directory=Nama file '%s' adalah direktori yang ada di repositori ini. +editor.file_editing_no_longer_exists=File '%s' yang Anda edit sudah tidak ada lagi di repositori. +editor.file_changed_while_editing=Konten file telah berubah sejak Anda mulai mengedit. Klik di sini untuk melihat apa yang telah diubah atau tekan komit lagi untuk menimpa perubahan tersebut. +editor.file_already_exists=File dengan nama '%s' sudah ada di repositori ini. +editor.no_changes_to_show=Tidak ada perubahan untuk ditunjukkan. +editor.fail_to_update_file=Gagal memperbarui / membuat file '%s' dengan error: %v +editor.fail_to_delete_file=Gagal menghapus file '%s' dengan error: %v +editor.add_subdir=Tambahkan subdirektori... +editor.unable_to_upload_files=Gagal mengunggah file ke '%s' dengan kesalahan: %v +editor.upload_files_to_dir=Upload file ke '%s' + +commits.commit_history=Komit Sejarah +commits.commits=Komitmen +commits.search=Cari komit +commits.find=Cari +commits.author=Pembuat +commits.message=Pesan +commits.date=Tanggal +commits.older=Lawas +commits.newer=Terbaru + +issues.new=Isu Baru +issues.new.labels=Label +issues.new.no_label=Tidak ada Label +issues.new.clear_labels=Label yang jelas +issues.new.milestone=Tonggak +issues.new.no_milestone=Tidak ada tonggak +issues.new.clear_milestone=Tonggak yang jelas +issues.new.open_milestone=Buka Tonggak +issues.new.closed_milestone=Tonggak tertutup +issues.new.assignee=Penerima +issues.new.clear_assignee=Hapus penerima hak +issues.new.no_assignee=Tidak ada penerima +issues.create=Buat Terbitan +issues.new_label=Label Baru +issues.new_label_placeholder=Nama label... +issues.create_label=Membuat Label +issues.label_templates.title=Muat seperangkat label yang telah ditentukan +issues.label_templates.info=Belum ada label. Anda bisa mengklik tombol "New Label" di atas untuk membuat satu atau menggunakan set yang telah ditentukan di bawah ini. +issues.label_templates.helper=Pilih label set +issues.label_templates.use=Menggunakan label set ini +issues.label_templates.fail_to_load_file=Gagal untuk memuat label berkas template '%s': %v +issues.open_tab=%d Terbuka +issues.close_tab=%d Tertutup +issues.filter_label=Label +issues.filter_label_no_select=Tidak ada label yang dipilih +issues.filter_milestone=Tonggak +issues.filter_milestone_no_select=Tidak ada tonggak terpilih +issues.filter_assignee=Penerima +issues.filter_assginee_no_select=Tidak ada Penerima yang dipilih +issues.filter_type=Jenis +issues.filter_type.all_issues=Semua masalah +issues.filter_type.assigned_to_you=Ditetapkan kepada Anda +issues.filter_type.created_by_you=Dibuat oleh Anda +issues.filter_type.mentioning_you=Menyebutkan Anda +issues.filter_sort=Urutkan +issues.filter_sort.latest=Terbaru +issues.filter_sort.oldest=Lawas +issues.filter_sort.recentupdate=Baru saja diperbarui +issues.filter_sort.leastupdate=Baru-baru ini diperbarui +issues.filter_sort.mostcomment=Sebagian besar berkomentar +issues.filter_sort.leastcomment=Setidaknya berkomentar +issues.opened_by=dibuka %[1]s oleh %[3]s +issues.opened_by_fake=dibuka %[1]s oleh %[2]s +issues.previous=Sebelumnya +issues.next=Selanjutnya +issues.open_title=Terbuka +issues.closed_title=Ditutup +issues.num_comments=%d komentar +issues.commented_at=`komentar %s ` +issues.delete_comment_confirm=Anda yakin ingin menghapus komentar ini? +issues.no_content=Belum ada konten. +issues.close_issue=Tutup +issues.close_comment_issue=Komentar dan tutup +issues.reopen_issue=Buka kembali +issues.reopen_comment_issue=Komentar dan buka kembali +issues.create_comment=Komentar +issues.closed_at=`tutup %[2]s ` +issues.reopened_at=`buka kembali %[2]s +issues.commit_ref_at=`merujuk masalah ini dari komit [2]s +issues.poster=Poster +issues.collaborator=Kolaborator +issues.owner=Pemilik +issues.sign_in_require_desc=Masuk untuk bergabung dalam percakapan ini. +issues.edit=Sunting +issues.cancel=Batal +issues.save=Simpan +issues.label_title=Nama label +issues.label_color=Warna label +issues.label_count=%d label +issues.label_open_issues=%d masalah terbuka +issues.label_edit=Sunting +issues.label_delete=Hapus +issues.label_modify=Modifikasi Label +issues.label_deletion=Penghapusan label +issues.label_deletion_desc=Menghapus label ini akan menghapus informasinya di semua masalah terkait. Apakah Anda ingin melanjutkan? +issues.label_deletion_success=Label telah berhasil dihapus! +issues.num_participants=%d Peserta +issues.attachment.open_tab=`Klik untuk melihat "%s" di tab baru` +issues.attachment.download=`Klik untuk mendownload "%s"` + +pulls.new=Permintaan Tarik Baru +pulls.compare_changes=Membandingkan Perubahan +pulls.compare_changes_desc=Bandingkan dua cabang dan buat permintaan tarik untuk perubahan. +pulls.compare_base=mendasarkan +pulls.compare_compare=membandingkan +pulls.filter_branch=Filter cabang +pulls.no_results=Tidak ada hasil yang ditemukan. +pulls.nothing_to_compare=Tidak ada yang bisa dibandingkan karena cabang dasar dan kepala bahkan ada. +pulls.nothing_merge_base=Tidak ada yang bisa dibandingkan karena dua cabang memiliki sejarah yang sama sekali berbeda. +pulls.has_pull_request=`Sudah ada permintaan tarik antara kedua target ini: % [2] s #% [3] d ` +pulls.create=Buat Permintaan Tarik +pulls.title_desc=ingin menggabungkan %[1]d komit dari %[2]s menjadi %[3]s +pulls.merged_title_desc=menggabungkan %[1]d komit dari %[2]s menjadi %[3]s%[4] s +pulls.tab_conversation=Percakapan +pulls.tab_commits=Komitmen +pulls.tab_files=File yang diubah +pulls.reopen_to_merge=Silahkan membuka kembali permintaan tarik ini untuk melakukan operasi gabungan. +pulls.merged=Gabung +pulls.has_merged=Permintaan tarik ini telah berhasil digabungkan! +pulls.data_broken=Data permintaan tarik ini telah pecah karena penghapusan garpu informasi. +pulls.is_checking=Memeriksa konflik ini masih dalam proses, silahkan segarkan halaman dalam beberapa saat. +pulls.can_auto_merge_desc=Permintaan tarik ini dapat digabungkan secara otomatis. +pulls.cannot_auto_merge_desc=Permintaan tarik ini tidak bisa digabungkan secara otomatis karena ada konflik. +pulls.cannot_auto_merge_helper=Silahkan bergabung secara manual untuk menyelesaikan konflik. +pulls.create_merge_commit=Membuat komit penggabungan +pulls.rebase_before_merging=Rebase sebelum penggabungan +pulls.commit_description=Deskripsi Commit +pulls.merge_pull_request=Permintaan tarik gabungan +pulls.open_unmerged_pull_exists='Anda tidak dapat melakukan operasi membuka kembali karena sudah ada permintaan tarik terbuka (#%d) dari repositori yang sama dengan penggabungan informasi yang sama dan menunggu penggabungan. ' +pulls.delete_branch=Menghapus cabang +pulls.delete_branch_has_new_commits=Cabang tidak dapat dihapus karena itu telah baru komit setelah menggabungkan. + +milestones.new=Tonggak sejarah baru +milestones.open_tab=%d Dibuka +milestones.close_tab=%d Ditutup +milestones.closed=Ditutup %s +milestones.no_due_date=Tidak ada batas tanggal terakhir +milestones.open=Buka +milestones.close=Tutup +milestones.new_subheader=Menciptakan tonggak untuk mengatur masalah Anda. +milestones.create=Tonggak yang jelas +milestones.title=Gelar +milestones.desc=Keterangan +milestones.due_date=Tanggal jatuh tempo (opsional) +milestones.clear=Bersih +milestones.invalid_due_date_format=Format tanggal jatuh tidak berlaku, harus 'yyyy-mm-dd'. +milestones.create_success=Milestone '%s' telah berhasil dibuat! +milestones.edit=Ubah tonggak +milestones.edit_subheader=Menggunakan diskripsi yang lebih baik untuk tonggak sehingga orang tidak akan bingung. +milestones.cancel=Batal +milestones.modify=Ubah tonggak +milestones.edit_success=Perubahan tonggakan'%s' telah berhasil disimpan! +milestones.deletion=Menghapus tonggak +milestones.deletion_desc=Tonggak ini akan menghapus batas informasi dalam semua terkait masalah. Apakah Anda ingin terus? +milestones.deletion_success=Tonggak telah berhasil dihapus! + +wiki=Wiki +wiki.welcome=Selamat datang untuk wiki! +wiki.welcome_desc=Wiki adalah tempat di mana Anda ingin dokumen proyek Anda bersama-sama dan membuatnya lebih baik. +wiki.create_first_page=Membuat halaman pertama +wiki.page=Halaman +wiki.filter_page=Halaman penyaring +wiki.new_page=Buat halaman baru +wiki.default_commit_message=Menulis catatan tentang pembaruan ini (opsional). +wiki.save_page=Simpan halaman +wiki.last_commit_info=%s mengedit halaman ini %s +wiki.edit_page_button=Sunting +wiki.new_page_button=Halaman Baru +wiki.delete_page_button=Hapus Halaman +wiki.delete_page_notice_1=Ini akan menghapus halaman "%s". Harap dipastikan. +wiki.page_already_exists=Halaman Wiki dengan nama yang sama sudah ada. +wiki.pages=Halaman +wiki.last_updated=Terakhir Diperbarui %s + +settings=Pengaturan +settings.options=Opsi +settings.collaboration=Kolaborasi +settings.collaboration.admin=Admin +settings.collaboration.write=Tulis +settings.collaboration.read=Baca +settings.collaboration.undefined=Tidak terdefinisi +settings.branches=Ranting +settings.branches_bare=Anda tidak bisa mengelola cabang untuk gudang kosong. Tolong dorong beberapa konten terlebih dahulu. +settings.default_branch=Cabang Default +settings.default_branch_desc=Cabang default dianggap sebagai cabang "dasar" untuk kode komit, permintaan tarik dan pengeditan online. +settings.update=Perbarui +settings.update_default_branch_unsupported=Ubah cabang default tidak didukung oleh versi Git di server. +settings.update_default_branch_success=Cabang bawaan dari repositori ini telah berhasil diupdate! +settings.protected_branches=Cabang yang Dilindungi +settings.protected_branches_desc=Lindungi cabang dari dorongan paksa, penghapusan yang tidak disengaja dan kode kode whitelist. +settings.choose_a_branch=Pilih cabang... +settings.branch_protection=Perlindungan Cabang +settings.branch_protection_desc=Harap pilih opsi perlindungan untuk cabang % s . +settings.protect_this_branch=Lindungi cabang ini +settings.protect_this_branch_desc=Nonaktifkan kekuatan mendorong dan mencegah dari penghapusan. +settings.protect_require_pull_request=Perlu tarik permintaan alih-alih langsung mendorong +settings.protect_require_pull_request_desc=Aktifkan opsi ini untuk menonaktifkan langsung mendorong ke cabang ini. Komitmen harus didorong ke cabang lain yang tidak dilindungi dan bergabung ke cabang ini melalui permintaan tarik. +settings.protect_whitelist_committers=Daftar putih yang bisa mendorong ke cabang ini +settings.protect_whitelist_committers_desc=Tambahkan orang atau tim ke daftar putih dorongan langsung ke cabang ini. Pengguna di whitelist akan bypass memerlukan permintaan tarik cek. +settings.protect_whitelist_users=Pengguna yang bisa masuk ke cabang ini +settings.protect_whitelist_search_users=Cari pengguna +settings.protect_whitelist_teams=Tim yang anggotanya dapat mendorong cabang ini +settings.protect_whitelist_search_teams=Tim pencarian +settings.update_protect_branch_success=Lindungi opsi untuk cabang ini telah berhasil diupdate! +settings.hooks=Webhooks +settings.githooks=Git kait +settings.basic_settings=Setelan Dasar +settings.mirror_settings=Setelan Cermin +settings.sync_mirror=Sinkronkan Sekarang +settings.mirror_sync_in_progress=Sinkronisasi cermin sedang berlangsung, harap segarkan laman dalam waktu sekitar satu menit. +settings.site=Situs Resmi +settings.update_settings=Perbarui Pengaturan +settings.change_reponame_prompt=Perubahan ini akan mempengaruhi bagaimana link berhubungan dengan repositori. +settings.advanced_settings=Setelan lanjutan +settings.wiki_desc=Mengaktifkan sistem wiki +settings.use_internal_wiki=Menggunakan builtin wiki +settings.allow_public_wiki_desc=Izinkan akses publik ke wiki saat repositori bersifat pribadi +settings.use_external_wiki=Menggunakan wiki eksternal +settings.external_wiki_url=URL Wiki Eksternal +settings.external_wiki_url_desc=Pengunjung akan diarahkan ke URL saat mereka mengklik tab. +settings.issues_desc=Aktifkan pelacak masalah +settings.use_internal_issue_tracker=Gunakan pelacak isu ringan builtin +settings.allow_public_issues_desc=Izinkan akses publik ke masalah saat repositori bersifat pribadi +settings.use_external_issue_tracker=Gunakan pelacak isu eksternal +settings.external_tracker_url=URL Pelacak Masalah Eksternal +settings.external_tracker_url_desc=Pengunjung akan diarahkan ke URL saat mereka mengklik tab. +settings.tracker_url_format=Format URL Pelacak Edisi Eksternal +settings.tracker_issue_style=Isu Penamaan Tracker Isu Eksternal: +settings.tracker_issue_style.numeric=Numerik +settings.tracker_issue_style.alphanumeric=Alfanumerik +settings.tracker_url_format_desc=Anda dapat menggunakan placeholder {user}{repo}{index untuk nama pengguna, nama repositori dan indeks masalah. +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Abaikan perubahan di spasi +settings.pulls.allow_rebase_merge=Izinkan gunakan rebase untuk menggabungkan komit +settings.danger_zone=Zona Bahaya +settings.cannot_fork_to_same_owner=Anda tidak dapat membayar sebuah repositori kepada pemilik aslinya. +settings.new_owner_has_same_repo=Pemilik baru sudah memiliki repositori dengan nama yang sama. Silakan pilih nama lain. +settings.convert=Mengkonversi Ke Reguler Repositori +settings.convert_desc=Anda dapat mengubah cermin ini menjadi repositori biasa . Ini tidak bisa dibalik. +settings.convert_notices_1=- Operasi ini akan mengubah mirror repositori ini menjadi repositori reguler dan tidak dapat dibatalkan. +settings.convert_confirm=Konfirmasikan Konversi +settings.convert_succeed=Repositori telah dikonversi menjadi tipe biasa dengan sukses. +settings.transfer=Kepemilikan transfer +settings.transfer_desc=Transfer repositori ini ke pengguna lain atau ke organisasi tempat Anda memiliki hak admin. +settings.transfer_notices_1=- Anda akan kehilangan akses jika pemilik baru adalah pengguna individual. +settings.transfer_notices_2=- Anda akan menghemat akses jika pemilik baru adalah organisasi dan jika Anda adalah salah satu pemiliknya. +settings.transfer_form_title=Harap masukkan informasi berikut untuk mengkonfirmasi operasi Anda: +settings.wiki_delete=Menghapus Data Wiki +settings.wiki_delete_desc=Data wiki yang Anda hapus tidak dapat dikembalikan. Mohon dipastikan. +settings.wiki_delete_notices_1=- Ini akan menghapus dan menonaktifkan wiki untuk %s +settings.wiki_deletion_success=Data wiki repositori telah berhasil dihapus. +settings.delete=Hapus repositori ini +settings.delete_desc=Repositori yang Anda hapus, tidak dapat dikembalikan. Mohon dipastikan. +settings.delete_notices_1=- Operasi ini TIDAK BISA dibatalkan. +settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access. +settings.delete_notices_fork_1=- Semua garpu akan menjadi independen setelah dihapus. +settings.deletion_success=Repositori telah berhasil dihapus! +settings.update_settings_success=Opsi repositori telah berhasil diupdate. +settings.transfer_owner=Pemilik Baru +settings.make_transfer=Membuat Transfer +settings.transfer_succeed=Kepemilikan repositori telah berhasil ditransfer. +settings.confirm_delete=Konfirmasi Penghapusan +settings.add_collaborator=Tambahkan Kolaborator Baru +settings.add_collaborator_success=Kolaborator baru telah ditambahkan. +settings.delete_collaborator=Hapus +settings.collaborator_deletion=Penghapusan kolaborator +settings.collaborator_deletion_desc=Pengguna ini tidak lagi memiliki akses kolaborasi ke repositori ini setelah penghapusan. Apakah Anda ingin melanjutkan? +settings.remove_collaborator_success=Kolaborator telah dihapus. +settings.search_user_placeholder=Cari pengguna... +settings.org_not_allowed_to_be_collaborator=Organisasi tidak diperbolehkan untuk ditambahkan sebagai kolaborator. +settings.hooks_desc=Webhooks seperti pemicu peristiwa HTTP POST dasar. Kapan pun terjadi sesuatu di Gog, kami akan menangani pemberitahuan tersebut ke host target yang Anda tentukan. Pelajari lebih lanjut di Panduan Webhooks ini. +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Pilih jenis... +settings.add_webhook=Tambahkan Webhook +settings.webhook_deletion=Hapus Webhook +settings.webhook_deletion_desc=Hapus halaman web ini akan menghapus informasinya dan semua riwayat pengiriman. Apakah Anda ingin melanjutkan? +settings.webhook_deletion_success=Webhook telah berhasil dihapus! +settings.webhook.test_delivery=Test Delivery +settings.webhook.test_delivery_desc=Kirim pengiriman acara push palsu untuk menguji setting webhook Anda +settings.webhook.test_delivery_success=Webhook uji telah ditambahkan ke antrian pengiriman. Mungkin diperlukan beberapa detik sebelum muncul dalam riwayat pengiriman. +settings.webhook.redelivery=Redelivery +settings.webhook.redelivery_success=Tugas Hook ' % s ' telah dibaca ke antrian pengiriman. Perlu beberapa detik untuk memperbarui status pengiriman dalam sejarah. +settings.webhook.request=Permintaan +settings.webhook.response=Tanggapan +settings.webhook.headers=Header +settings.webhook.payload=Payload +settings.webhook.body=Tubuh +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. +settings.githooks_desc=Git Hooks didukung oleh Git itu sendiri, Anda dapat mengedit file kait yang didukung dalam daftar di bawah untuk melakukan operasi kustom. +settings.githook_edit_desc=Jika hook tidak aktif, konten sampel akan disajikan. Meninggalkan konten ke nilai kosong akan menonaktifkan hook ini. +settings.githook_name=Nama Hook +settings.githook_content=Konten Hook +settings.update_githook=Update Hook +settings.add_webhook_desc=Gogs akan mengirimkan permintaan kode POST ke URL yang Anda tentukan, bersama dengan rincian mengenai peristiwa yang terjadi. Anda juga dapat menentukan jenis format data yang ingin Anda dapatkan saat memicu kail (JSON, x-www-form-urlencoded, XML, etc). Informasi lebih lanjut dapat ditemukan di Panduan Webhooks. +settings.payload_url=URL Payload +settings.content_type=Jenis konten +settings.secret=Rahasia +settings.secret_desc=Rahasia akan dikirim saat SHA256 HMAC hex mencerna muatan melalui header X-Gogs-Signature. +settings.slack_username=Nama pengguna +settings.slack_icon_url=URL ikon +settings.slack_color=Warna +settings.event_desc=Kapan seharusnya webhook ini dipicu? +settings.event_push_only=Cukup dengan push event. +settings.event_send_everything=I need everything. +settings.event_choose=Biarkan saya memilih apa yang saya butuhkan. +settings.event_create=Membuat +settings.event_create_desc=Cabang atau tag dibuat +settings.event_delete=Menghapus +settings.event_delete_desc=Cabang atau tag dihapus +settings.event_fork=Garpu +settings.event_fork_desc=Repositori bercabang +settings.event_push=Dorong +settings.event_push_desc=Git mendorong ke repositori +settings.event_issues=Masalah +settings.event_issues_desc=Masalah dibuka, ditutup, dibuka kembali, diedit, ditugaskan, belum ditetapkan, label diperbarui, label dihapus, dirham, atau demilestoned. +settings.event_pull_request=Permintaan tarik +settings.event_pull_request_desc=Tarik permintaan dibuka, ditutup, dibuka kembali, diedit, ditugaskan, belum ditetapkan, label diperbarui, label dibersihkan, dirender, diremilahkan, atau disinkronkan. +settings.event_issue_comment=Isu Komentar +settings.event_issue_comment_desc=Komentar terbitan dibuat, diedit, atau dihapus. +settings.event_release=Melepaskan +settings.event_release_desc=Rilis diterbitkan dalam repositori. +settings.active=Aktif +settings.active_helper=Rincian tentang kejadian yang memicu kail tersebut akan disampaikan juga. +settings.add_hook_success=Webhook baru telah ditambahkan. +settings.update_webhook=Perbarui Webhook +settings.update_hook_success=Webhook telah diperbarui. +settings.delete_webhook=Menghapus Webhook +settings.recent_deliveries=Pengiriman terbaru +settings.hook_type=Jenis Hook +settings.add_slack_hook_desc=Tambahkan Slack integrasi ke repositori Anda. +settings.add_discord_hook_desc=Tambahkan integrasi Discord ke repositori Anda. +settings.add_dingtalk_hook_desc=Tambahkan integrasi Dingtalk ke repositori Anda. +settings.slack_token=Token +settings.slack_domain=Domain +settings.slack_channel=Channel +settings.deploy_keys=Deploy Keys +settings.deploy_keys_helper=Common Gotcha! Jika Anda ingin menambahkan kunci publik pribadi, tambahkan di setelan akun Anda. +settings.add_deploy_key=Tambahkan Kunci Deploy +settings.deploy_key_desc=Kunci penempatan hanya memiliki akses baca-saja. Mereka tidak sama dengan kunci SSH akun pribadi. +settings.no_deploy_keys=Anda belum menambahkan kunci penggelaran. +settings.title=Judul +settings.deploy_key_content=Konten +settings.key_been_used=Menerapkan konten utama telah digunakan. +settings.key_name_used=Kunci penempatan dengan nama yang sama sudah ada. +settings.add_key_success=Kunci penerapan baru '%s' telah berhasil ditambahkan! +settings.deploy_key_deletion=Hapus Kunci Deploy +settings.deploy_key_deletion_desc=Menghapus kunci penggelaran ini akan menghapus semua akses yang terkait untuk repositori ini. Apakah Anda ingin melanjutkan? +settings.deploy_key_deletion_success=Kunci penempatan telah berhasil dihapus! +settings.description_desc=Description of repository. Maximum 512 characters length. +settings.description_length=Karakter tersedia + +diff.browse_source=Jelajahi Sumber +diff.parent=induk +diff.commit=melakukan +diff.data_not_available=Data Diff Tidak Tersedia. +diff.show_diff_stats=Tampilkan Statistik Diff +diff.show_split_view=Tampilan Split +diff.show_unified_view=Unified View +diff.stats_desc= %d mengubah file dengan %d tambahan dan %d penghapusan +diff.bin=TEMPAT SAMPAH +diff.view_file=Tampilan Berkas +diff.file_suppressed=File diff ditekan karena terlalu besar +diff.too_many_files=Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini + +release.releases=Rilis +release.new_release=Rilis Baru +release.draft=Konsep +release.prerelease=Pra-Rilis +release.edit=edit +release.ahead=%d melakukan %s sejak rilis ini +release.source_code=Kode sumber +release.new_subheader=Publikasikan rilis untuk mengulangi produk. +release.edit_subheader=Log perubahan terperinci dapat membantu pengguna memahami apa yang telah diperbaiki. +release.tag_name=Nama tag +release.target=Sasaran +release.tag_helper=Memilih sebuah sekolah yang lumayan, atau membuat yang baru yang lumayan pada mempublikasikan. +release.title=Gelar +release.content=Konten +release.write=Tulis +release.preview=Pertinjauan +release.loading=Memuat... +release.prerelease_desc=Ini adalah pra-rilis +release.prerelease_helper=Kami akan menunjukkan bahwa rilis ini tidak siap-produksi. +release.cancel=Batal +release.publish=Menerbitkan rilis +release.save_draft=Simpan rancangan +release.edit_release=Sunting Rilis +release.delete_release=Hapus Rilisan ini +release.deletion=Rilis dihapus +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.tag_name_already_exist=Release with this tag name already exists. +release.tag_name_invalid=Nama tag ini tidak benar. +release.downloads=Unduhan + +[org] +org_name_holder=Nama organisasi +org_full_name_holder=Nama organisasi penuh +org_name_helper=Nama besar organisasi yang pendek dan tak terlupakan. +create_org=Membuat organisasi +repo_updated=Diperbarui +people=Orang-orang +invite_someone=Undang seseorang +teams=Tim +lower_members=anggota +lower_repositories=repositori +create_new_team=Buat Tim Baru +org_desc=Deskripsi +team_name=Nama Tim +team_desc=Deskripsi +team_name_helper=Anda akan menggunakan nama ini lagi tim ini dalam percakapan. +team_desc_helper=Apa tentang semua tim ini? +team_permission_desc=Apa tingkat izin ini harus? + +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. + +settings=Pengaturan +settings.options=Opsi +settings.full_name=Nama lengkap +settings.website=Situs web +settings.location=Lokasi +settings.update_settings=Setelan Pembaharuan +settings.update_setting_success=Organisasi pengaturan telah diperbarui dengan sukses. +settings.change_orgname_prompt=Perubahan ini akan mempengaruhi bagaimana link berhubungan dengan organisasi. +settings.update_avatar_success=Organisasi pengaturan telah di perbarui dengan sukses. +settings.delete=Hapus Organisasi +settings.delete_account=Hapus Organisasi ini +settings.delete_prompt=Organisasi akan dihapus secara permanen dan TIDAK dapat dipulihkan! +settings.confirm_delete_account=Konfirmasi Penghapusan +settings.delete_org_title=Organisasi dihapus +settings.delete_org_desc=Organisasi ini akan dihapus secara permanen, apakah Anda ingin terus? +settings.hooks_desc=Tambahkan webhooks yang akan dipicu untuk semua repositori di bawah organisasi ini. + +members.membership_visibility=Keanggotaan Visibilitas: +members.public=Umum +members.public_helper=jadilah pribadi +members.private=Pribadi +members.private_helper=jadikan publik +members.member_role=Anggota Peran: +members.owner=Pemilik +members.member=Anggota +members.remove=Menghapus +members.leave=Meninggalkan +members.invite_desc=Menambahkan anggota baru ke %s: +members.invite_now=Undang Sekarang + +teams.join=Bergabung +teams.leave=Tinggalkan +teams.read_access=Baca Akses +teams.read_access_helper=Tim ini dapat melihat dan mencabangkan repositori. +teams.write_access=Akses menulis +teams.write_access_helper=This team will be able to read its repositories, as well as push to them. +teams.admin_access=Akses Admin +teams.admin_access_helper=Tim ini akan dapat mendorong / menarik ke repositorinya, dan juga menambahkan kolaborator lainnya kepada mereka. +teams.no_desc=Tim ini tidak memiliki deskripsi +teams.settings=Pengaturan +teams.owners_permission_desc=Pemilik memiliki akses penuh ke semua repositori dan memiliki hak admin ke organisasi. +teams.members=Anggota tim +teams.update_settings=Perbarui Setelan +teams.delete_team=Hapus Tim Ini +teams.add_team_member=Tambahkan Anggota Tim +teams.delete_team_title=Penghapusan Tim +teams.delete_team_desc=Karena tim ini akan dihapus, anggota tim ini mungkin kehilangan akses ke beberapa repositori. Apakah Anda ingin melanjutkan? +teams.delete_team_success=Tim yang diberikan telah berhasil dihapus. +teams.read_permission_desc=Keanggotaan dalam tim ini memberikan akses Baca : anggota dapat melihat dan mengkloning repositori tim. +teams.write_permission_desc=Keanggotaan dalam tim ini memberikan akses Tulis : anggota dapat membaca dan mendorong ke repositori tim. +teams.admin_permission_desc=Keanggotaan dalam tim ini memberikan akses Admin : anggota dapat membaca, mendorong, dan menambahkan kolaborator ke repositori tim. +teams.repositories=Tim Repositori +teams.search_repo_placeholder=Cari repositori... +teams.add_team_repository=Tambahkan Tim Repositori +teams.remove_repo=Menghapus +teams.add_nonexistent_repo=The repositori Anda mencoba untuk menambahkan tidak ada, silahkan buat terlebih dahulu. + +[admin] +dashboard=Dasbor +users=Pengguna +organizations=Organisasi +repositories=Repositori +authentication=Autentikasi +config=Konfigurasi +notices=Pemberitahuan sistem +monitor=Pemantauan +first_page=Pertama +last_page=Terakhir +total=Total: %d + +dashboard.build_info=Informasi build +dashboard.app_ver=Versi aplikasi +dashboard.git_version=Versi Git +dashboard.go_version=Versi Go (Golang) +dashboard.build_time=Durasi +dashboard.build_commit=Setuju Membangun +dashboard.statistic=Statistik +dashboard.operations=Operasi +dashboard.system_status=Status Monitor Sistem +dashboard.statistic_info=GogsDatabase memiliki %d pengguna, %d organisasi, %d kunci publik, %d repositori, %d jamtangan, %d bintang, %dactions, %d akses, %d isu, %d komentar, %d akun sosial, %d berikut, %d mirror, %d rilis, %d sumber masuk, %d webhooks, %d tonggak,%d label, %d tugas hook, %d tim, %d memperbarui tugas, %d lampiran. +dashboard.operation_name=Nama operasi +dashboard.operation_switch=Beralih +dashboard.select_operation_to_run=Harap menentukan operasi yang dijalankan +dashboard.operation_run=Menjalankan +dashboard.clean_unbind_oauth=Bersihkan OAuth yang tidak terikat +dashboard.clean_unbind_oauth_success=Semua unbind OAuthes telah berhasil dihapus. +dashboard.delete_inactivate_accounts=Hapus semua akun yang tidak aktif +dashboard.delete_inactivate_accounts_success=Semua akun nonaktif telah berhasil dihapus. +dashboard.delete_repo_archives=Hapus semua arsip repositori +dashboard.delete_repo_archives_success=Semua arsip repositori telah berhasil dihapus. +dashboard.delete_missing_repos=Hapus semua catatan repositori yang kehilangan file Git +dashboard.delete_missing_repos_success=Semua catatan repositori yang kehilangan file Git telah berhasil dihapus. +dashboard.git_gc_repos=Lakukan pengumpulan sampah di repositori +dashboard.git_gc_repos_success=Semua repositori telah berhasil mengumpulkan sampah. +dashboard.resync_all_sshkeys=Rewrite '.ssh / authorized_keys' file (hati-hati: kunci non-Gogs akan hilang) +dashboard.resync_all_sshkeys_success=Semua kunci publik telah berhasil ditulis ulang. +dashboard.resync_all_hooks=Resync menerima, memperbarui dan menerima kait setelah menerima semua repositori +dashboard.resync_all_hooks_success=Semua kuki pra-terima, pembaruan, dan pasca menerima repositori telah berhasil diverifikasi ulang. +dashboard.reinit_missing_repos=Reinitialize semua catatan repositori yang kehilangan file Git +dashboard.reinit_missing_repos_success=Semua catatan repositori yang kehilangan file Git telah berhasil diinisiasi ulang. + +dashboard.server_uptime=Server Uptime +dashboard.current_goroutine=Goroutin saat ini +dashboard.current_memory_usage=Penggunaan memori saat ini +dashboard.total_memory_allocated=Total Memori Dialokasikan +dashboard.memory_obtained=Memori yang didapat +dashboard.pointer_lookup_times=Pointer Lookup Times +dashboard.memory_allocate_times=Memory Allocate Times +dashboard.memory_free_times=Memori Free Times +dashboard.current_heap_usage=Penggunaan Heap saat ini +dashboard.heap_memory_obtained=Memori Heap Diperoleh +dashboard.heap_memory_idle=Memori tumpukan menganggur +dashboard.heap_memory_in_use=Heap Memory In Use +dashboard.heap_memory_released=Memori Heap Dirilis +dashboard.heap_objects=Benda tumpukan +dashboard.bootstrap_stack_usage=Bootstrap Stack Usage +dashboard.stack_memory_obtained=Memori Stack Diperoleh +dashboard.mspan_structures_usage=Penggunaan Struktur MSpan +dashboard.mspan_structures_obtained=Struktur MSpan Diperoleh +dashboard.mcache_structures_usage=Penggunaan Struktur MCache +dashboard.mcache_structures_obtained=Struktur MCache Diperoleh +dashboard.profiling_bucket_hash_table_obtained=Profil Meja Bucket Hash Diperoleh +dashboard.gc_metadata_obtained=Metadata GC Diperoleh +dashboard.other_system_allocation_obtained=Alokasi Sistem Lainnya Diperoleh +dashboard.next_gc_recycle=Selanjutnya GC Recycle +dashboard.last_gc_time=Sejak Waktu GC Terakhir +dashboard.total_gc_time=Total GC Jeda +dashboard.total_gc_pause=Total GC Jeda +dashboard.last_gc_pause=Terakhir Jeda +dashboard.gc_times=GC Times + +users.user_manage_panel=User Manage Panel +users.new_account=Buat akun baru +users.name=Nama +users.activated=Diaktifkan +users.admin=Admin +users.repos=Repos +users.created=Dibuat +users.send_register_notify=Kirim Pemberitahuan Pendaftaran ke Pengguna +users.new_success=Akun baru '%s' telah berhasil dibuat. +users.edit=Edit +users.auth_source=Sumber Autentikasi +users.local=Lokal +users.auth_login_name=Nama Masuk Autentikasi +users.password_helper=Biarkan kosong agar tetap tidak berubah. +users.update_profile_success=Profil akun telah berhasil diupdate. +users.edit_account=Mengedit akun +users.max_repo_creation=Maximum Repository Creation Limit +users.max_repo_creation_desc=(Set -1 untuk menggunakan batas default global) +users.is_activated=Akun ini diaktifkan +users.prohibit_login=Akun ini tidak diperbolekan masuk +users.is_admin=Akun ini memiliki izin administrator +users.allow_git_hook=Akun ini memiliki izin untuk membuat kait Git +users.allow_import_local=Akun ini memiliki izin untuk mengimpor repositori lokal +users.update_profile=Perbarui Profil Akun +users.delete_account=Hapus Akun Ini +users.still_own_repo=Akun ini masih memiliki kepemilikan setidaknya satu repositori, Anda harus menghapus atau mentransfernya terlebih dahulu. +users.still_has_org=Akun ini masih memiliki keanggotaan dalam setidaknya satu organisasi, Anda harus meninggalkan atau menghapus organisasi terlebih dahulu. +users.deletion_success=Akun telah berhasil dihapus! + +orgs.org_manage_panel=Organisasi Kelola Panel +orgs.name=Nama +orgs.teams=Tim +orgs.members=Anggota + +repos.repo_manage_panel=Pengelolaan Repositori Panel +repos.owner=Pemilik +repos.name=Nama +repos.private=Pribadi +repos.watches=Jam tangan +repos.stars=Bintang +repos.issues=Masalah +repos.size=Ukuran + +auths.auth_sources=Sumber Autentikasi +auths.new=Tambahkan Sumber Baru +auths.name=Nama +auths.type=Mengetik +auths.enabled=Diaktifkan +auths.default=Standar +auths.updated=Diperbarui +auths.auth_type=Jenis Autentikasi +auths.auth_name=Nama Autentikasi +auths.security_protocol=Protokol Keamanan +auths.domain=Domain +auths.host=Tuan rumah +auths.port=Pelabuhan +auths.bind_dn=Bind DN +auths.bind_dn_helper=Anda dapat menggunakan '%s' sebagai placeholder untuk nama pengguna, misalnya DOM\%s +auths.bind_password=Bind Password +auths.bind_password_helper=Peringatan: Kata sandi ini disimpan dalam teks biasa. Jangan gunakan akun dengan privilege yang tinggi. +auths.user_base=Basis pencarian pengguna +auths.user_dn=Pengguna DN +auths.attribute_username=Atribut nama pengguna +auths.attribute_username_placeholder=Biarkan kosong untuk menggunakan nilai field form masuk untuk nama pengguna. +auths.attribute_name=Atribut Nama Depan +auths.attribute_surname=Atribut nama keluarga +auths.attribute_mail=Atribut Email +auths.verify_group_membership=Verifikasi keanggotaan grup +auths.group_search_base_dn=Group Search Base DN +auths.group_filter=Filter Kelompok +auths.group_attribute_contain_user_list=Atribut Grup yang Mengandung Daftar Pengguna +auths.user_attribute_listed_in_group=Atribut Pengguna Terdaftar di Grup +auths.attributes_in_bind=Ambil atribut dalam konteks Bind DN +auths.filter=Pengguna saringan +auths.admin_filter=Filter Admin +auths.ms_ad_sa=Otentifikasi sistem +auths.smtp_auth=Autentikasi tipe SMTP +auths.smtphost=Host SMTP +auths.smtpport=Port SMTP +auths.allowed_domains=Domains di izinkan +auths.allowed_domains_helper=Biarkan kosong untuk tidak membatasi setiap domain, beberapa Domain harus dipisahkan oleh koma ',',. +auths.enable_tls=Aktifkan Enkripsi TLS +auths.skip_tls_verify=Lewati Verifikasi TLS +auths.pam_service_name=Nama layanan PAM +auths.enable_auto_register=Mengaktifkan pendaftaran otomatis +auths.edit=Ubah Pengaturan Autentikasi +auths.activated=Autentikasi ini diaktifkan +auths.default_auth=Autentikasi ini adalah sumber masuk bawaan +auths.new_success=Autentikasi baru %s berhasil ditambahkan. +auths.update_success=Pengaturan autentikasi berhasil diperbarui. +auths.update=Perbarui Pengaturan Autentikasi +auths.delete=Hapus Autentikasi Ini +auths.delete_auth_title=Penghapusan Autentikasi +auths.delete_auth_desc=Autentikasi ini akan dihapus, apakah Anda ingin melanjutkan? +auths.still_in_used=Autentikasi ini masih digunakan oleh pengguna lain, silakan hapus atau ubah pengguna tersebut ke tipe masuk lainnya. +auths.deletion_success=Autentikasi berhasil dihapus! +auths.login_source_exist=Sumber masuk %s sudah tersedia. +auths.github_api_endpoint=Titik akhir API + +config.not_set=(tidak diterapkan) +config.server_config=Konfigurasi Server +config.brand_name=Nama Merek/Logo/Perusahaan +config.run_user=Menjalankan penggunaa +config.run_mode=Run mode +config.server.external_url=URL eksternal +config.server.domain=Domain +config.server.protocol=Protokol +config.server.http_addr=Alamat HTTP +config.server.http_port=Port HTTP +config.server.cert_file=Berkas Sertifikat +config.server.key_file=Berkas baru +config.server.tls_min_version=Minimum versi TLS +config.server.unix_socket_permission=Aturan unix socket +config.server.local_root_url=Lokal root url +config.server.offline_mode=mode luring +config.server.disable_router_log=Menonaktifkan router log +config.server.enable_gzip=aktifkan gzip +config.server.app_data_path=target data aplikasi +config.server.load_assets_from_disk=memanggil asset dari disk +config.server.landing_url=Landing URL + +config.ssh_config=Konfigurasi SSH +config.ssh.enabled=Diaktifkan +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Path akar +config.ssh.keygen_path=Path keygen +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Ukuran kunci minimum +config.ssh.rewrite_authorized_keys_at_start=Tulis ulang "authorized_keys" saat memulai +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Cipher server +config.ssh.server_macs=MAC server +config.ssh.server_algorithms=Algoritma server + +config.repo_config=Konfigurasi Repositori +config.repo.root_path=Path akar +config.repo.script_type=Jenis skrip +config.repo.ansi_chatset=Set karakter ANSI +config.repo.force_private=Paksa pribadi +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Pengunggahan diaktifkan +config.repo.upload.temp_path=Path unggah sementara +config.repo.upload.allowed_types=Tipe unggah yang diizinkan +config.repo.upload.file_max_size=Batas ukuran unggah berkas +config.repo.upload.max_files=Batas unggah berkas + +config.db_config=Konfigurasi Basis Data +config.db.type=Tipe +config.db.host=Host +config.db.name=Nama +config.db.schema=Skema +config.db.schema_helper=(hanya untuk "postgres") +config.db.user=Pengguna +config.db.ssl_mode=Modus SSL +config.db.ssl_mode_helper=(hanya untuk "postgres") +config.db.path=Path +config.db.path_helper=(hanya untuk "sqlite3") +config.db.max_open_conns=Maksimum koneksi yang terbuka +config.db.max_idle_conns=Maksimum koneksi menganggur + +config.security_config=Konfigurasi keamanan +config.security.login_remember_days=Berapa hari mengingat log masuk +config.security.cookie_remember_name=Ingat cookie +config.security.cookie_username=Cookie pengguna +config.security.cookie_secure=Aktifkan cookie aman +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Konfigurasi surel +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=Dari +config.email.user=Pengguna +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Lewati verifikasi sertifikat +config.email.use_certificate=Pakai sertifikat ubahan +config.email.cert_file=Berkas sertifikat +config.email.key_file=Berkas kunci +config.email.use_plain_text=Gunakan teks polos +config.email.add_plain_text_alt=Tambahkan alternatif teks polos +config.email.send_test_mail=Kirim surel uji +config.email.test_mail_failed=Gagal mengirim surel uji ke '%s': %v +config.email.test_mail_sent=Surel uji telah dikirim ke '%s'. + +config.auth_config=Konfigurasi otentikasi +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Perlu konfirmasi surel +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Nonaktifkan pendaftaran +config.auth.enable_registration_captcha=Aktifkan captcha pendaftaran +config.auth.enable_reverse_proxy_authentication=Aktifkan otentikasi proksi balik +config.auth.enable_reverse_proxy_auto_registration=Aktifkan pendaftaran otomatis proksi balik +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=Konfigurasi pengguna +config.user.enable_email_notify=Aktifkan notifikasi surel + +config.session_config=Konfigurasi Sesi +config.session.provider=Penyedia +config.session.provider_config=Konfigurasi penyedia +config.session.cookie_name=Cookie +config.session.https_only=Hanya HTTPS +config.session.gc_interval=Interval GC +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie + +config.cache_config=Konfigurasi Cache +config.cache.adapter=Adaptor +config.cache.interval=Interval GC +config.cache.host=Host + +config.http_config=Konfigurasi HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Batas ukuran +config.attachment.max_files=Batas berkas + +config.release_config=Release configuration +config.release.attachment.enabled=Lampiran diaktifkan +config.release.attachment.allowed_types=Jens lampiran yang diizinkan +config.release.attachment.max_size=Batas ukuran lampiran +config.release.attachment.max_files=Batas berkas lampiran + +config.picture_config=Konfigurasi Gambar +config.picture.avatar_upload_path=Path unggah avatar pengguna +config.picture.repo_avatar_upload_path=Path unggah avatar repositori +config.picture.gravatar_source=Sumber gravatar +config.picture.disable_gravatar=Nonaktifkan Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Konfigurasi cermin +config.mirror.default_interval=Interval baku + +config.webhook_config=Webhook Konfigurasi +config.webhook.types=Tipe +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Konfigurasi Git +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Tenggat waktu klon +config.git.pull_timeout=Tenggat waktu pull +config.git.gc_timeout=Tenggat waktu GC + +config.lfs_config=Konfigurasi LFS +config.lfs.storage=Penyimpanan +config.lfs.objects_path=Path obyek + +config.log_config=Konfigurasi log +config.log_file_root_path=Path akar berkas log +config.log_mode=Mode +config.log_options=Pilihan + +monitor.cron=Tugas Cron +monitor.name=Nama +monitor.schedule=Jadwal +monitor.next=Waktu Berikutnya +monitor.previous=Waktu Sebelumnya +monitor.execute_times=Jalankan Waktu +monitor.process=Menjalankan proses +monitor.desc=Deskripsi +monitor.start=Waktu Mulai +monitor.execute_time=Waktu Pelaksanaan + +notices.system_notice_list=Sistem pemberitahuan +notices.view_detail_header=Lihat Pemberitahuan Detail +notices.actions=Tindakan +notices.select_all=Pilih Semua +notices.deselect_all=Batalkan semua pilihan +notices.inverse_selection=Pilih Terbalaik +notices.delete_selected=Hapus yang dipilih +notices.delete_all=Menghapus semua pemberitahuan +notices.type=Jenis +notices.type_1=Repositori +notices.desc=Deskripsi +notices.op=Op. +notices.delete_success=Sistem pemberitahuan telah berhasil dihapus. + +[action] +create_repo=repositori dibuat %s +rename_repo=repositori berganti nama dari %[1]s ke %[3]s +commit_repo=didorong ke %[3]s di %[4]s +compare_commits=Lihat perbandingan dari komit ini %d +transfer_repo=repositori %s ditransfer ke %s +create_issue=`masalah yang dibuka %s#%[2]s` +close_issue=`masalah yang ditutup %s#%[2]s` +reopen_issue=`masalah yang dibuka kembali %s#%[2]s` +comment_issue=`mengomentari masalah %s#%[2]s` +create_pull_request=`membuat permintaan tarik %s#%[2]s` +close_pull_request=`permintaan tarik yang ditutup %s#%[2]s` +reopen_pull_request=`permintaan tarik dibuka kembali %s#%[2]s` +merge_pull_request=`menggabungkan permintaan tarik %s#%[2]s` +create_branch=created new branch %[3]s at %[4]s +delete_branch=deleted branch %[2]s at %[3]s +push_tag=pushed tag %[2]s to %[3]s +delete_tag=deleted tag %[2]s at %[3]s +fork_repo=cabangkan repositori ke %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror + +[tool] +ago=lalu +from_now=dari sekarang +now=sekarang +1s=1 detik %s +1m=1 menit %s +1h=1 jam %s +1d=1 hari %s +1w=1 Minggu %s +1mon=1 bulan %s +1y=1 tahun %s +seconds=%d detik %s +minutes=%d menit %s +hours=%d jam %s +days=%d hari %s +weeks=%d minggu %s +months=%d bulan %s +years=%d tahun %s +raw_seconds=detik +raw_minutes=menit +raw_hours=jam + +[dropzone] +default_message=Jatuhkan berkas disini atau klik untuk mengunggah. +invalid_input_type=Anda tidak bisa mengunggah berkas jenis ini. +file_too_big=Ukuran berkas ({{filesize}} MB) melebihi ukuran maksimum ({{maxFilesize}} MB). +remove_file=Hapus berkas + diff --git a/conf/locale/locale_it-IT.ini b/conf/locale/locale_it-IT.ini index e0636ac67c7..e93418ec058 100644 --- a/conf/locale/locale_it-IT.ini +++ b/conf/locale/locale_it-IT.ini @@ -9,7 +9,6 @@ sign_out=Esci sign_up=Registrati register=Registrati website=Sito Web -version=Versione page=Pagina template=Template language=Lingua @@ -44,23 +43,27 @@ issues=Problemi cancel=Annulla +[status] +page_not_found=Pagina Non Trovata +internal_server_error=Errore Interno del Server + [install] install=Installazione title=Passi d'installazione per il primo avvio docker_helper=Se stai utilizzando Gogs su Docker, per favore leggi le Linee guida con attenzione prima di cambiare qualcosa su questa pagina! -requite_db_desc=Gogs necessita MySQL, PostgreSQL, SQLite3 o TiDB. +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title=Impostazioni Database db_type=Tipo di database host=Host user=Utente password=Password db_name=Nome del database +db_schema=Schema 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 "-". +sqlite_helper=Il percorso del file di database di SQLite3.
Si prega di utilizzare il percorso assoluto quando si avvia come servizio. +err_empty_db_path=Il percorso del database SQLite3 non può essere vuoto. 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. @@ -75,12 +78,17 @@ 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. +use_builtin_ssh_server=Usa il server SSH integrato +use_builtin_ssh_server_popup=Avvia il server SSH integrato per le operazioni Git per distinguerle dal demone SSH di sistema. 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. +enable_console_mode=Abilita modalità Terminale +enable_console_mode_popup=In aggiunta alla modalità file, invia i log anche al terminale. +default_branch=Default Branch optional_title=Impostazioni Facoltative email_title=Impostazioni E-mail @@ -96,8 +104,8 @@ 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=Enable Federated Avatars Lookup -federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +federated_avatar_lookup=Abilita Federated Avatars +federated_avatar_lookup_popup=Abilita ricerca dell'avatar nel servizio libravatar Federated Avatars. disable_registration=Disabilita Registrazione Manuale disable_registration_popup=Disabilita la registrazione manuale degli utenti, solo gli amministratori possono creare account. enable_captcha=Abilita Captcha @@ -116,10 +124,13 @@ sqlite3_not_available=Questa versione non supporta SQLite3, si prega di scaricar 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 +smtp_host_missing_port=All'Host SMTP manca la porta nell'indirizzo. +invalid_smtp_from=Campo SMTP From non valido: %v save_config_failed=Fallito il salvataggio della configurazione: %v +init_failed=Impossibile inizializzare l'applicazione: %v invalid_admin_setting=Impostazioni account Admin non valide: %v install_success=Benvenuto! Siamo felici che tu abbia scelto Gogs, buon divertimento. -invalid_log_root_path=Log root path is invalid: %v +invalid_log_root_path=Percorso deilog non valido: %v [home] uname_holder=Nome Utente o E-mail @@ -137,6 +148,7 @@ issues.in_your_repos=Nei tuoi repository [explore] repos=Repository users=Utenti +organizations=Organizzazioni search=Cerca [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Hai già un account? Accedi ora! social_register_hepler_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. +auth_source=Fonte di autenticazione +local=Locale remember_me=Ricordami forgot_password=Password dimenticata forget_password=Password dimenticata? @@ -156,7 +170,6 @@ prohibit_login_desc=Il tuo account è impossibilitato al login, contatta l'ammin 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. @@ -164,6 +177,14 @@ reset_password_helper=Clicca qui per reimpostare la password password_too_short=La lunghezza della password non può essere meno 6 caratteri. non_local_account=Gli account non locali non possono modificare le password tramite Gogs. +login_two_factor=Autenticazione in Due Passaggi +login_two_factor_passcode=Codice di autenticazione +login_two_factor_enter_recovery_code=Inserisci il codice di recupero dell'Autenticazione a due Fattori +login_two_factor_recovery=Recupero a due fattori +login_two_factor_recovery_code=Recupera il codice +login_two_factor_enter_passcode=Inserisci un codice di accesso a due fattori +login_two_factor_invalid_recovery_code=Il codice di recupero è stato utilizzato o non è valido. + [mail] activate_account=Per favore attiva il tuo account activate_email=Verifica il tuo indirizzo e-mail @@ -199,6 +220,7 @@ 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.` +alpha_dash_dot_slash_error=` ammessi solo caratteri alfanumerici o trattini(-_) o punti o slash.` size_error='deve essere %s.' min_size_error=` deve contenere almeno %s caratteri.` max_size_error=` deve contenere massimo %s caratteri.` @@ -215,6 +237,7 @@ 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. +auth_source_mismatch=La sorgente di autenticazione selezionata non è associata all'utente. 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. @@ -242,19 +265,18 @@ 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. +form.name_not_allowed=Nome utente o schema %q non consentito. [settings] profile=Profilo password=Password avatar=Avatar ssh_keys=Chiavi SSH -social=Account Sociali -applications=Applicazioni +security=Sicurezza +repos=Repository orgs=Organizzazioni +applications=Applicazioni delete=Elimina account -uid=Uid 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. @@ -270,7 +292,7 @@ continue=Continua cancel=Annulla lookup_avatar_by_mail=Ricerca Avatar per mail -federated_avatar_lookup=Federated Avatar Lookup +federated_avatar_lookup=Ricerca Federated Avatars enable_custom_avatar=Abilita avatar personalizzato choose_new_avatar=Scegli un nuovo avatar update_avatar=Aggiorna le impostazioni avatar @@ -295,6 +317,7 @@ 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! +email_deletion_primary=Cannot delete primary email address. 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. @@ -320,14 +343,36 @@ 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. +two_factor=Autenticazione in Due Passaggi +two_factor_status=Stato: +two_factor_on=Attiva +two_factor_off=Non attivo +two_factor_enable=Abilita +two_factor_disable=Disattivata +two_factor_view_recovery_codes=Visualizza e memorizza i tuoi codici di recupero in un posto sicuro. Puoi utilizzarli come codice di sicurezza se perdi gli accessi all'applicazione di autenticazione. +two_factor_http=Per le operazioni HTTP/HTTPS, non sei più in grado di utilizzare nome utente e password. Si prega di creare e utilizzare Token di accesso personale come credenziali, ad esempio. %[3]s. +two_factor_enable_title=Abilita l'autenticazione in due passaggi +two_factor_scan_qr=Per favore, utilizza la tua applicazione di autenticazione per scansionare l'immagine: +two_factor_or_enter_secret=O inserisci la chiave segreta: +two_factor_then_enter_passcode=Poi inserisci la chiave di sicurezza: +two_factor_verify=Verifica +two_factor_invalid_passcode=La chiave di sicurezza che hai inserito non è valida, riprova! +two_factor_reused_passcode=La chiave di sicurezza che hai inserito è già stata utilizzata, provane un'altra! +two_factor_enable_error=Impossibile abilitare l'autenticazione a due fattori: %v +two_factor_enable_success=Autenticazione a due fattori abilitata per il tuo account con successo! +two_factor_recovery_codes_title=Codici di recupero autenticazione a due fattori +two_factor_recovery_codes_desc=I codici di recupero vengono utilizzati quando si perde temporaneamente l'accesso all'applicazione di autenticazione. Ogni codice di recupero può essere utilizzato solo una volta, si prega di mantenere questi codici in un posto sicuro. +two_factor_regenerate_recovery_codes=Rigenera codici di recupero +two_factor_regenerate_recovery_codes_error=Impossibile rigenerare codici di recupero: %v +two_factor_regenerate_recovery_codes_success=I nuovi codici di recupero sono stati generati correttamente! +two_factor_disable_title=Disabilita autenticazione a due fattori +two_factor_disable_desc=Il livello di sicurezza del tuo account diminuirà disabilitando l'autenticazione a due fattori. Vuoi continuare? +two_factor_disable_success=L'autenticazione a due fattori è stata disabilitata! 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 Gogs. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=Da questo momento, ogni token avrà pieno accesso al tuo account. token_name=Nome Token generate_token=Genera Token @@ -336,6 +381,16 @@ 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. +token_name_exists=Un token con lo stesso nome esiste già. + +orgs.none=Non sei membro di alcuna organizzazione. +orgs.leave_title=Abbandona una organizzazione +orgs.leave_desc=Abbandonando l'organizzazione perderai l'accesso a tutti i repository e i gruppi. Confermi? + +repos.leave=Abbandona +repos.leave_title=Lascia il repository +repos.leave_desc=Perderai l'accesso al repository dopo che hai lasciato. Vuoi continuare? +repos.leave_success=Hai lasciato il repository '%s' con successo! delete_account=Elimina Account delete_prompt=L'operazione eliminerà permanentemente l'account e NON POTRÀ essere annullata! @@ -348,7 +403,9 @@ owner=Proprietario repo_name=Nome Repository repo_name_helper=I migliori nomi dei repository sono brevi, facili da memorizzare e univoci. visibility=Visibilità +unlisted=Unlisted visiblity_helper=Questo repository è privato +unlisted_helper=This repository is Unlisted 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! @@ -366,32 +423,34 @@ 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_prune_desc=Remove any remote-tracking references that no longer exist on the remote +mirror_prune_desc=Rimuovi ogni riferimento di monitoraggio remoto che non esiste più sul telecomando mirror_interval=Intervallo Mirror (in ore) mirror_address=Indirizzo del mirror mirror_address_desc=Si prega di includere nell'indirizzo le credenziali utente necessarie. -mirror_last_synced=Last Synced +mirror_last_synced=Ultimo aggiornamento watchers=Osservatori stargazers=Fan forks=Fork +repo_description_helper=Descrizione della repository. Lunghezza massima di 512 caratteri. +repo_description_length=Caratteri disponibili 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. +form.name_not_allowed=Nome della repository o schema %q non consentiti. need_auth=Richiesta di autorizzazione migrate_type=Tipo di migrazione migrate_type_helper=Questo repository sarà un mirror migrate_repo=Migra Repository migrate.clone_address=Duplica Indirizzo -migrate.clone_address_desc=Può essere un URL HTTP/HTTPS/GIT o il percorso del server locale. +migrate.clone_address_desc=Può essere un url HTTP/HTTPS/GIT. +migrate.clone_address_desc_import_local=Puoi anche migrare un repository usando un path locale sul server. migrate.permission_denied=Non è consentito importare repository locali. migrate.invalid_local_path=Percorso locale non valido, non esiste o non è una cartella. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Migrazione non riuscita: %v mirror_from=mirror da forked_from=forkato da -fork_from_self=Non puoi forkare il tuo stesso repository! copy_link=Copia copy_link_success=Copiato! copy_link_error=Premere ⌘-C o Ctrl-C per copiare @@ -407,9 +466,9 @@ 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! +bare_message=This repository does not have any content yet. -code=Codice +files=File branch=Ramo (Branch) tree=Albero (Tree) filter_branch_and_tag=Filtra per branch o tag @@ -420,12 +479,23 @@ pulls=Pull Requests labels=Etichette milestones=Traguardi commits=Commit +git_branches=Rami (Branch) releases=Rilasci file_raw=Originale file_history=Cronologia file_view_raw=Vedi originale file_permalink=Permalink file_too_large=Questo file è troppo grande per essere mostrato +video_not_supported_in_browser=Il tuo browser non supporta i tag "video" di HTML5. + +branches.overview=Panoramica +branches.active_branches=Rami (Branch) attivi +branches.stale_branches=Stale Branches +branches.all=Tutti i rami (branch) +branches.updated_by=Updated %[1]s by %[2]s +branches.change_default_branch=Cambia branch di default +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Nuovo file editor.upload_file=Carica File @@ -433,38 +503,41 @@ 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 -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 -editor.delete_this_file=Delete this file -editor.must_have_write_access=You must have write access to make or propose changes to this file -editor.file_delete_success=File '%s' has been deleted successfully! -editor.name_your_file=Name your file... -editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. -editor.or=or -editor.cancel_lower=cancel -editor.commit_changes=Commit Changes -editor.add_tmpl=Add '%s/' -editor.add=Add '%s' -editor.update=Update '%s' -editor.delete=Delete '%s' -editor.commit_message_desc=Add an optional extended description... -editor.commit_directly_to_this_branch=Commit directly to the %s branch. -editor.create_new_branch=Create a new branch for this commit and start a pull request. -editor.new_branch_name_desc=New branch name... -editor.cancel=Cancel -editor.filename_cannot_be_empty=Filename cannot be empty. -editor.branch_already_exists=Branch '%s' already exists in this repository. -editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. -editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. -editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. -editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. -editor.file_already_exists=A file with name '%s' already exists in this repository. -editor.no_changes_to_show=There are no changes to show. -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.must_be_on_a_branch=Devi essere su quel branch per eseguire o proporre modifiche su quel determinato branch +editor.fork_before_edit=Forka il repository per modificare il file +editor.delete_this_file=Elimina questo file +editor.must_have_write_access=È necessario un accesso in scrittura per eseguire o proporre modifiche a questo file +editor.file_delete_success=Il file '%s' è stato eliminato! +editor.name_your_file=Dai un nome al file... +editor.filename_help=Per aggiungere una cartella, scrivine il nome seguito da /. Per eliminare una cartella, spostati all'inizio del campo di testo e premi "backspace". +editor.or=oppure +editor.cancel_lower=annulla +editor.commit_changes=Commit +editor.add_tmpl=Aggiungi '%s/' +editor.add=Aggiungi '%s' +editor.update=Aggiorna '%s' +editor.delete=Elimina '%s' +editor.commit_message_desc=Aggiungi una descrizione (opzionale)... +editor.commit_directly_to_this_branch=Commit direttamente nel branch %s. +editor.create_new_branch=Crea un nuovo branch per questo commit e inizia una pull request. +editor.new_branch_name_desc=Nome del nuovo branch... +editor.cancel=Annulla +editor.filename_cannot_be_empty=Il nome del file non può essere vuoto. +editor.branch_already_exists=Il branch '%s' esiste già in questo repository. +editor.directory_is_a_file='%s' nel percorso corrente è un file e non una cartella. +editor.file_is_a_symlink=Il file '%s' è un link simbolico che non può essere modificato con l'editor web. +editor.filename_is_a_directory=Il nome '%s' corrisponde a una cartella già presente in questo repository. +editor.file_editing_no_longer_exists=Il file '%s' non esiste più nel repository. +editor.file_changed_while_editing=Il file è stato cambiato in un'altra posizione. Clicca qui per vedere le modifiche o committa per sovrascrivere con la versione corrente. +editor.file_already_exists=Un file di nome '%s' esiste già in questo repository. +editor.no_changes_to_show=Nessuna modifica da mostrare. +editor.fail_to_update_file=La creazione o la modifica del file '%s' è fallita: %v +editor.fail_to_delete_file=Failed to delete file '%s' with error: %v +editor.add_subdir=Aggiungi sottocartella... +editor.unable_to_upload_files=È fallito il caricamento dei file su '%s': %v +editor.upload_files_to_dir=Carica file su '%s' + +commits.commit_history=Cronologia Commit commits.commits=Commits commits.search=Ricerca una versione commits.find=Cerca @@ -490,10 +563,10 @@ issues.create=Crea Problema issues.new_label=Nuova etichetta issues.new_label_placeholder=Nome dell'etichetta... issues.create_label=Crea Etichetta -issues.label_templates.title=Load a predefined set of labels -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.helper=Select a label set -issues.label_templates.use=Use this label set +issues.label_templates.title=Carica un set predefinito di etichette +issues.label_templates.info=Non sono presenti etichette. Puoi cliccare sul pulsante "Nuova etichetta" per crearne una, oppure usare un set predefinito mostrato qui sotto. +issues.label_templates.helper=Scegli un set di etichette +issues.label_templates.use=Usa questo set di etichette issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v issues.open_tab=%d Aperti issues.close_tab=%d Chiusi @@ -522,8 +595,8 @@ issues.next=Pagina successiva issues.open_title=Aperto issues.closed_title=Chiuso issues.num_comments=%d commenti -issues.commented_at=`commented %s` -issues.delete_comment_confirm=Are you sure you want to delete this comment? +issues.commented_at=`ha commentato %s` +issues.delete_comment_confirm=Sei sicuro/a di voler eliminare questo commento? issues.no_content=Non ci sono ancora contenuti. issues.close_issue=Chiudi issues.close_comment_issue=Commenta e chiudi @@ -551,8 +624,8 @@ 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 -issues.attachment.open_tab=`Click to see "%s" in a new tab` -issues.attachment.download=`Click to download "%s"` +issues.attachment.open_tab='Clicca per vedere "%s" in una nuova scheda' +issues.attachment.download=«Clicca qui per scaricare "%s"» pulls.new=Nuova Pull Request pulls.compare_changes=Confronta le modifiche @@ -562,6 +635,7 @@ pulls.compare_compare=confronta pulls.filter_branch=Filtra branch pulls.no_results=Nessun risultato trovato. pulls.nothing_to_compare=Non c'è niente da confrontare perchè i branch base e head uguali. +pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history. pulls.has_pull_request=`E' già presente una pull request tra questi due trargets: %[2]s#%[3]d` pulls.create=Crea Pull Request pulls.title_desc=vorrebbe unire %[1]d commit da %[2]s a %[3]s @@ -574,11 +648,16 @@ 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.can_auto_merge_desc=La pull request 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.create_merge_commit=Create a merge commit +pulls.rebase_before_merging=Effettua un Rebase prima del Merge +pulls.commit_description=Descrizione del Commit pulls.merge_pull_request=Unisci 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.delete_branch=Elimina Ramo +pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence. milestones.new=Nuova Milestone milestones.open_tab=%d Aperti @@ -625,35 +704,65 @@ wiki.last_updated=Ultimo aggiornamento: %s settings=Impostazioni settings.options=Opzioni settings.collaboration=Collaborazione -settings.collaboration.admin=Admin -settings.collaboration.write=Write -settings.collaboration.read=Read -settings.collaboration.undefined=Undefined +settings.collaboration.admin=Amministratore +settings.collaboration.write=Scrivi +settings.collaboration.read=Leggi +settings.collaboration.undefined=Indefinito +settings.branches=Divisioni +settings.branches_bare=You cannot manage branches for bare repository. Please push some content first. +settings.default_branch=Ramo di default +settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing. +settings.update=Aggiorna +settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server. +settings.update_default_branch_success=Default branch of this repository has been updated successfully! +settings.protected_branches=Branch protetti +settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers. +settings.choose_a_branch=Scegli un ramo... +settings.branch_protection=Protezione Ramo +settings.branch_protection_desc=Please choose protect options for branch %s. +settings.protect_this_branch=Proteggere questo ramo +settings.protect_this_branch_desc=Disable force pushes and prevent from deletion. +settings.protect_require_pull_request=Require pull request instead direct pushing +settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request. +settings.protect_whitelist_committers=Whitelist who can push to this branch +settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check. +settings.protect_whitelist_users=Users who can push to this branch +settings.protect_whitelist_search_users=Cerca utenti +settings.protect_whitelist_teams=Teams for which members of them can push to this branch +settings.protect_whitelist_search_teams=Cerca Teams +settings.update_protect_branch_success=Protect options for this branch has been updated successfully! settings.hooks=Webhooks settings.githooks=Git Hooks settings.basic_settings=Impostazioni di Base -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_settings=Impostazioni mirror +settings.sync_mirror=Sincronizza ora +settings.mirror_sync_in_progress=Sincronizzazione del mirror in corso, aggiorna la pagina tra un minuto. settings.site=Sito Ufficiale settings.update_settings=Aggiorna Impostazioni settings.change_reponame_prompt=Questa modifica influirà i link al repository. settings.advanced_settings=Opzioni avanzate -settings.wiki_desc=Enable wiki system -settings.use_internal_wiki=Use builtin wiki +settings.wiki_desc=Abilita wiki +settings.use_internal_wiki=Usa wiki incorporato +settings.allow_public_wiki_desc=Allow public access to wiki when repository is private settings.use_external_wiki=Usa Wiki esterno settings.external_wiki_url=URL Wiki esterno settings.external_wiki_url_desc=I visitatori verranno reindirizzati all'URL quando cliccano sulla scheda. -settings.issues_desc=Enable issue tracker -settings.use_internal_issue_tracker=Use builtin lightweight issue tracker +settings.issues_desc=Abilita tracking problemi +settings.use_internal_issue_tracker=Utilizza il segnalatore di problemi integrato (molto leggero) +settings.allow_public_issues_desc=Allow public access to issues when repository is private settings.use_external_issue_tracker=Utilizza gestore di problemi esterno +settings.external_tracker_url=URL di un segnalatore di problemi esterno +settings.external_tracker_url_desc=I visitatori verranno reindirizzati all'URL quando faranno click sulla scheda. settings.tracker_url_format=Formato URL Gestore Problemi Esterno settings.tracker_issue_style=External Issue Tracker Naming Style: -settings.tracker_issue_style.numeric=Numeric -settings.tracker_issue_style.alphanumeric=Alphanumeric +settings.tracker_issue_style.numeric=Numerico +settings.tracker_issue_style.alphanumeric=Alfanumerico settings.tracker_url_format_desc=You can use placeholder {user} {repo} {index} for user name, repository name and issue index. -settings.pulls_desc=Abilita le pull requests per accettare contributi pubblici +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Ignora cambiamenti di spazi bianchi +settings.pulls.allow_rebase_merge=Allow use rebase to merge commits settings.danger_zone=Zona Pericolosa +settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner. 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. @@ -672,7 +781,7 @@ settings.wiki_deletion_success=I dati della wiki del repository sono stati elimi 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.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access. settings.delete_notices_fork_1=- All forks will become independent after deletion. settings.deletion_success=Il repository è stato eliminato con successo! settings.update_settings_success=Le opzioni repository sono state aggiornate con successo. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Questo utente non potrà più collaborare a settings.remove_collaborator_success=Il collaboratore è stato rimosso. 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 Gogs, tratteremo la notifica all'host di destinazione specificato. Ulteriori informazioni in questa Guida ai Webhooks. +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=Aggiungi Webhook settings.webhook_deletion=Elimina Webhook settings.webhook_deletion_desc=Delete this webhook will remove its information and all delivery history. Do you want to continue? settings.webhook_deletion_success=Il Webhook è stato eliminato con successo! settings.webhook.test_delivery=Test di consegna settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history. +settings.webhook.redelivery=Redelivery +settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. settings.webhook.request=Richiesta settings.webhook.response=Risposta settings.webhook.headers=Headers settings.webhook.payload=Payload settings.webhook.body=Body +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Gli Hooks di Git sono una funzionalità di Git stesso, puoi modificare i file degli hooks supportati nell'elenco qui sotto per compiere azioni personalizzate. settings.githook_edit_desc=Se l'hook è inattivo, sarà presentato un contenuto esempio. Lasciando il contenuto vuoto disattiverai questo hook. settings.githook_name=Nome hook @@ -711,6 +825,7 @@ settings.add_webhook_desc=Gogs manderà una richiesta POST all'URL settings.payload_url=Payload URL settings.content_type=Content Type settings.secret=Secret +settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. settings.slack_username=Nome utente settings.slack_icon_url=URL icona settings.slack_color=Colore @@ -720,10 +835,20 @@ settings.event_send_everything=Ho bisogno di tutto. settings.event_choose=Lasciami scegliere ciò di cui ho bisogno. settings.event_create=Crea settings.event_create_desc=Branch, o tag creato -settings.event_pull_request=Pull Request -settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. +settings.event_delete=Elimina +settings.event_delete_desc=Branch o tag eliminato +settings.event_fork=Forka +settings.event_fork_desc=Repository Forkata settings.event_push=Push settings.event_push_desc=Git push in un repository +settings.event_issues=Problemi +settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned. +settings.event_pull_request=Pull request +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=Issue Comment +settings.event_issue_comment_desc=Issue comment created, edited, or deleted. +settings.event_release=Versione +settings.event_release_desc=Release published in a 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. @@ -733,10 +858,13 @@ settings.delete_webhook=Eliminare Webhook settings.recent_deliveries=Recenti Deliveries settings.hook_type=Tipo di Hook settings.add_slack_hook_desc=Aggiungi Slack integrazione al tuo repository. +settings.add_discord_hook_desc=Add Discord integration to your repository. +settings.add_dingtalk_hook_desc=Add Dingtalk integration to your repository. settings.slack_token=Token settings.slack_domain=Dominio settings.slack_channel=Canale settings.deploy_keys=Dispiega Chiavi +settings.deploy_keys_helper=Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. settings.add_deploy_key=Aggiungi Deploy Key settings.deploy_key_desc=Le deploy keys hanno accesso in sola lettura. Non equivalgono alle chiavi SSH personali. settings.no_deploy_keys=Non hai aggiunto alcuna deploy key. @@ -748,6 +876,8 @@ 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! +settings.description_desc=Description of repository. Maximum 512 characters length. +settings.description_length=Available characters diff.browse_source=Sfoglia il codice sorgente diff.parent=parent @@ -766,7 +896,6 @@ release.releases=Rilasci release.new_release=Nuovo Rilascio release.draft=Bozza release.prerelease=Pre-Rilascio -release.stable=Stabile release.edit=modifica release.ahead=%d commits da %s da questo rilascio release.source_code=Codice Sorgente @@ -786,12 +915,12 @@ release.cancel=Annulla release.publish=Pubblica Rilascio release.save_draft=Salva Bozza release.edit_release=Modifica Rilascio -release.delete_release=Cancela questa Release +release.delete_release=Cancella 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.tag_name_invalid=Tag name is not valid. +release.tag_name_invalid=Il nome del Tag non è valido. release.downloads=Download [org] @@ -813,8 +942,8 @@ team_name_helper=Verrà usato questo nome per riferirsi a questo team nella conv 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. +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=Impostazioni settings.options=Opzioni @@ -886,12 +1015,19 @@ first_page=Prima last_page=Ultima total=Totale: %d +dashboard.build_info=Build Information +dashboard.app_ver=Application version +dashboard.git_version=Git version +dashboard.go_version=Go version +dashboard.build_time=Build time +dashboard.build_commit=Build commit dashboard.statistic=Statistiche dashboard.operations=Operazioni dashboard.system_status=Stato del Monitor di Sistema dashboard.statistic_info=Il database di Gogs ha %d utenti, %d organizzazioni, %d chiavi pubbliche, %d repository, %d utenti che seguono, %d voti, %d azioni, %d accessi, %d problemi, %d commenti, %d account sociali, %d utenti seguiti, %d mirror, %d rilasci, %d fonti di accesso, %d webhook, %d traguardi, %d etichette, %d incarichi hook, %d team, %d attività di aggiornamento, %d allegati. dashboard.operation_name=Nome Operazione dashboard.operation_switch=Cambia +dashboard.select_operation_to_run=Please select operation to run 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. @@ -905,8 +1041,8 @@ 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 Gogs 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.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 repository records that lost Git files dashboard.reinit_missing_repos_success=All repository records that lost Git files have been reinitialized successfully. @@ -950,16 +1086,16 @@ users.created=Creato users.send_register_notify=Send Registration Notification To User users.new_success=Il nuovo account '%s' è stato creato correttamente. users.edit=Modifica -users.auth_source=Authentication Source +users.auth_source=Fonte di autenticazione users.local=Locale -users.auth_login_name=Authentication Login Name -users.password_helper=Leave it empty to remain unchanged. +users.auth_login_name=Nome utente per l'autenticazione +users.password_helper=Lascia vuoto per non modificare. 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.prohibit_login=This account is prohibited to login +users.prohibit_login=Questo account non è abilitato al login 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 @@ -981,29 +1117,37 @@ repos.private=Privati repos.watches=Segue repos.stars=Voti repos.issues=Problemi +repos.size=Dimensione -auths.auth_manage_panel=Authentication Manage Panel +auths.auth_sources=Authentication Sources auths.new=Aggiungi Nuova Origine auths.name=Nome auths.type=Tipo auths.enabled=Attivo +auths.default=Default auths.updated=Aggiornato auths.auth_type=Tipo di autenticazione auths.auth_name=Nome di autenticazione -auths.security_protocol=Security Protocol +auths.security_protocol=Protocollo di sicurezza auths.domain=Dominio auths.host=Host auths.port=Porta auths.bind_dn=Binda DN +auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s 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_base=User Search Base auths.user_dn=DN dell'utente auths.attribute_username=Attributo username -auths.attribute_username_placeholder=Leave empty to use sign-in form field value for user name. -auths.attribute_name=Attributo Nome +auths.attribute_username_placeholder=Se vuoto, verrà usato il nome di login dell'accesso. +auths.attribute_name=First Name Attribute auths.attribute_surname=Attributo Cognome auths.attribute_mail=Attributo Email +auths.verify_group_membership=Verifica gruppo di appartenenza +auths.group_search_base_dn=Group Search Base DN +auths.group_filter=Group Filter +auths.group_attribute_contain_user_list=Group Attribute Containing List of Users +auths.user_attribute_listed_in_group=User Attribute Listed in Group auths.attributes_in_bind=Fetch attributes in Bind DN context auths.filter=Fitro utente auths.admin_filter=Filtro Amministratore @@ -1012,123 +1156,205 @@ auths.smtp_auth=Tipo di autenticazione SMTP auths.smtphost=Host SMTP auths.smtpport=Porta SMTP auths.allowed_domains=Domini consentiti -auths.allowed_domains_helper=Leave it empty to not restrict any domains. Multiple domains should be separated by comma ','. +auths.allowed_domains_helper=Lasciare vuoto per non imporre restrizioni di dominio. Domini separati da virgole ','. auths.enable_tls=Abilitare Crittografia TLS 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.new_success=New authentication '%s' has been added successfully. -auths.update_success=Authentication setting has been updated successfully. +auths.default_auth=This authentication is default login source +auths.new_success=Nuovo meccanismo di autenticazione '%s' aggiunto. +auths.update_success=Parametro di autenticazione aggiornato. auths.update=Aggiornare le impostazioni di autenticazione auths.delete=Elimina questa autenticazione -auths.delete_auth_title=Authentication Deletion -auths.delete_auth_desc=This authentication is going to be deleted, do you want to continue? -auths.still_in_used=This authentication 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.delete_auth_title=Eliminazione del meccanismo di autenticazione +auths.delete_auth_desc=Eliminazione del meccanismo di autenticazione. Continuare? +auths.still_in_used=Questo meccanismo di autenticazione è ancora attivo per alcuni utenti. Eliminare gli utenti o cambiare il loro meccanismo di autenticazione prima di ritentare. +auths.deletion_success=Il meccanismo di autenticazione è stato eliminato! +auths.login_source_exist=La fonte di autenticazione '%s' esiste già. +auths.github_api_endpoint=API Endpoint + +config.not_set=(non impostata) config.server_config=Configurazione Server -config.app_name=Nome Applicazione -config.app_ver=Versione Applicazione -config.app_url=URL Applicazione -config.domain=Dominio -config.offline_mode=Modalità Offline -config.disable_router_log=Disattivare Log del Router +config.brand_name=Brand name config.run_user=Utente Esecutore config.run_mode=Modalità Esecuzione -config.repo_root_path=Percorso Root del Repository -config.static_file_root_path=Percorso Root del File Statico -config.log_file_root_path=Percorso Root del File di Log -config.script_type=Tipo di Script -config.reverse_auth_user=Autenticazione Utente Inversa +config.server.external_url=External URL +config.server.domain=Domain +config.server.protocol=Protocol +config.server.http_addr=HTTP address +config.server.http_port=HTTP port +config.server.cert_file=Certificate file +config.server.key_file=Key file +config.server.tls_min_version=Minimum TLS version +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Abilita Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL 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 -config.ssh_root_path=Percorso Root -config.ssh_key_test_path=Percorso chiave di test -config.ssh_keygen_path=Percorso Keygen ('ssh-keygen') -config.ssh_minimum_key_size_check=Verifica delle dimensioni minime della chiave -config.ssh_minimum_key_sizes=Dimensioni minime della chiave +config.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Configurazione Repository +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=Configurazione Database -config.db_type=Tipo -config.db_host=Host -config.db_name=Nome -config.db_user=Utente -config.db_ssl_mode=Modalità SSL -config.db_ssl_mode_helper=(solo per "postgres") -config.db_path=Percorso -config.db_path_helper=(per "sqlite3" e "tidb") - -config.service_config=Configurazione Servizio -config.register_email_confirm=Richiedono Conferma dell'Email -config.disable_register=Disabilita Registrazione -config.show_registration_button=Mostra Pulsane Registrazione -config.require_sign_in_view=Richiesto Accesso per Vedere -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.db.type=Tipo +config.db.host=Host +config.db.name=Nome +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=Utente +config.db.ssl_mode=modalità SSL +config.db.ssl_mode_helper=(solo per "postgres") +config.db.path=Percorso +config.db.path_helper=(solo per "sqlite3") +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=Da +config.email.user=Utente +config.email.disable_helo=Disattiva HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=File certificato +config.email.key_file=Key file +config.email.use_plain_text=Usa testo semplice +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Invia email di test +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -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 -config.mailer_disable_helo=Disattiva HELO -config.mailer_name=Nome -config.mailer_host=Host -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 -config.oauth_enabled=Attivo +config.session_config=Configurazione Sessione +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=Solo HTTPS +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=Cookie CSRF config.cache_config=Configurazione Cache -config.cache_adapter=Adattatore Cache -config.cache_interval=Intervallo Cache -config.cache_conn=Connessione Cache - -config.session_config=Configurazione Sessione -config.session_provider=Fornitore Sessione -config.provider_config=Impostazioni Provider -config.cookie_name=Nome del Cookie -config.enable_set_cookie=Abilita Uso dei Cookie -config.gc_interval_time=Intervallo di tempo della GC -config.session_life_time=Durata Sessione -config.https_only=Solo HTTPS -config.cookie_life_time=Durata Cookie +config.cache.adapter=Adattatore +config.cache.interval=Intervallo GC +config.cache.host=Host + +config.http_config=Configurazione HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Attivo +config.attachment.path=Percorso +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Configurazione Foto -config.picture_service=Servizio foto -config.disable_gravatar=Disabilita Gravatar -config.enable_federated_avatar=Enable Federated Avatars - -config.git_config=Git Configuration -config.git_disable_diff_highlight=Disable Diff Syntax Highlight -config.git_max_diff_lines=Max Diff Lines (for a single file) -config.git_max_diff_line_characters=Max Diff Characters (for a single line) -config.git_max_diff_files=Max Diff Files (to be shown) -config.git_gc_args=GC Arguments -config.git_migrate_timeout=Migration Timeout -config.git_mirror_timeout=Mirror Update Timeout -config.git_clone_timeout=Clone Operation Timeout -config.git_pull_timeout=Pull Operation Timeout -config.git_gc_timeout=GC Operation Timeout +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Configurazione Webhook +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Configurazione Git +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path config.log_config=Configurazione Log -config.log_mode=Modalità Log +config.log_file_root_path=Percorso Root del File di Log +config.log_mode=Modalità +config.log_options=Opzioni monitor.cron=Incarici di cron monitor.name=Nome @@ -1159,17 +1385,24 @@ notices.delete_success=Gli avvisi di sistema sono stati successivamente eliminat create_repo=ha creato il repository %s rename_repo=repository rinominato da %[1]s a [3]s commit_repo=ha pushato nel %[3]s in %[4]s +compare_commits=Visualizza comparazione tra questi %d commit +transfer_repo=ha trasferito il repository %s a %s create_issue=`ha aperto il problema %s#%[2]s` close_issue=`closed issue %s#%[2]s` reopen_issue=`reopened issue %s#%[2]s` +comment_issue=`ha commentato il problema %s#%[2]s` create_pull_request=`creata pull request %s#%[2]s` close_pull_request=`closed pull request %s#%[2]s` reopen_pull_request=`reopened pull request %s#%[2]s` -comment_issue=`ha commentato il problema %s#%[2]s` merge_pull_request=`merged pull request %s#%[2]s` -transfer_repo=ha trasferito il repository %s a %s +create_branch=created new branch %[3]s at %[4]s +delete_branch=deleted branch %[2]s at %[3]s push_tag=ha pushato il tag %[2]s a %[3]s -compare_commits=Visualizza comparazione tra questi %d commit +delete_tag=deleted tag %[2]s at %[3]s +fork_repo=forked a repository to %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror [tool] ago=fa @@ -1191,6 +1424,7 @@ months=%d mesi %s years=%d anni %s raw_seconds=secondi raw_minutes=minuti +raw_hours=ore [dropzone] default_message=Trascina i file qui o clicca per caricare. diff --git a/conf/locale/locale_ja-JP.ini b/conf/locale/locale_ja-JP.ini index d9b8f603ca8..94f388334f4 100644 --- a/conf/locale/locale_ja-JP.ini +++ b/conf/locale/locale_ja-JP.ini @@ -9,16 +9,15 @@ sign_out=サインアウト sign_up=サインアップ register=登録 website=WEBサイト -version=バージョン page=ページ template=テンプレート language=言語 create_new=作成... -user_profile_and_more=ユーザープロファイルなど +user_profile_and_more=ユーザープロフィールなど signed_in_as=サインイン済み -username=ユーザ名 -email=E-mail +username=ユーザー名 +email=メールアドレス password=パスワード re_type=再入力 captcha=CAPTCHA @@ -44,6 +43,10 @@ issues=課題 cancel=キャンセル +[status] +page_not_found=ページが見つかりません +internal_server_error=サーバ内部エラー + [install] install=インストール title=インストールをする前に必要な準備をしましょう @@ -52,15 +55,15 @@ requite_db_desc=Gogs は、MySQL、PostgreSQL、SQLite3 または TiDB が必要 db_title=データベース設定 db_type=データベースの種類 host=ホスト -user=ユーザ +user=ユーザー password=パスワード db_name=データベース名 +db_schema=Schema 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 データベース名は文字"."と"-"を許可しない。 +err_empty_db_path=SQLite3 データベースのPATHを空にすることはできません。 no_admin_and_disable_registration=管理者アカウントを作成せずに登録を無効にすることはできません。 err_empty_admin_password=管理者パスワードは空白にできません。 @@ -69,18 +72,23 @@ app_name=アプリケーション名 app_name_helper=素晴らしい組織名を入れてください! repo_path=リポジトリのルートパス repo_path_helper=すべての Git リモート リポジトリはこのディレクトリに保存されます。 -run_user=実行ユーザ -run_user_helper=ユーザーはリポジトリ ルートパスへのアクセス、及びGogs を実行する権限を所有する必要があります。 +run_user=実行ユーザー +run_user_helper=ユーザーはリポジトリのルートパスへのアクセス権限、及び Gogs の実行権限を持っている必要があります。 domain=ドメイン domain_helper=これはSSH用クローンURLに影響します。 ssh_port=SSH ポート ssh_port_helper=SSHサーバーを使用する場合はポート番号を入力してください。 空白にした場合は無効化されます。 +use_builtin_ssh_server=内蔵SSHサーバーを使用 +use_builtin_ssh_server_popup=システムのSSHデーモンとは別に、Git操作用の内蔵SSHサーバーを起動します。 http_port=HTTP ポート http_port_helper=アプリケーションが待ち受けするポート番号。 app_url=アプリケーションの URL app_url_helper=この設定は、HTTP / HTTPSのクローンURLおよび、一部のメールボックスへのリンクに影響を与えます。 log_root_path=ログのパス log_root_path_helper=ログファイルを書き込むディレクトリ。 +enable_console_mode=コンソールモードの有効化 +enable_console_mode_popup=ファイルモードに加えて、コンソールにもログを表示します。 +default_branch=Default Branch optional_title=オプション設定 email_title=メールサービス設定 @@ -96,47 +104,51 @@ offline_mode=オフラインモードを有効にする offline_mode_popup=プロダクションモードでは、CDNを使用せずにローカルからリソースファイルを使用します。 disable_gravatar=Gravatarのサービスを無効にします disable_gravatar_popup=Gravatarとカスタムソースを無効にして、全てのアバターをユーザーによってアップロードされたものかデフォルトなものにします。 -federated_avatar_lookup=Enable Federated Avatars Lookup -federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. -disable_registration=自己登録を無効にする -disable_registration_popup=自己登録を無効にし、管理者のみがアカウント作成できる -enable_captcha=Captchaを有効にする -enable_captcha_popup=ユーザによる自己登録のため、有効なcaptchaが必要です。 +federated_avatar_lookup=連合アバター検索を有効にする +federated_avatar_lookup_popup=Libavatarに基づいたオープンソースサービスを使用するには、連合アバター検索を有効にします。 +disable_registration=誰でもユーザ登録ができないようにする +disable_registration_popup=誰でもユーザ登録ができないようにすることで、管理者のみアカウントが作成できるようになります。 +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_name=ユーザー名 admin_password=パスワード confirm_password=パスワード確認 -admin_email=管理者の電子メール +admin_email=管理者のメールアドレス install_gogs=Gogs をインストール 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 +invalid_repo_path=リポジトリのルートパスが無効です: %v +run_user_not_match=実行ユーザーは現在のユーザーではありません: %s -> %s +smtp_host_missing_port=SMTPホストのポートが見つかりません。 +invalid_smtp_from=SMTP From フィールドの値が有効ではありません: %v save_config_failed=構成の保存に失敗した: %v +init_failed=アプリケーションの初期化に失敗しました: %v invalid_admin_setting=管理者アカウントの設定が無効です: %v install_success=ようこそ!我々はあなたが Gogs を選んでくれて嬉しいです!楽しみましょう! -invalid_log_root_path=ログのルートパスがむこうです: %v +invalid_log_root_path=リポジトリのルート パスが無効です: %v [home] -uname_holder=ユーザー名またはEメール +uname_holder=ユーザー名またはメールアドレス password_holder=パスワード -switch_dashboard_context=ダッシュ ボードのコンテキストを切替 +switch_dashboard_context=ダッシュボードコンテキストの切替 my_repos=自分のリポジトリ show_more_repos=リポジトリをさらに表示… collaborative_repos=共同リポジトリ my_orgs=自分の組織 my_mirrors=自分のミラー -view_home=ビュー %s +view_home=%s を見る issues.in_your_repos=あなたのリポジトリ [explore] repos=リポジトリ -users=ユーザ +users=ユーザー +organizations=組織 search=検索 [auth] @@ -145,6 +157,8 @@ register_hepler_msg=既にアカウントをお持ちですか?今すぐログ social_register_hepler_msg=既にアカウントをお持ちですか?連携しましょう! disable_register_prompt=申し訳ありませんが、現在登録は受け付けておりません。サイトの管理者にお問い合わせください。 disable_register_mail=申し訳ありませんが、登録メールの確認機能が無効になっています。 +auth_source=認証ソース +local=ローカル remember_me=ログインしたままにする forgot_password=パスワードを忘れた forget_password=パスワードを忘れましたか? @@ -156,19 +170,26 @@ 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=6文字未満のパスワードは設定できません。 -non_local_account=Non-local accounts cannot change passwords through Gogs. +non_local_account=非ローカルアカウントではGogs経由でのパスワード変更はできません。 + +login_two_factor=2段階認証 +login_two_factor_passcode=認証用パスコード +login_two_factor_enter_recovery_code=2段階認証用リカバリーコードを入力 +login_two_factor_recovery=2段階認証のリカバリー +login_two_factor_recovery_code=リカバリーコード +login_two_factor_enter_passcode=2段階認証用パスコードを入力 +login_two_factor_invalid_recovery_code=このリカバリーコードは使用済みか、正しくありません。 [mail] -activate_account=あなたのアカウントを有効にしてください。 -activate_email=電子メール アドレスを確認します。 +activate_account=アカウントを有効化してください。 +activate_email=メールアドレスを確認 reset_password=パスワードをリセットします. -register_success=ようこそ、登録成功 +register_success=登録完了です。ようこそ! register_notify=ボードへようこそ [modal] @@ -187,53 +208,55 @@ HttpsUrl=HTTPS URL PayloadUrl=ペイロードの URL TeamName=チーム名 AuthName=承認名 -AdminEmail=管理者の電子メール +AdminEmail=管理者のメールアドレス -NewBranchName=New branch name -CommitSummary=Commit summary -CommitMessage=Commit message -CommitChoice=Commit choice -TreeName=File path +NewBranchName=新しいブランチ名 +CommitSummary=コミットの概要 +CommitMessage=コミットメッセージ +CommitChoice=コミットを選択 +TreeName=ファイルのパス Content=コンテンツ require_error=空にできません alpha_dash_error=アルファベット、数字、ハイフン"-"、アンダースコア"_"のいずれかの必要があります -alpha_dash_dot_error=' アルファベット、数値、ダッシュ(-)、アンダースコア(_) 、ドット(.)のいずれかを入力する必要があります。 ' +alpha_dash_dot_error=' アルファベット、数値、ハイフン(-)、アンダースコア(_) 、ドット(.) のいずれかを入力する必要があります。 ' +alpha_dash_dot_slash_error=` アルファベット、数字、ハイフン(-)、アンダースコア(_)、ドット(.)、スラッシュ(/) のみ利用できます。` size_error=`サイズは %s である必要があります` min_size_error=' 少なくとも %s 文字の必要があります ' max_size_error=' %s 文字以下の必要があります ' -email_error=' は有効な電子メール アドレスではない ' +email_error=' は有効なメールアドレスではありません ' url_error=' は有効な URL はありません。 ' include_error=' 文字列 '%s' を含める必要があります。 ' unknown_error=不明なエラー: -captcha_incorrect=Captcha が一致しませんでした。 -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=電子メール アドレスは既に使用されています。 +email_been_used=メールアドレスは既に使用されています。 username_password_incorrect=ユーザー名またはパスワードが正しくありません。 +auth_source_mismatch=選択されている認証ソースは、ユーザーに関連付けられていません。 enterred_invalid_repo_name=入力したリポジトリの名前が正しいかどうかを確認してください。 enterred_invalid_owner_name=入力された所有者名が正しいかどうかを確認してください。 -enterred_invalid_password=入力したパスワードが正しいかを確認してください。 +enterred_invalid_password=入力したパスワードが正しいか確認してください。 user_not_exist=指定されたユーザーは存在しません。 -last_org_owner=削除するユーザーはチームの最後のメンバーです。別の所有者設定が必要です。 +last_org_owner=所有者のチームから最後のユーザーを削除することはできません。組織には常に最低でも1人の所有者が必要です。 -invalid_ssh_key=SSHを確認できません:%s +invalid_ssh_key=申し訳ございませんが、SSH キーを検証することができません: %s unable_verify_ssh_key=GogsはあなたのSSH keyを確認できません。しかし、我々は有効とみなしますので、自分自身で確認してください。 auth_failed=認証に失敗しました: %v -still_own_repo=アカウント所有のリポジトリがあり、リポジトリの削除または所有者の移譲が必要です。 -still_has_org=アカウントはまだ組織のメンバーであり、組織から退出するか削除する必要があります。 +still_own_repo=あなたのアカウントはまだ少なくとも1つのリポジトリの所有権を所持しています。まずそれらの削除または移譲を行う必要があります。 +still_has_org=あなたのアカウントは1つ以上の組織に所属しているため、先に組織を脱退するか削除する必要があります。 org_still_own_repo=この組織はまだリポジトリの所有しています、リポジトリを削除または転送する必要があります。 target_branch_not_exist=ターゲットブランチが存在しない [user] change_avatar=アバターを変更 -join_on=参加しました +join_on=登録日 repositories=リポジトリ activity=パブリック・アクティビティ followers=フォロワー @@ -242,27 +265,26 @@ following=フォロー follow=フォロー unfollow=フォロー解除 -form.name_reserved=ユーザー名 '%s' は予約されています。 -form.name_pattern_not_allowed=ユーザ名のパターン '%s' は許可されていません。 +form.name_not_allowed=User name or pattern %q is not allowed. [settings] profile=プロフィール password=パスワード avatar=アバター ssh_keys=SSH キー -social=SNSアカウント -applications=アプリケーション +security=セキュリティ +repos=リポジトリ一覧 orgs=組織 +applications=アプリケーション delete=アカウントを削除 -uid=Uid public_profile=パブリック プロフィール profile_desc=あなたのメールアドレスは公開され、任意のアカウント関連の通知に使用されます。また、Webベースの操作はサイトを介して行います。 -password_username_disabled=ローカルユーザ以外はユーザ名を変更できません。 +password_username_disabled=ローカルユーザー以外はユーザー名を変更できません。 full_name=フルネーム website=WEBサイト location=ロケーション -update_profile=プロファイル更新 +update_profile=プロフィールを更新 update_profile_success=あなたのプロフィールが更新されました。 change_username=ユーザー名が変更されました change_username_prompt=この変更はリンクをアカウントに関連付ける方法に影響します。 @@ -270,7 +292,7 @@ continue=続行 cancel=キャンセル lookup_avatar_by_mail=メールからアバターを取得 -federated_avatar_lookup=Federated Avatar Lookup +federated_avatar_lookup=連合アバター検索 enable_custom_avatar=カスタムのアバターを有効にする choose_new_avatar=新しいアバターを選択 update_avatar=アバターの設定を更新 @@ -283,27 +305,28 @@ old_password=現在のパスワード new_password=新しいパスワード retype_new_password=新しいパスワードを再入力します。 password_incorrect=現在のパスワードが正しくありません。 -change_password_success=パスワードが正常に変更されました。今すぐ新しいパスワード経由でサインインすることができます。 -password_change_disabled=ローカルユーザ以外はパスワードを変更できません。 +change_password_success=パスワードが正常に変更されました。今すぐ新しいパスワードを使用してサインインすることができます。 +password_change_disabled=ローカルユーザー以外はパスワードを変更できません。 -emails=E-mail アドレス -manage_emails=E-mail アドレスを管理 +emails=メールアドレス +manage_emails=メールアドレスを管理 email_desc=あなたのプライマリメールアドレスは、通知やその他の操作に使用されます。 primary=プライマリー primary_email=プライマリに設定 delete_email=削除 email_deletion=電子メールの削除 -email_deletion_desc=この電子メール アドレスを削除すると、あなたのアカウントの関連情報も削除されます。続行しますか。 +email_deletion_desc=このメールアドレスを削除すると、あなたのアカウントの関連情報も削除されます。続行しますか? email_deletion_success=電子メールが正常に削除されました。 -add_new_email=新しいe-mailアドレスを追加 -add_email=電子メールを追加します。 -add_email_confirmation_sent='%s' に新しい確認メールを送信しました、次の %d 時間以内に受信トレイを確認し、確認プロセスを完了してください。 -add_email_success=新しいe-mail アドレスが追加されました。 +email_deletion_primary=Cannot delete primary email address. +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 の一般的な問題 +ssh_desc=あなたのアカウントに紐付けられているSSHキーの一覧です。SSHキーがあれば誰でもリポジトリへのアクセス権を得ることが出来ますので、見覚えのないSSHキーがないかよくご確認ください。 +ssh_helper=やり方がわかりませんか? GitHubのガイドをご覧ください。 SSHキーの作成 SSH使用に際してよくある問題 add_new_key=SSH キーを追加 ssh_key_been_used=公開鍵は使用されています。 ssh_key_name_used=同じ名前の公開鍵は既に存在しています。 @@ -314,20 +337,42 @@ delete_key=削除 ssh_key_deletion=SSH キーの削除 ssh_key_deletion_desc=このSSHキーを削除すると、あなたのアカウントに関連するすべてのアクセスが削除されます。続行しますか? ssh_key_deletion_success=SSH キーは正常に削除されました! -add_on=追加された +add_on=登録日 last_used=最終使用日 no_activity=最近の活動なし key_state_desc=この鍵は7日間以内に使われています。 token_state_desc=この鍵は7日間以内に使われています。 -manage_social=関連付けられているSNSアカウントを管理 -social_desc=これは関連付けられたソーシャルアカウントのリストです。あなたが認識していない結び付けを削除します。 -unbind=バインド解除 -unbind_success=SNSアカウントがバインドされていない。 +two_factor=2段階認証 +two_factor_status=状態: +two_factor_on=ON +two_factor_off=OFF +two_factor_enable=有効化 +two_factor_disable=無効にする +two_factor_view_recovery_codes=リカバリーコードを確認し、安全な場所に保管してください。認証済みアプリケーションにアクセスできなくなったとき、パスコードとしてそれを使用できます。 +two_factor_http=HTTP/HTTPS 通信において、平文のユーザー名・パスワードは使用できなくなりました。個人証明にはパーソナル・アクセストークンを作成し利用してください。例:%[3]s +two_factor_enable_title=2段階認証を有効にする +two_factor_scan_qr=認証アプリケーションを使用して画像をスキャンしてください : +two_factor_or_enter_secret=またはシークレットを入力: +two_factor_then_enter_passcode=パスコードを入力してください: +two_factor_verify=確認 +two_factor_invalid_passcode=入力されたパスコードは使用できません。もう一度お試しください。 +two_factor_reused_passcode=入力したパスコードは既に使用されています。別のパスコードを試してください。 +two_factor_enable_error=2段階認証の有効化に失敗しました: %v +two_factor_enable_success=2段階認証があなたのアカウントで有効化されました! +two_factor_recovery_codes_title=2段階認証のリカバリーコード +two_factor_recovery_codes_desc=リカバリーコードは、認証済みアプリケーションへのアクセスを一時的に失ったときに使用します。リカバリーコードはいずれも一度だけ使用できます。必ず安全な場所に保管してください。 +two_factor_regenerate_recovery_codes=リカバリーコードの再発行 +two_factor_regenerate_recovery_codes_error=リカバリーコードの再発行に失敗しました: %v +two_factor_regenerate_recovery_codes_success=新しいリカバリーコードが正常に作成されました! +two_factor_disable_title=2段階認証を無効にする +two_factor_disable_desc=2段階認証を無効にすると、あなたのアカウントのセキュリティは低下します。よろしいですか? +two_factor_disable_success=2段階認証があなたのアカウントで無効になりました! manage_access_token=パーソナルアクセス トークンを管理 generate_new_token=新しいトークンを生成 tokens_desc=生成したトークンを利用して Gogs の API にアクセスすることができます。 +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=今のところ、全てのトークンはあなたのアカウントにフルアクセスできます。 token_name=トークン名 generate_token=トークンを生成 @@ -336,20 +381,32 @@ delete_token=削除 access_token_deletion=パーソナルアクセストークンの削除 access_token_deletion_desc=パーソナルアクセストークンを削除すると、関連するアプリケーションのすべてのアクセスが削除されます。続行しますか? delete_token_success=パーソナルアクセストークンは正常に削除されました!同時にあなたのアプリケーションを更新することを忘れないでください。 +token_name_exists=同じ名前のトークンがあります。 + +orgs.none=あなたはどの組織のメンバーでもありません。 +orgs.leave_title=組織からの脱退 +orgs.leave_desc=組織から脱退すると、全てのリポジトリとチームへのアクセスができなくなります。続行しますか? + +repos.leave=脱退 +repos.leave_title=リポジトリから脱退 +repos.leave_desc=脱退するとリポジトリへのアクセスができなくなります。よろしいですか? +repos.leave_success=リポジトリ '%s' からの脱退が完了しました! delete_account=アカウントを削除 delete_prompt=この操作をするとアカウントが完全に削除され、二度と元に戻すことができなくなります ! confirm_delete_account=削除の確認 delete_account_title=アカウントの削除 -delete_account_desc=このアカウントは永久に削除しようとしている、継続しますか? +delete_account_desc=このアカウントは完全に削除されます。 本当によろしいですか? [repo] owner=オーナー repo_name=リポジトリ名 repo_name_helper=短くて分かりやすく重複しないリポジトリ名を決めてください。 visibility=公開/非公開 -visiblity_helper=このリポジトリはプライベートです。 -visiblity_helper_forced=サイト管理者は、強制的にすべての新しいリポジトリを プライベート にしています。 +unlisted=Unlisted +visiblity_helper=このリポジトリは非公開です +unlisted_helper=This repository is Unlisted +visiblity_helper_forced=サイト管理者が、すべての新しいリポジトリを非公開にすることを強制しています visiblity_fork_helper=(この値の変更はすべてのフォークに適用されます) clone_helper=クローンに関してお困りであれば ヘルプ を参照しましょう。 fork_repo=リポジトリをフォーク @@ -357,7 +414,7 @@ fork_from=フォーク元 fork_visiblity_helper=フォークされたリポジトリの可視状態は変更できません。 repo_desc=説明 repo_lang=言語 -repo_gitignore_helper=Select .gitignore templates +repo_gitignore_helper=.gitignoreのテンプレートを選択 license=ライセンス license_helper=ライセンス ファイルを選択 readme=Readme @@ -366,50 +423,52 @@ auto_init=選択されたファイルおよびテンプレートでリポジト create_repo=リポジトリを作成 default_branch=デフォルトのブランチ mirror_prune=Prune -mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote +mirror_prune_desc=リモートに存在しないリモート追跡参照を削除する mirror_interval=ミラー 間隔(時) mirror_address=ミラー アドレス -mirror_address_desc=Please include necessary user credentials in the address. +mirror_address_desc=必要なユーザー資格情報をアドレスに含めてください。 mirror_last_synced=最終同期 watchers=ウォッチャー -stargazers=Stargazers +stargazers=スターゲイザー forks=フォーク +repo_description_helper=リポジトリの説明 (512文字以内) +repo_description_length=利用可能な文字 -form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories. -form.name_reserved=リポジトリ名 '%s' は使用されています。 -form.name_pattern_not_allowed=リポジトリ名に '%s' は使用できません。 +form.reach_limit_of_creation=リポジトリの最大作成数 %d にすでに達しています。 +form.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=認証が必要 migrate_type=マイグレーションの種類 migrate_type_helper=このリポジトリは、 ミラー になります migrate_repo=リポジトリを移行 migrate.clone_address=クローンアドレス -migrate.clone_address_desc=これは、HTTP/HTTPS/GIT URL またはローカル サーバー パスを設定できます。 +migrate.clone_address_desc=HTTP/HTTPS/GIT URLを設定できます。 +migrate.clone_address_desc_import_local=ローカルサーバーのパスでリポジトリを移行することもできます。 migrate.permission_denied=ローカル リポジトリをインポートすることはできません。 migrate.invalid_local_path=ローカルパスが無効です。存在しないかディレクトリではありません。 +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=移行に失敗しました: %v mirror_from=同期ミラー forked_from=フォーク元 -fork_from_self=すでにあなたの所有しているリポジトリはフォークできません copy_link=コピー copy_link_success=コピーされました! copy_link_error=⌘ C または Ctrl-C キーを押してコピー copied=コピー成功 -unwatch=Unwatch -watch=Watch -unstar=Unstar -star=Star -fork=Fork +unwatch=ウォッチ解除 +watch=ウォッチ +unstar=スターを外す +star=スター +fork=フォーク no_desc=説明なし quick_guide=クイック ガイド clone_this_repo=このリポジトリのクローンを作成 create_new_repo_command=コマンドラインで新しいリポジトリを作成します。 push_exist_repo=コマンド ・ ラインから既存のリポジトリをプッシュ -repo_is_empty=このリポジトリは空です、後で戻って来て下さい! +bare_message=このリポジトリにはまだコンテンツがありません。 -code=コード +files=ファイル branch=ブランチ tree=ツリー filter_branch_and_tag=ブランチまたはタグをフィルタリング @@ -420,51 +479,65 @@ pulls=プルリクエスト labels=ラベル milestones=マイルストーン commits=コミット +git_branches=ブランチ releases=リリース file_raw=Raw file_history=履歴 file_view_raw=Rawデータを見る file_permalink=パーマリンク file_too_large=このファイルは大きすぎるため、表示できません。 - -editor.new_file=New file -editor.upload_file=Upload file +video_not_supported_in_browser=お使いのブラウザーは、HTML5 の video タグをサポートしていません。 + +branches.overview=概要 +branches.active_branches=アクティブブランチ +branches.stale_branches=古いブランチ +branches.all=すべてのブランチ +branches.updated_by=%[1]s が %[2]s によって更新されました +branches.change_default_branch=デフォルトブランチの変更 +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=新規ファイル +editor.upload_file=ファイルをアップロード editor.edit_file=ファイルを編集 -editor.preview_changes=Preview Changes -editor.cannot_edit_non_text_files=Cannot edit non-text files +editor.preview_changes=変更箇所のプレビュー +editor.cannot_edit_non_text_files=テキストファイルでないため編集できません editor.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 +editor.must_be_on_a_branch=このファイルを作成または変更の提案をするには、ブランチ上である必要があります。 +editor.fork_before_edit=ファイルを編集する前にこのリポジトリをフォークする必要があります。 editor.delete_this_file=このファイルを削除 -editor.must_have_write_access=You must have write access to make or propose changes to this file -editor.file_delete_success=File '%s' has been deleted successfully! -editor.name_your_file=Name your file... -editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. -editor.or=or +editor.must_have_write_access=このファイルへの変更を作成・提案するには、書き込み権限が必要です +editor.file_delete_success=ファイル '%s' は正常に削除されました! +editor.name_your_file=ファイル名を設定... +editor.filename_help=ディレクトリを追加するには、ディレクトリ名を入力後 / を入力してください。削除するには、入力欄の先頭まで移動し backspace キーを押してください。 +editor.or=もしくは editor.cancel_lower=キャンセル editor.commit_changes=変更をコミット -editor.add_tmpl=Add '%s/' +editor.add_tmpl='%s/' を追加 editor.add='%s' を追加 editor.update='%s' を更新 editor.delete='%s' を削除 -editor.commit_message_desc=Add an optional extended description... -editor.commit_directly_to_this_branch=Commit directly to the %s branch. -editor.create_new_branch=Create a new branch for this commit and start a pull request. -editor.new_branch_name_desc=New branch name... +editor.commit_message_desc=詳細な説明を追加... +editor.commit_directly_to_this_branch=%s ブランチに直接コミットする。 +editor.create_new_branch=このコミットのために新しいブランチを作成し、プルリクエストの作成を開始する。 +editor.new_branch_name_desc=新しいブランチ名... editor.cancel=キャンセル -editor.filename_cannot_be_empty=Filename cannot be empty. -editor.branch_already_exists=Branch '%s' already exists in this repository. -editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. -editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. -editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. -editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. -editor.file_already_exists=A file with name '%s' already exists in this repository. -editor.no_changes_to_show=There are no changes to show. -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.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_already_exists=ファイル名 '%s' は、このリポジトリに既に存在します。 +editor.no_changes_to_show=表示する変更箇所はありません。 +editor.fail_to_update_file=ファイル '%s' の作成/更新に失敗しました: %v +editor.fail_to_delete_file=ファイル '%s' エラーを削除できませんでした: %v +editor.add_subdir=サブディレクトリを追加... +editor.unable_to_upload_files='%s' へのファイルアップロード中にエラーが発生し、失敗しました: %v +editor.upload_files_to_dir='%s' にファイルをアップロード + +commits.commit_history=コミット履歴 commits.commits=コミット commits.search=コミットの検索 commits.find=検索 @@ -474,7 +547,7 @@ commits.date=日付 commits.older=古い commits.newer=新しい -issues.new=新しい問題 +issues.new=新しい課題 issues.new.labels=ラベル issues.new.no_label=ラベルなし issues.new.clear_labels=ラベルをクリア @@ -486,15 +559,15 @@ issues.new.closed_milestone=クローズされたマイルストーン issues.new.assignee=担当者 issues.new.clear_assignee=担当者をクリア issues.new.no_assignee=担当者なし -issues.create=問題を作成 +issues.create=課題を作成 issues.new_label=新しいラベル issues.new_label_placeholder=ラベル名... issues.create_label=ラベルを作成 -issues.label_templates.title=Load a predefined set of labels -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.helper=Select a label set -issues.label_templates.use=Use this label set -issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v +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 issues.open_tab=%d オープン issues.close_tab=%d クローズ issues.filter_label=ラベル @@ -504,55 +577,55 @@ issues.filter_milestone_no_select=選択されたマイルストーンなし issues.filter_assignee=アサインされた人 issues.filter_assginee_no_select=選択可能な担当者がいない issues.filter_type=タイプ -issues.filter_type.all_issues=すべての問題 +issues.filter_type.all_issues=すべての課題 issues.filter_type.assigned_to_you=担当中のリポジトリ issues.filter_type.created_by_you=作成したリポジトリ issues.filter_type.mentioning_you=あなたに伝える issues.filter_sort=並べ替え -issues.filter_sort.latest=最新 -issues.filter_sort.oldest=最も古い -issues.filter_sort.recentupdate=最近更新された -issues.filter_sort.leastupdate=つい最近更新 -issues.filter_sort.mostcomment=一番多いコメント -issues.filter_sort.leastcomment=一番少ないコメント -issues.opened_by=opened %[1]s by %[3]s -issues.opened_by_fake=opened %[1]s by %[2]s +issues.filter_sort.latest=作成が新しい順 +issues.filter_sort.oldest=作成が古い順 +issues.filter_sort.recentupdate=更新が新しい順 +issues.filter_sort.leastupdate=作成が古い順 +issues.filter_sort.mostcomment=コメントが多い順 +issues.filter_sort.leastcomment=コメントが少ない順 +issues.opened_by=%[1]s に %[3]s によって開かれました +issues.opened_by_fake=%[1]s に %[2]s によって開かれました issues.previous=前ページ issues.next=次ページ issues.open_title=オープン issues.closed_title=クローズ issues.num_comments=%d コメント -issues.commented_at=`commented %s` -issues.delete_comment_confirm=Are you sure you want to delete this comment? +issues.commented_at=`が %s にコメントしました` +issues.delete_comment_confirm=このコメントを削除してよろしいですか? issues.no_content=まだコンテンツがありません issues.close_issue=閉じる issues.close_comment_issue=コメントしてクローズ issues.reopen_issue=Reopen issues.reopen_comment_issue=コメントと再開 issues.create_comment=コメント  -issues.closed_at=`closed %[2]s` -issues.reopened_at=`reopened %[2]s` -issues.commit_ref_at=`referenced this issue from a commit %[2]s` +issues.closed_at=`%[2]s に閉じられました` +issues.reopened_at=`%[2]s に再び開かれました` +issues.commit_ref_at=`この課題がコミット %[2]s から参照されました` issues.poster=ポスター -issues.collaborator=コラボレータ +issues.collaborator=共同編集者 issues.owner=オーナー -issues.sign_in_require_desc=Sign in to join this conversation. +issues.sign_in_require_desc=会話に参加するには サインイン してください。 issues.edit=編集 issues.cancel=キャンセル issues.save=保存 issues.label_title=ラベル名 issues.label_color=ラベルの色 issues.label_count=%d ラベル -issues.label_open_issues=%d 未解決の問題 +issues.label_open_issues=%d 未解決の課題 issues.label_edit=編集 issues.label_delete=削除 issues.label_modify=ラベルの変更 issues.label_deletion=ラベルの削除 -issues.label_deletion_desc=ラベルを削除すると、関連するすべての問題の情報が削除されます。続行しますか。 +issues.label_deletion_desc=ラベルを削除すると、現在紐付けられているすべての課題から削除されます。よろしいですか? issues.label_deletion_success=ラベルは正常に削除されました。 -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.num_participants=%d 参加者 +issues.attachment.open_tab=`クリックして新しいタブで "%s" を見る` +issues.attachment.download=`クリックして "%s" をダウンロード` pulls.new=新しいプルリクエスト pulls.compare_changes=変更を比較 @@ -561,24 +634,30 @@ pulls.compare_base=ベース pulls.compare_compare=比較 pulls.filter_branch=フィルターブランチ pulls.no_results=結果が見つかりませんでした。 -pulls.nothing_to_compare=There is nothing to compare because base and head branches are even. +pulls.nothing_to_compare=ベースブランチとヘッドブランチが同一であるため、比較するものがありません。 +pulls.nothing_merge_base=2 本の枝が完全に異なる歴史を持っているので、比較するものがありません。 pulls.has_pull_request=`既にプルリクエストがこれらのターゲット間に存在します: %[2]s#%[3]d` pulls.create=プルリクエストを作成します。 -pulls.title_desc=wants to merge %[1]d commits from %[2]s into %[3]s -pulls.merged_title_desc=merged %[1]d commits from %[2]s into %[3]s %[4]s +pulls.title_desc=が %[2]s から %[3]s への %[1]d コミットのマージを希望しています +pulls.merged_title_desc=%[4]s に %[1]d 件のコミットが %[2]s から %[3]s にマージされました pulls.tab_conversation=会話 pulls.tab_commits=コミット -pulls.tab_files=ファイルが変更された -pulls.reopen_to_merge=Please reopen this pull request to perform merge operation. +pulls.tab_files=変更されたファイル +pulls.reopen_to_merge=マージ操作を実行するには、このプルリクエストを再び開いてください。 pulls.merged=マージされた -pulls.has_merged=このプルプルリクエストは正常にマージされました! -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 can't be merged automatically because there are conflicts. +pulls.has_merged=このプルリクエストは正常にマージされました! +pulls.data_broken=フォーク情報の削除によってこのプルリクエストのデータは壊れています。 +pulls.is_checking=コンフリクトが発生していないかチェック中です、しばらく待ったのちページを更新してください。 +pulls.can_auto_merge_desc=このプルリクエストは自動的にマージできます。 +pulls.cannot_auto_merge_desc=コンフリクトが発生しているため、このプルリクエストを自動的にマージすることはできません。 pulls.cannot_auto_merge_helper=競合を解決するためには、手動でマージする必要があります。 +pulls.create_merge_commit=マージコミットを作成する +pulls.rebase_before_merging=マージする前に再配置します。 +pulls.commit_description=コミットの説明 pulls.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=`同じリポジトリに同じマージ情報持つ未解決のプルリクエスト (#%d) が存在するため再び開くことができません。` +pulls.delete_branch=ブランチの削除 +pulls.delete_branch_has_new_commits=マージ後に新しいコミットが行われているため、ブランチを削除することはできません。 milestones.new=新しいマイルストーン milestones.open_tab=%d オープン @@ -587,27 +666,27 @@ milestones.closed=%s を閉じました milestones.no_due_date=期限なし milestones.open=開く milestones.close=閉じる -milestones.new_subheader=あなたの課題を整理するためマイルス トーンを作成します。 -milestones.create=マイルス トーンを作成 +milestones.new_subheader=あなたの課題を整理するためマイルストーンを作成します。 +milestones.create=マイルストーンを作成 milestones.title=タイトル milestones.desc=説明 milestones.due_date=期日 (オプション) milestones.clear=消去 -milestones.invalid_due_date_format=期限日付のフォーマットが無効、'yyyy-mm-dd' のフォーマットが必要です。 -milestones.create_success=マイルス トーン '%s' が正常に作成されました! -milestones.edit=マイルス トーンを編集 -milestones.edit_subheader=人々を混乱させないため、マイルス トーンにより良い説明を使用します。 +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=マイルス トーンは正常に削除されました。 +milestones.modify=マイルストーンを変更 +milestones.edit_success=マイルストーン '%s' の変更が正常に保存されました! +milestones.deletion=マイルストーンの削除 +milestones.deletion_desc=マイルストーンを削除すると、課題との紐付け情報が削除されます。続行しますか? +milestones.deletion_success=マイルストーンは正常に削除されました! wiki=Wiki wiki.welcome=Wiki へようこそ! wiki.welcome_desc=Wikiとは、あなたのプロジェクトを文書化し、複数人で一緒に編集する場所です。 -wiki.create_first_page=最初のページを作成する。 +wiki.create_first_page=最初のページを作成する wiki.page=ページ wiki.filter_page=フィルターページ wiki.new_page=新しいページを作成 @@ -617,64 +696,94 @@ wiki.last_commit_info=%s このページを編集 %s wiki.edit_page_button=編集 wiki.new_page_button=新規ページ wiki.delete_page_button=ページの削除 -wiki.delete_page_notice_1=This will delete the page "%s". Please be certain. +wiki.delete_page_notice_1=ページ "%s" が削除されます。ご確認ください。 wiki.page_already_exists=既に同じ名前のWiki ページが存在します。 wiki.pages=ページ wiki.last_updated=最終更新 %s settings=設定 settings.options=オプション -settings.collaboration=コラボレーション +settings.collaboration=共同編集 settings.collaboration.admin=管理 settings.collaboration.write=書込 settings.collaboration.read=読込 -settings.collaboration.undefined=Undefined +settings.collaboration.undefined=未定義 +settings.branches=ブランチ +settings.branches_bare=リポジトリが初期の状態ではブランチの設定はおこなえません。まずは何かプッシュしてください。 +settings.default_branch=デフォルトブランチ +settings.default_branch_desc=デフォルトブランチは、コードのコミットやプルリクエスト、オンライン編集において「基点」となるブランチです。 +settings.update=更新 +settings.update_default_branch_unsupported=このサーバー上のGitバージョンではデフォルトブランチの変更がサポートされていません。 +settings.update_default_branch_success=このリポジトリのデフォルトブランチが更新されました! +settings.protected_branches=保護されたブランチ +settings.protected_branches_desc=force pushや偶発的な削除からの保護、コミッターのホワイトリスト設定をおこないます。 +settings.choose_a_branch=ブランチを選択... +settings.branch_protection=ブランチの保護 +settings.branch_protection_desc=%s ブランチの保護設定を選択してください。 +settings.protect_this_branch=このブランチを保護 +settings.protect_this_branch_desc=force pushの無効化と、ブランチの削除防止をおこないます。 +settings.protect_require_pull_request=直接のプッシュの代わりに、プルリクエストの作成が必要 +settings.protect_require_pull_request_desc=このブランチへの直接のプッシュを無効にするオプションを有効化します。コミットは、別の保護されていないブランチへプッシュをしたのちに、プルリクエストを通してマージする必要があります。 +settings.protect_whitelist_committers=このブランチにプッシュできるユーザー +settings.protect_whitelist_committers_desc=このブランチに直接プッシュできるユーザーやチームをホワイトリストに追加してください。ホワイトリストのユーザーは、プルリクエストによるチェックを必要としません。 +settings.protect_whitelist_users=このブランチにプッシュできるユーザー +settings.protect_whitelist_search_users=ユーザーを検索 +settings.protect_whitelist_teams=このブランチに直接プッシュすることができるチーム +settings.protect_whitelist_search_teams=チームを検索 +settings.update_protect_branch_success=このブランチの保護設定が更新されました! settings.hooks=Webhooks settings.githooks=Git のフック settings.basic_settings=基本設定 -settings.mirror_settings=Mirror Settings +settings.mirror_settings=ミラー設定 settings.sync_mirror=今すぐ同期 -settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. +settings.mirror_sync_in_progress=ミラー同期中です。1分後にページを更新してください。 settings.site=公式サイト settings.update_settings=設定の更新 settings.change_reponame_prompt=この変更はリンクがリポジトリに関連付ける方法に影響します。 settings.advanced_settings=拡張設定 -settings.wiki_desc=Enable wiki system -settings.use_internal_wiki=Use builtin wiki -settings.use_external_wiki=外部 wiki を使用します。 +settings.wiki_desc=Wiki システムを有効にする +settings.use_internal_wiki=内蔵 Wiki を使用する +settings.allow_public_wiki_desc=非公開リポジトリであってもWikiへのアクセスは誰でも可能にする +settings.use_external_wiki=外部 Wiki を使用する settings.external_wiki_url=外部 Wiki の URL -settings.external_wiki_url_desc=Visitors will be redirected to URL when they click on the tab. -settings.issues_desc=Enable issue tracker -settings.use_internal_issue_tracker=Use builtin lightweight issue tracker +settings.external_wiki_url_desc=訪問者がタブをクリックしたとき、このURLにリダイレクトされます。 +settings.issues_desc=課題トラッキングツールを有効 +settings.use_internal_issue_tracker=軽量な内蔵の課題トラッキングシステムを使用 +settings.allow_public_issues_desc=非公開リポジトリであっても課題へのアクセスは誰でも可能にする settings.use_external_issue_tracker=外部課題トラッキングシステムを使用 +settings.external_tracker_url=外部課題トラッキングツール URL +settings.external_tracker_url_desc=訪問者がタブをクリックしたとき、このURLにリダイレクトされます。 settings.tracker_url_format=外部課題トラッキングツール URLのフォーマット -settings.tracker_issue_style=External Issue Tracker Naming Style: +settings.tracker_issue_style=外部課題トラッキングシステムの命名方式: settings.tracker_issue_style.numeric=数値 -settings.tracker_issue_style.alphanumeric=Alphanumeric -settings.tracker_url_format_desc=You can use placeholder {user} {repo} {index} for user name, repository name and issue index. -settings.pulls_desc=Enable pull requests to accept public contributions +settings.tracker_issue_style.alphanumeric=英数字 +settings.tracker_url_format_desc=ユーザー名、リポジトリ名、課題番号を埋め込むために {user} {repo} {index} が使用できます。 +settings.pulls_desc=プルリクエストを有効にし、リポジトリとブランチ間のコントリビューションを受け入れる +settings.pulls.ignore_whitespace=空白の変更を無視する +settings.pulls.allow_rebase_merge=コミットをマージするためのリベースの使用を許可する settings.danger_zone=危険地帯 +settings.cannot_fork_to_same_owner=元の持ち主に向けてフォークすることは出来ません。 settings.new_owner_has_same_repo=新しいオーナーは、既に同じ名前のリポジトリを持っています。 -settings.convert=Convert To Regular Repository -settings.convert_desc=You can convert this mirror to a regular repository. This cannot be reversed. -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 regular type successfully. +settings.convert=通常リポジトリへ変更 +settings.convert_desc=ミラーリポジトリを通常のリポジトリに変更します。この操作は元に戻せません。 +settings.convert_notices_1=- この操作によりリポジトリはミラーリポジトリから通常リポジトリへと変更され、元に戻すことはできません。 +settings.convert_confirm=変更を確認 +settings.convert_succeed=リポジトリは正常に通常リポジトリへ変更されました。 settings.transfer=オーナー移転 -settings.transfer_desc=リポジトリをあなたが管理者権限を持っている別のユーザーまた組織に移譲します。 +settings.transfer_desc=このリポジトリを、別のユーザーまたはあなたが管理者権限を所持している組織に委譲します。 settings.transfer_notices_1=-新しい所有者が個人ユーザーの場合、あなたがアクセスできなくなります。 -settings.transfer_notices_2=- You will conserve access if new owner is an organization and if you're one of the owners. +settings.transfer_notices_2=- 新しい所有者が組織で、あなたがその組織の所有者である場合はアクセス権が残ります。 settings.transfer_form_title=操作を確認するために、以下の情報を入力してください。 settings.wiki_delete=Wikiのデータ消去 settings.wiki_delete_desc=Wikiのデータを消去すると元に戻すことは出来ません。よく確認してください。 -settings.wiki_delete_notices_1=- This will delete and disable the wiki for %s +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=- 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.delete_notices_2=-この操作はこのリポジトリで、Git データ、問題、コメント協力アクセスなどすべて削除されます。 +settings.delete_notices_fork_1=- 削除後、すべてのフォークは独立したリポジトリになります。 +settings.deletion_success=リポジトリが正常に削除されました。 settings.update_settings_success=リポジトリ オプションが更新されました。 settings.transfer_owner=新しいオーナー settings.make_transfer=転送 @@ -682,26 +791,31 @@ settings.transfer_succeed=リポジトリの所有権は正常に転送されま settings.confirm_delete=削除を確認 settings.add_collaborator=新しい共同編集者を追加 settings.add_collaborator_success=新しい共同編集者が追加されました。 -settings.delete_collaborator=Delete -settings.collaborator_deletion=Collaborator Deletion -settings.collaborator_deletion_desc=This user will no longer have collaboration access to this repository after deletion. Do you want to continue? +settings.delete_collaborator=削除 +settings.collaborator_deletion=共同編集者の削除 +settings.collaborator_deletion_desc=削除後、このユーザーはこのリポジトリに、共同編集のためのアクセスができなくなります。続行しますか? settings.remove_collaborator_success=共同編集者が削除されました。 -settings.search_user_placeholder=Search users +settings.search_user_placeholder=ユーザーを検索... settings.org_not_allowed_to_be_collaborator=組織を共同編集者として追加することはできません。 -settings.user_is_org_member=ユーザーは組織の一員なので、共同編集者として追加することはできません。 -settings.add_webhook=Webhook を追加 settings.hooks_desc=Webhooksは、Gogsで特定のイベントの発生時に指定された外部サービスに通知を許可します。イベントが発生すると、それぞれ指定されたUrlに、POSTリクエストが送られます。詳細はこちらのの Webhooks ガイドをご覧ください。 +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=Webhook を追加 settings.webhook_deletion=Webhook を削除 settings.webhook_deletion_desc=このwebhookを削除すると、すべての情報と配信履歴が削除されます。続行しますか? settings.webhook_deletion_success=Webhook が正常に削除されました。 settings.webhook.test_delivery=テスト配信 -settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings -settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history. +settings.webhook.test_delivery_desc=Webhook 設定をテストするために、フェイクのpushイベントを送信します +settings.webhook.test_delivery_success=テスト Webhook が配信キューに追加されました。配信履歴に表示されるまでにはしばらく時間がかかる場合があります。 +settings.webhook.redelivery=再送信 +settings.webhook.redelivery_success=フックタスク '%s' が配信キューに再び追加されました。配信履歴に表示されるまでにはしばらく時間がかかる場合があります。 settings.webhook.request=リクエスト settings.webhook.response=レスポンス settings.webhook.headers=ヘッダ settings.webhook.payload=ペイロード settings.webhook.body=ボディ +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Git のフックは Git 自体によって提供されています。以下のリストのファイルを編集して、サポートされているフックのカスタム操作を適用することができます。 settings.githook_edit_desc=もしフックがアクティブではない場合は、サンプルコンテンツが表示されます。コンテンツを空白にするにはこのフックを無効にします。 settings.githook_name=フックの名前 @@ -711,19 +825,30 @@ settings.add_webhook_desc=私たちは、指定されたURLに購読されたイ settings.payload_url=ペイロードの URL settings.content_type=コンテンツ タイプ settings.secret=秘密 -settings.slack_username=ユーザ名 +settings.secret_desc=秘密キーは、 X-Gogs-Signature ヘッダーを介してペイロードの HMAC SHA256 六角ダイジェストとして送信されます。 +settings.slack_username=ユーザー名 settings.slack_icon_url=アイコン URL settings.slack_color=カラー -settings.event_desc=どのイベントをこのWEBフックのトリガーにしますか? +settings.event_desc=どのイベントをこの Webhook のトリガーにしますか? settings.event_push_only=push イベントのみ -settings.event_send_everything=すべて が必要です。 -settings.event_choose=必要なものを選択しましょう。 -settings.event_create=Create -settings.event_create_desc=ブランチ、またはタグを作成 -settings.event_pull_request=Pull Request -settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. +settings.event_send_everything=すべてのイベント +settings.event_choose=必要なものを選択 +settings.event_create=作成 +settings.event_create_desc=ブランチやタグの作成時 +settings.event_delete=削除 +settings.event_delete_desc=ブランチやタグの削除時 +settings.event_fork=フォーク +settings.event_fork_desc=リポジトリがフォークされた時 settings.event_push=プッシュ -settings.event_push_desc=Git リポジトリにプッシュ +settings.event_push_desc=リポジトリへのプッシュがされた時 +settings.event_issues=課題 +settings.event_issues_desc=課題の開始・終了・再開・編集・アサイン・アサイン解除・ラベル更新・ラベル削除・マイルストーン紐付け・マイルストーン紐付け解除がされた時 +settings.event_pull_request=プルリクエスト +settings.event_pull_request_desc=プルリクエストの開始・終了・再開・編集・アサイン・アサイン解除・ラベル更新・ラベル削除・マイルストーン紐付け・マイルストーン紐付け解除・同期がされた時 +settings.event_issue_comment=課題へのコメント +settings.event_issue_comment_desc=課題へのコメントが作成・編集・削除された時 +settings.event_release=リリース +settings.event_release_desc=リポジトリでリリースが公開された時 settings.active=アクティブ settings.active_helper=このフックのトリガーが引かれた時に、イベントの詳細を配信します。 settings.add_hook_success=新しい webhook が追加されました。 @@ -732,14 +857,17 @@ settings.update_hook_success=Webhook を更新しました。 settings.delete_webhook=Webhook を削除 settings.recent_deliveries=最近のデリバリー settings.hook_type=フックタイプ -settings.add_slack_hook_desc= Slack インテグレーションをリポジトリに追加します。 +settings.add_slack_hook_desc=リポジトリに Slack 連携を追加します。 +settings.add_discord_hook_desc=リポジトリに Discord 連携を追加します。 +settings.add_dingtalk_hook_desc=リポジトリに Dingtalk 連携を追加します。 settings.slack_token=トークン settings.slack_domain=ドメイン settings.slack_channel=チャンネル settings.deploy_keys=デプロイキー +settings.deploy_keys_helper=お探しですか? 個人公開鍵を追加する場合は、アカウント設定からおこなえます。 settings.add_deploy_key=デプロイキーを追加 settings.deploy_key_desc=個人アカウントのSSHキーとは異なり、デプロイキーは読み取り専用アクセスとなります。 -settings.no_deploy_keys=でプロキーは1つも追加されていません。 +settings.no_deploy_keys=デプロイキーは1つも追加されていません。 settings.title=タイトル settings.deploy_key_content=コンテント settings.key_been_used=デプロイキーが使用されています。 @@ -748,6 +876,8 @@ settings.add_key_success=新しいデプロイキー '%s'が正常に追加さ settings.deploy_key_deletion=デプロイキーを削除 settings.deploy_key_deletion_desc=このデプロイキーを削除すると、このリポジトリに関連するすべてのアクセス権も削除されます。続行しますか。 settings.deploy_key_deletion_success=デプロイキーが正常に削除された! +settings.description_desc=リポジトリの説明(512文字以内) +settings.description_length=利用可能な文字 diff.browse_source=ソースを参照 diff.parent=親 @@ -755,23 +885,22 @@ diff.commit=コミット diff.data_not_available=差分データは利用できません。 diff.show_diff_stats=差分情報を表示 diff.show_split_view=分割表示 -diff.show_unified_view=Unified View -diff.stats_desc=共有%d 個のファイルを変更した%d 個の追加%d 個の削除を含む +diff.show_unified_view=一括表示 +diff.stats_desc=%d ファイル変更%d 行追加%d 行削除 diff.bin=BIN diff.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 +diff.file_suppressed=ファイルの差分が大きいため隠しています +diff.too_many_files=この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません release.releases=リリース release.new_release=新しいリリース release.draft=ドラフト release.prerelease=プレリリース -release.stable=安定 release.edit=編集 -release.ahead=このリリース以降 %s へ %d コミット +release.ahead=このリリース以降 %[2]s へ %[1]d コミット release.source_code=ソース コード -release.new_subheader=Publish releases to iterate product. -release.edit_subheader=詳細な変更ログは、ユーザーに何が改善されたかの理解を助けることができます。 +release.new_subheader=製品を反復するためにリリースを公開する。 +release.edit_subheader=詳細な変更ログは、ユーザーが改善点を理解するのに役立つでしょう。 release.tag_name=タグ名 release.target=ターゲット release.tag_helper=既存のタグを選択するか、新しいタグを作成し発行します。 @@ -791,8 +920,8 @@ release.deletion=リリースの削除 release.deletion_desc=このリリースを削除すると、対応するGitのタグも削除されます。よろしいですか? release.deletion_success=リリースが正常に削除されました。 release.tag_name_already_exist=このタグ名には既にリリースが存在します。 -release.tag_name_invalid=Tag name is not valid. -release.downloads=Downloads +release.tag_name_invalid=タグ名が不正です。 +release.downloads=ダウンロード [org] org_name_holder=組織名 @@ -800,7 +929,7 @@ org_full_name_holder=組織のフルネーム org_name_helper=偉大な組織の名は短く覚えやすいです。 create_org=組織を作成 repo_updated=最終更新 -people=人々 +people=メンバー invite_someone=誰かを招待 teams=チーム lower_members=メンバー @@ -813,8 +942,8 @@ team_name_helper=会話の時、この名前を使用しチーム名を表明し team_desc_helper=このチームに関する全ての情報は? team_permission_desc=このチームに必要な権限レベルは? -form.name_reserved=組織名 '%s' は予約されています。 -form.name_pattern_not_allowed=組織名のパターン '%s' は許可されていません。 +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=チーム名またはパターン %q は許可されていません。 settings=設定 settings.options=オプション @@ -823,31 +952,31 @@ settings.website=WEBサイト settings.location=ロケーション settings.update_settings=設定の更新 settings.update_setting_success=組織の設定が更新されました。 -settings.change_orgname_prompt=This change will affect how links relate to the organization. +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.delete_org_desc=この組織は完全に削除されます。よろしいですか? settings.hooks_desc=この組織のもとで すべてのリポジトリ に対してトリガーされる webhook を追加します。 -members.membership_visibility=Membership Visibility: +members.membership_visibility=所属状況を公開: members.public=パブリック -members.public_helper=プライベートにする -members.private=プライベート +members.public_helper=非公開にする +members.private=非公開 members.private_helper=公開する members.member_role=メンバーの役割: members.owner=オーナー members.member=メンバー members.remove=削除 -members.leave=退出 +members.leave=脱退 members.invite_desc=%s に新しいメンバーを追加 members.invite_now=今すぐ招待 teams.join=参加 -teams.leave=退出 +teams.leave=脱退 teams.read_access=読み取りアクセス権 teams.read_access_helper=このチームはリポジトリの閲覧とクローンをすることができます。 teams.write_access=書き込みアクセス権 @@ -875,7 +1004,7 @@ teams.add_nonexistent_repo=追加しようとしているリポジトリは存 [admin] dashboard=ダッシュボード -users=ユーザ +users=ユーザー organizations=組織 repositories=リポジトリ authentication=認証 @@ -886,12 +1015,19 @@ first_page=First last_page=Last total=合計: %d +dashboard.build_info=ビルド情報 +dashboard.app_ver=アプリケーションのバージョン +dashboard.git_version=Git バージョン +dashboard.go_version=Go バージョン +dashboard.build_time=ビルド日時 +dashboard.build_commit=Build commit dashboard.statistic=統計 dashboard.operations=操作 dashboard.system_status=システム モニターのステータス -dashboard.statistic_info=Gogs データベースは %d ユーザ, %d 組織, %d 公開鍵, %d リポジトリ, %d ウォッチ, %d スター, %d 行動, %d アクセス, %d 問題, %d コメント, %d ソーシャルアカウント, %d フォロー, %d ミラー, %d リリース, %d ログイン元, %d webhook, %d マイルストーン, %d ラベル, %d フックタスク, %d チーム, %d アップデートタスク, %d 添付ファイル の情報を持っています。 +dashboard.statistic_info=Gogs データベースは %d 人のユーザー、%d 個の組織、%d 個の公開鍵、%d 個のリポジトリ、%d 個のウォッチ、%d 個のスター、%d 回のアクション、%d 回のアクセス、%d 個の課題、%d 個のコメント、%d 個のソーシャルアカウント、%d 個のフォロー、%d 個のミラー、%d 個のリリース、%d 個のログイン元、%d 個のwebフック、%d 個のマイルストーン、%d 個のラベル、%d 個のフックタスク、%d 個のチーム、%d 更新タスク、%d 個の添付ファイルの情報を保持しています。 dashboard.operation_name=操作の名前 dashboard.operation_switch=スイッチ +dashboard.select_operation_to_run=操作を選択してください dashboard.operation_run=実行 dashboard.clean_unbind_oauth=結び付けられていない OAuth をクリーン dashboard.clean_unbind_oauth_success=結び付けられていない全ての OAuth を正常に削除しました。 @@ -900,15 +1036,15 @@ dashboard.delete_inactivate_accounts_success=すべての非アクティブア dashboard.delete_repo_archives=リポジトリのすべてのアーカイブを削除 dashboard.delete_repo_archives_success=リポジトリのすべてのアーカイブが正常に削除されました。 dashboard.delete_missing_repos=Gitファイルが失われたリポジトリのすべてのレコードを削除 -dashboard.delete_missing_repos_success=All repository records that lost Git files have been deleted successfully. +dashboard.delete_missing_repos_success=すべてのGitファイルを失ったレポジトリレコードが正常に削除されました。 dashboard.git_gc_repos=リポジトリでのガベージコレクションを実行します。 dashboard.git_gc_repos_success=すべてのリポジトリは正常にガベージ コレクションを行いました。 dashboard.resync_all_sshkeys='.ssh/ authorized_keys' ファイルを再生成します。(警告:Gogsキー以外は失われます) dashboard.resync_all_sshkeys_success=すべての公開鍵が正常に書き換えられました。 -dashboard.resync_all_update_hooks=リポジトリの update フックをすべて再更新する(カスタムの設定パスが変更されたときに必要) -dashboard.resync_all_update_hooks_success=リポジトリの update フックがすべて正常に再更新されました。 -dashboard.reinit_missing_repos=Reinitialize all repository records that lost Git files -dashboard.reinit_missing_repos_success=All repository records that lost Git files have been reinitialized successfully. +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.server_uptime=サーバーの稼働時間 dashboard.current_goroutine=現在のGoroutine @@ -943,30 +1079,30 @@ dashboard.gc_times=GC実行回数 users.user_manage_panel=ユーザー管理パネル users.new_account=新規アカウントを作成 users.name=名前 -users.activated=アクティブ化 -users.admin=アドミン +users.activated=有効 +users.admin=管理者 users.repos=リポジトリ -users.created=作成されました +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.password_helper=変更しない場合は空白のままにしてください。 +users.update_profile_success=アカウント情報が更新されました。 users.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=アカウントがアクティブされました -users.prohibit_login=This account is prohibited to login -users.is_admin=このアカウントには管理者の権限を持つ -users.allow_git_hook=このアカウントには Git のフックを作成する権限を持つ -users.allow_import_local=This account has permissions to import local repositories -users.update_profile=アカウント ・ プロファイルを更新 +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.still_has_org=このアカウントは1つ以上の組織に所属しているため、先に組織を脱退させるか組織を削除する必要があります。 users.deletion_success=アカウントが正常に削除されました。 orgs.org_manage_panel=組織の管理パネル @@ -977,158 +1113,248 @@ orgs.members=メンバー repos.repo_manage_panel=リポジトリの管理パネル repos.owner=オーナー repos.name=名前 -repos.private=プライベート -repos.watches=Watches -repos.stars=Stars +repos.private=非公開 +repos.watches=ウォッチ +repos.stars=スター repos.issues=課題 +repos.size=容量 -auths.auth_manage_panel=認証管理パネル +auths.auth_sources=認証ソース auths.new=新しいソースを追加 auths.name=名前 auths.type=タイプ -auths.enabled=Enabled +auths.enabled=有効 +auths.default=デフォルト auths.updated=更新しました auths.auth_type=認証タイプ auths.auth_name=認証名 -auths.security_protocol=Security Protocol +auths.security_protocol=セキュリティプロトコル auths.domain=ドメイン auths.host=ホスト auths.port=ポート auths.bind_dn=バインド DN +auths.bind_dn_helper='%s'はユーザー名のプレースホルダとして使用できます。 例)DOM \%s auths.bind_password=バインド パスワード auths.bind_password_helper=警告: このパスワードは暗号化されずに格納されます。特権を持つアカウントに使用しないでください。 -auths.user_base=ユーザ検索ベース +auths.user_base=ユーザー検索ベース auths.user_dn=User DN -auths.attribute_username=Username attribute -auths.attribute_username_placeholder=Leave empty to use sign-in form field value for user name. +auths.attribute_username=ユーザー名属性 +auths.attribute_username_placeholder=ログインフォームの値を使う場合は空にしてください。 auths.attribute_name=名前属性 auths.attribute_surname=名字属性 auths.attribute_mail=Eメール属性 -auths.attributes_in_bind=Fetch attributes in Bind DN context -auths.filter=User フィルター +auths.verify_group_membership=グループ メンバーシップを確認します。 +auths.group_search_base_dn=グループ サーチベースDN +auths.group_filter=グループ フィルター +auths.group_attribute_contain_user_list=ユーザーのリストを含むグループ属性 +auths.user_attribute_listed_in_group=グループのユーザー属性 +auths.attributes_in_bind=属性をバインドDNのコンテクストから取得する +auths.filter=ユーザーフィルター auths.admin_filter=Admin フィルター auths.ms_ad_sa=Ms Ad SA auths.smtp_auth=SMTP 認証の種類 auths.smtphost=SMTP ホスト auths.smtpport=SMTP ポート auths.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=ドメイン制限をおこなわない場合は空のままにしてください。複数のドメインを記入する場合は、カンマ ',' で区切ってください。 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.activated=認証の有効化 +auths.default_auth=この認証を、既定のログイン ソースとする auths.new_success=新しい認証 '%s' が正常に追加されました。 auths.update_success=認証の設定が正常に更新されました。 auths.update=認証設定を更新 auths.delete=この認証を削除 auths.delete_auth_title=認証削除 auths.delete_auth_desc=認証を削除します、継続しますか? -auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first. +auths.still_in_used=この認証を使用しているユーザーがいます。ユーザーを削除するか、別のログイン方法に割り当ててください。 auths.deletion_success=認証が正常に削除されました。 +auths.login_source_exist=ログイン ソース '%s' は既に存在します。 +auths.github_api_endpoint=APIエンドポイント +config.not_set=(未設定) config.server_config=サーバーの構成 -config.app_name=アプリケーション名 -config.app_ver=アプリケーションのバージョン -config.app_url=アプリケーションの URL -config.domain=ドメイン -config.offline_mode=オフラインモード -config.disable_router_log=ルーターのログを無効にする -config.run_user=実行ユーザ +config.brand_name=ブランド名 +config.run_user=実行ユーザー config.run_mode=実行モード -config.repo_root_path=リポジトリのルートパス -config.static_file_root_path=静的ファイルのルートパス -config.log_file_root_path=ログ ファイルのルート パス -config.script_type=スクリプトの種類 -config.reverse_auth_user=リバース認証ユーザ - -config.ssh_config=SSH Configuration -config.ssh_enabled=Enabled -config.ssh_start_builtin_server=Start Builtin Server -config.ssh_domain=Domain -config.ssh_port=Port -config.ssh_listen_port=Listen Port -config.ssh_root_path=Root Path -config.ssh_key_test_path=Key Test Path -config.ssh_keygen_path=Keygen ('ssh-keygen') Path -config.ssh_minimum_key_size_check=Minimum Key Size Check -config.ssh_minimum_key_sizes=Minimum Key Sizes - -config.db_config=データベースの構成 -config.db_type=タイプ -config.db_host=ホスト -config.db_name=名前 -config.db_user=ユーザ -config.db_ssl_mode=SSL モード -config.db_ssl_mode_helper=(「postgres」のみ) -config.db_path=パス -config.db_path_helper=(for "sqlite3" and "tidb") - -config.service_config=サービスの構成 -config.register_email_confirm=電子メールの確認を必要 -config.disable_register=登録を無効にする -config.show_registration_button=登録ボタンを表示します。 -config.require_sign_in_view=サインインを要求 -config.mail_notify=メール通知 -config.disable_key_size_check=最小キー サイズ チェックを無効にします -config.enable_captcha=Captchaを有効にする -config.active_code_lives=コードリンクの有効期限をアクティブ -config.reset_password_code_lives=パスワードリンクの有効期限をリセット +config.server.external_url=外部 URL +config.server.domain=ドメイン +config.server.protocol=プロトコル +config.server.http_addr=HTTPアドレス +config.server.http_port=HTTP ポート +config.server.cert_file=証明書ファイル +config.server.key_file=キーファイル +config.server.tls_min_version=最小TLSバージョン +config.server.unix_socket_permission=Unixソケットの権限 +config.server.local_root_url=ローカル ルート URL +config.server.offline_mode=オフラインモード +config.server.disable_router_log=ルーターログを無効にする +config.server.enable_gzip=Gzip を有効化 +config.server.app_data_path=アプリケーション データ パス +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL + +config.ssh_config=SSH設定 +config.ssh.enabled=有効 +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen パス +config.ssh.key_test_path=鍵テストパス +config.ssh.minimum_key_size_check=最小キーサイズチェック +config.ssh.minimum_key_sizes=最小キーサイズ +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=内蔵サーバーを起動 +config.ssh.listen_host=待受ホスト +config.ssh.listen_port=待受ポート +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=リポジトリの設定 +config.repo.root_path=ルートパス +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI 文字コード +config.repo.force_private=非公開にする +config.repo.max_creation_limit=最大作成数 +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=HTTP Git の無効化 +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit + +config.db_config=データベース設定 +config.db.type=DB種類 +config.db.host=DBホスト +config.db.name=DB名 +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=DBユーザー +config.db.ssl_mode=SSL モード +config.db.ssl_mode_helper=("postgres"のみ) +config.db.path=DBパス +config.db.path_helper=("sqlite3"のみ) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=セキュリティ設定 +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=セキュアなクッキーを有効にする +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=ホスト +config.email.from=From +config.email.user=ユーザー +config.email.disable_helo=HELOを無効にする +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=プレーンテキストを使用する +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=登録を無効にする +config.auth.enable_registration_captcha=登録時のCAPTCHAを有効にする +config.auth.enable_reverse_proxy_authentication=リバースプロキシ認証を有効にする +config.auth.enable_reverse_proxy_auto_registration=リバースプロキシの自動登録を有効にする +config.auth.reverse_proxy_authentication_header=リバースプロキシ認証ヘッダー + +config.user_config=ユーザー設定 +config.user.enable_email_notify=メール通知を有効にする + +config.session_config=セッションの設定 +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS のみ +config.session.gc_interval=GC 間隔 +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie + +config.cache_config=キャッシュの設定 +config.cache.adapter=Adapter +config.cache.interval=GC 間隔 +config.cache.host=ホスト + +config.http_config=HTTP の設定 +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=パス +config.attachment.allowed_types=Allowed types +config.attachment.max_size=サイズ制限 +config.attachment.max_files=ファイルの制限 + +config.release_config=リリースの構成 +config.release.attachment.enabled=添付ファイルが有効になっています +config.release.attachment.allowed_types=添付ファイルで許可されるタイプ +config.release.attachment.max_size=添付ファイルのサイズ制限 +config.release.attachment.max_files=添付ファイルのサイズ制限 + +config.picture_config=画像の設定 +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatarのソース +config.picture.disable_gravatar=Gravatarを無効にする +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=ミラー構成 +config.mirror.default_interval=Default interval config.webhook_config=Webhook設定 -config.queue_length=キューの長さ -config.deliver_timeout=送信タイムアウト -config.skip_tls_verify=TLSの確認を省略 - -config.mailer_config=メーラーの構成 -config.mailer_enabled=有効にした -config.mailer_disable_helo=HELOコマンド無効 -config.mailer_name=名前 -config.mailer_host=ホスト -config.mailer_user=ユーザ -config.send_test_mail=Send Test Email -config.test_mail_failed=Fail to send test email to '%s': %v -config.test_mail_sent=Test email has been sent to '%s'. - -config.oauth_config=OAuth 構成 -config.oauth_enabled=Enabled - -config.cache_config=キャッシュの構成 -config.cache_adapter=キャッシュ アダプター -config.cache_interval=キャッシュ間隔 -config.cache_conn=キャッシュ接続 - -config.session_config=セッションの構成 -config.session_provider=セッション プロバイダー -config.provider_config=プロバイダーの構成 -config.cookie_name=クッキーの名前 -config.enable_set_cookie=クッキーの設定を有効にする -config.gc_interval_time=GC 間隔 -config.session_life_time=セッションのライフタイム -config.https_only=HTTPS のみ -config.cookie_life_time=クッキーのライフタイム - -config.picture_config=画像構成 -config.picture_service=画像サービス -config.disable_gravatar=グラバターを無効にする -config.enable_federated_avatar=Enable Federated Avatars - -config.git_config=Git Configuration -config.git_disable_diff_highlight=Disable Diff Syntax Highlight -config.git_max_diff_lines=Max Diff Lines (for a single file) -config.git_max_diff_line_characters=Max Diff Characters (for a single line) -config.git_max_diff_files=Max Diff Files (to be shown) -config.git_gc_args=GC Arguments -config.git_migrate_timeout=Migration Timeout -config.git_mirror_timeout=Mirror Update Timeout -config.git_clone_timeout=Clone Operation Timeout -config.git_pull_timeout=Pull Operation Timeout -config.git_gc_timeout=GC Operation Timeout - -config.log_config=ログの構成 -config.log_mode=ログ モード +config.webhook.types=Types +config.webhook.deliver_timeout=配信のタイムアウト +config.webhook.skip_tls_verify=TLS検証をスキップ + +config.git_config=Git 設定 +config.git.disable_diff_highlight=Diff のシンタックスハイライトを無効にする +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff の最大文字数(1行あたり) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC の引数 +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=クローンのタイムアウト +config.git.pull_timeout=Pull タイムアウト +config.git.gc_timeout=GC タイムアウト + +config.lfs_config=LFS設定 +config.lfs.storage=ストレージ +config.lfs.objects_path=Objects path + +config.log_config=ログの設定 +config.log_file_root_path=ログファイルのルートパス +config.log_mode=モード +config.log_options=オプション monitor.cron=Cron タスク monitor.name=名前 @@ -1152,24 +1378,31 @@ notices.delete_all=すべての通知を削除 notices.type=タイプ notices.type_1=リポジトリ notices.desc=説明 -notices.op=Op。 +notices.op=操作 notices.delete_success=システム通知が正常に削除されました。 [action] create_repo=がリポジトリ %s を作成しました -rename_repo=%[1]s から [3]s にリポジトリ名を変更しました -commit_repo=%[4]s%[3]sにプッシュしました -create_issue=`問題 %s#%[2]s を開きました` -close_issue=`closed issue %s#%[2]s` -reopen_issue=`reopened issue %s#%[2]s` +rename_repo=が %[1]s から %[3]s にリポジトリ名を変更しました +commit_repo=が %[4]s%[3]s をプッシュしました +compare_commits=これらの %d コミットの比較を表示 +transfer_repo=リポジトリ %s%s へ転送しました +create_issue=`課題 %s#%[2]s を開きました` +close_issue=`課題 %s#%[2]s を閉じました` +reopen_issue=`課題 %s#%[2]s が再び開かれました` +comment_issue=`が課題 %s#%[2]s にコメントしました` create_pull_request=`プルリクエスト %s[2]sを作成` -close_pull_request=`closed pull request %s#%[2]s` -reopen_pull_request=`reopened pull request %s#%[2]s` -comment_issue=`問題 %s#%[2]s のコメント` +close_pull_request=`プルリクエスト %s#%[2]s を閉じました` +reopen_pull_request=`プルリクエスト %s#%[2]s が再び開かれました` merge_pull_request=`プルリクエスト %s[2]sをマージしました` -transfer_repo=リポジトリ %s%s へ転送しました -push_tag=%[3]s に タグ %[2]s をプッシュしました -compare_commits=これらの %d コミットの比較を表示 +create_branch=が %[4]s に新しいブランチ %[3]s を作成しました +delete_branch=%[3]s のブランチ %[2]s を削除しました +push_tag=が %[3]s にタグ %[2]s をプッシュしました +delete_tag=%[3]s のタグ %[2]s を削除しました +fork_repo=リポジトリを %s にフォークしました +mirror_sync_push=%[4]s%[3]s へのコミットをミラーから反映しました +mirror_sync_create=新しい参照%[2]s%[3]sにミラーから反映しました +mirror_sync_delete=%[3]s の参照 %[2]s をミラーから同期および削除しました [tool] ago=前 @@ -1191,6 +1424,7 @@ months=%d ヶ月 %s years=%d 年 %s raw_seconds=秒 raw_minutes=分 +raw_hours=時間 [dropzone] default_message=ここにファイルをドロップまたはクリックしてアップロードします。 diff --git a/conf/locale/locale_ko-KR.ini b/conf/locale/locale_ko-KR.ini new file mode 100644 index 00000000000..69e72d01e95 --- /dev/null +++ b/conf/locale/locale_ko-KR.ini @@ -0,0 +1,1436 @@ +app_desc=편리한 설치형 Git 서비스 + +home=홈 +dashboard=대시보드 +explore=탐색 +help=도움말 +sign_in=로그인 +sign_out=로그아웃 +sign_up=가입하기 +register=가입하기 +website=웹 사이트 +page=페이지 +template=템플릿 +language=언어 +create_new=만들기... +user_profile_and_more=사용자 프로필 및 기타 +signed_in_as=다음 사용자로 로그인됨 + +username=사용자명 +email=이메일 +password=비밀번호 +re_type=재입력 +captcha=보안 문자 + +repository=저장소 +organization=조직 +mirror=미러 +new_repo=새 저장소 +new_migrate=새 마이그레이션 +new_mirror=새로운 미러 +new_fork=새로운 포크 저장소 +new_org=새로운 조직 +manage_org=조직 관리 +admin_panel=관리자 패널 +account_settings=계정 설정 +settings=설정 +your_profile=프로필 +your_settings=설정 + +activities=활동 +pull_requests=풀 리퀘스트 +issues=이슈 + +cancel=취소 + +[status] +page_not_found=페이지를 찾을 수 없음 +internal_server_error=내부 서버 오류 + +[install] +install=설치 +title=첫 실행을 위한 설치단계 +docker_helper=Gogs를 Docker에서 운영하고 있다면 안내를 읽고 변경해 주세요! +requite_db_desc=Gogs는 MySQL, PostgreSQL, SQLite3, TiDB (MySQL protocol)을 필요로 합니다. +db_title=데이터베이스 설정 +db_type=데이터베이스 유형 +host=호스트 +user=사용자 +password=비밀번호 +db_name=데이터베이스 이름 +db_schema=스키마 +db_helper=MySQL에서는 utf8_general_ci 캐릭터셋으로 INNODB엔진을 이용해 주세요 +ssl_mode=SSL 모드 +path=경로 +sqlite_helper=SQLite3 데이터베이스의 경로입니다.
서비스를 시작할 때는 반드시 절대 경로를 사용해주세요. +err_empty_db_path=SQLite3 데이터베이스의 경로는 비워둘 수 없습니다. +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=사용자 계정은 저장소에 접근할 권한과 Gogs를 실행 할 권한이 있어야 합니다. +domain=도메인 +domain_helper=Git SSH url에 영향을 미칩니다. +ssh_port=SSH 포트 +ssh_port_helper=SSH서버가 실행되고 있는 포트를 입력하세요. 비워둘 경우 SSH를 사용하지 않습니다. +use_builtin_ssh_server=내장 SSH 서버 사용 +use_builtin_ssh_server_popup=시스템 SSH 디먼과 구별하기 위해 Git 작업을 위한 빌트인 SSH 서버를 시작하세요. +http_port=HTTP 포트 +http_port_helper=포트 번호는 애플리케이션에서 열고 있습니다. +app_url=애플리케이션 URL +app_url_helper=이 작업은 HTTP/HTTPS 클론 URL과 이메일의 어딘가에 영향을 미칩니다. +log_root_path=로그 경로 +log_root_path_helper=로그 파일을 쓸 디렉터리. +enable_console_mode=콘솔 모드 활성화 +enable_console_mode_popup=파일 모드 외에 콘솔에 로그를 인쇄하세요. +default_branch=기본 브랜치 + +optional_title=추가설정 +email_title=이메일 서비스 설정 +smtp_host=SMTP 호스트 +smtp_from=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=연합 아바타 조회 활성화 +federated_avatar_lookup_popup=libravatar 기반 오픈소스 서비스 사용 목적으로 연합 아바타 조회를 허용하기 +disable_registration=직접 등록할 수 없게 함 +disable_registration_popup=사용자가 직접 등록할 수 없게 합니다. 관리자만이 추가할 수 있습니다. +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=비밀번호 +confirm_password=비밀번호 확인 +admin_email=관리자 이메일 +install_gogs=Gogs 설치하기 +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 +smtp_host_missing_port=SMTP 호스트 포트가 주소에 없습니다. +invalid_smtp_from=SMTP 보낸 사람 필드가 유효하지 않습니다: %v +save_config_failed=설정을 저장할 수 없습니다: %v +init_failed=프로그램을 초기화하는데 실패하였습니다: %v +invalid_admin_setting=관리자 계정 설정이 잘못되었습니다: %v +install_success=환영합니다! Gogs를 선택해 주셔서 감사합니다. +invalid_log_root_path=로그 루트 경로가 올바르지 않습니다: %v + +[home] +uname_holder=사용자 이름이나 이메일 +password_holder=비밀번호 +switch_dashboard_context=대시보드 컨텍스트 바꾸기 +my_repos=내 저장소 +show_more_repos=더 많은 저장소 보기 +collaborative_repos=협업 저장소 +my_orgs=내 조직 +my_mirrors=내 미러 저장소들 +view_home=%s 보기 + +issues.in_your_repos=당신의 저장소에 + +[explore] +repos=저장소 +users=유저 +organizations=조직 +search=검색 + +[auth] +create_new_account=새 계정 생성 +register_hepler_msg=이미 계정을 가지고 계신가요? 로그인하세요! +social_register_hepler_msg=계정을 가지고 계신가요? 연결하세요! +disable_register_prompt=죄송합니다, 가입이 비활성화 되어있습니다. 사이트 관리자에게 문의 해주세요. +disable_register_mail=죄송합니다. 메일 등록이 비활성화 되었습니다. +auth_source=인증 소스 편집 +local=로컬 +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=여기를 눌러 확인 메일 재전송 +send_reset_mail=여기를 눌러 비밀번호 초기화 메일을 (재)전송 +reset_password=비밀번호 초기화 +invalid_code=죄송합니다. 확인 코드가 만료되었거나 유효하지 않습니다. +reset_password_helper=이곳을 눌러 비밀번호를 재설정 +password_too_short=비밀번호의 길이는 6글자 미만일 수 없습니다. +non_local_account=Gogs 계정이 아니면 암호를 변경할 수 없습니다. + +login_two_factor=2단계 인증 +login_two_factor_passcode=인증 패스코드 +login_two_factor_enter_recovery_code=2단계 복구 코드를 입력하세요 +login_two_factor_recovery=2단계 복구 +login_two_factor_recovery_code=복구 코드 +login_two_factor_enter_passcode=2단계 패스코드를 입력하세요 +login_two_factor_invalid_recovery_code=복구 코드가 사용 중이거나 유효하지 않습니다. + +[mail] +activate_account=계정을 활성화하세요 +activate_email=이메일 주소 확인 +reset_password=비밀번호 초기화 +register_success=등록 성공, 환영합니다. +register_notify=잘 오셨습니다 + +[modal] +yes=예 +no=아니오 +modify=수정 + +[form] +UserName=사용자 이름 +RepoName=저장소 이름 +Email=이메일 주소 +Password=비밀번호 +Retype=비밀번호 확인 +SSHTitle=SSH 키 이름 +HttpsUrl=HTTPS URL +PayloadUrl=페이로드 URL +TeamName=팀 이름 +AuthName=권한 이름 +AdminEmail=관리자 이메일 + +NewBranchName=새로운 브랜치명 +CommitSummary=커밋 요약 +CommitMessage=커밋 메시지 +CommitChoice=커밋 선택 +TreeName=파일 경로 +Content=컨텐츠 + +require_error=` 비어 있을 수 없습니다.` +alpha_dash_error=`은(는) 숫자, 알파벳, 대시(-_) 문자로만 구성되어야 합니다.` +alpha_dash_dot_error=` 숫자, 알파벳, 점(.), 대시(-_) 문자로만 구성되어야 합니다.` +alpha_dash_dot_slash_error=` 은(는) 알파벳, 숫자, 대시(-_), 점, 슬래시로만 구성되어야 합니다.` +size_error=` %s 글자여야 합니다.` +min_size_error=` 최소 %s 글자여야 합니다.` +max_size_error=` %s 글자를 넘을 수 없습니다.` +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=사용자 이름이나 비밀번호가 올바르지 않습니다. +auth_source_mismatch=선택 인증 소스는 사용자와 연결 됩니다. +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=Gogs에서 SSH 키를 검증할 수 없었지만 유효한 키로 가정하였습니다. 키가 올바른지 다시 확인해 주세요. +auth_failed=인증 실패: %v + +still_own_repo=하나 이상의 저장소를 소유하고 있습니다. 저장소를 삭제하거나 다른사람에게 이전해야 합니다. +still_has_org=하나 이상의 조직의 멤버로 소속되어 있습니다. 탈퇴하거나 조직을 삭제해야 합니다. +org_still_own_repo=조직이 소유하고 있는 저장소가 있습니다. 삭제하거나 이전해야 합니다. + +target_branch_not_exist=대상 브랜치가 존재하지 않습니다. + +[user] +change_avatar=아바타 변경 +join_on=가입 : +repositories=저장소 +activity=공개 활동 +followers=팔로워 +starred=Starred +following=팔로우 중 +follow=추적하기 +unfollow=추적해제 + +form.name_not_allowed=사용자 이름 또는 패턴 %q 은(는) 허용되지 않습니다. + +[settings] +profile=프로필 +password=비밀번호 +avatar=아바타 +ssh_keys=SSH 키 +security=보안 +repos=저장소 +orgs=조직 +applications=애플리케이션 +delete=계정 삭제 + +public_profile=공개 프로필 +profile_desc=이메일 주소가 공개되며, 사이트를 통해 작업하거나 계정과 관련된 모든 알림에 사용됩니다. +password_username_disabled=내부계정이 아닌 유형의 사용자는 이름 변경이 허용되지 않습니다. +full_name=성명 +website=웹 사이트 +location=위치 +update_profile=프로필 업데이트 +update_profile_success=프로필이 성공적으로 업데이트 되었습니다. +change_username=사용자명 변경 +change_username_prompt=이 변경은 당신의 계정과 연관된 모든 링크에 영향을 줍니다. +continue=계속하기 +cancel=취소 + +lookup_avatar_by_mail=이메일로 아바타 조회 +federated_avatar_lookup=연합 아바타 조회 +enable_custom_avatar=사용자정의 아바타를 사용 +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=이메일 주소 관리 +email_desc=주 사용 이메일 주소는 알림과 기타 작업에 사용됩니다. +primary=기본 +primary_email=기본으로 설정 +delete_email=삭제 +email_deletion=이메일 삭제 +email_deletion_desc=이메일 주소를 삭제하면 당신의 계정과 연관된 정보도 함께 삭제됩니다. 계속 하시겠습니까? +email_deletion_success=이메일 주소를 성공적으로 삭제되하였습니다! +email_deletion_primary=기본 이메일 주소를 삭제할 수 없습니다. +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주일 동안 사용된 적이 있습니다. + +two_factor=2단계 인증 +two_factor_status=상태: +two_factor_on=켜기 +two_factor_off=끄기 +two_factor_enable=활성화 +two_factor_disable=비활성화 +two_factor_view_recovery_codes=복구 코드를 안전한 장소에 저장해 두십시오. 인증 애플리케이션에 접근할 수 없을때 사용할 수 있습니다. +two_factor_http=HTTP/HTTPS 작업에 더이상 평문 사용자명과 비밀번호를 사용할 수 없습니다. 개인 액세스 토큰을 생성후 사용해 주세요. 예. %[3]s. +two_factor_enable_title=2단계 인증 활성화 +two_factor_scan_qr=인증 애플리케이션으로 이 이미지를 스캔하세요: +two_factor_or_enter_secret=또는 이 비밀키를 입력하세요: +two_factor_then_enter_passcode=그리고 코드를 입력하세요: +two_factor_verify=확인 +two_factor_invalid_passcode=입력한 코드가 올바르지 않습니다. 다시 시도해 주세요! +two_factor_reused_passcode=입력하신 비밀번호가 이미 사용되였습니.다른 비밀번호를 사용해보십시오!. +two_factor_enable_error=2단계 인증 활성화 실패: %v +two_factor_enable_success=2단계 인증이 성공적으로 활성화되었습니다! +two_factor_recovery_codes_title=2단계 인증 복구 코드 +two_factor_recovery_codes_desc=복구 코드는 당신이 2단계 인증 프로그램에 접근할 수 없을때 사용합니다. 각 코드들은 한 번만 사용될 수 있습니다. 이 코드들은 안전한 장소에 보관하세요. +two_factor_regenerate_recovery_codes=복구 코드 재생성 +two_factor_regenerate_recovery_codes_error=복구 코드 재생성 실패: %v +two_factor_regenerate_recovery_codes_success=성공적으로 새로운 복구 코드가 생성되었습니다! +two_factor_disable_title=2단계 인증 비활성화 +two_factor_disable_desc=2단계 인증을 끄면 보안 수준이 낮아집니다. 계속하시겠습니까? +two_factor_disable_success=2단계 인증이 성공적으로 비활성화되었습니다! + +manage_access_token=개인 액세스 토큰 관리 +generate_new_token=새 토큰을 생성 +tokens_desc=Gogs Api에 액세스 하는 데 사용할 수 있는 토큰입니다. +access_token_tips=개인 액세스 토큰은 사용자 이름 또는 비밀번호로 사용할 수 있습니다. Git 애플리케이션에서는 'x-access-token'을 사용자 이름으로 사용하고, 개인 액세스 토큰을 비밀번호로 사용하는 것이 권장됩니다. + +new_token_desc=각 토큰은 당신의 모든 권한을 행사할 수 있습니다. +token_name=토큰 이름 +generate_token=토큰 생성 +generate_token_succees=액세스 토큰이 생성되었습니다. 이번에만 확인할 수 있으니 잘 보관하세요. +delete_token=삭제 +access_token_deletion=개인 액세스 토큰 삭제 +access_token_deletion_desc=이 토큰을 사용하는 애플리케이션의 접근권한 또한 삭제됩니다. 계속 하시겠습니까? +delete_token_success=액세스 토큰이 삭제되었습니다. 애플리케이션의 업데이트도 잊지 마세요. +token_name_exists=같은 이름의 토큰이 이미 존재합니다. + +orgs.none=당신은 어떤 조직의 구성원도 아닙니다. +orgs.leave_title=조직 떠나기 +orgs.leave_desc=조직을 떠난 후에는 모든 리포지토리와 팀에 액세스 할 수 없게 됩니다. 계속 하시겠습니까? + +repos.leave=나가기 +repos.leave_title=저장소 나가기 +repos.leave_desc=이 페지를 떠나면 저장소에 액세스할수 없게 됩니다. 계속하시겠습니까? +repos.leave_success=당신은 저장소 '%s' 에서 성공적으로 탈퇴하였습니다.! + +delete_account=계정 삭제 +delete_prompt=당신의 계정을 삭제합니다. 완료된 후에는 취소할 수 없습니다. +confirm_delete_account=삭제 승인 +delete_account_title=계정 삭제 +delete_account_desc=이 계정은 영구적으로 삭제 될 것입니다. 계속 하시겠습니까? + +[repo] +owner=소유자 +repo_name=저장소 이름 +repo_name_helper=좋은 저장소 이름은 짧고 기억하기 좋은 유니크한 키워드로 이루어 집니다. +visibility=가시성 +unlisted=비공개 +visiblity_helper=이 저장소는 비공개 저장소입니다 +unlisted_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 서식을 선택합니다 +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=포크 +repo_description_helper=저장소 설명.최대 512길이의 문자열이 가능합니다. +repo_description_length=가능한 문자열입니다. + +form.reach_limit_of_creation=소유자가 저장소 만들기 최대 제한에 (%d개) 도달했습니다. +form.name_not_allowed=저장소명 또는 패턴 %q 은(는) 허용되지 않습니다. + +need_auth=인증 필요 +migrate_type=마이그레이션 유형 +migrate_type_helper=이 저장소는 미러가 됩니다. +migrate_repo=저장소 마이그레이션 +migrate.clone_address=클론 주소 +migrate.clone_address_desc=HTTP/HTTPS/GIT URL일 수 있습니다. +migrate.clone_address_desc_import_local=로컬 서버 경로를 기준으로 저장소를 마이그레이션 할 수도 있습니다. +migrate.permission_denied=로컬 저장소는 가져오기를 할 수 없습니다. +migrate.invalid_local_path=잘못된 로컬 경로입니다. 존재하지 않는 경로거나 폴더가 아닙니다. +migrate.clone_address_resolved_to_blocked_local_address=복제 주소는 암묵적으로 차단된 로컬 네트워크 주소로 확인되었습니다. +migrate.failed=마이그레이션 실패: %v + +mirror_from=의 미러 +forked_from=원본 프로젝트 : +copy_link=복사 +copy_link_success=복사됨! +copy_link_error=⌘-C 나 Ctrl-C를 눌러 복사 +copied=복사 완료 +unwatch=Unwatch +watch=Watch +unstar=Unstar +star=Star +fork=포크 + +no_desc=설명 없음 +quick_guide=퀵 가이드 +clone_this_repo=이 저장소 복제 +create_new_repo_command=커맨드 라인에서 새 저장소 만들기 +push_exist_repo=커맨드 라인에서 기존 저장소 푸시하기 +bare_message=이 저장소에는 아직 내용이 없습니다. + +files=파일 +branch=브렌치 +tree=트리 +filter_branch_and_tag=브랜치나 태그로 필터 +branches=브랜치 +tags=태그 +issues=이슈 +pulls=풀 리퀘스트 +labels=레이블 +milestones=마일스톤 +commits=커밋 +git_branches=브랜치 +releases=릴리즈 +file_raw=Raw +file_history=히스토리 +file_view_raw=원본 보기 +file_permalink=고유링크 +file_too_large=이 파일은 표시하기엔 너무 큽니다. +video_not_supported_in_browser=이 브라우저는 HTML5 비디오 태그를 지원하지 않습니다. + +branches.overview=개요 +branches.active_branches=활성 브랜치 +branches.stale_branches=오래된 브랜치 +branches.all=모든 브랜치 +branches.updated_by=%[2]s이 %[1]s를 업데이트 +branches.change_default_branch=기본 브랜치 변경 +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +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=파일을 편집 하기 전에 이 저장소를 포크 해야 합니다. +editor.delete_this_file=이 파일을 삭제 +editor.must_have_write_access=이 파일에 변경 사항을 제안하기 위해서는 쓰기 권한이 있어야 합니다. +editor.file_delete_success='%s' 파일이 성공적으로 삭제 되었습니다! +editor.name_your_file=파일 명... +editor.filename_help=디렉토리를 추가하려면, 디렉토리명을 입력하고 /를 누르십시오. 디렉토리를 제거하려면 필드의 시작 부분으로 이동하여 백 스페이스 키를 누릅니다. +editor.or=혹은 +editor.cancel_lower=취소 +editor.commit_changes=변경 내용을 커밋 +editor.add_tmpl='%s/' 추가 +editor.add=추가 '%s' +editor.update=업데이트 '%s' +editor.delete=삭제 '%s' +editor.commit_message_desc=선택적 확장 설명을 추가 +editor.commit_directly_to_this_branch=%s 브랜치에서 직접 커밋해주세요. +editor.create_new_branch=이 커밋에 대한 새로운 브랜치를 만들고 끌어오기 요청을 시작합니다. +editor.new_branch_name_desc=새로운 브랜치 명 +editor.cancel=취소 +editor.filename_cannot_be_empty=파일명이 빈칸입니다. +editor.branch_already_exists=이 저장소에 브랜치 '%s'가 이미 존재합니다. +editor.directory_is_a_file=항목 '%s'의 상위 경로는 이 저장소의 디렉토리가 아닌 파일입니다. +editor.file_is_a_symlink=파일 '%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 +editor.fail_to_delete_file=파일 '%s'를 삭제하는데 실패하였습니다. 오유: %v +editor.add_subdir=하위 디렉토리 추가... +editor.unable_to_upload_files=파일 '%s'를 업로드하는데 실패하였습니다. 에러: %v +editor.upload_files_to_dir=파일 업로드 '%s' + +commits.commit_history=커밋 기록 +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=레이블 없음 +issues.new.clear_labels=레이블 초기화 +issues.new.milestone=마일스톤 +issues.new.no_milestone=마일스톤 없음 +issues.new.clear_milestone=마일스톤 초기화 +issues.new.open_milestone=마일스톤 생성 +issues.new.closed_milestone=마일스톤 닫기 +issues.new.assignee=담당자 +issues.new.clear_assignee=담당자 초기화 +issues.new.no_assignee=담당자 없음 +issues.create=이슈 생성 +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 +issues.open_tab=%d 오픈 +issues.close_tab=%d 닫힘 +issues.filter_label=레이블 +issues.filter_label_no_select=선택한 레이블 없음 +issues.filter_milestone=마일스톤 +issues.filter_milestone_no_select=선택한 마일스톤 없음 +issues.filter_assignee=담당자 +issues.filter_assginee_no_select=선택된 담당자 없음 +issues.filter_type=유형 +issues.filter_type.all_issues=모든 이슈 +issues.filter_type.assigned_to_you=나에게 할당됨 +issues.filter_type.created_by_you=내가 생성함 +issues.filter_type.mentioning_you=나를 언급함 +issues.filter_sort=정렬 +issues.filter_sort.latest=최신 +issues.filter_sort.oldest=오래된 +issues.filter_sort.recentupdate=최근 업데이트 +issues.filter_sort.leastupdate=가장 최근에 업데이트 +issues.filter_sort.mostcomment=가장 많은 코멘트 +issues.filter_sort.leastcomment=가장 적은 코멘트 +issues.opened_by= %[3]s가 %[1]s을 오픈 +issues.opened_by_fake=%[2]s이 %[1]s를 오픈 +issues.previous=이전 +issues.next=다음 +issues.open_title=오픈 +issues.closed_title=닫힘 +issues.num_comments=%d개의 코멘트 +issues.commented_at=`코멘트됨, %s` +issues.delete_comment_confirm=이 댓글을 정말 삭제하시겠습니까? +issues.no_content=아직 콘텐츠가 없습니다. +issues.close_issue=닫기 +issues.close_comment_issue=클로즈 및 코멘트 +issues.reopen_issue=Reopen +issues.reopen_comment_issue=Reopen 및 코멘트 +issues.create_comment=코멘트 +issues.closed_at=`%[2]s가 Close` +issues.reopened_at=`%[2]s를 다시 열음` +issues.commit_ref_at=` 커밋 %[2]s에서 이 이슈 언급` +issues.poster=포스터 +issues.collaborator=협업자 +issues.owner=소유자 +issues.sign_in_require_desc=로그인하여 이 대화에 참여 +issues.edit=수정 +issues.cancel=취소 +issues.save=저장 +issues.label_title=레이블 이름 +issues.label_color=레이블 색상 +issues.label_count=레이블 %d개 +issues.label_open_issues=열린 이슈 %d개 +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"를 다운로드 하려면 클릭 하십시오 ' + +pulls.new=새 풀 리퀘스트 +pulls.compare_changes=변경 사항 비교 +pulls.compare_changes_desc=두개의 브랜치의 변경 사항을 비교하고 풀 리퀘스트를 만듭니다. +pulls.compare_base=베이스 +pulls.compare_compare=비교 +pulls.filter_branch=Filter Branch +pulls.no_results=결과 없음 +pulls.nothing_to_compare=Base 와 head 브랜치가 동일해서 비교할 게 없습니다. +pulls.nothing_merge_base=두 브런치의 리력이 완전히 다르므로 비교할수 없습니다. +pulls.has_pull_request=`이 두 타겟 사이엔 이미 풀 리퀘스트가 있습니다:%[2]s#%[3]d` +pulls.create=풀 리퀘스트 생성 +pulls.title_desc=%[2]s 에서 %[3]s 로 %[1]d commits 를 머지하려 합니다 + +pulls.merged_title_desc=%[2]s 에서 %[3]s 로 %[1]d commits 를 머지했습니다 %[4]s +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.create_merge_commit=합치기커밋 생성 +pulls.rebase_before_merging=병합 하기 전에 리베이스 +pulls.commit_description=커밋설명 +pulls.merge_pull_request=풀리퀘스트 머지 +pulls.open_unmerged_pull_exists=`같은 리파지토리에서 같은 머지 정보로 만들어진 풀리퀘스트 (#%d) 가 이미 오픈 상태이고 머지를 기다리고 있기 때문에 다시 열기 작업을 할 수 없습니다.` +pulls.delete_branch=브랜치 삭제 +pulls.delete_branch_has_new_commits=이 브랜치는 병합된 이후에 새로운 커밋들을 가지고 있으므로 삭제할 수 없습니다. + +milestones.new=새로운 마일스톤 +milestones.open_tab=%d개 열림 +milestones.close_tab=%d개 닫힘 +milestones.closed=닫힘 %s +milestones.no_due_date=기한 없음 +milestones.open=열기 +milestones.close=닫기 +milestones.new_subheader=마일스톤을 만들어 이슈를 관리하기 +milestones.create=마일스톤 생성 +milestones.title=타이틀 +milestones.desc=설명 +milestones.due_date=기한 (선택 사항) +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.filter_page=Filter 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 + +settings=설정 +settings.options=옵션 +settings.collaboration=공동 작업 +settings.collaboration.admin=관리자 +settings.collaboration.write=쓰기 +settings.collaboration.read=읽기 +settings.collaboration.undefined=미정의 +settings.branches=브랜치 +settings.branches_bare=당신은 빈 저장소에 대한 브런치를 관리할수 없습니다. 먼저 저장소에 내용을 푸쉬하십시오. +settings.default_branch=기본 브랜치 +settings.default_branch_desc=기본 브랜치는 코드 커밋, 풀 리퀘스트 및 온라인 편집을 위한 "기본" 브랜치로 간주됩니다. +settings.update=업데이트 +settings.update_default_branch_unsupported=서버의 Git 버전에서는 기본 브랜치 변경이 지원되지 않습니다. +settings.update_default_branch_success=이 레포지토리의 기본 브랜치가 성공적으로 설정되었습니다! +settings.protected_branches=보호된 브랜치 +settings.protected_branches_desc=보호된 브랜치는 force 푸시, 실수로 인한 코드 삭제를 방지하며 코드 커미터를 화이트리스트 합니다. +settings.choose_a_branch=브랜치를 선택하세요... +settings.branch_protection=브랜치 보호 +settings.branch_protection_desc=브랜치 %s 의 보호 설정을 선택하세요. +settings.protect_this_branch=이 브랜치를 보호하기 +settings.protect_this_branch_desc=Force 푸시와 삭제를 비활성화합니다. +settings.protect_require_pull_request=직접 push 를 하지 않고 Pull Request 를 필요로 하도록 합니다. +settings.protect_require_pull_request_desc=이 브랜치에 직접 푸시를 하는 것을 막고 싶다면 이 옵션을 활성화하세요. 커밋은 다른 비보호 브랜치에 푸시되어야 하며 이 브랜치에는 Pull Request 를 통해 병합될 것입니다. +settings.protect_whitelist_committers=이 브랜치에 푸시할 수 있는 유저 +settings.protect_whitelist_committers_desc=이 브랜치에 직접 푸시할 수 있는 허용 목록에 사람 또는 팀을 추가합니다. 허용 목록에 있는 사용자는 풀 리퀘스트 확인을 거치지 않습니다. +settings.protect_whitelist_users=이 브랜치에 푸시를 할 수 있는 유저 +settings.protect_whitelist_search_users=유저 검색 +settings.protect_whitelist_teams=이 브랜치에 푸시할 수 있는 팀의 멤버들 +settings.protect_whitelist_search_teams=팀 검색 +settings.update_protect_branch_success=브랜치의 보호 옵션이 성공적으로 업데이트되었습니다! +settings.hooks=Webhooks +settings.githooks=Git Hooks +settings.basic_settings=기본 설정 +settings.mirror_settings=미러 설정 +settings.sync_mirror=지금 동기화 +settings.mirror_sync_in_progress=미러 동기화 진행 중입니다. 약 1분 뒤에 페이지를 새로 고침 하세요. +settings.site=공식 사이트 +settings.update_settings=설정 저장 +settings.change_reponame_prompt=이 변경은 이 저장소와 연관된 링크들에 영향을 줄 것입니다. +settings.advanced_settings=고급 설정 +settings.wiki_desc=위키 시스템 활성화 +settings.use_internal_wiki=내장 위키 사용 +settings.allow_public_wiki_desc=저장소가 비공개되어 있으면 위키에 공개적으로 접속할 수 있도록 허용하기 +settings.use_external_wiki=외부 위키 사용하기 +settings.external_wiki_url=외부 위키 URL +settings.external_wiki_url_desc=탭을 클릭하면 URL로 리다이렉트됩니다. +settings.issues_desc=이슈 추적기를 사용하도록 설정 +settings.use_internal_issue_tracker=내장된 경량 이슈 트레커를 사용 +settings.allow_public_issues_desc=저장소가 비공개인 경우 이슈에 공개적으로 접속할 수 있도록 허용하기 +settings.use_external_issue_tracker=외부 이슈 트래커 사용하기 +settings.external_tracker_url=외부 이슈 트래커 URL +settings.external_tracker_url_desc=방문자는 탭을 클릭하면 URL로 리다이렉트 됩니다. +settings.tracker_url_format=외부 이슈 트래커 URL 형식 +settings.tracker_issue_style=외부 이슈 트래커 명명 스타일: +settings.tracker_issue_style.numeric=숫자 +settings.tracker_issue_style.alphanumeric=문자 숫자 +settings.tracker_url_format_desc={user} {repo} {index} 사용자 명, 저장소 명, 이슈 인덱스를 사용하여 표시자를 사용할 수 있습니다. +settings.pulls_desc=다른 저장소와 브랜치 간의 기여를 수용할 수 있도록 풀 리퀘스트 활성화 +settings.pulls.ignore_whitespace=공백 변경 무시 +settings.pulls.allow_rebase_merge=커밋을 머지하기 위해 리베이스 사용 허용 +settings.danger_zone=위험 설정 +settings.cannot_fork_to_same_owner=본인 소유의 저장소를 본인 명의로 포크할 수 없습니다. +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=새로운 공동작업자가 추가 되었습니다. +settings.delete_collaborator=제거 +settings.collaborator_deletion=공동작업자 삭제 +settings.collaborator_deletion_desc=이 사용자는 더 이상 이 저장소의 공동 작업을 위한 접근 권한을 가질 수 없게 됩니다. 계속 하시겠습니까? +settings.remove_collaborator_success=공동작업자가 삭제 되었습니다. +settings.search_user_placeholder=사용자 검색... +settings.org_not_allowed_to_be_collaborator=조직을 공동 작업자로 추가할 수 없습니다. +settings.hooks_desc=웹후크는 기본적인 HTTP POST 이벤트 트리거입니다. Gogs에서 무슨 일이 발생할 때마다, 지정한 대상 호스트에 알림을 보냅니다. 웹후크 안내서에서 자세히 알아보십시오. +settings.webhooks.add_new=새 웹훅 추가 +settings.webhooks.choose_a_type=유형 선택... +settings.add_webhook=Webhook 추가 +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.redelivery=재전송 +settings.webhook.redelivery_success=웹훅 작업 '%s'이(가) 다시 전달 큐에 추가되었습니다. 전달 상태는 이력에서 잠시 후 반영됩니다. +settings.webhook.request=요청 +settings.webhook.response=응답 +settings.webhook.headers=제목 +settings.webhook.payload=페이로드 +settings.webhook.body=본문 +settings.webhook.err_cannot_parse_payload_url=페이로드 URL을 구문 분석할 수 없습니다: %v +settings.webhook.url_resolved_to_blocked_local_address=로컬 네트워크 주소로 확인된 페이로드 URL이 암묵적으로 차단되었습니다. +settings.githooks_desc=Git Hooks는 Git 자체에서 제공되며, 아래 목록에서 지원되는 후크 파일을 편집하여 사용자 정의 작업을 수행 할 수 있습니다. +settings.githook_edit_desc=후크가 비활성인 경우 샘플 콘텐츠가 표시됩니다. 내용을 빈 값으로 두면 이 훅은 비활성화됩니다. +settings.githook_name=Hook 이름 +settings.githook_content=Hook 내용 +settings.update_githook=Hook 갱신 +settings.add_webhook_desc=Gogs는 발생한 이벤트와 관련하여 지정한 URL로 POST 요청을 보냅니다. 또한 후크를 트리거 할 때 어떤 데이터 형식을 사용할지 지정할 수 있습니다.(JSON, x-www-form-urlencoded, XML 등) 자세한 내용은 웹훅 안내서를 참조하십시오. +settings.payload_url=페이로드 URL +settings.content_type=컨텐츠 타입 +settings.secret=비밀 +settings.secret_desc=시크릿은 X-Gogs-Signature 헤더를 통해 페이로드의 SHA256 HMAC 16진수 다이제스트로 전송됩니다. +settings.slack_username=사용자 이름 +settings.slack_icon_url=아이콘 URL +settings.slack_color=색 +settings.event_desc=이 웹훅을 언제 실행하시겠습니까? +settings.event_push_only=단순한 푸시 이벤트입니다. +settings.event_send_everything=모든 것이 필요합니다. +settings.event_choose=필요한 것을 선택해주세요. +settings.event_create=생성 +settings.event_create_desc=브랜치 또는 태그를 생성합니다. +settings.event_delete=삭제 +settings.event_delete_desc=브랜치나 태그 삭제됨 +settings.event_fork=포크 +settings.event_fork_desc=저장소 포크됨 +settings.event_push=푸시 +settings.event_push_desc=깃 저장소로 푸시 +settings.event_issues=이슈 +settings.event_issues_desc=이슈가 생성됨, 닫힘, 다시 열림, 편집됨, 담당자 지정 또는 해제, 라벨 업데이트 또는 제거, 마일스톤 지정 또는 해제됨. +settings.event_pull_request=끌어오기 요청 +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=이슈 댓글 +settings.event_issue_comment_desc=이슈 댓글이 작성, 편집 또는 삭제되었습니다. +settings.event_release=릴리즈 +settings.event_release_desc=저장소에 릴리즈가 출시되었습니다. +settings.active=활성 +settings.active_helper=후크를 트리거하면 이벤트에 대한 세부 정보도 전달됩니다. +settings.add_hook_success=새로운 웹훅이 생성되었습니다. +settings.update_webhook=Webhook 갱신 +settings.update_hook_success=웹훅이 업데이트 되었습니다. +settings.delete_webhook=Webhook 삭제 +settings.recent_deliveries=최근의 Deliveries +settings.hook_type=훅 타입 +settings.add_slack_hook_desc=저장소에 슬랙연동을 추가 +settings.add_discord_hook_desc=Add Discord integration to your repository. +settings.add_dingtalk_hook_desc=Add Dingtalk integration to your repository. +settings.slack_token=토큰 +settings.slack_domain=도메인 +settings.slack_channel=채널 +settings.deploy_keys=배포 키 +settings.deploy_keys_helper=Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. +settings.add_deploy_key=배포 키 추가 +settings.deploy_key_desc=배포 키는 읽기 전용 입니다. 개인 계정 SSH 키와 동일하지 않습니다. +settings.no_deploy_keys=배포 키를 추가하지 않았습니다. +settings.title=제목 +settings.deploy_key_content=내용 +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.description_desc=저장소 설명입니다. 최대 512길이의 문자열이 가능합니다. +settings.description_length=사용 가능한 문자열 + +diff.browse_source=소스 검색 +diff.parent=부모 +diff.commit=커밋 +diff.data_not_available=아직 변경 데이터를 사용할 수 없습니다. +diff.show_diff_stats=변경상태 보기 +diff.show_split_view=분할 보기 +diff.show_unified_view=통합 보기 +diff.stats_desc=%d개의 변경된 파일%d개의 추가작업 그리고 %d개의 파일을 삭제 +diff.bin=BIN +diff.view_file=파일 보기 +diff.file_suppressed=파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다. +diff.too_many_files=이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다. + +release.releases=릴리즈 +release.new_release=새로운 릴리즈 +release.draft=초안 +release.prerelease=사전 릴리즈 +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=쓰기 +release.preview=미리보기 +release.loading=로딩중... +release.prerelease_desc=이것은 사전 릴리즈 +release.prerelease_helper=이 릴리즈는 제품-준비가 되어있지 않았음을 알려드립니다. +release.cancel=취소 +release.publish=릴리즈 게시 +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=다운로드 + +[org] +org_name_holder=조직 이름 +org_full_name_holder=조직 전체 이름 +org_name_helper=멋진 조직 이름은 짧고 기억하기 쉽습니다. +create_org=새로운 조직 +repo_updated=업데이트됨 +people=구성원 +invite_someone=다른 사람 초대 +teams=팀 +lower_members=회원 +lower_repositories=저장소 +create_new_team=새로운 팀 생성 +org_desc=설명 +team_name=팀 이름 +team_desc=설명 +team_name_helper=대화에서 이 팀을 언급할 때 이 이름을 사용합니다. +team_desc_helper=이 팀은 무엇입니까? +team_permission_desc=이 팀이 가진 권한이 무엇입니까? + +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. + +settings=설정 +settings.options=옵션 +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=공개 +members.public_helper=비공개로 전환 +members.private=비공개 +members.private_helper=공개로 전환 +members.member_role=회원 역할: +members.owner=소유자 +members.member=멤버 +members.remove=제거 +members.leave=나가기 +members.invite_desc=새로운 맴버를 %s에 추가: +members.invite_now=지금 초대하기 + +teams.join=가입 +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=소유자는 모든 저장소에 대한 모든 권한을 가지며 조직에 관리자 권한을 가지고 있습니다. +teams.members=팀 구성원 +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=이 팀의 관리자 권한을 부여: 회원은 이 팀의 저장소를 읽거나 푸시하거나 추가하고 공동 작업자를 추가할 수 있습니다. +teams.repositories=팀 저장소 +teams.search_repo_placeholder=저장소 검색... +teams.add_team_repository=팀 저장소 추가 +teams.remove_repo=삭제 +teams.add_nonexistent_repo=추가하려는 저장소를 존재하지 않습니다. 먼저 생성해주세요. + +[admin] +dashboard=대시보드 +users=사용자 +organizations=조직 +repositories=저장소 +authentication=인증 +config=설정 +notices=시스템 공지 +monitor=모니터링 +first_page=처음 +last_page=마지막 +total=총: %d + +dashboard.build_info=빌드정보 +dashboard.app_ver=애플리케이션 버전 +dashboard.git_version=Git 버전 +dashboard.go_version=Go 버전 +dashboard.build_time=태그 만들기 +dashboard.build_commit=빌드 커밋 +dashboard.statistic=통계 +dashboard.operations=작업 +dashboard.system_status=시스템 모니터 상태 +dashboard.statistic_info=Gogs 데이터베이스에는 %d명의 사용자, %d 조직, %d 공개 키, %d 저장소, %d 주시, %d 별, %d 활동, %d 접근, %d 이슈, %d 댓글, %d 소셜 계정, %d 팔로우, %d 미러, %d 릴리즈, %d 로그인 소스, %d 웹훅, %d 마일스톤, %d 라벨, %d 훅 태스크, %d 팀, %d 업데이트 태스크, %d 첨부파일이 있습니다. +dashboard.operation_name=작업 명 +dashboard.operation_switch=스위치 +dashboard.select_operation_to_run=Please select operation to run +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-Gogs키는 손실됩니다) +dashboard.resync_all_sshkeys_success=모든 공개키들이 성공적으로 재작성되었습니다. +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=깃 파일들을 잃어버린 모든 저장소를 다시 초기화합니다. +dashboard.reinit_missing_repos_success=깃 파일을 잃은 모든 저장소를 다시 초기화 하는데 성공하였습니다. + +dashboard.server_uptime=서버를 켠 시간 +dashboard.current_goroutine=현재 Go루틴 +dashboard.current_memory_usage=현재 메모리 사용율 +dashboard.total_memory_allocated=전체 할당 메모리 +dashboard.memory_obtained=메모리 확보 +dashboard.pointer_lookup_times=포인터 조회 시간 +dashboard.memory_allocate_times=메모리 할당 시간 +dashboard.memory_free_times=메모리 가용 시간 +dashboard.current_heap_usage=현재 힙 사용현황 +dashboard.heap_memory_obtained=힙 메모리 확보 +dashboard.heap_memory_idle=힙 메모리 유휴 +dashboard.heap_memory_in_use=힙 메모리 사용중 +dashboard.heap_memory_released=힙 메모리 풀림 +dashboard.heap_objects=힙 객체 +dashboard.bootstrap_stack_usage=부트스트랩 스택 사용현황 +dashboard.stack_memory_obtained=스택 메모리 확보 +dashboard.mspan_structures_usage=MSpan 구조 사용현황 +dashboard.mspan_structures_obtained=MSpan 구조 확보 +dashboard.mcache_structures_usage=MCache 구조 사용현황 +dashboard.mcache_structures_obtained=MCache 구조 확보 +dashboard.profiling_bucket_hash_table_obtained=버켓 해시 테이블 확보 프로파일링 +dashboard.gc_metadata_obtained=가비지 콜렉션 메타 데이터 확보 +dashboard.other_system_allocation_obtained=기타 시스템 할당 확보 +dashboard.next_gc_recycle=다음 가비지 콜렉션 순환 +dashboard.last_gc_time=마지막 가비지 콜렉션 시간 +dashboard.total_gc_time=모든 가비지 콜렉션 중지 +dashboard.total_gc_pause=모든 가비지 콜렉션 중지 +dashboard.last_gc_pause=마지막 가비지 콜렉션 중지 +dashboard.gc_times=가비지 콜렉션 시간 + +users.user_manage_panel=사용자 관리 패널 +users.new_account=새 계정 생성 +users.name=이름 +users.activated=활성화됨 +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.stars=Stars +repos.issues=이슈 +repos.size=크기 + +auths.auth_sources=인증 소스 +auths.new=새로운 소스를 추가 +auths.name=이름 +auths.type=유형 +auths.enabled=활성화됨 +auths.default=기본값 +auths.updated=업데이트됨 +auths.auth_type=인증 유형 +auths.auth_name=인증 이름 +auths.security_protocol=보안 프로토콜 +auths.domain=도메인 +auths.host=호스트 +auths.port=포트 +auths.bind_dn=DN 연결 +auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s +auths.bind_password=비밀번호 연결 +auths.bind_password_helper=경고: 이 암호는 일반 텍스트로 저장됩니다. 높은 권한의 계정을 사용하지 마십시오. +auths.user_base=사용자 검색 기준 +auths.user_dn=사용자 DN +auths.attribute_username=유저 명 속성 +auths.attribute_username_placeholder=사용자 이름에 대한 로그인 폼 필드 값을 사용하려면 비워 둡니다. +auths.attribute_name=첫번째 이름 속성 +auths.attribute_surname=성씨 속성 +auths.attribute_mail=이메일 속성 +auths.verify_group_membership=그룹 구성원 자격을 확인 +auths.group_search_base_dn=그룹 설정 Base DN +auths.group_filter=그룹 필터 +auths.group_attribute_contain_user_list=Group Attribute Containing List of Users +auths.user_attribute_listed_in_group=User Attribute Listed in Group +auths.attributes_in_bind=DN 컨텍스트에서 속성을 가져와 연결합니다. +auths.filter=사용자 필터 +auths.admin_filter=관리자 필터 +auths.ms_ad_sa=Ms Ad SA +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.edit=인증 설정 편집 +auths.activated=이 인증정보는 활성화되어있습니다. +auths.default_auth=This authentication is default login source +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=인증이 성공적으로 삭제 되었습니다! +auths.login_source_exist=로그인 소스 '%s'는 이미 존재합니다. +auths.github_api_endpoint=API 끝점 + +config.not_set=(설정되지 않음) +config.server_config=서버 설정 +config.brand_name=브랜드 이름 +config.run_user=데몬 실행 계정 +config.run_mode=실행 모드 +config.server.external_url=외부 URL +config.server.domain=도메인 +config.server.protocol=프로토콜 +config.server.http_addr=HTTP 주소 +config.server.http_port=HTTP 포트 +config.server.cert_file=인증서 파일 +config.server.key_file=키 파일 +config.server.tls_min_version=최소 TLS 버전 +config.server.unix_socket_permission=Unix 소켓 권한 +config.server.local_root_url=로컬 최상위 URL +config.server.offline_mode=오프라인 모드 +config.server.disable_router_log=라우터 로그 비활성화 +config.server.enable_gzip=Gzip 활성화 +config.server.app_data_path=애플리케이션 데이터 경로 +config.server.load_assets_from_disk=디스크에서 요소 불러오기 +config.server.landing_url=랜딩 URL + +config.ssh_config=SSH 설정 +config.ssh.enabled=활성화됨 +config.ssh.domain=노출된 도메인 +config.ssh.port=노출 포트 +config.ssh.root_path=최상위 경로 +config.ssh.keygen_path=키 생성 경로 +config.ssh.key_test_path=키 테스트 경로 +config.ssh.minimum_key_size_check=최소 키 크기 검사 +config.ssh.minimum_key_sizes=최소 키 사이즈 +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=빌트인 서버 시작 +config.ssh.listen_host=수신 대기 호스트 +config.ssh.listen_port=수신 대기 포트 +config.ssh.server_ciphers=서버 암호화 +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=저장소 설정 +config.repo.root_path=최상위 경로 +config.repo.script_type=스크립트 유형 +config.repo.ansi_chatset=ANSI 문자열 +config.repo.force_private=비공개 강제 +config.repo.max_creation_limit=최대 생성 제한 +config.repo.preferred_licenses=선호 라이선스 +config.repo.disable_http_git=HTTP Git 비활성화 +config.repo.enable_local_path_migration=로컬 경로 마이그레이션 활성화 +config.repo.enable_raw_file_render_mode=raw 파일 렌더링 모드 활성화 +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=편집기 줄 바꿈 확장 +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=업로드 활성화됨 +config.repo.upload.temp_path=임시 경로 업로드 +config.repo.upload.allowed_types=허용되는 유형 업로드 +config.repo.upload.file_max_size=업로드 파일 크기 제한 +config.repo.upload.max_files=업로드 파일 제한 + +config.db_config=데이터베이스 설정 +config.db.type=유형 +config.db.host=호스트 +config.db.name=이름 +config.db.schema=스키마 +config.db.schema_helper=("postgres" 전용) +config.db.user=사용자 +config.db.ssl_mode=SSL 모드 +config.db.ssl_mode_helper=("postgres" 전용) +config.db.path=경로 +config.db.path_helper={"sqlite3" 전용) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=보안 설정 +config.security.login_remember_days=로그인 기억 날짜 +config.security.cookie_remember_name=쿠키 기억하기 +config.security.cookie_username=사용자 이름 쿠키 +config.security.cookie_secure=보안 쿠키 활성화 +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=로그인 상태 쿠키 활성화 +config.security.login_status_cookie_name=로그인 상태 쿠키 +config.security.local_network_allowlist=Local network allowlist + +config.email_config=이메일 설정 +config.email.enabled=활성화됨 +config.email.subject_prefix=제목 접두어 +config.email.host=호스트 +config.email.from=보내는 사람 +config.email.user=사용자 +config.email.disable_helo=HELO 비활성화 +config.email.helo_hostname=HELO 호스트 이름 +config.email.skip_verify=인증서 검증 건너뛰기 +config.email.use_certificate=커스텀 인증서 사용하기 +config.email.cert_file=인증서 파일 +config.email.key_file=키 파일 +config.email.use_plain_text=평문 텍스트 사용 +config.email.add_plain_text_alt=평문 텍스트 대체 추가 +config.email.send_test_mail=테스트 이메일 보내기 +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent='%s'로 테스트 이메일을 보냈습니다. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=이메일 인증 필요 +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=등록 비활성화 +config.auth.enable_registration_captcha=등록시 CAPTCHA 사용 +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=이메일 알림 활성화 + +config.session_config=세션 설정 +config.session.provider=공급자 +config.session.provider_config=공급자 설정 +config.session.cookie_name=쿠키 +config.session.https_only=HTTPS만 +config.session.gc_interval=GC 간격 +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF 쿠키 + +config.cache_config=캐시 설정 +config.cache.adapter=Adapter +config.cache.interval=GC 간격 +config.cache.host=호스트 + +config.http_config=HTTP 설정 +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=첨부 파일 설정 +config.attachment.enabled=활성화됨 +config.attachment.path=경로 +config.attachment.allowed_types=허용 유형 +config.attachment.max_size=크기 제한 +config.attachment.max_files=파일 제한 + +config.release_config=릴리즈 설정 +config.release.attachment.enabled=첨부 파일 활성화됨 +config.release.attachment.allowed_types=허용되는 첨부 파일 유형 +config.release.attachment.max_size=첨부 파일 크기 제한 +config.release.attachment.max_files=첨부 파일 제한 + +config.picture_config=이미지 설정 +config.picture.avatar_upload_path=사용자 아바타 업로드 경로 +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Gravatar 비활성화 +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=미러 설정 +config.mirror.default_interval=기본 간격 + +config.webhook_config=웹훅 설정 +config.webhook.types=유형 +config.webhook.deliver_timeout=배달 제한 시간 +config.webhook.skip_tls_verify=TLS 검증 건너뛰기 + +config.git_config=깃 설정 +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC 인수 +config.git.migrate_timeout=마이그레이션 제한 시간 +config.git.mirror_timeout=미러 페치 제한 시간 +config.git.clone_timeout=클론 제한 시간 +config.git.pull_timeout=풀 제한 시간 +config.git.gc_timeout=GC 제한 시간 + +config.lfs_config=LFS 구성 +config.lfs.storage=저장소 +config.lfs.objects_path=Objects path + +config.log_config=로그 설정 +config.log_file_root_path=로그 파일 최상위 경로 +config.log_mode=모드 +config.log_options=설정 + +monitor.cron=Cron 작업 +monitor.name=이름 +monitor.schedule=스케줄 +monitor.next=다음 시간 +monitor.previous=이전 시간 +monitor.execute_times=실행 시간 +monitor.process=실행중인 프로세스들 +monitor.desc=설명 +monitor.start=시작 시간 +monitor.execute_time=실행 시간 + +notices.system_notice_list=시스템 공지 +notices.view_detail_header=공지 세부사항 보기 +notices.actions=동작 +notices.select_all=모두 선택 +notices.deselect_all=모두 선택 해제 +notices.inverse_selection=선택 반전 +notices.delete_selected=선택 삭제 +notices.delete_all=모든 알림을 삭제 +notices.type=유형 +notices.type_1=저장소 +notices.desc=설명 +notices.op=일. +notices.delete_success=시스템 알림들이 성공적으로 삭제되었습니다. + +[action] +create_repo=저장소를 만들었습니다. %s +rename_repo=%[1]s에서에서 %[3]s으로 저장소 이름을 바꾸었습니다. +commit_repo=%[4]s에서 %[3]s으로 푸시함 +compare_commits=이 %d개의 커밋에 대한 비교 보기 +transfer_repo=%s에서 %s로 저장소가 전송되었습니다. +create_issue=`열린 이슈 %s #%[2]s` +close_issue=`닫힌 이슈 %s #%[2]s` +reopen_issue=`다시 열린 이슈 %s #%[2]s` +comment_issue=`이슈에 댓글이 달렸습니다. %s #%[2]s` +create_pull_request=`만들어진 끌어오기 요청 %s #%[2]s` +close_pull_request=`닫힌 끌어오기 요청 %s #%[2]s` +reopen_pull_request=`다시 열린 끌어오기 요청 %s #%[2]s` +merge_pull_request=`병합된 끌어오기 요청 %s #%[2]s` +create_branch=created new branch %[3]s at %[4]s +delete_branch=deleted branch %[2]s at %[3]s +push_tag=태그 %[2]s%[3]s로 푸시함 +delete_tag=%[3]s에서 code>%[2]s
태그 삭제됨 +fork_repo=forked a repository to %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror + +[tool] +ago=전 +from_now=지금부터 +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 +raw_seconds=초 +raw_minutes=분 +raw_hours=시간 + +[dropzone] +default_message=여기에 파일을 끌어 놓거나 클릭하여 업로드하세요. +invalid_input_type=이 종류의 파일은 업로드할 수 없습니다. +file_too_big=파일 크기({{filesize}} MB)가 최대 크기({{maxFilesize}} MB)를 초과합니다. +remove_file=파일 제거 + diff --git a/conf/locale/locale_lv-LV.ini b/conf/locale/locale_lv-LV.ini index c6dd4b53a32..98d1cf9d7a5 100644 --- a/conf/locale/locale_lv-LV.ini +++ b/conf/locale/locale_lv-LV.ini @@ -9,7 +9,6 @@ sign_out=Izrakstīties sign_up=Reģistrēties register=Reģistrēties website=Mājas lapa -version=Versija page=Lapa template=Sagatave language=Valoda @@ -44,23 +43,27 @@ issues=Problēmas cancel=Atcelt +[status] +page_not_found=Page Not Found +internal_server_error=Internal Server Error + [install] install=Instalācija title=Instalācijas soļi pirmo reizi palaižot docker_helper=Ja Gogs tiek lietots zem Docker, izlasiet uzmanīgi vadlīnijas, pirms ko maināt šajā lapā! -requite_db_desc=Gogs nepieciešams MySQL, PostgreSQL, SQLite3 vai TiDB. +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title=Datu bāzes iestatījumi db_type=Datu bāzes veids host=Resursdators user=Lietotājs password=Parole db_name=Datu bāzes nosaukums +db_schema=Schema db_helper=Nepieciešams izmantot MySQL INNODB dzini ar rakstzīmju kopu utf8_general_ci. ssl_mode=SSL režīms path=Ceļš -sqlite_helper=SQLite3 vai TiDB datu bāzēs faila ceļš.
Izmantojiet absolūto ceļu, startējot kā servisu. -err_empty_db_path=Nepieciešams norādīt SQLite3 vai TiDB datu bāzes atrašanās vietu. -err_invalid_tidb_name=TiDB datu bāzes nosaukums nevar saturēt simbolus "." un "-". +sqlite_helper=Faila ceļs uz SQLite3 datu bāzi.
Norādiet absolūtu ceļu, kad laižat kā servisu. +err_empty_db_path=SQLite3 datu bāzes ceļš nevar būt tukšs. 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. @@ -75,12 +78,17 @@ 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. +use_builtin_ssh_server=Izmantot iebūvēto SSH serveri +use_builtin_ssh_server_popup=Startēt iebūvēto SSH serveri Git darbībām, lai atšķirtu no sistēmas SSH servisa. 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. log_root_path=Žurnalizēšanas direktorija log_root_path_helper=Direktorija, kurā tiks glabāti žurnāla faili. +enable_console_mode=Iespējot konsoles režīmu +enable_console_mode_popup=Papildus faila režīmam, papildus rakstīt žurnāla ierakstus konsolē. +default_branch=Default Branch optional_title=Neobligātie iestatījumi email_title=E-pasta pakalpojuma iestatījumi @@ -116,7 +124,10 @@ sqlite3_not_available=Jūsu versija neatbalsta SQLite3, lūdzu lejupielādējiet invalid_db_setting=Datu bāzes iestatījums nav pareizs: %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 +smtp_host_missing_port=SMTP adresē nav norādīts ports. +invalid_smtp_from=SMTP sūtītāja lauks ir nekorekts: %v save_config_failed=Neizdevās saglabāt konfigurāciju: %v +init_failed=Failed to initialize application: %v invalid_admin_setting=Nekorekts admin konta iestatījums: %v install_success=Laipni lūdzam! Mēs priecājamies, ka Jūs izvēlaties Gogs, patīkamu lietošanu! invalid_log_root_path=Norādītā žurnalizēšanas direktorija ir kļūdaina: %v @@ -137,6 +148,7 @@ issues.in_your_repos=Jūsu repozitorijos [explore] repos=Repozitoriji users=Lietotāji +organizations=Organizācijas search=Meklēt [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Jau ir konts? Pieraksties tagad! social_register_hepler_msg=Jau ir konts? Sasaisti tagad! 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. +auth_source=Autentificēšanas avots +local=Local remember_me=Atcerēties mani forgot_password=Aizmirsu paroli forget_password=Aizmirsi paroli? @@ -156,7 +170,6 @@ prohibit_login_desc=Ar Jūsu kontu nav atļauts pieteikties, sazinoties ar lapas 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. 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. 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. @@ -164,6 +177,14 @@ reset_password_helper=Nospiediet šeit, lai atjaunotu paroli password_too_short=Paroles garums nedrīkst būt mazāks par 6. non_local_account=Tikai lokālie konti var nomainīt savu paroli Gogs. +login_two_factor=Divu faktoru autentifikācija +login_two_factor_passcode=Autentifikācijas kods +login_two_factor_enter_recovery_code=Ievadiet divu faktoru atjaunošanas kodu +login_two_factor_recovery=Divu faktoru atjaunošana +login_two_factor_recovery_code=Atjaunošanas kods +login_two_factor_enter_passcode=Ievadiet divu faktoru kodu +login_two_factor_invalid_recovery_code=Atjaunošanas kods jau ir izmantots vai nav pareizs. + [mail] activate_account=Lūdzu, aktivizējiet savu kontu activate_email=Apstipriniet savu e-pasta adresi @@ -199,6 +220,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.` +alpha_dash_dot_slash_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus, domuzīmes (-_), slīpsvītru vai punktu.` 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ā.` @@ -215,6 +237,7 @@ 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. +auth_source_mismatch=Izvēlētais autentificēšanas avots nav saistīts ar lietotāju. 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. @@ -242,19 +265,18 @@ 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_not_allowed=User name or pattern %q is not allowed. [settings] profile=Profils password=Parole avatar=Profila attēls ssh_keys=SSH atslēgas -social=Sociālie konti -applications=Lietotnes +security=Drošība +repos=Repozitoriji orgs=Organizācijas +applications=Lietotnes delete=Dzēst kontu -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. @@ -295,6 +317,7 @@ 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_success=E-pasta adrese ir veiksmīgi izdzēsta! +email_deletion_primary=Cannot delete primary email address. add_new_email=Pievienot jaunu e-pasta adresi 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. @@ -320,14 +343,36 @@ 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ā -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. -unbind=Atsaistīt -unbind_success=Sociālais konts tika atsaistīts. +two_factor=Divu faktoru autentifikācija +two_factor_status=Statuss: +two_factor_on=Ieslēgts +two_factor_off=Izslēgts +two_factor_enable=Iespējot +two_factor_disable=Atspējot +two_factor_view_recovery_codes=View and save your recovery codes in a safe place. You can use them as passcode if you lose access to your authentication application. +two_factor_http=HTTP/HTTPS darbībām vairs nav iespējams izmantot tikai lietotāja vārdu un paroli. Izveidojiet un izmantojiet Personīgo piekļuves talonu kā pilnvaru, piemēram, %[3]s. +two_factor_enable_title=Iespējot divu faktoru autentifikāciju +two_factor_scan_qr=Please use your authentication application to scan the image: +two_factor_or_enter_secret=Vai ievadiet noslēpumu: +two_factor_then_enter_passcode=Pēc tam ievadiet kodu: +two_factor_verify=Pārbaudīt +two_factor_invalid_passcode=Ievadītais piekļuves kods nav derīgs. Lūdzu mēģiniet vēlreiz! +two_factor_reused_passcode=Ievadītais piekļuves kods jau ir izmantots. Lūdzu mēģiniet citu! +two_factor_enable_error=Divu faktoru autentifikācijas iespējošana neizdevās: %v +two_factor_enable_success=Two-factor authentication has enabled for your account successfully! +two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes +two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, please keep these codes in a safe place. +two_factor_regenerate_recovery_codes=Regenerate Recovery Codes +two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v +two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully! +two_factor_disable_title=Atspējot divu faktoru autentifikāciju +two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue? +two_factor_disable_success=Divu faktoru autentificēšana ir atspējota! 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 Gogs API. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=Pašlaik visiem taloniem ir pilna piekļuve Jūsu kontam. token_name=Talona nosaukums generate_token=Ģenerēt talonu @@ -336,6 +381,16 @@ 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. +token_name_exists=Token with same name already exists. + +orgs.none=Jūs neesat nevienas organizācijas dalībnieks. +orgs.leave_title=Pamest organizāciju +orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue? + +repos.leave=Pamest +repos.leave_title=Pamest repozitoriju +repos.leave_desc=Tiks zaudēta piekļuve repozitorijam, kad būsiet to pametis. Vai patiešām vēlaties turpināt? +repos.leave_success=Repozitorijs '%s' veiksmīgi pamests! delete_account=Dzēst savu kontu delete_prompt=Šī darbība pilnībā izdzēsīs Jūsu kontu, kā arī tā ir NEATGRIEZENISKA! @@ -348,7 +403,9 @@ owner=Īpašnieks repo_name=Repozitorija nosaukums repo_name_helper=Labi repzotoriju nosaukumi ir īsi, tādi kurus viegli atcerēties un unikāli. visibility=Redzamība +unlisted=Unlisted visiblity_helper=Šis repozitorijs ir privāts +unlisted_helper=This repository is Unlisted visiblity_helper_forced=Lapas administrators ir noteicis, ka visiem repozitorijiem ir jābūt privātiem 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! @@ -364,7 +421,7 @@ readme=LasiMani readme_helper=Izvēlieties faila LasiMani sagatavi auto_init=Inicializēt šo repozitoriju ar izvēlētajiem failiem un sagatavi create_repo=Izveidot repozitoriju -default_branch=Noklusējuma atzars +default_branch=Noklusētais 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) @@ -374,24 +431,26 @@ mirror_last_synced=Pēdējo reizi sinhronizēts watchers=Novērotāji stargazers=Zvaigžņdevēji forks=Atdalītie repozitoriji +repo_description_helper=Repozitorija apraksts. Maksimālais garums 512 rakstzīmes. +repo_description_length=Pieejamās rakstzīmes 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.name_pattern_not_allowed=Repozitorija nosaukums '%s' nav atļauts. +form.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=Nepieciešama autorizācija migrate_type=Migrācijas veids migrate_type_helper=Šis repozitorijs būs spogulis migrate_repo=Migrēt repozitoriju migrate.clone_address=Klonēšanas adrese -migrate.clone_address_desc=Tas var būt HTTP/HTTPS/GIT URL vai ceļš uz lokālā servera. +migrate.clone_address_desc=Tas var būt HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path. migrate.permission_denied=Jums nav tiesību importēt lokālu repozitoriju. migrate.invalid_local_path=Nekorents lokālais ceļš, tas neeksistē vai nav direktorijs. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Migrācija neizdevās: %v mirror_from=spogulis no forked_from=atdalīts no -fork_from_self=Nav iespējams atdalīt repozitoriju, kuram esat īpašnieks! copy_link=Kopēt copy_link_success=Nokopēts! copy_link_error=Nospiediet ⌘-C vai Ctrl-C, lai nokopētu @@ -407,9 +466,9 @@ quick_guide=Īsa pamācība clone_this_repo=Klonēt šo repozitoriju create_new_repo_command=Izveidot jaunu repozitoriju komandrindā push_exist_repo=Nosūtīt izmaiņas no komandrindas eksistējošam repozitorijam -repo_is_empty=Šis repozitorijs ir tukšs, apskatiet atkal vēlāk! +bare_message=This repository does not have any content yet. -code=Kods +files=Faili branch=Atzars tree=Koks filter_branch_and_tag=Filtrēt atzarus vai tagus @@ -420,12 +479,23 @@ pulls=Izmaiņu pieprasījumi labels=Etiķetes milestones=Atskaites punkti commits=Revīzijas +git_branches=Atzari releases=Laidieni file_raw=Neapstrādāts file_history=Vēsture file_view_raw=Rādīt neapstrādātu file_permalink=Patstāvīgā saite file_too_large=Šis fails ir par lielu, lai to parādītu +video_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 video. + +branches.overview=Pārskats +branches.active_branches=Aktīvie atzari +branches.stale_branches=Pamests atzars +branches.all=Visi atzari +branches.updated_by=%[2]s atjaunoja %[1]s +branches.change_default_branch=Mainīt noklusēto atzaru +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Jauns fails editor.upload_file=Augšupielādēt failu @@ -455,16 +525,19 @@ editor.cancel=Atcelt editor.filename_cannot_be_empty=Nav ievadīts faila nosaukums. editor.branch_already_exists=Atzars '%s' šajā repozitorijā jau eksistē. editor.directory_is_a_file=Ieraksts '%s' vecāka ceļā ir fails nevis direktorija šajā repozitorijā. +editor.file_is_a_symlink=Fails '%s" ir norāde, kuru nav iespējams labot no tīmekļa redaktora. editor.filename_is_a_directory=Faila nosaukums '%s' sakrīt ar direktorijas nosaukumu šajā repozitorijā. editor.file_editing_no_longer_exists=Fails '%s', ko labojat, vairs neeksistē repozitorijā. editor.file_changed_while_editing=Faila saturs ir mainījies kopš brīža, kad sākāt to labot. Nospiediet šeit, lai redzētu kas ir mainījies vai nospiediet atkārtoti pabeigt revīziju, lai pārrakstītu 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.fail_to_delete_file=Neizdevās dzēst 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' +commits.commit_history=Revīziju vēsture commits.commits=Revīzijas commits.search=Meklēt revīzijas commits.find=Meklēt @@ -562,6 +635,7 @@ pulls.compare_compare=salīdzināmais pulls.filter_branch=Filtrēt atzarus pulls.no_results=Nekas netika atrasts. pulls.nothing_to_compare=Nav ko salīdzināt, jo bāzes un salīdzināmie atzari ir vienādi. +pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history. pulls.has_pull_request=`Jau eksistē izmaiņu pieprasījums starp šiem diviem atzariem: %[2]s#%[3]d` pulls.create=Izveidot izmaiņu pieprasījumu pulls.title_desc=vēlas sapludināt %[1]d revīzijas no %[2]s uz %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=Notiek konfliktu pārbaude, mirkli uzgaidiet un atjaunojiet la pulls.can_auto_merge_desc=Šo izmaiņu pieprasījumu var automātiski saplūdināt. pulls.cannot_auto_merge_desc=Šis izmaiņu pieprasījums nevar tikt automātiski saplūdināts konfliktu dēļ. pulls.cannot_auto_merge_helper=Lūdzu sapludiniet manuāli, lai atrisinātu konfliktus. +pulls.create_merge_commit=Create a merge commit +pulls.rebase_before_merging=Rebase before merging +pulls.commit_description=Commit Description pulls.merge_pull_request=Izmaiņu pieprasījuma sapludināšana pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) no šī repozitorija ar tādu pašu sapludināšanas informāciju un gaida sapludināšanu.` +pulls.delete_branch=Dzēst atzaru +pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence. milestones.new=Jauns atskaites punkts milestones.open_tab=%d atvērti @@ -629,6 +708,29 @@ settings.collaboration.admin=Administrators settings.collaboration.write=Rakstīšanas settings.collaboration.read=Skatīšanās settings.collaboration.undefined=Nedefinētas +settings.branches=Atzari +settings.branches_bare=You cannot manage branches for bare repository. Please push some content first. +settings.default_branch=Noklusētais atzars +settings.default_branch_desc=Noklusētais atzars tiek uzskatīts par pamata atzaru koda revīzijām, izmaiņu pieprasījumiem un tiešsaistes rediģēšanai. +settings.update=Atjaunot +settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server. +settings.update_default_branch_success=Default branch of this repository has been updated successfully! +settings.protected_branches=Aizsargātie atzari +settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers. +settings.choose_a_branch=Izvēlēties atzarus... +settings.branch_protection=Atzaru aizsargāšana +settings.branch_protection_desc=Please choose protect options for branch %s. +settings.protect_this_branch=Aizsargāt šo atzaru +settings.protect_this_branch_desc=Disable force pushes and prevent from deletion. +settings.protect_require_pull_request=Require pull request instead direct pushing +settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request. +settings.protect_whitelist_committers=Whitelist who can push to this branch +settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check. +settings.protect_whitelist_users=Lietotāji, kas var nosūtīt izmaiņas uz šo atzaru +settings.protect_whitelist_search_users=Meklēt lietotajus +settings.protect_whitelist_teams=Teams for which members of them can push to this branch +settings.protect_whitelist_search_teams=Meklēt komandas +settings.update_protect_branch_success=Protect options for this branch has been updated successfully! settings.hooks=Tīmekļa āķi settings.githooks=Git āķi settings.basic_settings=Pamatiestatījumi @@ -641,19 +743,26 @@ settings.change_reponame_prompt=Šī izmaiņa ietekmēs saites, kas ir saistīta settings.advanced_settings=Papildu iestatījumi settings.wiki_desc=Iespējot vikivietnes settings.use_internal_wiki=Izmantot iebūvēto vikivietni +settings.allow_public_wiki_desc=Atļaut publisko piekļuvi vikivietnei, ja repozitorijs ir privāts settings.use_external_wiki=Izmantot ārējo vikivietni settings.external_wiki_url=Ārējās Vikivietnes adrese 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.allow_public_issues_desc=Atļaut publisko piekļuvi problēmām, ja repozitorijs ir privāts settings.use_external_issue_tracker=Izmantot ārējo problēmu sekotāju +settings.external_tracker_url=Ārējā problēmu sekotāja URL +settings.external_tracker_url_desc=Visitors will be redirected to URL when they click on the tab. 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 settings.tracker_issue_style.alphanumeric=Burti un cipari settings.tracker_url_format_desc=Jūs varat izmantot {user}{repo}{index} lietotājvārdam, repozitorija nosaukumam un problēmas identifikātoram. -settings.pulls_desc=Iespējot izmaiņu pieprasījumus lai saņemtu publiskus ieguldījumus +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Ignorēt atstarpju izmaiņas +settings.pulls.allow_rebase_merge=Allow use rebase to merge commits settings.danger_zone=Bīstamā zona +settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner. 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. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Šim lietotājam pēc dzēšanas vairs nebū settings.remove_collaborator_success=Līdzstrādnieks tika noņemts. 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.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=Pievienot tīmekļa āķi 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_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.redelivery=Redelivery +settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. settings.webhook.request=Pieprasījums settings.webhook.response=Atbilde settings.webhook.headers=Galvenes settings.webhook.payload=Derīgā krava settings.webhook.body=Saturs +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Git āķus apstrādā pats Git. Jūs varat labot atbalsīto āku failus sarakstā zemāk, lai veiktu pielāgotas darbības. settings.githook_edit_desc=Ja āķis nav aktīvs, tiks attēlots piemērs kā to izmantot. Atstājot āķa saturu tukšu, tas tiks atspējots. settings.githook_name=Āķa nosaukums @@ -711,6 +825,7 @@ settings.add_webhook_desc=Uz norādīto URL tiks nosūtīts POST pi settings.payload_url=Vērtuma URL settings.content_type=Satura tips settings.secret=Noslēpums +settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. settings.slack_username=Lietotājvārds settings.slack_icon_url=Ikonas URL settings.slack_color=Krāsa @@ -720,10 +835,20 @@ settings.event_send_everything=Vēlos saņemt visu. settings.event_choose=Atzīmēt, ko vēlos saņemt. settings.event_create=Izveidot settings.event_create_desc=Atzara vai taga izveidošana -settings.event_pull_request=Izmaiņu pieprasījums -settings.event_pull_request_desc=Atvērts, aizvērts, atkāroti atvērts, labots, piešķirts vai noņemts izmaiņu pieprasījums, vai mainīta etiķete, vai veikta sinhronizācija. +settings.event_delete=Dzēst +settings.event_delete_desc=Atzars vai tags izdzēsts +settings.event_fork=Atdalīts +settings.event_fork_desc=Repozitorijs atdalīts settings.event_push=Izmaiņu nosūtīšana settings.event_push_desc=Git izmaiņu nosūtīšana uz repozitoriju +settings.event_issues=Problēmas +settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned. +settings.event_pull_request=Izmaiņu pieprasījums +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=Problēmas komentārs +settings.event_issue_comment_desc=Issue comment created, edited, or deleted. +settings.event_release=Laidiens +settings.event_release_desc=Laidiens publicēts repozitorijā. settings.active=Aktīvs settings.active_helper=Tiks nosūtīti notikuma dati, kad nostrādās šis āķis. settings.add_hook_success=Jauns tīmekļa āķis tika veiksmīgi pievienots. @@ -733,10 +858,13 @@ settings.delete_webhook=Dzēst tīmekļa āķi settings.recent_deliveries=Pēdējās piegādes settings.hook_type=Āķa veids settings.add_slack_hook_desc=PIevienot Slack integrāciju Jūsu repozitorijā. +settings.add_discord_hook_desc=Add Discord integration to your repository. +settings.add_dingtalk_hook_desc=Add Dingtalk integration to your repository. settings.slack_token=Talons settings.slack_domain=Domēns settings.slack_channel=Kanāls settings.deploy_keys=Izvietot atslēgas +settings.deploy_keys_helper=Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. settings.add_deploy_key=Pievienot izvietošanas atslēgu settings.deploy_key_desc=Izvietošanas atslēgai ir tikai lasīšanas piekļuve. Tā nav tā pati kā Jūsu personīgā konta SSH atslēga. settings.no_deploy_keys=Nav pievienota neviena izvietošanas atslēga. @@ -748,6 +876,8 @@ 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.description_desc=Description of repository. Maximum 512 characters length. +settings.description_length=Available characters diff.browse_source=Pārlūkot izejas kodu diff.parent=vecāks @@ -766,7 +896,6 @@ release.releases=Laidieni release.new_release=Jauns laidiens release.draft=Melnraksts release.prerelease=Pirmsizlaides versija -release.stable=Stabila release.edit=labot release.ahead=%d revīzijas atzarā %s kopš šī laidiena release.source_code=Izejas kods @@ -813,8 +942,8 @@ 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? -form.name_reserved=Organizācijas nosaukums '%s' ir rezervēts. -form.name_pattern_not_allowed=Organizācijas nosaukums '%s' nav atļauts. +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=Iestatījumi settings.options=Opcijas @@ -886,12 +1015,19 @@ first_page=Pirmā last_page=Pēdējā total=Kopā: %d +dashboard.build_info=Build Information +dashboard.app_ver=Application version +dashboard.git_version=Git versija +dashboard.go_version=Go versija +dashboard.build_time=Build time +dashboard.build_commit=Build commit dashboard.statistic=Statistika dashboard.operations=Darbības dashboard.system_status=Sistēmas uzraudzības statuss dashboard.statistic_info=Gogs datu bāze satur %d lietotājus, %d organizācijas, %d publiskās atslēgas, %d repozitorijus, %d vērošanas, %d atzīmētas zvaigznītes, %d darbības, %d piekļuves, %d problēmas, %d komentārus, %d sociālos kontus, %d sekošanas, %d spoguļošanas, %d izlaides, %d login sources, %d tīmekļa āķus, %d starpposmus, %d etiķetes, %d āķu uzdevumus, %d komandas, %d labotus uzdevumus, %d pielikumus. dashboard.operation_name=Darbības nosaukums dashboard.operation_switch=Pārslēgt +dashboard.select_operation_to_run=Please select operation to run 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. @@ -905,8 +1041,8 @@ 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.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=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. @@ -981,12 +1117,14 @@ 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_sources=Authentication Sources auths.new=Pievienot jaunu avotu auths.name=Nosaukums auths.type=Veids auths.enabled=Iespējota +auths.default=Default auths.updated=Atjaunināta auths.auth_type=Autentifikācijas tips auths.auth_name=Autentifikācijas nosaukums @@ -995,6 +1133,7 @@ auths.domain=Domēns auths.host=Resursdators auths.port=Ports auths.bind_dn=Saistīšanas DN +auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s auths.bind_password=Saistīšanas parole auths.bind_password_helper=Brīdinājums: Šī parole tiks saglabāta nešifrētā veidā. Neizmantojiet kontu ar augstām privilēģijām. auths.user_base=Lietotāja pamatnosacījumi @@ -1004,6 +1143,11 @@ auths.attribute_username_placeholder=Atstājiet tukšu, lai izmantotu lietotājv auths.attribute_name=Vārda atribūts auths.attribute_surname=Uzvārda atribūts auths.attribute_mail=E-pasta atribūts +auths.verify_group_membership=Pārbaudīt grupas piederību +auths.group_search_base_dn=Grupas meklēšanas pamata DN +auths.group_filter=Group Filter +auths.group_attribute_contain_user_list=Group Attribute Containing List of Users +auths.user_attribute_listed_in_group=User Attribute Listed in Group auths.attributes_in_bind=Nolasīt atribūtus no saistīšanas DN konteksta auths.filter=Lietotāju filts auths.admin_filter=Administratoru filtrs @@ -1017,9 +1161,9 @@ auths.enable_tls=Iespējot TLS šifrēšanu auths.skip_tls_verify=Izlaist TLS verifikāciju auths.pam_service_name=PAM servisa nosaukums auths.enable_auto_register=Iespējot automātisko reģistrāciju -auths.tips=Padomi auths.edit=Labot autentifikācijas iestatījumus auths.activated=Autentifikācija ir aktivizēta +auths.default_auth=This authentication is default login source auths.new_success=Jauna autentifikācija '%s' tika veiksmīgi pievienota. auths.update_success=Autentifikācijas iestatījumi tika veiksmīgi saglabāti. auths.update=Mainīt autentifikācijas iestatījumus @@ -1028,107 +1172,189 @@ 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.deletion_success=Autentifikācija tika veiksmīgi izdzēsta! +auths.login_source_exist=Pieteikšanās avots '%s' jau eksistē. +auths.github_api_endpoint=API Endpoint +config.not_set=(nav noteikts) config.server_config=Servera konfigurācija -config.app_name=Lietotnes nosaukums -config.app_ver=Lietotnes versija -config.app_url=Lietotnes URL -config.domain=Domēns -config.offline_mode=Bezsaistes režīms -config.disable_router_log=Atspējot maršrutētāja žurnalizēšanu +config.brand_name=Brand name config.run_user=Izpildes lietotājs config.run_mode=Izpildes režīms -config.repo_root_path=Repozitoriju glabāšanas vieta -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 -config.reverse_auth_user=Reversā lietotāja autentifikācija +config.server.external_url=External URL +config.server.domain=Domēns +config.server.protocol=Protokols +config.server.http_addr=HTTP adrese +config.server.http_port=HTTP ports +config.server.cert_file=Sertifikāta fails +config.server.key_file=Privātais kriptogrāfijas atslēgas fails +config.server.tls_min_version=Minimālā TLS versija +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Iespējot Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL config.ssh_config=SSH konfigurācija -config.ssh_enabled=Iespējots -config.ssh_start_builtin_server=Startēt iebūvēto serveri -config.ssh_domain=Domēns -config.ssh_port=Ports -config.ssh_listen_port=Klausīšanās ports -config.ssh_root_path=Saknes ceļš -config.ssh_key_test_path=Atslēgu pārbaudes ceļš -config.ssh_keygen_path=Keygen ('ssh-keygen') ceļš -config.ssh_minimum_key_size_check=Minimālā atslēgas lieluma pārbaude -config.ssh_minimum_key_sizes=Minimālais atslēgas lielums +config.ssh.enabled=Iespējots +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Repozitorija konfigurācija +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=Datu bāzes konfigurācija -config.db_type=Veids -config.db_host=Resursdators -config.db_name=Nosaukums -config.db_user=Lietotājs -config.db_ssl_mode=SSL režīms -config.db_ssl_mode_helper=(tikai PostgreSQL datu bāzei) -config.db_path=Ceļš -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.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.db.type=Tips +config.db.host=Host +config.db.name=Datubāzes nosaukums +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=Datubāzes lietotājs +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=E-pasta iestatījumi +config.email.enabled=Iespējots +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=Sūtītājs +config.email.user=Lietotājs +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Nosūtīt pārbaudes e-pastu +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -config.webhook_config=Tīkla āķu konfigurācija -config.queue_length=Rindas garums -config.deliver_timeout=Piegādes noildze -config.skip_tls_verify=Izlaist TLS pārbaudi - -config.mailer_config=Sūtītāja konfigurācija -config.mailer_enabled=Iespējots -config.mailer_disable_helo=Atspējot HELO -config.mailer_name=Nosaukums -config.mailer_host=Resursdators -config.mailer_user=Lietotājs -config.send_test_mail=Nosūtīt pārbaudes e-pastu -config.test_mail_failed=Neizdevās nosūtīt pārbaudes e-pasta vēstuli uz '%s': %v -config.test_mail_sent=Pārbaudes e-pasta vēstule tika nosūtīta uz '%s'. - -config.oauth_config=OAuth konfigurācija -config.oauth_enabled=Iespējota +config.session_config=Sesijas konfigurācja +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=Tikai HTTPS +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Kešatmiņas konfigurācija -config.cache_adapter=Kešatmiņas adapteris -config.cache_interval=Kešatmiņas intervāls -config.cache_conn=Kešatmiņas pieslēguma parametri - -config.session_config=Sesijas konfigurācja -config.session_provider=Sesijas nodrošinātājs -config.provider_config=Pakalpojumu sniedzēja konfigurācija -config.cookie_name=Sīkdatnes nosaukums -config.enable_set_cookie=Ļaut izmantot sīkdatnes -config.gc_interval_time=GC laika intervāls -config.session_life_time=Sesijas ilgums -config.https_only=Tikai HTTPS -config.cookie_life_time=Sīkdatņu glabāšanas ilgums +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP konfigurācija +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Iespējots +config.attachment.path=Path +config.attachment.allowed_types=Atļautie tipi +config.attachment.max_size=Maksimālais izmērs +config.attachment.max_files=Maksimālais failu skaits + +config.release_config=Release configuration +config.release.attachment.enabled=Pielikums iespējots +config.release.attachment.allowed_types=Atļautie pielikuma tipi +config.release.attachment.max_size=Pielikuma maksimālais izmērs +config.release.attachment.max_files=Maksimālais pielikuma failu skaits config.picture_config=Attēlu konfigurācija -config.picture_service=Lokāli attēli -config.disable_gravatar=Atspējot Gravatar -config.enable_federated_avatar=Iespējot apvienotās profila bildes +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Noklusētais intervāls + +config.webhook_config=Tīkla āķu konfigurācija +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify config.git_config=Git konfigurācija -config.git_disable_diff_highlight=Atspējot salīdzināšanas sintakses iekrāsošanu -config.git_max_diff_lines=Maksimālais salīdzināmo rindu skaits vienam failam -config.git_max_diff_line_characters=Maksimālais salīdzināmo simbolu skaits vienai rindai -config.git_max_diff_files=Maksimālais salīdzināmo failu skaits, ko attēlot -config.git_gc_args=GC argumenti -config.git_migrate_timeout=Migrācijas noilgums -config.git_mirror_timeout=Spoguļa atjaunošanas noilgums -config.git_clone_timeout=Klonēšanas darbības noilgums -config.git_pull_timeout=Izmaiņu saņemšanas darbības noilgums -config.git_gc_timeout=GC darbības noilgums +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path config.log_config=Žurnalizēšanas konfigurācija -config.log_mode=Žurnalizēšanas veids +config.log_file_root_path=Žurnalizēšanas failu glabāšanas vieta +config.log_mode=Režīms +config.log_options=Opcijas monitor.cron=Cron uzdevumi monitor.name=Nosaukums @@ -1159,17 +1385,24 @@ notices.delete_success=Sistēmas paziņojumi tika veiksmīgi izdzēstas. create_repo=izveidoja repozitoriju %s rename_repo=pārsauca repozitoriju no %[1]s uz %[3]s commit_repo=veica izmaiņu nosūtīšanu atzaram %[3]s repozitorijā %[4]s +compare_commits=Salīdzināt šīs %d revīzijas +transfer_repo=mainīja repozitorija %s īpašnieku uz %s create_issue=`reģistrēja problēmu %s#%[2]s` close_issue=`slēdza problēmu %s#%[2]s` reopen_issue=`atkārtoti atvēra problēmu %s#%[2]s` +comment_issue=`pievienoja komentāru problēmai %s#%[2]s` create_pull_request=`izveidoja izmaiņu pieprasījumu %s#%[2]s` close_pull_request=`aizvēra izmaiņu pieprasījumu %s#%[2]s` reopen_pull_request=`atkārtoti atvēra izmaiņu pieprasījumu %s#%[2]s` -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 +create_branch=izveidoja jaunu atzaru %[3]s repozitorijā %[4]s +delete_branch=izdzēsa atzaru %[2]s repozitorijā %[3]s push_tag=pievienoja tagu %[2]s repozitorijam %[3]s -compare_commits=Salīdzināt šīs %d revīzijas +delete_tag=izdzēsa tagu %[2]s repozitorijā %[3]s +fork_repo=atdalīja repozitoriju uz %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror [tool] ago=atpakaļ @@ -1191,6 +1424,7 @@ months=%d mēneši %s years=%d gadi %s raw_seconds=sekundes raw_minutes=minūtes +raw_hours=hours [dropzone] default_message=Ievelciet failus šeit vai noklikšķiniet, lai augšupielādētu. diff --git a/conf/locale/locale_mn-MN.ini b/conf/locale/locale_mn-MN.ini new file mode 100644 index 00000000000..5defd608003 --- /dev/null +++ b/conf/locale/locale_mn-MN.ini @@ -0,0 +1,1434 @@ +app_desc=Хамгийн хялбар GIT үйлчилгээ + +home=Эхлэл +dashboard=Удирдлага +explore=Бүгдийг харах +help=Тусламж +sign_in=Нэвтрэх +sign_out=Гарах +sign_up=Бүртгүүлэх +register=Бүртгүүлэх +website=Вэбсайт +page=Хуудас +template=Загвар +language=Хэл +create_new=Шинээр нэмэх... +user_profile_and_more=Хэрэглэгчийн профайл болон бусад +signed_in_as=Нэвтэрсэн хэрэглэгч + +username=Нэвтрэх нэр +email=Имэйл +password=Нууц үг +re_type=Дахин бичих +captcha=Батлах тэмдэгт + +repository=Репо +organization=Байгууллага +mirror=Хуулбарлах +new_repo=Шинэ Репо +new_migrate=Шинэ +new_mirror=Шинэ хуулбар +new_fork=Шинэ Репо Салаалах +new_org=Шинэ Байгууллага +manage_org=Байгууллага удирдах +admin_panel=Админ удирдлага +account_settings=Дансны тохиргоо +settings=Тохиргоо +your_profile=Таны профайл +your_settings=Таны тохиргоо + +activities=Үйлдлүүд +pull_requests=Татаж авах хүсэлтүүд +issues=Асуудал + +cancel=Болих + +[status] +page_not_found=Хуудас олдсонгүй +internal_server_error=Сервертэй холбогдоход алдаа гарлаа. + +[install] +install=Суулгах +title=Install Steps For First-time Run +docker_helper=If you're running Gogs inside Docker, please read Guidelines carefully before you change anything in this page! +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). +db_title=Database Settings +db_type=Database Type +host=Host +user=User +password=Password +db_name=Database Name +db_schema=Schema +db_helper=Please use INNODB engine with utf8_general_ci charset for MySQL. +ssl_mode=SSL Mode +path=Path +sqlite_helper=The file path of SQLite3 database.
Please use absolute path when you start as service. +err_empty_db_path=SQLite3 database path cannot be empty. +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 +app_name=Application Name +app_name_helper=Put your organization name here huge and loud! +repo_path=Repository Root Path +repo_path_helper=All Git remote repositories will be saved to this directory. +run_user=Run User +run_user_helper=The user must have access to Repository Root Path and run Gogs. +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. +use_builtin_ssh_server=Use Builtin SSH Server +use_builtin_ssh_server_popup=Start builtin SSH server for Git operations to distinguish from system SSH daemon. +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. +log_root_path=Log Path +log_root_path_helper=Directory to write log files to. +enable_console_mode=Enable Console Mode +enable_console_mode_popup=In addition to file mode, also print logs to console. +default_branch=Default Branch + +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. +mailer_user=Sender Email +mailer_password=Sender Password +register_confirm=Enable Register Confirmation +mail_notify=Enable Mail Notification +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. +disable_gravatar=Disable Gravatar Service +disable_gravatar_popup=Disable Gravatar and custom sources, all avatars are uploaded by users or default. +federated_avatar_lookup=Enable Federated Avatars Lookup +federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Disable Self-registration +disable_registration_popup=Disable user self-registration, only admin can create accounts. +enable_captcha=Enable Captcha +enable_captcha_popup=Require validate 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 don't need to create an admin account right now. The first user in the users table will be automatically granted admin access. +admin_title=Admin Account Settings +admin_name=Username +admin_password=Password +confirm_password=Confirm Password +admin_email=Admin Email +install_gogs=Install Gogs +test_git_failed=Failed to 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 +invalid_repo_path=Repository root path is invalid: %v +run_user_not_match=Run user isn't the current user: %s -> %s +smtp_host_missing_port=SMTP Host port missing from address. +invalid_smtp_from=SMTP From field is invalid: %v +save_config_failed=Failed to save configuration: %v +init_failed=Failed to initialize application: %v +invalid_admin_setting=Admin account setting is invalid: %v +install_success=Welcome! We're glad that you chose Gogs, have fun and take care. +invalid_log_root_path=Log root path is invalid: %v + +[home] +uname_holder=Нэвтрэх нэр эсвэл имэйл +password_holder=Нууц үг +switch_dashboard_context=Удирдлагын сайт руу шилжих +my_repos=Миний Репонууд +show_more_repos=Бусад Репонуудыг харах... +collaborative_repos=Дундын Репонууд +my_orgs=Миний Байгууллага +my_mirrors=Миний Хуулбарууд +view_home=Харах %s + +issues.in_your_repos=Таны Репо-д + +[explore] +repos=Репонууд +users=Хэрэглэгчид +organizations=Байгууллагууд +search=Хайлт + +[auth] +create_new_account=Шинэ данс үүсгэх +register_hepler_msg=Та хэрэглэгчийн эрхээ үүсгэсэн бол Нэвтрэх хуудас руу шилжих! +social_register_hepler_msg=Данс үүсгэсэн бол? Нэвтрэх хуудас руу шилжих! +disable_register_prompt=Уучлаарай, бүртгэл идэвхгүй байна. Сайтын админтай холбоо барина уу. +disable_register_mail=Уучлаарай, имэйлийн үйлчилгээ идэвхгүй байна. Сайтын админтай холбоо барина уу. +auth_source=Баталгаажуулалтын эх сурвалж +local=Локал +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=Баталгаажуулах имэйлээ дахин илгээх бол энд дарна уу +send_reset_mail=Нууц үгээ шинэчлэх имэйлийг (дахин) илгээх бол энд дарна уу +reset_password=Нууц үгээ сэргээх +invalid_code=Уучлаарай, таны баталгаажуулах кодын хугацаа дууссан эсвэл хүчин төгөлдөр бус байна. +reset_password_helper=Нууц үгээ шинэчлэх бол энд дарна уу +password_too_short=Нууц үгийн урт нь дор хаяж 6 тэмдэгт байх ёстой. +non_local_account=Гадаад хэрэглэгчид нууц үгээ солих боломжгүй. + +login_two_factor=2 давхар баталгаажуулалт +login_two_factor_passcode=Баталгаажуулалтын нууц код +login_two_factor_enter_recovery_code=2 давхар баталгаажуулалтын дахин сэргээх код оруулах +login_two_factor_recovery=2 давхар баталгаажуулалтын код сэргээх +login_two_factor_recovery_code=Сэргээх код +login_two_factor_enter_passcode=2 давхар баталгаажуулалтын нууц үгээ оруулна уу +login_two_factor_invalid_recovery_code=Сэргээх код өмнө нь ашиглагдсан эсвэл хүчингүй байна. + +[mail] +activate_account=Бүртгэлээ идэвхжүүлнэ үү +activate_email=Имэйл хаягаа баталгаажуулна уу +reset_password=Нууц үгээ дахин сэргээх +register_success=Бүртгэл амжилттай боллоо, тавтай морилно уу +register_notify=Манай системд тавтай морилно уу + +[modal] +yes=Тийм +no=Үгүй +modify=Засах + +[form] +UserName=Нэвтрэн нэр +RepoName=Репо нэр +Email=Имэйл хаяг +Password=Нууц үг +Retype=Дахин оруулна уу +SSHTitle=SSH түлхүүрийн нэр +HttpsUrl=HTTPS хаяг +PayloadUrl=Payload хаяг +TeamName=Багийн нэр +AuthName=Зөвшөөрлийн нэр +AdminEmail=Админы имэйл + +NewBranchName=Шинэ салаа нэр +CommitSummary=Коммит мэдээлэл +CommitMessage=Коммит мессеж +CommitChoice=Коммит сонголт +TreeName=Файлын зам +Content=Агуулга + +require_error=` талбарын оруулна уу.` +alpha_dash_error=` үсэг, тоо эсвэл зураас (-_) агуулсан тэмдэгтүүд оруулна уу.` +alpha_dash_dot_error=` үсэг, тоо, зураас (-_) эсвэл цэг агуулсан тэмдэгтүүд оруулна уу.` +alpha_dash_dot_slash_error=` үсэг, тоо, зураас (-_), цэг эсвэл налуу зураас агуулсан тэмдэгтүүд оруулна уу.` +size_error=` талбар нь %s тэмдэгтийн уртай байна.` +min_size_error=` талбар нь хамгийн багадаа %s тэмдэгтийн уртай байна.` +max_size_error=` талбар нь хамгийн ихдээ %s тэмдэгтийн уртай байна.` +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=Хэрэглэгчийн нэр эсвэл нууц үг буруу байна. +auth_source_mismatch=Сонгосон танил нэвтрэлтийн эх сурвалж нь хэрэглэгчтэй холбоогүй болно. +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=Сервер таны SSH түлхүүрийг баталгаажуулах боломжгүй байна, гэхдээ энэ түлхүүр хүчин төгөлдөр байх ёстой. Та дахин нягтална уу. +auth_failed=Баталгаажуулалт амжилтгүй боллоо: %v + +still_own_repo=Таны данс аль нэг Репо эзэмшиж байгаа тул та тэдгээрийг устгах эсвэл шилжүүлэх хэрэгтэй. +still_has_org=Таны данс аль нэг байгууллагын гишүүнчлэлтэй байгаа тул та эхлээд байгууллагаас гарах эсвэл гишүүнчлэлээсээ устгах хэрэгтэй. +org_still_own_repo=Энэ байгууллага нь аль нэг Репо эзэмшиж байгаа тул та эхлээд устгах эсвэл шилжүүлэх ёстой. + +target_branch_not_exist=Сонгосон салаа олдохгүй байна. + +[user] +change_avatar=Өөрийн зургаа солих +join_on=Бүртгүүлсэн +repositories=Репонууд +activity=Олон нийтийн үйл ажиллагаа +followers=Дагагчид +starred=Тэмдэглэсэн Репонууд +following=Дагасан +follow=Дагах +unfollow=Дагахаа болих + +form.name_not_allowed=%q нэвтрэх нэр эсвэл загвар зөвшөөрөгдөхгүй байна. + +[settings] +profile=Профайл +password=Нууц үг +avatar=Зураг +ssh_keys=SSH түлхүүрүүд +security=Нууцлал +repos=Репонууд +orgs=Байгууллагууд +applications=Аппликэшнүүл +delete=Данс устгах + +public_profile=Профайл +profile_desc=Таны имэйл хаяг олон нийтэд нээлттэй тул данстай холбоотой аливаа мэдэгдэл, сайтаар дамжуулан вэбэд суурилсан аливаа үйл ажиллагаанд ашиглагдах болно. +password_username_disabled=Гадаад хэрэглэгчид Нэвтрэх нэрээ өөрчлөх боломжгүй. +full_name=Бүтэн нэр +website=Вэбсайт +location=Байршил +update_profile=Профайл өөрчлөх +update_profile_success=Таны профайл амжилттай өөрчлөгдлөө. +change_username=Нэвтрэх нэр өөрчлөгдсөн +change_username_prompt=Энэ өөрчлөлт нь таны данстай холбоотой мэдээллүүд дээр нөлөөлнө. +continue=Үргэлжлүүлэх +cancel=Болих + +lookup_avatar_by_mail=Имэйл хайгаар зураг хайх +federated_avatar_lookup=Нээлттэй зураг хайх +enable_custom_avatar=Өөрийн зурагаа оруулах +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=Имэйл хаягуудыг удирдах +email_desc=Таны үндсэн имэйл хаягийг мэдэгдэл болон бусад үйл ажиллагаанд ашиглах болно. +primary=Үндсэн +primary_email=Үндсэн болгох +delete_email=Устгах +email_deletion=Имэйл устгах +email_deletion_desc=Энэ имэйл хаягийг устгаснаар холбогдох мэдээллийг таны данснаас устгах болно. Та үргэлжлүүлэхийг хүсч байна уу? +email_deletion_success=Имэйлийг амжилттай устгалаа! +email_deletion_primary=Cannot delete primary email address. +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 түлхүүр үүсгэхтэй холбоотой 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 түлхүүрийг амжилттай устгалаа! +add_on=Нэмэгдсэн +last_used=Сүүлд ашигласан +no_activity=Ашиглалтын мэдээлэл бүртгэгдээгүй байна. +key_state_desc=Энэ түлхүүрийг сүүлийн 7 хоногт ашиглагдсан байна +token_state_desc=Энэхүү токен сүүлийн 7 хоногт ашиглагдсан байна + +two_factor=2 давхар танилт +two_factor_status=Төлөв: +two_factor_on=Идэвхитэй +two_factor_off=Идэвхигүй +two_factor_enable=Идэвхижүүлэх +two_factor_disable=Идэвхигүй болгох +two_factor_view_recovery_codes=Та өөрийн сэргээх кодуудаа найдвартай хадгалах хэрэгтэй. Хэрэв та системд нэвтрэх эрхээ алдсан бол тэдгээрийг нууц код болгон ашиглаж болно. +two_factor_http=HTTP/HTTPS үйлдлийн хувьд та энгийн хэрэглэгчийн нэр нууц үг ашиглах боломжгүй. Та Хувийн хандах токен үүсгэж ашиглана уу. %[3]s. +two_factor_enable_title=2 давхар танилт идэвхжүүлэх +two_factor_scan_qr=Өөрийн танилтын аппликэшнээ ашиглаж зургийг скан хийнэ үү: +two_factor_or_enter_secret=Эсвэл нууц үгээ оруулна уу: +two_factor_then_enter_passcode=Дараа нь нууц кодоо оруулна уу: +two_factor_verify=Баталгаажуулах +two_factor_invalid_passcode=Таны оруулсан нууц код буруу байна, дахин оролдоно уу! +two_factor_reused_passcode=Таны оруулсан нууц код аль хэдийн ашиглагдсан байна, өөр код оруулна уу! +two_factor_enable_error=Хоёр давхар баталгаажуулалтыг идэвхжүүлж чадсангүй: %v +two_factor_enable_success=Хоёр давхар баталгаажуулалтыг амжилттай идэвхижүүллээ! +two_factor_recovery_codes_title=Хоёр давхар баталгаажуулалтын сэргээх кодууд +two_factor_recovery_codes_desc=Таныг баталгаажуулах програмд нэвтрэх эрхээ алдах үед сэргээх кодыг ашигладаг. Сэргээх код бүрийг зөвхөн нэг удаа ашиглаж болно, эдгээр кодыг найдвартай хадгална уу. +two_factor_regenerate_recovery_codes=Сэргээх кодуудыг дахин үүсгэх +two_factor_regenerate_recovery_codes_error=Сэргээх кодуудыг дахин үүсгэхэд алдаа гарлаа: %v +two_factor_regenerate_recovery_codes_success=Сэргээх кодуудыг амжилттай үүсгэлээ! +two_factor_disable_title=Хоёр давхар баталгаажуулалтыг идэвхигүй болгох +two_factor_disable_desc=Хоёр давхар баталгаажуулалтыг идэвхгүй болгосны дараа таны дансны аюулгүй байдлын түвшин буурах болно. Та үргэлжлүүлэхийг хүсч байна уу? +two_factor_disable_success=Хоёр давхар баталгаажуулалтыг амжилттай идэвхигүй болголоо! + +manage_access_token=Хувийн хандалтын токенуудыг удирдах +generate_new_token=Шинэ токен үүсгэх +tokens_desc=Таны үүсгэсэн токенуудыг Gogs API-д нэвтрэхэд ашиглаж болно. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. +new_token_desc=Токен бүр таны дансанд бүрэн нэвтрэх боломжтой болно. +token_name=Токены нэр +generate_token=Токены үүсгэх +generate_token_succees=Таны хандалтын токен амжилттай үүслээ! Дараа дахин харах боломжгүй тул яг одоо хуулж аваарай! +delete_token=Устгах +access_token_deletion=Хувийн хандалтын токен устгах +access_token_deletion_desc=Энэхүү хувийн хандалтын токеныг устгаснаар програмын холбогдох бүх хандалтыг устгах болно. Та үргэлжлүүлэхийг хүсч байна уу? +delete_token_success=Хувийн хандалтын токеныг амжилттай устгалаа! Програмаа шинэчлэхийг бүү мартаарай. +token_name_exists=Токентой ижил нэр бүртгэгдсэн байна. + +orgs.none=Та ямар ч байгууллагын гишүүн биш байна. +orgs.leave_title=Байгууллагаас гарах +orgs.leave_desc=Байгууллагаас гарсны дараа та бүх Репо, багуудад хандах эрхээ алдах болно. Та үргэлжлүүлэхийг хүсч байна уу? + +repos.leave=Гарах +repos.leave_title=Репо-с гарах +repos.leave_desc=Та гарсны дараа Репо руу нэвтрэх эрхээ алдах болно. Та үргэлжлүүлэхийг хүсч байна уу? +repos.leave_success=Та '%s' Репо-с амжилттай гарлаа! + +delete_account=Бүртгэлээ устгах +delete_prompt=Энэ ажиллагаа нь таны акаунтыг бүр мөсөн устгах бөгөөд ЭРГЭН СЭРГЭЭХ боломжгүй болно! +confirm_delete_account=Устгалтыг баталгаажуулна уу +delete_account_title=Данс устгах +delete_account_desc=Энэ акаунтыг бүр мөсөн устгах гэж байна, та үргэлжлүүлэхийг хүсч байна уу? + +[repo] +owner=Эзэмшигч +repo_name=Репо нэр +repo_name_helper=Сайн Репо нэр нь ихэвчлэн богино, мартагдашгүй, өвөрмөц түлхүүр үгсээс бүрддэг. +visibility=Харагдах байдал +unlisted=Unlisted +visiblity_helper=Энэ Репо нь Хувийн +unlisted_helper=This repository is Unlisted +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_helper=Зааврын загварыг сонгоно уу +auto_init=Энэ Репо-н сонгосон файл, загвараар эхлүүлнэ үү +create_repo=Репо үүсгэх +default_branch=Анхны салаа хувилбар +mirror_prune=Цэвэрлэх +mirror_prune_desc=Алсаас хянадаг нөөцүүдийг устгах +mirror_interval=Хуулбарлах интервал (цаг) +mirror_address=Хуулбарлах хаяг +mirror_address_desc=Хэрэглэгчийн шаардлагатай мэдээллийг хаягт оруулна уу. +mirror_last_synced=Сүүлд синк хийсэн +watchers=Үзэх жагсаалтад нэмсэн хэрэглэгчид +stargazers=Онцлох жагсаалтад нэмсэн хэрэглэгчид +forks=Салаанууд +repo_description_helper=Репо тодорхойлолт. Ихдээ 512 тэмдэгтийн урттай. +repo_description_length=Боломжтой тэмдэгтүүд + +form.reach_limit_of_creation=Эзэмшигч нь Репо үүсгэх %d дээд хязгаарт хүрсэн байна. +form.name_not_allowed=%q Репо нэр эсвэл загвар зөвшөөрөгдөхгүй байна. + +need_auth=Зөвшөөрөл хэрэгтэй +migrate_type=Шилжүүлэх төрөл +migrate_type_helper=Энэ Репо нь толин хуулбар болно. +migrate_repo=Репо шилжүүлэх +migrate.clone_address=Хуулбарлах хаяг +migrate.clone_address_desc=HTTP/HTTPS/GIT хаяг байж болно. +migrate.clone_address_desc_import_local=Та мөн Репо-г дотоод серверийн замаар шилжүүлэхийг зөвшөөрдөг. +migrate.permission_denied=Орон дотоод Репо-г импортлох боломжгүй байна. +migrate.invalid_local_path=Дотоод зам буруу байна, энэ хаяг дээр үүсээгүй эсвэл дирекдор биш байна. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. +migrate.failed=Шилжүүлэлт амжилтгүй боллоо: %v + +mirror_from=-ын хуулбар +forked_from=-с салаалсан +copy_link=Хуулах +copy_link_success=Хуулсан! +copy_link_error=⌘-C эсвэл Ctrl-C дарж хуулна +copied=Амжилттай хууллаа +unwatch=Үзэх жагсаалтаас хасах +watch=Үзэх жагсаалтад нэмэх +unstar=Онцлох жагсаалтаас хасах +star=Онцлох жагсаалтад нэмэх +fork=Салаа + +no_desc=Тайлбар байхгүй +quick_guide=Товч гарын авлага +clone_this_repo=Энэ Репо-г хуулах +create_new_repo_command=Шинэ Репо command line-р үүсгэх +push_exist_repo=Өмнө үүссэн Репо руу command line-р хуулах +bare_message=Энэ Репо-д одоогоор ямар нэг мэдээлэл алга байна. + +files=Файлууд +branch=Салаа +tree=Мод +filter_branch_and_tag=Салаа болон тагаар хайх +branches=Салаанууд +tags=Тагууд +issues=Асуудлууд +pulls=Хуулах хүсэлтүүд +labels=Шошгууд +milestones=Чухал үйл явдлууд +commits=Коммитууд +git_branches=Салаанууд +releases=Хувилбарууд +file_raw=Анхны өгөгдөл +file_history=Түүх +file_view_raw=Анхны өгөгдөл харах +file_permalink=Байнгын холболт +file_too_large=Энэ файлыг харуулахад хэтэрхий том байна +video_not_supported_in_browser=Таны хөтөч HTML5 видео тагыг дэмждэггүй. + +branches.overview=Товч мэдээлэл +branches.active_branches=Идэвхтэй салаанууд +branches.stale_branches=Хуучирсан салаанууд +branches.all=Бүх салаанууд +branches.updated_by=Шинэчлэгдсэн %[1]s by %[2]s +branches.change_default_branch=Анхны салаа өөрчлөх +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +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=Файлыг засахаасаа өмнө та энэ Репо-г салаалах хэрэгтэй +editor.delete_this_file=Энэ файлыг устгах +editor.must_have_write_access=Энэ файлд өөрчлөлт оруулах эсвэл санал болгохын тулд танд бичих хандалттай байх ёстой +editor.file_delete_success='%s' файлыг амжилттай устгалаа! +editor.name_your_file=Файлын нэр ... +editor.filename_help=Директор нэмэхийн тулд, нэрээ бичээд / дарна уу. Директор устгахын тулд, талбарын эхэнд очоод backspace товчийг дарна уу. +editor.or=эсвэл +editor.cancel_lower=болих +editor.commit_changes=Өөрчлөлтийг хадгалах +editor.add_tmpl='%s/<Файлын нэр>' нэмэх +editor.add=Нэмэх '%s' +editor.update=Өөрчлөх '%s' +editor.delete=Устгах '%s' +editor.commit_message_desc=Нэмэлт өргөтгөсөн тайлбар нэмэх... +editor.commit_directly_to_this_branch=%s хувилбар луу шууд өөрчлөлтийг хадгалах. +editor.create_new_branch=Энэ коммитоор шинэ хувилбар үүсгэж татаж авах хүсэлт үүсгэх. +editor.new_branch_name_desc=Шинэ хувилбарын нэр... +editor.cancel=Болих +editor.filename_cannot_be_empty=Файлын нэр оруулна уу. +editor.branch_already_exists='%s' хувилбар тус Репо-д өмнө нь үүссэн байна. +editor.directory_is_a_file='%s' сан дахь директор биш файл байна. +editor.file_is_a_symlink='%s' файлыг вэб editor-с өөрчлөх боломжгүй байна. +editor.filename_is_a_directory='%s' файл нь тус Репо-д өмнө нь үүссэн байна. +editor.file_editing_no_longer_exists=Таны өөрчлөх гэж буй '%s' файл нь Репо-д олдохгүй байна. +editor.file_changed_while_editing=Таныг засварлаж эхэлснээс хойш файлын агуулга өөрчлөгдсөн байна. Энд дарж юу өөрчлөгдсөнийг харах эсвэл тус өөрчлөлтийг дарж дахин commmit хийж болно. +editor.file_already_exists='%s' нэртэй файл нь тус Репо-д өмнө нь үүссэн байна. +editor.no_changes_to_show=Ямар нэгэн өөрчлөлт ороогүй байна. +editor.fail_to_update_file='%s' файл үүсгэх/өөрчлөх үед дараах алдаа гарлаа: %v +editor.fail_to_delete_file='%s' файл устгах үед дараах алдаа гарлаа: %v +editor.add_subdir=Дэд директор нэмэх... +editor.unable_to_upload_files='%s' руу файл upload хийх үед дараах алдаа гарлаа: %v +editor.upload_files_to_dir='%s' руу файл upload хийх + +commits.commit_history=Коммит түүх +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=Шошгогүй +issues.new.clear_labels=Шошгууд цэвэрлэх +issues.new.milestone=Үе шат +issues.new.no_milestone=Үе шат заахгүй +issues.new.clear_milestone=Үе шат цэвэрлэх +issues.new.open_milestone=Нээлттэй үе шатууд +issues.new.closed_milestone=Хаагдсан үе шатууд +issues.new.assignee=Хариуцагч +issues.new.clear_assignee=Хариуцагч цэвэрлэх +issues.new.no_assignee=Хариуцагч байхгүй +issues.create=Шинэ асуудал +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 +issues.open_tab=%d Нээлттэй +issues.close_tab=%d Хаалттай +issues.filter_label=Шошго +issues.filter_label_no_select=Шошго сонгоогүй байна +issues.filter_milestone=Үе шат +issues.filter_milestone_no_select=Үе шат сонгоогүй байна +issues.filter_assignee=Хариуцагч +issues.filter_assginee_no_select=Хариуцагч сонгоогүй байна +issues.filter_type=Төрөл +issues.filter_type.all_issues=Бүх асуудал +issues.filter_type.assigned_to_you=Танд оноогдсон +issues.filter_type.created_by_you=Таны үүсгэсэн +issues.filter_type.mentioning_you=Таныг дурдсан +issues.filter_sort=Эрэмбэлэх +issues.filter_sort.latest=Сүүлд үүссэн нь эхэндээ +issues.filter_sort.oldest=Түрүүнд үүссэн нь эхэндээ +issues.filter_sort.recentupdate=Саяхан шинэчлэгдсэн +issues.filter_sort.leastupdate=Хамгийн сүүлд шинэчлэгдсэн +issues.filter_sort.mostcomment=Хамгийн олон саналтай +issues.filter_sort.leastcomment=Хамгийн бага саналтай +issues.opened_by=нээсэн %[1]s by %[3]s +issues.opened_by_fake=нээсэн %[1]s by %[2]s +issues.previous=Өмнөх +issues.next=Дараах +issues.open_title=Нээсэн +issues.closed_title=Хаасан +issues.num_comments=%d саналууд +issues.commented_at=`санал үлдээсэн %s` +issues.delete_comment_confirm=Та энэ саналыг устгахдаа итгэлтэй байна уу? +issues.no_content=Харуулах агуулга байхгүй байна. +issues.close_issue=Хаах +issues.close_comment_issue=Санал бичээд хаах +issues.reopen_issue=Дахин нээх +issues.reopen_comment_issue=Санал бичээд дахин нээх +issues.create_comment=Санал +issues.closed_at=`хаасан %[2]s` +issues.reopened_at=`дахин нээсэн %[2]s` +issues.commit_ref_at=`энэ асуудлыг %[2]s коммитоос иш татсан болно` +issues.poster=Зурагт хуудас +issues.collaborator=Хамтрагч +issues.owner=Эзэмшигч +issues.sign_in_require_desc=Энэ хэлэлцүүлгэнд нэгдэхийн тулт та нэвтэрнэ үү. +issues.edit=Засах +issues.cancel=Цуцлах +issues.save=Хадгалах +issues.label_title=Шошгоны нэр +issues.label_color=Шошгоны өнгө +issues.label_count=%d шошго +issues.label_open_issues=%d нээлттэй асуудлууд +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" татаж авах` + +pulls.new=Шинэ татах хүсэлт +pulls.compare_changes=Өөрчлөлтийг харьцуулах +pulls.compare_changes_desc=Хоёр хуулбарыг харьцуулж, өөрчлөлт оруулах хүсэлтийг гаргана уу. +pulls.compare_base=үндэс +pulls.compare_compare=харьцуулах +pulls.filter_branch=Салаагаар шүүх +pulls.no_results=Үр дүн олдсонгүй. +pulls.nothing_to_compare=Үндэс болон Толгой хуулбарууд ижил тул харьцуулах зүйл алга байна. +pulls.nothing_merge_base=Хоёр хуулбар огт өөр түүхтэй тул харьцуулах зүйл алга. +pulls.has_pull_request=`Энэ хоёр зорилтот хуулбарын хооронд татах хүсэлт аль хэдийн ирсэн байна: %[2]s#%[3]d` +pulls.create=Татах хүсэлтийг бий болгох +pulls.title_desc=%[1]d-ийг %[2]s-оос %[3]s руу нэгтгэхийг хүсэлт +pulls.merged_title_desc=%[1]d-ийг %[2]s-оос %[3]s %[4]s болгон нэгтгэв +pulls.tab_conversation=Харилцаа +pulls.tab_commits=Коммитууд +pulls.tab_files=Өөрчилсөн файлууд +pulls.reopen_to_merge=Нэгтгэх ажиллагааг гүйцэтгэхийн тулд энэ татах хүсэлтийг дахин нээнэ үү. +pulls.merged=Нэгтгэсэн +pulls.has_merged=Энэхүү татах хүсэлтийг амжилттай нэгтгэв! +pulls.data_broken=Энэхүү татах хүсэлтийн өгөгдөл нь садааны мэдээллийг устгасан тул эвдэрсэн байна. +pulls.is_checking=Давхцал шалгах ажил үргэлжилж байна, хэдэн хоромын дараа хуудсыг шинэчилнэ үү. +pulls.can_auto_merge_desc=Энэхүү татах хүсэлтийг автоматаар нэгтгэх боломжтой. +pulls.cannot_auto_merge_desc=Давхцалтай тул энэ татах хүсэлтийг автоматаар нэгтгэх боломжгүй. +pulls.cannot_auto_merge_helper=Зөрчлийг арилгахын тулд гараар нэгтгэнэ үү. +pulls.create_merge_commit=Нэгтгэх хүсэлт үүсгэх +pulls.rebase_before_merging=Нэгдэхээс өмнө дахин байрлуулах +pulls.commit_description=Коммитын тайлбар +pulls.merge_pull_request=Татах хүсэлтийг нэгтгэх +pulls.open_unmerged_pull_exists=`Тус Репо-с ижил нэгтгэх мэдээлэлтэй нээлттэй татах хүсэлт (#%d) аль хэдийн ирсэн, нэгтгэхээ хүлээж байгаа тул та дахин нээх үйлдлийг хийж чадахгүй.` +pulls.delete_branch=Салааг устгах +pulls.delete_branch_has_new_commits=Нэгтгэсний дараа шинэ өөрчлөлт орсон тул тус салааг устгах боломжгүй байна. + +milestones.new=Шинэ үе шат +milestones.open_tab=%d Нээлттэй +milestones.close_tab=%d Хаалттай +milestones.closed=Хаалттай %s +milestones.no_due_date=Дуусах хугацаагүй +milestones.open=Нээх +milestones.close=Хаах +milestones.new_subheader=Асуудлуудаа цэгцлэх чухал үе шатуудыг бий болго. +milestones.create=Үе шат үүсгэх +milestones.title=Гарчиг +milestones.desc=Тайлбар +milestones.due_date=Дуусах хугацаа (заавал биш) +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.filter_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 + +settings=Тохиргоо +settings.options=Сонголтууд +settings.collaboration=Сонголтууд +settings.collaboration.admin=Админ +settings.collaboration.write=Бичих +settings.collaboration.read=Унших +settings.collaboration.undefined=Тодорхойгүй +settings.branches=Хуулбарууд +settings.branches_bare=Та хоосон Репо-г удирдах боломжгүй. Эхлээд ямар нэг мэдээлэл хуулах ёстой. +settings.default_branch=Репо үндэс +settings.default_branch_desc=Репо үндэс-г код ажиллуулах, хүсэлт гаргах, онлайн засварлахад зориулсан "суурь" хуулбар гэж үздэг. +settings.update=Шинэчлэх +settings.update_default_branch_unsupported=Анхдагч хуулбарыг өөрчлөхийг сервер дээрх Git хувилбар дэмждэггүй. +settings.update_default_branch_success=Энэ репозиторын анхдагч хуулбар амжилттай шинэчлэгдсэн! +settings.protected_branches=Хаалттай хуулбарууд +settings.protected_branches_desc=Хаалттай хуулбар нь санамсаргүйгээр устгах, цагаан жагсаалт оруулахаас хамгаална. +settings.choose_a_branch=Хуулбар сонгох... +settings.branch_protection=Хуулбар хамгаалалт +settings.branch_protection_desc=%s хуулбарыг хамгаалах сонголтыг сонгоно уу. +settings.protect_this_branch=Энэ хуулбарыг хамгаалах +settings.protect_this_branch_desc=Энэ хуулбар луу push хийхийг хориглох. +settings.protect_require_pull_request=Push хийхийн оронд шууд pull хийж авах +settings.protect_require_pull_request_desc=Энэ хуулбар луу push хийхийг хориглох бол идэвхжүүлнэ үү. +settings.protect_whitelist_committers=Энэ хуулбар руу push хийх боломжтой хэрэглэгчид +settings.protect_whitelist_committers_desc=Энэ хуулбар руу шууд push хийх боломжтой хэрэглэгчид. Цагаан жагсаалтад бүртгэгдсэн хэрэглэгчид тус хуулбар луу шууд push хийх боломжтойв +settings.protect_whitelist_users=Энэ хуулбар руу түлхэх боломжтой хэрэглэгчид +settings.protect_whitelist_search_users=Хэрэглэгчдийг хайх +settings.protect_whitelist_teams=Тэдний гишүүд энэ салбар руу түлхэх боломжтой багууд +settings.protect_whitelist_search_teams=Баг хайх +settings.update_protect_branch_success=Энэ хуулбарыг хамгаалах сонголтыг амжилттай шинэчиллээ! +settings.hooks=Webhooks +settings.githooks=Git Hooks +settings.basic_settings=Үндсэн тохиргоо +settings.mirror_settings=Хуулбарын Тохиргоо +settings.sync_mirror=Одоо нэгтгэе +settings.mirror_sync_in_progress=Хуулбарыг нэгтгэх ажил хийгдэж байна, түр хүлээгээд хуудсыг дахин шинэчилнэ үү. +settings.site=Албан ёсны сайт +settings.update_settings=Тохиргоог шинэчлэх +settings.change_reponame_prompt=Энэ өөрчлөлт нь холбоосууд репозитортой хэрхэн холбогдоход нөлөөлнө. +settings.advanced_settings=Нарийвчилсан тохиргоо +settings.wiki_desc=Мэдлэгийн сангийн системийг идэвхжүүлэх +settings.use_internal_wiki=Мэдлэгийн сан ашиглах +settings.allow_public_wiki_desc=Репо нь хувийн байх үед мэдлэгийн сан руу олон нийтийн хандалтыг зөвшөөрөх +settings.use_external_wiki=Гадаад мэдлэгийн сан ашиглах +settings.external_wiki_url=Гадаад мэдлэгийн сангийн URL +settings.external_wiki_url_desc=Зочид таб дээр дарахад URL руу шилжих болно. +settings.issues_desc=Асуудлыг хянагчийг идэвхжүүлэх +settings.use_internal_issue_tracker=Хялбар мэдлэгийн сан ашиглах +settings.allow_public_issues_desc=Репозитор хувийн тохиолдолд олон нийтэд хандах боломжийг олгоно +settings.use_external_issue_tracker=Гадаад асуудал хянагч ашиглах +settings.external_tracker_url=Гадаад дугаар хянагч URL +settings.external_tracker_url_desc=Зочид таб дээр дарахад URL руу дахин чиглүүлэгдэх болно. +settings.tracker_url_format=Гадаад асуудал хянагч URL формат +settings.tracker_issue_style=Гадаад дугаар хянагч нэрлэх хэв маяг: +settings.tracker_issue_style.numeric=Тоо +settings.tracker_issue_style.alphanumeric=Тоо болон үсэг +settings.tracker_url_format_desc=Хэрэглэгчийн нэр, репозиторийн нэр, асуудлын индексийг оруулахдаа та {user} {repo} {index} -ийг ашиглаж болно. +settings.pulls_desc=Репо ба хувилбарын хооронд pull хүсэлтийг идэвхжүүлэх +settings.pulls.ignore_whitespace=Хоосон зайг алгасах +settings.pulls.allow_rebase_merge=Буцаан хуулбарлахыг зөвшөөрөх +settings.danger_zone=Аюултай талбар +settings.cannot_fork_to_same_owner=Та тус Репо-г анх үүсгэсэн хэрэглэгчид шилжүүлэх боломжгүй. +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=Устгасанаас хойш сэргээх боломжгүй учир болгоомжтой хандана уу. +settings.wiki_delete_notices_1=- Энэ нь %s-ийн wiki-г устгах ба идэвхгүй болгох болно +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=Хамтран ажиллагч нэмэгдлээ . +settings.delete_collaborator=Устгах +settings.collaborator_deletion=Хамтран ажиллагч устгах +settings.collaborator_deletion_desc=Энэ хэрэглэгч устгасны дараа энэ агуулахад хамтын ажиллагааны хандалт байхгүй болно. Та үргэлжлүүлэхийг хүсч байна уу? +settings.remove_collaborator_success=Хамтран ажиллагчийг амжилттай устгала. +settings.search_user_placeholder=Хэрэглэгч хайх... +settings.org_not_allowed_to_be_collaborator=Байгууллагыг хамтран ажиллагчаар нэмж оруулахыг хориглоно. +settings.hooks_desc=Webhooks нь үндсэн HTTP POST үйл явдалтай адилхан байдаг. Gogs-д ямар нэгэн үйлдэл болох үед бид таны зааж өгсөн зорилтот хост руу мэдэгдэх болно. +settings.webhooks.add_new=Шинэ Webhook нэмэх: +settings.webhooks.choose_a_type=Төрөл сонгох ... +settings.add_webhook=Webhook нэмэх +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=Туршилтын webhook нь ажлын дараалалд нэмэгдсэн. Тус өөрчлөлтийг хадгалахад багахан хугаацаа орно. +settings.webhook.redelivery=Дахин илгээх +settings.webhook.redelivery_success='%s' hook ажил дахин нэмэгдлээ. Тус өөрчлөлтийг хадгалахад багахан хугаацаа орно. +settings.webhook.request=Хүсэлт +settings.webhook.response=Хариу +settings.webhook.headers=Толгой +settings.webhook.payload=Ачаалах +settings.webhook.body=Бие +settings.webhook.err_cannot_parse_payload_url=Тус хаягаас ачааллаж чадсангүй : %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. +settings.githooks_desc=Git Hooks -ийг Git тодорхойлдог, та зөвшөөрөгдсөн hooks файлуудыг засвардах боломжтой. +settings.githook_edit_desc=Хэрэв hook идэвхгүй бол жишээ агуулгыг танилцуулах болно. Агуулгыг утгыыг үлдээвэл энэ hook идэвхгүй болно. +settings.githook_name=Hook нэр +settings.githook_content=Hook агуулга +settings.update_githook=Hook өөрчлөх +settings.add_webhook_desc=Gogs нь таны оруулсан URL руу POST хүсэлтийг болон болсон үйл явдлын талаарх дэлгэрэнгүй мэдээллийг илгээх болно. Та hook ашигласан тохиолдолд ямар төрлийн өгөгдлийн формат авахыг хүсч байгаагаа зааж өгч болно (JSON, x-www-form-urlencoded, XML гэх мэт). Дэлгэрэнгүй мэдээллийг манай Webhooks гарын авлагаас авах боломжтой. +settings.payload_url=Ачаалах URL +settings.content_type=Агуулгын төрөл +settings.secret=Нууцлал +settings.secret_desc=Нууцлах толгой файл нь SHA256 HMAC <код> X-Gogs-гарын үсэг ашиглана. +settings.slack_username=Хэрэглэгчийн нэр +settings.slack_icon_url=Айкон хаяг +settings.slack_color=Өнгө +settings.event_desc=Хэзээ энэ webhook ашиглагдах вэ? +settings.event_push_only=Зөвхөн push хийх +settings.event_send_everything=Надад бүгд хэрэгтэй +settings.event_choose=Надад хэрэгтэй зүйлээ сонгох +settings.event_create=Үүсгэх +settings.event_create_desc=Үүсгэх хувилбар/таг +settings.event_delete=Устгах +settings.event_delete_desc=Устгах хувилбар/таг +settings.event_fork=Хуулбар +settings.event_fork_desc=Хуулбар репо +settings.event_push=Push +settings.event_push_desc=Git push +settings.event_issues=Асуудлууд +settings.event_issues_desc=Энэ асуудал нээгдсэн, хаагдсан, дахин нээгдсэн, засварлагдсан, томилогдсон, хуваарилагдаагүй, шошгыг шинэчилсэн, шошгыг цэвэрлэсэн, тэмдэглэсэн. +settings.event_pull_request=Pull хүсэлт +settings.event_pull_request_desc=Хүсэлтийг нээх, хаах, дахин нээх, засах, хуваарилах, хуваарилах, шошгыг шинэчлэх, шошгыг цэвэрлэх, тэмдэглэх, demonestones эсвэл синхрончлох. +settings.event_issue_comment=Тайлбар +settings.event_issue_comment_desc=Тайлбарыг үүсгэсэн, засварласан эсвэл устгасан. +settings.event_release=Хувилбар +settings.event_release_desc=Хувилбар репод амжилттай нийтлэгдлээ. +settings.active=Идэвхитэй +settings.active_helper=Hook дэлгэрэнгүй мэдээлэл. +settings.add_hook_success=Шинэ webhook нэмэгдлээ. +settings.update_webhook=Webhook өөрчлөх +settings.update_hook_success=Webhook өөрчлөгдлөө. +settings.delete_webhook=Webhook устгах +settings.recent_deliveries=Сүүлийн үеийн хүргэлт +settings.hook_type=Hook төрөл +settings.add_slack_hook_desc=Slack интеграци нэмэх. +settings.add_discord_hook_desc=Discord интеграци нэмэх. +settings.add_dingtalk_hook_desc=Dingtalk интеграци нэмэх. +settings.slack_token=Токен +settings.slack_domain=Домайн +settings.slack_channel=Суваг +settings.deploy_keys=Deploy Keys +settings.deploy_keys_helper=Хэрэв та хувийн нийтийн түлхүүрүүдийг нэмэх гэж байгаа бол үүнийг дансны тохиргоондоо нэмнэ үү. +settings.add_deploy_key=Deploy Key нэмэх +settings.deploy_key_desc=Deploy keys зөвхөн унших эрхтэй байна. Эдгээр нь хувийн дансны SSH түлхүүрүүдтэй адил биш юм. +settings.no_deploy_keys=Та deploy key нэмээгүй байна. +settings.title=Нэр +settings.deploy_key_content=Мэдээлэл +settings.key_been_used=Deploy key мэдээлэл ашиглагдсан байна. +settings.key_name_used=Ижил нэртэй Deploy key үүссэн байна. +settings.add_key_success='%s' deploy key амжилттай үүслээ! +settings.deploy_key_deletion=Deploy Key устгах +settings.deploy_key_deletion_desc=Энэ Deploy Key устгаснаар хамаарал бүхий Репо-д хандах эрхгүй болно. Үргэлжлүүлэх үү? +settings.deploy_key_deletion_success=Deploy key-г амжилттай устгалаа! +settings.description_desc=Репо тайлбар. Ихдээ 512 тэмдэгт. +settings.description_length=Боломжтой тэмдэгтүүд + +diff.browse_source=Эх сурвалжийг харах +diff.parent=parent +diff.commit=commit +diff.data_not_available=Өөрчлөлтийн мэдээлэл алга байна . +diff.show_diff_stats=Өөрчлөлтийн статистик харах +diff.show_split_view=Өөрчлөлтийг ялгаж харах +diff.show_unified_view=Өөрчлөллтийг нэгтгэж харах +diff.stats_desc= %d өөрчлөгдсөн %d нэмэгдсэн , %d устгасан +diff.bin=BIN +diff.view_file=Файл харах +diff.file_suppressed=Файлын зөрүү хэтэрхий том тул дарагдсан байна +diff.too_many_files=Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно + +release.releases=Хувилбар +release.new_release=Шинэ хувилбар +release.draft=Драфт +release.prerelease=Урьдчилсан хувилбар +release.edit=засах +release.ahead=%d commit ирсэн байна %s хувилбараас хойш +release.source_code=Эх код +release.new_subheader=Бүтээгдэхүүнийг давтан хийх хувилбаруудыг нийтлэх. +release.edit_subheader=Өөрчлөлтийн дэлгэрэнгүй бүртгэл нь хэрэглэгчдэд сайжруулсан зүйлийг ойлгоход тусална. +release.tag_name=Шошгоны нэр +release.target=Сонгох +release.tag_helper=Одоо байгаа тагийг сонгох, эсвэл нийтлэхдээ шинэ таг үүсгэх. +release.title=Нэр +release.content=Агуулга +release.write=Бичих +release.preview=Урьдчилан харах +release.loading=Ачааллаж байна ... +release.prerelease_desc=Энэ бол урьдчилсан хувилбар +release.prerelease_helper=Энэ хувилбар нь шууд байрлуулахад бэлэн биш байгааг тэмдэглэх. +release.cancel=Болих +release.publish=Хувилбарыг ашиглах +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=Татах + +[org] +org_name_holder=Байгууллагын нэр +org_full_name_holder=Байгууллагын бүтэн нэр +org_name_helper=Байгууллагын нэрээ богино, санахад хялбар оруулна уу. +create_org=Байгууллаг үүсгэх +repo_updated=Шинэчилсэн +people=Хүмүүс +invite_someone=Урилга илгээх +teams=Багууд +lower_members=гишүүд +lower_repositories=репонууд +create_new_team=Баг үүсгэх +org_desc=Тайлбар +team_name=Багийн нэр +team_desc=Тайлбар +team_name_helper=Та цаашид энэ нэрийг ашиглана. +team_desc_helper=Багийн тодорхойлолт? +team_permission_desc=Багт ямар эрх шаардлагатай вэ? + +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. + +settings=Тохиргоо +settings.options=Сонголтууд +settings.full_name=Бүтэн нэр +settings.website=Вэбсайт +settings.location=Байршил +settings.update_settings=Тохиргоог шинэчлэх +settings.update_setting_success=Байгууллагын тохиргоог амжилттай шинэчиллээ. +settings.change_orgname_prompt=Энэ өөрчлөлт нь холбоосууд нь байгууллагатай хэрхэн холбогдоход нөлөөлнө. +settings.update_avatar_success=Байгууллагын аватар тохиргоог амжилттай шинэчиллээ. +settings.delete=Delete Organization +settings.delete_account=Байгууллагыг устгах +settings.delete_prompt=Байгууллага бүрмөсөн устгагдах бөгөөд үүнийг дахин сэргээх БОЛОМЖГҮЙ ! +settings.confirm_delete_account=Устгалтыг баталгаажуулах +settings.delete_org_title=Байгууллагыг устгах +settings.delete_org_desc=Энэ байгууллага бүрмөсөн устах бол, үргэлжлүүлнэ үү? +settings.hooks_desc=Энэ байгууллагын харьяалагдах бүх репо -д webhooks нэмнэ үү. + +members.membership_visibility=Гишүүнчлэлийн харагдах байдал: +members.public=Нээлттэй +members.public_helper=хаалттай болгох +members.private=Хаалттай +members.private_helper=нээлттэй болгох +members.member_role=Хэрэглэгчийн эрх: +members.owner=Эзэмшигч +members.member=Гишүүн +members.remove=Устгах +members.leave=Гарах +members.invite_desc=%s гишүүн нэмэх : +members.invite_now=Урих + +teams.join=Нэгдэх +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=Эзэмшигч нь бүх репо-г удирдах админ эрхтэй. +teams.members=Багийн гишүүд +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=Энэ багийн гишүүнчлэл нь Админ эрх олгоно: гишүүд репозиторыг уншиж, бичих, хэрэглэгч нэмж оруулах боломжтой. +teams.repositories=Багийн репонууд +teams.search_repo_placeholder=Репо хайх... +teams.add_team_repository=Багт репо нэмэх +teams.remove_repo=Устгах +teams.add_nonexistent_repo=Таны нэмэх гэж буй репо үүсээгүй байна. + +[admin] +dashboard=Хянах самбар +users=Хэрэглэгчид +organizations=Байгууллагууд +repositories=Репонууд +authentication=Баталгаажуулалт +config=Тохиргоо +notices=Системийн мэдэгдэл +monitor=Хяналт +first_page=Эхний +last_page=Сүүлийн +total=Нийт: %d + +dashboard.build_info=Build мэдээлэл +dashboard.app_ver=Аппликэшн хувилбар +dashboard.git_version=Git хувилбар +dashboard.go_version=Go хувилбар +dashboard.build_time=Build цаг +dashboard.build_commit=Build commit +dashboard.statistic=Статистик +dashboard.operations=Ажиллагаа +dashboard.system_status=Системийн төлөв +dashboard.statistic_info=Gogs өгөгдлийн бааз нь %d хэрэглэгч, %d байгууллага, %d нийтийн түлхүүр, %d репо, %d дагасан, %d тэмдэглэсэн, %d үйлдэл хийгдсэн, %d хандалт авсан, %d асуудал нийтэлсэн, %d саналтай, %d social данс, %d дагагч, %d хуулбар, %d хувилбар, %d нэвтрэх эх сурвалж, %d webhooks, %d чухал үйл явдлууд, %d шошго, %d hook үйл ажиллагаа, %d баг, %d өөрчлөх үйл ажиллагаа, %d хавсралтай байна. +dashboard.operation_name=Үйлдлийн нэр +dashboard.operation_switch=Солих +dashboard.select_operation_to_run=Ажиллуулах үйлдлийг сонгоно уу +dashboard.operation_run=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' файлыг дахин бичих (анхааруулга: Gogs-ийн биш түлхүүрүүд алдагдах болно) +dashboard.resync_all_sshkeys_success=Бүх нийтийн түлхүүрүүдийг амжилттай дахин бичлээ. +dashboard.resync_all_hooks=Бүх репо-г дахин шинэчлэх +dashboard.resync_all_hooks_success=Бүх репо-г амжилттай дахин бичлээ. +dashboard.reinit_missing_repos=Git файлуудыг алдсан бүх репозиторыг дахин эхлүүлэх +dashboard.reinit_missing_repos_success=Git файлуудыг алдсан бүх репозиторыг амжилттай дахин эхлүүллээ. + +dashboard.server_uptime=Серверийн ажилласан хугацаа +dashboard.current_goroutine=Одоогийн +dashboard.current_memory_usage=Санах ойн одоогийн хэрэглээ +dashboard.total_memory_allocated=Хуваарилагдсан санах ой +dashboard.memory_obtained=Авсан санах ой +dashboard.pointer_lookup_times=Pointer харах хугацаа +dashboard.memory_allocate_times=Санах ой хуваарилах хугацаа +dashboard.memory_free_times=Санах ой чөлөөлөх хугацаа +dashboard.current_heap_usage=Current Heap Usage +dashboard.heap_memory_obtained=Heap санах ой +dashboard.heap_memory_idle=Heap санах ой хүлээлгийн горим +dashboard.heap_memory_in_use=Heap санах ой ашиглаж байгаа +dashboard.heap_memory_released=Heap санах ой чөлөөлсөн +dashboard.heap_objects=Heap объект +dashboard.bootstrap_stack_usage=Bootstrap Stack хэрэглээ +dashboard.stack_memory_obtained=Stack санах ой +dashboard.mspan_structures_usage=MSpan бүтцийн хэрэглээ +dashboard.mspan_structures_obtained=MSpan бүтэц +dashboard.mcache_structures_usage=MCache бүтцийн хэрэглээ +dashboard.mcache_structures_obtained=MCache бүтэц +dashboard.profiling_bucket_hash_table_obtained=Hash Table +dashboard.gc_metadata_obtained=GC метадата +dashboard.other_system_allocation_obtained=Бусад хуваарилагдсан +dashboard.next_gc_recycle=Дараагийн GC Recycle +dashboard.last_gc_time=Сүүлийн GC Time-с хойш +dashboard.total_gc_time=Нийт GC цаг +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=Идэвхитэй +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.watches=Үзсэн +repos.stars=Тэмдэглэсэн +repos.issues=Шийдвэрлэх асуудал +repos.size=Хэмжээний + +auths.auth_sources=Баталгаажуулалтын эх сурвалжууд +auths.new=Шинэ эх сурвалж нэмэх +auths.name=Нэр +auths.type=Төрөл +auths.enabled=Идэвхжүүлсэн +auths.default=Үндсэн +auths.updated=Шинэчилсэн +auths.auth_type=Баталгаажуулалтын төрөл +auths.auth_name=Баталгаажуулалтын нэр +auths.security_protocol=Нууцлалын протокол +auths.domain=Домайн +auths.host=Хост +auths.port=Порт +auths.bind_dn=DN-г холбох +auths.bind_dn_helper=Та '%s'-ийг хэрэглэгчийн нэрэнд зориулж ашиглаж болно, ж.нь. DOM\%s +auths.bind_password=Нууц үгийг холбох +auths.bind_password_helper=Анхааруулга: Энэ нууц үг энгийн текстэнд хадгалагддаг. +auths.user_base=Хэрэглэгчийн хайлтын бааз +auths.user_dn=Хэрэглэгчийн DN +auths.attribute_username=Хэрэглэгчийн нэрийн шинж чанар +auths.attribute_username_placeholder=Хэрэглэгчийн нэр дээр нэвтрэх хэлбэрийн талбарын утгыг ашиглахын тулд хоосон орхино уу. +auths.attribute_name=Нэр тодорхойлолт +auths.attribute_surname=Овог тодорхойлолт +auths.attribute_mail=Имэйл тодорхойлолт +auths.verify_group_membership=Бүлгийн гишүүнчлэлийг баталгаажуулах +auths.group_search_base_dn=Бүлгийн DN хайлтын бааз +auths.group_filter=Бүлгийн шүүлтүүр +auths.group_attribute_contain_user_list=Хэрэглэгчийн жагсаалтыг агуулсан бүлэг тодорхойлолт +auths.user_attribute_listed_in_group=Бүлэг доторх хэрэглэгчийн тодорхойлолт +auths.attributes_in_bind=DN тодорхойлолт +auths.filter=Хэрэглэгчийн шүүлтүүр +auths.admin_filter=Админы шүүлтүүр +auths.ms_ad_sa=Ms Ad SA +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.edit=Баталгаажуулалтын тохиргоог засах +auths.activated=Энэ баталгаажуулалт идэвхжсэн байна +auths.default_auth=Үндсэн танилт нэвтрэлт +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=Баталгаажуулалтыг амжилттай устгалаа! +auths.login_source_exist='% s' танил нэвтрэлтийн төрөл өмнө үүссэн байна. +auths.github_api_endpoint=API Endpoint + +config.not_set=(тохируулаагүй) +config.server_config=Серверийн тохиргоо +config.brand_name=Брэндийн нэр +config.run_user=Ажиллуулах хэрэглэгч +config.run_mode=Ажиллуулах горим +config.server.external_url=Гадаад хаяг +config.server.domain=Домайн +config.server.protocol=Протокод +config.server.http_addr=HTTP хаяг +config.server.http_port=HTTP порт +config.server.cert_file=Certificate файл +config.server.key_file=Key файл +config.server.tls_min_version=TLS хувилбар /багадаа/ +config.server.unix_socket_permission=Unix сокет зөвшөөрөл +config.server.local_root_url=Дотоод үндсэн URL +config.server.offline_mode=Офлайн горим +config.server.disable_router_log=Рүүэрийн бүртгэлийг идэвхгүй болгох +config.server.enable_gzip=Gzip-ийг идэвхжүүлэх +config.server.app_data_path=Өгөгдөл хадгалах зам +config.server.load_assets_from_disk=Нөөц хадгалах зам +config.server.landing_url=Үндсэн URL + +config.ssh_config=SSH тохиргоо +config.ssh.enabled=Идэвхитэй +config.ssh.domain=Домэйн +config.ssh.port=Порт +config.ssh.root_path=Зам +config.ssh.keygen_path=Түлхүүрийн зам +config.ssh.key_test_path=Түлхүүрийн тест зам +config.ssh.minimum_key_size_check=Түлхүүрийн хамгийн бага хэмжээ шалгах +config.ssh.minimum_key_sizes=Түлхүүрийн хамгийн бага хэмжээ +config.ssh.rewrite_authorized_keys_at_start=Дахин чиглүүлэх "authorized_keys" +config.ssh.start_builtin_server=Дотоод серверийг эхлүүлэх +config.ssh.listen_host=Сонсох хост +config.ssh.listen_port=Сонсох порт +config.ssh.server_ciphers=Серверийн шифр +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Хадгалах сангийн тохиргоо +config.repo.root_path=Root буюу эх зам +config.repo.script_type=Скриптийн төрөл +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Албадан нууцлах +config.repo.max_creation_limit=Хамгийн их үүсгэх хязгаар +config.repo.preferred_licenses=Бэлтгэсэн лицензүүд +config.repo.disable_http_git=HTTP Git идэвхигүй болгох +config.repo.enable_local_path_migration=Дотоод нэгтгэл зөвшөөрөх +config.repo.enable_raw_file_render_mode=Raw файл горимыг идэвхжүүлэх +config.repo.commits_fetch_concurrency=Зэрэгцээ commit зөвшөөрөх +config.repo.editor.line_wrap_extensions=Editor мөр өргөтгөх +config.repo.editor.previewable_file_modes=Editor удидчилж харах +config.repo.upload.enabled=Upload идэвхижүүлэх +config.repo.upload.temp_path=Upload файлын зам +config.repo.upload.allowed_types=Upload зөвшөөрөгдсөн төрлүүд +config.repo.upload.file_max_size=Upload файлын хэмжээ ихдээ +config.repo.upload.max_files=Upload файлын тоо ихдээ + +config.db_config=Өгөгдлийн баазын тохиргоо +config.db.type=Төрөл +config.db.host=Хост +config.db.name=Нэр +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=Хэрэглэгчийн нэр +config.db.ssl_mode=SSL +config.db.ssl_mode_helper=(зөвхөн "postgres"-ийн хувьд) +config.db.path=Зам +config.db.path_helper=(зөвхөн "sqlite3"-ийн хувьд) +config.db.max_open_conns=Нээлттэй холболтын тоо ихдээ +config.db.max_idle_conns=Идэвхигүй холболтын тоо ихдээ + +config.security_config=Аюулгүй байдлын тохиргоо +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Имэйл тохиргоо +config.email.enabled=Идэвхитэй +config.email.subject_prefix=Гарчигийн өмнө +config.email.host=Хост +config.email.from=Хэнээс +config.email.user=Хэрэглэгч +config.email.disable_helo=HELO идэвхигүй +config.email.helo_hostname=HELO хостын нэр +config.email.skip_verify=Гэрчилгээ баталгаажуулалтыг алгасах +config.email.use_certificate=Өөрийн гэрчилгээ ашиглах +config.email.cert_file=Certificate файл +config.email.key_file=Key файл +config.email.use_plain_text=Текст баталгаажуулалт ашиглах +config.email.add_plain_text_alt=Текстийн өөр хувилбар +config.email.send_test_mail=Имэйл илгээж турших +config.email.test_mail_failed=Туршилтын имэйлийг '%s': %v рүү илгээж чадсангүй +config.email.test_mail_sent=Туршилтын имэйл '%s' рүү илгээгдлээ. + +config.auth_config=Authentication тохиргоо +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Кодын ашиглалтыг идэвхжүүлэх +config.auth.reset_password_code_lives=Нууц үгийн кодыг шинэчлэх +config.auth.require_email_confirm=Имэйлээр баталгаажуулахыг шаардана +config.auth.require_sign_in_view=Нэвтрэхийг шаардана +config.auth.disable_registration=Бүртгэлийг идэвхгүй болгох +config.auth.enable_registration_captcha=Бүртгэлийн captcha-г идэвхжүүлэх +config.auth.enable_reverse_proxy_authentication=Урвуу прокси нэвтрэлт танилтыг идэвхжүүлэх +config.auth.enable_reverse_proxy_auto_registration=Урвуу прокси автомат бүртгэлийг идэвхжүүлэх +config.auth.reverse_proxy_authentication_header=Урвуу прокси баталгаажуулах header + +config.user_config=Хэрэглэгчийн тохиргоо +config.user.enable_email_notify=Имэйл тохиргоо + +config.session_config=Session тохиргоо +config.session.provider=Нийлүүлэгч +config.session.provider_config=Нийлүүлэгчийн тохиргоо +config.session.cookie_name=Cookie +config.session.https_only=зөвхөн HTTPS +config.session.gc_interval=GC хугацаа +config.session.max_life_time=Хадгалагдах хугацаа хамгийн ихдээ +config.session.csrf_cookie_name=CSRF cookie + +config.cache_config=Cache тохиргоо +config.cache.adapter=Адаптер +config.cache.interval=GC хугацаа +config.cache.host=Хост + +config.http_config=HTTP тохиргоо +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Хавсралтын тохиргоо +config.attachment.enabled=Идэвхитэй +config.attachment.path=Зам +config.attachment.allowed_types=Зөвшөөрөгдсөн төрлүүд +config.attachment.max_size=Хэмжээний хязгаар +config.attachment.max_files=Файлын хязгаар + +config.release_config=Хувилбарын тохиргоо +config.release.attachment.enabled=Хавсралт идэвхжсэн +config.release.attachment.allowed_types=Хавсралтын зөвшөөрөгдсөн төрлүүд +config.release.attachment.max_size=Хавсралтын хэмжээ хязгаар +config.release.attachment.max_files=Хавсралтын файлын хязгаар + +config.picture_config=Зургийн тохиргоо +config.picture.avatar_upload_path=Хэрэглэгчийн аватар байршуулах зам +config.picture.repo_avatar_upload_path=Агуулахын аватар байршуулах зам +config.picture.gravatar_source=Граватар эх сурвалж +config.picture.disable_gravatar=Граватарыг идэвхгүй болгох +config.picture.enable_federated_avatar=Холбогдсон аватаруудыг идэвхжүүлэх + +config.mirror_config=Хуулбарын тохиргоо +config.mirror.default_interval=Анхдагч интервал + +config.webhook_config=Webhook тохиргоо +config.webhook.types=Төрлүүд +config.webhook.deliver_timeout=Дамжуулах хугацаа +config.webhook.skip_tls_verify=TLS баталгаажуулалтыг алгасах + +config.git_config=Git тохиргоо +config.git.disable_diff_highlight=Ялгааг тодруулж харуулахыг болих +config.git.max_diff_lines=Ялгаатай мөрийн тоо ихдээ (нэг файлын хувьд) +config.git.max_diff_line_characters=Ялгаатай тэмдэгтийн тоо (нэг мөрийн хувьд) +config.git.max_diff_files== Ялгаатай файлын тоо (нэг өөрчлөлтийн хувьд) +config.git.gc_args=GC аргументууд +config.git.migrate_timeout=Нэгтгэх хугацаа +config.git.mirror_timeout=Mirror timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS тохиргоо +config.lfs.storage=Зай +config.lfs.objects_path=Объектын зам + +config.log_config=Лог мэдээллийн тохируулга +config.log_file_root_path=Лог мэдээллийн зам +config.log_mode=Горим +config.log_options=Сонголтууд + +monitor.cron=Cron ажлууд +monitor.name=Нэр +monitor.schedule=Хуваарь +monitor.next=Дараах +monitor.previous=Өмнөх +monitor.execute_times=Ажилласан +monitor.process=Ажиллаж байгаа +monitor.desc=Тайлбар +monitor.start=Эхлэх цаг +monitor.execute_time=Ажиллах хугацаа + +notices.system_notice_list=Системийн мэдэгдэл +notices.view_detail_header=Мэдэгдэлийн дэлгэрэнгүйг үзэх +notices.actions=Үйлдэл +notices.select_all=Бүгдийг сонгох +notices.deselect_all=Бүгдийг цуцлах +notices.inverse_selection=Урвуугаар сонгох +notices.delete_selected=Сонгогдсоныг устгах +notices.delete_all=Бүх мэдэгдлийг устгах +notices.type=Төрөл +notices.type_1=Репо +notices.desc=Тайлбар +notices.op=заавал биш. +notices.delete_success=Системийн мэдэгдлийг амжилттай устгасан. + +[action] +create_repo=%s репо-г үүсгэлээ +rename_repo=%[1]s репо-г %[3]s болгож өөрчиллөө +commit_repo=Push хийсэн %[3]s %[4]s +compare_commits=Эдгээр %d commit-уудын харьцуулалтыг харах +transfer_repo=репо-г %s%s рүү шилжүүллээ +create_issue=`нээлттэй %s#%[2]s` +close_issue=`хаалттай %s#%[2]s` +reopen_issue=`дахин нээсэн %s#%[2]s` +comment_issue=`сэтгэгдэл үлдээсэн %s#%[2]s` +create_pull_request=`pull request үүсгэсэн %s#%[2]s` +close_pull_request=`pull request хаасан %s#%[2]s` +reopen_pull_request=`pull request дахин нээсэн %s#%[2]s` +merge_pull_request=`pull request нэгтгэсэн %s#%[2]s` +create_branch=шинэ хуулбар үүсгэсэн %[3]s at %[4]s +delete_branch=устгасах хуулбар %[2]s at %[3]s +push_tag=pushed таг %[2]s to %[3]s +delete_tag=deleted таг %[2]s at %[3]s +fork_repo=Репо-х %s хуулбарласан +mirror_sync_push=%[3]s%[4]s-д нэгтгэсэн +mirror_sync_create=%[2]s%[3]s-д нэгтгэсэн +mirror_sync_delete=code>%[2]s -с %[3]s-д нэгтгэж, устгасан + +[tool] +ago=өмнө +from_now=одооноос +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 +raw_seconds=секунд +raw_minutes=минут +raw_hours=цаг + +[dropzone] +default_message=Файлуудаа энд чирж тавина уу эсвэл Файл товчин дээр дарна уу. +invalid_input_type=Та ийм төрлийн файл байршуулах боломжгүй. +file_too_big=Файлын хэмжээ ({{filesize}} MB) дээд хязгаар ({{maxFilesize}} MB) -аас хэтэрсэн байна. +remove_file=Файлыг устгах + diff --git a/conf/locale/locale_nl-NL.ini b/conf/locale/locale_nl-NL.ini index 8edaabde0f9..38d8fa84d66 100644 --- a/conf/locale/locale_nl-NL.ini +++ b/conf/locale/locale_nl-NL.ini @@ -9,11 +9,10 @@ sign_out=Uitloggen sign_up=Aanmelden register=Registreren website=Website -version=Versie page=Pagina template=Sjabloon language=Taal -create_new=Creëren... +create_new=Toevoegen... user_profile_and_more=Gebruikersprofiel en meer signed_in_as=Aangemeld als @@ -40,27 +39,31 @@ your_settings=Uw instellingen activities=Activiteiten pull_requests=Pull requests -issues=Kwesties +issues=Issues cancel=Annuleren +[status] +page_not_found=Pagina niet gevonden +internal_server_error=Interne Server Fout + [install] install=Installatie title=Installatiestappen voor de eerste keer opstarten docker_helper=Als u gebruik maakt Gogs binnen Docker, lees dan de richtlijnen voordat u iets veranderen op deze pagina! -requite_db_desc=Gogs vereist MySQL, PostgreSQL, SQite3 of TiDB. +requite_db_desc=Gogs heeft MySQL, PostgreSQL, SQLite3 of TiDB (via het MySQL protocool) nodig. db_title=Database-instellingen db_type=Database-type host=Host user=Gebruikersnaam password=Wachtwoord -db_name=Database naam +db_name=Databasenaam +db_schema=Schema 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 Gogs start als een service, geef dan een absoluut pad op. -err_empty_db_path=SQLite3 of TiDB databankpad mag niet leeg. -err_invalid_tidb_name=TiDB databank naam niet tekens kunnen "." en "-". +sqlite_helper=Het pad van de SQLite3-database.
Als u Gogs start als een service, geef dan een absoluut pad op. +err_empty_db_path=SQLite3 database pad mag niet leeg zijn. no_admin_and_disable_registration=Je kunt niet de registratie uit te schakelen zonder een beheerders account. err_empty_admin_password=Beheerder wachtwoord kan niet leeg zijn. @@ -75,12 +78,17 @@ 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. +use_builtin_ssh_server=Gebruik de ingebouwde SSH server +use_builtin_ssh_server_popup=Start de ingebouwde SSH server zodat de Git operaties herkenbaar zijn tegenover het systeem SSH Deamon. 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 log_root_path=Log-pad log_root_path_helper=Directory waar logbestanden opgeslagen worden. +enable_console_mode=Schakel Console modus in +enable_console_mode_popup=Naast de bestand modus print het ook de logs naar de console. +default_branch=Standaard branch optional_title=Optionele instellingen email_title=E-mail service instellingen @@ -96,8 +104,8 @@ offline_mode=Off line modus inschakelen offline_mode_popup=Schakel CDN uit in productiemodus, alle bestanden worden lokaal 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=Enable Federated Avatars Lookup -federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +federated_avatar_lookup=Federated Avatars zoekopdracht inschakelen +federated_avatar_lookup_popup=Schakel federated avatars zoekopdracht in om de op libravatar gebaseerde leveranciers te gebruiken. disable_registration=Schakel zelfregistratie uit disable_registration_popup=Schakel zelfregistratie uit, alleen admins kunnen accounts maken. enable_captcha=Inschakelen Captcha @@ -116,7 +124,10 @@ sqlite3_not_available=Uw versie biedt geen ondersteuning voor SQLite3, download invalid_db_setting=Uw database instellingen zijn niet correct: %v invalid_repo_path=Repositorie basis map is niet correct: %v run_user_not_match=De uitvoerende gebruiker is niet de huidig gebruiker: %s -> %s +smtp_host_missing_port=SMTP-Host mist een poort in het adres. +invalid_smtp_from=SMTP-van-veld is niet geldig: %v save_config_failed=Kan de configuratie niet opslaan: %v +init_failed=Programma initialiseren mislukt: %v invalid_admin_setting=Uw admin-instellingen zijn niet geldig: %v install_success=Welkom! Wij zijn veheugd dat u voor Gogs heeft gekozen, veel plezier en tot ziens invalid_log_root_path=Ongeldig log-pad: %v @@ -126,7 +137,7 @@ uname_holder=Gebruikersnaam of e-mail password_holder=Wachtwoord switch_dashboard_context=Wissel voorpaginacontext my_repos=Mijn repositories -show_more_repos=Show more repositories... +show_more_repos=Toon meer repositories... collaborative_repos=Gedeelde repositories my_orgs=Mijn organisaties my_mirrors=Mijn mirrors @@ -137,6 +148,7 @@ issues.in_your_repos=In uw repositories [explore] repos=Repositories users=Gebruikers +organizations=Organisaties search=Zoeken [auth] @@ -145,24 +157,33 @@ register_hepler_msg=Heeft u al een account? Meld u nu aan! social_register_hepler_msg=Heeft u al een account? Koppel 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. +auth_source=Authenticatiebron +local=Lokaal remember_me=Onthoud mij forgot_password=Wachtwoord vergeten forget_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. active_your_account=Activeer uw account -prohibit_login=Login Prohibited -prohibit_login_desc=Your account is prohibited to login, please contact site admin. +prohibit_login=Inloggen niet toegestaan +prohibit_login_desc=U mag met dit account niet inloggen, neem contact op met de websitebeheerder. resent_limit_prompt=Sorry, u heeft te snel na elkaar een aanvraag gedaan voor een activatie mail. Wacht drie minuten voor uw 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 reset_password=Reset uw wachtwoord invalid_code=Sorry, uw 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 zes karakters zijn. -non_local_account=Non-local accounts cannot change passwords through Gogs. +non_local_account=Niet lokale accounts mogen hun wachtwoord niet veranderen via Gogs. + +login_two_factor=Twee-traps authenticatie +login_two_factor_passcode=Authenticatie wachtwoord +login_two_factor_enter_recovery_code=Voer de two-factor herstelcode in +login_two_factor_recovery=Two-factor herstel +login_two_factor_recovery_code=Herstel code +login_two_factor_enter_passcode=Voer een two-factor wachtwoord in +login_two_factor_invalid_recovery_code=Herstelcode is al gebruikt of ongeldig. [mail] activate_account=Activeer uw account @@ -189,16 +210,17 @@ TeamName=Team naam AuthName=Autorisatienaam AdminEmail=E-mail beheerder -NewBranchName=New branch name -CommitSummary=Commit summary -CommitMessage=Commit message -CommitChoice=Commit choice +NewBranchName=Nieuwe branch naam +CommitSummary=Commit samenvatting +CommitMessage=Commit bericht +CommitChoice=Keuze toepassen 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_dot_slash_error=` moet een geldige alfanumeriek, (lage) streepje (-_), punt of een schuin karakter zijn.` size_error=moet groter zijn dan %s min_size_error=moet minimaal %s karakters bevatten. max_size_error=mag maximaal %s karakters bevatten. @@ -215,6 +237,7 @@ 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. +auth_source_mismatch=De geselecteerde authenticatiebron is niet gekoppeld aan de gebruiker. enterred_invalid_repo_name=U heeft een onjuiste repositorie naam ingevoerd. enterred_invalid_owner_name=U heeft een onjuiste eigenaar ingevoerd. enterred_invalid_password=U heeft een onjuiste wachtwoord ingevoerd. @@ -242,19 +265,18 @@ following=Volgt follow=Volg unfollow=Niet meer volgen -form.name_reserved=De gebruikersnaam '%s' is gereserveerd. -form.name_pattern_not_allowed=Het gebruikersnaam patroon '%s' is niet toegestaan. +form.name_not_allowed=User name or pattern %q is not allowed. [settings] profile=Profiel password=Wachtwoord avatar=Profielfoto ssh_keys=SSH-sleutels -social=Sociale netwerk-accounts -applications=Toepassingen +security=Beveiliging +repos=Repositories orgs=Organisaties +applications=Toepassingen delete=Verwijder account -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. @@ -295,6 +317,7 @@ delete_email=Verwijder email_deletion=E-mail Verwijderen email_deletion_desc=Dit e-mailadres verwijdert, worden gerelateerde informatie van uw account te verwijderen. Wil je verdergaan? email_deletion_success=E-mail is succesvol verwijderd! +email_deletion_primary=Kan het primaire e-mailadres niet verwijderen. add_new_email=Nieuw e-mailadres toevoegen add_email=E-mailadres toevoegen add_email_confirmation_sent=Een nieuwe bevestiging e-mail werd verstuurd naar '%s', gelieve uw inbox in de komende %d uren te controleren om het bevestigingsproces te voltooien. @@ -320,14 +343,36 @@ no_activity=Geen recente activiteiten key_state_desc=Deze sleutel werd gebruikt in de laatste 7 dagen token_state_desc=Deze token is de laatste 7 dagen gebruikt -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. +two_factor=Twee-factor authenticatie +two_factor_status=Status: +two_factor_on=Aan +two_factor_off=Uit +two_factor_enable=Inschakelen +two_factor_disable=Uitschakelen +two_factor_view_recovery_codes=View and save your recovery codes in a safe place. You can use them as passcode if you lose access to your authentication application. +two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use Personal Access Token as your credential, e.g. %[3]s. +two_factor_enable_title=Tweestapsverificatie inschakelen +two_factor_scan_qr=Please use your authentication application to scan the image: +two_factor_or_enter_secret=Of voer het geheim in: +two_factor_then_enter_passcode=Then enter passcode: +two_factor_verify=Verifiëren +two_factor_invalid_passcode=The passcode you entered is not valid, please try again! +two_factor_reused_passcode=The passcode you entered has already been used, please try another one! +two_factor_enable_error=Enable Two-factor authentication failed: %v +two_factor_enable_success=Two-factor authentication has enabled for your account successfully! +two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes +two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, please keep these codes in a safe place. +two_factor_regenerate_recovery_codes=Regenerate Recovery Codes +two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v +two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully! +two_factor_disable_title=Disable Two-factor Authentication +two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue? +two_factor_disable_success=Two-factor authentication has disabled successfully! manage_access_token=Persoonlijke toegangstokens beheren generate_new_token=Nieuwe Token genereren tokens_desc=Tokens die u hebt gegenereerd om toegang tot de Gogs APIs te verkrijgen. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=Zoals voor nu, moet elke token zal hebben volledige toegang tot uw account. token_name=Symbolische naam generate_token=Token genereren @@ -336,6 +381,16 @@ delete_token=Verwijderen access_token_deletion=Persoonlijke toegang token verwijderen access_token_deletion_desc=Verwijderen van deze persoonlijke toegang token 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. +token_name_exists=Token with same name already exists. + +orgs.none=U bent geen lid van een organisatie. +orgs.leave_title=Een organisatie verlaten +orgs.leave_desc=U verliest toegang tot alle repositories en teams nadat u de organisatie verlaten hebt. Wilt u doorgaan? + +repos.leave=Verlaat +repos.leave_title=Verlaat repository +repos.leave_desc=You will lose access to the repository after you left. Do you want to continue? +repos.leave_success=You have left repository '%s' successfully! delete_account=Verwijder uw account delete_prompt=Deze handeling zal uw account definitief verwijderen, u kunt dit NIET terug draaien! @@ -348,7 +403,9 @@ owner=Eigenaar repo_name=Naam van repository repo_name_helper=Een goede repository-naam is kort, makkelijk te onthouden en uniek. visibility=Zichtbaarheid +unlisted=Unlisted visiblity_helper=Deze repositorie is privaat +unlisted_helper=This repository is Unlisted visiblity_helper_forced=Sitebeheerder heeft alle nieuwe repositories gedwongen privé te zijn visiblity_fork_helper=(Verandering van deze waarde zal van invloed zijn op alle forks) clone_helper=De behoeftehulp van klonen? Bezoek helpen! @@ -357,7 +414,7 @@ fork_from=Afsplitsing van fork_visiblity_helper=U kunt de zichtbaarheid van een geforkte repository niet aanpassen. repo_desc=Omschrijving repo_lang=Taal -repo_gitignore_helper=Select .gitignore templates +repo_gitignore_helper=Selecteer .gitignore sjablonen license=Licentie license_helper=Selecteer een licentie bestand readme=Leesmij-bestand @@ -365,7 +422,7 @@ readme_helper=Selecteer een sjabloon voor het Leesmij-bestand auto_init=Initialiseer deze repositorie met de geselecteerde bestanden en sjabloon create_repo=Nieuwe repository default_branch=Standaard branch -mirror_prune=Prune +mirror_prune=Opschonen mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote mirror_interval=Mirror interval(uur) mirror_address=Kopie-adres @@ -374,24 +431,26 @@ mirror_last_synced=Laatste synchronisatie watchers=Volgers stargazers=Stargazers forks=Forks +repo_description_helper=Description of repository. Maximum 512 characters length. +repo_description_length=Available characters form.reach_limit_of_creation=De eigenaar heeft maximale creatie limiet van %d repositories bereikt. -form.name_reserved=Repositorienaam '%s' is gereserveerd. -form.name_pattern_not_allowed=Repositorie naampatroon '%s' is niet toegestaan. +form.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=Autorisatie vereist migrate_type=Migratie type migrate_type_helper=Deze repositorie zal een mirror zijn migrate_repo=Migreer repositorie migrate.clone_address=Clone adres -migrate.clone_address_desc=Dit kan een HTTP/HTTPS/GIT URL zijn of een lokaal pad. +migrate.clone_address_desc=Dit kan een HTTP/HTTPS/GIT URL zijn. +migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path. migrate.permission_denied=U bent niet toegestaan om deze lokale repositories te importeren. migrate.invalid_local_path=Ongeldig lokaal pad, het pad bestaat niet of het is geen map. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Migratie is mislukt: %v mirror_from=spiegel van forked_from=geforked van -fork_from_self=U kunt geen repository forken die u al beheert! copy_link=Kopieer copy_link_success=Gekopieerd! copy_link_error=Druk op ⌘-C of Ctrl-C om te kopiëren @@ -407,25 +466,36 @@ quick_guide=Snelstart gids clone_this_repo=Kloon deze repositorie create_new_repo_command=Maak een nieuwe repositorie aan vanaf de console push_exist_repo=Push een bestaande repositorie vanaf de console -repo_is_empty=Deze repositories is leeg is, probeer het later opnieuw! +bare_message=Deze repository bevat nog geen inhoud. -code=Code +files=Bestanden branch=Aftakking tree=Boom filter_branch_and_tag=Filter branch of tag branches=Aftakkingen tags=Labels -issues=Kwesties +issues=Issues pulls=Pull-aanvragen labels=Labels milestones=Mijlpalen commits=Commits +git_branches=Branches releases=Publicaties file_raw=Ruwe file_history=Geschiedenis file_view_raw=Weergave ruwe file_permalink=Permalink -file_too_large=This file is too large to be shown +file_too_large=Dit bestand is te groot om te worden getoond +video_not_supported_in_browser=Uw browser ondersteunt geen HTML5 video label. + +branches.overview=Overzicht +branches.active_branches=Active Branches +branches.stale_branches=Stale Branches +branches.all=All Branches +branches.updated_by=Updated %[1]s by %[2]s +branches.change_default_branch=Change Default Branch +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Nieuw bestand editor.upload_file=Bestand uploaden @@ -436,35 +506,38 @@ editor.edit_this_file=Bestand aanpassen editor.must_be_on_a_branch=Je moet in een branch zijn om aanpassingen te maken of voor te stellen editor.fork_before_edit=Je moet deze repository eerst vorken om dit bestand aan te kunnen passen editor.delete_this_file=Verwijder dit bestand -editor.must_have_write_access=You must have write access to make or propose changes to this file -editor.file_delete_success=File '%s' has been deleted successfully! -editor.name_your_file=Name your file... -editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. -editor.or=or -editor.cancel_lower=cancel -editor.commit_changes=Commit Changes -editor.add_tmpl=Add '%s/' -editor.add=Add '%s' -editor.update=Update '%s' -editor.delete=Delete '%s' -editor.commit_message_desc=Add an optional extended description... +editor.must_have_write_access=U moet schrijftoegang hebben om aanpassingen te maken of voor te stellen in dit bestand +editor.file_delete_success=Bestand '%s' is succesvol verwijderd! +editor.name_your_file=Bestandsnaam... +editor.filename_help=Om een map toe te voegen, begin met typen en druk op /. Om een map te verwijderen, ga naar het begin van het veld en druk op backspace. +editor.or=of +editor.cancel_lower=annuleren +editor.commit_changes=Wijzigingen toepassen +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.commit_directly_to_this_branch=Commit directly to the %s branch. editor.create_new_branch=Create a new branch for this commit and start a pull request. -editor.new_branch_name_desc=New branch name... -editor.cancel=Cancel -editor.filename_cannot_be_empty=Filename cannot be empty. -editor.branch_already_exists=Branch '%s' already exists in this repository. +editor.new_branch_name_desc=Naam nieuwe aftakking... +editor.cancel=Annuleren +editor.filename_cannot_be_empty=Bestandsnaam mag niet leeg zijn. +editor.branch_already_exists=Aftakking '%s' bestaat al in deze repository. editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. +editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor. editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. -editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. +editor.file_editing_no_longer_exists=Het bestand '%s' die u aan het bewerken bent bestaat niet meer in deze repository. editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. editor.file_already_exists=A file with name '%s' already exists in this repository. -editor.no_changes_to_show=There are no changes to show. +editor.no_changes_to_show=Er zijn geen wijzigingen om weer te geven. editor.fail_to_update_file=Failed to update/create file '%s' with error: %v -editor.add_subdir=Add subdirectory... +editor.fail_to_delete_file=Failed to delete file '%s' with error: %v +editor.add_subdir=Submap toevoegen... editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v -editor.upload_files_to_dir=Upload files to '%s' +editor.upload_files_to_dir=Bestanden uploaden naar '%s' +commits.commit_history=Commit History commits.commits=Commits commits.search=Zoeken commits.find=zoek @@ -491,9 +564,9 @@ issues.new_label=Nieuw Label issues.new_label_placeholder=Tekst label... issues.create_label=Maak label issues.label_templates.title=Load a predefined set of labels -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.helper=Select a label set -issues.label_templates.use=Use this label set +issues.label_templates.info=Er zijn nog geen labels. U kunt op de 'Nieuw label'-knop drukken om een nieuwe toe te voegen of een voorgedefinieerde set hieronder gebruiken. +issues.label_templates.helper=Selecteer een labelset +issues.label_templates.use=Deze labelset gebruiken issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v issues.open_tab=%d Open issues.close_tab=%d gesloten @@ -504,7 +577,7 @@ 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.all_issues=Alle issues issues.filter_type.assigned_to_you=Aan jou toegewezen issues.filter_type.created_by_you=Aangemaakt door jou issues.filter_type.mentioning_you=Vermelden jou @@ -522,8 +595,8 @@ issues.next=Volgende issues.open_title=Open issues.closed_title=Gesloten issues.num_comments=%d opmerkingen -issues.commented_at=`commented %s` -issues.delete_comment_confirm=Are you sure you want to delete this comment? +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 @@ -551,8 +624,8 @@ 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.num_participants=%d deelnemers -issues.attachment.open_tab=`Click to see "%s" in a new tab` -issues.attachment.download=`Click to download "%s"` +issues.attachment.open_tab=`Klik om "%s" in een nieuw tabblad te bekijken` +issues.attachment.download=`Klik om te downloaden "%s"` pulls.new=Nieuwe Pull aanvraag pulls.compare_changes=Vergelijk veranderingen @@ -562,6 +635,7 @@ pulls.compare_compare=vergelijk pulls.filter_branch=Filter branch pulls.no_results=Geen resultaten gevonden. pulls.nothing_to_compare=Er is niets te vergelijken omdat base en head branches dezelfde zijn. +pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history. pulls.has_pull_request=' Er is al een pull-aanvraag tussen deze twee targets: %[2]s #% [3]d' pulls.create=Pull verzoek aanmaken pulls.title_desc=wil %[1]d commits van %[2]s samenvoegen met %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=Controle van conflicten is nog bezig, ververs deze pagina in e 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.create_merge_commit=Create a merge commit +pulls.rebase_before_merging=Rebase before merging +pulls.commit_description=Commit Description 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. +pulls.delete_branch=Aftakking verwijderen +pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence. milestones.new=Nieuwe mijlpaal milestones.open_tab=%d geopend @@ -625,35 +704,65 @@ wiki.last_updated=Laatst bijgewerkt: %s settings=Instellingen settings.options=Opties settings.collaboration=Samenwerking -settings.collaboration.admin=Admin -settings.collaboration.write=Write -settings.collaboration.read=Read -settings.collaboration.undefined=Undefined +settings.collaboration.admin=Beheer +settings.collaboration.write=Schrijven +settings.collaboration.read=Lezen +settings.collaboration.undefined=Niet gedefinieerd +settings.branches=Branches +settings.branches_bare=You cannot manage branches for bare repository. Please push some content first. +settings.default_branch=Default Branch +settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing. +settings.update=Bijwerken +settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server. +settings.update_default_branch_success=Default branch of this repository has been updated successfully! +settings.protected_branches=Protected Branches +settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers. +settings.choose_a_branch=Choose a branch... +settings.branch_protection=Branch Protection +settings.branch_protection_desc=Please choose protect options for branch %s. +settings.protect_this_branch=Protect this branch +settings.protect_this_branch_desc=Disable force pushes and prevent from deletion. +settings.protect_require_pull_request=Require pull request instead direct pushing +settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request. +settings.protect_whitelist_committers=Whitelist who can push to this branch +settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check. +settings.protect_whitelist_users=Users who can push to this branch +settings.protect_whitelist_search_users=Doorzoek gebruikers +settings.protect_whitelist_teams=Teams for which members of them can push to this branch +settings.protect_whitelist_search_teams=Search teams +settings.update_protect_branch_success=Protect options for this branch has been updated successfully! settings.hooks=Webhooks settings.githooks=Git-hooks settings.basic_settings=Basis instellingen settings.mirror_settings=Mirror Settings -settings.sync_mirror=Sync Now +settings.sync_mirror=Nu synchroniseren settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. settings.site=Officiële site settings.update_settings=Instellingen bewerken settings.change_reponame_prompt=Deze verandering zal gevolgen hebben voor hoe links zich verhouden tot de repository. settings.advanced_settings=Geavanceerde opties -settings.wiki_desc=Enable wiki system -settings.use_internal_wiki=Use builtin wiki +settings.wiki_desc=Wiki-systeem inschakelen +settings.use_internal_wiki=Ingebouwde wiki gebruiken +settings.allow_public_wiki_desc=Allow public access to wiki when repository is private settings.use_external_wiki=Externe wiki gebruiken settings.external_wiki_url=Externe wiki-URL settings.external_wiki_url_desc=Bezoekers worden doorgestuurd naar de URL als ze op het tabblad klikken. -settings.issues_desc=Enable issue tracker -settings.use_internal_issue_tracker=Use builtin lightweight issue tracker +settings.issues_desc=Issuetracker inschakelen +settings.use_internal_issue_tracker=Gebruik ingebouwde eenvoudige issuetracker +settings.allow_public_issues_desc=Allow public access to issues when repository is private settings.use_external_issue_tracker=Externe issuetracker gebruiken +settings.external_tracker_url=URL externe issuetracker +settings.external_tracker_url_desc=Bezoekers worden doorgestuurd naar de URL als ze op het tabblad klikken. settings.tracker_url_format=URL-formaat externe issuetracker -settings.tracker_issue_style=External Issue Tracker Naming Style: -settings.tracker_issue_style.numeric=Numeric -settings.tracker_issue_style.alphanumeric=Alphanumeric +settings.tracker_issue_style=Naamgevingstijl 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.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Ignore changes in whitespace +settings.pulls.allow_rebase_merge=Allow use rebase to merge commits settings.danger_zone=Gevaren zone +settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner. settings.new_owner_has_same_repo=De nieuwe eigenaar heeft al een repositorie met deze naam settings.convert=Converteren naar gewone repository settings.convert_desc=U kunt deze mirror converteren naar een gewone repository. Dit kan niet ongedaan worden gemaakt. @@ -672,7 +781,7 @@ settings.wiki_deletion_success=De repository met wiki data is succesvol gewist. settings.delete=Verwijder deze repositorie settings.delete_desc=Als u eenmaal een repositorie 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.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access. settings.delete_notices_fork_1=- All forks will become independent after deletion. settings.deletion_success=Repository is succesvol verwijderd! settings.update_settings_success=Repositorie instellingen zijn succesvol bijgewerkt. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Deze gebruiker zal niet langer toegang hebbe settings.remove_collaborator_success=medewerker is verwijderd. 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 Gogs 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.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=Webhook toevoegen 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.redelivery=Redelivery +settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. settings.webhook.request=Verzoek settings.webhook.response=Antwoord settings.webhook.headers=Headers settings.webhook.payload=Lading settings.webhook.body=Inhoud +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. 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. settings.githook_edit_desc=Als haak niet actief is, zal monster inhoud worden gepresenteerd. Verlof inhoud leeg zal deze haak uitschakelen. settings.githook_name=Haak naam @@ -711,6 +825,7 @@ settings.add_webhook_desc=We sturen een POST-aanvraag naar de onder settings.payload_url=Nettolading URL settings.content_type=Content type settings.secret=Geheim +settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. settings.slack_username=Gebruikersnaam settings.slack_icon_url=Icoon URL settings.slack_color=Kleur @@ -720,10 +835,20 @@ 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_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. +settings.event_delete=Verwijderen +settings.event_delete_desc=Branch or tag deleted +settings.event_fork=Fork +settings.event_fork_desc=Repository forked settings.event_push=Push settings.event_push_desc=Git push naar een repository +settings.event_issues=Issues +settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned. +settings.event_pull_request=Pull request +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=Issue Comment +settings.event_issue_comment_desc=Issue comment created, edited, or deleted. +settings.event_release=Release +settings.event_release_desc=Release published in a 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. @@ -733,10 +858,13 @@ settings.delete_webhook=Webhook verwijderen settings.recent_deliveries=Recente bezorgingen settings.hook_type=Type hook settings.add_slack_hook_desc= toegestane vertraging integratie toevoegen aan uw repository. +settings.add_discord_hook_desc=Add Discord integration to your repository. +settings.add_dingtalk_hook_desc=Add Dingtalk integration to your repository. settings.slack_token=Slack token settings.slack_domain=Slack domein settings.slack_channel=Slack kanaal settings.deploy_keys=Installeer sleutels +settings.deploy_keys_helper=Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. settings.add_deploy_key=Toevoegen deploy sleutel settings.deploy_key_desc=Sleutels voor uitrol hebben enkel leesrechten. Ze zijn niet dezelfde als de SSH sleutels van persoonlijke accounts. settings.no_deploy_keys=U hebt nog geen deploy sleutels toegevoegd. @@ -748,6 +876,8 @@ 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 repositorie. Wilt u doorgaan? settings.deploy_key_deletion_success=Deploy sleutel werd met succes verwijderd! +settings.description_desc=Description of repository. Maximum 512 characters length. +settings.description_length=Available characters diff.browse_source=Bladeren bron diff.parent=bovenliggende @@ -766,7 +896,6 @@ release.releases=Releases release.new_release=Nieuwe release release.draft=Concept release.prerelease=Voorlopige versie -release.stable=Stabiel release.edit=bewerken release.ahead=%d aanpassingen aan %s sinds deze versie release.source_code=Broncode @@ -791,7 +920,7 @@ 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=Tag name is not valid. +release.tag_name_invalid=Labelnaam is niet geldig. release.downloads=Downloads [org] @@ -813,8 +942,8 @@ team_name_helper=U gebruikt deze naam om dit team te vermelden in conversaties. team_desc_helper=Waar gaat dit team doen? 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.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=Instellingen settings.options=Opties @@ -847,7 +976,7 @@ members.invite_desc=Voeg nieuw lid toe aan %s: members.invite_now=Nu uitnodigen teams.join=Lid worden -teams.leave=Vertlaat +teams.leave=Verlaat 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 @@ -886,12 +1015,19 @@ first_page=Eerste last_page=Laatste total=Totaal: %d +dashboard.build_info=Build Information +dashboard.app_ver=Application version +dashboard.git_version=Git version +dashboard.go_version=Go version +dashboard.build_time=Build time +dashboard.build_commit=Build commit dashboard.statistic=Statistieken dashboard.operations=Bewerkingen dashboard.system_status=Status Systeemmonitor dashboard.statistic_info=Gogs database heeft %d gebruikers, %d organisaties, %d openbare sleutels, %d repositories, %d volgers, %d sterren, %d acties, %d participanten, %d issues, %d reacties, %d sociale accounten, %d volgers, %d mirrors, %d publicaties, %d login bronnen, %d webhooks, %d mijlpalen, %d labels, %d hook taken, %d teams, %d bijgewerkte taken, %d bijlagen. dashboard.operation_name=Bewerking naam dashboard.operation_switch=Omschakelen +dashboard.select_operation_to_run=Please select operation to run dashboard.operation_run=Uitvoeren dashboard.clean_unbind_oauth=Clean unbound OAuths dashboard.clean_unbind_oauth_success=Alle OAuthes binding hebben verwijderd. @@ -905,8 +1041,8 @@ 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 Gogs zijn zullen verloren gaan!) dashboard.resync_all_sshkeys_success=Alle publieke sleutels zijn herschreven. -dashboard.resync_all_update_hooks=Herschrijf alle repositorie-hooks (nodig als de configuratie bestandslocatie is gewijzigd) -dashboard.resync_all_update_hooks_success=Alle repositorie-hooks zijn herschreven. +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=Alle repositories zonder Git files opnieuw initialiseren dashboard.reinit_missing_repos_success=Alle repositories zonder Git files zijn succesvol opnieuw geinitializeerd. @@ -959,14 +1095,14 @@ 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=This account is prohibited to login +users.prohibit_login=Dit account is verboden om in te loggen 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.update_profile=Account profiel bijwerken users.delete_account=Dit account verwijderen users.still_own_repo=Dit account is nog steeds eigendom van een repositorie. U moet deze repositorie eerst verwijderen of overdragen. -users.still_has_org=Deze account nog steeds lidmaatschap van organisatie, u hebt naar links of hen eerst verwijderen. +users.still_has_org=Dit account is nog lid van ten minste één organisatie. Zeg dit lidmaatschap voor dit account op of verwijder de organisatie eerst. users.deletion_success=Het account is verwijderd! orgs.org_manage_panel=Organisaties beheren @@ -980,30 +1116,38 @@ repos.name=Naam repos.private=Prive repos.watches=Volgers repos.stars=Sterren -repos.issues=Kwesties +repos.issues=Issues +repos.size=Size -auths.auth_manage_panel=Authenticatie-beheer paneel +auths.auth_sources=Authenticatiebronnen auths.new=Nieuwe bron toevoegen auths.name=Naam auths.type=Type auths.enabled=Ingeschakeld +auths.default=Default auths.updated=Bijgewerkt auths.auth_type=Authenticatietype auths.auth_name=Authenticatienaam -auths.security_protocol=Security Protocol +auths.security_protocol=Beveiligingsprotocol auths.domain=Domein auths.host=Host auths.port=Poort auths.bind_dn=Binden DN +auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s auths.bind_password=Bind wachtwoord auths.bind_password_helper=Opgelet: Dit wachtwoord wordt opgeslagen als leesbare tekst. Gebruik geen account met verhoogde rechten. auths.user_base=User Search Base auths.user_dn=User DN auths.attribute_username=Gebruikersnaam attribuut auths.attribute_username_placeholder=Laat leeg om het login veld van het formulier te gebruiken als gebruikersnaam. -auths.attribute_name=Voornaam attribuut +auths.attribute_name=First Name Attribute auths.attribute_surname=Achternaam attribuut auths.attribute_mail=E-mail attribuut +auths.verify_group_membership=Verify group membership +auths.group_search_base_dn=Group Search Base DN +auths.group_filter=Group Filter +auths.group_attribute_contain_user_list=Group Attribute Containing List of Users +auths.user_attribute_listed_in_group=User Attribute Listed in Group auths.attributes_in_bind=Verkrijg attributes van de Bind DN context auths.filter=Gebruikersfilter auths.admin_filter=Beheerdersfilter @@ -1017,9 +1161,9 @@ auths.enable_tls=Activeer TLS-encryptie auths.skip_tls_verify=TLS-verificatie overslaan auths.pam_service_name=PAM servicenaam auths.enable_auto_register=Activeer automatische registratie -auths.tips=Tips auths.edit=Verificatie-instelling bewerken auths.activated=Deze autorisatiemethode is geactiveerd +auths.default_auth=Deze authenticatie bron is de standaard bron auths.new_success=Nieuwe authenticatie '%s' werd toegevoegd. auths.update_success=Authenticatie instellingen zijn succesvol gewijzigd. auths.update=Authenticatie-instellingen bijwerken @@ -1027,108 +1171,190 @@ auths.delete=Deze authenticatiewijze verwijderen auths.delete_auth_title=Authenticatie verwijderd auths.delete_auth_desc=Deze authenticatie zal verwijderd worden, wil je verdergaan? auths.still_in_used=This authentication 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.deletion_success=Authenticatie is met succes verwijderd! +auths.login_source_exist=Login source '%s' already exists. +auths.github_api_endpoint=API Endpoint +config.not_set=(not set) config.server_config=Serverconfiguratie -config.app_name=Applicatienaam -config.app_ver=Applicatieversie -config.app_url=Applicatie-URL -config.domain=Domein -config.offline_mode=Offline-modus -config.disable_router_log=Router-log uitschakelen +config.brand_name=Brand name config.run_user=Uitvoerende gebruiker config.run_mode=Uitvoer modus -config.repo_root_path=Repositorie basis pad -config.static_file_root_path=Statische bestanden basis pad -config.log_file_root_path=Log bestand basis pad -config.script_type=Script type -config.reverse_auth_user=Omgekeerde verificatie gebruiker +config.server.external_url=External URL +config.server.domain=Domain +config.server.protocol=Protocol +config.server.http_addr=HTTP address +config.server.http_port=HTTP port +config.server.cert_file=Certificate file +config.server.key_file=Key file +config.server.tls_min_version=Minimum TLS version +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Enable Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL 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 -config.ssh_root_path=Root-pad -config.ssh_key_test_path=Pad voor key-tests -config.ssh_keygen_path=Pad van keygen ('ssh-keygen') -config.ssh_minimum_key_size_check=Controleer minimale key-lengte -config.ssh_minimum_key_sizes=Minimale key-lengtes +config.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Repository configuration +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit 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 -config.db_ssl_mode_helper=(alleen voor "postgres") -config.db_path=Pad -config.db_path_helper=(voor "sqlite3" en "tidb") - -config.service_config=Serviceconfiguratie -config.register_email_confirm=E-mailbevestiging registreren -config.disable_register=Registratie uitgeschakeld -config.show_registration_button=Registeren knop weergeven -config.require_sign_in_view=Inloggen vereist om te kunnen inzien -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.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -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 -config.oauth_enabled=Ingeschakeld +config.session_config=Sessieconfiguratie +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Cache-configuratie -config.cache_adapter=Cache-adapter -config.cache_interval=Cache-interval -config.cache_conn=Cache-connectie - -config.session_config=Sessieconfiguratie -config.session_provider=Sessieprovider -config.provider_config=Provider config -config.cookie_name=Cookie naam -config.enable_set_cookie=Set Cookie inschakelen -config.gc_interval_time=GC interval time -config.session_life_time=Sessie duur -config.https_only=Alleen HTTPS -config.cookie_life_time=Cookie duur leeftijd +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP configuration +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Foto configuratie -config.picture_service=Foto service -config.disable_gravatar=Gravatar uitschakelen -config.enable_federated_avatar=Enable Federated Avatars - -config.git_config=Git Configuration -config.git_disable_diff_highlight=Disable Diff Syntax Highlight -config.git_max_diff_lines=Max Diff Lines (for a single file) -config.git_max_diff_line_characters=Max Diff Characters (for a single line) -config.git_max_diff_files=Max Diff Files (to be shown) -config.git_gc_args=GC Arguments -config.git_migrate_timeout=Migration Timeout -config.git_mirror_timeout=Mirror Update Timeout -config.git_clone_timeout=Clone Operation Timeout -config.git_pull_timeout=Pull Operation Timeout -config.git_gc_timeout=GC Operation Timeout +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Webhook configuratie +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Gitconfiguratie +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path config.log_config=Logconfiguratie -config.log_mode=Log-modus +config.log_file_root_path=Log bestand basis pad +config.log_mode=Mode +config.log_options=Options monitor.cron=Cron-taken monitor.name=Naam @@ -1157,19 +1383,26 @@ notices.delete_success=System notices have been deleted successfully. [action] create_repo=repositorie aangemaakt in %s -rename_repo=renamed repository from %[1]s to %[3]s +rename_repo=hernoemde repository van %[1]s naar %[3]s commit_repo=push update naar %[3]s in %[4]s +compare_commits=Toon vergelijking voor deze %d commits +transfer_repo=repositorie verplaatst naar %s naar %s create_issue=`opende issue in %s#%[2]s` -close_issue=`closed issue %s#%[2]s` -reopen_issue=`reopened issue %s#%[2]s` -create_pull_request=`created pull request %s#%[2]s` -close_pull_request=`closed pull request %s#%[2]s` -reopen_pull_request=`reopened pull request %s#%[2]s` +close_issue=`gesloten issue %s#%[2]s` +reopen_issue=`heropende issue %s#%[2]s` comment_issue=`reactie op issue %s#%[2]s` -merge_pull_request=`merged pull request %s#%[2]s` -transfer_repo=repositorie verplaatst naar %s naar %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` +merge_pull_request=`voegde pull request samen %s#%[2]s` +create_branch=created new branch %[3]s at %[4]s +delete_branch=deleted branch %[2]s at %[3]s push_tag=geduwd label %[2]s naar %[3]s -compare_commits=Toon vergelijking voor deze %d commits +delete_tag=deleted tag %[2]s at %[3]s +fork_repo=forked a repository to %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror [tool] ago=geleden @@ -1191,6 +1424,7 @@ months=%d maanden %s years=%d jaren %s raw_seconds=seconden raw_minutes=minuten +raw_hours=hours [dropzone] default_message=Drop bestanden hier of klik om te uploaden. diff --git a/conf/locale/locale_pl-PL.ini b/conf/locale/locale_pl-PL.ini index cabffb1db36..6eaab7b746b 100644 --- a/conf/locale/locale_pl-PL.ini +++ b/conf/locale/locale_pl-PL.ini @@ -9,7 +9,6 @@ sign_out=Wyloguj sign_up=Zarejestruj się register=Zarejestruj się website=Strona -version=Wersja page=Strona template=Szablon language=Język @@ -44,23 +43,27 @@ issues=Problemy cancel=Anuluj +[status] +page_not_found=Strona nie została znaleziona +internal_server_error=Wewnętrzny błąd serwera + [install] install=Instalacja title=Kroki instalacyjne dla pierwszego uruchomienia docker_helper=Jeśli używasz Gogs wewnątrz Dockera, proszę przeczytaj wytyczne, zanim zmienisz coś na tej stronie! -requite_db_desc=Gogs wymaga MySQL, PostgreSQL, SQLite3 lub TiDB. +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title=Ustawienia bazy danych db_type=Typ bazy danych host=Host user=Użytkownik password=Hasło db_name=Nazwa bazy danych +db_schema=Schema 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 "-". +sqlite_helper=Ścieżka do pliku bazy danych SQLite3.
Proszę użyć ścieżki bezwzględnej podczas uruchamiania usługi. +err_empty_db_path=Ścieżka do pliku bazy danych SQLite3 nie może być pusta. 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. @@ -75,18 +78,23 @@ 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; pozostaw puste, aby wyłączyć funkcję SSH. +use_builtin_ssh_server=Użyj wbudowanego serwera SSH +use_builtin_ssh_server_popup=Uruchom wbudowany serwer SSH dla odróżnienia operacji GIT od systemowego demona 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. +enable_console_mode=Włącz tryb konsolowy +enable_console_mode_popup=Oprócz zapisywania do pliku wyświetlaj logi także w konsoli. +default_branch=Default Branch 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" . +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 @@ -96,8 +104,8 @@ 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=Enable Federated Avatars Lookup -federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +federated_avatar_lookup=Włączyć wyszukiwanie avatarów w powiązanych systemach +federated_avatar_lookup_popup=Włączyć wyszukiwanie avatarów w powiązanych systemach opartych na usłudze libravatar. disable_registration=Wyłącz samodzielną rejestrację disable_registration_popup=Wyłącz samodzielną rejestrację użytkownika, tylko administrator będzie mógł tworzyć konta. enable_captcha=Włącz Captcha @@ -111,12 +119,15 @@ admin_password=Hasło confirm_password=Potwierdź hasło admin_email=E-mail administratora install_gogs=Zainstaluj Gogs -test_git_failed=Nie udało się przetestować polecenia "git": %v +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 +smtp_host_missing_port=W SMTP Host brakuje portu w adresie. +invalid_smtp_from=Pole SMTP OD nie jest prawidłowe: %v save_config_failed=Nie udało się zapisać konfiguracji: %v +init_failed=Nie udało się zainicjować aplikacji: %v invalid_admin_setting=Nieprawidłowe ustawienia konta admina: %v install_success=Cześć! Cieszymy się, że wybierałeś Gogs, baw się dobrze. invalid_log_root_path=Ścieżka dla logów jest niepoprawna: %v @@ -137,6 +148,7 @@ issues.in_your_repos=W Twoich repozytoriach [explore] repos=Repozytoria users=Użytkownicy +organizations=Organizacje search=Wyszukiwanie [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Masz już konto? Zaloguj się teraz! social_register_hepler_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. +auth_source=Źródło uwierzytelniania +local=Lokalne remember_me=Zapamiętaj mnie forgot_password=Zapomniałem hasła forget_password=Zapomniałeś hasła? @@ -156,7 +170,6 @@ prohibit_login_desc=Nie możesz się zalogować na to konto, skontaktuj się z 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. @@ -164,6 +177,14 @@ reset_password_helper=Kliknij tutaj, aby zresetować hasło password_too_short=Długość hasła nie może być mniejsza niż 6 znaków. non_local_account=Nie lokalne konta nie mogą zmieniać haseł przez Gogs. +login_two_factor=Weryfikacja dwuetapowa +login_two_factor_passcode=Kod uwierzytelniania +login_two_factor_enter_recovery_code=Wprowadź kod odzyskiwania weryfikacji dwuetapowej +login_two_factor_recovery=Dwuetapowe odzyskiwanie kodu +login_two_factor_recovery_code=Kod odzyskiwania +login_two_factor_enter_passcode=Wprowadź hasło dwuetapowe +login_two_factor_invalid_recovery_code=Kod odzyskiwania został już wykorzystany lub nie jest prawidłowy. + [mail] activate_account=Prosimy aktywować swoje konto activate_email=Potwierdź swój adres e-mail @@ -190,15 +211,16 @@ AuthName=Nazwa autoryzacji AdminEmail=E-mail administratora NewBranchName=Nazwa nowej gałęzi -CommitSummary=Commit summary -CommitMessage=Commit message -CommitChoice=Commit choice +CommitSummary=Podsumowanie commitu +CommitMessage=Wiadomość commitu +CommitChoice=Wybór commitu TreeName=Ścieżka pliku -Content=Content +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.` +alpha_dash_dot_slash_error=` musi być alfa/numeryczny lub zawierać daszek, myślnik, kropkę lub ukośnik.` 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.` @@ -215,6 +237,7 @@ 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. +auth_source_mismatch=Wybrane źródło uwierzytelniania nie jest związane z użytkownikiem. 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. @@ -242,19 +265,18 @@ 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. +form.name_not_allowed=Nazwa użytkownika lub wzór %q jest niedozwolony. [settings] profile=Profil password=Hasło -avatar=Avatar +avatar=Awatar ssh_keys=Klucze SSH -social=Konta społecznościowe -applications=Aplikacje +security=Bezpieczeństwo +repos=Repozytoria orgs=Organizacje +applications=Aplikacje 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ę. @@ -269,8 +291,8 @@ change_username_prompt=Ta zmiana wpłynie na sposób w jaki łącza odnoszą si continue=Kontynuuj cancel=Anuluj -lookup_avatar_by_mail=Lookup Avatar by mail -federated_avatar_lookup=Federated Avatar Lookup +lookup_avatar_by_mail=Wyszukaj Avatar po mailu +federated_avatar_lookup=Wyszukiwanie Avatarów w powiązanych systemach enable_custom_avatar=Włącz niestandardowe awatary choose_new_avatar=Wybierz nowy avatar update_avatar=Zaktualizuj ustawienia awatara @@ -295,6 +317,7 @@ 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! +email_deletion_primary=Cannot delete primary email address. 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. @@ -320,14 +343,36 @@ 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. +two_factor=Weryfikacja dwuetapowa +two_factor_status=Status: +two_factor_on=Włączony +two_factor_off=Wyłączony +two_factor_enable=Włącz +two_factor_disable=Wyłącz +two_factor_view_recovery_codes=Wyświetl i zapisz Twoje kody odzyskiwania w bezpiecznym miejscu. Można użyć ich jako kod dostępu, jeśli stracisz dostęp do aplikacji uwierzytelniania. +two_factor_http=Dla operacji HTTP/HTTPS już nie jest obsługiwana zwykła nazwa użytkownika i hasło. Prosimy o tworzenie i używanie osobistych tokenów dostępu jako swoich poświadczeń, np.: %[3]s. +two_factor_enable_title=Włącz weryfikację dwuetapową +two_factor_scan_qr=Proszę używać uwierzytelniania aplikacji do skanowania obrazów: +two_factor_or_enter_secret=Lub wprowadź sekret: +two_factor_then_enter_passcode=Następnie wprowadź kod dostępu: +two_factor_verify=Weryfikuj +two_factor_invalid_passcode=Wprowadzony kod nie jest prawidłowy, spróbuj ponownie! +two_factor_reused_passcode=Ten kod jest już używany, spróbuj ponownie! +two_factor_enable_error=Włączenie dwuetapowego uwierzytelniania nie powiodło się: %v +two_factor_enable_success=Uwierzytelnianie dwuetapowe Twojego konta zostało włączone pomyślnie! +two_factor_recovery_codes_title=Kody odzyskiwania uwierzytelniania dwuetapowego +two_factor_recovery_codes_desc=Kody odzyskiwania są używane, gdy tymczasowo utracić dostęp do aplikacji uwierzytelniania. Każdy kod odzyskiwania może być tylko używany raz, Proszę zachować te kody w bezpiecznym miejscu. +two_factor_regenerate_recovery_codes=Ponownie wygeneruj kody odzyskiwania +two_factor_regenerate_recovery_codes_error=Ponowne wygenerowanie kodu odzyskiwania nie powiodło się: %v +two_factor_regenerate_recovery_codes_success=Nowy kod odzyskiwania został wygenerowany pomyślnie! +two_factor_disable_title=Wyłącz weryfikację dwuetapową +two_factor_disable_desc=Poziom zabezpieczeń konta zmniejszy się po wyłączeniu uwierzytelnianie dwuetapowego. Czy chcesz kontynuować? +two_factor_disable_success=Uwierzytelnianie dwuetapowe wyłączono pomyślnie! 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 Gogs. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. 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 @@ -336,6 +381,16 @@ 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. +token_name_exists=Token o takiej nawie już istniej. + +orgs.none=Nie jesteś członkiem żadnej organizacji. +orgs.leave_title=Opuść organizację +orgs.leave_desc=Po opuszczeniu organizacji utracisz dostęp do wszystkich repozytoriów i zespołów. Czy chcesz kontynuować? + +repos.leave=Opuść +repos.leave_title=Opuść repozytorium +repos.leave_desc=Po opuszczeniu, stracisz dostęp do repozytorium. Czy chcesz kontynuować? +repos.leave_success=Pomyślnie opuściłeś repozytorium '%s'! delete_account=Usuń swoje konto delete_prompt=Ta operacja trwale usunie Twoje konto i NIE MOŻE zostać cofnięta! @@ -348,7 +403,9 @@ 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ść +unlisted=Unlisted visiblity_helper=To repozytorium jest prywatne +unlisted_helper=This repository is Unlisted 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! @@ -357,7 +414,7 @@ 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=Select .gitignore templates +repo_gitignore_helper=Wybierz szablony pliku .gitignore license=Licencja license_helper=Wybierz plik licencji readme=Readme @@ -370,28 +427,30 @@ mirror_prune_desc=Usuń wszystkie śledzone odwołania które nie istnieją w zd 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=Last Synced +mirror_last_synced=Ostatnia synchronizacja watchers=Obserwujący stargazers=Polubienia forks=Forki +repo_description_helper=Opis repozytorium. Maksymalnie 512 znaków. +repo_description_length=Dostępne znaki 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. +form.name_not_allowed=Nazwa repozytorium lub wzór %q jest niedozwolony. need_auth=Wymaga autoryzacji migrate_type=Typ migracji migrate_type_helper=To repozytorium będzie kopią lustrzaną migrate_repo=Przenieś repozytorium migrate.clone_address=Sklonuj adres -migrate.clone_address_desc=To może być adres HTTP/HTTPS/GIT lub ścieżka lokalna serwera. +migrate.clone_address_desc=URL może być adresem HTTP/HTTPS/GIT. +migrate.clone_address_desc_import_local=Masz także możliwość migracji repozytorium przez ścieżka serwera lokalnego. migrate.permission_denied=Nie możesz importować lokalnych repozytoriów. migrate.invalid_local_path=Ścieżka jest niepoprawna. Nie istnieje lub nie jest katalogiem. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Migracja nie powiodła się: %v mirror_from=kopia lustrzana forked_from=sklonowany z -fork_from_self=Nie możesz forkować swojego własnego repozytorium! copy_link=Kopiuj copy_link_success=Skopiowane! copy_link_error=Naciśnij klawisze ⌘-C i Ctrl-C, aby skopiować @@ -407,9 +466,9 @@ 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! +bare_message=To repozytorium nie ma jeszcze żadnej zawartości. -code=Kod +files=Pliki branch=Gałąź tree=Drzewo filter_branch_and_tag=Filtruj gałąź lub tag @@ -420,51 +479,65 @@ pulls=Oczekujące zmiany labels=Etykiety milestones=Kamienie milowe commits=Commity +git_branches=Gałęzie releases=Wydania file_raw=Czysty file_history=Historia file_view_raw=Zobacz czysty file_permalink=Bezpośredni odnośnik file_too_large=Ten plik jest zbyt duży, aby go wyświetlić - -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.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 +video_not_supported_in_browser=Twoja przeglądarka nie obsługuje znacznika HTML5 video. + +branches.overview=Przegląd +branches.active_branches=Aktywne gałęzie +branches.stale_branches=Stare gałęzie +branches.all=Wszystkie gałęzie +branches.updated_by=Zaktualizowano %[1]s przez %[2]s +branches.change_default_branch=Zmiana domyślnej gałęzi +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +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 -editor.delete_this_file=Delete this file -editor.must_have_write_access=You must have write access to make or propose changes to this file -editor.file_delete_success=File '%s' has been deleted successfully! -editor.name_your_file=Name your file... -editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. -editor.or=or -editor.cancel_lower=cancel -editor.commit_changes=Commit Changes -editor.add_tmpl=Add '%s/' -editor.add=Add '%s' -editor.update=Update '%s' -editor.delete=Delete '%s' -editor.commit_message_desc=Add an optional extended description... -editor.commit_directly_to_this_branch=Commit directly to the %s branch. -editor.create_new_branch=Create a new branch for this commit and start a pull request. -editor.new_branch_name_desc=New branch name... -editor.cancel=Cancel -editor.filename_cannot_be_empty=Filename cannot be empty. -editor.branch_already_exists=Branch '%s' already exists in this repository. -editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. -editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. -editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. -editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. -editor.file_already_exists=A file with name '%s' already exists in this repository. -editor.no_changes_to_show=There are no changes to show. -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.delete_this_file=Usuń ten plik +editor.must_have_write_access=Musisz mieć uprawnienia do zapisu aby zgłosić lub zaproponować zmiany do tego pliku +editor.file_delete_success=Plik '%s' został usunięty pomyślnie! +editor.name_your_file=Nazwij plik... +editor.filename_help=Aby dodać katalog, wpisz nazwę i naciśnij przycisk /. Aby usunąć katalog, przejdź do początku pola i naciśnij klawisz backspace. +editor.or=lub +editor.cancel_lower=anuluj +editor.commit_changes=Zatwierdź zmiany +editor.add_tmpl=Dodaj '%s/' +editor.add=Dodaj '%s' +editor.update=Zaktualizuj '%s' +editor.delete=Usuń '%s' +editor.commit_message_desc=Dodaj dodatkowy rozszerzony opis... +editor.commit_directly_to_this_branch=Commituj bezpośrednio do gałęzi %s. +editor.create_new_branch=Stwórz nową gałąź dla tego commita i rozpocznij pull request. +editor.new_branch_name_desc=Nazwa nowej gałęzi... +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.directory_is_a_file=Wpis '%s' w ścieżce nadrzędnej jest plikiem a nie katalogiem w tym repozytorium. +editor.file_is_a_symlink=Plik '%s' jest dowiązaniem symbolicznym, które nie mogą być modyfikowane z poziomu przeglądarki internetowej. +editor.filename_is_a_directory=Nazwa '%s' jest istniejącym katalogiem 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 +editor.fail_to_delete_file=Nie można usunąć pliku '%s' z powodu błędu: %v +editor.add_subdir=Dodaj podkatalog... +editor.unable_to_upload_files=Wysyłanie plików do '%s' nie powiodło się z błędem: %v +editor.upload_files_to_dir=Prześlij pliki do '%s' + +commits.commit_history=Historia zmian commits.commits=Commity commits.search=Przeszukaj commity commits.find=Szukaj @@ -490,11 +563,11 @@ issues.create=Utwórz problem issues.new_label=Nowa etykieta issues.new_label_placeholder=Etykieta... issues.create_label=Utwórz etykietę -issues.label_templates.title=Load a predefined set of labels -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.helper=Select a label set +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=Failed to load label template file '%s': %v +issues.label_templates.fail_to_load_file=Ładowanie pliku szablonu etykiety '%s' nie powiodło się: %v issues.open_tab=Otwarte %d issues.close_tab=Zamknięte %d issues.filter_label=Etykieta @@ -551,8 +624,8 @@ 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"` +issues.attachment.open_tab=`Kliknij, aby zobaczyć „%s” w nowej karcie` +issues.attachment.download=`Kliknij, aby pobrać „%s”` pulls.new=Nowy pull request pulls.compare_changes=Porównaj zmiany @@ -562,6 +635,7 @@ pulls.compare_compare=porównaj pulls.filter_branch=Filtruj branch pulls.no_results=Nie znaleziono wyników. pulls.nothing_to_compare=Nie ma nic do porównania, ponieważ gałęzie bazy i head są identyczne. +pulls.nothing_merge_base=Nie ma nic do porównania, ponieważ dwie gałęzie mają zupełnie inną historię. pulls.has_pull_request=`Istnieje już pull request dla tych dwóch celów: %[2]s#%[3]d` pulls.create=Utwórz Pull Request pulls.title_desc=chce scalić %[1]d commity/ów z %[2]s do %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=Sprawdzanie konfliktów jeszcze trwa, proszę odświeżyć str 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.create_merge_commit=Utwórz scalający commit +pulls.rebase_before_merging=Rebase przed scaleniem +pulls.commit_description=Opis commitu 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.` +pulls.delete_branch=Usuń gałąź +pulls.delete_branch_has_new_commits=Gałęzi nie można usunąć ponieważ są nowe zmiany po scaleniu. milestones.new=Nowy kamień milowy milestones.open_tab=Otwarte %d @@ -594,7 +673,7 @@ milestones.desc=Opis milestones.due_date=Termin realizacji (opcjonalnie) 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.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 @@ -617,7 +696,7 @@ 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.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 @@ -629,31 +708,61 @@ settings.collaboration.admin=Administrator settings.collaboration.write=Zapis settings.collaboration.read=Odczyt settings.collaboration.undefined=Niezdefiniowany +settings.branches=Gałęzie +settings.branches_bare=Nie można zarządzać pustym repozytorium bare. Proszę wypchnąć najpierw dowolną zawartość. +settings.default_branch=Domyślna gałąź +settings.default_branch_desc=Domyślna gałąź jest uważana za podstawową gałąź dla wypychania zmian, pull requestów i edycji online. +settings.update=Aktualizuj +settings.update_default_branch_unsupported=Zmiana domyślnej gałęzi nie jest obsługiwana przez wersję Git na serwerze. +settings.update_default_branch_success=Domyślny gałąź repozytorium została pomyślnie zaktualizowana! +settings.protected_branches=Chronione gałęzie +settings.protected_branches_desc=Chroń gałąź z wymuszonego pchania, przypadkowych usunięć i białych listy z prawami zmian w kodzie. +settings.choose_a_branch=Wybierz gałąź... +settings.branch_protection=Ochrona gałęzi +settings.branch_protection_desc=Proszę wybrać opcje zabezpieczeń dla gałęzi %s. +settings.protect_this_branch=Chroń tą gałąź +settings.protect_this_branch_desc=Wyłącz wymuszanie wypchnięć zmian i zabroń usuwania. +settings.protect_require_pull_request=Wymagane utworzenie Pull Requesta zamiast bezpośredniego wypchnięcia +settings.protect_require_pull_request_desc=Włącz tę opcję aby wyłączyć bezpośrednie pchanie do tej gałęzi. Zmiany muszą być wypychane do innej niechronionej gałęzi i scalone z tą gałęzią, za pośrednictwem Pull Requesta. +settings.protect_whitelist_committers=Biała lista, kto może wypychać do tej gałęzi +settings.protect_whitelist_committers_desc=Dodaj osoby lub zespoły do białej listy wypychających, do tej gałęzi. Użytkownicy z białej listy nie będą czekać na zatwierdzenie pull requesta. +settings.protect_whitelist_users=Użytkownicy, którzy mogą popchnąć do tej gałęzi +settings.protect_whitelist_search_users=Szukaj użytkowników +settings.protect_whitelist_teams=Zespoły, których członkowie mogą popchnąć do tej gałęzi +settings.protect_whitelist_search_teams=Szukaj drużyn +settings.update_protect_branch_success=Opcje zabezpieczeń dla tej gałęzi zostały pomyślnie zaktualizowane! settings.hooks=Webhooki settings.githooks=Hooki Git settings.basic_settings=Ustawienia podstawowe -settings.mirror_settings=Mirror Settings +settings.mirror_settings=Kopia lustrzana ustawień settings.sync_mirror=Synchronizuj teraz -settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. +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.change_reponame_prompt=Zmiana nazwy repozytorium wpłynie na linki do niego. settings.advanced_settings=Ustawienia zaawansowane settings.wiki_desc=Włącz system wiki settings.use_internal_wiki=Użyj wbudowanego wiki +settings.allow_public_wiki_desc=Umożliw publiczny dostęp do wiki, gdy repozytorium jest prywatne settings.use_external_wiki=Użyj zewnętrznego Wiki settings.external_wiki_url=Adres URL zewnętrznego Wiki settings.external_wiki_url_desc=Odwiedzający zostaną przekierowani do adresu URL po kliknięciu zakładki. -settings.issues_desc=Enable issue tracker -settings.use_internal_issue_tracker=Use builtin lightweight issue tracker +settings.issues_desc=Włącz system zgłaszania problemów +settings.use_internal_issue_tracker=Użyj wbudowany lekki system zgłaszania problemów +settings.allow_public_issues_desc=Umożliw publiczny dostęp do zagadnień, gdy repozytorium jest prywatne settings.use_external_issue_tracker=Użyj zewnętrznego systemu zgłaszania problemów +settings.external_tracker_url=URL zewnętrznego trackera zagadnień +settings.external_tracker_url_desc=Odwiedzający zostaną przekierowani do adresu URL po kliknięciu zakładki. settings.tracker_url_format=Format dla adresu URL zewnętrznego systemu settings.tracker_issue_style=Styl nazw zewnętrznego systemu zgłaszania problemów: settings.tracker_issue_style.numeric=Numeryczny settings.tracker_issue_style.alphanumeric=Alfanumeryczne settings.tracker_url_format_desc=Symbole zastępcze {user} {repo} {index} mogą być użyte dla nazwy użytkownika, nazwy repozytorium i numeru problemu. -settings.pulls_desc=Włącz obsługę pull request, aby akceptować publiczny wkład +settings.pulls_desc=Włącz żądania pobierania, aby akceptować wkład pomiędzy repozytoriami i gałęziami +settings.pulls.ignore_whitespace=Ignoruj zmiany w białych znakach +settings.pulls.allow_rebase_merge=Zezwalaj na użycie rebase do scalenia commitów settings.danger_zone=Strefa niebezpieczeństwa +settings.cannot_fork_to_same_owner=Nie można sforkować repozytorium do pierwotnego właściciela. 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. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Ten użytkownik nie będzie miał dostępu w settings.remove_collaborator_success=Współpracownik został usunięty. 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 Gogs, wyślemy powiadomienie do wybranego hosta. Więcej informacji można znaleźć w przewodniku webhooków. +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Wybierz typ... +settings.add_webhook=Dodaj webhooka 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.redelivery=Redystrybucja +settings.webhook.redelivery_success=Zadanie '%s' zostało ponownie dodane do kolejki. Może upłynąć kilka sekund, aby zaktualizować jego status w historii. settings.webhook.request=Żądanie settings.webhook.response=Odpowiedź settings.webhook.headers=Nagłówki settings.webhook.payload=Zawartość settings.webhook.body=Treść +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Hooki Git są obsługiwane bezpośrednio przez Git. Pliki obsługiwanych hooków z poniższej listy mogą być edytowane, aby wykonywać niestandardowe operacje. settings.githook_edit_desc=Jeśli hook jest nieaktywny, zaprezentowana zostanie przykładowa treść. Pozostawienie pustej wartości wyłączy ten hook. settings.githook_name=Nazwa hooka @@ -711,6 +825,7 @@ settings.add_webhook_desc=Wyślemy żądanie POST pod poniższy adr settings.payload_url=URL do wywołania settings.content_type=Typ zawartości settings.secret=Sekret +settings.secret_desc=Sekret zostanie wysłany jako SHA256 HMAC hex digest of payload z nagłówkiem X-Gogs-Signature. settings.slack_username=Użytkownik settings.slack_icon_url=Adres URL ikony settings.slack_color=Kolor @@ -720,10 +835,20 @@ settings.event_send_everything=Potrzebuję wszystkiego. settings.event_choose=Pozwól mi wybrać, czego potrzebuję. settings.event_create=Utwórz settings.event_create_desc=Utworzono gałąź lub tag -settings.event_pull_request=Pull Request -settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. +settings.event_delete=Usuń +settings.event_delete_desc=Gałąź lub tag usunięty +settings.event_fork=Forkuj +settings.event_fork_desc=Repozytorium zforkowane settings.event_push=Wypchnięcie settings.event_push_desc=Wypchnięcie (push) do repozytorium Git +settings.event_issues=Zagadnienia +settings.event_issues_desc=Zagadnienie otwarte, zamknięte, ponownie otwarte, wyedytowane, przypisane, nieprzypisane, etykieta uaktualniona, etykieta wyczyszczona, kamień milowy, kamień milowy usunięty. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull request otwarty, zamknięty, ponownie otwarty, edytowany, przypisany, nieprzypisany, etykieta zaktualizowana, etykieta wyczyszczona, kamień milowy, kamień milowy wyczyszczony; lub zsynchronizowany. +settings.event_issue_comment=Komentarz zagadnienia +settings.event_issue_comment_desc=Komentarz zagadnienia utworzony, wyedytowany lub usunięty. +settings.event_release=Wydanie +settings.event_release_desc=Wydanie opublikowane w repozytorium. settings.active=Aktywny settings.active_helper=Dostarczymy szczegóły zdarzenia, gdy ten webhook zostanie wywołany. settings.add_hook_success=Nowy webhook został dodany. @@ -733,10 +858,13 @@ settings.delete_webhook=Usuń webhook settings.recent_deliveries=Ostatnie wywołania settings.hook_type=Typ hooka settings.add_slack_hook_desc=Dodaj integrację ze Slackiem do Twojego repozytorium. +settings.add_discord_hook_desc=Dodaj integrację Discord do Twojego repozytorium. +settings.add_dingtalk_hook_desc=Dodaj integrację Dingtalk do Twojego repozytorium. settings.slack_token=Token settings.slack_domain=Domena settings.slack_channel=Kanał settings.deploy_keys=Klucze wdrożeniowe +settings.deploy_keys_helper=TIP! Jeśli szukasz dodawanie osobistych kluczy publicznych, dodaj je proszę w ustawieniach konta. settings.add_deploy_key=Dodaj klucz wdrożenia settings.deploy_key_desc=Klucze wdrożenia pozwalają na dostęp tylko do odczytu. To nie to samo co klucze SSH dla konta osobistego. settings.no_deploy_keys=Nie dodałeś żadnego klucza wdrożenia. @@ -748,6 +876,8 @@ 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! +settings.description_desc=Opis repozytorium. Maksymalnie 512 znaków. +settings.description_length=Dostępne znaki diff.browse_source=Przeglądaj źródła diff.parent=rodzic @@ -766,7 +896,6 @@ release.releases=Wydania release.new_release=Nowe wydanie release.draft=Szkic release.prerelease=Wersja wstępna -release.stable=Stabilny release.edit=edytuj release.ahead=%d commitów w %s od tego wydania release.source_code=Kod źródłowy @@ -813,8 +942,8 @@ team_name_helper=Będziesz używał tej nazwy do wywoływania tego zespołu w dy 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. +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=Ustawienia settings.options=Opcje @@ -886,12 +1015,19 @@ first_page=Pierwsza last_page=Ostatnia total=Ogółem: %d +dashboard.build_info=Informacje o kompilacji +dashboard.app_ver=Wersja aplikacji +dashboard.git_version=Wersja Git +dashboard.go_version=Wersja Go +dashboard.build_time=Data kompilacji +dashboard.build_commit=Zbuduj commit dashboard.statistic=Statystyki dashboard.operations=Operacje dashboard.system_status=Stan monitora systemu dashboard.statistic_info=Baza danych Gogs zawiera %d użytkowników, %d organizacji, %d kluczy publicznych, %d repozytoriów, %d obserwujących, %d polubionych, %d akcji, %d tokenów, %d problemów, %d komenatrzy, %d kont społecznościowych, %d obserwacji, %d mirrorów, %d wydań, %d login sources, %d webhooków, %d kamieni milowych, %d labels, %d zadań hooków, %d zespołów, %d zadań aktualizacji, %d załączników. dashboard.operation_name=Nazwa operacji dashboard.operation_switch=Przełącz +dashboard.select_operation_to_run=Wybierz operację do uruchomienia 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. @@ -905,8 +1041,8 @@ 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 Gogs 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.resync_all_hooks=Ponowa synchronizacja wpływa na wypychanie, aktualizowanie i odbieranie zmian we wszystkich repozytoriach +dashboard.resync_all_hooks_success=Ponowa synchronizacja została wykonana pomyślnie we wszystkich repozytoriach. 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. @@ -981,12 +1117,14 @@ repos.private=Prywatne repos.watches=Obserwujących repos.stars=Polubienia repos.issues=Problemy +repos.size=Rozmiar -auths.auth_manage_panel=Panel zarządzania uwierzytelnianiem +auths.auth_sources=Źródła uwierzytelniania auths.new=Dodaj nowe źródło auths.name=Nazwa auths.type=Typ auths.enabled=Włączono +auths.default=Domyślne auths.updated=Zaktualizowano auths.auth_type=Typ uwierzytelniania auths.auth_name=Nazwa uwierzytelniania @@ -995,6 +1133,7 @@ auths.domain=Domena auths.host=Host auths.port=Port auths.bind_dn=Bind DN +auths.bind_dn_helper=Możesz użyć '%s' jako symbol zastępczy dla nazwy użytkownika, np. DOM\%s 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 @@ -1004,6 +1143,11 @@ auths.attribute_username_placeholder=Zostaw puste aby użyć wartości podanej p auths.attribute_name=Atrybut imienia auths.attribute_surname=Atrybut nazwiska auths.attribute_mail=Atrybut e-mail +auths.verify_group_membership=Sprawdź członkostwo w grupie +auths.group_search_base_dn=Grupa wyszukiwania Base DN +auths.group_filter=Filtr grupy +auths.group_attribute_contain_user_list=Atrybut grupy zawierający listę użytkowników +auths.user_attribute_listed_in_group=Atrybut użytkownika wymieniony w grupie auths.attributes_in_bind=Pobierz atrybuty w kontekście Bind DN auths.filter=Filtr użytkownika auths.admin_filter=Filtr administratora @@ -1017,9 +1161,9 @@ 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.default_auth=To uwierzytelnianie jest domyślnym źródłem logowania auths.new_success=Pomyślnie dodano nowe uwierzytelnianie '%s'. auths.update_success=Ustawienia uwierzytelnienia zostały zaktualizowane pomyślnie. auths.update=Aktualizuj ustawienia uwierzytelniania @@ -1028,107 +1172,189 @@ 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! +auths.login_source_exist=Login '%s' już istnieje. +auths.github_api_endpoint=Punkt końcowy API +config.not_set=(nie ustawiono) config.server_config=Konfiguracja serwera -config.app_name=Nazwa aplikacji -config.app_ver=Wersja aplikacji -config.app_url=Adres URL aplikacji -config.domain=Domena -config.offline_mode=Tryb offline -config.disable_router_log=Wyłącz dziennik routera +config.brand_name=Nazwa marki config.run_user=Użytkownik uruchomieniowy config.run_mode=Tryb uruchamienia -config.repo_root_path=Ścieżka repozytoriów -config.static_file_root_path=Ścieżka plików statycznych -config.log_file_root_path=Ścieżka plików dziennika -config.script_type=Typ skryptu -config.reverse_auth_user=Użytkownik dostarczony przez odwrotne proxy +config.server.external_url=Zewnętrzny URL +config.server.domain=Domena +config.server.protocol=Protokół +config.server.http_addr=Adres HTTP +config.server.http_port=Port HTTP +config.server.cert_file=Pliki certyfikatu +config.server.key_file=Plik klucza +config.server.tls_min_version=Minimalna wersja TLS +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Lokalny główny adres URL +config.server.offline_mode=Tryb offline +config.server.disable_router_log=Wyłącz dziennik routera +config.server.enable_gzip=Włącz Gzip +config.server.app_data_path=Ścieżka danych aplikacji +config.server.load_assets_from_disk=Wczytaj zasoby z dysku +config.server.landing_url=Landing URL config.ssh_config=Konfiguracja SSH -config.ssh_enabled=Aktywne -config.ssh_start_builtin_server=Uruchom serwer wbudowany -config.ssh_domain=Domena -config.ssh_port=Port -config.ssh_listen_port=Port nasłuchu -config.ssh_root_path=Ścieżka katalogu głównego -config.ssh_key_test_path=Ścieżka klucza testowego -config.ssh_keygen_path=Ścieżka generatora ('ssh-keygen') -config.ssh_minimum_key_size_check=Sprawdzanie minimalnej długości klucza -config.ssh_minimum_key_sizes=Minimalne rozmiary kluczy +config.ssh.enabled=Aktywne +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Ścieżka katalogu głównego +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Uruchom wbudowany serwer +config.ssh.listen_host=Listen host +config.ssh.listen_port=Port nasłuchu +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Konfiguracja repozytorium +config.repo.root_path=Ścieżka katalogu głównego +config.repo.script_type=Typ skryptu +config.repo.ansi_chatset=Zestaw znaków ANSI +config.repo.force_private=Wymuś tryb prywatny +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Wybrana licencja +config.repo.disable_http_git=Wyłącz Git przez HTTP +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=Konfiguracja bazy danych -config.db_type=Typ -config.db_host=Host -config.db_name=Nazwa -config.db_user=Użytkownik -config.db_ssl_mode=Tryb SSL -config.db_ssl_mode_helper=(tylko dla "postgres") -config.db_path=Ścieżka -config.db_path_helper=(dla "sqlite3" i "tidb") - -config.service_config=Konfiguracja usługi -config.register_email_confirm=Wymagaj potwierdzenia e-mail -config.disable_register=Wyłącz rejestrację -config.show_registration_button=Pokazuj przycisk rejestracji -config.require_sign_in_view=Wymagaj bycia zalogowanym -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.db.type=Typ +config.db.host=Host +config.db.name=Nazwa +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=Użytkownik +config.db.ssl_mode=Tryb SSL +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Ścieżka +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Pamiętaj pliki cookies +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Konfiguracja E-mail +config.email.enabled=Włączono +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=Od +config.email.user=Użytkownik +config.email.disable_helo=Wyłącz HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Pomiń weryfikację certyfikatu +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Plik klucza +config.email.use_plain_text=Użyj zwykłego tekstu +config.email.add_plain_text_alt=Dodaj prosty tekst alternatywny +config.email.send_test_mail=Wyślij wiadomość testową +config.email.test_mail_failed=Nie udało się wysłać wiadomości testowej do '%s': %v +config.email.test_mail_sent=Wiadomość testowa została wysłana do '%s'. + +config.auth_config=Konfiguracja uwierzytelniania +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Wymagaj potwierdzenia adresu e-mail +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Wyłącz rejestrację +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=Konfiguracja użytkownika +config.user.enable_email_notify=Enable email notification -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 -config.mailer_disable_helo=Wyłącz HELO -config.mailer_name=Nazwa -config.mailer_host=Host -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 -config.oauth_enabled=Aktywne +config.session_config=Konfiguracja sesji +config.session.provider=Dostawca +config.session.provider_config=Provider config +config.session.cookie_name=Ciasteczka +config.session.https_only=Tylko HTTPS +config.session.gc_interval=Interwał GC +config.session.max_life_time=Maksymalny czas życia +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Konfiguracja cache -config.cache_adapter=Adapter cache -config.cache_interval=Interwał pamięci podręcznej -config.cache_conn=Połączenie z pamięcią podręczną - -config.session_config=Konfiguracja sesji -config.session_provider=Dostawca sesji -config.provider_config=Konfiguracja dostawcy -config.cookie_name=Nazwa ciasteczka -config.enable_set_cookie=Włącz ciasteczka -config.gc_interval_time=Interwał odśmiecania -config.session_life_time=Czas życia sesji -config.https_only=Tylko HTTPS -config.cookie_life_time=Czas życia ciasteczka +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=Konfiguracja HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Włączono +config.attachment.path=Ścieżka +config.attachment.allowed_types=Dozwolone typy +config.attachment.max_size=Limit rozmiaru +config.attachment.max_files=Limit plików + +config.release_config=Konfiguracja wydania +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Ustawienia obrazów -config.picture_service=Serwis obrazów -config.disable_gravatar=Wyłącz Gravatara -config.enable_federated_avatar=Enable Federated Avatars +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Źródło Gravatar +config.picture.disable_gravatar=Wyłącz Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Konfiguracja serwera lustrzanego +config.mirror.default_interval=Domyślny interwał + +config.webhook_config=Konfiguracja webhooka +config.webhook.types=Typy +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Pomiń weryfikację TLS config.git_config=Konfiguracja Git -config.git_disable_diff_highlight=Disable Diff Syntax Highlight -config.git_max_diff_lines=Max Diff Lines (for a single file) -config.git_max_diff_line_characters=Max Diff Characters (for a single line) -config.git_max_diff_files=Max Diff Files (to be shown) -config.git_gc_args=GC Arguments -config.git_migrate_timeout=Limit czasu migracji -config.git_mirror_timeout=Mirror Update Timeout -config.git_clone_timeout=Clone Operation Timeout -config.git_pull_timeout=Pull Operation Timeout -config.git_gc_timeout=GC Operation Timeout +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=Argumenty GC +config.git.migrate_timeout=Limit czasu migracji +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Magazyn +config.lfs.objects_path=Ścieżka obiektów config.log_config=Konfiguracja dziennika -config.log_mode=Tryb dziennika +config.log_file_root_path=Ścieżka plików dziennika +config.log_mode=Tryb +config.log_options=Ustawienia monitor.cron=Zadania cron monitor.name=Nazwa @@ -1159,17 +1385,24 @@ notices.delete_success=Powiadomienia systemowe zostały pomyślnie usunięte. create_repo=tworzy repozytorium %s rename_repo=zmienia nazwę repozytorium %[1]s na %[3]s commit_repo=wypycha do %[3]s w %[4]s +compare_commits=Zobacz porównanie tych %d commitów +transfer_repo=przenosi repozytorium %s do %s create_issue=`zgłasza problem %s#%[2]s` close_issue=`zamknięcie problemu %s#%[2]s` reopen_issue=`ponowne otwarcie problemu %s#%[2]s` +comment_issue=`komentuje problem %s#%[2]s` create_pull_request=`tworzy pull request %s#%[2]s` close_pull_request=`zamknięcie pull request %s#%[2]s` reopen_pull_request=`ponowne otwarcie pull request %s#%[2]s` -comment_issue=`komentuje problem %s#%[2]s` merge_pull_request=`scala pull request %s#%[2]s` -transfer_repo=przenosi repozytorium %s do %s +create_branch=stworzył nową gałąź %[3]s at %[4]s +delete_branch=usunął gałąź %[2]s at %[3]s push_tag=taguje %[2]s w %[3]s -compare_commits=Zobacz porównanie tych %d commitów +delete_tag=usunięty tag %[2]s % [3]s +fork_repo=rozwidlone repozytorium do %s +mirror_sync_push=zsynchronizowano commit z %[3]s na %[4]s z kopii lustrzanej +mirror_sync_create=zsynchronizowano nowy odnośnik %[2]s to %[3]s z mirrora +mirror_sync_delete=zsynchronizowano i usunięto odnośnik %[2]s at %[3]s z mirrora [tool] ago=temu @@ -1191,6 +1424,7 @@ months=%d miesięcy %s years=%d lat %s raw_seconds=sekund raw_minutes=minut +raw_hours=godziny [dropzone] default_message=Upuść pliki tutaj lub kliknij, aby przesłać. diff --git a/conf/locale/locale_pt-BR.ini b/conf/locale/locale_pt-BR.ini index 783678e4106..bfc8d88ddbc 100644 --- a/conf/locale/locale_pt-BR.ini +++ b/conf/locale/locale_pt-BR.ini @@ -1,7 +1,7 @@ -app_desc=Um serviço de Git hospedável e amigável escrito em Go +app_desc=Um serviço de Git auto-hospedado e amigável escrito em Go home=Página inicial -dashboard=Painel +dashboard=Painel de controle explore=Explorar help=Ajuda sign_in=Entrar @@ -9,13 +9,12 @@ sign_out=Sair sign_up=Cadastrar register=Registrar website=Site -version=Versão page=Página -template=Template +template=Modelo language=Idioma create_new=Criar... -user_profile_and_more=Perfil do usuário e configurações -signed_in_as=Logado como +user_profile_and_more=Perfil do usuário e mais +signed_in_as=Entrou como username=Usuário email=E-mail @@ -44,23 +43,27 @@ issues=Problemas cancel=Cancelar +[status] +page_not_found=Página Não Encontrada +internal_server_error=Erro interno do servidor + [install] install=Instalação title=Etapas de instalação para primeira execução docker_helper=Se você está rodando o Gogs dentro do Docker, por favor leia os Guias cuidadosamente antes de mudar qualquer coisa nesta página! -requite_db_desc=Gogs requer MySQL, PostgreSQL, SQLite3 ou TiDB. +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title=Configurações de banco de dados db_type=Tipo de banco de dados host=Host user=Usuário password=Senha db_name=Nome do banco de dados +db_schema=Schema db_helper=Por favor, use o mecanismo INNODB com o conjunto de caracteres utf8_general_ci para 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. -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 "-". +sqlite_helper=Caminho para o arquivo de banco de dados SQLite3.
Use o caminho absoluto ao iniciar como serviço. +err_empty_db_path=Deve haver um caminho para o banco de dados SQLite3. 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. @@ -75,12 +78,17 @@ domain=Domínio domain_helper=Isto afeta URLs para o clone via SSH. ssh_port=Porta SSH ssh_port_helper=Número da porta que seu servidor SSH está usando, deixe vazio para desativar o recurso SSH. +use_builtin_ssh_server=Usar o servidor SSH embutido +use_builtin_ssh_server_popup=Iniciar o servidor SSH embutido para operações Git, para diferenciar do serviço SSH do sistema. 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. log_root_path=Caminho do log log_root_path_helper=Pasta dos arquivos de log. +enable_console_mode=Ativar o modo de console +enable_console_mode_popup=Além do modo de arquivo, exibir registros (log) no console. +default_branch=Default Branch optional_title=Configurações opcionais email_title=Configurações do serviço de e-mail @@ -116,7 +124,10 @@ sqlite3_not_available=Sua versão não suporta SQLite3, por favor faça o downlo invalid_db_setting=Configuração do banco de dados não está correta: %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 +smtp_host_missing_port=O endereço do host SMTP não possui porta. +invalid_smtp_from=O SMTP do campo não é válido: %v save_config_failed=Falha ao salvar a configuração: %v +init_failed=Falha ao inicializar a aplicaçã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 Gogs, divirta-se e tenha cuidado. invalid_log_root_path=Pasta raíz do log é inválida: %v @@ -137,6 +148,7 @@ issues.in_your_repos=Em seus repositórios [explore] repos=Repositórios users=Usuários +organizations=Organizações search=Pesquisar [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Já tem uma conta? Entre agora! social_register_hepler_msg=Já tem uma conta? Junte-se 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. +auth_source=Fonte de autenticação +local=Local remember_me=Lembrar de mim forgot_password=Esqueci a senha forget_password=Esqueceu a senha? @@ -156,7 +170,6 @@ prohibit_login_desc=Sua conta foi proibida de efetuar login, por favor contate o resent_limit_prompt=Desculpe, você está enviando um e-mail de ativação com muita frequência. Por favor, aguarde 3 minutos. 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 reset_password=Redefinir sua senha invalid_code=Desculpe, seu código de confirmação expirou ou não é válido. @@ -164,6 +177,14 @@ reset_password_helper=Clique aqui para redefinir sua senha password_too_short=O comprimento da senha não pode ser menor que 6. non_local_account=Não é possível mudar a senha de contas remotas pelo Gogs. +login_two_factor=Autenticação de dois fatores +login_two_factor_passcode=Senha de Autenticação +login_two_factor_enter_recovery_code=Insira um código de recuperação +login_two_factor_recovery=Recuperação de autenticação +login_two_factor_recovery_code=Código de Recuperação +login_two_factor_enter_passcode=Insira uma senha p/ autenticação +login_two_factor_invalid_recovery_code=O código de recuperação já foi usado ou é inválido. + [mail] activate_account=Por favor, ative sua conta activate_email=Verifique seu endereço de e-mail @@ -199,6 +220,7 @@ 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_slash_error=` apenas alfanuméricos e pontuações (hifens, pontos e barras).` 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.` @@ -215,6 +237,7 @@ 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. +auth_source_mismatch=A fonte de autenticação selecionada não está associada ao usuário. 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. @@ -242,19 +265,18 @@ 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. +form.name_not_allowed=Nome de usuário ou padrão %q não é permitido. [settings] profile=Perfil password=Senha avatar=Avatar ssh_keys=Chaves SSH -social=Contas sociais -applications=Aplicativos +security=Segurança +repos=Repositórios orgs=Organizações +applications=Aplicativos delete=Deletar conta -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. @@ -295,6 +317,7 @@ delete_email=Deletar 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_success=O E-mail foi excluído com sucesso! +email_deletion_primary=Cannot delete primary email address. add_new_email=Adicionar novo endereço de e-mail 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. @@ -320,14 +343,36 @@ 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 -manage_social=Gerenciar contas sociais associadas -social_desc=Esta é uma lista de contas sociais. Remova qualquer ligação que você não reconheça. -unbind=Desvincular -unbind_success=A conta social foi desvinculada. +two_factor=Autenticação de dois fatores +two_factor_status=Estado: +two_factor_on=Ativado +two_factor_off=Desativado +two_factor_enable=Ativar +two_factor_disable=Desativar +two_factor_view_recovery_codes=Consulte e salve seus códigos de recuperação num local seguro. Você poderá usá-los como senha se perder acesso ao seu aplicativo de autenticação. +two_factor_http=Para operações em HTTP/HTTPS, você não poderá mais usar seu nome de usuário e senha. Crie e use um Token de Acesso Pessoal como credencial (p. ex.: %[3]%). +two_factor_enable_title=Ativar autenticação de dois fatores +two_factor_scan_qr=Use o seu aplicativo de autenticação para escanear a imagem: +two_factor_or_enter_secret=Ou informe o segredo: +two_factor_then_enter_passcode=Em seguida digite a senha: +two_factor_verify=Verificar +two_factor_invalid_passcode=A senha inserida é inválida. Tente novamente! +two_factor_reused_passcode=A senha fornecida já foi usada, por favor tente outra! +two_factor_enable_error=Falha ao ativar a autenticação de dois fatores: %v +two_factor_enable_success=A autenticação de dois fatores foi ativada para a sua conta com sucesso! +two_factor_recovery_codes_title=Códigos de recup. p/ autenticação de dois fatores +two_factor_recovery_codes_desc=Os códigos de recuperação são usados se você perder acesso ao seu aplicativo de autenticação. Cada código pode ser usado apenas uma vez. Salve-os num lugar seguro. +two_factor_regenerate_recovery_codes=Gerar códigos de recuperação +two_factor_regenerate_recovery_codes_error=Falha ao gerar códigos de recuperação: %v +two_factor_regenerate_recovery_codes_success=Novos códigos de recuperação gerados com sucesso! +two_factor_disable_title=Desativar a autenticação de dois fatores +two_factor_disable_desc=O nível de segurança da sua conta diminuirá após desativar a autenticação de dois fatores. Deseja mesmo continuar? +two_factor_disable_success=A autenticação de dois fatores foi desativada com sucesso! 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 Gogs. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=Por enquanto, todo token terá acesso completo à sua conta. token_name=Nome do token generate_token=Gerar token @@ -336,6 +381,16 @@ 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. +token_name_exists=Já existe um token com o mesmo nome. + +orgs.none=Você não é participante de nenhuma organização. +orgs.leave_title=Deixar uma organização +orgs.leave_desc=Você perderá acesso a todos os repositórios e equipes após deixar a organização. Deseja continuar? + +repos.leave=Sair +repos.leave_title=Sair do repositório +repos.leave_desc=Você irá perder acesso ao repositório após sair. Deseja continuar? +repos.leave_success=Você saiu do repositório “%s” com sucesso! delete_account=Deletar sua conta delete_prompt=A operação deletará sua conta permanentemente, e NÃO PODERÁ ser desfeita! @@ -348,7 +403,9 @@ 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 +unlisted=Unlisted visiblity_helper=Este é um repositório privado +unlisted_helper=This repository is Unlisted 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! @@ -374,24 +431,26 @@ mirror_last_synced=Última sincronização watchers=Observadores stargazers=Usuários que estrelaram forks=Forks +repo_description_helper=Descrição do repositório. Tamanho máximo de 512 caracteres. +repo_description_length=Caracteres disponíveis 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_not_allowed=Nome de usuário ou padrão %q não é permitido. need_auth=Precisa de autorização migrate_type=Tipo de migração migrate_type_helper=Este repositório será um mirror migrate_repo=Migrar repositório migrate.clone_address=Endereço de clone -migrate.clone_address_desc=Isto pode ser uma URL de HTTP/HTTPS/GIT ou um caminho de diretório local. +migrate.clone_address_desc=Pode ser um URL HTTP/HTTPS/GIT. +migrate.clone_address_desc_import_local=Você também pode migrar um repositório pelo path do servidor 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.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Migração falhou: %v mirror_from=mirror de forked_from=fork de -fork_from_self=Você não pode criar fork de um repositório que já é seu! copy_link=Copiar copy_link_success=Copiado! copy_link_error=Pressione ⌘-C ou Ctrl-C para copiar @@ -407,9 +466,9 @@ 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! +bare_message=Este repositório ainda não possui conteúdo. -code=Código +files=Arquivos branch=Branch tree=Tree filter_branch_and_tag=Filtrar branch ou tag @@ -420,12 +479,23 @@ pulls=Pull Requests labels=Etiquetas milestones=Milestones commits=Commits +git_branches=Branches releases=Versões file_raw=Raw file_history=Histórico file_view_raw=Ver raw file_permalink=Link permanente file_too_large=Este arquivo é muito grande para ser exibido +video_not_supported_in_browser=Seu navegador não suporta a tag de vídeo do HTML5. + +branches.overview=Visão geral +branches.active_branches=Branches ativos +branches.stale_branches=Branches obsoletos +branches.all=Todos os branches +branches.updated_by=Atualizado %[1]s por %[2]s +branches.change_default_branch=Modificar branch padrão +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Novo arquivo editor.upload_file=Enviar arquivo @@ -455,16 +525,19 @@ editor.cancel=Cancelar editor.filename_cannot_be_empty=Nome do arquivo não pode ser vazio. editor.branch_already_exists=Branch '%s' já existe neste repositório. editor.directory_is_a_file=Entrada '%s' no caminho pai é um arquivo e não uma pasta neste repositório. +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_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 +editor.fail_to_delete_file=Falha ao excluir arquivo '%s' com erro: %v editor.add_subdir=Adicionar o subdiretório... editor.unable_to_upload_files=Houve erro ao fazer upload de arquivos para '%s': %v editor.upload_files_to_dir=Enviar arquivos para '%s' +commits.commit_history=Histórico de commits commits.commits=Commits commits.search=Pesquisar commits commits.find=Buscar @@ -562,6 +635,7 @@ pulls.compare_compare=comparar pulls.filter_branch=Filtrar branch pulls.no_results=Nada encontrado. pulls.nothing_to_compare=Não há nada para comparar porque o branch base e o head estão iguais. +pulls.nothing_merge_base=Não há o que comparar pois os dois branches possuem históricos completamente diferentes. pulls.has_pull_request=`Já existem pull requests entre esses dois alvos: %[2]s#%[3]d` pulls.create=Criar Pull Request pulls.title_desc=quer mesclar %[1]d commits de %[2]s em %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=A verificação do conflito ainda está em progresso, por favo 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_helper=Por favor, aplique o merge manualmente para resolver os conflitos. +pulls.create_merge_commit=Criar commit de um merge +pulls.rebase_before_merging=Execute rebase antes de fazer merge +pulls.commit_description=Descrição do Commit 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.` +pulls.delete_branch=Excluir Branch +pulls.delete_branch_has_new_commits=O branch não pode ser excluído por possuir novos commits após o merge. milestones.new=Novo milestone milestones.open_tab=%d abertos @@ -629,6 +708,29 @@ settings.collaboration.admin=Administrador settings.collaboration.write=Escrita settings.collaboration.read=Leitura settings.collaboration.undefined=Indefinido +settings.branches=Branches +settings.branches_bare=Não é possível gerenciar branches num repositório vazio. Adicione conteúdo primeiro. +settings.default_branch=Branch padrão +settings.default_branch_desc=O branch padrão é considerado branch "base" para commits, pull requests e edição on-line. +settings.update=Atualizar +settings.update_default_branch_unsupported=Mudar o branch padrão não é suportado pela versão do Git no servidor. +settings.update_default_branch_success=O branch padrão deste repositório foi atualizado com sucesso! +settings.protected_branches=Branches protegidos +settings.protected_branches_desc=Proteger branches de push forçado, remoção acidental e committers da lista branca. +settings.choose_a_branch=Selecione um branch... +settings.branch_protection=Proteção de Branch +settings.branch_protection_desc=Escolha opções de proteção para o branch %s. +settings.protect_this_branch=Proteger este branch +settings.protect_this_branch_desc=Desabilita pushes forçados e previne remoção. +settings.protect_require_pull_request=Requer pull request ao invés de push direto +settings.protect_require_pull_request_desc=Habilite esta opção para desabilitar push direto para este branch. Os commits precisam sofrer um push para outro branch não protegido e merge para este branch por meio de um pull request. +settings.protect_whitelist_committers=Incluir na lista branca quem pode fazer push para este branch +settings.protect_whitelist_committers_desc=Adicionar pessoas ou equipes para a lista branca de push direto para este branch. Usuários na lista branca contornarão a verificação de necessidade de pull request. +settings.protect_whitelist_users=Usuários que podem realizar push para este branch +settings.protect_whitelist_search_users=Pesquisar usuários +settings.protect_whitelist_teams=Equipes cujos membros podem realizar push para este branch +settings.protect_whitelist_search_teams=Buscar times +settings.update_protect_branch_success=As opções de proteção deste branch foram atualizadas com sucesso! settings.hooks=Webhooks settings.githooks=Hooks do Git settings.basic_settings=Configurações básicas @@ -641,19 +743,26 @@ settings.change_reponame_prompt=Esta mudança irá afetar os links para este rep settings.advanced_settings=Configurações avançadas settings.wiki_desc=Habilitar sistema de wiki settings.use_internal_wiki=Usar wiki nativa +settings.allow_public_wiki_desc=Permitir acesso público à wiki quando o repositório for privado settings.use_external_wiki=Usar wiki externa settings.external_wiki_url=URL externa da wiki 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.allow_public_issues_desc=Permitir acesso público a problemas quando o repositório for privado settings.use_external_issue_tracker=Usar issue tracker externo +settings.external_tracker_url=URL do Issue Tracker Externo +settings.external_tracker_url_desc=Visitantes serão redirecionados ao URL quando clicarem na aba. settings.tracker_url_format=Formato de URL do issue tracker externo settings.tracker_issue_style=Estilo de nome de issue tracker externo: settings.tracker_issue_style.numeric=Numérico settings.tracker_issue_style.alphanumeric=Alfanumérico settings.tracker_url_format_desc=Você pode usar o espaço reservado {user} {repo} {index} para o nome do usuário, índice de nome e a questão do repositório. -settings.pulls_desc=Habilitar Pull Requests para aceitar contribuições públicas +settings.pulls_desc=Habilitar pull requests para aceitar contribuições entre repositórios e branches +settings.pulls.ignore_whitespace=Ignorar alterações em espaço em branco +settings.pulls.allow_rebase_merge=Permitir rebase para commits via merge settings.danger_zone=Zona de perigo +settings.cannot_fork_to_same_owner=Não se pode realizar fork de um repositório para seu dono original. 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. @@ -672,7 +781,7 @@ settings.wiki_deletion_success=Dados de wiki do repositório foram deletados com settings.delete=Deletar 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á apagar permanentemente o tudo deste repositório, incluindo os dados do Git, Issues, comentários e acessos dos colaboradores. +settings.delete_notices_2=- Esta operação irá apagar permanentemente tudo neste repositório, incluindo commits, issues, comentários, o wiki e 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. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Este usuário não terá mais acesso de cola settings.remove_collaborator_success=O colaborador foi removido. 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 Gogs. 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.webhooks.add_new=Adicionar um novo webhook: +settings.webhooks.choose_a_type=Escolha um tipo... +settings.add_webhook=Adicionar Webhook settings.webhook_deletion=Deletar Webhook settings.webhook_deletion_desc=Deletar este Webhook vai remover sua informação e todo o histórico de entrega. Deseja continuar? settings.webhook_deletion_success=Webhook deletado 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.redelivery=Re-entrega +settings.webhook.redelivery_success=A tarefa hook '%s' foi readicionada à fila de entrega. Pode demorar alguns segundos para a situação da entrega no histórico ser atualizada. settings.webhook.request=Solicitação settings.webhook.response=Resposta settings.webhook.headers=Cabeçalhos settings.webhook.payload=Payload settings.webhook.body=Corpo +settings.webhook.err_cannot_parse_payload_url=Não foi possível analisar a URL da carga: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Hooks do Git são ofertados pelo próprio Git, você pode editar arquivos de hooks suportados na lista abaixo para aplicar operações personalizadas. settings.githook_edit_desc=Se o hook não estiver ativo, o conteúdo de exemplo será apresentado. Deixar o conteúdo em branco irá desativar esse hook. settings.githook_name=Nome do Hook @@ -711,6 +825,7 @@ settings.add_webhook_desc=Enviaremos uma solicitação POST para o settings.payload_url=URL de Payload settings.content_type=Tipo de conteúdo settings.secret=Secreto +settings.secret_desc=O segredo será enviado como digest hexadecimal SHA256 HMAC do payload via cabeçalho X-Gogs-Signature. settings.slack_username=Nome de usuário settings.slack_icon_url=URL do ícone settings.slack_color=Cor @@ -720,10 +835,20 @@ settings.event_send_everything=Preciso de tudo. settings.event_choose=Deixe-me escolher o que eu preciso. settings.event_create=Criar settings.event_create_desc=Branch ou Tag criado -settings.event_pull_request=Pull Request -settings.event_pull_request_desc=Pull request aberto, fechado, reaberto, atribuído, desatribuído, teve etiqueta atualizada ou limpada ou foi sincronizado. +settings.event_delete=Apagar +settings.event_delete_desc=Branch ou tag excluído +settings.event_fork=Fork +settings.event_fork_desc=Feito fork do repositório settings.event_push=Push settings.event_push_desc=Git push para o repositório +settings.event_issues=Problemas +settings.event_issues_desc=Problema aberto, fechado, reaberto, editado, atribuído, desatribuído, etiqueta atualizada, etiqueta limpa, milestone definido ou milestone indefinido. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull request aberto, fechado, reaberto, editado, atribuído, desatribuído, etiqueta atualizada, etiqueta limpa, milestone definido, milestone indefinido ou sincronizado. +settings.event_issue_comment=Comentário do Problema +settings.event_issue_comment_desc=Comentário do problema criado, editado ou excluído. +settings.event_release=Lançamento +settings.event_release_desc=Lançamento publicado em um 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. @@ -733,10 +858,13 @@ settings.delete_webhook=Excluir Webhook settings.recent_deliveries=Entregas Recentes settings.hook_type=Tipo de Hook settings.add_slack_hook_desc=Adicionar Slack de integração para o seu repositório. +settings.add_discord_hook_desc=Adicionar integração do Discord ao seu repositório. +settings.add_dingtalk_hook_desc=Adicionar integração do Dingtalk ao seu repositório. settings.slack_token=Token settings.slack_domain=Domínio settings.slack_channel=Canal settings.deploy_keys=Chaves de Deploy +settings.deploy_keys_helper=Pegadinha Comum! Se estiver buscando adicionar chaves públicas pessoais, faça isto nas suas configurações da conta. settings.add_deploy_key=Nova chave settings.deploy_key_desc=Chave de Deploy só tem acesso somente leitura. Não é igual as chaves SSH de conta pessoal. settings.no_deploy_keys=Você ainda não adicionou nenhuma chave de Deploy. @@ -748,6 +876,8 @@ 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.description_desc=Descrição do repositório. Tamanho máximo de 512 caracteres. +settings.description_length=Caracteres disponíveis diff.browse_source=Ver código fonte diff.parent=pai @@ -766,7 +896,6 @@ release.releases=Versões release.new_release=Nova versão release.draft=Rascunho release.prerelease=Versão prévia -release.stable=Estável release.edit=editar release.ahead=%d commits para %s depois desta versão release.source_code=Código fonte @@ -813,8 +942,8 @@ 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? -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. +form.name_not_allowed=Nome da organização ou padrão %q não é permitido. +form.team_name_not_allowed=Nome do time ou padrão %q não é permitido. settings=Configurações settings.options=Opções @@ -886,12 +1015,19 @@ first_page=Primeira last_page=Última total=Total: %d +dashboard.build_info=Informações da compilação +dashboard.app_ver=Versão do aplicativo +dashboard.git_version=Versão do Git +dashboard.go_version=Versão Go +dashboard.build_time=Data de compilação +dashboard.build_commit=Commit da compilação dashboard.statistic=Estatística dashboard.operations=Operações dashboard.system_status=Status do monitor de sistema dashboard.statistic_info=O banco de dados do Gogs contém %d usuários, %d organizações, %d chaves públicas, %d repositórios, %d observadores, %d estrelas, %d ações, %d acessos, %d questões, %d comentários, %d contas sociais, %d seguidores, %d espelhos, %d versões, %d origens de login, %d Hooks da Web, %d milestones, %d labels, %d tarefas hook, %d equipes, %d tarefas de atualização, %d anexos. dashboard.operation_name=Nome da operação dashboard.operation_switch=Trocar +dashboard.select_operation_to_run=Selecione a operação para executar 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. @@ -905,8 +1041,8 @@ dashboard.git_gc_repos=Fazer coleta de lixo nos repositórios dashboard.git_gc_repos_success=Em todos repositórios, a coleta de lixo foi realizada com sucesso. dashboard.resync_all_sshkeys=Reescrever o arquivo '.ssh/authorized_keys' (atenção: chaves que não sejam do Gogs 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.resync_all_hooks=Ressincronizar hooks pre-receive, update e post-receive de todos os repositórios +dashboard.resync_all_hooks_success=Os hooks pre-receive, update e post-receive de todos os repositórios foram ressincronizados 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. @@ -981,12 +1117,14 @@ 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.auth_sources=Fontes de autenticação auths.new=Adicionar nova fonte auths.name=Nome auths.type=Tipo auths.enabled=Habilitado +auths.default=Padrão auths.updated=Atualizado auths.auth_type=Tipo de autenticação auths.auth_name=Nome da autenticação @@ -995,15 +1133,21 @@ auths.domain=Domínio auths.host=Host auths.port=Porta auths.bind_dn=Vincular DN +auths.bind_dn_helper=Você pode usar '%s' como placeholderpara o nome de usuário, por exemplo, DOM\%s 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 auths.attribute_username_placeholder=Deixe vazio para usar o valor do campo de formulário de entrada de nome de usuário. -auths.attribute_name=Atributo primeiro nome +auths.attribute_name=Atributo do Nome auths.attribute_surname=Atributo sobrenome auths.attribute_mail=Atributo e-mail +auths.verify_group_membership=Verificar associação a grupo +auths.group_search_base_dn=Grupo de Pesquisa DN Base +auths.group_filter=Filtro de Grupo +auths.group_attribute_contain_user_list=Atributo do grupo contendo a lista de usuários +auths.user_attribute_listed_in_group=Atributo do usuário listado no grupo auths.attributes_in_bind=Buscar os atributos no contexto de Bind DN auths.filter=Filtro de usuário auths.admin_filter=Filtro de administrador @@ -1017,9 +1161,9 @@ 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.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.default_auth=Esta autenticação é uma fonte padrão de login 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 @@ -1028,107 +1172,189 @@ 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.deletion_success=Autenticação excluída com sucesso! +auths.login_source_exist=A fonte de login '%s" já existe. +auths.github_api_endpoint=Endpoint da API +config.not_set=(não definido) config.server_config=Configuração do servidor -config.app_name=Nome do aplicativo -config.app_ver=Versão do aplicativo -config.app_url=URL do aplicativo -config.domain=Domínio -config.offline_mode=Modo Offline -config.disable_router_log=Desabilitar o Log do router +config.brand_name=Nome da marca config.run_user=Usuário de execução config.run_mode=Modo de execução -config.repo_root_path=Caminho raiz do repositório -config.static_file_root_path=Caminho raiz para arquivo estático -config.log_file_root_path=Caminho raiz para arquivo de log -config.script_type=Tipo de script -config.reverse_auth_user=Usuário de autenticação reversa +config.server.external_url=URL externa +config.server.domain=Domínio +config.server.protocol=Protocolo +config.server.http_addr=Endereço HTTP +config.server.http_port=Porta HTTP +config.server.cert_file=Arquivo de certificado +config.server.key_file=Arquivo chave +config.server.tls_min_version=Versão mínima de TLS +config.server.unix_socket_permission=Permissão de soquete Unix +config.server.local_root_url=URL raiz local +config.server.offline_mode=Modo offline +config.server.disable_router_log=Desabilitar log do router +config.server.enable_gzip=Ativar Gzip +config.server.app_data_path=Caminho de dados da aplicação +config.server.load_assets_from_disk=Carregar ativos do disco +config.server.landing_url=Landing URL 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 -config.ssh_root_path=Caminho da raiz -config.ssh_key_test_path=Caminho da chave de teste -config.ssh_keygen_path=Caminho do keygen ('ssh-keygen') -config.ssh_minimum_key_size_check=Verificar tamanho mínimo da chave -config.ssh_minimum_key_sizes=Tamanhos mínimos da chave +config.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Configuração do Repositório +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=Configuração do banco de dados -config.db_type=Tipo -config.db_host=Host -config.db_name=Nome -config.db_user=Usuário -config.db_ssl_mode=Modo SSL -config.db_ssl_mode_helper=(apenas para "postgres") -config.db_path=Caminho -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.show_registration_button=Mostrar botão de registo -config.require_sign_in_view=Requerer entrar no Gogs 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.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Cookie para estado do login +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -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 -config.mailer_disable_helo=Desabilitar HELO -config.mailer_name=Nome -config.mailer_host=Host -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 -config.oauth_enabled=Habilitado +config.session_config=Configuração da sessão +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Configuração de cache -config.cache_adapter=Adaptador de cache -config.cache_interval=Intervalo de cache -config.cache_conn=Conexão de cache - -config.session_config=Configuração da sessão -config.session_provider=Provedor da sessão -config.provider_config=Configuração do provedor -config.cookie_name=Nome do cookie -config.enable_set_cookie=Habilitar uso de cookie -config.gc_interval_time=Tempo de Intervalo do GC -config.session_life_time=Tempo de vida da sessão -config.https_only=Apenas HTTPS -config.cookie_life_time=Tempo de vida do cookie +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=Configuração de HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Configuração da imagem -config.picture_service=Serviço de imagens -config.disable_gravatar=Desativar Gravatar -config.enable_federated_avatar=Habilitar avatares federativos +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Configuração de Hook da Web +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify config.git_config=Configuração do Git -config.git_disable_diff_highlight=Habilitar realce de mudanças no diff -config.git_max_diff_lines=Máximo de linhas mostradas no diff (para um único arquivo) -config.git_max_diff_line_characters=Máximo de caracteres mostrados no diff (para uma única linha) -config.git_max_diff_files=Máximo de arquivos a serem mostrados no diff -config.git_gc_args=Argumentos do GC -config.git_migrate_timeout=Timeout de migração -config.git_mirror_timeout=Timeout para sincronização de mirror -config.git_clone_timeout=Timeout para operação de clone -config.git_pull_timeout=Timeout para operação de pull -config.git_gc_timeout=Timeout para execução do GC +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path config.log_config=Configuração de log -config.log_mode=Modo do log +config.log_file_root_path=Caminho raiz para arquivo de log +config.log_mode=Modo +config.log_options=Opções monitor.cron=Tarefas cron monitor.name=Nome @@ -1159,17 +1385,24 @@ notices.delete_success=Avisos do sistema foram excluídos com sucesso. create_repo=repositório criado %s rename_repo=renomeou o o repositório %[1]s para %[3]s commit_repo=pushed para %[3]s em %[4]s +compare_commits=Ver comparação entre esses %d commits +transfer_repo=repositório transferido de %s para %s create_issue=`questão aberta %s#%[2]s` close_issue=`questão fechada %s#%[2]s` reopen_issue=`questão reaberta %s#%[2]s` +comment_issue=`comentou sobre a questão %s#%[2]s` create_pull_request=`criou o pull request %s#%[2]s` close_pull_request=`fechou o pull request %s#%[2]s` reopen_pull_request=`reabriu o pull request %s#%[2]s` -comment_issue=`comentou sobre a questão %s#%[2]s` merge_pull_request=`mesclou o pull request %s#%[2]s` -transfer_repo=repositório transferido de %s para %s +create_branch=criado novo branch %[3]s em %[4]s +delete_branch=excluído branch %[2]s em %[3]s push_tag=Foi feito push na tag %[2]s para %[3]s -compare_commits=Ver comparação entre esses %d commits +delete_tag=excluída tag %[2]s em %[3]s +fork_repo=repositório criado %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror [tool] ago=atrás @@ -1191,6 +1424,7 @@ months=%d meses %s years=%d anos %s raw_seconds=segundos raw_minutes=minutos +raw_hours=hours [dropzone] default_message=Arraste e solte arquivos aqui, ou clique para selecioná-los. diff --git a/conf/locale/locale_pt-PT.ini b/conf/locale/locale_pt-PT.ini new file mode 100644 index 00000000000..4aed948ffb1 --- /dev/null +++ b/conf/locale/locale_pt-PT.ini @@ -0,0 +1,1434 @@ +app_desc=Um Serviço Git fácil e simples + +home=Página Principal +dashboard=Painel de administração +explore=Explorar +help=Ajuda +sign_in=Iniciar Sessão +sign_out=Terminar Sessão +sign_up=Criar conta +register=Registe-se +website=Site Web +page=Página +template=Modelo +language=Língua +create_new=Criar... +user_profile_and_more=Perfil do utilizador e mais +signed_in_as=Sessão iniciada como + +username=Nome de utilizador +email=Endereço de email +password=Palavra-chave +re_type=Escreva de novo +captcha=Captcha + +repository=Repositório +organization=Organização +mirror=Espelho +new_repo=Novo repositório +new_migrate=Nova migração +new_mirror=Espelho novo +new_fork=Nova divisão de repositório +new_org=Nova organização +manage_org=Gerir organizações +admin_panel=Painel de Administração +account_settings=Configurações de conta +settings=Definições +your_profile=Perfil +your_settings=Suas configurações + +activities=Atividades +pull_requests=Pull requests +issues=Questões + +cancel=Cancelar + +[status] +page_not_found=Página Não Encontrada +internal_server_error=Erro do servidor interno + +[install] +install=Instalação +title=Procedimentos para a instalação inicial +docker_helper=Se estiver a executar o Gogs dentro de uma instância Docker, por favor leia asOrientações com atenção, antes de alterar algo nesta página! +requite_db_desc=Gogs requer uma destas base de dados: MySQL, PostgreSQL, SQLite3 ou TiDB (usando o protocolo MySQL). +db_title=Configurações da Base de Dados +db_type=Tipo de Base de Dados +host=Servidor +user=Utilizador +password=Palavra-Chave +db_name=Nome da base de dados +db_schema=Esquema +db_helper=Por favor, utilize o motor INNODB do MySQL, com suporte para o mapa de caracteres utf8_general_ci. +ssl_mode=Modo SSL +path=Directoria +sqlite_helper=Localização da base de dados SQLite3.
Por favor indique o caminho completo quando inicia o Gogs como serviço. +err_empty_db_path=A localização da base de dados SQLite3 não pode estar vazia. +no_admin_and_disable_registration=Não é possível desabilitar o registo de utilizadores, sem ter se criado uma conta de administrador. +err_empty_admin_password=A palavra-chave do administrador não pode ser vazia. + +general_title=Configurações gerais da aplicação +app_name=Nome da aplicação +app_name_helper=Insira o nome da sua organização aqui! +repo_path=Endereço raiz do repositório +repo_path_helper=Todos os repositórios remotos Git, serão guardados dentro desta directoria. +run_user=Executar em nome do utilizador +run_user_helper=O utilizador tem de deter acesso á raiz da directoria do repositório, e para executar o Gogs. +domain=Domínio +domain_helper=Isto afecta os URLs a clonar. +ssh_port=Porta SSH +ssh_port_helper=A porta em que o serviço SSH está a correr, deixar o campo vazio para desactivar a funcionalidade SSH. +use_builtin_ssh_server=Usar o servidor SSH embutido +use_builtin_ssh_server_popup=Iniciar o servidor SSH embutido para operações Git, para se distinguir do serviço SSH do sistema. +http_port=Porta HTTP +http_port_helper=Número da porta onde a aplicação irá escutar. +app_url=URL da aplicação +app_url_helper=Isto afecta o URL de HTTP/HTTPS e no e-mail. +log_root_path=Caminho dos Logs +log_root_path_helper=Directoria para aonde gravar os Logs. +enable_console_mode=Ativar o Modo Consola +enable_console_mode_popup=Para além de guardar logs num ficheiro, mostrá-los na consola. +default_branch=Ramo por omissão + +optional_title=Configurações opcionais +email_title=Configurações do serviço de e-mail +smtp_host=Anfitrião SMTP +smtp_from=De +smtp_from_helper=O endereço a ser utilizado no campo Mail from, conforme RFC 5322. Pode ser simplesmente um endereço de e-mail, ou no formato "Nome" . +mailer_user=Email do remetente +mailer_password=Senha do remetente +register_confirm=Activar a confirmação de registo +mail_notify=Ativar notificação por email +server_service_title=Configurações do servidor e outros serviços +offline_mode=Ativar modo offline +offline_mode_popup=Desactivar o CDN, mesmo em modo de produção, todos os recursos serão disponibilizados localmente. +disable_gravatar=Desactivar o serviço Gravatar +disable_gravatar_popup=Desactivar o Gravatar e outras fontes. Todos os avatares serão carregados pelos utilizadores, ou utilizado um de padrão. +federated_avatar_lookup=Activar a pesquisa de avatares federados +federated_avatar_lookup_popup=Activar a pesquisa de avatares federados com recurso ao serviço open source baseado no libravatar. +disable_registration=Desactivar o registo automático +disable_registration_popup=Desactivar o registo automático de utilizadores, somente o administrador os pode criar. +enable_captcha=Activar o Captcha +enable_captcha_popup=Requerer a validação do Captcha aquando do registo automático de utilizadores. +require_sign_in_view=Requerer que o utilizador esteja registado de modo a poder visualizar páginas +require_sign_in_view_popup=Somente utilizadores registado podem visualizar as restantes páginas. Visitantes somente irão ver as paginas de registo. +admin_setting_desc=Não é necessário criar uma conta de administração neste momento, em todo caso o utilizador que tiver o ID=1, irá obter direitos de administração automaticamente. +admin_title=Configurações da conta de administração +admin_name=Nome de utilizador +admin_password=Senha +confirm_password=Confirmar senha +admin_email=E-mail de administração +install_gogs=Instalar Gogs +test_git_failed=Falha ao testar o commando 'git': %v +sqlite3_not_available=A versão actual não suporta SQLite3. Por favor obtenha a versão de produção oficial em %s, e não a versão de desenvolvimento. +invalid_db_setting=Configurações da base de dados estão incorretas: %v +invalid_repo_path=A directoria para o repositório é invalida: %v +run_user_not_match=O utilizador de execução não é igual ao utilizador actual: %s -> %s +smtp_host_missing_port=Porta em falta no endereço SMTP. +invalid_smtp_from=Campo SMTP From inválido: %v +save_config_failed=Falha ao salvar a configuração: %v +init_failed=Falha ao inicializar a aplicação: %v +invalid_admin_setting=Configuração do utilizador de administração está inválida: %v +install_success=Bem-vindo! Estamos contentes por ter escolhido o Gogs, esperemos que goste. +invalid_log_root_path=Caminho da pasta de logs inválida: %v + +[home] +uname_holder=Nome de utilizador ou email +password_holder=Palavra-Chave +switch_dashboard_context=Alternar o contexto do Dashboard +my_repos=Os meus repositórios +show_more_repos=Mostrar mais repositórios... +collaborative_repos=Repositórios Colaborativos +my_orgs=As minhas Organizações +my_mirrors=Os meus mirrors +view_home=Ver %s + +issues.in_your_repos=Nos seus repositórios + +[explore] +repos=Repositórios +users=Utilizadores +organizations=Organizações +search=Pesquisa + +[auth] +create_new_account=Criar Nova Conta +register_hepler_msg=Já tem uma conta? Inicie sessão! +social_register_hepler_msg=Já tem uma conta? Ligue-a agora! +disable_register_prompt=Desculpe, o registo de novos utilizadores está desativado. Por favor contacte o administrador. +disable_register_mail=Desculpe, os serviços de email estão desativados. Por favor contacte o administrador. +auth_source=Tipo de autenticação +local=Local +remember_me=Manter sessão iniciada +forgot_password=Esqueci-me da palavra-passe +forget_password=Esqueceu a sua senha? +sign_up_now=Precisa de uma conta? Inscreva-se agora. +confirmation_mail_sent_prompt=Um novo e-mail de confirmação foi enviado para %s, por favor verifique caixa de correio dentro das próximas %d horas para completar o processo de registo. +active_your_account=Ative a sua conta +prohibit_login=Início de sessão proibido +prohibit_login_desc=A sua conta está proibida para início de sessão, por favor contacte o administrador. +resent_limit_prompt=Pedimos desculpa mas um pedido de e-mail de ativação foi efetuado recentemente. Por favor espere 3 minutos e tente novamente. +has_unconfirmed_mail=Olá %s, tem um endereço de e-mail não confirmado (%s). Se não recebeu um e-mail de confirmação ou precisa que seja reenviado um novo, por favor clique no botão abaixo. +resend_mail=Clique aqui para reenviar o seu e-mail de ativação +send_reset_mail=Clique aqui para (re)enviar um e-mail de restauro de senha +reset_password=Restaurar a sua senha +invalid_code=Desculpe, o seu código de confirmação expirou ou é inválido. +reset_password_helper=Clique aqui para restaurar a sua senha +password_too_short=O tamanho da senha não pode ser inferior a 6. +non_local_account=Contas não-locais não podem mudar a palavra-passe através do Gogs. + +login_two_factor=Autenticação em dois passos +login_two_factor_passcode=Passcode de autenticação +login_two_factor_enter_recovery_code=Digite um código de recuperação de dois passos +login_two_factor_recovery=Recuperação de dois passos +login_two_factor_recovery_code=Codigo de recuperação +login_two_factor_enter_passcode=Digite um código de recuperação de dois passos +login_two_factor_invalid_recovery_code=Código de recuperação foi usado ou não válido. + +[mail] +activate_account=Por favor ative a sua conta +activate_email=Verifique o seu endereço de e-mail +reset_password=Restaure a sua senha +register_success=Registo efetuado com sucesso, Bem-vindo +register_notify=Bem-vindo a bordo + +[modal] +yes=Sim +no=Não +modify=Modificar + +[form] +UserName=Nome de utilizador +RepoName=Nome do repositório +Email=Endereço de e-mail +Password=Senha +Retype=Reescreva a sua senha +SSHTitle=Nome da chave SSH +HttpsUrl=URL HTTPS +PayloadUrl=URL Payload +TeamName=Nome da equipa +AuthName=Nome de autorização +AdminEmail=E-mail de administração + +NewBranchName=Novo nome de branch +CommitSummary=Sumário do commit +CommitMessage=Mensagem do commit +CommitChoice=Escolha o commit +TreeName=Localização do ficheiro +Content=Conteúdo + +require_error=` não pode estar vazio.` +alpha_dash_error=` têm de ser caracteres alfa-numéricos ou traço(-_).` +alpha_dash_dot_error=` têm de ser caracteres alfa-numéricos, traço(-_) ou ponto.` +alpha_dash_dot_slash_error=` tem de ser composto por caracteres alfanuméricos, traços (-_), pontos ou barras.` +size_error=` tem de ter tamanho %s.` +min_size_error=` tem de conter pelo menos %s caracteres.` +max_size_error=` pode conter no máximo %s caracteres.` +email_error=` não é um endereço de e-mail válido.` +url_error=` não é um URL válido.` +include_error=` tem de conter o texto '%s'.` +unknown_error=Erro desconhecido: +captcha_incorrect=Captcha não coincide. +password_not_match=Senha e confirmação da senha não são iguais. + +username_been_taken=Nome de utilizador já em uso. +repo_name_been_taken=Nome de repositório já em uso. +org_name_been_taken=Nome de organização já em uso. +team_name_been_taken=Nome de equipa já em uso. +email_been_used=Endereço de e-mail já em uso. +username_password_incorrect=Nome de utilizador ou palavra-passe incorretos. +auth_source_mismatch=A fonte de autenticação selecionada não está associada com o utilizador. +enterred_invalid_repo_name=Por favor certifique-se que o nome do repositório inserido está correto. +enterred_invalid_owner_name=Certifique-se de que o nome do proprietário que introduziu está correcto. +enterred_invalid_password=Por favor certifique-se que a palavra-passe inserido está correta. +user_not_exist=Este utilizador não existe. +last_org_owner=A remoção do último utilizador da equipa proprietária não é permitida, pois sempre deve haver pelo menos um proprietário em uma determinada organização. + +invalid_ssh_key=Lamentamos, mas não conseguimos verificar a sua chave SSH: %s +unable_verify_ssh_key=Gogs não pode verificar sua chave SSH, mas assumimos que ela é válida, por favor, verifique novamente. +auth_failed=Falha na autenticação: %v + +still_own_repo=Sua conta ainda tem propriedade sobre pelo menos um repositório, você precisa excluí-los ou transferi-los primeiro. +still_has_org=Sua conta ainda tem participação em pelo menos uma organização, você tem que sair ou excluir suas associações primeiro. +org_still_own_repo=Esta organização ainda tem a propriedade de repositórios, você deve excluir ou transferi-los primeiro. + +target_branch_not_exist=Ramificação de destino não existe. + +[user] +change_avatar=Mudar o seu avatar +join_on=Juntou-se na +repositories=Repositórios +activity=Atividade pública +followers=Seguidores +starred=Repositórios favoritos +following=Seguindo +follow=Seguir +unfollow=Deixar de seguir + +form.name_not_allowed=Não é permitido usar o padrão '%s' para o nome do utilizador. + +[settings] +profile=Perfil +password=Palavra-Chave +avatar=Avatar +ssh_keys=Chaves SSH +security=Segurança +repos=Repositórios +orgs=Organizações +applications=Aplicações +delete=Apagar Conta + +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=Utilizadores remotos não tem permissão para mudarem seu nome de utilizador. +full_name=Nome Completo +website=Site +location=Localização +update_profile=Atualizar perfil +update_profile_success=Seu perfil foi actualizado com êxito. +change_username=Nome de utilizador alterado +change_username_prompt=Essa alteração vai afectar o modo como as ligações referem-se à sua conta. +continue=Continuar +cancel=Cancelar + +lookup_avatar_by_mail=Pesquisa de avatar por e-mail +federated_avatar_lookup=Pesquisa de avatar federado +enable_custom_avatar=Usar Avatar personalizado +choose_new_avatar=Escolher novo avatar +update_avatar=Atualizar a configuração de Avatar +delete_current_avatar=Excluir o Avatar atual +uploaded_avatar_not_a_image=Arquivo enviado não é uma imagem. +update_avatar_success=Sua configuração de avatar foi actualizada com sucesso. + +change_password=Alterar senha +old_password=Senha atual +new_password=Nova senha +retype_new_password=Reescreva a nova senha +password_incorrect=Senha atual incorreta. +change_password_success=A sua senha foi alterada com sucesso. Pode agora conectar-se utilizando a nova senha. +password_change_disabled=Utilizadores remotos não tem permissão para mudar a senha. + +emails=Endereços de e-mail +manage_emails=Gerir endereços de e-mail +email_desc=O seu endereço de e-mail principal será utilizado para notificações e outras operações. +primary=Principal +primary_email=Marcar como principal +delete_email=Eliminar +email_deletion=Eliminação de e-mail +email_deletion_desc=Eliminar este endereço de e-mail irá remover todas as informações relacionadas da sua conta. Pretende continuar? +email_deletion_success=O e-mail foi eliminado com sucesso! +email_deletion_primary=Não é possível remover o endereço de e-mail primário. +add_new_email=Adicionar um novo endereço de e-mail +add_email=Adicionar e-mail +add_email_confirmation_sent=Um novo e-mail de confirmação foi enviado para '%s', por favor verifique a sua caixa de correio dento das próximas %d horas para completar o processo de confirmação. +add_email_success=O seu novo endereço de e-mail foi adicionado com sucesso. + +manage_ssh_keys=Gerir chaves SSH +add_key=Adicionar chave +ssh_desc=Esta é uma lista de chaves SSH associadas com a sua conta. Como estas chaves permitem que qualquer pessoa que as use de ganhar acesso aos seus repositórios, é muito importante que as consiga reconhecer. +ssh_helper=Não sabe como? Confira o guia do GitHub para criar suas próprias chaves SSH ou resolver problemas comuns que você pode encontrar usando 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. +key_name=Nome da chave +key_content=Conteúdo +add_key_success=Nova chave SSH '%s' foi adicionado com sucesso! +delete_key=Eliminar +ssh_key_deletion=Exclusão Chave SSH +ssh_key_deletion_desc=Excluindo a chave SSH irá remover todos os acessos para sua conta. Deseja continuar? +ssh_key_deletion_success=Chave SSH foi excluída com sucesso! +add_on=Adicionado em +last_used=Usado pela última vez em +no_activity=Nenhuma atividade recente +key_state_desc=Esta chave foi usada nos últimos 7 dias +token_state_desc=Este token foi usado nos últimos 7 dias + +two_factor=Autenticação em dois passos +two_factor_status=Estado: +two_factor_on=Ligado +two_factor_off=Desligado +two_factor_enable=Ativar +two_factor_disable=Desativar +two_factor_view_recovery_codes=Ver e guardar os seus códigos de recuperação num lugar seguro. Pode usá-los como senha, se perder o acesso à sua aplicação de autenticação. +two_factor_http=Para operações de HTTP/HTTPS, não será possivel usar a senha e nome de utilizador simples. Crie e use umToken de acesso pessoal como credencial, e.g. %[3]s. +two_factor_enable_title=Ativar autenticação em dois passos +two_factor_scan_qr=Por favor, use a sua aplicação de autenticação para digitalizar a imagem: +two_factor_or_enter_secret=Ou digite o segredo: +two_factor_then_enter_passcode=Depois digite o código: +two_factor_verify=Verificar +two_factor_invalid_passcode=A senha inserida não é válida, por favor tente novamente! +two_factor_reused_passcode=A senha inserida já foi usada, por favor, tente outra! +two_factor_enable_error=Ativar autenticação em dois passos: %v +two_factor_enable_success=Autenticação em dois passos foi ativada para com sucesso! +two_factor_recovery_codes_title=Códigos de recupeção de autenticação em dois passos +two_factor_recovery_codes_desc=Os códigos de recuperação são utilizados se perder acesso a sua aplicação de autenticação. Cada código só pode ser utilizado uma vez, por favor, guarde estes códigos em lugar seguro. +two_factor_regenerate_recovery_codes=Regenerar códigos de recuperação +two_factor_regenerate_recovery_codes_error=Erro ao gerar códigos de recuperação +two_factor_regenerate_recovery_codes_success=Novos códigos de recuperação gerados com sucesso! +two_factor_disable_title=Desativar a Autenticação de dois fatores +two_factor_disable_desc=O nível de segurança da sua conta diminuirá após desativar a autenticação de dois fatores. Deseja mesmo continuar? +two_factor_disable_success=A autenticação de dois fatores foi desativada com sucesso! + +manage_access_token=Gerir Tokens de Acesso Pessoal +generate_new_token=Gerar Novo Token +tokens_desc=Tokens que gerou que podem ser usadas para aceder as APIs do Gogs. +access_token_tips=O token de acesso pessoal pode ser usado tanto como nome do utilizador ou senha de acesso. É recomendado usar o "x-access-token" como o nome do utilizador e o token de acesso pessoal como a senha para aplicações Git. +new_token_desc=Cada token vai ter acesso completo à sua conta. +token_name=Nome do Token +generate_token=Gerar Token +generate_token_succees=O seu token de acesso foi gerado com sucesso! Certifique-se de copiá-lo agora, pois você não será capaz de vê-lo novamente mais tarde! +delete_token=Eliminar +access_token_deletion=Exclusão de Token de acesso pessoal +access_token_deletion_desc=Ao excluir este token de acesso pessoal serão removidos todos os acessos da aplicação. Deseja continuar? +delete_token_success=O Token de acesso pessoal foi removido com sucesso! Não se esqueça de atualizar as suas aplicações também. +token_name_exists=Já existe um símbolo com o mesmo nome. + +orgs.none=Não é membro de nenhuma organização. +orgs.leave_title=Sair da Organização +orgs.leave_desc=Perderá acesso a todos os repositórios e equipas após deixar a organização. Deseja continuar? + +repos.leave=Sair +repos.leave_title=Sair do repositório +repos.leave_desc=Irá perder acesso ao repositório após sair. Deseja continuar? +repos.leave_success=Saiu do repositório '%s' com sucesso! + +delete_account=Excluir a sua conta +delete_prompt=A operação irá apagar sua conta permanentemente, e não será possível a sua recuperação! +confirm_delete_account=Confirmar a exclusão +delete_account_title=Exclusão de conta +delete_account_desc=Esta conta vai ser excluída permanentemente, deseja continuar? + +[repo] +owner=Proprietário +repo_name=Nome do Repositório +repo_name_helper=Um Bom nome de repositório e pequeno, memorável e único. +visibility=Visibilidade +unlisted=Não listado +visiblity_helper=Este repositório é Privado +unlisted_helper=Este repositório não está listado +visiblity_helper_forced=Administrador do site forçou todos os novos repositórios paraPrivado +visiblity_fork_helper=(Alterar 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 pode alterar a visibilidade de um repositório que foi forked. +repo_desc=Descrição +repo_lang=Língua +repo_gitignore_helper=Selecionar templates .gitignore +license=Licença +license_helper=Selecione um arquivo de licença +readme=Leia-me +readme_helper=Selecione um modelo de readme +auto_init=Inicializar este repositório com os arquivos selecionados e modelo +create_repo=Criar Repositório +default_branch=Ramo de Padrão +mirror_prune=Purgar +mirror_prune_desc=Remova quaisquer referências remotas que não existem mais remotamente +mirror_interval=Intervalo de Mirror (hora) +mirror_address=Endereço do Mirror +mirror_address_desc=Por favor, inclua as credenciais de utilizador necessários no endereço. +mirror_last_synced=Última sincronização +watchers=Observadores +stargazers=Fãns +forks=Forks +repo_description_helper=Descrição do repositório. Máximo de 512 caracteres. +repo_description_length=Caracteres disponíveis + +form.reach_limit_of_creation=O criador chegou ao limite de criação de %d repositórios. +form.name_not_allowed=Não é permitido utilizar o padrão '%s' para o nome do repositório. + +need_auth=Autorização necessária +migrate_type=Tipo de migração +migrate_type_helper=Este repositório será um mirror +migrate_repo=Migrar o Repositório +migrate.clone_address=Clonar Endereço +migrate.clone_address_desc=Isto pode ser um URL de HTTP/HTTPS/GIT. +migrate.clone_address_desc_import_local=Você também pode migrar um repositório pelo caminho do servidor local. +migrate.permission_denied=Não está autorizado a importar repositórios locais. +migrate.invalid_local_path=Caminho local inválido, o caminho não existe ou não é um directório. +migrate.clone_address_resolved_to_blocked_local_address=Clonar endereço resolvido para um endereço de rede local implicitamente bloqueado. +migrate.failed=Migração falhada: %v + +mirror_from=mirror de +forked_from=biforcado de +copy_link=Copiar +copy_link_success=Copiado! +copy_link_error=Pressione ⌘-C ou Ctrl-C para copiar +copied=Copiado +unwatch=Deixar de vigiar +watch=Vigiar +unstar=Retirar estrela +star=Colocar Estrela +fork=Fork + +no_desc=Sem 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 comandos +push_exist_repo=Empurrar um repositório existente na linha de comandos +bare_message=Este repositório ainda não tem qualquer conteúdo. + +files=Ficheiros +branch=Ramo +tree=Árvore +filter_branch_and_tag=Filtrar branch ou tag +branches=Ramos +tags=Etiquetas +issues=Problemas +pulls=Pull Requests +labels=Etiquetas +milestones=Objetivos +commits=Commits +git_branches=Ramos +releases=Lançamentos +file_raw=Em bruto +file_history=Histórico +file_view_raw=Ver em Bruto +file_permalink=Link permanente +file_too_large=Este ficheiro é muito grande para ser visualizado +video_not_supported_in_browser=Seu navegador não suporta a tag de vídeo em HTML5. + +branches.overview=Vista Geral +branches.active_branches=Ramificações Activas +branches.stale_branches=Ramificações Obsoletas +branches.all=Todas as Ramificações +branches.updated_by=Atualizado %[1]s por %[2]s +branches.change_default_branch=Mudar Ramificação Predefinida +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=Novo Ficheiro +editor.upload_file=Enviar ficheiro +editor.edit_file=Edita ficheiro +editor.preview_changes=Pré-visualizar Alterações +editor.cannot_edit_non_text_files=Impossível editar ficheiros que não são do tipo texto +editor.edit_this_file=Editar este ficheiro +editor.must_be_on_a_branch=Deve estar num branch para propor mudanças a este arquivo +editor.fork_before_edit=Deve fazer um fork deste repositório antes de editar o ficheiro +editor.delete_this_file=Apagar este ficheiro +editor.must_have_write_access=Você deve ter permissões de escrita para fazer ou propor alterações a este ficheiro +editor.file_delete_success=Ficheiro '%s' foi excluído com sucesso! +editor.name_your_file=Nomeie o seu ficheiro... +editor.filename_help=Para adicionar uma pasta, digite o nome e pressione /. Para remover uma pasta, vá para o inicio do campo e pressione backspace. +editor.or=ou +editor.cancel_lower=cancelar +editor.commit_changes=Confirmar alterações +editor.add_tmpl=Adicionar '%s/ ' +editor.add=Adicionar '%s ' +editor.update=Atualizar %s +editor.delete=Eliminar %s +editor.commit_message_desc=Adicione uma descrição opcional estendida... +editor.commit_directly_to_this_branch=Commit diretamente no branch %s. +editor.create_new_branch=Crie um novo branch para este commit e inicie um pull request. +editor.new_branch_name_desc=Novo nome do branch... +editor.cancel=Cancelar +editor.filename_cannot_be_empty=Nome do ficheiro não pode ser vazio. +editor.branch_already_exists=Branch '%s' já existe neste repositório. +editor.directory_is_a_file=Entrada '%s' no caminho pai é um ficheiro e não uma pasta neste repositório. +editor.file_is_a_symlink=O ficheiro '%s' é um link simbólico que não pode ser modificado a partir do editor web. +editor.filename_is_a_directory=O ficheiro '%s' é uma pasta existente neste repositório. +editor.file_editing_no_longer_exists=O ficheiro '%s' que está a editar já não existe neste repositório. +editor.file_changed_while_editing=O conteúdo do ficheiro mudou desde que começou a edita-lo. Clique aqui para ver o que mudou ou pressione Commit novamente para sobrescrever as mudanças. +editor.file_already_exists=Um ficheiro com nome '%s' já existe neste repositório. +editor.no_changes_to_show=Não existem alterações a mostrar. +editor.fail_to_update_file=Falha ao criar/atualizar ficheiro '%s': com o erro:%v +editor.fail_to_delete_file=Falha ao apagar ficheiro '%s' com o erro: %v +editor.add_subdir=Adicionar sub-diretório... +editor.unable_to_upload_files=Falha ao fazer upload de ficheiros para '%s': com o erro:%v +editor.upload_files_to_dir=Enviar ficheiros para '%s' + +commits.commit_history=Histórico de Commits +commits.commits=Commits +commits.search=Procurar commits +commits.find=Pesquisar +commits.author=Autor +commits.message=Mensagem +commits.date=Data +commits.older=Antigo +commits.newer=Recente + +issues.new=Novo Problema +issues.new.labels=Etiquetas +issues.new.no_label=Sem Etiqueta +issues.new.clear_labels=Limpar Etiquetas +issues.new.milestone=Objetivo +issues.new.no_milestone=Sem Objetivo +issues.new.clear_milestone=Limpar Objetivo +issues.new.open_milestone=Objetivos Abertos +issues.new.closed_milestone=Objetivos Fechados +issues.new.assignee=Atribuído a +issues.new.clear_assignee=Limpar atribuição +issues.new.no_assignee=Sem utilizador atribuido +issues.create=Criar um problema +issues.new_label=Nova etiqueta +issues.new_label_placeholder=Nome da etiqueta... +issues.create_label=Criar etiqueta +issues.label_templates.title=Carregar um conjunto predefinido de etiquetas +issues.label_templates.info=Ainda não existem quaisquer etiquetas. Pode clicar no botão "Nova etiqueta" acima para criar uma ou selecione um conjunto pré-definido em baixo. +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=Falha ao carregar a ficheiro modelo de etiquetas '%s': %v +issues.open_tab=%d Aberto +issues.close_tab=%d Fechado +issues.filter_label=Etiqueta +issues.filter_label_no_select=Sem etiqueta selecionada +issues.filter_milestone=Objetivo +issues.filter_milestone_no_select=Nenhum milestone selecionado +issues.filter_assignee=Atribuído a +issues.filter_assginee_no_select=Sem utilizador atribuido +issues.filter_type=Tipo +issues.filter_type.all_issues=Todos os problemas +issues.filter_type.assigned_to_you=Atribuído a si +issues.filter_type.created_by_you=Criado por si +issues.filter_type.mentioning_you=Mencionado por sí +issues.filter_sort=Ordenar +issues.filter_sort.latest=Mais recente +issues.filter_sort.oldest=Mais antigo +issues.filter_sort.recentupdate=Recentemente actualizado +issues.filter_sort.leastupdate=Menos recentemente atualizado +issues.filter_sort.mostcomment=Mais comentado +issues.filter_sort.leastcomment=Menos comentado +issues.opened_by=%[1]s aberto por %[3]s +issues.opened_by_fake=aberto %[1]s por %[2]s +issues.previous=Anterior +issues.next=Próximo +issues.open_title=Aberto +issues.closed_title=Fechado +issues.num_comments=%d comentários +issues.commented_at=`comentado %s` +issues.delete_comment_confirm=Tem certeza que deseja apagar este comentário? +issues.no_content=Ainda não existe conteúdo. +issues.close_issue=Fechar +issues.close_comment_issue=Comentar e fechar +issues.reopen_issue=Reabrir +issues.reopen_comment_issue=Comentar e re-abrir +issues.create_comment=Comentário +issues.closed_at=`fechado %[2]s` +issues.reopened_at=`reaberto %[2]s` +issues.commit_ref_at=`referenciou este problema num commit %[2]s` +issues.poster=Cartaz +issues.collaborator=Colaborador +issues.owner=Proprietário +issues.sign_in_require_desc=Faça login para participar desta conversação. +issues.edit=Editar +issues.cancel=Cancelar +issues.save=Guardar +issues.label_title=Nome da etiqueta +issues.label_color=Cor da etiqueta +issues.label_count=%d etiquetas +issues.label_open_issues=%d abrir problemas +issues.label_edit=Editar +issues.label_delete=Eliminar +issues.label_modify=Modificação de etiqueta +issues.label_deletion=Eliminação de etiqueta +issues.label_deletion_desc=Excluir esta etiqueta retirará a sua informação de todos os problemas relacionados. Deseja continuar? +issues.label_deletion_success=A etiqueta foi excluída com sucesso! +issues.num_participants=%d Participantes +issues.attachment.open_tab=`Clique para ver "%s" numa nova aba` +issues.attachment.download=`Clique para baixar "%s"` + +pulls.new=Novo Pull Request +pulls.compare_changes=Comparar alterações +pulls.compare_changes_desc=Comparar dois branches e criar um pull request com as alterações. +pulls.compare_base=base +pulls.compare_compare=comparar +pulls.filter_branch=Filtrar branch +pulls.no_results=Não foram encontrados resultados. +pulls.nothing_to_compare=Não há nada para comparar porque o branch base e o cabeçalho estão iguais. +pulls.nothing_merge_base=Não há o que comparar pois os dois branches possuem históricos completamente diferentes. +pulls.has_pull_request=`Já existe um pull requests entre estes dois alvos: %[2]s#%[3]d` +pulls.create=Criar Pull Request +pulls.title_desc=quer mesclar %[1]d commits de %[2]s em %[3]s +pulls.merged_title_desc=mesclou %[1]d commits de %[2]s em %[3]s %[4]s +pulls.tab_conversation=Conversação +pulls.tab_commits=Commits +pulls.tab_files=Ficheiros modificados +pulls.reopen_to_merge=Por favor reabra este pull request para executar a operação de merge. +pulls.merged=Merge realizado +pulls.has_merged=O merge deste pull request foi aplicado com sucesso! +pulls.data_broken=Os 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 dentro de 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 porque existem conflitos. +pulls.cannot_auto_merge_helper=Por favor, aplique o merge manualmente para resolver os conflitos. +pulls.create_merge_commit=Criar um commit de merge +pulls.rebase_before_merging=Rebase antes de merging +pulls.commit_description=Descrição de Commit +pulls.merge_pull_request=Solicitar merge de Pull Request +pulls.open_unmerged_pull_exists=`Não pode executar a operação de reabrir porque já existe um Pull request (#%d) do mesmo repositório com as mesmas informações de merge que está a aguardar pelo merge.` +pulls.delete_branch=Excluir Branch +pulls.delete_branch_has_new_commits=O branch não pode ser excluído por possuir novos commits após o merge. + +milestones.new=Novo Objetivo +milestones.open_tab=%d Aberto +milestones.close_tab=%d Fechado +milestones.closed=Fechados %s +milestones.no_due_date=Sem data de vaidade +milestones.open=Aberto +milestones.close=Fechar +milestones.new_subheader=Crie marcos para gerir os seus problemas. +milestones.create=Criar objetivo +milestones.title=Título +milestones.desc=Descrição +milestones.due_date=Data de vencimento (opcional) +milestones.clear=Limpar +milestones.invalid_due_date_format=Formato inválido. O valor de data devera ser 'aaaa-mm-dd'. +milestones.create_success=O Milestone '%s' foi criado com sucesso! +milestones.edit=Editar objetivo +milestones.edit_subheader=Utilize uma boa descrição para o Milestone, assim as pessoas não ficarão confusas. +milestones.cancel=Cancelar +milestones.modify=Editar objetivo +milestones.edit_success=O Milestone '%s' foi alterado com sucesso! +milestones.deletion=Exclusão do Milestone +milestones.deletion_desc=Excluir este Milestone irá remover toda sua informação em todos as issues a que estiver associado. Deseja continuar? +milestones.deletion_success=Milestone excluído com sucesso! + +wiki=Wiki +wiki.welcome=Bem-vindo à wiki! +wiki.welcome_desc=Wiki é o lugar onde poderá 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.save_page=Guardar 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=Remover Página +wiki.delete_page_notice_1=Isto irá apagar a página "%s". Por favor, certifique-se. +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 + +settings=Definições +settings.options=Opções +settings.collaboration=Colaboração +settings.collaboration.admin=Admin +settings.collaboration.write=Escrever +settings.collaboration.read=Ler +settings.collaboration.undefined=Indefinido +settings.branches=Branches +settings.branches_bare=Não é possível gerir branches num repositório vazio. Por favor adicione algum conteúdo primeiro. +settings.default_branch=Ramo de Padrão +settings.default_branch_desc=O branch padrão é considerado a "base" branch para commits, pull requests e edição on-line. +settings.update=Atualizar +settings.update_default_branch_unsupported=Mudar o branch padrão não é suportado pela versão do Git no servidor. +settings.update_default_branch_success=O branch padrão deste repositório foi atualizado com sucesso! +settings.protected_branches=Branches Protegidos +settings.protected_branches_desc=Proteger branches de push forçado, remoção acidental e committers da lista de desbloqueio. +settings.choose_a_branch=Selecione um Branch... +settings.branch_protection=Proteção de Branch +settings.branch_protection_desc=Escolha opções de proteção para o branch %s. +settings.protect_this_branch=Proteger este branch +settings.protect_this_branch_desc=Desativa pushes forçados e prevenir remoção. +settings.protect_require_pull_request=Requerer pull request em vez de push direto +settings.protect_require_pull_request_desc=Ative esta opção para desativar push direto para este branch. Os Commits precisam de um push para outro branch não protegido e merge para este branch por meio de um pull request. +settings.protect_whitelist_committers=Incluir na lista de desbloqueio quem pode fazer push para este branch +settings.protect_whitelist_committers_desc=Adicionar pessoas ou equipas na lista de desbloqueio de push direto para este branch. Utilizadores na lista de desbloqueio contornarão a verificação de pull request. +settings.protect_whitelist_users=Utilizadores que podem realizar push para este branch +settings.protect_whitelist_search_users=Pesquisar utilizadores +settings.protect_whitelist_teams=Equipas cujos membros podem realizar push para este branch +settings.protect_whitelist_search_teams=Procurar Equipas +settings.update_protect_branch_success=As opções de proteção deste branch foram atualizadas com sucesso! +settings.hooks=Webhooks +settings.githooks=Hooks do Git +settings.basic_settings=Definições Básicas +settings.mirror_settings=Definições de janela +settings.sync_mirror=Sincronizar agora +settings.mirror_sync_in_progress=A sincronização do mirror está a decorrer, por favor atualize a página em aproximadamente um minuto. +settings.site=Site oficial +settings.update_settings=Actualizar definições +settings.change_reponame_prompt=Esta alteração irá afetar os links relacionados com este repositório. +settings.advanced_settings=Definições Avançadas +settings.wiki_desc=Ativar sostema Wiki +settings.use_internal_wiki=Utilizar wiki nativa +settings.allow_public_wiki_desc=Permitir acesso público à wiki quando o repositório for privado +settings.use_external_wiki=Utilizar wiki externa +settings.external_wiki_url=URL externo da Wiki +settings.external_wiki_url_desc=Os visitantes serão redirecionados para o URL ao clicar na aba. +settings.issues_desc=Ativar gestor de problemas +settings.use_internal_issue_tracker=Utilizar o issue tracker nativo +settings.allow_public_issues_desc=Permitir acesso público a problemas quando o repositório e privado +settings.use_external_issue_tracker=Usar gestor de problemas externo +settings.external_tracker_url=URL do gestor de problemas externo +settings.external_tracker_url_desc=Visitantes serão redirecionados para o URL quando clicarem na aba. +settings.tracker_url_format=Formato de URL do Issue Tracker Externo +settings.tracker_issue_style=Estilo de nome de Issue Tracker Externo: +settings.tracker_issue_style.numeric=Numérico +settings.tracker_issue_style.alphanumeric=Alfanumérico +settings.tracker_url_format_desc=Pode utilizar o espaço reservado {user} {repo} {index} para o nome de utilizador, índice de nome e a questão do repositório. +settings.pulls_desc=Ativar pull requests para aceitar contribuições entre repositórios e branches +settings.pulls.ignore_whitespace=Ignorar alterações com espaço em branco +settings.pulls.allow_rebase_merge=Permitir rebase para commits via merge +settings.danger_zone=Zona de perigo +settings.cannot_fork_to_same_owner=Não pode realizar fork de um repositório para o seu dono original. +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=Pode converter este Mirror num repositório tradicional. Esta ação não pode ser revertida. +settings.convert_notices_1=- Esta operação vai converter este repositório Mirror num repositório tradicional e esta ação não pode ser revertida. +settings.convert_confirm=Confirmar Conversão +settings.convert_succeed=Repositório Mirror convertido para tradicional com sucesso. +settings.transfer=Transferir Propriedade +settings.transfer_desc=Transferir este repositório para outro utilizador ou organização onde tem direitos de administrador. +settings.transfer_notices_1=- Irá perder o acesso se o novo dono for um utilizador individual. +settings.transfer_notices_2=- Irá manter acesso se o novo dono é uma organização e se é um dos donos. +settings.transfer_form_title=Por favor Informe a seguinte informação para confirmar a sua operação: +settings.wiki_delete=Apagar dados da Wiki +settings.wiki_delete_desc=Uma vez que apague os dados da wiki, não e possível reverte-los. Por favor, certifique-se. +settings.wiki_delete_notices_1=- Isto irá excluir e desativar o wiki para %s +settings.wiki_deletion_success=Os dados da wiki do repositório foram apagados com sucesso. +settings.delete=Apagar Este Repositório +settings.delete_desc=Uma vez que remova um repositório, não e possível reverte-lo. Por favor certifique-se. +settings.delete_notices_1=Esta operação NÃO PODERÁ ser desfeita. +settings.delete_notices_2=- Esta operação irá apagar permanentemente tudo neste repositório, incluindo dados do Git, commits, issues, comentários, o wiki e acesso dos colaboradores. +settings.delete_notices_fork_1=-Todos os forks ficarã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 proprietário +settings.make_transfer=Fazer transferência +settings.transfer_succeed=A propriedade do repositório foi transferida com sucesso. +settings.confirm_delete=Confirme a eliminação +settings.add_collaborator=Adicionar novo colaborador +settings.add_collaborator_success=Novo colaborador foi adicionado. +settings.delete_collaborator=Eliminar +settings.collaborator_deletion=Exclusão de colaborador +settings.collaborator_deletion_desc=Este utilizador perderá acesso ao repositório. Deseja continuar? +settings.remove_collaborator_success=Colaborador foi removido. +settings.search_user_placeholder=Procurar utilizador... +settings.org_not_allowed_to_be_collaborator=A organização não tem permissão para ser adicionada como colaboradora. +settings.hooks_desc=Webhooks são muito parecidos com triggers básicos de eventos HTTP POST. Sempre que algo ocorre no Gogs, vamos lidar com a notificação para o host de destino especificado. Saiba mais no nosso Guia de Webhooks. +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Escolha um tipo... +settings.add_webhook=Adicionar Webhook +settings.webhook_deletion=Apagar um Webhook +settings.webhook_deletion_desc=Apagar este Webhook vai remover sua informação e todo o histórico de entrega. Deseja continuar? +settings.webhook_deletion_success=Webhook foi apagado com sucesso! +settings.webhook.test_delivery=Teste de entrega +settings.webhook.test_delivery_desc=Enviar uma entrega de evento Push falso para testar as configurações de Webhook +settings.webhook.test_delivery_success=O Webhook de teste foi adicionado a fila de entrega. Pode demorar alguns segundos antes de ser exibido no histórico de entrega. +settings.webhook.redelivery=Reentrega +settings.webhook.redelivery_success=A tarefa Hook '%s' foi re-adicionada à fila de entrega. Pode demorar alguns segundos para o estado da entrega no histórico ser atualizada. +settings.webhook.request=Pedido +settings.webhook.response=Resposta +settings.webhook.headers=Cabeçalho +settings.webhook.payload=Payload +settings.webhook.body=Corpo +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. +settings.githooks_desc=Hooks do Git são disponibilizados pelo próprio Git, pode editar ficheiros de Hooks suportados na lista abaixo para aplicar operações personalizadas. +settings.githook_edit_desc=Se o hook estiver inativo, o conteúdo de exemplo será apresentado. Deixar o conteúdo em branco irá desativar este hook. +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 que ocorreram. Pode também especificar qual formato de dados que gostaria de receber no trigger do hook (JSON, x-www-form-urlencoded, XML, etc). Mais informação pode ser encontrada em Guia de Webhooks. +settings.payload_url=URL Payload +settings.content_type=Tipo de Conteúdo +settings.secret=Código secreto +settings.secret_desc=O segredo será enviado como SHA256 HMAC hex digest do payload via X-Gogs-Signature. +settings.slack_username=Nome de utilizador +settings.slack_icon_url=URL do Ícone +settings.slack_color=Cor +settings.event_desc=Quando este webhook devera ser ativado? +settings.event_push_only=Apenas o evento push +settings.event_send_everything=Preciso de tudo +settings.event_choose=Deixe-me escolher o que eu preciso +settings.event_create=Criar +settings.event_create_desc=Branch ou Tag criado +settings.event_delete=Eliminar +settings.event_delete_desc=Branch ou tag excluído +settings.event_fork=Fork +settings.event_fork_desc=Efetuado Fork do repositório +settings.event_push=Push +settings.event_push_desc=Git push para um repositório +settings.event_issues=Problemas +settings.event_issues_desc=Problema aberto, fechado, reaberto, editado, atribuído, retirada atribuição, etiqueta atualizada, etiqueta limpa, milestone definido ou milestone indefinido. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull Request aberto, fechado, reaberto, editado, atribuído, retirada atribuição, etiqueta atualizada, etiqueta limpa, milestone definido, milestone indefinido ou sincronizado. +settings.event_issue_comment=Comentário do Problema +settings.event_issue_comment_desc=Comentário do problema criado, editado ou excluído. +settings.event_release=Lançamento +settings.event_release_desc=Lançamento publicado no repositório. +settings.active=Ativo +settings.active_helper=Enviaremos detalhes do evento quando este hook for ativado. +settings.add_hook_success=Novos webhook foram adicionados. +settings.update_webhook=Atualizar Webhook +settings.update_hook_success=Webhook atualizado. +settings.delete_webhook=Excluir Webhook +settings.recent_deliveries=Entregas Recentes +settings.hook_type=Tipo de Hook +settings.add_slack_hook_desc=Adicionar Slack de integração para o seu repositório. +settings.add_discord_hook_desc=Adicionar integração do Discord para o seu repositório. +settings.add_dingtalk_hook_desc=Adicionar integração do Dingtalk ao seu repositório. +settings.slack_token=Token +settings.slack_domain=Domínio +settings.slack_channel=Canal +settings.deploy_keys=Chaves de Deploy +settings.deploy_keys_helper=Common Gotcha! Se estiver a tentar adicionar chaves públicas pessoais, faça-o nas suas configurações da conta. +settings.add_deploy_key=Adicionar Chave de Deploy +settings.deploy_key_desc=Chave de Deploy só tem acesso de leitura. Não é igual as chaves SSH da conta pessoal. +settings.no_deploy_keys=Ainda não adicionou nenhuma chave de Deploy. +settings.title=Título +settings.deploy_key_content=Conteúdo +settings.key_been_used=Conteúdo da Chave de Deploy foi utilizado. +settings.key_name_used=Uma chave de Deploy já existe com este nome. +settings.add_key_success=Nova chave de Deploy '%s' foi adicionada com sucesso! +settings.deploy_key_deletion=Apagar chave de Deploy +settings.deploy_key_deletion_desc=Excluir esta chave de Deploy removerá permissões de acesso a este repositório. Deseja continuar? +settings.deploy_key_deletion_success=Chave de Deploy excluída com sucesso! +settings.description_desc=Descrição do repositório. Máximo de 512 caracteres. +settings.description_length=Caracteres disponíveis + +diff.browse_source=Ver Fonte +diff.parent=pai +diff.commit=commit +diff.data_not_available=Dados Diff Não Disponíveis. +diff.show_diff_stats=Mostrar Estatísticas Diff +diff.show_split_view=Visão Dividida +diff.show_unified_view=Visão Unificada +diff.stats_desc= %d ficheiros alterados com %d adições e %d exclusões +diff.bin=BIN +diff.view_file=Ver Ficheiro +diff.file_suppressed=Diff do ficheiro suprimidas por serem muito extensas +diff.too_many_files=Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff + +release.releases=Lançamentos +release.new_release=Novos lançamentos +release.draft=Rascunho +release.prerelease=Versão Prévia +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 pode ajudar utilizadores a entenderem o que foi melhorado. +release.tag_name=Nome da etiqueta +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 +release.preview=Pré-visualizar +release.loading=A carregar... +release.prerelease_desc=Esta é uma versão prévia +release.prerelease_helper=Salientamos que esta versão não esta pronta para produção. +release.cancel=Cancelar +release.publish=Publicar Versão +release.save_draft=Guardar Rascunho +release.edit_release=Editar Versão +release.delete_release=Apagar esta Versão +release.deletion=Exclusão de Versão +release.deletion_desc=Apagar esta versão vai remover a tag do git correspondente. Deseja continuar? +release.deletion_success=A versão foi removida com sucesso! +release.tag_name_already_exist=Já existe uma versão com este nome de tag. +release.tag_name_invalid=Nome de tag não é válido. +release.downloads=Transferências + +[org] +org_name_holder=Nome da organização +org_full_name_holder=Nome completo da organização +org_name_helper=Nomes de grandes organizações são curtos e memoráveis. +create_org=Criar Organização +repo_updated=Atualizado +people=Membros +invite_someone=Convidar +teams=Equipas +lower_members=membros +lower_repositories=repositórios +create_new_team=Criar equipa +org_desc=Descrição +team_name=Nome da equipa +team_desc=Descrição +team_name_helper=Utilizara este nome para mencionar esta equipa em conversas. +team_desc_helper=Do que se trata essa equipa? +team_permission_desc=Que nível de permissão esta equipa deve ter? + +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. + +settings=Configurações +settings.options=Opções +settings.full_name=Nome Completo +settings.website=WebSite +settings.location=Localização +settings.update_settings=Atualizar Configurações +settings.update_setting_success=Configuração da organização foi atualizada com sucesso. +settings.change_orgname_prompt=Esta alteração vai afetar como os links se relacionam nesta 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, Deseja continuar? +settings.hooks_desc=Adicionar Webhooks que serão acionados para todos os repositórios desta organização. + +members.membership_visibility=Visibilidade da Associação: +members.public=Público +members.public_helper=tornar privado +members.private=Privado +members.private_helper=tornar público +members.member_role=Categoria de Membro: +members.owner=Proprietário +members.member=Membro +members.remove=Remover +members.leave=Sair +members.invite_desc=Adicionar novo membro a %s: +members.invite_now=Convidar agora + +teams.join=Juntar +teams.leave=Sair +teams.read_access=Acesso de leitura +teams.read_access_helper=Esta equipa poderá ver e clonar os próprios repositórios. +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.admin_access=Acesso de administração +teams.admin_access_helper=Esta equipa será capaz de fazer push/pull nos seus repositórios, bem como adicionar outros colaboradores. +teams.no_desc=Esta equipa não tem descrição +teams.settings=Definições +teams.owners_permission_desc=Donos tem acesso total a todos repositórios e também direitos de administrador na organização. +teams.members=Membros da equipa +teams.update_settings=Actualizar definições +teams.delete_team=Apagar esta equipa +teams.add_team_member=Adicionar um Membro +teams.delete_team_title=Eliminação de equipa +teams.delete_team_desc=Esta equipa será excluída, membros desta equipa poderão perder acesso a alguns repositórios. Deseja continuar? +teams.delete_team_success=A equipa foi excluída com sucesso. +teams.read_permission_desc=Membros desta equipa concedem acesso para Leitura: membros podem ver e clonar os repositórios da equipa. +teams.write_permission_desc=Membros desta equipa concedem acesso para Escrita: membros podem ler e fazer push para os repositórios da equipa. +teams.admin_permission_desc=Membros nesta equipa concedem acesso de Administrador: Membros podem ler, fazer push e adicionar outros colaboradores para os repositórios da equipa. +teams.repositories=Repositórios de equipa +teams.search_repo_placeholder=Procurar repositório... +teams.add_team_repository=Adicionar repositório de equipa +teams.remove_repo=Remover +teams.add_nonexistent_repo=O repositório que está a tentar adicionar não existe, por favor crie-o primeiro. + +[admin] +dashboard=Painel de administração +users=Utilizadores +organizations=Organizações +repositories=Repositórios +authentication=Autenticações +config=Configuração +notices=Notificações de Sistema +monitor=Monitorização +first_page=Primeiro +last_page=Último +total=Total: %d + +dashboard.build_info=Informações da compilação +dashboard.app_ver=Versão da Aplicação +dashboard.git_version=Versão do Git +dashboard.go_version=Versão do Go +dashboard.build_time=Tempo de compilação +dashboard.build_commit=Submissão da compilação +dashboard.statistic=Estatísticas +dashboard.operations=Operações +dashboard.system_status=Monitorização de estado do sistema +dashboard.statistic_info=A base de dados do Gogs contém %d utilizadores, %d organizações, %d chaves públicas, %d repositórios, %d observadores, %d estrelas, %d ações, %d acessos, %d questões, %d comentários, %d contas sociais, %d seguidores, %d mirrors, %d versões, %d origens de login, %d Hooks da Web, %d milestones, %d labels, %d tarefas hook, %d equipas, %d tarefas de atualização, %d anexos. +dashboard.operation_name=Nome de operação +dashboard.operation_switch=Mudar +dashboard.select_operation_to_run=Seleccione a operação para executar +dashboard.operation_run=Executar +dashboard.clean_unbind_oauth=Limpar OAuthes desvinculados +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 ficheiros dos repositórios +dashboard.delete_repo_archives_success=Todos os ficheiros dos repositórios foram excluídos com sucesso. +dashboard.delete_missing_repos=Apagar todos os repositórios que perderam ficheiros do Git +dashboard.delete_missing_repos_success=Todos os registos de repositórios que perderam ficheiros do Git foram apagados com sucesso. +dashboard.git_gc_repos=Fazer coleta de lixo nos repositórios +dashboard.git_gc_repos_success=Em todos repositórios a coleta de lixo foi realizada com sucesso. +dashboard.resync_all_sshkeys=Reescrever '.ssh/authorized_keys' (atenção: chaves que não sejam do Gogs serão perdidas) +dashboard.resync_all_sshkeys_success=Todas as chaves públicas foram reescritas com sucesso. +dashboard.resync_all_hooks=Ressincronizar hooks pre-receive, update e post-receive de todos os repositórios +dashboard.resync_all_hooks_success=Os hooks pre-receive, update e post-receive de todos os repositórios foram ressincronizados com sucesso. +dashboard.reinit_missing_repos=Reinicializar todos os registos de repositório que perderam os ficheiros do Git +dashboard.reinit_missing_repos_success=Todos os repositórios que perderam ficheiros do Git foram reinicializados com sucesso. + +dashboard.server_uptime=Uptime do Servidor +dashboard.current_goroutine=Goroutines Atuais +dashboard.current_memory_usage=Utilização de memória atual +dashboard.total_memory_allocated=Total de memória alocada +dashboard.memory_obtained=Memória obtida +dashboard.pointer_lookup_times=Nº Consulta de Ponteiros +dashboard.memory_allocate_times=Nº Alocações de Memória +dashboard.memory_free_times=Nº de Libertações de Memória +dashboard.current_heap_usage=Uso Atual da Heap +dashboard.heap_memory_obtained=Memória de Heap Obtida +dashboard.heap_memory_idle=Memória da Heap Idle +dashboard.heap_memory_in_use=Memória da Heap em Uso +dashboard.heap_memory_released=Memória da Heap Libertada +dashboard.heap_objects=Objetos na Heap +dashboard.bootstrap_stack_usage=Uso de Bootstrap Stack +dashboard.stack_memory_obtained=Memória de Stack Obtida +dashboard.mspan_structures_usage=Utilização de Estruturas de MSpan +dashboard.mspan_structures_obtained=Estruturas de MSpan Obtidas +dashboard.mcache_structures_usage=Utilização de Estruturas MCache +dashboard.mcache_structures_obtained=Estruturas de MCache Obtidas +dashboard.profiling_bucket_hash_table_obtained=Perfil Obtido da Bucket Hash Table +dashboard.gc_metadata_obtained=Metadados do GC Obtidos +dashboard.other_system_allocation_obtained=Outra Alocação de Sistema Obtida +dashboard.next_gc_recycle=Próxima Reciclagem do GC +dashboard.last_gc_time=Desde da Ultima Vez do GC +dashboard.total_gc_time=Pausa Total do GC +dashboard.total_gc_pause=Pausa Total do GC +dashboard.last_gc_pause=Última Pausa do GC +dashboard.gc_times=Nº Execuções do GC + +users.user_manage_panel=Painel de Gestão de Utilizador +users.new_account=Criar Nova Conta +users.name=Nome +users.activated=Ativado +users.admin=Admin +users.repos=Repos +users.created=Criado +users.send_register_notify=Enviar Notificação de Registo ao Utilizador +users.new_success=Nova conta '%s' foi criada com sucesso. +users.edit=Editar +users.auth_source=Fontes de autenticação +users.local=Local +users.auth_login_name=Autenticação de nome de usuário +users.password_helper=Deixe em branco para não alterar. +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=(Utilize "-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_import_local=Esta conta tem permissões para importar repositórios locais +users.update_profile=Atualizar perfil +users.delete_account=Apagar Conta +users.still_own_repo=Esta conta ainda é proprietária de pelo menos um repositório, deve excluir ou transferi-lo primeiro. +users.still_has_org=Esta conta ainda faz parte de pelo menos uma organização, deve sair ou excluí-la primeiro. +users.deletion_success=Conta foi excluída com sucesso! + +orgs.org_manage_panel=Painel de Gestão de Organização +orgs.name=Nome +orgs.teams=Equipas +orgs.members=Membros + +repos.repo_manage_panel=Painel de gestão de repositório +repos.owner=Proprietário +repos.name=Nome +repos.private=Privado +repos.watches=Monitorizado +repos.stars=Estrelas +repos.issues=Problemas +repos.size=Tamanho + +auths.auth_sources=Fontes de autenticação +auths.new=Adicionar Nova Fonte +auths.name=Nome +auths.type=Tipo +auths.enabled=Ativada +auths.default=Predefinido +auths.updated=Atualizado +auths.auth_type=Tipo de autenticação +auths.auth_name=Nome de autenticação +auths.security_protocol=Protocolo de segurança +auths.domain=Domínio +auths.host=Anfitrião +auths.port=Porta +auths.bind_dn=Vincular DN +auths.bind_dn_helper=Pode utilizar '%s' como placeholder para o nome de utilizador, por exemplo, DOM\%s +auths.bind_password=Vincular Senha +auths.bind_password_helper=Atenção: Esta senha é armazenada texto. Não utilize uma conta com privilégios elevados. +auths.user_base=Base de Pesquisa de Utilizador +auths.user_dn=Utilizador do DN +auths.attribute_username=Atributo do Utilizador +auths.attribute_username_placeholder=Deixe vazio para utilizar o valor do campo do formulário de entrada do nome de utilizador. +auths.attribute_name=Atributo do Primeiro Nome +auths.attribute_surname=Atributo do Sobrenome +auths.attribute_mail=Atributo do e-mail +auths.verify_group_membership=Verificar associação a grupo +auths.group_search_base_dn=Base Pesquisa de grupo DN +auths.group_filter=Filtro de Grupo +auths.group_attribute_contain_user_list=Atributos de Grupo com Lista de Utilizadores +auths.user_attribute_listed_in_group=Atributo de Utilizador Listado no Grupo +auths.attributes_in_bind=Procurar atributos no contexto de Vinculo DN +auths.filter=Filtro de Utilizador +auths.admin_filter=Filtro de Administrador +auths.ms_ad_sa=Microsoft Active Directory SA +auths.smtp_auth=Tipo de Autenticação SMTP +auths.smtphost=Anfitrião SMTP +auths.smtpport=Porta SMTP +auths.allowed_domains=Domínios Permitidos +auths.allowed_domains_helper=Deixe em branco para permitir qualquer domínio. Vários domínios devem ser separados por vírgula ','. +auths.enable_tls=Ativar encriptação TLS +auths.skip_tls_verify=Ignorar Verificação TLS +auths.pam_service_name=Nome do Serviço PAM +auths.enable_auto_register=Ativar Registo Automático +auths.edit=Editar Configuração de Autenticação +auths.activated=Esta Autenticação foi Ativada +auths.default_auth=Essa autenticação é a fonte de login padrão +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 Configuração de Autenticação +auths.delete=Apagar 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 é utilizada por alguns utilizadores. Por favor remova ou converta esses utilizadores para outro tipo de login primeiro. +auths.deletion_success=Autenticação foi excluída com sucesso! +auths.login_source_exist=A fonte de login '%s" já existe. +auths.github_api_endpoint=Endpoint da API + +config.not_set=(não definido) +config.server_config=Configuração do Servidor +config.brand_name=Nome da marca +config.run_user=Utilizador de execução +config.run_mode=Mode de execução +config.server.external_url=URL externo +config.server.domain=Domínio +config.server.protocol=Protocolo +config.server.http_addr=Endereço HTTP +config.server.http_port=Porta HTTP +config.server.cert_file=Ficheiro de certificado criptográfico +config.server.key_file=Ficheiro da chave criptográfica privada +config.server.tls_min_version=Versão mínima TLS +config.server.unix_socket_permission=Permissão de soquete Unix +config.server.local_root_url=URL raíz local +config.server.offline_mode=Modo offline +config.server.disable_router_log=Desativar o log do Router +config.server.enable_gzip=Activar Gzip +config.server.app_data_path=Caminho de dados da aplicação +config.server.load_assets_from_disk=Carregar activos do disco +config.server.landing_url=URL de Destino + +config.ssh_config=Configuração SSH +config.ssh.enabled=Activado +config.ssh.domain=Domínio exposto +config.ssh.port=Porta exposta +config.ssh.root_path=Caminho para a raíz +config.ssh.keygen_path=Localização do gerador de chaves criptográficas +config.ssh.key_test_path=Localização do teste das chaves criptográficas +config.ssh.minimum_key_size_check=Verificação de tamanho mínimo da chave +config.ssh.minimum_key_sizes=Tamanhos mínimos de chaves +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Iniciar servidor embutido +config.ssh.listen_host=Servidor +config.ssh.listen_port=Porta do servidor +config.ssh.server_ciphers=Cifras do servidor +config.ssh.server_macs=MACs do servidor +config.ssh.server_algorithms=Algoritmos do servidor + +config.repo_config=Configuração de repositório +config.repo.root_path=Localização base +config.repo.script_type=Tipo de script +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Forçar privado +config.repo.max_creation_limit=Limite máximo de criação +config.repo.preferred_licenses=Licenças preferidas +config.repo.disable_http_git=Desativar Git HTTP +config.repo.enable_local_path_migration=Ativar a migração de caminho local +config.repo.enable_raw_file_render_mode=Ativar o modo de renderização do ficheiro bruto +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Extensões de quebra automática de linha do editor +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Envio ativado +config.repo.upload.temp_path=Caminho temporário para envios +config.repo.upload.allowed_types=Tipos de envios permitidos +config.repo.upload.file_max_size=Tamanho limite de ficheiros enviados +config.repo.upload.max_files=Quantidade limite de ficheiros enviados + +config.db_config=Configuração da base de dados +config.db.type=Tipo +config.db.host=Anfitrião +config.db.name=Nome +config.db.schema=Esquema +config.db.schema_helper=(apenas para "postgres") +config.db.user=Utilizador +config.db.ssl_mode=Modo SSL +config.db.ssl_mode_helper=(apenas para "postgres") +config.db.path=Caminho +config.db.path_helper=(apenas para "sqlite3") +config.db.max_open_conns=Máximo de conexões abertas +config.db.max_idle_conns=Máximo de conexões ociosas + +config.security_config=Configuração da segurança +config.security.login_remember_days=Dias lembrados de login +config.security.cookie_remember_name=Lembrar do cookie +config.security.cookie_username=Cookie do nome do utilizador +config.security.cookie_secure=Ativar cookie seguro +config.security.reverse_proxy_auth_user=Cabeçalho de autenticação de proxy reverso +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Configuração de E-mail +config.email.enabled=Ativado +config.email.subject_prefix=Prefixo do assunto +config.email.host=Anfitrião +config.email.from=De +config.email.user=Utilizador +config.email.disable_helo=Desativar HELO +config.email.helo_hostname=Nome de anfitrião HELO +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Usar certificado personalizado +config.email.cert_file=Ficheiro de certificado criptográfico +config.email.key_file=Ficheiro da chave criptográfica +config.email.use_plain_text=Usar texto simples +config.email.add_plain_text_alt=Adicionar alternativa de texto simples +config.email.send_test_mail=Enviar e-mail de teste +config.email.test_mail_failed=Falhou o envio do e-mail de teste para '%s': %v +config.email.test_mail_sent=O e-mail de teste foi enviado para '%s'. + +config.auth_config=Configuração da autenticação +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Exigir confirmação por e-mail +config.auth.require_sign_in_view=Exigir login para ver +config.auth.disable_registration=Desativar registo +config.auth.enable_registration_captcha=Ativar captcha para registar +config.auth.enable_reverse_proxy_authentication=Ativar autenticação do proxy reverso +config.auth.enable_reverse_proxy_auto_registration=Ativar o registo automático do proxy reverso +config.auth.reverse_proxy_authentication_header=Cabeçalho de autenticação de proxy reverso + +config.user_config=Configuração do utilizador +config.user.enable_email_notify=Ativar a notificação por e-mail + +config.session_config=Configuração de sessão +config.session.provider=Provedor +config.session.provider_config=Configuração do provedor +config.session.cookie_name=Cookie +config.session.https_only=Somente HTTPS +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie + +config.cache_config=Configuração de cache +config.cache.adapter=Adaptador +config.cache.interval=Intervalo de GC +config.cache.host=Anfitrião + +config.http_config=Configuração HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Configuração de anexos +config.attachment.enabled=Ativado +config.attachment.path=Caminho +config.attachment.allowed_types=Tipos permitidos +config.attachment.max_size=Limite de tamanho +config.attachment.max_files=Limite de ficheiros + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Tamanho máximo dos anexos +config.release.attachment.max_files=Attachment files limit + +config.picture_config=Configuração de imagem +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Intervalo predefinido + +config.webhook_config=Configuração de WebHook +config.webhook.types=Tipos +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Configuração Git +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path + +config.log_config=Configuração de Log +config.log_file_root_path=Caminho Raiz para Ficheiro Log +config.log_mode=Modo +config.log_options=Opções + +monitor.cron=Tarefas Cron +monitor.name=Nome +monitor.schedule=Programa +monitor.next=Próxima vez +monitor.previous=Vez anterior +monitor.execute_times=Tempos de Execução +monitor.process=Processos em Execução +monitor.desc=Descrição +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 de Notificações +notices.actions=Ações +notices.select_all=Selecionar Todas +notices.deselect_all=Desselecionar Todas +notices.inverse_selection=Inverter Seleção +notices.delete_selected=Apagar Seleção +notices.delete_all=Apagar todas as notificações +notices.type=Tipo +notices.type_1=Repositório +notices.desc=Descrição +notices.op=Op. +notices.delete_success=Notificações do sistema foram apagados com sucesso. + +[action] +create_repo=repositório criado %s +rename_repo=renomeou o o repositório %[1]s para %[3]s +commit_repo=pushed para %[3]s em %[4]s +compare_commits=Ver comparação para estes %d commits +transfer_repo=repositório transferido de %s para %s +create_issue=`questão aberta %s#%[2]s` +close_issue=`questão fechada %s#%[2]s` +reopen_issue=`questão reaberta %s#%[2]s` +comment_issue=`comentou a questão %s#%[2]s` +create_pull_request=`criou pull request %s#%[2]s` +close_pull_request=`fechou pull request %s#%[2]s` +reopen_pull_request=`reabriu pull request %s#%[2]s` +merge_pull_request=`mesclou pull request %s#%[2]s` +create_branch=criado novo branch %[3]s em %[4]s +delete_branch=apagado branch %[2]s em %[3]s +push_tag=feito push tag %[2]s para %[3]s +delete_tag=apagada tag %[2]s em %[3]s +fork_repo=forked repositório para %s +mirror_sync_push=sincronizados commits para %[3]s em %[4]s do mirror +mirror_sync_create=nova referência sincronizada %[2]s para %[3]s do mirror +mirror_sync_delete=referência sincronizada e apagada %[2]s em %[3]s do mirror + +[tool] +ago=atrás +from_now=a partir de agora +now=agora +1s=1 segundo %s +1m=há 1 minuto %s +1h=há 1 hora %s +1d=há 1 dia %s +1w=há 1 semana %s +1mon=há 1 mês %s +1y=há 1 ano %s +seconds=há %d segundos %s +minutes=há %d minutos %s +hours=há %d horas %s +days=há %d dias %s +weeks=há %d semanas %s +months=há %d meses %s +years=há %d anos %s +raw_seconds=segundos +raw_minutes=minutos +raw_hours=hours + +[dropzone] +default_message=Coloque os ficheiros aqui ou clique em enviar. +invalid_input_type=Não é possivel enviar ficheiros deste tipo. +file_too_big=Tamanho do ficheiro ({{filesize}} MB) excede o tamanho máximo ({{maxFilesize}} MB). +remove_file=Remover ficheiro + diff --git a/conf/locale/locale_ro-RO.ini b/conf/locale/locale_ro-RO.ini new file mode 100644 index 00000000000..6f99aa67874 --- /dev/null +++ b/conf/locale/locale_ro-RO.ini @@ -0,0 +1,1434 @@ +app_desc=Un serviciu Git auto-găzduit fără dureri de cap + +home=Acasă +dashboard=Prezentare generală +explore=Explorează +help=Ajutor +sign_in=Autentificare +sign_out=Deconectare +sign_up=Înregistrare +register=Înregistrare +website=Site web +page=Pagina +template=Șablon +language=Limba +create_new=Creare... +user_profile_and_more=Profilul utilizatorului și multe altele +signed_in_as=Conectat ca + +username=Numele de utilizator +email=E-mail +password=Parolă +re_type=Introduceți din nou +captcha=Captcha + +repository=Repositoriu +organization=Organizație +mirror=Replici +new_repo=Repositoriu nou +new_migrate=Migrare nouă +new_mirror=Replică nouă +new_fork=Repositoriu nou bifurcat +new_org=Organizație nouă +manage_org=Gestionare organizații +admin_panel=Panou Administrator +account_settings=Setări cont +settings=Setări +your_profile=Profilul dumneavoastră +your_settings=Setările tale + +activities=Activități +pull_requests=Trageți solicitările +issues=Probleme + +cancel=Anulare + +[status] +page_not_found=Pagina nu a fost găsită +internal_server_error=Eroare internă de server + +[install] +install=Instalare +title=Pașii de instalare pentru prima rulare +docker_helper=Dacă rulați Gogs în interiorul Docker, vă rugăm să citiți Regulile cu atenție înainte de a schimba ceva în această pagină! +requite_db_desc=Gogs necesită MySQL, PostgreSQL, SQLite3 sau TiDB (prin protocolul MySQL). +db_title=Setări bază de date +db_type=Tipul bazei de date +host=Gazdă +user=Utilizator +password=Parolă +db_name=Numele bazei de date +db_schema=Schemă +db_helper=Vă rugăm să utilizați motorul INNODB cu un set de caractere utf8_general_ci pentru MySQL. +ssl_mode=Mod SSL +path=Cale +sqlite_helper=Calea fișierului bazei de date SQLite3.
Vă rugăm să utilizați calea absolută când începeți ca serviciu. +err_empty_db_path=Calea bazei de date SQLite3 nu poate fi goală. +no_admin_and_disable_registration=Nu puteți dezactiva înregistrarea fără a crea un cont de administrator. +err_empty_admin_password=Parola de administrator nu poate fi goală. + +general_title=Setări generale ale aplicației +app_name=Numele aplicației +app_name_helper=Pune-ți numele organizației aici imens și tare! +repo_path=Calea de rădăcină a depozitului +repo_path_helper=Toate repositoriile de la distanță Git vor fi salvate în acest director. +run_user=Rulați utilizator +run_user_helper=Utilizatorul trebuie să aibă acces la Calea Root din Repositoriu și să execute Gogs. +domain=Domeniu +domain_helper=Aceasta afectează adresele URL ale clonelor SSH. +ssh_port=Portul SSH +ssh_port_helper=Numărul de port pe care îl folosește serverul dvs. SSH, lăsați-l gol pentru a dezactiva funcția SSH. +use_builtin_ssh_server=Utilizați serverul SSH încorporat +use_builtin_ssh_server_popup=Porniți serverul SSH încorporat pentru operațiunile Git pentru a distinge de demonul SSH de sistem. +http_port=Portul HTTP +http_port_helper=Numărul de port pe care aplicația va asculta. +app_url=Adresa URL a aplicației +app_url_helper=Aceasta afectează URL-ul clonării HTTP / HTTPS și undeva în e-mail. +log_root_path=Calea de jurnal +log_root_path_helper=Director în care să scrie fișiere jurnal. +enable_console_mode=Activați modul consolă +enable_console_mode_popup=În plus față de modul fișier, imprimați și jurnalele pentru consolă. +default_branch=Sucursala implicită + +optional_title=Setări opționale +email_title=Setări servicii de e-mail +smtp_host=Gazdă SMTP +smtp_from=De la +smtp_from_helper=Mail de la adresa, RFC 5322. Poate fi doar o adresă de e-mail sau formatul „Nume” . +mailer_user=E-mail expeditor +mailer_password=Parola expeditorului +register_confirm=Activați confirmarea înregistrării +mail_notify=Activați notificarea prin e-mail +server_service_title=Setări server și alte servicii +offline_mode=Activați modul Offline +offline_mode_popup=Dezactivați CDN chiar și în modul de producție, toate fișierele de resurse vor fi servite local. +disable_gravatar=Dezactivați serviciul Gravatar +disable_gravatar_popup=Dezactivează Gravatar și sursele personalizate, toate avatarurile sunt încărcate de către utilizatori sau implicit. +federated_avatar_lookup=Activați căutarea avatarurilor federate +federated_avatar_lookup_popup=Activați căutarea avatarilor federați pentru a utiliza serviciul open source federalizat bazat pe libravatar. +disable_registration=Dezactivați Auto-înregistrarea +disable_registration_popup=Dezactivați auto-înregistrarea utilizatorului, numai administratorul poate crea conturi. +enable_captcha=Activați Captcha +enable_captcha_popup=Necesită validarea captcha pentru auto-înregistrare. +require_sign_in_view=Activați Conectare Necesară pentru a vizualiza pagini +require_sign_in_view_popup=Numai utilizatorii conectați pot vizualiza pagini, vizitatorii vor putea vedea paginile de conectare/înregistrare. +admin_setting_desc=Nu trebuie să creați un cont de administrator acum. Primului utilizator din tabelul (users) i se va acorda automat acces de administrare. +admin_title=Setările contului Admin +admin_name=Nume utilizator +admin_password=Parolă +confirm_password=Confirmați Parola +admin_email=E-mail administrator +install_gogs=Instalaţi Gogs +test_git_failed=Eșuare în a testa comanda 'git': %v +sqlite3_not_available=Versiunea dvs. de lansare nu acceptă SQLite3, vă rugăm să descărcați versiunea binară oficială de la %s, NU versiunea gobuild. +invalid_db_setting=Setarea bazei de date nu este corectă: %v +invalid_repo_path=Calea rădăcină a repozitorului nu este validă: %v +run_user_not_match=Utilizatorul care rulează nu este utilizatorul curent: %s -> %s +smtp_host_missing_port=Portul gazdă SMTP lipsește din adresă. +invalid_smtp_from=Câmpul SMTP nu este valid: %v +save_config_failed=Eșuare în a salva configurația: %v +init_failed=Nu s-a putut inițializa aplicația: %v +invalid_admin_setting=Setarea contului de administrator nu este validă: %v +install_success=Bine ai venit! Ne bucurăm că ai ales Gogs, distrează-te și ai grijă de tine. +invalid_log_root_path=Calea rădăcină a jurnalului nu este validă: %v + +[home] +uname_holder=Nume utilizator sau e-mail +password_holder=Parolă +switch_dashboard_context=Comutați contextul tabloului de bord +my_repos=Repozitoriile mele +show_more_repos=Afișează mai multe repozitorii... +collaborative_repos=Repozitoriile Colaborative +my_orgs=Organizațiile mele +my_mirrors=Oglindirile mele +view_home=Vezi %s + +issues.in_your_repos=În repozitorile tale + +[explore] +repos=Repozitorii +users=Utilizatori +organizations=Organizații +search=Căutați + +[auth] +create_new_account=Creați un cont nou +register_hepler_msg=Aveți deja un cont? Conectați-vă acum! +social_register_hepler_msg=Aveți deja un cont? Legați acum! +disable_register_prompt=Ne pare rău, înregistrarea a fost dezactivată. Vă rugăm să contactați administratorul site-ului. +disable_register_mail=Ne pare rău, serviciile de e-mail sunt dezactivate. Vă rugăm să contactați administratorul site-ului. +auth_source=Sursa de autentificare +local=Local +remember_me=Ține-mă minte +forgot_password=Ați uitat parola +forget_password=Ați uitat parola? +sign_up_now=Nevoie de un cont? Inscrie-te acum. +confirmation_mail_sent_prompt=Un nou e-mail de confirmare a fost trimis către %s , vă rugăm să verificați căsuța de e-mail în următoarele %d ore pentru a finaliza procesul de înregistrare. +active_your_account=Activați contul dvs. +prohibit_login=Conectarea Interzisă +prohibit_login_desc=Contul dvs. nu are voie să se autentifice. Vă rugăm să contactați administratorul site-ului. +resent_limit_prompt=Ne pare rău, ați solicitat deja un e-mail de activare recent. Vă rugăm să așteptați 3 minute, apoi încercați din nou. +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=Faceți clic aici pentru a retransmite e-mailul de activare +send_reset_mail=Faceți clic aici pentru a (re) trimite adresa de e-mail de resetare a parolei +reset_password=Resetați-vă parola +invalid_code=Ne pare rău, codul dvs. de confirmare a expirat sau nu este valabil. +reset_password_helper=Faceți clic aici pentru a vă reseta parola +password_too_short=Lungimea parolei trebuie să fie de cel puțin 6 caractere. +non_local_account=Conturile non-locale nu pot schimba parolele prin Gogs. + +login_two_factor=Autentificare în doi pași +login_two_factor_passcode=Codul de autentificare +login_two_factor_enter_recovery_code=Introduceți un cod de recuperare pentru verificarea în doi pași +login_two_factor_recovery=Recuperare verificare în doi pași +login_two_factor_recovery_code=Cod de recuperare +login_two_factor_enter_passcode=Introduceți un cod de recuperare pentru verificarea în doi pași +login_two_factor_invalid_recovery_code=Cod de recuperare deja utilizat sau nu este valid. + +[mail] +activate_account=Vă rugăm să vă activați contul +activate_email=Verificați adresa dvs. de e-mail +reset_password=Resetați-vă parola +register_success=Înregistrare reușită, bun venit +register_notify=Bine ați venit la bord + +[modal] +yes=Da +no=Nu +modify=Modifică + +[form] +UserName=Nume utilizator +RepoName=Nume repozitoriu +Email=Adresa de e-mail +Password=Parola +Retype=Reintroduceți parola +SSHTitle=Numele cheii SSH +HttpsUrl=URL-ul HTTPS +PayloadUrl=URL-ul Payload +TeamName=Numele echipei +AuthName=Numele autorizației +AdminEmail=E-mail administrator + +NewBranchName=Nume nou ramură +CommitSummary=Sumar consemnare +CommitMessage=Mesaj consemnare +CommitChoice=Alegere consemnare +TreeName=Cale fișier +Content=Conținut + +require_error=` nu poate fi gol." +alpha_dash_error=` must be valid alpha or numeric or dash(-_) characters.` +alpha_dash_dot_error=` must be valid alpha or numeric or dash(-_) or dot characters.` +alpha_dash_dot_slash_error=` must be valid alpha or numeric or dash(-_) or dot characters or slashes.` +size_error=` must be size %s.` +min_size_error=` trebuie să conţină cel puţin %s caractere." +max_size_error=` trebuie să conţină cel mult %s caractere." +email_error=` nu este o adresă de e-mail validă` +url_error=` nu este un URL valid.` +include_error=' trebuie să conţină subşirul '%s'.' +unknown_error=Eroare necunoscută: +captcha_incorrect=Captcha nu se potriveşte. +password_not_match=Parola și confirmarea parolei nu sunt identice. + +username_been_taken=Numele de utilizator a fost deja luat. +repo_name_been_taken=Numele depozitului a fost deja luat. +org_name_been_taken=Numele organizației a fost deja luat. +team_name_been_taken=Numele echipei a fost deja luat. +email_been_used=Adresa de e-mail a fost deja folosită. +username_password_incorrect=Numele de utilizator sau parola nu sunt corecte. +auth_source_mismatch=Sursa de autentificare selectată nu este asociată cu utilizatorul. +enterred_invalid_repo_name=Asigurați-vă că numele depozitului pe care l-ați introdus este corect. +enterred_invalid_owner_name=Asigurați-vă că numele pe care l-ați introdus este corect. +enterred_invalid_password=Asigurați-vă că parola introdusă este corectă. +user_not_exist=Utilizatorul nu există. +last_org_owner=Eliminarea ultimului utilizator rămas de la o echipă de proprietari nu este permisă, deoarece o organizație trebuie să aibă întotdeauna cel puțin un proprietar. + +invalid_ssh_key=Sorry, we're not able to verify your SSH key: %s +unable_verify_ssh_key=Gogs nu poate verifica cheia SSH, dar se presupune că este validă. Te rugăm să o verifici. +auth_failed=Autentificare eșuată: %v + +still_own_repo=Contul tău are încă proprietate asupra a cel puțin un depozit, trebuie să îl ștergi sau să îl transferi mai întâi. +still_has_org=Contul tău încă are calitatea de membru în cel puțin o organizație, trebuie să părăsești sau să ștergi mai întâi abonamentele. +org_still_own_repo=Această organizație încă are drept de proprietate asupra depozitelor, trebuie să le ștergeți sau să le transferați mai întâi. + +target_branch_not_exist=Ramura țintă nu există. + +[user] +change_avatar=Schimbați-vă avatarul +join_on=Înregistrat pe +repositories=Repozitorii +activity=Activitate publică +followers=Urmăritori +starred=Repozitorii favorite +following=Urmăresc +follow=Urmăriți +unfollow=Anulați urmărirea + +form.name_not_allowed=Numele de utilizator sau modelul %q nu sunt permise. + +[settings] +profile=Profil +password=Parolă +avatar=Poză de profil +ssh_keys=Chei SSH +security=Securitate +repos=Repozitorii +orgs=Organizații +applications=Aplicații +delete=Șterge contul + +public_profile=Profil public +profile_desc=Adresa dvs. de e-mail este publică și va fi folosită pentru orice notificări legate de cont și pentru orice operațiuni web realizate prin intermediul site-ului. +password_username_disabled=Utilizatorilor de tip non-local nu li se permite să își schimbe numele de utilizator. +full_name=Numele complet +website=Site web +location=Locație +update_profile=Actualizare Profil +update_profile_success=Profilul a fost actualizat cu succes. +change_username=Nume utilizator schimbat +change_username_prompt=Această modificare va afecta modul în care legăturile direcționează spre contul dumneavoastră. +continue=Continuă +cancel=Anulează + +lookup_avatar_by_mail=Caută imagine de profil prin mail +federated_avatar_lookup=Activați căutarea avatarurilor federate +enable_custom_avatar=Folosește imagine de profil personalizată +choose_new_avatar=Alege o noua imagine de profil +update_avatar=Actualizează setările imaginii de profil +delete_current_avatar=Șterge avatarul curent +uploaded_avatar_not_a_image=Fișierul încărcat nu este o imagine. +update_avatar_success=Setările imaginii dumneavoastre de profil au fost actualizate cu succes. + +change_password=Schimbă Parola +old_password=Parola actuală +new_password=Parolă nouă +retype_new_password=Reintroduceți noua parolă +password_incorrect=Parola actuală nu este corectă. +change_password_success=Parola dumneavoastră a fost schimbată cu succes și poate fi acum folosită pentru autentificare. +password_change_disabled=Utilizatorilor de tip non-local nu li se permite să își schimbe parola. + +emails=Adrese de e-mail +manage_emails=Gestionați adresele de e-mail +email_desc=Adresa dumneavoastră de e-mail principală va fi utilizată pentru notificări și alte operațiuni. +primary=Principal +primary_email=Setează ca principală +delete_email=Șterge +email_deletion=Ștergere e-mail +email_deletion_desc=Ștergerea acestei adrese de e-mail va elimina informațiile aferente din contul dumneavoastră. Doriți să continuați? +email_deletion_success=Emailul a fost șters cu succes! +email_deletion_primary=Nu se poate șterge adresa principală de e-mail. +add_new_email=Adăugați o nouă adresă de e-mail +add_email=Adăugați E-mail +add_email_confirmation_sent=Un nou e-mail de confirmare a fost trimis la "%s", vă rugăm să vă verificați căsuța poștală în următoarele %d ore pentru a finaliza procesul de confirmare. +add_email_success=Noua dumneavoastră adresă de e-mail a fost adăugată cu succes. + +manage_ssh_keys=Gestionează cheile SSH +add_key=Adaugă Cheie +ssh_desc=Aceasta este o listă de chei SSH asociate contului dumneavoastră. Deoarece aceste chei permit oricui le folosește să obțină acces la depozitele dumneavoastră, este foarte important să vă asigurați că le recunoașteți. +ssh_helper=Nu știi cum? Consultați ghidul GitHub pentru creați-vă propriile chei SSH ori rezolvați common problems problemele pe care le puteți întâlni folosind SSH. +add_new_key=Adaugă cheie SSH +ssh_key_been_used=A fost utilizat conținutul cheii publice. +ssh_key_name_used=Cheia publică cu același nume a existat deja. +key_name=Nume cheie +key_content=Conținut +add_key_success=Noua cheie SSH "%s" a fost adăugată cu succes! +delete_key=Șterge +ssh_key_deletion=Ștergere cheie SSH +ssh_key_deletion_desc=Ștergerea acestei chei SSH va elimina toate accesele aferente pentru contul dumneavoastră. Doriți să continuați? +ssh_key_deletion_success=Cheia SSH a fost ștearsă cu succes! +add_on=Adăugat pe +last_used=Utilizat ultima dată pe +no_activity=Nicio activitate recentă +key_state_desc=Această cheie este utilizată în ultimele 7 zile +token_state_desc=Acest token este utilizat în ultimele 7 zile + +two_factor=Autentificare în doi pași +two_factor_status=Status: +two_factor_on=Pornit +two_factor_off=Oprit +two_factor_enable=Activează +two_factor_disable=Dezactivează +two_factor_view_recovery_codes=Vizualizați și salvați codurile dumneavoastră de recuperare într-un loc sigur. Le puteți utiliza ca și cod de acces dacă pierdeți accesul la aplicația de autentificare. +two_factor_http=Pentru operațiunile HTTP/HTTPS, nu mai puteți utiliza numele de utilizator și parola simple. Vă rugăm să creați și să utilizați Token de Acces Personal ca și credențial, de ex. %[3]s. +two_factor_enable_title=Activați autentificarea cu doi factori +two_factor_scan_qr=Vă rugăm să folosiți aplicația de autentificare pentru a scana imaginea: +two_factor_or_enter_secret=Sau introduceți secretul: +two_factor_then_enter_passcode=Apoi introduceți codul de acces: +two_factor_verify=Verifică +two_factor_invalid_passcode=Codul de acces pe care l-ați introdus nu este valid, vă rugăm să încercați din nou! +two_factor_reused_passcode=Codul de acces pe care l-ați introdus a fost deja utilizat, vă rugăm să încercați altul! +two_factor_enable_error=Activarea autentificării în doi pași a eșuat: %v +two_factor_enable_success=Autentificarea cu doi factori a fost activată cu succes pentru contul dumneavoastră! +two_factor_recovery_codes_title=Coduri de recuperare a autentificării cu doi factori +two_factor_recovery_codes_desc=Codurile de recuperare sunt utilizate atunci când pierdeți temporar accesul la aplicația de autentificare. Fiecare cod de recuperare poate fi utilizat o singură dată,
vă rugăm să păstrați aceste coduri într-un loc sigur
. +two_factor_regenerate_recovery_codes=Coduri de recuperare Regenerate +two_factor_regenerate_recovery_codes_error=Regenerarea codurilor de recuperare a eșuat: %v +two_factor_regenerate_recovery_codes_success=Noile coduri de recuperare au fost generate cu succes! +two_factor_disable_title=Dezactivați Autentificarea cu doi factori +two_factor_disable_desc=Nivelul de securitate al contului dumneavoastră va scădea după ce ați dezactivat autentificarea cu doi factori. Doriți să continuați? +two_factor_disable_success=Autentificarea cu doi factori a fost dezactivată cu succes! + +manage_access_token=Gestionează tokenurile de acces personale +generate_new_token=Generarea unui nou token +tokens_desc=Token-urile pe care le-ați generat și care pot fi utilizate pentru a accesa API-urile Gogs. +access_token_tips=Token-ul personal de acces poate fi folosit ca nume de utilizator sau parolă. Este recomandat să utilizaţi "x-access-token" ca nume de utilizator şi token personal de acces ca parolă pentru aplicaţiile Git. +new_token_desc=Fiecare token va avea acces deplin la contul dumneavoastră. +token_name=Nume token +generate_token=Generează Token +generate_token_succees=Tokenul de acces a fost generat cu succes! Asigurați-vă că îl copiați acum, deoarece nu îl veți mai putea vedea mai târziu! +delete_token=Șterge +access_token_deletion=Ștergerea token-ului de acces personal +access_token_deletion_desc=Ștergerea acestui token de acces personal va elimina toate accesele aferente aplicației. Doriți să continuați? +delete_token_success=Tokenul de acces personal a fost eliminat cu succes! Nu uitați să vă actualizați și aplicația. +token_name_exists=Token-ul cu același nume există deja. + +orgs.none=Nu sunteți membru al niciunei organizații. +orgs.leave_title=Lăsați organizația +orgs.leave_desc=Veți pierde accesul la toate depozitele și echipele după ce ați părăsit organizația. Doriți să continuați? + +repos.leave=Părăsește +repos.leave_title=Lăsați depozitul +repos.leave_desc=Veți pierde accesul la depozit după ce ați plecat. Doriți să continuați? +repos.leave_success=Ați părăsit depozitul '%s' cu succes! + +delete_account=Șterge-ți contul +delete_prompt=Operațiunea vă va șterge contul definitiv și NU POATE fi anulată! +confirm_delete_account=Confirmă ştergerea +delete_account_title=Ștergerea contului +delete_account_desc=Acest cont va fi șters permanent, doriți să continuați? + +[repo] +owner=Proprietar +repo_name=Numele depozitului +repo_name_helper=Un nume de depozit bun este, de obicei, compus din cuvinte cheie scurte, memorabile și unice. +visibility=Vizibilitate +unlisted=Nelistat +visiblity_helper=Acest depozit este Private +unlisted_helper=Acest depozit este Unlisted +visiblity_helper_forced=Administratorul site-ului a forțat toate depozitele noi să fie Private. +visiblity_fork_helper=(Modificarea acestei valori va afecta toate bifurcațiile) +clone_helper=Aveți nevoie de ajutor pentru clonare? Vizitați Help! +fork_repo=Depozit de bifurcații +fork_from=Ramură de la +fork_visiblity_helper=Nu puteți modifica vizibilitatea unui depozit bifurcat. +repo_desc=Descriere +repo_lang=Limbă +repo_gitignore_helper=Selectați șabloanele .gitignore +license=Licenta +license_helper=Selectați un fișier de licență +readme=Citește-mă +readme_helper=Selectați un șablon readme +auto_init=Inițializați acest depozit cu fișierele și șablonul selectate +create_repo=Repozitoriu nou +default_branch=Sucursala implicită +mirror_prune=Curăță +mirror_prune_desc=Îndepărtați orice referințe de urmărire la distanță care nu mai există la distanță +mirror_interval=Intervalul de oglindire (oră) +mirror_address=Adresa oglinzii +mirror_address_desc=Vă rugăm să includeți în adresă credențialele de utilizator necesare. +mirror_last_synced=Ultima sincronizare +watchers=Observatori +stargazers=Privitorii de stele +forks=Bifurcații +repo_description_helper=Descrierea depozitului. Lungime maximă de 512 caractere. +repo_description_length=Caractere disponibile + +form.reach_limit_of_creation=Proprietarul a atins limita maximă de creare a %d depozite. +form.name_not_allowed=Numele depozitului sau modelul %q nu este permis. + +need_auth=Autorizație necesară +migrate_type=Tipul de migrație +migrate_type_helper=Acest depozit va fi un mirror. +migrate_repo=Migrarea depozitului +migrate.clone_address=Adresa de clonare +migrate.clone_address_desc=Aceasta poate fi o adresă URL HTTP/HTTPS/GIT. +migrate.clone_address_desc_import_local=De asemenea, vi se permite să migrați un depozit prin calea serverului local. +migrate.permission_denied=Nu aveți voie să importați depozite locale. +migrate.invalid_local_path=Cale locală invalidă, nu există sau nu este un director. +migrate.clone_address_resolved_to_blocked_local_address=Adresa de clonare rezolvată la o adresă de rețea locală care este implicit blocată. +migrate.failed=Migrarea a eșuat: %v + +mirror_from=oglindă de +forked_from=a fost obținut din +copy_link=Copiați +copy_link_success=Copiat! +copy_link_error=Apasati l-C ori Ctrl-C pentru a copia +copied=Copiat OK +unwatch=Nevizionat +watch=Urmărește +unstar=Fără stele +star=Stea +fork=Bifurcare + +no_desc=Fără Descriere +quick_guide=Ghid rapid +clone_this_repo=Clonează acest repozitoriu +create_new_repo_command=Creați un nou depozit în linia de comandă +push_exist_repo=Împingeți un depozit existent din linia de comandă +bare_message=Acest depozit nu are încă niciun conținut. + +files=Fisiere +branch=Ramură +tree=Arbore +filter_branch_and_tag=Filtrează ramura sau eticheta +branches=Ramuri +tags=Etichete +issues=Probleme +pulls=Trageți solicitările +labels=Etichete +milestones=Repere +commits=Angajamente +git_branches=Ramuri +releases=Variante +file_raw=Crud +file_history=Istoric +file_view_raw=Vizualizează brut +file_permalink=Permalink +file_too_large=Acest fișier este prea mare pentru a fi afișat +video_not_supported_in_browser=Browserul dumneavoastră nu suportă tag-ul video HTML5. + +branches.overview=Supervizare +branches.active_branches=Sucursale active +branches.stale_branches=Ramuri vechi +branches.all=Toate ramurile +branches.updated_by=Actualizat %[1]s prin %[2]s +branches.change_default_branch=Schimbarea ramurii implicite +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=Fișier nou +editor.upload_file=Încărcați fișier +editor.edit_file=Modifica fisier +editor.preview_changes=Previzualizare Modificări +editor.cannot_edit_non_text_files=Nu se pot edita fișiere non-text +editor.edit_this_file=Editați acest fișier +editor.must_be_on_a_branch=Trebuie să fiți pe o ramură pentru a face sau a propune modificări la acest fișier +editor.fork_before_edit=Trebuie să creați o bifurcație în acest depozit înainte de a edita fișierul +editor.delete_this_file=Șterge acest fișier +editor.must_have_write_access=Trebuie să aveți acces de scriere pentru a face sau a propune modificări la acest fișier. +editor.file_delete_success=Fișierul '%s' a fost șters cu succes! +editor.name_your_file=Numiți fișierul dumneavoastră... +editor.filename_help=Pentru a adăuga un director, trebuie doar să îl introduceți și să apăsați /. Pentru a elimina un director, mergeți la începutul câmpului și apăsați backspace. +editor.or=sau +editor.cancel_lower=anulează +editor.commit_changes=Angajarea modificărilor +editor.add_tmpl=Adăugați '%s/' +editor.add=Adăugați '%s' +editor.update=Actualizați '%s' +editor.delete=Șterge '%s' +editor.commit_message_desc=Adăugați o descriere extinsă opțională... +editor.commit_directly_to_this_branch=Trimiteți direct la branșa %s. +editor.create_new_branch=Creați o ramură nouă pentru acest commit și începeți o cerere de extragere. +editor.new_branch_name_desc=Noul nume al filialei... +editor.cancel=Anuleaza +editor.filename_cannot_be_empty=Câmpul nu poate fi gol. +editor.branch_already_exists=Branșa "%s" există deja în acest depozit. +editor.directory_is_a_file=Intrarea "%s" din fișierul părinte este un fișier și nu un director în acest depozit. +editor.file_is_a_symlink=Fișierul "%s" este un symlink care nu poate fi modificat din editorul web. +editor.filename_is_a_directory=Numele fișierului "%s" este un director existent în acest depozit. +editor.file_editing_no_longer_exists=Fișierul "%s" pe care îl editați nu mai există în depozit. +editor.file_changed_while_editing=Conținutul fișierului a fost modificat de când ați început editarea. Faceți clic aici pentru a vedea ce au fost modificate sau apăsați din nou commit pentru a suprascrie aceste modificări. +editor.file_already_exists=Un fișier cu numele "%s" există deja în acest depozit. +editor.no_changes_to_show=Nu sunt modificări de arătat. +editor.fail_to_update_file=Nu s-a reușit actualizarea/crearea fișierului "%s" cu eroarea: %v +editor.fail_to_delete_file=Nu s-a reușit ștergerea fișierului "%s" cu eroarea: %v +editor.add_subdir=Adăugați subdirectorul... +editor.unable_to_upload_files=Nu s-a reușit încărcarea fișierelor în "%s" cu eroarea: %v +editor.upload_files_to_dir=Încărcați fișiere la "%s + +commits.commit_history=Istoricul angajamentelor +commits.commits=Angajamente +commits.search=Căutați comenzi +commits.find=Găsiți +commits.author=Autor +commits.message=Permisiunea de a trimite mesaje. Dacă este dezactivată, utilizatorul nu va putea trimite nici un fel de mesaj +commits.date=Data +commits.older=Mai vechi +commits.newer=Mai nou + +issues.new=Problemă nouă +issues.new.labels=Etichete +issues.new.no_label=Fără etichetă +issues.new.clear_labels=Ștergeți etichetele +issues.new.milestone=Reper +issues.new.no_milestone=Nu există Milestone +issues.new.clear_milestone=Șterge reperul +issues.new.open_milestone=Repere deschise +issues.new.closed_milestone=Repere închise +issues.new.assignee=Alocat lui +issues.new.clear_assignee=Destinatar clar +issues.new.no_assignee=Fără destinatar +issues.create=Creați Issue +issues.new_label=Etichetă Nouă +issues.new_label_placeholder=Numele etichetei... +issues.create_label=Numele etichetei... +issues.label_templates.title=Încărcați un set predefinit de etichete +issues.label_templates.info=Încă nu există etichete. Puteți face clic pe butonul "New Label" (Etichetă nouă) de mai sus pentru a crea una sau puteți utiliza un set predefinit de mai jos. +issues.label_templates.helper=Selectați un set de etichete +issues.label_templates.use=Utilizați acest set de etichete +issues.label_templates.fail_to_load_file=Nu a reușit să încarce fișierul șablon de etichetă '%s': %v +issues.open_tab=%d Deschis +issues.close_tab=%d închis +issues.filter_label=Etichetă +issues.filter_label_no_select=Nici o etichetă selectată +issues.filter_milestone=Reper +issues.filter_milestone_no_select=Nu este selectat niciun punct de reper +issues.filter_assignee=Alocat lui +issues.filter_assginee_no_select=Nu este selectat Destinatarul +issues.filter_type=Tip +issues.filter_type.all_issues=Toate problemele +issues.filter_type.assigned_to_you=Atribuit dumneavoastră +issues.filter_type.created_by_you=Create de tine +issues.filter_type.mentioning_you=Menționându-vă +issues.filter_sort=Sortare +issues.filter_sort.latest=Cele mai noi +issues.filter_sort.oldest=Cele mai vechi +issues.filter_sort.recentupdate=Nou actualizat +issues.filter_sort.leastupdate=Cele mai puţin recent actualizate +issues.filter_sort.mostcomment=Cele mai multe comentarii +issues.filter_sort.leastcomment=Cel mai puțin comentat +issues.opened_by=deschis %[1]s cu %[3]s +issues.opened_by_fake=deschis %[1]s cu %[2]s +issues.previous=Anterior +issues.next=Urmatorul +issues.open_title=Deschideți +issues.closed_title=Închis +issues.num_comments=%d comentarii +issues.commented_at=`a comentat %s` +issues.delete_comment_confirm=Sigur doriți să ștergeți acest comentariu? +issues.no_content=Nu există încă niciun conținut. +issues.close_issue=Închide +issues.close_comment_issue=Comentați și închideți +issues.reopen_issue=Redeschide +issues.reopen_comment_issue=Comentariu și redeschidere +issues.create_comment=comentariu +issues.closed_at=`închisă %[2]s` +issues.reopened_at=`redeschis %[2]s` +issues.commit_ref_at=`a făcut referire la această problemă dintr-un commit %[2]s` +issues.poster=Poster +issues.collaborator=Colaborator +issues.owner=Proprietar +issues.sign_in_require_desc=Autentificați-vă pentru a vă alătura acestei conversații. +issues.edit=Editați +issues.cancel=Anulare +issues.save=Salvează +issues.label_title=Denumire eticheta +issues.label_color=Culoarea etichetei +issues.label_count=%d etichete +issues.label_open_issues=%d probleme deschise +issues.label_edit=Editați +issues.label_delete=Șterge +issues.label_modify=Modificarea etichetei +issues.label_deletion=Ștergerea etichetei +issues.label_deletion_desc=Ștergerea acestei etichete va elimina informațiile despre aceasta din toate numerele aferente. Doriți să continuați? +issues.label_deletion_success=Eticheta a fost ștearsă cu succes! +issues.num_participants=%d Participanți +issues.attachment.open_tab=`Click pentru a vedea "%s" într-un tab nou` +issues.attachment.download=`Click pentru a descărca "%s"` + +pulls.new=O nouă cerere de tragere +pulls.compare_changes=Comparați modificările +pulls.compare_changes_desc=Comparați două branșe și faceți o cerere de modificare. +pulls.compare_base=bază +pulls.compare_compare=compara +pulls.filter_branch=Filtru branșă +pulls.no_results=Nu a fost gasit nici un rezultat. +pulls.nothing_to_compare=Nu este nimic de comparat, deoarece ramurile de bază și cele de cap sunt egale. +pulls.nothing_merge_base=Nu există nimic de comparat, deoarece cele două branșe au o istorie complet diferită. +pulls.has_pull_request=`Există deja o solicitare de tragere între aceste două obiective: %[2]s#%[3]d` +pulls.create=Creați o cerere de extragere +pulls.title_desc=dorește să fuzioneze %[1]d angajamente din %[2]s în %[3]s +pulls.merged_title_desc=a fuzionat %[1]d commits de la %[2]s în %[3]s %[4]s +pulls.tab_conversation=Conversaţie +pulls.tab_commits=Angajamente +pulls.tab_files=Fișiere modificate +pulls.reopen_to_merge=Vă rugăm să redeschideți acest pull request pentru a efectua operațiunea de fuziune. +pulls.merged=Fuzionată +pulls.has_merged=Acest pull request a fost fuzionat cu succes! +pulls.data_broken=Datele acestui pull request au fost întrerupte din cauza ștergerii informațiilor din bifurcație. +pulls.is_checking=Verificarea conflictelor este încă în curs de desfășurare, vă rugăm să reîmprospătați pagina în câteva momente. +pulls.can_auto_merge_desc=Acest pull request poate fi fuzionat automat. +pulls.cannot_auto_merge_desc=Acest pull request nu poate fi fuzionat automat deoarece există conflicte. +pulls.cannot_auto_merge_helper=Vă rugăm să fuzionați manual pentru a rezolva conflictele. +pulls.create_merge_commit=Creați un angajament de fuziune +pulls.rebase_before_merging=Rebase înainte de fuzionare +pulls.commit_description=Descriere Commit +pulls.merge_pull_request=Fuzionați Pull Request +pulls.open_unmerged_pull_exists=`Nu puteți efectua operațiunea de redeschidere deoarece există deja un pull request deschis (#%d) din același depozit cu aceleași informații de fuziune și care așteaptă să fie fuzionat..` +pulls.delete_branch=Șterge ramura +pulls.delete_branch_has_new_commits=Branșa nu poate fi ștearsă deoarece are noi comenzi după fuziune. + +milestones.new=Reper nou +milestones.open_tab=%d Deschis +milestones.close_tab=%d închis +milestones.closed=Închis %e +milestones.no_due_date=Fără două date +milestones.open=Deschideți +milestones.close=Închide +milestones.new_subheader=Creați etape importante pentru a vă organiza problemele. +milestones.create=Creați un reper +milestones.title=Titlu +milestones.desc=Descriere +milestones.due_date=Data scadentă (opţional) +milestones.clear=Stergeți +milestones.invalid_due_date_format=Formatul datei scadente este invalid, trebuie să fie 'aaa-ll-zz'. +milestones.create_success=Reperul de etapă "%s" a fost creat cu succes! +milestones.edit=Editați Milestone +milestones.edit_subheader=Folosiți o descriere mai bună pentru etapele importante, astfel încât oamenii să nu fie confuzi. +milestones.cancel=Anulare +milestones.modify=Modificați Milestone +milestones.edit_success=Modificările reperului '%s' au fost salvate cu succes! +milestones.deletion=Ștergere reper +milestones.deletion_desc=Ștergerea acestui reper va elimina informațiile despre acesta din toate numerele aferente. Doriți să continuați? +milestones.deletion_success=Milestone a fost șters cu succes! + +wiki=Wiki +wiki.welcome=Bine ați venit pe Wiki! +wiki.welcome_desc=Wiki este locul în care doriți să vă documentați împreună proiectul și să îl îmbunătățiți. +wiki.create_first_page=Creați prima pagină +wiki.page=Pagina +wiki.filter_page=Filtrează pagina +wiki.new_page=Creează o pagină nouă +wiki.default_commit_message=Scrieți o notă despre această actualizare (opțional). +wiki.save_page=Salvează pagina +wiki.last_commit_info=%s a editat această pagină %s +wiki.edit_page_button=Editați +wiki.new_page_button=Pagina Nouă +wiki.delete_page_button=Șterge pagina +wiki.delete_page_notice_1=Aceasta va șterge pagina "%s". Vă rugăm să fiți sigur. +wiki.page_already_exists=Pagina Wiki cu același nume există deja. +wiki.pages=Pagini +wiki.last_updated=Ultima actualizare %s + +settings=Setări +settings.options=Opţiuni +settings.collaboration=Colaborare +settings.collaboration.admin=Administrator +settings.collaboration.write=Scrie +settings.collaboration.read=Citiţi +settings.collaboration.undefined=Nedefinit +settings.branches=Branșe +settings.branches_bare=Nu puteți gestiona ramuri pentru depozitul gol. Vă rugăm să împingeți mai întâi niște conținut. +settings.default_branch=Sucursala implicită +settings.default_branch_desc=Ramificația implicită este considerată branșa "de bază" pentru confirmările de cod, solicitările de extragere și editarea online. +settings.update=Actualizaţi +settings.update_default_branch_unsupported=Modificarea ramurii implicite nu este suportată de versiunea Git de pe server. +settings.update_default_branch_success=Branșa implicită a acestui depozit a fost actualizată cu succes! +settings.protected_branches=Branșe protejate +settings.protected_branches_desc=Protejați ramurile de împingerea forțată, de ștergerea accidentală și puneți pe lista albă a celor care comit coduri. +settings.choose_a_branch=Alegeți o branșă... +settings.branch_protection=Protecția Branșei +settings.branch_protection_desc=Vă rugăm să alegeți opțiunile de protecție pentru sucursală +settings.protect_this_branch=Protejați această branșă +settings.protect_this_branch_desc=Dezactivați forța de împingere și împiedicați ștergerea. +settings.protect_require_pull_request=Necesită cerere de tragere în loc de împingere directă +settings.protect_require_pull_request_desc=Activați această opțiune pentru a dezactiva împingerea directă către branșa respectivă. Modificările trebuie să fie împinse pe o altă branșă neprotejată și îmbinate în această branșă prin intermediul unei cereri de tragere. +settings.protect_whitelist_committers=Lista albă a celor care pot face push către această ramură +settings.protect_whitelist_committers_desc=Adăugați persoane sau echipe pe lista albă de push direct către această branșă. Utilizatorii din lista albă vor ocoli verificarea cererii de extragere obligatorie. +settings.protect_whitelist_users=Utilizatorii care pot face push către această ramură +settings.protect_whitelist_search_users=Caută utilizatori +settings.protect_whitelist_teams=Echipe pentru care membrii lor pot face push către această branșă +settings.protect_whitelist_search_teams=Căutați echipe +settings.update_protect_branch_success=Opțiunile de protecție pentru această ramură au fost actualizate cu succes! +settings.hooks=Webhook-uri +settings.githooks=Git Hook-uri +settings.basic_settings=Setări de bază +settings.mirror_settings=Setări oglindă +settings.sync_mirror=Sincronizează acum +settings.mirror_sync_in_progress=Sincronizarea oglinzilor este în curs, vă rugăm să reîmprospătați pagina în aproximativ un minut. +settings.site=Site oficial +settings.update_settings=Actualizeaza setari +settings.change_reponame_prompt=Această modificare va afecta modul în care legăturile se raportează la depozit. +settings.advanced_settings=Setări Avansate +settings.wiki_desc=Activați sistemul wiki +settings.use_internal_wiki=Utilizați wiki încorporat +settings.allow_public_wiki_desc=Permiteți accesul public la wiki atunci când depozitul este privat +settings.use_external_wiki=Utilizați un wiki extern +settings.external_wiki_url=URL-ul Wiki extern +settings.external_wiki_url_desc=Vizitatorii vor fi redirecționați către URL atunci când fac clic pe fila respectivă. +settings.issues_desc=Activați trackerul de probleme +settings.use_internal_issue_tracker=Utilizați un tracker de probleme ușor încorporat +settings.allow_public_issues_desc=Permiteți accesul public la probleme atunci când depozitul este privat +settings.use_external_issue_tracker=Utilizați un tracker de probleme extern +settings.external_tracker_url=URL extern de urmărire a problemelor +settings.external_tracker_url_desc=Vizitatorii vor fi redirecționați către URL atunci când fac clic pe fila respectivă. +settings.tracker_url_format=Formatul URL-ului de urmărire a problemelor externe +settings.tracker_issue_style=External Issue Tracker Stil de denumire: +settings.tracker_issue_style.numeric=Numeric +settings.tracker_issue_style.alphanumeric=Alfanumeric +settings.tracker_url_format_desc=Puteți utiliza caractere de poziție {user} {repo} {index}} pentru numele utilizatorului, numele depozitului și indexul problemei. +settings.pulls_desc=Activați cererile de tragere pentru a accepta contribuții între depozite și ramuri +settings.pulls.ignore_whitespace=Ignoră modificările în spațiul alb +settings.pulls.allow_rebase_merge=Permiteți utilizarea rebase pentru a fuziona comenzi +settings.danger_zone=Zonă de pericol +settings.cannot_fork_to_same_owner=Nu puteți transfera un depozit către proprietarul său original. +settings.new_owner_has_same_repo=Noul proprietar are deja un depozit cu același nume. Vă rugăm să alegeți un alt nume. +settings.convert=Conversia în depozitul obișnuit +settings.convert_desc=Puteți converti această oglindă într-un depozit obișnuit. Acest lucru nu poate fi inversat. +settings.convert_notices_1=- Această operațiune va converti această oglindă de depozit într-un depozit obișnuit și nu poate fi anulată. +settings.convert_confirm=Confirmați Conversia +settings.convert_succeed=Depozitul a fost convertit cu succes în tip obișnuit. +settings.transfer=Transferă rolul de proprietar +settings.transfer_desc=Transferați acest depozit către un alt utilizator sau către o organizație în care aveți drepturi de administrator. +settings.transfer_notices_1=- Veți pierde accesul dacă noul proprietar este un utilizator individual. +settings.transfer_notices_2=- Veți păstra accesul dacă noul proprietar este o organizație și dacă sunteți unul dintre proprietari. +settings.transfer_form_title=Vă rugăm să introduceți următoarele informații pentru a confirma operațiunea: +settings.wiki_delete=Ștergere date Wiki +settings.wiki_delete_desc=Odată ce ștergeți datele wiki nu există cale de întoarcere. Vă rugăm să fiți sigur. +settings.wiki_delete_notices_1=- Acest lucru va șterge și dezactiva wiki pentru %s +settings.wiki_deletion_success=Datele Repository wiki au fost șterse cu succes. +settings.delete=Șterge acest registru +settings.delete_desc=Odată ce ați șters un depozit, nu mai există cale de întoarcere. Vă rugăm să fiți siguri. +settings.delete_notices_1=- Această operațiune NU POATE fi anulată. +settings.delete_notices_2=- Această operațiune va șterge definitiv tot ce se află în acest depozit, inclusiv datele Git, problemele, comentariile și accesul colaboratorilor. +settings.delete_notices_fork_1=- Toate bifurcațiile vor deveni independente după ștergere. +settings.deletion_success=Depozitul a fost șters cu succes! +settings.update_settings_success=Opțiunile depozitului au fost actualizate cu succes. +settings.transfer_owner=Proprietar Nou +settings.make_transfer=Efectuați Transferul +settings.transfer_succeed=Proprietatea depozitelor a fost transferată cu succes. +settings.confirm_delete=Confirmă ştergerea +settings.add_collaborator=Adăugați un nou colaborator +settings.add_collaborator_success=A fost adăugat un nou colaborator. +settings.delete_collaborator=Șterge +settings.collaborator_deletion=Ștergerea colaboratorului +settings.collaborator_deletion_desc=Acest utilizator nu va mai avea acces de colaborare la acest depozit după ștergere. Doriți să continuați? +settings.remove_collaborator_success=Colaboratorul a fost eliminat. +settings.search_user_placeholder=Căutare utilizator... +settings.org_not_allowed_to_be_collaborator=Organizația nu poate fi adăugată în calitate de colaborator. +settings.hooks_desc=Webhooks sunt asemănătoare cu declanșatoarele de evenimente HTTP POST de bază. Ori de câte ori se întâmplă ceva în Gogs, ne vom ocupa de notificarea către gazda țintă pe care o specificați. +settings.webhooks.add_new=Adăugați un nou webhook: +settings.webhooks.choose_a_type=Alegeți un tip... +settings.add_webhook=Adăugați webhook +settings.webhook_deletion=Ștergere Webhook +settings.webhook_deletion_desc=Ștergerea acestui webhook va elimina informațiile și tot istoricul livrărilor. Doriți să continuați? +settings.webhook_deletion_success=Webhook a fost șters cu succes! +settings.webhook.test_delivery=Livrare test +settings.webhook.test_delivery_desc=Trimiteți o livrare falsă a unui eveniment push pentru a testa setările webhook-ului dumneavoastră +settings.webhook.test_delivery_success=Testul webhook a fost adăugat la coada de livrare. Este posibil să dureze câteva secunde până când va apărea în istoricul livrărilor. +settings.webhook.redelivery=Reîntoarcerea livrării +settings.webhook.redelivery_success=Sarcina "%s" a fost adăugată la coada de livrare. Este posibil să dureze câteva secunde pentru a actualiza starea de livrare în istoric. +settings.webhook.request=Cerere +settings.webhook.response=Răspuns +settings.webhook.headers=Anteturi +settings.webhook.payload=Taxa de plată +settings.webhook.body=Corp +settings.webhook.err_cannot_parse_payload_url=Nu se poate analiza URL-ul de încărcare: %v +settings.webhook.url_resolved_to_blocked_local_address=Adresa URL a încărcăturii utile rezolvată la o adresă de rețea locală care este implicit blocată. +settings.githooks_desc=Git Hooks sunt alimentate de Git însuși, puteți edita fișierele de cârlige acceptate din lista de mai jos pentru a efectua operațiuni personalizate. +settings.githook_edit_desc=În cazul în care cârligul este inactiv, va fi prezentat un conținut de probă. Lăsarea conținutului la o valoare goală va dezactiva acest cârlig. +settings.githook_name=Nume Hook +settings.githook_content=Continutul Hook-ului +settings.update_githook=Actualizare Hook +settings.add_webhook_desc=Gogs va trimite o solicitare POST către URL-ul specificat, împreună cu detalii cu privire la evenimentul care a avut loc. De asemenea, poți specifica ce tip de format de date dorești să primești la declanșarea hook-ului (JSON, x-www-form-urlencoed, XML, etc). Mai multe informaţii pot fi găsite în Ghidul nostru Webhook. +settings.payload_url=URL-ul Payload +settings.content_type=Tip de conținut +settings.secret=Secret +settings.secret_desc=Secretul va fi trimis ca SHA256 HMAC hex digest al încărcăturii utile prin intermediul antetului X-Gogs-Signature. +settings.slack_username=Numele de utilizator +settings.slack_icon_url=Pictogramă URL +settings.slack_color=Culoare +settings.event_desc=Când ar trebui declanșat acest webhook? +settings.event_push_only=Doar evenimentul push +settings.event_send_everything=Am nevoie de tot +settings.event_choose=Lasă-mă să aleg ceea ce am nevoie +settings.event_create=Creați +settings.event_create_desc=Branșă sau etichetă creată +settings.event_delete=Șterge +settings.event_delete_desc=Branșă sau etichetă ștearsă +settings.event_fork=Bifurcare +settings.event_fork_desc=Depozitul este bifurcat +settings.event_push=Push +settings.event_push_desc=Git push către un depozit +settings.event_issues=Probleme +settings.event_issues_desc=Chestiune deschisă, închisă, redeschisă, editată, atribuită, neatribuită, etichetă actualizată, etichetă eliminată, milestonată sau demilestonată. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Cerere de extragere deschisă, închisă, redeschisă, editată, atribuită, neatribuită, etichetă actualizată, etichetă ștearsă, milestonată, demilestonată sau sincronizată. +settings.event_issue_comment=Issue Comentariu +settings.event_issue_comment_desc=Comentariu creat, modificat sau șters. +settings.event_release=Lansare +settings.event_release_desc=Versiune publicată într-un depozit. +settings.active=Activ +settings.active_helper=De asemenea, se vor furniza detalii privind evenimentul care a declanșat acest hook. +settings.add_hook_success=A fost adăugat un nou webhook. +settings.update_webhook=Actualizare Webhook +settings.update_hook_success=Webhook a fost actualizat. +settings.delete_webhook=Ștergere Webhook +settings.recent_deliveries=Livrări recente +settings.hook_type=Tip Hook +settings.add_slack_hook_desc=Adăugați integrarea Slack la depozitul dumneavoastră. +settings.add_discord_hook_desc=Adăugați integrarea Discord la depozitul dumneavoastră. +settings.add_dingtalk_hook_desc=Adăugați integrarea Dingtalk la depozitul dumneavoastră. +settings.slack_token=Token +settings.slack_domain=Domeniu +settings.slack_channel=Canal +settings.deploy_keys=Implementarea cheilor +settings.deploy_keys_helper=Common Gotcha! Dacă doriți să adăugați chei publice personale, adăugați-le în fișierul account settings. +settings.add_deploy_key=Adăugați cheia de implementare +settings.deploy_key_desc=Cheile de desfășurare au acces numai pentru citire. Acestea nu sunt identice cu cheile SSH ale contului personal. +settings.no_deploy_keys=Nu ați adăugat nicio cheie de desfășurare. +settings.title=Titlu +settings.deploy_key_content=Conținut +settings.key_been_used=A fost utilizat conținutul cheie de desfășurare. +settings.key_name_used=Există deja o cheie de distribuire cu același nume. +settings.add_key_success=Noua cheie de desfășurare "%s" a fost adăugată cu succes! +settings.deploy_key_deletion=Ștergeți cheia de distribuire +settings.deploy_key_deletion_desc=Ștergerea acestei chei de implementare va elimina toate accesele aferente pentru acest depozit. Doriți să continuați? +settings.deploy_key_deletion_success=Cheia Deploy a fost ștearsă cu succes! +settings.description_desc=Descrierea depozitului. Lungime maximă de 512 caractere. +settings.description_length=Caractere disponibile + +diff.browse_source=Răsfoiți Sursa +diff.parent=părinte +diff.commit=comite +diff.data_not_available=Diff Data nu este Disponibil. +diff.show_diff_stats=Arată Statisticile Diff +diff.show_split_view=Vizualizare divizată +diff.show_unified_view=Vedere unificată +diff.stats_desc= %d a modificat fișierele cu %d adăugiri și %d ștergeri +diff.bin=BIN +diff.view_file=Vizualizați fișierul +diff.file_suppressed=Fișier diff suprimat deoarece este prea mare +diff.too_many_files=Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff + +release.releases=Variante +release.new_release=Lansare nouă +release.draft=Ciorna +release.prerelease=Versiunea de pre-lansare +release.edit=Editeaza +release.ahead=%d se angajează să %s de la această versiune +release.source_code=Cod sursă +release.new_subheader=Publicarea de versiuni pentru a itera produsul. +release.edit_subheader=Jurnalul de modificări detaliat poate ajuta utilizatorii să înţeleagă ce a fost îmbunătăţit. +release.tag_name=Eticheta nume +release.target=Ţintă +release.tag_helper=Alegeți o etichetă existentă sau creați o etichetă nouă la publicare. +release.title=Titlu +release.content=Conținut +release.write=Scrie +release.preview=Previzualizare +release.loading=Se încarcă... +release.prerelease_desc=Aceasta este un pre-release +release.prerelease_helper=Vom sublinia faptul că acest Release nu este pregătită pentru producție. +release.cancel=Anulează +release.publish=Publicare Release +release.save_draft=Salvați schița +release.edit_release=Editare Release +release.delete_release=Evaluați acest Release +release.deletion=Ștergere Release +release.deletion_desc=Ștergerea acestui release va șterge eticheta Git corespunzătoare. Doriți să continuați? +release.deletion_success=Release-ul a fost șters cu succes! +release.tag_name_already_exist=Release cu aceasta etichetă există deja. +release.tag_name_invalid=Numele etichetei nu este valid. +release.downloads=Descărcări + +[org] +org_name_holder=Numele organizaţiei +org_full_name_holder=Numele complet al organizaţiei +org_name_helper=Numele grozave ale organizațiilor sunt scurte și memorabile. +create_org=Creați Organizație +repo_updated=Actualizat +people=Persoane +invite_someone=Invită pe cineva +teams=Echipe +lower_members=membri +lower_repositories=repozitorii +create_new_team=Creează o echipă nouă +org_desc=Descriere +team_name=Nume echipă +team_desc=Descriere +team_name_helper=Vei folosi acest nume pentru a menționa această echipă în conversații. +team_desc_helper=Despre ce este această echipă? +team_permission_desc=Ce nivel de permisiune ar trebui să aibă această echipă? + +form.name_not_allowed=Numele organizației sau modelul %q nu este permis. +form.team_name_not_allowed=Numele echipei sau modelul %q nu sunt permise. + +settings=Setări +settings.options=Opţiuni +settings.full_name=Numele Complet +settings.website=Site web +settings.location=Locație +settings.update_settings=Actualizează Setările +settings.update_setting_success=Setările pentru organizație au fost actualizat cu succes. +settings.change_orgname_prompt=Această modificare va afecta modul în care linkurile se raportează la organizație. +settings.update_avatar_success=Avatarul organizației a fost actualizat cu succes. +settings.delete=Șterge organizația +settings.delete_account=Șterge această organizație +settings.delete_prompt=Organizația va fi eliminată definitiv, iar acest lucru NU POATE fi anulat! +settings.confirm_delete_account=Confirmă ştergerea +settings.delete_org_title=Ștergerea organizației +settings.delete_org_desc=Această organizație va fi ștearsă definitiv, vreți să continuați? +settings.hooks_desc=Adăugați webhook-uri care vor fi declanșate pentru toate depozitele sub această organizație. + +members.membership_visibility=Vizibilitate membru: +members.public=Public +members.public_helper=fă privat +members.private=Privat +members.private_helper=fă public +members.member_role=Rolul membrului: +members.owner=Proprietar +members.member=Membru +members.remove=Sterge +members.leave=Părăsește +members.invite_desc=Adăugați un nou membru la %s: +members.invite_now=Invitați acum + +teams.join=Alătură-te +teams.leave=Părăsește +teams.read_access=Acces la citit +teams.read_access_helper=Această echipă va putea să vizualizeze și să cloneze depozitele sale. +teams.write_access=Acces la scriere +teams.write_access_helper=Această echipă va fi capabilă să citească depozitele sale, precum și să facă push către acestea. +teams.admin_access=Acces Administrator +teams.admin_access_helper=Această echipă va fi capabilă să citească depozitele sale, precum și să facă push către acestea. +teams.no_desc=Această echipă nu are o descriere +teams.settings=Setări +teams.owners_permission_desc=Proprietarii au acces complet la toate depozitele și au drepturi de administrator pentru organizație. +teams.members=Membrii echipei +teams.update_settings=Actualizeaza setari +teams.delete_team=Șterge această echipă +teams.add_team_member=Adăugați un membru al echipei +teams.delete_team_title=Ștergerea echipei +teams.delete_team_desc=Deoarece această echipă va fi eliminată, este posibil ca membrii ei să nu mai aibă acces la anumite depozite. Doriți să continuați? +teams.delete_team_success=Echipa dată a fost ștearsă cu succes. +teams.read_permission_desc=Apartenența la această echipă acordă acces Citește: membrii pot vizualiza și clona depozitele echipei. +teams.write_permission_desc=Apartenența la această echipă acordă acces de Scriere: membrii pot citi din depozitele echipei și pot face push către acestea. +teams.admin_permission_desc=Apartenența la această echipă acordă acces Admin: membrii pot citi din, pot face push și pot adăuga colaboratori la depozitele echipei. +teams.repositories=Depozitele echipei +teams.search_repo_placeholder=Căutare depozit... +teams.add_team_repository=Adăugați depozitul echipei +teams.remove_repo=Sterge +teams.add_nonexistent_repo=Depozitul pe care încercați să îl adăugați nu există, vă rugăm să îl creați mai întâi. + +[admin] +dashboard=Prezentare generală +users=Utilizatori +organizations=Organizații +repositories=Repozitorii +authentication=Autentificări +config=Configurare +notices=Notificări de sistem +monitor=Monitorizare +first_page=Prima +last_page=Ultima +total=Total: %d + +dashboard.build_info=Informații despre compilare +dashboard.app_ver=Versiunea aplicației +dashboard.git_version=Versiune git +dashboard.go_version=versiune Go +dashboard.build_time=Timp de compilare +dashboard.build_commit=Construiți commit +dashboard.statistic=Statistici +dashboard.operations=Operații +dashboard.system_status=Starea monitorului de sistem +dashboard.statistic_info=Baza de date Gogs conține %d utilizatori, %d organizații, %d chei publice, %d depozite, %d ceasuri, %d stele, %d acțiuni, %d accesări; %d probleme, %d comentarii, %d conturi sociale, %d urmează, %d oglinzi, %d lansări, %d surse de autentificare %d webhooks, %d repere %d etichete, %d sarcini de cârlik, %d echipe, %d sarcini de actualizare, %d atașamente. +dashboard.operation_name=Numele Operației +dashboard.operation_switch=Schimbă +dashboard.select_operation_to_run=Vă rugăm să selectați operațiunea de executat +dashboard.operation_run=Rulează +dashboard.clean_unbind_oauth=Curățați OAuthes fără legătură +dashboard.clean_unbind_oauth_success=Toate OAuthes unbind au fost șterse cu succes. +dashboard.delete_inactivate_accounts=Șterge toate conturile inactive +dashboard.delete_inactivate_accounts_success=Toate conturile inactivate au fost șterse cu succes. +dashboard.delete_repo_archives=Ștergeți toate arhivele depozitelor +dashboard.delete_repo_archives_success=Toate arhivele depozitelor au fost șterse cu succes. +dashboard.delete_missing_repos=Ștergeți toate înregistrările de depozit care au pierdut fișiere Git +dashboard.delete_missing_repos_success=Toate înregistrările depozitelor care au pierdut fișiere Git au fost șterse cu succes. +dashboard.git_gc_repos=Efectuați colectarea gunoiului pe depozite +dashboard.git_gc_repos_success=Toate depozitele au efectuat cu succes colectarea gunoiului. +dashboard.resync_all_sshkeys=Rescrieți fișierul '.ssh/authorized_keys' (atenție: cheile non-Gogs vor fi pierdute) +dashboard.resync_all_sshkeys_success=Toate cheile publice au fost rescrise cu succes. +dashboard.resync_all_hooks=Resincronizarea hook-urilor de pre-recepție, actualizare și post-recepție a tuturor depozitelor +dashboard.resync_all_hooks_success=Toate hook-urile de pre-recepție, actualizare și post-recepție ale depozitelor au fost resincronizate cu succes. +dashboard.reinit_missing_repos=Reinitializați toate înregistrările de depozit care au pierdut fișiere Git +dashboard.reinit_missing_repos_success=Toate înregistrările depozitelor care au pierdut fișiere Git au fost reinitializate cu succes. + +dashboard.server_uptime=Timp de funcționare a serverului +dashboard.current_goroutine=Goroutine curente +dashboard.current_memory_usage=Utilizare Memorie Curentă +dashboard.total_memory_allocated=Memorie Totală Alocată +dashboard.memory_obtained=Memorie Obținută +dashboard.pointer_lookup_times=Timpii de căutare a punctelor +dashboard.memory_allocate_times=Timpii de alocare a memoriei +dashboard.memory_free_times=Timpuri fără memorie +dashboard.current_heap_usage=Utilizarea curentă a Heap +dashboard.heap_memory_obtained=Memorie Heap obținută +dashboard.heap_memory_idle=Memorie Heap inactivă +dashboard.heap_memory_in_use=Memorie Heap în uz +dashboard.heap_memory_released=Memorie Heap eliberată +dashboard.heap_objects=Obiecte Heap +dashboard.bootstrap_stack_usage=Bootstrap Stack Utilizare +dashboard.stack_memory_obtained=Stack de Memorie Obținută +dashboard.mspan_structures_usage=Utilizarea Structurilor MSpan +dashboard.mspan_structures_obtained=Structuri MSpan obținute +dashboard.mcache_structures_usage=Utilizarea structurilor MCache +dashboard.mcache_structures_obtained=Structuri MCache Obținute +dashboard.profiling_bucket_hash_table_obtained=Tabelul Hash Bucket de profilare obținut +dashboard.gc_metadata_obtained=GC Metadata Obținută +dashboard.other_system_allocation_obtained=Alte alocări de sistem obținute +dashboard.next_gc_recycle=Următorul GC Recycle +dashboard.last_gc_time=De la ultimul GC Time +dashboard.total_gc_time=Pauză GC totală +dashboard.total_gc_pause=Pauză GC totală +dashboard.last_gc_pause=Ultima pauză GC +dashboard.gc_times=Timpi GC + +users.user_manage_panel=Panoul de gestionare a utilizatorilor +users.new_account=Creați un cont nou +users.name=Nume +users.activated=Activat +users.admin=Administrator +users.repos=Repo-uri +users.created=Creat +users.send_register_notify=Trimiteți notificarea de înregistrare către utilizator +users.new_success=Noul cont "%s" a fost creat cu succes. +users.edit=Editați +users.auth_source=Sursa de autentificare +users.local=Local +users.auth_login_name=Autentificare Nume de logare +users.password_helper=Lăsați-l gol pentru a rămâne neschimbat. +users.update_profile_success=Profilul contului a fost actualizat cu succes. +users.edit_account=Editare cont +users.max_repo_creation=Limita maximă de creare a depozitelor +users.max_repo_creation_desc=(Setați -1 pentru a utiliza limita globală implicită) +users.is_activated=Acest cont este activat +users.prohibit_login=Acest cont este interzis la autentificare +users.is_admin=Acest cont are permisiuni de administrator +users.allow_git_hook=Acest cont are permisiuni de a crea hook-uri Git +users.allow_import_local=Acest cont are permisiunea de a importa depozite locale +users.update_profile=Actualizați profilul contului +users.delete_account=Șterge acest cont +users.still_own_repo=Acest cont are încă proprietate asupra a cel puțin un depozit, trebuie să îl ștergi sau să îl transferi mai întâi. +users.still_has_org=Acest cont este încă membru în cel puțin o organizație, trebuie să părăsiți sau să ștergeți mai întâi organizațiile. +users.deletion_success=Contul a fost șters cu succes! + +orgs.org_manage_panel=Panou de gestionare a organizației +orgs.name=Nume +orgs.teams=Echipe +orgs.members=Membrii + +repos.repo_manage_panel=Panoul de gestionare a depozitelor +repos.owner=Proprietar +repos.name=Nume +repos.private=Privat +repos.watches=Ceasuri +repos.stars=Stele +repos.issues=Probleme +repos.size=Dimensiune + +auths.auth_sources=Surse de autentificare +auths.new=Adăugați o nouă sursă +auths.name=Nume +auths.type=Tip +auths.enabled=Activat +auths.default=Prestabilit +auths.updated=Actualizat +auths.auth_type=Tipul de Autentificare +auths.auth_name=Nume de autentificare +auths.security_protocol=Protocol de Securitate +auths.domain=Domeniu +auths.host=Gazdă +auths.port=Portul +auths.bind_dn=Legătura DN +auths.bind_dn_helper=Puteți folosi "%s" ca înlocuitor pentru numele de utilizator, de exemplu, DOM\%s +auths.bind_password=Conectați parola +auths.bind_password_helper=Avertisment: Această parolă este stocată în text simplu. Nu utilizați un cont cu privilegii înalte. +auths.user_base=Baza de căutare a utilizatorilor +auths.user_dn=Utilizator DN +auths.attribute_username=Atributul Nume utilizator +auths.attribute_username_placeholder=Lăsați gol pentru a utiliza valoarea câmpului formularului de conectare pentru numele utilizatorului. +auths.attribute_name=Atributul primului nume +auths.attribute_surname=Atributul numelui de familie +auths.attribute_mail=Atributul de e-mail +auths.verify_group_membership=Verifică apartenența la grup +auths.group_search_base_dn=Căutare în grup Baza DN +auths.group_filter=Filtru de grup +auths.group_attribute_contain_user_list=Atributul de grup care conține o listă de utilizatori +auths.user_attribute_listed_in_group=Atributul utilizatorului listat în grup +auths.attributes_in_bind=Preluarea atributelor în contextul Bind DN +auths.filter=Filtru utilizator +auths.admin_filter=Filtru Administrator +auths.ms_ad_sa=Ms Ad SA +auths.smtp_auth=Tipul de autentificare SMTP +auths.smtphost=Gazdă SMTP +auths.smtpport=Portul SMTP +auths.allowed_domains=Domenii permise +auths.allowed_domains_helper=Lăsați-l gol pentru a nu restricționa niciun domeniu. Domeniile multiple trebuie separate prin virgulă ','. +auths.enable_tls=Activează criptarea TLS +auths.skip_tls_verify=Omite verificarea TLS +auths.pam_service_name=Numele serviciului PAM +auths.enable_auto_register=Activați înregistrarea automată +auths.edit=Editarea setărilor de autentificare +auths.activated=Această autentificare este activată +auths.default_auth=Această autentificare este sursa implicită de autentificare +auths.new_success=Noua autentificare '%s' a fost adăugată cu succes. +auths.update_success=Setarea de autentificare a fost actualizată cu succes. +auths.update=Actualizarea setărilor de autentificare +auths.delete=Ștergeți această autentificare +auths.delete_auth_title=Autentificare Ștergere +auths.delete_auth_desc=Această autentificare va fi ștearsă, doriți să continuați? +auths.still_in_used=Această autentificare este încă utilizată de unii utilizatori, vă rugăm să ștergeți sau să convertiți mai întâi acești utilizatori la un alt tip de autentificare. +auths.deletion_success=Autentificarea a fost ștearsă cu succes! +auths.login_source_exist=Sursa de autentificare '%s' există deja. +auths.github_api_endpoint=Sfârșit API + +config.not_set=(nesetată) +config.server_config=Configurare server +config.brand_name=Numele mărcii +config.run_user=Rulați Utilizatorul +config.run_mode=Mod rulare +config.server.external_url=URL-ul extern +config.server.domain=Domeniu +config.server.protocol=Protocol +config.server.http_addr=Adresă HTTP +config.server.http_port=Portul HTTP +config.server.cert_file=Fișier certificat +config.server.key_file=Fișier cheie +config.server.tls_min_version=Versiunea TLS minimă +config.server.unix_socket_permission=Permisiune socket Unix +config.server.local_root_url=URL root local +config.server.offline_mode=Mod offline +config.server.disable_router_log=Dezactivați jurnalul routerului +config.server.enable_gzip=Activați Gzip +config.server.app_data_path=Calea de date a aplicației +config.server.load_assets_from_disk=Încărcați active de pe disc +config.server.landing_url=URL de destinație + +config.ssh_config=configurare SSH +config.ssh.enabled=Activat +config.ssh.domain=Domeniul expus +config.ssh.port=Portul expus +config.ssh.root_path=Calea root-ului +config.ssh.keygen_path=Calea Keygen +config.ssh.key_test_path=Calea de testare a cheii +config.ssh.minimum_key_size_check=Verificarea dimensiunii minime a cheii +config.ssh.minimum_key_sizes=Dimensiunile minime ale cheilor +config.ssh.rewrite_authorized_keys_at_start=Rescrie "Autorized_keys" la pornire +config.ssh.start_builtin_server=Porniți serverul încorporat +config.ssh.listen_host=Ascultați gazda +config.ssh.listen_port=Ascultați portul +config.ssh.server_ciphers=Cifre server +config.ssh.server_macs=MAC-uri server +config.ssh.server_algorithms=Algoritmi de server + +config.repo_config=Configurarea depozitului +config.repo.root_path=Calea root-ului +config.repo.script_type=Tipul script-ului +config.repo.ansi_chatset=Set de caractere ANSI +config.repo.force_private=Forțează privat +config.repo.max_creation_limit=Limită de creare maximă +config.repo.preferred_licenses=Licențe preferate +config.repo.disable_http_git=Dezactivează Git HTTP +config.repo.enable_local_path_migration=Activați migrarea căii locale +config.repo.enable_raw_file_render_mode=Activați modul de redare a fișierelor brute +config.repo.commits_fetch_concurrency=Concurența de preluare a angajamentelor +config.repo.editor.line_wrap_extensions=Extensii de linie de editor +config.repo.editor.previewable_file_modes=Moduri de fișier previzualizabile de editor +config.repo.upload.enabled=Încărcare activată +config.repo.upload.temp_path=Încărcați calea temporară +config.repo.upload.allowed_types=Tipuri permise de încărcare +config.repo.upload.file_max_size=Limitare încarcare în funție de mărime +config.repo.upload.max_files=Limita de încărcare a fișierelor + +config.db_config=Configurare Bază de date +config.db.type=Tip +config.db.host=Gazdă +config.db.name=Nume +config.db.schema=Schemă +config.db.schema_helper=(doar pentru "postgres") +config.db.user=Utilizator +config.db.ssl_mode=Mod SSL +config.db.ssl_mode_helper=(doar pentru "postgres") +config.db.path=Cale +config.db.path_helper=(doar pentru "sqlite3") +config.db.max_open_conns=Maximul de conexiuni deschise +config.db.max_idle_conns=Numărul maxim de conexiuni inactive + +config.security_config=Configurație de securitate +config.security.login_remember_days=Autentificare amintiți-vă zile +config.security.cookie_remember_name=Amintiți-vă cookie-ul +config.security.cookie_username=Cookie de nume de utilizator +config.security.cookie_secure=Activați cookie-ul securizat +config.security.reverse_proxy_auth_user=Antet de autentificare proxy inversat +config.security.enable_login_status_cookie=Activați cookie-ul de stare de conectare +config.security.login_status_cookie_name=Cookie de stare de autentificare +config.security.local_network_allowlist=Rețeaua locală lista de permise + +config.email_config=Configurație e-mail +config.email.enabled=Activat +config.email.subject_prefix=Prefixul subiectului +config.email.host=Gazdă +config.email.from=De la +config.email.user=Utilizator +config.email.disable_helo=Dezactivează HELO +config.email.helo_hostname=HELO nume de gazdă +config.email.skip_verify=Treceți peste verificarea certificatului +config.email.use_certificate=Utilizați un certificat personalizat +config.email.cert_file=Fișier certificat +config.email.key_file=Fișier cheie +config.email.use_plain_text=Utilizați text simplu +config.email.add_plain_text_alt=Adăugați o alternativă de text simplu +config.email.send_test_mail=Trimiteți un e-mail de testare +config.email.test_mail_failed=Nu a reușit să trimită un e-mail de test către '%s': %v +config.email.test_mail_sent=E-mailul de test a fost trimis la '%s'. + +config.auth_config=Configurația de autentificare +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activați viețile de cod +config.auth.reset_password_code_lives=Resetează viețile codului parolei +config.auth.require_email_confirm=Solicită confirmarea prin e-mail +config.auth.require_sign_in_view=Necesită semn în vedere +config.auth.disable_registration=Dezactivarea înregistrării +config.auth.enable_registration_captcha=Activați captcha de înregistrare +config.auth.enable_reverse_proxy_authentication=Activați autentificarea proxy-ului invers +config.auth.enable_reverse_proxy_auto_registration=Activați înregistrarea automată a proxy-ului invers +config.auth.reverse_proxy_authentication_header=Antet de autentificare proxy inversat + +config.user_config=Configurația utilizatorului +config.user.enable_email_notify=Activați notificarea prin e-mail + +config.session_config=Configurația sesiunii +config.session.provider=Furnizor +config.session.provider_config=Configurația furnizorului +config.session.cookie_name=Cookie +config.session.https_only=Doar HTTPS +config.session.gc_interval=Interval GC +config.session.max_life_time=Timp maxim de viață +config.session.csrf_cookie_name=Cookie CSRF + +config.cache_config=Configurația cache-ului +config.cache.adapter=Adaptor +config.cache.interval=Interval GC +config.cache.host=Gazdă + +config.http_config=Configurație HTTP +config.http.access_control_allow_origin=Controlul accesului permite originea + +config.attachment_config=Configurația atașamentului +config.attachment.enabled=Activat +config.attachment.path=Cale +config.attachment.allowed_types=Tipuri permise +config.attachment.max_size=Limita de mărime +config.attachment.max_files=Limita fişierelor + +config.release_config=Configurația de lansare +config.release.attachment.enabled=Atașament activat +config.release.attachment.allowed_types=Tipuri permise de atasare +config.release.attachment.max_size=Limita de dimensiune a atașamentelor +config.release.attachment.max_files=Limita fişierelor ataşate + +config.picture_config=Configurația imaginii +config.picture.avatar_upload_path=Calea de încărcare a avatarului utilizatorului +config.picture.repo_avatar_upload_path=Calea de încărcare a avatarului din depozit +config.picture.gravatar_source=Sursa Gravatar +config.picture.disable_gravatar=Dezactivați Gravatar +config.picture.enable_federated_avatar=Activați avatarele federate + +config.mirror_config=Mirror configurare +config.mirror.default_interval=Interval implicit + +config.webhook_config=Webhook configurare +config.webhook.types=Tipuri +config.webhook.deliver_timeout=Timeout pentru livrare +config.webhook.skip_tls_verify=Sari peste verificarea TLS + +config.git_config=Configurare Git +config.git.disable_diff_highlight=Dezactivează evidențierea sintaxei diff +config.git.max_diff_lines=Limita liniilor de diferență (pentru un singur fișier) +config.git.max_diff_line_characters=Limita de caractere difuze (pentru un singur rând) +config.git.max_diff_files=Diff file limit (pentru un singur diff) +config.git.gc_args=Argumentele GC +config.git.migrate_timeout=Expirare migrare +config.git.mirror_timeout=Mirror expirarea timpului de preluare +config.git.clone_timeout=Clonare timp limită +config.git.pull_timeout=Expirare tragere +config.git.gc_timeout=GC timp limită de așteptare + +config.lfs_config=LFS configurație +config.lfs.storage=Stocare +config.lfs.objects_path=Calea obiectelor + +config.log_config=Configurație jurnal +config.log_file_root_path=Calea de root a fişierului jurnal +config.log_mode=Mod +config.log_options=Opţiuni + +monitor.cron=Sarcini Cron +monitor.name=Nume +monitor.schedule=Programul +monitor.next=Data viitoare +monitor.previous=Timp anterior +monitor.execute_times=Timpii de execuție +monitor.process=Procese de execuție +monitor.desc=Descriere +monitor.start=Ora de începere +monitor.execute_time=Timp de execuție + +notices.system_notice_list=Notificări de sistem +notices.view_detail_header=Vezi detalii notificare +notices.actions=Acţiuni +notices.select_all=Selectează toate +notices.deselect_all=Deselectare toate +notices.inverse_selection=Inversează selecția +notices.delete_selected=Şterge selecţia +notices.delete_all=Șterge toate notificările +notices.type=Tip +notices.type_1=Repositoriu +notices.desc=Descriere +notices.op=Op. +notices.delete_success=Notificările de sistem au fost șterse cu succes. + +[action] +create_repo=a creat un repozitoriu %s +rename_repo=a redenumit repozitoriu din %[1]s în %[3]s +commit_repo=a împins spre %[3]s la %[4]s +compare_commits=Vizualizați comparația pentru aceste %d consemnări +transfer_repo=a transferat repozitoriu %s la %s +create_issue=`problemă deschisă %s#%[2]s` +close_issue=`problemă închisă %s#%[2]s` +reopen_issue=`problemă redeschisă %s#%[2]s` +comment_issue=`a comentat la problema %s#%[2]s` +create_pull_request=`a creat cererea de tragere %s#%[2]s` +close_pull_request=`cerere de tragere închisă %s#%[2]s` +reopen_pull_request=`redeschisă cererea de tragere %s#%[2]s` +merge_pull_request=`cerere de tragere comasată %s#%[2]s` +create_branch=a creat o ramură nouă %[3]s la %[4]s +delete_branch=ramură ștersă %[2]s la %[3]s +push_tag=etichetă împinsă %[2]s la %[3]s +delete_tag=etichetă ștearsă %[2]s la %[3]s +fork_repo=a bifurcat un repozitoriu la %s +mirror_sync_push=a sincronizat consemnările de la %[3]s la %[4]s din oglindire +mirror_sync_create=a sincronizat referință nouă %[2]s la %[3]s din oglindire +mirror_sync_delete=referință sincronizată și ștersă %[2]s la %[3]s din oglindire + +[tool] +ago=în urmă +from_now=de acum +now=acum +1s=1 secundă %s +1m=1 minut %s +1h=1 oră %s +1d=1 zi %s +1w=1 săptămână %s +1mon=1 lună %s +1y=1 an %s +seconds=%d secunde %s +minutes=%d minute %s +hours=%d ore %s +days=%d zile %s +weeks=%d săptămâni %s +months=%d luni %s +years=%d ani %s +raw_seconds=secunde +raw_minutes=minute +raw_hours=ore + +[dropzone] +default_message=Trage fișierele aici sau apasă pentru a le încărca. +invalid_input_type=Nu puteți încărca fișiere de acest tip. +file_too_big=Dimensiunea fişierului ({{filesize}} MB) depăşeşte dimensiunea maximă ({{maxFilesize}} MB). +remove_file=Remove files + diff --git a/conf/locale/locale_ru-RU.ini b/conf/locale/locale_ru-RU.ini index 80fad15fdf8..5d2ae996a0d 100644 --- a/conf/locale/locale_ru-RU.ini +++ b/conf/locale/locale_ru-RU.ini @@ -4,12 +4,11 @@ home=Главная dashboard=Панель управления explore=Обзор help=Помощь -sign_in=Войти +sign_in=Вход sign_out=Выход sign_up=Регистрация register=Регистрация website=Веб-сайт -version=Версия page=Страница template=Шаблон language=Язык @@ -24,10 +23,10 @@ re_type=Введите повторно captcha=Капча repository=Репозиторий -organization=Группа +organization=Организация mirror=Зеркало new_repo=Новый репозиторий -new_migrate=Новая Миграция +new_migrate=Новая миграция new_mirror=Новое зеркало new_fork=Новое ответвление репозитория new_org=Новая организация @@ -44,47 +43,56 @@ issues=Задачи cancel=Отмена +[status] +page_not_found=Страница не найдена +internal_server_error=Внутренняя ошибка сервера + [install] install=Установка title=Установочные шаги для первого запуска docker_helper=Если вы запускаете Gogs внутри Docker, пожалуйста прочтите эти советы внимательно перед тем как что-либо изменить на этой странице! -requite_db_desc=Gogs требует MySQL, PostgreSQL, SQLite3 или TiDB. +requite_db_desc=Для работы Gogs требуется MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL). db_title=Настройки базы данных db_type=Тип базы данных host=Хост user=Пользователь password=Пароль db_name=Имя базы данных +db_schema=Схема 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 не может содержать символы "." и "-". +sqlite_helper=Путь к файлу базы данный SQLite3.
Пожалуйста, используйте абсолютный путь если Gogs запускается как сервис. +err_empty_db_path=Путь к файлу базы данных SQLite3 не может быть пустым. no_admin_and_disable_registration=Вы не можете отключить регистрацию до создания учетной записи администратора. err_empty_admin_password=Пароль администратора не может быть пустым. general_title=Общие параметры Gogs app_name=Имя приложения app_name_helper=Укажите здесь название вашей потрясающей организации! -repo_path=Путь корня репозитория +repo_path=Основной путь репозитория repo_path_helper=Все сетевые репозитории Git будут сохранены в этой директории. run_user=Пользователь run_user_helper=У пользователя должен быть доступ к пути к корню репозитория и к запуску Gogs. domain=Домен domain_helper=Влияет на URL-адреса для клонирования по SSH. ssh_port=SSH порт -ssh_port_helper=Номер порта, который использует SSH сервер. Оставьте пустым, чтобы отключить SSH. +ssh_port_helper=Номер порта, который использует сервер SSH. Оставьте пустым, чтобы отключить SSH. +use_builtin_ssh_server=Использовать встроенный сервер SSH +use_builtin_ssh_server_popup=Запустить встроенный SSH сервер для различения операций Git и системного демона SSH. http_port=Порт HTTP http_port_helper=Номер порта, который приложение будет слушать. app_url=URL приложения app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на адреса в электронной почте. log_root_path=Путь к журналу log_root_path_helper=Каталог для записи файлов журнала. +enable_console_mode=Включите режим консоли +enable_console_mode_popup=В дополнение к файловому режиму, выводить лог в консоль. +default_branch=Ветка по умолчанию optional_title=Расширенные настройки email_title=Настройки службы электронной почты -smtp_host=Узел SMTP +smtp_host=Хост SMTP smtp_from=Из smtp_from_helper=Почта от адреса, RFC 5322. Это может быть email адрес или формат "Имя" . mailer_user=Электронная почта отправителя @@ -95,16 +103,16 @@ server_service_title=Сервер и другие настройки служб offline_mode=Включение офлайн режима offline_mode_popup=Отключить CDN даже в производственном режиме, все файлы ресурсов будут раздаваться локально. disable_gravatar=Отключить службу Gravatar -disable_gravatar_popup=Отключить Gravatar и пользовательские источники, все аватары по-умолчанию загружаются пользователями. +disable_gravatar_popup=Отключить Gravatar и пользовательские источники. Используются аватары, загружаемые пользователями, или аватары по умолчанию. federated_avatar_lookup=Включить поиск внешних Аватаров -federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +federated_avatar_lookup_popup=Включите Поиск федеративного аватара для использования федеративной службы с открытым исходным кодом на основе libravatar. disable_registration=Отключить самостоятельную регистрацию disable_registration_popup=Запретить пользователям самостоятельную регистрацию, только администратор может создавать аккаунты. enable_captcha=Включить капчу enable_captcha_popup=Запрашивать капчу при регистрации пользователя. require_sign_in_view=Разрешить требовать авторизацию для просмотра страниц require_sign_in_view_popup=Только авторизированные пользователи могут просматривать страницы, посетители смогут увидеть только ссылку на авторизацию вверху страницы. -admin_setting_desc=Вы не должны создать учетную запись администратора прямо сейчас, пользователь с ID = 1 получит доступ с правами администратора автоматически. +admin_setting_desc=Вам не обязательно создавать учетную запись администратора прямо сейчас, пользователь с ID = 1 получит доступ с правами администратора автоматически. admin_title=Настройки учётной записи администратора admin_name=Имя пользователя admin_password=Пароль @@ -116,7 +124,10 @@ sqlite3_not_available=Ваша версия не поддерживает SQLite invalid_db_setting=Настройки базы данных не правильные: %v invalid_repo_path=Недопустимый путь к корню репозитория: %v run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s +smtp_host_missing_port=Не указан порт в адресе хоста SMTP. +invalid_smtp_from=Поле SMTP From неправильное: %v save_config_failed=Не удалось сохранить конфигурацию: %v +init_failed=Не удалось инициализировать приложение: %v invalid_admin_setting=Указан недопустимый параметр учетной записи администратора: %v install_success=Добро пожаловать! Мы рады, что вы выбрали Gogs. Веселитесь и берегите себя. invalid_log_root_path=Недопустимый путь для логов: %v @@ -137,6 +148,7 @@ issues.in_your_repos=В ваших репозиториях [explore] repos=Репозитории users=Пользователи +organizations=Организации search=Поиск [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Уже есть аккаунт? Авторизуйтесь! social_register_hepler_msg=Уже есть учетная запись? Свяжите ее с соцсетью! disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта. disable_register_mail=К сожалению подтверждение регистрации по почте отключено. +auth_source=Тип аутентификации +local=Локальный remember_me=Запомнить меня forgot_password=Забыли пароль forget_password=Забыли пароль? @@ -153,22 +167,29 @@ confirmation_mail_sent_prompt=Новое письмо для подтвержд active_your_account=Активируйте свой аккаунт prohibit_login=Вход запрещен prohibit_login_desc=Вход для вашей учетной записи был запрещен, пожалуйста, свяжитесь с администратором сайта. -resent_limit_prompt=Извините, вы уже запросили активацию по электронной почте недавно. Пожалуйста, подождите 3 минуты, а затем повторите попытку. -has_unconfirmed_mail=Здравствуйте, %s! У вас есть неподтвержденный адрес электронной почты (%s). Если вам не приходило письмо с подтверждением или нужно выслать новое письмо, нажмите на кнопку ниже. +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=Длина пароля не менее 6 символов. +password_too_short=Длина пароля не может быть менее 6 символов. non_local_account=Нелокальные аккаунты не могут изменить пароль через Gogs. +login_two_factor=Двухфакторная аутентификация +login_two_factor_passcode=Код проверки подлинности +login_two_factor_enter_recovery_code=Введите код двухфакторной аутентификации +login_two_factor_recovery=Двухфакторная аутентификация +login_two_factor_recovery_code=Код восстановления +login_two_factor_enter_passcode=Введите код двухфакторной аутентификации +login_two_factor_invalid_recovery_code=Код восстановления был использован или не действителен. + [mail] activate_account=Пожалуйста активируйте свой аккаунт activate_email=Подтвердите адрес своей электронной почты reset_password=Восстановите ваш пароль -register_success=Регистрация окончена. Добро пожаловать! +register_success=Регистрация завершена. Добро пожаловать register_notify=Добро пожаловать на борт [modal] @@ -190,15 +211,16 @@ AuthName=Имя авторизации AdminEmail=Электронная почта администратора NewBranchName=Новая ветка -CommitSummary=Commit summary +CommitSummary=Резюме коммита CommitMessage=Зафиксировать сообщение -CommitChoice=Commit choice +CommitChoice=Выбор коммита TreeName=Путь к файлу Content=Содержимое require_error=` не может быть пустым.` -alpha_dash_error=«должен быть допустимым символьным, числовым или dash(-_) значением.» -alpha_dash_dot_error=«должен быть допустимым символьным, числовым или dash(-_) символами, включая точку.» +alpha_dash_error=` должен быть допустимым символьным, числовым или dash(-_) значением.` +alpha_dash_dot_error=` должен быть допустимым символьным, числовым или dash(-_) символами, включая точку.` +alpha_dash_dot_slash_error=«должен быть допустимым символьным, числовым или dash(-_) символами, включая точку или слэш.» size_error=` должен быть размер %s.` min_size_error=«должен содержать по крайней мере %s символов.» max_size_error=` должен содержать максимум %s символов.` @@ -207,7 +229,7 @@ url_error=` не является допустимым URL-адресом.` include_error=` должен содержать '%s'.` unknown_error=Неизвестная ошибка: captcha_incorrect=Капча не пройдена. -password_not_match=Пароли не совпадают. +password_not_match=Пароль и подтверждение отличаются. username_been_taken=Имя пользователя занято. repo_name_been_taken=Имя репозитория занято. @@ -215,6 +237,7 @@ org_name_been_taken=Название организации занято. team_name_been_taken=Название команды занято. email_been_used=Адрес электронной почты уже используется. username_password_incorrect=Имя пользователя или пароль не правильный. +auth_source_mismatch=Выбранный источник проверки подлинности не связан с пользователем. enterred_invalid_repo_name=Пожалуйста, убедитесь, что введено правильное имя репозитория. enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное. enterred_invalid_password=Убедитесь, что введенный пароль верен. @@ -227,9 +250,9 @@ auth_failed=Ошибка аутентификации: %v still_own_repo=На вашем аккаунте все еще остается как минимум один репозиторий, сначала вам нужно удалить или передать его. still_has_org=Вы находитесь в организации, сперва Вам необходимо покинуть ее или удалить. -org_still_own_repo=Данная организация все еще является владельцем репозиториев, необходимо удалить или переместить их в начале. +org_still_own_repo=Данная организация все еще является владельцем репозиториев, сначала нужно удалить или переместить их. -target_branch_not_exist=Целевая ветка не существует +target_branch_not_exist=Целевая ветка не существует. [user] change_avatar=Изменить аватар @@ -242,19 +265,18 @@ following=Подписан follow=Подписаться unfollow=Отписаться -form.name_reserved=Имя пользователя '%s' зарезервировано. -form.name_pattern_not_allowed=Имя пользователя «%s» не допускается. +form.name_not_allowed=Имя пользователя «%s» не допускается. [settings] profile=Профиль password=Пароль avatar=Аватар ssh_keys=SSH ключи -social=Учетные записи в соцсетях -applications=Приложения +security=Безопасность +repos=Репозитории orgs=Организации +applications=Приложения delete=Удалить аккаунт -uid=UID public_profile=Открытый профиль profile_desc=Адрес вашей электронной почты является публичным и будет использован для любых уведомлений, связанных с аккаунтом, а также для любых действий, совершенных через сайт. @@ -282,7 +304,7 @@ change_password=Сменить пароль old_password=Текущий пароль new_password=Новый пароль retype_new_password=Подтверждение нового пароля -password_incorrect=Текущий пароль не правильный. +password_incorrect=Текущий пароль неправильный. change_password_success=Пароль сменен успешно. Теперь вы можете войти с новым паролем. password_change_disabled=Нелокальные пользователи не могут изменить свой пароль. @@ -290,17 +312,18 @@ emails=Адреса электронной почты manage_emails=Управление адресами электронной почты email_desc=Ваш основной адрес электронной почты будет использован для уведомлений и других операций. primary=Основной -primary_email=Установить как основной +primary_email=Сделать основным delete_email=Удалить email_deletion=Удаление адреса электронной почты email_deletion_desc=Удаление этого адреса электронной почты, приведет к удалению связанной с вашим аккаунтом, информации. Вы точно хотите продолжить? email_deletion_success=Адрес электронной почты успешно удален. +email_deletion_primary=Невозможно удалить основной адрес эл. почты. add_new_email=Добавить новый адрес электронной почты add_email=Добавить электронную почту add_email_confirmation_sent=Новое подтверждение по электронной почте было отправлено '%s', пожалуйста, проверьте свой почтовый ящик в течение следующих %d часов, чтобы завершить процесс подтверждения. add_email_success=Новый адрес электронной почты успешно добавлен. -manage_ssh_keys=Управление SSH ключами +manage_ssh_keys=Управление ключами SSH add_key=Добавить ключ ssh_desc=Это список ключей SSH связанных с вашей учетной записью. Удаляйте любые неизвестные вам ключи. ssh_helper=Нужна помощь? Ознакомьтесь с нашим путеводителем по созданию SSH-ключей или посмотрите решения частых проблем, связанных с SSH. @@ -320,14 +343,36 @@ no_activity=Еще не применялся key_state_desc=Этот ключ использовался за последние 7 дней token_state_desc=Этот токен использовался за последние 7 дней -manage_social=Управление привязанными учетными записями в соцсетях -social_desc=Это список привязанных учетных записей в соцсетях. Удаляйте любые неизвестные вам привязки. -unbind=Отвязать -unbind_success=Социальная учетная запись отвязана. +two_factor=Двухфакторная аутентификация +two_factor_status=Статус: +two_factor_on=Включено +two_factor_off=Выключен +two_factor_enable=Включить +two_factor_disable=Выключить +two_factor_view_recovery_codes=Просмотрите и сохранените коды вашего восстановления в надежном месте. Вы можете использовать их в качестве пароля, если потеряете доступ к приложению. +two_factor_http=Для операций HTTP/HTTPS вы больше не сможете использовать просто имя пользователя и пароль. Пожалуйста, создайте и используйте для подписи ваших запросов Персональный ключ доступа, например, %[3]s. +two_factor_enable_title=Включить двухфакторную аутентификацию +two_factor_scan_qr=Пожалуйста, используйте приложения проверки подлинности для сканирования изображения: +two_factor_or_enter_secret=Или введите кодовое слово: +two_factor_then_enter_passcode=Затем введите пароль: +two_factor_verify=Проверить +two_factor_invalid_passcode=Введенные пароли не совпадают; пожалуйста, повторите попытку! +two_factor_reused_passcode=Введенный вами пароль уже используется, пожалуйста, попробуйте другой! +two_factor_enable_error=Ошибка активация двухфакторной аутентификации: %v +two_factor_enable_success=Двухфакторная аутентификация активирована для вашей учетной записи! +two_factor_recovery_codes_title=Коды восстановления для двухфакторная аутентификации +two_factor_recovery_codes_desc=Коды восстановления должны использоваться, когда у вас нет возможности использовать приложение аутентификации. Каждый код восстановления может быть использован один раз, пожалуйста, держите эти коды в надежном месте. +two_factor_regenerate_recovery_codes=Сгенерировать новые коды восстановления +two_factor_regenerate_recovery_codes_error=Ошибка создания новых кодов восстановления: %v +two_factor_regenerate_recovery_codes_success=Новые коды восстановления созданы! +two_factor_disable_title=Отключить двухфакторную аутентификацию +two_factor_disable_desc=Уровень безопасности вашего аккаунта понизится после отключения двухфакторной аутентификации. Вы хотите продолжить? +two_factor_disable_success=Двухфакторная аутентификация выключена! manage_access_token=Управление Токенами Персонального Доступа generate_new_token=Создать новый token tokens_desc=Созданные вами токены могут использоваться для доступа к Gogs API. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=Пока что каждый токен будет иметь полный доступ к вашей учетной записи. token_name=Имя маркера generate_token=Генерировать маркер @@ -336,6 +381,16 @@ delete_token=Удалить access_token_deletion=Удаление личного токена доступа access_token_deletion_desc=Удаление этого персонального токена доступа приведет к удалению всех связанных прав доступа к приложению. Вы хотите продолжить? delete_token_success=Персональный токен доступа успешно удален! Не забудьте изменить настройки вашего приложения. +token_name_exists=Токен с таким именем уже существует. + +orgs.none=Вы не состоите ни в одной организации. +orgs.leave_title=Покинуть организацию +orgs.leave_desc=Вы потеряете доступ ко всем репозиториям и командам, как только покинете организацию. Вы хотите продолжить? + +repos.leave=Выйти +repos.leave_title=Покинуть репозиторий +repos.leave_desc=Вы потеряете доступ к репозиторию, после того, как вы его покинете. Вы хотите продолжить? +repos.leave_success=Вы покинули репозиторий «%s» успешно! delete_account=Удалить свой аккаунт delete_prompt=Этим действием вы удалите свою учетную запись навсегда и НЕ СМОЖЕТЕ ее вернуть! @@ -348,8 +403,10 @@ owner=Владелец repo_name=Имя репозитория repo_name_helper=Лучшие названия репозиториев коротки, запоминаемы и уникальны. visibility=Видимость -visiblity_helper=Личный репозиторий -visiblity_helper_forced=Все новые репозитории являются Личными по желанию администратора сайта +unlisted=Вне списка +visiblity_helper=Приватный репозиторий +unlisted_helper=Этот репозиторий Вне списка +visiblity_helper_forced=Администрация сайта сделала все новые репозитории Приватными visiblity_fork_helper=(Изменение этого значения затронет все ответвления) clone_helper=Нужна помощь в клонировании? Посетите страницу помощи! fork_repo=Ответвить репозиторий @@ -366,7 +423,7 @@ auto_init=Инициализировать этот репозиторий вы create_repo=Создать репозиторий default_branch=Ветка по умолчанию mirror_prune=Очистить -mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote +mirror_prune_desc=Удалите ссылки на удаленно отслеживаемые объекты, которых больше нет на удаленном сервере mirror_interval=Интервал зеркалирования (час) mirror_address=Адрес зеркала mirror_address_desc=Укажите необходимые учетные данные в адрес. @@ -374,24 +431,26 @@ mirror_last_synced=Последняя синхронизация watchers=Наблюдатели stargazers=Звездочеты forks=Ответвления +repo_description_helper=Описание репозитория. Максимальная длина 512 символов. +repo_description_length=Доступные символы form.reach_limit_of_creation=У владельца достигнут максимальный предел в %d создаваемых репозиториев. -form.name_reserved=Имя репозитория '%s' зарезервировано. -form.name_pattern_not_allowed=Шаблон имени репозитория '%s' не допускается. +form.name_not_allowed=Имя или шаблон репозитория% q недопустимы. need_auth=Требуется авторизация migrate_type=Тип миграции migrate_type_helper=Этот репозиторий будет зеркалом migrate_repo=Перенос репозитория migrate.clone_address=Скопировать адрес -migrate.clone_address_desc=Это может быть HTTP/HTTPS/GIT адрес или локальный путь на сервере. +migrate.clone_address_desc=Это может быть HTTP/HTTPS/GIT URL-адрес. +migrate.clone_address_desc_import_local=Вы также можете мигрировать репозиторий по локальному пути на сервере. migrate.permission_denied=У вас нет прав на импорт локальных репозиториев. migrate.invalid_local_path=Недопустимый локальный путь. Возможно он не существует или является не папкой. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Миграция не удалась: %v mirror_from=зеркало из forked_from=ответвлено от -fork_from_self=Вы не можете ответвить репозиторий, так как Вы уже его владелец! copy_link=Скопировать copy_link_success=Скопировано! copy_link_error=Нажмите ⌘-C или Ctrl-C для копирования @@ -407,25 +466,36 @@ quick_guide=Краткое руководство clone_this_repo=Клонировать репозиторий create_new_repo_command=Создать новый репозиторий из командной строки push_exist_repo=Отправить существующий репозиторий из командной строки -repo_is_empty=Этот репозиторий пуст, пожалуйста, возвращайтесь позже! +bare_message=В репозитории еще нет файлов. -code=Код +files=Файлы branch=Ветка tree=Дерево filter_branch_and_tag=Фильтр по ветке или тегу branches=Ветки tags=Метки -issues=Обсуждения +issues=Задачи pulls=Запросы на слияние labels=Метки milestones=Этапы commits=Коммиты +git_branches=Ветки releases=Релизы file_raw=Исходник file_history=История file_view_raw=Посмотреть исходник file_permalink=Постоянная ссылка file_too_large=Этот файл слишком большой, поэтому он не может быть отображен +video_not_supported_in_browser=Ваш браузер не поддерживает HTML5 видео тэг. + +branches.overview=Обзор +branches.active_branches=Активные ветки +branches.stale_branches=Устаревшие ветки +branches.all=Все ветки +branches.updated_by=Обновлено %[1]s пользователем %[2]s +branches.change_default_branch=Change Default Branch +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Новый файл editor.upload_file=Загрузить файл @@ -433,13 +503,13 @@ editor.edit_file=Редактировать файл editor.preview_changes=Просмотр изменений editor.cannot_edit_non_text_files=Возможно редактировать только текстовые файлы editor.edit_this_file=Отредактируйте этот файл -editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file +editor.must_be_on_a_branch=Чтобы сделать или предложить изменения вы должны выбрать ветку editor.fork_before_edit=Создайте ветку репозитория перед редактированием файла editor.delete_this_file=Удалить файл editor.must_have_write_access=Вам необходимо иметь доступ на запись, чтобы вносить или предлагать правки этого файла -editor.file_delete_success=File '%s' has been deleted successfully! +editor.file_delete_success=Файл «%s» был успешно удален! editor.name_your_file=Назовите свой файл... -editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. +editor.filename_help=Чтобы добавить каталог, просто наберите название и нажмите /. Чтобы удалить каталог, перейдите к началу поля и нажмите клавишу backspace. editor.or=или editor.cancel_lower=отмена editor.commit_changes=Фиксация изменений @@ -447,24 +517,27 @@ editor.add_tmpl=Добавить '%s/' editor.add=Добавить '%s' editor.update=Обновить '%s' editor.delete=Удалить '%s' -editor.commit_message_desc=Add an optional extended description... -editor.commit_directly_to_this_branch=Commit directly to the %s branch. -editor.create_new_branch=Create a new branch for this commit and start a pull request. +editor.commit_message_desc=Добавьте необязательное расширенное описание... +editor.commit_directly_to_this_branch=Сделайте коммит прямо в ветку %s. +editor.create_new_branch=Создайте новую ветвь для этого коммита, и сделайте пул запрос. editor.new_branch_name_desc=Новое название ветки... editor.cancel=Отмена editor.filename_cannot_be_empty=Имя файла не может быть пустым. editor.branch_already_exists=Ветка «%s» уже существует в этом репозитории. -editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. -editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. -editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. -editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. +editor.directory_is_a_file=Запись «%s» в пути на верх является файлом, а не каталогом этого репозитория. +editor.file_is_a_symlink=Файл '%s' является символической ссылкой, которая не может быть изменена через веб-редактор. +editor.filename_is_a_directory=Файл «%s» является каталогом в этом репозитории. +editor.file_editing_no_longer_exists=Редактируемый вами файл «%s» больше не существует в репозитории. +editor.file_changed_while_editing=Содержимое файла изменилось со времени начала редактирования. нажмите здесь, чтобы увидеть, что было изменено, или нажмите кнопку commit снова, чтобы перезаписать эти изменения. editor.file_already_exists=Файл с именем «%s» уже существует в этом репозитории. editor.no_changes_to_show=Нет изменений. editor.fail_to_update_file=Не удалось обновить/создать файл «%s» из-за ошибки: %v +editor.fail_to_delete_file=Не удалось удалить файл «%s» из-за ошибки: %v editor.add_subdir=Добавьте подкаталог... editor.unable_to_upload_files=Не удалось загрузить файлы в «%s» из-за ошибки: %v editor.upload_files_to_dir=Загрузить файлы '%s' +commits.commit_history=История коммитов commits.commits=Коммиты commits.search=Поиск коммитов commits.find=Найти @@ -477,7 +550,7 @@ commits.newer=Новее issues.new=Новая задача issues.new.labels=Метки issues.new.no_label=Нет меток -issues.new.clear_labels=Отчистить метки +issues.new.clear_labels=Очистить метки issues.new.milestone=Этап issues.new.no_milestone=Нет этапа issues.new.clear_milestone=Очистить этап @@ -491,10 +564,10 @@ issues.new_label=Новая метка issues.new_label_placeholder=Имя метки... issues.create_label=Добавить метку issues.label_templates.title=Загрузить набор предопределённых меток -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.info=Меток пока нет. Вы можете нажать на кнопку «Создать метку», чтобы создать новую или использовать одну из готового набора ниже. issues.label_templates.helper=Выберите метку issues.label_templates.use=Использовать ярлык -issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v +issues.label_templates.fail_to_load_file=Не удалось загрузить файл шаблона метки «%s»: %v issues.open_tab=%d открыто(ы) issues.close_tab=%d закрыто(ы) issues.filter_label=Метка @@ -522,7 +595,7 @@ issues.next=Следующая страница issues.open_title=Открыто issues.closed_title=Закрыто issues.num_comments=комментариев: %d -issues.commented_at=`commented %s` +issues.commented_at=`прокомментировал %s` issues.delete_comment_confirm=Вы уверены, что хотите удалить этот комментарий? issues.no_content=Пока нет содержимого. issues.close_issue=Закрыть @@ -562,6 +635,7 @@ pulls.compare_compare=сравнить pulls.filter_branch=Фильтр по ветке pulls.no_results=Результатов не найдено. pulls.nothing_to_compare=Нечего сравнивать, родительская и текущая ветка одинаковые. +pulls.nothing_merge_base=Нечего сравнивать, так так история обеих веток полностью отличается. pulls.has_pull_request=`Уже существует запрос на слияние между двумя целями: %[2]s#%[3]d` pulls.create=Создать запрос на слияние pulls.title_desc=хочет смерджить %[1]d коммит(ов) из %[2]s в %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=Продолжается проверка конфликтов pulls.can_auto_merge_desc=Этот запрос на слияние может быть объединён автоматически. pulls.cannot_auto_merge_desc=Этот запрос на слияние не может быть объединён автоматически. pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов. +pulls.create_merge_commit=Создать коммит на слияние +pulls.rebase_before_merging=Выполнить rebase перед слиянием +pulls.commit_description=Описание коммита pulls.merge_pull_request=Слить пулл-реквест pulls.open_unmerged_pull_exists=`Вы не можете снова открыть, поскольку уже существует запрос на слияние (#%d) из того же репозитория с той же информацией о слиянии и ожидающий слияния. ` +pulls.delete_branch=Удалить ветку +pulls.delete_branch_has_new_commits=Нельзя удалить ветку, так как она имеет новые коммиты после слияния. milestones.new=Новая контрольная точка milestones.open_tab=%d открыты @@ -629,6 +708,29 @@ settings.collaboration.admin=Администратор settings.collaboration.write=Запись settings.collaboration.read=Просмотр settings.collaboration.undefined=Не определено +settings.branches=Ветки +settings.branches_bare=Вы не можете управлять ветками для пустого репозитория. Пожалуйста, сначала создайте что-нибудь. +settings.default_branch=Ветка по умолчанию +settings.default_branch_desc=Ветка по-умолчанию считается основной для коммитов, запросов на слияние и онлайн-редактирования. +settings.update=Обновить +settings.update_default_branch_unsupported=Изменение ветки по умолчанию не поддерживается в версии Git на сервере. +settings.update_default_branch_success=Ветка по умолчанию для этого репозитория была успешно изменена! +settings.protected_branches=Защищенные ветки +settings.protected_branches_desc=Защитить ветки от принудительного push, случайного удаления и разрешить изменения только коммитерам из белого списка. +settings.choose_a_branch=Выберите ветку... +settings.branch_protection=Защита веток +settings.branch_protection_desc=Пожалуйста, выберите параметры защиты для ветки %s. +settings.protect_this_branch=Защитить эту ветку +settings.protect_this_branch_desc=Выключить принудительный push и защитить от удаления. +settings.protect_require_pull_request=Требовать запрос на слияние вместо прямого push +settings.protect_require_pull_request_desc=Включите этот параметр для запрета прямого push в это ветку. Коммит должен быть запушен в незащищенную ветку и слит в эту ветку через запрос на слияние. +settings.protect_whitelist_committers=Белый список тех, кто может делать push в эту ветку +settings.protect_whitelist_committers_desc=Добавьте людей или команды в белый список для прямого доступа к этой ветке. Пользователи из белого списка будут обходить проверку pull request. +settings.protect_whitelist_users=Пользователи которые могут делать push в эту ветку +settings.protect_whitelist_search_users=Поиск пользователей +settings.protect_whitelist_teams=Команды, члены которых могут делать push в эту ветку +settings.protect_whitelist_search_teams=Поиск команд +settings.update_protect_branch_success=Параметры защиты этой ветки были успешно обновлены! settings.hooks=Автоматическое обновление settings.githooks=Git хуки settings.basic_settings=Основные параметры @@ -641,19 +743,26 @@ settings.change_reponame_prompt=Это изменение повлияет на settings.advanced_settings=Расширенные настройки settings.wiki_desc=Включить систему Wiki settings.use_internal_wiki=Использовать встроенную wiki +settings.allow_public_wiki_desc=Разрешить публичный доступ к wiki-разделу, если репозиторий приватный settings.use_external_wiki=Использовать внешнюю Wiki settings.external_wiki_url=URL-адрес внешней Вики settings.external_wiki_url_desc=Посетители будут перенаправлены на URL-адрес, когда они кликнут по вкладке. settings.issues_desc=Включить систему отслеживания ошибок settings.use_internal_issue_tracker=Использовать встроенную легковесную систему отслеживания ошибок +settings.allow_public_issues_desc=Разрешить публичный доступ к вопросам, если репозиторий приватный 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=Цифровой settings.tracker_issue_style.alphanumeric=Буквенноцифровой settings.tracker_url_format_desc=Вы можете использовать шаблон {user} {repo} {index} для имени пользователя, репозитория и номера задачи. -settings.pulls_desc=Включить публичные запросы на слияние +settings.pulls_desc=Разрешить пул-запросы для принятия изменений между репозиториями и ветками +settings.pulls.ignore_whitespace=Игнорировать изменения в пробельных символах +settings.pulls.allow_rebase_merge=Разрешить rebase-слияние settings.danger_zone=Опасная зона +settings.cannot_fork_to_same_owner=Вы не можете ответвить репозиторий его же владельцу. settings.new_owner_has_same_repo=У нового владельца уже есть хранилище с таким названием. settings.convert=Преобразовать в обычный репозиторий settings.convert_desc=Это зеркало можно преобразовать в обычный репозиторий. Это не может быть отменено. @@ -672,7 +781,7 @@ settings.wiki_deletion_success=Данные Вики успешно стерты settings.delete=Удалить этот репозиторий settings.delete_desc=Будьте внимательны! Как только вы удалите репозиторий — пути назад не будет. settings.delete_notices_1=- Эта операция НЕ МОЖЕТ быть отменена. -settings.delete_notices_2=- Эта операция навсегда удалит всё из этого репозитория, включая данные Git, связанные с ним задачи, комментарии и права доступа для сотрудников. +settings.delete_notices_2=- Эта операция удалит все в этом репозитории, включая данные Git, задачи, комментарии и доступы для соавторов. settings.delete_notices_fork_1=- Все отвлетвления станут независимыми после удаления. settings.deletion_success=Репозиторий был успешно удалён! settings.update_settings_success=Настройки репозитория обновлены успешно. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Этот пользователь больш settings.remove_collaborator_success=Соавтор был удален. settings.search_user_placeholder=Поиск пользователя... settings.org_not_allowed_to_be_collaborator=Организации не могут быть добавлены как соавторы. -settings.user_is_org_member=Пользователь является членом организации, члены которой не могут быть добавлены в качестве соавтора. -settings.add_webhook=Добавить Webhook settings.hooks_desc=Webhooks позволяют внешним службам получать уведомления при возникновении определенных событий на Gogs. При возникновении указанных событий мы отправим запрос POST на каждый заданный вами URL. Узнать больше можно в нашем Руководстве по Webhooks. +settings.webhooks.add_new=Добавьте новый веб-перехватчик: +settings.webhooks.choose_a_type=Выберите тип... +settings.add_webhook=Добавить Webhook settings.webhook_deletion=Удалить веб-хук settings.webhook_deletion_desc=Удаление этого веб-хука приведет к удалению всей, связанной с ним, информации, включая историю. Хотите продолжить? settings.webhook_deletion_success=Веб-хук успешно удален! settings.webhook.test_delivery=Проверить доставку settings.webhook.test_delivery_desc=Отправить push для тестирования настройки веб-хуков settings.webhook.test_delivery_success=Тест веб-хука была добавлен в очередь доставки. Это может занять несколько секунд, прежде чем он отобразится в истории доставки. +settings.webhook.redelivery=Повторная доставка +settings.webhook.redelivery_success=Хук задачи «%s» было отправлен в очередь доставки. Обновление статуса в истории может занять некоторое время. settings.webhook.request=Запрос settings.webhook.response=Ответ settings.webhook.headers=Заголовки settings.webhook.payload=Содержимое запроса settings.webhook.body=Тело ответа +settings.webhook.err_cannot_parse_payload_url=Невозможно разобрать URL-адрес полезной нагрузки: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Git-хуки предоставляются Git самим по себе, вы можете изменять файлы поддерживаемых хуков из списка ниже чтобы выполнять внешние операции. settings.githook_edit_desc=Если хук не активен, будет подставлен пример содержимого. Пустое значение в этом поле приведет к отключению хука. settings.githook_name=Название Hook'a @@ -711,6 +825,7 @@ settings.add_webhook_desc=Мы отправим запрос POST settings.payload_url=URL обработчика settings.content_type=Тип содержимого settings.secret=Secret +settings.secret_desc=Секрет будет отправлен как SHA256 HMAC контента в шестнадцатеричном виде в заголовке X-Gogs-Signature. settings.slack_username=Имя пользователя settings.slack_icon_url=URL иконки settings.slack_color=Цвет @@ -720,10 +835,20 @@ settings.event_send_everything=Мне нужно все. settings.event_choose=Позвольте мне выбрать то, что нужно. settings.event_create=Создать settings.event_create_desc=Ветка или тэг созданы -settings.event_pull_request=Запросы на слияние -settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. +settings.event_delete=Удалить +settings.event_delete_desc=Ветка или метка удалена +settings.event_fork=Ответвить +settings.event_fork_desc=Репозиторий склонирован settings.event_push=Push settings.event_push_desc=Push в репозиторий +settings.event_issues=Задачи +settings.event_issues_desc=Задача изменена +settings.event_pull_request=Запросы на слияние +settings.event_pull_request_desc=Запрос слияния открыт, закрыт, переоткрыт, изменён, назначен, снят, метка обновлена, метка убрана, добавлен промежуточный этап, убран промежуточный этап или синхронизирован. +settings.event_issue_comment=Комментарии в задаче +settings.event_issue_comment_desc=Комментарий создан, изменен или удален. +settings.event_release=Релиз +settings.event_release_desc=Релиз опубликован в репозитории. settings.active=Активен settings.active_helper=Подробности о событии, вызвавшем срабатывание хука, также будут предоставлены. settings.add_hook_success=Был добавлен новый webhook. @@ -733,10 +858,13 @@ settings.delete_webhook=Удалить автоматическое обновл settings.recent_deliveries=Недавние рассылки settings.hook_type=Тип перехватчика settings.add_slack_hook_desc=Добавить интеграцию с Slack в ваш репозиторий. +settings.add_discord_hook_desc=Добавить интеграцию с Discord в ваш репозиторий. +settings.add_dingtalk_hook_desc=Добавить интеграцию с Dingtalk в ваш репозиторий. settings.slack_token=Token settings.slack_domain=Домен settings.slack_channel=Канал settings.deploy_keys=Ключи развертывания +settings.deploy_keys_helper=Подсказка: если вы хотите добавить личные публичные ключи, сделайте это в настройках вашего аккаунта. settings.add_deploy_key=Добавить ключ развертывания settings.deploy_key_desc=Ключи развёртывания доступны только для чтения. Это не то же самое что и SSH-ключи аккаунта. settings.no_deploy_keys=Вы не добавляли ключи развертывания. @@ -748,6 +876,8 @@ settings.add_key_success=Новый ключ развертывания '%s' у settings.deploy_key_deletion=Удалить ключ развертывания settings.deploy_key_deletion_desc=Удаление ключа развертывания приведет к удалению всех связанных прав доступа к репозиторию. Вы хотите продолжить? settings.deploy_key_deletion_success=Ключ развертывания успешно удален! +settings.description_desc=Описание репозитория. Максимальная длина 512 символов. +settings.description_length=Доступные символы diff.browse_source=Просмотр исходного кода diff.parent=Родитель @@ -766,7 +896,6 @@ release.releases=Релизы release.new_release=Новый релиз release.draft=Черновик release.prerelease=Пре-релиз -release.stable=Стабильный release.edit=Редактировать release.ahead=%d коммитов %s начиная с этого релиза release.source_code=Исходный код @@ -805,7 +934,7 @@ invite_someone=Пригласить кого-нибудь teams=Команды lower_members=Участники lower_repositories=Репозитории -create_new_team=Создать Новую Команду +create_new_team=Создать новую команду org_desc=Описание team_name=Название команды team_desc=Описание @@ -813,8 +942,8 @@ team_name_helper=Вы будете использовать это имя для team_desc_helper=Что это за команда? team_permission_desc=Какой уровень разрешений должен быть у этой команды? -form.name_reserved=Наименование организации '%s' зарезервированно. -form.name_pattern_not_allowed=Шаблон организации '%s' не допускается. +form.name_not_allowed=Имя или шаблон организации% q недопустимы. +form.team_name_not_allowed=Имя команды или шаблон% q недопустимы. settings=Настройки settings.options=Опции @@ -835,9 +964,9 @@ settings.hooks_desc=Добавьте автоматическое обновле members.membership_visibility=Видимость участника команды: members.public=Публичный -members.public_helper=Сделать Приватным +members.public_helper=Сделать приватным members.private=Приватный -members.private_helper=Сделать Публичным +members.private_helper=Сделать публичным members.member_role=Роль участника: members.owner=Владелец members.member=Участник @@ -886,12 +1015,19 @@ first_page=Первый last_page=Последний total=Всего: %d +dashboard.build_info=Информация о сборке +dashboard.app_ver=Версия приложения +dashboard.git_version=Версия Git +dashboard.go_version=Версия Go +dashboard.build_time=Время сборки +dashboard.build_commit=Коммит сборки dashboard.statistic=Статистика dashboard.operations=Операции dashboard.system_status=Статус системного монитора dashboard.statistic_info=В базе данных Gogs записано %d пользователей, %d организаций, %d публичных ключей, %d репозиториев, %d подписок на репозитории, %d добавлений в избранное, %d действий, %d доступов, %d задач, %d комментариев, %d социальных учетных записей, %d подписок на пользователей, %d зеркал, %d релизов, %d источников входа, %d веб-хуков, %d этапов, %d меток, %d задач хуков, %d команд, %d задач по обновлению, %d присоединенных файлов. dashboard.operation_name=Наименование Операции dashboard.operation_switch=Переключить +dashboard.select_operation_to_run=Пожалуйста, выберите операцию для запуска dashboard.operation_run=Запуск dashboard.clean_unbind_oauth=Удалить не привязанные OAUth dashboard.clean_unbind_oauth_success=Не привязанные OAuth аккаунты успешно удалены. @@ -905,13 +1041,13 @@ dashboard.git_gc_repos=Выполнить сборку мусора на реп dashboard.git_gc_repos_success=Сборка мусора на всех репозиториях успешно выполнена. dashboard.resync_all_sshkeys=Переписать файл «.ssh/authorized_keys» (осторожно: не Gogs ключи будут утеряны) dashboard.resync_all_sshkeys_success=Были успешно переписаны все открытые ключи. -dashboard.resync_all_update_hooks=Перезаписать все апдейт-хуки этого репозитория (необходимо, когда изменен путь до папки конфигураций) -dashboard.resync_all_update_hooks_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.server_uptime=Время непрерывной работы сервера -dashboard.current_goroutine=Текущий Goroutines +dashboard.current_goroutine=Текущих Goroutines dashboard.current_memory_usage=Текущее использование памяти dashboard.total_memory_allocated=Всего памяти выделено dashboard.memory_obtained=Памяти использовано @@ -981,12 +1117,14 @@ repos.private=Приватный repos.watches=Следят repos.stars=В избранном repos.issues=Задачи +repos.size=Размер -auths.auth_manage_panel=Панель управления аутнентификациями +auths.auth_sources=Типы аутентификации auths.new=Добавить новый источник auths.name=Имя auths.type=Тип auths.enabled=Включено +auths.default=По умолчанию auths.updated=Обновлено auths.auth_type=Тип аутентификации auths.auth_name=Имя аутентификации @@ -995,21 +1133,27 @@ auths.domain=Домен auths.host=Хост auths.port=Порт auths.bind_dn=Привязать DN +auths.bind_dn_helper=Вы можете использовать '%s' для подстановки имени пользователя, например: DOM\%s auths.bind_password=Привязать пароль auths.bind_password_helper=Внимание: Этот пароль сохранен в небезопасном виде. Не используйте высоко-привилегированную учетную запись. auths.user_base=База для поиска пользователя auths.user_dn=DN пользователя auths.attribute_username=Атрибут username auths.attribute_username_placeholder=Оставьте пустым, чтобы использовать имя пользователя для регистрации. -auths.attribute_name=Имя аттрибута +auths.attribute_name=Имя атрибута auths.attribute_surname=Фамилия аттрибута auths.attribute_mail=Электронная почта аттрибута +auths.verify_group_membership=Верифицировать членство в группе +auths.group_search_base_dn=Base DN для поиска группы +auths.group_filter=Групповой фильтр +auths.group_attribute_contain_user_list=Атрибут группы, содержащий список пользователей +auths.user_attribute_listed_in_group=Пользовательский атрибут, перечисленный в группе auths.attributes_in_bind=Извлечение атрибутов в виде Bind DN auths.filter=Фильтр пользователя auths.admin_filter=Фильтр администратора auths.ms_ad_sa=Ms Ad SA auths.smtp_auth=Тип аутентификации SMTP -auths.smtphost=Узел SMTP +auths.smtphost=Хост SMTP auths.smtpport=SMTP-порт auths.allowed_domains=Разрешенные домены auths.allowed_domains_helper=Оставьте пустым чтобы не ограничивать домены. Несколько доменов должны быть разделены запятыми ','. @@ -1017,9 +1161,9 @@ 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.default_auth=Эта аутентификация является источником входа по умолчанию auths.new_success=Новый канал аутентификации '%s' успешно создан. auths.update_success=Настройки канала аутентификации успешно сохранены. auths.update=Обновить параметры аутентификации @@ -1028,107 +1172,189 @@ auths.delete_auth_title=Удаление канала аутентификаци auths.delete_auth_desc=Этот канал аутентификации будет удален. Вы уверены что хотите продолжить? auths.still_in_used=Эта проверка подлинности до сих пор используется некоторыми пользователями, удалите или преобразуйте этих пользователей в другой тип входа в систему. auths.deletion_success=Канал аутентификации успешно удален! +auths.login_source_exist=Источник входа '%s' уже существует. +auths.github_api_endpoint=Конечная точка API +config.not_set=(не задано) config.server_config=Конфигурация сервера -config.app_name=Имя приложения -config.app_ver=Версия приложения -config.app_url=URL приложения -config.domain=Домен -config.offline_mode=Автономный режим -config.disable_router_log=Отключение журнала маршрутизатора +config.brand_name=Название бренда config.run_user=Запуск пользователем config.run_mode=Режим выполнения -config.repo_root_path=Путь до корня репозитория -config.static_file_root_path=Статичный путь до файла -config.log_file_root_path=Путь до папки с логами -config.script_type=Тип сценария -config.reverse_auth_user=Заголовок с именем пользователя для авторизации на reverse proxy +config.server.external_url=Внешний URL +config.server.domain=Домен +config.server.protocol=Протокол +config.server.http_addr=HTTP адрес +config.server.http_port=Порт HTTP +config.server.cert_file=Файл сертификата +config.server.key_file=Файл ключа +config.server.tls_min_version=Минимальная версия TLS +config.server.unix_socket_permission=Разрешение сокета Unix +config.server.local_root_url=Локальный корневой URL +config.server.offline_mode=Автономный режим +config.server.disable_router_log=Отключить журнал маршрутизатора +config.server.enable_gzip=Включить Gzip +config.server.app_data_path=Путь к данным приложения +config.server.load_assets_from_disk=Загрузить ассеты с диска +config.server.landing_url=Landing URL config.ssh_config=Конфигурация SSH -config.ssh_enabled=Включено -config.ssh_start_builtin_server=Запустить встроенный сервер -config.ssh_domain=Домен -config.ssh_port=Порт -config.ssh_listen_port=Прослушиваемый порт -config.ssh_root_path=Корневой путь -config.ssh_key_test_path=Путь к тестовому ключу -config.ssh_keygen_path=Путь к генератору ключей ('ssh-keygen') -config.ssh_minimum_key_size_check=Минимальный размер ключа проверки -config.ssh_minimum_key_sizes=Минимальные размеры ключа +config.ssh.enabled=Включено +config.ssh.domain=Выделенный домен +config.ssh.port=Выделенный порт +config.ssh.root_path=Корневой путь +config.ssh.keygen_path=Путь к ключу +config.ssh.key_test_path=Путь к тестовому ключу +config.ssh.minimum_key_size_check=Проверка минимальной длины ключа +config.ssh.minimum_key_sizes=Минимальные размеры ключа +config.ssh.rewrite_authorized_keys_at_start=Перезаписать "authorized_keys" при запуске +config.ssh.start_builtin_server=Запустить встроенный сервер +config.ssh.listen_host=Прослушиваемый хост +config.ssh.listen_port=Прослушиваемый порт +config.ssh.server_ciphers=Серверные шифры +config.ssh.server_macs=MAC-серверы +config.ssh.server_algorithms=Серверные алгоритмы + +config.repo_config=Настройка репозитория +config.repo.root_path=Корневой путь +config.repo.script_type=Тип скрипта +config.repo.ansi_chatset=ANSI-кодировка +config.repo.force_private=Сделать приватным(и) принудительно +config.repo.max_creation_limit=Максимальный лимит созданий +config.repo.preferred_licenses=Предпочтительные лицензии +config.repo.disable_http_git=Выключить HTTP Git +config.repo.enable_local_path_migration=Включить миграцию с локального пути +config.repo.enable_raw_file_render_mode=Включить режим рендеринга необработанных файлов +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Расширения переноса строки редактора +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Загрузка включена +config.repo.upload.temp_path=Загрузить временный путь +config.repo.upload.allowed_types=Загрузить разрешённые типы +config.repo.upload.file_max_size=Ограничение размера файлов для загрузки +config.repo.upload.max_files=Ограничение файлов для загрузки config.db_config=Конфигурация базы данных -config.db_type=Тип -config.db_host=Хост -config.db_name=Имя -config.db_user=Пользователь -config.db_ssl_mode=Режим SSL -config.db_ssl_mode_helper=(только для «postgres») -config.db_path=Путь -config.db_path_helper=(для "SQLite3" и "TiDB") - -config.service_config=Сервисная конфигурация -config.register_email_confirm=Требуется подтверждение по электронной почте -config.disable_register=Отключить регистрацию -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.webhook_config=Настройка автоматического обновления репозиции -config.queue_length=Длина очереди -config.deliver_timeout=Задержка доставки -config.skip_tls_verify=Пропустить TLS проверка - -config.mailer_config=Настройки почты -config.mailer_enabled=Включено -config.mailer_disable_helo=Отключить HELO -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 -config.oauth_enabled=Включено - -config.cache_config=Настройки кеша -config.cache_adapter=Адаптер кэша -config.cache_interval=Интервал кэширования -config.cache_conn=Подключение кэша +config.db.type=Тип +config.db.host=Сервер +config.db.name=Имя +config.db.schema=Схема +config.db.schema_helper=(только для "postgres") +config.db.user=Пользователь +config.db.ssl_mode=Режим SSL +config.db.ssl_mode_helper=(только для "postgres") +config.db.path=Путь +config.db.path_helper=(только для "sqlite3") +config.db.max_open_conns=Максимальное количество открытых соединений +config.db.max_idle_conns=Максимальное количество свободных соединений + +config.security_config=Конфигурация безопасности +config.security.login_remember_days=Запоминать дни входа +config.security.cookie_remember_name=Запоминать cookie +config.security.cookie_username=Cookie юзернейма +config.security.cookie_secure=Включить безопасные cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Включить файл cookie состояния входа +config.security.login_status_cookie_name=Файл cookie состояния входа +config.security.local_network_allowlist=Список разрешенных локальных сетей + +config.email_config=E-mail настройки +config.email.enabled=Включено +config.email.subject_prefix=Префикс темы +config.email.host=Сервер +config.email.from=Из +config.email.user=Пользователь +config.email.disable_helo=Отключить HELO +config.email.helo_hostname=HELO имя хоста +config.email.skip_verify=Пропустить проверку сертификата +config.email.use_certificate=Использовать собственный сертификат +config.email.cert_file=Файл сертификата +config.email.key_file=Файл ключа +config.email.use_plain_text=Использовать простой текст +config.email.add_plain_text_alt=Добавить альтернативный текст +config.email.send_test_mail=Отправить тестовое письмо +config.email.test_mail_failed=Не удалось отправить тестовое письмо на %s: %v +config.email.test_mail_sent=Тестовое письмо было отправлено на %s + +config.auth_config=Конфигурация аутентификации +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Срок действия кода сброса пароля +config.auth.require_email_confirm=Требовать подтверждение по электронной почте +config.auth.require_sign_in_view=Для просмотра требуется войти +config.auth.disable_registration=Отключить регистрацию +config.auth.enable_registration_captcha=Включить CAPTCHA при регистрации +config.auth.enable_reverse_proxy_authentication=Включить аутентификацию обратного прокси +config.auth.enable_reverse_proxy_auto_registration=Включить авторегистрацию обратного прокси +config.auth.reverse_proxy_authentication_header=Заголовок аутентификации обратного прокси + +config.user_config=Конфигурация пользователя +config.user.enable_email_notify=Включить почтовые уведомления config.session_config=Конфигурация сессии -config.session_provider=Провайдер сессии -config.provider_config=Конфигурация провайдера -config.cookie_name=Имя файла cookie -config.enable_set_cookie=Включить установку cookies -config.gc_interval_time=Интервал работы сборщика мусора -config.session_life_time=Время жизни сессии -config.https_only=Только HTTPS -config.cookie_life_time=Время жизни файла cookie +config.session.provider=Провайдер +config.session.provider_config=Конфигурация провайдера +config.session.cookie_name=Файл cookie +config.session.https_only=Только HTTPS +config.session.gc_interval=GC interval +config.session.max_life_time=Максимальный срок действия +config.session.csrf_cookie_name=CSRF-куки + +config.cache_config=Настройки кеша +config.cache.adapter=Адаптер +config.cache.interval=GC interval +config.cache.host=Хост + +config.http_config=Конфигурация HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Конфигурация вложений +config.attachment.enabled=Включено +config.attachment.path=Путь +config.attachment.allowed_types=Разрешенные типы +config.attachment.max_size=Ограничение размера +config.attachment.max_files=Ограничение файлов + +config.release_config=Конфигурация релиза +config.release.attachment.enabled=Вложения включены +config.release.attachment.allowed_types=Разрешенные типы вложений +config.release.attachment.max_size=Лимит размера вложения +config.release.attachment.max_files=Лимит файлов вложения config.picture_config=Настройка изображения -config.picture_service=Сервис изображений -config.disable_gravatar=Отключить Gravatar -config.enable_federated_avatar=Включить внешние Аватары +config.picture.avatar_upload_path=Путь загрузки пользовательского аватара +config.picture.repo_avatar_upload_path=Путь загрузки аватара в репозитории +config.picture.gravatar_source=Источник Gravatar +config.picture.disable_gravatar=Отключить Gravatar +config.picture.enable_federated_avatar=Включить федеративные аватары + +config.mirror_config=Конфигурация зеркала +config.mirror.default_interval=Интервал по умолчанию + +config.webhook_config=Конфигурация Webhook +config.webhook.types=Типы +config.webhook.deliver_timeout=Таймаут доставки +config.webhook.skip_tls_verify=Пропустить проверку TLS config.git_config=Конфигурация GIT -config.git_disable_diff_highlight=Отключить подсветку синтаксиса Diff -config.git_max_diff_lines=Максимальное количество строк Diff (на файл) -config.git_max_diff_line_characters=Максимальное количество символов Diff (в строке) -config.git_max_diff_files=Максимальное количество Diff-файлов (при показе) -config.git_gc_args=Аргументы GC -config.git_migrate_timeout=Тайм-аут миграции -config.git_mirror_timeout=Время Ожидания Обновления Зеркала -config.git_clone_timeout=Время Ожидания Операции Клонирования -config.git_pull_timeout=Время Ожидания Операции Извлечения -config.git_gc_timeout=Время Ожидания Операции Сборки Мусора +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=Аргументы GC +config.git.migrate_timeout=Таймаут миграции +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Таймаут клонирования +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=Конфигурация LFS +config.lfs.storage=Хранилище +config.lfs.objects_path=Путь к объектам config.log_config=Конфигурация журнала -config.log_mode=Режим журналирования +config.log_file_root_path=Путь до папки с логами +config.log_mode=Режим +config.log_options=Опции monitor.cron=Задачи cron monitor.name=Имя @@ -1159,38 +1385,46 @@ notices.delete_success=Системное уведомление успешно create_repo=создал(а) репозиторий %s rename_repo=переименовал(а) репозиторий из %[1]s на %[3]s commit_repo=запушил(а) %[3]s в %[4]s +compare_commits=Просмотр сравнение для этих %d коммитов +transfer_repo=перенес репозиторий %s в %s create_issue=`открыл(а) задачу %s#%[2]s` close_issue=`закрыл(а) задачу %s#%[2]s` reopen_issue=`возобновил(а) задачу %s#%[2]s` +comment_issue=`прокомментировал(а) вопрос %s#%[2]s` create_pull_request=`создал запрос на слияние %s#%[2]s` close_pull_request=`закрыл запрос на слияние %s#%[2]s` reopen_pull_request=`открыл снова запрос на слияние %s#%[2]s` -comment_issue=`прокомментировал(а) вопрос %s#%[2]s` merge_pull_request=`слил пул реквест %s#%[2]s` -transfer_repo=перенес репозиторий %s в %s +create_branch=создал новую ветку %[3]s в %[4]s +delete_branch=удалил ветку %[2]s в %[3]s push_tag=запушил(а) метку %[2]s в %[3]s -compare_commits=Просмотр сравнение для этих %d коммитов +delete_tag=удален тег %[2]s at %[3]s +fork_repo=склонировать репозиторий в %s +mirror_sync_push=синхронизированные коммиты с %[3]s на %[4]s из зеркала +mirror_sync_create=синхронизированные новые ссылки %[2]s к %[3]s из зеркала +mirror_sync_delete=синхронизированные и удаленные ссылки %[2]s на %[3]s из зеркала [tool] ago=назад from_now=с этого момента now=сейчас 1s=1 секунду %s -1m=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 +seconds=%d секунд %s +minutes=%d минут %s hours=%d часов %s -days=дней %[2]s: %[1]d -weeks=недель %[2]s: %[1]d -months=месяцев %[2]s: %[1]d -years=лет %[2]s: %[1]d +days=%d дней %s +weeks=%d недель %s +months=%d месяцев %s +years=%d лет %s raw_seconds=секунд raw_minutes=минут +raw_hours=ч. [dropzone] default_message=Перетащите файл сюда, или кликните для загрузки. diff --git a/conf/locale/locale_sk-SK.ini b/conf/locale/locale_sk-SK.ini new file mode 100644 index 00000000000..a40f9ffa3b6 --- /dev/null +++ b/conf/locale/locale_sk-SK.ini @@ -0,0 +1,1434 @@ +app_desc=A painless self-hosted Git service + +home=Domovská stránka +dashboard=Nástenka +explore=Prehľadávať +help=Pomoc +sign_in=Prihlásiť sa +sign_out=Odhlásiť sa +sign_up=Zaregistrovať sa +register=Registrovať +website=Web stránka +page=Stránka +template=Šablóna +language=Jazyk +create_new=Vytvoriť... +user_profile_and_more=Profil používateľa a ďalšie +signed_in_as=Prihlásený ako + +username=Používateľské meno +email=E-mail +password=Heslo +re_type=Zadajte znova +captcha=Kontrolný kód + +repository=Repozitár +organization=Organizácia +mirror=Mirror +new_repo=Nový repozitár +new_migrate=Nová migrácia +new_mirror=Nový mirror +new_fork=Nový fork repozitára +new_org=Nová organizácia +manage_org=Spravovať organizácie +admin_panel=Admin Panel +account_settings=Nastavenie účtu +settings=Nastavenia +your_profile=Váš profil +your_settings=Vaše Nastavenia + +activities=Aktivity +pull_requests=Pull Requesty +issues=Issues + +cancel=Zrušiť + +[status] +page_not_found=Page Not Found +internal_server_error=Internal Server Error + +[install] +install=Inštalácia +title=Postup prvotnej inštalácie +docker_helper=Ak spúšťate Gogs pod Docker platformou, prečítajte si prosím pozorne Pokyny skôr, ako zmeníte niečo na tejto stránke! +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). +db_title=Nastavenie databázy +db_type=Typ databázy +host=Host +user=Používateľ +password=Heslo +db_name=Názov databázy +db_schema=Schema +db_helper=Pre MySQL prosím použite INNODB engine so znakovou sadou utf8_general_ci. +ssl_mode=SSL režim +path=Cesta +sqlite_helper=Cesta k súboru databázy SQLite3 alebo TiDB.
Pri spustení ako service, použite prosím absolútnu cestu. +err_empty_db_path=Cesta SQLite3 databázy nemôže byť prázdna. +no_admin_and_disable_registration=Nemôžete zakázať registráciu bez vytvorenia administrátorského účtu. +err_empty_admin_password=Heslo administrátora nemôže byť prázdne. + +general_title=Základné nastavenia aplikácie +app_name=Názov aplikácie +app_name_helper=Tu zadajte obrovským písmom názov vašej organizácie! +repo_path=Koreňový adresár repozitára +repo_path_helper=Do tohto adresára budú uložené všetky vzdialené Git repozitáre. +run_user=Používateľ pre spustenie aplikácie +run_user_helper=Používateľ musí mať prístup ku koreňovému adresáru repozitára a práva pre spustenie Gogs. +domain=Doména +domain_helper=Toto nastavenie ovplyvňuje URL adresy použité pre SSH clone príkaz. +ssh_port=SSH Port +ssh_port_helper=Port ktorý používa váš SSH server. Pre vypnutie SSH funckie ponechajte prázdne. +use_builtin_ssh_server=Použiť vstavaný SSH Server +use_builtin_ssh_server_popup=Spustiť vstavaný SSH server pre git operácie, aby bol rozpoznaný od systémovej SSH služby. +http_port=HTTP Port +http_port_helper=Port na ktorom bude vaśa aplikácia počúvať. +app_url=URL adresa aplikácie +app_url_helper=Toto nastavenie ovplyvňuje URL adresu HTTP/HTTPS clone príkazu a taktiež texty v e-mailoch. +log_root_path=Cesta k log súborom +log_root_path_helper=Adresár pre zápis log súborov. +enable_console_mode=Zapnúť režim konzoly +enable_console_mode_popup=Okrem zápisu do súboru, vytlačiť systémové záznamy aj do konzoly. +default_branch=Default Branch + +optional_title=Nepovinné nastavenia +email_title=Nastavenie e-mailovej služby +smtp_host=SMTP Host +smtp_from=Od +smtp_from_helper=E-mailová adresa odosielateľa, RFC 5322. Môže byť buď zadaná len e-mailová adresa, alebo zápis vo formáte "Name" . +mailer_user=E-mailová adresa odosielateľa +mailer_password=Heslo odosielateľa +register_confirm=Povoliť potvrdenie registrácie +mail_notify=Povoliť e-mailové notifikácie +server_service_title=Nastavenie servra a ostatných služieb +offline_mode=Povoliť offline režim +offline_mode_popup=Zakázať CDN aj v produkčnom režime, všetky súbory budú doručené lokálne. +disable_gravatar=Zakázať službu Gravatar +disable_gravatar_popup=Zakázať službu Gravatar a taktiež vlastné zdroje, všetky použité avatary sú buď nahraté používateľom alebo sú použité štandardné. +federated_avatar_lookup=Povoliť vyhľadávanie ikon užívateľov z verejných zdrojov +federated_avatar_lookup_popup=Povoliť vyhľadávanie ikon užívateľov z verejných zdrojov pre využitie služieb založených na libravatar. +disable_registration=Zakázať samostatnú registráciu +disable_registration_popup=Zakázať samostatnú registráciu používateľov, iba administrátor môže vytvárať kontá. +enable_captcha=Povoliť Captcha +enable_captcha_popup=Vyžaduj Captcha validáciu pri samostatnej registrácii používateľa. +require_sign_in_view=Povoliť vyžiadania prihlásenia pre zobrazenie stránok +require_sign_in_view_popup=Iba prihlásení požívatelia môžu prezerať stránky, navštevníci budú vidieť iba stránky pre prihlásenie a registráciu. +admin_setting_desc=Administrátorský účet si nemusíte vytvoriť teraz, používateľovi s ID=1 budú automaticky pridelené administrátorské práva. +admin_title=Nastavenia administrátorského účtu +admin_name=Používateľské meno +admin_password=Heslo +confirm_password=Potvrdiť heslo +admin_email=E-mail administrátora +install_gogs=Nainštalujte Gogs +test_git_failed=Nepodaril sa test príkazu 'git': %v +sqlite3_not_available=Vaša verzia nepodporuje SQLite3, stiahnite si oficiálnu binárnu verziu z %s, nie gobuild verziu. +invalid_db_setting=Nastavenie databázy nie je správne: %v +invalid_repo_path=Koreňová cesta repozitára je neplatná: %v +run_user_not_match=Používateľ pre spustenie sa nezhoduje s aktuálnym používateľom: %s -> %s +smtp_host_missing_port=V adrese SMTP servera chýba číslo portu. +invalid_smtp_from=Hodnota položky SMTP Od: je nesprávne zadaná: %v +save_config_failed=Chyba pri uložení konfigurácie: %v +init_failed=Nepodarilo sa inicializovať aplikáciu: %v +invalid_admin_setting=Nastavenie administrátorského účtu je neplatné: %v +install_success=Vitajte! Sme radi, že ste si vybrali Gogs, bavte sa a dávajte si pozor. +invalid_log_root_path=Koreňový adresár pre log súbory je neplatný: %v + +[home] +uname_holder=Používateľské meno alebo e-mail +password_holder=Heslo +switch_dashboard_context=Prepnúť kontext nástenky +my_repos=Moje repozitáre +show_more_repos=Zobraziť ďalšie repozitáre... +collaborative_repos=Kolaboratívne repozitáre +my_orgs=Moje organizácie +my_mirrors=Moje mirrory +view_home=Zobraziť %s + +issues.in_your_repos=Vo vašich repozitároch + +[explore] +repos=Repozitáre +users=Používatelia +organizations=Organizácie +search=Hľadať + +[auth] +create_new_account=Vytvoriť nový účet +register_hepler_msg=Máte už účet? Prihláste sa teraz! +social_register_hepler_msg=Máte už účet? Bindovať teraz! +disable_register_prompt=Ospravedlňujeme sa, ale registrácia bola vypnutá. Obráťte sa na administrátora stránky. +disable_register_mail=Ospravedlňujeme sa, potvrdenie registračného e-mailu bolo vypnuté. +auth_source=Zdroj overovania +local=Lokálny +remember_me=Zapamätať prihlásenie +forgot_password=Zabudnuté heslo +forget_password=Zabudli ste heslo? +sign_up_now=Potrebujete účet? Zaregistrujte sa teraz. +confirmation_mail_sent_prompt=Nový potvrdzovací e-mail bol odoslaný na %s, v priebehu %d hodín si prosím skontrolujte vašu schránku pre dokončenie procesu registrácie. +active_your_account=Aktivujte svoj účet +prohibit_login=Prihlásenie zakázané +prohibit_login_desc=Váš účet ma zakázané prihlásenie, prosím kontaktuje správcu webu. +resent_limit_prompt=Ospravedlňujeme sa, ale nedávno ste už požiadali o aktivačný email. Prosím počkajte 3 minúty a potom skúste znova. +has_unconfirmed_mail=Ahoj %s, tvoja e-mailová adresa (%s) je neoverená. Ak si nedostal potvrdzovací email, alebo je potrebné odoslať nový, klikni na tlačidlo nižšie. +resend_mail=Kliknite sem pre znovu odoslanie aktivačného emailu +send_reset_mail=Kliknite sem pre (znovu) odoslanie e-mailu na obnovu hesla +reset_password=Obnovenie hesla +invalid_code=Ospravedlňujeme sa, váš potvrdzovací kód vypršal alebo nie je platný. +reset_password_helper=Kliknite sem pre obnovenie hesla +password_too_short=Dĺžka hesla nemôže byť menej ako 6 znakov. +non_local_account=Miestne účty nemôžu meniť heslá cez Gogs. + +login_two_factor=Dvojfaktorové overenie +login_two_factor_passcode=Prístupový kód overenia +login_two_factor_enter_recovery_code=Zadajte obnovovací kód dvojfaktorového overenia +login_two_factor_recovery=Obnovenie dvojfaktorového overenia +login_two_factor_recovery_code=Obnovovací kód +login_two_factor_enter_passcode=Zadajte prístupový kód dvojfaktorového overenia +login_two_factor_invalid_recovery_code=Obnovovací kód už bol použitý alebo nie je platný. + +[mail] +activate_account=Aktivujte svoj účet prosím +activate_email=Overte svoju e-mail adresu +reset_password=Obnovte si vaše heslo +register_success=Registrácia úspešná, Vitajte +register_notify=Vitajte na palube + +[modal] +yes=Áno +no=Nie +modify=Upraviť + +[form] +UserName=Používateľské meno +RepoName=Názov repozitára +Email=E-mailová adresa +Password=Heslo +Retype=Zadajte heslo znova +SSHTitle=Názov SSH kľúča +HttpsUrl=HTTPS URL +PayloadUrl=Payload URL +TeamName=Názov tímu +AuthName=Názov autorizácie +AdminEmail=E-mail administrátora + +NewBranchName=Názov novej vetvy +CommitSummary=Zhrnutie commitu +CommitMessage=Správa ku commitu +CommitChoice=Potvrďte výber +TreeName=Cesta k súboru +Content=Obsah + +require_error=` nemôže byť prázdne.` +alpha_dash_error=` musí pozostávať z platných alfanumerických znakov alebo pomlčiek(-_).` +alpha_dash_dot_error=` musí pozostávať z platných alfanumerických znakov, pomlčiek(-_) alebo bodiek.` +alpha_dash_dot_slash_error=` musí obsahovať iba písmená, číslice, bodku, čiarku, pomlčku, podtržník a lomené. ` +size_error=` musí byť dĺžky %s.` +min_size_error=` musí obsahovať aspoň %s znakov.` +max_size_error=` musí obsahovať maximálne %s znakov.` +email_error=` nie je platná emailová adresa.` +url_error=nie je platnou URL adresou. +include_error=musí obsahovať podreťazec"%s". +unknown_error=Neznáma chyba: +captcha_incorrect=Captcha overenie sa nezhoduje. +password_not_match=Heslo a potvrdenie hesla nie sú rovnaké. + +username_been_taken=Používateľské meno už bolo použité. +repo_name_been_taken=Názov repozitára už bol použitý. +org_name_been_taken=Názov organizácie už bol použitý. +team_name_been_taken=Názov tímu už bol použitý. +email_been_used=E-mailová adresa už bola použitá. +username_password_incorrect=Používateľské meno alebo heslo nie je správne. +auth_source_mismatch=Vybraný zdroj overenia nieje prepojený s užívateľom. +enterred_invalid_repo_name=Uistite sa prosím, že názov repozitára, ktorý ste zadali je správny. +enterred_invalid_owner_name=Uistite sa prosím, že meno vlastníka, ktoré ste zadali je správne. +enterred_invalid_password=Uistite sa prosím, že heslo ktoré ste zadali je správne. +user_not_exist=Daný používateľ neexistuje. +last_org_owner=Odstránenie posledného používateľa z tímu vlastníkov nie je povolené, vždy musí existovať aspoň jeden vlastník v danej organizácii. + +invalid_ssh_key=Ospravedlňujeme sa, nie sme schopní overiť Váš SSH kľúč: %s +unable_verify_ssh_key=Gogs nemôže overiť Váš SSH kľúč, ale predpokladáme, že je platný, prosím overte si to. +auth_failed=Overenie zlyhalo: %v + +still_own_repo=K Vašemu účtu je stále priradené aspoň jedno úložisko. Musíte ho najprv odstrániť alebo previesť na iný účet. +still_has_org=Váš účet je stále priradený aspoň k jednej organizácii. Musíte najprv zrušiť alebo odstrániť členstvo. +org_still_own_repo=Táto organizácia stále vlastní repozitáre, musíte ich najskôr odstrániť alebo preniesť. + +target_branch_not_exist=Cieľová branch neexistuje. + +[user] +change_avatar=Zmeniť svoj avatar +join_on=Registrovaný +repositories=Repozitáre +activity=Verejné činnosti +followers=Sledujúci +starred=Označené hviezdičkou +following=Sledovaní +follow=Sledovať +unfollow=Prestať sledovať + +form.name_not_allowed=User name or pattern %q is not allowed. + +[settings] +profile=Profil +password=Heslo +avatar=Avatar +ssh_keys=SSH kľúče +security=Bezpečnosť +repos=Repozitáre +orgs=Organizácie +applications=Aplikácie +delete=Odstrániť konto + +public_profile=Verejný profil +profile_desc=Vaša emailová adresa je verejná a bude použitá pre upozornenia vzťahujúce sa k vašemu účtu a akejkoľvek operácii vykonanej pomocou stranky. +password_username_disabled=Zmena užívateľského mena je možná len pre lokálne vytvorených užívateľov. +full_name=Celé meno +website=Web stránka +location=Poloha +update_profile=Zmeniť profil +update_profile_success=Váš profil bol úspešne zmenený. +change_username=Užívateľské meno zmenené +change_username_prompt=Táto zmena bude mať vplyv na spôsob akým sa odkazy vzťahujú na váš účet. +continue=Pokračovať +cancel=Zrušiť + +lookup_avatar_by_mail=Vyhľadávať užívateľskú ikonu podľa emailu +federated_avatar_lookup=Vyhľadanie ikon užívateľov z verejných zdrojov +enable_custom_avatar=Povoliť používateľský avatar +choose_new_avatar=Vybrať nový avatar +update_avatar=Upraviť nastavenia avatara +delete_current_avatar=Odstrániť aktuálny avatar +uploaded_avatar_not_a_image=Nahraný súbor nieje obrázok. +update_avatar_success=Vaše nastavenie avatara bolo úspešne upravené. + +change_password=Zmeniť heslo +old_password=Súčasné heslo +new_password=Nové heslo +retype_new_password=Znova zadajte nové heslo +password_incorrect=Aktuálne heslo nie je správne. +change_password_success=Vaše heslo bolo úspešne zmenené. Teraz sa môžete prihlásiť pomocou nového hesla. +password_change_disabled=Používatelia, ktorý niesú lokálneho typu nemajú povolenú zmenu hesla. + +emails=E-mailové adresy +manage_emails=Spravovať e-mailové adresy +email_desc=Vaša primárna e-mailová adresa bude použitá pre oznámenia a iné operácie. +primary=Primárny +primary_email=Nastaviť ako primárny +delete_email=Odstrániť +email_deletion=Odstránenie e-mailu +email_deletion_desc=Vymazaním tejto emailovej adresy sa odstránia súvisiace informácie z vášho účtu. Chcete pokračovať? +email_deletion_success=Email bol úspešne odstránený! +email_deletion_primary=Cannot delete primary email address. +add_new_email=Pridať novú e-mailovú adresu +add_email=Pridať email +add_email_confirmation_sent=Nový email s potvrdením bol odoslaný na '%s', v priebehu nasledovných '%d' hodín si prosím skontrolujte vašu schránku pre dokončenie procesu potvrdenia. +add_email_success=Vaša nová e-mailová adresa bola úspešne pridaná. + +manage_ssh_keys=Spravovať SSH kľúče +add_key=Pridať kľúč +ssh_desc=Toto je zoznam SSH kľúčov spojených s vaším účtom. Pretože tieto kľúče umožňujú komukoľvek získať prístup k vaším repozitárom, je veľmi dôležité, aby ste ich poznali. +ssh_helper=Neviete ako? Pozrite sa na GitHub návod pre vytvorenie SSH kľúčov alebo vyriešte bežné problémy, na ktoré môžete naraziť pomocou SSH. +add_new_key=Pridať SSH kľúč +ssh_key_been_used=Obsah verejného kľúča sa používa. +ssh_key_name_used=Verejný kľúč s rovnakým názvom už existuje. +key_name=Názov kľúča +key_content=Obsah +add_key_success=Nový SSH kľúč '%s' bol úspešne pridaný! +delete_key=Odstrániť +ssh_key_deletion=Odstránenie SSH kľúča +ssh_key_deletion_desc=Odstránením tohto SSH kľúča sa odstránia všetky súvisiace prístupy k tomuto repozitáru. Chcete pokračovať? +ssh_key_deletion_success=SSH kľúč bol úspešne odstránený! +add_on=Pridané dňa +last_used=Naposledy použité +no_activity=Žiadna nedávna aktivita +key_state_desc=Tento kľúč sa používa posledných 7 dní +token_state_desc=Tento token sa používa posledných 7 dní + +two_factor=Dvojfaktorové overenie +two_factor_status=Stav: +two_factor_on=Zapnuté +two_factor_off=Vypnuté +two_factor_enable=Povolené +two_factor_disable=Zakázané +two_factor_view_recovery_codes=Uložte vaše obnovovacie kódy na bezpečnom mieste. Môžete ich použiť ako prístupové kódy v prípade, keď stratíte prístup k vašej overovacej aplikácii. +two_factor_http=Už nebudete mať možnosť použiť vaše prihlasovacie údaje pre operácie cez HTTP/HTTPS. Prosíme, vytvorte a používajte osobný príspupový token ako vaše prístupové údaje, napr. %[3]s. +two_factor_enable_title=Povoliť dvojfaktorové overovanie +two_factor_scan_qr=Prosím, použite vašu overovaciu aplikáciu pre naskenovanie tohoto obrázku: +two_factor_or_enter_secret=Alebo zadajte tajný kód: +two_factor_then_enter_passcode=Potom zadajte prístupový kód: +two_factor_verify=Overiť +two_factor_invalid_passcode=Zadaný prístupový kód nie je platný, prosím, skúste to znova! +two_factor_reused_passcode=Kód, ktorý ste zadali už bol použitý. Prosím, zkúste iný! +two_factor_enable_error=Povolenie dvojfaktorového overenia zlyhalo: %v +two_factor_enable_success=Dvojfaktorové overenie bolo pre Váš účet povolené! +two_factor_recovery_codes_title=Obnovovacie kódy dvojfaktorového overenia +two_factor_recovery_codes_desc=Obnovovacie kódy sa používajú, keď dočasne stratíte prístup k vašej overovacej aplikácii. Každý obnovovací kód môže byť použitý iba raz, prosím, uchovajte tieto kódy na bezpečnom mieste. +two_factor_regenerate_recovery_codes=Znovu vygenerovať obnovovacie kódy +two_factor_regenerate_recovery_codes_error=Vygenerovanie obnovovacích kódov zlyhalo: %v +two_factor_regenerate_recovery_codes_success=Nové obnovovacie kódy boli vygenerované! +two_factor_disable_title=Zakázať dvojfaktorové overenie +two_factor_disable_desc=Úroveň zabezpečenia Vášho účtu sa s vypnutím dvojfaktorového overenia zníži. Chcete pokračovať? +two_factor_disable_success=Dvojfaktorové overenie bolo zakázané! + +manage_access_token=Spravovať osobné prístupové tokeny +generate_new_token=Vygenerovať nový token +tokens_desc=Tokeny, ktoré ste vygenerovali je možné použiť na prístup ku Gogs API. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. +new_token_desc=Každý token bude mať plný prístup ku vašemu účtu. +token_name=Názov tokenu +generate_token=Vygenerovať token +generate_token_succees=Prístupový token bol úspešne vytvorený! Uistite sa, že si ho skopírujete ihneď, pretože už ho nebudete môcť vidieť znova! +delete_token=Odstrániť +access_token_deletion=Odstránenie osobného prístupového tokenu +access_token_deletion_desc=Zmazaním tohto osobného prístupového tokenu sa zmaže všetok prístup súvisiacej aplikácie. Chcete pokračovať? +delete_token_success=Osobný prístupový token bol úspešne odstránený! Nezabudnite tiež zmeniť nastavenie vašej aplikácie. +token_name_exists=Rola s rovnakým monom už existuje + +orgs.none=Nieste členom žiadnej organizácie. +orgs.leave_title=Opustiť organizáciu +orgs.leave_desc=Opustením organizácie stratíte prístup do všetkých jej repozitárov a k jej týmom. Chcete pokračovať? + +repos.leave=Opustiť +repos.leave_title=Opustiť repozitár +repos.leave_desc=Potom čo opustíte repozitár, stratíte k nemu prístup. Chcete pokračovať? +repos.leave_success=Opustili ste repozitár '%s'! + +delete_account=Odstrániť účet +delete_prompt=Táto operácie permanentne odstráni Váš účet a táto zmena nemôže byť vrátená! +confirm_delete_account=Potvrdenie odstránenia +delete_account_title=Odstránenie účtu +delete_account_desc=Tento účet bude trvalo odstránený. Chcete pokračovať? + +[repo] +owner=Vlastník +repo_name=Názov repozitára +repo_name_helper=Dobrý názov repozitára sa zvyčajne skladá z krátkych, jedinečných a ľahko zapamätateľných kľúčových slov. +visibility=Viditeľnosť +unlisted=Unlisted +visiblity_helper=Tento repozitár je súkromný +unlisted_helper=This repository is Unlisted +visiblity_helper_forced=Správca vynútil na všetkých nových repozitároch, aby boli súkromné +visiblity_fork_helper=(Zmena tejto hodnoty ovplivní všetky repozitáre rozštiepenia) +clone_helper=Potrebujete pomôcť z klonovaním? Navštívte nápovedu! +fork_repo=Forknúť repozitár +fork_from=Forknúť z +fork_visiblity_helper=Nemôžete zmeniť viditeľnosť repozitára rozštiepenia. +repo_desc=Popis +repo_lang=Jazyk +repo_gitignore_helper=Vyberte šablony .gitignore +license=Licencia +license_helper=Vybrať súbor s licenciou +readme=Súbor Readme +readme_helper=Vyberte šablónu súboru README +auto_init=Založiť tento repozitár s vybranými súbormi a šablonou +create_repo=Vytvoriť repozitár +default_branch=Predvolená branch +mirror_prune=Vyčistiť +mirror_prune_desc=Odstrániť odkazy sledovania vzdialených vetví, ktoré už vo vzdialenom repozitári neexistujú +mirror_interval=Interval mirroru (v hodinách) +mirror_address=Adresa zrkadla +mirror_address_desc=Prosím, pridajte do adresy potrebné prihlasovacie údaje. +mirror_last_synced=Naposledy synchronizované +watchers=Pozorovatelia +stargazers=Sledujúci +forks=Forky +repo_description_helper=Popis repozitára. Maximálna dĺžka 512 znakov. +repo_description_length=Dostupné znaky + +form.reach_limit_of_creation=Vlastník dosiahol maximálneho počtu %d vytvorených repozitárov. +form.name_not_allowed=Repository name or pattern %q is not allowed. + +need_auth=Je potrebná autorizácia +migrate_type=Typ migrácie +migrate_type_helper=Tento repozitár bude mirror +migrate_repo=Migrovať repozitár +migrate.clone_address=Clone adresa +migrate.clone_address_desc=Toto nemôže byť HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=Máte povolené preniesť repozitár pomocou lokálnej cesty na serveri. +migrate.permission_denied=Nemáte povolené importovať miestne repozitáre. +migrate.invalid_local_path=Neplatná miestna cesta, buď neexistuje alebo nie je adresárom. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. +migrate.failed=Migrácia zlyhala: %v + +mirror_from=zrkadlo +forked_from=forknuté z +copy_link=Kopírovať +copy_link_success=Skopírované! +copy_link_error=Pre skopírovanie stlačte ⌘-C alebo Ctrl-C +copied=Skopírované OK +unwatch=Odobrať z pozorovaných +watch=Pridať medzi pozorované +unstar=Odstrániť z obľúbených +star=Hviezda +fork=Fork + +no_desc=Žiadny popis +quick_guide=Rýchly sprievodca +clone_this_repo=Klonovať tento repozitár +create_new_repo_command=Vytvoriť nový repozitár v príkazovom riadku +push_exist_repo=Odoslať existujúci repozitár z príkazového riadku +bare_message=Tento repozitár ešte nemá obsah. + +files=Súbory +branch=Branch +tree=Strom +filter_branch_and_tag=Filter branche alebo tagu +branches=Branche +tags=Tagy +issues=Issues +pulls=Pull requesty +labels=Štítky +milestones=Míľniky +commits=Commity +git_branches=Vetvy +releases=Vydania +file_raw=Raw +file_history=História +file_view_raw=Zobraziť Raw +file_permalink=Permanentný odkaz +file_too_large=Tento súbor je príliš veľký na zobrazenie +video_not_supported_in_browser=Váš prehliadač nepodporuje značku pre HTML5 video. + +branches.overview=Prehľad +branches.active_branches=Aktívne vetvy +branches.stale_branches=Zastaralé vetvy +branches.all=Všetky vetvy +branches.updated_by=%[2]s zmenil %[1]s +branches.change_default_branch=Zmeniť základnú vetvu +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=Nový súbor +editor.upload_file=Nahrať súbor +editor.edit_file=Upraviť súbor +editor.preview_changes=Náhľad zmien +editor.cannot_edit_non_text_files=Netextové súbory nie je možné upravovať +editor.edit_this_file=Upraviť tento súbor +editor.must_be_on_a_branch=Musíte mať zvolenú vetvu pre úpravu či návrh zmen tohoto súboru +editor.fork_before_edit=Musíte vykonať rozštiepenie repozitára pred úpravou súboru +editor.delete_this_file=Vymazať tento súbor +editor.must_have_write_access=Musíte mať prístup pre zápis pre robenie alebo navrhovanie zmien tohto súboru +editor.file_delete_success=Súbor '%s' bol úspešne vymazaný! +editor.name_your_file=Pomenujte váš súbor... +editor.filename_help=Pre vloženie adresára jednoducho napíšte meno a pridajte /. Pre odstránenie adresára bežte na začiatok poľa a stlačte backspace. +editor.or=alebo +editor.cancel_lower=zrušiť +editor.commit_changes=Uložiť zmeny do commitu +editor.add_tmpl=Pridať '%s/' +editor.add=Pridať '%s' +editor.update=Aktualizovať "%s" +editor.delete=Vymazať '%s' +editor.commit_message_desc=Pridať dobrovoľný rozšírený popis... +editor.commit_directly_to_this_branch=Zapíšte zmeny revízie priamo do vetvy %s. +editor.create_new_branch=Vytvoriť novú vetvu pre túto revíziu a vytvoriť požiadavku na sťahnutie. +editor.new_branch_name_desc=Nový názov vetvy... +editor.cancel=Zrušiť +editor.filename_cannot_be_empty=Názov súboru nemôže byť prázdny. +editor.branch_already_exists=Vetva '%s' už existuje v repozitári. +editor.directory_is_a_file=Položka '%s' v nadradenej ceste je v tomto repozitári súbor, nie adresár. +editor.file_is_a_symlink=Súbor '%s' je symbolický odkaz a nemôže byť zmenený pomocou webového editora. +editor.filename_is_a_directory=Meno súboru '%s' v tomto repozitári už existuje. +editor.file_editing_no_longer_exists=Súbor '%s' ktorý upravujete, už v tomto repozitári neexistuje. +editor.file_changed_while_editing=Obsah súboru sa zmenil od začiatku úprav. Kliknutím sem zobrazíte, čo sa zmenilo, alebo stlačte znova zapísať zmeny pre prepísanie zmien. +editor.file_already_exists=Súbor '%s' už v tomto repozitári existuje. +editor.no_changes_to_show=Žiadne zmeny k zobrazení. +editor.fail_to_update_file=Vytvorenie alebo zmena súboru '%s' skončila chybou: '%v' +editor.fail_to_delete_file=Vymazanie súboru '%s' skončilo chybou: '%v' +editor.add_subdir=Pridať podadresár... +editor.unable_to_upload_files=Nepodarilo sa nahrať súbor do '%s'. Chyba: %v +editor.upload_files_to_dir=Nahrať súbory do '%s' + +commits.commit_history=História revízii +commits.commits=Commity +commits.search=Vyhľadávanie commitov +commits.find=Nájsť +commits.author=Autor +commits.message=Správa +commits.date=Dátum +commits.older=Staršie +commits.newer=Novšie + +issues.new=Nová issue +issues.new.labels=Štítky +issues.new.no_label=Žiadne štítky +issues.new.clear_labels=Zrušiť štítky +issues.new.milestone=Míľnik +issues.new.no_milestone=Žiadny míľnik +issues.new.clear_milestone=Vyčistiť míľnik +issues.new.open_milestone=Otvorené míľniky +issues.new.closed_milestone=Uzavreté míľniky +issues.new.assignee=Priradený +issues.new.clear_assignee=Odobrať priradeného +issues.new.no_assignee=Žiadny priradený +issues.create=Vytvoriť issue +issues.new_label=Nový štítok +issues.new_label_placeholder=Názov štítku... +issues.create_label=Vytvoriť štítok +issues.label_templates.title=Nahrať preddefinovanú sadu značiek +issues.label_templates.info=Niesu zadané žiadne značky. Pre vytvorenie novej kliknite na tlačítko "Nová značka" alebo použite preddefinovanú sadu. +issues.label_templates.helper=Vyberte sadu značiek +issues.label_templates.use=Použiť túto sadu značiek +issues.label_templates.fail_to_load_file=Nepodarilo sa nahrať súbor šablóny značiek '%s': %v +issues.open_tab=%d Otvorených +issues.close_tab=%d Uzavretých +issues.filter_label=Štítok +issues.filter_label_no_select=Žiadny vybratý štítok +issues.filter_milestone=Míľnik +issues.filter_milestone_no_select=Žiadny vybratý míľnik +issues.filter_assignee=Priradený +issues.filter_assginee_no_select=Žiadny vybraný priradený +issues.filter_type=Typ +issues.filter_type.all_issues=Všetky issues +issues.filter_type.assigned_to_you=Priradené vám +issues.filter_type.created_by_you=Vami vytvorené +issues.filter_type.mentioning_you=Hovorí o Vás +issues.filter_sort=Zoradiť +issues.filter_sort.latest=Najnovšie +issues.filter_sort.oldest=Najstaršie +issues.filter_sort.recentupdate=Nedávno aktualizované +issues.filter_sort.leastupdate=Dávno aktualizované +issues.filter_sort.mostcomment=Najviac komentované +issues.filter_sort.leastcomment=Najmenej komentované +issues.opened_by=otvorené %[1]s užívateľom %[3]s +issues.opened_by_fake=otvorené %[1]s užívateľom %[2]s +issues.previous=Predošlý +issues.next=Ďalšie +issues.open_title=Otvorená +issues.closed_title=Uzavrená +issues.num_comments=%d komentárov +issues.commented_at=`okomentoval %s` +issues.delete_comment_confirm=Ste si istý, že chcete odstrániť tento komentár? +issues.no_content=Zatiaľ neexistuje žiadny obsah. +issues.close_issue=Uzavrieť +issues.close_comment_issue=Pridať komentár a uzavrieť +issues.reopen_issue=Znovu otvoriť +issues.reopen_comment_issue=Okomentovať a znovu otvoriť +issues.create_comment=Komentár +issues.closed_at=`zatvorené %[2]s` +issues.reopened_at=`znovu otvorené %[2]s` +issues.commit_ref_at=`sa odvolal na túto issue z commitu %[2]s` +issues.poster=Autor +issues.collaborator=Spolupracovník +issues.owner=Vlastník +issues.sign_in_require_desc=Prihláste sa pre zapojenie do konverzácie. +issues.edit=Upraviť +issues.cancel=Zrušiť +issues.save=Uložiť +issues.label_title=Názov štítka +issues.label_color=Farba štítka +issues.label_count=%d štítkov +issues.label_open_issues=%d otvorené issues +issues.label_edit=Upraviť +issues.label_delete=Odstrániť +issues.label_modify=Zmena štítka +issues.label_deletion=Odstránenie štítka +issues.label_deletion_desc=Odstránenie tohoto štítka ho odstráni tiež zo všetkých naväzujúcich úloh. Chcete pokračovať? +issues.label_deletion_success=Štítok bol úspešne odstránený! +issues.num_participants=%d účastníkov +issues.attachment.open_tab=`Kliknite pre zobrazenie "%s" v novej záložke` +issues.attachment.download=`Kliknite pre sťahnutie "%s"` + +pulls.new=Nová požiadavka na stiahnutie +pulls.compare_changes=Porovnať zmeny +pulls.compare_changes_desc=Porovnať dve branche a vytvoriť pull request zo zmien. +pulls.compare_base=base +pulls.compare_compare=porovnať +pulls.filter_branch=Filter branche +pulls.no_results=Neboli nájdené žiadne výsledky. +pulls.nothing_to_compare=Nieje čo porovnávať, pretože base and head branche sú totožné. +pulls.nothing_merge_base=Nie je čo porovnať pretože dve vetvy majú úplne odlišnú históriu. +pulls.has_pull_request=`Požiadavka na sťahnutie medzi týmito vetvami už existuje: %[2]s#%[3]d` +pulls.create=Vytvoriť požiadavku na stiahnutie +pulls.title_desc=chce zlúčiť %[1]d revíziu z vetvy %[2]s do vetvy %[3]s +pulls.merged_title_desc=mergnuté %[1]d commitov z %[2]s do %[3]s %[4]s +pulls.tab_conversation=Konverzácia +pulls.tab_commits=Commity +pulls.tab_files=Zmenené súbory +pulls.reopen_to_merge=Pre realizáciu operácie zlúčenia znovu otvorte tento pull request prosím. +pulls.merged=Zlúčené +pulls.has_merged=Tento pull request bol úspešne zlúčený! +pulls.data_broken=Dáta tejto požiadavky na stiahnutie boli narušené z dôvodu zmazania informácie o rozštiepení. +pulls.is_checking=Kontrola rozporov stále pokračuje, prosím obnovte stránku za nejakú dobu. +pulls.can_auto_merge_desc=Tento pull request je možné automaticky zlúčiť. +pulls.cannot_auto_merge_desc=Tento pull request nemôže byť automaticky zlúčený pretože obsahuje konflikty. +pulls.cannot_auto_merge_helper=Prosím zlúčte manuálne pre vyriešenie konfliktov. +pulls.create_merge_commit=Vytvoriť zlúčenú revíziu +pulls.rebase_before_merging=Rebase pred zlúčením +pulls.commit_description=Popis Commitu +pulls.merge_pull_request=Zlúčiť pull request +pulls.open_unmerged_pull_exists=`Nemôžete znovu otvoriť požiadavku na stiahnutie, pretože požiadavka na stiahnutie z rovnakého repozitára s rovnakými informáciami pre zlúčenie už existuje (#%d) a čaká na zlúčenie.` +pulls.delete_branch=Odstrániť vetvu +pulls.delete_branch_has_new_commits=Vetva nemôže byť odstránená, pretože po zlúčení sú v nej nové revízie. + +milestones.new=Nový míľnik +milestones.open_tab=%d Otvorených +milestones.close_tab=%d Uzavretých +milestones.closed=Zatvorený %s +milestones.no_due_date=Bez termínu dokončenia +milestones.open=Otvoriť +milestones.close=Uzavrieť +milestones.new_subheader=Pre organizáciu vašich issues vytvorte míľniky. +milestones.create=Vytvoriť míľnik +milestones.title=Názov +milestones.desc=Popis +milestones.due_date=Termín (volitelný) +milestones.clear=Vyčistiť +milestones.invalid_due_date_format=Formát dátumu termínu je neplatný, musí byť 'rrrr-mm-dd'. +milestones.create_success=Milník '%s' bol vytvorený! +milestones.edit=Upraviť míľnik +milestones.edit_subheader=Pre míľniky použite lepší popis aby neboli ľudia zmätení. +milestones.cancel=Zrušiť +milestones.modify=Upraviť míľnik +milestones.edit_success=Zmeny milníku '%s' boli uložené! +milestones.deletion=Vymazanie míľnika +milestones.deletion_desc=Odstránenie tohto milníka ho odstráni zo všetkých naväzujúcich úloh. Chcete pokračovať? +milestones.deletion_success=Milník bol odstránený! + +wiki=Wiki +wiki.welcome=Vitajte vo Wiki! +wiki.welcome_desc=Wiki je miesto pre vašu spoločnú dokumentáciu projektu a návody ako ho zlepšiť. +wiki.create_first_page=Vytvoriť prvú stránku +wiki.page=Stránka +wiki.filter_page=Filter stránky +wiki.new_page=Vytvoriť novú stránku +wiki.default_commit_message=Napíšte poznámku o tejto úprave (nepovinné). +wiki.save_page=Uložiť stránku +wiki.last_commit_info=%s upravil túto stránku %s +wiki.edit_page_button=Upraviť +wiki.new_page_button=Nová stránka +wiki.delete_page_button=Odstrániť stránku +wiki.delete_page_notice_1=Toto odstráni stránku "%s". Buďte si prosím istí. +wiki.page_already_exists=Stránka Wiki s rovnakým názvom už existuje. +wiki.pages=Stránky +wiki.last_updated=Naposledy zmenené: %s + +settings=Nastavenia +settings.options=Možnosti +settings.collaboration=Spolupráca +settings.collaboration.admin=Admin +settings.collaboration.write=Zápis +settings.collaboration.read=Prečítať +settings.collaboration.undefined=Nedefinované +settings.branches=Vetvy +settings.branches_bare=Nemôžete spravovať vetvy pre holý repozitár. Prosím, odošlite najskôr nejaký obsah. +settings.default_branch=Východzia vetva +settings.default_branch_desc=Východzia vetva je považovaná za "hlavnú" vetvu pre zápisy zmeny revizií, požiadavky na stiahnutie a on-line úpravy. +settings.update=Zmeniť +settings.update_default_branch_unsupported=Zmena východzej vetvy nie je podporovaná verziou Gitu, ktorá je na serveri. +settings.update_default_branch_success=Východzia vetva tohto repozitára bola zmenená! +settings.protected_branches=Chránené vetvy +settings.protected_branches_desc=Ochrana vetví pred vynúteným odoslaním, náhodným odstránením a užívateľmi na schválenom zozname. +settings.choose_a_branch=Vyberte vetvu... +settings.branch_protection=Ochrana vetvý +settings.branch_protection_desc=Prosím vyberte možnosti ochrany vetvy %s. +settings.protect_this_branch=Chrániť túto vetvu +settings.protect_this_branch_desc=Vypnúť vynútené odosielanie a zabrániť odstráneniu. +settings.protect_require_pull_request=Vyžaduje požiadavku na stiahnutie miesto priameho odoslania +settings.protect_require_pull_request_desc=Táto možnosť zakáže priame odosielanie do vetvy. Revízie musia byť odoslané do inej nechránenej vetvy a zlúčené do tejto vetvy pomocou požiadavku na stiahnutie. +settings.protect_whitelist_committers=Zoznam užívateľov, ktorí môžu odosielať do tejto vetvy +settings.protect_whitelist_committers_desc=Pridajte užívateľov a týmy, ktoré majú povolenie odosielať do tejto vetvy. Títo užívatelia môžu obísť kontrolu na požiadavku na stiahnutie. +settings.protect_whitelist_users=Užívatelia, ktorí môžu odosielať do tejto vetvy +settings.protect_whitelist_search_users=Vyhľadať užívateľa +settings.protect_whitelist_teams=Týmy, ktorých členovia môžu odosielať do tejto vetvy +settings.protect_whitelist_search_teams=Vyhľadať týmy +settings.update_protect_branch_success=Možnosti ochrany tejto vetvy boli zmenené! +settings.hooks=Webhooky +settings.githooks=Git hooky +settings.basic_settings=Základné nastavenia +settings.mirror_settings=Nastavenie zrkadla +settings.sync_mirror=Synchronizovať +settings.mirror_sync_in_progress=Synchronizácia zrkadiel prebieha, prosím načítajte znova stránku približne za minútu. +settings.site=Oficiálne stránky +settings.update_settings=Zmeniť nastavenia +settings.change_reponame_prompt=Táto zmena ovplyvní vzťah odkazov k repozitári. +settings.advanced_settings=Pokročilé nastavenia +settings.wiki_desc=Povoliť systém Wiki +settings.use_internal_wiki=Použiť vstavaný systém Wiki +settings.allow_public_wiki_desc=Povoliť verejný prístup k Wiki, ak je repozitár súkromný +settings.use_external_wiki=Používať externú Wiki +settings.external_wiki_url=URL externej Wiki +settings.external_wiki_url_desc=Návštevníci budú po kliknutí na danú záložku presmerovaní na túto URL. +settings.issues_desc=Povoliť systém úloh +settings.use_internal_issue_tracker=Povoliť vstavaný odľahčený systém úloh +settings.allow_public_issues_desc=Povoliť verejný prístup k úlohám, ak sa jedná o súkromný repozitár +settings.use_external_issue_tracker=Použiť externý systém úloh +settings.external_tracker_url=URL externej evidencie úloh +settings.external_tracker_url_desc=Návštevníci budú po kliknutí na danú záložku presmerovaní na túto URL. +settings.tracker_url_format=Formát URL externého systému úloh +settings.tracker_issue_style=Štýl pomenovania úloh v externom systéme úloh: +settings.tracker_issue_style.numeric=Numerická +settings.tracker_issue_style.alphanumeric=Alfanumerické +settings.tracker_url_format_desc=Môžete použiť zástupné výrazy {user} {repo} {index} pre užívateľské meno, názov repozitára a číslo úlohy. +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Ignorovať zmeny v prázdnom priestore +settings.pulls.allow_rebase_merge=Povoliť použitie rebase pre zlúčenie revízií +settings.danger_zone=Riziková zóna +settings.cannot_fork_to_same_owner=Nemôžete rozštiepiť repozitár jeho vlastníkovi. +settings.new_owner_has_same_repo=Nový vlastník už repozitár s rovnakým názvom má. Vyberte, prosím, iné meno. +settings.convert=Previesť na bežný repozitár +settings.convert_desc=Môžete previesť toto zrkadlo na bežný repozitár. Táto zmena nemôže byť vrátená. +settings.convert_notices_1=- Táto operácia prevedie tento zrkadlový repozitár na bežný repozitár a táto zmena nemôže byť vrátená. +settings.convert_confirm=Potvrdiť prevod +settings.convert_succeed=Repozitár bol prevedený na bežný typ. +settings.transfer=Prevod vlastníctva +settings.transfer_desc=Predať tento repozitár inému užívateľovi alebo organizácii, v ktorej ste správca. +settings.transfer_notices_1=- Stratíte prístup, pokiaľ nový vlastník je samostatný užívateľ. +settings.transfer_notices_2=Prístup Vám bude zachovaný, pokiaľ nový vlastník je organizácia a vy ste jedným z vlastníkov. +settings.transfer_form_title=Zadajte prosím nasledujúce informácie pre potvrdenie operácie: +settings.wiki_delete=Zmazať Wiki Data +settings.wiki_delete_desc=Pokiaľ zmažete Wiki data, nebude sa možné vrátiť. Buďte si prosím istý. +settings.wiki_delete_notices_1=- Toto odstráni a vypne Wiki pre %s +settings.wiki_deletion_success=Data Wiki tohoto repozitára boli zmazané. +settings.delete=Odstrániť tento repozitár +settings.delete_desc=Hneď ako odstránite repozitár, nie je možné vrátiť sa späť, Buďte si prosím istý. +settings.delete_notices_1=- Tuto operáciu nie je možné vrátiť. +settings.delete_notices_2=Táto akcia nenávratne vymaže všetko v tomto repozitári, vrátane dát Gitu, úkolov, komentárov a prístupov spolupracovníkov. +settings.delete_notices_fork_1=- Po odstránení sa všetky forky stanú nezávislé. +settings.deletion_success=Repozitár bol odstránený! +settings.update_settings_success=Možnosti repozitára boli zmenené. +settings.transfer_owner=Nový vlastník +settings.make_transfer=Spraviť presun +settings.transfer_succeed=Vlastníctvo repozitára bolo presunuté. +settings.confirm_delete=Potvrdiť odstránenie +settings.add_collaborator=Pridať nového spolupracovníka +settings.add_collaborator_success=Nový spolupracovník bol pridaný. +settings.delete_collaborator=Odstrániť +settings.collaborator_deletion=Odstránenie spolupracovníka +settings.collaborator_deletion_desc=Tento užívateľ po tom, čo bude odstránený, už nebude mať prístup do tohto repozitára pre spoluprácu. Chcete pokračovať? +settings.remove_collaborator_success=Spolupracovník bol odstránený. +settings.search_user_placeholder=Hľadať užívateľa... +settings.org_not_allowed_to_be_collaborator=Nieje dovolené pridať organizáciu ako spolupracovníka. +settings.hooks_desc=Webové háčiky sú podobné základným spúšťačom HTTP, POST udalostí. Kedykoľvek sa niečo stane v Gogs, bude postarané o oznámenie špecifickému cieľovému serveru. Viac o danom sa dozviete v príručke webových háčikov . +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=Pridať webhook +settings.webhook_deletion=Odstrániť webhook +settings.webhook_deletion_desc=Odstránením tohto webového háčika sa odstránia všetky informácie o ňom a tiež história volaní. Chcete pokračovať? +settings.webhook_deletion_success=Webový háčik bol odstránený! +settings.webhook.test_delivery=Test doručiteľnosti +settings.webhook.test_delivery_desc=Odoslať falošnú udalosť doručenia odoslania pre text vašeho nastavenia webových háčikov +settings.webhook.test_delivery_success=Testovací webový háčik bol pridaný do fronty doručenia. Bude to trvať niekoľko sekúnd, než sa ukáže v histórii doručenia. +settings.webhook.redelivery=Znovu doručenie +settings.webhook.redelivery_success=Úloha háčikov '%s' bola znova pridaná do doručovacej fronty. Zaberie to približne pár sekúnd, pokiaľ bude zmenený stav doručenia v histórii. +settings.webhook.request=Požiadavka +settings.webhook.response=Odpoveď +settings.webhook.headers=Hlavičky +settings.webhook.payload=Payload +settings.webhook.body=Telo +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. +settings.githooks_desc=Háčiky Gitu sú spravované Gitom samotným, môžete v zozname nižšie upraviť súbory podporovaných háčikov k prevádzaniu užívateľských operácií. +settings.githook_edit_desc=Pokiaľ je hook neaktívny, zobrazí sa ukážkový obsah. Ponechanie prázdneho obsahu zakáže tento hook. +settings.githook_name=Názov hooku +settings.githook_content=Obsah hooku +settings.update_githook=Zmeniť háčik +settings.add_webhook_desc=Gogs zašle požiadavku typu POST na zadanú URL, spoločne s informáciami o udalosti, ktorá nastala. Môžete tiež špecifikovať, aký dátový formát sa má použiť po spustení daného háčiku (JSON, x-www-form-urlencoded, XML atp.). Viac informacií je v našom Návode na webové háčiky. +settings.payload_url=URL nákladu +settings.content_type=Typ obsahu +settings.secret=Tajný +settings.secret_desc=Tajný kľúč bude odoslaný ako SHA256 HMAC hexadecimálny prehľad nákladu použitím hlavičky X-Gogs-Signature. +settings.slack_username=Užívateľské méno +settings.slack_icon_url=URL ikony +settings.slack_color=Farba +settings.event_desc=Kedy by mal byť tento webový háčik spustený? +settings.event_push_only=Iba pri udalosti odoslanie. +settings.event_send_everything=Potrebujem všetko. +settings.event_choose=Nechaj ma vybrať, čo potrebujem. +settings.event_create=Vytvoriť +settings.event_create_desc=Branch alebo tag bol vytvorený +settings.event_delete=Odstrániť +settings.event_delete_desc=Vetva alebo značka odstránená +settings.event_fork=Rozštiepenie +settings.event_fork_desc=Repozitár rozštiepený +settings.event_push=Push +settings.event_push_desc=Git push do repozitára +settings.event_issues=Úlohy +settings.event_issues_desc=Úloha, ktorá je otvorená, uzavretá, znovuotvorená, zmenená, priradená, nepriradená, má zmenený štítok, odstránený štítok, má priradený milník, nemajúca priradený milník. +settings.event_pull_request=Pull request +settings.event_pull_request_desc=Požiadavka na stiahnutie otvorená, uzavrená, znovuotvorená, zmenená, priradená, nepriradená, zmenený štítok, odstránený štítok, má nastavený štítok, zrušenie nastaveného štítku alebo synchronizovaná. +settings.event_issue_comment=Komentár k úlohe +settings.event_issue_comment_desc=Komentár k úlohe vytvorený, upravený alebo odstránený. +settings.event_release=Vydanie +settings.event_release_desc=Vydanie vystavené v repozitári. +settings.active=Aktívny +settings.active_helper=Podrobnosti vzťahujúce sa k udalosti, ktorá spustila háčik, budú doručené tiež. +settings.add_hook_success=Nový webový háčik bol pridaný. +settings.update_webhook=Zmeniť webový háčik +settings.update_hook_success=Webový háčik bol zmenený. +settings.delete_webhook=Odstrániť webový háčik +settings.recent_deliveries=Nedávne dodávky +settings.hook_type=Typ háčiku +settings.add_slack_hook_desc=Pridať integráciu Slacku do vášho repozitára. +settings.add_discord_hook_desc=Pridať integráciu Discord do vašeho repozitára. +settings.add_dingtalk_hook_desc=Pridať Dingtalk integráciu do vášho repozitára. +settings.slack_token=Token +settings.slack_domain=Doména +settings.slack_channel=Kanál +settings.deploy_keys=Deploy kľúče +settings.deploy_keys_helper=Prichytení pri čine! Ak chcete pridať osobné verejné kľúče, zadajte ich prosím v nastavenie vášho účtu. +settings.add_deploy_key=Pridať deploy kľúč +settings.deploy_key_desc=Deploy kľúče majú iba prístup pre čítanie. Niesú rovnaké ako SSH kľúče účtu. +settings.no_deploy_keys=Zatiaľ ste nepridali žiadne deploy kľúče. +settings.title=Názov +settings.deploy_key_content=Obsah +settings.key_been_used=Obsah deploy kľúča sa používa. +settings.key_name_used=Deploy kľúč s rovnakým názvom už existuje. +settings.add_key_success=Nový deploy kľúč '%s' bol úspešne pridaný! +settings.deploy_key_deletion=Odstrániť deploy kľúč +settings.deploy_key_deletion_desc=Odstránením tohto deploy kľúča sa odstránia všetky súvisiace prístupy k tomuto repozitáru. Chcete pokračovať? +settings.deploy_key_deletion_success=Deploy kľúč bol úspešne odstránený! +settings.description_desc=Popis repozitára. Maximálna dĺžka 512 znakov. +settings.description_length=Dostupné znaky + +diff.browse_source=Prechádzať zdrojové kódy +diff.parent=rodič +diff.commit=commit +diff.data_not_available=Rozdielové dáta nie sú dostupné. +diff.show_diff_stats=Ukázať štatistiku rozdielnych dát +diff.show_split_view=Rozdelené zobrazenie +diff.show_unified_view=Jednotné zobrazenie +diff.stats_desc= %d zmenil súbory, kde vykonal %d pridanie a %d odobranie +diff.bin=BIN +diff.view_file=Zobraziť súbor +diff.file_suppressed=Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký +diff.too_many_files=Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov + +release.releases=Vydania +release.new_release=Nové vydanie +release.draft=Koncept +release.prerelease=Predbežné vydanie +release.edit=upraviť +release.ahead=%d revizií do vetvy %s od tohto vydania +release.source_code=Zdrojový kód +release.new_subheader=Pre iteráciu produktu zverejňujte vydanie. +release.edit_subheader=Detailný log zmien môže pomôcť užívateľom porozumieť, čo bolo vylepšené. +release.tag_name=Názov tagu +release.target=Cieľ +release.tag_helper=Vyberte existujúcu značku alebo vytvorte novú pri vydaní. +release.title=Názov +release.content=Obsah +release.write=Zapísať +release.preview=Náhľad +release.loading=Načítavanie... +release.prerelease_desc=Toto je predbežná verzia +release.prerelease_helper=Zdôrazníme, že toto vydanie nie je hotové pre produkčné nasadenie. +release.cancel=Zrušiť +release.publish=Publikovať vydanie +release.save_draft=Uložiť koncept +release.edit_release=Upraviť vydanie +release.delete_release=Odstrániť toto vydanie +release.deletion=Odstránenie vydania +release.deletion_desc=Odstránením tohto vydania sa tiež odstráni odpovedajúca značka. Chcete pokračovať? +release.deletion_success=Vydanie bolo odstránené! +release.tag_name_already_exist=Vydanie s touto značkou už existuje. +release.tag_name_invalid=Názov značky je neplatný. +release.downloads=Súbory k stiahnutiu + +[org] +org_name_holder=Názov organizácie +org_full_name_holder=Celý názov organizácie +org_name_helper=Skvelé názvy organizácii sú krátke a zapamätovateľné. +create_org=Vytvoriť organizáciu +repo_updated=Zmenené +people=Ľudia +invite_someone=Pozvať niekoho +teams=Tímy +lower_members=členovia +lower_repositories=repozitáre +create_new_team=Vytvoriť nový tím +org_desc=Popis +team_name=Názov tímu +team_desc=Popis +team_name_helper=Tento názov budete používať pri pomenovaní týmu v konverzáciách. +team_desc_helper=Prosím popíšte tento tým +team_permission_desc=Akú úroveň prístupu má mať tento tým? + +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. + +settings=Nastavenia +settings.options=Možnosti +settings.full_name=Celé meno +settings.website=Web stránka +settings.location=Poloha +settings.update_settings=Zmeniť nastavenia +settings.update_setting_success=Nastavenia organizácie boli zmenené. +settings.change_orgname_prompt=Táto zmena ovplivní vzťah odkazov k organizácii. +settings.update_avatar_success=Nastavenie ikony organizácie bolo zmenené. +settings.delete=Odstrániť organizáciu +settings.delete_account=Odstrániť túto organizáciu +settings.delete_prompt=Organizácia bude trvalo odstránená a táto zmena nemôže byť vrátená! +settings.confirm_delete_account=Potvrdenie odstránenia +settings.delete_org_title=Odstránenie organizácie +settings.delete_org_desc=Organizácia bude natrvalo odstránená. Chcete pokračovať? +settings.hooks_desc=Pridajte webové háčiky, ktoré budú spustené nad všetkými repozitármi tejto organizácie. + +members.membership_visibility=Viditeľnosť členstva: +members.public=Verejný +members.public_helper=zmeniť na súkromné +members.private=Súkromný +members.private_helper=zmeniť na verejné +members.member_role=Rola člena: +members.owner=Vlastník +members.member=Člen +members.remove=Odstrániť +members.leave=Opustiť +members.invite_desc=Pridať nového člena do %s: +members.invite_now=Pozvať teraz + +teams.join=Pripojiť sa +teams.leave=Opustiť +teams.read_access=Právo čítania +teams.read_access_helper=Tento tým bude môcť prehliadať a klonovať repozitáre. +teams.write_access=Právo na zápis +teams.write_access_helper=Tento tým bude schopný čítať svoje repozitáre a odosielať do nich. +teams.admin_access=Administrátorský prístup +teams.admin_access_helper=Tento tým bude schopný odoslať a stiahnuť zmeny do svojich repozitárov, rovnako tak pridať k týmto repozitárom ďalších spolupracovníkov. +teams.no_desc=Tento tím nemá žiadny popis +teams.settings=Nastavenia +teams.owners_permission_desc=Vlastníci majú plný prístup do všetkých repozitárov a majú správcovské práva tejto organizácie. +teams.members=Členovia tímu +teams.update_settings=Zmeniť nastavenia +teams.delete_team=Odstrániť tento tím +teams.add_team_member=Pridať člena tímu +teams.delete_team_title=Odstránenie tímu +teams.delete_team_desc=Keďže bude tento tým odstránený, jeho členovia môžu stratiť prístup do niektorých repozitárov. Chcete pokračovať? +teams.delete_team_success=Daný tým bol odstránený. +teams.read_permission_desc=Členstvo v tomto týme poskytuje právo čítania: členovia môžu čítať a vytvárať klony repozitárov týmu. +teams.write_permission_desc=Členstvo v tomto týme poskytuje právo zápisu: členovia môžu čítať a odosielať do repozitárov týmu. +teams.admin_permission_desc=Členstvo v tomto týme poskytuje právo správcu: členovia môžu čítať, odosielať do a pridávať spolupracovníkov do repozitárov týmu. +teams.repositories=Repozitáre týmu +teams.search_repo_placeholder=Hľadať repozitár... +teams.add_team_repository=Pridať tímový repozitár +teams.remove_repo=Odstrániť +teams.add_nonexistent_repo=Repozitár, ktorý sa snažíte pridať, neexistuje. Najskôr ho vytvorte prosím. + +[admin] +dashboard=Nástenka +users=Používatelia +organizations=Organizácie +repositories=Repozitáre +authentication=Overenia +config=Konfigurácia +notices=Systémové oznámenia +monitor=Monitoring +first_page=Prvý +last_page=Posledný +total=Celkom: %d + +dashboard.build_info=Informácie o zostavení +dashboard.app_ver=Verzia aplikácie +dashboard.git_version=Git verzia +dashboard.go_version=Go verzia +dashboard.build_time=Čas zostavenia +dashboard.build_commit=Commit zostavenia +dashboard.statistic=Štatistika +dashboard.operations=Operácie +dashboard.system_status=Monitor stavu systému +dashboard.statistic_info=Gogs databáza obsahuje %d používateľov, %d organizácií, %d verejných kľúčov, %d repozitárov, %d sledovaní, %d hviezd, %d akcií, %d prístupov, %d issues, %d komentárov, %d sociálnych účtov, %d nasledovaní, %d mirrorov, %d vydaní, %d zdrojov prihlásení, %d webhookov, %d míľnikov, %d štítkov, %d hook úloh, %d tímov, %d aktualizačných úloh, %d príloh. +dashboard.operation_name=Názov operácie +dashboard.operation_switch=Prepnúť +dashboard.select_operation_to_run=Please select operation to run +dashboard.operation_run=Spustiť +dashboard.clean_unbind_oauth=Odstráň nenaviazané OAuth tokeny +dashboard.clean_unbind_oauth_success=Všetky nenaviazané OAuth tokeny boli úspešne odstránené. +dashboard.delete_inactivate_accounts=Odstrániť všetky neaktívne účty +dashboard.delete_inactivate_accounts_success=Všetky neaktívne účty boli odstránené. +dashboard.delete_repo_archives=Odstrániť všetky archívy repozitárov +dashboard.delete_repo_archives_success=Všetky archívy repozitárov boli odstránené. +dashboard.delete_missing_repos=Odstrániť všetky záznamy repozitárov, ktoré stratili súbory Gitu +dashboard.delete_missing_repos_success=Všetky repozitári, ktoré stratili súbory Gitu, boli odstránené. +dashboard.git_gc_repos=Vykonať čistenie GC nad repozitármi +dashboard.git_gc_repos_success=Čistenie GC nad všetkými repozitármi bolo vykonané. +dashboard.resync_all_sshkeys=Prepísať súbor '.ssh/authorized_keys' (upozornenie: kľúče ktoré nevznikli v Gogs budú stratené) +dashboard.resync_all_sshkeys_success=Všetky verejné kľúče boli prepísané. +dashboard.resync_all_hooks=Zosynchronizovať háčiky pred-získané, zmeny a po-získaní pre všetky repozitáre +dashboard.resync_all_hooks_success=Všetky háčiky repozitára pre pred-získanie, zmenu a po-získanie boli zosynchronizované. +dashboard.reinit_missing_repos=Znovu inicializovať záznamy všetkých repozitárov, ktoré stratili súbory Gitu +dashboard.reinit_missing_repos_success=Záznamy všetkých repozitárov, ktoré stratili súbory Gitu, boli znova inicializované. + +dashboard.server_uptime=Doba prevádzky servera +dashboard.current_goroutine=Aktuálne Goroutines +dashboard.current_memory_usage=Aktuálne využitie pamäti +dashboard.total_memory_allocated=Pridelené pamäti celkom +dashboard.memory_obtained=Celkom získanej pamäti +dashboard.pointer_lookup_times=Časy vyhľadávaní ukazáteľov +dashboard.memory_allocate_times=Časy pridelenia pamäte +dashboard.memory_free_times=Časy uvoľnenia pamäte +dashboard.current_heap_usage=Aktuálne využitie pamäti zásobníka +dashboard.heap_memory_obtained=Získaná pamäť zásobníka +dashboard.heap_memory_idle=Nečinná pamäť zásobníka +dashboard.heap_memory_in_use=Používaná pamäť zásobníka +dashboard.heap_memory_released=Uvoľnená pamäť zásobníka +dashboard.heap_objects=Objekty zásobníka +dashboard.bootstrap_stack_usage=Využitie zásobníka prvotného zavedenia +dashboard.stack_memory_obtained=Celkom získanej pamäte zásobníka +dashboard.mspan_structures_usage=Použitie štruktúr MSpan +dashboard.mspan_structures_obtained=Získané štruktúry MSpan +dashboard.mcache_structures_usage=Použitie štruktúr MCache +dashboard.mcache_structures_obtained=Získané štruktúry MCache +dashboard.profiling_bucket_hash_table_obtained=Získaná analytická tabuľka +dashboard.gc_metadata_obtained=Získané metadata GC +dashboard.other_system_allocation_obtained=Získaná alokácia ostatných systémových prostriedkov +dashboard.next_gc_recycle=Ďaľšia GC recycle +dashboard.last_gc_time=Čas od poslednej GC +dashboard.total_gc_time=GC pauzy celkom +dashboard.total_gc_pause=GC pauzy celkom +dashboard.last_gc_pause=Posledná GC pauza +dashboard.gc_times=Počet GC + +users.user_manage_panel=Panel správy užívateľov +users.new_account=Vytvoriť nový účet +users.name=Názov +users.activated=Aktivovaný +users.admin=Admin +users.repos=Repozitáre +users.created=Vytvorené +users.send_register_notify=Poslať upozornenie na registráciu úžívateľovi +users.new_success=Nový účet '%s' bol vytvorený. +users.edit=Upraviť +users.auth_source=Zdroj overovania +users.local=Miestny +users.auth_login_name=Prihlasovacie meno spôsobu overenia +users.password_helper=Nechajte prázdne, pokiaľ sa nemá zmeniť. +users.update_profile_success=Profil účtu bol zmenený. +users.edit_account=Upraviť účet +users.max_repo_creation=Limit pre maximálny počet vytvorených repozitárov +users.max_repo_creation_desc=(Nastavte na -1 pre použitie východzieho systémového limitu) +users.is_activated=Tento účet je aktivovaný +users.prohibit_login=Tento účet má zakázané prihlásenie +users.is_admin=Tento účet má správcovské právo +users.allow_git_hook=Tento účet má právo vytvárať háčiky Gitu +users.allow_import_local=Tento účet ma právo importovať miestne repozitáre +users.update_profile=Zmeniť profil účtu +users.delete_account=Zmazať tento účet +users.still_own_repo=Tento účet je stále vlastníkom najmenej jedného repozitára, je potrebné repozitár najskôr odstrániť alebo predať. +users.still_has_org=Tento účet je členom minimálne jednej organizácie, musíte najskôr dané organizácie opustiť alebo ich odstrániť. +users.deletion_success=Účet bol úspešne odstránený! + +orgs.org_manage_panel=Panel správy organizácii +orgs.name=Názov +orgs.teams=Tímy +orgs.members=Členovia + +repos.repo_manage_panel=Panel správy repozitárov +repos.owner=Vlastník +repos.name=Názov +repos.private=Súkromný +repos.watches=Pozorované +repos.stars=Hviezdy +repos.issues=Issues +repos.size=Veľkosť + +auths.auth_sources=Zdroje overenia +auths.new=Pridať nový zdroj +auths.name=Názov +auths.type=Typ +auths.enabled=Povolené +auths.default=Predvolený +auths.updated=Aktualizované +auths.auth_type=Typ overenia +auths.auth_name=Názov overenia +auths.security_protocol=Protokol zabezpečenia +auths.domain=Doména +auths.host=Host +auths.port=Port +auths.bind_dn=Bind DN +auths.bind_dn_helper=Môžete použiť '%s' ako miesto pre užívateľské meno, napr. DOM\%s +auths.bind_password=Heslo pripojenia +auths.bind_password_helper=Upozornenie: Toto heslo je ukladané nešifrovane. Nepoužívajte pre správcovské účty. +auths.user_base=Východzie miesto hľadania úživateľov +auths.user_dn=DN užívateľa +auths.attribute_username=Užívateľský atribút +auths.attribute_username_placeholder=Nechajte toto pole prázdne pre použitie hodnoty poľa užívateľského mena z prihlasovacieho formulára. +auths.attribute_name=Atribút krstného mena +auths.attribute_surname=Atribút priezviska +auths.attribute_mail=Atribút e-mailovej adresy +auths.verify_group_membership=Overovať členstvo v skupine +auths.group_search_base_dn=Základné DN pre vyhľadávanie skupín +auths.group_filter=Skupinový filter +auths.group_attribute_contain_user_list=Skupinový atribút, ktorý obsahuje zoznam úživateľov +auths.user_attribute_listed_in_group=Atribút užívateľa (v skupine) +auths.attributes_in_bind=Vyzdvihnúť atribúty v kontexte Bind DN +auths.filter=Užívateľský filter +auths.admin_filter=Správcovský filter +auths.ms_ad_sa=Ms Ad SA +auths.smtp_auth=Typ overenia SMTP +auths.smtphost=SMTP Host +auths.smtpport=SMTP Port +auths.allowed_domains=Povolené domény +auths.allowed_domains_helper=Nechajte prázdne, pokiaľ nechcete obmedziť akékoľvek domény. Domény musia byť od seba oddelené čiarkou ','. +auths.enable_tls=Povoliť šifrovanie TLS +auths.skip_tls_verify=Preskočiť overenie TLS +auths.pam_service_name=Názov služby PAM +auths.enable_auto_register=Povoliť auto registráciu +auths.edit=Upraviť nastavenie overovania +auths.activated=Tento spôsob overovania je aktívny +auths.default_auth=Toto overenie je východzí zdroj prihlásenia +auths.new_success=Nový spôsob overovania '%s' bol pridaný. +auths.update_success=Nastavenie overovania bolo zmenené. +auths.update=Zmeniť nastavenie overovania +auths.delete=Odstrániť tento spôsob overovania +auths.delete_auth_title=Odstránenie spôsobu overovania +auths.delete_auth_desc=Tento spôsob overovania bude odstránený, chcete pokračovať? +auths.still_in_used=Tento spôsob overovania je stále používaný niektorými užívateľmi. Prosím, najskôr zmeňte u týchto užívateľov typ overenia na iný. +auths.deletion_success=Spôsob overovania bol odstránený! +auths.login_source_exist=Zdroj prihlásenia '%s' už existuje. +auths.github_api_endpoint=Koncový bod API + +config.not_set=(nezadané) +config.server_config=Konfigurácia servera +config.brand_name=Názov značky +config.run_user=Používateľ pre spustenie aplikácie +config.run_mode=Režim spúšťania +config.server.external_url=Externé URL +config.server.domain=Doména +config.server.protocol=Protokol +config.server.http_addr=HTTP adresa +config.server.http_port=HTTP port +config.server.cert_file=Súbor certifikátu +config.server.key_file=Súbor kľúča +config.server.tls_min_version=Minimálna verzia TLS +config.server.unix_socket_permission=Oprávnenie Unix socketu +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Povoliť Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL + +config.ssh_config=Nastavenie SSH +config.ssh.enabled=Povolené +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Nastavenie repozitára +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Povoliť migráciu z miestnej cesty +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit + +config.db_config=Konfigurácia databázy +config.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Povolené +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Povoliť e-mailové notifikácie + +config.session_config=Nastavenie session +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie + +config.cache_config=Konfigurácia cache +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP konfigurácia +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Povolené +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit + +config.picture_config=Nastavenie ikony užívateľa +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Nastavenie webových háčikov +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Konfigurácia Gitu +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path + +config.log_config=Nastavenie systémových záznamov +config.log_file_root_path=Koreňový adresár súboru systémových záznamov +config.log_mode=Režim +config.log_options=Možnosti + +monitor.cron=Cron úlohy +monitor.name=Názov +monitor.schedule=Rozvrh +monitor.next=Nabudúce +monitor.previous=Predchádzajúci čas +monitor.execute_times=Doby vykonávania +monitor.process=Spustené procesy +monitor.desc=Popis +monitor.start=Čas štartu +monitor.execute_time=Doba vykonávania + +notices.system_notice_list=Systémové oznámenia +notices.view_detail_header=Zobraziť detail oznámenia +notices.actions=Akcie +notices.select_all=Vybrať všetko +notices.deselect_all=Zrušiť výber všetkých +notices.inverse_selection=Prevrátiť výber +notices.delete_selected=Odstrániť vybrané +notices.delete_all=Odstrániť všetky oznámenia +notices.type=Typ +notices.type_1=Repozitár +notices.desc=Popis +notices.op=Op. +notices.delete_success=Systémové upozornenia boli odstránené. + +[action] +create_repo=vytvoril repozitár %s +rename_repo=premenoval repozitár z %[1]s na %[3]s +commit_repo=odoslal do vetvy %[3]s v repositáři %[4]s +compare_commits=Zobraziť porovnanie týchto %d commitov +transfer_repo=predal repozitár %s užívateľovi/organizácii %s +create_issue=`vytvoril úlohu %s#%[2]s` +close_issue=`uzatvoril úlohu %s#%[2]s` +reopen_issue=`znovuotvoril úlohu %s#%[2]s` +comment_issue=`okomentoval úlohu %s#%[2]s` +create_pull_request=`vytvoril požiadavku na stiahnutie %s#%[2]s` +close_pull_request=`zatvoril požiadavku na stiahnutie %s#%[2]s` +reopen_pull_request=`znovuotvoril požiadavku na stiahnutie %s#%[2]s` +merge_pull_request=`zlúčil požiadavku na stiahnutie %s#%[2]s` +create_branch=vytvoril novú vetvu %[3]s v %[4]s +delete_branch=odstránil vetvu %[2]s v %[3]s +push_tag=odoslal značku %[2]s do repozitára %[3]s +delete_tag=odstránená značka %[2]s v %[3]s +fork_repo=rozštiepil repozitár do %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror + +[tool] +ago=pred +from_now=od tejto chvíle +now=teraz +1s=1 sekunda %s +1m=1 minúta %s +1h=1 hodinu %s +1d=1 deň %s +1w=1 týždeň %s +1mon=1 mesiac %s +1y=1 rok %s +seconds=%d sekúnd %s +minutes=%d minút %s +hours=%d hodín %s +days=%d dní %s +weeks=%d týždňov %s +months=%d mesiacov %s +years=%d rokov %s +raw_seconds=sekúnd +raw_minutes=minút +raw_hours=hours + +[dropzone] +default_message=Pretiahnite súbory sem alebo stlačte Nahrať. +invalid_input_type=Nie je možné nahrať súbory tohoto typu. +file_too_big=Veľkosť súboru ({{filesize}} MB) je vyššia než maximálna veľkosť ({{maxFilesize}} MB). +remove_file=Odstrániť súbor + diff --git a/conf/locale/locale_sr-SP.ini b/conf/locale/locale_sr-SP.ini index ee65a4865f0..1d4f6153792 100644 --- a/conf/locale/locale_sr-SP.ini +++ b/conf/locale/locale_sr-SP.ini @@ -4,12 +4,11 @@ home=Почетна dashboard=Контролни панел explore=Преглед help=Помоћ -sign_in=Пријавите Се +sign_in=Пријавите се sign_out=Одјава sign_up=Регистрација register=Регистрација website=Веб-страница -version=Верзија page=Страница template=Шаблон language=Језик @@ -44,23 +43,27 @@ issues=Дискусије cancel=Откажи +[status] +page_not_found=Page Not Found +internal_server_error=Internal Server Error + [install] install=Инсталација title=Инсталационе кораке за првог покретања docker_helper=Ако покрећете Gogs унутар Docker, молимо прочитајте ове савете пажљиво пре него што сте било шта променили на овој страници! -requite_db_desc=Gogs-у је потребно MySQL, PostgreSQL, SQLite3 или TiDB. +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title=Подешавања базе db_type=Тип базе података -host=Хост +host=Домаћин user=Корисник password=Лозинка -db_name=Име базе података +db_name=Назив базе података +db_schema=Schema 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 не може садржати симболе "." и "-". +sqlite_helper=Пут датотеке за базу података SQLite3.
Молимо користите апсолутни пут када покренете као сервис. +err_empty_db_path=Пут базе података SQLite3 не може да буде празан. no_admin_and_disable_registration=Ви не можете онемогућити регистрацију до стварања налог администратора. err_empty_admin_password=Лозинка администратора не може бити празна. @@ -75,12 +78,17 @@ domain=Домен domain_helper=Утиче на URL адресе клониране преко SSH. ssh_port=SSH порт ssh_port_helper=Број порта који користи SSH сервер. Оставите празно да бисте онемогућили SSH. +use_builtin_ssh_server=Користите уграђени SSH Сервер +use_builtin_ssh_server_popup=Покрени уграђени SSH сервер за Git операције да их разликовати од система SSH daemon. http_port=Порт HTTP http_port_helper=Број порта преко којој ће апликација слушати. app_url=URL адреса апликације app_url_helper=Ова поставка утиче на URL за клонирање преко HTTP/HTTPS протокола и на адресама е-поште. log_root_path=Пут до журнала log_root_path_helper=Директоријум где ће бити снимане датотеке журнала. +enable_console_mode=Омогући конзол начин +enable_console_mode_popup=Поред начин датотеке, пошаљи системске извештаје и конзолу. +default_branch=Default Branch optional_title=Напредна подешавања email_title=Подешавања сервиса е-поште @@ -116,7 +124,10 @@ sqlite3_not_available=Ваша верзија не подржава SQLite3, м invalid_db_setting=Подешавања базе података су неправилна: %v invalid_repo_path=Пут до корена спремишта не неправилно: %v run_user_not_match=Тренутни корисник није корисник за покретање: %s -> %s +smtp_host_missing_port=У адресу SMTP сервера недостаје порт. +invalid_smtp_from=Поље SMTP From није важећи: %v save_config_failed=Није могуће сачувати конфигурацију: %v +init_failed=Failed to initialize application: %v invalid_admin_setting=Подешавањна администратора су неправилна: %v install_success=Добродошли! Ми смо срећни што сте изабрали Gogs. invalid_log_root_path=Пут до корена журнала је неправилан: %v @@ -137,6 +148,7 @@ issues.in_your_repos=У вашим спремиштима [explore] repos=Спремишта users=Корисници +organizations=Организације search=Претрага [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Већ имате налог? Пријавите се! social_register_hepler_msg=Већ имате налог? Повежите се преко социалне мреже! disable_register_prompt=Извините регистрација је онемогућено. Молимо вас, контактирајте администратора. disable_register_mail=Извините, потврда путем поште је онемогућено. +auth_source=Извор аутентикације +local=Локално remember_me=Запамти ме forgot_password=Заборављена лозинка forget_password=Заборавили сте лозинку? @@ -156,7 +170,6 @@ prohibit_login_desc=Улаз у ваш налог је забрањено, мо resent_limit_prompt=Извините, већ сте недавно тражили активацију путем е-поште. Молимо вас, сачекајте 3 минута и покушајте поново. has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (%s). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме. resend_mail=Кликните овде да поново пошаљете писмо -email_not_associate=Ова адреса е-поште није повезана ни са једним налогом. send_reset_mail=Кликните овде да (поново) пошаљете поруку како би променили лозинку reset_password=Ресет лозинке invalid_code=Извините, ваш код за потврду је истекао или није валидан. @@ -164,6 +177,14 @@ reset_password_helper=Кликните овде да ресетујете ваш password_too_short=Лозинка неможе бити краћа од 6 карактера. non_local_account=Нелокални налози не могу да промените лозинку преко Gogs. +login_two_factor=Двострука аутентификација +login_two_factor_passcode=Шифра аутентификације +login_two_factor_enter_recovery_code=Унеси двоструку шифру за опоравак +login_two_factor_recovery=Двоструки опоравак +login_two_factor_recovery_code=Шифра за опоравак +login_two_factor_enter_passcode=Унеси двоструку шифру +login_two_factor_invalid_recovery_code=Шифра за опоравак је већ била коришћена или није више важећа. + [mail] activate_account=Молимо вас активирајте ваш налог activate_email=Потврдите вашу адресу е-поште @@ -183,7 +204,7 @@ Email=Адреса ел. поште Password=Лозинка Retype=Поновите лозинку SSHTitle=Име SSH кључа -HttpsUrl=HTTPS URL адреса +HttpsUrl=HTTPS URL PayloadUrl=URL адреса за слање TeamName=Име тима AuthName=Ауторизацијско име @@ -199,6 +220,7 @@ Content=Садржај require_error=` не може бити празно.` alpha_dash_error=` мора се састојати словима, бројевима или dash(-_) карактера.` alpha_dash_dot_error=` мора се састојати словима, бројевима, dash(-_) карактера, или тачком.` +alpha_dash_dot_slash_error=` мора да буде слово, број, црта или тачка.` size_error=` мора бити величине %s.` min_size_error=` мора да садржи најмање %s карактера.` max_size_error=` мора да садржи највише %s карактера.` @@ -215,6 +237,7 @@ org_name_been_taken=Име организације је већ заузето. team_name_been_taken=Име екипе је већ заузето. email_been_used=Адреса е-поште се већ користи. username_password_incorrect=Корисничко име или лозинка није исправна. +auth_source_mismatch=Изабрани извор потврде идентитета није повезан са корисником. enterred_invalid_repo_name=Молимо вас, проверите да је име спремишта тачно унешено. enterred_invalid_owner_name=Молимо вас проверите да сте добро унели име власника. enterred_invalid_password=Молимо вас проверите да сте добро унели лозинку. @@ -242,24 +265,23 @@ following=Пратим follow=Прати unfollow=Престани да пратиш -form.name_reserved=Корисничко име '%s' је резервирано. -form.name_pattern_not_allowed=Корисничко име ликом '%s' није дозвољено. +form.name_not_allowed=User name or pattern %q is not allowed. [settings] profile=Профил password=Лозинка avatar=Аватар ssh_keys=SSH Кључеви -social=Налози на друштвеним мрежама -applications=Апликације +security=Безбедност +repos=Спремишта orgs=Организације -delete=Уклоните налог -uid=Uid +applications=Апликације +delete=Уклоните Hалог public_profile=Јавни профил profile_desc=Ваша адреса е-поште је јавна и коришће се за све обавести везане са налогом, као и друге операције почињене кроз Gogs. password_username_disabled=Нелокални корисници не могу да промене своје кориничко име. -full_name=Име и презиме +full_name=Пуно Име website=Веб страница location=Локација update_profile=Ажурирај профил @@ -286,7 +308,7 @@ password_incorrect=Тренутна лозинка је нетачна. change_password_success=Лозинка је успешно промењена. Можете се пријавити са новом лозинком. password_change_disabled=Нелокални корисници не могу да промене своје лозинке. -emails=Адреса ел. поште +emails=Адреса е-поште manage_emails=Управљање адресама е-поште email_desc=Ваша главна адреса ће се користити за обавештења и других операција. primary=Главно @@ -295,6 +317,7 @@ delete_email=Уклони email_deletion=Брисање адресе е-поште email_deletion_desc=Брисање ове адресе ће довести до уклањања података. Да ли желите да наставите? email_deletion_success=Адреса је успешно избрисана! +email_deletion_primary=Cannot delete primary email address. add_new_email=Додај нови адресу е-поште add_email=Додај адресу add_email_confirmation_sent=Послан је нова потврда на '%s', молимо вас проверите ваше поруке унутар %d сата да бисте завршили поступак потврде. @@ -320,14 +343,36 @@ no_activity=Нема недавних активности key_state_desc=Овај кључ је коришћен у задњих 7 дана token_state_desc=Токен је коришћен у задњих 7 дана -manage_social=Управљање прикључених друштвеним мрежама -social_desc=Ово је списак повезаних друштвених мрежа. Уклоните све непознате. -unbind=Обвежи -unbind_success=Друштвена мрежа је обвежена. +two_factor=Двострука аутентификација +two_factor_status=Стање: +two_factor_on=Укључено +two_factor_off=Искључено +two_factor_enable=Омогући +two_factor_disable=Онемогући +two_factor_view_recovery_codes=Гледајте и сачувајте ваше шифре за опоравак на сигурном месту. Можете да их користите у случају да изгубите приступ до апликације за аутентификацију. +two_factor_http=За HTTP/HTTPS операције, нећете виће моћи да користите корисничко име и лозинку. Молим вас да креирате и користите лични приступни токен као ваш акредитив, на пример %[3]s. +two_factor_enable_title=Омогући двострука аутентификација +two_factor_scan_qr=Молим вас користите вашу апликацију за аутентификацију за скенирање слику: +two_factor_or_enter_secret=Или унесите тајну шифру: +two_factor_then_enter_passcode=Па унесите шифру: +two_factor_verify=Проверити +two_factor_invalid_passcode=Шифрa коју сте унели није важећа, молим бас пробајте поново! +two_factor_reused_passcode=Љифром који сте унијели се већ користи, молим те пробај опет! +two_factor_enable_error=Активација двоструке аутентификације није успела: %v +two_factor_enable_success=Двострука аутентификација је успешно активирана за ваш налог! +two_factor_recovery_codes_title=Шифра за опоравак за двоструку аутентификацију +two_factor_recovery_codes_desc=Шифре за опоравак требају када привремено изгубите приступ до апликације за аутентификацију. Свака шифра за опоравак може да се користи само једном, молим вас да сачувате те шифре на сигурном месту. +two_factor_regenerate_recovery_codes=Обновите шифре за опоравак +two_factor_regenerate_recovery_codes_error=Обнова шифри за опоравак није успела: %v +two_factor_regenerate_recovery_codes_success=Нове шифре за опоравак су успешно креиране! +two_factor_disable_title=Онемогући двоструку аутентификацију +two_factor_disable_desc=Ниво безбедности вашег налога биће ниже пошто сте онемогућили двоструку аутентификацију. Да ли желите да наставите? +two_factor_disable_success=Двострука аутентификација је успешно искључена! manage_access_token=Управљање токенима особном приступу generate_new_token=Генериши нови токен tokens_desc=Tокени се могу користити за приступ на API за Gogs. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=Сваки API токен ће имати пун приступ вашем налогу. token_name=Име токена generate_token=Генериши токен @@ -336,6 +381,16 @@ delete_token=Уклони access_token_deletion=Уклоњење токена личног приступа access_token_deletion_desc=Уклоњење овог токена ће онемогућити сав приступ. Да ли желите да наставите? delete_token_success=Лични токен је успешно избришен! Не заборавите да ажурирате апликацију. +token_name_exists=Token with same name already exists. + +orgs.none=Нисте члан било које организације. +orgs.leave_title=Напусти организацију +orgs.leave_desc=Изгубићете приступ до свих спремишта и тимова после одласка из организације. Да ли желите да наставите? + +repos.leave=Изаћи +repos.leave_title=Напусти српемиште +repos.leave_desc=Изгубићете приступ до спремишта после одласка. Да ли желите да наставите? +repos.leave_success=Успешно сте напустили спремиште '%s'! delete_account=Уклоните ваш налог delete_prompt=Операција ће трајно избрисати ваш налог, што се НЕ може поввратити! @@ -348,7 +403,9 @@ owner=Власник repo_name=Име спремишта repo_name_helper=Најбоља имена су кратка и јединствена. visibility=Видљивост +unlisted=Unlisted visiblity_helper=Приватно спремиште +unlisted_helper=This repository is Unlisted visiblity_helper_forced=Сва нова спремишта су приватна по одлуци администратора. visiblity_fork_helper=(Промена ове вредности ће утицати на све гране) clone_helper=Потребна вам помоћ клонирањем? Посетите страницу Помоћ! @@ -374,24 +431,26 @@ mirror_last_synced=Задње синхронизовано watchers=Посматрачи stargazers=Пратиоци forks=Огранци +repo_description_helper=Опис спремишта. Максимум 512 карактера. +repo_description_length=Доступни карактери form.reach_limit_of_creation=Власник има максимум број %d спремишта. -form.name_reserved=Име спремишта '%s' је резервирано. -form.name_pattern_not_allowed=Име спремишта по шаблоном '%s' није дозвољено. +form.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=Потребна ауторизација migrate_type=Тип миграције migrate_type_helper=Ово спремиште ће бити огледало migrate_repo=Мигрирајте спремиште migrate.clone_address=Адреса за клонирање -migrate.clone_address_desc=Ово може бити URL адреса врсте HTTP/HTTPS/GIT или пут на локалном серверу. +migrate.clone_address_desc=Могуће је да буде једна HTTP/HTTPS/GIT адреса. +migrate.clone_address_desc_import_local=Можете и да мигрирате спремиште користећи пут на локалном серверу. migrate.permission_denied=Немате права на увезете локално спремиште. migrate.invalid_local_path=Невашећи локални пут. Можда не постоји или није директоријум. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Миграција није успела: %v mirror_from=огледало од forked_from=изданак од -fork_from_self=Ви не можете да креирате огранак спремишта ако сте већ његов власник! copy_link=Копирај copy_link_success=Ископирано! copy_link_error=Кликните ⌘-C или Ctrl-C да копирате @@ -407,9 +466,9 @@ quick_guide=Кратак водич clone_this_repo=Клонирај спремиште create_new_repo_command=Направите ново спремиште са командне линије push_exist_repo=Push постојећe спремиште са командне линије -repo_is_empty=Овo спремиште je празнo, молимо вас, вратите се касније! +bare_message=Ово спремиште не садржи још било који садржај. -code=Код +files=Датотеке branch=Грана tree=Дрво filter_branch_and_tag=Профилтрирај по грани или ознаци @@ -420,12 +479,23 @@ pulls=Захтеви за спајање labels=Лабеле milestones=Фазе commits=Комити +git_branches=Гране releases=Издања file_raw=Датотека file_history=Историја file_view_raw=Прегледај саму датотеку file_permalink=Пермалинк file_too_large=Ова датотека је превише веика да би се приказала +video_not_supported_in_browser=Ваш прегледач не подржава HTML5 видео ознаке. + +branches.overview=Преглед +branches.active_branches=Активне гране +branches.stale_branches=Застареле гране +branches.all=Све гране +branches.updated_by=Ажуриран %[1]s од %[2]s +branches.change_default_branch=Промените подразумевану грану +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Нова датотека editor.upload_file=Отпреми датотеку @@ -455,19 +525,22 @@ editor.cancel=Откажи editor.filename_cannot_be_empty=Име датотеке неможе бити празно. editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште. editor.directory_is_a_file='%s' је већ постојећа датотека а не директоријум у спремишту. +editor.file_is_a_symlink=Датотека '%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 +editor.fail_to_delete_file=Фајл '%s' није успешно обрисан, разлог грешке: %v editor.add_subdir=Додај поддиректоријуми... editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v editor.upload_files_to_dir=Пошаљи датотеке на '%s' +commits.commit_history=Историја ревизија commits.commits=Комити commits.search=Претражи комите -commits.find=Претражи +commits.find=Пронађи commits.author=Аутор commits.message=Порука commits.date=Датум @@ -562,6 +635,7 @@ pulls.compare_compare=упореди pulls.filter_branch=Филтер по грани pulls.no_results=Нема резултата. pulls.nothing_to_compare=Нема шта да се упореди, гране су исте. +pulls.nothing_merge_base=Немогуће је упоредити јер двије гране имају потпуно другачију историју. pulls.has_pull_request=`Већ постоји захтев за спајање између ове две гране: %[2]s#%[3]d` pulls.create=Поднеси захтев за спајање pulls.title_desc=жели да споји %[1]d комит(е) из %[2]s у %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=Провера још увек у току, молимо ва pulls.can_auto_merge_desc=Овај захтев за спајање може бити обављен аутоматски. pulls.cannot_auto_merge_desc=Овај захтев за спајање не може бити обављен аутоматски због сукоба. pulls.cannot_auto_merge_helper=Молимо вас, обавите спајање ручно да би сте разрешили сукобе. +pulls.create_merge_commit=Направите спајање +pulls.rebase_before_merging=Поврат пре обједињавања +pulls.commit_description=Опис ревизије pulls.merge_pull_request=Обави спајање pulls.open_unmerged_pull_exists=`Неможете поново отворити јер већ постоји захтев за спајање (#%d) из истог спремишта са истим информацијама о спајању и чека спајање.` +pulls.delete_branch=Избришите грану +pulls.delete_branch_has_new_commits=Грана не може да буде избрисана због нових ревизија после уједињења. milestones.new=Нова фаза milestones.open_tab=%d отворено @@ -629,6 +708,29 @@ settings.collaboration.admin=За администратора settings.collaboration.write=За писање settings.collaboration.read=Читање settings.collaboration.undefined=Није дефинисано +settings.branches=Гране +settings.branches_bare=Не можете да управљате гране за празно спремиште. Молим да прво ставите неке садржаје. +settings.default_branch=Подразумевана грана +settings.default_branch_desc=Подразумевана грана се сматра 'основим' граном за ревизије кода, пул захтеве и онлајн уређивање. +settings.update=Ажурирање +settings.update_default_branch_unsupported=Промена подразумеване гране није подржавана од стране Git верзија сервера. +settings.update_default_branch_success=Подразумевана грана овог спремишта је била успешно ажурирана! +settings.protected_branches=Заштићене гране +settings.protected_branches_desc=Заштита гранe од додира, случајног брисања и команди листе кода. +settings.choose_a_branch=Изаберите Филијалy... +settings.branch_protection=Заштита Филијала +settings.branch_protection_desc=Молимо изаберите заштитне опције за грану %s. +settings.protect_this_branch=Заштити ову филијалy +settings.protect_this_branch_desc=Онемогућите притисак и заштититy од брисања. +settings.protect_require_pull_request=Захтев за повлачењем уместо директног додира +settings.protect_require_pull_request_desc=Омогућите ову опцију да бисте спречили директан додир на ову грану. Обавезно мора бити покренуто у незаштићеној грани затим објединти на ову грану кao захтев за спајање. +settings.protect_whitelist_committers=Whitelist који може да додирне ову грану +settings.protect_whitelist_committers_desc=Додајте људе или тимовe у листу белих исправа за директан приступ овој теми. Корисници из беле листе ће заобићи захтев за повлачење захтева. +settings.protect_whitelist_users=Корисници који могу да додирнy ову грану +settings.protect_whitelist_search_users=Тражи кориснике +settings.protect_whitelist_teams=Тимови кao и њихови чланови могу потакнути овy грану +settings.protect_whitelist_search_teams=Тимови за претрагу +settings.update_protect_branch_success=Заштитна опција за ову грану је успешно ажурирана! settings.hooks=Webhooks settings.githooks=Git хуки settings.basic_settings=Основна подешавања @@ -641,19 +743,26 @@ settings.change_reponame_prompt=Ова промена ће утицати на settings.advanced_settings=Напредна подешавања settings.wiki_desc=Омогући систем вики settings.use_internal_wiki=Користи уграђен вики +settings.allow_public_wiki_desc=Дозволите приступ wiki када је трговина приватна settings.use_external_wiki=Користи спољни Вики settings.external_wiki_url=URL адреса спољног Вики settings.external_wiki_url_desc=Посетиоци ће бити преусмерени URL адреси након што кликну на картицу. settings.issues_desc=Омогући систем праћења грешака settings.use_internal_issue_tracker=Користи уграђен систем праћења грешака +settings.allow_public_issues_desc=Дозволите приступ проблемима када је трговина приватна settings.use_external_issue_tracker=Користи спољни систем праћења грешака +settings.external_tracker_url=Екстерни проблем Tracker URL +settings.external_tracker_url_desc=Посетиоци ће бити преусмерени на URL када кликну на картицу. settings.tracker_url_format=Спољни формат везе система за праћење грешака settings.tracker_issue_style=Стил именовања на спољном систему: settings.tracker_issue_style.numeric=Нумерично settings.tracker_issue_style.alphanumeric=Алфанумерично settings.tracker_url_format_desc=Можете да користите шаблон {user} {repo} {index} за корисничко име, спремишта и задатака. -settings.pulls_desc=Омогући систем захтева за спајање да би сте преузели јавних доприноса +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Занемарите промене у размаку +settings.pulls.allow_rebase_merge=Дозволи употребу поврата да обједините обавезе settings.danger_zone=Опасна зона +settings.cannot_fork_to_same_owner=Не можете поделити спремиште власнику. settings.new_owner_has_same_repo=Нови власник већ има спремиште по истим називом. Молимо вас изаберите друго име. settings.convert=Претворити у обично спремиште settings.convert_desc=Можете претворити огледало у обично спремиште, али та операција не може се укинути. @@ -672,7 +781,7 @@ settings.wiki_deletion_success=Вики подаци за ово спремиш settings.delete=Уклони ово спремиште settings.delete_desc=Нећете мочи повратити спремиште после брисања. Молимо вас, будите сигурни. settings.delete_notices_1=- Ова операција НЕЋЕ МОЧИ бити укинута. -settings.delete_notices_2=- Ова операција ће трајно избрисати све из овог спремишта, укључујући и податке Git, задатци, коментаре и приступ сарадницима. +settings.delete_notices_2=- Ова операција ће трајно избрисати све из овог спремишта, укључујући податке Git, задатке, коментаре и приступ сарадницима. settings.delete_notices_fork_1=- Сви огранци ће постати независни после уклањање. settings.deletion_success=Спремиште је успешно избрисано! settings.update_settings_success=Подешавања спремишта су успешно ажурирани. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Овај корисник неће имат settings.remove_collaborator_success=Сарадник је уклоњен. settings.search_user_placeholder=Претрага корисника... settings.org_not_allowed_to_be_collaborator=Неможе се додати организација као сарадник. -settings.user_is_org_member=Корисник је члан организације и потом неможе бити додат као сарадник. -settings.add_webhook=Додај Webhook settings.hooks_desc=Webhooks омогућавају спољашњим услугама да приме обавештења када се нешто одређено догоди на Gogs. Сазнајте више у овом водичу за Webhooks. +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=Додај Webhook 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.redelivery=Redelivery +settings.webhook.redelivery_success=Hook задатак '%s' је прочитан редоследом испоруке. Може потрајати неколико секунди да ce ажурира статус испоруке у историји. settings.webhook.request=Захтев settings.webhook.response=Одговор settings.webhook.headers=Наслови settings.webhook.payload=Садржај захтева settings.webhook.body=Тело +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Git Hooks пружају Git сами по себи. Можете ажурирати датотеке са подржаним hooks са пратећег списка операције. settings.githook_edit_desc=Aко Webhook није активан, примерни садржај ће бити представљен. Ако оставите празно, Webhook ће бити онемогућен. settings.githook_name=Име Hook-а @@ -711,6 +825,7 @@ settings.add_webhook_desc=Послаћемо захтев POST на settings.payload_url=URL адреса за слање settings.content_type=Тип садржаја settings.secret=Тајна +settings.secret_desc=Тајна ће бити послата као SHA256 HMAC hex digest корисног оптерећења преко X-Gogs-Signature заглавља. settings.slack_username=Корисничко име settings.slack_icon_url=URL адреса иконице settings.slack_color=Боја @@ -720,10 +835,20 @@ settings.event_send_everything=У свим догађајима settings.event_choose=Изабраћу шта ми је потребно. settings.event_create=Креирај settings.event_create_desc=Створена грана или ознака -settings.event_pull_request=Захтев за спајање -settings.event_pull_request_desc=Захтев за спајање отворенo, затворено, додељено, недодељенo, лабела ажурирана, лабела избрисана, или синхронизовано. +settings.event_delete=Обриши +settings.event_delete_desc=Oбрисана грана или ознака +settings.event_fork=Креирај огранак +settings.event_fork_desc=Спремиште је допуштено settings.event_push=Push settings.event_push_desc=Git push у спремиште +settings.event_issues=Задаци +settings.event_issues_desc=Проблем је отворен, затворен, поново отворен, уређен, додељен, не додељен, етикета је ажурирана, етикета је очишћена, помјерена или демилестирана. +settings.event_pull_request=Захтев за спајање +settings.event_pull_request_desc=Захтев за спајање отворенo, затворено, додељено, недодељенo, ознака ажурирана, ознака избрисана, створена прекретница, избрисана прекретница, или синхронизовано. +settings.event_issue_comment=Коментар проблема +settings.event_issue_comment_desc=Коментар проблема креиран, уређиван или избришен. +settings.event_release=Издање +settings.event_release_desc=Издање објављено на спремишту. settings.active=Активно settings.active_helper=Детаљи о догађају што је проузроковало hook ће исто бити испоручено. settings.add_hook_success=Додат је нови webhook. @@ -733,10 +858,13 @@ settings.delete_webhook=Уклони Webhook settings.recent_deliveries=Недавне испоруке settings.hook_type=Тип Hook-а settings.add_slack_hook_desc=Додавање интеграције Slack у спремиште. +settings.add_discord_hook_desc=Додавати Discord интеграцију вашем спремишту. +settings.add_dingtalk_hook_desc=Додајте интеграцију Dingtalk у своје спремиште. settings.slack_token=Токен settings.slack_domain=Домен settings.slack_channel=Канал settings.deploy_keys=Кључеви за распоређивање +settings.deploy_keys_helper=Common Gotcha! Ако хоћете да додате личне јавне кључеве, молим вас да их додате у поставке вашег налога. settings.add_deploy_key=Додај кључ за распоређивање settings.deploy_key_desc=Кључеви за распоређивање имају само приступ за читање. То није исто што и SSH кључеви. settings.no_deploy_keys=Нисте додали ниједан кључ за распоређивање. @@ -748,6 +876,8 @@ settings.add_key_success=Нови кључ распоређивање '%s' је settings.deploy_key_deletion=Уклони кључ распоређивањa settings.deploy_key_deletion_desc=Брисање овог кључа за распоређивање ће довести до укидање приступ на овом спремишту. Да ли желите да наставите? settings.deploy_key_deletion_success=Кључ за распоређивање је успешно обрисан! +settings.description_desc=Опис спремишта. Максимум 512 карактера. +settings.description_length=Доступни карактери diff.browse_source=Преглед изворни кода diff.parent=родитељ @@ -766,7 +896,6 @@ release.releases=Издања release.new_release=Ново издање release.draft=Нацрт release.prerelease=Пред-верзија -release.stable=Стабилно release.edit=уреди release.ahead=%d комита на %s почев од овог издања release.source_code=Изворни код @@ -813,8 +942,8 @@ team_name_helper=Ви ћете користити то име помињете team_desc_helper=Шта је циљ овог тима? team_permission_desc=Који ниво приступа треба имати овај тим? -form.name_reserved=Име организације '%s' је резервирано. -form.name_pattern_not_allowed=Шаблон имена '%s' није дозвољено. +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=Подешавања settings.options=Опције @@ -886,12 +1015,19 @@ first_page=Први last_page=Последњи total=Укупно: %d +dashboard.build_info=Build Information +dashboard.app_ver=Application version +dashboard.git_version=Git version +dashboard.go_version=Go version +dashboard.build_time=Build time +dashboard.build_commit=Build commit dashboard.statistic=Статистика dashboard.operations=Операције dashboard.system_status=Статус системског монитора dashboard.statistic_info=У бази података Gogs забележено је %d корисника, %d организације, %d јавних кључева, %d спремишта, %d watches, %d фаворита, %d акције, %d доступа, %d задатака, %d коментара, %d друштвених рачуна, %d пратње, %d огледала, %d издања, %d извора улаза, %d webhooks, %d фаза, %d лабела, %d hook задатака, %d тимова, %d задатака за надоградњу, %d прилога. dashboard.operation_name=Име операције dashboard.operation_switch=Пребаци +dashboard.select_operation_to_run=Please select operation to run dashboard.operation_run=Покрени dashboard.clean_unbind_oauth=Уклони неповазане OAuth dashboard.clean_unbind_oauth_success=Неповезане OAuth налози су успешно избрисани. @@ -905,8 +1041,8 @@ dashboard.git_gc_repos=Изврши cакупљање смећа на спрем dashboard.git_gc_repos_success=Сва спремишта су успешно извршили cакупљање смећа. dashboard.resync_all_sshkeys=Препиши '.ssh/authorized_keys' (опрез: не Gogs тастери ће бити изгубљени) dashboard.resync_all_sshkeys_success=Сви јавни кључеви су успешно преписани. -dashboard.resync_all_update_hooks=Препиши сва hook-а за ажурирање спремишта (потребно кад пут конфигурације је промењен) -dashboard.resync_all_update_hooks_success=Сва hook-а за ажурирање спремишта су успешно промењена. +dashboard.resync_all_hooks=Поново синхронизујте купљенe pre-receive, ажурирањa и post-receive у свим репозиторијумима +dashboard.resync_all_hooks_success=Све спремишта pre-receive, ажурирања и post-receive успешно су ресинкронизованa. dashboard.reinit_missing_repos=Поново постави све податке са изгубљеним Git датотекама dashboard.reinit_missing_repos_success=Сви подаци са изгубљеним Git датотекама су успешно поново постављени. @@ -981,12 +1117,14 @@ repos.private=Приватно repos.watches=Watches repos.stars=Фаворити repos.issues=Задаци +repos.size=Величина -auths.auth_manage_panel=Контролна панела аутентикације +auths.auth_sources=Извори аутентичности auths.new=Додај нови извор auths.name=Име auths.type=Тип auths.enabled=Омогућено +auths.default=Default auths.updated=Ажурирано auths.auth_type=Врста провере аутентичности auths.auth_name=Име провере аутентичности @@ -995,15 +1133,21 @@ auths.domain=Домен auths.host=Хост auths.port=Порт auths.bind_dn=Bind DN +auths.bind_dn_helper=Можете користити „%s” као место за корисничко име, e.g. DOM\%s auths.bind_password=Bind лозинкa auths.bind_password_helper=Упозорење: Ова лозинка је сачувана у облику нешифрованом текцту. Не користите високо-привилеговану налог. auths.user_base=База претраживање корисника auths.user_dn=DN корисника auths.attribute_username=Атрибут username auths.attribute_username_placeholder=Оставите празно да бисте користили корисничко име за регистрацију. -auths.attribute_name=Име атрибута +auths.attribute_name=Првo име атрибута auths.attribute_surname=Презиме атрибута auths.attribute_mail=Е-маил адреса +auths.verify_group_membership=Потврдите чланство у групи +auths.group_search_base_dn=База DN за претраживање групе +auths.group_filter=Филтер групе +auths.group_attribute_contain_user_list=Група атрибута која садржи листу корисника +auths.user_attribute_listed_in_group=Атрибут прилагођен и наведен у групи auths.attributes_in_bind=Екстракција атрибута у облику Bind DN auths.filter=Филтер корисника auths.admin_filter=Филтер администратора @@ -1017,9 +1161,9 @@ 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.default_auth=This authentication is default login source auths.new_success=Нови канал аутентикације '%s' је успешно креиран. auths.update_success=Подешавања канала аутентикације су успешно ажурирана. auths.update=Ажурирај подешавања аутентикације @@ -1028,107 +1172,189 @@ auths.delete_auth_title=Брисање канала аутентикације auths.delete_auth_desc=Овај канал аутентикације ће бити избрисан. Да ли желите да наставите? auths.still_in_used=Овај канал аутентикације још увек се користи од стране неких корисника, уклоните или пребаци ове кориснике у друг врсту аутентикације. auths.deletion_success=Канал аутентикације успешно избрисан! +auths.login_source_exist=Улазни извор '%s' већ постоји. +auths.github_api_endpoint=API Endpoint +config.not_set=(није подешено) config.server_config=Конфигурација сервера -config.app_name=Име апликације -config.app_ver=Верзија апликације -config.app_url=URL адреса апликације -config.domain=Домен -config.offline_mode=Режим ван мреже -config.disable_router_log=Онемогући журнал рутера +config.brand_name=Brand name config.run_user=Покретни корисник config.run_mode=Режим извршавања -config.repo_root_path=Пут до корена спремишта -config.static_file_root_path=Пут до статичке датотеке -config.log_file_root_path=Пут до журнала -config.script_type=Врста скрипта -config.reverse_auth_user=Корисничко име при обрнуту аутентикацију +config.server.external_url=External URL +config.server.domain=Domain +config.server.protocol=Protocol +config.server.http_addr=HTTP address +config.server.http_port=HTTP port +config.server.cert_file=Certificate file +config.server.key_file=Key file +config.server.tls_min_version=Minimum TLS version +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Enable Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL config.ssh_config=SSH конфигурација -config.ssh_enabled=Омогућено -config.ssh_start_builtin_server=Покрени уграђени сервер -config.ssh_domain=Домен -config.ssh_port=Порт -config.ssh_listen_port=Порт за слушање -config.ssh_root_path=Основни пут -config.ssh_key_test_path=Пут до кључу -config.ssh_keygen_path=Пут до генератор кључева ('ssh-keygen') -config.ssh_minimum_key_size_check=Минимална величина провера кључа -config.ssh_minimum_key_sizes=Минимална величина кључева +config.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Конфигурација спремишта +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=Конфигурација базе података -config.db_type=Тип -config.db_host=Хост -config.db_name=Име -config.db_user=Корисник -config.db_ssl_mode=Режим SSL -config.db_ssl_mode_helper=(само за postgres) -config.db_path=Пут -config.db_path_helper=(за "sqlite3" и "tidb") - -config.service_config=Подешавања сервиса -config.register_email_confirm=Потражи потврду путем е-поштом -config.disable_register=Искључи нове регистрације -config.show_registration_button=Прикажи дугме за регистрацију -config.require_sign_in_view=Прикажи налог за пријаву -config.mail_notify=Обавештења преко е-поште -config.disable_key_size_check=Онемогући проверу на минималној величини кључа -config.enable_captcha=Омогући Captcha -config.active_code_lives=Дужина живота активних кодова -config.reset_password_code_lives=Дужина живота ресетних кодова за лозинку +config.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -config.webhook_config=Подешавања Webhook -config.queue_length=Дужина реда -config.deliver_timeout=Време до отказивање слања -config.skip_tls_verify=Прескочи TLS проверу - -config.mailer_config=Подешавања поште -config.mailer_enabled=Омогућено -config.mailer_disable_helo=Онемогући HELO -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 -config.oauth_enabled=Укључено +config.session_config=Подешавања сесије +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Подешавања кеша -config.cache_adapter=Кеш адаптер -config.cache_interval=Кеш интервал -config.cache_conn=Кеш на вези - -config.session_config=Подешавања сесије -config.session_provider=Добављач сесија -config.provider_config=Конфигурација на добављачу -config.cookie_name=Име датотеке cookie -config.enable_set_cookie=Укључи поставку cookie -config.gc_interval_time=Интервал cакупљања смећа -config.session_life_time=Дужина живота сесјие -config.https_only=Само HTTPS -config.cookie_life_time=Дужина живота датотеке cookie +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP Конфигурација +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Подешавање слика -config.picture_service=Услуга за слике -config.disable_gravatar=Онемогући Gravatar -config.enable_federated_avatar=Омогући Federated Avatars +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Подешавања Webhook +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify config.git_config=Git конфигурација -config.git_disable_diff_highlight=Онемогући бојење синтаксе када гледате разлике -config.git_max_diff_lines=Максималан број различитих редова (у датотеци) -config.git_max_diff_line_characters=Максималан број различитих карактера (у реду) -config.git_max_diff_files=Максималан број измењених датотека (приказаних) -config.git_gc_args=Аргументи на cакупљање смећа -config.git_migrate_timeout=Време до отказања миграције -config.git_mirror_timeout=Време до отазање синхронизацији огледала -config.git_clone_timeout=Време до отказивања клонирањем -config.git_pull_timeout=Време до отказивања pull операцији -config.git_gc_timeout=Време до отказивања cакупљање смећа +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path config.log_config=Kонфигурација журнала -config.log_mode=Режим журналовања +config.log_file_root_path=Пут до журнала +config.log_mode=Режим +config.log_options=Опције monitor.cron=Cron задаци monitor.name=Име @@ -1159,17 +1385,24 @@ notices.delete_success=Системска обавештавања су успе create_repo=креира спремиште %s rename_repo=преимензје спремиште од %[1]s на %[3]s commit_repo=извршује push на %[3]s у %[4]s +compare_commits=Поређење ових %d комита +transfer_repo=преноси спремиште %s на %s create_issue=`отвара задатак %s#%[2]s` close_issue=`затвара задатак %s#%[2]s` reopen_issue=`поново отвара задатак %s#%[2]s` +comment_issue=`коментарише на задатаку %s#%[2]s` create_pull_request=`шаље захтев за спајање %s#%[2]s` close_pull_request=`затвара захтев за спајање %s#%[2]s` reopen_pull_request=`поново отвара захтев за спајање %s#%[2]s` -comment_issue=`коментарише на задатаку %s#%[2]s` merge_pull_request=`прихваћује захтев за спајање %s#%[2]s` -transfer_repo=преноси спремиште %s на %s +create_branch=створи нову филијалy %[3]s at %[4]s +delete_branch=избрисана филијалa %[2]s at %[3]s push_tag=извршује push са ознаком %[2]s на %[3]s -compare_commits=Поређење ових %d комита +delete_tag=избрисана ознака %[2]s at %[3]s +fork_repo=отворио спремиште %s +mirror_sync_push=синхронизује се %[3]s у %[4]s из огледала +mirror_sync_create=синхронизована нова референца %[2]s y %[3]s из огледала +mirror_sync_delete=синхронизоване и избрисане референце %[2]s y %[3]s из огледала [tool] ago=пре @@ -1191,6 +1424,7 @@ months=%[2]s %[1]d месеци years=%[2]s %[1]d година raw_seconds=секунди raw_minutes=минута +raw_hours=hours [dropzone] default_message=Превуците датотеку овде или кликните за преузимање. diff --git a/conf/locale/locale_sv-SE.ini b/conf/locale/locale_sv-SE.ini index c37deb34db6..fda8a860c4a 100644 --- a/conf/locale/locale_sv-SE.ini +++ b/conf/locale/locale_sv-SE.ini @@ -9,7 +9,6 @@ sign_out=Logga ut sign_up=Registrera dig register=Registrera dig website=Webbplats -version=Version page=Sida template=Mall language=Språk @@ -44,23 +43,27 @@ issues=Problem cancel=Avbryt +[status] +page_not_found=Sidan hittades inte +internal_server_error=Internt serverfel + [install] install=Installation title=Steg för att installera för första gången docker_helper=Om du kör Gogs inuti Docker, vänligen läs Riktninjerna nogrant innan du ändrar någonting på denna sida! -requite_db_desc=Gogs kräver MySQL, PostgreSQL, SQLite3 eller TiDB. +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title=Databasinställningar db_type=Databastyp host=Server user=Användare password=Lösenord db_name=Databasens namn +db_schema=Schema db_helper=Se till att i MySQL använda INNODB med teckenuppsättningen utf8_general_ci. ssl_mode=SSL-läge path=Filväg -sqlite_helper=Sökvägen för SQLite3 eller TiDB databas.
Vänligen använd den absoluta sökvägen när du kör som en tjänst. -err_empty_db_path=SQLite3 eller TiDB databassökvägen får inte vara tom. -err_invalid_tidb_name=TiDB databasnamn tillåter inte tecknen "." och "-". +sqlite_helper=Sökvägen för SQLite3 databas.
Vänligen använd den absoluta sökvägen när du kör som en tjänst. +err_empty_db_path=Sökvägen till SQLite3 databasen får inte vara tom. 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. @@ -75,12 +78,17 @@ 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. +use_builtin_ssh_server=Använd inbyggd SSH Server +use_builtin_ssh_server_popup=Starta inbyggd SSH-server för Git-operationer för att skilja från system-SSH-servern. 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. log_root_path=Loggsökväg log_root_path_helper=Katalog till vilken loggfiler skrivs. +enable_console_mode=Aktivera Konsolläge +enable_console_mode_popup=Utöver fil-läge, skriver även ut loggar till konsol. +default_branch=Default Branch optional_title=Övriga inställningar email_title=E-post tjänstens inställningar @@ -116,7 +124,10 @@ sqlite3_not_available=Din release stödjer ej SQLite3, ladda vänligen ner den o invalid_db_setting=Databas inställningen är inkorrekt: %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 +smtp_host_missing_port=SMTP-värden saknar port i adressen. +invalid_smtp_from=SMTP från fält är inte giltigt: %v save_config_failed=Konfigurationssparningen misslyckades: %v +init_failed=Det gick inte att initiera appen: %v invalid_admin_setting=Inställningarna för administratörskontot är felaktiga: %v install_success=Välkommen! Vi är glada att du väljer Gogs, ha kul och ta hand om dig. invalid_log_root_path=Ogiltig rotsökväg för loggfiler: %v @@ -137,6 +148,7 @@ issues.in_your_repos=I dina utvecklingskataloger [explore] repos=Utvecklingskataloger users=Användare +organizations=Organisationer search=Sök [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Har du redan ett konto? Logga in nu! social_register_hepler_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. +auth_source=Autentiseringskälla +local=Lokal remember_me=Kom ihåg mig forgot_password=Glömt lösenord forget_password=Glömt lösenordet? @@ -156,7 +170,6 @@ prohibit_login_desc=Ditt konto är förhindrat från att logga in. Vänligen kon resent_limit_prompt=Tyvärr, du har nyligen begärt ett aktiveringsmail. Vänligen vänta 3 minuter och försök sedan igen. 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) reset_password=Återställ ditt lösenord invalid_code=Tyvärr, din bekräftelsekod har antingen upphört att gälla eller är ogiltig. @@ -164,6 +177,14 @@ 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 6 tecken. non_local_account=Icke-lokala konton får inte ändra lösenord genom Gogs. +login_two_factor=Tvåfaktorsautentisering +login_two_factor_passcode=Autentiseringskod +login_two_factor_enter_recovery_code=Ange en tvåfaktorsautentisering återställningskod +login_two_factor_recovery=Tvåfaktorsautentisering Återställning +login_two_factor_recovery_code=Återställningskod +login_two_factor_enter_passcode=Ange en tvåfaktorsautentiserings kod +login_two_factor_invalid_recovery_code=Återställningskoden har använts eller är inte giltig. + [mail] activate_account=Vänligen aktivera ditt konto activate_email=Verifiera din epostaddress @@ -199,6 +220,7 @@ 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` +alpha_dash_dot_slash_error=` får bara innehålla bokstäver, nummer, bindestreck (-_), punkt eller snedstreck` 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.` @@ -215,6 +237,7 @@ 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. +auth_source_mismatch=Den autentiseringskälla som valts är inte associerad med användaren. enterred_invalid_repo_name=Se till att utvecklingskatalogen som du angav är rätt. 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. @@ -242,19 +265,18 @@ following=Följer follow=Följ unfollow=Sluta följa -form.name_reserved=Användarnamnet "%s" är reserverad. -form.name_pattern_not_allowed=Användarnamnet '%s' är inte tillåtet. +form.name_not_allowed=Användarnamn eller mönster %q är inte tillåtet. [settings] profile=Profil password=Lösenord avatar=Avatar ssh_keys=SSH-nycklar -social=Sociala konton -applications=Applikationer +security=Säkerhet +repos=Utvecklingskataloger orgs=Organisationer +applications=Applikationer delete=Radera konto -uid=Uid 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. @@ -295,6 +317,7 @@ 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_success=Epostaddressen har tagits bort! +email_deletion_primary=Cannot delete primary email address. add_new_email=Lägg till ny e-postadress 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. @@ -320,14 +343,36 @@ 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 -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. -unbind=Ta bort länkning -unbind_success=Socialt konto är inte längre länkat. +two_factor=Tvåfaktorsautentisering +two_factor_status=Status: +two_factor_on=På +two_factor_off=Av +two_factor_enable=Aktivera +two_factor_disable=Inaktivera +two_factor_view_recovery_codes=Visa och spara dina återställningskoder på ett säkert ställe. Du kan använda dem som kod om du förlorar åtkomsten till din autentisering applikation. +two_factor_http=För HTTP/HTTPS-operationer kan du inte längre använda vanliga användarnamn och lösenord. Vänligen skapa och använda Personlig åtkomsttoken som ditt användarnamn, t.ex. %[3]s. +two_factor_enable_title=Avaktivera Tvåfaktorsautentisering +two_factor_scan_qr=Vänligen använd din autentiseringsapp för att skanna bilden: +two_factor_or_enter_secret=Eller ange hemligheten: +two_factor_then_enter_passcode=Ange sedan lösenordet: +two_factor_verify=Verifiera +two_factor_invalid_passcode=The passcode you entered is not valid, please try again! +two_factor_reused_passcode=The passcode you entered has already been used, please try another one! +two_factor_enable_error=Enable Two-factor authentication failed: %v +two_factor_enable_success=Two-factor authentication has enabled for your account successfully! +two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes +two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, please keep these codes in a safe place. +two_factor_regenerate_recovery_codes=Regenerate Recovery Codes +two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v +two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully! +two_factor_disable_title=Disable Two-factor Authentication +two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue? +two_factor_disable_success=Two-factor authentication has disabled successfully! 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 Gogs APIer. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=Varje token har full tillgång till ditt konto. token_name=Tokennamn generate_token=Generera Token @@ -336,6 +381,16 @@ 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å. +token_name_exists=Token with same name already exists. + +orgs.none=Du är inte en medlem i någon organisation. +orgs.leave_title=Lämna en organisation +orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue? + +repos.leave=Leave +repos.leave_title=Leave repository +repos.leave_desc=You will lose access to the repository after you left. Do you want to continue? +repos.leave_success=You have left repository '%s' successfully! delete_account=Radera ditt konto delete_prompt=Åtgärden kommer at ta bort ditt konto permanent, och kan INTE ångras! @@ -348,7 +403,9 @@ owner=Ägare repo_name=Utvecklingskatalogens namn repo_name_helper=Ett bra utvecklingskatalogsnamn består vanligtvis av korta, minnesvärda och unika nyckelord. visibility=Synligt för +unlisted=Unlisted visiblity_helper=Denna utvecklingskatalog är Privat +unlisted_helper=This repository is Unlisted visiblity_helper_forced=Administratören har tvingat alla nya utvecklingskataloger 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! @@ -374,24 +431,26 @@ mirror_last_synced=Senast synkad watchers=Observerare stargazers=Stjärnmärkare forks=Forks +repo_description_helper=Description of repository. Maximum 512 characters length. +repo_description_length=Available characters 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.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=Tillstånd Krävs migrate_type=Migreringstyp migrate_type_helper=Detta repo kommer att vara en spegling migrate_repo=Migrera Repot migrate.clone_address=Kloningsaddress -migrate.clone_address_desc=Detta kan vara en HTTP/HTTPS/GIT-URL eller en lokal sökväg på servern. +migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path. migrate.permission_denied=Du får inte importera lokala repon. migrate.invalid_local_path=Ogiltig lokal sökväg, den finns inte eller är inte en katalog. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Migrering misslyckades: %v mirror_from=spegling av forked_from=forkad från -fork_from_self=Du kan inte forka ett repo som du redan äger! copy_link=Kopiera copy_link_success=Kopierad! copy_link_error=Tryck på ⌘-C eller Ctrl-C för att kopiera @@ -407,9 +466,9 @@ 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! +bare_message=This repository does not have any content yet. -code=Kod +files=Filer branch=Gren tree=Träd filter_branch_and_tag=Filtrera gren eller tagg @@ -420,12 +479,23 @@ pulls=Pull-förfrågningar labels=Etiketter milestones=Milstenar commits=Incheckningar +git_branches=Brancher releases=Släpp file_raw=Rå file_history=Historik file_view_raw=Visa i råformat file_permalink=Permalänk file_too_large=Denna fil är för stor för att visas +video_not_supported_in_browser=Din webbläsare stöder inte HTML5 video-tagg. + +branches.overview=Översikt +branches.active_branches=Aktiva brancher +branches.stale_branches=Djärva brancher +branches.all=Alla brancher +branches.updated_by=Uppdaterade %[1]s med %[2]s +branches.change_default_branch=Ändra standard branch +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=Ny fil editor.upload_file=Ladda upp fil @@ -455,16 +525,19 @@ editor.cancel=Avbryt editor.filename_cannot_be_empty=Filnamnet får inte vara tomt. editor.branch_already_exists=Grenen '%s' finns redan i förrådet. editor.directory_is_a_file=Komponenten '%s' i föräldrasökvägen är en fil, inte en katalog i detta förråd. +editor.file_is_a_symlink=Filen '%s' är en symbolisk länk som inte kan editeras i webbläsaren. editor.filename_is_a_directory=Filnmanet '%s' är en existerande katalog i detta förråd. editor.file_editing_no_longer_exists=Filen '%s' som du redigerar finns inte lägre i förrådet. editor.file_changed_while_editing=Filinnhållet har ändrats sedan du började redigera. Klicka här för att se vad som ändrats eller tryck checka in igen för att skriva över dessa ändringar. editor.file_already_exists=En fil med namnet '%s' finns redan i förrådet. editor.no_changes_to_show=Det finns inga ändringar att visa. editor.fail_to_update_file=Uppdateringen/skapandet av filen '%s' misslyckades med felet: %v +editor.fail_to_delete_file=Det gick inte att ta bort filen '%s' med fel: %v. editor.add_subdir=Lägg till underkatalog... editor.unable_to_upload_files=Uppladdning av filen '%s' misslyckades med felet: %v editor.upload_files_to_dir=Ladda upp filer till '%s' +commits.commit_history=Commit historia commits.commits=Incheckningar commits.search=Sök bland incheckningar commits.find=Sök @@ -562,6 +635,7 @@ 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.nothing_merge_base=Det finns inget att jämföra eftersom två branch har helt olika historia. pulls.has_pull_request=`Det finns redan en pullförfrågan mellan detta 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 @@ -577,8 +651,13 @@ pulls.is_checking=Konfliktkontroll är fortfarande pågågående, vänligen uppd 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.create_merge_commit=Skapa en merge commit +pulls.rebase_before_merging=Rebase innan merge +pulls.commit_description=Commit beskrivning 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.` +pulls.delete_branch=Ta bort gren +pulls.delete_branch_has_new_commits=Branch kan inte tas bort eftersom den har nya commits efter merge. milestones.new=Ny milstolpe milestones.open_tab=%d Öppna @@ -629,6 +708,29 @@ settings.collaboration.admin=Adminstrera settings.collaboration.write=Skriva settings.collaboration.read=Läsa settings.collaboration.undefined=Odefinierad +settings.branches=Brancher +settings.branches_bare=Du kan inte hantera brancher för kala repository. Vänligen push innehåll först. +settings.default_branch=Default Branch +settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing. +settings.update=Update +settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server. +settings.update_default_branch_success=Default branch of this repository has been updated successfully! +settings.protected_branches=Protected Branches +settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers. +settings.choose_a_branch=Choose a branch... +settings.branch_protection=Branch Protection +settings.branch_protection_desc=Please choose protect options for branch %s. +settings.protect_this_branch=Protect this branch +settings.protect_this_branch_desc=Disable force pushes and prevent from deletion. +settings.protect_require_pull_request=Require pull request instead direct pushing +settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request. +settings.protect_whitelist_committers=Whitelist who can push to this branch +settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check. +settings.protect_whitelist_users=Users who can push to this branch +settings.protect_whitelist_search_users=Sök användare +settings.protect_whitelist_teams=Teams for which members of them can push to this branch +settings.protect_whitelist_search_teams=Sök team +settings.update_protect_branch_success=Protect options for this branch has been updated successfully! settings.hooks=Webbhookar settings.githooks=Githookar settings.basic_settings=Basinställningar @@ -641,19 +743,26 @@ settings.change_reponame_prompt=Denna ändring kommer att påverka hur länkar r settings.advanced_settings=Advancerade Inställningar settings.wiki_desc=Aktivera wikisystem settings.use_internal_wiki=Använd inbyggd wiki +settings.allow_public_wiki_desc=Allow public access to wiki when repository is private settings.use_external_wiki=Använd extern wiki settings.external_wiki_url=Extern Wiki-URL 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 +settings.allow_public_issues_desc=Allow public access to issues when repository is private settings.use_external_issue_tracker=Använd extern ärendehanterare +settings.external_tracker_url=External Issue Tracker URL +settings.external_tracker_url_desc=Visitors will be redirected to URL when they click on the tab. settings.tracker_url_format=URL-Format För Extern Ärendehanterare settings.tracker_issue_style=Namngivningsstil hos det externa ärendehanteringsystemet: settings.tracker_issue_style.numeric=Numerisk settings.tracker_issue_style.alphanumeric=Alfanumerisk settings.tracker_url_format_desc=Du kan använda platshållaren {user} {repo} {index} för användarnamn, reponamn, och ärendenummer. -settings.pulls_desc=Aktivera pullförfrågningar för att ta emot publika bidrag +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Ignore changes in whitespace +settings.pulls.allow_rebase_merge=Allow use rebase to merge commits settings.danger_zone=Högrisksområde +settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner. 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. @@ -672,7 +781,7 @@ settings.wiki_deletion_success=Förrådets 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_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access. 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. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Denna användare kommer förlora sin åtkoms settings.remove_collaborator_success=Deltagare har tagits bort. 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 Gogs, kommer vi att meddela måldatorn som du anger. Läs mera i Webbhook Guide. +settings.webhooks.add_new=Lägg till en ny webhook: +settings.webhooks.choose_a_type=Välj en typ... +settings.add_webhook=Lägg Till Webbhook 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.redelivery=Återleverans +settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. settings.webhook.request=Begäran settings.webhook.response=Svar settings.webhook.headers=Huvuden settings.webhook.payload=Nyttolast settings.webhook.body=Innehåll +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Git-krokar är en del av Git själv. För att utföra anpassade operationer kan du redigera filerna för de krokar som stöds i listan nedan. settings.githook_edit_desc=Om kroken är inaktiv visas exempelinnehåll. Inaktivera denna krok genom att lämna innehållet tomt. settings.githook_name=Kroknamn @@ -711,6 +825,7 @@ settings.add_webhook_desc=Gogs kommer skicka POST-anrop till webbad settings.payload_url=Adress till innehåll settings.content_type=Typ av innehåll settings.secret=Hemlighet +settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. settings.slack_username=Användarnamn settings.slack_icon_url=URL för ikon settings.slack_color=Färg @@ -720,10 +835,20 @@ settings.event_send_everything=Jag behöver allt. settings.event_choose=Låt mig välja. settings.event_create=Skapa settings.event_create_desc=Branch eller tagg skapad -settings.event_pull_request=Hämtningsbegäran -settings.event_pull_request_desc=Hämtningsbegäran öppnad, stängd, återöppnad, redigerad, tilldelad, otilldelad, etikett uppdaterad, etikett rensad eller synkroniserad. +settings.event_delete=Ta bort +settings.event_delete_desc=Branch eller tagg borttagen +settings.event_fork=Fork +settings.event_fork_desc=Repository forkad settings.event_push=Pusha settings.event_push_desc=Uppladdning till ett förråd +settings.event_issues=Issues +settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned. +settings.event_pull_request=Hämtningsbegäran +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=Issue Comment +settings.event_issue_comment_desc=Issue comment created, edited, or deleted. +settings.event_release=Release +settings.event_release_desc=Release publicerat i ett repository. 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. @@ -733,10 +858,13 @@ settings.delete_webhook=Tag bort webbkrok settings.recent_deliveries=Färska leveranser settings.hook_type=Kroktyp settings.add_slack_hook_desc=Lägg till Slack-integration till ditt förråd. +settings.add_discord_hook_desc= +settings.add_dingtalk_hook_desc=Add Dingtalk integration to your repository. settings.slack_token=Pollett settings.slack_domain=Domän settings.slack_channel=Kanal settings.deploy_keys=Driftsättningsnycklar +settings.deploy_keys_helper=Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. 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.no_deploy_keys=Du har inte lagt till några driftsättningsnycklar. @@ -748,6 +876,8 @@ 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! +settings.description_desc=Description of repository. Maximum 512 characters length. +settings.description_length=Tillgängliga tecken diff.browse_source=Bläddra i källkod diff.parent=förälder @@ -766,7 +896,6 @@ release.releases=Släpp release.new_release=Nytt Släpp release.draft=Utkast release.prerelease=Försläpp -release.stable=Stabil release.edit=redigera release.ahead=%d ändringar mot %s sedan detta släpp release.source_code=Källkod @@ -813,8 +942,8 @@ team_name_helper=Du kan använda detta namn för att nämna denna grupp i konver team_desc_helper=Vad handlar denna grupp om? team_permission_desc=Vilka behörigheter ska denna grupp ha? -form.name_reserved=Organisationsnamnet "%s" är reserverat. -form.name_pattern_not_allowed=Organisationsnamnet '%s' är inte tillåtet. +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=Inställningar settings.options=Alternativ @@ -886,18 +1015,25 @@ first_page=Första last_page=Sista total=Totalt: %d +dashboard.build_info=Build Information +dashboard.app_ver=Application version +dashboard.git_version=Git Version +dashboard.go_version=Go version +dashboard.build_time=Build tid +dashboard.build_commit=Build commit dashboard.statistic=Statistik dashboard.operations=Operationer dashboard.system_status=Systemstatus dashboard.statistic_info=Gogs-databasen innehåller %d användare, %d organisationer, %d publika nyckar, %d förråd, %d vakter, %d stjärnor, %d handlingar, %d åtkomster, %d ärenden, %d kommentarer, %d sociala konton, %d följbegäran, %d speglingar, %d släpp, %d inloggningskällor, %d webbkrokar, %d milstolpar, %d etiketter, %d krokuppgifter, %d team, %d uppdateringsuppgifter, %d bilagor. dashboard.operation_name=Operationsnamn dashboard.operation_switch=Byt till +dashboard.select_operation_to_run=Välj åtgärd att köra 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=All inactivate accounts have been deleted successfully. -dashboard.delete_repo_archives=Delete all repositories archives +dashboard.delete_inactivate_accounts_success= +dashboard.delete_repo_archives= dashboard.delete_repo_archives_success=All repositories archives have been deleted successfully. dashboard.delete_missing_repos=Delete all repository records that lost Git files dashboard.delete_missing_repos_success=All repository records that lost Git files have been deleted successfully. @@ -905,8 +1041,8 @@ dashboard.git_gc_repos=Do garbage collection on repositories dashboard.git_gc_repos_success=All repositories have done garbage collection successfully. dashboard.resync_all_sshkeys=Rewrite '.ssh/authorized_keys' file (caution: non-Gogs keys will be lost) dashboard.resync_all_sshkeys_success=All public keys have been rewritten successfully. -dashboard.resync_all_update_hooks=Rewrite all update hook of repositories (needed when custom config path is changed) -dashboard.resync_all_update_hooks_success=All repositories' update hook have been rewritten successfully. +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 repository records that lost Git files dashboard.reinit_missing_repos_success=All repository records that lost Git files have been reinitialized successfully. @@ -981,12 +1117,14 @@ repos.private=Privat repos.watches=Vakter repos.stars=Stjärnor repos.issues=Ärenden +repos.size=Size -auths.auth_manage_panel=Panel för hantering av autentisering +auths.auth_sources=Authentication Sources auths.new=Lägg till ny källa auths.name=Namn auths.type=Typ auths.enabled=Aktiv +auths.default=Default auths.updated=Uppdaterad auths.auth_type=Autentiseringstyp auths.auth_name=Autentiseringsnamn @@ -995,31 +1133,37 @@ auths.domain=Domän auths.host=Värd auths.port=Port auths.bind_dn=Bind DN -auths.bind_password=Bind Password +auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s +auths.bind_password=Bind lösenord auths.bind_password_helper=Warning: This password is stored in plain text. Do not use a high privileged account. auths.user_base=User Search Base auths.user_dn=User DN -auths.attribute_username=Username attribute +auths.attribute_username=Användarnamnsattribut auths.attribute_username_placeholder=Leave empty to use sign-in form field value for user name. -auths.attribute_name=First name attribute -auths.attribute_surname=Surname attribute -auths.attribute_mail=Email attribute +auths.attribute_name=First Name Attribute +auths.attribute_surname=Efternamnsattribut +auths.attribute_mail=E-postattribut +auths.verify_group_membership=Verify group membership +auths.group_search_base_dn=Group Search Base DN +auths.group_filter=Group Filter +auths.group_attribute_contain_user_list=Group Attribute Containing List of Users +auths.user_attribute_listed_in_group=User Attribute Listed in Group auths.attributes_in_bind=Fetch attributes in Bind DN context -auths.filter=User Filter -auths.admin_filter=Admin Filter +auths.filter=Användarfilter +auths.admin_filter=Adminfilter auths.ms_ad_sa=Ms Ad SA -auths.smtp_auth=SMTP Authentication Type -auths.smtphost=SMTP Host -auths.smtpport=SMTP Port -auths.allowed_domains=Allowed Domains +auths.smtp_auth=SMTP-autentiseringstyp +auths.smtphost=SMTP-värd +auths.smtpport=SMTP-port +auths.allowed_domains=Tillåtna domäner auths.allowed_domains_helper=Leave it empty to not restrict any domains. Multiple domains should be separated by comma ','. -auths.enable_tls=Enable TLS Encryption +auths.enable_tls=Aktivera TLS-kryptering auths.skip_tls_verify=Skip TLS Verify auths.pam_service_name=PAM Service Name auths.enable_auto_register=Enable Auto Registration -auths.tips=Tips auths.edit=Edit Authentication Setting auths.activated=This authentication is activated +auths.default_auth=This authentication is default login source auths.new_success=New authentication '%s' has been added successfully. auths.update_success=Authentication setting has been updated successfully. auths.update=Update Authentication Setting @@ -1028,107 +1172,189 @@ auths.delete_auth_title=Authentication Deletion auths.delete_auth_desc=This authentication is going to be deleted, do you want to continue? auths.still_in_used=This authentication 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! - -config.server_config=Server Configuration -config.app_name=Application Name -config.app_ver=Application Version -config.app_url=Application URL -config.domain=Domain -config.offline_mode=Offline Mode -config.disable_router_log=Disable Router Log -config.run_user=Run User -config.run_mode=Run Mode -config.repo_root_path=Rotsökväg för utvecklingskatalog -config.static_file_root_path=Static File Root Path -config.log_file_root_path=Log File Root Path -config.script_type=Script Type -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_domain=Domän -config.ssh_port=Port -config.ssh_listen_port=Lyssningsport -config.ssh_root_path=Rotsökväg -config.ssh_key_test_path=Testsökväg för nyckel -config.ssh_keygen_path=Sökväg för nyckelgenerator ('ssh-keygen') -config.ssh_minimum_key_size_check=Kontroll av minsta tillåtna nyckelstorlek -config.ssh_minimum_key_sizes=Minsta tillåtna nyckelstorlek +auths.login_source_exist=Login source '%s' already exists. +auths.github_api_endpoint=API Endpoint + +config.not_set=(not set) +config.server_config=Server-konfiguration +config.brand_name=Brand name +config.run_user=Run user +config.run_mode=Run mode +config.server.external_url=External URL +config.server.domain=Domain +config.server.protocol=Protocol +config.server.http_addr=HTTP address +config.server.http_port=HTTP port +config.server.cert_file=Certificate file +config.server.key_file=Key file +config.server.tls_min_version=Minimum TLS version +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Enable Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL + +config.ssh_config=SSH-konfiguration +config.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Repository configuration +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=Databaskonfiguration -config.db_type=Typ -config.db_host=Värd -config.db_name=Namn -config.db_user=Användare -config.db_ssl_mode=SSL-läge -config.db_ssl_mode_helper=(endast för "postgres") -config.db_path=Sökväg -config.db_path_helper=(för "sqlite3" och "tidb") - -config.service_config=Tjänstkonfiguration -config.register_email_confirm=Kräv bekräftelse via e-post -config.disable_register=Avaktivera registrering -config.show_registration_button=Visa registreringsknapp -config.require_sign_in_view=Kräv inloggningsvy -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.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -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 -config.mailer_disable_helo=Avaktivera HELO -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 -config.oauth_enabled=Aktiverad +config.session_config=Sessionskonfiguration +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Mellanlagringskonfiguration -config.cache_adapter=Mellanlagringsadapter -config.cache_interval=Mellanlagringsintervall -config.cache_conn=Mellanlagringsanslutning - -config.session_config=Sessionskonfiguration -config.session_provider=Sessionsleverantör -config.provider_config=Leverantörskonfiguration -config.cookie_name=Cookie-namn -config.enable_set_cookie=Aktivera sättning av kaka -config.gc_interval_time=Tidsintervall för skräpsamling -config.session_life_time=Livstid för session -config.https_only=Endast HTTPS -config.cookie_life_time=Livstid för kaka +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP configuration +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Bildkonfiguration -config.picture_service=Bildtjänst -config.disable_gravatar=Disable Gravatar -config.enable_federated_avatar=Enable Federated Avatars - -config.git_config=Git Configuration -config.git_disable_diff_highlight=Disable Diff Syntax Highlight -config.git_max_diff_lines=Max Diff Lines (for a single file) -config.git_max_diff_line_characters=Max Diff Characters (for a single line) -config.git_max_diff_files=Max Diff Files (to be shown) -config.git_gc_args=GC Arguments -config.git_migrate_timeout=Migration Timeout -config.git_mirror_timeout=Mirror Update Timeout -config.git_clone_timeout=Clone Operation Timeout -config.git_pull_timeout=Pull Operation Timeout -config.git_gc_timeout=GC Operation Timeout - -config.log_config=Log Configuration -config.log_mode=Loggningsläge +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Webbkrokskonfiguration +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Git-konfiguration +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path + +config.log_config=Logg-konfiguration +config.log_file_root_path=Log file root path +config.log_mode=Mode +config.log_options=Options monitor.cron=Cron-jobb monitor.name=Namn @@ -1144,10 +1370,10 @@ monitor.execute_time=Execution Time notices.system_notice_list=System Notices notices.view_detail_header=View Notice Detail notices.actions=Actions -notices.select_all=Select All -notices.deselect_all=Deselect All +notices.select_all=Markera alla +notices.deselect_all=Avmarkera alla notices.inverse_selection=Inverse Selection -notices.delete_selected=Delete Selected +notices.delete_selected=Ta bort markerade notices.delete_all=Delete All Notices notices.type=Typ notices.type_1=Repository @@ -1159,17 +1385,24 @@ notices.delete_success=System notices have been deleted successfully. create_repo=skapade utvecklingskatalog %s rename_repo=renamed repository from %[1]s to %[3]s commit_repo=pushed to %[3]s at %[4]s +compare_commits=View comparison for these %d commits +transfer_repo=transfered repository %s to %s create_issue=`opened issue %s#%[2]s` close_issue=`closed issue %s#%[2]s` reopen_issue=`reopened issue %s#%[2]s` +comment_issue=`commented on issue %s#%[2]s` create_pull_request=`created pull request %s#%[2]s` close_pull_request=`closed pull request %s#%[2]s` reopen_pull_request=`reopened pull request %s#%[2]s` -comment_issue=`commented on issue %s#%[2]s` merge_pull_request=`merged pull request %s#%[2]s` -transfer_repo=transfered repository %s to %s +create_branch=created new branch %[3]s at %[4]s +delete_branch=deleted branch %[2]s at %[3]s push_tag=pushed tag %[2]s to %[3]s -compare_commits=View comparison for these %d commits +delete_tag=deleted tag %[2]s at %[3]s +fork_repo=forked a repository to %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror [tool] ago=sedan @@ -1191,10 +1424,11 @@ months=%d månader %s years=%d år %s raw_seconds=sekunder raw_minutes=minuter +raw_hours=hours [dropzone] default_message=Drop files here or click to upload. invalid_input_type=You can't upload files of this type. file_too_big=File size ({{filesize}} MB) exceeds maximum size ({{maxFilesize}} MB). -remove_file=Remove file +remove_file=Ta bort fil diff --git a/conf/locale/locale_tr-TR.ini b/conf/locale/locale_tr-TR.ini index 3470126715c..7b78c8a8c65 100644 --- a/conf/locale/locale_tr-TR.ini +++ b/conf/locale/locale_tr-TR.ini @@ -9,7 +9,6 @@ sign_out=Çıkış Yap sign_up=Kaydol register=Üye Ol website=Web sitesi -version=Sürüm page=Sayfa template=Şablon language=Dil @@ -44,23 +43,27 @@ issues=Sorunlar cancel=İptal +[status] +page_not_found=Sayfa Bulunamadı +internal_server_error=İç Sunucu Hatası. + [install] install=Kurulum title=İlk Kez Çalıştırma İçin Kurulum Adımları docker_helper=Gogs'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=Gogs MySQL, PostgreSQL, SQLite3 veya TiDB gerektirir. +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title=Veritabanı Ayarları db_type=Veritabanı Türü host=Sunucu user=Kullanıcı password=Parola db_name=Veritabanı Adı +db_schema=Schema 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. +sqlite_helper=SQLite3 veritabanının dosya yolu.
Lütfen hizmete başladığınızda kesin yolu kullanın. +err_empty_db_path=SQLite3 veritabanının yolu boş olamaz. 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. @@ -75,12 +78,17 @@ 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. +use_builtin_ssh_server=Yerleşik SSH sunucusu kullanın +use_builtin_ssh_server_popup=Git işlemlerinde SSH sunucusundan sistem SSH arka plan programından ayrılmaya başlayı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. +enable_console_mode=Konsol Modunu Etkinleştir +enable_console_mode_popup=Dosya moduna ek olarak , ayrıca konsolun günlüklerini yazdır. +default_branch=Default Branch optional_title=İsteğe Bağlı Ayarlar email_title=E-Posta Servisi Ayarları @@ -96,8 +104,8 @@ 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=Enable Federated Avatars Lookup -federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +federated_avatar_lookup=Birleşmiş Kişi Simgesi Aramasını Etkinleştir +federated_avatar_lookup_popup=Libravatar'a dayalı birleşmiş açık kaynaklı hizmeti kullanmak için birleşmiş avatarlar aramasını etkinleştirin. disable_registration=Kendi Kendine Kaydolmayı Devre Dışı Bırak disable_registration_popup=Kullanıcının kendi kendine kaydolmasını devre dışı bırak, yalnızca yönetici yeni hesaplar oluşturabilir. enable_captcha=Captcha'yı Etkinleştir @@ -116,7 +124,10 @@ sqlite3_not_available=Yayın sürümünüz SQLite3'ü desteklemiyor, lütfen %s' 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 +smtp_host_missing_port=SMTP ana makine adresindeki bağlantı noktası eksik. +invalid_smtp_from=SMTP form alanı geçerli değil: %v save_config_failed=Yapılandırma kaydedilemedi: %v +init_failed=Uygulama başlatılamadı: %v invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v install_success=Merhaba! Gogs'u tercih ettiğiniz için çok mutluyuz, keyfini çıkarın! invalid_log_root_path=Günlük kök dizini geçersiz: %v @@ -137,6 +148,7 @@ issues.in_your_repos=Depolarınızda [explore] repos=Depolar users=Kullanıcılar +organizations=Organizasyonlar search=Ara [auth] @@ -145,6 +157,8 @@ register_hepler_msg=Bir hesabınız var mı? Şimdi giriş yapın! social_register_hepler_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ı. +auth_source=Yetkilendirme Kaynağı +local=Yerel remember_me=Beni Hatırla forgot_password=Parolamı Unuttum forget_password=Parolanızı mı unuttunuz? @@ -156,7 +170,6 @@ prohibit_login_desc=Hesabınızla oturum açmanız yasaklanmış, lütfen site y 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ş. @@ -164,6 +177,14 @@ reset_password_helper=Parolanızı sıfırlamak için buraya tıklayın password_too_short=Parola uzunluğu 6 karakterden az olamaz. non_local_account=Yerel olmayan hesapların şifrelerini Gogs aracılığıyla değiştiremezsiniz. +login_two_factor=İki aşamalı doğrulama +login_two_factor_passcode=Kimlik doğrulama Şifre kodu +login_two_factor_enter_recovery_code=İki faktörlü kurtarma kodu girin +login_two_factor_recovery=İki faktörlü Kurtarma +login_two_factor_recovery_code=Kurtarma kodu +login_two_factor_enter_passcode=İki faktörlü şifre kodu girin +login_two_factor_invalid_recovery_code=Kurtarma kodu kullanılmış veya geçerli değil. + [mail] activate_account=Lütfen hesabınızı aktifleştirin activate_email=E-posta adresinizi doğrulayın @@ -189,16 +210,17 @@ TeamName=Takım ismi AuthName=Yetkilendirme adı AdminEmail=Yönetici e-postası -NewBranchName=New branch name -CommitSummary=Commit summary -CommitMessage=Commit message -CommitChoice=Commit choice +NewBranchName=Yeni bölüm adı +CommitSummary=İşleme özeti +CommitMessage=İşleme mesajı +CommitChoice=İşleme tercihi TreeName=Dosya yolu -Content=Content +Content=İçerik 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.` +alpha_dash_error=` geçerli karakter, sayısal veya tire(-_) olmalı.` +alpha_dash_dot_error=` geçerli karakter, sayısal, tire(-_) veya nokta olmalı.` +alpha_dash_dot_slash_error=` geçerli alfa veya sayısal veya uzunçizgi(-_) veya nokta karakterler veya eğiz çizgi olmalıdır.` 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.` @@ -215,6 +237,7 @@ 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ı. +auth_source_mismatch=Seçilen kimlik doğrulama kaynağı kullanıcı ile ilişkili değil. 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. @@ -242,19 +265,18 @@ 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. +form.name_not_allowed=Kullanıcı adı veya %q desenine izin verilmiyor. [settings] profile=Profil password=Parola avatar=Avatar ssh_keys=SSH Anahtarları -social=Sosyal Medya Hesapları -applications=Uygulamalar +security=Güvenlik +repos=Depolar orgs=Organizasyonlar +applications=Uygulamalar 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. @@ -269,8 +291,8 @@ change_username_prompt=Bu değişiklik, hesabınızla ilişkili olan bağlantıl continue=Devam Et cancel=İptal -lookup_avatar_by_mail=Lookup Avatar by mail -federated_avatar_lookup=Federated Avatar Lookup +lookup_avatar_by_mail=E-postaya göre Avatar Arama +federated_avatar_lookup=Birleşmiş Avatar Araması enable_custom_avatar=Özel Avatarı Etkinleştir choose_new_avatar=Yeni Avatar Seç update_avatar=Avatar Ayarlarını Güncelle @@ -295,6 +317,7 @@ 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! +email_deletion_primary=Cannot delete primary email address. 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. @@ -320,14 +343,36 @@ 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ı. +two_factor=İki faktörlü Kimlik doğrulama +two_factor_status=Durum: +two_factor_on=Açık +two_factor_off=Kapalı +two_factor_enable=Etkin +two_factor_disable=Devre dışı +two_factor_view_recovery_codes=Görüntüle ve güvenli bir yere kurtarma kodlarınızı kaydedin. Eğer kimlik doğrulama uygulamanız için erişimi kaybetmişseniz bunları şifre kodu olarak kullanabilirsiniz. +two_factor_http=HTTP/HTTPS işlemleri için , artık düz kullanıcı adı ve şifre kullanamazsınız. Lütfen oluşturun ve Kişisel Erişim Jetonu kimlik belgesi olarak kullanın , örneğin %[3]s. +two_factor_enable_title=İki faktörlü Kimlik doğrulamasını Etkinleştir +two_factor_scan_qr=Lütfen resmi taramak için kimlik doğrulama uygulamanızı kullanın: +two_factor_or_enter_secret=Veya parola girin: +two_factor_then_enter_passcode=Daha sonra şifre kodunu girin: +two_factor_verify=Doğrula +two_factor_invalid_passcode=Girdiğiniz şifre kodu geçersiz,lütfen tekrar deneyin! +two_factor_reused_passcode=Girdiğiniz şifre zaten kullanılmış, lütfen başka bir tane deneyin! +two_factor_enable_error=İki faktörlü kimlik doğrulama etkinleştirmesi başarısız :%v +two_factor_enable_success=Hesabınız için iki faktörlü kimlik doğrulama başarıyla devre dışı bırakıldı! +two_factor_recovery_codes_title=İki faktörlü Kimlik doğrulama Kurtarma Kodları +two_factor_recovery_codes_desc=Kurtarma kodları , geçici olarak kimlik doğrulama uygulamanızın erişimini kaybettiğinizde kullanıldı. Herbir kurtarma kodu sadece birkez kullanılablir,lütfen bu kodları güvenli bir yere sakla. +two_factor_regenerate_recovery_codes=Kurtarma Kodlarını Yeniden oluştur +two_factor_regenerate_recovery_codes_error=Kurtarma kodları yeniden oluşturma başarısız: %v +two_factor_regenerate_recovery_codes_success=Yeni kurtarma kodları başarıyla oluşturuldu! +two_factor_disable_title=İki faktörlü Kimlik doğrulama Devre dışı +two_factor_disable_desc=Hesap güvenliği seviyeniz, devre dışı bırakılmış iki faktörlü kimlik doğrulamadan sonra azalacaktır. Devam etmek istiyor musunuz? +two_factor_disable_success=İki faktörlü kimli doğrulama başarıyla devre dışı bırakı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ı, Gogs API'lerine erişimde kullanılabilir. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. 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 @@ -336,6 +381,16 @@ 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! +token_name_exists=Aynı ada sahip simge zaten var. + +orgs.none=Hiçbir organizasyonların üyesi değilsiniz. +orgs.leave_title=Organizasyondan ayrıl +orgs.leave_desc=Organizasyondan ayrıldıktan sonra tüm depolar ve ekiplere erişimi kaybedeceksiniz.Devam etmek istiyor musunuz? + +repos.leave=Ayrıl +repos.leave_title=Depodan ayrıl +repos.leave_desc=Çıktıktan sonra depo erişimini kaybedeceksiniz.Devam etmek istiyor musunuz? +repos.leave_success='%s' deposundan başarıyla ayrıldınız! delete_account=Hesabınızı Silin delete_prompt=Bu işlem hesabınızı kalıcı olarak silecektir ve GERİ ALINAMAZ! @@ -348,7 +403,9 @@ 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 +unlisted=Unlisted visiblity_helper=Bu depo Özel +unlisted_helper=This repository is Unlisted 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! @@ -357,7 +414,7 @@ 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 -repo_gitignore_helper=Select .gitignore templates +repo_gitignore_helper=.gitignore şablonlarını seç license=Lisans license_helper=Bir lisans dosyası seçin readme=Benioku @@ -370,28 +427,30 @@ 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. -mirror_last_synced=Last Synced +mirror_last_synced=Son Eşzamanlama watchers=İzleyenler stargazers=Yıldızlayanlar forks=Çatallamalar +repo_description_helper=Depo açıklaması. Maksimum 512 karakter uzunluğu. +repo_description_length=Mevcut karakterler 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. +form.name_not_allowed=Depo adı veya %q desenine izin verilmiyor. need_auth=Yetkilendirme Gereklidir migrate_type=Göç Türü migrate_type_helper=Bu depo bir yansı olacaktır migrate_repo=Depoyu Göç Ettir migrate.clone_address=Klon Adresi -migrate.clone_address_desc=Bu bağlantı HTTP/HTTPS/GIT veya yerel bir sunucu yolu olabilir. +migrate.clone_address_desc=Bu HTTP/HTTPS/GIT URL'si olabilir. +migrate.clone_address_desc_import_local=Bir depoyu yerel sunucu yolu ile taşımanıza izin verilir. migrate.permission_denied=Yerel depoları içeri aktarma izniniz yok. migrate.invalid_local_path=Geçersiz yerel dizin! Böyle bir yol yok ya da bir dizin değil. +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=Göç başarısız: %v mirror_from=şunun yansıması forked_from=şundan çatallanmış -fork_from_self=Sahibi olduğunuz bir depoyu çatallayamazsınız! copy_link=Kopyala copy_link_success=Kopyalandı! copy_link_error=Kopyalamak için ⌘-C veya Ctrl-C tuşlarına basın @@ -407,9 +466,9 @@ 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! +bare_message=Bu depo henüz hiçbir içeriğe sahip değil. -code=Kod +files=Dosyalar branch=Dal tree=Ağaç filter_branch_and_tag=Dal veya biçim imini filtrele @@ -420,51 +479,65 @@ pulls=Değişiklik İstekleri labels=Etiketler milestones=Kilometre Taşları commits=İşlemeler +git_branches=Bölümler releases=Sürümler file_raw=Ham file_history=Geçmiş file_view_raw=Ham Görünüm file_permalink=Kalıcı Bağlantı file_too_large=Bu dosya sergilenmek için çok büyük - -editor.new_file=New file -editor.upload_file=Upload file +video_not_supported_in_browser=Tarayıcınız HTML5 video etkiketini desteklemiyor. + +branches.overview=Genel görünüm +branches.active_branches=Aktif Bölümler +branches.stale_branches=Eskimiş Bölümler +branches.all=Bütün Bölümler +branches.updated_by=%[2]s tarafından %[1]s güncellendi +branches.change_default_branch=Varsayılan Bölümü Değiştir +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=Yeni dosya +editor.upload_file=Dosyayı yükle editor.edit_file=Dosya düzenle -editor.preview_changes=Preview Changes +editor.preview_changes=Değişiklikleri Önizle editor.cannot_edit_non_text_files=Metin dışı dosyalar düzenlenemez -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 -editor.delete_this_file=Delete this file -editor.must_have_write_access=You must have write access to make or propose changes to this file -editor.file_delete_success=File '%s' has been deleted successfully! -editor.name_your_file=Name your file... -editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. -editor.or=or +editor.edit_this_file=Bu dosyayı düzenle +editor.must_be_on_a_branch=Bu dosyada değişiklik yapmak için bir bölümde olmalısınız. +editor.fork_before_edit=Dosyayı düzenlemeden önce bu depoyu iki kola ayırmalısınız +editor.delete_this_file=Bu dosyayı sil +editor.must_have_write_access=Bu dosyada değişiklik yapmak için yazma erişiminizin olması gerekir. +editor.file_delete_success=%s dosyası başarıyla silindi! +editor.name_your_file=Dosyanızın adı... +editor.filename_help=Dizin eklemek için, dizini yazın ve / tuşuna basın. Bir dizini kaldırmak için alanın başına gidin ve geri tuşuna basın. +editor.or=veya editor.cancel_lower=iptal -editor.commit_changes=Commit Changes -editor.add_tmpl=Add '%s/' -editor.add=Add '%s' -editor.update=Update '%s' -editor.delete=Delete '%s' -editor.commit_message_desc=Add an optional extended description... -editor.commit_directly_to_this_branch=Commit directly to the %s branch. -editor.create_new_branch=Create a new branch for this commit and start a pull request. -editor.new_branch_name_desc=New branch name... +editor.commit_changes=Değişiklikleri İşle +editor.add_tmpl='%s/' ekle +editor.add='%s' ekle +editor.update='%s' güncelle +editor.delete='%s' sil +editor.commit_message_desc=İsteğe bağlı genişletilmiş açıklama ekleyin ... +editor.commit_directly_to_this_branch=Doğrudan %s şubesine geçin. +editor.create_new_branch=Bu taahhüt ve çekme isteği başlatmak için.yeni şube oluşturma. +editor.new_branch_name_desc=Yen şube adı... editor.cancel=İptal -editor.filename_cannot_be_empty=Filename cannot be empty. -editor.branch_already_exists=Branch '%s' already exists in this repository. -editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. -editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. -editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. -editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. -editor.file_already_exists=A file with name '%s' already exists in this repository. -editor.no_changes_to_show=There are no changes to show. -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.filename_cannot_be_empty=Dosya adı boş olmamalı. +editor.branch_already_exists='% s ' Şubesi bu depoda zaten var. +editor.directory_is_a_file=Üst yoldaki '% s' girişi, bu depoda bir dizini olmayan dosyadır. +editor.file_is_a_symlink='%s' dosyası, web editöründen değiştirilemeyen bir sembolik bağ. +editor.filename_is_a_directory=Dosya adı '%s' bu depoda mevcut bir dizindir. +editor.file_editing_no_longer_exists=Düzenlediğiniz dosya '%s' artık depoda yok. +editor.file_changed_while_editing=Düzenlemeye başladıktan sonra dosya içeriği değiştirildi. Ne değiştiğini görmek içinBuraya tıklayınBu değişikliklerin üzerine yazmak için.yeniden yürütmeye basın. +editor.file_already_exists='% s ' adlı bir dosya mevcutta zaten var. +editor.no_changes_to_show=Gösterilecek bir değişiklik mevcut değil. +editor.fail_to_update_file='%s' dosyası güncellenemedi / oluşturulamadı : %v hatasıyla +editor.fail_to_delete_file='%s' dosyası hatalı bir şekilde silinemedi: %v +editor.add_subdir=Alt dizin Ekle... +editor.unable_to_upload_files='%s' dosyası yüklenemedi : %v hatasıyla +editor.upload_files_to_dir=Dosyaları '%s' ye yükle + +commits.commit_history=Geçmişin Kaydedilmesi commits.commits=İşlemeler commits.search=İşleme Arama commits.find=Bul @@ -490,11 +563,11 @@ 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.title=Load a predefined set of labels -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.helper=Select a label set +issues.label_templates.title=Önceden tanımlanmış bir etiket kümesi yükleyin +issues.label_templates.info=Henüz etiket yok. Yeni etiket oluşturmak için aşağıdaki "Yeni Etiket" düğmesine tıklayabilir veya aşağıda önceden tanımlanmış bir kümeyi kullanabilirsiniz. +issues.label_templates.helper=Bir etiket seti seçin issues.label_templates.use=Use this label set -issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v +issues.label_templates.fail_to_load_file=Etiket şablon dosyası '%s' yüklenemedi: %v hatasıyla issues.open_tab=%d açık issues.close_tab=%d kapanmış issues.filter_label=Etiket @@ -536,7 +609,7 @@ issues.commit_ref_at=`%[2]s işlemesinde bu soru issues.poster=Poster issues.collaborator=Katkıcı issues.owner=Sahibi -issues.sign_in_require_desc=Sign in to join this conversation. +issues.sign_in_require_desc=Giriş yap bu konuşmaya katılmak için. issues.edit=Düzenle issues.cancel=İptal issues.save=Kaydet @@ -551,8 +624,8 @@ 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ı -issues.attachment.open_tab=`Click to see "%s" in a new tab` -issues.attachment.download=`Click to download "%s"` +issues.attachment.open_tab=` "%s '' yi yeni bir sekmede görmek için tıklayın ` +issues.attachment.download=`"%s" yi İndirmek için tıklayın ` pulls.new=Yeni Değişiklik İsteği pulls.compare_changes=Değişiklikleri Karşılaştır @@ -562,6 +635,7 @@ pulls.compare_compare=karşılaştır pulls.filter_branch=Dal filtrele pulls.no_results=Sonuç bulunamadı. pulls.nothing_to_compare=Karşılaştırılacak hiçbir şey yok, çünkü temel ve ana dal aynı. +pulls.nothing_merge_base=Karşılaştırılacak bir şey yok çünkü iki şubenin tarihi tamamen farklı. pulls.has_pull_request=`Bu iki hedef için zaten bir değişiklik isteği var: %[2]s#%[3]d` pulls.create=Değişiklik İsteği Oluştur pulls.title_desc=%[3]s içindeki %[2]s işlemelerini %[1]d ile birleştirmek istiyor @@ -577,8 +651,13 @@ pulls.is_checking=Çakışma kontrolü sürüyor. Lütfen birkaç dakika içinde 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.create_merge_commit=Birleştirme işlemi oluşturma +pulls.rebase_before_merging=Birleştirmeden önce yenidenreferans al +pulls.commit_description=Taahhüt Açıklaması 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.` +pulls.delete_branch=Şubeyi Sil +pulls.delete_branch_has_new_commits=Birleşmeden sonra yeni taahhütlere sahip olduğu için şube silinemez. milestones.new=Yeni Kilometre Taşı milestones.open_tab=%d Açık @@ -629,31 +708,61 @@ settings.collaboration.admin=Yönetici settings.collaboration.write=Yaz settings.collaboration.read=Oku settings.collaboration.undefined=Belirsiz +settings.branches=Şubeler +settings.branches_bare=Korunmasız depo için şubeleri yönetemezsiniz. Önce bir miktar içeriği itin. +settings.default_branch=Varsayılan Şube +settings.default_branch_desc=Varsayılan şube , kod taahütleri, çekme talepleri ve çevrimiçi düzenleme için "temel" şube olarak kabul edilir. +settings.update=Güncelle +settings.update_default_branch_unsupported=Varsayılan şubeyi değiştir , sunucu üzerindeki Git sürüm tarafından desteklenmiyor. +settings.update_default_branch_success=Bu deponun varsayılan şubesi başarıyla güncellendi! +settings.protected_branches=Korunan Şubeler +settings.protected_branches_desc=Şubeleri zorla bastırma, yanlışlıkla silme ve beyaz liste kod belirleyicilerine karşı koruyun. +settings.choose_a_branch=Şube seç... +settings.branch_protection=Şube Koruma +settings.branch_protection_desc=Şube için koruma seçeneklerini seçiniz %s. +settings.protect_this_branch=Bu şubeyi koru +settings.protect_this_branch_desc=Kuvveti devre dışı bırak ve silinmesini önler. +settings.protect_require_pull_request=Doğrudan itmek yerine istek istemek gereklidir +settings.protect_require_pull_request_desc=Bu şubeye doğrudan itmeyi devre dışı bırakmak için bu seçeneği etkinleştirin. Komiteler korunmayan bir başka şubeye ittirilmeli ve çekme talebi vasıtasıyla bu şubeye birleştirilmelidir. +settings.protect_whitelist_committers=Beyaz liste , bu şubeye kim itebilir +settings.protect_whitelist_committers_desc=Bu şubeye doğrudan itilen beyaz listeye kişi veya ek ekleyin. Beyaz listeden atlanılacak olan kullanıcılar çekme isteği kontrolüne ihtiyaç duyar. +settings.protect_whitelist_users=Bu şubeye itebilecek kullanıcılar +settings.protect_whitelist_search_users=Kullanıcıları ara +settings.protect_whitelist_teams=Onların üyelerinin bu şubeye itebilecek takımları +settings.protect_whitelist_search_teams=Takımları ara +settings.update_protect_branch_success=Bu şube için koruma seçenekleri başarıyla güncellendi! settings.hooks=Web İstekleri settings.githooks=Git İstekleri settings.basic_settings=Temel Ayarlar -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_settings=Ayna Ayarları +settings.sync_mirror=Şimdi Senkronize Et +settings.mirror_sync_in_progress=Ayna senkronizasyonu devam ediyor, lütfen sayfayı yaklaşık bir dakika içinde yenileyin. settings.site=Resmi Web Sitesi settings.update_settings=Ayarları Güncelle settings.change_reponame_prompt=Bu değişiklik, bağlantıların depoyla olan ilişkisini etkileyecektir. settings.advanced_settings=Gelişmiş Ayarlar settings.wiki_desc=Viki sıstemini etkinleştir -settings.use_internal_wiki=Use builtin wiki +settings.use_internal_wiki=Yerleşik wiki'yi kullanın +settings.allow_public_wiki_desc=Depo özel olduğunda wiki'ye herkesin erişmesine izin ver settings.use_external_wiki=Harici Wiki kullan settings.external_wiki_url=Harici Wiki bağlantısı settings.external_wiki_url_desc=Ziyaretçiler, sekmeye tıkladıklarında bağlantıya yönlendirilecektir. -settings.issues_desc=Enable issue tracker -settings.use_internal_issue_tracker=Use builtin lightweight issue tracker +settings.issues_desc=Sorun izleyiciyi etkinleştir +settings.use_internal_issue_tracker=Yerleşik hafif sorun izleyici kullanma +settings.allow_public_issues_desc=Depo özel olduğunda toplulukların herkese açık olarak erişmesine izin ver settings.use_external_issue_tracker=Harici sorun takipçisi kullan +settings.external_tracker_url=Harici Konu İzleyici URL'si +settings.external_tracker_url_desc=Ziyaretçiler, sekmeye tıkladıklarında bağlantıya yönlendirilecektir. settings.tracker_url_format=Harici Sorun Takipçisi Bağlantı Formatı settings.tracker_issue_style=Harici Hata İzleyicisi Adlandırma Stili: settings.tracker_issue_style.numeric=Sayısal settings.tracker_issue_style.alphanumeric=Alfanumerik settings.tracker_url_format_desc=Kullanıcı adı, depo ismi ve hata indeksi için {kullanıcı} {depo} {indeks} tutucusunu kullanabilirsiniz. -settings.pulls_desc=Herkese açık katkıları kabul etmek için değişiklik isteklerini etkinleştirin +settings.pulls_desc=Depolar ve Şubeler arasındaki katkıları kabul etmek için çekme isteklerini etkinleştir +settings.pulls.ignore_whitespace=Boşluktaki değişiklikleri yoksay +settings.pulls.allow_rebase_merge=Taahhütleri birleştirmek için yeniden tabanın kullanmasına izin ver settings.danger_zone=Tehlike Alanı +settings.cannot_fork_to_same_owner=Bir depoyu orijinal sahibine ayıramazsınız. 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. @@ -672,7 +781,7 @@ 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_2=- Bu işlem, git verileri, sorunlar, yorumlar ve işbirlikçi erişimi de dahil olmak üzere bu depodaki her şeyi kalıcı olarak siler. 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. @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=Kullanıcı, silme işleminden sonra bu depo settings.remove_collaborator_success=Katkıcı silindi. 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. Gogs'ta ne zaman bir şey olsa, hedef belirttiğiniz sunuculara bildirim yapabilecek duruma geliriz. Daha fazla bilgiyi Web İstekleri Kılavuzu'nda bulabilirsiniz. +settings.webhooks.add_new=Yeni bir web istemci ekle: +settings.webhooks.choose_a_type=Bir tür seç... +settings.add_webhook=Web İsteği Ekle 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.redelivery=Yeniden teslimat +settings.webhook.redelivery_success=Kanca görev '%s' teslim kuyruğuna eklenmiştir. Bu tarihte teslim durumunu güncellemek birkaç saniye sürebilir. settings.webhook.request=İstekler settings.webhook.response=Cevaplar settings.webhook.headers=Başlıklar settings.webhook.payload=Yükler settings.webhook.body=Gövde +settings.webhook.err_cannot_parse_payload_url=Yük URL'si ayrıştırılamıyor: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Git istekleri, Git'in kendisi tarafından güçlendirilmiştir. Özel işlemleri gerçekleştirmek için aşağıdaki listedeki desteklenen isteklerin dosyalarını düzenleyebilirsiniz. settings.githook_edit_desc=İstek aktif değilse örnek içerik sunulacaktır. İçeriği boş bırakmak, isteği devre dışı bırakmayı beraberinde getirecektir. settings.githook_name=İstek İsmi @@ -711,6 +825,7 @@ settings.add_webhook_desc=Gogs, meydana gelen olay ile birlikte belirttiğiniz b settings.payload_url=Yük Bağlantısı settings.content_type=İçerik Türü settings.secret=Gizli +settings.secret_desc=Gizli, X-Gogs-Signature başlığı ile SHA256 hmac hexdigest yükü olarak gönderilecektir. settings.slack_username=Kullanıcı Adı settings.slack_icon_url=Simge Bağlantısı settings.slack_color=Renk @@ -720,10 +835,20 @@ settings.event_send_everything=Her şeye ihtiyacım var. settings.event_choose=Neye ihtiyacım olduğunu seçtir. settings.event_create=Oluştur settings.event_create_desc=Dal veya biçim imi oluşturuldu -settings.event_pull_request=Pull Request -settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. +settings.event_delete=Sil +settings.event_delete_desc=Dal veya etiket silindi +settings.event_fork=Çatalla +settings.event_fork_desc=Depo çatallandı settings.event_push=Push settings.event_push_desc=Bir depoya git push +settings.event_issues=Sorunlar +settings.event_issues_desc=Sorun açıldı, kapatıldı, yeniden açıldı, düzenlendi, atandı, atanmadı, etiket güncellendi, etiket silindi, dönüm noktası yapıldı ya da iptal edildi. +settings.event_pull_request=İstek Çek +settings.event_pull_request_desc=Çekme isteği açıldı, kapatıldı, yeniden açıldı, düzenlendi, atandı, atanmamış, etiket güncellendi, etiket silindi, kilometre taşları, dönüm noktası veya senkronize edildi. +settings.event_issue_comment=Sorun Yorumu +settings.event_issue_comment_desc=Konu yorumu eklendi, düzenlendi veya silindi. +settings.event_release=Yayın +settings.event_release_desc=Bir depoda yayınlanan sürüm. 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. @@ -733,10 +858,13 @@ settings.delete_webhook=Web İsteğini Sil settings.recent_deliveries=Son Dağıtımlar settings.hook_type=İstek Türü settings.add_slack_hook_desc=Deponuza Slack entegrasyonunu ekleyin. +settings.add_discord_hook_desc=Deponuza Discord entegrasyonu ekleyin. +settings.add_dingtalk_hook_desc=Deponuza Dingtalk entegrasyonu ekleyin. settings.slack_token=Erişim Anahtarı settings.slack_domain=Alan Adı settings.slack_channel=Kanal settings.deploy_keys=Dağıtım Anahtarları +settings.deploy_keys_helper=Ortak Gotcha! Kişisel ortak anahtarlar eklemek istiyorsanız lütfen bunları hesap ayarlarınıza ekleyin. settings.add_deploy_key=Dağıtım Anahtarı Ekle settings.deploy_key_desc=Dağıtım anahtarlarının yalnızca okuma izni vardır. Kişisel hesapların SSH anahtarlarıyla aynı değillerdir. settings.no_deploy_keys=Herhangi bir dağıtım anahtarı eklemediniz. @@ -748,6 +876,8 @@ 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! +settings.description_desc=Depo açıklaması. Maksimum 512 karakter uzunluğu. +settings.description_length=Mevcut karakterler diff.browse_source=Kaynağa Gözat diff.parent=ebeveyn @@ -766,7 +896,6 @@ release.releases=Sürümler release.new_release=Yeni Sürüm release.draft=Taslak release.prerelease=Ön Sürüm -release.stable=Kararlı release.edit=düzenle release.ahead=%s son sürümden beri %d işleme release.source_code=Kaynak Kodu @@ -813,8 +942,8 @@ team_name_helper=Sohbetlerde bu takımdan bahsetmek için bu ismi kullanacaksın 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. +form.name_not_allowed=Organizasyon adı veya %q desenine izin verilmiyor. +form.team_name_not_allowed=Takım adı veya %q desenine izin verilmiyor. settings=Ayarlar settings.options=Seçenekler @@ -886,12 +1015,19 @@ first_page=İlk last_page=Son total=Toplam: %d +dashboard.build_info=Derleme Bilgisi +dashboard.app_ver=Uygulama sürümü +dashboard.git_version=Git sürümü +dashboard.go_version=Go sürümü +dashboard.build_time=Derleme zamanı +dashboard.build_commit=Derleme işlemesi dashboard.statistic=İstatistik dashboard.operations=İşlemler dashboard.system_status=Sistem İzleme Durumu dashboard.statistic_info=Gogs veritabanında %d kullanıcı, %d organizasyon, %d genel anahtar, %d depo, %d izleme, %d yıldız, %d hareket, %d erişim, %d sorun, %d yorum, %d sosyal hesap, %d takip, %d yansı, %d sürüm, %d giriş kaynağı, %d web isteği, %d kilometre taşı, %d etiket, %d istek görevi, %d takım, %d güncellenmiş görev, %d ek var. dashboard.operation_name=İşlem Adı dashboard.operation_switch=Geç +dashboard.select_operation_to_run=Lütfen çalıştırılacak işlemi seçin 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. @@ -905,8 +1041,8 @@ 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: Gogs'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.resync_all_hooks=Tüm depoların yeniden alımı, güncellemesi ve gönderi alım kancalarını yeniden senkronize et +dashboard.resync_all_hooks_success=Tüm depoların önceden alımı, güncellemesi ve gönderi alımı kancaları başarıyla senkronize edildi. 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. @@ -981,12 +1117,14 @@ repos.private=Özel repos.watches=İzlemeler repos.stars=Yıldızlar repos.issues=Sorunlar +repos.size=Boyut -auths.auth_manage_panel=Yetkilendirme Yönetim Paneli +auths.auth_sources=Yetkilendirme Kaynakları auths.new=Yeni Kaynak Ekle auths.name=İsim auths.type=Tür auths.enabled=Aktifleştirilmiş +auths.default=Varsayılan auths.updated=Güncellendi auths.auth_type=Yetki Türü auths.auth_name=Yetki İsmi @@ -995,15 +1133,21 @@ auths.domain=Alan Adı auths.host=Sunucu auths.port=Port auths.bind_dn=Bağlama DN'i +auths.bind_dn_helper=Kullanıcı adı için yer tutucu olarak '%s' kullanabilirsiniz, Örneğin DOM\%s 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 auths.attribute_username_placeholder=Kullanıcı adı için giriş yapma form alanı kullanmak için boş bırakın. -auths.attribute_name=Ad özelliği +auths.attribute_name=İlk Ad Özelliği auths.attribute_surname=Soyad özelliği auths.attribute_mail=E-posta özelliği +auths.verify_group_membership=Grup üyeliğini doğrula +auths.group_search_base_dn=Grup Arama Tabanı DN +auths.group_filter=Grup Filtresi +auths.group_attribute_contain_user_list=Kullanıcı Listesi İçeren Grup Özelliği +auths.user_attribute_listed_in_group=Grupta Listelenen Kullanıcı Özelliği auths.attributes_in_bind=Bağlı DN tabanındaki özellikleri çek auths.filter=Kullanıcı Filtresi auths.admin_filter=Yönetici Filtresi @@ -1017,9 +1161,9 @@ 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.default_auth=Bu kimlik doğrulama varsayılan giriş kaynağıdır 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 @@ -1028,107 +1172,189 @@ 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! +auths.login_source_exist='%s' giriş kaynağı zaten mevcut. +auths.github_api_endpoint=API Uç Noktası +config.not_set=(ayarlı değil) config.server_config=Sunucu Yapılandırması -config.app_name=Uygulama Adı -config.app_ver=Uygulama Sürümü -config.app_url=Uygulama Bağlantısı -config.domain=Alan Adı -config.offline_mode=Çevrim Dışı Modu -config.disable_router_log=Yönlendirici Log'larını Devre Dışı Bırak +config.brand_name=Marka adı config.run_user=Çalıştırma Kullanıcısı config.run_mode=Çalıştırma Modu -config.repo_root_path=Depo Kök Yolu -config.static_file_root_path=Sabit Dosya Kök Yolu -config.log_file_root_path=Log Dosyası Kök Yolu -config.script_type=Betik Türü -config.reverse_auth_user=Tersine Yetkilendirme Kullanıcısı +config.server.external_url=Dış URL +config.server.domain=Alan Adı +config.server.protocol=Protokol +config.server.http_addr=HTTP adresi +config.server.http_port=HTTP portu +config.server.cert_file=Sertifika dosyası +config.server.key_file=Anahtar dosyası +config.server.tls_min_version=En az TLS sürümü +config.server.unix_socket_permission=Unix soket izni +config.server.local_root_url=Yerel kök URL'si +config.server.offline_mode=Çevrimdışı kip +config.server.disable_router_log=Yönlendirici günlüğünü devre dışı bırak +config.server.enable_gzip=Gzip'i etkinleştir +config.server.app_data_path=Uygulama veri yolu +config.server.load_assets_from_disk=Varlıkları diskten yükle +config.server.landing_url=Açılış URL'si 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_port=Port -config.ssh_listen_port=Port'u Dinle -config.ssh_root_path=Kök Yol -config.ssh_key_test_path=Anahtar Test Yolu -config.ssh_keygen_path=Keygen ('ssh-keygen') Yolu -config.ssh_minimum_key_size_check=Minimum Anahtar Uzunluğu Kontrolü -config.ssh_minimum_key_sizes=Minimum Anahtar Uzunlukları +config.ssh.enabled=Etkin +config.ssh.domain=Maruz kalan alan adı +config.ssh.port=Maruz kalan port +config.ssh.root_path=Kök yolu +config.ssh.keygen_path=Keygen yolu +config.ssh.key_test_path=Anahtar test yolu +config.ssh.minimum_key_size_check=En az anahtar boyutu denetimi +config.ssh.minimum_key_sizes=En az anahtar boyutları +config.ssh.rewrite_authorized_keys_at_start=Başlangıçta "yetkili_anahtarlar" ı yeniden yaz +config.ssh.start_builtin_server=Yerleşik sunucuyu başlat +config.ssh.listen_host=Ana makineyi dinle +config.ssh.listen_port=Port'u dinle +config.ssh.server_ciphers=Sunucu şifreleri +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Depo Yapılandırması +config.repo.root_path=Kök yolu +config.repo.script_type=Betik türü +config.repo.ansi_chatset=ANSI karakter kümesi +config.repo.force_private=Özeli zorla +config.repo.max_creation_limit=En fazla oluşturma sınırı +config.repo.preferred_licenses=Tercih edilen lisanslar +config.repo.disable_http_git=HTTP Git'i devre dışı bırak +config.repo.enable_local_path_migration=Yerel yol göçünü etkinleştir +config.repo.enable_raw_file_render_mode=Ham dosya oluşturma modunu etkinleştir +config.repo.commits_fetch_concurrency=İşlemeler eşzamanlılık getirir +config.repo.editor.line_wrap_extensions=Düzenleyici satır kaydırma eklentileri +config.repo.editor.previewable_file_modes=Düzenleyici önizlenebilir dosya modları +config.repo.upload.enabled=Yükleme etkinleştirildi +config.repo.upload.temp_path=Yükleme geçici yolu +config.repo.upload.allowed_types=Yükleme kabul edilebilir türleri +config.repo.upload.file_max_size=Yükleme dosya boyutu sınırı +config.repo.upload.max_files=Yükleme dosya sınırı config.db_config=Veritabanı Yapılandırması -config.db_type=Türü -config.db_host=Sunucu -config.db_name=İsim -config.db_user=Kullanıcı -config.db_ssl_mode=SSL Biçimi -config.db_ssl_mode_helper=(sadece "postgres" için) -config.db_path=Yol -config.db_path_helper=("sqlite3" ve "tidb" için) - -config.service_config=Servis Yapılandırması -config.register_email_confirm=E-posta Onayı Gerekli -config.disable_register=Kaydolma Hizmet Dışı -config.show_registration_button=Kaydolma Tuşunu Göster -config.require_sign_in_view=Oturum Açma Görünümünü İste -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.db.type=Tür +config.db.host=Sunucu +config.db.name=Ad +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=Kullanıcı +config.db.ssl_mode=SSL modu +config.db.ssl_mode_helper=(sadece "postgres" için) +config.db.path=Yol +config.db.path_helper=(sadece "sqlite3" için) +config.db.max_open_conns=En fazla açık bağlantı +config.db.max_idle_conns=En fazla boş bağlantı + +config.security_config=Güvenlik yapılandırması +config.security.login_remember_days=Giriş günlerini hatırla +config.security.cookie_remember_name=Çerezi hatırla +config.security.cookie_username=Kullanıcı adı çerezi +config.security.cookie_secure=Güvenli çerezi etkinleştir +config.security.reverse_proxy_auth_user=Ters proxy kimlik doğrulama başlığı +config.security.enable_login_status_cookie=Giriş durumu çerezini etkinleştir +config.security.login_status_cookie_name=Giriş durumu çerezi +config.security.local_network_allowlist=Local network allowlist + +config.email_config=E-Posta yapılandırması +config.email.enabled=Etkin +config.email.subject_prefix=Konu öneki +config.email.host=Sunucu +config.email.from=Kimden +config.email.user=Kullanıcı +config.email.disable_helo=HELO'yu Devre Dışı Bırak +config.email.helo_hostname=HELO sunucu adı +config.email.skip_verify=Sertifika doğrulamayı atla +config.email.use_certificate=Özel sertifika kullan +config.email.cert_file=Sertifika dosyası +config.email.key_file=Anahtar dosyası +config.email.use_plain_text=Düz metin kullan +config.email.add_plain_text_alt=Düz metin alternatifi ekle +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -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 -config.mailer_disable_helo=HELO'yu Devre Dışı Bırak -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ı -config.oauth_enabled=Aktif +config.session_config=Oturum Yapılandırması +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Önbellek Yapılandırması -config.cache_adapter=Önbellek Uyarlayıcısı -config.cache_interval=Önbellek Aralığı -config.cache_conn=Önbellek Bağlantısı - -config.session_config=Oturum Yapılandırması -config.session_provider=Oturum Sağlayıcı -config.provider_config=Sağlayıcı Yapılandırması -config.cookie_name=Çerez Adı -config.enable_set_cookie=Çerezleri Aktifleştir -config.gc_interval_time=GC Aralık Zamanı -config.session_life_time=Oturum Yaşam Zamanı -config.https_only=Yalnız HTTPS -config.cookie_life_time=Çerez Yaşam Zamanı +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP Yapılandırması +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=Resim Yapılandırması -config.picture_service=Resim Servisi -config.disable_gravatar=Gravatar Hizmet Dışı -config.enable_federated_avatar=Enable Federated Avatars - -config.git_config=Git Configuration -config.git_disable_diff_highlight=Disable Diff Syntax Highlight -config.git_max_diff_lines=Max Diff Lines (for a single file) -config.git_max_diff_line_characters=Max Diff Characters (for a single line) -config.git_max_diff_files=Max Diff Files (to be shown) -config.git_gc_args=GC Arguments -config.git_migrate_timeout=Migration Timeout -config.git_mirror_timeout=Mirror Update Timeout -config.git_clone_timeout=Clone Operation Timeout -config.git_pull_timeout=Pull Operation Timeout -config.git_gc_timeout=GC Operation Timeout +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Web İstekleri Yapılandırması +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Git Yapılandırması +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Farklı dosya sınırı (tek bir fark için) +config.git.gc_args=GC değişkenleri +config.git.migrate_timeout=Göç zaman aşımı +config.git.mirror_timeout=Yansı getirme zaman aşımı +config.git.clone_timeout=Klon zaman aşımı +config.git.pull_timeout=Çekme zaman aşımı +config.git.gc_timeout=GC zaman aşımı + +config.lfs_config=LFS yapılandırması +config.lfs.storage=Depolama +config.lfs.objects_path=Nesnelerin yolu config.log_config=Log Yapılandırması -config.log_mode=Log Modu +config.log_file_root_path=Log Dosyası Kök Yolu +config.log_mode=Mod +config.log_options=Seçenekler monitor.cron=Cron Görevleri monitor.name=İsim @@ -1159,17 +1385,24 @@ notices.delete_success=Sistem bildirimleri başarıyla silindi. create_repo=depo %s oluşturuldu rename_repo=%[1]s olan depo adını %[3]s buna çevirdi commit_repo=%[4]s zamanında %[3]s buraya push yaptı +compare_commits=Bu %d işlemeler için karşılaştırmaları görüntüle +transfer_repo=depo %s %s'a aktarıldı create_issue=`%s#%[2]s sorununu açtı` close_issue=`%s#%[2]s sorununu kapattı` reopen_issue=`%s#%[2]s sorununu tekrar açtı` +comment_issue=`%s#%[2]s sorununa yorum yazdı` create_pull_request=`%s#%[2]s değişiklik isteğini oluşturdu` close_pull_request=`%s#%[2]s değişiklik isteğini kapattı` reopen_pull_request=`%s#%[2]s değişiklik isteğini tekrar açtı` -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ı +create_branch=%[3]s at %[4]s yeni şubesi oluşturuldu +delete_branch=%[2]s 'ın %[3]s şubesi silindi 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 +delete_tag=%[2]s 'ın %[3]s etiketi silindi +fork_repo=%s için bir depo çatalladı +mirror_sync_push=işlemeler yansıdan %[4]s deposundaki dalına eşitlendi +mirror_sync_create=yansıdan yeni %[2]s referansı %[3]s konumuna eşitlendi +mirror_sync_delete=yansıdan %[3]s konumundaki %[2]s referansı eşitlendi ve silindi [tool] ago=önce @@ -1191,6 +1424,7 @@ months=%d ay %s years=%d yıl %s raw_seconds=saniyeler raw_minutes=dakikalar +raw_hours=saat [dropzone] default_message=Dosyaları yüklemek için sürükleyin veya tıklayın. diff --git a/conf/locale/locale_uk-UA.ini b/conf/locale/locale_uk-UA.ini new file mode 100644 index 00000000000..a5347363038 --- /dev/null +++ b/conf/locale/locale_uk-UA.ini @@ -0,0 +1,1434 @@ +app_desc=Зручний сервіс власного Git хостингу + +home=Головна сторінка +dashboard=Панель керування +explore=Огляд +help=Довідка +sign_in=Увійти +sign_out=Вийти +sign_up=Реєстрація +register=Реєстрація +website=Вебсторінка +page=Сторінка +template=Шаблон +language=Мова +create_new=Створити... +user_profile_and_more=Профіль користувача та інше +signed_in_as=Увійшов як + +username=Ім'я користувача +email=Електронна пошта +password=Пароль +re_type=Повторіть +captcha=CAPTCHA + +repository=Репозиторій +organization=Організація +mirror=Дзеркало +new_repo=Новий репозиторій +new_migrate=Нова міграція +new_mirror=Нове дзеркало +new_fork=Нове відгалудження +new_org=Нова організація +manage_org=Керування організаціями +admin_panel=Панель адміністратора +account_settings=Налаштування облікового запису +settings=Налаштування +your_profile=Ваш профіль +your_settings=Ваші налаштування + +activities=Дії +pull_requests=Запити на злиття +issues=Проблеми + +cancel=Скасувати + +[status] +page_not_found=Сторінку не знайдено +internal_server_error=Внутрішня помилка серверу + +[install] +install=Установка +title=Кроки установки перед першим запуском +docker_helper=Якщо ви запускаєте Gogs всередені Docker, уважно прочитайте гайдлайни перш ніж змінювати щось! +requite_db_desc=Gogs потребує MySQL, PostgreSQL, SQLite3 або TiDB (за допомогою MySQL протоколу). +db_title=Налаштування бази даних +db_type=Тип бази данних +host=Хост +user=Користувач +password=Пароль +db_name=Ім'я бази даних +db_schema=Схема +db_helper=Будь ласка, використовуйте MySQL як INNODB з таблицею символів utf8_general_ci. +ssl_mode=Режим SSL +path=Шлях +sqlite_helper=Шлях до файла бази даних SQLite3.
Будь ласка, використовуйте абсолютний шлях коли стартуєте сервіс. +err_empty_db_path=Шлях до файла бази даних SQLite3 не може бути порожнім. +no_admin_and_disable_registration=Ви не можете заборонити реєстрацію без створення облікового запису адміністратора. +err_empty_admin_password=Пароль адміністратора не може бути пустим. + +general_title=Загальні налаштування Gogs +app_name=Назва програми +app_name_helper=Вкажіть назву вашої організації, величну та звучну! +repo_path=Кореневий шлях репозиторія +repo_path_helper=До цього каталогу буде збережено всі зовнішні сховища Git. +run_user=Запустити як +run_user_helper=Користувач мусить мати доступ до кореню репозиторіїв та право на запуск Gogs. +domain=Домен +domain_helper=Це впливає на клонування через SSH. +ssh_port=SSH порт +ssh_port_helper=Номер порту, який використовує SSH сервер. Для заборони опції SSH залиште його порожнім. +use_builtin_ssh_server=Користуватися вбудованим SSH сервером +use_builtin_ssh_server_popup=Запустити вбудований SSH сервер для операцій git інакший за системний SSH демон. +http_port=Порт HTTP +http_port_helper=Номер порту який программа буде слухати. +app_url=Адреса програми +app_url_helper=Це впливає на клонування URL через HTTP/HTTPS та десь в електронній пошті. +log_root_path=Шлях до лог файлу +log_root_path_helper=Каталог для файлів журналу. +enable_console_mode=Увімкнути консольний режим +enable_console_mode_popup=На додаток до файлового режиму писати логи також і до консолі. +default_branch=Гілка за замовчуванням + +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_avatar_lookup_popup=Ввімкніть пошук федеративного аватара для використання федеративної служби з відкритим вихідним кодом на основі libravatar. +disable_registration=Вимкнути самостійну реєстрацію +disable_registration_popup=Вимкнути самостійну реєстрацію користувачів, тільки адміністратор може створювати облікові записи. +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=Пароль +confirm_password=Підтвердження паролю +admin_email=Електронна пошта адміністратора +install_gogs=Встановити Gogs +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 +smtp_host_missing_port=В адресі SMTP-хосту не вистачає порту. +invalid_smtp_from=Невалідне SMTP поле Від: %v +save_config_failed=Не в змозі зберегти конфігурацію: %v +init_failed=Не вдалося ініціалізувати додаток: %v +invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v +install_success=Вітаємо! Ми раді, що ви обрали Gogs, отримуйте задоволення і будьте обережні. +invalid_log_root_path=Шлях до лог файлу хибний: %v + +[home] +uname_holder=Ім'я користувача або електронна пошта +password_holder=Пароль +switch_dashboard_context=Змінити дошку +my_repos=Мої репозиторії +show_more_repos=Показати більше репозиторіїв... +collaborative_repos=Спільні репозиторії +my_orgs=Мої організації +my_mirrors=Мої дзеркала +view_home=Переглянути %s + +issues.in_your_repos=В ваших репозиторіях + +[explore] +repos=Сховища +users=Користувачі +organizations=Організації +search=Пошук + +[auth] +create_new_account=Створити новий обліковий запис +register_hepler_msg=Вже зареєстровані? Увійдіть зараз! +social_register_hepler_msg=Вже зареєстровані? Прив'яжіть зараз! +disable_register_prompt=Вибачте, реєстрація відключена. Будь ласка, зв'яжіться з адміністратором сайту. +disable_register_mail=На жаль, підтвердження реєстрації на електрону пошту вимкнено адміністратором. +auth_source=Джерело автентифікації +local=Локальний +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=Натисніть тут, щоб вислати активаційне електроне поштове повідомлення знову +send_reset_mail=Натисніть тут, щоб відправити скидання пароля на електронну пошту +reset_password=Скинути пароль +invalid_code=На жаль, код підтвердження, закінчився або помилковий. +reset_password_helper=Натисніть тут для скидання пароля +password_too_short=Довжина пароля не може бути меншою за 6. +non_local_account=Нелокальні облікові записи не можуть змінити пароль через Gogs. + +login_two_factor=Двофакторна автентифікація +login_two_factor_passcode=Код аутентифікації +login_two_factor_enter_recovery_code=Введіть двофакторний код відновлення +login_two_factor_recovery=Двофакторне відновлення +login_two_factor_recovery_code=Код відновлення +login_two_factor_enter_passcode=Введіть двофакторний код +login_two_factor_invalid_recovery_code=Код відновлення не валідний, або його вже було використано. + +[mail] +activate_account=Будь ласка, активуйте ваш обліковий запис +activate_email=Перевірте свою електронну адресу +reset_password=Скидання пароля +register_success=Реєстрація пройшла успішно, ласкаво просимо +register_notify=Ласкаво просимо на борту + +[modal] +yes=Так +no=Ні +modify=Змінити + +[form] +UserName=Ім'я користувача +RepoName=Ім'я сховища +Email=Адреса електронної пошти +Password=Пароль +Retype=Введіть пароль ще раз +SSHTitle=Iм'я SSH ключа +HttpsUrl=Адреса HTTPS +PayloadUrl=URL обробника +TeamName=Назва команди +AuthName=Назва авторизації +AdminEmail=Електронна пошта адміністратора + +NewBranchName=Ім'я нової гілки +CommitSummary=Резюме коміту +CommitMessage=Повідомлення коміту +CommitChoice=Зафіксувати вибір +TreeName=Шлях до файлу +Content=Вміст + +require_error=' не може бути пустим.' +alpha_dash_error=` має складатись з буков, цифр, або рисок(-_).` +alpha_dash_dot_error=` має складатись з буков, цифр, рисок(-_), або крапок.` +alpha_dash_dot_slash_error=` мусить бути валідною буквою, або цифрою, або рискою(-_), або крапкою, або слешем.` +size_error=` має мати розмір %s.` +min_size_error=' має містити принаймні %s символів.' +max_size_error=' має містити принаймні %s символів.' +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=Ім'я користувача або пароль помилкові. +auth_source_mismatch=Обране джерело автентифікації не асоційовано з користувачем. +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=Gogs не вдалося перевірити ключ SSH, але ми припускаємо, що він є правильним, тому будь-ласка переконайтеся в цьому самостійно. +auth_failed=Помилка автентифікації: %v + +still_own_repo=Ви досі є власником репозиторія, тому ви повинні видалити або перемістити його. +still_has_org=Ви досі є членом організаціі, тому ви повинні або покинути або видалити її. +org_still_own_repo=Ця організація досі є власником сховища, тому ви повинні видалити або перемістити його. + +target_branch_not_exist=Цільової гілки не існує + +[user] +change_avatar=Змінити свій аватар +join_on=Приєднався +repositories=Репозиторії +activity=Публічна активність +followers=Підписники +starred=Відмічене +following=Слідкувати +follow=Підписатися +unfollow=Відписатися + +form.name_not_allowed=Ім'я користувача чи шаблон %q не допускаються. + +[settings] +profile=Профіль +password=Пароль +avatar=Аватар +ssh_keys=Ключі SSH +security=Безпека +repos=Репозиторії +orgs=Організації +applications=Додатки +delete=Видалити обліковий запис + +public_profile=Загальнодоступний профіль +profile_desc=Ваша адреса електронної пошти є публічною і буде використовуватися для будь-яких повідомлень щодо вашого облікового запису і будь-яких веб-операцій, що здійснюються через сайт. +password_username_disabled=Нелокальні користувачі не можуть змінити своє ім'я користувача. +full_name=Повне ім'я +website=Веб-сторінка +location=Місце знаходження +update_profile=Оновити профіль +update_profile_success=Ваш профіль було успішно оновлено. +change_username=Ім'я користувача змінено +change_username_prompt=Ця зміна вплине на посилання, що відносяться до вашого облікового запису. +continue=Продовжити +cancel=Скасувати + +lookup_avatar_by_mail=Знайти аватар за адресою ел. пошти +federated_avatar_lookup=Знайти зовнішній аватар +enable_custom_avatar=Увімкнути користувацькі зображення користувача +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=Управління адресами електронної пошти +email_desc=Ваша основна адреса електронної пошти використовуватиметься для сповіщення та інших операцій. +primary=Головний +primary_email=Встановити головним +delete_email=Видалити +email_deletion=Видалення електронної пошти +email_deletion_desc=Видалення цієї електронної адреси призведе до вилучення інформації, пов'язаної з вашим обліковим записом. Ви бажаєте продовжити? +email_deletion_success=Електронну адресу успішно видалено! +email_deletion_primary=Не вдається видалити основну адресу електронної пошти. +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=Цей жетон використовувався в останні 7 днів + +two_factor=Двофакторна автентифікація +two_factor_status=Статус: +two_factor_on=Вкл. +two_factor_off=Викл. +two_factor_enable=Увімкнути +two_factor_disable=Вимкнути +two_factor_view_recovery_codes=Перегляньте й збережіть ваші ключі відновлення у безпечному місці. Ви можете використовувати іх як паролі якщо втратите доступ до вашої програми автентифікації. +two_factor_http=Для HTTP/HTTPS операцій, ви більше не можете використовувати звичайні ім'я та пароль. Будь ласка створіть та використовуйте персональний жетон доступу як ваші облікові дані, наприклад %[3]s. +two_factor_enable_title=Увімкнути двофакторну автентифікацію +two_factor_scan_qr=Будь ласка, використовуйте ваш додаток автентифікації для сканування зображення: +two_factor_or_enter_secret=Або введіть секрет: +two_factor_then_enter_passcode=Потім введіть пароль: +two_factor_verify=Перевірити +two_factor_invalid_passcode=Введений пароль не валідний, будь ласка, спробуйте ще раз! +two_factor_reused_passcode=Введений пасскод вже було використано. Будь ласка, спробуйте інший! +two_factor_enable_error=Увімкнення двофакторної автентифікації не вдалося: %v +two_factor_enable_success=Двофакторну автентифікацію успішно активовано для вашого акаунту! +two_factor_recovery_codes_title=Пароль відновлення для двофакторної автентифікації +two_factor_recovery_codes_desc=Пароль відновлення використовується коли ви тимчасово втрачаєте доступ до вашого додатку автентифікації. Кожен пароль відновлення може бути використаний лише один раз. Будь ласка, тримайте ці паролі у безпечному місці. +two_factor_regenerate_recovery_codes=Перегенерувати паролі відновлення +two_factor_regenerate_recovery_codes_error=Перегенерація паролів відновлення не вдалася: %v +two_factor_regenerate_recovery_codes_success=Нові коди відновлення було успішно сгенеровано! +two_factor_disable_title=Вимкнути двофакторну автентифікацію +two_factor_disable_desc=Рівень безпеки вашого акаунту знизиться після вимикання двофакторної автентифікаціЇ. Бажаєте продовжити? +two_factor_disable_success=Двофакторну автентифікацію було успішно вимкнено! + +manage_access_token=Керувати жетонами особистого доступу +generate_new_token=Генерувати новий жетон +tokens_desc=Створені вами жетони для доступу до Gogs API. +access_token_tips=Персональний жетон доступу може бути використаний як ім'я користувача або пароль. Рекомендується використовувати "x-access-token" як ім'я користувача та персональний жетон доступу, що є паролем для додатків gt. +new_token_desc=На цей час будь-який жетон має повний доступ до вашого облікового запису. +token_name=Назва жетону +generate_token=Створити жетон +generate_token_succees=Новий жетон було створено успішно! Переконайтеся, що Ви скопіювали Ваш новий жетон доступу, бо Ви не зможете побачити його знову! +delete_token=Видалити +access_token_deletion=Видалення жетону персонального доступу +access_token_deletion_desc=Видалення цього жетону призведе до неможливості доступу усіх пов’язаних додатків. Продовжити? +delete_token_success=Персональний жетон було видалено. Не забудьте перевірити ваш додаток. +token_name_exists=Жетон з таким ім'ям вже існує. + +orgs.none=Ви не є членом будь-якої організації. +orgs.leave_title=Залишити організацію +orgs.leave_desc=Ви втратите доступ до всіх репозиторіїв і команд після того, як ви покинете організацію. Ви хочете продовжити? + +repos.leave=Покинути +repos.leave_title=Покинути репозиторій +repos.leave_desc=Ви можете втратити доступ до репозиторію після того як покинете його. Бажаєте продовжити? +repos.leave_success=Ви успішно покинули репозиторій '%s'! + +delete_account=Видалити ваш обліковий запис +delete_prompt=Ця операція остаточно видалить обліковий запис, і її НЕМОЖЛИВО буде скасувати! +confirm_delete_account=Підтвердження видалення +delete_account_title=Видалення облікового запису +delete_account_desc=Цей обліковий запис буде видалено без можливості відновлення, ви хочете продовжити? + +[repo] +owner=Власник +repo_name=Назва репозиторію +repo_name_helper=Гарна назва репозиторія зазвичай складається з коротких та унікальних ключових слів, які легко запам'ятати. +visibility=Видимість +unlisted=Поза списком +visiblity_helper=Цей репозиторій є Приватним +unlisted_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=Відгалуження +repo_description_helper=Опис репозиторію. До 512-ти символів довжиною. +repo_description_length=Доступні символи + +form.reach_limit_of_creation=Власник досягнув максимальної кількості у %d створених репозиторіїв. +form.name_not_allowed=Назва репозиторію або шаблон %q не допоскаються. + +need_auth=Потрібна авторизація +migrate_type=Тип міграції +migrate_type_helper=Даний репозиторій буде дзеркалом +migrate_repo=Перенесення репозиторія +migrate.clone_address=Адреса клонування +migrate.clone_address_desc=Це може бути URL-адресою HTTP, HTTPS чи GIT. +migrate.clone_address_desc_import_local=Ви також можете змігрувати репозиторій з локального шляху на сервері. +migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії. +migrate.invalid_local_path=Невірний локальний шлях, він не існує або не є каталогом. +migrate.clone_address_resolved_to_blocked_local_address=Адреса клону розв’язана на адресу локальної мережі, яка неявно заблокована. +migrate.failed=Перенесення не вдалось: %v + +mirror_from=дзеркало +forked_from=відгалужено від +copy_link=Скопіювати +copy_link_success=Скопійовано! +copy_link_error=Натисніть ⌘-C або Ctrl-C, щоб скопіювати +copied=Скопійовано +unwatch=Не стежити +watch=Слідкувати +unstar=Зняти зірку +star=Зірка +fork=Відгалуження + +no_desc=Без опису +quick_guide=Короткий посібник +clone_this_repo=Кнонувати цей репозиторій +create_new_repo_command=Створити новий репозиторій з командного рядка +push_exist_repo=Штовхнути існуючий репозиторій з командного рядка +bare_message=Цей репозиторій ще не має жодного вмісту. + +files=Файли +branch=Гілка +tree=Дерево +filter_branch_and_tag=Фільтрувати гілку або тег +branches=Гілки +tags=Теги +issues=Проблеми +pulls=Запити на злиття +labels=Мітка +milestones=Проміжні етапи +commits=Коміти +git_branches=Гілки +releases=Релізи +file_raw=Запис +file_history=Історія +file_view_raw=Перегляд запису +file_permalink=Постійне посилання +file_too_large=Цей файл завеликий для показу +video_not_supported_in_browser=Ваш браузер не підтримує єлемент HTML5 video. + +branches.overview=Огляд +branches.active_branches=Активні гілки +branches.stale_branches=Застарілі гілки +branches.all=Усі гілки +branches.updated_by=Оновлено %[1]s з %[2]s +branches.change_default_branch=Гілку за замовчуванням змінено +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +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=Ви мусите клонувати репозиторій щоб редагувати файли +editor.delete_this_file=Видалити цей файл +editor.must_have_write_access=Ви повинні мати доступ на запис щоб запропонувати зміни до цього файлу +editor.file_delete_success=Файл '%s' успішно видалено! +editor.name_your_file=Дайте назву файлу... +editor.filename_help=Щоб додати каталог, просто наберіть його ім'я, та натисніть /. Щоб видалити каталог, перейдіть на початок поля й натисніть клавішу backspace. +editor.or=Або +editor.cancel_lower=Скасувати +editor.commit_changes=Зафіксувати зміни +editor.add_tmpl=Додати '%s/' +editor.add=Додати '%s' +editor.update=Оновити '%s' +editor.delete=Видалити '%s' +editor.commit_message_desc=Додати необов'язковий розширений опис... +editor.commit_directly_to_this_branch=Зробіть комміт прямо в гілку %s. +editor.create_new_branch=Створіть нову гілку для цього коміту та відкривайте запит на втягування. +editor.new_branch_name_desc=Ім'я нової гілки... +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=Вміст файлу було змінено з того часу як ви почали його редагувати. натисніть тут щоб побачити зміни або знову натисніть commit щоб перезаписати ці зміни. +editor.file_already_exists=Файл на ім'я '%s' вже присутній у репозиторії. +editor.no_changes_to_show=Нема змін для показу. +editor.fail_to_update_file=Не вдалося оновити/створити файл '%s' через помилку: %v +editor.fail_to_delete_file=Не вдалося видалити файл '%s' через помилку: %v +editor.add_subdir=Додати підкаталогу... +editor.unable_to_upload_files=Не вдалося завантажити файли до '%s' через помилку: %v +editor.upload_files_to_dir=Завантажувати файли до '%s' + +commits.commit_history=Історія комітів +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=Без Мітки +issues.new.clear_labels=Очистити мітки +issues.new.milestone=Етап +issues.new.no_milestone=Етап відсутній +issues.new.clear_milestone=Очистити етап +issues.new.open_milestone=Активні етапи +issues.new.closed_milestone=Закриті етапи +issues.new.assignee=Відповідальний +issues.new.clear_assignee=Прибрати відповідального +issues.new.no_assignee=Немає відповідального +issues.create=Створити задачу +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 +issues.open_tab=%d Відкрито +issues.close_tab=:%d Закрито +issues.filter_label=Мітка +issues.filter_label_no_select=Мітку не обрано +issues.filter_milestone=Етап +issues.filter_milestone_no_select=Немає вибраних етапів +issues.filter_assignee=Призначено +issues.filter_assginee_no_select=Етап не обрано +issues.filter_type=Тип +issues.filter_type.all_issues=Всі проблемы +issues.filter_type.assigned_to_you=Призначене вам +issues.filter_type.created_by_you=Створено вами +issues.filter_type.mentioning_you=Вас згадано +issues.filter_sort=Сортування +issues.filter_sort.latest=Найновіші +issues.filter_sort.oldest=Найстаріші +issues.filter_sort.recentupdate=Нещодавно оновлено +issues.filter_sort.leastupdate=Найдавніше оновлені +issues.filter_sort.mostcomment=Найбільш коментовані +issues.filter_sort.leastcomment=Найменш коментовані +issues.opened_by=%[1]s відкрито %[3]s +issues.opened_by_fake=%[1]s відкрито %[2]s +issues.previous=Попередня сторінка +issues.next=Наступний +issues.open_title=Відкрити +issues.closed_title=Закриті +issues.num_comments=%d коментарів +issues.commented_at=`відкоментовано %s` +issues.delete_comment_confirm=Ви впевнені, що хочете видалити цей коментар? +issues.no_content=Тут ще немає жодного вмісту. +issues.close_issue=Закрити +issues.close_comment_issue=Прокоментувати і закрити +issues.reopen_issue=Відкрити знову +issues.reopen_comment_issue=Прокоментувати та відкрити знову +issues.create_comment=Коментар +issues.closed_at=`закрито %[2]s` +issues.reopened_at=`перевідкрито %[2]s` +issues.commit_ref_at=`згадано цю проблему в коміті %[2]s` +issues.poster=Автор +issues.collaborator=Співавтор +issues.owner=Власник +issues.sign_in_require_desc=Підпишіться щоб приєднатися до обговорення. +issues.edit=Редагувати +issues.cancel=Скасувати +issues.save=Зберегти +issues.label_title=Назва мітки +issues.label_color=Колір мітки +issues.label_count=%d міток +issues.label_open_issues=%d відкритих питань +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"` + +pulls.new=Новий запрос на злиття +pulls.compare_changes=Порівняти зміни +pulls.compare_changes_desc=Порівняти дві гілки та зробити pull request для змін. +pulls.compare_base=base +pulls.compare_compare=compare +pulls.filter_branch=Фільтрувати гілку +pulls.no_results=Результатів не знайдено. +pulls.nothing_to_compare=Нічого порівнювати, бо base та head гілки однакові. +pulls.nothing_merge_base=Нічого порівнювати, бо обидві гілки мають повністю різну історію. +pulls.has_pull_request=`Вже є pull request між ціми двома цілями: %[2]s#%[3]d` +pulls.create=Створити pull request +pulls.title_desc=хоче злити %[1]d комітів з %[2]s до %[3]s +pulls.merged_title_desc=злито %[1]d комітів з %[2]s до %[3]s %[4]s +pulls.tab_conversation=Обговорення +pulls.tab_commits=Коміти +pulls.tab_files=Змінені файли +pulls.reopen_to_merge=Будь ласка перевідкрийте цей запрос щоб здіснити операцію злиття. +pulls.merged=Об'єднано +pulls.has_merged=Цей запрос було успішно влито! +pulls.data_broken=Вміст цього запросу було пошкоджено внаслідок видалення інформації про розгалудження. +pulls.is_checking=Перевірка конфліктів продовжується, будь ласка оновіть сторінку через деякий час. +pulls.can_auto_merge_desc=Цей запрос може бути влитий автоматично. +pulls.cannot_auto_merge_desc=Цей запрос не може бути влитий автоматично, тому що він має конфлікти. +pulls.cannot_auto_merge_helper=Будь ласка влийте вручну щоб врегулювати конфлікти. +pulls.create_merge_commit=Створити коміт на злиття +pulls.rebase_before_merging=Перебазувати перед об'єднанням +pulls.commit_description=Опис коміту +pulls.merge_pull_request=Влити запрос на злиття +pulls.open_unmerged_pull_exists=`Ви не можете перевідкрити, бо вже існує запрос на злиття (#%d) з того самого репозиторію, з тією самою інформацією про злиття, та він очікує на влиття.` +pulls.delete_branch=Видалити гілку +pulls.delete_branch_has_new_commits=Гілка не може бути видалена, бо вона має нові коміти після злиття. + +milestones.new=Новий етап +milestones.open_tab=%d відкрито +milestones.close_tab=%d закрито +milestones.closed=Закрито %s +milestones.no_due_date=Немає дати завершення +milestones.open=Відкрити +milestones.close=Закрити +milestones.new_subheader=Створити етап для організації обговорень. +milestones.create=Створити етап +milestones.title=Заголовок +milestones.desc=Опис +milestones.due_date=Дата завершення (опціонально) +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 +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=Редагувати +wiki.new_page_button=Нова сторінка +wiki.delete_page_button=Видалити сторінку +wiki.delete_page_notice_1=Будьте уважні! Це призведе до видалення сторінки "%s". +wiki.page_already_exists=Wiki-сторінка з таким самим ім'ям вже існує. +wiki.pages=Сторінки +wiki.last_updated=Останні оновлення %s + +settings=Налаштування +settings.options=Опції +settings.collaboration=Співпраця +settings.collaboration.admin=Адміністратор +settings.collaboration.write=Запис +settings.collaboration.read=Читання +settings.collaboration.undefined=Не визначено +settings.branches=Гілки +settings.branches_bare=Ви не можете керувати гілками у bare-репозиторії. Спочатку додайте у нього якогось вмісту, будь ласка. +settings.default_branch=Гілка за замовчуванням +settings.default_branch_desc=Гілка за замовчанням вважається базовою для комітів, запросів злиття та онлайн редагувань. +settings.update=Оновлення +settings.update_default_branch_unsupported=Зміна гілки за замувчуванням не підтримується серверною версією Git. +settings.update_default_branch_success=Гілку за замовчуванням цього репозиторію було успішно оновлено! +settings.protected_branches=Захищені гілки +settings.protected_branches_desc=Захистіть гілки від force push, випадкового видалення та коміттерів з білого списку. +settings.choose_a_branch=Виберіть гілку... +settings.branch_protection=Захист гілок +settings.branch_protection_desc=Будь ласка, виберіть налаштування захисту для гілки %s. +settings.protect_this_branch=Захистити гілку +settings.protect_this_branch_desc=Вимкнути примусовий push та захистити від видалення. +settings.protect_require_pull_request=Вимагати запрос на злиття замість прямого push +settings.protect_require_pull_request_desc=Увімкніть цю опцію для заборони прямого push у цю гілку. Коміт має бути запушений у іншу, незахищену гілку та влитий у цю через запрос на злиття. +settings.protect_whitelist_committers=Білий список тих, хто може робити push у цю гілку +settings.protect_whitelist_committers_desc=Додати людей або команди до білого списку тих, хто може робити push у цю гілку. Користувачі з білого списку оминатимуть контроль запитів на злиття. +settings.protect_whitelist_users=Користувачі що можуть виконувати push до цієї гілки +settings.protect_whitelist_search_users=Пошук користувачів +settings.protect_whitelist_teams=Команди, члени яких можуть виконувати push до цієї гілки +settings.protect_whitelist_search_teams=Пошук команд +settings.update_protect_branch_success=Опції захисту цієї гілки було успішно оновлено! +settings.hooks=Webhooks +settings.githooks=Git Hooks +settings.basic_settings=Основні налаштування +settings.mirror_settings=Налаштування дзеркала +settings.sync_mirror=Синхронізувати +settings.mirror_sync_in_progress=Виконується синхронізація дзеркала. Будь ласка, оновіть сторінку через хвилинку. +settings.site=Офіційна веб-сторінка +settings.update_settings=Оновити налаштування +settings.change_reponame_prompt=Ця зміна вплине на відношення посилань до цього репозитрію. +settings.advanced_settings=Додаткові налаштування +settings.wiki_desc=Увімкнути wiki-систему +settings.use_internal_wiki=Використовувати вбудовану wiki +settings.allow_public_wiki_desc=Дозволити публічний доступ до wiki поки репозиторій залишається приватним +settings.use_external_wiki=Використовувати зовнішню wiki +settings.external_wiki_url=URL зовнішньої wiki +settings.external_wiki_url_desc=Відвідувачі будуть переспрямовані до URL коли вони клацнуть на вкладці. +settings.issues_desc=Увімкнути систему відстеження проблем +settings.use_internal_issue_tracker=Використовувати вбудовану легку систему відстеження помилок +settings.allow_public_issues_desc=Дозволити публічний доступ до проблем поки репозиторій залишається приватним +settings.use_external_issue_tracker=Використовувати зовнішній трекер задач +settings.external_tracker_url=URL зовнішньої системи відстеження проблем +settings.external_tracker_url_desc=Відвідувача буде перенаправлено до URL коли він натисне на вкладку. +settings.tracker_url_format=Формат URL зовнішнього трекера задач +settings.tracker_issue_style=Стиль найменування задач в зовнішньому трекері: +settings.tracker_issue_style.numeric=Цифровий +settings.tracker_issue_style.alphanumeric=Буквено-цифровий +settings.tracker_url_format_desc=Ви можете використовувати заповнювач {user} {repo} {index} для ім'я користувача, назви репозиторію на номеру проблеми. +settings.pulls_desc=Увімкнути запити на злиття щоб дозволити внески між репозиторіями й гілками +settings.pulls.ignore_whitespace=Ігнорувати зміни у пробільних символах +settings.pulls.allow_rebase_merge=Дозволити перебазування для merge-комітів +settings.danger_zone=Небезпечна зона +settings.cannot_fork_to_same_owner=Ви не можете клонувати репозиторій його ж власнику. +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=- Це видалить та вимкне wiki для %s +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=Додано нового співавтора. +settings.delete_collaborator=Видалити +settings.collaborator_deletion=Видалення співавтора +settings.collaborator_deletion_desc=Цей користувач більше не матиме співавторського доступу до репозиторію. Бажаєте продовжити? +settings.remove_collaborator_success=Співавтора було видалено. +settings.search_user_placeholder=Пошук користувача... +settings.org_not_allowed_to_be_collaborator=Організації не можуть бути додані як співавтори. +settings.hooks_desc=Web-хуки схожі на HTTP POST тригери подій. Яка б подія не виникла в Gogs, ми можемо обробити повідомлення про неї на сторонньому хості який ви задаєте. Взнайте більше у Webhooks Guide. +settings.webhooks.add_new=Додати новий веб-хук: +settings.webhooks.choose_a_type=Обрати тип... +settings.add_webhook=Додати Webhook +settings.webhook_deletion=Видалити Webhook +settings.webhook_deletion_desc=Видалення цього web-хуку призведе до видалення інформації про нього та усієї історії поставок. Впевнені, що бажаєте продовжити? +settings.webhook_deletion_success=Webhook успішно видалено! +settings.webhook.test_delivery=Перевірити поставку +settings.webhook.test_delivery_desc=Відправити тестовий push для перевірки налаштувань web-хуків +settings.webhook.test_delivery_success=Тестовий web-хук може бути доданий у чергу поставки. Поки він з'явиться у історії поставки, може пройти кілька секунд. +settings.webhook.redelivery=Зворотня доставка +settings.webhook.redelivery_success=Завдання хуку '%s' було передодано у чергу доставки. Оновлення статусу доставки в історії може зайняти якийсь час. +settings.webhook.request=Запит +settings.webhook.response=Відповідь +settings.webhook.headers=Заголовки +settings.webhook.payload=Зміст +settings.webhook.body=Тіло +settings.webhook.err_cannot_parse_payload_url=Неможливо розібрати payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=URL-адреса корисного навантаження розв’язана з адресою у локальної мережі, яка неявно заблокована. +settings.githooks_desc=Git хуки керуються самим Git, ви можете редагувати файли хуків, що підтримуються згідно списку нище, щоб виконувати будь-які операції. +settings.githook_edit_desc=Якщо хук неактивний, буде представлено зразок вмісту. Порожнє значення у цьому полі призведе до вимкнення хуку. +settings.githook_name=Ім'я хуку +settings.githook_content=Вміст хуку +settings.update_githook=Оновити хук +settings.add_webhook_desc=Gogs відправляє POST запит до вказаного вами URL, з приводу подій що відбулися. Ви також можете вказати дані якого формату ви ви хотіли б отримати (JSON, x-www-form-urlencoded, XML, etc). Більше інформації можна отримати у посібнику з web-хуків. +settings.payload_url=URL розробника +settings.content_type=Тип змісту +settings.secret=Таємний код +settings.secret_desc=Секрет буде вислано SHA256 HMAC hex-сумою вміста у хідері X-Gogs-Signature. +settings.slack_username=Ім'я користувача +settings.slack_icon_url=URL іконки +settings.slack_color=Колір +settings.event_desc=Коли цей web-хук має спрацювати? +settings.event_push_only=Просто push-подія. +settings.event_send_everything=Мені потрібно усе. +settings.event_choose=Дозвольте мені вибрати те, що потрібно. +settings.event_create=Створити +settings.event_create_desc=Гілку або тег створено +settings.event_delete=Видалити +settings.event_delete_desc=Гілку або мітку було видалено +settings.event_fork=Відгалуження +settings.event_fork_desc=Репозиторій було відгалуджено +settings.event_push=Push +settings.event_push_desc=Git push до репозиторію +settings.event_issues=Проблеми +settings.event_issues_desc=Проблему відкрито, закрито, перевідкрито, відредаговано, призначено, відкріплено, змінено мітку, очищено мітку, створено етап, очищено етап. +settings.event_pull_request=Запити до злиття +settings.event_pull_request_desc=Запрос на злиття відкрито, закрито, перевідкрито, прикріплено, відкріплено, оновлено мітку, очищено мітку, створено етап, очищено етап або синхронізовано. +settings.event_issue_comment=Коментар проблеми +settings.event_issue_comment_desc=Коментар проблеми створено, видалено чи відредаговано. +settings.event_release=Реліз +settings.event_release_desc=Реліз опубліковано у репозиторії. +settings.active=Активний +settings.active_helper=Подробиці події, що викликала спрацювання хука, будуть надані також. +settings.add_hook_success=Новий web-хук було додано. +settings.update_webhook=Оновити Webhook +settings.update_hook_success=Webhook оновлено. +settings.delete_webhook=Видалити Webhook +settings.recent_deliveries=Недавні розсилки +settings.hook_type=Тип хуку +settings.add_slack_hook_desc=Додати Slack-інтеграцію до вашого репозиторію. +settings.add_discord_hook_desc=Додати Discord-інтеграцію до репозиторію. +settings.add_dingtalk_hook_desc=Додати інтеграцію Dingtalk до вашого репозиторію. +settings.slack_token=Жетон +settings.slack_domain=Домен +settings.slack_channel=Канал +settings.deploy_keys=Ключи для розгортування +settings.deploy_keys_helper=Common Gotcha! Якщо ви шукаєте куди додати персональний публічний ключ, додайте його до налаштувань вашого аккаунту. +settings.add_deploy_key=Додати ключ для розгортування +settings.deploy_key_desc=Ключі розгортування доступні лише для читання. Це не те саме, що персональний SSH ключ акаунту. +settings.no_deploy_keys=Ви не додали жодного ключа для розгортування. +settings.title=Заголовок +settings.deploy_key_content=Контент +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.description_desc=Опис репозиторію. До 512-ти символів довжиною. +settings.description_length=Доступні символи + +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=Об'єднаний вигляд +diff.stats_desc= %d змінених файлів з %d додано та %d видалено +diff.bin=BIN +diff.view_file=Переглянути файл +diff.file_suppressed=Різницю між файлами не показано, бо вона завелика +diff.too_many_files=Деякі файли не було показано, через те що забагато файлів було змінено + +release.releases=Релізи +release.new_release=Новий реліз +release.draft=Чернетка +release.prerelease=Пре-реліз +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=Запис +release.preview=Переглянути +release.loading=Завантажується... +release.prerelease_desc=Це пре-реліз +release.prerelease_helper=Відзначаємо, що цей реліз не готовий для використання у продакшені. +release.cancel=Скасувати +release.publish=Опублікувати реліз +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=Завантаження + +[org] +org_name_holder=Назва організації +org_full_name_holder=Повна назва організації +org_name_helper=Чудові назви організації є короткими і незабутніми. +create_org=Створення організації +repo_updated=Оновлено +people=Люди +invite_someone=Запросити іншого користувача +teams=Команди +lower_members=учасники +lower_repositories=репозиторії +create_new_team=Створити нову команди +org_desc=Опис +team_name=Назва команди +team_desc=Опис +team_name_helper=Ви будете використовувати це ім'я для згадування цієї команди у обговореннях. +team_desc_helper=Що це за команда? +team_permission_desc=Який рівень дозволів має бути у цієї команди? + +form.name_not_allowed=Назва організації чи паттерн %q, не дозволені. +form.team_name_not_allowed=Назва команди або шаблон %q не допоскаються. + +settings=Налаштування +settings.options=Опції +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=Додайте web-хук що буде викликатися для усіх репозиторіїв цієї організації. + +members.membership_visibility=Видимість учасника: +members.public=Публічний +members.public_helper=зробити приватними +members.private=Приватний +members.private_helper=оприлюднити +members.member_role=Роль учасника: +members.owner=Власник +members.member=Учасник +members.remove=Видалити +members.leave=Покинути +members.invite_desc=Додати нового учасника до %s: +members.invite_now=Запросити зараз + +teams.join=Приєднатися +teams.leave=Покинути +teams.read_access=Доступ для читання +teams.read_access_helper=Ця команда буде мати можливість переглядати та клонувати cховища. +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=Власник має повний доступ до усіх репозиторіїв та має права адміністратора організації. +teams.members=Члени команди +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 команди та додвавати співавторів до репозиторію. +teams.repositories=Репозиторії команди +teams.search_repo_placeholder=Пошук репозиторію... +teams.add_team_repository=Додати репозиторій команди +teams.remove_repo=Видалити +teams.add_nonexistent_repo=Ви намагаєтеся додати у репозиторій якого не існує. Будь ласка, спочатку створіть його. + +[admin] +dashboard=Панель керування +users=Користувачі +organizations=Організації +repositories=Репозиторії +authentication=Аутентифікація +config=Налаштування +notices=Сповіщення системи +monitor=Моніторинг +first_page=Перша +last_page=Остання +total=Всього: %d + +dashboard.build_info=Інформація про збірку +dashboard.app_ver=Версія програми +dashboard.git_version=Версія Git +dashboard.go_version=Версія Go +dashboard.build_time=Дата збірки +dashboard.build_commit=Створити коміт +dashboard.statistic=Статистика +dashboard.operations=Операції +dashboard.system_status=Статус системного монітору +dashboard.statistic_info=База даних Gogs має %d користувачів, %d організацій, %d публічних ключів, %d репозиторіїв, %d спостерігачів, %d зірок, %d дій, %d відвідувань, %d обговорень, %d коментарів, %d соціальних облікових записів, %d підписників, %d дзеркал, %d релізів, %d джерел входу, %d webhook-ів, %d етапів, %d міток, %d hook задач, %d команд, %d оновлень завдань, %d вкладень. +dashboard.operation_name=Назва операції +dashboard.operation_switch=Перемикнути +dashboard.select_operation_to_run=Будь ласка, виберіть операцію, щоб запустити +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=Виконати збирання сміття у репозиторії +dashboard.git_gc_repos_success=Збирання сміття в усіх репозиторіях було успішно виконано. +dashboard.resync_all_sshkeys=Переписати файл '.ssh/authorized_keys' (увага: не-Gogs ключі будуть втрачені) +dashboard.resync_all_sshkeys_success=Усі публічні ключі успішно перезаписані. +dashboard.resync_all_hooks=Пересинхронізувати перед-прийнятні, оновлюючі та пост-прийнятні хуки в усіх репозиторіях. +dashboard.resync_all_hooks_success=Усі перед-прийнятні, оновлюючі та пост-прийнятні хуки репозиторію були успішно пересинхронізовані. +dashboard.reinit_missing_repos=Переініціалізувати усі репозитрії git-файли яких втрачено +dashboard.reinit_missing_repos_success=Усі репозитрії git-файли яких втрачено, успішно переініціалізовано. + +dashboard.server_uptime=Uptime серверу +dashboard.current_goroutine=Поточний Goroutines +dashboard.current_memory_usage=Поточне використання пам'яті +dashboard.total_memory_allocated=Виділено пам'яті загалом +dashboard.memory_obtained=Отримано пам'яті +dashboard.pointer_lookup_times=Пошуків вказівника +dashboard.memory_allocate_times=Виділень пам'яті +dashboard.memory_free_times=Звільнень пам'яті +dashboard.current_heap_usage=Поточне використання купи +dashboard.heap_memory_obtained=Отримано динамічної пам'яті +dashboard.heap_memory_idle=Не використовується пам'яті у купі +dashboard.heap_memory_in_use=Використовується пам'яті у купі +dashboard.heap_memory_released=Звільнено пам'яті купи +dashboard.heap_objects=Об'єктів купи +dashboard.bootstrap_stack_usage=Використання стеку завантажувачем +dashboard.stack_memory_obtained=Зайнято пам'яті стеком +dashboard.mspan_structures_usage=Використання структур MSpan +dashboard.mspan_structures_obtained=Отримано структур MSpan +dashboard.mcache_structures_usage=Використання структур MCache +dashboard.mcache_structures_obtained=Отримано структур MCache +dashboard.profiling_bucket_hash_table_obtained=Отримано хеш-таблиць профілювання +dashboard.gc_metadata_obtained=Отримано метаданих GC +dashboard.other_system_allocation_obtained=Отримання інших виділень пам'яті +dashboard.next_gc_recycle=Наступний цикл GC +dashboard.last_gc_time=З останнього запуску GC +dashboard.total_gc_time=Загальна пауза GC +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=Активоване +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=Приватний +repos.watches=Стежать +repos.stars=У обраному +repos.issues=Питання +repos.size=Розмір + +auths.auth_sources=Джерела автентифікації +auths.new=Додати нове джерело +auths.name=Назва +auths.type=Тип +auths.enabled=Увімкнено +auths.default=За замовчанням +auths.updated=Оновлено +auths.auth_type=Тип автентифікації +auths.auth_name=Назва автентифікації +auths.security_protocol=Протокол безпеки +auths.domain=Домен +auths.host=Хост +auths.port=Порт +auths.bind_dn=Прив'язати DN +auths.bind_dn_helper=Ви можете використовувати '%s' як шаблон для імені користувача, напр. DOM\%s +auths.bind_password=Прив'язати пароль +auths.bind_password_helper=Увага: Цей пароль зберігається як звичайний текст. Не використовуйте профіль з високими повноваженнями. +auths.user_base=База пошуку користувачів +auths.user_dn=DN користувача +auths.attribute_username=Атрибут імені користувача +auths.attribute_username_placeholder=Залиште порожнім щоб використовувати ім'я користувача. +auths.attribute_name=Атрибут імені +auths.attribute_surname=Атрибут прізвища +auths.attribute_mail=Атрибут електронної пошти +auths.verify_group_membership=Верифікувати членство у групі +auths.group_search_base_dn=Базовий DN пошуку групи +auths.group_filter=Фільтр груп +auths.group_attribute_contain_user_list=Атрибут групи зі списком користувачів +auths.user_attribute_listed_in_group=Атрибути користувача що відображені у групі +auths.attributes_in_bind=Отримати атрибути контексту Bind DN +auths.filter=Користувацький фільтр +auths.admin_filter=Фільтр адміністратора +auths.ms_ad_sa=Ms Ad SA +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.edit=Редагувати налаштування автентифікації +auths.activated=Цю автентифікацію активовано +auths.default_auth=Це метод автентифікації за замовчанням +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=Автентивікацію було успішно видалено! +auths.login_source_exist=Джерело входу '%s' вже існує. +auths.github_api_endpoint=Адреса API + +config.not_set=(не встановлено) +config.server_config=Конфігурація сервера +config.brand_name=Назва бренду +config.run_user=Запущено користувачем +config.run_mode=Режим виконання +config.server.external_url=Зовнішній URL +config.server.domain=Домен +config.server.protocol=Протокол +config.server.http_addr=Адреса HTTP +config.server.http_port=Порт HTTP +config.server.cert_file=Файл сертифікату +config.server.key_file=Ключовий файл +config.server.tls_min_version=Мінімальна версія TLS +config.server.unix_socket_permission=Дозвіл Unix сокету +config.server.local_root_url=Локальний кореневий URL +config.server.offline_mode=Автономний режим +config.server.disable_router_log=Вимкнути журнал маршрутизатора +config.server.enable_gzip=Увімкнути Gzip +config.server.app_data_path=Шлях до даних додатку +config.server.load_assets_from_disk=Завантажити ресурси з диску +config.server.landing_url=Landing URL + +config.ssh_config=Налаштування SSH +config.ssh.enabled=Увімкнено +config.ssh.domain=Виділений домен +config.ssh.port=Виділений порт +config.ssh.root_path=Шлях до кореня +config.ssh.keygen_path=Шлях до генератора ключа +config.ssh.key_test_path=Шлях до тестового ключа +config.ssh.minimum_key_size_check=Перевірка мінімального розміру ключа +config.ssh.minimum_key_sizes=Мінімальні розміри ключів +config.ssh.rewrite_authorized_keys_at_start=Переписати "authorized_keys" при запуску +config.ssh.start_builtin_server=Запустити вбудований сервер +config.ssh.listen_host=Слухати хост +config.ssh.listen_port=Слухати порт +config.ssh.server_ciphers=Серверні шифри +config.ssh.server_macs=MAC-адреси сервера +config.ssh.server_algorithms=Алгоритми сервера + +config.repo_config=Налаштування репозиторія +config.repo.root_path=Кореневий шлях +config.repo.script_type=Тип скрипту +config.repo.ansi_chatset=Набір символів ANSI +config.repo.force_private=Примусово приватний +config.repo.max_creation_limit=Ліміт створень +config.repo.preferred_licenses=Бажані ліцензії +config.repo.disable_http_git=Вимкнути HTTP Git +config.repo.enable_local_path_migration=Увімкнути міграцію з локального шляху +config.repo.enable_raw_file_render_mode=Вмикає режим візуалізації неформатованого файлу +config.repo.commits_fetch_concurrency=Запросити коміти конкурентно +config.repo.editor.line_wrap_extensions=Розширення редактора для перенесення рядків +config.repo.editor.previewable_file_modes=Режим редактора попереднього перегляду файлів +config.repo.upload.enabled=Вивантаження увімкнено +config.repo.upload.temp_path=Завантажити тимчасовий шлях +config.repo.upload.allowed_types=Дозволені типи вивантаження +config.repo.upload.file_max_size=Ліміт розміру файлу для вивантаження +config.repo.upload.max_files=Ліміт розміру файлу для вивантаження + +config.db_config=Налаштування бази даних +config.db.type=Тип +config.db.host=Хост +config.db.name=Ім'я +config.db.schema=Схема +config.db.schema_helper=(тільки для "postgres") +config.db.user=Користувач +config.db.ssl_mode=Режим SSL +config.db.ssl_mode_helper=(тільки для "postgres") +config.db.path=Шлях +config.db.path_helper=(тільки для "sqlite3") +config.db.max_open_conns=Максимальна кількість відкритих з'єднань +config.db.max_idle_conns=Максимальна кількість бездіяльних з'єднань + +config.security_config=Налаштування безпеки +config.security.login_remember_days=Кількість днів запам'ятовування входу +config.security.cookie_remember_name=Запам'ятати куки +config.security.cookie_username=Куки імені користувача +config.security.cookie_secure=Увімкнути захищені файли куки +config.security.reverse_proxy_auth_user=Заголовок аутентифікації на зворотному проксі +config.security.enable_login_status_cookie=Увімкнути файли куки стану при вході +config.security.login_status_cookie_name=Куки статусу входу +config.security.local_network_allowlist=Дозволений список у локальної мережі + +config.email_config=Налаштування електронної пошти +config.email.enabled=Увімкнено +config.email.subject_prefix=Префікс теми +config.email.host=Хост +config.email.from=Від +config.email.user=Користувач +config.email.disable_helo=Вимкнути HELO +config.email.helo_hostname=Ім'я хосту HELO +config.email.skip_verify=Пропустити перевірку сертифіката +config.email.use_certificate=Використовувати користувальницький сертифікат +config.email.cert_file=Файл сертифікату +config.email.key_file=Ключовий файл +config.email.use_plain_text=Використовувати звичайний текст +config.email.add_plain_text_alt=Додайте простий текст у якості альтернативи +config.email.send_test_mail=Надіслати пробний лист +config.email.test_mail_failed=Помилка відправлення пробного листа до '%s': %v +config.email.test_mail_sent=Пробного листа було відправлено до '%s'. + +config.auth_config=Налаштування аутентифікації +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Активувати код підтвердження +config.auth.reset_password_code_lives=Термін придатності кода при скиданні пароля +config.auth.require_email_confirm=Вимагає підтвердження електронною поштою +config.auth.require_sign_in_view=Необхідно авторизуватися для перегляду +config.auth.disable_registration=Вимкнути реєстрацію +config.auth.enable_registration_captcha=Включити реєстрацію з капчею +config.auth.enable_reverse_proxy_authentication=Увімкнути аутентифікацію на зворотному проксі +config.auth.enable_reverse_proxy_auto_registration=Увімкнути автоматичну реєстрацію на зворотному проксі +config.auth.reverse_proxy_authentication_header=Заголовок аутентифікації на зворотному проксі + +config.user_config=Налаштування користувача +config.user.enable_email_notify=Увімкнути сповіщення електронною поштою + +config.session_config=Налаштування сесії +config.session.provider=Постачальник +config.session.provider_config=Налаштування постачальника +config.session.cookie_name=Файл куки +config.session.https_only=Виключно по HTTPS +config.session.gc_interval=Інтервал GC +config.session.max_life_time=Максимальний час дії +config.session.csrf_cookie_name=Кука CSRF + +config.cache_config=Конфігурація кешу +config.cache.adapter=Адаптер +config.cache.interval=GC Інтервал +config.cache.host=Хост + +config.http_config=Налаштування HTTP +config.http.access_control_allow_origin=Контроль доступу дозволяє походження + +config.attachment_config=Налаштування вкладення +config.attachment.enabled=Увімкнено +config.attachment.path=Шлях +config.attachment.allowed_types=Дозволені типи +config.attachment.max_size=Ліміт розміру +config.attachment.max_files=Ліміт файлів + +config.release_config=Налаштування випуску +config.release.attachment.enabled=Вкладення увімкнено +config.release.attachment.allowed_types=Дозволені типи вкладень +config.release.attachment.max_size=Ліміт розміру вкладення +config.release.attachment.max_files=Ліміт прикріплених файлів + +config.picture_config=Налаштування зображень +config.picture.avatar_upload_path=Шлях завантаження аватарок користувачем +config.picture.repo_avatar_upload_path=Шлях завантаження аватарок в репозиторії +config.picture.gravatar_source=Джерело граватарів +config.picture.disable_gravatar=Вимкнути граватари +config.picture.enable_federated_avatar=Включити федеративні аватарки + +config.mirror_config=Налаштування дзеркала +config.mirror.default_interval=Інтервал за замовчуванням + +config.webhook_config=Налаштування web-хуків +config.webhook.types=Типи +config.webhook.deliver_timeout=Час для доставки вичерпано +config.webhook.skip_tls_verify=Пропустити перевірку TLS + +config.git_config=Налаштування git +config.git.disable_diff_highlight=Вимкнути підсвітку синтаксису порівняння +config.git.max_diff_lines=Обмеження рядків порівнюючи (для одного файлу) +config.git.max_diff_line_characters=Обмеження символів порівнюючи (для одного файлу) +config.git.max_diff_files=Обмеження на порівняння файлів (для одного порівняння) +config.git.gc_args=Аргументи GC +config.git.migrate_timeout=Час для міграції вичерпано +config.git.mirror_timeout=Час для отримання дзеркала вичерпано +config.git.clone_timeout=Час для клонування вичерпано +config.git.pull_timeout=Час для витягання вичерпано +config.git.gc_timeout=Затримка GC + +config.lfs_config=Налаштування LFS +config.lfs.storage=Сховище +config.lfs.objects_path=Шлях об'єктів + +config.log_config=Конфігурація журналу +config.log_file_root_path=Повний шлях до Log-файлу +config.log_mode=Режим +config.log_options=Опції + +monitor.cron=Завдання cron +monitor.name=Назва +monitor.schedule=Розклад +monitor.next=Наступного разу +monitor.previous=Попереднього разу +monitor.execute_times=Кількість виконань +monitor.process=Запущені процеси +monitor.desc=Опис +monitor.start=Початок +monitor.execute_time=Час виконання + +notices.system_notice_list=Сповіщення системи +notices.view_detail_header=Переглянути деталі повідомлення +notices.actions=Дії +notices.select_all=Вибрати все +notices.deselect_all=Скасувати виділення +notices.inverse_selection=Інвертувати виділене +notices.delete_selected=Видалити обране +notices.delete_all=Видалити усі повідомлення +notices.type=Тип +notices.type_1=Репозиторій +notices.desc=Опис +notices.op=Оп. +notices.delete_success=Системні повідомлення було успішно видалено. + +[action] +create_repo=створено репозиторій %s +rename_repo=репозиторій перейменовано з %[1]s на %[3]s +commit_repo=запушено до %[3]s у %[4]s +compare_commits=Перегляд порівняння для цих %d комітів +transfer_repo=перенесено репозиторій %s у %s +create_issue=`відкрито проблему %s#%[2]s` +close_issue=`закрито проблему %s#%[2]s` +reopen_issue=`перевідкрито проблему %s#%[2]s` +comment_issue=`відкоментовано проблему %s#%[2]s` +create_pull_request=`створено запит на втягування %s#%[2]s` +close_pull_request=`закрито запит на втягування %s#%[2]s` +reopen_pull_request=`перевідкрито запит на втягування %s#%[2]s` +merge_pull_request=`запит на злиття влито %s#%[2]s` +create_branch=створено нову гілку %[3]s у %[4]s +delete_branch=видалено гілку %[2]s у %[3]s +push_tag=заштовхнуто тег %[2]s до %[3]s +delete_tag=видалено мітку %[2]s у %[3]s +fork_repo=відгалуджено репозиторій у %s +mirror_sync_push=синхронізовано коміт %[3]s в %[4]s із дзеркала +mirror_sync_create=синхронізовано нове посилання %[2]s до %[3]s із дзеркала +mirror_sync_delete=синхронізовано й видалено посилання %[2]s в %[3]s із дзеркала + +[tool] +ago=тому +from_now=віднині +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 +raw_seconds=секунди +raw_minutes=хвилини +raw_hours=години + +[dropzone] +default_message=Перетягніть файли сюди або натисніть "завантажити". +invalid_input_type=Не можна просто так взяти і завантажити файли цього типу. +file_too_big=Розмір файлу ({{filesize}} MB), що більше ніж максимальний розмір: ({{maxFilesize}} MB). +remove_file=Видалити файл + diff --git a/conf/locale/locale_vi-VN.ini b/conf/locale/locale_vi-VN.ini new file mode 100644 index 00000000000..6f002f86087 --- /dev/null +++ b/conf/locale/locale_vi-VN.ini @@ -0,0 +1,1434 @@ +app_desc=Một server lưu trữ Git tự host dễ dàng + +home=Trang chủ +dashboard=Bảng điều khiển +explore=Khám phá +help=Trợ giúp +sign_in=Đăng nhập +sign_out=Đăng xuất +sign_up=Đăng ký +register=Đăng ký +website=Website +page=Trang +template=Mẫu +language=Ngôn ngữ +create_new=Tạo mới... +user_profile_and_more=Thông tin người dùng và thêm nữa +signed_in_as=Đăng nhập như là + +username=Username +email=Email +password=Mật khẩu +re_type=Nhập lại +captcha=Mã xác minh + +repository=Kho +organization=Tổ chức +mirror=Bản phản ánh +new_repo=Kho mới +new_migrate=Mốc mới +new_mirror=Bản phản ánh mới +new_fork=Bản sao kho mới +new_org=Tổ chức mới +manage_org=Quản lý tổ chức +admin_panel=Bảng quản trị +account_settings=Cài đặt Tài khoản +settings=Cài đặt +your_profile=Hồ sơ của bạn +your_settings=Cài đặt của bạn + +activities=Hoạt động +pull_requests=Yêu cầu khéo về +issues=Các vấn đề + +cancel=Hủy bỏ + +[status] +page_not_found=Không tìm thấy trang này! +internal_server_error=Lỗi nội bộ máy chủ. + +[install] +install=Cài đặt +title=Cài đặt cho lần chạy đầu tiên +docker_helper=Nếu bạn đang chạy Gogs bên trong Docker, xin vui lòng đọc hướng dẫn một cách cẩn thận, trước khi bạn thay đổi bất cứ điều gì trong trang này! +requite_db_desc=Gogs yêu cầu MySQL, PostgreSQL, SQLite3 hoặc TiDB (thông qua giao thức MySQL). +db_title=Cài đặt database +db_type=Loại database +host=Host +user=User +password=Mật khẩu +db_name=Tên database +db_schema=Lược đồ +db_helper=Xin vui lòng sử dụng engine INNODB với utf8_general_ci charset cho MySQL. +ssl_mode=Chế độ SSL +path=Đường dẫn +sqlite_helper=Đường dẫn tập tin database SQLite3.
xin vui lòng sử dụng đường dẫn tuyệt đối khi bạn bắt đầu như là service. +err_empty_db_path=Đường dẫn database SQLite3 không thể để trống. +no_admin_and_disable_registration=Bạn không thể vô hiệu hóa đăng ký mà không cần tạo một tài khoản quản trị. +err_empty_admin_password=Mật khẩu quản trị không thể để trống. + +general_title=Cài đặt ứng dụng chung +app_name=Tên chương trình +app_name_helper=Đặt tên tổ chức của bạn ở đây lớn và to! +repo_path=Đường dẫn gốc cho kho +repo_path_helper=Tất cả kho Git từ xa sẽ được lưu vào thư mục này. +run_user=Người dùng đang chạy +run_user_helper=Người dùng phải có quyền truy cập vào đường dẫn gố của kho lưu trữ và chạy Gogs. +domain=Tên miền +domain_helper=Điều này ảnh hưởng đến SSH clone URLs. +ssh_port=SSH Port +ssh_port_helper=Số của cổng máy chủ SSH của bạn đang sử dụng, để trống để vô hiệu hóa tính năng SSH. +use_builtin_ssh_server=Sử dụng Builtin SSH Server +use_builtin_ssh_server_popup=Bắt đầu máy chủ SSH builtin Git hoạt động để phân biệt từ hệ thống SSH daemon. +http_port=Cổng HTTP +http_port_helper=Số hiệu của cổng mà ứng dụng sẽ lắng nghe. +app_url=URL chương trình +app_url_helper=Điều này ảnh hưởng đến HTTP/HTTPS clone URL và một nơi nào đó trong thư điện tử. +log_root_path=Đường dẫn Log +log_root_path_helper=Thư mục để viết vào tập tin Log. +enable_console_mode=Bật chế độ console +enable_console_mode_popup=Ngoài chế độ tập tin, còn có in logs vào console. +default_branch=Default Branch + +optional_title=Cài đặt tùy chọn +email_title=Cài đặt dịch vụ email +smtp_host=Máy chủ SMTP +smtp_from=Từ +smtp_from_helper=Thư từ địa chỉ, RFC 5322. Nó có thể chỉ là một địa chỉ email, hoặc định dạng "Tên". +mailer_user=Email người gửi +mailer_password=Mật khẩu người gửi +register_confirm=Bật xác nhận đăng ký +mail_notify=Bật thông báo qua Email +server_service_title=Serve và các cài đặt dịch vụ +offline_mode=Bật chế độ offline +offline_mode_popup=Vô hiệu hoá CDN ngay cả trong chế độ production, tất cả các tập tin tài nguyên sẽ được phục vụ tại địa phương. +disable_gravatar=Vô hiệu hoá dịch vụ Gravatar +disable_gravatar_popup=Vô hiệu hoá Gravatar và tùy chỉnh nguồn, tất cả avatar đang được tải lên bởi người dùng hoặc mặc định. +federated_avatar_lookup=Bật Federated Avatars Lookup +federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Vô hiệu hóa tự đăng ký +disable_registration_popup=Vô hiệu hoá người dùng tự đăng ký, chỉ có admin mới có thể tạo tài khoản. +enable_captcha=Bật Captcha +enable_captcha_popup=Yêu cầu xác nhận captcha cho người dùng tự đăng ký. +require_sign_in_view=Bật yêu cầu đăng nhập để xem trang +require_sign_in_view_popup=Chỉ đăng nhập người dùng có thể xem các trang, khách chỉ có thể nhìn thấy dấu hiệu trong/lên trang. +admin_setting_desc=Bạn không cần phải tạo một tài khoản quản trị ngay bây giờ, bất cứ người dùng nào mang ID = 1 sẽ được admin truy cập quyền admin. +admin_title=Cài đặt tài khoản quản trị +admin_name=Username +admin_password=Mật khẩu +confirm_password=Xác nhận mật khẩu +admin_email=Admin Email +install_gogs=Cài đặt Gogs +test_git_failed=Không kiểm tra lệnh 'git': %v +sqlite3_not_available=Phiên bản phát hành của bạn không hỗ trợ SQLite3, xin vui lòng tải phiên bản nhị phân chính thức từ %s, không phải là phiên bản gobuild. +invalid_db_setting=Thiết lập database không chính xác: %v +invalid_repo_path=Đường dẫn gốc lưu trữ kho là không hợp lệ: %v +run_user_not_match=Người dùng đang chạy không phải là người dùng hiện tại: %s -> %s +smtp_host_missing_port=SMTP host thiếu thông tin cổng ở địa chỉ. +invalid_smtp_from=Trường SMTP không hợp lệ: %v +save_config_failed=Lưu cấu hình thất bại: %v +init_failed=Lỗi khởi tạo ứng dụng: %v +invalid_admin_setting=Thiết lập tài khoản admin không hợp lệ: %v +install_success=Chào mừng! Chúng tôi vui mừng vì bạn chọn Gogs, chúc bạn vui. +invalid_log_root_path=Đường dẫn gốc cho Log không hợp lệ: %v + +[home] +uname_holder=Username or email +password_holder=Mật khẩu +switch_dashboard_context=Chuyển đổi bảng điều khiển ngữ cảnh +my_repos=Kho phần mềm của tôi +show_more_repos=Hiển thị thêm kho... +collaborative_repos=Kho phần mềm cộng tác +my_orgs=Các tổ chức của tôi +my_mirrors=Mirrors của tôi +view_home=Lượng xem + +issues.in_your_repos=Trong kho của bạn + +[explore] +repos=Kho phần mềm của tôi +users=Người dùng +organizations=Tổ chức, cơ quan +search=Tìm kiếm + +[auth] +create_new_account=Tạo một Tài khoản mới +register_hepler_msg=Đã có tài khoản? Đăng nhập bây giờ! +social_register_hepler_msg=Đã có tài khoản? Đăng nhập bây giờ! +disable_register_prompt=Xin lỗi, đăng ký đã bị vô hiệu. Xin vui lòng liên hệ với người quản trị trang web. +disable_register_mail=Xin lỗi, đăng ký đã bị vô hiệu. Xin vui lòng liên hệ với người quản trị trang web. +auth_source=Authentication Source +local=Local +remember_me=Ghi nhớ tôi +forgot_password=Quên mật khẩu +forget_password=Quên mật khẩu? +sign_up_now=Cần một tài khoản? Đăng ký bây giờ. +confirmation_mail_sent_prompt=Một email xác nhận mới đã được gửi đến %s, xin vui lòng kiểm tra hộp thư đến của bạn trong vòng %d giờ kế tiếp để hoàn thành quá trình đăng ký. +active_your_account=Kích hoạt tài khoản của bạn +prohibit_login=Đăng nhập bị Cấm +prohibit_login_desc=Tài khoản của bạn bị cấm đăng nhập, vui lòng liên hệ với quản trị trang web. +resent_limit_prompt=Xin lỗi, bạn đã yêu cầu một email kích hoạt mới. Xin vui lòng chờ 3 phút sau đó thử lại. +has_unconfirmed_mail=Chào %s, bạn có một địa chỉ email không được xác nhận (%s). Nếu bạn chưa nhận được một email xác nhận hoặc cần phải gửi lại một email mới, hãy nhấp vào nút dưới đây. +resend_mail=Click vào đây để gửi lại email kích hoạt +send_reset_mail=Click vào đây gửi (lại) email đặt lại mật khẩu của bạn +reset_password=Đặt lại mật khẩu của bạn +invalid_code=Xin lỗi, mã số xác nhận của bạn đã hết hạn hoặc không hợp lệ. +reset_password_helper=Click vào đây để đặt lại mật khẩu của bạn +password_too_short=Độ dài mật khẩu không thể ít hơn 6. +non_local_account=Tài khoản Non-local không thể thay đổi mật khẩu thông qua Gogs. + +login_two_factor=Xác thực 2 bước +login_two_factor_passcode=Mật mã xác thực +login_two_factor_enter_recovery_code=Nhập mã khôi phục 2 bước +login_two_factor_recovery=Khôi phục 2 bước +login_two_factor_recovery_code=Mã phục hồi +login_two_factor_enter_passcode=Nhập mã khóa 2 yếu tố +login_two_factor_invalid_recovery_code=Mã phục hồi đã được sử dụng hoặc không hợp lệ. + +[mail] +activate_account=Xin vui lòng kích hoạt tài khoản +activate_email=Xác minh địa chỉ email của bạn +reset_password=Đặt lại mật khẩu của bạn +register_success=Đăng ký thành công, chào mừng +register_notify=Chào mừng trên hệ thống + +[modal] +yes=Có +no=Không +modify=Sửa đổi + +[form] +UserName=Username +RepoName=Tên kho lưu trữ +Email=Địa chỉ Email +Password=Mật khẩu +Retype=Nhập lại mật khẩu +SSHTitle=Tên key SSH +HttpsUrl=HTTPS URL +PayloadUrl=Payload URL +TeamName=Tên nhóm +AuthName=Tên Ủy quyền +AdminEmail=Admin Email + +NewBranchName=Tên nhánh mới +CommitSummary=Tổng kết commit +CommitMessage=Ghi chú commit +CommitChoice=Lựa chọn commit +TreeName=Đường dẫn tập tin +Content=Nội dung + +require_error=` không thể trống.` +alpha_dash_error=` must be valid alpha or numeric or dash(-_) characters.` +alpha_dash_dot_error=` must be valid alpha or numeric or dash(-_) or dot characters.` +alpha_dash_dot_slash_error='phải là hợp lệ alpha hay số hoặc ký tự dash(-_) hay dot hoặc slashes.' +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 didn't match. +password_not_match=Password and confirm password are not same. + +username_been_taken=Tên người dùng đã được sử dụng. +repo_name_been_taken=Tên kho đã được sử dụng. +org_name_been_taken=Tên tổ chức đã được sử dụng. +team_name_been_taken=Tên nhóm đã được sử dụng. +email_been_used=Email đã được sử dụng. +username_password_incorrect=Tên đăng nhập hoặc mật khẩu không đúng. +auth_source_mismatch=Nguồn xác thực không liên kết đến người dùng. +enterred_invalid_repo_name=Hãy chắc chắn tên kho đã nhập chính xác. +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=Người dùng hiện không tồn tại. +last_org_owner=Removing the last user from a owner team isn't allowed, as there must always be at least one owner in any given organization. + +invalid_ssh_key=Sorry, we're not able to verify your SSH key: %s +unable_verify_ssh_key=Gogs cannot verify your SSH key, but we assume that it is valid, please double-check it. +auth_failed=Xác thực thất bại + +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 has ownership of repositories, you must delete or transfer them first. + +target_branch_not_exist=Target branch does not exist. + +[user] +change_avatar=Change your avatar +join_on=Joined on +repositories=Kho lưu trữ +activity=Public Activity +followers=Người theo dõi +starred=Starred repositories +following=Đang theo dõi +follow=Theo dõi +unfollow=Bỏ theo dõi + +form.name_not_allowed=Tên người dùng %q là không được phép. + +[settings] +profile=Hồ sơ +password=Mật khẩu +avatar=Ảnh đại diện +ssh_keys=SSH keys +security=Bảo mật +repos=Kho phần mềm của tôi +orgs=Tổ chức, cơ quan +applications=Ứng dụng +delete=Xóa tài khoản + +public_profile=Tiểu sử +profile_desc=Địa chỉ email của bạn là công cộng và sẽ được sử dụng cho bất kỳ tài khoản có liên quan thông báo, và bất kỳ web dựa trên hoạt động thực hiện thông qua các trang web. +password_username_disabled=Người dùng Non-local không được phép thay đổi tên người dùng của họ. +full_name=Tên đầy đủ +website=Website +location=Vị trí +update_profile=Chỉnh sửa hồ sơ +update_profile_success=Hồ sơ của bạn đã được cập nhật thành công. +change_username=Đã thay đổi tên đăng nhập +change_username_prompt=Thay đổi này sẽ ảnh hưởng đến cách các liên kết đến tài khoản của bạn. +continue=Tiếp tục +cancel=Hủy bỏ + +lookup_avatar_by_mail=Lookup Avatar by mail +federated_avatar_lookup=Federated Avatars Lookup +enable_custom_avatar=Ảnh đại diện tùy chọn của người dùng +choose_new_avatar=Chọn ảnh đại diện mới +update_avatar=Cập nhật cài đặt ảnh đại diện +delete_current_avatar=Xóa ảnh đại diện hiện tại +uploaded_avatar_not_a_image=Tập tin đã up không phải hình ảnh. +update_avatar_success=Ảnh đại diện của bạn đã được cập nhật thành công. + +change_password=Thay đổi Mật khẩu +old_password=Mật khẩu hiện tại +new_password=Mật khẩu mới +retype_new_password=Nhập lại mật khẩu mới +password_incorrect=Mật khẩu hiện tại không đúng. +change_password_success=Mật khẩu của bạn đã được thay đổi. Bây giờ bạn có thể đăng nhập sử dụng mật khẩu mới. +password_change_disabled=Người dùng Non-local không được phép thay đổi tên người dùng của họ. + +emails=Địa chỉ Email +manage_emails=Quản lý địa chỉ email +email_desc=Địa chỉ email chính của bạn sẽ được sử dụng cho thông báo và các mục khác. +primary=Chính +primary_email=Đặt làm bản chính +delete_email=Xóa +email_deletion=Xóa email +email_deletion_desc=Xóa địa chỉ email này sẽ xóa các thông tin liên quan đến tài khoản của bạn. Bạn có muốn tiếp tục? +email_deletion_success=Đã xóa email thành công! +email_deletion_primary=Cannot delete primary email address. +add_new_email=Thêm địa chỉ email mới +add_email=Thêm email +add_email_confirmation_sent=Một email xác nhận mới đã được gửi đến '%s', xin vui lòng kiểm tra hộp thư của bạn trong vòng giờ %d tiếp theo để hoàn tất quá trình xác nhận. +add_email_success=Địa chỉ email mới được thêm vào thành công. + +manage_ssh_keys=Phím tắt quản lý SSH +add_key=Thêm khoá +ssh_desc=Đây là một danh sách các phím SSH liên kết với tài khoản của bạn. Như các phím cho phép bất cứ ai sử dụng chúng để truy cập vào kho của bạn, nó là rất quan trọng mà bạn chắc chắn rằng bạn nhận ra chúng. +ssh_helper=không biết như thế nào? kiểm tra hướng dẫn của GitHub để tạo của riêng bạn SSH phím hoặc giải quyết các phổ biến những vấn đề bạn có thể gặp phải bằng cách sử dụng SSH. +add_new_key=Thêm SSH Key +ssh_key_been_used=Nội dung khóa công cộng đã được dùng. +ssh_key_name_used=Khóa công khai với cùng tên đã tồn tại. +key_name=Tên khóa +key_content=Nội dung +add_key_success=SSH key mới '%s' đã được thêm vào thành công! +delete_key=Xóa +ssh_key_deletion=SSH Key xóa +ssh_key_deletion_desc=Xoá này SSH key sẽ loại bỏ tất cả liên quan đến truy cập tài khoản của bạn. Bạn có muốn tiếp tục? +ssh_key_deletion_success=SSH key đã bị xoá thành công! +add_on=Được thêm vào +last_used=Được dùng gần nhất vào +no_activity=Không có hoạt động gần đây +key_state_desc=Phím này đã được sử dụng trong vòng 7 ngày qua +token_state_desc=Token này đã được sử dụng trong vòng 7 ngày qua + +two_factor=Xác thực 2 bước +two_factor_status=Trạng thái: +two_factor_on=Bật +two_factor_off=Tắt +two_factor_enable=Kích hoạt +two_factor_disable=Vô hiệu hoá +two_factor_view_recovery_codes=Xem và lưu mã phục hồi của bạn ở một nơi an toàn. Bạn có thể sử dụng chúng như là mật mã, nếu bạn mất quyền truy cập vào ứng dụng xác thực của bạn. +two_factor_http=Cho hoạt động HTTP/HTTPS, bạn không còn có thể sử dụng đồng bằng tên người dùng và mật khẩu. Hãy tạo ra và sử dụng cá nhân truy cập Token như là ủy nhiệm của bạn, ví dụ: %[3]s. +two_factor_enable_title=Bật xác thực 2 bước +two_factor_scan_qr=Hãy sử dụng ứng dụng xác thực của bạn để quét hình ảnh: +two_factor_or_enter_secret=Hoặc nhập mã bí mật: +two_factor_then_enter_passcode=Sau đó nhập mã: +two_factor_verify=Xác minh +two_factor_invalid_passcode=Mật mã mà bạn đã nhập không hợp lệ, hãy thử lại! +two_factor_reused_passcode=Mã bạn nhập đã được sử dụng, hãy nhập mã khác +two_factor_enable_error=Kích hoạt xác thực 2 yếu tố không thành công: %v +two_factor_enable_success=Xác thực 2 yếu tố đã kích hoạt cho tài khoản của bạn thành công! +two_factor_recovery_codes_title=Mã khôi phục xác thực 2 yếu tố +two_factor_recovery_codes_desc=Mã phục hồi được sử dụng khi bạn tạm thời mất quyền truy cập ứng dụng xác thực của bạn. Mỗi mã phục hồi chỉ có thể được sử dụng một lần, xin vui lòng giữ các mã trong một nơi an toàn. +two_factor_regenerate_recovery_codes=Tạo lại mã phục hồi +two_factor_regenerate_recovery_codes_error=Tạo lại mã khôi phục không thành công: %v +two_factor_regenerate_recovery_codes_success=Mã phục hồi mới đã được tạo ra thành công! +two_factor_disable_title=Vô hiệu hóa Xác thực 2 nhân tố +two_factor_disable_desc=Mức độ bảo mật tài khoản của bạn sẽ giảm sau khi Khuyết tật hai nhân tố xác thực. Bạn có muốn tiếp tục? +two_factor_disable_success=Xác thực 2 yếu tố đã vô hiệu hoá thành công! + +manage_access_token=Quản lý mã truy cập cá nhân +generate_new_token=Tạo token mới +tokens_desc=Thẻ bạn đã tạo ra mà có thể được sử dụng để truy cập vào các API Gogs. +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. +new_token_desc=Mỗi token sẽ có thể truy cập vào tài khoản của bạn. +token_name=Token Name +generate_token=Tạo mã +generate_token_succees=Mã thông báo truy cập của bạn đã được tạo ra thành công! Hãy chắc chắn sao chép nó ngay bây giờ, vì bạn sẽ không thể nhìn thấy nó một lần nữa sau đó! +delete_token=Xóa +access_token_deletion=Xóa mã truy cập cá nhân +access_token_deletion_desc=Xóa mã quyền truy cập cá nhân sẽ loại bỏ tất cả liên quan đến truy cập của ứng dụng. Bạn có muốn tiếp tục? +delete_token_success=Mã truy cập cá nhân đã được loại bỏ thành công! Đừng quên để cập nhật ứng dụng của bạn. +token_name_exists=Token cùng tên đã tồn tại + +orgs.none=Bạn không là thành viên của bất kỳ tổ chức nào. +orgs.leave_title=Rời khỏi tổ chức +orgs.leave_desc=Bạn sẽ mất quyền truy cập vào tất cả các kho phần mềm và các nhóm sau khi bạn rời khỏi tổ chức. Bạn có muốn tiếp tục? + +repos.leave=Rời khỏi +repos.leave_title=Rời khỏi kho lưu trữ +repos.leave_desc=Bạn sẽ mất quyền truy cập vào kho sau khi bạn rời. Bạn có muốn tiếp tục? +repos.leave_success=Bạn còn '%s' kho thành công! + +delete_account=Xóa tài khoản của bạn +delete_prompt=Các hoạt động sẽ xóa vĩnh viễn tài khoản của bạn, và KHÔNG THỂ được hoàn tác! +confirm_delete_account=Xác nhận xóa +delete_account_title=Xoá tài khoản +delete_account_desc=Tài khoản này sẽ bị xóa vĩnh viễn, bạn có muốn tiếp tục? + +[repo] +owner=Chủ sở hữu +repo_name=Tên kho +repo_name_helper=Một tên kho tốt thường bao gồm các từ khoá ngắn, đáng nhớ và độc đáo. +visibility=Hiển thị +unlisted=Riêng tư +visiblity_helper=Kho lưu trữ này là riêng tư +unlisted_helper=Kho lưu trữ này làriêng tư +visiblity_helper_forced=Trang web quản trị đã buộc tất cả các kho phần mềm mới được riêng tư +visiblity_fork_helper=(Thay đổi giá trị này sẽ ảnh hưởng đến tất cả forks) +clone_helper=Cần giúp đỡ clone? Ghé thăm trợ giúp! +fork_repo=Kéo về thành kho mới +fork_from=Kéo từ +fork_visiblity_helper=Bạn không thể thay đổi khả năng tìm thấy của một kho lưu trữ kéo về. +repo_desc=Mô tả +repo_lang=Ngôn ngữ +repo_gitignore_helper=Chọn mẫu .gitignore +license=Giấy phép +license_helper=Chọn một tập tin giấy phép +readme=Readme +readme_helper=Chọn một mẫu readme +auto_init=Khởi tạo kho này với tệp đã chọn và mẫu +create_repo=Tạo kho lưu trữ +default_branch=Nhánh mặc định +mirror_prune=Prune +mirror_prune_desc=Loại bỏ bất kỳ tài liệu tham khảo theo dõi từ xa không còn tồn tại trên điều khiển từ xa +mirror_interval=Mirror Interval (hour) +mirror_address=Mirror Address +mirror_address_desc=Xin vui lòng bao gồm các chứng chỉ người dùng cần thiết trong địa chỉ. +mirror_last_synced=Lần đồng bộ cuối +watchers=Người theo dõi +stargazers=Stargazers +forks=Forks +repo_description_helper=Mô tả Reoisitory. Tối đa 512 ký tự +repo_description_length=Ký tự cho phép + +form.reach_limit_of_creation=Chủ sở hữu đã đạt giới hạn tối đa %d kho. +form.name_not_allowed=Tên Repository %q là không hợp lệ + +need_auth=Cần xác thực Ủy quyền +migrate_type=Migration Type +migrate_type_helper=This repository will be a mirror +migrate_repo=Migrate Repository +migrate.clone_address=Clone Address +migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by 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.clone_address_resolved_to_blocked_local_address=Địa chỉ sao chép được giải quyết thành một địa chỉ mạng cục bộ bị chặn hoàn toàn. +migrate.failed=Migration failed: %v + +mirror_from=mirror of +forked_from=forked from +copy_link=Sao chép +copy_link_success=Đã sao chép! +copy_link_error=Press ⌘-C or Ctrl-C to copy +copied=Sao chép OK +unwatch=Ngừng theo dõi +watch=Xem +unstar=Unstar +star=Star +fork=Fork + +no_desc=Không có mô tả +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 +bare_message=This repository does not have any content yet. + +files=Các tập tin +branch=Branch +tree=Tree +filter_branch_and_tag=Filter branch or tag +branches=Branches +tags=Tags +issues=Các vấn đề +pulls=Yêu cầu kéo về +labels=Nhãn +milestones=Milestones +commits=Commits +git_branches=Branches +releases=Phát hành +file_raw=Raw +file_history=Lịch sử +file_view_raw=Xem dưới dạng raw +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. + +branches.overview=Tổng thể +branches.active_branches=Active Branches +branches.stale_branches=Các nhánh cũ +branches.all=Tất cả các nhánh +branches.updated_by=Updated %[1]s by %[2]s +branches.change_default_branch=Thay đổi nhánh mặc định +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. + +editor.new_file=Tập tin mới +editor.upload_file=Tải tập tin lên +editor.edit_file=Sửa tập tin +editor.preview_changes=Xem trước các Thay đổi +editor.cannot_edit_non_text_files=Không thể chỉnh sửa các tập tin không phải là văn bản +editor.edit_this_file=Chỉnh sửa tập tin này +editor.must_be_on_a_branch=Bạn phải trên một nhánh để thực hiện hoặc đề nghị thay đổi đối với tệp này +editor.fork_before_edit=Bạn phải fork kho này trước khi chỉnh sửa tập tin +editor.delete_this_file=Xóa tập tin này +editor.must_have_write_access=Bạn phải có quyền viết mới có thể thay đổi trên tập tin này +editor.file_delete_success='%s' tập tin đã được xóa thành công! +editor.name_your_file=Đặt tên cho tập tin của bạn... +editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. +editor.or=hoặc +editor.cancel_lower=hủy bỏ +editor.commit_changes=Xác nhận các thay đổi +editor.add_tmpl=Add '%s/' +editor.add=Thêm '%s' +editor.update=Cập nhật '%s' +editor.delete=Xóa '%s' +editor.commit_message_desc=Thêm một mô tả tùy chọn... +editor.commit_directly_to_this_branch=Xác nhận ngay đến %s nhánh. +editor.create_new_branch=Tạo một nhánh mới cho commit này và yêu cầu pull mới. +editor.new_branch_name_desc=Tên nhánh mới... +editor.cancel=Hủy bỏ +editor.filename_cannot_be_empty=Tên đăng nhập không thể để trống. +editor.branch_already_exists=Nhánh '%s' đã tồn tại trong kho này. +editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. +editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor. +editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. +editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. +editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. +editor.file_already_exists=Tên tập tin '%s' đã tồn tại trong kho này. +editor.no_changes_to_show=Không có thay đổi nào. +editor.fail_to_update_file=Failed to update/create file '%s' with error: %v +editor.fail_to_delete_file=Lỗi không xóa được file '%s' : %v +editor.add_subdir=Thêm thư mục con... +editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v +editor.upload_files_to_dir=Tải tập tin đến '%s' + +commits.commit_history=Lịch sử commit +commits.commits=Commits +commits.search=Tìm kiếm commits +commits.find=Tìm kiếm +commits.author=Tác giả +commits.message=Thông báo +commits.date=Ngày +commits.older=Cũ hơn +commits.newer=Mới hơn + +issues.new=Vấn đề mới +issues.new.labels=Nhãn +issues.new.no_label=Không có nhãn +issues.new.clear_labels=Xóa nhãn +issues.new.milestone=Milestone +issues.new.no_milestone=Không có Milestone +issues.new.clear_milestone=Xóa milestone +issues.new.open_milestone=Mởi Milestones +issues.new.closed_milestone=Đóng Milestones +issues.new.assignee=Người được phân công +issues.new.clear_assignee=Xóa người được phân công +issues.new.no_assignee=Không có người được phân công +issues.create=Tạo vấn đề +issues.new_label=Nhãn mới +issues.new_label_placeholder=Tên nhãn... +issues.create_label=Tạo nhãn +issues.label_templates.title=Load bộ định nghĩa trước của nhãn +issues.label_templates.info=Không có bất kỳ nhãn nào được nêu ra. Bạn có thể bấm vào nút "Nhãn mới" ở trên để tạo một tài khoản hoặc sử dụng một bộ định sẵn dưới đây. +issues.label_templates.helper=Chọn một set nhãn +issues.label_templates.use=Sử dụng set nhãn này +issues.label_templates.fail_to_load_file=Thất bại để tải file mẫu nhãn '%s': %v +issues.open_tab=%d Đang mở +issues.close_tab=%d Đã đóng +issues.filter_label=Nhãn +issues.filter_label_no_select=Không có nhãn được chọn +issues.filter_milestone=Milestone +issues.filter_milestone_no_select=Không có milestone nào được chọn +issues.filter_assignee=Người được phân công +issues.filter_assginee_no_select=Chưa chọn người được phân công +issues.filter_type=Loại +issues.filter_type.all_issues=Tất cả các vấn đề +issues.filter_type.assigned_to_you=Được phân công cho bạn +issues.filter_type.created_by_you=Được tạo bởi bạn +issues.filter_type.mentioning_you=Nhắc đến bạn +issues.filter_sort=Sắp xếp +issues.filter_sort.latest=Mới nhất +issues.filter_sort.oldest=Cũ nhất +issues.filter_sort.recentupdate=Cập nhật gần đây +issues.filter_sort.leastupdate=Cập Nhật gần đây nhất +issues.filter_sort.mostcomment=Nhận xét nhiều nhất +issues.filter_sort.leastcomment=Nhận xét ít nhất +issues.opened_by=%[1] đang mở bởi %[3]s +issues.opened_by_fake=%[1] đang mở bởi %[2]s +issues.previous=Trước +issues.next=Tiếp +issues.open_title=Mở +issues.closed_title=Đã đóng +issues.num_comments=%d ý kiến +issues.commented_at='đã nhận xét %s' +issues.delete_comment_confirm=Are you sure you want to delete this comment? +issues.no_content=Ở đây vẫn chưa có nội dung nào. +issues.close_issue=Đóng +issues.close_comment_issue=Bình luận và đóng +issues.reopen_issue=Mở lại +issues.reopen_comment_issue=Bình luận và mở lại +issues.create_comment=Ý kiến +issues.closed_at=`closed %[2]s` +issues.reopened_at=`reopened %[2]s` +issues.commit_ref_at=`referenced this issue from a commit %[2]s` +issues.poster=Poster +issues.collaborator=Người hợp tác +issues.owner=Chủ sở hữu +issues.sign_in_require_desc=Đăng nhập để tham gia bình luận. +issues.edit=Chỉnh sửa +issues.cancel=Hủy bỏ +issues.save=Lưu +issues.label_title=Tên nhãn +issues.label_color=Màu nhãn +issues.label_count=%d nhãn +issues.label_open_issues=%d vấn đề đang mở +issues.label_edit=Chỉnh sửa +issues.label_delete=Xóa +issues.label_modify=Sửa đổi nhãn +issues.label_deletion=Xoá nhãn +issues.label_deletion_desc=Xoá nhãn hiệu này sẽ loại bỏ thông tin của nó ở tất cả các vấn đề có liên quan. Bạn có muốn tiếp tục? +issues.label_deletion_success=Nhãn đã được xóa thành công! +issues.num_participants=%d tham gia +issues.attachment.open_tab='Click để xem "%s" trong tab mới' +issues.attachment.download=' Nhấn vào đây để tải về "%s"' + +pulls.new=Yêu cầu kéo mới +pulls.compare_changes=So sánh những thay đổi +pulls.compare_changes_desc=So sánh hai nhánh và thực hiện một yêu cầu kéo cho thay đổi. +pulls.compare_base=cơ sở +pulls.compare_compare=so sánh +pulls.filter_branch=Bộ lọc nhánh +pulls.no_results=Không có kết quả được tìm thấy. +pulls.nothing_to_compare=Không có gì để so sánh vì nhánh cơ sở và head giống nhau. +pulls.nothing_merge_base=Không có gì để so sánh vì hai nhánh có lịch sử hoàn toàn khác nhau. +pulls.has_pull_request=' Đây đã là một yêu cầu kéo giữa hai mục tiêu này: %[2]s #%[3]d ' +pulls.create=Tạo yêu cầu kéo +pulls.title_desc=muốn nhập %[1]d commit từ %[2]s vào %[3]s +pulls.merged_title_desc=đã nhập %[1]d commit từ %[2]s vào [3]s %[4]s +pulls.tab_conversation=Hội thoại +pulls.tab_commits=Commits +pulls.tab_files=Các file đã thay đổi +pulls.reopen_to_merge=Xin vui lòng mở lại yêu cầu kéo này để thực hiện các hoạt động sát nhập code. +pulls.merged=Đã hợp nhất +pulls.has_merged=Yêu cầu kéo này đã được sáp nhập thành công! +pulls.data_broken=Dữ liệu của yêu cầu kéo này đã bị phá vỡ do xóa thông tin fork. +pulls.is_checking=Kiểm tra xung đột là vẫn còn trong tiến trình, hãy làm mới trang trong vài phút. +pulls.can_auto_merge_desc=Yêu cầu kéo này có thể được sáp nhập tự động. +pulls.cannot_auto_merge_desc=Yêu cầu kéo này không thể được kết hợp tự động bởi vì có các xung đột. +pulls.cannot_auto_merge_helper=Xin vui lòng nhập theo cách thủ công để giải quyết các cuộc xung đột. +pulls.create_merge_commit=Tạo một merge commit +pulls.rebase_before_merging=Rebase trước khi sáp nhập +pulls.commit_description=Mô tả commit +pulls.merge_pull_request=Merge Pull Request +pulls.open_unmerged_pull_exists=' Bạn không thể thực hiện thao tác reopen vì đã có một yêu cầu kéo đang mở (#%d) từ kho lưu trữ cùng với cùng một kết hợp thông tin và chờ đợi cho việc sáp nhập.' +pulls.delete_branch=Xóa nhánh +pulls.delete_branch_has_new_commits=Nhánh không thể bị xoá vì nó có các commit mới sau sáp nhập. + +milestones.new=Milestone mới +milestones.open_tab=%d Đang mở +milestones.close_tab=%d Đã đóng +milestones.closed=Đóng %s +milestones.no_due_date=Không có ngày đến hạn +milestones.open=Mở +milestones.close=Đóng +milestones.new_subheader=Tạo milestones để tổ chức các vấn đề của bạn. +milestones.create=Tạo Milestone +milestones.title=Tiêu đề +milestones.desc=Mô tả +milestones.due_date=Ngày đến hạn (tùy chọn) +milestones.clear=Xóa +milestones.invalid_due_date_format=Ngày đến hạn không hợp lệ, phải là kiểu 'yyyy-mm-dd'. +milestones.create_success=Milestone '%s' đã được tạo thành công! +milestones.edit=Chỉnh sửa Milestone +milestones.edit_subheader=Sử dụng một mô tả tốt hơn cho Milestone do đó mọi người sẽ không nhầm lẫn. +milestones.cancel=Hủy bỏ +milestones.modify=Chỉnh sửa Milestone +milestones.edit_success=Những thay đổi của milestone '%s' đã được lưu thành công! +milestones.deletion=Xóa Milestone +milestones.deletion_desc=Xoá milestone này sẽ loại bỏ thông tin của nó ở tất cả các vấn đề có liên quan. Bạn có muốn tiếp tục? +milestones.deletion_success=Miletone đã được xóa thành công! + +wiki=Wiki +wiki.welcome=Chào mừng đến với Wiki! +wiki.welcome_desc=Wiki là nơi mà bạn muốn tài liệu hóa dự án của bạn và làm cho nó tốt hơn. +wiki.create_first_page=Tạo trang đầu tiên +wiki.page=Trang +wiki.filter_page=Bộ lọc trang +wiki.new_page=Tạo trang mới +wiki.default_commit_message=Viết một lưu ý về bản cập nhật này (tùy chọn). +wiki.save_page=Lưu trang +wiki.last_commit_info=%s đã chỉnh sửa trang này %s +wiki.edit_page_button=Chỉnh sửa +wiki.new_page_button=Trang mới +wiki.delete_page_button=Xóa trang +wiki.delete_page_notice_1=Việc này sẽ xóa trang "%s". Xin vui lòng chắc chắn. +wiki.page_already_exists=Trang wiki với cùng tên đã tồn tại. +wiki.pages=Các trang +wiki.last_updated=Cập Nhật lần cuối %s + +settings=Cài đặt +settings.options=Tuỳ chọn +settings.collaboration=Người hợp tác +settings.collaboration.admin=Quản trị +settings.collaboration.write=Viết +settings.collaboration.read=Đọc +settings.collaboration.undefined=Không xác định +settings.branches=Các nhánh +settings.branches_bare=Bạn không thể quản lý các nhánh cho kho trống. Hãy đẩy một số nội dung lên trước. +settings.default_branch=Nhánh mặc định +settings.default_branch_desc=Chi nhánh mặc định được coi là các chi nhánh "cơ sở" cho commit, yêu cầu pull và chỉnh sửa trực tuyến. +settings.update=Cập nhật +settings.update_default_branch_unsupported=Thay đổi nhánh mặc định không hỗ trợ ở phiên bản Git trên máy chủ. +settings.update_default_branch_success=Nhánh mặc định của kho lưu trữ này đã được cập nhật thành công! +settings.protected_branches=Nhánh được bảo vệ +settings.protected_branches_desc=Bảo vệ các nhánh từ force pushing, tình cờ xóa và danh sách trắng mã số committers. +settings.choose_a_branch=Chọn một nhánh... +settings.branch_protection=Bảo vệ nhánh +settings.branch_protection_desc=Xin chọn tùy chọn bảo vệ cho nhánh %s. +settings.protect_this_branch=Bảo vệ nhánh này +settings.protect_this_branch_desc=Vô hiệu hóa force push và ngăn chặn việc xóa. +settings.protect_require_pull_request=Bắc buộc yêu cầu kéo thay vì đẩy trực tiếp +settings.protect_require_pull_request_desc=Bật tùy chọn này để vô hiệu hoá trực tiếp đẩy để chi nhánh này. Cam kết có thể được đẩy đến một chi nhánh bảo vệ phòng không và sáp nhập để chi nhánh này thông qua kéo yêu cầu. +settings.protect_whitelist_committers=Whitelist những ai có thể đẩy vào nhánh này +settings.protect_whitelist_committers_desc=Thêm người hoặc nhóm vào danh sách trắng của trực tiếp đẩy để chi nhánh này. Người dùng trong whitelist sẽ bỏ qua yêu cầu kéo yêu cầu kiểm tra. +settings.protect_whitelist_users=Những người dùng có thể đẩy đến nhánh này +settings.protect_whitelist_search_users=Tìm kiếm người dùng +settings.protect_whitelist_teams=Các đội mà các thành viên của họ có thể đẩy đến chi nhánh này +settings.protect_whitelist_search_teams=Tìm kiếm nhóm +settings.update_protect_branch_success=Tùy chọn bảo mật cho nhánh này đã được cập nhật thành công! +settings.hooks=Webhooks +settings.githooks=Git Hooks +settings.basic_settings=Cài đặt cơ bản +settings.mirror_settings=Thiết lập Mirror +settings.sync_mirror=Đồng bộ Ngay +settings.mirror_sync_in_progress=Quá trình đồng bộ Mirror đang trong quá xử lý, hãy làm mới trang trong khoảng một phút. +settings.site=Trang chính thức +settings.update_settings=Cập nhật cài đặt +settings.change_reponame_prompt=Sự thay đổi này sẽ ảnh hưởng đến cách liên kết liên quan đến kho. +settings.advanced_settings=Cài đặt Nâng cao +settings.wiki_desc=Kích hoạt hệ thống wiki +settings.use_internal_wiki=Sử dụng builtin wiki +settings.allow_public_wiki_desc=Cho phép truy cập công cộng đến wiki khi kho là riêng tư +settings.use_external_wiki=Sử dụng wiki bên ngoài +settings.external_wiki_url=URL Wiki bên ngoài +settings.external_wiki_url_desc=Khách sẽ được chuyển hướng đến URL khi họ click vào tab. +settings.issues_desc=Kích hoạt theo dõi vấn đề +settings.use_internal_issue_tracker=Sử dụng builtin lightweight issue tracker +settings.allow_public_issues_desc=Cho phép truy cập công cộng đến các vấn đề khi kho là riêng tư +settings.use_external_issue_tracker=Sử dụng công cụ theo dõi vấn đề bên ngoài +settings.external_tracker_url=URL theo dõi các vấn đề bên ngoài +settings.external_tracker_url_desc=Khách sẽ được chuyển hướng đến URL khi họ click vào tab. +settings.tracker_url_format=Định dạng URL theo dõi các vấn đề bên ngoài +settings.tracker_issue_style=Kiểu Url theo dõi các vấn đề bên ngoài: +settings.tracker_issue_style.numeric=Kiểu số +settings.tracker_issue_style.alphanumeric=Chữ số +settings.tracker_url_format_desc=You can use placeholder {user} {repo} {index} for user name, repository name and issue index. +settings.pulls_desc=Bật yêu cầu kéo để chấp nhận đóng góp giữa các kho lưu trữ và các nhánh +settings.pulls.ignore_whitespace=Bỏ qua sự thay đổi của khoảng trắng +settings.pulls.allow_rebase_merge=Cho phép sử dụng rebase để merge các commit +settings.danger_zone=Vùng nguy hiểm +settings.cannot_fork_to_same_owner=Bạn không thể fork một kho khi là chủ sở hữu ban đầu. +settings.new_owner_has_same_repo=Chủ sở hữu mới đã có một kho lưu trữ với cùng tên. Hãy chọn tên khác. +settings.convert=Chuyển đổi về Kho thường xuyên +settings.convert_desc=Bạn có thể chuyển đổi mirror này thành một kho thường xuyên. Điều này không thể đảo ngược. +settings.convert_notices_1=- Hành động này sẽ chuyển đổi repository mirror này thành một kho thường xuyên và không thể quay ngược lại. +settings.convert_confirm=Xác nhận chuyển đổi +settings.convert_succeed=Kho đã được chuyển đổi sang dạng thường xuyên thành công. +settings.transfer=Chuyển quyền sở hữu +settings.transfer_desc=Chuyển nhượng kho này đến người dùng khác hoặc cho một tổ chức mà bạn có quyền quản trị. +settings.transfer_notices_1=-Bạn sẽ mất quyền truy cập nếu chủ sở hữu mới là một người dùng cá nhân. +settings.transfer_notices_2=-Bạn sẽ tiết kiệm truy cập nếu chủ sở hữu mới là một tổ chức và nếu bạn là một trong các chủ sở hữu. +settings.transfer_form_title=Vui lòng nhập thông tin sau để xác nhận hoạt động của bạn: +settings.wiki_delete=Xóa dữ liệu Wiki +settings.wiki_delete_desc=Một khi bạn xóa dữ liệu wiki nó sẽ không thể khôi phục. Xin vui lòng chắc chắn. +settings.wiki_delete_notices_1=-Điều này sẽ xóa và vô hiệu hóa wiki cho %s +settings.wiki_deletion_success=Dữ liệu wiki đã được xóa thành công. +settings.delete=Xóa kho này +settings.delete_desc=Khi bạn xoá một kho lưu trữ, nó sẽ không thể khôi phục. Xin vui lòng chắc chắn. +settings.delete_notices_1=- Hành động này KHÔNG THỂ được hoàn tác. +settings.delete_notices_2=- Hành động này sẽ xóa vĩnh viễn tất cả mọi thứ trong kho này, bao gồm cả dữ liệu Git, các vấn đề, ý kiến và truy cập cộng tác viên. +settings.delete_notices_fork_1=-Tất cả forks sẽ trở thành độc lập sau khi xóa. +settings.deletion_success=Kho lưu trữ đã được xóa thành công! +settings.update_settings_success=Tùy chọn kho lưu trữ đã được cập nhật thành công. +settings.transfer_owner=Chủ sở hữu mới +settings.make_transfer=Thực hiện chuyển giao +settings.transfer_succeed=Quyền sở hữu kho đã được chuyển thành công. +settings.confirm_delete=Xác nhận xóa +settings.add_collaborator=Thêm mới cộng tác viên +settings.add_collaborator_success=Cộng tác viên mới đã được thêm vào. +settings.delete_collaborator=Xóa +settings.collaborator_deletion=Xóa cộng tác viên +settings.collaborator_deletion_desc=Người dùng này sẽ không có quyền truy cập cộng tác vào kho này sau khi xóa. Bạn có muốn tiếp tục? +settings.remove_collaborator_success=Cộng tác viên đã được gỡ bỏ. +settings.search_user_placeholder=Tìm kiếm người dùng... +settings.org_not_allowed_to_be_collaborator=Tổ chức không được phép được thêm vào như là một cộng tác viên. +settings.hooks_desc=Webhooks nhiều như cơ bản HTTP bài sự kiện gây nên. Bất cứ khi nào một cái gì đó xảy ra tại Gogs, chúng tôi sẽ xử lý thông báo máy chủ mục tiêu mà bạn chỉ định. Tìm hiểu thêm trong này Webhooks hướng dẫn. +settings.webhooks.add_new=Thêm webhook mới: +settings.webhooks.choose_a_type=Chọn kiểu... +settings.add_webhook=Thêm Webhook +settings.webhook_deletion=Xóa Webhook +settings.webhook_deletion_desc=Xóa bỏ điều này webhook sẽ loại bỏ tất cả phân phối lịch sử và thông tin của nó. Bạn có muốn tiếp tục? +settings.webhook_deletion_success=Webhook đã được xoá thành công! +settings.webhook.test_delivery=Kiểm tra phân phối +settings.webhook.test_delivery_desc=Gửi một sự kiện push giả để kiểm tra cài đặt webhook của bạn +settings.webhook.test_delivery_success=Kiểm tra webhook đã được thêm vào hàng đợi phân phối. Có thể mất vài giây trước khi nó hiện lên trong lịch sử phân phối. +settings.webhook.redelivery=Phân phối lại +settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. +settings.webhook.request=Yêu cầu +settings.webhook.response=Phản hồi +settings.webhook.headers=Tiêu đề +settings.webhook.payload=Trả phí +settings.webhook.body=Nội dung +settings.webhook.err_cannot_parse_payload_url=Không thể phân tích URL: %v +settings.webhook.url_resolved_to_blocked_local_address=URL khối được giải quyết thành một địa chỉ mạng cục bộ bị chặn hoàn toàn. +settings.githooks_desc=Git Hooks are powered by Git itself, you can edit files of supported hooks in the list below to perform custom operations. +settings.githook_edit_desc=If the hook is inactive, sample content will be presented. Leaving content to an empty value will disable this hook. +settings.githook_name=Tên Hook +settings.githook_content=Nội dung Hook +settings.update_githook=Cập nhật Hook +settings.add_webhook_desc=Gogs sẽ gửi một bài yêu cầu cho URL bạn chỉ định, cùng với các chi tiết liên quan đến các sự kiện xảy ra. Bạn cũng có thể xác định những loại định dạng dữ liệu mà bạn muốn nhận được sau khi kích hoạt các móc (JSON, x-www-form-urlencoded, XML, vv). Thông tin thêm có thể được tìm thấy trong chúng tôi Webhooks hướng dẫn. +settings.payload_url=Payload URL +settings.content_type=Loại nội dung +settings.secret=Bí mật +settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. +settings.slack_username=Username +settings.slack_icon_url=Icon URL +settings.slack_color=Màu sắc +settings.event_desc=Webhook này nên được kích hoạt khi? +settings.event_push_only=Chỉ các sự kiện đẩy lên. +settings.event_send_everything=Tôi cần tất cả mọi thứ. +settings.event_choose=Hãy để tôi chọn những gì tôi cần. +settings.event_create=Tạo +settings.event_create_desc=Nhánh hoặc Thẻ đã được tạo +settings.event_delete=Xóa +settings.event_delete_desc=Nhánh hoặc thẻ đã được xóa +settings.event_fork=Fork +settings.event_fork_desc=Kho đã fork +settings.event_push=Đẩy +settings.event_push_desc=Git push đến một kho +settings.event_issues=Các vấn đề +settings.event_issues_desc=Vấn đề mở, đóng cửa, mở cửa trở lại, chỉnh sửa, phân công, unassigned, nhãn Cập Nhật, nhãn xóa, milestoned hoặc demilestoned. +settings.event_pull_request=Yêu cầu khéo về +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=Bình luận của vấn đề +settings.event_issue_comment_desc=Vấn đề bình luận đã tạo, chỉnh sửa hoặc xóa. +settings.event_release=Phát hành +settings.event_release_desc=Bản phân phối đã được công khai ở một kho. +settings.active=Kích hoạt +settings.active_helper=Thông tin chi tiết về các sự kiện kích hoạt các móc sẽ được gửi như là tốt. +settings.add_hook_success=Webhook mới đã được thêm vào. +settings.update_webhook=Cập nhật Webhook +settings.update_hook_success=Webhook đã được Cập Nhật. +settings.delete_webhook=Xóa Webhook +settings.recent_deliveries=Phân phối gần đây +settings.hook_type=Kiểu Hook +settings.add_slack_hook_desc=Thêm Slack tích hợp vào kho lưu trữ của bạn. +settings.add_discord_hook_desc=Thêm Discord tích hợp vào kho lưu trữ của bạn. +settings.add_dingtalk_hook_desc=Thêm Dingtalk tích hợp vào kho lưu trữ của bạn. +settings.slack_token=Token +settings.slack_domain=Tên miền +settings.slack_channel=Kênh +settings.deploy_keys=Khóa triển khai +settings.deploy_keys_helper=Common Gotcha! nếu bạn đang tìm cách thêm khóa cá nhân công cộng, xin vui lòng thêm chúng vào cài đặt tài khoản. +settings.add_deploy_key=Thêm khóa triển khai +settings.deploy_key_desc=Triển khai các phím có thể truy cập chỉ đọc. Họ là không giống như các tài khoản cá nhân SSH phím. +settings.no_deploy_keys=Bạn chưa thêm khóa triển khai nào. +settings.title=Tiêu đề +settings.deploy_key_content=Nội dung +settings.key_been_used=Nội dung khóa triển khai đã được sử dụng. +settings.key_name_used=Đã tồn tại khóa triển khai cùng tên. +settings.add_key_success=Bộ nhớ heap đã được phát hành! +settings.deploy_key_deletion=Xóa Khóa triển khai +settings.deploy_key_deletion_desc=Xóa bỏ điều này triển khai các phím sẽ loại bỏ tất cả liên quan đến truy cập cho các kho lưu trữ này. Bạn có muốn tiếp tục? +settings.deploy_key_deletion_success=Deploy key has been deleted successfully! +settings.description_desc=Mô tả kho. Tối đa 512 ký tự +settings.description_length=Ký tự cho phép + +diff.browse_source=Browse Source +diff.parent=mục cha +diff.commit=commit +diff.data_not_available=Dữ liệu sai khác không khả dụng. +diff.show_diff_stats=Hiển thị tình trạng sai khác +diff.show_split_view=Split View +diff.show_unified_view=View chưa được định nghĩa +diff.stats_desc= %d tập tin đã thay đổi với %d bổ sung%d xóa +diff.bin=BIN +diff.view_file=Xem Tập Tin +diff.file_suppressed=Những thai đổi đã bị hủy bỏ vì nó quá lớn +diff.too_many_files=Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác + +release.releases=Phát hành +release.new_release=Mới ra mắt +release.draft=Bản thảo +release.prerelease=Chuẩn bị phát hành +release.edit=chỉnh sửa +release.ahead=%d commit đến %s đến phiên bản này +release.source_code=Mã Nguồn +release.new_subheader=Phát hành công khai để lặp lại sản phẩm. +release.edit_subheader=Chi tiết các thay đổi có thể giúp người dùng hiểu những gì đã được cải thiện. +release.tag_name=Tên thẻ +release.target=Đích +release.tag_helper=Chọn thẻ hiện tại hoặc tạo một thẻ mới vào xuất bản. +release.title=Tiêu đề +release.content=Nội dung +release.write=Viết +release.preview=Xem trước +release.loading=Đang tải... +release.prerelease_desc=Đây là bản chuẩn bị phát hành +release.prerelease_helper=Chúng tôi sẽ chỉ ra rằng bản phát hành này không phải là sản xuất-sẵn sàng. +release.cancel=Hủy bỏ +release.publish=Công khai bản phát hành +release.save_draft=Lưu Bản Thảo +release.edit_release=Chỉnh sửa bản phát hành +release.delete_release=Xóa bản phát hành này +release.deletion=Xóa phát hành +release.deletion_desc=Xóa bản phát hành này sẽ xóa từ khóa Git tương ứng. Bạn có muốn tiếp tục? +release.deletion_success=Bản phát hành đã được xóa thành công! +release.tag_name_already_exist=Phát hành với tên thẻ đã tồn tại. +release.tag_name_invalid=Tên Tag không hợp lệ. +release.downloads=Tải xuống + +[org] +org_name_holder=Tên tổ chức +org_full_name_holder=Tên đầy đủ của tổ chức +org_name_helper=Tên một tổ chức tốt là ngắn và đáng nhớ. +create_org=Tạo tổ chức mới +repo_updated=Đã cập nhật +people=Mọi người +invite_someone=Mời một ai đó +teams=Nhóm +lower_members=thành viên +lower_repositories=kho lưu trữ +create_new_team=Tạo nhóm mới +org_desc=Mô tả +team_name=Tên nhóm +team_desc=Mô tả +team_name_helper=Bạn sẽ sử dụng tên này đề cập đến nhóm này trong cuộc hội thoại. +team_desc_helper=Thông tin về nhóm này là gì? +team_permission_desc=Cấp độ quyền nhóm này có? + +form.name_not_allowed=Tên tổ chức %q là không hợp lệ. +form.team_name_not_allowed=Tên nhóm %q là không hợp lệ + +settings=Các cài đặt +settings.options=Tuỳ chọn +settings.full_name=Tên đầy đủ +settings.website=Website +settings.location=Vị trí +settings.update_settings=Cập nhật cài đặt +settings.update_setting_success=Các cài đặt tổ chức đã được cập nhật thành công. +settings.change_orgname_prompt=Sự thay đổi này sẽ ảnh hưởng đến cách liên kết liên quan đến tổ chức. +settings.update_avatar_success=Ảnh đại diện của tổ chức đã được cập nhật thành công. +settings.delete=Xóa tổ chức +settings.delete_account=Xóa tổ chức này +settings.delete_prompt=Các tổ chức sẽ bị loại bỏ vĩnh viễn, và
KHÔNG THỂ được hoàn tác! +settings.confirm_delete_account=Xác nhận xóa +settings.delete_org_title=Xóa tổ chức +settings.delete_org_desc=Tổ chức này sẽ bị xóa vĩnh viễn, bạn có muốn tiếp tục? +settings.hooks_desc=Thêm webhooks mà sẽ được kích hoạt cho tất cả kho theo tổ chức này. + +members.membership_visibility=Khả năng hiển thị thành viên: +members.public=Công khai +members.public_helper=làm cho riêng tư +members.private=Riêng tư +members.private_helper=công khai +members.member_role=Vai trò người dùng: +members.owner=Chủ sở hữu +members.member=Thành viên +members.remove=Loại bỏ +members.leave=Rời khỏi +members.invite_desc=Thêm một thành viên vào %s: +members.invite_now=Mời ngay + +teams.join=Tham gia +teams.leave=Rời khỏi +teams.read_access=Quyền đọc +teams.read_access_helper=Nhóm này sẽ có thể xem và nhân bản kho của họ. +teams.write_access=Quyền viết +teams.write_access_helper=Nhóm này sẽ có thể đọc kho của họ, cũng như pull đến kho. +teams.admin_access=Truy cập quản trị +teams.admin_access_helper=Nhóm này sẽ có thể đẩy/kéo đến kho của họ, cũng như thêm cộng tác viên khác cho họ. +teams.no_desc=Nhóm này không có mô tả +teams.settings=Cài đặt +teams.owners_permission_desc=Chủ sở hữu có thể truy cập vào tất cả kho quyền admin của tổ chức. +teams.members=Thành viên nhóm +teams.update_settings=Cập nhật cài đặt +teams.delete_team=Xóa nhóm này +teams.add_team_member=Thêm thành viên +teams.delete_team_title=Xóa nhóm +teams.delete_team_desc=Khi đội bóng này sẽ bị xóa, thành viên của đội bóng này có thể mất quyền truy cập đến một số kho. Bạn có muốn tiếp tục? +teams.delete_team_success=Nhóm đã được xóa thành công. +teams.read_permission_desc=Các thành viên trong nhóm này được cấp quyền đọc: các thành viên đó có thể xem và sao chép các các kho lưu trữ của nhóm. +teams.write_permission_desc=Các thành viên trong nhóm này cho phép quyền ghi : thành viên có thể đọc và push vào kho phần mềm của nhóm. +teams.admin_permission_desc=Các thành viên trong đội ngũ này được cấp quyền truy cập Admin: thành viên có thể đọc, đẩy vào và thêm cộng tác viên cho các kho của nhóm. +teams.repositories=Kho lưu trữ của nhóm +teams.search_repo_placeholder=Tìm kho phần mềm... +teams.add_team_repository=Thêm Kho của nhóm +teams.remove_repo=Loại bỏ +teams.add_nonexistent_repo=Kho lưu trữ bạn đang cố gắng để thêm không tồn tại, hãy tạo ra nó đầu tiên. + +[admin] +dashboard=Bảng điều khiển +users=Người dùng +organizations=Tổ chức, cơ quan +repositories=Kho lưu trữ +authentication=Xác thực +config=Cấu hình +notices=Thông báo hệ thống +monitor=Giám sát +first_page=Đầu tiên +last_page=Cuối +total=Tổng: %d + +dashboard.build_info=Build Information +dashboard.app_ver=Phiên bản phần mềm +dashboard.git_version=Phiên bản Git +dashboard.go_version=Phiên bản Go +dashboard.build_time=Build time +dashboard.build_commit=Build commit +dashboard.statistic=Thống kê +dashboard.operations=Hoạt động +dashboard.system_status=Tình trạng quản lý hệ thống +dashboard.statistic_info=Gogs database có %d users, %d organizations, %d public keys, %d repositories, %d watches, %d stars, %d actions, %d accesses, %d issues, %d comments, %d social accounts, %d follows, %d mirrors, %d releases, %d login sources, %d webhooks, %d milestones, %d labels, %d hook tasks, %d teams, %d update tasks, %d attachments. +dashboard.operation_name=Tên hành động +dashboard.operation_switch=Chuyển đổi +dashboard.select_operation_to_run=Vui lòng chọn thao tác để chạy +dashboard.operation_run=Chạy +dashboard.clean_unbind_oauth=Clean unbound OAuthes +dashboard.clean_unbind_oauth_success=Tất cả các unbind OAuthes đã được xóa thành công. +dashboard.delete_inactivate_accounts=Xóa tất cả các tài khoản không hoạt động +dashboard.delete_inactivate_accounts_success=Tất cả tài khoản không hoạt động đã bị xóa thành công. +dashboard.delete_repo_archives=Xóa tất cả kho lưu trữ +dashboard.delete_repo_archives_success=Tất cả kho lưu trữ đã được xóa thành công. +dashboard.delete_missing_repos=Xóa tất cả các record kho mà mất các file Git +dashboard.delete_missing_repos_success=Tất cả các mẫu tin kho mất file Git đã xóa thành công. +dashboard.git_gc_repos=Làm bộ sưu tập rác trên kho +dashboard.git_gc_repos_success=Tất cả kho có thực hiện thu gom rác thải thành công. +dashboard.resync_all_sshkeys=Viết lại các tập tin '.ssh/authorized_keys' (caution: non-Gogs keys will be lost) +dashboard.resync_all_sshkeys_success=Tất cả các khóa công cộng đã được viết lại thành công. +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 tất cả các kho mà mất các tập tin Git +dashboard.reinit_missing_repos_success=Tất cả các hồ sơ kho mất tập tin Git đã được reinitialized thành công. + +dashboard.server_uptime=Thời gian phục vụ +dashboard.current_goroutine=Goroutines hiện tại +dashboard.current_memory_usage=Tình trạng sử dụng bộ nhớ +dashboard.total_memory_allocated=Tổng bộ nhớ được cấp phát +dashboard.memory_obtained=Bộ nhớ thu được +dashboard.pointer_lookup_times=Số lần Pointer Lookup +dashboard.memory_allocate_times=Số lần cấp phát bộ nhớ +dashboard.memory_free_times=Số lần giải phóng bộ nhớ +dashboard.current_heap_usage=Tình trạng sử dụng heap hiện tại +dashboard.heap_memory_obtained=Bộ nhớ heap thu được +dashboard.heap_memory_idle=Bộ nhớ heap idle +dashboard.heap_memory_in_use=Bộ nhớ heap đang trong sử dụng +dashboard.heap_memory_released=Đã gải phóng bộ nhớ heap +dashboard.heap_objects=Đối tượng Heap +dashboard.bootstrap_stack_usage=Cách sử dụng ngăn xếp bootstrap +dashboard.stack_memory_obtained=Bộ nhớ stack thu được +dashboard.mspan_structures_usage=Cách sử dụng cấu trúc MSpan +dashboard.mspan_structures_obtained=Cấu trúc MSpan thu được +dashboard.mcache_structures_usage=Cách sử dụng cấu trúc MCache +dashboard.mcache_structures_obtained=Cấu trúc MCache thu được +dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtained +dashboard.gc_metadata_obtained=GC Metadata Obtained +dashboard.other_system_allocation_obtained=Hệ thống phân bổ thu được +dashboard.next_gc_recycle=Next GC Recycle +dashboard.last_gc_time=Since Last GC Time +dashboard.total_gc_time=Total GC Pause +dashboard.total_gc_pause=Total GC Pause +dashboard.last_gc_pause=Last GC Pause +dashboard.gc_times=GC Times + +users.user_manage_panel=Bảng quản lý người dùng +users.new_account=Tạo Tài khoản mới +users.name=Tên +users.activated=Đã kích hoạt +users.admin=Quản trị +users.repos=Kho +users.created=Đã tạo +users.send_register_notify=Gửi thông báo đăng ký cho người dùng +users.new_success=Tài khoản mới '%s' đã được tạo thành công. +users.edit=Chỉnh sửa +users.auth_source=Xác thực mã nguồn +users.local=Cục bộ +users.auth_login_name=Tên đăng nhập xác thực +users.password_helper=Để trống nếu không muốn thay đổi. +users.update_profile_success=Hồ sơ tài khoản đã được cập nhật thành công. +users.edit_account=Chỉnh sửa tài khoản +users.max_repo_creation=Giới hạn số kho nhiều nhất có thể tạo +users.max_repo_creation_desc=(Đặt -1 để sử dụng giới hạn toàn cục) +users.is_activated=Tài khoản này đã được kích hoạt +users.prohibit_login=Tài khoản này đã bị cấm đăng nhập +users.is_admin=Tài khoản này có quyền quản trị +users.allow_git_hook=Tài khoản này có quyền tạo Git hooks +users.allow_import_local=Tài khoản này có quyền import kho địa phương +users.update_profile=Cập nhật thông tin tài khoản +users.delete_account=Xoá tài khoản này +users.still_own_repo=Tài khoản này vẫn có quyền sở hữu qua ít nhất một kho lưu trữ, bạn có thể xóa hoặc chuyển chúng trước tiên. +users.still_has_org=Tài khoản này vẫn còn là thành viên trong ít nhất một tổ chức, bạn phải rời khỏi hoặc xóa các tổ chức trước tiên. +users.deletion_success=Tài khoản đã bị xoá thành công! + +orgs.org_manage_panel=Bảng quản lý tổ chức +orgs.name=Tên +orgs.teams=Nhóm +orgs.members=Thành viên + +repos.repo_manage_panel=Bảng quản lý kho lưu trữ +repos.owner=Chủ sở hữu +repos.name=Tên +repos.private=Riêng tư +repos.watches=Người xem +repos.stars=Sao +repos.issues=Các vấn đề +repos.size=Kích cỡ + +auths.auth_sources=Nguồn xác thực +auths.new=Thêm mới source +auths.name=Tên +auths.type=Loại +auths.enabled=Đã kích hoạt +auths.default=Mặc định +auths.updated=Đã cập nhật +auths.auth_type=Loại xác thực +auths.auth_name=Tên đăng nhập xác thực +auths.security_protocol=Phương thức bảo mật +auths.domain=Tên miền +auths.host=Host +auths.port=Cổng +auths.bind_dn=Bind DN +auths.bind_dn_helper=Bạn có thể sử dụng '%s' như là placeholder cho tên người dùng, ví dụ: DOM\%s +auths.bind_password=Ràng buộc mật khẩu +auths.bind_password_helper=Chú ý: Mật khẩu này được lưu trữ trong văn bản thuần tuý. Không sử dụng một tài khoản đặc quyền cao. +auths.user_base=Tìm kiếm người dùng cơ bản +auths.user_dn=Người dùng DN +auths.attribute_username=Thuộc tính tên đăng nhập +auths.attribute_username_placeholder=Leave empty to use sign-in form field value for user name. +auths.attribute_name=Thuộc tính Tên +auths.attribute_surname=Thuộc tính Tên đầy đủ +auths.attribute_mail=Thuộc tính email +auths.verify_group_membership=Xác minh nhóm thành viên +auths.group_search_base_dn=Nhóm tìm kiếm cơ sở DN +auths.group_filter=Bộ lọc nhóm +auths.group_attribute_contain_user_list=Thuộc tính nhóm chứa danh sách người dùng +auths.user_attribute_listed_in_group=Thuộc tính người dùng được liệt kê trong nhóm +auths.attributes_in_bind=Lấy các thuộc tính trong bối cảnh ràng buộc DN +auths.filter=Bộ lọc người dùng +auths.admin_filter=Admin Filter +auths.ms_ad_sa=Ms và SA +auths.smtp_auth=Kiểu xác thực SMTP +auths.smtphost=SMTP Host +auths.smtpport=Cổng SMTP +auths.allowed_domains=Các tên miền cho phép +auths.allowed_domains_helper=Để trống để không giới hạn bất kỳ tên miền. Nhiều tên miền nên được phân tách bằng dấu phẩy ','. +auths.enable_tls=Kích hoạt TLS Encryption +auths.skip_tls_verify=Bỏ qua xác thực TLS +auths.pam_service_name=Tên dịch vụ PAM +auths.enable_auto_register=Cho phép tự động đăng ký +auths.edit=Chỉnh sửa cài đặt xác thực +auths.activated=Xác thực này đã được kích hoạt +auths.default_auth=Xác thực này là nguồn đăng nhập mặc định +auths.new_success=Xác thực mới '%s' đã được thêm vào thành công. +auths.update_success=Cài đặt xác thực đã được cập nhật thành công. +auths.update=Cập Nhật cài đặt xác thực +auths.delete=Xóa Xác thực này +auths.delete_auth_title=Xóa xác thực +auths.delete_auth_desc=Xác thực này sẽ bị xóa, bạn có muốn tiếp tục? +auths.still_in_used=Xác thực này vẫn còn được sử dụng bởi một số người dùng, vui lòng xoá hoặc chuyển đổi những người dùng đến một loại đăng nhập trước tiên. +auths.deletion_success=Xác thực đã được xóa thành công! +auths.login_source_exist=Đăng nhập nguồn '%s' đã tồn tại. +auths.github_api_endpoint=API Endpoint + +config.not_set=(chưa đặt) +config.server_config=Cấu hình server +config.brand_name=Tên nhánh +config.run_user=Người dùng đang chạy +config.run_mode=Chế độ đang chạy +config.server.external_url=URL bên ngoài +config.server.domain=Domain +config.server.protocol=Giao thức +config.server.http_addr=Địa chỉ HTTP +config.server.http_port=Cổng HTTP +config.server.cert_file=Tập tin Chứng thư +config.server.key_file=Key file +config.server.tls_min_version=Minimum TLS version +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=URL gốc nội bộ +config.server.offline_mode=Chế độ ngoại tuyến +config.server.disable_router_log=Vô hiệu hóa log định tuyến +config.server.enable_gzip=Enable Gzip +config.server.app_data_path=Đường dẫn dữ liệu ứng dụng +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=URL đích + +config.ssh_config=Cấu hình SSH +config.ssh.enabled=Đã bật +config.ssh.domain=Tên miền tiếp xúc +config.ssh.port=Cổng công khai +config.ssh.root_path=Đường dẫn root +config.ssh.keygen_path=Đường dẫn keygen +config.ssh.key_test_path=Đường dẫn kiểm tra chính +config.ssh.minimum_key_size_check=Kiểm tra kích thước khóa tối thiểu +config.ssh.minimum_key_sizes=Kích thước khóa tối thiểu +config.ssh.rewrite_authorized_keys_at_start=Viết lại "authorized_keys" khi bắt đầu +config.ssh.start_builtin_server=Bắt đầu máy chủ dựng sẵn +config.ssh.listen_host=Máy chủ lắng nghe +config.ssh.listen_port=Cổng lắng nghe +config.ssh.server_ciphers=Mật mã máy chủ +config.ssh.server_macs=Địa chỉ MACs máy chủ +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Cấu hình kho +config.repo.root_path=Đường dẫn Root +config.repo.script_type=Kiểu script +config.repo.ansi_chatset=Bộ ký tự ANSI +config.repo.force_private=Bắc buộc riêng tư +config.repo.max_creation_limit=Giới hạn số lượng tạo +config.repo.preferred_licenses=Giấy phép ưu tiên +config.repo.disable_http_git=Vô hiệu hóa HTTP Git +config.repo.enable_local_path_migration=Kích hoạt di cư đường dẫn địa phương +config.repo.enable_raw_file_render_mode=Bật chế độ hiển thị tệp thô +config.repo.commits_fetch_concurrency=Cam kết tìm nạp đồng thời +config.repo.editor.line_wrap_extensions=Tiện ích mở rộng dòng trình chỉnh sửa +config.repo.editor.previewable_file_modes=Chế độ tệp có thể xem trước của trình chỉnh sửa +config.repo.upload.enabled=Tải lên đã được bật +config.repo.upload.temp_path=Đường dẫn tải lên tạm thời +config.repo.upload.allowed_types=Các kiểu được phép tải lên +config.repo.upload.file_max_size=Giới hạn dung lượng tập tin tải lên +config.repo.upload.max_files=Giới hạn số lượng tập tin tải lên + +config.db_config=Cấu hình Cơ sỡ dữ liệu +config.db.type=Loại +config.db.host=Host +config.db.name=Tên +config.db.schema=Lược đồ +config.db.schema_helper=(chỉ cho "postgres") +config.db.user=Người dùng +config.db.ssl_mode=Chế độ SSL +config.db.ssl_mode_helper=(chỉ cho "postgres") +config.db.path=Đường dẫn +config.db.path_helper=(chỉ cho phép "sqlite3") +config.db.max_open_conns=Kết nối mở tối đa +config.db.max_idle_conns=Kết nối không hoạt động tối đa + +config.security_config=Cấu hình bảo mật +config.security.login_remember_days=Số ngày lưu trữ đăng nhập +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Cấu hình Email +config.email.enabled=Đã bật +config.email.subject_prefix=Subject Prefix +config.email.host=Host +config.email.from=Từ +config.email.user=User +config.email.disable_helo=Vô hiệu hoá HELO +config.email.helo_hostname=Tên máy chủ HELO +config.email.skip_verify=Bỏ qua xác thực chứng thư +config.email.use_certificate=Sử dụng chứng thư tự tạo +config.email.cert_file=Tập tin Chứng thư +config.email.key_file=Key file +config.email.use_plain_text=Dùng text +config.email.add_plain_text_alt=Thêm text thay thế +config.email.send_test_mail=Gửi Kiểm Tra Email +config.email.test_mail_failed=Gửi email kiểm tra đến '%s':%v thất bại +config.email.test_mail_sent=Email kiểm tra đã được gửi đến '%s'. + +config.auth_config=Cấu hình xác thực +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Yêu cầu xác nhận email +config.auth.require_sign_in_view=Yêu cầu đăng nhập để xem +config.auth.disable_registration=Vô hiệu hóa đăng ký +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=Cấu hình người dùng +config.user.enable_email_notify=Bật thông báo qua Email + +config.session_config=Cấu hình session +config.session.provider=Nhà cung cấp +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=Chỉ HTTPS +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie + +config.cache_config=Cấu hình cache +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=Cấu hình HTTP +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Đã bật +config.attachment.path=Đường dẫn +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Giới hạn kích thước +config.attachment.max_files=Giới hạn số lượng tệp tin + +config.release_config=Release configuration +config.release.attachment.enabled=Cho phép tệp đính kèm +config.release.attachment.allowed_types=Loại tệp tin đính kèm +config.release.attachment.max_size=Giới hạn dung lượng đính kèm +config.release.attachment.max_files=Giới hạn số lượng tệp đính kèm + +config.picture_config=Cấu hình ảnh +config.picture.avatar_upload_path=Đường dẫn tệp Ảnh đại diện +config.picture.repo_avatar_upload_path=Đường dẫn tệp Ảnh đại diện kho +config.picture.gravatar_source=Nguồn Gravatar +config.picture.disable_gravatar=Vô hiệu hóa Gravatar +config.picture.enable_federated_avatar=Bật Federated Avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Cấu hình Webhook +config.webhook.types=Kiểu +config.webhook.deliver_timeout=Thời gian chờ phân phối +config.webhook.skip_tls_verify=Bỏ qua xác thực TLS + +config.git_config=Cấu hình Git +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=Các tham số GC +config.git.migrate_timeout=Thời gian chờ Migration +config.git.mirror_timeout=Thời gian chờ Mirror fetch +config.git.clone_timeout=Thời gian chờ Clone +config.git.pull_timeout=Thời gian chờ kéo +config.git.gc_timeout=GC timeout + +config.lfs_config=Cấu hình LFS +config.lfs.storage=Storage +config.lfs.objects_path=Objects path + +config.log_config=Cấu hình Log +config.log_file_root_path=Đường dẫn gốc file Log +config.log_mode=Chế độ +config.log_options=Tuỳ chọn + +monitor.cron=Cron Tasks +monitor.name=Tên +monitor.schedule=Lịch +monitor.next=Lần tới +monitor.previous=Lần trước +monitor.execute_times=Thời gian thực hiện +monitor.process=Tiến trình đang chạy +monitor.desc=Mô tả +monitor.start=Thời gian bắt đầu +monitor.execute_time=Thời gian thực hiện + +notices.system_notice_list=Thông báo hệ thống +notices.view_detail_header=Xem thông báo chi tiết +notices.actions=Hành động +notices.select_all=Chọn tất cả +notices.deselect_all=Bỏ chọn tất cả +notices.inverse_selection=Inverse Selection +notices.delete_selected=Đã xóa mục đã chọn +notices.delete_all=Xóa tất cả các thông báo +notices.type=Loại +notices.type_1=Kho +notices.desc=Mô tả +notices.op=Op. +notices.delete_success=Thông báo hệ thống đã xóa thành công. + +[action] +create_repo=đã tạo kho lưu trữ %s +rename_repo=đã đổi tên kho %[1]s thành %[3]s +commit_repo=đã đẩy đến %[3]s tại %[4]s +compare_commits=Xem so sánh cho các commit %d +transfer_repo=đã chuyển đổi kho %s %s +create_issue='vấn đề đã mở %s#%[2]s' +close_issue='vấn đề đã đóng %s#%[2]s' +reopen_issue='mở lại vấn đề %s#%[2]s' +comment_issue='nhận xét về vấn đề %s#%[2]s' +create_pull_request='tạo yêu cầu pull %s#%[2]s' +close_pull_request='đóng yêu cầu kéo %s#%[2]s' +reopen_pull_request='mở lại yêu cầu pull %s#%[2]s' +merge_pull_request='yêu cầu merged pull %s#%[2]s' +create_branch=tạo nhánh mới %[3]s tại %[4]s +delete_branch=xóa chi nhánh %[2]s tại %[3]s +push_tag=đã đẩy thẻ tag %[2]s đến %[3]s +delete_tag=đã xóa thẻ tag %[2]s tại %[3]s +fork_repo=đã fork một kho lưu trữ đến %s +mirror_sync_push=đồng bộ commits đến %[3]s tại %[4]s từ mirror +mirror_sync_create=đồng bộ tham chiếu mới %[2]s đến %[3]s từ mirror +mirror_sync_delete=đồng bộ và xóa tham chiếu %[2]s tại %[3]s từ mirror + +[tool] +ago=cách đây +from_now=từ bây giờ +now=bây giờ +1s=1 giây trước %s +1m=1 phút trước %s +1h=1 giờ trước %s +1d=1 ngày trước %s +1w=1 tuần trước %s +1mon=1 tháng trước %s +1y=1 năm trước %s +seconds=%d giây trước %s +minutes=%d phút trước %s +hours=%d giờ trước %s +days=%d ngày trước %s +weeks=%d tuần trước %s +months=%d tháng trước %s +years=%d năm trước %s +raw_seconds=giây +raw_minutes=phút +raw_hours=giờ + +[dropzone] +default_message=Thả các tập tin ở đây hoặc bấm vào để tải lên. +invalid_input_type=Bạn không thể tải lên cho loại file này. +file_too_big=Kích cỡ file ({{filesize}} MB) vượt quá giới hạn kích cỡ cho phép ({{maxFilesize}} MB). +remove_file=Xóa tập tin + diff --git a/conf/locale/locale_zh-CN.ini b/conf/locale/locale_zh-CN.ini index 1dca59f96b4..d061aa835ac 100644 --- a/conf/locale/locale_zh-CN.ini +++ b/conf/locale/locale_zh-CN.ini @@ -1,15 +1,14 @@ -app_desc=基于 Go 语言的自助 Git 服务 +app_desc=一款极易搭建的自助 Git 服务 home=首页 dashboard=控制面板 -explore=探索 +explore=发现 help=帮助 sign_in=登录 sign_out=退出 sign_up=注册 register=注册 website=官方网站 -version=当前版本 page=页面 template=模板 language=语言选项 @@ -44,23 +43,27 @@ issues=工单管理 cancel=取消 +[status] +page_not_found=页面未找到 +internal_server_error=内部服务器错误 + [install] install=安装页面 title=首次运行安装程序 docker_helper=如果您正在使用 Docker 容器运行 Gogs,请务必先仔细阅读 官方文档 后再对本页面进行填写。 -requite_db_desc=Gogs 要求安装 MySQL、PostgreSQL、SQLite3 或 TiDB。 +requite_db_desc=Gogs 需要使用 MySQL、PostgreSQL、SQLite3 或 TiDB(MySQL 协议)数据库 db_title=数据库设置 db_type=数据库类型 host=数据库主机 user=数据库用户 password=数据库用户密码 db_name=数据库名称 +db_schema=模式 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 数据库名称不允许包含字符 "." 或 "-" 。 +sqlite_helper=SQLite3 数据库文件路径。
作为服务启动时,请使用绝对路径。 +err_empty_db_path=SQLite 数据库文件路径不能为空。 no_admin_and_disable_registration=您不能够在未创建管理员用户的情况下禁止注册。 err_empty_admin_password=管理员密码不能为空。 @@ -75,12 +78,17 @@ domain=域名 domain_helper=该设置影响 SSH 克隆地址。 ssh_port=SSH 端口号 ssh_port_helper=SSH 服务器的监听端口号,留空表示禁用 SSH 功能。 +use_builtin_ssh_server=使用内置 SSH 服务器 +use_builtin_ssh_server_popup=启动内置 SSH 服务器专门用于 Git 操作可以和系统 SSH 守护程序进行隔离。 http_port=HTTP 端口号 http_port_helper=应用监听的端口号 app_url=应用 URL app_url_helper=该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。 log_root_path=日志路径 log_root_path_helper=存放日志文件的目录 +enable_console_mode=启用控制台模式 +enable_console_mode_popup=除了使用文件模式外,还将日志输出到控制台 +default_branch=默认分支 optional_title=可选设置 email_title=邮件服务设置 @@ -104,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=管理员密码 @@ -116,7 +124,10 @@ sqlite3_not_available=您所使用的发行版不支持 SQLite3,请从 %s 下 invalid_db_setting=数据库设置不正确:%v invalid_repo_path=仓库根目录设置不正确:%v run_user_not_match=运行系统用户非当前用户:%s -> %s +smtp_host_missing_port=SMTP 地址缺少端口号。 +invalid_smtp_from=SMTP From 字段不合法:%v save_config_failed=应用配置保存失败:%v +init_failed=初始化应用程序失败:%v invalid_admin_setting=管理员帐户设置不正确:%v install_success=您好!我们很高兴您选择使用 Gogs,祝您使用愉快,代码从此无 BUG! invalid_log_root_path=无效的日志路径:%v @@ -137,6 +148,7 @@ issues.in_your_repos=属于该用户仓库的 [explore] repos=仓库 users=用户 +organizations=组织 search=搜索 [auth] @@ -145,6 +157,8 @@ register_hepler_msg=已经注册?立即登录! social_register_hepler_msg=已经注册?立即绑定! disable_register_prompt=对不起,注册功能已被关闭。请联系网站管理员。 disable_register_mail=对不起,注册邮箱确认功能已被关闭。 +auth_source=认证源 +local=本地 remember_me=记住登录 forgot_password=忘记密码 forget_password=忘记密码? @@ -156,7 +170,6 @@ prohibit_login_desc=您的帐户被禁止登录,请联系网站管理员。 resent_limit_prompt=对不起,您请求发送激活邮件过于频繁,请等待 3 分钟后再试! has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 %s 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。 resend_mail=单击此处重新发送确认邮件 -email_not_associate=您输入的邮箱地址未被关联到任何帐号! send_reset_mail=单击此处(重新)发送您的密码重置邮件 reset_password=重置密码 invalid_code=对不起,您的确认代码已过期或已失效。 @@ -164,6 +177,14 @@ reset_password_helper=单击此处重置密码 password_too_short=密码长度不能少于 6 位! non_local_account=非本地类型的帐户无法通过 Gogs 修改密码。 +login_two_factor=两步验证登录 +login_two_factor_passcode=动态令牌 +login_two_factor_enter_recovery_code=输入两步验证恢复密钥 +login_two_factor_recovery=两步验证恢复登录 +login_two_factor_recovery_code=恢复密钥 +login_two_factor_enter_passcode=输入两步验证动态令牌 +login_two_factor_invalid_recovery_code=恢复密钥已经被使用或是无效的 + [mail] activate_account=请激活您的帐户 activate_email=请验证您的邮箱地址 @@ -199,6 +220,7 @@ Content=内容 require_error=不能为空。 alpha_dash_error=必须为英文字母、阿拉伯数字或横线(-_)。 alpha_dash_dot_error=必须为英文字母、阿拉伯数字、横线(-_)或点。 +alpha_dash_dot_slash_error=必须为英文字母、阿拉伯数字、横线(-_)、点或斜线。 size_error=长度必须为 %s。 min_size_error=长度最小为 %s 个字符。 max_size_error=长度最大为 %s 个字符。 @@ -215,6 +237,7 @@ org_name_been_taken=组织名称已经被占用。 team_name_been_taken=团队名称已经被占用。 email_been_used=邮箱地址已经被使用。 username_password_incorrect=用户名或密码不正确。 +auth_source_mismatch=该用户未与所选择的认证源进行关联 enterred_invalid_repo_name=请检查您输入的仓库名称是正确。 enterred_invalid_owner_name=请检查您输入的新所有者用户名是否正确。 enterred_invalid_password=请检查您输入的密码是否正确。 @@ -242,19 +265,18 @@ following=关注中 follow=关注 unfollow=取消关注 -form.name_reserved=用户名 '%s' 是被保留的。 -form.name_pattern_not_allowed=用户名不允许 '%s' 的格式。 +form.name_not_allowed=禁止使用用户名或模式 %q [settings] profile=个人信息 password=修改密码 avatar=头像设置 -ssh_keys=管理 SSH 密钥 -social=社交帐号绑定 -applications=管理授权应用 -orgs=管理组织 +ssh_keys=SSH 密钥 +security=帐户安全 +repos=仓库列表 +orgs=组织列表 +applications=授权应用 delete=删除帐户 -uid=用户 ID public_profile=公开信息 profile_desc=您的邮箱地址将会被公开,并被用于接收帐户的所有提醒和通知。 @@ -295,6 +317,7 @@ delete_email=删除 email_deletion=邮箱删除操作 email_deletion_desc=删除该邮箱地址将会移除所有相关的信息。是否继续? email_deletion_success=邮箱删除成功! +email_deletion_primary=无法删除默认邮箱。 add_new_email=添加新的邮箱地址 add_email=添加邮箱 add_email_confirmation_sent=一封待确认的电子邮件已发送到 '%s',请在 %d 小时内检查您的收件箱,并完成确认过程。 @@ -310,7 +333,7 @@ ssh_key_name_used=使用相同名称的公开密钥已经存在! key_name=密钥名称 key_content=密钥内容 add_key_success=新的 SSH 密钥 '%s' 添加成功! -delete_key=删除 +delete_key=删除密钥 ssh_key_deletion=删除 SSH 公钥操作 ssh_key_deletion_desc=删除该 SSH 公钥将删除所有与您帐户相关的访问权限。是否继续? ssh_key_deletion_success=SSH 公钥删除成功! @@ -320,14 +343,36 @@ no_activity=没有最近活动 key_state_desc=该密钥在 7 天内被使用过 token_state_desc=该令牌在 7 天内被使用过 -manage_social=管理关联社交帐户 -social_desc=以下是与您帐户所关联的社交帐号,如果您发现有陌生的关联,请立即解除绑定! -unbind=解除绑定 -unbind_success=社交帐号解除绑定成功! +two_factor=两步验证 +two_factor_status=当前状态: +two_factor_on=开启 +two_factor_off=关闭 +two_factor_enable=启用两步验证 +two_factor_disable=关闭两步验证 +two_factor_view_recovery_codes=查看并备份 恢复密钥 到一个安全的地方,当您无法使用认证应用时可以使用恢复密钥作为临时令牌。 +two_factor_http=对于 HTTP/HTTPS 操作,您不再能够使用用户名和密码作为凭据。请创建和使用 个人操作令牌 作为您的凭据,如 %[3]s。 +two_factor_enable_title=启用两步验证 +two_factor_scan_qr=请使用您的认证应用扫描以下二维码︰ +two_factor_or_enter_secret=或者直接输入密钥: +two_factor_then_enter_passcode=然后输入动态令牌: +two_factor_verify=验证令牌 +two_factor_invalid_passcode=您输入的动态令牌无效,请重试! +two_factor_reused_passcode=您输入的令牌已经被使用,请等待数秒后尝试新的令牌! +two_factor_enable_error=启用两步验证失败:%v +two_factor_enable_success=两步验证登录启用成功! +two_factor_recovery_codes_title=两步验证恢复密钥 +two_factor_recovery_codes_desc=当您无法使用认证应用时,可以使用恢复密钥作为临时令牌。每个恢复密钥只能被使用一次,请务必将它们保存在一个安全的地方。 +two_factor_regenerate_recovery_codes=重新生成恢复密钥 +two_factor_regenerate_recovery_codes_error=重新生成恢复密钥失败:%v +two_factor_regenerate_recovery_codes_success=新的恢复密钥生成成功! +two_factor_disable_title=关闭两步验证 +two_factor_disable_desc=关闭两步验证后,您的帐户安全等级将变低。是否继续? +two_factor_disable_success=两步验证登录关闭成功! manage_access_token=管理个人操作令牌 generate_new_token=生成新的令牌 tokens_desc=您可以使用这些已生成的令牌来操作 Gogs API。 +access_token_tips=个人访问令牌可以用作用户名或密码。建议使用 "x-access-token" 作为 Git 应用程序的用户名并使用个人访问令牌作为密码。 new_token_desc=目前为止,任何令牌都对您的帐户拥有完整的操作权限。 token_name=令牌名称 generate_token=生成令牌 @@ -336,6 +381,16 @@ delete_token=删除令牌 access_token_deletion=删除个人操作令牌操作 access_token_deletion_desc=删除该个人操作令牌将删除所有相关的应用程序的访问权限。是否继续? delete_token_success=个人操作令牌删除成功!请更新与该令牌有关的所有应用。 +token_name_exists=已存在具有相同名称的令牌。 + +orgs.none=您现在还不是任何组织的成员。 +orgs.leave_title=离开组织 +orgs.leave_desc=离开组织后,组织相关的所有仓库和团队权限将被收回。是否继续? + +repos.leave=离开仓库 +repos.leave_title=退出仓库协作 +repos.leave_desc=离开仓库后,相关权限将被收回。是否继续? +repos.leave_success=您已经成功退出 '%s' 的仓库协作! delete_account=删除当前帐户 delete_prompt=删除操作会永久清除您的帐户信息,并且 不可恢复! @@ -348,7 +403,9 @@ owner=拥有者 repo_name=仓库名称 repo_name_helper=伟大的仓库名称一般都较短、令人深刻并且 独一无二 的。 visibility=可见性 +unlisted=列表隐藏 visiblity_helper=该仓库为 私有的 +unlisted_helper=该仓库 不会 在列表视图中展示 visiblity_helper_forced=网站管理员已强制要求所有新建仓库必须为 私有的 visiblity_fork_helper=(修改该值将会影响到所有派生仓库) clone_helper=不知道如何操作?访问 此处 查看帮助! @@ -374,24 +431,26 @@ mirror_last_synced=上次同步时间: watchers=关注者 stargazers=称赞者 forks=派生仓库 +repo_description_helper=请输入仓库描述,最多为 512 个字符 +repo_description_length=剩余字符数 form.reach_limit_of_creation=该用户已经达到允许创建 %d 个仓库的最大上限。 -form.name_reserved=仓库名称 '%s' 是被保留的。 -form.name_pattern_not_allowed=仓库名称不允许 '%s' 的格式。 +form.name_not_allowed=禁止使用仓库名称或模式 %q need_auth=需要授权验证 migrate_type=迁移类型 migrate_type_helper=该仓库将是一个 镜像 migrate_repo=迁移仓库 migrate.clone_address=克隆地址 -migrate.clone_address_desc=该地址可以是 HTTP/HTTPS/GIT URL 或本地服务器路径。 +migrate.clone_address_desc=该地址可以是 HTTP/HTTPS/GIT 类型的 URL。 +migrate.clone_address_desc_import_local=您被允许使用服务器本地路径作为仓库的远程地址进行迁移。 migrate.permission_denied=您没有获得导入本地仓库的权限。 migrate.invalid_local_path=无效的本地路径,不存在或不是一个目录! +migrate.clone_address_resolved_to_blocked_local_address=克隆地址被解析到默认禁用的本地网络地址。 migrate.failed=迁移失败:%v mirror_from=镜像自地址 forked_from=派生自 -fork_from_self=无法派生已经拥有的仓库! copy_link=复制链接 copy_link_success=复制成功! copy_link_error=请按下 ⌘-C 或 Ctrl-C 复制 @@ -407,9 +466,9 @@ quick_guide=快速帮助 clone_this_repo=克隆当前仓库 create_new_repo_command=从命令行创建一个新的仓库 push_exist_repo=从命令行推送已经创建的仓库 -repo_is_empty=该仓库不包含任何内容,请稍后再进行访问! +bare_message=这个家伙很懒,什么都没有推送。 -code=代码 +files=文件 branch=分支 tree=目录树 filter_branch_and_tag=过滤分支或标签 @@ -420,12 +479,23 @@ pulls=合并请求 labels=标签管理 milestones=里程碑 commits=提交历史 +git_branches=代码分支 releases=版本发布 file_raw=原始文件 file_history=文件历史 file_view_raw=查看原始文件 file_permalink=永久链接 file_too_large=文件过大导致无法显示 +video_not_supported_in_browser=您的浏览器不支持使用 HTML5 播放视频。 + +branches.overview=概况 +branches.active_branches=活跃分支 +branches.stale_branches=陈旧分支 +branches.all=所有分支 +branches.updated_by=由 %[2]s 更新于 %[1]s +branches.change_default_branch=更改默认分支 +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=新的文件 editor.upload_file=上传文件 @@ -455,16 +525,19 @@ 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_already_exists=此仓库已经存在名为 '%s' 的文件。 editor.no_changes_to_show=没有可以显示的变更。 editor.fail_to_update_file=更新/创建文件 '%s' 时发生错误:%v +editor.fail_to_delete_file=删除文件 '%s' 时发生错误: %v editor.add_subdir=添加子目录... editor.unable_to_upload_files=上传文件至 '%s' 时发生错误:%v editor.upload_files_to_dir=上传文件至 '%s' +commits.commit_history=提交历史 commits.commits=次代码提交 commits.search=搜索提交历史 commits.find=查找 @@ -515,7 +588,7 @@ issues.filter_sort.recentupdate=最近更新 issues.filter_sort.leastupdate=最少更新 issues.filter_sort.mostcomment=最多评论 issues.filter_sort.leastcomment=最少评论 -issues.opened_by=由 %[3]s 与 %[1]s创建 +issues.opened_by=由 %[3]s 于 %[1]s创建 issues.opened_by_fake=由 %[2]s 于 %[1]s创建 issues.previous=上一页 issues.next=下一页 @@ -536,7 +609,7 @@ issues.commit_ref_at=`在代码提交 %[2]s 中 issues.poster=发布者 issues.collaborator=协作者 issues.owner=所有者 -issues.sign_in_require_desc=登陆 并参与到对话中。 +issues.sign_in_require_desc=登录 并参与到对话中。 issues.edit=编辑 issues.cancel=取消 issues.save=保存 @@ -562,6 +635,7 @@ pulls.compare_compare=对比分支 pulls.filter_branch=过滤分支 pulls.no_results=未找到结果 pulls.nothing_to_compare=基准和对比分支代码已经同步,无需进行对比。 +pulls.nothing_merge_base=由于两个分支各自拥有完全不同的提交历史,因此无法进行比较。 pulls.has_pull_request=`已经存在目标分支的合并请求:%[2]s#%[3]d` pulls.create=创建合并请求 pulls.title_desc=请求将 %[1]d 次代码提交从 %[2]s 合并至 %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=该合并请求正在进行冲突检查,请稍后再刷新 pulls.can_auto_merge_desc=该合并请求可以进行自动合并操作。 pulls.cannot_auto_merge_desc=该合并请求存在冲突,无法进行自动合并操作。 pulls.cannot_auto_merge_helper=请手动拉取代码变更以解决冲突。 +pulls.create_merge_commit=创建一个新的合并提交 +pulls.rebase_before_merging=合并前先进行衍合 +pulls.commit_description=提交说明 pulls.merge_pull_request=合并请求 pulls.open_unmerged_pull_exists=`由于已经存在来自相同仓库和合并信息的未合并请求(#%d),您无法执行重新开启操作。` +pulls.delete_branch=删除分支 +pulls.delete_branch_has_new_commits=该分支在完成合并后又推送了新的提交,无法进行删除操作。 milestones.new=新的里程碑 milestones.open_tab=%d 开启中 @@ -627,8 +706,31 @@ settings.options=基本设置 settings.collaboration=管理协作者 settings.collaboration.admin=管理权限 settings.collaboration.write=可写权限 -settings.collaboration.read=可读权限 +settings.collaboration.read=只读权限 settings.collaboration.undefined=未定义 +settings.branches=管理分支 +settings.branches_bare=您无法对空仓库进行分支管理,请先推送一些内容到仓库。 +settings.default_branch=默认分支 +settings.default_branch_desc=默认分支是被用于代码提交、合并请求和在线编辑的基准分支。 +settings.update=更新 +settings.update_default_branch_unsupported=服务器上的 Git 版本不支持修改默认分支。 +settings.update_default_branch_success=仓库默认分支更新成功! +settings.protected_branches=保护分支 +settings.protected_branches_desc=保护分支不被强制推送、意外删除和限制代码提交白名单。 +settings.choose_a_branch=选择一个分支... +settings.branch_protection=分支保护 +settings.branch_protection_desc=请选择应用于 %s 分支的保护选项。 +settings.protect_this_branch=启用分支保护 +settings.protect_this_branch_desc=禁止强制推送和删除分支。 +settings.protect_require_pull_request=要求通过合并请求提交代码 +settings.protect_require_pull_request_desc=启用该选项后代码将不能直接被推送到此分支,所有的代码提交都必须通过另一个非保护分支发起合并请求进行合并。 +settings.protect_whitelist_committers=限制可以推送代码的成员 +settings.protect_whitelist_committers_desc=添加用户或团队到可直接推送代码的白名单,列入白名单中的用户将跳过合并请求检查。 +settings.protect_whitelist_users=允许推送到此分支的用户 +settings.protect_whitelist_search_users=搜索用户 +settings.protect_whitelist_teams=允许其成员推送到此分支的团队 +settings.protect_whitelist_search_teams=搜索团队 +settings.update_protect_branch_success=此分支的保护选项更新成功! settings.hooks=管理 Web 钩子 settings.githooks=管理 Git 钩子 settings.basic_settings=基本设置 @@ -636,24 +738,31 @@ settings.mirror_settings=镜像设置 settings.sync_mirror=立即同步 settings.mirror_sync_in_progress=镜像同步请求已经生效,请稍后刷新页面。 settings.site=官方网站 -settings.update_settings=更新仓库设置 +settings.update_settings=更新设置 settings.change_reponame_prompt=该操作将会影响到所有与该仓库有关的链接 settings.advanced_settings=高级设置 settings.wiki_desc=启用 Wiki 系统 settings.use_internal_wiki=使用内置 Wiki 系统 +settings.allow_public_wiki_desc=当仓库为私有时,允许 Wiki 的公开访问 settings.use_external_wiki=使用外部 Wiki settings.external_wiki_url=外部 Wiki 链接 settings.external_wiki_url_desc=当访问者单击分页标签时,将会被重定向到该链接。 settings.issues_desc=启用工单管理系统 settings.use_internal_issue_tracker=使用内置的轻量级工单管理系统 +settings.allow_public_issues_desc=当仓库为私有时,允许工单的公开访问 settings.use_external_issue_tracker=使用外部的工单管理系统 +settings.external_tracker_url=外部工单管理系统 URL +settings.external_tracker_url_desc=当访问者单击分页标签时,将会被重定向到该链接。 settings.tracker_url_format=外部工单管理系统的 URL 格式 settings.tracker_issue_style=外部工单管理系统命名风格: settings.tracker_issue_style.numeric=纯数字形式 settings.tracker_issue_style.alphanumeric=英文字母数字组合形式 settings.tracker_url_format_desc=您可以使用 {user} {repo} {index} 分别作为用户名、仓库名和工单索引的占位符。 -settings.pulls_desc=启用合并请求以接受社区贡献 +settings.pulls_desc=启用合并请求以接受来自其它仓库或分支的贡献 +settings.pulls.ignore_whitespace=忽略空白符号的更改 +settings.pulls.allow_rebase_merge=允许在合并提交时使用衍合 settings.danger_zone=危险操作区 +settings.cannot_fork_to_same_owner=您不能派生仓库到其当前的所有者。 settings.new_owner_has_same_repo=新的仓库拥有者已经存在同名仓库! settings.convert=转换为普通仓库 settings.convert_desc=您可以将该镜像仓库转换为普通仓库,且此操作不可逆。 @@ -672,7 +781,7 @@ settings.wiki_deletion_success=仓库 Wiki 数据清除成功! settings.delete=删除本仓库 settings.delete_desc=删除仓库操作不可逆转,请三思而后行。 settings.delete_notices_1=- 此操作 不可以 被回滚。 -settings.delete_notices_2=- 此操作将永久删除该仓库,包括 Git 数据、 工单、 评论和协作者的操作权限。 +settings.delete_notices_2=- 此操作将永久删除该仓库,包括 Git 数据、工单、评论和协作者的操作权限。 settings.delete_notices_fork_1=- 删除完成后所有的派生仓库都将转换为独立的仓库。 settings.deletion_success=仓库删除成功! settings.update_settings_success=仓库设置更新成功! @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=此用户被删除后将不再拥有相关 settings.remove_collaborator_success=被操作的协作者已经被收回权限! settings.search_user_placeholder=搜索用户... settings.org_not_allowed_to_be_collaborator=组织不允许被添加为仓库协作者! -settings.user_is_org_member=被操作的用户是组织成员,因此无法添加为协作者! -settings.add_webhook=添加 Web 钩子 settings.hooks_desc=Web 钩子允许您设定在 Gogs 上发生指定事件时对指定 URL 发送 POST 通知。查看 Webhooks 文档 获取更多信息。 +settings.webhooks.add_new=添加新的 Web 钩子: +settings.webhooks.choose_a_type=选择类型... +settings.add_webhook=添加 Web 钩子 settings.webhook_deletion=删除 Web 钩子 settings.webhook_deletion_desc=删除该 Web 钩子将会删除与其有关的信息和推送历史。是否继续? settings.webhook_deletion_success=Web 钩子删除成功! settings.webhook.test_delivery=测试推送 settings.webhook.test_delivery_desc=生成并推送一个模拟的 Push 事件 settings.webhook.test_delivery_success=测试推送已经加入到队列,请耐心等待数秒再刷新推送记录。 +settings.webhook.redelivery=重新推送 +settings.webhook.redelivery_success=任务 '%s' 已经被重新加入到推送队列,请耐心等待数秒再刷新推送记录。 settings.webhook.request=请求内容 settings.webhook.response=响应内容 settings.webhook.headers=头信息 settings.webhook.payload=推送内容 settings.webhook.body=响应体 +settings.webhook.err_cannot_parse_payload_url=无法解析推送 URL:%v +settings.webhook.url_resolved_to_blocked_local_address=推送 URL 被解析到默认禁用的本地网络地址。 settings.githooks_desc=Git 钩子是由 Git 本身提供的功能,以下为 Gogs 所支持的钩子列表。 settings.githook_edit_desc=如果钩子未启动,则会显示样例文件中的内容。如果想要删除某个钩子,则提交空白文本即可。 settings.githook_name=钩子名称 @@ -711,19 +825,30 @@ settings.add_webhook_desc=我们会通过 POST 请求将订阅事 settings.payload_url=推送地址 settings.content_type=数据格式 settings.secret=密钥文本 +settings.secret_desc=密钥文本将被用于计算推送内容的 SHA256 HMAC 哈希值,并设置为 X-Gogs-Signature 请求头的值。 settings.slack_username=服务名称 settings.slack_icon_url=图标 URL settings.slack_color=颜色代码 settings.event_desc=请设置您希望触发 Web 钩子的事件: settings.event_push_only=只推送 push 事件。 -settings.event_send_everything=请把 一切 都给我 -settings.event_choose=我的命运自己主宰 +settings.event_send_everything=推送 所有 事件 +settings.event_choose=选择指定的事件 settings.event_create=创建 settings.event_create_desc=创建分支或标签 -settings.event_pull_request=合并请求 -settings.event_pull_request_desc=开启、关闭、重新开启、编辑、指派、取消指派、更新标签、清除标签或同步合并请求 +settings.event_delete=删除 +settings.event_delete_desc=删除分支或标签 +settings.event_fork=派生 +settings.event_fork_desc=仓库被派生 settings.event_push=推送 settings.event_push_desc=Git 仓库推送 +settings.event_issues=工单 +settings.event_issues_desc=工单被开启、关闭、重新开启、编辑、指派、取消指派、更新标签、清除标签、设置里程碑或取消设置里程碑 +settings.event_pull_request=合并请求 +settings.event_pull_request_desc=合并请求被开启、关闭、重新开启、编辑、指派、取消指派、更新标签、清除标签、设置里程碑、取消设置里程碑或代码同步 +settings.event_issue_comment=工单评论 +settings.event_issue_comment_desc=工单评论被创建、编辑和删除 +settings.event_release=版本发布 +settings.event_release_desc=仓库发布新的版本 settings.active=是否激活 settings.active_helper=当指定事件发生时我们将会触发此 Web 钩子。 settings.add_hook_success=Web 钩子添加成功! @@ -733,10 +858,13 @@ settings.delete_webhook=删除 Web 钩子 settings.recent_deliveries=最近推送记录 settings.hook_type=钩子类型 settings.add_slack_hook_desc=为您的仓库增加 Slack 集成。 +settings.add_discord_hook_desc=为您的仓库增加 Discord 集成。 +settings.add_dingtalk_hook_desc=为您的仓库增加 钉钉 集成。 settings.slack_token=令牌 settings.slack_domain=域名 settings.slack_channel=频道 settings.deploy_keys=管理部署密钥 +settings.deploy_keys_helper=常识错误!如果您想要添加的是个人公钥,请将它们添加到您的 用户设置。 settings.add_deploy_key=添加部署密钥 settings.deploy_key_desc=部署密钥仅具有只读权限,它在功能上和个人用户的公开密钥有本质区别。 settings.no_deploy_keys=您还没有添加任何部署密钥。 @@ -748,6 +876,8 @@ settings.add_key_success=新的部署密钥 '%s' 添加成功! settings.deploy_key_deletion=删除部署密钥 settings.deploy_key_deletion_desc=删除该部署密钥会移除本仓库所以相关的操作权限。是否继续? settings.deploy_key_deletion_success=删除部署密钥成功! +settings.description_desc=请输入仓库描述,最多为 512 个字符 +settings.description_length=剩余字符数 diff.browse_source=浏览代码 diff.parent=父节点 @@ -766,7 +896,6 @@ release.releases=版本发布 release.new_release=发布新版 release.draft=草稿 release.prerelease=预发行 -release.stable=稳定 release.edit=编辑 release.ahead=在该版本发布之后已有 %d 次代码提交到 %s 分支 release.source_code=源代码 @@ -813,8 +942,8 @@ team_name_helper=您可以使用该名称来通知该组全体成员。 team_desc_helper=一句话描述这个团队是做什么的。 team_permission_desc=请选择该团队所具有的权限等级: -form.name_reserved=组织名称 '%s' 是被保留的。 -form.name_pattern_not_allowed=组织名称不允许 '%s' 的格式。 +form.name_not_allowed=禁止使用组织名称或模式 %q +form.team_name_not_allowed=禁止使用团队名称或模式 %q settings=组织设置 settings.options=基本设置 @@ -878,7 +1007,7 @@ dashboard=控制面板 users=用户管理 organizations=组织管理 repositories=仓库管理 -authentication=授权认证管理 +authentication=认证源管理 config=应用配置管理 notices=系统提示管理 monitor=应用监控面板 @@ -886,12 +1015,20 @@ first_page=首页 last_page=末页 total=总计:%d +dashboard.build_info=构建信息 +dashboard.app_ver=应用程序版本 +dashboard.git_version=Git 版本 +dashboard.go_version=Go 版本 +dashboard.build_time=编译时间 +dashboard.build_commit=构建提交 + dashboard.statistic=应用统计数据 dashboard.operations=管理员操作 dashboard.system_status=系统监视状态 dashboard.statistic_info=Gogs 数据库统计:%d 位用户,%d 个组织,%d 个公钥,%d 个仓库,%d 个仓库关注,%d 个赞,%d 次行为,%d 条权限记录,%d 张工单,%d 次评论,%d 个社交帐号,%d 个用户关注,%d 个镜像,%d 个版本发布,%d 个登录源,%d 个 Web 钩子,%d 个里程碑,%d 个标签,%d 个钩子任务,%d 个团队,%d 个更新任务,%d 个附件。 dashboard.operation_name=操作名称 dashboard.operation_switch=开关 +dashboard.select_operation_to_run=请选择要运行的操作 dashboard.operation_run=执行 dashboard.clean_unbind_oauth=清理未绑定社交帐号 dashboard.clean_unbind_oauth_success=所有未绑定社交数据清除成功! @@ -905,8 +1042,8 @@ dashboard.git_gc_repos=对仓库进行垃圾回收 dashboard.git_gc_repos_success=所有仓库垃圾回收成功! dashboard.resync_all_sshkeys=重新生成 '.ssh/authorized_keys' 文件(警告:不是 Gogs 的密钥也会被删除) dashboard.resync_all_sshkeys_success=所有公钥重新生成成功! -dashboard.resync_all_update_hooks=重新生成所有仓库的 Update 钩子(用于自定义配置文件被修改) -dashboard.resync_all_update_hooks_success=所有仓库的 Update 钩子重新生成成功! +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 文件的仓库重新初始化成功! @@ -981,12 +1118,14 @@ repos.private=私有库 repos.watches=关注数 repos.stars=点赞数 repos.issues=工单数 +repos.size=用量 -auths.auth_manage_panel=认证管理面板 +auths.auth_sources=认证源 auths.new=添加新的源 auths.name=认证名称 auths.type=认证类型 auths.enabled=已启用 +auths.default=默认 auths.updated=最后更新时间 auths.auth_type=认证类型 auths.auth_name=认证名称 @@ -995,6 +1134,7 @@ auths.domain=域名 auths.host=主机地址 auths.port=主机端口 auths.bind_dn=绑定 DN +auths.bind_dn_helper=可以使用 '%s' 作为用户名的占位符,例如:DOM\%s auths.bind_password=绑定密码 auths.bind_password_helper=警告:该密码将会以明文的形式保存在数据库中。请不要使用拥有高权限的帐户! auths.user_base=用户搜索基准 @@ -1004,6 +1144,11 @@ auths.attribute_username_placeholder=留空表示使用用户登录时所使用 auths.attribute_name=名字属性 auths.attribute_surname=姓氏属性 auths.attribute_mail=邮箱属性 +auths.verify_group_membership=验证组成员身份 +auths.group_search_base_dn=组搜索基准 DN +auths.group_filter=组名称过滤 +auths.group_attribute_contain_user_list=包含用户的组属性 +auths.user_attribute_listed_in_group=组内用户属性 auths.attributes_in_bind=从 Bind DN 中拉取属性信息 auths.filter=用户过滤规则 auths.admin_filter=管理员过滤规则 @@ -1017,9 +1162,9 @@ 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.default_auth=该授权认证将作为默认登录源 auths.new_success=新的授权源 "%s" 添加成功! auths.update_success=认证设置更新成功! auths.update=更新认证设置 @@ -1028,107 +1173,189 @@ auths.delete_auth_title=删除认证操作 auths.delete_auth_desc=该认证将被删除。是否继续? auths.still_in_used=此认证仍旧与一些用户有关联,请先删除或者将这些用户转换为其它登录类型。 auths.deletion_success=授权源删除成功! +auths.login_source_exist=登录源 '%s' 已存在。 +auths.github_api_endpoint=API 终端 +config.not_set=(未设置) config.server_config=服务器配置 -config.app_name=应用名称 -config.app_ver=应用版本 -config.app_url=应用 URL -config.domain=应用域名 -config.offline_mode=离线模式 -config.disable_router_log=关闭路由日志 +config.brand_name=品牌名称 config.run_user=运行用户 config.run_mode=运行模式 -config.repo_root_path=仓库根目录 -config.static_file_root_path=静态文件根目录 -config.log_file_root_path=日志文件根目录 -config.script_type=脚本类型 -config.reverse_auth_user=反向代理认证 +config.server.external_url=外部网址 +config.server.domain=域名 +config.server.protocol=协议 +config.server.http_addr=HTTP 地址 +config.server.http_port=HTTP 端口 +config.server.cert_file=证书文件 +config.server.key_file=密钥文件 +config.server.tls_min_version=最低 TLS 版本 +config.server.unix_socket_permission=Unix 套接字权限 +config.server.local_root_url=本地根网址 +config.server.offline_mode=离线模式 +config.server.disable_router_log=禁用路由器日志 +config.server.enable_gzip=启用 Gzip +config.server.app_data_path=应用程序数据路径 +config.server.load_assets_from_disk=从磁盘加载素材 +config.server.landing_url=登陆网址 config.ssh_config=SSH 配置 -config.ssh_enabled=启用服务 -config.ssh_start_builtin_server=启用内置服务 -config.ssh_domain=域名 -config.ssh_port=端口 -config.ssh_listen_port=监听端口 -config.ssh_root_path=根目录 -config.ssh_key_test_path=密钥测试路径 -config.ssh_keygen_path=密钥生成器('ssh-keygen')路径 -config.ssh_minimum_key_size_check=密钥最小长度检查 -config.ssh_minimum_key_sizes=密钥最小长度限制 +config.ssh.enabled=启用 +config.ssh.domain=显示域名 +config.ssh.port=显示端口 +config.ssh.root_path=根目录 +config.ssh.keygen_path=Keygen 路径 +config.ssh.key_test_path=密钥测试路径 +config.ssh.minimum_key_size_check=最小密钥长度检查 +config.ssh.minimum_key_sizes=最短秘钥长度 +config.ssh.rewrite_authorized_keys_at_start=在启动时重写 "authorized_keys" 文件 +config.ssh.start_builtin_server=启动内置服务器 +config.ssh.listen_host=监听主机 +config.ssh.listen_port=监听端口 +config.ssh.server_ciphers=服务端加密套件 +config.ssh.server_macs=服务器 MAC 地址 +config.ssh.server_algorithms=服务器算法 + +config.repo_config=仓库配置 +config.repo.root_path=根目录 +config.repo.script_type=脚本类型 +config.repo.ansi_chatset=ANSI 字符集 +config.repo.force_private=强制设为私有 +config.repo.max_creation_limit=最大创建限制 +config.repo.preferred_licenses=推荐的许可证 +config.repo.disable_http_git=禁用 HTTP Git +config.repo.enable_local_path_migration=启用本地路径迁移 +config.repo.enable_raw_file_render_mode=启用原始文件渲染模式 +config.repo.commits_fetch_concurrency=代码提交拉取并发量 +config.repo.editor.line_wrap_extensions=编辑器行自动换行扩展 +config.repo.editor.previewable_file_modes=编辑器可预览文件模式 +config.repo.upload.enabled=启用上传 +config.repo.upload.temp_path=上传文件临时路径 +config.repo.upload.allowed_types=允许的上传类型 +config.repo.upload.file_max_size=上传文件大小限制 +config.repo.upload.max_files=上传文件数量限制 config.db_config=数据库配置 -config.db_type=数据库类型 -config.db_host=主机地址 -config.db_name=数据库名称 -config.db_user=连接用户 -config.db_ssl_mode=SSL 模式 -config.db_ssl_mode_helper=(仅限 "postgres" 使用) -config.db_path=数据库路径 -config.db_path_helper=(用于 "sqlite3" 和 "tidb") - -config.service_config=服务配置 -config.register_email_confirm=注册邮件确认 -config.disable_register=关闭注册功能 -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.db.type=类型 +config.db.host=主机 +config.db.name=名称 +config.db.schema=模式 +config.db.schema_helper=(仅适用 "postgres") +config.db.user=用户 +config.db.ssl_mode=SSL 模式 +config.db.ssl_mode_helper=(仅限 "postgres" 使用) +config.db.path=数据库路径 +config.db.path_helper=(仅限 "sqlite3" 使用) +config.db.max_open_conns=最大打开连接数 +config.db.max_idle_conns=最大空闲连接数 + +config.security_config=安全配置 +config.security.login_remember_days=记住登录的天数 +config.security.cookie_remember_name=记住登录 Cookie +config.security.cookie_username=用户名 Cookie +config.security.cookie_secure=启用安全的 Cookie +config.security.reverse_proxy_auth_user=反向代理认证 Header +config.security.enable_login_status_cookie=启用登录状态 Cookie +config.security.login_status_cookie_name=登录状态 Cookie +config.security.local_network_allowlist=本地网络白名单 + +config.email_config=邮件配置 +config.email.enabled=启用 +config.email.subject_prefix=主题前缀 +config.email.host=主机 +config.email.from=来自 +config.email.user=用户 +config.email.disable_helo=禁用 HELO +config.email.helo_hostname=HELO 主机名 +config.email.skip_verify=忽略证书验证 +config.email.use_certificate=使用自定义证书 +config.email.cert_file=证书文件 +config.email.key_file=密钥文件 +config.email.use_plain_text=使用纯文本 +config.email.add_plain_text_alt=添加纯文本选项 +config.email.send_test_mail=发送测试邮件 +config.email.test_mail_failed=发送测试邮件至 '%s' 时失败:%v +config.email.test_mail_sent=测试邮件已经发送至 '%s'。 + +config.auth_config=认证配置 +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=激活用户链接有效期 +config.auth.reset_password_code_lives=重置密码链接有效期 +config.auth.require_email_confirm=注册邮件确认 +config.auth.require_sign_in_view=需要登录后浏览 +config.auth.disable_registration=关闭注册功能 +config.auth.enable_registration_captcha=启用注册验证码 +config.auth.enable_reverse_proxy_authentication=启用反向代理认证 +config.auth.enable_reverse_proxy_auto_registration=启用反向代理自动注册 +config.auth.reverse_proxy_authentication_header=反向代理认证 Header + +config.user_config=用户配置 +config.user.enable_email_notify=启用电子邮件通知 -config.webhook_config=Web 钩子配置 -config.queue_length=队列长度 -config.deliver_timeout=推送超时 -config.skip_tls_verify=忽略 TLS 验证 - -config.mailer_config=邮件配置 -config.mailer_enabled=启用服务 -config.mailer_disable_helo=禁用 HELO 操作 -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=社交帐号配置 -config.oauth_enabled=启用服务 +config.session_config=Session 配置 +config.session.provider=提供者 +config.session.provider_config=提供者配置 +config.session.cookie_name=Cookie +config.session.https_only=仅限 HTTPS +config.session.gc_interval=GC 间隔 +config.session.max_life_time=最大生命周期 +config.session.csrf_cookie_name=CSRF Cookie config.cache_config=Cache 配置 -config.cache_adapter=Cache 适配器 -config.cache_interval=Cache 周期 -config.cache_conn=Cache 连接字符串 - -config.session_config=Session 配置 -config.session_provider=Session 提供者 -config.provider_config=提供者配置 -config.cookie_name=Cookie 名称 -config.enable_set_cookie=启用设置 Cookie -config.gc_interval_time=GC 周期 -config.session_life_time=Session 生命周期 -config.https_only=仅限 HTTPS -config.cookie_life_time=Cookie 生命周期 +config.cache.adapter=适配器 +config.cache.interval=GC 间隔 +config.cache.host=主机 + +config.http_config=HTTP 配置 +config.http.access_control_allow_origin=允许访问来源控制 + +config.attachment_config=附件配置 +config.attachment.enabled=启用 +config.attachment.path=路径 +config.attachment.allowed_types=允许的类型 +config.attachment.max_size=大小限制 +config.attachment.max_files=文件数量限制 + +config.release_config=发布配置 +config.release.attachment.enabled=启用附件 +config.release.attachment.allowed_types=允许的附件类型 +config.release.attachment.max_size=附件大小限制 +config.release.attachment.max_files=附件文件数量限制 config.picture_config=图片配置 -config.picture_service=图片服务 -config.disable_gravatar=禁用 Gravatar 头像 -config.enable_federated_avatar=启用 Federated Avatars +config.picture.avatar_upload_path=用户头像上传路径 +config.picture.repo_avatar_upload_path=仓库头像上传路径 +config.picture.gravatar_source=Gravatar 源 +config.picture.disable_gravatar=禁用 Gravatar 头像 +config.picture.enable_federated_avatar=启用 Federated 头像 + +config.mirror_config=镜像配置 +config.mirror.default_interval=默认同步间隔 + +config.webhook_config=Web 钩子配置 +config.webhook.types=类型 +config.webhook.deliver_timeout=推送超时 +config.webhook.skip_tls_verify=忽略 TLS 验证 config.git_config=Git 配置 -config.git_disable_diff_highlight=禁用差异对比语法高亮 -config.git_max_diff_lines=差异对比显示的最大行数(单个文件) -config.git_max_diff_line_characters=差异对比显示的最大字符数(单行) -config.git_max_diff_files=差异对比显示的最大文件数 -config.git_gc_args=GC 参数 -config.git_migrate_timeout=迁移操作超时 -config.git_mirror_timeout=镜像更新操作超时 -config.git_clone_timeout=克隆操作超时 -config.git_pull_timeout=拉取操作超时 -config.git_gc_timeout=GC 操作超时 +config.git.disable_diff_highlight=禁用差异对比语法高亮 +config.git.max_diff_lines=差异行限制(单个文件) +config.git.max_diff_line_characters=差异字符限制(单行) +config.git.max_diff_files=差异文件数量限制(单次提交) +config.git.gc_args=GC 参数 +config.git.migrate_timeout=迁移超时 +config.git.mirror_timeout=镜像拉取超时 +config.git.clone_timeout=克隆超时 +config.git.pull_timeout=拉取超时 +config.git.gc_timeout=GC 超时 + +config.lfs_config=LFS 配置 +config.lfs.storage=存储方式 +config.lfs.objects_path=对象路径 config.log_config=日志配置 -config.log_mode=日志模式 +config.log_file_root_path=日志文件根目录 +config.log_mode=模式 +config.log_options=选项 monitor.cron=Cron 任务 monitor.name=任务名称 @@ -1159,22 +1386,29 @@ notices.delete_success=系统提示删除成功! create_repo=创建了仓库 %s rename_repo=重命名仓库 %[1]s%[3]s commit_repo=推送了 %[3]s 分支的代码到 %[4]s +compare_commits=对比 %d 次代码提交 +transfer_repo=将仓库 %s 转移至 %s create_issue=`创建了工单 %s#%[2]s` close_issue=`关闭了工单 %s#%[2]s` reopen_issue=`重新开启了工单 %s#%[2]s` +comment_issue=`评论了工单 %s#%[2]s` create_pull_request=`创建了合并请求 %s#%[2]s` close_pull_request=`关闭了合并请求 %s#%[2]s` reopen_pull_request=`重新开启了合并请求 %s#%[2]s` -comment_issue=`评论了工单 %s#%[2]s` merge_pull_request=`合并了合并请求 %s#%[2]s` -transfer_repo=将仓库 %s 转移至 %s +create_branch=创建了新的分支 %[3]s%[4]s +delete_branch=删除了 %[3]s 的分支 %[2]s push_tag=推送了标签 %[2]s%[3]s -compare_commits=对比 %d 次代码提交 +delete_tag=删除了 %[3]s 的标签 %[2]s +fork_repo=派生了仓库 %s +mirror_sync_push=从镜像同步了 %[3]s 分支的代码到 %[4]s +mirror_sync_create=从镜像同步了新的引用 %[2]s%[3]s +mirror_sync_delete=从镜像同步并从 %[3]s 删除了引用 %[2]s [tool] ago=之前 from_now=之后 -now=现在 +now=刚刚 1s=1 秒%s 1m=1 分钟%s 1h=1 小时%s @@ -1191,6 +1425,7 @@ months=%d 月%s years=%d 年%s raw_seconds=秒 raw_minutes=分钟 +raw_hours=小时 [dropzone] default_message=拖曳文件到此处或单击上传 diff --git a/conf/locale/locale_zh-HK.ini b/conf/locale/locale_zh-HK.ini index bff922f36cc..af5f7616177 100644 --- a/conf/locale/locale_zh-HK.ini +++ b/conf/locale/locale_zh-HK.ini @@ -9,7 +9,6 @@ sign_out=登出 sign_up=註冊 register=註冊 website=網站 -version=版本 page=頁面 template=樣板 language=語言 @@ -44,23 +43,27 @@ issues=問題 cancel=取消 +[status] +page_not_found=Page Not Found +internal_server_error=Internal Server Error + [install] install=安裝頁面 title=首次安裝步驟 docker_helper=如果您正在使用 Docker 容器運行 Gogs,請務必先仔細閱讀 官方文檔 後再對本頁面進行填寫。 -requite_db_desc=Gogs 要求安裝 MySQL、PostgreSQL、SQLite3 或 TiDB。 +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). db_title=數據庫設置 db_type=資料庫類型 host=主機 user=帳號 password=密碼 db_name=資料庫名稱 +db_schema=Schema 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 數據庫名稱不允許包含字符 "." 或 "-" 。 +sqlite_helper=The file path of SQLite3 database.
Please use absolute path when you start as service. +err_empty_db_path=SQLite3 database path cannot be empty. no_admin_and_disable_registration=您不能夠在未創建管理員用戶的情況下禁止註冊。 err_empty_admin_password=管理員密碼不能為空。 @@ -75,12 +78,17 @@ domain=域名 domain_helper=該設置影響 SSH 複製地址。 ssh_port=SSH 埠 ssh_port_helper=您的 SSH 服務正在使用此埠號,若要禁用SSH 功能請保持欄位空白。 +use_builtin_ssh_server=Use Builtin SSH Server +use_builtin_ssh_server_popup=Start builtin SSH server for Git operations to distinguish from system SSH daemon. http_port=HTTP 端口號 http_port_helper=應用監聽的端口號 app_url=應用程式網址 app_url_helper=該設置影響 HTTP/HTTPS 複製地址和一些郵箱中的連結。 log_root_path=日誌路徑 log_root_path_helper=寫入日誌檔目錄 +enable_console_mode=Enable Console Mode +enable_console_mode_popup=In addition to file mode, also print logs to console. +default_branch=Default Branch optional_title=可選設置 email_title=電子郵件服務設定 @@ -116,7 +124,10 @@ sqlite3_not_available=您所使用的發行版本不支持 SQLite3,請從 %s invalid_db_setting=數據庫設置不正確:%v invalid_repo_path=倉庫根目錄設置不正確:%v run_user_not_match=執行系統用戶非當前用戶:%s -> %s +smtp_host_missing_port=SMTP Host port missing from address. +invalid_smtp_from=SMTP From field is invalid: %v save_config_failed=應用配置保存失敗:%v +init_failed=Failed to initialize application: %v invalid_admin_setting=管理員帳戶設置不正確:%v install_success=您好!我們很高興您選擇使用 Gogs,祝您使用愉快,代碼從此無 BUG! invalid_log_root_path=日誌根目錄無效: %v @@ -137,6 +148,7 @@ issues.in_your_repos=屬於該用戶倉庫的 [explore] repos=探索倉庫 users=用戶 +organizations=Organizations search=搜索 [auth] @@ -145,6 +157,8 @@ register_hepler_msg=已經註冊?立即登錄! social_register_hepler_msg=已經註冊?立即綁定! disable_register_prompt=對不起,註冊功能已被關閉。請聯系網站管理員。 disable_register_mail=對不起,註冊郵箱確認功能已被關閉。 +auth_source=Authentication Source +local=Local remember_me=記住登錄 forgot_password=忘記密碼 forget_password=忘記密碼? @@ -152,11 +166,10 @@ sign_up_now=還沒帳戶?馬上註冊。 confirmation_mail_sent_prompt=一封新的確認郵件已經被發送至 %s,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。 active_your_account=激活您的帳戶 prohibit_login=Login Prohibited -prohibit_login_desc=Your account is prohibited to login, please contact site admin. +prohibit_login_desc=Your account is prohibited from logging in. Please contact the site admin. resent_limit_prompt=對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試! has_unconfirmed_mail=%s 您好,您有一封發送至( %s) 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。 resend_mail=單擊此處重新發送確認郵件 -email_not_associate=您輸入的郵箱地址未被關聯到任何帳號! send_reset_mail=單擊此處(重新)發送您的密碼重置郵件 reset_password=重置密碼 invalid_code=對不起,您的確認代碼已過期或已失效。 @@ -164,6 +177,14 @@ reset_password_helper=單擊此處重置密碼 password_too_short=密碼長度不能少於 6 位! non_local_account=Non-local accounts cannot change passwords through Gogs. +login_two_factor=Two-factor Authentication +login_two_factor_passcode=Authentication Passcode +login_two_factor_enter_recovery_code=Enter a two-factor recovery code +login_two_factor_recovery=Two-factor Recovery +login_two_factor_recovery_code=Recovery Code +login_two_factor_enter_passcode=Enter a two-factor passcode +login_two_factor_invalid_recovery_code=Recovery code already used or invalid. + [mail] activate_account=請激活您的帳戶 activate_email=請驗證您的郵箱地址 @@ -194,11 +215,12 @@ CommitSummary=Commit summary CommitMessage=Commit message CommitChoice=Commit choice TreeName=File path -Content=Content +Content=內容 require_error=不能為空。 alpha_dash_error=必須為英文字母、阿拉伯數字或橫線(-_)。 alpha_dash_dot_error=必須為英文字母、阿拉伯數字、橫線(-_)或點。 +alpha_dash_dot_slash_error=` must be alphanumeric, dash (-_), dot or slash characters.` size_error=長度必須為 %s。 min_size_error=長度最小為 %s 個字符。 max_size_error=長度最大為 %s 個字符。 @@ -215,6 +237,7 @@ org_name_been_taken=組織名稱已經被佔用。 team_name_been_taken=團隊名稱已經被佔用。 email_been_used=郵箱地址已經被使用。 username_password_incorrect=用戶名或密碼不正確。 +auth_source_mismatch=The authentication source selected is not associated with the user. enterred_invalid_repo_name=請檢查您輸入的倉庫名稱是正確。 enterred_invalid_owner_name=請檢查您輸入的新所有者用戶名是否正確。 enterred_invalid_password=請檢查您輸入的密碼是否正確。 @@ -236,25 +259,24 @@ change_avatar=Change your avatar join_on=加入於 repositories=倉庫列表 activity=公開活動 -followers=關註者 +followers=關注者 starred=已讚好 -following=關註中 +following=關注中 follow=關注 unfollow=取消關注 -form.name_reserved=用戶名 '%s' 是被保留的。 -form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。 +form.name_not_allowed=User name or pattern %q is not allowed. [settings] profile=個人信息 password=修改密碼 -avatar=Avatar +avatar=頭像 ssh_keys=管理 SSH 密鑰 -social=社交帳號綁定 -applications=管理授權應用 +security=安全 +repos=倉庫 orgs=管理組織 +applications=管理授權應用 delete=刪除帳戶 -uid=用戶 ID public_profile=公開信息 profile_desc=您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。 @@ -295,6 +317,7 @@ delete_email=刪除 email_deletion=刪除郵箱 email_deletion_desc=刪除該郵箱地址將會移除所有相關的信息。是否繼續? email_deletion_success=成功刪除郵箱! +email_deletion_primary=Cannot delete primary email address. add_new_email=添加新的電子郵件地址 add_email=添加電子郵件 add_email_confirmation_sent=一封待確認的電子郵件已發送到 '%s',請在%d 小時內檢查您的收件箱,並完成確認過程。 @@ -320,14 +343,36 @@ no_activity=沒有最近活動 key_state_desc=該密鑰在 7 天內被使用過 token_state_desc=此token在過去七天內曾經被使用過 -manage_social=管理關聯社交帳戶 -social_desc=以下是與您帳戶所關聯的社交帳號,如果您發現有陌生的關聯,請立即解除綁定! -unbind=解除綁定 -unbind_success=社交帳號解除綁定成功! +two_factor=Two-factor Authentication +two_factor_status=狀態: +two_factor_on=開啟 +two_factor_off=關閉 +two_factor_enable=啟用 +two_factor_disable=禁用 +two_factor_view_recovery_codes=View and save your recovery codes in a safe place. You can use them as passcode if you lose access to your authentication application. +two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use Personal Access Token as your credential, e.g. %[3]s. +two_factor_enable_title=Enable Two-factor Authentication +two_factor_scan_qr=Please use your authentication application to scan the image: +two_factor_or_enter_secret=或者輸入密碼: +two_factor_then_enter_passcode=然後輸入驗證碼: +two_factor_verify=驗證 +two_factor_invalid_passcode=The passcode you entered is not valid, please try again! +two_factor_reused_passcode=The passcode you entered has already been used, please try another one! +two_factor_enable_error=Enable Two-factor authentication failed: %v +two_factor_enable_success=Two-factor authentication has enabled for your account successfully! +two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes +two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, please keep these codes in a safe place. +two_factor_regenerate_recovery_codes=Regenerate Recovery Codes +two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v +two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully! +two_factor_disable_title=Disable Two-factor Authentication +two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue? +two_factor_disable_success=Two-factor authentication has disabled successfully! manage_access_token=管理個人操作令牌 generate_new_token=生成新的令牌 tokens_desc=您所產生的token將被用來存取Gogs APIs +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=目前為止,任何令牌都對您的帳戶擁有完整的操作權限。 token_name=令牌名稱 generate_token=生成令牌 @@ -336,6 +381,16 @@ delete_token=删除令牌 access_token_deletion=刪除個人的連接token access_token_deletion_desc=刪除此連接token將會刪除與相關應用程式的連結。您想要繼續嗎? delete_token_success=您的連接token已成功刪除。請記得更新您的應用程式。 +token_name_exists=Token with same name already exists. + +orgs.none=You are not a member of any organizations. +orgs.leave_title=Leave organization +orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue? + +repos.leave=Leave +repos.leave_title=Leave repository +repos.leave_desc=You will lose access to the repository after you left. Do you want to continue? +repos.leave_success=You have left repository '%s' successfully! delete_account=刪除當前帳戶 delete_prompt=刪除操作會永久清除您的帳戶信息,並且 不可恢復! @@ -348,7 +403,9 @@ owner=擁有者 repo_name=倉庫名稱 repo_name_helper=偉大的倉庫名稱一般都較短、令人深刻並且 獨一無二 的。 visibility=可見度 +unlisted=Unlisted visiblity_helper=該倉庫為 私有的 +unlisted_helper=This repository is Unlisted visiblity_helper_forced=網站管理員已強制要求所有新建倉庫必須為 私有的 visiblity_fork_helper=(修改該值將會影響到所有派生倉庫) clone_helper=不知道如何操作?訪問 帮助説明 ! @@ -374,24 +431,26 @@ mirror_last_synced=Last Synced watchers=關注者 stargazers=稱讚者 forks=派生倉庫 +repo_description_helper=Description of repository. Maximum 512 characters length. +repo_description_length=Available characters form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。 -form.name_reserved=倉庫名稱 '%s' 是被保留的。 -form.name_pattern_not_allowed=倉庫名稱不允許 '%s' 的格式。 +form.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=需要授權驗證 migrate_type=遷移類型 migrate_type_helper=該倉庫將是一個 鏡像 migrate_repo=遷移倉庫 migrate.clone_address=複製地址 -migrate.clone_address_desc=該地址可以是 HTTP/HTTPS/GIT URL 或本地服務器路徑。 +migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL. +migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path. migrate.permission_denied=您並沒有導入本地倉庫的權限。 migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄! +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=遷移失敗:%v mirror_from=镜像来自 forked_from=派生自 -fork_from_self=無法派生已經擁有的倉庫! copy_link=複製連結 copy_link_success=複製成功! copy_link_error=請按下 ⌘-C 或 Ctrl-C 複製 @@ -407,9 +466,9 @@ quick_guide=快速幫助 clone_this_repo=複製當前倉庫 create_new_repo_command=從命令行創建一個新的倉庫 push_exist_repo=從命令行推送已經創建的倉庫 -repo_is_empty=這倉庫不包含任何內容,請稍後再訪問! +bare_message=This repository does not have any content yet. -code=代碼 +files=Files branch=分支 tree=目錄樹 filter_branch_and_tag=過濾分支或標籤 @@ -420,12 +479,23 @@ pulls=合併請求 labels=標籤 milestones=里程碑 commits=提交歷史 +git_branches=Branches releases=版本發佈 file_raw=原始文件 file_history=文件歷史 file_view_raw=查看原始文件 file_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. + +branches.overview=Overview +branches.active_branches=Active Branches +branches.stale_branches=Stale Branches +branches.all=All Branches +branches.updated_by=Updated %[1]s by %[2]s +branches.change_default_branch=Change Default Branch +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=New file editor.upload_file=Upload file @@ -455,16 +525,19 @@ editor.cancel=Cancel editor.filename_cannot_be_empty=Filename cannot be empty. editor.branch_already_exists=Branch '%s' already exists in this repository. editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. +editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor. editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. editor.file_already_exists=A file with name '%s' already exists in this repository. editor.no_changes_to_show=There are no changes to show. editor.fail_to_update_file=Failed to update/create file '%s' with error: %v +editor.fail_to_delete_file=Failed to delete 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' +commits.commit_history=Commit History commits.commits=次代碼提交 commits.search=搜索提交歷史 commits.find=查找 @@ -491,7 +564,7 @@ issues.new_label=創建標籤 issues.new_label_placeholder=標籤名稱... issues.create_label=創建標籤 issues.label_templates.title=Load a predefined set of labels -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.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.helper=Select a label set issues.label_templates.use=Use this label set issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v @@ -562,6 +635,7 @@ pulls.compare_compare=對比文件變化 pulls.filter_branch=過濾分支 pulls.no_results=未找到結果 pulls.nothing_to_compare=基準和對比分支代碼已經同步,無需進行對比。 +pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history. pulls.has_pull_request=`已經存在目標分支的合併請求:%[2]s#%[3]d` pulls.create=創建合併請求 pulls.title_desc=請求將 %[1]d 次代碼提交從 %[2]s 合併至 %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=該合併請求正在進行衝突檢查,請稍後再刷新 pulls.can_auto_merge_desc=這個拉請求可以自動合併。 pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請求。 pulls.cannot_auto_merge_helper=請手動合併來解決衝突。 +pulls.create_merge_commit=Create a merge commit +pulls.rebase_before_merging=Rebase before merging +pulls.commit_description=Commit Description pulls.merge_pull_request=合併請求 pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d),您無法執行重新開啟操作。` +pulls.delete_branch=Delete Branch +pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence. milestones.new=新的里程碑 milestones.open_tab=%d 開啟中 @@ -629,6 +708,29 @@ settings.collaboration.admin=Admin settings.collaboration.write=Write settings.collaboration.read=Read settings.collaboration.undefined=Undefined +settings.branches=Branches +settings.branches_bare=You cannot manage branches for bare repository. Please push some content first. +settings.default_branch=Default Branch +settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing. +settings.update=Update +settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server. +settings.update_default_branch_success=Default branch of this repository has been updated successfully! +settings.protected_branches=Protected Branches +settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers. +settings.choose_a_branch=Choose a branch... +settings.branch_protection=Branch Protection +settings.branch_protection_desc=Please choose protect options for branch %s. +settings.protect_this_branch=Protect this branch +settings.protect_this_branch_desc=Disable force pushes and prevent from deletion. +settings.protect_require_pull_request=Require pull request instead direct pushing +settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request. +settings.protect_whitelist_committers=Whitelist who can push to this branch +settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check. +settings.protect_whitelist_users=Users who can push to this branch +settings.protect_whitelist_search_users=Search users +settings.protect_whitelist_teams=Teams for which members of them can push to this branch +settings.protect_whitelist_search_teams=Search teams +settings.update_protect_branch_success=Protect options for this branch has been updated successfully! settings.hooks=管理 Web 鉤子 settings.githooks=管理 Git 鉤子 settings.basic_settings=基本設置 @@ -641,19 +743,26 @@ settings.change_reponame_prompt=該操作將會影響到所有與該倉庫有關 settings.advanced_settings=高級設置 settings.wiki_desc=Enable wiki system settings.use_internal_wiki=Use builtin wiki +settings.allow_public_wiki_desc=Allow public access to wiki when repository is private settings.use_external_wiki=使用外部 wiki settings.external_wiki_url=外部 Wiki 連結 settings.external_wiki_url_desc=當分頁上按一下,訪客將會重新導到 URL。 settings.issues_desc=Enable issue tracker settings.use_internal_issue_tracker=Use builtin lightweight issue tracker +settings.allow_public_issues_desc=Allow public access to issues when repository is private settings.use_external_issue_tracker=使用外部的問題管理系統 +settings.external_tracker_url=External Issue Tracker URL +settings.external_tracker_url_desc=Visitors will be redirected to URL when they click on the tab. settings.tracker_url_format=外部問題管理系統的 URL 格式 settings.tracker_issue_style=External Issue Tracker Naming Style: settings.tracker_issue_style.numeric=Numeric settings.tracker_issue_style.alphanumeric=Alphanumeric settings.tracker_url_format_desc=您可以使用 {user} {repo} {index} 分別作為用戶名、倉庫名和問題索引的占位符。 -settings.pulls_desc=啟用合併請求以接受社區貢獻 +settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches +settings.pulls.ignore_whitespace=Ignore changes in whitespace +settings.pulls.allow_rebase_merge=Allow use rebase to merge commits settings.danger_zone=危險操作區 +settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner. settings.new_owner_has_same_repo=新的倉庫擁有者已經存在同名倉庫! settings.convert=轉換為正規倉庫 settings.convert_desc=您可以將此鏡像轉成正規倉庫。此動做不可逆。 @@ -672,7 +781,7 @@ settings.wiki_deletion_success=Repository wiki data have been erased successfull settings.delete=刪除本倉庫 settings.delete_desc=刪除倉庫操作不可逆轉,請三思而後行。 settings.delete_notices_1=- 此操作 不可以 被回滾。 -settings.delete_notices_2=- 此操作將永久刪除該倉庫,包括 Git 數據、 問題、 評論和協作者的操作權限。 +settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access. settings.delete_notices_fork_1=- All forks will become independent after deletion. settings.deletion_success=倉庫刪除成功! settings.update_settings_success=倉庫設置更新成功! @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=This user will no longer have collaboration settings.remove_collaborator_success=被操作的協作者已經被收回權限! settings.search_user_placeholder=搜索用戶... settings.org_not_allowed_to_be_collaborator=Organization is not allowed to be added as a collaborator. -settings.user_is_org_member=被操作的用戶是組織成員,因此無法添加為協作者! -settings.add_webhook=添加 Web 鉤子 settings.hooks_desc=Web 鉤子允許您設定在 Gogs 上發生指定事件時對指定 URL 發送 POST 通知。查看 Webhooks 文檔 獲取更多信息。 +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=添加 Web 鉤子 settings.webhook_deletion=刪除 Web 鉤子 settings.webhook_deletion_desc=刪除該 Web 鉤子將會刪除與其有關的信息和推送歷史。是否繼續? settings.webhook_deletion_success=Web 鉤子刪除成功! settings.webhook.test_delivery=測試推送 settings.webhook.test_delivery_desc=生成並推送一個模擬的 Push 事件 settings.webhook.test_delivery_success=測試推送已經加入到隊列,請耐心等待數秒再刷新推送記錄。 +settings.webhook.redelivery=Redelivery +settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history. settings.webhook.request=請求內容 settings.webhook.response=響應內容 settings.webhook.headers=標題 settings.webhook.payload=推送內容 settings.webhook.body=響應內容 +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Git 鉤子是由 Git 本身提供的功能,以下為 Gogs 所支持的鉤子列表。 settings.githook_edit_desc=如果鉤子未啟動,則會顯示樣例文件中的內容。如果想要刪除某個鉤子,則提交空白文本即可。 settings.githook_name=鉤子名稱 @@ -711,6 +825,7 @@ settings.add_webhook_desc=我們會通過 POST 請求將訂閱事 settings.payload_url=推送地址 settings.content_type=數據格式 settings.secret=密鑰文本 +settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via X-Gogs-Signature header. settings.slack_username=服務名稱 settings.slack_icon_url=圖標 URL settings.slack_color=顏色代碼 @@ -720,10 +835,20 @@ settings.event_send_everything=推送 所有 事件 settings.event_choose=讓我選擇我的需要 settings.event_create=創建 settings.event_create_desc=創建分支或標籤 -settings.event_pull_request=Pull Request -settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. +settings.event_delete=Delete +settings.event_delete_desc=Branch or tag deleted +settings.event_fork=Fork +settings.event_fork_desc=Repository forked settings.event_push=推送 settings.event_push_desc=Git 倉庫推送 +settings.event_issues=Issues +settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized. +settings.event_issue_comment=Issue Comment +settings.event_issue_comment_desc=Issue comment created, edited, or deleted. +settings.event_release=Release +settings.event_release_desc=Release published in a repository. settings.active=是否激活 settings.active_helper=當指定事件發生時我們將會觸發此 Web 鉤子。 settings.add_hook_success=Web 鉤子添加成功! @@ -733,10 +858,13 @@ settings.delete_webhook=刪除 Web 鉤子 settings.recent_deliveries=最近推送記錄 settings.hook_type=鉤子類型 settings.add_slack_hook_desc=為您的倉庫增加 Slack 集成。 +settings.add_discord_hook_desc=Add Discord integration to your repository. +settings.add_dingtalk_hook_desc=Add Dingtalk integration to your repository. settings.slack_token=令牌 settings.slack_domain=域名 settings.slack_channel=頻道 settings.deploy_keys=管理部署密鑰 +settings.deploy_keys_helper=Common Gotcha! If you're looking for adding personal public keys, please add them in your account settings. settings.add_deploy_key=添加部署密鑰 settings.deploy_key_desc=部署密鑰僅具有隻讀權限,它在功能上和個人用戶的公開密鑰有本質區別。 settings.no_deploy_keys=您還沒有添加任何部署密鑰。 @@ -748,6 +876,8 @@ settings.add_key_success=新的部署密鑰 '%s' 添加成功! settings.deploy_key_deletion=刪除部署密鑰 settings.deploy_key_deletion_desc=刪除該部署密鑰會移除本倉庫所有相關的操作權限。是否繼續? settings.deploy_key_deletion_success=刪除部署密鑰成功! +settings.description_desc=Description of repository. Maximum 512 characters length. +settings.description_length=Available characters diff.browse_source=瀏覽代碼 diff.parent=父節點 @@ -766,7 +896,6 @@ release.releases=版本發佈 release.new_release=發佈新版本 release.draft=草稿 release.prerelease=預發佈版本 -release.stable=穩定 release.edit=編輯 release.ahead=在該版本發佈之後已有 %d 次代碼提交到 %s 分支 release.source_code=源代碼 @@ -813,8 +942,8 @@ team_name_helper=您可以使用該名稱來通知改組全體成員。 team_desc_helper=一句話描述這個團隊是做什麼的。 team_permission_desc=請選擇該團隊所具有的權限等級: -form.name_reserved=組織名稱 '%s' 是被保留的。 -form.name_pattern_not_allowed=組織名稱不允許 '%s' 的格式。 +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=組織設置 settings.options=基本設置 @@ -886,12 +1015,19 @@ first_page=首頁 last_page=末頁 total=總計:%d +dashboard.build_info=Build Information +dashboard.app_ver=Application version +dashboard.git_version=Git version +dashboard.go_version=Go version +dashboard.build_time=Build time +dashboard.build_commit=Build commit dashboard.statistic=應用統計數據 dashboard.operations=管理員操作 dashboard.system_status=系統監視狀態 -dashboard.statistic_info=Gogs 數據庫統計:%d 位用戶,%d 個組織,%d 個公鑰,%d 個倉庫,%d 個倉庫關註,%d 個贊,%d 次行為,%d 條權限記錄,%d 個問題,%d 次評論,%d 個社交帳號,%d 個用戶關註,%d 個鏡像,%d 個版本發佈,%d 個登錄源,%d 個 Web 鉤子,%d 個里程碑,%d 個標籤,%d 個鉤子任務,%d 個團隊,%d 個更新任務,%d 個附件。 +dashboard.statistic_info=Gogs 數據庫統計:%d 位用戶,%d 個組織,%d 個公鑰,%d 個倉庫,%d 個倉庫關注,%d 個贊,%d 次行為,%d 條權限記錄,%d 個問題,%d 次評論,%d 個社交帳號,%d 個用戶關注,%d 個鏡像,%d 個版本發佈,%d 個登錄源,%d 個 Web 鉤子,%d 個里程碑,%d 個標籤,%d 個鉤子任務,%d 個團隊,%d 個更新任務,%d 個附件。 dashboard.operation_name=操作名稱 dashboard.operation_switch=開關 +dashboard.select_operation_to_run=Please select operation to run dashboard.operation_run=執行 dashboard.clean_unbind_oauth=清理未綁定社交帳號 dashboard.clean_unbind_oauth_success=所有未綁定社交數據清除成功! @@ -905,8 +1041,8 @@ dashboard.git_gc_repos=對倉庫進行垃圾回收 dashboard.git_gc_repos_success=所有倉庫的垃圾回收已成功完成! dashboard.resync_all_sshkeys=重新生成 '.ssh/authorized_keys' 文件(警告:不是 Gogs 的密鑰也會被刪除) dashboard.resync_all_sshkeys_success=所有公鑰重新生成成功! -dashboard.resync_all_update_hooks=重新生成所有倉庫的 Update 鈎子(用於被修改的自定義配置文件) -dashboard.resync_all_update_hooks_success=已成功重新生成所有倉庫的 Update 鈎子! +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 repository records that lost Git files dashboard.reinit_missing_repos_success=All repository records that lost Git files have been reinitialized successfully. @@ -981,12 +1117,14 @@ repos.private=私有庫 repos.watches=關註數 repos.stars=讚好數 repos.issues=問題數 +repos.size=Size -auths.auth_manage_panel=認證管理面板 +auths.auth_sources=Authentication Sources auths.new=添加新認證源 auths.name=認證名稱 auths.type=認證類型 auths.enabled=已啟用 +auths.default=Default auths.updated=最後更新時間 auths.auth_type=認證類型 auths.auth_name=認證名稱 @@ -995,15 +1133,21 @@ auths.domain=域名 auths.host=主機地址 auths.port=主機端口 auths.bind_dn=綁定DN +auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s auths.bind_password=綁定密碼 auths.bind_password_helper=警告:該密碼將會以明文的形式保存在數據庫中。請不要使用擁有高權限的帳戶! auths.user_base=用戶搜索基準 auths.user_dn=User DN auths.attribute_username=用戶名屬性 auths.attribute_username_placeholder=留空表示使用用戶登錄時所使用的用戶名 -auths.attribute_name=名子屬性 +auths.attribute_name=First Name Attribute auths.attribute_surname=姓氏屬性 auths.attribute_mail=電子郵箱屬性 +auths.verify_group_membership=Verify group membership +auths.group_search_base_dn=Group Search Base DN +auths.group_filter=Group Filter +auths.group_attribute_contain_user_list=Group Attribute Containing List of Users +auths.user_attribute_listed_in_group=User Attribute Listed in Group auths.attributes_in_bind=Fetch attributes in Bind DN context auths.filter=使用者篩選器 auths.admin_filter=管理者篩選器 @@ -1017,9 +1161,9 @@ 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.default_auth=This authentication is default login source auths.new_success=新的認證源 "%s" 添加成功! auths.update_success=認證設置更新成功! auths.update=更新認證設置 @@ -1028,107 +1172,189 @@ auths.delete_auth_title=刪除認證操作 auths.delete_auth_desc=該認證將被刪除。是否繼續? auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first. auths.deletion_success=認證源刪除成功! +auths.login_source_exist=Login source '%s' already exists. +auths.github_api_endpoint=API Endpoint +config.not_set=(not set) config.server_config=服務器配置 -config.app_name=應用名稱 -config.app_ver=應用版本 -config.app_url=應用 URL -config.domain=應用域名 -config.offline_mode=離線模式 -config.disable_router_log=關閉路由日志 +config.brand_name=Brand name config.run_user=執行用戶 config.run_mode=執行模式 -config.repo_root_path=倉庫根目錄 -config.static_file_root_path=靜態文件根目錄 -config.log_file_root_path=日志文件根目錄 -config.script_type=腳本類型 -config.reverse_auth_user=反向代理認證 +config.server.external_url=External URL +config.server.domain=Domain +config.server.protocol=Protocol +config.server.http_addr=HTTP address +config.server.http_port=HTTP port +config.server.cert_file=Certificate file +config.server.key_file=Key file +config.server.tls_min_version=Minimum TLS version +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=Offline mode +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Enable Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL config.ssh_config=SSH 配置 -config.ssh_enabled=已啟用 -config.ssh_start_builtin_server=啟動內建伺服器 -config.ssh_domain=Domain -config.ssh_port=埠 -config.ssh_listen_port=監聽埠 -config.ssh_root_path=根路徑 -config.ssh_key_test_path=金鑰測試路徑 -config.ssh_keygen_path=金鑰產生 (' ssh-keygen ') 路徑 -config.ssh_minimum_key_size_check=金鑰最小大小檢查 -config.ssh_minimum_key_sizes=金鑰最小大小 +config.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=Root path +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Repository configuration +config.repo.root_path=Root path +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=Upload enabled +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=Upload file size limit +config.repo.upload.max_files=Upload files limit config.db_config=數據庫配置 -config.db_type=數據庫類型 -config.db_host=主機地址 -config.db_name=數據庫名稱 -config.db_user=數據庫用戶 -config.db_ssl_mode=SSL 模式 -config.db_ssl_mode_helper=(僅限 "postgres" 使用) -config.db_path=數據庫路徑 -config.db_path_helper=(用於 "sqlite3" 和 "tidb") - -config.service_config=服務配置 -config.register_email_confirm=註冊電子郵件確認 -config.disable_register=關閉註冊功能 -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.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=User +config.db.ssl_mode=SSL mode +config.db.ssl_mode_helper=(for "postgres" only) +config.db.path=Path +config.db.path_helper=(for "sqlite3"only) +config.db.max_open_conns=Maximum open connections +config.db.max_idle_conns=Maximum idle connections + +config.security_config=Security configuration +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email configuration +config.email.enabled=Enabled +config.email.subject_prefix=Subject prefix +config.email.host=Host +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=Skip certificate verify +config.email.use_certificate=Use custom certificate +config.email.cert_file=Certificate file +config.email.key_file=Key file +config.email.use_plain_text=Use plain text +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=Send test email +config.email.test_mail_failed=Failed to send test email to '%s': %v +config.email.test_mail_sent=Test email has been sent to '%s'. + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -config.webhook_config=Web 鉤子配置 -config.queue_length=隊列長度 -config.deliver_timeout=推送超時 -config.skip_tls_verify=忽略 TLS 驗證 - -config.mailer_config=郵件配置 -config.mailer_enabled=啟用服務 -config.mailer_disable_helo=禁用 HELO 操作 -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=社交帳號配置 -config.oauth_enabled=啟用服務 +config.session_config=Session 配置 +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Cache 配置 -config.cache_adapter=Cache 適配器 -config.cache_interval=Cache 周期 -config.cache_conn=Cache 連接字符串 - -config.session_config=Session 配置 -config.session_provider=Session 提供者 -config.provider_config=提供者配置 -config.cookie_name=Cookie 名稱 -config.enable_set_cookie=啟用設置 Cookie -config.gc_interval_time=垃圾收集周期 -config.session_life_time=Session 生命周期 -config.https_only=僅限 HTTPS -config.cookie_life_time=Cookie 生命周期 +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP configuration +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=圖片配置 -config.picture_service=圖片服務 -config.disable_gravatar=禁用 Gravatar 頭像 -config.enable_federated_avatar=Enable Federated Avatars - -config.git_config=Git Configuration -config.git_disable_diff_highlight=Disable Diff Syntax Highlight -config.git_max_diff_lines=Max Diff Lines (for a single file) -config.git_max_diff_line_characters=Max Diff Characters (for a single line) -config.git_max_diff_files=Max Diff Files (to be shown) -config.git_gc_args=GC Arguments -config.git_migrate_timeout=Migration Timeout -config.git_mirror_timeout=Mirror Update Timeout -config.git_clone_timeout=Clone Operation Timeout -config.git_pull_timeout=Pull Operation Timeout -config.git_gc_timeout=GC Operation Timeout +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Web 鉤子配置 +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Git configuration +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path config.log_config=日誌配置 -config.log_mode=日誌模式 +config.log_file_root_path=日志文件根目錄 +config.log_mode=Mode +config.log_options=Options monitor.cron=Cron 任務 monitor.name=任務名稱 @@ -1159,17 +1385,24 @@ notices.delete_success=系統提示刪除成功! create_repo=創建了儲存庫 %s rename_repo=重新命名倉庫 %[1]s%[3]s commit_repo=推送了 %[3]s 分支的代碼到 %[4]s +compare_commits=查看 %d 次提交的內容比對 +transfer_repo=將儲存庫 %s 轉移至 %s create_issue=`創建了問題 %s#%[2]s` close_issue=`closed issue %s#%[2]s` reopen_issue=`reopened issue %s#%[2]s` +comment_issue=`評論了問題 %s#%[2]s` create_pull_request=`創建了合併請求 %s#%[2]s` close_pull_request=`closed pull request %s#%[2]s` reopen_pull_request=`reopened pull request %s#%[2]s` -comment_issue=`評論了問題 %s#%[2]s` merge_pull_request=`合併了合併請求 %s#%[2]s` -transfer_repo=將儲存庫 %s 轉移至 %s +create_branch=created new branch %[3]s at %[4]s +delete_branch=deleted branch %[2]s at %[3]s push_tag=推送了標籤 %[2]s%[3]s -compare_commits=查看 %d 次提交的內容比對 +delete_tag=deleted tag %[2]s at %[3]s +fork_repo=forked a repository to %s +mirror_sync_push=synced commits to %[3]s at %[4]s from mirror +mirror_sync_create=synced new reference %[2]s to %[3]s from mirror +mirror_sync_delete=synced and deleted reference %[2]s at %[3]s from mirror [tool] ago=之前 @@ -1191,6 +1424,7 @@ months=%d 月%s years=%d 年%s raw_seconds=秒 raw_minutes=分鐘 +raw_hours=hours [dropzone] default_message=拖曳文件到此處或單擊上傳 diff --git a/conf/locale/locale_zh-TW.ini b/conf/locale/locale_zh-TW.ini index f8e2a19c1d9..04d661a360f 100644 --- a/conf/locale/locale_zh-TW.ini +++ b/conf/locale/locale_zh-TW.ini @@ -1,7 +1,7 @@ -app_desc=基於 Go 語言的自助 Git 服務 +app_desc=一款極易搭建的自助 Git 服務 home=首頁 -dashboard=控制面版 +dashboard=控制面板 explore=探索 help=說明 sign_in=登入 @@ -9,7 +9,6 @@ sign_out=登出 sign_up=註冊 register=註冊 website=網站 -version=版本 page=頁面 template=樣板 language=語言 @@ -35,7 +34,7 @@ manage_org=管理組織 admin_panel=管理面板 account_settings=帳號設定 settings=設定 -your_profile=個人資料 +your_profile=個人資訊 your_settings=用戶設定 activities=活動 @@ -44,23 +43,27 @@ issues=問題 cancel=取消 +[status] +page_not_found=找不到頁面 +internal_server_error=內部伺服器錯誤 + [install] install=安裝頁面 title=首次安裝步驟 docker_helper=如果您正在使用 Docker 容器運行 Gogs,請務必先仔細閱讀 官方文檔 後再對本頁面進行填寫。 -requite_db_desc=Gogs 要求安裝 MySQL、PostgreSQL、SQLite3 或 TiDB。 -db_title=數據庫設置 +requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3 or TiDB (via MySQL protocol). +db_title=資料庫設定 db_type=資料庫類型 host=主機 user=帳號 password=密碼 db_name=資料庫名稱 +db_schema=Schema 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 數據庫名稱不允許包含字符 "." 或 "-" 。 +path=路徑 +sqlite_helper=SQLite3 資料庫的檔案路徑。
請務必在啟動服務時使用絕對路徑。 +err_empty_db_path=SQLite3 資料庫路徑不可以為空。 no_admin_and_disable_registration=您不能夠在未創建管理員用戶的情況下禁止註冊。 err_empty_admin_password=管理員密碼不能為空。 @@ -75,12 +78,17 @@ domain=域名 domain_helper=該設置影響 SSH 複製地址。 ssh_port=SSH 埠 ssh_port_helper=您的 SSH 服務正在使用此埠號,若要禁用SSH 功能請保持欄位空白。 +use_builtin_ssh_server=使用內建的 SSH 伺服器 +use_builtin_ssh_server_popup=啟用內建的 SSH 伺服器作為 Git 操作,使其與系統的 SSH 守護行程隔離 。 http_port=HTTP 端口號 http_port_helper=應用監聽的端口號 app_url=應用程式網址 app_url_helper=該設置影響 HTTP/HTTPS 複製地址和一些郵箱中的連結。 log_root_path=日誌路徑 log_root_path_helper=寫入日誌檔目錄 +enable_console_mode=開啟主控台模式 +enable_console_mode_popup=除了使用檔案模式之外, 還要將日誌列印到控制台。 +default_branch=Default Branch optional_title=可選設置 email_title=電子郵件服務設定 @@ -96,15 +104,15 @@ offline_mode=啓用離線模式 offline_mode_popup=在部署模式下也禁用從 CDN 獲取文件,所有的資源將從本地伺服器獲取。 disable_gravatar=禁用 Gravatar 服務 disable_gravatar_popup=禁用 Gravatar 和自定義源,僅使用由用戶上傳或默認的頭像。 -federated_avatar_lookup=Enable Federated Avatars Lookup -federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +federated_avatar_lookup=開啟聯合頭像查詢 +federated_avatar_lookup_popup=開啟聯合頭像查詢並使用基於開放源碼的 libravatar 服務 disable_registration=禁止用戶自主註冊 -disable_registration_popup=禁止用戶自主註冊功能,只有管理員可以添加帳號。 +disable_registration_popup=禁止用戶註冊功能,只有管理員可以添加帳號。 enable_captcha=啟用驗證碼服務 enable_captcha_popup=要求在用戶註冊時輸入驗證碼 require_sign_in_view=啓用登錄訪問限制 require_sign_in_view_popup=只有已登錄的用戶才能夠訪問頁面,否則將只能看到登錄或註冊頁面。 -admin_setting_desc=創建管理員帳號並不是必須的,因為 ID=1 的用戶將自動獲得管理員權限。 +admin_setting_desc=建立管理員帳號並不是必須的,因為 ID=1 的使用者將自動獲得管理員權限。 admin_title=管理員帳號設置 admin_name=管理員用戶名 admin_password=管理員密碼 @@ -113,10 +121,13 @@ admin_email=管理員郵箱 install_gogs=立即安裝 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 +smtp_host_missing_port=SMTP 主機缺少位址中的埠。 +invalid_smtp_from=SMTP 寄件者欄位無效﹔%v +save_config_failed=設定儲存失敗:%v +init_failed=軟體初始化失敗:%v invalid_admin_setting=管理員帳戶設置不正確:%v install_success=您好!我們很高興您選擇使用 Gogs,祝您使用愉快,代碼從此無 BUG! invalid_log_root_path=日誌根目錄無效: %v @@ -137,6 +148,7 @@ issues.in_your_repos=屬於該用戶倉庫的 [explore] repos=探索倉庫 users=用戶 +organizations=組織 search=搜索 [auth] @@ -145,6 +157,8 @@ register_hepler_msg=已經註冊?立即登錄! social_register_hepler_msg=已經註冊?立即綁定! disable_register_prompt=對不起,註冊功能已被關閉。請聯系網站管理員。 disable_register_mail=對不起,註冊郵箱確認功能已被關閉。 +auth_source=認證來源 +local=本地 remember_me=記住登錄 forgot_password=忘記密碼 forget_password=忘記密碼? @@ -152,11 +166,10 @@ sign_up_now=還沒帳戶?馬上註冊。 confirmation_mail_sent_prompt=一封新的確認郵件已經被發送至 %s,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。 active_your_account=激活您的帳戶 prohibit_login=禁止登錄 -prohibit_login_desc=Your account is prohibited to login, please contact site admin. +prohibit_login_desc=您的帳戶被停用,請聯繫網站管理員。 resent_limit_prompt=對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試! has_unconfirmed_mail=%s 您好,您有一封發送至( %s) 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。 resend_mail=單擊此處重新發送確認郵件 -email_not_associate=您輸入的郵箱地址未被關聯到任何帳號! send_reset_mail=單擊此處(重新)發送您的密碼重置郵件 reset_password=重置密碼 invalid_code=對不起,您的確認代碼已過期或已失效。 @@ -164,6 +177,14 @@ reset_password_helper=單擊此處重置密碼 password_too_short=密碼長度不能少於 6 位! non_local_account=非本地帳戶無法通過 Gogs 修改密碼。 +login_two_factor=兩步驗證 +login_two_factor_passcode=驗證碼 +login_two_factor_enter_recovery_code=鍵入兩部驗證碼 +login_two_factor_recovery=兩步恢復 +login_two_factor_recovery_code=恢復代碼 +login_two_factor_enter_passcode=鍵入兩步驗證碼 +login_two_factor_invalid_recovery_code=恢復代碼已使用或無效。 + [mail] activate_account=請激活您的帳戶 activate_email=請驗證您的郵箱地址 @@ -182,7 +203,7 @@ RepoName=儲存庫名稱 Email=郵箱地址 Password=密碼 Retype=確認密碼 -SSHTitle=SSH 密鑰名稱 +SSHTitle=SSH 公鑰名稱 HttpsUrl=HTTPS URL 地址 PayloadUrl=推送地址 TeamName=團隊名稱 @@ -190,15 +211,16 @@ AuthName=認證名稱 AdminEmail=管理員郵箱 NewBranchName=新的分支名稱 -CommitSummary=Commit summary +CommitSummary=提交摘要 CommitMessage=提交訊息 -CommitChoice=Commit choice +CommitChoice=提交選擇 TreeName=檔案路徑 Content=內容 require_error=不能為空。 alpha_dash_error=必須為英文字母、阿拉伯數字或橫線(-_)。 alpha_dash_dot_error=必須為英文字母、阿拉伯數字、橫線(-_)或點。 +alpha_dash_dot_slash_error=` 必須是合法的英文字母、數字、分隔符號(-_)、半形句點或斜線。` size_error=長度必須為 %s。 min_size_error=長度最小為 %s 個字符。 max_size_error=長度最大為 %s 個字符。 @@ -215,6 +237,7 @@ org_name_been_taken=組織名稱已經被佔用。 team_name_been_taken=團隊名稱已經被佔用。 email_been_used=郵箱地址已經被使用。 username_password_incorrect=用戶名或密碼不正確。 +auth_source_mismatch=此用戶未與所用的認證來源相關聯 enterred_invalid_repo_name=請檢查您輸入的倉庫名稱是正確。 enterred_invalid_owner_name=請檢查您輸入的新所有者用戶名是否正確。 enterred_invalid_password=請檢查您輸入的密碼是否正確。 @@ -236,25 +259,24 @@ change_avatar=更改頭像 join_on=加入於 repositories=倉庫列表 activity=公開活動 -followers=關註者 +followers=關注者 starred=已讚好 -following=關註中 +following=關注中 follow=關注 unfollow=取消關注 -form.name_reserved=用戶名 '%s' 是被保留的。 -form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。 +form.name_not_allowed=用戶名不允許 %q 的格式。 [settings] -profile=個人信息 +profile=個人資訊 password=修改密碼 -avatar=Avatar +avatar=頭像 ssh_keys=管理 SSH 密鑰 -social=社交帳號綁定 -applications=管理授權應用 +security=安全 +repos=倉庫 orgs=管理組織 +applications=管理授權應用 delete=刪除帳戶 -uid=用戶 ID public_profile=公開信息 profile_desc=您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。 @@ -263,14 +285,14 @@ full_name=自定義名稱 website=個人網站 location=所在地區 update_profile=更新信息 -update_profile_success=您的個人信息更新成功! +update_profile_success=您的個人資訊更新成功! change_username=用戶名將被修改 change_username_prompt=該操作將會影響到所有與您帳戶有關的鏈接 continue=繼續操作 cancel=取消操作 -lookup_avatar_by_mail=Lookup Avatar by mail -federated_avatar_lookup=Federated Avatar Lookup +lookup_avatar_by_mail=通過信箱查找頭像 +federated_avatar_lookup=Federated Avatar 查詢 enable_custom_avatar=啟動自定義頭像 choose_new_avatar=選擇新的頭像 update_avatar=更新頭像設置 @@ -295,6 +317,7 @@ delete_email=刪除 email_deletion=刪除郵箱 email_deletion_desc=刪除該郵箱地址將會移除所有相關的信息。是否繼續? email_deletion_success=成功刪除郵箱! +email_deletion_primary=Cannot delete primary email address. add_new_email=添加新的電子郵件地址 add_email=添加電子郵件 add_email_confirmation_sent=一封待確認的電子郵件已發送到 '%s',請在%d 小時內檢查您的收件箱,並完成確認過程。 @@ -304,7 +327,7 @@ manage_ssh_keys=管理 SSH 密鑰 add_key=增加密鑰 ssh_desc=以下是與您帳戶所關聯的 SSH 密鑰,如果您發現有陌生的密鑰,請立即刪除它! ssh_helper=需要幫助嗎? 請查看有關 如何生成 SSH 密鑰 的指南或 SSH 的常見問題 的疑難排解。 -add_new_key=增加 SSH 密鑰 +add_new_key=增加 SSH 公鑰 ssh_key_been_used=公共密鑰已經被使用 ssh_key_name_used=使用相同名稱的公共密鑰已經存在! key_name=密鑰名稱 @@ -318,24 +341,56 @@ add_on=增加於 last_used=上次使用在 no_activity=沒有最近活動 key_state_desc=該密鑰在 7 天內被使用過 -token_state_desc=此token在過去七天內曾經被使用過 - -manage_social=管理關聯社交帳戶 -social_desc=以下是與您帳戶所關聯的社交帳號,如果您發現有陌生的關聯,請立即解除綁定! -unbind=解除綁定 -unbind_success=社交帳號解除綁定成功! +token_state_desc=此令牌在過去七天內曾經被使用過 + +two_factor=兩步驗證 +two_factor_status=狀態: +two_factor_on=開啟 +two_factor_off=關閉 +two_factor_enable=啟用 +two_factor_disable=禁用 +two_factor_view_recovery_codes=在安全的地方查看並保存 您的恢復代碼 。如果您失去對身份驗證應用程式的存取權限, 則可以將它們用作密碼。 +two_factor_http=在 HTTP/HTTPS 動作中,您不能使用純文字使用者名稱及密碼。請建立並使用個人存取令牌作為您的認證方式,範例:%[3]s。 +two_factor_enable_title=啟用兩步驗證 +two_factor_scan_qr=請使用您的身份驗證應用程式掃描圖像: +two_factor_or_enter_secret=或輸入密碼: %s +two_factor_then_enter_passcode=然後輸入驗證碼: +two_factor_verify=驗證 +two_factor_invalid_passcode=您輸入的密碼無效,請再試一次。 +two_factor_reused_passcode=您输入的验证码已经被使用过了,请换一个重试! +two_factor_enable_error=啟用兩步驗證失敗: %v +two_factor_enable_success=您帳戶的兩步驗證已成功啟用! +two_factor_recovery_codes_title=兩步驗證恢復代碼 +two_factor_recovery_codes_desc=當您無法存取您的認證應用程式時,可以使用救援代碼。每個救援代碼只能使用一次,因此 請在安全的地方妥善保存您的救援代碼。 +two_factor_regenerate_recovery_codes=重新生成恢復代碼 +two_factor_regenerate_recovery_codes_error=重新生成恢復代碼失敗: %v +two_factor_regenerate_recovery_codes_success=已成功生成新的恢復代碼! +two_factor_disable_title=停用兩步驗證 +two_factor_disable_desc=停用兩步驗證後,您的帳戶安全級別將降低。是否繼續? +two_factor_disable_success=您帳戶的兩步驗證已成功停用! manage_access_token=管理個人操作令牌 generate_new_token=生成新的令牌 -tokens_desc=您所產生的token將被用來存取Gogs APIs +tokens_desc=您產生的令牌可以用來存取 Gogs API。 +access_token_tips=The personal access token may be used as either username or password. It is recommended to use the "x-access-token" as the username and the personal access token as the password for Git applications. new_token_desc=目前為止,任何令牌都對您的帳戶擁有完整的操作權限。 token_name=令牌名稱 generate_token=生成令牌 generate_token_succees=新的操作令牌生成成功!您必須立即複製到一個安全的地方,因為該令牌只會顯示一次! -delete_token=删除令牌 -access_token_deletion=刪除個人的連接token +delete_token=刪除令牌 +access_token_deletion=刪除個人存取令牌 access_token_deletion_desc=刪除此連接token將會刪除與相關應用程式的連結。您想要繼續嗎? delete_token_success=您的連接token已成功刪除。請記得更新您的應用程式。 +token_name_exists=有同樣名稱的令牌已經存在。 + +orgs.none=您現在還不是任何組織的成員。 +orgs.leave_title=離開組織 +orgs.leave_desc=離開組織後,所有與組織相關的倉庫和團隊權限將被取消。是否繼續? + +repos.leave=離開 +repos.leave_title=離開存儲庫 +repos.leave_desc=在你離開後,您將無法進入到存儲庫。你想要繼續嗎? +repos.leave_success=您已經成功退出「%s」版本庫! delete_account=刪除當前帳戶 delete_prompt=刪除操作會永久清除您的帳戶信息,並且 不可恢復! @@ -348,7 +403,9 @@ owner=擁有者 repo_name=倉庫名稱 repo_name_helper=偉大的倉庫名稱一般都較短、令人深刻並且 獨一無二 的。 visibility=可見度 +unlisted=Unlisted visiblity_helper=該倉庫為 私有的 +unlisted_helper=This repository is Unlisted visiblity_helper_forced=網站管理員已強制要求所有新建倉庫必須為 私有的 visiblity_fork_helper=(修改該值將會影響到所有派生倉庫) clone_helper=不知道如何操作?訪問 帮助説明 ! @@ -357,7 +414,7 @@ fork_from=派生自 fork_visiblity_helper=派生倉庫無法修改可見性。 repo_desc=倉庫描述 repo_lang=倉庫語言 -repo_gitignore_helper=Select .gitignore templates +repo_gitignore_helper=選擇 .gitignore 主題 license=授權許可 license_helper=請選擇授權許可文件 readme=Readme @@ -370,34 +427,36 @@ mirror_prune_desc=當遠程追蹤的引用被刪除時本地也會同步刪除 mirror_interval=鏡像同步周期(小時) mirror_address=鏡像地址 mirror_address_desc=請在位址中包括必要的使用者憑據。 -mirror_last_synced=Last Synced +mirror_last_synced=上次同步 watchers=關注者 stargazers=稱讚者 forks=派生倉庫 +repo_description_helper=儲存庫的說明文字。最長 512 個字元。 +repo_description_length=可用字元 form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。 -form.name_reserved=倉庫名稱 '%s' 是被保留的。 -form.name_pattern_not_allowed=倉庫名稱不允許 '%s' 的格式。 +form.name_not_allowed=Repository name or pattern %q is not allowed. need_auth=需要授權驗證 migrate_type=遷移類型 migrate_type_helper=該倉庫將是一個 鏡像 migrate_repo=遷移倉庫 migrate.clone_address=複製地址 -migrate.clone_address_desc=該地址可以是 HTTP/HTTPS/GIT URL 或本地服務器路徑。 +migrate.clone_address_desc=該地址可以是 HTTP/HTTPS/GIT 類型的 URL。 +migrate.clone_address_desc_import_local=您還可以用本地服務器路徑來遷移倉庫。 migrate.permission_denied=您並沒有導入本地倉庫的權限。 migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄! +migrate.clone_address_resolved_to_blocked_local_address=Clone address resolved to a local network address that is implicitly blocked. migrate.failed=遷移失敗:%v mirror_from=镜像来自 forked_from=派生自 -fork_from_self=無法派生已經擁有的倉庫! copy_link=複製連結 copy_link_success=複製成功! copy_link_error=請按下 ⌘-C 或 Ctrl-C 複製 copied=複製成功 unwatch=取消關注 -watch=關註 +watch=關注 unstar=取消讚好 star=讚好 fork=複刻 @@ -407,9 +466,9 @@ quick_guide=快速幫助 clone_this_repo=複製當前倉庫 create_new_repo_command=從命令行創建一個新的倉庫 push_exist_repo=從命令行推送已經創建的倉庫 -repo_is_empty=這倉庫不包含任何內容,請稍後再訪問! +bare_message=此版本庫空空如也。 -code=代碼 +files=檔案 branch=分支 tree=目錄樹 filter_branch_and_tag=過濾分支或標籤 @@ -420,51 +479,65 @@ pulls=合併請求 labels=標籤 milestones=里程碑 commits=提交歷史 +git_branches=分支列表 releases=版本發佈 file_raw=原始文件 file_history=文件歷史 file_view_raw=查看原始文件 file_permalink=永久連結 -file_too_large=This file is too large to be shown +file_too_large=檔案太大,無法顯示 +video_not_supported_in_browser=您的瀏覽器不支援 HTML5 影片播放標籤。 + +branches.overview=概覽 +branches.active_branches=活躍分支 +branches.stale_branches=陳舊分支 +branches.all=所有分支 +branches.updated_by=%[2]s 更新了 %[1]s +branches.change_default_branch=變更預設分支 +branches.default_deletion_not_allowed=Cannot delete the default branch. +branches.protected_deletion_not_allowed=Cannot delete a protected branch. editor.new_file=開新檔案 editor.upload_file=上傳檔案 editor.edit_file=編輯文件 -editor.preview_changes=Preview Changes +editor.preview_changes=預覽更改 editor.cannot_edit_non_text_files=不能編輯非文字檔 editor.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 +editor.must_be_on_a_branch=你必須在一個分支或提出對此檔的更改 +editor.fork_before_edit=你必須在編輯檔案之前備份此檔案 editor.delete_this_file=刪除此文件 -editor.must_have_write_access=You must have write access to make or propose changes to this file -editor.file_delete_success=File '%s' has been deleted successfully! -editor.name_your_file=Name your file... -editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. +editor.must_have_write_access=您必須具有寫存取權限,或提出對此檔案的更改 +editor.file_delete_success=已成功刪除 '%s' ! +editor.name_your_file=命名您的檔... +editor.filename_help=輸入名稱後按下 / 鍵即可新增資料夾,或將滑鼠移至輸入格最左側按下Backspace移除資料夾。 editor.or=或 editor.cancel_lower=取消 -editor.commit_changes=Commit Changes -editor.add_tmpl=Add '%s/' +editor.commit_changes=提交更改嗎? +editor.add_tmpl=添加%s/' editor.add=新增 '%s' editor.update=更新 '%s' editor.delete=刪除 '%s' -editor.commit_message_desc=Add an optional extended description... -editor.commit_directly_to_this_branch=Commit directly to the %s branch. -editor.create_new_branch=Create a new branch for this commit and start a pull request. +editor.commit_message_desc=添加一個可選的擴展描述... +editor.commit_directly_to_this_branch=直接提交到 %s 分支。 +editor.create_new_branch=創建 新的分支 為此提交和開始合併請求。 editor.new_branch_name_desc=新的分支名稱... editor.cancel=取消 -editor.filename_cannot_be_empty=Filename cannot be empty. -editor.branch_already_exists=Branch '%s' already exists in this repository. -editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. -editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. -editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. -editor.file_changed_while_editing=File content has been changed since you started editing. Click here to see what have been changed or press commit again to overwrite those changes. -editor.file_already_exists=A file with name '%s' already exists in this repository. +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_already_exists=帶有名稱 '%s' 的檔已經存在在這個資料庫中。 editor.no_changes_to_show=沒有可以顯示的變更。 -editor.fail_to_update_file=Failed to update/create file '%s' with error: %v +editor.fail_to_update_file=上傳/創建檔案 '%s' 失敗, 錯誤訊息: %v +editor.fail_to_delete_file=無法刪除檔案「%s」,錯誤訊息:%v editor.add_subdir=新增子目錄... -editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v -editor.upload_files_to_dir=Upload files to '%s' +editor.unable_to_upload_files=上傳檔案失敗到 '%s', 錯誤訊息: %v +editor.upload_files_to_dir=上傳檔案到 '%s' +commits.commit_history=提交歷史 commits.commits=次代碼提交 commits.search=搜索提交歷史 commits.find=查找 @@ -490,11 +563,11 @@ issues.create=創建問題 issues.new_label=創建標籤 issues.new_label_placeholder=標籤名稱... issues.create_label=創建標籤 -issues.label_templates.title=Load a predefined set of labels -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.helper=Select a label set -issues.label_templates.use=Use this label set -issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v +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 issues.open_tab=%d 個開啓中 issues.close_tab=%d 個已關閉 issues.filter_label=標籤篩選 @@ -522,7 +595,7 @@ issues.next=下一頁 issues.open_title=開啟中 issues.closed_title=已關閉 issues.num_comments=%d 條評論 -issues.commented_at=`commented %s` +issues.commented_at=` 評論 %s'` issues.delete_comment_confirm=您確定要刪除該條評論嗎? issues.no_content=尚未有任何內容 issues.close_issue=關閉 @@ -536,7 +609,7 @@ issues.commit_ref_at=`在代碼提交 %[2]s 中 issues.poster=發佈者 issues.collaborator=協同者 issues.owner=所有者 -issues.sign_in_require_desc=Sign in to join this conversation. +issues.sign_in_require_desc= 登入 才能加入這對話。 issues.edit=編輯 issues.cancel=取消 issues.save=保存 @@ -562,6 +635,7 @@ pulls.compare_compare=對比文件變化 pulls.filter_branch=過濾分支 pulls.no_results=未找到結果 pulls.nothing_to_compare=基準和對比分支代碼已經同步,無需進行對比。 +pulls.nothing_merge_base=因為兩個分支有完全不同的提交紀錄,因此無法比較。 pulls.has_pull_request=`已經存在目標分支的合併請求:%[2]s#%[3]d` pulls.create=創建合併請求 pulls.title_desc=請求將 %[1]d 次代碼提交從 %[2]s 合併至 %[3]s @@ -577,8 +651,13 @@ pulls.is_checking=該合併請求正在進行衝突檢查,請稍後再刷新 pulls.can_auto_merge_desc=這個拉請求可以自動合併。 pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請求。 pulls.cannot_auto_merge_helper=請手動合併來解決衝突。 +pulls.create_merge_commit=創建一個合併提交 +pulls.rebase_before_merging=合併前先 Rebase +pulls.commit_description=提交記錄說明 pulls.merge_pull_request=合併請求 pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d),您無法執行重新開啟操作。` +pulls.delete_branch=刪除分支 +pulls.delete_branch_has_new_commits=該分支在合併完成後又推送了新的提交,無法執行刪除。 milestones.new=新的里程碑 milestones.open_tab=%d 開啟中 @@ -629,31 +708,61 @@ settings.collaboration.admin=管理權限 settings.collaboration.write=可寫權限 settings.collaboration.read=可讀權限 settings.collaboration.undefined=未定義 +settings.branches=分支列表 +settings.branches_bare=您無法管理空版本庫。請先推送一些內容至版本庫。 +settings.default_branch=預設分支 +settings.default_branch_desc=預設分支是程式碼 commit、pull requests 及線上編輯的基準分支。 +settings.update=更新 +settings.update_default_branch_unsupported=伺服器的 Git 版本不支援變更預設分支。 +settings.update_default_branch_success=這個 repository 的預設分支更新成功! +settings.protected_branches=保護分支 +settings.protected_branches_desc=保護分支不被強制 Push、意外刪除以及限制 Commit 者白名單 +settings.choose_a_branch=選擇一個分支 +settings.branch_protection=分支保護 +settings.branch_protection_desc=請選擇分支 %s 的保護選項。 +settings.protect_this_branch=保護這個分支 +settings.protect_this_branch_desc=停用強制Push及分支刪除。 +settings.protect_require_pull_request=請使用 pull request 來更新(合併)程式碼。 +settings.protect_require_pull_request_desc=啟用這個選項之後,程式碼將無法直接 Push 到這個分支,所有 Commit 必須先 Push 到另一個非保護的分支,再透過 Pull Request 來要求合併。 +settings.protect_whitelist_committers=限制誰可以 Push 到這個分支 +settings.protect_whitelist_committers_desc=新增成員或團隊到允許直接 push 到這個分支的白名單。白名單中的使用者將會略過 pull request 的檢查。 +settings.protect_whitelist_users=限制那些使用者可以 push 到這個分支 +settings.protect_whitelist_search_users=搜尋用戶 +settings.protect_whitelist_teams=團隊的成員可以 push 到這個分支 +settings.protect_whitelist_search_teams=搜尋團隊 +settings.update_protect_branch_success=此分支設置保護已更新成功! settings.hooks=管理 Web 鉤子 settings.githooks=管理 Git 鉤子 settings.basic_settings=基本設置 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.sync_mirror=立即同步 +settings.mirror_sync_in_progress=鏡像同步正在進行中,請大約一分鐘後刷新頁面。 settings.site=官方網站 settings.update_settings=更新倉庫設置 settings.change_reponame_prompt=該操作將會影響到所有與該倉庫有關的鏈接 settings.advanced_settings=高級設置 settings.wiki_desc=啓用 Wiki 系統 -settings.use_internal_wiki=Use builtin wiki +settings.use_internal_wiki=使用內建 wiki +settings.allow_public_wiki_desc=當版本庫為私有狀態時,允許 Wiki 的公開存取。 settings.use_external_wiki=使用外部 wiki settings.external_wiki_url=外部 Wiki 連結 settings.external_wiki_url_desc=當分頁上按一下,訪客將會重新導到 URL。 -settings.issues_desc=Enable issue tracker -settings.use_internal_issue_tracker=Use builtin lightweight issue tracker +settings.issues_desc=啟用問題追蹤 +settings.use_internal_issue_tracker=使用內建輕量級問題追蹤 +settings.allow_public_issues_desc=當版本庫為私有狀態時,允許議題的公開存取。 settings.use_external_issue_tracker=使用外部的問題管理系統 +settings.external_tracker_url=外部Issue Tracker網址 +settings.external_tracker_url_desc=當訪客在分頁上按一下,他們將會重新導向到 URL。 settings.tracker_url_format=外部問題管理系統的 URL 格式 settings.tracker_issue_style=外部公單管理系統命名風格: -settings.tracker_issue_style.numeric=Numeric -settings.tracker_issue_style.alphanumeric=Alphanumeric +settings.tracker_issue_style.numeric=數字 +settings.tracker_issue_style.alphanumeric=字母及數字 settings.tracker_url_format_desc=您可以使用 {user} {repo} {index} 分別作為用戶名、倉庫名和問題索引的占位符。 -settings.pulls_desc=啟用合併請求以接受社區貢獻 +settings.pulls_desc=啟用「合併請求」功能,接受版本庫與分支之間的貢獻 +settings.pulls.ignore_whitespace=忽略空白符號的更改 +settings.pulls.allow_rebase_merge=允許使用 rebase 合併提交 settings.danger_zone=危險操作區 +settings.cannot_fork_to_same_owner=你不可以 fork 一個 repository 到它的擁有者。 settings.new_owner_has_same_repo=新的倉庫擁有者已經存在同名倉庫! settings.convert=轉換為正規倉庫 settings.convert_desc=您可以將此鏡像轉成正規倉庫。此動做不可逆。 @@ -672,7 +781,7 @@ settings.wiki_deletion_success=儲存庫 wiki 資料已成功清除。 settings.delete=刪除本倉庫 settings.delete_desc=刪除倉庫操作不可逆轉,請三思而後行。 settings.delete_notices_1=- 此操作 不可以 被回滾。 -settings.delete_notices_2=- 此操作將永久刪除該倉庫,包括 Git 數據、 問題、 評論和協作者的操作權限。 +settings.delete_notices_2=- 此動作將永久移除版本庫,包含了 Git 資料、議題、留言與協作者的存取權限。 settings.delete_notices_fork_1=- 刪除後所有的派生倉庫將會成為獨立倉庫 settings.deletion_success=倉庫刪除成功! settings.update_settings_success=倉庫設置更新成功! @@ -688,20 +797,25 @@ settings.collaborator_deletion_desc=刪除後此使用者將不再有協同者 settings.remove_collaborator_success=被操作的協作者已經被收回權限! settings.search_user_placeholder=搜索用戶... settings.org_not_allowed_to_be_collaborator=組織不允許被加為協同者。 -settings.user_is_org_member=被操作的用戶是組織成員,因此無法添加為協作者! -settings.add_webhook=添加 Web 鉤子 settings.hooks_desc=Web 鉤子允許您設定在 Gogs 上發生指定事件時對指定 URL 發送 POST 通知。查看 Webhooks 文檔 獲取更多信息。 +settings.webhooks.add_new=Add a new webhook: +settings.webhooks.choose_a_type=Choose a type... +settings.add_webhook=添加 Web 鉤子 settings.webhook_deletion=刪除 Web 鉤子 settings.webhook_deletion_desc=刪除該 Web 鉤子將會刪除與其有關的信息和推送歷史。是否繼續? settings.webhook_deletion_success=Web 鉤子刪除成功! settings.webhook.test_delivery=測試推送 settings.webhook.test_delivery_desc=生成並推送一個模擬的 Push 事件 settings.webhook.test_delivery_success=測試推送已經加入到隊列,請耐心等待數秒再刷新推送記錄。 +settings.webhook.redelivery=重新傳送 +settings.webhook.redelivery_success=任務「%s」已經重新加入至隊列。可能需要幾秒鐘來更新歷史的隊列狀態 settings.webhook.request=請求內容 settings.webhook.response=響應內容 settings.webhook.headers=標題 settings.webhook.payload=推送內容 settings.webhook.body=響應內容 +settings.webhook.err_cannot_parse_payload_url=Cannot parse payload URL: %v +settings.webhook.url_resolved_to_blocked_local_address=Payload URL resolved to a local network address that is implicitly blocked. settings.githooks_desc=Git 鉤子是由 Git 本身提供的功能,以下為 Gogs 所支持的鉤子列表。 settings.githook_edit_desc=如果鉤子未啟動,則會顯示樣例文件中的內容。如果想要刪除某個鉤子,則提交空白文本即可。 settings.githook_name=鉤子名稱 @@ -711,6 +825,7 @@ settings.add_webhook_desc=我們會通過 POST 請求將訂閱事 settings.payload_url=推送地址 settings.content_type=數據格式 settings.secret=密鑰文本 +settings.secret_desc=密鑰將會以 SHA256 HMAC 的十六進位數字放進X-Gogs-Signature 標頭中送出。 settings.slack_username=服務名稱 settings.slack_icon_url=圖標 URL settings.slack_color=顏色代碼 @@ -720,10 +835,20 @@ settings.event_send_everything=推送 所有 事件 settings.event_choose=讓我選擇我的需要 settings.event_create=創建 settings.event_create_desc=創建分支或標籤 -settings.event_pull_request=合併請求 -settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. +settings.event_delete=刪除 +settings.event_delete_desc=分支或標籤已經被刪除 +settings.event_fork=Fork +settings.event_fork_desc=Repository 已經 fork settings.event_push=推送 settings.event_push_desc=Git 倉庫推送 +settings.event_issues=Issues +settings.event_issues_desc=已經開啟、關閉、重啟、修改、指派、取消指派、更新標籤、清除標籤、新增里程碑或刪除里程碑的 issue。 +settings.event_pull_request=合併請求 +settings.event_pull_request_desc=已經開啟、關閉、重啟、編輯、指派、解除指派、更新標籤、清除標籤、新增里程碑、刪除里程碑或同步的 pull request。 +settings.event_issue_comment=Issue 評論 +settings.event_issue_comment_desc=已經建立、編輯或刪除的 Issue 評論。 +settings.event_release=Release +settings.event_release_desc=Release 將發佈在一個 repository 中。 settings.active=是否激活 settings.active_helper=當指定事件發生時我們將會觸發此 Web 鉤子。 settings.add_hook_success=Web 鉤子添加成功! @@ -733,10 +858,13 @@ settings.delete_webhook=刪除 Web 鉤子 settings.recent_deliveries=最近推送記錄 settings.hook_type=鉤子類型 settings.add_slack_hook_desc=為您的倉庫增加 Slack 集成。 +settings.add_discord_hook_desc=Hook Discord 到你的 repository。 +settings.add_dingtalk_hook_desc=在您的版本庫增加 Dingtalk 整合 settings.slack_token=令牌 settings.slack_domain=域名 settings.slack_channel=頻道 settings.deploy_keys=管理部署密鑰 +settings.deploy_keys_helper=噢不! 如果要新增個人的公開金鑰,請到 用戶設定 新增。 settings.add_deploy_key=添加部署密鑰 settings.deploy_key_desc=部署密鑰僅具有隻讀權限,它在功能上和個人用戶的公開密鑰有本質區別。 settings.no_deploy_keys=您還沒有添加任何部署密鑰。 @@ -748,6 +876,8 @@ settings.add_key_success=新的部署密鑰 '%s' 添加成功! settings.deploy_key_deletion=刪除部署密鑰 settings.deploy_key_deletion_desc=刪除該部署密鑰會移除本倉庫所有相關的操作權限。是否繼續? settings.deploy_key_deletion_success=刪除部署密鑰成功! +settings.description_desc=儲存庫的說明文字。最長 512 個字元。 +settings.description_length=可用字元 diff.browse_source=瀏覽代碼 diff.parent=父節點 @@ -759,14 +889,13 @@ diff.show_unified_view=統一視圖 diff.stats_desc=共有 %d 個文件被更改,包括 %d 次插入%d 次删除 diff.bin=二進制 diff.view_file=查看文件 -diff.file_suppressed=File diff suppressed because it is too large +diff.file_suppressed=文件差異過大導致無法顯示 diff.too_many_files=部分文件因文件數量過多而無法顯示 release.releases=版本發佈 release.new_release=發佈新版本 release.draft=草稿 release.prerelease=預發佈版本 -release.stable=穩定 release.edit=編輯 release.ahead=在該版本發佈之後已有 %d 次代碼提交到 %s 分支 release.source_code=源代碼 @@ -791,7 +920,7 @@ release.deletion=刪除版本發布操作 release.deletion_desc=刪除該版本發布將會移除相應的 Git 標籤。是否繼續? release.deletion_success=版本發布刪除成功! release.tag_name_already_exist=已經存在使用相同標籤的發佈版本。 -release.tag_name_invalid=Tag name is not valid. +release.tag_name_invalid=標記名稱不是有效的。 release.downloads=下載附件 [org] @@ -813,8 +942,8 @@ team_name_helper=您可以使用該名稱來通知改組全體成員。 team_desc_helper=一句話描述這個團隊是做什麼的。 team_permission_desc=請選擇該團隊所具有的權限等級: -form.name_reserved=組織名稱 '%s' 是被保留的。 -form.name_pattern_not_allowed=組織名稱不允許 '%s' 的格式。 +form.name_not_allowed=Organization name or pattern %q is not allowed. +form.team_name_not_allowed=Team name or pattern %q is not allowed. settings=組織設置 settings.options=基本設置 @@ -886,12 +1015,19 @@ first_page=首頁 last_page=末頁 total=總計:%d +dashboard.build_info=建置資訊 +dashboard.app_ver=程式版本 +dashboard.git_version=Git 版本 +dashboard.go_version=Go 版本 +dashboard.build_time=建置時間 +dashboard.build_commit=Build commit dashboard.statistic=應用統計數據 dashboard.operations=管理員操作 dashboard.system_status=系統監視狀態 -dashboard.statistic_info=Gogs 數據庫統計:%d 位用戶,%d 個組織,%d 個公鑰,%d 個倉庫,%d 個倉庫關註,%d 個贊,%d 次行為,%d 條權限記錄,%d 個問題,%d 次評論,%d 個社交帳號,%d 個用戶關註,%d 個鏡像,%d 個版本發佈,%d 個登錄源,%d 個 Web 鉤子,%d 個里程碑,%d 個標籤,%d 個鉤子任務,%d 個團隊,%d 個更新任務,%d 個附件。 +dashboard.statistic_info=Gogs 資料庫統計:%d 位用戶,%d 個組織,%d 個公鑰,%d 個倉庫,%d 個倉庫關注,%d 個讚,%d 次行為,%d 條權限記錄,%d 個問題,%d 次評論,%d 個社交帳號,%d 個用戶關注,%d 個鏡像,%d 個版本發佈,%d 個登錄來源,%d 個 Web 鉤子,%d 個里程碑,%d 個標籤,%d 個鉤子任務,%d 個團隊,%d 個更新任務,%d 個附件。 dashboard.operation_name=操作名稱 dashboard.operation_switch=開關 +dashboard.select_operation_to_run=Please select operation to run dashboard.operation_run=執行 dashboard.clean_unbind_oauth=清理未綁定社交帳號 dashboard.clean_unbind_oauth_success=所有未綁定社交數據清除成功! @@ -905,8 +1041,8 @@ dashboard.git_gc_repos=對倉庫進行垃圾回收 dashboard.git_gc_repos_success=所有倉庫的垃圾回收已成功完成! dashboard.resync_all_sshkeys=重新生成 '.ssh/authorized_keys' 文件(警告:不是 Gogs 的密鑰也會被刪除) dashboard.resync_all_sshkeys_success=所有公鑰重新生成成功! -dashboard.resync_all_update_hooks=重新生成所有倉庫的 Update 鈎子(用於被修改的自定義配置文件) -dashboard.resync_all_update_hooks_success=已成功重新生成所有倉庫的 Update 鈎子! +dashboard.resync_all_hooks=重新同步所有 repository 的 pre-receive、update、post-receive hooks。 +dashboard.resync_all_hooks_success=所有 repository 的 pre-receive、update、post-receive hooks 皆已重新同步成功。 dashboard.reinit_missing_repos=重新初始化所有遺失 Git 檔案的儲存庫記錄 dashboard.reinit_missing_repos_success=所有遺失 Git 檔案的儲存庫已成功重新初始化。 @@ -959,7 +1095,7 @@ users.edit_account=編輯用戶信息 users.max_repo_creation=最大儲存庫新增限制 users.max_repo_creation_desc=(設定 -1 使用全域預設限制) users.is_activated=該用戶已被激活 -users.prohibit_login=This account is prohibited to login +users.prohibit_login=此帳戶禁止登錄 users.is_admin=該用戶具有管理員權限 users.allow_git_hook=該帳戶具有創建 Git 鉤子的權限 users.allow_import_local=該用戶具有導入本地倉庫的權限 @@ -978,15 +1114,17 @@ repos.repo_manage_panel=倉庫管理界面 repos.owner=所有者 repos.name=倉庫名稱 repos.private=私有庫 -repos.watches=關註數 +repos.watches=關注數 repos.stars=讚好數 repos.issues=問題數 +repos.size=大小 -auths.auth_manage_panel=認證管理面板 +auths.auth_sources=認證來源 auths.new=添加新認證源 auths.name=認證名稱 auths.type=認證類型 auths.enabled=已啟用 +auths.default=預設 auths.updated=最後更新時間 auths.auth_type=認證類型 auths.auth_name=認證名稱 @@ -995,15 +1133,21 @@ auths.domain=域名 auths.host=主機地址 auths.port=主機端口 auths.bind_dn=綁定DN +auths.bind_dn_helper=可以使用'%s'作為用戶名稱的預留位置,例如:DOM\%s auths.bind_password=綁定密碼 auths.bind_password_helper=警告:該密碼將會以明文的形式保存在數據庫中。請不要使用擁有高權限的帳戶! auths.user_base=用戶搜索基準 auths.user_dn=User DN auths.attribute_username=用戶名屬性 auths.attribute_username_placeholder=留空表示使用用戶登錄時所使用的用戶名 -auths.attribute_name=名子屬性 +auths.attribute_name=歸納名字 auths.attribute_surname=姓氏屬性 auths.attribute_mail=電子郵箱屬性 +auths.verify_group_membership=驗證組成員身份 +auths.group_search_base_dn=組蒐索基準 DN +auths.group_filter=組篩選器 +auths.group_attribute_contain_user_list=包含使用者列表的群組屬性 +auths.user_attribute_listed_in_group=組中列出的使用者屬性 auths.attributes_in_bind=從 Bind DN 中獲取屬性信息 auths.filter=使用者篩選器 auths.admin_filter=管理者篩選器 @@ -1017,9 +1161,9 @@ 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.default_auth=此認證方式為預設登入來源 auths.new_success=新的認證源 "%s" 添加成功! auths.update_success=認證設置更新成功! auths.update=更新認證設置 @@ -1028,107 +1172,189 @@ auths.delete_auth_title=刪除認證操作 auths.delete_auth_desc=該認證將被刪除。是否繼續? auths.still_in_used=一些使用者仍然使用此驗證方式,請先刪除或轉換這些使用者到其它登入類型。 auths.deletion_success=認證源刪除成功! +auths.login_source_exist=登錄源 '%s' 已存在。 +auths.github_api_endpoint=API 端點 +config.not_set=(未設定) config.server_config=服務器配置 -config.app_name=應用名稱 -config.app_ver=應用版本 -config.app_url=應用 URL -config.domain=應用域名 -config.offline_mode=離線模式 -config.disable_router_log=關閉路由日志 +config.brand_name=Brand name config.run_user=執行用戶 config.run_mode=執行模式 -config.repo_root_path=倉庫根目錄 -config.static_file_root_path=靜態文件根目錄 -config.log_file_root_path=日志文件根目錄 -config.script_type=腳本類型 -config.reverse_auth_user=反向代理認證 +config.server.external_url=External URL +config.server.domain=網域 +config.server.protocol=協定 +config.server.http_addr=HTTP address +config.server.http_port=HTTP 埠 +config.server.cert_file=憑證檔案 +config.server.key_file=Key file +config.server.tls_min_version=Minimum TLS version +config.server.unix_socket_permission=Unix socket permission +config.server.local_root_url=Local root URL +config.server.offline_mode=離線模式 +config.server.disable_router_log=Disable router log +config.server.enable_gzip=Enable Gzip +config.server.app_data_path=Application data path +config.server.load_assets_from_disk=Load assets from disk +config.server.landing_url=Landing URL config.ssh_config=SSH 配置 -config.ssh_enabled=已啟用 -config.ssh_start_builtin_server=啟動內建伺服器 -config.ssh_domain=域名 -config.ssh_port=埠 -config.ssh_listen_port=監聽埠 -config.ssh_root_path=根路徑 -config.ssh_key_test_path=金鑰測試路徑 -config.ssh_keygen_path=金鑰產生 (' ssh-keygen ') 路徑 -config.ssh_minimum_key_size_check=金鑰最小大小檢查 -config.ssh_minimum_key_sizes=金鑰最小大小 - -config.db_config=數據庫配置 -config.db_type=數據庫類型 -config.db_host=主機地址 -config.db_name=數據庫名稱 -config.db_user=數據庫用戶 -config.db_ssl_mode=SSL 模式 -config.db_ssl_mode_helper=(僅限 "postgres" 使用) -config.db_path=數據庫路徑 -config.db_path_helper=(用於 "sqlite3" 和 "tidb") - -config.service_config=服務配置 -config.register_email_confirm=註冊電子郵件確認 -config.disable_register=關閉註冊功能 -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.ssh.enabled=Enabled +config.ssh.domain=Exposed domain +config.ssh.port=Exposed port +config.ssh.root_path=根路徑 +config.ssh.keygen_path=Keygen path +config.ssh.key_test_path=Key test path +config.ssh.minimum_key_size_check=Minimum key size check +config.ssh.minimum_key_sizes=Minimum key sizes +config.ssh.rewrite_authorized_keys_at_start=Rewrite "authorized_keys" at start +config.ssh.start_builtin_server=Start builtin server +config.ssh.listen_host=Listen host +config.ssh.listen_port=Listen port +config.ssh.server_ciphers=Server ciphers +config.ssh.server_macs=Server MACs +config.ssh.server_algorithms=Server algorithms + +config.repo_config=Repository 設定 +config.repo.root_path=根路徑 +config.repo.script_type=Script type +config.repo.ansi_chatset=ANSI charset +config.repo.force_private=Force private +config.repo.max_creation_limit=Max creation limit +config.repo.preferred_licenses=Preferred licenses +config.repo.disable_http_git=Disable HTTP Git +config.repo.enable_local_path_migration=Enable local path migration +config.repo.enable_raw_file_render_mode=Enable raw file render mode +config.repo.commits_fetch_concurrency=Commits fetch concurrency +config.repo.editor.line_wrap_extensions=Editor line wrap extensions +config.repo.editor.previewable_file_modes=Editor previewable file modes +config.repo.upload.enabled=允許上傳 +config.repo.upload.temp_path=Upload temporary path +config.repo.upload.allowed_types=Upload allowed types +config.repo.upload.file_max_size=上傳檔案大小限制 +config.repo.upload.max_files=Upload files limit + +config.db_config=資料庫設定 +config.db.type=Type +config.db.host=Host +config.db.name=Name +config.db.schema=Schema +config.db.schema_helper=(for "postgres" only) +config.db.user=使用者 +config.db.ssl_mode=SSL 模式 +config.db.ssl_mode_helper=(僅限 "postgres" 使用) +config.db.path=路徑 +config.db.path_helper=(僅限 "sqlite3" 使用) +config.db.max_open_conns=最大開啟連接數 +config.db.max_idle_conns=最大閒置連線數 + +config.security_config=安全性設定 +config.security.login_remember_days=Login remember days +config.security.cookie_remember_name=Remember cookie +config.security.cookie_username=Username cookie +config.security.cookie_secure=Enable secure cookie +config.security.reverse_proxy_auth_user=Reverse proxy authentication header +config.security.enable_login_status_cookie=Enable login status cookie +config.security.login_status_cookie_name=Login status cookie +config.security.local_network_allowlist=Local network allowlist + +config.email_config=Email設定 +config.email.enabled=已啟用 +config.email.subject_prefix=Subject prefix +config.email.host=主機 +config.email.from=From +config.email.user=User +config.email.disable_helo=Disable HELO +config.email.helo_hostname=HELO hostname +config.email.skip_verify=略過憑證驗証 +config.email.use_certificate=使用自定憑證 +config.email.cert_file=憑證檔案 +config.email.key_file=金錀檔案 +config.email.use_plain_text=使用純文字 +config.email.add_plain_text_alt=Add plain text alternative +config.email.send_test_mail=發送測試電子郵件 +config.email.test_mail_failed=發送測試郵件至 '%s' 時失敗:%v +config.email.test_mail_sent=測試電子郵件已發送到 '%s'。 + +config.auth_config=Authentication configuration +config.auth_custom_logout_url=Custom logout URL +config.auth.activate_code_lives=Activate code lives +config.auth.reset_password_code_lives=Reset password code lives +config.auth.require_email_confirm=Require email confirmation +config.auth.require_sign_in_view=Require sign in view +config.auth.disable_registration=Disable registration +config.auth.enable_registration_captcha=Enable registration captcha +config.auth.enable_reverse_proxy_authentication=Enable reverse proxy authentication +config.auth.enable_reverse_proxy_auto_registration=Enable reverse proxy auto registration +config.auth.reverse_proxy_authentication_header=Reverse proxy authentication header + +config.user_config=User configuration +config.user.enable_email_notify=Enable email notification -config.webhook_config=Web 鉤子配置 -config.queue_length=隊列長度 -config.deliver_timeout=推送超時 -config.skip_tls_verify=忽略 TLS 驗證 - -config.mailer_config=郵件配置 -config.mailer_enabled=啟用服務 -config.mailer_disable_helo=禁用 HELO 操作 -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=社交帳號配置 -config.oauth_enabled=啟用服務 +config.session_config=Session 配置 +config.session.provider=Provider +config.session.provider_config=Provider config +config.session.cookie_name=Cookie +config.session.https_only=HTTPS only +config.session.gc_interval=GC interval +config.session.max_life_time=Max life time +config.session.csrf_cookie_name=CSRF cookie config.cache_config=Cache 配置 -config.cache_adapter=Cache 適配器 -config.cache_interval=Cache 周期 -config.cache_conn=Cache 連接字符串 - -config.session_config=Session 配置 -config.session_provider=Session 提供者 -config.provider_config=提供者配置 -config.cookie_name=Cookie 名稱 -config.enable_set_cookie=啟用設置 Cookie -config.gc_interval_time=垃圾收集周期 -config.session_life_time=Session 生命周期 -config.https_only=僅限 HTTPS -config.cookie_life_time=Cookie 生命周期 +config.cache.adapter=Adapter +config.cache.interval=GC interval +config.cache.host=Host + +config.http_config=HTTP設定 +config.http.access_control_allow_origin=Access control allow origin + +config.attachment_config=Attachment configuration +config.attachment.enabled=Enabled +config.attachment.path=Path +config.attachment.allowed_types=Allowed types +config.attachment.max_size=Size limit +config.attachment.max_files=Files limit + +config.release_config=Release configuration +config.release.attachment.enabled=Attachment enabled +config.release.attachment.allowed_types=Attachment allowed types +config.release.attachment.max_size=Attachment size limit +config.release.attachment.max_files=Attachment files limit config.picture_config=圖片配置 -config.picture_service=圖片服務 -config.disable_gravatar=禁用 Gravatar 頭像 -config.enable_federated_avatar=Enable Federated Avatars - -config.git_config=Git Configuration -config.git_disable_diff_highlight=Disable Diff Syntax Highlight -config.git_max_diff_lines=Max Diff Lines (for a single file) -config.git_max_diff_line_characters=Max Diff Characters (for a single line) -config.git_max_diff_files=Max Diff Files (to be shown) -config.git_gc_args=GC Arguments -config.git_migrate_timeout=Migration Timeout -config.git_mirror_timeout=Mirror Update Timeout -config.git_clone_timeout=Clone Operation Timeout -config.git_pull_timeout=Pull Operation Timeout -config.git_gc_timeout=GC Operation Timeout +config.picture.avatar_upload_path=User avatar upload path +config.picture.repo_avatar_upload_path=Repository avatar upload path +config.picture.gravatar_source=Gravatar source +config.picture.disable_gravatar=Disable Gravatar +config.picture.enable_federated_avatar=Enable federated avatars + +config.mirror_config=Mirror configuration +config.mirror.default_interval=Default interval + +config.webhook_config=Web 鉤子配置 +config.webhook.types=Types +config.webhook.deliver_timeout=Deliver timeout +config.webhook.skip_tls_verify=Skip TLS verify + +config.git_config=Git 配置 +config.git.disable_diff_highlight=Disable diff syntax highlight +config.git.max_diff_lines=Diff lines limit (for a single file) +config.git.max_diff_line_characters=Diff characters limit (for a single line) +config.git.max_diff_files=Diff files limit (for a single diff) +config.git.gc_args=GC arguments +config.git.migrate_timeout=Migration timeout +config.git.mirror_timeout=Mirror fetch timeout +config.git.clone_timeout=Clone timeout +config.git.pull_timeout=Pull timeout +config.git.gc_timeout=GC timeout + +config.lfs_config=LFS configuration +config.lfs.storage=Storage +config.lfs.objects_path=Objects path config.log_config=日誌配置 -config.log_mode=日誌模式 +config.log_file_root_path=日志文件根目錄 +config.log_mode=模式 +config.log_options=選項 monitor.cron=Cron 任務 monitor.name=任務名稱 @@ -1159,17 +1385,24 @@ notices.delete_success=系統提示刪除成功! create_repo=創建了儲存庫 %s rename_repo=重新命名倉庫 %[1]s%[3]s commit_repo=推送了 %[3]s 分支的代碼到 %[4]s +compare_commits=查看 %d 次提交的內容比對 +transfer_repo=將儲存庫 %s 轉移至 %s create_issue=`創建了問題 %s#%[2]s` close_issue=`已關閉問題 %s#%[2]s` reopen_issue=`已重新開啟問題 %s#%[2]s` +comment_issue=`評論了問題 %s#%[2]s` create_pull_request=`創建了合併請求 %s#%[2]s` close_pull_request=`已關閉合併請求 %s#%[2]s` reopen_pull_request=`已重新開啟合併請求 %s#%[2]s` -comment_issue=`評論了問題 %s#%[2]s` merge_pull_request=`合併了合併請求 %s#%[2]s` -transfer_repo=將儲存庫 %s 轉移至 %s +create_branch=在 %[4]s 建立新的分支 %[3]s +delete_branch=已經刪除在 %[3]s 上的分支 %[2]s push_tag=推送了標籤 %[2]s%[3]s -compare_commits=查看 %d 次提交的內容比對 +delete_tag=已經刪除在 %[3]s 上的標籤 %[2]s +fork_repo=已經 fork 一個 repository 到 %s +mirror_sync_push=已經從鏡像同步了提交 %[3]s%[4]s +mirror_sync_create=已經從鏡像同步了參考 %[2]s%[3]s +mirror_sync_delete=已經從鏡像同步並移除了參考 %[2]s%[3]s [tool] ago=之前 @@ -1191,6 +1424,7 @@ months=%d 月%s years=%d 年%s raw_seconds=秒 raw_minutes=分鐘 +raw_hours=hours [dropzone] default_message=拖曳文件到此處或單擊上傳 diff --git a/docker-next/README.md b/docker-next/README.md new file mode 100644 index 00000000000..afec2085857 --- /dev/null +++ b/docker-next/README.md @@ -0,0 +1,129 @@ +# Docker for Gogs (Next Generation) + +> [!NOTE] +> This is the next-generation, security-focused Docker image. This will become the default image distribution (`gogs/gogs:latest`) starting 0.16.0. + +![Docker pulls](https://img.shields.io/docker/pulls/gogs/gogs?logo=docker&style=for-the-badge) + +Visit [Docker Hub](https://hub.docker.com/u/gogs) or [GitHub Container registry](https://github.com/gogs/gogs/pkgs/container/gogs) to see all available images and tags. + +## Security-first design + +This Docker image is designed with Kubernetes security best practices in mind: + +- **Runs as non-root by default** - uses UID 1000 and GID 1000 +- **Minimal image** - only have essential packages installed +- **Direct execution** - no process supervisor, just runs `gogs web` +- **Supports restrictive security contexts** - ready for Kubernetes + +### Kubernetes Security Context example + +In the deployment YAML, make sure the following snippets exist: + +```yaml +spec: + template: + spec: + securityContext: + fsGroup: 1000 + fsGroupChangePolicy: OnRootMismatch + containers: + - name: gogs + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL +``` + +### Custom UID/GID at build time + +If you need a different UID/GID, build the image with custom arguments: + +```zsh +docker build -f Dockerfile.next --build-arg GOGS_UID=1001 --build-arg GOGS_GID=1001 -t my-gogs . +``` + +## Usage + +```zsh +$ docker pull gogs/gogs:next-latest + +# Create local directory for volume. +$ mkdir -p /var/gogs +$ chown 1000:1000 /var/gogs + +# Use `docker run` for the first time. +$ docker run --name=gogs -p 10022:2222 -p 10880:3000 -v /var/gogs:/data gogs/gogs:next-latest + +# Use `docker start` if you have stopped it. +$ docker start gogs +``` + +Files will be stored in local path `/var/gogs`. + +Directory `/var/gogs` keeps Git repositories and Gogs data: + +```zsh +/var/gogs +|-- git + |-- gogs-repositories +|-- gogs + |-- conf + |-- data + |-- log +|-- ssh +``` + +### Using Docker volumes + +```zsh +$ docker volume create --name gogs-data +$ docker run --name=gogs -p 10022:2222 -p 10880:3000 -v gogs-data:/data gogs/gogs:next-latest +``` + +## Settings + +### Application + +Most of the settings are obvious and easy to understand, but there are some settings can be confusing by running Gogs inside Docker: + +- **Repository Root Path**: either `/data/git/gogs-repositories` or `/home/git/gogs-repositories` works. +- **Run User**: default `git` (UID 1000) +- **Domain**: fill in with Docker container IP (e.g. `192.168.99.100`). But if you want to access your Gogs instance from a different physical machine, please fill in with the hostname or IP address of the Docker host machine. +- **SSH Port**: Use the exposed port from Docker container. For example, your SSH server listens on `2222` inside Docker, **but** you expose it by `10022:2222`, then use `10022` for this value. +- **HTTP Port**: Use port you want Gogs to listen on inside Docker container. For example, your Gogs listens on `3000` inside Docker, **and** you expose it by `10880:3000`, but you still use `3000` for this value. +- **Application URL**: Use combination of **Domain** and **exposed HTTP Port** values (e.g. `http://192.168.99.100:10880/`). + +Full documentation of application settings can be found in the [default `app.ini`](https://github.com/gogs/gogs/blob/main/conf/app.ini). + +### Git over SSH + +>[!IMPORTANT] +> Enable and disable of the builtin SSH server requires restart of the container to take effect. + +To enable Git over SSH access, the use of builtin SSH server is required as follows in your `app.ini`: + +```ini +[server] +START_SSH_SERVER = true +SSH_PORT = 10022 # The port shown in the clone URL +SSH_LISTEN_PORT = 2222 # The port that builtin server listens on +``` + +## Upgrade + +> [!CAUTION] +> Make sure you have volumed data to somewhere outside Docker container! + +Steps to upgrade Gogs with Docker: + +- `docker pull gogs/gogs:next-latest` +- `docker stop gogs` +- `docker rm gogs` +- Create a container for the first time and don't forget to do the same for the volume and port mapping. diff --git a/docker-next/start.sh b/docker-next/start.sh new file mode 100644 index 00000000000..6de0d2227ca --- /dev/null +++ b/docker-next/start.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -ex + +# Create data directories at runtime (needed when /data is a mounted volume) +mkdir -p /data/gogs /data/git + +# Execute the main command +exec "$@" diff --git a/docker/README.md b/docker/README.md index e6fa15dda3b..02a17fdd202 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,26 +1,37 @@ # Docker for Gogs -Visit [Docker Hub](https://hub.docker.com/r/gogs/) see all available images and tags. +> [!WARNING] +> This is now the legacy Docker image that lacks modern security best practices. It will be published as `gogs/gogs:legacy-latest` starting 0.16.0, and be completely removed no earlier than 0.17.0. +> +> To use the next-generation, security-focused Docker image, see [docker-next/README.md](../docker-next/README.md). + +> [!IMPORTANT] +> Image versions: +> - Every released version has its own tag , e.g., `gogs/gogs:0.13.4`, and a tag points to the latest patch of the minor version, e.g., `gogs/gogs:0.13`. +> - The `latest` tag is the image version built from the latest `main` branch. + +![Docker pulls](https://img.shields.io/docker/pulls/gogs/gogs?logo=docker&style=for-the-badge) + +Visit [Docker Hub](https://hub.docker.com/u/gogs) or [GitHub Container registry](https://github.com/gogs/gogs/pkgs/container/gogs) to see all available images and tags. ## Usage To keep your data out of Docker container, we do a volume (`/var/gogs` -> `/data`) here, and you can change it based on your situation. -``` -# Pull image from Docker Hub. +```sh $ docker pull gogs/gogs # Create local directory for volume. $ mkdir -p /var/gogs # Use `docker run` for the first time. -$ docker run --name=gogs -p 10022:22 -p 10080:3000 -v /var/gogs:/data gogs/gogs +$ docker run --name=gogs -p 10022:22 -p 10880:3000 -v /var/gogs:/data gogs/gogs # Use `docker start` if you have stopped it. $ docker start gogs ``` -Note: It is important to map the Gogs ssh service from the container to the host and set the appropriate SSH Port and URI settings when setting up Gogs for the first time. To access and clone Gogs Git repositories with the above configuration you would use: `git clone ssh://git@hostname:10022/username/myrepo.git` for example. +> [!NOTE] It is important to map the SSH service from the container to the host and set the appropriate SSH Port and URI settings when setting up Gogs for the first time. To access and clone Git repositories with the above configuration you would use: `git clone ssh://git@hostname:10022/username/myrepo.git` for example. Files will be store in local path `/var/gogs` in my case. @@ -36,46 +47,38 @@ Directory `/var/gogs` keeps Git repositories and Gogs data: |-- data |-- log -### Volume with data container +#### Custom directory -If you're more comfortable with mounting data to a data container, the commands you execute at the first time will look like as follows: +The "custom" directory may not be obvious in Docker environment. The `/var/gogs/gogs` (in the host) and `/data/gogs` (in the container) is already the "custom" directory and you do not need to create another layer but directly edit corresponding files under this directory. -``` -# Create data container -docker run --name=gogs-data --entrypoint /bin/true gogs/gogs - -# Use `docker run` for the first time. -docker run --name=gogs --volumes-from gogs-data -p 10022:22 -p 10080:3000 gogs/gogs -``` +#### Using Docker volumes -#### Using Docker 1.9 Volume command - -``` +```sh # Create docker volume. $ docker volume create --name gogs-data # Use `docker run` for the first time. -$ docker run --name=gogs -p 10022:22 -p 10080:3000 -v gogs-data:/data gogs/gogs +$ docker run --name=gogs -p 10022:22 -p 10880:3000 -v gogs-data:/data gogs/gogs ``` ## Settings ### Application -Most of settings are obvious and easy to understand, but there are some settings can be confusing by running Gogs inside Docker: +Most of the settings are obvious and easy to understand, but there are some settings can be confusing by running Gogs inside Docker: - **Repository Root Path**: keep it as default value `/home/git/gogs-repositories` because `start.sh` already made a symbolic link for you. -- **Run User**: keep it as default value `git` because `start.sh` already setup a user with name `git`. +- **Run User**: keep it as default value `git` because `build/finalize.sh` already setup a user with name `git`. - **Domain**: fill in with Docker container IP (e.g. `192.168.99.100`). But if you want to access your Gogs instance from a different physical machine, please fill in with the hostname or IP address of the Docker host machine. -- **SSH Port**: Use the exposed port from Docker container. For example, your SSH server listens on `22` inside Docker, but you expose it by `10022:22`, then use `10022` for this value. **Builtin SSH server is not recommended inside Docker Container** -- **HTTP Port**: Use port you want Gogs to listen on inside Docker container. For example, your Gogs listens on `3000` inside Docker, and you expose it by `10080:3000`, but you still use `3000` for this value. -- **Application URL**: Use combination of **Domain** and **exposed HTTP Port** values (e.g. `http://192.168.99.100:10080/`). +- **SSH Port**: Use the exposed port from Docker container. For example, your SSH server listens on `22` inside Docker, **but** you expose it by `10022:22`, then use `10022` for this value. **Builtin SSH server is not recommended inside Docker Container** +- **HTTP Port**: Use port you want Gogs to listen on inside Docker container. For example, your Gogs listens on `3000` inside Docker, **and** you expose it by `10880:3000`, but you still use `3000` for this value. +- **Application URL**: Use combination of **Domain** and **exposed HTTP Port** values (e.g. `http://192.168.99.100:10880/`). -Full documentation of application settings can be found [here](https://gogs.io/docs/advanced/configuration_cheat_sheet.html). +Full documentation of application settings can be found [here](https://github.com/gogs/gogs/blob/main/conf/app.ini). -### Container options +### Container options -This container have some options available via environment variables, these options are opt-in features that can help the administration of this container: +This container has some options available via environment variables, these options are opt-in features that can help the administration of this container: - **SOCAT_LINK**: - Possible value: @@ -94,18 +97,70 @@ This container have some options available via environment variables, these opti `false` - Action: Request crond to be run inside the container. Its default configuration will periodically run all scripts from `/etc/periodic/${period}` but custom crontabs can be added to `/var/spool/cron/crontabs/`. +- **BACKUP_INTERVAL**: + - Possible value: + `3h`, `7d`, `3M` + - Default: + `null` + - Action: + In combination with `RUN_CROND` set to `true`, enables backup system.\ + See: [Backup System](#backup-system) +- **BACKUP_RETENTION**: + - Possible value: + `360m`, `7d`, `...m/d` + - Default: + `7d` + - Action: + Used by backup system. Backups older than specified in expression are deleted periodically.\ + See: [Backup System](#backup-system) +- **BACKUP_ARG_CONFIG**: + - Possible value: + `/app/gogs/example/custom/config` + - Default: + `null` + - Action: + Used by backup system. If defined, supplies `--config` argument to `gogs backup`.\ + See: [Backup System](#backup-system) +- **BACKUP_ARG_EXCLUDE_REPOS**: + - Possible value: + `test-repo1`, `test-repo2` + - Default: + `null` + - Action: + Used by backup system. If defined, supplies `--exclude-repos` argument to `gogs backup`.\ + See: [Backup System](#backup-system) +- **BACKUP_EXTRA_ARGS**: + - Possible value: + `--verbose --exclude-mirror-repos` + - Default: + `null` + - Action: + Used by backup system. If defined, append content to arguments to `gogs backup`.\ + See: [Backup System](#backup-system) + +## Backup system + +Automated backups with retention policy: + +- `BACKUP_INTERVAL` controls how often the backup job runs and supports interval in hours (h), days (d), and months (M), eg. `3h`, `7d`, `3M`. The lowest possible value is one hour (`1h`). +- `BACKUP_RETENTION` supports expressions in minutes (m) and days (d), eg. `360m`, `2d`. The lowest possible value is 60 minutes (`60m`). ## Upgrade -:exclamation::exclamation::exclamation:**Make sure you have volumed data to somewhere outside Docker container**:exclamation::exclamation::exclamation: +> [!CAUTION] +> Make sure you have volumed data to somewhere outside Docker container! Steps to upgrade Gogs with Docker: - `docker pull gogs/gogs` - `docker stop gogs` - `docker rm gogs` -- Finally, create container as the first time and don't forget to do same volume and port mapping. +- Create a container for the first time and don't forget to do the same for the volume and port mapping. + +## Known issues + +- The docker container cannot currently be built on Raspberry 1 (armv6l) as our base image `alpine` does not have a `go` package available for this platform. -## Known Issues +## Useful links -- The docker container can not currently be build on Raspberry 1 (armv6l) as our base image `alpine` does not have a `go` package available for this platform. +- [Share port 22 between Gogs inside Docker & the local system](http://www.ateijelo.com/blog/2016/07/09/share-port-22-between-docker-gogs-ssh-and-local-system) diff --git a/docker/build.sh b/docker/build.sh deleted file mode 100755 index da36d7e6e0f..00000000000 --- a/docker/build.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh -set -x -set -e - -# Set temp environment vars -export GOPATH=/tmp/go -export PATH=${PATH}:${GOPATH}/bin -export GO15VENDOREXPERIMENT=1 - -# Install build deps -apk --no-cache --no-progress add --virtual build-deps build-base linux-pam-dev go - -# Install glide -git clone -b 0.10.2 https://github.com/Masterminds/glide ${GOPATH}/src/github.com/Masterminds/glide -cd ${GOPATH}/src/github.com/Masterminds/glide -make build -go install - - - -# Build Gogs -mkdir -p ${GOPATH}/src/github.com/gogits/ -ln -s /app/gogs/ ${GOPATH}/src/github.com/gogits/gogs -cd ${GOPATH}/src/github.com/gogits/gogs -glide install -make build TAGS="sqlite cert pam" - -# Cleanup GOPATH & vendoring dir -rm -r $GOPATH /app/gogs/vendor - -# Remove build deps -apk --no-progress del build-deps - -# Create git user for Gogs -adduser -H -D -g 'Gogs Git User' git -h /data/git -s /bin/bash && passwd -u git -echo "export GOGS_CUSTOM=${GOGS_CUSTOM}" >> /etc/profile diff --git a/docker/build/finalize.sh b/docker/build/finalize.sh new file mode 100755 index 00000000000..cd9d9a9ee03 --- /dev/null +++ b/docker/build/finalize.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +set -xe + +# Install gosu +if [ "$(uname -m)" = "aarch64" ]; then + export arch='arm64' + export checksum='c3805a85d17f4454c23d7059bcb97e1ec1af272b90126e79ed002342de08389b' +elif [ "$(uname -m)" = "armv7l" ]; then + export arch='armhf' + export checksum='e5866286277ff2a2159fb9196fea13e0a59d3f1091ea46ddb985160b94b6841b' +else + export arch='amd64' + export checksum='bbc4136d03ab138b1ad66fa4fc051bafc6cc7ffae632b069a53657279a450de3' +fi + +wget --quiet https://github.com/tianon/gosu/releases/download/1.17/gosu-${arch} -O /usr/sbin/gosu +echo "${checksum} /usr/sbin/gosu" | sha256sum -cs +chmod +x /usr/sbin/gosu + +# Create git user for Gogs +addgroup -S git +adduser -G git -H -D -g 'Gogs Git User' git -h /data/git -s /bin/bash && usermod -p '*' git && passwd -u git +echo "export GOGS_CUSTOM=${GOGS_CUSTOM}" >> /etc/profile + +# Final cleaning +rm -rf /app/gogs/build +rm -rf /app/gogs/docker/build +rm /app/gogs/docker/nsswitch.conf +rm /app/gogs/docker/README.md diff --git a/docker/runtime/backup-init.sh b/docker/runtime/backup-init.sh new file mode 100644 index 00000000000..f4e21a1b5d7 --- /dev/null +++ b/docker/runtime/backup-init.sh @@ -0,0 +1,144 @@ +#!/usr/bin/env bash +set -e + +BACKUP_PATH="/backup" + +# Make sure that required directories exist +mkdir -p "${BACKUP_PATH}" +mkdir -p "/etc/crontabs" +chown git:git /backup +chmod 2770 /backup + +# [string] BACKUP_INTERVAL Period expression +# [string] BACKUP_RETENTION Period expression +if [ -z "${BACKUP_INTERVAL}" ]; then + echo "Backup disabled: BACKUP_INTERVAL has not been found" 1>&2 + exit 1 +fi + +if [ -z "${BACKUP_RETENTION}" ]; then + echo "Backup retention period is not defined, default to 7 days" 1>&2 + BACKUP_RETENTION='7d' +fi + +# Parse BACKUP_INTERVAL environment variable and generate appropriate cron expression. Backup cron task will be run as scheduled. +# Expected format: nu (n - number, u - unit) (eg. 3d means 3 days) +# Supported units: h - hours, d - days, M - months +parse_generate_cron_expression() { + CRON_EXPR_MINUTES="*" + CRON_EXPR_HOURS="*" + CRON_EXPR_DAYS="*" + CRON_EXPR_MONTHS="*" + + # shellcheck disable=SC2001 + TIME_INTERVAL=$(echo "${BACKUP_INTERVAL}" | sed -e 's/[hdM]$//') + # shellcheck disable=SC2001 + TIME_UNIT=$(echo "${BACKUP_INTERVAL}" | sed -e 's/^[0-9]\+//') + + if [ "${TIME_UNIT}" = "h" ]; then + if [ ! "${TIME_INTERVAL}" -le 23 ]; then + echo "Parse error: Time unit 'h' (hour) cannot be greater than 23" 1>&2 + exit 1 + fi + + CRON_EXPR_MINUTES=0 + CRON_EXPR_HOURS="*/${TIME_INTERVAL}" + elif [ "${TIME_UNIT}" = "d" ]; then + if [ ! "${TIME_INTERVAL}" -le 30 ]; then + echo "Parse error: Time unit 'd' (day) cannot be greater than 30" 1>&2 + exit 1 + fi + + CRON_EXPR_MINUTES=0 + CRON_EXPR_HOURS=0 + CRON_EXPR_DAYS="*/${TIME_INTERVAL}" + elif [ "${TIME_UNIT}" = "M" ]; then + if [ ! "${TIME_INTERVAL}" -le 12 ]; then + echo "Parse error: Time unit 'M' (month) cannot be greater than 12" 1>&2 + exit 1 + fi + + CRON_EXPR_MINUTES=0 + CRON_EXPR_HOURS=0 + CRON_EXPR_DAYS="1" + CRON_EXPR_MONTHS="*/${TIME_INTERVAL}" + else + echo "Parse error: BACKUP_INTERVAL expression is invalid" 1>&2 + exit 1 + fi + + echo "${CRON_EXPR_MINUTES} ${CRON_EXPR_HOURS} ${CRON_EXPR_DAYS} ${CRON_EXPR_MONTHS} *" +} + +# Parse BACKUP_RETENTION environment variable and generate appropriate find command expression. +# Expected format: nu (n - number, u - unit) (eg. 3d means 3 days) +# Supported units: m - minutes, d - days +parse_generate_retention_expression() { + FIND_TIME_EXPR='mtime' + + # shellcheck disable=SC2001 + TIME_INTERVAL=$(echo "${BACKUP_RETENTION}" | sed -e 's/[mhdM]$//') + # shellcheck disable=SC2001 + TIME_UNIT=$(echo "${BACKUP_RETENTION}" | sed -e 's/^[0-9]\+//') + + if [ "${TIME_UNIT}" = "m" ]; then + if [ "${TIME_INTERVAL}" -le 59 ]; then + echo "Warning: Minimal retention is 60m. Value set to 60m" 1>&2 + TIME_INTERVAL=60 + fi + + FIND_TIME_EXPR="mmin" + elif [ "${TIME_UNIT}" = "h" ]; then + echo "Error: Unsupported expression - Try: eg. 120m for 2 hours." 1>&2 + exit 1 + elif [ "${TIME_UNIT}" = "d" ]; then + FIND_TIME_EXPR="mtime" + elif [ "${TIME_UNIT}" = "M" ]; then + echo "Error: Unsupported expression - Try: eg. 60d for 2 months." 1>&2 + exit 1 + else + echo "Parse error: BACKUP_RETENTION expression is invalid" 1>&2 + exit 1 + fi + + echo "${FIND_TIME_EXPR} +${TIME_INTERVAL:-7}" +} + +add_backup_cronjob() { + CRONTAB_USER="${1:-git}" + CRONTAB_FILE="/etc/crontabs/${CRONTAB_USER}" + CRONJOB_EXPRESSION="${2:-}" + CRONJOB_EXECUTOR="${3:-}" + CRONJOB_EXECUTOR_ARGUMENTS="${4:-}" + CRONJOB_TASK="${CRONJOB_EXPRESSION} /bin/sh ${CRONJOB_EXECUTOR} ${CRONJOB_EXECUTOR_ARGUMENTS}" + + if [ -f "${CRONTAB_FILE}" ]; then + CRONJOB_EXECUTOR_COUNT=$(grep -c "${CRONJOB_EXECUTOR}" "${CRONTAB_FILE}" || exit 0) + if [ "${CRONJOB_EXECUTOR_COUNT}" != "0" ]; then + echo "Cron job already exists for ${CRONJOB_EXECUTOR}. Updating existing." 1>&2 + CRONJOB_TASK=$(echo "{CRONJOB_TASK}" | sed 's/\//\\\//g' ) + CRONJOB_EXECUTOR=$(echo "{CRONJOB_EXECUTOR}" | sed 's/\//\\\//g' ) + sed -i "/${CRONJOB_EXECUTOR}/c\\${CRONJOB_TASK}" "${CRONTAB_FILE}" + return 0 + fi + fi + + # Finally append new line with cron task expression + echo "${CRONJOB_TASK}" >>"${CRONTAB_FILE}" +} + +CRONTAB_USER=$(awk -v val="${PUID}" -F ":" '$3==val{print $1}' /etc/passwd) + +# Up to this point, it was desirable that interpreter handles the command errors and halts execution upon any error. +# From now, we handle the errors our self. +set +e +RETENTION_EXPRESSION="$(parse_generate_retention_expression)" + +if [ -z "${RETENTION_EXPRESSION}" ]; then + echo "Couldn't generate backup retention expression. Aborting backup setup" 1>&2 + exit 1 +fi + +# Backup rotator cron will run every 5 minutes +add_backup_cronjob "${CRONTAB_USER}" "*/5 * * * *" "/app/gogs/docker/runtime/backup-rotator.sh" "'${BACKUP_PATH}' '${RETENTION_EXPRESSION}'" +add_backup_cronjob "${CRONTAB_USER}" "$(parse_generate_cron_expression)" "/app/gogs/docker/runtime/backup-job.sh" "'${BACKUP_PATH}'" diff --git a/docker/runtime/backup-job.sh b/docker/runtime/backup-job.sh new file mode 100644 index 00000000000..684cc3d7ed9 --- /dev/null +++ b/docker/runtime/backup-job.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env sh + +execute_backup_job() { + BACKUP_ARG_PATH="${1:-}" + BACKUP_ARG_CONFIG="${BACKUP_ARG_CONFIG:-}" + BACKUP_ARG_EXCLUDE_REPOS="${BACKUP_ARG_EXCLUDE_REPOS:-}" + BACKUP_EXTRA_ARGS="${BACKUP_EXTRA_ARGS:-}" + cd "/app/gogs" || exit 1 + + BACKUP_ARGS="--target=${BACKUP_ARG_PATH}" + + if [ -n "${BACKUP_ARG_CONFIG}" ]; then + BACKUP_ARGS="${BACKUP_ARGS} --config=${BACKUP_ARG_CONFIG}" + fi + + if [ -n "${BACKUP_ARG_EXCLUDE_REPOS}" ]; then + BACKUP_ARGS="${BACKUP_ARGS} --exclude-repos=${BACKUP_ARG_EXCLUDE_REPOS}" + fi + + if [ -n "${BACKUP_EXTRA_ARGS}" ]; then + BACKUP_ARGS="${BACKUP_ARGS} ${BACKUP_EXTRA_ARGS}" + fi + + # NOTE: We actually need word splitting to be able to pass multiple arguments. + # shellcheck disable=SC2086 + ./gogs backup ${BACKUP_ARGS} || echo "Error: Backup job returned non-successful code." && exit 1 +} + +main() { + BACKUP_PATH="${1:-}" + + if [ -z "${BACKUP_PATH}" ]; then + echo "Required argument missing BACKUP_PATH" 1>&2 + exit 1 + fi + + execute_backup_job "${BACKUP_PATH}" +} + +main "$@" diff --git a/docker/runtime/backup-rotator.sh b/docker/runtime/backup-rotator.sh new file mode 100644 index 00000000000..3b6d10abf86 --- /dev/null +++ b/docker/runtime/backup-rotator.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env sh + +# This is very simple, yet effective backup rotation script. +# Using find command, all files that are older than BACKUP_RETENTION_DAYS are accumulated and deleted using rm. +main() { + BACKUP_PATH="${1:-}" + FIND_EXPRESSION="${2:-mtime +7}" + + if [ -z "${BACKUP_PATH}" ]; then + echo "Error: Required argument missing BACKUP_PATH" 1>&2 + exit 1 + fi + + if [ "$(realpath "${BACKUP_PATH}")" = "/" ]; then + echo "Error: Dangerous BACKUP_PATH: /" 1>&2 + exit 1 + fi + + if [ ! -d "${BACKUP_PATH}" ]; then + echo "Error: BACKUP_PATH doesn't exist or is not a directory" 1>&2 + exit 1 + fi + + # shellcheck disable=SC2086 + find "${BACKUP_PATH}/" -type f -name "gogs-backup-*.zip" -${FIND_EXPRESSION} -print -exec rm "{}" + +} + +main "$@" diff --git a/docker/s6/.s6-svscan/finish b/docker/s6/.s6-svscan/finish index 3fab7f42e5a..3f8ba1f9d56 100755 --- a/docker/s6/.s6-svscan/finish +++ b/docker/s6/.s6-svscan/finish @@ -1,5 +1,5 @@ #!/bin/sh -# Cleanup SOCAT services and s6 event folder -rm -rf $(find /app/gogs/docker/s6/ -name 'event') +# Cleanup SOCAT services and s6 event folder +rm -rf "$(find /app/gogs/docker/s6/ -name 'event')" rm -rf /app/gogs/docker/s6/SOCAT_* diff --git a/docker/s6/crond/run b/docker/s6/crond/run index 9aa9fb9f275..6232dd26365 100755 --- a/docker/s6/crond/run +++ b/docker/s6/crond/run @@ -3,6 +3,7 @@ # The default configuration is also calling all the scripts in /etc/periodic/${period} if test -f ./setup; then + # shellcheck disable=SC2039,SC1091,SC3046 source ./setup fi diff --git a/docker/s6/gogs/run b/docker/s6/gogs/run index 1aa70eb41d4..eae716e7074 100755 --- a/docker/s6/gogs/run +++ b/docker/s6/gogs/run @@ -1,8 +1,8 @@ #!/bin/sh if test -f ./setup; then + # shellcheck disable=SC2039,SC1091,SC3046 source ./setup fi -export USER=git -exec gosu $USER /app/gogs/gogs web +exec gosu "$USER" /app/gogs/gogs web diff --git a/docker/s6/gogs/setup b/docker/s6/gogs/setup index 40bd82b28a7..bb77aa705e0 100755 --- a/docker/s6/gogs/setup +++ b/docker/s6/gogs/setup @@ -1,23 +1,22 @@ #!/bin/sh if ! test -d ~git/.ssh; then - mkdir -p ~git/.ssh + gosu "$USER" mkdir -p ~git/.ssh chmod 700 ~git/.ssh fi if ! test -f ~git/.ssh/environment; then - echo "GOGS_CUSTOM=${GOGS_CUSTOM}" > ~git/.ssh/environment + gosu "$USER" echo "GOGS_CUSTOM=${GOGS_CUSTOM}" > ~git/.ssh/environment chmod 600 ~git/.ssh/environment fi -cd /app/gogs +cd /app/gogs || exit 1 # Link volumed data with app data -ln -sf /data/gogs/log ./log -ln -sf /data/gogs/data ./data +ln -sfn /data/gogs/log ./log +ln -sfn /data/gogs/data ./data # Backward Compatibility with Gogs Container v0.6.15 -ln -sf /data/git /home/git +ln -sfn /data/git /home/git -chown -R git:git /data /app/gogs ~git/ chmod 0755 /data /data/gogs ~git/ diff --git a/docker/s6/openssh/run b/docker/s6/openssh/run index 99172aab699..c293e67b2cd 100755 --- a/docker/s6/openssh/run +++ b/docker/s6/openssh/run @@ -1,6 +1,7 @@ #!/bin/sh if test -f ./setup; then + # shellcheck disable=SC2039,SC1091,SC3046 source ./setup fi diff --git a/docker/s6/openssh/setup b/docker/s6/openssh/setup index 5333d3c06ef..4d71e2220f6 100755 --- a/docker/s6/openssh/setup +++ b/docker/s6/openssh/setup @@ -1,6 +1,6 @@ #!/bin/sh -# Check if host keys are present, else create them +# Check if host keys are present, else create them if ! test -f /data/ssh/ssh_host_rsa_key; then ssh-keygen -q -f /data/ssh/ssh_host_rsa_key -N '' -t rsa fi @@ -17,7 +17,7 @@ if ! test -f /data/ssh/ssh_host_ed25519_key; then ssh-keygen -q -f /data/ssh/ssh_host_ed25519_key -N '' -t ed25519 fi -# Set correct right to ssh keys +# Set correct right to ssh keys chown -R root:root /data/ssh/* chmod 0700 /data/ssh chmod 0600 /data/ssh/* diff --git a/docker/s6/syslogd/run b/docker/s6/syslogd/run index f7bdbe36d6c..de605fcee70 100755 --- a/docker/s6/syslogd/run +++ b/docker/s6/syslogd/run @@ -1,6 +1,7 @@ #!/bin/sh if test -f ./setup; then + # shellcheck disable=SC2039,SC1091,SC3046 source ./setup fi diff --git a/docker/sshd_config b/docker/sshd_config index 30c4e23c082..72377050b25 100644 --- a/docker/sshd_config +++ b/docker/sshd_config @@ -11,6 +11,5 @@ HostKey /data/ssh/ssh_host_ed25519_key PermitRootLogin no AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no -UsePrivilegeSeparation no PermitUserEnvironment yes AllowUsers git diff --git a/docker/start.sh b/docker/start.sh index a54c2a9bfd6..c7d95a30baf 100755 --- a/docker/start.sh +++ b/docker/start.sh @@ -3,17 +3,18 @@ create_socat_links() { # Bind linked docker container to localhost socket using socat USED_PORT="3000:22" - while read NAME ADDR PORT; do + while read -r NAME ADDR PORT; do if test -z "$NAME$ADDR$PORT"; then continue - elif echo $USED_PORT | grep -E "(^|:)$PORT($|:)" > /dev/null; then + elif echo "$USED_PORT" | grep -E "(^|:)$PORT($|:)" > /dev/null; then echo "init:socat | Can't bind linked container ${NAME} to localhost, port ${PORT} already in use" 1>&2 else SERV_FOLDER=/app/gogs/docker/s6/SOCAT_${NAME}_${PORT} - mkdir -p ${SERV_FOLDER} + mkdir -p "${SERV_FOLDER}" CMD="socat -ls TCP4-LISTEN:${PORT},fork,reuseaddr TCP4:${ADDR}:${PORT}" - echo -e "#!/bin/sh\nexec $CMD" > ${SERV_FOLDER}/run - chmod +x ${SERV_FOLDER}/run + # shellcheck disable=SC2039,SC3037 + echo -e "#!/bin/sh\nexec $CMD" > "${SERV_FOLDER}"/run + chmod +x "${SERV_FOLDER}"/run USED_PORT="${USED_PORT}:${PORT}" echo "init:socat | Linked container ${NAME} will be binded to localhost on port ${PORT}" 1>&2 fi @@ -23,37 +24,54 @@ EOT } cleanup() { - # Cleanup SOCAT services and s6 event folder + # Cleanup SOCAT services and s6 event folder # On start and on shutdown in case container has been killed - rm -rf $(find /app/gogs/docker/s6/ -name 'event') + rm -rf "$(find /app/gogs/docker/s6/ -name 'event')" rm -rf /app/gogs/docker/s6/SOCAT_* } create_volume_subfolder() { + # only change ownership if needed, if using an nfs mount this could be expensive + if [ "$USER:$USER" != "$(stat /data -c '%U:%G')" ] + then + # Modify the owner of /data dir, make $USER(git) user have permission to create sub-dir in /data. + chown -R "$USER:$USER" /data + fi + # Create VOLUME subfolder for f in /data/gogs/data /data/gogs/conf /data/gogs/log /data/git /data/ssh; do if ! test -d $f; then - mkdir -p $f + gosu "$USER" mkdir -p $f fi done } +setids() { + export USER=git + PUID=${PUID:-1000} + PGID=${PGID:-1000} + groupmod -o -g "$PGID" $USER + usermod -o -u "$PUID" $USER +} + +setids cleanup create_volume_subfolder LINK=$(echo "$SOCAT_LINK" | tr '[:upper:]' '[:lower:]') -if [ "$LINK" = "false" -o "$LINK" = "0" ]; then +if [ "$LINK" = "false" ] || [ "$LINK" = "0" ]; then echo "init:socat | Will not try to create socat links as requested" 1>&2 else create_socat_links fi CROND=$(echo "$RUN_CROND" | tr '[:upper:]' '[:lower:]') -if [ "$CROND" = "true" -o "$CROND" = "1" ]; then +if [ "$CROND" = "true" ] || [ "$CROND" = "1" ]; then echo "init:crond | Cron Daemon (crond) will be run as requested by s6" 1>&2 rm -f /app/gogs/docker/s6/crond/down + /bin/sh /app/gogs/docker/runtime/backup-init.sh "${PUID}" else - # Tell s6 not to run the crond service + # Tell s6 not to run the crond service touch /app/gogs/docker/s6/crond/down fi @@ -61,5 +79,5 @@ fi if [ $# -gt 0 ];then exec "$@" else - exec /bin/s6-svscan /app/gogs/docker/s6/ + exec /usr/bin/s6-svscan /app/gogs/docker/s6/ fi diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000000..65cff263893 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,26 @@ +## Development + +Install the [Mintlify CLI](https://www.npmjs.com/package/mint) to preview your documentation changes locally. To install, use the following command: + +``` +pnpm i -g mint +``` + +Run the following command at the root of your documentation, where your `docs.json` is located: + +``` +mint dev +``` + +View your local preview at `http://localhost:3000`. + +## Need help? + +### Troubleshooting + +- If your dev environment isn't running: Run `mint update` to ensure you have the most recent version of the CLI. +- If a page loads as a 404: Make sure you are running in a folder with a valid `docs.json`. + +### Resources + +- [Mintlify documentation](https://mintlify.com/docs) diff --git a/docs/advancing/authentication.mdx b/docs/advancing/authentication.mdx new file mode 100644 index 00000000000..a53d17cdf66 --- /dev/null +++ b/docs/advancing/authentication.mdx @@ -0,0 +1,270 @@ +--- +title: "Authentication" +description: "Integrate with your existing IAM system" +icon: "key" +--- + +Gogs supports authentication through various external sources. Currently supported backends are **LDAP**, **SMTP**, **PAM**, and **HTTP header**. Authentication sources can be configured in two ways: + +- **Admin Panel**: Navigate to **Admin Panel > Authentication Sources** +- **Configuration files**: Place `.conf` files in the `custom/conf/auth.d/` directory. Each file describes one source using INI format. Files are loaded once at startup and keyed by `id`. See the "Configuration file" subsection under each backend below for examples. + +## LDAP + +Gogs supports two variants of LDAP authentication: **Simple Auth** and **Bind DN**. In both cases, authentication is performed by attempting to bind to the LDAP server with the User DN and password. The difference is that with Bind DN, a preliminary query is performed (using the Bind DN credentials) to find the User DN first. + + + + The Bind DN mechanism has these advantages: + + - It may be more secure than blindly attempting to bind with a possibly non-existent User DN. + - It supports login with attributes such as email address or phone number. The preliminary search can look up the User DN using `mail` or `mobile` attributes. + - It is required when the LDAP does not allow the User DN to query its own attributes or group memberships. + + The downside is that, unless the LDAP allows anonymous queries, it requires a bind DN to be defined and Gogs needs to store its credentials. Gogs currently does not encrypt these credentials. + + + In the ideal situation where you know the exact DN template for your users and the LDAP allows the User DN to query its own attributes, Simple Auth is the simpler option. It requires no separate bind account and no stored credentials beyond what the user provides at login. + + + +### Shared fields + +The following fields are shared between both **Bind DN** and **Simple Auth** configurations: + +| Field | Required | Description | Example | +|---|---|---|---| +| **Authentication Name** | Yes | A friendly name for the authentication source. | `My LDAP` | +| **Security Protocol** | Yes | Connection security: Unencrypted, LDAPS, or StartTLS. | `LDAPS` | +| **Host** | Yes | The address of the LDAP server. | `ldap.mydomain.com` | +| **Port** | Yes | The port for the LDAP connection. Usually `389` for LDAP/StartTLS, `636` for LDAPS. | `389` | +| **User Filter** | Yes | An LDAP filter declaring which users can log in. The `%s` parameter is substituted with the login name. | `(&(objectClass=posixAccount)(uid=%s))` | +| **Email Attribute** | Yes | The LDAP attribute containing the user's email address. | `mail` | +| **Admin Filter** | No | An LDAP filter applied to the User DN context to determine Gogs administrator privileges. | `(memberOf=cn=admins,cn=groups,dc=mydomain,dc=com)` | +| **Username Attribute** | No | The LDAP attribute containing the username. Used for the Gogs account name after first sign-in. Leave empty to use the login name from the sign-in form. | `uid` | +| **First Name Attribute** | No | The LDAP attribute containing the user's first name. | `givenName` | +| **Surname Attribute** | No | The LDAP attribute containing the user's last name. | `sn` | + + + The **User Filter** field can be used to filter on group membership if the User DN object has `memberOf` attributes. For example: + ``` + (&(objectClass=posixAccount)(uid=%s)(memberOf=cn=gogs_users,cn=groups,dc=mydomain,dc=com)) + ``` + In the Bind DN authenticator, the User Filter can also match against multiple user attributes: + ``` + (&(objectClass=Person)(|(uid=%s)(mail=%s)(mobile=%s))) + ``` + + +### Simple Auth fields + +LDAP via Simple Auth adds the following field: + +| Field | Required | Description | Example | +|---|---|---|---| +| **User DN** | Yes | A template for the user's DN. The `%s` parameter is substituted with the login name. | `cn=%s,ou=Users,dc=mydomain,dc=com` or `uid=%s,ou=Users,dc=mydomain,dc=com` | + +### Bind DN fields + +LDAP via Bind DN adds the following fields: + +| Field | Required | Description | Example | +|---|---|---|---| +| **Bind DN** | No | The DN used to bind to the LDAP server when searching for the user. Leave blank for anonymous search. | `cn=Search,dc=mydomain,dc=com` | +| **Bind Password** | No | The password for the Bind DN specified above. | -- | +| **User Search Base** | Yes | The LDAP base below which user accounts will be searched. | `ou=Users,dc=mydomain,dc=com` | +| **Fetch Attributes in Bind DN Context** | No | When enabled, user attributes are retrieved while bound as the Bind DN instead of the User DN. | -- | + + + The Bind Password is stored in plaintext on the server. Ensure that your Bind DN has the minimum privileges necessary. + + +### Group membership verification + +You can optionally verify LDAP group membership using the following fields: + +| Field | Required | Description | Example | +|---|---|---|---| +| **Group Search Base DN** | No | The LDAP base below which groups will be searched. | `ou=group,dc=mydomain,dc=com` | +| **Group Filter** | No | An LDAP filter declaring the groups that grant access. | `(\|(cn=gogs_users)(cn=admins))` | +| **Group Attribute Containing List of Users** | No | The multi-valued attribute containing the group's members. | `memberUid` or `member` | +| **User Attribute Listed in Group** | No | The user attribute referenced in the group membership attributes. | `uid` or `dn` | + +### Configuration files + +LDAP sources can also be defined as `.conf` files in `custom/conf/auth.d/` instead of through the admin panel. Files are loaded at startup and keyed by `id`. + + + + ```ini + id = 101 + type = ldap_bind_dn + name = LDAP BindDN + is_activated = true + + [config] + host = mydomain.com + port = 636 + # 0 - Unencrypted, 1 - LDAPS, 2 - StartTLS + security_protocol = 0 + skip_verify = false + bind_dn = + bind_password = + user_base = ou=Users,dc=mydomain,dc=com + attribute_username = + attribute_name = + attribute_surname = + attribute_mail = mail + attributes_in_bind = false + filter = (&(objectClass=posixAccount)(cn=%s)) + admin_filter = + group_enabled = false + group_dn = + group_filter = + group_member_uid = + user_uid = + ``` + + + ```ini + id = 102 + type = ldap_simple_auth + name = LDAP Simple Auth + is_activated = true + + [config] + host = mydomain.com + port = 636 + # 0 - Unencrypted, 1 - LDAPS, 2 - StartTLS + security_protocol = 0 + skip_verify = false + bind_dn = + bind_password = + user_base = + user_dn = cn=%s,ou=Users,dc=mydomain,dc=com + attribute_username = + attribute_name = + attribute_surname = + attribute_mail = mail + attributes_in_bind = false + filter = (&(objectClass=posixAccount)(cn=%s)) + admin_filter = + group_enabled = false + group_dn = + group_filter = + group_member_uid = + user_uid = + ``` + + + +### FreeIPA examples + +It is possible to use either Bind DN or Simple Auth with FreeIPA. The examples below assume your domain is `domain.com` and that users must be a member of the `gogs_users` group to get access. + + + + Setting up access using Simple Auth is straightforward: + + ```ini + user_dn = uid=%s,cn=users,cn=accounts,dc=domain,dc=com + filter = (&(objectClass=posixAccount)(memberOf=cn=gogs_users,cn=groups,cn=accounts,dc=domain,dc=com)) + attribute_username = uid + attribute_name = givenName + attribute_surname = sn + attribute_mail = mail + admin_filter = (memberOf=cn=admins,cn=groups,cn=accounts,dc=domain,dc=com) + group_enabled = false + ``` + + + If you want to allow login by email address, note that FreeIPA by default does not grant anonymous search access to the `mail` attribute. This can be changed in IPA: + + ```bash + ipa permission-mod --includedattrs=mail 'System: Read User Standard Attributes' + ``` + + Alternatively, you can ask your LDAP administrators for a dedicated bind user account. + + + Allowing email-based login via Bind DN may no longer be necessary. Gogs translates email logins to the corresponding user ID before making the authentication call to the backend LDAP. The only requirement is that the user's **first login** is with their user ID. After that, they can use either user ID or email address. + + + More precisely, Gogs maps the login name onto the user's "Authentication Login Name", which administrators can edit on the user's **Edit Account** page. + + + +## PAM + +To configure PAM authentication, set the **PAM Service Name** to a filename in `/etc/pam.d/`. + + + If you want PAM authentication to work with normal Linux passwords, the user running Gogs must have read access to `/etc/shadow`. + + +### Configuration file + +```ini +id = 104 +type = pam +name = System Auth +is_activated = true + +[config] +service_name = system-auth +``` + +## SMTP + +SMTP authentication allows Gogs to log in to your SMTP host to verify user credentials. Configure the following fields: + +| Field | Required | Description | Example | +|---|---|---|---| +| **Authentication Name** | Yes | A name for this authentication source. | `Company SMTP` | +| **SMTP Authentication Type** | Yes | The authentication type: `PLAIN` or `LOGIN`. | `PLAIN` | +| **Host** | Yes | The address of the SMTP server. | `smtp.mydomain.com` | +| **Port** | Yes | The port for the SMTP connection. | `587` | +| **Allowed Domains** | No | Restrict login to specific email domains. Separate multiple domains with commas. | `gogs.io,mydomain.com` | +| **Enable TLS Encryption** | No | Enable TLS encryption for the authentication connection. | -- | +| **Skip TLS Verify** | No | Disable TLS certificate verification. | -- | +| **This Authentication is Activated** | No | Enable or disable this authentication method. | -- | + +### Configuration file + +```ini +id = 103 +type = smtp +name = GMail +is_activated = true + +[config] +# Either "PLAIN" or "LOGIN" +auth = PLAIN +host = smtp.gmail.com +port = 587 +allowed_domains = +tls = true +skip_verify = false +``` + +## HTTP header + +If your reverse proxy already handles user authentication (e.g. via SSO, OAuth, or client certificates), Gogs can trust the authenticated username from an HTTP header. This is configured in `custom/conf/app.ini` under `[auth]`: + +```ini +[auth] +ENABLE_REVERSE_PROXY_AUTHENTICATION = true +REVERSE_PROXY_AUTHENTICATION_HEADER = X-WEBAUTH-USER +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `ENABLE_REVERSE_PROXY_AUTHENTICATION` | `false` | Enable reading the authenticated username from a request header. | +| `REVERSE_PROXY_AUTHENTICATION_HEADER` | `X-WEBAUTH-USER` | The HTTP header containing the authenticated username. | +| `ENABLE_REVERSE_PROXY_AUTO_REGISTRATION` | `false` | Automatically create a Gogs account for users that do not yet exist. | + +When auto-registration is enabled, Gogs creates new accounts with an activated status and a placeholder email address. The user can update their email after first login. + + + Only enable this feature if Gogs is exclusively accessed through a trusted reverse proxy that sets the header. Exposing Gogs directly to the internet with this enabled would allow anyone to impersonate any user by setting the header themselves. + diff --git a/docs/advancing/cli-reference.mdx b/docs/advancing/cli-reference.mdx new file mode 100644 index 00000000000..f2a3a1c5172 --- /dev/null +++ b/docs/advancing/cli-reference.mdx @@ -0,0 +1,67 @@ +--- +title: "CLI reference" +description: "Discover all the commands available in the gogs binary" +icon: "terminal" +--- + +Most people know `gogs web` for starting the server, but the `gogs` binary ships with several other commands that help you manage your instance from the command line. + +Run `gogs --help` at any time to see the full list of available commands, and `gogs --help` for details on a specific command. + + + Every command accepts a `--config` (`-c`) flag to specify a custom configuration file path. The default is `custom/conf/app.ini`. + + +## Starting the server + +```bash +gogs web +``` + +The `web` command starts the HTTP server that powers the web UI, the REST API, and Git HTTP operations. Use the `--port` (`-p`) flag to override the default listening port. + +## Administration + +```bash +gogs admin +``` + +The `admin` command lets you perform maintenance tasks without going through the web interface. Available subcommands include: + +| Subcommand | Purpose | +|---|---| +| `create-user` | Create a new user account (with optional `--admin` flag). | +| `delete-inactive-users` | Remove user accounts that were never activated. | +| `delete-repository-archives` | Clean up generated repository archive files. | +| `delete-missing-repositories` | Remove database records for repositories whose Git data is missing on disk. | +| `collect-garbage` | Run `git gc` across all repositories. | +| `rewrite-authorized-keys` | Regenerate the SSH `authorized_keys` file from the database. | +| `resync-hooks` | Re-write Git server-side hooks for all repositories. | +| `reinit-missing-repositories` | Re-initialize bare Git repositories that are missing on disk. | + + + `rewrite-authorized-keys` replaces the entire `authorized_keys` file. Any non-Gogs keys in that file will be lost. + + +## Importing data + +```bash +gogs import locale --source --target +``` + +The `import` command helps you bring portable data from other Gogs installations into your local instance. Currently the only subcommand is `locale`, which merges locale files from a source directory into a target directory. + +## Backup and restore + +```bash +gogs backup +gogs restore --from +``` + +`backup` dumps the database, repositories, and related files into a single zip archive. `restore` imports everything back from an archive, which is useful for migrating Gogs to another server or switching database engines. + +Both commands support `--database-only` and `--exclude-repos` flags to narrow the scope. `backup` additionally supports `--exclude-mirror-repos` and `--target` to control where the archive is saved. + +## Internal commands + +The `serv` and `hook` commands are used internally by the SSH and Git subsystems. You generally do not need to invoke them directly, but they are the reason Gogs can handle SSH authentication and server-side Git hooks without any external tooling. diff --git a/docs/advancing/custom-templates.mdx b/docs/advancing/custom-templates.mdx new file mode 100644 index 00000000000..1a6977b06e6 --- /dev/null +++ b/docs/advancing/custom-templates.mdx @@ -0,0 +1,100 @@ +--- +title: "Custom templates" +description: "Override HTML templates, static files, and inject custom content" +icon: "paintbrush" +--- + +Gogs allows you to customize the appearance and behavior of your instance by overriding HTML templates, replacing static files, and injecting custom content. All customizations are placed under the `custom/` directory and survive code updates. + + + Be careful when overriding templates and static files, as changes to the upstream Gogs codebase may break your customizations in future releases. Keep track of what you have overridden. + + +## Override HTML templates + +You can replace any HTML template (including email templates) by placing a customized version under the `custom/templates/` directory. + + + + Locate the template file you want to customize in the `templates/` directory of the Gogs source code. For example, to customize the home page, find `templates/home.tmpl`. + + + Copy the content of the template file and save your edited version to the corresponding path under `custom/templates/`. For example: + + ``` + custom/templates/home.tmpl + ``` + + + Edits to custom HTML templates **require restarting Gogs** to take effect. + + + + + Override for email templates is disabled when `[server] LOAD_ASSETS_FROM_DISK = true` is set in your configuration. If you are using this setting, email template overrides will not be applied. + + +## Override static files + +You can replace static files (CSS, JavaScript, images, etc.) by placing customized versions under the `custom/public/` directory. + +For example, to override the site favicon, place your version at: + +``` +custom/public/img/favicon.png +``` + + + Edits to custom static files **do not** require restarting Gogs. Changes take effect immediately. + + +## Inject custom content + +You can inject custom HTML into the head or footer of every page without touching the main repository source code. This is useful for adding analytics code, custom stylesheets, or other static resources. + +This approach is **recommended whenever possible** because it has the minimum impact on templates and is less likely to break during upgrades. + +The injection points are: + +| File | Location | Purpose | +|---|---|---| +| `custom/templates/inject/head.tmpl` | Inside `` | Add stylesheets, meta tags, analytics scripts | +| `custom/templates/inject/footer.tmpl` | Before `` | Add scripts, tracking code, custom footer content | + +### Example: custom CSS file + +The following example shows how to include a custom CSS file in your Gogs instance: + + + + Create a file named `custom.css` under the `custom/public/css/` directory: + + ``` + custom/public/css/custom.css + ``` + + + Write your CSS rules in the file. For example: + + ```css + /* custom/public/css/custom.css */ + .dashboard .news .news-item .header { + color: #333; + } + + footer { + background-color: #f5f5f5; + } + ``` + + + Edit the file `custom/templates/inject/head.tmpl` and add a link to your CSS file: + + ```html + + ``` + + + Restart Gogs to load the new `head.tmpl` injection template. After the initial restart, future edits to the custom CSS file **do not** require restarting Gogs. + + diff --git a/docs/advancing/git-lfs.mdx b/docs/advancing/git-lfs.mdx new file mode 100644 index 00000000000..8bac5096d1b --- /dev/null +++ b/docs/advancing/git-lfs.mdx @@ -0,0 +1,102 @@ +--- +title: "Git LFS" +description: "Managing large binary files with some magic" +icon: "file-arrow-up" +--- + +Git Large File Storage (LFS) helps manage large binary files in Git repositories. Instead of storing large files directly in the repository, Git LFS replaces them with lightweight pointers while storing the actual file contents on a separate server. + +## How it works + +The Git LFS client communicates with the Gogs server over HTTP/HTTPS. It uses HTTP Basic Authentication to authorize client requests. Once a request is authorized, the Git LFS client receives instructions on where to fetch or push the large file. + +## Server configuration + +Git LFS works out of the box with the default configuration for any supported version of Gogs. + +All configuration options for Git LFS are located in the `[lfs]` section of `custom/conf/app.ini`: + +```ini +[lfs] +; The storage backend for uploading new objects. +STORAGE = local +; The root path to store LFS objects on the local file system. +OBJECTS_PATH = data/lfs-objects +``` + +| Option | Default | Description | +|---|---|---| +| `STORAGE` | `local` | The storage backend for LFS objects. Currently only `local` is supported. | +| `OBJECTS_PATH` | `data/lfs-objects` | The root path on the local file system where LFS objects are stored. | + +## Version requirements + +To use Git LFS with your Gogs instance, you need: + +- Gogs version **0.12** or later +- [Git LFS client](https://git-lfs.github.com/) version **1.0.1** or later + +## Using Git LFS + +Git LFS endpoints in a Gogs server are automatically discovered by the Git LFS client, so you do not need to configure anything upfront. + + + + Install the [Git LFS client](https://git-lfs.github.com/) on your machine. Most package managers include it: + + ```bash + # macOS + brew install git-lfs + + # Debian/Ubuntu + sudo apt install git-lfs + + # Then initialize Git LFS + git lfs install + ``` + + + In your repository, tell Git LFS which file patterns to track: + + ```bash + git lfs track "*.psd" + git lfs track "*.zip" + ``` + + This creates or updates a `.gitattributes` file. Make sure to commit it: + + ```bash + git add .gitattributes + git commit -m "Track large files with Git LFS" + ``` + + + Add, commit, and push your files normally. Git LFS will automatically handle the large files: + + ```bash + git add design.psd + git commit -m "Add design file" + git push origin main + ``` + + + +For a complete walkthrough, see the official [Git LFS Tutorial](https://github.com/git-lfs/git-lfs/wiki/Tutorial). + +## Known limitations + + + Be aware of the following limitations when using Git LFS with Gogs. + + + + + Only local storage is supported. All LFS objects are stored on the same server where Gogs runs. Support for Object Storage Services like Amazon S3 is being tracked in [gogs/gogs#6065](https://github.com/gogs/gogs/issues/6065). + + + When SSH is set as a remote, Git LFS objects still go through HTTP/HTTPS. Any Git LFS request will prompt for HTTP/HTTPS credentials, so a good Git credentials store is recommended. + + + File locking is not supported. This feature is being tracked in [gogs/gogs#6064](https://github.com/gogs/gogs/issues/6064). + + diff --git a/docs/advancing/localization.mdx b/docs/advancing/localization.mdx new file mode 100644 index 00000000000..291e53bec3b --- /dev/null +++ b/docs/advancing/localization.mdx @@ -0,0 +1,78 @@ +--- +title: "Localization" +description: "Configure interface languages and contribute translations to Gogs" +icon: "language" +--- + +Gogs has supported multiple languages since release `v0.5.0`. Users can change the interface language instantly with a single click from their settings page. + +## Configuration + +Available languages are configured in `custom/conf/app.ini` under the `[i18n]` section. All supported languages are enabled by default: + +```ini +[i18n] +LANGS = en-US,zh-CN,zh-HK,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT +NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu,Русский,日本語,Español,Português do Brasil,Polski,български,Italiano +``` + +| Option | Description | +|---|---| +| `LANGS` | A comma-separated list of locale codes to enable. Each entry corresponds to a locale file. | +| `NAMES` | A comma-separated list of display names for each language, in the same order as `LANGS`. | + + + To restrict the available languages, simply remove entries from both `LANGS` and `NAMES`. Make sure the two lists remain in the same order and have the same number of entries. + + +## Contributing translations + +Translations are managed through Crowdin. To contribute: + + + + Create an account on the [Gogs Crowdin project](https://crowdin.gogs.io/). + + + Browse the available strings and fill in untranslated entries for your language. + + + Review existing translations and suggest improvements where needed. + + + + + When translating, focus on conveying the meaning rather than producing a literal word-for-word translation. It is more important that the translation reads naturally in your language than that it matches the exact words of the English version. + + +### Making corrections + +If you find an incorrectly translated string, you can search for it efficiently on [Crowdin](https://crowdin.gogs.io/) by using its **key name** rather than the translated text. + +For example: +- To fix the translation for "Home", search for the key `home` instead of searching for the word "Home". +- For keys under a section, search using the format `section:key_name`, such as `home:uname_holder`. + +### Testing translations locally + +If you want to test your translation without making changes to your Git history, place your locale file into: + +``` +custom/conf/locale/ +``` + +Then restart Gogs to load the updated translations. + +## Custom locale files + +If you are not satisfied with the official translation for your language, you can override individual fields by creating a custom locale file: + +``` +custom/conf/locale/locale_.ini +``` + +For example, to override specific English strings, create `custom/conf/locale/locale_en-US.ini` and add only the keys you want to change. Restart Gogs to apply the changes. + + + Custom locale files only need to contain the keys you want to override, not the entire locale file. Unspecified keys will fall back to the official translation. + diff --git a/docs/advancing/webhooks.mdx b/docs/advancing/webhooks.mdx new file mode 100644 index 00000000000..97bcbae6291 --- /dev/null +++ b/docs/advancing/webhooks.mdx @@ -0,0 +1,130 @@ +--- +title: "Webhooks" +description: "Stay informed for repository events" +icon: "bell" +--- + +Gogs supports moonlanding for repository events, allowing your external services to receive HTTP notifications when actions occur in your repositories. All event pushes are **POST requests**. + +## Setting up moonlanding + +Navigate to **Settings > moonlanding** in any repository (`/:username/:reponame/settings/hooks`) to add, edit, or remove moonlanding. + +## Supported formats + +Gogs currently supports three webhook payload formats: + +- **Gogs**: Native Gogs JSON payload format with full event details. +- **Slack**: Slack-compatible payload format for posting to Slack channels. +- **Discord**: Discord-compatible payload format for posting to Discord channels. + +## Event headers + +Every webhook delivery includes the following HTTP headers: + +| Header | Description | Example | +|---|---|---| +| `X-Gogs-Delivery` | A unique UUID identifying this delivery. | `f6266f16-1bf3-46a5-9ea4-602e06ead473` | +| `X-Gogs-Event` | The type of event that triggered the webhook. | `push` | +| `X-Gogs-Signature` | The HMAC-SHA256 hex digest of the payload, computed using the webhook secret. Use this to verify that the payload was sent by Gogs. | `1921679ed627...` | + + + Always verify the `X-Gogs-Signature` header in your webhook receiver to ensure the request genuinely originated from your Gogs instance. + + +## Example payload + +The following is an example of the event information and JSON payload sent by Gogs for a **push** event: + +**Request headers:** + +```http +X-Gogs-Delivery: f6266f16-1bf3-46a5-9ea4-602e06ead473 +X-Gogs-Event: push +X-Gogs-Signature: 1921679ed6274399b6514721056337f6913b6ff1cb35a24d340e983745d637f1 +``` + +**Request body:** + +```json +{ + "ref": "refs/heads/main", + "before": "28e1879d029cb852e4844d9c718537df08844e03", + "after": "bffeb74224043ba2feb48d137756c8a9331c449a", + "compare_url": "https://gogs.example.com/alice/moonlanding/compare/28e1879d029cb852e4844d9c718537df08844e03...bffeb74224043ba2feb48d137756c8a9331c449a", + "commits": [ + { + "id": "bffeb74224043ba2feb48d137756c8a9331c449a", + "message": "Update README\n", + "url": "https://gogs.example.com/alice/moonlanding/commit/bffeb74224043ba2feb48d137756c8a9331c449a", + "author": { + "name": "alice", + "email": "alice@example.com", + "username": "alice" + }, + "committer": { + "name": "alice", + "email": "alice@example.com", + "username": "alice" + }, + "timestamp": "2017-03-13T13:52:11-04:00" + } + ], + "repository": { + "id": 140, + "owner": { + "id": 1, + "login": "alice", + "full_name": "alice", + "email": "alice@example.com", + "avatar_url": "https://secure.gravatar.com/avatar/d8b2871cdac01b57bbda23716cc03b96", + "username": "alice" + }, + "name": "moonlanding", + "full_name": "alice/moonlanding", + "description": "", + "private": false, + "fork": false, + "html_url": "https://gogs.example.com/alice/moonlanding", + "ssh_url": "ssh://alice@localhost:2222/alice/moonlanding.git", + "clone_url": "https://gogs.example.com/alice/moonlanding.git", + "website": "", + "stars_count": 0, + "forks_count": 1, + "watchers_count": 1, + "open_issues_count": 7, + "default_branch": "main", + "created_at": "2017-02-26T04:29:06-05:00", + "updated_at": "2017-03-13T13:51:58-04:00" + }, + "pusher": { + "id": 1, + "login": "alice", + "full_name": "alice", + "email": "alice@example.com", + "avatar_url": "https://secure.gravatar.com/avatar/d8b2871cdac01b57bbda23716cc03b96", + "username": "alice" + }, + "sender": { + "id": 1, + "login": "alice", + "full_name": "alice", + "email": "alice@example.com", + "avatar_url": "https://secure.gravatar.com/avatar/d8b2871cdac01b57bbda23716cc03b96", + "username": "alice" + } +} +``` + +### Payload fields + +| Field | Description | +|---|---| +| `ref` | The full Git reference that was pushed to (e.g., `refs/heads/main`). | +| `before` | The SHA of the commit at the head of the branch before the push. | +| `after` | The SHA of the commit at the head of the branch after the push. | +| `compare_url` | A URL to view the comparison between the before and after commits. | +| `commits` | An array of commit objects included in the push. | +| `repository` | The full repository object with metadata. | +| `pusher` | The user who performed the push. | +| `sender` | The user who triggered the event. | diff --git a/docs/api-reference/administration/add-or-update-team-repository.mdx b/docs/api-reference/administration/add-or-update-team-repository.mdx new file mode 100644 index 00000000000..a345530aef1 --- /dev/null +++ b/docs/api-reference/administration/add-or-update-team-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "Add or update team repository" +openapi: "PUT /admin/teams/{teamid}/repos/{reponame}" +--- diff --git a/docs/api-reference/administration/add-team-membership.mdx b/docs/api-reference/administration/add-team-membership.mdx new file mode 100644 index 00000000000..b3f442ea9d8 --- /dev/null +++ b/docs/api-reference/administration/add-team-membership.mdx @@ -0,0 +1,4 @@ +--- +title: "Add team membership" +openapi: "PUT /admin/teams/{teamid}/members/{username}" +--- diff --git a/docs/api-reference/administration/create-a-new-user.mdx b/docs/api-reference/administration/create-a-new-user.mdx new file mode 100644 index 00000000000..2dc79fa6262 --- /dev/null +++ b/docs/api-reference/administration/create-a-new-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a new user" +openapi: "POST /admin/users" +--- diff --git a/docs/api-reference/administration/create-a-public-key-for-a-user.mdx b/docs/api-reference/administration/create-a-public-key-for-a-user.mdx new file mode 100644 index 00000000000..6d0fb8421e4 --- /dev/null +++ b/docs/api-reference/administration/create-a-public-key-for-a-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a public key for a user" +openapi: "POST /admin/users/{username}/keys" +--- diff --git a/docs/api-reference/administration/create-a-repository-for-a-user.mdx b/docs/api-reference/administration/create-a-repository-for-a-user.mdx new file mode 100644 index 00000000000..2ad06539934 --- /dev/null +++ b/docs/api-reference/administration/create-a-repository-for-a-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a repository for a user" +openapi: "POST /admin/users/{username}/repos" +--- diff --git a/docs/api-reference/administration/create-a-team.mdx b/docs/api-reference/administration/create-a-team.mdx new file mode 100644 index 00000000000..15431995c63 --- /dev/null +++ b/docs/api-reference/administration/create-a-team.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a team" +openapi: "POST /admin/orgs/{orgname}/teams" +--- diff --git a/docs/api-reference/administration/create-an-organization.mdx b/docs/api-reference/administration/create-an-organization.mdx new file mode 100644 index 00000000000..c9d872592f2 --- /dev/null +++ b/docs/api-reference/administration/create-an-organization.mdx @@ -0,0 +1,4 @@ +--- +title: "Create an organization" +openapi: "POST /admin/users/{username}/orgs" +--- diff --git a/docs/api-reference/administration/delete-a-user.mdx b/docs/api-reference/administration/delete-a-user.mdx new file mode 100644 index 00000000000..5bca7628f59 --- /dev/null +++ b/docs/api-reference/administration/delete-a-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Delete a user" +openapi: "DELETE /admin/users/{username}" +--- diff --git a/docs/api-reference/administration/edit-an-existing-user.mdx b/docs/api-reference/administration/edit-an-existing-user.mdx new file mode 100644 index 00000000000..6568d364af6 --- /dev/null +++ b/docs/api-reference/administration/edit-an-existing-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Edit an existing user" +openapi: "PATCH /admin/users/{username}" +--- diff --git a/docs/api-reference/administration/list-all-members-of-a-team.mdx b/docs/api-reference/administration/list-all-members-of-a-team.mdx new file mode 100644 index 00000000000..ef892c57af3 --- /dev/null +++ b/docs/api-reference/administration/list-all-members-of-a-team.mdx @@ -0,0 +1,4 @@ +--- +title: "List all members of a team" +openapi: "GET /admin/teams/{teamid}/members" +--- diff --git a/docs/api-reference/administration/remove-team-membership.mdx b/docs/api-reference/administration/remove-team-membership.mdx new file mode 100644 index 00000000000..460c9ff65a6 --- /dev/null +++ b/docs/api-reference/administration/remove-team-membership.mdx @@ -0,0 +1,4 @@ +--- +title: "Remove team membership" +openapi: "DELETE /admin/teams/{teamid}/members/{username}" +--- diff --git a/docs/api-reference/administration/remove-team-repository.mdx b/docs/api-reference/administration/remove-team-repository.mdx new file mode 100644 index 00000000000..81731ff173a --- /dev/null +++ b/docs/api-reference/administration/remove-team-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "Remove team repository" +openapi: "DELETE /admin/teams/{teamid}/repos/{reponame}" +--- diff --git a/docs/api-reference/collaborators-and-deploy-keys/add-a-collaborator.mdx b/docs/api-reference/collaborators-and-deploy-keys/add-a-collaborator.mdx new file mode 100644 index 00000000000..4a3814e1354 --- /dev/null +++ b/docs/api-reference/collaborators-and-deploy-keys/add-a-collaborator.mdx @@ -0,0 +1,4 @@ +--- +title: "Add a collaborator" +openapi: "PUT /repos/{owner}/{repo}/collaborators/{collaborator}" +--- diff --git a/docs/api-reference/collaborators-and-deploy-keys/add-a-deploy-key.mdx b/docs/api-reference/collaborators-and-deploy-keys/add-a-deploy-key.mdx new file mode 100644 index 00000000000..ffec1d36fa1 --- /dev/null +++ b/docs/api-reference/collaborators-and-deploy-keys/add-a-deploy-key.mdx @@ -0,0 +1,4 @@ +--- +title: "Add a deploy key" +openapi: "POST /repos/{owner}/{repo}/keys" +--- diff --git a/docs/api-reference/collaborators-and-deploy-keys/check-if-user-is-collaborator.mdx b/docs/api-reference/collaborators-and-deploy-keys/check-if-user-is-collaborator.mdx new file mode 100644 index 00000000000..7a72e35c5a9 --- /dev/null +++ b/docs/api-reference/collaborators-and-deploy-keys/check-if-user-is-collaborator.mdx @@ -0,0 +1,4 @@ +--- +title: "Check if a user is a collaborator" +openapi: "GET /repos/{owner}/{repo}/collaborators/{collaborator}" +--- diff --git a/docs/api-reference/collaborators-and-deploy-keys/get-a-deploy-key.mdx b/docs/api-reference/collaborators-and-deploy-keys/get-a-deploy-key.mdx new file mode 100644 index 00000000000..99baeb2040e --- /dev/null +++ b/docs/api-reference/collaborators-and-deploy-keys/get-a-deploy-key.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a deploy key" +openapi: "GET /repos/{owner}/{repo}/keys/{id}" +--- diff --git a/docs/api-reference/collaborators-and-deploy-keys/list-collaborators.mdx b/docs/api-reference/collaborators-and-deploy-keys/list-collaborators.mdx new file mode 100644 index 00000000000..c02ea52902e --- /dev/null +++ b/docs/api-reference/collaborators-and-deploy-keys/list-collaborators.mdx @@ -0,0 +1,4 @@ +--- +title: "List collaborators" +openapi: "GET /repos/{owner}/{repo}/collaborators" +--- diff --git a/docs/api-reference/collaborators-and-deploy-keys/list-deploy-keys.mdx b/docs/api-reference/collaborators-and-deploy-keys/list-deploy-keys.mdx new file mode 100644 index 00000000000..7337877b048 --- /dev/null +++ b/docs/api-reference/collaborators-and-deploy-keys/list-deploy-keys.mdx @@ -0,0 +1,4 @@ +--- +title: "List deploy keys" +openapi: "GET /repos/{owner}/{repo}/keys" +--- diff --git a/docs/api-reference/collaborators-and-deploy-keys/remove-a-collaborator.mdx b/docs/api-reference/collaborators-and-deploy-keys/remove-a-collaborator.mdx new file mode 100644 index 00000000000..5c82d3691e9 --- /dev/null +++ b/docs/api-reference/collaborators-and-deploy-keys/remove-a-collaborator.mdx @@ -0,0 +1,4 @@ +--- +title: "Remove a collaborator" +openapi: "DELETE /repos/{owner}/{repo}/collaborators/{collaborator}" +--- diff --git a/docs/api-reference/collaborators-and-deploy-keys/remove-a-deploy-key.mdx b/docs/api-reference/collaborators-and-deploy-keys/remove-a-deploy-key.mdx new file mode 100644 index 00000000000..5d69127612d --- /dev/null +++ b/docs/api-reference/collaborators-and-deploy-keys/remove-a-deploy-key.mdx @@ -0,0 +1,4 @@ +--- +title: "Remove a deploy key" +openapi: "DELETE /repos/{owner}/{repo}/keys/{id}" +--- diff --git a/docs/api-reference/introduction.mdx b/docs/api-reference/introduction.mdx new file mode 100644 index 00000000000..7a17718eea0 --- /dev/null +++ b/docs/api-reference/introduction.mdx @@ -0,0 +1,104 @@ +--- +title: "Introduction" +sidebarTitle: "Introduction" +description: "Overview of the Gogs API including authentication, pagination, and schema" +--- + +The Gogs API provides a RESTful interface for interacting with your Gogs instance programmatically. It aims to follow a format similar to the [GitHub REST API v3](https://developer.github.com/v3/). + + + The API is bundled with every Gogs installation. No additional setup is required. + + + + The API is still in its early stages. Content and endpoints are subject to change. + + +## Current version + +All Gogs APIs are under **v1** using the request path prefix `/api/v1`. + +``` +https://gogs.example.com/api/v1 +``` + +## Schema + +All data is sent and received as **JSON** unless specified otherwise. + +```http +HTTP/2 200 +Content-Type: application/json; charset=UTF-8 +``` + +All timestamps are returned in **RFC 3339** format: + +``` +YYYY-MM-DDTHH:MM:SSZ +2006-01-02T15:04:05Z07:00 +``` + +## Authentication + +There are two ways to authenticate through the Gogs API. Requests that require authentication will return `404 Not Found` instead of `403 Forbidden` in some places. This is to prevent the accidental leakage of private resources to unauthorized users. + + + + Basic authentication is used to obtain access tokens. Supply your username (you will be prompted for your password): + + ```bash + curl -u "alice" https://gogs.example.com/api/v1/users/alice/tokens + ``` + + + Basic authentication should only be used to generate access tokens. Do not use it for regular API requests. + + + + Personal access tokens must be sent via the `Authorization` request header. + + ```bash + curl -H "Authorization: token {YOUR_ACCESS_TOKEN}" https://gogs.example.com/api/v1/user/repos + ``` + + + +## Pagination + +API responses that return multiple items are paginated. You can specify further pages with the `?page` query parameter. + +```bash +curl https://gogs.example.com/api/v1/repos/alice/hello/issues?page=1 +``` + +Page numbering is **1-based**. Omitting the `?page` parameter returns the first page. + +### Link header + +Pagination info is included in the [Link header](http://tools.ietf.org/html/rfc5988) of each response. Use this to navigate between pages programmatically. + +```http +Link: ; rel="next", + ; rel="last" +``` + +The possible `rel` values are: + +| Name | Description | +|---|---| +| `next` | The link relation for the immediate next page of results. | +| `last` | The link relation for the last page of results. | +| `first` | The link relation for the first page of results. | +| `prev` | The link relation for the immediate previous page of results. | + + + Always use the Link header values to navigate between pages rather than constructing URLs manually. + + +## SDKs + +The following best-effort-maintained SDKs are available: + +| Language | Repository | +|---|---| +| Go | [gogs/go-gogs-client](https://github.com/gogs/go-gogs-client) | diff --git a/docs/api-reference/issues/add-labels-to-an-issue.mdx b/docs/api-reference/issues/add-labels-to-an-issue.mdx new file mode 100644 index 00000000000..4654764a22c --- /dev/null +++ b/docs/api-reference/issues/add-labels-to-an-issue.mdx @@ -0,0 +1,4 @@ +--- +title: "Add labels to an issue" +openapi: "POST /repos/{owner}/{repo}/issues/{index}/labels" +--- diff --git a/docs/api-reference/issues/create-a-comment.mdx b/docs/api-reference/issues/create-a-comment.mdx new file mode 100644 index 00000000000..cbfb7b47e0f --- /dev/null +++ b/docs/api-reference/issues/create-a-comment.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a comment" +openapi: "POST /repos/{owner}/{repo}/issues/{index}/comments" +--- diff --git a/docs/api-reference/issues/create-a-label.mdx b/docs/api-reference/issues/create-a-label.mdx new file mode 100644 index 00000000000..c56f1d01612 --- /dev/null +++ b/docs/api-reference/issues/create-a-label.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a label" +openapi: "POST /repos/{owner}/{repo}/labels" +--- diff --git a/docs/api-reference/issues/create-a-milestone.mdx b/docs/api-reference/issues/create-a-milestone.mdx new file mode 100644 index 00000000000..334bdf84e1a --- /dev/null +++ b/docs/api-reference/issues/create-a-milestone.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a milestone" +openapi: "POST /repos/{owner}/{repo}/milestones" +--- diff --git a/docs/api-reference/issues/create-an-issue.mdx b/docs/api-reference/issues/create-an-issue.mdx new file mode 100644 index 00000000000..54b82b93622 --- /dev/null +++ b/docs/api-reference/issues/create-an-issue.mdx @@ -0,0 +1,4 @@ +--- +title: "Create an issue" +openapi: "POST /repos/{owner}/{repo}/issues" +--- diff --git a/docs/api-reference/issues/delete-a-comment.mdx b/docs/api-reference/issues/delete-a-comment.mdx new file mode 100644 index 00000000000..1eabf89a209 --- /dev/null +++ b/docs/api-reference/issues/delete-a-comment.mdx @@ -0,0 +1,4 @@ +--- +title: "Delete a comment" +openapi: "DELETE /repos/{owner}/{repo}/issues/{index}/comments/{id}" +--- diff --git a/docs/api-reference/issues/delete-a-label.mdx b/docs/api-reference/issues/delete-a-label.mdx new file mode 100644 index 00000000000..9fcf0765ae0 --- /dev/null +++ b/docs/api-reference/issues/delete-a-label.mdx @@ -0,0 +1,4 @@ +--- +title: "Delete a label" +openapi: "DELETE /repos/{owner}/{repo}/labels/{id}" +--- diff --git a/docs/api-reference/issues/delete-a-milestone.mdx b/docs/api-reference/issues/delete-a-milestone.mdx new file mode 100644 index 00000000000..46abc978d6c --- /dev/null +++ b/docs/api-reference/issues/delete-a-milestone.mdx @@ -0,0 +1,4 @@ +--- +title: "Delete a milestone" +openapi: "DELETE /repos/{owner}/{repo}/milestones/{id}" +--- diff --git a/docs/api-reference/issues/edit-a-comment.mdx b/docs/api-reference/issues/edit-a-comment.mdx new file mode 100644 index 00000000000..bddb514ec56 --- /dev/null +++ b/docs/api-reference/issues/edit-a-comment.mdx @@ -0,0 +1,4 @@ +--- +title: "Edit a comment" +openapi: "PATCH /repos/{owner}/{repo}/issues/{index}/comments/{id}" +--- diff --git a/docs/api-reference/issues/edit-a-milestone.mdx b/docs/api-reference/issues/edit-a-milestone.mdx new file mode 100644 index 00000000000..237b34705c5 --- /dev/null +++ b/docs/api-reference/issues/edit-a-milestone.mdx @@ -0,0 +1,4 @@ +--- +title: "Edit a milestone" +openapi: "PATCH /repos/{owner}/{repo}/milestones/{id}" +--- diff --git a/docs/api-reference/issues/edit-an-issue.mdx b/docs/api-reference/issues/edit-an-issue.mdx new file mode 100644 index 00000000000..75cbcc26828 --- /dev/null +++ b/docs/api-reference/issues/edit-an-issue.mdx @@ -0,0 +1,4 @@ +--- +title: "Edit an issue" +openapi: "PATCH /repos/{owner}/{repo}/issues/{index}" +--- diff --git a/docs/api-reference/issues/get-a-single-issue.mdx b/docs/api-reference/issues/get-a-single-issue.mdx new file mode 100644 index 00000000000..d2c2aa09037 --- /dev/null +++ b/docs/api-reference/issues/get-a-single-issue.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a single issue" +openapi: "GET /repos/{owner}/{repo}/issues/{index}" +--- diff --git a/docs/api-reference/issues/get-a-single-label.mdx b/docs/api-reference/issues/get-a-single-label.mdx new file mode 100644 index 00000000000..08a72457d0e --- /dev/null +++ b/docs/api-reference/issues/get-a-single-label.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a single label" +openapi: "GET /repos/{owner}/{repo}/labels/{id}" +--- diff --git a/docs/api-reference/issues/get-a-single-milestone.mdx b/docs/api-reference/issues/get-a-single-milestone.mdx new file mode 100644 index 00000000000..259f6a8c12a --- /dev/null +++ b/docs/api-reference/issues/get-a-single-milestone.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a single milestone" +openapi: "GET /repos/{owner}/{repo}/milestones/{id}" +--- diff --git a/docs/api-reference/issues/list-all-labels-for-a-repository.mdx b/docs/api-reference/issues/list-all-labels-for-a-repository.mdx new file mode 100644 index 00000000000..54e637828bc --- /dev/null +++ b/docs/api-reference/issues/list-all-labels-for-a-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "List all labels for a repository" +openapi: "GET /repos/{owner}/{repo}/labels" +--- diff --git a/docs/api-reference/issues/list-comments-in-a-repository.mdx b/docs/api-reference/issues/list-comments-in-a-repository.mdx new file mode 100644 index 00000000000..0790c65efdd --- /dev/null +++ b/docs/api-reference/issues/list-comments-in-a-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "List comments in a repository" +openapi: "GET /repos/{owner}/{repo}/issues/comments" +--- diff --git a/docs/api-reference/issues/list-comments-on-an-issue.mdx b/docs/api-reference/issues/list-comments-on-an-issue.mdx new file mode 100644 index 00000000000..794d754c292 --- /dev/null +++ b/docs/api-reference/issues/list-comments-on-an-issue.mdx @@ -0,0 +1,4 @@ +--- +title: "List comments on an issue" +openapi: "GET /repos/{owner}/{repo}/issues/{index}/comments" +--- diff --git a/docs/api-reference/issues/list-issues-for-a-repository.mdx b/docs/api-reference/issues/list-issues-for-a-repository.mdx new file mode 100644 index 00000000000..70d584c4232 --- /dev/null +++ b/docs/api-reference/issues/list-issues-for-a-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "List issues for a repository" +openapi: "GET /repos/{owner}/{repo}/issues" +--- diff --git a/docs/api-reference/issues/list-labels-on-an-issue.mdx b/docs/api-reference/issues/list-labels-on-an-issue.mdx new file mode 100644 index 00000000000..ffe0dd663be --- /dev/null +++ b/docs/api-reference/issues/list-labels-on-an-issue.mdx @@ -0,0 +1,4 @@ +--- +title: "List labels on an issue" +openapi: "GET /repos/{owner}/{repo}/issues/{index}/labels" +--- diff --git a/docs/api-reference/issues/list-milestones-for-a-repository.mdx b/docs/api-reference/issues/list-milestones-for-a-repository.mdx new file mode 100644 index 00000000000..99861194b7e --- /dev/null +++ b/docs/api-reference/issues/list-milestones-for-a-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "List milestones for a repository" +openapi: "GET /repos/{owner}/{repo}/milestones" +--- diff --git a/docs/api-reference/issues/list-user-issues.mdx b/docs/api-reference/issues/list-user-issues.mdx new file mode 100644 index 00000000000..2405acfc4ef --- /dev/null +++ b/docs/api-reference/issues/list-user-issues.mdx @@ -0,0 +1,4 @@ +--- +title: "List user issues" +openapi: "GET /user/issues" +--- diff --git a/docs/api-reference/issues/remove-a-label-from-an-issue.mdx b/docs/api-reference/issues/remove-a-label-from-an-issue.mdx new file mode 100644 index 00000000000..01ca1a93a70 --- /dev/null +++ b/docs/api-reference/issues/remove-a-label-from-an-issue.mdx @@ -0,0 +1,4 @@ +--- +title: "Remove a label from an issue" +openapi: "DELETE /repos/{owner}/{repo}/issues/{index}/labels/{id}" +--- diff --git a/docs/api-reference/issues/remove-all-labels-from-an-issue.mdx b/docs/api-reference/issues/remove-all-labels-from-an-issue.mdx new file mode 100644 index 00000000000..0abe3f6e932 --- /dev/null +++ b/docs/api-reference/issues/remove-all-labels-from-an-issue.mdx @@ -0,0 +1,4 @@ +--- +title: "Remove all labels from an issue" +openapi: "DELETE /repos/{owner}/{repo}/issues/{index}/labels" +--- diff --git a/docs/api-reference/issues/replace-all-labels-for-an-issue.mdx b/docs/api-reference/issues/replace-all-labels-for-an-issue.mdx new file mode 100644 index 00000000000..1cf81000057 --- /dev/null +++ b/docs/api-reference/issues/replace-all-labels-for-an-issue.mdx @@ -0,0 +1,4 @@ +--- +title: "Replace all labels for an issue" +openapi: "PUT /repos/{owner}/{repo}/issues/{index}/labels" +--- diff --git a/docs/api-reference/issues/update-a-label.mdx b/docs/api-reference/issues/update-a-label.mdx new file mode 100644 index 00000000000..a95f044eb09 --- /dev/null +++ b/docs/api-reference/issues/update-a-label.mdx @@ -0,0 +1,4 @@ +--- +title: "Update a label" +openapi: "PATCH /repos/{owner}/{repo}/labels/{id}" +--- diff --git a/docs/api-reference/miscellaneous/get-a-git-blob.mdx b/docs/api-reference/miscellaneous/get-a-git-blob.mdx new file mode 100644 index 00000000000..dfc991ba2c4 --- /dev/null +++ b/docs/api-reference/miscellaneous/get-a-git-blob.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a git blob" +openapi: "GET /repos/{owner}/{repo}/git/blobs/{sha}" +--- diff --git a/docs/api-reference/miscellaneous/get-a-tree.mdx b/docs/api-reference/miscellaneous/get-a-tree.mdx new file mode 100644 index 00000000000..7c1f6add12f --- /dev/null +++ b/docs/api-reference/miscellaneous/get-a-tree.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a tree" +openapi: "GET /repos/{owner}/{repo}/git/trees/{sha}" +--- diff --git a/docs/api-reference/miscellaneous/render-a-markdown-document-in-raw-mode.mdx b/docs/api-reference/miscellaneous/render-a-markdown-document-in-raw-mode.mdx new file mode 100644 index 00000000000..cbcf9815d74 --- /dev/null +++ b/docs/api-reference/miscellaneous/render-a-markdown-document-in-raw-mode.mdx @@ -0,0 +1,4 @@ +--- +title: "Render a Markdown document in raw mode" +openapi: "POST /markdown/raw" +--- diff --git a/docs/api-reference/miscellaneous/render-a-markdown-document.mdx b/docs/api-reference/miscellaneous/render-a-markdown-document.mdx new file mode 100644 index 00000000000..5d79fcfca96 --- /dev/null +++ b/docs/api-reference/miscellaneous/render-a-markdown-document.mdx @@ -0,0 +1,4 @@ +--- +title: "Render a Markdown document" +openapi: "POST /markdown" +--- diff --git a/docs/api-reference/openapi.json b/docs/api-reference/openapi.json new file mode 100644 index 00000000000..3219124adfe --- /dev/null +++ b/docs/api-reference/openapi.json @@ -0,0 +1,6262 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Gogs API", + "version": "v1", + "description": "RESTful API for interacting with your Gogs instance. Follows a format similar to the GitHub REST API v3." + }, + "servers": [ + { + "url": "https://gogs.example.com/api/v1" + } + ], + "security": [ + { + "AccessToken": [] + } + ], + "tags": [ + { + "name": "Repositories", + "description": "Create, search, and manage repositories, branches, commits, and contents" + }, + { + "name": "Collaborators and Deploy Keys", + "description": "Manage repository collaborators and deploy keys" + }, + { + "name": "Releases", + "description": "List repository releases" + }, + { + "name": "Webhooks", + "description": "Create, edit, and delete repository webhooks" + }, + { + "name": "Issues", + "description": "Manage issues, comments, labels, and milestones" + }, + { + "name": "Users", + "description": "Search users, manage access tokens, emails, followers, and public keys" + }, + { + "name": "Organizations", + "description": "Manage organizations, members, and teams" + }, + { + "name": "Administration", + "description": "Site administration endpoints (requires admin privileges)" + }, + { + "name": "Miscellaneous", + "description": "Markdown rendering and Git data endpoints" + } + ], + "paths": { + "/repos/search": { + "get": { + "operationId": "searchRepos", + "summary": "Search repositories", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Repository" + } + }, + "ok": { + "type": "boolean" + } + } + } + } + } + } + }, + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string" + }, + "description": "Search keyword" + }, + { + "name": "uid", + "in": "query", + "required": false, + "schema": { + "type": "integer" + }, + "description": "User ID to filter by" + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 10 + }, + "description": "Max results" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 1 + }, + "description": "Page number" + } + ] + } + }, + "/user/repos": { + "get": { + "operationId": "listYourRepos", + "summary": "List your repositories", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Repository" + } + } + } + } + } + } + }, + "post": { + "operationId": "createRepo", + "summary": "Create a repository", + "tags": [ + "Repositories" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Repository" + } + } + } + }, + "422": { + "description": "Validation error." + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "private": { + "type": "boolean", + "default": false + }, + "auto_init": { + "type": "boolean", + "default": false + }, + "gitignores": { + "type": "string" + }, + "license": { + "type": "string" + }, + "readme": { + "type": "string", + "default": "Default" + } + }, + "required": [ + "name" + ] + } + } + } + } + } + }, + "/users/{username}/repos": { + "get": { + "operationId": "listUserRepos", + "summary": "List user repositories", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Repository" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ] + } + }, + "/orgs/{orgname}/repos": { + "get": { + "operationId": "listOrgRepos", + "summary": "List organization repositories", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Repository" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "orgname", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Organization name" + } + ] + } + }, + "/org/{org}/repos": { + "post": { + "operationId": "createOrgRepo", + "summary": "Create a repository in an organization", + "tags": [ + "Repositories" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Repository" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "org", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Organization name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "private": { + "type": "boolean", + "default": false + }, + "auto_init": { + "type": "boolean", + "default": false + }, + "gitignores": { + "type": "string" + }, + "license": { + "type": "string" + }, + "readme": { + "type": "string", + "default": "Default" + } + }, + "required": [ + "name" + ] + } + } + } + }, + "description": "The authenticated user must be an owner of the specified organization." + } + }, + "/repos/migrate": { + "post": { + "operationId": "migrateRepo", + "summary": "Migrate a repository", + "tags": [ + "Repositories" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Repository" + } + } + } + }, + "422": { + "description": "Validation error." + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "clone_addr": { + "type": "string" + }, + "auth_username": { + "type": "string" + }, + "auth_password": { + "type": "string" + }, + "uid": { + "type": "integer" + }, + "repo_name": { + "type": "string" + }, + "mirror": { + "type": "boolean", + "default": false + }, + "private": { + "type": "boolean", + "default": false + }, + "description": { + "type": "string" + } + }, + "required": [ + "clone_addr", + "uid", + "repo_name" + ] + } + } + } + } + } + }, + "/repos/{owner}/{repo}": { + "get": { + "operationId": "getRepo", + "summary": "Get a repository", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Repository" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ] + }, + "delete": { + "operationId": "deleteRepo", + "summary": "Delete a repository", + "tags": [ + "Repositories" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "description": "Requires owner access to the repository." + } + }, + "/repos/{owner}/{repo}/issue-tracker": { + "patch": { + "operationId": "editIssueTracker", + "summary": "Edit issue tracker settings", + "tags": [ + "Repositories" + ], + "responses": { + "204": { + "description": "Settings updated successfully." + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "enable_issues": { + "type": "boolean" + }, + "enable_external_tracker": { + "type": "boolean" + }, + "external_tracker_url": { + "type": "string" + }, + "tracker_url_format": { + "type": "string" + }, + "tracker_issue_style": { + "type": "string", + "enum": [ + "numeric", + "alphanumeric" + ] + } + } + } + } + } + } + } + }, + "/repos/{owner}/{repo}/mirror-sync": { + "post": { + "operationId": "mirrorSync", + "summary": "Mirror sync", + "tags": [ + "Repositories" + ], + "responses": { + "202": { + "description": "Mirror sync has been queued." + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "description": "Add a mirror repository to the sync queue. Returns 404 if the repository is not a mirror." + } + }, + "/repos/{owner}/{repo}/branches": { + "get": { + "operationId": "listBranches", + "summary": "List branches", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Branch" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ] + } + }, + "/repos/{owner}/{repo}/branches/{branch}": { + "get": { + "operationId": "getBranch", + "summary": "Get a branch", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Branch" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "branch", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Branch name" + } + ] + } + }, + "/repos/{owner}/{repo}/commits/{sha}": { + "get": { + "operationId": "getCommit", + "summary": "Get a single commit", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Commit" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "sha", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Commit SHA" + } + ], + "description": "Get details for a single commit. Set Accept header to application/vnd.gogs.sha to return only the SHA-1 hash of a commit reference." + } + }, + "/repos/{owner}/{repo}/raw/{ref}/{filepath}": { + "get": { + "operationId": "getRawContent", + "summary": "Download raw content", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Raw file content", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "ref", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Branch, tag, or commit" + }, + { + "name": "filepath", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "File path" + } + ] + } + }, + "/repos/{owner}/{repo}/archive/{archive}": { + "get": { + "operationId": "downloadArchive", + "summary": "Download archive", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Archive file", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "archive", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Ref and format, e.g. master.zip or master.tar.gz" + } + ] + } + }, + "/repos/{owner}/{repo}/contents/{path}": { + "get": { + "operationId": "getContents", + "summary": "Get contents", + "tags": [ + "Repositories" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Content" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "path", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "File or directory path" + }, + { + "name": "ref", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "Branch, tag, or commit. Defaults to the default branch." + } + ], + "description": "Get the contents of a file, directory, symlink, or submodule in a repository." + }, + "put": { + "operationId": "putContents", + "summary": "Create or update a file", + "description": "Creates or updates a file in the repository. The content must be base64 encoded.", + "tags": [ + "Repositories" + ], + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Owner of the repository" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Name of the repository" + }, + { + "name": "path", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Path of the file to create or update" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Commit message" + }, + "content": { + "type": "string", + "description": "Base64-encoded file content" + }, + "branch": { + "type": "string", + "description": "Branch to commit to. Defaults to the repository's default branch." + } + }, + "required": [ + "message", + "content" + ] + } + } + } + }, + "responses": { + "201": { + "description": "File created or updated successfully.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/components/schemas/Content" + }, + "commit": { + "$ref": "#/components/schemas/Commit" + } + } + } + } + } + }, + "404": { + "description": "Repository not found." + }, + "422": { + "description": "Validation error." + } + } + } + }, + "/repos/{owner}/{repo}/collaborators": { + "get": { + "operationId": "listCollaborators", + "summary": "List collaborators", + "tags": [ + "Collaborators and Deploy Keys" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Collaborator" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ] + } + }, + "/repos/{owner}/{repo}/collaborators/{collaborator}": { + "put": { + "operationId": "addCollaborator", + "summary": "Add a collaborator", + "tags": [ + "Collaborators and Deploy Keys" + ], + "responses": { + "204": { + "description": "Collaborator has been added." + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "collaborator", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Collaborator username" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "permission": { + "type": "string", + "enum": [ + "read", + "write", + "admin" + ], + "default": "write" + } + } + } + } + } + } + }, + "delete": { + "operationId": "removeCollaborator", + "summary": "Remove a collaborator", + "tags": [ + "Collaborators and Deploy Keys" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "collaborator", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Collaborator username" + } + ] + }, + "get": { + "operationId": "isCollaborator", + "summary": "Check if a user is a collaborator", + "description": "Returns 204 if the user is a collaborator, 404 if not.", + "tags": [ + "Collaborators and Deploy Keys" + ], + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Owner of the repository" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Name of the repository" + }, + { + "name": "collaborator", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username to check" + } + ], + "responses": { + "204": { + "description": "User is a collaborator." + }, + "404": { + "description": "User is not a collaborator." + }, + "422": { + "description": "The specified user does not exist." + } + } + } + }, + "/repos/{owner}/{repo}/keys": { + "get": { + "operationId": "listDeployKeys", + "summary": "List deploy keys", + "tags": [ + "Collaborators and Deploy Keys" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeployKey" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ] + }, + "post": { + "operationId": "createDeployKey", + "summary": "Add a deploy key", + "tags": [ + "Collaborators and Deploy Keys" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeployKey" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "key": { + "type": "string" + } + }, + "required": [ + "title", + "key" + ] + } + } + } + } + } + }, + "/repos/{owner}/{repo}/keys/{id}": { + "get": { + "operationId": "getDeployKey", + "summary": "Get a deploy key", + "tags": [ + "Collaborators and Deploy Keys" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeployKey" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Key ID" + } + ] + }, + "delete": { + "operationId": "removeDeployKey", + "summary": "Remove a deploy key", + "tags": [ + "Collaborators and Deploy Keys" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Key ID" + } + ] + } + }, + "/repos/{owner}/{repo}/releases": { + "get": { + "operationId": "listReleases", + "summary": "List releases", + "tags": [ + "Releases" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Release" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ] + } + }, + "/repos/{owner}/{repo}/hooks": { + "get": { + "operationId": "listHooks", + "summary": "List hooks", + "tags": [ + "Webhooks" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Hook" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ] + }, + "post": { + "operationId": "createHook", + "summary": "Create a hook", + "tags": [ + "Webhooks" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Hook" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "gogs", + "slack", + "discord", + "dingtalk" + ] + }, + "config": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "content_type": { + "type": "string", + "enum": [ + "json", + "form" + ] + }, + "secret": { + "type": "string" + } + }, + "required": [ + "url", + "content_type" + ] + }, + "events": { + "type": "array", + "items": { + "type": "string" + }, + "default": [ + "push" + ] + }, + "active": { + "type": "boolean", + "default": false + } + }, + "required": [ + "type", + "config" + ] + } + } + } + } + } + }, + "/repos/{owner}/{repo}/hooks/{id}": { + "patch": { + "operationId": "editHook", + "summary": "Edit a hook", + "tags": [ + "Webhooks" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Hook" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Hook ID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "config": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "content_type": { + "type": "string" + }, + "secret": { + "type": "string" + } + } + }, + "events": { + "type": "array", + "items": { + "type": "string" + } + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "config" + ] + } + } + } + } + }, + "delete": { + "operationId": "deleteHook", + "summary": "Delete a hook", + "tags": [ + "Webhooks" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Hook ID" + } + ] + } + }, + "/repos/{owner}/{repo}/issues": { + "get": { + "operationId": "listIssues", + "summary": "List issues for a repository", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Issue" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "description": "This endpoint may also return pull requests. If an issue is a pull request, the object will include a pull_request key." + }, + "post": { + "operationId": "createIssue", + "summary": "Create an issue", + "tags": [ + "Issues" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Issue" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "body": { + "type": "string" + }, + "assignee": { + "type": "string" + }, + "milestone": { + "type": "integer" + }, + "labels": { + "type": "array", + "items": { + "type": "integer" + } + }, + "closed": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ] + } + } + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}": { + "get": { + "operationId": "getIssue", + "summary": "Get a single issue", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Issue" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + } + ] + }, + "patch": { + "operationId": "editIssue", + "summary": "Edit an issue", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Issue" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "body": { + "type": "string" + }, + "assignee": { + "type": "string" + }, + "milestone": { + "type": "integer" + }, + "state": { + "type": "string", + "enum": [ + "open", + "closed" + ] + } + } + } + } + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/comments": { + "get": { + "operationId": "listIssueComments", + "summary": "List comments on an issue", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Comment" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "Only comments updated at or after this time (RFC 3339)" + } + ] + }, + "post": { + "operationId": "createComment", + "summary": "Create a comment", + "tags": [ + "Issues" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Comment" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "body": { + "type": "string" + } + }, + "required": [ + "body" + ] + } + } + } + } + } + }, + "/repos/{owner}/{repo}/issues/comments": { + "get": { + "operationId": "listRepoComments", + "summary": "List comments in a repository", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Comment" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "description": "Only comments updated at or after this time (RFC 3339)" + } + ] + } + }, + "/repos/{owner}/{repo}/issues/{index}/comments/{id}": { + "patch": { + "operationId": "editComment", + "summary": "Edit a comment", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Comment" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Comment ID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "body": { + "type": "string" + } + }, + "required": [ + "body" + ] + } + } + } + } + }, + "delete": { + "operationId": "deleteComment", + "summary": "Delete a comment", + "tags": [ + "Issues" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Comment ID" + } + ] + } + }, + "/repos/{owner}/{repo}/labels": { + "get": { + "operationId": "listLabels", + "summary": "List all labels for a repository", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Label" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ] + }, + "post": { + "operationId": "createLabel", + "summary": "Create a label", + "tags": [ + "Issues" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "color": { + "type": "string", + "description": "Hex color code with leading #" + } + }, + "required": [ + "name", + "color" + ] + } + } + } + } + } + }, + "/repos/{owner}/{repo}/labels/{id}": { + "get": { + "operationId": "getLabel", + "summary": "Get a single label", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Label ID" + } + ] + }, + "patch": { + "operationId": "updateLabel", + "summary": "Update a label", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Label ID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "color": { + "type": "string" + } + } + } + } + } + } + }, + "delete": { + "operationId": "deleteLabel", + "summary": "Delete a label", + "tags": [ + "Issues" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Label ID" + } + ] + } + }, + "/repos/{owner}/{repo}/issues/{index}/labels": { + "get": { + "operationId": "listIssueLabels", + "summary": "List labels on an issue", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Label" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + } + ] + }, + "post": { + "operationId": "addIssueLabels", + "summary": "Add labels to an issue", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Label" + } + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "labels": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "labels" + ] + } + } + } + } + }, + "put": { + "operationId": "replaceIssueLabels", + "summary": "Replace all labels for an issue", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Label" + } + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "labels": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": [ + "labels" + ] + } + } + } + } + }, + "delete": { + "operationId": "removeAllIssueLabels", + "summary": "Remove all labels from an issue", + "tags": [ + "Issues" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + } + ] + } + }, + "/repos/{owner}/{repo}/issues/{index}/labels/{id}": { + "delete": { + "operationId": "removeIssueLabel", + "summary": "Remove a label from an issue", + "tags": [ + "Issues" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "index", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Issue index" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Label ID" + } + ] + } + }, + "/repos/{owner}/{repo}/milestones": { + "get": { + "operationId": "listMilestones", + "summary": "List milestones for a repository", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Milestone" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ] + }, + "post": { + "operationId": "createMilestone", + "summary": "Create a milestone", + "tags": [ + "Issues" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Milestone" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "due_on": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "title" + ] + } + } + } + } + } + }, + "/repos/{owner}/{repo}/milestones/{id}": { + "get": { + "operationId": "getMilestone", + "summary": "Get a single milestone", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Milestone" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Milestone ID" + } + ] + }, + "patch": { + "operationId": "editMilestone", + "summary": "Edit a milestone", + "tags": [ + "Issues" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Milestone" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Milestone ID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "due_on": { + "type": "string", + "format": "date-time" + }, + "state": { + "type": "string", + "enum": [ + "open", + "closed" + ] + } + } + } + } + } + } + }, + "delete": { + "operationId": "deleteMilestone", + "summary": "Delete a milestone", + "tags": [ + "Issues" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Milestone ID" + } + ], + "description": "Only users with write access to a repository can delete a milestone." + } + }, + "/users/search": { + "get": { + "operationId": "searchUsers", + "summary": "Search for users", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + }, + "ok": { + "type": "boolean" + } + } + } + } + } + } + }, + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string" + }, + "description": "Keyword of username" + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 10 + }, + "description": "Max results" + } + ], + "description": "Requests without authentication will return an empty email field for anti-spam purposes." + } + }, + "/users/{username}": { + "get": { + "operationId": "getUser", + "summary": "Get a single user", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ] + } + }, + "/user": { + "get": { + "operationId": "getAuthenticatedUser", + "summary": "Get the authenticated user", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + } + }, + "/users/{username}/tokens": { + "get": { + "operationId": "listAccessTokens", + "summary": "List access tokens", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccessToken" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ], + "security": [ + { + "BasicAuth": [] + } + ], + "description": "Requires basic authentication." + }, + "post": { + "operationId": "createAccessToken", + "summary": "Create an access token", + "tags": [ + "Users" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccessToken" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + } + } + }, + "security": [ + { + "BasicAuth": [] + } + ], + "description": "Requires basic authentication." + } + }, + "/user/emails": { + "get": { + "operationId": "listEmails", + "summary": "List email addresses", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Email" + } + } + } + } + } + } + }, + "post": { + "operationId": "addEmails", + "summary": "Add email addresses", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Email" + } + } + } + } + }, + "422": { + "description": "Validation error." + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "emails": { + "type": "array", + "items": { + "type": "string", + "format": "email" + } + } + }, + "required": [ + "emails" + ] + } + } + } + } + }, + "delete": { + "operationId": "deleteEmails", + "summary": "Delete email addresses", + "tags": [ + "Users" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "emails": { + "type": "array", + "items": { + "type": "string", + "format": "email" + } + } + }, + "required": [ + "emails" + ] + } + } + } + } + } + }, + "/users/{username}/followers": { + "get": { + "operationId": "listUserFollowers", + "summary": "List followers of a user", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ] + } + }, + "/user/followers": { + "get": { + "operationId": "listMyFollowers", + "summary": "List your followers", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + } + } + }, + "/users/{username}/following": { + "get": { + "operationId": "listUserFollowing", + "summary": "List users followed by a user", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ] + } + }, + "/user/following": { + "get": { + "operationId": "listMyFollowing", + "summary": "List who you are following", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + } + } + }, + "/user/following/{target}": { + "get": { + "operationId": "checkFollowing", + "summary": "Check if you follow a user", + "tags": [ + "Users" + ], + "responses": { + "204": { + "description": "The user is being followed." + }, + "404": { + "description": "Not following" + } + }, + "parameters": [ + { + "name": "target", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Target username" + } + ] + }, + "put": { + "operationId": "followUser", + "summary": "Follow a user", + "tags": [ + "Users" + ], + "responses": { + "204": { + "description": "Successfully followed the user." + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "target", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Target username" + } + ] + }, + "delete": { + "operationId": "unfollowUser", + "summary": "Unfollow a user", + "tags": [ + "Users" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "target", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Target username" + } + ] + } + }, + "/users/{username}/following/{target}": { + "get": { + "operationId": "checkUserFollowing", + "summary": "Check if a user follows another", + "tags": [ + "Users" + ], + "responses": { + "204": { + "description": "The user is being followed." + }, + "404": { + "description": "Not following" + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + }, + { + "name": "target", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Target username" + } + ] + } + }, + "/users/{username}/keys": { + "get": { + "operationId": "listUserKeys", + "summary": "List public keys for a user", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PublicKey" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ] + } + }, + "/user/keys/{id}": { + "get": { + "operationId": "getPublicKey", + "summary": "Get a single public key", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicKey" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Key ID" + } + ] + }, + "delete": { + "operationId": "deletePublicKey", + "summary": "Delete a public key", + "tags": [ + "Users" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Key ID" + } + ] + } + }, + "/user/keys": { + "get": { + "operationId": "listMyKeys", + "summary": "List your public keys", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PublicKey" + } + } + } + } + } + } + }, + "post": { + "operationId": "createPublicKey", + "summary": "Create a public key", + "tags": [ + "Users" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicKey" + } + } + } + }, + "422": { + "description": "Validation error." + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "key": { + "type": "string" + } + }, + "required": [ + "title", + "key" + ] + } + } + } + } + } + }, + "/user/orgs": { + "get": { + "operationId": "listMyOrgs", + "summary": "List your organizations", + "tags": [ + "Organizations" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Organization" + } + } + } + } + } + } + }, + "post": { + "operationId": "createMyOrg", + "summary": "Create an organization", + "description": "Creates an organization for the authenticated user.", + "tags": [ + "Organizations" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "website": { + "type": "string" + }, + "location": { + "type": "string" + } + }, + "required": [ + "username" + ] + } + } + } + }, + "responses": { + "201": { + "description": "Organization created successfully.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Organization" + } + } + } + }, + "422": { + "description": "Organization name already exists or is not allowed." + } + } + } + }, + "/users/{username}/orgs": { + "get": { + "operationId": "listUserOrgs", + "summary": "List user organizations", + "tags": [ + "Organizations" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Organization" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ] + } + }, + "/orgs/{orgname}": { + "get": { + "operationId": "getOrg", + "summary": "Get an organization", + "tags": [ + "Organizations" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Organization" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "orgname", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Organization name" + } + ] + }, + "patch": { + "operationId": "editOrg", + "summary": "Edit an organization", + "tags": [ + "Organizations" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Organization" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "orgname", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Organization name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "full_name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "website": { + "type": "string" + }, + "location": { + "type": "string" + } + } + } + } + } + } + } + }, + "/orgs/{orgname}/teams": { + "get": { + "operationId": "listOrgTeams", + "summary": "List teams of an organization", + "tags": [ + "Organizations" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Team" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "orgname", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Organization name" + } + ] + } + }, + "/admin/users": { + "post": { + "operationId": "adminCreateUser", + "summary": "Create a new user", + "tags": [ + "Administration" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "422": { + "description": "Validation error." + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "source_id": { + "type": "integer" + }, + "login_name": { + "type": "string" + }, + "username": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string" + }, + "send_notify": { + "type": "boolean" + } + }, + "required": [ + "username", + "email" + ] + } + } + } + }, + "description": "Requires the authenticated user to be a site administrator." + } + }, + "/admin/users/{username}": { + "patch": { + "operationId": "adminEditUser", + "summary": "Edit an existing user", + "tags": [ + "Administration" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "source_id": { + "type": "integer" + }, + "login_name": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "password": { + "type": "string" + }, + "website": { + "type": "string" + }, + "location": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "allow_git_hook": { + "type": "boolean" + }, + "allow_import_local": { + "type": "boolean" + }, + "max_repo_creation": { + "type": "integer", + "description": "Maximum number of repositories the user can create. -1 means no limit." + } + }, + "required": [ + "email" + ] + } + } + } + }, + "description": "Requires the authenticated user to be a site administrator." + }, + "delete": { + "operationId": "adminDeleteUser", + "summary": "Delete a user", + "tags": [ + "Administration" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ], + "description": "Requires the authenticated user to be a site administrator." + } + }, + "/admin/users/{username}/keys": { + "post": { + "operationId": "adminCreateUserKey", + "summary": "Create a public key for a user", + "tags": [ + "Administration" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublicKey" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "key": { + "type": "string" + } + }, + "required": [ + "title", + "key" + ] + } + } + } + }, + "description": "Requires the authenticated user to be a site administrator." + } + }, + "/admin/users/{username}/repos": { + "post": { + "operationId": "adminCreateRepo", + "summary": "Create a repository for a user", + "tags": [ + "Administration" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Repository" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "private": { + "type": "boolean", + "default": false + }, + "auto_init": { + "type": "boolean", + "default": false + }, + "gitignores": { + "type": "string" + }, + "license": { + "type": "string" + }, + "readme": { + "type": "string", + "default": "Default" + } + }, + "required": [ + "name" + ] + } + } + } + }, + "description": "Requires the authenticated user to be a site administrator." + } + }, + "/admin/users/{username}/orgs": { + "post": { + "operationId": "adminCreateOrg", + "summary": "Create an organization", + "tags": [ + "Administration" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Organization" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "website": { + "type": "string" + }, + "location": { + "type": "string" + } + }, + "required": [ + "username" + ] + } + } + } + }, + "description": "Requires the authenticated user to be a site administrator." + } + }, + "/admin/orgs/{orgname}/teams": { + "post": { + "operationId": "adminCreateTeam", + "summary": "Create a team", + "tags": [ + "Administration" + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + } + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "orgname", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Organization name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "permission": { + "type": "string", + "enum": [ + "read", + "write", + "admin" + ], + "default": "read" + } + }, + "required": [ + "name" + ] + } + } + } + }, + "description": "Requires the authenticated user to be a site administrator." + } + }, + "/admin/teams/{teamid}/members": { + "get": { + "operationId": "adminListTeamMembers", + "summary": "List all members of a team", + "tags": [ + "Administration" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "teamid", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Team ID" + } + ], + "description": "Requires the authenticated user to be a site administrator." + } + }, + "/admin/teams/{teamid}/members/{username}": { + "put": { + "operationId": "adminAddTeamMember", + "summary": "Add team membership", + "tags": [ + "Administration" + ], + "responses": { + "204": { + "description": "Team membership has been updated." + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "teamid", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Team ID" + }, + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ], + "description": "Requires the authenticated user to be a site administrator." + }, + "delete": { + "operationId": "adminRemoveTeamMember", + "summary": "Remove team membership", + "tags": [ + "Administration" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "teamid", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Team ID" + }, + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Username" + } + ], + "description": "Requires the authenticated user to be a site administrator." + } + }, + "/admin/teams/{teamid}/repos/{reponame}": { + "put": { + "operationId": "adminAddTeamRepo", + "summary": "Add or update team repository", + "tags": [ + "Administration" + ], + "responses": { + "204": { + "description": "Team repository has been updated." + }, + "404": { + "description": "Resource not found." + }, + "422": { + "description": "Validation error." + } + }, + "parameters": [ + { + "name": "teamid", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Team ID" + }, + { + "name": "reponame", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "description": "Requires the authenticated user to be a site administrator." + }, + "delete": { + "operationId": "adminRemoveTeamRepo", + "summary": "Remove team repository", + "tags": [ + "Administration" + ], + "responses": { + "204": { + "description": "The resource has been successfully deleted." + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "teamid", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Team ID" + }, + { + "name": "reponame", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + } + ], + "description": "Requires the authenticated user to be a site administrator." + } + }, + "/markdown": { + "post": { + "operationId": "renderMarkdown", + "summary": "Render a Markdown document", + "tags": [ + "Miscellaneous" + ], + "responses": { + "200": { + "description": "Rendered HTML", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "description": "Validation error." + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "context": { + "type": "string", + "description": "Repository context URL" + } + }, + "required": [ + "text" + ] + } + } + } + } + } + }, + "/markdown/raw": { + "post": { + "operationId": "renderMarkdownRaw", + "summary": "Render a Markdown document in raw mode", + "tags": [ + "Miscellaneous" + ], + "responses": { + "200": { + "description": "Rendered HTML", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "422": { + "description": "Validation error." + } + }, + "requestBody": { + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "description": "Takes a Markdown document as plaintext and renders it without a repository context." + } + }, + "/repos/{owner}/{repo}/git/trees/{sha}": { + "get": { + "operationId": "getTree", + "summary": "Get a tree", + "tags": [ + "Miscellaneous" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GitTree" + } + } + } + }, + "404": { + "description": "Resource not found." + } + }, + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository owner" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Repository name" + }, + { + "name": "sha", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Tree SHA" + } + ] + } + }, + "/repos/{owner}/{repo}/forks": { + "get": { + "operationId": "listForks", + "summary": "List forks", + "tags": [ + "Repositories" + ], + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Owner of the repository" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Name of the repository" + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Repository" + } + } + } + } + }, + "404": { + "description": "Repository not found." + } + } + } + }, + "/repos/{owner}/{repo}/tags": { + "get": { + "operationId": "listTags", + "summary": "List tags", + "tags": [ + "Repositories" + ], + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Owner of the repository" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Name of the repository" + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Tag" + } + } + } + } + }, + "404": { + "description": "Repository not found." + } + } + } + }, + "/repos/{owner}/{repo}/commits": { + "get": { + "operationId": "getAllCommits", + "summary": "List all commits", + "description": "Returns commits from the HEAD of the default branch.", + "tags": [ + "Repositories" + ], + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Owner of the repository" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Name of the repository" + }, + { + "name": "pageSize", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 30 + }, + "description": "Number of commits to return" + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Commit" + } + } + } + } + }, + "404": { + "description": "Repository not found." + } + } + } + }, + "/repos/{owner}/{repo}/wiki": { + "patch": { + "operationId": "editWiki", + "summary": "Edit wiki settings", + "tags": [ + "Repositories" + ], + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Owner of the repository" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Name of the repository" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "enable_wiki": { + "type": "boolean", + "description": "Whether to enable the wiki" + }, + "allow_public_wiki": { + "type": "boolean", + "description": "Whether the wiki is publicly accessible" + }, + "enable_external_wiki": { + "type": "boolean", + "description": "Whether to use an external wiki" + }, + "external_wiki_url": { + "type": "string", + "description": "URL of the external wiki" + } + } + } + } + } + }, + "responses": { + "204": { + "description": "Wiki settings updated successfully." + }, + "404": { + "description": "Repository not found." + }, + "422": { + "description": "Validation error." + } + } + } + }, + "/repos/{owner}/{repo}/editorconfig/{filename}": { + "get": { + "operationId": "getEditorconfig", + "summary": "Get editorconfig definition", + "description": "Returns the editorconfig definition for the given filename in the repository.", + "tags": [ + "Repositories" + ], + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Owner of the repository" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Name of the repository" + }, + { + "name": "filename", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Filename to get the editorconfig definition for" + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EditorConfigDefinition" + } + } + } + }, + "404": { + "description": "No editorconfig file exists or no matching definition for the filename." + } + } + } + }, + "/repos/{owner}/{repo}/git/blobs/{sha}": { + "get": { + "operationId": "getGitBlob", + "summary": "Get a git blob", + "description": "Returns the content of a git blob object, base64 encoded.", + "tags": [ + "Miscellaneous" + ], + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Owner of the repository" + }, + { + "name": "repo", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "Name of the repository" + }, + { + "name": "sha", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "SHA of the git blob" + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GitBlob" + } + } + } + }, + "404": { + "description": "Blob not found." + } + } + } + }, + "/user/issues": { + "get": { + "operationId": "listUserIssues", + "summary": "List issues assigned to the authenticated user", + "description": "Lists issues across all repositories assigned to the authenticated user. Also available at `GET /issues`.", + "tags": [ + "Issues" + ], + "parameters": [ + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer" + }, + "description": "Page number" + }, + { + "name": "state", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "open", + "closed" + ], + "default": "open" + }, + "description": "Filter by state" + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Issue" + } + } + } + } + } + } + } + } + }, + "components": { + "securitySchemes": { + "BasicAuth": { + "type": "http", + "scheme": "basic" + }, + "AccessToken": { + "type": "apiKey", + "in": "header", + "name": "Authorization", + "description": "Personal access token. Use format: token {YOUR_ACCESS_TOKEN}" + } + }, + "schemas": { + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "login": { + "type": "string", + "description": "Alias of username for GitHub API compatibility" + }, + "full_name": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "avatar_url": { + "type": "string" + } + } + }, + "Collaborator": { + "description": "A repository collaborator with permission information", + "allOf": [ + { + "$ref": "#/components/schemas/User" + }, + { + "type": "object", + "properties": { + "permissions": { + "type": "object", + "properties": { + "admin": { + "type": "boolean" + }, + "push": { + "type": "boolean" + }, + "pull": { + "type": "boolean" + } + } + } + } + } + ] + }, + "Repository": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "owner": { + "$ref": "#/components/schemas/User" + }, + "name": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "private": { + "type": "boolean" + }, + "fork": { + "type": "boolean" + }, + "parent": { + "$ref": "#/components/schemas/Repository", + "nullable": true, + "description": "Present when fork is true" + }, + "empty": { + "type": "boolean" + }, + "mirror": { + "type": "boolean" + }, + "size": { + "type": "integer" + }, + "html_url": { + "type": "string" + }, + "ssh_url": { + "type": "string" + }, + "clone_url": { + "type": "string" + }, + "website": { + "type": "string" + }, + "stars_count": { + "type": "integer" + }, + "forks_count": { + "type": "integer" + }, + "watchers_count": { + "type": "integer" + }, + "open_issues_count": { + "type": "integer" + }, + "default_branch": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "permissions": { + "type": "object", + "properties": { + "admin": { + "type": "boolean" + }, + "push": { + "type": "boolean" + }, + "pull": { + "type": "boolean" + } + } + } + } + }, + "Branch": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "commit": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "url": { + "type": "string" + }, + "author": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "committer": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "username": { + "type": "string" + } + } + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "Commit": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "html_url": { + "type": "string" + }, + "commit": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "message": { + "type": "string" + }, + "author": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "date": { + "type": "string" + } + } + }, + "committer": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "date": { + "type": "string" + } + } + }, + "tree": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "sha": { + "type": "string" + } + } + } + } + }, + "author": { + "$ref": "#/components/schemas/User" + }, + "committer": { + "$ref": "#/components/schemas/User" + }, + "parents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "sha": { + "type": "string" + } + } + } + } + } + }, + "Issue": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "number": { + "type": "integer" + }, + "state": { + "type": "string", + "enum": [ + "open", + "closed" + ] + }, + "title": { + "type": "string" + }, + "body": { + "type": "string" + }, + "user": { + "$ref": "#/components/schemas/User" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Label" + } + }, + "assignee": { + "$ref": "#/components/schemas/User", + "nullable": true + }, + "milestone": { + "$ref": "#/components/schemas/Milestone", + "nullable": true + }, + "comments": { + "type": "integer" + }, + "pull_request": { + "type": "object", + "nullable": true + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "Comment": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "html_url": { + "type": "string" + }, + "user": { + "$ref": "#/components/schemas/User" + }, + "body": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "Label": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "Milestone": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "state": { + "type": "string", + "enum": [ + "open", + "closed" + ] + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "open_issues": { + "type": "integer" + }, + "closed_issues": { + "type": "integer" + }, + "closed_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "due_on": { + "type": "string", + "format": "date-time", + "nullable": true + } + } + }, + "Hook": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": [ + "gogs", + "slack", + "discord", + "dingtalk" + ] + }, + "events": { + "type": "array", + "items": { + "type": "string" + } + }, + "active": { + "type": "boolean" + }, + "config": { + "type": "object" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "Release": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "tag_name": { + "type": "string" + }, + "target_commitish": { + "type": "string" + }, + "name": { + "type": "string" + }, + "body": { + "type": "string" + }, + "draft": { + "type": "boolean" + }, + "prerelease": { + "type": "boolean" + }, + "author": { + "$ref": "#/components/schemas/User" + }, + "created_at": { + "type": "string", + "format": "date-time" + } + } + }, + "DeployKey": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "url": { + "type": "string" + }, + "title": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "read_only": { + "type": "boolean" + } + } + }, + "PublicKey": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "url": { + "type": "string" + }, + "title": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + } + } + }, + "AccessToken": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "sha1": { + "type": "string" + } + } + }, + "Email": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "verified": { + "type": "boolean" + }, + "primary": { + "type": "boolean" + } + } + }, + "Organization": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "avatar_url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "website": { + "type": "string" + }, + "location": { + "type": "string" + } + } + }, + "Team": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "permission": { + "type": "string", + "enum": [ + "read", + "write", + "admin", + "owner" + ] + } + } + }, + "Content": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "file", + "dir", + "symlink", + "submodule" + ] + }, + "encoding": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "content": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "url": { + "type": "string" + }, + "git_url": { + "type": "string" + }, + "html_url": { + "type": "string" + }, + "download_url": { + "type": "string" + }, + "_links": { + "type": "object", + "properties": { + "git": { + "type": "string" + }, + "self": { + "type": "string" + }, + "html": { + "type": "string" + } + } + } + } + }, + "GitTree": { + "type": "object", + "properties": { + "sha": { + "type": "string" + }, + "url": { + "type": "string" + }, + "tree": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "type": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "sha": { + "type": "string" + }, + "url": { + "type": "string" + } + } + } + } + } + }, + "Error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "GitBlob": { + "type": "object", + "properties": { + "content": { + "type": "string", + "description": "Base64-encoded blob content" + }, + "encoding": { + "type": "string", + "example": "base64" + }, + "url": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "size": { + "type": "integer" + } + } + }, + "Tag": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "commit": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "url": { + "type": "string" + }, + "author": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "username": { + "type": "string" + } + } + }, + "committer": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "username": { + "type": "string" + } + } + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "EditorConfigDefinition": { + "type": "object", + "properties": { + "charset": { + "type": "string" + }, + "indent_style": { + "type": "string" + }, + "indent_size": { + "type": "string" + }, + "end_of_line": { + "type": "string" + } + } + } + } + } +} diff --git a/docs/api-reference/organizations/create-an-organization-for-user.mdx b/docs/api-reference/organizations/create-an-organization-for-user.mdx new file mode 100644 index 00000000000..65b47617c60 --- /dev/null +++ b/docs/api-reference/organizations/create-an-organization-for-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Create an organization" +openapi: "POST /user/orgs" +--- diff --git a/docs/api-reference/organizations/edit-an-organization.mdx b/docs/api-reference/organizations/edit-an-organization.mdx new file mode 100644 index 00000000000..dbdf2f3899c --- /dev/null +++ b/docs/api-reference/organizations/edit-an-organization.mdx @@ -0,0 +1,4 @@ +--- +title: "Edit an organization" +openapi: "PATCH /orgs/{orgname}" +--- diff --git a/docs/api-reference/organizations/get-an-organization.mdx b/docs/api-reference/organizations/get-an-organization.mdx new file mode 100644 index 00000000000..31fb32c6460 --- /dev/null +++ b/docs/api-reference/organizations/get-an-organization.mdx @@ -0,0 +1,4 @@ +--- +title: "Get an organization" +openapi: "GET /orgs/{orgname}" +--- diff --git a/docs/api-reference/organizations/list-teams-of-an-organization.mdx b/docs/api-reference/organizations/list-teams-of-an-organization.mdx new file mode 100644 index 00000000000..de9784a8613 --- /dev/null +++ b/docs/api-reference/organizations/list-teams-of-an-organization.mdx @@ -0,0 +1,4 @@ +--- +title: "List teams of an organization" +openapi: "GET /orgs/{orgname}/teams" +--- diff --git a/docs/api-reference/organizations/list-user-organizations.mdx b/docs/api-reference/organizations/list-user-organizations.mdx new file mode 100644 index 00000000000..03c492ecc46 --- /dev/null +++ b/docs/api-reference/organizations/list-user-organizations.mdx @@ -0,0 +1,4 @@ +--- +title: "List user organizations" +openapi: "GET /users/{username}/orgs" +--- diff --git a/docs/api-reference/organizations/list-your-organizations.mdx b/docs/api-reference/organizations/list-your-organizations.mdx new file mode 100644 index 00000000000..74703b758da --- /dev/null +++ b/docs/api-reference/organizations/list-your-organizations.mdx @@ -0,0 +1,4 @@ +--- +title: "List your organizations" +openapi: "GET /user/orgs" +--- diff --git a/docs/api-reference/releases/list-releases.mdx b/docs/api-reference/releases/list-releases.mdx new file mode 100644 index 00000000000..221bb525b43 --- /dev/null +++ b/docs/api-reference/releases/list-releases.mdx @@ -0,0 +1,4 @@ +--- +title: "List releases" +openapi: "GET /repos/{owner}/{repo}/releases" +--- diff --git a/docs/api-reference/repositories/create-a-repository-in-an-organization.mdx b/docs/api-reference/repositories/create-a-repository-in-an-organization.mdx new file mode 100644 index 00000000000..3917063e749 --- /dev/null +++ b/docs/api-reference/repositories/create-a-repository-in-an-organization.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a repository in an organization" +openapi: "POST /org/{org}/repos" +--- diff --git a/docs/api-reference/repositories/create-a-repository.mdx b/docs/api-reference/repositories/create-a-repository.mdx new file mode 100644 index 00000000000..8a5d8edcb82 --- /dev/null +++ b/docs/api-reference/repositories/create-a-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a repository" +openapi: "POST /user/repos" +--- diff --git a/docs/api-reference/repositories/create-or-update-a-file.mdx b/docs/api-reference/repositories/create-or-update-a-file.mdx new file mode 100644 index 00000000000..306c19d2702 --- /dev/null +++ b/docs/api-reference/repositories/create-or-update-a-file.mdx @@ -0,0 +1,4 @@ +--- +title: "Create or update a file" +openapi: "PUT /repos/{owner}/{repo}/contents/{path}" +--- diff --git a/docs/api-reference/repositories/delete-a-repository.mdx b/docs/api-reference/repositories/delete-a-repository.mdx new file mode 100644 index 00000000000..44d2f7d5fb2 --- /dev/null +++ b/docs/api-reference/repositories/delete-a-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "Delete a repository" +openapi: "DELETE /repos/{owner}/{repo}" +--- diff --git a/docs/api-reference/repositories/download-archive.mdx b/docs/api-reference/repositories/download-archive.mdx new file mode 100644 index 00000000000..65e5f60e181 --- /dev/null +++ b/docs/api-reference/repositories/download-archive.mdx @@ -0,0 +1,4 @@ +--- +title: "Download archive" +openapi: "GET /repos/{owner}/{repo}/archive/{archive}" +--- diff --git a/docs/api-reference/repositories/download-raw-content.mdx b/docs/api-reference/repositories/download-raw-content.mdx new file mode 100644 index 00000000000..c9b49de2f76 --- /dev/null +++ b/docs/api-reference/repositories/download-raw-content.mdx @@ -0,0 +1,4 @@ +--- +title: "Download raw content" +openapi: "GET /repos/{owner}/{repo}/raw/{ref}/{filepath}" +--- diff --git a/docs/api-reference/repositories/edit-issue-tracker-settings.mdx b/docs/api-reference/repositories/edit-issue-tracker-settings.mdx new file mode 100644 index 00000000000..2edc7a8ef1f --- /dev/null +++ b/docs/api-reference/repositories/edit-issue-tracker-settings.mdx @@ -0,0 +1,4 @@ +--- +title: "Edit issue tracker settings" +openapi: "PATCH /repos/{owner}/{repo}/issue-tracker" +--- diff --git a/docs/api-reference/repositories/edit-wiki-settings.mdx b/docs/api-reference/repositories/edit-wiki-settings.mdx new file mode 100644 index 00000000000..e77fe1def9c --- /dev/null +++ b/docs/api-reference/repositories/edit-wiki-settings.mdx @@ -0,0 +1,4 @@ +--- +title: "Edit wiki settings" +openapi: "PATCH /repos/{owner}/{repo}/wiki" +--- diff --git a/docs/api-reference/repositories/get-a-branch.mdx b/docs/api-reference/repositories/get-a-branch.mdx new file mode 100644 index 00000000000..ad7d4857313 --- /dev/null +++ b/docs/api-reference/repositories/get-a-branch.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a branch" +openapi: "GET /repos/{owner}/{repo}/branches/{branch}" +--- diff --git a/docs/api-reference/repositories/get-a-repository.mdx b/docs/api-reference/repositories/get-a-repository.mdx new file mode 100644 index 00000000000..cbccd22ab63 --- /dev/null +++ b/docs/api-reference/repositories/get-a-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a repository" +openapi: "GET /repos/{owner}/{repo}" +--- diff --git a/docs/api-reference/repositories/get-a-single-commit.mdx b/docs/api-reference/repositories/get-a-single-commit.mdx new file mode 100644 index 00000000000..baf147aeda7 --- /dev/null +++ b/docs/api-reference/repositories/get-a-single-commit.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a single commit" +openapi: "GET /repos/{owner}/{repo}/commits/{sha}" +--- diff --git a/docs/api-reference/repositories/get-contents.mdx b/docs/api-reference/repositories/get-contents.mdx new file mode 100644 index 00000000000..8d52422aa51 --- /dev/null +++ b/docs/api-reference/repositories/get-contents.mdx @@ -0,0 +1,4 @@ +--- +title: "Get contents" +openapi: "GET /repos/{owner}/{repo}/contents/{path}" +--- diff --git a/docs/api-reference/repositories/get-editorconfig-definition.mdx b/docs/api-reference/repositories/get-editorconfig-definition.mdx new file mode 100644 index 00000000000..12cb3c8e7ac --- /dev/null +++ b/docs/api-reference/repositories/get-editorconfig-definition.mdx @@ -0,0 +1,4 @@ +--- +title: "Get editorconfig definition" +openapi: "GET /repos/{owner}/{repo}/editorconfig/{filename}" +--- diff --git a/docs/api-reference/repositories/list-all-commits.mdx b/docs/api-reference/repositories/list-all-commits.mdx new file mode 100644 index 00000000000..776d89f9538 --- /dev/null +++ b/docs/api-reference/repositories/list-all-commits.mdx @@ -0,0 +1,4 @@ +--- +title: "List all commits" +openapi: "GET /repos/{owner}/{repo}/commits" +--- diff --git a/docs/api-reference/repositories/list-branches.mdx b/docs/api-reference/repositories/list-branches.mdx new file mode 100644 index 00000000000..aaace224a49 --- /dev/null +++ b/docs/api-reference/repositories/list-branches.mdx @@ -0,0 +1,4 @@ +--- +title: "List branches" +openapi: "GET /repos/{owner}/{repo}/branches" +--- diff --git a/docs/api-reference/repositories/list-forks.mdx b/docs/api-reference/repositories/list-forks.mdx new file mode 100644 index 00000000000..eedd699a665 --- /dev/null +++ b/docs/api-reference/repositories/list-forks.mdx @@ -0,0 +1,4 @@ +--- +title: "List forks" +openapi: "GET /repos/{owner}/{repo}/forks" +--- diff --git a/docs/api-reference/repositories/list-organization-repositories.mdx b/docs/api-reference/repositories/list-organization-repositories.mdx new file mode 100644 index 00000000000..2eef45be8b5 --- /dev/null +++ b/docs/api-reference/repositories/list-organization-repositories.mdx @@ -0,0 +1,4 @@ +--- +title: "List organization repositories" +openapi: "GET /orgs/{orgname}/repos" +--- diff --git a/docs/api-reference/repositories/list-tags.mdx b/docs/api-reference/repositories/list-tags.mdx new file mode 100644 index 00000000000..d9e9c59fe22 --- /dev/null +++ b/docs/api-reference/repositories/list-tags.mdx @@ -0,0 +1,4 @@ +--- +title: "List tags" +openapi: "GET /repos/{owner}/{repo}/tags" +--- diff --git a/docs/api-reference/repositories/list-user-repositories.mdx b/docs/api-reference/repositories/list-user-repositories.mdx new file mode 100644 index 00000000000..5278e4ac24f --- /dev/null +++ b/docs/api-reference/repositories/list-user-repositories.mdx @@ -0,0 +1,4 @@ +--- +title: "List user repositories" +openapi: "GET /users/{username}/repos" +--- diff --git a/docs/api-reference/repositories/list-your-repositories.mdx b/docs/api-reference/repositories/list-your-repositories.mdx new file mode 100644 index 00000000000..126fac86238 --- /dev/null +++ b/docs/api-reference/repositories/list-your-repositories.mdx @@ -0,0 +1,4 @@ +--- +title: "List your repositories" +openapi: "GET /user/repos" +--- diff --git a/docs/api-reference/repositories/migrate-a-repository.mdx b/docs/api-reference/repositories/migrate-a-repository.mdx new file mode 100644 index 00000000000..a43c237f299 --- /dev/null +++ b/docs/api-reference/repositories/migrate-a-repository.mdx @@ -0,0 +1,4 @@ +--- +title: "Migrate a repository" +openapi: "POST /repos/migrate" +--- diff --git a/docs/api-reference/repositories/mirror-sync.mdx b/docs/api-reference/repositories/mirror-sync.mdx new file mode 100644 index 00000000000..ff4211c9537 --- /dev/null +++ b/docs/api-reference/repositories/mirror-sync.mdx @@ -0,0 +1,4 @@ +--- +title: "Mirror sync" +openapi: "POST /repos/{owner}/{repo}/mirror-sync" +--- diff --git a/docs/api-reference/repositories/search-repositories.mdx b/docs/api-reference/repositories/search-repositories.mdx new file mode 100644 index 00000000000..a55abf6b57f --- /dev/null +++ b/docs/api-reference/repositories/search-repositories.mdx @@ -0,0 +1,4 @@ +--- +title: "Search repositories" +openapi: "GET /repos/search" +--- diff --git a/docs/api-reference/users/add-email-addresses.mdx b/docs/api-reference/users/add-email-addresses.mdx new file mode 100644 index 00000000000..4c65bb95e1c --- /dev/null +++ b/docs/api-reference/users/add-email-addresses.mdx @@ -0,0 +1,4 @@ +--- +title: "Add email addresses" +openapi: "POST /user/emails" +--- diff --git a/docs/api-reference/users/check-if-a-user-follows-another.mdx b/docs/api-reference/users/check-if-a-user-follows-another.mdx new file mode 100644 index 00000000000..8a9b1efee9f --- /dev/null +++ b/docs/api-reference/users/check-if-a-user-follows-another.mdx @@ -0,0 +1,4 @@ +--- +title: "Check if a user follows another" +openapi: "GET /users/{username}/following/{target}" +--- diff --git a/docs/api-reference/users/check-if-you-follow-a-user.mdx b/docs/api-reference/users/check-if-you-follow-a-user.mdx new file mode 100644 index 00000000000..3a471d497c4 --- /dev/null +++ b/docs/api-reference/users/check-if-you-follow-a-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Check if you follow a user" +openapi: "GET /user/following/{target}" +--- diff --git a/docs/api-reference/users/create-a-public-key.mdx b/docs/api-reference/users/create-a-public-key.mdx new file mode 100644 index 00000000000..cd52d423d85 --- /dev/null +++ b/docs/api-reference/users/create-a-public-key.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a public key" +openapi: "POST /user/keys" +--- diff --git a/docs/api-reference/users/create-an-access-token.mdx b/docs/api-reference/users/create-an-access-token.mdx new file mode 100644 index 00000000000..37b71705d34 --- /dev/null +++ b/docs/api-reference/users/create-an-access-token.mdx @@ -0,0 +1,4 @@ +--- +title: "Create an access token" +openapi: "POST /users/{username}/tokens" +--- diff --git a/docs/api-reference/users/delete-a-public-key.mdx b/docs/api-reference/users/delete-a-public-key.mdx new file mode 100644 index 00000000000..e359a713718 --- /dev/null +++ b/docs/api-reference/users/delete-a-public-key.mdx @@ -0,0 +1,4 @@ +--- +title: "Delete a public key" +openapi: "DELETE /user/keys/{id}" +--- diff --git a/docs/api-reference/users/delete-email-addresses.mdx b/docs/api-reference/users/delete-email-addresses.mdx new file mode 100644 index 00000000000..7f9de7d1951 --- /dev/null +++ b/docs/api-reference/users/delete-email-addresses.mdx @@ -0,0 +1,4 @@ +--- +title: "Delete email addresses" +openapi: "DELETE /user/emails" +--- diff --git a/docs/api-reference/users/follow-a-user.mdx b/docs/api-reference/users/follow-a-user.mdx new file mode 100644 index 00000000000..43075301f3d --- /dev/null +++ b/docs/api-reference/users/follow-a-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Follow a user" +openapi: "PUT /user/following/{target}" +--- diff --git a/docs/api-reference/users/get-a-single-public-key.mdx b/docs/api-reference/users/get-a-single-public-key.mdx new file mode 100644 index 00000000000..453fd5b862b --- /dev/null +++ b/docs/api-reference/users/get-a-single-public-key.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a single public key" +openapi: "GET /user/keys/{id}" +--- diff --git a/docs/api-reference/users/get-a-single-user.mdx b/docs/api-reference/users/get-a-single-user.mdx new file mode 100644 index 00000000000..9c85f907de2 --- /dev/null +++ b/docs/api-reference/users/get-a-single-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Get a single user" +openapi: "GET /users/{username}" +--- diff --git a/docs/api-reference/users/get-the-authenticated-user.mdx b/docs/api-reference/users/get-the-authenticated-user.mdx new file mode 100644 index 00000000000..448b18b033e --- /dev/null +++ b/docs/api-reference/users/get-the-authenticated-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Get the authenticated user" +openapi: "GET /user" +--- diff --git a/docs/api-reference/users/list-access-tokens.mdx b/docs/api-reference/users/list-access-tokens.mdx new file mode 100644 index 00000000000..ba4e608598e --- /dev/null +++ b/docs/api-reference/users/list-access-tokens.mdx @@ -0,0 +1,4 @@ +--- +title: "List access tokens" +openapi: "GET /users/{username}/tokens" +--- diff --git a/docs/api-reference/users/list-email-addresses.mdx b/docs/api-reference/users/list-email-addresses.mdx new file mode 100644 index 00000000000..efe4490d8e6 --- /dev/null +++ b/docs/api-reference/users/list-email-addresses.mdx @@ -0,0 +1,4 @@ +--- +title: "List email addresses" +openapi: "GET /user/emails" +--- diff --git a/docs/api-reference/users/list-followers-of-a-user.mdx b/docs/api-reference/users/list-followers-of-a-user.mdx new file mode 100644 index 00000000000..f1f993a6261 --- /dev/null +++ b/docs/api-reference/users/list-followers-of-a-user.mdx @@ -0,0 +1,4 @@ +--- +title: "List followers of a user" +openapi: "GET /users/{username}/followers" +--- diff --git a/docs/api-reference/users/list-public-keys-for-a-user.mdx b/docs/api-reference/users/list-public-keys-for-a-user.mdx new file mode 100644 index 00000000000..00c87eff7b8 --- /dev/null +++ b/docs/api-reference/users/list-public-keys-for-a-user.mdx @@ -0,0 +1,4 @@ +--- +title: "List public keys for a user" +openapi: "GET /users/{username}/keys" +--- diff --git a/docs/api-reference/users/list-users-followed-by-a-user.mdx b/docs/api-reference/users/list-users-followed-by-a-user.mdx new file mode 100644 index 00000000000..16bc16fa6e8 --- /dev/null +++ b/docs/api-reference/users/list-users-followed-by-a-user.mdx @@ -0,0 +1,4 @@ +--- +title: "List users followed by a user" +openapi: "GET /users/{username}/following" +--- diff --git a/docs/api-reference/users/list-who-you-are-following.mdx b/docs/api-reference/users/list-who-you-are-following.mdx new file mode 100644 index 00000000000..6c08707f0ba --- /dev/null +++ b/docs/api-reference/users/list-who-you-are-following.mdx @@ -0,0 +1,4 @@ +--- +title: "List who you are following" +openapi: "GET /user/following" +--- diff --git a/docs/api-reference/users/list-your-followers.mdx b/docs/api-reference/users/list-your-followers.mdx new file mode 100644 index 00000000000..04f9c201a74 --- /dev/null +++ b/docs/api-reference/users/list-your-followers.mdx @@ -0,0 +1,4 @@ +--- +title: "List your followers" +openapi: "GET /user/followers" +--- diff --git a/docs/api-reference/users/list-your-public-keys.mdx b/docs/api-reference/users/list-your-public-keys.mdx new file mode 100644 index 00000000000..0d3a1f02c88 --- /dev/null +++ b/docs/api-reference/users/list-your-public-keys.mdx @@ -0,0 +1,4 @@ +--- +title: "List your public keys" +openapi: "GET /user/keys" +--- diff --git a/docs/api-reference/users/search-for-users.mdx b/docs/api-reference/users/search-for-users.mdx new file mode 100644 index 00000000000..99628c48f43 --- /dev/null +++ b/docs/api-reference/users/search-for-users.mdx @@ -0,0 +1,4 @@ +--- +title: "Search for users" +openapi: "GET /users/search" +--- diff --git a/docs/api-reference/users/unfollow-a-user.mdx b/docs/api-reference/users/unfollow-a-user.mdx new file mode 100644 index 00000000000..7bc82d7f3e9 --- /dev/null +++ b/docs/api-reference/users/unfollow-a-user.mdx @@ -0,0 +1,4 @@ +--- +title: "Unfollow a user" +openapi: "DELETE /user/following/{target}" +--- diff --git a/docs/api-reference/webhooks/create-a-hook.mdx b/docs/api-reference/webhooks/create-a-hook.mdx new file mode 100644 index 00000000000..aa9ddacc550 --- /dev/null +++ b/docs/api-reference/webhooks/create-a-hook.mdx @@ -0,0 +1,4 @@ +--- +title: "Create a hook" +openapi: "POST /repos/{owner}/{repo}/hooks" +--- diff --git a/docs/api-reference/webhooks/delete-a-hook.mdx b/docs/api-reference/webhooks/delete-a-hook.mdx new file mode 100644 index 00000000000..aac71931fa0 --- /dev/null +++ b/docs/api-reference/webhooks/delete-a-hook.mdx @@ -0,0 +1,4 @@ +--- +title: "Delete a hook" +openapi: "DELETE /repos/{owner}/{repo}/hooks/{id}" +--- diff --git a/docs/api-reference/webhooks/edit-a-hook.mdx b/docs/api-reference/webhooks/edit-a-hook.mdx new file mode 100644 index 00000000000..b351aab9be7 --- /dev/null +++ b/docs/api-reference/webhooks/edit-a-hook.mdx @@ -0,0 +1,4 @@ +--- +title: "Edit a hook" +openapi: "PATCH /repos/{owner}/{repo}/hooks/{id}" +--- diff --git a/docs/api-reference/webhooks/list-hooks.mdx b/docs/api-reference/webhooks/list-hooks.mdx new file mode 100644 index 00000000000..8c5dace0978 --- /dev/null +++ b/docs/api-reference/webhooks/list-hooks.mdx @@ -0,0 +1,4 @@ +--- +title: "List hooks" +openapi: "GET /repos/{owner}/{repo}/hooks" +--- diff --git a/docs/asking/faq.mdx b/docs/asking/faq.mdx new file mode 100644 index 00000000000..3b9176e0225 --- /dev/null +++ b/docs/asking/faq.mdx @@ -0,0 +1,93 @@ +--- +title: "FAQ" +description: "Frequently asked questions about using and administering Gogs" +icon: "circle-question" +--- + +Answers to common questions about Gogs configuration, administration, and usage. + +## Deployment + + + + You can change the listening port on the first run by passing the `-port` flag: + + ```bash + gogs web -port 3001 + ``` + + This flag also updates the port number shown on the install page, so pick the port you intend to keep using. + + + + Set the `OFFLINE_MODE` option to `true` in the `[server]` section of your `custom/conf/app.ini`: + + ```ini + [server] + OFFLINE_MODE = true + ``` + + This disables external network calls such as CDN resource loading and Gravatar avatar fetching. + + + + Create a file named `robots.txt` in the `custom` directory at the root of your Gogs installation: + + ``` + custom/robots.txt + ``` + + Gogs will serve this file automatically at `/robots.txt`. + + + +## Administration + + + + The first user to register (with `ID = 1`) is automatically granted administrator privileges. No email confirmation is required for this account, even if email confirmation is enabled. + + Once logged in, the administrator can promote other users by navigating to **Admin Panel** > **Users** and editing user accounts. A user who registers through the initial install page is also made an administrator. + + + + If you have shell access to the server, follow these steps: + + 1. **Stop Gogs**, then create a temporary admin user from the command line: + + ```bash + su git + cd /home/git/gogs + gogs admin create-user --name tmpuser --password tmppassword --admin --email tmp@example.com + ``` + + 2. **Start Gogs** again, then log in as `tmpuser` in your browser. Navigate to **Admin Panel** > **Users**, click **Edit** next to the original administrator account, and set a new password. + + 3. **Clean up** by logging out, logging back in as the original administrator with the new password, then deleting the `tmpuser` account from **Admin Panel** > **Users**. + + It is safest to stop Gogs before creating the temporary user via the command line, then start it again afterward. + + + +## Repository management + + + + **Git hooks permission is a high-level privilege** that can allow arbitrary code execution on the server. Only grant it to users you fully trust. + + To enable or disable this permission, go to the **Admin Panel** > **Users**, select the user, and toggle the Git hooks permission in their account settings (`/admin/users/:userid`). + + + +## Other + + + + Mirrored repositories cannot have their own wiki because the mirror is a read-only copy of the upstream repository. + + If you see the "Welcome to Wiki!" page but no green "Create the first page" button, your repository was likely created as a mirror. You have two options: + + 1. Edit the wiki on the upstream repository that is being mirrored. + 2. Convert the mirror to a regular repository under **Settings** > **Danger Zone** if you no longer need it to be a mirror. + + diff --git a/docs/asking/release-strategy.mdx b/docs/asking/release-strategy.mdx new file mode 100644 index 00000000000..a7d349f253b --- /dev/null +++ b/docs/asking/release-strategy.mdx @@ -0,0 +1,49 @@ +--- +title: "Release strategy" +description: "What you need to know about backwards compatibility" +icon: "code-branch" +--- + +Understanding the Gogs release strategy helps you plan upgrades safely and avoid breaking changes. + +## Semantic versioning + +Starting with version **0.12.0**, Gogs follows [semantic versioning](https://semver.org/). Version numbers use the format `MAJOR.MINOR.PATCH`: + +| Version | Type | Description | +|-----------|---------------|-----------------------------------------------------------| +| `0.12.0` | Minor release | Introduces new features or breaking changes within `0.x` | +| `0.12.1` | Patch release | First bug-fix release for the `0.12` series | +| `0.12` | Release series| Refers collectively to `0.12.0`, `0.12.1`, `0.12.2`, etc.| + +Each minor release has its own **release branch** with the prefix `release/`. For example, `release/0.12` is the branch for version 0.12.0 and all of its patch releases (`0.12.1`, `0.12.2`, and so on). + +## Backwards compatibility + +### Upgrading from versions before 0.12 + + + If you are running any version of Gogs **below 0.12**, you must first upgrade to **0.12** before upgrading further. This version includes essential database migrations that later versions depend on. + + +### Upgrading from 0.12 and later + +Gogs maintains backwards compatibility across **one minor version** at a time. Patch release numbers are disregarded when determining compatibility. + +**Supported upgrade paths:** + +| From | To | Supported | +|-----------|-----------|-----------| +| `0.12.0` | `0.13.0` | Yes | +| `0.12.1` | `0.13.4` | Yes | +| `0.12.4` | `0.14.0` | **No** -- skips a minor version | + + + Always upgrade **one minor version at a time**. For example, to go from `0.12` to `0.14`, first upgrade to `0.13`, verify everything works, and then upgrade to `0.14`. + + +## Source build update frequency + + + If you run Gogs from a source build rather than an official binary, update **at least once per week**. This prevents you from falling behind and potentially missing incremental database migrations that cannot be applied out of order. + diff --git a/docs/asking/troubleshooting.mdx b/docs/asking/troubleshooting.mdx new file mode 100644 index 00000000000..c3f27c291d2 --- /dev/null +++ b/docs/asking/troubleshooting.mdx @@ -0,0 +1,229 @@ +--- +title: "Troubleshooting" +description: "Common issues and their solutions when running Gogs" +icon: "wrench" +--- + +This page covers common problems you may encounter when installing, configuring, or running Gogs, organized by category. + +## SSH + + + + **Possible cause**: Gogs makes an HTTP request back to its own web service after every SSH push. If the server firewall or ISP blocks this loopback connection, the request will hang until it times out. + + **Solution**: Ensure that the server can reach itself on the configured HTTP port. Check firewall rules and any network policies that may prevent loopback connections. + + + + **Possible cause**: You moved the Gogs binary to a different location from where it was originally installed, so the Git hooks reference a stale path. + + **Solution**: Go to the **Admin Panel** (`/admin`) and run these two tasks: + + 1. **Rewrite `.ssh/authorized_keys` file** + 2. **Resync pre-receive, update and post-receive hooks of all repositories** + + + + **Possible cause**: When using Git over SSH, Gogs relies on hook scripts to update the timeline and repository display. Several conditions can prevent these scripts from executing, especially when repositories are stored on a mounted device. + + **Solution**: + + - Ensure the mount point containing the repositories is **not** set as `noexec`. Run `mount` to check, and if necessary add the `exec` option to the mount point in `/etc/fstab`. + - For `vfat` (and possibly `cifs`) mounts, ensure the `uid`, `gid`, and `fmask` options permit the Gogs user (or a group it belongs to) to execute files. + - For network-mounted shares (NFS, Samba), ensure the server is not configured to disallow execution on the remote filesystem. + + + +## Git + + + + **Error**: + + ```text + fatal: 'XX/XX.git' does not appear to be a git repository + ``` + + Or: pushed commits but the repository still shows as bare. + + **Possible cause**: There are duplicate SSH keys in `~/.ssh/authorized_keys`. This commonly happens if you are (or were) running GitLab on the same system user. + + **Solution**: Edit `~/.ssh/authorized_keys` and remove the old duplicate entry, keeping only the key that was added by Gogs. + + + + **Error**: + + ```text + repo.NewRepoContext(fail to set git user.email): + ``` + + **Possible cause**: On Windows, this occurs when Git Bash was installed without enabling the `cmd` option, so `git` is not available on the system PATH. + + **Solution**: Reinstall Git for Windows and make sure the option to add Git to the system PATH (the `cmd` option) is enabled. + + + +## Database + + + + **Error**: + + ```text + Error 1071: Specified key was too long; max key length is 1000 bytes + ``` + + **Possible cause**: The database is using the MyISAM storage engine, which has a shorter maximum key length than InnoDB. + + **Solution**: After importing the initial schema, log into MySQL and switch the storage engine: + + ```sql + USE gogs; + SET GLOBAL storage_engine=INNODB; + ``` + + Then re-run the Gogs installer at `http://localhost:3000/install`. + + + + **Error**: + + ```text + Database setting is not correct: This server only supports the insecure old password authentication. + ``` + + **Possible cause**: The MySQL user's password was only updated for the `@localhost` entry. A second entry in the user table (such as `@%`) still has the old-format password. + + **Solution**: Update the password for all host entries of the MySQL user. See [this GitHub discussion](https://github.com/gogs/gogs/issues/385#issuecomment-54357073) for detailed steps. + + + + **Error**: Pushing to a repository shows that the owner is not registered, or the `user` table does not exist. + + **Possible cause**: Gogs may be running as a system service and loading a different SQLite3 file than expected (for example, a relative path resolved differently). + + **Solution**: Use an **absolute path** for the SQLite3 database file in your `custom/conf/app.ini` configuration. + + + +## Email + + + + **Possible cause**: Google does not trust the server sending the email and requires additional verification. + + **Solution**: + + 1. Visit [https://accounts.google.com](https://accounts.google.com) and log in. + 2. Go to [https://accounts.google.com/DisplayUnlockCaptcha](https://accounts.google.com/DisplayUnlockCaptcha) and click **Continue**. + 3. Copy the `ContinueSignIn` link from the Gogs server log and complete the sign-in. + 4. Check your spam folder in case your mail provider flagged the messages. + + + + **Error**: + + ```text + gomail: could not send email 1: Auth: 535 + ``` + + **Possible cause**: The SMTP password contains special characters that are not being interpreted correctly. + + **Solution**: Wrap the password in single quotes in your `custom/conf/app.ini`: + + ```ini + PASSWORD = 'P4§$w0rd' + ``` + + + +## Windows + + + + **Error**: + + ```text + cygwin warning: MS-DOS style path detected ... + fatal: '/cygdrive/d/.../C:\Users\...' does not appear to be a git repository + ``` + + **Possible cause**: Another shell (such as Cygwin) is installed on the system and its path style conflicts with the native Windows paths Gogs expects. + + **Solution**: Start Gogs using the default Windows Command Prompt (`cmd.exe`) instead of Cygwin or other alternative shells. + + + + **Error**: + + ```text + Resource interpreted as Stylesheet but transferred with MIME type application/x-css + ``` + + **Possible cause**: The Windows registry has an incorrect `Content Type` value for the `.css` file extension. + + **Solution**: Open the Windows Registry Editor, navigate to `HKEY_CLASSES_ROOT\.css`, and change the `Content Type` value to `text/css`. + + + +## Other + + + + **Possible cause**: This can happen for two reasons: + + 1. Nginx is trying to resolve `localhost` as an IPv6 address, causing a delay. + 2. Gravatar avatar lookups are being attempted without a valid email address. + + **Solution**: + + 1. Use the explicit hostname `127.0.0.1` instead of `localhost` during the initial setup at `http://gogs-server:3000/install`. + 2. Either use a valid Gravatar email address for the administrator account or disable avatar lookup during the initial setup. + + + + **Error**: + + ```text + Error 1062: Duplicate entry 'Unknown-Mac' for key 'UQE_public_key_name' + ``` + + **Possible cause**: A very early version of Gogs had a unique constraint (`UQE_public_key_name`) on SSH key names in the `public_key` table. This constraint is no longer needed. + + **Solution**: Manually delete the `UQE_public_key_name` unique index from the `public_key` table in your database. + + + + **Solution**: Update the C library on your system: + + ```bash + sudo apt-get -t testing install libc6-dev + ``` + + + + **Error**: + + ```text + [Macaron] PANIC: session(start): mkdir data: permission denied + ``` + + **Possible cause**: Gogs creates a `data` subdirectory in the same directory as the Gogs binary. The process does not have write permission to that directory. + + **Solution**: Ensure the user running Gogs has permission to create subdirectories in the directory where the Gogs binary is located. + + + + **Error**: + + ```text + ! [remote rejected] master -> master (hook declined) + ``` + + **Possible cause**: Git is unable to execute the update hook script. + + **Solution**: Make sure the `bash` shell is available on your system. All Gogs hook scripts require `bash` to run. + + diff --git a/docs/dev/database_schema.md b/docs/dev/database_schema.md new file mode 100644 index 00000000000..cb035aa077b --- /dev/null +++ b/docs/dev/database_schema.md @@ -0,0 +1,131 @@ +# Table "access" + +``` + Field | Column | PostgreSQL | MySQL | SQLite3 +--------+---------+-----------------+-----------------------+----------------------- + ID | id | BIGSERIAL | BIGINT AUTO_INCREMENT | INTEGER AUTOINCREMENT + UserID | user_id | BIGINT NOT NULL | BIGINT NOT NULL | INTEGER NOT NULL + RepoID | repo_id | BIGINT NOT NULL | BIGINT NOT NULL | INTEGER NOT NULL + Mode | mode | BIGINT NOT NULL | BIGINT NOT NULL | INTEGER NOT NULL + +Primary keys: id +Indexes: + "access_user_repo_unique" UNIQUE (user_id, repo_id) +``` + +# Table "access_token" + +``` + Field | Column | PostgreSQL | MySQL | SQLite3 +-------------+--------------+-----------------------------+-----------------------------+----------------------------- + ID | id | BIGSERIAL | BIGINT AUTO_INCREMENT | INTEGER AUTOINCREMENT + UserID | uid | BIGINT | BIGINT | INTEGER + Name | name | TEXT | LONGTEXT | TEXT + Sha1 | sha1 | VARCHAR(40) UNIQUE | VARCHAR(40) UNIQUE | VARCHAR(40) UNIQUE + SHA256 | sha256 | VARCHAR(64) NOT NULL UNIQUE | VARCHAR(64) NOT NULL UNIQUE | VARCHAR(64) NOT NULL UNIQUE + CreatedUnix | created_unix | BIGINT | BIGINT | INTEGER + UpdatedUnix | updated_unix | BIGINT | BIGINT | INTEGER + +Primary keys: id +Indexes: + "idx_access_token_user_id" (uid) +``` + +# Table "action" + +``` + Field | Column | PostgreSQL | MySQL | SQLite3 +--------------+----------------+--------------------------------+--------------------------------+-------------------------------- + ID | id | BIGSERIAL | BIGINT AUTO_INCREMENT | INTEGER AUTOINCREMENT + UserID | user_id | BIGINT | BIGINT | INTEGER + OpType | op_type | BIGINT | BIGINT | INTEGER + ActUserID | act_user_id | BIGINT | BIGINT | INTEGER + ActUserName | act_user_name | TEXT | LONGTEXT | TEXT + RepoID | repo_id | BIGINT | BIGINT | INTEGER + RepoUserName | repo_user_name | TEXT | LONGTEXT | TEXT + RepoName | repo_name | TEXT | LONGTEXT | TEXT + RefName | ref_name | TEXT | LONGTEXT | TEXT + IsPrivate | is_private | BOOLEAN NOT NULL DEFAULT FALSE | BOOLEAN NOT NULL DEFAULT FALSE | NUMERIC NOT NULL DEFAULT FALSE + Content | content | TEXT | LONGTEXT | TEXT + CreatedUnix | created_unix | BIGINT | BIGINT | INTEGER + +Primary keys: id +Indexes: + "idx_action_repo_id" (repo_id) + "idx_action_user_id" (user_id) +``` + +# Table "email_address" + +``` + Field | Column | PostgreSQL | MySQL | SQLite3 +-------------+--------------+--------------------------------+--------------------------------+-------------------------------- + ID | id | BIGSERIAL | BIGINT AUTO_INCREMENT | INTEGER AUTOINCREMENT + UserID | uid | BIGINT NOT NULL | BIGINT NOT NULL | INTEGER NOT NULL + Email | email | VARCHAR(254) NOT NULL | VARCHAR(254) NOT NULL | TEXT NOT NULL + IsActivated | is_activated | BOOLEAN NOT NULL DEFAULT FALSE | BOOLEAN NOT NULL DEFAULT FALSE | NUMERIC NOT NULL DEFAULT FALSE + +Primary keys: id +Indexes: + "email_address_user_email_unique" UNIQUE (uid, email) + "idx_email_address_user_id" (uid) +``` + +# Table "follow" + +``` + Field | Column | PostgreSQL | MySQL | SQLite3 +----------+-----------+-----------------+-----------------------+----------------------- + ID | id | BIGSERIAL | BIGINT AUTO_INCREMENT | INTEGER AUTOINCREMENT + UserID | user_id | BIGINT NOT NULL | BIGINT NOT NULL | INTEGER NOT NULL + FollowID | follow_id | BIGINT NOT NULL | BIGINT NOT NULL | INTEGER NOT NULL + +Primary keys: id +Indexes: + "follow_user_follow_unique" UNIQUE (user_id, follow_id) +``` + +# Table "lfs_object" + +``` + Field | Column | PostgreSQL | MySQL | SQLite3 +-----------+------------+----------------------+----------------------+------------------- + RepoID | repo_id | BIGINT | BIGINT | INTEGER + OID | oid | TEXT | VARCHAR(191) | TEXT + Size | size | BIGINT NOT NULL | BIGINT NOT NULL | INTEGER NOT NULL + Storage | storage | TEXT NOT NULL | LONGTEXT NOT NULL | TEXT NOT NULL + CreatedAt | created_at | TIMESTAMPTZ NOT NULL | DATETIME(3) NOT NULL | DATETIME NOT NULL + +Primary keys: repo_id, oid +``` + +# Table "login_source" + +``` + Field | Column | PostgreSQL | MySQL | SQLite3 +-------------+--------------+------------------+-----------------------+----------------------- + ID | id | BIGSERIAL | BIGINT AUTO_INCREMENT | INTEGER AUTOINCREMENT + Type | type | BIGINT | BIGINT | INTEGER + Name | name | TEXT UNIQUE | VARCHAR(191) UNIQUE | TEXT UNIQUE + IsActived | is_actived | BOOLEAN NOT NULL | BOOLEAN NOT NULL | NUMERIC NOT NULL + IsDefault | is_default | BOOLEAN | BOOLEAN | NUMERIC + Config | cfg | TEXT | TEXT | TEXT + CreatedUnix | created_unix | BIGINT | BIGINT | INTEGER + UpdatedUnix | updated_unix | BIGINT | BIGINT | INTEGER + +Primary keys: id +``` + +# Table "notice" + +``` + Field | Column | PostgreSQL | MySQL | SQLite3 +-------------+--------------+------------+-----------------------+----------------------- + ID | id | BIGSERIAL | BIGINT AUTO_INCREMENT | INTEGER AUTOINCREMENT + Type | type | BIGINT | BIGINT | INTEGER + Description | description | TEXT | TEXT | TEXT + CreatedUnix | created_unix | BIGINT | BIGINT | INTEGER + +Primary keys: id +``` + diff --git a/docs/dev/import_locale.md b/docs/dev/import_locale.md new file mode 100644 index 00000000000..93d420c77c1 --- /dev/null +++ b/docs/dev/import_locale.md @@ -0,0 +1,17 @@ +# Import locales from Crowdin + +1. Upload the latest version of [`locale_en-US.ini`](https://github.com/gogs/gogs/blob/main/conf/locale/locale_en-US.ini) to the [Crowdin](https://crowdin.gogs.io/project/gogs/sources/files). +1. [Build and download](https://crowdin.gogs.io/project/gogs/translations) the ZIP archive and unzip it. +1. Go to root directory of the repository. +1. Run the `import` subcommand: + + ``` + $ ./.bin/gogs import locale --source --target ./conf/locale + Locale files has been successfully imported! + ``` + +1. Run `moon run gogs:dev` to start the web server, then visit the site in the browser to make sure nothing blows up. +1. Check out a new branch using `git checkout -b update-locales`. +1. Stage changes +1. Run `git commit -m "locale: sync from Crowdin"`. +1. Push the commit then open up a pull request on GitHub. diff --git a/docs/dev/local_development.md b/docs/dev/local_development.md new file mode 100644 index 00000000000..2e0098db6cd --- /dev/null +++ b/docs/dev/local_development.md @@ -0,0 +1,178 @@ +# Set up your development environment + +Gogs is written in [Go](https://golang.org/), please take [A Tour of Go](https://tour.golang.org/) if you haven't done so! + +## Outline + +- [Environment](#environment) +- [Step 1: Install dependencies](#step-1-install-dependencies) +- [Step 2: Initialize your database](#step-2-initialize-your-database) +- [Step 3: Get the code](#step-3-get-the-code) +- [Step 4: Configure database settings](#step-4-configure-database-settings) +- [Step 5: Start the server](#step-5-start-the-server) +- [Other nice things](#other-nice-things) + +## Environment + +Gogs is built and runs as a single binary and meant to be cross platform. Therefore, you should be able to develop Gogs in any major platforms you prefer. + +## Step 1: Install dependencies + +Gogs has the following dependencies: + +- [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) (v1.8.3 or higher) +- [Go](https://golang.org/doc/install) (v1.20 or higher) +- [Less.js](http://lesscss.org/usage/#command-line-usage-installing) +- [Moon](https://moonrepo.dev/docs/install) +- [goimports](https://pkg.go.dev/golang.org/x/tools/cmd/goimports) +- [go-mockgen](https://github.com/derision-test/go-mockgen) +- Database upon your choice (pick one, we choose PostgreSQL in this document): + - [PostgreSQL](https://wiki.postgresql.org/wiki/Detailed_installation_guides) (v9.6 or higher) + - [MySQL](https://dev.mysql.com/downloads/mysql/) with `ENGINE=InnoDB` (v5.7 or higher) + - [SQLite3](https://www.sqlite.org/index.html) + - [TiDB](https://github.com/pingcap/tidb) + +### macOS + +1. Install [Homebrew](https://brew.sh/). +1. Install dependencies: + + ```bash + brew install go postgresql git npm moon portless + portless trust + npm install -g less + npm install -g less-plugin-clean-css + go install github.com/derision-test/go-mockgen/cmd/go-mockgen@v1.3.3 + go install golang.org/x/tools/cmd/goimports@latest + ``` + + `portless trust` adds the local CA to your system trust store so `https://gogs.localhost` works without browser warnings. The `moon run gogs:dev` task will start the proxy and register the route automatically. + +1. Configure PostgreSQL to start automatically: + + ```bash + brew services start postgresql + ``` + +1. Ensure `psql`, the PostgreSQL command line client, is on your `$PATH`. + Homebrew does not put it there by default. Homebrew gives you the command to run to insert `psql` in your path in the "Caveats" section of `brew info postgresql`. Alternatively, you can use the command below. It might need to be adjusted depending on your Homebrew prefix (`/usr/local` below) and shell (bash below). + + ```bash + hash psql || { echo 'export PATH="/usr/local/opt/postgresql/bin:$PATH"' >> ~/.bash_profile } + source ~/.bash_profile + ``` + +### Ubuntu + +1. Add package repositories: + + ```bash + curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - + ``` + +1. Update repositories: + + ```bash + sudo apt-get update + ``` + +1. Install dependencies: + + ```bash + sudo apt install -y make git-all postgresql postgresql-contrib golang-go nodejs + npm install -g less + go install github.com/derision-test/go-mockgen/cmd/go-mockgen@v1.3.3 + go install golang.org/x/tools/cmd/goimports@latest + ``` + +1. Install [Moon](https://moonrepo.dev/docs/install). + +1. Configure startup services: + + ```bash + sudo systemctl enable postgresql + ``` + +## Step 2: Initialize your database + +You need a fresh Postgres database and a database user that has full ownership of that database. + +1. Create a database for the current Unix user: + + ```bash + # For Linux users, first access the postgres user shell + sudo su - postgres + ``` + + ```bash + createdb + ``` + +2. Create the Gogs user and password: + + ```bash + createuser --superuser gogs + psql -c "ALTER USER gogs WITH PASSWORD '';" + ``` + +3. Create the Gogs database + + ```bash + createdb --owner=gogs --encoding=UTF8 --template=template0 gogs + ``` + +## Step 3: Get the code + +Generally, you don't need a full clone, so set `--depth` to `10`: + +```bash +git clone --depth 10 https://github.com/gogs/gogs.git +``` + +**NOTE** The repository has Go modules enabled, please clone to somewhere outside of your `$GOPATH`. + +## Step 4: Configure database settings + +Create a `custom/conf/app.ini` file inside the repository and put the following configuration (everything under `custom/` directory is used to override default files and is excluded by `.gitignore`): + +```ini +[database] +TYPE = postgres +HOST = 127.0.0.1:5432 +NAME = gogs +USER = gogs +PASSWORD = +SSL_MODE = disable +``` + +## Step 5: Start the server + +The following command will start the web server and automatically recompile and restart the server if any Go files changed: + +```bash +moon run gogs:dev +``` + +**NOTE** If you changed any file under `conf/`, `templates/` or `public/` directory, be sure to rerun `moon run gogs:dev` afterwards! + +## Other nice things + +### Load HTML templates and static files from disk + +When you are actively working on HTML templates and static files during development, you may want to enable the following configuration to avoid recompiling and restarting Gogs every time you make a change to files under `template/` and `public/` directories: + +```ini +RUN_MODE = dev + +[server] +LOAD_ASSETS_FROM_DISK = true +``` + +### Offline development + +Sometimes you will want to develop Gogs but it just so happens you will be on a plane or a train or perhaps a beach, and you will have no WiFi. And you may raise your fist toward heaven and say something like, "Why, we can put a man on the moon, so why can't we develop high-quality Git hosting without an Internet connection?" But lower your hand back to your keyboard and fret no further, you *can* develop Gogs with no connectivity by setting the following configuration in your `custom/conf/app.ini`: + +```ini +[server] +OFFLINE_MODE = true +``` diff --git a/docs/docs.json b/docs/docs.json new file mode 100644 index 00000000000..6383ce8246e --- /dev/null +++ b/docs/docs.json @@ -0,0 +1,255 @@ +{ + "$schema": "https://mintlify.com/docs.json", + "theme": "mint", + "fonts": { + "family": "DM Sans" + }, + "name": "Gogs: A painless self-hosted Git service", + "colors": { + "primary": "#e45858", + "light": "#e45858", + "dark": "#e53170" + }, + "api": { + "playground": { + "display": "simple" + }, + "examples": { + "languages": ["curl"] + } + }, + "favicon": "/images/favicon.svg", + "logo": { + "light": "/images/logo-light.svg", + "dark": "/images/logo-dark.svg" + }, + "navigation": { + "tabs": [ + { + "tab": "Docs", + "groups": [ + { + "group": "Getting started", + "pages": [ + "getting-started/introduction", + "getting-started/installation" + ] + }, + { + "group": "Fine-tuning", + "pages": [ + "fine-tuning/configuration-primer", + "fine-tuning/reverse-proxy", + "fine-tuning/run-as-service" + ] + }, + { + "group": "Advancing", + "pages": [ + "advancing/authentication", + "advancing/webhooks", + "advancing/git-lfs", + "advancing/custom-templates", + "advancing/localization", + "advancing/cli-reference" + ] + }, + { + "group": "Asking", + "pages": [ + "asking/release-strategy", + "asking/troubleshooting", + "asking/faq" + ] + } + ] + }, + { + "tab": "API reference", + "groups": [ + { + "group": "Overview", + "pages": [ + "api-reference/introduction" + ] + }, + { + "group": "Repositories", + "pages": [ + "api-reference/repositories/search-repositories", + "api-reference/repositories/list-your-repositories", + "api-reference/repositories/create-a-repository", + "api-reference/repositories/list-user-repositories", + "api-reference/repositories/list-organization-repositories", + "api-reference/repositories/create-a-repository-in-an-organization", + "api-reference/repositories/migrate-a-repository", + "api-reference/repositories/get-a-repository", + "api-reference/repositories/delete-a-repository", + "api-reference/repositories/edit-issue-tracker-settings", + "api-reference/repositories/mirror-sync", + "api-reference/repositories/list-branches", + "api-reference/repositories/get-a-branch", + "api-reference/repositories/get-a-single-commit", + "api-reference/repositories/download-raw-content", + "api-reference/repositories/download-archive", + "api-reference/repositories/get-contents", + "api-reference/repositories/create-or-update-a-file", + "api-reference/repositories/list-forks", + "api-reference/repositories/list-tags", + "api-reference/repositories/list-all-commits", + "api-reference/repositories/edit-wiki-settings", + "api-reference/repositories/get-editorconfig-definition" + ] + }, + { + "group": "Collaborators and deploy keys", + "pages": [ + "api-reference/collaborators-and-deploy-keys/list-collaborators", + "api-reference/collaborators-and-deploy-keys/check-if-user-is-collaborator", + "api-reference/collaborators-and-deploy-keys/add-a-collaborator", + "api-reference/collaborators-and-deploy-keys/remove-a-collaborator", + "api-reference/collaborators-and-deploy-keys/list-deploy-keys", + "api-reference/collaborators-and-deploy-keys/add-a-deploy-key", + "api-reference/collaborators-and-deploy-keys/get-a-deploy-key", + "api-reference/collaborators-and-deploy-keys/remove-a-deploy-key" + ] + }, + { + "group": "Releases", + "pages": [ + "api-reference/releases/list-releases" + ] + }, + { + "group": "Webhooks", + "pages": [ + "api-reference/webhooks/list-hooks", + "api-reference/webhooks/create-a-hook", + "api-reference/webhooks/edit-a-hook", + "api-reference/webhooks/delete-a-hook" + ] + }, + { + "group": "Issues", + "pages": [ + "api-reference/issues/list-user-issues", + "api-reference/issues/list-issues-for-a-repository", + "api-reference/issues/create-an-issue", + "api-reference/issues/get-a-single-issue", + "api-reference/issues/edit-an-issue", + "api-reference/issues/list-comments-on-an-issue", + "api-reference/issues/create-a-comment", + "api-reference/issues/list-comments-in-a-repository", + "api-reference/issues/edit-a-comment", + "api-reference/issues/delete-a-comment", + "api-reference/issues/list-all-labels-for-a-repository", + "api-reference/issues/create-a-label", + "api-reference/issues/get-a-single-label", + "api-reference/issues/update-a-label", + "api-reference/issues/delete-a-label", + "api-reference/issues/list-labels-on-an-issue", + "api-reference/issues/add-labels-to-an-issue", + "api-reference/issues/replace-all-labels-for-an-issue", + "api-reference/issues/remove-all-labels-from-an-issue", + "api-reference/issues/remove-a-label-from-an-issue", + "api-reference/issues/list-milestones-for-a-repository", + "api-reference/issues/create-a-milestone", + "api-reference/issues/get-a-single-milestone", + "api-reference/issues/edit-a-milestone", + "api-reference/issues/delete-a-milestone" + ] + }, + { + "group": "Users", + "pages": [ + "api-reference/users/search-for-users", + "api-reference/users/get-a-single-user", + "api-reference/users/get-the-authenticated-user", + "api-reference/users/list-access-tokens", + "api-reference/users/create-an-access-token", + "api-reference/users/list-email-addresses", + "api-reference/users/add-email-addresses", + "api-reference/users/delete-email-addresses", + "api-reference/users/list-followers-of-a-user", + "api-reference/users/list-your-followers", + "api-reference/users/list-users-followed-by-a-user", + "api-reference/users/list-who-you-are-following", + "api-reference/users/check-if-you-follow-a-user", + "api-reference/users/follow-a-user", + "api-reference/users/unfollow-a-user", + "api-reference/users/check-if-a-user-follows-another", + "api-reference/users/list-public-keys-for-a-user", + "api-reference/users/get-a-single-public-key", + "api-reference/users/delete-a-public-key", + "api-reference/users/list-your-public-keys", + "api-reference/users/create-a-public-key" + ] + }, + { + "group": "Organizations", + "pages": [ + "api-reference/organizations/create-an-organization-for-user", + "api-reference/organizations/list-your-organizations", + "api-reference/organizations/list-user-organizations", + "api-reference/organizations/get-an-organization", + "api-reference/organizations/edit-an-organization", + "api-reference/organizations/list-teams-of-an-organization" + ] + }, + { + "group": "Administration", + "pages": [ + "api-reference/administration/create-a-new-user", + "api-reference/administration/edit-an-existing-user", + "api-reference/administration/delete-a-user", + "api-reference/administration/create-a-public-key-for-a-user", + "api-reference/administration/create-a-repository-for-a-user", + "api-reference/administration/create-an-organization", + "api-reference/administration/create-a-team", + "api-reference/administration/list-all-members-of-a-team", + "api-reference/administration/add-team-membership", + "api-reference/administration/remove-team-membership", + "api-reference/administration/add-or-update-team-repository", + "api-reference/administration/remove-team-repository" + ] + }, + { + "group": "Miscellaneous", + "pages": [ + "api-reference/miscellaneous/render-a-markdown-document", + "api-reference/miscellaneous/render-a-markdown-document-in-raw-mode", + "api-reference/miscellaneous/get-a-tree", + "api-reference/miscellaneous/get-a-git-blob" + ] + } + ] + } + ] + }, + "navbar": { + "links": [ + { + "label": "Demo", + "href": "https://try.gogs.io" + } + ], + "primary": { + "type": "github", + "href": "https://github.com/gogs/gogs" + } + }, + "footer": { + "socials": { + "x": "https://x.com/GogsHQ", + "github": "https://github.com/gogs/gogs" + } + }, + "contextual": { + "options": ["copy", "view", "chatgpt", "claude"] + }, + "integrations": { + "plausible": { + "domain": "gogs.io" + } + } +} diff --git a/docs/fine-tuning/configuration-primer.mdx b/docs/fine-tuning/configuration-primer.mdx new file mode 100644 index 00000000000..d0c73d6982e --- /dev/null +++ b/docs/fine-tuning/configuration-primer.mdx @@ -0,0 +1,131 @@ +--- +title: "Configuration primer" +description: "Fine tune your instance exactly the way you want." +icon: "sliders" +--- + +Gogs uses a layered configuration system. A default configuration is embedded in the binary, and you provide overrides in a custom file. Beyond `app.ini`, the `custom/` directory lets you override templates, static assets, locale files, and more. + +## Two-layer configuration + +Gogs reads configuration from two sources, in order: + +1. **Embedded defaults**: The [`conf/app.ini`](https://github.com/gogs/gogs/blob/main/conf/app.ini) file is compiled into the binary. You should never edit this file directly. +2. **Custom overrides**: Your `custom/conf/app.ini` file. Any value you set here takes precedence over the embedded default. + +This separation means binary users can upgrade without losing their settings, and source installers benefit from `custom/` being in `.gitignore`. + + + The embedded [`conf/app.ini`](https://github.com/gogs/gogs/blob/main/conf/app.ini) contains every available option with detailed inline comments. Use it as your canonical reference. + + +### Overriding a value + +You only need to include the values you want to change. For example, to set a custom repository storage path and switch to production mode: + +```ini +RUN_MODE = prod + +[repository] +ROOT = /home/git/gogs-repositories +``` + +Values support INI variable interpolation with the `%(KEY)s` syntax. The embedded defaults use this extensively, for example: + +```ini +EXTERNAL_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ +``` + +Values also support environment variable expansion, so you can reference system environment variables directly in your configuration: + +```ini +[database] +PASSWORD = ${DATABASE_PASSWORD} +``` + + + If a password or value contains special characters (like backticks or `#`), wrap it in backticks, e.g., PASSWORD = \`p@ss#word!\`. + + + + Gogs uses [go-ini/ini](https://ini.unknwon.io/) as the configuration library, please refer to its documentation for the full syntax specification including multi-line values, key/value separators, and section handling. + + +## The `custom/` directory + +The `custom/` directory is Gogs' extension point. It sits alongside the binary by default, and contains much more than just `app.ini`. + +### Finding the path + +Run `gogs web --help` to see the custom directory path in the output. You can also override it: + +| Method | Example | +|--------|---------| +| Default | The `custom/` subdirectory next to the binary | +| Environment variable | `GOGS_CUSTOM=/etc/gogs` | + +The work directory (parent of `custom/`) can also be overridden with `GOGS_WORK_DIR`. + +### Specifying a custom config path + +Every Gogs subcommand accepts `-c, --config` to point to a configuration file at a non-default location: + +```bash +gogs web --config /etc/gogs/app.ini +``` + +### What lives in `custom/` + +``` +custom/ +├── conf/ +│ ├── app.ini # Your configuration overrides +│ ├── auth.d/ # Authentication source files +│ │ └── *.conf +│ ├── gitignore/ # Custom .gitignore templates +│ ├── license/ # Custom license templates +│ ├── readme/ # Custom README templates +│ ├── label/ # Custom issue label sets +│ └── locale/ # Translation overrides +│ └── locale_*.ini +├── templates/ # HTML template overrides +├── public/ # Static asset overrides (CSS, JS, images) +└── robots.txt # Search engine crawling rules +``` + +All of these are optional. Gogs falls back to embedded defaults when a custom file does not exist. + +## Repository templates + +Gogs ships with embedded templates used when creating new repositories: + +| Template type | Embedded location | +|---------------|-------------------| +| `.gitignore` | `conf/gitignore/` | +| License | `conf/license/` | +| README | `conf/readme/` | +| Issue labels | `conf/label/` | + +You can add your own by placing files in the corresponding `custom/conf/` subdirectory. Custom files take priority over embedded ones with the same name, so you can also override built-in templates. + +For example, to add a custom `.gitignore` template that appears in the repository creation form: + +``` +custom/conf/gitignore/MyFramework +``` + +The `[repository] PREFERRED_LICENSES` option controls which licenses appear at the top of the selection list. The names must match filenames in `conf/license/` or `custom/conf/license/`. + +## Custom templates and static assets + +You can override any of Gogs' HTML templates or static assets by mirroring the file structure under `custom/`. + +**Templates** -- Place files in `custom/templates/` matching the path of the [embedded template](https://github.com/gogs/gogs/tree/main/templates) you want to override. See [Custom templates](/advancing/custom-templates) for details. + +**Static assets** -- Place files in `custom/public/` to override CSS, JavaScript, or images. Custom public files are served with higher priority than embedded ones. + +**Locale overrides** -- Place `locale_*.ini` files in `custom/conf/locale/` to override translation strings for any supported language. + +## Loading assets from disk + +By default, Gogs serves templates, locale files, and public assets from the binary's embedded data. If you set `LOAD_ASSETS_FROM_DISK = true` in `[server]`, Gogs will load them from the work directory instead. This is mainly useful during development. diff --git a/docs/fine-tuning/reverse-proxy.mdx b/docs/fine-tuning/reverse-proxy.mdx new file mode 100644 index 00000000000..4358928d5c1 --- /dev/null +++ b/docs/fine-tuning/reverse-proxy.mdx @@ -0,0 +1,373 @@ +--- +title: "Reverse proxy" +description: "Host-sharing your Git service with HTTPS" +icon: "shield-halved" +--- + +Running Gogs behind a reverse proxy allows you to serve it on standard ports (80/443) with a clean and nice URL in the browser address bar, add TLS termination, and integrate with existing web server infrastructure. + + + Make sure the `EXTERNAL_URL` in your `custom/conf/app.ini` matches the actual URL users will access. When using a reverse proxy for TLS termination, keep `PROTOCOL = http` in Gogs and set `EXTERNAL_URL` to `https://`. The reverse proxy handles the encryption, and Gogs communicates with it over plain HTTP on the local network. + + +## Caddy + + + + Add the following server block to your `Caddyfile` and reload: + + ```caddy + gogs.example.com { + proxy / http://localhost:3000 + } + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = https://gogs.example.com/ + ``` + + + Caddy automatically provisions TLS certificates via Let's Encrypt when you use a domain name. + + + + To serve Gogs under a subpath, note the trailing `/`: + + ```caddy + example.com { + proxy /gogs/ http://localhost:3000 + } + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = https://example.com/gogs/ + ``` + + + +## NGINX + + + + Add the following `server` block inside the `http` section of your `nginx.conf` (or in a file under `sites-available`), then reload the NGINX configuration: + + ```nginx + server { + listen 80; + server_name gogs.example.com; + + location / { + proxy_pass http://localhost:3000; + } + } + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = http://gogs.example.com/ + ``` + + + To serve Gogs under a subpath, note the trailing `/` on both the `location` and `proxy_pass` directives: + + ```nginx + server { + listen 80; + server_name example.com; + + location /gogs/ { + proxy_pass http://localhost:3000/; + } + } + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = http://example.com/gogs/ + ``` + + + Install [Certbot](https://certbot.eff.org/) and obtain a [Let's Encrypt](https://letsencrypt.org/) certificate: + + ```bash + sudo apt install certbot python3-certbot-nginx + sudo certbot --nginx -d gogs.example.com + ``` + + Certbot will automatically modify your Nginx configuration to use HTTPS. Your Nginx server block will look similar to: + + ```nginx + server { + listen 443 ssl; + server_name gogs.example.com; + + ssl_certificate /etc/letsencrypt/live/gogs.example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/gogs.example.com/privkey.pem; + + location / { + proxy_pass http://localhost:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + } + + server { + listen 80; + server_name gogs.example.com; + return 301 https://$host$request_uri; + } + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = https://gogs.example.com/ + ``` + + Certbot sets up automatic renewal via a cron job or systemd timer. Verify with: + + ```bash + sudo certbot renew --dry-run + ``` + + + +### Large file uploads + +If you encounter HTTP `413 Request Entity Too Large` errors when pushing large files through NGINX, add `client_max_body_size` to your server block: + +```nginx +server { + listen 80; + server_name gogs.example.com; + + client_max_body_size 50m; + + location / { + proxy_pass http://localhost:3000; + } +} +``` + + + Adjust the `client_max_body_size` value to match or exceed the maximum file size you expect users to push. The default NGINX limit is only 1 MB. + + +## Apache 2 + + + + Create or edit your virtual host configuration file (e.g. `/etc/apache2/vhost.d/gogs.conf`): + + ```apache + + ServerName gogs.example.com + + ProxyPreserveHost On + ProxyRequests off + ProxyPass / http://127.0.0.1:3000 + ProxyPassReverse / http://127.0.0.1:3000 + + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = http://gogs.example.com/ + ``` + + + To serve Gogs under a subpath, omit the trailing slash after the port number in the `ProxyPass` directives: + + ```apache + + ServerName example.com + + + Order allow,deny + Allow from all + + + ProxyPass /gogs http://127.0.0.1:3000 + ProxyPassReverse /gogs http://127.0.0.1:3000 + + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = http://example.com/gogs/ + ``` + + + Enable the `ssl` module in addition to the proxy modules: + + ```bash + sudo a2enmod proxy proxy_http ssl + sudo systemctl restart apache2 + ``` + + Apache virtual host configuration: + + ```apache + + ServerName gogs.example.com + + SSLEngine on + SSLCertificateFile /path/to/cert.pem + SSLCertificateKeyFile /path/to/key.pem + + ProxyPreserveHost On + ProxyRequests off + ProxyPass / http://127.0.0.1:3000/ + ProxyPassReverse / http://127.0.0.1:3000/ + + + # Redirect HTTP to HTTPS + + ServerName gogs.example.com + Redirect permanent / https://gogs.example.com/ + + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = https://gogs.example.com/ + ``` + + + +## lighttpd + + + + Add the following to your lighttpd configuration: + + ```lighttpd + server.modules += ( "mod_proxy" ) + + $HTTP["host"] == "gogs.example.com" { + proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => "3000" ) ) ) + } + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = http://gogs.example.com/ + ``` + + + To serve Gogs under a subpath, requires lighttpd **1.4.46 or later** for the `proxy.header` directive: + + ```lighttpd + server.modules += ( "mod_proxy" ) + + $HTTP["url"] =~ "^/gogs/" { + proxy.server = ( "" => ( ( "host" => "localhost", "port" => "3000" ) ) ) + proxy.header = ( "map-urlpath" => ( "/gogs/" => "/" ) ) + } + ``` + + Set the matching external URL in `custom/conf/app.ini`: + + ```ini + [server] + EXTERNAL_URL = http://example.com/gogs/ + ``` + + + +## IIS + +Create a new website in IIS and use the following `web.config` file. + + + If you do not need HTTPS handled by IIS, remove the entire `RedirectToHttps` rule section from the configuration below. + + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +Then set the matching external URL in `custom/conf/app.ini`: + +```ini +[server] +EXTERNAL_URL = https://gogs.example.com/ +``` + +## Native HTTPS + +If you are not using a reverse proxy, Gogs can serve HTTPS directly. Update the `[server]` section of `custom/conf/app.ini`: + +```ini +[server] +PROTOCOL = https +EXTERNAL_URL = https://gogs.example.com/ +CERT_FILE = custom/https/cert.pem +KEY_FILE = custom/https/key.pem +``` + +| Option | Description | Default | +|--------|-------------|---------| +| `PROTOCOL` | Set to `https` to enable native TLS. | `http` | +| `CERT_FILE` | Path to the TLS certificate file (PEM format). | `custom/https/cert.pem` | +| `KEY_FILE` | Path to the TLS private key file (PEM format). | `custom/https/key.pem` | +| `TLS_MIN_VERSION` | Minimum TLS version. Options: `TLS10`, `TLS11`, `TLS12`, `TLS13`. | `TLS12` | diff --git a/docs/fine-tuning/run-as-service.mdx b/docs/fine-tuning/run-as-service.mdx new file mode 100644 index 00000000000..df58699e113 --- /dev/null +++ b/docs/fine-tuning/run-as-service.mdx @@ -0,0 +1,356 @@ +--- +title: "Run as service" +description: "Configure Gogs to start automatically as a system service on Linux, macOS, and Windows" +icon: "server" +--- + +Running Gogs as a system service ensures it starts automatically on boot and restarts if it crashes. Choose the init system or service manager that matches your operating system. + +## Linux + + + + Systemd is the default init system on most modern Linux distributions (Ubuntu 16.04+, Debian 8+, CentOS 7+, Fedora, Arch Linux, etc.). + + Gogs ships with a [systemd service template](https://github.com/gogs/gogs/blob/main/scripts/systemd/gogs.service) at `scripts/systemd/gogs.service` in the installation directory. + + ### 1. Customize the service file + + Copy the template and edit it to match your installation: + + ```bash + sudo cp /home/git/gogs/scripts/systemd/gogs.service /etc/systemd/system/gogs.service + sudo vim /etc/systemd/system/gogs.service + ``` + + Here is the default service file for reference: + + ```ini + [Unit] + Description=Gogs + After=network.target + After=mariadb.service mysql.service mysqld.service postgresql.service memcached.service redis.service + + [Service] + # Uncomment the following if you have repos with lots of files + # and get an HTTP 500 error because of that + #LimitMEMLOCK=infinity + #LimitNOFILE=65535 + Type=simple + User=git + Group=git + WorkingDirectory=/home/git/gogs + ExecStart=/home/git/gogs/gogs web + Restart=always + RestartSec=2s + Environment=USER=git HOME=/home/git + + # Hardening directives (comment out if not supported by your systemd version) + ProtectSystem=full + PrivateDevices=yes + PrivateTmp=yes + NoNewPrivileges=true + + [Install] + WantedBy=multi-user.target + ``` + + Update the following values to match your environment: + - `User` and `Group` -- the system user running Gogs + - `WorkingDirectory` -- the Gogs installation directory + - `ExecStart` -- the full path to the Gogs binary + - `Environment` -- ensure `USER` and `HOME` match the Gogs user + + + If you use MySQL/MariaDB, PostgreSQL, Redis, or Memcached, the `After=` lines ensure Gogs starts after those services. Uncomment or add lines as needed for your database. + + + ### 2. Enable and start the service + + ```bash + sudo systemctl enable gogs + sudo systemctl start gogs + ``` + + ### 3. Verify the service + + ```bash + # Check status + sudo systemctl status gogs -l + + # View logs + sudo journalctl -b -u gogs + ``` + + + If you have repositories with a large number of files and encounter HTTP 500 errors, uncomment the `LimitMEMLOCK=infinity` and `LimitNOFILE=65535` directives in the service file. + + + + For Debian-based systems that do not use systemd, Gogs provides an init.d script at `scripts/init/debian/gogs`. + + ### 1. Copy and customize the script + + ```bash + sudo cp /home/git/gogs/scripts/init/debian/gogs /etc/init.d/gogs + sudo chmod +x /etc/init.d/gogs + sudo vim /etc/init.d/gogs + ``` + + Verify or update the following variables in the script: + + ```bash + WORKINGDIR=/home/git/gogs + DAEMON=$WORKINGDIR/$NAME + DAEMON_ARGS="web" + USER=git + ``` + + If you run Gogs alongside Nginx and PostgreSQL, update the init dependencies at the top of the script: + + ```bash + # Required-Start: $syslog $network $local_fs nginx postgresql + # Required-Stop: $syslog $local_fs + ``` + + ### 2. Register and start the service + + ```bash + sudo update-rc.d gogs defaults 30 70 + sudo service gogs start + ``` + + ### 3. Verify + + Visit your Gogs URL in a browser to confirm it is running. You can also check: + + ```bash + sudo service gogs status + ``` + + + For CentOS/RHEL systems, Gogs provides an init.d script at `scripts/init/centos/gogs`. + + ### 1. Copy and customize the script + + ```bash + sudo cp /home/git/gogs/scripts/init/centos/gogs /etc/rc.d/init.d/gogs + sudo chmod +x /etc/rc.d/init.d/gogs + sudo vim /etc/rc.d/init.d/gogs + ``` + + Verify or update the following variables: + + ```bash + NAME=gogs + GOGS_HOME=/home/git/gogs + GOGS_PATH=${GOGS_HOME}/$NAME + GOGS_USER=git + LOGPATH=${GOGS_HOME}/log + ``` + + + You can override these defaults by creating `/etc/sysconfig/gogs` with your custom values. + + + ### 2. Register and start the service + + ```bash + sudo chkconfig gogs on + sudo service gogs start + ``` + + ### 3. Verify + + ```bash + sudo service gogs status + ``` + + + For Gentoo and other distributions using OpenRC, create a service script at `/etc/init.d/gogs`: + + ```bash + #!/sbin/openrc-run + + description="Gogs - A painless self-hosted Git service" + command="/home/git/gogs/gogs" + command_args="web" + command_user="git" + command_background=true + pidfile="/var/run/gogs.pid" + directory="/home/git/gogs" + + depend() { + need net + after mysql postgresql + } + ``` + + Make it executable and enable it: + + ```bash + sudo chmod +x /etc/init.d/gogs + sudo rc-update add gogs default + sudo rc-service gogs start + ``` + + + +## Windows + +On Windows, Gogs can run as a native Windows service using either the builtin `minwinsvc` support or the third-party NSSM tool. + + + + Gogs binaries built with the `minwinsvc` tag (release archive name that contains `mws`) support running as a native Windows service. + + ### 1. Configure Gogs for Windows + + Edit `C:\gogs\custom\conf\app.ini`: + + ```ini + RUN_USER = COMPUTERNAME$ + ``` + + Replace `COMPUTERNAME` with the output of `echo %COMPUTERNAME%` in a command prompt. For example, if the computer name is `USER-PC`, set `RUN_USER = USER-PC$`. + + Configure the server section: + + ```ini + [server] + DOMAIN = gogs + PROTOCOL = http + HTTP_ADDR = 127.0.1.1 + HTTP_PORT = 80 + OFFLINE_MODE = true + EXTERNAL_URL = http://gogs/ + ``` + + + Using an address in the `127.x.x.x` range (other than `127.0.0.1`) prevents port conflicts with other local services while keeping traffic local. Any address from `127.0.0.2` to `127.254.254.254` works. + + + ### 2. Add a hosts entry + + Open Notepad as Administrator and edit `C:\Windows\System32\drivers\etc\hosts`: + + ```text + # Gogs local HTTPd + 127.0.1.1 gogs + ``` + + ### 3. Create and start the service + + Open a command prompt as Administrator: + + ```cmd + sc create gogs start= auto binPath= "\"C:\gogs\gogs.exe\" web --config \"C:\gogs\custom\conf\app.ini\"" + ``` + + + There must be a space after each `=` in the `sc create` command. This is a Windows `sc.exe` syntax requirement. + + + Start the service: + + ```cmd + net start gogs + ``` + + You should see: + + ```text + The gogs service is starting. + The gogs service was started successfully. + ``` + + + Windows services run from `%WINDIR%\System32` by default. Always use **absolute paths** in `app.ini` for data directories and database files: + + ```ini + [server] + APP_DATA_PATH = c:/gogs/data + + [database] + PATH = c:/gogs/data/gogs.db + ``` + + Use forward slashes (`/`) in paths to avoid escape character issues. + + + + [NSSM (Non-Sucking Service Manager)](https://nssm.cc/) provides more control over service configuration and automatic restart behavior. + + ### 1. Install NSSM + + Download [nssm.exe](https://nssm.cc/download) for your architecture (32-bit or 64-bit) and place it in a directory on your `PATH`. + + ### 2. Install the Gogs service + + Open a command prompt as Administrator: + + ```cmd + nssm install gogs + ``` + + The NSSM service installer GUI will appear. Configure the following tabs: + + **Application tab:** + - **Path:** `C:\gogs\gogs.exe` + - **Startup directory:** `C:\gogs` + - **Arguments:** `web` + + **Details tab:** + - **Display name:** `Gogs` + - **Description:** `Gogs is a painless self-hosted Git service.` + - **Startup type:** `Automatic (Delayed Start)` + + + Delayed start means the service will begin approximately two minutes after non-delayed services, reducing impact on boot time. + + + **I/O tab:** + - **Output (stdout):** `C:\gogs\log\gogs-nssm.txt` + - **Error (stderr):** `C:\gogs\log\gogs-nssm.txt` + + **File rotation tab:** + - Check **Rotate files** + - **Restrict rotation to files bigger than:** `1000000` bytes + + **Environment tab:** + - **Environment variables:** `PATH=%PATH%;C:\gogs;C:\Program Files (x86)\Git\bin` + + + The environment variable ensures both `gogs.exe` and `git.exe` are available on the service's PATH at runtime. + + + Click **Install service** to complete the setup. + + ### 3. Start and manage the service + + ```cmd + nssm start gogs + ``` + + You should see: + + ```text + gogs: START: The operation completed successfully. + ``` + + Verify by checking `C:\gogs\log\gogs-nssm.txt` for Gogs startup output, ending with lines like: + + ```text + [I] Run Mode: Production + [I] Listen: http://127.0.1.1:80 + ``` + + To restart after configuration changes: + + ```cmd + nssm restart gogs + ``` + + NSSM will automatically attempt to restart Gogs if it crashes. + + diff --git a/docs/getting-started/installation.mdx b/docs/getting-started/installation.mdx new file mode 100644 index 00000000000..d3ca28f21d3 --- /dev/null +++ b/docs/getting-started/installation.mdx @@ -0,0 +1,76 @@ +--- +title: "Installation" +description: "Get your own Git service up and running in minutes" +icon: "download" +--- + +## Prerequisites + +1. Gogs requires use of one of the following database backends: + - MySQL, >= 5.7 + - PostgreSQL, >= 9.6 + - SQLite 3 +1. Git, >= 1.8.3, on both server and client side +1. SSH server + - Only required when enable Git over SSH, e.g., `git clone git@gogs.example.com:...` + - Builtin SSH server is also available + + +**For Windows users:** + +- When using builtin SSH server, you still need to have `ssh-keygen` installed and available via the `%PATH%` environment variable. +- Use [OpenSSH](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse) on Windows 10 or newer. +- [Cygwin OpenSSH](http://docs.oracle.com/cd/E24628_01/install.121/e22624/preinstall_req_cygwin_ssh.htm) or [Copssh](https://www.itefix.net/copssh) are available on older versions of Windows. + + +## Initialize database + +If you choose to use MySQL or PostgreSQL as your database backend, you need to first complete the initial database creation. + + + + Create a database user and database: + + ```bash + psql -c "CREATE USER gogs WITH PASSWORD '{YOUR_PASSWORD}';" + psql -c "CREATE DATABASE gogs OWNER gogs ENCODING 'UTF8';" + ``` + + + Use the [bundled script](https://github.com/gogs/gogs/blob/main/scripts/mysql.sql) to create the database with proper encoding: + + ```zsh + mysql -u root -p < scripts/mysql.sql + ``` + + + +## Installation methods + + + + All release archives containing pre-built binaries are available in [dl.gogs.io](https://dl.gogs.io) and [GitHub releases](https://github.com/gogs/gogs/releases). + + + **For Windows users:** + + Release archives containing `mws` come with built-in Windows service support. If you prefer to manage the service using [NSSM](https://nssm.cc), download the standard version instead. + + + Once extracted the archive, run `gogs web` to start the server. Use `gogs web --help` to see all available options. + + + Two types of Docker images are provided: + 1. [docker-next](https://github.com/gogs/gogs/blob/main/docker-next/README.md): The modern, non-root, and cloud-native version, but with no container options. + 1. [docker](https://github.com/gogs/gogs/blob/main/docker/README.md): The traditional, root-privileged version, with extensive container options. + + + + All packages listed below are packaged by third-party maintainers. Use at your own risk. + + + |Source| Description | Note| + |------|------------------------------------------|-----| + |Arch User Repository ([link](https://aur.archlinux.org/packages/gogs/))| Stable releases | Detailed instructions available in the [Arch Linux Wiki entry](https://wiki.archlinux.org/title/Gogs). | + + diff --git a/docs/getting-started/introduction.mdx b/docs/getting-started/introduction.mdx new file mode 100644 index 00000000000..81bbf663082 --- /dev/null +++ b/docs/getting-started/introduction.mdx @@ -0,0 +1,128 @@ +--- +title: "Introduction" +sidebarTitle: "Introduction" +description: "The painless way to host your own Git service" +icon: "book-open" +--- + + + + + +## Vision + +The Gogs project aims to build a simple, stable and extensible self-hosted Git service that can be set up in the most painless way. With Go, this can be done with an independent binary distribution across all platforms that Go supports, including Linux, macOS, Windows and ARM-based systems. + +## Core values + +- **Simple to install**: Run the binary, or run as a Docker container. +- **Cross-platform**: Runs on every platform that Go toolchain supports. +- **Lightweight**: Unrealistically low resource consumption to get started. Only got 64 MiB of RAM and a quarter of vCPU? No problem! +- **Open source**: MIT-licensed since 2014, all source code available in public. + +## Sponsors + +The growth of the Gogs project wasn't possible without our world-class sponsors! + + + + + + + + + + + + + + + + + + + + + + + +## Quickstart + + + + Get your own Git service up and running in minutes. + + + Fine tune your instance exactly the way you want. + + + Discover powerful and advanced features. + + + Keep up the version and energy. + + diff --git a/docs/images/favicon.svg b/docs/images/favicon.svg new file mode 100644 index 00000000000..d94c66ddd92 --- /dev/null +++ b/docs/images/favicon.svg @@ -0,0 +1,28 @@ + + + + 编组 7 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/images/logo-dark.svg b/docs/images/logo-dark.svg new file mode 100644 index 00000000000..81c617ae280 --- /dev/null +++ b/docs/images/logo-dark.svg @@ -0,0 +1,22 @@ + + + logo组合-反白-1 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/images/logo-light.svg b/docs/images/logo-light.svg new file mode 100644 index 00000000000..1df64b9bcdd --- /dev/null +++ b/docs/images/logo-light.svg @@ -0,0 +1,22 @@ + + + logo组合-normal + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/images/sponsors/buildkite-dark.svg b/docs/images/sponsors/buildkite-dark.svg new file mode 100644 index 00000000000..af5c99ec958 --- /dev/null +++ b/docs/images/sponsors/buildkite-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/sponsors/buildkite-light.svg b/docs/images/sponsors/buildkite-light.svg new file mode 100644 index 00000000000..8df8e5e3f11 --- /dev/null +++ b/docs/images/sponsors/buildkite-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/images/sponsors/crowdin-dark.svg b/docs/images/sponsors/crowdin-dark.svg new file mode 100644 index 00000000000..c4c15b7b1f6 --- /dev/null +++ b/docs/images/sponsors/crowdin-dark.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/images/sponsors/crowdin-light.svg b/docs/images/sponsors/crowdin-light.svg new file mode 100644 index 00000000000..f8813752af0 --- /dev/null +++ b/docs/images/sponsors/crowdin-light.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/images/sponsors/digitalocean-dark.png b/docs/images/sponsors/digitalocean-dark.png new file mode 100755 index 00000000000..8898df7f9cc Binary files /dev/null and b/docs/images/sponsors/digitalocean-dark.png differ diff --git a/docs/images/sponsors/digitalocean-light.png b/docs/images/sponsors/digitalocean-light.png new file mode 100755 index 00000000000..ee98b493e02 Binary files /dev/null and b/docs/images/sponsors/digitalocean-light.png differ diff --git a/docs/images/sponsors/mintlify-dark.svg b/docs/images/sponsors/mintlify-dark.svg new file mode 100644 index 00000000000..4553d414103 --- /dev/null +++ b/docs/images/sponsors/mintlify-dark.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/images/sponsors/mintlify-light.svg b/docs/images/sponsors/mintlify-light.svg new file mode 100644 index 00000000000..744eb77228e --- /dev/null +++ b/docs/images/sponsors/mintlify-light.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/scripts/ads.js b/docs/scripts/ads.js new file mode 100644 index 00000000000..4ee4481980d --- /dev/null +++ b/docs/scripts/ads.js @@ -0,0 +1,68 @@ +// wwads.cn: above table of contents. Carbon Ads: below table of contents. +(function () { + "use strict"; + + var CARBON_ID = "gogs-carbon-ad"; + var WWADS_ID = "gogs-wwads"; + + // Load the wwads.cn global script (skipped on localhost — ad unit + // 97 is registered for gogs.io and the API rejects other origins). + var isProduction = location.hostname !== "localhost"; + if (isProduction) { + var wwScript = document.createElement("script"); + wwScript.src = "https://cdn.wwads.cn/js/makemoney.js"; + wwScript.async = true; + document.head.appendChild(wwScript); + } + + function injectCarbonAd() { + if (document.getElementById(CARBON_ID)) return; + + var toc = document.getElementById("table-of-contents"); + if (!toc) return; + + var container = document.createElement("div"); + container.id = CARBON_ID; + + var carbon = document.createElement("script"); + carbon.async = true; + carbon.type = "text/javascript"; + carbon.src = + "//cdn.carbonads.com/carbon.js?serve=CKYILK3U&placement=gogsio"; + carbon.id = "_carbonads_js"; + container.appendChild(carbon); + + toc.appendChild(container); + } + + function injectWwads() { + if (document.getElementById(WWADS_ID)) return; + + var toc = document.getElementById("table-of-contents"); + if (!toc) return; + + var container = document.createElement("div"); + container.id = WWADS_ID; + + var wwads = document.createElement("div"); + wwads.className = "wwads-cn wwads-horizontal"; + wwads.setAttribute("data-id", "97"); + container.appendChild(wwads); + + toc.insertBefore(container, toc.firstChild); + } + + function injectAds() { + injectCarbonAd(); + injectWwads(); + } + + // Re-inject when the content is replaced during SPA navigation. + var debounce; + new MutationObserver(function () { + clearTimeout(debounce); + debounce = setTimeout(injectAds, 200); + }).observe(document.documentElement, { childList: true, subtree: true }); + + injectAds(); +})(); diff --git a/docs/scripts/title.js b/docs/scripts/title.js new file mode 100644 index 00000000000..26bb21e7fc8 --- /dev/null +++ b/docs/scripts/title.js @@ -0,0 +1,15 @@ +// Fix landing page tab title: "Introduction - ..." → "Gogs - ..." +(function () { + var old = "Introduction - Gogs"; + var fix = function () { + if (document.title.startsWith(old)) { + document.title = document.title.replace(old, "Gogs"); + } + }; + new MutationObserver(fix).observe( + document.querySelector("title") || document.head, + { childList: true, subtree: true, characterData: true } + ); + fix(); + setTimeout(fix, 100); +})(); diff --git a/docs/styles/style.css b/docs/styles/style.css new file mode 100644 index 00000000000..8b1babaaa54 --- /dev/null +++ b/docs/styles/style.css @@ -0,0 +1,50 @@ +/* Fix sidebar HTTP method badge overflow for PATCH (5-char badge exceeds the default 32px container) */ +.method-nav-pill { + width: 2.5rem !important; +} + +/* Carbon Ads — below table of contents */ +#gogs-carbon-ad { + margin-top: 1rem; + border-top: 1px solid hsl(0 0% 90%); +} +.dark #gogs-carbon-ad { + border-top-color: hsl(0 0% 22%); +} +#carbonads { + margin-top: 1.5rem; + display: block; + padding: 0.75rem; + border-radius: 6px; + background: hsl(0 0% 98%); + font-size: 0.8125rem; + line-height: 1.4; +} +.dark #carbonads { + color: darkgray; + background: hsl(0 0% 12%); +} +#carbonads .carbon-img { + display: flex; + justify-content: center; + margin-bottom: 0.5rem; +} +#carbonads .carbon-img img { + max-width: 100%; + border-radius: 4px; +} + +/* wwads — above table of contents */ +#gogs-wwads { + margin-top: -1.5rem; + margin-bottom: 1.5rem; + padding-bottom: 1.5rem; + border-bottom: 1px solid hsl(0 0% 90%); +} +.dark .wwads-cn { + background: hsl(0 0% 12%); + border-bottom-color: hsl(0 0% 22%); +} +.dark .wwads-cn .wwads-text { + color: darkgray; +} diff --git a/glide.lock b/glide.lock deleted file mode 100644 index f924608f7b6..00000000000 --- a/glide.lock +++ /dev/null @@ -1,154 +0,0 @@ -hash: 1d5fcf2a90f7621ecbc0b1abed548e11d13bda3fea49b4326c829a523268e5cf -updated: 2016-06-12T17:35:14.27036884+08:00 -imports: -- name: github.com/bradfitz/gomemcache - version: fb1f79c6b65acda83063cbc69f6bba1522558bfc - subpackages: - - memcache -- name: github.com/urfave/cli - version: 1efa31f08b9333f1bd4882d61f9d668a70cd902e -- name: github.com/go-macaron/binding - version: 9440f336b443056c90d7d448a0a55ad8c7599880 -- name: github.com/go-macaron/cache - version: 56173531277692bc2925924d51fda1cd0a6b8178 - subpackages: - - memcache - - redis -- name: github.com/go-macaron/captcha - version: 8aa5919789ab301e865595eb4b1114d6b9847deb -- name: github.com/go-macaron/csrf - version: 6a9a7df172cc1fcd81e4585f44b09200b6087cc0 -- name: github.com/go-macaron/gzip - version: cad1c6580a07c56f5f6bc52d66002a05985c5854 -- name: github.com/go-macaron/i18n - version: ef57533c3b0fc2d8581deda14937e52f11a203ab -- name: github.com/go-macaron/inject - version: c5ab7bf3a307593cd44cb272d1a5beea473dd072 -- name: github.com/go-macaron/session - version: 66031fcb37a0fff002a1f028eb0b3a815c78306b - subpackages: - - redis -- name: github.com/go-macaron/toolbox - version: 82b511550b0aefc36b3a28062ad3a52e812bee38 -- name: github.com/go-sql-driver/mysql - version: 0b58b37b664c21f3010e836f1b931e1d0b0b0685 -- name: github.com/go-xorm/builder - version: cd42e8337f3031e737c3f415b6354793cf30f1c9 -- name: github.com/go-xorm/core - version: 2ec3936f8a8a3fb6397c6c10185acffa87488534 -- name: github.com/go-xorm/xorm - version: 311abf25abd146a5ddaad5dc3241eba4b4b29284 -- name: github.com/gogits/chardet - version: 2404f777256163ea3eadb273dada5dcb037993c0 -- name: github.com/gogits/cron - version: 7f3990acf1833faa5ebd0e86f0a4c72a4b5eba3c -- name: github.com/gogits/git-module - version: 5e0c1330d7853d1affbc193885d517db0f8d1ca5 -- name: github.com/gogits/go-gogs-client - version: c52f7ee0cc58d3cd6e379025552873a8df6de322 -- name: github.com/gogits/go-libravatar - version: cd1abbd55d09b793672732a7a1dfdaa12a40dfd0 -- name: github.com/issue9/identicon - version: d36b54562f4cf70c83653e13dc95c220c79ef521 -- name: github.com/jaytaylor/html2text - version: 52d9b785554a1918cb09909b89a1509a98b853fd -- name: github.com/kardianos/minwinsvc - version: cad6b2b879b0970e4245a20ebf1a81a756e2bb70 -- name: github.com/klauspost/compress - version: 14eb9c4951195779ecfbec34431a976de7335b0a - subpackages: - - gzip - - flate -- name: github.com/klauspost/cpuid - version: 09cded8978dc9e80714c4d85b0322337b0a1e5e0 -- name: github.com/klauspost/crc32 - version: 19b0b332c9e4516a6370a0456e6182c3b5036720 -- name: github.com/lib/pq - version: 80f8150043c80fb52dee6bc863a709cdac7ec8f8 - subpackages: - - oid -- name: github.com/mattn/go-sqlite3 - version: e118d4451349065b8e7ce0f0af32e033995363f8 -- name: github.com/mcuadros/go-version - version: d52711f8d6bea8dc01efafdb68ad95a4e2606630 -- name: github.com/microcosm-cc/bluemonday - version: 9dc199233bf72cc1aad9b61f73daf2f0075b9ee4 -- name: github.com/msteinert/pam - version: 02ccfbfaf0cc627aa3aec8ef7ed5cfeec5b43f63 -- name: github.com/nfnt/resize - version: 891127d8d1b52734debe1b3c3d7e747502b6c366 -- name: github.com/russross/blackfriday - version: 93622da34e54fb6529bfb7c57e710f37a8d9cbd8 -- name: github.com/satori/go.uuid - version: 0aa62d5ddceb50dbcb909d790b5345affd3669b6 -- name: github.com/sergi/go-diff - version: ec7fdbb58eb3e300c8595ad5ac74a5aa50019cc7 - subpackages: - - diffmatchpatch -- name: github.com/shurcooL/sanitized_anchor_name - version: 10ef21a441db47d8b13ebcc5fd2310f636973c77 -- name: github.com/Unknwon/cae - version: 7f5e046bc8a6c3cde743c233b96ee4fd84ee6ecd - subpackages: - - zip -- name: github.com/Unknwon/com - version: 28b053d5a2923b87ce8c5a08f3af779894a72758 -- name: github.com/Unknwon/i18n - version: 39d6f2727e0698b1021ceb6a77c1801aa92e7d5d -- name: github.com/Unknwon/paginater - version: 7748a72e01415173a27d79866b984328e7b0c12b -- name: golang.org/x/crypto - version: bc89c496413265e715159bdc8478ee9a92fdc265 - subpackages: - - ssh - - curve25519 - - ed25519 - - ed25519/internal/edwards25519 -- name: golang.org/x/net - version: 57bfaa875b96fb91b4766077f34470528d4b03e9 - subpackages: - - html - - html/charset - - html/atom -- name: golang.org/x/sys - version: a646d33e2ee3172a661fc09bca23bb4889a41bc8 - subpackages: - - windows/svc - - windows -- name: golang.org/x/text - version: 2910a502d2bf9e43193af9d68ca516529614eed3 - subpackages: - - transform - - language - - encoding - - encoding/charmap - - encoding/htmlindex - - internal/tag - - encoding/internal/identifier - - encoding/internal - - encoding/japanese - - encoding/korean - - encoding/simplifiedchinese - - encoding/traditionalchinese - - encoding/unicode - - internal/utf8internal - - runes -- name: gopkg.in/alexcesaro/quotedprintable.v3 - version: 2caba252f4dc53eaf6b553000885530023f54623 -- name: gopkg.in/asn1-ber.v1 - version: 4e86f4367175e39f69d9358a5f17b4dda270378d -- name: gopkg.in/bufio.v1 - version: 567b2bfa514e796916c4747494d6ff5132a1dfce -- name: gopkg.in/editorconfig/editorconfig-core-go.v1 - version: a872f05c2e34b37b567401384d202aff11ba06d4 -- name: gopkg.in/gomail.v2 - version: 81ebce5c23dfd25c6c67194b37d3dd3f338c98b1 -- name: gopkg.in/ini.v1 - version: cf53f9204df4fbdd7ec4164b57fa6184ba168292 -- name: gopkg.in/ldap.v2 - version: d0a5ced67b4dc310b9158d63a2c6f9c5ec13f105 -- name: gopkg.in/macaron.v1 - version: 826ddf13862c544525338a2deda6f57ffd1a9083 -- name: gopkg.in/redis.v2 - version: e6179049628164864e6e84e973cfb56335748dea -devImports: [] diff --git a/glide.yaml b/glide.yaml deleted file mode 100644 index 1d4734eb55e..00000000000 --- a/glide.yaml +++ /dev/null @@ -1,59 +0,0 @@ -package: github.com/gogits/gogs -import: -- package: github.com/Unknwon/cae - subpackages: - - zip -- package: github.com/Unknwon/com -- package: github.com/Unknwon/i18n -- package: github.com/Unknwon/paginater -- package: github.com/urfave/cli -- package: github.com/go-macaron/binding -- package: github.com/go-macaron/cache - subpackages: - - memcache - - redis -- package: github.com/go-macaron/captcha -- package: github.com/go-macaron/csrf -- package: github.com/go-macaron/gzip -- package: github.com/go-macaron/i18n -- package: github.com/go-macaron/session - subpackages: - - redis -- package: github.com/go-macaron/toolbox -- package: github.com/go-sql-driver/mysql -- package: github.com/go-xorm/core -- package: github.com/go-xorm/xorm -- package: github.com/gogits/chardet -- package: github.com/gogits/cron -- package: github.com/gogits/git-module -- package: github.com/gogits/go-gogs-client -- package: github.com/issue9/identicon -- package: github.com/kardianos/minwinsvc -- package: github.com/lib/pq -- package: github.com/mattn/go-sqlite3 -- package: github.com/mcuadros/go-version -- package: github.com/microcosm-cc/bluemonday -- package: github.com/msteinert/pam -- package: github.com/nfnt/resize -- package: github.com/russross/blackfriday -- package: github.com/satori/go.uuid -- package: github.com/sergi/go-diff - subpackages: - - diffmatchpatch -- package: github.com/strk/go-libravatar -- package: golang.org/x/crypto - subpackages: - - ssh -- package: golang.org/x/net - subpackages: - - html - - html/charset -- package: golang.org/x/text - subpackages: - - transform - - language -- package: gopkg.in/editorconfig/editorconfig-core-go.v1 -- package: gopkg.in/gomail.v2 -- package: gopkg.in/ini.v1 -- package: gopkg.in/ldap.v2 -- package: gopkg.in/macaron.v1 diff --git a/go.mod b/go.mod new file mode 100644 index 00000000000..ffeadd9e089 --- /dev/null +++ b/go.mod @@ -0,0 +1,153 @@ +module gogs.io/gogs + +go 1.26.0 + +require ( + github.com/DATA-DOG/go-sqlmock v1.5.2 + github.com/Masterminds/semver/v3 v3.4.0 + github.com/cockroachdb/errors v1.13.0 + github.com/derision-test/go-mockgen/v2 v2.1.1 + github.com/editorconfig/editorconfig-core-go/v2 v2.6.4 + github.com/fatih/color v1.18.0 + github.com/flamego/binding v1.3.0 + github.com/flamego/flamego v1.12.0 + github.com/flamego/validator v1.0.0 + github.com/glebarez/go-sqlite v1.21.2 + github.com/glebarez/sqlite v1.11.0 + github.com/go-ldap/ldap/v3 v3.4.12 + github.com/go-macaron/binding v1.2.0 + github.com/go-macaron/cache v0.0.0-20190810181446-10f7c57e2196 + github.com/go-macaron/captcha v0.2.0 + github.com/go-macaron/csrf v0.0.0-20190812063352-946f6d303a4c + github.com/go-macaron/gzip v0.0.0-20160222043647-cad1c6580a07 + github.com/go-macaron/i18n v0.6.0 + github.com/go-macaron/session v1.0.4 + github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561 + github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14 + github.com/gogs/git-module v1.8.7 + github.com/gogs/go-libravatar v0.0.0-20191106065024-33a75213d0a0 + github.com/gogs/minwinsvc v0.0.0-20170301035411-95be6356811a + github.com/google/go-github v17.0.0+incompatible + github.com/google/uuid v1.6.0 + github.com/inbucket/html2text v1.0.0 + github.com/issue9/identicon v1.2.1 + github.com/microcosm-cc/bluemonday v1.0.27 + github.com/msteinert/pam v1.2.0 + github.com/niklasfasching/go-org v1.9.1 + github.com/olekukonko/tablewriter v1.1.3 + github.com/pquerna/otp v1.5.0 + github.com/prometheus/client_golang v1.23.2 + github.com/russross/blackfriday v1.6.0 + github.com/sergi/go-diff v1.4.0 + github.com/sourcegraph/run v0.12.0 + github.com/stretchr/testify v1.11.1 + github.com/unknwon/cae v1.0.2 + github.com/unknwon/com v1.0.1 + github.com/unknwon/i18n v0.0.0-20190805065654-5c6446a380b6 + github.com/unknwon/paginater v0.0.0-20170405233947-45e5d631308e + github.com/urfave/cli/v3 v3.6.2 + github.com/wneessen/go-mail v0.7.2 + golang.org/x/crypto v0.49.0 + golang.org/x/image v0.38.0 + golang.org/x/net v0.51.0 + golang.org/x/text v0.35.0 + gopkg.in/ini.v1 v1.67.1 + gopkg.in/macaron.v1 v1.5.1 + gorm.io/driver/mysql v1.5.2 + gorm.io/driver/postgres v1.6.0 + gorm.io/gorm v1.25.12 + unknwon.dev/clog/v2 v2.2.0 + xorm.io/builder v0.3.6 + xorm.io/core v0.7.2 + xorm.io/xorm v0.8.0 +) + +require ( + bitbucket.org/creachadair/shell v0.0.7 // indirect + charm.land/lipgloss/v2 v2.0.1 // indirect + charm.land/log/v2 v2.0.0 // indirect + github.com/Azure/go-ntlmssp v0.1.1 // indirect + github.com/alecthomas/participle/v2 v2.1.4 // indirect + github.com/aymerick/douceur v0.2.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/charmbracelet/colorprofile v0.4.2 // indirect + github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 // indirect + github.com/charmbracelet/x/ansi v0.11.6 // indirect + github.com/charmbracelet/x/term v0.2.2 // indirect + github.com/charmbracelet/x/termios v0.1.1 // indirect + github.com/charmbracelet/x/windows v0.2.2 // indirect + github.com/clipperhouse/displaywidth v0.11.0 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/djherbis/buffer v1.2.0 // indirect + github.com/djherbis/nio/v3 v3.0.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/getsentry/sentry-go v0.46.0 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect + github.com/go-logfmt/logfmt v0.6.1 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-macaron/inject v0.0.0-20200308113650-138e5925c53b // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/go-querystring v1.0.0 // indirect + github.com/gorilla/css v1.0.1 // indirect + github.com/itchyny/gojq v0.12.11 // indirect + github.com/itchyny/timefmt-go v0.1.5 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.9.2 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/leodido/go-urn v1.2.1 // indirect + github.com/lib/pq v1.10.2 // indirect + github.com/lucasb-eyer/go-colorful v1.3.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect + github.com/mattn/go-sqlite3 v1.14.24 // indirect + github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect + github.com/olekukonko/errors v1.1.0 // indirect + github.com/olekukonko/ll v0.1.4-0.20260115111900-9e59c2286df0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/procfs v0.16.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect + github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + go.bobheadxi.dev/streamline v1.2.1 // indirect + go.opentelemetry.io/otel v1.11.0 // indirect + go.opentelemetry.io/otel/trace v1.11.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect + golang.org/x/mod v0.33.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + google.golang.org/protobuf v1.36.8 // indirect + gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e // indirect + gopkg.in/redis.v2 v2.3.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + modernc.org/libc v1.66.3 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect + modernc.org/sqlite v1.39.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 00000000000..06c04598d03 --- /dev/null +++ b/go.sum @@ -0,0 +1,680 @@ +bitbucket.org/creachadair/shell v0.0.7 h1:Z96pB6DkSb7F3Y3BBnJeOZH2gazyMTWlvecSD4vDqfk= +bitbucket.org/creachadair/shell v0.0.7/go.mod h1:oqtXSSvSYr4624lnnabXHaBsYW6RD80caLi2b3hJk0U= +charm.land/lipgloss/v2 v2.0.1 h1:6Xzrn49+Py1Um5q/wZG1gWgER2+7dUyZ9XMEufqPSys= +charm.land/lipgloss/v2 v2.0.1/go.mod h1:KjPle2Qd3YmvP1KL5OMHiHysGcNwq6u83MUjYkFvEkM= +charm.land/log/v2 v2.0.0 h1:SY3Cey7ipx86/MBXQHwsguOT6X1exT94mmJRdzTNs+s= +charm.land/log/v2 v2.0.0/go.mod h1:c3cZSRqm20qUVVAR1WmS/7ab8bgha3C6G7DjPcaVZz0= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.4 h1:glPeL3BQJsbF6aIIYfZizMwc5LTYz250bDMjttbBGAU= +cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= +gitea.com/lunny/log v0.0.0-20190322053110-01b5df579c4e/go.mod h1:uJEsN4LQpeGYRCjuPXPZBClU7N5pWzGuyF4uqLpE/e0= +gitea.com/lunny/nodb v0.0.0-20200923032308-3238c4655727/go.mod h1:h0OwsgcpJLSYtHcM5+Xciw9OEeuxi6ty4HDiO8C7aIY= +github.com/Azure/go-ntlmssp v0.1.1 h1:l+FM/EEMb0U9QZE7mKNEDw5Mu3mFiaa2GKOoTSsNDPw= +github.com/Azure/go-ntlmssp v0.1.1/go.mod h1:NYqdhxd/8aAct/s4qSYZEerdPuH1liG2/X9DiVTbhpk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= +github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/participle/v2 v2.1.4 h1:W/H79S8Sat/krZ3el6sQMvMaahJ+XcM9WSI2naI7w2U= +github.com/alecthomas/participle/v2 v2.1.4/go.mod h1:8tqVbpTX20Ru4NfYQgZf4mP18eXPTBViyMWiArNEgGI= +github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= +github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e h1:4dAU9FXIyQktpoUAgOJK3OTFc/xug0PCXYCqU0FgDKI= +github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= +github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/colorprofile v0.4.2 h1:BdSNuMjRbotnxHSfxy+PCSa4xAmz7szw70ktAtWRYrY= +github.com/charmbracelet/colorprofile v0.4.2/go.mod h1:0rTi81QpwDElInthtrQ6Ni7cG0sDtwAd4C4le060fT8= +github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 h1:OqDqxQZliC7C8adA7KjelW3OjtAxREfeHkNcd66wpeI= +github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318/go.mod h1:Y6kE2GzHfkyQQVCSL9r2hwokSrIlHGzZG+71+wDYSZI= +github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8= +github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ= +github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= +github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= +github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY= +github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo= +github.com/charmbracelet/x/windows v0.2.2 h1:IofanmuvaxnKHuV04sC0eBy/smG6kIKrWG2/jYn2GuM= +github.com/charmbracelet/x/windows v0.2.2/go.mod h1:/8XtdKZzedat74NQFn0NGlGL4soHB0YQZrETF96h75k= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSEFgwIwO+UVM8= +github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3JhNl3dSqnGhOoSD/o0= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= +github.com/cockroachdb/errors v1.13.0 h1:BoCcJeiP9hpBJDETkX19qi8Tb8So37srSsp3stTaDMQ= +github.com/cockroachdb/errors v1.13.0/go.mod h1:bjxt/4E5+OyuAnacpTIU9rn2mzPu1VlthvHP+xpROq0= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/couchbase/go-couchbase v0.0.0-20201026062457-7b3be89bbd89/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A= +github.com/couchbase/gomemcached v0.0.0-20190515232915-c4b4ca0eb21d/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= +github.com/couchbase/gomemcached v0.1.1/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo= +github.com/couchbase/goutils v0.0.0-20190315194238-f9d42b11473b/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= +github.com/couchbase/goutils v0.0.0-20201030094643-5e82bb967e67/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= +github.com/couchbaselabs/go-couchbase v0.0.0-20190708161019-23e7ca2ce2b7/go.mod h1:mby/05p8HE5yHEAKiIH/555NoblMs7PtW6NrYshDruc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4 h1:YcpmyvADGYw5LqMnHqSkyIELsHCGF6PkrmM31V8rF7o= +github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= +github.com/derision-test/go-mockgen/v2 v2.1.1 h1:MXG9rzyvsrDBfa1a1GatvHjCrbmEug3hVt0rSOXipCw= +github.com/derision-test/go-mockgen/v2 v2.1.1/go.mod h1:cDK2Y9IF5roTJgugWV23IvlOJsllhDN5zxRDN+g4cZo= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/djherbis/buffer v1.1.0/go.mod h1:VwN8VdFkMY0DCALdY8o00d3IZ6Amz/UNVMWcSaJT44o= +github.com/djherbis/buffer v1.2.0 h1:PH5Dd2ss0C7CRRhQCZ2u7MssF+No9ide8Ye71nPHcrQ= +github.com/djherbis/buffer v1.2.0/go.mod h1:fjnebbZjCUpPinBRD+TDwXSOeNQ7fPQWLfGQqiAiUyE= +github.com/djherbis/nio/v3 v3.0.1 h1:6wxhnuppteMa6RHA4L81Dq7ThkZH8SwnDzXDYy95vB4= +github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmWgZxOcmg= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/editorconfig/editorconfig-core-go/v2 v2.6.4 h1:CHwUbBVVyKWRX9kt5A/OtwhYUJB32DrFp9xzmjR6cac= +github.com/editorconfig/editorconfig-core-go/v2 v2.6.4/go.mod h1:JWRVKHdVW+dkv6F8p+xGCa6a+TyMrqsFbFkSs/aQkrQ= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/flamego/binding v1.3.0 h1:CPbnSuP0SxT50JR7lK2khTjcQi1oOECqRK7kbOYw91U= +github.com/flamego/binding v1.3.0/go.mod h1:xgm6FEpEKKkF8CQilK2X3MJ5kTjOTnYdz/ooFctDTdc= +github.com/flamego/flamego v1.12.0 h1:BS0iY6RytweVvu5j40fQJ53X2ZcUVeuQ8ZSigVkDB9A= +github.com/flamego/flamego v1.12.0/go.mod h1:MM4kNGS7SvJtwUZYb2oGySR+ncdtIvtJHsl8OhH1Ngo= +github.com/flamego/validator v1.0.0 h1:ixuWHVgiVGp4pVGtUn/0d6HBjZJbbXfJHDNkxW+rZoY= +github.com/flamego/validator v1.0.0/go.mod h1:POYn0/5iW4sdamdPAYPrzqN6DFC4YaczY0gYY+Pyx5E= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/getsentry/sentry-go v0.46.0 h1:mbdDaarbUdOt9X+dx6kDdntkShLEX3/+KyOsVDTPDj0= +github.com/getsentry/sentry-go v0.46.0/go.mod h1:evVbw2qotNUdYG8KxXbAdjOQWWvWIwKxpjdZZIvcIPw= +github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= +github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= +github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= +github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-ldap/ldap/v3 v3.4.12 h1:1b81mv7MagXZ7+1r7cLTWmyuTqVqdwbtJSjC0DAp9s4= +github.com/go-ldap/ldap/v3 v3.4.12/go.mod h1:+SPAGcTtOfmGsCb3h1RFiq4xpp4N636G75OEace8lNo= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE= +github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/z6CO0XAk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-macaron/binding v1.2.0 h1:/A8x8ZVQNTzFO43ch8czTqhc4VzOEPXYU/ELjIyhR60= +github.com/go-macaron/binding v1.2.0/go.mod h1:8pXMCyR9UPsXV02PYGLI+t2Xep/v2OgVuuLTNtCG03c= +github.com/go-macaron/cache v0.0.0-20190810181446-10f7c57e2196 h1:fqWZxyMLF6RVGmjvsZ9FijiU9UlAjuE6nu9RfNBZ+iE= +github.com/go-macaron/cache v0.0.0-20190810181446-10f7c57e2196/go.mod h1:O6fSdaYZbGh4clVMGMGO5k2KbMO0Cz8YdBnPrD0I8dM= +github.com/go-macaron/captcha v0.2.0 h1:d38eYDDF8tdqoM0hJbk+Jb7WQGWlwYNnQwRqLRmSk1Y= +github.com/go-macaron/captcha v0.2.0/go.mod h1:lmhlZnu9cTRGNQEkSh1qZi2IK3HJH4Z1MXkg6ARQKZA= +github.com/go-macaron/csrf v0.0.0-20190812063352-946f6d303a4c h1:kFFz1OpaH3+efG7RA33z+D0piwpA/a3x/Zn2d8z9rfw= +github.com/go-macaron/csrf v0.0.0-20190812063352-946f6d303a4c/go.mod h1:FX53Xq0NNlUj0E5in5J8Dq5nrbdK3ZyDIy6y5VWOiUo= +github.com/go-macaron/gzip v0.0.0-20160222043647-cad1c6580a07 h1:YSIA98PevNf1NtCa/J6cz7gjzpz99WVAOa9Eg0klKps= +github.com/go-macaron/gzip v0.0.0-20160222043647-cad1c6580a07/go.mod h1://cJFfDp/70L0oTNAMB+M8Jd0rpuIx/55iARuJ6StwE= +github.com/go-macaron/i18n v0.6.0 h1:7WpKDCGYH20pqwKNQgrksZHzKLp+sNA8VTSghElnO6s= +github.com/go-macaron/i18n v0.6.0/go.mod h1:8XLiwPc4KNvIsHOT0YtSrLvmr9HHjTQMDhAiEhuYCTw= +github.com/go-macaron/inject v0.0.0-20160627170012-d8a0b8677191/go.mod h1:VFI2o2q9kYsC4o7VP1HrEVosiZZTd+MVT3YZx4gqvJw= +github.com/go-macaron/inject v0.0.0-20200308113650-138e5925c53b h1:/aWj44HoEycE4MDi2HZf4t+XI7hKwZRltZf4ih5tB2c= +github.com/go-macaron/inject v0.0.0-20200308113650-138e5925c53b/go.mod h1:VFI2o2q9kYsC4o7VP1HrEVosiZZTd+MVT3YZx4gqvJw= +github.com/go-macaron/session v0.0.0-20190805070824-1a3cdc6f5659/go.mod h1:tLd0QEudXocQckwcpCq5pCuTCuYc24I0bRJDuRe9OuQ= +github.com/go-macaron/session v1.0.4 h1:fIvtOwdYBsqlb+icre1LvWB7YKnosfoSpaqT1nybh8E= +github.com/go-macaron/session v1.0.4/go.mod h1:NKoSrKpBFGEgeDtdLr/mnGaxa2LZVOg8/LwZKwPgQr0= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y= +github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561 h1:aBzukfDxQlCTVS0NBUjI5YA3iVeaZ9Tb5PxNrrIP1xs= +github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14= +github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14 h1:yXtpJr/LV6PFu4nTLgfjQdcMdzjbqqXMEnHfq0Or6p8= +github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14/go.mod h1:jPoNZLWDAqA5N3G5amEoiNbhVrmM+ZQEcnQvNQ2KaZk= +github.com/gogs/git-module v1.8.7 h1:GDyfzB1Z8ytld3LajTfUE4PuIcGcuCHpWB6j8/oD7Tk= +github.com/gogs/git-module v1.8.7/go.mod h1:IiMSJqi8XH62Kjqjt5Rw8IawSo+DHfM2dDjkSzWLjhs= +github.com/gogs/go-libravatar v0.0.0-20191106065024-33a75213d0a0 h1:K02vod+sn3M1OOkdqi2tPxN2+xESK4qyITVQ3JkGEv4= +github.com/gogs/go-libravatar v0.0.0-20191106065024-33a75213d0a0/go.mod h1:Zas3BtO88pk1cwUfEYlvnl/CRwh0ybDxRWSwRjG8I3w= +github.com/gogs/minwinsvc v0.0.0-20170301035411-95be6356811a h1:8DZwxETOVWIinYxDK+i6L+rMb7eGATGaakD6ZucfHVk= +github.com/gogs/minwinsvc v0.0.0-20170301035411-95be6356811a/go.mod h1:TUIZ+29jodWQ8Gk6Pvtg4E09aMsc3C/VLZiVYfUhWQU= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= +github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hexops/autogold v1.3.1 h1:YgxF9OHWbEIUjhDbpnLhgVsjUDsiHDTyDfy2lrfdlzo= +github.com/hexops/autogold v1.3.1/go.mod h1:sQO+mQUCVfxOKPht+ipDSkJ2SCJ7BNJVHZexsXqWMx4= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/hexops/valast v1.4.3 h1:oBoGERMJh6UZdRc6cduE1CTPK+VAdXA59Y1HFgu3sm0= +github.com/hexops/valast v1.4.3/go.mod h1:Iqx2kLj3Jn47wuXpj3wX40xn6F93QNFBHuiKBerkTGA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inbucket/html2text v1.0.0 h1:N5kza++4uBBDJ2Z3KUnTRyPNoBcW+YfOgNiNmNB+sgs= +github.com/inbucket/html2text v1.0.0/go.mod h1:5TrhXQKGU+LXurODaSm55Y9eXoPBRnYiOz4x2XfUoJU= +github.com/issue9/assert/v2 v2.0.0 h1:vN7fr70g5ND6zM39tPZk/E4WCyjGMqApmFbujSTmEo0= +github.com/issue9/assert/v2 v2.0.0/go.mod h1:rKr1eVGzXUhAo2af1thiKAhIA8uiSK9Wyn7mcZ4BzAg= +github.com/issue9/identicon v1.2.1 h1:9RUq3DcmDJvfXAYZWJDaq/Bi45oS/Fr79W0CazbXNaY= +github.com/issue9/identicon v1.2.1/go.mod h1:glX8KIeR6xzmOSMU0csAJ7vvLxVBqQuXzCbHVMV8DRI= +github.com/itchyny/gojq v0.12.11 h1:YhLueoHhHiN4mkfM+3AyJV6EPcCxKZsOnYf+aVSwaQw= +github.com/itchyny/gojq v0.12.11/go.mod h1:o3FT8Gkbg/geT4pLI0tF3hvip5F3Y/uskjRz9OYa38g= +github.com/itchyny/timefmt-go v0.1.5 h1:G0INE2la8S6ru/ZI5JecgyzbbJNs5lG1RcBqa7Jm6GE= +github.com/itchyny/timefmt-go v0.1.5/go.mod h1:nEP7L+2YmAbT2kZ2HfSs1d8Xtw9LY8D2stDBckWakZ8= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= +github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de/go.mod h1:3q8WtuPQsoRbatJuy3nvq/hRSvuBJrHHr+ybPPiNvHQ= +github.com/lunny/nodb v0.0.0-20160621015157-fc1ef06ad4af/go.mod h1:Cqz6pqow14VObJ7peltM+2n3PWOz7yTrfUuGbVFkzN0= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 h1:YocNLcTBdEdvY3iDK6jfWXvEaM5OCKkjxPKoJRdB3Gg= +github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo= +github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= +github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= +github.com/msteinert/pam v1.2.0 h1:mYfjlvN2KYs2Pb9G6nb/1f/nPfAttT/Jee5Sq9r3bGE= +github.com/msteinert/pam v1.2.0/go.mod h1:d2n0DCUK8rGecChV3JzvmsDjOY4R7AYbsNxAT+ftQl0= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/nightlyone/lockfile v1.0.0 h1:RHep2cFKK4PonZJDdEl4GmkabuhbsRMgk/k3uAmxBiA= +github.com/nightlyone/lockfile v1.0.0/go.mod h1:rywoIealpdNse2r832aiD9jRk8ErCatROs6LzC841CI= +github.com/niklasfasching/go-org v1.9.1 h1:/3s4uTPOF06pImGa2Yvlp24yKXZoTYM+nsIlMzfpg/0= +github.com/niklasfasching/go-org v1.9.1/go.mod h1:ZAGFFkWvUQcpazmi/8nHqwvARpr1xpb+Es67oUGX/48= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc= +github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0= +github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= +github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.1.4-0.20260115111900-9e59c2286df0 h1:jrYnow5+hy3WRDCBypUFvVKNSPPCdqgSXIE9eJDD8LM= +github.com/olekukonko/ll v0.1.4-0.20260115111900-9e59c2286df0/go.mod h1:b52bVQRRPObe+yyBl0TxNfhesL0nedD4Cht0/zx55Ew= +github.com/olekukonko/tablewriter v1.1.3 h1:VSHhghXxrP0JHl+0NnKid7WoEmd9/urKRJLysb70nnA= +github.com/olekukonko/tablewriter v1.1.3/go.mod h1:9VU0knjhmMkXjnMKrZ3+L2JhhtsQ/L38BbL3CRNE8tM= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pquerna/otp v1.5.0 h1:NMMR+WrmaqXU4EzdGJEE1aUUI0AMRzsp96fFFWNPwxs= +github.com/pquerna/otp v1.5.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI= +github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= +github.com/siddontang/go-snappy v0.0.0-20140704025258-d8f7bb82a96d/go.mod h1:vq0tzqLRu6TS7Id0wMo2N5QzJoKedVeovOpHjnykSzY= +github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= +github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= +github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY= +github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= +github.com/sourcegraph/run v0.12.0 h1:3A8w5e8HIYPfafHekvmdmmh42RHKGVhmiTZAPJclg7I= +github.com/sourcegraph/run v0.12.0/go.mod h1:PwaP936BTnAJC1cqR5rSbG5kOs/EWStTK3lqvMX5GUA= +github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= +github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/unknwon/cae v1.0.2 h1:3L8/RCN1ARvD5quyNjU30EdvYkFbxBfnRcIBXugpHlg= +github.com/unknwon/cae v1.0.2/go.mod h1:HqpmD2fVq9G1oGEXrXzbgIp51uJ29Hshv41n9ljm+AA= +github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= +github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs= +github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= +github.com/unknwon/i18n v0.0.0-20190805065654-5c6446a380b6 h1:sRrkJEHtNoaSvyXMbRgofEOX4/3gMiraevQKJdIBhYE= +github.com/unknwon/i18n v0.0.0-20190805065654-5c6446a380b6/go.mod h1:+5rDk6sDGpl3azws3O+f+GpFSyN9GVr0K8cvQLQM2ZQ= +github.com/unknwon/paginater v0.0.0-20170405233947-45e5d631308e h1:Qf3QQl/zmEbWDajFEiisbKN83hLY+eq2MhbA0I1/two= +github.com/unknwon/paginater v0.0.0-20170405233947-45e5d631308e/go.mod h1:TBwoao3Q4Eb/cp+dHbXDfRTrZSsj/k7kLr2j1oWRWC0= +github.com/urfave/cli/v3 v3.6.2 h1:lQuqiPrZ1cIz8hz+HcrG0TNZFxU70dPZ3Yl+pSrH9A8= +github.com/urfave/cli/v3 v3.6.2/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso= +github.com/wneessen/go-mail v0.7.2 h1:xxPnhZ6IZLSgxShebmZ6DPKh1b6OJcoHfzy7UjOkzS8= +github.com/wneessen/go-mail v0.7.2/go.mod h1:+TkW6QP3EVkgTEqHtVmnAE/1MRhmzb8Y9/W3pweuS+k= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +go.bobheadxi.dev/streamline v1.2.1 h1:IqKSA1TbeuDqCzYNAwtlh8sqf3tsQus8XgJdkCWFT8c= +go.bobheadxi.dev/streamline v1.2.1/go.mod h1:yJsVXOSBFLgAKvsnf6WmIzmB2A65nWqkR/sRNxJPa74= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opentelemetry.io/otel v1.11.0 h1:kfToEGMDq6TrVrJ9Vht84Y8y9enykSZzDDZglV0kIEk= +go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk= +go.opentelemetry.io/otel/sdk v1.11.0 h1:ZnKIL9V9Ztaq+ME43IUi/eo22mNsb6a7tGfzaOWB5fo= +go.opentelemetry.io/otel/sdk v1.11.0/go.mod h1:REusa8RsyKaq0OlyangWXaw97t2VogoO4SSEeKkSTAk= +go.opentelemetry.io/otel/trace v1.11.0 h1:20U/Vj42SX+mASlXLmSGBg6jpI1jQtv682lZtTAOVFI= +go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/image v0.38.0 h1:5l+q+Y9JDC7mBOMjo4/aPhMDcxEptsX+Tt3GgRQRPuE= +golang.org/x/image v0.38.0/go.mod h1:/3f6vaXC+6CEanU4KJxbcUZyEePbyKbaLoDOe4ehFYY= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= +golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190802220118-1d1727260058/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e h1:wGA78yza6bu/mWcc4QfBuIEHEtc06xdiU0X8sY36yUU= +gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e/go.mod h1:xsQCaysVCudhrYTfzYWe577fCe7Ceci+6qjO2Rdc0Z4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.1 h1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k= +gopkg.in/ini.v1 v1.67.1/go.mod h1:x/cyOwCgZqOkJoDIJ3c1KNHMo10+nLGAhh+kn3Zizss= +gopkg.in/macaron.v1 v1.3.4/go.mod h1:/RoHTdC8ALpyJ3+QR36mKjwnT1F1dyYtsGM9Ate6ZFI= +gopkg.in/macaron.v1 v1.3.5/go.mod h1:uMZCFccv9yr5TipIalVOyAyZQuOH3OkmXvgcWwhJuP4= +gopkg.in/macaron.v1 v1.4.0/go.mod h1:uMZCFccv9yr5TipIalVOyAyZQuOH3OkmXvgcWwhJuP4= +gopkg.in/macaron.v1 v1.5.1 h1:0ytdXYcf6//a8bzedl1fVXzPeIXblEqoNPntWAo9YLU= +gopkg.in/macaron.v1 v1.5.1/go.mod h1:AiquOw8YeZJC8sUe11vIO6NeA1/TKSlzQXuJ7Tc4cCQ= +gopkg.in/redis.v2 v2.3.2 h1:GPVIIB/JnL1wvfULefy3qXmPu1nfNu2d0yA09FHgwfs= +gopkg.in/redis.v2 v2.3.2/go.mod h1:4wl9PJ/CqzeHk3LVq1hNLHH8krm3+AXEgut4jVc++LU= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210105161348-2e78108cf5f8/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs= +gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM= +modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU= +modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE= +modernc.org/fileutil v1.3.8 h1:qtzNm7ED75pd1C7WgAGcK4edm4fvhtBsEiI/0NQ54YM= +modernc.org/fileutil v1.3.8/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= +modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= +modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ= +modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.39.0 h1:6bwu9Ooim0yVYA7IZn9demiQk/Ejp0BtTjBWFLymSeY= +modernc.org/sqlite v1.39.0/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= +mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= +unknwon.dev/clog/v2 v2.2.0 h1:jkPdsxux0MC04BT/9NHbT75z4prK92SH10VBNmIpVCc= +unknwon.dev/clog/v2 v2.2.0/go.mod h1:zvUlyibDHI4mykYdWyWje2G9nF/nBzfDOqRo2my4mWc= +xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8= +xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU= +xorm.io/core v0.7.2 h1:mEO22A2Z7a3fPaZMk6gKL/jMD80iiyNwRrX5HOv3XLw= +xorm.io/core v0.7.2/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM= +xorm.io/xorm v0.8.0 h1:iALxgJrX8O00f8Jk22GbZwPmxJNgssV5Mv4uc2HL9PM= +xorm.io/xorm v0.8.0/go.mod h1:ZkJLEYLoVyg7amJK/5r779bHyzs2AU8f8VMiP6BM7uY= diff --git a/gogs.go b/gogs.go deleted file mode 100644 index 0378bebf732..00000000000 --- a/gogs.go +++ /dev/null @@ -1,42 +0,0 @@ -// +build go1.5 - -// Copyright 2014 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. - -// Gogs (Go Git Service) is a painless self-hosted Git Service. -package main - -import ( - "os" - "runtime" - - "github.com/urfave/cli" - - "github.com/gogits/gogs/cmd" - "github.com/gogits/gogs/modules/setting" -) - -const APP_VER = "0.9.100.1119" - -func init() { - runtime.GOMAXPROCS(runtime.NumCPU()) - setting.AppVer = APP_VER -} - -func main() { - app := cli.NewApp() - app.Name = "Gogs" - app.Usage = "Go Git Service: a painless self-hosted Git service" - app.Version = APP_VER - app.Commands = []cli.Command{ - cmd.CmdWeb, - cmd.CmdServ, - cmd.CmdUpdate, - cmd.CmdDump, - cmd.CmdCert, - cmd.CmdAdmin, - } - app.Flags = append(app.Flags, []cli.Flag{}...) - app.Run(os.Args) -} diff --git a/internal/app/api.go b/internal/app/api.go new file mode 100644 index 00000000000..eebb7ccc820 --- /dev/null +++ b/internal/app/api.go @@ -0,0 +1,30 @@ +package app + +import ( + "net/http" + + "github.com/microcosm-cc/bluemonday" + "gopkg.in/macaron.v1" +) + +func ipynbSanitizer() *bluemonday.Policy { + p := bluemonday.UGCPolicy() + p.AllowAttrs("class", "data-prompt-number").OnElements("div") + p.AllowAttrs("class").OnElements("img") + p.AllowURLSchemes("data") + return p +} + +func SanitizeIpynb() macaron.Handler { + p := ipynbSanitizer() + + return func(c *macaron.Context) { + html, err := c.Req.Body().String() + if err != nil { + c.Error(http.StatusInternalServerError, "read body") + return + } + + c.PlainText(http.StatusOK, []byte(p.Sanitize(html))) + } +} diff --git a/internal/app/api_test.go b/internal/app/api_test.go new file mode 100644 index 00000000000..ad78853b5b0 --- /dev/null +++ b/internal/app/api_test.go @@ -0,0 +1,91 @@ +package app + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_ipynbSanitizer(t *testing.T) { + p := ipynbSanitizer() + + tests := []struct { + name string + input string + want string + }{ + { + name: "allow 'class' and 'data-prompt-number' attributes", + input: ` +
+
+
Hello world
+
+
+
+
+
+
+`, + want: ` +
+
+
Hello world
+
+
+
+
+
+
+`, + }, + { + name: "allow base64 encoded images", + input: ` +
+ +
+`, + want: ` +
+ +
+`, + }, + { + name: "prevent XSS", + input: ` +
+
+ + +
+
+`, + want: ` +
+
+ + +
+
+`, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + assert.Equal(t, test.want, p.Sanitize(test.input)) + }) + } +} diff --git a/internal/app/metrics.go b/internal/app/metrics.go new file mode 100644 index 00000000000..5e125b4432d --- /dev/null +++ b/internal/app/metrics.go @@ -0,0 +1,29 @@ +package app + +import ( + "net/http" + + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/authx" + "gogs.io/gogs/internal/conf" +) + +func MetricsFilter() macaron.Handler { + return func(w http.ResponseWriter, r *http.Request) { + if !conf.Prometheus.Enabled { + w.WriteHeader(http.StatusNotFound) + return + } + + if !conf.Prometheus.EnableBasicAuth { + return + } + + username, password := authx.DecodeBasic(r.Header) + if username != conf.Prometheus.BasicAuthUsername || password != conf.Prometheus.BasicAuthPassword { + w.WriteHeader(http.StatusForbidden) + return + } + } +} diff --git a/internal/auth/auth.go b/internal/auth/auth.go new file mode 100644 index 00000000000..3b53fd9eb4f --- /dev/null +++ b/internal/auth/auth.go @@ -0,0 +1,91 @@ +package auth + +import ( + "fmt" + + "github.com/cockroachdb/errors" + + "gogs.io/gogs/internal/errx" +) + +type Type int + +// Note: New type must append to the end of list to maintain backward compatibility. +const ( + None Type = iota + Plain // 1 + LDAP // 2 + SMTP // 3 + PAM // 4 + DLDAP // 5 + GitHub // 6 + + Mock Type = 999 +) + +// Name returns the human-readable name for given authentication type. +func Name(typ Type) string { + return map[Type]string{ + LDAP: "LDAP (via BindDN)", + DLDAP: "LDAP (simple auth)", // Via direct bind + SMTP: "SMTP", + PAM: "PAM", + GitHub: "GitHub", + }[typ] +} + +var _ errx.NotFound = (*ErrBadCredentials)(nil) + +type ErrBadCredentials struct { + Args errx.Args +} + +// IsErrBadCredentials returns true if the underlying error has the type +// ErrBadCredentials. +func IsErrBadCredentials(err error) bool { + return errors.As(err, &ErrBadCredentials{}) +} + +func (err ErrBadCredentials) Error() string { + return fmt.Sprintf("bad credentials: %v", err.Args) +} + +func (ErrBadCredentials) NotFound() bool { + return true +} + +// ExternalAccount contains queried information returned by an authenticate provider +// for an external account. +type ExternalAccount struct { + // REQUIRED: The login to be used for authenticating against the provider. + Login string + // REQUIRED: The username of the account. + Name string + // The full name of the account. + FullName string + // The email address of the account. + Email string + // The location of the account. + Location string + // The website of the account. + Website string + // Whether the user should be prompted as a site admin. + Admin bool +} + +// Provider defines an authenticate provider which provides ability to authentication against +// an external identity provider and query external account information. +type Provider interface { + // Authenticate performs authentication against an external identity provider + // using given credentials and returns queried information of the external account. + Authenticate(login, password string) (*ExternalAccount, error) + + // Config returns the underlying configuration of the authenticate provider. + Config() any + // HasTLS returns true if the authenticate provider supports TLS. + HasTLS() bool + // UseTLS returns true if the authenticate provider is configured to use TLS. + UseTLS() bool + // SkipTLSVerify returns true if the authenticate provider is configured to skip TLS verify. + SkipTLSVerify() bool +} diff --git a/internal/auth/github/config.go b/internal/auth/github/config.go new file mode 100644 index 00000000000..96ac669d5d7 --- /dev/null +++ b/internal/auth/github/config.go @@ -0,0 +1,54 @@ +package github + +import ( + "context" + "crypto/tls" + "net/http" + "strings" + + "github.com/cockroachdb/errors" + "github.com/google/go-github/github" +) + +// Config contains configuration for GitHub authentication. +// +// ⚠️ WARNING: Change to the field name must preserve the INI key name for backward compatibility. +type Config struct { + // the GitHub service endpoint, e.g. https://api.github.com/. + APIEndpoint string + SkipVerify bool +} + +func (c *Config) doAuth(login, password string) (fullname, email, location, website string, err error) { + tp := github.BasicAuthTransport{ + Username: strings.TrimSpace(login), + Password: strings.TrimSpace(password), + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: c.SkipVerify}, + }, + } + client, err := github.NewEnterpriseClient(c.APIEndpoint, c.APIEndpoint, tp.Client()) + if err != nil { + return "", "", "", "", errors.Wrap(err, "create new client") + } + user, _, err := client.Users.Get(context.Background(), "") + if err != nil { + return "", "", "", "", errors.Wrap(err, "get user info") + } + + if user.Name != nil { + fullname = *user.Name + } + if user.Email != nil { + email = *user.Email + } else { + email = login + "+github@local" + } + if user.Location != nil { + location = strings.ToUpper(*user.Location) + } + if user.HTMLURL != nil { + website = strings.ToLower(*user.HTMLURL) + } + return fullname, email, location, website, nil +} diff --git a/internal/auth/github/provider.go b/internal/auth/github/provider.go new file mode 100644 index 00000000000..cb1c01e89f6 --- /dev/null +++ b/internal/auth/github/provider.go @@ -0,0 +1,53 @@ +package github + +import ( + "strings" + + "gogs.io/gogs/internal/auth" +) + +// Provider contains configuration of a PAM authentication provider. +type Provider struct { + config *Config +} + +// NewProvider creates a new PAM authentication provider. +func NewProvider(cfg *Config) auth.Provider { + return &Provider{ + config: cfg, + } +} + +func (p *Provider) Authenticate(login, password string) (*auth.ExternalAccount, error) { + fullname, email, website, location, err := p.config.doAuth(login, password) + if err != nil { + if strings.Contains(err.Error(), "401") { + return nil, auth.ErrBadCredentials{Args: map[string]any{"login": login}} + } + return nil, err + } + return &auth.ExternalAccount{ + Login: login, + Name: login, + FullName: fullname, + Email: email, + Location: location, + Website: website, + }, nil +} + +func (p *Provider) Config() any { + return p.config +} + +func (*Provider) HasTLS() bool { + return true +} + +func (*Provider) UseTLS() bool { + return true +} + +func (p *Provider) SkipTLSVerify() bool { + return p.config.SkipVerify +} diff --git a/internal/auth/ldap/README.md b/internal/auth/ldap/README.md new file mode 100644 index 00000000000..bc357e963a8 --- /dev/null +++ b/internal/auth/ldap/README.md @@ -0,0 +1,119 @@ +Gogs LDAP Authentication Module +=============================== + +## About + +This authentication module attempts to authorize and authenticate a user +against an LDAP server. It provides two methods of authentication: LDAP via +BindDN, and LDAP simple authentication. + +LDAP via BindDN functions like most LDAP authentication systems. First, it +queries the LDAP server using a Bind DN and searches for the user that is +attempting to sign in. If the user is found, the module attempts to bind to the +server using the user's supplied credentials. If this succeeds, the user has +been authenticated, and their account information is retrieved and passed to the +Gogs login infrastructure. + +LDAP simple authentication does not utilize a Bind DN. Instead, it binds +directly with the LDAP server using the user's supplied credentials. If the bind +succeeds and no filter rules out the user, the user is authenticated. + +LDAP via BindDN is recommended for most users. By using a Bind DN, the server +can perform authorization by restricting which entries the Bind DN account can +read. Furthermore, using a Bind DN with reduced permissions can reduce security risk +in the face of application bugs. + +## Usage + +To use this module, add an LDAP authentication source via the Authentications +section in the admin panel. Both the LDAP via BindDN and the simple auth LDAP +share the following fields: + +* Authorization Name **(required)** + * A name to assign to the new method of authorization. + +* Host **(required)** + * The address where the LDAP server can be reached. + * Example: mydomain.com + +* Port **(required)** + * The port to use when connecting to the server. + * Example: 636 + +* Enable TLS Encryption (optional) + * Whether to use TLS when connecting to the LDAP server. + +* Admin Filter (optional) + * An LDAP filter specifying if a user should be given administrator + privileges. If a user accounts passes the filter, the user will be + privileged as an administrator. + * Example: (objectClass=adminAccount) + +* First name attribute (optional) + * The attribute of the user's LDAP record containing the user's first name. + This will be used to populate their account information. + * Example: givenName + +* Surname attribute (optional) + * The attribute of the user's LDAP record containing the user's surname This + will be used to populate their account information. + * Example: sn + +* E-mail attribute **(required)** + * The attribute of the user's LDAP record containing the user's email + address. This will be used to populate their account information. + * Example: mail + +**LDAP via BindDN** adds the following fields: + +* Bind DN (optional) + * The DN to bind to the LDAP server with when searching for the user. This + may be left blank to perform an anonymous search. + * Example: cn=Search,dc=mydomain,dc=com + +* Bind Password (optional) + * The password for the Bind DN specified above, if any. _Note: The password + is stored in plaintext at the server. As such, ensure that your Bind DN + has as few privileges as possible._ + +* User Search Base **(required)** + * The LDAP base at which user accounts will be searched for. + * Example: ou=Users,dc=mydomain,dc=com + +* User Filter **(required)** + * An LDAP filter declaring how to find the user record that is attempting to + authenticate. The '%s' matching parameter will be substituted with the + user's username. + * Example: (&(objectClass=posixAccount)(uid=%s)) + +**LDAP using simple auth** adds the following fields: + +* User DN **(required)** + * A template to use as the user's DN. The `%s` matching parameter will be + substituted with the user's username. + * Example: cn=%s,ou=Users,dc=mydomain,dc=com + * Example: uid=%s,ou=Users,dc=mydomain,dc=com + +* User Filter **(required)** + * An LDAP filter declaring when a user should be allowed to log in. The `%s` + matching parameter will be substituted with the user's username. + * Example: (&(objectClass=posixAccount)(cn=%s)) + * Example: (&(objectClass=posixAccount)(uid=%s)) + +**Verify group membership in LDAP** uses the following fields: + +* Group Search Base (optional) + * The LDAP DN used for groups. + * Example: ou=group,dc=mydomain,dc=com + +* Group Name Filter (optional) + * An LDAP filter declaring how to find valid groups in the above DN. + * Example: (|(cn=gogs_users)(cn=admins)) + +* User Attribute in Group (optional) + * Which user LDAP attribute is listed in the group. + * Example: uid + +* Group Attribute for User (optional) + * Which group LDAP attribute contains an array above user attribute names. + * Example: memberUid diff --git a/internal/auth/ldap/config.go b/internal/auth/ldap/config.go new file mode 100644 index 00000000000..3da9195a2e1 --- /dev/null +++ b/internal/auth/ldap/config.go @@ -0,0 +1,341 @@ +// Package ldap provide functions & structure to query a LDAP ldap directory. +// For now, it's mainly tested again an MS Active Directory service, see README.md for more information. +package ldap + +import ( + "crypto/tls" + "fmt" + "strings" + + "github.com/cockroachdb/errors" + "github.com/go-ldap/ldap/v3" + log "unknwon.dev/clog/v2" +) + +// SecurityProtocol is the security protocol when the authenticate provider talks to LDAP directory. +type SecurityProtocol int + +// ⚠️ WARNING: new type must be added at the end of list to maintain compatibility. +const ( + SecurityProtocolUnencrypted SecurityProtocol = iota + SecurityProtocolLDAPS + SecurityProtocolStartTLS +) + +// SecurityProtocolName returns the human-readable name for given security protocol. +func SecurityProtocolName(protocol SecurityProtocol) string { + return map[SecurityProtocol]string{ + SecurityProtocolUnencrypted: "Unencrypted", + SecurityProtocolLDAPS: "LDAPS", + SecurityProtocolStartTLS: "StartTLS", + }[protocol] +} + +// Config contains configuration for LDAP authentication. +// +// ⚠️ WARNING: Change to the field name must preserve the INI key name for backward compatibility. +type Config struct { + Host string // LDAP host + Port int // Port number + SecurityProtocol SecurityProtocol + SkipVerify bool + BindDN string `ini:"bind_dn,omitempty"` // DN to bind with + BindPassword string `ini:",omitempty"` // Bind DN password + UserBase string `ini:",omitempty"` // Base search path for users + UserDN string `ini:"user_dn,omitempty"` // Template for the DN of the user for simple auth + AttributeUsername string // Username attribute + AttributeName string // First name attribute + AttributeSurname string // Surname attribute + AttributeMail string // Email attribute + AttributesInBind bool // Fetch attributes in bind context (not user) + Filter string // Query filter to validate entry + AdminFilter string // Query filter to check if user is admin + GroupEnabled bool // Whether the group checking is enabled + GroupDN string `ini:"group_dn"` // Group search base + GroupFilter string // Group name filter + GroupMemberUID string `ini:"group_member_uid"` // Group Attribute containing array of UserUID + UserUID string `ini:"user_uid"` // User Attribute listed in group +} + +func (c *Config) SecurityProtocolName() string { + return SecurityProtocolName(c.SecurityProtocol) +} + +func (c *Config) sanitizedUserQuery(username string) (string, bool) { + // See http://tools.ietf.org/search/rfc4515 + badCharacters := "\x00()*\\" + if strings.ContainsAny(username, badCharacters) { + log.Trace("LDAP: Username contains invalid query characters: %s", username) + return "", false + } + + return strings.ReplaceAll(c.Filter, "%s", username), true +} + +func (c *Config) sanitizedUserDN(username string) (string, bool) { + // See http://tools.ietf.org/search/rfc4514: "special characters" + badCharacters := "\x00()*\\,='\"#+;<>" + if strings.ContainsAny(username, badCharacters) || strings.HasPrefix(username, " ") || strings.HasSuffix(username, " ") { + log.Trace("LDAP: Username contains invalid query characters: %s", username) + return "", false + } + + return strings.ReplaceAll(c.UserDN, "%s", username), true +} + +func (*Config) sanitizedGroupFilter(group string) (string, bool) { + // See http://tools.ietf.org/search/rfc4515 + badCharacters := "\x00*\\" + if strings.ContainsAny(group, badCharacters) { + log.Trace("LDAP: Group filter invalid query characters: %s", group) + return "", false + } + + return group, true +} + +func (*Config) sanitizedGroupDN(groupDn string) (string, bool) { + // See http://tools.ietf.org/search/rfc4514: "special characters" + badCharacters := "\x00()*\\'\"#+;<>" + if strings.ContainsAny(groupDn, badCharacters) || strings.HasPrefix(groupDn, " ") || strings.HasSuffix(groupDn, " ") { + log.Trace("LDAP: Group DN contains invalid query characters: %s", groupDn) + return "", false + } + + return groupDn, true +} + +func (c *Config) findUserDN(l *ldap.Conn, name string) (string, bool) { + log.Trace("Search for LDAP user: %s", name) + if len(c.BindDN) > 0 && len(c.BindPassword) > 0 { + // Replace placeholders with username + bindDN := strings.ReplaceAll(c.BindDN, "%s", name) + err := l.Bind(bindDN, c.BindPassword) + if err != nil { + log.Trace("LDAP: Failed to bind as BindDN '%s': %v", bindDN, err) + return "", false + } + log.Trace("LDAP: Bound as BindDN: %s", bindDN) + } else { + log.Trace("LDAP: Proceeding with anonymous LDAP search") + } + + // A search for the user. + userFilter, ok := c.sanitizedUserQuery(name) + if !ok { + return "", false + } + + log.Trace("LDAP: Searching for DN using filter %q and base %q", userFilter, c.UserBase) + search := ldap.NewSearchRequest( + c.UserBase, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, + false, userFilter, []string{}, nil) + + // Ensure we found a user + sr, err := l.Search(search) + if err != nil || len(sr.Entries) < 1 { + log.Trace("LDAP: Failed to search using filter %q: %v", userFilter, err) + return "", false + } else if len(sr.Entries) > 1 { + log.Trace("LDAP: Filter %q returned more than one user", userFilter) + return "", false + } + + userDN := sr.Entries[0].DN + if userDN == "" { + log.Error("LDAP: Search was successful, but found no DN!") + return "", false + } + + return userDN, true +} + +func dial(ls *Config) (*ldap.Conn, error) { + log.Trace("LDAP: Dialing with security protocol '%v' without verifying: %v", ls.SecurityProtocol, ls.SkipVerify) + + tlsCfg := &tls.Config{ + ServerName: ls.Host, + InsecureSkipVerify: ls.SkipVerify, + } + if ls.SecurityProtocol == SecurityProtocolLDAPS { + return ldap.DialTLS("tcp", fmt.Sprintf("%s:%d", ls.Host, ls.Port), tlsCfg) + } + + conn, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ls.Host, ls.Port)) + if err != nil { + return nil, errors.Newf("dial: %v", err) + } + + if ls.SecurityProtocol == SecurityProtocolStartTLS { + if err = conn.StartTLS(tlsCfg); err != nil { + conn.Close() + return nil, errors.Newf("StartTLS: %v", err) + } + } + + return conn, nil +} + +func bindUser(l *ldap.Conn, userDN, passwd string) error { + log.Trace("Binding with userDN: %s", userDN) + err := l.Bind(userDN, passwd) + if err != nil { + log.Trace("LDAP authentication failed for '%s': %v", userDN, err) + return err + } + log.Trace("Bound successfully with userDN: %s", userDN) + return err +} + +// searchEntry searches an LDAP source if an entry (name, passwd) is valid and in the specific filter. +func (c *Config) searchEntry(name, passwd string, directBind bool) (string, string, string, string, bool, bool) { + // See https://tools.ietf.org/search/rfc4513#section-5.1.2 + if passwd == "" { + log.Trace("authentication failed for '%s' with empty password", name) + return "", "", "", "", false, false + } + l, err := dial(c) + if err != nil { + log.Error("LDAP connect failed for '%s': %v", c.Host, err) + return "", "", "", "", false, false + } + defer l.Close() + + var userDN string + if directBind { + log.Trace("LDAP will bind directly via UserDN template: %s", c.UserDN) + + var ok bool + userDN, ok = c.sanitizedUserDN(name) + if !ok { + return "", "", "", "", false, false + } + } else { + log.Trace("LDAP will use BindDN") + + var found bool + userDN, found = c.findUserDN(l, name) + if !found { + return "", "", "", "", false, false + } + } + + if directBind || !c.AttributesInBind { + // binds user (checking password) before looking-up attributes in user context + err = bindUser(l, userDN, passwd) + if err != nil { + return "", "", "", "", false, false + } + } + + userFilter, ok := c.sanitizedUserQuery(name) + if !ok { + return "", "", "", "", false, false + } + + log.Trace("Fetching attributes %q, %q, %q, %q, %q with user filter %q and user DN %q", + c.AttributeUsername, c.AttributeName, c.AttributeSurname, c.AttributeMail, c.UserUID, userFilter, userDN) + + search := ldap.NewSearchRequest( + userDN, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, userFilter, + []string{c.AttributeUsername, c.AttributeName, c.AttributeSurname, c.AttributeMail, c.UserUID}, + nil) + sr, err := l.Search(search) + if err != nil { + log.Error("LDAP: User search failed: %v", err) + return "", "", "", "", false, false + } else if len(sr.Entries) < 1 { + if directBind { + log.Trace("LDAP: User filter inhibited user login") + } else { + log.Trace("LDAP: User search failed: 0 entries") + } + + return "", "", "", "", false, false + } + + username := sr.Entries[0].GetAttributeValue(c.AttributeUsername) + firstname := sr.Entries[0].GetAttributeValue(c.AttributeName) + surname := sr.Entries[0].GetAttributeValue(c.AttributeSurname) + mail := sr.Entries[0].GetAttributeValue(c.AttributeMail) + uid := sr.Entries[0].GetAttributeValue(c.UserUID) + + // Check group membership + if c.GroupEnabled { + groupFilter, ok := c.sanitizedGroupFilter(c.GroupFilter) + if !ok { + return "", "", "", "", false, false + } + groupDN, ok := c.sanitizedGroupDN(c.GroupDN) + if !ok { + return "", "", "", "", false, false + } + + log.Trace("LDAP: Fetching groups '%v' with filter '%s' and base '%s'", c.GroupMemberUID, groupFilter, groupDN) + groupSearch := ldap.NewSearchRequest( + groupDN, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, groupFilter, + []string{c.GroupMemberUID}, + nil) + + srg, err := l.Search(groupSearch) + if err != nil { + log.Error("LDAP: Group search failed: %v", err) + return "", "", "", "", false, false + } else if len(srg.Entries) < 1 { + log.Trace("LDAP: Group search returned no entries") + return "", "", "", "", false, false + } + + isMember := false + if c.UserUID == "dn" { + for _, group := range srg.Entries { + for _, member := range group.GetAttributeValues(c.GroupMemberUID) { + if member == sr.Entries[0].DN { + isMember = true + } + } + } + } else { + for _, group := range srg.Entries { + for _, member := range group.GetAttributeValues(c.GroupMemberUID) { + if member == uid { + isMember = true + } + } + } + } + + if !isMember { + log.Trace("LDAP: Group membership test failed [username: %s, group_member_uid: %s, user_uid: %s", username, c.GroupMemberUID, uid) + return "", "", "", "", false, false + } + } + + isAdmin := false + if len(c.AdminFilter) > 0 { + log.Trace("Checking admin with filter '%s' and base '%s'", c.AdminFilter, userDN) + search = ldap.NewSearchRequest( + userDN, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, c.AdminFilter, + []string{c.AttributeName}, + nil) + + sr, err = l.Search(search) + if err != nil { + log.Error("LDAP: Admin search failed: %v", err) + } else if len(sr.Entries) < 1 { + log.Trace("LDAP: Admin search returned no entries") + } else { + isAdmin = true + } + } + + if !directBind && c.AttributesInBind { + // binds user (checking password) after looking-up attributes in BindDN context + err = bindUser(l, userDN, passwd) + if err != nil { + return "", "", "", "", false, false + } + } + + return username, firstname, surname, mail, isAdmin, true +} diff --git a/internal/auth/ldap/provider.go b/internal/auth/ldap/provider.go new file mode 100644 index 00000000000..9b2f8ee9d47 --- /dev/null +++ b/internal/auth/ldap/provider.go @@ -0,0 +1,74 @@ +package ldap + +import ( + "fmt" + + "gogs.io/gogs/internal/auth" +) + +// Provider contains configuration of an LDAP authentication provider. +type Provider struct { + directBind bool + config *Config +} + +// NewProvider creates a new LDAP authentication provider. +func NewProvider(directBind bool, cfg *Config) auth.Provider { + return &Provider{ + directBind: directBind, + config: cfg, + } +} + +// Authenticate queries if login/password is valid against the LDAP directory pool, +// and returns queried information when succeeded. +func (p *Provider) Authenticate(login, password string) (*auth.ExternalAccount, error) { + username, fn, sn, email, isAdmin, succeed := p.config.searchEntry(login, password, p.directBind) + if !succeed { + return nil, auth.ErrBadCredentials{Args: map[string]any{"login": login}} + } + + if username == "" { + username = login + } + if email == "" { + email = fmt.Sprintf("%s@localhost", username) + } + + composeFullName := func(firstname, surname, username string) string { + switch { + case firstname == "" && surname == "": + return username + case firstname == "": + return surname + case surname == "": + return firstname + default: + return firstname + " " + surname + } + } + + return &auth.ExternalAccount{ + Login: login, + Name: username, + FullName: composeFullName(fn, sn, username), + Email: email, + Admin: isAdmin, + }, nil +} + +func (p *Provider) Config() any { + return p.config +} + +func (p *Provider) HasTLS() bool { + return p.config.SecurityProtocol > SecurityProtocolUnencrypted +} + +func (p *Provider) UseTLS() bool { + return p.config.SecurityProtocol > SecurityProtocolUnencrypted +} + +func (p *Provider) SkipTLSVerify() bool { + return p.config.SkipVerify +} diff --git a/internal/auth/pam/config.go b/internal/auth/pam/config.go new file mode 100644 index 00000000000..0bfec65c3d5 --- /dev/null +++ b/internal/auth/pam/config.go @@ -0,0 +1,9 @@ +package pam + +// Config contains configuration for PAM authentication. +// +// ⚠️ WARNING: Change to the field name must preserve the INI key name for backward compatibility. +type Config struct { + // The name of the PAM service, e.g. system-auth. + ServiceName string +} diff --git a/internal/auth/pam/pam.go b/internal/auth/pam/pam.go new file mode 100644 index 00000000000..d00b8dc9bc5 --- /dev/null +++ b/internal/auth/pam/pam.go @@ -0,0 +1,29 @@ +//go:build pam + +package pam + +import ( + "github.com/cockroachdb/errors" + "github.com/msteinert/pam" +) + +func (c *Config) doAuth(login, password string) error { + t, err := pam.StartFunc(c.ServiceName, login, func(s pam.Style, msg string) (string, error) { + switch s { + case pam.PromptEchoOff: + return password, nil + case pam.PromptEchoOn, pam.ErrorMsg, pam.TextInfo: + return "", nil + } + return "", errors.Errorf("unrecognized PAM message style: %v - %s", s, msg) + }) + if err != nil { + return err + } + + err = t.Authenticate(0) + if err != nil { + return err + } + return t.AcctMgmt(0) +} diff --git a/internal/auth/pam/pam_stub.go b/internal/auth/pam/pam_stub.go new file mode 100644 index 00000000000..65e6d93a0c4 --- /dev/null +++ b/internal/auth/pam/pam_stub.go @@ -0,0 +1,11 @@ +//go:build !pam + +package pam + +import ( + "github.com/cockroachdb/errors" +) + +func (*Config) doAuth(_, _ string) error { + return errors.New("PAM not supported") +} diff --git a/internal/auth/pam/provider.go b/internal/auth/pam/provider.go new file mode 100644 index 00000000000..8c5bb0ef916 --- /dev/null +++ b/internal/auth/pam/provider.go @@ -0,0 +1,50 @@ +package pam + +import ( + "strings" + + "gogs.io/gogs/internal/auth" +) + +// Provider contains configuration of a PAM authentication provider. +type Provider struct { + config *Config +} + +// NewProvider creates a new PAM authentication provider. +func NewProvider(cfg *Config) auth.Provider { + return &Provider{ + config: cfg, + } +} + +func (p *Provider) Authenticate(login, password string) (*auth.ExternalAccount, error) { + err := p.config.doAuth(login, password) + if err != nil { + if strings.Contains(err.Error(), "Authentication failure") { + return nil, auth.ErrBadCredentials{Args: map[string]any{"login": login}} + } + return nil, err + } + + return &auth.ExternalAccount{ + Login: login, + Name: login, + }, nil +} + +func (p *Provider) Config() any { + return p.config +} + +func (*Provider) HasTLS() bool { + return false +} + +func (*Provider) UseTLS() bool { + return false +} + +func (*Provider) SkipTLSVerify() bool { + return false +} diff --git a/internal/auth/smtp/config.go b/internal/auth/smtp/config.go new file mode 100644 index 00000000000..f3a239ce7d4 --- /dev/null +++ b/internal/auth/smtp/config.go @@ -0,0 +1,67 @@ +package smtp + +import ( + "crypto/tls" + "net" + "net/smtp" + "strconv" + "time" + + "github.com/cockroachdb/errors" +) + +// dialTimeout bounds how long the SMTP authentication flow waits on the +// underlying TCP connect. Without it, an unreachable or misspelled host hangs +// the sign-in request until the OS-level connect timeout (minutes). +const dialTimeout = 10 * time.Second + +// Config contains configuration for SMTP authentication. +// +// ⚠️ WARNING: Change to the field name must preserve the INI key name for backward compatibility. +type Config struct { + Auth string + Host string + Port int + AllowedDomains string + TLS bool `ini:"tls"` + SkipVerify bool +} + +func (c *Config) doAuth(auth smtp.Auth) error { + addr := net.JoinHostPort(c.Host, strconv.Itoa(c.Port)) + conn, err := net.DialTimeout("tcp", addr, dialTimeout) + if err != nil { + return err + } + client, err := smtp.NewClient(conn, c.Host) + if err != nil { + _ = conn.Close() + return err + } + defer client.Close() + + if err = client.Hello("gogs"); err != nil { + return err + } + + if c.TLS { + if ok, _ := client.Extension("STARTTLS"); ok { + if err = client.StartTLS(&tls.Config{ + InsecureSkipVerify: c.SkipVerify, + ServerName: c.Host, + }); err != nil { + return err + } + } else { + return errors.New("SMTP server does not support TLS") + } + } + + if ok, _ := client.Extension("AUTH"); ok { + if err = client.Auth(auth); err != nil { + return err + } + return nil + } + return errors.New("unsupported SMTP authentication method") +} diff --git a/internal/auth/smtp/provider.go b/internal/auth/smtp/provider.go new file mode 100644 index 00000000000..01d33d6cbdd --- /dev/null +++ b/internal/auth/smtp/provider.go @@ -0,0 +1,123 @@ +package smtp + +import ( + "net/smtp" + "net/textproto" + "slices" + "strings" + + "github.com/cockroachdb/errors" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/auth" +) + +// Provider contains configuration of an SMTP authentication provider. +type Provider struct { + config *Config +} + +// NewProvider creates a new SMTP authentication provider. +func NewProvider(cfg *Config) auth.Provider { + return &Provider{ + config: cfg, + } +} + +// Authenticate queries if login/password is valid against the SMTP server, +// and returns queried information when succeeded. +func (p *Provider) Authenticate(login, password string) (*auth.ExternalAccount, error) { + // Verify allowed domains + if p.config.AllowedDomains != "" { + fields := strings.SplitN(login, "@", 3) + if len(fields) != 2 { + return nil, auth.ErrBadCredentials{Args: map[string]any{"login": login}} + } + domain := fields[1] + + isAllowed := slices.Contains(strings.Split(p.config.AllowedDomains, ","), domain) + + if !isAllowed { + return nil, auth.ErrBadCredentials{Args: map[string]any{"login": login}} + } + } + + var smtpAuth smtp.Auth + switch p.config.Auth { + case Plain: + smtpAuth = smtp.PlainAuth("", login, password, p.config.Host) + case Login: + smtpAuth = &smtpLoginAuth{login, password} + default: + return nil, errors.Errorf("unsupported SMTP authentication type %q", p.config.Auth) + } + + if err := p.config.doAuth(smtpAuth); err != nil { + log.Trace("SMTP: Authentication failed: %v", err) + + // Check standard error format first, then fallback to the worse case. + tperr, ok := err.(*textproto.Error) + if (ok && tperr.Code == 535) || + strings.Contains(err.Error(), "Username and Password not accepted") { + return nil, auth.ErrBadCredentials{Args: map[string]any{"login": login}} + } + return nil, err + } + + username := login + + // NOTE: It is not required to have "@" in `login` for a successful SMTP authentication. + before, _, ok := strings.Cut(login, "@") + if ok { + username = before + } + + return &auth.ExternalAccount{ + Login: login, + Name: username, + Email: login, + }, nil +} + +func (p *Provider) Config() any { + return p.config +} + +func (*Provider) HasTLS() bool { + return true +} + +func (p *Provider) UseTLS() bool { + return p.config.TLS +} + +func (p *Provider) SkipTLSVerify() bool { + return p.config.SkipVerify +} + +const ( + Plain = "PLAIN" + Login = "LOGIN" +) + +var AuthTypes = []string{Plain, Login} + +type smtpLoginAuth struct { + username, password string +} + +func (auth *smtpLoginAuth) Start(_ *smtp.ServerInfo) (string, []byte, error) { + return "LOGIN", []byte(auth.username), nil +} + +func (auth *smtpLoginAuth) Next(fromServer []byte, more bool) ([]byte, error) { + if more { + switch string(fromServer) { + case "Username:": + return []byte(auth.username), nil + case "Password:": + return []byte(auth.password), nil + } + } + return nil, nil +} diff --git a/internal/authx/basic.go b/internal/authx/basic.go new file mode 100644 index 00000000000..9e1f44d4b61 --- /dev/null +++ b/internal/authx/basic.go @@ -0,0 +1,31 @@ +package authx + +import ( + "encoding/base64" + "net/http" + "strings" +) + +// DecodeBasic extracts username and password from given header using HTTP Basic Auth. +// It returns empty strings if values are not presented or not valid. +func DecodeBasic(header http.Header) (username, password string) { + if len(header) == 0 { + return "", "" + } + + fields := strings.Fields(header.Get("Authorization")) + if len(fields) != 2 || fields[0] != "Basic" { + return "", "" + } + + p, err := base64.StdEncoding.DecodeString(fields[1]) + if err != nil { + return "", "" + } + + creds := strings.SplitN(string(p), ":", 2) + if len(creds) == 1 { + return creds[0], "" + } + return creds[0], creds[1] +} diff --git a/internal/authx/basic_test.go b/internal/authx/basic_test.go new file mode 100644 index 00000000000..1f5ac16d840 --- /dev/null +++ b/internal/authx/basic_test.go @@ -0,0 +1,68 @@ +package authx + +import ( + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDecodeBasic(t *testing.T) { + tests := []struct { + name string + header http.Header + expUsername string + expPassword string + }{ + { + name: "no header", + }, + { + name: "no authorization", + header: http.Header{ + "Content-Type": []string{"text/plain"}, + }, + }, + { + name: "malformed value", + header: http.Header{ + "Authorization": []string{"Basic"}, + }, + }, + { + name: "not basic", + header: http.Header{ + "Authorization": []string{"Digest dummy"}, + }, + }, + { + name: "bad encoding", + header: http.Header{ + "Authorization": []string{"Basic not_base64"}, + }, + }, + + { + name: "only has username", + header: http.Header{ + "Authorization": []string{"Basic dXNlcm5hbWU="}, + }, + expUsername: "username", + }, + { + name: "has username and password", + header: http.Header{ + "Authorization": []string{"Basic dXNlcm5hbWU6cGFzc3dvcmQ="}, + }, + expUsername: "username", + expPassword: "password", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + username, password := DecodeBasic(test.header) + assert.Equal(t, test.expUsername, username) + assert.Equal(t, test.expPassword, password) + }) + } +} diff --git a/internal/avatar/avatar.go b/internal/avatar/avatar.go new file mode 100644 index 00000000000..6b080ecc0d1 --- /dev/null +++ b/internal/avatar/avatar.go @@ -0,0 +1,39 @@ +package avatar + +import ( + "image" + "image/color/palette" + "math/rand" + "time" + + "github.com/cockroachdb/errors" + "github.com/issue9/identicon" +) + +const DefaultSize = 290 + +// RandomImageWithSize generates and returns a random avatar image unique to +// input data in custom size (height and width). +func RandomImageWithSize(size int, data []byte) (image.Image, error) { + randExtent := len(palette.WebSafe) - 32 + rand.Seed(time.Now().UnixNano()) + colorIndex := rand.Intn(randExtent) + backColorIndex := colorIndex - 1 + if backColorIndex < 0 { + backColorIndex = randExtent - 1 + } + + // Define size, background, and forecolor + imgMaker, err := identicon.New(size, + palette.WebSafe[backColorIndex], palette.WebSafe[colorIndex:colorIndex+32]...) + if err != nil { + return nil, errors.Newf("identicon.New: %v", err) + } + return imgMaker.Make(data), nil +} + +// RandomImage generates and returns a random avatar image unique to input data +// in DefaultSize (height and width). +func RandomImage(data []byte) (image.Image, error) { + return RandomImageWithSize(DefaultSize, data) +} diff --git a/internal/avatar/avatar_test.go b/internal/avatar/avatar_test.go new file mode 100644 index 00000000000..0227474261f --- /dev/null +++ b/internal/avatar/avatar_test.go @@ -0,0 +1,14 @@ +package avatar + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_RandomImage(t *testing.T) { + _, err := RandomImage([]byte("gogs@local")) + assert.NoError(t, err) + _, err = RandomImageWithSize(0, []byte("gogs@local")) + assert.Error(t, err) +} diff --git a/internal/conf/computed.go b/internal/conf/computed.go new file mode 100644 index 00000000000..6f9afe9d882 --- /dev/null +++ b/internal/conf/computed.go @@ -0,0 +1,112 @@ +package conf + +import ( + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "sync" +) + +// ℹ️ README: This file contains configuration values that require computation to be useful. + +// IsWindowsRuntime returns true if the current runtime in Windows. +func IsWindowsRuntime() bool { + return runtime.GOOS == "windows" +} + +// IsProdMode returns true if the application is running in production mode. +func IsProdMode() bool { + return strings.EqualFold(App.RunMode, "prod") +} + +var ( + appPath string + appPathOnce sync.Once +) + +// AppPath returns the absolute path of the application's binary. +func AppPath() string { + appPathOnce.Do(func() { + var err error + appPath, err = exec.LookPath(os.Args[0]) + if err != nil { + panic("look executable path: " + err.Error()) + } + + appPath, err = filepath.Abs(appPath) + if err != nil { + panic("get absolute executable path: " + err.Error()) + } + }) + + return appPath +} + +var ( + workDir string + workDirOnce sync.Once +) + +// WorkDir returns the absolute path of work directory. It reads the value of environment +// variable GOGS_WORK_DIR. When not set, it uses the directory where the application's +// binary is located. +func WorkDir() string { + workDirOnce.Do(func() { + workDir = os.Getenv("GOGS_WORK_DIR") + if workDir != "" { + return + } + + workDir = filepath.Dir(AppPath()) + }) + + return workDir +} + +var ( + customDir string + customDirOnce sync.Once +) + +// CustomDir returns the absolute path of the custom directory that contains local overrides. +// It reads the value of environment variable GOGS_CUSTOM. When not set, it uses the work +// directory returned by WorkDir function. +func CustomDir() string { + customDirOnce.Do(func() { + customDir = os.Getenv("GOGS_CUSTOM") + if customDir != "" { + return + } + + customDir = filepath.Join(WorkDir(), "custom") + }) + + return customDir +} + +var ( + homeDir string + homeDirOnce sync.Once +) + +// HomeDir returns the home directory by reading environment variables. It may return empty +// string when environment variables are not set. +func HomeDir() string { + homeDirOnce.Do(func() { + homeDir = os.Getenv("HOME") + if homeDir != "" { + return + } + + homeDir = os.Getenv("USERPROFILE") + if homeDir != "" { + return + } + + homeDir = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + }) + + return homeDir +} diff --git a/internal/conf/computed_test.go b/internal/conf/computed_test.go new file mode 100644 index 00000000000..dabbb24498f --- /dev/null +++ b/internal/conf/computed_test.go @@ -0,0 +1,122 @@ +package conf + +import ( + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/assert" + + "gogs.io/gogs/internal/testx" +) + +func TestIsProdMode(t *testing.T) { + before := App.RunMode + defer func() { + App.RunMode = before + }() + + tests := []struct { + mode string + want bool + }{ + {mode: "dev", want: false}, + {mode: "test", want: false}, + + {mode: "prod", want: true}, + {mode: "Prod", want: true}, + {mode: "PROD", want: true}, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + App.RunMode = test.mode + assert.Equal(t, test.want, IsProdMode()) + }) + } +} + +func TestWorkDirHelper(_ *testing.T) { + if !testx.WantHelperProcess() { + return + } + + fmt.Fprintln(os.Stdout, WorkDir()) +} + +func TestWorkDir(t *testing.T) { + tests := []struct { + env string + want string + }{ + {env: "GOGS_WORK_DIR=/tmp", want: "/tmp"}, + {env: "", want: WorkDir()}, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + out, err := testx.Exec("TestWorkDirHelper", test.env) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, test.want, out) + }) + } +} + +func TestCustomDirHelper(_ *testing.T) { + if !testx.WantHelperProcess() { + return + } + + fmt.Fprintln(os.Stdout, CustomDir()) +} + +func TestCustomDir(t *testing.T) { + tests := []struct { + env string + want string + }{ + {env: "GOGS_CUSTOM=/tmp", want: "/tmp"}, + {env: "", want: CustomDir()}, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + out, err := testx.Exec("TestCustomDirHelper", test.env) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, test.want, out) + }) + } +} + +func TestHomeDirHelper(_ *testing.T) { + if !testx.WantHelperProcess() { + return + } + + fmt.Fprintln(os.Stdout, HomeDir()) +} + +func TestHomeDir(t *testing.T) { + tests := []struct { + envs []string + want string + }{ + {envs: []string{"HOME=/tmp"}, want: "/tmp"}, + {envs: []string{`USERPROFILE=C:\Users\Joe`}, want: `C:\Users\Joe`}, + {envs: []string{`HOMEDRIVE=C:`, `HOMEPATH=\Users\Joe`}, want: `C:\Users\Joe`}, + {envs: nil, want: ""}, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + out, err := testx.Exec("TestHomeDirHelper", test.envs...) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, test.want, out) + }) + } +} diff --git a/internal/conf/conf.go b/internal/conf/conf.go new file mode 100644 index 00000000000..f75e9b62ac2 --- /dev/null +++ b/internal/conf/conf.go @@ -0,0 +1,424 @@ +package conf + +import ( + "net" + "net/mail" + "net/url" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/cockroachdb/errors" + "github.com/fatih/color" + _ "github.com/go-macaron/cache/redis" + _ "github.com/go-macaron/session/redis" + "github.com/gogs/go-libravatar" + "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/conf" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/semverx" +) + +func init() { + // fatih/color disables ANSI codes when stdout is not a TTY, which is the + // case under process managers like moon. Honor TTY_FORCE so callers can + // opt back in without a real terminal. + if os.Getenv("TTY_FORCE") != "" { + color.NoColor = false + } + + // Initialize the primary logger until logging service is up. + err := log.NewConsole() + if err != nil { + panic("init console logger: " + err.Error()) + } +} + +// File is the configuration object. +var File *ini.File + +// Init initializes configuration from conf assets and given custom configuration file. +// If `customConf` is empty, it falls back to default location, i.e. "/custom". +// It is safe to call this function multiple times with desired `customConf`, but it is +// not concurrent safe. +// +// NOTE: The order of loading configuration sections matters as one may depend on another. +// +// ⚠️ WARNING: Do not print anything in this function other than warnings. +func Init(customConf string) error { + data, err := conf.Files.ReadFile("app.ini") + if err != nil { + return errors.Wrap(err, `read default "app.ini"`) + } + + File, err = ini.LoadSources(ini.LoadOptions{ + IgnoreInlineComment: true, + }, data) + if err != nil { + return errors.Wrap(err, `parse "app.ini"`) + } + File.NameMapper = ini.SnackCase + File.ValueMapper = os.ExpandEnv + + if customConf == "" { + customConf = filepath.Join(CustomDir(), "conf", "app.ini") + } else { + customConf, err = filepath.Abs(customConf) + if err != nil { + return errors.Wrap(err, "get absolute path") + } + } + CustomConf = customConf + + if osx.IsFile(customConf) { + if err = File.Append(customConf); err != nil { + return errors.Wrapf(err, "append %q", customConf) + } + } else if !HookMode { + log.Warn("Custom config %q not found. Ignore this warning if you're running for the first time", customConf) + } + + if err = File.Section(ini.DefaultSection).MapTo(&App); err != nil { + return errors.Wrap(err, "mapping default section") + } + + // *************************** + // ----- Server settings ----- + // *************************** + + if err = File.Section("server").MapTo(&Server); err != nil { + return errors.Wrap(err, "mapping [server] section") + } + Server.AppDataPath = ensureAbs(Server.AppDataPath) + + if !strings.HasSuffix(Server.ExternalURL, "/") { + Server.ExternalURL += "/" + } + Server.URL, err = url.Parse(Server.ExternalURL) + if err != nil { + return errors.Wrapf(err, "parse '[server] EXTERNAL_URL' %q", err) + } + + // Subpath should start with '/' and end without '/', i.e. '/{subpath}'. + Server.Subpath = strings.TrimRight(Server.URL.Path, "/") + Server.SubpathDepth = strings.Count(Server.Subpath, "/") + + unixSocketMode, err := strconv.ParseUint(Server.UnixSocketPermission, 8, 32) + if err != nil { + return errors.Wrapf(err, "parse '[server] UNIX_SOCKET_PERMISSION' %q", Server.UnixSocketPermission) + } + if unixSocketMode > 0o777 { + unixSocketMode = 0o666 + } + Server.UnixSocketMode = os.FileMode(unixSocketMode) + + // ************************ + // ----- SSH settings ----- + // ************************ + + SSH.RootPath = filepath.Join(HomeDir(), ".ssh") + SSH.KeyTestPath = os.TempDir() + if err = File.Section("server").MapTo(&SSH); err != nil { + return errors.Wrap(err, "mapping SSH settings from [server] section") + } + SSH.RootPath = ensureAbs(SSH.RootPath) + SSH.KeyTestPath = ensureAbs(SSH.KeyTestPath) + + if !SSH.Disabled { + if !SSH.StartBuiltinServer { + if err := os.MkdirAll(SSH.RootPath, 0o700); err != nil { + return errors.Wrap(err, "create SSH root directory") + } else if err = os.MkdirAll(SSH.KeyTestPath, 0o644); err != nil { + return errors.Wrap(err, "create SSH key test directory") + } + } else { + SSH.RewriteAuthorizedKeysAtStart = false + } + + // Check if server is eligible for minimum key size check when user choose to enable. + // Windows server and OpenSSH version lower than 5.1 are forced to be disabled because + // the "ssh-keygen" in Windows does not print key type. + // See https://github.com/gogs/gogs/issues/4507. + if SSH.MinimumKeySizeCheck { + sshVersion, err := openSSHVersion() + if err != nil { + return errors.Wrap(err, "get OpenSSH version") + } + + if IsWindowsRuntime() || semverx.Compare(sshVersion, "<", "5.1") { + if !HookMode { + log.Warn(`SSH minimum key size check is forced to be disabled because server is not eligible: + 1. Windows server + 2. OpenSSH version is lower than 5.1`) + } + } else { + SSH.MinimumKeySizes = map[string]int{} + for _, key := range File.Section("ssh.minimum_key_sizes").Keys() { + if key.MustInt() != -1 { + SSH.MinimumKeySizes[strings.ToLower(key.Name())] = key.MustInt() + } + } + } + } + } + + // ******************************* + // ----- Repository settings ----- + // ******************************* + + Repository.Root = filepath.Join(HomeDir(), "gogs-repositories") + if err = File.Section("repository").MapTo(&Repository); err != nil { + return errors.Wrap(err, "mapping [repository] section") + } + Repository.Root = ensureAbs(Repository.Root) + Repository.Upload.TempPath = ensureAbs(Repository.Upload.TempPath) + + // ***************************** + // ----- Database settings ----- + // ***************************** + + if err = File.Section("database").MapTo(&Database); err != nil { + return errors.Wrap(err, "mapping [database] section") + } + Database.Path = ensureAbs(Database.Path) + + // ***************************** + // ----- Security settings ----- + // ***************************** + + if err = File.Section("security").MapTo(&Security); err != nil { + return errors.Wrap(err, "mapping [security] section") + } + + // Check run user when the install is locked. + if Security.InstallLock { + currentUser, match := CheckRunUser(App.RunUser) + if !match { + return errors.Newf("user configured to run Gogs is %q, but the current user is %q", App.RunUser, currentUser) + } + } + + // ************************** + // ----- Email settings ----- + // ************************** + + if err = File.Section("email").MapTo(&Email); err != nil { + return errors.Wrap(err, "mapping [email] section") + } + + if Email.Enabled { + if Email.From == "" { + Email.From = Email.User + } + + parsed, err := mail.ParseAddress(Email.From) + if err != nil { + return errors.Wrapf(err, "parse mail address %q", Email.From) + } + Email.FromEmail = parsed.Address + } + + // *********************************** + // ----- Authentication settings ----- + // *********************************** + + if err = File.Section("auth").MapTo(&Auth); err != nil { + return errors.Wrap(err, "mapping [auth] section") + } + // Reset before re-parsing so repeated Init calls (e.g. via the web installer) + // do not carry over CIDRs from a previous configuration. + Auth.TrustedProxyCIDRs = nil + for _, raw := range Auth.TrustedProxyIPs { + // Allow bare IPs as a convenience by promoting them to single-host CIDRs. + if !strings.Contains(raw, "/") { + if ip := net.ParseIP(raw); ip != nil { + if ip.To4() != nil { + raw += "/32" + } else { + raw += "/128" + } + } + } + _, cidr, err := net.ParseCIDR(raw) + if err != nil { + return errors.Wrapf(err, "parse trusted proxy CIDR %q", raw) + } + Auth.TrustedProxyCIDRs = append(Auth.TrustedProxyCIDRs, cidr) + } + + // ************************* + // ----- User settings ----- + // ************************* + + if err = File.Section("user").MapTo(&User); err != nil { + return errors.Wrap(err, "mapping [user] section") + } + + // **************************** + // ----- Session settings ----- + // **************************** + + if err = File.Section("session").MapTo(&Session); err != nil { + return errors.Wrap(err, "mapping [session] section") + } + + // ******************************* + // ----- Attachment settings ----- + // ******************************* + + if err = File.Section("attachment").MapTo(&Attachment); err != nil { + return errors.Wrap(err, "mapping [attachment] section") + } + Attachment.Path = ensureAbs(Attachment.Path) + + // ************************* + // ----- Time settings ----- + // ************************* + + if err = File.Section("time").MapTo(&Time); err != nil { + return errors.Wrap(err, "mapping [time] section") + } + + Time.FormatLayout = map[string]string{ + "ANSIC": time.ANSIC, + "UnixDate": time.UnixDate, + "RubyDate": time.RubyDate, + "RFC822": time.RFC822, + "RFC822Z": time.RFC822Z, + "RFC850": time.RFC850, + "RFC1123": time.RFC1123, + "RFC1123Z": time.RFC1123Z, + "RFC3339": time.RFC3339, + "RFC3339Nano": time.RFC3339Nano, + "Kitchen": time.Kitchen, + "Stamp": time.Stamp, + "StampMilli": time.StampMilli, + "StampMicro": time.StampMicro, + "StampNano": time.StampNano, + }[Time.Format] + if Time.FormatLayout == "" { + Time.FormatLayout = time.RFC3339 + } + + // **************************** + // ----- Picture settings ----- + // **************************** + + if err = File.Section("picture").MapTo(&Picture); err != nil { + return errors.Wrap(err, "mapping [picture] section") + } + Picture.AvatarUploadPath = ensureAbs(Picture.AvatarUploadPath) + Picture.RepositoryAvatarUploadPath = ensureAbs(Picture.RepositoryAvatarUploadPath) + + switch Picture.GravatarSource { + case "gravatar": + Picture.GravatarSource = "https://secure.gravatar.com/avatar/" + case "libravatar": + Picture.GravatarSource = "https://seccdn.libravatar.org/avatar/" + } + + if Server.OfflineMode { + Picture.DisableGravatar = true + Picture.EnableFederatedAvatar = false + } + if Picture.DisableGravatar { + Picture.EnableFederatedAvatar = false + } + if Picture.EnableFederatedAvatar { + gravatarURL, err := url.Parse(Picture.GravatarSource) + if err != nil { + return errors.Wrapf(err, "parse Gravatar source %q", Picture.GravatarSource) + } + + Picture.LibravatarService = libravatar.New() + if gravatarURL.Scheme == "https" { + Picture.LibravatarService.SetUseHTTPS(true) + Picture.LibravatarService.SetSecureFallbackHost(gravatarURL.Host) + } else { + Picture.LibravatarService.SetUseHTTPS(false) + Picture.LibravatarService.SetFallbackHost(gravatarURL.Host) + } + } + + // *************************** + // ----- Mirror settings ----- + // *************************** + + if err = File.Section("mirror").MapTo(&Mirror); err != nil { + return errors.Wrap(err, "mapping [mirror] section") + } + + if Mirror.DefaultInterval <= 0 { + Mirror.DefaultInterval = 8 + } + + // ************************* + // ----- I18n settings ----- + // ************************* + + I18n = new(i18nConf) + if err = File.Section("i18n").MapTo(I18n); err != nil { + return errors.Wrap(err, "mapping [i18n] section") + } + I18n.dateLangs = File.Section("i18n.datelang").KeysHash() + + // ************************* + // ----- LFS settings ----- + // ************************* + + if err = File.Section("lfs").MapTo(&LFS); err != nil { + return errors.Wrap(err, "mapping [lfs] section") + } + LFS.ObjectsPath = ensureAbs(LFS.ObjectsPath) + LFS.ObjectsTempPath = ensureAbs(LFS.ObjectsTempPath) + + handleDeprecated() + if !HookMode { + for _, warning := range checkInvalidOptions(File) { + log.Warn("%s", warning) + } + } + + if err = File.Section("cache").MapTo(&Cache); err != nil { + return errors.Wrap(err, "mapping [cache] section") + } else if err = File.Section("http").MapTo(&HTTP); err != nil { + return errors.Wrap(err, "mapping [http] section") + } else if err = File.Section("release").MapTo(&Release); err != nil { + return errors.Wrap(err, "mapping [release] section") + } else if err = File.Section("webhook").MapTo(&Webhook); err != nil { + return errors.Wrap(err, "mapping [webhook] section") + } else if err = File.Section("markdown").MapTo(&Markdown); err != nil { + return errors.Wrap(err, "mapping [markdown] section") + } else if err = File.Section("smartypants").MapTo(&Smartypants); err != nil { + return errors.Wrap(err, "mapping [smartypants] section") + } else if err = File.Section("admin").MapTo(&Admin); err != nil { + return errors.Wrap(err, "mapping [admin] section") + } else if err = File.Section("cron").MapTo(&Cron); err != nil { + return errors.Wrap(err, "mapping [cron] section") + } else if err = File.Section("git").MapTo(&Git); err != nil { + return errors.Wrap(err, "mapping [git] section") + } else if err = File.Section("api").MapTo(&API); err != nil { + return errors.Wrap(err, "mapping [api] section") + } else if err = File.Section("ui").MapTo(&UI); err != nil { + return errors.Wrap(err, "mapping [ui] section") + } else if err = File.Section("prometheus").MapTo(&Prometheus); err != nil { + return errors.Wrap(err, "mapping [prometheus] section") + } else if err = File.Section("other").MapTo(&Other); err != nil { + return errors.Wrap(err, "mapping [other] section") + } + + HasRobotsTxt = osx.IsFile(filepath.Join(CustomDir(), "robots.txt")) + return nil +} + +// MustInit panics if configuration initialization failed. +func MustInit(customConf string) { + err := Init(customConf) + if err != nil { + panic(err) + } +} diff --git a/internal/conf/conf_test.go b/internal/conf/conf_test.go new file mode 100644 index 00000000000..23a7392a297 --- /dev/null +++ b/internal/conf/conf_test.go @@ -0,0 +1,59 @@ +package conf + +import ( + "bytes" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "gopkg.in/ini.v1" + + "gogs.io/gogs/internal/testx" +) + +func TestInit(t *testing.T) { + ini.PrettyFormat = false + defer func() { + MustInit("") + ini.PrettyFormat = true + }() + + assert.Nil(t, Init(filepath.Join("testdata", "custom.ini"))) + + cfg := ini.Empty() + cfg.NameMapper = ini.SnackCase + + for _, v := range []struct { + section string + config any + }{ + {"", &App}, + {"server", &Server}, + {"server", &SSH}, + {"repository", &Repository}, + {"database", &Database}, + {"security", &Security}, + {"email", &Email}, + {"auth", &Auth}, + {"user", &User}, + {"session", &Session}, + {"attachment", &Attachment}, + {"time", &Time}, + {"picture", &Picture}, + {"mirror", &Mirror}, + {"i18n", &I18n}, + } { + err := cfg.Section(v.section).ReflectFrom(v.config) + if err != nil { + t.Fatalf("%s: %v", v.section, err) + } + } + + buf := new(bytes.Buffer) + _, err := cfg.WriteTo(buf) + if err != nil { + t.Fatal(err) + } + + testx.AssertGolden(t, filepath.Join("testdata", "TestInit.golden.ini"), testx.Update("TestInit"), buf.String()) +} diff --git a/internal/conf/log.go b/internal/conf/log.go new file mode 100644 index 00000000000..423e751372b --- /dev/null +++ b/internal/conf/log.go @@ -0,0 +1,181 @@ +package conf + +import ( + "os" + "path/filepath" + "strings" + + "github.com/cockroachdb/errors" + "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" +) + +type loggerConf struct { + Buffer int64 + Config any +} + +type logConf struct { + RootPath string + Modes []string + Configs []*loggerConf +} + +// Log settings +var Log *logConf + +// initLogConf returns parsed logging configuration from given INI file. When the +// argument "hookMode" is true, it only initializes the root path for log files. +// NOTE: Because we always create a console logger as the primary logger at init time, +// we need to remove it in case the user doesn't configure to use it after the logging +// service is initialized. +func initLogConf(cfg *ini.File, hookMode bool) (_ *logConf, hasConsole bool, _ error) { + rootPath := cfg.Section("log").Key("ROOT_PATH").MustString(filepath.Join(WorkDir(), "log")) + if hookMode { + return &logConf{ + RootPath: ensureAbs(rootPath), + }, false, nil + } + + modes := strings.Split(cfg.Section("log").Key("MODE").MustString("console"), ",") + lc := &logConf{ + RootPath: ensureAbs(rootPath), + Modes: make([]string, 0, len(modes)), + Configs: make([]*loggerConf, 0, len(modes)), + } + + // Iterate over [log.*] sections to initialize individual logger. + levelMappings := map[string]log.Level{ + "trace": log.LevelTrace, + "info": log.LevelInfo, + "warn": log.LevelWarn, + "error": log.LevelError, + "fatal": log.LevelFatal, + } + + for i := range modes { + modes[i] = strings.ToLower(strings.TrimSpace(modes[i])) + secName := "log." + modes[i] + sec, err := cfg.GetSection(secName) + if err != nil { + return nil, hasConsole, errors.Errorf("missing configuration section [%s] for %q logger", secName, modes[i]) + } + + level := levelMappings[strings.ToLower(sec.Key("LEVEL").MustString("trace"))] + buffer := sec.Key("BUFFER_LEN").MustInt64(100) + var c *loggerConf + switch modes[i] { + case log.DefaultConsoleName: + hasConsole = true + c = &loggerConf{ + Buffer: buffer, + Config: log.ConsoleConfig{ + Level: level, + }, + } + + case log.DefaultFileName: + logPath := filepath.Join(lc.RootPath, "gogs.log") + c = &loggerConf{ + Buffer: buffer, + Config: log.FileConfig{ + Level: level, + Filename: logPath, + FileRotationConfig: log.FileRotationConfig{ + Rotate: sec.Key("LOG_ROTATE").MustBool(true), + Daily: sec.Key("DAILY_ROTATE").MustBool(true), + MaxSize: 1 << uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)), + MaxLines: sec.Key("MAX_LINES").MustInt64(1000000), + MaxDays: sec.Key("MAX_DAYS").MustInt64(7), + }, + }, + } + + case log.DefaultSlackName: + c = &loggerConf{ + Buffer: buffer, + Config: log.SlackConfig{ + Level: level, + URL: sec.Key("URL").String(), + }, + } + + case log.DefaultDiscordName: + c = &loggerConf{ + Buffer: buffer, + Config: log.DiscordConfig{ + Level: level, + URL: sec.Key("URL").String(), + Username: sec.Key("USERNAME").String(), + }, + } + + default: + continue + } + + lc.Modes = append(lc.Modes, modes[i]) + lc.Configs = append(lc.Configs, c) + } + + return lc, hasConsole, nil +} + +// InitLogging initializes the logging service of the application. When the +// "hookMode" is true, it only initializes the root path for log files without +// creating any logger. It will also not remove the primary logger in "hookMode" +// and is up to the caller to decide when to remove it. +func InitLogging(hookMode bool) { + logConf, hasConsole, err := initLogConf(File, hookMode) + if err != nil { + log.Fatal("Failed to init logging configuration: %v", err) + } + defer func() { + Log = logConf + }() + + if hookMode { + return + } + + err = os.MkdirAll(logConf.RootPath, os.ModePerm) + if err != nil { + log.Fatal("Failed to create log directory: %v", err) + } + + for i, mode := range logConf.Modes { + c := logConf.Configs[i] + + var err error + var level log.Level + switch mode { + case log.DefaultConsoleName: + level = c.Config.(log.ConsoleConfig).Level + err = log.NewConsole(c.Buffer, c.Config) + case log.DefaultFileName: + level = c.Config.(log.FileConfig).Level + err = log.NewFile(c.Buffer, c.Config) + case log.DefaultSlackName: + level = c.Config.(log.SlackConfig).Level + err = log.NewSlack(c.Buffer, c.Config) + case log.DefaultDiscordName: + level = c.Config.(log.DiscordConfig).Level + err = log.NewDiscord(c.Buffer, c.Config) + default: + panic("unreachable") + } + + if err != nil { + log.Fatal("Failed to init %s logger: %v", mode, err) + return + } + log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(strings.ToLower(level.String()))) + } + + // ⚠️ WARNING: It is only safe to remove the primary logger until + // there are other loggers that are initialized. Otherwise, the + // application will print errors to nowhere. + if !hasConsole { + log.Remove(log.DefaultConsoleName) + } +} diff --git a/internal/conf/log_test.go b/internal/conf/log_test.go new file mode 100644 index 00000000000..7bd23704b98 --- /dev/null +++ b/internal/conf/log_test.go @@ -0,0 +1,130 @@ +package conf + +import ( + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" +) + +func Test_initLogConf(t *testing.T) { + t.Run("missing configuration section", func(t *testing.T) { + f, err := ini.Load([]byte(` +[log] +MODE = console +`)) + if err != nil { + t.Fatal(err) + } + + got, hasConsole, err := initLogConf(f, false) + assert.NotNil(t, err) + assert.Equal(t, `missing configuration section [log.console] for "console" logger`, err.Error()) + assert.False(t, hasConsole) + assert.Nil(t, got) + }) + + t.Run("no console logger", func(t *testing.T) { + f, err := ini.Load([]byte(` +[log] +MODE = file + +[log.file] +`)) + if err != nil { + t.Fatal(err) + } + + got, hasConsole, err := initLogConf(f, false) + if err != nil { + t.Fatal(err) + } + + assert.False(t, hasConsole) + assert.NotNil(t, got) + }) + + f, err := ini.Load([]byte(` +[log] +ROOT_PATH = log +MODE = console, file, slack, discord +BUFFER_LEN = 50 +LEVEL = trace + +[log.console] +BUFFER_LEN = 10 + +[log.file] +LEVEL = INFO +LOG_ROTATE = true +DAILY_ROTATE = true +MAX_SIZE_SHIFT = 20 +MAX_LINES = 1000 +MAX_DAYS = 3 + +[log.slack] +LEVEL = Warn +URL = https://slack.com + +[log.discord] +LEVEL = error +URL = https://discordapp.com +USERNAME = yoyo +`)) + if err != nil { + t.Fatal(err) + } + + got, hasConsole, err := initLogConf(f, false) + if err != nil { + t.Fatal(err) + } + + logConf := &logConf{ + RootPath: filepath.Join(WorkDir(), "log"), + Modes: []string{ + log.DefaultConsoleName, + log.DefaultFileName, + log.DefaultSlackName, + log.DefaultDiscordName, + }, + Configs: []*loggerConf{ + { + Buffer: 10, + Config: log.ConsoleConfig{ + Level: log.LevelTrace, + }, + }, { + Buffer: 50, + Config: log.FileConfig{ + Level: log.LevelInfo, + Filename: filepath.Join(WorkDir(), "log", "gogs.log"), + FileRotationConfig: log.FileRotationConfig{ + Rotate: true, + Daily: true, + MaxSize: 1 << 20, + MaxLines: 1000, + MaxDays: 3, + }, + }, + }, { + Buffer: 50, + Config: log.SlackConfig{ + Level: log.LevelWarn, + URL: "https://slack.com", + }, + }, { + Buffer: 50, + Config: log.DiscordConfig{ + Level: log.LevelError, + URL: "https://discordapp.com", + Username: "yoyo", + }, + }, + }, + } + assert.True(t, hasConsole) + assert.Equal(t, logConf, got) +} diff --git a/internal/conf/mocks.go b/internal/conf/mocks.go new file mode 100644 index 00000000000..002d13cd856 --- /dev/null +++ b/internal/conf/mocks.go @@ -0,0 +1,78 @@ +package conf + +import ( + "sync" + "testing" +) + +func SetMockApp(t *testing.T, opts AppOpts) { + before := App + App = opts + t.Cleanup(func() { + App = before + }) +} + +func SetMockAuth(t *testing.T, otps AuthOpts) { + before := Auth + Auth = otps + t.Cleanup(func() { + Auth = before + }) +} + +var mockServer sync.Mutex + +func SetMockServer(t *testing.T, opts ServerOpts) { + mockServer.Lock() + before := Server + Server = opts + t.Cleanup(func() { + Server = before + mockServer.Unlock() + }) +} + +var mockSSH sync.Mutex + +func SetMockSSH(t *testing.T, opts SSHOpts) { + mockSSH.Lock() + before := SSH + SSH = opts + t.Cleanup(func() { + SSH = before + mockSSH.Unlock() + }) +} + +var mockRepository sync.Mutex + +func SetMockRepository(t *testing.T, opts RepositoryOpts) { + mockRepository.Lock() + before := Repository + Repository = opts + t.Cleanup(func() { + Repository = before + mockRepository.Unlock() + }) +} + +func SetMockUI(t *testing.T, opts UIOpts) { + before := UI + UI = opts + t.Cleanup(func() { + UI = before + }) +} + +var mockPicture sync.Mutex + +func SetMockPicture(t *testing.T, opts PictureOpts) { + mockPicture.Lock() + before := Picture + Picture = opts + t.Cleanup(func() { + Picture = before + mockPicture.Unlock() + }) +} diff --git a/internal/conf/static.go b/internal/conf/static.go new file mode 100644 index 00000000000..f18aebaabc4 --- /dev/null +++ b/internal/conf/static.go @@ -0,0 +1,523 @@ +package conf + +import ( + "fmt" + "net" + "net/url" + "os" + "time" + + "github.com/gogs/go-libravatar" + "gopkg.in/ini.v1" + + "gogs.io/gogs/conf" +) + +// ℹ️ README: This file contains static values that should only be set at initialization time. +// +// ⚠️ WARNING: After changing any options, do not forget to update template of +// "/admin/config" page as well. + +// HasMinWinSvc is whether the application is built with Windows Service support. +// +// ⚠️ WARNING: should only be set by "internal/conf/static_minwinsvc.go". +var HasMinWinSvc bool + +// Build time and commit information. +// +// ⚠️ WARNING: should only be set by "-ldflags". +var ( + BuildTime string + BuildCommit string +) + +// CustomConf returns the absolute path of custom configuration file that is used. +var CustomConf string + +var ( + // Security settings + Security struct { + InstallLock bool + SecretKey string + LoginRememberDays int + CookieSecure bool + EnableLoginStatusCookie bool + LoginStatusCookieName string + LocalNetworkAllowlist []string `delim:","` + } + + // Email settings + Email struct { + Enabled bool + SubjectPrefix string + Host string + From string + User string + Password string + + HELOHostname string `ini:"HELO_HOSTNAME"` + + SkipVerify bool + UseCertificate bool + CertFile string + KeyFile string + + UsePlainText bool + AddPlainTextAlt bool + + // Derived from other static values + FromEmail string `ini:"-"` // Parsed email address of From without person's name. + } + + // User settings + User struct { + EnableEmailNotification bool + } + + // Session settings + Session struct { + Provider string + ProviderConfig string + CookieName string + CookieSecure bool + GCInterval int64 `ini:"GC_INTERVAL"` + MaxLifeTime int64 + CSRFCookieName string `ini:"CSRF_COOKIE_NAME"` + } + + // Cache settings + Cache struct { + Adapter string + Interval int + Host string + } + + // HTTP settings + HTTP struct { + AccessControlAllowOrigin string + } + + // Attachment settings + Attachment struct { + Enabled bool + Path string + AllowedTypes []string `delim:"|"` + MaxSize int64 + MaxFiles int + } + + // Release settings + Release struct { + Attachment struct { + Enabled bool + AllowedTypes []string `delim:"|"` + MaxSize int64 + MaxFiles int + } `ini:"release.attachment"` + } + + // Time settings + Time struct { + Format string + + // Derived from other static values + FormatLayout string `ini:"-"` // Actual layout of the Format. + } + + // Mirror settings + Mirror struct { + DefaultInterval int + } + + // Webhook settings + Webhook struct { + Types []string + DeliverTimeout int + SkipTLSVerify bool `ini:"SKIP_TLS_VERIFY"` + PagingNum int + } + + // Markdown settings + Markdown struct { + EnableHardLineBreak bool + CustomURLSchemes []string `ini:"CUSTOM_URL_SCHEMES"` + FileExtensions []string + } + + // Smartypants settings + Smartypants struct { + Enabled bool + Fractions bool + Dashes bool + LatexDashes bool + AngledQuotes bool + } + + // Admin settings + Admin struct { + DisableRegularOrgCreation bool + } + + // Cron tasks + Cron struct { + UpdateMirror struct { + Enabled bool + RunAtStart bool + Schedule string + } `ini:"cron.update_mirrors"` + RepoHealthCheck struct { + Enabled bool + RunAtStart bool + Schedule string + Timeout time.Duration + Args []string `delim:" "` + } `ini:"cron.repo_health_check"` + CheckRepoStats struct { + Enabled bool + RunAtStart bool + Schedule string + } `ini:"cron.check_repo_stats"` + RepoArchiveCleanup struct { + Enabled bool + RunAtStart bool + Schedule string + OlderThan time.Duration + } `ini:"cron.repo_archive_cleanup"` + } + + // Git settings + Git struct { + // ⚠️ WARNING: Should only be set by "internal/db/repo.go". + Version string `ini:"-"` + + DisableDiffHighlight bool + MaxDiffFiles int `ini:"MAX_GIT_DIFF_FILES"` + MaxDiffLines int `ini:"MAX_GIT_DIFF_LINES"` + MaxDiffLineChars int `ini:"MAX_GIT_DIFF_LINE_CHARACTERS"` + GCArgs []string `ini:"GC_ARGS" delim:" "` + Timeout struct { + Migrate int + Mirror int + Clone int + Pull int + Diff int + GC int `ini:"GC"` + } `ini:"git.timeout"` + } + + // API settings + API struct { + MaxResponseItems int + } + + // Prometheus settings + Prometheus struct { + Enabled bool + EnableBasicAuth bool + BasicAuthUsername string + BasicAuthPassword string + } + + // Other settings + Other struct { + ShowFooterTemplateLoadTime bool + } + + // Global setting + HasRobotsTxt bool +) + +type AppOpts struct { + // ⚠️ WARNING: Should only be set by the main package (i.e. "cmd/gogs/main.go"). + Version string `ini:"-"` + + BrandName string + RunUser string + RunMode string +} + +// Application settings +var App AppOpts + +type AuthOpts struct { + ActivateCodeLives int + ResetPasswordCodeLives int + RequireEmailConfirmation bool + RequireSigninView bool + DisableRegistration bool + EnableRegistrationCaptcha bool + + EnableReverseProxyAuthentication bool + EnableReverseProxyAutoRegistration bool + ReverseProxyAuthenticationHeader string + TrustedProxyIPs []string `ini:"TRUSTED_PROXY_IPS"` + CustomLogoutURL string `ini:"CUSTOM_LOGOUT_URL"` + + // Derived from other static values + TrustedProxyCIDRs []*net.IPNet `ini:"-"` // Parsed CIDR form of TrustedProxyIPs. +} + +// Authentication settings +var Auth AuthOpts + +type ServerOpts struct { + ExternalURL string `ini:"EXTERNAL_URL"` + Domain string + Protocol string + HTTPAddr string `ini:"HTTP_ADDR"` + HTTPPort int `ini:"HTTP_PORT"` + CertFile string + KeyFile string + TLSMinVersion string `ini:"TLS_MIN_VERSION"` + UnixSocketPermission string + LocalRootURL string `ini:"LOCAL_ROOT_URL"` + + OfflineMode bool + DisableRouterLog bool + EnableGzip bool + + AppDataPath string + LoadAssetsFromDisk bool + + LandingURL string `ini:"LANDING_URL"` + + // Derived from other static values + URL *url.URL `ini:"-"` // Parsed URL object of ExternalURL. + Subpath string `ini:"-"` // Subpath found the ExternalURL. Should be empty when not found. + SubpathDepth int `ini:"-"` // The number of slashes found in the Subpath. + UnixSocketMode os.FileMode `ini:"-"` // Parsed file mode of UnixSocketPermission. +} + +// Server settings +var Server ServerOpts + +type SSHOpts struct { + Disabled bool `ini:"DISABLE_SSH"` + Domain string `ini:"SSH_DOMAIN"` + Port int `ini:"SSH_PORT"` + RootPath string `ini:"SSH_ROOT_PATH"` + KeygenPath string `ini:"SSH_KEYGEN_PATH"` + KeyTestPath string `ini:"SSH_KEY_TEST_PATH"` + MinimumKeySizeCheck bool + MinimumKeySizes map[string]int `ini:"-"` // Load from [ssh.minimum_key_sizes] + RewriteAuthorizedKeysAtStart bool + + StartBuiltinServer bool `ini:"START_SSH_SERVER"` + ListenHost string `ini:"SSH_LISTEN_HOST"` + ListenPort int `ini:"SSH_LISTEN_PORT"` + ServerCiphers []string `ini:"SSH_SERVER_CIPHERS"` + ServerMACs []string `ini:"SSH_SERVER_MACS"` + ServerAlgorithms []string `ini:"SSH_SERVER_ALGORITHMS"` +} + +// SSH settings +var SSH SSHOpts + +type RepositoryOpts struct { + Root string + ScriptType string + ANSICharset string `ini:"ANSI_CHARSET"` + ForcePrivate bool + MaxCreationLimit int + PreferredLicenses []string + DisableHTTPGit bool `ini:"DISABLE_HTTP_GIT"` + EnableLocalPathMigration bool + EnableRawFileRenderMode bool + CommitsFetchConcurrency int + DefaultBranch string + + // Repository editor settings + Editor struct { + LineWrapExtensions []string + PreviewableFileModes []string + } `ini:"repository.editor"` + + // Repository upload settings + Upload struct { + Enabled bool + TempPath string + AllowedTypes []string `delim:"|"` + FileMaxSize int64 + MaxFiles int + } `ini:"repository.upload"` +} + +// Repository settings +var Repository RepositoryOpts + +type DatabaseOpts struct { + Type string + Host string + Name string + Schema string + User string + Password string + SSLMode string `ini:"SSL_MODE"` + Path string + MaxOpenConns int + MaxIdleConns int +} + +// Database settings +var Database DatabaseOpts + +type LFSOpts struct { + Storage string + ObjectsPath string + ObjectsTempPath string +} + +// LFS settings +var LFS LFSOpts + +type UIUserOpts struct { + RepoPagingNum int + NewsFeedPagingNum int + CommitsPagingNum int +} + +type UIOpts struct { + ExplorePagingNum int + IssuePagingNum int + FeedMaxCommitNum int + ThemeColorMetaTag string + MaxDisplayFileSize int64 + + Admin struct { + UserPagingNum int + RepoPagingNum int + NoticePagingNum int + OrgPagingNum int + } `ini:"ui.admin"` + User UIUserOpts `ini:"ui.user"` +} + +// UI settings +var UI UIOpts + +type PictureOpts struct { + AvatarUploadPath string + RepositoryAvatarUploadPath string + GravatarSource string + DisableGravatar bool + EnableFederatedAvatar bool + + // Derived from other static values + LibravatarService *libravatar.Libravatar `ini:"-"` // Initialized client for federated avatar. +} + +// Picture settings +var Picture PictureOpts + +type i18nConf struct { + Langs []string `delim:","` + Names []string `delim:","` + dateLangs map[string]string `ini:"-"` +} + +// DateLang transforms standard language locale name to corresponding value in datetime plugin. +func (c *i18nConf) DateLang(lang string) string { + name, ok := c.dateLangs[lang] + if ok { + return name + } + return "en" +} + +// I18n settings +var I18n *i18nConf + +// handleDeprecated transfers deprecated values to the new ones when set. +func handleDeprecated() { + // Add fallback logic here, example: + // if App.AppName != "" { + // App.BrandName = App.AppName + // App.AppName = "" + // } +} + +// checkInvalidOptions checks invalid (renamed/deleted) configuration sections +// and options and returns a list of warnings. +func checkInvalidOptions(config *ini.File) (warnings []string) { + renamedSections := map[string]string{ + "mailer": "email", + "service": "auth", + } + for oldSection, newSection := range renamedSections { + if len(config.Section(oldSection).KeyStrings()) > 0 { + warnings = append(warnings, fmt.Sprintf("section [%s] is invalid, use [%s] instead", oldSection, newSection)) + } + } + + type optionPath struct { + section string + option string + } + renamedOptionPaths := map[optionPath]optionPath{ + // Example: + // {"security", "REVERSE_PROXY_AUTHENTICATION_USER"}: {"auth", "REVERSE_PROXY_AUTHENTICATION_HEADER"}, + } + for oldPath, newPath := range renamedOptionPaths { + if config.Section(oldPath.section).HasKey(oldPath.option) { + warnings = append( + warnings, + fmt.Sprintf("option [%s] %s is invalid, use [%s] %s instead", + oldPath.section, oldPath.option, + newPath.section, newPath.option, + ), + ) + } + } + + // Check options that don't exist anymore. + defaultConfigData, err := conf.Files.ReadFile("app.ini") + if err != nil { + // Warning is best-effort, OK to skip on error. + return warnings + } + defaultConfig, err := ini.LoadSources( + ini.LoadOptions{IgnoreInlineComment: true}, + defaultConfigData, + ) + if err != nil { + // Warning is best-effort, OK to skip on error. + return warnings + } + for _, section := range config.Sections() { + // Skip sections already warned about. + if _, ok := renamedSections[section.Name()]; ok { + continue + } + for _, option := range section.Keys() { + if _, ok := renamedOptionPaths[optionPath{section.Name(), option.Name()}]; ok { + continue + } + if !defaultConfig.Section(section.Name()).HasKey(option.Name()) { + warnings = append(warnings, fmt.Sprintf("option [%s] %s is invalid", section.Name(), option.Name())) + } + } + } + + return warnings +} + +// HookMode indicates whether program starts as Git server-side hook callback. +// All operations should be done synchronously to prevent program exits before finishing. +// +// ⚠️ WARNING: Should only be set by "cmd/gogs/serv.go". +var HookMode bool + +// Indicates which database backend is currently being used. +var ( + UseSQLite3 bool + UseMySQL bool + UsePostgreSQL bool +) + +// UsersAvatarPathPrefix is the path prefix to user avatars. +const UsersAvatarPathPrefix = "avatars" + +// UserDefaultAvatarURLPath returns the URL path of the default user avatar. +func UserDefaultAvatarURLPath() string { + return Server.Subpath + "/img/avatar_default.png" +} diff --git a/internal/conf/static_minwinsvc.go b/internal/conf/static_minwinsvc.go new file mode 100644 index 00000000000..3021e7adf6d --- /dev/null +++ b/internal/conf/static_minwinsvc.go @@ -0,0 +1,11 @@ +//go:build minwinsvc + +package conf + +import ( + _ "github.com/gogs/minwinsvc" +) + +func init() { + HasMinWinSvc = true +} diff --git a/internal/conf/static_test.go b/internal/conf/static_test.go new file mode 100644 index 00000000000..acc5234540e --- /dev/null +++ b/internal/conf/static_test.go @@ -0,0 +1,77 @@ +package conf + +import ( + "sort" + "testing" + + "github.com/stretchr/testify/assert" + "gopkg.in/ini.v1" +) + +func Test_i18n_DateLang(t *testing.T) { + c := &i18nConf{ + dateLangs: map[string]string{ + "en-US": "en", + "zh-CN": "zh", + }, + } + + tests := []struct { + lang string + want string + }{ + {lang: "en-US", want: "en"}, + {lang: "zh-CN", want: "zh"}, + + {lang: "jp-JP", want: "en"}, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, test.want, c.DateLang(test.lang)) + }) + } +} + +func TestCheckInvalidOptions(t *testing.T) { + cfg := ini.Empty() + _, _ = cfg.Section("mailer").NewKey("ENABLED", "true") + _, _ = cfg.Section("service").NewKey("START_TYPE", "true") + _, _ = cfg.Section("security").NewKey("REVERSE_PROXY_AUTHENTICATION_USER", "true") + _, _ = cfg.Section("auth").NewKey("ACTIVE_CODE_LIVE_MINUTES", "10") + _, _ = cfg.Section("auth").NewKey("RESET_PASSWD_CODE_LIVE_MINUTES", "10") + _, _ = cfg.Section("auth").NewKey("ENABLE_CAPTCHA", "true") + _, _ = cfg.Section("auth").NewKey("ENABLE_NOTIFY_MAIL", "true") + _, _ = cfg.Section("auth").NewKey("REGISTER_EMAIL_CONFIRM", "true") + _, _ = cfg.Section("session").NewKey("GC_INTERVAL_TIME", "10") + _, _ = cfg.Section("session").NewKey("SESSION_LIFE_TIME", "10") + _, _ = cfg.Section("server").NewKey("ROOT_URL", "true") + _, _ = cfg.Section("server").NewKey("LANDING_PAGE", "true") + _, _ = cfg.Section("database").NewKey("DB_TYPE", "true") + _, _ = cfg.Section("database").NewKey("PASSWD", "true") + _, _ = cfg.Section("other").NewKey("SHOW_FOOTER_TEMPLATE_LOAD_TIME", "true") + _, _ = cfg.Section("email").NewKey("ENABLED", "true") + _, _ = cfg.Section("server").NewKey("NONEXISTENT_OPTION", "true") + + wantWarnings := []string{ + "option [auth] ACTIVE_CODE_LIVE_MINUTES is invalid", + "option [auth] ENABLE_CAPTCHA is invalid", + "option [auth] ENABLE_NOTIFY_MAIL is invalid", + "option [auth] REGISTER_EMAIL_CONFIRM is invalid", + "option [auth] RESET_PASSWD_CODE_LIVE_MINUTES is invalid", + "option [database] DB_TYPE is invalid", + "option [database] PASSWD is invalid", + "option [security] REVERSE_PROXY_AUTHENTICATION_USER is invalid", + "option [session] GC_INTERVAL_TIME is invalid", + "option [session] SESSION_LIFE_TIME is invalid", + "section [mailer] is invalid, use [email] instead", + "section [service] is invalid, use [auth] instead", + "option [server] ROOT_URL is invalid", + "option [server] LANDING_PAGE is invalid", + "option [server] NONEXISTENT_OPTION is invalid", + } + + gotWarnings := checkInvalidOptions(cfg) + sort.Strings(wantWarnings) + sort.Strings(gotWarnings) + assert.Equal(t, wantWarnings, gotWarnings) +} diff --git a/internal/conf/testdata/TestInit.golden.ini b/internal/conf/testdata/TestInit.golden.ini new file mode 100644 index 00000000000..84210b57b72 --- /dev/null +++ b/internal/conf/testdata/TestInit.golden.ini @@ -0,0 +1,144 @@ +BRAND_NAME=Testing +RUN_USER=git +RUN_MODE=test + +[server] +EXTERNAL_URL=http://localhost:3080/ +DOMAIN=localhost +PROTOCOL=http +HTTP_ADDR=0.0.0.0 +HTTP_PORT=3000 +CERT_FILE=custom/https/cert.pem +KEY_FILE=custom/https/key.pem +TLS_MIN_VERSION=TLS12 +UNIX_SOCKET_PERMISSION=666 +LOCAL_ROOT_URL=http://0.0.0.0:3000/ +OFFLINE_MODE=false +DISABLE_ROUTER_LOG=true +ENABLE_GZIP=false +APP_DATA_PATH=/tmp/data +LOAD_ASSETS_FROM_DISK=false +LANDING_URL=/explore +DISABLE_SSH=false +SSH_DOMAIN=localhost +SSH_PORT=22 +SSH_ROOT_PATH=/tmp +SSH_KEYGEN_PATH=ssh-keygen +SSH_KEY_TEST_PATH=/tmp/ssh-key-test +MINIMUM_KEY_SIZE_CHECK=true +REWRITE_AUTHORIZED_KEYS_AT_START=false +START_SSH_SERVER=false +SSH_LISTEN_HOST=0.0.0.0 +SSH_LISTEN_PORT=22 +SSH_SERVER_CIPHERS=aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,arcfour256,arcfour128 +SSH_SERVER_MACS=hmac-sha2-256-etm@openssh.com,hmac-sha2-256,hmac-sha1 +SSH_SERVER_ALGORITHMS=rsa,ecdsa,ed25519 + +[repository] +ROOT=/tmp/gogs-repositories +SCRIPT_TYPE=bash +ANSI_CHARSET= +FORCE_PRIVATE=false +MAX_CREATION_LIMIT=-1 +PREFERRED_LICENSES=Apache License 2.0,MIT License +DISABLE_HTTP_GIT=false +ENABLE_LOCAL_PATH_MIGRATION=false +ENABLE_RAW_FILE_RENDER_MODE=false +COMMITS_FETCH_CONCURRENCY=0 +DEFAULT_BRANCH=master + +[repository.editor] +LINE_WRAP_EXTENSIONS=.txt,.md,.markdown,.mdown,.mkd +PREVIEWABLE_FILE_MODES=markdown + +[repository.upload] +ENABLED=true +TEMP_PATH=/tmp/uploads +ALLOWED_TYPES= +FILE_MAX_SIZE=3 +MAX_FILES=5 + +[database] +TYPE=sqlite +HOST=127.0.0.1:5432 +NAME=gogs +SCHEMA=public +USER=gogs +PASSWORD=12345678 +SSL_MODE=disable +PATH=/tmp/gogs.db +MAX_OPEN_CONNS=30 +MAX_IDLE_CONNS=30 + +[security] +INSTALL_LOCK=false +SECRET_KEY=`!#@FDEWREWR&*(` +LOGIN_REMEMBER_DAYS=7 +COOKIE_SECURE=false +ENABLE_LOGIN_STATUS_COOKIE=false +LOGIN_STATUS_COOKIE_NAME=login_status +LOCAL_NETWORK_ALLOWLIST= + +[email] +ENABLED=true +SUBJECT_PREFIX="[Testing] " +HOST=smtp.mailgun.org:587 +FROM=noreply@gogs.localhost +USER=noreply@gogs.localhost +PASSWORD=87654321 +HELO_HOSTNAME= +SKIP_VERIFY=false +USE_CERTIFICATE=false +CERT_FILE=custom/email/cert.pem +KEY_FILE=custom/email/key.pem +USE_PLAIN_TEXT=false +ADD_PLAIN_TEXT_ALT=false + +[auth] +ACTIVATE_CODE_LIVES=10 +RESET_PASSWORD_CODE_LIVES=10 +REQUIRE_EMAIL_CONFIRMATION=true +REQUIRE_SIGNIN_VIEW=false +DISABLE_REGISTRATION=false +ENABLE_REGISTRATION_CAPTCHA=true +ENABLE_REVERSE_PROXY_AUTHENTICATION=false +ENABLE_REVERSE_PROXY_AUTO_REGISTRATION=false +REVERSE_PROXY_AUTHENTICATION_HEADER=X-FORWARDED-FOR +TRUSTED_PROXY_IPS=127.0.0.0/8,::1/128 +CUSTOM_LOGOUT_URL= + +[user] +ENABLE_EMAIL_NOTIFICATION=true + +[session] +PROVIDER=memory +PROVIDER_CONFIG=data/sessions +COOKIE_NAME=i_like_gogs +COOKIE_SECURE=false +GC_INTERVAL=10 +MAX_LIFE_TIME=10 +CSRF_COOKIE_NAME=_csrf + +[attachment] +ENABLED=true +PATH=/tmp/attachments +ALLOWED_TYPES=image/jpeg|image/png +MAX_SIZE=4 +MAX_FILES=5 + +[time] +FORMAT=RFC1123 + +[picture] +AVATAR_UPLOAD_PATH=/tmp/avatars +REPOSITORY_AVATAR_UPLOAD_PATH=/tmp/repo-avatars +GRAVATAR_SOURCE=https://secure.gravatar.com/avatar/ +DISABLE_GRAVATAR=false +ENABLE_FEDERATED_AVATAR=false + +[mirror] +DEFAULT_INTERVAL=8 + +[i18n] +LANGS=en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN,pt-PT,mn-MN,ro-RO +NAMES=English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese,Português,Монгол,Română diff --git a/internal/conf/testdata/custom.ini b/internal/conf/testdata/custom.ini new file mode 100644 index 00000000000..cd723241f18 --- /dev/null +++ b/internal/conf/testdata/custom.ini @@ -0,0 +1,46 @@ +BRAND_NAME = Testing +RUN_MODE = test + +[server] +EXTERNAL_URL = http://localhost:3080/ +APP_DATA_PATH = /tmp/data +SSH_ROOT_PATH = /tmp +SSH_KEY_TEST_PATH = /tmp/ssh-key-test +MINIMUM_KEY_SIZE_CHECK = true +LANDING_URL = /explore + +[repository] +ROOT = /tmp/gogs-repositories + +[repository.upload] +TEMP_PATH = /tmp/uploads + +[database] +TYPE = sqlite +PASSWORD = 12345678 +PATH = /tmp/gogs.db + +[email] +ENABLED = true +PASSWORD = 87654321 + +[auth] +ACTIVATE_CODE_LIVES = 10 +RESET_PASSWORD_CODE_LIVES = 10 +REQUIRE_EMAIL_CONFIRMATION = true +ENABLE_REGISTRATION_CAPTCHA = true +REVERSE_PROXY_AUTHENTICATION_HEADER = X-FORWARDED-FOR + +[user] +ENABLE_EMAIL_NOTIFICATION = true + +[session] +GC_INTERVAL = 10 +MAX_LIFE_TIME = 10 + +[attachment] +PATH = /tmp/attachments + +[picture] +AVATAR_UPLOAD_PATH = /tmp/avatars +REPOSITORY_AVATAR_UPLOAD_PATH = /tmp/repo-avatars diff --git a/internal/conf/utils.go b/internal/conf/utils.go new file mode 100644 index 00000000000..364108d4e8c --- /dev/null +++ b/internal/conf/utils.go @@ -0,0 +1,49 @@ +package conf + +import ( + "path/filepath" + "strings" + + "github.com/cockroachdb/errors" + + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/process" +) + +// cleanUpOpenSSHVersion cleans up the raw output of "ssh -V" and returns a clean version string. +func cleanUpOpenSSHVersion(raw string) string { + v := strings.TrimRight(strings.Fields(raw)[0], ",1234567890") + v = strings.TrimSuffix(strings.TrimPrefix(v, "OpenSSH_"), "p") + return v +} + +// openSSHVersion returns string representation of OpenSSH version via command "ssh -V". +func openSSHVersion() (string, error) { + // NOTE: Somehow the version is printed to stderr. + _, stderr, err := process.Exec("conf.openSSHVersion", "ssh", "-V") + if err != nil { + return "", errors.Wrap(err, stderr) + } + + return cleanUpOpenSSHVersion(stderr), nil +} + +// ensureAbs prepends the WorkDir to the given path if it is not an absolute path. +func ensureAbs(path string) string { + if filepath.IsAbs(path) { + return path + } + return filepath.Join(WorkDir(), path) +} + +// CheckRunUser returns false if configured run user does not match actual user that +// runs the app. The first return value is the actual user name. This check is ignored +// under Windows since SSH remote login is not the main method to login on Windows. +func CheckRunUser(runUser string) (string, bool) { + if IsWindowsRuntime() { + return "", true + } + + currentUser := osx.CurrentUsername() + return currentUser, runUser == currentUser +} diff --git a/internal/conf/utils_test.go b/internal/conf/utils_test.go new file mode 100644 index 00000000000..f481508fb87 --- /dev/null +++ b/internal/conf/utils_test.go @@ -0,0 +1,53 @@ +package conf + +import ( + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_cleanUpOpenSSHVersion(t *testing.T) { + tests := []struct { + raw string + want string + }{ + { + raw: "OpenSSH_7.4p1 Ubuntu-10, OpenSSL 1.0.2g 1 Mar 2016", + want: "7.4", + }, { + raw: "OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013", + want: "5.3", + }, { + raw: "OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008", + want: "4.3", + }, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, test.want, cleanUpOpenSSHVersion(test.raw)) + }) + } +} + +func Test_ensureAbs(t *testing.T) { + wd := WorkDir() + + tests := []struct { + path string + want string + }{ + { + path: "data/avatars", + want: filepath.Join(wd, "data", "avatars"), + }, { + path: wd, + want: wd, + }, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, test.want, ensureAbs(test.path)) + }) + } +} diff --git a/internal/context/api.go b/internal/context/api.go new file mode 100644 index 00000000000..e40b0700e45 --- /dev/null +++ b/internal/context/api.go @@ -0,0 +1,102 @@ +package context + +import ( + "fmt" + "net/http" + "strings" + + "github.com/cockroachdb/errors" + "github.com/unknwon/paginater" + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/errx" +) + +type APIContext struct { + *Context // TODO: Reduce to only needed fields instead of full shadow + + // Base URL for the version of API endpoints, e.g. https://try.gogs.io/api/v1 + BaseURL string + + Org *APIOrganization +} + +// FIXME: move this constant to github.com/gogs/go-gogs-client +const DocURL = "https://github.com/gogs/docs-api" + +// NoContent renders the 204 response. +func (c *APIContext) NoContent() { + c.Status(http.StatusNoContent) +} + +// NotFound renders the 404 response. +func (c *APIContext) NotFound() { + c.Status(http.StatusNotFound) +} + +// ErrorStatus renders error with given status code. +func (c *APIContext) ErrorStatus(status int, err error) { + c.JSON(status, map[string]string{ + "message": err.Error(), + "url": DocURL, + }) +} + +// Error renders the 500 response. +func (c *APIContext) Error(err error, msg string) { + log.ErrorDepth(4, "%s: %v", msg, err) + c.ErrorStatus( + http.StatusInternalServerError, + errors.New("Something went wrong, please check the server logs for more information."), + ) +} + +// Errorf renders the 500 response with formatted message. +func (c *APIContext) Errorf(err error, format string, args ...any) { + c.Error(err, fmt.Sprintf(format, args...)) +} + +// NotFoundOrError use error check function to determine if the error +// is about not found. It responses with 404 status code for not found error, +// or error context description for logging purpose of 500 server error. +func (c *APIContext) NotFoundOrError(err error, msg string) { + if errx.IsNotFound(err) { + c.NotFound() + return + } + c.Error(err, msg) +} + +// SetLinkHeader sets pagination link header by given total number and page size. +func (c *APIContext) SetLinkHeader(total, pageSize int) { + page := paginater.New(total, pageSize, c.QueryInt("page"), 0) + links := make([]string, 0, 4) + if page.HasNext() { + links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"next\"", conf.Server.ExternalURL, c.Req.URL.Path[1:], page.Next())) + } + if !page.IsLast() { + links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"last\"", conf.Server.ExternalURL, c.Req.URL.Path[1:], page.TotalPages())) + } + if !page.IsFirst() { + links = append(links, fmt.Sprintf("<%s%s?page=1>; rel=\"first\"", conf.Server.ExternalURL, c.Req.URL.Path[1:])) + } + if page.HasPrevious() { + links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"prev\"", conf.Server.ExternalURL, c.Req.URL.Path[1:], page.Previous())) + } + + if len(links) > 0 { + c.Header().Set("Link", strings.Join(links, ",")) + } +} + +func APIContexter() macaron.Handler { + return func(ctx *Context) { + c := &APIContext{ + Context: ctx, + BaseURL: conf.Server.ExternalURL + "api/v1", + } + ctx.Map(c) + } +} diff --git a/internal/context/api_org.go b/internal/context/api_org.go new file mode 100644 index 00000000000..c9b737ddedf --- /dev/null +++ b/internal/context/api_org.go @@ -0,0 +1,10 @@ +package context + +import ( + "gogs.io/gogs/internal/database" +) + +type APIOrganization struct { + Organization *database.User + Team *database.Team +} diff --git a/internal/context/auth.go b/internal/context/auth.go new file mode 100644 index 00000000000..6094547c03f --- /dev/null +++ b/internal/context/auth.go @@ -0,0 +1,317 @@ +package context + +import ( + "context" + "net" + "net/http" + "net/url" + "strings" + + "github.com/cockroachdb/errors" + "github.com/go-macaron/csrf" + "github.com/go-macaron/session" + "github.com/google/uuid" + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/tool" +) + +type ToggleOptions struct { + SignInRequired bool + SignOutRequired bool + AdminRequired bool + DisableCSRF bool +} + +func Toggle(options *ToggleOptions) macaron.Handler { + return func(c *Context) { + // Cannot view any page before installation. + if !conf.Security.InstallLock { + c.RedirectSubpath("/install") + return + } + + // Check prohibit login users. + if c.IsLogged && c.User.ProhibitLogin { + c.Data["Title"] = c.Tr("auth.prohibit_login") + c.Success("user/auth/prohibit_login") + return + } + + // Check non-logged users landing page. + if !c.IsLogged && c.Req.RequestURI == "/" && conf.Server.LandingURL != "/" { + c.RedirectSubpath(conf.Server.LandingURL) + return + } + + // Redirect to dashboard if user tries to visit any non-login page. + if options.SignOutRequired && c.IsLogged && c.Req.RequestURI != "/" { + c.RedirectSubpath("/") + return + } + + if !options.SignOutRequired && !options.DisableCSRF && c.Req.Method == "POST" && !isAPIPath(c.Req.URL.Path) { + csrf.Validate(c.Context, c.csrf) + if c.Written() { + return + } + } + + if options.SignInRequired { + if !c.IsLogged { + // Restrict API calls with error message. + if isAPIPath(c.Req.URL.Path) { + c.JSON(http.StatusForbidden, map[string]string{ + "message": "Only authenticated user is allowed to call APIs.", + }) + return + } + + if isWebPath(c.Req.URL.Path) { + c.ServeWeb() + return + } + + c.SetCookie("redirect_to", url.QueryEscape(conf.Server.Subpath+c.Req.RequestURI), 0, conf.Server.Subpath) + c.RedirectSubpath("/user/sign-in") + return + } else if !c.User.IsActive && conf.Auth.RequireEmailConfirmation { + c.Title("auth.active_your_account") + c.Success("user/auth/activate") + return + } + } + + if options.AdminRequired { + if !c.User.IsAdmin { + c.Status(http.StatusForbidden) + return + } + c.PageIs("Admin") + } + } +} + +func isAPIPath(url string) bool { + return strings.HasPrefix(url, "/api/") +} + +func isWebPath(p string) bool { + p = strings.TrimPrefix(p, conf.Server.Subpath) + switch { + case p == "/user/sign-in", + p == "/user/mfa", + strings.HasPrefix(p, "/assets/"), + strings.HasPrefix(p, "/src/"), + strings.HasPrefix(p, "/node_modules/"), + strings.HasPrefix(p, "/@"), + strings.HasPrefix(p, "/img/"): + return true + } + return false +} + +type AuthStore interface { + // GetAccessTokenBySHA1 returns the access token with given SHA1. It returns + // database.ErrAccessTokenNotExist when not found. + GetAccessTokenBySHA1(ctx context.Context, sha1 string) (*database.AccessToken, error) + // TouchAccessTokenByID updates the updated time of the given access token to + // the current time. + TouchAccessTokenByID(ctx context.Context, id int64) error + + // GetUserByID returns the user with given ID. It returns + // database.ErrUserNotExist when not found. + GetUserByID(ctx context.Context, id int64) (*database.User, error) + // GetUserByUsername returns the user with given username. It returns + // database.ErrUserNotExist when not found. + GetUserByUsername(ctx context.Context, username string) (*database.User, error) + // CreateUser creates a new user and persists to database. It returns + // database.ErrNameNotAllowed if the given name or pattern of the name is not + // allowed as a username, or database.ErrUserAlreadyExist when a user with same + // name already exists, or database.ErrEmailAlreadyUsed if the email has been + // verified by another user. + CreateUser(ctx context.Context, username, email string, opts database.CreateUserOptions) (*database.User, error) + // AuthenticateUser validates username and password via given login source ID. + // It returns database.ErrUserNotExist when the user was not found. + // + // When the "loginSourceID" is negative, it aborts the process and returns + // database.ErrUserNotExist if the user was not found in the database. + // + // When the "loginSourceID" is non-negative, it returns + // database.ErrLoginSourceMismatch if the user has different login source ID + // than the "loginSourceID". + // + // When the "loginSourceID" is positive, it tries to authenticate via given + // login source and creates a new user when not yet exists in the database. + AuthenticateUser(ctx context.Context, login, password string, loginSourceID int64) (*database.User, error) +} + +// authenticatedUserID returns the ID of the authenticated user, along with a bool value +// which indicates whether the user uses token authentication. +func authenticatedUserID(store AuthStore, c *macaron.Context, sess session.Store) (_ int64, isTokenAuth bool) { + if !database.HasEngine { + return 0, false + } + + // Check access token. + if isAPIPath(c.Req.URL.Path) { + var tokenSHA string + auHead := c.Req.Header.Get("Authorization") + if auHead != "" { + auths := strings.Fields(auHead) + if len(auths) == 2 && auths[0] == "token" { + tokenSHA = auths[1] + } + } + + // Let's see if token is valid. + if len(tokenSHA) > 0 { + t, err := store.GetAccessTokenBySHA1(c.Req.Context(), tokenSHA) + if err != nil { + if !database.IsErrAccessTokenNotExist(err) { + log.Error("GetAccessTokenBySHA: %v", err) + } + return 0, false + } + if err = store.TouchAccessTokenByID(c.Req.Context(), t.ID); err != nil { + log.Error("Failed to touch access token: %v", err) + } + return t.UserID, true + } + } + + uid := sess.Get("uid") + if uid == nil { + return 0, false + } + if id, ok := uid.(int64); ok { + _, err := store.GetUserByID(c.Req.Context(), id) + if err != nil { + if !database.IsErrUserNotExist(err) { + log.Error("Failed to get user by ID: %v", err) + } + return 0, false + } + return id, false + } + return 0, false +} + +// authenticatedUser returns the user object of the authenticated user, along with two bool values +// which indicate whether the user uses HTTP Basic Authentication or token authentication respectively. +func authenticatedUser(store AuthStore, ctx *macaron.Context, sess session.Store) (_ *database.User, isBasicAuth, isTokenAuth bool) { + if !database.HasEngine { + return nil, false, false + } + + uid, isTokenAuth := authenticatedUserID(store, ctx, sess) + + if uid <= 0 { + if conf.Auth.EnableReverseProxyAuthentication && isRequestFromTrustedProxy(ctx.Req.Request) { + webAuthUser := ctx.Req.Header.Get(conf.Auth.ReverseProxyAuthenticationHeader) + if len(webAuthUser) > 0 { + user, err := store.GetUserByUsername(ctx.Req.Context(), webAuthUser) + if err != nil { + if !database.IsErrUserNotExist(err) { + log.Error("Failed to get user by name: %v", err) + return nil, false, false + } + + // Check if enabled auto-registration. + if conf.Auth.EnableReverseProxyAutoRegistration { + user, err = store.CreateUser( + ctx.Req.Context(), + webAuthUser, + uuid.New().String()+"@localhost", + database.CreateUserOptions{ + Activated: true, + }, + ) + if err != nil { + log.Error("Failed to create user %q: %v", webAuthUser, err) + return nil, false, false + } + } + } + return user, false, false + } + } + + // Check with basic auth. + baHead := ctx.Req.Header.Get("Authorization") + if len(baHead) > 0 { + auths := strings.Fields(baHead) + if len(auths) == 2 && auths[0] == "Basic" { + uname, passwd, _ := tool.BasicAuthDecode(auths[1]) + + u, err := store.AuthenticateUser(ctx.Req.Context(), uname, passwd, -1) + if err != nil { + if !auth.IsErrBadCredentials(err) { + log.Error("Failed to authenticate user: %v", err) + } + return nil, false, false + } + + return u, true, false + } + } + return nil, false, false + } + + u, err := store.GetUserByID(ctx.Req.Context(), uid) + if err != nil { + log.Error("GetUserByID: %v", err) + return nil, false, false + } + return u, false, isTokenAuth +} + +// isRequestFromTrustedProxy reports whether the request's immediate remote +// address falls within one of the configured trusted proxy CIDR ranges. The +// reverse proxy authentication header is only honored for such requests so an +// attacker reaching Gogs directly cannot forge it. +func isRequestFromTrustedProxy(req *http.Request) bool { + host, _, err := net.SplitHostPort(req.RemoteAddr) + if err != nil { + return false + } + ip := net.ParseIP(host) + if ip == nil { + return false + } + // Normalize IPv4-mapped IPv6 (e.g. "::ffff:127.0.0.1" on dual-stack listeners) + // to its IPv4 form so it matches IPv4 CIDRs like 127.0.0.0/8. + if v4 := ip.To4(); v4 != nil { + ip = v4 + } + for _, cidr := range conf.Auth.TrustedProxyCIDRs { + if cidr.Contains(ip) { + return true + } + } + return false +} + +// AuthenticateByToken attempts to authenticate a user by the given access +// token. It returns database.ErrAccessTokenNotExist when the access token does not +// exist. +func AuthenticateByToken(store AuthStore, ctx context.Context, token string) (*database.User, error) { + t, err := store.GetAccessTokenBySHA1(ctx, token) + if err != nil { + return nil, errors.Wrap(err, "get access token by SHA1") + } + if err = store.TouchAccessTokenByID(ctx, t.ID); err != nil { + // NOTE: There is no need to fail the auth flow if we can't touch the token. + log.Error("Failed to touch access token [id: %d]: %v", t.ID, err) + } + + user, err := store.GetUserByID(ctx, t.UserID) + if err != nil { + return nil, errors.Wrapf(err, "get user by ID [user_id: %d]", t.UserID) + } + return user, nil +} diff --git a/internal/context/auth_test.go b/internal/context/auth_test.go new file mode 100644 index 00000000000..1778e565491 --- /dev/null +++ b/internal/context/auth_test.go @@ -0,0 +1,48 @@ +package context + +import ( + "net" + "net/http" + "testing" + + "github.com/stretchr/testify/require" + + "gogs.io/gogs/internal/conf" +) + +func TestIsRequestFromTrustedProxy(t *testing.T) { + mustCIDR := func(s string) *net.IPNet { + _, n, err := net.ParseCIDR(s) + require.NoError(t, err) + return n + } + + original := conf.Auth.TrustedProxyCIDRs + t.Cleanup(func() { conf.Auth.TrustedProxyCIDRs = original }) + conf.Auth.TrustedProxyCIDRs = []*net.IPNet{ + mustCIDR("127.0.0.0/8"), + mustCIDR("::1/128"), + mustCIDR("10.1.0.0/16"), + } + + tests := []struct { + name string + remoteAddr string + want bool + }{ + {name: "loopback IPv4 with port", remoteAddr: "127.0.0.1:54321", want: true}, + {name: "loopback IPv6 with port", remoteAddr: "[::1]:54321", want: true}, + {name: "within configured CIDR", remoteAddr: "10.1.2.3:8080", want: true}, + {name: "outside configured CIDR", remoteAddr: "203.0.113.5:443", want: false}, + {name: "IPv4-mapped IPv6 matches IPv4 CIDR", remoteAddr: "[::ffff:127.0.0.1]:54321", want: true}, + {name: "remote without port", remoteAddr: "127.0.0.1", want: false}, + {name: "unparseable remote", remoteAddr: "not-an-ip", want: false}, + {name: "empty remote", remoteAddr: "", want: false}, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + req := &http.Request{RemoteAddr: tc.remoteAddr} + require.Equal(t, tc.want, isRequestFromTrustedProxy(req)) + }) + } +} diff --git a/internal/context/context.go b/internal/context/context.go new file mode 100644 index 00000000000..81d007ae124 --- /dev/null +++ b/internal/context/context.go @@ -0,0 +1,341 @@ +package context + +import ( + stdctx "context" + "fmt" + "io" + "net/http" + "strings" + "time" + + "github.com/go-macaron/cache" + "github.com/go-macaron/csrf" + "github.com/go-macaron/i18n" + "github.com/go-macaron/session" + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/lazyregexp" + "gogs.io/gogs/internal/template" +) + +// Context represents context of a request. +type Context struct { + *macaron.Context + Cache cache.Cache + csrf csrf.CSRF + Flash *session.Flash + Session session.Store + + Link string // Current request URL + User *database.User + IsLogged bool + IsBasicAuth bool + IsTokenAuth bool + + Repo *Repository + Org *Organization + + webHandler http.Handler +} + +// RawTitle sets the "Title" field in template data. +func (c *Context) RawTitle(title string) { + c.Data["Title"] = title +} + +// Title localizes the "Title" field in template data. +func (c *Context) Title(locale string) { + c.RawTitle(c.Tr(locale)) +} + +// PageIs sets "PageIsxxx" field in template data. +func (c *Context) PageIs(name string) { + c.Data["PageIs"+name] = true +} + +// Require sets "Requirexxx" field in template data. +func (c *Context) Require(name string) { + c.Data["Require"+name] = true +} + +func (c *Context) RequireHighlightJS() { + c.Require("HighlightJS") +} + +func (c *Context) RequireSimpleMDE() { + c.Require("SimpleMDE") +} + +func (c *Context) RequireAutosize() { + c.Require("Autosize") +} + +func (c *Context) RequireDropzone() { + c.Require("Dropzone") +} + +// FormErr sets "Err_xxx" field in template data. +func (c *Context) FormErr(names ...string) { + for i := range names { + c.Data["Err_"+names[i]] = true + } +} + +// UserID returns ID of current logged in user. +// It returns 0 if visitor is anonymous. +func (c *Context) UserID() int64 { + if !c.IsLogged { + return 0 + } + return c.User.ID +} + +func (c *Context) GetErrMsg() string { + return c.Data["ErrorMsg"].(string) +} + +// HasError returns true if error occurs in form validation. +func (c *Context) HasError() bool { + hasErr, ok := c.Data["HasError"] + if !ok { + return false + } + c.Flash.ErrorMsg = c.Data["ErrorMsg"].(string) + c.Data["Flash"] = c.Flash + return hasErr.(bool) +} + +// HasValue returns true if value of given name exists. +func (c *Context) HasValue(name string) bool { + _, ok := c.Data[name] + return ok +} + +// HTML responses template with given status. +func (c *Context) HTML(status int, name string) { + log.Trace("Template: %s", name) + c.Context.HTML(status, name) +} + +// Success responses template with status http.StatusOK. +func (c *Context) Success(name string) { + c.HTML(http.StatusOK, name) +} + +// JSONSuccess responses JSON with status http.StatusOK. +func (c *Context) JSONSuccess(data any) { + c.JSON(http.StatusOK, data) +} + +// RawRedirect simply calls underlying Redirect method with no escape. +func (c *Context) RawRedirect(location string, status ...int) { + c.Context.Redirect(location, status...) +} + +// Redirect responses redirection with given location and status. +// It escapes special characters in the location string. +func (c *Context) Redirect(location string, status ...int) { + c.Context.Redirect(template.EscapePound(location), status...) +} + +// RedirectSubpath responses redirection with given location and status. +// It prepends setting.Server.Subpath to the location string. +func (c *Context) RedirectSubpath(location string, status ...int) { + c.Redirect(conf.Server.Subpath+location, status...) +} + +// RenderWithErr used for page has form validation but need to prompt error to users. +func (c *Context) RenderWithErr(msg string, status int, tpl string, f any) { + if f != nil { + form.Assign(f, c.Data) + } + c.Flash.ErrorMsg = msg + c.Data["Flash"] = c.Flash + c.HTML(status, tpl) +} + +// WebContext carries per-request inputs into the web handler so it can +// render the React shell. Fields are read by helpers like WebContextFrom. +type WebContext struct { + Lang string + SubURL string + StatusCode int +} + +// WebContextKey is the request context key for WebContext values. Exported +// so callers outside this package (e.g. the web NotFound handler) can attach +// a WebContext when the request bypasses Contexter. +type WebContextKey struct{} + +// WebContextFrom returns the WebContext attached to r, or a zero value with +// sensible defaults when nothing was attached. +func WebContextFrom(r *http.Request) WebContext { + wr, ok := r.Context().Value(WebContextKey{}).(WebContext) + if !ok { + return WebContext{Lang: "en-US"} + } + if wr.Lang == "" { + wr.Lang = "en-US" + } + return wr +} + +// NotFound renders the React 404 page through the web handler with a 404 +// status. +func (c *Context) NotFound() { + c.serveWeb(WebContext{ + Lang: c.Language(), + SubURL: conf.Server.Subpath, + StatusCode: http.StatusNotFound, + }) +} + +// ServeWeb delegates the current request to the web handler. The web frontend +// decides what to render based on the request path. +func (c *Context) ServeWeb() { + c.serveWeb(WebContext{ + Lang: c.Language(), + SubURL: conf.Server.Subpath, + }) +} + +func (c *Context) serveWeb(wr WebContext) { + ctx := stdctx.WithValue(c.Req.Context(), WebContextKey{}, wr) + c.webHandler.ServeHTTP(c.Resp, c.Req.WithContext(ctx)) +} + +// Error renders the 500 page. +func (c *Context) Error(err error, msg string) { + log.ErrorDepth(4, "%s: %v", msg, err) + + c.Title("status.internal_server_error") + + // Only in non-production mode or admin can see the actual error message. + if !conf.IsProdMode() || (c.IsLogged && c.User.IsAdmin) { + c.Data["ErrorMsg"] = err + } + c.HTML(http.StatusInternalServerError, fmt.Sprintf("status/%d", http.StatusInternalServerError)) +} + +// Errorf renders the 500 response with formatted message. +func (c *Context) Errorf(err error, format string, args ...any) { + c.Error(err, fmt.Sprintf(format, args...)) +} + +// NotFoundOrError responses with 404 page for not found error and 500 page otherwise. +func (c *Context) NotFoundOrError(err error, msg string) { + if errx.IsNotFound(err) { + c.NotFound() + return + } + c.Error(err, msg) +} + +// NotFoundOrErrorf is same as NotFoundOrError but with formatted message. +func (c *Context) NotFoundOrErrorf(err error, format string, args ...any) { + c.NotFoundOrError(err, fmt.Sprintf(format, args...)) +} + +func (c *Context) PlainText(status int, msg string) { + c.Render.PlainText(status, []byte(msg)) +} + +func (c *Context) ServeContent(name string, r io.ReadSeeker, params ...any) { + modtime := time.Now() + for _, p := range params { + switch v := p.(type) { + case time.Time: + modtime = v + } + } + c.Resp.Header().Set("Content-Description", "File Transfer") + c.Resp.Header().Set("Content-Type", "application/octet-stream") + c.Resp.Header().Set("Content-Disposition", "attachment; filename="+name) + c.Resp.Header().Set("Content-Transfer-Encoding", "binary") + c.Resp.Header().Set("Expires", "0") + c.Resp.Header().Set("Cache-Control", "must-revalidate") + c.Resp.Header().Set("Pragma", "public") + http.ServeContent(c.Resp, c.Req.Request, name, modtime, r) +} + +// csrfTokenExcludePattern matches characters that are not used for generating +// CSRF tokens, see all possible characters at +// https://github.com/go-macaron/csrf/blob/5d38f39de352972063d1ef026fc477283841bb9b/csrf.go#L148. +var csrfTokenExcludePattern = lazyregexp.New(`[^a-zA-Z0-9-_].*`) + +// Contexter initializes a classic context for a request. webHandler +// receives 404 responses so the React frontend can render its own 404 page. +func Contexter(store Store, webHandler http.Handler) macaron.Handler { + return func(ctx *macaron.Context, l i18n.Locale, cache cache.Cache, sess session.Store, f *session.Flash, x csrf.CSRF) { + c := &Context{ + Context: ctx, + Cache: cache, + csrf: x, + Flash: f, + Session: sess, + Link: conf.Server.Subpath + strings.TrimSuffix(ctx.Req.URL.Path, "/"), + webHandler: webHandler, + Repo: &Repository{ + PullRequest: &PullRequest{}, + }, + Org: &Organization{}, + } + c.Data["Link"] = template.EscapePound(c.Link) + c.Data["PageStartTime"] = time.Now() + + if len(conf.HTTP.AccessControlAllowOrigin) > 0 { + c.Header().Set("Access-Control-Allow-Origin", conf.HTTP.AccessControlAllowOrigin) + c.Header().Set("Access-Control-Allow-Credentials", "true") + c.Header().Set("Access-Control-Max-Age", "3600") + c.Header().Set("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With") + } + + // Get user from session or header when possible + c.User, c.IsBasicAuth, c.IsTokenAuth = authenticatedUser(store, c.Context, c.Session) + + if c.User != nil { + c.IsLogged = true + c.Data["IsLogged"] = c.IsLogged + c.Data["LoggedUser"] = c.User + c.Data["LoggedUserID"] = c.User.ID + c.Data["LoggedUserName"] = c.User.Name + c.Data["IsAdmin"] = c.User.IsAdmin + } else { + c.Data["LoggedUserID"] = 0 + c.Data["LoggedUserName"] = "" + } + + // If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid. + if c.Req.Method == "POST" && strings.Contains(c.Req.Header.Get("Content-Type"), "multipart/form-data") { + if err := c.Req.ParseMultipartForm(conf.Attachment.MaxSize << 20); err != nil && !strings.Contains(err.Error(), "EOF") { // 32MB max size + c.Error(err, "parse multipart form") + return + } + } + + // 🚨 SECURITY: Prevent XSS from injected CSRF cookie by stripping all + // characters that are not used for generating CSRF tokens, see + // https://github.com/gogs/gogs/issues/6953 for details. + csrfToken := csrfTokenExcludePattern.ReplaceAllString(x.GetToken(), "") + c.Data["CSRFToken"] = csrfToken + c.Data["CSRFTokenHTML"] = template.Safe(``) + log.Trace("Session ID: %s", sess.ID()) + log.Trace("CSRF Token: %v", c.Data["CSRFToken"]) + + c.Data["ShowRegistrationButton"] = !conf.Auth.DisableRegistration + + c.renderNoticeBanner() + + // 🚨 SECURITY: Prevent MIME type sniffing in some browsers, + // see https://github.com/gogs/gogs/issues/5397 for details. + c.Header().Set("X-Content-Type-Options", "nosniff") + c.Header().Set("X-Frame-Options", "deny") + + ctx.Map(c) + } +} diff --git a/internal/context/go_get.go b/internal/context/go_get.go new file mode 100644 index 00000000000..ca067d0633e --- /dev/null +++ b/internal/context/go_get.go @@ -0,0 +1,63 @@ +package context + +import ( + "net/http" + "path" + "strings" + + "github.com/unknwon/com" + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/repox" +) + +// ServeGoGet does quick responses for appropriate go-get meta with status OK +// regardless of whether the user has access to the repository, or the repository +// does exist at all. This is particular a workaround for "go get" command which +// does not respect .netrc file. +func ServeGoGet() macaron.Handler { + return func(c *macaron.Context) { + if c.Query("go-get") != "1" { + return + } + + ownerName := c.Params(":username") + repoName := c.Params(":reponame") + branchName := "master" + + owner, err := database.Handle.Users().GetByUsername(c.Req.Context(), ownerName) + if err == nil { + repo, err := database.Handle.Repositories().GetByName(c.Req.Context(), owner.ID, repoName) + if err == nil && repo.DefaultBranch != "" { + branchName = repo.DefaultBranch + } + } + + prefix := conf.Server.ExternalURL + path.Join(ownerName, repoName, "src", branchName) + insecureFlag := "" + if !strings.HasPrefix(conf.Server.ExternalURL, "https://") { + insecureFlag = "--insecure " + } + c.PlainText(http.StatusOK, []byte(com.Expand(` + + + + + + + go get {InsecureFlag}{GoGetImport} + + +`, + map[string]string{ + "GoGetImport": path.Join(conf.Server.URL.Host, conf.Server.Subpath, ownerName, repoName), + "CloneLink": repox.HTTPSCloneURL(ownerName, repoName), + "GoDocDirectory": prefix + "{/dir}", + "GoDocFile": prefix + "{/dir}/{file}#L{line}", + "InsecureFlag": insecureFlag, + }, + ))) + } +} diff --git a/internal/context/notice.go b/internal/context/notice.go new file mode 100644 index 00000000000..897fea1de4e --- /dev/null +++ b/internal/context/notice.go @@ -0,0 +1,58 @@ +package context + +import ( + "os" + "path/filepath" + + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/tool" +) + +// renderNoticeBanner checks if a notice banner file exists and loads the message to display +// on all pages. +func (c *Context) renderNoticeBanner() { + fpath := filepath.Join(conf.CustomDir(), "notice", "banner.md") + if !osx.Exist(fpath) { + return + } + + f, err := os.Open(fpath) + if err != nil { + log.Error("Failed to open file %q: %v", fpath, err) + return + } + defer f.Close() + + fi, err := f.Stat() + if err != nil { + log.Error("Failed to stat file %q: %v", fpath, err) + return + } + + // Limit size to prevent very large messages from breaking pages + var maxSize int64 = 1024 + + if fi.Size() > maxSize { // Refuse to print very long messages + log.Warn("Notice banner file %q size too large [%d > %d]: refusing to render", fpath, fi.Size(), maxSize) + return + } + + buf := make([]byte, maxSize) + n, err := f.Read(buf) + if err != nil { + log.Error("Failed to read file %q: %v", fpath, err) + return + } + buf = buf[:n] + + if !tool.IsTextFile(buf) { + log.Warn("Notice banner file %q does not appear to be a text file: aborting", fpath) + return + } + + c.Data["ServerNotice"] = string(markup.RawMarkdown(buf, "")) +} diff --git a/internal/context/org.go b/internal/context/org.go new file mode 100644 index 00000000000..71c4f4b31e1 --- /dev/null +++ b/internal/context/org.go @@ -0,0 +1,143 @@ +package context + +import ( + "strings" + + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" +) + +type Organization struct { + IsOwner bool + IsMember bool + IsTeamMember bool // Is member of team. + IsTeamAdmin bool // In owner team or team that has admin permission level. + Organization *database.User + OrgLink string + + Team *database.Team +} + +func HandleOrgAssignment(c *Context, args ...bool) { + var ( + requireMember bool + requireOwner bool + requireTeamMember bool + requireTeamAdmin bool + ) + if len(args) >= 1 { + requireMember = args[0] + } + if len(args) >= 2 { + requireOwner = args[1] + } + if len(args) >= 3 { + requireTeamMember = args[2] + } + if len(args) >= 4 { + requireTeamAdmin = args[3] + } + + orgName := c.Params(":org") + + var err error + c.Org.Organization, err = database.Handle.Users().GetByUsername(c.Req.Context(), orgName) + if err != nil { + c.NotFoundOrError(err, "get organization by name") + return + } + org := c.Org.Organization + c.Data["Org"] = org + + // Force redirection when username is actually a user. + if !org.IsOrganization() { + c.Redirect("/" + org.Name) + return + } + + // Admin has super access. + if c.IsLogged && c.User.IsAdmin { + c.Org.IsOwner = true + c.Org.IsMember = true + c.Org.IsTeamMember = true + c.Org.IsTeamAdmin = true + } else if c.IsLogged { + c.Org.IsOwner = org.IsOwnedBy(c.User.ID) + if c.Org.IsOwner { + c.Org.IsMember = true + c.Org.IsTeamMember = true + c.Org.IsTeamAdmin = true + } else if org.IsOrgMember(c.User.ID) { + c.Org.IsMember = true + } + } else { + // Fake data. + c.Data["SignedUser"] = &database.User{} + } + if (requireMember && !c.Org.IsMember) || + (requireOwner && !c.Org.IsOwner) { + c.NotFound() + return + } + c.Data["IsOrganizationOwner"] = c.Org.IsOwner + c.Data["IsOrganizationMember"] = c.Org.IsMember + + c.Org.OrgLink = conf.Server.Subpath + "/org/" + org.Name + c.Data["OrgLink"] = c.Org.OrgLink + + // Team. + if c.Org.IsMember { + if c.Org.IsOwner { + if err := org.GetTeams(); err != nil { + c.Error(err, "get teams") + return + } + } else { + org.Teams, err = org.GetUserTeams(c.User.ID) + if err != nil { + c.Error(err, "get user teams") + return + } + } + } + + teamName := c.Params(":team") + if len(teamName) > 0 { + teamExists := false + for _, team := range org.Teams { + if team.LowerName == strings.ToLower(teamName) { + teamExists = true + c.Org.Team = team + c.Org.IsTeamMember = true + c.Data["Team"] = c.Org.Team + break + } + } + + if !teamExists { + c.NotFound() + return + } + + c.Data["IsTeamMember"] = c.Org.IsTeamMember + if requireTeamMember && !c.Org.IsTeamMember { + c.NotFound() + return + } + + c.Org.IsTeamAdmin = c.Org.Team.IsOwnerTeam() || c.Org.Team.Authorize >= database.AccessModeAdmin + c.Data["IsTeamAdmin"] = c.Org.IsTeamAdmin + if requireTeamAdmin && !c.Org.IsTeamAdmin { + c.NotFound() + return + } + } +} + +func OrgAssignment(args ...bool) macaron.Handler { + return func(c *Context) { + HandleOrgAssignment(c, args...) + } +} diff --git a/internal/context/repo.go b/internal/context/repo.go new file mode 100644 index 00000000000..a6c7dead756 --- /dev/null +++ b/internal/context/repo.go @@ -0,0 +1,460 @@ +package context + +import ( + "bytes" + "fmt" + "net/url" + "strings" + + "github.com/cockroachdb/errors" + "github.com/editorconfig/editorconfig-core-go/v2" + "gopkg.in/macaron.v1" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/repox" +) + +type PullRequest struct { + BaseRepo *database.Repository + Allowed bool + SameRepo bool + HeadInfo string // [:] +} + +type Repository struct { + AccessMode database.AccessMode + IsWatching bool + IsViewBranch bool + IsViewTag bool + IsViewCommit bool + Repository *database.Repository + Owner *database.User + Commit *git.Commit + Tag *git.Tag + GitRepo *git.Repository + BranchName string + TagName string + TreePath string + CommitID string + RepoLink string + CloneLink repox.CloneLink + CommitsCount int64 + Mirror *database.Mirror + + PullRequest *PullRequest +} + +// IsOwner returns true if current user is the owner of repository. +func (r *Repository) IsOwner() bool { + return r.AccessMode >= database.AccessModeOwner +} + +// IsAdmin returns true if current user has admin or higher access of repository. +func (r *Repository) IsAdmin() bool { + return r.AccessMode >= database.AccessModeAdmin +} + +// IsWriter returns true if current user has write or higher access of repository. +func (r *Repository) IsWriter() bool { + return r.AccessMode >= database.AccessModeWrite +} + +// HasAccess returns true if the current user has at least read access for this repository +func (r *Repository) HasAccess() bool { + return r.AccessMode >= database.AccessModeRead +} + +// CanEnableEditor returns true if repository is editable and user has proper access level. +func (r *Repository) CanEnableEditor() bool { + return r.Repository.CanEnableEditor() && r.IsViewBranch && r.IsWriter() && !r.Repository.IsBranchRequirePullRequest(r.BranchName) +} + +// Editorconfig returns the ".editorconfig" definition if found in the HEAD of the default branch. +func (r *Repository) Editorconfig() (*editorconfig.Editorconfig, error) { + commit, err := r.GitRepo.BranchCommit(r.Repository.DefaultBranch) + if err != nil { + return nil, errors.Wrapf(err, "get commit of branch %q ", r.Repository.DefaultBranch) + } + + entry, err := commit.TreeEntry(".editorconfig") + if err != nil { + return nil, errors.Wrap(err, "get .editorconfig") + } + + p, err := entry.Blob().Bytes() + if err != nil { + return nil, errors.Wrap(err, "read .editorconfig") + } + return editorconfig.Parse(bytes.NewReader(p)) +} + +// MakeURL accepts a string or url.URL as argument and returns escaped URL prepended with repository URL. +func (r *Repository) MakeURL(location any) string { + switch location := location.(type) { + case string: + tempURL := url.URL{ + Path: r.RepoLink + "/" + location, + } + return tempURL.String() + case url.URL: + location.Path = r.RepoLink + "/" + location.Path + return location.String() + default: + panic("location type must be either string or url.URL") + } +} + +// PullRequestURL returns URL for composing a pull request. +// This function does not check if the repository can actually compose a pull request. +func (r *Repository) PullRequestURL(baseBranch, headBranch string) string { + repoLink := r.RepoLink + if r.PullRequest.BaseRepo != nil { + repoLink = r.PullRequest.BaseRepo.Link() + } + return fmt.Sprintf("%s/compare/%s...%s:%s", repoLink, baseBranch, r.Owner.Name, headBranch) +} + +// [0]: issues, [1]: wiki +func RepoAssignment(pages ...bool) macaron.Handler { + return func(c *Context) { + var ( + owner *database.User + err error + isIssuesPage bool + isWikiPage bool + ) + + if len(pages) > 0 { + isIssuesPage = pages[0] + } + if len(pages) > 1 { + isWikiPage = pages[1] + } + + ownerName := c.Params(":username") + repoName := strings.TrimSuffix(c.Params(":reponame"), ".git") + + // Check if the user is the same as the repository owner + if c.IsLogged && c.User.LowerName == strings.ToLower(ownerName) { + owner = c.User + } else { + owner, err = database.Handle.Users().GetByUsername(c.Req.Context(), ownerName) + if err != nil { + c.NotFoundOrError(err, "get user by name") + return + } + } + c.Repo.Owner = owner + c.Data["Username"] = c.Repo.Owner.Name + + repo, err := database.GetRepositoryByName(owner.ID, repoName) + if err != nil { + c.NotFoundOrError(err, "get repository by name") + return + } + + c.Repo.Repository = repo + c.Data["RepoName"] = c.Repo.Repository.Name + c.Data["IsBareRepo"] = c.Repo.Repository.IsBare + c.Repo.RepoLink = repo.Link() + c.Data["RepoLink"] = c.Repo.RepoLink + c.Data["RepoRelPath"] = c.Repo.Owner.Name + "/" + c.Repo.Repository.Name + + // Admin has super access + if c.IsLogged && c.User.IsAdmin { + c.Repo.AccessMode = database.AccessModeOwner + } else { + c.Repo.AccessMode = database.Handle.Permissions().AccessMode(c.Req.Context(), c.UserID(), repo.ID, + database.AccessModeOptions{ + OwnerID: repo.OwnerID, + Private: repo.IsPrivate, + }, + ) + } + + // If the authenticated user has no direct access, see if the repository is a fork + // and whether the user has access to the base repository. + if c.Repo.AccessMode == database.AccessModeNone && repo.BaseRepo != nil { + mode := min( + // Users shouldn't have indirect access level higher than write. + database.Handle.Permissions().AccessMode(c.Req.Context(), c.UserID(), repo.BaseRepo.ID, + database.AccessModeOptions{ + OwnerID: repo.BaseRepo.OwnerID, + Private: repo.BaseRepo.IsPrivate, + }, + ), + database.AccessModeWrite, + ) + c.Repo.AccessMode = mode + } + + // Check access + if c.Repo.AccessMode == database.AccessModeNone { + // Redirect to any accessible page if not yet on it + if repo.IsPartialPublic() && + (!(isIssuesPage || isWikiPage) || + (isIssuesPage && !repo.CanGuestViewIssues()) || + (isWikiPage && !repo.CanGuestViewWiki())) { + switch { + case repo.CanGuestViewIssues(): + c.Redirect(repo.Link() + "/issues") + case repo.CanGuestViewWiki(): + c.Redirect(repo.Link() + "/wiki") + default: + c.NotFound() + } + return + } + + // Response 404 if user is on completely private repository or possible accessible page but owner doesn't enabled + if !repo.IsPartialPublic() || + (isIssuesPage && !repo.CanGuestViewIssues()) || + (isWikiPage && !repo.CanGuestViewWiki()) { + c.NotFound() + return + } + + c.Repo.Repository.EnableIssues = repo.CanGuestViewIssues() + c.Repo.Repository.EnableWiki = repo.CanGuestViewWiki() + } + + if repo.IsMirror { + c.Repo.Mirror, err = database.GetMirrorByRepoID(repo.ID) + if err != nil { + c.Error(err, "get mirror by repository ID") + return + } + c.Data["MirrorEnablePrune"] = c.Repo.Mirror.EnablePrune + c.Data["MirrorInterval"] = c.Repo.Mirror.Interval + c.Data["Mirror"] = c.Repo.Mirror + } + + gitRepo, err := git.Open(database.RepoPath(ownerName, repoName)) + if err != nil { + c.Error(err, "open repository") + return + } + c.Repo.GitRepo = gitRepo + + tags, err := c.Repo.GitRepo.Tags() + if err != nil { + c.Error(err, "get tags") + return + } + c.Data["Tags"] = tags + c.Repo.Repository.NumTags = len(tags) + + c.Data["Title"] = owner.Name + "/" + repo.Name + c.Data["Repository"] = repo + c.Data["Owner"] = c.Repo.Repository.Owner + c.Data["IsRepositoryOwner"] = c.Repo.IsOwner() + c.Data["IsRepositoryAdmin"] = c.Repo.IsAdmin() + c.Data["IsRepositoryWriter"] = c.Repo.IsWriter() + + c.Data["DisableSSH"] = conf.SSH.Disabled + c.Data["DisableHTTP"] = conf.Repository.DisableHTTPGit + c.Data["CloneLink"] = repo.CloneLink() + c.Data["WikiCloneLink"] = repo.WikiCloneLink() + + if c.IsLogged { + c.Data["IsWatchingRepo"] = database.IsWatching(c.User.ID, repo.ID) + c.Data["IsStaringRepo"] = database.IsStaring(c.User.ID, repo.ID) + } + + // repo is bare and display enable + if c.Repo.Repository.IsBare { + return + } + + c.Data["TagName"] = c.Repo.TagName + branches, err := c.Repo.GitRepo.Branches() + if err != nil { + c.Error(err, "get branches") + return + } + c.Data["Branches"] = branches + c.Data["BranchCount"] = len(branches) + + // If not branch selected, try default one. + // If default branch doesn't exists, fall back to some other branch. + if c.Repo.BranchName == "" { + if len(c.Repo.Repository.DefaultBranch) > 0 && gitRepo.HasBranch(c.Repo.Repository.DefaultBranch) { + c.Repo.BranchName = c.Repo.Repository.DefaultBranch + } else if len(branches) > 0 { + c.Repo.BranchName = branches[0] + } + } + c.Data["BranchName"] = c.Repo.BranchName + c.Data["CommitID"] = c.Repo.CommitID + + c.Data["IsGuest"] = !c.Repo.HasAccess() + } +} + +// RepoRef handles repository reference name including those contain `/`. +func RepoRef() macaron.Handler { + return func(c *Context) { + // Empty repository does not have reference information. + if c.Repo.Repository.IsBare { + return + } + + var ( + refName string + err error + ) + + // For API calls. + if c.Repo.GitRepo == nil { + repoPath := database.RepoPath(c.Repo.Owner.Name, c.Repo.Repository.Name) + c.Repo.GitRepo, err = git.Open(repoPath) + if err != nil { + c.Error(err, "open repository") + return + } + } + + // Get default branch. + if c.Params("*") == "" { + refName = c.Repo.Repository.DefaultBranch + if !c.Repo.GitRepo.HasBranch(refName) { + branches, err := c.Repo.GitRepo.Branches() + if err != nil { + c.Error(err, "get branches") + return + } + refName = branches[0] + } + c.Repo.Commit, err = c.Repo.GitRepo.BranchCommit(refName) + if err != nil { + c.Error(err, "get branch commit") + return + } + c.Repo.CommitID = c.Repo.Commit.ID.String() + c.Repo.IsViewBranch = true + + } else { + hasMatched := false + parts := strings.Split(c.Params("*"), "/") + for i, part := range parts { + refName = strings.TrimPrefix(refName+"/"+part, "/") + + if c.Repo.GitRepo.HasBranch(refName) || + c.Repo.GitRepo.HasTag(refName) { + if i < len(parts)-1 { + c.Repo.TreePath = strings.Join(parts[i+1:], "/") + } + hasMatched = true + break + } + } + if !hasMatched && len(parts[0]) == 40 { + refName = parts[0] + c.Repo.TreePath = strings.Join(parts[1:], "/") + } + + if c.Repo.GitRepo.HasBranch(refName) { + c.Repo.IsViewBranch = true + + c.Repo.Commit, err = c.Repo.GitRepo.BranchCommit(refName) + if err != nil { + c.Error(err, "get branch commit") + return + } + c.Repo.CommitID = c.Repo.Commit.ID.String() + + } else if c.Repo.GitRepo.HasTag(refName) { + c.Repo.IsViewTag = true + c.Repo.Commit, err = c.Repo.GitRepo.TagCommit(refName) + if err != nil { + c.Error(err, "get tag commit") + return + } + c.Repo.CommitID = c.Repo.Commit.ID.String() + } else if len(refName) == 40 { + c.Repo.IsViewCommit = true + c.Repo.CommitID = refName + + c.Repo.Commit, err = c.Repo.GitRepo.CatFileCommit(refName) + if err != nil { + c.NotFound() + return + } + } else { + c.NotFound() + return + } + } + + c.Repo.BranchName = refName + c.Data["BranchName"] = c.Repo.BranchName + c.Data["CommitID"] = c.Repo.CommitID + c.Data["TreePath"] = c.Repo.TreePath + c.Data["IsViewBranch"] = c.Repo.IsViewBranch + c.Data["IsViewTag"] = c.Repo.IsViewTag + c.Data["IsViewCommit"] = c.Repo.IsViewCommit + + // People who have push access or have forked repository can propose a new pull request. + if c.Repo.IsWriter() || (c.IsLogged && database.Handle.Repositories().HasForkedBy(c.Req.Context(), c.Repo.Repository.ID, c.User.ID)) { + // Pull request is allowed if this is a fork repository + // and base repository accepts pull requests. + if c.Repo.Repository.BaseRepo != nil { + if c.Repo.Repository.BaseRepo.AllowsPulls() { + c.Repo.PullRequest.Allowed = true + // In-repository pull requests has higher priority than cross-repository if user is viewing + // base repository and 1) has write access to it 2) has forked it. + if c.Repo.IsWriter() { + c.Data["BaseRepo"] = c.Repo.Repository.BaseRepo + c.Repo.PullRequest.BaseRepo = c.Repo.Repository.BaseRepo + c.Repo.PullRequest.HeadInfo = c.Repo.Owner.Name + ":" + c.Repo.BranchName + } else { + c.Data["BaseRepo"] = c.Repo.Repository + c.Repo.PullRequest.BaseRepo = c.Repo.Repository + c.Repo.PullRequest.HeadInfo = c.User.Name + ":" + c.Repo.BranchName + } + } + } else { + // Or, this is repository accepts pull requests between branches. + if c.Repo.Repository.AllowsPulls() { + c.Data["BaseRepo"] = c.Repo.Repository + c.Repo.PullRequest.BaseRepo = c.Repo.Repository + c.Repo.PullRequest.Allowed = true + c.Repo.PullRequest.SameRepo = true + c.Repo.PullRequest.HeadInfo = c.Repo.BranchName + } + } + } + c.Data["PullRequestCtx"] = c.Repo.PullRequest + } +} + +func RequireRepoAdmin() macaron.Handler { + return func(c *Context) { + if !c.IsLogged || (!c.Repo.IsAdmin() && !c.User.IsAdmin) { + c.NotFound() + return + } + } +} + +func RequireRepoWriter() macaron.Handler { + return func(c *Context) { + if !c.IsLogged || (!c.Repo.IsWriter() && !c.User.IsAdmin) { + c.NotFound() + return + } + } +} + +// GitHookService checks if repository Git hooks service has been enabled. +func GitHookService() macaron.Handler { + return func(c *Context) { + if !c.User.CanEditGitHook() { + c.NotFound() + return + } + } +} diff --git a/internal/context/store.go b/internal/context/store.go new file mode 100644 index 00000000000..0045464c533 --- /dev/null +++ b/internal/context/store.go @@ -0,0 +1,76 @@ +package context + +import ( + "context" + + "gogs.io/gogs/internal/database" +) + +// Store is the data layer carrier for context middleware. This interface is +// meant to abstract away and limit the exposure of the underlying data layer to +// the handler through a thin-wrapper. +type Store interface { + // GetAccessTokenBySHA1 returns the access token with given SHA1. It returns + // database.ErrAccessTokenNotExist when not found. + GetAccessTokenBySHA1(ctx context.Context, sha1 string) (*database.AccessToken, error) + // TouchAccessTokenByID updates the updated time of the given access token to + // the current time. + TouchAccessTokenByID(ctx context.Context, id int64) error + + // GetUserByID returns the user with given ID. It returns + // database.ErrUserNotExist when not found. + GetUserByID(ctx context.Context, id int64) (*database.User, error) + // GetUserByUsername returns the user with given username. It returns + // database.ErrUserNotExist when not found. + GetUserByUsername(ctx context.Context, username string) (*database.User, error) + // CreateUser creates a new user and persists to database. It returns + // database.ErrNameNotAllowed if the given name or pattern of the name is not + // allowed as a username, or database.ErrUserAlreadyExist when a user with same + // name already exists, or database.ErrEmailAlreadyUsed if the email has been + // verified by another user. + CreateUser(ctx context.Context, username, email string, opts database.CreateUserOptions) (*database.User, error) + // AuthenticateUser validates username and password via given login source ID. + // It returns database.ErrUserNotExist when the user was not found. + // + // When the "loginSourceID" is negative, it aborts the process and returns + // database.ErrUserNotExist if the user was not found in the database. + // + // When the "loginSourceID" is non-negative, it returns + // database.ErrLoginSourceMismatch if the user has different login source ID + // than the "loginSourceID". + // + // When the "loginSourceID" is positive, it tries to authenticate via given + // login source and creates a new user when not yet exists in the database. + AuthenticateUser(ctx context.Context, login, password string, loginSourceID int64) (*database.User, error) +} + +type store struct{} + +// NewStore returns a new Store using the global database handle. +func NewStore() Store { + return &store{} +} + +func (*store) GetAccessTokenBySHA1(ctx context.Context, sha1 string) (*database.AccessToken, error) { + return database.Handle.AccessTokens().GetBySHA1(ctx, sha1) +} + +func (*store) TouchAccessTokenByID(ctx context.Context, id int64) error { + return database.Handle.AccessTokens().Touch(ctx, id) +} + +func (*store) GetUserByID(ctx context.Context, id int64) (*database.User, error) { + return database.Handle.Users().GetByID(ctx, id) +} + +func (*store) GetUserByUsername(ctx context.Context, username string) (*database.User, error) { + return database.Handle.Users().GetByUsername(ctx, username) +} + +func (*store) CreateUser(ctx context.Context, username, email string, opts database.CreateUserOptions) (*database.User, error) { + return database.Handle.Users().Create(ctx, username, email, opts) +} + +func (*store) AuthenticateUser(ctx context.Context, login, password string, loginSourceID int64) (*database.User, error) { + return database.Handle.Users().Authenticate(ctx, login, password, loginSourceID) +} diff --git a/internal/context/user.go b/internal/context/user.go new file mode 100644 index 00000000000..04042c5c805 --- /dev/null +++ b/internal/context/user.go @@ -0,0 +1,25 @@ +package context + +import ( + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/database" +) + +// ParamsUser is the wrapper type of the target user defined by URL parameter, namely ':username'. +type ParamsUser struct { + *database.User +} + +// InjectParamsUser returns a handler that retrieves target user based on URL parameter ':username', +// and injects it as *ParamsUser. +func InjectParamsUser() macaron.Handler { + return func(c *Context) { + user, err := database.Handle.Users().GetByUsername(c.Req.Context(), c.Params(":username")) + if err != nil { + c.NotFoundOrError(err, "get user by name") + return + } + c.Map(&ParamsUser{user}) + } +} diff --git a/internal/cron/cron.go b/internal/cron/cron.go new file mode 100644 index 00000000000..52344f77813 --- /dev/null +++ b/internal/cron/cron.go @@ -0,0 +1,71 @@ +package cron + +import ( + "time" + + log "unknwon.dev/clog/v2" + + "github.com/gogs/cron" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" +) + +var c = cron.New() + +func NewContext() { + var ( + entry *cron.Entry + err error + ) + if conf.Cron.UpdateMirror.Enabled { + entry, err = c.AddFunc("Update mirrors", conf.Cron.UpdateMirror.Schedule, database.MirrorUpdate) + if err != nil { + log.Fatal("Cron.(update mirrors): %v", err) + } + if conf.Cron.UpdateMirror.RunAtStart { + entry.Prev = time.Now() + entry.ExecTimes++ + go database.MirrorUpdate() + } + } + if conf.Cron.RepoHealthCheck.Enabled { + entry, err = c.AddFunc("Repository health check", conf.Cron.RepoHealthCheck.Schedule, database.GitFsck) + if err != nil { + log.Fatal("Cron.(repository health check): %v", err) + } + if conf.Cron.RepoHealthCheck.RunAtStart { + entry.Prev = time.Now() + entry.ExecTimes++ + go database.GitFsck() + } + } + if conf.Cron.CheckRepoStats.Enabled { + entry, err = c.AddFunc("Check repository statistics", conf.Cron.CheckRepoStats.Schedule, database.CheckRepoStats) + if err != nil { + log.Fatal("Cron.(check repository statistics): %v", err) + } + if conf.Cron.CheckRepoStats.RunAtStart { + entry.Prev = time.Now() + entry.ExecTimes++ + go database.CheckRepoStats() + } + } + if conf.Cron.RepoArchiveCleanup.Enabled { + entry, err = c.AddFunc("Repository archive cleanup", conf.Cron.RepoArchiveCleanup.Schedule, database.DeleteOldRepositoryArchives) + if err != nil { + log.Fatal("Cron.(repository archive cleanup): %v", err) + } + if conf.Cron.RepoArchiveCleanup.RunAtStart { + entry.Prev = time.Now() + entry.ExecTimes++ + go database.DeleteOldRepositoryArchives() + } + } + c.Start() +} + +// ListTasks returns all running cron tasks. +func ListTasks() []*cron.Entry { + return c.Entries() +} diff --git a/internal/cryptox/aes.go b/internal/cryptox/aes.go new file mode 100644 index 00000000000..0978e0d41ce --- /dev/null +++ b/internal/cryptox/aes.go @@ -0,0 +1,53 @@ +package cryptox + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + + "github.com/cockroachdb/errors" +) + +// AESGCMEncrypt encrypts plaintext with the given key using AES in GCM mode. +func AESGCMEncrypt(key, plaintext []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + nonce := make([]byte, gcm.NonceSize()) + if _, err := rand.Read(nonce); err != nil { + return nil, err + } + + ciphertext := gcm.Seal(nil, nonce, plaintext, nil) + return append(nonce, ciphertext...), nil +} + +// AESGCMDecrypt decrypts ciphertext with the given key using AES in GCM mode. +func AESGCMDecrypt(key, ciphertext []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + size := gcm.NonceSize() + if len(ciphertext)-size <= 0 { + return nil, errors.New("ciphertext is empty") + } + + nonce := ciphertext[:size] + ciphertext = ciphertext[size:] + + return gcm.Open(nil, nonce, ciphertext, nil) +} diff --git a/internal/cryptox/aes_test.go b/internal/cryptox/aes_test.go new file mode 100644 index 00000000000..13c195ffca9 --- /dev/null +++ b/internal/cryptox/aes_test.go @@ -0,0 +1,30 @@ +package cryptox + +import ( + "crypto/rand" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAESGCM(t *testing.T) { + key := make([]byte, 16) // AES-128 + _, err := rand.Read(key) + if err != nil { + t.Fatal(err) + } + + plaintext := []byte("this will be encrypted") + + encrypted, err := AESGCMEncrypt(key, plaintext) + if err != nil { + t.Fatal(err) + } + + decrypted, err := AESGCMDecrypt(key, encrypted) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, plaintext, decrypted) +} diff --git a/internal/cryptox/md5.go b/internal/cryptox/md5.go new file mode 100644 index 00000000000..14c35b1ab11 --- /dev/null +++ b/internal/cryptox/md5.go @@ -0,0 +1,18 @@ +package cryptox + +import ( + "crypto/md5" + "encoding/hex" +) + +// MD5 encodes string to hexadecimal of MD5 checksum. +func MD5(str string) string { + return hex.EncodeToString(MD5Bytes(str)) +} + +// MD5Bytes encodes string to MD5 checksum. +func MD5Bytes(str string) []byte { + m := md5.New() + _, _ = m.Write([]byte(str)) + return m.Sum(nil) +} diff --git a/internal/cryptox/md5_test.go b/internal/cryptox/md5_test.go new file mode 100644 index 00000000000..f89f57a8973 --- /dev/null +++ b/internal/cryptox/md5_test.go @@ -0,0 +1,23 @@ +package cryptox + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestMD5(t *testing.T) { + tests := []struct { + input string + output string + }{ + {input: "", output: "d41d8cd98f00b204e9800998ecf8427e"}, + {input: "The quick brown fox jumps over the lazy dog", output: "9e107d9d372bb6826bd81d3542a419d6"}, + {input: "The quick brown fox jumps over the lazy dog.", output: "e4d909c290d0fb1ca068ffaddf22cbd0"}, + } + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + assert.Equal(t, test.output, MD5(test.input)) + }) + } +} diff --git a/internal/cryptox/sha.go b/internal/cryptox/sha.go new file mode 100644 index 00000000000..2e02cdf6cf1 --- /dev/null +++ b/internal/cryptox/sha.go @@ -0,0 +1,21 @@ +package cryptox + +import ( + "crypto/sha1" + "crypto/sha256" + "encoding/hex" +) + +// SHA1 encodes string to hexadecimal of SHA1 checksum. +func SHA1(str string) string { + h := sha1.New() + _, _ = h.Write([]byte(str)) + return hex.EncodeToString(h.Sum(nil)) +} + +// SHA256 encodes string to hexadecimal of SHA256 checksum. +func SHA256(str string) string { + h := sha256.New() + _, _ = h.Write([]byte(str)) + return hex.EncodeToString(h.Sum(nil)) +} diff --git a/internal/cryptox/sha_test.go b/internal/cryptox/sha_test.go new file mode 100644 index 00000000000..e1d28220a08 --- /dev/null +++ b/internal/cryptox/sha_test.go @@ -0,0 +1,39 @@ +package cryptox + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSHA1(t *testing.T) { + tests := []struct { + input string + output string + }{ + {input: "", output: "da39a3ee5e6b4b0d3255bfef95601890afd80709"}, + {input: "The quick brown fox jumps over the lazy dog", output: "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12"}, + {input: "The quick brown fox jumps over the lazy dog.", output: "408d94384216f890ff7a0c3528e8bed1e0b01621"}, + } + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + assert.Equal(t, test.output, SHA1(test.input)) + }) + } +} + +func TestSHA256(t *testing.T) { + tests := []struct { + input string + output string + }{ + {input: "", output: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}, + {input: "The quick brown fox jumps over the lazy dog", output: "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"}, + {input: "The quick brown fox jumps over the lazy dog.", output: "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c"}, + } + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + assert.Equal(t, test.output, SHA256(test.input)) + }) + } +} diff --git a/internal/database/access_tokens.go b/internal/database/access_tokens.go new file mode 100644 index 00000000000..d68d37d8934 --- /dev/null +++ b/internal/database/access_tokens.go @@ -0,0 +1,161 @@ +package database + +import ( + "context" + "fmt" + "time" + + "github.com/cockroachdb/errors" + "github.com/google/uuid" + "gorm.io/gorm" + + "gogs.io/gogs/internal/cryptox" + "gogs.io/gogs/internal/errx" +) + +// AccessToken is a personal access token. +type AccessToken struct { + ID int64 `gorm:"primarykey"` + UserID int64 `xorm:"uid" gorm:"column:uid;index"` + Name string + Sha1 string `gorm:"type:VARCHAR(40);unique"` + SHA256 string `gorm:"type:VARCHAR(64);unique;not null"` + + Created time.Time `gorm:"-" json:"-"` + CreatedUnix int64 + Updated time.Time `gorm:"-" json:"-"` + UpdatedUnix int64 + HasRecentActivity bool `gorm:"-" json:"-"` + HasUsed bool `gorm:"-" json:"-"` +} + +// BeforeCreate implements the GORM create hook. +func (t *AccessToken) BeforeCreate(tx *gorm.DB) error { + if t.CreatedUnix == 0 { + t.CreatedUnix = tx.NowFunc().Unix() + } + return nil +} + +// AfterFind implements the GORM query hook. +func (t *AccessToken) AfterFind(tx *gorm.DB) error { + t.Created = time.Unix(t.CreatedUnix, 0).Local() + if t.UpdatedUnix > 0 { + t.Updated = time.Unix(t.UpdatedUnix, 0).Local() + t.HasUsed = t.Updated.After(t.Created) + t.HasRecentActivity = t.Updated.Add(7 * 24 * time.Hour).After(tx.NowFunc()) + } + return nil +} + +// AccessTokensStore is the storage layer for access tokens. +type AccessTokensStore struct { + db *gorm.DB +} + +func newAccessTokensStore(db *gorm.DB) *AccessTokensStore { + return &AccessTokensStore{db: db} +} + +type ErrAccessTokenAlreadyExist struct { + args errx.Args +} + +func IsErrAccessTokenAlreadyExist(err error) bool { + return errors.As(err, &ErrAccessTokenAlreadyExist{}) +} + +func (err ErrAccessTokenAlreadyExist) Error() string { + return fmt.Sprintf("access token already exists: %v", err.args) +} + +// Create creates a new access token and persist to database. It returns +// ErrAccessTokenAlreadyExist when an access token with same name already exists +// for the user. +func (s *AccessTokensStore) Create(ctx context.Context, userID int64, name string) (*AccessToken, error) { + err := s.db.WithContext(ctx).Where("uid = ? AND name = ?", userID, name).First(new(AccessToken)).Error + if err == nil { + return nil, ErrAccessTokenAlreadyExist{args: errx.Args{"userID": userID, "name": name}} + } else if !errors.Is(err, gorm.ErrRecordNotFound) { + return nil, err + } + + token := cryptox.SHA1(uuid.New().String()) + sha256 := cryptox.SHA256(token) + + accessToken := &AccessToken{ + UserID: userID, + Name: name, + Sha1: sha256[:40], // To pass the column unique constraint, keep the length of SHA1. + SHA256: sha256, + } + if err = s.db.WithContext(ctx).Create(accessToken).Error; err != nil { + return nil, err + } + + // Set back the raw access token value, for the sake of the caller. + accessToken.Sha1 = token + return accessToken, nil +} + +// DeleteByID deletes the access token by given ID. +// +// 🚨 SECURITY: The "userID" is required to prevent attacker deletes arbitrary +// access token that belongs to another user. +func (s *AccessTokensStore) DeleteByID(ctx context.Context, userID, id int64) error { + return s.db.WithContext(ctx).Where("id = ? AND uid = ?", id, userID).Delete(new(AccessToken)).Error +} + +var _ errx.NotFound = (*ErrAccessTokenNotExist)(nil) + +type ErrAccessTokenNotExist struct { + args errx.Args +} + +// IsErrAccessTokenNotExist returns true if the underlying error has the type +// ErrAccessTokenNotExist. +func IsErrAccessTokenNotExist(err error) bool { + return errors.As(errors.Cause(err), &ErrAccessTokenNotExist{}) +} + +func (err ErrAccessTokenNotExist) Error() string { + return fmt.Sprintf("access token does not exist: %v", err.args) +} + +func (ErrAccessTokenNotExist) NotFound() bool { + return true +} + +// GetBySHA1 returns the access token with given SHA1. It returns +// ErrAccessTokenNotExist when not found. +func (s *AccessTokensStore) GetBySHA1(ctx context.Context, sha1 string) (*AccessToken, error) { + // No need to waste a query for an empty SHA1. + if sha1 == "" { + return nil, ErrAccessTokenNotExist{args: errx.Args{"sha": sha1}} + } + + sha256 := cryptox.SHA256(sha1) + token := new(AccessToken) + err := s.db.WithContext(ctx).Where("sha256 = ?", sha256).First(token).Error + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrAccessTokenNotExist{args: errx.Args{"sha": sha1}} + } else if err != nil { + return nil, err + } + return token, nil +} + +// List returns all access tokens belongs to given user. +func (s *AccessTokensStore) List(ctx context.Context, userID int64) ([]*AccessToken, error) { + var tokens []*AccessToken + return tokens, s.db.WithContext(ctx).Where("uid = ?", userID).Order("id ASC").Find(&tokens).Error +} + +// Touch updates the updated time of the given access token to the current time. +func (s *AccessTokensStore) Touch(ctx context.Context, id int64) error { + return s.db.WithContext(ctx). + Model(new(AccessToken)). + Where("id = ?", id). + UpdateColumn("updated_unix", s.db.NowFunc().Unix()). + Error +} diff --git a/internal/database/access_tokens_test.go b/internal/database/access_tokens_test.go new file mode 100644 index 00000000000..f66271371ee --- /dev/null +++ b/internal/database/access_tokens_test.go @@ -0,0 +1,233 @@ +package database + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gorm.io/gorm" + + "gogs.io/gogs/internal/errx" +) + +func TestAccessToken_BeforeCreate(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + t.Run("CreatedUnix has been set", func(t *testing.T) { + token := &AccessToken{ + CreatedUnix: 1, + } + _ = token.BeforeCreate(db) + assert.Equal(t, int64(1), token.CreatedUnix) + assert.Equal(t, int64(0), token.UpdatedUnix) // Do not set UpdatedUnix until it is used. + }) + + t.Run("CreatedUnix has not been set", func(t *testing.T) { + token := &AccessToken{} + _ = token.BeforeCreate(db) + assert.Equal(t, db.NowFunc().Unix(), token.CreatedUnix) + assert.Equal(t, int64(0), token.UpdatedUnix) // Do not set UpdatedUnix until it is used. + }) +} + +func TestAccessToken_AfterFind(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + t.Run("UpdatedUnix has been set and within 7 days", func(t *testing.T) { + token := &AccessToken{ + CreatedUnix: now.Unix(), + UpdatedUnix: now.Add(time.Second).Unix(), + } + _ = token.AfterFind(db) + assert.Equal(t, token.CreatedUnix, token.Created.Unix()) + assert.Equal(t, token.UpdatedUnix, token.Updated.Unix()) + assert.True(t, token.HasUsed) + assert.True(t, token.HasRecentActivity) + }) + + t.Run("UpdatedUnix has been set and not within 7 days", func(t *testing.T) { + token := &AccessToken{ + CreatedUnix: now.Add(-1 * 9 * 24 * time.Hour).Unix(), + UpdatedUnix: now.Add(-1 * 8 * 24 * time.Hour).Unix(), + } + _ = token.AfterFind(db) + assert.Equal(t, token.CreatedUnix, token.Created.Unix()) + assert.Equal(t, token.UpdatedUnix, token.Updated.Unix()) + assert.True(t, token.HasUsed) + assert.False(t, token.HasRecentActivity) + }) + + t.Run("UpdatedUnix has not been set", func(t *testing.T) { + token := &AccessToken{ + CreatedUnix: now.Unix(), + } + _ = token.AfterFind(db) + assert.Equal(t, token.CreatedUnix, token.Created.Unix()) + assert.True(t, token.Updated.IsZero()) + assert.False(t, token.HasUsed) + assert.False(t, token.HasRecentActivity) + }) +} + +func TestAccessTokens(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + s := &AccessTokensStore{ + db: newTestDB(t, "AccessTokensStore"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *AccessTokensStore) + }{ + {"Create", accessTokensCreate}, + {"DeleteByID", accessTokensDeleteByID}, + {"GetBySHA1", accessTokensGetBySHA}, + {"List", accessTokensList}, + {"Touch", accessTokensTouch}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func accessTokensCreate(t *testing.T, ctx context.Context, s *AccessTokensStore) { + // Create first access token with name "Test" + token, err := s.Create(ctx, 1, "Test") + require.NoError(t, err) + + assert.Equal(t, int64(1), token.UserID) + assert.Equal(t, "Test", token.Name) + assert.Equal(t, 40, len(token.Sha1), "sha1 length") + + // Get it back and check the Created field + token, err = s.GetBySHA1(ctx, token.Sha1) + require.NoError(t, err) + assert.Equal(t, s.db.NowFunc().Format(time.RFC3339), token.Created.UTC().Format(time.RFC3339)) + + // Try create second access token with same name should fail + _, err = s.Create(ctx, token.UserID, token.Name) + wantErr := ErrAccessTokenAlreadyExist{ + args: errx.Args{ + "userID": token.UserID, + "name": token.Name, + }, + } + assert.Equal(t, wantErr, err) +} + +func accessTokensDeleteByID(t *testing.T, ctx context.Context, s *AccessTokensStore) { + // Create an access token with name "Test" + token, err := s.Create(ctx, 1, "Test") + require.NoError(t, err) + + // Delete a token with mismatched user ID is noop + err = s.DeleteByID(ctx, 2, token.ID) + require.NoError(t, err) + + // We should be able to get it back + _, err = s.GetBySHA1(ctx, token.Sha1) + require.NoError(t, err) + + // Now delete this token with correct user ID + err = s.DeleteByID(ctx, token.UserID, token.ID) + require.NoError(t, err) + + // We should get token not found error + _, err = s.GetBySHA1(ctx, token.Sha1) + wantErr := ErrAccessTokenNotExist{ + args: errx.Args{ + "sha": token.Sha1, + }, + } + assert.Equal(t, wantErr, err) +} + +func accessTokensGetBySHA(t *testing.T, ctx context.Context, s *AccessTokensStore) { + // Create an access token with name "Test" + token, err := s.Create(ctx, 1, "Test") + require.NoError(t, err) + + // We should be able to get it back + _, err = s.GetBySHA1(ctx, token.Sha1) + require.NoError(t, err) + + // Try to get a non-existent token + _, err = s.GetBySHA1(ctx, "bad_sha") + wantErr := ErrAccessTokenNotExist{ + args: errx.Args{ + "sha": "bad_sha", + }, + } + assert.Equal(t, wantErr, err) +} + +func accessTokensList(t *testing.T, ctx context.Context, s *AccessTokensStore) { + // Create two access tokens for user 1 + _, err := s.Create(ctx, 1, "user1_1") + require.NoError(t, err) + _, err = s.Create(ctx, 1, "user1_2") + require.NoError(t, err) + + // Create one access token for user 2 + _, err = s.Create(ctx, 2, "user2_1") + require.NoError(t, err) + + // List all access tokens for user 1 + tokens, err := s.List(ctx, 1) + require.NoError(t, err) + require.Equal(t, 2, len(tokens), "number of tokens") + + assert.Equal(t, int64(1), tokens[0].UserID) + assert.Equal(t, "user1_1", tokens[0].Name) + + assert.Equal(t, int64(1), tokens[1].UserID) + assert.Equal(t, "user1_2", tokens[1].Name) +} + +func accessTokensTouch(t *testing.T, ctx context.Context, s *AccessTokensStore) { + // Create an access token with name "Test" + token, err := s.Create(ctx, 1, "Test") + require.NoError(t, err) + + // Updated field is zero now + assert.True(t, token.Updated.IsZero()) + + err = s.Touch(ctx, token.ID) + require.NoError(t, err) + + // Get back from DB should have Updated set + token, err = s.GetBySHA1(ctx, token.Sha1) + require.NoError(t, err) + assert.Equal(t, s.db.NowFunc().Format(time.RFC3339), token.Updated.UTC().Format(time.RFC3339)) +} diff --git a/internal/database/actions.go b/internal/database/actions.go new file mode 100644 index 00000000000..7a2c3f21749 --- /dev/null +++ b/internal/database/actions.go @@ -0,0 +1,936 @@ +package database + +import ( + "context" + "encoding/json" + "fmt" + "path" + "strconv" + "strings" + "time" + "unicode" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" + "gorm.io/gorm" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/lazyregexp" + "gogs.io/gogs/internal/repox" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" + "gogs.io/gogs/internal/strx" + "gogs.io/gogs/internal/testx" + "gogs.io/gogs/internal/tool" +) + +// ActionsStore is the storage layer for actions. +type ActionsStore struct { + db *gorm.DB +} + +func newActionsStore(db *gorm.DB) *ActionsStore { + return &ActionsStore{db: db} +} + +func (s *ActionsStore) listByOrganization(ctx context.Context, orgID, actorID, afterID int64) *gorm.DB { + /* + Equivalent SQL for PostgreSQL: + + SELECT * FROM "action" + WHERE + user_id = @userID + AND (@skipAfter OR id < @afterID) + AND repo_id IN ( + SELECT repository.id FROM "repository" + JOIN team_repo ON repository.id = team_repo.repo_id + WHERE team_repo.team_id IN ( + SELECT team_id FROM "team_user" + WHERE + team_user.org_id = @orgID AND uid = @actorID) + OR (repository.is_private = FALSE AND repository.is_unlisted = FALSE) + ) + ORDER BY id DESC + LIMIT @limit + */ + return s.db.WithContext(ctx). + Where("user_id = ?", orgID). + Where(s.db. + // Not apply when afterID is not given + Where("?", afterID <= 0). + Or("id < ?", afterID), + ). + Where("repo_id IN (?)", s.db. + Select("repository.id"). + Table("repository"). + Joins("JOIN team_repo ON repository.id = team_repo.repo_id"). + Where("team_repo.team_id IN (?)", s.db. + Select("team_id"). + Table("team_user"). + Where("team_user.org_id = ? AND uid = ?", orgID, actorID), + ). + Or("repository.is_private = ? AND repository.is_unlisted = ?", false, false), + ). + Limit(conf.UI.User.NewsFeedPagingNum). + Order("id DESC") +} + +// ListByOrganization returns actions of the organization viewable by the actor. +// Results are paginated if `afterID` is given. +func (s *ActionsStore) ListByOrganization(ctx context.Context, orgID, actorID, afterID int64) ([]*Action, error) { + actions := make([]*Action, 0, conf.UI.User.NewsFeedPagingNum) + return actions, s.listByOrganization(ctx, orgID, actorID, afterID).Find(&actions).Error +} + +func (s *ActionsStore) listByUser(ctx context.Context, userID, actorID, afterID int64, isProfile bool) *gorm.DB { + /* + Equivalent SQL for PostgreSQL: + + SELECT * FROM "action" + WHERE + user_id = @userID + AND (@skipAfter OR id < @afterID) + AND (@includePrivate OR (is_private = FALSE AND act_user_id = @actorID)) + ORDER BY id DESC + LIMIT @limit + */ + return s.db.WithContext(ctx). + Where("user_id = ?", userID). + Where(s.db. + // Not apply when afterID is not given + Where("?", afterID <= 0). + Or("id < ?", afterID), + ). + Where(s.db. + // Not apply when in not profile page or the user is viewing own profile + Where("?", !isProfile || actorID == userID). + Or("is_private = ? AND act_user_id = ?", false, userID), + ). + Limit(conf.UI.User.NewsFeedPagingNum). + Order("id DESC") +} + +// ListByUser returns actions of the user viewable by the actor. Results are +// paginated if `afterID` is given. The `isProfile` indicates whether repository +// permissions should be considered. +func (s *ActionsStore) ListByUser(ctx context.Context, userID, actorID, afterID int64, isProfile bool) ([]*Action, error) { + actions := make([]*Action, 0, conf.UI.User.NewsFeedPagingNum) + return actions, s.listByUser(ctx, userID, actorID, afterID, isProfile).Find(&actions).Error +} + +// notifyWatchers creates rows in action table for watchers who are able to see the action. +func (s *ActionsStore) notifyWatchers(ctx context.Context, act *Action) error { + watches, err := newReposStore(s.db).ListWatches(ctx, act.RepoID) + if err != nil { + return errors.Wrap(err, "list watches") + } + + // Clone returns a deep copy of the action with UserID assigned + clone := func(userID int64) *Action { + tmp := *act + tmp.UserID = userID + return &tmp + } + + // Plus one for the actor + actions := make([]*Action, 0, len(watches)+1) + actions = append(actions, clone(act.ActUserID)) + + for _, watch := range watches { + if act.ActUserID == watch.UserID { + continue + } + actions = append(actions, clone(watch.UserID)) + } + + return s.db.Create(actions).Error +} + +// NewRepo creates an action for creating a new repository. The action type +// could be ActionCreateRepo or ActionForkRepo based on whether the repository +// is a fork. +func (s *ActionsStore) NewRepo(ctx context.Context, doer, owner *User, repo *Repository) error { + opType := ActionCreateRepo + if repo.IsFork { + opType = ActionForkRepo + } + + return s.notifyWatchers(ctx, + &Action{ + ActUserID: doer.ID, + ActUserName: doer.Name, + OpType: opType, + RepoID: repo.ID, + RepoUserName: owner.Name, + RepoName: repo.Name, + IsPrivate: repo.IsPrivate || repo.IsUnlisted, + }, + ) +} + +// RenameRepo creates an action for renaming a repository. +func (s *ActionsStore) RenameRepo(ctx context.Context, doer, owner *User, oldRepoName string, repo *Repository) error { + return s.notifyWatchers(ctx, + &Action{ + ActUserID: doer.ID, + ActUserName: doer.Name, + OpType: ActionRenameRepo, + RepoID: repo.ID, + RepoUserName: owner.Name, + RepoName: repo.Name, + IsPrivate: repo.IsPrivate || repo.IsUnlisted, + Content: oldRepoName, + }, + ) +} + +func (s *ActionsStore) mirrorSyncAction(ctx context.Context, opType ActionType, owner *User, repo *Repository, refName string, content []byte) error { + return s.notifyWatchers(ctx, + &Action{ + ActUserID: owner.ID, + ActUserName: owner.Name, + OpType: opType, + Content: string(content), + RepoID: repo.ID, + RepoUserName: owner.Name, + RepoName: repo.Name, + RefName: refName, + IsPrivate: repo.IsPrivate || repo.IsUnlisted, + }, + ) +} + +type MirrorSyncPushOptions struct { + Owner *User + Repo *Repository + RefName string + OldCommitID string + NewCommitID string + Commits *PushCommits +} + +// MirrorSyncPush creates an action for mirror synchronization of pushed +// commits. +func (s *ActionsStore) MirrorSyncPush(ctx context.Context, opts MirrorSyncPushOptions) error { + if conf.UI.FeedMaxCommitNum > 0 && len(opts.Commits.Commits) > conf.UI.FeedMaxCommitNum { + opts.Commits.Commits = opts.Commits.Commits[:conf.UI.FeedMaxCommitNum] + } + + apiCommits, err := opts.Commits.APIFormat(ctx, + newUsersStore(s.db), + repox.RepositoryPath(opts.Owner.Name, opts.Repo.Name), + repox.HTMLURL(opts.Owner.Name, opts.Repo.Name), + ) + if err != nil { + return errors.Wrap(err, "convert commits to API format") + } + + opts.Commits.CompareURL = repox.CompareCommitsPath(opts.Owner.Name, opts.Repo.Name, opts.OldCommitID, opts.NewCommitID) + apiPusher := opts.Owner.APIFormat() + err = PrepareWebhooks( + opts.Repo, + HookEventTypePush, + &apiv1types.WebhookPushPayload{ + Ref: opts.RefName, + Before: opts.OldCommitID, + After: opts.NewCommitID, + CompareURL: conf.Server.ExternalURL + opts.Commits.CompareURL, + Commits: apiCommits, + Repo: opts.Repo.APIFormat(opts.Owner), + Pusher: apiPusher, + Sender: apiPusher, + }, + ) + if err != nil { + return errors.Wrap(err, "prepare webhooks") + } + + data, err := json.Marshal(opts.Commits) + if err != nil { + return errors.Wrap(err, "marshal JSON") + } + + return s.mirrorSyncAction(ctx, ActionMirrorSyncPush, opts.Owner, opts.Repo, opts.RefName, data) +} + +// MirrorSyncCreate creates an action for mirror synchronization of a new +// reference. +func (s *ActionsStore) MirrorSyncCreate(ctx context.Context, owner *User, repo *Repository, refName string) error { + return s.mirrorSyncAction(ctx, ActionMirrorSyncCreate, owner, repo, refName, nil) +} + +// MirrorSyncDelete creates an action for mirror synchronization of a reference +// deletion. +func (s *ActionsStore) MirrorSyncDelete(ctx context.Context, owner *User, repo *Repository, refName string) error { + return s.mirrorSyncAction(ctx, ActionMirrorSyncDelete, owner, repo, refName, nil) +} + +// MergePullRequest creates an action for merging a pull request. +func (s *ActionsStore) MergePullRequest(ctx context.Context, doer, owner *User, repo *Repository, pull *Issue) error { + return s.notifyWatchers(ctx, + &Action{ + ActUserID: doer.ID, + ActUserName: doer.Name, + OpType: ActionMergePullRequest, + Content: fmt.Sprintf("%d|%s", pull.Index, pull.Title), + RepoID: repo.ID, + RepoUserName: owner.Name, + RepoName: repo.Name, + IsPrivate: repo.IsPrivate || repo.IsUnlisted, + }, + ) +} + +// TransferRepo creates an action for transferring a repository to a new owner. +func (s *ActionsStore) TransferRepo(ctx context.Context, doer, oldOwner, newOwner *User, repo *Repository) error { + return s.notifyWatchers(ctx, + &Action{ + ActUserID: doer.ID, + ActUserName: doer.Name, + OpType: ActionTransferRepo, + RepoID: repo.ID, + RepoUserName: newOwner.Name, + RepoName: repo.Name, + IsPrivate: repo.IsPrivate || repo.IsUnlisted, + Content: oldOwner.Name + "/" + repo.Name, + }, + ) +} + +var ( + // Same as GitHub, see https://docs.github.com/en/free-pro-team@latest/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue + issueCloseKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} + issueReopenKeywords = []string{"reopen", "reopens", "reopened"} + + issueCloseKeywordsPattern = lazyregexp.New(assembleKeywordsPattern(issueCloseKeywords)) + issueReopenKeywordsPattern = lazyregexp.New(assembleKeywordsPattern(issueReopenKeywords)) + issueReferencePattern = lazyregexp.New(`(?i)(?:)(^| )\S*#\d+`) +) + +func assembleKeywordsPattern(words []string) string { + return fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(words, "|")) +} + +// updateCommitReferencesToIssues checks if issues are manipulated by commit message. +func updateCommitReferencesToIssues(doer *User, repo *Repository, commits []*PushCommit) error { + trimRightNonDigits := func(c rune) bool { + return !unicode.IsDigit(c) + } + + // Commits are appended in the reverse order. + for i := len(commits) - 1; i >= 0; i-- { + c := commits[i] + + refMarked := make(map[int64]bool) + for _, ref := range issueReferencePattern.FindAllString(c.Message, -1) { + ref = strings.TrimSpace(ref) + ref = strings.TrimRightFunc(ref, trimRightNonDigits) + + if ref == "" { + continue + } + + // Add repo name if missing + if ref[0] == '#' { + ref = fmt.Sprintf("%s%s", repo.FullName(), ref) + } else if !strings.Contains(ref, "/") { + // FIXME: We don't support User#ID syntax yet + continue + } + + issue, err := GetIssueByRef(ref) + if err != nil { + if IsErrIssueNotExist(err) { + continue + } + return err + } + + if refMarked[issue.ID] { + continue + } + refMarked[issue.ID] = true + + msgLines := strings.Split(c.Message, "\n") + shortMsg := msgLines[0] + if len(msgLines) > 2 { + shortMsg += "..." + } + message := fmt.Sprintf(`%s`, repo.Link(), c.Sha1, shortMsg) + if err = CreateRefComment(doer, repo, issue, message, c.Sha1); err != nil { + return err + } + } + + refMarked = make(map[int64]bool) + // FIXME: Can merge this and the next for loop to a common function. + for _, ref := range issueCloseKeywordsPattern.FindAllString(c.Message, -1) { + ref = ref[strings.IndexByte(ref, byte(' '))+1:] + ref = strings.TrimRightFunc(ref, trimRightNonDigits) + + if ref == "" { + continue + } + + // Add repo name if missing + if ref[0] == '#' { + ref = fmt.Sprintf("%s%s", repo.FullName(), ref) + } else if !strings.Contains(ref, "/") { + // FIXME: We don't support User#ID syntax yet + continue + } + + issue, err := GetIssueByRef(ref) + if err != nil { + if IsErrIssueNotExist(err) { + continue + } + return err + } + + if refMarked[issue.ID] { + continue + } + refMarked[issue.ID] = true + + if issue.RepoID != repo.ID || issue.IsClosed { + continue + } + + if err = issue.ChangeStatus(doer, repo, true); err != nil { + return err + } + } + + // It is conflict to have close and reopen at same time, so refsMarkd doesn't need to reinit here. + for _, ref := range issueReopenKeywordsPattern.FindAllString(c.Message, -1) { + ref = ref[strings.IndexByte(ref, byte(' '))+1:] + ref = strings.TrimRightFunc(ref, trimRightNonDigits) + + if ref == "" { + continue + } + + // Add repo name if missing + if ref[0] == '#' { + ref = fmt.Sprintf("%s%s", repo.FullName(), ref) + } else if !strings.Contains(ref, "/") { + // We don't support User#ID syntax yet + // return ErrNotImplemented + continue + } + + issue, err := GetIssueByRef(ref) + if err != nil { + if IsErrIssueNotExist(err) { + continue + } + return err + } + + if refMarked[issue.ID] { + continue + } + refMarked[issue.ID] = true + + if issue.RepoID != repo.ID || !issue.IsClosed { + continue + } + + if err = issue.ChangeStatus(doer, repo, false); err != nil { + return err + } + } + } + return nil +} + +type CommitRepoOptions struct { + Owner *User + Repo *Repository + PusherName string + RefFullName string + OldCommitID string + NewCommitID string + Commits *PushCommits +} + +// CommitRepo creates actions for pushing commits to the repository. An action +// with the type ActionDeleteBranch is created if the push deletes a branch; an +// action with the type ActionCommitRepo is created for a regular push. If the +// regular push also creates a new branch, then another action with type +// ActionCreateBranch is created. +func (s *ActionsStore) CommitRepo(ctx context.Context, opts CommitRepoOptions) error { + err := newReposStore(s.db).Touch(ctx, opts.Repo.ID) + if err != nil { + return errors.Wrap(err, "touch repository") + } + + pusher, err := newUsersStore(s.db).GetByUsername(ctx, opts.PusherName) + if err != nil { + return errors.Wrapf(err, "get pusher [name: %s]", opts.PusherName) + } + + isNewRef := opts.OldCommitID == git.EmptyID + isDelRef := opts.NewCommitID == git.EmptyID + + // If not the first commit, set the compare URL. + if !isNewRef && !isDelRef { + opts.Commits.CompareURL = repox.CompareCommitsPath(opts.Owner.Name, opts.Repo.Name, opts.OldCommitID, opts.NewCommitID) + } + + refName := git.RefShortName(opts.RefFullName) + action := &Action{ + ActUserID: pusher.ID, + ActUserName: pusher.Name, + RepoID: opts.Repo.ID, + RepoUserName: opts.Owner.Name, + RepoName: opts.Repo.Name, + RefName: refName, + IsPrivate: opts.Repo.IsPrivate || opts.Repo.IsUnlisted, + } + + apiRepo := opts.Repo.APIFormat(opts.Owner) + apiPusher := pusher.APIFormat() + if isDelRef { + err = PrepareWebhooks( + opts.Repo, + HookEventTypeDelete, + &apiv1types.WebhookDeletePayload{ + Ref: refName, + RefType: "branch", + PusherType: apiv1types.WebhookPusherTypeUser, + Repo: apiRepo, + Sender: apiPusher, + }, + ) + if err != nil { + return errors.Wrap(err, "prepare webhooks for delete branch") + } + + action.OpType = ActionDeleteBranch + err = s.notifyWatchers(ctx, action) + if err != nil { + return errors.Wrap(err, "notify watchers") + } + + // Delete branch doesn't have anything to push or compare + return nil + } + + // Only update issues via commits when internal issue tracker is enabled + if opts.Repo.EnableIssues && !opts.Repo.EnableExternalTracker { + if err = updateCommitReferencesToIssues(pusher, opts.Repo, opts.Commits.Commits); err != nil { + log.Error("update commit references to issues: %v", err) + } + } + + if conf.UI.FeedMaxCommitNum > 0 && len(opts.Commits.Commits) > conf.UI.FeedMaxCommitNum { + opts.Commits.Commits = opts.Commits.Commits[:conf.UI.FeedMaxCommitNum] + } + + data, err := json.Marshal(opts.Commits) + if err != nil { + return errors.Wrap(err, "marshal JSON") + } + action.Content = string(data) + + var compareURL string + if isNewRef { + err = PrepareWebhooks( + opts.Repo, + HookEventTypeCreate, + &apiv1types.WebhookCreatePayload{ + Ref: refName, + RefType: "branch", + DefaultBranch: opts.Repo.DefaultBranch, + Repo: apiRepo, + Sender: apiPusher, + }, + ) + if err != nil { + return errors.Wrap(err, "prepare webhooks for new branch") + } + + action.OpType = ActionCreateBranch + err = s.notifyWatchers(ctx, action) + if err != nil { + return errors.Wrap(err, "notify watchers") + } + } else { + compareURL = conf.Server.ExternalURL + opts.Commits.CompareURL + } + + commits, err := opts.Commits.APIFormat(ctx, + newUsersStore(s.db), + repox.RepositoryPath(opts.Owner.Name, opts.Repo.Name), + repox.HTMLURL(opts.Owner.Name, opts.Repo.Name), + ) + if err != nil { + return errors.Wrap(err, "convert commits to API format") + } + + err = PrepareWebhooks( + opts.Repo, + HookEventTypePush, + &apiv1types.WebhookPushPayload{ + Ref: opts.RefFullName, + Before: opts.OldCommitID, + After: opts.NewCommitID, + CompareURL: compareURL, + Commits: commits, + Repo: apiRepo, + Pusher: apiPusher, + Sender: apiPusher, + }, + ) + if err != nil { + return errors.Wrap(err, "prepare webhooks for new commit") + } + + action.OpType = ActionCommitRepo + err = s.notifyWatchers(ctx, action) + if err != nil { + return errors.Wrap(err, "notify watchers") + } + return nil +} + +type PushTagOptions struct { + Owner *User + Repo *Repository + PusherName string + RefFullName string + NewCommitID string +} + +// PushTag creates an action for pushing tags to the repository. An action with +// the type ActionDeleteTag is created if the push deletes a tag. Otherwise, an +// action with the type ActionPushTag is created for a regular push. +func (s *ActionsStore) PushTag(ctx context.Context, opts PushTagOptions) error { + err := newReposStore(s.db).Touch(ctx, opts.Repo.ID) + if err != nil { + return errors.Wrap(err, "touch repository") + } + + pusher, err := newUsersStore(s.db).GetByUsername(ctx, opts.PusherName) + if err != nil { + return errors.Wrapf(err, "get pusher [name: %s]", opts.PusherName) + } + + refName := git.RefShortName(opts.RefFullName) + action := &Action{ + ActUserID: pusher.ID, + ActUserName: pusher.Name, + RepoID: opts.Repo.ID, + RepoUserName: opts.Owner.Name, + RepoName: opts.Repo.Name, + RefName: refName, + IsPrivate: opts.Repo.IsPrivate || opts.Repo.IsUnlisted, + } + + apiRepo := opts.Repo.APIFormat(opts.Owner) + apiPusher := pusher.APIFormat() + if opts.NewCommitID == git.EmptyID { + err = PrepareWebhooks( + opts.Repo, + HookEventTypeDelete, + &apiv1types.WebhookDeletePayload{ + Ref: refName, + RefType: "tag", + PusherType: apiv1types.WebhookPusherTypeUser, + Repo: apiRepo, + Sender: apiPusher, + }, + ) + if err != nil { + return errors.Wrap(err, "prepare webhooks for delete tag") + } + + action.OpType = ActionDeleteTag + err = s.notifyWatchers(ctx, action) + if err != nil { + return errors.Wrap(err, "notify watchers") + } + return nil + } + + err = PrepareWebhooks( + opts.Repo, + HookEventTypeCreate, + &apiv1types.WebhookCreatePayload{ + Ref: refName, + RefType: "tag", + Sha: opts.NewCommitID, + DefaultBranch: opts.Repo.DefaultBranch, + Repo: apiRepo, + Sender: apiPusher, + }, + ) + if err != nil { + return errors.Wrapf(err, "prepare webhooks for new tag") + } + + action.OpType = ActionPushTag + err = s.notifyWatchers(ctx, action) + if err != nil { + return errors.Wrap(err, "notify watchers") + } + return nil +} + +// ActionType is the type of action. +type ActionType int + +// ⚠️ WARNING: Only append to the end of list to maintain backward compatibility. +const ( + ActionCreateRepo ActionType = iota + 1 // 1 + ActionRenameRepo // 2 + ActionStarRepo // 3 + ActionWatchRepo // 4 + ActionCommitRepo // 5 + ActionCreateIssue // 6 + ActionCreatePullRequest // 7 + ActionTransferRepo // 8 + ActionPushTag // 9 + ActionCommentIssue // 10 + ActionMergePullRequest // 11 + ActionCloseIssue // 12 + ActionReopenIssue // 13 + ActionClosePullRequest // 14 + ActionReopenPullRequest // 15 + ActionCreateBranch // 16 + ActionDeleteBranch // 17 + ActionDeleteTag // 18 + ActionForkRepo // 19 + ActionMirrorSyncPush // 20 + ActionMirrorSyncCreate // 21 + ActionMirrorSyncDelete // 22 +) + +// Action is a user operation to a repository. It implements template.Actioner +// interface to be able to use it in template rendering. +type Action struct { + ID int64 `gorm:"primaryKey"` + UserID int64 `gorm:"index"` // Receiver user ID + OpType ActionType + ActUserID int64 // Doer user ID + ActUserName string // Doer user name + ActAvatar string `xorm:"-" gorm:"-" json:"-"` + RepoID int64 `xorm:"INDEX" gorm:"index"` + RepoUserName string + RepoName string + RefName string + IsPrivate bool `xorm:"NOT NULL DEFAULT false" gorm:"not null;default:FALSE"` + Content string `xorm:"TEXT"` + + Created time.Time `xorm:"-" gorm:"-" json:"-"` + CreatedUnix int64 +} + +// BeforeCreate implements the GORM create hook. +func (a *Action) BeforeCreate(tx *gorm.DB) error { + if a.CreatedUnix <= 0 { + a.CreatedUnix = tx.NowFunc().Unix() + } + return nil +} + +// AfterFind implements the GORM query hook. +func (a *Action) AfterFind(_ *gorm.DB) error { + a.Created = time.Unix(a.CreatedUnix, 0).Local() + return nil +} + +func (a *Action) GetOpType() int { + return int(a.OpType) +} + +func (a *Action) GetActUserName() string { + return a.ActUserName +} + +func (a *Action) ShortActUserName() string { + return strx.Ellipsis(a.ActUserName, 20) +} + +func (a *Action) GetRepoUserName() string { + return a.RepoUserName +} + +func (a *Action) ShortRepoUserName() string { + return strx.Ellipsis(a.RepoUserName, 20) +} + +func (a *Action) GetRepoName() string { + return a.RepoName +} + +func (a *Action) ShortRepoName() string { + return strx.Ellipsis(a.RepoName, 33) +} + +func (a *Action) GetRepoPath() string { + return path.Join(a.RepoUserName, a.RepoName) +} + +func (a *Action) ShortRepoPath() string { + return path.Join(a.ShortRepoUserName(), a.ShortRepoName()) +} + +func (a *Action) GetRepoLink() string { + if conf.Server.Subpath != "" { + return path.Join(conf.Server.Subpath, a.GetRepoPath()) + } + return "/" + a.GetRepoPath() +} + +func (a *Action) GetBranch() string { + return a.RefName +} + +func (a *Action) GetContent() string { + return a.Content +} + +func (a *Action) GetCreate() time.Time { + return a.Created +} + +func (a *Action) GetIssueInfos() []string { + return strings.SplitN(a.Content, "|", 2) +} + +func (a *Action) GetIssueTitle() string { + index, _ := strconv.ParseInt(a.GetIssueInfos()[0], 10, 64) + issue, err := GetIssueByIndex(a.RepoID, index) + if err != nil { + log.Error("Failed to get issue title [repo_id: %d, index: %d]: %v", a.RepoID, index, err) + return "error getting issue" + } + return issue.Title +} + +func (a *Action) GetIssueContent() string { + index, _ := strconv.ParseInt(a.GetIssueInfos()[0], 10, 64) + issue, err := GetIssueByIndex(a.RepoID, index) + if err != nil { + log.Error("Failed to get issue content [repo_id: %d, index: %d]: %v", a.RepoID, index, err) + return "error getting issue" + } + return issue.Content +} + +// PushCommit contains information of a pushed commit. +type PushCommit struct { + Sha1 string + Message string + AuthorEmail string + AuthorName string + CommitterEmail string + CommitterName string + Timestamp time.Time +} + +// PushCommits is a list of pushed commits. +type PushCommits struct { + Len int + Commits []*PushCommit + CompareURL string + + avatars map[string]string +} + +// NewPushCommits returns a new PushCommits. +func NewPushCommits() *PushCommits { + return &PushCommits{ + avatars: make(map[string]string), + } +} + +func (pcs *PushCommits) APIFormat(ctx context.Context, usersStore *UsersStore, repoPath, repoURL string) ([]*apiv1types.WebhookPayloadCommit, error) { + // NOTE: We cache query results in case there are many commits in a single push. + usernameByEmail := make(map[string]string) + getUsernameByEmail := func(email string) (string, error) { + username, ok := usernameByEmail[email] + if ok { + return username, nil + } + + user, err := usersStore.GetByEmail(ctx, email) + if err != nil { + if IsErrUserNotExist(err) { + usernameByEmail[email] = "" + return "", nil + } + return "", err + } + + usernameByEmail[email] = user.Name + return user.Name, nil + } + + commits := make([]*apiv1types.WebhookPayloadCommit, len(pcs.Commits)) + for i, commit := range pcs.Commits { + authorUsername, err := getUsernameByEmail(commit.AuthorEmail) + if err != nil { + return nil, errors.Wrap(err, "get author username") + } + + committerUsername, err := getUsernameByEmail(commit.CommitterEmail) + if err != nil { + return nil, errors.Wrap(err, "get committer username") + } + + nameStatus := &git.NameStatus{} + if !testx.InTest { + nameStatus, err = git.ShowNameStatus(repoPath, commit.Sha1) + if err != nil { + return nil, errors.Wrapf(err, "show name status [commit_sha1: %s]", commit.Sha1) + } + } + + commits[i] = &apiv1types.WebhookPayloadCommit{ + ID: commit.Sha1, + Message: commit.Message, + URL: fmt.Sprintf("%s/commit/%s", repoURL, commit.Sha1), + Author: &apiv1types.WebhookPayloadUser{ + Name: commit.AuthorName, + Email: commit.AuthorEmail, + UserName: authorUsername, + }, + Committer: &apiv1types.WebhookPayloadUser{ + Name: commit.CommitterName, + Email: commit.CommitterEmail, + UserName: committerUsername, + }, + Added: nameStatus.Added, + Removed: nameStatus.Removed, + Modified: nameStatus.Modified, + Timestamp: commit.Timestamp, + } + } + return commits, nil +} + +// AvatarLink tries to match user in database with email in order to show custom +// avatars, and falls back to general avatar link. +// +// FIXME: This method does not belong to PushCommits, should be a pure template +// function. +func (pcs *PushCommits) AvatarLink(email string) string { + _, ok := pcs.avatars[email] + if !ok { + u, err := Handle.Users().GetByEmail(context.Background(), email) + if err != nil { + pcs.avatars[email] = tool.AvatarLink(email) + if !IsErrUserNotExist(err) { + log.Error("Failed to get user [email: %s]: %v", email, err) + } + } else { + pcs.avatars[email] = u.AvatarURLPath() + } + } + + return pcs.avatars[email] +} diff --git a/internal/database/actions_test.go b/internal/database/actions_test.go new file mode 100644 index 00000000000..e5b16f78343 --- /dev/null +++ b/internal/database/actions_test.go @@ -0,0 +1,924 @@ +package database + +import ( + "context" + "os" + "testing" + "time" + + "github.com/gogs/git-module" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gorm.io/gorm" + + "gogs.io/gogs/internal/conf" +) + +func TestIssueReferencePattern(t *testing.T) { + tests := []struct { + name string + message string + want []string + }{ + { + name: "no match", + message: "Hello world!", + want: nil, + }, + { + name: "contains issue numbers", + message: "#123 is fixed, and #456 is WIP", + want: []string{"#123", " #456"}, + }, + { + name: "contains full issue references", + message: "#123 is fixed, and user/repo#456 is WIP", + want: []string{"#123", " user/repo#456"}, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := issueReferencePattern.FindAllString(test.message, -1) + assert.Equal(t, test.want, got) + }) + } +} + +func TestAction_BeforeCreate(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + t.Run("CreatedUnix has been set", func(t *testing.T) { + action := &Action{ + CreatedUnix: 1, + } + _ = action.BeforeCreate(db) + assert.Equal(t, int64(1), action.CreatedUnix) + }) + + t.Run("CreatedUnix has not been set", func(t *testing.T) { + action := &Action{} + _ = action.BeforeCreate(db) + assert.Equal(t, db.NowFunc().Unix(), action.CreatedUnix) + }) +} + +func TestAction_AfterFind(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + action := &Action{ + CreatedUnix: now.Unix(), + } + _ = action.AfterFind(db) + assert.Equal(t, action.CreatedUnix, action.Created.Unix()) +} + +func TestActions(t *testing.T) { + if testing.Short() { + t.Skip() + } + + ctx := context.Background() + t.Parallel() + s := &ActionsStore{ + db: newTestDB(t, "ActionsStore"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *ActionsStore) + }{ + {"CommitRepo", actionsCommitRepo}, + {"ListByOrganization", actionsListByOrganization}, + {"ListByUser", actionsListByUser}, + {"MergePullRequest", actionsMergePullRequest}, + {"MirrorSyncCreate", actionsMirrorSyncCreate}, + {"MirrorSyncDelete", actionsMirrorSyncDelete}, + {"MirrorSyncPush", actionsMirrorSyncPush}, + {"NewRepo", actionsNewRepo}, + {"PushTag", actionsPushTag}, + {"RenameRepo", actionsRenameRepo}, + {"TransferRepo", actionsTransferRepo}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func actionsCommitRepo(t *testing.T, ctx context.Context, s *ActionsStore) { + alice, err := newUsersStore(s.db).Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + repo, err := newReposStore(s.db).Create(ctx, + alice.ID, + CreateRepoOptions{ + Name: "example", + }, + ) + require.NoError(t, err) + + now := time.Unix(1588568886, 0).UTC() + + conf.SetMockSSH(t, conf.SSHOpts{}) + conf.SetMockUI(t, conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }) + + t.Run("new commit", func(t *testing.T) { + t.Cleanup(func() { + err := s.db.Session(&gorm.Session{AllowGlobalUpdate: true}).WithContext(ctx).Delete(new(Action)).Error + require.NoError(t, err) + }) + + err = s.CommitRepo(ctx, + CommitRepoOptions{ + PusherName: alice.Name, + Owner: alice, + Repo: repo, + RefFullName: "refs/heads/main", + OldCommitID: "ca82a6dff817ec66f44342007202690a93763949", + NewCommitID: "085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7", + Commits: CommitsToPushCommits( + []*git.Commit{ + { + ID: git.MustIDFromString("085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7"), + Author: &git.Signature{ + Name: "alice", + Email: "alice@example.com", + When: now, + }, + Committer: &git.Signature{ + Name: "alice", + Email: "alice@example.com", + When: now, + }, + Message: "A random commit", + }, + }, + ), + }, + ) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionCommitRepo, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + RefName: "main", + IsPrivate: false, + Content: `{"Len":1,"Commits":[{"Sha1":"085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7","Message":"A random commit","AuthorEmail":"alice@example.com","AuthorName":"alice","CommitterEmail":"alice@example.com","CommitterName":"alice","Timestamp":"2020-05-04T05:08:06Z"}],"CompareURL":"alice/example/compare/ca82a6dff817ec66f44342007202690a93763949...085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7"}`, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) + }) + + t.Run("new ref", func(t *testing.T) { + t.Cleanup(func() { + err := s.db.Session(&gorm.Session{AllowGlobalUpdate: true}).WithContext(ctx).Delete(new(Action)).Error + require.NoError(t, err) + }) + + err = s.CommitRepo(ctx, + CommitRepoOptions{ + PusherName: alice.Name, + Owner: alice, + Repo: repo, + RefFullName: "refs/heads/main", + OldCommitID: git.EmptyID, + NewCommitID: "085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7", + Commits: CommitsToPushCommits( + []*git.Commit{ + { + ID: git.MustIDFromString("085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7"), + Author: &git.Signature{ + Name: "alice", + Email: "alice@example.com", + When: now, + }, + Committer: &git.Signature{ + Name: "alice", + Email: "alice@example.com", + When: now, + }, + Message: "A random commit", + }, + }, + ), + }, + ) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 2) + got[0].ID = 0 + got[1].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionCommitRepo, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + RefName: "main", + IsPrivate: false, + Content: `{"Len":1,"Commits":[{"Sha1":"085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7","Message":"A random commit","AuthorEmail":"alice@example.com","AuthorName":"alice","CommitterEmail":"alice@example.com","CommitterName":"alice","Timestamp":"2020-05-04T05:08:06Z"}],"CompareURL":""}`, + CreatedUnix: s.db.NowFunc().Unix(), + }, + { + UserID: alice.ID, + OpType: ActionCreateBranch, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + RefName: "main", + IsPrivate: false, + Content: `{"Len":1,"Commits":[{"Sha1":"085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7","Message":"A random commit","AuthorEmail":"alice@example.com","AuthorName":"alice","CommitterEmail":"alice@example.com","CommitterName":"alice","Timestamp":"2020-05-04T05:08:06Z"}],"CompareURL":""}`, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + want[1].Created = time.Unix(want[1].CreatedUnix, 0) + assert.Equal(t, want, got) + }) + + t.Run("delete ref", func(t *testing.T) { + t.Cleanup(func() { + err := s.db.Session(&gorm.Session{AllowGlobalUpdate: true}).WithContext(ctx).Delete(new(Action)).Error + require.NoError(t, err) + }) + + err = s.CommitRepo(ctx, + CommitRepoOptions{ + PusherName: alice.Name, + Owner: alice, + Repo: repo, + RefFullName: "refs/heads/main", + OldCommitID: "ca82a6dff817ec66f44342007202690a93763949", + NewCommitID: git.EmptyID, + }, + ) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionDeleteBranch, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + RefName: "main", + IsPrivate: false, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) + }) +} + +func actionsListByOrganization(t *testing.T, ctx context.Context, s *ActionsStore) { + if os.Getenv("GOGS_DATABASE_TYPE") != "postgres" { + t.Skip("Skipping testing with not using PostgreSQL") + return + } + + conf.SetMockUI(t, + conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }, + ) + + tests := []struct { + name string + orgID int64 + actorID int64 + afterID int64 + want string + }{ + { + name: "no afterID", + orgID: 1, + actorID: 1, + afterID: 0, + want: `SELECT * FROM "action" WHERE user_id = 1 AND (true OR id < 0) AND repo_id IN (SELECT repository.id FROM "repository" JOIN team_repo ON repository.id = team_repo.repo_id WHERE team_repo.team_id IN (SELECT team_id FROM "team_user" WHERE team_user.org_id = 1 AND uid = 1) OR (repository.is_private = false AND repository.is_unlisted = false)) ORDER BY id DESC LIMIT 20`, + }, + { + name: "has afterID", + orgID: 1, + actorID: 1, + afterID: 5, + want: `SELECT * FROM "action" WHERE user_id = 1 AND (false OR id < 5) AND repo_id IN (SELECT repository.id FROM "repository" JOIN team_repo ON repository.id = team_repo.repo_id WHERE team_repo.team_id IN (SELECT team_id FROM "team_user" WHERE team_user.org_id = 1 AND uid = 1) OR (repository.is_private = false AND repository.is_unlisted = false)) ORDER BY id DESC LIMIT 20`, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := s.db.ToSQL(func(tx *gorm.DB) *gorm.DB { + return newActionsStore(tx).listByOrganization(ctx, test.orgID, test.actorID, test.afterID).Find(new(Action)) + }) + assert.Equal(t, test.want, got) + }) + } +} + +func actionsListByUser(t *testing.T, ctx context.Context, s *ActionsStore) { + if os.Getenv("GOGS_DATABASE_TYPE") != "postgres" { + t.Skip("Skipping testing with not using PostgreSQL") + return + } + + conf.SetMockUI(t, + conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }, + ) + + tests := []struct { + name string + userID int64 + actorID int64 + afterID int64 + isProfile bool + want string + }{ + { + name: "same user no afterID not in profile", + userID: 1, + actorID: 1, + afterID: 0, + isProfile: false, + want: `SELECT * FROM "action" WHERE user_id = 1 AND (true OR id < 0) AND (true OR (is_private = false AND act_user_id = 1)) ORDER BY id DESC LIMIT 20`, + }, + { + name: "same user no afterID in profile", + userID: 1, + actorID: 1, + afterID: 0, + isProfile: true, + want: `SELECT * FROM "action" WHERE user_id = 1 AND (true OR id < 0) AND (true OR (is_private = false AND act_user_id = 1)) ORDER BY id DESC LIMIT 20`, + }, + { + name: "same user has afterID not in profile", + userID: 1, + actorID: 1, + afterID: 5, + isProfile: false, + want: `SELECT * FROM "action" WHERE user_id = 1 AND (false OR id < 5) AND (true OR (is_private = false AND act_user_id = 1)) ORDER BY id DESC LIMIT 20`, + }, + { + name: "different user no afterID in profile", + userID: 1, + actorID: 2, + afterID: 0, + isProfile: true, + want: `SELECT * FROM "action" WHERE user_id = 1 AND (true OR id < 0) AND (false OR (is_private = false AND act_user_id = 1)) ORDER BY id DESC LIMIT 20`, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := s.db.ToSQL(func(tx *gorm.DB) *gorm.DB { + return newActionsStore(tx).listByUser(ctx, test.userID, test.actorID, test.afterID, test.isProfile).Find(new(Action)) + }) + assert.Equal(t, test.want, got) + }) + } +} + +func actionsMergePullRequest(t *testing.T, ctx context.Context, s *ActionsStore) { + conf.SetMockUI(t, conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }) + + alice, err := newUsersStore(s.db).Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + repo, err := newReposStore(s.db).Create(ctx, + alice.ID, + CreateRepoOptions{ + Name: "example", + }, + ) + require.NoError(t, err) + + err = s.MergePullRequest(ctx, + alice, + alice, + repo, + &Issue{ + Index: 1, + Title: "Fix issue 1", + }, + ) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionMergePullRequest, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + IsPrivate: false, + Content: `1|Fix issue 1`, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) +} + +func actionsMirrorSyncCreate(t *testing.T, ctx context.Context, s *ActionsStore) { + conf.SetMockUI(t, conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }) + + alice, err := newUsersStore(s.db).Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + repo, err := newReposStore(s.db).Create(ctx, + alice.ID, + CreateRepoOptions{ + Name: "example", + }, + ) + require.NoError(t, err) + + err = s.MirrorSyncCreate(ctx, + alice, + repo, + "main", + ) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionMirrorSyncCreate, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + RefName: "main", + IsPrivate: false, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) +} + +func actionsMirrorSyncDelete(t *testing.T, ctx context.Context, s *ActionsStore) { + conf.SetMockUI(t, conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }) + + alice, err := newUsersStore(s.db).Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + repo, err := newReposStore(s.db).Create(ctx, + alice.ID, + CreateRepoOptions{ + Name: "example", + }, + ) + require.NoError(t, err) + + err = s.MirrorSyncDelete(ctx, + alice, + repo, + "main", + ) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionMirrorSyncDelete, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + RefName: "main", + IsPrivate: false, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) +} + +func actionsMirrorSyncPush(t *testing.T, ctx context.Context, s *ActionsStore) { + conf.SetMockUI(t, conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }) + + alice, err := newUsersStore(s.db).Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + repo, err := newReposStore(s.db).Create(ctx, + alice.ID, + CreateRepoOptions{ + Name: "example", + }, + ) + require.NoError(t, err) + + now := time.Unix(1588568886, 0).UTC() + err = s.MirrorSyncPush(ctx, + MirrorSyncPushOptions{ + Owner: alice, + Repo: repo, + RefName: "main", + OldCommitID: "ca82a6dff817ec66f44342007202690a93763949", + NewCommitID: "085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7", + Commits: CommitsToPushCommits( + []*git.Commit{ + { + ID: git.MustIDFromString("085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7"), + Author: &git.Signature{ + Name: "alice", + Email: "alice@example.com", + When: now, + }, + Committer: &git.Signature{ + Name: "alice", + Email: "alice@example.com", + When: now, + }, + Message: "A random commit", + }, + }, + ), + }, + ) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionMirrorSyncPush, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + RefName: "main", + IsPrivate: false, + Content: `{"Len":1,"Commits":[{"Sha1":"085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7","Message":"A random commit","AuthorEmail":"alice@example.com","AuthorName":"alice","CommitterEmail":"alice@example.com","CommitterName":"alice","Timestamp":"2020-05-04T05:08:06Z"}],"CompareURL":"alice/example/compare/ca82a6dff817ec66f44342007202690a93763949...085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7"}`, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) +} + +func actionsNewRepo(t *testing.T, ctx context.Context, s *ActionsStore) { + conf.SetMockUI(t, conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }) + + alice, err := newUsersStore(s.db).Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + repo, err := newReposStore(s.db).Create(ctx, + alice.ID, + CreateRepoOptions{ + Name: "example", + }, + ) + require.NoError(t, err) + + t.Run("new repo", func(t *testing.T) { + t.Cleanup(func() { + err := s.db.Session(&gorm.Session{AllowGlobalUpdate: true}).WithContext(ctx).Delete(new(Action)).Error + require.NoError(t, err) + }) + + err = s.NewRepo(ctx, alice, alice, repo) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionCreateRepo, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + IsPrivate: false, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) + }) + + t.Run("fork repo", func(t *testing.T) { + t.Cleanup(func() { + err := s.db.Session(&gorm.Session{AllowGlobalUpdate: true}).WithContext(ctx).Delete(new(Action)).Error + require.NoError(t, err) + }) + + repo.IsFork = true + err = s.NewRepo(ctx, alice, alice, repo) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionForkRepo, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + IsPrivate: false, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) + }) +} + +func actionsPushTag(t *testing.T, ctx context.Context, s *ActionsStore) { + // NOTE: We set a noop mock here to avoid data race with other tests that writes + // to the mock server because this function holds a lock. + conf.SetMockServer(t, conf.ServerOpts{}) + conf.SetMockSSH(t, conf.SSHOpts{}) + conf.SetMockUI(t, conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }) + + alice, err := newUsersStore(s.db).Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + repo, err := newReposStore(s.db).Create(ctx, + alice.ID, + CreateRepoOptions{ + Name: "example", + }, + ) + require.NoError(t, err) + + t.Run("new tag", func(t *testing.T) { + t.Cleanup(func() { + err := s.db.Session(&gorm.Session{AllowGlobalUpdate: true}).WithContext(ctx).Delete(new(Action)).Error + require.NoError(t, err) + }) + + err = s.PushTag(ctx, + PushTagOptions{ + Owner: alice, + Repo: repo, + PusherName: alice.Name, + RefFullName: "refs/tags/v1.0.0", + NewCommitID: "085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7", + }, + ) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionPushTag, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + RefName: "v1.0.0", + IsPrivate: false, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) + }) + + t.Run("delete tag", func(t *testing.T) { + t.Cleanup(func() { + err := s.db.Session(&gorm.Session{AllowGlobalUpdate: true}).WithContext(ctx).Delete(new(Action)).Error + require.NoError(t, err) + }) + + err = s.PushTag(ctx, + PushTagOptions{ + Owner: alice, + Repo: repo, + PusherName: alice.Name, + RefFullName: "refs/tags/v1.0.0", + NewCommitID: git.EmptyID, + }, + ) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionDeleteTag, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + RefName: "v1.0.0", + IsPrivate: false, + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) + }) +} + +func actionsRenameRepo(t *testing.T, ctx context.Context, s *ActionsStore) { + conf.SetMockUI(t, conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }) + + alice, err := newUsersStore(s.db).Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + repo, err := newReposStore(s.db).Create(ctx, + alice.ID, + CreateRepoOptions{ + Name: "example", + }, + ) + require.NoError(t, err) + + err = s.RenameRepo(ctx, alice, alice, "oldExample", repo) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionRenameRepo, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: alice.Name, + RepoName: repo.Name, + IsPrivate: false, + Content: "oldExample", + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) +} + +func actionsTransferRepo(t *testing.T, ctx context.Context, s *ActionsStore) { + conf.SetMockUI(t, conf.UIOpts{ + User: conf.UIUserOpts{ + NewsFeedPagingNum: 20, + }, + }) + + alice, err := newUsersStore(s.db).Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + bob, err := newUsersStore(s.db).Create(ctx, "bob", "bob@example.com", CreateUserOptions{}) + require.NoError(t, err) + repo, err := newReposStore(s.db).Create(ctx, + alice.ID, + CreateRepoOptions{ + Name: "example", + }, + ) + require.NoError(t, err) + + err = s.TransferRepo(ctx, alice, alice, bob, repo) + require.NoError(t, err) + + got, err := s.ListByUser(ctx, alice.ID, alice.ID, 0, false) + require.NoError(t, err) + require.Len(t, got, 1) + got[0].ID = 0 + + want := []*Action{ + { + UserID: alice.ID, + OpType: ActionTransferRepo, + ActUserID: alice.ID, + ActUserName: alice.Name, + RepoID: repo.ID, + RepoUserName: bob.Name, + RepoName: repo.Name, + IsPrivate: false, + Content: "alice/example", + CreatedUnix: s.db.NowFunc().Unix(), + }, + } + want[0].Created = time.Unix(want[0].CreatedUnix, 0) + assert.Equal(t, want, got) +} diff --git a/internal/database/attachment.go b/internal/database/attachment.go new file mode 100644 index 00000000000..dd227306e3b --- /dev/null +++ b/internal/database/attachment.go @@ -0,0 +1,200 @@ +package database + +import ( + "fmt" + "io" + "mime/multipart" + "os" + "path" + "time" + + "github.com/cockroachdb/errors" + "github.com/google/uuid" + "xorm.io/xorm" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/errx" +) + +// Attachment represent a attachment of issue/comment/release. +type Attachment struct { + ID int64 + UUID string `xorm:"uuid UNIQUE"` + IssueID int64 `xorm:"INDEX"` + CommentID int64 + ReleaseID int64 `xorm:"INDEX"` + Name string + + Created time.Time `xorm:"-" json:"-" gorm:"-"` + CreatedUnix int64 +} + +func (a *Attachment) BeforeInsert() { + a.CreatedUnix = time.Now().Unix() +} + +func (a *Attachment) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "created_unix": + a.Created = time.Unix(a.CreatedUnix, 0).Local() + } +} + +// AttachmentLocalPath returns where attachment is stored in local file system based on given UUID. +func AttachmentLocalPath(uuid string) string { + return path.Join(conf.Attachment.Path, uuid[0:1], uuid[1:2], uuid) +} + +// LocalPath returns where attachment is stored in local file system. +func (a *Attachment) LocalPath() string { + return AttachmentLocalPath(a.UUID) +} + +// NewAttachment creates a new attachment object. +func NewAttachment(name string, buf []byte, file multipart.File) (_ *Attachment, err error) { + attach := &Attachment{ + UUID: uuid.New().String(), + Name: name, + } + + localPath := attach.LocalPath() + if err = os.MkdirAll(path.Dir(localPath), os.ModePerm); err != nil { + return nil, errors.Newf("MkdirAll: %v", err) + } + + fw, err := os.Create(localPath) + if err != nil { + return nil, errors.Newf("Create: %v", err) + } + defer fw.Close() + + if _, err = fw.Write(buf); err != nil { + return nil, errors.Newf("write: %v", err) + } else if _, err = io.Copy(fw, file); err != nil { + return nil, errors.Newf("copy: %v", err) + } + + if _, err := x.Insert(attach); err != nil { + return nil, err + } + + return attach, nil +} + +var _ errx.NotFound = (*ErrAttachmentNotExist)(nil) + +type ErrAttachmentNotExist struct { + args map[string]any +} + +func IsErrAttachmentNotExist(err error) bool { + _, ok := err.(ErrAttachmentNotExist) + return ok +} + +func (err ErrAttachmentNotExist) Error() string { + return fmt.Sprintf("attachment does not exist: %v", err.args) +} + +func (ErrAttachmentNotExist) NotFound() bool { + return true +} + +func getAttachmentByUUID(e Engine, uuid string) (*Attachment, error) { + attach := &Attachment{UUID: uuid} + has, err := e.Get(attach) + if err != nil { + return nil, err + } else if !has { + return nil, ErrAttachmentNotExist{args: map[string]any{"uuid": uuid}} + } + return attach, nil +} + +func getAttachmentsByUUIDs(e Engine, uuids []string) ([]*Attachment, error) { + if len(uuids) == 0 { + return []*Attachment{}, nil + } + + // Silently drop invalid uuids. + attachments := make([]*Attachment, 0, len(uuids)) + return attachments, e.In("uuid", uuids).Find(&attachments) +} + +// GetAttachmentByUUID returns attachment by given UUID. +func GetAttachmentByUUID(uuid string) (*Attachment, error) { + return getAttachmentByUUID(x, uuid) +} + +func getAttachmentsByIssueID(e Engine, issueID int64) ([]*Attachment, error) { + attachments := make([]*Attachment, 0, 5) + return attachments, e.Where("issue_id = ? AND comment_id = 0", issueID).Find(&attachments) +} + +// GetAttachmentsByIssueID returns all attachments of an issue. +func GetAttachmentsByIssueID(issueID int64) ([]*Attachment, error) { + return getAttachmentsByIssueID(x, issueID) +} + +func getAttachmentsByCommentID(e Engine, commentID int64) ([]*Attachment, error) { + attachments := make([]*Attachment, 0, 5) + return attachments, e.Where("comment_id=?", commentID).Find(&attachments) +} + +// GetAttachmentsByCommentID returns all attachments of a comment. +func GetAttachmentsByCommentID(commentID int64) ([]*Attachment, error) { + return getAttachmentsByCommentID(x, commentID) +} + +func getAttachmentsByReleaseID(e Engine, releaseID int64) ([]*Attachment, error) { + attachments := make([]*Attachment, 0, 10) + return attachments, e.Where("release_id = ?", releaseID).Find(&attachments) +} + +// GetAttachmentsByReleaseID returns all attachments of a release. +func GetAttachmentsByReleaseID(releaseID int64) ([]*Attachment, error) { + return getAttachmentsByReleaseID(x, releaseID) +} + +// DeleteAttachment deletes the given attachment and optionally the associated file. +func DeleteAttachment(a *Attachment, remove bool) error { + _, err := DeleteAttachments([]*Attachment{a}, remove) + return err +} + +// DeleteAttachments deletes the given attachments and optionally the associated files. +func DeleteAttachments(attachments []*Attachment, remove bool) (int, error) { + for i, a := range attachments { + if remove { + if err := os.Remove(a.LocalPath()); err != nil { + return i, err + } + } + + if _, err := x.Delete(a); err != nil { + return i, err + } + } + + return len(attachments), nil +} + +// DeleteAttachmentsByIssue deletes all attachments associated with the given issue. +func DeleteAttachmentsByIssue(issueID int64, remove bool) (int, error) { + attachments, err := GetAttachmentsByIssueID(issueID) + if err != nil { + return 0, err + } + + return DeleteAttachments(attachments, remove) +} + +// DeleteAttachmentsByComment deletes all attachments associated with the given comment. +func DeleteAttachmentsByComment(commentID int64, remove bool) (int, error) { + attachments, err := GetAttachmentsByCommentID(commentID) + if err != nil { + return 0, err + } + + return DeleteAttachments(attachments, remove) +} diff --git a/internal/database/backup.go b/internal/database/backup.go new file mode 100644 index 00000000000..4ede981aa3e --- /dev/null +++ b/internal/database/backup.go @@ -0,0 +1,315 @@ +package database + +import ( + "bufio" + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "reflect" + "strings" + "sync" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + "gorm.io/gorm/schema" + log "unknwon.dev/clog/v2" + "xorm.io/core" + "xorm.io/xorm" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/osx" +) + +// getTableType returns the type name of a table definition without package name, +// e.g. *database.LFSObject -> LFSObject. +func getTableType(t any) string { + return strings.TrimPrefix(fmt.Sprintf("%T", t), "*database.") +} + +// DumpDatabase dumps all data from database to file system in JSON Lines format. +func DumpDatabase(ctx context.Context, db *gorm.DB, dirPath string, verbose bool) error { + err := os.MkdirAll(dirPath, os.ModePerm) + if err != nil { + return err + } + + err = dumpLegacyTables(ctx, dirPath, verbose) + if err != nil { + return errors.Wrap(err, "dump legacy tables") + } + + for _, table := range Tables { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + tableName := getTableType(table) + if verbose { + log.Trace("Dumping table %q...", tableName) + } + + err := func() error { + tableFile := filepath.Join(dirPath, tableName+".json") + f, err := os.Create(tableFile) + if err != nil { + return errors.Wrap(err, "create table file") + } + defer func() { _ = f.Close() }() + + return dumpTable(ctx, db, table, f) + }() + if err != nil { + return errors.Wrapf(err, "dump table %q", tableName) + } + } + + return nil +} + +func dumpTable(ctx context.Context, db *gorm.DB, table any, w io.Writer) error { + query := db.WithContext(ctx).Model(table) + switch table.(type) { + case *LFSObject: + query = query.Order("repo_id, oid ASC") + default: + query = query.Order("id ASC") + } + + rows, err := query.Rows() + if err != nil { + return errors.Wrap(err, "select rows") + } + defer func() { _ = rows.Close() }() + + for rows.Next() { + elem := reflect.New(reflect.TypeOf(table).Elem()).Interface() + err = db.ScanRows(rows, elem) + if err != nil { + return errors.Wrap(err, "scan rows") + } + + switch e := elem.(type) { + case *LFSObject: + e.CreatedAt = e.CreatedAt.UTC() + } + + err = json.NewEncoder(w).Encode(elem) + if err != nil { + return errors.Wrap(err, "encode JSON") + } + } + return rows.Err() +} + +func dumpLegacyTables(ctx context.Context, dirPath string, verbose bool) error { + // Purposely create a local variable to not modify global variable + legacyTables := append(legacyTables, new(Version)) + for _, table := range legacyTables { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + tableName := getTableType(table) + if verbose { + log.Trace("Dumping table %q...", tableName) + } + + tableFile := filepath.Join(dirPath, tableName+".json") + f, err := os.Create(tableFile) + if err != nil { + return errors.Newf("create JSON file: %v", err) + } + + if err = x.Context(ctx).Asc("id").Iterate(table, func(idx int, bean any) (err error) { + return json.NewEncoder(f).Encode(bean) + }); err != nil { + _ = f.Close() + return errors.Newf("dump table '%s': %v", tableName, err) + } + _ = f.Close() + } + return nil +} + +// ImportDatabase imports data from backup archive in JSON Lines format. +func ImportDatabase(ctx context.Context, db *gorm.DB, dirPath string, verbose bool) error { + err := importLegacyTables(ctx, dirPath, verbose) + if err != nil { + return errors.Wrap(err, "import legacy tables") + } + + for _, table := range Tables { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + tableName := strings.TrimPrefix(fmt.Sprintf("%T", table), "*database.") + err := func() error { + tableFile := filepath.Join(dirPath, tableName+".json") + if !osx.IsFile(tableFile) { + log.Info("Skipped table %q", tableName) + return nil + } + + if verbose { + log.Trace("Importing table %q...", tableName) + } + + f, err := os.Open(tableFile) + if err != nil { + return errors.Wrap(err, "open table file") + } + defer func() { _ = f.Close() }() + + return importTable(ctx, db, table, f) + }() + if err != nil { + return errors.Wrapf(err, "import table %q", tableName) + } + } + + return nil +} + +func importTable(ctx context.Context, db *gorm.DB, table any, r io.Reader) error { + err := db.WithContext(ctx).Migrator().DropTable(table) + if err != nil { + return errors.Wrap(err, "drop table") + } + + err = db.WithContext(ctx).Migrator().AutoMigrate(table) + if err != nil { + return errors.Wrap(err, "auto migrate") + } + + s, err := schema.Parse(table, &sync.Map{}, db.NamingStrategy) + if err != nil { + return errors.Wrap(err, "parse schema") + } + rawTableName := s.Table + skipResetIDSeq := map[string]bool{ + "lfs_object": true, + } + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + // PostgreSQL does not like the null characters (U+0000) + cleaned := bytes.ReplaceAll(scanner.Bytes(), []byte("\\u0000"), []byte("")) + + elem := reflect.New(reflect.TypeOf(table).Elem()).Interface() + err = json.Unmarshal(cleaned, elem) + if err != nil { + return errors.Wrap(err, "unmarshal JSON to struct") + } + + err = db.WithContext(ctx).Create(elem).Error + if err != nil { + return errors.Wrap(err, "create row") + } + } + + // PostgreSQL needs manually reset table sequence for auto increment keys + if conf.UsePostgreSQL && !skipResetIDSeq[rawTableName] { + seqName := rawTableName + "_id_seq" + if err = db.WithContext(ctx).Exec(fmt.Sprintf(`SELECT setval('%s', COALESCE((SELECT MAX(id)+1 FROM "%s"), 1), false)`, seqName, rawTableName)).Error; err != nil { + return errors.Wrapf(err, "reset table %q.%q", rawTableName, seqName) + } + } + return nil +} + +func importLegacyTables(ctx context.Context, dirPath string, verbose bool) error { + snakeMapper := core.SnakeMapper{} + + skipInsertProcessors := map[string]bool{ + "mirror": true, + "milestone": true, + } + + // Purposely create a local variable to not modify global variable + legacyTables := append(legacyTables, new(Version)) + for _, table := range legacyTables { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + tableName := strings.TrimPrefix(fmt.Sprintf("%T", table), "*database.") + tableFile := filepath.Join(dirPath, tableName+".json") + if !osx.IsFile(tableFile) { + continue + } + + if verbose { + log.Trace("Importing table %q...", tableName) + } + + if err := x.DropTables(table); err != nil { + return errors.Newf("drop table %q: %v", tableName, err) + } else if err = x.Sync2(table); err != nil { + return errors.Newf("sync table %q: %v", tableName, err) + } + + f, err := os.Open(tableFile) + if err != nil { + return errors.Newf("open JSON file: %v", err) + } + rawTableName := x.TableName(table) + _, isInsertProcessor := table.(xorm.BeforeInsertProcessor) + scanner := bufio.NewScanner(f) + for scanner.Scan() { + if err = json.Unmarshal(scanner.Bytes(), table); err != nil { + return errors.Newf("unmarshal to struct: %v", err) + } + + if _, err = x.Insert(table); err != nil { + return errors.Newf("insert strcut: %v", err) + } + + var meta struct { + ID int64 + CreatedUnix int64 + DeadlineUnix int64 + ClosedDateUnix int64 + } + if err = json.Unmarshal(scanner.Bytes(), &meta); err != nil { + log.Error("Failed to unmarshal to map: %v", err) + } + + // Reset created_unix back to the date save in archive because Insert method updates its value + if isInsertProcessor && !skipInsertProcessors[rawTableName] { + if _, err = x.Exec("UPDATE `"+rawTableName+"` SET created_unix=? WHERE id=?", meta.CreatedUnix, meta.ID); err != nil { + log.Error("Failed to reset '%s.created_unix': %v", rawTableName, err) + } + } + + switch rawTableName { + case "milestone": + if _, err = x.Exec("UPDATE `"+rawTableName+"` SET deadline_unix=?, closed_date_unix=? WHERE id=?", meta.DeadlineUnix, meta.ClosedDateUnix, meta.ID); err != nil { + log.Error("Failed to reset 'milestone.deadline_unix', 'milestone.closed_date_unix': %v", err) + } + } + } + + // PostgreSQL needs manually reset table sequence for auto increment keys + if conf.UsePostgreSQL { + rawTableName := snakeMapper.Obj2Table(tableName) + seqName := rawTableName + "_id_seq" + if _, err = x.Exec(fmt.Sprintf(`SELECT setval('%s', COALESCE((SELECT MAX(id)+1 FROM "%s"), 1), false);`, seqName, rawTableName)); err != nil { + return errors.Newf("reset table %q' sequence: %v", rawTableName, err) + } + } + } + return nil +} diff --git a/internal/database/backup_test.go b/internal/database/backup_test.go new file mode 100644 index 00000000000..4df1f785f2f --- /dev/null +++ b/internal/database/backup_test.go @@ -0,0 +1,240 @@ +package database + +import ( + "bytes" + "context" + "os" + "path/filepath" + "testing" + "time" + + "github.com/cockroachdb/errors" + "github.com/stretchr/testify/require" + "gorm.io/gorm" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/auth/github" + "gogs.io/gogs/internal/auth/pam" + "gogs.io/gogs/internal/cryptox" + "gogs.io/gogs/internal/dbtest" + "gogs.io/gogs/internal/lfsx" + "gogs.io/gogs/internal/testx" +) + +func TestDumpAndImport(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + const wantTables = 8 + if len(Tables) != wantTables { + t.Fatalf("New table has added (want %d got %d), please add new tests for the table and update this check", wantTables, len(Tables)) + } + + db := dbtest.NewDB(t, "dumpAndImport", Tables...) + setupDBToDump(t, db) + dumpTables(t, db) + importTables(t, db) + + // Dump and assert golden again to make sure data aren't changed. + dumpTables(t, db) +} + +func setupDBToDump(t *testing.T, db *gorm.DB) { + vals := []any{ + &Access{ + ID: 1, + UserID: 1, + RepoID: 11, + Mode: AccessModeRead, + }, + &Access{ + ID: 2, + UserID: 2, + RepoID: 22, + Mode: AccessModeWrite, + }, + + &AccessToken{ + UserID: 1, + Name: "test1", + Sha1: cryptox.SHA1("2910d03d-c0b5-4f71-bad5-c4086e4efae3"), + SHA256: cryptox.SHA256(cryptox.SHA1("2910d03d-c0b5-4f71-bad5-c4086e4efae3")), + CreatedUnix: 1588568886, + UpdatedUnix: 1588572486, // 1 hour later + }, + &AccessToken{ + UserID: 1, + Name: "test2", + Sha1: cryptox.SHA1("84117e17-7e67-4024-bd04-1c23e6e809d4"), + SHA256: cryptox.SHA256(cryptox.SHA1("84117e17-7e67-4024-bd04-1c23e6e809d4")), + CreatedUnix: 1588568886, + }, + &AccessToken{ + UserID: 2, + Name: "test1", + Sha1: cryptox.SHA1("da2775ce-73dd-47ba-b9d2-bbcc346585c4"), + SHA256: cryptox.SHA256(cryptox.SHA1("da2775ce-73dd-47ba-b9d2-bbcc346585c4")), + CreatedUnix: 1588568886, + }, + &AccessToken{ + UserID: 2, + Name: "test2", + Sha1: cryptox.SHA256(cryptox.SHA1("1b2dccd1-a262-470f-bb8c-7fc73192e9bb"))[:40], + SHA256: cryptox.SHA256(cryptox.SHA1("1b2dccd1-a262-470f-bb8c-7fc73192e9bb")), + CreatedUnix: 1588568886, + }, + + &Action{ + ID: 1, + UserID: 1, + OpType: ActionCreateBranch, + ActUserID: 1, + ActUserName: "alice", + RepoID: 1, + RepoUserName: "alice", + RepoName: "example", + RefName: "main", + IsPrivate: false, + Content: `{"Len":1,"Commits":[],"CompareURL":""}`, + CreatedUnix: 1588568886, + }, + &Action{ + ID: 2, + UserID: 1, + OpType: ActionCommitRepo, + ActUserID: 1, + ActUserName: "alice", + RepoID: 1, + RepoUserName: "alice", + RepoName: "example", + RefName: "main", + IsPrivate: false, + Content: `{"Len":1,"Commits":[],"CompareURL":""}`, + CreatedUnix: 1588568886, + }, + &Action{ + ID: 3, + UserID: 1, + OpType: ActionDeleteBranch, + ActUserID: 1, + ActUserName: "alice", + RepoID: 1, + RepoUserName: "alice", + RepoName: "example", + RefName: "main", + IsPrivate: false, + CreatedUnix: 1588568886, + }, + + &EmailAddress{ + ID: 1, + UserID: 1, + Email: "alice@example.com", + IsActivated: false, + }, + &EmailAddress{ + ID: 2, + UserID: 2, + Email: "bob@example.com", + IsActivated: true, + }, + + &Follow{ + ID: 1, + UserID: 1, + FollowID: 2, + }, + &Follow{ + ID: 2, + UserID: 2, + FollowID: 1, + }, + + &LFSObject{ + RepoID: 1, + OID: "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", + Size: 100, + Storage: lfsx.StorageLocal, + CreatedAt: time.Unix(1588568886, 0).UTC(), + }, + &LFSObject{ + RepoID: 2, + OID: "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", + Size: 100, + Storage: lfsx.StorageLocal, + CreatedAt: time.Unix(1588568886, 0).UTC(), + }, + + &LoginSource{ + Type: auth.PAM, + Name: "My PAM", + IsActived: true, + Provider: pam.NewProvider(&pam.Config{ + ServiceName: "PAM service", + }), + CreatedUnix: 1588568886, + UpdatedUnix: 1588572486, // 1 hour later + }, + &LoginSource{ + Type: auth.GitHub, + Name: "GitHub.com", + IsActived: true, + Provider: github.NewProvider(&github.Config{ + APIEndpoint: "https://api.github.com", + }), + CreatedUnix: 1588568886, + }, + + &Notice{ + ID: 1, + Type: NoticeTypeRepository, + Description: "This is a notice", + CreatedUnix: 1588568886, + }, + } + for _, val := range vals { + err := db.Create(val).Error + require.NoError(t, err) + } +} + +func dumpTables(t *testing.T, db *gorm.DB) { + ctx := context.Background() + + for _, table := range Tables { + tableName := getTableType(table) + + var buf bytes.Buffer + err := dumpTable(ctx, db, table, &buf) + if err != nil { + t.Fatalf("%s: %v", tableName, err) + } + + golden := filepath.Join("testdata", "backup", tableName+".golden.json") + testx.AssertGolden(t, golden, testx.Update("TestDumpAndImport"), buf.String()) + } +} + +func importTables(t *testing.T, db *gorm.DB) { + ctx := context.Background() + + for _, table := range Tables { + tableName := getTableType(table) + + err := func() error { + golden := filepath.Join("testdata", "backup", tableName+".golden.json") + f, err := os.Open(golden) + if err != nil { + return errors.Wrap(err, "open table file") + } + defer func() { _ = f.Close() }() + + return importTable(ctx, db, table, f) + }() + if err != nil { + t.Fatalf("%s: %v", tableName, err) + } + } +} diff --git a/internal/database/comment.go b/internal/database/comment.go new file mode 100644 index 00000000000..3f9bc9b8da8 --- /dev/null +++ b/internal/database/comment.go @@ -0,0 +1,550 @@ +package database + +import ( + "context" + "fmt" + "strconv" + "strings" + "time" + + "github.com/cockroachdb/errors" + log "unknwon.dev/clog/v2" + "xorm.io/xorm" + + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/markup" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" +) + +// CommentType defines whether a comment is just a simple comment, an action (like close) or a reference. +type CommentType int + +const ( + // Plain comment, can be associated with a commit (CommitID > 0) and a line (LineNum > 0) + CommentTypeComment CommentType = iota + CommentTypeReopen + CommentTypeClose + + // References. + CommentTypeIssueRef + // Reference from a commit (not part of a pull request) + CommentTypeCommitRef + // Reference from a comment + CommentTypeCommentRef + // Reference from a pull request + CommentTypePullRef +) + +type CommentTag int + +const ( + CommentTagNone CommentTag = iota + CommentTagPoster + CommentTagWriter + CommentTagOwner +) + +// Comment represents a comment in commit and issue page. +type Comment struct { + ID int64 + Type CommentType + PosterID int64 + Poster *User `xorm:"-" json:"-" gorm:"-"` + IssueID int64 `xorm:"INDEX"` + Issue *Issue `xorm:"-" json:"-" gorm:"-"` + CommitID int64 + Line int64 + Content string `xorm:"TEXT"` + RenderedContent string `xorm:"-" json:"-" gorm:"-"` + + Created time.Time `xorm:"-" json:"-" gorm:"-"` + CreatedUnix int64 + Updated time.Time `xorm:"-" json:"-" gorm:"-"` + UpdatedUnix int64 + + // Reference issue in commit message + CommitSHA string `xorm:"VARCHAR(40)"` + + Attachments []*Attachment `xorm:"-" json:"-" gorm:"-"` + + // For view issue page. + ShowTag CommentTag `xorm:"-" json:"-" gorm:"-"` +} + +func (c *Comment) BeforeInsert() { + c.CreatedUnix = time.Now().Unix() + c.UpdatedUnix = c.CreatedUnix +} + +func (c *Comment) BeforeUpdate() { + c.UpdatedUnix = time.Now().Unix() +} + +func (c *Comment) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "created_unix": + c.Created = time.Unix(c.CreatedUnix, 0).Local() + case "updated_unix": + c.Updated = time.Unix(c.UpdatedUnix, 0).Local() + } +} + +func (c *Comment) loadAttributes(e Engine) (err error) { + if c.Poster == nil { + c.Poster, err = Handle.Users().GetByID(context.TODO(), c.PosterID) + if err != nil { + if IsErrUserNotExist(err) { + c.PosterID = -1 + c.Poster = NewGhostUser() + } else { + return errors.Newf("getUserByID.(Poster) [%d]: %v", c.PosterID, err) + } + } + } + + if c.Issue == nil { + c.Issue, err = getRawIssueByID(e, c.IssueID) + if err != nil { + return errors.Newf("getIssueByID [%d]: %v", c.IssueID, err) + } + if c.Issue.Repo == nil { + c.Issue.Repo, err = getRepositoryByID(e, c.Issue.RepoID) + if err != nil { + return errors.Newf("getRepositoryByID [%d]: %v", c.Issue.RepoID, err) + } + } + } + + if c.Attachments == nil { + c.Attachments, err = getAttachmentsByCommentID(e, c.ID) + if err != nil { + return errors.Newf("getAttachmentsByCommentID [%d]: %v", c.ID, err) + } + } + + return nil +} + +func (c *Comment) LoadAttributes() error { + return c.loadAttributes(x) +} + +func (c *Comment) HTMLURL() string { + return fmt.Sprintf("%s#issuecomment-%d", c.Issue.HTMLURL(), c.ID) +} + +// This method assumes following fields have been assigned with valid values: +// Required - Poster, Issue +func (c *Comment) APIFormat() *apiv1types.IssueComment { + return &apiv1types.IssueComment{ + ID: c.ID, + HTMLURL: c.HTMLURL(), + Poster: c.Poster.APIFormat(), + Body: c.Content, + Created: c.Created, + Updated: c.Updated, + } +} + +func CommentHashTag(id int64) string { + return "issuecomment-" + strconv.FormatInt(id, 10) +} + +// HashTag returns unique hash tag for comment. +func (c *Comment) HashTag() string { + return CommentHashTag(c.ID) +} + +// EventTag returns unique event hash tag for comment. +func (c *Comment) EventTag() string { + return "event-" + strconv.FormatInt(c.ID, 10) +} + +// mailParticipants sends new comment emails to repository watchers +// and mentioned people. +func (c *Comment) mailParticipants(e Engine, opType ActionType, issue *Issue) (err error) { + mentions := markup.FindAllMentions(c.Content) + if err = updateIssueMentions(e, c.IssueID, mentions); err != nil { + return errors.Newf("UpdateIssueMentions [%d]: %v", c.IssueID, err) + } + + switch opType { + case ActionCommentIssue: + issue.Content = c.Content + case ActionCloseIssue: + issue.Content = fmt.Sprintf("Closed #%d", issue.Index) + case ActionReopenIssue: + issue.Content = fmt.Sprintf("Reopened #%d", issue.Index) + } + if err = mailIssueCommentToParticipants(issue, c.Poster, mentions); err != nil { + log.Error("mailIssueCommentToParticipants: %v", err) + } + + return nil +} + +func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err error) { + comment := &Comment{ + Type: opts.Type, + PosterID: opts.Doer.ID, + Poster: opts.Doer, + IssueID: opts.Issue.ID, + CommitID: opts.CommitID, + CommitSHA: opts.CommitSHA, + Line: opts.LineNum, + Content: opts.Content, + } + if _, err = e.Insert(comment); err != nil { + return nil, 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, + } + + // Check comment type. + switch opts.Type { + case CommentTypeComment: + act.OpType = ActionCommentIssue + + if _, err = e.Exec("UPDATE `issue` SET num_comments=num_comments+1 WHERE id=?", opts.Issue.ID); err != nil { + return nil, err + } + + // Check attachments + attachments := make([]*Attachment, 0, len(opts.Attachments)) + for _, uuid := range opts.Attachments { + attach, err := getAttachmentByUUID(e, uuid) + if err != nil { + if IsErrAttachmentNotExist(err) { + continue + } + return nil, errors.Newf("getAttachmentByUUID [%s]: %v", uuid, err) + } + attachments = append(attachments, attach) + } + + for i := range attachments { + attachments[i].IssueID = opts.Issue.ID + attachments[i].CommentID = comment.ID + // No assign value could be 0, so ignore AllCols(). + if _, err = e.ID(attachments[i].ID).Update(attachments[i]); err != nil { + return nil, errors.Newf("update attachment [%d]: %v", attachments[i].ID, err) + } + } + + case CommentTypeReopen: + act.OpType = ActionReopenIssue + if opts.Issue.IsPull { + act.OpType = ActionReopenPullRequest + } + + if opts.Issue.IsPull { + _, err = e.Exec("UPDATE `repository` SET num_closed_pulls=num_closed_pulls-1 WHERE id=?", opts.Repo.ID) + } else { + _, err = e.Exec("UPDATE `repository` SET num_closed_issues=num_closed_issues-1 WHERE id=?", opts.Repo.ID) + } + if err != nil { + return nil, err + } + + case CommentTypeClose: + act.OpType = ActionCloseIssue + if opts.Issue.IsPull { + act.OpType = ActionClosePullRequest + } + + if opts.Issue.IsPull { + _, err = e.Exec("UPDATE `repository` SET num_closed_pulls=num_closed_pulls+1 WHERE id=?", opts.Repo.ID) + } else { + _, err = e.Exec("UPDATE `repository` SET num_closed_issues=num_closed_issues+1 WHERE id=?", opts.Repo.ID) + } + if err != nil { + return nil, err + } + } + + if _, err = e.Exec("UPDATE `issue` SET updated_unix = ? WHERE id = ?", time.Now().Unix(), opts.Issue.ID); err != nil { + return nil, errors.Newf("update issue 'updated_unix': %v", err) + } + + // Notify watchers for whatever action comes in, ignore if no action type. + if act.OpType > 0 { + if err = notifyWatchers(e, act); err != nil { + log.Error("notifyWatchers: %v", err) + } + if err = comment.mailParticipants(e, act.OpType, opts.Issue); err != nil { + log.Error("MailParticipants: %v", err) + } + } + + return comment, comment.loadAttributes(e) +} + +func createStatusComment(e *xorm.Session, doer *User, repo *Repository, issue *Issue) (*Comment, error) { + cmtType := CommentTypeClose + if !issue.IsClosed { + cmtType = CommentTypeReopen + } + return createComment(e, &CreateCommentOptions{ + Type: cmtType, + Doer: doer, + Repo: repo, + Issue: issue, + }) +} + +type CreateCommentOptions struct { + Type CommentType + Doer *User + Repo *Repository + Issue *Issue + + CommitID int64 + CommitSHA string + LineNum int64 + Content string + Attachments []string // UUIDs of attachments +} + +// CreateComment creates comment of issue or commit. +func CreateComment(opts *CreateCommentOptions) (comment *Comment, err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return nil, err + } + + comment, err = createComment(sess, opts) + if err != nil { + return nil, err + } + + return comment, sess.Commit() +} + +// CreateIssueComment creates a plain issue comment. +func CreateIssueComment(doer *User, repo *Repository, issue *Issue, content string, attachments []string) (*Comment, error) { + comment, err := CreateComment(&CreateCommentOptions{ + Type: CommentTypeComment, + Doer: doer, + Repo: repo, + Issue: issue, + Content: content, + Attachments: attachments, + }) + if err != nil { + return nil, errors.Newf("CreateComment: %v", err) + } + + comment.Issue = issue + if err = PrepareWebhooks(repo, HookEventTypeIssueComment, &apiv1types.WebhookIssueCommentPayload{ + Action: apiv1types.WebhookIssueCommentCreated, + Issue: issue.APIFormat(), + Comment: comment.APIFormat(), + Repository: repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }); err != nil { + log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) + } + + return comment, nil +} + +// CreateRefComment creates a commit reference comment to issue. +func CreateRefComment(doer *User, repo *Repository, issue *Issue, content, commitSHA string) error { + if commitSHA == "" { + return errors.Newf("cannot create reference with empty commit SHA") + } + + // Check if same reference from same commit has already existed. + has, err := x.Get(&Comment{ + Type: CommentTypeCommitRef, + IssueID: issue.ID, + CommitSHA: commitSHA, + }) + if err != nil { + return errors.Newf("check reference comment: %v", err) + } else if has { + return nil + } + + _, err = CreateComment(&CreateCommentOptions{ + Type: CommentTypeCommitRef, + Doer: doer, + Repo: repo, + Issue: issue, + CommitSHA: commitSHA, + Content: content, + }) + return err +} + +var _ errx.NotFound = (*ErrCommentNotExist)(nil) + +type ErrCommentNotExist struct { + args map[string]any +} + +func IsErrCommentNotExist(err error) bool { + _, ok := err.(ErrCommentNotExist) + return ok +} + +func (err ErrCommentNotExist) Error() string { + return fmt.Sprintf("comment does not exist: %v", err.args) +} + +func (ErrCommentNotExist) NotFound() bool { + return true +} + +// GetCommentByID returns the comment by given ID. +func GetCommentByID(id int64) (*Comment, error) { + c := new(Comment) + has, err := x.Id(id).Get(c) + if err != nil { + return nil, err + } else if !has { + return nil, ErrCommentNotExist{args: map[string]any{"commentID": id}} + } + return c, c.LoadAttributes() +} + +// FIXME: use CommentList to improve performance. +func loadCommentsAttributes(e Engine, comments []*Comment) (err error) { + for i := range comments { + if err = comments[i].loadAttributes(e); err != nil { + return errors.Newf("loadAttributes [%d]: %v", comments[i].ID, err) + } + } + + return 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) + } + + if err := sess.Find(&comments); err != nil { + return nil, err + } + return comments, loadCommentsAttributes(e, comments) +} + +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) + } + if err := sess.Find(&comments); err != nil { + return nil, err + } + return comments, loadCommentsAttributes(e, comments) +} + +func getCommentsByIssueID(e Engine, issueID int64) ([]*Comment, error) { + return getCommentsByIssueIDSince(e, issueID, -1) +} + +// GetCommentsByIssueID returns all comments of an issue. +func GetCommentsByIssueID(issueID int64) ([]*Comment, error) { + return getCommentsByIssueID(x, issueID) +} + +// 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) +} + +// 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) +} + +// UpdateComment updates information of comment. +func UpdateComment(doer *User, c *Comment, oldContent string) (err error) { + if _, err = x.Id(c.ID).AllCols().Update(c); err != nil { + return err + } + + if err = c.Issue.LoadAttributes(); err != nil { + log.Error("Issue.LoadAttributes [issue_id: %d]: %v", c.IssueID, err) + } else if err = PrepareWebhooks(c.Issue.Repo, HookEventTypeIssueComment, &apiv1types.WebhookIssueCommentPayload{ + Action: apiv1types.WebhookIssueCommentEdited, + Issue: c.Issue.APIFormat(), + Comment: c.APIFormat(), + Changes: &apiv1types.WebhookChangesPayload{ + Body: &apiv1types.WebhookChangesFromPayload{ + From: oldContent, + }, + }, + Repository: c.Issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }); err != nil { + log.Error("PrepareWebhooks [comment_id: %d]: %v", c.ID, err) + } + + return nil +} + +// DeleteCommentByID deletes the comment by given ID. +func DeleteCommentByID(doer *User, id int64) error { + comment, err := GetCommentByID(id) + if err != nil { + if IsErrCommentNotExist(err) { + return nil + } + return err + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.ID(comment.ID).Delete(new(Comment)); err != nil { + return err + } + + if comment.Type == CommentTypeComment { + if _, err = sess.Exec("UPDATE `issue` SET num_comments = num_comments - 1 WHERE id = ?", comment.IssueID); err != nil { + return err + } + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + _, err = DeleteAttachmentsByComment(comment.ID, true) + if err != nil { + log.Error("Failed to delete attachments by comment[%d]: %v", comment.ID, err) + } + + if err = comment.Issue.LoadAttributes(); err != nil { + log.Error("Issue.LoadAttributes [issue_id: %d]: %v", comment.IssueID, err) + } else if err = PrepareWebhooks(comment.Issue.Repo, HookEventTypeIssueComment, &apiv1types.WebhookIssueCommentPayload{ + Action: apiv1types.WebhookIssueCommentDeleted, + Issue: comment.Issue.APIFormat(), + Comment: comment.APIFormat(), + Repository: comment.Issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }); err != nil { + log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) + } + return nil +} diff --git a/internal/database/database.go b/internal/database/database.go new file mode 100644 index 00000000000..ddfa9e6d2a0 --- /dev/null +++ b/internal/database/database.go @@ -0,0 +1,187 @@ +package database + +import ( + "fmt" + "path/filepath" + "strings" + "time" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + "gorm.io/gorm/logger" + "gorm.io/gorm/schema" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/dbx" +) + +func newLogWriter() (logger.Writer, error) { + sec := conf.File.Section("log.gorm") + w, err := log.NewFileWriter( + filepath.Join(conf.Log.RootPath, "gorm.log"), + log.FileRotationConfig{ + Rotate: sec.Key("ROTATE").MustBool(true), + Daily: sec.Key("ROTATE_DAILY").MustBool(true), + MaxSize: sec.Key("MAX_SIZE").MustInt64(100) * 1024 * 1024, + MaxDays: sec.Key("MAX_DAYS").MustInt64(3), + }, + ) + if err != nil { + return nil, errors.Wrap(err, `create "gorm.log"`) + } + return &dbx.Logger{Writer: w}, nil +} + +// Tables is the list of struct-to-table mappings. +// +// NOTE: Lines are sorted in alphabetical order, each letter in its own line. +// +// ⚠️ WARNING: This list is meant to be read-only. +var Tables = []any{ + new(Access), new(AccessToken), new(Action), + new(EmailAddress), + new(Follow), + new(LFSObject), new(LoginSource), + new(Notice), +} + +// NewConnection returns a new database connection with the given logger. +func NewConnection(w logger.Writer) (*gorm.DB, error) { + level := logger.Info + if conf.IsProdMode() { + level = logger.Warn + } + + // NOTE: AutoMigrate does not respect logger passed in gorm.Config. + logger.Default = logger.New(w, logger.Config{ + SlowThreshold: 100 * time.Millisecond, + LogLevel: level, + }) + + db, err := dbx.OpenDB( + conf.Database, + &gorm.Config{ + SkipDefaultTransaction: true, + NamingStrategy: schema.NamingStrategy{ + SingularTable: true, + }, + NowFunc: func() time.Time { + return time.Now().UTC().Truncate(time.Microsecond) + }, + }, + ) + if err != nil { + return nil, errors.Wrap(err, "open database") + } + + sqlDB, err := db.DB() + if err != nil { + return nil, errors.Wrap(err, "get underlying *sql.DB") + } + sqlDB.SetMaxOpenConns(conf.Database.MaxOpenConns) + sqlDB.SetMaxIdleConns(conf.Database.MaxIdleConns) + sqlDB.SetConnMaxLifetime(time.Minute) + + switch conf.Database.Type { + case "postgres": + conf.UsePostgreSQL = true + case "mysql": + conf.UseMySQL = true + db = db.Set("gorm:table_options", "ENGINE=InnoDB").Session(&gorm.Session{}) + case "sqlite3": + conf.UseSQLite3 = true + default: + panic("unreachable") + } + + // NOTE: GORM has problem detecting existing columns, see + // https://github.com/gogs/gogs/issues/6091. Therefore, only use it to create new + // tables, and do customize migration with future changes. + for _, table := range Tables { + if db.Migrator().HasTable(table) { + continue + } + + name := strings.TrimPrefix(fmt.Sprintf("%T", table), "*database.") + err = db.Migrator().AutoMigrate(table) + if err != nil { + return nil, errors.Wrapf(err, "auto migrate %q", name) + } + log.Trace("Auto migrated %q", name) + } + + loadedLoginSourceFilesStore, err = loadLoginSourceFiles(filepath.Join(conf.CustomDir(), "conf", "auth.d"), db.NowFunc) + if err != nil { + return nil, errors.Wrap(err, "load login source files") + } + + // Initialize the database handle. + Handle = &DB{db: db} + return db, nil +} + +// DB is the database handler for the storage layer. +type DB struct { + db *gorm.DB +} + +// Handle is the global database handle. It could be `nil` during the +// installation mode. +// +// NOTE: Because we need to register all the routes even during the installation +// mode (which initially has no database configuration), we have to use a global +// variable since we can't pass a database handler around before it's available. +// +// NOTE: It is not guarded by a mutex because it is only written once either +// during the service start or during the installation process (which is a +// single-thread process). +var Handle *DB + +func (db *DB) AccessTokens() *AccessTokensStore { + return newAccessTokensStore(db.db) +} + +func (db *DB) Actions() *ActionsStore { + return newActionsStore(db.db) +} + +func (db *DB) LFS() *LFSStore { + return newLFSStore(db.db) +} + +// NOTE: It is not guarded by a mutex because it only gets written during the +// service start. +var loadedLoginSourceFilesStore loginSourceFilesStore + +func (db *DB) LoginSources() *LoginSourcesStore { + return newLoginSourcesStore(db.db, loadedLoginSourceFilesStore) +} + +func (db *DB) Notices() *NoticesStore { + return newNoticesStore(db.db) +} + +func (db *DB) Organizations() *OrganizationsStore { + return newOrganizationsStoreStore(db.db) +} + +func (db *DB) Permissions() *PermissionsStore { + return newPermissionsStore(db.db) +} + +func (db *DB) PublicKey() *PublicKeysStore { + return newPublicKeysStore(db.db) +} + +func (db *DB) Repositories() *RepositoriesStore { + return newReposStore(db.db) +} + +func (db *DB) TwoFactors() *TwoFactorsStore { + return newTwoFactorsStore(db.db) +} + +func (db *DB) Users() *UsersStore { + return newUsersStore(db.db) +} diff --git a/internal/database/error.go b/internal/database/error.go new file mode 100644 index 00000000000..9d45d368b15 --- /dev/null +++ b/internal/database/error.go @@ -0,0 +1,270 @@ +package database + +import ( + "fmt" +) + +// __ __.__ __ .__ +// / \ / \__| | _|__| +// \ \/\/ / | |/ / | +// \ /| | <| | +// \__/\ / |__|__|_ \__| +// \/ \/ + +type ErrWikiAlreadyExist struct { + Title string +} + +func IsErrWikiAlreadyExist(err error) bool { + _, ok := err.(ErrWikiAlreadyExist) + return ok +} + +func (err ErrWikiAlreadyExist) Error() string { + return fmt.Sprintf("wiki page already exists [title: %s]", err.Title) +} + +// __________ ___. .__ .__ ____ __. +// \______ \__ _\_ |__ | | |__| ____ | |/ _|____ ___.__. +// | ___/ | \ __ \| | | |/ ___\ | <_/ __ < | | +// | | | | / \_\ \ |_| \ \___ | | \ ___/\___ | +// |____| |____/|___ /____/__|\___ > |____|__ \___ > ____| +// \/ \/ \/ \/\/ + +type ErrKeyUnableVerify struct { + Result string +} + +func IsErrKeyUnableVerify(err error) bool { + _, ok := err.(ErrKeyUnableVerify) + return ok +} + +func (err ErrKeyUnableVerify) Error() string { + return fmt.Sprintf("Unable to verify key content [result: %s]", err.Result) +} + +type ErrKeyNotExist struct { + ID int64 +} + +func IsErrKeyNotExist(err error) bool { + _, ok := err.(ErrKeyNotExist) + return ok +} + +func (err ErrKeyNotExist) Error() string { + return fmt.Sprintf("public key does not exist [id: %d]", err.ID) +} + +type ErrKeyAlreadyExist struct { + OwnerID int64 + Content string +} + +func IsErrKeyAlreadyExist(err error) bool { + _, ok := err.(ErrKeyAlreadyExist) + return ok +} + +func (err ErrKeyAlreadyExist) Error() string { + return fmt.Sprintf("public key already exists [owner_id: %d, content: %s]", err.OwnerID, err.Content) +} + +type ErrKeyNameAlreadyUsed struct { + OwnerID int64 + Name string +} + +func IsErrKeyNameAlreadyUsed(err error) bool { + _, ok := err.(ErrKeyNameAlreadyUsed) + return ok +} + +func (err ErrKeyNameAlreadyUsed) Error() string { + return fmt.Sprintf("public key already exists [owner_id: %d, name: %s]", err.OwnerID, err.Name) +} + +type ErrKeyAccessDenied struct { + UserID int64 + KeyID int64 + Note string +} + +func IsErrKeyAccessDenied(err error) bool { + _, ok := err.(ErrKeyAccessDenied) + return ok +} + +func (err ErrKeyAccessDenied) Error() string { + return fmt.Sprintf("user does not have access to the key [user_id: %d, key_id: %d, note: %s]", + err.UserID, err.KeyID, err.Note) +} + +type ErrDeployKeyAlreadyExist struct { + KeyID int64 + RepoID int64 +} + +func IsErrDeployKeyAlreadyExist(err error) bool { + _, ok := err.(ErrDeployKeyAlreadyExist) + return ok +} + +func (err ErrDeployKeyAlreadyExist) Error() string { + return fmt.Sprintf("public key already exists [key_id: %d, repo_id: %d]", err.KeyID, err.RepoID) +} + +type ErrDeployKeyNameAlreadyUsed struct { + RepoID int64 + Name string +} + +func IsErrDeployKeyNameAlreadyUsed(err error) bool { + _, ok := err.(ErrDeployKeyNameAlreadyUsed) + return ok +} + +func (err ErrDeployKeyNameAlreadyUsed) Error() string { + return fmt.Sprintf("public key already exists [repo_id: %d, name: %s]", err.RepoID, err.Name) +} + +// ________ .__ __ .__ +// \_____ \_______ _________ ____ |__|____________ _/ |_|__| ____ ____ +// / | \_ __ \/ ___\__ \ / \| \___ /\__ \\ __\ |/ _ \ / \ +// / | \ | \/ /_/ > __ \| | \ |/ / / __ \| | | ( <_> ) | \ +// \_______ /__| \___ (____ /___| /__/_____ \(____ /__| |__|\____/|___| / +// \/ /_____/ \/ \/ \/ \/ \/ + +type ErrLastOrgOwner struct { + UID int64 +} + +func IsErrLastOrgOwner(err error) bool { + _, ok := err.(ErrLastOrgOwner) + return ok +} + +func (err ErrLastOrgOwner) Error() string { + return fmt.Sprintf("user is the last member of owner team [uid: %d]", err.UID) +} + +// __________ .__ __ +// \______ \ ____ ______ ____ _____|__|/ |_ ___________ ___.__. +// | _// __ \\____ \ / _ \/ ___/ \ __\/ _ \_ __ < | | +// | | \ ___/| |_> > <_> )___ \| || | ( <_> ) | \/\___ | +// |____|_ /\___ > __/ \____/____ >__||__| \____/|__| / ____| +// \/ \/|__| \/ \/ + +type ErrInvalidCloneAddr struct { + IsURLError bool + IsInvalidPath bool + IsPermissionDenied bool + IsBlockedLocalAddress bool +} + +func IsErrInvalidCloneAddr(err error) bool { + _, ok := err.(ErrInvalidCloneAddr) + return ok +} + +func (err ErrInvalidCloneAddr) Error() string { + return fmt.Sprintf("invalid clone address [is_url_error: %v, is_invalid_path: %v, is_permission_denied: %v, is_blocked_local_address: %v]", + err.IsURLError, err.IsInvalidPath, err.IsPermissionDenied, err.IsBlockedLocalAddress) +} + +type ErrUpdateTaskNotExist struct { + UUID string +} + +func IsErrUpdateTaskNotExist(err error) bool { + _, ok := err.(ErrUpdateTaskNotExist) + return ok +} + +func (err ErrUpdateTaskNotExist) Error() string { + return fmt.Sprintf("update task does not exist [uuid: %s]", err.UUID) +} + +type ErrReleaseAlreadyExist struct { + TagName string +} + +func IsErrReleaseAlreadyExist(err error) bool { + _, ok := err.(ErrReleaseAlreadyExist) + return ok +} + +func (err ErrReleaseAlreadyExist) Error() string { + return fmt.Sprintf("release tag already exist [tag_name: %s]", err.TagName) +} + +type ErrInvalidTagName struct { + TagName string +} + +func IsErrInvalidTagName(err error) bool { + _, ok := err.(ErrInvalidTagName) + return ok +} + +func (err ErrInvalidTagName) Error() string { + return fmt.Sprintf("release tag name is not valid [tag_name: %s]", err.TagName) +} + +type ErrRepoFileAlreadyExist struct { + FileName string +} + +func IsErrRepoFileAlreadyExist(err error) bool { + _, ok := err.(ErrRepoFileAlreadyExist) + return ok +} + +func (err ErrRepoFileAlreadyExist) Error() string { + return fmt.Sprintf("repository file already exists [file_name: %s]", err.FileName) +} + +// ___________ +// \__ ___/___ _____ _____ +// | |_/ __ \\__ \ / \ +// | |\ ___/ / __ \| Y Y \ +// |____| \___ >____ /__|_| / +// \/ \/ \/ + +type ErrTeamAlreadyExist struct { + ID int64 + OrgID int64 + Name string +} + +func IsErrTeamAlreadyExist(err error) bool { + _, ok := err.(ErrTeamAlreadyExist) + return ok +} + +func (err ErrTeamAlreadyExist) Error() string { + return fmt.Sprintf("team already exists [id: %d, org_id: %d, name: %s]", err.ID, err.OrgID, err.Name) +} + +// ____ ___ .__ .___ +// | | \______ | | _________ __| _/ +// | | /\____ \| | / _ \__ \ / __ | +// | | / | |_> > |_( <_> ) __ \_/ /_/ | +// |______/ | __/|____/\____(____ /\____ | +// |__| \/ \/ +// + +type ErrUploadNotExist struct { + ID int64 + UUID string +} + +func IsErrUploadNotExist(err error) bool { + _, ok := err.(ErrAttachmentNotExist) + return ok +} + +func (err ErrUploadNotExist) Error() string { + return fmt.Sprintf("attachment does not exist [id: %d, uuid: %s]", err.ID, err.UUID) +} diff --git a/internal/database/issue.go b/internal/database/issue.go new file mode 100644 index 00000000000..a787e77db24 --- /dev/null +++ b/internal/database/issue.go @@ -0,0 +1,1464 @@ +package database + +import ( + "context" + "fmt" + "strconv" + "strings" + "time" + + "github.com/cockroachdb/errors" + log "unknwon.dev/clog/v2" + "xorm.io/xorm" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/markup" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" + "gogs.io/gogs/internal/tool" +) + +var ErrMissingIssueNumber = errors.New("no issue number specified") + +// Issue represents an issue or pull request of repository. +type Issue struct { + ID int64 `gorm:"primaryKey"` + RepoID int64 `xorm:"INDEX UNIQUE(repo_index)" gorm:"index;uniqueIndex:issue_repo_index_unique;not null"` + Repo *Repository `xorm:"-" json:"-" gorm:"-"` + Index int64 `xorm:"UNIQUE(repo_index)" gorm:"uniqueIndex:issue_repo_index_unique;not null"` // Index in one repository. + PosterID int64 `gorm:"index"` + Poster *User `xorm:"-" json:"-" gorm:"-"` + Title string `xorm:"name" gorm:"name"` + Content string `xorm:"TEXT" gorm:"type:TEXT"` + RenderedContent string `xorm:"-" json:"-" gorm:"-"` + Labels []*Label `xorm:"-" json:"-" gorm:"-"` + MilestoneID int64 `gorm:"index"` + Milestone *Milestone `xorm:"-" json:"-" gorm:"-"` + Priority int + AssigneeID int64 `gorm:"index"` + Assignee *User `xorm:"-" json:"-" gorm:"-"` + IsClosed bool + IsRead bool `xorm:"-" json:"-" gorm:"-"` + IsPull bool // Indicates whether is a pull request or not. + PullRequest *PullRequest `xorm:"-" json:"-" gorm:"-"` + NumComments int + + Deadline time.Time `xorm:"-" json:"-" gorm:"-"` + DeadlineUnix int64 + Created time.Time `xorm:"-" json:"-" gorm:"-"` + CreatedUnix int64 + Updated time.Time `xorm:"-" json:"-" gorm:"-"` + UpdatedUnix int64 + + Attachments []*Attachment `xorm:"-" json:"-" gorm:"-"` + Comments []*Comment `xorm:"-" json:"-" gorm:"-"` +} + +func (issue *Issue) BeforeInsert() { + issue.CreatedUnix = time.Now().Unix() + issue.UpdatedUnix = issue.CreatedUnix +} + +func (issue *Issue) BeforeUpdate() { + issue.UpdatedUnix = time.Now().Unix() + issue.DeadlineUnix = issue.Deadline.Unix() +} + +func (issue *Issue) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "deadline_unix": + issue.Deadline = time.Unix(issue.DeadlineUnix, 0).Local() + case "created_unix": + issue.Created = time.Unix(issue.CreatedUnix, 0).Local() + case "updated_unix": + issue.Updated = time.Unix(issue.UpdatedUnix, 0).Local() + } +} + +// Deprecated: Use Users.GetByID instead. +func getUserByID(e Engine, id int64) (*User, error) { + u := new(User) + has, err := e.ID(id).Get(u) + if err != nil { + return nil, err + } else if !has { + return nil, ErrUserNotExist{args: errx.Args{"userID": id}} + } + + // TODO(unknwon): Rely on AfterFind hook to sanitize user full name. + u.FullName = markup.Sanitize(u.FullName) + return u, nil +} + +func (issue *Issue) loadAttributes(e Engine) (err error) { + if issue.Repo == nil { + issue.Repo, err = getRepositoryByID(e, issue.RepoID) + if err != nil { + return errors.Newf("getRepositoryByID [%d]: %v", issue.RepoID, err) + } + } + + if issue.Poster == nil { + issue.Poster, err = getUserByID(e, issue.PosterID) + if err != nil { + if IsErrUserNotExist(err) { + issue.PosterID = -1 + issue.Poster = NewGhostUser() + } else { + return errors.Newf("getUserByID.(Poster) [%d]: %v", issue.PosterID, err) + } + } + } + + if issue.Labels == nil { + issue.Labels, err = getLabelsByIssueID(e, issue.ID) + if err != nil { + return errors.Newf("getLabelsByIssueID [%d]: %v", issue.ID, err) + } + } + + if issue.Milestone == nil && issue.MilestoneID > 0 { + issue.Milestone, err = getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) + if err != nil { + return errors.Newf("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 errors.Newf("getUserByID.(assignee) [%d]: %v", issue.AssigneeID, err) + } + } + + if issue.IsPull && issue.PullRequest == nil { + // It is possible pull request is not yet created. + issue.PullRequest, err = getPullRequestByIssueID(e, issue.ID) + if err != nil && !IsErrPullRequestNotExist(err) { + return errors.Newf("getPullRequestByIssueID [%d]: %v", issue.ID, err) + } + } + + if issue.Attachments == nil { + issue.Attachments, err = getAttachmentsByIssueID(e, issue.ID) + if err != nil { + return errors.Newf("getAttachmentsByIssueID [%d]: %v", issue.ID, err) + } + } + + if issue.Comments == nil { + issue.Comments, err = getCommentsByIssueID(e, issue.ID) + if err != nil { + return errors.Newf("getCommentsByIssueID [%d]: %v", issue.ID, err) + } + } + + return nil +} + +func (issue *Issue) LoadAttributes() error { + return issue.loadAttributes(x) +} + +func (issue *Issue) HTMLURL() string { + var path string + if issue.IsPull { + path = "pulls" + } else { + path = "issues" + } + return fmt.Sprintf("%s/%s/%d", issue.Repo.HTMLURL(), path, issue.Index) +} + +// State returns string representation of issue status. +func (issue *Issue) State() apiv1types.IssueStateType { + if issue.IsClosed { + return apiv1types.IssueStateClosed + } + return apiv1types.IssueStateOpen +} + +// This method assumes some fields assigned with values: +// Required - Poster, Labels, +// Optional - Milestone, Assignee, PullRequest +func (issue *Issue) APIFormat() *apiv1types.Issue { + apiLabels := make([]*apiv1types.IssueLabel, len(issue.Labels)) + for i := range issue.Labels { + apiLabels[i] = issue.Labels[i].APIFormat() + } + + apiIssue := &apiv1types.Issue{ + ID: issue.ID, + Index: issue.Index, + Poster: issue.Poster.APIFormat(), + Title: issue.Title, + Body: issue.Content, + Labels: apiLabels, + State: issue.State(), + Comments: issue.NumComments, + Created: issue.Created, + Updated: issue.Updated, + } + + if issue.Milestone != nil { + apiIssue.Milestone = issue.Milestone.APIFormat() + } + if issue.Assignee != nil { + apiIssue.Assignee = issue.Assignee.APIFormat() + } + if issue.IsPull { + apiIssue.PullRequest = &apiv1types.PullRequestMeta{ + HasMerged: issue.PullRequest.HasMerged, + } + if issue.PullRequest.HasMerged { + apiIssue.PullRequest.Merged = &issue.PullRequest.Merged + } + } + + return apiIssue +} + +// HashTag returns unique hash tag for issue. +func (issue *Issue) HashTag() string { + return "issue-" + strconv.FormatInt(issue.ID, 10) +} + +// IsPoster returns true if given user by ID is the poster. +func (issue *Issue) IsPoster(uid int64) bool { + return issue.PosterID == uid +} + +func (issue *Issue) hasLabel(e Engine, labelID int64) bool { + return hasIssueLabel(e, issue.ID, labelID) +} + +// HasLabel returns true if issue has been labeled by given ID. +func (issue *Issue) HasLabel(labelID int64) bool { + return issue.hasLabel(x, labelID) +} + +func (issue *Issue) sendLabelUpdatedWebhook(doer *User) { + var err error + if issue.IsPull { + err = issue.PullRequest.LoadIssue() + if err != nil { + log.Error("LoadIssue: %v", err) + return + } + err = PrepareWebhooks(issue.Repo, HookEventTypePullRequest, &apiv1types.WebhookPullRequestPayload{ + Action: apiv1types.WebhookIssueLabelUpdated, + Index: issue.Index, + PullRequest: issue.PullRequest.APIFormat(), + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } else { + err = PrepareWebhooks(issue.Repo, HookEventTypeIssues, &apiv1types.WebhookIssuesPayload{ + Action: apiv1types.WebhookIssueLabelUpdated, + Index: issue.Index, + Issue: issue.APIFormat(), + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } + if err != nil { + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + } +} + +func (issue *Issue) addLabel(e *xorm.Session, label *Label) error { + return newIssueLabel(e, issue, label) +} + +// AddLabel adds a new label to the issue. +func (issue *Issue) AddLabel(doer *User, label *Label) error { + if err := NewIssueLabel(issue, label); err != nil { + return err + } + + issue.sendLabelUpdatedWebhook(doer) + return nil +} + +func (issue *Issue) addLabels(e *xorm.Session, labels []*Label) error { + return newIssueLabels(e, issue, labels) +} + +// AddLabels adds a list of new labels to the issue. +func (issue *Issue) AddLabels(doer *User, labels []*Label) error { + if err := NewIssueLabels(issue, labels); err != nil { + return err + } + + issue.sendLabelUpdatedWebhook(doer) + return nil +} + +func (issue *Issue) getLabels(e Engine) (err error) { + if len(issue.Labels) > 0 { + return nil + } + + issue.Labels, err = getLabelsByIssueID(e, issue.ID) + if err != nil { + return errors.Newf("getLabelsByIssueID: %v", err) + } + return nil +} + +func (issue *Issue) removeLabel(e *xorm.Session, label *Label) error { + return deleteIssueLabel(e, issue, label) +} + +// RemoveLabel removes a label from issue by given ID. +func (issue *Issue) RemoveLabel(doer *User, label *Label) error { + if err := DeleteIssueLabel(issue, label); err != nil { + return err + } + + issue.sendLabelUpdatedWebhook(doer) + return nil +} + +func (issue *Issue) clearLabels(e *xorm.Session) (err error) { + if err = issue.getLabels(e); err != nil { + return errors.Newf("getLabels: %v", err) + } + + // NOTE: issue.removeLabel slices issue.Labels, so we need to create another slice to be unaffected. + labels := make([]*Label, len(issue.Labels)) + copy(labels, issue.Labels) + for i := range labels { + if err = issue.removeLabel(e, labels[i]); err != nil { + return errors.Newf("removeLabel: %v", err) + } + } + + return nil +} + +func (issue *Issue) ClearLabels(doer *User) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = issue.clearLabels(sess); err != nil { + return err + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + if issue.IsPull { + err = issue.PullRequest.LoadIssue() + if err != nil { + log.Error("LoadIssue: %v", err) + return err + } + err = PrepareWebhooks(issue.Repo, HookEventTypePullRequest, &apiv1types.WebhookPullRequestPayload{ + Action: apiv1types.WebhookIssueLabelCleared, + Index: issue.Index, + PullRequest: issue.PullRequest.APIFormat(), + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } else { + err = PrepareWebhooks(issue.Repo, HookEventTypeIssues, &apiv1types.WebhookIssuesPayload{ + Action: apiv1types.WebhookIssueLabelCleared, + Index: issue.Index, + Issue: issue.APIFormat(), + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } + if err != nil { + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + } + + return nil +} + +// ReplaceLabels removes all current labels and add new labels to the issue. +func (issue *Issue) ReplaceLabels(labels []*Label) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = issue.clearLabels(sess); err != nil { + return errors.Newf("clearLabels: %v", err) + } else if err = issue.addLabels(sess, labels); err != nil { + return errors.Newf("addLabels: %v", err) + } + + return sess.Commit() +} + +func (issue *Issue) GetAssignee() (err error) { + if issue.AssigneeID == 0 || issue.Assignee != nil { + return nil + } + + issue.Assignee, err = Handle.Users().GetByID(context.TODO(), issue.AssigneeID) + if IsErrUserNotExist(err) { + return nil + } + return err +} + +// ReadBy sets issue to be read by given user. +func (issue *Issue) ReadBy(uid int64) error { + return UpdateIssueUserByRead(uid, issue.ID) +} + +func updateIssueCols(e Engine, issue *Issue, cols ...string) error { + cols = append(cols, "updated_unix") + _, err := e.ID(issue.ID).Cols(cols...).Update(issue) + return err +} + +// UpdateIssueCols only updates values of specific columns for given issue. +func UpdateIssueCols(issue *Issue, cols ...string) error { + return updateIssueCols(x, issue, cols...) +} + +func (issue *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository, isClosed bool) (err error) { + // Nothing should be performed if current status is same as target status + if issue.IsClosed == isClosed { + return nil + } + issue.IsClosed = isClosed + + if err = updateIssueCols(e, issue, "is_closed"); err != nil { + return err + } else if err = updateIssueUsersByStatus(e, issue.ID, isClosed); err != nil { + return err + } + + // Update issue count of labels + if err = issue.getLabels(e); err != nil { + return err + } + for idx := range issue.Labels { + if issue.IsClosed { + issue.Labels[idx].NumClosedIssues++ + } else { + issue.Labels[idx].NumClosedIssues-- + } + if err = updateLabel(e, issue.Labels[idx]); err != nil { + return err + } + } + + // Update issue count of milestone + if err = changeMilestoneIssueStats(e, issue); err != nil { + return err + } + + // New action comment + if _, err = createStatusComment(e, doer, repo, issue); err != nil { + return err + } + + return nil +} + +// ChangeStatus changes issue status to open or closed. +func (issue *Issue) ChangeStatus(doer *User, repo *Repository, isClosed bool) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = issue.changeStatus(sess, doer, repo, isClosed); err != nil { + return err + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + if issue.IsPull { + // Merge pull request calls issue.changeStatus so we need to handle separately. + issue.PullRequest.Issue = issue + apiPullRequest := &apiv1types.WebhookPullRequestPayload{ + Index: issue.Index, + PullRequest: issue.PullRequest.APIFormat(), + Repository: repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + } + if isClosed { + apiPullRequest.Action = apiv1types.WebhookIssueClosed + } else { + apiPullRequest.Action = apiv1types.WebhookIssueReopened + } + err = PrepareWebhooks(repo, HookEventTypePullRequest, apiPullRequest) + } else { + apiIssues := &apiv1types.WebhookIssuesPayload{ + Index: issue.Index, + Issue: issue.APIFormat(), + Repository: repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + } + if isClosed { + apiIssues.Action = apiv1types.WebhookIssueClosed + } else { + apiIssues.Action = apiv1types.WebhookIssueReopened + } + err = PrepareWebhooks(repo, HookEventTypeIssues, apiIssues) + } + if err != nil { + log.Error("PrepareWebhooks [is_pull: %v, is_closed: %v]: %v", issue.IsPull, isClosed, err) + } + + return nil +} + +func (issue *Issue) ChangeTitle(doer *User, title string) (err error) { + oldTitle := issue.Title + issue.Title = title + if err = UpdateIssueCols(issue, "name"); err != nil { + return errors.Newf("UpdateIssueCols: %v", err) + } + + if issue.IsPull { + issue.PullRequest.Issue = issue + err = PrepareWebhooks(issue.Repo, HookEventTypePullRequest, &apiv1types.WebhookPullRequestPayload{ + Action: apiv1types.WebhookIssueEdited, + Index: issue.Index, + PullRequest: issue.PullRequest.APIFormat(), + Changes: &apiv1types.WebhookChangesPayload{ + Title: &apiv1types.WebhookChangesFromPayload{ + From: oldTitle, + }, + }, + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } else { + err = PrepareWebhooks(issue.Repo, HookEventTypeIssues, &apiv1types.WebhookIssuesPayload{ + Action: apiv1types.WebhookIssueEdited, + Index: issue.Index, + Issue: issue.APIFormat(), + Changes: &apiv1types.WebhookChangesPayload{ + Title: &apiv1types.WebhookChangesFromPayload{ + From: oldTitle, + }, + }, + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } + if err != nil { + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + } + + return nil +} + +func (issue *Issue) ChangeContent(doer *User, content string) (err error) { + oldContent := issue.Content + issue.Content = content + if err = UpdateIssueCols(issue, "content"); err != nil { + return errors.Newf("UpdateIssueCols: %v", err) + } + + if issue.IsPull { + issue.PullRequest.Issue = issue + err = PrepareWebhooks(issue.Repo, HookEventTypePullRequest, &apiv1types.WebhookPullRequestPayload{ + Action: apiv1types.WebhookIssueEdited, + Index: issue.Index, + PullRequest: issue.PullRequest.APIFormat(), + Changes: &apiv1types.WebhookChangesPayload{ + Body: &apiv1types.WebhookChangesFromPayload{ + From: oldContent, + }, + }, + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } else { + err = PrepareWebhooks(issue.Repo, HookEventTypeIssues, &apiv1types.WebhookIssuesPayload{ + Action: apiv1types.WebhookIssueEdited, + Index: issue.Index, + Issue: issue.APIFormat(), + Changes: &apiv1types.WebhookChangesPayload{ + Body: &apiv1types.WebhookChangesFromPayload{ + From: oldContent, + }, + }, + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } + if err != nil { + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + } + + return nil +} + +func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) { + issue.AssigneeID = assigneeID + if err = UpdateIssueUserByAssignee(issue); err != nil { + return errors.Newf("UpdateIssueUserByAssignee: %v", err) + } + + issue.Assignee, err = Handle.Users().GetByID(context.TODO(), issue.AssigneeID) + if err != nil && !IsErrUserNotExist(err) { + log.Error("Failed to get user by ID: %v", err) + return nil + } + + // Error not nil here means user does not exist, which is remove assignee. + isRemoveAssignee := err != nil + if issue.IsPull { + issue.PullRequest.Issue = issue + apiPullRequest := &apiv1types.WebhookPullRequestPayload{ + Index: issue.Index, + PullRequest: issue.PullRequest.APIFormat(), + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + } + if isRemoveAssignee { + apiPullRequest.Action = apiv1types.WebhookIssueUnassigned + } else { + apiPullRequest.Action = apiv1types.WebhookIssueAssigned + } + err = PrepareWebhooks(issue.Repo, HookEventTypePullRequest, apiPullRequest) + } else { + apiIssues := &apiv1types.WebhookIssuesPayload{ + Index: issue.Index, + Issue: issue.APIFormat(), + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + } + if isRemoveAssignee { + apiIssues.Action = apiv1types.WebhookIssueUnassigned + } else { + apiIssues.Action = apiv1types.WebhookIssueAssigned + } + err = PrepareWebhooks(issue.Repo, HookEventTypeIssues, apiIssues) + } + if err != nil { + log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, isRemoveAssignee, err) + } + + return nil +} + +type NewIssueOptions struct { + Repo *Repository + Issue *Issue + LableIDs []int64 + Attachments []string // In UUID format. + IsPull bool +} + +func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) { + opts.Issue.Title = strings.TrimSpace(opts.Issue.Title) + opts.Issue.Index = opts.Repo.NextIssueIndex() + + if opts.Issue.MilestoneID > 0 { + milestone, err := getMilestoneByRepoID(e, opts.Issue.RepoID, opts.Issue.MilestoneID) + if err != nil && !IsErrMilestoneNotExist(err) { + return errors.Newf("getMilestoneByID: %v", err) + } + + // Assume milestone is invalid and drop silently. + opts.Issue.MilestoneID = 0 + if milestone != nil { + opts.Issue.MilestoneID = milestone.ID + opts.Issue.Milestone = milestone + if err = changeMilestoneAssign(e, opts.Issue, -1); err != nil { + return err + } + } + } + + if opts.Issue.AssigneeID > 0 { + assignee, err := getUserByID(e, opts.Issue.AssigneeID) + if err != nil && !IsErrUserNotExist(err) { + return errors.Newf("get user by ID: %v", err) + } + + if assignee != nil { + opts.Issue.AssigneeID = assignee.ID + opts.Issue.Assignee = assignee + } else { + // The assignee does not exist, drop it + opts.Issue.AssigneeID = 0 + } + } + + // Milestone and assignee validation should happen before insert actual object. + if _, err = e.Insert(opts.Issue); err != nil { + return err + } + + if opts.IsPull { + _, err = e.Exec("UPDATE `repository` SET num_pulls = num_pulls + 1 WHERE id = ?", opts.Issue.RepoID) + } else { + _, err = e.Exec("UPDATE `repository` SET num_issues = num_issues + 1 WHERE id = ?", opts.Issue.RepoID) + } + if err != nil { + return err + } + + if len(opts.LableIDs) > 0 { + // During the session, SQLite3 driver cannot handle retrieve objects after update something. + // So we have to get all needed labels first. + labels := make([]*Label, 0, len(opts.LableIDs)) + if err = e.In("id", opts.LableIDs).Find(&labels); err != nil { + return errors.Newf("find all labels [label_ids: %v]: %v", opts.LableIDs, err) + } + + for _, label := range labels { + // Silently drop invalid labels. + if label.RepoID != opts.Repo.ID { + continue + } + + if err = opts.Issue.addLabel(e, label); err != nil { + return errors.Newf("addLabel [id: %d]: %v", label.ID, err) + } + } + } + + if err = newIssueUsers(e, opts.Repo, opts.Issue); err != nil { + return err + } + + if len(opts.Attachments) > 0 { + attachments, err := getAttachmentsByUUIDs(e, opts.Attachments) + if err != nil { + return errors.Newf("getAttachmentsByUUIDs [uuids: %v]: %v", opts.Attachments, err) + } + + for i := range attachments { + attachments[i].IssueID = opts.Issue.ID + if _, err = e.ID(attachments[i].ID).Update(attachments[i]); err != nil { + return errors.Newf("update attachment [id: %d]: %v", attachments[i].ID, err) + } + } + } + + return opts.Issue.loadAttributes(e) +} + +// NewIssue creates new issue with labels and attachments for repository. +func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, uuids []string) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = newIssue(sess, NewIssueOptions{ + Repo: repo, + Issue: issue, + LableIDs: labelIDs, + Attachments: uuids, + }); err != nil { + return errors.Newf("new issue: %v", err) + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + 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, + }); err != nil { + log.Error("NotifyWatchers: %v", err) + } + if err = issue.MailParticipants(); err != nil { + log.Error("MailParticipants: %v", err) + } + + if err = PrepareWebhooks(repo, HookEventTypeIssues, &apiv1types.WebhookIssuesPayload{ + Action: apiv1types.WebhookIssueOpened, + Index: issue.Index, + Issue: issue.APIFormat(), + Repository: repo.APIFormatLegacy(nil), + Sender: issue.Poster.APIFormat(), + }); err != nil { + log.Error("PrepareWebhooks: %v", err) + } + + return nil +} + +var _ errx.NotFound = (*ErrIssueNotExist)(nil) + +type ErrIssueNotExist struct { + args map[string]any +} + +func IsErrIssueNotExist(err error) bool { + _, ok := err.(ErrIssueNotExist) + return ok +} + +func (err ErrIssueNotExist) Error() string { + return fmt.Sprintf("issue does not exist: %v", err.args) +} + +func (ErrIssueNotExist) NotFound() bool { + return true +} + +// GetIssueByRef returns an Issue specified by a GFM reference, e.g. owner/repo#123. +func GetIssueByRef(ref string) (*Issue, error) { + before, after, ok := strings.Cut(ref, "#") + if !ok { + return nil, ErrIssueNotExist{args: map[string]any{"ref": ref}} + } + + index, _ := strconv.ParseInt(after, 10, 64) + if index == 0 { + return nil, ErrIssueNotExist{args: map[string]any{"ref": ref}} + } + + repo, err := GetRepositoryByRef(before) + if err != nil { + return nil, err + } + + issue, err := GetIssueByIndex(repo.ID, index) + if err != nil { + return nil, err + } + + return issue, issue.LoadAttributes() +} + +// GetRawIssueByIndex returns raw issue without loading attributes by index in a repository. +func GetRawIssueByIndex(repoID, index int64) (*Issue, error) { + issue := &Issue{ + RepoID: repoID, + Index: index, + } + has, err := x.Get(issue) + if err != nil { + return nil, err + } else if !has { + return nil, ErrIssueNotExist{args: map[string]any{"repoID": repoID, "index": index}} + } + return issue, nil +} + +// GetIssueByIndex returns issue by index in a repository. +func GetIssueByIndex(repoID, index int64) (*Issue, error) { + issue, err := GetRawIssueByIndex(repoID, index) + if err != nil { + return nil, err + } + return issue, issue.LoadAttributes() +} + +func getRawIssueByID(e Engine, id int64) (*Issue, error) { + issue := new(Issue) + has, err := e.ID(id).Get(issue) + if err != nil { + return nil, err + } else if !has { + return nil, ErrIssueNotExist{args: map[string]any{"issueID": id}} + } + return issue, nil +} + +func getIssueByID(e Engine, id int64) (*Issue, error) { + issue, err := getRawIssueByID(e, id) + if err != nil { + return nil, err + } + return issue, issue.loadAttributes(e) +} + +// GetIssueByID returns an issue by given ID. +func GetIssueByID(id int64) (*Issue, error) { + return getIssueByID(x, id) +} + +type IssuesOptions struct { + UserID int64 + AssigneeID int64 + RepoID int64 + PosterID int64 + MilestoneID int64 + RepoIDs []int64 + Page int + IsClosed bool + IsMention bool + IsPull bool + Labels string + SortType string +} + +// buildIssuesQuery returns nil if it foresees there won't be any value returned. +func buildIssuesQuery(opts *IssuesOptions) *xorm.Session { + sess := x.NewSession() + + if opts.Page <= 0 { + opts.Page = 1 + } + + if opts.RepoID > 0 { + sess.Where("issue.repo_id=?", opts.RepoID).And("issue.is_closed=?", opts.IsClosed) + } else if opts.RepoIDs != nil { + // In case repository IDs are provided but actually no repository has issue. + if len(opts.RepoIDs) == 0 { + return nil + } + sess.In("issue.repo_id", opts.RepoIDs).And("issue.is_closed=?", opts.IsClosed) + } else { + sess.Where("issue.is_closed=?", opts.IsClosed) + } + + if opts.AssigneeID > 0 { + sess.And("issue.assignee_id=?", opts.AssigneeID) + } else if opts.PosterID > 0 { + sess.And("issue.poster_id=?", opts.PosterID) + } + + if opts.MilestoneID > 0 { + sess.And("issue.milestone_id=?", opts.MilestoneID) + } + + sess.And("issue.is_pull=?", opts.IsPull) + + switch opts.SortType { + case "oldest": + sess.Asc("issue.created_unix") + case "recentupdate": + sess.Desc("issue.updated_unix") + case "leastupdate": + sess.Asc("issue.updated_unix") + case "mostcomment": + sess.Desc("issue.num_comments") + case "leastcomment": + sess.Asc("issue.num_comments") + case "priority": + sess.Desc("issue.priority") + default: + sess.Desc("issue.created_unix") + } + + if len(opts.Labels) > 0 && opts.Labels != "0" { + labelIDs := strings.Split(opts.Labels, ",") + if len(labelIDs) > 0 { + sess.Join("INNER", "issue_label", "issue.id = issue_label.issue_id").In("issue_label.label_id", labelIDs) + } + } + + if opts.IsMention { + sess.Join("INNER", "issue_user", "issue.id = issue_user.issue_id").And("issue_user.is_mentioned = ?", true) + + if opts.UserID > 0 { + sess.And("issue_user.uid = ?", opts.UserID) + } + } + + return sess +} + +// IssuesCount returns the number of issues by given conditions. +func IssuesCount(opts *IssuesOptions) (int64, error) { + sess := buildIssuesQuery(opts) + if sess == nil { + return 0, nil + } + + return sess.Count(&Issue{}) +} + +// Issues returns a list of issues by given conditions. +func Issues(opts *IssuesOptions) ([]*Issue, error) { + sess := buildIssuesQuery(opts) + if sess == nil { + return make([]*Issue, 0), nil + } + + sess.Limit(conf.UI.IssuePagingNum, (opts.Page-1)*conf.UI.IssuePagingNum) + + issues := make([]*Issue, 0, conf.UI.IssuePagingNum) + if err := sess.Find(&issues); err != nil { + return nil, errors.Newf("find: %v", err) + } + + // FIXME: use IssueList to improve performance. + for i := range issues { + if err := issues[i].LoadAttributes(); err != nil { + return nil, errors.Newf("LoadAttributes [%d]: %v", issues[i].ID, err) + } + } + + 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). + Distinct("poster_id"). + Find(&userIDs); err != nil { + return nil, errors.Newf("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) +} + +// .___ ____ ___ +// | | ______ ________ __ ____ | | \______ ___________ +// | |/ ___// ___/ | \_/ __ \| | / ___// __ \_ __ \ +// | |\___ \ \___ \| | /\ ___/| | /\___ \\ ___/| | \/ +// |___/____ >____ >____/ \___ >______//____ >\___ >__| +// \/ \/ \/ \/ \/ + +// IssueUser represents an issue-user relation. +type IssueUser struct { + ID int64 `gorm:"primary_key"` + UserID int64 `xorm:"uid INDEX" gorm:"column:uid;index"` + IssueID int64 + RepoID int64 `xorm:"INDEX" gorm:"index"` + MilestoneID int64 + IsRead bool + IsAssigned bool + IsMentioned bool + IsPoster bool + IsClosed bool +} + +func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error { + assignees, err := repo.getAssignees(e) + if err != nil { + return errors.Newf("getAssignees: %v", err) + } + + // Poster can be anyone, append later if not one of assignees. + isPosterAssignee := false + + // Leave a seat for poster itself to append later, but if poster is one of assignee + // and just waste 1 unit is cheaper than re-allocate memory once. + issueUsers := make([]*IssueUser, 0, len(assignees)+1) + for _, assignee := range assignees { + isPoster := assignee.ID == issue.PosterID + issueUsers = append(issueUsers, &IssueUser{ + IssueID: issue.ID, + RepoID: repo.ID, + UserID: assignee.ID, + IsPoster: isPoster, + IsAssigned: assignee.ID == issue.AssigneeID, + }) + if !isPosterAssignee && isPoster { + isPosterAssignee = true + } + } + if !isPosterAssignee { + issueUsers = append(issueUsers, &IssueUser{ + IssueID: issue.ID, + RepoID: repo.ID, + UserID: issue.PosterID, + IsPoster: true, + }) + } + + if _, err = e.Insert(issueUsers); err != nil { + return err + } + return nil +} + +// NewIssueUsers adds new issue-user relations for new issue of repository. +func NewIssueUsers(repo *Repository, issue *Issue) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = newIssueUsers(sess, repo, issue); err != nil { + return err + } + + return sess.Commit() +} + +// PairsContains returns true when pairs list contains given issue. +func PairsContains(ius []*IssueUser, issueID, uid int64) int { + for i := range ius { + if ius[i].IssueID == issueID && + ius[i].UserID == uid { + return i + } + } + return -1 +} + +// GetIssueUsers returns issue-user pairs by given repository and user. +func GetIssueUsers(rid, uid int64, isClosed bool) ([]*IssueUser, error) { + ius := make([]*IssueUser, 0, 10) + err := x.Where("is_closed=?", isClosed).Find(&ius, &IssueUser{RepoID: rid, UserID: uid}) + return ius, err +} + +// GetIssueUserPairsByRepoIds returns issue-user pairs by given repository IDs. +func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*IssueUser, error) { + if len(rids) == 0 { + return []*IssueUser{}, nil + } + + ius := make([]*IssueUser, 0, 10) + sess := x.Limit(20, (page-1)*20).Where("is_closed=?", isClosed).In("repo_id", rids) + err := sess.Find(&ius) + return ius, err +} + +// GetIssueUserPairsByMode returns issue-user pairs by given repository and user. +func GetIssueUserPairsByMode(userID, repoID int64, filterMode FilterMode, isClosed bool, page int) ([]*IssueUser, error) { + ius := make([]*IssueUser, 0, 10) + sess := x.Limit(20, (page-1)*20).Where("uid=?", userID).And("is_closed=?", isClosed) + if repoID > 0 { + sess.And("repo_id=?", repoID) + } + + switch filterMode { + case FilterModeAssign: + sess.And("is_assigned=?", true) + case FilterModeCreate: + sess.And("is_poster=?", true) + default: + return ius, nil + } + err := sess.Find(&ius) + return ius, err +} + +// updateIssueMentions extracts mentioned people from content and +// updates issue-user relations for them. +func updateIssueMentions(e Engine, issueID int64, mentions []string) error { + if len(mentions) == 0 { + return nil + } + + for i := range mentions { + mentions[i] = strings.ToLower(mentions[i]) + } + users := make([]*User, 0, len(mentions)) + + if err := e.In("lower_name", mentions).Asc("lower_name").Find(&users); err != nil { + return errors.Newf("find mentioned users: %v", err) + } + + ids := make([]int64, 0, len(mentions)) + for _, user := range users { + ids = append(ids, user.ID) + if !user.IsOrganization() || user.NumMembers == 0 { + continue + } + + memberIDs := make([]int64, 0, user.NumMembers) + orgUsers, err := getOrgUsersByOrgID(e, user.ID, 0) + if err != nil { + return errors.Newf("getOrgUsersByOrgID [%d]: %v", user.ID, err) + } + + for _, orgUser := range orgUsers { + memberIDs = append(memberIDs, orgUser.ID) + } + + ids = append(ids, memberIDs...) + } + + if err := updateIssueUsersByMentions(e, issueID, ids); err != nil { + return errors.Newf("UpdateIssueUsersByMentions: %v", err) + } + + return nil +} + +// IssueStats represents issue statistic information. +type IssueStats struct { + OpenCount, ClosedCount int64 + YourReposCount int64 + AssignCount int64 + CreateCount int64 + MentionCount int64 +} + +type FilterMode string + +const ( + FilterModeYourRepos FilterMode = "your_repositories" + FilterModeAssign FilterMode = "assigned" + FilterModeCreate FilterMode = "created_by" + FilterModeMention FilterMode = "mentioned" +) + +func parseCountResult(results []map[string][]byte) int64 { + if len(results) == 0 { + return 0 + } + for _, result := range results[0] { + count, _ := strconv.ParseInt(string(result), 10, 64) + return count + } + return 0 +} + +type IssueStatsOptions struct { + RepoID int64 + UserID int64 + Labels string + MilestoneID int64 + AssigneeID int64 + FilterMode FilterMode + IsPull bool +} + +// GetIssueStats returns issue statistic information by given conditions. +func GetIssueStats(opts *IssueStatsOptions) *IssueStats { + stats := &IssueStats{} + + countSession := func(opts *IssueStatsOptions) *xorm.Session { + sess := x.Where("issue.repo_id = ?", opts.RepoID).And("is_pull = ?", opts.IsPull) + + if len(opts.Labels) > 0 && opts.Labels != "0" { + labelIDs := tool.StringsToInt64s(strings.Split(opts.Labels, ",")) + if len(labelIDs) > 0 { + sess.Join("INNER", "issue_label", "issue.id = issue_id").In("label_id", labelIDs) + } + } + + if opts.MilestoneID > 0 { + sess.And("issue.milestone_id = ?", opts.MilestoneID) + } + + if opts.AssigneeID > 0 { + sess.And("assignee_id = ?", opts.AssigneeID) + } + + return sess + } + + switch opts.FilterMode { + case FilterModeYourRepos, FilterModeAssign: + stats.OpenCount, _ = countSession(opts). + And("is_closed = ?", false). + Count(new(Issue)) + + stats.ClosedCount, _ = countSession(opts). + And("is_closed = ?", true). + Count(new(Issue)) + case FilterModeCreate: + stats.OpenCount, _ = countSession(opts). + And("poster_id = ?", opts.UserID). + And("is_closed = ?", false). + Count(new(Issue)) + + stats.ClosedCount, _ = countSession(opts). + And("poster_id = ?", opts.UserID). + And("is_closed = ?", true). + Count(new(Issue)) + case FilterModeMention: + stats.OpenCount, _ = countSession(opts). + Join("INNER", "issue_user", "issue.id = issue_user.issue_id"). + And("issue_user.uid = ?", opts.UserID). + And("issue_user.is_mentioned = ?", true). + And("issue.is_closed = ?", false). + Count(new(Issue)) + + stats.ClosedCount, _ = countSession(opts). + Join("INNER", "issue_user", "issue.id = issue_user.issue_id"). + And("issue_user.uid = ?", opts.UserID). + And("issue_user.is_mentioned = ?", true). + And("issue.is_closed = ?", true). + Count(new(Issue)) + } + return stats +} + +// GetUserIssueStats returns issue statistic information for dashboard by given conditions. +func GetUserIssueStats(repoID, userID int64, repoIDs []int64, filterMode FilterMode, isPull bool) *IssueStats { + stats := &IssueStats{} + hasAnyRepo := repoID > 0 || len(repoIDs) > 0 + countSession := func(isClosed, isPull bool, repoID int64, repoIDs []int64) *xorm.Session { + sess := x.Where("issue.is_closed = ?", isClosed).And("issue.is_pull = ?", isPull) + + if repoID > 0 { + sess.And("repo_id = ?", repoID) + } else if len(repoIDs) > 0 { + sess.In("repo_id", repoIDs) + } + + return sess + } + + stats.AssignCount, _ = countSession(false, isPull, repoID, nil). + And("assignee_id = ?", userID). + Count(new(Issue)) + + stats.CreateCount, _ = countSession(false, isPull, repoID, nil). + And("poster_id = ?", userID). + Count(new(Issue)) + + if hasAnyRepo { + stats.YourReposCount, _ = countSession(false, isPull, repoID, repoIDs). + Count(new(Issue)) + } + + switch filterMode { + case FilterModeYourRepos: + if !hasAnyRepo { + break + } + + stats.OpenCount, _ = countSession(false, isPull, repoID, repoIDs). + Count(new(Issue)) + stats.ClosedCount, _ = countSession(true, isPull, repoID, repoIDs). + Count(new(Issue)) + case FilterModeAssign: + stats.OpenCount, _ = countSession(false, isPull, repoID, nil). + And("assignee_id = ?", userID). + Count(new(Issue)) + stats.ClosedCount, _ = countSession(true, isPull, repoID, nil). + And("assignee_id = ?", userID). + Count(new(Issue)) + case FilterModeCreate: + stats.OpenCount, _ = countSession(false, isPull, repoID, nil). + And("poster_id = ?", userID). + Count(new(Issue)) + stats.ClosedCount, _ = countSession(true, isPull, repoID, nil). + And("poster_id = ?", userID). + Count(new(Issue)) + } + + return stats +} + +// GetRepoIssueStats returns number of open and closed repository issues by given filter mode. +func GetRepoIssueStats(repoID, userID int64, filterMode FilterMode, isPull bool) (numOpen, numClosed int64) { + countSession := func(isClosed, isPull bool, repoID int64) *xorm.Session { + sess := x.Where("issue.repo_id = ?", isClosed). + And("is_pull = ?", isPull). + And("repo_id = ?", repoID) + + return sess + } + + openCountSession := countSession(false, isPull, repoID) + closedCountSession := countSession(true, isPull, repoID) + + switch filterMode { + case FilterModeAssign: + openCountSession.And("assignee_id = ?", userID) + closedCountSession.And("assignee_id = ?", userID) + case FilterModeCreate: + openCountSession.And("poster_id = ?", userID) + closedCountSession.And("poster_id = ?", userID) + } + + openResult, _ := openCountSession.Count(new(Issue)) + closedResult, _ := closedCountSession.Count(new(Issue)) + + return openResult, closedResult +} + +func updateIssue(e Engine, issue *Issue) error { + _, err := e.ID(issue.ID).AllCols().Update(issue) + return err +} + +// UpdateIssue updates all fields of given issue. +func UpdateIssue(issue *Issue) error { + return updateIssue(x, issue) +} + +func updateIssueUsersByStatus(e Engine, issueID int64, isClosed bool) error { + _, err := e.Exec("UPDATE `issue_user` SET is_closed=? WHERE issue_id=?", isClosed, issueID) + return err +} + +// UpdateIssueUsersByStatus updates issue-user relations by issue status. +func UpdateIssueUsersByStatus(issueID int64, isClosed bool) error { + return updateIssueUsersByStatus(x, issueID, isClosed) +} + +func updateIssueUserByAssignee(e *xorm.Session, issue *Issue) (err error) { + if _, err = e.Exec("UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?", false, issue.ID); err != nil { + return err + } + + // Assignee ID equals to 0 means clear assignee. + if issue.AssigneeID > 0 { + if _, err = e.Exec("UPDATE `issue_user` SET is_assigned = ? WHERE uid = ? AND issue_id = ?", true, issue.AssigneeID, issue.ID); err != nil { + return err + } + } + + return updateIssue(e, issue) +} + +// UpdateIssueUserByAssignee updates issue-user relation for assignee. +func UpdateIssueUserByAssignee(issue *Issue) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = updateIssueUserByAssignee(sess, issue); err != nil { + return err + } + + return sess.Commit() +} + +// UpdateIssueUserByRead updates issue-user relation for reading. +func UpdateIssueUserByRead(uid, issueID int64) error { + _, err := x.Exec("UPDATE `issue_user` SET is_read=? WHERE uid=? AND issue_id=?", true, uid, issueID) + return err +} + +// updateIssueUsersByMentions updates issue-user pairs by mentioning. +func updateIssueUsersByMentions(e Engine, issueID int64, uids []int64) error { + for _, uid := range uids { + iu := &IssueUser{ + UserID: uid, + IssueID: issueID, + } + has, err := e.Get(iu) + if err != nil { + return err + } + + iu.IsMentioned = true + if has { + _, err = e.ID(iu.ID).AllCols().Update(iu) + } else { + _, err = e.Insert(iu) + } + if err != nil { + return err + } + } + return nil +} diff --git a/internal/database/issue_label.go b/internal/database/issue_label.go new file mode 100644 index 00000000000..e3f827541a9 --- /dev/null +++ b/internal/database/issue_label.go @@ -0,0 +1,391 @@ +package database + +import ( + "fmt" + "html/template" + "strconv" + "strings" + + "xorm.io/xorm" + + "github.com/cockroachdb/errors" + + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/lazyregexp" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" + "gogs.io/gogs/internal/tool" +) + +var labelColorPattern = lazyregexp.New("#([a-fA-F0-9]{6})") + +// GetLabelTemplateFile loads the label template file by given name, +// then parses and returns a list of name-color pairs. +func GetLabelTemplateFile(name string) ([][2]string, error) { + data, err := getRepoInitFile("label", name) + if err != nil { + return nil, errors.Newf("getRepoInitFile: %v", err) + } + + lines := strings.Split(string(data), "\n") + list := make([][2]string, 0, len(lines)) + for i := range lines { + line := strings.TrimSpace(lines[i]) + if line == "" { + continue + } + + fields := strings.SplitN(line, " ", 2) + if len(fields) != 2 { + return nil, errors.Newf("line is malformed: %s", line) + } + + if !labelColorPattern.MatchString(fields[0]) { + return nil, errors.Newf("bad HTML color code in line: %s", line) + } + + fields[1] = strings.TrimSpace(fields[1]) + list = append(list, [2]string{fields[1], fields[0]}) + } + + return list, nil +} + +// Label represents a label of repository for issues. +type Label struct { + ID int64 + RepoID int64 `xorm:"INDEX"` + Name string + Color string `xorm:"VARCHAR(7)"` + NumIssues int + NumClosedIssues int + NumOpenIssues int `xorm:"-" json:"-" gorm:"-"` + IsChecked bool `xorm:"-" json:"-" gorm:"-"` +} + +func (l *Label) APIFormat() *apiv1types.IssueLabel { + return &apiv1types.IssueLabel{ + ID: l.ID, + Name: l.Name, + Color: strings.TrimLeft(l.Color, "#"), + } +} + +// CalOpenIssues calculates the open issues of label. +func (l *Label) CalOpenIssues() { + l.NumOpenIssues = l.NumIssues - l.NumClosedIssues +} + +// ForegroundColor calculates the text color for labels based +// on their background color. +func (l *Label) ForegroundColor() template.CSS { + if strings.HasPrefix(l.Color, "#") { + if color, err := strconv.ParseUint(l.Color[1:], 16, 64); err == nil { + r := float32(0xFF & (color >> 16)) + g := float32(0xFF & (color >> 8)) + b := float32(0xFF & color) + luminance := (0.2126*r + 0.7152*g + 0.0722*b) / 255 + + if luminance < 0.66 { + return template.CSS("#fff") + } + } + } + + // default to black + return template.CSS("#000") +} + +// NewLabels creates new label(s) for a repository. +func NewLabels(labels ...*Label) error { + _, err := x.Insert(labels) + return err +} + +var _ errx.NotFound = (*ErrLabelNotExist)(nil) + +type ErrLabelNotExist struct { + args map[string]any +} + +func IsErrLabelNotExist(err error) bool { + _, ok := err.(ErrLabelNotExist) + return ok +} + +func (err ErrLabelNotExist) Error() string { + return fmt.Sprintf("label does not exist: %v", err.args) +} + +func (ErrLabelNotExist) NotFound() bool { + return true +} + +// getLabelOfRepoByName 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. +func getLabelOfRepoByName(e Engine, repoID int64, labelName string) (*Label, error) { + if len(labelName) <= 0 { + return nil, ErrLabelNotExist{args: map[string]any{"repoID": repoID}} + } + + l := &Label{ + Name: labelName, + RepoID: repoID, + } + has, err := e.Get(l) + if err != nil { + return nil, err + } else if !has { + return nil, ErrLabelNotExist{args: map[string]any{"repoID": repoID}} + } + return l, nil +} + +// getLabelInRepoByID returns a label by ID in given repository. +// If pass repoID as 0, then ORM will ignore limitation of repository +// and can return arbitrary label with any valid ID. +func getLabelOfRepoByID(e Engine, repoID, labelID int64) (*Label, error) { + if labelID <= 0 { + return nil, ErrLabelNotExist{args: map[string]any{"repoID": repoID, "labelID": labelID}} + } + + l := &Label{ + ID: labelID, + RepoID: repoID, + } + has, err := e.Get(l) + if err != nil { + return nil, err + } else if !has { + return nil, ErrLabelNotExist{args: map[string]any{"repoID": repoID, "labelID": labelID}} + } + return l, nil +} + +// GetLabelByID returns a label by given ID. +func GetLabelByID(id int64) (*Label, error) { + return getLabelOfRepoByID(x, 0, id) +} + +// GetLabelOfRepoByID returns a label by ID in given repository. +func GetLabelOfRepoByID(repoID, labelID int64) (*Label, error) { + return getLabelOfRepoByID(x, repoID, labelID) +} + +// GetLabelOfRepoByName returns a label by name in given repository. +func GetLabelOfRepoByName(repoID int64, labelName string) (*Label, error) { + return getLabelOfRepoByName(x, repoID, labelName) +} + +// GetLabelsInRepoByIDs returns a list of labels by IDs in given repository, +// it silently ignores label IDs that are not belong to the repository. +func GetLabelsInRepoByIDs(repoID int64, labelIDs []int64) ([]*Label, error) { + labels := make([]*Label, 0, len(labelIDs)) + return labels, x.Where("repo_id = ?", repoID).In("id", tool.Int64sToStrings(labelIDs)).Asc("name").Find(&labels) +} + +// GetLabelsByRepoID returns all labels that belong to given repository by ID. +func GetLabelsByRepoID(repoID int64) ([]*Label, error) { + labels := make([]*Label, 0, 10) + return labels, x.Where("repo_id = ?", repoID).Asc("name").Find(&labels) +} + +func getLabelsByIssueID(e Engine, issueID int64) ([]*Label, error) { + issueLabels, err := getIssueLabels(e, issueID) + if err != nil { + return nil, errors.Newf("getIssueLabels: %v", err) + } else if len(issueLabels) == 0 { + return []*Label{}, nil + } + + labelIDs := make([]int64, len(issueLabels)) + for i := range issueLabels { + labelIDs[i] = issueLabels[i].LabelID + } + + labels := make([]*Label, 0, len(labelIDs)) + return labels, e.Where("id > 0").In("id", tool.Int64sToStrings(labelIDs)).Asc("name").Find(&labels) +} + +// GetLabelsByIssueID returns all labels that belong to given issue by ID. +func GetLabelsByIssueID(issueID int64) ([]*Label, error) { + return getLabelsByIssueID(x, issueID) +} + +func updateLabel(e Engine, l *Label) error { + _, err := e.ID(l.ID).AllCols().Update(l) + return err +} + +// UpdateLabel updates label information. +func UpdateLabel(l *Label) error { + return updateLabel(x, l) +} + +// DeleteLabel delete a label of given repository. +func DeleteLabel(repoID, labelID int64) error { + _, err := GetLabelOfRepoByID(repoID, labelID) + if err != nil { + if IsErrLabelNotExist(err) { + return nil + } + return err + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.ID(labelID).Delete(new(Label)); err != nil { + return err + } else if _, err = sess.Where("label_id = ?", labelID).Delete(new(IssueLabel)); err != nil { + return err + } + + return sess.Commit() +} + +// .___ .____ ___. .__ +// | | ______ ________ __ ____ | | _____ \_ |__ ____ | | +// | |/ ___// ___/ | \_/ __ \| | \__ \ | __ \_/ __ \| | +// | |\___ \ \___ \| | /\ ___/| |___ / __ \| \_\ \ ___/| |__ +// |___/____ >____ >____/ \___ >_______ (____ /___ /\___ >____/ +// \/ \/ \/ \/ \/ \/ \/ + +// IssueLabel represents an issue-lable relation. +type IssueLabel struct { + ID int64 + IssueID int64 `xorm:"UNIQUE(s)"` + LabelID int64 `xorm:"UNIQUE(s)"` +} + +func hasIssueLabel(e Engine, issueID, labelID int64) bool { + has, _ := e.Where("issue_id = ? AND label_id = ?", issueID, labelID).Get(new(IssueLabel)) + return has +} + +// HasIssueLabel returns true if issue has been labeled. +func HasIssueLabel(issueID, labelID int64) bool { + return hasIssueLabel(x, issueID, labelID) +} + +func newIssueLabel(e *xorm.Session, issue *Issue, label *Label) (err error) { + if _, err = e.Insert(&IssueLabel{ + IssueID: issue.ID, + LabelID: label.ID, + }); err != nil { + return err + } + + label.NumIssues++ + if issue.IsClosed { + label.NumClosedIssues++ + } + + if err = updateLabel(e, label); err != nil { + return errors.Newf("updateLabel: %v", err) + } + + issue.Labels = append(issue.Labels, label) + return nil +} + +// NewIssueLabel creates a new issue-label relation. +func NewIssueLabel(issue *Issue, label *Label) (err error) { + if HasIssueLabel(issue.ID, label.ID) { + return nil + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = newIssueLabel(sess, issue, label); err != nil { + return err + } + + return sess.Commit() +} + +func newIssueLabels(e *xorm.Session, issue *Issue, labels []*Label) (err error) { + for i := range labels { + if hasIssueLabel(e, issue.ID, labels[i].ID) { + continue + } + + if err = newIssueLabel(e, issue, labels[i]); err != nil { + return errors.Newf("newIssueLabel: %v", err) + } + } + + return nil +} + +// NewIssueLabels creates a list of issue-label relations. +func NewIssueLabels(issue *Issue, labels []*Label) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = newIssueLabels(sess, issue, labels); err != nil { + return err + } + + return sess.Commit() +} + +func getIssueLabels(e Engine, issueID int64) ([]*IssueLabel, error) { + issueLabels := make([]*IssueLabel, 0, 10) + return issueLabels, e.Where("issue_id=?", issueID).Asc("label_id").Find(&issueLabels) +} + +// GetIssueLabels returns all issue-label relations of given issue by ID. +func GetIssueLabels(issueID int64) ([]*IssueLabel, error) { + return getIssueLabels(x, issueID) +} + +func deleteIssueLabel(e *xorm.Session, issue *Issue, label *Label) (err error) { + if _, err = e.Delete(&IssueLabel{ + IssueID: issue.ID, + LabelID: label.ID, + }); err != nil { + return err + } + + label.NumIssues-- + if issue.IsClosed { + label.NumClosedIssues-- + } + if err = updateLabel(e, label); err != nil { + return errors.Newf("updateLabel: %v", err) + } + + for i := range issue.Labels { + if issue.Labels[i].ID == label.ID { + issue.Labels = append(issue.Labels[:i], issue.Labels[i+1:]...) + break + } + } + return nil +} + +// DeleteIssueLabel deletes issue-label relation. +func DeleteIssueLabel(issue *Issue, label *Label) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = deleteIssueLabel(sess, issue, label); err != nil { + return err + } + + return sess.Commit() +} diff --git a/internal/database/issue_mail.go b/internal/database/issue_mail.go new file mode 100644 index 00000000000..6144e710077 --- /dev/null +++ b/internal/database/issue_mail.go @@ -0,0 +1,192 @@ +package database + +import ( + "context" + "fmt" + + "github.com/cockroachdb/errors" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/email" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/strx" + "gogs.io/gogs/internal/userx" +) + +func (issue *Issue) MailSubject() string { + return fmt.Sprintf("[%s] %s (#%d)", issue.Repo.Name, issue.Title, issue.Index) +} + +// mailerUser is a wrapper for satisfying mailer.User interface. +type mailerUser struct { + user *User +} + +func (mu mailerUser) ID() int64 { + return mu.user.ID +} + +func (mu mailerUser) DisplayName() string { + return mu.user.DisplayName() +} + +func (mu mailerUser) Email() string { + return mu.user.Email +} + +func (mu mailerUser) GenerateEmailActivateCode(email string) string { + return userx.GenerateActivateCode( + mu.user.ID, + email, + mu.user.Name, + mu.user.Password, + mu.user.Rands, + ) +} + +func NewMailerUser(u *User) email.User { + return mailerUser{u} +} + +// mailerRepo is a wrapper for satisfying mailer.Repository interface. +type mailerRepo struct { + repo *Repository +} + +func (mr mailerRepo) FullName() string { + return mr.repo.FullName() +} + +func (mr mailerRepo) HTMLURL() string { + return mr.repo.HTMLURL() +} + +func (mr mailerRepo) ComposeMetas() map[string]string { + return mr.repo.ComposeMetas() +} + +func NewMailerRepo(repo *Repository) email.Repository { + return mailerRepo{repo} +} + +// mailerIssue is a wrapper for satisfying mailer.Issue interface. +type mailerIssue struct { + issue *Issue +} + +func (mi mailerIssue) MailSubject() string { + return mi.issue.MailSubject() +} + +func (mi mailerIssue) Content() string { + return mi.issue.Content +} + +func (mi mailerIssue) HTMLURL() string { + return mi.issue.HTMLURL() +} + +func NewMailerIssue(issue *Issue) email.Issue { + return mailerIssue{issue} +} + +// mailIssueCommentToParticipants can be used for both new issue creation and comment. +// This functions sends two list of emails: +// 1. Repository watchers, users who participated in comments and the assignee. +// 2. Users who are not in 1. but get mentioned in current issue/comment. +func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string) error { + ctx := context.TODO() + + if !conf.User.EnableEmailNotification { + return nil + } + + watchers, err := GetWatchers(issue.RepoID) + if err != nil { + return errors.Newf("GetWatchers [repo_id: %d]: %v", issue.RepoID, err) + } + participants, err := GetParticipantsByIssueID(issue.ID) + if err != nil { + return errors.Newf("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) + } + + tos := make([]string, 0, len(watchers)) // List of email addresses + names := make([]string, 0, len(watchers)) + for i := range watchers { + if watchers[i].UserID == doer.ID { + continue + } + + to, err := Handle.Users().GetByID(ctx, watchers[i].UserID) + if err != nil { + return errors.Newf("GetUserByID [%d]: %v", watchers[i].UserID, err) + } + if to.IsOrganization() || !to.IsActive { + continue + } + + tos = append(tos, to.Email) + names = append(names, to.Name) + } + for i := range participants { + if participants[i].ID == doer.ID { + continue + } else if strx.ContainsFold(names, participants[i].Name) { + continue + } + + tos = append(tos, participants[i].Email) + names = append(names, participants[i].Name) + } + if issue.Assignee != nil && issue.Assignee.ID != doer.ID { + if !strx.ContainsFold(names, issue.Assignee.Name) { + tos = append(tos, issue.Assignee.Email) + names = append(names, issue.Assignee.Name) + } + } + if err = email.SendIssueCommentMail(NewMailerIssue(issue), NewMailerRepo(issue.Repo), NewMailerUser(doer), tos); err != nil { + return errors.Wrap(err, "send issue comment mail") + } + + // Mail mentioned people and exclude watchers. + names = append(names, doer.Name) + toUsernames := make([]string, 0, len(mentions)) // list of user names. + for i := range mentions { + if strx.ContainsFold(names, mentions[i]) { + continue + } + + toUsernames = append(toUsernames, mentions[i]) + } + + tos, err = Handle.Users().GetMailableEmailsByUsernames(ctx, toUsernames) + if err != nil { + return errors.Wrap(err, "get mailable emails by usernames") + } + if err = email.SendIssueMentionMail(NewMailerIssue(issue), NewMailerRepo(issue.Repo), NewMailerUser(doer), tos); err != nil { + return errors.Wrap(err, "send issue mention mail") + } + return nil +} + +// MailParticipants sends new issue thread created emails to repository watchers +// and mentioned people. +func (issue *Issue) MailParticipants() (err error) { + mentions := markup.FindAllMentions(issue.Content) + if err = updateIssueMentions(x, issue.ID, mentions); err != nil { + return errors.Newf("UpdateIssueMentions [%d]: %v", issue.ID, err) + } + + if err = mailIssueCommentToParticipants(issue, issue.Poster, mentions); err != nil { + log.Error("mailIssueCommentToParticipants: %v", err) + } + + return nil +} diff --git a/internal/database/lfs.go b/internal/database/lfs.go new file mode 100644 index 00000000000..5b2a6e590fe --- /dev/null +++ b/internal/database/lfs.go @@ -0,0 +1,87 @@ +package database + +import ( + "context" + "fmt" + "time" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/lfsx" +) + +// LFSObject is the relation between an LFS object and a repository. +type LFSObject struct { + RepoID int64 `gorm:"primaryKey;auto_increment:false"` + OID lfsx.OID `gorm:"primaryKey;column:oid"` + Size int64 `gorm:"not null"` + Storage lfsx.Storage `gorm:"not null"` + CreatedAt time.Time `gorm:"not null"` +} + +// LFSStore is the storage layer for LFS objects. +type LFSStore struct { + db *gorm.DB +} + +func newLFSStore(db *gorm.DB) *LFSStore { + return &LFSStore{db: db} +} + +// CreateObject creates an LFS object record in database. +func (s *LFSStore) CreateObject(ctx context.Context, repoID int64, oid lfsx.OID, size int64, storage lfsx.Storage) error { + object := &LFSObject{ + RepoID: repoID, + OID: oid, + Size: size, + Storage: storage, + } + return s.db.WithContext(ctx).Create(object).Error +} + +type ErrLFSObjectNotExist struct { + args errx.Args +} + +func IsErrLFSObjectNotExist(err error) bool { + return errors.As(err, &ErrLFSObjectNotExist{}) +} + +func (err ErrLFSObjectNotExist) Error() string { + return fmt.Sprintf("LFS object does not exist: %v", err.args) +} + +func (ErrLFSObjectNotExist) NotFound() bool { + return true +} + +// GetObjectByOID returns the LFS object with given OID. It returns +// ErrLFSObjectNotExist when not found. +func (s *LFSStore) GetObjectByOID(ctx context.Context, repoID int64, oid lfsx.OID) (*LFSObject, error) { + object := new(LFSObject) + err := s.db.WithContext(ctx).Where("repo_id = ? AND oid = ?", repoID, oid).First(object).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrLFSObjectNotExist{args: errx.Args{"repoID": repoID, "oid": oid}} + } + return nil, err + } + return object, err +} + +// GetObjectsByOIDs returns LFS objects found within "oids". The returned list +// could have fewer elements if some oids were not found. +func (s *LFSStore) GetObjectsByOIDs(ctx context.Context, repoID int64, oids ...lfsx.OID) ([]*LFSObject, error) { + if len(oids) == 0 { + return []*LFSObject{}, nil + } + + objects := make([]*LFSObject, 0, len(oids)) + err := s.db.WithContext(ctx).Where("repo_id = ? AND oid IN (?)", repoID, oids).Find(&objects).Error + if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + return nil, err + } + return objects, nil +} diff --git a/internal/database/lfs_test.go b/internal/database/lfs_test.go new file mode 100644 index 00000000000..64c45a90fd3 --- /dev/null +++ b/internal/database/lfs_test.go @@ -0,0 +1,101 @@ +package database + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/lfsx" +) + +func TestLFS(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + s := &LFSStore{ + db: newTestDB(t, "LFSStore"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *LFSStore) + }{ + {"CreateObject", lfsCreateObject}, + {"GetObjectByOID", lfsGetObjectByOID}, + {"GetObjectsByOIDs", lfsGetObjectsByOIDs}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func lfsCreateObject(t *testing.T, ctx context.Context, s *LFSStore) { + // Create first LFS object + repoID := int64(1) + oid := lfsx.OID("ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f") + err := s.CreateObject(ctx, repoID, oid, 12, lfsx.StorageLocal) + require.NoError(t, err) + + // Get it back and check the CreatedAt field + object, err := s.GetObjectByOID(ctx, repoID, oid) + require.NoError(t, err) + assert.Equal(t, s.db.NowFunc().Format(time.RFC3339), object.CreatedAt.UTC().Format(time.RFC3339)) + + // Try to create second LFS object with same oid should fail + err = s.CreateObject(ctx, repoID, oid, 12, lfsx.StorageLocal) + assert.Error(t, err) +} + +func lfsGetObjectByOID(t *testing.T, ctx context.Context, s *LFSStore) { + // Create a LFS object + repoID := int64(1) + oid := lfsx.OID("ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f") + err := s.CreateObject(ctx, repoID, oid, 12, lfsx.StorageLocal) + require.NoError(t, err) + + // We should be able to get it back + _, err = s.GetObjectByOID(ctx, repoID, oid) + require.NoError(t, err) + + // Try to get a non-existent object + _, err = s.GetObjectByOID(ctx, repoID, "bad_oid") + expErr := ErrLFSObjectNotExist{args: errx.Args{"repoID": repoID, "oid": lfsx.OID("bad_oid")}} + assert.Equal(t, expErr, err) +} + +func lfsGetObjectsByOIDs(t *testing.T, ctx context.Context, s *LFSStore) { + // Create two LFS objects + repoID := int64(1) + oid1 := lfsx.OID("ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f") + oid2 := lfsx.OID("ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64g") + err := s.CreateObject(ctx, repoID, oid1, 12, lfsx.StorageLocal) + require.NoError(t, err) + err = s.CreateObject(ctx, repoID, oid2, 12, lfsx.StorageLocal) + require.NoError(t, err) + + // We should be able to get them back and ignore non-existent ones + objects, err := s.GetObjectsByOIDs(ctx, repoID, oid1, oid2, "bad_oid") + require.NoError(t, err) + assert.Equal(t, 2, len(objects), "number of objects") + + assert.Equal(t, repoID, objects[0].RepoID) + assert.Equal(t, oid1, objects[0].OID) + + assert.Equal(t, repoID, objects[1].RepoID) + assert.Equal(t, oid2, objects[1].OID) +} diff --git a/internal/database/login_source_files.go b/internal/database/login_source_files.go new file mode 100644 index 00000000000..dc7ca5f3fc7 --- /dev/null +++ b/internal/database/login_source_files.go @@ -0,0 +1,238 @@ +package database + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/cockroachdb/errors" + "gopkg.in/ini.v1" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/auth/github" + "gogs.io/gogs/internal/auth/ldap" + "gogs.io/gogs/internal/auth/pam" + "gogs.io/gogs/internal/auth/smtp" + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/osx" +) + +// loginSourceFilesStore is the in-memory interface for login source files stored on file system. +type loginSourceFilesStore interface { + // GetByID returns a clone of login source by given ID. + GetByID(id int64) (*LoginSource, error) + // Len returns number of login sources. + Len() int + // List returns a list of login sources filtered by options. + List(opts ListLoginSourceOptions) []*LoginSource + // Update updates in-memory copy of the authentication source. + Update(source *LoginSource) +} + +var _ loginSourceFilesStore = (*loginSourceFiles)(nil) + +// loginSourceFiles contains authentication sources configured and loaded from local files. +type loginSourceFiles struct { + sync.RWMutex + sources []*LoginSource + clock func() time.Time +} + +var _ errx.NotFound = (*ErrLoginSourceNotExist)(nil) + +type ErrLoginSourceNotExist struct { + args errx.Args +} + +func IsErrLoginSourceNotExist(err error) bool { + return errors.As(err, &ErrLoginSourceNotExist{}) +} + +func (err ErrLoginSourceNotExist) Error() string { + return fmt.Sprintf("login source does not exist: %v", err.args) +} + +func (ErrLoginSourceNotExist) NotFound() bool { + return true +} + +func (s *loginSourceFiles) GetByID(id int64) (*LoginSource, error) { + s.RLock() + defer s.RUnlock() + + for _, source := range s.sources { + if source.ID == id { + return source, nil + } + } + + return nil, ErrLoginSourceNotExist{args: errx.Args{"id": id}} +} + +func (s *loginSourceFiles) Len() int { + s.RLock() + defer s.RUnlock() + return len(s.sources) +} + +func (s *loginSourceFiles) List(opts ListLoginSourceOptions) []*LoginSource { + s.RLock() + defer s.RUnlock() + + list := make([]*LoginSource, 0, s.Len()) + for _, source := range s.sources { + if opts.OnlyActivated && !source.IsActived { + continue + } + + list = append(list, source) + } + return list +} + +func (s *loginSourceFiles) Update(source *LoginSource) { + s.Lock() + defer s.Unlock() + + source.Updated = s.clock() + for _, old := range s.sources { + if old.ID == source.ID { + *old = *source + } else if source.IsDefault { + old.IsDefault = false + } + } +} + +// loadLoginSourceFiles loads login sources from file system. +func loadLoginSourceFiles(authdPath string, clock func() time.Time) (loginSourceFilesStore, error) { + if !osx.IsDir(authdPath) { + return &loginSourceFiles{clock: clock}, nil + } + + store := &loginSourceFiles{clock: clock} + return store, filepath.Walk(authdPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if path == authdPath || !strings.HasSuffix(path, ".conf") { + return nil + } else if info.IsDir() { + return filepath.SkipDir + } + + authSource, err := ini.Load(path) + if err != nil { + return errors.Wrap(err, "load file") + } + authSource.NameMapper = ini.TitleUnderscore + + // Set general attributes + s := authSource.Section("") + loginSource := &LoginSource{ + ID: s.Key("id").MustInt64(), + Name: s.Key("name").String(), + IsActived: s.Key("is_activated").MustBool(), + IsDefault: s.Key("is_default").MustBool(), + File: &loginSourceFile{ + path: path, + file: authSource, + }, + } + + fi, err := os.Stat(path) + if err != nil { + return errors.Wrap(err, "stat file") + } + loginSource.Updated = fi.ModTime() + + // Parse authentication source file + authType := s.Key("type").String() + cfgSection := authSource.Section("config") + switch authType { + case "ldap_bind_dn": + var cfg ldap.Config + err = cfgSection.MapTo(&cfg) + if err != nil { + return errors.Wrap(err, `map "config" section`) + } + loginSource.Type = auth.LDAP + loginSource.Provider = ldap.NewProvider(false, &cfg) + + case "ldap_simple_auth": + var cfg ldap.Config + err = cfgSection.MapTo(&cfg) + if err != nil { + return errors.Wrap(err, `map "config" section`) + } + loginSource.Type = auth.DLDAP + loginSource.Provider = ldap.NewProvider(true, &cfg) + + case "smtp": + var cfg smtp.Config + err = cfgSection.MapTo(&cfg) + if err != nil { + return errors.Wrap(err, `map "config" section`) + } + loginSource.Type = auth.SMTP + loginSource.Provider = smtp.NewProvider(&cfg) + + case "pam": + var cfg pam.Config + err = cfgSection.MapTo(&cfg) + if err != nil { + return errors.Wrap(err, `map "config" section`) + } + loginSource.Type = auth.PAM + loginSource.Provider = pam.NewProvider(&cfg) + + case "github": + var cfg github.Config + err = cfgSection.MapTo(&cfg) + if err != nil { + return errors.Wrap(err, `map "config" section`) + } + loginSource.Type = auth.GitHub + loginSource.Provider = github.NewProvider(&cfg) + + default: + return errors.Newf("unknown type %q", authType) + } + + store.sources = append(store.sources, loginSource) + return nil + }) +} + +// loginSourceFileStore is the persistent interface for a login source file. +type loginSourceFileStore interface { + // SetGeneral sets new value to the given key in the general (default) section. + SetGeneral(name, value string) + // SetConfig sets new values to the "config" section. + SetConfig(cfg any) error + // Save persists values to file system. + Save() error +} + +var _ loginSourceFileStore = (*loginSourceFile)(nil) + +type loginSourceFile struct { + path string + file *ini.File +} + +func (f *loginSourceFile) SetGeneral(name, value string) { + f.file.Section("").Key(name).SetValue(value) +} + +func (f *loginSourceFile) SetConfig(cfg any) error { + return f.file.Section("config").ReflectFrom(cfg) +} + +func (f *loginSourceFile) Save() error { + return f.file.SaveTo(f.path) +} diff --git a/internal/database/login_source_files_test.go b/internal/database/login_source_files_test.go new file mode 100644 index 00000000000..26c79878aba --- /dev/null +++ b/internal/database/login_source_files_test.go @@ -0,0 +1,83 @@ +package database + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gogs.io/gogs/internal/errx" +) + +func TestLoginSourceFiles_GetByID(t *testing.T) { + store := &loginSourceFiles{ + sources: []*LoginSource{ + {ID: 101}, + }, + } + + t.Run("source does not exist", func(t *testing.T) { + _, err := store.GetByID(1) + wantErr := ErrLoginSourceNotExist{args: errx.Args{"id": int64(1)}} + assert.Equal(t, wantErr, err) + }) + + t.Run("source exists", func(t *testing.T) { + source, err := store.GetByID(101) + require.NoError(t, err) + assert.Equal(t, int64(101), source.ID) + }) +} + +func TestLoginSourceFiles_Len(t *testing.T) { + store := &loginSourceFiles{ + sources: []*LoginSource{ + {ID: 101}, + }, + } + + assert.Equal(t, 1, store.Len()) +} + +func TestLoginSourceFiles_List(t *testing.T) { + store := &loginSourceFiles{ + sources: []*LoginSource{ + {ID: 101, IsActived: true}, + {ID: 102, IsActived: false}, + }, + } + + t.Run("list all sources", func(t *testing.T) { + sources := store.List(ListLoginSourceOptions{}) + assert.Equal(t, 2, len(sources), "number of sources") + }) + + t.Run("list only activated sources", func(t *testing.T) { + sources := store.List(ListLoginSourceOptions{OnlyActivated: true}) + assert.Equal(t, 1, len(sources), "number of sources") + assert.Equal(t, int64(101), sources[0].ID) + }) +} + +func TestLoginSourceFiles_Update(t *testing.T) { + store := &loginSourceFiles{ + sources: []*LoginSource{ + {ID: 101, IsActived: true, IsDefault: true}, + {ID: 102, IsActived: false}, + }, + clock: time.Now, + } + + source102 := &LoginSource{ + ID: 102, + IsActived: true, + IsDefault: true, + } + store.Update(source102) + + assert.False(t, store.sources[0].IsDefault) + + assert.True(t, store.sources[1].IsActived) + assert.True(t, store.sources[1].IsDefault) +} diff --git a/internal/database/login_sources.go b/internal/database/login_sources.go new file mode 100644 index 00000000000..236c0381463 --- /dev/null +++ b/internal/database/login_sources.go @@ -0,0 +1,334 @@ +package database + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "time" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/auth/github" + "gogs.io/gogs/internal/auth/ldap" + "gogs.io/gogs/internal/auth/pam" + "gogs.io/gogs/internal/auth/smtp" + "gogs.io/gogs/internal/errx" +) + +// LoginSource represents an external way for authorizing users. +type LoginSource struct { + ID int64 `gorm:"primaryKey"` + Type auth.Type + Name string `xorm:"UNIQUE" gorm:"unique"` + IsActived bool `xorm:"NOT NULL DEFAULT false" gorm:"not null"` + IsDefault bool `xorm:"DEFAULT false"` + Provider auth.Provider `xorm:"-" gorm:"-"` + Config string `xorm:"TEXT cfg" gorm:"column:cfg;type:TEXT" json:"RawConfig"` + + Created time.Time `xorm:"-" gorm:"-" json:"-"` + CreatedUnix int64 + Updated time.Time `xorm:"-" gorm:"-" json:"-"` + UpdatedUnix int64 + + File loginSourceFileStore `xorm:"-" gorm:"-" json:"-"` +} + +// BeforeSave implements the GORM save hook. +func (s *LoginSource) BeforeSave(_ *gorm.DB) (err error) { + if s.Provider == nil { + return nil + } + data, err := json.Marshal(s.Provider.Config()) + s.Config = string(data) + return err +} + +// BeforeCreate implements the GORM create hook. +func (s *LoginSource) BeforeCreate(tx *gorm.DB) error { + if s.CreatedUnix == 0 { + s.CreatedUnix = tx.NowFunc().Unix() + s.UpdatedUnix = s.CreatedUnix + } + return nil +} + +// BeforeUpdate implements the GORM update hook. +func (s *LoginSource) BeforeUpdate(tx *gorm.DB) error { + s.UpdatedUnix = tx.NowFunc().Unix() + return nil +} + +type mockProviderConfig struct { + ExternalAccount *auth.ExternalAccount +} + +// AfterFind implements the GORM query hook. +func (s *LoginSource) AfterFind(_ *gorm.DB) error { + s.Created = time.Unix(s.CreatedUnix, 0).Local() + s.Updated = time.Unix(s.UpdatedUnix, 0).Local() + + switch s.Type { + case auth.LDAP: + var cfg ldap.Config + err := json.Unmarshal([]byte(s.Config), &cfg) + if err != nil { + return err + } + s.Provider = ldap.NewProvider(false, &cfg) + + case auth.DLDAP: + var cfg ldap.Config + err := json.Unmarshal([]byte(s.Config), &cfg) + if err != nil { + return err + } + s.Provider = ldap.NewProvider(true, &cfg) + + case auth.SMTP: + var cfg smtp.Config + err := json.Unmarshal([]byte(s.Config), &cfg) + if err != nil { + return err + } + s.Provider = smtp.NewProvider(&cfg) + + case auth.PAM: + var cfg pam.Config + err := json.Unmarshal([]byte(s.Config), &cfg) + if err != nil { + return err + } + s.Provider = pam.NewProvider(&cfg) + + case auth.GitHub: + var cfg github.Config + err := json.Unmarshal([]byte(s.Config), &cfg) + if err != nil { + return err + } + s.Provider = github.NewProvider(&cfg) + + case auth.Mock: + var cfg mockProviderConfig + err := json.Unmarshal([]byte(s.Config), &cfg) + if err != nil { + return err + } + mockProvider := NewMockProvider() + mockProvider.AuthenticateFunc.SetDefaultReturn(cfg.ExternalAccount, nil) + s.Provider = mockProvider + + default: + return errors.Newf("unrecognized login source type: %v", s.Type) + } + return nil +} + +func (s *LoginSource) TypeName() string { + return auth.Name(s.Type) +} + +func (s *LoginSource) IsLDAP() bool { + return s.Type == auth.LDAP +} + +func (s *LoginSource) IsDLDAP() bool { + return s.Type == auth.DLDAP +} + +func (s *LoginSource) IsSMTP() bool { + return s.Type == auth.SMTP +} + +func (s *LoginSource) IsPAM() bool { + return s.Type == auth.PAM +} + +func (s *LoginSource) IsGitHub() bool { + return s.Type == auth.GitHub +} + +func (s *LoginSource) LDAP() *ldap.Config { + return s.Provider.Config().(*ldap.Config) +} + +func (s *LoginSource) SMTP() *smtp.Config { + return s.Provider.Config().(*smtp.Config) +} + +func (s *LoginSource) PAM() *pam.Config { + return s.Provider.Config().(*pam.Config) +} + +func (s *LoginSource) GitHub() *github.Config { + return s.Provider.Config().(*github.Config) +} + +// LoginSourcesStore is the storage layer for login sources. +type LoginSourcesStore struct { + db *gorm.DB + files loginSourceFilesStore +} + +func newLoginSourcesStore(db *gorm.DB, files loginSourceFilesStore) *LoginSourcesStore { + return &LoginSourcesStore{ + db: db, + files: files, + } +} + +type CreateLoginSourceOptions struct { + Type auth.Type + Name string + Activated bool + Default bool + Config any +} + +type ErrLoginSourceAlreadyExist struct { + args errx.Args +} + +func IsErrLoginSourceAlreadyExist(err error) bool { + return errors.As(err, &ErrLoginSourceAlreadyExist{}) +} + +func (err ErrLoginSourceAlreadyExist) Error() string { + return fmt.Sprintf("login source already exists: %v", err.args) +} + +// Create creates a new login source and persists it to the database. It returns +// ErrLoginSourceAlreadyExist when a login source with same name already exists. +func (s *LoginSourcesStore) Create(ctx context.Context, opts CreateLoginSourceOptions) (*LoginSource, error) { + err := s.db.WithContext(ctx).Where("name = ?", opts.Name).First(new(LoginSource)).Error + if err == nil { + return nil, ErrLoginSourceAlreadyExist{args: errx.Args{"name": opts.Name}} + } else if !errors.Is(err, gorm.ErrRecordNotFound) { + return nil, err + } + + source := &LoginSource{ + Type: opts.Type, + Name: opts.Name, + IsActived: opts.Activated, + IsDefault: opts.Default, + } + data, err := json.Marshal(opts.Config) + source.Config = string(data) + if err != nil { + return nil, err + } + return source, s.db.WithContext(ctx).Create(source).Error +} + +// Count returns the total number of login sources. +func (s *LoginSourcesStore) Count(ctx context.Context) int64 { + var count int64 + s.db.WithContext(ctx).Model(new(LoginSource)).Count(&count) + return count + int64(s.files.Len()) +} + +type ErrLoginSourceInUse struct { + args errx.Args +} + +func IsErrLoginSourceInUse(err error) bool { + return errors.As(err, &ErrLoginSourceInUse{}) +} + +func (err ErrLoginSourceInUse) Error() string { + return fmt.Sprintf("login source is still used by some users: %v", err.args) +} + +// DeleteByID deletes a login source by given ID. It returns ErrLoginSourceInUse +// if at least one user is associated with the login source. +func (s *LoginSourcesStore) DeleteByID(ctx context.Context, id int64) error { + var count int64 + err := s.db.WithContext(ctx).Model(new(User)).Where("login_source = ?", id).Count(&count).Error + if err != nil { + return err + } else if count > 0 { + return ErrLoginSourceInUse{args: errx.Args{"id": id}} + } + + return s.db.WithContext(ctx).Where("id = ?", id).Delete(new(LoginSource)).Error +} + +// GetByID returns the login source with given ID. It returns +// ErrLoginSourceNotExist when not found. +func (s *LoginSourcesStore) GetByID(ctx context.Context, id int64) (*LoginSource, error) { + source := new(LoginSource) + err := s.db.WithContext(ctx).Where("id = ?", id).First(source).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return s.files.GetByID(id) + } + return nil, err + } + return source, nil +} + +type ListLoginSourceOptions struct { + // Whether to only include activated login sources. + OnlyActivated bool +} + +// List returns a list of login sources filtered by options. +func (s *LoginSourcesStore) List(ctx context.Context, opts ListLoginSourceOptions) ([]*LoginSource, error) { + var sources []*LoginSource + query := s.db.WithContext(ctx).Order("id ASC") + if opts.OnlyActivated { + query = query.Where("is_actived = ?", true) + } + err := query.Find(&sources).Error + if err != nil { + return nil, err + } + + return append(sources, s.files.List(opts)...), nil +} + +// ResetNonDefault clears default flag for all the other login sources. +func (s *LoginSourcesStore) ResetNonDefault(ctx context.Context, dflt *LoginSource) error { + err := s.db.WithContext(ctx). + Model(new(LoginSource)). + Where("id != ?", dflt.ID). + Updates(map[string]any{"is_default": false}). + Error + if err != nil { + return err + } + + for _, source := range s.files.List(ListLoginSourceOptions{}) { + if source.File != nil && source.ID != dflt.ID { + source.File.SetGeneral("is_default", "false") + if err = source.File.Save(); err != nil { + return errors.Wrap(err, "save file") + } + } + } + + s.files.Update(dflt) + return nil +} + +// Save persists all values of given login source to database or local file. The +// Updated field is set to current time automatically. +func (s *LoginSourcesStore) Save(ctx context.Context, source *LoginSource) error { + if source.File == nil { + return s.db.WithContext(ctx).Save(source).Error + } + + source.File.SetGeneral("name", source.Name) + source.File.SetGeneral("is_activated", strconv.FormatBool(source.IsActived)) + source.File.SetGeneral("is_default", strconv.FormatBool(source.IsDefault)) + if err := source.File.SetConfig(source.Provider.Config()); err != nil { + return errors.Wrap(err, "set config") + } else if err = source.File.Save(); err != nil { + return errors.Wrap(err, "save file") + } + return nil +} diff --git a/internal/database/login_sources_test.go b/internal/database/login_sources_test.go new file mode 100644 index 00000000000..d4d9ec95dfc --- /dev/null +++ b/internal/database/login_sources_test.go @@ -0,0 +1,496 @@ +package database + +import ( + "context" + "testing" + "time" + + mockrequire "github.com/derision-test/go-mockgen/v2/testutil/require" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gorm.io/gorm" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/auth/github" + "gogs.io/gogs/internal/auth/ldap" + "gogs.io/gogs/internal/auth/pam" + "gogs.io/gogs/internal/auth/smtp" + "gogs.io/gogs/internal/errx" +) + +func TestLoginSource_BeforeSave(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + t.Run("Config has not been set", func(t *testing.T) { + s := &LoginSource{} + err := s.BeforeSave(db) + require.NoError(t, err) + assert.Empty(t, s.Config) + }) + + t.Run("Config has been set", func(t *testing.T) { + s := &LoginSource{ + Provider: pam.NewProvider(&pam.Config{ + ServiceName: "pam_service", + }), + } + err := s.BeforeSave(db) + require.NoError(t, err) + assert.Equal(t, `{"ServiceName":"pam_service"}`, s.Config) + }) +} + +func TestLoginSource_BeforeCreate(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + t.Run("CreatedUnix has been set", func(t *testing.T) { + s := &LoginSource{ + CreatedUnix: 1, + } + _ = s.BeforeCreate(db) + assert.Equal(t, int64(1), s.CreatedUnix) + assert.Equal(t, int64(0), s.UpdatedUnix) + }) + + t.Run("CreatedUnix has not been set", func(t *testing.T) { + s := &LoginSource{} + _ = s.BeforeCreate(db) + assert.Equal(t, db.NowFunc().Unix(), s.CreatedUnix) + assert.Equal(t, db.NowFunc().Unix(), s.UpdatedUnix) + }) +} + +func TestLoginSource_BeforeUpdate(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + s := &LoginSource{} + _ = s.BeforeUpdate(db) + assert.Equal(t, db.NowFunc().Unix(), s.UpdatedUnix) +} + +func TestLoginSource_AfterFind(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + tests := []struct { + name string + authType auth.Type + wantType any + }{ + { + name: "LDAP", + authType: auth.LDAP, + wantType: &ldap.Provider{}, + }, + { + name: "DLDAP", + authType: auth.DLDAP, + wantType: &ldap.Provider{}, + }, + { + name: "SMTP", + authType: auth.SMTP, + wantType: &smtp.Provider{}, + }, + { + name: "PAM", + authType: auth.PAM, + wantType: &pam.Provider{}, + }, + { + name: "GitHub", + authType: auth.GitHub, + wantType: &github.Provider{}, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + s := LoginSource{ + Type: test.authType, + Config: `{}`, + CreatedUnix: now.Unix(), + UpdatedUnix: now.Unix(), + } + err := s.AfterFind(db) + require.NoError(t, err) + + assert.Equal(t, s.CreatedUnix, s.Created.Unix()) + assert.Equal(t, s.UpdatedUnix, s.Updated.Unix()) + assert.IsType(t, test.wantType, s.Provider) + }) + } +} + +func TestLoginSources(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + s := &LoginSourcesStore{ + db: newTestDB(t, "LoginSourcesStore"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *LoginSourcesStore) + }{ + {"Create", loginSourcesCreate}, + {"Count", loginSourcesCount}, + {"DeleteByID", loginSourcesDeleteByID}, + {"GetByID", loginSourcesGetByID}, + {"List", loginSourcesList}, + {"ResetNonDefault", loginSourcesResetNonDefault}, + {"Save", loginSourcesSave}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func loginSourcesCreate(t *testing.T, ctx context.Context, s *LoginSourcesStore) { + // Create first login source with name "GitHub" + source, err := s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: false, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, + }, + ) + require.NoError(t, err) + + // Get it back and check the Created field + source, err = s.GetByID(ctx, source.ID) + require.NoError(t, err) + assert.Equal(t, s.db.NowFunc().Format(time.RFC3339), source.Created.UTC().Format(time.RFC3339)) + assert.Equal(t, s.db.NowFunc().Format(time.RFC3339), source.Updated.UTC().Format(time.RFC3339)) + + // Try to create second login source with same name should fail. + _, err = s.Create(ctx, CreateLoginSourceOptions{Name: source.Name}) + wantErr := ErrLoginSourceAlreadyExist{args: errx.Args{"name": source.Name}} + assert.Equal(t, wantErr, err) +} + +func setMockLoginSourceFilesStore(t *testing.T, s *LoginSourcesStore, mock loginSourceFilesStore) { + before := s.files + s.files = mock + t.Cleanup(func() { + s.files = before + }) +} + +func loginSourcesCount(t *testing.T, ctx context.Context, s *LoginSourcesStore) { + // Create two login sources, one in database and one as source file. + _, err := s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: false, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, + }, + ) + require.NoError(t, err) + + mock := NewMockLoginSourceFilesStore() + mock.LenFunc.SetDefaultReturn(2) + setMockLoginSourceFilesStore(t, s, mock) + + assert.Equal(t, int64(3), s.Count(ctx)) +} + +func loginSourcesDeleteByID(t *testing.T, ctx context.Context, s *LoginSourcesStore) { + t.Run("delete but in used", func(t *testing.T) { + source, err := s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: false, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, + }, + ) + require.NoError(t, err) + + // Create a user that uses this login source + _, err = newUsersStore(s.db).Create(ctx, "alice", "", + CreateUserOptions{ + LoginSource: source.ID, + }, + ) + require.NoError(t, err) + + // Delete the login source will result in error + err = s.DeleteByID(ctx, source.ID) + wantErr := ErrLoginSourceInUse{args: errx.Args{"id": source.ID}} + assert.Equal(t, wantErr, err) + }) + + mock := NewMockLoginSourceFilesStore() + mock.GetByIDFunc.SetDefaultHook(func(id int64) (*LoginSource, error) { + return nil, ErrLoginSourceNotExist{args: errx.Args{"id": id}} + }) + setMockLoginSourceFilesStore(t, s, mock) + + // Create a login source with name "GitHub2" + source, err := s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.GitHub, + Name: "GitHub2", + Activated: true, + Default: false, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, + }, + ) + require.NoError(t, err) + + // Delete a non-existent ID is noop + err = s.DeleteByID(ctx, 9999) + require.NoError(t, err) + + // We should be able to get it back + _, err = s.GetByID(ctx, source.ID) + require.NoError(t, err) + + // Now delete this login source with ID + err = s.DeleteByID(ctx, source.ID) + require.NoError(t, err) + + // We should get token not found error + _, err = s.GetByID(ctx, source.ID) + wantErr := ErrLoginSourceNotExist{args: errx.Args{"id": source.ID}} + assert.Equal(t, wantErr, err) +} + +func loginSourcesGetByID(t *testing.T, ctx context.Context, s *LoginSourcesStore) { + mock := NewMockLoginSourceFilesStore() + mock.GetByIDFunc.SetDefaultHook(func(id int64) (*LoginSource, error) { + if id != 101 { + return nil, ErrLoginSourceNotExist{args: errx.Args{"id": id}} + } + return &LoginSource{ID: id}, nil + }) + setMockLoginSourceFilesStore(t, s, mock) + + expConfig := &github.Config{ + APIEndpoint: "https://api.github.com", + } + + // Create a login source with name "GitHub" + source, err := s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: false, + Config: expConfig, + }, + ) + require.NoError(t, err) + + // Get the one in the database and test the read/write hooks + source, err = s.GetByID(ctx, source.ID) + require.NoError(t, err) + assert.Equal(t, expConfig, source.Provider.Config()) + + // Get the one in source file store + _, err = s.GetByID(ctx, 101) + require.NoError(t, err) +} + +func loginSourcesList(t *testing.T, ctx context.Context, s *LoginSourcesStore) { + mock := NewMockLoginSourceFilesStore() + mock.ListFunc.SetDefaultHook(func(opts ListLoginSourceOptions) []*LoginSource { + if opts.OnlyActivated { + return []*LoginSource{ + {ID: 1}, + } + } + return []*LoginSource{ + {ID: 1}, + {ID: 2}, + } + }) + setMockLoginSourceFilesStore(t, s, mock) + + // Create two login sources in database, one activated and the other one not + _, err := s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.PAM, + Name: "PAM", + Config: &pam.Config{ + ServiceName: "PAM", + }, + }, + ) + require.NoError(t, err) + _, err = s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, + }, + ) + require.NoError(t, err) + + // List all login sources + sources, err := s.List(ctx, ListLoginSourceOptions{}) + require.NoError(t, err) + assert.Equal(t, 4, len(sources), "number of sources") + + // Only list activated login sources + sources, err = s.List(ctx, ListLoginSourceOptions{OnlyActivated: true}) + require.NoError(t, err) + assert.Equal(t, 2, len(sources), "number of sources") +} + +func loginSourcesResetNonDefault(t *testing.T, ctx context.Context, s *LoginSourcesStore) { + mock := NewMockLoginSourceFilesStore() + mock.ListFunc.SetDefaultHook(func(opts ListLoginSourceOptions) []*LoginSource { + mockFile := NewMockLoginSourceFileStore() + mockFile.SetGeneralFunc.SetDefaultHook(func(name, value string) { + assert.Equal(t, "is_default", name) + assert.Equal(t, "false", value) + }) + return []*LoginSource{ + { + File: mockFile, + }, + } + }) + setMockLoginSourceFilesStore(t, s, mock) + + // Create two login sources both have default on + source1, err := s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.PAM, + Name: "PAM", + Default: true, + Config: &pam.Config{ + ServiceName: "PAM", + }, + }, + ) + require.NoError(t, err) + source2, err := s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: true, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, + }, + ) + require.NoError(t, err) + + // Set source 1 as default + err = s.ResetNonDefault(ctx, source1) + require.NoError(t, err) + + // Verify the default state + source1, err = s.GetByID(ctx, source1.ID) + require.NoError(t, err) + assert.True(t, source1.IsDefault) + + source2, err = s.GetByID(ctx, source2.ID) + require.NoError(t, err) + assert.False(t, source2.IsDefault) +} + +func loginSourcesSave(t *testing.T, ctx context.Context, s *LoginSourcesStore) { + t.Run("save to database", func(t *testing.T) { + // Create a login source with name "GitHub" + source, err := s.Create(ctx, + CreateLoginSourceOptions{ + Type: auth.GitHub, + Name: "GitHub", + Activated: true, + Default: false, + Config: &github.Config{ + APIEndpoint: "https://api.github.com", + }, + }, + ) + require.NoError(t, err) + + source.IsActived = false + source.Provider = github.NewProvider(&github.Config{ + APIEndpoint: "https://api2.github.com", + }) + err = s.Save(ctx, source) + require.NoError(t, err) + + source, err = s.GetByID(ctx, source.ID) + require.NoError(t, err) + assert.False(t, source.IsActived) + assert.Equal(t, "https://api2.github.com", source.GitHub().APIEndpoint) + }) + + t.Run("save to file", func(t *testing.T) { + mockFile := NewMockLoginSourceFileStore() + source := &LoginSource{ + Provider: github.NewProvider(&github.Config{ + APIEndpoint: "https://api.github.com", + }), + File: mockFile, + } + err := s.Save(ctx, source) + require.NoError(t, err) + mockrequire.Called(t, mockFile.SaveFunc) + }) +} diff --git a/internal/database/main_test.go b/internal/database/main_test.go new file mode 100644 index 00000000000..f75921a0dc8 --- /dev/null +++ b/internal/database/main_test.go @@ -0,0 +1,65 @@ +package database + +import ( + "flag" + "fmt" + "os" + "testing" + + "gorm.io/gorm" + "gorm.io/gorm/logger" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/dbtest" + "gogs.io/gogs/internal/testx" +) + +func TestMain(m *testing.M) { + flag.Parse() + + level := logger.Silent + if !testing.Verbose() { + // Remove the primary logger and register a noop logger. + log.Remove(log.DefaultConsoleName) + err := log.New("noop", testx.InitNoopLogger) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } else { + level = logger.Info + } + + // NOTE: AutoMigrate does not respect logger passed in gorm.Config. + logger.Default = logger.Default.LogMode(level) + + switch os.Getenv("GOGS_DATABASE_TYPE") { + case "mysql": + conf.UseMySQL = true + case "postgres": + conf.UsePostgreSQL = true + default: + conf.UseSQLite3 = true + } + + os.Exit(m.Run()) +} + +func newTestDB(t *testing.T, suite string) *gorm.DB { + return dbtest.NewDB(t, suite, append(Tables, legacyTables...)...) +} + +func clearTables(t *testing.T, db *gorm.DB) error { + if t.Failed() { + return nil + } + + for _, t := range append(Tables, legacyTables...) { + err := db.Where("TRUE").Delete(t).Error + if err != nil { + return err + } + } + return nil +} diff --git a/internal/database/migrations/main_test.go b/internal/database/migrations/main_test.go new file mode 100644 index 00000000000..859ea3430ac --- /dev/null +++ b/internal/database/migrations/main_test.go @@ -0,0 +1,35 @@ +package migrations + +import ( + "flag" + "fmt" + "os" + "testing" + + "gorm.io/gorm/logger" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/testx" +) + +func TestMain(m *testing.M) { + flag.Parse() + + level := logger.Silent + if !testing.Verbose() { + // Remove the primary logger and register a noop logger. + log.Remove(log.DefaultConsoleName) + err := log.New("noop", testx.InitNoopLogger) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } else { + level = logger.Info + } + + // NOTE: AutoMigrate does not respect logger passed in gorm.Config. + logger.Default = logger.Default.LogMode(level) + + os.Exit(m.Run()) +} diff --git a/internal/database/migrations/migrations.go b/internal/database/migrations/migrations.go new file mode 100644 index 00000000000..280fa11075e --- /dev/null +++ b/internal/database/migrations/migrations.go @@ -0,0 +1,145 @@ +package migrations + +import ( + "github.com/cockroachdb/errors" + "gorm.io/gorm" + log "unknwon.dev/clog/v2" +) + +const minDBVersion = 19 + +type Migration interface { + Description() string + Migrate(*gorm.DB) error +} + +type migration struct { + description string + migrate func(*gorm.DB) error +} + +func NewMigration(desc string, fn func(*gorm.DB) error) Migration { + return &migration{desc, fn} +} + +func (m *migration) Description() string { + return m.description +} + +func (m *migration) Migrate(db *gorm.DB) error { + return m.migrate(db) +} + +// Version represents the version table. It should have only one row with `id == 1`. +type Version struct { + ID int64 + Version int64 +} + +// This is a sequence of migrations. Add new migrations to the bottom of the list. +// If you want to "retire" a migration, remove it from the top of the list and +// update _MIN_VER_DB accordingly +var migrations = []Migration{ + // v0 -> v4 : before 0.6.0 -> last support 0.7.33 + // v4 -> v10: before 0.7.0 -> last support 0.9.141 + // v10 -> v19: before 0.11.55 -> last support 0.12.0 + + // Add new migration here, example: + // v18 -> v19:v0.11.55 + // NewMigration("clean unlinked webhook and hook_tasks", cleanUnlinkedWebhookAndHookTasks), + + // v19 -> v20:v0.13.0 + NewMigration("migrate access tokens to store SHA56", migrateAccessTokenToSHA256), + // v20 -> v21:v0.13.0 + NewMigration("add index to action.user_id", addIndexToActionUserID), + // v21 -> v22:v0.13.0 + // + // NOTE: There was a bug in calculating the value of the `version.version` + // column after a migration is done, thus some instances are on v21 but some are + // on v22. Let's make a noop v22 to make sure every instance will not miss a + // real future migration. + NewMigration("noop", func(*gorm.DB) error { return nil }), +} + +var errMigrationSkipped = errors.New("the migration has been skipped") + +// Migrate migrates the database schema and/or data to the current version. +func Migrate(db *gorm.DB) error { + // NOTE: GORM has problem migrating tables that happen to have columns with the + // same name, see https://github.com/gogs/gogs/issues/7056. + if !db.Migrator().HasTable(new(Version)) { + err := db.AutoMigrate(new(Version)) + if err != nil { + return errors.Wrap(err, `auto migrate "version" table`) + } + } + + var current Version + err := db.Where("id = ?", 1).First(¤t).Error + if err == gorm.ErrRecordNotFound { + err = db.Create( + &Version{ + ID: 1, + Version: int64(minDBVersion + len(migrations)), + }, + ).Error + if err != nil { + return errors.Wrap(err, "create the version record") + } + return nil + + } else if err != nil { + return errors.Wrap(err, "get the version record") + } + + if minDBVersion > current.Version { + log.Fatal(` +Hi there, thank you for using Gogs for so long! +However, Gogs has stopped supporting auto-migration from your previously installed version. +But the good news is, it's very easy to fix this problem! +You can migrate your older database using a previous release, then you can upgrade to the newest version. + +Please save following instructions to somewhere and start working: + +- If you were using below 0.6.0 (e.g. 0.5.x), download last supported archive from following link: + https://github.com/gogs/gogs/releases/tag/v0.7.33 +- If you were using below 0.7.0 (e.g. 0.6.x), download last supported archive from following link: + https://github.com/gogs/gogs/releases/tag/v0.9.141 +- If you were using below 0.11.55 (e.g. 0.9.141), download last supported archive from following link: + https://github.com/gogs/gogs/releases/tag/v0.12.0 + +Once finished downloading: + +1. Extract the archive and to upgrade steps as usual. +2. Run it once. To verify, you should see some migration traces. +3. Once it starts web server successfully, stop it. +4. Now it's time to put back the release archive you originally intent to upgrade. +5. Enjoy! + +In case you're stilling getting this notice, go through instructions again until it disappears.`) + return nil + } + + if int(current.Version-minDBVersion) > len(migrations) { + // User downgraded Gogs. + current.Version = int64(len(migrations) + minDBVersion) + return db.Where("id = ?", current.ID).Updates(current).Error + } + + for _, m := range migrations[current.Version-minDBVersion:] { + log.Info("Migration: %s", m.Description()) + if err = m.Migrate(db); err != nil { + if err != errMigrationSkipped { + return errors.Wrap(err, "do migrate") + } + log.Trace("The migration %q has been skipped", m.Description()) + } + + current.Version++ + err = db.Where("id = ?", current.ID).Updates(current).Error + if err != nil { + return errors.Wrap(err, "update the version record") + } + } + return nil +} diff --git a/internal/database/migrations/v20.go b/internal/database/migrations/v20.go new file mode 100644 index 00000000000..d42e4db0202 --- /dev/null +++ b/internal/database/migrations/v20.go @@ -0,0 +1,54 @@ +package migrations + +import ( + "github.com/cockroachdb/errors" + "gorm.io/gorm" + + "gogs.io/gogs/internal/cryptox" +) + +func migrateAccessTokenToSHA256(db *gorm.DB) error { + type accessToken struct { + ID int64 + Sha1 string + SHA256 string `gorm:"TYPE:VARCHAR(64)"` + } + + if db.Migrator().HasColumn(&accessToken{}, "SHA256") { + return errMigrationSkipped + } + return db.Transaction(func(tx *gorm.DB) error { + // 1. Add column without constraints because all rows have NULL values for the + // "sha256" column. + err := tx.Migrator().AddColumn(&accessToken{}, "SHA256") + if err != nil { + return errors.Wrap(err, "add column") + } + + // 2. Generate SHA256 for existing rows from their values in the "sha1" column. + var accessTokens []*accessToken + err = tx.Where("sha256 IS NULL").Find(&accessTokens).Error + if err != nil { + return errors.Wrap(err, "list") + } + + for _, t := range accessTokens { + sha256 := cryptox.SHA256(t.Sha1) + err = tx.Model(&accessToken{}).Where("id = ?", t.ID).Update("sha256", sha256).Error + if err != nil { + return errors.Wrap(err, "update") + } + } + + // 3. We are now safe to apply constraints to the "sha256" column. + type accessTokenWithConstraint struct { + SHA256 string `gorm:"type:VARCHAR(64);unique;not null"` + } + err = tx.Table("access_token").AutoMigrate(&accessTokenWithConstraint{}) + if err != nil { + return errors.Wrap(err, "auto migrate") + } + + return nil + }) +} diff --git a/internal/database/migrations/v20_test.go b/internal/database/migrations/v20_test.go new file mode 100644 index 00000000000..6f13df95ab0 --- /dev/null +++ b/internal/database/migrations/v20_test.go @@ -0,0 +1,70 @@ +package migrations + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gogs.io/gogs/internal/dbtest" +) + +type accessTokenPreV20 struct { + ID int64 + UserID int64 `gorm:"COLUMN:uid;INDEX"` + Name string + Sha1 string `gorm:"TYPE:VARCHAR(40);UNIQUE"` + CreatedUnix int64 + UpdatedUnix int64 +} + +func (*accessTokenPreV20) TableName() string { + return "access_token" +} + +type accessTokenV20 struct { + ID int64 + UserID int64 `gorm:"column:uid;index"` + Name string + Sha1 string `gorm:"type:VARCHAR(40);unique"` + SHA256 string `gorm:"type:VARCHAR(64);unique;not null"` + CreatedUnix int64 + UpdatedUnix int64 +} + +func (*accessTokenV20) TableName() string { + return "access_token" +} + +func TestMigrateAccessTokenToSHA256(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + db := dbtest.NewDB(t, "migrateAccessTokenToSHA256", new(accessTokenPreV20)) + err := db.Create( + &accessTokenPreV20{ + ID: 1, + UserID: 1, + Name: "test", + Sha1: "73da7bb9d2a475bbc2ab79da7d4e94940cb9f9d5", + CreatedUnix: db.NowFunc().Unix(), + UpdatedUnix: db.NowFunc().Unix(), + }, + ).Error + require.NoError(t, err) + + err = migrateAccessTokenToSHA256(db) + require.NoError(t, err) + + var got accessTokenV20 + err = db.Where("id = ?", 1).First(&got).Error + require.NoError(t, err) + assert.Equal(t, "73da7bb9d2a475bbc2ab79da7d4e94940cb9f9d5", got.Sha1) + assert.Equal(t, "ab144c7bd170691bb9bb995f1541c608e33a78b40174f30fc8a1616c0bc3a477", got.SHA256) + + // Re-run should be skipped + err = migrateAccessTokenToSHA256(db) + require.Equal(t, errMigrationSkipped, err) +} diff --git a/internal/database/migrations/v21.go b/internal/database/migrations/v21.go new file mode 100644 index 00000000000..dd39f8d28fa --- /dev/null +++ b/internal/database/migrations/v21.go @@ -0,0 +1,15 @@ +package migrations + +import ( + "gorm.io/gorm" +) + +func addIndexToActionUserID(db *gorm.DB) error { + type action struct { + UserID string `gorm:"index"` + } + if db.Migrator().HasIndex(&action{}, "UserID") { + return errMigrationSkipped + } + return db.Migrator().CreateIndex(&action{}, "UserID") +} diff --git a/internal/database/migrations/v21_test.go b/internal/database/migrations/v21_test.go new file mode 100644 index 00000000000..a20c94c1e8e --- /dev/null +++ b/internal/database/migrations/v21_test.go @@ -0,0 +1,82 @@ +package migrations + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gogs.io/gogs/internal/dbtest" +) + +type actionPreV21 struct { + ID int64 `gorm:"primaryKey"` + UserID int64 + OpType int + ActUserID int64 + ActUserName string + RepoID int64 `gorm:"index"` + RepoUserName string + RepoName string + RefName string + IsPrivate bool `gorm:"not null;default:FALSE"` + Content string + CreatedUnix int64 +} + +func (*actionPreV21) TableName() string { + return "action" +} + +type actionV21 struct { + ID int64 `gorm:"primaryKey"` + UserID int64 `gorm:"index"` + OpType int + ActUserID int64 + ActUserName string + RepoID int64 `gorm:"index"` + RepoUserName string + RepoName string + RefName string + IsPrivate bool `gorm:"not null;default:FALSE"` + Content string + CreatedUnix int64 +} + +func (*actionV21) TableName() string { + return "action" +} + +func TestAddIndexToActionUserID(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + db := dbtest.NewDB(t, "addIndexToActionUserID", new(actionPreV21)) + err := db.Create( + &actionPreV21{ + ID: 1, + UserID: 1, + OpType: 1, + ActUserID: 1, + ActUserName: "alice", + RepoID: 1, + RepoUserName: "alice", + RepoName: "example", + RefName: "main", + IsPrivate: false, + CreatedUnix: db.NowFunc().Unix(), + }, + ).Error + require.NoError(t, err) + assert.False(t, db.Migrator().HasIndex(&actionV21{}, "UserID")) + + err = addIndexToActionUserID(db) + require.NoError(t, err) + assert.True(t, db.Migrator().HasIndex(&actionV21{}, "UserID")) + + // Re-run should be skipped + err = addIndexToActionUserID(db) + require.Equal(t, errMigrationSkipped, err) +} diff --git a/internal/database/milestone.go b/internal/database/milestone.go new file mode 100644 index 00000000000..f8186daf10d --- /dev/null +++ b/internal/database/milestone.go @@ -0,0 +1,419 @@ +package database + +import ( + "fmt" + "time" + + log "unknwon.dev/clog/v2" + "xorm.io/xorm" + + "github.com/cockroachdb/errors" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/errx" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" +) + +// Milestone represents a milestone of repository. +type Milestone struct { + ID int64 + RepoID int64 `xorm:"INDEX"` + Name string + Content string `xorm:"TEXT"` + RenderedContent string `xorm:"-" json:"-" gorm:"-"` + IsClosed bool + NumIssues int + NumClosedIssues int + NumOpenIssues int `xorm:"-" json:"-" gorm:"-"` + Completeness int // Percentage(1-100). + IsOverDue bool `xorm:"-" json:"-" gorm:"-"` + + DeadlineString string `xorm:"-" json:"-" gorm:"-"` + Deadline time.Time `xorm:"-" json:"-" gorm:"-"` + DeadlineUnix int64 + ClosedDate time.Time `xorm:"-" json:"-" gorm:"-"` + ClosedDateUnix int64 +} + +func (m *Milestone) BeforeInsert() { + m.DeadlineUnix = m.Deadline.Unix() +} + +func (m *Milestone) BeforeUpdate() { + if m.NumIssues > 0 { + m.Completeness = m.NumClosedIssues * 100 / m.NumIssues + } else { + m.Completeness = 0 + } + + m.DeadlineUnix = m.Deadline.Unix() + m.ClosedDateUnix = m.ClosedDate.Unix() +} + +func (m *Milestone) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "num_closed_issues": + m.NumOpenIssues = m.NumIssues - m.NumClosedIssues + + case "deadline_unix": + m.Deadline = time.Unix(m.DeadlineUnix, 0).Local() + if m.Deadline.Year() == 9999 { + return + } + + m.DeadlineString = m.Deadline.Format("2006-01-02") + if time.Now().Local().After(m.Deadline) { + m.IsOverDue = true + } + + case "closed_date_unix": + m.ClosedDate = time.Unix(m.ClosedDateUnix, 0).Local() + } +} + +// State returns string representation of milestone status. +func (m *Milestone) State() apiv1types.IssueStateType { + if m.IsClosed { + return apiv1types.IssueStateClosed + } + return apiv1types.IssueStateOpen +} + +func (m *Milestone) ChangeStatus(isClosed bool) error { + return ChangeMilestoneStatus(m, isClosed) +} + +func (m *Milestone) APIFormat() *apiv1types.IssueMilestone { + apiMilestone := &apiv1types.IssueMilestone{ + ID: m.ID, + State: m.State(), + Title: m.Name, + Description: m.Content, + OpenIssues: m.NumOpenIssues, + ClosedIssues: m.NumClosedIssues, + } + if m.IsClosed { + apiMilestone.Closed = &m.ClosedDate + } + if m.Deadline.Year() < 9999 { + apiMilestone.Deadline = &m.Deadline + } + return apiMilestone +} + +func (m *Milestone) CountIssues(isClosed, includePulls bool) int64 { + sess := x.Where("milestone_id = ?", m.ID).And("is_closed = ?", isClosed) + if !includePulls { + sess.And("is_pull = ?", false) + } + count, _ := sess.Count(new(Issue)) + return count +} + +// NewMilestone creates new milestone of repository. +func NewMilestone(m *Milestone) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Insert(m); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `repository` SET num_milestones = num_milestones + 1 WHERE id = ?", m.RepoID); err != nil { + return err + } + return sess.Commit() +} + +var _ errx.NotFound = (*ErrMilestoneNotExist)(nil) + +type ErrMilestoneNotExist struct { + args map[string]any +} + +func IsErrMilestoneNotExist(err error) bool { + _, ok := err.(ErrMilestoneNotExist) + return ok +} + +func (err ErrMilestoneNotExist) Error() string { + return fmt.Sprintf("milestone does not exist: %v", err.args) +} + +func (ErrMilestoneNotExist) NotFound() bool { + return true +} + +func getMilestoneByRepoID(e Engine, repoID, id int64) (*Milestone, error) { + m := &Milestone{ + ID: id, + RepoID: repoID, + } + has, err := e.Get(m) + if err != nil { + return nil, err + } else if !has { + return nil, ErrMilestoneNotExist{args: map[string]any{"repoID": repoID, "milestoneID": id}} + } + return m, nil +} + +// GetWebhookByRepoID returns the milestone in a repository. +func GetMilestoneByRepoID(repoID, id int64) (*Milestone, error) { + return getMilestoneByRepoID(x, repoID, id) +} + +// GetMilestonesByRepoID returns all milestones of a repository. +func GetMilestonesByRepoID(repoID int64) ([]*Milestone, error) { + miles := make([]*Milestone, 0, 10) + return miles, x.Where("repo_id = ?", repoID).Find(&miles) +} + +// GetMilestones returns a list of milestones of given repository and status. +func GetMilestones(repoID int64, page int, isClosed bool) ([]*Milestone, error) { + miles := make([]*Milestone, 0, conf.UI.IssuePagingNum) + sess := x.Where("repo_id = ? AND is_closed = ?", repoID, isClosed) + if page > 0 { + sess = sess.Limit(conf.UI.IssuePagingNum, (page-1)*conf.UI.IssuePagingNum) + } + return miles, sess.Find(&miles) +} + +func updateMilestone(e Engine, m *Milestone) error { + _, err := e.ID(m.ID).AllCols().Update(m) + return err +} + +// UpdateMilestone updates information of given milestone. +func UpdateMilestone(m *Milestone) error { + return updateMilestone(x, m) +} + +func countRepoMilestones(e Engine, repoID int64) int64 { + count, _ := e.Where("repo_id=?", repoID).Count(new(Milestone)) + return count +} + +// CountRepoMilestones returns number of milestones in given repository. +func CountRepoMilestones(repoID int64) int64 { + return countRepoMilestones(x, repoID) +} + +func countRepoClosedMilestones(e Engine, repoID int64) int64 { + closed, _ := e.Where("repo_id=? AND is_closed=?", repoID, true).Count(new(Milestone)) + return closed +} + +// CountRepoClosedMilestones returns number of closed milestones in given repository. +func CountRepoClosedMilestones(repoID int64) int64 { + return countRepoClosedMilestones(x, repoID) +} + +// MilestoneStats returns number of open and closed milestones of given repository. +func MilestoneStats(repoID int64) (open, closed int64) { + open, _ = x.Where("repo_id=? AND is_closed=?", repoID, false).Count(new(Milestone)) + return open, CountRepoClosedMilestones(repoID) +} + +// ChangeMilestoneStatus changes the milestone open/closed status. +// If milestone passes with changed values, those values will be +// updated to database as well. +func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) { + repo, err := GetRepositoryByID(m.RepoID) + if err != nil { + return err + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + m.IsClosed = isClosed + if err = updateMilestone(sess, m); err != nil { + return err + } + + repo.NumMilestones = int(countRepoMilestones(sess, repo.ID)) + repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID)) + if _, err = sess.ID(repo.ID).AllCols().Update(repo); err != nil { + return err + } + return sess.Commit() +} + +func changeMilestoneIssueStats(e *xorm.Session, issue *Issue) error { + if issue.MilestoneID == 0 { + return nil + } + + m, err := getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) + if err != nil { + return err + } + + if issue.IsClosed { + m.NumOpenIssues-- + m.NumClosedIssues++ + } else { + m.NumOpenIssues++ + m.NumClosedIssues-- + } + + return updateMilestone(e, m) +} + +// ChangeMilestoneIssueStats updates the open/closed issues counter and progress +// for the milestone associated with the given issue. +func ChangeMilestoneIssueStats(issue *Issue) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = changeMilestoneIssueStats(sess, issue); err != nil { + return err + } + + return sess.Commit() +} + +func changeMilestoneAssign(e *xorm.Session, issue *Issue, oldMilestoneID int64) error { + if oldMilestoneID > 0 { + m, err := getMilestoneByRepoID(e, issue.RepoID, oldMilestoneID) + if err != nil { + return err + } + + m.NumIssues-- + if issue.IsClosed { + m.NumClosedIssues-- + } + + if err = updateMilestone(e, m); err != nil { + return err + } else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE issue_id = ?", issue.ID); err != nil { + return err + } + + issue.Milestone = nil + } + + if issue.MilestoneID > 0 { + m, err := getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) + if err != nil { + return err + } + + m.NumIssues++ + if issue.IsClosed { + m.NumClosedIssues++ + } + + if err = updateMilestone(e, m); err != nil { + return err + } else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = ? WHERE issue_id = ?", m.ID, issue.ID); err != nil { + return err + } + + issue.Milestone = m + } + + return updateIssue(e, issue) +} + +// ChangeMilestoneAssign changes assignment of milestone for issue. +func ChangeMilestoneAssign(doer *User, issue *Issue, oldMilestoneID int64) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = changeMilestoneAssign(sess, issue, oldMilestoneID); err != nil { + return err + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + var hookAction apiv1types.WebhookIssueAction + if issue.MilestoneID > 0 { + hookAction = apiv1types.WebhookIssueMilestoned + } else { + hookAction = apiv1types.WebhookIssueDemilestoned + } + + if issue.IsPull { + err = issue.PullRequest.LoadIssue() + if err != nil { + log.Error("LoadIssue: %v", err) + return err + } + err = PrepareWebhooks(issue.Repo, HookEventTypePullRequest, &apiv1types.WebhookPullRequestPayload{ + Action: hookAction, + Index: issue.Index, + PullRequest: issue.PullRequest.APIFormat(), + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } else { + err = PrepareWebhooks(issue.Repo, HookEventTypeIssues, &apiv1types.WebhookIssuesPayload{ + Action: hookAction, + Index: issue.Index, + Issue: issue.APIFormat(), + Repository: issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }) + } + if err != nil { + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + } + + return nil +} + +// DeleteMilestoneOfRepoByID deletes a milestone from a repository. +func DeleteMilestoneOfRepoByID(repoID, id int64) error { + m, err := GetMilestoneByRepoID(repoID, id) + if err != nil { + if IsErrMilestoneNotExist(err) { + return nil + } + return err + } + + repo, err := GetRepositoryByID(m.RepoID) + if err != nil { + return err + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.ID(m.ID).Delete(new(Milestone)); err != nil { + return err + } + + repo.NumMilestones = int(countRepoMilestones(sess, repo.ID)) + repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID)) + if _, err = sess.ID(repo.ID).AllCols().Update(repo); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `issue` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil { + return err + } else if _, err = sess.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil { + return err + } + return sess.Commit() +} diff --git a/internal/database/mirror.go b/internal/database/mirror.go new file mode 100644 index 00000000000..0064f1efc92 --- /dev/null +++ b/internal/database/mirror.go @@ -0,0 +1,482 @@ +package database + +import ( + "context" + "fmt" + "net/url" + "strconv" + "strings" + "time" + + "github.com/cockroachdb/errors" + "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" + "xorm.io/xorm" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/process" + "gogs.io/gogs/internal/sync" +) + +var MirrorQueue = sync.NewUniqueQueue(1000) + +// MirrorNotExist represents an error when mirror does not exist. +type MirrorNotExist struct { + RepoID int64 +} + +// IsMirrorNotExist returns true if the error is MirrorNotExist. +func IsMirrorNotExist(err error) bool { + _, ok := err.(MirrorNotExist) + return ok +} + +func (err MirrorNotExist) Error() string { + return fmt.Sprintf("mirror does not exist [repo_id: %d]", err.RepoID) +} + +// Mirror represents mirror information of a repository. +type Mirror struct { + ID int64 + RepoID int64 + Repo *Repository `xorm:"-" json:"-" gorm:"-"` + Interval int // Hour. + EnablePrune bool `xorm:"NOT NULL DEFAULT true"` + + // Last and next sync time of Git data from upstream + LastSync time.Time `xorm:"-" json:"-" gorm:"-"` + LastSyncUnix int64 `xorm:"updated_unix"` + NextSync time.Time `xorm:"-" json:"-" gorm:"-"` + NextSyncUnix int64 `xorm:"next_update_unix"` + + address string `xorm:"-"` +} + +func (m *Mirror) BeforeInsert() { + m.NextSyncUnix = m.NextSync.Unix() +} + +func (m *Mirror) BeforeUpdate() { + m.LastSyncUnix = m.LastSync.Unix() + m.NextSyncUnix = m.NextSync.Unix() +} + +func (m *Mirror) AfterSet(colName string, _ xorm.Cell) { + var err error + switch colName { + case "repo_id": + m.Repo, err = GetRepositoryByID(m.RepoID) + if err != nil { + log.Error("GetRepositoryByID [%d]: %v", m.ID, err) + } + case "updated_unix": + m.LastSync = time.Unix(m.LastSyncUnix, 0).Local() + case "next_update_unix": + m.NextSync = time.Unix(m.NextSyncUnix, 0).Local() + } +} + +// ScheduleNextSync calculates and sets next sync time based on repository mirror setting. +func (m *Mirror) ScheduleNextSync() { + m.NextSync = time.Now().Add(time.Duration(m.Interval) * time.Hour) +} + +func (m *Mirror) readAddress() { + if len(m.address) > 0 { + return + } + + cfg, err := ini.LoadSources( + ini.LoadOptions{IgnoreInlineComment: true}, + m.Repo.GitConfigPath(), + ) + if err != nil { + log.Error("load config: %v", err) + return + } + m.address = cfg.Section("remote \"origin\"").Key("url").Value() +} + +// HandleMirrorCredentials replaces user credentials from HTTP/HTTPS URL +// with placeholder . +// It returns original string if protocol is not HTTP/HTTPS. +// TODO(unknwon): Use url.Parse. +func HandleMirrorCredentials(url string, mosaics bool) string { + i := strings.Index(url, "@") + if i == -1 { + return url + } + start := strings.Index(url, "://") + if start == -1 { + return url + } + if mosaics { + return url[:start+3] + "" + url[i:] + } + return url[:start+3] + url[i+1:] +} + +// Address returns mirror address from Git repository config without credentials. +func (m *Mirror) Address() string { + m.readAddress() + return HandleMirrorCredentials(m.address, false) +} + +// MosaicsAddress returns mirror address from Git repository config with credentials under mosaics. +func (m *Mirror) MosaicsAddress() string { + m.readAddress() + return HandleMirrorCredentials(m.address, true) +} + +// RawAddress returns raw mirror address directly from Git repository config. +func (m *Mirror) RawAddress() string { + m.readAddress() + return m.address +} + +// SaveAddress writes new address to Git repository config. +func (m *Mirror) SaveAddress(addr string) error { + repoPath := m.Repo.RepoPath() + + err := git.RemoteRemove(repoPath, "origin") + if err != nil { + return errors.Newf("remove remote 'origin': %v", err) + } + + addrURL, err := url.Parse(addr) + if err != nil { + return err + } + + err = git.RemoteAdd(repoPath, "origin", addrURL.String(), git.RemoteAddOptions{MirrorFetch: true}) + if err != nil { + return errors.Newf("add remote 'origin': %v", err) + } + + return nil +} + +const gitShortEmptyID = "0000000" + +// mirrorSyncResult contains information of a updated reference. +// If the oldCommitID is "0000000", it means a new reference, the value of newCommitID is empty. +// If the newCommitID is "0000000", it means the reference is deleted, the value of oldCommitID is empty. +type mirrorSyncResult struct { + refName string + oldCommitID string + newCommitID string +} + +// parseRemoteUpdateOutput detects create, update and delete operations of references from upstream. +func parseRemoteUpdateOutput(output string) []*mirrorSyncResult { + results := make([]*mirrorSyncResult, 0, 3) + lines := strings.Split(output, "\n") + for i := range lines { + // Make sure reference name is presented before continue + idx := strings.Index(lines[i], "-> ") + if idx == -1 { + continue + } + + refName := lines[i][idx+3:] + switch { + case strings.HasPrefix(lines[i], " * "): // New reference + results = append(results, &mirrorSyncResult{ + refName: refName, + oldCommitID: gitShortEmptyID, + }) + case strings.HasPrefix(lines[i], " - "): // Delete reference + results = append(results, &mirrorSyncResult{ + refName: refName, + newCommitID: gitShortEmptyID, + }) + case strings.HasPrefix(lines[i], " "): // New commits of a reference + delimIdx := strings.Index(lines[i][3:], " ") + if delimIdx == -1 { + log.Error("SHA delimiter not found: %q", lines[i]) + continue + } + shas := strings.Split(lines[i][3:delimIdx+3], "..") + if len(shas) != 2 { + log.Error("Expect two SHAs but not what found: %q", lines[i]) + continue + } + results = append(results, &mirrorSyncResult{ + refName: refName, + oldCommitID: shas[0], + newCommitID: shas[1], + }) + + default: + log.Warn("parseRemoteUpdateOutput: unexpected update line %q", lines[i]) + } + } + return results +} + +// runSync returns true if sync finished without error. +func (m *Mirror) runSync() ([]*mirrorSyncResult, bool) { + repoPath := m.Repo.RepoPath() + wikiPath := m.Repo.WikiPath() + timeout := time.Duration(conf.Git.Timeout.Mirror) * time.Second + + // Do a fast-fail testing against on repository URL to ensure it is accessible under + // good condition to prevent long blocking on URL resolution without syncing anything. + if !git.IsURLAccessible(time.Minute, m.RawAddress()) { + desc := fmt.Sprintf("Source URL of mirror repository '%s' is not accessible: %s", m.Repo.FullName(), m.MosaicsAddress()) + if err := Handle.Notices().Create(context.TODO(), NoticeTypeRepository, desc); err != nil { + log.Error("CreateRepositoryNotice: %v", err) + } + return nil, false + } + + gitArgs := []string{"remote", "update"} + if m.EnablePrune { + gitArgs = append(gitArgs, "--prune") + } + _, stderr, err := process.ExecDir( + timeout, repoPath, fmt.Sprintf("Mirror.runSync: %s", repoPath), + "git", gitArgs...) + if err != nil { + const fmtStr = "Failed to update mirror repository %q: %s" + log.Error(fmtStr, repoPath, stderr) + if err = Handle.Notices().Create( + context.TODO(), + NoticeTypeRepository, + fmt.Sprintf(fmtStr, repoPath, stderr), + ); err != nil { + log.Error("CreateRepositoryNotice: %v", err) + } + return nil, false + } + output := stderr + + if err := m.Repo.UpdateSize(); err != nil { + log.Error("UpdateSize [repo_id: %d]: %v", m.Repo.ID, err) + } + + if m.Repo.HasWiki() { + // Even if wiki sync failed, we still want results from the main repository + if _, stderr, err := process.ExecDir( + timeout, wikiPath, fmt.Sprintf("Mirror.runSync: %s", wikiPath), + "git", "remote", "update", "--prune"); err != nil { + const fmtStr = "Failed to update mirror wiki repository %q: %s" + log.Error(fmtStr, wikiPath, stderr) + if err = Handle.Notices().Create( + context.TODO(), + NoticeTypeRepository, + fmt.Sprintf(fmtStr, wikiPath, stderr), + ); err != nil { + log.Error("CreateRepositoryNotice: %v", err) + } + } + } + + return parseRemoteUpdateOutput(output), true +} + +func getMirrorByRepoID(e Engine, repoID int64) (*Mirror, error) { + m := &Mirror{RepoID: repoID} + has, err := e.Get(m) + if err != nil { + return nil, err + } else if !has { + return nil, MirrorNotExist{RepoID: repoID} + } + return m, nil +} + +// GetMirrorByRepoID returns mirror information of a repository. +func GetMirrorByRepoID(repoID int64) (*Mirror, error) { + return getMirrorByRepoID(x, repoID) +} + +func updateMirror(e Engine, m *Mirror) error { + _, err := e.ID(m.ID).AllCols().Update(m) + return err +} + +func UpdateMirror(m *Mirror) error { + return updateMirror(x, m) +} + +func DeleteMirrorByRepoID(repoID int64) error { + _, err := x.Delete(&Mirror{RepoID: repoID}) + return err +} + +// MirrorUpdate checks and updates mirror repositories. +func MirrorUpdate() { + if taskStatusTable.IsRunning(taskNameMirrorUpdate) { + return + } + taskStatusTable.Start(taskNameMirrorUpdate) + defer taskStatusTable.Stop(taskNameMirrorUpdate) + + log.Trace("Doing: MirrorUpdate") + + if err := x.Where("next_update_unix<=?", time.Now().Unix()).Iterate(new(Mirror), func(idx int, bean any) error { + m := bean.(*Mirror) + if m.Repo == nil { + log.Error("Disconnected mirror repository found: %d", m.ID) + return nil + } + + MirrorQueue.Add(m.RepoID) + return nil + }); err != nil { + log.Error("MirrorUpdate: %v", err) + } +} + +// SyncMirrors checks and syncs mirrors. +// TODO: sync more mirrors at same time. +func SyncMirrors() { + ctx := context.Background() + + // Start listening on new sync requests. + for repoID := range MirrorQueue.Queue() { + log.Trace("SyncMirrors [repo_id: %s]", repoID) + MirrorQueue.Remove(repoID) + + id, _ := strconv.ParseInt(repoID, 10, 64) + m, err := GetMirrorByRepoID(id) + if err != nil { + log.Error("GetMirrorByRepoID [%v]: %v", repoID, err) + continue + } + + results, ok := m.runSync() + if !ok { + continue + } + + m.ScheduleNextSync() + if err = UpdateMirror(m); err != nil { + log.Error("UpdateMirror [%d]: %v", m.RepoID, err) + continue + } + + // TODO: + // - Create "Mirror Sync" webhook event + // - Create mirror sync (create, push and delete) events and trigger the "mirror sync" webhooks + + if len(results) == 0 { + log.Trace("SyncMirrors [repo_id: %d]: no commits fetched", m.RepoID) + } + + gitRepo, err := git.Open(m.Repo.RepoPath()) + if err != nil { + log.Error("Failed to open repository [repo_id: %d]: %v", m.RepoID, err) + continue + } + + for _, result := range results { + // Discard GitHub pull requests, i.e. refs/pull/* + if strings.HasPrefix(result.refName, "refs/pull/") { + continue + } + + // Delete reference + if result.newCommitID == gitShortEmptyID { + if err = Handle.Actions().MirrorSyncDelete(ctx, m.Repo.MustOwner(), m.Repo, result.refName); err != nil { + log.Error("Failed to create action for mirror sync delete [repo_id: %d]: %v", m.RepoID, err) + } + continue + } + + // New reference + isNewRef := false + if result.oldCommitID == gitShortEmptyID { + if err = Handle.Actions().MirrorSyncCreate(ctx, m.Repo.MustOwner(), m.Repo, result.refName); err != nil { + log.Error("Failed to create action for mirror sync create [repo_id: %d]: %v", m.RepoID, err) + continue + } + isNewRef = true + } + + // Push commits + var commits []*git.Commit + var oldCommitID string + var newCommitID string + if !isNewRef { + oldCommitID, err = gitRepo.RevParse(result.oldCommitID) + if err != nil { + log.Error("Failed to parse revision [repo_id: %d, old_commit_id: %s]: %v", m.RepoID, result.oldCommitID, err) + continue + } + newCommitID, err = gitRepo.RevParse(result.newCommitID) + if err != nil { + log.Error("Failed to parse revision [repo_id: %d, new_commit_id: %s]: %v", m.RepoID, result.newCommitID, err) + continue + } + commits, err = gitRepo.RevList([]string{oldCommitID + "..." + newCommitID}) + if err != nil { + log.Error("Failed to list commits [repo_id: %d, old_commit_id: %s, new_commit_id: %s]: %v", m.RepoID, oldCommitID, newCommitID, err) + continue + } + + } else if gitRepo.HasBranch(result.refName) { + refNewCommit, err := gitRepo.BranchCommit(result.refName) + if err != nil { + log.Error("Failed to get branch commit [repo_id: %d, branch: %s]: %v", m.RepoID, result.refName, err) + continue + } + + // TODO(unknwon): Get the commits for the new ref until the closest ancestor branch like GitHub does. + commits, err = refNewCommit.Ancestors(git.LogOptions{MaxCount: 9}) + if err != nil { + log.Error("Failed to get ancestors [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommit.ID, err) + continue + } + + // Put the latest commit in front of ancestors + commits = append([]*git.Commit{refNewCommit}, commits...) + + oldCommitID = git.EmptyID + newCommitID = refNewCommit.ID.String() + } + + err = Handle.Actions().MirrorSyncPush(ctx, + MirrorSyncPushOptions{ + Owner: m.Repo.MustOwner(), + Repo: m.Repo, + RefName: result.refName, + OldCommitID: oldCommitID, + NewCommitID: newCommitID, + Commits: CommitsToPushCommits(commits), + }, + ) + if err != nil { + log.Error("Failed to create action for mirror sync push [repo_id: %d]: %v", m.RepoID, err) + continue + } + } + + if _, err = x.Exec("UPDATE mirror SET updated_unix = ? WHERE repo_id = ?", time.Now().Unix(), m.RepoID); err != nil { + log.Error("Update 'mirror.updated_unix' [%d]: %v", m.RepoID, err) + continue + } + + // Get latest commit date and compare to current repository updated time, + // update if latest commit date is newer. + latestCommitTime, err := gitRepo.LatestCommitTime() + if err != nil { + log.Error("GetLatestCommitDate [%d]: %v", m.RepoID, err) + continue + } else if !latestCommitTime.After(m.Repo.Updated) { + continue + } + + if _, err = x.Exec("UPDATE repository SET updated_unix = ? WHERE id = ?", latestCommitTime.Unix(), m.RepoID); err != nil { + log.Error("Update 'repository.updated_unix' [%d]: %v", m.RepoID, err) + continue + } + } +} + +func InitSyncMirrors() { + go SyncMirrors() +} diff --git a/internal/database/mirror_test.go b/internal/database/mirror_test.go new file mode 100644 index 00000000000..fbe13f4b14f --- /dev/null +++ b/internal/database/mirror_test.go @@ -0,0 +1,33 @@ +package database + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_parseRemoteUpdateOutput(t *testing.T) { + tests := []struct { + output string + expResults []*mirrorSyncResult + }{ + { + ` +From https://try.gogs.io/unknwon/upsteam + * [new branch] develop -> develop + b0bb24f..1d85a4f master -> master + - [deleted] (none) -> bugfix +`, + []*mirrorSyncResult{ + {"develop", gitShortEmptyID, ""}, + {"master", "b0bb24f", "1d85a4f"}, + {"bugfix", "", gitShortEmptyID}, + }, + }, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, test.expResults, parseRemoteUpdateOutput(test.output)) + }) + } +} diff --git a/internal/database/mocks_gen.go b/internal/database/mocks_gen.go new file mode 100644 index 00000000000..b5827afc791 --- /dev/null +++ b/internal/database/mocks_gen.go @@ -0,0 +1,620 @@ +// Code generated by go-mockgen 2.1.1; DO NOT EDIT. +// +// This file was generated by running `go-mockgen` at the root of this repository. +// To add additional mocks to this or another package, add a new entry to the +// mockgen.yaml file in the root of this repository. + +package database + +import ( + "sync" + + auth "gogs.io/gogs/internal/auth" +) + +// MockProvider is a mock implementation of the Provider interface (from the +// package gogs.io/gogs/internal/auth) used for unit testing. +type MockProvider struct { + // AuthenticateFunc is an instance of a mock function object controlling + // the behavior of the method Authenticate. + AuthenticateFunc *ProviderAuthenticateFunc + // ConfigFunc is an instance of a mock function object controlling the + // behavior of the method Config. + ConfigFunc *ProviderConfigFunc + // HasTLSFunc is an instance of a mock function object controlling the + // behavior of the method HasTLS. + HasTLSFunc *ProviderHasTLSFunc + // SkipTLSVerifyFunc is an instance of a mock function object + // controlling the behavior of the method SkipTLSVerify. + SkipTLSVerifyFunc *ProviderSkipTLSVerifyFunc + // UseTLSFunc is an instance of a mock function object controlling the + // behavior of the method UseTLS. + UseTLSFunc *ProviderUseTLSFunc +} + +// NewMockProvider creates a new mock of the Provider interface. All methods +// return zero values for all results, unless overwritten. +func NewMockProvider() *MockProvider { + return &MockProvider{ + AuthenticateFunc: &ProviderAuthenticateFunc{ + defaultHook: func(string, string) (r0 *auth.ExternalAccount, r1 error) { + return + }, + }, + ConfigFunc: &ProviderConfigFunc{ + defaultHook: func() (r0 interface{}) { + return + }, + }, + HasTLSFunc: &ProviderHasTLSFunc{ + defaultHook: func() (r0 bool) { + return + }, + }, + SkipTLSVerifyFunc: &ProviderSkipTLSVerifyFunc{ + defaultHook: func() (r0 bool) { + return + }, + }, + UseTLSFunc: &ProviderUseTLSFunc{ + defaultHook: func() (r0 bool) { + return + }, + }, + } +} + +// NewStrictMockProvider creates a new mock of the Provider interface. All +// methods panic on invocation, unless overwritten. +func NewStrictMockProvider() *MockProvider { + return &MockProvider{ + AuthenticateFunc: &ProviderAuthenticateFunc{ + defaultHook: func(string, string) (*auth.ExternalAccount, error) { + panic("unexpected invocation of MockProvider.Authenticate") + }, + }, + ConfigFunc: &ProviderConfigFunc{ + defaultHook: func() interface{} { + panic("unexpected invocation of MockProvider.Config") + }, + }, + HasTLSFunc: &ProviderHasTLSFunc{ + defaultHook: func() bool { + panic("unexpected invocation of MockProvider.HasTLS") + }, + }, + SkipTLSVerifyFunc: &ProviderSkipTLSVerifyFunc{ + defaultHook: func() bool { + panic("unexpected invocation of MockProvider.SkipTLSVerify") + }, + }, + UseTLSFunc: &ProviderUseTLSFunc{ + defaultHook: func() bool { + panic("unexpected invocation of MockProvider.UseTLS") + }, + }, + } +} + +// NewMockProviderFrom creates a new mock of the MockProvider interface. All +// methods delegate to the given implementation, unless overwritten. +func NewMockProviderFrom(i auth.Provider) *MockProvider { + return &MockProvider{ + AuthenticateFunc: &ProviderAuthenticateFunc{ + defaultHook: i.Authenticate, + }, + ConfigFunc: &ProviderConfigFunc{ + defaultHook: i.Config, + }, + HasTLSFunc: &ProviderHasTLSFunc{ + defaultHook: i.HasTLS, + }, + SkipTLSVerifyFunc: &ProviderSkipTLSVerifyFunc{ + defaultHook: i.SkipTLSVerify, + }, + UseTLSFunc: &ProviderUseTLSFunc{ + defaultHook: i.UseTLS, + }, + } +} + +// ProviderAuthenticateFunc describes the behavior when the Authenticate +// method of the parent MockProvider instance is invoked. +type ProviderAuthenticateFunc struct { + defaultHook func(string, string) (*auth.ExternalAccount, error) + hooks []func(string, string) (*auth.ExternalAccount, error) + history []ProviderAuthenticateFuncCall + mutex sync.Mutex +} + +// Authenticate delegates to the next hook function in the queue and stores +// the parameter and result values of this invocation. +func (m *MockProvider) Authenticate(v0 string, v1 string) (*auth.ExternalAccount, error) { + r0, r1 := m.AuthenticateFunc.nextHook()(v0, v1) + m.AuthenticateFunc.appendCall(ProviderAuthenticateFuncCall{v0, v1, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the Authenticate method +// of the parent MockProvider instance is invoked and the hook queue is +// empty. +func (f *ProviderAuthenticateFunc) SetDefaultHook(hook func(string, string) (*auth.ExternalAccount, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Authenticate method of the parent MockProvider instance invokes the hook +// at the front of the queue and discards it. After the queue is empty, the +// default hook function is invoked for any future action. +func (f *ProviderAuthenticateFunc) PushHook(hook func(string, string) (*auth.ExternalAccount, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *ProviderAuthenticateFunc) SetDefaultReturn(r0 *auth.ExternalAccount, r1 error) { + f.SetDefaultHook(func(string, string) (*auth.ExternalAccount, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *ProviderAuthenticateFunc) PushReturn(r0 *auth.ExternalAccount, r1 error) { + f.PushHook(func(string, string) (*auth.ExternalAccount, error) { + return r0, r1 + }) +} + +func (f *ProviderAuthenticateFunc) nextHook() func(string, string) (*auth.ExternalAccount, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *ProviderAuthenticateFunc) appendCall(r0 ProviderAuthenticateFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of ProviderAuthenticateFuncCall objects +// describing the invocations of this function. +func (f *ProviderAuthenticateFunc) History() []ProviderAuthenticateFuncCall { + f.mutex.Lock() + history := make([]ProviderAuthenticateFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// ProviderAuthenticateFuncCall is an object that describes an invocation of +// method Authenticate on an instance of MockProvider. +type ProviderAuthenticateFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 string + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 string + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *auth.ExternalAccount + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c ProviderAuthenticateFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c ProviderAuthenticateFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// ProviderConfigFunc describes the behavior when the Config method of the +// parent MockProvider instance is invoked. +type ProviderConfigFunc struct { + defaultHook func() interface{} + hooks []func() interface{} + history []ProviderConfigFuncCall + mutex sync.Mutex +} + +// Config delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockProvider) Config() interface{} { + r0 := m.ConfigFunc.nextHook()() + m.ConfigFunc.appendCall(ProviderConfigFuncCall{r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the Config method of the +// parent MockProvider instance is invoked and the hook queue is empty. +func (f *ProviderConfigFunc) SetDefaultHook(hook func() interface{}) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Config method of the parent MockProvider instance invokes the hook at the +// front of the queue and discards it. After the queue is empty, the default +// hook function is invoked for any future action. +func (f *ProviderConfigFunc) PushHook(hook func() interface{}) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *ProviderConfigFunc) SetDefaultReturn(r0 interface{}) { + f.SetDefaultHook(func() interface{} { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *ProviderConfigFunc) PushReturn(r0 interface{}) { + f.PushHook(func() interface{} { + return r0 + }) +} + +func (f *ProviderConfigFunc) nextHook() func() interface{} { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *ProviderConfigFunc) appendCall(r0 ProviderConfigFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of ProviderConfigFuncCall objects describing +// the invocations of this function. +func (f *ProviderConfigFunc) History() []ProviderConfigFuncCall { + f.mutex.Lock() + history := make([]ProviderConfigFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// ProviderConfigFuncCall is an object that describes an invocation of +// method Config on an instance of MockProvider. +type ProviderConfigFuncCall struct { + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 interface{} +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c ProviderConfigFuncCall) Args() []interface{} { + return []interface{}{} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c ProviderConfigFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// ProviderHasTLSFunc describes the behavior when the HasTLS method of the +// parent MockProvider instance is invoked. +type ProviderHasTLSFunc struct { + defaultHook func() bool + hooks []func() bool + history []ProviderHasTLSFuncCall + mutex sync.Mutex +} + +// HasTLS delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockProvider) HasTLS() bool { + r0 := m.HasTLSFunc.nextHook()() + m.HasTLSFunc.appendCall(ProviderHasTLSFuncCall{r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the HasTLS method of the +// parent MockProvider instance is invoked and the hook queue is empty. +func (f *ProviderHasTLSFunc) SetDefaultHook(hook func() bool) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// HasTLS method of the parent MockProvider instance invokes the hook at the +// front of the queue and discards it. After the queue is empty, the default +// hook function is invoked for any future action. +func (f *ProviderHasTLSFunc) PushHook(hook func() bool) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *ProviderHasTLSFunc) SetDefaultReturn(r0 bool) { + f.SetDefaultHook(func() bool { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *ProviderHasTLSFunc) PushReturn(r0 bool) { + f.PushHook(func() bool { + return r0 + }) +} + +func (f *ProviderHasTLSFunc) nextHook() func() bool { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *ProviderHasTLSFunc) appendCall(r0 ProviderHasTLSFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of ProviderHasTLSFuncCall objects describing +// the invocations of this function. +func (f *ProviderHasTLSFunc) History() []ProviderHasTLSFuncCall { + f.mutex.Lock() + history := make([]ProviderHasTLSFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// ProviderHasTLSFuncCall is an object that describes an invocation of +// method HasTLS on an instance of MockProvider. +type ProviderHasTLSFuncCall struct { + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 bool +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c ProviderHasTLSFuncCall) Args() []interface{} { + return []interface{}{} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c ProviderHasTLSFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// ProviderSkipTLSVerifyFunc describes the behavior when the SkipTLSVerify +// method of the parent MockProvider instance is invoked. +type ProviderSkipTLSVerifyFunc struct { + defaultHook func() bool + hooks []func() bool + history []ProviderSkipTLSVerifyFuncCall + mutex sync.Mutex +} + +// SkipTLSVerify delegates to the next hook function in the queue and stores +// the parameter and result values of this invocation. +func (m *MockProvider) SkipTLSVerify() bool { + r0 := m.SkipTLSVerifyFunc.nextHook()() + m.SkipTLSVerifyFunc.appendCall(ProviderSkipTLSVerifyFuncCall{r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the SkipTLSVerify method +// of the parent MockProvider instance is invoked and the hook queue is +// empty. +func (f *ProviderSkipTLSVerifyFunc) SetDefaultHook(hook func() bool) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// SkipTLSVerify method of the parent MockProvider instance invokes the hook +// at the front of the queue and discards it. After the queue is empty, the +// default hook function is invoked for any future action. +func (f *ProviderSkipTLSVerifyFunc) PushHook(hook func() bool) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *ProviderSkipTLSVerifyFunc) SetDefaultReturn(r0 bool) { + f.SetDefaultHook(func() bool { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *ProviderSkipTLSVerifyFunc) PushReturn(r0 bool) { + f.PushHook(func() bool { + return r0 + }) +} + +func (f *ProviderSkipTLSVerifyFunc) nextHook() func() bool { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *ProviderSkipTLSVerifyFunc) appendCall(r0 ProviderSkipTLSVerifyFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of ProviderSkipTLSVerifyFuncCall objects +// describing the invocations of this function. +func (f *ProviderSkipTLSVerifyFunc) History() []ProviderSkipTLSVerifyFuncCall { + f.mutex.Lock() + history := make([]ProviderSkipTLSVerifyFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// ProviderSkipTLSVerifyFuncCall is an object that describes an invocation +// of method SkipTLSVerify on an instance of MockProvider. +type ProviderSkipTLSVerifyFuncCall struct { + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 bool +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c ProviderSkipTLSVerifyFuncCall) Args() []interface{} { + return []interface{}{} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c ProviderSkipTLSVerifyFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// ProviderUseTLSFunc describes the behavior when the UseTLS method of the +// parent MockProvider instance is invoked. +type ProviderUseTLSFunc struct { + defaultHook func() bool + hooks []func() bool + history []ProviderUseTLSFuncCall + mutex sync.Mutex +} + +// UseTLS delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockProvider) UseTLS() bool { + r0 := m.UseTLSFunc.nextHook()() + m.UseTLSFunc.appendCall(ProviderUseTLSFuncCall{r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the UseTLS method of the +// parent MockProvider instance is invoked and the hook queue is empty. +func (f *ProviderUseTLSFunc) SetDefaultHook(hook func() bool) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// UseTLS method of the parent MockProvider instance invokes the hook at the +// front of the queue and discards it. After the queue is empty, the default +// hook function is invoked for any future action. +func (f *ProviderUseTLSFunc) PushHook(hook func() bool) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *ProviderUseTLSFunc) SetDefaultReturn(r0 bool) { + f.SetDefaultHook(func() bool { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *ProviderUseTLSFunc) PushReturn(r0 bool) { + f.PushHook(func() bool { + return r0 + }) +} + +func (f *ProviderUseTLSFunc) nextHook() func() bool { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *ProviderUseTLSFunc) appendCall(r0 ProviderUseTLSFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of ProviderUseTLSFuncCall objects describing +// the invocations of this function. +func (f *ProviderUseTLSFunc) History() []ProviderUseTLSFuncCall { + f.mutex.Lock() + history := make([]ProviderUseTLSFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// ProviderUseTLSFuncCall is an object that describes an invocation of +// method UseTLS on an instance of MockProvider. +type ProviderUseTLSFuncCall struct { + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 bool +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c ProviderUseTLSFuncCall) Args() []interface{} { + return []interface{}{} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c ProviderUseTLSFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} diff --git a/internal/database/mocks_test.go b/internal/database/mocks_test.go new file mode 100644 index 00000000000..78b6a370d45 --- /dev/null +++ b/internal/database/mocks_test.go @@ -0,0 +1,912 @@ +// Code generated by go-mockgen 2.1.1; DO NOT EDIT. +// +// This file was generated by running `go-mockgen` at the root of this repository. +// To add additional mocks to this or another package, add a new entry to the +// mockgen.yaml file in the root of this repository. + +package database + +import "sync" + +// MockLoginSourceFileStore is a mock implementation of the +// loginSourceFileStore interface (from the package +// gogs.io/gogs/internal/database) used for unit testing. +type MockLoginSourceFileStore struct { + // SaveFunc is an instance of a mock function object controlling the + // behavior of the method Save. + SaveFunc *LoginSourceFileStoreSaveFunc + // SetConfigFunc is an instance of a mock function object controlling + // the behavior of the method SetConfig. + SetConfigFunc *LoginSourceFileStoreSetConfigFunc + // SetGeneralFunc is an instance of a mock function object controlling + // the behavior of the method SetGeneral. + SetGeneralFunc *LoginSourceFileStoreSetGeneralFunc +} + +// NewMockLoginSourceFileStore creates a new mock of the +// loginSourceFileStore interface. All methods return zero values for all +// results, unless overwritten. +func NewMockLoginSourceFileStore() *MockLoginSourceFileStore { + return &MockLoginSourceFileStore{ + SaveFunc: &LoginSourceFileStoreSaveFunc{ + defaultHook: func() (r0 error) { + return + }, + }, + SetConfigFunc: &LoginSourceFileStoreSetConfigFunc{ + defaultHook: func(interface{}) (r0 error) { + return + }, + }, + SetGeneralFunc: &LoginSourceFileStoreSetGeneralFunc{ + defaultHook: func(string, string) { + return + }, + }, + } +} + +// NewStrictMockLoginSourceFileStore creates a new mock of the +// loginSourceFileStore interface. All methods panic on invocation, unless +// overwritten. +func NewStrictMockLoginSourceFileStore() *MockLoginSourceFileStore { + return &MockLoginSourceFileStore{ + SaveFunc: &LoginSourceFileStoreSaveFunc{ + defaultHook: func() error { + panic("unexpected invocation of MockLoginSourceFileStore.Save") + }, + }, + SetConfigFunc: &LoginSourceFileStoreSetConfigFunc{ + defaultHook: func(interface{}) error { + panic("unexpected invocation of MockLoginSourceFileStore.SetConfig") + }, + }, + SetGeneralFunc: &LoginSourceFileStoreSetGeneralFunc{ + defaultHook: func(string, string) { + panic("unexpected invocation of MockLoginSourceFileStore.SetGeneral") + }, + }, + } +} + +// surrogateMockLoginSourceFileStore is a copy of the loginSourceFileStore +// interface (from the package gogs.io/gogs/internal/database). It is +// redefined here as it is unexported in the source package. +type surrogateMockLoginSourceFileStore interface { + Save() error + SetConfig(interface{}) error + SetGeneral(string, string) +} + +// NewMockLoginSourceFileStoreFrom creates a new mock of the +// MockLoginSourceFileStore interface. All methods delegate to the given +// implementation, unless overwritten. +func NewMockLoginSourceFileStoreFrom(i surrogateMockLoginSourceFileStore) *MockLoginSourceFileStore { + return &MockLoginSourceFileStore{ + SaveFunc: &LoginSourceFileStoreSaveFunc{ + defaultHook: i.Save, + }, + SetConfigFunc: &LoginSourceFileStoreSetConfigFunc{ + defaultHook: i.SetConfig, + }, + SetGeneralFunc: &LoginSourceFileStoreSetGeneralFunc{ + defaultHook: i.SetGeneral, + }, + } +} + +// LoginSourceFileStoreSaveFunc describes the behavior when the Save method +// of the parent MockLoginSourceFileStore instance is invoked. +type LoginSourceFileStoreSaveFunc struct { + defaultHook func() error + hooks []func() error + history []LoginSourceFileStoreSaveFuncCall + mutex sync.Mutex +} + +// Save delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFileStore) Save() error { + r0 := m.SaveFunc.nextHook()() + m.SaveFunc.appendCall(LoginSourceFileStoreSaveFuncCall{r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the Save method of the +// parent MockLoginSourceFileStore instance is invoked and the hook queue is +// empty. +func (f *LoginSourceFileStoreSaveFunc) SetDefaultHook(hook func() error) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Save method of the parent MockLoginSourceFileStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *LoginSourceFileStoreSaveFunc) PushHook(hook func() error) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFileStoreSaveFunc) SetDefaultReturn(r0 error) { + f.SetDefaultHook(func() error { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFileStoreSaveFunc) PushReturn(r0 error) { + f.PushHook(func() error { + return r0 + }) +} + +func (f *LoginSourceFileStoreSaveFunc) nextHook() func() error { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFileStoreSaveFunc) appendCall(r0 LoginSourceFileStoreSaveFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFileStoreSaveFuncCall objects +// describing the invocations of this function. +func (f *LoginSourceFileStoreSaveFunc) History() []LoginSourceFileStoreSaveFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFileStoreSaveFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFileStoreSaveFuncCall is an object that describes an +// invocation of method Save on an instance of MockLoginSourceFileStore. +type LoginSourceFileStoreSaveFuncCall struct { + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFileStoreSaveFuncCall) Args() []interface{} { + return []interface{}{} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFileStoreSaveFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourceFileStoreSetConfigFunc describes the behavior when the +// SetConfig method of the parent MockLoginSourceFileStore instance is +// invoked. +type LoginSourceFileStoreSetConfigFunc struct { + defaultHook func(interface{}) error + hooks []func(interface{}) error + history []LoginSourceFileStoreSetConfigFuncCall + mutex sync.Mutex +} + +// SetConfig delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFileStore) SetConfig(v0 interface{}) error { + r0 := m.SetConfigFunc.nextHook()(v0) + m.SetConfigFunc.appendCall(LoginSourceFileStoreSetConfigFuncCall{v0, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the SetConfig method of +// the parent MockLoginSourceFileStore instance is invoked and the hook +// queue is empty. +func (f *LoginSourceFileStoreSetConfigFunc) SetDefaultHook(hook func(interface{}) error) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// SetConfig method of the parent MockLoginSourceFileStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *LoginSourceFileStoreSetConfigFunc) PushHook(hook func(interface{}) error) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFileStoreSetConfigFunc) SetDefaultReturn(r0 error) { + f.SetDefaultHook(func(interface{}) error { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFileStoreSetConfigFunc) PushReturn(r0 error) { + f.PushHook(func(interface{}) error { + return r0 + }) +} + +func (f *LoginSourceFileStoreSetConfigFunc) nextHook() func(interface{}) error { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFileStoreSetConfigFunc) appendCall(r0 LoginSourceFileStoreSetConfigFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFileStoreSetConfigFuncCall +// objects describing the invocations of this function. +func (f *LoginSourceFileStoreSetConfigFunc) History() []LoginSourceFileStoreSetConfigFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFileStoreSetConfigFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFileStoreSetConfigFuncCall is an object that describes an +// invocation of method SetConfig on an instance of +// MockLoginSourceFileStore. +type LoginSourceFileStoreSetConfigFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 interface{} + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFileStoreSetConfigFuncCall) Args() []interface{} { + return []interface{}{c.Arg0} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFileStoreSetConfigFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourceFileStoreSetGeneralFunc describes the behavior when the +// SetGeneral method of the parent MockLoginSourceFileStore instance is +// invoked. +type LoginSourceFileStoreSetGeneralFunc struct { + defaultHook func(string, string) + hooks []func(string, string) + history []LoginSourceFileStoreSetGeneralFuncCall + mutex sync.Mutex +} + +// SetGeneral delegates to the next hook function in the queue and stores +// the parameter and result values of this invocation. +func (m *MockLoginSourceFileStore) SetGeneral(v0 string, v1 string) { + m.SetGeneralFunc.nextHook()(v0, v1) + m.SetGeneralFunc.appendCall(LoginSourceFileStoreSetGeneralFuncCall{v0, v1}) + return +} + +// SetDefaultHook sets function that is called when the SetGeneral method of +// the parent MockLoginSourceFileStore instance is invoked and the hook +// queue is empty. +func (f *LoginSourceFileStoreSetGeneralFunc) SetDefaultHook(hook func(string, string)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// SetGeneral method of the parent MockLoginSourceFileStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *LoginSourceFileStoreSetGeneralFunc) PushHook(hook func(string, string)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFileStoreSetGeneralFunc) SetDefaultReturn() { + f.SetDefaultHook(func(string, string) { + return + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFileStoreSetGeneralFunc) PushReturn() { + f.PushHook(func(string, string) { + return + }) +} + +func (f *LoginSourceFileStoreSetGeneralFunc) nextHook() func(string, string) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFileStoreSetGeneralFunc) appendCall(r0 LoginSourceFileStoreSetGeneralFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFileStoreSetGeneralFuncCall +// objects describing the invocations of this function. +func (f *LoginSourceFileStoreSetGeneralFunc) History() []LoginSourceFileStoreSetGeneralFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFileStoreSetGeneralFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFileStoreSetGeneralFuncCall is an object that describes an +// invocation of method SetGeneral on an instance of +// MockLoginSourceFileStore. +type LoginSourceFileStoreSetGeneralFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 string + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 string +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFileStoreSetGeneralFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFileStoreSetGeneralFuncCall) Results() []interface{} { + return []interface{}{} +} + +// MockLoginSourceFilesStore is a mock implementation of the +// loginSourceFilesStore interface (from the package +// gogs.io/gogs/internal/database) used for unit testing. +type MockLoginSourceFilesStore struct { + // GetByIDFunc is an instance of a mock function object controlling the + // behavior of the method GetByID. + GetByIDFunc *LoginSourceFilesStoreGetByIDFunc + // LenFunc is an instance of a mock function object controlling the + // behavior of the method Len. + LenFunc *LoginSourceFilesStoreLenFunc + // ListFunc is an instance of a mock function object controlling the + // behavior of the method List. + ListFunc *LoginSourceFilesStoreListFunc + // UpdateFunc is an instance of a mock function object controlling the + // behavior of the method Update. + UpdateFunc *LoginSourceFilesStoreUpdateFunc +} + +// NewMockLoginSourceFilesStore creates a new mock of the +// loginSourceFilesStore interface. All methods return zero values for all +// results, unless overwritten. +func NewMockLoginSourceFilesStore() *MockLoginSourceFilesStore { + return &MockLoginSourceFilesStore{ + GetByIDFunc: &LoginSourceFilesStoreGetByIDFunc{ + defaultHook: func(int64) (r0 *LoginSource, r1 error) { + return + }, + }, + LenFunc: &LoginSourceFilesStoreLenFunc{ + defaultHook: func() (r0 int) { + return + }, + }, + ListFunc: &LoginSourceFilesStoreListFunc{ + defaultHook: func(ListLoginSourceOptions) (r0 []*LoginSource) { + return + }, + }, + UpdateFunc: &LoginSourceFilesStoreUpdateFunc{ + defaultHook: func(*LoginSource) { + return + }, + }, + } +} + +// NewStrictMockLoginSourceFilesStore creates a new mock of the +// loginSourceFilesStore interface. All methods panic on invocation, unless +// overwritten. +func NewStrictMockLoginSourceFilesStore() *MockLoginSourceFilesStore { + return &MockLoginSourceFilesStore{ + GetByIDFunc: &LoginSourceFilesStoreGetByIDFunc{ + defaultHook: func(int64) (*LoginSource, error) { + panic("unexpected invocation of MockLoginSourceFilesStore.GetByID") + }, + }, + LenFunc: &LoginSourceFilesStoreLenFunc{ + defaultHook: func() int { + panic("unexpected invocation of MockLoginSourceFilesStore.Len") + }, + }, + ListFunc: &LoginSourceFilesStoreListFunc{ + defaultHook: func(ListLoginSourceOptions) []*LoginSource { + panic("unexpected invocation of MockLoginSourceFilesStore.List") + }, + }, + UpdateFunc: &LoginSourceFilesStoreUpdateFunc{ + defaultHook: func(*LoginSource) { + panic("unexpected invocation of MockLoginSourceFilesStore.Update") + }, + }, + } +} + +// surrogateMockLoginSourceFilesStore is a copy of the loginSourceFilesStore +// interface (from the package gogs.io/gogs/internal/database). It is +// redefined here as it is unexported in the source package. +type surrogateMockLoginSourceFilesStore interface { + GetByID(int64) (*LoginSource, error) + Len() int + List(ListLoginSourceOptions) []*LoginSource + Update(*LoginSource) +} + +// NewMockLoginSourceFilesStoreFrom creates a new mock of the +// MockLoginSourceFilesStore interface. All methods delegate to the given +// implementation, unless overwritten. +func NewMockLoginSourceFilesStoreFrom(i surrogateMockLoginSourceFilesStore) *MockLoginSourceFilesStore { + return &MockLoginSourceFilesStore{ + GetByIDFunc: &LoginSourceFilesStoreGetByIDFunc{ + defaultHook: i.GetByID, + }, + LenFunc: &LoginSourceFilesStoreLenFunc{ + defaultHook: i.Len, + }, + ListFunc: &LoginSourceFilesStoreListFunc{ + defaultHook: i.List, + }, + UpdateFunc: &LoginSourceFilesStoreUpdateFunc{ + defaultHook: i.Update, + }, + } +} + +// LoginSourceFilesStoreGetByIDFunc describes the behavior when the GetByID +// method of the parent MockLoginSourceFilesStore instance is invoked. +type LoginSourceFilesStoreGetByIDFunc struct { + defaultHook func(int64) (*LoginSource, error) + hooks []func(int64) (*LoginSource, error) + history []LoginSourceFilesStoreGetByIDFuncCall + mutex sync.Mutex +} + +// GetByID delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFilesStore) GetByID(v0 int64) (*LoginSource, error) { + r0, r1 := m.GetByIDFunc.nextHook()(v0) + m.GetByIDFunc.appendCall(LoginSourceFilesStoreGetByIDFuncCall{v0, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the GetByID method of +// the parent MockLoginSourceFilesStore instance is invoked and the hook +// queue is empty. +func (f *LoginSourceFilesStoreGetByIDFunc) SetDefaultHook(hook func(int64) (*LoginSource, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// GetByID method of the parent MockLoginSourceFilesStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *LoginSourceFilesStoreGetByIDFunc) PushHook(hook func(int64) (*LoginSource, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFilesStoreGetByIDFunc) SetDefaultReturn(r0 *LoginSource, r1 error) { + f.SetDefaultHook(func(int64) (*LoginSource, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFilesStoreGetByIDFunc) PushReturn(r0 *LoginSource, r1 error) { + f.PushHook(func(int64) (*LoginSource, error) { + return r0, r1 + }) +} + +func (f *LoginSourceFilesStoreGetByIDFunc) nextHook() func(int64) (*LoginSource, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFilesStoreGetByIDFunc) appendCall(r0 LoginSourceFilesStoreGetByIDFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFilesStoreGetByIDFuncCall +// objects describing the invocations of this function. +func (f *LoginSourceFilesStoreGetByIDFunc) History() []LoginSourceFilesStoreGetByIDFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFilesStoreGetByIDFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFilesStoreGetByIDFuncCall is an object that describes an +// invocation of method GetByID on an instance of MockLoginSourceFilesStore. +type LoginSourceFilesStoreGetByIDFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 int64 + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *LoginSource + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFilesStoreGetByIDFuncCall) Args() []interface{} { + return []interface{}{c.Arg0} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFilesStoreGetByIDFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// LoginSourceFilesStoreLenFunc describes the behavior when the Len method +// of the parent MockLoginSourceFilesStore instance is invoked. +type LoginSourceFilesStoreLenFunc struct { + defaultHook func() int + hooks []func() int + history []LoginSourceFilesStoreLenFuncCall + mutex sync.Mutex +} + +// Len delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFilesStore) Len() int { + r0 := m.LenFunc.nextHook()() + m.LenFunc.appendCall(LoginSourceFilesStoreLenFuncCall{r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the Len method of the +// parent MockLoginSourceFilesStore instance is invoked and the hook queue +// is empty. +func (f *LoginSourceFilesStoreLenFunc) SetDefaultHook(hook func() int) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Len method of the parent MockLoginSourceFilesStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *LoginSourceFilesStoreLenFunc) PushHook(hook func() int) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFilesStoreLenFunc) SetDefaultReturn(r0 int) { + f.SetDefaultHook(func() int { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFilesStoreLenFunc) PushReturn(r0 int) { + f.PushHook(func() int { + return r0 + }) +} + +func (f *LoginSourceFilesStoreLenFunc) nextHook() func() int { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFilesStoreLenFunc) appendCall(r0 LoginSourceFilesStoreLenFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFilesStoreLenFuncCall objects +// describing the invocations of this function. +func (f *LoginSourceFilesStoreLenFunc) History() []LoginSourceFilesStoreLenFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFilesStoreLenFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFilesStoreLenFuncCall is an object that describes an +// invocation of method Len on an instance of MockLoginSourceFilesStore. +type LoginSourceFilesStoreLenFuncCall struct { + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 int +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFilesStoreLenFuncCall) Args() []interface{} { + return []interface{}{} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFilesStoreLenFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourceFilesStoreListFunc describes the behavior when the List method +// of the parent MockLoginSourceFilesStore instance is invoked. +type LoginSourceFilesStoreListFunc struct { + defaultHook func(ListLoginSourceOptions) []*LoginSource + hooks []func(ListLoginSourceOptions) []*LoginSource + history []LoginSourceFilesStoreListFuncCall + mutex sync.Mutex +} + +// List delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFilesStore) List(v0 ListLoginSourceOptions) []*LoginSource { + r0 := m.ListFunc.nextHook()(v0) + m.ListFunc.appendCall(LoginSourceFilesStoreListFuncCall{v0, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the List method of the +// parent MockLoginSourceFilesStore instance is invoked and the hook queue +// is empty. +func (f *LoginSourceFilesStoreListFunc) SetDefaultHook(hook func(ListLoginSourceOptions) []*LoginSource) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// List method of the parent MockLoginSourceFilesStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *LoginSourceFilesStoreListFunc) PushHook(hook func(ListLoginSourceOptions) []*LoginSource) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFilesStoreListFunc) SetDefaultReturn(r0 []*LoginSource) { + f.SetDefaultHook(func(ListLoginSourceOptions) []*LoginSource { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFilesStoreListFunc) PushReturn(r0 []*LoginSource) { + f.PushHook(func(ListLoginSourceOptions) []*LoginSource { + return r0 + }) +} + +func (f *LoginSourceFilesStoreListFunc) nextHook() func(ListLoginSourceOptions) []*LoginSource { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFilesStoreListFunc) appendCall(r0 LoginSourceFilesStoreListFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFilesStoreListFuncCall objects +// describing the invocations of this function. +func (f *LoginSourceFilesStoreListFunc) History() []LoginSourceFilesStoreListFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFilesStoreListFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFilesStoreListFuncCall is an object that describes an +// invocation of method List on an instance of MockLoginSourceFilesStore. +type LoginSourceFilesStoreListFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 ListLoginSourceOptions + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 []*LoginSource +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFilesStoreListFuncCall) Args() []interface{} { + return []interface{}{c.Arg0} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFilesStoreListFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// LoginSourceFilesStoreUpdateFunc describes the behavior when the Update +// method of the parent MockLoginSourceFilesStore instance is invoked. +type LoginSourceFilesStoreUpdateFunc struct { + defaultHook func(*LoginSource) + hooks []func(*LoginSource) + history []LoginSourceFilesStoreUpdateFuncCall + mutex sync.Mutex +} + +// Update delegates to the next hook function in the queue and stores the +// parameter and result values of this invocation. +func (m *MockLoginSourceFilesStore) Update(v0 *LoginSource) { + m.UpdateFunc.nextHook()(v0) + m.UpdateFunc.appendCall(LoginSourceFilesStoreUpdateFuncCall{v0}) + return +} + +// SetDefaultHook sets function that is called when the Update method of the +// parent MockLoginSourceFilesStore instance is invoked and the hook queue +// is empty. +func (f *LoginSourceFilesStoreUpdateFunc) SetDefaultHook(hook func(*LoginSource)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// Update method of the parent MockLoginSourceFilesStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *LoginSourceFilesStoreUpdateFunc) PushHook(hook func(*LoginSource)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *LoginSourceFilesStoreUpdateFunc) SetDefaultReturn() { + f.SetDefaultHook(func(*LoginSource) { + return + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *LoginSourceFilesStoreUpdateFunc) PushReturn() { + f.PushHook(func(*LoginSource) { + return + }) +} + +func (f *LoginSourceFilesStoreUpdateFunc) nextHook() func(*LoginSource) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *LoginSourceFilesStoreUpdateFunc) appendCall(r0 LoginSourceFilesStoreUpdateFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of LoginSourceFilesStoreUpdateFuncCall objects +// describing the invocations of this function. +func (f *LoginSourceFilesStoreUpdateFunc) History() []LoginSourceFilesStoreUpdateFuncCall { + f.mutex.Lock() + history := make([]LoginSourceFilesStoreUpdateFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// LoginSourceFilesStoreUpdateFuncCall is an object that describes an +// invocation of method Update on an instance of MockLoginSourceFilesStore. +type LoginSourceFilesStoreUpdateFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 *LoginSource +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c LoginSourceFilesStoreUpdateFuncCall) Args() []interface{} { + return []interface{}{c.Arg0} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c LoginSourceFilesStoreUpdateFuncCall) Results() []interface{} { + return []interface{}{} +} diff --git a/internal/database/models.go b/internal/database/models.go new file mode 100644 index 00000000000..7bcf1f1d1fe --- /dev/null +++ b/internal/database/models.go @@ -0,0 +1,243 @@ +package database + +import ( + "context" + "database/sql" + "fmt" + "os" + "path" + "path/filepath" + "strings" + "time" + + "github.com/cockroachdb/errors" + "github.com/glebarez/go-sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" + log "unknwon.dev/clog/v2" + "xorm.io/core" + "xorm.io/xorm" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database/migrations" + "gogs.io/gogs/internal/dbx" +) + +// Engine represents a XORM engine or session. +type Engine interface { + Delete(any) (int64, error) + Exec(...any) (sql.Result, error) + Find(any, ...any) error + Get(any) (bool, error) + ID(any) *xorm.Session + In(string, ...any) *xorm.Session + Insert(...any) (int64, error) + InsertOne(any) (int64, error) + Iterate(any, xorm.IterFunc) error + Sql(string, ...any) *xorm.Session + Table(any) *xorm.Session + Where(any, ...any) *xorm.Session +} + +var ( + x *xorm.Engine + legacyTables []any + HasEngine bool +) + +func init() { + // Register the pure-Go SQLite driver as "sqlite3" for XORM compatibility. + sql.Register("sqlite3", &sqlite.Driver{}) + + legacyTables = append(legacyTables, + new(User), new(PublicKey), new(TwoFactor), new(TwoFactorRecoveryCode), + new(Repository), new(DeployKey), new(Collaboration), new(Upload), + new(Watch), new(Star), + new(Issue), new(PullRequest), new(Comment), new(Attachment), new(IssueUser), + new(Label), new(IssueLabel), new(Milestone), + new(Mirror), new(Release), new(Webhook), new(HookTask), + new(ProtectBranch), new(ProtectBranchWhitelist), + new(Team), new(OrgUser), new(TeamUser), new(TeamRepo), + ) + + gonicNames := []string{"SSL"} + for _, name := range gonicNames { + core.LintGonicMapper[name] = true + } +} + +func getEngine() (*xorm.Engine, error) { + Param := "?" + if strings.Contains(conf.Database.Name, Param) { + Param = "&" + } + + driver := conf.Database.Type + connStr := "" + switch conf.Database.Type { + case "mysql": + conf.UseMySQL = true + if conf.Database.Host[0] == '/' { // looks like a unix socket + connStr = fmt.Sprintf("%s:%s@unix(%s)/%s%scharset=utf8mb4&parseTime=true", + conf.Database.User, conf.Database.Password, conf.Database.Host, conf.Database.Name, Param) + } else { + connStr = fmt.Sprintf("%s:%s@tcp(%s)/%s%scharset=utf8mb4&parseTime=true", + conf.Database.User, conf.Database.Password, conf.Database.Host, conf.Database.Name, Param) + } + engineParams := map[string]string{"rowFormat": "DYNAMIC"} + return xorm.NewEngineWithParams(conf.Database.Type, connStr, engineParams) + + case "postgres": + conf.UsePostgreSQL = true + host, port := dbx.ParsePostgreSQLHostPort(conf.Database.Host) + connStr = fmt.Sprintf("user='%s' password='%s' host='%s' port='%s' dbname='%s' sslmode='%s' search_path='%s'", + conf.Database.User, conf.Database.Password, host, port, conf.Database.Name, conf.Database.SSLMode, conf.Database.Schema) + driver = "pgx" + + case "sqlite3": + if err := os.MkdirAll(path.Dir(conf.Database.Path), os.ModePerm); err != nil { + return nil, errors.Newf("create directories: %v", err) + } + conf.UseSQLite3 = true + connStr = "file:" + conf.Database.Path + "?cache=shared&mode=rwc" + + default: + return nil, errors.Newf("unknown database type: %s", conf.Database.Type) + } + return xorm.NewEngine(driver, connStr) +} + +func NewTestEngine() error { + x, err := getEngine() + if err != nil { + return errors.Newf("connect to database: %v", err) + } + + if conf.UsePostgreSQL { + x.SetSchema(conf.Database.Schema) + } + + x.SetMapper(core.GonicMapper{}) + return x.StoreEngine("InnoDB").Sync2(legacyTables...) +} + +func SetEngine() (*gorm.DB, error) { + var err error + x, err = getEngine() + if err != nil { + return nil, errors.Newf("connect to database: %v", err) + } + + if conf.UsePostgreSQL { + x.SetSchema(conf.Database.Schema) + } + + x.SetMapper(core.GonicMapper{}) + + var logPath string + if conf.HookMode { + logPath = filepath.Join(conf.Log.RootPath, "hooks", "xorm.log") + } else { + logPath = filepath.Join(conf.Log.RootPath, "xorm.log") + } + sec := conf.File.Section("log.xorm") + fileWriter, err := log.NewFileWriter(logPath, + log.FileRotationConfig{ + Rotate: sec.Key("ROTATE").MustBool(true), + Daily: sec.Key("ROTATE_DAILY").MustBool(true), + MaxSize: sec.Key("MAX_SIZE").MustInt64(100) * 1024 * 1024, + MaxDays: sec.Key("MAX_DAYS").MustInt64(3), + }, + ) + if err != nil { + return nil, errors.Newf("create 'xorm.log': %v", err) + } + + x.SetMaxOpenConns(conf.Database.MaxOpenConns) + x.SetMaxIdleConns(conf.Database.MaxIdleConns) + x.SetConnMaxLifetime(time.Second) + + if conf.IsProdMode() { + x.SetLogger(xorm.NewSimpleLogger3(fileWriter, xorm.DEFAULT_LOG_PREFIX, xorm.DEFAULT_LOG_FLAG, core.LOG_ERR)) + } else { + x.SetLogger(xorm.NewSimpleLogger(fileWriter)) + } + x.ShowSQL(true) + + var gormLogger logger.Writer + if conf.HookMode { + gormLogger = &dbx.Logger{Writer: fileWriter} + } else { + gormLogger, err = newLogWriter() + if err != nil { + return nil, errors.Wrap(err, "new log writer") + } + } + return NewConnection(gormLogger) +} + +func NewEngine() error { + db, err := SetEngine() + if err != nil { + return err + } + + if err = migrations.Migrate(db); err != nil { + return errors.Newf("migrate: %v", err) + } + + if err = x.StoreEngine("InnoDB").Sync2(legacyTables...); err != nil { + return errors.Wrap(err, "sync tables") + } + + return nil +} + +type Statistic struct { + Counter struct { + User, Org, PublicKey, + Repo, Watch, Star, Action, Access, + Issue, Comment, Oauth, Follow, + Mirror, Release, LoginSource, Webhook, + Milestone, Label, HookTask, + Team, UpdateTask, Attachment int64 + } +} + +func GetStatistic(ctx context.Context) (stats Statistic) { + stats.Counter.User = Handle.Users().Count(ctx) + stats.Counter.Org = CountOrganizations() + stats.Counter.PublicKey, _ = x.Count(new(PublicKey)) + stats.Counter.Repo = CountRepositories(true) + stats.Counter.Watch, _ = x.Count(new(Watch)) + stats.Counter.Star, _ = x.Count(new(Star)) + stats.Counter.Action, _ = x.Count(new(Action)) + stats.Counter.Access, _ = x.Count(new(Access)) + stats.Counter.Issue, _ = x.Count(new(Issue)) + stats.Counter.Comment, _ = x.Count(new(Comment)) + stats.Counter.Oauth = 0 + stats.Counter.Follow, _ = x.Count(new(Follow)) + stats.Counter.Mirror, _ = x.Count(new(Mirror)) + stats.Counter.Release, _ = x.Count(new(Release)) + stats.Counter.LoginSource = Handle.LoginSources().Count(ctx) + stats.Counter.Webhook, _ = x.Count(new(Webhook)) + stats.Counter.Milestone, _ = x.Count(new(Milestone)) + stats.Counter.Label, _ = x.Count(new(Label)) + stats.Counter.HookTask, _ = x.Count(new(HookTask)) + stats.Counter.Team, _ = x.Count(new(Team)) + stats.Counter.Attachment, _ = x.Count(new(Attachment)) + return stats +} + +func Ping() error { + if x == nil { + return errors.New("database not available") + } + return x.Ping() +} + +// The version table. Should have only one row with id==1 +type Version struct { + ID int64 + Version int64 +} diff --git a/internal/database/notices.go b/internal/database/notices.go new file mode 100644 index 00000000000..20a1e1b04e6 --- /dev/null +++ b/internal/database/notices.go @@ -0,0 +1,104 @@ +package database + +import ( + "context" + "fmt" + "os" + "strconv" + "time" + + "gorm.io/gorm" + log "unknwon.dev/clog/v2" +) + +// NoticesStore is the storage layer for system notices. +type NoticesStore struct { + db *gorm.DB +} + +func newNoticesStore(db *gorm.DB) *NoticesStore { + return &NoticesStore{db: db} +} + +// Create creates a system notice with the given type and description. +func (s *NoticesStore) Create(ctx context.Context, typ NoticeType, desc string) error { + return s.db.WithContext(ctx).Create( + &Notice{ + Type: typ, + Description: desc, + }, + ).Error +} + +// DeleteByIDs deletes system notices by given IDs. +func (s *NoticesStore) DeleteByIDs(ctx context.Context, ids ...int64) error { + return s.db.WithContext(ctx).Where("id IN (?)", ids).Delete(&Notice{}).Error +} + +// DeleteAll deletes all system notices. +func (s *NoticesStore) DeleteAll(ctx context.Context) error { + return s.db.WithContext(ctx).Where("TRUE").Delete(&Notice{}).Error +} + +// List returns a list of system notices. Results are paginated by given page +// and page size, and sorted by primary key (id) in descending order. +func (s *NoticesStore) List(ctx context.Context, page, pageSize int) ([]*Notice, error) { + notices := make([]*Notice, 0, pageSize) + return notices, s.db.WithContext(ctx). + Limit(pageSize).Offset((page - 1) * pageSize). + Order("id DESC"). + Find(¬ices). + Error +} + +// Count returns the total number of system notices. +func (s *NoticesStore) Count(ctx context.Context) int64 { + var count int64 + s.db.WithContext(ctx).Model(&Notice{}).Count(&count) + return count +} + +type NoticeType int + +const ( + NoticeTypeRepository NoticeType = iota + 1 +) + +// TrStr returns a translation format string. +func (t NoticeType) TrStr() string { + return "admin.notices.type_" + strconv.Itoa(int(t)) +} + +// Notice represents a system notice for admin. +type Notice struct { + ID int64 `gorm:"primaryKey"` + Type NoticeType + Description string `xorm:"TEXT" gorm:"type:TEXT"` + Created time.Time `xorm:"-" gorm:"-" json:"-"` + CreatedUnix int64 +} + +// BeforeCreate implements the GORM create hook. +func (n *Notice) BeforeCreate(tx *gorm.DB) error { + if n.CreatedUnix == 0 { + n.CreatedUnix = tx.NowFunc().Unix() + } + return nil +} + +// AfterFind implements the GORM query hook. +func (n *Notice) AfterFind(*gorm.DB) error { + n.Created = time.Unix(n.CreatedUnix, 0).Local() + return nil +} + +// RemoveAllWithNotice is a helper function to remove all directories in given +// path and creates a system notice in case of an error. +func RemoveAllWithNotice(title, path string) { + if err := os.RemoveAll(path); err != nil { + desc := fmt.Sprintf("%s [%s]: %v", title, path, err) + if err = Handle.Notices().Create(context.Background(), NoticeTypeRepository, desc); err != nil { + log.Error("Failed to create repository notice: %v", err) + } + } +} diff --git a/internal/database/notices_test.go b/internal/database/notices_test.go new file mode 100644 index 00000000000..e1720aa7c9d --- /dev/null +++ b/internal/database/notices_test.go @@ -0,0 +1,159 @@ +package database + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gorm.io/gorm" +) + +func TestNotice_BeforeCreate(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + t.Run("CreatedUnix has been set", func(t *testing.T) { + notice := &Notice{ + CreatedUnix: 1, + } + _ = notice.BeforeCreate(db) + assert.Equal(t, int64(1), notice.CreatedUnix) + }) + + t.Run("CreatedUnix has not been set", func(t *testing.T) { + notice := &Notice{} + _ = notice.BeforeCreate(db) + assert.Equal(t, db.NowFunc().Unix(), notice.CreatedUnix) + }) +} + +func TestNotice_AfterFind(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + notice := &Notice{ + CreatedUnix: now.Unix(), + } + _ = notice.AfterFind(db) + assert.Equal(t, notice.CreatedUnix, notice.Created.Unix()) +} + +func TestNotices(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + s := &NoticesStore{ + db: newTestDB(t, "NoticesStore"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *NoticesStore) + }{ + {"Create", noticesCreate}, + {"DeleteByIDs", noticesDeleteByIDs}, + {"DeleteAll", noticesDeleteAll}, + {"List", noticesList}, + {"Count", noticesCount}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func noticesCreate(t *testing.T, ctx context.Context, s *NoticesStore) { + err := s.Create(ctx, NoticeTypeRepository, "test") + require.NoError(t, err) + + count := s.Count(ctx) + assert.Equal(t, int64(1), count) +} + +func noticesDeleteByIDs(t *testing.T, ctx context.Context, s *NoticesStore) { + err := s.Create(ctx, NoticeTypeRepository, "test") + require.NoError(t, err) + + notices, err := s.List(ctx, 1, 10) + require.NoError(t, err) + ids := make([]int64, 0, len(notices)) + for _, notice := range notices { + ids = append(ids, notice.ID) + } + + // Non-existing IDs should be ignored + ids = append(ids, 404) + err = s.DeleteByIDs(ctx, ids...) + require.NoError(t, err) + + count := s.Count(ctx) + assert.Equal(t, int64(0), count) +} + +func noticesDeleteAll(t *testing.T, ctx context.Context, s *NoticesStore) { + err := s.Create(ctx, NoticeTypeRepository, "test") + require.NoError(t, err) + + err = s.DeleteAll(ctx) + require.NoError(t, err) + + count := s.Count(ctx) + assert.Equal(t, int64(0), count) +} + +func noticesList(t *testing.T, ctx context.Context, s *NoticesStore) { + err := s.Create(ctx, NoticeTypeRepository, "test 1") + require.NoError(t, err) + err = s.Create(ctx, NoticeTypeRepository, "test 2") + require.NoError(t, err) + + got1, err := s.List(ctx, 1, 1) + require.NoError(t, err) + require.Len(t, got1, 1) + + got2, err := s.List(ctx, 2, 1) + require.NoError(t, err) + require.Len(t, got2, 1) + assert.True(t, got1[0].ID > got2[0].ID) + + got, err := s.List(ctx, 1, 3) + require.NoError(t, err) + require.Len(t, got, 2) +} + +func noticesCount(t *testing.T, ctx context.Context, s *NoticesStore) { + count := s.Count(ctx) + assert.Equal(t, int64(0), count) + + err := s.Create(ctx, NoticeTypeRepository, "test") + require.NoError(t, err) + + count = s.Count(ctx) + assert.Equal(t, int64(1), count) +} diff --git a/internal/database/org.go b/internal/database/org.go new file mode 100644 index 00000000000..80613991650 --- /dev/null +++ b/internal/database/org.go @@ -0,0 +1,556 @@ +package database + +import ( + "context" + "os" + "strings" + + "github.com/cockroachdb/errors" + "xorm.io/builder" + "xorm.io/xorm" + + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/repox" + "gogs.io/gogs/internal/userx" +) + +var ErrOrgNotExist = errors.New("Organization does not exist") + +// IsOwnedBy returns true if given user is in the owner team. +func (org *User) IsOwnedBy(userID int64) bool { + return IsOrganizationOwner(org.ID, userID) +} + +// IsOrgMember returns true if given user is member of organization. +func (org *User) IsOrgMember(uid int64) bool { + return org.IsOrganization() && IsOrganizationMember(org.ID, uid) +} + +func (org *User) getTeam(e Engine, name string) (*Team, error) { + return getTeamOfOrgByName(e, org.ID, name) +} + +// GetTeamOfOrgByName returns named team of organization. +func (org *User) GetTeam(name string) (*Team, error) { + return org.getTeam(x, name) +} + +func (org *User) getOwnerTeam(e Engine) (*Team, error) { + return org.getTeam(e, ownerTeamName) +} + +// GetOwnerTeam returns owner team of organization. +func (org *User) GetOwnerTeam() (*Team, error) { + return org.getOwnerTeam(x) +} + +func (org *User) getTeams(e Engine) (err error) { + org.Teams, err = getTeamsByOrgID(e, org.ID) + return err +} + +// GetTeams returns all teams that belong to organization. +func (org *User) GetTeams() error { + return org.getTeams(x) +} + +// TeamsHaveAccessToRepo returns all teams that have given access level to the repository. +func (org *User) TeamsHaveAccessToRepo(repoID int64, mode AccessMode) ([]*Team, error) { + return GetTeamsHaveAccessToRepo(org.ID, repoID, mode) +} + +// GetMembers returns all members of organization. +func (org *User) GetMembers(limit int) error { + ous, err := GetOrgUsersByOrgID(org.ID, limit) + if err != nil { + return err + } + + org.Members = make([]*User, len(ous)) + for i, ou := range ous { + org.Members[i], err = Handle.Users().GetByID(context.TODO(), ou.UID) + if err != nil { + return err + } + } + return nil +} + +// AddMember adds new member to organization. +func (org *User) AddMember(uid int64) error { + return AddOrgUser(org.ID, uid) +} + +// RemoveMember removes member from organization. +func (org *User) RemoveMember(uid int64) error { + return RemoveOrgUser(org.ID, uid) +} + +func (org *User) removeOrgRepo(e Engine, repoID int64) error { + return removeOrgRepo(e, org.ID, repoID) +} + +// RemoveOrgRepo removes all team-repository relations of organization. +func (org *User) RemoveOrgRepo(repoID int64) error { + return org.removeOrgRepo(x, repoID) +} + +// CreateOrganization creates record of a new organization. +func CreateOrganization(org, owner *User) (err error) { + if err = isUsernameAllowed(org.Name); err != nil { + return err + } + + if Handle.Users().IsUsernameUsed(context.TODO(), org.Name, 0) { + return ErrUserAlreadyExist{ + args: errx.Args{ + "name": org.Name, + }, + } + } + + org.LowerName = strings.ToLower(org.Name) + if org.Rands, err = userx.RandomSalt(); err != nil { + return err + } + if org.Salt, err = userx.RandomSalt(); err != nil { + return err + } + org.UseCustomAvatar = true + org.MaxRepoCreation = -1 + org.NumTeams = 1 + org.NumMembers = 1 + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Insert(org); err != nil { + return errors.Newf("insert organization: %v", err) + } + _ = userx.GenerateRandomAvatar(org.ID, org.Name, org.Email) + + // Add initial creator to organization and owner team. + if _, err = sess.Insert(&OrgUser{ + UID: owner.ID, + OrgID: org.ID, + IsOwner: true, + NumTeams: 1, + }); err != nil { + return errors.Newf("insert org-user relation: %v", err) + } + + // Create default owner team. + t := &Team{ + OrgID: org.ID, + LowerName: strings.ToLower(ownerTeamName), + Name: ownerTeamName, + Authorize: AccessModeOwner, + NumMembers: 1, + } + if _, err = sess.Insert(t); err != nil { + return errors.Newf("insert owner team: %v", err) + } + + if _, err = sess.Insert(&TeamUser{ + UID: owner.ID, + OrgID: org.ID, + TeamID: t.ID, + }); err != nil { + return errors.Newf("insert team-user relation: %v", err) + } + + if err = os.MkdirAll(repox.UserPath(org.Name), os.ModePerm); err != nil { + return errors.Newf("create directory: %v", err) + } + + return sess.Commit() +} + +// GetOrgByName returns organization by given name. +func GetOrgByName(name string) (*User, error) { + if name == "" { + return nil, ErrOrgNotExist + } + u := &User{ + LowerName: strings.ToLower(name), + Type: UserTypeOrganization, + } + has, err := x.Get(u) + if err != nil { + return nil, err + } else if !has { + return nil, ErrOrgNotExist + } + return u, nil +} + +// CountOrganizations returns number of organizations. +func CountOrganizations() int64 { + count, _ := x.Where("type=1").Count(new(User)) + return count +} + +// Organizations returns number of organizations in given page. +func Organizations(page, pageSize int) ([]*User, error) { + orgs := make([]*User, 0, pageSize) + return orgs, x.Limit(pageSize, (page-1)*pageSize).Where("type=1").Asc("id").Find(&orgs) +} + +// deleteBeans deletes all given beans, beans should contain delete conditions. +func deleteBeans(e Engine, beans ...any) (err error) { + for i := range beans { + if _, err = e.Delete(beans[i]); err != nil { + return err + } + } + return nil +} + +// DeleteOrganization completely and permanently deletes everything of organization. +func DeleteOrganization(org *User) error { + err := Handle.Users().DeleteByID(context.TODO(), org.ID, false) + if err != nil { + return err + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = deleteBeans(sess, + &Team{OrgID: org.ID}, + &OrgUser{OrgID: org.ID}, + &TeamUser{OrgID: org.ID}, + ); err != nil { + return errors.Newf("deleteBeans: %v", err) + } + return sess.Commit() +} + +// ________ ____ ___ +// \_____ \_______ ____ | | \______ ___________ +// / | \_ __ \/ ___\| | / ___// __ \_ __ \ +// / | \ | \/ /_/ > | /\___ \\ ___/| | \/ +// \_______ /__| \___ /|______//____ >\___ >__| +// \/ /_____/ \/ \/ + +// OrgUser represents relations of organizations and their members. +type OrgUser struct { + ID int64 `gorm:"primaryKey"` + UID int64 `xorm:"uid INDEX UNIQUE(s)" gorm:"column:uid;uniqueIndex:org_user_user_org_unique;index;not null"` + OrgID int64 `xorm:"INDEX UNIQUE(s)" gorm:"uniqueIndex:org_user_user_org_unique;index;not null"` + IsPublic bool `gorm:"not null;default:FALSE"` + IsOwner bool `gorm:"not null;default:FALSE"` + NumTeams int `gorm:"not null;default:0"` +} + +// IsOrganizationOwner returns true if given user is in the owner team. +func IsOrganizationOwner(orgID, userID int64) bool { + has, _ := x.Where("is_owner = ?", true).And("uid = ?", userID).And("org_id = ?", orgID).Get(new(OrgUser)) + return has +} + +// IsOrganizationMember returns true if given user is member of organization. +func IsOrganizationMember(orgID, uid int64) bool { + has, _ := x.Where("uid=?", uid).And("org_id=?", orgID).Get(new(OrgUser)) + return has +} + +// IsPublicMembership returns true if given user public his/her membership. +func IsPublicMembership(orgID, uid int64) bool { + has, _ := x.Where("uid=?", uid).And("org_id=?", orgID).And("is_public=?", true).Get(new(OrgUser)) + return has +} + +func getOrgsByUserID(sess *xorm.Session, userID int64, showAll bool) ([]*User, error) { + orgs := make([]*User, 0, 10) + if !showAll { + sess.And("`org_user`.is_public=?", true) + } + return orgs, sess.And("`org_user`.uid=?", userID). + Join("INNER", "`org_user`", "`org_user`.org_id=`user`.id").Find(&orgs) +} + +// GetOrgsByUserID returns a list of organizations that the given user ID +// has joined. +func GetOrgsByUserID(userID int64, showAll bool) ([]*User, error) { + return getOrgsByUserID(x.NewSession(), userID, showAll) +} + +func getOwnedOrgsByUserID(sess *xorm.Session, userID int64) ([]*User, error) { + orgs := make([]*User, 0, 10) + return orgs, sess.Where("`org_user`.uid=?", userID).And("`org_user`.is_owner=?", true). + Join("INNER", "`org_user`", "`org_user`.org_id=`user`.id").Find(&orgs) +} + +// GetOwnedOrgsByUserID returns a list of organizations are owned by given user ID. +func GetOwnedOrgsByUserID(userID int64) ([]*User, error) { + sess := x.NewSession() + return getOwnedOrgsByUserID(sess, userID) +} + +// GetOwnedOrganizationsByUserIDDesc returns a list of organizations are owned by +// given user ID, ordered descending by the given condition. +func GetOwnedOrgsByUserIDDesc(userID int64, desc string) ([]*User, error) { + sess := x.NewSession() + return getOwnedOrgsByUserID(sess.Desc(desc), userID) +} + +func getOrgUsersByOrgID(e Engine, orgID int64, limit int) ([]*OrgUser, error) { + orgUsers := make([]*OrgUser, 0, 10) + + sess := e.Where("org_id=?", orgID) + if limit > 0 { + sess = sess.Limit(limit) + } + return orgUsers, sess.Find(&orgUsers) +} + +// GetOrgUsersByOrgID returns all organization-user relations by organization ID. +func GetOrgUsersByOrgID(orgID int64, limit int) ([]*OrgUser, error) { + return getOrgUsersByOrgID(x, orgID, limit) +} + +// ChangeOrgUserStatus changes public or private membership status. +func ChangeOrgUserStatus(orgID, uid int64, public bool) error { + ou := new(OrgUser) + has, err := x.Where("uid=?", uid).And("org_id=?", orgID).Get(ou) + if err != nil { + return err + } else if !has { + return nil + } + + ou.IsPublic = public + _, err = x.Id(ou.ID).AllCols().Update(ou) + return err +} + +// AddOrgUser adds new user to given organization. +func AddOrgUser(orgID, uid int64) error { + if IsOrganizationMember(orgID, uid) { + return nil + } + + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + + ou := &OrgUser{ + UID: uid, + OrgID: orgID, + } + + if _, err := sess.Insert(ou); err != nil { + return err + } else if _, err = sess.Exec("UPDATE `user` SET num_members = num_members + 1 WHERE id = ?", orgID); err != nil { + return err + } + + return sess.Commit() +} + +// RemoveOrgUser removes user from given organization. +func RemoveOrgUser(orgID, userID int64) error { + ou := new(OrgUser) + + has, err := x.Where("uid=?", userID).And("org_id=?", orgID).Get(ou) + if err != nil { + return errors.Newf("get org-user: %v", err) + } else if !has { + return nil + } + + user, err := Handle.Users().GetByID(context.TODO(), userID) + if err != nil { + return errors.Newf("GetUserByID [%d]: %v", userID, err) + } + org, err := Handle.Users().GetByID(context.TODO(), orgID) + if err != nil { + return errors.Newf("GetUserByID [%d]: %v", orgID, err) + } + + // FIXME: only need to get IDs here, not all fields of repository. + repos, _, err := org.GetUserRepositories(user.ID, 1, org.NumRepos) + if err != nil { + return errors.Newf("GetUserRepositories [%d]: %v", user.ID, err) + } + + // Check if the user to delete is the last member in owner team. + if IsOrganizationOwner(orgID, userID) { + t, err := org.GetOwnerTeam() + if err != nil { + return err + } + if t.NumMembers == 1 { + return ErrLastOrgOwner{UID: userID} + } + } + + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + + if _, err := sess.ID(ou.ID).Delete(ou); err != nil { + return err + } else if _, err = sess.Exec("UPDATE `user` SET num_members=num_members-1 WHERE id=?", orgID); err != nil { + return err + } + + // Delete all repository accesses and unwatch them. + repoIDs := make([]int64, 0, len(repos)) + for i := range repos { + repoIDs = append(repoIDs, repos[i].ID) + if err = watchRepo(sess, user.ID, repos[i].ID, false); err != nil { + return err + } + } + + if len(repoIDs) > 0 { + if _, err = sess.Where("user_id = ?", user.ID).In("repo_id", repoIDs).Delete(new(Access)); err != nil { + return err + } + } + + // Delete member in his/her teams. + teams, err := getUserTeams(sess, org.ID, user.ID) + if err != nil { + return err + } + for _, t := range teams { + if err = removeTeamMember(sess, org.ID, t.ID, user.ID); err != nil { + return err + } + } + + return sess.Commit() +} + +func removeOrgRepo(e Engine, orgID, repoID int64) error { + _, err := e.Delete(&TeamRepo{ + OrgID: orgID, + RepoID: repoID, + }) + return err +} + +// RemoveOrgRepo removes all team-repository relations of given organization. +func RemoveOrgRepo(orgID, repoID int64) error { + return removeOrgRepo(x, orgID, repoID) +} + +func (org *User) getUserTeams(e Engine, userID int64, cols ...string) ([]*Team, error) { + teams := make([]*Team, 0, org.NumTeams) + return teams, e.Where("team_user.org_id = ?", org.ID). + And("team_user.uid = ?", userID). + Join("INNER", "team_user", "team_user.team_id = team.id"). + Cols(cols...).Find(&teams) +} + +// GetUserTeamIDs returns of all team IDs of the organization that user is member of. +func (org *User) GetUserTeamIDs(userID int64) ([]int64, error) { + teams, err := org.getUserTeams(x, userID, "team.id") + if err != nil { + return nil, errors.Newf("getUserTeams [%d]: %v", userID, err) + } + + teamIDs := make([]int64, len(teams)) + for i := range teams { + teamIDs[i] = teams[i].ID + } + return teamIDs, nil +} + +// GetTeams returns all teams that belong to organization, +// and that the user has joined. +func (org *User) GetUserTeams(userID int64) ([]*Team, error) { + return org.getUserTeams(x, userID) +} + +// GetUserRepositories returns a range of repositories in organization which the user has access to, +// and total number of records based on given condition. +func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repository, int64, error) { + teamIDs, err := org.GetUserTeamIDs(userID) + if err != nil { + return nil, 0, errors.Newf("GetUserTeamIDs: %v", err) + } + if len(teamIDs) == 0 { + // user has no team but "IN ()" is invalid SQL + teamIDs = []int64{-1} // there is no team with id=-1 + } + + var teamRepoIDs []int64 + if err = x.Table("team_repo").In("team_id", teamIDs).Distinct("repo_id").Find(&teamRepoIDs); err != nil { + return nil, 0, errors.Newf("get team repository IDs: %v", err) + } + if len(teamRepoIDs) == 0 { + // team has no repo but "IN ()" is invalid SQL + teamRepoIDs = []int64{-1} // there is no repo with id=-1 + } + + if page <= 0 { + page = 1 + } + repos := make([]*Repository, 0, pageSize) + if err = x.Where("owner_id = ?", org.ID). + And(builder.Or( + builder.And(builder.Expr("is_private = ?", false), builder.Expr("is_unlisted = ?", false)), + builder.In("id", teamRepoIDs))). + Desc("updated_unix"). + Limit(pageSize, (page-1)*pageSize). + Find(&repos); err != nil { + return nil, 0, errors.Newf("get user repositories: %v", err) + } + + repoCount, err := x.Where("owner_id = ?", org.ID). + And(builder.Or( + builder.Expr("is_private = ?", false), + builder.In("id", teamRepoIDs))). + Count(new(Repository)) + if err != nil { + return nil, 0, errors.Newf("count user repositories: %v", err) + } + + return repos, repoCount, nil +} + +// GetUserMirrorRepositories returns mirror repositories of the organization which the user has access to. +func (org *User) GetUserMirrorRepositories(userID int64) ([]*Repository, error) { + teamIDs, err := org.GetUserTeamIDs(userID) + if err != nil { + return nil, errors.Newf("GetUserTeamIDs: %v", err) + } + if len(teamIDs) == 0 { + teamIDs = []int64{-1} + } + + var teamRepoIDs []int64 + err = x.Table("team_repo").In("team_id", teamIDs).Distinct("repo_id").Find(&teamRepoIDs) + if err != nil { + return nil, errors.Newf("get team repository ids: %v", err) + } + if len(teamRepoIDs) == 0 { + // team has no repo but "IN ()" is invalid SQL + teamRepoIDs = []int64{-1} // there is no repo with id=-1 + } + + repos := make([]*Repository, 0, 10) + if err = x.Where("owner_id = ?", org.ID). + And("is_private = ?", false). + Or(builder.In("id", teamRepoIDs)). + And("is_mirror = ?", true). // Don't move up because it's an independent condition + Desc("updated_unix"). + Find(&repos); err != nil { + return nil, errors.Newf("get user repositories: %v", err) + } + return repos, nil +} diff --git a/internal/database/org_team.go b/internal/database/org_team.go new file mode 100644 index 00000000000..61076b76c7e --- /dev/null +++ b/internal/database/org_team.go @@ -0,0 +1,717 @@ +package database + +import ( + "context" + "fmt" + "strings" + + "github.com/cockroachdb/errors" + "xorm.io/xorm" + + "gogs.io/gogs/internal/errx" +) + +const ownerTeamName = "Owners" + +// Team represents a organization team. +type Team struct { + ID int64 + OrgID int64 `xorm:"INDEX"` + LowerName string + Name string + Description string + Authorize AccessMode + Repos []*Repository `xorm:"-" json:"-" gorm:"-"` + Members []*User `xorm:"-" json:"-" gorm:"-"` + NumRepos int + NumMembers int +} + +func (t *Team) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "num_repos": + // LEGACY [1.0]: this is backward compatibility bug fix for https://github.com/gogs/gogs/issues/3671 + if t.NumRepos < 0 { + t.NumRepos = 0 + } + } +} + +// IsOwnerTeam returns true if team is owner team. +func (t *Team) IsOwnerTeam() bool { + return t.Name == ownerTeamName +} + +// HasWriteAccess returns true if team has at least write level access mode. +func (t *Team) HasWriteAccess() bool { + return t.Authorize >= AccessModeWrite +} + +// IsTeamMember returns true if given user is a member of team. +func (t *Team) IsMember(userID int64) bool { + return IsTeamMember(t.OrgID, t.ID, userID) +} + +func (t *Team) getRepositories(e Engine) (err error) { + teamRepos := make([]*TeamRepo, 0, t.NumRepos) + if err = x.Where("team_id=?", t.ID).Find(&teamRepos); err != nil { + return errors.Newf("get team-repos: %v", err) + } + + t.Repos = make([]*Repository, 0, len(teamRepos)) + for i := range teamRepos { + repo, err := getRepositoryByID(e, teamRepos[i].RepoID) + if err != nil { + return errors.Newf("getRepositoryById(%d): %v", teamRepos[i].RepoID, err) + } + t.Repos = append(t.Repos, repo) + } + return nil +} + +// GetRepositories returns all repositories in team of organization. +func (t *Team) GetRepositories() error { + return t.getRepositories(x) +} + +func (t *Team) getMembers(e Engine) (err error) { + t.Members, err = getTeamMembers(e, t.ID) + return err +} + +// GetMembers returns all members in team of organization. +func (t *Team) GetMembers() (err error) { + return t.getMembers(x) +} + +// AddMember adds new membership of the team to the organization, +// the user will have membership to the organization automatically when needed. +func (t *Team) AddMember(uid int64) error { + return AddTeamMember(t.OrgID, t.ID, uid) +} + +// RemoveMember removes member from team of organization. +func (t *Team) RemoveMember(uid int64) error { + return RemoveTeamMember(t.OrgID, t.ID, uid) +} + +func (t *Team) hasRepository(e Engine, repoID int64) bool { + return hasTeamRepo(e, t.OrgID, t.ID, repoID) +} + +// HasRepository returns true if given repository belong to team. +func (t *Team) HasRepository(repoID int64) bool { + return t.hasRepository(x, repoID) +} + +func (t *Team) addRepository(e Engine, repo *Repository) (err error) { + if err = addTeamRepo(e, t.OrgID, t.ID, repo.ID); err != nil { + return err + } + + t.NumRepos++ + if _, err = e.ID(t.ID).AllCols().Update(t); err != nil { + return errors.Newf("update team: %v", err) + } + + if err = repo.recalculateTeamAccesses(e, 0); err != nil { + return errors.Newf("recalculateAccesses: %v", err) + } + + if err = t.getMembers(e); err != nil { + return errors.Newf("getMembers: %v", err) + } + for _, u := range t.Members { + if err = watchRepo(e, u.ID, repo.ID, true); err != nil { + return errors.Newf("watchRepo: %v", err) + } + } + return nil +} + +// AddRepository adds new repository to team of organization. +func (t *Team) AddRepository(repo *Repository) (err error) { + if repo.OwnerID != t.OrgID { + return errors.New("Repository does not belong to organization") + } else if t.HasRepository(repo.ID) { + return nil + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = t.addRepository(sess, repo); err != nil { + return err + } + + return sess.Commit() +} + +func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (err error) { + if err = removeTeamRepo(e, t.ID, repo.ID); err != nil { + return err + } + + t.NumRepos-- + if _, err = e.ID(t.ID).AllCols().Update(t); err != nil { + return err + } + + // Don't need to recalculate when delete a repository from organization. + if recalculate { + if err = repo.recalculateTeamAccesses(e, t.ID); err != nil { + return err + } + } + + if err = t.getMembers(e); err != nil { + return errors.Newf("get team members: %v", err) + } + + // TODO: Delete me when this method is migrated to use GORM. + userAccessMode := func(e Engine, userID int64, repo *Repository) (AccessMode, error) { + mode := AccessModeNone + // Everyone has read access to public repository + if !repo.IsPrivate { + mode = AccessModeRead + } + + if userID <= 0 { + return mode, nil + } + + if userID == repo.OwnerID { + return AccessModeOwner, nil + } + + access := &Access{ + UserID: userID, + RepoID: repo.ID, + } + if has, err := e.Get(access); !has || err != nil { + return mode, err + } + return access.Mode, nil + } + + hasAccess := func(e Engine, userID int64, repo *Repository, testMode AccessMode) (bool, error) { + mode, err := userAccessMode(e, userID, repo) + return mode >= testMode, err + } + + for _, member := range t.Members { + has, err := hasAccess(e, member.ID, repo, AccessModeRead) + if err != nil { + return err + } else if has { + continue + } + + if err = watchRepo(e, member.ID, repo.ID, false); err != nil { + return err + } + } + + return nil +} + +// RemoveRepository removes repository from team of organization. +func (t *Team) RemoveRepository(repoID int64) error { + if !t.HasRepository(repoID) { + return nil + } + + repo, err := GetRepositoryByID(repoID) + if err != nil { + return err + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = t.removeRepository(sess, repo, true); err != nil { + return err + } + + return sess.Commit() +} + +var reservedTeamNames = map[string]struct{}{ + "new": {}, +} + +// IsUsableTeamName return an error if given name is a reserved name or pattern. +func IsUsableTeamName(name string) error { + return isNameAllowed(reservedTeamNames, nil, name) +} + +// NewTeam creates a record of new team. +// It's caller's responsibility to assign organization ID. +func NewTeam(t *Team) error { + if t.Name == "" { + return errors.New("empty team name") + } else if t.OrgID == 0 { + return errors.New("OrgID is not assigned") + } + + if err := IsUsableTeamName(t.Name); err != nil { + return err + } + + has, err := x.Id(t.OrgID).Get(new(User)) + if err != nil { + return err + } else if !has { + return ErrOrgNotExist + } + + t.LowerName = strings.ToLower(t.Name) + existingTeam := Team{} + has, err = x.Where("org_id=?", t.OrgID).And("lower_name=?", t.LowerName).Get(&existingTeam) + if err != nil { + return err + } else if has { + return ErrTeamAlreadyExist{existingTeam.ID, t.OrgID, t.LowerName} + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Insert(t); err != nil { + return err + } + + // Update organization number of teams. + if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams+1 WHERE id = ?", t.OrgID); err != nil { + return err + } + return sess.Commit() +} + +var _ errx.NotFound = (*ErrTeamNotExist)(nil) + +type ErrTeamNotExist struct { + args map[string]any +} + +func IsErrTeamNotExist(err error) bool { + _, ok := err.(ErrTeamNotExist) + return ok +} + +func (err ErrTeamNotExist) Error() string { + return fmt.Sprintf("team does not exist: %v", err.args) +} + +func (ErrTeamNotExist) NotFound() bool { + return true +} + +func getTeamOfOrgByName(e Engine, orgID int64, name string) (*Team, error) { + t := &Team{ + OrgID: orgID, + LowerName: strings.ToLower(name), + } + has, err := e.Get(t) + if err != nil { + return nil, err + } else if !has { + return nil, ErrTeamNotExist{args: map[string]any{"orgID": orgID, "name": name}} + } + return t, nil +} + +// GetTeamOfOrgByName returns team by given team name and organization. +func GetTeamOfOrgByName(orgID int64, name string) (*Team, error) { + return getTeamOfOrgByName(x, orgID, name) +} + +func getTeamByID(e Engine, teamID int64) (*Team, error) { + t := new(Team) + has, err := e.ID(teamID).Get(t) + if err != nil { + return nil, err + } else if !has { + return nil, ErrTeamNotExist{args: map[string]any{"teamID": teamID}} + } + return t, nil +} + +// GetTeamByID returns team by given ID. +func GetTeamByID(teamID int64) (*Team, error) { + return getTeamByID(x, teamID) +} + +func getTeamsByOrgID(e Engine, orgID int64) ([]*Team, error) { + teams := make([]*Team, 0, 3) + return teams, e.Where("org_id = ?", orgID).Find(&teams) +} + +// GetTeamsByOrgID returns all teams belong to given organization. +func GetTeamsByOrgID(orgID int64) ([]*Team, error) { + return getTeamsByOrgID(x, orgID) +} + +// UpdateTeam updates information of team. +func UpdateTeam(t *Team, authChanged bool) (err error) { + if t.Name == "" { + return errors.New("empty team name") + } + + if len(t.Description) > 255 { + t.Description = t.Description[:255] + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + t.LowerName = strings.ToLower(t.Name) + existingTeam := new(Team) + has, err := x.Where("org_id=?", t.OrgID).And("lower_name=?", t.LowerName).And("id!=?", t.ID).Get(existingTeam) + if err != nil { + return err + } else if has { + return ErrTeamAlreadyExist{existingTeam.ID, t.OrgID, t.LowerName} + } + + if _, err = sess.ID(t.ID).AllCols().Update(t); err != nil { + return errors.Newf("update: %v", err) + } + + // Update access for team members if needed. + if authChanged { + if err = t.getRepositories(sess); err != nil { + return errors.Newf("getRepositories:%v", err) + } + + for _, repo := range t.Repos { + if err = repo.recalculateTeamAccesses(sess, 0); err != nil { + return errors.Newf("recalculateTeamAccesses: %v", err) + } + } + } + + return sess.Commit() +} + +// DeleteTeam deletes given team. +// It's caller's responsibility to assign organization ID. +func DeleteTeam(t *Team) error { + if err := t.GetRepositories(); err != nil { + return err + } + + // Get organization. + org, err := Handle.Users().GetByID(context.TODO(), t.OrgID) + if err != nil { + return err + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + // Delete all accesses. + for _, repo := range t.Repos { + if err = repo.recalculateTeamAccesses(sess, t.ID); err != nil { + return err + } + } + + // Delete team-user. + if _, err = sess.Where("org_id=?", org.ID).Where("team_id=?", t.ID).Delete(new(TeamUser)); err != nil { + return err + } + + // Delete team. + if _, err = sess.ID(t.ID).Delete(new(Team)); err != nil { + return err + } + // Update organization number of teams. + if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams-1 WHERE id=?", t.OrgID); err != nil { + return err + } + + return sess.Commit() +} + +// ___________ ____ ___ +// \__ ___/___ _____ _____ | | \______ ___________ +// | |_/ __ \\__ \ / \| | / ___// __ \_ __ \ +// | |\ ___/ / __ \| Y Y \ | /\___ \\ ___/| | \/ +// |____| \___ >____ /__|_| /______//____ >\___ >__| +// \/ \/ \/ \/ \/ + +// TeamUser represents an team-user relation. +type TeamUser struct { + ID int64 + OrgID int64 `xorm:"INDEX"` + TeamID int64 `xorm:"UNIQUE(s)"` + UID int64 `xorm:"UNIQUE(s)"` +} + +func isTeamMember(e Engine, orgID, teamID, uid int64) bool { + has, _ := e.Where("org_id=?", orgID).And("team_id=?", teamID).And("uid=?", uid).Get(new(TeamUser)) + return has +} + +// IsTeamMember returns true if given user is a member of team. +func IsTeamMember(orgID, teamID, uid int64) bool { + return isTeamMember(x, orgID, teamID, uid) +} + +func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) { + teamUsers := make([]*TeamUser, 0, 10) + if err = e.Sql("SELECT `id`, `org_id`, `team_id`, `uid` FROM `team_user` WHERE team_id = ?", teamID). + Find(&teamUsers); err != nil { + return nil, errors.Newf("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, errors.Newf("get user '%d': %v", teamUsers[i].UID, err) + } + members = append(members, member) + } + return members, nil +} + +// GetTeamMembers returns all members in given team of organization. +func GetTeamMembers(teamID int64) ([]*User, error) { + return getTeamMembers(x, teamID) +} + +func getUserTeams(e Engine, orgID, userID int64) ([]*Team, error) { + teamUsers := make([]*TeamUser, 0, 5) + if err := e.Where("uid = ?", userID).And("org_id = ?", orgID).Find(&teamUsers); err != nil { + return nil, err + } + + teamIDs := make([]int64, len(teamUsers)+1) + for i := range teamUsers { + teamIDs[i] = teamUsers[i].TeamID + } + teamIDs[len(teamUsers)] = -1 + + teams := make([]*Team, 0, len(teamIDs)) + return teams, e.Where("org_id = ?", orgID).In("id", teamIDs).Find(&teams) +} + +// GetUserTeams returns all teams that user belongs to in given organization. +func GetUserTeams(orgID, userID int64) ([]*Team, error) { + return getUserTeams(x, orgID, userID) +} + +// AddTeamMember adds new membership of given team to given organization, +// the user will have membership to given organization automatically when needed. +func AddTeamMember(orgID, teamID, userID int64) error { + if IsTeamMember(orgID, teamID, userID) { + return nil + } + + if err := AddOrgUser(orgID, userID); err != nil { + return err + } + + // Get team and its repositories. + t, err := GetTeamByID(teamID) + if err != nil { + return err + } + t.NumMembers++ + + if err = t.GetRepositories(); err != nil { + return err + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + tu := &TeamUser{ + UID: userID, + OrgID: orgID, + TeamID: teamID, + } + if _, err = sess.Insert(tu); err != nil { + return err + } else if _, err = sess.ID(t.ID).Update(t); err != nil { + return err + } + + // Give access to team repositories. + for _, repo := range t.Repos { + if err = repo.recalculateTeamAccesses(sess, 0); err != nil { + return err + } + } + + // We make sure it exists before. + ou := new(OrgUser) + if _, err = sess.Where("uid = ?", userID).And("org_id = ?", orgID).Get(ou); err != nil { + return err + } + ou.NumTeams++ + if t.IsOwnerTeam() { + ou.IsOwner = true + } + if _, err = sess.ID(ou.ID).AllCols().Update(ou); err != nil { + return err + } + + return sess.Commit() +} + +func removeTeamMember(e Engine, orgID, teamID, uid int64) error { + if !isTeamMember(e, orgID, teamID, uid) { + return nil + } + + // Get team and its repositories. + t, err := getTeamByID(e, teamID) + if err != nil { + return err + } + + // Check if the user to delete is the last member in owner team. + if t.IsOwnerTeam() && t.NumMembers == 1 { + return ErrLastOrgOwner{UID: uid} + } + + t.NumMembers-- + + if err = t.getRepositories(e); err != nil { + return err + } + + // Get organization. + org, err := getUserByID(e, orgID) + if err != nil { + return err + } + + tu := &TeamUser{ + UID: uid, + OrgID: orgID, + TeamID: teamID, + } + if _, err := e.Delete(tu); err != nil { + return err + } else if _, err = e.ID(t.ID).AllCols().Update(t); err != nil { + return err + } + + // Delete access to team repositories. + for _, repo := range t.Repos { + if err = repo.recalculateTeamAccesses(e, 0); err != nil { + return err + } + } + + // This must exist. + ou := new(OrgUser) + _, err = e.Where("uid = ?", uid).And("org_id = ?", org.ID).Get(ou) + if err != nil { + return err + } + ou.NumTeams-- + if t.IsOwnerTeam() { + ou.IsOwner = false + } + if _, err = e.ID(ou.ID).AllCols().Update(ou); err != nil { + return err + } + return nil +} + +// RemoveTeamMember removes member from given team of given organization. +func RemoveTeamMember(orgID, teamID, uid int64) error { + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + if err := removeTeamMember(sess, orgID, teamID, uid); err != nil { + return err + } + return sess.Commit() +} + +// ___________ __________ +// \__ ___/___ _____ _____\______ \ ____ ______ ____ +// | |_/ __ \\__ \ / \| _// __ \\____ \ / _ \ +// | |\ ___/ / __ \| Y Y \ | \ ___/| |_> > <_> ) +// |____| \___ >____ /__|_| /____|_ /\___ > __/ \____/ +// \/ \/ \/ \/ \/|__| + +// TeamRepo represents an team-repository relation. +type TeamRepo struct { + ID int64 + OrgID int64 `xorm:"INDEX"` + TeamID int64 `xorm:"UNIQUE(s)"` + RepoID int64 `xorm:"UNIQUE(s)"` +} + +func hasTeamRepo(e Engine, orgID, teamID, repoID int64) bool { + has, _ := e.Where("org_id = ?", orgID).And("team_id = ?", teamID).And("repo_id = ?", repoID).Get(new(TeamRepo)) + return has +} + +// HasTeamRepo returns true if given team has access to the repository of the organization. +func HasTeamRepo(orgID, teamID, repoID int64) bool { + return hasTeamRepo(x, orgID, teamID, repoID) +} + +func addTeamRepo(e Engine, orgID, teamID, repoID int64) error { + _, err := e.InsertOne(&TeamRepo{ + OrgID: orgID, + TeamID: teamID, + RepoID: repoID, + }) + return err +} + +// AddTeamRepo adds new repository relation to team. +func AddTeamRepo(orgID, teamID, repoID int64) error { + return addTeamRepo(x, orgID, teamID, repoID) +} + +func removeTeamRepo(e Engine, teamID, repoID int64) error { + _, err := e.Delete(&TeamRepo{ + TeamID: teamID, + RepoID: repoID, + }) + return err +} + +// RemoveTeamRepo deletes repository relation to team. +func RemoveTeamRepo(teamID, repoID int64) error { + return removeTeamRepo(x, teamID, repoID) +} + +// GetTeamsHaveAccessToRepo returns all teams in an organization that have given access level to the repository. +func GetTeamsHaveAccessToRepo(orgID, repoID int64, mode AccessMode) ([]*Team, error) { + teams := make([]*Team, 0, 5) + return teams, x.Where("team.authorize >= ?", mode). + Join("INNER", "team_repo", "team_repo.team_id = team.id"). + And("team_repo.org_id = ?", orgID). + And("team_repo.repo_id = ?", repoID). + Find(&teams) +} diff --git a/internal/database/organizations.go b/internal/database/organizations.go new file mode 100644 index 00000000000..2342df30584 --- /dev/null +++ b/internal/database/organizations.go @@ -0,0 +1,75 @@ +package database + +import ( + "context" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + + "gogs.io/gogs/internal/dbx" +) + +// OrganizationsStore is the storage layer for organizations. +type OrganizationsStore struct { + db *gorm.DB +} + +func newOrganizationsStoreStore(db *gorm.DB) *OrganizationsStore { + return &OrganizationsStore{db: db} +} + +type ListOrgsOptions struct { + // Filter by the membership with the given user ID. + MemberID int64 + // Whether to include private memberships. + IncludePrivateMembers bool +} + +// List returns a list of organizations filtered by options. +func (s *OrganizationsStore) List(ctx context.Context, opts ListOrgsOptions) ([]*Organization, error) { + if opts.MemberID <= 0 { + return nil, errors.New("MemberID must be greater than 0") + } + + /* + Equivalent SQL for PostgreSQL: + + SELECT * FROM "org" + JOIN org_user ON org_user.org_id = org.id + WHERE + org_user.uid = @memberID + [AND org_user.is_public = @includePrivateMembers] + ORDER BY org.id ASC + */ + tx := s.db.WithContext(ctx). + Joins(dbx.Quote("JOIN org_user ON org_user.org_id = %s.id", "user")). + Where("org_user.uid = ?", opts.MemberID). + Order(dbx.Quote("%s.id ASC", "user")) + if !opts.IncludePrivateMembers { + tx = tx.Where("org_user.is_public = ?", true) + } + + var orgs []*Organization + return orgs, tx.Find(&orgs).Error +} + +// SearchByName returns a list of organizations whose username or full name +// matches the given keyword case-insensitively. Results are paginated by given +// page and page size, and sorted by the given order (e.g. "id DESC"). A total +// count of all results is also returned. If the order is not given, it's up to +// the database to decide. +func (s *OrganizationsStore) SearchByName(ctx context.Context, keyword string, page, pageSize int, orderBy string) ([]*Organization, int64, error) { + return searchUserByName(ctx, s.db, UserTypeOrganization, keyword, page, pageSize, orderBy) +} + +// CountByUser returns the number of organizations the user is a member of. +func (s *OrganizationsStore) CountByUser(ctx context.Context, userID int64) (int64, error) { + var count int64 + return count, s.db.WithContext(ctx).Model(&OrgUser{}).Where("uid = ?", userID).Count(&count).Error +} + +type Organization = User + +func (o *Organization) TableName() string { + return "user" +} diff --git a/internal/database/organizations_test.go b/internal/database/organizations_test.go new file mode 100644 index 00000000000..18a57ee66ec --- /dev/null +++ b/internal/database/organizations_test.go @@ -0,0 +1,174 @@ +package database + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gogs.io/gogs/internal/dbx" +) + +func TestOrgs(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + s := &OrganizationsStore{ + db: newTestDB(t, "OrganizationsStore"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *OrganizationsStore) + }{ + {"List", orgsList}, + {"SearchByName", organizationsSearchByName}, + {"CountByUser", organizationsCountByUser}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func orgsList(t *testing.T, ctx context.Context, s *OrganizationsStore) { + usersStore := newUsersStore(s.db) + alice, err := usersStore.Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + bob, err := usersStore.Create(ctx, "bob", "bob@example.com", CreateUserOptions{}) + require.NoError(t, err) + + // TODO: Use Orgs.Create to replace SQL hack when the method is available. + org1, err := usersStore.Create(ctx, "org1", "org1@example.com", CreateUserOptions{}) + require.NoError(t, err) + org2, err := usersStore.Create(ctx, "org2", "org2@example.com", CreateUserOptions{}) + require.NoError(t, err) + err = s.db.Exec( + dbx.Quote("UPDATE %s SET type = ? WHERE id IN (?, ?)", "user"), + UserTypeOrganization, org1.ID, org2.ID, + ).Error + require.NoError(t, err) + + // TODO: Use Orgs.Join to replace SQL hack when the method is available. + err = s.db.Exec(`INSERT INTO org_user (uid, org_id, is_public) VALUES (?, ?, ?)`, alice.ID, org1.ID, false).Error + require.NoError(t, err) + err = s.db.Exec(`INSERT INTO org_user (uid, org_id, is_public) VALUES (?, ?, ?)`, alice.ID, org2.ID, true).Error + require.NoError(t, err) + err = s.db.Exec(`INSERT INTO org_user (uid, org_id, is_public) VALUES (?, ?, ?)`, bob.ID, org2.ID, true).Error + require.NoError(t, err) + + tests := []struct { + name string + opts ListOrgsOptions + wantOrgNames []string + }{ + { + name: "only public memberships for a user", + opts: ListOrgsOptions{ + MemberID: alice.ID, + IncludePrivateMembers: false, + }, + wantOrgNames: []string{org2.Name}, + }, + { + name: "all memberships for a user", + opts: ListOrgsOptions{ + MemberID: alice.ID, + IncludePrivateMembers: true, + }, + wantOrgNames: []string{org1.Name, org2.Name}, + }, + { + name: "no membership for a non-existent user", + opts: ListOrgsOptions{ + MemberID: 404, + IncludePrivateMembers: true, + }, + wantOrgNames: []string{}, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got, err := s.List(ctx, test.opts) + require.NoError(t, err) + + gotOrgNames := make([]string, len(got)) + for i := range got { + gotOrgNames[i] = got[i].Name + } + assert.Equal(t, test.wantOrgNames, gotOrgNames) + }) + } +} + +func organizationsSearchByName(t *testing.T, ctx context.Context, s *OrganizationsStore) { + // TODO: Use Orgs.Create to replace SQL hack when the method is available. + usersStore := newUsersStore(s.db) + org1, err := usersStore.Create(ctx, "org1", "org1@example.com", CreateUserOptions{FullName: "Acme Corp"}) + require.NoError(t, err) + org2, err := usersStore.Create(ctx, "org2", "org2@example.com", CreateUserOptions{FullName: "Acme Corp 2"}) + require.NoError(t, err) + err = s.db.Exec( + dbx.Quote("UPDATE %s SET type = ? WHERE id IN (?, ?)", "user"), + UserTypeOrganization, org1.ID, org2.ID, + ).Error + require.NoError(t, err) + + t.Run("search for username org1", func(t *testing.T) { + orgs, count, err := s.SearchByName(ctx, "G1", 1, 1, "") + require.NoError(t, err) + require.Len(t, orgs, int(count)) + assert.Equal(t, int64(1), count) + assert.Equal(t, org1.ID, orgs[0].ID) + }) + + t.Run("search for username org2", func(t *testing.T) { + orgs, count, err := s.SearchByName(ctx, "G2", 1, 1, "") + require.NoError(t, err) + require.Len(t, orgs, int(count)) + assert.Equal(t, int64(1), count) + assert.Equal(t, org2.ID, orgs[0].ID) + }) + + t.Run("search for full name acme", func(t *testing.T) { + orgs, count, err := s.SearchByName(ctx, "ACME", 1, 10, "") + require.NoError(t, err) + require.Len(t, orgs, int(count)) + assert.Equal(t, int64(2), count) + }) + + t.Run("search for full name acme ORDER BY id DESC LIMIT 1", func(t *testing.T) { + orgs, count, err := s.SearchByName(ctx, "ACME", 1, 1, "id DESC") + require.NoError(t, err) + require.Len(t, orgs, 1) + assert.Equal(t, int64(2), count) + assert.Equal(t, org2.ID, orgs[0].ID) + }) +} + +func organizationsCountByUser(t *testing.T, ctx context.Context, s *OrganizationsStore) { + // TODO: Use Orgs.Join to replace SQL hack when the method is available. + err := s.db.Exec(`INSERT INTO org_user (uid, org_id) VALUES (?, ?)`, 1, 1).Error + require.NoError(t, err) + err = s.db.Exec(`INSERT INTO org_user (uid, org_id) VALUES (?, ?)`, 2, 1).Error + require.NoError(t, err) + + got, err := s.CountByUser(ctx, 1) + require.NoError(t, err) + assert.Equal(t, int64(1), got) + + got, err = s.CountByUser(ctx, 404) + require.NoError(t, err) + assert.Equal(t, int64(0), got) +} diff --git a/internal/database/permissions.go b/internal/database/permissions.go new file mode 100644 index 00000000000..c9068df7bf5 --- /dev/null +++ b/internal/database/permissions.go @@ -0,0 +1,131 @@ +package database + +import ( + "context" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + log "unknwon.dev/clog/v2" +) + +// Access represents the highest access level of a user has to a repository. The +// only access type that is not in this table is the real owner of a repository. +// In case of an organization repository, the members of the owners team are in +// this table. +type Access struct { + ID int64 `gorm:"primaryKey"` + UserID int64 `xorm:"UNIQUE(s)" gorm:"uniqueIndex:access_user_repo_unique;not null"` + RepoID int64 `xorm:"UNIQUE(s)" gorm:"uniqueIndex:access_user_repo_unique;not null"` + Mode AccessMode `gorm:"not null"` +} + +// AccessMode is the access mode of a user has to a repository. +type AccessMode int + +const ( + AccessModeNone AccessMode = iota // 0 + AccessModeRead // 1 + AccessModeWrite // 2 + AccessModeAdmin // 3 + AccessModeOwner // 4 +) + +func (mode AccessMode) String() string { + switch mode { + case AccessModeRead: + return "read" + case AccessModeWrite: + return "write" + case AccessModeAdmin: + return "admin" + case AccessModeOwner: + return "owner" + default: + return "none" + } +} + +// ParseAccessMode returns corresponding access mode to given permission string. +func ParseAccessMode(permission string) AccessMode { + switch permission { + case "write": + return AccessModeWrite + case "admin": + return AccessModeAdmin + default: + return AccessModeRead + } +} + +// PermissionsStore is the storage layer for repository permissions. +type PermissionsStore struct { + db *gorm.DB +} + +func newPermissionsStore(db *gorm.DB) *PermissionsStore { + return &PermissionsStore{db: db} +} + +type AccessModeOptions struct { + OwnerID int64 // The ID of the repository owner. + Private bool // Whether the repository is private. +} + +// AccessMode returns the access mode of given user has to the repository. +func (s *PermissionsStore) AccessMode(ctx context.Context, userID, repoID int64, opts AccessModeOptions) (mode AccessMode) { + if repoID <= 0 { + return AccessModeNone + } + + // Everyone has read access to public repository. + if !opts.Private { + mode = AccessModeRead + } + + // Anonymous user gets the default access. + if userID <= 0 { + return mode + } + + if userID == opts.OwnerID { + return AccessModeOwner + } + + access := new(Access) + err := s.db.WithContext(ctx).Where("user_id = ? AND repo_id = ?", userID, repoID).First(access).Error + if err != nil { + if !errors.Is(err, gorm.ErrRecordNotFound) { + log.Error("Failed to get access [user_id: %d, repo_id: %d]: %v", userID, repoID, err) + } + return mode + } + return access.Mode +} + +// Authorize returns true if the user has as good as desired access mode to the +// repository. +func (s *PermissionsStore) Authorize(ctx context.Context, userID, repoID int64, desired AccessMode, opts AccessModeOptions) bool { + return desired <= s.AccessMode(ctx, userID, repoID, opts) +} + +// SetRepoPerms does a full update to which users have which level of access to +// given repository. Keys of the "accessMap" are user IDs. +func (s *PermissionsStore) SetRepoPerms(ctx context.Context, repoID int64, accessMap map[int64]AccessMode) error { + records := make([]*Access, 0, len(accessMap)) + for userID, mode := range accessMap { + records = append(records, &Access{ + UserID: userID, + RepoID: repoID, + Mode: mode, + }) + } + + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + err := tx.Where("repo_id = ?", repoID).Delete(new(Access)).Error + if err != nil { + return err + } + + return tx.Create(&records).Error + }) +} diff --git a/internal/database/permissions_test.go b/internal/database/permissions_test.go new file mode 100644 index 00000000000..92e99bef817 --- /dev/null +++ b/internal/database/permissions_test.go @@ -0,0 +1,302 @@ +package database + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestPerms(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + s := &PermissionsStore{ + db: newTestDB(t, "PermissionsStore"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *PermissionsStore) + }{ + {"AccessMode", permsAccessMode}, + {"Authorize", permsAuthorize}, + {"SetRepoPerms", permsSetRepoPerms}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func permsAccessMode(t *testing.T, ctx context.Context, s *PermissionsStore) { + // Set up permissions + err := s.SetRepoPerms(ctx, 1, + map[int64]AccessMode{ + 2: AccessModeWrite, + 3: AccessModeAdmin, + }, + ) + require.NoError(t, err) + err = s.SetRepoPerms(ctx, 2, + map[int64]AccessMode{ + 1: AccessModeRead, + }, + ) + require.NoError(t, err) + + publicRepoID := int64(1) + publicRepoOpts := AccessModeOptions{ + OwnerID: 98, + } + + privateRepoID := int64(2) + privateRepoOpts := AccessModeOptions{ + OwnerID: 99, + Private: true, + } + + tests := []struct { + name string + userID int64 + repoID int64 + opts AccessModeOptions + wantAccessMode AccessMode + }{ + { + name: "nil repository", + wantAccessMode: AccessModeNone, + }, + + { + name: "anonymous user has read access to public repository", + repoID: publicRepoID, + opts: publicRepoOpts, + wantAccessMode: AccessModeRead, + }, + { + name: "anonymous user has no access to private repository", + repoID: privateRepoID, + opts: privateRepoOpts, + wantAccessMode: AccessModeNone, + }, + + { + name: "user is the owner", + userID: 98, + repoID: publicRepoID, + opts: publicRepoOpts, + wantAccessMode: AccessModeOwner, + }, + { + name: "user 1 has read access to public repo", + userID: 1, + repoID: publicRepoID, + opts: publicRepoOpts, + wantAccessMode: AccessModeRead, + }, + { + name: "user 2 has write access to public repo", + userID: 2, + repoID: publicRepoID, + opts: publicRepoOpts, + wantAccessMode: AccessModeWrite, + }, + { + name: "user 3 has admin access to public repo", + userID: 3, + repoID: publicRepoID, + opts: publicRepoOpts, + wantAccessMode: AccessModeAdmin, + }, + + { + name: "user 1 has read access to private repo", + userID: 1, + repoID: privateRepoID, + opts: privateRepoOpts, + wantAccessMode: AccessModeRead, + }, + { + name: "user 2 has no access to private repo", + userID: 2, + repoID: privateRepoID, + opts: privateRepoOpts, + wantAccessMode: AccessModeNone, + }, + { + name: "user 3 has no access to private repo", + userID: 3, + repoID: privateRepoID, + opts: privateRepoOpts, + wantAccessMode: AccessModeNone, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + mode := s.AccessMode(ctx, test.userID, test.repoID, test.opts) + assert.Equal(t, test.wantAccessMode, mode) + }) + } +} + +func permsAuthorize(t *testing.T, ctx context.Context, s *PermissionsStore) { + // Set up permissions + err := s.SetRepoPerms(ctx, 1, + map[int64]AccessMode{ + 1: AccessModeRead, + 2: AccessModeWrite, + 3: AccessModeAdmin, + }, + ) + require.NoError(t, err) + + repo := &Repository{ + ID: 1, + OwnerID: 98, + } + + tests := []struct { + name string + userID int64 + desired AccessMode + wantAuthorized bool + }{ + { + name: "user 1 has read and wants read", + userID: 1, + desired: AccessModeRead, + wantAuthorized: true, + }, + { + name: "user 1 has read and wants write", + userID: 1, + desired: AccessModeWrite, + wantAuthorized: false, + }, + + { + name: "user 2 has write and wants read", + userID: 2, + desired: AccessModeRead, + wantAuthorized: true, + }, + { + name: "user 2 has write and wants write", + userID: 2, + desired: AccessModeWrite, + wantAuthorized: true, + }, + { + name: "user 2 has write and wants admin", + userID: 2, + desired: AccessModeAdmin, + wantAuthorized: false, + }, + + { + name: "user 3 has admin and wants read", + userID: 3, + desired: AccessModeRead, + wantAuthorized: true, + }, + { + name: "user 3 has admin and wants write", + userID: 3, + desired: AccessModeWrite, + wantAuthorized: true, + }, + { + name: "user 3 has admin and wants admin", + userID: 3, + desired: AccessModeAdmin, + wantAuthorized: true, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + authorized := s.Authorize(ctx, test.userID, repo.ID, test.desired, + AccessModeOptions{ + OwnerID: repo.OwnerID, + Private: repo.IsPrivate, + }, + ) + assert.Equal(t, test.wantAuthorized, authorized) + }) + } +} + +func permsSetRepoPerms(t *testing.T, ctx context.Context, s *PermissionsStore) { + for _, update := range []struct { + repoID int64 + accessMap map[int64]AccessMode + }{ + { + repoID: 1, + accessMap: map[int64]AccessMode{ + 1: AccessModeWrite, + 2: AccessModeWrite, + 3: AccessModeAdmin, + 4: AccessModeWrite, + }, + }, + { + repoID: 2, + accessMap: map[int64]AccessMode{ + 1: AccessModeWrite, + 2: AccessModeRead, + 4: AccessModeWrite, + 5: AccessModeWrite, + }, + }, + { + repoID: 1, + accessMap: map[int64]AccessMode{ + 2: AccessModeWrite, + 3: AccessModeAdmin, + }, + }, + { + repoID: 2, + accessMap: map[int64]AccessMode{ + 1: AccessModeWrite, + 2: AccessModeRead, + 5: AccessModeWrite, + }, + }, + } { + err := s.SetRepoPerms(ctx, update.repoID, update.accessMap) + if err != nil { + t.Fatal(err) + } + } + + var accesses []*Access + err := s.db.Order("user_id, repo_id").Find(&accesses).Error + require.NoError(t, err) + + // Ignore ID fields + for _, a := range accesses { + a.ID = 0 + } + + wantAccesses := []*Access{ + {UserID: 1, RepoID: 2, Mode: AccessModeWrite}, + {UserID: 2, RepoID: 1, Mode: AccessModeWrite}, + {UserID: 2, RepoID: 2, Mode: AccessModeRead}, + {UserID: 3, RepoID: 1, Mode: AccessModeAdmin}, + {UserID: 5, RepoID: 2, Mode: AccessModeWrite}, + } + assert.Equal(t, wantAccesses, accesses) +} diff --git a/internal/database/public_keys.go b/internal/database/public_keys.go new file mode 100644 index 00000000000..42361cdef59 --- /dev/null +++ b/internal/database/public_keys.go @@ -0,0 +1,87 @@ +package database + +import ( + "os" + "path/filepath" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/osx" +) + +// PublicKeysStore is the storage layer for public keys. +type PublicKeysStore struct { + db *gorm.DB +} + +func newPublicKeysStore(db *gorm.DB) *PublicKeysStore { + return &PublicKeysStore{db: db} +} + +func authorizedKeysPath() string { + return filepath.Join(conf.SSH.RootPath, "authorized_keys") +} + +// RewriteAuthorizedKeys rewrites the "authorized_keys" file under the SSH root +// path with all public keys stored in the database. +func (s *PublicKeysStore) RewriteAuthorizedKeys() error { + sshOpLocker.Lock() + defer sshOpLocker.Unlock() + + err := os.MkdirAll(conf.SSH.RootPath, os.ModePerm) + if err != nil { + return errors.Wrap(err, "create SSH root path") + } + fpath := authorizedKeysPath() + tempPath := fpath + ".tmp" + f, err := os.OpenFile(tempPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o600) + if err != nil { + return errors.Wrap(err, "create temporary file") + } + defer func() { + _ = f.Close() + _ = os.Remove(tempPath) + }() + + // NOTE: More recently updated keys are more likely to be used more frequently, + // putting them in the earlier lines could speed up the key lookup by SSHD. + rows, err := s.db.Model(&PublicKey{}).Order("updated_unix DESC").Rows() + if err != nil { + return errors.Wrap(err, "iterate public keys") + } + defer func() { _ = rows.Close() }() + + for rows.Next() { + var key PublicKey + err = s.db.ScanRows(rows, &key) + if err != nil { + return errors.Wrap(err, "scan rows") + } + + _, err = f.WriteString(key.AuthorizedString()) + if err != nil { + return errors.Wrapf(err, "write key %d", key.ID) + } + } + if err = rows.Err(); err != nil { + return errors.Wrap(err, "check rows.Err") + } + + err = f.Close() + if err != nil { + return errors.Wrap(err, "close temporary file") + } + if osx.Exist(fpath) { + err = os.Remove(fpath) + if err != nil { + return errors.Wrap(err, "remove") + } + } + err = os.Rename(tempPath, fpath) + if err != nil { + return errors.Wrap(err, "rename") + } + return nil +} diff --git a/internal/database/public_keys_test.go b/internal/database/public_keys_test.go new file mode 100644 index 00000000000..6c785add821 --- /dev/null +++ b/internal/database/public_keys_test.go @@ -0,0 +1,65 @@ +package database + +import ( + "context" + "fmt" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gogs.io/gogs/internal/conf" +) + +func TestPublicKeys(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + s := &PublicKeysStore{ + db: newTestDB(t, "PublicKeysStore"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *PublicKeysStore) + }{ + {"RewriteAuthorizedKeys", publicKeysRewriteAuthorizedKeys}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func publicKeysRewriteAuthorizedKeys(t *testing.T, ctx context.Context, s *PublicKeysStore) { + // TODO: Use PublicKeys.Add to replace SQL hack when the method is available. + publicKey := &PublicKey{ + OwnerID: 1, + Name: "test-key", + Fingerprint: "12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53", + Content: "test-key-content", + } + err := s.db.Create(publicKey).Error + require.NoError(t, err) + tempSSHRootPath := filepath.Join(os.TempDir(), "publicKeysRewriteAuthorizedKeys-tempSSHRootPath") + conf.SetMockSSH(t, conf.SSHOpts{RootPath: tempSSHRootPath}) + err = s.RewriteAuthorizedKeys() + require.NoError(t, err) + + authorizedKeys, err := os.ReadFile(authorizedKeysPath()) + require.NoError(t, err) + assert.Contains(t, string(authorizedKeys), fmt.Sprintf("key-%d", publicKey.ID)) + assert.Contains(t, string(authorizedKeys), publicKey.Content) +} diff --git a/internal/database/pull.go b/internal/database/pull.go new file mode 100644 index 00000000000..d127ca5f9c1 --- /dev/null +++ b/internal/database/pull.go @@ -0,0 +1,887 @@ +package database + +import ( + "context" + "fmt" + "os" + "path/filepath" + "strconv" + "time" + + "github.com/cockroachdb/errors" + log "unknwon.dev/clog/v2" + "xorm.io/xorm" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/process" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" + "gogs.io/gogs/internal/sync" +) + +var PullRequestQueue = sync.NewUniqueQueue(1000) + +type PullRequestType int + +const ( + PullRequestTypeGogs PullRequestType = iota + PullRequestTypeGit +) + +type PullRequestStatus int + +const ( + PullRequestStatusConflict PullRequestStatus = iota + PullRequestStatusChecking + PullRequestStatusMergeable +) + +// PullRequest represents relation between pull request and repositories. +type PullRequest struct { + ID int64 `gorm:"primaryKey"` + Type PullRequestType + Status PullRequestStatus + + IssueID int64 `xorm:"INDEX" gorm:"index"` + Issue *Issue `xorm:"-" json:"-" gorm:"-"` + Index int64 + + HeadRepoID int64 + HeadRepo *Repository `xorm:"-" json:"-" gorm:"-"` + BaseRepoID int64 + BaseRepo *Repository `xorm:"-" json:"-" gorm:"-"` + HeadUserName string + HeadBranch string + BaseBranch string + MergeBase string `xorm:"VARCHAR(40)" gorm:"type:VARCHAR(40)"` + + HasMerged bool + MergedCommitID string `xorm:"VARCHAR(40)" gorm:"type:VARCHAR(40)"` + MergerID int64 + Merger *User `xorm:"-" json:"-" gorm:"-"` + Merged time.Time `xorm:"-" json:"-" gorm:"-"` + MergedUnix int64 +} + +func (pr *PullRequest) BeforeUpdate() { + pr.MergedUnix = pr.Merged.Unix() +} + +// Note: don't try to get Issue because will end up recursive querying. +func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "merged_unix": + if !pr.HasMerged { + return + } + + pr.Merged = time.Unix(pr.MergedUnix, 0).Local() + } +} + +// Note: don't try to get Issue because will end up recursive querying. +func (pr *PullRequest) loadAttributes(e Engine) (err error) { + if pr.HeadRepo == nil { + pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID) + if err != nil && !IsErrRepoNotExist(err) { + return errors.Newf("get head repository by ID: %v", err) + } + } + + if pr.BaseRepo == nil { + pr.BaseRepo, err = getRepositoryByID(e, pr.BaseRepoID) + if err != nil { + return errors.Newf("get base repository by ID: %v", err) + } + } + + if pr.HasMerged && pr.Merger == nil { + pr.Merger, err = getUserByID(e, pr.MergerID) + if IsErrUserNotExist(err) { + pr.MergerID = -1 + pr.Merger = NewGhostUser() + } else if err != nil { + return errors.Newf("get merger by ID: %v", err) + } + } + + return nil +} + +func (pr *PullRequest) LoadAttributes() error { + return pr.loadAttributes(x) +} + +func (pr *PullRequest) LoadIssue() (err error) { + if pr.Issue != nil { + return nil + } + + pr.Issue, err = GetIssueByID(pr.IssueID) + return err +} + +// This method assumes following fields have been assigned with valid values: +// Required - Issue, BaseRepo +// Optional - HeadRepo, Merger +func (pr *PullRequest) APIFormat() *apiv1types.PullRequest { + // In case of head repo has been deleted. + var apiHeadRepo *apiv1types.Repository + if pr.HeadRepo == nil { + apiHeadRepo = &apiv1types.Repository{ + Name: "deleted", + } + } else { + apiHeadRepo = pr.HeadRepo.APIFormatLegacy(nil) + } + + apiIssue := pr.Issue.APIFormat() + apiPullRequest := &apiv1types.PullRequest{ + ID: pr.ID, + Index: pr.Index, + Poster: apiIssue.Poster, + Title: apiIssue.Title, + Body: apiIssue.Body, + Labels: apiIssue.Labels, + Milestone: apiIssue.Milestone, + Assignee: apiIssue.Assignee, + State: apiIssue.State, + Comments: apiIssue.Comments, + HeadBranch: pr.HeadBranch, + HeadRepo: apiHeadRepo, + BaseBranch: pr.BaseBranch, + BaseRepo: pr.BaseRepo.APIFormatLegacy(nil), + HTMLURL: pr.Issue.HTMLURL(), + HasMerged: pr.HasMerged, + } + + if pr.Status != PullRequestStatusChecking { + mergeable := pr.Status != PullRequestStatusConflict + apiPullRequest.Mergeable = &mergeable + } + if pr.HasMerged { + apiPullRequest.Merged = &pr.Merged + apiPullRequest.MergedCommitID = &pr.MergedCommitID + apiPullRequest.MergedBy = pr.Merger.APIFormat() + } + + return apiPullRequest +} + +// IsChecking returns true if this pull request is still checking conflict. +func (pr *PullRequest) IsChecking() bool { + return pr.Status == PullRequestStatusChecking +} + +// CanAutoMerge returns true if this pull request can be merged automatically. +func (pr *PullRequest) CanAutoMerge() bool { + return pr.Status == PullRequestStatusMergeable +} + +// MergeStyle represents the approach to merge commits into base branch. +type MergeStyle string + +const ( + MergeStyleRegular MergeStyle = "create_merge_commit" + MergeStyleRebase MergeStyle = "rebase_before_merging" +) + +// Merge merges pull request to base repository. +// FIXME: add repoWorkingPull make sure two merges does not happen at same time. +func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle MergeStyle, commitDescription string) (err error) { + ctx := context.TODO() + + defer func() { + go HookQueue.Add(pr.BaseRepo.ID) + go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false) + }() + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = pr.Issue.changeStatus(sess, doer, pr.Issue.Repo, true); err != nil { + return errors.Newf("Issue.changeStatus: %v", err) + } + + headRepoPath := RepoPath(pr.HeadUserName, pr.HeadRepo.Name) + headGitRepo, err := git.Open(headRepoPath) + if err != nil { + return errors.Newf("open repository: %v", err) + } + + // Create temporary directory to store temporary copy of the base repository, + // and clean it up when operation finished regardless of succeed or not. + tmpBasePath := filepath.Join(conf.Server.AppDataPath, "tmp", "repos", strconv.Itoa(time.Now().Nanosecond())+".git") + if err = os.MkdirAll(filepath.Dir(tmpBasePath), os.ModePerm); err != nil { + return err + } + defer func() { + _ = os.RemoveAll(filepath.Dir(tmpBasePath)) + }() + + // Clone the base repository to the defined temporary directory, + // and checks out to base branch directly. + var stderr string + if _, stderr, err = process.ExecTimeout(5*time.Minute, + fmt.Sprintf("PullRequest.Merge (git clone): %s", tmpBasePath), + "git", "clone", "-b", pr.BaseBranch, baseGitRepo.Path(), tmpBasePath); err != nil { + return errors.Newf("git clone: %s", stderr) + } + + // Add remote which points to the head repository. + if _, stderr, err = process.ExecDir(-1, tmpBasePath, + fmt.Sprintf("PullRequest.Merge (git remote add): %s", tmpBasePath), + "git", "remote", "add", "head_repo", headRepoPath); err != nil { + return errors.Newf("git remote add [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) + } + + // Fetch information from head repository to the temporary copy. + if _, stderr, err = process.ExecDir(-1, tmpBasePath, + fmt.Sprintf("PullRequest.Merge (git fetch): %s", tmpBasePath), + "git", "fetch", "head_repo"); err != nil { + return errors.Newf("git fetch [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) + } + + remoteHeadBranch := "head_repo/" + pr.HeadBranch + + // Check if merge style is allowed, reset to default style if not + if mergeStyle == MergeStyleRebase && !pr.BaseRepo.PullsAllowRebase { + mergeStyle = MergeStyleRegular + } + + switch mergeStyle { + case MergeStyleRegular: // Create merge commit + + // Merge changes from head branch. + if _, stderr, err = process.ExecDir(-1, tmpBasePath, + fmt.Sprintf("PullRequest.Merge (git merge --no-ff --no-commit): %s", tmpBasePath), + "git", "merge", "--no-ff", "--no-commit", remoteHeadBranch); err != nil { + return errors.Newf("git merge --no-ff --no-commit [%s]: %v - %s", tmpBasePath, err, stderr) + } + + // Create a merge commit for the base branch. + if _, stderr, err = process.ExecDir(-1, tmpBasePath, + fmt.Sprintf("PullRequest.Merge (git merge): %s", tmpBasePath), + "git", "commit", fmt.Sprintf("--author='%s <%s>'", doer.DisplayName(), doer.Email), + "-m", fmt.Sprintf("Merge branch '%s' of %s/%s into %s", pr.HeadBranch, pr.HeadUserName, pr.HeadRepo.Name, pr.BaseBranch), + "-m", commitDescription); err != nil { + return errors.Newf("git commit [%s]: %v - %s", tmpBasePath, err, stderr) + } + + case MergeStyleRebase: // Rebase before merging + + // Rebase head branch based on base branch, this creates a non-branch commit state. + if _, stderr, err = process.ExecDir(-1, tmpBasePath, + fmt.Sprintf("PullRequest.Merge (git rebase): %s", tmpBasePath), + "git", "rebase", "--quiet", pr.BaseBranch, remoteHeadBranch); err != nil { + return errors.Newf("git rebase [%s on %s]: %s", remoteHeadBranch, pr.BaseBranch, stderr) + } + + // Name non-branch commit state to a new temporary branch in order to save changes. + tmpBranch := strconv.FormatInt(time.Now().UnixNano(), 10) + if _, stderr, err = process.ExecDir(-1, tmpBasePath, + fmt.Sprintf("PullRequest.Merge (git checkout): %s", tmpBasePath), + "git", "checkout", "-b", tmpBranch); err != nil { + return errors.Newf("git checkout '%s': %s", tmpBranch, stderr) + } + + // Check out the base branch to be operated on. + if _, stderr, err = process.ExecDir(-1, tmpBasePath, + fmt.Sprintf("PullRequest.Merge (git checkout): %s", tmpBasePath), + "git", "checkout", pr.BaseBranch); err != nil { + return errors.Newf("git checkout '%s': %s", pr.BaseBranch, stderr) + } + + // Merge changes from temporary branch to the base branch. + if _, stderr, err = process.ExecDir(-1, tmpBasePath, + fmt.Sprintf("PullRequest.Merge (git merge): %s", tmpBasePath), + "git", "merge", tmpBranch); err != nil { + return errors.Newf("git merge [%s]: %v - %s", tmpBasePath, err, stderr) + } + + default: + return errors.Newf("unknown merge style: %s", mergeStyle) + } + + // Push changes on base branch to upstream. + if _, stderr, err = process.ExecDir(-1, tmpBasePath, + fmt.Sprintf("PullRequest.Merge (git push): %s", tmpBasePath), + "git", "push", baseGitRepo.Path(), pr.BaseBranch); err != nil { + return errors.Newf("git push: %s", stderr) + } + + pr.MergedCommitID, err = headGitRepo.BranchCommitID(pr.HeadBranch) + if err != nil { + return errors.Newf("get head branch %q commit ID: %v", pr.HeadBranch, err) + } + + pr.HasMerged = true + pr.Merged = time.Now() + pr.MergerID = doer.ID + if _, err = sess.ID(pr.ID).AllCols().Update(pr); err != nil { + return errors.Newf("update pull request: %v", err) + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + if err = Handle.Actions().MergePullRequest(ctx, doer, pr.Issue.Repo.Owner, pr.Issue.Repo, pr.Issue); err != nil { + log.Error("Failed to create action for merge pull request, pull_request_id: %d, error: %v", pr.ID, err) + } + + // Reload pull request information. + if err = pr.LoadAttributes(); err != nil { + log.Error("LoadAttributes: %v", err) + return nil + } + if err = PrepareWebhooks(pr.Issue.Repo, HookEventTypePullRequest, &apiv1types.WebhookPullRequestPayload{ + Action: apiv1types.WebhookIssueClosed, + Index: pr.Index, + PullRequest: pr.APIFormat(), + Repository: pr.Issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }); err != nil { + log.Error("PrepareWebhooks: %v", err) + return nil + } + + commits, err := headGitRepo.RevList([]string{pr.MergeBase + "..." + pr.MergedCommitID}) + if err != nil { + log.Error("Failed to list commits [merge_base: %s, merged_commit_id: %s]: %v", pr.MergeBase, pr.MergedCommitID, err) + return nil + } + + // NOTE: It is possible that head branch is not fully sync with base branch + // for merge commits, so we need to get latest head commit and append merge + // commit manually to avoid strange diff commits produced. + mergeCommit, err := baseGitRepo.BranchCommit(pr.BaseBranch) + if err != nil { + log.Error("Failed to get base branch %q commit: %v", pr.BaseBranch, err) + return nil + } + if mergeStyle == MergeStyleRegular { + commits = append([]*git.Commit{mergeCommit}, commits...) + } + + pcs, err := CommitsToPushCommits(commits).APIFormat(ctx, Handle.Users(), pr.BaseRepo.RepoPath(), pr.BaseRepo.HTMLURL()) + if err != nil { + log.Error("Failed to convert to API payload commits: %v", err) + return nil + } + + p := &apiv1types.WebhookPushPayload{ + Ref: git.RefsHeads + pr.BaseBranch, + Before: pr.MergeBase, + After: mergeCommit.ID.String(), + CompareURL: conf.Server.ExternalURL + pr.BaseRepo.ComposeCompareURL(pr.MergeBase, pr.MergedCommitID), + Commits: pcs, + Repo: pr.BaseRepo.APIFormatLegacy(nil), + Pusher: pr.HeadRepo.MustOwner().APIFormat(), + Sender: doer.APIFormat(), + } + if err = PrepareWebhooks(pr.BaseRepo, HookEventTypePush, p); err != nil { + log.Error("Failed to prepare webhooks: %v", err) + return nil + } + return nil +} + +// testPatch checks if patch can be merged to base repository without conflict. +// FIXME: make a mechanism to clean up stable local copies. +func (pr *PullRequest) testPatch() (err error) { + if pr.BaseRepo == nil { + pr.BaseRepo, err = GetRepositoryByID(pr.BaseRepoID) + if err != nil { + return errors.Newf("GetRepositoryByID: %v", err) + } + } + + patchPath, err := pr.BaseRepo.PatchPath(pr.Index) + if err != nil { + return errors.Newf("BaseRepo.PatchPath: %v", err) + } + + // Fast fail if patch does not exist, this assumes data is corrupted. + if !osx.IsFile(patchPath) { + log.Trace("PullRequest[%d].testPatch: ignored corrupted data", pr.ID) + return nil + } + + repoWorkingPool.CheckIn(strconv.FormatInt(pr.BaseRepoID, 10)) + defer repoWorkingPool.CheckOut(strconv.FormatInt(pr.BaseRepoID, 10)) + + log.Trace("PullRequest[%d].testPatch (patchPath): %s", pr.ID, patchPath) + + if err := pr.BaseRepo.UpdateLocalCopyBranch(pr.BaseBranch); err != nil { + return errors.Newf("UpdateLocalCopy [%d]: %v", pr.BaseRepoID, err) + } + + args := []string{"apply", "--check"} + if pr.BaseRepo.PullsIgnoreWhitespace { + args = append(args, "--ignore-whitespace") + } + args = append(args, patchPath) + + pr.Status = PullRequestStatusChecking + _, stderr, err := process.ExecDir(-1, pr.BaseRepo.LocalCopyPath(), + fmt.Sprintf("testPatch (git apply --check): %d", pr.BaseRepo.ID), + "git", args...) + if err != nil { + log.Trace("PullRequest[%d].testPatch (apply): has conflict\n%s", pr.ID, stderr) + pr.Status = PullRequestStatusConflict + return nil + } + return nil +} + +// 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 sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = newIssue(sess, NewIssueOptions{ + Repo: repo, + Issue: pull, + LableIDs: labelIDs, + Attachments: uuids, + IsPull: true, + }); err != nil { + return errors.Newf("newIssue: %v", err) + } + + pr.Index = pull.Index + if err = repo.SavePatch(pr.Index, patch); err != nil { + return errors.Newf("SavePatch: %v", err) + } + + pr.BaseRepo = repo + if err = pr.testPatch(); err != nil { + return errors.Newf("testPatch: %v", err) + } + // No conflict appears after test means mergeable. + if pr.Status == PullRequestStatusChecking { + pr.Status = PullRequestStatusMergeable + } + + pr.IssueID = pull.ID + if _, err = sess.Insert(pr); err != nil { + return errors.Newf("insert pull repo: %v", err) + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + 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, + }); err != nil { + log.Error("NotifyWatchers: %v", err) + } + if err = pull.MailParticipants(); err != nil { + log.Error("MailParticipants: %v", err) + } + + pr.Issue = pull + pull.PullRequest = pr + if err = PrepareWebhooks(repo, HookEventTypePullRequest, &apiv1types.WebhookPullRequestPayload{ + Action: apiv1types.WebhookIssueOpened, + Index: pull.Index, + PullRequest: pr.APIFormat(), + Repository: repo.APIFormatLegacy(nil), + Sender: pull.Poster.APIFormat(), + }); err != nil { + log.Error("PrepareWebhooks: %v", err) + } + + return nil +} + +// GetUnmergedPullRequest returns a pull request that is open and has not been merged +// by given head/base and repo/branch. +func GetUnmergedPullRequest(headRepoID, baseRepoID int64, headBranch, baseBranch string) (*PullRequest, error) { + pr := new(PullRequest) + has, err := x.Where("head_repo_id=? AND head_branch=? AND base_repo_id=? AND base_branch=? AND has_merged=? AND issue.is_closed=?", + headRepoID, headBranch, baseRepoID, baseBranch, false, false). + Join("INNER", "issue", "issue.id=pull_request.issue_id").Get(pr) + if err != nil { + return nil, err + } else if !has { + return nil, ErrPullRequestNotExist{args: map[string]any{ + "headRepoID": headRepoID, + "baseRepoID": baseRepoID, + "headBranch": headBranch, + "baseBranch": baseBranch, + }} + } + + return pr, nil +} + +// GetUnmergedPullRequestsByHeadInfo returns all pull requests that are open and has not been merged +// by given head information (repo and branch). +func GetUnmergedPullRequestsByHeadInfo(repoID int64, branch string) ([]*PullRequest, error) { + prs := make([]*PullRequest, 0, 2) + return prs, x.Where("head_repo_id = ? AND head_branch = ? AND has_merged = ? AND issue.is_closed = ?", + repoID, branch, false, false). + Join("INNER", "issue", "issue.id = pull_request.issue_id").Find(&prs) +} + +// GetUnmergedPullRequestsByBaseInfo returns all pull requests that are open and has not been merged +// by given base information (repo and branch). +func GetUnmergedPullRequestsByBaseInfo(repoID int64, branch string) ([]*PullRequest, error) { + prs := make([]*PullRequest, 0, 2) + return prs, x.Where("base_repo_id=? AND base_branch=? AND has_merged=? AND issue.is_closed=?", + repoID, branch, false, false). + Join("INNER", "issue", "issue.id=pull_request.issue_id").Find(&prs) +} + +var _ errx.NotFound = (*ErrPullRequestNotExist)(nil) + +type ErrPullRequestNotExist struct { + args map[string]any +} + +func IsErrPullRequestNotExist(err error) bool { + _, ok := err.(ErrPullRequestNotExist) + return ok +} + +func (err ErrPullRequestNotExist) Error() string { + return fmt.Sprintf("pull request does not exist: %v", err.args) +} + +func (ErrPullRequestNotExist) NotFound() bool { + return true +} + +func getPullRequestByID(e Engine, id int64) (*PullRequest, error) { + pr := new(PullRequest) + has, err := e.ID(id).Get(pr) + if err != nil { + return nil, err + } else if !has { + return nil, ErrPullRequestNotExist{args: map[string]any{"pullRequestID": id}} + } + return pr, pr.loadAttributes(e) +} + +// GetPullRequestByID returns a pull request by given ID. +func GetPullRequestByID(id int64) (*PullRequest, error) { + return getPullRequestByID(x, id) +} + +func getPullRequestByIssueID(e Engine, issueID int64) (*PullRequest, error) { + pr := &PullRequest{ + IssueID: issueID, + } + has, err := e.Get(pr) + if err != nil { + return nil, err + } else if !has { + return nil, ErrPullRequestNotExist{args: map[string]any{"issueID": issueID}} + } + return pr, pr.loadAttributes(e) +} + +// GetPullRequestByIssueID returns pull request by given issue ID. +func GetPullRequestByIssueID(issueID int64) (*PullRequest, error) { + return getPullRequestByIssueID(x, issueID) +} + +// Update updates all fields of pull request. +func (pr *PullRequest) Update() error { + _, err := x.Id(pr.ID).AllCols().Update(pr) + return err +} + +// Update updates specific fields of pull request. +func (pr *PullRequest) UpdateCols(cols ...string) error { + _, err := x.Id(pr.ID).Cols(cols...).Update(pr) + return err +} + +// UpdatePatch generates and saves a new patch. +func (pr *PullRequest) UpdatePatch() (err error) { + headGitRepo, err := git.Open(pr.HeadRepo.RepoPath()) + if err != nil { + return errors.Newf("open repository: %v", err) + } + + // Add a temporary remote. + tmpRemote := strconv.FormatInt(time.Now().UnixNano(), 10) + baseRepoPath := RepoPath(pr.BaseRepo.MustOwner().Name, pr.BaseRepo.Name) + err = headGitRepo.RemoteAdd(tmpRemote, baseRepoPath, git.RemoteAddOptions{Fetch: true}) + if err != nil { + return errors.Newf("add remote %q [repo_id: %d]: %v", tmpRemote, pr.HeadRepoID, err) + } + defer func() { + if err := headGitRepo.RemoteRemove(tmpRemote); err != nil { + log.Error("Failed to remove remote %q [repo_id: %d]: %v", tmpRemote, pr.HeadRepoID, err) + } + }() + + remoteBranch := "remotes/" + tmpRemote + "/" + pr.BaseBranch + pr.MergeBase, err = headGitRepo.MergeBase(remoteBranch, pr.HeadBranch) + if err != nil { + return errors.Newf("get merge base: %v", err) + } else if err = pr.Update(); err != nil { + return errors.Newf("update: %v", err) + } + + patch, err := headGitRepo.DiffBinary(pr.MergeBase, pr.HeadBranch) + if err != nil { + return errors.Newf("get binary patch: %v", err) + } + + if err = pr.BaseRepo.SavePatch(pr.Index, patch); err != nil { + return errors.Newf("save patch: %v", err) + } + + log.Trace("PullRequest[%d].UpdatePatch: patch saved", pr.ID) + return nil +} + +// PushToBaseRepo pushes commits from branches of head repository to +// corresponding branches of base repository. +// FIXME: Only push branches that are actually updates? +func (pr *PullRequest) PushToBaseRepo() (err error) { + log.Trace("PushToBaseRepo[%d]: pushing commits to base repo 'refs/pull/%d/head'", pr.BaseRepoID, pr.Index) + + headRepoPath := pr.HeadRepo.RepoPath() + headGitRepo, err := git.Open(headRepoPath) + if err != nil { + return errors.Newf("open repository: %v", err) + } + + tmpRemote := fmt.Sprintf("tmp-pull-%d", pr.ID) + if err = headGitRepo.RemoteAdd(tmpRemote, pr.BaseRepo.RepoPath()); err != nil { + return errors.Newf("add remote %q [repo_id: %d]: %v", tmpRemote, pr.HeadRepoID, err) + } + + // Make sure to remove the remote even if the push fails + defer func() { + if err := headGitRepo.RemoteRemove(tmpRemote); err != nil { + log.Error("Failed to remove remote %q [repo_id: %d]: %v", tmpRemote, pr.HeadRepoID, err) + } + }() + + headRefspec := fmt.Sprintf("refs/pull/%d/head", pr.Index) + headFile := filepath.Join(pr.BaseRepo.RepoPath(), headRefspec) + if osx.Exist(headFile) { + err = os.Remove(headFile) + if err != nil { + return errors.Newf("remove head file [repo_id: %d]: %v", pr.BaseRepoID, err) + } + } + + err = headGitRepo.Push(tmpRemote, fmt.Sprintf("%s:%s", pr.HeadBranch, headRefspec)) + if err != nil { + return errors.Newf("push: %v", err) + } + + return nil +} + +// AddToTaskQueue adds itself to pull request test task queue. +func (pr *PullRequest) AddToTaskQueue() { + go PullRequestQueue.AddFunc(pr.ID, func() { + pr.Status = PullRequestStatusChecking + if err := pr.UpdateCols("status"); err != nil { + log.Error("AddToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err) + } + }) +} + +type PullRequestList []*PullRequest + +func (prs PullRequestList) loadAttributes(e Engine) (err error) { + if len(prs) == 0 { + return nil + } + + // Load issues + set := make(map[int64]*Issue) + for i := range prs { + set[prs[i].IssueID] = nil + } + issueIDs := make([]int64, 0, len(prs)) + for issueID := range set { + issueIDs = append(issueIDs, issueID) + } + issues := make([]*Issue, 0, len(issueIDs)) + if err = e.Where("id > 0").In("id", issueIDs).Find(&issues); err != nil { + return errors.Newf("find issues: %v", err) + } + for i := range issues { + set[issues[i].ID] = issues[i] + } + for i := range prs { + prs[i].Issue = set[prs[i].IssueID] + } + + // Load attributes + for i := range prs { + if err = prs[i].loadAttributes(e); err != nil { + return errors.Newf("loadAttributes [%d]: %v", prs[i].ID, err) + } + } + + return nil +} + +func (prs PullRequestList) LoadAttributes() error { + return prs.loadAttributes(x) +} + +func addHeadRepoTasks(prs []*PullRequest) { + for _, pr := range prs { + if pr.HeadRepo == nil { + log.Trace("addHeadRepoTasks[%d]: missing head repository", pr.ID) + continue + } + + log.Trace("addHeadRepoTasks[%d]: composing new test task", pr.ID) + if err := pr.UpdatePatch(); err != nil { + log.Error("UpdatePatch: %v", err) + continue + } else if err := pr.PushToBaseRepo(); err != nil { + log.Error("PushToBaseRepo: %v", err) + continue + } + + pr.AddToTaskQueue() + } +} + +// AddTestPullRequestTask adds new test tasks by given head/base repository and head/base branch, +// and generate new patch for testing as needed. +func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool) { + log.Trace("AddTestPullRequestTask [head_repo_id: %d, head_branch: %s]: finding pull requests", repoID, branch) + prs, err := GetUnmergedPullRequestsByHeadInfo(repoID, branch) + if err != nil { + log.Error("Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err) + return + } + + if isSync { + if err = PullRequestList(prs).LoadAttributes(); err != nil { + log.Error("PullRequestList.LoadAttributes: %v", err) + } + + if err == nil { + for _, pr := range prs { + pr.Issue.PullRequest = pr + if err = pr.Issue.LoadAttributes(); err != nil { + log.Error("LoadAttributes: %v", err) + continue + } + if err = PrepareWebhooks(pr.Issue.Repo, HookEventTypePullRequest, &apiv1types.WebhookPullRequestPayload{ + Action: apiv1types.WebhookIssueSynchronized, + Index: pr.Issue.Index, + PullRequest: pr.Issue.PullRequest.APIFormat(), + Repository: pr.Issue.Repo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }); err != nil { + log.Error("PrepareWebhooks [pull_id: %v]: %v", pr.ID, err) + continue + } + } + } + } + + addHeadRepoTasks(prs) + + log.Trace("AddTestPullRequestTask [base_repo_id: %d, base_branch: %s]: finding pull requests", repoID, branch) + prs, err = GetUnmergedPullRequestsByBaseInfo(repoID, branch) + if err != nil { + log.Error("Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err) + return + } + for _, pr := range prs { + pr.AddToTaskQueue() + } +} + +// checkAndUpdateStatus checks if pull request is possible to leaving checking status, +// and set to be either conflict or mergeable. +func (pr *PullRequest) checkAndUpdateStatus() { + // Status is not changed to conflict means mergeable. + if pr.Status == PullRequestStatusChecking { + pr.Status = PullRequestStatusMergeable + } + + // Make sure there is no waiting test to process before leaving the checking status. + if !PullRequestQueue.Exist(pr.ID) { + if err := pr.UpdateCols("status"); err != nil { + log.Error("Update[%d]: %v", pr.ID, err) + } + } +} + +// TestPullRequests checks and tests untested patches of pull requests. +// TODO: test more pull requests at same time. +func TestPullRequests() { + prs := make([]*PullRequest, 0, 10) + _ = x.Iterate(PullRequest{ + Status: PullRequestStatusChecking, + }, + func(idx int, bean any) error { + pr := bean.(*PullRequest) + + if err := pr.LoadAttributes(); err != nil { + log.Error("LoadAttributes: %v", err) + return nil + } + + if err := pr.testPatch(); err != nil { + log.Error("testPatch: %v", err) + return nil + } + prs = append(prs, pr) + return nil + }) + + // Update pull request status. + for _, pr := range prs { + pr.checkAndUpdateStatus() + } + + // Start listening on new test requests. + for prID := range PullRequestQueue.Queue() { + log.Trace("TestPullRequests[%v]: processing test task", prID) + PullRequestQueue.Remove(prID) + + id, _ := strconv.ParseInt(prID, 10, 64) + pr, err := GetPullRequestByID(id) + if err != nil { + log.Error("GetPullRequestByID[%s]: %v", prID, err) + continue + } else if err = pr.testPatch(); err != nil { + log.Error("testPatch[%d]: %v", pr.ID, err) + continue + } + + pr.checkAndUpdateStatus() + } +} + +func InitTestPullRequests() { + go TestPullRequests() +} diff --git a/internal/database/release.go b/internal/database/release.go new file mode 100644 index 00000000000..d5eaa856d5a --- /dev/null +++ b/internal/database/release.go @@ -0,0 +1,375 @@ +package database + +import ( + "fmt" + "sort" + "strings" + "time" + + log "unknwon.dev/clog/v2" + "xorm.io/xorm" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/errx" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" +) + +// Release represents a release of repository. +type Release struct { + ID int64 + RepoID int64 + Repo *Repository `xorm:"-" json:"-" gorm:"-"` + PublisherID int64 + Publisher *User `xorm:"-" json:"-" gorm:"-"` + TagName string + LowerTagName string + Target string + Title string + Sha1 string `xorm:"VARCHAR(40)"` + NumCommits int64 + NumCommitsBehind int64 `xorm:"-" json:"-" gorm:"-"` + Note string `xorm:"TEXT"` + IsDraft bool `xorm:"NOT NULL DEFAULT false"` + IsPrerelease bool + + Created time.Time `xorm:"-" json:"-" gorm:"-"` + CreatedUnix int64 + + Attachments []*Attachment `xorm:"-" json:"-" gorm:"-"` +} + +func (r *Release) BeforeInsert() { + if r.CreatedUnix == 0 { + r.CreatedUnix = time.Now().Unix() + } +} + +func (r *Release) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "created_unix": + r.Created = time.Unix(r.CreatedUnix, 0).Local() + } +} + +func (r *Release) loadAttributes(e Engine) (err error) { + if r.Repo == nil { + r.Repo, err = getRepositoryByID(e, r.RepoID) + if err != nil { + return errors.Newf("getRepositoryByID [repo_id: %d]: %v", r.RepoID, err) + } + } + + if r.Publisher == nil { + r.Publisher, err = getUserByID(e, r.PublisherID) + if err != nil { + if IsErrUserNotExist(err) { + r.PublisherID = -1 + r.Publisher = NewGhostUser() + } else { + return errors.Newf("getUserByID.(Publisher) [publisher_id: %d]: %v", r.PublisherID, err) + } + } + } + + if r.Attachments == nil { + r.Attachments, err = getAttachmentsByReleaseID(e, r.ID) + if err != nil { + return errors.Newf("getAttachmentsByReleaseID [%d]: %v", r.ID, err) + } + } + + return nil +} + +func (r *Release) LoadAttributes() error { + return r.loadAttributes(x) +} + +// This method assumes some fields assigned with values: +// Required - Publisher +func (r *Release) APIFormat() *apiv1types.RepositoryRelease { + return &apiv1types.RepositoryRelease{ + ID: r.ID, + TagName: r.TagName, + TargetCommitish: r.Target, + Name: r.Title, + Body: r.Note, + Draft: r.IsDraft, + Prerelease: r.IsPrerelease, + Author: r.Publisher.APIFormat(), + Created: r.Created, + } +} + +// IsReleaseExist returns true if release with given tag name already exists. +func IsReleaseExist(repoID int64, tagName string) (bool, error) { + if tagName == "" { + return false, nil + } + + return x.Get(&Release{RepoID: repoID, LowerTagName: strings.ToLower(tagName)}) +} + +func createTag(gitRepo *git.Repository, r *Release) error { + // Only actual create when publish. + if !r.IsDraft { + if !gitRepo.HasTag(r.TagName) { + commit, err := gitRepo.BranchCommit(r.Target) + if err != nil { + return errors.Newf("get branch commit: %v", err) + } + + // 🚨 SECURITY: Trim any leading '-' to prevent command line argument injection. + r.TagName = strings.TrimLeft(r.TagName, "-") + if err = gitRepo.CreateTag(r.TagName, commit.ID.String()); err != nil { + if strings.Contains(err.Error(), "is not a valid tag name") { + return ErrInvalidTagName{r.TagName} + } + return err + } + } else { + commit, err := gitRepo.TagCommit(r.TagName) + if err != nil { + return errors.Newf("get tag commit: %v", err) + } + + r.Sha1 = commit.ID.String() + r.NumCommits, err = commit.CommitsCount() + if err != nil { + return errors.Newf("count commits: %v", err) + } + } + } + return nil +} + +func (r *Release) preparePublishWebhooks() { + if err := PrepareWebhooks(r.Repo, HookEventTypeRelease, &apiv1types.WebhookReleasePayload{ + Action: apiv1types.WebhookReleasePublished, + Release: r.APIFormat(), + Repository: r.Repo.APIFormatLegacy(nil), + Sender: r.Publisher.APIFormat(), + }); err != nil { + log.Error("PrepareWebhooks: %v", err) + } +} + +// NewRelease creates a new release with attachments for repository. +func NewRelease(gitRepo *git.Repository, r *Release, uuids []string) error { + isExist, err := IsReleaseExist(r.RepoID, r.TagName) + if err != nil { + return err + } else if isExist { + return ErrReleaseAlreadyExist{r.TagName} + } + + if err = createTag(gitRepo, r); err != nil { + return err + } + r.LowerTagName = strings.ToLower(r.TagName) + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Insert(r); err != nil { + return errors.Newf("insert: %v", err) + } + + if len(uuids) > 0 { + if _, err = sess.In("uuid", uuids).Cols("release_id").Update(&Attachment{ReleaseID: r.ID}); err != nil { + return errors.Newf("link attachments: %v", err) + } + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + // Only send webhook when actually published, skip drafts + if r.IsDraft { + return nil + } + r, err = GetReleaseByID(r.ID) + if err != nil { + return errors.Newf("GetReleaseByID: %v", err) + } + r.preparePublishWebhooks() + return nil +} + +var _ errx.NotFound = (*ErrReleaseNotExist)(nil) + +type ErrReleaseNotExist struct { + args map[string]any +} + +func IsErrReleaseNotExist(err error) bool { + _, ok := err.(ErrReleaseNotExist) + return ok +} + +func (err ErrReleaseNotExist) Error() string { + return fmt.Sprintf("release does not exist: %v", err.args) +} + +func (ErrReleaseNotExist) NotFound() bool { + return true +} + +// GetRelease returns release by given ID. +func GetRelease(repoID int64, tagName string) (*Release, error) { + isExist, err := IsReleaseExist(repoID, tagName) + if err != nil { + return nil, err + } else if !isExist { + return nil, ErrReleaseNotExist{args: map[string]any{"tag": tagName}} + } + + r := &Release{RepoID: repoID, LowerTagName: strings.ToLower(tagName)} + if _, err = x.Get(r); err != nil { + return nil, errors.Newf("get: %v", err) + } + + return r, r.LoadAttributes() +} + +// GetReleaseByID returns release with given ID. +func GetReleaseByID(id int64) (*Release, error) { + r := new(Release) + has, err := x.Id(id).Get(r) + if err != nil { + return nil, err + } else if !has { + return nil, ErrReleaseNotExist{args: map[string]any{"releaseID": id}} + } + + return r, r.LoadAttributes() +} + +// GetPublishedReleasesByRepoID returns a list of published releases of repository. +// If matches is not empty, only published releases in matches will be returned. +// In any case, drafts won't be returned by this function. +func GetPublishedReleasesByRepoID(repoID int64, matches ...string) ([]*Release, error) { + sess := x.Where("repo_id = ?", repoID).And("is_draft = ?", false).Desc("created_unix") + if len(matches) > 0 { + sess.In("tag_name", matches) + } + releases := make([]*Release, 0, 5) + return releases, sess.Find(&releases, new(Release)) +} + +// GetReleasesByRepoID returns a list of all releases (including drafts) of given repository. +func GetReleasesByRepoID(repoID int64) ([]*Release, error) { + releases := make([]*Release, 0) + return releases, x.Where("repo_id = ?", repoID).Find(&releases) +} + +// GetDraftReleasesByRepoID returns all draft releases of repository. +func GetDraftReleasesByRepoID(repoID int64) ([]*Release, error) { + releases := make([]*Release, 0) + return releases, x.Where("repo_id = ?", repoID).And("is_draft = ?", true).Find(&releases) +} + +type ReleaseSorter struct { + releases []*Release +} + +func (rs *ReleaseSorter) Len() int { + return len(rs.releases) +} + +func (rs *ReleaseSorter) Less(i, j int) bool { + diffNum := rs.releases[i].NumCommits - rs.releases[j].NumCommits + if diffNum != 0 { + return diffNum > 0 + } + return rs.releases[i].Created.After(rs.releases[j].Created) +} + +func (rs *ReleaseSorter) Swap(i, j int) { + rs.releases[i], rs.releases[j] = rs.releases[j], rs.releases[i] +} + +// SortReleases sorts releases by number of commits and created time. +func SortReleases(rels []*Release) { + sorter := &ReleaseSorter{releases: rels} + sort.Sort(sorter) +} + +// UpdateRelease updates information of a release. +func UpdateRelease(doer *User, gitRepo *git.Repository, r *Release, isPublish bool, uuids []string) (err error) { + if err = createTag(gitRepo, r); err != nil { + return errors.Newf("createTag: %v", err) + } + + r.PublisherID = doer.ID + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + if _, err = sess.ID(r.ID).AllCols().Update(r); err != nil { + return errors.Newf("Update: %v", err) + } + + // Unlink all current attachments and link back later if still valid + if _, err = sess.Exec("UPDATE attachment SET release_id = 0 WHERE release_id = ?", r.ID); err != nil { + return errors.Newf("unlink current attachments: %v", err) + } + + if len(uuids) > 0 { + if _, err = sess.In("uuid", uuids).Cols("release_id").Update(&Attachment{ReleaseID: r.ID}); err != nil { + return errors.Newf("link attachments: %v", err) + } + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + if !isPublish { + return nil + } + r.Publisher = doer + r.preparePublishWebhooks() + return nil +} + +// DeleteReleaseOfRepoByID deletes a release and corresponding Git tag by given ID. +func DeleteReleaseOfRepoByID(repoID, id int64) error { + rel, err := GetReleaseByID(id) + if err != nil { + return errors.Newf("GetReleaseByID: %v", err) + } + + // Mark sure the delete operation against same repository. + if repoID != rel.RepoID { + return nil + } + + repo, err := GetRepositoryByID(rel.RepoID) + if err != nil { + return errors.Newf("GetRepositoryByID: %v", err) + } + + gitRepo, err := git.Open(repo.RepoPath()) + if err != nil { + return errors.Newf("open repository: %v", err) + } + err = gitRepo.DeleteTag(rel.TagName) + if err != nil && !strings.Contains(err.Error(), "not found") { + return errors.Newf("delete tag: %v", err) + } + + if _, err = x.Id(rel.ID).Delete(new(Release)); err != nil { + return errors.Newf("delete: %v", err) + } + + return nil +} diff --git a/internal/database/repo.go b/internal/database/repo.go new file mode 100644 index 00000000000..1e75ede26a4 --- /dev/null +++ b/internal/database/repo.go @@ -0,0 +1,2766 @@ +package database + +import ( + "bytes" + "context" + "fmt" + "image" + _ "image/jpeg" + "image/png" + "os" + "os/exec" + "path" + "path/filepath" + "slices" + "sort" + "strconv" + "strings" + "time" + + "github.com/cockroachdb/errors" + "github.com/unknwon/cae/zip" + "github.com/unknwon/com" + "golang.org/x/image/draw" + "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" + "xorm.io/xorm" + + "github.com/gogs/git-module" + + embedConf "gogs.io/gogs/conf" + "gogs.io/gogs/internal/avatar" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/dbx" + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/process" + "gogs.io/gogs/internal/repox" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" + "gogs.io/gogs/internal/semverx" + "gogs.io/gogs/internal/strx" + "gogs.io/gogs/internal/sync" +) + +// RepoAvatarURLPrefix is used to identify a URL is to access repository avatar. +const RepoAvatarURLPrefix = "repo-avatars" + +// InvalidRepoReference represents an error when repository reference is invalid. +type InvalidRepoReference struct { + Ref string +} + +// IsInvalidRepoReference returns true if the error is InvalidRepoReference. +func IsInvalidRepoReference(err error) bool { + _, ok := err.(InvalidRepoReference) + return ok +} + +func (err InvalidRepoReference) Error() string { + return fmt.Sprintf("invalid repository reference [ref: %s]", err.Ref) +} + +var repoWorkingPool = sync.NewExclusivePool() + +var ( + Gitignores, Licenses, Readmes, LabelTemplates []string + + // Maximum items per page in forks, watchers and stars of a repo + ItemsPerPage = 40 +) + +func LoadRepoConfig() { + // Load .gitignore and license files and readme templates. + types := []string{"gitignore", "license", "readme", "label"} + typeFiles := make([][]string, 4) + for i, t := range types { + files, err := embedConf.FileNames(t) + if err != nil { + log.Fatal("Failed to get %q files: %v", t, err) + } + + customPath := filepath.Join(conf.CustomDir(), "conf", t) + if osx.IsDir(customPath) { + entries, err := os.ReadDir(customPath) + if err != nil { + log.Fatal("Failed to get custom %s files: %v", t, err) + } + + for _, entry := range entries { + f := entry.Name() + if !strx.ContainsFold(files, f) { + files = append(files, f) + } + } + } + typeFiles[i] = files + } + + Gitignores = typeFiles[0] + Licenses = typeFiles[1] + Readmes = typeFiles[2] + LabelTemplates = typeFiles[3] + sort.Strings(Gitignores) + sort.Strings(Licenses) + sort.Strings(Readmes) + sort.Strings(LabelTemplates) + + // Filter out invalid names and promote preferred licenses. + sortedLicenses := make([]string, 0, len(Licenses)) + for _, name := range conf.Repository.PreferredLicenses { + if slices.Contains(Licenses, name) { + sortedLicenses = append(sortedLicenses, name) + } + } + for _, name := range Licenses { + if !slices.Contains(conf.Repository.PreferredLicenses, name) { + sortedLicenses = append(sortedLicenses, name) + } + } + Licenses = sortedLicenses +} + +func NewRepoContext() { + zip.Verbose = false + + // Check Git installation. + if _, err := exec.LookPath("git"); err != nil { + log.Fatal("Failed to test 'git' command: %v (forgotten install?)", err) + } + + // Check Git version. + var err error + conf.Git.Version, err = git.BinVersion() + if err != nil { + log.Fatal("Failed to get Git version: %v", err) + } + + log.Trace("Git version: %s", conf.Git.Version) + if semverx.Compare(conf.Git.Version, "<", "1.8.3") { + log.Fatal("Gogs requires Git version greater or equal to 1.8.3") + } + + // Git requires setting user.name and user.email in order to commit changes. + for configKey, defaultValue := range map[string]string{"user.name": "Gogs", "user.email": "gogs@fake.local"} { + if stdout, stderr, err := process.Exec("NewRepoContext(get setting)", "git", "config", "--get", configKey); err != nil || strings.TrimSpace(stdout) == "" { + // ExitError indicates this config is not set + if _, ok := err.(*exec.ExitError); ok || strings.TrimSpace(stdout) == "" { + if _, stderr, gerr := process.Exec("NewRepoContext(set "+configKey+")", "git", "config", "--global", configKey, defaultValue); gerr != nil { + log.Fatal("Failed to set git %s(%s): %s", configKey, gerr, stderr) + } + log.Info("Git config %s set to %s", configKey, defaultValue) + } else { + log.Fatal("Failed to get git %s(%s): %s", configKey, err, stderr) + } + } + } + + // Set git some configurations. + if _, stderr, err := process.Exec("NewRepoContext(git config --global core.quotepath false)", + "git", "config", "--global", "core.quotepath", "false"); err != nil { + log.Fatal("Failed to execute 'git config --global core.quotepath false': %v - %s", err, stderr) + } + + RemoveAllWithNotice("Clean up repository temporary data", filepath.Join(conf.Server.AppDataPath, "tmp")) + RemoveAllWithNotice("Clean up LFS temporary data", conf.LFS.ObjectsTempPath) +} + +// Repository contains information of a repository. +type Repository struct { + ID int64 `gorm:"primaryKey"` + OwnerID int64 `xorm:"UNIQUE(s)" gorm:"uniqueIndex:repo_owner_name_unique"` + Owner *User `xorm:"-" gorm:"-" json:"-"` + LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL" gorm:"uniqueIndex:repo_owner_name_unique;index;not null"` + Name string `xorm:"INDEX NOT NULL" gorm:"index;not null"` + Description string `xorm:"VARCHAR(512)" gorm:"type:VARCHAR(512)"` + Website string + DefaultBranch string + Size int64 `xorm:"NOT NULL DEFAULT 0" gorm:"not null;default:0"` + UseCustomAvatar bool + + // Counters + NumWatches int + NumStars int + NumForks int + NumIssues int + NumClosedIssues int + NumOpenIssues int `xorm:"-" gorm:"-" json:"-"` + NumPulls int + NumClosedPulls int + NumOpenPulls int `xorm:"-" gorm:"-" json:"-"` + NumMilestones int `xorm:"NOT NULL DEFAULT 0" gorm:"not null;default:0"` + NumClosedMilestones int `xorm:"NOT NULL DEFAULT 0" gorm:"not null;default:0"` + NumOpenMilestones int `xorm:"-" gorm:"-" json:"-"` + NumTags int `xorm:"-" gorm:"-" json:"-"` + + IsPrivate bool + // TODO: When migrate to GORM, make sure to do a loose migration with `HasColumn` and `AddColumn`, + // see docs in https://gorm.io/docs/migration.html. + IsUnlisted bool `xorm:"NOT NULL DEFAULT false" gorm:"not null;default:FALSE"` + IsBare bool + + IsMirror bool + *Mirror `xorm:"-" gorm:"-" json:"-"` + + // Advanced settings + EnableWiki bool `xorm:"NOT NULL DEFAULT true" gorm:"not null;default:TRUE"` + AllowPublicWiki bool + EnableExternalWiki bool + ExternalWikiURL string + EnableIssues bool `xorm:"NOT NULL DEFAULT true" gorm:"not null;default:TRUE"` + AllowPublicIssues bool + EnableExternalTracker bool + ExternalTrackerURL string + ExternalTrackerFormat string + ExternalTrackerStyle string + ExternalMetas map[string]string `xorm:"-" gorm:"-" json:"-"` + EnablePulls bool `xorm:"NOT NULL DEFAULT true" gorm:"not null;default:TRUE"` + PullsIgnoreWhitespace bool `xorm:"NOT NULL DEFAULT false" gorm:"not null;default:FALSE"` + PullsAllowRebase bool `xorm:"NOT NULL DEFAULT false" gorm:"not null;default:FALSE"` + + IsFork bool `xorm:"NOT NULL DEFAULT false" gorm:"not null;default:FALSE"` + ForkID int64 + BaseRepo *Repository `xorm:"-" gorm:"-" json:"-"` + + Created time.Time `xorm:"-" gorm:"-" json:"-"` + CreatedUnix int64 + Updated time.Time `xorm:"-" gorm:"-" json:"-"` + UpdatedUnix int64 +} + +func (r *Repository) BeforeInsert() { + r.CreatedUnix = time.Now().Unix() + r.UpdatedUnix = r.CreatedUnix +} + +func (r *Repository) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "default_branch": + // FIXME: use db migration to solve all at once. + if r.DefaultBranch == "" { + r.DefaultBranch = conf.Repository.DefaultBranch + } + case "num_closed_issues": + r.NumOpenIssues = r.NumIssues - r.NumClosedIssues + case "num_closed_pulls": + r.NumOpenPulls = r.NumPulls - r.NumClosedPulls + case "num_closed_milestones": + r.NumOpenMilestones = r.NumMilestones - r.NumClosedMilestones + case "external_tracker_style": + if r.ExternalTrackerStyle == "" { + r.ExternalTrackerStyle = markup.IssueNameStyleNumeric + } + case "created_unix": + r.Created = time.Unix(r.CreatedUnix, 0).Local() + case "updated_unix": + r.Updated = time.Unix(r.UpdatedUnix, 0) + } +} + +func (r *Repository) loadAttributes(e Engine) (err error) { + if r.Owner == nil { + r.Owner, err = getUserByID(e, r.OwnerID) + if err != nil { + return errors.Newf("getUserByID [%d]: %v", r.OwnerID, err) + } + } + + if r.IsFork && r.BaseRepo == nil { + r.BaseRepo, err = getRepositoryByID(e, r.ForkID) + if err != nil { + if IsErrRepoNotExist(err) { + r.IsFork = false + r.ForkID = 0 + } else { + return errors.Newf("get fork repository by ID: %v", err) + } + } + } + + return nil +} + +func (r *Repository) LoadAttributes() error { + return r.loadAttributes(x) +} + +// IsPartialPublic returns true if repository is public or allow public access to wiki or issues. +func (r *Repository) IsPartialPublic() bool { + return !r.IsPrivate || r.AllowPublicWiki || r.AllowPublicIssues +} + +func (r *Repository) CanGuestViewWiki() bool { + return r.EnableWiki && !r.EnableExternalWiki && r.AllowPublicWiki +} + +func (r *Repository) CanGuestViewIssues() bool { + return r.EnableIssues && !r.EnableExternalTracker && r.AllowPublicIssues +} + +// MustOwner always returns a valid *User object to avoid conceptually impossible error handling. +// It creates a fake object that contains error details when error occurs. +func (r *Repository) MustOwner() *User { + return r.mustOwner(x) +} + +func (r *Repository) FullName() string { + return r.MustOwner().Name + "/" + r.Name +} + +// Deprecated: Use repox.HTMLURL instead. +func (r *Repository) HTMLURL() string { + return conf.Server.ExternalURL + r.FullName() +} + +// CustomAvatarPath returns repository custom avatar file path. +func (r *Repository) CustomAvatarPath() string { + return filepath.Join(conf.Picture.RepositoryAvatarUploadPath, strconv.FormatInt(r.ID, 10)) +} + +// RelAvatarLink returns relative avatar link to the site domain, +// which includes app sub-url as prefix. +// Since Gravatar support not needed here - just check for image path. +func (r *Repository) RelAvatarLink() string { + defaultImgURL := "" + if !osx.Exist(r.CustomAvatarPath()) { + return defaultImgURL + } + return fmt.Sprintf("%s/%s/%d", conf.Server.Subpath, RepoAvatarURLPrefix, r.ID) +} + +// AvatarLink returns repository avatar absolute link. +func (r *Repository) AvatarLink() string { + link := r.RelAvatarLink() + if link[0] == '/' && link[1] != '/' { + return conf.Server.ExternalURL + strings.TrimPrefix(link, conf.Server.Subpath)[1:] + } + return link +} + +// UploadAvatar saves custom avatar for repository. +// FIXME: split uploads to different subdirs in case we have massive number of repositories. +func (r *Repository) UploadAvatar(data []byte) error { + img, _, err := image.Decode(bytes.NewReader(data)) + if err != nil { + return errors.Newf("decode image: %v", err) + } + + _ = os.MkdirAll(conf.Picture.RepositoryAvatarUploadPath, os.ModePerm) + fw, err := os.Create(r.CustomAvatarPath()) + if err != nil { + return errors.Newf("create custom avatar directory: %v", err) + } + defer fw.Close() + + dst := image.NewRGBA(image.Rect(0, 0, avatar.DefaultSize, avatar.DefaultSize)) + draw.NearestNeighbor.Scale(dst, dst.Bounds(), img, img.Bounds(), draw.Over, nil) + if err = png.Encode(fw, dst); err != nil { + return errors.Newf("encode image: %v", err) + } + + return nil +} + +// DeleteAvatar deletes the repository custom avatar. +func (r *Repository) DeleteAvatar() error { + log.Trace("DeleteAvatar [%d]: %s", r.ID, r.CustomAvatarPath()) + if err := os.Remove(r.CustomAvatarPath()); err != nil { + return err + } + + r.UseCustomAvatar = false + return UpdateRepository(r, false) +} + +// This method assumes following fields have been assigned with valid values: +// Required - BaseRepo (if fork) +// Arguments that are allowed to be nil: permission +// +// Deprecated: Use APIFormat instead. +func (r *Repository) APIFormatLegacy(permission *apiv1types.RepositoryPermission, user ...*User) *apiv1types.Repository { + cloneLink := r.CloneLink() + apiRepo := &apiv1types.Repository{ + ID: r.ID, + Owner: r.Owner.APIFormat(), + Name: r.Name, + FullName: r.FullName(), + Description: r.Description, + Private: r.IsPrivate, + Fork: r.IsFork, + Empty: r.IsBare, + Mirror: r.IsMirror, + Size: r.Size, + HTMLURL: r.HTMLURL(), + SSHURL: cloneLink.SSH, + CloneURL: cloneLink.HTTPS, + Website: r.Website, + Stars: r.NumStars, + Forks: r.NumForks, + Watchers: r.NumWatches, + OpenIssues: r.NumOpenIssues, + DefaultBranch: r.DefaultBranch, + Created: r.Created, + Updated: r.Updated, + Permissions: permission, + // Reserved for go-gogs-client change + // AvatarUrl: r.AvatarLink(), + } + if r.IsFork { + p := &apiv1types.RepositoryPermission{Pull: true} + if len(user) != 0 { + accessMode := Handle.Permissions().AccessMode( + context.TODO(), + user[0].ID, + r.ID, + AccessModeOptions{ + OwnerID: r.OwnerID, + Private: r.IsPrivate, + }, + ) + p.Admin = accessMode >= AccessModeAdmin + p.Push = accessMode >= AccessModeWrite + } + apiRepo.Parent = r.BaseRepo.APIFormatLegacy(p) + } + return apiRepo +} + +func (r *Repository) getOwner(e Engine) (err error) { + if r.Owner != nil { + return nil + } + + r.Owner, err = getUserByID(e, r.OwnerID) + return err +} + +func (r *Repository) GetOwner() error { + return r.getOwner(x) +} + +func (r *Repository) mustOwner(e Engine) *User { + if err := r.getOwner(e); err != nil { + return &User{ + Name: "error", + FullName: err.Error(), + } + } + + return r.Owner +} + +func (r *Repository) UpdateSize() error { + countObject, err := git.CountObjects(r.RepoPath()) + if err != nil { + return errors.Newf("count repository objects: %v", err) + } + + r.Size = countObject.Size + countObject.SizePack + if _, err = x.Id(r.ID).Cols("size").Update(r); err != nil { + return errors.Newf("update size: %v", err) + } + return nil +} + +// ComposeMetas composes a map of metas for rendering SHA1 URL and external issue tracker URL. +func (r *Repository) ComposeMetas() map[string]string { + if r.ExternalMetas != nil { + return r.ExternalMetas + } + + r.ExternalMetas = map[string]string{ + "repoLink": r.Link(), + } + + if r.EnableExternalTracker { + r.ExternalMetas["user"] = r.MustOwner().Name + r.ExternalMetas["repo"] = r.Name + r.ExternalMetas["format"] = r.ExternalTrackerFormat + + switch r.ExternalTrackerStyle { + case markup.IssueNameStyleAlphanumeric: + r.ExternalMetas["style"] = markup.IssueNameStyleAlphanumeric + default: + r.ExternalMetas["style"] = markup.IssueNameStyleNumeric + } + } + + return r.ExternalMetas +} + +// DeleteWiki removes the actual and local copy of repository wiki. +func (r *Repository) DeleteWiki() { + wikiPaths := []string{r.WikiPath(), r.LocalWikiPath()} + for _, wikiPath := range wikiPaths { + RemoveAllWithNotice("Delete repository wiki", wikiPath) + } +} + +// getUsersWithAccesMode returns users that have at least given access mode to the repository. +func (r *Repository) getUsersWithAccesMode(e Engine, mode AccessMode) (_ []*User, err error) { + if err = r.getOwner(e); err != nil { + return nil, err + } + + accesses := make([]*Access, 0, 10) + if err = e.Where("repo_id = ? AND mode >= ?", r.ID, mode).Find(&accesses); err != nil { + return nil, err + } + + // Leave a seat for owner itself to append later, but if owner is an organization + // and just waste 1 unit is cheaper than re-allocate memory once. + users := make([]*User, 0, len(accesses)+1) + if len(accesses) > 0 { + userIDs := make([]int64, len(accesses)) + for i := 0; i < len(accesses); i++ { + userIDs[i] = accesses[i].UserID + } + + if err = e.In("id", userIDs).Find(&users); err != nil { + return nil, err + } + + // TODO(unknwon): Rely on AfterFind hook to sanitize user full name. + for _, u := range users { + u.FullName = markup.Sanitize(u.FullName) + } + } + if !r.Owner.IsOrganization() { + users = append(users, r.Owner) + } + + return users, nil +} + +// getAssignees returns a list of users who can be assigned to issues in this repository. +func (r *Repository) getAssignees(e Engine) (_ []*User, err error) { + return r.getUsersWithAccesMode(e, AccessModeRead) +} + +// GetAssignees returns all users that have read access and can be assigned to issues +// of the repository, +func (r *Repository) GetAssignees() (_ []*User, err error) { + return r.getAssignees(x) +} + +// GetAssigneeByID returns the user that has write access of repository by given ID. +func (r *Repository) GetAssigneeByID(userID int64) (*User, error) { + ctx := context.TODO() + if !Handle.Permissions().Authorize( + ctx, + userID, + r.ID, + AccessModeRead, + AccessModeOptions{ + OwnerID: r.OwnerID, + Private: r.IsPrivate, + }, + ) { + return nil, ErrUserNotExist{args: errx.Args{"userID": userID}} + } + return Handle.Users().GetByID(ctx, userID) +} + +// GetWriters returns all users that have write access to the repository. +func (r *Repository) GetWriters() (_ []*User, err error) { + return r.getUsersWithAccesMode(x, AccessModeWrite) +} + +// GetMilestoneByID returns the milestone belongs to repository by given ID. +func (r *Repository) GetMilestoneByID(milestoneID int64) (*Milestone, error) { + return GetMilestoneByRepoID(r.ID, milestoneID) +} + +// IssueStats returns number of open and closed repository issues by given filter mode. +func (r *Repository) IssueStats(userID int64, filterMode FilterMode, isPull bool) (int64, int64) { + return GetRepoIssueStats(r.ID, userID, filterMode, isPull) +} + +func (r *Repository) GetMirror() (err error) { + r.Mirror, err = GetMirrorByRepoID(r.ID) + return err +} + +func (r *Repository) repoPath(e Engine) string { + return RepoPath(r.mustOwner(e).Name, r.Name) +} + +// Deprecated: Use repox.RepositoryPath instead. +func (r *Repository) RepoPath() string { + return r.repoPath(x) +} + +func (r *Repository) GitConfigPath() string { + return filepath.Join(r.RepoPath(), "config") +} + +func (r *Repository) RelLink() string { + return "/" + r.FullName() +} + +func (r *Repository) Link() string { + return conf.Server.Subpath + "/" + r.FullName() +} + +// Deprecated: Use repox.ComparePath instead. +func (r *Repository) ComposeCompareURL(oldCommitID, newCommitID string) string { + return fmt.Sprintf("%s/%s/compare/%s...%s", r.MustOwner().Name, r.Name, oldCommitID, newCommitID) +} + +func (r *Repository) HasAccess(userID int64) bool { + return Handle.Permissions().Authorize(context.TODO(), userID, r.ID, AccessModeRead, + AccessModeOptions{ + OwnerID: r.OwnerID, + Private: r.IsPrivate, + }, + ) +} + +func (r *Repository) IsOwnedBy(userID int64) bool { + return r.OwnerID == userID +} + +// CanBeForked returns true if repository meets the requirements of being forked. +func (r *Repository) CanBeForked() bool { + return !r.IsBare +} + +// CanEnablePulls returns true if repository meets the requirements of accepting pulls. +func (r *Repository) CanEnablePulls() bool { + return !r.IsMirror && !r.IsBare +} + +// AllowPulls returns true if repository meets the requirements of accepting pulls and has them enabled. +func (r *Repository) AllowsPulls() bool { + return r.CanEnablePulls() && r.EnablePulls +} + +func (r *Repository) IsBranchRequirePullRequest(name string) bool { + return IsBranchOfRepoRequirePullRequest(r.ID, name) +} + +// CanEnableEditor returns true if repository meets the requirements of web editor. +func (r *Repository) CanEnableEditor() bool { + return !r.IsMirror +} + +// FIXME: should have a mutex to prevent producing same index for two issues that are created +// closely enough. +func (r *Repository) NextIssueIndex() int64 { + return int64(r.NumIssues+r.NumPulls) + 1 +} + +func (r *Repository) LocalCopyPath() string { + return filepath.Join(conf.Server.AppDataPath, "tmp", "local-r", strconv.FormatInt(r.ID, 10)) +} + +// UpdateLocalCopy fetches latest changes of given branch from repoPath to localPath. +// It creates a new clone if local copy does not exist, but does not checks out to a +// specific branch if the local copy belongs to a wiki. +// For existing local copy, it checks out to target branch by default, and safe to +// assume subsequent operations are against target branch when caller has confidence +// about no race condition. +func UpdateLocalCopyBranch(repoPath, localPath, branch string, isWiki bool) (err error) { + if !osx.Exist(localPath) { + // Checkout to a specific branch fails when wiki is an empty repository. + if isWiki { + branch = "" + } + if err = git.Clone(repoPath, localPath, git.CloneOptions{ + Branch: branch, + Timeout: time.Duration(conf.Git.Timeout.Clone) * time.Second, + }); err != nil { + return errors.Newf("git clone [branch: %s]: %v", branch, err) + } + return nil + } + + gitRepo, err := git.Open(localPath) + if err != nil { + return errors.Newf("open repository: %v", err) + } + + if err = gitRepo.Fetch(git.FetchOptions{ + Prune: true, + }); err != nil { + return errors.Newf("fetch: %v", err) + } + + if err = gitRepo.Checkout(branch); err != nil { + return errors.Newf("checkout [branch: %s]: %v", branch, err) + } + + // Reset to align with remote in case of force push. + rev := "origin/" + branch + if err = gitRepo.Reset(rev, git.ResetOptions{ + Hard: true, + }); err != nil { + return errors.Newf("reset [revision: %s]: %v", rev, err) + } + return nil +} + +// UpdateLocalCopyBranch makes sure local copy of repository in given branch is up-to-date. +func (r *Repository) UpdateLocalCopyBranch(branch string) error { + return UpdateLocalCopyBranch(r.RepoPath(), r.LocalCopyPath(), branch, false) +} + +// PatchPath returns corresponding patch file path of repository by given issue ID. +func (r *Repository) PatchPath(index int64) (string, error) { + if err := r.GetOwner(); err != nil { + return "", err + } + + return filepath.Join(RepoPath(r.Owner.Name, r.Name), "pulls", strconv.FormatInt(index, 10)+".patch"), nil +} + +// SavePatch saves patch data to corresponding location by given issue ID. +func (r *Repository) SavePatch(index int64, patch []byte) error { + patchPath, err := r.PatchPath(index) + if err != nil { + return errors.Newf("PatchPath: %v", err) + } + + if err = os.MkdirAll(filepath.Dir(patchPath), os.ModePerm); err != nil { + return err + } + if err = os.WriteFile(patchPath, patch, 0o644); err != nil { + return errors.Newf("WriteFile: %v", err) + } + + return nil +} + +func isRepositoryExist(e Engine, u *User, repoName string) (bool, error) { + has, err := e.Get(&Repository{ + OwnerID: u.ID, + LowerName: strings.ToLower(repoName), + }) + return has && osx.IsDir(RepoPath(u.Name, repoName)), err +} + +// IsRepositoryExist returns true if the repository with given name under user has already existed. +func IsRepositoryExist(u *User, repoName string) (bool, error) { + return isRepositoryExist(x, u, repoName) +} + +// Deprecated: Use repox.NewCloneLink instead. +func (r *Repository) cloneLink(isWiki bool) *repox.CloneLink { + repoName := r.Name + if isWiki { + repoName += ".wiki" + } + + r.Owner = r.MustOwner() + cl := new(repox.CloneLink) + if conf.SSH.Port != 22 { + cl.SSH = fmt.Sprintf("ssh://%s@%s:%d/%s/%s.git", conf.App.RunUser, conf.SSH.Domain, conf.SSH.Port, r.Owner.Name, repoName) + } else { + cl.SSH = fmt.Sprintf("%s@%s:%s/%s.git", conf.App.RunUser, conf.SSH.Domain, r.Owner.Name, repoName) + } + cl.HTTPS = repox.HTTPSCloneURL(r.Owner.Name, repoName) + return cl +} + +// CloneLink returns clone URLs of repository. +// +// Deprecated: Use repox.NewCloneLink instead. +func (r *Repository) CloneLink() (cl *repox.CloneLink) { + return r.cloneLink(false) +} + +type MigrateRepoOptions struct { + Name string + Description string + IsPrivate bool + IsUnlisted bool + IsMirror bool + RemoteAddr string +} + +/* +- GitHub, GitLab, Gogs: *.wiki.git +- BitBucket: *.git/wiki +*/ +var commonWikiURLSuffixes = []string{".wiki.git", ".git/wiki"} + +// wikiRemoteURL returns accessible repository URL for wiki if exists. +// Otherwise, it returns an empty string. +func wikiRemoteURL(remote string) string { + remote = strings.TrimSuffix(remote, ".git") + for _, suffix := range commonWikiURLSuffixes { + wikiURL := remote + suffix + if git.IsURLAccessible(time.Minute, wikiURL) { + return wikiURL + } + } + return "" +} + +// MigrateRepository migrates a existing repository from other project hosting. +func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository, error) { + repo, err := CreateRepository(doer, owner, CreateRepoOptionsLegacy{ + Name: opts.Name, + Description: opts.Description, + IsPrivate: opts.IsPrivate, + IsUnlisted: opts.IsUnlisted, + IsMirror: opts.IsMirror, + }) + if err != nil { + return nil, err + } + + repoPath := RepoPath(owner.Name, opts.Name) + wikiPath := WikiPath(owner.Name, opts.Name) + + if owner.IsOrganization() { + t, err := owner.GetOwnerTeam() + if err != nil { + return nil, err + } + repo.NumWatches = t.NumMembers + } else { + repo.NumWatches = 1 + } + + migrateTimeout := time.Duration(conf.Git.Timeout.Migrate) * time.Second + + RemoveAllWithNotice("Repository path erase before creation", repoPath) + if err = git.Clone(opts.RemoteAddr, repoPath, git.CloneOptions{ + Mirror: true, + Quiet: true, + Timeout: migrateTimeout, + }); err != nil { + return repo, errors.Newf("clone: %v", err) + } + + wikiRemotePath := wikiRemoteURL(opts.RemoteAddr) + if len(wikiRemotePath) > 0 { + RemoveAllWithNotice("Repository wiki path erase before creation", wikiPath) + if err = git.Clone(wikiRemotePath, wikiPath, git.CloneOptions{ + Mirror: true, + Quiet: true, + Timeout: migrateTimeout, + }); err != nil { + log.Error("Failed to clone wiki: %v", err) + RemoveAllWithNotice("Delete repository wiki for initialization failure", wikiPath) + } + } + + // Check if repository is empty. + cmd := exec.Command("git", "log", "-1") + cmd.Dir = repoPath + output, err := cmd.CombinedOutput() + if err != nil { + if strings.Contains(string(output), "fatal: bad default revision 'HEAD'") { + repo.IsBare = true + } else { + return repo, errors.Newf("check bare: %v - %s", err, output) + } + } + + if !repo.IsBare { + // Try to get HEAD branch and set it as default branch. + gitRepo, err := git.Open(repoPath) + if err != nil { + return repo, errors.Newf("open repository: %v", err) + } + refspec, err := gitRepo.SymbolicRef() + if err != nil { + return repo, errors.Newf("get HEAD branch: %v", err) + } + repo.DefaultBranch = git.RefShortName(refspec) + + if err = repo.UpdateSize(); err != nil { + log.Error("UpdateSize [repo_id: %d]: %v", repo.ID, err) + } + } + + if opts.IsMirror { + if _, err = x.InsertOne(&Mirror{ + RepoID: repo.ID, + Interval: conf.Mirror.DefaultInterval, + EnablePrune: true, + NextSync: time.Now().Add(time.Duration(conf.Mirror.DefaultInterval) * time.Hour), + }); err != nil { + return repo, errors.Newf("InsertOne: %v", err) + } + + repo.IsMirror = true + return repo, UpdateRepository(repo, false) + } + + return CleanUpMigrateInfo(repo) +} + +// cleanUpMigrateGitConfig removes mirror info which prevents "push --all". +// This also removes possible user credentials. +func cleanUpMigrateGitConfig(configPath string) error { + cfg, err := ini.Load(configPath) + if err != nil { + return errors.Newf("open config file: %v", err) + } + cfg.DeleteSection("remote \"origin\"") + if err = cfg.SaveToIndent(configPath, "\t"); err != nil { + return errors.Newf("save config file: %v", err) + } + return nil +} + +var hooksTpls = map[git.HookName]string{ + "pre-receive": "#!/usr/bin/env %s\n\"%s\" hook --config='%s' pre-receive\n", + "update": "#!/usr/bin/env %s\n\"%s\" hook --config='%s' update $1 $2 $3\n", + "post-receive": "#!/usr/bin/env %s\n\"%s\" hook --config='%s' post-receive\n", +} + +func createDelegateHooks(repoPath string) (err error) { + for _, name := range git.ServerSideHooks { + hookPath := filepath.Join(repoPath, "hooks", string(name)) + if err = os.WriteFile(hookPath, + fmt.Appendf(nil, hooksTpls[name], conf.Repository.ScriptType, conf.AppPath(), conf.CustomConf), + os.ModePerm); err != nil { + return errors.Newf("create delegate hook '%s': %v", hookPath, err) + } + } + return nil +} + +// Finish migrating repository and/or wiki with things that don't need to be done for mirrors. +func CleanUpMigrateInfo(repo *Repository) (*Repository, error) { + repoPath := repo.RepoPath() + if err := createDelegateHooks(repoPath); err != nil { + return repo, errors.Newf("createDelegateHooks: %v", err) + } + if repo.HasWiki() { + if err := createDelegateHooks(repo.WikiPath()); err != nil { + return repo, errors.Newf("createDelegateHooks.(wiki): %v", err) + } + } + + if err := cleanUpMigrateGitConfig(repo.GitConfigPath()); err != nil { + return repo, errors.Newf("cleanUpMigrateGitConfig: %v", err) + } + if repo.HasWiki() { + if err := cleanUpMigrateGitConfig(path.Join(repo.WikiPath(), "config")); err != nil { + return repo, errors.Newf("cleanUpMigrateGitConfig.(wiki): %v", err) + } + } + + return repo, UpdateRepository(repo, false) +} + +// initRepoCommit temporarily changes with work directory. +func initRepoCommit(tmpPath string, sig *git.Signature) (err error) { + var stderr string + if _, stderr, err = process.ExecDir(-1, + tmpPath, fmt.Sprintf("initRepoCommit (git add): %s", tmpPath), + "git", "add", "--all"); err != nil { + return errors.Newf("git add: %s", stderr) + } + + if _, stderr, err = process.ExecDir(-1, + tmpPath, fmt.Sprintf("initRepoCommit (git commit): %s", tmpPath), + "git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), + "-m", "Initial commit"); err != nil { + return errors.Newf("git commit: %s", stderr) + } + + if _, stderr, err = process.ExecDir(-1, + tmpPath, fmt.Sprintf("initRepoCommit (git push): %s", tmpPath), + "git", "push"); err != nil { + return errors.Newf("git push: %s", stderr) + } + return nil +} + +type CreateRepoOptionsLegacy struct { + Name string + Description string + Gitignores string + License string + Readme string + IsPrivate bool + IsUnlisted bool + IsMirror bool + AutoInit bool +} + +func getRepoInitFile(tp, name string) ([]byte, error) { + relPath := path.Join(tp, strings.TrimLeft(path.Clean("/"+name), "/")) + + // Use custom file when available. + customPath := filepath.Join(conf.CustomDir(), "conf", relPath) + if osx.IsFile(customPath) { + return os.ReadFile(customPath) + } + return embedConf.Files.ReadFile(relPath) +} + +func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRepoOptionsLegacy) error { + // Clone to temporary path and do the init commit. + err := git.Clone(repoPath, tmpDir, git.CloneOptions{}) + if err != nil { + return errors.Wrap(err, "clone") + } + + // README + data, err := getRepoInitFile("readme", opts.Readme) + if err != nil { + return errors.Newf("getRepoInitFile[%s]: %v", opts.Readme, err) + } + + cloneLink := repo.CloneLink() + match := map[string]string{ + "Name": repo.Name, + "Description": repo.Description, + "CloneURL.SSH": cloneLink.SSH, + "CloneURL.HTTPS": cloneLink.HTTPS, + } + if err = os.WriteFile(filepath.Join(tmpDir, "README.md"), + []byte(com.Expand(string(data), match)), 0o644); err != nil { + return errors.Newf("write README.md: %v", err) + } + + // .gitignore + if len(opts.Gitignores) > 0 { + var buf bytes.Buffer + names := strings.SplitSeq(opts.Gitignores, ",") + for name := range names { + data, err = getRepoInitFile("gitignore", name) + if err != nil { + return errors.Newf("getRepoInitFile[%s]: %v", name, err) + } + buf.WriteString("# ---> " + name + "\n") + buf.Write(data) + buf.WriteString("\n") + } + + if buf.Len() > 0 { + if err = os.WriteFile(filepath.Join(tmpDir, ".gitignore"), buf.Bytes(), 0o644); err != nil { + return errors.Newf("write .gitignore: %v", err) + } + } + } + + // LICENSE + if len(opts.License) > 0 { + data, err = getRepoInitFile("license", opts.License) + if err != nil { + return errors.Newf("getRepoInitFile[%s]: %v", opts.License, err) + } + + if err = os.WriteFile(filepath.Join(tmpDir, "LICENSE"), data, 0o644); err != nil { + return errors.Newf("write LICENSE: %v", err) + } + } + + return nil +} + +// initRepository performs initial commit with chosen setup files on behave of doer. +func initRepository(e Engine, repoPath string, doer *User, repo *Repository, opts CreateRepoOptionsLegacy) (err error) { + // Init bare new repository. + if err = git.Init(repoPath, git.InitOptions{Bare: true}); err != nil { + return errors.Newf("init repository: %v", err) + } else if err = createDelegateHooks(repoPath); err != nil { + return errors.Newf("createDelegateHooks: %v", err) + } + + // Set default branch + _, err = git.SymbolicRef( + repoPath, + git.SymbolicRefOptions{ + Name: "HEAD", + Ref: git.RefsHeads + conf.Repository.DefaultBranch, + }, + ) + if err != nil { + return errors.Wrap(err, "set default branch") + } + + tmpDir := filepath.Join(os.TempDir(), "gogs-"+repo.Name+"-"+strconv.Itoa(time.Now().Nanosecond())) + + // Initialize repository according to user's choice. + if opts.AutoInit { + if err = os.MkdirAll(tmpDir, os.ModePerm); err != nil { + return err + } + defer RemoveAllWithNotice("Delete repository for auto-initialization", tmpDir) + + if err = prepareRepoCommit(repo, tmpDir, repoPath, opts); err != nil { + return errors.Newf("prepareRepoCommit: %v", err) + } + + // Apply changes and commit. + err = initRepoCommit( + tmpDir, + &git.Signature{ + Name: doer.DisplayName(), + Email: doer.Email, + When: time.Now(), + }, + ) + if err != nil { + return errors.Newf("initRepoCommit: %v", err) + } + } + + // Re-fetch the repository from database before updating it (else it would + // override changes that were done earlier with sql) + if repo, err = getRepositoryByID(e, repo.ID); err != nil { + return errors.Newf("getRepositoryByID: %v", err) + } + + if !opts.AutoInit { + repo.IsBare = true + } + + repo.DefaultBranch = conf.Repository.DefaultBranch + if err = updateRepository(e, repo, false); err != nil { + return errors.Newf("updateRepository: %v", err) + } + + return nil +} + +var ( + reservedRepoNames = map[string]struct{}{ + ".": {}, + "..": {}, + } + reservedRepoPatterns = []string{ + "*.git", + "*.wiki", + } +) + +// isRepoNameAllowed return an error if given name is a reserved name or pattern for repositories. +func isRepoNameAllowed(name string) error { + return isNameAllowed(reservedRepoNames, reservedRepoPatterns, name) +} + +func createRepository(e *xorm.Session, doer, owner *User, repo *Repository) (err error) { + if err = isRepoNameAllowed(repo.Name); err != nil { + return err + } + + has, err := isRepositoryExist(e, owner, repo.Name) + if err != nil { + return errors.Newf("IsRepositoryExist: %v", err) + } else if has { + return ErrRepoAlreadyExist{args: errx.Args{"ownerID": owner.ID, "name": repo.Name}} + } + + if _, err = e.Insert(repo); err != nil { + return err + } + + _, err = e.Exec(dbx.Quote("UPDATE %s SET num_repos = num_repos + 1 WHERE id = ?", "user"), owner.ID) + if err != nil { + return errors.Wrap(err, "increase owned repository count") + } + + // Give access to all members in owner team. + if owner.IsOrganization() { + t, err := owner.getOwnerTeam(e) + if err != nil { + return errors.Newf("getOwnerTeam: %v", err) + } else if err = t.addRepository(e, repo); err != nil { + return errors.Newf("addRepository: %v", err) + } + } else { + // Organization automatically called this in addRepository method. + if err = repo.recalculateAccesses(e); err != nil { + return errors.Newf("recalculateAccesses: %v", err) + } + } + + if err = watchRepo(e, owner.ID, repo.ID, true); err != nil { + return errors.Newf("watchRepo: %v", err) + } + + // FIXME: This is identical to Actions.NewRepo but we are not yet able to wrap + // transaction with different ORM objects, should delete this once migrated to + // GORM for this part of logic. + newRepoAction := func(e Engine, doer *User, repo *Repository) (err error) { + opType := ActionCreateRepo + if repo.IsFork { + opType = ActionForkRepo + } + + return notifyWatchers(e, &Action{ + ActUserID: doer.ID, + ActUserName: doer.Name, + OpType: opType, + RepoID: repo.ID, + RepoUserName: repo.Owner.Name, + RepoName: repo.Name, + IsPrivate: repo.IsPrivate || repo.IsUnlisted, + CreatedUnix: time.Now().Unix(), + }) + } + if err = newRepoAction(e, doer, repo); err != nil { + return errors.Newf("newRepoAction: %v", err) + } + + return repo.loadAttributes(e) +} + +type ErrReachLimitOfRepo struct { + Limit int +} + +func IsErrReachLimitOfRepo(err error) bool { + _, ok := err.(ErrReachLimitOfRepo) + return ok +} + +func (err ErrReachLimitOfRepo) Error() string { + return fmt.Sprintf("user has reached maximum limit of repositories [limit: %d]", err.Limit) +} + +// CreateRepository creates a repository for given user or organization. +func CreateRepository(doer, owner *User, opts CreateRepoOptionsLegacy) (_ *Repository, err error) { + repoPath := RepoPath(owner.Name, opts.Name) + if osx.Exist(repoPath) { + return nil, errors.Errorf("repository directory already exists: %s", repoPath) + } + if !owner.canCreateRepo() { + return nil, ErrReachLimitOfRepo{Limit: owner.maxNumRepos()} + } + + repo := &Repository{ + OwnerID: owner.ID, + Owner: owner, + Name: opts.Name, + LowerName: strings.ToLower(opts.Name), + Description: opts.Description, + IsPrivate: opts.IsPrivate, + IsUnlisted: opts.IsUnlisted, + EnableWiki: true, + EnableIssues: true, + EnablePulls: true, + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return nil, err + } + + if err = createRepository(sess, doer, owner, repo); err != nil { + return nil, err + } + + // No need for init mirror. + if !opts.IsMirror { + if err = initRepository(sess, repoPath, doer, repo, opts); err != nil { + RemoveAllWithNotice("Delete repository for initialization failure", repoPath) + return nil, errors.Newf("initRepository: %v", err) + } + + _, stderr, err := process.ExecDir(-1, + repoPath, fmt.Sprintf("CreateRepository 'git update-server-info': %s", repoPath), + "git", "update-server-info") + if err != nil { + return nil, errors.Newf("CreateRepository 'git update-server-info': %s", stderr) + } + } + if err = sess.Commit(); err != nil { + return nil, err + } + + // Remember visibility preference + err = Handle.Users().Update(context.TODO(), owner.ID, UpdateUserOptions{LastRepoVisibility: &repo.IsPrivate}) + if err != nil { + return nil, errors.Wrap(err, "update user") + } + + return repo, nil +} + +func countRepositories(userID int64, private bool) int64 { + sess := x.Where("id > 0") + + if userID > 0 { + sess.And("owner_id = ?", userID) + } + if !private { + sess.And("is_private=?", false) + } + + count, err := sess.Count(new(Repository)) + if err != nil { + log.Error("countRepositories: %v", err) + } + return count +} + +// CountRepositories returns number of repositories. +// Argument private only takes effect when it is false, +// set it true to count all repositories. +func CountRepositories(private bool) int64 { + return countRepositories(-1, private) +} + +// CountUserRepositories returns number of repositories user owns. +// Argument private only takes effect when it is false, +// set it true to count all repositories. +func CountUserRepositories(userID int64, private bool) int64 { + return countRepositories(userID, private) +} + +func Repositories(page, pageSize int) (_ []*Repository, err error) { + repos := make([]*Repository, 0, pageSize) + return repos, x.Limit(pageSize, (page-1)*pageSize).Asc("id").Find(&repos) +} + +// RepositoriesWithUsers returns number of repos in given page. +func RepositoriesWithUsers(page, pageSize int) (_ []*Repository, err error) { + repos, err := Repositories(page, pageSize) + if err != nil { + return nil, errors.Newf("Repositories: %v", err) + } + + for i := range repos { + if err = repos[i].GetOwner(); err != nil { + return nil, err + } + } + + return repos, nil +} + +// FilterRepositoryWithIssues selects repositories that are using internal issue tracker +// and has disabled external tracker from given set. +// It returns nil if result set is empty. +func FilterRepositoryWithIssues(repoIDs []int64) ([]int64, error) { + if len(repoIDs) == 0 { + return nil, nil + } + + repos := make([]*Repository, 0, len(repoIDs)) + if err := x.Where("enable_issues=?", true). + And("enable_external_tracker=?", false). + In("id", repoIDs). + Cols("id"). + Find(&repos); err != nil { + return nil, errors.Newf("filter valid repositories %v: %v", repoIDs, err) + } + + if len(repos) == 0 { + return nil, nil + } + + repoIDs = make([]int64, len(repos)) + for i := range repos { + repoIDs[i] = repos[i].ID + } + return repoIDs, nil +} + +// RepoPath returns repository path by given user and repository name. +// +// Deprecated: Use repox.RepositoryPath instead. +func RepoPath(userName, repoName string) string { + return filepath.Join(repox.UserPath(userName), strings.ToLower(repoName)+".git") +} + +// TransferOwnership transfers all corresponding setting from old user to new one. +func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error { + newOwner, err := Handle.Users().GetByUsername(context.TODO(), newOwnerName) + if err != nil { + return errors.Newf("get new owner '%s': %v", newOwnerName, err) + } + + // Check if new owner has repository with same name. + has, err := IsRepositoryExist(newOwner, repo.Name) + if err != nil { + return errors.Newf("IsRepositoryExist: %v", err) + } else if has { + return ErrRepoAlreadyExist{args: errx.Args{"ownerName": newOwnerName, "name": repo.Name}} + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return errors.Newf("sess.Begin: %v", err) + } + + owner := repo.Owner + + // Note: we have to set value here to make sure recalculate accesses is based on + // new owner. + repo.OwnerID = newOwner.ID + repo.Owner = newOwner + + // Update repository. + if _, err := sess.ID(repo.ID).Update(repo); err != nil { + return errors.Newf("update owner: %v", err) + } + + // Remove redundant collaborators. + collaborators, err := repo.getCollaborators(sess) + if err != nil { + return errors.Newf("getCollaborators: %v", err) + } + + // Dummy object. + collaboration := &Collaboration{RepoID: repo.ID} + for _, c := range collaborators { + collaboration.UserID = c.ID + if c.ID == newOwner.ID || newOwner.IsOrgMember(c.ID) { + if _, err = sess.Delete(collaboration); err != nil { + return errors.Newf("remove collaborator '%d': %v", c.ID, err) + } + } + } + + // Remove old team-repository relations. + if owner.IsOrganization() { + if err = owner.getTeams(sess); err != nil { + return errors.Newf("getTeams: %v", err) + } + for _, t := range owner.Teams { + if !t.hasRepository(sess, repo.ID) { + continue + } + + t.NumRepos-- + if _, err := sess.ID(t.ID).AllCols().Update(t); err != nil { + return errors.Newf("decrease team repository count '%d': %v", t.ID, err) + } + } + + if err = owner.removeOrgRepo(sess, repo.ID); err != nil { + return errors.Newf("removeOrgRepo: %v", err) + } + } + + if newOwner.IsOrganization() { + t, err := newOwner.getOwnerTeam(sess) + if err != nil { + return errors.Newf("getOwnerTeam: %v", err) + } else if err = t.addRepository(sess, repo); err != nil { + return errors.Newf("add to owner team: %v", err) + } + } else { + // Organization called this in addRepository method. + if err = repo.recalculateAccesses(sess); err != nil { + return errors.Newf("recalculateAccesses: %v", err) + } + } + + // Update repository count. + if _, err = sess.Exec("UPDATE `user` SET num_repos=num_repos+1 WHERE id=?", newOwner.ID); err != nil { + return errors.Newf("increase new owner repository count: %v", err) + } else if _, err = sess.Exec("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?", owner.ID); err != nil { + return errors.Newf("decrease old owner repository count: %v", err) + } + + // Remove watch for organization. + if owner.IsOrganization() { + if err = watchRepo(sess, owner.ID, repo.ID, false); err != nil { + return errors.Wrap(err, "unwatch repository for the organization owner") + } + } + + if err = watchRepo(sess, newOwner.ID, repo.ID, true); err != nil { + return errors.Newf("watchRepo: %v", err) + } + + // FIXME: This is identical to Actions.TransferRepo but we are not yet able to + // wrap transaction with different ORM objects, should delete this once migrated + // to GORM for this part of logic. + transferRepoAction := func(e Engine, doer, oldOwner *User, repo *Repository) error { + return notifyWatchers(e, &Action{ + ActUserID: doer.ID, + ActUserName: doer.Name, + OpType: ActionTransferRepo, + RepoID: repo.ID, + RepoUserName: repo.Owner.Name, + RepoName: repo.Name, + IsPrivate: repo.IsPrivate || repo.IsUnlisted, + Content: path.Join(oldOwner.Name, repo.Name), + CreatedUnix: time.Now().Unix(), + }) + } + if err = transferRepoAction(sess, doer, owner, repo); err != nil { + return errors.Newf("transferRepoAction: %v", err) + } + + // Rename remote repository to new path and delete local copy. + if err = os.MkdirAll(repox.UserPath(newOwner.Name), os.ModePerm); err != nil { + return err + } + if err = os.Rename(RepoPath(owner.Name, repo.Name), RepoPath(newOwner.Name, repo.Name)); err != nil { + return errors.Newf("rename repository directory: %v", err) + } + + deleteRepoLocalCopy(repo.ID) + + // Rename remote wiki repository to new path and delete local copy. + wikiPath := WikiPath(owner.Name, repo.Name) + if osx.Exist(wikiPath) { + RemoveAllWithNotice("Delete repository wiki local copy", repo.LocalWikiPath()) + if err = os.Rename(wikiPath, WikiPath(newOwner.Name, repo.Name)); err != nil { + return errors.Newf("rename repository wiki: %v", err) + } + } + + return sess.Commit() +} + +func deleteRepoLocalCopy(repoID int64) { + repoWorkingPool.CheckIn(strconv.FormatInt(repoID, 10)) + defer repoWorkingPool.CheckOut(strconv.FormatInt(repoID, 10)) + RemoveAllWithNotice(fmt.Sprintf("Delete repository %d local copy", repoID), repox.RepositoryLocalPath(repoID)) +} + +// ChangeRepositoryName changes all corresponding setting from old repository name to new one. +func ChangeRepositoryName(u *User, oldRepoName, newRepoName string) (err error) { + oldRepoName = strings.ToLower(oldRepoName) + newRepoName = strings.ToLower(newRepoName) + if err = isRepoNameAllowed(newRepoName); err != nil { + return err + } + + has, err := IsRepositoryExist(u, newRepoName) + if err != nil { + return errors.Newf("IsRepositoryExist: %v", err) + } else if has { + return ErrRepoAlreadyExist{args: errx.Args{"ownerID": u.ID, "name": newRepoName}} + } + + repo, err := GetRepositoryByName(u.ID, oldRepoName) + if err != nil { + return errors.Newf("GetRepositoryByName: %v", err) + } + + // Change repository directory name + if err = os.Rename(repo.RepoPath(), RepoPath(u.Name, newRepoName)); err != nil { + return errors.Newf("rename repository directory: %v", err) + } + + wikiPath := repo.WikiPath() + if osx.Exist(wikiPath) { + if err = os.Rename(wikiPath, WikiPath(u.Name, newRepoName)); err != nil { + return errors.Newf("rename repository wiki: %v", err) + } + RemoveAllWithNotice("Delete repository wiki local copy", repo.LocalWikiPath()) + } + + deleteRepoLocalCopy(repo.ID) + return nil +} + +func getRepositoriesByForkID(e Engine, forkID int64) ([]*Repository, error) { + repos := make([]*Repository, 0, 10) + return repos, e.Where("fork_id=?", forkID).Find(&repos) +} + +// GetRepositoriesByForkID returns all repositories with given fork ID. +func GetRepositoriesByForkID(forkID int64) ([]*Repository, error) { + return getRepositoriesByForkID(x, forkID) +} + +func getNonMirrorRepositories(e Engine) ([]*Repository, error) { + repos := make([]*Repository, 0, 10) + return repos, e.Where("is_mirror = ?", false).Find(&repos) +} + +// GetRepositoriesMirror returns only mirror repositories with user. +func GetNonMirrorRepositories() ([]*Repository, error) { + return getNonMirrorRepositories(x) +} + +func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err error) { + repo.LowerName = strings.ToLower(repo.Name) + + if len(repo.Description) > 512 { + repo.Description = repo.Description[:512] + } + if len(repo.Website) > 255 { + repo.Website = repo.Website[:255] + } + + if _, err = e.ID(repo.ID).AllCols().Update(repo); err != nil { + return errors.Newf("update: %v", err) + } + + if visibilityChanged { + if err = repo.getOwner(e); err != nil { + return errors.Newf("getOwner: %v", err) + } + if repo.Owner.IsOrganization() { + // Organization repository need to recalculate access table when visibility is changed + if err = repo.recalculateTeamAccesses(e, 0); err != nil { + return errors.Newf("recalculateTeamAccesses: %v", err) + } + } + + // Create/Remove git-daemon-export-ok for git-daemon + daemonExportFile := path.Join(repo.RepoPath(), "git-daemon-export-ok") + if repo.IsPrivate && osx.Exist(daemonExportFile) { + if err = os.Remove(daemonExportFile); err != nil { + log.Error("Failed to remove %s: %v", daemonExportFile, err) + } + } else if !repo.IsPrivate && !osx.Exist(daemonExportFile) { + if f, err := os.Create(daemonExportFile); err != nil { + log.Error("Failed to create %s: %v", daemonExportFile, err) + } else { + f.Close() + } + } + + forkRepos, err := getRepositoriesByForkID(e, repo.ID) + if err != nil { + return errors.Newf("getRepositoriesByForkID: %v", err) + } + for i := range forkRepos { + forkRepos[i].IsPrivate = repo.IsPrivate + forkRepos[i].IsUnlisted = repo.IsUnlisted + if err = updateRepository(e, forkRepos[i], true); err != nil { + return errors.Newf("updateRepository[%d]: %v", forkRepos[i].ID, err) + } + } + + // Change visibility of generated actions + if _, err = e.Where("repo_id = ?", repo.ID).Cols("is_private").Update(&Action{IsPrivate: repo.IsPrivate || repo.IsUnlisted}); err != nil { + return errors.Newf("change action visibility of repository: %v", err) + } + } + + return nil +} + +func UpdateRepository(repo *Repository, visibilityChanged bool) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = updateRepository(x, repo, visibilityChanged); err != nil { + return errors.Newf("updateRepository: %v", err) + } + + return sess.Commit() +} + +// DeleteRepository deletes a repository for a user or organization. +func DeleteRepository(ownerID, repoID int64) error { + repo := &Repository{ID: repoID, OwnerID: ownerID} + has, err := x.Get(repo) + if err != nil { + return err + } else if !has { + return ErrRepoNotExist{args: map[string]any{"ownerID": ownerID, "repoID": repoID}} + } + + // In case is a organization. + org, err := Handle.Users().GetByID(context.TODO(), ownerID) + if err != nil { + return err + } + if org.IsOrganization() { + if err = org.GetTeams(); err != nil { + return err + } + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if org.IsOrganization() { + for _, t := range org.Teams { + if !t.hasRepository(sess, repoID) { + continue + } else if err = t.removeRepository(sess, repo, false); err != nil { + return err + } + } + } + + if err = deleteBeans(sess, + &Repository{ID: repoID}, + &Access{RepoID: repo.ID}, + &Action{RepoID: repo.ID}, + &Watch{RepoID: repoID}, + &Star{RepoID: repoID}, + &Mirror{RepoID: repoID}, + &IssueUser{RepoID: repoID}, + &Milestone{RepoID: repoID}, + &Release{RepoID: repoID}, + &Collaboration{RepoID: repoID}, + &PullRequest{BaseRepoID: repoID}, + &ProtectBranch{RepoID: repoID}, + &ProtectBranchWhitelist{RepoID: repoID}, + &Webhook{RepoID: repoID}, + &HookTask{RepoID: repoID}, + &LFSObject{RepoID: repoID}, + ); err != nil { + return errors.Newf("deleteBeans: %v", err) + } + + // Delete comments and attachments. + issues := make([]*Issue, 0, 25) + attachmentPaths := make([]string, 0, len(issues)) + if err = sess.Where("repo_id=?", repoID).Find(&issues); err != nil { + return err + } + for i := range issues { + if _, err = sess.Delete(&Comment{IssueID: issues[i].ID}); err != nil { + return err + } + + attachments := make([]*Attachment, 0, 5) + if err = sess.Where("issue_id=?", issues[i].ID).Find(&attachments); err != nil { + return err + } + for j := range attachments { + attachmentPaths = append(attachmentPaths, attachments[j].LocalPath()) + } + + if _, err = sess.Delete(&Attachment{IssueID: issues[i].ID}); err != nil { + return err + } + } + + if _, err = sess.Delete(&Issue{RepoID: repoID}); err != nil { + return err + } + + if repo.IsFork { + if _, err = sess.Exec("UPDATE `repository` SET num_forks=num_forks-1 WHERE id=?", repo.ForkID); err != nil { + return errors.Newf("decrease fork count: %v", err) + } + } + + if _, err = sess.Exec("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?", ownerID); err != nil { + return err + } + + if err = sess.Commit(); err != nil { + return errors.Newf("commit: %v", err) + } + + // Remove repository files. + repoPath := repo.RepoPath() + RemoveAllWithNotice("Delete repository files", repoPath) + + repo.DeleteWiki() + + // Remove attachment files. + for i := range attachmentPaths { + RemoveAllWithNotice("Delete attachment", attachmentPaths[i]) + } + + if repo.NumForks > 0 { + if _, err = x.Exec("UPDATE `repository` SET fork_id=0,is_fork=? WHERE fork_id=?", false, repo.ID); err != nil { + log.Error("reset 'fork_id' and 'is_fork': %v", err) + } + } + + return nil +} + +// GetRepositoryByRef returns a Repository specified by a GFM reference. +// See https://help.github.com/articles/writing-on-github#references for more information on the syntax. +func GetRepositoryByRef(ref string) (*Repository, error) { + n := strings.IndexByte(ref, byte('/')) + if n < 2 { + return nil, InvalidRepoReference{Ref: ref} + } + + userName, repoName := ref[:n], ref[n+1:] + user, err := Handle.Users().GetByUsername(context.TODO(), userName) + if err != nil { + return nil, err + } + + return GetRepositoryByName(user.ID, repoName) +} + +// GetRepositoryByName returns the repository by given name under user if exists. +// Deprecated: Use Repos.GetByName instead. +func GetRepositoryByName(ownerID int64, name string) (*Repository, error) { + repo := &Repository{ + OwnerID: ownerID, + LowerName: strings.ToLower(name), + } + has, err := x.Get(repo) + if err != nil { + return nil, err + } else if !has { + return nil, ErrRepoNotExist{args: map[string]any{"ownerID": ownerID, "name": name}} + } + return repo, repo.LoadAttributes() +} + +func getRepositoryByID(e Engine, id int64) (*Repository, error) { + repo := new(Repository) + has, err := e.ID(id).Get(repo) + if err != nil { + return nil, err + } else if !has { + return nil, ErrRepoNotExist{args: map[string]any{"repoID": id}} + } + return repo, repo.loadAttributes(e) +} + +// GetRepositoryByID returns the repository by given id if exists. +func GetRepositoryByID(id int64) (*Repository, error) { + return getRepositoryByID(x, id) +} + +type UserRepoOptions struct { + UserID int64 + Private bool + Page int + PageSize int +} + +// GetUserRepositories returns a list of repositories of given user. +func GetUserRepositories(opts *UserRepoOptions) ([]*Repository, error) { + sess := x.Where("owner_id=?", opts.UserID).Desc("updated_unix") + if !opts.Private { + sess.And("is_private=?", false) + sess.And("is_unlisted=?", false) + } + + if opts.Page <= 0 { + opts.Page = 1 + } + sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) + + repos := make([]*Repository, 0, opts.PageSize) + return repos, sess.Find(&repos) +} + +// GetUserRepositories returns a list of mirror repositories of given user. +func GetUserMirrorRepositories(userID int64) ([]*Repository, error) { + repos := make([]*Repository, 0, 10) + return repos, x.Where("owner_id = ?", userID).And("is_mirror = ?", true).Find(&repos) +} + +// GetRecentUpdatedRepositories returns the list of repositories that are recently updated. +func GetRecentUpdatedRepositories(page, pageSize int) (repos []*Repository, err error) { + return repos, x.Limit(pageSize, (page-1)*pageSize). + Where("is_private=?", false).Limit(pageSize).Desc("updated_unix").Find(&repos) +} + +// GetUserAndCollaborativeRepositories returns list of repositories the user owns and collaborates. +func GetUserAndCollaborativeRepositories(userID int64) ([]*Repository, error) { + repos := make([]*Repository, 0, 10) + if err := x.Alias("repo"). + Join("INNER", "collaboration", "collaboration.repo_id = repo.id"). + Where("collaboration.user_id = ?", userID). + Find(&repos); err != nil { + return nil, errors.Newf("select collaborative repositories: %v", err) + } + + ownRepos := make([]*Repository, 0, 10) + if err := x.Where("owner_id = ?", userID).Find(&ownRepos); err != nil { + return nil, errors.Newf("select own repositories: %v", err) + } + + return append(repos, ownRepos...), nil +} + +type SearchRepoOptions struct { + Keyword string + OwnerID int64 + UserID int64 // When set results will contain all public/private repositories user has access to + OrderBy string + Private bool // Include private repositories in results + Page int + PageSize int // 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 []*Repository, count int64, err error) { + if opts.Page <= 0 { + opts.Page = 1 + } + + repos = make([]*Repository, 0, opts.PageSize) + sess := x.Alias("repo") + // Attempt to find repositories that opts.UserID has access to, + // this does not include other people's private repositories even if opts.UserID is an admin. + if !opts.Private && opts.UserID > 0 { + sess.Join("LEFT", "access", "access.repo_id = repo.id"). + Where("repo.owner_id = ? OR access.user_id = ? OR (repo.is_private = ? AND repo.is_unlisted = ?) OR (repo.is_private = ? AND (repo.allow_public_wiki = ? OR repo.allow_public_issues = ?))", opts.UserID, opts.UserID, false, false, true, true, true) + } else { + // Only return public repositories if opts.Private is not set + if !opts.Private { + sess.And("(repo.is_private = ? AND repo.is_unlisted = ?) OR (repo.is_private = ? AND (repo.allow_public_wiki = ? OR repo.allow_public_issues = ?))", false, false, true, true, true) + } + } + if len(opts.Keyword) > 0 { + sess.And("repo.lower_name LIKE ? OR repo.description LIKE ?", "%"+strings.ToLower(opts.Keyword)+"%", "%"+strings.ToLower(opts.Keyword)+"%") + } + if opts.OwnerID > 0 { + sess.And("repo.owner_id = ?", opts.OwnerID) + } + + // We need all fields (repo.*) in final list but only ID (repo.id) is good enough for counting. + count, err = sess.Clone().Distinct("repo.id").Count(new(Repository)) + if err != nil { + return nil, 0, errors.Newf("Count: %v", err) + } + + if len(opts.OrderBy) > 0 { + sess.OrderBy("repo." + opts.OrderBy) + } + return repos, count, sess.Distinct("repo.*").Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Find(&repos) +} + +func DeleteOldRepositoryArchives() { + if taskStatusTable.IsRunning(taskNameCleanOldArchives) { + return + } + taskStatusTable.Start(taskNameCleanOldArchives) + defer taskStatusTable.Stop(taskNameCleanOldArchives) + + log.Trace("Doing: DeleteOldRepositoryArchives") + + formats := []string{"zip", "targz"} + oldestTime := time.Now().Add(-conf.Cron.RepoArchiveCleanup.OlderThan) + if err := x.Where("id > 0").Iterate(new(Repository), + func(idx int, bean any) error { + repo := bean.(*Repository) + basePath := filepath.Join(repo.RepoPath(), "archives") + for _, format := range formats { + dirPath := filepath.Join(basePath, format) + if !osx.IsDir(dirPath) { + continue + } + + dir, err := os.Open(dirPath) + if err != nil { + log.Error("Failed to open directory '%s': %v", dirPath, err) + continue + } + + fis, err := dir.Readdir(0) + dir.Close() + if err != nil { + log.Error("Failed to read directory '%s': %v", dirPath, err) + continue + } + + for _, fi := range fis { + if fi.IsDir() || fi.ModTime().After(oldestTime) { + continue + } + + archivePath := filepath.Join(dirPath, fi.Name()) + if err = os.Remove(archivePath); err != nil { + const fmtStr = "Failed to health delete archive %q: %v" + log.Warn(fmtStr, archivePath, err) + if err = Handle.Notices().Create( + context.TODO(), + NoticeTypeRepository, + fmt.Sprintf(fmtStr, archivePath, err), + ); err != nil { + log.Error("CreateRepositoryNotice: %v", err) + } + } + } + } + + return nil + }); err != nil { + log.Error("DeleteOldRepositoryArchives: %v", err) + } +} + +// DeleteRepositoryArchives deletes all repositories' archives. +func DeleteRepositoryArchives() error { + if taskStatusTable.IsRunning(taskNameCleanOldArchives) { + return nil + } + taskStatusTable.Start(taskNameCleanOldArchives) + defer taskStatusTable.Stop(taskNameCleanOldArchives) + + return x.Where("id > 0").Iterate(new(Repository), + func(idx int, bean any) error { + repo := bean.(*Repository) + return os.RemoveAll(filepath.Join(repo.RepoPath(), "archives")) + }) +} + +func gatherMissingRepoRecords() ([]*Repository, error) { + repos := make([]*Repository, 0, 10) + if err := x.Where("id > 0").Iterate(new(Repository), + func(idx int, bean any) error { + repo := bean.(*Repository) + if !osx.IsDir(repo.RepoPath()) { + repos = append(repos, repo) + } + return nil + }); err != nil { + if err2 := Handle.Notices().Create(context.TODO(), NoticeTypeRepository, fmt.Sprintf("gatherMissingRepoRecords: %v", err)); err2 != nil { + return nil, errors.Newf("CreateRepositoryNotice: %v", err) + } + } + return repos, nil +} + +// DeleteMissingRepositories deletes all repository records that lost Git files. +func DeleteMissingRepositories() error { + repos, err := gatherMissingRepoRecords() + if err != nil { + return errors.Newf("gatherMissingRepoRecords: %v", err) + } + + if len(repos) == 0 { + return nil + } + + for _, repo := range repos { + log.Trace("Deleting %d/%d...", repo.OwnerID, repo.ID) + if err := DeleteRepository(repo.OwnerID, repo.ID); err != nil { + if err2 := Handle.Notices().Create(context.TODO(), NoticeTypeRepository, fmt.Sprintf("DeleteRepository [%d]: %v", repo.ID, err)); err2 != nil { + return errors.Newf("CreateRepositoryNotice: %v", err) + } + } + } + return nil +} + +// ReinitMissingRepositories reinitializes all repository records that lost Git files. +func ReinitMissingRepositories() error { + repos, err := gatherMissingRepoRecords() + if err != nil { + return errors.Newf("gatherMissingRepoRecords: %v", err) + } + + if len(repos) == 0 { + return nil + } + + for _, repo := range repos { + log.Trace("Initializing %d/%d...", repo.OwnerID, repo.ID) + if err := git.Init(repo.RepoPath(), git.InitOptions{Bare: true}); err != nil { + if err2 := Handle.Notices().Create(context.TODO(), NoticeTypeRepository, fmt.Sprintf("init repository [repo_id: %d]: %v", repo.ID, err)); err2 != nil { + return errors.Newf("create repository notice: %v", err) + } + } + } + return nil +} + +// SyncRepositoryHooks rewrites all repositories' pre-receive, update and post-receive hooks +// to make sure the binary and custom conf path are up-to-date. +func SyncRepositoryHooks() error { + return x.Where("id > 0").Iterate(new(Repository), + func(idx int, bean any) error { + repo := bean.(*Repository) + if err := createDelegateHooks(repo.RepoPath()); err != nil { + return err + } + + if repo.HasWiki() { + return createDelegateHooks(repo.WikiPath()) + } + return nil + }) +} + +// Prevent duplicate running tasks. +var taskStatusTable = sync.NewStatusTable() + +const ( + taskNameMirrorUpdate = "mirror_update" + taskNameGitFSCK = "git_fsck" + taskNameCheckRepoStats = "check_repos_stats" + taskNameCleanOldArchives = "clean_old_archives" +) + +// GitFsck calls 'git fsck' to check repository health. +func GitFsck() { + if taskStatusTable.IsRunning(taskNameGitFSCK) { + return + } + taskStatusTable.Start(taskNameGitFSCK) + defer taskStatusTable.Stop(taskNameGitFSCK) + + log.Trace("Doing: GitFsck") + + if err := x.Where("id>0").Iterate(new(Repository), + func(idx int, bean any) error { + repo := bean.(*Repository) + repoPath := repo.RepoPath() + err := git.Fsck(repoPath, git.FsckOptions{ + CommandOptions: git.CommandOptions{ + Args: conf.Cron.RepoHealthCheck.Args, + }, + Timeout: conf.Cron.RepoHealthCheck.Timeout, + }) + if err != nil { + const fmtStr = "Failed to perform health check on repository %q: %v" + log.Warn(fmtStr, repoPath, err) + if err = Handle.Notices().Create( + context.TODO(), + NoticeTypeRepository, + fmt.Sprintf(fmtStr, repoPath, err), + ); err != nil { + log.Error("CreateRepositoryNotice: %v", err) + } + } + return nil + }); err != nil { + log.Error("GitFsck: %v", err) + } +} + +func GitGcRepos() error { + args := append([]string{"gc"}, conf.Git.GCArgs...) + return x.Where("id > 0").Iterate(new(Repository), + func(idx int, bean any) error { + repo := bean.(*Repository) + if err := repo.GetOwner(); err != nil { + return err + } + _, stderr, err := process.ExecDir( + time.Duration(conf.Git.Timeout.GC)*time.Second, + RepoPath(repo.Owner.Name, repo.Name), "Repository garbage collection", + "git", args...) + if err != nil { + return errors.Newf("%v: %v", err, stderr) + } + return nil + }) +} + +type repoChecker struct { + querySQL, correctSQL string + desc string +} + +func repoStatsCheck(checker *repoChecker) { + results, err := x.Query(checker.querySQL) + if err != nil { + log.Error("Select %s: %v", checker.desc, err) + return + } + for _, result := range results { + id, _ := strconv.ParseInt(string(result["id"]), 10, 64) + log.Trace("Updating %s: %d", checker.desc, id) + _, err = x.Exec(checker.correctSQL, id, id) + if err != nil { + log.Error("Update %s[%d]: %v", checker.desc, id, err) + } + } +} + +func CheckRepoStats() { + if taskStatusTable.IsRunning(taskNameCheckRepoStats) { + return + } + taskStatusTable.Start(taskNameCheckRepoStats) + defer taskStatusTable.Stop(taskNameCheckRepoStats) + + log.Trace("Doing: CheckRepoStats") + + checkers := []*repoChecker{ + // Repository.NumWatches + { + "SELECT repo.id FROM `repository` repo WHERE repo.num_watches!=(SELECT COUNT(*) FROM `watch` WHERE repo_id=repo.id)", + "UPDATE `repository` SET num_watches=(SELECT COUNT(*) FROM `watch` WHERE repo_id=?) WHERE id=?", + "repository count 'num_watches'", + }, + // Repository.NumStars + { + "SELECT repo.id FROM `repository` repo WHERE repo.num_stars!=(SELECT COUNT(*) FROM `star` WHERE repo_id=repo.id)", + "UPDATE `repository` SET num_stars=(SELECT COUNT(*) FROM `star` WHERE repo_id=?) WHERE id=?", + "repository count 'num_stars'", + }, + // Label.NumIssues + { + "SELECT label.id FROM `label` WHERE label.num_issues!=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=label.id)", + "UPDATE `label` SET num_issues=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=?) WHERE id=?", + "label count 'num_issues'", + }, + // User.NumRepos + { + "SELECT `user`.id FROM `user` WHERE `user`.num_repos!=(SELECT COUNT(*) FROM `repository` WHERE owner_id=`user`.id)", + "UPDATE `user` SET num_repos=(SELECT COUNT(*) FROM `repository` WHERE owner_id=?) WHERE id=?", + "user count 'num_repos'", + }, + // Issue.NumComments + { + "SELECT `issue`.id FROM `issue` WHERE `issue`.num_comments!=(SELECT COUNT(*) FROM `comment` WHERE issue_id=`issue`.id AND type=0)", + "UPDATE `issue` SET num_comments=(SELECT COUNT(*) FROM `comment` WHERE issue_id=? AND type=0) WHERE id=?", + "issue count 'num_comments'", + }, + } + for i := range checkers { + repoStatsCheck(checkers[i]) + } + + // ***** START: Repository.NumClosedIssues ***** + desc := "repository count 'num_closed_issues'" + results, err := x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_closed_issues!=(SELECT COUNT(*) FROM `issue` WHERE repo_id=repo.id AND is_closed=? AND is_pull=?)", true, false) + if err != nil { + log.Error("Select %s: %v", desc, err) + } else { + for _, result := range results { + id, _ := strconv.ParseInt(string(result["id"]), 10, 64) + log.Trace("Updating %s: %d", desc, id) + _, err = x.Exec("UPDATE `repository` SET num_closed_issues=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_closed=? AND is_pull=?) WHERE id=?", id, true, false, id) + if err != nil { + log.Error("Update %s[%d]: %v", desc, id, err) + } + } + } + // ***** END: Repository.NumClosedIssues ***** + + // FIXME: use checker when stop supporting old fork repo format. + // ***** START: Repository.NumForks ***** + results, err = x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_forks!=(SELECT COUNT(*) FROM `repository` WHERE fork_id=repo.id)") + if err != nil { + log.Error("Select repository count 'num_forks': %v", err) + } else { + for _, result := range results { + id, _ := strconv.ParseInt(string(result["id"]), 10, 64) + log.Trace("Updating repository count 'num_forks': %d", id) + + repo, err := GetRepositoryByID(id) + if err != nil { + log.Error("GetRepositoryByID[%d]: %v", id, err) + continue + } + + rawResult, err := x.Query("SELECT COUNT(*) FROM `repository` WHERE fork_id=?", repo.ID) + if err != nil { + log.Error("Select count of forks[%d]: %v", repo.ID, err) + continue + } + repo.NumForks = int(parseCountResult(rawResult)) + + if err = UpdateRepository(repo, false); err != nil { + log.Error("UpdateRepository[%d]: %v", id, err) + continue + } + } + } + // ***** END: Repository.NumForks ***** +} + +type RepositoryList []*Repository + +func (repos RepositoryList) loadAttributes(e Engine) error { + if len(repos) == 0 { + return nil + } + + // Load owners + userSet := make(map[int64]*User) + for i := range repos { + userSet[repos[i].OwnerID] = nil + } + userIDs := make([]int64, 0, len(userSet)) + for userID := range userSet { + userIDs = append(userIDs, userID) + } + users := make([]*User, 0, len(userIDs)) + if err := e.Where("id > 0").In("id", userIDs).Find(&users); err != nil { + return errors.Newf("find users: %v", err) + } + for i := range users { + userSet[users[i].ID] = users[i] + } + for i := range repos { + repos[i].Owner = userSet[repos[i].OwnerID] + } + + // Load base repositories + repoSet := make(map[int64]*Repository) + for i := range repos { + if repos[i].IsFork { + repoSet[repos[i].ForkID] = nil + } + } + baseIDs := make([]int64, 0, len(repoSet)) + for baseID := range repoSet { + baseIDs = append(baseIDs, baseID) + } + baseRepos := make([]*Repository, 0, len(baseIDs)) + if err := e.Where("id > 0").In("id", baseIDs).Find(&baseRepos); err != nil { + return errors.Newf("find base repositories: %v", err) + } + for i := range baseRepos { + repoSet[baseRepos[i].ID] = baseRepos[i] + } + for i := range repos { + if repos[i].IsFork { + repos[i].BaseRepo = repoSet[repos[i].ForkID] + } + } + + return nil +} + +func (repos RepositoryList) LoadAttributes() error { + return repos.loadAttributes(x) +} + +type MirrorRepositoryList []*Repository + +func (repos MirrorRepositoryList) loadAttributes(e Engine) error { + if len(repos) == 0 { + return nil + } + + // Load mirrors. + repoIDs := make([]int64, 0, len(repos)) + for i := range repos { + if !repos[i].IsMirror { + continue + } + + repoIDs = append(repoIDs, repos[i].ID) + } + mirrors := make([]*Mirror, 0, len(repoIDs)) + if err := e.Where("id > 0").In("repo_id", repoIDs).Find(&mirrors); err != nil { + return errors.Newf("find mirrors: %v", err) + } + + set := make(map[int64]*Mirror) + for i := range mirrors { + set[mirrors[i].RepoID] = mirrors[i] + } + for i := range repos { + repos[i].Mirror = set[repos[i].ID] + } + return nil +} + +func (repos MirrorRepositoryList) LoadAttributes() error { + return repos.loadAttributes(x) +} + +// __ __ __ .__ +// / \ / \_____ _/ |_ ____ | |__ +// \ \/\/ /\__ \\ __\/ ___\| | \ +// \ / / __ \| | \ \___| Y \ +// \__/\ / (____ /__| \___ >___| / +// \/ \/ \/ \/ + +// Watch is connection request for receiving repository notification. +type Watch struct { + ID int64 `gorm:"primaryKey"` + UserID int64 `xorm:"UNIQUE(watch)" gorm:"uniqueIndex:watch_user_repo_unique;not null"` + RepoID int64 `xorm:"UNIQUE(watch)" gorm:"uniqueIndex:watch_user_repo_unique;not null"` +} + +func isWatching(e Engine, userID, repoID int64) bool { + has, _ := e.Get(&Watch{0, userID, repoID}) + return has +} + +// IsWatching checks if user has watched given repository. +func IsWatching(userID, repoID int64) bool { + return isWatching(x, userID, repoID) +} + +func watchRepo(e Engine, userID, repoID int64, watch bool) (err error) { + if watch { + if isWatching(e, userID, repoID) { + return nil + } + if _, err = e.Insert(&Watch{RepoID: repoID, UserID: userID}); err != nil { + return err + } + _, err = e.Exec("UPDATE `repository` SET num_watches = num_watches + 1 WHERE id = ?", repoID) + } else { + if !isWatching(e, userID, repoID) { + return nil + } + if _, err = e.Delete(&Watch{0, userID, repoID}); err != nil { + return err + } + _, err = e.Exec("UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?", repoID) + } + return err +} + +// Watch or unwatch repository. +// +// Deprecated: Use Watches.Watch instead. +func WatchRepo(userID, repoID int64, watch bool) (err error) { + return watchRepo(x, userID, repoID, watch) +} + +// Deprecated: Use Repos.ListByRepo instead. +func getWatchers(e Engine, repoID int64) ([]*Watch, error) { + watches := make([]*Watch, 0, 10) + return watches, e.Find(&watches, &Watch{RepoID: repoID}) +} + +// GetWatchers returns all watchers of given repository. +// +// Deprecated: Use Repos.ListByRepo instead. +func GetWatchers(repoID int64) ([]*Watch, error) { + return getWatchers(x, repoID) +} + +// Repository.GetWatchers returns range of users watching given repository. +func (r *Repository) GetWatchers(page int) ([]*User, error) { + users := make([]*User, 0, ItemsPerPage) + sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("watch.repo_id=?", r.ID) + if conf.UsePostgreSQL { + sess = sess.Join("LEFT", "watch", `"user".id=watch.user_id`) + } else { + sess = sess.Join("LEFT", "watch", "user.id=watch.user_id") + } + return users, sess.Find(&users) +} + +// Deprecated: Use Actions.notifyWatchers instead. +func notifyWatchers(e Engine, act *Action) error { + if act.CreatedUnix <= 0 { + act.CreatedUnix = time.Now().Unix() + } + + // Add feeds for user self and all watchers. + watchers, err := getWatchers(e, act.RepoID) + if err != nil { + return errors.Newf("getWatchers: %v", err) + } + + // Reset ID to reuse Action object + act.ID = 0 + + // Add feed for actioner. + act.UserID = act.ActUserID + if _, err = e.Insert(act); err != nil { + return errors.Newf("insert new action: %v", err) + } + + for i := range watchers { + if act.ActUserID == watchers[i].UserID { + continue + } + + act.ID = 0 + act.UserID = watchers[i].UserID + if _, err = e.Insert(act); err != nil { + return errors.Newf("insert new action: %v", err) + } + } + return nil +} + +// NotifyWatchers creates batch of actions for every watcher. +// +// Deprecated: Use Actions.notifyWatchers instead. +func NotifyWatchers(act *Action) error { + return notifyWatchers(x, act) +} + +// _________ __ +// / _____// |______ _______ +// \_____ \\ __\__ \\_ __ \ +// / \| | / __ \| | \/ +// /_______ /|__| (____ /__| +// \/ \/ + +type Star struct { + ID int64 `gorm:"primaryKey"` + UserID int64 `xorm:"uid UNIQUE(s)" gorm:"column:uid;uniqueIndex:star_user_repo_unique;not null"` + RepoID int64 `xorm:"UNIQUE(s)" gorm:"uniqueIndex:star_user_repo_unique;not null"` +} + +// Star or unstar repository. +// +// Deprecated: Use Stars.Star instead. +func StarRepo(userID, repoID int64, star bool) (err error) { + if star { + if IsStaring(userID, repoID) { + return nil + } + if _, err = x.Insert(&Star{UserID: userID, RepoID: repoID}); err != nil { + return err + } else if _, err = x.Exec("UPDATE `repository` SET num_stars = num_stars + 1 WHERE id = ?", repoID); err != nil { + return err + } + _, err = x.Exec("UPDATE `user` SET num_stars = num_stars + 1 WHERE id = ?", userID) + } else { + if !IsStaring(userID, repoID) { + return nil + } + if _, err = x.Delete(&Star{0, userID, repoID}); err != nil { + return err + } else if _, err = x.Exec("UPDATE `repository` SET num_stars = num_stars - 1 WHERE id = ?", repoID); err != nil { + return err + } + _, err = x.Exec("UPDATE `user` SET num_stars = num_stars - 1 WHERE id = ?", userID) + } + return err +} + +// IsStaring checks if user has starred given repository. +func IsStaring(userID, repoID int64) bool { + has, _ := x.Get(&Star{0, userID, repoID}) + return has +} + +func (r *Repository) GetStargazers(page int) ([]*User, error) { + users := make([]*User, 0, ItemsPerPage) + sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("star.repo_id=?", r.ID) + if conf.UsePostgreSQL { + sess = sess.Join("LEFT", "star", `"user".id=star.uid`) + } else { + sess = sess.Join("LEFT", "star", "user.id=star.uid") + } + return users, sess.Find(&users) +} + +// ___________ __ +// \_ _____/__________| | __ +// | __)/ _ \_ __ \ |/ / +// | \( <_> ) | \/ < +// \___ / \____/|__| |__|_ \ +// \/ \/ + +// HasForkedRepo checks if given user has already forked a repository. +// When user has already forked, it returns true along with the repository. +func HasForkedRepo(ownerID, repoID int64) (*Repository, bool, error) { + repo := new(Repository) + has, err := x.Where("owner_id = ? AND fork_id = ?", ownerID, repoID).Get(repo) + if err != nil { + return nil, false, err + } else if !has { + return nil, false, nil + } + return repo, true, repo.LoadAttributes() +} + +// ForkRepository creates a fork of target repository under another user domain. +func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string) (_ *Repository, err error) { + if !owner.canCreateRepo() { + return nil, ErrReachLimitOfRepo{Limit: owner.maxNumRepos()} + } + + repo := &Repository{ + OwnerID: owner.ID, + Owner: owner, + Name: name, + LowerName: strings.ToLower(name), + Description: desc, + DefaultBranch: baseRepo.DefaultBranch, + IsPrivate: baseRepo.IsPrivate, + IsUnlisted: baseRepo.IsUnlisted, + IsFork: true, + ForkID: baseRepo.ID, + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return nil, err + } + + if err = createRepository(sess, doer, owner, repo); err != nil { + return nil, err + } else if _, err = sess.Exec("UPDATE `repository` SET num_forks=num_forks+1 WHERE id=?", baseRepo.ID); err != nil { + return nil, err + } + + repoPath := repo.repoPath(sess) + RemoveAllWithNotice("Repository path erase before creation", repoPath) + + _, stderr, err := process.ExecTimeout(10*time.Minute, + fmt.Sprintf("ForkRepository 'git clone': %s/%s", owner.Name, repo.Name), + "git", "clone", "--bare", baseRepo.RepoPath(), repoPath) + if err != nil { + return nil, errors.Newf("git clone: %v - %s", err, stderr) + } + + _, stderr, err = process.ExecDir(-1, + repoPath, fmt.Sprintf("ForkRepository 'git update-server-info': %s", repoPath), + "git", "update-server-info") + if err != nil { + return nil, errors.Newf("git update-server-info: %v - %s", err, stderr) + } + + if err = createDelegateHooks(repoPath); err != nil { + return nil, errors.Newf("createDelegateHooks: %v", err) + } + + if err = sess.Commit(); err != nil { + return nil, errors.Newf("commit: %v", err) + } + + // Remember visibility preference + err = Handle.Users().Update(context.TODO(), owner.ID, UpdateUserOptions{LastRepoVisibility: &repo.IsPrivate}) + if err != nil { + return nil, errors.Wrap(err, "update user") + } + + if err = repo.UpdateSize(); err != nil { + log.Error("UpdateSize [repo_id: %d]: %v", repo.ID, err) + } + if err = PrepareWebhooks(baseRepo, HookEventTypeFork, &apiv1types.WebhookForkPayload{ + Forkee: repo.APIFormatLegacy(nil), + Repo: baseRepo.APIFormatLegacy(nil), + Sender: doer.APIFormat(), + }); err != nil { + log.Error("PrepareWebhooks [repo_id: %d]: %v", baseRepo.ID, err) + } + return repo, nil +} + +func (r *Repository) GetForks() ([]*Repository, error) { + forks := make([]*Repository, 0, r.NumForks) + if err := x.Find(&forks, &Repository{ForkID: r.ID}); err != nil { + return nil, err + } + + for _, fork := range forks { + fork.BaseRepo = r + } + return forks, nil +} + +// __________ .__ +// \______ \____________ ____ ____ | |__ +// | | _/\_ __ \__ \ / \_/ ___\| | \ +// | | \ | | \// __ \| | \ \___| Y \ +// |______ / |__| (____ /___| /\___ >___| / +// \/ \/ \/ \/ \/ +// + +func (r *Repository) CreateNewBranch(oldBranch, newBranch string) (err error) { + repoWorkingPool.CheckIn(strconv.FormatInt(r.ID, 10)) + defer repoWorkingPool.CheckOut(strconv.FormatInt(r.ID, 10)) + + localPath := r.LocalCopyPath() + + if err = discardLocalRepoBranchChanges(localPath, oldBranch); err != nil { + return errors.Newf("discard changes in local copy [path: %s, branch: %s]: %v", localPath, oldBranch, err) + } else if err = r.UpdateLocalCopyBranch(oldBranch); err != nil { + return errors.Newf("update branch for local copy [path: %s, branch: %s]: %v", localPath, oldBranch, err) + } + + if err = r.CheckoutNewBranch(oldBranch, newBranch); err != nil { + return errors.Newf("create new branch [base: %s, new: %s]: %v", oldBranch, newBranch, err) + } + + if err = git.Push(localPath, "origin", newBranch); err != nil { + return errors.Newf("push [branch: %s]: %v", newBranch, err) + } + + return nil +} + +// Deprecated: Use Perms.SetRepoPerms instead. +func (r *Repository) refreshAccesses(e Engine, accessMap map[int64]AccessMode) (err error) { + newAccesses := make([]Access, 0, len(accessMap)) + for userID, mode := range accessMap { + newAccesses = append(newAccesses, Access{ + UserID: userID, + RepoID: r.ID, + Mode: mode, + }) + } + + // Delete old accesses and insert new ones for repository. + if _, err = e.Delete(&Access{RepoID: r.ID}); err != nil { + return errors.Newf("delete old accesses: %v", err) + } else if _, err = e.Insert(newAccesses); err != nil { + return errors.Newf("insert new accesses: %v", err) + } + return nil +} + +// refreshCollaboratorAccesses retrieves repository collaborations with their access modes. +func (r *Repository) refreshCollaboratorAccesses(e Engine, accessMap map[int64]AccessMode) error { + collaborations, err := r.getCollaborations(e) + if err != nil { + return errors.Newf("getCollaborations: %v", err) + } + for _, c := range collaborations { + accessMap[c.UserID] = c.Mode + } + return nil +} + +// recalculateTeamAccesses recalculates new accesses for teams of an organization +// except the team whose ID is given. It is used to assign a team ID when +// remove repository from that team. +func (r *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err error) { + accessMap := make(map[int64]AccessMode, 20) + + if err = r.getOwner(e); err != nil { + return err + } else if !r.Owner.IsOrganization() { + return errors.Newf("owner is not an organization: %d", r.OwnerID) + } + + if err = r.refreshCollaboratorAccesses(e, accessMap); err != nil { + return errors.Newf("refreshCollaboratorAccesses: %v", err) + } + + if err = r.Owner.getTeams(e); err != nil { + return err + } + + maxAccessMode := func(modes ...AccessMode) AccessMode { + max := AccessModeNone + for _, mode := range modes { + if mode > max { + max = mode + } + } + return max + } + + for _, t := range r.Owner.Teams { + if t.ID == ignTeamID { + continue + } + + // Owner team gets owner access, and skip for teams that do not + // have relations with repository. + if t.IsOwnerTeam() { + t.Authorize = AccessModeOwner + } else if !t.hasRepository(e, r.ID) { + continue + } + + if err = t.getMembers(e); err != nil { + return errors.Newf("getMembers '%d': %v", t.ID, err) + } + for _, m := range t.Members { + accessMap[m.ID] = maxAccessMode(accessMap[m.ID], t.Authorize) + } + } + + return r.refreshAccesses(e, accessMap) +} + +func (r *Repository) recalculateAccesses(e Engine) error { + if r.Owner.IsOrganization() { + return r.recalculateTeamAccesses(e, 0) + } + + accessMap := make(map[int64]AccessMode, 10) + if err := r.refreshCollaboratorAccesses(e, accessMap); err != nil { + return errors.Newf("refreshCollaboratorAccesses: %v", err) + } + return r.refreshAccesses(e, accessMap) +} + +// RecalculateAccesses recalculates all accesses for repository. +func (r *Repository) RecalculateAccesses() error { + return r.recalculateAccesses(x) +} diff --git a/internal/database/repo_branch.go b/internal/database/repo_branch.go new file mode 100644 index 00000000000..3eefc0ae7c7 --- /dev/null +++ b/internal/database/repo_branch.go @@ -0,0 +1,276 @@ +package database + +import ( + "context" + "fmt" + "slices" + "strings" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/tool" +) + +type Branch struct { + RepoPath string + Name string + + IsProtected bool + Commit *git.Commit +} + +func GetBranchesByPath(path string) ([]*Branch, error) { + gitRepo, err := git.Open(path) + if err != nil { + return nil, errors.Newf("open repository: %v", err) + } + + names, err := gitRepo.Branches() + if err != nil { + return nil, errors.Newf("list branches") + } + + branches := make([]*Branch, len(names)) + for i := range names { + branches[i] = &Branch{ + RepoPath: path, + Name: names[i], + } + } + return branches, nil +} + +var _ errx.NotFound = (*ErrBranchNotExist)(nil) + +type ErrBranchNotExist struct { + args map[string]any +} + +func IsErrBranchNotExist(err error) bool { + _, ok := err.(ErrBranchNotExist) + return ok +} + +func (err ErrBranchNotExist) Error() string { + return fmt.Sprintf("branch does not exist: %v", err.args) +} + +func (ErrBranchNotExist) NotFound() bool { + return true +} + +func (r *Repository) GetBranch(name string) (*Branch, error) { + if !git.RepoHasBranch(r.RepoPath(), name) { + return nil, ErrBranchNotExist{args: map[string]any{"name": name}} + } + return &Branch{ + RepoPath: r.RepoPath(), + Name: name, + }, nil +} + +func (r *Repository) GetBranches() ([]*Branch, error) { + return GetBranchesByPath(r.RepoPath()) +} + +func (br *Branch) GetCommit() (*git.Commit, error) { + gitRepo, err := git.Open(br.RepoPath) + if err != nil { + return nil, errors.Newf("open repository: %v", err) + } + return gitRepo.BranchCommit(br.Name) +} + +type ProtectBranchWhitelist struct { + ID int64 + ProtectBranchID int64 + RepoID int64 `xorm:"UNIQUE(protect_branch_whitelist)"` + Name string `xorm:"UNIQUE(protect_branch_whitelist)"` + UserID int64 `xorm:"UNIQUE(protect_branch_whitelist)"` +} + +// IsUserInProtectBranchWhitelist returns true if given user is in the whitelist of a branch in a repository. +func IsUserInProtectBranchWhitelist(repoID, userID int64, branch string) bool { + has, err := x.Where("repo_id = ?", repoID).And("user_id = ?", userID).And("name = ?", branch).Get(new(ProtectBranchWhitelist)) + return has && err == nil +} + +// ProtectBranch contains options of a protected branch. +type ProtectBranch struct { + ID int64 + RepoID int64 `xorm:"UNIQUE(protect_branch)"` + Name string `xorm:"UNIQUE(protect_branch)"` + Protected bool + RequirePullRequest bool + EnableWhitelist bool + WhitelistUserIDs string `xorm:"TEXT"` + WhitelistTeamIDs string `xorm:"TEXT"` +} + +// GetProtectBranchOfRepoByName returns *ProtectBranch by branch name in given repository. +func GetProtectBranchOfRepoByName(repoID int64, name string) (*ProtectBranch, error) { + protectBranch := &ProtectBranch{ + RepoID: repoID, + Name: name, + } + has, err := x.Get(protectBranch) + if err != nil { + return nil, err + } else if !has { + return nil, ErrBranchNotExist{args: map[string]any{"name": name}} + } + return protectBranch, nil +} + +// IsBranchOfRepoRequirePullRequest returns true if branch requires pull request in given repository. +func IsBranchOfRepoRequirePullRequest(repoID int64, name string) bool { + protectBranch, err := GetProtectBranchOfRepoByName(repoID, name) + if err != nil { + return false + } + return protectBranch.Protected && protectBranch.RequirePullRequest +} + +// UpdateProtectBranch saves branch protection options. +// If ID is 0, it creates a new record. Otherwise, updates existing record. +func UpdateProtectBranch(protectBranch *ProtectBranch) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if protectBranch.ID == 0 { + if _, err = sess.Insert(protectBranch); err != nil { + return errors.Newf("insert: %v", err) + } + } + + if _, err = sess.ID(protectBranch.ID).AllCols().Update(protectBranch); err != nil { + return errors.Newf("update: %v", err) + } + + return sess.Commit() +} + +// UpdateOrgProtectBranch saves branch protection options of organizational repository. +// If ID is 0, it creates a new record. Otherwise, updates existing record. +// This function also performs check if whitelist user and team's IDs have been changed +// to avoid unnecessary whitelist delete and regenerate. +func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whitelistUserIDs, whitelistTeamIDs string) (err error) { + if err = repo.GetOwner(); err != nil { + return errors.Newf("GetOwner: %v", err) + } else if !repo.Owner.IsOrganization() { + return errors.Newf("expect repository owner to be an organization") + } + + hasUsersChanged := false + validUserIDs := tool.StringsToInt64s(strings.Split(protectBranch.WhitelistUserIDs, ",")) + if protectBranch.WhitelistUserIDs != whitelistUserIDs { + hasUsersChanged = true + userIDs := tool.StringsToInt64s(strings.Split(whitelistUserIDs, ",")) + validUserIDs = make([]int64, 0, len(userIDs)) + for _, userID := range userIDs { + if !Handle.Permissions().Authorize(context.TODO(), userID, repo.ID, AccessModeWrite, + AccessModeOptions{ + OwnerID: repo.OwnerID, + Private: repo.IsPrivate, + }, + ) { + continue // Drop invalid user ID + } + + validUserIDs = append(validUserIDs, userID) + } + + protectBranch.WhitelistUserIDs = strings.Join(tool.Int64sToStrings(validUserIDs), ",") + } + + hasTeamsChanged := false + validTeamIDs := tool.StringsToInt64s(strings.Split(protectBranch.WhitelistTeamIDs, ",")) + if protectBranch.WhitelistTeamIDs != whitelistTeamIDs { + hasTeamsChanged = true + teamIDs := tool.StringsToInt64s(strings.Split(whitelistTeamIDs, ",")) + teams, err := GetTeamsHaveAccessToRepo(repo.OwnerID, repo.ID, AccessModeWrite) + if err != nil { + return errors.Newf("GetTeamsHaveAccessToRepo [org_id: %d, repo_id: %d]: %v", repo.OwnerID, repo.ID, err) + } + validTeamIDs = make([]int64, 0, len(teams)) + for i := range teams { + if teams[i].HasWriteAccess() && slices.Contains(teamIDs, teams[i].ID) { + validTeamIDs = append(validTeamIDs, teams[i].ID) + } + } + + protectBranch.WhitelistTeamIDs = strings.Join(tool.Int64sToStrings(validTeamIDs), ",") + } + + // Make sure protectBranch.ID is not 0 for whitelists + if protectBranch.ID == 0 { + if _, err = x.Insert(protectBranch); err != nil { + return errors.Newf("insert: %v", err) + } + } + + // Merge users and members of teams + var whitelists []*ProtectBranchWhitelist + if hasUsersChanged || hasTeamsChanged { + mergedUserIDs := make(map[int64]bool) + for _, userID := range validUserIDs { + // Empty whitelist users can cause an ID with 0 + if userID != 0 { + mergedUserIDs[userID] = true + } + } + + for _, teamID := range validTeamIDs { + members, err := GetTeamMembers(teamID) + if err != nil { + return errors.Newf("GetTeamMembers [team_id: %d]: %v", teamID, err) + } + + for i := range members { + mergedUserIDs[members[i].ID] = true + } + } + + whitelists = make([]*ProtectBranchWhitelist, 0, len(mergedUserIDs)) + for userID := range mergedUserIDs { + whitelists = append(whitelists, &ProtectBranchWhitelist{ + ProtectBranchID: protectBranch.ID, + RepoID: repo.ID, + Name: protectBranch.Name, + UserID: userID, + }) + } + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.ID(protectBranch.ID).AllCols().Update(protectBranch); err != nil { + return errors.Newf("Update: %v", err) + } + + // Refresh whitelists + if hasUsersChanged || hasTeamsChanged { + if _, err = sess.Delete(&ProtectBranchWhitelist{ProtectBranchID: protectBranch.ID}); err != nil { + return errors.Newf("delete old protect branch whitelists: %v", err) + } else if _, err = sess.Insert(whitelists); err != nil { + return errors.Newf("insert new protect branch whitelists: %v", err) + } + } + + return sess.Commit() +} + +// GetProtectBranchesByRepoID returns a list of *ProtectBranch in given repository. +func GetProtectBranchesByRepoID(repoID int64) ([]*ProtectBranch, error) { + protectBranches := make([]*ProtectBranch, 0, 2) + return protectBranches, x.Where("repo_id = ? and protected = ?", repoID, true).Asc("name").Find(&protectBranches) +} diff --git a/internal/database/repo_collaboration.go b/internal/database/repo_collaboration.go new file mode 100644 index 00000000000..2bfc94a03eb --- /dev/null +++ b/internal/database/repo_collaboration.go @@ -0,0 +1,221 @@ +package database + +import ( + "github.com/cockroachdb/errors" + log "unknwon.dev/clog/v2" + + apiv1types "gogs.io/gogs/internal/route/api/v1/types" +) + +// Collaboration represent the relation between an individual and a repository. +type Collaboration struct { + ID int64 `gorm:"primary_key"` + UserID int64 `xorm:"UNIQUE(s) INDEX NOT NULL" gorm:"uniqueIndex:collaboration_user_repo_unique;index;not null"` + RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL" gorm:"uniqueIndex:collaboration_user_repo_unique;index;not null"` + Mode AccessMode `xorm:"DEFAULT 2 NOT NULL" gorm:"not null;default:2"` +} + +func (c *Collaboration) ModeI18nKey() string { + switch c.Mode { + case AccessModeRead: + return "repo.settings.collaboration.read" + case AccessModeWrite: + return "repo.settings.collaboration.write" + case AccessModeAdmin: + return "repo.settings.collaboration.admin" + default: + return "repo.settings.collaboration.undefined" + } +} + +// IsCollaborator returns true if the user is a collaborator of the repository. +func IsCollaborator(repoID, userID int64) bool { + collaboration := &Collaboration{ + RepoID: repoID, + UserID: userID, + } + has, err := x.Get(collaboration) + if err != nil { + log.Error("get collaboration [repo_id: %d, user_id: %d]: %v", repoID, userID, err) + return false + } + return has +} + +func (r *Repository) IsCollaborator(userID int64) bool { + return IsCollaborator(r.ID, userID) +} + +// AddCollaborator adds new collaboration to a repository with default access mode. +func (r *Repository) AddCollaborator(u *User) error { + collaboration := &Collaboration{ + RepoID: r.ID, + UserID: u.ID, + } + + has, err := x.Get(collaboration) + if err != nil { + return err + } else if has { + return nil + } + collaboration.Mode = AccessModeWrite + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Insert(collaboration); err != nil { + return err + } else if err = r.recalculateAccesses(sess); err != nil { + return errors.Newf("recalculateAccesses [repo_id: %v]: %v", r.ID, err) + } + + return sess.Commit() +} + +func (r *Repository) getCollaborations(e Engine) ([]*Collaboration, error) { + collaborations := make([]*Collaboration, 0) + return collaborations, e.Find(&collaborations, &Collaboration{RepoID: r.ID}) +} + +// Collaborator represents a user with collaboration details. +type Collaborator struct { + *User + Collaboration *Collaboration +} + +func (c *Collaborator) APIFormat() *apiv1types.RepositoryCollaborator { + return &apiv1types.RepositoryCollaborator{ + User: c.User.APIFormat(), + Permissions: apiv1types.RepositoryPermission{ + Admin: c.Collaboration.Mode >= AccessModeAdmin, + Push: c.Collaboration.Mode >= AccessModeWrite, + Pull: c.Collaboration.Mode >= AccessModeRead, + }, + } +} + +func (r *Repository) getCollaborators(e Engine) ([]*Collaborator, error) { + collaborations, err := r.getCollaborations(e) + if err != nil { + return nil, errors.Newf("getCollaborations: %v", err) + } + + collaborators := make([]*Collaborator, len(collaborations)) + for i, c := range collaborations { + user, err := getUserByID(e, c.UserID) + if err != nil { + return nil, err + } + collaborators[i] = &Collaborator{ + User: user, + Collaboration: c, + } + } + return collaborators, nil +} + +// GetCollaborators returns the collaborators for a repository +func (r *Repository) GetCollaborators() ([]*Collaborator, error) { + return r.getCollaborators(x) +} + +// ChangeCollaborationAccessMode sets new access mode for the collaboration. +func (r *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessMode) error { + // Discard invalid input + if mode <= AccessModeNone || mode > AccessModeOwner { + return nil + } + + collaboration := &Collaboration{ + RepoID: r.ID, + UserID: userID, + } + has, err := x.Get(collaboration) + if err != nil { + return errors.Newf("get collaboration: %v", err) + } else if !has { + return nil + } + + if collaboration.Mode == mode { + return nil + } + collaboration.Mode = mode + + // If it's an organizational repository, merge with team access level for highest permission + if r.Owner.IsOrganization() { + teams, err := GetUserTeams(r.OwnerID, userID) + if err != nil { + return errors.Newf("GetUserTeams: [org_id: %d, user_id: %d]: %v", r.OwnerID, userID, err) + } + for i := range teams { + if mode < teams[i].Authorize { + mode = teams[i].Authorize + } + } + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.ID(collaboration.ID).AllCols().Update(collaboration); err != nil { + return errors.Newf("update collaboration: %v", err) + } + + access := &Access{ + UserID: userID, + RepoID: r.ID, + } + has, err = sess.Get(access) + if err != nil { + return errors.Newf("get access record: %v", err) + } + if has { + _, err = sess.Exec("UPDATE access SET mode = ? WHERE user_id = ? AND repo_id = ?", mode, userID, r.ID) + } else { + access.Mode = mode + _, err = sess.Insert(access) + } + if err != nil { + return errors.Newf("update/insert access table: %v", err) + } + + return sess.Commit() +} + +// DeleteCollaboration removes collaboration relation between the user and repository. +func DeleteCollaboration(repo *Repository, userID int64) (err error) { + if !IsCollaborator(repo.ID, userID) { + return nil + } + + collaboration := &Collaboration{ + RepoID: repo.ID, + UserID: userID, + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if has, err := sess.Delete(collaboration); err != nil || has == 0 { + return err + } else if err = repo.recalculateAccesses(sess); err != nil { + return err + } + + return sess.Commit() +} + +func (r *Repository) DeleteCollaboration(userID int64) error { + return DeleteCollaboration(r, userID) +} diff --git a/internal/database/repo_editor.go b/internal/database/repo_editor.go new file mode 100644 index 00000000000..7a4c9e20218 --- /dev/null +++ b/internal/database/repo_editor.go @@ -0,0 +1,651 @@ +package database + +import ( + "fmt" + "io" + "mime/multipart" + "os" + "os/exec" + "path" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/cockroachdb/errors" + "github.com/google/uuid" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/cryptox" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/iox" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/pathx" + "gogs.io/gogs/internal/process" +) + +// BranchAlreadyExists represents an error when branch already exists. +type BranchAlreadyExists struct { + Name string +} + +// IsBranchAlreadyExists returns true if the error is BranchAlreadyExists. +func IsBranchAlreadyExists(err error) bool { + _, ok := err.(BranchAlreadyExists) + return ok +} + +func (err BranchAlreadyExists) Error() string { + return fmt.Sprintf("branch already exists [name: %s]", err.Name) +} + +const ( + EnvAuthUserID = "GOGS_AUTH_USER_ID" + EnvAuthUserName = "GOGS_AUTH_USER_NAME" + EnvAuthUserEmail = "GOGS_AUTH_USER_EMAIL" + EnvRepoOwnerName = "GOGS_REPO_OWNER_NAME" + EnvRepoOwnerSaltMd5 = "GOGS_REPO_OWNER_SALT_MD5" + EnvRepoID = "GOGS_REPO_ID" + EnvRepoName = "GOGS_REPO_NAME" + EnvRepoCustomHooksPath = "GOGS_REPO_CUSTOM_HOOKS_PATH" +) + +type ComposeHookEnvsOptions struct { + AuthUser *User + OwnerName string + OwnerSalt string + RepoID int64 + RepoName string + RepoPath string +} + +func ComposeHookEnvs(opts ComposeHookEnvsOptions) []string { + envs := []string{ + "SSH_ORIGINAL_COMMAND=1", + EnvAuthUserID + "=" + strconv.FormatInt(opts.AuthUser.ID, 10), + EnvAuthUserName + "=" + opts.AuthUser.Name, + EnvAuthUserEmail + "=" + opts.AuthUser.Email, + EnvRepoOwnerName + "=" + opts.OwnerName, + EnvRepoOwnerSaltMd5 + "=" + cryptox.MD5(opts.OwnerSalt), + EnvRepoID + "=" + strconv.FormatInt(opts.RepoID, 10), + EnvRepoName + "=" + opts.RepoName, + EnvRepoCustomHooksPath + "=" + filepath.Join(opts.RepoPath, "custom_hooks"), + } + return envs +} + +// ___________ .___.__ __ ___________.__.__ +// \_ _____/ __| _/|__|/ |_ \_ _____/|__| | ____ +// | __)_ / __ | | \ __\ | __) | | | _/ __ \ +// | \/ /_/ | | || | | \ | | |_\ ___/ +// /_______ /\____ | |__||__| \___ / |__|____/\___ > +// \/ \/ \/ \/ + +// discardLocalRepoBranchChanges discards local commits/changes of +// given branch to make sure it is even to remote branch. +func discardLocalRepoBranchChanges(localPath, branch string) error { + if !osx.Exist(localPath) { + return nil + } + + // No need to check if nothing in the repository. + if !git.RepoHasBranch(localPath, branch) { + return nil + } + + rev := "origin/" + branch + if err := git.Reset(localPath, rev, git.ResetOptions{Hard: true}); err != nil { + return errors.Newf("reset [revision: %s]: %v", rev, err) + } + return nil +} + +func (r *Repository) DiscardLocalRepoBranchChanges(branch string) error { + return discardLocalRepoBranchChanges(r.LocalCopyPath(), branch) +} + +// CheckoutNewBranch checks out to a new branch from the a branch name. +func (r *Repository) CheckoutNewBranch(oldBranch, newBranch string) error { + if err := git.Checkout(r.LocalCopyPath(), newBranch, git.CheckoutOptions{ + BaseBranch: oldBranch, + Timeout: time.Duration(conf.Git.Timeout.Pull) * time.Second, + }); err != nil { + return errors.Newf("checkout [base: %s, new: %s]: %v", oldBranch, newBranch, err) + } + return nil +} + +// hasSymlinkInPath returns true if there is any symlink in path hierarchy using +// the given base and relative path. +func hasSymlinkInPath(base, relPath string) bool { + parts := strings.Split(filepath.ToSlash(relPath), "/") + for i := range parts { + filePath := path.Join(append([]string{base}, parts[:i+1]...)...) + if osx.IsSymlink(filePath) { + return true + } + } + return false +} + +type UpdateRepoFileOptions struct { + OldBranch string + NewBranch string + OldTreeName string + NewTreeName string + Message string + Content string + IsNewFile bool +} + +// UpdateRepoFile adds or updates a file in repository. +func (r *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) error { + // 🚨 SECURITY: Prevent uploading files into the ".git" directory. + if isRepositoryGitPath(opts.NewTreeName) { + return errors.Errorf("bad tree path %q", opts.NewTreeName) + } + + repoWorkingPool.CheckIn(strconv.FormatInt(r.ID, 10)) + defer repoWorkingPool.CheckOut(strconv.FormatInt(r.ID, 10)) + + if err := r.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil { + return errors.Newf("discard local repo branch[%s] changes: %v", opts.OldBranch, err) + } else if err = r.UpdateLocalCopyBranch(opts.OldBranch); err != nil { + return errors.Newf("update local copy branch[%s]: %v", opts.OldBranch, err) + } + + localPath := r.LocalCopyPath() + + // 🚨 SECURITY: Prevent touching files in surprising places, reject operations + // that involve symlinks. + if hasSymlinkInPath(localPath, opts.OldTreeName) || hasSymlinkInPath(localPath, opts.NewTreeName) { + return errors.New("cannot update file with symbolic link in path") + } + + repoPath := r.RepoPath() + if opts.OldBranch != opts.NewBranch { + // Directly return error if new branch already exists in the server + if git.RepoHasBranch(repoPath, opts.NewBranch) { + return BranchAlreadyExists{Name: opts.NewBranch} + } + + // Otherwise, delete branch from local copy in case out of sync + if git.RepoHasBranch(localPath, opts.NewBranch) { + if err := git.DeleteBranch(localPath, opts.NewBranch, git.DeleteBranchOptions{ + Force: true, + }); err != nil { + return errors.Newf("delete branch %q: %v", opts.NewBranch, err) + } + } + + if err := r.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil { + return errors.Newf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err) + } + } + + oldFilePath := path.Join(localPath, opts.OldTreeName) + newFilePath := path.Join(localPath, opts.NewTreeName) + + // Prompt the user if the meant-to-be new file already exists. + if osx.Exist(newFilePath) && opts.IsNewFile { + return ErrRepoFileAlreadyExist{newFilePath} + } + + if err := os.MkdirAll(path.Dir(newFilePath), os.ModePerm); err != nil { + return errors.Wrapf(err, "create parent directories of %q", newFilePath) + } + + if osx.IsFile(oldFilePath) && opts.OldTreeName != opts.NewTreeName { + if err := git.Move(localPath, opts.OldTreeName, opts.NewTreeName); err != nil { + return errors.Wrapf(err, "git mv %q %q", opts.OldTreeName, opts.NewTreeName) + } + } + + if err := os.WriteFile(newFilePath, []byte(opts.Content), 0o600); err != nil { + return errors.Newf("write file: %v", err) + } + + if err := git.Add(localPath, git.AddOptions{All: true}); err != nil { + return errors.Newf("git add --all: %v", err) + } + err := git.CreateCommit( + localPath, + &git.Signature{ + Name: doer.DisplayName(), + Email: doer.Email, + When: time.Now(), + }, + opts.Message, + ) + if err != nil { + return errors.Newf("commit changes on %q: %v", localPath, err) + } + + err = git.Push(localPath, "origin", opts.NewBranch, + git.PushOptions{ + CommandOptions: git.CommandOptions{ + Envs: ComposeHookEnvs(ComposeHookEnvsOptions{ + AuthUser: doer, + OwnerName: r.MustOwner().Name, + OwnerSalt: r.MustOwner().Salt, + RepoID: r.ID, + RepoName: r.Name, + RepoPath: r.RepoPath(), + }), + }, + }, + ) + if err != nil { + return errors.Newf("git push origin %s: %v", opts.NewBranch, err) + } + return nil +} + +// GetDiffPreview produces and returns diff result of a file which is not yet committed. +func (r *Repository) GetDiffPreview(branch, treePath, content string) (*gitx.Diff, error) { + // 🚨 SECURITY: Prevent uploading files into the ".git" directory. + if isRepositoryGitPath(treePath) { + return nil, errors.Errorf("bad tree path %q", treePath) + } + + repoWorkingPool.CheckIn(strconv.FormatInt(r.ID, 10)) + defer repoWorkingPool.CheckOut(strconv.FormatInt(r.ID, 10)) + + if err := r.DiscardLocalRepoBranchChanges(branch); err != nil { + return nil, errors.Newf("discard local repo branch[%s] changes: %v", branch, err) + } else if err = r.UpdateLocalCopyBranch(branch); err != nil { + return nil, errors.Newf("update local copy branch[%s]: %v", branch, err) + } + + localPath := r.LocalCopyPath() + filePath := path.Join(localPath, treePath) + + // 🚨 SECURITY: Prevent touching files in surprising places, reject operations + // that involve symlinks. + if hasSymlinkInPath(localPath, treePath) { + return nil, errors.New("cannot update file with symbolic link in path") + } + + if err := os.MkdirAll(path.Dir(filePath), os.ModePerm); err != nil { + return nil, errors.Wrap(err, "create parent directories") + } else if err = os.WriteFile(filePath, []byte(content), 0o600); err != nil { + return nil, errors.Newf("write file: %v", err) + } + + // 🚨 SECURITY: Prevent including unintended options in the path to the Git command. + cmd := exec.Command("git", "diff", "--end-of-options", treePath) + cmd.Dir = localPath + cmd.Stderr = os.Stderr + + stdout, err := cmd.StdoutPipe() + if err != nil { + return nil, errors.Newf("get stdout pipe: %v", err) + } + + if err = cmd.Start(); err != nil { + return nil, errors.Newf("start: %v", err) + } + + pid := process.Add(fmt.Sprintf("GetDiffPreview [repo_path: %s]", r.RepoPath()), cmd) + defer process.Remove(pid) + + diff, err := gitx.ParseDiff(stdout, conf.Git.MaxDiffFiles, conf.Git.MaxDiffLines, conf.Git.MaxDiffLineChars) + if err != nil { + return nil, errors.Newf("parse diff: %v", err) + } + if err = cmd.Wait(); err != nil { + return nil, errors.Newf("wait: %v", err) + } + return diff, nil +} + +// ________ .__ __ ___________.__.__ +// \______ \ ____ | | _____/ |_ ____ \_ _____/|__| | ____ +// | | \_/ __ \| | _/ __ \ __\/ __ \ | __) | | | _/ __ \ +// | ` \ ___/| |_\ ___/| | \ ___/ | \ | | |_\ ___/ +// /_______ /\___ >____/\___ >__| \___ > \___ / |__|____/\___ > +// \/ \/ \/ \/ \/ \/ +// + +type DeleteRepoFileOptions struct { + LastCommitID string + OldBranch string + NewBranch string + TreePath string + Message string +} + +func (r *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (err error) { + // 🚨 SECURITY: Prevent uploading files into the ".git" directory. + if isRepositoryGitPath(opts.TreePath) { + return errors.Errorf("bad tree path %q", opts.TreePath) + } + + repoWorkingPool.CheckIn(strconv.FormatInt(r.ID, 10)) + defer repoWorkingPool.CheckOut(strconv.FormatInt(r.ID, 10)) + + if err = r.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil { + return errors.Newf("discard local r branch[%s] changes: %v", opts.OldBranch, err) + } else if err = r.UpdateLocalCopyBranch(opts.OldBranch); err != nil { + return errors.Newf("update local copy branch[%s]: %v", opts.OldBranch, err) + } + + localPath := r.LocalCopyPath() + + // 🚨 SECURITY: Prevent touching files in surprising places, reject operations + // that involve symlinks. + if hasSymlinkInPath(localPath, opts.TreePath) { + return errors.New("cannot update file with symbolic link in path") + } + + if opts.OldBranch != opts.NewBranch { + if err := r.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil { + return errors.Newf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err) + } + } + + filePath := path.Join(localPath, opts.TreePath) + if err = os.Remove(filePath); err != nil { + return errors.Newf("remove file %q: %v", opts.TreePath, err) + } + + if err = git.Add(localPath, git.AddOptions{All: true}); err != nil { + return errors.Newf("git add --all: %v", err) + } + + err = git.CreateCommit( + localPath, + &git.Signature{ + Name: doer.DisplayName(), + Email: doer.Email, + When: time.Now(), + }, + opts.Message, + ) + if err != nil { + return errors.Newf("commit changes to %q: %v", localPath, err) + } + + err = git.Push(localPath, "origin", opts.NewBranch, + git.PushOptions{ + CommandOptions: git.CommandOptions{ + Envs: ComposeHookEnvs(ComposeHookEnvsOptions{ + AuthUser: doer, + OwnerName: r.MustOwner().Name, + OwnerSalt: r.MustOwner().Salt, + RepoID: r.ID, + RepoName: r.Name, + RepoPath: r.RepoPath(), + }), + }, + }, + ) + if err != nil { + return errors.Newf("git push origin %s: %v", opts.NewBranch, err) + } + return nil +} + +// ____ ___ .__ .___ ___________.___.__ +// | | \______ | | _________ __| _/ \_ _____/| | | ____ ______ +// | | /\____ \| | / _ \__ \ / __ | | __) | | | _/ __ \ / ___/ +// | | / | |_> > |_( <_> ) __ \_/ /_/ | | \ | | |_\ ___/ \___ \ +// |______/ | __/|____/\____(____ /\____ | \___ / |___|____/\___ >____ > +// |__| \/ \/ \/ \/ \/ +// + +// Upload represent a uploaded file to a repo to be deleted when moved +type Upload struct { + ID int64 + UUID string `xorm:"uuid UNIQUE"` + Name string +} + +// UploadLocalPath returns where uploads is stored in local file system based on given UUID. +func UploadLocalPath(uuid string) string { + return path.Join(conf.Repository.Upload.TempPath, uuid[0:1], uuid[1:2], uuid) +} + +// LocalPath returns where uploads are temporarily stored in local file system. +func (upload *Upload) LocalPath() string { + return UploadLocalPath(upload.UUID) +} + +// NewUpload creates a new upload object. +func NewUpload(name string, buf []byte, file multipart.File) (_ *Upload, err error) { + // 🚨 SECURITY: Prevent path traversal. + name = pathx.Clean(name) + if name == "" { + return nil, errors.New("empty file name") + } + + upload := &Upload{ + UUID: uuid.New().String(), + Name: name, + } + + localPath := upload.LocalPath() + if err = os.MkdirAll(path.Dir(localPath), os.ModePerm); err != nil { + return nil, errors.Newf("mkdir all: %v", err) + } + + fw, err := os.Create(localPath) + if err != nil { + return nil, errors.Newf("create: %v", err) + } + defer func() { _ = fw.Close() }() + + if _, err = fw.Write(buf); err != nil { + return nil, errors.Newf("write: %v", err) + } else if _, err = io.Copy(fw, file); err != nil { + return nil, errors.Newf("copy: %v", err) + } + + if _, err := x.Insert(upload); err != nil { + return nil, err + } + + return upload, nil +} + +func GetUploadByUUID(uuid string) (*Upload, error) { + upload := &Upload{UUID: uuid} + has, err := x.Get(upload) + if err != nil { + return nil, err + } else if !has { + return nil, ErrUploadNotExist{0, uuid} + } + return upload, nil +} + +func GetUploadsByUUIDs(uuids []string) ([]*Upload, error) { + if len(uuids) == 0 { + return []*Upload{}, nil + } + + // Silently drop invalid uuids. + uploads := make([]*Upload, 0, len(uuids)) + return uploads, x.In("uuid", uuids).Find(&uploads) +} + +func DeleteUploads(uploads ...*Upload) (err error) { + if len(uploads) == 0 { + return nil + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + ids := make([]int64, len(uploads)) + for i := range uploads { + ids[i] = uploads[i].ID + } + if _, err = sess.In("id", ids).Delete(new(Upload)); err != nil { + return errors.Newf("delete uploads: %v", err) + } + + for _, upload := range uploads { + localPath := upload.LocalPath() + if !osx.IsFile(localPath) { + continue + } + + if err := os.Remove(localPath); err != nil { + return errors.Newf("remove upload: %v", err) + } + } + + return sess.Commit() +} + +func DeleteUpload(u *Upload) error { + return DeleteUploads(u) +} + +func DeleteUploadByUUID(uuid string) error { + upload, err := GetUploadByUUID(uuid) + if err != nil { + if IsErrUploadNotExist(err) { + return nil + } + return errors.Newf("get upload by UUID[%s]: %v", uuid, err) + } + + if err := DeleteUpload(upload); err != nil { + return errors.Newf("delete upload: %v", err) + } + + return nil +} + +type UploadRepoFileOptions struct { + LastCommitID string + OldBranch string + NewBranch string + TreePath string + Message string + Files []string // In UUID format +} + +// isRepositoryGitPath returns true if given path is or resides inside ".git" +// path of the repository. +// +// TODO(unknwon): Move to repox during refactoring for this file. +func isRepositoryGitPath(path string) bool { + path = strings.ToLower(path) + return strings.HasSuffix(path, ".git") || + strings.Contains(path, ".git/") || + strings.Contains(path, `.git\`) || + // Windows treats ".git." the same as ".git" + strings.HasSuffix(path, ".git.") || + strings.Contains(path, ".git./") || + strings.Contains(path, `.git.\`) +} + +func (r *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) error { + if len(opts.Files) == 0 { + return nil + } + + // 🚨 SECURITY: Prevent uploading files into the ".git" directory. + if isRepositoryGitPath(opts.TreePath) { + return errors.Errorf("bad tree path %q", opts.TreePath) + } + + uploads, err := GetUploadsByUUIDs(opts.Files) + if err != nil { + return errors.Newf("get uploads by UUIDs[%v]: %v", opts.Files, err) + } + + repoWorkingPool.CheckIn(strconv.FormatInt(r.ID, 10)) + defer repoWorkingPool.CheckOut(strconv.FormatInt(r.ID, 10)) + + if err = r.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil { + return errors.Newf("discard local r branch[%s] changes: %v", opts.OldBranch, err) + } else if err = r.UpdateLocalCopyBranch(opts.OldBranch); err != nil { + return errors.Newf("update local copy branch[%s]: %v", opts.OldBranch, err) + } + + if opts.OldBranch != opts.NewBranch { + if err = r.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil { + return errors.Newf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err) + } + } + + localPath := r.LocalCopyPath() + dirPath := path.Join(localPath, opts.TreePath) + if err = os.MkdirAll(dirPath, os.ModePerm); err != nil { + return err + } + + // Copy uploaded files into repository + for _, upload := range uploads { + tmpPath := upload.LocalPath() + if !osx.IsFile(tmpPath) { + continue + } + + // 🚨 SECURITY: Prevent path traversal. + upload.Name = pathx.Clean(upload.Name) + + // 🚨 SECURITY: Prevent uploading files into the ".git" directory. + if isRepositoryGitPath(upload.Name) { + continue + } + + targetPath := path.Join(dirPath, upload.Name) + + // 🚨 SECURITY: Prevent updating files in surprising place, check if the target + // is a symlink. + if osx.IsSymlink(targetPath) { + return errors.Newf("cannot overwrite symbolic link: %s", upload.Name) + } + + if err = iox.CopyFile(tmpPath, targetPath); err != nil { + return errors.Newf("copy: %v", err) + } + } + + if err = git.Add(localPath, git.AddOptions{All: true}); err != nil { + return errors.Newf("git add --all: %v", err) + } + + err = git.CreateCommit( + localPath, + &git.Signature{ + Name: doer.DisplayName(), + Email: doer.Email, + When: time.Now(), + }, + opts.Message, + ) + if err != nil { + return errors.Newf("commit changes on %q: %v", localPath, err) + } + + err = git.Push(localPath, "origin", opts.NewBranch, + git.PushOptions{ + CommandOptions: git.CommandOptions{ + Envs: ComposeHookEnvs(ComposeHookEnvsOptions{ + AuthUser: doer, + OwnerName: r.MustOwner().Name, + OwnerSalt: r.MustOwner().Salt, + RepoID: r.ID, + RepoName: r.Name, + RepoPath: r.RepoPath(), + }), + }, + }, + ) + if err != nil { + return errors.Newf("git push origin %s: %v", opts.NewBranch, err) + } + + return DeleteUploads(uploads...) +} diff --git a/internal/database/repo_editor_test.go b/internal/database/repo_editor_test.go new file mode 100644 index 00000000000..1cee1d10a9e --- /dev/null +++ b/internal/database/repo_editor_test.go @@ -0,0 +1,55 @@ +package database + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsRepositoryGitPath(t *testing.T) { + tests := []struct { + path string + wantVal bool + }{ + {path: ".git", wantVal: true}, + {path: "./.git", wantVal: true}, + {path: ".git/hooks/pre-commit", wantVal: true}, + {path: ".git/hooks", wantVal: true}, + {path: "dir/.git", wantVal: true}, + + // Case-insensitive file system + {path: ".Git", wantVal: true}, + {path: "./.Git", wantVal: true}, + {path: ".Git/hooks/pre-commit", wantVal: true}, + {path: ".Git/hooks", wantVal: true}, + {path: "dir/.Git", wantVal: true}, + + {path: ".gitignore", wantVal: false}, + {path: "dir/.gitkeep", wantVal: false}, + + // Windows-specific + {path: `.git\`, wantVal: true}, + {path: `.git\hooks\pre-commit`, wantVal: true}, + {path: `.git\hooks`, wantVal: true}, + {path: `dir\.git`, wantVal: true}, + + {path: `.\.git.`, wantVal: true}, + {path: `.\.git.\`, wantVal: true}, + {path: `.git.\hooks\pre-commit`, wantVal: true}, + {path: `.git.\hooks`, wantVal: true}, + {path: `dir\.git.`, wantVal: true}, + + {path: "./.git.", wantVal: true}, + {path: "./.git./", wantVal: true}, + {path: ".git./hooks/pre-commit", wantVal: true}, + {path: ".git./hooks", wantVal: true}, + {path: "dir/.git.", wantVal: true}, + + {path: `dir\.gitkeep`, wantVal: false}, + } + for _, test := range tests { + t.Run(test.path, func(t *testing.T) { + assert.Equal(t, test.wantVal, isRepositoryGitPath(test.path)) + }) + } +} diff --git a/internal/database/repo_tag.go b/internal/database/repo_tag.go new file mode 100644 index 00000000000..6c4cb385ef9 --- /dev/null +++ b/internal/database/repo_tag.go @@ -0,0 +1,47 @@ +package database + +import ( + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" +) + +type Tag struct { + RepoPath string + Name string + + IsProtected bool + Commit *git.Commit +} + +func (ta *Tag) GetCommit() (*git.Commit, error) { + gitRepo, err := git.Open(ta.RepoPath) + if err != nil { + return nil, errors.Newf("open repository: %v", err) + } + return gitRepo.TagCommit(ta.Name) +} + +func GetTagsByPath(path string) ([]*Tag, error) { + gitRepo, err := git.Open(path) + if err != nil { + return nil, errors.Newf("open repository: %v", err) + } + + names, err := gitRepo.Tags() + if err != nil { + return nil, errors.Newf("list tags: %v", err) + } + + tags := make([]*Tag, len(names)) + for i := range names { + tags[i] = &Tag{ + RepoPath: path, + Name: names[i], + } + } + return tags, nil +} + +func (r *Repository) GetTags() ([]*Tag, error) { + return GetTagsByPath(r.RepoPath()) +} diff --git a/internal/database/repo_test.go b/internal/database/repo_test.go new file mode 100644 index 00000000000..f98f01f8c43 --- /dev/null +++ b/internal/database/repo_test.go @@ -0,0 +1,85 @@ +package database + +import ( + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/osx" +) + +func TestRepository_ComposeMetas(t *testing.T) { + repo := &Repository{ + Name: "testrepo", + Owner: &User{ + Name: "testuser", + }, + ExternalTrackerFormat: "https://someurl.com/{user}/{repo}/{issue}", + } + + t.Run("no external tracker is configured", func(t *testing.T) { + repo.EnableExternalTracker = false + + metas := repo.ComposeMetas() + assert.Equal(t, metas["repoLink"], repo.Link()) + + // Should not have format and style if no external tracker is configured + _, ok := metas["format"] + assert.False(t, ok) + _, ok = metas["style"] + assert.False(t, ok) + }) + + t.Run("an external issue tracker is configured", func(t *testing.T) { + repo.ExternalMetas = nil + repo.EnableExternalTracker = true + + // Default to numeric issue style + assert.Equal(t, markup.IssueNameStyleNumeric, repo.ComposeMetas()["style"]) + repo.ExternalMetas = nil + + repo.ExternalTrackerStyle = markup.IssueNameStyleNumeric + assert.Equal(t, markup.IssueNameStyleNumeric, repo.ComposeMetas()["style"]) + repo.ExternalMetas = nil + + repo.ExternalTrackerStyle = markup.IssueNameStyleAlphanumeric + assert.Equal(t, markup.IssueNameStyleAlphanumeric, repo.ComposeMetas()["style"]) + repo.ExternalMetas = nil + + metas := repo.ComposeMetas() + assert.Equal(t, "testuser", metas["user"]) + assert.Equal(t, "testrepo", metas["repo"]) + assert.Equal(t, "https://someurl.com/{user}/{repo}/{issue}", metas["format"]) + }) +} + +func Test_CreateRepository_PreventDeletion(t *testing.T) { + tempRepositoryRoot := filepath.Join(os.TempDir(), "createRepository-tempRepositoryRoot") + conf.SetMockRepository( + t, + conf.RepositoryOpts{ + Root: tempRepositoryRoot, + }, + ) + err := os.RemoveAll(tempRepositoryRoot) + require.NoError(t, err) + defer func() { _ = os.RemoveAll(tempRepositoryRoot) }() + + owner := &User{Name: "testuser"} + opts := CreateRepoOptionsLegacy{Name: "safety-test"} + repoPath := RepoPath(owner.Name, opts.Name) + require.NoError(t, os.MkdirAll(repoPath, os.ModePerm)) + + canary := filepath.Join(repoPath, "canary.txt") + require.NoError(t, os.WriteFile(canary, []byte("should survive"), 0o644)) + + _, err = CreateRepository(owner, owner, opts) + require.Error(t, err) + assert.Contains(t, err.Error(), "repository directory already exists") + assert.True(t, osx.Exist(canary)) +} diff --git a/internal/database/repositories.go b/internal/database/repositories.go new file mode 100644 index 00000000000..37deb0e3592 --- /dev/null +++ b/internal/database/repositories.go @@ -0,0 +1,401 @@ +package database + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/repox" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" +) + +// BeforeCreate implements the GORM create hook. +func (r *Repository) BeforeCreate(tx *gorm.DB) error { + if r.CreatedUnix == 0 { + r.CreatedUnix = tx.NowFunc().Unix() + } + return nil +} + +// BeforeUpdate implements the GORM update hook. +func (r *Repository) BeforeUpdate(tx *gorm.DB) error { + r.UpdatedUnix = tx.NowFunc().Unix() + return nil +} + +// AfterFind implements the GORM query hook. +func (r *Repository) AfterFind(_ *gorm.DB) error { + r.Created = time.Unix(r.CreatedUnix, 0).Local() + r.Updated = time.Unix(r.UpdatedUnix, 0).Local() + return nil +} + +type RepositoryAPIFormatOptions struct { + Permission *apiv1types.RepositoryPermission + Parent *apiv1types.Repository +} + +// APIFormat returns the API format of a repository. +func (r *Repository) APIFormat(owner *User, opts ...RepositoryAPIFormatOptions) *apiv1types.Repository { + var opt RepositoryAPIFormatOptions + if len(opts) > 0 { + opt = opts[0] + } + + cloneLink := repox.NewCloneLink(owner.Name, r.Name, false) + return &apiv1types.Repository{ + ID: r.ID, + Owner: owner.APIFormat(), + Name: r.Name, + FullName: owner.Name + "/" + r.Name, + Description: r.Description, + Private: r.IsPrivate, + Fork: r.IsFork, + Parent: opt.Parent, + Empty: r.IsBare, + Mirror: r.IsMirror, + Size: r.Size, + HTMLURL: repox.HTMLURL(owner.Name, r.Name), + SSHURL: cloneLink.SSH, + CloneURL: cloneLink.HTTPS, + Website: r.Website, + Stars: r.NumStars, + Forks: r.NumForks, + Watchers: r.NumWatches, + OpenIssues: r.NumOpenIssues, + DefaultBranch: r.DefaultBranch, + Created: r.Created, + Updated: r.Updated, + Permissions: opt.Permission, + } +} + +// RepositoriesStore is the storage layer for repositories. +type RepositoriesStore struct { + db *gorm.DB +} + +func newReposStore(db *gorm.DB) *RepositoriesStore { + return &RepositoriesStore{db: db} +} + +type ErrRepoAlreadyExist struct { + args errx.Args +} + +func IsErrRepoAlreadyExist(err error) bool { + _, ok := err.(ErrRepoAlreadyExist) + return ok +} + +func (err ErrRepoAlreadyExist) Error() string { + return fmt.Sprintf("repository already exists: %v", err.args) +} + +type CreateRepoOptions struct { + Name string + Description string + DefaultBranch string + Private bool + Mirror bool + EnableWiki bool + EnableIssues bool + EnablePulls bool + Fork bool + ForkID int64 +} + +// Create creates a new repository record in the database. It returns +// ErrNameNotAllowed when the repository name is not allowed, or +// ErrRepoAlreadyExist when a repository with same name already exists for the +// owner. +func (s *RepositoriesStore) Create(ctx context.Context, ownerID int64, opts CreateRepoOptions) (*Repository, error) { + err := isRepoNameAllowed(opts.Name) + if err != nil { + return nil, err + } + + _, err = s.GetByName(ctx, ownerID, opts.Name) + if err == nil { + return nil, ErrRepoAlreadyExist{ + args: errx.Args{ + "ownerID": ownerID, + "name": opts.Name, + }, + } + } else if !IsErrRepoNotExist(err) { + return nil, err + } + + repo := &Repository{ + OwnerID: ownerID, + LowerName: strings.ToLower(opts.Name), + Name: opts.Name, + Description: opts.Description, + DefaultBranch: opts.DefaultBranch, + IsPrivate: opts.Private, + IsMirror: opts.Mirror, + EnableWiki: opts.EnableWiki, + EnableIssues: opts.EnableIssues, + EnablePulls: opts.EnablePulls, + IsFork: opts.Fork, + ForkID: opts.ForkID, + } + return repo, s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + err = tx.Create(repo).Error + if err != nil { + return errors.Wrap(err, "create") + } + + err = newReposStore(tx).Watch(ctx, ownerID, repo.ID) + if err != nil { + return errors.Wrap(err, "watch") + } + return nil + }) +} + +// GetByCollaboratorID returns a list of repositories that the given +// collaborator has access to. Results are limited to the given limit and sorted +// by the given order (e.g. "updated_unix DESC"). Repositories that are owned +// directly by the given collaborator are not included. +func (s *RepositoriesStore) GetByCollaboratorID(ctx context.Context, collaboratorID int64, limit int, orderBy string) ([]*Repository, error) { + /* + Equivalent SQL for PostgreSQL: + + SELECT * FROM repository + JOIN access ON access.repo_id = repository.id AND access.user_id = @collaboratorID + WHERE access.mode >= @accessModeRead + ORDER BY @orderBy + LIMIT @limit + */ + var repos []*Repository + return repos, s.db.WithContext(ctx). + Joins("JOIN access ON access.repo_id = repository.id AND access.user_id = ?", collaboratorID). + Where("access.mode >= ?", AccessModeRead). + Order(orderBy). + Limit(limit). + Find(&repos). + Error +} + +// GetByCollaboratorIDWithAccessMode returns a list of repositories and +// corresponding access mode that the given collaborator has access to. +// Repositories that are owned directly by the given collaborator are not +// included. +func (s *RepositoriesStore) GetByCollaboratorIDWithAccessMode(ctx context.Context, collaboratorID int64) (map[*Repository]AccessMode, error) { + /* + Equivalent SQL for PostgreSQL: + + SELECT + repository.*, + access.mode + FROM repository + JOIN access ON access.repo_id = repository.id AND access.user_id = @collaboratorID + WHERE access.mode >= @accessModeRead + */ + var reposWithAccessMode []*struct { + *Repository + Mode AccessMode + } + err := s.db.WithContext(ctx). + Select("repository.*", "access.mode"). + Table("repository"). + Joins("JOIN access ON access.repo_id = repository.id AND access.user_id = ?", collaboratorID). + Where("access.mode >= ?", AccessModeRead). + Find(&reposWithAccessMode). + Error + if err != nil { + return nil, err + } + + repos := make(map[*Repository]AccessMode, len(reposWithAccessMode)) + for _, repoWithAccessMode := range reposWithAccessMode { + repos[repoWithAccessMode.Repository] = repoWithAccessMode.Mode + } + return repos, nil +} + +var _ errx.NotFound = (*ErrRepoNotExist)(nil) + +type ErrRepoNotExist struct { + args errx.Args +} + +func IsErrRepoNotExist(err error) bool { + _, ok := err.(ErrRepoNotExist) + return ok +} + +func (err ErrRepoNotExist) Error() string { + return fmt.Sprintf("repository does not exist: %v", err.args) +} + +func (ErrRepoNotExist) NotFound() bool { + return true +} + +// GetByID returns the repository with given ID. It returns ErrRepoNotExist when +// not found. +func (s *RepositoriesStore) GetByID(ctx context.Context, id int64) (*Repository, error) { + repo := new(Repository) + err := s.db.WithContext(ctx).Where("id = ?", id).First(repo).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrRepoNotExist{errx.Args{"repoID": id}} + } + return nil, err + } + return repo, nil +} + +// GetByName returns the repository with given owner and name. It returns +// ErrRepoNotExist when not found. +func (s *RepositoriesStore) GetByName(ctx context.Context, ownerID int64, name string) (*Repository, error) { + repo := new(Repository) + err := s.db.WithContext(ctx). + Where("owner_id = ? AND lower_name = ?", ownerID, strings.ToLower(name)). + First(repo). + Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil, ErrRepoNotExist{ + args: errx.Args{ + "ownerID": ownerID, + "name": name, + }, + } + } + return nil, err + } + return repo, nil +} + +func (s *RepositoriesStore) recountStars(tx *gorm.DB, userID, repoID int64) error { + /* + Equivalent SQL for PostgreSQL: + + UPDATE repository + SET num_stars = ( + SELECT COUNT(*) FROM star WHERE repo_id = @repoID + ) + WHERE id = @repoID + */ + err := tx.Model(&Repository{}). + Where("id = ?", repoID). + Update( + "num_stars", + tx.Model(&Star{}).Select("COUNT(*)").Where("repo_id = ?", repoID), + ). + Error + if err != nil { + return errors.Wrap(err, `update "repository.num_stars"`) + } + + /* + Equivalent SQL for PostgreSQL: + + UPDATE "user" + SET num_stars = ( + SELECT COUNT(*) FROM star WHERE uid = @userID + ) + WHERE id = @userID + */ + err = tx.Model(&User{}). + Where("id = ?", userID). + Update( + "num_stars", + tx.Model(&Star{}).Select("COUNT(*)").Where("uid = ?", userID), + ). + Error + if err != nil { + return errors.Wrap(err, `update "user.num_stars"`) + } + return nil +} + +// Star marks the user to star the repository. +func (s *RepositoriesStore) Star(ctx context.Context, userID, repoID int64) error { + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + star := &Star{ + UserID: userID, + RepoID: repoID, + } + result := tx.FirstOrCreate(star, star) + if result.Error != nil { + return errors.Wrap(result.Error, "upsert") + } else if result.RowsAffected <= 0 { + return nil // Relation already exists + } + + return s.recountStars(tx, userID, repoID) + }) +} + +// Touch updates the updated time to the current time and removes the bare state +// of the given repository. +func (s *RepositoriesStore) Touch(ctx context.Context, id int64) error { + return s.db.WithContext(ctx). + Model(new(Repository)). + Where("id = ?", id). + Updates(map[string]any{ + "is_bare": false, + "updated_unix": s.db.NowFunc().Unix(), + }). + Error +} + +// ListWatches returns all watches of the given repository. +func (s *RepositoriesStore) ListWatches(ctx context.Context, repoID int64) ([]*Watch, error) { + var watches []*Watch + return watches, s.db.WithContext(ctx).Where("repo_id = ?", repoID).Find(&watches).Error +} + +func (s *RepositoriesStore) recountWatches(tx *gorm.DB, repoID int64) error { + /* + Equivalent SQL for PostgreSQL: + + UPDATE repository + SET num_watches = ( + SELECT COUNT(*) FROM watch WHERE repo_id = @repoID + ) + WHERE id = @repoID + */ + return tx.Model(&Repository{}). + Where("id = ?", repoID). + Update( + "num_watches", + tx.Model(&Watch{}).Select("COUNT(*)").Where("repo_id = ?", repoID), + ). + Error +} + +// Watch marks the user to watch the repository. +func (s *RepositoriesStore) Watch(ctx context.Context, userID, repoID int64) error { + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + w := &Watch{ + UserID: userID, + RepoID: repoID, + } + result := tx.FirstOrCreate(w, w) + if result.Error != nil { + return errors.Wrap(result.Error, "upsert") + } else if result.RowsAffected <= 0 { + return nil // Relation already exists + } + + return s.recountWatches(tx, repoID) + }) +} + +// HasForkedBy returns true if the given repository has forked by the given user. +func (s *RepositoriesStore) HasForkedBy(ctx context.Context, repoID, userID int64) bool { + var count int64 + s.db.WithContext(ctx).Model(new(Repository)).Where("owner_id = ? AND fork_id = ?", userID, repoID).Count(&count) + return count > 0 +} diff --git a/internal/database/repositories_test.go b/internal/database/repositories_test.go new file mode 100644 index 00000000000..3b98db8a0be --- /dev/null +++ b/internal/database/repositories_test.go @@ -0,0 +1,340 @@ +package database + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gorm.io/gorm" + + "gogs.io/gogs/internal/errx" +) + +func TestRepository_BeforeCreate(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + t.Run("CreatedUnix has been set", func(t *testing.T) { + repo := &Repository{ + CreatedUnix: 1, + } + _ = repo.BeforeCreate(db) + assert.Equal(t, int64(1), repo.CreatedUnix) + }) + + t.Run("CreatedUnix has not been set", func(t *testing.T) { + repo := &Repository{} + _ = repo.BeforeCreate(db) + assert.Equal(t, db.NowFunc().Unix(), repo.CreatedUnix) + }) +} + +func TestRepository_BeforeUpdate(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + repo := &Repository{} + _ = repo.BeforeUpdate(db) + assert.Equal(t, db.NowFunc().Unix(), repo.UpdatedUnix) +} + +func TestRepository_AfterFind(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + repo := &Repository{ + CreatedUnix: now.Unix(), + UpdatedUnix: now.Unix(), + } + _ = repo.AfterFind(db) + assert.Equal(t, repo.CreatedUnix, repo.Created.Unix()) + assert.Equal(t, repo.UpdatedUnix, repo.Updated.Unix()) +} + +func TestRepos(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + s := &RepositoriesStore{ + db: newTestDB(t, "repos"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *RepositoriesStore) + }{ + {"Create", reposCreate}, + {"GetByCollaboratorID", reposGetByCollaboratorID}, + {"GetByCollaboratorIDWithAccessMode", reposGetByCollaboratorIDWithAccessMode}, + {"GetByID", reposGetByID}, + {"GetByName", reposGetByName}, + {"Star", reposStar}, + {"Touch", reposTouch}, + {"ListByRepo", reposListWatches}, + {"Watch", reposWatch}, + {"HasForkedBy", reposHasForkedBy}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func reposCreate(t *testing.T, ctx context.Context, s *RepositoriesStore) { + t.Run("name not allowed", func(t *testing.T) { + _, err := s.Create(ctx, + 1, + CreateRepoOptions{ + Name: "my.git", + }, + ) + wantErr := ErrNameNotAllowed{args: errx.Args{"reason": "reserved", "pattern": "*.git"}} + assert.Equal(t, wantErr, err) + }) + + t.Run("already exists", func(t *testing.T) { + _, err := s.Create(ctx, 2, + CreateRepoOptions{ + Name: "repo1", + }, + ) + require.NoError(t, err) + + _, err = s.Create(ctx, 2, + CreateRepoOptions{ + Name: "repo1", + }, + ) + wantErr := ErrRepoAlreadyExist{args: errx.Args{"ownerID": int64(2), "name": "repo1"}} + assert.Equal(t, wantErr, err) + }) + + repo, err := s.Create(ctx, 3, + CreateRepoOptions{ + Name: "repo2", + }, + ) + require.NoError(t, err) + + repo, err = s.GetByName(ctx, repo.OwnerID, repo.Name) + require.NoError(t, err) + assert.Equal(t, s.db.NowFunc().Format(time.RFC3339), repo.Created.UTC().Format(time.RFC3339)) + assert.Equal(t, 1, repo.NumWatches) // The owner is watching the repo by default. +} + +func reposGetByCollaboratorID(t *testing.T, ctx context.Context, s *RepositoriesStore) { + repo1, err := s.Create(ctx, 1, CreateRepoOptions{Name: "repo1"}) + require.NoError(t, err) + repo2, err := s.Create(ctx, 2, CreateRepoOptions{Name: "repo2"}) + require.NoError(t, err) + + permissionsStore := newPermissionsStore(s.db) + err = permissionsStore.SetRepoPerms(ctx, repo1.ID, map[int64]AccessMode{3: AccessModeRead}) + require.NoError(t, err) + err = permissionsStore.SetRepoPerms(ctx, repo2.ID, map[int64]AccessMode{4: AccessModeAdmin}) + require.NoError(t, err) + + t.Run("user 3 is a collaborator of repo1", func(t *testing.T) { + got, err := s.GetByCollaboratorID(ctx, 3, 10, "") + require.NoError(t, err) + require.Len(t, got, 1) + assert.Equal(t, repo1.ID, got[0].ID) + }) + + t.Run("do not return directly owned repository", func(t *testing.T) { + got, err := s.GetByCollaboratorID(ctx, 1, 10, "") + require.NoError(t, err) + require.Len(t, got, 0) + }) +} + +func reposGetByCollaboratorIDWithAccessMode(t *testing.T, ctx context.Context, s *RepositoriesStore) { + repo1, err := s.Create(ctx, 1, CreateRepoOptions{Name: "repo1"}) + require.NoError(t, err) + repo2, err := s.Create(ctx, 2, CreateRepoOptions{Name: "repo2"}) + require.NoError(t, err) + repo3, err := s.Create(ctx, 2, CreateRepoOptions{Name: "repo3"}) + require.NoError(t, err) + + permissionsStore := newPermissionsStore(s.db) + err = permissionsStore.SetRepoPerms(ctx, repo1.ID, map[int64]AccessMode{3: AccessModeRead}) + require.NoError(t, err) + err = permissionsStore.SetRepoPerms(ctx, repo2.ID, map[int64]AccessMode{3: AccessModeAdmin, 4: AccessModeWrite}) + require.NoError(t, err) + err = permissionsStore.SetRepoPerms(ctx, repo3.ID, map[int64]AccessMode{4: AccessModeWrite}) + require.NoError(t, err) + + got, err := s.GetByCollaboratorIDWithAccessMode(ctx, 3) + require.NoError(t, err) + require.Len(t, got, 2) + + accessModes := make(map[int64]AccessMode) + for repo, mode := range got { + accessModes[repo.ID] = mode + } + assert.Equal(t, AccessModeRead, accessModes[repo1.ID]) + assert.Equal(t, AccessModeAdmin, accessModes[repo2.ID]) +} + +func reposGetByID(t *testing.T, ctx context.Context, s *RepositoriesStore) { + repo1, err := s.Create(ctx, 1, CreateRepoOptions{Name: "repo1"}) + require.NoError(t, err) + + got, err := s.GetByID(ctx, repo1.ID) + require.NoError(t, err) + assert.Equal(t, repo1.Name, got.Name) + + _, err = s.GetByID(ctx, 404) + wantErr := ErrRepoNotExist{args: errx.Args{"repoID": int64(404)}} + assert.Equal(t, wantErr, err) +} + +func reposGetByName(t *testing.T, ctx context.Context, s *RepositoriesStore) { + repo, err := s.Create(ctx, 1, + CreateRepoOptions{ + Name: "repo1", + }, + ) + require.NoError(t, err) + + _, err = s.GetByName(ctx, repo.OwnerID, repo.Name) + require.NoError(t, err) + + _, err = s.GetByName(ctx, 1, "bad_name") + wantErr := ErrRepoNotExist{args: errx.Args{"ownerID": int64(1), "name": "bad_name"}} + assert.Equal(t, wantErr, err) +} + +func reposStar(t *testing.T, ctx context.Context, s *RepositoriesStore) { + repo1, err := s.Create(ctx, 1, CreateRepoOptions{Name: "repo1"}) + require.NoError(t, err) + usersStore := newUsersStore(s.db) + alice, err := usersStore.Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + + err = s.Star(ctx, alice.ID, repo1.ID) + require.NoError(t, err) + + repo1, err = s.GetByID(ctx, repo1.ID) + require.NoError(t, err) + assert.Equal(t, 1, repo1.NumStars) + + alice, err = usersStore.GetByID(ctx, alice.ID) + require.NoError(t, err) + assert.Equal(t, 1, alice.NumStars) +} + +func reposTouch(t *testing.T, ctx context.Context, s *RepositoriesStore) { + repo, err := s.Create(ctx, 1, + CreateRepoOptions{ + Name: "repo1", + }, + ) + require.NoError(t, err) + + err = s.db.WithContext(ctx).Model(new(Repository)).Where("id = ?", repo.ID).Update("is_bare", true).Error + require.NoError(t, err) + + // Make sure it is bare + got, err := s.GetByName(ctx, repo.OwnerID, repo.Name) + require.NoError(t, err) + assert.True(t, got.IsBare) + + // Touch it + err = s.Touch(ctx, repo.ID) + require.NoError(t, err) + + // It should not be bare anymore + got, err = s.GetByName(ctx, repo.OwnerID, repo.Name) + require.NoError(t, err) + assert.False(t, got.IsBare) +} + +func reposListWatches(t *testing.T, ctx context.Context, s *RepositoriesStore) { + err := s.Watch(ctx, 1, 1) + require.NoError(t, err) + err = s.Watch(ctx, 2, 1) + require.NoError(t, err) + err = s.Watch(ctx, 2, 2) + require.NoError(t, err) + + got, err := s.ListWatches(ctx, 1) + require.NoError(t, err) + for _, w := range got { + w.ID = 0 + } + + want := []*Watch{ + {UserID: 1, RepoID: 1}, + {UserID: 2, RepoID: 1}, + } + assert.Equal(t, want, got) +} + +func reposWatch(t *testing.T, ctx context.Context, s *RepositoriesStore) { + reposStore := newReposStore(s.db) + repo1, err := reposStore.Create(ctx, 1, CreateRepoOptions{Name: "repo1"}) + require.NoError(t, err) + + err = s.Watch(ctx, 2, repo1.ID) + require.NoError(t, err) + + // It is OK to watch multiple times and just be noop. + err = s.Watch(ctx, 2, repo1.ID) + require.NoError(t, err) + + repo1, err = reposStore.GetByID(ctx, repo1.ID) + require.NoError(t, err) + assert.Equal(t, 2, repo1.NumWatches) // The owner is watching the repo by default. +} + +func reposHasForkedBy(t *testing.T, ctx context.Context, s *RepositoriesStore) { + has := s.HasForkedBy(ctx, 1, 2) + assert.False(t, has) + + _, err := newReposStore(s.db).Create( + ctx, + 2, + CreateRepoOptions{ + Name: "repo1", + ForkID: 1, + }, + ) + require.NoError(t, err) + + has = s.HasForkedBy(ctx, 1, 2) + assert.True(t, has) +} diff --git a/internal/database/schemadoc/main.go b/internal/database/schemadoc/main.go new file mode 100644 index 00000000000..c3c08e58eba --- /dev/null +++ b/internal/database/schemadoc/main.go @@ -0,0 +1,205 @@ +package main + +import ( + "fmt" + "log" + "os" + "sort" + "strings" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/cockroachdb/errors" + "github.com/glebarez/sqlite" + "github.com/olekukonko/tablewriter" + "github.com/olekukonko/tablewriter/renderer" + "github.com/olekukonko/tablewriter/tw" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gogs.io/gogs/internal/database" +) + +//go:generate go run main.go ../../../docs/dev/database_schema.md + +func main() { + w, err := os.Create(os.Args[1]) + if err != nil { + log.Fatalf("Failed to create file: %v", err) + } + defer func() { _ = w.Close() }() + + conn, _, err := sqlmock.New() + if err != nil { + log.Fatalf("Failed to get mock connection: %v", err) + } + defer func() { _ = conn.Close() }() + + dialectors := []gorm.Dialector{ + postgres.New(postgres.Config{ + Conn: conn, + }), + mysql.New(mysql.Config{ + Conn: conn, + SkipInitializeWithVersion: true, + }), + sqlite.Open(""), + } + collected := make([][]*tableInfo, 0, len(dialectors)) + for i, dialector := range dialectors { + tableInfos, err := generate(dialector) + if err != nil { + log.Fatalf("Failed to get table info of %d: %v", i, err) + } + + collected = append(collected, tableInfos) + } + + for i, ti := range collected[0] { + _, _ = w.WriteString(`# Table "` + ti.Name + `"`) + _, _ = w.WriteString("\n\n") + + _, _ = w.WriteString("```\n") + + table := tablewriter.NewTable(w, + tablewriter.WithRenderer(renderer.NewBlueprint(tw.Rendition{ + Borders: tw.BorderNone, + Symbols: tw.NewSymbols(tw.StyleASCII), + })), + tablewriter.WithHeaderAutoFormat(tw.Off), + ) + table.Header("Field", "Column", "PostgreSQL", "MySQL", "SQLite3") + for j, f := range ti.Fields { + sqlite3Type := strings.ToUpper(collected[2][i].Fields[j].Type) + sqlite3Type = strings.ReplaceAll(sqlite3Type, "PRIMARY KEY ", "") + _ = table.Append([]string{ + f.Name, f.Column, + strings.ToUpper(f.Type), // PostgreSQL + strings.ToUpper(collected[1][i].Fields[j].Type), // MySQL + sqlite3Type, + }) + } + _ = table.Render() + _, _ = w.WriteString("\n") + + _, _ = w.WriteString("Primary keys: ") + _, _ = w.WriteString(strings.Join(ti.PrimaryKeys, ", ")) + _, _ = w.WriteString("\n") + + if len(ti.Indexes) > 0 { + _, _ = w.WriteString("Indexes: \n") + for _, index := range ti.Indexes { + _, _ = fmt.Fprintf(w, "\t%q", index.Name) + if index.Class != "" { + _, _ = fmt.Fprintf(w, " %s", index.Class) + } + if index.Type != "" { + _, _ = fmt.Fprintf(w, ", %s", index.Type) + } + + if len(index.Fields) > 0 { + fields := make([]string, len(index.Fields)) + for i := range index.Fields { + fields[i] = index.Fields[i].DBName + } + _, _ = fmt.Fprintf(w, " (%s)", strings.Join(fields, ", ")) + } + _, _ = w.WriteString("\n") + } + } + + _, _ = w.WriteString("```\n\n") + } +} + +type tableField struct { + Name string + Column string + Type string +} + +type tableInfo struct { + Name string + Fields []*tableField + PrimaryKeys []string + Indexes []schema.Index +} + +// This function is derived from gorm.io/gorm/migrator/migrator.go:Migrator.CreateTable. +func generate(dialector gorm.Dialector) ([]*tableInfo, error) { + conn, err := gorm.Open(dialector, + &gorm.Config{ + SkipDefaultTransaction: true, + NamingStrategy: schema.NamingStrategy{ + SingularTable: true, + }, + DryRun: true, + DisableAutomaticPing: true, + }, + ) + if err != nil { + return nil, errors.Wrap(err, "open database") + } + + m := conn.Migrator().(interface { + RunWithValue(value any, fc func(*gorm.Statement) error) error + FullDataTypeOf(*schema.Field) clause.Expr + }) + tableInfos := make([]*tableInfo, 0, len(database.Tables)) + for _, table := range database.Tables { + err = m.RunWithValue(table, func(stmt *gorm.Statement) error { + fields := make([]*tableField, 0, len(stmt.Schema.DBNames)) + for _, field := range stmt.Schema.Fields { + if field.DBName == "" { + continue + } + + tags := make([]string, 0) + for tag := range field.TagSettings { + if tag == "UNIQUE" { + tags = append(tags, tag) + } + } + typeSuffix := "" + if len(tags) > 0 { + typeSuffix = " " + strings.Join(tags, " ") + } + fields = append(fields, &tableField{ + Name: field.Name, + Column: field.DBName, + Type: m.FullDataTypeOf(field).SQL + typeSuffix, + }) + } + + primaryKeys := make([]string, 0, len(stmt.Schema.PrimaryFields)) + if len(stmt.Schema.PrimaryFields) > 0 { + for _, field := range stmt.Schema.PrimaryFields { + primaryKeys = append(primaryKeys, field.DBName) + } + } + + var indexes []schema.Index + for _, index := range stmt.Schema.ParseIndexes() { + indexes = append(indexes, index) + } + sort.Slice(indexes, func(i, j int) bool { + return indexes[i].Name < indexes[j].Name + }) + + tableInfos = append(tableInfos, &tableInfo{ + Name: stmt.Table, + Fields: fields, + PrimaryKeys: primaryKeys, + Indexes: indexes, + }) + return nil + }) + if err != nil { + return nil, errors.Wrap(err, "gather table information") + } + } + + return tableInfos, nil +} diff --git a/internal/database/ssh_key.go b/internal/database/ssh_key.go new file mode 100644 index 00000000000..de051c2f9fc --- /dev/null +++ b/internal/database/ssh_key.go @@ -0,0 +1,793 @@ +package database + +import ( + "context" + "encoding/base64" + "encoding/binary" + "fmt" + "math/big" + "os" + "path" + "path/filepath" + "strconv" + "strings" + "sync" + "time" + + "github.com/cockroachdb/errors" + "golang.org/x/crypto/ssh" + log "unknwon.dev/clog/v2" + "xorm.io/xorm" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/process" +) + +const ( + tplPublicKey = `command="%s serv key-%d --config='%s'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty %s` + "\n" +) + +var sshOpLocker sync.Mutex + +type KeyType int + +const ( + KeyTypeUser = iota + 1 + KeyTypeDeploy +) + +// PublicKey represents a user or deploy SSH public key. +type PublicKey struct { + ID int64 `gorm:"primaryKey"` + OwnerID int64 `xorm:"INDEX NOT NULL" gorm:"index;not null"` + Name string `xorm:"NOT NULL" gorm:"not null"` + Fingerprint string `xorm:"NOT NULL" gorm:"not null"` + Content string `xorm:"TEXT NOT NULL" gorm:"type:TEXT;not null"` + Mode AccessMode `xorm:"NOT NULL DEFAULT 2" gorm:"not null;default:2"` + Type KeyType `xorm:"NOT NULL DEFAULT 1" gorm:"not null;default:1"` + + Created time.Time `xorm:"-" json:"-" gorm:"-"` + CreatedUnix int64 + Updated time.Time `xorm:"-" json:"-" gorm:"-"` // Note: Updated must below Created for AfterSet. + UpdatedUnix int64 + HasRecentActivity bool `xorm:"-" json:"-" gorm:"-"` + HasUsed bool `xorm:"-" json:"-" gorm:"-"` +} + +func (k *PublicKey) BeforeInsert() { + k.CreatedUnix = time.Now().Unix() +} + +func (k *PublicKey) BeforeUpdate() { + k.UpdatedUnix = time.Now().Unix() +} + +func (k *PublicKey) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "created_unix": + k.Created = time.Unix(k.CreatedUnix, 0).Local() + case "updated_unix": + k.Updated = time.Unix(k.UpdatedUnix, 0).Local() + k.HasUsed = k.Updated.After(k.Created) + k.HasRecentActivity = k.Updated.Add(7 * 24 * time.Hour).After(time.Now()) + } +} + +// OmitEmail returns content of public key without email address. +func (k *PublicKey) OmitEmail() string { + return strings.Join(strings.Split(k.Content, " ")[:2], " ") +} + +// AuthorizedString returns formatted public key string for authorized_keys file. +func (k *PublicKey) AuthorizedString() string { + return fmt.Sprintf(tplPublicKey, conf.AppPath(), k.ID, conf.CustomConf, k.Content) +} + +// IsDeployKey returns true if the public key is used as deploy key. +func (k *PublicKey) IsDeployKey() bool { + return k.Type == KeyTypeDeploy +} + +func extractTypeFromBase64Key(key string) (string, error) { + b, err := base64.StdEncoding.DecodeString(key) + if err != nil || len(b) < 4 { + return "", errors.Newf("invalid key format: %v", err) + } + + keyLength := int(binary.BigEndian.Uint32(b)) + if len(b) < 4+keyLength { + return "", errors.Newf("invalid key format: not enough length %d", keyLength) + } + + return string(b[4 : 4+keyLength]), nil +} + +// parseKeyString parses any key string in OpenSSH or SSH2 format to clean OpenSSH string (RFC4253). +func parseKeyString(content string) (string, error) { + // Transform all legal line endings to a single "\n" + + // Replace all windows full new lines ("\r\n") + content = strings.ReplaceAll(content, "\r\n", "\n") + + // Replace all windows half new lines ("\r"), if it happen not to match replace above + content = strings.ReplaceAll(content, "\r", "\n") + + // Replace ending new line as its may cause unwanted behaviour (extra line means not a single line key | OpenSSH key) + content = strings.TrimRight(content, "\n") + + // split lines + lines := strings.Split(content, "\n") + + var keyType, keyContent, keyComment string + + if len(lines) == 1 { + // Parse OpenSSH format. + parts := strings.SplitN(lines[0], " ", 3) + switch len(parts) { + case 0: + return "", errors.New("empty key") + case 1: + keyContent = parts[0] + case 2: + keyType = parts[0] + keyContent = parts[1] + default: + keyType = parts[0] + keyContent = parts[1] + keyComment = parts[2] + } + + // If keyType is not given, extract it from content. If given, validate it. + t, err := extractTypeFromBase64Key(keyContent) + if err != nil { + return "", errors.Newf("extractTypeFromBase64Key: %v", err) + } + if keyType == "" { + keyType = t + } else if keyType != t { + return "", errors.Newf("key type and content does not match: %s - %s", keyType, t) + } + } else { + // Parse SSH2 file format. + continuationLine := false + + for _, line := range lines { + // Skip lines that: + // 1) are a continuation of the previous line, + // 2) contain ":" as that are comment lines + // 3) contain "-" as that are begin and end tags + if continuationLine || strings.ContainsAny(line, ":-") { + continuationLine = strings.HasSuffix(line, "\\") + } else { + keyContent = keyContent + line + } + } + + t, err := extractTypeFromBase64Key(keyContent) + if err != nil { + return "", errors.Newf("extractTypeFromBase64Key: %v", err) + } + keyType = t + } + return keyType + " " + keyContent + " " + keyComment, nil +} + +// writeTmpKeyFile writes key content to a temporary file +// and returns the name of that file, along with any possible errors. +func writeTmpKeyFile(content, keyTestPath string) (string, error) { + tmpFile, err := os.CreateTemp(keyTestPath, "gogs_keytest") + if err != nil { + return "", errors.Newf("TempFile: %v", err) + } + defer tmpFile.Close() + + if _, err = tmpFile.WriteString(content); err != nil { + return "", errors.Newf("WriteString: %v", err) + } + return tmpFile.Name(), nil +} + +// SSHKeygenParsePublicKey extracts key type and length using ssh-keygen. +func SSHKeygenParsePublicKey(key, keyTestPath, keygenPath string) (string, int, error) { + tmpName, err := writeTmpKeyFile(key, keyTestPath) + if err != nil { + return "", 0, errors.Newf("writeTmpKeyFile: %v", err) + } + defer os.Remove(tmpName) + + stdout, stderr, err := process.Exec("SSHKeygenParsePublicKey", keygenPath, "-lf", tmpName) + if err != nil { + return "", 0, errors.Newf("fail to parse public key: %s - %s", err, stderr) + } + if strings.Contains(stdout, "is not a public key file") { + return "", 0, ErrKeyUnableVerify{stdout} + } + + fields := strings.Split(stdout, " ") + if len(fields) < 4 { + return "", 0, errors.Newf("invalid public key line: %s", stdout) + } + + keyType := strings.Trim(fields[len(fields)-1], "()\r\n") + length, _ := strconv.Atoi(fields[0]) + return strings.ToLower(keyType), length, nil +} + +// SSHNativeParsePublicKey extracts the key type and length using the golang SSH library. +func SSHNativeParsePublicKey(keyLine string) (string, int, error) { + fields := strings.Fields(keyLine) + if len(fields) < 2 { + return "", 0, errors.Newf("not enough fields in public key line: %s", keyLine) + } + + raw, err := base64.StdEncoding.DecodeString(fields[1]) + if err != nil { + return "", 0, err + } + + pkey, err := ssh.ParsePublicKey(raw) + if err != nil { + if strings.Contains(err.Error(), "ssh: unknown key algorithm") { + return "", 0, ErrKeyUnableVerify{err.Error()} + } + return "", 0, errors.Newf("ParsePublicKey: %v", err) + } + + // The ssh library can parse the key, so next we find out what key exactly we have. + switch pkey.Type() { + case ssh.KeyAlgoDSA: + rawPub := struct { + Name string + P, Q, G, Y *big.Int + }{} + if err := ssh.Unmarshal(pkey.Marshal(), &rawPub); err != nil { + return "", 0, err + } + // as per https://bugzilla.mindrot.org/show_bug.cgi?id=1647 we should never + // see dsa keys != 1024 bit, but as it seems to work, we will not check here + return "dsa", rawPub.P.BitLen(), nil // use P as per crypto/dsa/dsa.go (is L) + case ssh.KeyAlgoRSA: + rawPub := struct { + Name string + E *big.Int + N *big.Int + }{} + if err := ssh.Unmarshal(pkey.Marshal(), &rawPub); err != nil { + return "", 0, err + } + return "rsa", rawPub.N.BitLen(), nil // use N as per crypto/rsa/rsa.go (is bits) + case ssh.KeyAlgoECDSA256: + return "ecdsa", 256, nil + case ssh.KeyAlgoECDSA384: + return "ecdsa", 384, nil + case ssh.KeyAlgoECDSA521: + return "ecdsa", 521, nil + case ssh.KeyAlgoED25519: + return "ed25519", 256, nil + } + return "", 0, errors.Newf("unsupported key length detection for type: %s", pkey.Type()) +} + +// CheckPublicKeyString checks if the given public key string is recognized by SSH. +// It returns the actual public key line on success. +func CheckPublicKeyString(content string) (_ string, err error) { + if conf.SSH.Disabled { + return "", errors.New("SSH is disabled") + } + + content, err = parseKeyString(content) + if err != nil { + return "", err + } + + content = strings.TrimRight(content, "\n\r") + if strings.ContainsAny(content, "\n\r") { + return "", errors.New("only a single line with a single key please") + } + + // Remove any unnecessary whitespace + content = strings.TrimSpace(content) + + if !conf.SSH.MinimumKeySizeCheck { + return content, nil + } + + var ( + fnName string + keyType string + length int + ) + if conf.SSH.StartBuiltinServer { + fnName = "SSHNativeParsePublicKey" + keyType, length, err = SSHNativeParsePublicKey(content) + } else { + fnName = "SSHKeygenParsePublicKey" + keyType, length, err = SSHKeygenParsePublicKey(content, conf.SSH.KeyTestPath, conf.SSH.KeygenPath) + } + if err != nil { + return "", errors.Newf("%s: %v", fnName, err) + } + log.Trace("Key info [native: %v]: %s-%d", conf.SSH.StartBuiltinServer, keyType, length) + + if minLen, found := conf.SSH.MinimumKeySizes[keyType]; found && length >= minLen { + return content, nil + } else if found && length < minLen { + return "", errors.Newf("key length is not enough: got %d, needs %d", length, minLen) + } + return "", errors.Newf("key type is not allowed: %s", keyType) +} + +// appendAuthorizedKeysToFile appends new SSH keys' content to authorized_keys file. +func appendAuthorizedKeysToFile(keys ...*PublicKey) error { + sshOpLocker.Lock() + defer sshOpLocker.Unlock() + + fpath := filepath.Join(conf.SSH.RootPath, "authorized_keys") + f, err := os.OpenFile(fpath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o600) + if err != nil { + return err + } + defer f.Close() + + // Note: chmod command does not support in Windows. + if !conf.IsWindowsRuntime() { + fi, err := f.Stat() + if err != nil { + return err + } + + // .ssh directory should have mode 700, and authorized_keys file should have mode 600. + if fi.Mode().Perm() > 0o600 { + log.Error("authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String()) + if err = f.Chmod(0o600); err != nil { + return err + } + } + } + + for _, key := range keys { + if _, err = f.WriteString(key.AuthorizedString()); err != nil { + return err + } + } + return nil +} + +// checkKeyContent onlys checks if key content has been used as public key, +// it is OK to use same key as deploy key for multiple repositories/users. +func checkKeyContent(content string) error { + has, err := x.Get(&PublicKey{ + Content: content, + Type: KeyTypeUser, + }) + if err != nil { + return err + } else if has { + return ErrKeyAlreadyExist{0, content} + } + return nil +} + +func addKey(e Engine, key *PublicKey) (err error) { + // Calculate fingerprint. + tmpPath := strings.ReplaceAll(path.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond()), "id_rsa.pub"), "\\", "/") + _ = os.MkdirAll(path.Dir(tmpPath), os.ModePerm) + if err = os.WriteFile(tmpPath, []byte(key.Content), 0o644); err != nil { + return err + } + + stdout, stderr, err := process.Exec("AddPublicKey", conf.SSH.KeygenPath, "-lf", tmpPath) + if err != nil { + return errors.Newf("fail to parse public key: %s - %s", err, stderr) + } else if len(stdout) < 2 { + return errors.New("not enough output for calculating fingerprint: " + stdout) + } + key.Fingerprint = strings.Split(stdout, " ")[1] + + // Save SSH key. + if _, err = e.Insert(key); err != nil { + return err + } + + // Don't need to rewrite this file if builtin SSH server is enabled. + if conf.SSH.StartBuiltinServer { + return nil + } + return appendAuthorizedKeysToFile(key) +} + +// AddPublicKey adds new public key to database and authorized_keys file. +func AddPublicKey(ownerID int64, name, content string) (*PublicKey, error) { + log.Trace("Add public key: %s", content) + if err := checkKeyContent(content); err != nil { + return nil, err + } + + // Key name of same user cannot be duplicated. + has, err := x.Where("owner_id = ? AND name = ?", ownerID, name).Get(new(PublicKey)) + if err != nil { + return nil, err + } else if has { + return nil, ErrKeyNameAlreadyUsed{ownerID, name} + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return nil, err + } + + key := &PublicKey{ + OwnerID: ownerID, + Name: name, + Content: content, + Mode: AccessModeWrite, + Type: KeyTypeUser, + } + if err = addKey(sess, key); err != nil { + return nil, errors.Newf("addKey: %v", err) + } + + return key, sess.Commit() +} + +// GetPublicKeyByID returns public key by given ID. +func GetPublicKeyByID(keyID int64) (*PublicKey, error) { + key := new(PublicKey) + has, err := x.Id(keyID).Get(key) + if err != nil { + return nil, err + } else if !has { + return nil, ErrKeyNotExist{keyID} + } + return key, nil +} + +// SearchPublicKeyByContent searches a public key using the content as prefix +// (i.e. ignore the email part). It returns ErrKeyNotExist if no such key +// exists. +func SearchPublicKeyByContent(content string) (*PublicKey, error) { + key := new(PublicKey) + has, err := x.Where("content like ?", content+"%").Get(key) + if err != nil { + return nil, err + } else if !has { + return nil, ErrKeyNotExist{} + } + return key, nil +} + +// ListPublicKeys returns a list of public keys belongs to given user. +func ListPublicKeys(uid int64) ([]*PublicKey, error) { + keys := make([]*PublicKey, 0, 5) + return keys, x.Where("owner_id = ?", uid).Find(&keys) +} + +// UpdatePublicKey updates given public key. +func UpdatePublicKey(key *PublicKey) error { + _, err := x.Id(key.ID).AllCols().Update(key) + return err +} + +// 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 { + return nil + } + + _, err := e.In("id", keyIDs).Delete(new(PublicKey)) + return err +} + +// DeletePublicKey deletes SSH key information both in database and authorized_keys file. +func DeletePublicKey(doer *User, id int64) (err error) { + key, err := GetPublicKeyByID(id) + if err != nil { + if IsErrKeyNotExist(err) { + return nil + } + return errors.Newf("GetPublicKeyByID: %v", err) + } + + // Check if user has access to delete this key. + if !doer.IsAdmin && doer.ID != key.OwnerID { + return ErrKeyAccessDenied{doer.ID, key.ID, "public"} + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = deletePublicKeys(sess, id); err != nil { + return err + } + + if err = sess.Commit(); err != nil { + return err + } + + return RewriteAuthorizedKeys() +} + +// RewriteAuthorizedKeys removes any authorized key and rewrite all keys from database again. +// Note: x.Iterate does not get latest data after insert/delete, so we have to call this function +// outside any session scope independently. +// +// Deprecated: Use PublicKeys.RewriteAuthorizedKeys instead. +func RewriteAuthorizedKeys() error { + sshOpLocker.Lock() + defer sshOpLocker.Unlock() + + log.Trace("Doing: RewriteAuthorizedKeys") + + _ = os.MkdirAll(conf.SSH.RootPath, os.ModePerm) + fpath := authorizedKeysPath() + tmpPath := fpath + ".tmp" + f, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o600) + if err != nil { + return err + } + defer os.Remove(tmpPath) + + err = x.Iterate(new(PublicKey), func(idx int, bean any) (err error) { + _, err = f.WriteString((bean.(*PublicKey)).AuthorizedString()) + return err + }) + _ = f.Close() + if err != nil { + return err + } + + if osx.Exist(fpath) { + if err = os.Remove(fpath); err != nil { + return err + } + } + if err = os.Rename(tmpPath, fpath); err != nil { + return err + } + + return nil +} + +// ________ .__ ____ __. +// \______ \ ____ ______ | | ____ ___.__.| |/ _|____ ___.__. +// | | \_/ __ \\____ \| | / _ < | || <_/ __ < | | +// | ` \ ___/| |_> > |_( <_> )___ || | \ ___/\___ | +// /_______ /\___ > __/|____/\____// ____||____|__ \___ > ____| +// \/ \/|__| \/ \/ \/\/ + +// DeployKey represents deploy key information and its relation with repository. +type DeployKey struct { + ID int64 + KeyID int64 `xorm:"UNIQUE(s) INDEX"` + RepoID int64 `xorm:"UNIQUE(s) INDEX"` + Name string + Fingerprint string + Content string `xorm:"-" json:"-" gorm:"-"` + + Created time.Time `xorm:"-" json:"-" gorm:"-"` + CreatedUnix int64 + Updated time.Time `xorm:"-" json:"-" gorm:"-"` // Note: Updated must below Created for AfterSet. + UpdatedUnix int64 + HasRecentActivity bool `xorm:"-" json:"-" gorm:"-"` + HasUsed bool `xorm:"-" json:"-" gorm:"-"` +} + +func (k *DeployKey) BeforeInsert() { + k.CreatedUnix = time.Now().Unix() +} + +func (k *DeployKey) BeforeUpdate() { + k.UpdatedUnix = time.Now().Unix() +} + +func (k *DeployKey) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "created_unix": + k.Created = time.Unix(k.CreatedUnix, 0).Local() + case "updated_unix": + k.Updated = time.Unix(k.UpdatedUnix, 0).Local() + k.HasUsed = k.Updated.After(k.Created) + k.HasRecentActivity = k.Updated.Add(7 * 24 * time.Hour).After(time.Now()) + } +} + +// GetContent gets associated public key content. +func (k *DeployKey) GetContent() error { + pkey, err := GetPublicKeyByID(k.KeyID) + if err != nil { + return err + } + k.Content = pkey.Content + return nil +} + +func checkDeployKey(e Engine, keyID, repoID int64, name string) error { + // Note: We want error detail, not just true or false here. + has, err := e.Where("key_id = ? AND repo_id = ?", keyID, repoID).Get(new(DeployKey)) + if err != nil { + return err + } else if has { + return ErrDeployKeyAlreadyExist{keyID, repoID} + } + + has, err = e.Where("repo_id = ? AND name = ?", repoID, name).Get(new(DeployKey)) + if err != nil { + return err + } else if has { + return ErrDeployKeyNameAlreadyUsed{repoID, name} + } + + return nil +} + +// addDeployKey adds new key-repo relation. +func addDeployKey(e *xorm.Session, keyID, repoID int64, name, fingerprint string) (*DeployKey, error) { + if err := checkDeployKey(e, keyID, repoID, name); err != nil { + return nil, err + } + + key := &DeployKey{ + KeyID: keyID, + RepoID: repoID, + Name: name, + Fingerprint: fingerprint, + } + _, err := e.Insert(key) + return key, err +} + +// HasDeployKey returns true if public key is a deploy key of given repository. +func HasDeployKey(keyID, repoID int64) bool { + has, _ := x.Where("key_id = ? AND repo_id = ?", keyID, repoID).Get(new(DeployKey)) + return has +} + +// AddDeployKey add new deploy key to database and authorized_keys file. +func AddDeployKey(repoID int64, name, content string) (*DeployKey, error) { + if err := checkKeyContent(content); err != nil { + return nil, err + } + + pkey := &PublicKey{ + Content: content, + Mode: AccessModeRead, + Type: KeyTypeDeploy, + } + has, err := x.Get(pkey) + if err != nil { + return nil, err + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return nil, err + } + + // First time use this deploy key. + if !has { + if err = addKey(sess, pkey); err != nil { + return nil, errors.Newf("addKey: %v", err) + } + } + + key, err := addDeployKey(sess, pkey.ID, repoID, name, pkey.Fingerprint) + if err != nil { + return nil, errors.Newf("addDeployKey: %v", err) + } + + return key, sess.Commit() +} + +var _ errx.NotFound = (*ErrDeployKeyNotExist)(nil) + +type ErrDeployKeyNotExist struct { + args map[string]any +} + +func IsErrDeployKeyNotExist(err error) bool { + _, ok := err.(ErrDeployKeyNotExist) + return ok +} + +func (err ErrDeployKeyNotExist) Error() string { + return fmt.Sprintf("deploy key does not exist: %v", err.args) +} + +func (ErrDeployKeyNotExist) NotFound() bool { + return true +} + +// GetDeployKeyByID returns deploy key by given ID. +func GetDeployKeyByID(id int64) (*DeployKey, error) { + key := new(DeployKey) + has, err := x.Id(id).Get(key) + if err != nil { + return nil, err + } else if !has { + return nil, ErrDeployKeyNotExist{args: map[string]any{"deployKeyID": id}} + } + return key, nil +} + +// GetDeployKeyByRepo returns deploy key by given public key ID and repository ID. +func GetDeployKeyByRepo(keyID, repoID int64) (*DeployKey, error) { + key := &DeployKey{ + KeyID: keyID, + RepoID: repoID, + } + has, err := x.Get(key) + if err != nil { + return nil, err + } else if !has { + return nil, ErrDeployKeyNotExist{args: map[string]any{"keyID": keyID, "repoID": repoID}} + } + return key, nil +} + +// UpdateDeployKey updates deploy key information. +func UpdateDeployKey(key *DeployKey) error { + _, err := x.Id(key.ID).AllCols().Update(key) + return err +} + +// DeleteDeployKey deletes deploy key from its repository authorized_keys file if needed. +func DeleteDeployKey(doer *User, id int64) error { + key, err := GetDeployKeyByID(id) + if err != nil { + if IsErrDeployKeyNotExist(err) { + return nil + } + return errors.Newf("GetDeployKeyByID: %v", err) + } + + // Check if user has access to delete this key. + if !doer.IsAdmin { + repo, err := GetRepositoryByID(key.RepoID) + if err != nil { + return errors.Newf("GetRepositoryByID: %v", err) + } + if !Handle.Permissions().Authorize(context.TODO(), doer.ID, repo.ID, AccessModeAdmin, + AccessModeOptions{ + OwnerID: repo.OwnerID, + Private: repo.IsPrivate, + }, + ) { + return ErrKeyAccessDenied{doer.ID, key.ID, "deploy"} + } + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.ID(key.ID).Delete(new(DeployKey)); err != nil { + return errors.Newf("delete deploy key [%d]: %v", key.ID, err) + } + + // Check if this is the last reference to same key content. + has, err := sess.Where("key_id = ?", key.KeyID).Get(new(DeployKey)) + if err != nil { + return err + } else if !has { + if err = deletePublicKeys(sess, key.KeyID); err != nil { + return err + } + } + + return sess.Commit() +} + +// ListDeployKeys returns all deploy keys by given repository ID. +func ListDeployKeys(repoID int64) ([]*DeployKey, error) { + keys := make([]*DeployKey, 0, 5) + return keys, x.Where("repo_id = ?", repoID).Find(&keys) +} diff --git a/internal/database/ssh_key_test.go b/internal/database/ssh_key_test.go new file mode 100644 index 00000000000..a428c562b5c --- /dev/null +++ b/internal/database/ssh_key_test.go @@ -0,0 +1,74 @@ +package database + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSSHParsePublicKey(t *testing.T) { + tempPath := t.TempDir() + tests := []struct { + name string + content string + expType string + expLength int + }{ + { + name: "dsa-1024", + content: "ssh-dss AAAAB3NzaC1kc3MAAACBAOChCC7lf6Uo9n7BmZ6M8St19PZf4Tn59NriyboW2x/DZuYAz3ibZ2OkQ3S0SqDIa0HXSEJ1zaExQdmbO+Ux/wsytWZmCczWOVsaszBZSl90q8UnWlSH6P+/YA+RWJm5SFtuV9PtGIhyZgoNuz5kBQ7K139wuQsecdKktISwTakzAAAAFQCzKsO2JhNKlL+wwwLGOcLffoAmkwAAAIBpK7/3xvduajLBD/9vASqBQIHrgK2J+wiQnIb/Wzy0UsVmvfn8A+udRbBo+csM8xrSnlnlJnjkJS3qiM5g+eTwsLIV1IdKPEwmwB+VcP53Cw6lSyWyJcvhFb0N6s08NZysLzvj0N+ZC/FnhKTLzIyMtkHf/IrPCwlM+pV/M/96YgAAAIEAqQcGn9CKgzgPaguIZooTAOQdvBLMI5y0bQjOW6734XOpqQGf/Kra90wpoasLKZjSYKNPjE+FRUOrStLrxcNs4BeVKhy2PYTRnybfYVk1/dmKgH6P1YSRONsGKvTsH6c5IyCRG0ncCgYeF8tXppyd642982daopE7zQ/NPAnJfag= nocomment", + expType: "dsa", + expLength: 1024, + }, + { + name: "rsa-1024", + content: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAu7tvIvX6ZHrRXuZNfkR3XLHSsuCK9Zn3X58lxBcQzuo5xZgB6vRwwm/QtJuF+zZPtY5hsQILBLmF+BZ5WpKZp1jBeSjH2G7lxet9kbcH+kIVj0tPFEoyKI9wvWqIwC4prx/WVk2wLTJjzBAhyNxfEq7C9CeiX9pQEbEqJfkKCQ== nocomment", + expType: "rsa", + expLength: 1024, + }, + { + name: "rsa-2048", + content: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMZXh+1OBUwSH9D45wTaxErQIN9IoC9xl7MKJkqvTvv6O5RR9YW/IK9FbfjXgXsppYGhsCZo1hFOOsXHMnfOORqu/xMDx4yPuyvKpw4LePEcg4TDipaDFuxbWOqc/BUZRZcXu41QAWfDLrInwsltWZHSeG7hjhpacl4FrVv9V1pS6Oc5Q1NxxEzTzuNLS/8diZrTm/YAQQ/+B+mzWI3zEtF4miZjjAljWd1LTBPvU23d29DcBmmFahcZ441XZsTeAwGxG/Q6j8NgNXj9WxMeWwxXV2jeAX/EBSpZrCVlCQ1yJswT6xCp8TuBnTiGWYMBNTbOZvPC4e0WI2/yZW/s5F nocomment", + expType: "rsa", + expLength: 2048, + }, + { + name: "ecdsa-256", + content: "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFQacN3PrOll7PXmN5B/ZNVahiUIqI05nbBlZk1KXsO3d06ktAWqbNflv2vEmA38bTFTfJ2sbn2B5ksT52cDDbA= nocomment", + expType: "ecdsa", + expLength: 256, + }, + { + name: "ecdsa-384", + content: "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBINmioV+XRX1Fm9Qk2ehHXJ2tfVxW30ypUWZw670Zyq5GQfBAH6xjygRsJ5wWsHXBsGYgFUXIHvMKVAG1tpw7s6ax9oA+dJOJ7tj+vhn8joFqT+sg3LYHgZkHrfqryRasQ== nocomment", + expType: "ecdsa", + expLength: 384, + }, + { + name: "ecdsa-521", + content: "ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBACGt3UG3EzRwNOI17QR84l6PgiAcvCE7v6aXPj/SC6UWKg4EL8vW9ZBcdYL9wzs4FZXh4MOV8jAzu3KRWNTwb4k2wFNUpGOt7l28MztFFEtH5BDDrtAJSPENPy8pvPLMfnPg5NhvWycqIBzNcHipem5wSJFN5PdpNOC2xMrPWKNqj+ZjQ== nocomment", + expType: "ecdsa", + expLength: 521, + }, + { + name: "ed25519-256", + content: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICGYutovQfTewtcodVN1E1UUzMk4GQfiRI5ZoP/kTlDb nocomment", + expType: "ed25519", + expLength: 256, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + typ, length, err := SSHNativeParsePublicKey(test.content) + require.NoError(t, err) + assert.Equal(t, test.expType, typ) + assert.Equal(t, test.expLength, length) + + typ, length, err = SSHKeygenParsePublicKey(test.content, tempPath, "ssh-keygen") + require.NoError(t, err) + assert.Equal(t, test.expType, typ) + assert.Equal(t, test.expLength, length) + }) + } +} diff --git a/internal/database/testdata/backup/Access.golden.json b/internal/database/testdata/backup/Access.golden.json new file mode 100644 index 00000000000..3e2e2a46aab --- /dev/null +++ b/internal/database/testdata/backup/Access.golden.json @@ -0,0 +1,2 @@ +{"ID":1,"UserID":1,"RepoID":11,"Mode":1} +{"ID":2,"UserID":2,"RepoID":22,"Mode":2} diff --git a/internal/database/testdata/backup/AccessToken.golden.json b/internal/database/testdata/backup/AccessToken.golden.json new file mode 100644 index 00000000000..1c38c3c6e7f --- /dev/null +++ b/internal/database/testdata/backup/AccessToken.golden.json @@ -0,0 +1,4 @@ +{"ID":1,"UserID":1,"Name":"test1","Sha1":"56ed62d55225e9ae1275b1c4aa6e3de62f44e730","SHA256":"d6ba6426326c71d24c0f42a3f266cae492b83fd727b9eb216004489f482fa42b","CreatedUnix":1588568886,"UpdatedUnix":1588572486} +{"ID":2,"UserID":1,"Name":"test2","Sha1":"16fb74941e834e057d11c59db5d81cdae15be794","SHA256":"fc9b958d5f2c382302e93d1dd24f296de2d87b0edc38e6e8d424b752ca0bcd99","CreatedUnix":1588568886,"UpdatedUnix":0} +{"ID":3,"UserID":2,"Name":"test1","Sha1":"09f170f4ee70ba035587f7df8319b2a3a3d2b74a","SHA256":"e9a9cb1fb358ebc8009f4612c10dae7f2bcaa4de2ced2f4f6e4894c8eef31ed3","CreatedUnix":1588568886,"UpdatedUnix":0} +{"ID":4,"UserID":2,"Name":"test2","Sha1":"97aae28f0aa2cc1b496424cbd2fd9eced51c584c","SHA256":"97aae28f0aa2cc1b496424cbd2fd9eced51c584c3179941efbe4e732a19a1dc8","CreatedUnix":1588568886,"UpdatedUnix":0} diff --git a/internal/database/testdata/backup/Action.golden.json b/internal/database/testdata/backup/Action.golden.json new file mode 100644 index 00000000000..1e6d7f00d46 --- /dev/null +++ b/internal/database/testdata/backup/Action.golden.json @@ -0,0 +1,3 @@ +{"ID":1,"UserID":1,"OpType":16,"ActUserID":1,"ActUserName":"alice","RepoID":1,"RepoUserName":"alice","RepoName":"example","RefName":"main","IsPrivate":false,"Content":"{\"Len\":1,\"Commits\":[],\"CompareURL\":\"\"}","CreatedUnix":1588568886} +{"ID":2,"UserID":1,"OpType":5,"ActUserID":1,"ActUserName":"alice","RepoID":1,"RepoUserName":"alice","RepoName":"example","RefName":"main","IsPrivate":false,"Content":"{\"Len\":1,\"Commits\":[],\"CompareURL\":\"\"}","CreatedUnix":1588568886} +{"ID":3,"UserID":1,"OpType":17,"ActUserID":1,"ActUserName":"alice","RepoID":1,"RepoUserName":"alice","RepoName":"example","RefName":"main","IsPrivate":false,"Content":"","CreatedUnix":1588568886} diff --git a/internal/database/testdata/backup/EmailAddress.golden.json b/internal/database/testdata/backup/EmailAddress.golden.json new file mode 100644 index 00000000000..55141538565 --- /dev/null +++ b/internal/database/testdata/backup/EmailAddress.golden.json @@ -0,0 +1,2 @@ +{"ID":1,"UserID":1,"Email":"alice@example.com","IsActivated":false} +{"ID":2,"UserID":2,"Email":"bob@example.com","IsActivated":true} diff --git a/internal/database/testdata/backup/Follow.golden.json b/internal/database/testdata/backup/Follow.golden.json new file mode 100644 index 00000000000..51250e5ab98 --- /dev/null +++ b/internal/database/testdata/backup/Follow.golden.json @@ -0,0 +1,2 @@ +{"ID":1,"UserID":1,"FollowID":2} +{"ID":2,"UserID":2,"FollowID":1} diff --git a/internal/database/testdata/backup/LFSObject.golden.json b/internal/database/testdata/backup/LFSObject.golden.json new file mode 100644 index 00000000000..45f4ec62191 --- /dev/null +++ b/internal/database/testdata/backup/LFSObject.golden.json @@ -0,0 +1,2 @@ +{"RepoID":1,"OID":"ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f","Size":100,"Storage":"local","CreatedAt":"2020-05-04T05:08:06Z"} +{"RepoID":2,"OID":"ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f","Size":100,"Storage":"local","CreatedAt":"2020-05-04T05:08:06Z"} diff --git a/internal/database/testdata/backup/LoginSource.golden.json b/internal/database/testdata/backup/LoginSource.golden.json new file mode 100644 index 00000000000..f72096683b2 --- /dev/null +++ b/internal/database/testdata/backup/LoginSource.golden.json @@ -0,0 +1,2 @@ +{"ID":1,"Type":4,"Name":"My PAM","IsActived":true,"IsDefault":false,"Provider":null,"RawConfig":"{\"ServiceName\":\"PAM service\"}","CreatedUnix":1588568886,"UpdatedUnix":1588572486} +{"ID":2,"Type":6,"Name":"GitHub.com","IsActived":true,"IsDefault":false,"Provider":null,"RawConfig":"{\"APIEndpoint\":\"https://api.github.com\",\"SkipVerify\":false}","CreatedUnix":1588568886,"UpdatedUnix":0} diff --git a/internal/database/testdata/backup/Notice.golden.json b/internal/database/testdata/backup/Notice.golden.json new file mode 100644 index 00000000000..4d472520f49 --- /dev/null +++ b/internal/database/testdata/backup/Notice.golden.json @@ -0,0 +1 @@ +{"ID":1,"Type":1,"Description":"This is a notice","CreatedUnix":1588568886} diff --git a/internal/database/two_factor.go b/internal/database/two_factor.go new file mode 100644 index 00000000000..9e5b716e7f1 --- /dev/null +++ b/internal/database/two_factor.go @@ -0,0 +1,107 @@ +package database + +import ( + "encoding/base64" + "fmt" + "time" + + "github.com/cockroachdb/errors" + "github.com/pquerna/otp/totp" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/cryptox" +) + +// TwoFactor is a 2FA token of a user. +type TwoFactor struct { + ID int64 `gorm:"primaryKey"` + UserID int64 `xorm:"UNIQUE" gorm:"unique"` + Secret string + Created time.Time `xorm:"-" gorm:"-" json:"-"` + CreatedUnix int64 +} + +// ValidateTOTP returns true if given passcode is valid for two-factor authentication token. +// It also returns possible validation error. +func (t *TwoFactor) ValidateTOTP(passcode string) (bool, error) { + secret, err := base64.StdEncoding.DecodeString(t.Secret) + if err != nil { + return false, errors.Newf("DecodeString: %v", err) + } + decryptSecret, err := cryptox.AESGCMDecrypt(cryptox.MD5Bytes(conf.Security.SecretKey), secret) + if err != nil { + return false, errors.Newf("AESGCMDecrypt: %v", err) + } + return totp.Validate(passcode, string(decryptSecret)), nil +} + +// DeleteTwoFactor removes two-factor authentication token and recovery codes of given user. +func DeleteTwoFactor(userID int64) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Where("user_id = ?", userID).Delete(new(TwoFactor)); err != nil { + return errors.Newf("delete two-factor: %v", err) + } else if err = deleteRecoveryCodesByUserID(sess, userID); err != nil { + return errors.Newf("deleteRecoveryCodesByUserID: %v", err) + } + + return sess.Commit() +} + +// TwoFactorRecoveryCode represents a two-factor authentication recovery code. +type TwoFactorRecoveryCode struct { + ID int64 + UserID int64 + Code string `xorm:"VARCHAR(11)"` + IsUsed bool +} + +// GetRecoveryCodesByUserID returns all recovery codes of given user. +func GetRecoveryCodesByUserID(userID int64) ([]*TwoFactorRecoveryCode, error) { + recoveryCodes := make([]*TwoFactorRecoveryCode, 0, 10) + return recoveryCodes, x.Where("user_id = ?", userID).Find(&recoveryCodes) +} + +func deleteRecoveryCodesByUserID(e Engine, userID int64) error { + _, err := e.Where("user_id = ?", userID).Delete(new(TwoFactorRecoveryCode)) + return err +} + +// RegenerateRecoveryCodes regenerates new set of recovery codes for given user. +func RegenerateRecoveryCodes(userID int64) error { + recoveryCodes, err := generateRecoveryCodes(userID, 10) + if err != nil { + return errors.Newf("generateRecoveryCodes: %v", err) + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if err = deleteRecoveryCodesByUserID(sess, userID); err != nil { + return errors.Newf("deleteRecoveryCodesByUserID: %v", err) + } else if _, err = sess.Insert(recoveryCodes); err != nil { + return errors.Newf("insert new recovery codes: %v", err) + } + + return sess.Commit() +} + +type ErrTwoFactorRecoveryCodeNotFound struct { + Code string +} + +func IsTwoFactorRecoveryCodeNotFound(err error) bool { + _, ok := err.(ErrTwoFactorRecoveryCodeNotFound) + return ok +} + +func (err ErrTwoFactorRecoveryCodeNotFound) Error() string { + return fmt.Sprintf("two-factor recovery code does not found [code: %s]", err.Code) +} diff --git a/internal/database/two_factors.go b/internal/database/two_factors.go new file mode 100644 index 00000000000..c38cbcd1ccb --- /dev/null +++ b/internal/database/two_factors.go @@ -0,0 +1,149 @@ +package database + +import ( + "context" + "encoding/base64" + "fmt" + "strings" + "time" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/cryptox" + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/strx" +) + +// BeforeCreate implements the GORM create hook. +func (t *TwoFactor) BeforeCreate(tx *gorm.DB) error { + if t.CreatedUnix == 0 { + t.CreatedUnix = tx.NowFunc().Unix() + } + return nil +} + +// AfterFind implements the GORM query hook. +func (t *TwoFactor) AfterFind(_ *gorm.DB) error { + t.Created = time.Unix(t.CreatedUnix, 0).Local() + return nil +} + +// TwoFactorsStore is the storage layer for two-factor authentication settings. +type TwoFactorsStore struct { + db *gorm.DB +} + +func newTwoFactorsStore(db *gorm.DB) *TwoFactorsStore { + return &TwoFactorsStore{db: db} +} + +// Create creates a new 2FA token and recovery codes for given user. The "key" +// is used to encrypt and later decrypt given "secret", which should be +// configured in site-level and change of the "key" will break all existing 2FA +// tokens. +func (s *TwoFactorsStore) Create(ctx context.Context, userID int64, key, secret string) error { + encrypted, err := cryptox.AESGCMEncrypt(cryptox.MD5Bytes(key), []byte(secret)) + if err != nil { + return errors.Wrap(err, "encrypt secret") + } + tf := &TwoFactor{ + UserID: userID, + Secret: base64.StdEncoding.EncodeToString(encrypted), + } + + recoveryCodes, err := generateRecoveryCodes(userID, 10) + if err != nil { + return errors.Wrap(err, "generate recovery codes") + } + + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + err := tx.Create(tf).Error + if err != nil { + return err + } + + return tx.Create(&recoveryCodes).Error + }) +} + +var _ errx.NotFound = (*ErrTwoFactorNotFound)(nil) + +type ErrTwoFactorNotFound struct { + args errx.Args +} + +func IsErrTwoFactorNotFound(err error) bool { + return errors.As(err, &ErrTwoFactorNotFound{}) +} + +func (err ErrTwoFactorNotFound) Error() string { + return fmt.Sprintf("2FA does not found: %v", err.args) +} + +func (ErrTwoFactorNotFound) NotFound() bool { + return true +} + +// GetByUserID returns the 2FA token of given user. It returns +// ErrTwoFactorNotFound when not found. +func (s *TwoFactorsStore) GetByUserID(ctx context.Context, userID int64) (*TwoFactor, error) { + tf := new(TwoFactor) + err := s.db.WithContext(ctx).Where("user_id = ?", userID).First(tf).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrTwoFactorNotFound{args: errx.Args{"userID": userID}} + } + return nil, err + } + return tf, nil +} + +// IsEnabled returns true if the user has enabled 2FA. +func (s *TwoFactorsStore) IsEnabled(ctx context.Context, userID int64) bool { + var count int64 + err := s.db.WithContext(ctx).Model(new(TwoFactor)).Where("user_id = ?", userID).Count(&count).Error + if err != nil { + log.Error("Failed to count two factors [user_id: %d]: %v", userID, err) + } + return count > 0 +} + +// UseRecoveryCode validates a recovery code of given user and marks it as used +// if valid. It returns ErrTwoFactorRecoveryCodeNotFound if the code is invalid +// or already used. +func (s *TwoFactorsStore) UseRecoveryCode(ctx context.Context, userID int64, code string) error { + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + var recoveryCode TwoFactorRecoveryCode + err := tx.Where("user_id = ? AND code = ? AND is_used = ?", userID, code, false).First(&recoveryCode).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return ErrTwoFactorRecoveryCodeNotFound{Code: code} + } + return errors.Wrap(err, "get unused recovery code") + } + + err = tx.Model(&recoveryCode).Update("is_used", true).Error + if err != nil { + return errors.Wrap(err, "mark recovery code as used") + } + return nil + }) +} + +// generateRecoveryCodes generates N number of recovery codes for 2FA. +func generateRecoveryCodes(userID int64, n int) ([]*TwoFactorRecoveryCode, error) { + recoveryCodes := make([]*TwoFactorRecoveryCode, n) + for i := range n { + code, err := strx.RandomChars(10) + if err != nil { + return nil, errors.Wrap(err, "generate random characters") + } + recoveryCodes[i] = &TwoFactorRecoveryCode{ + UserID: userID, + Code: strings.ToLower(code[:5] + "-" + code[5:]), + } + } + return recoveryCodes, nil +} diff --git a/internal/database/two_factors_test.go b/internal/database/two_factors_test.go new file mode 100644 index 00000000000..745f073e6b9 --- /dev/null +++ b/internal/database/two_factors_test.go @@ -0,0 +1,183 @@ +package database + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gorm.io/gorm" + + "gogs.io/gogs/internal/errx" +) + +func TestTwoFactor_BeforeCreate(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + t.Run("CreatedUnix has been set", func(t *testing.T) { + tf := &TwoFactor{ + CreatedUnix: 1, + } + _ = tf.BeforeCreate(db) + assert.Equal(t, int64(1), tf.CreatedUnix) + }) + + t.Run("CreatedUnix has not been set", func(t *testing.T) { + tf := &TwoFactor{} + _ = tf.BeforeCreate(db) + assert.Equal(t, db.NowFunc().Unix(), tf.CreatedUnix) + }) +} + +func TestTwoFactor_AfterFind(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + tf := &TwoFactor{ + CreatedUnix: now.Unix(), + } + _ = tf.AfterFind(db) + assert.Equal(t, tf.CreatedUnix, tf.Created.Unix()) +} + +func TestTwoFactors(t *testing.T) { + if testing.Short() { + t.Skip() + } + t.Parallel() + + ctx := context.Background() + s := &TwoFactorsStore{ + db: newTestDB(t, "TwoFactorsStore"), + } + + for _, tc := range []struct { + name string + test func(t *testing.T, ctx context.Context, s *TwoFactorsStore) + }{ + {"Create", twoFactorsCreate}, + {"GetByUserID", twoFactorsGetByUserID}, + {"IsEnabled", twoFactorsIsEnabled}, + {"UseRecoveryCode", twoFactorsUseRecoveryCode}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := clearTables(t, s.db) + require.NoError(t, err) + }) + tc.test(t, ctx, s) + }) + if t.Failed() { + break + } + } +} + +func twoFactorsCreate(t *testing.T, ctx context.Context, s *TwoFactorsStore) { + // Create a 2FA token + err := s.Create(ctx, 1, "secure-key", "secure-secret") + require.NoError(t, err) + + // Get it back and check the Created field + tf, err := s.GetByUserID(ctx, 1) + require.NoError(t, err) + assert.Equal(t, s.db.NowFunc().Format(time.RFC3339), tf.Created.UTC().Format(time.RFC3339)) + + // Verify there are 10 recover codes generated + var count int64 + err = s.db.Model(new(TwoFactorRecoveryCode)).Count(&count).Error + require.NoError(t, err) + assert.Equal(t, int64(10), count) +} + +func twoFactorsGetByUserID(t *testing.T, ctx context.Context, s *TwoFactorsStore) { + // Create a 2FA token for user 1 + err := s.Create(ctx, 1, "secure-key", "secure-secret") + require.NoError(t, err) + + // We should be able to get it back + _, err = s.GetByUserID(ctx, 1) + require.NoError(t, err) + + // Try to get a non-existent 2FA token + _, err = s.GetByUserID(ctx, 2) + wantErr := ErrTwoFactorNotFound{args: errx.Args{"userID": int64(2)}} + assert.Equal(t, wantErr, err) +} + +func twoFactorsIsEnabled(t *testing.T, ctx context.Context, s *TwoFactorsStore) { + // Create a 2FA token for user 1 + err := s.Create(ctx, 1, "secure-key", "secure-secret") + require.NoError(t, err) + + assert.True(t, s.IsEnabled(ctx, 1)) + assert.False(t, s.IsEnabled(ctx, 2)) +} + +func twoFactorsUseRecoveryCode(t *testing.T, ctx context.Context, s *TwoFactorsStore) { + // Create 2FA tokens for two users + err := s.Create(ctx, 1, "secure-key", "secure-secret") + require.NoError(t, err) + err = s.Create(ctx, 2, "secure-key", "secure-secret") + require.NoError(t, err) + + // Get recovery codes for both users + var user1Codes []TwoFactorRecoveryCode + err = s.db.Where("user_id = ?", 1).Find(&user1Codes).Error + require.NoError(t, err) + require.NotEmpty(t, user1Codes) + + var user2Codes []TwoFactorRecoveryCode + err = s.db.Where("user_id = ?", 2).Find(&user2Codes).Error + require.NoError(t, err) + require.NotEmpty(t, user2Codes) + + // User 1 should be able to use their own recovery code + err = s.UseRecoveryCode(ctx, 1, user1Codes[0].Code) + require.NoError(t, err) + + // Verify the code is now marked as used + var usedCode TwoFactorRecoveryCode + err = s.db.Where("id = ?", user1Codes[0].ID).First(&usedCode).Error + require.NoError(t, err) + assert.True(t, usedCode.IsUsed) + + // User 1 should NOT be able to use user 2's recovery code + // This is the key security test - recovery codes must be scoped by user + err = s.UseRecoveryCode(ctx, 1, user2Codes[0].Code) + assert.True(t, IsTwoFactorRecoveryCodeNotFound(err), "expected recovery code not found error when using another user's code") + + // User 2's code should still be unused + var user2Code TwoFactorRecoveryCode + err = s.db.Where("id = ?", user2Codes[0].ID).First(&user2Code).Error + require.NoError(t, err) + assert.False(t, user2Code.IsUsed, "user 2's recovery code should not be marked as used") + + // User 2 should be able to use their own code + err = s.UseRecoveryCode(ctx, 2, user2Codes[0].Code) + require.NoError(t, err) + + // Using an already-used code should fail + err = s.UseRecoveryCode(ctx, 1, user1Codes[0].Code) + assert.True(t, IsTwoFactorRecoveryCodeNotFound(err), "expected error when reusing a recovery code") + + // Using a non-existent code should fail + err = s.UseRecoveryCode(ctx, 1, "invalid-code") + assert.True(t, IsTwoFactorRecoveryCodeNotFound(err), "expected error for invalid recovery code") +} diff --git a/internal/database/update.go b/internal/database/update.go new file mode 100644 index 00000000000..a43c5fafbd9 --- /dev/null +++ b/internal/database/update.go @@ -0,0 +1,140 @@ +package database + +import ( + "context" + "os/exec" + "strings" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" +) + +// CommitToPushCommit transforms a git.Commit to PushCommit type. +func CommitToPushCommit(commit *git.Commit) *PushCommit { + return &PushCommit{ + Sha1: commit.ID.String(), + Message: commit.Message, + AuthorEmail: commit.Author.Email, + AuthorName: commit.Author.Name, + CommitterEmail: commit.Committer.Email, + CommitterName: commit.Committer.Name, + Timestamp: commit.Committer.When, + } +} + +func CommitsToPushCommits(commits []*git.Commit) *PushCommits { + if len(commits) == 0 { + return &PushCommits{} + } + + pcs := make([]*PushCommit, len(commits)) + for i := range commits { + pcs[i] = CommitToPushCommit(commits[i]) + } + return &PushCommits{len(pcs), pcs, "", nil} +} + +type PushUpdateOptions struct { + OldCommitID string + NewCommitID string + FullRefspec string + PusherID int64 + PusherName string + RepoUserName string + RepoName string +} + +// PushUpdate must be called for any push actions in order to generate necessary +// push action history feeds. +func PushUpdate(opts PushUpdateOptions) (err error) { + ctx := context.TODO() + + isNewRef := strings.HasPrefix(opts.OldCommitID, git.EmptyID) + isDelRef := strings.HasPrefix(opts.NewCommitID, git.EmptyID) + if isNewRef && isDelRef { + return errors.Newf("both old and new revisions are %q", git.EmptyID) + } + + repoPath := RepoPath(opts.RepoUserName, opts.RepoName) + + gitUpdate := exec.Command("git", "update-server-info") + gitUpdate.Dir = repoPath + if err = gitUpdate.Run(); err != nil { + return errors.Newf("run 'git update-server-info': %v", err) + } + + gitRepo, err := git.Open(repoPath) + if err != nil { + return errors.Newf("open repository: %v", err) + } + + owner, err := Handle.Users().GetByUsername(ctx, opts.RepoUserName) + if err != nil { + return errors.Newf("GetUserByName: %v", err) + } + + repo, err := GetRepositoryByName(owner.ID, opts.RepoName) + if err != nil { + return errors.Newf("GetRepositoryByName: %v", err) + } + + if err = repo.UpdateSize(); err != nil { + return errors.Newf("UpdateSize: %v", err) + } + + // Push tags + if strings.HasPrefix(opts.FullRefspec, git.RefsTags) { + err := Handle.Actions().PushTag(ctx, + PushTagOptions{ + Owner: owner, + Repo: repo, + PusherName: opts.PusherName, + RefFullName: opts.FullRefspec, + NewCommitID: opts.NewCommitID, + }, + ) + if err != nil { + return errors.Wrap(err, "create action for push tag") + } + return nil + } + + var commits []*git.Commit + // Skip read parent commits when delete branch + if !isDelRef { + // Push new branch + newCommit, err := gitRepo.CatFileCommit(opts.NewCommitID) + if err != nil { + return errors.Newf("GetCommit [commit_id: %s]: %v", opts.NewCommitID, err) + } + + if isNewRef { + commits, err = newCommit.Ancestors(git.LogOptions{MaxCount: 9}) + if err != nil { + return errors.Newf("CommitsBeforeLimit [commit_id: %s]: %v", newCommit.ID, err) + } + commits = append([]*git.Commit{newCommit}, commits...) + } else { + commits, err = newCommit.CommitsAfter(opts.OldCommitID) + if err != nil { + return errors.Newf("CommitsBeforeUntil [commit_id: %s]: %v", opts.OldCommitID, err) + } + } + } + + err = Handle.Actions().CommitRepo(ctx, + CommitRepoOptions{ + Owner: owner, + Repo: repo, + PusherName: opts.PusherName, + RefFullName: opts.FullRefspec, + OldCommitID: opts.OldCommitID, + NewCommitID: opts.NewCommitID, + Commits: CommitsToPushCommits(commits), + }, + ) + if err != nil { + return errors.Wrap(err, "create action for commit push") + } + return nil +} diff --git a/internal/database/users.go b/internal/database/users.go new file mode 100644 index 00000000000..e9728c0b7ef --- /dev/null +++ b/internal/database/users.go @@ -0,0 +1,1590 @@ +package database + +import ( + "context" + "database/sql" + "fmt" + "os" + "regexp" + "strings" + "time" + "unicode/utf8" + + "github.com/cockroachdb/errors" + "gorm.io/gorm" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/cryptox" + "gogs.io/gogs/internal/dbx" + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/repox" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" + "gogs.io/gogs/internal/strx" + "gogs.io/gogs/internal/tool" + "gogs.io/gogs/internal/userx" +) + +// UsersStore is the storage layer for users. +type UsersStore struct { + db *gorm.DB +} + +func newUsersStore(db *gorm.DB) *UsersStore { + return &UsersStore{db: db} +} + +type ErrLoginSourceMismatch struct { + args errx.Args +} + +// IsErrLoginSourceMismatch returns true if the underlying error has the type +// ErrLoginSourceMismatch. +func IsErrLoginSourceMismatch(err error) bool { + return errors.As(err, &ErrLoginSourceMismatch{}) +} + +func (err ErrLoginSourceMismatch) Error() string { + return fmt.Sprintf("login source mismatch: %v", err.args) +} + +// disallowedUsernameChars matches any character not allowed in a username: +// anything outside ASCII letters, digits, underscore, hyphen, or dot. +var disallowedUsernameChars = regexp.MustCompile(`[^\d\w-_\.]`) + +// Authenticate validates username and password via given login source ID. It +// returns ErrUserNotExist when the user was not found. +// +// When the "loginSourceID" is negative, it aborts the process and returns +// ErrUserNotExist if the user was not found in the database. +// +// When the "loginSourceID" is non-negative, it returns ErrLoginSourceMismatch +// if the user has different login source ID than the "loginSourceID". +// +// When the "loginSourceID" is positive, it tries to authenticate via given +// login source and creates a new user when not yet exists in the database. +func (s *UsersStore) Authenticate(ctx context.Context, login, password string, loginSourceID int64) (*User, error) { + login = strings.ToLower(login) + + query := s.db.WithContext(ctx) + if strings.Contains(login, "@") { + query = query.Where("email = ?", login) + } else { + query = query.Where("lower_name = ?", login) + } + + user := new(User) + err := query.First(user).Error + if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + return nil, errors.Wrap(err, "get user") + } + + var authSourceID int64 // The login source ID will be used to authenticate the user + createNewUser := false // Whether to create a new user after successful authentication + + // User found in the database + if err == nil { + // Note: This check is unnecessary but to reduce user confusion at login page + // and make it more consistent from user's perspective. + if loginSourceID >= 0 && user.LoginSource != loginSourceID { + return nil, ErrLoginSourceMismatch{args: errx.Args{"expect": loginSourceID, "actual": user.LoginSource}} + } + + // Validate password hash fetched from database for local accounts. + if user.IsLocal() { + if userx.ValidatePassword(user.Password, user.Salt, password) { + return user, nil + } + + return nil, auth.ErrBadCredentials{Args: map[string]any{"login": login, "userID": user.ID}} + } + + authSourceID = user.LoginSource + + } else { + // Non-local login source is always greater than 0. + if loginSourceID <= 0 { + return nil, auth.ErrBadCredentials{Args: map[string]any{"login": login}} + } + + authSourceID = loginSourceID + createNewUser = true + } + + source, err := newLoginSourcesStore(s.db, loadedLoginSourceFilesStore).GetByID(ctx, authSourceID) + if err != nil { + return nil, errors.Wrap(err, "get login source") + } + + if !source.IsActived { + return nil, errors.Errorf("login source %d is not activated", source.ID) + } + + extAccount, err := source.Provider.Authenticate(login, password) + if err != nil { + return nil, err + } + + if !createNewUser { + return user, nil + } + + // Validate username make sure it satisfies requirement. + if disallowedUsernameChars.MatchString(extAccount.Name) { + return nil, errors.Newf("invalid pattern for attribute 'username' [%s]: must be valid alpha or numeric or dash(-_) or dot characters", extAccount.Name) + } + + return s.Create(ctx, extAccount.Name, extAccount.Email, + CreateUserOptions{ + FullName: extAccount.FullName, + LoginSource: authSourceID, + LoginName: extAccount.Login, + Location: extAccount.Location, + Website: extAccount.Website, + Activated: true, + Admin: extAccount.Admin, + }, + ) +} + +// ChangeUsername changes the username of the given user and updates all +// references to the old username. It returns ErrNameNotAllowed if the given +// name or pattern of the name is not allowed as a username, or +// ErrUserAlreadyExist when another user with same name already exists. +func (s *UsersStore) ChangeUsername(ctx context.Context, userID int64, newUsername string) error { + err := isUsernameAllowed(newUsername) + if err != nil { + return err + } + + if s.IsUsernameUsed(ctx, newUsername, userID) { + return ErrUserAlreadyExist{ + args: errx.Args{ + "name": newUsername, + }, + } + } + + user, err := s.GetByID(ctx, userID) + if err != nil { + return errors.Wrap(err, "get user") + } + + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + err := tx.Model(&User{}). + Where("id = ?", user.ID). + Updates(map[string]any{ + "lower_name": strings.ToLower(newUsername), + "name": newUsername, + "updated_unix": tx.NowFunc().Unix(), + }).Error + if err != nil { + return errors.Wrap(err, "update user name") + } + + // Stop here if it's just a case-change of the username + if strings.EqualFold(user.Name, newUsername) { + return nil + } + + // Update all references to the user name in pull requests + err = tx.Model(&PullRequest{}). + Where("head_user_name = ?", user.LowerName). + Update("head_user_name", strings.ToLower(newUsername)). + Error + if err != nil { + return errors.Wrap(err, `update "pull_request.head_user_name"`) + } + + // Delete local copies of repositories and their wikis that are owned by the user + rows, err := tx.Model(&Repository{}).Where("owner_id = ?", user.ID).Rows() + if err != nil { + return errors.Wrap(err, "iterate repositories") + } + defer func() { _ = rows.Close() }() + + for rows.Next() { + var repo struct { + ID int64 + } + err = tx.ScanRows(rows, &repo) + if err != nil { + return errors.Wrap(err, "scan rows") + } + + deleteRepoLocalCopy(repo.ID) + RemoveAllWithNotice(fmt.Sprintf("Delete repository %d wiki local copy", repo.ID), repox.RepositoryLocalWikiPath(repo.ID)) + } + if err = rows.Err(); err != nil { + return errors.Wrap(err, "check rows.Err") + } + + // Rename user directory if exists + userPath := repox.UserPath(user.Name) + if osx.Exist(userPath) { + newUserPath := repox.UserPath(newUsername) + err = os.Rename(userPath, newUserPath) + if err != nil { + return errors.Wrap(err, "rename user directory") + } + } + return nil + }) +} + +// Count returns the total number of users. +func (s *UsersStore) Count(ctx context.Context) int64 { + var count int64 + s.db.WithContext(ctx).Model(&User{}).Where("type = ?", UserTypeIndividual).Count(&count) + return count +} + +type CreateUserOptions struct { + FullName string + Password string + LoginSource int64 + LoginName string + Location string + Website string + Activated bool + Admin bool +} + +type ErrUserAlreadyExist struct { + args errx.Args +} + +// IsErrUserAlreadyExist returns true if the underlying error has the type +// ErrUserAlreadyExist. +func IsErrUserAlreadyExist(err error) bool { + return errors.As(err, &ErrUserAlreadyExist{}) +} + +func (err ErrUserAlreadyExist) Error() string { + return fmt.Sprintf("user already exists: %v", err.args) +} + +type ErrEmailAlreadyUsed struct { + args errx.Args +} + +// IsErrEmailAlreadyUsed returns true if the underlying error has the type +// ErrEmailAlreadyUsed. +func IsErrEmailAlreadyUsed(err error) bool { + return errors.As(err, &ErrEmailAlreadyUsed{}) +} + +func (err ErrEmailAlreadyUsed) Email() string { + email, ok := err.args["email"].(string) + if ok { + return email + } + return "" +} + +func (err ErrEmailAlreadyUsed) Error() string { + return fmt.Sprintf("email has been used: %v", err.args) +} + +// Create creates a new user and persists to database. It returns +// ErrNameNotAllowed if the given name or pattern of the name is not allowed as +// a username, or ErrUserAlreadyExist when a user with same name already exists, +// or ErrEmailAlreadyUsed if the email has been verified by another user. +func (s *UsersStore) Create(ctx context.Context, username, email string, opts CreateUserOptions) (*User, error) { + err := isUsernameAllowed(username) + if err != nil { + return nil, err + } + + if s.IsUsernameUsed(ctx, username, 0) { + return nil, ErrUserAlreadyExist{ + args: errx.Args{ + "name": username, + }, + } + } + + email = strings.ToLower(strings.TrimSpace(email)) + _, err = s.GetByEmail(ctx, email) + if err == nil { + return nil, ErrEmailAlreadyUsed{ + args: errx.Args{ + "email": email, + }, + } + } else if !IsErrUserNotExist(err) { + return nil, err + } + + user := &User{ + LowerName: strings.ToLower(username), + Name: username, + FullName: opts.FullName, + Email: email, + Password: opts.Password, + LoginSource: opts.LoginSource, + LoginName: opts.LoginName, + Location: opts.Location, + Website: opts.Website, + MaxRepoCreation: -1, + IsActive: opts.Activated, + IsAdmin: opts.Admin, + Avatar: cryptox.MD5(email), // Gravatar URL uses the MD5 hash of the email, see https://en.gravatar.com/site/implement/hash/ + AvatarEmail: email, + } + + user.Rands, err = userx.RandomSalt() + if err != nil { + return nil, err + } + user.Salt, err = userx.RandomSalt() + if err != nil { + return nil, err + } + user.Password = userx.EncodePassword(user.Password, user.Salt) + + return user, s.db.WithContext(ctx).Create(user).Error +} + +// DeleteCustomAvatar deletes the current user custom avatar and falls back to +// use look up avatar by email. +func (s *UsersStore) DeleteCustomAvatar(ctx context.Context, userID int64) error { + _ = os.Remove(userx.CustomAvatarPath(userID)) + return s.db.WithContext(ctx). + Model(&User{}). + Where("id = ?", userID). + Updates(map[string]any{ + "use_custom_avatar": false, + "updated_unix": s.db.NowFunc().Unix(), + }). + Error +} + +type ErrUserOwnRepos struct { + args errx.Args +} + +// IsErrUserOwnRepos returns true if the underlying error has the type +// ErrUserOwnRepos. +func IsErrUserOwnRepos(err error) bool { + return errors.As(err, &ErrUserOwnRepos{}) +} + +func (err ErrUserOwnRepos) Error() string { + return fmt.Sprintf("user still has repository ownership: %v", err.args) +} + +type ErrUserHasOrgs struct { + args errx.Args +} + +// IsErrUserHasOrgs returns true if the underlying error has the type +// ErrUserHasOrgs. +func IsErrUserHasOrgs(err error) bool { + return errors.As(err, &ErrUserHasOrgs{}) +} + +func (err ErrUserHasOrgs) Error() string { + return fmt.Sprintf("user still has organization membership: %v", err.args) +} + +// DeleteByID deletes the given user and all their resources. It returns +// ErrUserOwnRepos when the user still has repository ownership, or returns +// ErrUserHasOrgs when the user still has organization membership. It is more +// performant to skip rewriting the "authorized_keys" file for individual +// deletion in a batch operation. +func (s *UsersStore) DeleteByID(ctx context.Context, userID int64, skipRewriteAuthorizedKeys bool) error { + user, err := s.GetByID(ctx, userID) + if err != nil { + if IsErrUserNotExist(err) { + return nil + } + return errors.Wrap(err, "get user") + } + + // Double-check the user is not a direct owner of any repository and not a + // member of any organization. + var count int64 + err = s.db.WithContext(ctx).Model(&Repository{}).Where("owner_id = ?", userID).Count(&count).Error + if err != nil { + return errors.Wrap(err, "count repositories") + } else if count > 0 { + return ErrUserOwnRepos{args: errx.Args{"userID": userID}} + } + + err = s.db.WithContext(ctx).Model(&OrgUser{}).Where("uid = ?", userID).Count(&count).Error + if err != nil { + return errors.Wrap(err, "count organization membership") + } else if count > 0 { + return ErrUserHasOrgs{args: errx.Args{"userID": userID}} + } + + needsRewriteAuthorizedKeys := false + err = s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + /* + Equivalent SQL for PostgreSQL: + + UPDATE repository + SET num_watches = num_watches - 1 + WHERE id IN ( + SELECT repo_id FROM watch WHERE user_id = @userID + ) + */ + err = tx.Table("repository"). + Where("id IN (?)", tx. + Select("repo_id"). + Table("watch"). + Where("user_id = ?", userID), + ). + UpdateColumn("num_watches", gorm.Expr("num_watches - 1")). + Error + if err != nil { + return errors.Wrap(err, `decrease "repository.num_watches"`) + } + + /* + Equivalent SQL for PostgreSQL: + + UPDATE repository + SET num_stars = num_stars - 1 + WHERE id IN ( + SELECT repo_id FROM star WHERE uid = @userID + ) + */ + err = tx.Table("repository"). + Where("id IN (?)", tx. + Select("repo_id"). + Table("star"). + Where("uid = ?", userID), + ). + UpdateColumn("num_stars", gorm.Expr("num_stars - 1")). + Error + if err != nil { + return errors.Wrap(err, `decrease "repository.num_stars"`) + } + + /* + Equivalent SQL for PostgreSQL: + + UPDATE user + SET num_followers = num_followers - 1 + WHERE id IN ( + SELECT follow_id FROM follow WHERE user_id = @userID + ) + */ + err = tx.Table("user"). + Where("id IN (?)", tx. + Select("follow_id"). + Table("follow"). + Where("user_id = ?", userID), + ). + UpdateColumn("num_followers", gorm.Expr("num_followers - 1")). + Error + if err != nil { + return errors.Wrap(err, `decrease "user.num_followers"`) + } + + /* + Equivalent SQL for PostgreSQL: + + UPDATE user + SET num_following = num_following - 1 + WHERE id IN ( + SELECT user_id FROM follow WHERE follow_id = @userID + ) + */ + err = tx.Table("user"). + Where("id IN (?)", tx. + Select("user_id"). + Table("follow"). + Where("follow_id = ?", userID), + ). + UpdateColumn("num_following", gorm.Expr("num_following - 1")). + Error + if err != nil { + return errors.Wrap(err, `decrease "user.num_following"`) + } + + if !skipRewriteAuthorizedKeys { + // We need to rewrite "authorized_keys" file if the user owns any public keys. + needsRewriteAuthorizedKeys = tx.Where("owner_id = ?", userID).First(&PublicKey{}).Error != gorm.ErrRecordNotFound + } + + err = tx.Model(&Issue{}).Where("assignee_id = ?", userID).Update("assignee_id", 0).Error + if err != nil { + return errors.Wrap(err, "clear assignees") + } + + for _, t := range []struct { + table any + where string + }{ + {&Watch{}, "user_id = @userID"}, + {&Star{}, "uid = @userID"}, + {&Follow{}, "user_id = @userID OR follow_id = @userID"}, + {&PublicKey{}, "owner_id = @userID"}, + + {&AccessToken{}, "uid = @userID"}, + {&Collaboration{}, "user_id = @userID"}, + {&Access{}, "user_id = @userID"}, + {&Action{}, "user_id = @userID"}, + {&IssueUser{}, "uid = @userID"}, + {&EmailAddress{}, "uid = @userID"}, + {&User{}, "id = @userID"}, + } { + err = tx.Where(t.where, sql.Named("userID", userID)).Delete(t.table).Error + if err != nil { + return errors.Wrapf(err, "clean up table %T", t.table) + } + } + return nil + }) + if err != nil { + return err + } + + _ = os.RemoveAll(repox.UserPath(user.Name)) + _ = os.Remove(userx.CustomAvatarPath(userID)) + + if needsRewriteAuthorizedKeys { + err = newPublicKeysStore(s.db).RewriteAuthorizedKeys() + if err != nil { + return errors.Wrap(err, `rewrite "authorized_keys" file`) + } + } + return nil +} + +// DeleteInactivated deletes all inactivated users. +// +// NOTE: We do not take context.Context here because this operation in practice +// could much longer than the general request timeout (e.g. one minute). +func (s *UsersStore) DeleteInactivated() error { + var userIDs []int64 + err := s.db.Model(&User{}).Where("is_active = ?", false).Pluck("id", &userIDs).Error + if err != nil { + return errors.Wrap(err, "get inactivated user IDs") + } + + for _, userID := range userIDs { + err = s.DeleteByID(context.Background(), userID, true) + if err != nil { + // Skip users that may had set to inactivated by admins. + if IsErrUserOwnRepos(err) || IsErrUserHasOrgs(err) { + continue + } + return errors.Wrapf(err, "delete user with ID %d", userID) + } + } + err = newPublicKeysStore(s.db).RewriteAuthorizedKeys() + if err != nil { + return errors.Wrap(err, `rewrite "authorized_keys" file`) + } + return nil +} + +func (*UsersStore) recountFollows(tx *gorm.DB, userID, followID int64) error { + /* + Equivalent SQL for PostgreSQL: + + UPDATE "user" + SET num_followers = ( + SELECT COUNT(*) FROM follow WHERE follow_id = @followID + ) + WHERE id = @followID + */ + err := tx.Model(&User{}). + Where("id = ?", followID). + Update( + "num_followers", + tx.Model(&Follow{}).Select("COUNT(*)").Where("follow_id = ?", followID), + ). + Error + if err != nil { + return errors.Wrap(err, `update "user.num_followers"`) + } + + /* + Equivalent SQL for PostgreSQL: + + UPDATE "user" + SET num_following = ( + SELECT COUNT(*) FROM follow WHERE user_id = @userID + ) + WHERE id = @userID + */ + err = tx.Model(&User{}). + Where("id = ?", userID). + Update( + "num_following", + tx.Model(&Follow{}).Select("COUNT(*)").Where("user_id = ?", userID), + ). + Error + if err != nil { + return errors.Wrap(err, `update "user.num_following"`) + } + return nil +} + +// Follow marks the user to follow the other user. +func (s *UsersStore) Follow(ctx context.Context, userID, followID int64) error { + if userID == followID { + return nil + } + + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + f := &Follow{ + UserID: userID, + FollowID: followID, + } + result := tx.FirstOrCreate(f, f) + if result.Error != nil { + return errors.Wrap(result.Error, "upsert") + } else if result.RowsAffected <= 0 { + return nil // Relation already exists + } + + return s.recountFollows(tx, userID, followID) + }) +} + +// Unfollow removes the mark the user to follow the other user. +func (s *UsersStore) Unfollow(ctx context.Context, userID, followID int64) error { + if userID == followID { + return nil + } + + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + err := tx.Where("user_id = ? AND follow_id = ?", userID, followID).Delete(&Follow{}).Error + if err != nil { + return errors.Wrap(err, "delete") + } + return s.recountFollows(tx, userID, followID) + }) +} + +// IsFollowing returns true if the user is following the other user. +func (s *UsersStore) IsFollowing(ctx context.Context, userID, followID int64) bool { + return s.db.WithContext(ctx).Where("user_id = ? AND follow_id = ?", userID, followID).First(&Follow{}).Error == nil +} + +var _ errx.NotFound = (*ErrUserNotExist)(nil) + +type ErrUserNotExist struct { + args errx.Args +} + +// IsErrUserNotExist returns true if the underlying error has the type +// ErrUserNotExist. +func IsErrUserNotExist(err error) bool { + _, ok := errors.Cause(err).(ErrUserNotExist) + return ok +} + +func (err ErrUserNotExist) Error() string { + return fmt.Sprintf("user does not exist: %v", err.args) +} + +func (ErrUserNotExist) NotFound() bool { + return true +} + +// GetByEmail returns the user (not organization) with given email. It ignores +// records with unverified emails and returns ErrUserNotExist when not found. +func (s *UsersStore) GetByEmail(ctx context.Context, email string) (*User, error) { + if email == "" { + return nil, ErrUserNotExist{args: errx.Args{"email": email}} + } + email = strings.ToLower(email) + + /* + Equivalent SQL for PostgreSQL: + + SELECT * FROM "user" + LEFT JOIN email_address ON email_address.uid = "user".id + WHERE + "user".type = @userType + AND ( + "user".email = @email AND "user".is_active = TRUE + OR email_address.email = @email AND email_address.is_activated = TRUE + ) + */ + user := new(User) + err := s.db.WithContext(ctx). + Joins(dbx.Quote("LEFT JOIN email_address ON email_address.uid = %s.id", "user"), true). + Where(dbx.Quote("%s.type = ?", "user"), UserTypeIndividual). + Where(s.db. + Where(dbx.Quote("%[1]s.email = ? AND %[1]s.is_active = ?", "user"), email, true). + Or("email_address.email = ? AND email_address.is_activated = ?", email, true), + ). + First(&user). + Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrUserNotExist{args: errx.Args{"email": email}} + } + return nil, err + } + return user, nil +} + +// GetByID returns the user with given ID. It returns ErrUserNotExist when not +// found. +func (s *UsersStore) GetByID(ctx context.Context, id int64) (*User, error) { + user := new(User) + err := s.db.WithContext(ctx).Where("id = ?", id).First(user).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrUserNotExist{args: errx.Args{"userID": id}} + } + return nil, err + } + return user, nil +} + +// GetByUsername returns the user with given username. It returns +// ErrUserNotExist when not found. +func (s *UsersStore) GetByUsername(ctx context.Context, username string) (*User, error) { + user := new(User) + err := s.db.WithContext(ctx).Where("lower_name = ?", strings.ToLower(username)).First(user).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrUserNotExist{args: errx.Args{"name": username}} + } + return nil, err + } + return user, nil +} + +// GetByKeyID returns the owner of given public key ID. It returns +// ErrUserNotExist when not found. +func (s *UsersStore) GetByKeyID(ctx context.Context, keyID int64) (*User, error) { + user := new(User) + err := s.db.WithContext(ctx). + Joins(dbx.Quote("JOIN public_key ON public_key.owner_id = %s.id", "user")). + Where("public_key.id = ?", keyID). + First(user). + Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrUserNotExist{args: errx.Args{"keyID": keyID}} + } + return nil, err + } + return user, nil +} + +// GetMailableEmailsByUsernames returns a list of verified primary email +// addresses (where email notifications are sent to) of users with given list of +// usernames. Non-existing usernames are ignored. +func (s *UsersStore) GetMailableEmailsByUsernames(ctx context.Context, usernames []string) ([]string, error) { + emails := make([]string, 0, len(usernames)) + return emails, s.db.WithContext(ctx). + Model(&User{}). + Select("email"). + Where("lower_name IN (?) AND is_active = ?", usernames, true). + Find(&emails).Error +} + +// IsUsernameUsed returns true if the given username has been used other than +// the excluded user (a non-positive ID effectively meaning check against all +// users). +func (s *UsersStore) IsUsernameUsed(ctx context.Context, username string, excludeUserID int64) bool { + if username == "" { + return false + } + return s.db.WithContext(ctx). + Select("id"). + Where("lower_name = ? AND id != ?", strings.ToLower(username), excludeUserID). + First(&User{}). + Error != gorm.ErrRecordNotFound +} + +// List returns a list of users. Results are paginated by given page and page +// size, and sorted by primary key (id) in ascending order. +func (s *UsersStore) List(ctx context.Context, page, pageSize int) ([]*User, error) { + users := make([]*User, 0, pageSize) + return users, s.db.WithContext(ctx). + Where("type = ?", UserTypeIndividual). + Limit(pageSize).Offset((page - 1) * pageSize). + Order("id ASC"). + Find(&users). + Error +} + +// ListFollowers returns a list of users that are following the given user. +// Results are paginated by given page and page size, and sorted by the time of +// follow in descending order. +func (s *UsersStore) ListFollowers(ctx context.Context, userID int64, page, pageSize int) ([]*User, error) { + /* + Equivalent SQL for PostgreSQL: + + SELECT * FROM "user" + LEFT JOIN follow ON follow.user_id = "user".id + WHERE follow.follow_id = @userID + ORDER BY follow.id DESC + LIMIT @limit OFFSET @offset + */ + users := make([]*User, 0, pageSize) + return users, s.db.WithContext(ctx). + Joins(dbx.Quote("LEFT JOIN follow ON follow.user_id = %s.id", "user")). + Where("follow.follow_id = ?", userID). + Limit(pageSize).Offset((page - 1) * pageSize). + Order("follow.id DESC"). + Find(&users). + Error +} + +// ListFollowings returns a list of users that are followed by the given user. +// Results are paginated by given page and page size, and sorted by the time of +// follow in descending order. +func (s *UsersStore) ListFollowings(ctx context.Context, userID int64, page, pageSize int) ([]*User, error) { + /* + Equivalent SQL for PostgreSQL: + + SELECT * FROM "user" + LEFT JOIN follow ON follow.user_id = "user".id + WHERE follow.user_id = @userID + ORDER BY follow.id DESC + LIMIT @limit OFFSET @offset + */ + users := make([]*User, 0, pageSize) + return users, s.db.WithContext(ctx). + Joins(dbx.Quote("LEFT JOIN follow ON follow.follow_id = %s.id", "user")). + Where("follow.user_id = ?", userID). + Limit(pageSize).Offset((page - 1) * pageSize). + Order("follow.id DESC"). + Find(&users). + Error +} + +func searchUserByName(ctx context.Context, db *gorm.DB, userType UserType, keyword string, page, pageSize int, orderBy string) ([]*User, int64, error) { + if keyword == "" { + return []*User{}, 0, nil + } + keyword = "%" + strings.ToLower(keyword) + "%" + + tx := db.WithContext(ctx). + Where("type = ? AND (lower_name LIKE ? OR LOWER(full_name) LIKE ?)", userType, keyword, keyword) + + var count int64 + err := tx.Model(&User{}).Count(&count).Error + if err != nil { + return nil, 0, errors.Wrap(err, "count") + } + + users := make([]*User, 0, pageSize) + return users, count, tx.Order(orderBy).Limit(pageSize).Offset((page - 1) * pageSize).Find(&users).Error +} + +// SearchByName returns a list of users whose username or full name matches the +// given keyword case-insensitively. Results are paginated by given page and +// page size, and sorted by the given order (e.g. "id DESC"). A total count of +// all results is also returned. If the order is not given, it's up to the +// database to decide. +func (s *UsersStore) SearchByName(ctx context.Context, keyword string, page, pageSize int, orderBy string) ([]*User, int64, error) { + return searchUserByName(ctx, s.db, UserTypeIndividual, keyword, page, pageSize, orderBy) +} + +type UpdateUserOptions struct { + LoginSource *int64 + LoginName *string + + Password *string + // GenerateNewRands indicates whether to force generate new rands for the user. + GenerateNewRands bool + + FullName *string + Email *string + Website *string + Location *string + Description *string + + MaxRepoCreation *int + LastRepoVisibility *bool + + IsActivated *bool + IsAdmin *bool + AllowGitHook *bool + AllowImportLocal *bool + ProhibitLogin *bool + + Avatar *string + AvatarEmail *string +} + +// Update updates fields for the given user. +func (s *UsersStore) Update(ctx context.Context, userID int64, opts UpdateUserOptions) error { + updates := map[string]any{ + "updated_unix": s.db.NowFunc().Unix(), + } + + if opts.LoginSource != nil { + updates["login_source"] = *opts.LoginSource + } + if opts.LoginName != nil { + updates["login_name"] = *opts.LoginName + } + + if opts.Password != nil { + salt, err := userx.RandomSalt() + if err != nil { + return errors.Wrap(err, "generate salt") + } + updates["salt"] = salt + updates["passwd"] = userx.EncodePassword(*opts.Password, salt) + opts.GenerateNewRands = true + } + if opts.GenerateNewRands { + rands, err := userx.RandomSalt() + if err != nil { + return errors.Wrap(err, "generate rands") + } + updates["rands"] = rands + } + + if opts.FullName != nil { + updates["full_name"] = strx.Truncate(*opts.FullName, 255) + } + if opts.Email != nil { + _, err := s.GetByEmail(ctx, *opts.Email) + if err == nil { + return ErrEmailAlreadyUsed{args: errx.Args{"email": *opts.Email}} + } else if !IsErrUserNotExist(err) { + return errors.Wrap(err, "check email") + } + updates["email"] = *opts.Email + } + if opts.Website != nil { + updates["website"] = strx.Truncate(*opts.Website, 255) + } + if opts.Location != nil { + updates["location"] = strx.Truncate(*opts.Location, 255) + } + if opts.Description != nil { + updates["description"] = strx.Truncate(*opts.Description, 255) + } + + if opts.MaxRepoCreation != nil { + if *opts.MaxRepoCreation < -1 { + *opts.MaxRepoCreation = -1 + } + updates["max_repo_creation"] = *opts.MaxRepoCreation + } + if opts.LastRepoVisibility != nil { + updates["last_repo_visibility"] = *opts.LastRepoVisibility + } + + if opts.IsActivated != nil { + updates["is_active"] = *opts.IsActivated + } + if opts.IsAdmin != nil { + updates["is_admin"] = *opts.IsAdmin + } + if opts.AllowGitHook != nil { + updates["allow_git_hook"] = *opts.AllowGitHook + } + if opts.AllowImportLocal != nil { + updates["allow_import_local"] = *opts.AllowImportLocal + } + if opts.ProhibitLogin != nil { + updates["prohibit_login"] = *opts.ProhibitLogin + } + + if opts.Avatar != nil { + updates["avatar"] = strx.Truncate(*opts.Avatar, 2048) + } + if opts.AvatarEmail != nil { + updates["avatar_email"] = strx.Truncate(*opts.AvatarEmail, 255) + } + + return s.db.WithContext(ctx).Model(&User{}).Where("id = ?", userID).Updates(updates).Error +} + +// UseCustomAvatar uses the given avatar as the user custom avatar. +func (s *UsersStore) UseCustomAvatar(ctx context.Context, userID int64, avatar []byte) error { + err := userx.SaveAvatar(userID, avatar) + if err != nil { + return errors.Wrap(err, "save avatar") + } + + return s.db.WithContext(ctx). + Model(&User{}). + Where("id = ?", userID). + Updates(map[string]any{ + "use_custom_avatar": true, + "updated_unix": s.db.NowFunc().Unix(), + }). + Error +} + +// AddEmail adds a new email address to given user. It returns +// ErrEmailAlreadyUsed if the email has been verified by another user. +func (s *UsersStore) AddEmail(ctx context.Context, userID int64, email string, isActivated bool) error { + email = strings.ToLower(strings.TrimSpace(email)) + _, err := s.GetByEmail(ctx, email) + if err == nil { + return ErrEmailAlreadyUsed{ + args: errx.Args{ + "email": email, + }, + } + } else if !IsErrUserNotExist(err) { + return errors.Wrap(err, "check user by email") + } + + return s.db.WithContext(ctx).Create( + &EmailAddress{ + UserID: userID, + Email: email, + IsActivated: isActivated, + }, + ).Error +} + +var _ errx.NotFound = (*ErrEmailNotExist)(nil) + +type ErrEmailNotExist struct { + args errx.Args +} + +// IsErrEmailAddressNotExist returns true if the underlying error has the type +// ErrEmailNotExist. +func IsErrEmailAddressNotExist(err error) bool { + _, ok := errors.Cause(err).(ErrEmailNotExist) + return ok +} + +func (err ErrEmailNotExist) Error() string { + return fmt.Sprintf("email address does not exist: %v", err.args) +} + +func (ErrEmailNotExist) NotFound() bool { + return true +} + +// GetEmail returns the email address of the given user. If `needsActivated` is +// true, only activated email will be returned, otherwise, it may return +// inactivated email addresses. It returns ErrEmailNotExist when no qualified +// email is not found. +func (s *UsersStore) GetEmail(ctx context.Context, userID int64, email string, needsActivated bool) (*EmailAddress, error) { + tx := s.db.WithContext(ctx).Where("uid = ? AND email = ?", userID, email) + if needsActivated { + tx = tx.Where("is_activated = ?", true) + } + + emailAddress := new(EmailAddress) + err := tx.First(emailAddress).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEmailNotExist{ + args: errx.Args{ + "email": email, + }, + } + } + return nil, err + } + return emailAddress, nil +} + +// ListEmails returns all email addresses of the given user. It always includes +// a primary email address. +func (s *UsersStore) ListEmails(ctx context.Context, userID int64) ([]*EmailAddress, error) { + user, err := s.GetByID(ctx, userID) + if err != nil { + return nil, errors.Wrap(err, "get user") + } + + var emails []*EmailAddress + err = s.db.WithContext(ctx).Where("uid = ?", userID).Order("id ASC").Find(&emails).Error + if err != nil { + return nil, errors.Wrap(err, "list emails") + } + + isPrimaryFound := false + for _, email := range emails { + if email.Email == user.Email { + isPrimaryFound = true + email.IsPrimary = true + break + } + } + + // We always want the primary email address displayed, even if it's not in the + // email_address table yet. + if !isPrimaryFound { + emails = append(emails, &EmailAddress{ + Email: user.Email, + IsActivated: user.IsActive, + IsPrimary: true, + }) + } + return emails, nil +} + +// MarkEmailActivated marks the email address of the given user as activated, +// and new rands are generated for the user. +func (s *UsersStore) MarkEmailActivated(ctx context.Context, userID int64, email string) error { + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + err := s.db.WithContext(ctx). + Model(&EmailAddress{}). + Where("uid = ? AND email = ?", userID, email). + Update("is_activated", true). + Error + if err != nil { + return errors.Wrap(err, "mark email activated") + } + + return newUsersStore(tx).Update(ctx, userID, UpdateUserOptions{GenerateNewRands: true}) + }) +} + +type ErrEmailNotVerified struct { + args errx.Args +} + +// IsErrEmailNotVerified returns true if the underlying error has the type +// ErrEmailNotVerified. +func IsErrEmailNotVerified(err error) bool { + _, ok := errors.Cause(err).(ErrEmailNotVerified) + return ok +} + +func (err ErrEmailNotVerified) Error() string { + return fmt.Sprintf("email has not been verified: %v", err.args) +} + +// MarkEmailPrimary marks the email address of the given user as primary. It +// returns ErrEmailNotExist when the email is not found for the user, and +// ErrEmailNotActivated when the email is not activated. +func (s *UsersStore) MarkEmailPrimary(ctx context.Context, userID int64, email string) error { + var emailAddress EmailAddress + err := s.db.WithContext(ctx).Where("uid = ? AND email = ?", userID, email).First(&emailAddress).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return ErrEmailNotExist{args: errx.Args{"email": email}} + } + return errors.Wrap(err, "get email address") + } + + if !emailAddress.IsActivated { + return ErrEmailNotVerified{args: errx.Args{"email": email}} + } + + user, err := s.GetByID(ctx, userID) + if err != nil { + return errors.Wrap(err, "get user") + } + + return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { + // Make sure the former primary email doesn't disappear. + err = tx.FirstOrCreate( + &EmailAddress{ + UserID: user.ID, + Email: user.Email, + IsActivated: user.IsActive, + }, + &EmailAddress{ + UserID: user.ID, + Email: user.Email, + }, + ).Error + if err != nil { + return errors.Wrap(err, "upsert former primary email address") + } + + return tx.Model(&User{}). + Where("id = ?", user.ID). + Updates(map[string]any{ + "email": email, + "updated_unix": tx.NowFunc().Unix(), + }, + ).Error + }) +} + +// DeleteEmail deletes the email address of the given user. +func (s *UsersStore) DeleteEmail(ctx context.Context, userID int64, email string) error { + return s.db.WithContext(ctx).Where("uid = ? AND email = ?", userID, email).Delete(&EmailAddress{}).Error +} + +// UserType indicates the type of the user account. +type UserType int + +const ( + UserTypeIndividual UserType = iota // NOTE: Historic reason to make it starts at 0. + UserTypeOrganization +) + +// User represents the object of an individual or an organization. +type User struct { + ID int64 `gorm:"primaryKey"` + LowerName string `xorm:"UNIQUE NOT NULL" gorm:"unique;not null"` + Name string `xorm:"UNIQUE NOT NULL" gorm:"not null"` + FullName string + // Email is the primary email address (to be used for communication) + Email string `xorm:"NOT NULL" gorm:"not null"` + Password string `xorm:"passwd NOT NULL" gorm:"column:passwd;not null"` + LoginSource int64 `xorm:"NOT NULL DEFAULT 0" gorm:"not null;default:0"` + LoginName string + Type UserType + Location string + Website string + Rands string `xorm:"VARCHAR(10)" gorm:"type:VARCHAR(10)"` + Salt string `xorm:"VARCHAR(10)" gorm:"type:VARCHAR(10)"` + + Created time.Time `xorm:"-" gorm:"-" json:"-"` + CreatedUnix int64 + Updated time.Time `xorm:"-" gorm:"-" json:"-"` + UpdatedUnix int64 + + // Remember visibility choice for convenience, true for private + LastRepoVisibility bool + // Maximum repository creation limit, -1 means use global default + MaxRepoCreation int `xorm:"NOT NULL DEFAULT -1" gorm:"not null;default:-1"` + + // Permissions + IsActive bool // Activate primary email + IsAdmin bool + AllowGitHook bool + AllowImportLocal bool // Allow migrate repository by local path + ProhibitLogin bool + + // Avatar + Avatar string `xorm:"VARCHAR(2048) NOT NULL" gorm:"type:VARCHAR(2048);not null"` + AvatarEmail string `xorm:"NOT NULL" gorm:"not null"` + UseCustomAvatar bool + + // Counters + NumFollowers int + NumFollowing int `xorm:"NOT NULL DEFAULT 0" gorm:"not null;default:0"` + NumStars int + NumRepos int + + // For organization + Description string + NumTeams int + NumMembers int + Teams []*Team `xorm:"-" gorm:"-" json:"-"` + Members []*User `xorm:"-" gorm:"-" json:"-"` +} + +// BeforeCreate implements the GORM create hook. +func (u *User) BeforeCreate(tx *gorm.DB) error { + if u.CreatedUnix == 0 { + u.CreatedUnix = tx.NowFunc().Unix() + u.UpdatedUnix = u.CreatedUnix + } + return nil +} + +// AfterFind implements the GORM query hook. +func (u *User) AfterFind(_ *gorm.DB) error { + u.FullName = markup.Sanitize(u.FullName) + u.Created = time.Unix(u.CreatedUnix, 0).Local() + u.Updated = time.Unix(u.UpdatedUnix, 0).Local() + return nil +} + +// IsLocal returns true if the user is created as local account. +func (u *User) IsLocal() bool { + return u.LoginSource <= 0 +} + +// IsOrganization returns true if the user is an organization. +func (u *User) IsOrganization() bool { + return u.Type == UserTypeOrganization +} + +// APIFormat returns the API format of a user. +func (u *User) APIFormat() *apiv1types.User { + return &apiv1types.User{ + ID: u.ID, + UserName: u.Name, + Login: u.Name, + FullName: u.FullName, + Email: u.Email, + AvatarURL: u.AvatarURL(), + } +} + +// maxNumRepos returns the maximum number of repositories that the user can have +// direct ownership. +func (u *User) maxNumRepos() int { + if u.MaxRepoCreation <= -1 { + return conf.Repository.MaxCreationLimit + } + return u.MaxRepoCreation +} + +// canCreateRepo returns true if the user can create a repository. +func (u *User) canCreateRepo() bool { + return u.maxNumRepos() <= -1 || u.NumRepos < u.maxNumRepos() +} + +// CanCreateOrganization returns true if user can create organizations. +func (u *User) CanCreateOrganization() bool { + return !conf.Admin.DisableRegularOrgCreation || u.IsAdmin +} + +// CanEditGitHook returns true if user can edit Git hooks. +func (u *User) CanEditGitHook() bool { + return u.IsAdmin || u.AllowGitHook +} + +// CanImportLocal returns true if user can migrate repositories by local path. +func (u *User) CanImportLocal() bool { + return conf.Repository.EnableLocalPathMigration && (u.IsAdmin || u.AllowImportLocal) +} + +// DisplayName returns the full name of the user if it's not empty, returns the +// username otherwise. +func (u *User) DisplayName() string { + if len(u.FullName) > 0 { + return u.FullName + } + return u.Name +} + +// HomeURLPath returns the URL path to the user or organization home page. +// +// TODO(unknwon): This is also used in templates, which should be fixed by +// having a dedicated type `template.User` and move this to the "userx" +// package. +func (u *User) HomeURLPath() string { + return conf.Server.Subpath + "/" + u.Name +} + +// HTMLURL returns the full URL to the user or organization home page. +// +// TODO(unknwon): This is also used in templates, which should be fixed by +// having a dedicated type `template.User` and move this to the "userx" +// package. +func (u *User) HTMLURL() string { + return conf.Server.ExternalURL + u.Name +} + +// AvatarURLPath returns the URL path to the user or organization avatar. If the +// user enables Gravatar-like service, then an external URL will be returned. +// +// TODO(unknwon): This is also used in templates, which should be fixed by +// having a dedicated type `template.User` and move this to the "userx" +// package. +func (u *User) AvatarURLPath() string { + defaultURLPath := conf.UserDefaultAvatarURLPath() + if u.ID <= 0 { + return defaultURLPath + } + + hasCustomAvatar := osx.IsFile(userx.CustomAvatarPath(u.ID)) + switch { + case u.UseCustomAvatar: + if !hasCustomAvatar { + return defaultURLPath + } + return fmt.Sprintf("%s/%s/%d", conf.Server.Subpath, conf.UsersAvatarPathPrefix, u.ID) + case conf.Picture.DisableGravatar: + if !hasCustomAvatar { + if err := userx.GenerateRandomAvatar(u.ID, u.Name, u.Email); err != nil { + log.Error("Failed to generate random avatar [user_id: %d]: %v", u.ID, err) + } + } + return fmt.Sprintf("%s/%s/%d", conf.Server.Subpath, conf.UsersAvatarPathPrefix, u.ID) + } + return tool.AvatarLink(u.AvatarEmail) +} + +// AvatarURL returns the full URL to the user or organization avatar. If the +// user enables Gravatar-like service, then an external URL will be returned. +// +// TODO(unknwon): This is also used in templates, which should be fixed by +// having a dedicated type `template.User` and move this to the "userx" +// package. +func (u *User) AvatarURL() string { + link := u.AvatarURLPath() + if link[0] == '/' && link[1] != '/' { + return conf.Server.ExternalURL + strings.TrimPrefix(link, conf.Server.Subpath)[1:] + } + return link +} + +// IsFollowing returns true if the user is following the given user. +// +// TODO(unknwon): This is also used in templates, which should be fixed by +// having a dedicated type `template.User`. +func (u *User) IsFollowing(followID int64) bool { + return Handle.Users().IsFollowing(context.TODO(), u.ID, followID) +} + +// IsUserOrgOwner returns true if the user is in the owner team of the given +// organization. +// +// TODO(unknwon): This is also used in templates, which should be fixed by +// having a dedicated type `template.User`. +func (u *User) IsUserOrgOwner(orgID int64) bool { + return IsOrganizationOwner(orgID, u.ID) +} + +// IsPublicMember returns true if the user has public membership of the given +// organization. +// +// TODO(unknwon): This is also used in templates, which should be fixed by +// having a dedicated type `template.User`. +func (u *User) IsPublicMember(orgID int64) bool { + return IsPublicMembership(orgID, u.ID) +} + +// GetOrganizationCount returns the count of organization membership that the +// user has. +// +// TODO(unknwon): This is also used in templates, which should be fixed by +// having a dedicated type `template.User`. +func (u *User) GetOrganizationCount() (int64, error) { + return Handle.Organizations().CountByUser(context.TODO(), u.ID) +} + +// ShortName truncates and returns the username at most in given length. +// +// TODO(unknwon): This is also used in templates, which should be fixed by +// having a dedicated type `template.User`. +func (u *User) ShortName(length int) string { + return strx.Ellipsis(u.Name, length) +} + +// NewGhostUser creates and returns a fake user for people who has deleted their +// accounts. +// +// TODO: Once migrated to unknwon.dev/i18n, pass in the `i18n.Locale` to +// translate the text to local language. +func NewGhostUser() *User { + return &User{ + ID: -1, + Name: "Ghost", + LowerName: "ghost", + } +} + +var ( + reservedUsernames = map[string]struct{}{ + "-": {}, + "explore": {}, + "create": {}, + "assets": {}, + "css": {}, + "img": {}, + "js": {}, + "less": {}, + "plugins": {}, + "debug": {}, + "raw": {}, + "install": {}, + "api": {}, + "avatar": {}, + "user": {}, + "org": {}, + "help": {}, + "stars": {}, + "issues": {}, + "pulls": {}, + "commits": {}, + "repo": {}, + "template": {}, + "admin": {}, + "new": {}, + ".": {}, + "..": {}, + } + reservedUsernamePatterns = []string{"*.keys"} +) + +type ErrNameNotAllowed struct { + args errx.Args +} + +// IsErrNameNotAllowed returns true if the underlying error has the type +// ErrNameNotAllowed. +func IsErrNameNotAllowed(err error) bool { + _, ok := errors.Cause(err).(ErrNameNotAllowed) + return ok +} + +func (err ErrNameNotAllowed) Value() string { + val, ok := err.args["name"].(string) + if ok { + return val + } + + val, ok = err.args["pattern"].(string) + if ok { + return val + } + + return "" +} + +func (err ErrNameNotAllowed) Error() string { + return fmt.Sprintf("name is not allowed: %v", err.args) +} + +// isNameAllowed checks if the name is reserved or pattern of the name is not +// allowed based on given reserved names and patterns. Names are exact match, +// patterns can be prefix or suffix match with the wildcard ("*"). +func isNameAllowed(names map[string]struct{}, patterns []string, name string) error { + name = strings.TrimSpace(strings.ToLower(name)) + if utf8.RuneCountInString(name) == 0 { + return ErrNameNotAllowed{ + args: errx.Args{ + "reason": "empty name", + }, + } + } + + if _, ok := names[name]; ok { + return ErrNameNotAllowed{ + args: errx.Args{ + "reason": "reserved", + "name": name, + }, + } + } + + for _, pattern := range patterns { + if pattern[0] == '*' && strings.HasSuffix(name, pattern[1:]) || + (pattern[len(pattern)-1] == '*' && strings.HasPrefix(name, pattern[:len(pattern)-1])) { + return ErrNameNotAllowed{ + args: errx.Args{ + "reason": "reserved", + "pattern": pattern, + }, + } + } + } + + return nil +} + +// isUsernameAllowed returns ErrNameNotAllowed if the given name or pattern of +// the name is not allowed as a username. +func isUsernameAllowed(name string) error { + return isNameAllowed(reservedUsernames, reservedUsernamePatterns, name) +} + +// EmailAddress is an email address of a user. +type EmailAddress struct { + ID int64 `gorm:"primaryKey"` + UserID int64 `xorm:"uid INDEX NOT NULL" gorm:"column:uid;index;uniqueIndex:email_address_user_email_unique;not null"` + Email string `xorm:"UNIQUE NOT NULL" gorm:"uniqueIndex:email_address_user_email_unique;not null;size:254"` + IsActivated bool `gorm:"not null;default:FALSE"` + IsPrimary bool `xorm:"-" gorm:"-" json:"-"` +} + +// Follow represents relations of users and their followers. +type Follow struct { + ID int64 `gorm:"primaryKey"` + UserID int64 `xorm:"UNIQUE(follow)" gorm:"uniqueIndex:follow_user_follow_unique;not null"` + FollowID int64 `xorm:"UNIQUE(follow)" gorm:"uniqueIndex:follow_user_follow_unique;not null"` +} diff --git a/internal/database/users_test.go b/internal/database/users_test.go new file mode 100644 index 00000000000..99dfc347920 --- /dev/null +++ b/internal/database/users_test.go @@ -0,0 +1,1392 @@ +package database + +import ( + "context" + "fmt" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gorm.io/gorm" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/dbx" + "gogs.io/gogs/internal/errx" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/repox" + "gogs.io/gogs/internal/userx" + "gogs.io/gogs/public" +) + +func TestUser_BeforeCreate(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + t.Run("CreatedUnix has been set", func(t *testing.T) { + user := &User{ + CreatedUnix: 1, + } + _ = user.BeforeCreate(db) + assert.Equal(t, int64(1), user.CreatedUnix) + assert.Equal(t, int64(0), user.UpdatedUnix) + }) + + t.Run("CreatedUnix has not been set", func(t *testing.T) { + user := &User{} + _ = user.BeforeCreate(db) + assert.Equal(t, db.NowFunc().Unix(), user.CreatedUnix) + assert.Equal(t, db.NowFunc().Unix(), user.UpdatedUnix) + }) +} + +func TestUser_AfterFind(t *testing.T) { + now := time.Now() + db := &gorm.DB{ + Config: &gorm.Config{ + SkipDefaultTransaction: true, + NowFunc: func() time.Time { + return now + }, + }, + } + + user := &User{ + FullName: "user1">XSS`, expVal: `XSS`}, + {input: ``, expVal: ``}, + + // Data URIs: SVG must be stripped (can contain embedded JavaScript) + {input: ``, expVal: ``}, + } + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + assert.Equal(t, test.expVal, Sanitize(test.input)) + assert.Equal(t, test.expVal, string(SanitizeBytes([]byte(test.input)))) + }) + } +} diff --git a/internal/mocks/locale.go b/internal/mocks/locale.go new file mode 100644 index 00000000000..6664662a056 --- /dev/null +++ b/internal/mocks/locale.go @@ -0,0 +1,20 @@ +package mocks + +import ( + "gopkg.in/macaron.v1" +) + +var _ macaron.Locale = (*Locale)(nil) + +type Locale struct { + MockLang string + MockTr func(string, ...any) string +} + +func (l *Locale) Language() string { + return l.MockLang +} + +func (l *Locale) Tr(format string, args ...any) string { + return l.MockTr(format, args...) +} diff --git a/internal/netx/netx.go b/internal/netx/netx.go new file mode 100644 index 00000000000..9aa76fe79fa --- /dev/null +++ b/internal/netx/netx.go @@ -0,0 +1,68 @@ +package netx + +import ( + "fmt" + "net" +) + +var localCIDRs []*net.IPNet + +func init() { + // Parsing hardcoded CIDR strings should never fail, if in case it does, let's + // fail it at start. + rawCIDRs := []string{ + // https://datatracker.ietf.org/doc/html/rfc5735: + "127.0.0.0/8", // Loopback + "0.0.0.0/8", // "This" network + "100.64.0.0/10", // Shared address space + "169.254.0.0/16", // Link local + "172.16.0.0/12", // Private-use networks + "192.0.0.0/24", // IETF Protocol assignments + "192.0.2.0/24", // TEST-NET-1 + "192.88.99.0/24", // 6to4 Relay anycast + "192.168.0.0/16", // Private-use networks + "198.18.0.0/15", // Network interconnect + "198.51.100.0/24", // TEST-NET-2 + "203.0.113.0/24", // TEST-NET-3 + "255.255.255.255/32", // Limited broadcast + + // https://datatracker.ietf.org/doc/html/rfc1918: + "10.0.0.0/8", // Private-use networks + + // https://datatracker.ietf.org/doc/html/rfc6890: + "::1/128", // Loopback + "FC00::/7", // Unique local address + "FE80::/10", // Multicast address + } + for _, raw := range rawCIDRs { + _, cidr, err := net.ParseCIDR(raw) + if err != nil { + panic(fmt.Sprintf("parse CIDR %q: %v", raw, err)) + } + localCIDRs = append(localCIDRs, cidr) + } +} + +// IsBlockedLocalHostname returns true if given hostname is resolved to a local +// network address that is implicitly blocked (i.e. not exempted from the +// allowlist). +func IsBlockedLocalHostname(hostname string, allowlist []string) bool { + for _, allow := range allowlist { + if hostname == allow || allow == "*" { + return false + } + } + + ips, err := net.LookupIP(hostname) + if err != nil { + return true + } + for _, ip := range ips { + for _, cidr := range localCIDRs { + if cidr.Contains(ip) { + return true + } + } + } + return false +} diff --git a/internal/netx/netx_test.go b/internal/netx/netx_test.go new file mode 100644 index 00000000000..595986fab27 --- /dev/null +++ b/internal/netx/netx_test.go @@ -0,0 +1,37 @@ +package netx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsLocalHostname(t *testing.T) { + tests := []struct { + hostname string + allowlist []string + want bool + }{ + {hostname: "localhost", want: true}, // #00 + {hostname: "127.0.0.1", want: true}, // #01 + {hostname: "::1", want: true}, // #02 + {hostname: "0:0:0:0:0:0:0:1", want: true}, // #03 + {hostname: "127.0.0.95", want: true}, // #04 + {hostname: "0.0.0.0", want: true}, // #05 + {hostname: "192.168.123.45", want: true}, // #06 + + {hostname: "gogs.io", want: false}, // #07 + {hostname: "google.com", want: false}, // #08 + {hostname: "165.232.140.255", want: false}, // #09 + + {hostname: "192.168.123.45", allowlist: []string{"10.0.0.17"}, want: true}, // #10 + {hostname: "gogs.local", allowlist: []string{"gogs.local"}, want: false}, // #11 + + {hostname: "192.168.123.45", allowlist: []string{"*"}, want: false}, // #12 + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, test.want, IsBlockedLocalHostname(test.hostname, test.allowlist)) + }) + } +} diff --git a/internal/osx/error.go b/internal/osx/error.go new file mode 100644 index 00000000000..92b1666ab3e --- /dev/null +++ b/internal/osx/error.go @@ -0,0 +1,23 @@ +package osx + +import ( + "os" + + "gogs.io/gogs/internal/errx" +) + +var _ errx.NotFound = (*Error)(nil) + +// Error is a wrapper of an OS error, which handles not found. +type Error struct { + error +} + +func (e Error) NotFound() bool { + return e.error == os.ErrNotExist +} + +// NewError wraps given error. +func NewError(err error) error { + return Error{error: err} +} diff --git a/internal/osx/error_test.go b/internal/osx/error_test.go new file mode 100644 index 00000000000..d57b13db99d --- /dev/null +++ b/internal/osx/error_test.go @@ -0,0 +1,25 @@ +package osx + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + + "gogs.io/gogs/internal/errx" +) + +func TestError_NotFound(t *testing.T) { + tests := []struct { + err error + expVal bool + }{ + {err: os.ErrNotExist, expVal: true}, + {err: os.ErrClosed, expVal: false}, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, test.expVal, errx.IsNotFound(NewError(test.err))) + }) + } +} diff --git a/internal/osx/osx.go b/internal/osx/osx.go new file mode 100644 index 00000000000..58db0885aa1 --- /dev/null +++ b/internal/osx/osx.go @@ -0,0 +1,59 @@ +package osx + +import ( + "os" + "os/user" +) + +// IsFile returns true if given path exists as a file (i.e. not a directory) +// following any symlinks. +func IsFile(path string) bool { + f, e := os.Stat(path) + if e != nil { + return false + } + return !f.IsDir() +} + +// IsDir returns true if given path is a directory following any symlinks, and +// returns false when it's a file or does not exist. +func IsDir(dir string) bool { + f, e := os.Stat(dir) + if e != nil { + return false + } + return f.IsDir() +} + +// Exist returns true if a file or directory exists following any symlinks. +func Exist(path string) bool { + _, err := os.Stat(path) + return err == nil || os.IsExist(err) +} + +// IsSymlink returns true if given path is a symbolic link. +func IsSymlink(path string) bool { + fileInfo, err := os.Lstat(path) + if err != nil { + return false + } + return fileInfo.Mode()&os.ModeSymlink != 0 +} + +// CurrentUsername returns the username of the current user. +func CurrentUsername() string { + username := os.Getenv("USER") + if len(username) > 0 { + return username + } + + username = os.Getenv("USERNAME") + if len(username) > 0 { + return username + } + + if user, err := user.Current(); err == nil { + username = user.Username + } + return username +} diff --git a/internal/osx/osx_test.go b/internal/osx/osx_test.go new file mode 100644 index 00000000000..7254665b687 --- /dev/null +++ b/internal/osx/osx_test.go @@ -0,0 +1,131 @@ +package osx + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestIsFile(t *testing.T) { + tests := []struct { + path string + want bool + }{ + { + path: "osx.go", + want: true, + }, { + path: "../osx", + want: false, + }, { + path: "not_found", + want: false, + }, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, test.want, IsFile(test.path)) + }) + } +} + +func TestIsDir(t *testing.T) { + tests := []struct { + path string + want bool + }{ + { + path: "osx.go", + want: false, + }, { + path: "../osx", + want: true, + }, { + path: "not_found", + want: false, + }, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, test.want, IsDir(test.path)) + }) + } +} + +func TestExist(t *testing.T) { + tests := []struct { + path string + expVal bool + }{ + { + path: "osx.go", + expVal: true, + }, { + path: "../osx", + expVal: true, + }, { + path: "not_found", + expVal: false, + }, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + assert.Equal(t, test.expVal, Exist(test.path)) + }) + } +} + +func TestCurrentUsername(t *testing.T) { + if oldUser, ok := os.LookupEnv("USER"); ok { + defer func() { t.Setenv("USER", oldUser) }() + } else { + defer func() { _ = os.Unsetenv("USER") }() + } + + t.Setenv("USER", "__TESTING::USERNAME") + assert.Equal(t, "__TESTING::USERNAME", CurrentUsername()) +} + +func TestIsSymlink(t *testing.T) { + // Create a temporary file + tempFile, err := os.CreateTemp("", "symlink-test-*") + require.NoError(t, err, "create temporary file") + tempFilePath := tempFile.Name() + _ = tempFile.Close() + defer func() { _ = os.Remove(tempFilePath) }() + + // Create a temporary symlink + tempSymlinkPath := tempFilePath + "-symlink" + err = os.Symlink(tempFilePath, tempSymlinkPath) + require.NoError(t, err, "create temporary symlink") + defer func() { _ = os.Remove(tempSymlinkPath) }() + + tests := []struct { + name string + path string + want bool + }{ + { + name: "non-existent path", + path: "not_found", + want: false, + }, + { + name: "regular file", + path: tempFilePath, + want: false, + }, + { + name: "symlink", + path: tempSymlinkPath, + want: true, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + assert.Equal(t, test.want, IsSymlink(test.path)) + }) + } +} diff --git a/internal/pathx/pathx.go b/internal/pathx/pathx.go new file mode 100644 index 00000000000..aa552ecfbb2 --- /dev/null +++ b/internal/pathx/pathx.go @@ -0,0 +1,16 @@ +package pathx + +import ( + "path" + "strings" +) + +// Clean cleans up given path and returns a relative path that goes straight +// down to prevent path traversal. +// +// 🚨 SECURITY: This function MUST be used for any user input that is used as +// file system path to prevent path traversal. +func Clean(p string) string { + p = strings.ReplaceAll(p, `\`, "/") + return strings.Trim(path.Clean("/"+p), "/") +} diff --git a/internal/pathx/pathx_test.go b/internal/pathx/pathx_test.go new file mode 100644 index 00000000000..a69ac890590 --- /dev/null +++ b/internal/pathx/pathx_test.go @@ -0,0 +1,80 @@ +package pathx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestClean(t *testing.T) { + tests := []struct { + path string + wantVal string + }{ + { + path: "../../../readme.txt", + wantVal: "readme.txt", + }, + { + path: "a/../../../readme.txt", + wantVal: "readme.txt", + }, + { + path: "/../a/b/../c/../readme.txt", + wantVal: "a/readme.txt", + }, + { + path: "../../objects/info/..", + wantVal: "objects", + }, + { + path: "/a/readme.txt", + wantVal: "a/readme.txt", + }, + { + path: "/", + wantVal: "", + }, + + { + path: "/a/b/c/readme.txt", + wantVal: "a/b/c/readme.txt", + }, + + // Windows-specific + { + path: `..\..\..\readme.txt`, + wantVal: "readme.txt", + }, + { + path: `a\..\..\..\readme.txt`, + wantVal: "readme.txt", + }, + { + path: `\..\a\b\..\c\..\readme.txt`, + wantVal: "a/readme.txt", + }, + { + path: `\a\readme.txt`, + wantVal: "a/readme.txt", + }, + { + path: `..\..\..\../README.md`, + wantVal: "README.md", + }, + { + path: `\`, + wantVal: "", + }, + + { + path: `\a\b\c\readme.txt`, + wantVal: `a/b/c/readme.txt`, + }, + } + for _, test := range tests { + t.Run(test.path, func(t *testing.T) { + assert.Equal(t, test.wantVal, Clean(test.path)) + }) + } +} diff --git a/internal/process/manager.go b/internal/process/manager.go new file mode 100644 index 00000000000..78b4acd938c --- /dev/null +++ b/internal/process/manager.go @@ -0,0 +1,135 @@ +package process + +import ( + "bytes" + "os/exec" + "sync" + "time" + + "github.com/cockroachdb/errors" + log "unknwon.dev/clog/v2" +) + +var ErrExecTimeout = errors.New("process execution timeout") + +const defaultTimeout = 60 * time.Second + +// Process represents a running process calls shell command. +type Process struct { + PID int64 + Description string + Start time.Time + Cmd *exec.Cmd +} + +type pidCounter struct { + sync.Mutex + + // The current number of pid, initial is 0, and increase 1 every time it's been used. + pid int64 +} + +func (c *pidCounter) PID() int64 { + c.pid++ + return c.pid +} + +var ( + counter = new(pidCounter) + Processes []*Process +) + +// Add adds a process to global list and returns its PID. +func Add(desc string, cmd *exec.Cmd) int64 { + counter.Lock() + defer counter.Unlock() + + pid := counter.PID() + Processes = append(Processes, &Process{ + PID: pid, + Description: desc, + Start: time.Now(), + Cmd: cmd, + }) + return pid +} + +// Remove removes a process from global list. +// It returns true if the process is found and removed by given pid. +func Remove(pid int64) bool { + counter.Lock() + defer counter.Unlock() + + for i := range Processes { + if Processes[i].PID == pid { + Processes = append(Processes[:i], Processes[i+1:]...) + return true + } + } + return false +} + +// Exec starts executing a shell command in given path, it tracks corresponding process and timeout. +func ExecDir(timeout time.Duration, dir, desc, cmdName string, args ...string) (string, string, error) { + if timeout == -1 { + timeout = defaultTimeout + } + + bufOut := new(bytes.Buffer) + bufErr := new(bytes.Buffer) + + cmd := exec.Command(cmdName, args...) + cmd.Dir = dir + cmd.Stdout = bufOut + cmd.Stderr = bufErr + if err := cmd.Start(); err != nil { + return "", err.Error(), err + } + + pid := Add(desc, cmd) + done := make(chan error) + go func() { + done <- cmd.Wait() + }() + + var err error + select { + case <-time.After(timeout): + if errKill := Kill(pid); errKill != nil { + log.Error("Failed to kill timeout process [pid: %d, desc: %s]: %v", pid, desc, errKill) + } + <-done + return "", ErrExecTimeout.Error(), ErrExecTimeout + case err = <-done: + } + + Remove(pid) + return bufOut.String(), bufErr.String(), err +} + +// Exec starts executing a shell command, it tracks corresponding process and timeout. +func ExecTimeout(timeout time.Duration, desc, cmdName string, args ...string) (string, string, error) { + return ExecDir(timeout, "", desc, cmdName, args...) +} + +// Exec starts executing a shell command, it tracks corresponding its process and use default timeout. +func Exec(desc, cmdName string, args ...string) (string, string, error) { + return ExecDir(-1, "", desc, cmdName, args...) +} + +// Kill kills and removes a process from global list. +func Kill(pid int64) error { + for _, proc := range Processes { + if proc.PID == pid { + if proc.Cmd != nil && proc.Cmd.Process != nil && + proc.Cmd.ProcessState != nil && !proc.Cmd.ProcessState.Exited() { + if err := proc.Cmd.Process.Kill(); err != nil { + return errors.Newf("fail to kill process [pid: %d, desc: %s]: %v", proc.PID, proc.Description, err) + } + } + Remove(pid) + return nil + } + } + return nil +} diff --git a/internal/repox/repox.go b/internal/repox/repox.go new file mode 100644 index 00000000000..c044bdaeb53 --- /dev/null +++ b/internal/repox/repox.go @@ -0,0 +1,71 @@ +package repox + +import ( + "fmt" + "path/filepath" + "strconv" + "strings" + + "gogs.io/gogs/internal/conf" +) + +// CloneLink represents different types of clone URLs of repository. +type CloneLink struct { + SSH string + HTTPS string +} + +// NewCloneLink returns clone URLs using given owner and repository name. +func NewCloneLink(owner, repo string, isWiki bool) *CloneLink { + if isWiki { + repo += ".wiki" + } + + cl := new(CloneLink) + if conf.SSH.Port != 22 { + cl.SSH = fmt.Sprintf("ssh://%s@%s:%d/%s/%s.git", conf.App.RunUser, conf.SSH.Domain, conf.SSH.Port, owner, repo) + } else { + cl.SSH = fmt.Sprintf("%s@%s:%s/%s.git", conf.App.RunUser, conf.SSH.Domain, owner, repo) + } + cl.HTTPS = HTTPSCloneURL(owner, repo) + return cl +} + +// HTTPSCloneURL returns HTTPS clone URL using given owner and repository name. +func HTTPSCloneURL(owner, repo string) string { + return fmt.Sprintf("%s%s/%s.git", conf.Server.ExternalURL, owner, repo) +} + +// HTMLURL returns HTML URL using given owner and repository name. +func HTMLURL(owner, repo string) string { + return conf.Server.ExternalURL + owner + "/" + repo +} + +// CompareCommitsPath returns the comparison path using given owner, repository, +// and commit IDs. +func CompareCommitsPath(owner, repo, oldCommitID, newCommitID string) string { + return fmt.Sprintf("%s/%s/compare/%s...%s", owner, repo, oldCommitID, newCommitID) +} + +// UserPath returns the absolute path for storing user repositories. +func UserPath(user string) string { + return filepath.Join(conf.Repository.Root, strings.ToLower(user)) +} + +// RepositoryPath returns the absolute path using given user and repository +// name. +func RepositoryPath(owner, repo string) string { + return filepath.Join(UserPath(owner), strings.ToLower(repo)+".git") +} + +// RepositoryLocalPath returns the absolute path of the repository local copy +// with the given ID. +func RepositoryLocalPath(repoID int64) string { + return filepath.Join(conf.Server.AppDataPath, "tmp", "local-repo", strconv.FormatInt(repoID, 10)) +} + +// RepositoryLocalWikiPath returns the absolute path of the repository local +// wiki copy with the given ID. +func RepositoryLocalWikiPath(repoID int64) string { + return filepath.Join(conf.Server.AppDataPath, "tmp", "local-wiki", strconv.FormatInt(repoID, 10)) +} diff --git a/internal/repox/repox_test.go b/internal/repox/repox_test.go new file mode 100644 index 00000000000..e5919625c6a --- /dev/null +++ b/internal/repox/repox_test.go @@ -0,0 +1,159 @@ +package repox + +import ( + "runtime" + "testing" + + "github.com/stretchr/testify/assert" + + "gogs.io/gogs/internal/conf" +) + +func TestNewCloneLink(t *testing.T) { + conf.SetMockApp(t, + conf.AppOpts{ + RunUser: "git", + }, + ) + conf.SetMockServer(t, + conf.ServerOpts{ + ExternalURL: "https://example.com/", + }, + ) + + t.Run("regular SSH port", func(t *testing.T) { + conf.SetMockSSH(t, + conf.SSHOpts{ + Domain: "example.com", + Port: 22, + }, + ) + + got := NewCloneLink("alice", "example", false) + want := &CloneLink{ + SSH: "git@example.com:alice/example.git", + HTTPS: "https://example.com/alice/example.git", + } + assert.Equal(t, want, got) + }) + + t.Run("irregular SSH port", func(t *testing.T) { + conf.SetMockSSH(t, + conf.SSHOpts{ + Domain: "example.com", + Port: 2222, + }, + ) + + got := NewCloneLink("alice", "example", false) + want := &CloneLink{ + SSH: "ssh://git@example.com:2222/alice/example.git", + HTTPS: "https://example.com/alice/example.git", + } + assert.Equal(t, want, got) + }) + + t.Run("wiki", func(t *testing.T) { + conf.SetMockSSH(t, + conf.SSHOpts{ + Domain: "example.com", + Port: 22, + }, + ) + + got := NewCloneLink("alice", "example", true) + want := &CloneLink{ + SSH: "git@example.com:alice/example.wiki.git", + HTTPS: "https://example.com/alice/example.wiki.git", + } + assert.Equal(t, want, got) + }) +} + +func TestHTMLURL(t *testing.T) { + conf.SetMockServer(t, + conf.ServerOpts{ + ExternalURL: "https://example.com/", + }, + ) + + got := HTMLURL("alice", "example") + want := "https://example.com/alice/example" + assert.Equal(t, want, got) +} + +func TestCompareCommitsPath(t *testing.T) { + got := CompareCommitsPath("alice", "example", "old", "new") + want := "alice/example/compare/old...new" + assert.Equal(t, want, got) +} + +func TestUserPath(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Skipping testing on Windows") + return + } + + conf.SetMockRepository(t, + conf.RepositoryOpts{ + Root: "/home/git/gogs-repositories", + }, + ) + + got := UserPath("alice") + want := "/home/git/gogs-repositories/alice" + assert.Equal(t, want, got) +} + +func TestRepositoryPath(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Skipping testing on Windows") + return + } + + conf.SetMockRepository(t, + conf.RepositoryOpts{ + Root: "/home/git/gogs-repositories", + }, + ) + + got := RepositoryPath("alice", "example") + want := "/home/git/gogs-repositories/alice/example.git" + assert.Equal(t, want, got) +} + +func TestRepositoryLocalPath(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Skipping testing on Windows") + return + } + + conf.SetMockServer( + t, + conf.ServerOpts{ + AppDataPath: "data", + }, + ) + + got := RepositoryLocalPath(1) + want := "data/tmp/local-repo/1" + assert.Equal(t, want, got) +} + +func TestRepositoryLocalWikiPath(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Skipping testing on Windows") + return + } + + conf.SetMockServer( + t, + conf.ServerOpts{ + AppDataPath: "data", + }, + ) + + got := RepositoryLocalWikiPath(1) + want := "data/tmp/local-wiki/1" + assert.Equal(t, want, got) +} diff --git a/internal/route/admin/admin.go b/internal/route/admin/admin.go new file mode 100644 index 00000000000..188d2e2be2e --- /dev/null +++ b/internal/route/admin/admin.go @@ -0,0 +1,234 @@ +package admin + +import ( + "encoding/json" + "fmt" + "runtime" + "strings" + "time" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/cron" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/email" + "gogs.io/gogs/internal/process" + "gogs.io/gogs/internal/tool" +) + +const ( + tmplDashboard = "admin/dashboard" + tmplConfig = "admin/config" + tmplMonitor = "admin/monitor" +) + +// initTime is the time when the application was initialized. +var initTime = time.Now() + +var sysStatus struct { + Uptime string + NumGoroutine int + + // General statistics. + MemAllocated string // bytes allocated and still in use + MemTotal string // bytes allocated (even if freed) + MemSys string // bytes obtained from system (sum of XxxSys below) + Lookups uint64 // number of pointer lookups + MemMallocs uint64 // number of mallocs + MemFrees uint64 // number of frees + + // Main allocation heap statistics. + HeapAlloc string // bytes allocated and still in use + HeapSys string // bytes obtained from system + HeapIdle string // bytes in idle spans + HeapInuse string // bytes in non-idle span + HeapReleased string // bytes released to the OS + HeapObjects uint64 // total number of allocated objects + + // Low-level fixed-size structure allocator statistics. + // Inuse is bytes used now. + // Sys is bytes obtained from system. + StackInuse string // bootstrap stacks + StackSys string + MSpanInuse string // mspan structures + MSpanSys string + MCacheInuse string // mcache structures + MCacheSys string + BuckHashSys string // profiling bucket hash table + GCSys string // GC metadata + OtherSys string // other system allocations + + // Garbage collector statistics. + NextGC string // next run in HeapAlloc time (bytes) + LastGC string // last run in absolute time (ns) + PauseTotalNs string + PauseNs string // circular buffer of recent GC pause times, most recent at [(NumGC+255)%256] + NumGC uint32 +} + +func updateSystemStatus() { + sysStatus.Uptime = tool.TimeSincePro(initTime) + + m := new(runtime.MemStats) + runtime.ReadMemStats(m) + sysStatus.NumGoroutine = runtime.NumGoroutine() + + sysStatus.MemAllocated = tool.FileSize(int64(m.Alloc)) + sysStatus.MemTotal = tool.FileSize(int64(m.TotalAlloc)) + sysStatus.MemSys = tool.FileSize(int64(m.Sys)) + sysStatus.Lookups = m.Lookups + sysStatus.MemMallocs = m.Mallocs + sysStatus.MemFrees = m.Frees + + sysStatus.HeapAlloc = tool.FileSize(int64(m.HeapAlloc)) + sysStatus.HeapSys = tool.FileSize(int64(m.HeapSys)) + sysStatus.HeapIdle = tool.FileSize(int64(m.HeapIdle)) + sysStatus.HeapInuse = tool.FileSize(int64(m.HeapInuse)) + sysStatus.HeapReleased = tool.FileSize(int64(m.HeapReleased)) + sysStatus.HeapObjects = m.HeapObjects + + sysStatus.StackInuse = tool.FileSize(int64(m.StackInuse)) + sysStatus.StackSys = tool.FileSize(int64(m.StackSys)) + sysStatus.MSpanInuse = tool.FileSize(int64(m.MSpanInuse)) + sysStatus.MSpanSys = tool.FileSize(int64(m.MSpanSys)) + sysStatus.MCacheInuse = tool.FileSize(int64(m.MCacheInuse)) + sysStatus.MCacheSys = tool.FileSize(int64(m.MCacheSys)) + sysStatus.BuckHashSys = tool.FileSize(int64(m.BuckHashSys)) + sysStatus.GCSys = tool.FileSize(int64(m.GCSys)) + sysStatus.OtherSys = tool.FileSize(int64(m.OtherSys)) + + sysStatus.NextGC = tool.FileSize(int64(m.NextGC)) + sysStatus.LastGC = fmt.Sprintf("%.1fs", float64(time.Now().UnixNano()-int64(m.LastGC))/1000/1000/1000) + sysStatus.PauseTotalNs = fmt.Sprintf("%.1fs", float64(m.PauseTotalNs)/1000/1000/1000) + sysStatus.PauseNs = fmt.Sprintf("%.3fs", float64(m.PauseNs[(m.NumGC+255)%256])/1000/1000/1000) + sysStatus.NumGC = m.NumGC +} + +func Dashboard(c *context.Context) { + c.Title("admin.dashboard") + c.PageIs("Admin") + c.PageIs("AdminDashboard") + + c.Data["GitVersion"] = conf.Git.Version + c.Data["GoVersion"] = runtime.Version() + c.Data["BuildTime"] = conf.BuildTime + c.Data["BuildCommit"] = conf.BuildCommit + + c.Data["Stats"] = database.GetStatistic(c.Req.Context()) + // FIXME: update periodically + updateSystemStatus() + c.Data["SysStatus"] = sysStatus + c.Success(tmplDashboard) +} + +// Operation types. +type AdminOperation int + +const ( + CleanInactivateUser AdminOperation = iota + 1 + CleanRepoArchives + CleanMissingRepos + GitGCRepos + SyncSSHAuthorizedKey + SyncRepositoryHooks + ReinitMissingRepository +) + +func Operation(c *context.Context) { + var err error + var success string + switch AdminOperation(c.QueryInt("op")) { + case CleanInactivateUser: + success = c.Tr("admin.dashboard.delete_inactivate_accounts_success") + err = database.Handle.Users().DeleteInactivated() + case CleanRepoArchives: + success = c.Tr("admin.dashboard.delete_repo_archives_success") + err = database.DeleteRepositoryArchives() + case CleanMissingRepos: + success = c.Tr("admin.dashboard.delete_missing_repos_success") + err = database.DeleteMissingRepositories() + case GitGCRepos: + success = c.Tr("admin.dashboard.git_gc_repos_success") + err = database.GitGcRepos() + case SyncSSHAuthorizedKey: + success = c.Tr("admin.dashboard.resync_all_sshkeys_success") + err = database.RewriteAuthorizedKeys() + case SyncRepositoryHooks: + success = c.Tr("admin.dashboard.resync_all_hooks_success") + err = database.SyncRepositoryHooks() + case ReinitMissingRepository: + success = c.Tr("admin.dashboard.reinit_missing_repos_success") + err = database.ReinitMissingRepositories() + } + + if err != nil { + c.Flash.Error(err.Error()) + } else { + c.Flash.Success(success) + } + c.RedirectSubpath("/admin") +} + +func SendTestMail(c *context.Context) { + emailAddr := c.Query("email") + // Send a test email to the user's email address and redirect back to Config + if err := email.SendTestMail(emailAddr); err != nil { + c.Flash.Error(c.Tr("admin.config.email.test_mail_failed", emailAddr, err)) + } else { + c.Flash.Info(c.Tr("admin.config.email.test_mail_sent", emailAddr)) + } + + c.Redirect(conf.Server.Subpath + "/admin/config") +} + +func Config(c *context.Context) { + c.Title("admin.config") + c.PageIs("Admin") + c.PageIs("AdminConfig") + + c.Data["App"] = conf.App + c.Data["Server"] = conf.Server + c.Data["SSH"] = conf.SSH + c.Data["Repository"] = conf.Repository + c.Data["Database"] = conf.Database + c.Data["Security"] = conf.Security + c.Data["Email"] = conf.Email + c.Data["Auth"] = conf.Auth + c.Data["User"] = conf.User + c.Data["Session"] = conf.Session + c.Data["Cache"] = conf.Cache + c.Data["Attachment"] = conf.Attachment + c.Data["Release"] = conf.Release + c.Data["Picture"] = conf.Picture + c.Data["HTTP"] = conf.HTTP + c.Data["Mirror"] = conf.Mirror + c.Data["Webhook"] = conf.Webhook + c.Data["Git"] = conf.Git + c.Data["LFS"] = conf.LFS + + c.Data["LogRootPath"] = conf.Log.RootPath + type logger struct { + Mode, Config string + } + loggers := make([]*logger, len(conf.Log.Modes)) + for i := range conf.Log.Modes { + loggers[i] = &logger{ + Mode: strings.Title(conf.Log.Modes[i]), + } + + result, _ := json.MarshalIndent(conf.Log.Configs[i], "", " ") + loggers[i].Config = string(result) + } + c.Data["Loggers"] = loggers + + c.Success(tmplConfig) +} + +func Monitor(c *context.Context) { + c.Data["Title"] = c.Tr("admin.monitor") + c.Data["PageIsAdmin"] = true + c.Data["PageIsAdminMonitor"] = true + c.Data["Processes"] = process.Processes + c.Data["Entries"] = cron.ListTasks() + c.Success(tmplMonitor) +} diff --git a/internal/route/admin/auths.go b/internal/route/admin/auths.go new file mode 100644 index 00000000000..b0f58c7f894 --- /dev/null +++ b/internal/route/admin/auths.go @@ -0,0 +1,294 @@ +package admin + +import ( + "fmt" + "net/http" + "strconv" + "strings" + + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/auth/github" + "gogs.io/gogs/internal/auth/ldap" + "gogs.io/gogs/internal/auth/pam" + "gogs.io/gogs/internal/auth/smtp" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" +) + +const ( + tmplAdminAuthList = "admin/auth/list" + tmplAdminAuthNew = "admin/auth/new" + tmplAdminAuthEdit = "admin/auth/edit" +) + +func Authentications(c *context.Context) { + c.Title("admin.authentication") + c.PageIs("Admin") + c.PageIs("AdminAuthentications") + + var err error + c.Data["Sources"], err = database.Handle.LoginSources().List(c.Req.Context(), database.ListLoginSourceOptions{}) + if err != nil { + c.Error(err, "list login sources") + return + } + + c.Data["Total"] = database.Handle.LoginSources().Count(c.Req.Context()) + c.Success(tmplAdminAuthList) +} + +type dropdownItem struct { + Name string + Type any +} + +var ( + authSources = []dropdownItem{ + {auth.Name(auth.LDAP), auth.LDAP}, + {auth.Name(auth.DLDAP), auth.DLDAP}, + {auth.Name(auth.SMTP), auth.SMTP}, + {auth.Name(auth.PAM), auth.PAM}, + {auth.Name(auth.GitHub), auth.GitHub}, + } + securityProtocols = []dropdownItem{ + {ldap.SecurityProtocolName(ldap.SecurityProtocolUnencrypted), ldap.SecurityProtocolUnencrypted}, + {ldap.SecurityProtocolName(ldap.SecurityProtocolLDAPS), ldap.SecurityProtocolLDAPS}, + {ldap.SecurityProtocolName(ldap.SecurityProtocolStartTLS), ldap.SecurityProtocolStartTLS}, + } +) + +func NewAuthSource(c *context.Context) { + c.Title("admin.auths.new") + c.PageIs("Admin") + c.PageIs("AdminAuthentications") + + c.Data["type"] = auth.LDAP + c.Data["CurrentTypeName"] = auth.Name(auth.LDAP) + c.Data["CurrentSecurityProtocol"] = ldap.SecurityProtocolName(ldap.SecurityProtocolUnencrypted) + c.Data["smtp_auth"] = "PLAIN" + c.Data["is_active"] = true + c.Data["is_default"] = true + c.Data["AuthSources"] = authSources + c.Data["SecurityProtocols"] = securityProtocols + c.Data["SMTPAuths"] = smtp.AuthTypes + c.Success(tmplAdminAuthNew) +} + +func parseLDAPConfig(f form.Authentication) *ldap.Config { + return &ldap.Config{ + Host: f.Host, + Port: f.Port, + SecurityProtocol: ldap.SecurityProtocol(f.SecurityProtocol), + SkipVerify: f.SkipVerify, + BindDN: f.BindDN, + UserDN: f.UserDN, + BindPassword: f.BindPassword, + UserBase: f.UserBase, + AttributeUsername: f.AttributeUsername, + AttributeName: f.AttributeName, + AttributeSurname: f.AttributeSurname, + AttributeMail: f.AttributeMail, + AttributesInBind: f.AttributesInBind, + Filter: f.Filter, + GroupEnabled: f.GroupEnabled, + GroupDN: f.GroupDN, + GroupFilter: f.GroupFilter, + GroupMemberUID: f.GroupMemberUID, + UserUID: f.UserUID, + AdminFilter: f.AdminFilter, + } +} + +func parseSMTPConfig(f form.Authentication) *smtp.Config { + return &smtp.Config{ + Auth: f.SMTPAuth, + Host: f.SMTPHost, + Port: f.SMTPPort, + AllowedDomains: f.AllowedDomains, + TLS: f.TLS, + SkipVerify: f.SkipVerify, + } +} + +func NewAuthSourcePost(c *context.Context, f form.Authentication) { + c.Title("admin.auths.new") + c.PageIs("Admin") + c.PageIs("AdminAuthentications") + + c.Data["CurrentTypeName"] = auth.Name(auth.Type(f.Type)) + c.Data["CurrentSecurityProtocol"] = ldap.SecurityProtocolName(ldap.SecurityProtocol(f.SecurityProtocol)) + c.Data["AuthSources"] = authSources + c.Data["SecurityProtocols"] = securityProtocols + c.Data["SMTPAuths"] = smtp.AuthTypes + + hasTLS := false + var config any + switch auth.Type(f.Type) { + case auth.LDAP, auth.DLDAP: + config = parseLDAPConfig(f) + hasTLS = ldap.SecurityProtocol(f.SecurityProtocol) > ldap.SecurityProtocolUnencrypted + case auth.SMTP: + config = parseSMTPConfig(f) + hasTLS = true + case auth.PAM: + config = &pam.Config{ + ServiceName: f.PAMServiceName, + } + case auth.GitHub: + config = &github.Config{ + APIEndpoint: strings.TrimSuffix(f.GitHubAPIEndpoint, "/") + "/", + SkipVerify: f.SkipVerify, + } + hasTLS = true + default: + c.Status(http.StatusBadRequest) + return + } + c.Data["HasTLS"] = hasTLS + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplAdminAuthNew) + return + } + + source, err := database.Handle.LoginSources().Create(c.Req.Context(), + database.CreateLoginSourceOptions{ + Type: auth.Type(f.Type), + Name: f.Name, + Activated: f.IsActive, + Default: f.IsDefault, + Config: config, + }, + ) + if err != nil { + if database.IsErrLoginSourceAlreadyExist(err) { + c.FormErr("Name") + c.RenderWithErr(c.Tr("admin.auths.login_source_exist", f.Name), http.StatusUnprocessableEntity, tmplAdminAuthNew, f) + } else { + c.Error(err, "create login source") + } + return + } + + if source.IsDefault { + err = database.Handle.LoginSources().ResetNonDefault(c.Req.Context(), source) + if err != nil { + c.Error(err, "reset non-default login sources") + return + } + } + + log.Trace("Authentication created by admin(%s): %s", c.User.Name, f.Name) + + c.Flash.Success(c.Tr("admin.auths.new_success", f.Name)) + c.Redirect(conf.Server.Subpath + "/admin/auths") +} + +func EditAuthSource(c *context.Context) { + c.Title("admin.auths.edit") + c.PageIs("Admin") + c.PageIs("AdminAuthentications") + + c.Data["SecurityProtocols"] = securityProtocols + c.Data["SMTPAuths"] = smtp.AuthTypes + + source, err := database.Handle.LoginSources().GetByID(c.Req.Context(), c.ParamsInt64(":authid")) + if err != nil { + c.Error(err, "get login source by ID") + return + } + c.Data["Source"] = source + c.Data["HasTLS"] = source.Provider.HasTLS() + + c.Success(tmplAdminAuthEdit) +} + +func EditAuthSourcePost(c *context.Context, f form.Authentication) { + c.Title("admin.auths.edit") + c.PageIs("Admin") + c.PageIs("AdminAuthentications") + + c.Data["SMTPAuths"] = smtp.AuthTypes + + source, err := database.Handle.LoginSources().GetByID(c.Req.Context(), c.ParamsInt64(":authid")) + if err != nil { + c.Error(err, "get login source by ID") + return + } + c.Data["Source"] = source + c.Data["HasTLS"] = source.Provider.HasTLS() + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplAdminAuthEdit) + return + } + + var provider auth.Provider + switch auth.Type(f.Type) { + case auth.LDAP: + provider = ldap.NewProvider(false, parseLDAPConfig(f)) + case auth.DLDAP: + provider = ldap.NewProvider(true, parseLDAPConfig(f)) + case auth.SMTP: + provider = smtp.NewProvider(parseSMTPConfig(f)) + case auth.PAM: + provider = pam.NewProvider(&pam.Config{ + ServiceName: f.PAMServiceName, + }) + case auth.GitHub: + provider = github.NewProvider(&github.Config{ + APIEndpoint: strings.TrimSuffix(f.GitHubAPIEndpoint, "/") + "/", + SkipVerify: f.SkipVerify, + }) + default: + c.Status(http.StatusBadRequest) + return + } + + source.Name = f.Name + source.IsActived = f.IsActive + source.IsDefault = f.IsDefault + source.Provider = provider + if err := database.Handle.LoginSources().Save(c.Req.Context(), source); err != nil { + c.Error(err, "update login source") + return + } + + if source.IsDefault { + err = database.Handle.LoginSources().ResetNonDefault(c.Req.Context(), source) + if err != nil { + c.Error(err, "reset non-default login sources") + return + } + } + + log.Trace("Authentication changed by admin '%s': %d", c.User.Name, source.ID) + + c.Flash.Success(c.Tr("admin.auths.update_success")) + c.Redirect(conf.Server.Subpath + "/admin/auths/" + strconv.FormatInt(f.ID, 10)) +} + +func DeleteAuthSource(c *context.Context) { + id := c.ParamsInt64(":authid") + if err := database.Handle.LoginSources().DeleteByID(c.Req.Context(), id); err != nil { + if database.IsErrLoginSourceInUse(err) { + c.Flash.Error(c.Tr("admin.auths.still_in_used")) + } else { + c.Flash.Error(fmt.Sprintf("DeleteSource: %v", err)) + } + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/admin/auths/" + c.Params(":authid"), + }) + return + } + log.Trace("Authentication deleted by admin(%s): %d", c.User.Name, id) + + c.Flash.Success(c.Tr("admin.auths.deletion_success")) + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/admin/auths", + }) +} diff --git a/internal/route/admin/notice.go b/internal/route/admin/notice.go new file mode 100644 index 00000000000..9ddff20c177 --- /dev/null +++ b/internal/route/admin/notice.go @@ -0,0 +1,67 @@ +package admin + +import ( + "net/http" + "strconv" + + "github.com/unknwon/paginater" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" +) + +const ( + NOTICES = "admin/notice" +) + +func Notices(c *context.Context) { + c.Title("admin.notices") + c.Data["PageIsAdmin"] = true + c.Data["PageIsAdminNotices"] = true + + total := database.Handle.Notices().Count(c.Req.Context()) + page := max(c.QueryInt("page"), 1) + c.Data["Page"] = paginater.New(int(total), conf.UI.Admin.NoticePagingNum, page, 5) + + notices, err := database.Handle.Notices().List(c.Req.Context(), page, conf.UI.Admin.NoticePagingNum) + if err != nil { + c.Error(err, "list notices") + return + } + c.Data["Notices"] = notices + + c.Data["Total"] = total + c.Success(NOTICES) +} + +func DeleteNotices(c *context.Context) { + strs := c.QueryStrings("ids[]") + ids := make([]int64, 0, len(strs)) + for i := range strs { + id, _ := strconv.ParseInt(strs[i], 10, 64) + if id > 0 { + ids = append(ids, id) + } + } + + if err := database.Handle.Notices().DeleteByIDs(c.Req.Context(), ids...); err != nil { + c.Flash.Error("DeleteNoticesByIDs: " + err.Error()) + c.Status(http.StatusInternalServerError) + } else { + c.Flash.Success(c.Tr("admin.notices.delete_success")) + c.Status(http.StatusOK) + } +} + +func EmptyNotices(c *context.Context) { + if err := database.Handle.Notices().DeleteAll(c.Req.Context()); err != nil { + c.Error(err, "delete notices") + return + } + + log.Trace("System notices deleted by admin (%s): [start: %d]", c.User.Name, 0) + c.Flash.Success(c.Tr("admin.notices.delete_success")) + c.Redirect(conf.Server.Subpath + "/admin/notices") +} diff --git a/internal/route/admin/orgs.go b/internal/route/admin/orgs.go new file mode 100644 index 00000000000..9eefcbddeea --- /dev/null +++ b/internal/route/admin/orgs.go @@ -0,0 +1,33 @@ +package admin + +import ( + gocontext "context" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route" +) + +const ( + ORGS = "admin/org/list" +) + +func Organizations(c *context.Context) { + c.Data["Title"] = c.Tr("admin.organizations") + c.Data["PageIsAdmin"] = true + c.Data["PageIsAdminOrganizations"] = true + + route.RenderUserSearch(c, &route.UserSearchOptions{ + Type: database.UserTypeOrganization, + Counter: func(gocontext.Context) int64 { + return database.CountOrganizations() + }, + Ranger: func(_ gocontext.Context, page, pageSize int) ([]*database.User, error) { + return database.Organizations(page, pageSize) + }, + PageSize: conf.UI.Admin.OrgPagingNum, + OrderBy: "id ASC", + TplName: ORGS, + }) +} diff --git a/internal/route/admin/repos.go b/internal/route/admin/repos.go new file mode 100644 index 00000000000..5e31cbbc273 --- /dev/null +++ b/internal/route/admin/repos.go @@ -0,0 +1,83 @@ +package admin + +import ( + "github.com/unknwon/paginater" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" +) + +const ( + REPOS = "admin/repo/list" +) + +func Repos(c *context.Context) { + c.Data["Title"] = c.Tr("admin.repositories") + c.Data["PageIsAdmin"] = true + c.Data["PageIsAdminRepositories"] = true + + page := c.QueryInt("page") + if page <= 0 { + page = 1 + } + + var ( + repos []*database.Repository + count int64 + err error + ) + + keyword := c.Query("q") + if keyword == "" { + repos, err = database.Repositories(page, conf.UI.Admin.RepoPagingNum) + if err != nil { + c.Error(err, "list repositories") + return + } + count = database.CountRepositories(true) + } else { + repos, count, err = database.SearchRepositoryByName(&database.SearchRepoOptions{ + Keyword: keyword, + OrderBy: "id ASC", + Private: true, + Page: page, + PageSize: conf.UI.Admin.RepoPagingNum, + }) + if err != nil { + c.Error(err, "search repository by name") + return + } + } + c.Data["Keyword"] = keyword + c.Data["Total"] = count + c.Data["Page"] = paginater.New(int(count), conf.UI.Admin.RepoPagingNum, page, 5) + + if err = database.RepositoryList(repos).LoadAttributes(); err != nil { + c.Error(err, "load attributes") + return + } + c.Data["Repos"] = repos + + c.Success(REPOS) +} + +func DeleteRepo(c *context.Context) { + repo, err := database.GetRepositoryByID(c.QueryInt64("id")) + if err != nil { + c.Error(err, "get repository by ID") + return + } + + if err := database.DeleteRepository(repo.MustOwner().ID, repo.ID); err != nil { + c.Error(err, "delete repository") + return + } + log.Trace("Repository deleted: %s/%s", repo.MustOwner().Name, repo.Name) + + c.Flash.Success(c.Tr("repo.settings.deletion_success")) + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/admin/repos?page=" + c.Query("page"), + }) +} diff --git a/internal/route/admin/users.go b/internal/route/admin/users.go new file mode 100644 index 00000000000..07781426913 --- /dev/null +++ b/internal/route/admin/users.go @@ -0,0 +1,251 @@ +package admin + +import ( + "net/http" + "strconv" + "strings" + + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/email" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/route" +) + +const ( + tmplAdminUserList = "admin/user/list" + tmplAdminUserNew = "admin/user/new" + tmplAdminUserEdit = "admin/user/edit" +) + +func Users(c *context.Context) { + c.Data["Title"] = c.Tr("admin.users") + c.Data["PageIsAdmin"] = true + c.Data["PageIsAdminUsers"] = true + + route.RenderUserSearch(c, &route.UserSearchOptions{ + Type: database.UserTypeIndividual, + Counter: database.Handle.Users().Count, + Ranger: database.Handle.Users().List, + PageSize: conf.UI.Admin.UserPagingNum, + OrderBy: "id ASC", + TplName: tmplAdminUserList, + }) +} + +func NewUser(c *context.Context) { + c.Data["Title"] = c.Tr("admin.users.new_account") + c.Data["PageIsAdmin"] = true + c.Data["PageIsAdminUsers"] = true + + c.Data["login_type"] = "0-0" + + sources, err := database.Handle.LoginSources().List(c.Req.Context(), database.ListLoginSourceOptions{}) + if err != nil { + c.Error(err, "list login sources") + return + } + c.Data["Sources"] = sources + + c.Data["CanSendEmail"] = conf.Email.Enabled + c.Success(tmplAdminUserNew) +} + +func NewUserPost(c *context.Context, f form.AdminCrateUser) { + c.Data["Title"] = c.Tr("admin.users.new_account") + c.Data["PageIsAdmin"] = true + c.Data["PageIsAdminUsers"] = true + + sources, err := database.Handle.LoginSources().List(c.Req.Context(), database.ListLoginSourceOptions{}) + if err != nil { + c.Error(err, "list login sources") + return + } + c.Data["Sources"] = sources + + c.Data["CanSendEmail"] = conf.Email.Enabled + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplAdminUserNew) + return + } + + createUserOpts := database.CreateUserOptions{ + Password: f.Password, + Activated: true, + } + if len(f.LoginType) > 0 { + fields := strings.Split(f.LoginType, "-") + if len(fields) == 2 { + createUserOpts.LoginSource, _ = strconv.ParseInt(fields[1], 10, 64) + createUserOpts.LoginName = f.LoginName + } + } + + user, err := database.Handle.Users().Create(c.Req.Context(), f.UserName, f.Email, createUserOpts) + if err != nil { + switch { + case database.IsErrUserAlreadyExist(err): + c.Data["Err_UserName"] = true + c.RenderWithErr(c.Tr("form.username_been_taken"), http.StatusUnprocessableEntity, tmplAdminUserNew, &f) + case database.IsErrEmailAlreadyUsed(err): + c.Data["Err_Email"] = true + c.RenderWithErr(c.Tr("form.email_been_used"), http.StatusUnprocessableEntity, tmplAdminUserNew, &f) + case database.IsErrNameNotAllowed(err): + c.Data["Err_UserName"] = true + c.RenderWithErr(c.Tr("user.form.name_not_allowed", err.(database.ErrNameNotAllowed).Value()), http.StatusBadRequest, tmplAdminUserNew, &f) + default: + c.Error(err, "create user") + } + return + } + log.Trace("Account %q created by admin %q", user.Name, c.User.Name) + + // Send email notification. + if f.SendNotify && conf.Email.Enabled { + if err := email.SendRegisterNotifyMail(c.Context, database.NewMailerUser(user)); err != nil { + log.Error("Failed to send register notify mail: %v", err) + } + } + + c.Flash.Success(c.Tr("admin.users.new_success", user.Name)) + c.Redirect(conf.Server.Subpath + "/admin/users/" + strconv.FormatInt(user.ID, 10)) +} + +func prepareUserInfo(c *context.Context) *database.User { + u, err := database.Handle.Users().GetByID(c.Req.Context(), c.ParamsInt64(":userid")) + if err != nil { + c.Error(err, "get user by ID") + return nil + } + c.Data["User"] = u + + if u.LoginSource > 0 { + c.Data["LoginSource"], err = database.Handle.LoginSources().GetByID(c.Req.Context(), u.LoginSource) + if err != nil { + c.Error(err, "get login source by ID") + return nil + } + } else { + c.Data["LoginSource"] = &database.LoginSource{} + } + + sources, err := database.Handle.LoginSources().List(c.Req.Context(), database.ListLoginSourceOptions{}) + if err != nil { + c.Error(err, "list login sources") + return nil + } + c.Data["Sources"] = sources + + return u +} + +func EditUser(c *context.Context) { + c.Data["Title"] = c.Tr("admin.users.edit_account") + c.Data["PageIsAdmin"] = true + c.Data["PageIsAdminUsers"] = true + c.Data["EnableLocalPathMigration"] = conf.Repository.EnableLocalPathMigration + + prepareUserInfo(c) + if c.Written() { + return + } + + c.Success(tmplAdminUserEdit) +} + +func EditUserPost(c *context.Context, f form.AdminEditUser) { + c.Data["Title"] = c.Tr("admin.users.edit_account") + c.Data["PageIsAdmin"] = true + c.Data["PageIsAdminUsers"] = true + c.Data["EnableLocalPathMigration"] = conf.Repository.EnableLocalPathMigration + + u := prepareUserInfo(c) + if c.Written() { + return + } + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplAdminUserEdit) + return + } + + opts := database.UpdateUserOptions{ + LoginName: &f.LoginName, + FullName: &f.FullName, + Website: &f.Website, + Location: &f.Location, + MaxRepoCreation: &f.MaxRepoCreation, + IsActivated: &f.Active, + IsAdmin: &f.Admin, + AllowGitHook: &f.AllowGitHook, + AllowImportLocal: &f.AllowImportLocal, + ProhibitLogin: &f.ProhibitLogin, + } + + fields := strings.Split(f.LoginType, "-") + if len(fields) == 2 { + loginSource, _ := strconv.ParseInt(fields[1], 10, 64) + if u.LoginSource != loginSource { + opts.LoginSource = &loginSource + } + } + + if f.Password != "" { + opts.Password = &f.Password + } + + if u.Email != f.Email { + opts.Email = &f.Email + } + + err := database.Handle.Users().Update(c.Req.Context(), u.ID, opts) + if err != nil { + if database.IsErrEmailAlreadyUsed(err) { + c.Data["Err_Email"] = true + c.RenderWithErr(c.Tr("form.email_been_used"), http.StatusUnprocessableEntity, tmplAdminUserEdit, &f) + } else { + c.Error(err, "update user") + } + return + } + log.Trace("Account updated by admin %q: %s", c.User.Name, u.Name) + + c.Flash.Success(c.Tr("admin.users.update_profile_success")) + c.Redirect(conf.Server.Subpath + "/admin/users/" + c.Params(":userid")) +} + +func DeleteUser(c *context.Context) { + u, err := database.Handle.Users().GetByID(c.Req.Context(), c.ParamsInt64(":userid")) + if err != nil { + c.Error(err, "get user by ID") + return + } + + if err = database.Handle.Users().DeleteByID(c.Req.Context(), u.ID, false); err != nil { + switch { + case database.IsErrUserOwnRepos(err): + c.Flash.Error(c.Tr("admin.users.still_own_repo")) + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/admin/users/" + c.Params(":userid"), + }) + case database.IsErrUserHasOrgs(err): + c.Flash.Error(c.Tr("admin.users.still_has_org")) + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/admin/users/" + c.Params(":userid"), + }) + default: + c.Error(err, "delete user") + } + return + } + log.Trace("Account deleted by admin (%s): %s", c.User.Name, u.Name) + + c.Flash.Success(c.Tr("admin.users.deletion_success")) + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/admin/users", + }) +} diff --git a/internal/route/api/v1/adapters.go b/internal/route/api/v1/adapters.go new file mode 100644 index 00000000000..2386575afe4 --- /dev/null +++ b/internal/route/api/v1/adapters.go @@ -0,0 +1,303 @@ +package v1 + +import ( + "context" + "fmt" + "strconv" + "strings" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/route/api/v1/types" +) + +// toAllowedPageSize makes sure page size is in allowed range. +func toAllowedPageSize(size int) int { + if size <= 0 { + size = 10 + } else if size > conf.API.MaxResponseItems { + size = conf.API.MaxResponseItems + } + return size +} + +// toUser converts a database user to an API user with the full name sanitized +// for safe HTML rendering. +func toUser(u *database.User) *types.User { + return &types.User{ + ID: u.ID, + UserName: u.Name, + Login: u.Name, + FullName: markup.Sanitize(u.FullName), + Email: u.Email, + AvatarURL: u.AvatarURL(), + } +} + +func toUserEmail(email *database.EmailAddress) *types.UserEmail { + return &types.UserEmail{ + Email: email.Email, + Verified: email.IsActivated, + Primary: email.IsPrimary, + } +} + +func toBranch(b *database.Branch, c *git.Commit) *types.RepositoryBranch { + return &types.RepositoryBranch{ + Name: b.Name, + Commit: toPayloadCommit(c), + } +} + +func toTag(b *database.Tag, c *git.Commit) *tag { + return &tag{ + Name: b.Name, + Commit: toPayloadCommit(c), + } +} + +func toPayloadCommit(c *git.Commit) *types.WebhookPayloadCommit { + authorUsername := "" + author, err := database.Handle.Users().GetByEmail(context.TODO(), c.Author.Email) + if err == nil { + authorUsername = author.Name + } + committerUsername := "" + committer, err := database.Handle.Users().GetByEmail(context.TODO(), c.Committer.Email) + if err == nil { + committerUsername = committer.Name + } + return &types.WebhookPayloadCommit{ + ID: c.ID.String(), + Message: c.Message, + URL: "Not implemented", + Author: &types.WebhookPayloadUser{ + Name: c.Author.Name, + Email: c.Author.Email, + UserName: authorUsername, + }, + Committer: &types.WebhookPayloadUser{ + Name: c.Committer.Name, + Email: c.Committer.Email, + UserName: committerUsername, + }, + Timestamp: c.Author.When, + } +} + +func toUserPublicKey(apiLink string, key *database.PublicKey) *types.UserPublicKey { + return &types.UserPublicKey{ + ID: key.ID, + Key: key.Content, + URL: apiLink + strconv.FormatInt(key.ID, 10), + Title: key.Name, + Created: key.Created, + } +} + +func toRepositoryHook(repoLink string, w *database.Webhook) *types.RepositoryHook { + config := map[string]string{ + "url": w.URL, + "content_type": w.ContentType.Name(), + } + if w.HookTaskType == database.SLACK { + s := w.SlackMeta() + config["channel"] = s.Channel + config["username"] = s.Username + config["icon_url"] = s.IconURL + config["color"] = s.Color + } + + return &types.RepositoryHook{ + ID: w.ID, + Type: w.HookTaskType.Name(), + URL: fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID), + Active: w.IsActive, + Config: config, + Events: w.EventsArray(), + Updated: w.Updated, + Created: w.Created, + } +} + +func toDeployKey(apiLink string, key *database.DeployKey) *types.RepositoryDeployKey { + return &types.RepositoryDeployKey{ + ID: key.ID, + Key: key.Content, + URL: apiLink + strconv.FormatInt(key.ID, 10), + Title: key.Name, + Created: key.Created, + ReadOnly: true, // All deploy keys are read-only. + } +} + +func toOrganization(org *database.User) *types.Organization { + return &types.Organization{ + ID: org.ID, + AvatarURL: org.AvatarURL(), + UserName: org.Name, + FullName: org.FullName, + Description: org.Description, + Website: org.Website, + Location: org.Location, + } +} + +func toOrganizationTeam(team *database.Team) *types.OrganizationTeam { + return &types.OrganizationTeam{ + ID: team.ID, + Name: team.Name, + Description: team.Description, + Permission: team.Authorize.String(), + } +} + +func toIssueLabel(l *database.Label) *types.IssueLabel { + return &types.IssueLabel{ + ID: l.ID, + Name: l.Name, + Color: strings.TrimLeft(l.Color, "#"), + } +} + +func issueState(isClosed bool) types.IssueStateType { + if isClosed { + return types.IssueStateClosed + } + return types.IssueStateOpen +} + +// toIssue converts a database issue to an API issue. +// It assumes the following fields have been assigned with valid values: +// Required - Poster, Labels +// Optional - Milestone, Assignee, PullRequest +func toIssue(issue *database.Issue) *types.Issue { + labels := make([]*types.IssueLabel, len(issue.Labels)) + for i := range issue.Labels { + labels[i] = toIssueLabel(issue.Labels[i]) + } + + apiIssue := &types.Issue{ + ID: issue.ID, + Index: issue.Index, + Poster: toUser(issue.Poster), + Title: issue.Title, + Body: issue.Content, + Labels: labels, + State: issueState(issue.IsClosed), + Comments: issue.NumComments, + Created: issue.Created, + Updated: issue.Updated, + } + + if issue.Milestone != nil { + apiIssue.Milestone = toIssueMilestone(issue.Milestone) + } + if issue.Assignee != nil { + apiIssue.Assignee = toUser(issue.Assignee) + } + if issue.IsPull { + apiIssue.PullRequest = &types.PullRequestMeta{ + HasMerged: issue.PullRequest.HasMerged, + } + if issue.PullRequest.HasMerged { + apiIssue.PullRequest.Merged = &issue.PullRequest.Merged + } + } + + return apiIssue +} + +func toIssueComment(c *database.Comment) *types.IssueComment { + return &types.IssueComment{ + ID: c.ID, + HTMLURL: c.HTMLURL(), + Poster: toUser(c.Poster), + Body: c.Content, + Created: c.Created, + Updated: c.Updated, + } +} + +func toIssueMilestone(m *database.Milestone) *types.IssueMilestone { + ms := &types.IssueMilestone{ + ID: m.ID, + State: issueState(m.IsClosed), + Title: m.Name, + Description: m.Content, + OpenIssues: m.NumOpenIssues, + ClosedIssues: m.NumClosedIssues, + } + if m.IsClosed { + ms.Closed = &m.ClosedDate + } + if m.Deadline.Year() < 9999 { + ms.Deadline = &m.Deadline + } + return ms +} + +// toRelease converts a database release to an API release. +// It assumes the Publisher field has been assigned. +func toRelease(r *database.Release) *types.RepositoryRelease { + return &types.RepositoryRelease{ + ID: r.ID, + TagName: r.TagName, + TargetCommitish: r.Target, + Name: r.Title, + Body: r.Note, + Draft: r.IsDraft, + Prerelease: r.IsPrerelease, + Author: toUser(r.Publisher), + Created: r.Created, + } +} + +func toRepositoryCollaborator(c *database.Collaborator) *types.RepositoryCollaborator { + return &types.RepositoryCollaborator{ + User: toUser(c.User), + Permissions: types.RepositoryPermission{ + Admin: c.Collaboration.Mode >= database.AccessModeAdmin, + Push: c.Collaboration.Mode >= database.AccessModeWrite, + Pull: c.Collaboration.Mode >= database.AccessModeRead, + }, + } +} + +// toRepository converts a database repository to an API repository. +// It assumes the Owner field has been loaded on the repo. +func toRepository(repo *database.Repository, perm *types.RepositoryPermission) *types.Repository { + cloneLink := repo.CloneLink() + apiRepo := &types.Repository{ + ID: repo.ID, + Owner: toUser(repo.Owner), + Name: repo.Name, + FullName: repo.FullName(), + Description: repo.Description, + Private: repo.IsPrivate, + Fork: repo.IsFork, + Empty: repo.IsBare, + Mirror: repo.IsMirror, + Size: repo.Size, + HTMLURL: repo.HTMLURL(), + SSHURL: cloneLink.SSH, + CloneURL: cloneLink.HTTPS, + Website: repo.Website, + Stars: repo.NumStars, + Forks: repo.NumForks, + Watchers: repo.NumWatches, + OpenIssues: repo.NumOpenIssues, + DefaultBranch: repo.DefaultBranch, + Created: repo.Created, + Updated: repo.Updated, + Permissions: perm, + } + if repo.IsFork { + p := &types.RepositoryPermission{Pull: true} + apiRepo.Parent = toRepository(repo.BaseRepo, p) + } + return apiRepo +} diff --git a/internal/route/api/v1/admin_org.go b/internal/route/api/v1/admin_org.go new file mode 100644 index 00000000000..10d7c9fa6e5 --- /dev/null +++ b/internal/route/api/v1/admin_org.go @@ -0,0 +1,9 @@ +package v1 + +import ( + "gogs.io/gogs/internal/context" +) + +func adminCreateOrg(c *context.APIContext, form createOrgRequest) { + createOrgForUser(c, form, getUserByParams(c)) +} diff --git a/internal/route/api/v1/admin_org_repo.go b/internal/route/api/v1/admin_org_repo.go new file mode 100644 index 00000000000..81f1aceb2f0 --- /dev/null +++ b/internal/route/api/v1/admin_org_repo.go @@ -0,0 +1,41 @@ +package v1 + +import ( + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" +) + +func getRepositoryByParams(c *context.APIContext) *database.Repository { + repo, err := database.GetRepositoryByName(c.Org.Team.OrgID, c.Params(":reponame")) + if err != nil { + c.NotFoundOrError(err, "get repository by name") + return nil + } + return repo +} + +func adminAddTeamRepository(c *context.APIContext) { + repo := getRepositoryByParams(c) + if c.Written() { + return + } + if err := c.Org.Team.AddRepository(repo); err != nil { + c.Error(err, "add repository") + return + } + + c.NoContent() +} + +func adminRemoveTeamRepository(c *context.APIContext) { + repo := getRepositoryByParams(c) + if c.Written() { + return + } + if err := c.Org.Team.RemoveRepository(repo.ID); err != nil { + c.Error(err, "remove repository") + return + } + + c.NoContent() +} diff --git a/internal/route/api/v1/admin_org_team.go b/internal/route/api/v1/admin_org_team.go new file mode 100644 index 00000000000..f8f0de43d66 --- /dev/null +++ b/internal/route/api/v1/admin_org_team.go @@ -0,0 +1,75 @@ +package v1 + +import ( + "net/http" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +type adminCreateTeamRequest struct { + Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(30)"` + Description string `json:"description" binding:"MaxSize(255)"` + Permission string `json:"permission"` +} + +func adminCreateTeam(c *context.APIContext, form adminCreateTeamRequest) { + team := &database.Team{ + OrgID: c.Org.Organization.ID, + Name: form.Name, + Description: form.Description, + Authorize: database.ParseAccessMode(form.Permission), + } + if err := database.NewTeam(team); err != nil { + if database.IsErrTeamAlreadyExist(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "new team") + } + return + } + + c.JSON(http.StatusCreated, toOrganizationTeam(team)) +} + +func adminAddTeamMember(c *context.APIContext) { + u := getUserByParams(c) + if c.Written() { + return + } + if err := c.Org.Team.AddMember(u.ID); err != nil { + c.Error(err, "add member") + return + } + + c.NoContent() +} + +func adminRemoveTeamMember(c *context.APIContext) { + u := getUserByParams(c) + if c.Written() { + return + } + + if err := c.Org.Team.RemoveMember(u.ID); err != nil { + c.Error(err, "remove member") + return + } + + c.NoContent() +} + +func adminListTeamMembers(c *context.APIContext) { + team := c.Org.Team + if err := team.GetMembers(); err != nil { + c.Error(err, "get team members") + return + } + + apiMembers := make([]*types.User, len(team.Members)) + for i := range team.Members { + apiMembers[i] = toUser(team.Members[i]) + } + c.JSONSuccess(apiMembers) +} diff --git a/internal/route/api/v1/admin_repo.go b/internal/route/api/v1/admin_repo.go new file mode 100644 index 00000000000..72dd87a3f45 --- /dev/null +++ b/internal/route/api/v1/admin_repo.go @@ -0,0 +1,14 @@ +package v1 + +import ( + "gogs.io/gogs/internal/context" +) + +func adminCreateRepo(c *context.APIContext, form createRepoRequest) { + owner := getUserByParams(c) + if c.Written() { + return + } + + createUserRepo(c, owner, form) +} diff --git a/internal/route/api/v1/admin_user.go b/internal/route/api/v1/admin_user.go new file mode 100644 index 00000000000..3dedc699ec1 --- /dev/null +++ b/internal/route/api/v1/admin_user.go @@ -0,0 +1,173 @@ +package v1 + +import ( + "net/http" + + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/email" +) + +func parseLoginSource(c *context.APIContext, sourceID int64) { + if sourceID == 0 { + return + } + + _, err := database.Handle.LoginSources().GetByID(c.Req.Context(), sourceID) + if err != nil { + if database.IsErrLoginSourceNotExist(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "get login source by ID") + } + return + } +} + +type adminCreateUserRequest struct { + SourceID int64 `json:"source_id"` + LoginName string `json:"login_name"` + Username string `json:"username" binding:"Required;AlphaDashDot;MaxSize(35)"` + FullName string `json:"full_name" binding:"MaxSize(100)"` + Email string `json:"email" binding:"Required;Email;MaxSize(254)"` + Password string `json:"password" binding:"MaxSize(255)"` + SendNotify bool `json:"send_notify"` +} + +func adminCreateUser(c *context.APIContext, form adminCreateUserRequest) { + parseLoginSource(c, form.SourceID) + if c.Written() { + return + } + + u, err := database.Handle.Users().Create( + c.Req.Context(), + form.Username, + form.Email, + database.CreateUserOptions{ + FullName: form.FullName, + Password: form.Password, + LoginSource: form.SourceID, + LoginName: form.LoginName, + Activated: true, + }, + ) + if err != nil { + if database.IsErrUserAlreadyExist(err) || + database.IsErrEmailAlreadyUsed(err) || + database.IsErrNameNotAllowed(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "create user") + } + return + } + log.Trace("Account %q created by admin %q", u.Name, c.User.Name) + + // Send email notification. + if form.SendNotify && conf.Email.Enabled { + if err := email.SendRegisterNotifyMail(c.Context.Context, database.NewMailerUser(u)); err != nil { + log.Error("Failed to send register notify mail: %v", err) + } + } + + c.JSON(http.StatusCreated, toUser(u)) +} + +type adminEditUserRequest struct { + SourceID int64 `json:"source_id"` + LoginName string `json:"login_name"` + FullName string `json:"full_name" binding:"MaxSize(100)"` + Email string `json:"email" binding:"Required;Email;MaxSize(254)"` + Password string `json:"password" binding:"MaxSize(255)"` + Website string `json:"website" binding:"MaxSize(50)"` + Location string `json:"location" binding:"MaxSize(50)"` + Active *bool `json:"active"` + Admin *bool `json:"admin"` + AllowGitHook *bool `json:"allow_git_hook"` + AllowImportLocal *bool `json:"allow_import_local"` + MaxRepoCreation *int `json:"max_repo_creation"` +} + +func adminEditUser(c *context.APIContext, form adminEditUserRequest) { + u := getUserByParams(c) + if c.Written() { + return + } + + parseLoginSource(c, form.SourceID) + if c.Written() { + return + } + + opts := database.UpdateUserOptions{ + LoginSource: &form.SourceID, + LoginName: &form.LoginName, + FullName: &form.FullName, + Website: &form.Website, + Location: &form.Location, + MaxRepoCreation: form.MaxRepoCreation, + IsActivated: form.Active, + IsAdmin: form.Admin, + AllowGitHook: form.AllowGitHook, + AllowImportLocal: form.AllowImportLocal, + ProhibitLogin: nil, // TODO: Add this option to API + } + + if form.Password != "" { + opts.Password = &form.Password + } + + if u.Email != form.Email { + opts.Email = &form.Email + } + + err := database.Handle.Users().Update(c.Req.Context(), u.ID, opts) + if err != nil { + if database.IsErrEmailAlreadyUsed(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "update user") + } + return + } + log.Trace("Account updated by admin %q: %s", c.User.Name, u.Name) + + u, err = database.Handle.Users().GetByID(c.Req.Context(), u.ID) + if err != nil { + c.Error(err, "get user") + return + } + c.JSONSuccess(toUser(u)) +} + +func adminDeleteUser(c *context.APIContext) { + u := getUserByParams(c) + if c.Written() { + return + } + + if err := database.Handle.Users().DeleteByID(c.Req.Context(), u.ID, false); err != nil { + if database.IsErrUserOwnRepos(err) || + database.IsErrUserHasOrgs(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "delete user") + } + return + } + log.Trace("Account deleted by admin(%s): %s", c.User.Name, u.Name) + + c.NoContent() +} + +func adminCreatePublicKey(c *context.APIContext, form createPublicKeyRequest) { + u := getUserByParams(c) + if c.Written() { + return + } + createUserPublicKey(c, form, u.ID) +} diff --git a/internal/route/api/v1/api.go b/internal/route/api/v1/api.go new file mode 100644 index 00000000000..b3033d0ac83 --- /dev/null +++ b/internal/route/api/v1/api.go @@ -0,0 +1,424 @@ +package v1 + +import ( + "net/http" + "strings" + + "github.com/go-macaron/binding" + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" +) + +// repoAssignment extracts information from URL parameters to retrieve the repository, +// and makes sure the context user has at least the read access to the repository. +func repoAssignment() macaron.Handler { + return func(c *context.APIContext) { + username := c.Params(":username") + reponame := c.Params(":reponame") + + var err error + var owner *database.User + + // Check if the context user is the repository owner. + if c.IsLogged && c.User.LowerName == strings.ToLower(username) { + owner = c.User + } else { + owner, err = database.Handle.Users().GetByUsername(c.Req.Context(), username) + if err != nil { + c.NotFoundOrError(err, "get user by name") + return + } + } + c.Repo.Owner = owner + + repo, err := database.Handle.Repositories().GetByName(c.Req.Context(), owner.ID, reponame) + if err != nil { + c.NotFoundOrError(err, "get repository by name") + return + } else if err = repo.GetOwner(); err != nil { + c.Error(err, "get owner") + return + } + + if c.IsTokenAuth && c.User.IsAdmin { + c.Repo.AccessMode = database.AccessModeOwner + } else { + c.Repo.AccessMode = database.Handle.Permissions().AccessMode(c.Req.Context(), c.UserID(), repo.ID, + database.AccessModeOptions{ + OwnerID: repo.OwnerID, + Private: repo.IsPrivate, + }, + ) + } + + if !c.Repo.HasAccess() { + c.NotFound() + return + } + + c.Repo.Repository = repo + } +} + +// orgAssignment extracts information from URL parameters to retrieve the organization or team. +func orgAssignment(args ...bool) macaron.Handler { + var ( + assignOrg bool + assignTeam bool + ) + if len(args) > 0 { + assignOrg = args[0] + } + if len(args) > 1 { + assignTeam = args[1] + } + return func(c *context.APIContext) { + c.Org = new(context.APIOrganization) + + var err error + if assignOrg { + c.Org.Organization, err = database.Handle.Users().GetByUsername(c.Req.Context(), c.Params(":orgname")) + if err != nil { + c.NotFoundOrError(err, "get organization by name") + return + } + } + + if assignTeam { + c.Org.Team, err = database.GetTeamByID(c.ParamsInt64(":teamid")) + if err != nil { + c.NotFoundOrError(err, "get team by ID") + return + } + } + } +} + +// reqToken makes sure the context user is authorized via access token. +func reqToken() macaron.Handler { + return func(c *context.Context) { + if !c.IsTokenAuth { + c.Status(http.StatusUnauthorized) + return + } + } +} + +// reqBasicAuth makes sure the context user is authorized via HTTP Basic Auth. +func reqBasicAuth() macaron.Handler { + return func(c *context.Context) { + if !c.IsBasicAuth { + c.Status(http.StatusUnauthorized) + return + } + } +} + +// reqAdmin makes sure the context user is a site admin. +func reqAdmin() macaron.Handler { + return func(c *context.Context) { + if !c.IsLogged || !c.User.IsAdmin { + c.Status(http.StatusForbidden) + return + } + } +} + +// reqRepoWriter makes sure the context user has at least write access to the repository. +func reqRepoWriter() macaron.Handler { + return func(c *context.Context) { + if !c.Repo.IsWriter() { + c.Status(http.StatusForbidden) + return + } + } +} + +// reqRepoAdmin makes sure the context user has at least admin access to the repository. +func reqRepoAdmin() macaron.Handler { + return func(c *context.Context) { + if !c.Repo.IsAdmin() { + c.Status(http.StatusForbidden) + return + } + } +} + +// reqRepoOwner makes sure the context user has owner access to the repository. +func reqRepoOwner() macaron.Handler { + return func(c *context.Context) { + if !c.Repo.IsOwner() { + c.Status(http.StatusForbidden) + return + } + } +} + +func mustEnableIssues(c *context.APIContext) { + if !c.Repo.Repository.EnableIssues || c.Repo.Repository.EnableExternalTracker { + c.NotFound() + return + } +} + +// RegisterRoutes registers all route in API v1 to the web application. +// FIXME: custom form error response +func RegisterRoutes(m *macaron.Macaron) { + bind := binding.Bind + + m.Group("/v1", func() { + // Handle preflight OPTIONS request + m.Options("/*", func() {}) + + // Miscellaneous + m.Post("/markdown", bind(markdownRequest{}), markdown) + m.Post("/markdown/raw", markdownRaw) + + // Users + m.Group("/users", func() { + m.Get("/search", searchUsers) + + m.Group("/:username", func() { + m.Get("", getUserProfile) + + m.Group("/tokens", func() { + accessTokensHandler := newAccessTokensHandler(newAccessTokensStore()) + m.Combo(""). + Get(accessTokensHandler.List()). + Post(bind(createAccessTokenRequest{}), accessTokensHandler.Create()) + }, reqBasicAuth()) + }) + }) + + m.Group("/users", func() { + m.Group("/:username", func() { + m.Get("/keys", listPublicKeys) + + m.Get("/followers", listFollowers) + m.Group("/following", func() { + m.Get("", listFollowing) + m.Get("/:target", checkFollowing) + }) + }) + }, reqToken()) + + m.Group("/user", func() { + m.Get("", getAuthenticatedUser) + m.Combo("/emails"). + Get(listEmails). + Post(bind(createEmailRequest{}), addEmail). + Delete(bind(createEmailRequest{}), deleteEmail) + + m.Get("/followers", listMyFollowers) + m.Group("/following", func() { + m.Get("", listMyFollowing) + m.Combo("/:username"). + Get(checkMyFollowing). + Put(follow). + Delete(unfollow) + }) + + m.Group("/keys", func() { + m.Combo(""). + Get(listMyPublicKeys). + Post(bind(createPublicKeyRequest{}), createPublicKey) + m.Combo("/:id"). + Get(getPublicKey). + Delete(deletePublicKey) + }) + + m.Get("/issues", listUserIssues) + }, reqToken()) + + // Repositories + m.Get("/users/:username/repos", reqToken(), listUserRepositories) + m.Get("/orgs/:org/repos", reqToken(), listOrgRepositories) + m.Combo("/user/repos", reqToken()). + Get(listMyRepos). + Post(bind(createRepoRequest{}), createRepo) + m.Post("/org/:org/repos", reqToken(), bind(createRepoRequest{}), createOrgRepo) + + m.Group("/repos", func() { + m.Get("/search", searchRepos) + + m.Get("/:username/:reponame", repoAssignment(), getRepo) + m.Get("/:username/:reponame/releases", repoAssignment(), releases) + }) + + m.Group("/repos", func() { + m.Post("/migrate", bind(form.MigrateRepo{}), migrate) + m.Delete("/:username/:reponame", repoAssignment(), reqRepoOwner(), deleteRepo) + + m.Group("/:username/:reponame", func() { + m.Group("/hooks", func() { + m.Combo(""). + Get(listHooks). + Post(bind(createHookRequest{}), createHook) + m.Combo("/:id"). + Patch(bind(editHookRequest{}), editHook). + Delete(deleteHook) + }, reqRepoAdmin()) + + m.Group("/collaborators", func() { + m.Get("", listCollaborators) + m.Combo("/:collaborator"). + Get(isCollaborator). + Put(bind(addCollaboratorRequest{}), addCollaborator). + Delete(deleteCollaborator) + }, reqRepoAdmin()) + + m.Get("/raw/*", context.RepoRef(), getRawFile) + m.Group("/contents", func() { + m.Get("", getContents) + m.Combo("/*"). + Get(getContents). + Put(reqRepoWriter(), bind(putContentsRequest{}), putContents) + }) + m.Get("/archive/*", getArchive) + m.Group("/git", func() { + m.Group("/trees", func() { + m.Get("/:sha", getRepoGitTree) + }) + m.Group("/blobs", func() { + m.Get("/:sha", repoGitBlob) + }) + }) + m.Get("/forks", listForks) + m.Get("/tags", listTags) + m.Group("/branches", func() { + m.Get("", listBranches) + m.Get("/*", getBranch) + }) + m.Group("/commits", func() { + m.Get("/:sha", getSingleCommit) + m.Get("", getAllCommits) + m.Get("/*", getReferenceSHA) + }) + + m.Group("/keys", func() { + m.Combo(""). + Get(listDeployKeys). + Post(bind(createDeployKeyRequest{}), createDeployKey) + m.Combo("/:id"). + Get(getDeployKey). + Delete(deleteDeploykey) + }, reqRepoAdmin()) + + m.Group("/issues", func() { + m.Combo(""). + Get(listIssues). + Post(bind(createIssueRequest{}), createIssue) + m.Group("/comments", func() { + m.Get("", listRepoIssueComments) + m.Patch("/:id", bind(editIssueCommentRequest{}), editIssueComment) + }) + m.Group("/:index", func() { + m.Combo(""). + Get(getIssue). + Patch(bind(editIssueRequest{}), editIssue) + + m.Group("/comments", func() { + m.Combo(""). + Get(listIssueComments). + Post(bind(createIssueCommentRequest{}), createIssueComment) + m.Combo("/:id"). + Patch(bind(editIssueCommentRequest{}), editIssueComment). + Delete(deleteIssueComment) + }) + + m.Get("/labels", listIssueLabels) + m.Group("/labels", func() { + m.Combo(""). + Post(bind(issueLabelsRequest{}), addIssueLabels). + Put(bind(issueLabelsRequest{}), replaceIssueLabels). + Delete(clearIssueLabels) + m.Delete("/:id", deleteIssueLabel) + }, reqRepoWriter()) + }) + }, mustEnableIssues) + + m.Group("/labels", func() { + m.Get("", listLabels) + m.Get("/:id", getLabel) + }) + m.Group("/labels", func() { + m.Post("", bind(createLabelRequest{}), createLabel) + m.Combo("/:id"). + Patch(bind(editLabelRequest{}), editLabel). + Delete(deleteLabel) + }, reqRepoWriter()) + + m.Group("/milestones", func() { + m.Get("", listMilestones) + m.Get("/:id", getMilestone) + }) + m.Group("/milestones", func() { + m.Post("", bind(createMilestoneRequest{}), createMilestone) + m.Combo("/:id"). + Patch(bind(editMilestoneRequest{}), editMilestone). + Delete(deleteMilestone) + }, reqRepoWriter()) + + m.Patch("/issue-tracker", reqRepoWriter(), bind(editIssueTrackerRequest{}), issueTracker) + m.Patch("/wiki", reqRepoWriter(), bind(editWikiRequest{}), wiki) + m.Post("/mirror-sync", reqRepoWriter(), mirrorSync) + m.Get("/editorconfig/:filename", context.RepoRef(), getEditorconfig) + }, repoAssignment()) + }, reqToken()) + + m.Get("/issues", reqToken(), listUserIssues) + + // Organizations + m.Combo("/user/orgs", reqToken()). + Get(listMyOrgs). + Post(bind(createOrgRequest{}), createMyOrg) + + m.Get("/users/:username/orgs", listUserOrgs) + m.Group("/orgs/:orgname", func() { + m.Combo(""). + Get(getOrg). + Patch(bind(editOrgRequest{}), editOrg) + m.Get("/teams", listTeams) + }, orgAssignment(true)) + + m.Group("/admin", func() { + m.Group("/users", func() { + m.Post("", bind(adminCreateUserRequest{}), adminCreateUser) + + m.Group("/:username", func() { + m.Combo(""). + Patch(bind(adminEditUserRequest{}), adminEditUser). + Delete(adminDeleteUser) + m.Post("/keys", bind(createPublicKeyRequest{}), adminCreatePublicKey) + m.Post("/orgs", bind(createOrgRequest{}), adminCreateOrg) + m.Post("/repos", bind(createRepoRequest{}), adminCreateRepo) + }) + }) + + m.Group("/orgs/:orgname", func() { + m.Group("/teams", func() { + m.Post("", orgAssignment(true), bind(adminCreateTeamRequest{}), adminCreateTeam) + }) + }) + + m.Group("/teams", func() { + m.Group("/:teamid", func() { + m.Get("/members", adminListTeamMembers) + m.Combo("/members/:username"). + Put(adminAddTeamMember). + Delete(adminRemoveTeamMember) + m.Combo("/repos/:reponame"). + Put(adminAddTeamRepository). + Delete(adminRemoveTeamRepository) + }, orgAssignment(false, true)) + }) + }, reqAdmin()) + + m.Any("/*", func(c *context.Context) { + c.NotFound() + }) + }, context.APIContexter()) +} diff --git a/internal/route/api/v1/markdown.go b/internal/route/api/v1/markdown.go new file mode 100644 index 00000000000..4c32c2784df --- /dev/null +++ b/internal/route/api/v1/markdown.go @@ -0,0 +1,30 @@ +package v1 + +import ( + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/markup" +) + +// markdownRequest represents the request body for rendering markdown. +type markdownRequest struct { + Text string + Context string +} + +func markdown(c *context.APIContext, form markdownRequest) { + if form.Text == "" { + _, _ = c.Write([]byte("")) + return + } + + _, _ = c.Write(markup.Markdown([]byte(form.Text), form.Context, nil)) +} + +func markdownRaw(c *context.APIContext) { + body, err := c.Req.Body().Bytes() + if err != nil { + c.Error(err, "read body") + return + } + _, _ = c.Write(markup.SanitizeBytes(markup.RawMarkdown(body, ""))) +} diff --git a/internal/route/api/v1/org.go b/internal/route/api/v1/org.go new file mode 100644 index 00000000000..5f2a47105c5 --- /dev/null +++ b/internal/route/api/v1/org.go @@ -0,0 +1,121 @@ +package v1 + +import ( + "net/http" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +type createOrgRequest struct { + UserName string `json:"username" binding:"Required"` + FullName string `json:"full_name"` + Description string `json:"description"` + Website string `json:"website"` + Location string `json:"location"` +} + +func createOrgForUser(c *context.APIContext, apiForm createOrgRequest, user *database.User) { + if c.Written() { + return + } + + org := &database.User{ + Name: apiForm.UserName, + FullName: apiForm.FullName, + Description: apiForm.Description, + Website: apiForm.Website, + Location: apiForm.Location, + IsActive: true, + Type: database.UserTypeOrganization, + } + if err := database.CreateOrganization(org, user); err != nil { + if database.IsErrUserAlreadyExist(err) || + database.IsErrNameNotAllowed(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "create organization") + } + return + } + + c.JSON(201, toOrganization(org)) +} + +func listOrgsOfUser(c *context.APIContext, u *database.User, all bool) { + orgs, err := database.Handle.Organizations().List( + c.Req.Context(), + database.ListOrgsOptions{ + MemberID: u.ID, + IncludePrivateMembers: all, + }, + ) + if err != nil { + c.Error(err, "list organizations") + return + } + + apiOrgs := make([]*types.Organization, len(orgs)) + for i := range orgs { + apiOrgs[i] = toOrganization(orgs[i]) + } + c.JSONSuccess(&apiOrgs) +} + +func listMyOrgs(c *context.APIContext) { + listOrgsOfUser(c, c.User, true) +} + +func createMyOrg(c *context.APIContext, apiForm createOrgRequest) { + createOrgForUser(c, apiForm, c.User) +} + +func listUserOrgs(c *context.APIContext) { + u := getUserByParams(c) + if c.Written() { + return + } + listOrgsOfUser(c, u, false) +} + +func getOrg(c *context.APIContext) { + c.JSONSuccess(toOrganization(c.Org.Organization)) +} + +type editOrgRequest struct { + FullName string `json:"full_name"` + Description string `json:"description"` + Website string `json:"website"` + Location string `json:"location"` +} + +func editOrg(c *context.APIContext, form editOrgRequest) { + org := c.Org.Organization + if !org.IsOwnedBy(c.User.ID) { + c.Status(http.StatusForbidden) + return + } + + err := database.Handle.Users().Update( + c.Req.Context(), + c.Org.Organization.ID, + database.UpdateUserOptions{ + FullName: &form.FullName, + Website: &form.Website, + Location: &form.Location, + Description: &form.Description, + }, + ) + if err != nil { + c.Error(err, "update organization") + return + } + + org, err = database.GetOrgByName(org.Name) + if err != nil { + c.Error(err, "get organization") + return + } + c.JSONSuccess(toOrganization(org)) +} diff --git a/internal/route/api/v1/org_team.go b/internal/route/api/v1/org_team.go new file mode 100644 index 00000000000..826fb8ab00c --- /dev/null +++ b/internal/route/api/v1/org_team.go @@ -0,0 +1,20 @@ +package v1 + +import ( + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func listTeams(c *context.APIContext) { + org := c.Org.Organization + if err := org.GetTeams(); err != nil { + c.Error(err, "get teams") + return + } + + apiTeams := make([]*types.OrganizationTeam, len(org.Teams)) + for i := range org.Teams { + apiTeams[i] = toOrganizationTeam(org.Teams[i]) + } + c.JSONSuccess(apiTeams) +} diff --git a/internal/route/api/v1/repo_blob.go b/internal/route/api/v1/repo_blob.go new file mode 100644 index 00000000000..50f04be30ed --- /dev/null +++ b/internal/route/api/v1/repo_blob.go @@ -0,0 +1,49 @@ +package v1 + +import ( + "encoding/base64" + "fmt" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/repox" +) + +func repoGitBlob(c *context.APIContext) { + gitRepo, err := git.Open(repox.RepositoryPath(c.Params(":username"), c.Params(":reponame"))) + if err != nil { + c.Error(err, "open repository") + return + } + + sha := c.Params(":sha") + blob, err := gitRepo.CatFileBlob(sha) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get blob") + return + } + + type repoGitBlob struct { + Content string `json:"content"` + Encoding string `json:"encoding"` + URL string `json:"url"` + SHA string `json:"sha"` + Size int64 `json:"size"` + } + + content, err := blob.Blob().Bytes() + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get blob content") + return + } + + c.JSONSuccess(&repoGitBlob{ + Content: base64.StdEncoding.EncodeToString(content), + Encoding: "base64", + URL: fmt.Sprintf("%s/repos/%s/%s/git/blobs/%s", c.BaseURL, c.Params(":username"), c.Params(":reponame"), sha), + SHA: sha, + Size: blob.Size(), + }) +} diff --git a/internal/route/api/v1/repo_branch.go b/internal/route/api/v1/repo_branch.go new file mode 100644 index 00000000000..4f6b02c68f5 --- /dev/null +++ b/internal/route/api/v1/repo_branch.go @@ -0,0 +1,44 @@ +package v1 + +import ( + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/route/api/v1/types" +) + +// https://github.com/gogs/go-gogs-client/wiki/Repositories#get-branch +func getBranch(c *context.APIContext) { + branch, err := c.Repo.Repository.GetBranch(c.Params("*")) + if err != nil { + c.NotFoundOrError(err, "get branch") + return + } + + commit, err := branch.GetCommit() + if err != nil { + c.Error(err, "get commit") + return + } + + c.JSONSuccess(toBranch(branch, commit)) +} + +// https://github.com/gogs/go-gogs-client/wiki/Repositories#list-branches +func listBranches(c *context.APIContext) { + branches, err := c.Repo.Repository.GetBranches() + if err != nil { + c.Error(err, "get branches") + return + } + + apiBranches := make([]*types.RepositoryBranch, len(branches)) + for i := range branches { + commit, err := branches[i].GetCommit() + if err != nil { + c.Error(err, "get commit") + return + } + apiBranches[i] = toBranch(branches[i], commit) + } + + c.JSONSuccess(&apiBranches) +} diff --git a/internal/route/api/v1/repo_collaborators.go b/internal/route/api/v1/repo_collaborators.go new file mode 100644 index 00000000000..8f621851928 --- /dev/null +++ b/internal/route/api/v1/repo_collaborators.go @@ -0,0 +1,90 @@ +package v1 + +import ( + "net/http" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func listCollaborators(c *context.APIContext) { + collaborators, err := c.Repo.Repository.GetCollaborators() + if err != nil { + c.Error(err, "get collaborators") + return + } + + apiCollaborators := make([]*types.RepositoryCollaborator, len(collaborators)) + for i := range collaborators { + apiCollaborators[i] = toRepositoryCollaborator(collaborators[i]) + } + c.JSONSuccess(&apiCollaborators) +} + +type addCollaboratorRequest struct { + Permission *string `json:"permission"` +} + +func addCollaborator(c *context.APIContext, form addCollaboratorRequest) { + collaborator, err := database.Handle.Users().GetByUsername(c.Req.Context(), c.Params(":collaborator")) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Status(http.StatusUnprocessableEntity) + } else { + c.Error(err, "get user by name") + } + return + } + + if err := c.Repo.Repository.AddCollaborator(collaborator); err != nil { + c.Error(err, "add collaborator") + return + } + + if form.Permission != nil { + if err := c.Repo.Repository.ChangeCollaborationAccessMode(collaborator.ID, database.ParseAccessMode(*form.Permission)); err != nil { + c.Error(err, "change collaboration access mode") + return + } + } + + c.NoContent() +} + +func isCollaborator(c *context.APIContext) { + collaborator, err := database.Handle.Users().GetByUsername(c.Req.Context(), c.Params(":collaborator")) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Status(http.StatusUnprocessableEntity) + } else { + c.Error(err, "get user by name") + } + return + } + + if !c.Repo.Repository.IsCollaborator(collaborator.ID) { + c.NotFound() + } else { + c.NoContent() + } +} + +func deleteCollaborator(c *context.APIContext) { + collaborator, err := database.Handle.Users().GetByUsername(c.Req.Context(), c.Params(":collaborator")) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Status(http.StatusUnprocessableEntity) + } else { + c.Error(err, "get user by name") + } + return + } + + if err := c.Repo.Repository.DeleteCollaboration(collaborator.ID); err != nil { + c.Error(err, "delete collaboration") + return + } + + c.NoContent() +} diff --git a/internal/route/api/v1/repo_commits.go b/internal/route/api/v1/repo_commits.go new file mode 100644 index 00000000000..7bbcf8b6a22 --- /dev/null +++ b/internal/route/api/v1/repo_commits.go @@ -0,0 +1,179 @@ +package v1 + +import ( + "net/http" + "strings" + "time" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/route/api/v1/types" +) + +const mediaApplicationSHA = "application/vnd.gogs.sha" + +// getAllCommits returns a slice of commits starting from HEAD. +func getAllCommits(c *context.APIContext) { + // Get pagesize, set default if it is not specified. + pageSize := c.QueryInt("pageSize") + if pageSize == 0 { + pageSize = 30 + } + + gitRepo, err := git.Open(c.Repo.Repository.RepoPath()) + if err != nil { + c.Error(err, "open repository") + return + } + + // The response object returned as JSON + result := make([]*types.Commit, 0, pageSize) + commits, err := gitRepo.Log("HEAD", git.LogOptions{MaxCount: pageSize}) + if err != nil { + c.Error(err, "git log") + } + + for _, commit := range commits { + apiCommit, err := gitCommitToAPICommit(commit, c) + if err != nil { + c.Error(err, "convert git commit to api commit") + return + } + result = append(result, apiCommit) + } + + c.JSONSuccess(result) +} + +// getSingleCommit will return a single Commit object based on the specified SHA. +func getSingleCommit(c *context.APIContext) { + if strings.Contains(c.Req.Header.Get("Accept"), mediaApplicationSHA) { + c.SetParams("*", c.Params(":sha")) + getReferenceSHA(c) + return + } + + gitRepo, err := git.Open(c.Repo.Repository.RepoPath()) + if err != nil { + c.Error(err, "open repository") + return + } + commit, err := gitRepo.CatFileCommit(c.Params(":sha")) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get commit") + return + } + + apiCommit, err := gitCommitToAPICommit(commit, c) + if err != nil { + c.Error(err, "convert git commit to api commit") + } + c.JSONSuccess(apiCommit) +} + +func getReferenceSHA(c *context.APIContext) { + gitRepo, err := git.Open(c.Repo.Repository.RepoPath()) + if err != nil { + c.Error(err, "open repository") + return + } + + ref := c.Params("*") + refType := 0 // 0-unknown, 1-branch, 2-tag + if after, ok := strings.CutPrefix(ref, git.RefsHeads); ok { + ref = after + refType = 1 + } else if after, ok := strings.CutPrefix(ref, git.RefsTags); ok { + ref = after + refType = 2 + } else { + if gitRepo.HasBranch(ref) { + refType = 1 + } else if gitRepo.HasTag(ref) { + refType = 2 + } else { + c.NotFound() + return + } + } + + var sha string + switch refType { + case 1: + sha, err = gitRepo.BranchCommitID(ref) + case 2: + sha, err = gitRepo.TagCommitID(ref) + } + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get reference commit ID") + return + } + c.PlainText(http.StatusOK, sha) +} + +// gitCommitToApiCommit is a helper function to convert git commit object to API commit. +func gitCommitToAPICommit(commit *git.Commit, c *context.APIContext) (*types.Commit, error) { + // Retrieve author and committer information + var apiAuthor, apiCommitter *types.User + author, err := database.Handle.Users().GetByEmail(c.Req.Context(), commit.Author.Email) + if err != nil && !database.IsErrUserNotExist(err) { + return nil, err + } else if err == nil { + apiAuthor = toUser(author) + } + + // Save one query if the author is also the committer + if commit.Committer.Email == commit.Author.Email { + apiCommitter = apiAuthor + } else { + committer, err := database.Handle.Users().GetByEmail(c.Req.Context(), commit.Committer.Email) + if err != nil && !database.IsErrUserNotExist(err) { + return nil, err + } else if err == nil { + apiCommitter = toUser(committer) + } + } + + // Retrieve parent(s) of the commit + apiParents := make([]*types.CommitMeta, commit.ParentsCount()) + for i := 0; i < commit.ParentsCount(); i++ { + sha, _ := commit.ParentID(i) + apiParents[i] = &types.CommitMeta{ + URL: c.BaseURL + "/repos/" + c.Repo.Repository.FullName() + "/commits/" + sha.String(), + SHA: sha.String(), + } + } + + return &types.Commit{ + CommitMeta: &types.CommitMeta{ + URL: conf.Server.ExternalURL + c.Link[1:], + SHA: commit.ID.String(), + }, + HTMLURL: c.Repo.Repository.HTMLURL() + "/commits/" + commit.ID.String(), + RepoCommit: &types.RepoCommit{ + URL: conf.Server.ExternalURL + c.Link[1:], + Author: &types.CommitUser{ + Name: commit.Author.Name, + Email: commit.Author.Email, + Date: commit.Author.When.Format(time.RFC3339), + }, + Committer: &types.CommitUser{ + Name: commit.Committer.Name, + Email: commit.Committer.Email, + Date: commit.Committer.When.Format(time.RFC3339), + }, + Message: commit.Summary(), + Tree: &types.CommitMeta{ + URL: c.BaseURL + "/repos/" + c.Repo.Repository.FullName() + "/tree/" + commit.ID.String(), + SHA: commit.ID.String(), + }, + }, + Author: apiAuthor, + Committer: apiCommitter, + Parents: apiParents, + }, nil +} diff --git a/internal/route/api/v1/repo_contents.go b/internal/route/api/v1/repo_contents.go new file mode 100644 index 00000000000..aa3defd6457 --- /dev/null +++ b/internal/route/api/v1/repo_contents.go @@ -0,0 +1,247 @@ +package v1 + +import ( + "encoding/base64" + "fmt" + "net/http" + "path" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/pathx" + "gogs.io/gogs/internal/repox" +) + +type links struct { + Git string `json:"git"` + Self string `json:"self"` + HTML string `json:"html"` +} + +type repoContent struct { + Type string `json:"type"` + Target string `json:"target,omitempty"` + SubmoduleGitURL string `json:"submodule_git_url,omitempty"` + Encoding string `json:"encoding,omitempty"` + Size int64 `json:"size"` + Name string `json:"name"` + Path string `json:"path"` + Content string `json:"content,omitempty"` + Sha string `json:"sha"` + URL string `json:"url"` + GitURL string `json:"git_url"` + HTMLURL string `json:"html_url"` + DownloadURL string `json:"download_url"` + Links links `json:"_links"` +} + +func toRepoContent(c *context.APIContext, ref, subpath string, commit *git.Commit, entry *git.TreeEntry) (*repoContent, error) { + repoURL := fmt.Sprintf("%s/repos/%s/%s", c.BaseURL, c.Params(":username"), c.Params(":reponame")) + selfURL := fmt.Sprintf("%s/contents/%s", repoURL, subpath) + htmlURL := fmt.Sprintf("%s/src/%s/%s", repox.HTMLURL(c.Repo.Owner.Name, c.Repo.Repository.Name), ref, entry.Name()) + downloadURL := fmt.Sprintf("%s/raw/%s/%s", repox.HTMLURL(c.Repo.Owner.Name, c.Repo.Repository.Name), ref, entry.Name()) + + content := &repoContent{ + Size: entry.Size(), + Name: entry.Name(), + Path: subpath, + Sha: entry.ID().String(), + URL: selfURL, + HTMLURL: htmlURL, + DownloadURL: downloadURL, + Links: links{ + Self: selfURL, + HTML: htmlURL, + }, + } + + switch { + case entry.IsBlob(), entry.IsExec(): + content.Type = "file" + p, err := entry.Blob().Bytes() + if err != nil { + return nil, errors.Wrap(err, "get blob content") + } + content.Encoding = "base64" + content.Content = base64.StdEncoding.EncodeToString(p) + content.GitURL = fmt.Sprintf("%s/git/blobs/%s", repoURL, entry.ID().String()) + + case entry.IsTree(): + content.Type = "dir" + content.GitURL = fmt.Sprintf("%s/git/trees/%s", repoURL, entry.ID().String()) + + case entry.IsSymlink(): + content.Type = "symlink" + p, err := entry.Blob().Bytes() + if err != nil { + return nil, errors.Wrap(err, "get blob content") + } + content.Target = string(p) + + case entry.IsCommit(): + content.Type = "submodule" + mod, err := commit.Submodule(subpath) + if err != nil { + return nil, errors.Wrap(err, "get submodule") + } + content.SubmoduleGitURL = mod.URL + + default: + panic("unreachable") + } + + content.Links.Git = content.GitURL + return content, nil +} + +func getContents(c *context.APIContext) { + repoPath := repox.RepositoryPath(c.Params(":username"), c.Params(":reponame")) + gitRepo, err := git.Open(repoPath) + if err != nil { + c.Error(err, "open repository") + return + } + + ref := c.Query("ref") + if ref == "" { + ref = c.Repo.Repository.DefaultBranch + } + + commit, err := gitRepo.CatFileCommit(ref) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get commit") + return + } + + // 🚨 SECURITY: Prevent path traversal. + treePath := pathx.Clean(c.Params("*")) + entry, err := commit.TreeEntry(treePath) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get tree entry") + return + } + + if !entry.IsTree() { + content, err := toRepoContent(c, ref, treePath, commit, entry) + if err != nil { + c.Errorf(err, "convert %q to repoContent", treePath) + return + } + + c.JSONSuccess(content) + return + } + + // The entry is a directory + dir, err := gitRepo.LsTree(entry.ID().String(), git.LsTreeOptions{Verbatim: true}) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get tree") + return + } + + entries, err := dir.Entries(git.LsTreeOptions{Verbatim: true}) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "list entries") + return + } + + if len(entries) == 0 { + c.JSONSuccess([]string{}) + return + } + + contents := make([]*repoContent, 0, len(entries)) + for _, entry := range entries { + subpath := path.Join(treePath, entry.Name()) + content, err := toRepoContent(c, ref, subpath, commit, entry) + if err != nil { + c.Errorf(err, "convert %q to repoContent", subpath) + return + } + + contents = append(contents, content) + } + c.JSONSuccess(contents) +} + +// putContentsRequest is the API message for creating or updating a file. +type putContentsRequest struct { + Message string `json:"message" binding:"Required"` + Content string `json:"content" binding:"Required"` + Branch string `json:"branch"` +} + +// PUT /repos/:username/:reponame/contents/* +func putContents(c *context.APIContext, r putContentsRequest) { + content, err := base64.StdEncoding.DecodeString(r.Content) + if err != nil { + c.Error(err, "decoding base64") + return + } + + if r.Branch == "" { + r.Branch = c.Repo.Repository.DefaultBranch + } + + // 🚨 SECURITY: Prevent path traversal. + treePath := pathx.Clean(c.Params("*")) + + err = c.Repo.Repository.UpdateRepoFile( + c.User, + database.UpdateRepoFileOptions{ + OldBranch: c.Repo.Repository.DefaultBranch, + NewBranch: r.Branch, + OldTreeName: treePath, + NewTreeName: treePath, + Message: r.Message, + Content: string(content), + }, + ) + if err != nil { + c.Error(err, "updating repository file") + return + } + + repoPath := repox.RepositoryPath(c.Params(":username"), c.Params(":reponame")) + gitRepo, err := git.Open(repoPath) + if err != nil { + c.Error(err, "open repository") + return + } + + commit, err := gitRepo.CatFileCommit(r.Branch) + if err != nil { + c.Error(err, "get file commit") + return + } + + entry, err := commit.TreeEntry(treePath) + if err != nil { + c.Error(err, "get tree entry") + return + } + + apiContent, err := toRepoContent(c, r.Branch, treePath, commit, entry) + if err != nil { + c.Error(err, "convert to *repoContent") + return + } + + apiCommit, err := gitCommitToAPICommit(commit, c) + if err != nil { + c.Error(err, "convert to *api.Commit") + return + } + + c.JSON( + http.StatusCreated, + map[string]any{ + "content": apiContent, + "commit": apiCommit, + }, + ) +} diff --git a/internal/route/api/v1/repo_file.go b/internal/route/api/v1/repo_file.go new file mode 100644 index 00000000000..5e3e4ea5eda --- /dev/null +++ b/internal/route/api/v1/repo_file.go @@ -0,0 +1,63 @@ +package v1 + +import ( + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/gitx" + routerepo "gogs.io/gogs/internal/route/repo" +) + +func getRawFile(c *context.APIContext) { + if !c.Repo.HasAccess() { + c.NotFound() + return + } + + if c.Repo.Repository.IsBare { + c.NotFound() + return + } + + blob, err := c.Repo.Commit.Blob(c.Repo.TreePath) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get blob") + return + } + if err = routerepo.ServeBlob(c.Context, blob); err != nil { + c.Error(err, "serve blob") + } +} + +func getArchive(c *context.APIContext) { + repoPath := database.RepoPath(c.Params(":username"), c.Params(":reponame")) + gitRepo, err := git.Open(repoPath) + if err != nil { + c.Error(err, "open repository") + return + } + c.Repo.GitRepo = gitRepo + + routerepo.Download(c.Context) +} + +func getEditorconfig(c *context.APIContext) { + ec, err := c.Repo.Editorconfig() + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get .editorconfig") + return + } + + fileName := c.Params("filename") + def, err := ec.GetDefinitionForFilename(fileName) + if err != nil { + c.Error(err, "get definition for filename") + return + } + if def == nil { + c.NotFound() + return + } + c.JSONSuccess(def) +} diff --git a/internal/route/api/v1/repo_hook.go b/internal/route/api/v1/repo_hook.go new file mode 100644 index 00000000000..73c5eb342c7 --- /dev/null +++ b/internal/route/api/v1/repo_hook.go @@ -0,0 +1,190 @@ +package v1 + +import ( + "encoding/json" + "net/http" + "slices" + + "github.com/cockroachdb/errors" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +// https://github.com/gogs/go-gogs-client/wiki/Repositories#list-hooks +func listHooks(c *context.APIContext) { + hooks, err := database.GetWebhooksByRepoID(c.Repo.Repository.ID) + if err != nil { + c.Errorf(err, "get webhooks by repository ID") + return + } + + apiHooks := make([]*types.RepositoryHook, len(hooks)) + for i := range hooks { + apiHooks[i] = toRepositoryHook(c.Repo.RepoLink, hooks[i]) + } + c.JSONSuccess(&apiHooks) +} + +// https://github.com/gogs/go-gogs-client/wiki/Repositories#create-a-hook +type createHookRequest struct { + Type string `json:"type" binding:"Required"` + Config map[string]string `json:"config" binding:"Required"` + Events []string `json:"events"` + Active bool `json:"active"` +} + +func createHook(c *context.APIContext, form createHookRequest) { + if !database.IsValidHookTaskType(form.Type) { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Invalid hook type.")) + return + } + for _, name := range []string{"url", "content_type"} { + if _, ok := form.Config[name]; !ok { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Missing config option: "+name)) + return + } + } + if !database.IsValidHookContentType(form.Config["content_type"]) { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Invalid content type.")) + return + } + + if len(form.Events) == 0 { + form.Events = []string{"push"} + } + w := &database.Webhook{ + RepoID: c.Repo.Repository.ID, + URL: form.Config["url"], + ContentType: database.ToHookContentType(form.Config["content_type"]), + Secret: form.Config["secret"], + HookEvent: &database.HookEvent{ + ChooseEvents: true, + HookEvents: database.HookEvents{ + Create: slices.Contains(form.Events, string(database.HookEventTypeCreate)), + Delete: slices.Contains(form.Events, string(database.HookEventTypeDelete)), + Fork: slices.Contains(form.Events, string(database.HookEventTypeFork)), + Push: slices.Contains(form.Events, string(database.HookEventTypePush)), + Issues: slices.Contains(form.Events, string(database.HookEventTypeIssues)), + IssueComment: slices.Contains(form.Events, string(database.HookEventTypeIssueComment)), + PullRequest: slices.Contains(form.Events, string(database.HookEventTypePullRequest)), + Release: slices.Contains(form.Events, string(database.HookEventTypeRelease)), + }, + }, + IsActive: form.Active, + HookTaskType: database.ToHookTaskType(form.Type), + } + if w.HookTaskType == database.SLACK { + channel, ok := form.Config["channel"] + if !ok { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Missing config option: channel")) + return + } + meta, err := json.Marshal(&database.SlackMeta{ + Channel: channel, + Username: form.Config["username"], + IconURL: form.Config["icon_url"], + Color: form.Config["color"], + }) + if err != nil { + c.Errorf(err, "marshal JSON") + return + } + w.Meta = string(meta) + } + + if err := w.UpdateEvent(); err != nil { + c.Errorf(err, "update event") + return + } else if err := database.CreateWebhook(w); err != nil { + c.Errorf(err, "create webhook") + return + } + + c.JSON(http.StatusCreated, toRepositoryHook(c.Repo.RepoLink, w)) +} + +// https://github.com/gogs/go-gogs-client/wiki/Repositories#edit-a-hook +type editHookRequest struct { + Config map[string]string `json:"config"` + Events []string `json:"events"` + Active *bool `json:"active"` +} + +func editHook(c *context.APIContext, form editHookRequest) { + w, err := database.GetWebhookOfRepoByID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get webhook of repository by ID") + return + } + + if form.Config != nil { + if url, ok := form.Config["url"]; ok { + w.URL = url + } + if ct, ok := form.Config["content_type"]; ok { + if !database.IsValidHookContentType(ct) { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Invalid content type.")) + return + } + w.ContentType = database.ToHookContentType(ct) + } + + if w.HookTaskType == database.SLACK { + if channel, ok := form.Config["channel"]; ok { + meta, err := json.Marshal(&database.SlackMeta{ + Channel: channel, + Username: form.Config["username"], + IconURL: form.Config["icon_url"], + Color: form.Config["color"], + }) + if err != nil { + c.Errorf(err, "marshal JSON") + return + } + w.Meta = string(meta) + } + } + } + + // Update events + if len(form.Events) == 0 { + form.Events = []string{"push"} + } + w.PushOnly = false + w.SendEverything = false + w.ChooseEvents = true + w.Create = slices.Contains(form.Events, string(database.HookEventTypeCreate)) + w.Delete = slices.Contains(form.Events, string(database.HookEventTypeDelete)) + w.Fork = slices.Contains(form.Events, string(database.HookEventTypeFork)) + w.Push = slices.Contains(form.Events, string(database.HookEventTypePush)) + w.Issues = slices.Contains(form.Events, string(database.HookEventTypeIssues)) + w.IssueComment = slices.Contains(form.Events, string(database.HookEventTypeIssueComment)) + w.PullRequest = slices.Contains(form.Events, string(database.HookEventTypePullRequest)) + w.Release = slices.Contains(form.Events, string(database.HookEventTypeRelease)) + if err = w.UpdateEvent(); err != nil { + c.Errorf(err, "update event") + return + } + + if form.Active != nil { + w.IsActive = *form.Active + } + + if err := database.UpdateWebhook(w); err != nil { + c.Errorf(err, "update webhook") + return + } + + c.JSONSuccess(toRepositoryHook(c.Repo.RepoLink, w)) +} + +func deleteHook(c *context.APIContext) { + if err := database.DeleteWebhookOfRepoByID(c.Repo.Repository.ID, c.ParamsInt64(":id")); err != nil { + c.Errorf(err, "delete webhook of repository by ID") + return + } + + c.NoContent() +} diff --git a/internal/route/api/v1/repo_issue.go b/internal/route/api/v1/repo_issue.go new file mode 100644 index 00000000000..b294f7e9b26 --- /dev/null +++ b/internal/route/api/v1/repo_issue.go @@ -0,0 +1,206 @@ +package v1 + +import ( + "net/http" + "strings" + + "github.com/cockroachdb/errors" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func queryIssues(c *context.APIContext, opts *database.IssuesOptions) { + issues, err := database.Issues(opts) + if err != nil { + c.Error(err, "list issues") + return + } + + count, err := database.IssuesCount(opts) + if err != nil { + c.Error(err, "count issues") + return + } + + // FIXME: use IssueList to improve performance. + apiIssues := make([]*types.Issue, len(issues)) + for i := range issues { + if err = issues[i].LoadAttributes(); err != nil { + c.Error(err, "load attributes") + return + } + apiIssues[i] = toIssue(issues[i]) + } + + c.SetLinkHeader(int(count), conf.UI.IssuePagingNum) + c.JSONSuccess(&apiIssues) +} + +func listUserIssues(c *context.APIContext) { + opts := database.IssuesOptions{ + AssigneeID: c.User.ID, + Page: c.QueryInt("page"), + IsClosed: types.IssueStateType(c.Query("state")) == types.IssueStateClosed, + } + + queryIssues(c, &opts) +} + +func listIssues(c *context.APIContext) { + opts := database.IssuesOptions{ + RepoID: c.Repo.Repository.ID, + Page: c.QueryInt("page"), + IsClosed: types.IssueStateType(c.Query("state")) == types.IssueStateClosed, + } + + queryIssues(c, &opts) +} + +func getIssue(c *context.APIContext) { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return + } + c.JSONSuccess(toIssue(issue)) +} + +type createIssueRequest struct { + Title string `json:"title" binding:"Required"` + Body string `json:"body"` + Assignee string `json:"assignee"` + Milestone int64 `json:"milestone"` + Labels []int64 `json:"labels"` + Closed bool `json:"closed"` +} + +func createIssue(c *context.APIContext, form createIssueRequest) { + issue := &database.Issue{ + RepoID: c.Repo.Repository.ID, + Title: form.Title, + PosterID: c.User.ID, + Poster: c.User, + Content: form.Body, + } + + if c.Repo.IsWriter() { + if len(form.Assignee) > 0 { + assignee, err := database.Handle.Users().GetByUsername(c.Req.Context(), form.Assignee) + if err != nil { + if database.IsErrUserNotExist(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.Newf("assignee does not exist: [name: %s]", form.Assignee)) + } else { + c.Error(err, "get user by name") + } + return + } + issue.AssigneeID = assignee.ID + } + issue.MilestoneID = form.Milestone + } else { + form.Labels = nil + } + + if err := database.NewIssue(c.Repo.Repository, issue, form.Labels, nil); err != nil { + c.Error(err, "new issue") + return + } + + if form.Closed { + if err := issue.ChangeStatus(c.User, c.Repo.Repository, true); err != nil { + c.Error(err, "change status to closed") + return + } + } + + // Refetch from database to assign some automatic values + var err error + issue, err = database.GetIssueByID(issue.ID) + if err != nil { + c.Error(err, "get issue by ID") + return + } + c.JSON(http.StatusCreated, toIssue(issue)) +} + +type editIssueRequest struct { + Title string `json:"title"` + Body *string `json:"body"` + Assignee *string `json:"assignee"` + Milestone *int64 `json:"milestone"` + State *string `json:"state"` +} + +func editIssue(c *context.APIContext, form editIssueRequest) { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return + } + + if !issue.IsPoster(c.User.ID) && !c.Repo.IsWriter() { + c.Status(http.StatusForbidden) + return + } + + if len(form.Title) > 0 { + issue.Title = form.Title + } + if form.Body != nil { + issue.Content = *form.Body + } + + if c.Repo.IsWriter() && form.Assignee != nil && + (issue.Assignee == nil || issue.Assignee.LowerName != strings.ToLower(*form.Assignee)) { + if *form.Assignee == "" { + issue.AssigneeID = 0 + } else { + assignee, err := database.Handle.Users().GetByUsername(c.Req.Context(), *form.Assignee) + if err != nil { + if database.IsErrUserNotExist(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.Newf("assignee does not exist: [name: %s]", *form.Assignee)) + } else { + c.Error(err, "get user by name") + } + return + } + issue.AssigneeID = assignee.ID + } + + if err = database.UpdateIssueUserByAssignee(issue); err != nil { + c.Error(err, "update issue user by assignee") + return + } + } + if c.Repo.IsWriter() && form.Milestone != nil && + issue.MilestoneID != *form.Milestone { + oldMilestoneID := issue.MilestoneID + issue.MilestoneID = *form.Milestone + if err = database.ChangeMilestoneAssign(c.User, issue, oldMilestoneID); err != nil { + c.Error(err, "change milestone assign") + return + } + } + + if err = database.UpdateIssue(issue); err != nil { + c.Error(err, "update issue") + return + } + if form.State != nil { + if err = issue.ChangeStatus(c.User, c.Repo.Repository, types.IssueStateClosed == types.IssueStateType(*form.State)); err != nil { + c.Error(err, "change status") + return + } + } + + // Refetch from database to assign some automatic values + issue, err = database.GetIssueByID(issue.ID) + if err != nil { + c.Error(err, "get issue by ID") + return + } + c.JSON(http.StatusCreated, toIssue(issue)) +} diff --git a/internal/route/api/v1/repo_issue_comment.go b/internal/route/api/v1/repo_issue_comment.go new file mode 100644 index 00000000000..d4d5cd24146 --- /dev/null +++ b/internal/route/api/v1/repo_issue_comment.go @@ -0,0 +1,157 @@ +package v1 + +import ( + "net/http" + "time" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func listIssueComments(c *context.APIContext) { + var since time.Time + if len(c.Query("since")) > 0 { + var err error + since, err = time.Parse(time.RFC3339, c.Query("since")) + if err != nil { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + return + } + } + + // comments,err:=db.GetCommentsByIssueIDSince(, since) + issue, err := database.GetRawIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.Error(err, "get raw issue by index") + return + } + + comments, err := database.GetCommentsByIssueIDSince(issue.ID, since.Unix()) + if err != nil { + c.Error(err, "get comments by issue ID") + return + } + + apiComments := make([]*types.IssueComment, len(comments)) + for i := range comments { + apiComments[i] = toIssueComment(comments[i]) + } + c.JSONSuccess(&apiComments) +} + +func listRepoIssueComments(c *context.APIContext) { + var since time.Time + if len(c.Query("since")) > 0 { + var err error + since, err = time.Parse(time.RFC3339, c.Query("since")) + if err != nil { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + return + } + } + + comments, err := database.GetCommentsByRepoIDSince(c.Repo.Repository.ID, since.Unix()) + if err != nil { + c.Error(err, "get comments by repository ID") + return + } + + apiComments := make([]*types.IssueComment, len(comments)) + for i := range comments { + apiComments[i] = toIssueComment(comments[i]) + } + c.JSONSuccess(&apiComments) +} + +type createIssueCommentRequest struct { + Body string `json:"body" binding:"Required"` +} + +func createIssueComment(c *context.APIContext, form createIssueCommentRequest) { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.Error(err, "get issue by index") + return + } + + comment, err := database.CreateIssueComment(c.User, c.Repo.Repository, issue, form.Body, nil) + if err != nil { + c.Error(err, "create issue comment") + return + } + + c.JSON(http.StatusCreated, toIssueComment(comment)) +} + +type editIssueCommentRequest struct { + Body string `json:"body" binding:"Required"` +} + +func editIssueComment(c *context.APIContext, form editIssueCommentRequest) { + comment, err := database.GetCommentByID(c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get comment by ID") + return + } + + issue, err := database.GetIssueByID(comment.IssueID) + if err != nil { + c.NotFoundOrError(err, "get issue by ID") + return + } + + if issue.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + + if c.User.ID != comment.PosterID && !c.Repo.IsAdmin() { + c.Status(http.StatusForbidden) + return + } else if comment.Type != database.CommentTypeComment { + c.NoContent() + return + } + + oldContent := comment.Content + comment.Content = form.Body + if err := database.UpdateComment(c.User, comment, oldContent); err != nil { + c.Error(err, "update comment") + return + } + c.JSONSuccess(toIssueComment(comment)) +} + +func deleteIssueComment(c *context.APIContext) { + comment, err := database.GetCommentByID(c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get comment by ID") + return + } + + issue, err := database.GetIssueByID(comment.IssueID) + if err != nil { + c.NotFoundOrError(err, "get issue by ID") + return + } + + if issue.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + + if c.User.ID != comment.PosterID && !c.Repo.IsAdmin() { + c.Status(http.StatusForbidden) + return + } else if comment.Type != database.CommentTypeComment { + c.NoContent() + return + } + + if err = database.DeleteCommentByID(c.User, comment.ID); err != nil { + c.Error(err, "delete comment by ID") + return + } + c.NoContent() +} diff --git a/internal/route/api/v1/repo_issue_label.go b/internal/route/api/v1/repo_issue_label.go new file mode 100644 index 00000000000..391cbfaedaf --- /dev/null +++ b/internal/route/api/v1/repo_issue_label.go @@ -0,0 +1,129 @@ +package v1 + +import ( + "net/http" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func listIssueLabels(c *context.APIContext) { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return + } + + apiLabels := make([]*types.IssueLabel, len(issue.Labels)) + for i := range issue.Labels { + apiLabels[i] = toIssueLabel(issue.Labels[i]) + } + c.JSONSuccess(&apiLabels) +} + +type issueLabelsRequest struct { + Labels []int64 `json:"labels"` +} + +func addIssueLabels(c *context.APIContext, form issueLabelsRequest) { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return + } + + labels, err := database.GetLabelsInRepoByIDs(c.Repo.Repository.ID, form.Labels) + if err != nil { + c.Error(err, "get labels in repository by IDs") + return + } + + if err = issue.AddLabels(c.User, labels); err != nil { + c.Error(err, "add labels") + return + } + + labels, err = database.GetLabelsByIssueID(issue.ID) + if err != nil { + c.Error(err, "get labels by issue ID") + return + } + + apiLabels := make([]*types.IssueLabel, len(labels)) + for i := range labels { + apiLabels[i] = toIssueLabel(issue.Labels[i]) + } + c.JSONSuccess(&apiLabels) +} + +func deleteIssueLabel(c *context.APIContext) { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return + } + + label, err := database.GetLabelOfRepoByID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + if err != nil { + if database.IsErrLabelNotExist(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "get label of repository by ID") + } + return + } + + if err := database.DeleteIssueLabel(issue, label); err != nil { + c.Error(err, "delete issue label") + return + } + + c.NoContent() +} + +func replaceIssueLabels(c *context.APIContext, form issueLabelsRequest) { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return + } + + labels, err := database.GetLabelsInRepoByIDs(c.Repo.Repository.ID, form.Labels) + if err != nil { + c.Error(err, "get labels in repository by IDs") + return + } + + if err := issue.ReplaceLabels(labels); err != nil { + c.Error(err, "replace labels") + return + } + + labels, err = database.GetLabelsByIssueID(issue.ID) + if err != nil { + c.Error(err, "get labels by issue ID") + return + } + + apiLabels := make([]*types.IssueLabel, len(labels)) + for i := range labels { + apiLabels[i] = toIssueLabel(issue.Labels[i]) + } + c.JSONSuccess(&apiLabels) +} + +func clearIssueLabels(c *context.APIContext) { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return + } + + if err := issue.ClearLabels(c.User); err != nil { + c.Error(err, "clear labels") + return + } + + c.NoContent() +} diff --git a/internal/route/api/v1/repo_key.go b/internal/route/api/v1/repo_key.go new file mode 100644 index 00000000000..eacc9b0603f --- /dev/null +++ b/internal/route/api/v1/repo_key.go @@ -0,0 +1,127 @@ +package v1 + +import ( + "net/http" + + "github.com/cockroachdb/errors" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func composeDeployKeysAPILink(repoPath string) string { + return conf.Server.ExternalURL + "api/v1/repos/" + repoPath + "/keys/" +} + +// https://github.com/gogs/go-gogs-client/wiki/Repositories-Deploy-Keys#list-deploy-keys +func listDeployKeys(c *context.APIContext) { + keys, err := database.ListDeployKeys(c.Repo.Repository.ID) + if err != nil { + c.Error(err, "list deploy keys") + return + } + + apiLink := composeDeployKeysAPILink(c.Repo.Owner.Name + "/" + c.Repo.Repository.Name) + apiKeys := make([]*types.RepositoryDeployKey, len(keys)) + for i := range keys { + if err = keys[i].GetContent(); err != nil { + c.Error(err, "get content") + return + } + apiKeys[i] = toDeployKey(apiLink, keys[i]) + } + + c.JSONSuccess(&apiKeys) +} + +// https://github.com/gogs/go-gogs-client/wiki/Repositories-Deploy-Keys#get-a-deploy-key +func getDeployKey(c *context.APIContext) { + key, err := database.GetDeployKeyByID(c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get deploy key by ID") + return + } + + if key.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + + if err = key.GetContent(); err != nil { + c.Error(err, "get content") + return + } + + apiLink := composeDeployKeysAPILink(c.Repo.Owner.Name + "/" + c.Repo.Repository.Name) + c.JSONSuccess(toDeployKey(apiLink, key)) +} + +func handleCheckKeyStringError(c *context.APIContext, err error) { + if database.IsErrKeyUnableVerify(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Unable to verify key content")) + } else { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.Wrap(err, "Invalid key content: %v")) + } +} + +func handleAddKeyError(c *context.APIContext, err error) { + switch { + case database.IsErrKeyAlreadyExist(err): + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Key content has been used as non-deploy key")) + case database.IsErrKeyNameAlreadyUsed(err): + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Key title has been used")) + default: + c.Error(err, "add key") + } +} + +// https://github.com/gogs/go-gogs-client/wiki/Repositories-Deploy-Keys#add-a-new-deploy-key +type createDeployKeyRequest struct { + Title string `json:"title" binding:"Required"` + Key string `json:"key" binding:"Required"` +} + +func createDeployKey(c *context.APIContext, form createDeployKeyRequest) { + content, err := database.CheckPublicKeyString(form.Key) + if err != nil { + handleCheckKeyStringError(c, err) + return + } + + key, err := database.AddDeployKey(c.Repo.Repository.ID, form.Title, content) + if err != nil { + handleAddKeyError(c, err) + return + } + + key.Content = content + apiLink := composeDeployKeysAPILink(c.Repo.Owner.Name + "/" + c.Repo.Repository.Name) + c.JSON(http.StatusCreated, toDeployKey(apiLink, key)) +} + +// https://github.com/gogs/go-gogs-client/wiki/Repositories-Deploy-Keys#remove-a-deploy-key +func deleteDeploykey(c *context.APIContext) { + key, err := database.GetDeployKeyByID(c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get deploy key by ID") + return + } + + if key.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + + if err := database.DeleteDeployKey(c.User, key.ID); err != nil { + if database.IsErrKeyAccessDenied(err) { + c.ErrorStatus(http.StatusForbidden, errors.New("You do not have access to this key")) + } else { + c.Error(err, "delete deploy key") + } + return + } + + c.NoContent() +} diff --git a/internal/route/api/v1/repo_label.go b/internal/route/api/v1/repo_label.go new file mode 100644 index 00000000000..f5f19960837 --- /dev/null +++ b/internal/route/api/v1/repo_label.go @@ -0,0 +1,93 @@ +package v1 + +import ( + "net/http" + "strconv" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func listLabels(c *context.APIContext) { + labels, err := database.GetLabelsByRepoID(c.Repo.Repository.ID) + if err != nil { + c.Error(err, "get labels by repository ID") + return + } + + apiLabels := make([]*types.IssueLabel, len(labels)) + for i := range labels { + apiLabels[i] = toIssueLabel(labels[i]) + } + c.JSONSuccess(&apiLabels) +} + +func getLabel(c *context.APIContext) { + var label *database.Label + var err error + idStr := c.Params(":id") + if id, _ := strconv.ParseInt(idStr, 10, 64); id > 0 { + label, err = database.GetLabelOfRepoByID(c.Repo.Repository.ID, id) + } else { + label, err = database.GetLabelOfRepoByName(c.Repo.Repository.ID, idStr) + } + if err != nil { + c.NotFoundOrError(err, "get label") + return + } + + c.JSONSuccess(toIssueLabel(label)) +} + +type createLabelRequest struct { + Name string `json:"name" binding:"Required"` + Color string `json:"color" binding:"Required;Size(7)"` +} + +func createLabel(c *context.APIContext, form createLabelRequest) { + label := &database.Label{ + Name: form.Name, + Color: form.Color, + RepoID: c.Repo.Repository.ID, + } + if err := database.NewLabels(label); err != nil { + c.Error(err, "new labels") + return + } + c.JSON(http.StatusCreated, toIssueLabel(label)) +} + +type editLabelRequest struct { + Name *string `json:"name"` + Color *string `json:"color"` +} + +func editLabel(c *context.APIContext, form editLabelRequest) { + label, err := database.GetLabelOfRepoByID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get label of repository by ID") + return + } + + if form.Name != nil { + label.Name = *form.Name + } + if form.Color != nil { + label.Color = *form.Color + } + if err := database.UpdateLabel(label); err != nil { + c.Error(err, "update label") + return + } + c.JSONSuccess(toIssueLabel(label)) +} + +func deleteLabel(c *context.APIContext) { + if err := database.DeleteLabel(c.Repo.Repository.ID, c.ParamsInt64(":id")); err != nil { + c.Error(err, "delete label") + return + } + + c.NoContent() +} diff --git a/internal/route/api/v1/repo_milestone.go b/internal/route/api/v1/repo_milestone.go new file mode 100644 index 00000000000..4c8753bc5f5 --- /dev/null +++ b/internal/route/api/v1/repo_milestone.go @@ -0,0 +1,104 @@ +package v1 + +import ( + "net/http" + "time" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func listMilestones(c *context.APIContext) { + milestones, err := database.GetMilestonesByRepoID(c.Repo.Repository.ID) + if err != nil { + c.Error(err, "get milestones by repository ID") + return + } + + apiMilestones := make([]*types.IssueMilestone, len(milestones)) + for i := range milestones { + apiMilestones[i] = toIssueMilestone(milestones[i]) + } + c.JSONSuccess(&apiMilestones) +} + +func getMilestone(c *context.APIContext) { + milestone, err := database.GetMilestoneByRepoID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get milestone by repository ID") + return + } + c.JSONSuccess(toIssueMilestone(milestone)) +} + +type createMilestoneRequest struct { + Title string `json:"title"` + Description string `json:"description"` + Deadline *time.Time `json:"due_on"` +} + +func createMilestone(c *context.APIContext, form createMilestoneRequest) { + if form.Deadline == nil { + defaultDeadline, _ := time.ParseInLocation("2006-01-02", "9999-12-31", time.Local) + form.Deadline = &defaultDeadline + } + + milestone := &database.Milestone{ + RepoID: c.Repo.Repository.ID, + Name: form.Title, + Content: form.Description, + Deadline: *form.Deadline, + } + + if err := database.NewMilestone(milestone); err != nil { + c.Error(err, "new milestone") + return + } + c.JSON(http.StatusCreated, toIssueMilestone(milestone)) +} + +type editMilestoneRequest struct { + Title string `json:"title"` + Description *string `json:"description"` + State *string `json:"state"` + Deadline *time.Time `json:"due_on"` +} + +func editMilestone(c *context.APIContext, form editMilestoneRequest) { + milestone, err := database.GetMilestoneByRepoID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get milestone by repository ID") + return + } + + if len(form.Title) > 0 { + milestone.Name = form.Title + } + if form.Description != nil { + milestone.Content = *form.Description + } + if form.Deadline != nil && !form.Deadline.IsZero() { + milestone.Deadline = *form.Deadline + } + + if form.State != nil { + if err = milestone.ChangeStatus(types.IssueStateClosed == types.IssueStateType(*form.State)); err != nil { + c.Error(err, "change status") + return + } + } else if err = database.UpdateMilestone(milestone); err != nil { + c.Error(err, "update milestone") + return + } + + c.JSONSuccess(toIssueMilestone(milestone)) +} + +func deleteMilestone(c *context.APIContext) { + if err := database.DeleteMilestoneOfRepoByID(c.Repo.Repository.ID, c.ParamsInt64(":id")); err != nil { + c.Error(err, "delete milestone of repository by ID") + return + } + c.NoContent() +} diff --git a/internal/route/api/v1/repo_repo.go b/internal/route/api/v1/repo_repo.go new file mode 100644 index 00000000000..f181bfdd517 --- /dev/null +++ b/internal/route/api/v1/repo_repo.go @@ -0,0 +1,497 @@ +package v1 + +import ( + "net/http" + "path" + + "github.com/cockroachdb/errors" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func searchRepos(c *context.APIContext) { + opts := &database.SearchRepoOptions{ + Keyword: path.Base(c.Query("q")), + OwnerID: c.QueryInt64("uid"), + PageSize: toAllowedPageSize(c.QueryInt("limit")), + Page: c.QueryInt("page"), + } + + // Check visibility. + if c.IsLogged && opts.OwnerID > 0 { + if c.User.ID == opts.OwnerID { + opts.Private = true + } else { + u, err := database.Handle.Users().GetByID(c.Req.Context(), opts.OwnerID) + if err != nil { + c.JSON(http.StatusInternalServerError, map[string]any{ + "ok": false, + "error": err.Error(), + }) + return + } + if u.IsOrganization() && u.IsOwnedBy(c.User.ID) { + opts.Private = true + } + // FIXME: how about collaborators? + } + } + + repos, count, err := database.SearchRepositoryByName(opts) + if err != nil { + c.JSON(http.StatusInternalServerError, map[string]any{ + "ok": false, + "error": err.Error(), + }) + return + } + + if err = database.RepositoryList(repos).LoadAttributes(); err != nil { + c.JSON(http.StatusInternalServerError, map[string]any{ + "ok": false, + "error": err.Error(), + }) + return + } + + results := make([]*types.Repository, len(repos)) + for i := range repos { + results[i] = toRepository(repos[i], nil) + } + + c.SetLinkHeader(int(count), opts.PageSize) + c.JSONSuccess(map[string]any{ + "ok": true, + "data": results, + }) +} + +func listReposOfUser(c *context.APIContext, username string) { + user, err := database.Handle.Users().GetByUsername(c.Req.Context(), username) + if err != nil { + c.NotFoundOrError(err, "get user by name") + return + } + + // Only list public repositories if user requests someone else's repository list, + // or an organization isn't a member of. + var ownRepos []*database.Repository + if user.IsOrganization() { + ownRepos, _, err = user.GetUserRepositories(c.User.ID, 1, user.NumRepos) + } else { + ownRepos, err = database.GetUserRepositories(&database.UserRepoOptions{ + UserID: user.ID, + Private: c.User.ID == user.ID, + Page: 1, + PageSize: user.NumRepos, + }) + } + if err != nil { + c.Error(err, "get user repositories") + return + } + + if err = database.RepositoryList(ownRepos).LoadAttributes(); err != nil { + c.Error(err, "load attributes") + return + } + + // Early return for querying other user's repositories + if c.User.ID != user.ID { + repos := make([]*types.Repository, len(ownRepos)) + for i := range ownRepos { + repos[i] = toRepository(ownRepos[i], &types.RepositoryPermission{Admin: true, Push: true, Pull: true}) + } + c.JSONSuccess(&repos) + return + } + + accessibleReposWithAccessMode, err := database.Handle.Repositories().GetByCollaboratorIDWithAccessMode(c.Req.Context(), user.ID) + if err != nil { + c.Error(err, "get repositories accesses by collaborator") + return + } + + accessibleRepos := make([]*database.Repository, 0, len(accessibleReposWithAccessMode)) + for repo := range accessibleReposWithAccessMode { + accessibleRepos = append(accessibleRepos, repo) + } + if err = database.RepositoryList(accessibleRepos).LoadAttributes(); err != nil { + c.Error(err, "load attributes for accessible repositories") + return + } + + numOwnRepos := len(ownRepos) + repos := make([]*types.Repository, 0, numOwnRepos+len(accessibleReposWithAccessMode)) + for _, r := range ownRepos { + repos = append(repos, toRepository(r, &types.RepositoryPermission{Admin: true, Push: true, Pull: true})) + } + + for repo, access := range accessibleReposWithAccessMode { + repos = append(repos, + toRepository(repo, &types.RepositoryPermission{ + Admin: access >= database.AccessModeAdmin, + Push: access >= database.AccessModeWrite, + Pull: true, + }), + ) + } + + c.JSONSuccess(&repos) +} + +func listMyRepos(c *context.APIContext) { + listReposOfUser(c, c.User.Name) +} + +func listUserRepositories(c *context.APIContext) { + listReposOfUser(c, c.Params(":username")) +} + +func listOrgRepositories(c *context.APIContext) { + listReposOfUser(c, c.Params(":org")) +} + +type createRepoRequest struct { + Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(100)"` + Description string `json:"description" binding:"MaxSize(255)"` + Private bool `json:"private"` + AutoInit bool `json:"auto_init"` + Gitignores string `json:"gitignores"` + License string `json:"license"` + Readme string `json:"readme"` +} + +func createUserRepo(c *context.APIContext, owner *database.User, opt createRepoRequest) { + repo, err := database.CreateRepository(c.User, owner, database.CreateRepoOptionsLegacy{ + Name: opt.Name, + Description: opt.Description, + Gitignores: opt.Gitignores, + License: opt.License, + Readme: opt.Readme, + IsPrivate: opt.Private, + AutoInit: opt.AutoInit, + }) + if err != nil { + if database.IsErrRepoAlreadyExist(err) || + database.IsErrNameNotAllowed(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + if repo != nil { + if err = database.DeleteRepository(c.User.ID, repo.ID); err != nil { + log.Error("Failed to delete repository: %v", err) + } + } + c.Error(err, "create repository") + } + return + } + + c.JSON(201, toRepository(repo, &types.RepositoryPermission{Admin: true, Push: true, Pull: true})) +} + +func createRepo(c *context.APIContext, opt createRepoRequest) { + // Shouldn't reach this condition, but just in case. + if c.User.IsOrganization() { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Not allowed to create repository for organization.")) + return + } + createUserRepo(c, c.User, opt) +} + +func createOrgRepo(c *context.APIContext, opt createRepoRequest) { + org, err := database.GetOrgByName(c.Params(":org")) + if err != nil { + c.NotFoundOrError(err, "get organization by name") + return + } + + if !org.IsOwnedBy(c.User.ID) { + c.ErrorStatus(http.StatusForbidden, errors.New("Given user is not owner of organization.")) + return + } + createUserRepo(c, org, opt) +} + +func migrate(c *context.APIContext, f form.MigrateRepo) { + ctxUser := c.User + // Not equal means context user is an organization, + // or is another user/organization if current user is admin. + if f.UID != ctxUser.ID { + org, err := database.Handle.Users().GetByID(c.Req.Context(), f.UID) + if err != nil { + if database.IsErrUserNotExist(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "get user by ID") + } + return + } else if !org.IsOrganization() && !c.User.IsAdmin { + c.ErrorStatus(http.StatusForbidden, errors.New("Given user is not an organization.")) + return + } + ctxUser = org + } + + if c.HasError() { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New(c.GetErrMsg())) + return + } + + if ctxUser.IsOrganization() && !c.User.IsAdmin { + // Check ownership of organization. + if !ctxUser.IsOwnedBy(c.User.ID) { + c.ErrorStatus(http.StatusForbidden, errors.New("Given user is not owner of organization.")) + return + } + } + + remoteAddr, err := f.ParseRemoteAddr(c.User) + if err != nil { + if database.IsErrInvalidCloneAddr(err) { + addrErr := err.(database.ErrInvalidCloneAddr) + switch { + case addrErr.IsURLError: + c.ErrorStatus(http.StatusUnprocessableEntity, err) + case addrErr.IsPermissionDenied: + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("You are not allowed to import local repositories.")) + case addrErr.IsInvalidPath: + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Invalid local path, it does not exist or not a directory.")) + case addrErr.IsBlockedLocalAddress: + c.ErrorStatus(http.StatusUnprocessableEntity, errors.New("Clone address resolved to a local network address that is implicitly blocked.")) + default: + c.Error(err, "unexpected error") + } + } else { + c.Error(err, "parse remote address") + } + return + } + + repo, err := database.MigrateRepository(c.User, ctxUser, database.MigrateRepoOptions{ + Name: f.RepoName, + Description: f.Description, + IsPrivate: f.Private || conf.Repository.ForcePrivate, + IsMirror: f.Mirror, + RemoteAddr: remoteAddr, + }) + if err != nil { + if repo != nil { + if errDelete := database.DeleteRepository(ctxUser.ID, repo.ID); errDelete != nil { + log.Error("DeleteRepository: %v", errDelete) + } + } + + if database.IsErrReachLimitOfRepo(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(errors.New(database.HandleMirrorCredentials(err.Error(), true)), "migrate repository") + } + return + } + + log.Trace("Repository migrated: %s/%s", ctxUser.Name, f.RepoName) + c.JSON(201, toRepository(repo, &types.RepositoryPermission{Admin: true, Push: true, Pull: true})) +} + +// FIXME: inject in the handler chain +func parseOwnerAndRepo(c *context.APIContext) (*database.User, *database.Repository) { + owner, err := database.Handle.Users().GetByUsername(c.Req.Context(), c.Params(":username")) + if err != nil { + if database.IsErrUserNotExist(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "get user by name") + } + return nil, nil + } + + repo, err := database.GetRepositoryByName(owner.ID, c.Params(":reponame")) + if err != nil { + c.NotFoundOrError(err, "get repository by name") + return nil, nil + } + + return owner, repo +} + +func getRepo(c *context.APIContext) { + _, repo := parseOwnerAndRepo(c) + if c.Written() { + return + } + + c.JSONSuccess(toRepository(repo, &types.RepositoryPermission{ + Admin: c.Repo.IsAdmin(), + Push: c.Repo.IsWriter(), + Pull: true, + })) +} + +func deleteRepo(c *context.APIContext) { + owner, repo := parseOwnerAndRepo(c) + if c.Written() { + return + } + + if owner.IsOrganization() && !owner.IsOwnedBy(c.User.ID) { + c.ErrorStatus(http.StatusForbidden, errors.New("Given user is not owner of organization.")) + return + } + + if err := database.DeleteRepository(owner.ID, repo.ID); err != nil { + c.Error(err, "delete repository") + return + } + + log.Trace("Repository deleted: %s/%s", owner.Name, repo.Name) + c.NoContent() +} + +func listForks(c *context.APIContext) { + forks, err := c.Repo.Repository.GetForks() + if err != nil { + c.Error(err, "get forks") + return + } + + apiForks := make([]*types.Repository, len(forks)) + for i := range forks { + if err := forks[i].GetOwner(); err != nil { + c.Error(err, "get owner") + return + } + + accessMode := database.Handle.Permissions().AccessMode( + c.Req.Context(), + c.User.ID, + forks[i].ID, + database.AccessModeOptions{ + OwnerID: forks[i].OwnerID, + Private: forks[i].IsPrivate, + }, + ) + + apiForks[i] = toRepository(forks[i], + &types.RepositoryPermission{ + Admin: accessMode >= database.AccessModeAdmin, + Push: accessMode >= database.AccessModeWrite, + Pull: true, + }, + ) + } + + c.JSONSuccess(&apiForks) +} + +type editIssueTrackerRequest struct { + EnableIssues *bool `json:"enable_issues"` + EnableExternalTracker *bool `json:"enable_external_tracker"` + ExternalTrackerURL *string `json:"external_tracker_url"` + TrackerURLFormat *string `json:"tracker_url_format"` + TrackerIssueStyle *string `json:"tracker_issue_style"` +} + +func issueTracker(c *context.APIContext, form editIssueTrackerRequest) { + _, repo := parseOwnerAndRepo(c) + if c.Written() { + return + } + + if form.EnableIssues != nil { + repo.EnableIssues = *form.EnableIssues + } + if form.EnableExternalTracker != nil { + repo.EnableExternalTracker = *form.EnableExternalTracker + } + if form.ExternalTrackerURL != nil { + repo.ExternalTrackerURL = *form.ExternalTrackerURL + } + if form.TrackerURLFormat != nil { + repo.ExternalTrackerFormat = *form.TrackerURLFormat + } + if form.TrackerIssueStyle != nil { + repo.ExternalTrackerStyle = *form.TrackerIssueStyle + } + + if err := database.UpdateRepository(repo, false); err != nil { + c.Error(err, "update repository") + return + } + + c.NoContent() +} + +type editWikiRequest struct { + EnableWiki *bool `json:"enable_wiki"` + AllowPublicWiki *bool `json:"allow_public_wiki"` + EnableExternalWiki *bool `json:"enable_external_wiki"` + ExternalWikiURL *string `json:"external_wiki_url"` +} + +func wiki(c *context.APIContext, form editWikiRequest) { + _, repo := parseOwnerAndRepo(c) + if c.Written() { + return + } + + if form.AllowPublicWiki != nil { + repo.AllowPublicWiki = *form.AllowPublicWiki + } + if form.EnableExternalWiki != nil { + repo.EnableExternalWiki = *form.EnableExternalWiki + } + if form.EnableWiki != nil { + repo.EnableWiki = *form.EnableWiki + } + if form.ExternalWikiURL != nil { + repo.ExternalWikiURL = *form.ExternalWikiURL + } + if err := database.UpdateRepository(repo, false); err != nil { + c.Error(err, "update repository") + return + } + + c.NoContent() +} + +func mirrorSync(c *context.APIContext) { + _, repo := parseOwnerAndRepo(c) + if c.Written() { + return + } else if !repo.IsMirror { + c.NotFound() + return + } + + go database.MirrorQueue.Add(repo.ID) + c.Status(http.StatusAccepted) +} + +func releases(c *context.APIContext) { + _, repo := parseOwnerAndRepo(c) + releases, err := database.GetReleasesByRepoID(repo.ID) + if err != nil { + c.Error(err, "get releases by repository ID") + return + } + apiReleases := make([]*types.RepositoryRelease, 0, len(releases)) + for _, r := range releases { + publisher, err := database.Handle.Users().GetByID(c.Req.Context(), r.PublisherID) + if err != nil { + c.Error(err, "get release publisher") + return + } + r.Publisher = publisher + } + for _, r := range releases { + apiReleases = append(apiReleases, toRelease(r)) + } + + c.JSONSuccess(&apiReleases) +} diff --git a/internal/route/api/v1/repo_tag.go b/internal/route/api/v1/repo_tag.go new file mode 100644 index 00000000000..bc14dbb24c5 --- /dev/null +++ b/internal/route/api/v1/repo_tag.go @@ -0,0 +1,25 @@ +package v1 + +import ( + "gogs.io/gogs/internal/context" +) + +func listTags(c *context.APIContext) { + tags, err := c.Repo.Repository.GetTags() + if err != nil { + c.Error(err, "get tags") + return + } + + apiTags := make([]*tag, len(tags)) + for i := range tags { + commit, err := tags[i].GetCommit() + if err != nil { + c.Error(err, "get commit") + return + } + apiTags[i] = toTag(tags[i], commit) + } + + c.JSONSuccess(&apiTags) +} diff --git a/internal/route/api/v1/repo_tree.go b/internal/route/api/v1/repo_tree.go new file mode 100644 index 00000000000..3004cf5c10d --- /dev/null +++ b/internal/route/api/v1/repo_tree.go @@ -0,0 +1,85 @@ +package v1 + +import ( + "fmt" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/gitx" +) + +func getRepoGitTree(c *context.APIContext) { + gitRepo, err := git.Open(c.Repo.Repository.RepoPath()) + if err != nil { + c.Error(err, "open repository") + return + } + + sha := c.Params(":sha") + tree, err := gitRepo.LsTree(sha, git.LsTreeOptions{Verbatim: true}) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get tree") + return + } + + entries, err := tree.Entries(git.LsTreeOptions{Verbatim: true}) + if err != nil { + c.Error(err, "list entries") + return + } + + type repoGitTreeEntry struct { + Path string `json:"path"` + Mode string `json:"mode"` + Type string `json:"type"` + Size int64 `json:"size"` + Sha string `json:"sha"` + URL string `json:"url"` + } + type repoGitTree struct { + Sha string `json:"sha"` + URL string `json:"url"` + Tree []*repoGitTreeEntry `json:"tree"` + } + + treesURL := fmt.Sprintf("%s/repos/%s/%s/git/trees", c.BaseURL, c.Params(":username"), c.Params(":reponame")) + + if len(entries) == 0 { + c.JSONSuccess(&repoGitTree{ + Sha: sha, + URL: fmt.Sprintf(treesURL+"/%s", sha), + }) + return + } + + children := make([]*repoGitTreeEntry, 0, len(entries)) + for _, entry := range entries { + var mode string + switch entry.Type() { + case git.ObjectCommit: + mode = "160000" + case git.ObjectTree: + mode = "040000" + case git.ObjectBlob: + mode = "120000" + case git.ObjectTag: + mode = "100644" + default: + panic("unreachable") + } + children = append(children, &repoGitTreeEntry{ + Path: entry.Name(), + Mode: mode, + Type: string(entry.Type()), + Size: entry.Size(), + Sha: entry.ID().String(), + URL: fmt.Sprintf(treesURL+"/%s", entry.ID().String()), + }) + } + c.JSONSuccess(&repoGitTree{ + Sha: c.Params(":sha"), + URL: fmt.Sprintf(treesURL+"/%s", sha), + Tree: children, + }) +} diff --git a/internal/route/api/v1/tag.go b/internal/route/api/v1/tag.go new file mode 100644 index 00000000000..b6672bab2de --- /dev/null +++ b/internal/route/api/v1/tag.go @@ -0,0 +1,8 @@ +package v1 + +import "gogs.io/gogs/internal/route/api/v1/types" + +type tag struct { + Name string `json:"name"` + Commit *types.WebhookPayloadCommit `json:"commit"` +} diff --git a/internal/route/api/v1/types/commit.go b/internal/route/api/v1/types/commit.go new file mode 100644 index 00000000000..6d9ae903e95 --- /dev/null +++ b/internal/route/api/v1/types/commit.go @@ -0,0 +1,29 @@ +package types + +type CommitMeta struct { + URL string `json:"url"` + SHA string `json:"sha"` +} + +type CommitUser struct { + Name string `json:"name"` + Email string `json:"email"` + Date string `json:"date"` +} + +type RepoCommit struct { + URL string `json:"url"` + Author *CommitUser `json:"author"` + Committer *CommitUser `json:"committer"` + Message string `json:"message"` + Tree *CommitMeta `json:"tree"` +} + +type Commit struct { + *CommitMeta + HTMLURL string `json:"html_url"` + RepoCommit *RepoCommit `json:"commit"` + Author *User `json:"author"` + Committer *User `json:"committer"` + Parents []*CommitMeta `json:"parents"` +} diff --git a/internal/route/api/v1/types/hook.go b/internal/route/api/v1/types/hook.go new file mode 100644 index 00000000000..7f419f55db9 --- /dev/null +++ b/internal/route/api/v1/types/hook.go @@ -0,0 +1,23 @@ +package types + +import "time" + +type RepositoryHook struct { + ID int64 `json:"id"` + Type string `json:"type"` + URL string `json:"-"` + Config map[string]string `json:"config"` + Events []string `json:"events"` + Active bool `json:"active"` + Updated time.Time `json:"updated_at"` + Created time.Time `json:"created_at"` +} + +type RepositoryDeployKey struct { + ID int64 `json:"id"` + Key string `json:"key"` + URL string `json:"url"` + Title string `json:"title"` + Created time.Time `json:"created_at"` + ReadOnly bool `json:"read_only"` +} diff --git a/internal/route/api/v1/types/issue.go b/internal/route/api/v1/types/issue.go new file mode 100644 index 00000000000..1879b73123a --- /dev/null +++ b/internal/route/api/v1/types/issue.go @@ -0,0 +1,58 @@ +package types + +import "time" + +type IssueStateType string + +const ( + IssueStateOpen IssueStateType = "open" + IssueStateClosed IssueStateType = "closed" +) + +type PullRequestMeta struct { + HasMerged bool `json:"merged"` + Merged *time.Time `json:"merged_at"` +} + +type Issue struct { + ID int64 `json:"id"` + Index int64 `json:"number"` + Poster *User `json:"user"` + Title string `json:"title"` + Body string `json:"body"` + Labels []*IssueLabel `json:"labels"` + Milestone *IssueMilestone `json:"milestone"` + Assignee *User `json:"assignee"` + State IssueStateType `json:"state"` + Comments int `json:"comments"` + Created time.Time `json:"created_at"` + Updated time.Time `json:"updated_at"` + PullRequest *PullRequestMeta `json:"pull_request"` +} + +type IssueLabel struct { + ID int64 `json:"id"` + Name string `json:"name"` + Color string `json:"color"` + URL string `json:"url"` +} + +type IssueMilestone struct { + ID int64 `json:"id"` + Title string `json:"title"` + Description string `json:"description"` + State IssueStateType `json:"state"` + OpenIssues int `json:"open_issues"` + ClosedIssues int `json:"closed_issues"` + Closed *time.Time `json:"closed_at"` + Deadline *time.Time `json:"due_on"` +} + +type IssueComment struct { + ID int64 `json:"id"` + HTMLURL string `json:"html_url"` + Poster *User `json:"user"` + Body string `json:"body"` + Created time.Time `json:"created_at"` + Updated time.Time `json:"updated_at"` +} diff --git a/internal/route/api/v1/types/org.go b/internal/route/api/v1/types/org.go new file mode 100644 index 00000000000..0a91747da85 --- /dev/null +++ b/internal/route/api/v1/types/org.go @@ -0,0 +1,18 @@ +package types + +type Organization struct { + ID int64 `json:"id"` + UserName string `json:"username"` + FullName string `json:"full_name"` + AvatarURL string `json:"avatar_url"` + Description string `json:"description"` + Website string `json:"website"` + Location string `json:"location"` +} + +type OrganizationTeam struct { + ID int64 `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + Permission string `json:"permission"` +} diff --git a/internal/route/api/v1/types/pull_request.go b/internal/route/api/v1/types/pull_request.go new file mode 100644 index 00000000000..8c918ca8409 --- /dev/null +++ b/internal/route/api/v1/types/pull_request.go @@ -0,0 +1,26 @@ +package types + +import "time" + +type PullRequest struct { + ID int64 `json:"id"` + Index int64 `json:"number"` + Poster *User `json:"user"` + Title string `json:"title"` + Body string `json:"body"` + Labels []*IssueLabel `json:"labels"` + Milestone *IssueMilestone `json:"milestone"` + Assignee *User `json:"assignee"` + State IssueStateType `json:"state"` + Comments int `json:"comments"` + HeadBranch string `json:"head_branch"` + HeadRepo *Repository `json:"head_repo"` + BaseBranch string `json:"base_branch"` + BaseRepo *Repository `json:"base_repo"` + HTMLURL string `json:"html_url"` + Mergeable *bool `json:"mergeable"` + HasMerged bool `json:"merged"` + Merged *time.Time `json:"merged_at"` + MergedCommitID *string `json:"merge_commit_sha"` + MergedBy *User `json:"merged_by"` +} diff --git a/internal/route/api/v1/types/repo.go b/internal/route/api/v1/types/repo.go new file mode 100644 index 00000000000..dc5842f2e39 --- /dev/null +++ b/internal/route/api/v1/types/repo.go @@ -0,0 +1,52 @@ +package types + +import "time" + +type RepositoryPermission struct { + Admin bool `json:"admin"` + Push bool `json:"push"` + Pull bool `json:"pull"` +} + +type Repository struct { + ID int64 `json:"id"` + Owner *User `json:"owner"` + Name string `json:"name"` + FullName string `json:"full_name"` + Description string `json:"description"` + Private bool `json:"private"` + Fork bool `json:"fork"` + Parent *Repository `json:"parent"` + Empty bool `json:"empty"` + Mirror bool `json:"mirror"` + Size int64 `json:"size"` + HTMLURL string `json:"html_url"` + SSHURL string `json:"ssh_url"` + CloneURL string `json:"clone_url"` + Website string `json:"website"` + Stars int `json:"stars_count"` + Forks int `json:"forks_count"` + Watchers int `json:"watchers_count"` + OpenIssues int `json:"open_issues_count"` + DefaultBranch string `json:"default_branch"` + Created time.Time `json:"created_at"` + Updated time.Time `json:"updated_at"` + Permissions *RepositoryPermission `json:"permissions,omitempty"` +} + +type RepositoryBranch struct { + Name string `json:"name"` + Commit *WebhookPayloadCommit `json:"commit"` +} + +type RepositoryRelease struct { + ID int64 `json:"id"` + TagName string `json:"tag_name"` + TargetCommitish string `json:"target_commitish"` + Name string `json:"name"` + Body string `json:"body"` + Draft bool `json:"draft"` + Prerelease bool `json:"prerelease"` + Author *User `json:"author"` + Created time.Time `json:"created_at"` +} diff --git a/internal/route/api/v1/types/user.go b/internal/route/api/v1/types/user.go new file mode 100644 index 00000000000..f29693dc4ab --- /dev/null +++ b/internal/route/api/v1/types/user.go @@ -0,0 +1,36 @@ +package types + +import "time" + +type User struct { + ID int64 `json:"id"` + UserName string `json:"username"` + Login string `json:"login"` + FullName string `json:"full_name"` + Email string `json:"email"` + AvatarURL string `json:"avatar_url"` +} + +type UserEmail struct { + Email string `json:"email"` + Verified bool `json:"verified"` + Primary bool `json:"primary"` +} + +type UserAccessToken struct { + Name string `json:"name"` + Sha1 string `json:"sha1"` +} + +type UserPublicKey struct { + ID int64 `json:"id"` + Key string `json:"key"` + URL string `json:"url,omitempty"` + Title string `json:"title,omitempty"` + Created time.Time `json:"created_at,omitempty"` +} + +type RepositoryCollaborator struct { + *User + Permissions RepositoryPermission `json:"permissions"` +} diff --git a/internal/route/api/v1/types/webhook.go b/internal/route/api/v1/types/webhook.go new file mode 100644 index 00000000000..8adaa51a508 --- /dev/null +++ b/internal/route/api/v1/types/webhook.go @@ -0,0 +1,158 @@ +package types + +import ( + "encoding/json" + "time" +) + +// WebhookPayloader is implemented by webhook payload types. +type WebhookPayloader interface { + JSONPayload() ([]byte, error) +} + +func jsonPayload(p any) ([]byte, error) { + return json.MarshalIndent(p, "", " ") +} + +type WebhookPayloadUser struct { + Name string `json:"name"` + Email string `json:"email"` + UserName string `json:"username"` +} + +type WebhookPayloadCommit struct { + ID string `json:"id"` + Message string `json:"message"` + URL string `json:"url"` + Author *WebhookPayloadUser `json:"author"` + Committer *WebhookPayloadUser `json:"committer"` + Added []string `json:"added"` + Removed []string `json:"removed"` + Modified []string `json:"modified"` + Timestamp time.Time `json:"timestamp"` +} + +type WebhookPusherType string + +const WebhookPusherTypeUser WebhookPusherType = "user" + +type WebhookIssueAction string + +const ( + WebhookIssueOpened WebhookIssueAction = "opened" + WebhookIssueClosed WebhookIssueAction = "closed" + WebhookIssueReopened WebhookIssueAction = "reopened" + WebhookIssueEdited WebhookIssueAction = "edited" + WebhookIssueAssigned WebhookIssueAction = "assigned" + WebhookIssueUnassigned WebhookIssueAction = "unassigned" + WebhookIssueLabelUpdated WebhookIssueAction = "label_updated" + WebhookIssueLabelCleared WebhookIssueAction = "label_cleared" + WebhookIssueMilestoned WebhookIssueAction = "milestoned" + WebhookIssueDemilestoned WebhookIssueAction = "demilestoned" + WebhookIssueSynchronized WebhookIssueAction = "synchronized" +) + +type WebhookIssueCommentAction string + +const ( + WebhookIssueCommentCreated WebhookIssueCommentAction = "created" + WebhookIssueCommentEdited WebhookIssueCommentAction = "edited" + WebhookIssueCommentDeleted WebhookIssueCommentAction = "deleted" +) + +type WebhookReleaseAction string + +const WebhookReleasePublished WebhookReleaseAction = "published" + +type WebhookChangesFromPayload struct { + From string `json:"from"` +} + +type WebhookChangesPayload struct { + Title *WebhookChangesFromPayload `json:"title,omitempty"` + Body *WebhookChangesFromPayload `json:"body,omitempty"` +} + +type WebhookCreatePayload struct { + Ref string `json:"ref"` + RefType string `json:"ref_type"` + Sha string `json:"sha"` + DefaultBranch string `json:"default_branch"` + Repo *Repository `json:"repository"` + Sender *User `json:"sender"` +} + +func (p *WebhookCreatePayload) JSONPayload() ([]byte, error) { return jsonPayload(p) } + +type WebhookDeletePayload struct { + Ref string `json:"ref"` + RefType string `json:"ref_type"` + PusherType WebhookPusherType `json:"pusher_type"` + Repo *Repository `json:"repository"` + Sender *User `json:"sender"` +} + +func (p *WebhookDeletePayload) JSONPayload() ([]byte, error) { return jsonPayload(p) } + +type WebhookForkPayload struct { + Forkee *Repository `json:"forkee"` + Repo *Repository `json:"repository"` + Sender *User `json:"sender"` +} + +func (p *WebhookForkPayload) JSONPayload() ([]byte, error) { return jsonPayload(p) } + +type WebhookPushPayload struct { + Ref string `json:"ref"` + Before string `json:"before"` + After string `json:"after"` + CompareURL string `json:"compare_url"` + Commits []*WebhookPayloadCommit `json:"commits"` + Repo *Repository `json:"repository"` + Pusher *User `json:"pusher"` + Sender *User `json:"sender"` +} + +func (p *WebhookPushPayload) JSONPayload() ([]byte, error) { return jsonPayload(p) } + +type WebhookIssuesPayload struct { + Action WebhookIssueAction `json:"action"` + Index int64 `json:"number"` + Issue *Issue `json:"issue"` + Changes *WebhookChangesPayload `json:"changes,omitempty"` + Repository *Repository `json:"repository"` + Sender *User `json:"sender"` +} + +func (p *WebhookIssuesPayload) JSONPayload() ([]byte, error) { return jsonPayload(p) } + +type WebhookIssueCommentPayload struct { + Action WebhookIssueCommentAction `json:"action"` + Issue *Issue `json:"issue"` + Comment *IssueComment `json:"comment"` + Changes *WebhookChangesPayload `json:"changes,omitempty"` + Repository *Repository `json:"repository"` + Sender *User `json:"sender"` +} + +func (p *WebhookIssueCommentPayload) JSONPayload() ([]byte, error) { return jsonPayload(p) } + +type WebhookPullRequestPayload struct { + Action WebhookIssueAction `json:"action"` + Index int64 `json:"number"` + PullRequest *PullRequest `json:"pull_request"` + Changes *WebhookChangesPayload `json:"changes,omitempty"` + Repository *Repository `json:"repository"` + Sender *User `json:"sender"` +} + +func (p *WebhookPullRequestPayload) JSONPayload() ([]byte, error) { return jsonPayload(p) } + +type WebhookReleasePayload struct { + Action WebhookReleaseAction `json:"action"` + Release *RepositoryRelease `json:"release"` + Repository *Repository `json:"repository"` + Sender *User `json:"sender"` +} + +func (p *WebhookReleasePayload) JSONPayload() ([]byte, error) { return jsonPayload(p) } diff --git a/internal/route/api/v1/user.go b/internal/route/api/v1/user.go new file mode 100644 index 00000000000..0974fdb7b53 --- /dev/null +++ b/internal/route/api/v1/user.go @@ -0,0 +1,55 @@ +package v1 + +import ( + "net/http" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func searchUsers(c *context.APIContext) { + pageSize := c.QueryInt("limit") + if pageSize <= 0 { + pageSize = 10 + } + users, _, err := database.Handle.Users().SearchByName(c.Req.Context(), c.Query("q"), 1, pageSize, "") + if err != nil { + c.JSON(http.StatusInternalServerError, map[string]any{ + "ok": false, + "error": err.Error(), + }) + return + } + + results := make([]*types.User, len(users)) + for i := range users { + results[i] = toUser(users[i]) + if !c.IsLogged { + results[i].Email = "" + } + } + + c.JSONSuccess(map[string]any{ + "ok": true, + "data": results, + }) +} + +func getUserProfile(c *context.APIContext) { + u, err := database.Handle.Users().GetByUsername(c.Req.Context(), c.Params(":username")) + if err != nil { + c.NotFoundOrError(err, "get user by name") + return + } + + // Hide user e-mail when API caller isn't signed in. + if !c.IsLogged { + u.Email = "" + } + c.JSONSuccess(toUser(u)) +} + +func getAuthenticatedUser(c *context.APIContext) { + c.JSONSuccess(toUser(c.User)) +} diff --git a/internal/route/api/v1/user_access_tokens.go b/internal/route/api/v1/user_access_tokens.go new file mode 100644 index 00000000000..a167aa6d230 --- /dev/null +++ b/internal/route/api/v1/user_access_tokens.go @@ -0,0 +1,94 @@ +package v1 + +import ( + gocontext "context" + "net/http" + + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +// accessTokensHandler is the handler for users access tokens API endpoints. +type accessTokensHandler struct { + store AccessTokensStore +} + +// newAccessTokensHandler returns a new accessTokensHandler for users access +// tokens API endpoints. +func newAccessTokensHandler(s AccessTokensStore) *accessTokensHandler { + return &accessTokensHandler{ + store: s, + } +} + +func (h *accessTokensHandler) List() macaron.Handler { + return func(c *context.APIContext) { + tokens, err := h.store.ListAccessTokens(c.Req.Context(), c.User.ID) + if err != nil { + c.Error(err, "list access tokens") + return + } + + apiTokens := make([]*types.UserAccessToken, len(tokens)) + for i := range tokens { + apiTokens[i] = &types.UserAccessToken{ + Name: tokens[i].Name, + Sha1: tokens[i].Sha1, + } + } + c.JSONSuccess(&apiTokens) + } +} + +type createAccessTokenRequest struct { + Name string `json:"name" binding:"Required"` +} + +func (h *accessTokensHandler) Create() macaron.Handler { + return func(c *context.APIContext, form createAccessTokenRequest) { + t, err := h.store.CreateAccessToken(c.Req.Context(), c.User.ID, form.Name) + if err != nil { + if database.IsErrAccessTokenAlreadyExist(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, err) + } else { + c.Error(err, "new access token") + } + return + } + c.JSON(http.StatusCreated, &types.UserAccessToken{ + Name: t.Name, + Sha1: t.Sha1, + }) + } +} + +// AccessTokensStore is the data layer carrier for user access tokens API +// endpoints. This interface is meant to abstract away and limit the exposure of +// the underlying data layer to the handler through a thin-wrapper. +type AccessTokensStore interface { + // CreateAccessToken creates a new access token and persist to database. It + // returns database.ErrAccessTokenAlreadyExist when an access token with same + // name already exists for the user. + CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error) + // ListAccessTokens returns all access tokens belongs to given user. + ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error) +} + +type accessTokensStore struct{} + +// newAccessTokensStore returns a new AccessTokensStore using the global +// database handle. +func newAccessTokensStore() AccessTokensStore { + return &accessTokensStore{} +} + +func (*accessTokensStore) CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error) { + return database.Handle.AccessTokens().Create(ctx, userID, name) +} + +func (*accessTokensStore) ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error) { + return database.Handle.AccessTokens().List(ctx, userID) +} diff --git a/internal/route/api/v1/user_email.go b/internal/route/api/v1/user_email.go new file mode 100644 index 00000000000..e82cd704136 --- /dev/null +++ b/internal/route/api/v1/user_email.go @@ -0,0 +1,71 @@ +package v1 + +import ( + "net/http" + + "github.com/cockroachdb/errors" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func listEmails(c *context.APIContext) { + emails, err := database.Handle.Users().ListEmails(c.Req.Context(), c.User.ID) + if err != nil { + c.Error(err, "get email addresses") + return + } + apiEmails := make([]*types.UserEmail, len(emails)) + for i := range emails { + apiEmails[i] = toUserEmail(emails[i]) + } + c.JSONSuccess(&apiEmails) +} + +type createEmailRequest struct { + Emails []string `json:"emails"` +} + +func addEmail(c *context.APIContext, form createEmailRequest) { + if len(form.Emails) == 0 { + c.Status(http.StatusUnprocessableEntity) + return + } + + apiEmails := make([]*types.UserEmail, 0, len(form.Emails)) + for _, email := range form.Emails { + err := database.Handle.Users().AddEmail(c.Req.Context(), c.User.ID, email, !conf.Auth.RequireEmailConfirmation) + if err != nil { + if database.IsErrEmailAlreadyUsed(err) { + c.ErrorStatus(http.StatusUnprocessableEntity, errors.Errorf("email address has been used: %s", err.(database.ErrEmailAlreadyUsed).Email())) + } else { + c.Error(err, "add email addresses") + } + return + } + + apiEmails = append(apiEmails, &types.UserEmail{ + Email: email, + Verified: !conf.Auth.RequireEmailConfirmation, + }) + } + c.JSON(http.StatusCreated, &apiEmails) +} + +func deleteEmail(c *context.APIContext, form createEmailRequest) { + for _, email := range form.Emails { + if email == c.User.Email { + c.ErrorStatus(http.StatusBadRequest, errors.Errorf("cannot delete primary email %q", email)) + return + } + + err := database.Handle.Users().DeleteEmail(c.Req.Context(), c.User.ID, email) + if err != nil { + c.Error(err, "delete email addresses") + return + } + } + c.NoContent() +} diff --git a/internal/route/api/v1/user_follower.go b/internal/route/api/v1/user_follower.go new file mode 100644 index 00000000000..657deefbca3 --- /dev/null +++ b/internal/route/api/v1/user_follower.go @@ -0,0 +1,109 @@ +package v1 + +import ( + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func responseAPIUsers(c *context.APIContext, users []*database.User) { + apiUsers := make([]*types.User, len(users)) + for i := range users { + apiUsers[i] = toUser(users[i]) + } + c.JSONSuccess(&apiUsers) +} + +func listUserFollowers(c *context.APIContext, u *database.User) { + users, err := database.Handle.Users().ListFollowers(c.Req.Context(), u.ID, c.QueryInt("page"), database.ItemsPerPage) + if err != nil { + c.Error(err, "list followers") + return + } + responseAPIUsers(c, users) +} + +func listMyFollowers(c *context.APIContext) { + listUserFollowers(c, c.User) +} + +func listFollowers(c *context.APIContext) { + u := getUserByParams(c) + if c.Written() { + return + } + listUserFollowers(c, u) +} + +func listUserFollowing(c *context.APIContext, u *database.User) { + users, err := database.Handle.Users().ListFollowings(c.Req.Context(), u.ID, c.QueryInt("page"), database.ItemsPerPage) + if err != nil { + c.Error(err, "list followings") + return + } + responseAPIUsers(c, users) +} + +func listMyFollowing(c *context.APIContext) { + listUserFollowing(c, c.User) +} + +func listFollowing(c *context.APIContext) { + u := getUserByParams(c) + if c.Written() { + return + } + listUserFollowing(c, u) +} + +func checkUserFollowing(c *context.APIContext, u *database.User, followID int64) { + if database.Handle.Users().IsFollowing(c.Req.Context(), u.ID, followID) { + c.NoContent() + } else { + c.NotFound() + } +} + +func checkMyFollowing(c *context.APIContext) { + target := getUserByParams(c) + if c.Written() { + return + } + checkUserFollowing(c, c.User, target.ID) +} + +func checkFollowing(c *context.APIContext) { + u := getUserByParams(c) + if c.Written() { + return + } + target := getUserByParamsName(c, ":target") + if c.Written() { + return + } + checkUserFollowing(c, u, target.ID) +} + +func follow(c *context.APIContext) { + target := getUserByParams(c) + if c.Written() { + return + } + if err := database.Handle.Users().Follow(c.Req.Context(), c.User.ID, target.ID); err != nil { + c.Error(err, "follow user") + return + } + c.NoContent() +} + +func unfollow(c *context.APIContext) { + target := getUserByParams(c) + if c.Written() { + return + } + if err := database.Handle.Users().Unfollow(c.Req.Context(), c.User.ID, target.ID); err != nil { + c.Error(err, "unfollow user") + return + } + c.NoContent() +} diff --git a/internal/route/api/v1/user_key.go b/internal/route/api/v1/user_key.go new file mode 100644 index 00000000000..1ca9ff6a70e --- /dev/null +++ b/internal/route/api/v1/user_key.go @@ -0,0 +1,106 @@ +package v1 + +import ( + "net/http" + + "github.com/cockroachdb/errors" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/api/v1/types" +) + +func getUserByParamsName(c *context.APIContext, name string) *database.User { + user, err := database.Handle.Users().GetByUsername(c.Req.Context(), c.Params(name)) + if err != nil { + c.NotFoundOrError(err, "get user by name") + return nil + } + return user +} + +func getUserByParams(c *context.APIContext) *database.User { + return getUserByParamsName(c, ":username") +} + +func composePublicKeysAPILink() string { + return conf.Server.ExternalURL + "api/v1/user/keys/" +} + +func listPublicKeysOfUser(c *context.APIContext, uid int64) { + keys, err := database.ListPublicKeys(uid) + if err != nil { + c.Error(err, "list public keys") + return + } + + apiLink := composePublicKeysAPILink() + apiKeys := make([]*types.UserPublicKey, len(keys)) + for i := range keys { + apiKeys[i] = toUserPublicKey(apiLink, keys[i]) + } + + c.JSONSuccess(&apiKeys) +} + +func listMyPublicKeys(c *context.APIContext) { + listPublicKeysOfUser(c, c.User.ID) +} + +func listPublicKeys(c *context.APIContext) { + user := getUserByParams(c) + if c.Written() { + return + } + listPublicKeysOfUser(c, user.ID) +} + +func getPublicKey(c *context.APIContext) { + key, err := database.GetPublicKeyByID(c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get public key by ID") + return + } + + apiLink := composePublicKeysAPILink() + c.JSONSuccess(toUserPublicKey(apiLink, key)) +} + +type createPublicKeyRequest struct { + Title string `json:"title" binding:"Required"` + Key string `json:"key" binding:"Required"` +} + +func createUserPublicKey(c *context.APIContext, form createPublicKeyRequest, uid int64) { + content, err := database.CheckPublicKeyString(form.Key) + if err != nil { + handleCheckKeyStringError(c, err) + return + } + + key, err := database.AddPublicKey(uid, form.Title, content) + if err != nil { + handleAddKeyError(c, err) + return + } + apiLink := composePublicKeysAPILink() + c.JSON(http.StatusCreated, toUserPublicKey(apiLink, key)) +} + +func createPublicKey(c *context.APIContext, form createPublicKeyRequest) { + createUserPublicKey(c, form, c.User.ID) +} + +func deletePublicKey(c *context.APIContext) { + if err := database.DeletePublicKey(c.User, c.ParamsInt64(":id")); err != nil { + if database.IsErrKeyAccessDenied(err) { + c.ErrorStatus(http.StatusForbidden, errors.New("You do not have access to this key.")) + } else { + c.Error(err, "delete public key") + } + return + } + + c.NoContent() +} diff --git a/internal/route/dev/template.go b/internal/route/dev/template.go new file mode 100644 index 00000000000..b1dee7d97a8 --- /dev/null +++ b/internal/route/dev/template.go @@ -0,0 +1,20 @@ +package dev + +import ( + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" +) + +func TemplatePreview(c *context.Context) { + c.Data["User"] = database.User{Name: "Unknown"} + c.Data["AppName"] = conf.App.BrandName + c.Data["AppVersion"] = conf.App.Version + c.Data["AppURL"] = conf.Server.ExternalURL + c.Data["Code"] = "2014031910370000009fff6782aadb2162b4a997acb69d4400888e0b9274657374" + c.Data["ActiveCodeLives"] = conf.Auth.ActivateCodeLives / 60 + c.Data["ResetPwdCodeLives"] = conf.Auth.ResetPasswordCodeLives / 60 + c.Data["CurDbValue"] = "" + + c.Success(c.Params("*")) +} diff --git a/internal/route/home.go b/internal/route/home.go new file mode 100644 index 00000000000..5f8a3e49b0d --- /dev/null +++ b/internal/route/home.go @@ -0,0 +1,146 @@ +package route + +import ( + gocontext "context" + + "github.com/unknwon/paginater" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/user" +) + +const ( + tmplExploreRepos = "explore/repos" + tmplExploreUsers = "explore/users" + tmplExploreOrganizations = "explore/organizations" +) + +func Home(c *context.Context) { + if c.IsLogged { + if !c.User.IsActive && conf.Auth.RequireEmailConfirmation { + c.Data["Title"] = c.Tr("auth.active_your_account") + c.Success(user.TmplUserAuthActivate) + } else { + user.Dashboard(c) + } + return + } + + c.ServeWeb() +} + +func ExploreRepos(c *context.Context) { + c.Data["Title"] = c.Tr("explore") + c.Data["PageIsExplore"] = true + c.Data["PageIsExploreRepositories"] = true + + page := c.QueryInt("page") + if page <= 0 { + page = 1 + } + + keyword := c.Query("q") + repos, count, err := database.SearchRepositoryByName(&database.SearchRepoOptions{ + Keyword: keyword, + UserID: c.UserID(), + OrderBy: "updated_unix DESC", + Page: page, + PageSize: conf.UI.ExplorePagingNum, + }) + if err != nil { + c.Error(err, "search repository by name") + return + } + c.Data["Keyword"] = keyword + c.Data["Total"] = count + c.Data["Page"] = paginater.New(int(count), conf.UI.ExplorePagingNum, page, 5) + + if err = database.RepositoryList(repos).LoadAttributes(); err != nil { + c.Error(err, "load attributes") + return + } + c.Data["Repos"] = repos + + c.Success(tmplExploreRepos) +} + +type UserSearchOptions struct { + Type database.UserType + Counter func(ctx gocontext.Context) int64 + Ranger func(ctx gocontext.Context, page, pageSize int) ([]*database.User, error) + PageSize int + OrderBy string + TplName string +} + +func RenderUserSearch(c *context.Context, opts *UserSearchOptions) { + page := max(c.QueryInt("page"), 1) + + var ( + users []*database.User + count int64 + err error + ) + + keyword := c.Query("q") + if keyword == "" { + users, err = opts.Ranger(c.Req.Context(), page, opts.PageSize) + if err != nil { + c.Error(err, "ranger") + return + } + count = opts.Counter(c.Req.Context()) + } else { + search := database.Handle.Users().SearchByName + if opts.Type == database.UserTypeOrganization { + search = database.Handle.Organizations().SearchByName + } + users, count, err = search(c.Req.Context(), keyword, page, opts.PageSize, opts.OrderBy) + if err != nil { + c.Error(err, "search by name") + return + } + } + c.Data["Keyword"] = keyword + c.Data["Total"] = count + c.Data["Page"] = paginater.New(int(count), opts.PageSize, page, 5) + c.Data["Users"] = users + + c.Success(opts.TplName) +} + +func ExploreUsers(c *context.Context) { + c.Data["Title"] = c.Tr("explore") + c.Data["PageIsExplore"] = true + c.Data["PageIsExploreUsers"] = true + + RenderUserSearch(c, &UserSearchOptions{ + Type: database.UserTypeIndividual, + Counter: database.Handle.Users().Count, + Ranger: database.Handle.Users().List, + PageSize: conf.UI.ExplorePagingNum, + OrderBy: "updated_unix DESC", + TplName: tmplExploreUsers, + }) +} + +func ExploreOrganizations(c *context.Context) { + c.Data["Title"] = c.Tr("explore") + c.Data["PageIsExplore"] = true + c.Data["PageIsExploreOrganizations"] = true + + RenderUserSearch(c, &UserSearchOptions{ + Type: database.UserTypeOrganization, + Counter: func(gocontext.Context) int64 { + return database.CountOrganizations() + }, + Ranger: func(_ gocontext.Context, page, pageSize int) ([]*database.User, error) { + return database.Organizations(page, pageSize) + }, + PageSize: conf.UI.ExplorePagingNum, + OrderBy: "updated_unix DESC", + TplName: tmplExploreOrganizations, + }) +} diff --git a/internal/route/install.go b/internal/route/install.go new file mode 100644 index 00000000000..380f36b947e --- /dev/null +++ b/internal/route/install.go @@ -0,0 +1,419 @@ +package route + +import ( + "net/http" + "net/mail" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" + "gopkg.in/ini.v1" + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/cron" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/email" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/ssh" + "gogs.io/gogs/internal/strx" + "gogs.io/gogs/internal/template/highlight" +) + +const ( + INSTALL = "install" +) + +func checkRunMode() { + if conf.IsProdMode() { + macaron.Env = macaron.PROD + macaron.ColorLog = false + git.SetOutput(nil) + } else { + git.SetOutput(os.Stdout) + } + log.Info("Run mode: %s", strings.Title(macaron.Env)) +} + +// GlobalInit is for global configuration reload-able. +func GlobalInit(customConf string) error { + err := conf.Init(customConf) + if err != nil { + return errors.Wrap(err, "init configuration") + } + + conf.InitLogging(false) + log.Info("%s %s", conf.App.BrandName, conf.App.Version) + log.Trace("Work directory: %s", conf.WorkDir()) + log.Trace("Custom path: %s", conf.CustomDir()) + log.Trace("Custom config: %s", conf.CustomConf) + log.Trace("Log path: %s", conf.Log.RootPath) + log.Trace("Build time: %s", conf.BuildTime) + log.Trace("Build commit: %s", conf.BuildCommit) + + if conf.Email.Enabled { + log.Trace("Email service is enabled") + } + + email.NewContext() + + if conf.Security.InstallLock { + highlight.NewContext() + markup.NewSanitizer() + err := database.NewEngine() + if err != nil { + log.Fatal("Failed to initialize ORM engine: %v", err) + } + database.HasEngine = true + + database.LoadRepoConfig() + database.NewRepoContext() + + // Booting long running goroutines. + cron.NewContext() + database.InitSyncMirrors() + database.InitDeliverHooks() + database.InitTestPullRequests() + } + if conf.HasMinWinSvc { + log.Info("Builtin Windows Service is supported") + } + if conf.Server.LoadAssetsFromDisk { + log.Trace("Assets are loaded from disk") + } + checkRunMode() + + if !conf.Security.InstallLock { + return nil + } + + if conf.SSH.StartBuiltinServer { + ssh.Listen(conf.SSH, conf.Server.AppDataPath) + log.Info("SSH server started on %s:%v", conf.SSH.ListenHost, conf.SSH.ListenPort) + log.Trace("SSH server cipher list: %v", conf.SSH.ServerCiphers) + log.Trace("SSH server MAC list: %v", conf.SSH.ServerMACs) + log.Trace("SSH server algorithms: %v", conf.SSH.ServerAlgorithms) + } + + if conf.SSH.RewriteAuthorizedKeysAtStart { + if err := database.RewriteAuthorizedKeys(); err != nil { + log.Warn("Failed to rewrite authorized_keys file: %v", err) + } + } + + return nil +} + +func InstallInit(c *context.Context) { + if conf.Security.InstallLock { + c.NotFound() + return + } + + c.Title("install.install") + c.PageIs("Install") + + c.Data["DbOptions"] = []string{"MySQL", "PostgreSQL", "SQLite3"} +} + +func Install(c *context.Context) { + f := form.Install{} + + // Database settings + f.DbHost = conf.Database.Host + f.DbUser = conf.Database.User + f.DbName = conf.Database.Name + f.DbSchema = conf.Database.Schema + f.DbPath = conf.Database.Path + + c.Data["CurDbOption"] = "PostgreSQL" + switch conf.Database.Type { + case "mysql": + c.Data["CurDbOption"] = "MySQL" + case "sqlite3": + c.Data["CurDbOption"] = "SQLite3" + } + + // Application general settings + f.AppName = conf.App.BrandName + f.RepoRootPath = conf.Repository.Root + + // Note(unknwon): it's hard for Windows users change a running user, + // so just use current one if config says default. + if conf.IsWindowsRuntime() && conf.App.RunUser == "git" { + f.RunUser = osx.CurrentUsername() + } else { + f.RunUser = conf.App.RunUser + } + + f.Domain = conf.Server.Domain + f.SSHPort = conf.SSH.Port + f.UseBuiltinSSHServer = conf.SSH.StartBuiltinServer + f.HTTPPort = strconv.Itoa(conf.Server.HTTPPort) + f.AppUrl = conf.Server.ExternalURL + f.LogRootPath = conf.Log.RootPath + f.DefaultBranch = conf.Repository.DefaultBranch + + // E-mail service settings + if conf.Email.Enabled { + f.SMTPHost = conf.Email.Host + f.SMTPFrom = conf.Email.From + f.SMTPUser = conf.Email.User + } + f.RegisterConfirm = conf.Auth.RequireEmailConfirmation + f.MailNotify = conf.User.EnableEmailNotification + + // Server and other services settings + f.OfflineMode = conf.Server.OfflineMode + f.DisableGravatar = conf.Picture.DisableGravatar + f.EnableFederatedAvatar = conf.Picture.EnableFederatedAvatar + f.DisableRegistration = conf.Auth.DisableRegistration + f.EnableCaptcha = conf.Auth.EnableRegistrationCaptcha + f.RequireSignInView = conf.Auth.RequireSigninView + + form.Assign(f, c.Data) + c.Success(INSTALL) +} + +func InstallPost(c *context.Context, f form.Install) { + c.Data["CurDbOption"] = f.DbType + + if c.HasError() { + if c.HasValue("Err_SMTPEmail") { + c.FormErr("SMTP") + } + if c.HasValue("Err_AdminName") || + c.HasValue("Err_AdminPasswd") || + c.HasValue("Err_AdminEmail") { + c.FormErr("Admin") + } + c.HTML(http.StatusBadRequest, INSTALL) + return + } + + if _, err := exec.LookPath("git"); err != nil { + c.RenderWithErr(c.Tr("install.test_git_failed", err), http.StatusInternalServerError, INSTALL, &f) + return + } + + // Pass basic check, now test configuration. + // Test database setting. + dbTypes := map[string]string{ + "PostgreSQL": "postgres", + "MySQL": "mysql", + "SQLite3": "sqlite3", + } + conf.Database.Type = dbTypes[f.DbType] + conf.Database.Host = f.DbHost + conf.Database.User = f.DbUser + conf.Database.Password = f.DbPasswd + conf.Database.Name = f.DbName + conf.Database.Schema = f.DbSchema + conf.Database.SSLMode = f.SSLMode + conf.Database.Path = f.DbPath + + if conf.Database.Type == "sqlite3" && conf.Database.Path == "" { + c.FormErr("DbPath") + c.RenderWithErr(c.Tr("install.err_empty_db_path"), http.StatusBadRequest, INSTALL, &f) + return + } + + // Set test engine. + if err := database.NewTestEngine(); err != nil { + c.FormErr("DbSetting") + c.RenderWithErr(c.Tr("install.invalid_db_setting", err), http.StatusBadRequest, INSTALL, &f) + return + } + + // Test repository root path. + f.RepoRootPath = strings.ReplaceAll(f.RepoRootPath, "\\", "/") + if err := os.MkdirAll(f.RepoRootPath, os.ModePerm); err != nil { + c.FormErr("RepoRootPath") + c.RenderWithErr(c.Tr("install.invalid_repo_path", err), http.StatusBadRequest, INSTALL, &f) + return + } + + // Test log root path. + f.LogRootPath = strings.ReplaceAll(f.LogRootPath, "\\", "/") + if err := os.MkdirAll(f.LogRootPath, os.ModePerm); err != nil { + c.FormErr("LogRootPath") + c.RenderWithErr(c.Tr("install.invalid_log_root_path", err), http.StatusBadRequest, INSTALL, &f) + return + } + + currentUser, match := conf.CheckRunUser(f.RunUser) + if !match { + c.FormErr("RunUser") + c.RenderWithErr(c.Tr("install.run_user_not_match", f.RunUser, currentUser), http.StatusForbidden, INSTALL, &f) + return + } + + // Check host address and port + if len(f.SMTPHost) > 0 && !strings.Contains(f.SMTPHost, ":") { + c.FormErr("SMTP", "SMTPHost") + c.RenderWithErr(c.Tr("install.smtp_host_missing_port"), http.StatusBadRequest, INSTALL, &f) + return + } + + // Make sure FROM field is valid + if len(f.SMTPFrom) > 0 { + _, err := mail.ParseAddress(f.SMTPFrom) + if err != nil { + c.FormErr("SMTP", "SMTPFrom") + c.RenderWithErr(c.Tr("install.invalid_smtp_from", err), http.StatusBadRequest, INSTALL, &f) + return + } + } + + // Check logic loophole between disable self-registration and no admin account. + if f.DisableRegistration && f.AdminName == "" { + c.FormErr("Services", "Admin") + c.RenderWithErr(c.Tr("install.no_admin_and_disable_registration"), http.StatusUnprocessableEntity, INSTALL, f) + return + } + + // Check admin password. + if len(f.AdminName) > 0 && f.AdminPasswd == "" { + c.FormErr("Admin", "AdminPasswd") + c.RenderWithErr(c.Tr("install.err_empty_admin_password"), http.StatusBadRequest, INSTALL, f) + return + } + if f.AdminPasswd != f.AdminConfirmPasswd { + c.FormErr("Admin", "AdminPasswd") + c.RenderWithErr(c.Tr("form.password_not_match"), http.StatusBadRequest, INSTALL, f) + return + } + + if f.AppUrl[len(f.AppUrl)-1] != '/' { + f.AppUrl += "/" + } + + // Save settings. + cfg := ini.Empty() + if osx.IsFile(conf.CustomConf) { + // Keeps custom settings if there is already something. + if err := cfg.Append(conf.CustomConf); err != nil { + log.Error("Failed to load custom conf %q: %v", conf.CustomConf, err) + } + } + cfg.Section("database").Key("TYPE").SetValue(conf.Database.Type) + cfg.Section("database").Key("HOST").SetValue(conf.Database.Host) + cfg.Section("database").Key("NAME").SetValue(conf.Database.Name) + cfg.Section("database").Key("SCHEMA").SetValue(conf.Database.Schema) + cfg.Section("database").Key("USER").SetValue(conf.Database.User) + cfg.Section("database").Key("PASSWORD").SetValue(conf.Database.Password) + cfg.Section("database").Key("SSL_MODE").SetValue(conf.Database.SSLMode) + cfg.Section("database").Key("PATH").SetValue(conf.Database.Path) + + cfg.Section("").Key("BRAND_NAME").SetValue(f.AppName) + cfg.Section("repository").Key("ROOT").SetValue(f.RepoRootPath) + cfg.Section("repository").Key("DEFAULT_BRANCH").SetValue(f.DefaultBranch) + cfg.Section("").Key("RUN_USER").SetValue(f.RunUser) + cfg.Section("server").Key("DOMAIN").SetValue(f.Domain) + cfg.Section("server").Key("HTTP_PORT").SetValue(f.HTTPPort) + cfg.Section("server").Key("EXTERNAL_URL").SetValue(f.AppUrl) + + if f.SSHPort == 0 { + cfg.Section("server").Key("DISABLE_SSH").SetValue("true") + } else { + cfg.Section("server").Key("DISABLE_SSH").SetValue("false") + cfg.Section("server").Key("SSH_PORT").SetValue(strconv.Itoa(f.SSHPort)) + cfg.Section("server").Key("START_SSH_SERVER").SetValue(strconv.FormatBool(f.UseBuiltinSSHServer)) + } + + if len(strings.TrimSpace(f.SMTPHost)) > 0 { + cfg.Section("email").Key("ENABLED").SetValue("true") + cfg.Section("email").Key("HOST").SetValue(f.SMTPHost) + cfg.Section("email").Key("FROM").SetValue(f.SMTPFrom) + cfg.Section("email").Key("USER").SetValue(f.SMTPUser) + cfg.Section("email").Key("PASSWORD").SetValue(f.SMTPPasswd) + } else { + cfg.Section("email").Key("ENABLED").SetValue("false") + } + cfg.Section("server").Key("OFFLINE_MODE").SetValue(strconv.FormatBool(f.OfflineMode)) + cfg.Section("auth").Key("REQUIRE_EMAIL_CONFIRMATION").SetValue(strconv.FormatBool(f.RegisterConfirm)) + cfg.Section("auth").Key("DISABLE_REGISTRATION").SetValue(strconv.FormatBool(f.DisableRegistration)) + cfg.Section("auth").Key("ENABLE_REGISTRATION_CAPTCHA").SetValue(strconv.FormatBool(f.EnableCaptcha)) + cfg.Section("auth").Key("REQUIRE_SIGNIN_VIEW").SetValue(strconv.FormatBool(f.RequireSignInView)) + cfg.Section("user").Key("ENABLE_EMAIL_NOTIFICATION").SetValue(strconv.FormatBool(f.MailNotify)) + cfg.Section("picture").Key("DISABLE_GRAVATAR").SetValue(strconv.FormatBool(f.DisableGravatar)) + cfg.Section("picture").Key("ENABLE_FEDERATED_AVATAR").SetValue(strconv.FormatBool(f.EnableFederatedAvatar)) + + cfg.Section("").Key("RUN_MODE").SetValue("prod") + + cfg.Section("session").Key("PROVIDER").SetValue("file") + + mode := "file" + if f.EnableConsoleMode { + mode = "console, file" + } + cfg.Section("log").Key("MODE").SetValue(mode) + cfg.Section("log").Key("LEVEL").SetValue("Info") + cfg.Section("log").Key("ROOT_PATH").SetValue(f.LogRootPath) + + cfg.Section("security").Key("INSTALL_LOCK").SetValue("true") + secretKey, err := strx.RandomChars(15) + if err != nil { + c.RenderWithErr(c.Tr("install.secret_key_failed", err), http.StatusInternalServerError, INSTALL, &f) + return + } + cfg.Section("security").Key("SECRET_KEY").SetValue(secretKey) + + _ = os.MkdirAll(filepath.Dir(conf.CustomConf), os.ModePerm) + if err := cfg.SaveTo(conf.CustomConf); err != nil { + c.RenderWithErr(c.Tr("install.save_config_failed", err), http.StatusInternalServerError, INSTALL, &f) + return + } + + // NOTE: We reuse the current value because this handler does not have access to CLI flags. + err = GlobalInit(conf.CustomConf) + if err != nil { + c.RenderWithErr(c.Tr("install.init_failed", err), http.StatusInternalServerError, INSTALL, &f) + return + } + + // Create admin account + if len(f.AdminName) > 0 { + user, err := database.Handle.Users().Create( + c.Req.Context(), + f.AdminName, + f.AdminEmail, + database.CreateUserOptions{ + Password: f.AdminPasswd, + Activated: true, + Admin: true, + }, + ) + if err != nil { + if !database.IsErrUserAlreadyExist(err) { + conf.Security.InstallLock = false + c.FormErr("AdminName", "AdminEmail") + c.RenderWithErr(c.Tr("install.invalid_admin_setting", err), http.StatusBadRequest, INSTALL, &f) + return + } + + log.Info("Admin account already exist") + user, err = database.Handle.Users().GetByUsername(c.Req.Context(), f.AdminName) + if err != nil { + c.Error(err, "get user by name") + return + } + } + + // Auto-login for admin + _ = c.Session.Set("uid", user.ID) + _ = c.Session.Set("uname", user.Name) + } + + log.Info("First-time run install finished!") + c.Flash.Success(c.Tr("install.install_success")) + c.Redirect(f.AppUrl + "user/sign-in") +} diff --git a/internal/route/lfs/basic.go b/internal/route/lfs/basic.go new file mode 100644 index 00000000000..b64e233caa9 --- /dev/null +++ b/internal/route/lfs/basic.go @@ -0,0 +1,164 @@ +package lfs + +import ( + "encoding/json" + "io" + "net/http" + "strconv" + + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/lfsx" + "gogs.io/gogs/internal/strx" +) + +const transferBasic = "basic" +const ( + basicOperationUpload = "upload" + basicOperationDownload = "download" +) + +type basicHandler struct { + store Store + // The default storage backend for uploading new objects. + defaultStorage lfsx.Storage + // The list of available storage backends to access objects. + storagers map[lfsx.Storage]lfsx.Storager +} + +// DefaultStorager returns the default storage backend. +func (h *basicHandler) DefaultStorager() lfsx.Storager { + return h.storagers[h.defaultStorage] +} + +// Storager returns the given storage backend. +func (h *basicHandler) Storager(storage lfsx.Storage) lfsx.Storager { + return h.storagers[storage] +} + +// GET /{owner}/{repo}.git/info/lfs/object/basic/{oid} +func (h *basicHandler) serveDownload(c *macaron.Context, repo *database.Repository, oid lfsx.OID) { + object, err := h.store.GetLFSObjectByOID(c.Req.Context(), repo.ID, oid) + if err != nil { + if database.IsErrLFSObjectNotExist(err) { + responseJSON(c.Resp, http.StatusNotFound, responseError{ + Message: "Object does not exist", + }) + } else { + internalServerError(c.Resp) + log.Error("Failed to get object [repo_id: %d, oid: %s]: %v", repo.ID, oid, err) + } + return + } + + s := h.Storager(object.Storage) + if s == nil { + internalServerError(c.Resp) + log.Error("Failed to locate the object [repo_id: %d, oid: %s]: storage %q not found", object.RepoID, object.OID, object.Storage) + return + } + + c.Header().Set("Content-Type", "application/octet-stream") + c.Header().Set("Content-Length", strconv.FormatInt(object.Size, 10)) + c.Status(http.StatusOK) + + err = s.Download(object.OID, c.Resp) + if err != nil { + log.Error("Failed to download object [oid: %s]: %v", object.OID, err) + return + } +} + +// PUT /{owner}/{repo}.git/info/lfs/object/basic/{oid} +func (h *basicHandler) serveUpload(c *macaron.Context, repo *database.Repository, oid lfsx.OID) { + // NOTE: LFS client will retry upload the same object if there was a partial failure, + // therefore we would like to skip ones that already exist. + _, err := h.store.GetLFSObjectByOID(c.Req.Context(), repo.ID, oid) + if err == nil { + // Object exists, drain the request body and we're good. + _, _ = io.Copy(io.Discard, c.Req.Request.Body) + c.Req.Request.Body.Close() + c.Status(http.StatusOK) + return + } else if !database.IsErrLFSObjectNotExist(err) { + internalServerError(c.Resp) + log.Error("Failed to get object [repo_id: %d, oid: %s]: %v", repo.ID, oid, err) + return + } + + s := h.DefaultStorager() + written, err := s.Upload(oid, c.Req.Request.Body) + if err != nil { + if err == lfsx.ErrInvalidOID || err == lfsx.ErrOIDMismatch { + responseJSON(c.Resp, http.StatusBadRequest, responseError{ + Message: err.Error(), + }) + } else { + internalServerError(c.Resp) + log.Error("Failed to upload object [storage: %s, oid: %s]: %v", s.Storage(), oid, err) + } + return + } + + err = h.store.CreateLFSObject(c.Req.Context(), repo.ID, oid, written, s.Storage()) + if err != nil { + // NOTE: It is OK to leave the file when the whole operation failed + // with a DB error, a retry on client side will skip the upload as + // the file already exists on disk. + internalServerError(c.Resp) + log.Error("Failed to create object [repo_id: %d, oid: %s]: %v", repo.ID, oid, err) + return + } + c.Status(http.StatusOK) + + log.Trace("[LFS] Object created %q", oid) +} + +// POST /{owner}/{repo}.git/info/lfs/object/basic/verify +func (h *basicHandler) serveVerify(c *macaron.Context, repo *database.Repository) { + var request basicVerifyRequest + defer func() { _ = c.Req.Request.Body.Close() }() + + err := json.NewDecoder(c.Req.Request.Body).Decode(&request) + if err != nil { + responseJSON(c.Resp, http.StatusBadRequest, responseError{ + Message: strx.ToUpperFirst(err.Error()), + }) + return + } + + if !lfsx.ValidOID(request.Oid) { + responseJSON(c.Resp, http.StatusBadRequest, responseError{ + Message: "Invalid oid", + }) + return + } + + object, err := h.store.GetLFSObjectByOID(c.Req.Context(), repo.ID, request.Oid) + if err != nil { + if database.IsErrLFSObjectNotExist(err) { + responseJSON(c.Resp, http.StatusNotFound, responseError{ + Message: "Object does not exist", + }) + } else { + internalServerError(c.Resp) + log.Error("Failed to get object [repo_id: %d, oid: %s]: %v", repo.ID, request.Oid, err) + } + return + } + + if object.Size != request.Size { + responseJSON(c.Resp, http.StatusBadRequest, responseError{ + Message: "Object size mismatch", + }) + return + } + c.Status(http.StatusOK) +} + +type basicVerifyRequest struct { + Oid lfsx.OID `json:"oid"` + Size int64 `json:"size"` +} diff --git a/internal/route/lfs/basic_test.go b/internal/route/lfs/basic_test.go new file mode 100644 index 00000000000..3a860077f0e --- /dev/null +++ b/internal/route/lfs/basic_test.go @@ -0,0 +1,276 @@ +package lfs + +import ( + "bytes" + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/lfsx" +) + +var _ lfsx.Storager = (*mockStorage)(nil) + +// mockStorage is an in-memory storage for LFS objects. +type mockStorage struct { + buf *bytes.Buffer +} + +func (*mockStorage) Storage() lfsx.Storage { + return "memory" +} + +func (s *mockStorage) Upload(_ lfsx.OID, rc io.ReadCloser) (int64, error) { + defer func() { _ = rc.Close() }() + return io.Copy(s.buf, rc) +} + +func (s *mockStorage) Download(_ lfsx.OID, w io.Writer) error { + _, err := io.Copy(w, s.buf) + return err +} + +func TestBasicHandler_serveDownload(t *testing.T) { + s := &mockStorage{} + basic := &basicHandler{ + defaultStorage: s.Storage(), + storagers: map[lfsx.Storage]lfsx.Storager{ + s.Storage(): s, + }, + } + + m := macaron.New() + m.Use(macaron.Renderer()) + m.Use(func(c *macaron.Context) { + c.Map(&database.Repository{Name: "repo"}) + c.Map(lfsx.OID("ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f")) + }) + m.Get("/", basic.serveDownload) + + tests := []struct { + name string + content string + mockStore func() *MockStore + expStatusCode int + expHeader http.Header + expBody string + }{ + { + name: "object does not exist", + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetLFSObjectByOIDFunc.SetDefaultReturn(nil, database.ErrLFSObjectNotExist{}) + return mockStore + }, + expStatusCode: http.StatusNotFound, + expHeader: http.Header{ + "Content-Type": []string{"application/vnd.git-lfs+json"}, + }, + expBody: `{"message":"Object does not exist"}` + "\n", + }, + { + name: "storage not found", + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetLFSObjectByOIDFunc.SetDefaultReturn(&database.LFSObject{Storage: "bad_storage"}, nil) + return mockStore + }, + expStatusCode: http.StatusInternalServerError, + expHeader: http.Header{ + "Content-Type": []string{"application/vnd.git-lfs+json"}, + }, + expBody: `{"message":"Internal server error"}` + "\n", + }, + + { + name: "object exists", + content: "Hello world!", + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetLFSObjectByOIDFunc.SetDefaultReturn( + &database.LFSObject{ + Size: 12, + Storage: s.Storage(), + }, + nil, + ) + return mockStore + }, + expStatusCode: http.StatusOK, + expHeader: http.Header{ + "Content-Type": []string{"application/octet-stream"}, + "Content-Length": []string{"12"}, + }, + expBody: "Hello world!", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + basic.store = test.mockStore() + + s.buf = bytes.NewBufferString(test.content) + + r, err := http.NewRequest(http.MethodGet, "/", nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + m.ServeHTTP(rr, r) + + resp := rr.Result() + assert.Equal(t, test.expStatusCode, resp.StatusCode) + assert.Equal(t, test.expHeader, resp.Header) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, test.expBody, string(body)) + }) + } +} + +func TestBasicHandler_serveUpload(t *testing.T) { + s := &mockStorage{buf: &bytes.Buffer{}} + basic := &basicHandler{ + defaultStorage: s.Storage(), + storagers: map[lfsx.Storage]lfsx.Storager{ + s.Storage(): s, + }, + } + + m := macaron.New() + m.Use(macaron.Renderer()) + m.Use(func(c *macaron.Context) { + c.Map(&database.Repository{Name: "repo"}) + c.Map(lfsx.OID("ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f")) + }) + m.Put("/", basic.serveUpload) + + tests := []struct { + name string + mockStore func() *MockStore + expStatusCode int + expBody string + }{ + { + name: "object already exists", + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetLFSObjectByOIDFunc.SetDefaultReturn(&database.LFSObject{}, nil) + return mockStore + }, + expStatusCode: http.StatusOK, + }, + { + name: "new object", + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetLFSObjectByOIDFunc.SetDefaultReturn(nil, database.ErrLFSObjectNotExist{}) + return mockStore + }, + expStatusCode: http.StatusOK, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + basic.store = test.mockStore() + + r, err := http.NewRequest("PUT", "/", strings.NewReader("Hello world!")) + require.NoError(t, err) + + rr := httptest.NewRecorder() + m.ServeHTTP(rr, r) + + resp := rr.Result() + assert.Equal(t, test.expStatusCode, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, test.expBody, string(body)) + }) + } +} + +func TestBasicHandler_serveVerify(t *testing.T) { + basic := &basicHandler{} + + m := macaron.New() + m.Use(macaron.Renderer()) + m.Use(func(c *macaron.Context) { + c.Map(&database.Repository{Name: "repo"}) + }) + m.Post("/", basic.serveVerify) + + tests := []struct { + name string + body string + mockStore func() *MockStore + expStatusCode int + expBody string + }{ + { + name: "invalid oid", + body: `{"oid": "bad_oid"}`, + expStatusCode: http.StatusBadRequest, + expBody: `{"message":"Invalid oid"}` + "\n", + }, + { + name: "object does not exist", + body: `{"oid":"ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f"}`, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetLFSObjectByOIDFunc.SetDefaultReturn(nil, database.ErrLFSObjectNotExist{}) + return mockStore + }, + expStatusCode: http.StatusNotFound, + expBody: `{"message":"Object does not exist"}` + "\n", + }, + { + name: "object size mismatch", + body: `{"oid":"ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f"}`, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetLFSObjectByOIDFunc.SetDefaultReturn(&database.LFSObject{Size: 12}, nil) + return mockStore + }, + expStatusCode: http.StatusBadRequest, + expBody: `{"message":"Object size mismatch"}` + "\n", + }, + + { + name: "object exists", + body: `{"oid":"ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", "size":12}`, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetLFSObjectByOIDFunc.SetDefaultReturn(&database.LFSObject{Size: 12}, nil) + return mockStore + }, + expStatusCode: http.StatusOK, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + if test.mockStore != nil { + basic.store = test.mockStore() + } + + r, err := http.NewRequest("POST", "/", strings.NewReader(test.body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + m.ServeHTTP(rr, r) + + resp := rr.Result() + assert.Equal(t, test.expStatusCode, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, test.expBody, string(body)) + }) + } +} diff --git a/internal/route/lfs/batch.go b/internal/route/lfs/batch.go new file mode 100644 index 00000000000..a64ab8bc1f4 --- /dev/null +++ b/internal/route/lfs/batch.go @@ -0,0 +1,180 @@ +package lfs + +import ( + "encoding/json" + "fmt" + "net/http" + + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/lfsx" + "gogs.io/gogs/internal/strx" +) + +// POST /{owner}/{repo}.git/info/lfs/object/batch +func serveBatch(store Store) macaron.Handler { + return func(c *macaron.Context, owner *database.User, repo *database.Repository) { + var request batchRequest + defer func() { _ = c.Req.Request.Body.Close() }() + err := json.NewDecoder(c.Req.Request.Body).Decode(&request) + if err != nil { + responseJSON(c.Resp, http.StatusBadRequest, responseError{ + Message: strx.ToUpperFirst(err.Error()), + }) + return + } + + // NOTE: We only support basic transfer as of now. + transfer := transferBasic + // Example: https://try.gogs.io/gogs/gogs.git/info/lfs/object/basic + baseHref := fmt.Sprintf("%s%s/%s.git/info/lfs/objects/basic", conf.Server.ExternalURL, owner.Name, repo.Name) + + objects := make([]batchObject, 0, len(request.Objects)) + switch request.Operation { + case basicOperationUpload: + for _, obj := range request.Objects { + var actions batchActions + if lfsx.ValidOID(obj.Oid) { + actions = batchActions{ + Upload: &batchAction{ + Href: fmt.Sprintf("%s/%s", baseHref, obj.Oid), + Header: map[string]string{ + // NOTE: git-lfs v2.5.0 sets the Content-Type based on the uploaded file. + // This ensures that the client always uses the designated value for the header. + "Content-Type": "application/octet-stream", + }, + }, + Verify: &batchAction{ + Href: fmt.Sprintf("%s/verify", baseHref), + }, + } + } else { + actions = batchActions{ + Error: &batchError{ + Code: http.StatusUnprocessableEntity, + Message: "Object has invalid oid", + }, + } + } + + objects = append(objects, batchObject{ + Oid: obj.Oid, + Size: obj.Size, + Actions: actions, + }) + } + + case basicOperationDownload: + oids := make([]lfsx.OID, 0, len(request.Objects)) + for _, obj := range request.Objects { + oids = append(oids, obj.Oid) + } + stored, err := store.GetLFSObjectsByOIDs(c.Req.Context(), repo.ID, oids...) + if err != nil { + internalServerError(c.Resp) + log.Error("Failed to get objects [repo_id: %d, oids: %v]: %v", repo.ID, oids, err) + return + } + storedSet := make(map[lfsx.OID]*database.LFSObject, len(stored)) + for _, obj := range stored { + storedSet[obj.OID] = obj + } + + for _, obj := range request.Objects { + var actions batchActions + if stored := storedSet[obj.Oid]; stored != nil { + if stored.Size != obj.Size { + actions.Error = &batchError{ + Code: http.StatusUnprocessableEntity, + Message: "Object size mismatch", + } + } else { + actions.Download = &batchAction{ + Href: fmt.Sprintf("%s/%s", baseHref, obj.Oid), + } + } + } else { + actions.Error = &batchError{ + Code: http.StatusNotFound, + Message: "Object does not exist", + } + } + + objects = append(objects, batchObject{ + Oid: obj.Oid, + Size: obj.Size, + Actions: actions, + }) + } + + default: + responseJSON(c.Resp, http.StatusBadRequest, responseError{ + Message: "Operation not recognized", + }) + return + } + + responseJSON(c.Resp, http.StatusOK, batchResponse{ + Transfer: transfer, + Objects: objects, + }) + } +} + +// batchRequest defines the request payload for the batch endpoint. +type batchRequest struct { + Operation string `json:"operation"` + Objects []struct { + Oid lfsx.OID `json:"oid"` + Size int64 `json:"size"` + } `json:"objects"` +} + +type batchError struct { + Code int `json:"code"` + Message string `json:"message"` +} + +type batchAction struct { + Href string `json:"href"` + Header map[string]string `json:"header,omitempty"` +} + +type batchActions struct { + Download *batchAction `json:"download,omitempty"` + Upload *batchAction `json:"upload,omitempty"` + Verify *batchAction `json:"verify,omitempty"` + Error *batchError `json:"error,omitempty"` +} + +type batchObject struct { + Oid lfsx.OID `json:"oid"` + Size int64 `json:"size"` + Actions batchActions `json:"actions"` +} + +// batchResponse defines the response payload for the batch endpoint. +type batchResponse struct { + Transfer string `json:"transfer"` + Objects []batchObject `json:"objects"` +} + +type responseError struct { + Message string `json:"message"` +} + +const contentType = "application/vnd.git-lfs+json" + +func responseJSON(w http.ResponseWriter, status int, v any) { + w.Header().Set("Content-Type", contentType) + w.WriteHeader(status) + + err := json.NewEncoder(w).Encode(v) + if err != nil { + log.Error("Failed to encode JSON: %v", err) + return + } +} diff --git a/internal/route/lfs/batch_test.go b/internal/route/lfs/batch_test.go new file mode 100644 index 00000000000..31cde46cb9a --- /dev/null +++ b/internal/route/lfs/batch_test.go @@ -0,0 +1,151 @@ +package lfs + +import ( + "bytes" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" +) + +func TestServeBatch(t *testing.T) { + conf.SetMockServer(t, conf.ServerOpts{ + ExternalURL: "https://gogs.example.com/", + }) + + tests := []struct { + name string + body string + mockStore func() *MockStore + expStatusCode int + expBody string + }{ + { + name: "unrecognized operation", + body: `{"operation": "update"}`, + expStatusCode: http.StatusBadRequest, + expBody: `{"message": "Operation not recognized"}` + "\n", + }, + { + name: "upload: contains invalid oid", + body: `{ +"operation": "upload", +"objects": [ + {"oid": "bad_oid", "size": 123}, + {"oid": "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", "size": 123} +]}`, + expStatusCode: http.StatusOK, + expBody: `{ + "transfer": "basic", + "objects": [ + {"oid": "bad_oid", "size":123, "actions": {"error": {"code": 422, "message": "Object has invalid oid"}}}, + { + "oid": "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", + "size": 123, + "actions": { + "upload": { + "href": "https://gogs.example.com/owner/repo.git/info/lfs/objects/basic/ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", + "header": {"Content-Type": "application/octet-stream"} + }, + "verify": { + "href": "https://gogs.example.com/owner/repo.git/info/lfs/objects/basic/verify" + } + } + } + ] +}` + "\n", + }, + { + name: "download: contains non-existent oid and mismatched size", + body: `{ +"operation": "download", +"objects": [ + {"oid": "bad_oid", "size": 123}, + {"oid": "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", "size": 123}, + {"oid": "5cac0a318669fadfee734fb340a5f5b70b428ac57a9f4b109cb6e150b2ba7e57", "size": 456} +]}`, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetLFSObjectsByOIDsFunc.SetDefaultReturn( + []*database.LFSObject{ + { + OID: "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", + Size: 1234, + }, { + OID: "5cac0a318669fadfee734fb340a5f5b70b428ac57a9f4b109cb6e150b2ba7e57", + Size: 456, + }, + }, + nil, + ) + return mockStore + }, + expStatusCode: http.StatusOK, + expBody: `{ + "transfer": "basic", + "objects": [ + {"oid": "bad_oid", "size": 123, "actions": {"error": {"code": 404, "message": "Object does not exist"}}}, + { + "oid": "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", + "size": 123, + "actions": {"error": {"code": 422, "message": "Object size mismatch"}} + }, + { + "oid": "5cac0a318669fadfee734fb340a5f5b70b428ac57a9f4b109cb6e150b2ba7e57", + "size": 456, + "actions": { + "download": { + "href": "https://gogs.example.com/owner/repo.git/info/lfs/objects/basic/5cac0a318669fadfee734fb340a5f5b70b428ac57a9f4b109cb6e150b2ba7e57" + } + } + } + ] +}` + "\n", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + mockStore := NewMockStore() + if test.mockStore != nil { + mockStore = test.mockStore() + } + + m := macaron.New() + m.Use(func(c *macaron.Context) { + c.Map(&database.User{Name: "owner"}) + c.Map(&database.Repository{Name: "repo"}) + }) + m.Post("/", serveBatch(mockStore)) + + r, err := http.NewRequest(http.MethodPost, "/", bytes.NewBufferString(test.body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + m.ServeHTTP(rr, r) + + resp := rr.Result() + assert.Equal(t, test.expStatusCode, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + + var expBody bytes.Buffer + err = json.Indent(&expBody, []byte(test.expBody), "", " ") + require.NoError(t, err) + + var gotBody bytes.Buffer + err = json.Indent(&gotBody, body, "", " ") + require.NoError(t, err) + + assert.Equal(t, expBody.String(), gotBody.String()) + }) + } +} diff --git a/internal/route/lfs/main_test.go b/internal/route/lfs/main_test.go new file mode 100644 index 00000000000..93996818851 --- /dev/null +++ b/internal/route/lfs/main_test.go @@ -0,0 +1,26 @@ +package lfs + +import ( + "flag" + "fmt" + "os" + "testing" + + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/testx" +) + +func TestMain(m *testing.M) { + flag.Parse() + if !testing.Verbose() { + // Remove the primary logger and register a noop logger. + log.Remove(log.DefaultConsoleName) + err := log.New("noop", testx.InitNoopLogger) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } + os.Exit(m.Run()) +} diff --git a/internal/route/lfs/mocks_test.go b/internal/route/lfs/mocks_test.go new file mode 100644 index 00000000000..c4f6f719005 --- /dev/null +++ b/internal/route/lfs/mocks_test.go @@ -0,0 +1,1564 @@ +// Code generated by go-mockgen 2.1.1; DO NOT EDIT. +// +// This file was generated by running `go-mockgen` at the root of this repository. +// To add additional mocks to this or another package, add a new entry to the +// mockgen.yaml file in the root of this repository. + +package lfs + +import ( + "context" + "sync" + + database "gogs.io/gogs/internal/database" + lfsx "gogs.io/gogs/internal/lfsx" +) + +// MockStore is a mock implementation of the Store interface (from the +// package gogs.io/gogs/internal/route/lfs) used for unit testing. +type MockStore struct { + // AuthenticateUserFunc is an instance of a mock function object + // controlling the behavior of the method AuthenticateUser. + AuthenticateUserFunc *StoreAuthenticateUserFunc + // AuthorizeRepositoryAccessFunc is an instance of a mock function + // object controlling the behavior of the method + // AuthorizeRepositoryAccess. + AuthorizeRepositoryAccessFunc *StoreAuthorizeRepositoryAccessFunc + // CreateLFSObjectFunc is an instance of a mock function object + // controlling the behavior of the method CreateLFSObject. + CreateLFSObjectFunc *StoreCreateLFSObjectFunc + // CreateUserFunc is an instance of a mock function object controlling + // the behavior of the method CreateUser. + CreateUserFunc *StoreCreateUserFunc + // GetAccessTokenBySHA1Func is an instance of a mock function object + // controlling the behavior of the method GetAccessTokenBySHA1. + GetAccessTokenBySHA1Func *StoreGetAccessTokenBySHA1Func + // GetLFSObjectByOIDFunc is an instance of a mock function object + // controlling the behavior of the method GetLFSObjectByOID. + GetLFSObjectByOIDFunc *StoreGetLFSObjectByOIDFunc + // GetLFSObjectsByOIDsFunc is an instance of a mock function object + // controlling the behavior of the method GetLFSObjectsByOIDs. + GetLFSObjectsByOIDsFunc *StoreGetLFSObjectsByOIDsFunc + // GetRepositoryByNameFunc is an instance of a mock function object + // controlling the behavior of the method GetRepositoryByName. + GetRepositoryByNameFunc *StoreGetRepositoryByNameFunc + // GetUserByIDFunc is an instance of a mock function object controlling + // the behavior of the method GetUserByID. + GetUserByIDFunc *StoreGetUserByIDFunc + // GetUserByUsernameFunc is an instance of a mock function object + // controlling the behavior of the method GetUserByUsername. + GetUserByUsernameFunc *StoreGetUserByUsernameFunc + // IsTwoFactorEnabledFunc is an instance of a mock function object + // controlling the behavior of the method IsTwoFactorEnabled. + IsTwoFactorEnabledFunc *StoreIsTwoFactorEnabledFunc + // TouchAccessTokenByIDFunc is an instance of a mock function object + // controlling the behavior of the method TouchAccessTokenByID. + TouchAccessTokenByIDFunc *StoreTouchAccessTokenByIDFunc +} + +// NewMockStore creates a new mock of the Store interface. All methods +// return zero values for all results, unless overwritten. +func NewMockStore() *MockStore { + return &MockStore{ + AuthenticateUserFunc: &StoreAuthenticateUserFunc{ + defaultHook: func(context.Context, string, string, int64) (r0 *database.User, r1 error) { + return + }, + }, + AuthorizeRepositoryAccessFunc: &StoreAuthorizeRepositoryAccessFunc{ + defaultHook: func(context.Context, int64, int64, database.AccessMode, database.AccessModeOptions) (r0 bool) { + return + }, + }, + CreateLFSObjectFunc: &StoreCreateLFSObjectFunc{ + defaultHook: func(context.Context, int64, lfsx.OID, int64, lfsx.Storage) (r0 error) { + return + }, + }, + CreateUserFunc: &StoreCreateUserFunc{ + defaultHook: func(context.Context, string, string, database.CreateUserOptions) (r0 *database.User, r1 error) { + return + }, + }, + GetAccessTokenBySHA1Func: &StoreGetAccessTokenBySHA1Func{ + defaultHook: func(context.Context, string) (r0 *database.AccessToken, r1 error) { + return + }, + }, + GetLFSObjectByOIDFunc: &StoreGetLFSObjectByOIDFunc{ + defaultHook: func(context.Context, int64, lfsx.OID) (r0 *database.LFSObject, r1 error) { + return + }, + }, + GetLFSObjectsByOIDsFunc: &StoreGetLFSObjectsByOIDsFunc{ + defaultHook: func(context.Context, int64, ...lfsx.OID) (r0 []*database.LFSObject, r1 error) { + return + }, + }, + GetRepositoryByNameFunc: &StoreGetRepositoryByNameFunc{ + defaultHook: func(context.Context, int64, string) (r0 *database.Repository, r1 error) { + return + }, + }, + GetUserByIDFunc: &StoreGetUserByIDFunc{ + defaultHook: func(context.Context, int64) (r0 *database.User, r1 error) { + return + }, + }, + GetUserByUsernameFunc: &StoreGetUserByUsernameFunc{ + defaultHook: func(context.Context, string) (r0 *database.User, r1 error) { + return + }, + }, + IsTwoFactorEnabledFunc: &StoreIsTwoFactorEnabledFunc{ + defaultHook: func(context.Context, int64) (r0 bool) { + return + }, + }, + TouchAccessTokenByIDFunc: &StoreTouchAccessTokenByIDFunc{ + defaultHook: func(context.Context, int64) (r0 error) { + return + }, + }, + } +} + +// NewStrictMockStore creates a new mock of the Store interface. All methods +// panic on invocation, unless overwritten. +func NewStrictMockStore() *MockStore { + return &MockStore{ + AuthenticateUserFunc: &StoreAuthenticateUserFunc{ + defaultHook: func(context.Context, string, string, int64) (*database.User, error) { + panic("unexpected invocation of MockStore.AuthenticateUser") + }, + }, + AuthorizeRepositoryAccessFunc: &StoreAuthorizeRepositoryAccessFunc{ + defaultHook: func(context.Context, int64, int64, database.AccessMode, database.AccessModeOptions) bool { + panic("unexpected invocation of MockStore.AuthorizeRepositoryAccess") + }, + }, + CreateLFSObjectFunc: &StoreCreateLFSObjectFunc{ + defaultHook: func(context.Context, int64, lfsx.OID, int64, lfsx.Storage) error { + panic("unexpected invocation of MockStore.CreateLFSObject") + }, + }, + CreateUserFunc: &StoreCreateUserFunc{ + defaultHook: func(context.Context, string, string, database.CreateUserOptions) (*database.User, error) { + panic("unexpected invocation of MockStore.CreateUser") + }, + }, + GetAccessTokenBySHA1Func: &StoreGetAccessTokenBySHA1Func{ + defaultHook: func(context.Context, string) (*database.AccessToken, error) { + panic("unexpected invocation of MockStore.GetAccessTokenBySHA1") + }, + }, + GetLFSObjectByOIDFunc: &StoreGetLFSObjectByOIDFunc{ + defaultHook: func(context.Context, int64, lfsx.OID) (*database.LFSObject, error) { + panic("unexpected invocation of MockStore.GetLFSObjectByOID") + }, + }, + GetLFSObjectsByOIDsFunc: &StoreGetLFSObjectsByOIDsFunc{ + defaultHook: func(context.Context, int64, ...lfsx.OID) ([]*database.LFSObject, error) { + panic("unexpected invocation of MockStore.GetLFSObjectsByOIDs") + }, + }, + GetRepositoryByNameFunc: &StoreGetRepositoryByNameFunc{ + defaultHook: func(context.Context, int64, string) (*database.Repository, error) { + panic("unexpected invocation of MockStore.GetRepositoryByName") + }, + }, + GetUserByIDFunc: &StoreGetUserByIDFunc{ + defaultHook: func(context.Context, int64) (*database.User, error) { + panic("unexpected invocation of MockStore.GetUserByID") + }, + }, + GetUserByUsernameFunc: &StoreGetUserByUsernameFunc{ + defaultHook: func(context.Context, string) (*database.User, error) { + panic("unexpected invocation of MockStore.GetUserByUsername") + }, + }, + IsTwoFactorEnabledFunc: &StoreIsTwoFactorEnabledFunc{ + defaultHook: func(context.Context, int64) bool { + panic("unexpected invocation of MockStore.IsTwoFactorEnabled") + }, + }, + TouchAccessTokenByIDFunc: &StoreTouchAccessTokenByIDFunc{ + defaultHook: func(context.Context, int64) error { + panic("unexpected invocation of MockStore.TouchAccessTokenByID") + }, + }, + } +} + +// NewMockStoreFrom creates a new mock of the MockStore interface. All +// methods delegate to the given implementation, unless overwritten. +func NewMockStoreFrom(i Store) *MockStore { + return &MockStore{ + AuthenticateUserFunc: &StoreAuthenticateUserFunc{ + defaultHook: i.AuthenticateUser, + }, + AuthorizeRepositoryAccessFunc: &StoreAuthorizeRepositoryAccessFunc{ + defaultHook: i.AuthorizeRepositoryAccess, + }, + CreateLFSObjectFunc: &StoreCreateLFSObjectFunc{ + defaultHook: i.CreateLFSObject, + }, + CreateUserFunc: &StoreCreateUserFunc{ + defaultHook: i.CreateUser, + }, + GetAccessTokenBySHA1Func: &StoreGetAccessTokenBySHA1Func{ + defaultHook: i.GetAccessTokenBySHA1, + }, + GetLFSObjectByOIDFunc: &StoreGetLFSObjectByOIDFunc{ + defaultHook: i.GetLFSObjectByOID, + }, + GetLFSObjectsByOIDsFunc: &StoreGetLFSObjectsByOIDsFunc{ + defaultHook: i.GetLFSObjectsByOIDs, + }, + GetRepositoryByNameFunc: &StoreGetRepositoryByNameFunc{ + defaultHook: i.GetRepositoryByName, + }, + GetUserByIDFunc: &StoreGetUserByIDFunc{ + defaultHook: i.GetUserByID, + }, + GetUserByUsernameFunc: &StoreGetUserByUsernameFunc{ + defaultHook: i.GetUserByUsername, + }, + IsTwoFactorEnabledFunc: &StoreIsTwoFactorEnabledFunc{ + defaultHook: i.IsTwoFactorEnabled, + }, + TouchAccessTokenByIDFunc: &StoreTouchAccessTokenByIDFunc{ + defaultHook: i.TouchAccessTokenByID, + }, + } +} + +// StoreAuthenticateUserFunc describes the behavior when the +// AuthenticateUser method of the parent MockStore instance is invoked. +type StoreAuthenticateUserFunc struct { + defaultHook func(context.Context, string, string, int64) (*database.User, error) + hooks []func(context.Context, string, string, int64) (*database.User, error) + history []StoreAuthenticateUserFuncCall + mutex sync.Mutex +} + +// AuthenticateUser delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockStore) AuthenticateUser(v0 context.Context, v1 string, v2 string, v3 int64) (*database.User, error) { + r0, r1 := m.AuthenticateUserFunc.nextHook()(v0, v1, v2, v3) + m.AuthenticateUserFunc.appendCall(StoreAuthenticateUserFuncCall{v0, v1, v2, v3, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the AuthenticateUser +// method of the parent MockStore instance is invoked and the hook queue is +// empty. +func (f *StoreAuthenticateUserFunc) SetDefaultHook(hook func(context.Context, string, string, int64) (*database.User, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// AuthenticateUser method of the parent MockStore instance invokes the hook +// at the front of the queue and discards it. After the queue is empty, the +// default hook function is invoked for any future action. +func (f *StoreAuthenticateUserFunc) PushHook(hook func(context.Context, string, string, int64) (*database.User, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreAuthenticateUserFunc) SetDefaultReturn(r0 *database.User, r1 error) { + f.SetDefaultHook(func(context.Context, string, string, int64) (*database.User, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreAuthenticateUserFunc) PushReturn(r0 *database.User, r1 error) { + f.PushHook(func(context.Context, string, string, int64) (*database.User, error) { + return r0, r1 + }) +} + +func (f *StoreAuthenticateUserFunc) nextHook() func(context.Context, string, string, int64) (*database.User, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreAuthenticateUserFunc) appendCall(r0 StoreAuthenticateUserFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreAuthenticateUserFuncCall objects +// describing the invocations of this function. +func (f *StoreAuthenticateUserFunc) History() []StoreAuthenticateUserFuncCall { + f.mutex.Lock() + history := make([]StoreAuthenticateUserFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreAuthenticateUserFuncCall is an object that describes an invocation +// of method AuthenticateUser on an instance of MockStore. +type StoreAuthenticateUserFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 string + // Arg2 is the value of the 3rd argument passed to this method + // invocation. + Arg2 string + // Arg3 is the value of the 4th argument passed to this method + // invocation. + Arg3 int64 + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *database.User + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreAuthenticateUserFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1, c.Arg2, c.Arg3} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreAuthenticateUserFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// StoreAuthorizeRepositoryAccessFunc describes the behavior when the +// AuthorizeRepositoryAccess method of the parent MockStore instance is +// invoked. +type StoreAuthorizeRepositoryAccessFunc struct { + defaultHook func(context.Context, int64, int64, database.AccessMode, database.AccessModeOptions) bool + hooks []func(context.Context, int64, int64, database.AccessMode, database.AccessModeOptions) bool + history []StoreAuthorizeRepositoryAccessFuncCall + mutex sync.Mutex +} + +// AuthorizeRepositoryAccess delegates to the next hook function in the +// queue and stores the parameter and result values of this invocation. +func (m *MockStore) AuthorizeRepositoryAccess(v0 context.Context, v1 int64, v2 int64, v3 database.AccessMode, v4 database.AccessModeOptions) bool { + r0 := m.AuthorizeRepositoryAccessFunc.nextHook()(v0, v1, v2, v3, v4) + m.AuthorizeRepositoryAccessFunc.appendCall(StoreAuthorizeRepositoryAccessFuncCall{v0, v1, v2, v3, v4, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the +// AuthorizeRepositoryAccess method of the parent MockStore instance is +// invoked and the hook queue is empty. +func (f *StoreAuthorizeRepositoryAccessFunc) SetDefaultHook(hook func(context.Context, int64, int64, database.AccessMode, database.AccessModeOptions) bool) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// AuthorizeRepositoryAccess method of the parent MockStore instance invokes +// the hook at the front of the queue and discards it. After the queue is +// empty, the default hook function is invoked for any future action. +func (f *StoreAuthorizeRepositoryAccessFunc) PushHook(hook func(context.Context, int64, int64, database.AccessMode, database.AccessModeOptions) bool) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreAuthorizeRepositoryAccessFunc) SetDefaultReturn(r0 bool) { + f.SetDefaultHook(func(context.Context, int64, int64, database.AccessMode, database.AccessModeOptions) bool { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreAuthorizeRepositoryAccessFunc) PushReturn(r0 bool) { + f.PushHook(func(context.Context, int64, int64, database.AccessMode, database.AccessModeOptions) bool { + return r0 + }) +} + +func (f *StoreAuthorizeRepositoryAccessFunc) nextHook() func(context.Context, int64, int64, database.AccessMode, database.AccessModeOptions) bool { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreAuthorizeRepositoryAccessFunc) appendCall(r0 StoreAuthorizeRepositoryAccessFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreAuthorizeRepositoryAccessFuncCall +// objects describing the invocations of this function. +func (f *StoreAuthorizeRepositoryAccessFunc) History() []StoreAuthorizeRepositoryAccessFuncCall { + f.mutex.Lock() + history := make([]StoreAuthorizeRepositoryAccessFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreAuthorizeRepositoryAccessFuncCall is an object that describes an +// invocation of method AuthorizeRepositoryAccess on an instance of +// MockStore. +type StoreAuthorizeRepositoryAccessFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Arg2 is the value of the 3rd argument passed to this method + // invocation. + Arg2 int64 + // Arg3 is the value of the 4th argument passed to this method + // invocation. + Arg3 database.AccessMode + // Arg4 is the value of the 5th argument passed to this method + // invocation. + Arg4 database.AccessModeOptions + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 bool +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreAuthorizeRepositoryAccessFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1, c.Arg2, c.Arg3, c.Arg4} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreAuthorizeRepositoryAccessFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// StoreCreateLFSObjectFunc describes the behavior when the CreateLFSObject +// method of the parent MockStore instance is invoked. +type StoreCreateLFSObjectFunc struct { + defaultHook func(context.Context, int64, lfsx.OID, int64, lfsx.Storage) error + hooks []func(context.Context, int64, lfsx.OID, int64, lfsx.Storage) error + history []StoreCreateLFSObjectFuncCall + mutex sync.Mutex +} + +// CreateLFSObject delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockStore) CreateLFSObject(v0 context.Context, v1 int64, v2 lfsx.OID, v3 int64, v4 lfsx.Storage) error { + r0 := m.CreateLFSObjectFunc.nextHook()(v0, v1, v2, v3, v4) + m.CreateLFSObjectFunc.appendCall(StoreCreateLFSObjectFuncCall{v0, v1, v2, v3, v4, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the CreateLFSObject +// method of the parent MockStore instance is invoked and the hook queue is +// empty. +func (f *StoreCreateLFSObjectFunc) SetDefaultHook(hook func(context.Context, int64, lfsx.OID, int64, lfsx.Storage) error) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// CreateLFSObject method of the parent MockStore instance invokes the hook +// at the front of the queue and discards it. After the queue is empty, the +// default hook function is invoked for any future action. +func (f *StoreCreateLFSObjectFunc) PushHook(hook func(context.Context, int64, lfsx.OID, int64, lfsx.Storage) error) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreCreateLFSObjectFunc) SetDefaultReturn(r0 error) { + f.SetDefaultHook(func(context.Context, int64, lfsx.OID, int64, lfsx.Storage) error { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreCreateLFSObjectFunc) PushReturn(r0 error) { + f.PushHook(func(context.Context, int64, lfsx.OID, int64, lfsx.Storage) error { + return r0 + }) +} + +func (f *StoreCreateLFSObjectFunc) nextHook() func(context.Context, int64, lfsx.OID, int64, lfsx.Storage) error { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreCreateLFSObjectFunc) appendCall(r0 StoreCreateLFSObjectFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreCreateLFSObjectFuncCall objects +// describing the invocations of this function. +func (f *StoreCreateLFSObjectFunc) History() []StoreCreateLFSObjectFuncCall { + f.mutex.Lock() + history := make([]StoreCreateLFSObjectFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreCreateLFSObjectFuncCall is an object that describes an invocation of +// method CreateLFSObject on an instance of MockStore. +type StoreCreateLFSObjectFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Arg2 is the value of the 3rd argument passed to this method + // invocation. + Arg2 lfsx.OID + // Arg3 is the value of the 4th argument passed to this method + // invocation. + Arg3 int64 + // Arg4 is the value of the 5th argument passed to this method + // invocation. + Arg4 lfsx.Storage + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreCreateLFSObjectFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1, c.Arg2, c.Arg3, c.Arg4} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreCreateLFSObjectFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// StoreCreateUserFunc describes the behavior when the CreateUser method of +// the parent MockStore instance is invoked. +type StoreCreateUserFunc struct { + defaultHook func(context.Context, string, string, database.CreateUserOptions) (*database.User, error) + hooks []func(context.Context, string, string, database.CreateUserOptions) (*database.User, error) + history []StoreCreateUserFuncCall + mutex sync.Mutex +} + +// CreateUser delegates to the next hook function in the queue and stores +// the parameter and result values of this invocation. +func (m *MockStore) CreateUser(v0 context.Context, v1 string, v2 string, v3 database.CreateUserOptions) (*database.User, error) { + r0, r1 := m.CreateUserFunc.nextHook()(v0, v1, v2, v3) + m.CreateUserFunc.appendCall(StoreCreateUserFuncCall{v0, v1, v2, v3, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the CreateUser method of +// the parent MockStore instance is invoked and the hook queue is empty. +func (f *StoreCreateUserFunc) SetDefaultHook(hook func(context.Context, string, string, database.CreateUserOptions) (*database.User, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// CreateUser method of the parent MockStore instance invokes the hook at +// the front of the queue and discards it. After the queue is empty, the +// default hook function is invoked for any future action. +func (f *StoreCreateUserFunc) PushHook(hook func(context.Context, string, string, database.CreateUserOptions) (*database.User, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreCreateUserFunc) SetDefaultReturn(r0 *database.User, r1 error) { + f.SetDefaultHook(func(context.Context, string, string, database.CreateUserOptions) (*database.User, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreCreateUserFunc) PushReturn(r0 *database.User, r1 error) { + f.PushHook(func(context.Context, string, string, database.CreateUserOptions) (*database.User, error) { + return r0, r1 + }) +} + +func (f *StoreCreateUserFunc) nextHook() func(context.Context, string, string, database.CreateUserOptions) (*database.User, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreCreateUserFunc) appendCall(r0 StoreCreateUserFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreCreateUserFuncCall objects describing +// the invocations of this function. +func (f *StoreCreateUserFunc) History() []StoreCreateUserFuncCall { + f.mutex.Lock() + history := make([]StoreCreateUserFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreCreateUserFuncCall is an object that describes an invocation of +// method CreateUser on an instance of MockStore. +type StoreCreateUserFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 string + // Arg2 is the value of the 3rd argument passed to this method + // invocation. + Arg2 string + // Arg3 is the value of the 4th argument passed to this method + // invocation. + Arg3 database.CreateUserOptions + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *database.User + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreCreateUserFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1, c.Arg2, c.Arg3} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreCreateUserFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// StoreGetAccessTokenBySHA1Func describes the behavior when the +// GetAccessTokenBySHA1 method of the parent MockStore instance is invoked. +type StoreGetAccessTokenBySHA1Func struct { + defaultHook func(context.Context, string) (*database.AccessToken, error) + hooks []func(context.Context, string) (*database.AccessToken, error) + history []StoreGetAccessTokenBySHA1FuncCall + mutex sync.Mutex +} + +// GetAccessTokenBySHA1 delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockStore) GetAccessTokenBySHA1(v0 context.Context, v1 string) (*database.AccessToken, error) { + r0, r1 := m.GetAccessTokenBySHA1Func.nextHook()(v0, v1) + m.GetAccessTokenBySHA1Func.appendCall(StoreGetAccessTokenBySHA1FuncCall{v0, v1, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the GetAccessTokenBySHA1 +// method of the parent MockStore instance is invoked and the hook queue is +// empty. +func (f *StoreGetAccessTokenBySHA1Func) SetDefaultHook(hook func(context.Context, string) (*database.AccessToken, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// GetAccessTokenBySHA1 method of the parent MockStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *StoreGetAccessTokenBySHA1Func) PushHook(hook func(context.Context, string) (*database.AccessToken, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreGetAccessTokenBySHA1Func) SetDefaultReturn(r0 *database.AccessToken, r1 error) { + f.SetDefaultHook(func(context.Context, string) (*database.AccessToken, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreGetAccessTokenBySHA1Func) PushReturn(r0 *database.AccessToken, r1 error) { + f.PushHook(func(context.Context, string) (*database.AccessToken, error) { + return r0, r1 + }) +} + +func (f *StoreGetAccessTokenBySHA1Func) nextHook() func(context.Context, string) (*database.AccessToken, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreGetAccessTokenBySHA1Func) appendCall(r0 StoreGetAccessTokenBySHA1FuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreGetAccessTokenBySHA1FuncCall objects +// describing the invocations of this function. +func (f *StoreGetAccessTokenBySHA1Func) History() []StoreGetAccessTokenBySHA1FuncCall { + f.mutex.Lock() + history := make([]StoreGetAccessTokenBySHA1FuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreGetAccessTokenBySHA1FuncCall is an object that describes an +// invocation of method GetAccessTokenBySHA1 on an instance of MockStore. +type StoreGetAccessTokenBySHA1FuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 string + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *database.AccessToken + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreGetAccessTokenBySHA1FuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreGetAccessTokenBySHA1FuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// StoreGetLFSObjectByOIDFunc describes the behavior when the +// GetLFSObjectByOID method of the parent MockStore instance is invoked. +type StoreGetLFSObjectByOIDFunc struct { + defaultHook func(context.Context, int64, lfsx.OID) (*database.LFSObject, error) + hooks []func(context.Context, int64, lfsx.OID) (*database.LFSObject, error) + history []StoreGetLFSObjectByOIDFuncCall + mutex sync.Mutex +} + +// GetLFSObjectByOID delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockStore) GetLFSObjectByOID(v0 context.Context, v1 int64, v2 lfsx.OID) (*database.LFSObject, error) { + r0, r1 := m.GetLFSObjectByOIDFunc.nextHook()(v0, v1, v2) + m.GetLFSObjectByOIDFunc.appendCall(StoreGetLFSObjectByOIDFuncCall{v0, v1, v2, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the GetLFSObjectByOID +// method of the parent MockStore instance is invoked and the hook queue is +// empty. +func (f *StoreGetLFSObjectByOIDFunc) SetDefaultHook(hook func(context.Context, int64, lfsx.OID) (*database.LFSObject, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// GetLFSObjectByOID method of the parent MockStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *StoreGetLFSObjectByOIDFunc) PushHook(hook func(context.Context, int64, lfsx.OID) (*database.LFSObject, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreGetLFSObjectByOIDFunc) SetDefaultReturn(r0 *database.LFSObject, r1 error) { + f.SetDefaultHook(func(context.Context, int64, lfsx.OID) (*database.LFSObject, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreGetLFSObjectByOIDFunc) PushReturn(r0 *database.LFSObject, r1 error) { + f.PushHook(func(context.Context, int64, lfsx.OID) (*database.LFSObject, error) { + return r0, r1 + }) +} + +func (f *StoreGetLFSObjectByOIDFunc) nextHook() func(context.Context, int64, lfsx.OID) (*database.LFSObject, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreGetLFSObjectByOIDFunc) appendCall(r0 StoreGetLFSObjectByOIDFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreGetLFSObjectByOIDFuncCall objects +// describing the invocations of this function. +func (f *StoreGetLFSObjectByOIDFunc) History() []StoreGetLFSObjectByOIDFuncCall { + f.mutex.Lock() + history := make([]StoreGetLFSObjectByOIDFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreGetLFSObjectByOIDFuncCall is an object that describes an invocation +// of method GetLFSObjectByOID on an instance of MockStore. +type StoreGetLFSObjectByOIDFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Arg2 is the value of the 3rd argument passed to this method + // invocation. + Arg2 lfsx.OID + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *database.LFSObject + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreGetLFSObjectByOIDFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1, c.Arg2} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreGetLFSObjectByOIDFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// StoreGetLFSObjectsByOIDsFunc describes the behavior when the +// GetLFSObjectsByOIDs method of the parent MockStore instance is invoked. +type StoreGetLFSObjectsByOIDsFunc struct { + defaultHook func(context.Context, int64, ...lfsx.OID) ([]*database.LFSObject, error) + hooks []func(context.Context, int64, ...lfsx.OID) ([]*database.LFSObject, error) + history []StoreGetLFSObjectsByOIDsFuncCall + mutex sync.Mutex +} + +// GetLFSObjectsByOIDs delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockStore) GetLFSObjectsByOIDs(v0 context.Context, v1 int64, v2 ...lfsx.OID) ([]*database.LFSObject, error) { + r0, r1 := m.GetLFSObjectsByOIDsFunc.nextHook()(v0, v1, v2...) + m.GetLFSObjectsByOIDsFunc.appendCall(StoreGetLFSObjectsByOIDsFuncCall{v0, v1, v2, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the GetLFSObjectsByOIDs +// method of the parent MockStore instance is invoked and the hook queue is +// empty. +func (f *StoreGetLFSObjectsByOIDsFunc) SetDefaultHook(hook func(context.Context, int64, ...lfsx.OID) ([]*database.LFSObject, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// GetLFSObjectsByOIDs method of the parent MockStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *StoreGetLFSObjectsByOIDsFunc) PushHook(hook func(context.Context, int64, ...lfsx.OID) ([]*database.LFSObject, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreGetLFSObjectsByOIDsFunc) SetDefaultReturn(r0 []*database.LFSObject, r1 error) { + f.SetDefaultHook(func(context.Context, int64, ...lfsx.OID) ([]*database.LFSObject, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreGetLFSObjectsByOIDsFunc) PushReturn(r0 []*database.LFSObject, r1 error) { + f.PushHook(func(context.Context, int64, ...lfsx.OID) ([]*database.LFSObject, error) { + return r0, r1 + }) +} + +func (f *StoreGetLFSObjectsByOIDsFunc) nextHook() func(context.Context, int64, ...lfsx.OID) ([]*database.LFSObject, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreGetLFSObjectsByOIDsFunc) appendCall(r0 StoreGetLFSObjectsByOIDsFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreGetLFSObjectsByOIDsFuncCall objects +// describing the invocations of this function. +func (f *StoreGetLFSObjectsByOIDsFunc) History() []StoreGetLFSObjectsByOIDsFuncCall { + f.mutex.Lock() + history := make([]StoreGetLFSObjectsByOIDsFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreGetLFSObjectsByOIDsFuncCall is an object that describes an +// invocation of method GetLFSObjectsByOIDs on an instance of MockStore. +type StoreGetLFSObjectsByOIDsFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Arg2 is a slice containing the values of the variadic arguments + // passed to this method invocation. + Arg2 []lfsx.OID + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 []*database.LFSObject + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. The variadic slice argument is flattened in this array such +// that one positional argument and three variadic arguments would result in +// a slice of four, not two. +func (c StoreGetLFSObjectsByOIDsFuncCall) Args() []interface{} { + trailing := []interface{}{} + for _, val := range c.Arg2 { + trailing = append(trailing, val) + } + + return append([]interface{}{c.Arg0, c.Arg1}, trailing...) +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreGetLFSObjectsByOIDsFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// StoreGetRepositoryByNameFunc describes the behavior when the +// GetRepositoryByName method of the parent MockStore instance is invoked. +type StoreGetRepositoryByNameFunc struct { + defaultHook func(context.Context, int64, string) (*database.Repository, error) + hooks []func(context.Context, int64, string) (*database.Repository, error) + history []StoreGetRepositoryByNameFuncCall + mutex sync.Mutex +} + +// GetRepositoryByName delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockStore) GetRepositoryByName(v0 context.Context, v1 int64, v2 string) (*database.Repository, error) { + r0, r1 := m.GetRepositoryByNameFunc.nextHook()(v0, v1, v2) + m.GetRepositoryByNameFunc.appendCall(StoreGetRepositoryByNameFuncCall{v0, v1, v2, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the GetRepositoryByName +// method of the parent MockStore instance is invoked and the hook queue is +// empty. +func (f *StoreGetRepositoryByNameFunc) SetDefaultHook(hook func(context.Context, int64, string) (*database.Repository, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// GetRepositoryByName method of the parent MockStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *StoreGetRepositoryByNameFunc) PushHook(hook func(context.Context, int64, string) (*database.Repository, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreGetRepositoryByNameFunc) SetDefaultReturn(r0 *database.Repository, r1 error) { + f.SetDefaultHook(func(context.Context, int64, string) (*database.Repository, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreGetRepositoryByNameFunc) PushReturn(r0 *database.Repository, r1 error) { + f.PushHook(func(context.Context, int64, string) (*database.Repository, error) { + return r0, r1 + }) +} + +func (f *StoreGetRepositoryByNameFunc) nextHook() func(context.Context, int64, string) (*database.Repository, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreGetRepositoryByNameFunc) appendCall(r0 StoreGetRepositoryByNameFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreGetRepositoryByNameFuncCall objects +// describing the invocations of this function. +func (f *StoreGetRepositoryByNameFunc) History() []StoreGetRepositoryByNameFuncCall { + f.mutex.Lock() + history := make([]StoreGetRepositoryByNameFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreGetRepositoryByNameFuncCall is an object that describes an +// invocation of method GetRepositoryByName on an instance of MockStore. +type StoreGetRepositoryByNameFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Arg2 is the value of the 3rd argument passed to this method + // invocation. + Arg2 string + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *database.Repository + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreGetRepositoryByNameFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1, c.Arg2} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreGetRepositoryByNameFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// StoreGetUserByIDFunc describes the behavior when the GetUserByID method +// of the parent MockStore instance is invoked. +type StoreGetUserByIDFunc struct { + defaultHook func(context.Context, int64) (*database.User, error) + hooks []func(context.Context, int64) (*database.User, error) + history []StoreGetUserByIDFuncCall + mutex sync.Mutex +} + +// GetUserByID delegates to the next hook function in the queue and stores +// the parameter and result values of this invocation. +func (m *MockStore) GetUserByID(v0 context.Context, v1 int64) (*database.User, error) { + r0, r1 := m.GetUserByIDFunc.nextHook()(v0, v1) + m.GetUserByIDFunc.appendCall(StoreGetUserByIDFuncCall{v0, v1, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the GetUserByID method +// of the parent MockStore instance is invoked and the hook queue is empty. +func (f *StoreGetUserByIDFunc) SetDefaultHook(hook func(context.Context, int64) (*database.User, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// GetUserByID method of the parent MockStore instance invokes the hook at +// the front of the queue and discards it. After the queue is empty, the +// default hook function is invoked for any future action. +func (f *StoreGetUserByIDFunc) PushHook(hook func(context.Context, int64) (*database.User, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreGetUserByIDFunc) SetDefaultReturn(r0 *database.User, r1 error) { + f.SetDefaultHook(func(context.Context, int64) (*database.User, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreGetUserByIDFunc) PushReturn(r0 *database.User, r1 error) { + f.PushHook(func(context.Context, int64) (*database.User, error) { + return r0, r1 + }) +} + +func (f *StoreGetUserByIDFunc) nextHook() func(context.Context, int64) (*database.User, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreGetUserByIDFunc) appendCall(r0 StoreGetUserByIDFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreGetUserByIDFuncCall objects describing +// the invocations of this function. +func (f *StoreGetUserByIDFunc) History() []StoreGetUserByIDFuncCall { + f.mutex.Lock() + history := make([]StoreGetUserByIDFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreGetUserByIDFuncCall is an object that describes an invocation of +// method GetUserByID on an instance of MockStore. +type StoreGetUserByIDFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *database.User + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreGetUserByIDFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreGetUserByIDFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// StoreGetUserByUsernameFunc describes the behavior when the +// GetUserByUsername method of the parent MockStore instance is invoked. +type StoreGetUserByUsernameFunc struct { + defaultHook func(context.Context, string) (*database.User, error) + hooks []func(context.Context, string) (*database.User, error) + history []StoreGetUserByUsernameFuncCall + mutex sync.Mutex +} + +// GetUserByUsername delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockStore) GetUserByUsername(v0 context.Context, v1 string) (*database.User, error) { + r0, r1 := m.GetUserByUsernameFunc.nextHook()(v0, v1) + m.GetUserByUsernameFunc.appendCall(StoreGetUserByUsernameFuncCall{v0, v1, r0, r1}) + return r0, r1 +} + +// SetDefaultHook sets function that is called when the GetUserByUsername +// method of the parent MockStore instance is invoked and the hook queue is +// empty. +func (f *StoreGetUserByUsernameFunc) SetDefaultHook(hook func(context.Context, string) (*database.User, error)) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// GetUserByUsername method of the parent MockStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *StoreGetUserByUsernameFunc) PushHook(hook func(context.Context, string) (*database.User, error)) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreGetUserByUsernameFunc) SetDefaultReturn(r0 *database.User, r1 error) { + f.SetDefaultHook(func(context.Context, string) (*database.User, error) { + return r0, r1 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreGetUserByUsernameFunc) PushReturn(r0 *database.User, r1 error) { + f.PushHook(func(context.Context, string) (*database.User, error) { + return r0, r1 + }) +} + +func (f *StoreGetUserByUsernameFunc) nextHook() func(context.Context, string) (*database.User, error) { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreGetUserByUsernameFunc) appendCall(r0 StoreGetUserByUsernameFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreGetUserByUsernameFuncCall objects +// describing the invocations of this function. +func (f *StoreGetUserByUsernameFunc) History() []StoreGetUserByUsernameFuncCall { + f.mutex.Lock() + history := make([]StoreGetUserByUsernameFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreGetUserByUsernameFuncCall is an object that describes an invocation +// of method GetUserByUsername on an instance of MockStore. +type StoreGetUserByUsernameFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 string + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 *database.User + // Result1 is the value of the 2nd result returned from this method + // invocation. + Result1 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreGetUserByUsernameFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreGetUserByUsernameFuncCall) Results() []interface{} { + return []interface{}{c.Result0, c.Result1} +} + +// StoreIsTwoFactorEnabledFunc describes the behavior when the +// IsTwoFactorEnabled method of the parent MockStore instance is invoked. +type StoreIsTwoFactorEnabledFunc struct { + defaultHook func(context.Context, int64) bool + hooks []func(context.Context, int64) bool + history []StoreIsTwoFactorEnabledFuncCall + mutex sync.Mutex +} + +// IsTwoFactorEnabled delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockStore) IsTwoFactorEnabled(v0 context.Context, v1 int64) bool { + r0 := m.IsTwoFactorEnabledFunc.nextHook()(v0, v1) + m.IsTwoFactorEnabledFunc.appendCall(StoreIsTwoFactorEnabledFuncCall{v0, v1, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the IsTwoFactorEnabled +// method of the parent MockStore instance is invoked and the hook queue is +// empty. +func (f *StoreIsTwoFactorEnabledFunc) SetDefaultHook(hook func(context.Context, int64) bool) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// IsTwoFactorEnabled method of the parent MockStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *StoreIsTwoFactorEnabledFunc) PushHook(hook func(context.Context, int64) bool) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreIsTwoFactorEnabledFunc) SetDefaultReturn(r0 bool) { + f.SetDefaultHook(func(context.Context, int64) bool { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreIsTwoFactorEnabledFunc) PushReturn(r0 bool) { + f.PushHook(func(context.Context, int64) bool { + return r0 + }) +} + +func (f *StoreIsTwoFactorEnabledFunc) nextHook() func(context.Context, int64) bool { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreIsTwoFactorEnabledFunc) appendCall(r0 StoreIsTwoFactorEnabledFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreIsTwoFactorEnabledFuncCall objects +// describing the invocations of this function. +func (f *StoreIsTwoFactorEnabledFunc) History() []StoreIsTwoFactorEnabledFuncCall { + f.mutex.Lock() + history := make([]StoreIsTwoFactorEnabledFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreIsTwoFactorEnabledFuncCall is an object that describes an invocation +// of method IsTwoFactorEnabled on an instance of MockStore. +type StoreIsTwoFactorEnabledFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 bool +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreIsTwoFactorEnabledFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreIsTwoFactorEnabledFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} + +// StoreTouchAccessTokenByIDFunc describes the behavior when the +// TouchAccessTokenByID method of the parent MockStore instance is invoked. +type StoreTouchAccessTokenByIDFunc struct { + defaultHook func(context.Context, int64) error + hooks []func(context.Context, int64) error + history []StoreTouchAccessTokenByIDFuncCall + mutex sync.Mutex +} + +// TouchAccessTokenByID delegates to the next hook function in the queue and +// stores the parameter and result values of this invocation. +func (m *MockStore) TouchAccessTokenByID(v0 context.Context, v1 int64) error { + r0 := m.TouchAccessTokenByIDFunc.nextHook()(v0, v1) + m.TouchAccessTokenByIDFunc.appendCall(StoreTouchAccessTokenByIDFuncCall{v0, v1, r0}) + return r0 +} + +// SetDefaultHook sets function that is called when the TouchAccessTokenByID +// method of the parent MockStore instance is invoked and the hook queue is +// empty. +func (f *StoreTouchAccessTokenByIDFunc) SetDefaultHook(hook func(context.Context, int64) error) { + f.defaultHook = hook +} + +// PushHook adds a function to the end of hook queue. Each invocation of the +// TouchAccessTokenByID method of the parent MockStore instance invokes the +// hook at the front of the queue and discards it. After the queue is empty, +// the default hook function is invoked for any future action. +func (f *StoreTouchAccessTokenByIDFunc) PushHook(hook func(context.Context, int64) error) { + f.mutex.Lock() + f.hooks = append(f.hooks, hook) + f.mutex.Unlock() +} + +// SetDefaultReturn calls SetDefaultHook with a function that returns the +// given values. +func (f *StoreTouchAccessTokenByIDFunc) SetDefaultReturn(r0 error) { + f.SetDefaultHook(func(context.Context, int64) error { + return r0 + }) +} + +// PushReturn calls PushHook with a function that returns the given values. +func (f *StoreTouchAccessTokenByIDFunc) PushReturn(r0 error) { + f.PushHook(func(context.Context, int64) error { + return r0 + }) +} + +func (f *StoreTouchAccessTokenByIDFunc) nextHook() func(context.Context, int64) error { + f.mutex.Lock() + defer f.mutex.Unlock() + + if len(f.hooks) == 0 { + return f.defaultHook + } + + hook := f.hooks[0] + f.hooks = f.hooks[1:] + return hook +} + +func (f *StoreTouchAccessTokenByIDFunc) appendCall(r0 StoreTouchAccessTokenByIDFuncCall) { + f.mutex.Lock() + f.history = append(f.history, r0) + f.mutex.Unlock() +} + +// History returns a sequence of StoreTouchAccessTokenByIDFuncCall objects +// describing the invocations of this function. +func (f *StoreTouchAccessTokenByIDFunc) History() []StoreTouchAccessTokenByIDFuncCall { + f.mutex.Lock() + history := make([]StoreTouchAccessTokenByIDFuncCall, len(f.history)) + copy(history, f.history) + f.mutex.Unlock() + + return history +} + +// StoreTouchAccessTokenByIDFuncCall is an object that describes an +// invocation of method TouchAccessTokenByID on an instance of MockStore. +type StoreTouchAccessTokenByIDFuncCall struct { + // Arg0 is the value of the 1st argument passed to this method + // invocation. + Arg0 context.Context + // Arg1 is the value of the 2nd argument passed to this method + // invocation. + Arg1 int64 + // Result0 is the value of the 1st result returned from this method + // invocation. + Result0 error +} + +// Args returns an interface slice containing the arguments of this +// invocation. +func (c StoreTouchAccessTokenByIDFuncCall) Args() []interface{} { + return []interface{}{c.Arg0, c.Arg1} +} + +// Results returns an interface slice containing the results of this +// invocation. +func (c StoreTouchAccessTokenByIDFuncCall) Results() []interface{} { + return []interface{}{c.Result0} +} diff --git a/internal/route/lfs/route.go b/internal/route/lfs/route.go new file mode 100644 index 00000000000..b885ba4454a --- /dev/null +++ b/internal/route/lfs/route.go @@ -0,0 +1,182 @@ +package lfs + +import ( + "net/http" + "strings" + + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/authx" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/lfsx" +) + +// RegisterRoutes registers LFS routes using given router, and inherits all +// groups and middleware. +func RegisterRoutes(r *macaron.Router) { + verifyAccept := verifyHeader("Accept", contentType, http.StatusNotAcceptable) + verifyContentTypeJSON := verifyHeader("Content-Type", contentType, http.StatusBadRequest) + verifyContentTypeStream := verifyHeader("Content-Type", "application/octet-stream", http.StatusBadRequest) + + store := NewStore() + r.Group("", func() { + r.Post("/objects/batch", authorize(store, database.AccessModeRead), verifyAccept, verifyContentTypeJSON, serveBatch(store)) + r.Group("/objects/basic", func() { + basic := &basicHandler{ + store: store, + defaultStorage: lfsx.Storage(conf.LFS.Storage), + storagers: map[lfsx.Storage]lfsx.Storager{ + lfsx.StorageLocal: &lfsx.LocalStorage{Root: conf.LFS.ObjectsPath, TempDir: conf.LFS.ObjectsTempPath}, + }, + } + r.Combo("/:oid", verifyOID()). + Get(authorize(store, database.AccessModeRead), basic.serveDownload). + Put(authorize(store, database.AccessModeWrite), verifyContentTypeStream, basic.serveUpload) + r.Post("/verify", authorize(store, database.AccessModeWrite), verifyAccept, verifyContentTypeJSON, basic.serveVerify) + }) + }, authenticate(store)) +} + +// authenticate tries to authenticate user via HTTP Basic Auth. It first tries to authenticate +// as plain username and password, then use username as access token if previous step failed. +func authenticate(store Store) macaron.Handler { + askCredentials := func(w http.ResponseWriter) { + w.Header().Set("Lfs-Authenticate", `Basic realm="Git LFS"`) + responseJSON(w, http.StatusUnauthorized, responseError{ + Message: "Credentials needed", + }) + } + + return func(c *macaron.Context) { + username, password := authx.DecodeBasic(c.Req.Header) + if username == "" { + askCredentials(c.Resp) + return + } + + user, err := store.AuthenticateUser(c.Req.Context(), username, password, -1) + if err != nil && !auth.IsErrBadCredentials(err) { + internalServerError(c.Resp) + log.Error("Failed to authenticate user [name: %s]: %v", username, err) + return + } + + if err == nil && store.IsTwoFactorEnabled(c.Req.Context(), user.ID) { + c.Error(http.StatusBadRequest, "Users with 2FA enabled are not allowed to authenticate via username and password.") + return + } + + // If username and password combination failed, try again using either username + // or password as the token. + if auth.IsErrBadCredentials(err) { + user, err = context.AuthenticateByToken(store, c.Req.Context(), username) + if err != nil && !database.IsErrAccessTokenNotExist(err) { + internalServerError(c.Resp) + log.Error("Failed to authenticate by access token via username: %v", err) + return + } else if database.IsErrAccessTokenNotExist(err) { + // Try again using the password field as the token. + user, err = context.AuthenticateByToken(store, c.Req.Context(), password) + if err != nil { + if database.IsErrAccessTokenNotExist(err) { + askCredentials(c.Resp) + } else { + c.Status(http.StatusInternalServerError) + log.Error("Failed to authenticate by access token via password: %v", err) + } + return + } + } + } + + log.Trace("[LFS] Authenticated user: %s", user.Name) + + c.Map(user) + } +} + +// authorize tries to authorize the user to the context repository with given access mode. +func authorize(store Store, mode database.AccessMode) macaron.Handler { + return func(c *macaron.Context, actor *database.User) { + username := c.Params(":username") + reponame := strings.TrimSuffix(c.Params(":reponame"), ".git") + + owner, err := store.GetUserByUsername(c.Req.Context(), username) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Status(http.StatusNotFound) + } else { + internalServerError(c.Resp) + log.Error("Failed to get user [name: %s]: %v", username, err) + } + return + } + + repo, err := store.GetRepositoryByName(c.Req.Context(), owner.ID, reponame) + if err != nil { + if database.IsErrRepoNotExist(err) { + c.Status(http.StatusNotFound) + } else { + internalServerError(c.Resp) + log.Error("Failed to get repository [owner_id: %d, name: %s]: %v", owner.ID, reponame, err) + } + return + } + + if !store.AuthorizeRepositoryAccess(c.Req.Context(), actor.ID, repo.ID, mode, + database.AccessModeOptions{ + OwnerID: repo.OwnerID, + Private: repo.IsPrivate, + }, + ) { + c.Status(http.StatusNotFound) + return + } + + log.Trace("[LFS] Authorized user %q to %q", actor.Name, username+"/"+reponame) + + c.Map(owner) // NOTE: Override actor + c.Map(repo) + } +} + +// verifyHeader checks if the HTTP header contains given value. +// When not, response given "failCode" as status code. +func verifyHeader(key, value string, failCode int) macaron.Handler { + return func(c *macaron.Context) { + vals := c.Req.Header.Values(key) + for _, val := range vals { + if strings.Contains(val, value) { + return + } + } + + log.Trace("[LFS] HTTP header %q does not contain value %q", key, value) + c.Status(failCode) + } +} + +// verifyOID checks if the ":oid" URL parameter is valid. +func verifyOID() macaron.Handler { + return func(c *macaron.Context) { + oid := lfsx.OID(c.Params(":oid")) + if !lfsx.ValidOID(oid) { + responseJSON(c.Resp, http.StatusBadRequest, responseError{ + Message: "Invalid oid", + }) + return + } + + c.Map(oid) + } +} + +func internalServerError(w http.ResponseWriter) { + responseJSON(w, http.StatusInternalServerError, responseError{ + Message: "Internal server error", + }) +} diff --git a/internal/route/lfs/route_test.go b/internal/route/lfs/route_test.go new file mode 100644 index 00000000000..46fcb612515 --- /dev/null +++ b/internal/route/lfs/route_test.go @@ -0,0 +1,371 @@ +package lfs + +import ( + "context" + "fmt" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/lfsx" +) + +func TestAuthenticate(t *testing.T) { + tests := []struct { + name string + header http.Header + mockStore func() *MockStore + expStatusCode int + expHeader http.Header + expBody string + }{ + { + name: "no authorization", + expStatusCode: http.StatusUnauthorized, + expHeader: http.Header{ + "Lfs-Authenticate": []string{`Basic realm="Git LFS"`}, + "Content-Type": []string{"application/vnd.git-lfs+json"}, + }, + expBody: `{"message":"Credentials needed"}` + "\n", + }, + { + name: "user has 2FA enabled", + header: http.Header{ + "Authorization": []string{"Basic dXNlcm5hbWU6cGFzc3dvcmQ="}, + }, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.IsTwoFactorEnabledFunc.SetDefaultReturn(true) + mockStore.AuthenticateUserFunc.SetDefaultReturn(&database.User{}, nil) + return mockStore + }, + expStatusCode: http.StatusBadRequest, + expHeader: http.Header{}, + expBody: "Users with 2FA enabled are not allowed to authenticate via username and password.", + }, + { + name: "both user and access token do not exist", + header: http.Header{ + "Authorization": []string{"Basic dXNlcm5hbWU="}, + }, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetAccessTokenBySHA1Func.SetDefaultReturn(nil, database.ErrAccessTokenNotExist{}) + mockStore.AuthenticateUserFunc.SetDefaultReturn(nil, auth.ErrBadCredentials{}) + return mockStore + }, + expStatusCode: http.StatusUnauthorized, + expHeader: http.Header{ + "Lfs-Authenticate": []string{`Basic realm="Git LFS"`}, + "Content-Type": []string{"application/vnd.git-lfs+json"}, + }, + expBody: `{"message":"Credentials needed"}` + "\n", + }, + + { + name: "authenticated by username and password", + header: http.Header{ + "Authorization": []string{"Basic dXNlcm5hbWU6cGFzc3dvcmQ="}, + }, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.IsTwoFactorEnabledFunc.SetDefaultReturn(false) + mockStore.AuthenticateUserFunc.SetDefaultReturn(&database.User{ID: 1, Name: "unknwon"}, nil) + return mockStore + }, + expStatusCode: http.StatusOK, + expHeader: http.Header{}, + expBody: "ID: 1, Name: unknwon", + }, + { + name: "authenticate by access token via username", + header: http.Header{ + "Authorization": []string{"Basic dXNlcm5hbWU="}, + }, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetAccessTokenBySHA1Func.SetDefaultReturn(&database.AccessToken{}, nil) + mockStore.AuthenticateUserFunc.SetDefaultReturn(nil, auth.ErrBadCredentials{}) + mockStore.GetUserByIDFunc.SetDefaultReturn(&database.User{ID: 1, Name: "unknwon"}, nil) + return mockStore + }, + expStatusCode: http.StatusOK, + expHeader: http.Header{}, + expBody: "ID: 1, Name: unknwon", + }, + { + name: "authenticate by access token via password", + header: http.Header{ + "Authorization": []string{"Basic dXNlcm5hbWU6cGFzc3dvcmQ="}, + }, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetAccessTokenBySHA1Func.SetDefaultHook(func(_ context.Context, sha1 string) (*database.AccessToken, error) { + if sha1 == "password" { + return &database.AccessToken{}, nil + } + return nil, database.ErrAccessTokenNotExist{} + }) + mockStore.AuthenticateUserFunc.SetDefaultReturn(nil, auth.ErrBadCredentials{}) + mockStore.GetUserByIDFunc.SetDefaultReturn(&database.User{ID: 1, Name: "unknwon"}, nil) + return mockStore + }, + expStatusCode: http.StatusOK, + expHeader: http.Header{}, + expBody: "ID: 1, Name: unknwon", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + if test.mockStore == nil { + test.mockStore = NewMockStore + } + + m := macaron.New() + m.Use(macaron.Renderer()) + m.Get("/", authenticate(test.mockStore()), func(w http.ResponseWriter, user *database.User) { + _, _ = fmt.Fprintf(w, "ID: %d, Name: %s", user.ID, user.Name) + }) + + r, err := http.NewRequest("GET", "/", nil) + if err != nil { + t.Fatal(err) + } + r.Header = test.header + + rr := httptest.NewRecorder() + m.ServeHTTP(rr, r) + + resp := rr.Result() + assert.Equal(t, test.expStatusCode, resp.StatusCode) + assert.Equal(t, test.expHeader, resp.Header) + + body, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, test.expBody, string(body)) + }) + } +} + +func TestAuthorize(t *testing.T) { + tests := []struct { + name string + accessMode database.AccessMode + mockStore func() *MockStore + expStatusCode int + expBody string + }{ + { + name: "user does not exist", + accessMode: database.AccessModeNone, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetUserByUsernameFunc.SetDefaultReturn(nil, database.ErrUserNotExist{}) + return mockStore + }, + expStatusCode: http.StatusNotFound, + }, + { + name: "repository does not exist", + accessMode: database.AccessModeNone, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.GetRepositoryByNameFunc.SetDefaultReturn(nil, database.ErrRepoNotExist{}) + mockStore.GetUserByUsernameFunc.SetDefaultHook(func(ctx context.Context, username string) (*database.User, error) { + return &database.User{Name: username}, nil + }) + return mockStore + }, + expStatusCode: http.StatusNotFound, + }, + { + name: "actor is not authorized", + accessMode: database.AccessModeWrite, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.AuthorizeRepositoryAccessFunc.SetDefaultHook(func(_ context.Context, _ int64, _ int64, desired database.AccessMode, _ database.AccessModeOptions) bool { + return desired <= database.AccessModeRead + }) + mockStore.GetRepositoryByNameFunc.SetDefaultHook(func(ctx context.Context, ownerID int64, name string) (*database.Repository, error) { + return &database.Repository{Name: name}, nil + }) + mockStore.GetUserByUsernameFunc.SetDefaultHook(func(ctx context.Context, username string) (*database.User, error) { + return &database.User{Name: username}, nil + }) + return mockStore + }, + expStatusCode: http.StatusNotFound, + }, + + { + name: "actor is authorized", + accessMode: database.AccessModeRead, + mockStore: func() *MockStore { + mockStore := NewMockStore() + mockStore.AuthorizeRepositoryAccessFunc.SetDefaultHook(func(_ context.Context, _ int64, _ int64, desired database.AccessMode, _ database.AccessModeOptions) bool { + return desired <= database.AccessModeRead + }) + mockStore.GetRepositoryByNameFunc.SetDefaultHook(func(ctx context.Context, ownerID int64, name string) (*database.Repository, error) { + return &database.Repository{Name: name}, nil + }) + mockStore.GetUserByUsernameFunc.SetDefaultHook(func(ctx context.Context, username string) (*database.User, error) { + return &database.User{Name: username}, nil + }) + return mockStore + }, + expStatusCode: http.StatusOK, + expBody: "owner.Name: owner, repo.Name: repo", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + mockStore := NewMockStore() + if test.mockStore != nil { + mockStore = test.mockStore() + } + + m := macaron.New() + m.Use(macaron.Renderer()) + m.Use(func(c *macaron.Context) { + c.Map(&database.User{}) + }) + m.Get( + "/:username/:reponame", + authorize(mockStore, test.accessMode), + func(w http.ResponseWriter, owner *database.User, repo *database.Repository) { + _, _ = fmt.Fprintf(w, "owner.Name: %s, repo.Name: %s", owner.Name, repo.Name) + }, + ) + + r, err := http.NewRequest("GET", "/owner/repo", nil) + if err != nil { + t.Fatal(err) + } + + rr := httptest.NewRecorder() + m.ServeHTTP(rr, r) + + resp := rr.Result() + assert.Equal(t, test.expStatusCode, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, test.expBody, string(body)) + }) + } +} + +func Test_verifyHeader(t *testing.T) { + tests := []struct { + name string + verifyHeader macaron.Handler + header http.Header + expStatusCode int + }{ + { + name: "header not found", + verifyHeader: verifyHeader("Accept", contentType, http.StatusNotAcceptable), + expStatusCode: http.StatusNotAcceptable, + }, + + { + name: "header found", + verifyHeader: verifyHeader("Accept", "application/vnd.git-lfs+json", http.StatusNotAcceptable), + header: http.Header{ + "Accept": []string{"application/vnd.git-lfs+json; charset=utf-8"}, + }, + expStatusCode: http.StatusOK, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + m := macaron.New() + m.Use(macaron.Renderer()) + m.Get("/", test.verifyHeader) + + r, err := http.NewRequest("GET", "/", nil) + if err != nil { + t.Fatal(err) + } + r.Header = test.header + + rr := httptest.NewRecorder() + m.ServeHTTP(rr, r) + + resp := rr.Result() + assert.Equal(t, test.expStatusCode, resp.StatusCode) + }) + } +} + +func Test_verifyOID(t *testing.T) { + m := macaron.New() + m.Get("/:oid", verifyOID(), func(w http.ResponseWriter, oid lfsx.OID) { + fmt.Fprintf(w, "oid: %s", oid) + }) + + tests := []struct { + name string + url string + expStatusCode int + expBody string + }{ + { + name: "bad oid", + url: "/bad_oid", + expStatusCode: http.StatusBadRequest, + expBody: `{"message":"Invalid oid"}` + "\n", + }, + + { + name: "good oid", + url: "/ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", + expStatusCode: http.StatusOK, + expBody: "oid: ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + r, err := http.NewRequest("GET", test.url, nil) + if err != nil { + t.Fatal(err) + } + + rr := httptest.NewRecorder() + m.ServeHTTP(rr, r) + + resp := rr.Result() + assert.Equal(t, test.expStatusCode, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, test.expBody, string(body)) + }) + } +} + +func Test_internalServerError(t *testing.T) { + rr := httptest.NewRecorder() + internalServerError(rr) + + resp := rr.Result() + assert.Equal(t, http.StatusInternalServerError, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, `{"message":"Internal server error"}`+"\n", string(body)) +} diff --git a/internal/route/lfs/store.go b/internal/route/lfs/store.go new file mode 100644 index 00000000000..3977cadc314 --- /dev/null +++ b/internal/route/lfs/store.go @@ -0,0 +1,121 @@ +package lfs + +import ( + "context" + + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/lfsx" +) + +// Store is the data layer carrier for LFS endpoints. This interface is meant to +// abstract away and limit the exposure of the underlying data layer to the +// handler through a thin-wrapper. +type Store interface { + // GetAccessTokenBySHA1 returns the access token with given SHA1. It returns + // database.ErrAccessTokenNotExist when not found. + GetAccessTokenBySHA1(ctx context.Context, sha1 string) (*database.AccessToken, error) + // TouchAccessTokenByID updates the updated time of the given access token to + // the current time. + TouchAccessTokenByID(ctx context.Context, id int64) error + + // CreateLFSObject creates an LFS object record in database. + CreateLFSObject(ctx context.Context, repoID int64, oid lfsx.OID, size int64, storage lfsx.Storage) error + // GetLFSObjectByOID returns the LFS object with given OID. It returns + // database.ErrLFSObjectNotExist when not found. + GetLFSObjectByOID(ctx context.Context, repoID int64, oid lfsx.OID) (*database.LFSObject, error) + // GetLFSObjectsByOIDs returns LFS objects found within "oids". The returned + // list could have fewer elements if some oids were not found. + GetLFSObjectsByOIDs(ctx context.Context, repoID int64, oids ...lfsx.OID) ([]*database.LFSObject, error) + + // AuthorizeRepositoryAccess returns true if the user has as good as desired + // access mode to the repository. + AuthorizeRepositoryAccess(ctx context.Context, userID, repoID int64, desired database.AccessMode, opts database.AccessModeOptions) bool + + // GetRepositoryByName returns the repository with given owner and name. It + // returns database.ErrRepoNotExist when not found. + GetRepositoryByName(ctx context.Context, ownerID int64, name string) (*database.Repository, error) + + // IsTwoFactorEnabled returns true if the user has enabled 2FA. + IsTwoFactorEnabled(ctx context.Context, userID int64) bool + + // GetUserByID returns the user with given ID. It returns + // database.ErrUserNotExist when not found. + GetUserByID(ctx context.Context, id int64) (*database.User, error) + // GetUserByUsername returns the user with given username. It returns + // database.ErrUserNotExist when not found. + GetUserByUsername(ctx context.Context, username string) (*database.User, error) + // CreateUser creates a new user and persists to database. It returns + // database.ErrNameNotAllowed if the given name or pattern of the name is not + // allowed as a username, or database.ErrUserAlreadyExist when a user with same + // name already exists, or database.ErrEmailAlreadyUsed if the email has been + // verified by another user. + CreateUser(ctx context.Context, username, email string, opts database.CreateUserOptions) (*database.User, error) + // AuthenticateUser validates username and password via given login source ID. + // It returns database.ErrUserNotExist when the user was not found. + // + // When the "loginSourceID" is negative, it aborts the process and returns + // database.ErrUserNotExist if the user was not found in the database. + // + // When the "loginSourceID" is non-negative, it returns + // database.ErrLoginSourceMismatch if the user has different login source ID + // than the "loginSourceID". + // + // When the "loginSourceID" is positive, it tries to authenticate via given + // login source and creates a new user when not yet exists in the database. + AuthenticateUser(ctx context.Context, login, password string, loginSourceID int64) (*database.User, error) +} + +type store struct{} + +// NewStore returns a new Store using the global database handle. +func NewStore() Store { + return &store{} +} + +func (*store) GetAccessTokenBySHA1(ctx context.Context, sha1 string) (*database.AccessToken, error) { + return database.Handle.AccessTokens().GetBySHA1(ctx, sha1) +} + +func (*store) TouchAccessTokenByID(ctx context.Context, id int64) error { + return database.Handle.AccessTokens().Touch(ctx, id) +} + +func (*store) CreateLFSObject(ctx context.Context, repoID int64, oid lfsx.OID, size int64, storage lfsx.Storage) error { + return database.Handle.LFS().CreateObject(ctx, repoID, oid, size, storage) +} + +func (*store) GetLFSObjectByOID(ctx context.Context, repoID int64, oid lfsx.OID) (*database.LFSObject, error) { + return database.Handle.LFS().GetObjectByOID(ctx, repoID, oid) +} + +func (*store) GetLFSObjectsByOIDs(ctx context.Context, repoID int64, oids ...lfsx.OID) ([]*database.LFSObject, error) { + return database.Handle.LFS().GetObjectsByOIDs(ctx, repoID, oids...) +} + +func (*store) AuthorizeRepositoryAccess(ctx context.Context, userID, repoID int64, desired database.AccessMode, opts database.AccessModeOptions) bool { + return database.Handle.Permissions().Authorize(ctx, userID, repoID, desired, opts) +} + +func (*store) GetRepositoryByName(ctx context.Context, ownerID int64, name string) (*database.Repository, error) { + return database.Handle.Repositories().GetByName(ctx, ownerID, name) +} + +func (*store) IsTwoFactorEnabled(ctx context.Context, userID int64) bool { + return database.Handle.TwoFactors().IsEnabled(ctx, userID) +} + +func (*store) GetUserByID(ctx context.Context, id int64) (*database.User, error) { + return database.Handle.Users().GetByID(ctx, id) +} + +func (*store) GetUserByUsername(ctx context.Context, username string) (*database.User, error) { + return database.Handle.Users().GetByUsername(ctx, username) +} + +func (*store) CreateUser(ctx context.Context, username, email string, opts database.CreateUserOptions) (*database.User, error) { + return database.Handle.Users().Create(ctx, username, email, opts) +} + +func (*store) AuthenticateUser(ctx context.Context, login, password string, loginSourceID int64) (*database.User, error) { + return database.Handle.Users().Authenticate(ctx, login, password, loginSourceID) +} diff --git a/internal/route/org/members.go b/internal/route/org/members.go new file mode 100644 index 00000000000..3a42f794409 --- /dev/null +++ b/internal/route/org/members.go @@ -0,0 +1,119 @@ +package org + +import ( + "strconv" + + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" +) + +const ( + tmplOrgMembers = "org/member/members" + templOrgMemberInvite = "org/member/invite" +) + +func Members(c *context.Context) { + org := c.Org.Organization + c.Data["Title"] = org.FullName + c.Data["PageIsOrgMembers"] = true + + if err := org.GetMembers(0); err != nil { + c.Error(err, "get members") + return + } + c.Data["Members"] = org.Members + + c.Success(tmplOrgMembers) +} + +func MembersAction(c *context.Context) { + uid, _ := strconv.ParseInt(c.Query("uid"), 10, 64) + if uid == 0 { + c.Redirect(c.Org.OrgLink + "/members") + return + } + + org := c.Org.Organization + var err error + switch c.Params(":action") { + case "private": + if c.User.ID != uid && !c.Org.IsOwner { + c.NotFound() + return + } + err = database.ChangeOrgUserStatus(org.ID, uid, false) + case "public": + if c.User.ID != uid && !c.Org.IsOwner { + c.NotFound() + return + } + err = database.ChangeOrgUserStatus(org.ID, uid, true) + case "remove": + if !c.Org.IsOwner { + c.NotFound() + return + } + err = org.RemoveMember(uid) + if database.IsErrLastOrgOwner(err) { + c.Flash.Error(c.Tr("form.last_org_owner")) + c.Redirect(c.Org.OrgLink + "/members") + return + } + case "leave": + err = org.RemoveMember(c.User.ID) + if database.IsErrLastOrgOwner(err) { + c.Flash.Error(c.Tr("form.last_org_owner")) + c.Redirect(c.Org.OrgLink + "/members") + return + } + } + + if err != nil { + log.Error("Action(%s): %v", c.Params(":action"), err) + c.JSONSuccess(map[string]any{ + "ok": false, + "err": err.Error(), + }) + return + } + + if c.Params(":action") != "leave" { + c.Redirect(c.Org.OrgLink + "/members") + } else { + c.Redirect(conf.Server.Subpath + "/") + } +} + +func Invitation(c *context.Context) { + org := c.Org.Organization + c.Data["Title"] = org.FullName + c.Data["PageIsOrgMembers"] = true + + if c.Req.Method == "POST" { + uname := c.Query("uname") + u, err := database.Handle.Users().GetByUsername(c.Req.Context(), uname) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Flash.Error(c.Tr("form.user_not_exist")) + c.Redirect(c.Org.OrgLink + "/invitations/new") + } else { + c.Error(err, "get user by name") + } + return + } + + if err = org.AddMember(u.ID); err != nil { + c.Error(err, "add member") + return + } + + log.Trace("New member added(%s): %s", org.Name, u.Name) + c.Redirect(c.Org.OrgLink + "/members") + return + } + + c.Success(templOrgMemberInvite) +} diff --git a/internal/route/org/org.go b/internal/route/org/org.go new file mode 100644 index 00000000000..a24e266cd55 --- /dev/null +++ b/internal/route/org/org.go @@ -0,0 +1,51 @@ +package org + +import ( + "net/http" + + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" +) + +const ( + CREATE = "org/create" +) + +func Create(c *context.Context) { + c.Title("new_org") + c.Success(CREATE) +} + +func CreatePost(c *context.Context, f form.CreateOrg) { + c.Title("new_org") + + if c.HasError() { + c.HTML(http.StatusBadRequest, CREATE) + return + } + + org := &database.User{ + Name: f.OrgName, + IsActive: true, + Type: database.UserTypeOrganization, + } + + if err := database.CreateOrganization(org, c.User); err != nil { + c.Data["Err_OrgName"] = true + switch { + case database.IsErrUserAlreadyExist(err): + c.RenderWithErr(c.Tr("form.org_name_been_taken"), http.StatusUnprocessableEntity, CREATE, &f) + case database.IsErrNameNotAllowed(err): + c.RenderWithErr(c.Tr("org.form.name_not_allowed", err.(database.ErrNameNotAllowed).Value()), http.StatusBadRequest, CREATE, &f) + default: + c.Error(err, "create organization") + } + return + } + log.Trace("Organization created: %s", org.Name) + + c.RedirectSubpath("/org/" + f.OrgName + "/dashboard") +} diff --git a/internal/route/org/setting.go b/internal/route/org/setting.go new file mode 100644 index 00000000000..9597f780cac --- /dev/null +++ b/internal/route/org/setting.go @@ -0,0 +1,127 @@ +package org + +import ( + "net/http" + + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/route/user" +) + +const ( + tmplOrgSettingsOptions = "org/settings/options" + tmplOrgSettingsDelete = "org/settings/delete" +) + +func Settings(c *context.Context) { + c.Title("org.settings") + c.Data["PageIsSettingsOptions"] = true + c.Success(tmplOrgSettingsOptions) +} + +func SettingsPost(c *context.Context, f form.UpdateOrgSetting) { + c.Title("org.settings") + c.Data["PageIsSettingsOptions"] = true + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplOrgSettingsOptions) + return + } + + org := c.Org.Organization + + // Check if the organization username (including cases) had been changed + if org.Name != f.Name { + err := database.Handle.Users().ChangeUsername(c.Req.Context(), c.Org.Organization.ID, f.Name) + if err != nil { + c.Data["OrgName"] = true + switch { + case database.IsErrUserAlreadyExist(err): + c.RenderWithErr(c.Tr("form.username_been_taken"), http.StatusUnprocessableEntity, tmplOrgSettingsOptions, &f) + case database.IsErrNameNotAllowed(err): + c.RenderWithErr(c.Tr("user.form.name_not_allowed", err.(database.ErrNameNotAllowed).Value()), http.StatusBadRequest, tmplOrgSettingsOptions, &f) + default: + c.Error(err, "change organization name") + } + return + } + + // reset c.org.OrgLink with new name + c.Org.OrgLink = conf.Server.Subpath + "/org/" + f.Name + log.Trace("Organization name changed: %s -> %s", org.Name, f.Name) + } + + opts := database.UpdateUserOptions{ + FullName: &f.FullName, + Website: &f.Website, + Location: &f.Location, + Description: &f.Description, + } + if c.User.IsAdmin { + opts.MaxRepoCreation = &f.MaxRepoCreation + } + err := database.Handle.Users().Update(c.Req.Context(), c.Org.Organization.ID, opts) + if err != nil { + c.Error(err, "update organization") + return + } + + c.Flash.Success(c.Tr("org.settings.update_setting_success")) + c.Redirect(c.Org.OrgLink + "/settings") +} + +func SettingsAvatar(c *context.Context, f form.Avatar) { + f.Source = form.AvatarLocal + if err := user.UpdateAvatarSetting(c, f, c.Org.Organization); err != nil { + c.Flash.Error(err.Error()) + } else { + c.Flash.Success(c.Tr("org.settings.update_avatar_success")) + } + + c.Redirect(c.Org.OrgLink + "/settings") +} + +func SettingsDeleteAvatar(c *context.Context) { + if err := database.Handle.Users().DeleteCustomAvatar(c.Req.Context(), c.Org.Organization.ID); err != nil { + c.Flash.Error(err.Error()) + } + + c.Redirect(c.Org.OrgLink + "/settings") +} + +func SettingsDelete(c *context.Context) { + c.Title("org.settings") + c.PageIs("SettingsDelete") + + org := c.Org.Organization + if c.Req.Method == "POST" { + if _, err := database.Handle.Users().Authenticate(c.Req.Context(), c.User.Name, c.Query("password"), c.User.LoginSource); err != nil { + if auth.IsErrBadCredentials(err) { + c.RenderWithErr(c.Tr("form.enterred_invalid_password"), http.StatusUnauthorized, tmplOrgSettingsDelete, nil) + } else { + c.Error(err, "authenticate user") + } + return + } + + if err := database.DeleteOrganization(org); err != nil { + if database.IsErrUserOwnRepos(err) { + c.Flash.Error(c.Tr("form.org_still_own_repo")) + c.Redirect(c.Org.OrgLink + "/settings/delete") + } else { + c.Error(err, "delete organization") + } + } else { + log.Trace("Organization deleted: %s", org.Name) + c.Redirect(conf.Server.Subpath + "/") + } + return + } + + c.Success(tmplOrgSettingsDelete) +} diff --git a/internal/route/org/teams.go b/internal/route/org/teams.go new file mode 100644 index 00000000000..e7f306fecb3 --- /dev/null +++ b/internal/route/org/teams.go @@ -0,0 +1,268 @@ +package org + +import ( + "net/http" + "path" + "strconv" + + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" +) + +const ( + tmplOrgTeams = "org/team/teams" + tmplOrgTeamNew = "org/team/new" + tmplOrgTeamMembers = "org/team/members" + tmplOrgTeamRepositories = "org/team/repositories" +) + +func Teams(c *context.Context) { + org := c.Org.Organization + c.Data["Title"] = org.FullName + c.Data["PageIsOrgTeams"] = true + + for _, t := range org.Teams { + if err := t.GetMembers(); err != nil { + c.Error(err, "get members") + return + } + } + c.Data["Teams"] = org.Teams + + c.Success(tmplOrgTeams) +} + +func TeamsAction(c *context.Context) { + uid, _ := strconv.ParseInt(c.Query("uid"), 10, 64) + if uid == 0 { + c.Redirect(c.Org.OrgLink + "/teams") + return + } + + page := c.Query("page") + var err error + switch c.Params(":action") { + case "join": + if !c.Org.IsOwner { + c.NotFound() + return + } + err = c.Org.Team.AddMember(c.User.ID) + case "leave": + err = c.Org.Team.RemoveMember(c.User.ID) + case "remove": + if !c.Org.IsOwner { + c.NotFound() + return + } + err = c.Org.Team.RemoveMember(uid) + page = "team" + case "add": + if !c.Org.IsOwner { + c.NotFound() + return + } + uname := c.Query("uname") + var u *database.User + u, err = database.Handle.Users().GetByUsername(c.Req.Context(), uname) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Flash.Error(c.Tr("form.user_not_exist")) + c.Redirect(c.Org.OrgLink + "/teams/" + c.Org.Team.LowerName) + } else { + c.Error(err, "get user by name") + } + return + } + + err = c.Org.Team.AddMember(u.ID) + page = "team" + } + + if err != nil { + if database.IsErrLastOrgOwner(err) { + c.Flash.Error(c.Tr("form.last_org_owner")) + } else { + log.Error("Action(%s): %v", c.Params(":action"), err) + c.JSONSuccess(map[string]any{ + "ok": false, + "err": err.Error(), + }) + return + } + } + + switch page { + case "team": + c.Redirect(c.Org.OrgLink + "/teams/" + c.Org.Team.LowerName) + default: + c.Redirect(c.Org.OrgLink + "/teams") + } +} + +func TeamsRepoAction(c *context.Context) { + if !c.Org.IsOwner { + c.NotFound() + return + } + + var err error + switch c.Params(":action") { + case "add": + repoName := path.Base(c.Query("repo_name")) + var repo *database.Repository + repo, err = database.GetRepositoryByName(c.Org.Organization.ID, repoName) + if err != nil { + if database.IsErrRepoNotExist(err) { + c.Flash.Error(c.Tr("org.teams.add_nonexistent_repo")) + c.Redirect(c.Org.OrgLink + "/teams/" + c.Org.Team.LowerName + "/repositories") + return + } + + c.Error(err, "get repository by name") + return + } + err = c.Org.Team.AddRepository(repo) + case "remove": + repoID, _ := strconv.ParseInt(c.Query("repoid"), 10, 64) + err = c.Org.Team.RemoveRepository(repoID) + } + + if err != nil { + c.Errorf(err, "action %q", c.Params(":action")) + return + } + c.Redirect(c.Org.OrgLink + "/teams/" + c.Org.Team.LowerName + "/repositories") +} + +func NewTeam(c *context.Context) { + c.Data["Title"] = c.Org.Organization.FullName + c.Data["PageIsOrgTeams"] = true + c.Data["PageIsOrgTeamsNew"] = true + c.Data["Team"] = &database.Team{} + c.Success(tmplOrgTeamNew) +} + +func NewTeamPost(c *context.Context, f form.CreateTeam) { + c.Data["Title"] = c.Org.Organization.FullName + c.Data["PageIsOrgTeams"] = true + c.Data["PageIsOrgTeamsNew"] = true + + t := &database.Team{ + OrgID: c.Org.Organization.ID, + Name: f.TeamName, + Description: f.Description, + Authorize: database.ParseAccessMode(f.Permission), + } + c.Data["Team"] = t + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplOrgTeamNew) + return + } + + if err := database.NewTeam(t); err != nil { + c.Data["Err_TeamName"] = true + switch { + case database.IsErrTeamAlreadyExist(err): + c.RenderWithErr(c.Tr("form.team_name_been_taken"), http.StatusUnprocessableEntity, tmplOrgTeamNew, &f) + case database.IsErrNameNotAllowed(err): + c.RenderWithErr(c.Tr("org.form.team_name_not_allowed", err.(database.ErrNameNotAllowed).Value()), http.StatusBadRequest, tmplOrgTeamNew, &f) + default: + c.Error(err, "new team") + } + return + } + log.Trace("Team created: %s/%s", c.Org.Organization.Name, t.Name) + c.Redirect(c.Org.OrgLink + "/teams/" + t.LowerName) +} + +func TeamMembers(c *context.Context) { + c.Data["Title"] = c.Org.Team.Name + c.Data["PageIsOrgTeams"] = true + if err := c.Org.Team.GetMembers(); err != nil { + c.Error(err, "get members") + return + } + c.Success(tmplOrgTeamMembers) +} + +func TeamRepositories(c *context.Context) { + c.Data["Title"] = c.Org.Team.Name + c.Data["PageIsOrgTeams"] = true + if err := c.Org.Team.GetRepositories(); err != nil { + c.Error(err, "get repositories") + return + } + c.Success(tmplOrgTeamRepositories) +} + +func EditTeam(c *context.Context) { + c.Data["Title"] = c.Org.Organization.FullName + c.Data["PageIsOrgTeams"] = true + c.Data["team_name"] = c.Org.Team.Name + c.Data["desc"] = c.Org.Team.Description + c.Success(tmplOrgTeamNew) +} + +func EditTeamPost(c *context.Context, f form.CreateTeam) { + t := c.Org.Team + c.Data["Title"] = c.Org.Organization.FullName + c.Data["PageIsOrgTeams"] = true + c.Data["Team"] = t + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplOrgTeamNew) + return + } + + isAuthChanged := false + if !t.IsOwnerTeam() { + // Validate permission level. + var auth database.AccessMode + switch f.Permission { + case "read": + auth = database.AccessModeRead + case "write": + auth = database.AccessModeWrite + case "admin": + auth = database.AccessModeAdmin + default: + c.Status(http.StatusUnauthorized) + return + } + + t.Name = f.TeamName + if t.Authorize != auth { + isAuthChanged = true + t.Authorize = auth + } + } + t.Description = f.Description + if err := database.UpdateTeam(t, isAuthChanged); err != nil { + c.Data["Err_TeamName"] = true + switch { + case database.IsErrTeamAlreadyExist(err): + c.RenderWithErr(c.Tr("form.team_name_been_taken"), http.StatusUnprocessableEntity, tmplOrgTeamNew, &f) + default: + c.Error(err, "update team") + } + return + } + c.Redirect(c.Org.OrgLink + "/teams/" + t.LowerName) +} + +func DeleteTeam(c *context.Context) { + if err := database.DeleteTeam(c.Org.Team); err != nil { + c.Flash.Error("DeleteTeam: " + err.Error()) + } else { + c.Flash.Success(c.Tr("org.teams.delete_team_success")) + } + + c.JSONSuccess(map[string]any{ + "redirect": c.Org.OrgLink + "/teams", + }) +} diff --git a/internal/route/repo/branch.go b/internal/route/repo/branch.go new file mode 100644 index 00000000000..c242cb2db99 --- /dev/null +++ b/internal/route/repo/branch.go @@ -0,0 +1,166 @@ +package repo + +import ( + "time" + + log "unknwon.dev/clog/v2" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" + "gogs.io/gogs/internal/urlx" +) + +const ( + tmplRepoBranchesOverview = "repo/branches/overview" + tmplRepoBranchesAll = "repo/branches/all" +) + +type Branch struct { + Name string + Commit *git.Commit + IsProtected bool +} + +func loadBranches(c *context.Context) []*Branch { + rawBranches, err := c.Repo.Repository.GetBranches() + if err != nil { + c.Error(err, "get branches") + return nil + } + + protectBranches, err := database.GetProtectBranchesByRepoID(c.Repo.Repository.ID) + if err != nil { + c.Error(err, "get protect branches by repository ID") + return nil + } + + branches := make([]*Branch, len(rawBranches)) + for i := range rawBranches { + commit, err := rawBranches[i].GetCommit() + if err != nil { + c.Error(err, "get commit") + return nil + } + + branches[i] = &Branch{ + Name: rawBranches[i].Name, + Commit: commit, + } + + for j := range protectBranches { + if branches[i].Name == protectBranches[j].Name { + branches[i].IsProtected = true + break + } + } + } + + c.Data["AllowPullRequest"] = c.Repo.Repository.AllowsPulls() + return branches +} + +func Branches(c *context.Context) { + c.Data["Title"] = c.Tr("repo.git_branches") + c.Data["PageIsBranchesOverview"] = true + + branches := loadBranches(c) + if c.Written() { + return + } + + now := time.Now() + activeBranches := make([]*Branch, 0, 3) + staleBranches := make([]*Branch, 0, 3) + for i := range branches { + switch { + case branches[i].Name == c.Repo.BranchName: + c.Data["DefaultBranch"] = branches[i] + case branches[i].Commit.Committer.When.Add(30 * 24 * time.Hour).After(now): // 30 days + activeBranches = append(activeBranches, branches[i]) + case branches[i].Commit.Committer.When.Add(3 * 30 * 24 * time.Hour).Before(now): // 90 days + staleBranches = append(staleBranches, branches[i]) + } + } + + c.Data["ActiveBranches"] = activeBranches + c.Data["StaleBranches"] = staleBranches + c.Success(tmplRepoBranchesOverview) +} + +func AllBranches(c *context.Context) { + c.Data["Title"] = c.Tr("repo.git_branches") + c.Data["PageIsBranchesAll"] = true + + branches := loadBranches(c) + if c.Written() { + return + } + c.Data["Branches"] = branches + + c.Success(tmplRepoBranchesAll) +} + +func DeleteBranchPost(c *context.Context) { + branchName := c.Params("*") + commitID := c.Query("commit") + + defer func() { + redirectTo := c.Query("redirect_to") + if !urlx.IsSameSite(redirectTo) { + redirectTo = c.Repo.RepoLink + } + c.Redirect(redirectTo) + }() + + if !c.Repo.GitRepo.HasBranch(branchName) { + return + } + if branchName == c.Repo.Repository.DefaultBranch { + c.Flash.Error(c.Tr("repo.branches.default_deletion_not_allowed")) + return + } + + protectBranch, err := database.GetProtectBranchOfRepoByName(c.Repo.Repository.ID, branchName) + if err != nil && !database.IsErrBranchNotExist(err) { + log.Error("Failed to get protected branch %q: %v", branchName, err) + return + } + if protectBranch != nil && protectBranch.Protected { + c.Flash.Error(c.Tr("repo.branches.protected_deletion_not_allowed")) + return + } + + if len(commitID) > 0 { + branchCommitID, err := c.Repo.GitRepo.BranchCommitID(branchName) + if err != nil { + log.Error("Failed to get commit ID of branch %q: %v", branchName, err) + return + } + + if branchCommitID != commitID { + c.Flash.Error(c.Tr("repo.pulls.delete_branch_has_new_commits")) + return + } + } + + if err := c.Repo.GitRepo.DeleteBranch(branchName, git.DeleteBranchOptions{ + Force: true, + }); err != nil { + log.Error("Failed to delete branch %q: %v", branchName, err) + return + } + + if err := database.PrepareWebhooks(c.Repo.Repository, database.HookEventTypeDelete, &apiv1types.WebhookDeletePayload{ + Ref: branchName, + RefType: "branch", + PusherType: apiv1types.WebhookPusherTypeUser, + Repo: c.Repo.Repository.APIFormatLegacy(nil), + Sender: c.User.APIFormat(), + }); err != nil { + log.Error("Failed to prepare webhooks for %q: %v", database.HookEventTypeDelete, err) + return + } +} diff --git a/internal/route/repo/commit.go b/internal/route/repo/commit.go new file mode 100644 index 00000000000..ffda0482b15 --- /dev/null +++ b/internal/route/repo/commit.go @@ -0,0 +1,258 @@ +package repo + +import ( + gocontext "context" + "path" + "time" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/tool" +) + +const ( + COMMITS = "repo/commits" + DIFF = "repo/diff/page" +) + +func RefCommits(c *context.Context) { + c.Data["PageIsViewFiles"] = true + switch c.Repo.TreePath { + case "": + Commits(c) + case "search": + SearchCommits(c) + default: + FileHistory(c) + } +} + +// TODO(unknwon) +func RenderIssueLinks(oldCommits []*git.Commit, _ string) []*git.Commit { + return oldCommits +} + +func renderCommits(c *context.Context, filename string) { + c.Data["Title"] = c.Tr("repo.commits.commit_history") + " · " + c.Repo.Repository.FullName() + c.Data["PageIsCommits"] = true + c.Data["FileName"] = filename + + page := max(c.QueryInt("page"), 1) + pageSize := c.QueryInt("pageSize") + if pageSize < 1 { + pageSize = conf.UI.User.CommitsPagingNum + } + + commits, err := c.Repo.Commit.CommitsByPage(page, pageSize, git.CommitsByPageOptions{Path: filename}) + if err != nil { + c.Error(err, "paging commits") + return + } + + commits = RenderIssueLinks(commits, c.Repo.RepoLink) + c.Data["Commits"] = matchUsersWithCommitEmails(c.Req.Context(), commits) + + if page > 1 { + c.Data["HasPrevious"] = true + c.Data["PreviousPage"] = page - 1 + } + if len(commits) == pageSize { + c.Data["HasNext"] = true + c.Data["NextPage"] = page + 1 + } + c.Data["PageSize"] = pageSize + + c.Data["Username"] = c.Repo.Owner.Name + c.Data["Reponame"] = c.Repo.Repository.Name + c.Success(COMMITS) +} + +func Commits(c *context.Context) { + renderCommits(c, "") +} + +func SearchCommits(c *context.Context) { + c.Data["PageIsCommits"] = true + + keyword := c.Query("q") + if keyword == "" { + c.Redirect(c.Repo.RepoLink + "/commits/" + c.Repo.BranchName) + return + } + + commits, err := c.Repo.Commit.SearchCommits(keyword) + if err != nil { + c.Error(err, "search commits") + return + } + + commits = RenderIssueLinks(commits, c.Repo.RepoLink) + c.Data["Commits"] = matchUsersWithCommitEmails(c.Req.Context(), commits) + + c.Data["Keyword"] = keyword + c.Data["Username"] = c.Repo.Owner.Name + c.Data["Reponame"] = c.Repo.Repository.Name + c.Data["Branch"] = c.Repo.BranchName + c.Success(COMMITS) +} + +func FileHistory(c *context.Context) { + renderCommits(c, c.Repo.TreePath) +} + +// tryGetUserByEmail returns a non-nil value if the email is corresponding to an +// existing user. +func tryGetUserByEmail(ctx gocontext.Context, email string) *database.User { + user, _ := database.Handle.Users().GetByEmail(ctx, email) + return user +} + +func Diff(c *context.Context) { + c.PageIs("Diff") + c.RequireHighlightJS() + + userName := c.Repo.Owner.Name + repoName := c.Repo.Repository.Name + commitID := c.Params(":sha") + + commit, err := c.Repo.GitRepo.CatFileCommit(commitID) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get commit by ID") + return + } + + diff, err := gitx.RepoDiff(c.Repo.GitRepo, + commitID, conf.Git.MaxDiffFiles, conf.Git.MaxDiffLines, conf.Git.MaxDiffLineChars, + git.DiffOptions{Timeout: time.Duration(conf.Git.Timeout.Diff) * time.Second}, + ) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get diff") + return + } + + parents := make([]string, commit.ParentsCount()) + for i := 0; i < commit.ParentsCount(); i++ { + sha, err := commit.ParentID(i) + if err != nil { + c.NotFound() + return + } + parents[i] = sha.String() + } + + setEditorconfigIfExists(c) + if c.Written() { + return + } + + c.RawTitle(commit.Summary() + " · " + tool.ShortSHA1(commitID)) + c.Data["CommitID"] = commitID + c.Data["IsSplitStyle"] = c.Query("style") == "split" + c.Data["Username"] = userName + c.Data["Reponame"] = repoName + c.Data["IsImageFile"] = commit.IsImageFile + c.Data["IsImageFileByIndex"] = commit.IsImageFileByIndex + c.Data["Commit"] = commit + c.Data["Author"] = tryGetUserByEmail(c.Req.Context(), commit.Author.Email) + c.Data["Diff"] = diff + c.Data["Parents"] = parents + c.Data["DiffNotAvailable"] = diff.NumFiles() == 0 + c.Data["SourcePath"] = conf.Server.Subpath + "/" + path.Join(userName, repoName, "src", commitID) + c.Data["RawPath"] = conf.Server.Subpath + "/" + path.Join(userName, repoName, "raw", commitID) + if commit.ParentsCount() > 0 { + c.Data["BeforeSourcePath"] = conf.Server.Subpath + "/" + path.Join(userName, repoName, "src", parents[0]) + c.Data["BeforeRawPath"] = conf.Server.Subpath + "/" + path.Join(userName, repoName, "raw", parents[0]) + } + c.Success(DIFF) +} + +func RawDiff(c *context.Context) { + if err := c.Repo.GitRepo.RawDiff( + c.Params(":sha"), + git.RawDiffFormat(c.Params(":ext")), + c.Resp, + ); err != nil { + c.NotFoundOrError(gitx.NewError(err), "get raw diff") + return + } +} + +type userCommit struct { + User *database.User + *git.Commit +} + +// matchUsersWithCommitEmails matches existing users using commit author emails. +func matchUsersWithCommitEmails(ctx gocontext.Context, oldCommits []*git.Commit) []*userCommit { + emailToUsers := make(map[string]*database.User) + newCommits := make([]*userCommit, len(oldCommits)) + usersStore := database.Handle.Users() + for i := range oldCommits { + var u *database.User + if v, ok := emailToUsers[oldCommits[i].Author.Email]; !ok { + u, _ = usersStore.GetByEmail(ctx, oldCommits[i].Author.Email) + emailToUsers[oldCommits[i].Author.Email] = u + } else { + u = v + } + + newCommits[i] = &userCommit{ + User: u, + Commit: oldCommits[i], + } + } + return newCommits +} + +func CompareDiff(c *context.Context) { + c.Data["IsDiffCompare"] = true + userName := c.Repo.Owner.Name + repoName := c.Repo.Repository.Name + beforeCommitID := c.Params(":before") + afterCommitID := c.Params(":after") + + commit, err := c.Repo.GitRepo.CatFileCommit(afterCommitID) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get head commit") + return + } + + diff, err := gitx.RepoDiff(c.Repo.GitRepo, + afterCommitID, conf.Git.MaxDiffFiles, conf.Git.MaxDiffLines, conf.Git.MaxDiffLineChars, + git.DiffOptions{Base: beforeCommitID, Timeout: time.Duration(conf.Git.Timeout.Diff) * time.Second}, + ) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get diff") + return + } + + commits, err := commit.CommitsAfter(beforeCommitID) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get commits after") + return + } + + c.Data["IsSplitStyle"] = c.Query("style") == "split" + c.Data["CommitRepoLink"] = c.Repo.RepoLink + c.Data["Commits"] = matchUsersWithCommitEmails(c.Req.Context(), commits) + c.Data["CommitsCount"] = len(commits) + c.Data["BeforeCommitID"] = beforeCommitID + c.Data["AfterCommitID"] = afterCommitID + c.Data["Username"] = userName + c.Data["Reponame"] = repoName + c.Data["IsImageFile"] = commit.IsImageFile + c.Data["IsImageFileByIndex"] = commit.IsImageFileByIndex + c.Data["Title"] = "Comparing " + tool.ShortSHA1(beforeCommitID) + "..." + tool.ShortSHA1(afterCommitID) + " · " + userName + "/" + repoName + c.Data["Commit"] = commit + c.Data["Diff"] = diff + c.Data["DiffNotAvailable"] = diff.NumFiles() == 0 + c.Data["SourcePath"] = conf.Server.Subpath + "/" + path.Join(userName, repoName, "src", afterCommitID) + c.Data["RawPath"] = conf.Server.Subpath + "/" + path.Join(userName, repoName, "raw", afterCommitID) + c.Data["BeforeSourcePath"] = conf.Server.Subpath + "/" + path.Join(userName, repoName, "src", beforeCommitID) + c.Data["BeforeRawPath"] = conf.Server.Subpath + "/" + path.Join(userName, repoName, "raw", beforeCommitID) + c.Success(DIFF) +} diff --git a/internal/route/repo/download.go b/internal/route/repo/download.go new file mode 100644 index 00000000000..3d8fff4248b --- /dev/null +++ b/internal/route/repo/download.go @@ -0,0 +1,58 @@ +package repo + +import ( + "net/http" + "path" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/tool" +) + +func serveData(c *context.Context, name string, data []byte) error { + commit, err := c.Repo.Commit.CommitByPath(git.CommitByRevisionOptions{Path: c.Repo.TreePath}) + if err != nil { + return errors.Newf("get commit by path %q: %v", c.Repo.TreePath, err) + } + c.Resp.Header().Set("Last-Modified", commit.Committer.When.Format(http.TimeFormat)) + + if !tool.IsTextFile(data) { + if !tool.IsImageFile(data) { + c.Resp.Header().Set("Content-Disposition", "attachment; filename=\""+name+"\"") + c.Resp.Header().Set("Content-Transfer-Encoding", "binary") + } + } else if !conf.Repository.EnableRawFileRenderMode || !c.QueryBool("render") { + c.Resp.Header().Set("Content-Type", "text/plain; charset=utf-8") + } + + if _, err := c.Resp.Write(data); err != nil { + return errors.Newf("write buffer to response: %v", err) + } + return nil +} + +func ServeBlob(c *context.Context, blob *git.Blob) error { + p, err := blob.Bytes() + if err != nil { + return err + } + + return serveData(c, path.Base(c.Repo.TreePath), p) +} + +func SingleDownload(c *context.Context) { + blob, err := c.Repo.Commit.Blob(c.Repo.TreePath) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get blob") + return + } + + if err = ServeBlob(c, blob); err != nil { + c.Error(err, "serve blob") + return + } +} diff --git a/internal/route/repo/editor.go b/internal/route/repo/editor.go new file mode 100644 index 00000000000..bef2c4d50d0 --- /dev/null +++ b/internal/route/repo/editor.go @@ -0,0 +1,579 @@ +package repo + +import ( + "fmt" + "net/http" + "path" + "slices" + "strings" + + "github.com/cockroachdb/errors" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/pathx" + "gogs.io/gogs/internal/template" + "gogs.io/gogs/internal/tool" +) + +const ( + tmplEditorEdit = "repo/editor/edit" + tmplEditorDiffPreview = "repo/editor/diff_preview" + tmplEditorDelete = "repo/editor/delete" + tmplEditorUpload = "repo/editor/upload" +) + +var errInternalServerError = errors.New("internal server error") + +// getParentTreeFields returns list of parent tree names and corresponding tree paths +// based on given tree path. +func getParentTreeFields(treePath string) (treeNames, treePaths []string) { + if treePath == "" { + 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(c *context.Context, isNewFile bool) { + c.PageIs("Edit") + c.RequireHighlightJS() + c.RequireSimpleMDE() + c.Data["IsNewFile"] = isNewFile + + treeNames, treePaths := getParentTreeFields(c.Repo.TreePath) + + if !isNewFile { + entry, err := c.Repo.Commit.TreeEntry(c.Repo.TreePath) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get tree entry") + return + } + + // No way to edit a directory online. + if entry.IsTree() { + c.NotFound() + return + } + + blob := entry.Blob() + p, err := blob.Bytes() + if err != nil { + c.Error(err, "get blob data") + return + } + + c.Data["FileSize"] = blob.Size() + c.Data["FileName"] = blob.Name() + + // Only text file are editable online. + if !tool.IsTextFile(p) { + c.NotFound() + return + } + + if content, err := template.ToUTF8WithErr(p); err != nil { + if err != nil { + log.Error("Failed to convert encoding to UTF-8: %v", err) + } + c.Data["FileContent"] = string(p) + } else { + c.Data["FileContent"] = content + } + } else { + treeNames = append(treeNames, "") // Append empty string to allow user name the new file. + } + + c.Data["ParentTreePath"] = path.Dir(c.Repo.TreePath) + c.Data["TreeNames"] = treeNames + c.Data["TreePaths"] = treePaths + c.Data["BranchLink"] = c.Repo.RepoLink + "/src/" + c.Repo.BranchName + c.Data["commit_summary"] = "" + c.Data["commit_message"] = "" + c.Data["commit_choice"] = "direct" + c.Data["new_branch_name"] = "" + c.Data["last_commit"] = c.Repo.Commit.ID + c.Data["MarkdownFileExts"] = strings.Join(conf.Markdown.FileExtensions, ",") + c.Data["LineWrapExtensions"] = strings.Join(conf.Repository.Editor.LineWrapExtensions, ",") + c.Data["PreviewableFileModes"] = strings.Join(conf.Repository.Editor.PreviewableFileModes, ",") + c.Data["EditorconfigURLPrefix"] = fmt.Sprintf("%s/api/v1/repos/%s/editorconfig/", conf.Server.Subpath, c.Repo.Repository.FullName()) + + c.Success(tmplEditorEdit) +} + +func EditFile(c *context.Context) { + editFile(c, false) +} + +func NewFile(c *context.Context) { + editFile(c, true) +} + +func editFilePost(c *context.Context, f form.EditRepoFile, isNewFile bool) { + c.PageIs("Edit") + c.RequireHighlightJS() + c.RequireSimpleMDE() + c.Data["IsNewFile"] = isNewFile + + oldBranchName := c.Repo.BranchName + branchName := oldBranchName + oldTreePath := c.Repo.TreePath + lastCommit := f.LastCommit + f.LastCommit = c.Repo.Commit.ID.String() + + if f.IsNewBrnach() { + branchName = f.NewBranchName + } + + // 🚨 SECURITY: Prevent path traversal. + f.TreePath = pathx.Clean(f.TreePath) + treeNames, treePaths := getParentTreeFields(f.TreePath) + + c.Data["ParentTreePath"] = path.Dir(c.Repo.TreePath) + c.Data["TreePath"] = f.TreePath + c.Data["TreeNames"] = treeNames + c.Data["TreePaths"] = treePaths + c.Data["BranchLink"] = c.Repo.RepoLink + "/src/" + branchName + c.Data["FileContent"] = f.Content + c.Data["commit_summary"] = f.CommitSummary + c.Data["commit_message"] = f.CommitMessage + c.Data["commit_choice"] = f.CommitChoice + c.Data["new_branch_name"] = branchName + c.Data["last_commit"] = f.LastCommit + c.Data["MarkdownFileExts"] = strings.Join(conf.Markdown.FileExtensions, ",") + c.Data["LineWrapExtensions"] = strings.Join(conf.Repository.Editor.LineWrapExtensions, ",") + c.Data["PreviewableFileModes"] = strings.Join(conf.Repository.Editor.PreviewableFileModes, ",") + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplEditorEdit) + return + } + + if f.TreePath == "" { + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.filename_cannot_be_empty"), http.StatusBadRequest, tmplEditorEdit, &f) + return + } + + if oldBranchName != branchName { + if _, err := c.Repo.Repository.GetBranch(branchName); err == nil { + c.FormErr("NewBranchName") + c.RenderWithErr(c.Tr("repo.editor.branch_already_exists", branchName), http.StatusUnprocessableEntity, tmplEditorEdit, &f) + return + } + } + + var newTreePath string + for index, part := range treeNames { + newTreePath = path.Join(newTreePath, part) + entry, err := c.Repo.Commit.TreeEntry(newTreePath) + if err != nil { + if gitx.IsErrRevisionNotExist(err) { + // Means there is no item with that name, so we're good + break + } + + c.Error(err, "get tree entry") + return + } + if index != len(treeNames)-1 { + if !entry.IsTree() { + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.directory_is_a_file", part), http.StatusUnprocessableEntity, tmplEditorEdit, &f) + return + } + } else { + // 🚨 SECURITY: Do not allow editing if the target file is a symlink. + if entry.IsSymlink() { + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.file_is_a_symlink", part), http.StatusUnprocessableEntity, tmplEditorEdit, &f) + return + } else if entry.IsTree() { + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.filename_is_a_directory", part), http.StatusUnprocessableEntity, tmplEditorEdit, &f) + return + } + } + } + + if !isNewFile { + entry, err := c.Repo.Commit.TreeEntry(oldTreePath) + if err != nil { + if gitx.IsErrRevisionNotExist(err) { + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.file_editing_no_longer_exists", oldTreePath), http.StatusNotFound, tmplEditorEdit, &f) + } else { + c.Error(err, "get tree entry") + } + return + } + + // 🚨 SECURITY: Do not allow editing if the old file is a symlink. + if entry.IsSymlink() { + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.file_is_a_symlink", oldTreePath), http.StatusUnprocessableEntity, tmplEditorEdit, &f) + return + } + + if lastCommit != c.Repo.CommitID { + files, err := c.Repo.Commit.FilesChangedAfter(lastCommit) + if err != nil { + c.Error(err, "get changed files") + return + } + + if slices.Contains(files, f.TreePath) { + c.RenderWithErr(c.Tr("repo.editor.file_changed_while_editing", c.Repo.RepoLink+"/compare/"+lastCommit+"..."+c.Repo.CommitID), http.StatusConflict, tmplEditorEdit, &f) + return + } + } + } + + if oldTreePath != f.TreePath { + // We have a new filename (rename or completely new file) so we need to make sure it doesn't already exist, can't clobber. + entry, err := c.Repo.Commit.TreeEntry(f.TreePath) + if err != nil { + if !gitx.IsErrRevisionNotExist(err) { + c.Error(err, "get tree entry") + return + } + } + if entry != nil { + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.file_already_exists", f.TreePath), http.StatusUnprocessableEntity, tmplEditorEdit, &f) + return + } + } + + message := strings.TrimSpace(f.CommitSummary) + if message == "" { + if isNewFile { + message = c.Tr("repo.editor.add", f.TreePath) + } else { + message = c.Tr("repo.editor.update", f.TreePath) + } + } + + f.CommitMessage = strings.TrimSpace(f.CommitMessage) + if len(f.CommitMessage) > 0 { + message += "\n\n" + f.CommitMessage + } + + if err := c.Repo.Repository.UpdateRepoFile(c.User, database.UpdateRepoFileOptions{ + OldBranch: oldBranchName, + NewBranch: branchName, + OldTreeName: oldTreePath, + NewTreeName: f.TreePath, + Message: message, + Content: strings.ReplaceAll(f.Content, "\r", ""), + IsNewFile: isNewFile, + }); err != nil { + log.Error("Failed to update repo file: %v", err) + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.fail_to_update_file", f.TreePath, errInternalServerError), http.StatusInternalServerError, tmplEditorEdit, &f) + return + } + + if f.IsNewBrnach() && c.Repo.PullRequest.Allowed { + c.Redirect(c.Repo.PullRequestURL(oldBranchName, f.NewBranchName)) + } else { + c.Redirect(c.Repo.RepoLink + "/src/" + branchName + "/" + f.TreePath) + } +} + +func EditFilePost(c *context.Context, f form.EditRepoFile) { + editFilePost(c, f, false) +} + +func NewFilePost(c *context.Context, f form.EditRepoFile) { + editFilePost(c, f, true) +} + +func DiffPreviewPost(c *context.Context, f form.EditPreviewDiff) { + // 🚨 SECURITY: Prevent path traversal. + treePath := pathx.Clean(c.Repo.TreePath) + + entry, err := c.Repo.Commit.TreeEntry(treePath) + if err != nil { + c.Error(err, "get tree entry") + return + } else if entry.IsTree() { + c.Status(http.StatusUnprocessableEntity) + return + } + + diff, err := c.Repo.Repository.GetDiffPreview(c.Repo.BranchName, treePath, f.Content) + if err != nil { + c.Error(err, "get diff preview") + return + } + + if diff.NumFiles() == 0 { + c.PlainText(http.StatusOK, c.Tr("repo.editor.no_changes_to_show")) + return + } + c.Data["File"] = diff.Files[0] + + c.Success(tmplEditorDiffPreview) +} + +func DeleteFile(c *context.Context) { + c.PageIs("Delete") + c.Data["BranchLink"] = c.Repo.RepoLink + "/src/" + c.Repo.BranchName + c.Data["TreePath"] = c.Repo.TreePath + c.Data["commit_summary"] = "" + c.Data["commit_message"] = "" + c.Data["commit_choice"] = "direct" + c.Data["new_branch_name"] = "" + c.Success(tmplEditorDelete) +} + +func DeleteFilePost(c *context.Context, f form.DeleteRepoFile) { + c.PageIs("Delete") + c.Data["BranchLink"] = c.Repo.RepoLink + "/src/" + c.Repo.BranchName + + // 🚨 SECURITY: Prevent path traversal. + c.Repo.TreePath = pathx.Clean(c.Repo.TreePath) + c.Data["TreePath"] = c.Repo.TreePath + + oldBranchName := c.Repo.BranchName + branchName := oldBranchName + + if f.IsNewBrnach() { + branchName = f.NewBranchName + } + c.Data["commit_summary"] = f.CommitSummary + c.Data["commit_message"] = f.CommitMessage + c.Data["commit_choice"] = f.CommitChoice + c.Data["new_branch_name"] = branchName + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplEditorDelete) + return + } + + if oldBranchName != branchName { + if _, err := c.Repo.Repository.GetBranch(branchName); err == nil { + c.FormErr("NewBranchName") + c.RenderWithErr(c.Tr("repo.editor.branch_already_exists", branchName), http.StatusUnprocessableEntity, tmplEditorDelete, &f) + return + } + } + + message := strings.TrimSpace(f.CommitSummary) + if message == "" { + message = c.Tr("repo.editor.delete", c.Repo.TreePath) + } + + f.CommitMessage = strings.TrimSpace(f.CommitMessage) + if len(f.CommitMessage) > 0 { + message += "\n\n" + f.CommitMessage + } + + if err := c.Repo.Repository.DeleteRepoFile(c.User, database.DeleteRepoFileOptions{ + LastCommitID: c.Repo.CommitID, + OldBranch: oldBranchName, + NewBranch: branchName, + TreePath: c.Repo.TreePath, + Message: message, + }); err != nil { + log.Error("Failed to delete repo file: %v", err) + c.RenderWithErr(c.Tr("repo.editor.fail_to_delete_file", c.Repo.TreePath, errInternalServerError), http.StatusInternalServerError, tmplEditorDelete, &f) + return + } + + if f.IsNewBrnach() && c.Repo.PullRequest.Allowed { + c.Redirect(c.Repo.PullRequestURL(oldBranchName, f.NewBranchName)) + } else { + c.Flash.Success(c.Tr("repo.editor.file_delete_success", c.Repo.TreePath)) + c.Redirect(c.Repo.RepoLink + "/src/" + branchName) + } +} + +func renderUploadSettings(c *context.Context) { + c.RequireDropzone() + c.Data["UploadAllowedTypes"] = strings.Join(conf.Repository.Upload.AllowedTypes, ",") + c.Data["UploadMaxSize"] = conf.Repository.Upload.FileMaxSize + c.Data["UploadMaxFiles"] = conf.Repository.Upload.MaxFiles +} + +func UploadFile(c *context.Context) { + c.PageIs("Upload") + renderUploadSettings(c) + + treeNames, treePaths := getParentTreeFields(c.Repo.TreePath) + if len(treeNames) == 0 { + // We must at least have one element for user to input. + treeNames = []string{""} + } + + c.Data["TreeNames"] = treeNames + c.Data["TreePaths"] = treePaths + c.Data["BranchLink"] = c.Repo.RepoLink + "/src/" + c.Repo.BranchName + c.Data["commit_summary"] = "" + c.Data["commit_message"] = "" + c.Data["commit_choice"] = "direct" + c.Data["new_branch_name"] = "" + c.Success(tmplEditorUpload) +} + +func UploadFilePost(c *context.Context, f form.UploadRepoFile) { + c.PageIs("Upload") + renderUploadSettings(c) + + oldBranchName := c.Repo.BranchName + branchName := oldBranchName + + if f.IsNewBrnach() { + branchName = f.NewBranchName + } + + // 🚨 SECURITY: Prevent path traversal. + f.TreePath = pathx.Clean(f.TreePath) + treeNames, treePaths := getParentTreeFields(f.TreePath) + if len(treeNames) == 0 { + // We must at least have one element for user to input. + treeNames = []string{""} + } + + c.Data["TreePath"] = f.TreePath + c.Data["TreeNames"] = treeNames + c.Data["TreePaths"] = treePaths + c.Data["BranchLink"] = c.Repo.RepoLink + "/src/" + branchName + c.Data["commit_summary"] = f.CommitSummary + c.Data["commit_message"] = f.CommitMessage + c.Data["commit_choice"] = f.CommitChoice + c.Data["new_branch_name"] = branchName + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplEditorUpload) + return + } + + if oldBranchName != branchName { + if _, err := c.Repo.Repository.GetBranch(branchName); err == nil { + c.FormErr("NewBranchName") + c.RenderWithErr(c.Tr("repo.editor.branch_already_exists", branchName), http.StatusUnprocessableEntity, tmplEditorUpload, &f) + return + } + } + + var newTreePath string + for _, part := range treeNames { + newTreePath = path.Join(newTreePath, part) + entry, err := c.Repo.Commit.TreeEntry(newTreePath) + if err != nil { + if gitx.IsErrRevisionNotExist(err) { + // Means there is no item with that name, so we're good + break + } + + c.Error(err, "get tree entry") + return + } + + // User can only upload files to a directory. + if !entry.IsTree() { + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.directory_is_a_file", part), http.StatusUnprocessableEntity, tmplEditorUpload, &f) + return + } + } + + message := strings.TrimSpace(f.CommitSummary) + if message == "" { + message = c.Tr("repo.editor.upload_files_to_dir", f.TreePath) + } + + f.CommitMessage = strings.TrimSpace(f.CommitMessage) + if len(f.CommitMessage) > 0 { + message += "\n\n" + f.CommitMessage + } + + if err := c.Repo.Repository.UploadRepoFiles(c.User, database.UploadRepoFileOptions{ + LastCommitID: c.Repo.CommitID, + OldBranch: oldBranchName, + NewBranch: branchName, + TreePath: f.TreePath, + Message: message, + Files: f.Files, + }); err != nil { + log.Error("Failed to upload files: %v", err) + c.FormErr("TreePath") + c.RenderWithErr(c.Tr("repo.editor.unable_to_upload_files", f.TreePath, errInternalServerError), http.StatusInternalServerError, tmplEditorUpload, &f) + return + } + + if f.IsNewBrnach() && c.Repo.PullRequest.Allowed { + c.Redirect(c.Repo.PullRequestURL(oldBranchName, f.NewBranchName)) + } else { + c.Redirect(c.Repo.RepoLink + "/src/" + branchName + "/" + f.TreePath) + } +} + +func UploadFileToServer(c *context.Context) { + file, header, err := c.Req.FormFile("file") + if err != nil { + c.Error(err, "get file") + return + } + defer file.Close() + + buf := make([]byte, 1024) + n, _ := file.Read(buf) + if n > 0 { + buf = buf[:n] + } + fileType := http.DetectContentType(buf) + + if len(conf.Repository.Upload.AllowedTypes) > 0 { + allowed := false + for _, t := range conf.Repository.Upload.AllowedTypes { + t := strings.Trim(t, " ") + if t == "*/*" || t == fileType { + allowed = true + break + } + } + + if !allowed { + c.PlainText(http.StatusBadRequest, ErrFileTypeForbidden.Error()) + return + } + } + + upload, err := database.NewUpload(header.Filename, buf, file) + if err != nil { + c.Error(err, "new upload") + return + } + + log.Trace("New file uploaded by user[%d]: %s", c.UserID(), upload.UUID) + c.JSONSuccess(map[string]string{ + "uuid": upload.UUID, + }) +} + +func RemoveUploadFileFromServer(c *context.Context, f form.RemoveUploadFile) { + if f.File == "" { + c.Status(http.StatusNoContent) + return + } + + if err := database.DeleteUploadByUUID(f.File); err != nil { + c.Error(err, "delete upload by UUID") + return + } + + log.Trace("Upload file removed: %s", f.File) + c.Status(http.StatusNoContent) +} diff --git a/internal/route/repo/http.go b/internal/route/repo/http.go new file mode 100644 index 00000000000..c27c54295bd --- /dev/null +++ b/internal/route/repo/http.go @@ -0,0 +1,456 @@ +package repo + +import ( + "bytes" + "compress/gzip" + "fmt" + "net/http" + "os" + "os/exec" + "path" + "path/filepath" + "strconv" + "strings" + "time" + + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/lazyregexp" + "gogs.io/gogs/internal/pathx" + "gogs.io/gogs/internal/tool" +) + +type HTTPContext struct { + *macaron.Context + OwnerName string + OwnerSalt string + RepoID int64 + RepoName string + AuthUser *database.User +} + +// askCredentials responses HTTP header and status which informs client to provide credentials. +func askCredentials(c *macaron.Context, status int, text string) { + c.Header().Set("WWW-Authenticate", "Basic realm=\".\"") + c.Error(status, text) +} + +// gitHTTPAction returns the Git HTTP path suffix after /:username/:reponame/. +func gitHTTPAction(c *macaron.Context) string { + return gitHTTPActionFromPath( + c.Req.URL.Path, + conf.Server.Subpath, + c.Params(":username"), + c.Params(":reponame"), + ) +} + +func gitHTTPActionFromPath(urlPath, subpath, owner, repo string) string { + if subpath != "" { + urlPath = strings.TrimPrefix(urlPath, subpath) + } + prefix := path.Join("/", owner, repo) + "/" + if after, ok := strings.CutPrefix(urlPath, prefix); ok { + return after + } + return "" +} + +func HTTPContexter(store Store) macaron.Handler { + return func(c *macaron.Context) { + if len(conf.HTTP.AccessControlAllowOrigin) > 0 { + c.Header().Set("Access-Control-Allow-Origin", conf.HTTP.AccessControlAllowOrigin) + c.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization, User-Agent") + if c.Req.Method == "OPTIONS" { + c.Status(http.StatusOK) + return + } + } + + ownerName := c.Params(":username") + repoName := strings.TrimSuffix(c.Params(":reponame"), ".git") + repoName = strings.TrimSuffix(repoName, ".wiki") + + isPull := c.Query("service") == "git-upload-pack" || + strings.HasSuffix(c.Req.URL.Path, "git-upload-pack") || + c.Req.Method == "GET" + + owner, err := store.GetUserByUsername(c.Req.Context(), ownerName) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Status(http.StatusNotFound) + } else { + c.Status(http.StatusInternalServerError) + log.Error("Failed to get user [name: %s]: %v", ownerName, err) + } + return + } + + repo, err := store.GetRepositoryByName(c.Req.Context(), owner.ID, repoName) + if err != nil { + if database.IsErrRepoNotExist(err) { + c.Status(http.StatusNotFound) + } else { + c.Status(http.StatusInternalServerError) + log.Error("Failed to get repository [owner_id: %d, name: %s]: %v", owner.ID, repoName, err) + } + return + } + + // Authentication is not required for pulling from public repositories. + if isPull && !repo.IsPrivate && !conf.Auth.RequireSigninView { + c.Map(&HTTPContext{ + Context: c, + }) + return + } + + // In case user requested a wrong URL and not intended to access Git objects. + action := gitHTTPAction(c) + if !strings.Contains(action, "git-") && + !strings.Contains(action, "info/") && + !strings.Contains(action, "HEAD") && + !strings.Contains(action, "objects/") { + c.Error(http.StatusBadRequest, fmt.Sprintf("Unrecognized action %q", action)) + return + } + + // Handle HTTP Basic Authentication + authHead := c.Req.Header.Get("Authorization") + if authHead == "" { + askCredentials(c, http.StatusUnauthorized, "") + return + } + + auths := strings.Fields(authHead) + if len(auths) != 2 || auths[0] != "Basic" { + askCredentials(c, http.StatusUnauthorized, "") + return + } + authUsername, authPassword, err := tool.BasicAuthDecode(auths[1]) + if err != nil { + askCredentials(c, http.StatusUnauthorized, "") + return + } + + authUser, err := store.AuthenticateUser(c.Req.Context(), authUsername, authPassword, -1) + if err != nil && !auth.IsErrBadCredentials(err) { + c.Status(http.StatusInternalServerError) + log.Error("Failed to authenticate user [name: %s]: %v", authUsername, err) + return + } + + // If username and password combination failed, try again using either username + // or password as the token. + if authUser == nil { + authUser, err = context.AuthenticateByToken(store, c.Req.Context(), authUsername) + if err != nil && !database.IsErrAccessTokenNotExist(err) { + c.Status(http.StatusInternalServerError) + log.Error("Failed to authenticate by access token via username: %v", err) + return + } else if database.IsErrAccessTokenNotExist(err) { + // Try again using the password field as the token. + authUser, err = context.AuthenticateByToken(store, c.Req.Context(), authPassword) + if err != nil { + if database.IsErrAccessTokenNotExist(err) { + askCredentials(c, http.StatusUnauthorized, "") + } else { + c.Status(http.StatusInternalServerError) + log.Error("Failed to authenticate by access token via password: %v", err) + } + return + } + } + } else if store.IsTwoFactorEnabled(c.Req.Context(), authUser.ID) { + askCredentials(c, http.StatusUnauthorized, `User with two-factor authentication enabled cannot perform HTTP/HTTPS operations via plain username and password +Please create and use personal access token on user settings page`) + return + } + + log.Trace("[Git] Authenticated user: %s", authUser.Name) + + mode := database.AccessModeWrite + if isPull { + mode = database.AccessModeRead + } + if !database.Handle.Permissions().Authorize(c.Req.Context(), authUser.ID, repo.ID, mode, + database.AccessModeOptions{ + OwnerID: repo.OwnerID, + Private: repo.IsPrivate, + }, + ) { + askCredentials(c, http.StatusForbidden, "User permission denied") + return + } + + if !isPull && repo.IsMirror { + c.Error(http.StatusForbidden, "Mirror repository is read-only") + return + } + + c.Map(&HTTPContext{ + Context: c, + OwnerName: ownerName, + OwnerSalt: owner.Salt, + RepoID: repo.ID, + RepoName: repoName, + AuthUser: authUser, + }) + } +} + +type serviceHandler struct { + w http.ResponseWriter + r *http.Request + dir string + file string + + authUser *database.User + ownerName string + ownerSalt string + repoID int64 + repoName string +} + +func (h *serviceHandler) setHeaderNoCache() { + h.w.Header().Set("Expires", "Fri, 01 Jan 1980 00:00:00 GMT") + h.w.Header().Set("Pragma", "no-cache") + h.w.Header().Set("Cache-Control", "no-cache, max-age=0, must-revalidate") +} + +func (h *serviceHandler) setHeaderCacheForever() { + now := time.Now().Unix() + expires := now + 31536000 + h.w.Header().Set("Date", fmt.Sprintf("%d", now)) + h.w.Header().Set("Expires", fmt.Sprintf("%d", expires)) + h.w.Header().Set("Cache-Control", "public, max-age=31536000") +} + +func (h *serviceHandler) sendFile(contentType string) { + reqFile := path.Join(h.dir, h.file) + fi, err := os.Stat(reqFile) + if os.IsNotExist(err) { + h.w.WriteHeader(http.StatusNotFound) + return + } + + h.w.Header().Set("Content-Type", contentType) + h.w.Header().Set("Content-Length", fmt.Sprintf("%d", fi.Size())) + h.w.Header().Set("Last-Modified", fi.ModTime().Format(http.TimeFormat)) + http.ServeFile(h.w, h.r, reqFile) +} + +func serviceRPC(h serviceHandler, service string) { + defer h.r.Body.Close() + + if h.r.Header.Get("Content-Type") != fmt.Sprintf("application/x-git-%s-request", service) { + h.w.WriteHeader(http.StatusUnauthorized) + return + } + h.w.Header().Set("Content-Type", fmt.Sprintf("application/x-git-%s-result", service)) + + var ( + reqBody = h.r.Body + err error + ) + + // Handle GZIP + if h.r.Header.Get("Content-Encoding") == "gzip" { + reqBody, err = gzip.NewReader(reqBody) + if err != nil { + log.Error("HTTP.Get: fail to create gzip reader: %v", err) + h.w.WriteHeader(http.StatusInternalServerError) + return + } + } + + var stderr bytes.Buffer + cmd := exec.Command("git", service, "--stateless-rpc", h.dir) + if service == "receive-pack" { + cmd.Env = append(os.Environ(), database.ComposeHookEnvs(database.ComposeHookEnvsOptions{ + AuthUser: h.authUser, + OwnerName: h.ownerName, + OwnerSalt: h.ownerSalt, + RepoID: h.repoID, + RepoName: h.repoName, + RepoPath: h.dir, + })...) + } + cmd.Dir = h.dir + cmd.Stdout = h.w + cmd.Stderr = &stderr + cmd.Stdin = reqBody + if err = cmd.Run(); err != nil { + log.Error("HTTP.serviceRPC: fail to serve RPC '%s': %v - %s", service, err, stderr.String()) + h.w.WriteHeader(http.StatusInternalServerError) + return + } +} + +func serviceUploadPack(h serviceHandler) { + serviceRPC(h, "upload-pack") +} + +func serviceReceivePack(h serviceHandler) { + serviceRPC(h, "receive-pack") +} + +func getServiceType(r *http.Request) string { + serviceType := r.FormValue("service") + if !strings.HasPrefix(serviceType, "git-") { + return "" + } + return strings.TrimPrefix(serviceType, "git-") +} + +// FIXME: use process module +func gitCommand(dir string, args ...string) []byte { + cmd := exec.Command("git", args...) + cmd.Dir = dir + out, err := cmd.Output() + if err != nil { + log.Error("Git: %v - %s", err, out) + } + return out +} + +func updateServerInfo(dir string) []byte { + return gitCommand(dir, "update-server-info") +} + +func packetWrite(str string) []byte { + s := strconv.FormatInt(int64(len(str)+4), 16) + if len(s)%4 != 0 { + s = strings.Repeat("0", 4-len(s)%4) + s + } + return []byte(s + str) +} + +func getInfoRefs(h serviceHandler) { + h.setHeaderNoCache() + service := getServiceType(h.r) + if service != "upload-pack" && service != "receive-pack" { + updateServerInfo(h.dir) + h.sendFile("text/plain; charset=utf-8") + return + } + + refs := gitCommand(h.dir, service, "--stateless-rpc", "--advertise-refs", ".") + h.w.Header().Set("Content-Type", fmt.Sprintf("application/x-git-%s-advertisement", service)) + h.w.WriteHeader(http.StatusOK) + _, _ = h.w.Write(packetWrite("# service=git-" + service + "\n")) + _, _ = h.w.Write([]byte("0000")) + _, _ = h.w.Write(refs) +} + +func getTextFile(h serviceHandler) { + h.setHeaderNoCache() + h.sendFile("text/plain") +} + +func getInfoPacks(h serviceHandler) { + h.setHeaderCacheForever() + h.sendFile("text/plain; charset=utf-8") +} + +func getLooseObject(h serviceHandler) { + h.setHeaderCacheForever() + h.sendFile("application/x-git-loose-object") +} + +func getPackFile(h serviceHandler) { + h.setHeaderCacheForever() + h.sendFile("application/x-git-packed-objects") +} + +func getIdxFile(h serviceHandler) { + h.setHeaderCacheForever() + h.sendFile("application/x-git-packed-objects-toc") +} + +var routes = []struct { + re *lazyregexp.Regexp + method string + handler func(serviceHandler) +}{ + {lazyregexp.New("(.*?)/git-upload-pack$"), "POST", serviceUploadPack}, + {lazyregexp.New("(.*?)/git-receive-pack$"), "POST", serviceReceivePack}, + {lazyregexp.New("(.*?)/info/refs$"), "GET", getInfoRefs}, + {lazyregexp.New("(.*?)/HEAD$"), "GET", getTextFile}, + {lazyregexp.New("(.*?)/objects/info/alternates$"), "GET", getTextFile}, + {lazyregexp.New("(.*?)/objects/info/http-alternates$"), "GET", getTextFile}, + {lazyregexp.New("(.*?)/objects/info/packs$"), "GET", getInfoPacks}, + {lazyregexp.New("(.*?)/objects/info/[^/]*$"), "GET", getTextFile}, + {lazyregexp.New("(.*?)/objects/[0-9a-f]{2}/[0-9a-f]{38}$"), "GET", getLooseObject}, + {lazyregexp.New("(.*?)/objects/pack/pack-[0-9a-f]{40}\\.pack$"), "GET", getPackFile}, + {lazyregexp.New("(.*?)/objects/pack/pack-[0-9a-f]{40}\\.idx$"), "GET", getIdxFile}, +} + +func getGitRepoPath(dir string) (string, error) { + if !strings.HasSuffix(dir, ".git") { + dir += ".git" + } + + filename := filepath.Join(conf.Repository.Root, dir) + if _, err := os.Stat(filename); os.IsNotExist(err) { + return "", err + } + + return filename, nil +} + +func HTTP(c *HTTPContext) { + for _, route := range routes { + reqPath := strings.ToLower(c.Req.URL.Path) + m := route.re.FindStringSubmatch(reqPath) + if m == nil { + continue + } + + if conf.Repository.DisableHTTPGit { + c.Error(http.StatusForbidden, "Interacting with repositories by HTTP protocol is disabled") + return + } + + if route.method != c.Req.Method { + c.Error(http.StatusNotFound) + return + } + + // 🚨 SECURITY: Prevent path traversal. + cleaned := pathx.Clean(m[1]) + if m[1] != "/"+cleaned { + c.Error(http.StatusBadRequest, "Request path contains suspicious characters") + return + } + + file := strings.TrimPrefix(reqPath, cleaned) + dir, err := getGitRepoPath(cleaned) + if err != nil { + log.Warn("HTTP.getGitRepoPath: %v", err) + c.Error(http.StatusNotFound) + return + } + + route.handler(serviceHandler{ + w: c.Resp, + r: c.Req.Request, + dir: dir, + file: file, + + authUser: c.AuthUser, + ownerName: c.OwnerName, + ownerSalt: c.OwnerSalt, + repoID: c.RepoID, + repoName: c.RepoName, + }) + return + } + + c.Error(http.StatusNotFound) +} diff --git a/internal/route/repo/http_test.go b/internal/route/repo/http_test.go new file mode 100644 index 00000000000..50c0ce81539 --- /dev/null +++ b/internal/route/repo/http_test.go @@ -0,0 +1,75 @@ +package repo + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGitHTTPActionFromPath(t *testing.T) { + tests := []struct { + name string + urlPath string + subpath string + owner string + repo string + want string + }{ + { + name: "info refs", + urlPath: "/owner/repo/info/refs", + owner: "owner", + repo: "repo", + want: "info/refs", + }, + { + name: "git suffix repo", + urlPath: "/owner/repo.git/git-receive-pack", + owner: "owner", + repo: "repo.git", + want: "git-receive-pack", + }, + { + name: "head", + urlPath: "/owner/repo/HEAD", + owner: "owner", + repo: "repo", + want: "HEAD", + }, + { + name: "objects info wildcard", + urlPath: "/owner/repo/objects/info/exclude", + owner: "owner", + repo: "repo", + want: "objects/info/exclude", + }, + { + name: "loose object", + urlPath: "/owner/repo/objects/ab/cdef0123456789abcdef0123456789abcdef", + owner: "owner", + repo: "repo", + want: "objects/ab/cdef0123456789abcdef0123456789abcdef", + }, + { + name: "with subpath", + urlPath: "/gogs/owner/repo/info/refs", + subpath: "/gogs", + owner: "owner", + repo: "repo", + want: "info/refs", + }, + { + name: "non git suffix", + urlPath: "/owner/repo/src/main.go", + owner: "owner", + repo: "repo", + want: "src/main.go", + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got := gitHTTPActionFromPath(tc.urlPath, tc.subpath, tc.owner, tc.repo) + assert.Equal(t, tc.want, got) + }) + } +} diff --git a/internal/route/repo/issue.go b/internal/route/repo/issue.go new file mode 100644 index 00000000000..8d444405080 --- /dev/null +++ b/internal/route/repo/issue.go @@ -0,0 +1,1272 @@ +package repo + +import ( + "fmt" + "net/http" + "net/url" + "slices" + "strconv" + "strings" + "time" + + "github.com/cockroachdb/errors" + "github.com/unknwon/paginater" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/tool" +) + +const ( + tmplRepoIssueList = "repo/issue/list" + tmplRepoIssueNew = "repo/issue/new" + tmplRepoIssueView = "repo/issue/view" + tmplRepoIssueLabels = "repo/issue/labels" + tmplRepoIssueMilestones = "repo/issue/milestones" + tmplRepoIssueMilestoneNew = "repo/issue/milestone_new" + tmplRepoIssueMilestoneEdit = "repo/issue/milestone_edit" + + IssueTemplateKey = "IssueTemplate" +) + +var ( + ErrFileTypeForbidden = errors.New("file type is not allowed") + ErrTooManyFiles = errors.New("maximum number of files to upload exceeded") + + IssueTemplateCandidates = []string{ + "ISSUE_TEMPLATE.md", + ".gogs/ISSUE_TEMPLATE.md", + ".github/ISSUE_TEMPLATE.md", + } +) + +func MustEnableIssues(c *context.Context) { + if !c.Repo.Repository.EnableIssues { + c.NotFound() + return + } + + if c.Repo.Repository.EnableExternalTracker { + c.Redirect(c.Repo.Repository.ExternalTrackerURL) + return + } +} + +func MustAllowPulls(c *context.Context) { + if !c.Repo.Repository.AllowsPulls() { + c.NotFound() + return + } + + // User can send pull request if owns a forked repository. + if c.IsLogged && database.Handle.Repositories().HasForkedBy(c.Req.Context(), c.Repo.Repository.ID, c.User.ID) { + c.Repo.PullRequest.Allowed = true + c.Repo.PullRequest.HeadInfo = c.User.Name + ":" + c.Repo.BranchName + } +} + +func RetrieveLabels(c *context.Context) { + labels, err := database.GetLabelsByRepoID(c.Repo.Repository.ID) + if err != nil { + c.Error(err, "get labels by repository ID") + return + } + for _, l := range labels { + l.CalOpenIssues() + } + c.Data["Labels"] = labels + c.Data["NumLabels"] = len(labels) +} + +func issues(c *context.Context, isPullList bool) { + if isPullList { + MustAllowPulls(c) + if c.Written() { + return + } + c.Data["Title"] = c.Tr("repo.pulls") + c.Data["PageIsPullList"] = true + + } else { + MustEnableIssues(c) + if c.Written() { + return + } + c.Data["Title"] = c.Tr("repo.issues") + c.Data["PageIsIssueList"] = true + } + + viewType := c.Query("type") + sortType := c.Query("sort") + types := []string{"assigned", "created_by", "mentioned"} + if !slices.Contains(types, viewType) { + viewType = "all" + } + + // Must sign in to see issues about you. + if viewType != "all" && !c.IsLogged { + c.SetCookie("redirect_to", "/"+url.QueryEscape(conf.Server.Subpath+c.Req.RequestURI), 0, conf.Server.Subpath) + c.Redirect(conf.Server.Subpath + "/user/sign-in") + return + } + + var ( + assigneeID = c.QueryInt64("assignee") + posterID int64 + ) + filterMode := database.FilterModeYourRepos + switch viewType { + case "assigned": + filterMode = database.FilterModeAssign + assigneeID = c.User.ID + case "created_by": + filterMode = database.FilterModeCreate + posterID = c.User.ID + case "mentioned": + filterMode = database.FilterModeMention + } + + var uid int64 = -1 + if c.IsLogged { + uid = c.User.ID + } + + repo := c.Repo.Repository + selectLabels := c.Query("labels") + milestoneID := c.QueryInt64("milestone") + isShowClosed := c.Query("state") == "closed" + issueStats := database.GetIssueStats(&database.IssueStatsOptions{ + RepoID: repo.ID, + UserID: uid, + Labels: selectLabels, + MilestoneID: milestoneID, + AssigneeID: assigneeID, + FilterMode: filterMode, + IsPull: isPullList, + }) + + page := max(c.QueryInt("page"), 1) + + var total int + if !isShowClosed { + total = int(issueStats.OpenCount) + } else { + total = int(issueStats.ClosedCount) + } + pager := paginater.New(total, conf.UI.IssuePagingNum, page, 5) + c.Data["Page"] = pager + + issues, err := database.Issues(&database.IssuesOptions{ + UserID: uid, + AssigneeID: assigneeID, + RepoID: repo.ID, + PosterID: posterID, + MilestoneID: milestoneID, + Page: pager.Current(), + IsClosed: isShowClosed, + IsMention: filterMode == database.FilterModeMention, + IsPull: isPullList, + Labels: selectLabels, + SortType: sortType, + }) + if err != nil { + c.Error(err, "list issues") + return + } + + // Get issue-user relations. + pairs, err := database.GetIssueUsers(repo.ID, posterID, isShowClosed) + if err != nil { + c.Error(err, "get issue-user relations") + return + } + + // Get posters. + for i := range issues { + if !c.IsLogged { + issues[i].IsRead = true + continue + } + + // Check read status. + idx := database.PairsContains(pairs, issues[i].ID, c.User.ID) + if idx > -1 { + issues[i].IsRead = pairs[idx].IsRead + } else { + issues[i].IsRead = true + } + } + c.Data["Issues"] = issues + + // Get milestones. + c.Data["Milestones"], err = database.GetMilestonesByRepoID(repo.ID) + if err != nil { + c.Error(err, "get milestone by repository ID") + return + } + + // Get assignees. + c.Data["Assignees"], err = repo.GetAssignees() + if err != nil { + c.Error(err, "get assignees") + return + } + + if viewType == "assigned" { + assigneeID = 0 // Reset ID to prevent unexpected selection of assignee. + } + + c.Data["IssueStats"] = issueStats + selectLabelsInt, _ := strconv.ParseInt(selectLabels, 10, 64) + c.Data["SelectLabels"] = selectLabelsInt + c.Data["ViewType"] = viewType + c.Data["SortType"] = sortType + c.Data["MilestoneID"] = milestoneID + c.Data["AssigneeID"] = assigneeID + c.Data["IsShowClosed"] = isShowClosed + if isShowClosed { + c.Data["State"] = "closed" + } else { + c.Data["State"] = "open" + } + + c.Success(tmplRepoIssueList) +} + +func Issues(c *context.Context) { + issues(c, false) +} + +func Pulls(c *context.Context) { + issues(c, true) +} + +func renderAttachmentSettings(c *context.Context) { + c.Data["RequireDropzone"] = true + c.Data["IsAttachmentEnabled"] = conf.Attachment.Enabled + c.Data["AttachmentAllowedTypes"] = conf.Attachment.AllowedTypes + c.Data["AttachmentMaxSize"] = conf.Attachment.MaxSize + c.Data["AttachmentMaxFiles"] = conf.Attachment.MaxFiles +} + +func RetrieveRepoMilestonesAndAssignees(c *context.Context, repo *database.Repository) { + var err error + c.Data["OpenMilestones"], err = database.GetMilestones(repo.ID, -1, false) + if err != nil { + c.Error(err, "get open milestones") + return + } + c.Data["ClosedMilestones"], err = database.GetMilestones(repo.ID, -1, true) + if err != nil { + c.Error(err, "get closed milestones") + return + } + + c.Data["Assignees"], err = repo.GetAssignees() + if err != nil { + c.Error(err, "get assignees") + return + } +} + +func RetrieveRepoMetas(c *context.Context, repo *database.Repository) []*database.Label { + if !c.Repo.IsWriter() { + return nil + } + + labels, err := database.GetLabelsByRepoID(repo.ID) + if err != nil { + c.Error(err, "get labels by repository ID") + return nil + } + c.Data["Labels"] = labels + + RetrieveRepoMilestonesAndAssignees(c, repo) + if c.Written() { + return nil + } + + return labels +} + +func getFileContentFromDefaultBranch(c *context.Context, filename string) (string, bool) { + if c.Repo.Commit == nil { + var err error + c.Repo.Commit, err = c.Repo.GitRepo.BranchCommit(c.Repo.Repository.DefaultBranch) + if err != nil { + return "", false + } + } + + entry, err := c.Repo.Commit.TreeEntry(filename) + if err != nil { + return "", false + } + p, err := entry.Blob().Bytes() + if err != nil { + return "", false + } + return string(p), true +} + +func setTemplateIfExists(c *context.Context, ctxDataKey string, possibleFiles []string) { + for _, filename := range possibleFiles { + content, found := getFileContentFromDefaultBranch(c, filename) + if found { + c.Data[ctxDataKey] = content + return + } + } +} + +func NewIssue(c *context.Context) { + c.Data["Title"] = c.Tr("repo.issues.new") + c.Data["PageIsIssueList"] = true + c.Data["RequireHighlightJS"] = true + c.Data["RequireSimpleMDE"] = true + c.Data["title"] = c.Query("title") + c.Data["content"] = c.Query("content") + setTemplateIfExists(c, IssueTemplateKey, IssueTemplateCandidates) + renderAttachmentSettings(c) + + RetrieveRepoMetas(c, c.Repo.Repository) + if c.Written() { + return + } + + c.Success(tmplRepoIssueNew) +} + +func ValidateRepoMetas(c *context.Context, f form.NewIssue) ([]int64, int64, int64) { + var ( + repo = c.Repo.Repository + err error + ) + + labels := RetrieveRepoMetas(c, c.Repo.Repository) + if c.Written() { + return nil, 0, 0 + } + + if !c.Repo.IsWriter() { + return nil, 0, 0 + } + + // Check labels. + labelIDs := tool.StringsToInt64s(strings.Split(f.LabelIDs, ",")) + labelIDMark := tool.Int64sToMap(labelIDs) + hasSelected := false + for i := range labels { + if labelIDMark[labels[i].ID] { + labels[i].IsChecked = true + hasSelected = true + } + } + c.Data["HasSelectedLabel"] = hasSelected + c.Data["label_ids"] = f.LabelIDs + c.Data["Labels"] = labels + + // Check milestone. + milestoneID := f.MilestoneID + if milestoneID > 0 { + c.Data["Milestone"], err = repo.GetMilestoneByID(milestoneID) + if err != nil { + c.Error(err, "get milestone by ID") + return nil, 0, 0 + } + c.Data["milestone_id"] = milestoneID + } + + // Check assignee. + assigneeID := f.AssigneeID + if assigneeID > 0 { + c.Data["Assignee"], err = repo.GetAssigneeByID(assigneeID) + if err != nil { + c.Error(err, "get assignee by ID") + return nil, 0, 0 + } + c.Data["assignee_id"] = assigneeID + } + + return labelIDs, milestoneID, assigneeID +} + +func NewIssuePost(c *context.Context, f form.NewIssue) { + c.Data["Title"] = c.Tr("repo.issues.new") + c.Data["PageIsIssueList"] = true + c.Data["RequireHighlightJS"] = true + c.Data["RequireSimpleMDE"] = true + renderAttachmentSettings(c) + + labelIDs, milestoneID, assigneeID := ValidateRepoMetas(c, f) + if c.Written() { + return + } + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoIssueNew) + return + } + + var attachments []string + if conf.Attachment.Enabled { + attachments = f.Files + } + + issue := &database.Issue{ + RepoID: c.Repo.Repository.ID, + Title: f.Title, + PosterID: c.User.ID, + Poster: c.User, + MilestoneID: milestoneID, + AssigneeID: assigneeID, + Content: f.Content, + } + if err := database.NewIssue(c.Repo.Repository, issue, labelIDs, attachments); err != nil { + c.Error(err, "new issue") + return + } + + log.Trace("Issue created: %d/%d", c.Repo.Repository.ID, issue.ID) + c.RawRedirect(c.Repo.MakeURL(fmt.Sprintf("issues/%d", issue.Index))) +} + +func uploadAttachment(c *context.Context, allowedTypes []string) { + file, header, err := c.Req.FormFile("file") + if err != nil { + c.Error(err, "get file") + return + } + defer file.Close() + + buf := make([]byte, 1024) + n, _ := file.Read(buf) + if n > 0 { + buf = buf[:n] + } + fileType := http.DetectContentType(buf) + + allowed := false + for _, t := range allowedTypes { + t := strings.Trim(t, " ") + if t == "*/*" || t == fileType { + allowed = true + break + } + } + + if !allowed { + c.PlainText(http.StatusBadRequest, ErrFileTypeForbidden.Error()) + return + } + + attach, err := database.NewAttachment(header.Filename, buf, file) + if err != nil { + c.Error(err, "new attachment") + return + } + + log.Trace("New attachment uploaded: %s", attach.UUID) + c.JSONSuccess(map[string]string{ + "uuid": attach.UUID, + }) +} + +func UploadIssueAttachment(c *context.Context) { + if !conf.Attachment.Enabled { + c.NotFound() + return + } + + uploadAttachment(c, conf.Attachment.AllowedTypes) +} + +func viewIssue(c *context.Context, isPullList bool) { + c.Data["RequireHighlightJS"] = true + c.Data["RequireDropzone"] = true + renderAttachmentSettings(c) + + index := c.ParamsInt64(":index") + if index <= 0 { + c.NotFound() + return + } + + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, index) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return + } + c.Data["Title"] = issue.Title + + // Make sure type and URL matches. + if !isPullList && issue.IsPull { + c.RawRedirect(c.Repo.MakeURL(fmt.Sprintf("pulls/%d", issue.Index))) + return + } else if isPullList && !issue.IsPull { + c.RawRedirect(c.Repo.MakeURL(fmt.Sprintf("issues/%d", issue.Index))) + return + } + + if issue.IsPull { + MustAllowPulls(c) + if c.Written() { + return + } + c.Data["PageIsPullList"] = true + c.Data["PageIsPullConversation"] = true + } else { + MustEnableIssues(c) + if c.Written() { + return + } + c.Data["PageIsIssueList"] = true + } + + issue.RenderedContent = string(markup.Markdown(issue.Content, c.Repo.RepoLink, c.Repo.Repository.ComposeMetas())) + + repo := c.Repo.Repository + + // Get more information if it's a pull request. + if issue.IsPull { + if issue.PullRequest.HasMerged { + c.Data["DisableStatusChange"] = issue.PullRequest.HasMerged + PrepareMergedViewPullInfo(c, issue) + } else { + PrepareViewPullInfo(c, issue) + } + if c.Written() { + return + } + } + + // Metas. + // Check labels. + labelIDMark := make(map[int64]bool) + for i := range issue.Labels { + labelIDMark[issue.Labels[i].ID] = true + } + labels, err := database.GetLabelsByRepoID(repo.ID) + if err != nil { + c.Error(err, "get labels by repository ID") + return + } + hasSelected := false + for i := range labels { + if labelIDMark[labels[i].ID] { + labels[i].IsChecked = true + hasSelected = true + } + } + c.Data["HasSelectedLabel"] = hasSelected + c.Data["Labels"] = labels + + // Check milestone and assignee. + if c.Repo.IsWriter() { + RetrieveRepoMilestonesAndAssignees(c, repo) + if c.Written() { + return + } + } + + if c.IsLogged { + // Update issue-user. + if err = issue.ReadBy(c.User.ID); err != nil { + c.Error(err, "mark read by") + return + } + } + + var ( + tag database.CommentTag + ok bool + marked = make(map[int64]database.CommentTag) + comment *database.Comment + participants = make([]*database.User, 1, 10) + ) + + // Render comments and fetch participants. + participants[0] = issue.Poster + for _, comment = range issue.Comments { + if comment.Type == database.CommentTypeComment { + comment.RenderedContent = string(markup.Markdown(comment.Content, c.Repo.RepoLink, c.Repo.Repository.ComposeMetas())) + + // Check tag. + tag, ok = marked[comment.PosterID] + if ok { + comment.ShowTag = tag + continue + } + + if repo.IsOwnedBy(comment.PosterID) || + (repo.Owner.IsOrganization() && repo.Owner.IsOwnedBy(comment.PosterID)) { + comment.ShowTag = database.CommentTagOwner + } else if database.Handle.Permissions().Authorize( + c.Req.Context(), + comment.PosterID, + repo.ID, + database.AccessModeWrite, + database.AccessModeOptions{ + OwnerID: repo.OwnerID, + Private: repo.IsPrivate, + }, + ) { + comment.ShowTag = database.CommentTagWriter + } else if comment.PosterID == issue.PosterID { + comment.ShowTag = database.CommentTagPoster + } + + marked[comment.PosterID] = comment.ShowTag + + isAdded := slices.Contains(participants, comment.Poster) + if !isAdded && !issue.IsPoster(comment.Poster.ID) { + participants = append(participants, comment.Poster) + } + } + } + + if issue.IsPull && issue.PullRequest.HasMerged { + pull := issue.PullRequest + branchProtected := false + protectBranch, err := database.GetProtectBranchOfRepoByName(pull.BaseRepoID, pull.HeadBranch) + if err != nil { + if !database.IsErrBranchNotExist(err) { + c.Error(err, "get protect branch of repository by name") + return + } + } else { + branchProtected = protectBranch.Protected + } + + c.Data["IsPullBranchDeletable"] = pull.BaseRepoID == pull.HeadRepoID && + c.Repo.IsWriter() && c.Repo.GitRepo.HasBranch(pull.HeadBranch) && + !branchProtected + + c.Data["DeleteBranchLink"] = c.Repo.MakeURL(url.URL{ + Path: "branches/delete/" + pull.HeadBranch, + RawQuery: fmt.Sprintf("commit=%s&redirect_to=%s", pull.MergedCommitID, c.Data["Link"]), + }) + } + + c.Data["Participants"] = participants + c.Data["NumParticipants"] = len(participants) + c.Data["Issue"] = issue + c.Data["IsIssueOwner"] = c.Repo.IsWriter() || (c.IsLogged && issue.IsPoster(c.User.ID)) + c.Data["SignInLink"] = conf.Server.Subpath + "/user/sign-in?redirect_to=" + c.Data["Link"].(string) + c.Success(tmplRepoIssueView) +} + +func ViewIssue(c *context.Context) { + viewIssue(c, false) +} + +func ViewPull(c *context.Context) { + viewIssue(c, true) +} + +func getActionIssue(c *context.Context) *database.Issue { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return nil + } + + // Prevent guests accessing pull requests + if !c.Repo.HasAccess() && issue.IsPull { + c.NotFound() + return nil + } + + return issue +} + +func UpdateIssueTitle(c *context.Context) { + issue := getActionIssue(c) + if c.Written() { + return + } + + if !c.IsLogged || (!issue.IsPoster(c.User.ID) && !c.Repo.IsWriter()) { + c.Status(http.StatusForbidden) + return + } + + title := c.QueryTrim("title") + if title == "" { + c.Status(http.StatusNoContent) + return + } + + if err := issue.ChangeTitle(c.User, title); err != nil { + c.Error(err, "change title") + return + } + + c.JSONSuccess(map[string]any{ + "title": issue.Title, + }) +} + +func UpdateIssueContent(c *context.Context) { + issue := getActionIssue(c) + if c.Written() { + return + } + + if !c.IsLogged || (c.User.ID != issue.PosterID && !c.Repo.IsWriter()) { + c.Status(http.StatusForbidden) + return + } + + content := c.Query("content") + if err := issue.ChangeContent(c.User, content); err != nil { + c.Error(err, "change content") + return + } + + c.JSONSuccess(map[string]string{ + "content": string(markup.Markdown(issue.Content, c.Query("context"), c.Repo.Repository.ComposeMetas())), + }) +} + +func UpdateIssueLabel(c *context.Context) { + issue := getActionIssue(c) + if c.Written() { + return + } + + if c.Query("action") == "clear" { + if err := issue.ClearLabels(c.User); err != nil { + c.Error(err, "clear labels") + return + } + } else { + isAttach := c.Query("action") == "attach" + label, err := database.GetLabelOfRepoByID(c.Repo.Repository.ID, c.QueryInt64("id")) + if err != nil { + c.NotFoundOrError(err, "get label by ID") + return + } + + if isAttach && !issue.HasLabel(label.ID) { + if err = issue.AddLabel(c.User, label); err != nil { + c.Error(err, "add label") + return + } + } else if !isAttach && issue.HasLabel(label.ID) { + if err = issue.RemoveLabel(c.User, label); err != nil { + c.Error(err, "remove label") + return + } + } + } + + c.JSONSuccess(map[string]any{ + "ok": true, + }) +} + +func UpdateIssueMilestone(c *context.Context) { + issue := getActionIssue(c) + if c.Written() { + return + } + + oldMilestoneID := issue.MilestoneID + milestoneID := c.QueryInt64("id") + if oldMilestoneID == milestoneID { + c.JSONSuccess(map[string]any{ + "ok": true, + }) + return + } + + // Not check for invalid milestone id and give responsibility to owners. + issue.MilestoneID = milestoneID + if err := database.ChangeMilestoneAssign(c.User, issue, oldMilestoneID); err != nil { + c.Error(err, "change milestone assign") + return + } + + c.JSONSuccess(map[string]any{ + "ok": true, + }) +} + +func UpdateIssueAssignee(c *context.Context) { + issue := getActionIssue(c) + if c.Written() { + return + } + + assigneeID := c.QueryInt64("id") + if issue.AssigneeID == assigneeID { + c.JSONSuccess(map[string]any{ + "ok": true, + }) + return + } + + if err := issue.ChangeAssignee(c.User, assigneeID); err != nil { + c.Error(err, "change assignee") + return + } + + c.JSONSuccess(map[string]any{ + "ok": true, + }) +} + +func NewComment(c *context.Context, f form.CreateComment) { + issue := getActionIssue(c) + if c.Written() { + return + } + + var attachments []string + if conf.Attachment.Enabled { + attachments = f.Files + } + + if c.HasError() { + c.Flash.Error(c.Data["ErrorMsg"].(string)) + c.RawRedirect(c.Repo.MakeURL(fmt.Sprintf("issues/%d", issue.Index))) + return + } + + var err error + var comment *database.Comment + defer func() { + // Check if issue admin/poster changes the status of issue. + if (c.Repo.IsWriter() || (c.IsLogged && issue.IsPoster(c.User.ID))) && + (f.Status == "reopen" || f.Status == "close") && + !(issue.IsPull && issue.PullRequest.HasMerged) { + + // Duplication and conflict check should apply to reopen pull request. + var pr *database.PullRequest + + if f.Status == "reopen" && issue.IsPull { + pull := issue.PullRequest + pr, err = database.GetUnmergedPullRequest(pull.HeadRepoID, pull.BaseRepoID, pull.HeadBranch, pull.BaseBranch) + if err != nil { + if !database.IsErrPullRequestNotExist(err) { + c.Error(err, "get unmerged pull request") + return + } + } + + // Regenerate patch and test conflict. + if pr == nil { + if err = issue.PullRequest.UpdatePatch(); err != nil { + c.Error(err, "update patch") + return + } + + issue.PullRequest.AddToTaskQueue() + } + } + + if pr != nil { + c.Flash.Info(c.Tr("repo.pulls.open_unmerged_pull_exists", pr.Index)) + } else { + if err = issue.ChangeStatus(c.User, c.Repo.Repository, f.Status == "close"); err != nil { + log.Error("ChangeStatus: %v", err) + } else { + log.Trace("Issue [%d] status changed to closed: %v", issue.ID, issue.IsClosed) + } + } + } + + // Redirect to comment hashtag if there is any actual content. + typeName := "issues" + if issue.IsPull { + typeName = "pulls" + } + + location := url.URL{ + Path: fmt.Sprintf("%s/%d", typeName, issue.Index), + } + + if comment != nil { + location.Fragment = comment.HashTag() + } + + c.RawRedirect(c.Repo.MakeURL(location)) + }() + + // Fix #321: Allow empty comments, as long as we have attachments. + if f.Content == "" && len(attachments) == 0 { + return + } + + comment, err = database.CreateIssueComment(c.User, c.Repo.Repository, issue, f.Content, attachments) + if err != nil { + c.Error(err, "create issue comment") + return + } + + log.Trace("Comment created: %d/%d/%d", c.Repo.Repository.ID, issue.ID, comment.ID) +} + +func UpdateCommentContent(c *context.Context) { + comment, err := database.GetCommentByID(c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get comment by ID") + return + } + + issue, err := database.GetIssueByID(comment.IssueID) + if err != nil { + c.NotFoundOrError(err, "get issue by ID") + return + } + + if issue.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + + if c.UserID() != comment.PosterID && !c.Repo.IsAdmin() { + c.NotFound() + return + } else if comment.Type != database.CommentTypeComment { + c.Status(http.StatusNoContent) + return + } + + oldContent := comment.Content + comment.Content = c.Query("content") + if comment.Content == "" { + c.JSONSuccess(map[string]any{ + "content": "", + }) + return + } + if err = database.UpdateComment(c.User, comment, oldContent); err != nil { + c.Error(err, "update comment") + return + } + + c.JSONSuccess(map[string]string{ + "content": string(markup.Markdown(comment.Content, c.Query("context"), c.Repo.Repository.ComposeMetas())), + }) +} + +func DeleteComment(c *context.Context) { + comment, err := database.GetCommentByID(c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get comment by ID") + return + } + + issue, err := database.GetIssueByID(comment.IssueID) + if err != nil { + c.NotFoundOrError(err, "get issue by ID") + return + } + + if issue.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + + if c.UserID() != comment.PosterID && !c.Repo.IsAdmin() { + c.NotFound() + return + } else if comment.Type != database.CommentTypeComment { + c.Status(http.StatusNoContent) + return + } + + if err = database.DeleteCommentByID(c.User, comment.ID); err != nil { + c.Error(err, "delete comment by ID") + return + } + + c.Status(http.StatusOK) +} + +func Labels(c *context.Context) { + c.Data["Title"] = c.Tr("repo.labels") + c.Data["PageIsIssueList"] = true + c.Data["PageIsLabels"] = true + c.Data["RequireMinicolors"] = true + c.Data["LabelTemplates"] = database.LabelTemplates + c.Success(tmplRepoIssueLabels) +} + +func InitializeLabels(c *context.Context, f form.InitializeLabels) { + if c.HasError() { + c.RawRedirect(c.Repo.MakeURL("labels")) + return + } + list, err := database.GetLabelTemplateFile(f.TemplateName) + if err != nil { + c.Flash.Error(c.Tr("repo.issues.label_templates.fail_to_load_file", f.TemplateName, err)) + c.RawRedirect(c.Repo.MakeURL("labels")) + return + } + + labels := make([]*database.Label, len(list)) + for i := range list { + labels[i] = &database.Label{ + RepoID: c.Repo.Repository.ID, + Name: list[i][0], + Color: list[i][1], + } + } + if err := database.NewLabels(labels...); err != nil { + c.Error(err, "new labels") + return + } + c.RawRedirect(c.Repo.MakeURL("labels")) +} + +func NewLabel(c *context.Context, f form.CreateLabel) { + c.Data["Title"] = c.Tr("repo.labels") + c.Data["PageIsLabels"] = true + + if c.HasError() { + c.Flash.Error(c.Data["ErrorMsg"].(string)) + c.RawRedirect(c.Repo.MakeURL("labels")) + return + } + + l := &database.Label{ + RepoID: c.Repo.Repository.ID, + Name: f.Title, + Color: f.Color, + } + if err := database.NewLabels(l); err != nil { + c.Error(err, "new labels") + return + } + c.RawRedirect(c.Repo.MakeURL("labels")) +} + +func UpdateLabel(c *context.Context, f form.CreateLabel) { + l, err := database.GetLabelOfRepoByID(c.Repo.Repository.ID, f.ID) + if err != nil { + c.NotFoundOrError(err, "get label of repository by ID") + return + } + + l.Name = f.Title + l.Color = f.Color + if err := database.UpdateLabel(l); err != nil { + c.Error(err, "update label") + return + } + c.RawRedirect(c.Repo.MakeURL("labels")) +} + +func DeleteLabel(c *context.Context) { + if err := database.DeleteLabel(c.Repo.Repository.ID, c.QueryInt64("id")); err != nil { + c.Flash.Error("DeleteLabel: " + err.Error()) + } else { + c.Flash.Success(c.Tr("repo.issues.label_deletion_success")) + } + + c.JSONSuccess(map[string]any{ + "redirect": c.Repo.MakeURL("labels"), + }) +} + +func Milestones(c *context.Context) { + c.Data["Title"] = c.Tr("repo.milestones") + c.Data["PageIsIssueList"] = true + c.Data["PageIsMilestones"] = true + + isShowClosed := c.Query("state") == "closed" + openCount, closedCount := database.MilestoneStats(c.Repo.Repository.ID) + c.Data["OpenCount"] = openCount + c.Data["ClosedCount"] = closedCount + + page := max(c.QueryInt("page"), 1) + + var total int + if !isShowClosed { + total = int(openCount) + } else { + total = int(closedCount) + } + c.Data["Page"] = paginater.New(total, conf.UI.IssuePagingNum, page, 5) + + miles, err := database.GetMilestones(c.Repo.Repository.ID, page, isShowClosed) + if err != nil { + c.Error(err, "get milestones") + return + } + for _, m := range miles { + m.NumOpenIssues = int(m.CountIssues(false, false)) + m.NumClosedIssues = int(m.CountIssues(true, false)) + if m.NumOpenIssues+m.NumClosedIssues > 0 { + m.Completeness = m.NumClosedIssues * 100 / (m.NumOpenIssues + m.NumClosedIssues) + } + m.RenderedContent = string(markup.Markdown(m.Content, c.Repo.RepoLink, c.Repo.Repository.ComposeMetas())) + } + c.Data["Milestones"] = miles + + if isShowClosed { + c.Data["State"] = "closed" + } else { + c.Data["State"] = "open" + } + + c.Data["IsShowClosed"] = isShowClosed + c.Success(tmplRepoIssueMilestones) +} + +func NewMilestone(c *context.Context) { + c.Data["Title"] = c.Tr("repo.milestones.new") + c.Data["PageIsIssueList"] = true + c.Data["PageIsMilestones"] = true + c.Data["RequireDatetimepicker"] = true + c.Data["DateLang"] = conf.I18n.DateLang(c.Language()) + c.Success(tmplRepoIssueMilestoneNew) +} + +func NewMilestonePost(c *context.Context, f form.CreateMilestone) { + c.Data["Title"] = c.Tr("repo.milestones.new") + c.Data["PageIsIssueList"] = true + c.Data["PageIsMilestones"] = true + c.Data["RequireDatetimepicker"] = true + c.Data["DateLang"] = conf.I18n.DateLang(c.Language()) + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoIssueMilestoneNew) + return + } + + if f.Deadline == "" { + f.Deadline = "9999-12-31" + } + deadline, err := time.ParseInLocation("2006-01-02", f.Deadline, time.Local) + if err != nil { + c.Data["Err_Deadline"] = true + c.RenderWithErr(c.Tr("repo.milestones.invalid_due_date_format"), http.StatusBadRequest, tmplRepoIssueMilestoneNew, &f) + return + } + + if err = database.NewMilestone(&database.Milestone{ + RepoID: c.Repo.Repository.ID, + Name: f.Title, + Content: f.Content, + Deadline: deadline, + }); err != nil { + c.Error(err, "new milestone") + return + } + + c.Flash.Success(c.Tr("repo.milestones.create_success", f.Title)) + c.RawRedirect(c.Repo.MakeURL("milestones")) +} + +func EditMilestone(c *context.Context) { + c.Data["Title"] = c.Tr("repo.milestones.edit") + c.Data["PageIsMilestones"] = true + c.Data["PageIsEditMilestone"] = true + c.Data["RequireDatetimepicker"] = true + c.Data["DateLang"] = conf.I18n.DateLang(c.Language()) + + m, err := database.GetMilestoneByRepoID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get milestone by repository ID") + return + } + c.Data["title"] = m.Name + c.Data["content"] = m.Content + if len(m.DeadlineString) > 0 { + c.Data["deadline"] = m.DeadlineString + } + c.Success(tmplRepoIssueMilestoneNew) +} + +func EditMilestonePost(c *context.Context, f form.CreateMilestone) { + c.Data["Title"] = c.Tr("repo.milestones.edit") + c.Data["PageIsMilestones"] = true + c.Data["PageIsEditMilestone"] = true + c.Data["RequireDatetimepicker"] = true + c.Data["DateLang"] = conf.I18n.DateLang(c.Language()) + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoIssueMilestoneNew) + return + } + + if f.Deadline == "" { + f.Deadline = "9999-12-31" + } + deadline, err := time.ParseInLocation("2006-01-02", f.Deadline, time.Local) + if err != nil { + c.Data["Err_Deadline"] = true + c.RenderWithErr(c.Tr("repo.milestones.invalid_due_date_format"), http.StatusBadRequest, tmplRepoIssueMilestoneNew, &f) + return + } + + m, err := database.GetMilestoneByRepoID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get milestone by repository ID") + return + } + m.Name = f.Title + m.Content = f.Content + m.Deadline = deadline + if err = database.UpdateMilestone(m); err != nil { + c.Error(err, "update milestone") + return + } + + c.Flash.Success(c.Tr("repo.milestones.edit_success", m.Name)) + c.RawRedirect(c.Repo.MakeURL("milestones")) +} + +func ChangeMilestonStatus(c *context.Context) { + m, err := database.GetMilestoneByRepoID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get milestone by repository ID") + return + } + + location := url.URL{ + Path: "milestones", + } + + switch c.Params(":action") { + case "open": + if m.IsClosed { + if err = database.ChangeMilestoneStatus(m, false); err != nil { + c.Error(err, "change milestone status to open") + return + } + } + location.RawQuery = "state=open" + case "close": + if !m.IsClosed { + m.ClosedDate = time.Now() + if err = database.ChangeMilestoneStatus(m, true); err != nil { + c.Error(err, "change milestone status to closed") + return + } + } + location.RawQuery = "state=closed" + } + + c.RawRedirect(c.Repo.MakeURL(location)) +} + +func DeleteMilestone(c *context.Context) { + if err := database.DeleteMilestoneOfRepoByID(c.Repo.Repository.ID, c.QueryInt64("id")); err != nil { + c.Flash.Error("DeleteMilestoneByRepoID: " + err.Error()) + } else { + c.Flash.Success(c.Tr("repo.milestones.deletion_success")) + } + + c.JSONSuccess(map[string]any{ + "redirect": c.Repo.MakeURL("milestones"), + }) +} diff --git a/internal/route/repo/pull.go b/internal/route/repo/pull.go new file mode 100644 index 00000000000..a606f850c94 --- /dev/null +++ b/internal/route/repo/pull.go @@ -0,0 +1,756 @@ +package repo + +import ( + "net/http" + "path" + "strconv" + "strings" + "time" + + log "unknwon.dev/clog/v2" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/gitx" +) + +const ( + tmplRepoPullsFork = "repo/pulls/fork" + tmplRepoPullsCompare = "repo/pulls/compare" + tmplRepoPullsCommits = "repo/pulls/commits" + tmplRepoPullsFiles = "repo/pulls/files" + + PullRequestTemplateKey = "PullRequestTemplate" + PullRequestTitleTemplateKey = "PullRequestTitleTemplate" +) + +var ( + PullRequestTemplateCandidates = []string{ + "PULL_REQUEST.md", + ".gogs/PULL_REQUEST.md", + ".github/PULL_REQUEST.md", + } + + PullRequestTitleTemplateCandidates = []string{ + "PULL_REQUEST_TITLE.md", + ".gogs/PULL_REQUEST_TITLE.md", + ".github/PULL_REQUEST_TITLE.md", + } +) + +func parseBaseRepository(c *context.Context) *database.Repository { + baseRepo, err := database.GetRepositoryByID(c.ParamsInt64(":repoid")) + if err != nil { + c.NotFoundOrError(err, "get repository by ID") + return nil + } + + if !baseRepo.CanBeForked() || !baseRepo.HasAccess(c.User.ID) { + c.NotFound() + return nil + } + + c.Data["repo_name"] = baseRepo.Name + c.Data["description"] = baseRepo.Description + c.Data["IsPrivate"] = baseRepo.IsPrivate + c.Data["IsUnlisted"] = baseRepo.IsUnlisted + + if err = baseRepo.GetOwner(); err != nil { + c.Error(err, "get owner") + return nil + } + c.Data["ForkFrom"] = baseRepo.Owner.Name + "/" + baseRepo.Name + + orgs, err := database.Handle.Organizations().List( + c.Req.Context(), + database.ListOrgsOptions{ + MemberID: c.User.ID, + IncludePrivateMembers: true, + }, + ) + if err != nil { + c.Error(err, "list organizations") + return nil + } + c.Data["Orgs"] = orgs + + return baseRepo +} + +func Fork(c *context.Context) { + c.Data["Title"] = c.Tr("new_fork") + + parseBaseRepository(c) + if c.Written() { + return + } + + c.Data["ContextUser"] = c.User + c.Success(tmplRepoPullsFork) +} + +func ForkPost(c *context.Context, f form.CreateRepo) { + c.Data["Title"] = c.Tr("new_fork") + + baseRepo := parseBaseRepository(c) + if c.Written() { + return + } + + ctxUser := checkContextUser(c, f.UserID) + if c.Written() { + return + } + c.Data["ContextUser"] = ctxUser + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoPullsFork) + return + } + + repo, has, err := database.HasForkedRepo(ctxUser.ID, baseRepo.ID) + if err != nil { + c.Error(err, "check forked repository") + return + } else if has { + c.Redirect(repo.Link()) + return + } + + // Check ownership of organization. + if ctxUser.IsOrganization() && !ctxUser.IsOwnedBy(c.User.ID) { + c.Status(http.StatusForbidden) + return + } + + // Cannot fork to same owner + if ctxUser.ID == baseRepo.OwnerID { + c.RenderWithErr(c.Tr("repo.settings.cannot_fork_to_same_owner"), http.StatusUnprocessableEntity, tmplRepoPullsFork, &f) + return + } + + repo, err = database.ForkRepository(c.User, ctxUser, baseRepo, f.RepoName, f.Description) + if err != nil { + c.Data["Err_RepoName"] = true + switch { + case database.IsErrReachLimitOfRepo(err): + c.RenderWithErr(c.Tr("repo.form.reach_limit_of_creation", err.(database.ErrReachLimitOfRepo).Limit), http.StatusForbidden, tmplRepoPullsFork, &f) + case database.IsErrRepoAlreadyExist(err): + c.RenderWithErr(c.Tr("repo.settings.new_owner_has_same_repo"), http.StatusUnprocessableEntity, tmplRepoPullsFork, &f) + case database.IsErrNameNotAllowed(err): + c.RenderWithErr(c.Tr("repo.form.name_not_allowed", err.(database.ErrNameNotAllowed).Value()), http.StatusBadRequest, tmplRepoPullsFork, &f) + default: + c.Error(err, "fork repository") + } + return + } + + log.Trace("Repository forked from '%s' -> '%s'", baseRepo.FullName(), repo.FullName()) + c.Redirect(repo.Link()) +} + +func checkPullInfo(c *context.Context) *database.Issue { + issue, err := database.GetIssueByIndex(c.Repo.Repository.ID, c.ParamsInt64(":index")) + if err != nil { + c.NotFoundOrError(err, "get issue by index") + return nil + } + c.Data["Title"] = issue.Title + c.Data["Issue"] = issue + + if !issue.IsPull { + c.NotFound() + return nil + } + + if c.IsLogged { + // Update issue-user. + if err = issue.ReadBy(c.User.ID); err != nil { + c.Error(err, "mark read by") + return nil + } + } + + return issue +} + +func PrepareMergedViewPullInfo(c *context.Context, issue *database.Issue) { + pull := issue.PullRequest + c.Data["HasMerged"] = true + c.Data["HeadTarget"] = issue.PullRequest.HeadUserName + "/" + pull.HeadBranch + c.Data["BaseTarget"] = c.Repo.Owner.Name + "/" + pull.BaseBranch + + var err error + c.Data["NumCommits"], err = c.Repo.GitRepo.RevListCount([]string{pull.MergeBase + "..." + pull.MergedCommitID}) + if err != nil { + c.Error(err, "count commits") + return + } + + names, err := c.Repo.GitRepo.DiffNameOnly(pull.MergeBase, pull.MergedCommitID, git.DiffNameOnlyOptions{NeedsMergeBase: true}) + c.Data["NumFiles"] = len(names) + if err != nil { + c.Error(err, "get changed files") + return + } +} + +func PrepareViewPullInfo(c *context.Context, issue *database.Issue) *gitx.PullRequestMeta { + repo := c.Repo.Repository + pull := issue.PullRequest + + c.Data["HeadTarget"] = pull.HeadUserName + "/" + pull.HeadBranch + c.Data["BaseTarget"] = c.Repo.Owner.Name + "/" + pull.BaseBranch + + var ( + headGitRepo *git.Repository + err error + ) + + if pull.HeadRepo != nil { + headGitRepo, err = git.Open(pull.HeadRepo.RepoPath()) + if err != nil { + c.Error(err, "open repository") + return nil + } + } + + if pull.HeadRepo == nil || !headGitRepo.HasBranch(pull.HeadBranch) { + c.Data["IsPullReuqestBroken"] = true + c.Data["HeadTarget"] = "deleted" + c.Data["NumCommits"] = 0 + c.Data["NumFiles"] = 0 + return nil + } + + baseRepoPath := database.RepoPath(repo.Owner.Name, repo.Name) + prMeta, err := gitx.Module.PullRequestMeta(headGitRepo.Path(), baseRepoPath, pull.HeadBranch, pull.BaseBranch) + if err != nil { + if strings.Contains(err.Error(), "fatal: Not a valid object name") { + c.Data["IsPullReuqestBroken"] = true + c.Data["BaseTarget"] = "deleted" + c.Data["NumCommits"] = 0 + c.Data["NumFiles"] = 0 + return nil + } + + c.Error(err, "get pull request meta") + return nil + } + c.Data["NumCommits"] = len(prMeta.Commits) + c.Data["NumFiles"] = prMeta.NumFiles + return prMeta +} + +func ViewPullCommits(c *context.Context) { + c.Data["PageIsPullList"] = true + c.Data["PageIsPullCommits"] = true + + issue := checkPullInfo(c) + if c.Written() { + return + } + pull := issue.PullRequest + + if pull.HeadRepo != nil { + c.Data["Username"] = pull.HeadUserName + c.Data["Reponame"] = pull.HeadRepo.Name + } + + var commits []*git.Commit + if pull.HasMerged { + PrepareMergedViewPullInfo(c, issue) + if c.Written() { + return + } + startCommit, err := c.Repo.GitRepo.CatFileCommit(pull.MergeBase) + if err != nil { + c.Error(err, "get commit of merge base") + return + } + endCommit, err := c.Repo.GitRepo.CatFileCommit(pull.MergedCommitID) + if err != nil { + c.Error(err, "get merged commit") + return + } + commits, err = c.Repo.GitRepo.RevList([]string{startCommit.ID.String() + "..." + endCommit.ID.String()}) + if err != nil { + c.Error(err, "list commits") + return + } + + } else { + prInfo := PrepareViewPullInfo(c, issue) + if c.Written() { + return + } else if prInfo == nil { + c.NotFound() + return + } + commits = prInfo.Commits + } + + c.Data["Commits"] = matchUsersWithCommitEmails(c.Req.Context(), commits) + c.Data["CommitsCount"] = len(commits) + + c.Success(tmplRepoPullsCommits) +} + +func ViewPullFiles(c *context.Context) { + c.Data["PageIsPullList"] = true + c.Data["PageIsPullFiles"] = true + + issue := checkPullInfo(c) + if c.Written() { + return + } + pull := issue.PullRequest + + var ( + diffGitRepo *git.Repository + startCommitID string + endCommitID string + gitRepo *git.Repository + ) + + if pull.HasMerged { + PrepareMergedViewPullInfo(c, issue) + if c.Written() { + return + } + + diffGitRepo = c.Repo.GitRepo + startCommitID = pull.MergeBase + endCommitID = pull.MergedCommitID + gitRepo = c.Repo.GitRepo + } else { + prInfo := PrepareViewPullInfo(c, issue) + if c.Written() { + return + } else if prInfo == nil { + c.NotFound() + return + } + + headRepoPath := database.RepoPath(pull.HeadUserName, pull.HeadRepo.Name) + + headGitRepo, err := git.Open(headRepoPath) + if err != nil { + c.Error(err, "open repository") + return + } + + headCommitID, err := headGitRepo.BranchCommitID(pull.HeadBranch) + if err != nil { + c.Error(err, "get head branch commit ID") + return + } + + diffGitRepo = headGitRepo + startCommitID = prInfo.MergeBase + endCommitID = headCommitID + gitRepo = headGitRepo + } + + diff, err := gitx.RepoDiff(diffGitRepo, + endCommitID, conf.Git.MaxDiffFiles, conf.Git.MaxDiffLines, conf.Git.MaxDiffLineChars, + git.DiffOptions{Base: startCommitID, Timeout: time.Duration(conf.Git.Timeout.Diff) * time.Second}, + ) + if err != nil { + c.Error(err, "get diff") + return + } + c.Data["Diff"] = diff + c.Data["DiffNotAvailable"] = diff.NumFiles() == 0 + + commit, err := gitRepo.CatFileCommit(endCommitID) + if err != nil { + c.Error(err, "get commit") + return + } + + setEditorconfigIfExists(c) + if c.Written() { + return + } + + c.Data["IsSplitStyle"] = c.Query("style") == "split" + c.Data["IsImageFile"] = commit.IsImageFile + c.Data["IsImageFileByIndex"] = commit.IsImageFileByIndex + + // It is possible head repo has been deleted for merged pull requests + if pull.HeadRepo != nil { + c.Data["Username"] = pull.HeadUserName + c.Data["Reponame"] = pull.HeadRepo.Name + + headTarget := path.Join(pull.HeadUserName, pull.HeadRepo.Name) + c.Data["SourcePath"] = conf.Server.Subpath + "/" + path.Join(headTarget, "src", endCommitID) + c.Data["RawPath"] = conf.Server.Subpath + "/" + path.Join(headTarget, "raw", endCommitID) + c.Data["BeforeSourcePath"] = conf.Server.Subpath + "/" + path.Join(headTarget, "src", startCommitID) + c.Data["BeforeRawPath"] = conf.Server.Subpath + "/" + path.Join(headTarget, "raw", startCommitID) + } + + c.Data["RequireHighlightJS"] = true + c.Success(tmplRepoPullsFiles) +} + +func MergePullRequest(c *context.Context) { + issue := checkPullInfo(c) + if c.Written() { + return + } + if issue.IsClosed { + c.NotFound() + return + } + + pr, err := database.GetPullRequestByIssueID(issue.ID) + if err != nil { + c.NotFoundOrError(err, "get pull request by issue ID") + return + } + + if !pr.CanAutoMerge() || pr.HasMerged { + c.NotFound() + return + } + + pr.Issue = issue + pr.Issue.Repo = c.Repo.Repository + if err = pr.Merge(c.User, c.Repo.GitRepo, database.MergeStyle(c.Query("merge_style")), c.Query("commit_description")); err != nil { + c.Error(err, "merge") + return + } + + log.Trace("Pull request merged: %d", pr.ID) + c.Redirect(c.Repo.RepoLink + "/pulls/" + strconv.FormatInt(pr.Index, 10)) +} + +func ParseCompareInfo(c *context.Context) (*database.User, *database.Repository, *git.Repository, *gitx.PullRequestMeta, string, string) { + baseRepo := c.Repo.Repository + + // Get compared refs information + // format: ...[:] + // base<-head: master...head:feature + // same repo: master...feature + infos := strings.Split(c.Params("*"), "...") + if len(infos) != 2 { + log.Trace("ParseCompareInfo[%d]: not enough compared refs information %s", baseRepo.ID, infos) + c.NotFound() + return nil, nil, nil, nil, "", "" + } + + baseRef := infos[0] + c.Data["BaseBranch"] = baseRef + + var ( + headUser *database.User + headRef string + isSameRepo bool + err error + ) + + // If there is no head repository, it means pull request between same repository. + headInfos := strings.Split(infos[1], ":") + if len(headInfos) == 1 { + isSameRepo = true + headUser = c.Repo.Owner + headRef = headInfos[0] + + } else if len(headInfos) == 2 { + headUser, err = database.Handle.Users().GetByUsername(c.Req.Context(), headInfos[0]) + if err != nil { + c.NotFoundOrError(err, "get user by name") + return nil, nil, nil, nil, "", "" + } + headRef = headInfos[1] + isSameRepo = headUser.ID == baseRepo.OwnerID + + } else { + c.NotFound() + return nil, nil, nil, nil, "", "" + } + c.Data["HeadUser"] = headUser + c.Data["HeadBranch"] = headRef + c.Repo.PullRequest.SameRepo = isSameRepo + + // Check if base ref is valid. + if _, err := c.Repo.GitRepo.RevParse(baseRef); err != nil { + c.NotFound() + return nil, nil, nil, nil, "", "" + } + + var ( + headRepo *database.Repository + headGitRepo *git.Repository + ) + + // In case user included redundant head user name for comparison in same repository, + // no need to check the fork relation. + if !isSameRepo { + var has bool + headRepo, has, err = database.HasForkedRepo(headUser.ID, baseRepo.ID) + if err != nil { + c.Error(err, "get forked repository") + return nil, nil, nil, nil, "", "" + } else if !has { + log.Trace("ParseCompareInfo [base_repo_id: %d]: does not have fork or in same repository", baseRepo.ID) + c.NotFound() + return nil, nil, nil, nil, "", "" + } + + headGitRepo, err = git.Open(database.RepoPath(headUser.Name, headRepo.Name)) + if err != nil { + c.Error(err, "open repository") + return nil, nil, nil, nil, "", "" + } + } else { + headRepo = c.Repo.Repository + headGitRepo = c.Repo.GitRepo + } + + if !database.Handle.Permissions().Authorize( + c.Req.Context(), + c.User.ID, + headRepo.ID, + database.AccessModeWrite, + database.AccessModeOptions{ + OwnerID: headRepo.OwnerID, + Private: headRepo.IsPrivate, + }, + ) && !c.User.IsAdmin { + log.Trace("ParseCompareInfo [base_repo_id: %d]: does not have write access or site admin", baseRepo.ID) + c.NotFound() + return nil, nil, nil, nil, "", "" + } + + // Check if head ref is valid. + if _, err := headGitRepo.RevParse(headRef); err != nil { + c.NotFound() + return nil, nil, nil, nil, "", "" + } + + headBranches, err := headGitRepo.Branches() + if err != nil { + c.Error(err, "get branches") + return nil, nil, nil, nil, "", "" + } + c.Data["HeadBranches"] = headBranches + + baseRepoPath := database.RepoPath(baseRepo.Owner.Name, baseRepo.Name) + meta, err := gitx.Module.PullRequestMeta(headGitRepo.Path(), baseRepoPath, headRef, baseRef) + if err != nil { + if gitx.IsErrNoMergeBase(err) { + c.Data["IsNoMergeBase"] = true + c.Success(tmplRepoPullsCompare) + } else { + c.Error(err, "get pull request meta") + } + return nil, nil, nil, nil, "", "" + } + c.Data["BeforeCommitID"] = meta.MergeBase + + return headUser, headRepo, headGitRepo, meta, baseRef, headRef +} + +func PrepareCompareDiff( + c *context.Context, + headUser *database.User, + headRepo *database.Repository, + headGitRepo *git.Repository, + meta *gitx.PullRequestMeta, + headRef string, +) bool { + var ( + repo = c.Repo.Repository + err error + ) + + // Get diff information. + c.Data["CommitRepoLink"] = headRepo.Link() + + headCommitID, err := headGitRepo.RevParse(headRef) + if err != nil { + c.Error(err, "get head commit ID") + return false + } + c.Data["AfterCommitID"] = headCommitID + + if headCommitID == meta.MergeBase { + c.Data["IsNothingToCompare"] = true + return true + } + + diff, err := gitx.RepoDiff(headGitRepo, + headCommitID, conf.Git.MaxDiffFiles, conf.Git.MaxDiffLines, conf.Git.MaxDiffLineChars, + git.DiffOptions{Base: meta.MergeBase, Timeout: time.Duration(conf.Git.Timeout.Diff) * time.Second}, + ) + if err != nil { + c.Error(err, "get repository diff") + return false + } + c.Data["Diff"] = diff + c.Data["DiffNotAvailable"] = diff.NumFiles() == 0 + + headCommit, err := headGitRepo.CatFileCommit(headCommitID) + if err != nil { + c.Error(err, "get head commit") + return false + } + + c.Data["Commits"] = matchUsersWithCommitEmails(c.Req.Context(), meta.Commits) + c.Data["CommitCount"] = len(meta.Commits) + c.Data["Username"] = headUser.Name + c.Data["Reponame"] = headRepo.Name + c.Data["IsImageFile"] = headCommit.IsImageFile + c.Data["IsImageFileByIndex"] = headCommit.IsImageFileByIndex + + headTarget := path.Join(headUser.Name, repo.Name) + c.Data["SourcePath"] = conf.Server.Subpath + "/" + path.Join(headTarget, "src", headCommitID) + c.Data["RawPath"] = conf.Server.Subpath + "/" + path.Join(headTarget, "raw", headCommitID) + c.Data["BeforeSourcePath"] = conf.Server.Subpath + "/" + path.Join(headTarget, "src", meta.MergeBase) + c.Data["BeforeRawPath"] = conf.Server.Subpath + "/" + path.Join(headTarget, "raw", meta.MergeBase) + return false +} + +func CompareAndPullRequest(c *context.Context) { + c.Data["Title"] = c.Tr("repo.pulls.compare_changes") + c.Data["PageIsComparePull"] = true + c.Data["IsDiffCompare"] = true + c.Data["RequireHighlightJS"] = true + setTemplateIfExists(c, PullRequestTemplateKey, PullRequestTemplateCandidates) + renderAttachmentSettings(c) + + headUser, headRepo, headGitRepo, prInfo, baseRef, headRef := ParseCompareInfo(c) + if c.Written() { + return + } + + pr, err := database.GetUnmergedPullRequest(headRepo.ID, c.Repo.Repository.ID, headRef, baseRef) + if err != nil { + if !database.IsErrPullRequestNotExist(err) { + c.Error(err, "get unmerged pull request") + return + } + } else { + c.Data["HasPullRequest"] = true + c.Data["PullRequest"] = pr + c.Success(tmplRepoPullsCompare) + return + } + + nothingToCompare := PrepareCompareDiff(c, headUser, headRepo, headGitRepo, prInfo, headRef) + if c.Written() { + return + } + + if !nothingToCompare { + // Setup information for new form. + RetrieveRepoMetas(c, c.Repo.Repository) + if c.Written() { + return + } + } + + setEditorconfigIfExists(c) + if c.Written() { + return + } + + c.Data["IsSplitStyle"] = c.Query("style") == "split" + setTemplateIfExists(c, PullRequestTitleTemplateKey, PullRequestTitleTemplateCandidates) + + if c.Data[PullRequestTitleTemplateKey] != nil { + customTitle := c.Data[PullRequestTitleTemplateKey].(string) + r := strings.NewReplacer("{{headBranch}}", headRef, "{{baseBranch}}", baseRef) + c.Data["title"] = r.Replace(customTitle) + } + + c.Success(tmplRepoPullsCompare) +} + +func CompareAndPullRequestPost(c *context.Context, f form.NewIssue) { + c.Data["Title"] = c.Tr("repo.pulls.compare_changes") + c.Data["PageIsComparePull"] = true + c.Data["IsDiffCompare"] = true + c.Data["RequireHighlightJS"] = true + renderAttachmentSettings(c) + + var ( + repo = c.Repo.Repository + attachments []string + ) + + headUser, headRepo, headGitRepo, meta, baseRef, headRef := ParseCompareInfo(c) + if c.Written() { + return + } + + labelIDs, milestoneID, assigneeID := ValidateRepoMetas(c, f) + if c.Written() { + return + } + + if conf.Attachment.Enabled { + attachments = f.Files + } + + if c.HasError() { + form.Assign(f, c.Data) + + // This stage is already stop creating new pull request, so it does not matter if it has + // something to compare or not. + PrepareCompareDiff(c, headUser, headRepo, headGitRepo, meta, headRef) + if c.Written() { + return + } + + c.HTML(http.StatusBadRequest, tmplRepoPullsCompare) + return + } + + patch, err := headGitRepo.DiffBinary(meta.MergeBase, headRef) + if err != nil { + c.Error(err, "get patch") + return + } + + pullIssue := &database.Issue{ + RepoID: repo.ID, + Index: repo.NextIssueIndex(), + Title: f.Title, + PosterID: c.User.ID, + Poster: c.User, + MilestoneID: milestoneID, + AssigneeID: assigneeID, + IsPull: true, + Content: f.Content, + } + pullRequest := &database.PullRequest{ + HeadRepoID: headRepo.ID, + BaseRepoID: repo.ID, + HeadUserName: headUser.Name, + HeadBranch: headRef, + BaseBranch: baseRef, + HeadRepo: headRepo, + BaseRepo: repo, + MergeBase: meta.MergeBase, + Type: database.PullRequestTypeGogs, + } + // FIXME: check error in the case two people send pull request at almost same time, give nice error prompt + // instead of 500. + if err := database.NewPullRequest(repo, pullIssue, labelIDs, attachments, pullRequest, patch); err != nil { + c.Error(err, "new pull request") + return + } else if err := pullRequest.PushToBaseRepo(); err != nil { + c.Error(err, "push to base repository") + return + } + + log.Trace("Pull request created: %d/%d", repo.ID, pullIssue.ID) + c.Redirect(c.Repo.RepoLink + "/pulls/" + strconv.FormatInt(pullIssue.Index, 10)) +} diff --git a/internal/route/repo/release.go b/internal/route/repo/release.go new file mode 100644 index 00000000000..ac28e72fd39 --- /dev/null +++ b/internal/route/repo/release.go @@ -0,0 +1,323 @@ +package repo + +import ( + "net/http" + "strings" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/markup" +) + +const ( + tmplRepoReleaseList = "repo/release/list" + tmplRepoReleaseNew = "repo/release/new" +) + +// calReleaseNumCommitsBehind calculates given release has how many commits behind release target. +func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *database.Release, countCache map[string]int64) error { + // Get count if not exists + if _, ok := countCache[release.Target]; !ok { + if repoCtx.GitRepo.HasBranch(release.Target) { + commit, err := repoCtx.GitRepo.BranchCommit(release.Target) + if err != nil { + return errors.Newf("get branch commit: %v", err) + } + countCache[release.Target], err = commit.CommitsCount() + if err != nil { + return errors.Newf("count commits: %v", err) + } + } else { + // Use NumCommits of the newest release on that target + countCache[release.Target] = release.NumCommits + } + } + release.NumCommitsBehind = countCache[release.Target] - release.NumCommits + return nil +} + +func Releases(c *context.Context) { + c.Data["Title"] = c.Tr("repo.release.releases") + c.Data["PageIsViewFiles"] = true + c.Data["PageIsReleaseList"] = true + + tagsPage, err := gitx.Module.ListTagsAfter(c.Repo.GitRepo.Path(), c.Query("after"), 10) + if err != nil { + c.Error(err, "get tags") + return + } + + releases, err := database.GetPublishedReleasesByRepoID(c.Repo.Repository.ID, tagsPage.Tags...) + if err != nil { + c.Error(err, "get published releases by repository ID") + return + } + + // Temporary cache commits count of used branches to speed up. + countCache := make(map[string]int64) + + results := make([]*database.Release, len(tagsPage.Tags)) + for i, rawTag := range tagsPage.Tags { + for j, r := range releases { + if r == nil || r.TagName != rawTag { + continue + } + releases[j] = nil // Mark as used. + + if err = r.LoadAttributes(); err != nil { + c.Error(err, "load attributes") + return + } + + if err := calReleaseNumCommitsBehind(c.Repo, r, countCache); err != nil { + c.Error(err, "calculate number of commits after release") + return + } + + r.Note = string(markup.Markdown(r.Note, c.Repo.RepoLink, c.Repo.Repository.ComposeMetas())) + results[i] = r + break + } + + // No published release matches this tag + if results[i] == nil { + commit, err := c.Repo.GitRepo.TagCommit(rawTag) + if err != nil { + c.Error(err, "get tag commit") + return + } + + results[i] = &database.Release{ + Title: rawTag, + TagName: rawTag, + Sha1: commit.ID.String(), + } + + results[i].NumCommits, err = commit.CommitsCount() + if err != nil { + c.Error(err, "count commits") + return + } + results[i].NumCommitsBehind = c.Repo.CommitsCount - results[i].NumCommits + } + } + database.SortReleases(results) + + // Only show drafts if user is viewing the latest page + var drafts []*database.Release + if tagsPage.HasLatest { + drafts, err = database.GetDraftReleasesByRepoID(c.Repo.Repository.ID) + if err != nil { + c.Error(err, "get draft releases by repository ID") + return + } + + for _, r := range drafts { + if err = r.LoadAttributes(); err != nil { + c.Error(err, "load attributes") + return + } + + if err := calReleaseNumCommitsBehind(c.Repo, r, countCache); err != nil { + c.Error(err, "calculate number of commits after release") + return + } + + r.Note = string(markup.Markdown(r.Note, c.Repo.RepoLink, c.Repo.Repository.ComposeMetas())) + } + + if len(drafts) > 0 { + results = append(drafts, results...) + } + } + + c.Data["Releases"] = results + c.Data["HasPrevious"] = !tagsPage.HasLatest + c.Data["ReachEnd"] = !tagsPage.HasNext + c.Data["PreviousAfter"] = tagsPage.PreviousAfter + if len(results) > 0 { + c.Data["NextAfter"] = results[len(results)-1].TagName + } + c.Success(tmplRepoReleaseList) +} + +func renderReleaseAttachmentSettings(c *context.Context) { + c.Data["RequireDropzone"] = true + c.Data["IsAttachmentEnabled"] = conf.Release.Attachment.Enabled + c.Data["AttachmentAllowedTypes"] = strings.Join(conf.Release.Attachment.AllowedTypes, ",") + c.Data["AttachmentMaxSize"] = conf.Release.Attachment.MaxSize + c.Data["AttachmentMaxFiles"] = conf.Release.Attachment.MaxFiles +} + +func NewRelease(c *context.Context) { + c.Data["Title"] = c.Tr("repo.release.new_release") + c.Data["PageIsReleaseList"] = true + c.Data["tag_target"] = c.Repo.Repository.DefaultBranch + renderReleaseAttachmentSettings(c) + c.Success(tmplRepoReleaseNew) +} + +func NewReleasePost(c *context.Context, f form.NewRelease) { + c.Data["Title"] = c.Tr("repo.release.new_release") + c.Data["PageIsReleaseList"] = true + renderReleaseAttachmentSettings(c) + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoReleaseNew) + return + } + + if !c.Repo.GitRepo.HasBranch(f.Target) { + c.RenderWithErr(c.Tr("form.target_branch_not_exist"), http.StatusUnprocessableEntity, tmplRepoReleaseNew, &f) + return + } + + // Use current time if tag not yet exist, otherwise get time from Git + var tagCreatedUnix int64 + tag, err := c.Repo.GitRepo.Tag(git.RefsTags + f.TagName) + if err == nil { + commit, err := tag.Commit() + if err == nil { + tagCreatedUnix = commit.Author.When.Unix() + } + } + + commit, err := c.Repo.GitRepo.BranchCommit(f.Target) + if err != nil { + c.Error(err, "get branch commit") + return + } + + commitsCount, err := commit.CommitsCount() + if err != nil { + c.Error(err, "count commits") + return + } + + var attachments []string + if conf.Release.Attachment.Enabled { + attachments = f.Files + } + + rel := &database.Release{ + RepoID: c.Repo.Repository.ID, + PublisherID: c.User.ID, + Title: f.Title, + TagName: f.TagName, + Target: f.Target, + Sha1: commit.ID.String(), + NumCommits: commitsCount, + Note: f.Content, + IsDraft: len(f.Draft) > 0, + IsPrerelease: f.Prerelease, + CreatedUnix: tagCreatedUnix, + } + if err = database.NewRelease(c.Repo.GitRepo, rel, attachments); err != nil { + c.Data["Err_TagName"] = true + switch { + case database.IsErrReleaseAlreadyExist(err): + c.RenderWithErr(c.Tr("repo.release.tag_name_already_exist"), http.StatusUnprocessableEntity, tmplRepoReleaseNew, &f) + case database.IsErrInvalidTagName(err): + c.RenderWithErr(c.Tr("repo.release.tag_name_invalid"), http.StatusBadRequest, tmplRepoReleaseNew, &f) + default: + c.Error(err, "new release") + } + return + } + log.Trace("Release created: %s/%s:%s", c.User.LowerName, c.Repo.Repository.Name, f.TagName) + + c.Redirect(c.Repo.RepoLink + "/releases") +} + +func EditRelease(c *context.Context) { + c.Data["Title"] = c.Tr("repo.release.edit_release") + c.Data["PageIsReleaseList"] = true + c.Data["PageIsEditRelease"] = true + renderReleaseAttachmentSettings(c) + + tagName := c.Params("*") + rel, err := database.GetRelease(c.Repo.Repository.ID, tagName) + if err != nil { + c.NotFoundOrError(err, "get release") + return + } + c.Data["ID"] = rel.ID + c.Data["tag_name"] = rel.TagName + c.Data["tag_target"] = rel.Target + c.Data["title"] = rel.Title + c.Data["content"] = rel.Note + c.Data["attachments"] = rel.Attachments + c.Data["prerelease"] = rel.IsPrerelease + c.Data["IsDraft"] = rel.IsDraft + + c.Success(tmplRepoReleaseNew) +} + +func EditReleasePost(c *context.Context, f form.EditRelease) { + c.Data["Title"] = c.Tr("repo.release.edit_release") + c.Data["PageIsReleaseList"] = true + c.Data["PageIsEditRelease"] = true + renderReleaseAttachmentSettings(c) + + tagName := c.Params("*") + rel, err := database.GetRelease(c.Repo.Repository.ID, tagName) + if err != nil { + c.NotFoundOrError(err, "get release") + return + } + c.Data["tag_name"] = rel.TagName + c.Data["tag_target"] = rel.Target + c.Data["title"] = rel.Title + c.Data["content"] = rel.Note + c.Data["attachments"] = rel.Attachments + c.Data["prerelease"] = rel.IsPrerelease + c.Data["IsDraft"] = rel.IsDraft + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoReleaseNew) + return + } + + var attachments []string + if conf.Release.Attachment.Enabled { + attachments = f.Files + } + + isPublish := rel.IsDraft && f.Draft == "" + rel.Title = f.Title + rel.Note = f.Content + rel.IsDraft = len(f.Draft) > 0 + rel.IsPrerelease = f.Prerelease + if err = database.UpdateRelease(c.User, c.Repo.GitRepo, rel, isPublish, attachments); err != nil { + c.Error(err, "update release") + return + } + c.Redirect(c.Repo.RepoLink + "/releases") +} + +func UploadReleaseAttachment(c *context.Context) { + if !conf.Release.Attachment.Enabled { + c.NotFound() + return + } + uploadAttachment(c, conf.Release.Attachment.AllowedTypes) +} + +func DeleteRelease(c *context.Context) { + if err := database.DeleteReleaseOfRepoByID(c.Repo.Repository.ID, c.QueryInt64("id")); err != nil { + c.Flash.Error("DeleteReleaseByID: " + err.Error()) + } else { + c.Flash.Success(c.Tr("repo.release.deletion_success")) + } + + c.JSONSuccess(map[string]any{ + "redirect": c.Repo.RepoLink + "/releases", + }) +} diff --git a/internal/route/repo/repo.go b/internal/route/repo/repo.go new file mode 100644 index 00000000000..4280b3ec9c4 --- /dev/null +++ b/internal/route/repo/repo.go @@ -0,0 +1,340 @@ +package repo + +import ( + "net/http" + "os" + "path" + "path/filepath" + "strings" + + log "unknwon.dev/clog/v2" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/tool" + "gogs.io/gogs/internal/urlx" +) + +const ( + CREATE = "repo/create" + MIGRATE = "repo/migrate" +) + +func MustBeNotBare(c *context.Context) { + if c.Repo.Repository.IsBare { + c.NotFound() + } +} + +func checkContextUser(c *context.Context, uid int64) *database.User { + orgs, err := database.GetOwnedOrgsByUserIDDesc(c.User.ID, "updated_unix") + if err != nil { + c.Error(err, "get owned organization by user ID") + return nil + } + c.Data["Orgs"] = orgs + + // Not equal means current user is an organization. + if uid == c.User.ID || uid == 0 { + return c.User + } + + org, err := database.Handle.Users().GetByID(c.Req.Context(), uid) + if database.IsErrUserNotExist(err) { + return c.User + } + + if err != nil { + c.Error(err, "get user by ID") + return nil + } + + // Check ownership of organization. + if !org.IsOrganization() || !(c.User.IsAdmin || org.IsOwnedBy(c.User.ID)) { + c.Status(http.StatusForbidden) + return nil + } + return org +} + +func Create(c *context.Context) { + c.Title("new_repo") + c.RequireAutosize() + + // Give default value for template to render. + c.Data["Gitignores"] = database.Gitignores + c.Data["Licenses"] = database.Licenses + c.Data["Readmes"] = database.Readmes + c.Data["readme"] = "Default" + c.Data["private"] = c.User.LastRepoVisibility + c.Data["IsForcedPrivate"] = conf.Repository.ForcePrivate + + ctxUser := checkContextUser(c, c.QueryInt64("org")) + if c.Written() { + return + } + c.Data["ContextUser"] = ctxUser + + c.Success(CREATE) +} + +func handleCreateError(c *context.Context, err error, name, tpl string, form any) { + switch { + case database.IsErrReachLimitOfRepo(err): + c.RenderWithErr(c.Tr("repo.form.reach_limit_of_creation", err.(database.ErrReachLimitOfRepo).Limit), http.StatusForbidden, tpl, form) + case database.IsErrRepoAlreadyExist(err): + c.Data["Err_RepoName"] = true + c.RenderWithErr(c.Tr("form.repo_name_been_taken"), http.StatusUnprocessableEntity, tpl, form) + case database.IsErrNameNotAllowed(err): + c.Data["Err_RepoName"] = true + c.RenderWithErr(c.Tr("repo.form.name_not_allowed", err.(database.ErrNameNotAllowed).Value()), http.StatusBadRequest, tpl, form) + default: + c.Error(err, name) + } +} + +func CreatePost(c *context.Context, f form.CreateRepo) { + c.Data["Title"] = c.Tr("new_repo") + + c.Data["Gitignores"] = database.Gitignores + c.Data["Licenses"] = database.Licenses + c.Data["Readmes"] = database.Readmes + + ctxUser := checkContextUser(c, f.UserID) + if c.Written() { + return + } + c.Data["ContextUser"] = ctxUser + + if c.HasError() { + c.HTML(http.StatusBadRequest, CREATE) + return + } + + repo, err := database.CreateRepository(c.User, ctxUser, database.CreateRepoOptionsLegacy{ + Name: f.RepoName, + Description: f.Description, + Gitignores: f.Gitignores, + License: f.License, + Readme: f.Readme, + IsPrivate: f.Private || conf.Repository.ForcePrivate, + IsUnlisted: f.Unlisted, + AutoInit: f.AutoInit, + }) + if err == nil { + log.Trace("Repository created [%d]: %s/%s", repo.ID, ctxUser.Name, repo.Name) + c.Redirect(conf.Server.Subpath + "/" + ctxUser.Name + "/" + repo.Name) + return + } + + if repo != nil { + if errDelete := database.DeleteRepository(ctxUser.ID, repo.ID); errDelete != nil { + log.Error("DeleteRepository: %v", errDelete) + } + } + + handleCreateError(c, err, "CreatePost", CREATE, &f) +} + +func Migrate(c *context.Context) { + c.Data["Title"] = c.Tr("new_migrate") + c.Data["private"] = c.User.LastRepoVisibility + c.Data["IsForcedPrivate"] = conf.Repository.ForcePrivate + c.Data["mirror"] = c.Query("mirror") == "1" + + ctxUser := checkContextUser(c, c.QueryInt64("org")) + if c.Written() { + return + } + c.Data["ContextUser"] = ctxUser + + c.Success(MIGRATE) +} + +func MigratePost(c *context.Context, f form.MigrateRepo) { + c.Data["Title"] = c.Tr("new_migrate") + + ctxUser := checkContextUser(c, f.UID) + if c.Written() { + return + } + c.Data["ContextUser"] = ctxUser + + if c.HasError() { + c.HTML(http.StatusBadRequest, MIGRATE) + return + } + + remoteAddr, err := f.ParseRemoteAddr(c.User) + if err != nil { + if database.IsErrInvalidCloneAddr(err) { + c.Data["Err_CloneAddr"] = true + addrErr := err.(database.ErrInvalidCloneAddr) + switch { + case addrErr.IsURLError: + c.RenderWithErr(c.Tr("repo.migrate.clone_address")+c.Tr("form.url_error"), http.StatusBadRequest, MIGRATE, &f) + case addrErr.IsPermissionDenied: + c.RenderWithErr(c.Tr("repo.migrate.permission_denied"), http.StatusForbidden, MIGRATE, &f) + case addrErr.IsInvalidPath: + c.RenderWithErr(c.Tr("repo.migrate.invalid_local_path"), http.StatusBadRequest, MIGRATE, &f) + case addrErr.IsBlockedLocalAddress: + c.RenderWithErr(c.Tr("repo.migrate.clone_address_resolved_to_blocked_local_address"), http.StatusForbidden, MIGRATE, &f) + default: + c.Error(err, "unexpected error") + } + } else { + c.Error(err, "parse remote address") + } + return + } + + repo, err := database.MigrateRepository(c.User, ctxUser, database.MigrateRepoOptions{ + Name: f.RepoName, + Description: f.Description, + IsPrivate: f.Private || conf.Repository.ForcePrivate, + IsUnlisted: f.Unlisted, + IsMirror: f.Mirror, + RemoteAddr: remoteAddr, + }) + if err == nil { + log.Trace("Repository migrated [%d]: %s/%s", repo.ID, ctxUser.Name, f.RepoName) + c.Redirect(conf.Server.Subpath + "/" + ctxUser.Name + "/" + f.RepoName) + return + } + + if repo != nil { + if errDelete := database.DeleteRepository(ctxUser.ID, repo.ID); errDelete != nil { + log.Error("DeleteRepository: %v", errDelete) + } + } + + if strings.Contains(err.Error(), "Authentication failed") || + strings.Contains(err.Error(), "could not read Username") { + c.Data["Err_Auth"] = true + c.RenderWithErr(c.Tr("form.auth_failed", database.HandleMirrorCredentials(err.Error(), true)), http.StatusUnauthorized, MIGRATE, &f) + return + } else if strings.Contains(err.Error(), "fatal:") { + c.Data["Err_CloneAddr"] = true + c.RenderWithErr(c.Tr("repo.migrate.failed", database.HandleMirrorCredentials(err.Error(), true)), http.StatusInternalServerError, MIGRATE, &f) + return + } + + handleCreateError(c, err, "MigratePost", MIGRATE, &f) +} + +func Action(c *context.Context) { + var err error + switch c.Params(":action") { + case "watch": + err = database.WatchRepo(c.User.ID, c.Repo.Repository.ID, true) + case "unwatch": + if userID := c.QueryInt64("user_id"); userID != 0 { + if c.User.IsAdmin { + err = database.WatchRepo(userID, c.Repo.Repository.ID, false) + } + } else { + err = database.WatchRepo(c.User.ID, c.Repo.Repository.ID, false) + } + case "star": + err = database.StarRepo(c.User.ID, c.Repo.Repository.ID, true) + case "unstar": + err = database.StarRepo(c.User.ID, c.Repo.Repository.ID, false) + case "desc": // FIXME: this is not used + if !c.Repo.IsOwner() { + c.NotFound() + return + } + + c.Repo.Repository.Description = c.Query("desc") + c.Repo.Repository.Website = c.Query("site") + err = database.UpdateRepository(c.Repo.Repository, false) + } + + if err != nil { + c.Errorf(err, "action %q", c.Params(":action")) + return + } + + redirectTo := c.Query("redirect_to") + if !urlx.IsSameSite(redirectTo) { + redirectTo = c.Repo.RepoLink + } + c.Redirect(redirectTo) +} + +func Download(c *context.Context) { + var ( + uri = c.Params("*") + refName string + ext string + archivePath string + archiveFormat git.ArchiveFormat + ) + + switch { + case strings.HasSuffix(uri, ".zip"): + ext = ".zip" + archivePath = filepath.Join(c.Repo.GitRepo.Path(), "archives", "zip") + archiveFormat = git.ArchiveZip + case strings.HasSuffix(uri, ".tar.gz"): + ext = ".tar.gz" + archivePath = filepath.Join(c.Repo.GitRepo.Path(), "archives", "targz") + archiveFormat = git.ArchiveTarGz + default: + log.Trace("Unknown format: %s", uri) + c.NotFound() + return + } + refName = strings.TrimSuffix(uri, ext) + + if !osx.IsDir(archivePath) { + if err := os.MkdirAll(archivePath, os.ModePerm); err != nil { + c.Error(err, "create archive directory") + return + } + } + + // Get corresponding commit. + var ( + commit *git.Commit + err error + ) + gitRepo := c.Repo.GitRepo + if gitRepo.HasBranch(refName) { + commit, err = gitRepo.BranchCommit(refName) + if err != nil { + c.Error(err, "get branch commit") + return + } + } else if gitRepo.HasTag(refName) { + commit, err = gitRepo.TagCommit(refName) + if err != nil { + c.Error(err, "get tag commit") + return + } + } else if len(refName) >= 7 && len(refName) <= 40 { + commit, err = gitRepo.CatFileCommit(refName) + if err != nil { + c.NotFound() + return + } + } else { + c.NotFound() + return + } + + archivePath = path.Join(archivePath, tool.ShortSHA1(commit.ID.String())+ext) + if !osx.IsFile(archivePath) { + if err := commit.CreateArchive(archiveFormat, archivePath); err != nil { + c.Error(err, "creates archive") + return + } + } + + c.ServeFile(archivePath, c.Repo.Repository.Name+"-"+refName+ext) +} diff --git a/internal/route/repo/setting.go b/internal/route/repo/setting.go new file mode 100644 index 00000000000..549e26e6ecf --- /dev/null +++ b/internal/route/repo/setting.go @@ -0,0 +1,701 @@ +package repo + +import ( + "fmt" + "io" + "net/http" + "slices" + "strings" + "time" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/email" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/tool" + "gogs.io/gogs/internal/userx" +) + +const ( + tmplRepoSettingsOptions = "repo/settings/options" + tmplRepoSettingsAvatar = "repo/settings/avatar" + tmplRepoSettingsCollaboration = "repo/settings/collaboration" + tmplRepoSettingsBranches = "repo/settings/branches" + tmplRepoSettingsProtectedBranch = "repo/settings/protected_branch" + tmplRepoSettingsGithooks = "repo/settings/githooks" + tmplRepoSettingsGithookEdit = "repo/settings/githook_edit" + tmplRepoSettingsDeployKeys = "repo/settings/deploy_keys" +) + +func Settings(c *context.Context) { + c.Title("repo.settings") + c.PageIs("SettingsOptions") + c.RequireAutosize() + c.Success(tmplRepoSettingsOptions) +} + +func SettingsPost(c *context.Context, f form.RepoSetting) { + c.Title("repo.settings") + c.PageIs("SettingsOptions") + c.RequireAutosize() + + repo := c.Repo.Repository + + switch c.Query("action") { + case "update": + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoSettingsOptions) + return + } + + isNameChanged := false + oldRepoName := repo.Name + newRepoName := f.RepoName + // Check if repository name has been changed. + if repo.LowerName != strings.ToLower(newRepoName) { + isNameChanged = true + if err := database.ChangeRepositoryName(c.Repo.Owner, repo.Name, newRepoName); err != nil { + c.FormErr("RepoName") + switch { + case database.IsErrRepoAlreadyExist(err): + c.RenderWithErr(c.Tr("form.repo_name_been_taken"), http.StatusUnprocessableEntity, tmplRepoSettingsOptions, &f) + case database.IsErrNameNotAllowed(err): + c.RenderWithErr(c.Tr("repo.form.name_not_allowed", err.(database.ErrNameNotAllowed).Value()), http.StatusBadRequest, tmplRepoSettingsOptions, &f) + default: + c.Error(err, "change repository name") + } + return + } + + log.Trace("Repository name changed: %s/%s -> %s", c.Repo.Owner.Name, repo.Name, newRepoName) + } + // In case it's just a case change. + repo.Name = newRepoName + repo.LowerName = strings.ToLower(newRepoName) + + repo.Description = f.Description + repo.Website = f.Website + + // Visibility of forked repository is forced sync with base repository. + if repo.IsFork { + f.Private = repo.BaseRepo.IsPrivate + f.Unlisted = repo.BaseRepo.IsUnlisted + } + + visibilityChanged := repo.IsPrivate != f.Private || repo.IsUnlisted != f.Unlisted + repo.IsPrivate = f.Private + repo.IsUnlisted = f.Unlisted + if err := database.UpdateRepository(repo, visibilityChanged); err != nil { + c.Error(err, "update repository") + return + } + log.Trace("Repository basic settings updated: %s/%s", c.Repo.Owner.Name, repo.Name) + + if isNameChanged { + if err := database.Handle.Actions().RenameRepo(c.Req.Context(), c.User, repo.MustOwner(), oldRepoName, repo); err != nil { + log.Error("create rename repository action: %v", err) + } + } + + c.Flash.Success(c.Tr("repo.settings.update_settings_success")) + c.Redirect(repo.Link() + "/settings") + + case "mirror": + if !repo.IsMirror { + c.NotFound() + return + } + + if f.Interval > 0 { + c.Repo.Mirror.EnablePrune = f.EnablePrune + c.Repo.Mirror.Interval = f.Interval + c.Repo.Mirror.NextSync = time.Now().Add(time.Duration(f.Interval) * time.Hour) + if err := database.UpdateMirror(c.Repo.Mirror); err != nil { + c.Error(err, "update mirror") + return + } + } + if err := c.Repo.Mirror.SaveAddress(f.MirrorAddress); err != nil { + c.Error(err, "save address") + return + } + + c.Flash.Success(c.Tr("repo.settings.update_settings_success")) + c.Redirect(repo.Link() + "/settings") + + case "mirror-sync": + if !repo.IsMirror { + c.NotFound() + return + } + + go database.MirrorQueue.Add(repo.ID) + c.Flash.Info(c.Tr("repo.settings.mirror_sync_in_progress")) + c.Redirect(repo.Link() + "/settings") + + case "advanced": + repo.EnableWiki = f.EnableWiki + repo.AllowPublicWiki = f.AllowPublicWiki + repo.EnableExternalWiki = f.EnableExternalWiki + repo.ExternalWikiURL = f.ExternalWikiURL + repo.EnableIssues = f.EnableIssues + repo.AllowPublicIssues = f.AllowPublicIssues + repo.EnableExternalTracker = f.EnableExternalTracker + repo.ExternalTrackerURL = f.ExternalTrackerURL + repo.ExternalTrackerFormat = f.TrackerURLFormat + repo.ExternalTrackerStyle = f.TrackerIssueStyle + repo.EnablePulls = f.EnablePulls + repo.PullsIgnoreWhitespace = f.PullsIgnoreWhitespace + repo.PullsAllowRebase = f.PullsAllowRebase + + if !repo.EnableWiki || repo.EnableExternalWiki { + repo.AllowPublicWiki = false + } + if !repo.EnableIssues || repo.EnableExternalTracker { + repo.AllowPublicIssues = false + } + + if err := database.UpdateRepository(repo, false); err != nil { + c.Error(err, "update repository") + return + } + log.Trace("Repository advanced settings updated: %s/%s", c.Repo.Owner.Name, repo.Name) + + c.Flash.Success(c.Tr("repo.settings.update_settings_success")) + c.Redirect(c.Repo.RepoLink + "/settings") + + case "convert": + if !c.Repo.IsOwner() { + c.NotFound() + return + } + if repo.Name != f.RepoName { + c.RenderWithErr(c.Tr("form.enterred_invalid_repo_name"), http.StatusBadRequest, tmplRepoSettingsOptions, nil) + return + } + + if c.Repo.Owner.IsOrganization() { + if !c.Repo.Owner.IsOwnedBy(c.User.ID) { + c.NotFound() + return + } + } + + if !repo.IsMirror { + c.NotFound() + return + } + repo.IsMirror = false + + if _, err := database.CleanUpMigrateInfo(repo); err != nil { + c.Error(err, "clean up migrate info") + return + } else if err = database.DeleteMirrorByRepoID(c.Repo.Repository.ID); err != nil { + c.Error(err, "delete mirror by repository ID") + return + } + log.Trace("Repository converted from mirror to regular: %s/%s", c.Repo.Owner.Name, repo.Name) + c.Flash.Success(c.Tr("repo.settings.convert_succeed")) + c.Redirect(conf.Server.Subpath + "/" + c.Repo.Owner.Name + "/" + repo.Name) + + case "transfer": + if !c.Repo.IsOwner() { + c.NotFound() + return + } + if repo.Name != f.RepoName { + c.RenderWithErr(c.Tr("form.enterred_invalid_repo_name"), http.StatusBadRequest, tmplRepoSettingsOptions, nil) + return + } + + if c.Repo.Owner.IsOrganization() && !c.User.IsAdmin { + if !c.Repo.Owner.IsOwnedBy(c.User.ID) { + c.NotFound() + return + } + } + + newOwner := c.Query("new_owner_name") + if !database.Handle.Users().IsUsernameUsed(c.Req.Context(), newOwner, c.Repo.Owner.ID) { + c.RenderWithErr(c.Tr("form.enterred_invalid_owner_name"), http.StatusBadRequest, tmplRepoSettingsOptions, nil) + return + } + + if err := database.TransferOwnership(c.User, newOwner, repo); err != nil { + if database.IsErrRepoAlreadyExist(err) { + c.RenderWithErr(c.Tr("repo.settings.new_owner_has_same_repo"), http.StatusUnprocessableEntity, tmplRepoSettingsOptions, nil) + } else { + c.Error(err, "transfer ownership") + } + return + } + log.Trace("Repository transferred: %s/%s -> %s", c.Repo.Owner.Name, repo.Name, newOwner) + c.Flash.Success(c.Tr("repo.settings.transfer_succeed")) + c.Redirect(conf.Server.Subpath + "/" + newOwner + "/" + repo.Name) + + case "delete": + if !c.Repo.IsOwner() { + c.NotFound() + return + } + if repo.Name != f.RepoName { + c.RenderWithErr(c.Tr("form.enterred_invalid_repo_name"), http.StatusBadRequest, tmplRepoSettingsOptions, nil) + return + } + + if c.Repo.Owner.IsOrganization() && !c.User.IsAdmin { + if !c.Repo.Owner.IsOwnedBy(c.User.ID) { + c.NotFound() + return + } + } + + if err := database.DeleteRepository(c.Repo.Owner.ID, repo.ID); err != nil { + c.Error(err, "delete repository") + return + } + log.Trace("Repository deleted: %s/%s", c.Repo.Owner.Name, repo.Name) + + c.Flash.Success(c.Tr("repo.settings.deletion_success")) + c.Redirect(userx.DashboardURLPath(c.Repo.Owner.Name, c.Repo.Owner.IsOrganization())) + + case "delete-wiki": + if !c.Repo.IsOwner() { + c.NotFound() + return + } + if repo.Name != f.RepoName { + c.RenderWithErr(c.Tr("form.enterred_invalid_repo_name"), http.StatusBadRequest, tmplRepoSettingsOptions, nil) + return + } + + if c.Repo.Owner.IsOrganization() && !c.User.IsAdmin { + if !c.Repo.Owner.IsOwnedBy(c.User.ID) { + c.NotFound() + return + } + } + + repo.DeleteWiki() + log.Trace("Repository wiki deleted: %s/%s", c.Repo.Owner.Name, repo.Name) + + repo.EnableWiki = false + if err := database.UpdateRepository(repo, false); err != nil { + c.Error(err, "update repository") + return + } + + c.Flash.Success(c.Tr("repo.settings.wiki_deletion_success")) + c.Redirect(c.Repo.RepoLink + "/settings") + + default: + c.NotFound() + } +} + +func SettingsAvatar(c *context.Context) { + c.Title("settings.avatar") + c.PageIs("SettingsAvatar") + c.Success(tmplRepoSettingsAvatar) +} + +func SettingsAvatarPost(c *context.Context, f form.Avatar) { + f.Source = form.AvatarLocal + if err := UpdateAvatarSetting(c, f, c.Repo.Repository); err != nil { + c.Flash.Error(err.Error()) + } else { + c.Flash.Success(c.Tr("settings.update_avatar_success")) + } + c.RedirectSubpath(c.Repo.RepoLink + "/settings") +} + +func SettingsDeleteAvatar(c *context.Context) { + if err := c.Repo.Repository.DeleteAvatar(); err != nil { + c.Flash.Error(fmt.Sprintf("Failed to delete avatar: %v", err)) + } + c.RedirectSubpath(c.Repo.RepoLink + "/settings") +} + +// FIXME: limit upload size +func UpdateAvatarSetting(c *context.Context, f form.Avatar, ctxRepo *database.Repository) error { + ctxRepo.UseCustomAvatar = true + if f.Avatar != nil { + r, err := f.Avatar.Open() + if err != nil { + return errors.Newf("open avatar reader: %v", err) + } + defer r.Close() + + data, err := io.ReadAll(r) + if err != nil { + return errors.Newf("read avatar content: %v", err) + } + if !tool.IsImageFile(data) { + return errors.New(c.Tr("settings.uploaded_avatar_not_a_image")) + } + if err = ctxRepo.UploadAvatar(data); err != nil { + return errors.Newf("upload avatar: %v", err) + } + } else { + // No avatar is uploaded and reset setting back. + if !osx.IsFile(ctxRepo.CustomAvatarPath()) { + ctxRepo.UseCustomAvatar = false + } + } + + if err := database.UpdateRepository(ctxRepo, false); err != nil { + return errors.Newf("update repository: %v", err) + } + + return nil +} + +func SettingsCollaboration(c *context.Context) { + c.Data["Title"] = c.Tr("repo.settings") + c.Data["PageIsSettingsCollaboration"] = true + + users, err := c.Repo.Repository.GetCollaborators() + if err != nil { + c.Error(err, "get collaborators") + return + } + c.Data["Collaborators"] = users + + c.Success(tmplRepoSettingsCollaboration) +} + +func SettingsCollaborationPost(c *context.Context) { + name := strings.ToLower(c.Query("collaborator")) + if name == "" || c.Repo.Owner.LowerName == name { + c.Redirect(conf.Server.Subpath + c.Req.URL.Path) + return + } + + u, err := database.Handle.Users().GetByUsername(c.Req.Context(), name) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Flash.Error(c.Tr("form.user_not_exist")) + c.Redirect(conf.Server.Subpath + c.Req.URL.Path) + } else { + c.Error(err, "get user by name") + } + return + } + + // Organization is not allowed to be added as a collaborator + if u.IsOrganization() { + c.Flash.Error(c.Tr("repo.settings.org_not_allowed_to_be_collaborator")) + c.Redirect(conf.Server.Subpath + c.Req.URL.Path) + return + } + + if err = c.Repo.Repository.AddCollaborator(u); err != nil { + c.Error(err, "add collaborator") + return + } + + if conf.User.EnableEmailNotification { + if err := email.SendCollaboratorMail(database.NewMailerUser(u), database.NewMailerUser(c.User), database.NewMailerRepo(c.Repo.Repository)); err != nil { + log.Error("Failed to send collaborator mail: %v", err) + } + } + + c.Flash.Success(c.Tr("repo.settings.add_collaborator_success")) + c.Redirect(conf.Server.Subpath + c.Req.URL.Path) +} + +func ChangeCollaborationAccessMode(c *context.Context) { + if err := c.Repo.Repository.ChangeCollaborationAccessMode( + c.QueryInt64("uid"), + database.AccessMode(c.QueryInt("mode"))); err != nil { + log.Error("ChangeCollaborationAccessMode: %v", err) + return + } + + c.Status(204) +} + +func DeleteCollaboration(c *context.Context) { + if err := c.Repo.Repository.DeleteCollaboration(c.QueryInt64("id")); err != nil { + c.Flash.Error("DeleteCollaboration: " + err.Error()) + } else { + c.Flash.Success(c.Tr("repo.settings.remove_collaborator_success")) + } + + c.JSONSuccess(map[string]any{ + "redirect": c.Repo.RepoLink + "/settings/collaboration", + }) +} + +func SettingsBranches(c *context.Context) { + c.Data["Title"] = c.Tr("repo.settings.branches") + c.Data["PageIsSettingsBranches"] = true + + if c.Repo.Repository.IsBare { + c.Flash.Info(c.Tr("repo.settings.branches_bare"), true) + c.HTML(http.StatusUnprocessableEntity, tmplRepoSettingsBranches) + return + } + + protectBranches, err := database.GetProtectBranchesByRepoID(c.Repo.Repository.ID) + if err != nil { + c.Error(err, "get protect branch by repository ID") + return + } + + // Filter out deleted branches + branches := make([]string, 0, len(protectBranches)) + for i := range protectBranches { + if c.Repo.GitRepo.HasBranch(protectBranches[i].Name) { + branches = append(branches, protectBranches[i].Name) + } + } + c.Data["ProtectBranches"] = branches + + c.Success(tmplRepoSettingsBranches) +} + +func UpdateDefaultBranch(c *context.Context) { + branch := c.Query("branch") + if c.Repo.GitRepo.HasBranch(branch) && + c.Repo.Repository.DefaultBranch != branch { + c.Repo.Repository.DefaultBranch = branch + if _, err := c.Repo.GitRepo.SymbolicRef(git.SymbolicRefOptions{ + Ref: git.RefsHeads + branch, + }); err != nil { + c.Flash.Warning(c.Tr("repo.settings.update_default_branch_unsupported")) + c.Redirect(c.Repo.RepoLink + "/settings/branches") + return + } + } + + if err := database.UpdateRepository(c.Repo.Repository, false); err != nil { + c.Error(err, "update repository") + return + } + + c.Flash.Success(c.Tr("repo.settings.update_default_branch_success")) + c.Redirect(c.Repo.RepoLink + "/settings/branches") +} + +func SettingsProtectedBranch(c *context.Context) { + branch := c.Params("*") + if !c.Repo.GitRepo.HasBranch(branch) { + c.NotFound() + return + } + + c.Data["Title"] = c.Tr("repo.settings.protected_branches") + " - " + branch + c.Data["PageIsSettingsBranches"] = true + + protectBranch, err := database.GetProtectBranchOfRepoByName(c.Repo.Repository.ID, branch) + if err != nil { + if !database.IsErrBranchNotExist(err) { + c.Error(err, "get protect branch of repository by name") + return + } + + // No options found, create defaults. + protectBranch = &database.ProtectBranch{ + Name: branch, + } + } + + if c.Repo.Owner.IsOrganization() { + users, err := c.Repo.Repository.GetWriters() + if err != nil { + c.Error(err, "get writers") + return + } + c.Data["Users"] = users + c.Data["whitelist_users"] = protectBranch.WhitelistUserIDs + + teams, err := c.Repo.Owner.TeamsHaveAccessToRepo(c.Repo.Repository.ID, database.AccessModeWrite) + if err != nil { + c.Error(err, "get teams have access to the repository") + return + } + c.Data["Teams"] = teams + c.Data["whitelist_teams"] = protectBranch.WhitelistTeamIDs + } + + c.Data["Branch"] = protectBranch + c.Success(tmplRepoSettingsProtectedBranch) +} + +func SettingsProtectedBranchPost(c *context.Context, f form.ProtectBranch) { + branch := c.Params("*") + if !c.Repo.GitRepo.HasBranch(branch) { + c.NotFound() + return + } + + protectBranch, err := database.GetProtectBranchOfRepoByName(c.Repo.Repository.ID, branch) + if err != nil { + if !database.IsErrBranchNotExist(err) { + c.Error(err, "get protect branch of repository by name") + return + } + + // No options found, create defaults. + protectBranch = &database.ProtectBranch{ + RepoID: c.Repo.Repository.ID, + Name: branch, + } + } + + protectBranch.Protected = f.Protected + protectBranch.RequirePullRequest = f.RequirePullRequest + protectBranch.EnableWhitelist = f.EnableWhitelist + if c.Repo.Owner.IsOrganization() { + err = database.UpdateOrgProtectBranch(c.Repo.Repository, protectBranch, f.WhitelistUsers, f.WhitelistTeams) + } else { + err = database.UpdateProtectBranch(protectBranch) + } + if err != nil { + c.Error(err, "update protect branch") + return + } + + c.Flash.Success(c.Tr("repo.settings.update_protect_branch_success")) + c.Redirect(fmt.Sprintf("%s/settings/branches/%s", c.Repo.RepoLink, branch)) +} + +func SettingsGitHooks(c *context.Context) { + c.Data["Title"] = c.Tr("repo.settings.githooks") + c.Data["PageIsSettingsGitHooks"] = true + + hooks, err := c.Repo.GitRepo.Hooks("custom_hooks") + if err != nil { + c.Error(err, "get hooks") + return + } + c.Data["Hooks"] = hooks + + c.Success(tmplRepoSettingsGithooks) +} + +func isValidHookName(name git.HookName) bool { + return slices.Contains(git.ServerSideHooks, name) +} + +func SettingsGitHooksEdit(c *context.Context) { + c.Data["Title"] = c.Tr("repo.settings.githooks") + c.Data["PageIsSettingsGitHooks"] = true + c.Data["RequireSimpleMDE"] = true + + name := git.HookName(c.Params(":name")) + if !isValidHookName(name) { + c.NotFound() + return + } + + hook, err := c.Repo.GitRepo.Hook("custom_hooks", name) + if err != nil { + c.NotFoundOrError(osx.NewError(err), "get hook") + return + } + c.Data["Hook"] = hook + c.Success(tmplRepoSettingsGithookEdit) +} + +func SettingsGitHooksEditPost(c *context.Context) { + name := git.HookName(c.Params(":name")) + if !isValidHookName(name) { + c.NotFound() + return + } + + hook, err := c.Repo.GitRepo.Hook("custom_hooks", name) + if err != nil { + c.NotFoundOrError(osx.NewError(err), "get hook") + return + } + if err = hook.Update(c.Query("content")); err != nil { + c.Error(err, "update hook") + return + } + c.Redirect(c.Data["Link"].(string)) +} + +func SettingsDeployKeys(c *context.Context) { + c.Data["Title"] = c.Tr("repo.settings.deploy_keys") + c.Data["PageIsSettingsKeys"] = true + + keys, err := database.ListDeployKeys(c.Repo.Repository.ID) + if err != nil { + c.Error(err, "list deploy keys") + return + } + c.Data["Deploykeys"] = keys + + c.Success(tmplRepoSettingsDeployKeys) +} + +func SettingsDeployKeysPost(c *context.Context, f form.AddSSHKey) { + c.Data["Title"] = c.Tr("repo.settings.deploy_keys") + c.Data["PageIsSettingsKeys"] = true + + keys, err := database.ListDeployKeys(c.Repo.Repository.ID) + if err != nil { + c.Error(err, "list deploy keys") + return + } + c.Data["Deploykeys"] = keys + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoSettingsDeployKeys) + return + } + + content, err := database.CheckPublicKeyString(f.Content) + if err != nil { + if database.IsErrKeyUnableVerify(err) { + c.Flash.Info(c.Tr("form.unable_verify_ssh_key")) + } else { + c.Data["HasError"] = true + c.Data["Err_Content"] = true + c.Flash.Error(c.Tr("form.invalid_ssh_key", err.Error())) + c.Redirect(c.Repo.RepoLink + "/settings/keys") + return + } + } + + key, err := database.AddDeployKey(c.Repo.Repository.ID, f.Title, content) + if err != nil { + c.Data["HasError"] = true + switch { + case database.IsErrKeyAlreadyExist(err): + c.Data["Err_Content"] = true + c.RenderWithErr(c.Tr("repo.settings.key_been_used"), http.StatusUnprocessableEntity, tmplRepoSettingsDeployKeys, &f) + case database.IsErrKeyNameAlreadyUsed(err): + c.Data["Err_Title"] = true + c.RenderWithErr(c.Tr("repo.settings.key_name_used"), http.StatusUnprocessableEntity, tmplRepoSettingsDeployKeys, &f) + default: + c.Error(err, "add deploy key") + } + return + } + + log.Trace("Deploy key added: %d", c.Repo.Repository.ID) + c.Flash.Success(c.Tr("repo.settings.add_key_success", key.Name)) + c.Redirect(c.Repo.RepoLink + "/settings/keys") +} + +func DeleteDeployKey(c *context.Context) { + if err := database.DeleteDeployKey(c.User, c.QueryInt64("id")); err != nil { + c.Flash.Error("DeleteDeployKey: " + err.Error()) + } else { + c.Flash.Success(c.Tr("repo.settings.deploy_key_deletion_success")) + } + + c.JSONSuccess(map[string]any{ + "redirect": c.Repo.RepoLink + "/settings/keys", + }) +} diff --git a/internal/route/repo/store.go b/internal/route/repo/store.go new file mode 100644 index 00000000000..6ac234589ca --- /dev/null +++ b/internal/route/repo/store.go @@ -0,0 +1,91 @@ +package repo + +import ( + "context" + + "gogs.io/gogs/internal/database" +) + +// Store is the data layer carrier for context middleware. This interface is +// meant to abstract away and limit the exposure of the underlying data layer to +// the handler through a thin-wrapper. +type Store interface { + // GetAccessTokenBySHA1 returns the access token with given SHA1. It returns + // database.ErrAccessTokenNotExist when not found. + GetAccessTokenBySHA1(ctx context.Context, sha1 string) (*database.AccessToken, error) + // TouchAccessTokenByID updates the updated time of the given access token to + // the current time. + TouchAccessTokenByID(ctx context.Context, id int64) error + + // GetRepositoryByName returns the repository with given owner and name. It + // returns database.ErrRepoNotExist when not found. + GetRepositoryByName(ctx context.Context, ownerID int64, name string) (*database.Repository, error) + + // IsTwoFactorEnabled returns true if the user has enabled 2FA. + IsTwoFactorEnabled(ctx context.Context, userID int64) bool + + // GetUserByID returns the user with given ID. It returns + // database.ErrUserNotExist when not found. + GetUserByID(ctx context.Context, id int64) (*database.User, error) + // GetUserByUsername returns the user with given username. It returns + // database.ErrUserNotExist when not found. + GetUserByUsername(ctx context.Context, username string) (*database.User, error) + // CreateUser creates a new user and persists to database. It returns + // database.ErrNameNotAllowed if the given name or pattern of the name is not + // allowed as a username, or database.ErrUserAlreadyExist when a user with same + // name already exists, or database.ErrEmailAlreadyUsed if the email has been + // verified by another user. + CreateUser(ctx context.Context, username, email string, opts database.CreateUserOptions) (*database.User, error) + // AuthenticateUser validates username and password via given login source ID. + // It returns database.ErrUserNotExist when the user was not found. + // + // When the "loginSourceID" is negative, it aborts the process and returns + // database.ErrUserNotExist if the user was not found in the database. + // + // When the "loginSourceID" is non-negative, it returns + // database.ErrLoginSourceMismatch if the user has different login source ID + // than the "loginSourceID". + // + // When the "loginSourceID" is positive, it tries to authenticate via given + // login source and creates a new user when not yet exists in the database. + AuthenticateUser(ctx context.Context, login, password string, loginSourceID int64) (*database.User, error) +} + +type store struct{} + +// NewStore returns a new Store using the global database handle. +func NewStore() Store { + return &store{} +} + +func (*store) GetAccessTokenBySHA1(ctx context.Context, sha1 string) (*database.AccessToken, error) { + return database.Handle.AccessTokens().GetBySHA1(ctx, sha1) +} + +func (*store) TouchAccessTokenByID(ctx context.Context, id int64) error { + return database.Handle.AccessTokens().Touch(ctx, id) +} + +func (*store) GetRepositoryByName(ctx context.Context, ownerID int64, name string) (*database.Repository, error) { + return database.Handle.Repositories().GetByName(ctx, ownerID, name) +} + +func (*store) IsTwoFactorEnabled(ctx context.Context, userID int64) bool { + return database.Handle.TwoFactors().IsEnabled(ctx, userID) +} + +func (*store) GetUserByID(ctx context.Context, id int64) (*database.User, error) { + return database.Handle.Users().GetByID(ctx, id) +} + +func (*store) GetUserByUsername(ctx context.Context, username string) (*database.User, error) { + return database.Handle.Users().GetByUsername(ctx, username) +} + +func (*store) CreateUser(ctx context.Context, username, email string, opts database.CreateUserOptions) (*database.User, error) { + return database.Handle.Users().Create(ctx, username, email, opts) +} + +func (*store) AuthenticateUser(ctx context.Context, login, password string, loginSourceID int64) (*database.User, error) { + return database.Handle.Users().Authenticate(ctx, login, password, loginSourceID) +} diff --git a/internal/route/repo/tasks.go b/internal/route/repo/tasks.go new file mode 100644 index 00000000000..c0c1d9535f4 --- /dev/null +++ b/internal/route/repo/tasks.go @@ -0,0 +1,70 @@ +package repo + +import ( + "net/http" + + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/cryptox" + "gogs.io/gogs/internal/database" +) + +func TriggerTask(c *macaron.Context) { + branch := c.Query("branch") + pusherID := c.QueryInt64("pusher") + secret := c.Query("secret") + if branch == "" || pusherID <= 0 || secret == "" { + c.Error(http.StatusBadRequest, "Incomplete branch, pusher or secret") + return + } + + username := c.Params(":username") + reponame := c.Params(":reponame") + + owner, err := database.Handle.Users().GetByUsername(c.Req.Context(), username) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Error(http.StatusBadRequest, "Owner does not exist") + } else { + c.Status(http.StatusInternalServerError) + log.Error("Failed to get user [name: %s]: %v", username, err) + } + return + } + + // 🚨 SECURITY: No need to check existence of the repository if the client + // can't even get the valid secret. Mostly likely not a legitimate request. + if secret != cryptox.MD5(owner.Salt) { + c.Error(http.StatusBadRequest, "Invalid secret") + return + } + + repo, err := database.Handle.Repositories().GetByName(c.Req.Context(), owner.ID, reponame) + if err != nil { + if database.IsErrRepoNotExist(err) { + c.Error(http.StatusBadRequest, "Repository does not exist") + } else { + c.Status(http.StatusInternalServerError) + log.Error("Failed to get repository [owner_id: %d, name: %s]: %v", owner.ID, reponame, err) + } + return + } + + pusher, err := database.Handle.Users().GetByID(c.Req.Context(), pusherID) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Error(http.StatusBadRequest, "Pusher does not exist") + } else { + c.Status(http.StatusInternalServerError) + log.Error("Failed to get user [id: %d]: %v", pusherID, err) + } + return + } + + log.Trace("TriggerTask: %s/%s@%s by %q", owner.Name, repo.Name, branch, pusher.Name) + + go database.HookQueue.Add(repo.ID) + go database.AddTestPullRequestTask(pusher, repo.ID, branch, true) + c.Status(http.StatusAccepted) +} diff --git a/internal/route/repo/view.go b/internal/route/repo/view.go new file mode 100644 index 00000000000..2dfa33e7c56 --- /dev/null +++ b/internal/route/repo/view.go @@ -0,0 +1,356 @@ +package repo + +import ( + "bytes" + "fmt" + gotemplate "html/template" + "path" + "strings" + "time" + + "github.com/gogs/git-module" + "github.com/unknwon/paginater" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/template" + "gogs.io/gogs/internal/template/highlight" + "gogs.io/gogs/internal/tool" +) + +const ( + BARE = "repo/bare" + HOME = "repo/home" + WATCHERS = "repo/watchers" + FORKS = "repo/forks" +) + +func renderDirectory(c *context.Context, treeLink string) { + tree, err := c.Repo.Commit.Subtree(c.Repo.TreePath) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get subtree") + return + } + + entries, err := tree.Entries(git.LsTreeOptions{Verbatim: true}) + if err != nil { + c.Error(err, "list entries") + return + } + entries.Sort() + + c.Data["Files"], err = entries.CommitsInfo(c.Repo.Commit, git.CommitsInfoOptions{ + Path: c.Repo.TreePath, + MaxConcurrency: conf.Repository.CommitsFetchConcurrency, + Timeout: 5 * time.Minute, + }) + if err != nil { + c.Error(err, "get commits info") + return + } + + var readmeFile *git.Blob + for _, entry := range entries { + if entry.IsTree() || !markup.IsReadmeFile(entry.Name()) { + continue + } + + // TODO(unknwon): collect all possible README files and show with priority. + readmeFile = entry.Blob() + break + } + + if readmeFile != nil { + c.Data["RawFileLink"] = "" + c.Data["ReadmeInList"] = true + c.Data["ReadmeExist"] = true + + p, err := readmeFile.Bytes() + if err != nil { + c.Error(err, "read file") + return + } + + isTextFile := tool.IsTextFile(p) + c.Data["IsTextFile"] = isTextFile + c.Data["FileName"] = readmeFile.Name() + if isTextFile { + switch markup.Detect(readmeFile.Name()) { + case markup.TypeMarkdown: + c.Data["IsMarkdown"] = true + p = markup.Markdown(p, treeLink, c.Repo.Repository.ComposeMetas()) + case markup.TypeOrgMode: + c.Data["IsMarkdown"] = true + p = markup.OrgMode(p, treeLink, c.Repo.Repository.ComposeMetas()) + case markup.TypeIPythonNotebook: + c.Data["IsIPythonNotebook"] = true + c.Data["RawFileLink"] = c.Repo.RepoLink + "/raw/" + path.Join(c.Repo.BranchName, c.Repo.TreePath, readmeFile.Name()) + default: + p = bytes.ReplaceAll(p, []byte("\n"), []byte(`
`)) + } + c.Data["FileContent"] = string(p) + } + } + + // Show latest commit info of repository in table header, + // or of directory if not in root directory. + latestCommit := c.Repo.Commit + if len(c.Repo.TreePath) > 0 { + latestCommit, err = c.Repo.Commit.CommitByPath(git.CommitByRevisionOptions{Path: c.Repo.TreePath}) + if err != nil { + c.Error(err, "get commit by path") + return + } + } + c.Data["LatestCommit"] = latestCommit + c.Data["LatestCommitUser"] = tryGetUserByEmail(c.Req.Context(), latestCommit.Author.Email) + + if c.Repo.CanEnableEditor() { + c.Data["CanAddFile"] = true + c.Data["CanUploadFile"] = conf.Repository.Upload.Enabled + } +} + +func renderFile(c *context.Context, entry *git.TreeEntry, treeLink, rawLink string) { + c.Data["IsViewFile"] = true + + blob := entry.Blob() + p, err := blob.Bytes() + if err != nil { + c.Error(err, "read blob") + return + } + + c.Data["Title"] = blob.Name() + " - " + c.Data["Title"].(string) + c.Data["FileSize"] = blob.Size() + c.Data["FileName"] = blob.Name() + c.Data["HighlightClass"] = highlight.FileNameToHighlightClass(blob.Name()) + c.Data["RawFileLink"] = rawLink + "/" + c.Repo.TreePath + + isTextFile := tool.IsTextFile(p) + c.Data["IsTextFile"] = isTextFile + + // Assume file is not editable first. + if !isTextFile { + c.Data["EditFileTooltip"] = c.Tr("repo.editor.cannot_edit_non_text_files") + } + + canEnableEditor := c.Repo.CanEnableEditor() + switch { + case isTextFile: + if blob.Size() >= conf.UI.MaxDisplayFileSize { + c.Data["IsFileTooLarge"] = true + break + } + + c.Data["ReadmeExist"] = markup.IsReadmeFile(blob.Name()) + + switch markup.Detect(blob.Name()) { + case markup.TypeMarkdown: + c.Data["IsMarkdown"] = true + c.Data["FileContent"] = string(markup.Markdown(p, path.Dir(treeLink), c.Repo.Repository.ComposeMetas())) + case markup.TypeOrgMode: + c.Data["IsMarkdown"] = true + c.Data["FileContent"] = string(markup.OrgMode(p, path.Dir(treeLink), c.Repo.Repository.ComposeMetas())) + case markup.TypeIPythonNotebook: + c.Data["IsIPythonNotebook"] = true + default: + // Building code view blocks with line number on server side. + var fileContent string + if content, err := template.ToUTF8WithErr(p); err != nil { + log.Error("ToUTF8WithErr: %s", err) + fileContent = string(p) + } else { + fileContent = content + } + + var output bytes.Buffer + lines := strings.Split(fileContent, "\n") + // Remove blank line at the end of file + if len(lines) > 0 && lines[len(lines)-1] == "" { + lines = lines[:len(lines)-1] + } + for index, line := range lines { + output.WriteString(fmt.Sprintf(`
  • %s
  • `, index+1, index+1, gotemplate.HTMLEscapeString(strings.TrimRight(line, "\r"))) + "\n") + } + c.Data["FileContent"] = gotemplate.HTML(output.String()) + + output.Reset() + for i := 0; i < len(lines); i++ { + fmt.Fprintf(&output, `%d`, i+1, i+1) + } + c.Data["LineNums"] = gotemplate.HTML(output.String()) + } + + if canEnableEditor { + c.Data["CanEditFile"] = true + c.Data["EditFileTooltip"] = c.Tr("repo.editor.edit_this_file") + } else if !c.Repo.IsViewBranch { + c.Data["EditFileTooltip"] = c.Tr("repo.editor.must_be_on_a_branch") + } else if !c.Repo.IsWriter() { + c.Data["EditFileTooltip"] = c.Tr("repo.editor.fork_before_edit") + } + + case tool.IsPDFFile(p): + c.Data["IsPDFFile"] = true + case tool.IsVideoFile(p): + c.Data["IsVideoFile"] = true + case tool.IsImageFile(p): + c.Data["IsImageFile"] = true + } + + if canEnableEditor { + c.Data["CanDeleteFile"] = true + c.Data["DeleteFileTooltip"] = c.Tr("repo.editor.delete_this_file") + } else if !c.Repo.IsViewBranch { + c.Data["DeleteFileTooltip"] = c.Tr("repo.editor.must_be_on_a_branch") + } else if !c.Repo.IsWriter() { + c.Data["DeleteFileTooltip"] = c.Tr("repo.editor.must_have_write_access") + } +} + +func setEditorconfigIfExists(c *context.Context) { + ec, err := c.Repo.Editorconfig() + if err != nil && !gitx.IsErrRevisionNotExist(err) { + log.Warn("setEditorconfigIfExists.Editorconfig [repo_id: %d]: %v", c.Repo.Repository.ID, err) + return + } + c.Data["Editorconfig"] = ec +} + +func Home(c *context.Context) { + c.Data["PageIsViewFiles"] = true + + if c.Repo.Repository.IsBare { + c.Success(BARE) + return + } + + title := c.Repo.Repository.Owner.Name + "/" + c.Repo.Repository.Name + if len(c.Repo.Repository.Description) > 0 { + title += ": " + c.Repo.Repository.Description + } + c.Data["Title"] = title + if c.Repo.BranchName != c.Repo.Repository.DefaultBranch { + c.Data["Title"] = title + " @ " + c.Repo.BranchName + } + c.Data["RequireHighlightJS"] = true + + branchLink := c.Repo.RepoLink + "/src/" + c.Repo.BranchName + treeLink := branchLink + rawLink := c.Repo.RepoLink + "/raw/" + c.Repo.BranchName + + isRootDir := false + if len(c.Repo.TreePath) > 0 { + treeLink += "/" + c.Repo.TreePath + } else { + isRootDir = true + + // Only show Git stats panel when view root directory + var err error + c.Repo.CommitsCount, err = c.Repo.Commit.CommitsCount() + if err != nil { + c.Error(err, "count commits") + return + } + c.Data["CommitsCount"] = c.Repo.CommitsCount + } + c.Data["PageIsRepoHome"] = isRootDir + + // Get current entry user currently looking at. + entry, err := c.Repo.Commit.TreeEntry(c.Repo.TreePath) + if err != nil { + c.NotFoundOrError(gitx.NewError(err), "get tree entry") + return + } + + if entry.IsTree() { + renderDirectory(c, treeLink) + } else { + renderFile(c, entry, treeLink, rawLink) + } + if c.Written() { + return + } + + setEditorconfigIfExists(c) + if c.Written() { + return + } + + var treeNames []string + paths := make([]string, 0, 5) + if len(c.Repo.TreePath) > 0 { + treeNames = strings.Split(c.Repo.TreePath, "/") + for i := range treeNames { + paths = append(paths, strings.Join(treeNames[:i+1], "/")) + } + + c.Data["HasParentPath"] = true + if len(paths)-2 >= 0 { + c.Data["ParentPath"] = "/" + paths[len(paths)-2] + } + } + + c.Data["Paths"] = paths + c.Data["TreeLink"] = treeLink + c.Data["TreeNames"] = treeNames + c.Data["BranchLink"] = branchLink + c.Success(HOME) +} + +func RenderUserCards(c *context.Context, total int, getter func(page int) ([]*database.User, error), tpl string) { + page := c.QueryInt("page") + if page <= 0 { + page = 1 + } + pager := paginater.New(total, database.ItemsPerPage, page, 5) + c.Data["Page"] = pager + + items, err := getter(pager.Current()) + if err != nil { + c.Error(err, "getter") + return + } + c.Data["Cards"] = items + + c.Success(tpl) +} + +func Watchers(c *context.Context) { + c.Data["Title"] = c.Tr("repo.watchers") + c.Data["CardsTitle"] = c.Tr("repo.watchers") + c.Data["PageIsWatchers"] = true + RenderUserCards(c, c.Repo.Repository.NumWatches, c.Repo.Repository.GetWatchers, WATCHERS) +} + +func Stars(c *context.Context) { + c.Data["Title"] = c.Tr("repo.stargazers") + c.Data["CardsTitle"] = c.Tr("repo.stargazers") + c.Data["PageIsStargazers"] = true + RenderUserCards(c, c.Repo.Repository.NumStars, c.Repo.Repository.GetStargazers, WATCHERS) +} + +func Forks(c *context.Context) { + c.Data["Title"] = c.Tr("repos.forks") + + forks, err := c.Repo.Repository.GetForks() + if err != nil { + c.Error(err, "get forks") + return + } + + for _, fork := range forks { + if err = fork.GetOwner(); err != nil { + c.Error(err, "get owner") + return + } + } + c.Data["Forks"] = forks + + c.Success(FORKS) +} diff --git a/internal/route/repo/webhook.go b/internal/route/repo/webhook.go new file mode 100644 index 00000000000..51ae3d5ace6 --- /dev/null +++ b/internal/route/repo/webhook.go @@ -0,0 +1,593 @@ +package repo + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "strings" + "time" + + "github.com/cockroachdb/errors" + "github.com/gogs/git-module" + "gopkg.in/macaron.v1" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/netx" + apiv1types "gogs.io/gogs/internal/route/api/v1/types" +) + +const ( + tmplRepoSettingsWebhooks = "repo/settings/webhook/base" + tmplRepoSettingsWebhookNew = "repo/settings/webhook/new" + tmplOrgSettingsWebhooks = "org/settings/webhooks" + tmplOrgSettingsWebhookNew = "org/settings/webhook_new" +) + +func InjectOrgRepoContext() macaron.Handler { + return func(c *context.Context) { + orCtx, err := getOrgRepoContext(c) + if err != nil { + c.Error(err, "get organization or repository context") + return + } + c.Map(orCtx) + } +} + +type orgRepoContext struct { + OrgID int64 + RepoID int64 + Link string + TmplList string + TmplNew string +} + +// getOrgRepoContext determines whether this is a repo context or organization context. +func getOrgRepoContext(c *context.Context) (*orgRepoContext, error) { + if len(c.Repo.RepoLink) > 0 { + c.PageIs("RepositoryContext") + return &orgRepoContext{ + RepoID: c.Repo.Repository.ID, + Link: c.Repo.RepoLink, + TmplList: tmplRepoSettingsWebhooks, + TmplNew: tmplRepoSettingsWebhookNew, + }, nil + } + + if len(c.Org.OrgLink) > 0 { + c.PageIs("OrganizationContext") + return &orgRepoContext{ + OrgID: c.Org.Organization.ID, + Link: c.Org.OrgLink, + TmplList: tmplOrgSettingsWebhooks, + TmplNew: tmplOrgSettingsWebhookNew, + }, nil + } + + return nil, errors.New("unable to determine context") +} + +func Webhooks(c *context.Context, orCtx *orgRepoContext) { + c.Title("repo.settings.hooks") + c.PageIs("SettingsHooks") + c.Data["Types"] = conf.Webhook.Types + + var err error + var ws []*database.Webhook + if orCtx.RepoID > 0 { + c.Data["Description"] = c.Tr("repo.settings.hooks_desc", "https://gogs.io/advancing/webhooks") + ws, err = database.GetWebhooksByRepoID(orCtx.RepoID) + } else { + c.Data["Description"] = c.Tr("org.settings.hooks_desc") + ws, err = database.GetWebhooksByOrgID(orCtx.OrgID) + } + if err != nil { + c.Error(err, "get webhooks") + return + } + c.Data["Webhooks"] = ws + + c.Success(orCtx.TmplList) +} + +func WebhooksNew(c *context.Context, orCtx *orgRepoContext) { + c.Title("repo.settings.add_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksNew") + + allowed := false + hookType := strings.ToLower(c.Params(":type")) + for _, typ := range conf.Webhook.Types { + if hookType == typ { + allowed = true + c.Data["HookType"] = typ + break + } + } + if !allowed { + c.NotFound() + return + } + + c.Success(orCtx.TmplNew) +} + +func validateWebhook(l macaron.Locale, w *database.Webhook) (field, msg string, status int) { + // 🚨 SECURITY: Local addresses must not be allowed by non-admins to prevent SSRF, + // see https://github.com/gogs/gogs/issues/5366 for details. + payloadURL, err := url.Parse(w.URL) + if err != nil { + return "PayloadURL", l.Tr("repo.settings.webhook.err_cannot_parse_payload_url", err), http.StatusBadRequest + } + + if netx.IsBlockedLocalHostname(payloadURL.Hostname(), conf.Security.LocalNetworkAllowlist) { + return "PayloadURL", l.Tr("repo.settings.webhook.url_resolved_to_blocked_local_address"), http.StatusForbidden + } + return "", "", http.StatusOK +} + +func validateAndCreateWebhook(c *context.Context, orCtx *orgRepoContext, w *database.Webhook) { + c.Data["Webhook"] = w + + if c.HasError() { + c.HTML(http.StatusBadRequest, orCtx.TmplNew) + return + } + + field, msg, status := validateWebhook(c.Locale, w) + if status != http.StatusOK { + c.FormErr(field) + c.RenderWithErr(msg, status, orCtx.TmplNew, nil) + return + } + + if err := w.UpdateEvent(); err != nil { + c.Error(err, "update event") + return + } else if err := database.CreateWebhook(w); err != nil { + c.Error(err, "create webhook") + return + } + + c.Flash.Success(c.Tr("repo.settings.add_hook_success")) + c.Redirect(orCtx.Link + "/settings/hooks") +} + +func toHookEvent(f form.Webhook) *database.HookEvent { + return &database.HookEvent{ + PushOnly: f.PushOnly(), + SendEverything: f.SendEverything(), + ChooseEvents: f.ChooseEvents(), + HookEvents: database.HookEvents{ + Create: f.Create, + Delete: f.Delete, + Fork: f.Fork, + Push: f.Push, + Issues: f.Issues, + IssueComment: f.IssueComment, + PullRequest: f.PullRequest, + Release: f.Release, + }, + } +} + +func WebhooksNewPost(c *context.Context, orCtx *orgRepoContext, f form.NewWebhook) { + c.Title("repo.settings.add_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksNew") + c.Data["HookType"] = "gogs" + + contentType := database.JSON + if database.HookContentType(f.ContentType) == database.FORM { + contentType = database.FORM + } + + w := &database.Webhook{ + RepoID: orCtx.RepoID, + OrgID: orCtx.OrgID, + URL: f.PayloadURL, + ContentType: contentType, + Secret: f.Secret, + HookEvent: toHookEvent(f.Webhook), + IsActive: f.Active, + HookTaskType: database.GOGS, + } + validateAndCreateWebhook(c, orCtx, w) +} + +func WebhooksSlackNewPost(c *context.Context, orCtx *orgRepoContext, f form.NewSlackHook) { + c.Title("repo.settings.add_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksNew") + c.Data["HookType"] = "slack" + + meta := &database.SlackMeta{ + Channel: f.Channel, + Username: f.Username, + IconURL: f.IconURL, + Color: f.Color, + } + c.Data["SlackMeta"] = meta + + p, err := json.Marshal(meta) + if err != nil { + c.Error(err, "marshal JSON") + return + } + + w := &database.Webhook{ + RepoID: orCtx.RepoID, + URL: f.PayloadURL, + ContentType: database.JSON, + HookEvent: toHookEvent(f.Webhook), + IsActive: f.Active, + HookTaskType: database.SLACK, + Meta: string(p), + OrgID: orCtx.OrgID, + } + validateAndCreateWebhook(c, orCtx, w) +} + +func WebhooksDiscordNewPost(c *context.Context, orCtx *orgRepoContext, f form.NewDiscordHook) { + c.Title("repo.settings.add_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksNew") + c.Data["HookType"] = "discord" + + meta := &database.SlackMeta{ + Username: f.Username, + IconURL: f.IconURL, + Color: f.Color, + } + c.Data["SlackMeta"] = meta + + p, err := json.Marshal(meta) + if err != nil { + c.Error(err, "marshal JSON") + return + } + + w := &database.Webhook{ + RepoID: orCtx.RepoID, + URL: f.PayloadURL, + ContentType: database.JSON, + HookEvent: toHookEvent(f.Webhook), + IsActive: f.Active, + HookTaskType: database.DISCORD, + Meta: string(p), + OrgID: orCtx.OrgID, + } + validateAndCreateWebhook(c, orCtx, w) +} + +func WebhooksDingtalkNewPost(c *context.Context, orCtx *orgRepoContext, f form.NewDingtalkHook) { + c.Title("repo.settings.add_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksNew") + c.Data["HookType"] = "dingtalk" + + w := &database.Webhook{ + RepoID: orCtx.RepoID, + URL: f.PayloadURL, + ContentType: database.JSON, + HookEvent: toHookEvent(f.Webhook), + IsActive: f.Active, + HookTaskType: database.DINGTALK, + OrgID: orCtx.OrgID, + } + validateAndCreateWebhook(c, orCtx, w) +} + +func loadWebhook(c *context.Context, orCtx *orgRepoContext) *database.Webhook { + c.RequireHighlightJS() + + var err error + var w *database.Webhook + if orCtx.RepoID > 0 { + w, err = database.GetWebhookOfRepoByID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + } else { + w, err = database.GetWebhookByOrgID(c.Org.Organization.ID, c.ParamsInt64(":id")) + } + if err != nil { + c.NotFoundOrError(err, "get webhook") + return nil + } + c.Data["Webhook"] = w + + switch w.HookTaskType { + case database.SLACK: + c.Data["SlackMeta"] = w.SlackMeta() + c.Data["HookType"] = "slack" + case database.DISCORD: + c.Data["SlackMeta"] = w.SlackMeta() + c.Data["HookType"] = "discord" + case database.DINGTALK: + c.Data["HookType"] = "dingtalk" + default: + c.Data["HookType"] = "gogs" + } + c.Data["FormURL"] = fmt.Sprintf("%s/settings/hooks/%s/%d", orCtx.Link, c.Data["HookType"], w.ID) + c.Data["DeleteURL"] = fmt.Sprintf("%s/settings/hooks/delete", orCtx.Link) + + c.Data["History"], err = w.History(1) + if err != nil { + c.Error(err, "get history") + return nil + } + return w +} + +func WebhooksEdit(c *context.Context, orCtx *orgRepoContext) { + c.Title("repo.settings.update_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksEdit") + + loadWebhook(c, orCtx) + if c.Written() { + return + } + + c.Success(orCtx.TmplNew) +} + +func validateAndUpdateWebhook(c *context.Context, orCtx *orgRepoContext, w *database.Webhook) { + c.Data["Webhook"] = w + + if c.HasError() { + c.HTML(http.StatusBadRequest, orCtx.TmplNew) + return + } + + field, msg, status := validateWebhook(c.Locale, w) + if status != http.StatusOK { + c.FormErr(field) + c.RenderWithErr(msg, status, orCtx.TmplNew, nil) + return + } + + if err := w.UpdateEvent(); err != nil { + c.Error(err, "update event") + return + } else if err := database.UpdateWebhook(w); err != nil { + c.Error(err, "update webhook") + return + } + + c.Flash.Success(c.Tr("repo.settings.update_hook_success")) + c.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, w.ID)) +} + +func WebhooksEditPost(c *context.Context, orCtx *orgRepoContext, f form.NewWebhook) { + c.Title("repo.settings.update_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksEdit") + + w := loadWebhook(c, orCtx) + if c.Written() { + return + } + + contentType := database.JSON + if database.HookContentType(f.ContentType) == database.FORM { + contentType = database.FORM + } + + w.URL = f.PayloadURL + w.ContentType = contentType + w.Secret = f.Secret + w.HookEvent = toHookEvent(f.Webhook) + w.IsActive = f.Active + validateAndUpdateWebhook(c, orCtx, w) +} + +func WebhooksSlackEditPost(c *context.Context, orCtx *orgRepoContext, f form.NewSlackHook) { + c.Title("repo.settings.update_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksEdit") + + w := loadWebhook(c, orCtx) + if c.Written() { + return + } + + meta, err := json.Marshal(&database.SlackMeta{ + Channel: f.Channel, + Username: f.Username, + IconURL: f.IconURL, + Color: f.Color, + }) + if err != nil { + c.Error(err, "marshal JSON") + return + } + + w.URL = f.PayloadURL + w.Meta = string(meta) + w.HookEvent = toHookEvent(f.Webhook) + w.IsActive = f.Active + validateAndUpdateWebhook(c, orCtx, w) +} + +func WebhooksDiscordEditPost(c *context.Context, orCtx *orgRepoContext, f form.NewDiscordHook) { + c.Title("repo.settings.update_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksEdit") + + w := loadWebhook(c, orCtx) + if c.Written() { + return + } + + meta, err := json.Marshal(&database.SlackMeta{ + Username: f.Username, + IconURL: f.IconURL, + Color: f.Color, + }) + if err != nil { + c.Error(err, "marshal JSON") + return + } + + w.URL = f.PayloadURL + w.Meta = string(meta) + w.HookEvent = toHookEvent(f.Webhook) + w.IsActive = f.Active + validateAndUpdateWebhook(c, orCtx, w) +} + +func WebhooksDingtalkEditPost(c *context.Context, orCtx *orgRepoContext, f form.NewDingtalkHook) { + c.Title("repo.settings.update_webhook") + c.PageIs("SettingsHooks") + c.PageIs("SettingsHooksEdit") + + w := loadWebhook(c, orCtx) + if c.Written() { + return + } + + w.URL = f.PayloadURL + w.HookEvent = toHookEvent(f.Webhook) + w.IsActive = f.Active + validateAndUpdateWebhook(c, orCtx, w) +} + +func TestWebhook(c *context.Context) { + var ( + commitID string + commitMessage string + author *git.Signature + committer *git.Signature + authorUsername string + committerUsername string + nameStatus *git.NameStatus + ) + + // Grab latest commit or fake one if it's empty repository. + + if c.Repo.Commit == nil { + commitID = git.EmptyID + commitMessage = "This is a fake commit" + ghost := database.NewGhostUser() + author = &git.Signature{ + Name: ghost.DisplayName(), + Email: ghost.Email, + When: time.Now(), + } + committer = author + authorUsername = ghost.Name + committerUsername = ghost.Name + nameStatus = &git.NameStatus{} + + } else { + commitID = c.Repo.Commit.ID.String() + commitMessage = c.Repo.Commit.Message + author = c.Repo.Commit.Author + committer = c.Repo.Commit.Committer + + // Try to match email with a real user. + author, err := database.Handle.Users().GetByEmail(c.Req.Context(), c.Repo.Commit.Author.Email) + if err == nil { + authorUsername = author.Name + } else if !database.IsErrUserNotExist(err) { + c.Error(err, "get user by email") + return + } + + user, err := database.Handle.Users().GetByEmail(c.Req.Context(), c.Repo.Commit.Committer.Email) + if err == nil { + committerUsername = user.Name + } else if !database.IsErrUserNotExist(err) { + c.Error(err, "get user by email") + return + } + + nameStatus, err = c.Repo.Commit.ShowNameStatus() + if err != nil { + c.Error(err, "get changed files") + return + } + } + + apiUser := c.User.APIFormat() + p := &apiv1types.WebhookPushPayload{ + Ref: git.RefsHeads + c.Repo.Repository.DefaultBranch, + Before: commitID, + After: commitID, + Commits: []*apiv1types.WebhookPayloadCommit{ + { + ID: commitID, + Message: commitMessage, + URL: c.Repo.Repository.HTMLURL() + "/commit/" + commitID, + Author: &apiv1types.WebhookPayloadUser{ + Name: author.Name, + Email: author.Email, + UserName: authorUsername, + }, + Committer: &apiv1types.WebhookPayloadUser{ + Name: committer.Name, + Email: committer.Email, + UserName: committerUsername, + }, + Added: nameStatus.Added, + Removed: nameStatus.Removed, + Modified: nameStatus.Modified, + }, + }, + Repo: c.Repo.Repository.APIFormatLegacy(nil), + Pusher: apiUser, + Sender: apiUser, + } + if err := database.TestWebhook(c.Repo.Repository, database.HookEventTypePush, p, c.ParamsInt64("id")); err != nil { + c.Error(err, "test webhook") + return + } + + c.Flash.Info(c.Tr("repo.settings.webhook.test_delivery_success")) + c.Status(http.StatusOK) +} + +func RedeliveryWebhook(c *context.Context) { + webhook, err := database.GetWebhookOfRepoByID(c.Repo.Repository.ID, c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get webhook") + return + } + + hookTask, err := database.GetHookTaskOfWebhookByUUID(webhook.ID, c.Query("uuid")) + if err != nil { + c.NotFoundOrError(err, "get hook task by UUID") + return + } + + hookTask.IsDelivered = false + if err = database.UpdateHookTask(hookTask); err != nil { + c.Error(err, "update hook task") + return + } + + go database.HookQueue.Add(c.Repo.Repository.ID) + c.Flash.Info(c.Tr("repo.settings.webhook.redelivery_success", hookTask.UUID)) + c.Status(http.StatusOK) +} + +func DeleteWebhook(c *context.Context, orCtx *orgRepoContext) { + var err error + if orCtx.RepoID > 0 { + err = database.DeleteWebhookOfRepoByID(orCtx.RepoID, c.QueryInt64("id")) + } else { + err = database.DeleteWebhookOfOrgByID(orCtx.OrgID, c.QueryInt64("id")) + } + if err != nil { + c.Error(err, "delete webhook") + return + } + c.Flash.Success(c.Tr("repo.settings.webhook_deletion_success")) + + c.JSONSuccess(map[string]any{ + "redirect": orCtx.Link + "/settings/hooks", + }) +} diff --git a/internal/route/repo/webhook_test.go b/internal/route/repo/webhook_test.go new file mode 100644 index 00000000000..75cf371300f --- /dev/null +++ b/internal/route/repo/webhook_test.go @@ -0,0 +1,51 @@ +package repo + +import ( + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/mocks" +) + +func TestValidateWebhook(t *testing.T) { + l := &mocks.Locale{ + MockLang: "en", + MockTr: func(s string, _ ...any) string { + return s + }, + } + + tests := []struct { + name string + actor *database.User + webhook *database.Webhook + wantField string + wantMsg string + wantStatus int + }{ + { + name: "admin bypass local address check", + webhook: &database.Webhook{URL: "https://www.google.com"}, + wantStatus: http.StatusOK, + }, + + { + name: "local address not allowed", + webhook: &database.Webhook{URL: "http://localhost:3306"}, + wantField: "PayloadURL", + wantMsg: "repo.settings.webhook.url_resolved_to_blocked_local_address", + wantStatus: http.StatusForbidden, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + field, msg, status := validateWebhook(l, test.webhook) + assert.Equal(t, test.wantStatus, status) + assert.Equal(t, test.wantMsg, msg) + assert.Equal(t, test.wantField, field) + }) + } +} diff --git a/internal/route/repo/wiki.go b/internal/route/repo/wiki.go new file mode 100644 index 00000000000..3e9d5e7a4f9 --- /dev/null +++ b/internal/route/repo/wiki.go @@ -0,0 +1,271 @@ +package repo + +import ( + "net/http" + "strings" + "time" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/markup" +) + +const ( + tmplRepoWikiStart = "repo/wiki/start" + tmplRepoWikiView = "repo/wiki/view" + tmplRepoWikiNew = "repo/wiki/new" + tmplRepoWikiPages = "repo/wiki/pages" +) + +func MustEnableWiki(c *context.Context) { + if !c.Repo.Repository.EnableWiki { + c.NotFound() + return + } + + if c.Repo.Repository.EnableExternalWiki { + c.Redirect(c.Repo.Repository.ExternalWikiURL) + return + } +} + +type PageMeta struct { + Name string + URL string + Updated time.Time +} + +func renderWikiPage(c *context.Context, isViewPage bool) (*git.Repository, string) { + wikiPath := c.Repo.Repository.WikiPath() + wikiRepo, err := git.Open(wikiPath) + if err != nil { + c.Error(err, "open repository") + return nil, "" + } + commit, err := wikiRepo.BranchCommit(database.WikiBranch(wikiPath)) + if err != nil { + c.Error(err, "get branch commit") + return nil, "" + } + + // Get page list. + if isViewPage { + entries, err := commit.Entries(git.LsTreeOptions{Verbatim: true}) + if err != nil { + c.Error(err, "list entries") + return nil, "" + } + pages := make([]PageMeta, 0, len(entries)) + for i := range entries { + if entries[i].Type() == git.ObjectBlob && strings.HasSuffix(entries[i].Name(), ".md") { + name := strings.TrimSuffix(entries[i].Name(), ".md") + pages = append(pages, PageMeta{ + Name: name, + URL: database.ToWikiPageURL(name), + }) + } + } + c.Data["Pages"] = pages + } + + pageURL := c.Params(":page") + if pageURL == "" { + pageURL = "Home" + } + c.Data["PageURL"] = pageURL + + pageName := database.ToWikiPageName(pageURL) + c.Data["old_title"] = pageName + c.Data["Title"] = pageName + c.Data["title"] = pageName + c.Data["RequireHighlightJS"] = true + + blob, err := commit.Blob(pageName + ".md") + if err != nil { + if gitx.IsErrRevisionNotExist(err) { + c.Redirect(c.Repo.RepoLink + "/wiki/_pages") + } else { + c.Error(err, "get blob") + } + return nil, "" + } + p, err := blob.Bytes() + if err != nil { + c.Error(err, "read blob") + return nil, "" + } + if isViewPage { + c.Data["content"] = string(markup.Markdown(p, c.Repo.RepoLink, c.Repo.Repository.ComposeMetas())) + } else { + c.Data["content"] = string(p) + } + + return wikiRepo, pageName +} + +func Wiki(c *context.Context) { + c.Data["PageIsWiki"] = true + + if !c.Repo.Repository.HasWiki() { + c.Data["Title"] = c.Tr("repo.wiki") + c.Success(tmplRepoWikiStart) + return + } + + wikiRepo, pageName := renderWikiPage(c, true) + if c.Written() { + return + } + + // Get last change information. + branch := database.WikiBranch(c.Repo.Repository.WikiPath()) + commits, err := wikiRepo.Log(git.RefsHeads+branch, git.LogOptions{Path: pageName + ".md"}) + if err != nil { + c.Error(err, "get commits by path") + return + } + c.Data["Author"] = commits[0].Author + + c.Success(tmplRepoWikiView) +} + +func WikiPages(c *context.Context) { + c.Data["Title"] = c.Tr("repo.wiki.pages") + c.Data["PageIsWiki"] = true + + if !c.Repo.Repository.HasWiki() { + c.Redirect(c.Repo.RepoLink + "/wiki") + return + } + + wikiPath := c.Repo.Repository.WikiPath() + wikiRepo, err := git.Open(wikiPath) + if err != nil { + c.Error(err, "open repository") + return + } + + branch := database.WikiBranch(wikiPath) + commit, err := wikiRepo.BranchCommit(branch) + if err != nil { + c.Error(err, "get branch commit") + return + } + + entries, err := commit.Entries(git.LsTreeOptions{Verbatim: true}) + if err != nil { + c.Error(err, "list entries") + return + } + pages := make([]PageMeta, 0, len(entries)) + for i := range entries { + if entries[i].Type() == git.ObjectBlob && strings.HasSuffix(entries[i].Name(), ".md") { + commits, err := wikiRepo.Log(git.RefsHeads+branch, git.LogOptions{Path: entries[i].Name()}) + if err != nil { + c.Error(err, "get commits by path") + return + } + name := strings.TrimSuffix(entries[i].Name(), ".md") + pages = append(pages, PageMeta{ + Name: name, + URL: database.ToWikiPageURL(name), + Updated: commits[0].Author.When, + }) + } + } + c.Data["Pages"] = pages + + c.Success(tmplRepoWikiPages) +} + +func NewWiki(c *context.Context) { + c.Data["Title"] = c.Tr("repo.wiki.new_page") + c.Data["PageIsWiki"] = true + c.Data["RequireSimpleMDE"] = true + + if !c.Repo.Repository.HasWiki() { + c.Data["title"] = "Home" + } + + c.Success(tmplRepoWikiNew) +} + +func NewWikiPost(c *context.Context, f form.NewWiki) { + c.Data["Title"] = c.Tr("repo.wiki.new_page") + c.Data["PageIsWiki"] = true + c.Data["RequireSimpleMDE"] = true + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoWikiNew) + return + } + + if err := c.Repo.Repository.AddWikiPage(c.User, f.Title, f.Content, f.Message); err != nil { + if database.IsErrWikiAlreadyExist(err) { + c.Data["Err_Title"] = true + c.RenderWithErr(c.Tr("repo.wiki.page_already_exists"), http.StatusUnprocessableEntity, tmplRepoWikiNew, &f) + } else { + c.Error(err, "add wiki page") + } + return + } + + c.Redirect(c.Repo.RepoLink + "/wiki/" + database.ToWikiPageURL(database.ToWikiPageName(f.Title))) +} + +func EditWiki(c *context.Context) { + c.Data["PageIsWiki"] = true + c.Data["PageIsWikiEdit"] = true + c.Data["RequireSimpleMDE"] = true + + if !c.Repo.Repository.HasWiki() { + c.Redirect(c.Repo.RepoLink + "/wiki") + return + } + + renderWikiPage(c, false) + if c.Written() { + return + } + + c.Success(tmplRepoWikiNew) +} + +func EditWikiPost(c *context.Context, f form.NewWiki) { + c.Data["Title"] = c.Tr("repo.wiki.new_page") + c.Data["PageIsWiki"] = true + c.Data["RequireSimpleMDE"] = true + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplRepoWikiNew) + return + } + + if err := c.Repo.Repository.EditWikiPage(c.User, f.OldTitle, f.Title, f.Content, f.Message); err != nil { + c.Error(err, "edit wiki page") + return + } + + c.Redirect(c.Repo.RepoLink + "/wiki/" + database.ToWikiPageURL(database.ToWikiPageName(f.Title))) +} + +func DeleteWikiPagePost(c *context.Context) { + pageURL := c.Params(":page") + if pageURL == "" { + pageURL = "Home" + } + + pageName := database.ToWikiPageName(pageURL) + if err := c.Repo.Repository.DeleteWikiPage(c.User, pageName); err != nil { + c.Error(err, "delete wiki page") + return + } + + c.JSONSuccess(map[string]any{ + "redirect": c.Repo.RepoLink + "/wiki/", + }) +} diff --git a/internal/route/user/auth.go b/internal/route/user/auth.go new file mode 100644 index 00000000000..d198cff89b5 --- /dev/null +++ b/internal/route/user/auth.go @@ -0,0 +1,385 @@ +package user + +import ( + gocontext "context" + "encoding/hex" + "net/http" + "strconv" + + "github.com/go-macaron/captcha" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/email" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/tool" + "gogs.io/gogs/internal/userx" +) + +const ( + tmplUserAuthSignup = "user/auth/signup" + TmplUserAuthActivate = "user/auth/activate" + tmplUserAuthForgotPassword = "user/auth/forgot_passwd" + tmplUserAuthResetPassword = "user/auth/reset_passwd" +) + +func SignOut(c *context.Context) { + _ = c.Session.Flush() + _ = c.Session.Destory(c.Context) + c.SetCookie(conf.Session.CSRFCookieName, "", -1, conf.Server.Subpath) + if conf.Auth.CustomLogoutURL != "" { + c.Redirect(conf.Auth.CustomLogoutURL) + return + } + c.RedirectSubpath("/") +} + +func SignUp(c *context.Context) { + c.Title("sign_up") + + c.Data["EnableCaptcha"] = conf.Auth.EnableRegistrationCaptcha + + if conf.Auth.DisableRegistration { + c.Data["DisableRegistration"] = true + c.Success(tmplUserAuthSignup) + return + } + + c.Success(tmplUserAuthSignup) +} + +func SignUpPost(c *context.Context, cpt *captcha.Captcha, f form.Register) { + c.Title("sign_up") + + c.Data["EnableCaptcha"] = conf.Auth.EnableRegistrationCaptcha + + if conf.Auth.DisableRegistration { + c.Status(http.StatusForbidden) + return + } + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplUserAuthSignup) + return + } + + if conf.Auth.EnableRegistrationCaptcha && !cpt.VerifyReq(c.Req) { + c.FormErr("Captcha") + c.RenderWithErr(c.Tr("form.captcha_incorrect"), http.StatusUnauthorized, tmplUserAuthSignup, &f) + return + } + + if f.Password != f.Retype { + c.FormErr("Password") + c.RenderWithErr(c.Tr("form.password_not_match"), http.StatusBadRequest, tmplUserAuthSignup, &f) + return + } + + user, err := database.Handle.Users().Create( + c.Req.Context(), + f.UserName, + f.Email, + database.CreateUserOptions{ + Password: f.Password, + Activated: !conf.Auth.RequireEmailConfirmation, + }, + ) + if err != nil { + switch { + case database.IsErrUserAlreadyExist(err): + c.FormErr("UserName") + c.RenderWithErr(c.Tr("form.username_been_taken"), http.StatusUnprocessableEntity, tmplUserAuthSignup, &f) + case database.IsErrEmailAlreadyUsed(err): + c.FormErr("Email") + c.RenderWithErr(c.Tr("form.email_been_used"), http.StatusUnprocessableEntity, tmplUserAuthSignup, &f) + case database.IsErrNameNotAllowed(err): + c.FormErr("UserName") + c.RenderWithErr(c.Tr("user.form.name_not_allowed", err.(database.ErrNameNotAllowed).Value()), http.StatusBadRequest, tmplUserAuthSignup, &f) + default: + c.Error(err, "create user") + } + return + } + log.Trace("Account created: %s", user.Name) + + // FIXME: Count has pretty bad performance implication in large instances, we + // should have a dedicate method to check whether the "user" table is empty. + // + // Auto-set admin for the only user. + if database.Handle.Users().Count(c.Req.Context()) == 1 { + v := true + err := database.Handle.Users().Update( + c.Req.Context(), + user.ID, + database.UpdateUserOptions{ + IsActivated: &v, + IsAdmin: &v, + }, + ) + if err != nil { + c.Error(err, "update user") + return + } + } + + // Send confirmation email. + if conf.Auth.RequireEmailConfirmation && user.ID > 1 { + if err := email.SendActivateAccountMail(c.Context, database.NewMailerUser(user)); err != nil { + log.Error("Failed to send activate account mail: %v", err) + } + c.Data["IsSendRegisterMail"] = true + c.Data["Email"] = user.Email + c.Data["Hours"] = conf.Auth.ActivateCodeLives / 60 + c.Success(TmplUserAuthActivate) + + if err := c.Cache.Put(userx.MailResendCacheKey(user.ID), 1, 180); err != nil { + log.Error("Failed to put cache key 'mail resend': %v", err) + } + return + } + + c.RedirectSubpath("/user/sign-in") +} + +// parseUserFromCode returns user by username encoded in code. +// It returns nil if code or username is invalid. +func parseUserFromCode(code string) (user *database.User) { + if len(code) <= tool.TimeLimitCodeLength { + return nil + } + + // Use tail hex username to query user + hexStr := code[tool.TimeLimitCodeLength:] + if b, err := hex.DecodeString(hexStr); err == nil { + if user, err = database.Handle.Users().GetByUsername(gocontext.TODO(), string(b)); user != nil { + return user + } else if !database.IsErrUserNotExist(err) { + log.Error("Failed to get user by name %q: %v", string(b), err) + } + } + + return nil +} + +// verify active code when active account +func verifyUserActiveCode(code string) (user *database.User) { + minutes := conf.Auth.ActivateCodeLives + + if user = parseUserFromCode(code); user != nil { + // time limit code + prefix := code[:tool.TimeLimitCodeLength] + data := strconv.FormatInt(user.ID, 10) + user.Email + user.LowerName + user.Password + user.Rands + + if tool.VerifyTimeLimitCode(data, minutes, prefix) { + return user + } + } + return nil +} + +// verify active code when active account +func verifyActiveEmailCode(code, email string) *database.EmailAddress { + minutes := conf.Auth.ActivateCodeLives + + if user := parseUserFromCode(code); user != nil { + // time limit code + prefix := code[:tool.TimeLimitCodeLength] + data := strconv.FormatInt(user.ID, 10) + email + user.LowerName + user.Password + user.Rands + + if tool.VerifyTimeLimitCode(data, minutes, prefix) { + emailAddress, err := database.Handle.Users().GetEmail(gocontext.TODO(), user.ID, email, false) + if err == nil { + return emailAddress + } + } + } + return nil +} + +func Activate(c *context.Context) { + code := c.Query("code") + if code == "" { + c.Data["IsActivatePage"] = true + if c.User.IsActive { + c.NotFound() + return + } + // Resend confirmation email. + if conf.Auth.RequireEmailConfirmation { + if c.Cache.IsExist(userx.MailResendCacheKey(c.User.ID)) { + c.Data["ResendLimited"] = true + } else { + c.Data["Hours"] = conf.Auth.ActivateCodeLives / 60 + if err := email.SendActivateAccountMail(c.Context, database.NewMailerUser(c.User)); err != nil { + log.Error("Failed to send activate account mail: %v", err) + } + + if err := c.Cache.Put(userx.MailResendCacheKey(c.User.ID), 1, 180); err != nil { + log.Error("Failed to put cache key 'mail resend': %v", err) + } + } + } else { + c.Data["ServiceNotEnabled"] = true + } + c.Success(TmplUserAuthActivate) + return + } + + // Verify code. + if user := verifyUserActiveCode(code); user != nil { + v := true + err := database.Handle.Users().Update( + c.Req.Context(), + user.ID, + database.UpdateUserOptions{ + GenerateNewRands: true, + IsActivated: &v, + }, + ) + if err != nil { + c.Error(err, "update user") + return + } + + log.Trace("User activated: %s", user.Name) + + _ = c.Session.Set("uid", user.ID) + _ = c.Session.Set("uname", user.Name) + c.RedirectSubpath("/") + return + } + + c.Data["IsActivateFailed"] = true + c.Success(TmplUserAuthActivate) +} + +func ActivateEmail(c *context.Context) { + code := c.Query("code") + emailAddr := c.Query("email") + + // Verify code. + if email := verifyActiveEmailCode(code, emailAddr); email != nil { + err := database.Handle.Users().MarkEmailActivated(c.Req.Context(), email.UserID, email.Email) + if err != nil { + c.Error(err, "activate email") + return + } + + log.Trace("Email activated: %s", email.Email) + c.Flash.Success(c.Tr("settings.add_email_success")) + } + + c.RedirectSubpath("/user/settings/email") +} + +func ForgotPasswd(c *context.Context) { + c.Title("auth.forgot_password") + + if !conf.Email.Enabled { + c.Data["IsResetDisable"] = true + c.Success(tmplUserAuthForgotPassword) + return + } + + c.Data["IsResetRequest"] = true + c.Success(tmplUserAuthForgotPassword) +} + +func ForgotPasswdPost(c *context.Context) { + c.Title("auth.forgot_password") + + if !conf.Email.Enabled { + c.Status(403) + return + } + c.Data["IsResetRequest"] = true + + emailAddr := c.Query("email") + c.Data["Email"] = emailAddr + + u, err := database.Handle.Users().GetByEmail(c.Req.Context(), emailAddr) + if err != nil { + if database.IsErrUserNotExist(err) { + c.Data["Hours"] = conf.Auth.ActivateCodeLives / 60 + c.Data["IsResetSent"] = true + c.Success(tmplUserAuthForgotPassword) + return + } + + c.Error(err, "get user by email") + return + } + + if !u.IsLocal() { + c.FormErr("Email") + c.RenderWithErr(c.Tr("auth.non_local_account"), http.StatusForbidden, tmplUserAuthForgotPassword, nil) + return + } + + if c.Cache.IsExist(userx.MailResendCacheKey(u.ID)) { + c.Data["ResendLimited"] = true + c.Success(tmplUserAuthForgotPassword) + return + } + + if err = email.SendResetPasswordMail(c.Context, database.NewMailerUser(u)); err != nil { + log.Error("Failed to send reset password mail: %v", err) + } + if err = c.Cache.Put(userx.MailResendCacheKey(u.ID), 1, 180); err != nil { + log.Error("Failed to put cache key 'mail resend': %v", err) + } + + c.Data["Hours"] = conf.Auth.ActivateCodeLives / 60 + c.Data["IsResetSent"] = true + c.Success(tmplUserAuthForgotPassword) +} + +func ResetPasswd(c *context.Context) { + c.Title("auth.reset_password") + + code := c.Query("code") + if code == "" { + c.NotFound() + return + } + c.Data["Code"] = code + c.Data["IsResetForm"] = true + c.Success(tmplUserAuthResetPassword) +} + +func ResetPasswdPost(c *context.Context) { + c.Title("auth.reset_password") + + code := c.Query("code") + if code == "" { + c.NotFound() + return + } + c.Data["Code"] = code + + if u := verifyUserActiveCode(code); u != nil { + // Validate password length. + password := c.Query("password") + if len(password) < 6 { + c.Data["IsResetForm"] = true + c.Data["Err_Password"] = true + c.RenderWithErr(c.Tr("auth.password_too_short"), http.StatusBadRequest, tmplUserAuthResetPassword, nil) + return + } + + err := database.Handle.Users().Update(c.Req.Context(), u.ID, database.UpdateUserOptions{Password: &password}) + if err != nil { + c.Error(err, "update user") + return + } + + log.Trace("User password reset: %s", u.Name) + c.RedirectSubpath("/user/sign-in") + return + } + + c.Data["IsResetFailed"] = true + c.Success(tmplUserAuthResetPassword) +} diff --git a/internal/route/user/home.go b/internal/route/user/home.go new file mode 100644 index 00000000000..3940dca12d5 --- /dev/null +++ b/internal/route/user/home.go @@ -0,0 +1,446 @@ +package user + +import ( + "bytes" + "fmt" + "net/http" + "slices" + + "github.com/unknwon/paginater" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" +) + +const ( + tmplUserDashboard = "user/dashboard/dashboard" + tmplUserDashboardFeeds = "user/dashboard/feeds" + tmplUserDashboardIssues = "user/dashboard/issues" + tmplUserProfile = "user/profile" + tmplOrgHome = "org/home" +) + +// getDashboardContextUser finds out dashboard is viewing as which context user. +func getDashboardContextUser(c *context.Context) *database.User { + ctxUser := c.User + orgName := c.Params(":org") + if len(orgName) > 0 { + // Organization. + org, err := database.Handle.Users().GetByUsername(c.Req.Context(), orgName) + if err != nil { + c.NotFoundOrError(err, "get user by name") + return nil + } + ctxUser = org + } + c.Data["ContextUser"] = ctxUser + + orgs, err := database.Handle.Organizations().List( + c.Req.Context(), + database.ListOrgsOptions{ + MemberID: c.User.ID, + IncludePrivateMembers: true, + }, + ) + if err != nil { + c.Error(err, "list organizations") + return nil + } + c.Data["Orgs"] = orgs + + 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(c *context.Context, ctxUser *database.User, userID int64, isProfile bool) { + afterID := c.QueryInt64("after_id") + + var err error + var actions []*database.Action + if ctxUser.IsOrganization() { + actions, err = database.Handle.Actions().ListByOrganization(c.Req.Context(), ctxUser.ID, userID, afterID) + } else { + actions, err = database.Handle.Actions().ListByUser(c.Req.Context(), ctxUser.ID, userID, afterID, isProfile) + } + if err != nil { + c.Error(err, "list actions") + return + } + + // Check access of private repositories. + feeds := make([]*database.Action, 0, len(actions)) + unameAvatars := make(map[string]string) + for _, act := range actions { + // Cache results to reduce queries. + _, ok := unameAvatars[act.ActUserName] + if !ok { + u, err := database.Handle.Users().GetByUsername(c.Req.Context(), act.ActUserName) + if err != nil { + if database.IsErrUserNotExist(err) { + continue + } + c.Error(err, "get user by name") + return + } + unameAvatars[act.ActUserName] = u.AvatarURLPath() + } + + act.ActAvatar = unameAvatars[act.ActUserName] + feeds = append(feeds, act) + } + c.Data["Feeds"] = feeds + if len(feeds) > 0 { + afterID := feeds[len(feeds)-1].ID + c.Data["AfterID"] = afterID + c.Header().Set("X-AJAX-URL", fmt.Sprintf("%s?after_id=%d", c.Data["Link"], afterID)) + } +} + +func Dashboard(c *context.Context) { + ctxUser := getDashboardContextUser(c) + if c.Written() { + return + } + + retrieveFeeds(c, ctxUser, c.User.ID, false) + if c.Written() { + return + } + + if c.Req.Header.Get("X-AJAX") == "true" { + c.Success(tmplUserDashboardFeeds) + return + } + + c.Data["Title"] = ctxUser.DisplayName() + " - " + c.Tr("dashboard") + c.Data["PageIsDashboard"] = true + c.Data["PageIsNews"] = true + + // Only user can have collaborative repositories. + if !ctxUser.IsOrganization() { + collaborateRepos, err := database.Handle.Repositories().GetByCollaboratorID(c.Req.Context(), c.User.ID, conf.UI.User.RepoPagingNum, "updated_unix DESC") + if err != nil { + c.Error(err, "get accessible repositories by collaborator") + return + } else if err = database.RepositoryList(collaborateRepos).LoadAttributes(); err != nil { + c.Error(err, "load attributes") + return + } + c.Data["CollaborativeRepos"] = collaborateRepos + } + + var err error + var repos, mirrors []*database.Repository + var repoCount int64 + if ctxUser.IsOrganization() { + repos, repoCount, err = ctxUser.GetUserRepositories(c.User.ID, 1, conf.UI.User.RepoPagingNum) + if err != nil { + c.Error(err, "get user repositories") + return + } + + mirrors, err = ctxUser.GetUserMirrorRepositories(c.User.ID) + if err != nil { + c.Error(err, "get user mirror repositories") + return + } + } else { + repos, err = database.GetUserRepositories( + &database.UserRepoOptions{ + UserID: ctxUser.ID, + Private: true, + Page: 1, + PageSize: conf.UI.User.RepoPagingNum, + }, + ) + if err != nil { + c.Error(err, "get repositories") + return + } + repoCount = int64(ctxUser.NumRepos) + + mirrors, err = database.GetUserMirrorRepositories(ctxUser.ID) + if err != nil { + c.Error(err, "get mirror repositories") + return + } + } + c.Data["Repos"] = repos + c.Data["RepoCount"] = repoCount + c.Data["MaxShowRepoNum"] = conf.UI.User.RepoPagingNum + + if err := database.MirrorRepositoryList(mirrors).LoadAttributes(); err != nil { + c.Error(err, "load attributes") + return + } + c.Data["MirrorCount"] = len(mirrors) + c.Data["Mirrors"] = mirrors + + c.Success(tmplUserDashboard) +} + +func Issues(c *context.Context) { + isPullList := c.Params(":type") == "pulls" + if isPullList { + c.Data["Title"] = c.Tr("pull_requests") + c.Data["PageIsPulls"] = true + } else { + c.Data["Title"] = c.Tr("issues") + c.Data["PageIsIssues"] = true + } + + ctxUser := getDashboardContextUser(c) + if c.Written() { + return + } + + var ( + sortType = c.Query("sort") + filterMode = database.FilterModeYourRepos + ) + + // Note: Organization does not have view type and filter mode. + if !ctxUser.IsOrganization() { + viewType := c.Query("type") + types := []string{ + string(database.FilterModeYourRepos), + string(database.FilterModeAssign), + string(database.FilterModeCreate), + } + if !slices.Contains(types, viewType) { + viewType = string(database.FilterModeYourRepos) + } + filterMode = database.FilterMode(viewType) + } + + page := max(c.QueryInt("page"), 1) + + repoID := c.QueryInt64("repo") + isShowClosed := c.Query("state") == "closed" + + // Get repositories. + var ( + err error + repos []*database.Repository + userRepoIDs []int64 + showRepos = make([]*database.Repository, 0, 10) + ) + if ctxUser.IsOrganization() { + repos, _, err = ctxUser.GetUserRepositories(c.User.ID, 1, ctxUser.NumRepos) + if err != nil { + c.Error(err, "get repositories") + return + } + } else { + repos, err = database.GetUserRepositories( + &database.UserRepoOptions{ + UserID: ctxUser.ID, + Private: true, + Page: 1, + PageSize: ctxUser.NumRepos, + }, + ) + if err != nil { + c.Error(err, "get repositories") + return + } + } + + userRepoIDs = make([]int64, 0, len(repos)) + for _, repo := range repos { + userRepoIDs = append(userRepoIDs, repo.ID) + + if filterMode != database.FilterModeYourRepos { + continue + } + + if isPullList { + if isShowClosed && repo.NumClosedPulls == 0 || + !isShowClosed && repo.NumOpenPulls == 0 { + continue + } + } else { + if !repo.EnableIssues || repo.EnableExternalTracker || + isShowClosed && repo.NumClosedIssues == 0 || + !isShowClosed && repo.NumOpenIssues == 0 { + continue + } + } + + showRepos = append(showRepos, repo) + } + + // Filter repositories if the page shows issues. + if !isPullList { + userRepoIDs, err = database.FilterRepositoryWithIssues(userRepoIDs) + if err != nil { + c.Error(err, "filter repositories with issues") + return + } + } + + issueOptions := &database.IssuesOptions{ + RepoID: repoID, + Page: page, + IsClosed: isShowClosed, + IsPull: isPullList, + SortType: sortType, + } + switch filterMode { + case database.FilterModeYourRepos: + // Get all issues from repositories from this user. + if userRepoIDs == nil { + issueOptions.RepoIDs = []int64{-1} + } else { + issueOptions.RepoIDs = userRepoIDs + } + + case database.FilterModeAssign: + // Get all issues assigned to this user. + issueOptions.AssigneeID = ctxUser.ID + + case database.FilterModeCreate: + // Get all issues created by this user. + issueOptions.PosterID = ctxUser.ID + } + + issues, err := database.Issues(issueOptions) + if err != nil { + c.Error(err, "list issues") + return + } + + if repoID > 0 { + repo, err := database.GetRepositoryByID(repoID) + if err != nil { + c.Error(err, "get repository by ID") + return + } + + if err = repo.GetOwner(); err != nil { + c.Error(err, "get owner") + return + } + + // Check if user has access to given repository. + if !repo.IsOwnedBy(ctxUser.ID) && !repo.HasAccess(ctxUser.ID) { + c.NotFound() + return + } + } + + for _, issue := range issues { + if err = issue.Repo.GetOwner(); err != nil { + c.Error(err, "get owner") + return + } + } + + issueStats := database.GetUserIssueStats(repoID, ctxUser.ID, userRepoIDs, filterMode, isPullList) + + var total int + if !isShowClosed { + total = int(issueStats.OpenCount) + } else { + total = int(issueStats.ClosedCount) + } + + c.Data["Issues"] = issues + c.Data["Repos"] = showRepos + c.Data["Page"] = paginater.New(total, conf.UI.IssuePagingNum, page, 5) + c.Data["IssueStats"] = issueStats + c.Data["ViewType"] = string(filterMode) + c.Data["SortType"] = sortType + c.Data["RepoID"] = repoID + c.Data["IsShowClosed"] = isShowClosed + + if isShowClosed { + c.Data["State"] = "closed" + } else { + c.Data["State"] = "open" + } + + c.Success(tmplUserDashboardIssues) +} + +func ShowSSHKeys(c *context.Context, uid int64) { + keys, err := database.ListPublicKeys(uid) + if err != nil { + c.Error(err, "list public keys") + return + } + + var buf bytes.Buffer + for i := range keys { + buf.WriteString(keys[i].OmitEmail()) + buf.WriteString("\n") + } + c.PlainText(http.StatusOK, buf.String()) +} + +func showOrgProfile(c *context.Context) { + c.SetParams(":org", c.Params(":username")) + context.HandleOrgAssignment(c) + if c.Written() { + return + } + + org := c.Org.Organization + c.Data["Title"] = org.FullName + + page := c.QueryInt("page") + if page <= 0 { + page = 1 + } + + var ( + repos []*database.Repository + count int64 + err error + ) + if c.IsLogged && !c.User.IsAdmin { + repos, count, err = org.GetUserRepositories(c.User.ID, page, conf.UI.User.RepoPagingNum) + if err != nil { + c.Error(err, "get user repositories") + return + } + c.Data["Repos"] = repos + } else { + showPrivate := c.IsLogged && c.User.IsAdmin + repos, err = database.GetUserRepositories(&database.UserRepoOptions{ + UserID: org.ID, + Private: showPrivate, + Page: page, + PageSize: conf.UI.User.RepoPagingNum, + }) + if err != nil { + c.Error(err, "get user repositories") + return + } + c.Data["Repos"] = repos + count = database.CountUserRepositories(org.ID, showPrivate) + } + c.Data["Page"] = paginater.New(int(count), conf.UI.User.RepoPagingNum, page, 5) + + if err := org.GetMembers(12); err != nil { + c.Error(err, "get members") + return + } + c.Data["Members"] = org.Members + + c.Data["Teams"] = org.Teams + + c.Success(tmplOrgHome) +} + +func Email2User(c *context.Context) { + u, err := database.Handle.Users().GetByEmail(c.Req.Context(), c.Query("email")) + if err != nil { + c.NotFoundOrError(err, "get user by email") + return + } + c.Redirect(conf.Server.Subpath + "/user/" + u.Name) +} diff --git a/internal/route/user/profile.go b/internal/route/user/profile.go new file mode 100644 index 00000000000..9da40a0ed40 --- /dev/null +++ b/internal/route/user/profile.go @@ -0,0 +1,129 @@ +package user + +import ( + "strings" + + "github.com/unknwon/paginater" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/route/repo" + "gogs.io/gogs/internal/urlx" +) + +const ( + FOLLOWERS = "user/meta/followers" + STARS = "user/meta/stars" +) + +func Profile(c *context.Context, puser *context.ParamsUser) { + // Show SSH keys. + if strings.HasSuffix(c.Params(":username"), ".keys") { + ShowSSHKeys(c, puser.ID) + return + } + + if puser.IsOrganization() { + showOrgProfile(c) + return + } + + c.Title(puser.DisplayName()) + c.PageIs("UserProfile") + c.Data["Owner"] = puser + + orgs, err := database.GetOrgsByUserID(puser.ID, c.IsLogged && (c.User.IsAdmin || c.User.ID == puser.ID)) + if err != nil { + c.Error(err, "get organizations by user ID") + return + } + + c.Data["Orgs"] = orgs + + tab := c.Query("tab") + c.Data["TabName"] = tab + switch tab { + case "activity": + retrieveFeeds(c, puser.User, c.UserID(), true) + if c.Written() { + return + } + default: + page := c.QueryInt("page") + if page <= 0 { + page = 1 + } + + showPrivate := c.IsLogged && (puser.ID == c.User.ID || c.User.IsAdmin) + c.Data["Repos"], err = database.GetUserRepositories(&database.UserRepoOptions{ + UserID: puser.ID, + Private: showPrivate, + Page: page, + PageSize: conf.UI.User.RepoPagingNum, + }) + if err != nil { + c.Error(err, "get user repositories") + return + } + + count := database.CountUserRepositories(puser.ID, showPrivate) + c.Data["Page"] = paginater.New(int(count), conf.UI.User.RepoPagingNum, page, 5) + } + + c.Success(tmplUserProfile) +} + +func Followers(c *context.Context, puser *context.ParamsUser) { + c.Title(puser.DisplayName()) + c.PageIs("Followers") + c.Data["CardsTitle"] = c.Tr("user.followers") + c.Data["Owner"] = puser + repo.RenderUserCards( + c, + puser.NumFollowers, + func(page int) ([]*database.User, error) { + return database.Handle.Users().ListFollowers(c.Req.Context(), puser.ID, page, database.ItemsPerPage) + }, + FOLLOWERS, + ) +} + +func Following(c *context.Context, puser *context.ParamsUser) { + c.Title(puser.DisplayName()) + c.PageIs("Following") + c.Data["CardsTitle"] = c.Tr("user.following") + c.Data["Owner"] = puser + repo.RenderUserCards( + c, + puser.NumFollowing, + func(page int) ([]*database.User, error) { + return database.Handle.Users().ListFollowings(c.Req.Context(), puser.ID, page, database.ItemsPerPage) + }, + FOLLOWERS, + ) +} + +func Stars(_ *context.Context) { +} + +func Action(c *context.Context, puser *context.ParamsUser) { + var err error + switch c.Params(":action") { + case "follow": + err = database.Handle.Users().Follow(c.Req.Context(), c.UserID(), puser.ID) + case "unfollow": + err = database.Handle.Users().Unfollow(c.Req.Context(), c.UserID(), puser.ID) + } + + if err != nil { + c.Errorf(err, "action %q", c.Params(":action")) + return + } + + redirectTo := c.Query("redirect_to") + if !urlx.IsSameSite(redirectTo) { + redirectTo = puser.HomeURLPath() + } + c.Redirect(redirectTo) +} diff --git a/internal/route/user/setting.go b/internal/route/user/setting.go new file mode 100644 index 00000000000..b642047ab36 --- /dev/null +++ b/internal/route/user/setting.go @@ -0,0 +1,737 @@ +package user + +import ( + "bytes" + gocontext "context" + "encoding/base64" + "fmt" + "html/template" + "image/png" + "io" + "net/http" + + "github.com/cockroachdb/errors" + "github.com/pquerna/otp" + "github.com/pquerna/otp/totp" + "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/auth" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/cryptox" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/email" + "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/tool" + "gogs.io/gogs/internal/userx" +) + +// SettingsHandler is the handler for users settings endpoints. +type SettingsHandler struct { + store SettingsStore +} + +// NewSettingsHandler returns a new SettingsHandler for users settings endpoints. +func NewSettingsHandler(s SettingsStore) *SettingsHandler { + return &SettingsHandler{ + store: s, + } +} + +const ( + tmplUserSettingsProfile = "user/settings/profile" + tmplUserSettingsAvatar = "user/settings/avatar" + tmplUserSettingsPassword = "user/settings/password" + tmplUserSettingsEmail = "user/settings/email" + tmplUserSettingsSSHKeys = "user/settings/sshkeys" + tmplUserSettingsSecurity = "user/settings/security" + tmplUserSettingsTwoFactorEnable = "user/settings/two_factor_enable" + tmplUserSettingsTwoFactorRecoveryCodes = "user/settings/two_factor_recovery_codes" + tmplUserSettingsRepositories = "user/settings/repositories" + tmplUserSettingsOrganizations = "user/settings/organizations" + tmplUserSettingsApplications = "user/settings/applications" + tmplUserSettingsDelete = "user/settings/delete" + tmplUserNotification = "user/notification" +) + +func Settings(c *context.Context) { + c.Title("settings.profile") + c.PageIs("SettingsProfile") + c.Data["origin_name"] = c.User.Name + c.Data["name"] = c.User.Name + c.Data["full_name"] = c.User.FullName + c.Data["email"] = c.User.Email + c.Data["website"] = c.User.Website + c.Data["location"] = c.User.Location + c.Success(tmplUserSettingsProfile) +} + +func SettingsPost(c *context.Context, f form.UpdateProfile) { + c.Title("settings.profile") + c.PageIs("SettingsProfile") + c.Data["origin_name"] = c.User.Name + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplUserSettingsProfile) + return + } + + // Non-local users are not allowed to change their username + if c.User.IsLocal() { + // Check if the username (including cases) had been changed + if c.User.Name != f.Name { + err := database.Handle.Users().ChangeUsername(c.Req.Context(), c.User.ID, f.Name) + if err != nil { + c.FormErr("Name") + switch { + case database.IsErrUserAlreadyExist(errors.Cause(err)): + c.RenderWithErr(c.Tr("form.username_been_taken"), http.StatusUnprocessableEntity, tmplUserSettingsProfile, &f) + case database.IsErrNameNotAllowed(errors.Cause(err)): + c.RenderWithErr(c.Tr("user.form.name_not_allowed", err.(database.ErrNameNotAllowed).Value()), http.StatusBadRequest, tmplUserSettingsProfile, &f) + default: + c.Error(err, "change user name") + } + return + } + + log.Trace("Username changed: %s -> %s", c.User.Name, f.Name) + } + } + + err := database.Handle.Users().Update( + c.Req.Context(), + c.User.ID, + database.UpdateUserOptions{ + FullName: &f.FullName, + Website: &f.Website, + Location: &f.Location, + }, + ) + if err != nil { + c.Error(err, "update user") + return + } + + c.Flash.Success(c.Tr("settings.update_profile_success")) + c.RedirectSubpath("/user/settings") +} + +// FIXME: limit upload size +func UpdateAvatarSetting(c *context.Context, f form.Avatar, ctxUser *database.User) error { + if f.Source == form.AvatarLookup && f.Gravatar != "" { + avatar := cryptox.MD5(f.Gravatar) + err := database.Handle.Users().Update( + c.Req.Context(), + ctxUser.ID, + database.UpdateUserOptions{ + Avatar: &avatar, + AvatarEmail: &f.Gravatar, + }, + ) + if err != nil { + return errors.Wrap(err, "update user") + } + + err = database.Handle.Users().DeleteCustomAvatar(c.Req.Context(), c.User.ID) + if err != nil { + return errors.Wrap(err, "delete custom avatar") + } + return nil + } + + if f.Avatar != nil && f.Avatar.Filename != "" { + r, err := f.Avatar.Open() + if err != nil { + return errors.Newf("open avatar reader: %v", err) + } + defer func() { _ = r.Close() }() + + data, err := io.ReadAll(r) + if err != nil { + return errors.Newf("read avatar content: %v", err) + } + if !tool.IsImageFile(data) { + return errors.New(c.Tr("settings.uploaded_avatar_not_a_image")) + } + + err = database.Handle.Users().UseCustomAvatar(c.Req.Context(), ctxUser.ID, data) + if err != nil { + return errors.Wrap(err, "save avatar") + } + return nil + } + return nil +} + +func SettingsAvatar(c *context.Context) { + c.Title("settings.avatar") + c.PageIs("SettingsAvatar") + c.Success(tmplUserSettingsAvatar) +} + +func SettingsAvatarPost(c *context.Context, f form.Avatar) { + if err := UpdateAvatarSetting(c, f, c.User); err != nil { + c.Flash.Error(err.Error()) + } else { + c.Flash.Success(c.Tr("settings.update_avatar_success")) + } + + c.RedirectSubpath("/user/settings/avatar") +} + +func SettingsDeleteAvatar(c *context.Context) { + err := database.Handle.Users().DeleteCustomAvatar(c.Req.Context(), c.User.ID) + if err != nil { + c.Flash.Error(fmt.Sprintf("Failed to delete avatar: %v", err)) + } + + c.RedirectSubpath("/user/settings/avatar") +} + +func SettingsPassword(c *context.Context) { + c.Title("settings.password") + c.PageIs("SettingsPassword") + c.Success(tmplUserSettingsPassword) +} + +func SettingsPasswordPost(c *context.Context, f form.ChangePassword) { + c.Title("settings.password") + c.PageIs("SettingsPassword") + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplUserSettingsPassword) + return + } + + if !userx.ValidatePassword(c.User.Password, c.User.Salt, f.OldPassword) { + c.Flash.Error(c.Tr("settings.password_incorrect")) + } else if f.Password != f.Retype { + c.Flash.Error(c.Tr("form.password_not_match")) + } else { + err := database.Handle.Users().Update( + c.Req.Context(), + c.User.ID, + database.UpdateUserOptions{ + Password: &f.Password, + }, + ) + if err != nil { + c.Errorf(err, "update user") + return + } + c.Flash.Success(c.Tr("settings.change_password_success")) + } + + c.RedirectSubpath("/user/settings/password") +} + +func SettingsEmails(c *context.Context) { + c.Title("settings.emails") + c.PageIs("SettingsEmails") + + emails, err := database.Handle.Users().ListEmails(c.Req.Context(), c.User.ID) + if err != nil { + c.Errorf(err, "get email addresses") + return + } + c.Data["Emails"] = emails + + c.Success(tmplUserSettingsEmail) +} + +func SettingsEmailPost(c *context.Context, f form.AddEmail) { + c.Title("settings.emails") + c.PageIs("SettingsEmails") + + if c.Query("_method") == "PRIMARY" { + err := database.Handle.Users().MarkEmailPrimary(c.Req.Context(), c.User.ID, c.Query("email")) + if err != nil { + c.Errorf(err, "make email primary") + return + } + + c.RedirectSubpath("/user/settings/email") + return + } + + // Add Email address. + emails, err := database.Handle.Users().ListEmails(c.Req.Context(), c.User.ID) + if err != nil { + c.Errorf(err, "get email addresses") + return + } + c.Data["Emails"] = emails + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplUserSettingsEmail) + return + } + + err = database.Handle.Users().AddEmail(c.Req.Context(), c.User.ID, f.Email, !conf.Auth.RequireEmailConfirmation) + if err != nil { + if database.IsErrEmailAlreadyUsed(err) { + c.RenderWithErr(c.Tr("form.email_been_used"), http.StatusUnprocessableEntity, tmplUserSettingsEmail, &f) + } else { + c.Errorf(err, "add email address") + } + return + } + + // Send confirmation email + if conf.Auth.RequireEmailConfirmation { + if err := email.SendActivateEmailMail(c.Context, database.NewMailerUser(c.User), f.Email); err != nil { + log.Error("Failed to send activate email mail: %v", err) + } + + if err := c.Cache.Put("MailResendLimit_"+c.User.LowerName, c.User.LowerName, 180); err != nil { + log.Error("Set cache 'MailResendLimit' failed: %v", err) + } + c.Flash.Info(c.Tr("settings.add_email_confirmation_sent", f.Email, conf.Auth.ActivateCodeLives/60)) + } else { + c.Flash.Success(c.Tr("settings.add_email_success")) + } + + c.RedirectSubpath("/user/settings/email") +} + +func DeleteEmail(c *context.Context) { + email := c.Query("id") // The "id" here is the actual email address + if c.User.Email == email { + c.Flash.Error(c.Tr("settings.email_deletion_primary")) + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/user/settings/email", + }) + return + } + + err := database.Handle.Users().DeleteEmail(c.Req.Context(), c.User.ID, email) + if err != nil { + c.Error(err, "delete email address") + return + } + + c.Flash.Success(c.Tr("settings.email_deletion_success")) + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/user/settings/email", + }) +} + +func SettingsSSHKeys(c *context.Context) { + c.Title("settings.ssh_keys") + c.PageIs("SettingsSSHKeys") + + keys, err := database.ListPublicKeys(c.User.ID) + if err != nil { + c.Errorf(err, "list public keys") + return + } + c.Data["Keys"] = keys + + c.Success(tmplUserSettingsSSHKeys) +} + +func SettingsSSHKeysPost(c *context.Context, f form.AddSSHKey) { + c.Title("settings.ssh_keys") + c.PageIs("SettingsSSHKeys") + + keys, err := database.ListPublicKeys(c.User.ID) + if err != nil { + c.Errorf(err, "list public keys") + return + } + c.Data["Keys"] = keys + + if c.HasError() { + c.HTML(http.StatusBadRequest, tmplUserSettingsSSHKeys) + return + } + + content, err := database.CheckPublicKeyString(f.Content) + if err != nil { + if database.IsErrKeyUnableVerify(err) { + c.Flash.Info(c.Tr("form.unable_verify_ssh_key")) + } else { + c.Flash.Error(c.Tr("form.invalid_ssh_key", err.Error())) + c.RedirectSubpath("/user/settings/ssh") + return + } + } + + if _, err = database.AddPublicKey(c.User.ID, f.Title, content); err != nil { + c.Data["HasError"] = true + switch { + case database.IsErrKeyAlreadyExist(err): + c.FormErr("Content") + c.RenderWithErr(c.Tr("settings.ssh_key_been_used"), http.StatusUnprocessableEntity, tmplUserSettingsSSHKeys, &f) + case database.IsErrKeyNameAlreadyUsed(err): + c.FormErr("Title") + c.RenderWithErr(c.Tr("settings.ssh_key_name_used"), http.StatusUnprocessableEntity, tmplUserSettingsSSHKeys, &f) + default: + c.Errorf(err, "add public key") + } + return + } + + c.Flash.Success(c.Tr("settings.add_key_success", f.Title)) + c.RedirectSubpath("/user/settings/ssh") +} + +func DeleteSSHKey(c *context.Context) { + if err := database.DeletePublicKey(c.User, c.QueryInt64("id")); err != nil { + c.Flash.Error("DeletePublicKey: " + err.Error()) + } else { + c.Flash.Success(c.Tr("settings.ssh_key_deletion_success")) + } + + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/user/settings/ssh", + }) +} + +func SettingsSecurity(c *context.Context) { + c.Title("settings.security") + c.PageIs("SettingsSecurity") + + t, err := database.Handle.TwoFactors().GetByUserID(c.Req.Context(), c.UserID()) + if err != nil && !database.IsErrTwoFactorNotFound(err) { + c.Errorf(err, "get two factor by user ID") + return + } + c.Data["TwoFactor"] = t + + c.Success(tmplUserSettingsSecurity) +} + +func SettingsTwoFactorEnable(c *context.Context) { + if database.Handle.TwoFactors().IsEnabled(c.Req.Context(), c.User.ID) { + c.NotFound() + return + } + + c.Title("settings.two_factor_enable_title") + c.PageIs("SettingsSecurity") + + var key *otp.Key + var err error + keyURL := c.Session.Get("twoFactorURL") + if keyURL != nil { + key, _ = otp.NewKeyFromURL(keyURL.(string)) + } + if key == nil { + key, err = totp.Generate(totp.GenerateOpts{ + Issuer: conf.App.BrandName, + AccountName: c.User.Email, + }) + if err != nil { + c.Errorf(err, "generate TOTP") + return + } + } + c.Data["TwoFactorSecret"] = key.Secret() + + img, err := key.Image(240, 240) + if err != nil { + c.Errorf(err, "generate image") + return + } + + var buf bytes.Buffer + if err = png.Encode(&buf, img); err != nil { + c.Errorf(err, "encode image") + return + } + c.Data["QRCode"] = template.URL("data:image/png;base64," + base64.StdEncoding.EncodeToString(buf.Bytes())) + + _ = c.Session.Set("twoFactorSecret", c.Data["TwoFactorSecret"]) + _ = c.Session.Set("twoFactorURL", key.String()) + c.Success(tmplUserSettingsTwoFactorEnable) +} + +func SettingsTwoFactorEnablePost(c *context.Context) { + secret, ok := c.Session.Get("twoFactorSecret").(string) + if !ok { + c.NotFound() + return + } + + if !totp.Validate(c.Query("passcode"), secret) { + c.Flash.Error(c.Tr("settings.two_factor_invalid_passcode")) + c.RedirectSubpath("/user/settings/security/two_factor_enable") + return + } + + if err := database.Handle.TwoFactors().Create(c.Req.Context(), c.UserID(), conf.Security.SecretKey, secret); err != nil { + c.Flash.Error(c.Tr("settings.two_factor_enable_error", err)) + c.RedirectSubpath("/user/settings/security/two_factor_enable") + return + } + + _ = c.Session.Delete("twoFactorSecret") + _ = c.Session.Delete("twoFactorURL") + c.Flash.Success(c.Tr("settings.two_factor_enable_success")) + c.RedirectSubpath("/user/settings/security/two_factor_recovery_codes") +} + +func SettingsTwoFactorRecoveryCodes(c *context.Context) { + if !database.Handle.TwoFactors().IsEnabled(c.Req.Context(), c.User.ID) { + c.NotFound() + return + } + + c.Title("settings.two_factor_recovery_codes_title") + c.PageIs("SettingsSecurity") + + recoveryCodes, err := database.GetRecoveryCodesByUserID(c.UserID()) + if err != nil { + c.Errorf(err, "get recovery codes by user ID") + return + } + c.Data["RecoveryCodes"] = recoveryCodes + + c.Success(tmplUserSettingsTwoFactorRecoveryCodes) +} + +func SettingsTwoFactorRecoveryCodesPost(c *context.Context) { + if !database.Handle.TwoFactors().IsEnabled(c.Req.Context(), c.User.ID) { + c.NotFound() + return + } + + if err := database.RegenerateRecoveryCodes(c.UserID()); err != nil { + c.Flash.Error(c.Tr("settings.two_factor_regenerate_recovery_codes_error", err)) + } else { + c.Flash.Success(c.Tr("settings.two_factor_regenerate_recovery_codes_success")) + } + + c.RedirectSubpath("/user/settings/security/two_factor_recovery_codes") +} + +func SettingsTwoFactorDisable(c *context.Context) { + if !database.Handle.TwoFactors().IsEnabled(c.Req.Context(), c.User.ID) { + c.NotFound() + return + } + + if err := database.DeleteTwoFactor(c.UserID()); err != nil { + c.Errorf(err, "delete two factor") + return + } + + c.Flash.Success(c.Tr("settings.two_factor_disable_success")) + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/user/settings/security", + }) +} + +func SettingsRepos(c *context.Context) { + c.Title("settings.repos") + c.PageIs("SettingsRepositories") + + repos, err := database.GetUserAndCollaborativeRepositories(c.User.ID) + if err != nil { + c.Errorf(err, "get user and collaborative repositories") + return + } + if err = database.RepositoryList(repos).LoadAttributes(); err != nil { + c.Errorf(err, "load attributes") + return + } + c.Data["Repos"] = repos + + c.Success(tmplUserSettingsRepositories) +} + +func SettingsLeaveRepo(c *context.Context) { + repo, err := database.GetRepositoryByID(c.QueryInt64("id")) + if err != nil { + c.NotFoundOrError(err, "get repository by ID") + return + } + + if err = repo.DeleteCollaboration(c.User.ID); err != nil { + c.Errorf(err, "delete collaboration") + return + } + + c.Flash.Success(c.Tr("settings.repos.leave_success", repo.FullName())) + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/user/settings/repositories", + }) +} + +func SettingsOrganizations(c *context.Context) { + c.Title("settings.orgs") + c.PageIs("SettingsOrganizations") + + orgs, err := database.GetOrgsByUserID(c.User.ID, true) + if err != nil { + c.Errorf(err, "get organizations by user ID") + return + } + c.Data["Orgs"] = orgs + + c.Success(tmplUserSettingsOrganizations) +} + +func SettingsLeaveOrganization(c *context.Context) { + if err := database.RemoveOrgUser(c.QueryInt64("id"), c.User.ID); err != nil { + if database.IsErrLastOrgOwner(err) { + c.Flash.Error(c.Tr("form.last_org_owner")) + } else { + c.Errorf(err, "remove organization user") + return + } + } + + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/user/settings/organizations", + }) +} + +func (h *SettingsHandler) Applications() macaron.Handler { + return func(c *context.Context) { + c.Title("settings.applications") + c.PageIs("SettingsApplications") + + tokens, err := h.store.ListAccessTokens(c.Req.Context(), c.User.ID) + if err != nil { + c.Errorf(err, "list access tokens") + return + } + c.Data["Tokens"] = tokens + + c.Success(tmplUserSettingsApplications) + } +} + +func (h *SettingsHandler) ApplicationsPost() macaron.Handler { + return func(c *context.Context, f form.NewAccessToken) { + c.Title("settings.applications") + c.PageIs("SettingsApplications") + + if c.HasError() { + tokens, err := h.store.ListAccessTokens(c.Req.Context(), c.User.ID) + if err != nil { + c.Errorf(err, "list access tokens") + return + } + + c.Data["Tokens"] = tokens + c.HTML(http.StatusBadRequest, tmplUserSettingsApplications) + return + } + + t, err := h.store.CreateAccessToken(c.Req.Context(), c.User.ID, f.Name) + if err != nil { + if database.IsErrAccessTokenAlreadyExist(err) { + c.Flash.Error(c.Tr("settings.token_name_exists")) + c.RedirectSubpath("/user/settings/applications") + } else { + c.Errorf(err, "new access token") + } + return + } + + c.Flash.Success(c.Tr("settings.generate_token_succees")) + c.Flash.Info(t.Sha1) + c.RedirectSubpath("/user/settings/applications") + } +} + +func (h *SettingsHandler) DeleteApplication() macaron.Handler { + return func(c *context.Context) { + if err := h.store.DeleteAccessTokenByID(c.Req.Context(), c.User.ID, c.QueryInt64("id")); err != nil { + c.Flash.Error("DeleteAccessTokenByID: " + err.Error()) + } else { + c.Flash.Success(c.Tr("settings.delete_token_success")) + } + + c.JSONSuccess(map[string]any{ + "redirect": conf.Server.Subpath + "/user/settings/applications", + }) + } +} + +func SettingsDelete(c *context.Context) { + c.Title("settings.delete") + c.PageIs("SettingsDelete") + + if c.Req.Method == "POST" { + if _, err := database.Handle.Users().Authenticate(c.Req.Context(), c.User.Name, c.Query("password"), c.User.LoginSource); err != nil { + if auth.IsErrBadCredentials(err) { + c.RenderWithErr(c.Tr("form.enterred_invalid_password"), http.StatusUnauthorized, tmplUserSettingsDelete, nil) + } else { + c.Errorf(err, "authenticate user") + } + return + } + + if err := database.Handle.Users().DeleteByID(c.Req.Context(), c.User.ID, false); err != nil { + switch { + case database.IsErrUserOwnRepos(err): + c.Flash.Error(c.Tr("form.still_own_repo")) + c.Redirect(conf.Server.Subpath + "/user/settings/delete") + case database.IsErrUserHasOrgs(err): + c.Flash.Error(c.Tr("form.still_has_org")) + c.Redirect(conf.Server.Subpath + "/user/settings/delete") + default: + c.Errorf(err, "delete user") + } + } else { + log.Trace("Account deleted: %s", c.User.Name) + c.Redirect(conf.Server.Subpath + "/") + } + return + } + + c.Success(tmplUserSettingsDelete) +} + +// SettingsStore is the data layer carrier for user settings endpoints. This +// interface is meant to abstract away and limit the exposure of the underlying +// data layer to the handler through a thin-wrapper. +type SettingsStore interface { + // CreateAccessToken creates a new access token and persist to database. It + // returns database.ErrAccessTokenAlreadyExist when an access token with same + // name already exists for the user. + CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error) + // GetAccessTokenBySHA1 returns the access token with given SHA1. It returns + // database.ErrAccessTokenNotExist when not found. + GetAccessTokenBySHA1(ctx gocontext.Context, sha1 string) (*database.AccessToken, error) + // TouchAccessTokenByID updates the updated time of the given access token to + // the current time. + TouchAccessTokenByID(ctx gocontext.Context, id int64) error + // ListAccessTokens returns all access tokens belongs to given user. + ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error) + // DeleteAccessTokenByID deletes the access token by given ID. + DeleteAccessTokenByID(ctx gocontext.Context, userID, id int64) error +} + +type settingsStore struct{} + +// NewSettingsStore returns a new SettingsStore using the global database +// handle. +func NewSettingsStore() SettingsStore { + return &settingsStore{} +} + +func (*settingsStore) CreateAccessToken(ctx gocontext.Context, userID int64, name string) (*database.AccessToken, error) { + return database.Handle.AccessTokens().Create(ctx, userID, name) +} + +func (*settingsStore) GetAccessTokenBySHA1(ctx gocontext.Context, sha1 string) (*database.AccessToken, error) { + return database.Handle.AccessTokens().GetBySHA1(ctx, sha1) +} + +func (*settingsStore) TouchAccessTokenByID(ctx gocontext.Context, id int64) error { + return database.Handle.AccessTokens().Touch(ctx, id) +} + +func (*settingsStore) ListAccessTokens(ctx gocontext.Context, userID int64) ([]*database.AccessToken, error) { + return database.Handle.AccessTokens().List(ctx, userID) +} + +func (*settingsStore) DeleteAccessTokenByID(ctx gocontext.Context, userID, id int64) error { + return database.Handle.AccessTokens().DeleteByID(ctx, userID, id) +} diff --git a/internal/semverx/semverx.go b/internal/semverx/semverx.go new file mode 100644 index 00000000000..053c18fec02 --- /dev/null +++ b/internal/semverx/semverx.go @@ -0,0 +1,33 @@ +package semverx + +import ( + "strings" + + "github.com/Masterminds/semver/v3" +) + +// Compare returns true if the comparison is true for given versions. It returns false if +// comparison is false, or failed to parse one or both versions as Semantic Versions. +// +// See https://github.com/Masterminds/semver#basic-comparisons for supported comparisons. +func Compare(version1, comparison, version2 string) bool { + clean := func(v string) string { + if strings.Count(v, ".") > 2 { + fields := strings.SplitN(v, ".", 4) + v = strings.Join(fields[:3], ".") + } + return v + } + + v, err := semver.NewVersion(clean(version1)) + if err != nil { + return false + } + + c, err := semver.NewConstraint(comparison + " " + clean(version2)) + if err != nil { + return false + } + + return c.Check(v) +} diff --git a/internal/semverx/semverx_test.go b/internal/semverx/semverx_test.go new file mode 100644 index 00000000000..9dfeb355b38 --- /dev/null +++ b/internal/semverx/semverx_test.go @@ -0,0 +1,28 @@ +package semverx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCheck(t *testing.T) { + tests := []struct { + version1 string + comparison string + version2 string + expVal bool + }{ + {version1: "1.0.c", comparison: ">", version2: "0.9", expVal: false}, + {version1: "1.0.1", comparison: ">", version2: "0.9.a", expVal: false}, + + {version1: "7.2", comparison: ">=", version2: "5.1", expVal: true}, + {version1: "1.8.3.1", comparison: ">=", version2: "1.8.3", expVal: true}, + {version1: "0.12.0+dev", comparison: ">=", version2: "0.11.68.1023", expVal: true}, + } + for _, test := range tests { + t.Run(test.version1+" "+test.comparison+" "+test.version2, func(t *testing.T) { + assert.Equal(t, test.expVal, Compare(test.version1, test.comparison, test.version2)) + }) + } +} diff --git a/internal/ssh/ssh.go b/internal/ssh/ssh.go new file mode 100644 index 00000000000..20cf95a16ab --- /dev/null +++ b/internal/ssh/ssh.go @@ -0,0 +1,212 @@ +package ssh + +import ( + "context" + "io" + "net" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "syscall" + + "github.com/cockroachdb/errors" + "github.com/sourcegraph/run" + "golang.org/x/crypto/ssh" + log "unknwon.dev/clog/v2" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/osx" +) + +func cleanCommand(cmd string) string { + i := strings.Index(cmd, "git") + if i == -1 { + return cmd + } + return cmd[i:] +} + +func handleServerConn(keyID string, chans <-chan ssh.NewChannel) { + for newChan := range chans { + if newChan.ChannelType() != "session" { + _ = newChan.Reject(ssh.UnknownChannelType, "unknown channel type") + continue + } + + ch, reqs, err := newChan.Accept() + if err != nil { + log.Error("Error accepting channel: %v", err) + continue + } + + go func(in <-chan *ssh.Request) { + defer func() { + _ = ch.Close() + }() + for req := range in { + payload := cleanCommand(string(req.Payload)) + switch req.Type { + case "env": + // We only need to accept the request and do nothing since whatever environment + // variables being set here won't be used in subsequent commands anyway. + + case "exec": + cmdName := strings.TrimLeft(payload, "'()") + log.Trace("SSH: Payload: %v", cmdName) + + args := []string{"serv", "key-" + keyID, "--config=" + conf.CustomConf} + log.Trace("SSH: Arguments: %v", args) + cmd := exec.Command(conf.AppPath(), args...) + cmd.Env = append(os.Environ(), "SSH_ORIGINAL_COMMAND="+cmdName) + + stdout, err := cmd.StdoutPipe() + if err != nil { + log.Error("SSH: StdoutPipe: %v", err) + return + } + stderr, err := cmd.StderrPipe() + if err != nil { + log.Error("SSH: StderrPipe: %v", err) + return + } + input, err := cmd.StdinPipe() + if err != nil { + log.Error("SSH: StdinPipe: %v", err) + return + } + + // FIXME: check timeout + if err = cmd.Start(); err != nil { + log.Error("SSH: Start: %v", err) + return + } + + _ = req.Reply(true, nil) + go func() { + _, _ = io.Copy(input, ch) + input.Close() + }() + _, _ = io.Copy(ch, stdout) + _, _ = io.Copy(ch.Stderr(), stderr) + + if err = cmd.Wait(); err != nil { + log.Error("SSH: Wait: %v", err) + return + } + + _, _ = ch.SendRequest("exit-status", false, []byte{0, 0, 0, 0}) + return + default: + } + } + }(reqs) + } +} + +func listen(config *ssh.ServerConfig, host string, port int) { + listener, err := net.Listen("tcp", host+":"+strconv.Itoa(port)) + if err != nil { + log.Fatal("Failed to start SSH server: %v", err) + } + for { + // Once a ServerConfig has been configured, connections can be accepted. + conn, err := listener.Accept() + if err != nil { + log.Error("SSH: Error accepting incoming connection: %v", err) + continue + } + + // Before use, a handshake must be performed on the incoming net.Conn. + // It must be handled in a separate goroutine, + // otherwise one user could easily block entire loop. + // For example, user could be asked to trust server key fingerprint and hangs. + go func() { + log.Trace("SSH: Handshaking for %s", conn.RemoteAddr()) + sConn, chans, reqs, err := ssh.NewServerConn(conn, config) + if err != nil { + if err == io.EOF || errors.Is(err, syscall.ECONNRESET) { + log.Trace("SSH: Handshaking was terminated: %v", err) + } else { + log.Error("SSH: Error on handshaking: %v", err) + } + return + } + + log.Trace("SSH: Connection from %s (%s)", sConn.RemoteAddr(), sConn.ClientVersion()) + // The incoming Request channel must be serviced. + go ssh.DiscardRequests(reqs) + go handleServerConn(sConn.Permissions.Extensions["key-id"], chans) + }() + } +} + +// Listen starts a SSH server listens on given port. +func Listen(opts conf.SSHOpts, appDataPath string) { + config := &ssh.ServerConfig{ + Config: ssh.Config{ + Ciphers: opts.ServerCiphers, + MACs: opts.ServerMACs, + }, + PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { + pkey, err := database.SearchPublicKeyByContent(strings.TrimSpace(string(ssh.MarshalAuthorizedKey(key)))) + if err != nil { + if !database.IsErrKeyNotExist(err) { + log.Error("SearchPublicKeyByContent: %v", err) + } + return nil, err + } + return &ssh.Permissions{Extensions: map[string]string{"key-id": strconv.FormatInt(pkey.ID, 10)}}, nil + }, + } + + keys, err := setupHostKeys(appDataPath, opts.ServerAlgorithms) + if err != nil { + log.Fatal("SSH: Failed to setup host keys: %v", err) + } + for _, key := range keys { + config.AddHostKey(key) + } + + go listen(config, opts.ListenHost, opts.ListenPort) +} + +func setupHostKeys(appDataPath string, algorithms []string) ([]ssh.Signer, error) { + dir := filepath.Join(appDataPath, "ssh") + err := os.MkdirAll(dir, os.ModePerm) + if err != nil { + return nil, errors.Wrapf(err, "create host key directory") + } + + var hostKeys []ssh.Signer + for _, algo := range algorithms { + keyPath := filepath.Join(dir, "gogs."+algo) + if !osx.Exist(keyPath) { + args := []string{ + conf.SSH.KeygenPath, + "-t", algo, + "-f", keyPath, + "-N", run.Arg(""), + } + err = run.Cmd(context.Background(), args...).Run().Wait() + if err != nil { + return nil, errors.Wrapf(err, "generate host key with args %v", args) + } + log.Trace("SSH: New private key is generated: %s", keyPath) + } + + keyData, err := os.ReadFile(keyPath) + if err != nil { + return nil, errors.Wrapf(err, "read host key %q", keyPath) + } + signer, err := ssh.ParsePrivateKey(keyData) + if err != nil { + return nil, errors.Wrapf(err, "parse host key %q", keyPath) + } + + hostKeys = append(hostKeys, signer) + } + return hostKeys, nil +} diff --git a/internal/strx/strx.go b/internal/strx/strx.go new file mode 100644 index 00000000000..dd425278c36 --- /dev/null +++ b/internal/strx/strx.go @@ -0,0 +1,72 @@ +package strx + +import ( + "crypto/rand" + "math/big" + "strings" + "unicode" +) + +// ToUpperFirst returns s with only the first Unicode letter mapped to its upper case. +func ToUpperFirst(s string) string { + for i, v := range s { + return string(unicode.ToUpper(v)) + s[i+1:] + } + return "" +} + +// RandomChars returns a generated string in given number of random characters. +func RandomChars(n int) (string, error) { + const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + + randomInt := func(max *big.Int) (int, error) { + r, err := rand.Int(rand.Reader, max) + if err != nil { + return 0, err + } + + return int(r.Int64()), nil + } + + buffer := make([]byte, n) + max := big.NewInt(int64(len(alphanum))) + for i := range n { + index, err := randomInt(max) + if err != nil { + return "", err + } + + buffer[i] = alphanum[index] + } + + return string(buffer), nil +} + +// Ellipsis returns a truncated string and appends "..." to the end of the +// string if the string length is larger than the threshold. Otherwise, the +// original string is returned. +func Ellipsis(str string, threshold int) string { + if len(str) <= threshold || threshold < 0 { + return str + } + return str[:threshold] + "..." +} + +// Truncate returns a truncated string if its length is over the limit. +// Otherwise, it returns the original string. +func Truncate(str string, limit int) string { + if len(str) < limit { + return str + } + return str[:limit] +} + +// ContainsFold reports whether s is within the slice, ignoring case. +func ContainsFold(ss []string, s string) bool { + for _, v := range ss { + if strings.EqualFold(v, s) { + return true + } + } + return false +} diff --git a/internal/strx/strx_test.go b/internal/strx/strx_test.go new file mode 100644 index 00000000000..ed64acdb071 --- /dev/null +++ b/internal/strx/strx_test.go @@ -0,0 +1,145 @@ +package strx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestToUpperFirst(t *testing.T) { + tests := []struct { + name string + s string + expStr string + }{ + { + name: "empty string", + }, + { + name: "first letter is a digit", + s: "123 let's go", + expStr: "123 let's go", + }, + { + name: "lower to upper", + s: "this is a sentence", + expStr: "This is a sentence", + }, + { + name: "already in upper case", + s: "Let's go", + expStr: "Let's go", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + assert.Equal(t, test.expStr, ToUpperFirst(test.s)) + }) + } +} + +func TestRandomChars(t *testing.T) { + cache := make(map[string]bool) + for range 100 { + chars, err := RandomChars(10) + if err != nil { + t.Fatal(err) + } + if cache[chars] { + t.Fatalf("Duplicated chars %q", chars) + } + cache[chars] = true + } +} + +func TestEllipsis(t *testing.T) { + tests := []struct { + name string + str string + threshold int + want string + }{ + { + name: "empty string and zero threshold", + str: "", + threshold: 0, + want: "", + }, + { + name: "smaller length than threshold", + str: "ab", + threshold: 3, + want: "ab", + }, + { + name: "same length as threshold", + str: "abc", + threshold: 3, + want: "abc", + }, + { + name: "greater length than threshold", + str: "ab", + threshold: 1, + want: "a...", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := Ellipsis(test.str, test.threshold) + assert.Equal(t, test.want, got) + }) + } +} + +func TestTruncate(t *testing.T) { + tests := []struct { + name string + str string + limit int + want string + }{ + { + name: "empty string with zero limit", + str: "", + limit: 0, + want: "", + }, + { + name: "smaller length than limit", + str: "ab", + limit: 3, + want: "ab", + }, + { + name: "same length as limit", + str: "abc", + limit: 3, + want: "abc", + }, + { + name: "greater length than limit", + str: "ab", + limit: 1, + want: "a", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := Truncate(test.str, test.limit) + assert.Equal(t, test.want, got) + }) + } +} + +func TestContainsFold(t *testing.T) { + ss := []string{"Alice", "Bob", "Charlie"} + + assert.True(t, ContainsFold(ss, "alice")) + assert.True(t, ContainsFold(ss, "Alice")) + assert.True(t, ContainsFold(ss, "ALICE")) + assert.True(t, ContainsFold(ss, "bob")) + assert.False(t, ContainsFold(ss, "dave")) + assert.False(t, ContainsFold(nil, "alice")) + assert.False(t, ContainsFold([]string{}, "alice")) +} diff --git a/modules/sync/exclusive_pool.go b/internal/sync/exclusive_pool.go similarity index 89% rename from modules/sync/exclusive_pool.go rename to internal/sync/exclusive_pool.go index 744cc7c996c..29ed4a4bf6f 100644 --- a/modules/sync/exclusive_pool.go +++ b/internal/sync/exclusive_pool.go @@ -1,7 +1,3 @@ -// Copyright 2016 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 sync import ( @@ -39,7 +35,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/internal/sync/status_table.go b/internal/sync/status_table.go new file mode 100644 index 00000000000..ec5f3eabda5 --- /dev/null +++ b/internal/sync/status_table.go @@ -0,0 +1,45 @@ +package sync + +import ( + "sync" +) + +// StatusTable is a table maintains true/false values. +// +// This table is particularly useful for un/marking and checking values +// in different goroutines. +type StatusTable struct { + sync.RWMutex + pool map[string]bool +} + +// NewStatusTable initializes and returns a new StatusTable object. +func NewStatusTable() *StatusTable { + return &StatusTable{ + pool: make(map[string]bool), + } +} + +// Start sets value of given name to true in the pool. +func (p *StatusTable) Start(name string) { + p.Lock() + defer p.Unlock() + + p.pool[name] = true +} + +// Stop sets value of given name to false in the pool. +func (p *StatusTable) Stop(name string) { + p.Lock() + defer p.Unlock() + + p.pool[name] = false +} + +// IsRunning checks if value of given name is set to true in the pool. +func (p *StatusTable) IsRunning(name string) bool { + p.RLock() + defer p.RUnlock() + + return p.pool[name] +} diff --git a/internal/sync/unique_queue.go b/internal/sync/unique_queue.go new file mode 100644 index 00000000000..d2f123f1818 --- /dev/null +++ b/internal/sync/unique_queue.go @@ -0,0 +1,66 @@ +package sync + +import ( + "fmt" +) + +// UniqueQueue is a queue which guarantees only one instance of same +// identity is in the line. Instances with same identity will be +// discarded if there is already one in the line. +// +// This queue is particularly useful for preventing duplicated task +// of same purpose. +type UniqueQueue struct { + table *StatusTable + queue chan string +} + +// NewUniqueQueue initializes and returns a new UniqueQueue object. +func NewUniqueQueue(queueLength int) *UniqueQueue { + if queueLength <= 0 { + queueLength = 100 + } + + return &UniqueQueue{ + table: NewStatusTable(), + queue: make(chan string, queueLength), + } +} + +// Queue returns channel of queue for retrieving instances. +func (q *UniqueQueue) Queue() <-chan string { + return q.queue +} + +// Exist returns true if there is an instance with given identity +// exists in the queue. +func (q *UniqueQueue) Exist(id any) bool { + return q.table.IsRunning(fmt.Sprintf("%v", id)) +} + +// AddFunc adds new instance to the queue with a custom runnable function, +// the queue is blocked until the function exits. +func (q *UniqueQueue) AddFunc(id any, fn func()) { + if q.Exist(id) { + return + } + + idStr := fmt.Sprintf("%v", id) + q.table.Lock() + q.table.pool[idStr] = true + if fn != nil { + fn() + } + q.table.Unlock() + q.queue <- idStr +} + +// Add adds new instance to the queue. +func (q *UniqueQueue) Add(id any) { + q.AddFunc(id, nil) +} + +// Remove removes instance from the queue. +func (q *UniqueQueue) Remove(id any) { + q.table.Stop(fmt.Sprintf("%v", id)) +} diff --git a/modules/template/highlight/highlight.go b/internal/template/highlight/highlight.go similarity index 82% rename from modules/template/highlight/highlight.go rename to internal/template/highlight/highlight.go index bbf08e04362..1a84632cfc8 100644 --- a/modules/template/highlight/highlight.go +++ b/internal/template/highlight/highlight.go @@ -1,14 +1,10 @@ -// Copyright 2015 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 highlight import ( "path" "strings" - "github.com/gogits/gogs/modules/setting" + "gogs.io/gogs/internal/conf" ) var ( @@ -20,8 +16,9 @@ var ( // File names that are representing highlight classes. highlightFileNames = map[string]bool{ - "dockerfile": true, - "makefile": true, + "cmakelists.txt": true, + "dockerfile": true, + "makefile": true, } // Extensions that are same as highlight classes. @@ -58,14 +55,20 @@ var ( ".swift": true, ".ts": true, ".vb": true, + ".r": true, + ".sas": true, + ".tex": true, + ".yaml": true, } // Extensions that are not same as highlight classes. - highlightMapping = map[string]string{} + highlightMapping = map[string]string{ + ".txt": "nohighlight", + } ) func NewContext() { - keys := setting.Cfg.Section("highlight.mapping").Keys() + keys := conf.File.Section("highlight.mapping").Keys() for i := range keys { highlightMapping[keys[i].Name()] = keys[i].Value() } diff --git a/internal/template/template.go b/internal/template/template.go new file mode 100644 index 00000000000..89a082d9c2f --- /dev/null +++ b/internal/template/template.go @@ -0,0 +1,282 @@ +package template + +import ( + "encoding/json" + "fmt" + "html/template" + "mime" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/cockroachdb/errors" + "github.com/editorconfig/editorconfig-core-go/v2" + "github.com/microcosm-cc/bluemonday" + "golang.org/x/net/html/charset" + "golang.org/x/text/transform" + log "unknwon.dev/clog/v2" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/cryptox" + "gogs.io/gogs/internal/database" + "gogs.io/gogs/internal/gitx" + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/strx" + "gogs.io/gogs/internal/tool" +) + +var ( + funcMap []template.FuncMap + funcMapOnce sync.Once +) + +// FuncMap returns a list of user-defined template functions. +func FuncMap() []template.FuncMap { + funcMapOnce.Do(func() { + funcMap = []template.FuncMap{map[string]any{ + "BuildCommit": func() string { + return conf.BuildCommit + }, + "Year": func() int { + return time.Now().Year() + }, + "UseHTTPS": func() bool { + return conf.Server.URL.Scheme == "https" + }, + "AppName": func() string { + return conf.App.BrandName + }, + "AppSubURL": func() string { + return conf.Server.Subpath + }, + "AppURL": func() string { + return conf.Server.ExternalURL + }, + "AppVer": func() string { + return conf.App.Version + }, + "AppDomain": func() string { + return conf.Server.Domain + }, + "DisableGravatar": func() bool { + return conf.Picture.DisableGravatar + }, + "ShowFooterTemplateLoadTime": func() bool { + return conf.Other.ShowFooterTemplateLoadTime + }, + "LoadTimes": func(startTime time.Time) string { + return fmt.Sprint(time.Since(startTime).Nanoseconds()/1e6) + "ms" + }, + "AvatarLink": tool.AvatarLink, + "AppendAvatarSize": tool.AppendAvatarSize, + "Safe": Safe, + "Sanitize": bluemonday.UGCPolicy().Sanitize, + "Str2HTML": Str2HTML, + "NewLine2br": NewLine2br, + "TimeSince": tool.TimeSince, + "RawTimeSince": tool.RawTimeSince, + "FileSize": tool.FileSize, + "Subtract": tool.Subtract, + "Add": func(a, b int) int { + return a + b + }, + "ActionIcon": ActionIcon, + "DateFmtLong": func(t time.Time) string { + return t.Format(time.RFC1123Z) + }, + "DateFmtShort": func(t time.Time) string { + return t.Format("Jan 02, 2006") + }, + "SubStr": func(str string, start, length int) string { + if str == "" { + return "" + } + end := start + length + if length == -1 { + end = len(str) + } + if len(str) < end { + return str + } + return str[start:end] + }, + "Join": strings.Join, + "EllipsisString": strx.Ellipsis, + "DiffFileTypeToStr": DiffFileTypeToStr, + "DiffLineTypeToStr": DiffLineTypeToStr, + "Sha1": Sha1, + "ShortSHA1": tool.ShortSHA1, + "ActionContent2Commits": ActionContent2Commits, + "EscapePound": EscapePound, + "RenderCommitMessage": RenderCommitMessage, + "ThemeColorMetaTag": func() string { + return conf.UI.ThemeColorMetaTag + }, + "FilenameIsImage": func(filename string) bool { + mimeType := mime.TypeByExtension(filepath.Ext(filename)) + return strings.HasPrefix(mimeType, "image/") + }, + "TabSizeClass": func(ec *editorconfig.Editorconfig, filename string) string { + if ec != nil { + def, err := ec.GetDefinitionForFilename(filename) + if err == nil && def.TabWidth > 0 { + return fmt.Sprintf("tab-size-%d", def.TabWidth) + } + } + return "tab-size-8" + }, + "InferSubmoduleURL": gitx.InferSubmoduleURL, + }} + }) + return funcMap +} + +func Safe(raw string) template.HTML { + return template.HTML(raw) +} + +func Str2HTML(raw string) template.HTML { + return template.HTML(markup.Sanitize(raw)) +} + +// NewLine2br simply replaces "\n" to "
    ". +func NewLine2br(raw string) string { + return strings.ReplaceAll(raw, "\n", "
    ") +} + +func Sha1(str string) string { + return cryptox.SHA1(str) +} + +func ToUTF8WithErr(content []byte) (string, error) { + charsetLabel, err := tool.DetectEncoding(content) + if err != nil { + return "", err + } else if charsetLabel == "UTF-8" { + return string(content), nil + } + + encoding, _ := charset.Lookup(charsetLabel) + if encoding == nil { + return string(content), errors.Newf("unknown encoding: %s", charsetLabel) + } + + // If there is an error, we concatenate the nicely decoded part and the + // original left over. This way we won't lose data. + result, n, err := transform.String(encoding.NewDecoder(), string(content)) + if err != nil { + result = result + string(content[n:]) + } + + return result, err +} + +// RenderCommitMessage renders commit message with special links. +func RenderCommitMessage(full bool, msg, urlPrefix string, metas map[string]string) string { + cleanMsg := template.HTMLEscapeString(msg) + fullMessage := string(markup.RenderIssueIndexPattern([]byte(cleanMsg), urlPrefix, metas)) + msgLines := strings.Split(strings.TrimSpace(fullMessage), "\n") + numLines := len(msgLines) + if numLines == 0 { + return "" + } else if !full { + return msgLines[0] + } else if numLines == 1 || (numLines >= 2 && msgLines[1] == "") { + // First line is a header, standalone or followed by empty line + header := fmt.Sprintf("

    %s

    ", msgLines[0]) + if numLines >= 2 { + fullMessage = header + fmt.Sprintf("\n
    %s
    ", strings.Join(msgLines[2:], "\n")) + } else { + fullMessage = header + } + } else { + // Non-standard git message, there is no header line + fullMessage = fmt.Sprintf("

    %s

    ", strings.Join(msgLines, "
    ")) + } + return fullMessage +} + +type Actioner interface { + GetOpType() int + GetActUserName() string + GetRepoUserName() string + GetRepoName() string + GetRepoPath() string + GetRepoLink() string + GetBranch() string + GetContent() string + GetCreate() time.Time + GetIssueInfos() []string +} + +// ActionIcon accepts a int that represents action operation type +// and returns a icon class name. +func ActionIcon(opType int) string { + switch opType { + case 1, 8: // Create and transfer repository + return "repo" + case 5: // Commit repository + return "git-commit" + case 6: // Create issue + return "issue-opened" + case 7: // New pull request + return "git-pull-request" + case 9: // Push tag + return "tag" + case 10: // Comment issue + return "comment-discussion" + case 11: // Merge pull request + return "git-merge" + case 12, 14: // Close issue or pull request + return "issue-closed" + case 13, 15: // Reopen issue or pull request + return "issue-reopened" + case 16: // Create branch + return "git-branch" + case 17, 18: // Delete branch or tag + return "alert" + case 19: // Fork a repository + return "repo-forked" + case 20, 21, 22: // Mirror sync + return "repo-clone" + default: + return "invalid type" + } +} + +func ActionContent2Commits(act Actioner) *database.PushCommits { + push := database.NewPushCommits() + if err := json.Unmarshal([]byte(act.GetContent()), push); err != nil { + log.Error("Unmarshal:\n%s\nERROR: %v", act.GetContent(), err) + } + return push +} + +// TODO(unknwon): Use url.Escape. +func EscapePound(str string) string { + return strings.NewReplacer("%", "%25", "#", "%23", " ", "%20", "?", "%3F").Replace(str) +} + +func DiffFileTypeToStr(typ git.DiffFileType) string { + return map[git.DiffFileType]string{ + git.DiffFileAdd: "add", + git.DiffFileChange: "modify", + git.DiffFileDelete: "del", + git.DiffFileRename: "rename", + }[typ] +} + +func DiffLineTypeToStr(typ git.DiffLineType) string { + switch typ { + case git.DiffLineAdd: + return "add" + case git.DiffLineDelete: + return "del" + case git.DiffLineSection: + return "tag" + } + return "same" +} diff --git a/internal/testx/exec.go b/internal/testx/exec.go new file mode 100644 index 00000000000..d4814dffbcf --- /dev/null +++ b/internal/testx/exec.go @@ -0,0 +1,45 @@ +package testx + +import ( + "os" + "os/exec" + "strings" + + "github.com/cockroachdb/errors" +) + +// Exec executes "go test" on given helper with supplied environment variables. +// It is useful to mock "os/exec" functions in tests. When succeeded, it returns +// the result produced by the test helper. +// The test helper should: +// 1. Use WantHelperProcess function to determine if it is being called in helper mode. +// 2. Call fmt.Fprintln(os.Stdout, ...) to print results for the main test to collect. +func Exec(helper string, envs ...string) (string, error) { + cmd := exec.Command(os.Args[0], "-test.run="+helper, "--") + cmd.Env = []string{ + "GO_WANT_HELPER_PROCESS=1", + "GOCOVERDIR=" + os.TempDir(), + } + cmd.Env = append(cmd.Env, envs...) + out, err := cmd.CombinedOutput() + str := string(out) + + // The error is quite confusing even when tests passed, so let's check whether + // it is passed first. + if strings.Contains(str, "no tests to run") { + return "", errors.New("no tests to run") + } else if before, _, ok := strings.Cut(str, "PASS"); ok { + // Collect helper result + return strings.TrimSpace(before), nil + } + + if err != nil { + return "", errors.Newf("%v - %s", err, str) + } + return "", errors.New(str) +} + +// WantHelperProcess returns true if current process is in helper mode. +func WantHelperProcess() bool { + return os.Getenv("GO_WANT_HELPER_PROCESS") == "1" +} diff --git a/internal/testx/exec_test.go b/internal/testx/exec_test.go new file mode 100644 index 00000000000..1a290b22b61 --- /dev/null +++ b/internal/testx/exec_test.go @@ -0,0 +1,55 @@ +package testx + +import ( + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestExecHelper(_ *testing.T) { + if !WantHelperProcess() { + return + } + + if os.Getenv("PASS") != "1" { + fmt.Fprintln(os.Stdout, "tests failed") + os.Exit(1) + } + + fmt.Fprintln(os.Stdout, "tests succeed") +} + +func TestExec(t *testing.T) { + tests := []struct { + helper string + env string + expOut string + expErrMsg string + }{ + { + helper: "NoTestsToRun", + expErrMsg: "no tests to run", + }, { + helper: "TestExecHelper", + expErrMsg: "exit status 1 - tests failed\n", + }, { + helper: "TestExecHelper", + env: "PASS=1", + expOut: "tests succeed", + }, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + out, err := Exec(test.helper, test.env) + if test.expErrMsg != "" { + assert.Error(t, err) + assert.Contains(t, err.Error(), test.expErrMsg) + } else { + assert.NoError(t, err) + } + assert.Equal(t, test.expOut, out) + }) + } +} diff --git a/internal/testx/golden.go b/internal/testx/golden.go new file mode 100644 index 00000000000..a469b00a4e2 --- /dev/null +++ b/internal/testx/golden.go @@ -0,0 +1,72 @@ +package testx + +import ( + "encoding/json" + "flag" + "os" + "path/filepath" + "regexp" + "runtime" + "testing" + + "github.com/stretchr/testify/assert" +) + +var updateRegex = flag.String("update", "", "Update testdata of tests matching the given regex") + +// Update returns true if update regex matches given test name. +func Update(name string) bool { + if updateRegex == nil || *updateRegex == "" { + return false + } + return regexp.MustCompile(*updateRegex).MatchString(name) +} + +// AssertGolden compares what's got and what's in the golden file. It updates +// the golden file on-demand. It does nothing when the runtime is "windows". +func AssertGolden(t testing.TB, path string, update bool, got any) { + if runtime.GOOS == "windows" { + t.Skip("Skipping testing on Windows") + return + } + + t.Helper() + + data := marshal(t, got) + + if update { + err := os.MkdirAll(filepath.Dir(path), os.ModePerm) + if err != nil { + t.Fatalf("create directories for golden file %q: %v", path, err) + } + + err = os.WriteFile(path, data, 0o640) + if err != nil { + t.Fatalf("update golden file %q: %v", path, err) + } + } + + golden, err := os.ReadFile(path) + if err != nil { + t.Fatalf("read golden file %q: %v", path, err) + } + + assert.Equal(t, string(golden), string(data)) +} + +func marshal(t testing.TB, v any) []byte { + t.Helper() + + switch v2 := v.(type) { + case string: + return []byte(v2) + case []byte: + return v2 + default: + data, err := json.MarshalIndent(v, "", " ") + if err != nil { + t.Fatal(err) + } + return data + } +} diff --git a/internal/testx/golden_test.go b/internal/testx/golden_test.go new file mode 100644 index 00000000000..73ea188912b --- /dev/null +++ b/internal/testx/golden_test.go @@ -0,0 +1,48 @@ +package testx + +import ( + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestUpdate(t *testing.T) { + before := updateRegex + defer func() { + updateRegex = before + }() + + t.Run("no flag", func(t *testing.T) { + updateRegex = nil + assert.False(t, Update("TestUpdate")) + }) + + tests := []struct { + regex string + name string + want bool + }{ + {regex: "", name: "TestUpdate", want: false}, + {regex: "TestNotFound", name: "TestUpdate", want: false}, + + {regex: ".*", name: "TestUpdate", want: true}, + } + for _, test := range tests { + t.Run("", func(t *testing.T) { + updateRegex = &test.regex + assert.Equal(t, test.want, Update(test.name)) + }) + } +} + +func TestAssertGolden(t *testing.T) { + // Make sure it does not blow up + AssertGolden(t, filepath.Join("testdata", "golden"), false, "{\n \"Message\": \"This is a golden file.\"\n}") + AssertGolden(t, filepath.Join("testdata", "golden"), false, []byte("{\n \"Message\": \"This is a golden file.\"\n}")) + + type T struct { + Message string + } + AssertGolden(t, filepath.Join("testdata", "golden"), false, T{"This is a golden file."}) +} diff --git a/internal/testx/noop_logger.go b/internal/testx/noop_logger.go new file mode 100644 index 00000000000..ae6adc80cbe --- /dev/null +++ b/internal/testx/noop_logger.go @@ -0,0 +1,27 @@ +package testx + +import ( + log "unknwon.dev/clog/v2" +) + +var _ log.Logger = (*noopLogger)(nil) + +// noopLogger is a placeholder logger that logs nothing. +type noopLogger struct{} + +func (*noopLogger) Name() string { + return "noop" +} + +func (*noopLogger) Level() log.Level { + return log.LevelTrace +} + +func (*noopLogger) Write(log.Messager) error { + return nil +} + +// InitNoopLogger is a init function to initialize a noop logger. +var InitNoopLogger = func(name string, vs ...any) (log.Logger, error) { + return &noopLogger{}, nil +} diff --git a/internal/testx/testdata/golden b/internal/testx/testdata/golden new file mode 100644 index 00000000000..b03368184cf --- /dev/null +++ b/internal/testx/testdata/golden @@ -0,0 +1,3 @@ +{ + "Message": "This is a golden file." +} \ No newline at end of file diff --git a/internal/testx/testx.go b/internal/testx/testx.go new file mode 100644 index 00000000000..9e55c18e612 --- /dev/null +++ b/internal/testx/testx.go @@ -0,0 +1,9 @@ +package testx + +import ( + "os" + "strings" +) + +// InTest is true if the current binary looks like a test artifact. +var InTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test") diff --git a/internal/testx/testx_test.go b/internal/testx/testx_test.go new file mode 100644 index 00000000000..03ac74e01c4 --- /dev/null +++ b/internal/testx/testx_test.go @@ -0,0 +1,11 @@ +package testx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestInTest(t *testing.T) { + assert.True(t, InTest) +} diff --git a/internal/tool/file.go b/internal/tool/file.go new file mode 100644 index 00000000000..5b487664ae8 --- /dev/null +++ b/internal/tool/file.go @@ -0,0 +1,53 @@ +package tool + +import ( + "fmt" + "math" + "net/http" + "strings" +) + +// IsTextFile returns true if file content format is plain text or empty. +func IsTextFile(data []byte) bool { + if len(data) == 0 { + return true + } + return strings.Contains(http.DetectContentType(data), "text/") +} + +func IsImageFile(data []byte) bool { + return strings.Contains(http.DetectContentType(data), "image/") +} + +func IsPDFFile(data []byte) bool { + return strings.Contains(http.DetectContentType(data), "application/pdf") +} + +func IsVideoFile(data []byte) bool { + return strings.Contains(http.DetectContentType(data), "video/") +} + +func logn(n, b float64) float64 { + return math.Log(n) / math.Log(b) +} + +func humanateBytes(s uint64, base float64, sizes []string) string { + if s < 10 { + return fmt.Sprintf("%d B", s) + } + e := math.Floor(logn(float64(s), base)) + suffix := sizes[int(e)] + val := float64(s) / math.Pow(base, math.Floor(e)) + f := "%.0f" + if val < 10 { + f = "%.1f" + } + + return fmt.Sprintf(f+" %s", val, suffix) +} + +// FileSize calculates the file size and generate user-friendly string. +func FileSize(s int64) string { + sizes := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB"} + return humanateBytes(uint64(s), 1024, sizes) +} diff --git a/internal/tool/tool.go b/internal/tool/tool.go new file mode 100644 index 00000000000..a1f42d3c72f --- /dev/null +++ b/internal/tool/tool.go @@ -0,0 +1,382 @@ +package tool + +import ( + "crypto/sha1" + "encoding/base64" + "encoding/hex" + "fmt" + "html/template" + "strconv" + "strings" + "time" + "unicode" + "unicode/utf8" + + "github.com/unknwon/i18n" + log "unknwon.dev/clog/v2" + + "github.com/gogs/chardet" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/cryptox" +) + +// ShortSHA1 truncates SHA1 string length to at most 10. +func ShortSHA1(sha1 string) string { + if len(sha1) > 10 { + return sha1[:10] + } + return sha1 +} + +// DetectEncoding returns best guess of encoding of given content. +func DetectEncoding(content []byte) (string, error) { + if utf8.Valid(content) { + log.Trace("Detected encoding: UTF-8 (fast)") + return "UTF-8", nil + } + + result, err := chardet.NewTextDetector().DetectBest(content) + if result.Charset != "UTF-8" && len(conf.Repository.ANSICharset) > 0 { + log.Trace("Using default ANSICharset: %s", conf.Repository.ANSICharset) + return conf.Repository.ANSICharset, err + } + + log.Trace("Detected encoding: %s", result.Charset) + return result.Charset, err +} + +// BasicAuthDecode decodes username and password portions of HTTP Basic Authentication +// from encoded content. +func BasicAuthDecode(encoded string) (string, string, error) { + s, err := base64.StdEncoding.DecodeString(encoded) + if err != nil { + return "", "", err + } + + auth := strings.SplitN(string(s), ":", 2) + return auth[0], auth[1], nil +} + +// verify time limit code +func VerifyTimeLimitCode(data string, minutes int, code string) bool { + if len(code) <= 18 { + return false + } + + // split code + start := code[:12] + lives := code[12:18] + if d, err := strconv.Atoi(lives); err == nil { + minutes = d + } + + // right active code + retCode := CreateTimeLimitCode(data, minutes, start) + if retCode == code && minutes > 0 { + // check time is expired or not + before, _ := time.ParseInLocation("200601021504", start, time.Local) + now := time.Now() + if before.Add(time.Minute*time.Duration(minutes)).Unix() > now.Unix() { + return true + } + } + + return false +} + +const TimeLimitCodeLength = 12 + 6 + 40 + +// CreateTimeLimitCode generates a time limit code based on given input data. +// Format: 12 length date time string + 6 minutes string + 40 sha1 encoded string +func CreateTimeLimitCode(data string, minutes int, startInf any) string { + format := "200601021504" + + var start, end time.Time + var startStr, endStr string + + if startInf == nil { + // Use now time create code + start = time.Now() + startStr = start.Format(format) + } else { + // use start string create code + startStr = startInf.(string) + start, _ = time.ParseInLocation(format, startStr, time.Local) + startStr = start.Format(format) + } + + end = start.Add(time.Minute * time.Duration(minutes)) + endStr = end.Format(format) + + // create sha1 encode string + sh := sha1.New() + _, _ = sh.Write([]byte(data + conf.Security.SecretKey + startStr + endStr + strconv.Itoa(minutes))) + encoded := hex.EncodeToString(sh.Sum(nil)) + + code := fmt.Sprintf("%s%06d%s", startStr, minutes, encoded) + return code +} + +// HashEmail hashes email address to MD5 string. +// https://en.gravatar.com/site/implement/hash/ +func HashEmail(email string) string { + return cryptox.MD5(strings.ToLower(strings.TrimSpace(email))) +} + +// 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) (url string) { + if conf.Picture.EnableFederatedAvatar && conf.Picture.LibravatarService != nil && + strings.Contains(email, "@") { + var err error + url, err = conf.Picture.LibravatarService.FromEmail(email) + if err != nil { + log.Warn("AvatarLink.LibravatarService.FromEmail [%s]: %v", email, err) + } + } + if url == "" && !conf.Picture.DisableGravatar { + url = conf.Picture.GravatarSource + HashEmail(email) + "?d=identicon" + } + if url == "" { + url = conf.Server.Subpath + "/img/avatar_default.png" + } + return url +} + +// AppendAvatarSize appends avatar size query parameter to the URL in the correct format. +func AppendAvatarSize(url string, size int) string { + if strings.Contains(url, "?") { + return url + "&s=" + strconv.Itoa(size) + } + return url + "?s=" + strconv.Itoa(size) +} + +// Seconds-based time units +const ( + Minute = 60 + Hour = 60 * Minute + Day = 24 * Hour + Week = 7 * Day + Month = 30 * Day + Year = 12 * Month +) + +func computeTimeDiff(diff int64) (int64, string) { + diffStr := "" + switch { + case diff <= 0: + diff = 0 + diffStr = "now" + case diff < 2: + diff = 0 + diffStr = "1 second" + case diff < 1*Minute: + diffStr = fmt.Sprintf("%d seconds", diff) + diff = 0 + + case diff < 2*Minute: + diff -= 1 * Minute + diffStr = "1 minute" + case diff < 1*Hour: + diffStr = fmt.Sprintf("%d minutes", diff/Minute) + diff -= diff / Minute * Minute + + case diff < 2*Hour: + diff -= 1 * Hour + diffStr = "1 hour" + case diff < 1*Day: + diffStr = fmt.Sprintf("%d hours", diff/Hour) + diff -= diff / Hour * Hour + + case diff < 2*Day: + diff -= 1 * Day + diffStr = "1 day" + case diff < 1*Week: + diffStr = fmt.Sprintf("%d days", diff/Day) + diff -= diff / Day * Day + + case diff < 2*Week: + diff -= 1 * Week + diffStr = "1 week" + case diff < 1*Month: + diffStr = fmt.Sprintf("%d weeks", diff/Week) + diff -= diff / Week * Week + + case diff < 2*Month: + diff -= 1 * Month + diffStr = "1 month" + case diff < 1*Year: + diffStr = fmt.Sprintf("%d months", diff/Month) + diff -= diff / Month * Month + + case diff < 2*Year: + diff -= 1 * Year + diffStr = "1 year" + default: + diffStr = fmt.Sprintf("%d years", diff/Year) + diff = 0 + } + return diff, diffStr +} + +// TimeSincePro calculates the time interval and generate full user-friendly string. +func TimeSincePro(then time.Time) string { + now := time.Now() + diff := now.Unix() - then.Unix() + + if then.After(now) { + return "future" + } + + var timeStr, diffStr string + for diff != 0 { + diff, diffStr = computeTimeDiff(diff) + timeStr += ", " + diffStr + } + return strings.TrimPrefix(timeStr, ", ") +} + +func timeSince(then time.Time, lang string) string { + now := time.Now() + + lbl := i18n.Tr(lang, "tool.ago") + diff := now.Unix() - then.Unix() + if then.After(now) { + lbl = i18n.Tr(lang, "tool.from_now") + diff = then.Unix() - now.Unix() + } + + switch { + case diff <= 0: + return i18n.Tr(lang, "tool.now") + case diff <= 2: + 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) + } +} + +func RawTimeSince(t time.Time, lang string) string { + return timeSince(t, lang) +} + +// TimeSince calculates the time interval and generate user-friendly string. +func TimeSince(t time.Time, lang string) template.HTML { + return template.HTML(fmt.Sprintf(`%s`, t.Format(conf.Time.FormatLayout), timeSince(t, lang))) +} + +// Subtract deals with subtraction of all types of number. +func Subtract(left, right any) any { + var rleft, rright int64 + var fleft, fright float64 + isInt := true + switch left := left.(type) { + case int: + rleft = int64(left) + case int8: + rleft = int64(left) + case int16: + rleft = int64(left) + case int32: + rleft = int64(left) + case int64: + rleft = left + case float32: + fleft = float64(left) + isInt = false + case float64: + fleft = left + isInt = false + } + + switch right := right.(type) { + case int: + rright = int64(right) + case int8: + rright = int64(right) + case int16: + rright = int64(right) + case int32: + rright = int64(right) + case int64: + rright = right + case float32: + fright = float64(left.(float32)) + isInt = false + case float64: + fleft = left.(float64) + isInt = false + } + + if isInt { + return rleft - rright + } else { + return fleft + float64(rleft) - (fright + float64(rright)) + } +} + +// StringsToInt64s converts a slice of string to a slice of int64. +// Invalid strings are converted to 0 (parse errors are silently ignored). +func StringsToInt64s(strs []string) []int64 { + ints := make([]int64, len(strs)) + for i := range strs { + ints[i], _ = strconv.ParseInt(strs[i], 10, 64) + } + return ints +} + +// Int64sToStrings converts a slice of int64 to a slice of string. +func Int64sToStrings(ints []int64) []string { + strs := make([]string, len(ints)) + for i := range ints { + strs[i] = strconv.FormatInt(ints[i], 10) + } + return strs +} + +// Int64sToMap converts a slice of int64 to a int64 map. +func Int64sToMap(ints []int64) map[int64]bool { + m := make(map[int64]bool) + for _, i := range ints { + m[i] = true + } + return m +} + +// IsLetter reports whether the rune is a letter (category L). +// https://github.com/golang/go/blob/master/src/go/scanner/scanner.go#L257 +func IsLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} diff --git a/internal/urlx/urlx.go b/internal/urlx/urlx.go new file mode 100644 index 00000000000..e54ab2a929f --- /dev/null +++ b/internal/urlx/urlx.go @@ -0,0 +1,6 @@ +package urlx + +// IsSameSite returns true if the URL path belongs to the same site. +func IsSameSite(url string) bool { + return len(url) >= 2 && url[0] == '/' && url[1] != '/' && url[1] != '\\' +} diff --git a/internal/urlx/urlx_test.go b/internal/urlx/urlx_test.go new file mode 100644 index 00000000000..e4d9b6103a7 --- /dev/null +++ b/internal/urlx/urlx_test.go @@ -0,0 +1,28 @@ +package urlx + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsSameSite(t *testing.T) { + tests := []struct { + url string + want bool + }{ + {url: "//github.com", want: false}, + {url: "http://github.com", want: false}, + {url: "https://github.com", want: false}, + {url: "/\\github.com", want: false}, + + {url: "/admin", want: true}, + {url: "/user/repo", want: true}, + } + + for _, test := range tests { + t.Run(test.url, func(t *testing.T) { + assert.Equal(t, test.want, IsSameSite(test.url)) + }) + } +} diff --git a/internal/userx/userx.go b/internal/userx/userx.go new file mode 100644 index 00000000000..3a39b5cea26 --- /dev/null +++ b/internal/userx/userx.go @@ -0,0 +1,138 @@ +package userx + +import ( + "bytes" + "crypto/sha256" + "crypto/subtle" + "encoding/hex" + "fmt" + "image" + "image/png" + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/cockroachdb/errors" + "golang.org/x/crypto/pbkdf2" + "golang.org/x/image/draw" + + "gogs.io/gogs/internal/avatar" + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/strx" + "gogs.io/gogs/internal/tool" +) + +// DashboardURLPath returns the URL path to the user or organization dashboard. +func DashboardURLPath(name string, isOrganization bool) string { + if isOrganization { + return conf.Server.Subpath + "/org/" + name + "/dashboard/" + } + return conf.Server.Subpath + "/" +} + +// GenerateActivateCode generates an activate code based on user information and +// the given email. +func GenerateActivateCode(userID int64, email, name, password, rands string) string { + code := tool.CreateTimeLimitCode( + fmt.Sprintf("%d%s%s%s%s", userID, email, strings.ToLower(name), password, rands), + conf.Auth.ActivateCodeLives, + nil, + ) + + // Add tailing hex username + code += hex.EncodeToString([]byte(strings.ToLower(name))) + return code +} + +// CustomAvatarPath returns the absolute path of the user custom avatar file. +func CustomAvatarPath(userID int64) string { + return filepath.Join(conf.Picture.AvatarUploadPath, strconv.FormatInt(userID, 10)) +} + +// GenerateRandomAvatar generates a random avatar and stores to local file +// system using given user information. +func GenerateRandomAvatar(userID int64, name, email string) error { + seed := email + if seed == "" { + seed = name + } + + img, err := avatar.RandomImage([]byte(seed)) + if err != nil { + return errors.Wrap(err, "generate random image") + } + + avatarPath := CustomAvatarPath(userID) + err = os.MkdirAll(filepath.Dir(avatarPath), os.ModePerm) + if err != nil { + return errors.Wrap(err, "create avatar directory") + } + + f, err := os.Create(avatarPath) + if err != nil { + return errors.Wrap(err, "create avatar file") + } + defer func() { _ = f.Close() }() + + if err = png.Encode(f, img); err != nil { + return errors.Wrap(err, "encode avatar image to file") + } + return nil +} + +// SaveAvatar saves the given avatar for the user. +func SaveAvatar(userID int64, data []byte) error { + img, _, err := image.Decode(bytes.NewReader(data)) + if err != nil { + return errors.Wrap(err, "decode image") + } + + avatarPath := CustomAvatarPath(userID) + err = os.MkdirAll(filepath.Dir(avatarPath), os.ModePerm) + if err != nil { + return errors.Wrap(err, "create avatar directory") + } + + f, err := os.Create(avatarPath) + if err != nil { + return errors.Wrap(err, "create avatar file") + } + defer func() { _ = f.Close() }() + + dst := image.NewRGBA(image.Rect(0, 0, avatar.DefaultSize, avatar.DefaultSize)) + draw.NearestNeighbor.Scale(dst, dst.Bounds(), img, img.Bounds(), draw.Over, nil) + if err = png.Encode(f, dst); err != nil { + return errors.Wrap(err, "encode avatar image to file") + } + return nil +} + +// EncodePassword encodes password using PBKDF2 SHA256 with given salt. +func EncodePassword(password, salt string) string { + newPasswd := pbkdf2.Key([]byte(password), []byte(salt), 10000, 50, sha256.New) + return fmt.Sprintf("%x", newPasswd) +} + +// ValidatePassword returns true if the given password matches the encoded +// version with given salt. +func ValidatePassword(encoded, salt, password string) bool { + got := EncodePassword(password, salt) + return subtle.ConstantTimeCompare([]byte(encoded), []byte(got)) == 1 +} + +// MailResendCacheKey returns the key used for caching mail resend. +func MailResendCacheKey(userID int64) string { + return fmt.Sprintf("mailResend::%d", userID) +} + +// TwoFactorCacheKey returns the key used for caching two factor passcode. +func TwoFactorCacheKey(userID int64, passcode string) string { + return fmt.Sprintf("twoFactor::%d::%s", userID, passcode) +} + +// RandomSalt returns randomly generated 10-character string that can be used as +// the user salt. +func RandomSalt() (string, error) { + return strx.RandomChars(10) +} diff --git a/internal/userx/userx_test.go b/internal/userx/userx_test.go new file mode 100644 index 00000000000..4d622079eaf --- /dev/null +++ b/internal/userx/userx_test.go @@ -0,0 +1,197 @@ +package userx + +import ( + "os" + "runtime" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/osx" + "gogs.io/gogs/internal/tool" + "gogs.io/gogs/public" +) + +func TestDashboardURLPath(t *testing.T) { + t.Run("user", func(t *testing.T) { + got := DashboardURLPath("alice", false) + want := "/" + assert.Equal(t, want, got) + }) + + t.Run("organization", func(t *testing.T) { + got := DashboardURLPath("acme", true) + want := "/org/acme/dashboard/" + assert.Equal(t, want, got) + }) +} + +func TestGenerateActivateCode(t *testing.T) { + conf.SetMockAuth(t, + conf.AuthOpts{ + ActivateCodeLives: 10, + }, + ) + + code := GenerateActivateCode(1, "alice@example.com", "Alice", "123456", "rands") + got := tool.VerifyTimeLimitCode("1alice@example.comalice123456rands", conf.Auth.ActivateCodeLives, code[:tool.TimeLimitCodeLength]) + assert.True(t, got) +} + +func TestCustomAvatarPath(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Skipping testing on Windows") + return + } + + conf.SetMockPicture(t, + conf.PictureOpts{ + AvatarUploadPath: "data/avatars", + }, + ) + + got := CustomAvatarPath(1) + want := "data/avatars/1" + assert.Equal(t, want, got) +} + +func TestGenerateRandomAvatar(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Skipping testing on Windows") + return + } + + conf.SetMockPicture(t, + conf.PictureOpts{ + AvatarUploadPath: os.TempDir(), + }, + ) + + avatarPath := CustomAvatarPath(1) + defer func() { _ = os.Remove(avatarPath) }() + + err := GenerateRandomAvatar(1, "alice", "alice@example.com") + require.NoError(t, err) + got := osx.IsFile(avatarPath) + assert.True(t, got) +} + +func TestSaveAvatar(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Skipping testing on Windows") + return + } + + conf.SetMockPicture(t, + conf.PictureOpts{ + AvatarUploadPath: os.TempDir(), + }, + ) + + avatar, err := public.Files.ReadFile("img/avatar_default.png") + require.NoError(t, err) + + avatarPath := CustomAvatarPath(1) + defer func() { _ = os.Remove(avatarPath) }() + + err = SaveAvatar(1, avatar) + require.NoError(t, err) + got := osx.IsFile(avatarPath) + assert.True(t, got) +} + +func TestEncodePassword(t *testing.T) { + want := EncodePassword("123456", "rands") + tests := []struct { + name string + password string + rands string + wantEqual bool + }{ + { + name: "correct", + password: "123456", + rands: "rands", + wantEqual: true, + }, + + { + name: "wrong password", + password: "111333", + rands: "rands", + wantEqual: false, + }, + { + name: "wrong salt", + password: "111333", + rands: "salt", + wantEqual: false, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := EncodePassword(test.password, test.rands) + if test.wantEqual { + assert.Equal(t, want, got) + } else { + assert.NotEqual(t, want, got) + } + }) + } +} + +func TestValidatePassword(t *testing.T) { + want := EncodePassword("123456", "rands") + tests := []struct { + name string + password string + rands string + wantEqual bool + }{ + { + name: "correct", + password: "123456", + rands: "rands", + wantEqual: true, + }, + + { + name: "wrong password", + password: "111333", + rands: "rands", + wantEqual: false, + }, + { + name: "wrong salt", + password: "111333", + rands: "salt", + wantEqual: false, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + got := ValidatePassword(want, test.rands, test.password) + assert.Equal(t, test.wantEqual, got) + }) + } +} + +func TestMailResendCacheKey(t *testing.T) { + got := MailResendCacheKey(1) + assert.Equal(t, "mailResend::1", got) +} + +func TestTwoFactorCacheKey(t *testing.T) { + got := TwoFactorCacheKey(1, "113654") + assert.Equal(t, "twoFactor::1::113654", got) +} + +func TestRandomSalt(t *testing.T) { + salt1, err := RandomSalt() + require.NoError(t, err) + salt2, err := RandomSalt() + require.NoError(t, err) + assert.NotEqual(t, salt1, salt2) +} diff --git a/mockgen.go b/mockgen.go new file mode 100644 index 00000000000..323e484c734 --- /dev/null +++ b/mockgen.go @@ -0,0 +1,4 @@ +package main + +//go:generate go install golang.org/x/tools/cmd/goimports@v0.17.0 +//go:generate go run github.com/unknwon/go-mockgen/cmd/go-mockgen@v0.0.0-20251002032800-a9a94b119e3b diff --git a/mockgen.yaml b/mockgen.yaml new file mode 100644 index 00000000000..65f812736cc --- /dev/null +++ b/mockgen.yaml @@ -0,0 +1,39 @@ +force: true +goimports: goimports +file-prefix: | + This file was generated by running `go-mockgen` at the root of this repository. + To add additional mocks to this or another package, add a new entry to the + mockgen.yaml file in the root of this repository. +mocks: + # To generate a new mock struct from an interface definition, add a new value to this + # list. Each item will need to supply two pieces of information: + # + # (1) First, you will need to give a target filename + # (2) Second, you will need to supply a target import path and interface name. If the + # set of interface definitions you are mocking are all from the same package, then + # you can supply a `path` and `interfaces` key which take a string and string array, + # respectively. If the set of interface definitions you are mocking come from multiple + # import paths, you can supply a `sources` array, each item containing a `path` and + # `interfaces` key. + # + # By convention, you should generate mocks next to the CONSUMER of an interface, not the + # definition. It is NOT considered an anti-pattern to generate multiple mocks for the same + # shared interface. + # + # By convention, the filename containing generated mocks should be `mocks_test.go`. + - filename: internal/database/mocks_test.go + sources: + - path: gogs.io/gogs/internal/database + interfaces: + - loginSourceFileStore + - loginSourceFilesStore + - filename: internal/database/mocks_gen.go + sources: + - path: gogs.io/gogs/internal/auth + interfaces: + - Provider + - filename: internal/route/lfs/mocks_test.go + sources: + - path: gogs.io/gogs/internal/route/lfs + interfaces: + - Store diff --git a/models/access.go b/models/access.go deleted file mode 100644 index b3be9b5bb66..00000000000 --- a/models/access.go +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2014 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 models - -import ( - "fmt" - - "github.com/gogits/gogs/modules/log" -) - -type AccessMode int - -const ( - ACCESS_MODE_NONE AccessMode = iota // 0 - ACCESS_MODE_READ // 1 - ACCESS_MODE_WRITE // 2 - ACCESS_MODE_ADMIN // 3 - ACCESS_MODE_OWNER // 4 -) - -func (mode AccessMode) String() string { - switch mode { - case ACCESS_MODE_READ: - return "read" - case ACCESS_MODE_WRITE: - return "write" - case ACCESS_MODE_ADMIN: - return "admin" - case ACCESS_MODE_OWNER: - return "owner" - default: - return "none" - } -} - -// ParseAccessMode returns corresponding access mode to given permission string. -func ParseAccessMode(permission string) AccessMode { - switch permission { - case "write": - return ACCESS_MODE_WRITE - case "admin": - return ACCESS_MODE_ADMIN - default: - return ACCESS_MODE_READ - } -} - -// Access represents the highest access level of a user to the repository. The only access type -// that is not in this table is the real owner of a repository. In case of an organization -// repository, the members of the owners team are in this table. -type Access struct { - ID int64 `xorm:"pk autoincr"` - UserID int64 `xorm:"UNIQUE(s)"` - RepoID int64 `xorm:"UNIQUE(s)"` - Mode AccessMode -} - -func accessLevel(e Engine, u *User, repo *Repository) (AccessMode, error) { - mode := ACCESS_MODE_NONE - if !repo.IsPrivate { - mode = ACCESS_MODE_READ - } - - if u == nil { - return mode, nil - } - - if u.ID == repo.OwnerID { - return ACCESS_MODE_OWNER, nil - } - - a := &Access{UserID: u.ID, RepoID: repo.ID} - if has, err := e.Get(a); !has || err != nil { - return mode, err - } - return a.Mode, nil -} - -// 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(u *User, repo *Repository) (AccessMode, error) { - return accessLevel(x, u, repo) -} - -func hasAccess(e Engine, u *User, repo *Repository, testMode AccessMode) (bool, error) { - mode, err := accessLevel(e, u, repo) - return testMode <= mode, err -} - -// HasAccess returns true if someone has the request access level. User can be nil! -func HasAccess(u *User, repo *Repository, testMode AccessMode) (bool, error) { - return hasAccess(x, u, repo, testMode) -} - -// GetRepositoryAccesses finds all repositories with their access mode where a user has access but does not own. -func (u *User) GetRepositoryAccesses() (map[*Repository]AccessMode, error) { - accesses := make([]*Access, 0, 10) - if err := x.Find(&accesses, &Access{UserID: u.ID}); err != nil { - return nil, err - } - - repos := make(map[*Repository]AccessMode, len(accesses)) - for _, access := range accesses { - repo, err := GetRepositoryByID(access.RepoID) - if err != nil { - if IsErrRepoNotExist(err) { - log.Error(4, "GetRepositoryByID: %v", err) - continue - } - return nil, err - } - if err = repo.GetOwner(); err != nil { - return nil, err - } else if repo.OwnerID == u.ID { - continue - } - repos[repo] = access.Mode - } - return repos, nil -} - -// GetAccessibleRepositories finds repositories which the user has access but does not own. -// If limit is smaller than 1 means returns all found results. -func (user *User) GetAccessibleRepositories(limit int) (repos []*Repository, _ error) { - sess := x.Where("owner_id !=? ", user.ID).Desc("updated_unix") - if limit > 0 { - sess.Limit(limit) - repos = make([]*Repository, 0, limit) - } else { - repos = make([]*Repository, 0, 10) - } - return repos, sess.Join("INNER", "access", "access.user_id = ? AND access.repo_id = repository.id", user.ID).Find(&repos) -} - -func maxAccessMode(modes ...AccessMode) AccessMode { - max := ACCESS_MODE_NONE - for _, mode := range modes { - if mode > max { - max = mode - } - } - return max -} - -// FIXME: do corss-comparison so reduce deletions and additions to the minimum? -func (repo *Repository) refreshAccesses(e Engine, accessMap map[int64]AccessMode) (err error) { - minMode := ACCESS_MODE_READ - if !repo.IsPrivate { - minMode = ACCESS_MODE_WRITE - } - - newAccesses := make([]Access, 0, len(accessMap)) - for userID, mode := range accessMap { - if mode < minMode { - continue - } - newAccesses = append(newAccesses, Access{ - UserID: userID, - RepoID: repo.ID, - Mode: mode, - }) - } - - // Delete old accesses and insert new ones for repository. - if _, err = e.Delete(&Access{RepoID: repo.ID}); err != nil { - return fmt.Errorf("delete old accesses: %v", err) - } else if _, err = e.Insert(newAccesses); err != nil { - return fmt.Errorf("insert new accesses: %v", err) - } - return nil -} - -// refreshCollaboratorAccesses retrieves repository collaborations with their access modes. -func (repo *Repository) refreshCollaboratorAccesses(e Engine, accessMap map[int64]AccessMode) error { - collaborations, err := repo.getCollaborations(e) - if err != nil { - return fmt.Errorf("getCollaborations: %v", err) - } - for _, c := range collaborations { - accessMap[c.UserID] = c.Mode - } - return nil -} - -// recalculateTeamAccesses recalculates new accesses for teams of an organization -// except the team whose ID is given. It is used to assign a team ID when -// remove repository from that team. -func (repo *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err error) { - accessMap := make(map[int64]AccessMode, 20) - - if err = repo.getOwner(e); err != nil { - return err - } else if !repo.Owner.IsOrganization() { - return fmt.Errorf("owner is not an organization: %d", repo.OwnerID) - } - - if err = repo.refreshCollaboratorAccesses(e, accessMap); err != nil { - return fmt.Errorf("refreshCollaboratorAccesses: %v", err) - } - - if err = repo.Owner.getTeams(e); err != nil { - return err - } - - for _, t := range repo.Owner.Teams { - if t.ID == ignTeamID { - continue - } - - // Owner team gets owner access, and skip for teams that do not - // have relations with repository. - if t.IsOwnerTeam() { - t.Authorize = ACCESS_MODE_OWNER - } else if !t.hasRepository(e, repo.ID) { - continue - } - - if err = t.getMembers(e); err != nil { - return fmt.Errorf("getMembers '%d': %v", t.ID, err) - } - for _, m := range t.Members { - accessMap[m.ID] = maxAccessMode(accessMap[m.ID], t.Authorize) - } - } - - return repo.refreshAccesses(e, accessMap) -} - -func (repo *Repository) recalculateAccesses(e Engine) error { - if repo.Owner.IsOrganization() { - return repo.recalculateTeamAccesses(e, 0) - } - - accessMap := make(map[int64]AccessMode, 20) - if err := repo.refreshCollaboratorAccesses(e, accessMap); err != nil { - return fmt.Errorf("refreshCollaboratorAccesses: %v", err) - } - return repo.refreshAccesses(e, accessMap) -} - -// RecalculateAccesses recalculates all accesses for repository. -func (r *Repository) RecalculateAccesses() error { - return r.recalculateAccesses(x) -} diff --git a/models/action.go b/models/action.go deleted file mode 100644 index 54695417a77..00000000000 --- a/models/action.go +++ /dev/null @@ -1,616 +0,0 @@ -// Copyright 2014 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 models - -import ( - "encoding/json" - "fmt" - "path" - "regexp" - "strings" - "time" - "unicode" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - - "github.com/gogits/git-module" - api "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -type ActionType int - -const ( - ACTION_CREATE_REPO ActionType = iota + 1 // 1 - ACTION_RENAME_REPO // 2 - ACTION_STAR_REPO // 3 - ACTION_WATCH_REPO // 4 - ACTION_COMMIT_REPO // 5 - ACTION_CREATE_ISSUE // 6 - ACTION_CREATE_PULL_REQUEST // 7 - ACTION_TRANSFER_REPO // 8 - ACTION_PUSH_TAG // 9 - ACTION_COMMENT_ISSUE // 10 - ACTION_MERGE_PULL_REQUEST // 11 - ACTION_CLOSE_ISSUE // 12 - ACTION_REOPEN_ISSUE // 13 - ACTION_CLOSE_PULL_REQUEST // 14 - ACTION_REOPEN_PULL_REQUEST // 15 -) - -var ( - // Same as Github. See https://help.github.com/articles/closing-issues-via-commit-messages - IssueCloseKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} - IssueReopenKeywords = []string{"reopen", "reopens", "reopened"} - - IssueCloseKeywordsPat, IssueReopenKeywordsPat *regexp.Regexp - IssueReferenceKeywordsPat *regexp.Regexp -) - -func assembleKeywordsPattern(words []string) string { - return fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(words, "|")) -} - -func init() { - IssueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueCloseKeywords)) - IssueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueReopenKeywords)) - IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`) -} - -// Action represents user operation type and other information to repository., -// it implemented interface base.Actioner so that can be used in template render. -type Action struct { - ID int64 `xorm:"pk autoincr"` - UserID int64 // Receiver user id. - OpType ActionType - ActUserID int64 // Action user id. - ActUserName string // Action user name. - ActAvatar string `xorm:"-"` - RepoID int64 - RepoUserName string - RepoName string - RefName string - IsPrivate bool `xorm:"NOT NULL DEFAULT false"` - Content string `xorm:"TEXT"` - Created time.Time `xorm:"-"` - CreatedUnix int64 -} - -func (a *Action) BeforeInsert() { - a.CreatedUnix = time.Now().Unix() -} - -func (a *Action) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "created_unix": - a.Created = time.Unix(a.CreatedUnix, 0).Local() - } -} - -func (a *Action) GetOpType() int { - return int(a.OpType) -} - -func (a *Action) GetActUserName() string { - return a.ActUserName -} - -func (a *Action) ShortActUserName() string { - return base.EllipsisString(a.ActUserName, 20) -} - -func (a *Action) GetRepoUserName() string { - return a.RepoUserName -} - -func (a *Action) ShortRepoUserName() string { - return base.EllipsisString(a.RepoUserName, 20) -} - -func (a *Action) GetRepoName() string { - return a.RepoName -} - -func (a *Action) ShortRepoName() string { - return base.EllipsisString(a.RepoName, 33) -} - -func (a *Action) GetRepoPath() string { - return path.Join(a.RepoUserName, a.RepoName) -} - -func (a *Action) ShortRepoPath() string { - return path.Join(a.ShortRepoUserName(), a.ShortRepoName()) -} - -func (a *Action) GetRepoLink() string { - if len(setting.AppSubUrl) > 0 { - return path.Join(setting.AppSubUrl, a.GetRepoPath()) - } - return "/" + a.GetRepoPath() -} - -func (a *Action) GetBranch() string { - return a.RefName -} - -func (a *Action) GetContent() string { - return a.Content -} - -func (a *Action) GetCreate() time.Time { - return a.Created -} - -func (a *Action) GetIssueInfos() []string { - return strings.SplitN(a.Content, "|", 2) -} - -func (a *Action) GetIssueTitle() string { - index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() - issue, err := GetIssueByIndex(a.RepoID, index) - if err != nil { - log.Error(4, "GetIssueByIndex: %v", err) - return "500 when get issue" - } - return issue.Title -} - -func (a *Action) GetIssueContent() string { - index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() - issue, err := GetIssueByIndex(a.RepoID, index) - if err != nil { - log.Error(4, "GetIssueByIndex: %v", err) - return "500 when get issue" - } - return issue.Content -} - -func newRepoAction(e Engine, u *User, repo *Repository) (err error) { - if err = notifyWatchers(e, &Action{ - ActUserID: u.ID, - ActUserName: u.Name, - OpType: ACTION_CREATE_REPO, - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, - }); err != nil { - return fmt.Errorf("notify watchers '%d/%d': %v", u.ID, repo.ID, err) - } - - log.Trace("action.newRepoAction: %s/%s", u.Name, repo.Name) - return err -} - -// NewRepoAction adds new action for creating repository. -func NewRepoAction(u *User, repo *Repository) (err error) { - return newRepoAction(x, u, repo) -} - -func renameRepoAction(e Engine, actUser *User, oldRepoName string, repo *Repository) (err error) { - if err = notifyWatchers(e, &Action{ - ActUserID: actUser.ID, - ActUserName: actUser.Name, - OpType: ACTION_RENAME_REPO, - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, - Content: oldRepoName, - }); err != nil { - return fmt.Errorf("notify watchers: %v", err) - } - - log.Trace("action.renameRepoAction: %s/%s", actUser.Name, repo.Name) - return nil -} - -// RenameRepoAction adds new action for renaming a repository. -func RenameRepoAction(actUser *User, oldRepoName string, repo *Repository) error { - return renameRepoAction(x, actUser, oldRepoName, repo) -} - -func issueIndexTrimRight(c rune) bool { - return !unicode.IsDigit(c) -} - -type PushCommit struct { - Sha1 string - Message string - AuthorEmail string - AuthorName string - CommitterEmail string - CommitterName string - Timestamp time.Time -} - -type PushCommits struct { - Len int - Commits []*PushCommit - CompareURL string - - avatars map[string]string -} - -func NewPushCommits() *PushCommits { - return &PushCommits{ - avatars: make(map[string]string), - } -} - -func (pc *PushCommits) ToApiPayloadCommits(repoLink string) []*api.PayloadCommit { - commits := make([]*api.PayloadCommit, len(pc.Commits)) - for i, commit := range pc.Commits { - authorUsername := "" - author, err := GetUserByEmail(commit.AuthorEmail) - if err == nil { - authorUsername = author.Name - } - committerUsername := "" - committer, err := GetUserByEmail(commit.CommitterEmail) - if err == nil { - // TODO: check errors other than email not found. - committerUsername = committer.Name - } - commits[i] = &api.PayloadCommit{ - ID: commit.Sha1, - Message: commit.Message, - URL: fmt.Sprintf("%s/commit/%s", repoLink, commit.Sha1), - Author: &api.PayloadUser{ - Name: commit.AuthorName, - Email: commit.AuthorEmail, - UserName: authorUsername, - }, - Committer: &api.PayloadUser{ - Name: commit.CommitterName, - Email: commit.CommitterEmail, - UserName: committerUsername, - }, - Timestamp: commit.Timestamp, - } - } - return commits -} - -// AvatarLink tries to match user in database with e-mail -// in order to show custom avatar, and falls back to general avatar link. -func (push *PushCommits) AvatarLink(email string) string { - _, ok := push.avatars[email] - if !ok { - u, err := GetUserByEmail(email) - if err != nil { - push.avatars[email] = base.AvatarLink(email) - if !IsErrUserNotExist(err) { - log.Error(4, "GetUserByEmail: %v", err) - } - } else { - push.avatars[email] = u.RelAvatarLink() - } - } - - return push.avatars[email] -} - -// UpdateIssuesCommit checks if issues are manipulated by commit message. -func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) error { - // Commits are appended in the reverse order. - for i := len(commits) - 1; i >= 0; i-- { - c := commits[i] - - refMarked := make(map[int64]bool) - for _, ref := range IssueReferenceKeywordsPat.FindAllString(c.Message, -1) { - ref = ref[strings.IndexByte(ref, byte(' '))+1:] - ref = strings.TrimRightFunc(ref, issueIndexTrimRight) - - if len(ref) == 0 { - continue - } - - // Add repo name if missing - if ref[0] == '#' { - ref = fmt.Sprintf("%s%s", repo.FullName(), ref) - } else if !strings.Contains(ref, "/") { - // FIXME: We don't support User#ID syntax yet - // return ErrNotImplemented - continue - } - - issue, err := GetIssueByRef(ref) - if err != nil { - if IsErrIssueNotExist(err) { - continue - } - return err - } - - if refMarked[issue.ID] { - continue - } - refMarked[issue.ID] = true - - message := fmt.Sprintf(`%s`, repo.Link(), c.Sha1, c.Message) - if err = CreateRefComment(doer, repo, issue, message, c.Sha1); err != nil { - return err - } - } - - refMarked = make(map[int64]bool) - // FIXME: can merge this one and next one to a common function. - for _, ref := range IssueCloseKeywordsPat.FindAllString(c.Message, -1) { - ref = ref[strings.IndexByte(ref, byte(' '))+1:] - ref = strings.TrimRightFunc(ref, issueIndexTrimRight) - - if len(ref) == 0 { - continue - } - - // Add repo name if missing - if ref[0] == '#' { - ref = fmt.Sprintf("%s%s", repo.FullName(), ref) - } else if !strings.Contains(ref, "/") { - // We don't support User#ID syntax yet - // return ErrNotImplemented - continue - } - - issue, err := GetIssueByRef(ref) - if err != nil { - if IsErrIssueNotExist(err) { - continue - } - return err - } - - if refMarked[issue.ID] { - continue - } - refMarked[issue.ID] = true - - if issue.RepoID != repo.ID || issue.IsClosed { - continue - } - - if err = issue.ChangeStatus(doer, repo, true); err != nil { - return err - } - } - - // It is conflict to have close and reopen at same time, so refsMarkd doesn't need to reinit here. - for _, ref := range IssueReopenKeywordsPat.FindAllString(c.Message, -1) { - ref = ref[strings.IndexByte(ref, byte(' '))+1:] - ref = strings.TrimRightFunc(ref, issueIndexTrimRight) - - if len(ref) == 0 { - continue - } - - // Add repo name if missing - if ref[0] == '#' { - ref = fmt.Sprintf("%s%s", repo.FullName(), ref) - } else if !strings.Contains(ref, "/") { - // We don't support User#ID syntax yet - // return ErrNotImplemented - continue - } - - issue, err := GetIssueByRef(ref) - if err != nil { - if IsErrIssueNotExist(err) { - continue - } - return err - } - - if refMarked[issue.ID] { - continue - } - refMarked[issue.ID] = true - - if issue.RepoID != repo.ID || !issue.IsClosed { - continue - } - - if err = issue.ChangeStatus(doer, repo, false); err != nil { - return err - } - } - } - return nil -} - -type CommitRepoActionOptions struct { - PusherName string - RepoOwnerID int64 - RepoName string - RefFullName string - OldCommitID string - NewCommitID string - Commits *PushCommits -} - -// CommitRepoAction adds new commit actio to the repository, and prepare corresponding webhooks. -func CommitRepoAction(opts CommitRepoActionOptions) error { - pusher, err := GetUserByName(opts.PusherName) - if err != nil { - return fmt.Errorf("GetUserByName [%s]: %v", opts.PusherName, err) - } - - repo, err := GetRepositoryByName(opts.RepoOwnerID, opts.RepoName) - if err != nil { - return fmt.Errorf("GetRepositoryByName [owner_id: %d, name: %s]: %v", opts.RepoOwnerID, opts.RepoName, err) - } - - // Change repository bare status and update last updated time. - repo.IsBare = false - if err = UpdateRepository(repo, false); err != nil { - return fmt.Errorf("UpdateRepository: %v", err) - } - - isNewBranch := false - opType := ACTION_COMMIT_REPO - // Check it's tag push or branch. - if strings.HasPrefix(opts.RefFullName, git.TAG_PREFIX) { - opType = ACTION_PUSH_TAG - opts.Commits = &PushCommits{} - } else { - // if not the first commit, set the compare URL. - if opts.OldCommitID == git.EMPTY_SHA { - isNewBranch = true - } else { - opts.Commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID) - } - - if err = UpdateIssuesCommit(pusher, repo, opts.Commits.Commits); err != nil { - log.Error(4, "updateIssuesCommit: %v", err) - } - } - - if len(opts.Commits.Commits) > setting.UI.FeedMaxCommitNum { - opts.Commits.Commits = opts.Commits.Commits[:setting.UI.FeedMaxCommitNum] - } - - data, err := json.Marshal(opts.Commits) - if err != nil { - return fmt.Errorf("Marshal: %v", err) - } - - 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, - }); err != nil { - return fmt.Errorf("NotifyWatchers: %v", err) - } - - defer func() { - go HookQueue.Add(repo.ID) - }() - - apiPusher := pusher.APIFormat() - apiRepo := repo.APIFormat(nil) - switch opType { - case ACTION_COMMIT_REPO: // Push - if err = PrepareWebhooks(repo, HOOK_EVENT_PUSH, &api.PushPayload{ - Ref: opts.RefFullName, - Before: opts.OldCommitID, - After: opts.NewCommitID, - CompareURL: setting.AppUrl + opts.Commits.CompareURL, - Commits: opts.Commits.ToApiPayloadCommits(repo.HTMLURL()), - Repo: apiRepo, - Pusher: apiPusher, - Sender: apiPusher, - }); err != nil { - return fmt.Errorf("PrepareWebhooks: %v", err) - } - - if isNewBranch { - return PrepareWebhooks(repo, HOOK_EVENT_CREATE, &api.CreatePayload{ - Ref: refName, - RefType: "branch", - Repo: apiRepo, - Sender: apiPusher, - }) - } - - case ACTION_PUSH_TAG: // Create - return PrepareWebhooks(repo, HOOK_EVENT_CREATE, &api.CreatePayload{ - Ref: refName, - RefType: "tag", - Repo: apiRepo, - Sender: apiPusher, - }) - } - - return nil -} - -func transferRepoAction(e Engine, doer, oldOwner *User, repo *Repository) (err error) { - if err = notifyWatchers(e, &Action{ - ActUserID: doer.ID, - ActUserName: doer.Name, - OpType: ACTION_TRANSFER_REPO, - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, - Content: path.Join(oldOwner.Name, repo.Name), - }); err != nil { - return fmt.Errorf("notifyWatchers: %v", err) - } - - // Remove watch for organization. - if oldOwner.IsOrganization() { - if err = watchRepo(e, oldOwner.ID, repo.ID, false); err != nil { - return fmt.Errorf("watchRepo [false]: %v", err) - } - } - - return nil -} - -// TransferRepoAction adds new action for transferring repository, -// the Owner field of repository is assumed to be new owner. -func TransferRepoAction(doer, oldOwner *User, repo *Repository) error { - return transferRepoAction(x, doer, oldOwner, repo) -} - -func mergePullRequestAction(e Engine, doer *User, repo *Repository, issue *Issue) error { - return notifyWatchers(e, &Action{ - ActUserID: doer.ID, - ActUserName: doer.Name, - OpType: ACTION_MERGE_PULL_REQUEST, - Content: fmt.Sprintf("%d|%s", issue.Index, issue.Title), - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, - }) -} - -// MergePullRequestAction adds new action for merging pull request. -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() { - // FIXME: only need to get IDs here, not all fields of repository. - repos, _, err := ctxUser.GetUserRepositories(actorID, 1, ctxUser.NumRepos) - if err != nil { - return nil, fmt.Errorf("GetUserRepositories: %v", err) - } - - var repoIDs []int64 - for _, repo := range repos { - repoIDs = append(repoIDs, repo.ID) - } - - if len(repoIDs) > 0 { - sess.In("repo_id", repoIDs) - } - } - - err := sess.Find(&actions) - return actions, err -} diff --git a/models/admin.go b/models/admin.go deleted file mode 100644 index 68731a2433e..00000000000 --- a/models/admin.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2014 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 models - -import ( - "fmt" - "os" - "os/exec" - "strings" - "time" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -type NoticeType int - -const ( - NOTICE_REPOSITORY NoticeType = iota + 1 -) - -// Notice represents a system notice for admin. -type Notice struct { - ID int64 `xorm:"pk autoincr"` - Type NoticeType - Description string `xorm:"TEXT"` - Created time.Time `xorm:"-"` - CreatedUnix int64 -} - -func (n *Notice) BeforeInsert() { - n.CreatedUnix = time.Now().Unix() -} - -func (n *Notice) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "created_unix": - n.Created = time.Unix(n.CreatedUnix, 0).Local() - } -} - -// TrStr returns a translation format string. -func (n *Notice) TrStr() string { - return "admin.notices.type_" + com.ToStr(n.Type) -} - -// CreateNotice creates new system notice. -func CreateNotice(tp NoticeType, desc string) error { - // prevent panic if database connection is not available at this point - if x == nil { - return fmt.Errorf("Could not save notice due database connection not being available: %d %s", tp, desc) - } - - n := &Notice{ - Type: tp, - Description: desc, - } - _, err := x.Insert(n) - return err -} - -// CreateRepositoryNotice creates new system notice with type NOTICE_REPOSITORY. -func CreateRepositoryNotice(desc string) error { - return CreateNotice(NOTICE_REPOSITORY, desc) -} - -// RemoveAllWithNotice removes all directories in given path and -// creates a system notice when error occurs. -func RemoveAllWithNotice(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 { - desc := fmt.Sprintf("%s [%s]: %v", title, path, err) - log.Warn(desc) - if err = CreateRepositoryNotice(desc); err != nil { - log.Error(4, "CreateRepositoryNotice: %v", err) - } - } -} - -// CountNotices returns number of notices. -func CountNotices() int64 { - count, _ := x.Count(new(Notice)) - return count -} - -// Notices returns number of notices in given page. -func Notices(page, pageSize int) ([]*Notice, error) { - notices := make([]*Notice, 0, pageSize) - return notices, x.Limit(pageSize, (page-1)*pageSize).Desc("id").Find(¬ices) -} - -// DeleteNotice deletes a system notice by given ID. -func DeleteNotice(id int64) error { - _, err := x.Id(id).Delete(new(Notice)) - return err -} - -// DeleteNotices deletes all notices with ID from start to end (inclusive). -func DeleteNotices(start, end int64) error { - sess := x.Where("id >= ?", start) - if end > 0 { - sess.And("id <= ?", end) - } - _, err := sess.Delete(new(Notice)) - return err -} - -// DeleteNoticesByIDs deletes notices by given IDs. -func DeleteNoticesByIDs(ids []int64) error { - if len(ids) == 0 { - return nil - } - _, err := x.Where("id IN (" + strings.Join(base.Int64sToStrings(ids), ",") + ")").Delete(new(Notice)) - return err -} diff --git a/models/error.go b/models/error.go deleted file mode 100644 index 182a944a6f5..00000000000 --- a/models/error.go +++ /dev/null @@ -1,692 +0,0 @@ -// Copyright 2015 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 models - -import ( - "fmt" -) - -type ErrNameReserved struct { - Name string -} - -func IsErrNameReserved(err error) bool { - _, ok := err.(ErrNameReserved) - return ok -} - -func (err ErrNameReserved) Error() string { - return fmt.Sprintf("name is reserved [name: %s]", err.Name) -} - -type ErrNamePatternNotAllowed struct { - Pattern string -} - -func IsErrNamePatternNotAllowed(err error) bool { - _, ok := err.(ErrNamePatternNotAllowed) - return ok -} - -func (err ErrNamePatternNotAllowed) Error() string { - return fmt.Sprintf("name pattern is not allowed [pattern: %s]", err.Pattern) -} - -// ____ ___ -// | | \______ ___________ -// | | / ___// __ \_ __ \ -// | | /\___ \\ ___/| | \/ -// |______//____ >\___ >__| -// \/ \/ - -type ErrUserAlreadyExist struct { - Name string -} - -func IsErrUserAlreadyExist(err error) bool { - _, ok := err.(ErrUserAlreadyExist) - return ok -} - -func (err ErrUserAlreadyExist) Error() string { - return fmt.Sprintf("user already exists [name: %s]", err.Name) -} - -type ErrUserNotExist struct { - UID int64 - Name string -} - -func IsErrUserNotExist(err error) bool { - _, ok := err.(ErrUserNotExist) - return ok -} - -func (err ErrUserNotExist) Error() string { - return fmt.Sprintf("user does not exist [uid: %d, name: %s]", err.UID, err.Name) -} - -type ErrEmailAlreadyUsed struct { - Email string -} - -func IsErrEmailAlreadyUsed(err error) bool { - _, ok := err.(ErrEmailAlreadyUsed) - return ok -} - -func (err ErrEmailAlreadyUsed) Error() string { - return fmt.Sprintf("e-mail has been used [email: %s]", err.Email) -} - -type ErrUserOwnRepos struct { - UID int64 -} - -func IsErrUserOwnRepos(err error) bool { - _, ok := err.(ErrUserOwnRepos) - return ok -} - -func (err ErrUserOwnRepos) Error() string { - return fmt.Sprintf("user still has ownership of repositories [uid: %d]", err.UID) -} - -type ErrUserHasOrgs struct { - UID int64 -} - -func IsErrUserHasOrgs(err error) bool { - _, ok := err.(ErrUserHasOrgs) - return ok -} - -func (err ErrUserHasOrgs) Error() string { - return fmt.Sprintf("user still has membership of organizations [uid: %d]", err.UID) -} - -type ErrReachLimitOfRepo struct { - Limit int -} - -func IsErrReachLimitOfRepo(err error) bool { - _, ok := err.(ErrReachLimitOfRepo) - return ok -} - -func (err ErrReachLimitOfRepo) Error() string { - return fmt.Sprintf("user has reached maximum limit of repositories [limit: %d]", err.Limit) -} - -// __ __.__ __ .__ -// / \ / \__| | _|__| -// \ \/\/ / | |/ / | -// \ /| | <| | -// \__/\ / |__|__|_ \__| -// \/ \/ - -type ErrWikiAlreadyExist struct { - Title string -} - -func IsErrWikiAlreadyExist(err error) bool { - _, ok := err.(ErrWikiAlreadyExist) - return ok -} - -func (err ErrWikiAlreadyExist) Error() string { - return fmt.Sprintf("wiki page already exists [title: %s]", err.Title) -} - -// __________ ___. .__ .__ ____ __. -// \______ \__ _\_ |__ | | |__| ____ | |/ _|____ ___.__. -// | ___/ | \ __ \| | | |/ ___\ | <_/ __ < | | -// | | | | / \_\ \ |_| \ \___ | | \ ___/\___ | -// |____| |____/|___ /____/__|\___ > |____|__ \___ > ____| -// \/ \/ \/ \/\/ - -type ErrKeyUnableVerify struct { - Result string -} - -func IsErrKeyUnableVerify(err error) bool { - _, ok := err.(ErrKeyUnableVerify) - return ok -} - -func (err ErrKeyUnableVerify) Error() string { - return fmt.Sprintf("Unable to verify key content [result: %s]", err.Result) -} - -type ErrKeyNotExist struct { - ID int64 -} - -func IsErrKeyNotExist(err error) bool { - _, ok := err.(ErrKeyNotExist) - return ok -} - -func (err ErrKeyNotExist) Error() string { - return fmt.Sprintf("public key does not exist [id: %d]", err.ID) -} - -type ErrKeyAlreadyExist struct { - OwnerID int64 - Content string -} - -func IsErrKeyAlreadyExist(err error) bool { - _, ok := err.(ErrKeyAlreadyExist) - return ok -} - -func (err ErrKeyAlreadyExist) Error() string { - return fmt.Sprintf("public key already exists [owner_id: %d, content: %s]", err.OwnerID, err.Content) -} - -type ErrKeyNameAlreadyUsed struct { - OwnerID int64 - Name string -} - -func IsErrKeyNameAlreadyUsed(err error) bool { - _, ok := err.(ErrKeyNameAlreadyUsed) - return ok -} - -func (err ErrKeyNameAlreadyUsed) Error() string { - return fmt.Sprintf("public key already exists [owner_id: %d, name: %s]", err.OwnerID, err.Name) -} - -type ErrKeyAccessDenied struct { - UserID int64 - KeyID int64 - Note string -} - -func IsErrKeyAccessDenied(err error) bool { - _, ok := err.(ErrKeyAccessDenied) - return ok -} - -func (err ErrKeyAccessDenied) Error() string { - return fmt.Sprintf("user does not have access to the key [user_id: %d, key_id: %d, note: %s]", - err.UserID, err.KeyID, err.Note) -} - -type ErrDeployKeyNotExist struct { - ID int64 - KeyID int64 - RepoID int64 -} - -func IsErrDeployKeyNotExist(err error) bool { - _, ok := err.(ErrDeployKeyNotExist) - return ok -} - -func (err ErrDeployKeyNotExist) Error() string { - return fmt.Sprintf("Deploy key does not exist [id: %d, key_id: %d, repo_id: %d]", err.ID, err.KeyID, err.RepoID) -} - -type ErrDeployKeyAlreadyExist struct { - KeyID int64 - RepoID int64 -} - -func IsErrDeployKeyAlreadyExist(err error) bool { - _, ok := err.(ErrDeployKeyAlreadyExist) - return ok -} - -func (err ErrDeployKeyAlreadyExist) Error() string { - return fmt.Sprintf("public key already exists [key_id: %d, repo_id: %d]", err.KeyID, err.RepoID) -} - -type ErrDeployKeyNameAlreadyUsed struct { - RepoID int64 - Name string -} - -func IsErrDeployKeyNameAlreadyUsed(err error) bool { - _, ok := err.(ErrDeployKeyNameAlreadyUsed) - return ok -} - -func (err ErrDeployKeyNameAlreadyUsed) Error() string { - return fmt.Sprintf("public key already exists [repo_id: %d, name: %s]", err.RepoID, err.Name) -} - -// _____ ___________ __ -// / _ \ ____ ____ ____ ______ _____\__ ___/___ | | __ ____ ____ -// / /_\ \_/ ___\/ ___\/ __ \ / ___// ___/ | | / _ \| |/ // __ \ / \ -// / | \ \__\ \__\ ___/ \___ \ \___ \ | |( <_> ) <\ ___/| | \ -// \____|__ /\___ >___ >___ >____ >____ > |____| \____/|__|_ \\___ >___| / -// \/ \/ \/ \/ \/ \/ \/ \/ \/ - -type ErrAccessTokenNotExist struct { - SHA string -} - -func IsErrAccessTokenNotExist(err error) bool { - _, ok := err.(ErrAccessTokenNotExist) - return ok -} - -func (err ErrAccessTokenNotExist) Error() string { - return fmt.Sprintf("access token does not exist [sha: %s]", err.SHA) -} - -type ErrAccessTokenEmpty struct { -} - -func IsErrAccessTokenEmpty(err error) bool { - _, ok := err.(ErrAccessTokenEmpty) - return ok -} - -func (err ErrAccessTokenEmpty) Error() string { - return fmt.Sprintf("access token is empty") -} - -// ________ .__ __ .__ -// \_____ \_______ _________ ____ |__|____________ _/ |_|__| ____ ____ -// / | \_ __ \/ ___\__ \ / \| \___ /\__ \\ __\ |/ _ \ / \ -// / | \ | \/ /_/ > __ \| | \ |/ / / __ \| | | ( <_> ) | \ -// \_______ /__| \___ (____ /___| /__/_____ \(____ /__| |__|\____/|___| / -// \/ /_____/ \/ \/ \/ \/ \/ - -type ErrLastOrgOwner struct { - UID int64 -} - -func IsErrLastOrgOwner(err error) bool { - _, ok := err.(ErrLastOrgOwner) - return ok -} - -func (err ErrLastOrgOwner) Error() string { - return fmt.Sprintf("user is the last member of owner team [uid: %d]", err.UID) -} - -// __________ .__ __ -// \______ \ ____ ______ ____ _____|__|/ |_ ___________ ___.__. -// | _// __ \\____ \ / _ \/ ___/ \ __\/ _ \_ __ < | | -// | | \ ___/| |_> > <_> )___ \| || | ( <_> ) | \/\___ | -// |____|_ /\___ > __/ \____/____ >__||__| \____/|__| / ____| -// \/ \/|__| \/ \/ - -type ErrRepoNotExist struct { - ID int64 - UID int64 - Name string -} - -func IsErrRepoNotExist(err error) bool { - _, ok := err.(ErrRepoNotExist) - return ok -} - -func (err ErrRepoNotExist) Error() string { - return fmt.Sprintf("repository does not exist [id: %d, uid: %d, name: %s]", err.ID, err.UID, err.Name) -} - -type ErrRepoAlreadyExist struct { - Uname string - Name string -} - -func IsErrRepoAlreadyExist(err error) bool { - _, ok := err.(ErrRepoAlreadyExist) - return ok -} - -func (err ErrRepoAlreadyExist) Error() string { - return fmt.Sprintf("repository already exists [uname: %s, name: %s]", err.Uname, err.Name) -} - -type ErrInvalidCloneAddr struct { - IsURLError bool - IsInvalidPath bool - IsPermissionDenied bool -} - -func IsErrInvalidCloneAddr(err error) bool { - _, ok := err.(ErrInvalidCloneAddr) - return ok -} - -func (err ErrInvalidCloneAddr) Error() string { - return fmt.Sprintf("invalid clone address [is_url_error: %v, is_invalid_path: %v, is_permission_denied: %v]", - err.IsURLError, err.IsInvalidPath, err.IsPermissionDenied) -} - -type ErrUpdateTaskNotExist struct { - UUID string -} - -func IsErrUpdateTaskNotExist(err error) bool { - _, ok := err.(ErrUpdateTaskNotExist) - return ok -} - -func (err ErrUpdateTaskNotExist) Error() string { - return fmt.Sprintf("update task does not exist [uuid: %s]", err.UUID) -} - -type ErrReleaseAlreadyExist struct { - TagName string -} - -func IsErrReleaseAlreadyExist(err error) bool { - _, ok := err.(ErrReleaseAlreadyExist) - return ok -} - -func (err ErrReleaseAlreadyExist) Error() string { - return fmt.Sprintf("release tag already exist [tag_name: %s]", err.TagName) -} - -type ErrReleaseNotExist struct { - ID int64 - TagName string -} - -func IsErrReleaseNotExist(err error) bool { - _, ok := err.(ErrReleaseNotExist) - return ok -} - -func (err ErrReleaseNotExist) Error() string { - return fmt.Sprintf("release tag does not exist [id: %d, tag_name: %s]", err.ID, err.TagName) -} - -type ErrInvalidTagName struct { - TagName string -} - -func IsErrInvalidTagName(err error) bool { - _, ok := err.(ErrInvalidTagName) - return ok -} - -func (err ErrInvalidTagName) Error() string { - return fmt.Sprintf("release tag name is not valid [tag_name: %s]", err.TagName) -} - -type ErrRepoFileAlreadyExist struct { - FileName string -} - -func IsErrRepoFileAlreadyExist(err error) bool { - _, ok := err.(ErrRepoFileAlreadyExist) - return ok -} - -func (err ErrRepoFileAlreadyExist) Error() string { - return fmt.Sprintf("repository file already exists [file_name: %s]", err.FileName) -} - -// __________ .__ -// \______ \____________ ____ ____ | |__ -// | | _/\_ __ \__ \ / \_/ ___\| | \ -// | | \ | | \// __ \| | \ \___| Y \ -// |______ / |__| (____ /___| /\___ >___| / -// \/ \/ \/ \/ \/ - -type ErrBranchNotExist struct { - Name string -} - -func IsErrBranchNotExist(err error) bool { - _, ok := err.(ErrBranchNotExist) - return ok -} - -func (err ErrBranchNotExist) Error() string { - return fmt.Sprintf("branch does not exist [name: %s]", err.Name) -} - -// __ __ ___. .__ __ -// / \ / \ ____\_ |__ | |__ ____ ____ | | __ -// \ \/\/ // __ \| __ \| | \ / _ \ / _ \| |/ / -// \ /\ ___/| \_\ \ Y ( <_> | <_> ) < -// \__/\ / \___ >___ /___| /\____/ \____/|__|_ \ -// \/ \/ \/ \/ \/ - -type ErrWebhookNotExist struct { - ID int64 -} - -func IsErrWebhookNotExist(err error) bool { - _, ok := err.(ErrWebhookNotExist) - return ok -} - -func (err ErrWebhookNotExist) Error() string { - return fmt.Sprintf("webhook does not exist [id: %d]", err.ID) -} - -// .___ -// | | ______ ________ __ ____ -// | |/ ___// ___/ | \_/ __ \ -// | |\___ \ \___ \| | /\ ___/ -// |___/____ >____ >____/ \___ > -// \/ \/ \/ - -type ErrIssueNotExist struct { - ID int64 - RepoID int64 - Index int64 -} - -func IsErrIssueNotExist(err error) bool { - _, ok := err.(ErrIssueNotExist) - return ok -} - -func (err ErrIssueNotExist) Error() string { - return fmt.Sprintf("issue does not exist [id: %d, repo_id: %d, index: %d]", err.ID, err.RepoID, err.Index) -} - -// __________ .__ .__ __________ __ -// \______ \__ __| | | |\______ \ ____ ________ __ ____ _______/ |_ -// | ___/ | \ | | | | _// __ \/ ____/ | \_/ __ \ / ___/\ __\ -// | | | | / |_| |_| | \ ___< <_| | | /\ ___/ \___ \ | | -// |____| |____/|____/____/____|_ /\___ >__ |____/ \___ >____ > |__| -// \/ \/ |__| \/ \/ - -type ErrPullRequestNotExist struct { - ID int64 - IssueID int64 - HeadRepoID int64 - BaseRepoID int64 - HeadBarcnh string - BaseBranch string -} - -func IsErrPullRequestNotExist(err error) bool { - _, ok := err.(ErrPullRequestNotExist) - return ok -} - -func (err ErrPullRequestNotExist) Error() string { - return fmt.Sprintf("pull request does not exist [id: %d, issue_id: %d, head_repo_id: %d, base_repo_id: %d, head_branch: %s, base_branch: %s]", - err.ID, err.IssueID, err.HeadRepoID, err.BaseRepoID, err.HeadBarcnh, err.BaseBranch) -} - -// _________ __ -// \_ ___ \ ____ _____ _____ ____ _____/ |_ -// / \ \/ / _ \ / \ / \_/ __ \ / \ __\ -// \ \___( <_> ) Y Y \ Y Y \ ___/| | \ | -// \______ /\____/|__|_| /__|_| /\___ >___| /__| -// \/ \/ \/ \/ \/ - -type ErrCommentNotExist struct { - ID int64 - IssueID int64 -} - -func IsErrCommentNotExist(err error) bool { - _, ok := err.(ErrCommentNotExist) - return ok -} - -func (err ErrCommentNotExist) Error() string { - return fmt.Sprintf("comment does not exist [id: %d, issue_id: %d]", err.ID, err.IssueID) -} - -// .____ ___. .__ -// | | _____ \_ |__ ____ | | -// | | \__ \ | __ \_/ __ \| | -// | |___ / __ \| \_\ \ ___/| |__ -// |_______ (____ /___ /\___ >____/ -// \/ \/ \/ \/ - -type ErrLabelNotExist struct { - LabelID int64 - RepoID int64 -} - -func IsErrLabelNotExist(err error) bool { - _, ok := err.(ErrLabelNotExist) - return ok -} - -func (err ErrLabelNotExist) Error() string { - return fmt.Sprintf("label does not exist [label_id: %d, repo_id: %d]", err.LabelID, err.RepoID) -} - -// _____ .__.__ __ -// / \ |__| | ____ _______/ |_ ____ ____ ____ -// / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \ -// / Y \ | |_\ ___/ \___ \ | | ( <_> ) | \ ___/ -// \____|__ /__|____/\___ >____ > |__| \____/|___| /\___ > -// \/ \/ \/ \/ \/ - -type ErrMilestoneNotExist struct { - ID int64 - RepoID int64 -} - -func IsErrMilestoneNotExist(err error) bool { - _, ok := err.(ErrMilestoneNotExist) - return ok -} - -func (err ErrMilestoneNotExist) Error() string { - return fmt.Sprintf("milestone does not exist [id: %d, repo_id: %d]", err.ID, err.RepoID) -} - -// _____ __ __ .__ __ -// / _ \_/ |__/ |______ ____ | |__ _____ ____ _____/ |_ -// / /_\ \ __\ __\__ \ _/ ___\| | \ / \_/ __ \ / \ __\ -// / | \ | | | / __ \\ \___| Y \ Y Y \ ___/| | \ | -// \____|__ /__| |__| (____ /\___ >___| /__|_| /\___ >___| /__| -// \/ \/ \/ \/ \/ \/ \/ - -type ErrAttachmentNotExist struct { - ID int64 - UUID string -} - -func IsErrAttachmentNotExist(err error) bool { - _, ok := err.(ErrAttachmentNotExist) - return ok -} - -func (err ErrAttachmentNotExist) Error() string { - return fmt.Sprintf("attachment does not exist [id: %d, uuid: %s]", err.ID, err.UUID) -} - -// .____ .__ _________ -// | | ____ ____ |__| ____ / _____/ ____ __ _________ ____ ____ -// | | / _ \ / ___\| |/ \ \_____ \ / _ \| | \_ __ \_/ ___\/ __ \ -// | |__( <_> ) /_/ > | | \ / ( <_> ) | /| | \/\ \__\ ___/ -// |_______ \____/\___ /|__|___| / /_______ /\____/|____/ |__| \___ >___ > -// \/ /_____/ \/ \/ \/ \/ - -type ErrLoginSourceNotExist struct { - ID int64 -} - -func IsErrLoginSourceNotExist(err error) bool { - _, ok := err.(ErrLoginSourceNotExist) - return ok -} - -func (err ErrLoginSourceNotExist) Error() string { - return fmt.Sprintf("login source does not exist [id: %d]", err.ID) -} - -type ErrLoginSourceAlreadyExist struct { - Name string -} - -func IsErrLoginSourceAlreadyExist(err error) bool { - _, ok := err.(ErrLoginSourceAlreadyExist) - return ok -} - -func (err ErrLoginSourceAlreadyExist) Error() string { - return fmt.Sprintf("login source already exists [name: %s]", err.Name) -} - -type ErrLoginSourceInUse struct { - ID int64 -} - -func IsErrLoginSourceInUse(err error) bool { - _, ok := err.(ErrLoginSourceInUse) - return ok -} - -func (err ErrLoginSourceInUse) Error() string { - return fmt.Sprintf("login source is still used by some users [id: %d]", err.ID) -} - -// ___________ -// \__ ___/___ _____ _____ -// | |_/ __ \\__ \ / \ -// | |\ ___/ / __ \| Y Y \ -// |____| \___ >____ /__|_| / -// \/ \/ \/ - -type ErrTeamAlreadyExist struct { - OrgID int64 - Name string -} - -func IsErrTeamAlreadyExist(err error) bool { - _, ok := err.(ErrTeamAlreadyExist) - return ok -} - -func (err ErrTeamAlreadyExist) Error() string { - return fmt.Sprintf("team already exists [org_id: %d, name: %s]", err.OrgID, err.Name) -} - -// ____ ___ .__ .___ -// | | \______ | | _________ __| _/ -// | | /\____ \| | / _ \__ \ / __ | -// | | / | |_> > |_( <_> ) __ \_/ /_/ | -// |______/ | __/|____/\____(____ /\____ | -// |__| \/ \/ -// - -type ErrUploadNotExist struct { - ID int64 - UUID string -} - -func IsErrUploadNotExist(err error) bool { - _, ok := err.(ErrAttachmentNotExist) - return ok -} - -func (err ErrUploadNotExist) Error() string { - return fmt.Sprintf("attachment does not exist [id: %d, uuid: %s]", err.ID, err.UUID) -} diff --git a/models/git_diff.go b/models/git_diff.go deleted file mode 100644 index 107f630ff9c..00000000000 --- a/models/git_diff.go +++ /dev/null @@ -1,516 +0,0 @@ -// Copyright 2014 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 models - -import ( - "bufio" - "bytes" - "fmt" - "html" - "html/template" - "io" - "io/ioutil" - "os" - "os/exec" - "strings" - - "github.com/Unknwon/com" - "github.com/sergi/go-diff/diffmatchpatch" - "golang.org/x/net/html/charset" - "golang.org/x/text/transform" - - "github.com/gogits/git-module" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/process" - "github.com/gogits/gogs/modules/setting" - "github.com/gogits/gogs/modules/template/highlight" -) - -type DiffLineType uint8 - -const ( - DIFF_LINE_PLAIN DiffLineType = iota + 1 - DIFF_LINE_ADD - DIFF_LINE_DEL - DIFF_LINE_SECTION -) - -type DiffFileType uint8 - -const ( - DIFF_FILE_ADD DiffFileType = iota + 1 - DIFF_FILE_CHANGE - DIFF_FILE_DEL - DIFF_FILE_RENAME -) - -type DiffLine struct { - LeftIdx int - RightIdx int - Type DiffLineType - Content string -} - -func (d *DiffLine) GetType() int { - return int(d.Type) -} - -type DiffSection struct { - Name string - Lines []*DiffLine -} - -var ( - addedCodePrefix = []byte("") - removedCodePrefix = []byte("") - codeTagSuffix = []byte("") -) - -func diffToHTML(diffs []diffmatchpatch.Diff, lineType DiffLineType) template.HTML { - buf := bytes.NewBuffer(nil) - - // Reproduce signs which are cutted for inline diff before. - switch lineType { - case DIFF_LINE_ADD: - buf.WriteByte('+') - case DIFF_LINE_DEL: - buf.WriteByte('-') - } - - for i := range diffs { - switch { - case diffs[i].Type == diffmatchpatch.DiffInsert && lineType == DIFF_LINE_ADD: - buf.Write(addedCodePrefix) - buf.WriteString(html.EscapeString(diffs[i].Text)) - buf.Write(codeTagSuffix) - case diffs[i].Type == diffmatchpatch.DiffDelete && lineType == DIFF_LINE_DEL: - buf.Write(removedCodePrefix) - buf.WriteString(html.EscapeString(diffs[i].Text)) - buf.Write(codeTagSuffix) - case diffs[i].Type == diffmatchpatch.DiffEqual: - buf.WriteString(html.EscapeString(diffs[i].Text)) - } - } - - return template.HTML(buf.Bytes()) -} - -// get an specific line by type (add or del) and file line number -func (diffSection *DiffSection) GetLine(lineType DiffLineType, idx int) *DiffLine { - var ( - difference = 0 - addCount = 0 - delCount = 0 - matchDiffLine *DiffLine - ) - -LOOP: - for _, diffLine := range diffSection.Lines { - switch diffLine.Type { - case DIFF_LINE_ADD: - addCount++ - case DIFF_LINE_DEL: - delCount++ - default: - if matchDiffLine != nil { - break LOOP - } - difference = diffLine.RightIdx - diffLine.LeftIdx - addCount = 0 - delCount = 0 - } - - switch lineType { - case DIFF_LINE_DEL: - if diffLine.RightIdx == 0 && diffLine.LeftIdx == idx-difference { - matchDiffLine = diffLine - } - case DIFF_LINE_ADD: - if diffLine.LeftIdx == 0 && diffLine.RightIdx == idx+difference { - matchDiffLine = diffLine - } - } - } - - if addCount == delCount { - return matchDiffLine - } - return nil -} - -var diffMatchPatch = diffmatchpatch.New() - -func init() { - diffMatchPatch.DiffEditCost = 100 -} - -// computes inline diff for the given line -func (diffSection *DiffSection) GetComputedInlineDiffFor(diffLine *DiffLine) template.HTML { - if setting.Git.DisableDiffHighlight { - return template.HTML(html.EscapeString(diffLine.Content[1:])) - } - var ( - compareDiffLine *DiffLine - diff1 string - diff2 string - ) - - // try to find equivalent diff line. ignore, otherwise - switch diffLine.Type { - case DIFF_LINE_ADD: - compareDiffLine = diffSection.GetLine(DIFF_LINE_DEL, diffLine.RightIdx) - if compareDiffLine == nil { - return template.HTML(html.EscapeString(diffLine.Content)) - } - diff1 = compareDiffLine.Content - diff2 = diffLine.Content - case DIFF_LINE_DEL: - compareDiffLine = diffSection.GetLine(DIFF_LINE_ADD, diffLine.LeftIdx) - if compareDiffLine == nil { - return template.HTML(html.EscapeString(diffLine.Content)) - } - diff1 = diffLine.Content - diff2 = compareDiffLine.Content - default: - return template.HTML(html.EscapeString(diffLine.Content)) - } - - diffRecord := diffMatchPatch.DiffMain(diff1[1:], diff2[1:], true) - diffRecord = diffMatchPatch.DiffCleanupEfficiency(diffRecord) - - return diffToHTML(diffRecord, diffLine.Type) -} - -type DiffFile struct { - Name string - OldName string - Index int - Addition, Deletion int - Type DiffFileType - IsCreated bool - IsDeleted bool - IsBin bool - IsRenamed bool - IsSubmodule bool - Sections []*DiffSection - IsIncomplete bool -} - -func (diffFile *DiffFile) GetType() int { - return int(diffFile.Type) -} - -func (diffFile *DiffFile) GetHighlightClass() string { - return highlight.FileNameToHighlightClass(diffFile.Name) -} - -type Diff struct { - TotalAddition, TotalDeletion int - Files []*DiffFile - IsIncomplete bool -} - -func (diff *Diff) NumFiles() int { - return len(diff.Files) -} - -const DIFF_HEAD = "diff --git " - -// TODO: move this function to gogits/git-module -func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (*Diff, error) { - var ( - diff = &Diff{Files: make([]*DiffFile, 0)} - - curFile *DiffFile - curSection = &DiffSection{ - Lines: make([]*DiffLine, 0, 10), - } - - leftLine, rightLine int - lineCount int - curFileLinesCount int - ) - - input := bufio.NewReader(reader) - isEOF := false - for !isEOF { - line, err := input.ReadString('\n') - if err != nil { - if err == io.EOF { - isEOF = true - } else { - return nil, fmt.Errorf("ReadString: %v", err) - } - } - - if len(line) > 0 && line[len(line)-1] == '\n' { - // Remove line break. - line = line[:len(line)-1] - } - - if strings.HasPrefix(line, "+++ ") || strings.HasPrefix(line, "--- ") || len(line) == 0 { - continue - } - - curFileLinesCount++ - lineCount++ - - // Diff data too large, we only show the first about maxlines lines - if curFileLinesCount >= maxLines || len(line) >= maxLineCharacteres { - curFile.IsIncomplete = true - } - - switch { - case line[0] == ' ': - diffLine := &DiffLine{Type: DIFF_LINE_PLAIN, Content: line, LeftIdx: leftLine, RightIdx: rightLine} - leftLine++ - rightLine++ - curSection.Lines = append(curSection.Lines, diffLine) - continue - case line[0] == '@': - curSection = &DiffSection{} - curFile.Sections = append(curFile.Sections, curSection) - ss := strings.Split(line, "@@") - diffLine := &DiffLine{Type: DIFF_LINE_SECTION, Content: line} - curSection.Lines = append(curSection.Lines, diffLine) - - // Parse line number. - ranges := strings.Split(ss[1][1:], " ") - leftLine, _ = com.StrTo(strings.Split(ranges[0], ",")[0][1:]).Int() - if len(ranges) > 1 { - rightLine, _ = com.StrTo(strings.Split(ranges[1], ",")[0]).Int() - } else { - log.Warn("Parse line number failed: %v", line) - rightLine = leftLine - } - continue - case line[0] == '+': - curFile.Addition++ - diff.TotalAddition++ - diffLine := &DiffLine{Type: DIFF_LINE_ADD, Content: line, RightIdx: rightLine} - rightLine++ - curSection.Lines = append(curSection.Lines, diffLine) - continue - case line[0] == '-': - curFile.Deletion++ - diff.TotalDeletion++ - diffLine := &DiffLine{Type: DIFF_LINE_DEL, Content: line, LeftIdx: leftLine} - if leftLine > 0 { - leftLine++ - } - curSection.Lines = append(curSection.Lines, diffLine) - case strings.HasPrefix(line, "Binary"): - curFile.IsBin = true - continue - } - - // Get new file. - if strings.HasPrefix(line, DIFF_HEAD) { - middle := -1 - - // Note: In case file name is surrounded by double quotes (it happens only in git-shell). - // e.g. diff --git "a/xxx" "b/xxx" - hasQuote := line[len(DIFF_HEAD)] == '"' - if hasQuote { - middle = strings.Index(line, ` "b/`) - } else { - middle = strings.Index(line, " b/") - } - - beg := len(DIFF_HEAD) - a := line[beg+2 : middle] - b := line[middle+3:] - if hasQuote { - a = string(git.UnescapeChars([]byte(a[1 : len(a)-1]))) - b = string(git.UnescapeChars([]byte(b[1 : len(b)-1]))) - } - - curFile = &DiffFile{ - Name: a, - Index: len(diff.Files) + 1, - Type: DIFF_FILE_CHANGE, - Sections: make([]*DiffSection, 0, 10), - } - diff.Files = append(diff.Files, curFile) - if len(diff.Files) >= maxFiles { - diff.IsIncomplete = true - io.Copy(ioutil.Discard, reader) - break - } - curFileLinesCount = 0 - - // Check file diff type and is submodule. - for { - line, err := input.ReadString('\n') - if err != nil { - if err == io.EOF { - isEOF = true - } else { - return nil, fmt.Errorf("ReadString: %v", err) - } - } - - switch { - case strings.HasPrefix(line, "new file"): - curFile.Type = DIFF_FILE_ADD - curFile.IsCreated = true - case strings.HasPrefix(line, "deleted"): - curFile.Type = DIFF_FILE_DEL - curFile.IsDeleted = true - case strings.HasPrefix(line, "index"): - curFile.Type = DIFF_FILE_CHANGE - case strings.HasPrefix(line, "similarity index 100%"): - curFile.Type = DIFF_FILE_RENAME - curFile.IsRenamed = true - curFile.OldName = curFile.Name - curFile.Name = b - } - if curFile.Type > 0 { - if strings.HasSuffix(line, " 160000\n") { - curFile.IsSubmodule = true - } - break - } - } - } - } - - // FIXME: detect encoding while parsing. - var buf bytes.Buffer - for _, f := range diff.Files { - buf.Reset() - for _, sec := range f.Sections { - for _, l := range sec.Lines { - buf.WriteString(l.Content) - buf.WriteString("\n") - } - } - charsetLabel, err := base.DetectEncoding(buf.Bytes()) - if charsetLabel != "UTF-8" && err == nil { - encoding, _ := charset.Lookup(charsetLabel) - if encoding != nil { - d := encoding.NewDecoder() - for _, sec := range f.Sections { - for _, l := range sec.Lines { - if c, _, err := transform.String(d, l.Content); err == nil { - l.Content = c - } - } - } - } - } - } - return diff, nil -} - -func GetDiffRange(repoPath, beforeCommitID, afterCommitID string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) { - gitRepo, err := git.OpenRepository(repoPath) - if err != nil { - return nil, err - } - - commit, err := gitRepo.GetCommit(afterCommitID) - if err != nil { - return nil, err - } - - var cmd *exec.Cmd - // if "after" commit given - if len(beforeCommitID) == 0 { - // First commit of repository. - if commit.ParentCount() == 0 { - cmd = exec.Command("git", "show", afterCommitID) - } else { - c, _ := commit.Parent(0) - cmd = exec.Command("git", "diff", "-M", c.ID.String(), afterCommitID) - } - } else { - cmd = exec.Command("git", "diff", "-M", beforeCommitID, afterCommitID) - } - cmd.Dir = repoPath - cmd.Stderr = os.Stderr - - stdout, err := cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("StdoutPipe: %v", err) - } - - if err = cmd.Start(); err != nil { - return nil, fmt.Errorf("Start: %v", err) - } - - pid := process.Add(fmt.Sprintf("GetDiffRange [repo_path: %s]", repoPath), cmd) - defer process.Remove(pid) - - diff, err := ParsePatch(maxLines, maxLineCharacteres, maxFiles, stdout) - if err != nil { - return nil, fmt.Errorf("ParsePatch: %v", err) - } - - if err = cmd.Wait(); err != nil { - return nil, fmt.Errorf("Wait: %v", err) - } - - return diff, nil -} - -type RawDiffType string - -const ( - RAW_DIFF_NORMAL RawDiffType = "diff" - RAW_DIFF_PATCH RawDiffType = "patch" -) - -// GetRawDiff dumps diff results of repository in given commit ID to io.Writer. -// TODO: move this function to gogits/git-module -func GetRawDiff(repoPath, commitID string, diffType RawDiffType, writer io.Writer) error { - repo, err := git.OpenRepository(repoPath) - if err != nil { - return fmt.Errorf("OpenRepository: %v", err) - } - - commit, err := repo.GetCommit(commitID) - if err != nil { - return fmt.Errorf("GetCommit: %v", err) - } - - var cmd *exec.Cmd - switch diffType { - case RAW_DIFF_NORMAL: - if commit.ParentCount() == 0 { - cmd = exec.Command("git", "show", commitID) - } else { - c, _ := commit.Parent(0) - cmd = exec.Command("git", "diff", "-M", c.ID.String(), commitID) - } - case RAW_DIFF_PATCH: - if commit.ParentCount() == 0 { - cmd = exec.Command("git", "format-patch", "--no-signature", "--stdout", "--root", commitID) - } else { - c, _ := commit.Parent(0) - query := fmt.Sprintf("%s...%s", commitID, c.ID.String()) - cmd = exec.Command("git", "format-patch", "--no-signature", "--stdout", query) - } - default: - return fmt.Errorf("invalid diffType: %s", diffType) - } - - stderr := new(bytes.Buffer) - - cmd.Dir = repoPath - cmd.Stdout = writer - cmd.Stderr = stderr - - if err = cmd.Run(); err != nil { - return fmt.Errorf("Run: %v - %s", err, stderr) - } - return nil -} - -func GetDiffCommit(repoPath, commitID string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) { - return GetDiffRange(repoPath, "", commitID, maxLines, maxLineCharacteres, maxFiles) -} diff --git a/models/git_diff_test.go b/models/git_diff_test.go deleted file mode 100644 index 7f390adb3fe..00000000000 --- a/models/git_diff_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package models - -import ( - dmp "github.com/sergi/go-diff/diffmatchpatch" - "html/template" - "testing" -) - -func assertEqual(t *testing.T, s1 string, s2 template.HTML) { - if s1 != string(s2) { - t.Errorf("%s should be equal %s", s2, s1) - } -} - -func assertLineEqual(t *testing.T, d1 *DiffLine, d2 *DiffLine) { - if d1 != d2 { - t.Errorf("%v should be equal %v", d1, d2) - } -} - -func TestDiffToHTML(t *testing.T) { - assertEqual(t, "+foo bar biz", diffToHTML([]dmp.Diff{ - dmp.Diff{dmp.DiffEqual, "foo "}, - dmp.Diff{dmp.DiffInsert, "bar"}, - dmp.Diff{dmp.DiffDelete, " baz"}, - dmp.Diff{dmp.DiffEqual, " biz"}, - }, DIFF_LINE_ADD)) - - assertEqual(t, "-foo bar biz", diffToHTML([]dmp.Diff{ - dmp.Diff{dmp.DiffEqual, "foo "}, - dmp.Diff{dmp.DiffDelete, "bar"}, - dmp.Diff{dmp.DiffInsert, " baz"}, - dmp.Diff{dmp.DiffEqual, " biz"}, - }, DIFF_LINE_DEL)) -} diff --git a/models/issue.go b/models/issue.go deleted file mode 100644 index 208204b0767..00000000000 --- a/models/issue.go +++ /dev/null @@ -1,1797 +0,0 @@ -// Copyright 2014 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 models - -import ( - "errors" - "fmt" - "io" - "mime/multipart" - "os" - "path" - "strings" - "time" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - api "github.com/gogits/go-gogs-client" - gouuid "github.com/satori/go.uuid" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -var ( - ErrMissingIssueNumber = errors.New("No issue number specified") -) - -// Issue represents an issue or pull request of repository. -type Issue struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 `xorm:"INDEX UNIQUE(repo_index)"` - Repo *Repository `xorm:"-"` - Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository. - PosterID int64 - Poster *User `xorm:"-"` - Title string `xorm:"name"` - Content string `xorm:"TEXT"` - RenderedContent string `xorm:"-"` - Labels []*Label `xorm:"-"` - MilestoneID int64 - Milestone *Milestone `xorm:"-"` - Priority int - AssigneeID int64 - Assignee *User `xorm:"-"` - IsClosed bool - IsRead bool `xorm:"-"` - IsPull bool // Indicates whether is a pull request or not. - PullRequest *PullRequest `xorm:"-"` - NumComments int - - Deadline time.Time `xorm:"-"` - DeadlineUnix int64 - Created time.Time `xorm:"-"` - CreatedUnix int64 - Updated time.Time `xorm:"-"` - UpdatedUnix int64 - - Attachments []*Attachment `xorm:"-"` - Comments []*Comment `xorm:"-"` -} - -func (issue *Issue) BeforeInsert() { - issue.CreatedUnix = time.Now().Unix() - issue.UpdatedUnix = issue.CreatedUnix -} - -func (issue *Issue) BeforeUpdate() { - issue.UpdatedUnix = time.Now().Unix() - issue.DeadlineUnix = issue.Deadline.Unix() -} - -func (issue *Issue) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "deadline_unix": - issue.Deadline = time.Unix(issue.DeadlineUnix, 0).Local() - case "created_unix": - issue.Created = time.Unix(issue.CreatedUnix, 0).Local() - case "updated_unix": - issue.Updated = time.Unix(issue.UpdatedUnix, 0).Local() - } -} - -func (issue *Issue) loadAttributes(e Engine) (err error) { - if issue.Repo == nil { - issue.Repo, err = getRepositoryByID(e, issue.RepoID) - if err != nil { - return fmt.Errorf("getRepositoryByID [%d]: %v", issue.RepoID, err) - } - } - - if issue.Poster == nil { - issue.Poster, err = getUserByID(e, issue.PosterID) - if err != nil { - if IsErrUserNotExist(err) { - issue.PosterID = -1 - issue.Poster = NewGhostUser() - } else { - return fmt.Errorf("getUserByID.(poster) [%d]: %v", issue.PosterID, err) - } - return - } - } - - if issue.Labels == nil { - issue.Labels, err = getLabelsByIssueID(e, issue.ID) - if err != nil { - return fmt.Errorf("getLabelsByIssueID [%d]: %v", issue.ID, err) - } - } - - if issue.Milestone == nil && issue.MilestoneID > 0 { - issue.Milestone, err = getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) - if err != nil { - 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 issue.IsPull && issue.PullRequest == nil { - // 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) - } - } - - if issue.Attachments == nil { - issue.Attachments, err = getAttachmentsByIssueID(e, issue.ID) - if err != nil { - return fmt.Errorf("getAttachmentsByIssueID [%d]: %v", issue.ID, err) - } - } - - if issue.Comments == nil { - issue.Comments, err = getCommentsByIssueID(e, issue.ID) - if err != nil { - return fmt.Errorf("getCommentsByIssueID [%d]: %v", issue.ID, err) - } - } - - return nil -} - -func (issue *Issue) LoadAttributes() error { - return issue.loadAttributes(x) -} - -func (issue *Issue) HTMLURL() string { - var path string - if issue.IsPull { - path = "pulls" - } else { - path = "issues" - } - return fmt.Sprintf("%s/%s/%d", issue.Repo.HTMLURL(), path, issue.Index) -} - -// State returns string representation of issue status. -func (i *Issue) State() api.StateType { - if i.IsClosed { - return api.STATE_CLOSED - } - return api.STATE_OPEN -} - -// This method assumes some fields assigned with values: -// Required - Poster, Labels, -// Optional - Milestone, Assignee, PullRequest -func (issue *Issue) APIFormat() *api.Issue { - apiLabels := make([]*api.Label, len(issue.Labels)) - for i := range issue.Labels { - apiLabels[i] = issue.Labels[i].APIFormat() - } - - apiIssue := &api.Issue{ - ID: issue.ID, - Index: issue.Index, - Poster: issue.Poster.APIFormat(), - Title: issue.Title, - Body: issue.Content, - Labels: apiLabels, - State: issue.State(), - Comments: issue.NumComments, - Created: issue.Created, - Updated: issue.Updated, - } - - if issue.Milestone != nil { - apiIssue.Milestone = issue.Milestone.APIFormat() - } - if issue.Assignee != nil { - apiIssue.Assignee = issue.Assignee.APIFormat() - } - if issue.IsPull { - apiIssue.PullRequest = &api.PullRequestMeta{ - HasMerged: issue.PullRequest.HasMerged, - } - if issue.PullRequest.HasMerged { - apiIssue.PullRequest.Merged = &issue.PullRequest.Merged - } - } - - return apiIssue -} - -// HashTag returns unique hash tag for issue. -func (i *Issue) HashTag() string { - return "issue-" + com.ToStr(i.ID) -} - -// IsPoster returns true if given user by ID is the poster. -func (i *Issue) IsPoster(uid int64) bool { - return i.PosterID == uid -} - -func (i *Issue) hasLabel(e Engine, labelID int64) bool { - return hasIssueLabel(e, i.ID, labelID) -} - -// HasLabel returns true if issue has been labeled by given ID. -func (i *Issue) HasLabel(labelID int64) bool { - return i.hasLabel(x, labelID) -} - -func (issue *Issue) sendLabelUpdatedWebhook(doer *User) { - var err error - if issue.IsPull { - err = issue.PullRequest.LoadIssue() - if err != nil { - log.Error(4, "LoadIssue: %v", err) - return - } - err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ - Action: api.HOOK_ISSUE_LABEL_UPDATED, - Index: issue.Index, - PullRequest: issue.PullRequest.APIFormat(), - Repository: issue.Repo.APIFormat(nil), - Sender: doer.APIFormat(), - }) - } - if err != nil { - log.Error(4, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) - } else { - go HookQueue.Add(issue.RepoID) - } -} - -func (i *Issue) addLabel(e *xorm.Session, label *Label) error { - return newIssueLabel(e, i, label) -} - -// AddLabel adds a new label to the issue. -func (issue *Issue) AddLabel(doer *User, label *Label) error { - if err := NewIssueLabel(issue, label); err != nil { - return err - } - - issue.sendLabelUpdatedWebhook(doer) - return nil -} - -func (issue *Issue) addLabels(e *xorm.Session, labels []*Label) error { - return newIssueLabels(e, issue, labels) -} - -// AddLabels adds a list of new labels to the issue. -func (issue *Issue) AddLabels(doer *User, labels []*Label) error { - if err := NewIssueLabels(issue, labels); err != nil { - return err - } - - issue.sendLabelUpdatedWebhook(doer) - return nil -} - -func (issue *Issue) getLabels(e Engine) (err error) { - if len(issue.Labels) > 0 { - return nil - } - - issue.Labels, err = getLabelsByIssueID(e, issue.ID) - if err != nil { - return fmt.Errorf("getLabelsByIssueID: %v", err) - } - return nil -} - -func (issue *Issue) removeLabel(e *xorm.Session, label *Label) error { - return deleteIssueLabel(e, issue, label) -} - -// RemoveLabel removes a label from issue by given ID. -func (issue *Issue) RemoveLabel(doer *User, label *Label) error { - if err := DeleteIssueLabel(issue, label); err != nil { - return err - } - - issue.sendLabelUpdatedWebhook(doer) - return nil -} - -func (issue *Issue) clearLabels(e *xorm.Session) (err error) { - if err = issue.getLabels(e); err != nil { - return fmt.Errorf("getLabels: %v", err) - } - - for i := range issue.Labels { - if err = issue.removeLabel(e, issue.Labels[i]); err != nil { - return fmt.Errorf("removeLabel: %v", err) - } - } - - return nil -} - -func (issue *Issue) ClearLabels(doer *User) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = issue.clearLabels(sess); err != nil { - return err - } - - if err = sess.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) - } - - if issue.IsPull { - err = issue.PullRequest.LoadIssue() - if err != nil { - log.Error(4, "LoadIssue: %v", err) - return - } - err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ - Action: api.HOOK_ISSUE_LABEL_CLEARED, - Index: issue.Index, - PullRequest: issue.PullRequest.APIFormat(), - Repository: issue.Repo.APIFormat(nil), - Sender: doer.APIFormat(), - }) - } - if err != nil { - log.Error(4, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) - } else { - go HookQueue.Add(issue.RepoID) - } - - return nil -} - -// ReplaceLabels removes all current labels and add new labels to the issue. -func (issue *Issue) ReplaceLabels(labels []*Label) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = issue.clearLabels(sess); err != nil { - return fmt.Errorf("clearLabels: %v", err) - } else if err = issue.addLabels(sess, labels); err != nil { - return fmt.Errorf("addLabels: %v", err) - } - - return sess.Commit() -} - -func (i *Issue) GetAssignee() (err error) { - if i.AssigneeID == 0 || i.Assignee != nil { - return nil - } - - i.Assignee, err = GetUserByID(i.AssigneeID) - if IsErrUserNotExist(err) { - return nil - } - return err -} - -// ReadBy sets issue to be read by given user. -func (i *Issue) ReadBy(uid int64) error { - return UpdateIssueUserByRead(uid, i.ID) -} - -func updateIssueCols(e Engine, issue *Issue, cols ...string) error { - _, err := e.Id(issue.ID).Cols(cols...).Update(issue) - return err -} - -// UpdateIssueCols only updates values of specific columns for given issue. -func UpdateIssueCols(issue *Issue, cols ...string) error { - return updateIssueCols(x, issue, cols...) -} - -func (i *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository, isClosed bool) (err error) { - // Nothing should be performed if current status is same as target status - if i.IsClosed == isClosed { - return nil - } - i.IsClosed = isClosed - - if err = updateIssueCols(e, i, "is_closed"); err != nil { - return err - } else if err = updateIssueUsersByStatus(e, i.ID, isClosed); err != nil { - return err - } - - // Update issue count of labels - if err = i.getLabels(e); err != nil { - return err - } - for idx := range i.Labels { - if i.IsClosed { - i.Labels[idx].NumClosedIssues++ - } else { - i.Labels[idx].NumClosedIssues-- - } - if err = updateLabel(e, i.Labels[idx]); err != nil { - return err - } - } - - // Update issue count of milestone - if err = changeMilestoneIssueStats(e, i); err != nil { - return err - } - - // New action comment - if _, err = createStatusComment(e, doer, repo, i); err != nil { - return err - } - - return nil -} - -// 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) - if err = sess.Begin(); err != nil { - return err - } - - if err = issue.changeStatus(sess, doer, repo, isClosed); err != nil { - return err - } - - if err = sess.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) - } - - if issue.IsPull { - // Merge pull request calls issue.changeStatus so we need to handle separately. - issue.PullRequest.Issue = issue - apiPullRequest := &api.PullRequestPayload{ - Index: issue.Index, - PullRequest: issue.PullRequest.APIFormat(), - Repository: repo.APIFormat(nil), - Sender: doer.APIFormat(), - } - if isClosed { - apiPullRequest.Action = api.HOOK_ISSUE_CLOSED - } else { - apiPullRequest.Action = api.HOOK_ISSUE_REOPENED - } - err = PrepareWebhooks(repo, HOOK_EVENT_PULL_REQUEST, apiPullRequest) - } - if err != nil { - log.Error(4, "PrepareWebhooks [is_pull: %v, is_closed: %v]: %v", issue.IsPull, isClosed, err) - } else { - go HookQueue.Add(repo.ID) - } - - return nil -} - -func (issue *Issue) ChangeTitle(doer *User, title string) (err error) { - oldTitle := issue.Title - issue.Title = title - if err = UpdateIssueCols(issue, "name"); err != nil { - return fmt.Errorf("UpdateIssueCols: %v", err) - } - - if issue.IsPull { - issue.PullRequest.Issue = issue - err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ - Action: api.HOOK_ISSUE_EDITED, - Index: issue.Index, - Changes: &api.ChangesPayload{ - Title: &api.ChangesFromPayload{ - From: oldTitle, - }, - }, - PullRequest: issue.PullRequest.APIFormat(), - Repository: issue.Repo.APIFormat(nil), - Sender: doer.APIFormat(), - }) - } - if err != nil { - log.Error(4, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) - } else { - go HookQueue.Add(issue.RepoID) - } - - return nil -} - -func (issue *Issue) ChangeContent(doer *User, content string) (err error) { - oldContent := issue.Content - issue.Content = content - if err = UpdateIssueCols(issue, "content"); err != nil { - return fmt.Errorf("UpdateIssueCols: %v", err) - } - - if issue.IsPull { - issue.PullRequest.Issue = issue - err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ - Action: api.HOOK_ISSUE_EDITED, - Index: issue.Index, - Changes: &api.ChangesPayload{ - Body: &api.ChangesFromPayload{ - From: oldContent, - }, - }, - PullRequest: issue.PullRequest.APIFormat(), - Repository: issue.Repo.APIFormat(nil), - Sender: doer.APIFormat(), - }) - } - if err != nil { - log.Error(4, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) - } else { - go HookQueue.Add(issue.RepoID) - } - - return nil -} - -func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) { - issue.AssigneeID = assigneeID - if err = UpdateIssueUserByAssignee(issue); err != nil { - return fmt.Errorf("UpdateIssueUserByAssignee: %v", err) - } - - issue.Assignee, err = GetUserByID(issue.AssigneeID) - if err != nil && !IsErrUserNotExist(err) { - log.Error(4, "GetUserByID [assignee_id: %v]: %v", issue.AssigneeID, err) - return nil - } - - // Error not nil here means user does not exist, which is remove assignee. - isRemoveAssignee := err != nil - if issue.IsPull { - issue.PullRequest.Issue = issue - apiPullRequest := &api.PullRequestPayload{ - Index: issue.Index, - PullRequest: issue.PullRequest.APIFormat(), - Repository: issue.Repo.APIFormat(nil), - Sender: doer.APIFormat(), - } - if isRemoveAssignee { - apiPullRequest.Action = api.HOOK_ISSUE_UNASSIGNED - } else { - apiPullRequest.Action = api.HOOK_ISSUE_ASSIGNED - } - err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, apiPullRequest) - } - if err != nil { - log.Error(4, "PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, isRemoveAssignee, err) - } else { - go HookQueue.Add(issue.RepoID) - } - - return nil -} - -type NewIssueOptions struct { - Repo *Repository - Issue *Issue - LableIDs []int64 - Attachments []string // In UUID format. - IsPull bool -} - -func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) { - opts.Issue.Title = strings.TrimSpace(opts.Issue.Title) - opts.Issue.Index = opts.Repo.NextIssueIndex() - - if opts.Issue.MilestoneID > 0 { - milestone, err := getMilestoneByRepoID(e, opts.Issue.RepoID, opts.Issue.MilestoneID) - if err != nil && !IsErrMilestoneNotExist(err) { - return fmt.Errorf("getMilestoneByID: %v", err) - } - - // Assume milestone is invalid and drop silently. - opts.Issue.MilestoneID = 0 - if milestone != nil { - opts.Issue.MilestoneID = milestone.ID - opts.Issue.Milestone = milestone - if err = changeMilestoneAssign(e, opts.Issue, -1); err != nil { - return err - } - } - } - - if opts.Issue.AssigneeID > 0 { - assignee, err := getUserByID(e, opts.Issue.AssigneeID) - if err != nil && !IsErrUserNotExist(err) { - return fmt.Errorf("getUserByID: %v", err) - } - - // Assume assignee is invalid and drop silently. - opts.Issue.AssigneeID = 0 - if assignee != nil { - valid, err := hasAccess(e, assignee, opts.Repo, ACCESS_MODE_WRITE) - 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 - } - } - } - - // Milestone and assignee validation should happen before insert actual object. - if _, err = e.Insert(opts.Issue); err != nil { - return err - } - - if opts.IsPull { - _, err = e.Exec("UPDATE `repository` SET num_pulls = num_pulls + 1 WHERE id = ?", opts.Issue.RepoID) - } else { - _, err = e.Exec("UPDATE `repository` SET num_issues = num_issues + 1 WHERE id = ?", opts.Issue.RepoID) - } - if err != nil { - return err - } - - if len(opts.LableIDs) > 0 { - // During the session, SQLite3 dirver cannot handle retrieve objects after update something. - // So we have to get all needed labels first. - labels := make([]*Label, 0, len(opts.LableIDs)) - if err = e.In("id", opts.LableIDs).Find(&labels); err != nil { - return fmt.Errorf("find all labels [label_ids: %v]: %v", opts.LableIDs, err) - } - - for _, label := range labels { - // Silently drop invalid labels. - if label.RepoID != opts.Repo.ID { - continue - } - - if err = opts.Issue.addLabel(e, label); err != nil { - return fmt.Errorf("addLabel [id: %d]: %v", label.ID, err) - } - } - } - - if err = newIssueUsers(e, opts.Repo, opts.Issue); err != nil { - return err - } - - if len(opts.Attachments) > 0 { - attachments, err := getAttachmentsByUUIDs(e, opts.Attachments) - if err != nil { - return fmt.Errorf("getAttachmentsByUUIDs [uuids: %v]: %v", opts.Attachments, err) - } - - for i := 0; i < len(attachments); i++ { - attachments[i].IssueID = opts.Issue.ID - if _, err = e.Id(attachments[i].ID).Update(attachments[i]); err != nil { - return fmt.Errorf("update attachment [id: %d]: %v", attachments[i].ID, err) - } - } - } - - return opts.Issue.loadAttributes(e) -} - -// 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) - if err = sess.Begin(); err != nil { - return err - } - - if err = newIssue(sess, NewIssueOptions{ - Repo: repo, - Issue: issue, - LableIDs: labelIDs, - Attachments: uuids, - }); err != nil { - return fmt.Errorf("newIssue: %v", err) - } - - if err = sess.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) - } - - if err = NotifyWatchers(&Action{ - ActUserID: issue.Poster.ID, - ActUserName: issue.Poster.Name, - OpType: ACTION_CREATE_ISSUE, - Content: fmt.Sprintf("%d|%s", issue.Index, issue.Title), - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, - }); err != nil { - log.Error(4, "NotifyWatchers: %v", err) - } - if err = issue.MailParticipants(); err != nil { - log.Error(4, "MailParticipants: %v", err) - } - - return nil -} - -// GetIssueByRef returns an Issue specified by a GFM reference. -// See https://help.github.com/articles/writing-on-github#references for more information on the syntax. -func GetIssueByRef(ref string) (*Issue, error) { - n := strings.IndexByte(ref, byte('#')) - if n == -1 { - return nil, ErrMissingIssueNumber - } - - index, err := com.StrTo(ref[n+1:]).Int64() - if err != nil { - return nil, err - } - - repo, err := GetRepositoryByRef(ref[:n]) - if err != nil { - return nil, err - } - - issue, err := GetIssueByIndex(repo.ID, index) - if err != nil { - return nil, err - } - - return issue, issue.LoadAttributes() -} - -// GetIssueByIndex returns raw issue without loading attributes by index in a repository. -func GetRawIssueByIndex(repoID, index int64) (*Issue, error) { - issue := &Issue{ - RepoID: repoID, - Index: index, - } - has, err := x.Get(issue) - if err != nil { - return nil, err - } else if !has { - return nil, ErrIssueNotExist{0, repoID, index} - } - return issue, nil -} - -// GetIssueByIndex returns issue by index in a repository. -func GetIssueByIndex(repoID, index int64) (*Issue, error) { - issue, err := GetRawIssueByIndex(repoID, index) - if err != nil { - return nil, err - } - return issue, issue.LoadAttributes() -} - -func getIssueByID(e Engine, id int64) (*Issue, error) { - issue := new(Issue) - has, err := e.Id(id).Get(issue) - if err != nil { - return nil, err - } else if !has { - return nil, ErrIssueNotExist{id, 0, 0} - } - return issue, issue.LoadAttributes() -} - -// GetIssueByID returns an issue by given ID. -func GetIssueByID(id int64) (*Issue, error) { - return getIssueByID(x, id) -} - -type IssuesOptions struct { - UserID int64 - AssigneeID int64 - RepoID int64 - PosterID int64 - MilestoneID int64 - RepoIDs []int64 - Page int - IsClosed bool - IsMention bool - IsPull bool - Labels string - SortType string -} - -// Issues returns a list of issues by given conditions. -func Issues(opts *IssuesOptions) ([]*Issue, error) { - if opts.Page <= 0 { - opts.Page = 1 - } - - sess := x.Limit(setting.UI.IssuePagingNum, (opts.Page-1)*setting.UI.IssuePagingNum) - - if opts.RepoID > 0 { - sess.Where("issue.repo_id=?", opts.RepoID).And("issue.is_closed=?", opts.IsClosed) - } else if opts.RepoIDs != nil { - // In case repository IDs are provided but actually no repository has issue. - if len(opts.RepoIDs) == 0 { - return make([]*Issue, 0), nil - } - sess.In("issue.repo_id", base.Int64sToStrings(opts.RepoIDs)).And("issue.is_closed=?", opts.IsClosed) - } else { - sess.Where("issue.is_closed=?", opts.IsClosed) - } - - if opts.AssigneeID > 0 { - sess.And("issue.assignee_id=?", opts.AssigneeID) - } else if opts.PosterID > 0 { - sess.And("issue.poster_id=?", opts.PosterID) - } - - if opts.MilestoneID > 0 { - sess.And("issue.milestone_id=?", opts.MilestoneID) - } - - sess.And("issue.is_pull=?", opts.IsPull) - - switch opts.SortType { - case "oldest": - sess.Asc("issue.created_unix") - case "recentupdate": - sess.Desc("issue.updated_unix") - case "leastupdate": - sess.Asc("issue.updated_unix") - case "mostcomment": - sess.Desc("issue.num_comments") - case "leastcomment": - sess.Asc("issue.num_comments") - case "priority": - sess.Desc("issue.priority") - default: - sess.Desc("issue.created_unix") - } - - if len(opts.Labels) > 0 && opts.Labels != "0" { - labelIDs := base.StringsToInt64s(strings.Split(opts.Labels, ",")) - if len(labelIDs) > 0 { - sess.Join("INNER", "issue_label", "issue.id = issue_label.issue_id").In("issue_label.label_id", labelIDs) - } - } - - if opts.IsMention { - sess.Join("INNER", "issue_user", "issue.id = issue_user.issue_id").And("issue_user.is_mentioned = ?", true) - - if opts.UserID > 0 { - sess.And("issue_user.uid = ?", opts.UserID) - } - } - - issues := make([]*Issue, 0, setting.UI.IssuePagingNum) - if err := sess.Find(&issues); err != nil { - return nil, fmt.Errorf("Find: %v", err) - } - - // FIXME: use IssueList to improve performance. - for i := range issues { - if err := issues[i].LoadAttributes(); err != nil { - return nil, fmt.Errorf("LoadAttributes [%d]: %v", issues[i].ID, err) - } - } - - return issues, nil -} - -// .___ ____ ___ -// | | ______ ________ __ ____ | | \______ ___________ -// | |/ ___// ___/ | \_/ __ \| | / ___// __ \_ __ \ -// | |\___ \ \___ \| | /\ ___/| | /\___ \\ ___/| | \/ -// |___/____ >____ >____/ \___ >______//____ >\___ >__| -// \/ \/ \/ \/ \/ - -// IssueUser represents an issue-user relation. -type IssueUser struct { - ID int64 `xorm:"pk autoincr"` - UID int64 `xorm:"INDEX"` // User ID. - IssueID int64 - RepoID int64 `xorm:"INDEX"` - MilestoneID int64 - IsRead bool - IsAssigned bool - IsMentioned bool - IsPoster bool - IsClosed bool -} - -func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error { - assignees, err := repo.getAssignees(e) - if err != nil { - return fmt.Errorf("getAssignees: %v", err) - } - - // Poster can be anyone, append later if not one of assignees. - isPosterAssignee := false - - // Leave a seat for poster itself to append later, but if poster is one of assignee - // and just waste 1 unit is cheaper than re-allocate memory once. - issueUsers := make([]*IssueUser, 0, len(assignees)+1) - for _, assignee := range assignees { - isPoster := assignee.ID == issue.PosterID - issueUsers = append(issueUsers, &IssueUser{ - IssueID: issue.ID, - RepoID: repo.ID, - UID: assignee.ID, - IsPoster: isPoster, - IsAssigned: assignee.ID == issue.AssigneeID, - }) - if !isPosterAssignee && isPoster { - isPosterAssignee = true - } - } - if !isPosterAssignee { - issueUsers = append(issueUsers, &IssueUser{ - IssueID: issue.ID, - RepoID: repo.ID, - UID: issue.PosterID, - IsPoster: true, - }) - } - - if _, err = e.Insert(issueUsers); err != nil { - return err - } - return nil -} - -// NewIssueUsers adds new issue-user relations for new issue of repository. -func NewIssueUsers(repo *Repository, issue *Issue) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = newIssueUsers(sess, repo, issue); err != nil { - return err - } - - return sess.Commit() -} - -// PairsContains returns true when pairs list contains given issue. -func PairsContains(ius []*IssueUser, issueId, uid int64) int { - for i := range ius { - if ius[i].IssueID == issueId && - ius[i].UID == uid { - return i - } - } - return -1 -} - -// GetIssueUsers returns issue-user pairs by given repository and user. -func GetIssueUsers(rid, uid int64, isClosed bool) ([]*IssueUser, error) { - ius := make([]*IssueUser, 0, 10) - err := x.Where("is_closed=?", isClosed).Find(&ius, &IssueUser{RepoID: rid, UID: uid}) - return ius, err -} - -// GetIssueUserPairsByRepoIds returns issue-user pairs by given repository IDs. -func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*IssueUser, error) { - if len(rids) == 0 { - return []*IssueUser{}, nil - } - - ius := make([]*IssueUser, 0, 10) - sess := x.Limit(20, (page-1)*20).Where("is_closed=?", isClosed).In("repo_id", rids) - err := sess.Find(&ius) - return ius, err -} - -// GetIssueUserPairsByMode returns issue-user pairs by given repository and user. -func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int) ([]*IssueUser, error) { - ius := make([]*IssueUser, 0, 10) - sess := x.Limit(20, (page-1)*20).Where("uid=?", uid).And("is_closed=?", isClosed) - if rid > 0 { - sess.And("repo_id=?", rid) - } - - switch filterMode { - case FM_ASSIGN: - sess.And("is_assigned=?", true) - case FM_CREATE: - sess.And("is_poster=?", true) - default: - return ius, nil - } - err := sess.Find(&ius) - return ius, err -} - -// UpdateIssueMentions extracts mentioned people from content and -// updates issue-user relations for them. -func UpdateIssueMentions(issueID int64, mentions []string) error { - if len(mentions) == 0 { - return nil - } - - for i := range mentions { - mentions[i] = strings.ToLower(mentions[i]) - } - users := make([]*User, 0, len(mentions)) - - if err := x.In("lower_name", mentions).Asc("lower_name").Find(&users); err != nil { - return fmt.Errorf("find mentioned users: %v", err) - } - - ids := make([]int64, 0, len(mentions)) - for _, user := range users { - ids = append(ids, user.ID) - if !user.IsOrganization() || user.NumMembers == 0 { - continue - } - - memberIDs := make([]int64, 0, user.NumMembers) - orgUsers, err := GetOrgUsersByOrgID(user.ID) - if err != nil { - return fmt.Errorf("GetOrgUsersByOrgID [%d]: %v", user.ID, err) - } - - for _, orgUser := range orgUsers { - memberIDs = append(memberIDs, orgUser.ID) - } - - ids = append(ids, memberIDs...) - } - - if err := UpdateIssueUsersByMentions(issueID, ids); err != nil { - return fmt.Errorf("UpdateIssueUsersByMentions: %v", err) - } - - return nil -} - -// IssueStats represents issue statistic information. -type IssueStats struct { - OpenCount, ClosedCount int64 - AllCount int64 - AssignCount int64 - CreateCount int64 - MentionCount int64 -} - -// Filter modes. -const ( - FM_ALL = iota - FM_ASSIGN - FM_CREATE - FM_MENTION -) - -func parseCountResult(results []map[string][]byte) int64 { - if len(results) == 0 { - return 0 - } - for _, result := range results[0] { - return com.StrTo(string(result)).MustInt64() - } - return 0 -} - -type IssueStatsOptions struct { - RepoID int64 - UserID int64 - Labels string - MilestoneID int64 - AssigneeID int64 - FilterMode int - IsPull bool -} - -// GetIssueStats returns issue statistic information by given conditions. -func GetIssueStats(opts *IssueStatsOptions) *IssueStats { - stats := &IssueStats{} - - countSession := func(opts *IssueStatsOptions) *xorm.Session { - sess := x.Where("issue.repo_id = ?", opts.RepoID).And("is_pull = ?", opts.IsPull) - - if len(opts.Labels) > 0 && opts.Labels != "0" { - labelIDs := base.StringsToInt64s(strings.Split(opts.Labels, ",")) - if len(labelIDs) > 0 { - sess.Join("INNER", "issue_label", "issue.id = issue_id").In("label_id", labelIDs) - } - } - - if opts.MilestoneID > 0 { - sess.And("issue.milestone_id = ?", opts.MilestoneID) - } - - if opts.AssigneeID > 0 { - sess.And("assignee_id = ?", opts.AssigneeID) - } - - return sess - } - - switch opts.FilterMode { - case FM_ALL, FM_ASSIGN: - stats.OpenCount, _ = countSession(opts). - And("is_closed = ?", false). - Count(&Issue{}) - - stats.ClosedCount, _ = countSession(opts). - And("is_closed = ?", true). - Count(&Issue{}) - case FM_CREATE: - stats.OpenCount, _ = countSession(opts). - And("poster_id = ?", opts.UserID). - And("is_closed = ?", false). - Count(&Issue{}) - - stats.ClosedCount, _ = countSession(opts). - And("poster_id = ?", opts.UserID). - And("is_closed = ?", true). - Count(&Issue{}) - case FM_MENTION: - stats.OpenCount, _ = countSession(opts). - Join("INNER", "issue_user", "issue.id = issue_user.issue_id"). - And("issue_user.uid = ?", opts.UserID). - And("issue_user.is_mentioned = ?", true). - And("issue.is_closed = ?", false). - Count(&Issue{}) - - stats.ClosedCount, _ = countSession(opts). - Join("INNER", "issue_user", "issue.id = issue_user.issue_id"). - And("issue_user.uid = ?", opts.UserID). - And("issue_user.is_mentioned = ?", true). - And("issue.is_closed = ?", true). - Count(&Issue{}) - } - return stats -} - -// GetUserIssueStats returns issue statistic information for dashboard by given conditions. -func GetUserIssueStats(repoID, uid int64, repoIDs []int64, filterMode int, isPull bool) *IssueStats { - stats := &IssueStats{} - - countSession := func(isClosed, isPull bool, repoID int64, repoIDs []int64) *xorm.Session { - sess := x.Where("issue.is_closed = ?", isClosed).And("issue.is_pull = ?", isPull) - - if repoID > 0 || len(repoIDs) == 0 { - sess.And("repo_id = ?", repoID) - } else { - sess.In("repo_id", repoIDs) - } - - return sess - } - - stats.AssignCount, _ = countSession(false, isPull, repoID, repoIDs). - And("assignee_id = ?", uid). - Count(&Issue{}) - - stats.CreateCount, _ = countSession(false, isPull, repoID, repoIDs). - And("poster_id = ?", uid). - Count(&Issue{}) - - openCountSession := countSession(false, isPull, repoID, repoIDs) - closedCountSession := countSession(true, isPull, repoID, repoIDs) - - switch filterMode { - case FM_ASSIGN: - openCountSession.And("assignee_id = ?", uid) - closedCountSession.And("assignee_id = ?", uid) - case FM_CREATE: - openCountSession.And("poster_id = ?", uid) - closedCountSession.And("poster_id = ?", uid) - } - - stats.OpenCount, _ = openCountSession.Count(&Issue{}) - stats.ClosedCount, _ = closedCountSession.Count(&Issue{}) - - return stats -} - -// GetRepoIssueStats returns number of open and closed repository issues by given filter mode. -func GetRepoIssueStats(repoID, uid int64, filterMode int, isPull bool) (numOpen int64, numClosed int64) { - countSession := func(isClosed, isPull bool, repoID int64) *xorm.Session { - sess := x.Where("issue.repo_id = ?", isClosed). - And("is_pull = ?", isPull). - And("repo_id = ?", repoID) - - return sess - } - - openCountSession := countSession(false, isPull, repoID) - closedCountSession := countSession(true, isPull, repoID) - - switch filterMode { - case FM_ASSIGN: - openCountSession.And("assignee_id = ?", uid) - closedCountSession.And("assignee_id = ?", uid) - case FM_CREATE: - openCountSession.And("poster_id = ?", uid) - closedCountSession.And("poster_id = ?", uid) - } - - openResult, _ := openCountSession.Count(&Issue{}) - closedResult, _ := closedCountSession.Count(&Issue{}) - - return openResult, closedResult -} - -func updateIssue(e Engine, issue *Issue) error { - _, err := e.Id(issue.ID).AllCols().Update(issue) - return err -} - -// UpdateIssue updates all fields of given issue. -func UpdateIssue(issue *Issue) error { - return updateIssue(x, issue) -} - -func updateIssueUsersByStatus(e Engine, issueID int64, isClosed bool) error { - _, err := e.Exec("UPDATE `issue_user` SET is_closed=? WHERE issue_id=?", isClosed, issueID) - return err -} - -// UpdateIssueUsersByStatus updates issue-user relations by issue status. -func UpdateIssueUsersByStatus(issueID int64, isClosed bool) error { - return updateIssueUsersByStatus(x, issueID, isClosed) -} - -func updateIssueUserByAssignee(e *xorm.Session, issue *Issue) (err error) { - if _, err = e.Exec("UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?", false, issue.ID); err != nil { - return err - } - - // Assignee ID equals to 0 means clear assignee. - if issue.AssigneeID > 0 { - if _, err = e.Exec("UPDATE `issue_user` SET is_assigned = ? WHERE uid = ? AND issue_id = ?", true, issue.AssigneeID, issue.ID); err != nil { - return err - } - } - - return updateIssue(e, issue) -} - -// UpdateIssueUserByAssignee updates issue-user relation for assignee. -func UpdateIssueUserByAssignee(issue *Issue) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = updateIssueUserByAssignee(sess, issue); err != nil { - return err - } - - return sess.Commit() -} - -// UpdateIssueUserByRead updates issue-user relation for reading. -func UpdateIssueUserByRead(uid, issueID int64) error { - _, err := x.Exec("UPDATE `issue_user` SET is_read=? WHERE uid=? AND issue_id=?", true, uid, issueID) - return err -} - -// UpdateIssueUsersByMentions updates issue-user pairs by mentioning. -func UpdateIssueUsersByMentions(issueID int64, uids []int64) error { - for _, uid := range uids { - iu := &IssueUser{ - UID: uid, - IssueID: issueID, - } - has, err := x.Get(iu) - if err != nil { - return err - } - - iu.IsMentioned = true - if has { - _, err = x.Id(iu.ID).AllCols().Update(iu) - } else { - _, err = x.Insert(iu) - } - if err != nil { - return err - } - } - return nil -} - -// _____ .__.__ __ -// / \ |__| | ____ _______/ |_ ____ ____ ____ -// / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \ -// / Y \ | |_\ ___/ \___ \ | | ( <_> ) | \ ___/ -// \____|__ /__|____/\___ >____ > |__| \____/|___| /\___ > -// \/ \/ \/ \/ \/ - -// Milestone represents a milestone of repository. -type Milestone struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 `xorm:"INDEX"` - Name string - Content string `xorm:"TEXT"` - RenderedContent string `xorm:"-"` - IsClosed bool - NumIssues int - NumClosedIssues int - NumOpenIssues int `xorm:"-"` - Completeness int // Percentage(1-100). - IsOverDue bool `xorm:"-"` - - DeadlineString string `xorm:"-"` - Deadline time.Time `xorm:"-"` - DeadlineUnix int64 - ClosedDate time.Time `xorm:"-"` - ClosedDateUnix int64 -} - -func (m *Milestone) BeforeInsert() { - m.DeadlineUnix = m.Deadline.Unix() -} - -func (m *Milestone) BeforeUpdate() { - if m.NumIssues > 0 { - m.Completeness = m.NumClosedIssues * 100 / m.NumIssues - } else { - m.Completeness = 0 - } - - m.DeadlineUnix = m.Deadline.Unix() - m.ClosedDateUnix = m.ClosedDate.Unix() -} - -func (m *Milestone) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "num_closed_issues": - m.NumOpenIssues = m.NumIssues - m.NumClosedIssues - - case "deadline_unix": - m.Deadline = time.Unix(m.DeadlineUnix, 0).Local() - if m.Deadline.Year() == 9999 { - return - } - - m.DeadlineString = m.Deadline.Format("2006-01-02") - if time.Now().Local().After(m.Deadline) { - m.IsOverDue = true - } - - case "closed_date_unix": - m.ClosedDate = time.Unix(m.ClosedDateUnix, 0).Local() - } -} - -// State returns string representation of milestone status. -func (m *Milestone) State() api.StateType { - if m.IsClosed { - return api.STATE_CLOSED - } - return api.STATE_OPEN -} - -func (m *Milestone) APIFormat() *api.Milestone { - apiMilestone := &api.Milestone{ - ID: m.ID, - State: m.State(), - Title: m.Name, - Description: m.Content, - OpenIssues: m.NumOpenIssues, - ClosedIssues: m.NumClosedIssues, - } - if m.IsClosed { - apiMilestone.Closed = &m.ClosedDate - } - if m.Deadline.Year() < 9999 { - apiMilestone.Deadline = &m.Deadline - } - return apiMilestone -} - -// NewMilestone creates new milestone of repository. -func NewMilestone(m *Milestone) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Insert(m); err != nil { - return err - } - - if _, err = sess.Exec("UPDATE `repository` SET num_milestones = num_milestones + 1 WHERE id = ?", m.RepoID); err != nil { - return err - } - return sess.Commit() -} - -func getMilestoneByRepoID(e Engine, repoID, id int64) (*Milestone, error) { - m := &Milestone{ - ID: id, - RepoID: repoID, - } - has, err := e.Get(m) - if err != nil { - return nil, err - } else if !has { - return nil, ErrMilestoneNotExist{id, repoID} - } - return m, nil -} - -// GetWebhookByRepoID returns the milestone in a repository. -func GetMilestoneByRepoID(repoID, id int64) (*Milestone, error) { - return getMilestoneByRepoID(x, repoID, id) -} - -// GetMilestonesByRepoID returns all milestones of a repository. -func GetMilestonesByRepoID(repoID int64) ([]*Milestone, error) { - miles := make([]*Milestone, 0, 10) - return miles, x.Where("repo_id = ?", repoID).Find(&miles) -} - -// GetMilestones returns a list of milestones of given repository and status. -func GetMilestones(repoID int64, page int, isClosed bool) ([]*Milestone, error) { - miles := make([]*Milestone, 0, setting.UI.IssuePagingNum) - sess := x.Where("repo_id = ? AND is_closed = ?", repoID, isClosed) - if page > 0 { - sess = sess.Limit(setting.UI.IssuePagingNum, (page-1)*setting.UI.IssuePagingNum) - } - return miles, sess.Find(&miles) -} - -func updateMilestone(e Engine, m *Milestone) error { - _, err := e.Id(m.ID).AllCols().Update(m) - return err -} - -// UpdateMilestone updates information of given milestone. -func UpdateMilestone(m *Milestone) error { - return updateMilestone(x, m) -} - -func countRepoMilestones(e Engine, repoID int64) int64 { - count, _ := e.Where("repo_id=?", repoID).Count(new(Milestone)) - return count -} - -// CountRepoMilestones returns number of milestones in given repository. -func CountRepoMilestones(repoID int64) int64 { - return countRepoMilestones(x, repoID) -} - -func countRepoClosedMilestones(e Engine, repoID int64) int64 { - closed, _ := e.Where("repo_id=? AND is_closed=?", repoID, true).Count(new(Milestone)) - return closed -} - -// CountRepoClosedMilestones returns number of closed milestones in given repository. -func CountRepoClosedMilestones(repoID int64) int64 { - return countRepoClosedMilestones(x, repoID) -} - -// MilestoneStats returns number of open and closed milestones of given repository. -func MilestoneStats(repoID int64) (open int64, closed int64) { - open, _ = x.Where("repo_id=? AND is_closed=?", repoID, false).Count(new(Milestone)) - return open, CountRepoClosedMilestones(repoID) -} - -// ChangeMilestoneStatus changes the milestone open/closed status. -func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) { - repo, err := GetRepositoryByID(m.RepoID) - if err != nil { - return err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - m.IsClosed = isClosed - if err = updateMilestone(sess, m); err != nil { - return err - } - - repo.NumMilestones = int(countRepoMilestones(sess, repo.ID)) - repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID)) - if _, err = sess.Id(repo.ID).AllCols().Update(repo); err != nil { - return err - } - return sess.Commit() -} - -func changeMilestoneIssueStats(e *xorm.Session, issue *Issue) error { - if issue.MilestoneID == 0 { - return nil - } - - m, err := getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) - if err != nil { - return err - } - - if issue.IsClosed { - m.NumOpenIssues-- - m.NumClosedIssues++ - } else { - m.NumOpenIssues++ - m.NumClosedIssues-- - } - - return updateMilestone(e, m) -} - -// ChangeMilestoneIssueStats updates the open/closed issues counter and progress -// for the milestone associated with the given issue. -func ChangeMilestoneIssueStats(issue *Issue) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = changeMilestoneIssueStats(sess, issue); err != nil { - return err - } - - return sess.Commit() -} - -func changeMilestoneAssign(e *xorm.Session, issue *Issue, oldMilestoneID int64) error { - if oldMilestoneID > 0 { - m, err := getMilestoneByRepoID(e, issue.RepoID, oldMilestoneID) - if err != nil { - return err - } - - m.NumIssues-- - if issue.IsClosed { - m.NumClosedIssues-- - } - - if err = updateMilestone(e, m); err != nil { - return err - } else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE issue_id = ?", issue.ID); err != nil { - return err - } - } - - if issue.MilestoneID > 0 { - m, err := getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) - if err != nil { - return err - } - - m.NumIssues++ - if issue.IsClosed { - m.NumClosedIssues++ - } - - if err = updateMilestone(e, m); err != nil { - return err - } else if _, err = e.Exec("UPDATE `issue_user` SET milestone_id = ? WHERE issue_id = ?", m.ID, issue.ID); err != nil { - return err - } - } - - return updateIssue(e, issue) -} - -// ChangeMilestoneAssign changes assignment of milestone for issue. -func ChangeMilestoneAssign(issue *Issue, oldMilestoneID int64) (err error) { - sess := x.NewSession() - defer sess.Close() - if err = sess.Begin(); err != nil { - return err - } - - if err = changeMilestoneAssign(sess, issue, oldMilestoneID); err != nil { - return err - } - return sess.Commit() -} - -// DeleteMilestoneByRepoID deletes a milestone from a repository. -func DeleteMilestoneByRepoID(repoID, id int64) error { - m, err := GetMilestoneByRepoID(repoID, id) - if err != nil { - if IsErrMilestoneNotExist(err) { - return nil - } - return err - } - - repo, err := GetRepositoryByID(m.RepoID) - if err != nil { - return err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Id(m.ID).Delete(new(Milestone)); err != nil { - return err - } - - repo.NumMilestones = int(countRepoMilestones(sess, repo.ID)) - repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID)) - if _, err = sess.Id(repo.ID).AllCols().Update(repo); err != nil { - return err - } - - if _, err = sess.Exec("UPDATE `issue` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil { - return err - } else if _, err = sess.Exec("UPDATE `issue_user` SET milestone_id = 0 WHERE milestone_id = ?", m.ID); err != nil { - return err - } - return sess.Commit() -} - -// 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 -} - -func (a *Attachment) BeforeInsert() { - a.CreatedUnix = time.Now().Unix() -} - -func (a *Attachment) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "created_unix": - a.Created = time.Unix(a.CreatedUnix, 0).Local() - } -} - -// AttachmentLocalPath returns where attachment is stored in local file system based on given UUID. -func AttachmentLocalPath(uuid string) string { - return path.Join(setting.AttachmentPath, uuid[0:1], uuid[1:2], uuid) -} - -// LocalPath returns where attachment is stored in local file system. -func (attach *Attachment) LocalPath() string { - return AttachmentLocalPath(attach.UUID) -} - -// NewAttachment creates a new attachment object. -func NewAttachment(name string, buf []byte, file multipart.File) (_ *Attachment, err error) { - attach := &Attachment{ - UUID: gouuid.NewV4().String(), - Name: name, - } - - localPath := attach.LocalPath() - if err = os.MkdirAll(path.Dir(localPath), os.ModePerm); err != nil { - return nil, fmt.Errorf("MkdirAll: %v", err) - } - - fw, err := os.Create(localPath) - if err != nil { - return nil, fmt.Errorf("Create: %v", err) - } - defer fw.Close() - - if _, err = fw.Write(buf); err != nil { - return nil, fmt.Errorf("Write: %v", err) - } else if _, err = io.Copy(fw, file); err != nil { - return nil, fmt.Errorf("Copy: %v", err) - } - - if _, err := x.Insert(attach); err != nil { - return nil, err - } - - return attach, nil -} - -func getAttachmentByUUID(e Engine, uuid string) (*Attachment, error) { - attach := &Attachment{UUID: uuid} - has, err := x.Get(attach) - if err != nil { - return nil, err - } else if !has { - return nil, ErrAttachmentNotExist{0, uuid} - } - return attach, nil -} - -func getAttachmentsByUUIDs(e Engine, uuids []string) ([]*Attachment, error) { - if len(uuids) == 0 { - return []*Attachment{}, nil - } - - // Silently drop invalid uuids. - attachments := make([]*Attachment, 0, len(uuids)) - return attachments, e.In("uuid", uuids).Find(&attachments) -} - -// GetAttachmentByUUID returns attachment by given UUID. -func GetAttachmentByUUID(uuid string) (*Attachment, error) { - return getAttachmentByUUID(x, uuid) -} - -func getAttachmentsByIssueID(e Engine, issueID int64) ([]*Attachment, error) { - attachments := make([]*Attachment, 0, 10) - return attachments, e.Where("issue_id = ? AND comment_id = 0", issueID).Find(&attachments) -} - -// GetAttachmentsByIssueID returns all attachments of an issue. -func GetAttachmentsByIssueID(issueID int64) ([]*Attachment, error) { - return getAttachmentsByIssueID(x, issueID) -} - -// GetAttachmentsByCommentID returns all attachments if comment by given ID. -func GetAttachmentsByCommentID(commentID int64) ([]*Attachment, error) { - attachments := make([]*Attachment, 0, 10) - return attachments, x.Where("comment_id=?", commentID).Find(&attachments) -} - -// DeleteAttachment deletes the given attachment and optionally the associated file. -func DeleteAttachment(a *Attachment, remove bool) error { - _, err := DeleteAttachments([]*Attachment{a}, remove) - return err -} - -// DeleteAttachments deletes the given attachments and optionally the associated files. -func DeleteAttachments(attachments []*Attachment, remove bool) (int, error) { - for i, a := range attachments { - if remove { - if err := os.Remove(a.LocalPath()); err != nil { - return i, err - } - } - - if _, err := x.Delete(a); err != nil { - return i, err - } - } - - return len(attachments), nil -} - -// DeleteAttachmentsByIssue deletes all attachments associated with the given issue. -func DeleteAttachmentsByIssue(issueId int64, remove bool) (int, error) { - attachments, err := GetAttachmentsByIssueID(issueId) - - if err != nil { - return 0, err - } - - return DeleteAttachments(attachments, remove) -} - -// DeleteAttachmentsByComment deletes all attachments associated with the given comment. -func DeleteAttachmentsByComment(commentId int64, remove bool) (int, error) { - attachments, err := GetAttachmentsByCommentID(commentId) - - if err != nil { - return 0, err - } - - return DeleteAttachments(attachments, remove) -} diff --git a/models/issue_comment.go b/models/issue_comment.go deleted file mode 100644 index ccfa765f927..00000000000 --- a/models/issue_comment.go +++ /dev/null @@ -1,413 +0,0 @@ -// Copyright 2016 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 models - -import ( - "fmt" - "strings" - "time" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - - api "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/markdown" -) - -// CommentType defines whether a comment is just a simple comment, an action (like close) or a reference. -type CommentType int - -const ( - // Plain comment, can be associated with a commit (CommitID > 0) and a line (LineNum > 0) - COMMENT_TYPE_COMMENT CommentType = iota - COMMENT_TYPE_REOPEN - COMMENT_TYPE_CLOSE - - // References. - COMMENT_TYPE_ISSUE_REF - // Reference from a commit (not part of a pull request) - COMMENT_TYPE_COMMIT_REF - // Reference from a comment - COMMENT_TYPE_COMMENT_REF - // Reference from a pull request - COMMENT_TYPE_PULL_REF -) - -type CommentTag int - -const ( - COMMENT_TAG_NONE CommentTag = iota - COMMENT_TAG_POSTER - COMMENT_TAG_WRITER - COMMENT_TAG_OWNER -) - -// Comment represents a comment in commit and issue page. -type Comment struct { - ID int64 `xorm:"pk autoincr"` - Type CommentType - PosterID int64 - Poster *User `xorm:"-"` - IssueID int64 `xorm:"INDEX"` - CommitID int64 - Line int64 - Content string `xorm:"TEXT"` - RenderedContent string `xorm:"-"` - - Created time.Time `xorm:"-"` - CreatedUnix int64 - Updated time.Time `xorm:"-"` - UpdatedUnix int64 - - // Reference issue in commit message - CommitSHA string `xorm:"VARCHAR(40)"` - - Attachments []*Attachment `xorm:"-"` - - // For view issue page. - ShowTag CommentTag `xorm:"-"` -} - -func (c *Comment) BeforeInsert() { - c.CreatedUnix = time.Now().Unix() - c.UpdatedUnix = c.CreatedUnix -} - -func (c *Comment) BeforeUpdate() { - c.UpdatedUnix = time.Now().Unix() -} - -func (c *Comment) AfterSet(colName string, _ xorm.Cell) { - var err error - switch colName { - case "id": - c.Attachments, err = GetAttachmentsByCommentID(c.ID) - if err != nil { - log.Error(3, "GetAttachmentsByCommentID[%d]: %v", c.ID, err) - } - - case "poster_id": - c.Poster, err = GetUserByID(c.PosterID) - if err != nil { - if IsErrUserNotExist(err) { - c.PosterID = -1 - c.Poster = NewGhostUser() - } else { - log.Error(3, "GetUserByID[%d]: %v", c.ID, err) - } - } - case "created_unix": - c.Created = time.Unix(c.CreatedUnix, 0).Local() - case "updated_unix": - c.Updated = time.Unix(c.UpdatedUnix, 0).Local() - } -} - -func (c *Comment) AfterDelete() { - _, err := DeleteAttachmentsByComment(c.ID, true) - - if err != nil { - log.Info("Could not delete files for comment %d on issue #%d: %s", c.ID, c.IssueID, err) - } -} - -func (c *Comment) APIFormat() *api.Comment { - return &api.Comment{ - ID: c.ID, - Poster: c.Poster.APIFormat(), - Body: c.Content, - Created: c.Created, - Updated: c.Updated, - } -} - -// HashTag returns unique hash tag for comment. -func (c *Comment) HashTag() string { - return "issuecomment-" + com.ToStr(c.ID) -} - -// EventTag returns unique event hash tag for comment. -func (c *Comment) EventTag() string { - return "event-" + com.ToStr(c.ID) -} - -// MailParticipants sends new comment emails to repository watchers -// and mentioned people. -func (cmt *Comment) MailParticipants(opType ActionType, issue *Issue) (err error) { - mentions := markdown.FindAllMentions(cmt.Content) - if err = UpdateIssueMentions(cmt.IssueID, mentions); err != nil { - return fmt.Errorf("UpdateIssueMentions [%d]: %v", cmt.IssueID, err) - } - - switch opType { - case ACTION_COMMENT_ISSUE: - issue.Content = cmt.Content - case ACTION_CLOSE_ISSUE: - issue.Content = fmt.Sprintf("Closed #%d", issue.Index) - case ACTION_REOPEN_ISSUE: - issue.Content = fmt.Sprintf("Reopened #%d", issue.Index) - } - if err = mailIssueCommentToParticipants(issue, cmt.Poster, mentions); err != nil { - log.Error(4, "mailIssueCommentToParticipants: %v", err) - } - - return nil -} - -func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err error) { - comment := &Comment{ - Type: opts.Type, - PosterID: opts.Doer.ID, - Poster: opts.Doer, - IssueID: opts.Issue.ID, - CommitID: opts.CommitID, - CommitSHA: opts.CommitSHA, - Line: opts.LineNum, - Content: opts.Content, - } - if _, err = e.Insert(comment); err != nil { - return nil, 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, - } - - // Check comment type. - switch opts.Type { - case COMMENT_TYPE_COMMENT: - act.OpType = ACTION_COMMENT_ISSUE - - if _, err = e.Exec("UPDATE `issue` SET num_comments=num_comments+1 WHERE id=?", opts.Issue.ID); err != nil { - return nil, err - } - - // Check attachments - attachments := make([]*Attachment, 0, len(opts.Attachments)) - for _, uuid := range opts.Attachments { - attach, err := getAttachmentByUUID(e, uuid) - if err != nil { - if IsErrAttachmentNotExist(err) { - continue - } - return nil, fmt.Errorf("getAttachmentByUUID [%s]: %v", uuid, err) - } - attachments = append(attachments, attach) - } - - for i := range attachments { - attachments[i].IssueID = opts.Issue.ID - attachments[i].CommentID = comment.ID - // No assign value could be 0, so ignore AllCols(). - if _, err = e.Id(attachments[i].ID).Update(attachments[i]); err != nil { - return nil, fmt.Errorf("update attachment [%d]: %v", attachments[i].ID, err) - } - } - - case COMMENT_TYPE_REOPEN: - act.OpType = ACTION_REOPEN_ISSUE - if opts.Issue.IsPull { - act.OpType = ACTION_REOPEN_PULL_REQUEST - } - - if opts.Issue.IsPull { - _, err = e.Exec("UPDATE `repository` SET num_closed_pulls=num_closed_pulls-1 WHERE id=?", opts.Repo.ID) - } else { - _, err = e.Exec("UPDATE `repository` SET num_closed_issues=num_closed_issues-1 WHERE id=?", opts.Repo.ID) - } - if err != nil { - return nil, err - } - - case COMMENT_TYPE_CLOSE: - act.OpType = ACTION_CLOSE_ISSUE - if opts.Issue.IsPull { - act.OpType = ACTION_CLOSE_PULL_REQUEST - } - - if opts.Issue.IsPull { - _, err = e.Exec("UPDATE `repository` SET num_closed_pulls=num_closed_pulls+1 WHERE id=?", opts.Repo.ID) - } else { - _, err = e.Exec("UPDATE `repository` SET num_closed_issues=num_closed_issues+1 WHERE id=?", opts.Repo.ID) - } - if err != nil { - return nil, err - } - - } - - // Notify watchers for whatever action comes in, ignore if no action type. - if act.OpType > 0 { - if err = notifyWatchers(e, act); err != nil { - log.Error(4, "notifyWatchers: %v", err) - } - comment.MailParticipants(act.OpType, opts.Issue) - } - - return comment, nil -} - -func createStatusComment(e *xorm.Session, doer *User, repo *Repository, issue *Issue) (*Comment, error) { - cmtType := COMMENT_TYPE_CLOSE - if !issue.IsClosed { - cmtType = COMMENT_TYPE_REOPEN - } - return createComment(e, &CreateCommentOptions{ - Type: cmtType, - Doer: doer, - Repo: repo, - Issue: issue, - }) -} - -type CreateCommentOptions struct { - Type CommentType - Doer *User - Repo *Repository - Issue *Issue - - CommitID int64 - CommitSHA string - LineNum int64 - Content string - Attachments []string // UUIDs of attachments -} - -// CreateComment creates comment of issue or commit. -func CreateComment(opts *CreateCommentOptions) (comment *Comment, err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return nil, err - } - - comment, err = createComment(sess, opts) - if err != nil { - return nil, err - } - - return comment, sess.Commit() -} - -// CreateIssueComment creates a plain issue comment. -func CreateIssueComment(doer *User, repo *Repository, issue *Issue, content string, attachments []string) (*Comment, error) { - return CreateComment(&CreateCommentOptions{ - Type: COMMENT_TYPE_COMMENT, - Doer: doer, - Repo: repo, - Issue: issue, - Content: content, - Attachments: attachments, - }) -} - -// CreateRefComment creates a commit reference comment to issue. -func CreateRefComment(doer *User, repo *Repository, issue *Issue, content, commitSHA string) error { - if len(commitSHA) == 0 { - return fmt.Errorf("cannot create reference with empty commit SHA") - } - - // Check if same reference from same commit has already existed. - has, err := x.Get(&Comment{ - Type: COMMENT_TYPE_COMMIT_REF, - IssueID: issue.ID, - CommitSHA: commitSHA, - }) - if err != nil { - return fmt.Errorf("check reference comment: %v", err) - } else if has { - return nil - } - - _, err = CreateComment(&CreateCommentOptions{ - Type: COMMENT_TYPE_COMMIT_REF, - Doer: doer, - Repo: repo, - Issue: issue, - CommitSHA: commitSHA, - Content: content, - }) - return err -} - -// GetCommentByID returns the comment by given ID. -func GetCommentByID(id int64) (*Comment, error) { - c := new(Comment) - has, err := x.Id(id).Get(c) - if err != nil { - return nil, err - } else if !has { - return nil, ErrCommentNotExist{id, 0} - } - 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) -} - -func getCommentsByIssueID(e Engine, issueID int64) ([]*Comment, error) { - return getCommentsByIssueIDSince(e, issueID, -1) -} - -// GetCommentsByIssueID returns all comments of an issue. -func GetCommentsByIssueID(issueID int64) ([]*Comment, error) { - return getCommentsByIssueID(x, issueID) -} - -// GetCommentsByIssueID 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) -} - -// UpdateComment updates information of comment. -func UpdateComment(c *Comment) error { - _, err := x.Id(c.ID).AllCols().Update(c) - return err -} - -// DeleteCommentByID deletes the comment by given ID. -func DeleteCommentByID(id int64) error { - comment, err := GetCommentByID(id) - if err != nil { - if IsErrCommentNotExist(err) { - return nil - } - return err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Id(comment.ID).Delete(new(Comment)); err != nil { - return err - } - - if comment.Type == COMMENT_TYPE_COMMENT { - if _, err = sess.Exec("UPDATE `issue` SET num_comments = num_comments - 1 WHERE id = ?", comment.IssueID); err != nil { - return err - } - } - - return sess.Commit() -} diff --git a/models/issue_label.go b/models/issue_label.go deleted file mode 100644 index 13bf2005f30..00000000000 --- a/models/issue_label.go +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright 2016 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 models - -import ( - "fmt" - "html/template" - "regexp" - "strconv" - "strings" - - "github.com/go-xorm/xorm" - - api "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/modules/base" -) - -var labelColorPattern = regexp.MustCompile("#([a-fA-F0-9]{6})") - -// GetLabelTemplateFile loads the label template file by given name, -// then parses and returns a list of name-color pairs. -func GetLabelTemplateFile(name string) ([][2]string, error) { - data, err := getRepoInitFile("label", name) - if err != nil { - return nil, fmt.Errorf("getRepoInitFile: %v", err) - } - - lines := strings.Split(string(data), "\n") - list := make([][2]string, 0, len(lines)) - for i := 0; i < len(lines); i++ { - line := strings.TrimSpace(lines[i]) - if len(line) == 0 { - continue - } - - fields := strings.SplitN(line, " ", 2) - if len(fields) != 2 { - return nil, fmt.Errorf("line is malformed: %s", line) - } - - if !labelColorPattern.MatchString(fields[0]) { - return nil, fmt.Errorf("bad HTML color code in line: %s", line) - } - - fields[1] = strings.TrimSpace(fields[1]) - list = append(list, [2]string{fields[1], fields[0]}) - } - - return list, nil -} - -// Label represents a label of repository for issues. -type Label struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 `xorm:"INDEX"` - Name string - Color string `xorm:"VARCHAR(7)"` - NumIssues int - NumClosedIssues int - NumOpenIssues int `xorm:"-"` - IsChecked bool `xorm:"-"` -} - -func (label *Label) APIFormat() *api.Label { - return &api.Label{ - ID: label.ID, - Name: label.Name, - Color: label.Color, - } -} - -// CalOpenIssues calculates the open issues of label. -func (label *Label) CalOpenIssues() { - label.NumOpenIssues = label.NumIssues - label.NumClosedIssues -} - -// ForegroundColor calculates the text color for labels based -// on their background color. -func (l *Label) ForegroundColor() template.CSS { - if strings.HasPrefix(l.Color, "#") { - if color, err := strconv.ParseUint(l.Color[1:], 16, 64); err == nil { - r := float32(0xFF & (color >> 16)) - g := float32(0xFF & (color >> 8)) - b := float32(0xFF & color) - luminance := (0.2126*r + 0.7152*g + 0.0722*b) / 255 - - if luminance < 0.66 { - return template.CSS("#fff") - } - } - } - - // default to black - return template.CSS("#000") -} - -// NewLabels creates new label(s) for a repository. -func NewLabels(labels ...*Label) error { - _, err := x.Insert(labels) - return err -} - -// getLabelInRepoByID returns a label by ID in given repository. -// If pass repoID as 0, then ORM will ignore limitation of repository -// and can return arbitrary label with any valid ID. -func getLabelInRepoByID(e Engine, repoID, labelID int64) (*Label, error) { - if labelID <= 0 { - return nil, ErrLabelNotExist{labelID, repoID} - } - - l := &Label{ - ID: labelID, - RepoID: repoID, - } - has, err := x.Get(l) - if err != nil { - return nil, err - } else if !has { - return nil, ErrLabelNotExist{l.ID, l.RepoID} - } - return l, nil -} - -// GetLabelByID returns a label by given ID. -func GetLabelByID(id int64) (*Label, error) { - return getLabelInRepoByID(x, 0, id) -} - -// GetLabelInRepoByID returns a label by ID in given repository. -func GetLabelInRepoByID(repoID, labelID int64) (*Label, error) { - return getLabelInRepoByID(x, repoID, labelID) -} - -// GetLabelsInRepoByIDs returns a list of labels by IDs in given repository, -// it silently ignores label IDs that are not belong to the repository. -func GetLabelsInRepoByIDs(repoID int64, labelIDs []int64) ([]*Label, error) { - labels := make([]*Label, 0, len(labelIDs)) - return labels, x.Where("repo_id = ?", repoID).In("id", base.Int64sToStrings(labelIDs)).Asc("name").Find(&labels) -} - -// GetLabelsByRepoID returns all labels that belong to given repository by ID. -func GetLabelsByRepoID(repoID int64) ([]*Label, error) { - labels := make([]*Label, 0, 10) - return labels, x.Where("repo_id = ?", repoID).Asc("name").Find(&labels) -} - -func getLabelsByIssueID(e Engine, issueID int64) ([]*Label, error) { - issueLabels, err := getIssueLabels(e, issueID) - if err != nil { - return nil, fmt.Errorf("getIssueLabels: %v", err) - } else if len(issueLabels) == 0 { - return []*Label{}, nil - } - - labelIDs := make([]int64, len(issueLabels)) - for i := range issueLabels { - labelIDs[i] = issueLabels[i].LabelID - } - - labels := make([]*Label, 0, len(labelIDs)) - return labels, e.Where("id > 0").In("id", base.Int64sToStrings(labelIDs)).Asc("name").Find(&labels) -} - -// GetLabelsByIssueID returns all labels that belong to given issue by ID. -func GetLabelsByIssueID(issueID int64) ([]*Label, error) { - return getLabelsByIssueID(x, issueID) -} - -func updateLabel(e Engine, l *Label) error { - _, err := e.Id(l.ID).AllCols().Update(l) - return err -} - -// UpdateLabel updates label information. -func UpdateLabel(l *Label) error { - return updateLabel(x, l) -} - -// DeleteLabel delete a label of given repository. -func DeleteLabel(repoID, labelID int64) error { - _, err := GetLabelInRepoByID(repoID, labelID) - if err != nil { - if IsErrLabelNotExist(err) { - return nil - } - return err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Id(labelID).Delete(new(Label)); err != nil { - return err - } else if _, err = sess.Where("label_id = ?", labelID).Delete(new(IssueLabel)); err != nil { - return err - } - - return sess.Commit() -} - -// .___ .____ ___. .__ -// | | ______ ________ __ ____ | | _____ \_ |__ ____ | | -// | |/ ___// ___/ | \_/ __ \| | \__ \ | __ \_/ __ \| | -// | |\___ \ \___ \| | /\ ___/| |___ / __ \| \_\ \ ___/| |__ -// |___/____ >____ >____/ \___ >_______ (____ /___ /\___ >____/ -// \/ \/ \/ \/ \/ \/ \/ - -// IssueLabel represetns an issue-lable relation. -type IssueLabel struct { - ID int64 `xorm:"pk autoincr"` - IssueID int64 `xorm:"UNIQUE(s)"` - LabelID int64 `xorm:"UNIQUE(s)"` -} - -func hasIssueLabel(e Engine, issueID, labelID int64) bool { - has, _ := e.Where("issue_id = ? AND label_id = ?", issueID, labelID).Get(new(IssueLabel)) - return has -} - -// HasIssueLabel returns true if issue has been labeled. -func HasIssueLabel(issueID, labelID int64) bool { - return hasIssueLabel(x, issueID, labelID) -} - -func newIssueLabel(e *xorm.Session, issue *Issue, label *Label) (err error) { - if _, err = e.Insert(&IssueLabel{ - IssueID: issue.ID, - LabelID: label.ID, - }); err != nil { - return err - } - - label.NumIssues++ - if issue.IsClosed { - label.NumClosedIssues++ - } - return updateLabel(e, label) -} - -// NewIssueLabel creates a new issue-label relation. -func NewIssueLabel(issue *Issue, label *Label) (err error) { - if HasIssueLabel(issue.ID, label.ID) { - return nil - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = newIssueLabel(sess, issue, label); err != nil { - return err - } - - return sess.Commit() -} - -func newIssueLabels(e *xorm.Session, issue *Issue, labels []*Label) (err error) { - for i := range labels { - if hasIssueLabel(e, issue.ID, labels[i].ID) { - continue - } - - if err = newIssueLabel(e, issue, labels[i]); err != nil { - return fmt.Errorf("newIssueLabel: %v", err) - } - } - - return nil -} - -// NewIssueLabels creates a list of issue-label relations. -func NewIssueLabels(issue *Issue, labels []*Label) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = newIssueLabels(sess, issue, labels); err != nil { - return err - } - - return sess.Commit() -} - -func getIssueLabels(e Engine, issueID int64) ([]*IssueLabel, error) { - issueLabels := make([]*IssueLabel, 0, 10) - return issueLabels, e.Where("issue_id=?", issueID).Asc("label_id").Find(&issueLabels) -} - -// GetIssueLabels returns all issue-label relations of given issue by ID. -func GetIssueLabels(issueID int64) ([]*IssueLabel, error) { - return getIssueLabels(x, issueID) -} - -func deleteIssueLabel(e *xorm.Session, issue *Issue, label *Label) (err error) { - if _, err = e.Delete(&IssueLabel{ - IssueID: issue.ID, - LabelID: label.ID, - }); err != nil { - return err - } - - label.NumIssues-- - if issue.IsClosed { - label.NumClosedIssues-- - } - return updateLabel(e, label) -} - -// DeleteIssueLabel deletes issue-label relation. -func DeleteIssueLabel(issue *Issue, label *Label) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = deleteIssueLabel(sess, issue, label); err != nil { - return err - } - - return sess.Commit() -} diff --git a/models/issue_mail.go b/models/issue_mail.go deleted file mode 100644 index 02548bc3ed2..00000000000 --- a/models/issue_mail.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2016 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 models - -import ( - "fmt" - - "github.com/Unknwon/com" - - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/markdown" - "github.com/gogits/gogs/modules/setting" -) - -func (issue *Issue) MailSubject() string { - return fmt.Sprintf("[%s] %s (#%d)", issue.Repo.Name, issue.Title, issue.Index) -} - -// mailIssueCommentToParticipants can be used for both new issue creation and comment. -func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string) error { - if !setting.Service.EnableNotifyMail { - return nil - } - - // Mail wahtcers. - watchers, err := GetWatchers(issue.RepoID) - if err != nil { - return fmt.Errorf("GetWatchers [%d]: %v", issue.RepoID, err) - } - - tos := make([]string, 0, len(watchers)) // List of email addresses. - names := make([]string, 0, len(watchers)) - for i := range watchers { - if watchers[i].UserID == doer.ID { - continue - } - - to, err := GetUserByID(watchers[i].UserID) - if err != nil { - return fmt.Errorf("GetUserByID [%d]: %v", watchers[i].UserID, err) - } - if to.IsOrganization() { - continue - } - - tos = append(tos, to.Email) - names = append(names, to.Name) - } - SendIssueCommentMail(issue, doer, tos) - - // Mail mentioned people and exclude watchers. - names = append(names, doer.Name) - tos = make([]string, 0, len(mentions)) // list of user names. - for i := range mentions { - if com.IsSliceContainsStr(names, mentions[i]) { - continue - } - - tos = append(tos, mentions[i]) - } - SendIssueMentionMail(issue, doer, GetUserEmailsByNames(tos)) - - return nil -} - -// MailParticipants sends new issue thread created emails to repository watchers -// and mentioned people. -func (issue *Issue) MailParticipants() (err error) { - mentions := markdown.FindAllMentions(issue.Content) - if err = UpdateIssueMentions(issue.ID, mentions); err != nil { - return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err) - } - - if err = mailIssueCommentToParticipants(issue, issue.Poster, mentions); err != nil { - log.Error(4, "mailIssueCommentToParticipants: %v", err) - } - - return nil -} diff --git a/models/login_source.go b/models/login_source.go deleted file mode 100644 index 584f3f9bc92..00000000000 --- a/models/login_source.go +++ /dev/null @@ -1,558 +0,0 @@ -// Copyright 2014 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 models - -import ( - "crypto/tls" - "encoding/json" - "errors" - "fmt" - "net/smtp" - "net/textproto" - "strings" - "time" - - "github.com/Unknwon/com" - "github.com/go-macaron/binding" - "github.com/go-xorm/core" - "github.com/go-xorm/xorm" - - "github.com/gogits/gogs/modules/auth/ldap" - "github.com/gogits/gogs/modules/auth/pam" - "github.com/gogits/gogs/modules/log" -) - -type LoginType int - -// Note: new type must append to the end of list to maintain compatibility. -const ( - LOGIN_NOTYPE LoginType = iota - LOGIN_PLAIN // 1 - LOGIN_LDAP // 2 - LOGIN_SMTP // 3 - LOGIN_PAM // 4 - LOGIN_DLDAP // 5 -) - -var LoginNames = map[LoginType]string{ - LOGIN_LDAP: "LDAP (via BindDN)", - LOGIN_DLDAP: "LDAP (simple auth)", // Via direct bind - LOGIN_SMTP: "SMTP", - LOGIN_PAM: "PAM", -} - -var SecurityProtocolNames = map[ldap.SecurityProtocol]string{ - ldap.SECURITY_PROTOCOL_UNENCRYPTED: "Unencrypted", - ldap.SECURITY_PROTOCOL_LDAPS: "LDAPS", - ldap.SECURITY_PROTOCOL_START_TLS: "StartTLS", -} - -// Ensure structs implemented interface. -var ( - _ core.Conversion = &LDAPConfig{} - _ core.Conversion = &SMTPConfig{} - _ core.Conversion = &PAMConfig{} -) - -type LDAPConfig struct { - *ldap.Source -} - -func (cfg *LDAPConfig) FromDB(bs []byte) error { - return json.Unmarshal(bs, &cfg) -} - -func (cfg *LDAPConfig) ToDB() ([]byte, error) { - return json.Marshal(cfg) -} - -func (cfg *LDAPConfig) SecurityProtocolName() string { - return SecurityProtocolNames[cfg.SecurityProtocol] -} - -type SMTPConfig struct { - Auth string - Host string - Port int - AllowedDomains string `xorm:"TEXT"` - TLS bool - SkipVerify bool -} - -func (cfg *SMTPConfig) FromDB(bs []byte) error { - return json.Unmarshal(bs, cfg) -} - -func (cfg *SMTPConfig) ToDB() ([]byte, error) { - return json.Marshal(cfg) -} - -type PAMConfig struct { - ServiceName string // pam service (e.g. system-auth) -} - -func (cfg *PAMConfig) FromDB(bs []byte) error { - return json.Unmarshal(bs, &cfg) -} - -func (cfg *PAMConfig) ToDB() ([]byte, error) { - return json.Marshal(cfg) -} - -// 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:"NOT NULL DEFAULT false"` - Cfg core.Conversion `xorm:"TEXT"` - - Created time.Time `xorm:"-"` - CreatedUnix int64 - Updated time.Time `xorm:"-"` - UpdatedUnix int64 -} - -func (s *LoginSource) BeforeInsert() { - s.CreatedUnix = time.Now().Unix() - s.UpdatedUnix = s.CreatedUnix -} - -func (s *LoginSource) BeforeUpdate() { - s.UpdatedUnix = time.Now().Unix() -} - -// Cell2Int64 converts a xorm.Cell type to int64, -// and handles possible irregular cases. -func Cell2Int64(val xorm.Cell) int64 { - switch (*val).(type) { - case []uint8: - log.Trace("Cell2Int64 ([]uint8): %v", *val) - return com.StrTo(string((*val).([]uint8))).MustInt64() - } - return (*val).(int64) -} - -func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) { - switch colName { - case "type": - switch LoginType(Cell2Int64(val)) { - case LOGIN_LDAP, LOGIN_DLDAP: - source.Cfg = new(LDAPConfig) - case LOGIN_SMTP: - source.Cfg = new(SMTPConfig) - case LOGIN_PAM: - source.Cfg = new(PAMConfig) - default: - panic("unrecognized login source type: " + com.ToStr(*val)) - } - } -} - -func (s *LoginSource) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "created_unix": - s.Created = time.Unix(s.CreatedUnix, 0).Local() - case "updated_unix": - s.Updated = time.Unix(s.UpdatedUnix, 0).Local() - } -} - -func (source *LoginSource) TypeName() string { - return LoginNames[source.Type] -} - -func (source *LoginSource) IsLDAP() bool { - return source.Type == LOGIN_LDAP -} - -func (source *LoginSource) IsDLDAP() bool { - return source.Type == LOGIN_DLDAP -} - -func (source *LoginSource) IsSMTP() bool { - return source.Type == LOGIN_SMTP -} - -func (source *LoginSource) IsPAM() bool { - return source.Type == LOGIN_PAM -} - -func (source *LoginSource) HasTLS() bool { - return ((source.IsLDAP() || source.IsDLDAP()) && - source.LDAP().SecurityProtocol > ldap.SECURITY_PROTOCOL_UNENCRYPTED) || - source.IsSMTP() -} - -func (source *LoginSource) UseTLS() bool { - switch source.Type { - case LOGIN_LDAP, LOGIN_DLDAP: - return source.LDAP().SecurityProtocol != ldap.SECURITY_PROTOCOL_UNENCRYPTED - case LOGIN_SMTP: - return source.SMTP().TLS - } - - return false -} - -func (source *LoginSource) SkipVerify() bool { - switch source.Type { - case LOGIN_LDAP, LOGIN_DLDAP: - return source.LDAP().SkipVerify - case LOGIN_SMTP: - return source.SMTP().SkipVerify - } - - return false -} - -func (source *LoginSource) LDAP() *LDAPConfig { - return source.Cfg.(*LDAPConfig) -} - -func (source *LoginSource) SMTP() *SMTPConfig { - return source.Cfg.(*SMTPConfig) -} - -func (source *LoginSource) PAM() *PAMConfig { - return source.Cfg.(*PAMConfig) -} -func CreateLoginSource(source *LoginSource) error { - has, err := x.Get(&LoginSource{Name: source.Name}) - if err != nil { - return err - } else if has { - return ErrLoginSourceAlreadyExist{source.Name} - } - - _, err = x.Insert(source) - return err -} - -func LoginSources() ([]*LoginSource, error) { - auths := make([]*LoginSource, 0, 5) - return auths, x.Find(&auths) -} - -// GetLoginSourceByID returns login source by given ID. -func GetLoginSourceByID(id int64) (*LoginSource, error) { - source := new(LoginSource) - has, err := x.Id(id).Get(source) - if err != nil { - return nil, err - } else if !has { - return nil, ErrLoginSourceNotExist{id} - } - return source, nil -} - -func UpdateSource(source *LoginSource) error { - _, err := x.Id(source.ID).AllCols().Update(source) - return err -} - -func DeleteSource(source *LoginSource) error { - count, err := x.Count(&User{LoginSource: source.ID}) - if err != nil { - return err - } else if count > 0 { - return ErrLoginSourceInUse{source.ID} - } - _, err = x.Id(source.ID).Delete(new(LoginSource)) - return err -} - -// CountLoginSources returns number of login sources. -func CountLoginSources() int64 { - count, _ := x.Count(new(LoginSource)) - return count -} - -// .____ ________ _____ __________ -// | | \______ \ / _ \\______ \ -// | | | | \ / /_\ \| ___/ -// | |___ | ` \/ | \ | -// |_______ \/_______ /\____|__ /____| -// \/ \/ \/ - -func composeFullName(firstname, surname, username string) string { - switch { - case len(firstname) == 0 && len(surname) == 0: - return username - case len(firstname) == 0: - return surname - case len(surname) == 0: - return firstname - default: - return firstname + " " + surname - } -} - -// 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, passowrd string, source *LoginSource, autoRegister bool) (*User, error) { - username, fn, sn, mail, isAdmin, succeed := source.Cfg.(*LDAPConfig).SearchEntry(login, passowrd, source.Type == LOGIN_DLDAP) - if !succeed { - // User not in LDAP, do nothing - return nil, ErrUserNotExist{0, login} - } - - if !autoRegister { - return user, nil - } - - // Fallback. - if len(username) == 0 { - 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 len(mail) == 0 { - mail = fmt.Sprintf("%s@localhost", username) - } - - user = &User{ - LowerName: strings.ToLower(username), - Name: username, - FullName: composeFullName(fn, sn, username), - Email: mail, - LoginType: source.Type, - LoginSource: source.ID, - LoginName: login, - IsActive: true, - IsAdmin: isAdmin, - } - return user, CreateUser(user) -} - -// _________ __________________________ -// / _____/ / \__ ___/\______ \ -// \_____ \ / \ / \| | | ___/ -// / \/ Y \ | | | -// /_______ /\____|__ /____| |____| -// \/ \/ - -type smtpLoginAuth struct { - username, password string -} - -func (auth *smtpLoginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) { - return "LOGIN", []byte(auth.username), nil -} - -func (auth *smtpLoginAuth) Next(fromServer []byte, more bool) ([]byte, error) { - if more { - switch string(fromServer) { - case "Username:": - return []byte(auth.username), nil - case "Password:": - return []byte(auth.password), nil - } - } - return nil, nil -} - -const ( - SMTP_PLAIN = "PLAIN" - SMTP_LOGIN = "LOGIN" -) - -var SMTPAuths = []string{SMTP_PLAIN, SMTP_LOGIN} - -func SMTPAuth(a smtp.Auth, cfg *SMTPConfig) error { - c, err := smtp.Dial(fmt.Sprintf("%s:%d", cfg.Host, cfg.Port)) - if err != nil { - return err - } - defer c.Close() - - if err = c.Hello("gogs"); err != nil { - return err - } - - if cfg.TLS { - if ok, _ := c.Extension("STARTTLS"); ok { - if err = c.StartTLS(&tls.Config{ - InsecureSkipVerify: cfg.SkipVerify, - ServerName: cfg.Host, - }); err != nil { - return err - } - } else { - return errors.New("SMTP server unsupports TLS") - } - } - - if ok, _ := c.Extension("AUTH"); ok { - if err = c.Auth(a); err != nil { - return err - } - return nil - } - return ErrUnsupportedLoginType -} - -// LoginViaSMTP queries if login/password is valid against the SMTP, -// and create a local user if success when enabled. -func LoginViaSMTP(user *User, login, password string, sourceID int64, cfg *SMTPConfig, autoRegister bool) (*User, error) { - // Verify allowed domains. - if len(cfg.AllowedDomains) > 0 { - idx := strings.Index(login, "@") - if idx == -1 { - return nil, ErrUserNotExist{0, login} - } else if !com.IsSliceContainsStr(strings.Split(cfg.AllowedDomains, ","), login[idx+1:]) { - return nil, ErrUserNotExist{0, login} - } - } - - var auth smtp.Auth - if cfg.Auth == SMTP_PLAIN { - auth = smtp.PlainAuth("", login, password, cfg.Host) - } else if cfg.Auth == SMTP_LOGIN { - auth = &smtpLoginAuth{login, password} - } else { - return nil, errors.New("Unsupported SMTP auth type") - } - - if err := SMTPAuth(auth, cfg); err != nil { - // Check standard error format first, - // then fallback to worse case. - tperr, ok := err.(*textproto.Error) - if (ok && tperr.Code == 535) || - strings.Contains(err.Error(), "Username and Password not accepted") { - return nil, ErrUserNotExist{0, login} - } - return nil, err - } - - if !autoRegister { - return user, nil - } - - username := login - idx := strings.Index(login, "@") - if idx > -1 { - username = login[:idx] - } - - user = &User{ - LowerName: strings.ToLower(username), - Name: strings.ToLower(username), - Email: login, - Passwd: password, - LoginType: LOGIN_SMTP, - LoginSource: sourceID, - LoginName: login, - IsActive: true, - } - return user, CreateUser(user) -} - -// __________ _____ _____ -// \______ \/ _ \ / \ -// | ___/ /_\ \ / \ / \ -// | | / | \/ Y \ -// |____| \____|__ /\____|__ / -// \/ \/ - -// LoginViaPAM queries if login/password is valid against the PAM, -// and create a local user if success when enabled. -func LoginViaPAM(user *User, login, password string, sourceID int64, cfg *PAMConfig, autoRegister bool) (*User, error) { - if err := pam.PAMAuth(cfg.ServiceName, login, password); err != nil { - if strings.Contains(err.Error(), "Authentication failure") { - return nil, ErrUserNotExist{0, login} - } - return nil, err - } - - if !autoRegister { - return user, nil - } - - user = &User{ - LowerName: strings.ToLower(login), - Name: login, - Email: login, - Passwd: password, - LoginType: LOGIN_PAM, - LoginSource: sourceID, - LoginName: login, - IsActive: true, - } - return user, CreateUser(user) -} - -func ExternalUserLogin(user *User, login, password string, source *LoginSource, autoRegister bool) (*User, error) { - if !source.IsActived { - return nil, ErrLoginSourceNotActived - } - - switch source.Type { - case LOGIN_LDAP, LOGIN_DLDAP: - return LoginViaLDAP(user, login, password, source, autoRegister) - case LOGIN_SMTP: - return LoginViaSMTP(user, login, password, source.ID, source.Cfg.(*SMTPConfig), autoRegister) - case LOGIN_PAM: - return LoginViaPAM(user, login, password, source.ID, source.Cfg.(*PAMConfig), autoRegister) - } - - return nil, ErrUnsupportedLoginType -} - -// UserSignIn validates user name and password. -func UserSignIn(username, passowrd string) (*User, error) { - var user *User - if strings.Contains(username, "@") { - user = &User{Email: strings.ToLower(username)} - } else { - user = &User{LowerName: strings.ToLower(username)} - } - - hasUser, err := x.Get(user) - if err != nil { - return nil, err - } - - if hasUser { - switch user.LoginType { - case LOGIN_NOTYPE, LOGIN_PLAIN: - if user.ValidatePassword(passowrd) { - return user, nil - } - - return nil, ErrUserNotExist{user.ID, user.Name} - - default: - var source LoginSource - hasSource, err := x.Id(user.LoginSource).Get(&source) - if err != nil { - return nil, err - } else if !hasSource { - return nil, ErrLoginSourceNotExist{user.LoginSource} - } - - return ExternalUserLogin(user, user.LoginName, passowrd, &source, false) - } - } - - sources := make([]*LoginSource, 0, 3) - if err = x.UseBool().Find(&sources, &LoginSource{IsActived: true}); err != nil { - return nil, err - } - - for _, source := range sources { - authUser, err := ExternalUserLogin(nil, username, passowrd, source, true) - if err == nil { - return authUser, nil - } - - log.Warn("Failed to login '%s' via '%s': %v", username, source.Name, err) - } - - return nil, ErrUserNotExist{user.ID, user.Name} -} diff --git a/models/mail.go b/models/mail.go deleted file mode 100644 index 0db21355a8a..00000000000 --- a/models/mail.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2016 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 models - -import ( - "fmt" - "html/template" - "path" - - "gopkg.in/gomail.v2" - "gopkg.in/macaron.v1" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/mailer" - "github.com/gogits/gogs/modules/markdown" - "github.com/gogits/gogs/modules/setting" -) - -const ( - MAIL_AUTH_ACTIVATE base.TplName = "auth/activate" - MAIL_AUTH_ACTIVATE_EMAIL base.TplName = "auth/activate_email" - MAIL_AUTH_RESET_PASSWORD base.TplName = "auth/reset_passwd" - MAIL_AUTH_REGISTER_NOTIFY base.TplName = "auth/register_notify" - - MAIL_ISSUE_COMMENT base.TplName = "issue/comment" - MAIL_ISSUE_MENTION base.TplName = "issue/mention" - - MAIL_NOTIFY_COLLABORATOR base.TplName = "notify/collaborator" -) - -type MailRender interface { - HTMLString(string, interface{}, ...macaron.HTMLOptions) (string, error) -} - -var mailRender MailRender - -func InitMailRender(dir, appendDir string, funcMap []template.FuncMap) { - opt := &macaron.RenderOptions{ - Directory: dir, - AppendDirectories: []string{appendDir}, - Funcs: funcMap, - Extensions: []string{".tmpl", ".html"}, - } - ts := macaron.NewTemplateSet() - ts.Set(macaron.DEFAULT_TPL_SET_NAME, opt) - - mailRender = &macaron.TplRender{ - TemplateSet: ts, - Opt: opt, - } -} - -func SendTestMail(email string) error { - return gomail.Send(&mailer.Sender{}, mailer.NewMessage([]string{email}, "Gogs Test Email!", "Gogs Test Email!").Message) -} - -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, - "Code": code, - } - body, err := mailRender.HTMLString(string(tpl), data) - if err != nil { - log.Error(3, "HTMLString: %v", err) - return - } - - msg := mailer.NewMessage([]string{u.Email}, subject, body) - msg.Info = fmt.Sprintf("UID: %d, %s", u.ID, info) - - mailer.SendAsync(msg) -} - -func SendActivateAccountMail(c *macaron.Context, u *User) { - SendUserMail(c, u, MAIL_AUTH_ACTIVATE, u.GenerateActivateCode(), c.Tr("mail.activate_account"), "activate account") -} - -func SendResetPasswordMail(c *macaron.Context, u *User) { - SendUserMail(c, u, MAIL_AUTH_RESET_PASSWORD, u.GenerateActivateCode(), c.Tr("mail.reset_password"), "reset password") -} - -// SendActivateAccountMail sends confirmation email. -func SendActivateEmailMail(c *macaron.Context, u *User, email *EmailAddress) { - data := map[string]interface{}{ - "Username": u.DisplayName(), - "ActiveCodeLives": setting.Service.ActiveCodeLives / 60, - "Code": u.GenerateEmailActivateCode(email.Email), - "Email": email.Email, - } - body, err := mailRender.HTMLString(string(MAIL_AUTH_ACTIVATE_EMAIL), data) - if err != nil { - log.Error(3, "HTMLString: %v", err) - return - } - - msg := mailer.NewMessage([]string{email.Email}, c.Tr("mail.activate_email"), body) - msg.Info = fmt.Sprintf("UID: %d, activate email", u.ID) - - mailer.SendAsync(msg) -} - -// SendRegisterNotifyMail triggers a notify e-mail by admin created a account. -func SendRegisterNotifyMail(c *macaron.Context, u *User) { - data := map[string]interface{}{ - "Username": u.DisplayName(), - } - body, err := mailRender.HTMLString(string(MAIL_AUTH_REGISTER_NOTIFY), data) - if err != nil { - log.Error(3, "HTMLString: %v", err) - return - } - - msg := mailer.NewMessage([]string{u.Email}, c.Tr("mail.register_notify"), body) - msg.Info = fmt.Sprintf("UID: %d, registration notify", u.ID) - - mailer.SendAsync(msg) -} - -// SendCollaboratorMail sends mail notification to new collaborator. -func SendCollaboratorMail(u, doer *User, repo *Repository) { - repoName := path.Join(repo.Owner.Name, repo.Name) - subject := fmt.Sprintf("%s added you to %s", doer.DisplayName(), repoName) - - data := map[string]interface{}{ - "Subject": subject, - "RepoName": repoName, - "Link": repo.HTMLURL(), - } - body, err := mailRender.HTMLString(string(MAIL_NOTIFY_COLLABORATOR), data) - if err != nil { - log.Error(3, "HTMLString: %v", err) - return - } - - msg := mailer.NewMessage([]string{u.Email}, subject, body) - msg.Info = fmt.Sprintf("UID: %d, add collaborator", u.ID) - - mailer.SendAsync(msg) -} - -func composeTplData(subject, body, link string) map[string]interface{} { - data := make(map[string]interface{}, 10) - data["Subject"] = subject - data["Body"] = body - data["Link"] = link - return data -} - -func composeIssueMessage(issue *Issue, doer *User, tplName base.TplName, tos []string, info string) *mailer.Message { - subject := issue.MailSubject() - body := string(markdown.RenderSpecialLink([]byte(issue.Content), issue.Repo.HTMLURL(), issue.Repo.ComposeMetas())) - data := composeTplData(subject, body, issue.HTMLURL()) - data["Doer"] = doer - content, err := mailRender.HTMLString(string(tplName), data) - if err != nil { - log.Error(3, "HTMLString (%s): %v", tplName, err) - } - msg := mailer.NewMessageFrom(tos, fmt.Sprintf(`"%s" <%s>`, doer.DisplayName(), setting.MailService.User), subject, content) - msg.Info = fmt.Sprintf("Subject: %s, %s", subject, info) - return msg -} - -// SendIssueCommentMail composes and sends issue comment emails to target receivers. -func SendIssueCommentMail(issue *Issue, doer *User, tos []string) { - if len(tos) == 0 { - return - } - - mailer.SendAsync(composeIssueMessage(issue, doer, MAIL_ISSUE_COMMENT, tos, "issue comment")) -} - -// SendIssueMentionMail composes and sends issue mention emails to target receivers. -func SendIssueMentionMail(issue *Issue, doer *User, tos []string) { - if len(tos) == 0 { - return - } - mailer.SendAsync(composeIssueMessage(issue, doer, MAIL_ISSUE_MENTION, tos, "issue mention")) -} diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go deleted file mode 100644 index edd07a66ec1..00000000000 --- a/models/migrations/migrations.go +++ /dev/null @@ -1,681 +0,0 @@ -// Copyright 2015 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 ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - "strings" - "time" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - gouuid "github.com/satori/go.uuid" - "gopkg.in/ini.v1" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -const _MIN_DB_VER = 4 - -type Migration interface { - Description() string - Migrate(*xorm.Engine) error -} - -type migration struct { - description string - migrate func(*xorm.Engine) error -} - -func NewMigration(desc string, fn func(*xorm.Engine) error) Migration { - return &migration{desc, fn} -} - -func (m *migration) Description() string { - return m.description -} - -func (m *migration) Migrate(x *xorm.Engine) error { - return m.migrate(x) -} - -// The version table. Should have only one row with id==1 -type Version struct { - ID int64 `xorm:"pk autoincr"` - Version int64 -} - -// This is a sequence of migrations. Add new migrations to the bottom of the list. -// If you want to "retire" a migration, remove it from the top of the list and -// update _MIN_VER_DB accordingly -var migrations = []Migration{ - // v0 -> v4: before 0.6.0 -> 0.7.33 - NewMigration("fix locale file load panic", fixLocaleFileLoadPanic), // V4 -> V5:v0.6.0 - NewMigration("trim action compare URL prefix", trimCommitActionAppUrlPrefix), // V5 -> V6:v0.6.3 - NewMigration("generate issue-label from issue", issueToIssueLabel), // V6 -> V7:v0.6.4 - NewMigration("refactor attachment table", attachmentRefactor), // V7 -> V8:v0.6.4 - NewMigration("rename pull request fields", renamePullRequestFields), // V8 -> V9:v0.6.16 - NewMigration("clean up migrate repo info", cleanUpMigrateRepoInfo), // V9 -> V10:v0.6.20 - NewMigration("generate rands and salt for organizations", generateOrgRandsAndSalt), // V10 -> V11:v0.8.5 - NewMigration("convert date to unix timestamp", convertDateToUnix), // V11 -> V12:v0.9.2 - NewMigration("convert LDAP UseSSL option to SecurityProtocol", ldapUseSSLToSecurityProtocol), // V12 -> V13:v0.9.37 - - // v13 -> v14:v0.9.87 - NewMigration("set comment updated with created", setCommentUpdatedWithCreated), -} - -// Migrate database to current version -func Migrate(x *xorm.Engine) error { - if err := x.Sync(new(Version)); err != nil { - return fmt.Errorf("sync: %v", err) - } - - currentVersion := &Version{ID: 1} - has, err := x.Get(currentVersion) - if err != nil { - return fmt.Errorf("get: %v", err) - } else if !has { - // If the version record does not exist we think - // it is a fresh installation and we can skip all migrations. - currentVersion.Version = int64(_MIN_DB_VER + len(migrations)) - - if _, err = x.InsertOne(currentVersion); err != nil { - return fmt.Errorf("insert: %v", err) - } - } - - v := currentVersion.Version - if _MIN_DB_VER > v { - log.Fatal(4, `Gogs no longer supports auto-migration from your previously installed version. -Please try to upgrade to a lower version (>= v0.6.0) first, then upgrade to current version.`) - return nil - } - - if int(v-_MIN_DB_VER) > len(migrations) { - // User downgraded Gogs. - currentVersion.Version = int64(len(migrations) + _MIN_DB_VER) - _, err = x.Id(1).Update(currentVersion) - return err - } - for i, m := range migrations[v-_MIN_DB_VER:] { - log.Info("Migration: %s", m.Description()) - if err = m.Migrate(x); err != nil { - return fmt.Errorf("do migrate: %v", err) - } - currentVersion.Version = v + int64(i) + 1 - if _, err = x.Id(1).Update(currentVersion); err != nil { - return err - } - } - 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 { - return fmt.Errorf("load custom config: %v", err) - } - - cfg.DeleteSection("i18n") - if err = cfg.SaveTo(setting.CustomConf); err != nil { - return fmt.Errorf("save custom config: %v", err) - } - - setting.Langs = strings.Split(strings.Replace(strings.Join(setting.Langs, ","), "fr-CA", "fr-FR", 1), ",") - return nil -} - -func trimCommitActionAppUrlPrefix(x *xorm.Engine) error { - type PushCommit struct { - Sha1 string - Message string - AuthorEmail string - AuthorName string - } - - type PushCommits struct { - Len int - Commits []*PushCommit - CompareUrl string - } - - type Action struct { - ID int64 `xorm:"pk autoincr"` - Content string `xorm:"TEXT"` - } - - results, err := x.Query("SELECT `id`,`content` FROM `action` WHERE `op_type`=?", 5) - if err != nil { - return fmt.Errorf("select commit actions: %v", err) - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - var pushCommits *PushCommits - for _, action := range results { - actID := com.StrTo(string(action["id"])).MustInt64() - if actID == 0 { - continue - } - - pushCommits = new(PushCommits) - if err = json.Unmarshal(action["content"], pushCommits); err != nil { - return fmt.Errorf("unmarshal action content[%d]: %v", actID, err) - } - - infos := strings.Split(pushCommits.CompareUrl, "/") - if len(infos) <= 4 { - continue - } - pushCommits.CompareUrl = strings.Join(infos[len(infos)-4:], "/") - - p, err := json.Marshal(pushCommits) - if err != nil { - return fmt.Errorf("marshal action content[%d]: %v", actID, err) - } - - if _, err = sess.Id(actID).Update(&Action{ - Content: string(p), - }); err != nil { - return fmt.Errorf("update action[%d]: %v", actID, err) - } - } - return sess.Commit() -} - -func issueToIssueLabel(x *xorm.Engine) error { - type IssueLabel struct { - ID int64 `xorm:"pk autoincr"` - IssueID int64 `xorm:"UNIQUE(s)"` - LabelID int64 `xorm:"UNIQUE(s)"` - } - - issueLabels := make([]*IssueLabel, 0, 50) - results, err := x.Query("SELECT `id`,`label_ids` FROM `issue`") - if err != nil { - if strings.Contains(err.Error(), "no such column") || - strings.Contains(err.Error(), "Unknown column") { - return nil - } - return fmt.Errorf("select issues: %v", err) - } - for _, issue := range results { - issueID := com.StrTo(issue["id"]).MustInt64() - - // Just in case legacy code can have duplicated IDs for same label. - mark := make(map[int64]bool) - for _, idStr := range strings.Split(string(issue["label_ids"]), "|") { - labelID := com.StrTo(strings.TrimPrefix(idStr, "$")).MustInt64() - if labelID == 0 || mark[labelID] { - continue - } - - mark[labelID] = true - issueLabels = append(issueLabels, &IssueLabel{ - IssueID: issueID, - LabelID: labelID, - }) - } - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = sess.Sync2(new(IssueLabel)); err != nil { - return fmt.Errorf("Sync2: %v", err) - } else if _, err = sess.Insert(issueLabels); err != nil { - return fmt.Errorf("insert issue-labels: %v", err) - } - - return sess.Commit() -} - -func attachmentRefactor(x *xorm.Engine) error { - type Attachment struct { - ID int64 `xorm:"pk autoincr"` - UUID string `xorm:"uuid INDEX"` - - // For rename purpose. - Path string `xorm:"-"` - NewPath string `xorm:"-"` - } - - results, err := x.Query("SELECT * FROM `attachment`") - if err != nil { - return fmt.Errorf("select attachments: %v", err) - } - - attachments := make([]*Attachment, 0, len(results)) - for _, attach := range results { - if !com.IsExist(string(attach["path"])) { - // If the attachment is already missing, there is no point to update it. - continue - } - attachments = append(attachments, &Attachment{ - ID: com.StrTo(attach["id"]).MustInt64(), - UUID: gouuid.NewV4().String(), - Path: string(attach["path"]), - }) - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = sess.Sync2(new(Attachment)); err != nil { - return fmt.Errorf("Sync2: %v", err) - } - - // Note: Roll back for rename can be a dead loop, - // so produces a backup file. - var buf bytes.Buffer - buf.WriteString("# old path -> new path\n") - - // Update database first because this is where error happens the most often. - for _, attach := range attachments { - if _, err = sess.Id(attach.ID).Update(attach); err != nil { - return err - } - - attach.NewPath = path.Join(setting.AttachmentPath, attach.UUID[0:1], attach.UUID[1:2], attach.UUID) - buf.WriteString(attach.Path) - buf.WriteString("\t") - buf.WriteString(attach.NewPath) - buf.WriteString("\n") - } - - // Then rename attachments. - isSucceed := true - defer func() { - if isSucceed { - return - } - - dumpPath := path.Join(setting.LogRootPath, "attachment_path.dump") - ioutil.WriteFile(dumpPath, buf.Bytes(), 0666) - fmt.Println("Fail to rename some attachments, old and new paths are saved into:", dumpPath) - }() - for _, attach := range attachments { - if err = os.MkdirAll(path.Dir(attach.NewPath), os.ModePerm); err != nil { - isSucceed = false - return err - } - - if err = os.Rename(attach.Path, attach.NewPath); err != nil { - isSucceed = false - return err - } - } - - return sess.Commit() -} - -func renamePullRequestFields(x *xorm.Engine) (err error) { - type PullRequest struct { - ID int64 `xorm:"pk autoincr"` - PullID int64 `xorm:"INDEX"` - PullIndex int64 - HeadBarcnh string - - IssueID int64 `xorm:"INDEX"` - Index int64 - HeadBranch string - } - - if err = x.Sync(new(PullRequest)); err != nil { - return fmt.Errorf("sync: %v", err) - } - - results, err := x.Query("SELECT `id`,`pull_id`,`pull_index`,`head_barcnh` FROM `pull_request`") - if err != nil { - if strings.Contains(err.Error(), "no such column") { - return nil - } - return fmt.Errorf("select pull requests: %v", err) - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - var pull *PullRequest - for _, pr := range results { - pull = &PullRequest{ - ID: com.StrTo(pr["id"]).MustInt64(), - IssueID: com.StrTo(pr["pull_id"]).MustInt64(), - Index: com.StrTo(pr["pull_index"]).MustInt64(), - HeadBranch: string(pr["head_barcnh"]), - } - if pull.Index == 0 { - continue - } - if _, err = sess.Id(pull.ID).Update(pull); err != nil { - return err - } - } - - return sess.Commit() -} - -func cleanUpMigrateRepoInfo(x *xorm.Engine) (err error) { - type ( - User struct { - ID int64 `xorm:"pk autoincr"` - LowerName string - } - Repository struct { - ID int64 `xorm:"pk autoincr"` - OwnerID int64 - LowerName string - } - ) - - repos := make([]*Repository, 0, 25) - if err = x.Where("is_mirror=?", false).Find(&repos); err != nil { - return fmt.Errorf("select all non-mirror repositories: %v", err) - } - var user *User - for _, repo := range repos { - user = &User{ID: repo.OwnerID} - has, err := x.Get(user) - if err != nil { - return fmt.Errorf("get owner of repository[%d - %d]: %v", repo.ID, repo.OwnerID, err) - } else if !has { - continue - } - - configPath := filepath.Join(setting.RepoRootPath, user.LowerName, repo.LowerName+".git/config") - - // In case repository file is somehow missing. - if !com.IsFile(configPath) { - continue - } - - cfg, err := ini.Load(configPath) - if err != nil { - return fmt.Errorf("open config file: %v", err) - } - cfg.DeleteSection("remote \"origin\"") - if err = cfg.SaveToIndent(configPath, "\t"); err != nil { - return fmt.Errorf("save config file: %v", err) - } - } - - return nil -} - -func generateOrgRandsAndSalt(x *xorm.Engine) (err error) { - type User struct { - ID int64 `xorm:"pk autoincr"` - Rands string `xorm:"VARCHAR(10)"` - Salt string `xorm:"VARCHAR(10)"` - } - - orgs := make([]*User, 0, 10) - if err = x.Where("type=1").And("rands=''").Find(&orgs); err != nil { - return fmt.Errorf("select all organizations: %v", err) - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - for _, org := range orgs { - org.Rands = base.GetRandomString(10) - org.Salt = base.GetRandomString(10) - if _, err = sess.Id(org.ID).Update(org); err != nil { - return err - } - } - - return sess.Commit() -} - -type TAction struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 -} - -func (t *TAction) TableName() string { return "action" } - -type TNotice struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 -} - -func (t *TNotice) TableName() string { return "notice" } - -type TComment struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 -} - -func (t *TComment) TableName() string { return "comment" } - -type TIssue struct { - ID int64 `xorm:"pk autoincr"` - DeadlineUnix int64 - CreatedUnix int64 - UpdatedUnix int64 -} - -func (t *TIssue) TableName() string { return "issue" } - -type TMilestone struct { - ID int64 `xorm:"pk autoincr"` - DeadlineUnix int64 - ClosedDateUnix int64 -} - -func (t *TMilestone) TableName() string { return "milestone" } - -type TAttachment struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 -} - -func (t *TAttachment) TableName() string { return "attachment" } - -type TLoginSource struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 - UpdatedUnix int64 -} - -func (t *TLoginSource) TableName() string { return "login_source" } - -type TPull struct { - ID int64 `xorm:"pk autoincr"` - MergedUnix int64 -} - -func (t *TPull) TableName() string { return "pull_request" } - -type TRelease struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 -} - -func (t *TRelease) TableName() string { return "release" } - -type TRepo struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 - UpdatedUnix int64 -} - -func (t *TRepo) TableName() string { return "repository" } - -type TMirror struct { - ID int64 `xorm:"pk autoincr"` - UpdatedUnix int64 - NextUpdateUnix int64 -} - -func (t *TMirror) TableName() string { return "mirror" } - -type TPublicKey struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 - UpdatedUnix int64 -} - -func (t *TPublicKey) TableName() string { return "public_key" } - -type TDeployKey struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 - UpdatedUnix int64 -} - -func (t *TDeployKey) TableName() string { return "deploy_key" } - -type TAccessToken struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 - UpdatedUnix int64 -} - -func (t *TAccessToken) TableName() string { return "access_token" } - -type TUser struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 - UpdatedUnix int64 -} - -func (t *TUser) TableName() string { return "user" } - -type TWebhook struct { - ID int64 `xorm:"pk autoincr"` - CreatedUnix int64 - UpdatedUnix int64 -} - -func (t *TWebhook) TableName() string { return "webhook" } - -func convertDateToUnix(x *xorm.Engine) (err error) { - log.Info("This migration could take up to minutes, please be patient.") - type Bean struct { - ID int64 `xorm:"pk autoincr"` - Created time.Time - Updated time.Time - Merged time.Time - Deadline time.Time - ClosedDate time.Time - NextUpdate time.Time - } - - var tables = []struct { - name string - cols []string - bean interface{} - }{ - {"action", []string{"created"}, new(TAction)}, - {"notice", []string{"created"}, new(TNotice)}, - {"comment", []string{"created"}, new(TComment)}, - {"issue", []string{"deadline", "created", "updated"}, new(TIssue)}, - {"milestone", []string{"deadline", "closed_date"}, new(TMilestone)}, - {"attachment", []string{"created"}, new(TAttachment)}, - {"login_source", []string{"created", "updated"}, new(TLoginSource)}, - {"pull_request", []string{"merged"}, new(TPull)}, - {"release", []string{"created"}, new(TRelease)}, - {"repository", []string{"created", "updated"}, new(TRepo)}, - {"mirror", []string{"updated", "next_update"}, new(TMirror)}, - {"public_key", []string{"created", "updated"}, new(TPublicKey)}, - {"deploy_key", []string{"created", "updated"}, new(TDeployKey)}, - {"access_token", []string{"created", "updated"}, new(TAccessToken)}, - {"user", []string{"created", "updated"}, new(TUser)}, - {"webhook", []string{"created", "updated"}, new(TWebhook)}, - } - - for _, table := range tables { - log.Info("Converting table: %s", table.name) - if err = x.Sync2(table.bean); err != nil { - return fmt.Errorf("Sync [table: %s]: %v", table.name, err) - } - - 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 { - 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)) - if len(beans) == 0 { - break - } - offset += 100 - - baseSQL := "UPDATE `" + table.name + "` SET " - for _, bean := range beans { - valSQLs := make([]string, 0, len(table.cols)) - for _, col := range table.cols { - fieldSQL := "" - fieldSQL += col + "_unix = " - - switch col { - case "deadline": - if bean.Deadline.IsZero() { - continue - } - fieldSQL += com.ToStr(bean.Deadline.Unix()) - case "created": - fieldSQL += com.ToStr(bean.Created.Unix()) - case "updated": - fieldSQL += com.ToStr(bean.Updated.Unix()) - case "closed_date": - fieldSQL += com.ToStr(bean.ClosedDate.Unix()) - case "merged": - fieldSQL += com.ToStr(bean.Merged.Unix()) - case "next_update": - fieldSQL += com.ToStr(bean.NextUpdate.Unix()) - } - - valSQLs = append(valSQLs, fieldSQL) - } - - if len(valSQLs) == 0 { - continue - } - - if _, err = x.Exec(baseSQL + strings.Join(valSQLs, ",") + " WHERE id = " + com.ToStr(bean.ID)); err != nil { - return fmt.Errorf("update bean [table: %s, id: %d]: %v", table.name, bean.ID, err) - } - } - } - } - - return nil -} diff --git a/models/migrations/v13.go b/models/migrations/v13.go deleted file mode 100644 index c9a50a992e0..00000000000 --- a/models/migrations/v13.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2016 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 ( - "encoding/json" - "fmt" - "strings" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" -) - -func ldapUseSSLToSecurityProtocol(x *xorm.Engine) error { - results, err := x.Query("SELECT `id`,`cfg` FROM `login_source` WHERE `type` = 2 OR `type` = 5") - if err != nil { - if strings.Contains(err.Error(), "no such column") { - return nil - } - return fmt.Errorf("select LDAP login sources: %v", err) - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - for _, result := range results { - cfg := map[string]interface{}{} - if err = json.Unmarshal(result["cfg"], &cfg); err != nil { - return fmt.Errorf("decode JSON config: %v", err) - } - if com.ToStr(cfg["UseSSL"]) == "true" { - cfg["SecurityProtocol"] = 1 // LDAPS - } - delete(cfg, "UseSSL") - - data, err := json.Marshal(&cfg) - if err != nil { - return fmt.Errorf("encode JSON config: %v", err) - } - - if _, err = sess.Exec("UPDATE `login_source` SET `cfg`=? WHERE `id`=?", - string(data), com.StrTo(result["id"]).MustInt64()); err != nil { - return fmt.Errorf("update config column: %v", err) - } - } - return sess.Commit() -} diff --git a/models/migrations/v14.go b/models/migrations/v14.go deleted file mode 100644 index 79c31133f43..00000000000 --- a/models/migrations/v14.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2016 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 setCommentUpdatedWithCreated(x *xorm.Engine) (err error) { - type Comment struct { - UpdatedUnix int64 - } - - if err = x.Sync2(new(Comment)); err != nil { - return fmt.Errorf("Sync2: %v", err) - } else if _, err = x.Exec("UPDATE comment SET updated_unix = created_unix"); err != nil { - return fmt.Errorf("set update_unix: %v", err) - } - return nil -} diff --git a/models/models.go b/models/models.go deleted file mode 100644 index 0cf422a9a16..00000000000 --- a/models/models.go +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright 2014 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 models - -import ( - "database/sql" - "errors" - "fmt" - "net/url" - "os" - "path" - "strings" - - _ "github.com/go-sql-driver/mysql" - "github.com/go-xorm/core" - "github.com/go-xorm/xorm" - _ "github.com/lib/pq" - - "github.com/gogits/gogs/models/migrations" - "github.com/gogits/gogs/modules/setting" -) - -// Engine represents a xorm engine or session. -type Engine interface { - Delete(interface{}) (int64, error) - Exec(string, ...interface{}) (sql.Result, error) - Find(interface{}, ...interface{}) error - Get(interface{}) (bool, error) - Id(interface{}) *xorm.Session - In(string, ...interface{}) *xorm.Session - Insert(...interface{}) (int64, error) - InsertOne(interface{}) (int64, error) - Iterate(interface{}, xorm.IterFunc) error - Sql(string, ...interface{}) *xorm.Session - Where(interface{}, ...interface{}) *xorm.Session -} - -func sessionRelease(sess *xorm.Session) { - if !sess.IsCommitedOrRollbacked { - sess.Rollback() - } - sess.Close() -} - -var ( - x *xorm.Engine - tables []interface{} - HasEngine bool - - DbCfg struct { - Type, Host, Name, User, Passwd, Path, SSLMode string - } - - EnableSQLite3 bool - EnableTiDB bool -) - -func init() { - tables = append(tables, - new(User), new(PublicKey), new(AccessToken), - new(Repository), new(DeployKey), new(Collaboration), new(Access), new(Upload), - new(Watch), new(Star), new(Follow), new(Action), - new(Issue), new(PullRequest), new(Comment), new(Attachment), new(IssueUser), - new(Label), new(IssueLabel), new(Milestone), - new(Mirror), new(Release), new(LoginSource), new(Webhook), - new(UpdateTask), new(HookTask), - new(Team), new(OrgUser), new(TeamUser), new(TeamRepo), - new(Notice), new(EmailAddress)) - - gonicNames := []string{"SSL"} - for _, name := range gonicNames { - core.LintGonicMapper[name] = true - } -} - -func LoadConfigs() { - sec := setting.Cfg.Section("database") - DbCfg.Type = sec.Key("DB_TYPE").String() - switch DbCfg.Type { - case "sqlite3": - setting.UseSQLite3 = true - case "mysql": - setting.UseMySQL = true - case "postgres": - setting.UsePostgreSQL = true - case "tidb": - setting.UseTiDB = true - } - DbCfg.Host = sec.Key("HOST").String() - DbCfg.Name = sec.Key("NAME").String() - DbCfg.User = sec.Key("USER").String() - if len(DbCfg.Passwd) == 0 { - DbCfg.Passwd = sec.Key("PASSWD").String() - } - DbCfg.SSLMode = sec.Key("SSL_MODE").String() - DbCfg.Path = sec.Key("PATH").MustString("data/gogs.db") -} - -// parsePostgreSQLHostPort parses given input in various forms defined in -// https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING -// and returns proper host and port number. -func parsePostgreSQLHostPort(info string) (string, string) { - host, port := "127.0.0.1", "5432" - if strings.Contains(info, ":") && !strings.HasSuffix(info, "]") { - idx := strings.LastIndex(info, ":") - host = info[:idx] - port = info[idx+1:] - } else if len(info) > 0 { - host = info - } - return host, port -} - -func getEngine() (*xorm.Engine, error) { - connStr := "" - var Param string = "?" - if strings.Contains(DbCfg.Name, Param) { - Param = "&" - } - switch DbCfg.Type { - case "mysql": - if DbCfg.Host[0] == '/' { // looks like a unix socket - connStr = fmt.Sprintf("%s:%s@unix(%s)/%s%scharset=utf8&parseTime=true", - DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param) - } else { - connStr = fmt.Sprintf("%s:%s@tcp(%s)/%s%scharset=utf8&parseTime=true", - DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param) - } - case "postgres": - host, port := parsePostgreSQLHostPort(DbCfg.Host) - if host[0] == '/' { // looks like a unix socket - connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s", - url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), port, DbCfg.Name, Param, DbCfg.SSLMode, host) - } else { - connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s", - url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), host, port, DbCfg.Name, Param, DbCfg.SSLMode) - } - case "sqlite3": - if !EnableSQLite3 { - return nil, errors.New("This binary version does not build support for SQLite3.") - } - if err := os.MkdirAll(path.Dir(DbCfg.Path), os.ModePerm); err != nil { - return nil, fmt.Errorf("Fail to create directories: %v", err) - } - connStr = "file:" + DbCfg.Path + "?cache=shared&mode=rwc" - case "tidb": - if !EnableTiDB { - return nil, errors.New("This binary version does not build support for TiDB.") - } - if err := os.MkdirAll(path.Dir(DbCfg.Path), os.ModePerm); err != nil { - return nil, fmt.Errorf("Fail to create directories: %v", err) - } - connStr = "goleveldb://" + DbCfg.Path - default: - return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type) - } - return xorm.NewEngine(DbCfg.Type, connStr) -} - -func NewTestEngine(x *xorm.Engine) (err error) { - x, err = getEngine() - if err != nil { - return fmt.Errorf("Connect to database: %v", err) - } - - x.SetMapper(core.GonicMapper{}) - return x.StoreEngine("InnoDB").Sync2(tables...) -} - -func SetEngine() (err error) { - x, err = getEngine() - if err != nil { - return fmt.Errorf("Fail to connect to database: %v", err) - } - - x.SetMapper(core.GonicMapper{}) - - // WARNING: for serv command, MUST remove the output to os.stdout, - // so use log file to instead print to stdout. - logPath := path.Join(setting.LogRootPath, "xorm.log") - os.MkdirAll(path.Dir(logPath), os.ModePerm) - - f, err := os.Create(logPath) - if err != nil { - return fmt.Errorf("Fail to create xorm.log: %v", err) - } - x.SetLogger(xorm.NewSimpleLogger(f)) - x.ShowSQL(true) - return nil -} - -func NewEngine() (err error) { - if err = SetEngine(); err != nil { - return err - } - - if err = migrations.Migrate(x); err != nil { - return fmt.Errorf("migrate: %v", err) - } - - if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil { - return fmt.Errorf("sync database struct error: %v\n", err) - } - - return nil -} - -type Statistic struct { - Counter struct { - User, Org, PublicKey, - Repo, Watch, Star, Action, Access, - Issue, Comment, Oauth, Follow, - Mirror, Release, LoginSource, Webhook, - Milestone, Label, HookTask, - Team, UpdateTask, Attachment int64 - } -} - -func GetStatistic() (stats Statistic) { - stats.Counter.User = CountUsers() - stats.Counter.Org = CountOrganizations() - stats.Counter.PublicKey, _ = x.Count(new(PublicKey)) - stats.Counter.Repo = CountRepositories(true) - stats.Counter.Watch, _ = x.Count(new(Watch)) - stats.Counter.Star, _ = x.Count(new(Star)) - stats.Counter.Action, _ = x.Count(new(Action)) - stats.Counter.Access, _ = x.Count(new(Access)) - stats.Counter.Issue, _ = x.Count(new(Issue)) - stats.Counter.Comment, _ = x.Count(new(Comment)) - stats.Counter.Oauth = 0 - stats.Counter.Follow, _ = x.Count(new(Follow)) - stats.Counter.Mirror, _ = x.Count(new(Mirror)) - stats.Counter.Release, _ = x.Count(new(Release)) - stats.Counter.LoginSource = CountLoginSources() - stats.Counter.Webhook, _ = x.Count(new(Webhook)) - stats.Counter.Milestone, _ = x.Count(new(Milestone)) - stats.Counter.Label, _ = x.Count(new(Label)) - stats.Counter.HookTask, _ = x.Count(new(HookTask)) - stats.Counter.Team, _ = x.Count(new(Team)) - stats.Counter.UpdateTask, _ = x.Count(new(UpdateTask)) - stats.Counter.Attachment, _ = x.Count(new(Attachment)) - return -} - -func Ping() error { - return x.Ping() -} - -// DumpDatabase dumps all data from database to file system. -func DumpDatabase(filePath string) error { - return x.DumpAllToFile(filePath) -} diff --git a/models/models_sqlite.go b/models/models_sqlite.go deleted file mode 100644 index c77e5ae5a66..00000000000 --- a/models/models_sqlite.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build sqlite - -// Copyright 2014 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 models - -import ( - _ "github.com/mattn/go-sqlite3" -) - -func init() { - EnableSQLite3 = true -} diff --git a/models/models_test.go b/models/models_test.go deleted file mode 100644 index f68590c509b..00000000000 --- a/models/models_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2016 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 models - -import ( - "testing" - - . "github.com/smartystreets/goconvey/convey" -) - -func Test_parsePostgreSQLHostPort(t *testing.T) { - testSuites := []struct { - input string - host, port string - }{ - {"127.0.0.1:1234", "127.0.0.1", "1234"}, - {"127.0.0.1", "127.0.0.1", "5432"}, - {"[::1]:1234", "[::1]", "1234"}, - {"[::1]", "[::1]", "5432"}, - {"/tmp/pg.sock:1234", "/tmp/pg.sock", "1234"}, - {"/tmp/pg.sock", "/tmp/pg.sock", "5432"}, - } - - Convey("Parse PostgreSQL host and port", t, func() { - for _, suite := range testSuites { - host, port := parsePostgreSQLHostPort(suite.input) - So(host, ShouldEqual, suite.host) - So(port, ShouldEqual, suite.port) - } - }) -} diff --git a/models/models_tidb.go b/models/models_tidb.go deleted file mode 100644 index 4dadd00a9b9..00000000000 --- a/models/models_tidb.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build tidb go1.4.2 - -// Copyright 2015 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 models - -import ( - _ "github.com/go-xorm/tidb" - "github.com/ngaut/log" - _ "github.com/pingcap/tidb" -) - -func init() { - EnableTiDB = true - log.SetLevelByString("error") -} diff --git a/models/org.go b/models/org.go deleted file mode 100644 index 706b1889790..00000000000 --- a/models/org.go +++ /dev/null @@ -1,547 +0,0 @@ -// Copyright 2014 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 models - -import ( - "errors" - "fmt" - "os" - "strings" - - "github.com/go-xorm/xorm" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" -) - -var ( - ErrOrgNotExist = errors.New("Organization does not exist") - ErrTeamNotExist = errors.New("Team does not exist") -) - -// IsOwnedBy returns true if given user is in the owner team. -func (org *User) IsOwnedBy(uid int64) bool { - return IsOrganizationOwner(org.ID, uid) -} - -// IsOrgMember returns true if given user is member of organization. -func (org *User) IsOrgMember(uid int64) bool { - return org.IsOrganization() && IsOrganizationMember(org.ID, uid) -} - -func (org *User) getTeam(e Engine, name string) (*Team, error) { - return getTeam(e, org.ID, name) -} - -// GetTeam returns named team of organization. -func (org *User) GetTeam(name string) (*Team, error) { - return org.getTeam(x, name) -} - -func (org *User) getOwnerTeam(e Engine) (*Team, error) { - return org.getTeam(e, OWNER_TEAM) -} - -// GetOwnerTeam returns owner team of organization. -func (org *User) GetOwnerTeam() (*Team, error) { - return org.getOwnerTeam(x) -} - -func (org *User) getTeams(e Engine) error { - return e.Where("org_id=?", org.ID).Find(&org.Teams) -} - -// GetTeams returns all teams that belong to organization. -func (org *User) GetTeams() error { - return org.getTeams(x) -} - -// GetMembers returns all members of organization. -func (org *User) GetMembers() error { - ous, err := GetOrgUsersByOrgID(org.ID) - if err != nil { - return err - } - - org.Members = make([]*User, len(ous)) - for i, ou := range ous { - org.Members[i], err = GetUserByID(ou.Uid) - if err != nil { - return err - } - } - return nil -} - -// AddMember adds new member to organization. -func (org *User) AddMember(uid int64) error { - return AddOrgUser(org.ID, uid) -} - -// RemoveMember removes member from organization. -func (org *User) RemoveMember(uid int64) error { - return RemoveOrgUser(org.ID, uid) -} - -func (org *User) removeOrgRepo(e Engine, repoID int64) error { - return removeOrgRepo(e, org.ID, repoID) -} - -// RemoveOrgRepo removes all team-repository relations of organization. -func (org *User) RemoveOrgRepo(repoID int64) error { - return org.removeOrgRepo(x, repoID) -} - -// CreateOrganization creates record of a new organization. -func CreateOrganization(org, owner *User) (err error) { - if err = IsUsableUsername(org.Name); err != nil { - return err - } - - isExist, err := IsUserExist(0, org.Name) - if err != nil { - return err - } else if isExist { - return ErrUserAlreadyExist{org.Name} - } - - org.LowerName = strings.ToLower(org.Name) - org.Rands = GetUserSalt() - org.Salt = GetUserSalt() - org.UseCustomAvatar = true - org.MaxRepoCreation = -1 - org.NumTeams = 1 - org.NumMembers = 1 - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Insert(org); err != nil { - return fmt.Errorf("insert organization: %v", err) - } - org.GenerateRandomAvatar() - - // Add initial creator to organization and owner team. - if _, err = sess.Insert(&OrgUser{ - Uid: owner.ID, - OrgID: org.ID, - IsOwner: true, - NumTeams: 1, - }); err != nil { - return fmt.Errorf("insert org-user relation: %v", err) - } - - // Create default owner team. - t := &Team{ - OrgID: org.ID, - LowerName: strings.ToLower(OWNER_TEAM), - Name: OWNER_TEAM, - Authorize: ACCESS_MODE_OWNER, - NumMembers: 1, - } - if _, err = sess.Insert(t); err != nil { - return fmt.Errorf("insert owner team: %v", err) - } - - if _, err = sess.Insert(&TeamUser{ - Uid: owner.ID, - OrgID: org.ID, - TeamID: t.ID, - }); err != nil { - return fmt.Errorf("insert team-user relation: %v", err) - } - - if err = os.MkdirAll(UserPath(org.Name), os.ModePerm); err != nil { - return fmt.Errorf("create directory: %v", err) - } - - return sess.Commit() -} - -// GetOrgByName returns organization by given name. -func GetOrgByName(name string) (*User, error) { - if len(name) == 0 { - return nil, ErrOrgNotExist - } - u := &User{ - LowerName: strings.ToLower(name), - Type: USER_TYPE_ORGANIZATION, - } - has, err := x.Get(u) - if err != nil { - return nil, err - } else if !has { - return nil, ErrOrgNotExist - } - return u, nil -} - -// CountOrganizations returns number of organizations. -func CountOrganizations() int64 { - count, _ := x.Where("type=1").Count(new(User)) - return count -} - -// Organizations returns number of organizations in given page. -func Organizations(page, pageSize int) ([]*User, error) { - orgs := make([]*User, 0, pageSize) - return orgs, x.Limit(pageSize, (page-1)*pageSize).Where("type=1").Asc("id").Find(&orgs) -} - -// DeleteOrganization completely and permanently deletes everything of organization. -func DeleteOrganization(org *User) (err error) { - if err := DeleteUser(org); err != nil { - return err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = deleteBeans(sess, - &Team{OrgID: org.ID}, - &OrgUser{OrgID: org.ID}, - &TeamUser{OrgID: org.ID}, - ); err != nil { - return fmt.Errorf("deleteBeans: %v", err) - } - - if err = deleteUser(sess, org); err != nil { - return fmt.Errorf("deleteUser: %v", err) - } - - return sess.Commit() -} - -// ________ ____ ___ -// \_____ \_______ ____ | | \______ ___________ -// / | \_ __ \/ ___\| | / ___// __ \_ __ \ -// / | \ | \/ /_/ > | /\___ \\ ___/| | \/ -// \_______ /__| \___ /|______//____ >\___ >__| -// \/ /_____/ \/ \/ - -// OrgUser represents an organization-user relation. -type OrgUser struct { - ID int64 `xorm:"pk autoincr"` - Uid int64 `xorm:"INDEX UNIQUE(s)"` - OrgID int64 `xorm:"INDEX UNIQUE(s)"` - IsPublic bool - IsOwner bool - NumTeams int -} - -// IsOrganizationOwner returns true if given user is in the owner team. -func IsOrganizationOwner(orgId, uid int64) bool { - has, _ := x.Where("is_owner=?", true).And("uid=?", uid).And("org_id=?", orgId).Get(new(OrgUser)) - return has -} - -// IsOrganizationMember returns true if given user is member of organization. -func IsOrganizationMember(orgId, uid int64) bool { - has, _ := x.Where("uid=?", uid).And("org_id=?", orgId).Get(new(OrgUser)) - return has -} - -// IsPublicMembership returns true if given user public his/her membership. -func IsPublicMembership(orgId, uid int64) bool { - has, _ := x.Where("uid=?", uid).And("org_id=?", orgId).And("is_public=?", true).Get(new(OrgUser)) - return has -} - -func getOrgsByUserID(sess *xorm.Session, userID int64, showAll bool) ([]*User, error) { - orgs := make([]*User, 0, 10) - if !showAll { - sess.And("`org_user`.is_public=?", true) - } - return orgs, sess.And("`org_user`.uid=?", userID). - Join("INNER", "`org_user`", "`org_user`.org_id=`user`.id").Find(&orgs) -} - -// GetOrgsByUserID returns a list of organizations that the given user ID -// has joined. -func GetOrgsByUserID(userID int64, showAll bool) ([]*User, error) { - return getOrgsByUserID(x.NewSession(), userID, showAll) -} - -// GetOrgsByUserIDDesc returns a list of organizations that the given user ID -// has joined, ordered descending by the given condition. -func GetOrgsByUserIDDesc(userID int64, desc string, showAll bool) ([]*User, error) { - return getOrgsByUserID(x.NewSession().Desc(desc), userID, showAll) -} - -func getOwnedOrgsByUserID(sess *xorm.Session, userID int64) ([]*User, error) { - orgs := make([]*User, 0, 10) - return orgs, sess.Where("`org_user`.uid=?", userID).And("`org_user`.is_owner=?", true). - Join("INNER", "`org_user`", "`org_user`.org_id=`user`.id").Find(&orgs) -} - -// GetOwnedOrgsByUserID returns a list of organizations are owned by given user ID. -func GetOwnedOrgsByUserID(userID int64) ([]*User, error) { - sess := x.NewSession() - return getOwnedOrgsByUserID(sess, userID) -} - -// GetOwnedOrganizationsByUserIDDesc returns a list of organizations are owned by -// given user ID, ordered descending by the given condition. -func GetOwnedOrgsByUserIDDesc(userID int64, desc string) ([]*User, error) { - sess := x.NewSession() - return getOwnedOrgsByUserID(sess.Desc(desc), userID) -} - -// GetOrgUsersByUserID returns all organization-user relations by user ID. -func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) { - ous := make([]*OrgUser, 0, 10) - sess := x.Where("uid=?", uid) - if !all { - // Only show public organizations - sess.And("is_public=?", true) - } - err := sess.Find(&ous) - return ous, err -} - -// GetOrgUsersByOrgID returns all organization-user relations by organization ID. -func GetOrgUsersByOrgID(orgID int64) ([]*OrgUser, error) { - ous := make([]*OrgUser, 0, 10) - err := x.Where("org_id=?", orgID).Find(&ous) - return ous, err -} - -// ChangeOrgUserStatus changes public or private membership status. -func ChangeOrgUserStatus(orgID, uid int64, public bool) error { - ou := new(OrgUser) - has, err := x.Where("uid=?", uid).And("org_id=?", orgID).Get(ou) - if err != nil { - return err - } else if !has { - return nil - } - - ou.IsPublic = public - _, err = x.Id(ou.ID).AllCols().Update(ou) - return err -} - -// AddOrgUser adds new user to given organization. -func AddOrgUser(orgID, uid int64) error { - if IsOrganizationMember(orgID, uid) { - return nil - } - - sess := x.NewSession() - defer sess.Close() - if err := sess.Begin(); err != nil { - return err - } - - ou := &OrgUser{ - Uid: uid, - OrgID: orgID, - } - - if _, err := sess.Insert(ou); err != nil { - sess.Rollback() - return err - } else if _, err = sess.Exec("UPDATE `user` SET num_members = num_members + 1 WHERE id = ?", orgID); err != nil { - sess.Rollback() - return err - } - - return sess.Commit() -} - -// RemoveOrgUser removes user from given organization. -func RemoveOrgUser(orgID, userID int64) error { - ou := new(OrgUser) - - has, err := x.Where("uid=?", userID).And("org_id=?", orgID).Get(ou) - if err != nil { - return fmt.Errorf("get org-user: %v", err) - } else if !has { - return nil - } - - user, err := GetUserByID(userID) - if err != nil { - return fmt.Errorf("GetUserByID [%d]: %v", userID, err) - } - org, err := GetUserByID(orgID) - if err != nil { - return fmt.Errorf("GetUserByID [%d]: %v", orgID, err) - } - - // FIXME: only need to get IDs here, not all fields of repository. - repos, _, err := org.GetUserRepositories(user.ID, 1, org.NumRepos) - if err != nil { - return fmt.Errorf("GetUserRepositories [%d]: %v", user.ID, err) - } - - // Check if the user to delete is the last member in owner team. - if IsOrganizationOwner(orgID, userID) { - t, err := org.GetOwnerTeam() - if err != nil { - return err - } - if t.NumMembers == 1 { - return ErrLastOrgOwner{UID: userID} - } - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err := sess.Begin(); err != nil { - return err - } - - if _, err := sess.Id(ou.ID).Delete(ou); err != nil { - return err - } else if _, err = sess.Exec("UPDATE `user` SET num_members=num_members-1 WHERE id=?", orgID); err != nil { - return err - } - - // Delete all repository accesses and unwatch them. - repoIDs := make([]int64, len(repos)) - for i := range repos { - repoIDs = append(repoIDs, repos[i].ID) - if err = watchRepo(sess, user.ID, repos[i].ID, false); err != nil { - return err - } - } - - if len(repoIDs) > 0 { - if _, err = sess.Where("user_id = ?", user.ID).In("repo_id", repoIDs).Delete(new(Access)); err != nil { - return err - } - } - - // Delete member in his/her teams. - teams, err := getUserTeams(sess, org.ID, user.ID) - if err != nil { - return err - } - for _, t := range teams { - if err = removeTeamMember(sess, org.ID, t.ID, user.ID); err != nil { - return err - } - } - - return sess.Commit() -} - -func removeOrgRepo(e Engine, orgID, repoID int64) error { - _, err := e.Delete(&TeamRepo{ - OrgID: orgID, - RepoID: repoID, - }) - return err -} - -// RemoveOrgRepo removes all team-repository relations of given organization. -func RemoveOrgRepo(orgID, repoID int64) error { - return removeOrgRepo(x, orgID, repoID) -} - -func (org *User) getUserTeams(e Engine, userID int64, cols ...string) ([]*Team, error) { - teams := make([]*Team, 0, org.NumTeams) - return teams, e.Where("team_user.org_id = ?", org.ID). - And("team_user.uid = ?", userID). - Join("INNER", "team_user", "team_user.team_id = team.id"). - Cols(cols...).Find(&teams) -} - -// GetUserTeamIDs returns of all team IDs of the organization that user is memeber of. -func (org *User) GetUserTeamIDs(userID int64) ([]int64, error) { - teams, err := org.getUserTeams(x, userID, "team.id") - if err != nil { - return nil, fmt.Errorf("getUserTeams [%d]: %v", userID, err) - } - - teamIDs := make([]int64, len(teams)) - for i := range teams { - teamIDs[i] = teams[i].ID - } - return teamIDs, nil -} - -// GetTeams returns all teams that belong to organization, -// and that the user has joined. -func (org *User) GetUserTeams(userID int64) ([]*Team, error) { - return org.getUserTeams(x, userID) -} - -// GetUserRepositories returns a range of repositories in organization -// that the user with the given userID has access to, -// and total number of records based on given condition. -func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repository, int64, error) { - teamIDs, err := org.GetUserTeamIDs(userID) - if err != nil { - return nil, 0, fmt.Errorf("GetUserTeamIDs: %v", err) - } - if len(teamIDs) == 0 { - // user has no team but "IN ()" is invalid SQL - teamIDs = []int64{-1} // there is no repo with id=-1 - } - - if page <= 0 { - page = 1 - } - repos := make([]*Repository, 0, pageSize) - // FIXME: use XORM chain operations instead of raw SQL. - if err = x.Sql(fmt.Sprintf(`SELECT repository.* FROM repository - INNER JOIN team_repo - ON team_repo.repo_id = repository.id - WHERE (repository.owner_id = ? AND repository.is_private = ?) OR team_repo.team_id IN (%s) - GROUP BY repository.id - ORDER BY updated_unix DESC - LIMIT %d OFFSET %d`, - strings.Join(base.Int64sToStrings(teamIDs), ","), pageSize, (page-1)*pageSize), - org.ID, false).Find(&repos); err != nil { - return nil, 0, fmt.Errorf("get repositories: %v", err) - } - - results, err := x.Query(fmt.Sprintf(`SELECT repository.id FROM repository - INNER JOIN team_repo - ON team_repo.repo_id = repository.id - WHERE (repository.owner_id = ? AND repository.is_private = ?) OR team_repo.team_id IN (%s) - GROUP BY repository.id - ORDER BY updated_unix DESC`, - strings.Join(base.Int64sToStrings(teamIDs), ",")), - org.ID, false) - if err != nil { - log.Error(4, "count user repositories in organization: %v", err) - } - - return repos, int64(len(results)), nil -} - -// GetUserRepositories returns mirror repositories of the organization -// that the user with the given userID has access to. -func (org *User) GetUserMirrorRepositories(userID int64) ([]*Repository, error) { - teamIDs, err := org.GetUserTeamIDs(userID) - if err != nil { - return nil, fmt.Errorf("GetUserTeamIDs: %v", err) - } - if len(teamIDs) == 0 { - teamIDs = []int64{-1} - } - - repos := make([]*Repository, 0, 10) - if err = x.Sql(fmt.Sprintf(`SELECT repository.* FROM repository - INNER JOIN team_repo - ON team_repo.repo_id = repository.id AND repository.is_mirror = ? - WHERE (repository.owner_id = ? AND repository.is_private = ?) OR team_repo.team_id IN (%s) - GROUP BY repository.id - ORDER BY updated_unix DESC`, - strings.Join(base.Int64sToStrings(teamIDs), ",")), - true, org.ID, false).Find(&repos); err != nil { - return nil, fmt.Errorf("get repositories: %v", err) - } - return repos, nil -} diff --git a/models/org_team.go b/models/org_team.go deleted file mode 100644 index 6a6754cc99a..00000000000 --- a/models/org_team.go +++ /dev/null @@ -1,618 +0,0 @@ -// Copyright 2016 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 models - -import ( - "errors" - "fmt" - "strings" -) - -const OWNER_TEAM = "Owners" - -// Team represents a organization team. -type Team struct { - ID int64 `xorm:"pk autoincr"` - OrgID int64 `xorm:"INDEX"` - LowerName string - Name string - Description string - Authorize AccessMode - Repos []*Repository `xorm:"-"` - Members []*User `xorm:"-"` - NumRepos int - NumMembers int -} - -// IsOwnerTeam returns true if team is owner team. -func (t *Team) IsOwnerTeam() bool { - return t.Name == OWNER_TEAM -} - -// IsTeamMember returns true if given user is a member of team. -func (t *Team) IsMember(uid int64) bool { - return IsTeamMember(t.OrgID, t.ID, uid) -} - -func (t *Team) getRepositories(e Engine) (err error) { - teamRepos := make([]*TeamRepo, 0, t.NumRepos) - if err = x.Where("team_id=?", t.ID).Find(&teamRepos); err != nil { - return fmt.Errorf("get team-repos: %v", err) - } - - t.Repos = make([]*Repository, 0, len(teamRepos)) - for i := range teamRepos { - repo, err := getRepositoryByID(e, teamRepos[i].RepoID) - if err != nil { - return fmt.Errorf("getRepositoryById(%d): %v", teamRepos[i].RepoID, err) - } - t.Repos = append(t.Repos, repo) - } - return nil -} - -// GetRepositories returns all repositories in team of organization. -func (t *Team) GetRepositories() error { - return t.getRepositories(x) -} - -func (t *Team) getMembers(e Engine) (err error) { - t.Members, err = getTeamMembers(e, t.ID) - return err -} - -// GetMembers returns all members in team of organization. -func (t *Team) GetMembers() (err error) { - return t.getMembers(x) -} - -// AddMember adds new membership of the team to the organization, -// the user will have membership to the organization automatically when needed. -func (t *Team) AddMember(uid int64) error { - return AddTeamMember(t.OrgID, t.ID, uid) -} - -// RemoveMember removes member from team of organization. -func (t *Team) RemoveMember(uid int64) error { - return RemoveTeamMember(t.OrgID, t.ID, uid) -} - -func (t *Team) hasRepository(e Engine, repoID int64) bool { - return hasTeamRepo(e, t.OrgID, t.ID, repoID) -} - -// HasRepository returns true if given repository belong to team. -func (t *Team) HasRepository(repoID int64) bool { - return t.hasRepository(x, repoID) -} - -func (t *Team) addRepository(e Engine, repo *Repository) (err error) { - if err = addTeamRepo(e, t.OrgID, t.ID, repo.ID); err != nil { - return err - } - - t.NumRepos++ - if _, err = e.Id(t.ID).AllCols().Update(t); err != nil { - return fmt.Errorf("update team: %v", err) - } - - if err = repo.recalculateTeamAccesses(e, 0); err != nil { - return fmt.Errorf("recalculateAccesses: %v", err) - } - - if err = t.getMembers(e); err != nil { - return fmt.Errorf("getMembers: %v", err) - } - for _, u := range t.Members { - if err = watchRepo(e, u.ID, repo.ID, true); err != nil { - return fmt.Errorf("watchRepo: %v", err) - } - } - return nil -} - -// AddRepository adds new repository to team of organization. -func (t *Team) AddRepository(repo *Repository) (err error) { - if repo.OwnerID != t.OrgID { - return errors.New("Repository does not belong to organization") - } else if t.HasRepository(repo.ID) { - return nil - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = t.addRepository(sess, repo); err != nil { - return err - } - - return sess.Commit() -} - -func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (err error) { - if err = removeTeamRepo(e, t.ID, repo.ID); err != nil { - return err - } - - t.NumRepos-- - if _, err = e.Id(t.ID).AllCols().Update(t); err != nil { - return err - } - - // Don't need to recalculate when delete a repository from organization. - if recalculate { - if err = repo.recalculateTeamAccesses(e, t.ID); err != nil { - return err - } - } - - if err = t.getMembers(e); err != nil { - return fmt.Errorf("get team members: %v", err) - } - for _, u := range t.Members { - has, err := hasAccess(e, u, repo, ACCESS_MODE_READ) - if err != nil { - return err - } else if has { - continue - } - - if err = watchRepo(e, u.ID, repo.ID, false); err != nil { - return err - } - } - - return nil -} - -// RemoveRepository removes repository from team of organization. -func (t *Team) RemoveRepository(repoID int64) error { - if !t.HasRepository(repoID) { - return nil - } - - repo, err := GetRepositoryByID(repoID) - if err != nil { - return err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = t.removeRepository(sess, repo, true); err != nil { - return err - } - - return sess.Commit() -} - -// NewTeam creates a record of new team. -// It's caller's responsibility to assign organization ID. -func NewTeam(t *Team) error { - if len(t.Name) == 0 { - return errors.New("empty team name") - } - - has, err := x.Id(t.OrgID).Get(new(User)) - if err != nil { - return err - } else if !has { - return ErrOrgNotExist - } - - t.LowerName = strings.ToLower(t.Name) - has, err = x.Where("org_id=?", t.OrgID).And("lower_name=?", t.LowerName).Get(new(Team)) - if err != nil { - return err - } else if has { - return ErrTeamAlreadyExist{t.OrgID, t.LowerName} - } - - sess := x.NewSession() - defer sess.Close() - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Insert(t); err != nil { - sess.Rollback() - return err - } - - // Update organization number of teams. - if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams+1 WHERE id = ?", t.OrgID); err != nil { - sess.Rollback() - return err - } - return sess.Commit() -} - -func getTeam(e Engine, orgId int64, name string) (*Team, error) { - t := &Team{ - OrgID: orgId, - LowerName: strings.ToLower(name), - } - has, err := e.Get(t) - if err != nil { - return nil, err - } else if !has { - return nil, ErrTeamNotExist - } - return t, nil -} - -// GetTeam returns team by given team name and organization. -func GetTeam(orgId int64, name string) (*Team, error) { - return getTeam(x, orgId, name) -} - -func getTeamByID(e Engine, teamId int64) (*Team, error) { - t := new(Team) - has, err := e.Id(teamId).Get(t) - if err != nil { - return nil, err - } else if !has { - return nil, ErrTeamNotExist - } - return t, nil -} - -// GetTeamByID returns team by given ID. -func GetTeamByID(teamId int64) (*Team, error) { - return getTeamByID(x, teamId) -} - -// UpdateTeam updates information of team. -func UpdateTeam(t *Team, authChanged bool) (err error) { - if len(t.Name) == 0 { - return errors.New("empty team name") - } - - if len(t.Description) > 255 { - t.Description = t.Description[:255] - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - t.LowerName = strings.ToLower(t.Name) - has, err := x.Where("org_id=?", t.OrgID).And("lower_name=?", t.LowerName).And("id!=?", t.ID).Get(new(Team)) - if err != nil { - return err - } else if has { - return ErrTeamAlreadyExist{t.OrgID, t.LowerName} - } - - if _, err = sess.Id(t.ID).AllCols().Update(t); err != nil { - return fmt.Errorf("update: %v", err) - } - - // Update access for team members if needed. - if authChanged { - if err = t.getRepositories(sess); err != nil { - return fmt.Errorf("getRepositories:%v", err) - } - - for _, repo := range t.Repos { - if err = repo.recalculateTeamAccesses(sess, 0); err != nil { - return fmt.Errorf("recalculateTeamAccesses: %v", err) - } - } - } - - return sess.Commit() -} - -// DeleteTeam deletes given team. -// It's caller's responsibility to assign organization ID. -func DeleteTeam(t *Team) error { - if err := t.GetRepositories(); err != nil { - return err - } - - // Get organization. - org, err := GetUserByID(t.OrgID) - if err != nil { - return err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - // Delete all accesses. - for _, repo := range t.Repos { - if err = repo.recalculateTeamAccesses(sess, t.ID); err != nil { - return err - } - } - - // Delete team-user. - if _, err = sess.Where("org_id=?", org.ID).Where("team_id=?", t.ID).Delete(new(TeamUser)); err != nil { - return err - } - - // Delete team. - if _, err = sess.Id(t.ID).Delete(new(Team)); err != nil { - return err - } - // Update organization number of teams. - if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams-1 WHERE id=?", t.OrgID); err != nil { - return err - } - - return sess.Commit() -} - -// ___________ ____ ___ -// \__ ___/___ _____ _____ | | \______ ___________ -// | |_/ __ \\__ \ / \| | / ___// __ \_ __ \ -// | |\ ___/ / __ \| Y Y \ | /\___ \\ ___/| | \/ -// |____| \___ >____ /__|_| /______//____ >\___ >__| -// \/ \/ \/ \/ \/ - -// TeamUser represents an team-user relation. -type TeamUser struct { - ID int64 `xorm:"pk autoincr"` - OrgID int64 `xorm:"INDEX"` - TeamID int64 `xorm:"UNIQUE(s)"` - Uid int64 `xorm:"UNIQUE(s)"` -} - -func isTeamMember(e Engine, orgID, teamID, uid int64) bool { - has, _ := e.Where("org_id=?", orgID).And("team_id=?", teamID).And("uid=?", uid).Get(new(TeamUser)) - return has -} - -// IsTeamMember returns true if given user is a member of team. -func IsTeamMember(orgID, teamID, uid int64) bool { - return isTeamMember(x, orgID, teamID, uid) -} - -func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) { - teamUsers := make([]*TeamUser, 0, 10) - if err = e.Where("team_id=?", teamID).Find(&teamUsers); 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 = append(members, member) - } - return members, nil -} - -// GetTeamMembers returns all members in given team of organization. -func GetTeamMembers(teamID int64) ([]*User, error) { - return getTeamMembers(x, teamID) -} - -func getUserTeams(e Engine, orgId, uid int64) ([]*Team, error) { - tus := make([]*TeamUser, 0, 5) - if err := e.Where("uid=?", uid).And("org_id=?", orgId).Find(&tus); err != nil { - return nil, err - } - - ts := make([]*Team, len(tus)) - for i, tu := range tus { - t := new(Team) - has, err := e.Id(tu.TeamID).Get(t) - if err != nil { - return nil, err - } else if !has { - return nil, ErrTeamNotExist - } - ts[i] = t - } - return ts, nil -} - -// GetUserTeams returns all teams that user belongs to in given organization. -func GetUserTeams(orgId, uid int64) ([]*Team, error) { - return getUserTeams(x, orgId, uid) -} - -// AddTeamMember adds new membership of given team to given organization, -// the user will have membership to given organization automatically when needed. -func AddTeamMember(orgID, teamID, uid int64) error { - if IsTeamMember(orgID, teamID, uid) { - return nil - } - - if err := AddOrgUser(orgID, uid); err != nil { - return err - } - - // Get team and its repositories. - t, err := GetTeamByID(teamID) - if err != nil { - return err - } - t.NumMembers++ - - if err = t.GetRepositories(); err != nil { - return err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - tu := &TeamUser{ - Uid: uid, - OrgID: orgID, - TeamID: teamID, - } - if _, err = sess.Insert(tu); err != nil { - return err - } else if _, err = sess.Id(t.ID).Update(t); err != nil { - return err - } - - // Give access to team repositories. - for _, repo := range t.Repos { - if err = repo.recalculateTeamAccesses(sess, 0); err != nil { - return err - } - } - - // We make sure it exists before. - ou := new(OrgUser) - if _, err = sess.Where("uid = ?", uid).And("org_id = ?", orgID).Get(ou); err != nil { - return err - } - ou.NumTeams++ - if t.IsOwnerTeam() { - ou.IsOwner = true - } - if _, err = sess.Id(ou.ID).AllCols().Update(ou); err != nil { - return err - } - - return sess.Commit() -} - -func removeTeamMember(e Engine, orgID, teamID, uid int64) error { - if !isTeamMember(e, orgID, teamID, uid) { - return nil - } - - // Get team and its repositories. - t, err := getTeamByID(e, teamID) - if err != nil { - return err - } - - // Check if the user to delete is the last member in owner team. - if t.IsOwnerTeam() && t.NumMembers == 1 { - return ErrLastOrgOwner{UID: uid} - } - - t.NumMembers-- - - if err = t.getRepositories(e); err != nil { - return err - } - - // Get organization. - org, err := getUserByID(e, orgID) - if err != nil { - return err - } - - tu := &TeamUser{ - Uid: uid, - OrgID: orgID, - TeamID: teamID, - } - if _, err := e.Delete(tu); err != nil { - return err - } else if _, err = e.Id(t.ID).AllCols().Update(t); err != nil { - return err - } - - // Delete access to team repositories. - for _, repo := range t.Repos { - if err = repo.recalculateTeamAccesses(e, 0); err != nil { - return err - } - } - - // This must exist. - ou := new(OrgUser) - _, err = e.Where("uid = ?", uid).And("org_id = ?", org.ID).Get(ou) - if err != nil { - return err - } - ou.NumTeams-- - if t.IsOwnerTeam() { - ou.IsOwner = false - } - if _, err = e.Id(ou.ID).AllCols().Update(ou); err != nil { - return err - } - return nil -} - -// RemoveTeamMember removes member from given team of given organization. -func RemoveTeamMember(orgID, teamID, uid int64) error { - sess := x.NewSession() - defer sessionRelease(sess) - if err := sess.Begin(); err != nil { - return err - } - if err := removeTeamMember(sess, orgID, teamID, uid); err != nil { - return err - } - return sess.Commit() -} - -// ___________ __________ -// \__ ___/___ _____ _____\______ \ ____ ______ ____ -// | |_/ __ \\__ \ / \| _// __ \\____ \ / _ \ -// | |\ ___/ / __ \| Y Y \ | \ ___/| |_> > <_> ) -// |____| \___ >____ /__|_| /____|_ /\___ > __/ \____/ -// \/ \/ \/ \/ \/|__| - -// TeamRepo represents an team-repository relation. -type TeamRepo struct { - ID int64 `xorm:"pk autoincr"` - OrgID int64 `xorm:"INDEX"` - TeamID int64 `xorm:"UNIQUE(s)"` - RepoID int64 `xorm:"UNIQUE(s)"` -} - -func hasTeamRepo(e Engine, orgID, teamID, repoID int64) bool { - has, _ := e.Where("org_id=?", orgID).And("team_id=?", teamID).And("repo_id=?", repoID).Get(new(TeamRepo)) - return has -} - -// HasTeamRepo returns true if given repository belongs to team. -func HasTeamRepo(orgID, teamID, repoID int64) bool { - return hasTeamRepo(x, orgID, teamID, repoID) -} - -func addTeamRepo(e Engine, orgID, teamID, repoID int64) error { - _, err := e.InsertOne(&TeamRepo{ - OrgID: orgID, - TeamID: teamID, - RepoID: repoID, - }) - return err -} - -// AddTeamRepo adds new repository relation to team. -func AddTeamRepo(orgID, teamID, repoID int64) error { - return addTeamRepo(x, orgID, teamID, repoID) -} - -func removeTeamRepo(e Engine, teamID, repoID int64) error { - _, err := e.Delete(&TeamRepo{ - TeamID: teamID, - RepoID: repoID, - }) - return err -} - -// RemoveTeamRepo deletes repository relation to team. -func RemoveTeamRepo(teamID, repoID int64) error { - return removeTeamRepo(x, teamID, repoID) -} diff --git a/models/pull.go b/models/pull.go deleted file mode 100644 index 100d4db4358..00000000000 --- a/models/pull.go +++ /dev/null @@ -1,798 +0,0 @@ -// Copyright 2015 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 models - -import ( - "fmt" - "os" - "path" - "strings" - "time" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - - "github.com/gogits/git-module" - api "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/process" - "github.com/gogits/gogs/modules/setting" - "github.com/gogits/gogs/modules/sync" -) - -var PullRequestQueue = sync.NewUniqueQueue(setting.Repository.PullRequestQueueLength) - -type PullRequestType int - -const ( - PULL_REQUEST_GOGS PullRequestType = iota - PLLL_ERQUEST_GIT -) - -type PullRequestStatus int - -const ( - PULL_REQUEST_STATUS_CONFLICT PullRequestStatus = iota - PULL_REQUEST_STATUS_CHECKING - PULL_REQUEST_STATUS_MERGEABLE -) - -// PullRequest represents relation between pull request and repositories. -type PullRequest struct { - ID int64 `xorm:"pk autoincr"` - Type PullRequestType - Status PullRequestStatus - - IssueID int64 `xorm:"INDEX"` - Issue *Issue `xorm:"-"` - Index int64 - - HeadRepoID int64 - HeadRepo *Repository `xorm:"-"` - BaseRepoID int64 - BaseRepo *Repository `xorm:"-"` - HeadUserName string - HeadBranch string - BaseBranch string - MergeBase string `xorm:"VARCHAR(40)"` - - HasMerged bool - MergedCommitID string `xorm:"VARCHAR(40)"` - MergerID int64 - Merger *User `xorm:"-"` - Merged time.Time `xorm:"-"` - MergedUnix int64 -} - -func (pr *PullRequest) BeforeUpdate() { - pr.MergedUnix = pr.Merged.Unix() -} - -// Note: don't try to get Issue because will end up recursive querying. -func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "merged_unix": - if !pr.HasMerged { - return - } - - pr.Merged = time.Unix(pr.MergedUnix, 0).Local() - } -} - -// Note: don't try to get Issue because will end up recursive querying. -func (pr *PullRequest) loadAttributes(e Engine) (err error) { - if pr.HasMerged && pr.Merger == nil { - pr.Merger, err = getUserByID(e, pr.MergerID) - if IsErrUserNotExist(err) { - pr.MergerID = -1 - pr.Merger = NewGhostUser() - } else if err != nil { - return fmt.Errorf("getUserByID [%d]: %v", pr.MergerID, err) - } - } - - return nil -} - -func (pr *PullRequest) LoadAttributes() error { - return pr.loadAttributes(x) -} - -func (pr *PullRequest) LoadIssue() (err error) { - if pr.Issue != nil { - return nil - } - - pr.Issue, err = GetIssueByID(pr.IssueID) - return err -} - -// This method assumes following fields have been assigned with valid values: -// Required - Issue -// Optional - Merger -func (pr *PullRequest) APIFormat() *api.PullRequest { - apiIssue := pr.Issue.APIFormat() - apiPullRequest := &api.PullRequest{ - ID: pr.ID, - Index: pr.Index, - Poster: apiIssue.Poster, - Title: apiIssue.Title, - Body: apiIssue.Body, - Labels: apiIssue.Labels, - Milestone: apiIssue.Milestone, - Assignee: apiIssue.Assignee, - State: apiIssue.State, - Comments: apiIssue.Comments, - HTMLURL: pr.Issue.HTMLURL(), - HasMerged: pr.HasMerged, - } - - if pr.Status != PULL_REQUEST_STATUS_CHECKING { - mergeable := pr.Status != PULL_REQUEST_STATUS_CONFLICT - apiPullRequest.Mergeable = &mergeable - } - if pr.HasMerged { - apiPullRequest.Merged = &pr.Merged - apiPullRequest.MergedCommitID = &pr.MergedCommitID - apiPullRequest.MergedBy = pr.Merger.APIFormat() - } - - return apiPullRequest -} - -func (pr *PullRequest) getHeadRepo(e Engine) (err error) { - pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID) - if err != nil && !IsErrRepoNotExist(err) { - return fmt.Errorf("getRepositoryByID(head): %v", err) - } - return nil -} - -func (pr *PullRequest) GetHeadRepo() error { - return pr.getHeadRepo(x) -} - -func (pr *PullRequest) GetBaseRepo() (err error) { - if pr.BaseRepo != nil { - return nil - } - - pr.BaseRepo, err = GetRepositoryByID(pr.BaseRepoID) - if err != nil { - return fmt.Errorf("GetRepositoryByID(base): %v", err) - } - return nil -} - -// IsChecking returns true if this pull request is still checking conflict. -func (pr *PullRequest) IsChecking() bool { - return pr.Status == PULL_REQUEST_STATUS_CHECKING -} - -// CanAutoMerge returns true if this pull request can be merged automatically. -func (pr *PullRequest) CanAutoMerge() bool { - return pr.Status == PULL_REQUEST_STATUS_MERGEABLE -} - -// Merge merges pull request to base repository. -// FIXME: add repoWorkingPull make sure two merges does not happen at same time. -func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error) { - if err = pr.GetHeadRepo(); err != nil { - return fmt.Errorf("GetHeadRepo: %v", err) - } else if err = pr.GetBaseRepo(); err != nil { - return fmt.Errorf("GetBaseRepo: %v", err) - } - - defer func() { - go HookQueue.Add(pr.BaseRepo.ID) - go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false) - }() - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = pr.Issue.changeStatus(sess, doer, pr.Issue.Repo, true); err != nil { - return fmt.Errorf("Issue.changeStatus: %v", err) - } - - headRepoPath := RepoPath(pr.HeadUserName, pr.HeadRepo.Name) - headGitRepo, err := git.OpenRepository(headRepoPath) - if err != nil { - return fmt.Errorf("OpenRepository: %v", err) - } - - // Clone base repo. - tmpBasePath := path.Join(setting.AppDataPath, "tmp/repos", com.ToStr(time.Now().Nanosecond())+".git") - os.MkdirAll(path.Dir(tmpBasePath), os.ModePerm) - defer os.RemoveAll(path.Dir(tmpBasePath)) - - var stderr string - if _, stderr, err = process.ExecTimeout(5*time.Minute, - fmt.Sprintf("PullRequest.Merge (git clone): %s", tmpBasePath), - "git", "clone", baseGitRepo.Path, tmpBasePath); err != nil { - return fmt.Errorf("git clone: %s", stderr) - } - - // Check out base branch. - if _, stderr, err = process.ExecDir(-1, tmpBasePath, - fmt.Sprintf("PullRequest.Merge (git checkout): %s", tmpBasePath), - "git", "checkout", pr.BaseBranch); err != nil { - return fmt.Errorf("git checkout: %s", stderr) - } - - // Add head repo remote. - if _, stderr, err = process.ExecDir(-1, tmpBasePath, - fmt.Sprintf("PullRequest.Merge (git remote add): %s", tmpBasePath), - "git", "remote", "add", "head_repo", headRepoPath); err != nil { - return fmt.Errorf("git remote add [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) - } - - // Merge commits. - if _, stderr, err = process.ExecDir(-1, tmpBasePath, - fmt.Sprintf("PullRequest.Merge (git fetch): %s", tmpBasePath), - "git", "fetch", "head_repo"); err != nil { - return fmt.Errorf("git fetch [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) - } - - if _, stderr, err = process.ExecDir(-1, tmpBasePath, - fmt.Sprintf("PullRequest.Merge (git merge --no-ff --no-commit): %s", tmpBasePath), - "git", "merge", "--no-ff", "--no-commit", "head_repo/"+pr.HeadBranch); err != nil { - return fmt.Errorf("git merge --no-ff --no-commit [%s]: %v - %s", tmpBasePath, err, stderr) - } - - sig := doer.NewGitSig() - if _, stderr, err = process.ExecDir(-1, tmpBasePath, - fmt.Sprintf("PullRequest.Merge (git merge): %s", tmpBasePath), - "git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), - "-m", fmt.Sprintf("Merge branch '%s' of %s/%s into %s", pr.HeadBranch, pr.HeadUserName, pr.HeadRepo.Name, pr.BaseBranch)); err != nil { - return fmt.Errorf("git commit [%s]: %v - %s", tmpBasePath, err, stderr) - } - - // Push back to upstream. - if _, stderr, err = process.ExecDir(-1, tmpBasePath, - fmt.Sprintf("PullRequest.Merge (git push): %s", tmpBasePath), - "git", "push", baseGitRepo.Path, pr.BaseBranch); err != nil { - return fmt.Errorf("git push: %s", stderr) - } - - pr.MergedCommitID, err = headGitRepo.GetBranchCommitID(pr.HeadBranch) - if err != nil { - return fmt.Errorf("GetBranchCommit: %v", err) - } - - pr.HasMerged = true - pr.Merged = time.Now() - pr.MergerID = doer.ID - if _, err = sess.Id(pr.ID).AllCols().Update(pr); err != nil { - return fmt.Errorf("update pull request: %v", err) - } - - if err = sess.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) - } - - if err = MergePullRequestAction(doer, pr.Issue.Repo, pr.Issue); err != nil { - log.Error(4, "MergePullRequestAction [%d]: %v", pr.ID, err) - } - - // Reload pull request information. - if err = pr.LoadAttributes(); err != nil { - log.Error(4, "LoadAttributes: %v", err) - return nil - } - if err = PrepareWebhooks(pr.Issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ - Action: api.HOOK_ISSUE_CLOSED, - Index: pr.Index, - PullRequest: pr.APIFormat(), - Repository: pr.Issue.Repo.APIFormat(nil), - Sender: doer.APIFormat(), - }); err != nil { - log.Error(4, "PrepareWebhooks: %v", err) - return nil - } - - l, err := headGitRepo.CommitsBetweenIDs(pr.MergedCommitID, pr.MergeBase) - if err != nil { - log.Error(4, "CommitsBetweenIDs: %v", err) - return nil - } - - // TODO: when squash commits, no need to append merge commit. - // It is possible that head branch is not fully sync with base branch for merge commits, - // so we need to get latest head commit and append merge commit manully - // to avoid strange diff commits produced. - mergeCommit, err := baseGitRepo.GetBranchCommit(pr.BaseBranch) - if err != nil { - log.Error(4, "GetBranchCommit: %v", err) - return nil - } - l.PushFront(mergeCommit) - - p := &api.PushPayload{ - Ref: git.BRANCH_PREFIX + pr.BaseBranch, - Before: pr.MergeBase, - After: pr.MergedCommitID, - CompareURL: setting.AppUrl + pr.BaseRepo.ComposeCompareURL(pr.MergeBase, pr.MergedCommitID), - Commits: ListToPushCommits(l).ToApiPayloadCommits(pr.BaseRepo.HTMLURL()), - Repo: pr.BaseRepo.APIFormat(nil), - Pusher: pr.HeadRepo.MustOwner().APIFormat(), - Sender: doer.APIFormat(), - } - if err = PrepareWebhooks(pr.BaseRepo, HOOK_EVENT_PUSH, p); err != nil { - return fmt.Errorf("PrepareWebhooks: %v", err) - } - return nil -} - -// patchConflicts is a list of conflit description from Git. -var patchConflicts = []string{ - "patch does not apply", - "already exists in working directory", - "unrecognized input", - "error:", -} - -// testPatch checks if patch can be merged to base repository without conflit. -// FIXME: make a mechanism to clean up stable local copies. -func (pr *PullRequest) testPatch() (err error) { - if pr.BaseRepo == nil { - pr.BaseRepo, err = GetRepositoryByID(pr.BaseRepoID) - if err != nil { - return fmt.Errorf("GetRepositoryByID: %v", err) - } - } - - patchPath, err := pr.BaseRepo.PatchPath(pr.Index) - if err != nil { - return fmt.Errorf("BaseRepo.PatchPath: %v", err) - } - - // Fast fail if patch does not exist, this assumes data is cruppted. - if !com.IsFile(patchPath) { - log.Trace("PullRequest[%d].testPatch: ignored cruppted data", pr.ID) - return nil - } - - repoWorkingPool.CheckIn(com.ToStr(pr.BaseRepoID)) - defer repoWorkingPool.CheckOut(com.ToStr(pr.BaseRepoID)) - - log.Trace("PullRequest[%d].testPatch (patchPath): %s", pr.ID, patchPath) - - if err := pr.BaseRepo.UpdateLocalCopyBranch(pr.BaseBranch); err != nil { - return fmt.Errorf("UpdateLocalCopy: %v", err) - } - - pr.Status = PULL_REQUEST_STATUS_CHECKING - _, stderr, err := process.ExecDir(-1, pr.BaseRepo.LocalCopyPath(), - fmt.Sprintf("testPatch (git apply --check): %d", pr.BaseRepo.ID), - "git", "apply", "--check", patchPath) - if err != nil { - for i := range patchConflicts { - if strings.Contains(stderr, patchConflicts[i]) { - log.Trace("PullRequest[%d].testPatch (apply): has conflit", pr.ID) - fmt.Println(stderr) - pr.Status = PULL_REQUEST_STATUS_CONFLICT - return nil - } - } - - return fmt.Errorf("git apply --check: %v - %s", err, stderr) - } - return nil -} - -// 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) - if err = sess.Begin(); err != nil { - return err - } - - if err = newIssue(sess, NewIssueOptions{ - Repo: repo, - Issue: pull, - LableIDs: labelIDs, - Attachments: uuids, - IsPull: true, - }); err != nil { - return fmt.Errorf("newIssue: %v", err) - } - - pr.Index = pull.Index - if err = repo.SavePatch(pr.Index, patch); err != nil { - return fmt.Errorf("SavePatch: %v", err) - } - - pr.BaseRepo = repo - if err = pr.testPatch(); err != nil { - return fmt.Errorf("testPatch: %v", err) - } - // No conflict appears after test means mergeable. - if pr.Status == PULL_REQUEST_STATUS_CHECKING { - pr.Status = PULL_REQUEST_STATUS_MERGEABLE - } - - pr.IssueID = pull.ID - if _, err = sess.Insert(pr); err != nil { - return fmt.Errorf("insert pull repo: %v", err) - } - - if err = sess.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) - } - - if err = NotifyWatchers(&Action{ - ActUserID: pull.Poster.ID, - ActUserName: pull.Poster.Name, - OpType: ACTION_CREATE_PULL_REQUEST, - Content: fmt.Sprintf("%d|%s", pull.Index, pull.Title), - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, - }); err != nil { - log.Error(4, "NotifyWatchers: %v", err) - } else if err = pull.MailParticipants(); err != nil { - log.Error(4, "MailParticipants: %v", err) - } - - pr.Issue = pull - pull.PullRequest = pr - if err = PrepareWebhooks(repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ - Action: api.HOOK_ISSUE_OPENED, - Index: pull.Index, - PullRequest: pr.APIFormat(), - Repository: repo.APIFormat(nil), - Sender: pull.Poster.APIFormat(), - }); err != nil { - log.Error(4, "PrepareWebhooks: %v", err) - } - go HookQueue.Add(repo.ID) - - return nil -} - -// GetUnmergedPullRequest returnss a pull request that is open and has not been merged -// by given head/base and repo/branch. -func GetUnmergedPullRequest(headRepoID, baseRepoID int64, headBranch, baseBranch string) (*PullRequest, error) { - pr := new(PullRequest) - has, err := x.Where("head_repo_id=? AND head_branch=? AND base_repo_id=? AND base_branch=? AND has_merged=? AND issue.is_closed=?", - headRepoID, headBranch, baseRepoID, baseBranch, false, false). - Join("INNER", "issue", "issue.id=pull_request.issue_id").Get(pr) - if err != nil { - return nil, err - } else if !has { - return nil, ErrPullRequestNotExist{0, 0, headRepoID, baseRepoID, headBranch, baseBranch} - } - - return pr, nil -} - -// GetUnmergedPullRequestsByHeadInfo returnss all pull requests that are open and has not been merged -// by given head information (repo and branch). -func GetUnmergedPullRequestsByHeadInfo(repoID int64, branch string) ([]*PullRequest, error) { - prs := make([]*PullRequest, 0, 2) - return prs, x.Where("head_repo_id = ? AND head_branch = ? AND has_merged = ? AND issue.is_closed = ?", - repoID, branch, false, false). - Join("INNER", "issue", "issue.id = pull_request.issue_id").Find(&prs) -} - -// GetUnmergedPullRequestsByBaseInfo returnss all pull requests that are open and has not been merged -// by given base information (repo and branch). -func GetUnmergedPullRequestsByBaseInfo(repoID int64, branch string) ([]*PullRequest, error) { - prs := make([]*PullRequest, 0, 2) - return prs, x.Where("base_repo_id=? AND base_branch=? AND has_merged=? AND issue.is_closed=?", - repoID, branch, false, false). - Join("INNER", "issue", "issue.id=pull_request.issue_id").Find(&prs) -} - -func getPullRequestByID(e Engine, id int64) (*PullRequest, error) { - pr := new(PullRequest) - has, err := e.Id(id).Get(pr) - if err != nil { - return nil, err - } else if !has { - return nil, ErrPullRequestNotExist{id, 0, 0, 0, "", ""} - } - return pr, pr.loadAttributes(e) -} - -// GetPullRequestByID returns a pull request by given ID. -func GetPullRequestByID(id int64) (*PullRequest, error) { - return getPullRequestByID(x, id) -} - -func getPullRequestByIssueID(e Engine, issueID int64) (*PullRequest, error) { - pr := &PullRequest{ - IssueID: issueID, - } - has, err := e.Get(pr) - if err != nil { - return nil, err - } else if !has { - return nil, ErrPullRequestNotExist{0, issueID, 0, 0, "", ""} - } - return pr, pr.loadAttributes(e) -} - -// GetPullRequestByIssueID returns pull request by given issue ID. -func GetPullRequestByIssueID(issueID int64) (*PullRequest, error) { - return getPullRequestByIssueID(x, issueID) -} - -// Update updates all fields of pull request. -func (pr *PullRequest) Update() error { - _, err := x.Id(pr.ID).AllCols().Update(pr) - return err -} - -// Update updates specific fields of pull request. -func (pr *PullRequest) UpdateCols(cols ...string) error { - _, err := x.Id(pr.ID).Cols(cols...).Update(pr) - return err -} - -// UpdatePatch generates and saves a new patch. -func (pr *PullRequest) UpdatePatch() (err error) { - if err = pr.GetHeadRepo(); err != nil { - return fmt.Errorf("GetHeadRepo: %v", err) - } else if pr.HeadRepo == nil { - log.Trace("PullRequest[%d].UpdatePatch: ignored cruppted data", pr.ID) - return nil - } - - if err = pr.GetBaseRepo(); err != nil { - return fmt.Errorf("GetBaseRepo: %v", err) - } - - headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) - if err != nil { - return fmt.Errorf("OpenRepository: %v", err) - } - - // Add a temporary remote. - tmpRemote := com.ToStr(time.Now().UnixNano()) - if err = headGitRepo.AddRemote(tmpRemote, RepoPath(pr.BaseRepo.MustOwner().Name, pr.BaseRepo.Name), true); err != nil { - return fmt.Errorf("AddRemote: %v", err) - } - defer func() { - headGitRepo.RemoveRemote(tmpRemote) - }() - remoteBranch := "remotes/" + tmpRemote + "/" + pr.BaseBranch - pr.MergeBase, err = headGitRepo.GetMergeBase(remoteBranch, pr.HeadBranch) - if err != nil { - return fmt.Errorf("GetMergeBase: %v", err) - } else if err = pr.Update(); err != nil { - return fmt.Errorf("Update: %v", err) - } - - patch, err := headGitRepo.GetPatch(pr.MergeBase, pr.HeadBranch) - if err != nil { - return fmt.Errorf("GetPatch: %v", err) - } - - if err = pr.BaseRepo.SavePatch(pr.Index, patch); err != nil { - return fmt.Errorf("BaseRepo.SavePatch: %v", err) - } - - return nil -} - -// PushToBaseRepo pushes commits from branches of head repository to -// corresponding branches of base repository. -// FIXME: Only push branches that are actually updates? -func (pr *PullRequest) PushToBaseRepo() (err error) { - log.Trace("PushToBaseRepo[%d]: pushing commits to base repo 'refs/pull/%d/head'", pr.BaseRepoID, pr.Index) - - headRepoPath := pr.HeadRepo.RepoPath() - headGitRepo, err := git.OpenRepository(headRepoPath) - if err != nil { - return fmt.Errorf("OpenRepository: %v", err) - } - - tmpRemoteName := fmt.Sprintf("tmp-pull-%d", pr.ID) - if err = headGitRepo.AddRemote(tmpRemoteName, pr.BaseRepo.RepoPath(), false); err != nil { - return fmt.Errorf("headGitRepo.AddRemote: %v", err) - } - // Make sure to remove the remote even if the push fails - defer headGitRepo.RemoveRemote(tmpRemoteName) - - headFile := fmt.Sprintf("refs/pull/%d/head", pr.Index) - - // Remove head in case there is a conflict. - os.Remove(path.Join(pr.BaseRepo.RepoPath(), headFile)) - - if err = git.Push(headRepoPath, tmpRemoteName, fmt.Sprintf("%s:%s", pr.HeadBranch, headFile)); err != nil { - return fmt.Errorf("Push: %v", err) - } - - return nil -} - -// AddToTaskQueue adds itself to pull request test task queue. -func (pr *PullRequest) AddToTaskQueue() { - go PullRequestQueue.AddFunc(pr.ID, func() { - pr.Status = PULL_REQUEST_STATUS_CHECKING - if err := pr.UpdateCols("status"); err != nil { - log.Error(5, "AddToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err) - } - }) -} - -type PullRequestList []*PullRequest - -func (prs PullRequestList) loadAttributes(e Engine) error { - if len(prs) == 0 { - return nil - } - - // Load issues. - issueIDs := make([]int64, 0, len(prs)) - for i := range prs { - issueIDs = append(issueIDs, prs[i].IssueID) - } - issues := make([]*Issue, 0, len(issueIDs)) - if err := e.Where("id > 0").In("id", issueIDs).Find(&issues); err != nil { - return fmt.Errorf("find issues: %v", err) - } - - set := make(map[int64]*Issue) - for i := range issues { - set[issues[i].ID] = issues[i] - } - for i := range prs { - prs[i].Issue = set[prs[i].IssueID] - } - return nil -} - -func (prs PullRequestList) LoadAttributes() error { - return prs.loadAttributes(x) -} - -func addHeadRepoTasks(prs []*PullRequest) { - for _, pr := range prs { - log.Trace("addHeadRepoTasks[%d]: composing new test task", pr.ID) - if err := pr.UpdatePatch(); err != nil { - log.Error(4, "UpdatePatch: %v", err) - continue - } else if err := pr.PushToBaseRepo(); err != nil { - log.Error(4, "PushToBaseRepo: %v", err) - continue - } - - pr.AddToTaskQueue() - } -} - -// AddTestPullRequestTask adds new test tasks by given head/base repository and head/base branch, -// and generate new patch for testing as needed. -func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool) { - log.Trace("AddTestPullRequestTask [head_repo_id: %d, head_branch: %s]: finding pull requests", repoID, branch) - prs, err := GetUnmergedPullRequestsByHeadInfo(repoID, branch) - if err != nil { - log.Error(4, "Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err) - return - } - - if isSync { - if err = PullRequestList(prs).LoadAttributes(); err != nil { - log.Error(4, "PullRequestList.LoadAttributes: %v", err) - } - - if err == nil { - for _, pr := range prs { - pr.Issue.PullRequest = pr - if err = pr.Issue.LoadAttributes(); err != nil { - log.Error(4, "LoadAttributes: %v", err) - continue - } - if err = PrepareWebhooks(pr.Issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ - Action: api.HOOK_ISSUE_SYNCHRONIZED, - Index: pr.Issue.Index, - PullRequest: pr.Issue.PullRequest.APIFormat(), - Repository: pr.Issue.Repo.APIFormat(nil), - Sender: doer.APIFormat(), - }); err != nil { - log.Error(4, "PrepareWebhooks [pull_id: %v]: %v", pr.ID, err) - continue - } - go HookQueue.Add(pr.Issue.Repo.ID) - } - } - } - - addHeadRepoTasks(prs) - - log.Trace("AddTestPullRequestTask [base_repo_id: %d, base_branch: %s]: finding pull requests", repoID, branch) - prs, err = GetUnmergedPullRequestsByBaseInfo(repoID, branch) - if err != nil { - log.Error(4, "Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err) - return - } - for _, pr := range prs { - pr.AddToTaskQueue() - } -} - -func ChangeUsernameInPullRequests(oldUserName, newUserName string) error { - pr := PullRequest{ - HeadUserName: strings.ToLower(newUserName), - } - _, err := x.Cols("head_user_name").Where("head_user_name = ?", strings.ToLower(oldUserName)).Update(pr) - return err -} - -// checkAndUpdateStatus checks if pull request is possible to levaing checking status, -// and set to be either conflict or mergeable. -func (pr *PullRequest) checkAndUpdateStatus() { - // Status is not changed to conflict means mergeable. - if pr.Status == PULL_REQUEST_STATUS_CHECKING { - pr.Status = PULL_REQUEST_STATUS_MERGEABLE - } - - // Make sure there is no waiting test to process before levaing the checking status. - if !PullRequestQueue.Exist(pr.ID) { - if err := pr.UpdateCols("status"); err != nil { - log.Error(4, "Update[%d]: %v", pr.ID, err) - } - } -} - -// TestPullRequests checks and tests untested patches of pull requests. -// TODO: test more pull requests at same time. -func TestPullRequests() { - prs := make([]*PullRequest, 0, 10) - x.Iterate(PullRequest{ - Status: PULL_REQUEST_STATUS_CHECKING, - }, - func(idx int, bean interface{}) error { - pr := bean.(*PullRequest) - - if err := pr.GetBaseRepo(); err != nil { - log.Error(3, "GetBaseRepo: %v", err) - return nil - } - - if err := pr.testPatch(); err != nil { - log.Error(3, "testPatch: %v", err) - return nil - } - prs = append(prs, pr) - return nil - }) - - // Update pull request status. - for _, pr := range prs { - pr.checkAndUpdateStatus() - } - - // Start listening on new test requests. - for prID := range PullRequestQueue.Queue() { - log.Trace("TestPullRequests[%v]: processing test task", prID) - PullRequestQueue.Remove(prID) - - pr, err := GetPullRequestByID(com.StrTo(prID).MustInt64()) - if err != nil { - log.Error(4, "GetPullRequestByID[%d]: %v", prID, err) - continue - } else if err = pr.testPatch(); err != nil { - log.Error(4, "testPatch[%d]: %v", pr.ID, err) - continue - } - - pr.checkAndUpdateStatus() - } -} - -func InitTestPullRequests() { - go TestPullRequests() -} diff --git a/models/release.go b/models/release.go deleted file mode 100644 index c79ff222e53..00000000000 --- a/models/release.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2014 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 models - -import ( - "fmt" - "sort" - "strings" - "time" - - "github.com/go-xorm/xorm" - - "github.com/gogits/git-module" - - "github.com/gogits/gogs/modules/process" -) - -// Release represents a release of repository. -type Release struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 - PublisherID int64 - Publisher *User `xorm:"-"` - TagName string - LowerTagName string - Target string - Title string - Sha1 string `xorm:"VARCHAR(40)"` - NumCommits int64 - NumCommitsBehind int64 `xorm:"-"` - Note string `xorm:"TEXT"` - IsDraft bool `xorm:"NOT NULL DEFAULT false"` - IsPrerelease bool - - Created time.Time `xorm:"-"` - CreatedUnix int64 -} - -func (r *Release) BeforeInsert() { - if r.CreatedUnix == 0 { - r.CreatedUnix = time.Now().Unix() - } -} - -func (r *Release) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "created_unix": - r.Created = time.Unix(r.CreatedUnix, 0).Local() - } -} - -// IsReleaseExist returns true if release with given tag name already exists. -func IsReleaseExist(repoID int64, tagName string) (bool, error) { - if len(tagName) == 0 { - return false, nil - } - - return x.Get(&Release{RepoID: repoID, LowerTagName: strings.ToLower(tagName)}) -} - -func createTag(gitRepo *git.Repository, rel *Release) error { - // Only actual create when publish. - if !rel.IsDraft { - if !gitRepo.IsTagExist(rel.TagName) { - commit, err := gitRepo.GetBranchCommit(rel.Target) - if err != nil { - return fmt.Errorf("GetBranchCommit: %v", err) - } - - // Trim '--' prefix to prevent command line argument vulnerability. - rel.TagName = strings.TrimPrefix(rel.TagName, "--") - if err = gitRepo.CreateTag(rel.TagName, commit.ID.String()); err != nil { - if strings.Contains(err.Error(), "is not a valid tag name") { - return ErrInvalidTagName{rel.TagName} - } - return err - } - } else { - 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) - } - } - } - return nil -} - -// CreateRelease creates a new release of repository. -func CreateRelease(gitRepo *git.Repository, rel *Release) error { - isExist, err := IsReleaseExist(rel.RepoID, rel.TagName) - if err != nil { - return err - } else if isExist { - return ErrReleaseAlreadyExist{rel.TagName} - } - - if err = createTag(gitRepo, rel); err != nil { - return err - } - rel.LowerTagName = strings.ToLower(rel.TagName) - _, err = x.InsertOne(rel) - return err -} - -// GetRelease returns release by given ID. -func GetRelease(repoID int64, tagName string) (*Release, error) { - isExist, err := IsReleaseExist(repoID, tagName) - if err != nil { - return nil, err - } else if !isExist { - return nil, ErrReleaseNotExist{0, tagName} - } - - rel := &Release{RepoID: repoID, LowerTagName: strings.ToLower(tagName)} - _, err = x.Get(rel) - return rel, err -} - -// GetReleaseByID returns release with given ID. -func GetReleaseByID(id int64) (*Release, error) { - rel := new(Release) - has, err := x.Id(id).Get(rel) - if err != nil { - return nil, err - } else if !has { - return nil, ErrReleaseNotExist{id, ""} - } - - return rel, nil -} - -// GetReleasesByRepoID returns a list of releases of repository. -func GetReleasesByRepoID(repoID int64) (rels []*Release, err error) { - err = x.Desc("created_unix").Find(&rels, Release{RepoID: repoID}) - return rels, err -} - -type ReleaseSorter struct { - rels []*Release -} - -func (rs *ReleaseSorter) Len() int { - return len(rs.rels) -} - -func (rs *ReleaseSorter) Less(i, j int) bool { - diffNum := rs.rels[i].NumCommits - rs.rels[j].NumCommits - if diffNum != 0 { - return diffNum > 0 - } - return rs.rels[i].Created.After(rs.rels[j].Created) -} - -func (rs *ReleaseSorter) Swap(i, j int) { - rs.rels[i], rs.rels[j] = rs.rels[j], rs.rels[i] -} - -// SortReleases sorts releases by number of commits and created time. -func SortReleases(rels []*Release) { - sorter := &ReleaseSorter{rels: rels} - sort.Sort(sorter) -} - -// UpdateRelease updates information of a release. -func UpdateRelease(gitRepo *git.Repository, rel *Release) (err error) { - if err = createTag(gitRepo, rel); err != nil { - return err - } - _, err = x.Id(rel.ID).AllCols().Update(rel) - return err -} - -// DeleteReleaseByID deletes a release and corresponding Git tag by given ID. -func DeleteReleaseByID(id int64) error { - rel, err := GetReleaseByID(id) - if err != nil { - return fmt.Errorf("GetReleaseByID: %v", err) - } - - repo, err := GetRepositoryByID(rel.RepoID) - if err != nil { - return fmt.Errorf("GetRepositoryByID: %v", err) - } - - _, stderr, err := process.ExecDir(-1, repo.RepoPath(), - fmt.Sprintf("DeleteReleaseByID (git tag -d): %d", rel.ID), - "git", "tag", "-d", rel.TagName) - 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) - } - - return nil -} diff --git a/models/repo.go b/models/repo.go deleted file mode 100644 index 010c9fad608..00000000000 --- a/models/repo.go +++ /dev/null @@ -1,2108 +0,0 @@ -// Copyright 2014 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 models - -import ( - "bytes" - "errors" - "fmt" - "html/template" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "regexp" - "sort" - "strings" - "time" - - "github.com/Unknwon/cae/zip" - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - "github.com/mcuadros/go-version" - "gopkg.in/ini.v1" - - git "github.com/gogits/git-module" - api "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/modules/bindata" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/markdown" - "github.com/gogits/gogs/modules/process" - "github.com/gogits/gogs/modules/setting" - "github.com/gogits/gogs/modules/sync" -) - -const ( - _TPL_UPDATE_HOOK = "#!/usr/bin/env %s\n%s update $1 $2 $3 --config='%s'\n" -) - -var repoWorkingPool = sync.NewExclusivePool() - -var ( - ErrRepoFileNotExist = errors.New("Repository file does not exist") - ErrRepoFileNotLoaded = errors.New("Repository file not loaded") - ErrMirrorNotExist = errors.New("Mirror does not exist") - ErrInvalidReference = errors.New("Invalid reference specified") - ErrNameEmpty = errors.New("Name is empty") -) - -var ( - Gitignores, Licenses, Readmes, LabelTemplates []string - - // Maximum items per page in forks, watchers and stars of a repo - ItemsPerPage = 40 -) - -func LoadRepoConfig() { - // Load .gitignore and license files and readme templates. - types := []string{"gitignore", "license", "readme", "label"} - typeFiles := make([][]string, 4) - for i, t := range types { - files, err := bindata.AssetDir("conf/" + t) - if err != nil { - log.Fatal(4, "Fail to get %s files: %v", t, err) - } - customPath := path.Join(setting.CustomPath, "conf", t) - if com.IsDir(customPath) { - customFiles, err := com.StatDir(customPath) - if err != nil { - log.Fatal(4, "Fail to get custom %s files: %v", t, err) - } - - for _, f := range customFiles { - if !com.IsSliceContainsStr(files, f) { - files = append(files, f) - } - } - } - typeFiles[i] = files - } - - Gitignores = typeFiles[0] - Licenses = typeFiles[1] - Readmes = typeFiles[2] - LabelTemplates = typeFiles[3] - sort.Strings(Gitignores) - sort.Strings(Licenses) - sort.Strings(Readmes) - sort.Strings(LabelTemplates) - - // Filter out invalid names and promote preferred licenses. - sortedLicenses := make([]string, 0, len(Licenses)) - for _, name := range setting.Repository.PreferredLicenses { - if com.IsSliceContainsStr(Licenses, name) { - sortedLicenses = append(sortedLicenses, name) - } - } - for _, name := range Licenses { - if !com.IsSliceContainsStr(setting.Repository.PreferredLicenses, name) { - sortedLicenses = append(sortedLicenses, name) - } - } - Licenses = sortedLicenses -} - -func NewRepoContext() { - zip.Verbose = false - - // Check Git installation. - if _, err := exec.LookPath("git"); err != nil { - log.Fatal(4, "Fail to test 'git' command: %v (forgotten install?)", err) - } - - // Check Git version. - gitVer, err := git.BinVersion() - if err != nil { - log.Fatal(4, "Fail to get Git version: %v", err) - } - - log.Info("Git Version: %s", gitVer) - if version.Compare("1.7.1", gitVer, ">") { - log.Fatal(4, "Gogs requires Git version greater or equal to 1.7.1") - } - - // Git requires setting user.name and user.email in order to commit changes. - for configKey, defaultValue := range map[string]string{"user.name": "Gogs", "user.email": "gogs@fake.local"} { - if stdout, stderr, err := process.Exec("NewRepoContext(get setting)", "git", "config", "--get", configKey); err != nil || strings.TrimSpace(stdout) == "" { - // ExitError indicates this config is not set - if _, ok := err.(*exec.ExitError); ok || strings.TrimSpace(stdout) == "" { - if _, stderr, gerr := process.Exec("NewRepoContext(set "+configKey+")", "git", "config", "--global", configKey, defaultValue); gerr != nil { - log.Fatal(4, "Fail to set git %s(%s): %s", configKey, gerr, stderr) - } - log.Info("Git config %s set to %s", configKey, defaultValue) - } else { - log.Fatal(4, "Fail to get git %s(%s): %s", configKey, err, stderr) - } - } - } - - // Set git some configurations. - if _, stderr, err := process.Exec("NewRepoContext(git config --global core.quotepath false)", - "git", "config", "--global", "core.quotepath", "false"); err != nil { - log.Fatal(4, "Fail to execute 'git config --global core.quotepath false': %s", stderr) - } - - RemoveAllWithNotice("Clean up repository temporary data", filepath.Join(setting.AppDataPath, "tmp")) -} - -// Repository represents a git repository. -type Repository struct { - ID int64 `xorm:"pk autoincr"` - OwnerID int64 `xorm:"UNIQUE(s)"` - Owner *User `xorm:"-"` - LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"` - Name string `xorm:"INDEX NOT NULL"` - Description string - Website string - DefaultBranch string - - NumWatches int - NumStars int - NumForks int - NumIssues int - NumClosedIssues int - NumOpenIssues int `xorm:"-"` - NumPulls int - NumClosedPulls int - NumOpenPulls int `xorm:"-"` - NumMilestones int `xorm:"NOT NULL DEFAULT 0"` - NumClosedMilestones int `xorm:"NOT NULL DEFAULT 0"` - NumOpenMilestones int `xorm:"-"` - NumTags int `xorm:"-"` - - IsPrivate bool - IsBare bool - - IsMirror bool - *Mirror `xorm:"-"` - - // Advanced settings - EnableWiki bool `xorm:"NOT NULL DEFAULT true"` - EnableExternalWiki bool - ExternalWikiURL string - EnableIssues bool `xorm:"NOT NULL DEFAULT true"` - EnableExternalTracker bool - ExternalTrackerFormat string - ExternalTrackerStyle string - ExternalMetas map[string]string `xorm:"-"` - EnablePulls bool `xorm:"NOT NULL DEFAULT true"` - - IsFork bool `xorm:"NOT NULL DEFAULT false"` - ForkID int64 - BaseRepo *Repository `xorm:"-"` - - Created time.Time `xorm:"-"` - CreatedUnix int64 - Updated time.Time `xorm:"-"` - UpdatedUnix int64 -} - -func (repo *Repository) BeforeInsert() { - repo.CreatedUnix = time.Now().Unix() - repo.UpdatedUnix = repo.CreatedUnix -} - -func (repo *Repository) BeforeUpdate() { - repo.UpdatedUnix = time.Now().Unix() -} - -func (repo *Repository) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "default_branch": - // FIXME: use models migration to solve all at once. - if len(repo.DefaultBranch) == 0 { - repo.DefaultBranch = "master" - } - case "num_closed_issues": - repo.NumOpenIssues = repo.NumIssues - repo.NumClosedIssues - case "num_closed_pulls": - repo.NumOpenPulls = repo.NumPulls - repo.NumClosedPulls - case "num_closed_milestones": - repo.NumOpenMilestones = repo.NumMilestones - repo.NumClosedMilestones - case "external_tracker_style": - if len(repo.ExternalTrackerStyle) == 0 { - repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC - } - case "created_unix": - repo.Created = time.Unix(repo.CreatedUnix, 0).Local() - case "updated_unix": - repo.Updated = time.Unix(repo.UpdatedUnix, 0) - } -} - -// MustOwner always returns a valid *User object to avoid -// conceptually impossible error handling. -// It creates a fake object that contains error deftail -// when error occurs. -func (repo *Repository) MustOwner() *User { - return repo.mustOwner(x) -} - -func (repo *Repository) FullName() string { - return repo.MustOwner().Name + "/" + repo.Name -} - -func (repo *Repository) HTMLURL() string { - return setting.AppUrl + repo.FullName() -} - -// Arguments that are allowed to be nil: permission -func (repo *Repository) APIFormat(permission *api.Permission) *api.Repository { - cloneLink := repo.CloneLink() - return &api.Repository{ - ID: repo.ID, - Owner: repo.Owner.APIFormat(), - Name: repo.Name, - FullName: repo.FullName(), - Description: repo.Description, - Private: repo.IsPrivate, - Fork: repo.IsFork, - HTMLURL: repo.HTMLURL(), - SSHURL: cloneLink.SSH, - CloneURL: cloneLink.HTTPS, - Website: repo.Website, - Stars: repo.NumStars, - Forks: repo.NumForks, - Watchers: repo.NumWatches, - OpenIssues: repo.NumOpenIssues, - DefaultBranch: repo.DefaultBranch, - Created: repo.Created, - Updated: repo.Updated, - Permissions: permission, - } -} - -func (repo *Repository) getOwner(e Engine) (err error) { - if repo.Owner != nil { - return nil - } - - repo.Owner, err = getUserByID(e, repo.OwnerID) - return err -} - -func (repo *Repository) GetOwner() error { - return repo.getOwner(x) -} - -func (repo *Repository) mustOwner(e Engine) *User { - if err := repo.getOwner(e); err != nil { - return &User{ - Name: "error", - FullName: err.Error(), - } - } - - return repo.Owner -} - -// ComposeMetas composes a map of metas for rendering external issue tracker URL. -func (repo *Repository) ComposeMetas() map[string]string { - if !repo.EnableExternalTracker { - return nil - } else if repo.ExternalMetas == nil { - repo.ExternalMetas = map[string]string{ - "format": repo.ExternalTrackerFormat, - "user": repo.MustOwner().Name, - "repo": repo.Name, - } - switch repo.ExternalTrackerStyle { - case markdown.ISSUE_NAME_STYLE_ALPHANUMERIC: - repo.ExternalMetas["style"] = markdown.ISSUE_NAME_STYLE_ALPHANUMERIC - default: - repo.ExternalMetas["style"] = markdown.ISSUE_NAME_STYLE_NUMERIC - } - - } - return repo.ExternalMetas -} - -// DeleteWiki removes the actual and local copy of repository wiki. -func (repo *Repository) DeleteWiki() { - wikiPaths := []string{repo.WikiPath(), repo.LocalWikiPath()} - for _, wikiPath := range wikiPaths { - RemoveAllWithNotice("Delete repository wiki", wikiPath) - } -} - -func (repo *Repository) getAssignees(e Engine) (_ []*User, err error) { - if err = repo.getOwner(e); err != nil { - return nil, err - } - - accesses := make([]*Access, 0, 10) - if err = e.Where("repo_id = ? AND mode >= ?", repo.ID, ACCESS_MODE_WRITE).Find(&accesses); err != nil { - return nil, err - } - - // Leave a seat for owner itself to append later, but if owner is an organization - // and just waste 1 unit is cheaper than re-allocate memory once. - users := make([]*User, 0, len(accesses)+1) - if len(accesses) > 0 { - userIDs := make([]int64, len(accesses)) - for i := 0; i < len(accesses); i++ { - userIDs[i] = accesses[i].UserID - } - - if err = e.In("id", userIDs).Find(&users); err != nil { - return nil, err - } - } - if !repo.Owner.IsOrganization() { - users = append(users, repo.Owner) - } - - return users, nil -} - -// GetAssignees returns all users that have write access and can be assigned to issues -// of the repository, -func (repo *Repository) GetAssignees() (_ []*User, err error) { - return repo.getAssignees(x) -} - -// GetAssigneeByID returns the user that has write access of repository by given ID. -func (repo *Repository) GetAssigneeByID(userID int64) (*User, error) { - return GetAssigneeByID(repo, userID) -} - -// GetMilestoneByID returns the milestone belongs to repository by given ID. -func (repo *Repository) GetMilestoneByID(milestoneID int64) (*Milestone, error) { - return GetMilestoneByRepoID(repo.ID, milestoneID) -} - -// IssueStats returns number of open and closed repository issues by given filter mode. -func (repo *Repository) IssueStats(uid int64, filterMode int, isPull bool) (int64, int64) { - return GetRepoIssueStats(repo.ID, uid, filterMode, isPull) -} - -func (repo *Repository) GetMirror() (err error) { - repo.Mirror, err = GetMirrorByRepoID(repo.ID) - return err -} - -func (repo *Repository) GetBaseRepo() (err error) { - if !repo.IsFork { - return nil - } - - repo.BaseRepo, err = GetRepositoryByID(repo.ForkID) - return err -} - -func (repo *Repository) repoPath(e Engine) string { - return RepoPath(repo.mustOwner(e).Name, repo.Name) -} - -func (repo *Repository) RepoPath() string { - return repo.repoPath(x) -} - -func (repo *Repository) GitConfigPath() string { - return filepath.Join(repo.RepoPath(), "config") -} - -func (repo *Repository) RelLink() string { - return "/" + repo.FullName() -} - -func (repo *Repository) Link() string { - return setting.AppSubUrl + "/" + repo.FullName() -} - -func (repo *Repository) ComposeCompareURL(oldCommitID, newCommitID string) string { - return fmt.Sprintf("%s/%s/compare/%s...%s", repo.MustOwner().Name, repo.Name, oldCommitID, newCommitID) -} - -func (repo *Repository) HasAccess(u *User) bool { - has, _ := HasAccess(u, repo, ACCESS_MODE_READ) - return has -} - -func (repo *Repository) IsOwnedBy(userID int64) bool { - return repo.OwnerID == userID -} - -// CanBeForked returns true if repository meets the requirements of being forked. -func (repo *Repository) CanBeForked() bool { - return !repo.IsBare -} - -// CanEnablePulls returns true if repository meets the requirements of accepting pulls. -func (repo *Repository) CanEnablePulls() bool { - return !repo.IsMirror -} - -// AllowPulls returns true if repository meets the requirements of accepting pulls and has them enabled. -func (repo *Repository) AllowsPulls() bool { - return repo.CanEnablePulls() && repo.EnablePulls -} - -// CanEnableEditor returns true if repository meets the requirements of web editor. -func (repo *Repository) CanEnableEditor() bool { - return !repo.IsMirror -} - -// FIXME: should have a mutex to prevent producing same index for two issues that are created -// closely enough. -func (repo *Repository) NextIssueIndex() int64 { - return int64(repo.NumIssues+repo.NumPulls) + 1 -} - -var ( - DescPattern = regexp.MustCompile(`https?://\S+`) -) - -// DescriptionHtml does special handles to description and return HTML string. -func (repo *Repository) DescriptionHtml() template.HTML { - sanitize := func(s string) string { - return fmt.Sprintf(`%[1]s`, s) - } - return template.HTML(DescPattern.ReplaceAllStringFunc(markdown.Sanitizer.Sanitize(repo.Description), sanitize)) -} - -func (repo *Repository) LocalCopyPath() string { - return path.Join(setting.AppDataPath, "tmp/local-rpeo", com.ToStr(repo.ID)) -} - -// UpdateLocalCopy pulls latest changes of given branch from repoPath to localPath. -// It creates a new clone if local copy does not exist. -// This function checks out target branch by default, it is safe to assume subsequent -// operations are operating against target branch when caller has confidence for no race condition. -func UpdateLocalCopyBranch(repoPath, localPath, branch string) error { - if !com.IsExist(localPath) { - if err := git.Clone(repoPath, localPath, git.CloneRepoOptions{ - Timeout: time.Duration(setting.Git.Timeout.Clone) * time.Second, - Branch: branch, - }); err != nil { - return fmt.Errorf("git clone %s: %v", branch, err) - } - } else { - if err := git.Checkout(localPath, git.CheckoutOptions{ - Branch: branch, - }); 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) - } - } - return nil -} - -// UpdateLocalCopyBranch makes sure local copy of repository in given branch is up-to-date. -func (repo *Repository) UpdateLocalCopyBranch(branch string) error { - return UpdateLocalCopyBranch(repo.RepoPath(), repo.LocalCopyPath(), branch) -} - -// PatchPath returns corresponding patch file path of repository by given issue ID. -func (repo *Repository) PatchPath(index int64) (string, error) { - if err := repo.GetOwner(); err != nil { - return "", err - } - - return filepath.Join(RepoPath(repo.Owner.Name, repo.Name), "pulls", com.ToStr(index)+".patch"), nil -} - -// SavePatch saves patch data to corresponding location by given issue ID. -func (repo *Repository) SavePatch(index int64, patch []byte) error { - patchPath, err := repo.PatchPath(index) - if err != nil { - return fmt.Errorf("PatchPath: %v", err) - } - - os.MkdirAll(filepath.Dir(patchPath), os.ModePerm) - if err = ioutil.WriteFile(patchPath, patch, 0644); err != nil { - return fmt.Errorf("WriteFile: %v", err) - } - - return nil -} - -func isRepositoryExist(e Engine, u *User, repoName string) (bool, error) { - has, err := e.Get(&Repository{ - OwnerID: u.ID, - LowerName: strings.ToLower(repoName), - }) - return has && com.IsDir(RepoPath(u.Name, repoName)), err -} - -// IsRepositoryExist returns true if the repository with given name under user has already existed. -func IsRepositoryExist(u *User, repoName string) (bool, error) { - return isRepositoryExist(x, u, repoName) -} - -// CloneLink represents different types of clone URLs of repository. -type CloneLink struct { - SSH string - HTTPS string - Git string -} - -// ComposeHTTPSCloneURL returns HTTPS clone URL based on given owner and repository name. -func ComposeHTTPSCloneURL(owner, repo string) string { - return fmt.Sprintf("%s%s/%s.git", setting.AppUrl, owner, repo) -} - -func (repo *Repository) cloneLink(isWiki bool) *CloneLink { - repoName := repo.Name - if isWiki { - repoName += ".wiki" - } - - repo.Owner = repo.MustOwner() - cl := new(CloneLink) - if setting.SSH.Port != 22 { - cl.SSH = fmt.Sprintf("ssh://%s@%s:%d/%s/%s.git", setting.RunUser, setting.SSH.Domain, setting.SSH.Port, repo.Owner.Name, repoName) - } else { - cl.SSH = fmt.Sprintf("%s@%s:%s/%s.git", setting.RunUser, setting.SSH.Domain, repo.Owner.Name, repoName) - } - cl.HTTPS = ComposeHTTPSCloneURL(repo.Owner.Name, repoName) - return cl -} - -// CloneLink returns clone URLs of repository. -func (repo *Repository) CloneLink() (cl *CloneLink) { - return repo.cloneLink(false) -} - -type MigrateRepoOptions struct { - Name string - Description string - IsPrivate bool - IsMirror bool - RemoteAddr string -} - -/* - GitHub, GitLab, Gogs: *.wiki.git - BitBucket: *.git/wiki -*/ -var commonWikiURLSuffixes = []string{".wiki.git", ".git/wiki"} - -// wikiRemoteURL returns accessible repository URL for wiki if exists. -// Otherwise, it returns an empty string. -func wikiRemoteURL(remote string) string { - remote = strings.TrimSuffix(remote, ".git") - for _, suffix := range commonWikiURLSuffixes { - wikiURL := remote + suffix - if git.IsRepoURLAccessible(wikiURL) { - return wikiURL - } - } - return "" -} - -// MigrateRepository migrates a existing repository from other project hosting. -func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) { - repo, err := CreateRepository(u, CreateRepoOptions{ - Name: opts.Name, - Description: opts.Description, - IsPrivate: opts.IsPrivate, - IsMirror: opts.IsMirror, - }) - if err != nil { - return nil, err - } - - repoPath := RepoPath(u.Name, opts.Name) - wikiPath := WikiPath(u.Name, opts.Name) - - if u.IsOrganization() { - t, err := u.GetOwnerTeam() - if err != nil { - return nil, err - } - repo.NumWatches = t.NumMembers - } else { - repo.NumWatches = 1 - } - - migrateTimeout := time.Duration(setting.Git.Timeout.Migrate) * time.Second - - os.RemoveAll(repoPath) - if err = git.Clone(opts.RemoteAddr, repoPath, git.CloneRepoOptions{ - Mirror: true, - Quiet: true, - Timeout: migrateTimeout, - }); err != nil { - return repo, fmt.Errorf("Clone: %v", err) - } - - wikiRemotePath := wikiRemoteURL(opts.RemoteAddr) - if len(wikiRemotePath) > 0 { - os.RemoveAll(wikiPath) - if err = git.Clone(wikiRemotePath, wikiPath, git.CloneRepoOptions{ - Mirror: true, - Quiet: true, - Timeout: migrateTimeout, - }); err != nil { - log.Info("Clone wiki: %v", err) - } - } - - // Check if repository is empty. - _, stderr, err := com.ExecCmdDir(repoPath, "git", "log", "-1") - if err != nil { - if strings.Contains(stderr, "fatal: bad default revision 'HEAD'") { - repo.IsBare = true - } else { - return repo, fmt.Errorf("check bare: %v - %s", err, stderr) - } - } - - if !repo.IsBare { - // Try to get HEAD branch and set it as default branch. - gitRepo, err := git.OpenRepository(repoPath) - if err != nil { - return repo, fmt.Errorf("OpenRepository: %v", err) - } - headBranch, err := gitRepo.GetHEADBranch() - if err != nil { - return repo, fmt.Errorf("GetHEADBranch: %v", err) - } - if headBranch != nil { - repo.DefaultBranch = headBranch.Name - } - } - - if opts.IsMirror { - if _, err = x.InsertOne(&Mirror{ - RepoID: repo.ID, - Interval: setting.Mirror.DefaultInterval, - EnablePrune: true, - NextUpdate: time.Now().Add(time.Duration(setting.Mirror.DefaultInterval) * time.Hour), - }); err != nil { - return repo, fmt.Errorf("InsertOne: %v", err) - } - - repo.IsMirror = true - return repo, UpdateRepository(repo, false) - } - - return CleanUpMigrateInfo(repo) -} - -// cleanUpMigrateGitConfig removes mirror info which prevents "push --all". -// This also removes possible user credentials. -func cleanUpMigrateGitConfig(configPath string) error { - cfg, err := ini.Load(configPath) - if err != nil { - return fmt.Errorf("open config file: %v", err) - } - cfg.DeleteSection("remote \"origin\"") - if err = cfg.SaveToIndent(configPath, "\t"); err != nil { - return fmt.Errorf("save config file: %v", err) - } - return nil -} - -func createUpdateHook(repoPath string) error { - return git.SetUpdateHook(repoPath, - fmt.Sprintf(_TPL_UPDATE_HOOK, setting.ScriptType, "\""+setting.AppPath+"\"", setting.CustomConf)) -} - -// Finish migrating repository and/or wiki with things that don't need to be done for mirrors. -func CleanUpMigrateInfo(repo *Repository) (*Repository, error) { - repoPath := repo.RepoPath() - if err := createUpdateHook(repoPath); err != nil { - return repo, fmt.Errorf("createUpdateHook: %v", err) - } - if repo.HasWiki() { - if err := createUpdateHook(repo.WikiPath()); err != nil { - return repo, fmt.Errorf("createUpdateHook (wiki): %v", err) - } - } - - if err := cleanUpMigrateGitConfig(repo.GitConfigPath()); err != nil { - return repo, fmt.Errorf("cleanUpMigrateGitConfig: %v", err) - } - if repo.HasWiki() { - if err := cleanUpMigrateGitConfig(path.Join(repo.WikiPath(), "config")); err != nil { - return repo, fmt.Errorf("cleanUpMigrateGitConfig (wiki): %v", err) - } - } - - return repo, UpdateRepository(repo, false) -} - -// initRepoCommit temporarily changes with work directory. -func initRepoCommit(tmpPath string, sig *git.Signature) (err error) { - var stderr string - if _, stderr, err = process.ExecDir(-1, - tmpPath, fmt.Sprintf("initRepoCommit (git add): %s", tmpPath), - "git", "add", "--all"); err != nil { - return fmt.Errorf("git add: %s", stderr) - } - - if _, stderr, err = process.ExecDir(-1, - tmpPath, fmt.Sprintf("initRepoCommit (git commit): %s", tmpPath), - "git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), - "-m", "Initial commit"); err != nil { - return fmt.Errorf("git commit: %s", stderr) - } - - if _, stderr, err = process.ExecDir(-1, - tmpPath, fmt.Sprintf("initRepoCommit (git push): %s", tmpPath), - "git", "push", "origin", "master"); err != nil { - return fmt.Errorf("git push: %s", stderr) - } - return nil -} - -type CreateRepoOptions struct { - Name string - Description string - Gitignores string - License string - Readme string - IsPrivate bool - IsMirror bool - AutoInit bool -} - -func getRepoInitFile(tp, name string) ([]byte, error) { - relPath := path.Join("conf", tp, strings.TrimLeft(name, "./")) - - // Use custom file when available. - customPath := path.Join(setting.CustomPath, relPath) - if com.IsFile(customPath) { - return ioutil.ReadFile(customPath) - } - return bindata.Asset(relPath) -} - -func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRepoOptions) error { - // Clone to temprory path and do the init commit. - _, stderr, err := process.Exec( - fmt.Sprintf("initRepository(git clone): %s", repoPath), "git", "clone", repoPath, tmpDir) - if err != nil { - return fmt.Errorf("git clone: %v - %s", err, stderr) - } - - // README - data, err := getRepoInitFile("readme", opts.Readme) - if err != nil { - return fmt.Errorf("getRepoInitFile[%s]: %v", opts.Readme, err) - } - - cloneLink := repo.CloneLink() - match := map[string]string{ - "Name": repo.Name, - "Description": repo.Description, - "CloneURL.SSH": cloneLink.SSH, - "CloneURL.HTTPS": cloneLink.HTTPS, - } - if err = ioutil.WriteFile(filepath.Join(tmpDir, "README.md"), - []byte(com.Expand(string(data), match)), 0644); err != nil { - return fmt.Errorf("write README.md: %v", err) - } - - // .gitignore - if len(opts.Gitignores) > 0 { - var buf bytes.Buffer - names := strings.Split(opts.Gitignores, ",") - for _, name := range names { - data, err = getRepoInitFile("gitignore", name) - if err != nil { - return fmt.Errorf("getRepoInitFile[%s]: %v", name, err) - } - buf.WriteString("# ---> " + name + "\n") - buf.Write(data) - buf.WriteString("\n") - } - - if buf.Len() > 0 { - if err = ioutil.WriteFile(filepath.Join(tmpDir, ".gitignore"), buf.Bytes(), 0644); err != nil { - return fmt.Errorf("write .gitignore: %v", err) - } - } - } - - // LICENSE - if len(opts.License) > 0 { - data, err = getRepoInitFile("license", opts.License) - if err != nil { - return fmt.Errorf("getRepoInitFile[%s]: %v", opts.License, err) - } - - if err = ioutil.WriteFile(filepath.Join(tmpDir, "LICENSE"), data, 0644); err != nil { - return fmt.Errorf("write LICENSE: %v", err) - } - } - - return nil -} - -// InitRepository initializes README and .gitignore if needed. -func initRepository(e Engine, repoPath string, u *User, repo *Repository, opts CreateRepoOptions) (err error) { - // Somehow the directory could exist. - if com.IsExist(repoPath) { - return fmt.Errorf("initRepository: path already exists: %s", repoPath) - } - - // Init bare new repository. - if err = git.InitRepository(repoPath, true); err != nil { - return fmt.Errorf("InitRepository: %v", err) - } else if err = createUpdateHook(repoPath); err != nil { - return fmt.Errorf("createUpdateHook: %v", err) - } - - tmpDir := filepath.Join(os.TempDir(), "gogs-"+repo.Name+"-"+com.ToStr(time.Now().Nanosecond())) - - // Initialize repository according to user's choice. - if opts.AutoInit { - os.MkdirAll(tmpDir, os.ModePerm) - defer os.RemoveAll(tmpDir) - - if err = prepareRepoCommit(repo, tmpDir, repoPath, opts); err != nil { - return fmt.Errorf("prepareRepoCommit: %v", err) - } - - // Apply changes and commit. - if err = initRepoCommit(tmpDir, u.NewGitSig()); err != nil { - return fmt.Errorf("initRepoCommit: %v", err) - } - } - - // Re-fetch the repository from database before updating it (else it would - // override changes that were done earlier with sql) - if repo, err = getRepositoryByID(e, repo.ID); err != nil { - return fmt.Errorf("getRepositoryByID: %v", err) - } - - if !opts.AutoInit { - repo.IsBare = true - } - - repo.DefaultBranch = "master" - if err = updateRepository(e, repo, false); err != nil { - return fmt.Errorf("updateRepository: %v", err) - } - - return nil -} - -var ( - reservedRepoNames = []string{".", ".."} - reservedRepoPatterns = []string{"*.git", "*.wiki"} -) - -func IsUsableRepoName(name string) error { - return isUsableName(reservedRepoNames, reservedRepoPatterns, name) -} - -func createRepository(e *xorm.Session, u *User, repo *Repository) (err error) { - if err = IsUsableRepoName(repo.Name); err != nil { - return err - } - - has, err := isRepositoryExist(e, u, repo.Name) - if err != nil { - return fmt.Errorf("IsRepositoryExist: %v", err) - } else if has { - return ErrRepoAlreadyExist{u.Name, repo.Name} - } - - if _, err = e.Insert(repo); err != nil { - return err - } - - u.NumRepos++ - // Remember visibility preference. - u.LastRepoVisibility = repo.IsPrivate - if err = updateUser(e, u); err != nil { - return fmt.Errorf("updateUser: %v", err) - } - - // Give access to all members in owner team. - if u.IsOrganization() { - t, err := u.getOwnerTeam(e) - if err != nil { - return fmt.Errorf("getOwnerTeam: %v", err) - } else if err = t.addRepository(e, repo); err != nil { - return fmt.Errorf("addRepository: %v", err) - } - } else { - // Organization automatically called this in addRepository method. - if err = repo.recalculateAccesses(e); err != nil { - return fmt.Errorf("recalculateAccesses: %v", err) - } - } - - if err = watchRepo(e, u.ID, repo.ID, true); err != nil { - return fmt.Errorf("watchRepo: %v", err) - } else if err = newRepoAction(e, u, repo); err != nil { - return fmt.Errorf("newRepoAction: %v", err) - } - - return nil -} - -// CreateRepository creates a repository for given user or organization. -func CreateRepository(u *User, opts CreateRepoOptions) (_ *Repository, err error) { - if !u.CanCreateRepo() { - return nil, ErrReachLimitOfRepo{u.MaxRepoCreation} - } - - repo := &Repository{ - OwnerID: u.ID, - Owner: u, - Name: opts.Name, - LowerName: strings.ToLower(opts.Name), - Description: opts.Description, - IsPrivate: opts.IsPrivate, - EnableWiki: true, - EnableIssues: true, - EnablePulls: true, - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return nil, err - } - - if err = createRepository(sess, u, repo); err != nil { - return nil, err - } - - // No need for init mirror. - if !opts.IsMirror { - repoPath := RepoPath(u.Name, repo.Name) - if err = initRepository(sess, repoPath, u, repo, opts); err != nil { - if err2 := os.RemoveAll(repoPath); err2 != nil { - log.Error(4, "initRepository: %v", err) - return nil, fmt.Errorf( - "delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2) - } - return nil, fmt.Errorf("initRepository: %v", err) - } - - _, stderr, err := process.ExecDir(-1, - repoPath, fmt.Sprintf("CreateRepository(git update-server-info): %s", repoPath), - "git", "update-server-info") - if err != nil { - return nil, errors.New("CreateRepository(git update-server-info): " + stderr) - } - } - - return repo, sess.Commit() -} - -func countRepositories(userID int64, private bool) int64 { - sess := x.Where("id > 0") - - if userID > 0 { - sess.And("owner_id = ?", userID) - } - if !private { - sess.And("is_private=?", false) - } - - count, err := sess.Count(new(Repository)) - if err != nil { - log.Error(4, "countRepositories: %v", err) - } - return count -} - -// CountRepositories returns number of repositories. -// Argument private only takes effect when it is false, -// set it true to count all repositories. -func CountRepositories(private bool) int64 { - return countRepositories(-1, private) -} - -// CountUserRepositories returns number of repositories user owns. -// Argument private only takes effect when it is false, -// set it true to count all repositories. -func CountUserRepositories(userID int64, private bool) int64 { - return countRepositories(userID, private) -} - -func Repositories(page, pageSize int) (_ []*Repository, err error) { - repos := make([]*Repository, 0, pageSize) - return repos, x.Limit(pageSize, (page-1)*pageSize).Asc("id").Find(&repos) -} - -// RepositoriesWithUsers returns number of repos in given page. -func RepositoriesWithUsers(page, pageSize int) (_ []*Repository, err error) { - repos, err := Repositories(page, pageSize) - if err != nil { - return nil, fmt.Errorf("Repositories: %v", err) - } - - for i := range repos { - if err = repos[i].GetOwner(); err != nil { - return nil, err - } - } - - return repos, nil -} - -// RepoPath returns repository path by given user and repository name. -func RepoPath(userName, repoName string) string { - return filepath.Join(UserPath(userName), strings.ToLower(repoName)+".git") -} - -// TransferOwnership transfers all corresponding setting from old user to new one. -func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error { - newOwner, err := GetUserByName(newOwnerName) - if err != nil { - return fmt.Errorf("get new owner '%s': %v", newOwnerName, err) - } - - // Check if new owner has repository with same name. - has, err := IsRepositoryExist(newOwner, repo.Name) - if err != nil { - return fmt.Errorf("IsRepositoryExist: %v", err) - } else if has { - return ErrRepoAlreadyExist{newOwnerName, repo.Name} - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return fmt.Errorf("sess.Begin: %v", err) - } - - owner := repo.Owner - - // Note: we have to set value here to make sure recalculate accesses is based on - // new owner. - repo.OwnerID = newOwner.ID - repo.Owner = newOwner - - // Update repository. - if _, err := sess.Id(repo.ID).Update(repo); err != nil { - return fmt.Errorf("update owner: %v", err) - } - - // Remove redundant collaborators. - collaborators, err := repo.getCollaborators(sess) - if err != nil { - return fmt.Errorf("getCollaborators: %v", err) - } - - // Dummy object. - collaboration := &Collaboration{RepoID: repo.ID} - for _, c := range collaborators { - collaboration.UserID = c.ID - if c.ID == newOwner.ID || newOwner.IsOrgMember(c.ID) { - if _, err = sess.Delete(collaboration); err != nil { - return fmt.Errorf("remove collaborator '%d': %v", c.ID, err) - } - } - } - - // Remove old team-repository relations. - if owner.IsOrganization() { - if err = owner.getTeams(sess); err != nil { - return fmt.Errorf("getTeams: %v", err) - } - for _, t := range owner.Teams { - if !t.hasRepository(sess, repo.ID) { - continue - } - - t.NumRepos-- - if _, err := sess.Id(t.ID).AllCols().Update(t); err != nil { - return fmt.Errorf("decrease team repository count '%d': %v", t.ID, err) - } - } - - if err = owner.removeOrgRepo(sess, repo.ID); err != nil { - return fmt.Errorf("removeOrgRepo: %v", err) - } - } - - if newOwner.IsOrganization() { - t, err := newOwner.getOwnerTeam(sess) - if err != nil { - return fmt.Errorf("getOwnerTeam: %v", err) - } else if err = t.addRepository(sess, repo); err != nil { - return fmt.Errorf("add to owner team: %v", err) - } - } else { - // Organization called this in addRepository method. - if err = repo.recalculateAccesses(sess); err != nil { - return fmt.Errorf("recalculateAccesses: %v", err) - } - } - - // Update repository count. - if _, err = sess.Exec("UPDATE `user` SET num_repos=num_repos+1 WHERE id=?", newOwner.ID); err != nil { - return fmt.Errorf("increase new owner repository count: %v", err) - } else if _, err = sess.Exec("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?", owner.ID); err != nil { - return fmt.Errorf("decrease old owner repository count: %v", err) - } - - if err = watchRepo(sess, newOwner.ID, repo.ID, true); err != nil { - return fmt.Errorf("watchRepo: %v", err) - } else if err = transferRepoAction(sess, doer, owner, repo); err != nil { - return fmt.Errorf("transferRepoAction: %v", err) - } - - // Rename remote repository to new path and delete local copy. - os.MkdirAll(UserPath(newOwner.Name), os.ModePerm) - if err = os.Rename(RepoPath(owner.Name, repo.Name), RepoPath(newOwner.Name, repo.Name)); err != nil { - return fmt.Errorf("rename repository directory: %v", err) - } - RemoveAllWithNotice("Delete repository local copy", repo.LocalCopyPath()) - - // Rename remote wiki repository to new path and delete local copy. - wikiPath := WikiPath(owner.Name, repo.Name) - if com.IsExist(wikiPath) { - RemoveAllWithNotice("Delete repository wiki local copy", repo.LocalWikiPath()) - if err = os.Rename(wikiPath, WikiPath(newOwner.Name, repo.Name)); err != nil { - return fmt.Errorf("rename repository wiki: %v", err) - } - } - - return sess.Commit() -} - -// ChangeRepositoryName changes all corresponding setting from old repository name to new one. -func ChangeRepositoryName(u *User, oldRepoName, newRepoName string) (err error) { - oldRepoName = strings.ToLower(oldRepoName) - newRepoName = strings.ToLower(newRepoName) - if err = IsUsableRepoName(newRepoName); err != nil { - return err - } - - has, err := IsRepositoryExist(u, newRepoName) - if err != nil { - return fmt.Errorf("IsRepositoryExist: %v", err) - } else if has { - return ErrRepoAlreadyExist{u.Name, newRepoName} - } - - repo, err := GetRepositoryByName(u.ID, oldRepoName) - if err != nil { - return fmt.Errorf("GetRepositoryByName: %v", err) - } - - // Change repository directory name. - if err = os.Rename(repo.RepoPath(), RepoPath(u.Name, newRepoName)); err != nil { - return fmt.Errorf("rename repository directory: %v", err) - } - - wikiPath := repo.WikiPath() - if com.IsExist(wikiPath) { - if err = os.Rename(wikiPath, WikiPath(u.Name, newRepoName)); err != nil { - return fmt.Errorf("rename repository wiki: %v", err) - } - RemoveAllWithNotice("Delete repository wiki local copy", repo.LocalWikiPath()) - } - - return nil -} - -func getRepositoriesByForkID(e Engine, forkID int64) ([]*Repository, error) { - repos := make([]*Repository, 0, 10) - return repos, e.Where("fork_id=?", forkID).Find(&repos) -} - -// GetRepositoriesByForkID returns all repositories with given fork ID. -func GetRepositoriesByForkID(forkID int64) ([]*Repository, error) { - return getRepositoriesByForkID(x, forkID) -} - -func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err error) { - repo.LowerName = strings.ToLower(repo.Name) - - if len(repo.Description) > 255 { - repo.Description = repo.Description[:255] - } - if len(repo.Website) > 255 { - repo.Website = repo.Website[:255] - } - - if _, err = e.Id(repo.ID).AllCols().Update(repo); err != nil { - return fmt.Errorf("update: %v", err) - } - - if visibilityChanged { - if err = repo.getOwner(e); err != nil { - return fmt.Errorf("getOwner: %v", err) - } - if repo.Owner.IsOrganization() { - // Organization repository need to recalculate access table when visivility is changed. - if err = repo.recalculateTeamAccesses(e, 0); err != nil { - return fmt.Errorf("recalculateTeamAccesses: %v", err) - } - } - - // Create/Remove git-daemon-export-ok for git-daemon... - daemonExportFile := path.Join(repo.RepoPath(), `git-daemon-export-ok`) - if repo.IsPrivate && com.IsExist(daemonExportFile) { - if err = os.Remove(daemonExportFile); err != nil { - log.Error(4, "Failed to remove %s: %v", daemonExportFile, err) - } - } else if !repo.IsPrivate && !com.IsExist(daemonExportFile) { - if f, err := os.Create(daemonExportFile); err != nil { - log.Error(4, "Failed to create %s: %v", daemonExportFile, err) - } else { - f.Close() - } - } - - forkRepos, err := getRepositoriesByForkID(e, repo.ID) - if err != nil { - return fmt.Errorf("getRepositoriesByForkID: %v", err) - } - for i := range forkRepos { - forkRepos[i].IsPrivate = repo.IsPrivate - if err = updateRepository(e, forkRepos[i], true); err != nil { - return fmt.Errorf("updateRepository[%d]: %v", forkRepos[i].ID, err) - } - } - } - - return nil -} - -func UpdateRepository(repo *Repository, visibilityChanged bool) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = updateRepository(x, repo, visibilityChanged); err != nil { - return fmt.Errorf("updateRepository: %v", err) - } - - return sess.Commit() -} - -// DeleteRepository deletes a repository for a user or organization. -func DeleteRepository(uid, repoID int64) error { - repo := &Repository{ID: repoID, OwnerID: uid} - has, err := x.Get(repo) - if err != nil { - return err - } else if !has { - return ErrRepoNotExist{repoID, uid, ""} - } - - // In case is a organization. - org, err := GetUserByID(uid) - if err != nil { - return err - } - if org.IsOrganization() { - if err = org.GetTeams(); err != nil { - return err - } - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if org.IsOrganization() { - for _, t := range org.Teams { - if !t.hasRepository(sess, repoID) { - continue - } else if err = t.removeRepository(sess, repo, false); err != nil { - return err - } - } - } - - if err = deleteBeans(sess, - &Repository{ID: repoID}, - &Access{RepoID: repo.ID}, - &Action{RepoID: repo.ID}, - &Watch{RepoID: repoID}, - &Star{RepoID: repoID}, - &Mirror{RepoID: repoID}, - &IssueUser{RepoID: repoID}, - &Milestone{RepoID: repoID}, - &Release{RepoID: repoID}, - &Collaboration{RepoID: repoID}, - &PullRequest{BaseRepoID: repoID}, - ); err != nil { - return fmt.Errorf("deleteBeans: %v", err) - } - - // Delete comments and attachments. - issues := make([]*Issue, 0, 25) - attachmentPaths := make([]string, 0, len(issues)) - if err = sess.Where("repo_id=?", repoID).Find(&issues); err != nil { - return err - } - for i := range issues { - if _, err = sess.Delete(&Comment{IssueID: issues[i].ID}); err != nil { - return err - } - - attachments := make([]*Attachment, 0, 5) - if err = sess.Where("issue_id=?", issues[i].ID).Find(&attachments); err != nil { - return err - } - for j := range attachments { - attachmentPaths = append(attachmentPaths, attachments[j].LocalPath()) - } - - if _, err = sess.Delete(&Attachment{IssueID: issues[i].ID}); err != nil { - return err - } - } - - if _, err = sess.Delete(&Issue{RepoID: repoID}); err != nil { - return err - } - - if repo.IsFork { - if _, err = sess.Exec("UPDATE `repository` SET num_forks=num_forks-1 WHERE id=?", repo.ForkID); err != nil { - return fmt.Errorf("decrease fork count: %v", err) - } - } - - if _, err = sess.Exec("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?", uid); err != nil { - return err - } - - // Remove repository files. - repoPath := repo.repoPath(sess) - RemoveAllWithNotice("Delete repository files", repoPath) - - repo.DeleteWiki() - - // Remove attachment files. - for i := range attachmentPaths { - RemoveAllWithNotice("Delete attachment", attachmentPaths[i]) - } - - if err = sess.Commit(); err != nil { - return fmt.Errorf("Commit: %v", err) - } - - if repo.NumForks > 0 { - if _, err = x.Exec("UPDATE `repository` SET fork_id=0,is_fork=? WHERE fork_id=?", false, repo.ID); err != nil { - log.Error(4, "reset 'fork_id' and 'is_fork': %v", err) - } - } - - return nil -} - -// GetRepositoryByRef returns a Repository specified by a GFM reference. -// See https://help.github.com/articles/writing-on-github#references for more information on the syntax. -func GetRepositoryByRef(ref string) (*Repository, error) { - n := strings.IndexByte(ref, byte('/')) - if n < 2 { - return nil, ErrInvalidReference - } - - userName, repoName := ref[:n], ref[n+1:] - user, err := GetUserByName(userName) - if err != nil { - return nil, err - } - - return GetRepositoryByName(user.ID, repoName) -} - -// GetRepositoryByName returns the repository by given name under user if exists. -func GetRepositoryByName(ownerID int64, name string) (*Repository, error) { - repo := &Repository{ - OwnerID: ownerID, - LowerName: strings.ToLower(name), - } - has, err := x.Get(repo) - if err != nil { - return nil, err - } else if !has { - return nil, ErrRepoNotExist{0, ownerID, name} - } - return repo, err -} - -func getRepositoryByID(e Engine, id int64) (*Repository, error) { - repo := new(Repository) - has, err := e.Id(id).Get(repo) - if err != nil { - return nil, err - } else if !has { - return nil, ErrRepoNotExist{id, 0, ""} - } - return repo, nil -} - -// GetRepositoryByID returns the repository by given id if exists. -func GetRepositoryByID(id int64) (*Repository, error) { - return getRepositoryByID(x, id) -} - -// GetUserRepositories returns a list of repositories of given user. -func GetUserRepositories(userID int64, private bool, page, pageSize int) ([]*Repository, error) { - sess := x.Where("owner_id = ?", userID).Desc("updated_unix") - if !private { - sess.And("is_private=?", false) - } - - if page <= 0 { - page = 1 - } - sess.Limit(pageSize, (page-1)*pageSize) - - repos := make([]*Repository, 0, pageSize) - return repos, sess.Find(&repos) -} - -// GetUserRepositories returns a list of mirror repositories of given user. -func GetUserMirrorRepositories(userID int64) ([]*Repository, error) { - repos := make([]*Repository, 0, 10) - return repos, x.Where("owner_id = ?", userID).And("is_mirror = ?", true).Find(&repos) -} - -// GetRecentUpdatedRepositories returns the list of repositories that are recently updated. -func GetRecentUpdatedRepositories(page, pageSize int) (repos []*Repository, err error) { - return repos, x.Limit(pageSize, (page-1)*pageSize). - Where("is_private=?", false).Limit(pageSize).Desc("updated_unix").Find(&repos) -} - -func getRepositoryCount(e Engine, u *User) (int64, error) { - return x.Count(&Repository{OwnerID: u.ID}) -} - -// GetRepositoryCount returns the total number of repositories of user. -func GetRepositoryCount(u *User) (int64, error) { - return getRepositoryCount(x, u) -} - -type SearchRepoOptions struct { - Keyword string - OwnerID int64 - OrderBy string - Private bool // Include private repositories in results - Page int - PageSize int // 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 []*Repository, _ int64, _ error) { - if len(opts.Keyword) == 0 { - return repos, 0, nil - } - opts.Keyword = strings.ToLower(opts.Keyword) - - if opts.Page <= 0 { - opts.Page = 1 - } - - repos = make([]*Repository, 0, opts.PageSize) - - // Append conditions - sess := x.Where("LOWER(lower_name) LIKE ?", "%"+opts.Keyword+"%") - if opts.OwnerID > 0 { - sess.And("owner_id = ?", opts.OwnerID) - } - if !opts.Private { - sess.And("is_private=?", false) - } - - var countSess xorm.Session - countSess = *sess - count, err := countSess.Count(new(Repository)) - if err != nil { - return nil, 0, fmt.Errorf("Count: %v", err) - } - - if len(opts.OrderBy) > 0 { - sess.OrderBy(opts.OrderBy) - } - return repos, count, sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Find(&repos) -} - -// DeleteRepositoryArchives deletes all repositories' archives. -func DeleteRepositoryArchives() error { - return x.Where("id > 0").Iterate(new(Repository), - func(idx int, bean interface{}) error { - repo := bean.(*Repository) - return os.RemoveAll(filepath.Join(repo.RepoPath(), "archives")) - }) -} - -func gatherMissingRepoRecords() ([]*Repository, error) { - repos := make([]*Repository, 0, 10) - if err := x.Where("id > 0").Iterate(new(Repository), - func(idx int, bean interface{}) error { - repo := bean.(*Repository) - if !com.IsDir(repo.RepoPath()) { - repos = append(repos, repo) - } - return nil - }); err != nil { - if err2 := CreateRepositoryNotice(fmt.Sprintf("gatherMissingRepoRecords: %v", err)); err2 != nil { - return nil, fmt.Errorf("CreateRepositoryNotice: %v", err) - } - } - return repos, nil -} - -// DeleteMissingRepositories deletes all repository records that lost Git files. -func DeleteMissingRepositories() error { - repos, err := gatherMissingRepoRecords() - if err != nil { - return fmt.Errorf("gatherMissingRepoRecords: %v", err) - } - - if len(repos) == 0 { - return nil - } - - for _, repo := range repos { - log.Trace("Deleting %d/%d...", repo.OwnerID, repo.ID) - if err := DeleteRepository(repo.OwnerID, repo.ID); err != nil { - if err2 := CreateRepositoryNotice(fmt.Sprintf("DeleteRepository [%d]: %v", repo.ID, err)); err2 != nil { - return fmt.Errorf("CreateRepositoryNotice: %v", err) - } - } - } - return nil -} - -// ReinitMissingRepositories reinitializes all repository records that lost Git files. -func ReinitMissingRepositories() error { - repos, err := gatherMissingRepoRecords() - if err != nil { - return fmt.Errorf("gatherMissingRepoRecords: %v", err) - } - - if len(repos) == 0 { - return nil - } - - for _, repo := range repos { - log.Trace("Initializing %d/%d...", repo.OwnerID, repo.ID) - if err := git.InitRepository(repo.RepoPath(), true); err != nil { - if err2 := CreateRepositoryNotice(fmt.Sprintf("InitRepository [%d]: %v", repo.ID, err)); err2 != nil { - return fmt.Errorf("CreateRepositoryNotice: %v", err) - } - } - } - return nil -} - -// RewriteRepositoryUpdateHook rewrites all repositories' update hook. -func RewriteRepositoryUpdateHook() error { - return x.Where("id > 0").Iterate(new(Repository), - func(idx int, bean interface{}) error { - repo := bean.(*Repository) - return createUpdateHook(repo.RepoPath()) - }) -} - -// Prevent duplicate running tasks. -var taskStatusTable = sync.NewStatusTable() - -const ( - _MIRROR_UPDATE = "mirror_update" - _GIT_FSCK = "git_fsck" - _CHECK_REPOs = "check_repos" -) - -// GitFsck calls 'git fsck' to check repository health. -func GitFsck() { - if taskStatusTable.IsRunning(_GIT_FSCK) { - return - } - taskStatusTable.Start(_GIT_FSCK) - defer taskStatusTable.Stop(_GIT_FSCK) - - log.Trace("Doing: GitFsck") - - if err := x.Where("id>0").Iterate(new(Repository), - func(idx int, bean interface{}) error { - repo := bean.(*Repository) - repoPath := repo.RepoPath() - if err := git.Fsck(repoPath, setting.Cron.RepoHealthCheck.Timeout, setting.Cron.RepoHealthCheck.Args...); err != nil { - desc := fmt.Sprintf("Fail to health check repository (%s): %v", repoPath, err) - log.Warn(desc) - if err = CreateRepositoryNotice(desc); err != nil { - log.Error(4, "CreateRepositoryNotice: %v", err) - } - } - return nil - }); err != nil { - log.Error(4, "GitFsck: %v", err) - } -} - -func GitGcRepos() error { - args := append([]string{"gc"}, setting.Git.GCArgs...) - return x.Where("id > 0").Iterate(new(Repository), - func(idx int, bean interface{}) error { - repo := bean.(*Repository) - if err := repo.GetOwner(); err != nil { - return err - } - _, stderr, err := process.ExecDir( - time.Duration(setting.Git.Timeout.GC)*time.Second, - RepoPath(repo.Owner.Name, repo.Name), "Repository garbage collection", - "git", args...) - if err != nil { - return fmt.Errorf("%v: %v", err, stderr) - } - return nil - }) -} - -type repoChecker struct { - querySQL, correctSQL string - desc string -} - -func repoStatsCheck(checker *repoChecker) { - results, err := x.Query(checker.querySQL) - if err != nil { - log.Error(4, "Select %s: %v", checker.desc, err) - return - } - for _, result := range results { - id := com.StrTo(result["id"]).MustInt64() - log.Trace("Updating %s: %d", checker.desc, id) - _, err = x.Exec(checker.correctSQL, id, id) - if err != nil { - log.Error(4, "Update %s[%d]: %v", checker.desc, id, err) - } - } -} - -func CheckRepoStats() { - if taskStatusTable.IsRunning(_CHECK_REPOs) { - return - } - taskStatusTable.Start(_CHECK_REPOs) - defer taskStatusTable.Stop(_CHECK_REPOs) - - log.Trace("Doing: CheckRepoStats") - - checkers := []*repoChecker{ - // Repository.NumWatches - { - "SELECT repo.id FROM `repository` repo WHERE repo.num_watches!=(SELECT COUNT(*) FROM `watch` WHERE repo_id=repo.id)", - "UPDATE `repository` SET num_watches=(SELECT COUNT(*) FROM `watch` WHERE repo_id=?) WHERE id=?", - "repository count 'num_watches'", - }, - // Repository.NumStars - { - "SELECT repo.id FROM `repository` repo WHERE repo.num_stars!=(SELECT COUNT(*) FROM `star` WHERE repo_id=repo.id)", - "UPDATE `repository` SET num_stars=(SELECT COUNT(*) FROM `star` WHERE repo_id=?) WHERE id=?", - "repository count 'num_stars'", - }, - // Label.NumIssues - { - "SELECT label.id FROM `label` WHERE label.num_issues!=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=label.id)", - "UPDATE `label` SET num_issues=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=?) WHERE id=?", - "label count 'num_issues'", - }, - // User.NumRepos - { - "SELECT `user`.id FROM `user` WHERE `user`.num_repos!=(SELECT COUNT(*) FROM `repository` WHERE owner_id=`user`.id)", - "UPDATE `user` SET num_repos=(SELECT COUNT(*) FROM `repository` WHERE owner_id=?) WHERE id=?", - "user count 'num_repos'", - }, - // Issue.NumComments - { - "SELECT `issue`.id FROM `issue` WHERE `issue`.num_comments!=(SELECT COUNT(*) FROM `comment` WHERE issue_id=`issue`.id AND type=0)", - "UPDATE `issue` SET num_comments=(SELECT COUNT(*) FROM `comment` WHERE issue_id=? AND type=0) WHERE id=?", - "issue count 'num_comments'", - }, - } - for i := range checkers { - repoStatsCheck(checkers[i]) - } - - // ***** START: Repository.NumClosedIssues ***** - desc := "repository count 'num_closed_issues'" - results, err := x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_closed_issues!=(SELECT COUNT(*) FROM `issue` WHERE repo_id=repo.id AND is_closed=? AND is_pull=?)", true, false) - if err != nil { - log.Error(4, "Select %s: %v", desc, err) - } else { - for _, result := range results { - id := com.StrTo(result["id"]).MustInt64() - log.Trace("Updating %s: %d", desc, id) - _, err = x.Exec("UPDATE `repository` SET num_closed_issues=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_closed=? AND is_pull=?) WHERE id=?", id, true, false, id) - if err != nil { - log.Error(4, "Update %s[%d]: %v", desc, id, err) - } - } - } - // ***** END: Repository.NumClosedIssues ***** - - // FIXME: use checker when stop supporting old fork repo format. - // ***** START: Repository.NumForks ***** - results, err = x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_forks!=(SELECT COUNT(*) FROM `repository` WHERE fork_id=repo.id)") - if err != nil { - log.Error(4, "Select repository count 'num_forks': %v", err) - } else { - for _, result := range results { - id := com.StrTo(result["id"]).MustInt64() - log.Trace("Updating repository count 'num_forks': %d", id) - - repo, err := GetRepositoryByID(id) - if err != nil { - log.Error(4, "GetRepositoryByID[%d]: %v", id, err) - continue - } - - rawResult, err := x.Query("SELECT COUNT(*) FROM `repository` WHERE fork_id=?", repo.ID) - if err != nil { - log.Error(4, "Select count of forks[%d]: %v", repo.ID, err) - continue - } - repo.NumForks = int(parseCountResult(rawResult)) - - if err = UpdateRepository(repo, false); err != nil { - log.Error(4, "UpdateRepository[%d]: %v", id, err) - continue - } - } - } - // ***** END: Repository.NumForks ***** -} - -type RepositoryList []*Repository - -func (repos RepositoryList) loadAttributes(e Engine) error { - if len(repos) == 0 { - return nil - } - - // Load owners. - set := make(map[int64]*User) - for i := range repos { - set[repos[i].OwnerID] = nil - } - userIDs := make([]int64, 0, len(set)) - for userID := range set { - userIDs = append(userIDs, userID) - } - users := make([]*User, 0, len(userIDs)) - if err := e.Where("id > 0").In("id", userIDs).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] - } - return nil -} - -func (repos RepositoryList) LoadAttributes() error { - return repos.loadAttributes(x) -} - -type MirrorRepositoryList []*Repository - -func (repos MirrorRepositoryList) loadAttributes(e Engine) error { - if len(repos) == 0 { - return nil - } - - // Load mirrors. - repoIDs := make([]int64, 0, len(repos)) - for i := range repos { - if !repos[i].IsMirror { - continue - } - - repoIDs = append(repoIDs, repos[i].ID) - } - mirrors := make([]*Mirror, 0, len(repoIDs)) - if err := e.Where("id > 0").In("repo_id", repoIDs).Find(&mirrors); err != nil { - return fmt.Errorf("find mirrors: %v", err) - } - - set := make(map[int64]*Mirror) - for i := range mirrors { - set[mirrors[i].RepoID] = mirrors[i] - } - for i := range repos { - repos[i].Mirror = set[repos[i].ID] - } - return nil -} - -func (repos MirrorRepositoryList) LoadAttributes() error { - return repos.loadAttributes(x) -} - -// __ __ __ .__ -// / \ / \_____ _/ |_ ____ | |__ -// \ \/\/ /\__ \\ __\/ ___\| | \ -// \ / / __ \| | \ \___| Y \ -// \__/\ / (____ /__| \___ >___| / -// \/ \/ \/ \/ - -// Watch is connection request for receiving repository notification. -type Watch struct { - ID int64 `xorm:"pk autoincr"` - UserID int64 `xorm:"UNIQUE(watch)"` - RepoID int64 `xorm:"UNIQUE(watch)"` -} - -func isWatching(e Engine, userID, repoID int64) bool { - has, _ := e.Get(&Watch{0, userID, repoID}) - return has -} - -// IsWatching checks if user has watched given repository. -func IsWatching(userID, repoID int64) bool { - return isWatching(x, userID, repoID) -} - -func watchRepo(e Engine, userID, repoID int64, watch bool) (err error) { - if watch { - if isWatching(e, userID, repoID) { - return nil - } - if _, err = e.Insert(&Watch{RepoID: repoID, UserID: userID}); err != nil { - return err - } - _, err = e.Exec("UPDATE `repository` SET num_watches = num_watches + 1 WHERE id = ?", repoID) - } else { - if !isWatching(e, userID, repoID) { - return nil - } - if _, err = e.Delete(&Watch{0, userID, repoID}); err != nil { - return err - } - _, err = e.Exec("UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?", repoID) - } - return err -} - -// Watch or unwatch repository. -func WatchRepo(userID, repoID int64, watch bool) (err error) { - return watchRepo(x, userID, repoID, watch) -} - -func getWatchers(e Engine, repoID int64) ([]*Watch, error) { - watches := make([]*Watch, 0, 10) - return watches, e.Find(&watches, &Watch{RepoID: repoID}) -} - -// GetWatchers returns all watchers of given repository. -func GetWatchers(repoID int64) ([]*Watch, error) { - return getWatchers(x, repoID) -} - -// Repository.GetWatchers returns range of users watching given repository. -func (repo *Repository) GetWatchers(page int) ([]*User, error) { - users := make([]*User, 0, ItemsPerPage) - sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("watch.repo_id=?", repo.ID) - if setting.UsePostgreSQL { - sess = sess.Join("LEFT", "watch", `"user".id=watch.user_id`) - } else { - sess = sess.Join("LEFT", "watch", "user.id=watch.user_id") - } - return users, sess.Find(&users) -} - -func notifyWatchers(e Engine, act *Action) error { - // Add feeds for user self and all watchers. - watches, err := getWatchers(e, act.RepoID) - if err != nil { - return fmt.Errorf("get watchers: %v", err) - } - - // Add feed for actioner. - act.UserID = act.ActUserID - if _, err = e.InsertOne(act); err != nil { - return fmt.Errorf("insert new actioner: %v", err) - } - - for i := range watches { - if act.ActUserID == watches[i].UserID { - continue - } - - act.ID = 0 - act.UserID = watches[i].UserID - if _, err = e.InsertOne(act); err != nil { - return fmt.Errorf("insert new action: %v", err) - } - } - return nil -} - -// NotifyWatchers creates batch of actions for every watcher. -func NotifyWatchers(act *Action) error { - return notifyWatchers(x, act) -} - -// _________ __ -// / _____// |______ _______ -// \_____ \\ __\__ \\_ __ \ -// / \| | / __ \| | \/ -// /_______ /|__| (____ /__| -// \/ \/ - -type Star struct { - ID int64 `xorm:"pk autoincr"` - UID int64 `xorm:"UNIQUE(s)"` - RepoID int64 `xorm:"UNIQUE(s)"` -} - -// Star or unstar repository. -func StarRepo(userID, repoID int64, star bool) (err error) { - if star { - if IsStaring(userID, repoID) { - return nil - } - if _, err = x.Insert(&Star{UID: userID, RepoID: repoID}); err != nil { - return err - } else if _, err = x.Exec("UPDATE `repository` SET num_stars = num_stars + 1 WHERE id = ?", repoID); err != nil { - return err - } - _, err = x.Exec("UPDATE `user` SET num_stars = num_stars + 1 WHERE id = ?", userID) - } else { - if !IsStaring(userID, repoID) { - return nil - } - if _, err = x.Delete(&Star{0, userID, repoID}); err != nil { - return err - } else if _, err = x.Exec("UPDATE `repository` SET num_stars = num_stars - 1 WHERE id = ?", repoID); err != nil { - return err - } - _, err = x.Exec("UPDATE `user` SET num_stars = num_stars - 1 WHERE id = ?", userID) - } - return err -} - -// IsStaring checks if user has starred given repository. -func IsStaring(userID, repoID int64) bool { - has, _ := x.Get(&Star{0, userID, repoID}) - return has -} - -func (repo *Repository) GetStargazers(page int) ([]*User, error) { - users := make([]*User, 0, ItemsPerPage) - sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("star.repo_id=?", repo.ID) - if setting.UsePostgreSQL { - sess = sess.Join("LEFT", "star", `"user".id=star.uid`) - } else { - sess = sess.Join("LEFT", "star", "user.id=star.uid") - } - return users, sess.Find(&users) -} - -// ___________ __ -// \_ _____/__________| | __ -// | __)/ _ \_ __ \ |/ / -// | \( <_> ) | \/ < -// \___ / \____/|__| |__|_ \ -// \/ \/ - -// HasForkedRepo checks if given user has already forked a repository with given ID. -func HasForkedRepo(ownerID, repoID int64) (*Repository, bool) { - repo := new(Repository) - has, _ := x.Where("owner_id=? AND fork_id=?", ownerID, repoID).Get(repo) - return repo, has -} - -func ForkRepository(u *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) { - repo := &Repository{ - OwnerID: u.ID, - Owner: u, - Name: name, - LowerName: strings.ToLower(name), - Description: desc, - DefaultBranch: oldRepo.DefaultBranch, - IsPrivate: oldRepo.IsPrivate, - IsFork: true, - ForkID: oldRepo.ID, - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return nil, err - } - - if err = createRepository(sess, u, repo); err != nil { - return nil, err - } - - if _, err = sess.Exec("UPDATE `repository` SET num_forks=num_forks+1 WHERE id=?", oldRepo.ID); err != nil { - return nil, err - } - - repoPath := RepoPath(u.Name, repo.Name) - _, stderr, err := process.ExecTimeout(10*time.Minute, - fmt.Sprintf("ForkRepository(git clone): %s/%s", u.Name, repo.Name), - "git", "clone", "--bare", oldRepo.RepoPath(), repoPath) - if err != nil { - return nil, fmt.Errorf("git clone: %v", stderr) - } - - _, stderr, err = process.ExecDir(-1, - repoPath, fmt.Sprintf("ForkRepository(git update-server-info): %s", repoPath), - "git", "update-server-info") - if err != nil { - return nil, fmt.Errorf("git update-server-info: %v", err) - } - - if err = createUpdateHook(repoPath); err != nil { - return nil, fmt.Errorf("createUpdateHook: %v", err) - } - - return repo, sess.Commit() -} - -func (repo *Repository) GetForks() ([]*Repository, error) { - forks := make([]*Repository, 0, repo.NumForks) - return forks, x.Find(&forks, &Repository{ForkID: repo.ID}) -} - -// __________ .__ -// \______ \____________ ____ ____ | |__ -// | | _/\_ __ \__ \ / \_/ ___\| | \ -// | | \ | | \// __ \| | \ \___| Y \ -// |______ / |__| (____ /___| /\___ >___| / -// \/ \/ \/ \/ \/ -// - -func (repo *Repository) CreateNewBranch(doer *User, oldBranchName, branchName string) (err error) { - repoWorkingPool.CheckIn(com.ToStr(repo.ID)) - defer repoWorkingPool.CheckOut(com.ToStr(repo.ID)) - - localPath := repo.LocalCopyPath() - - if err = discardLocalRepoBranchChanges(localPath, oldBranchName); err != nil { - return fmt.Errorf("discardLocalRepoChanges: %v", err) - } else if err = repo.UpdateLocalCopyBranch(oldBranchName); err != nil { - return fmt.Errorf("UpdateLocalCopyBranch: %v", err) - } - - if err = repo.CheckoutNewBranch(oldBranchName, branchName); err != nil { - return fmt.Errorf("CreateNewBranch: %v", err) - } - - if err = git.Push(localPath, "origin", branchName); err != nil { - return fmt.Errorf("Push: %v", err) - } - - return nil -} diff --git a/models/repo_branch.go b/models/repo_branch.go deleted file mode 100644 index 9cf2e9c43e4..00000000000 --- a/models/repo_branch.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2016 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 models - -import ( - "github.com/gogits/git-module" -) - -type Branch struct { - Path string - Name string -} - -func GetBranchesByPath(path string) ([]*Branch, error) { - gitRepo, err := git.OpenRepository(path) - if err != nil { - return nil, err - } - - brs, err := gitRepo.GetBranches() - if err != nil { - return nil, err - } - - branches := make([]*Branch, len(brs)) - for i := range brs { - branches[i] = &Branch{ - Path: path, - Name: brs[i], - } - } - return branches, nil -} - -func (repo *Repository) GetBranch(br string) (*Branch, error) { - if !git.IsBranchExist(repo.RepoPath(), br) { - return nil, &ErrBranchNotExist{br} - } - return &Branch{ - Path: repo.RepoPath(), - Name: br, - }, nil -} - -func (repo *Repository) GetBranches() ([]*Branch, error) { - return GetBranchesByPath(repo.RepoPath()) -} - -func (br *Branch) GetCommit() (*git.Commit, error) { - gitRepo, err := git.OpenRepository(br.Path) - if err != nil { - return nil, err - } - return gitRepo.GetBranchCommit(br.Name) -} diff --git a/models/repo_collaboration.go b/models/repo_collaboration.go deleted file mode 100644 index f4b23f9ebea..00000000000 --- a/models/repo_collaboration.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2016 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 models - -import ( - "fmt" -) - -// Collaboration represent the relation between an individual and a repository. -type Collaboration struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` - UserID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` - Mode AccessMode `xorm:"DEFAULT 2 NOT NULL"` -} - -func (c *Collaboration) ModeI18nKey() string { - switch c.Mode { - case ACCESS_MODE_READ: - return "repo.settings.collaboration.read" - case ACCESS_MODE_WRITE: - return "repo.settings.collaboration.write" - case ACCESS_MODE_ADMIN: - return "repo.settings.collaboration.admin" - default: - return "repo.settings.collaboration.undefined" - } -} - -// AddCollaborator adds new collaboration to a repository with default access mode. -func (repo *Repository) AddCollaborator(u *User) error { - collaboration := &Collaboration{ - RepoID: repo.ID, - UserID: u.ID, - } - - has, err := x.Get(collaboration) - if err != nil { - return err - } else if has { - return nil - } - collaboration.Mode = ACCESS_MODE_WRITE - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.InsertOne(collaboration); err != nil { - return err - } - - if repo.Owner.IsOrganization() { - err = repo.recalculateTeamAccesses(sess, 0) - } else { - err = repo.recalculateAccesses(sess) - } - if err != nil { - return fmt.Errorf("recalculateAccesses 'team=%v': %v", repo.Owner.IsOrganization(), err) - } - - return sess.Commit() -} - -func (repo *Repository) getCollaborations(e Engine) ([]*Collaboration, error) { - collaborations := make([]*Collaboration, 0) - return collaborations, e.Find(&collaborations, &Collaboration{RepoID: repo.ID}) -} - -// Collaborator represents a user with collaboration details. -type Collaborator struct { - *User - Collaboration *Collaboration -} - -func (repo *Repository) getCollaborators(e Engine) ([]*Collaborator, error) { - collaborations, err := repo.getCollaborations(e) - if err != nil { - return nil, fmt.Errorf("getCollaborations: %v", err) - } - - collaborators := make([]*Collaborator, len(collaborations)) - for i, c := range collaborations { - user, err := getUserByID(e, c.UserID) - if err != nil { - return nil, err - } - collaborators[i] = &Collaborator{ - User: user, - Collaboration: c, - } - } - return collaborators, nil -} - -// GetCollaborators returns the collaborators for a repository -func (repo *Repository) GetCollaborators() ([]*Collaborator, error) { - return repo.getCollaborators(x) -} - -// ChangeCollaborationAccessMode sets new access mode for the collaboration. -func (repo *Repository) ChangeCollaborationAccessMode(uid int64, mode AccessMode) error { - // Discard invalid input - if mode <= ACCESS_MODE_NONE || mode > ACCESS_MODE_OWNER { - return nil - } - - collaboration := &Collaboration{ - RepoID: repo.ID, - UserID: uid, - } - has, err := x.Get(collaboration) - if err != nil { - return fmt.Errorf("get collaboration: %v", err) - } else if !has { - return nil - } - - if collaboration.Mode == mode { - return nil - } - collaboration.Mode = mode - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Id(collaboration.ID).AllCols().Update(collaboration); err != nil { - return fmt.Errorf("update collaboration: %v", err) - } else if _, err = sess.Exec("UPDATE access SET mode = ? WHERE user_id = ? AND repo_id = ?", mode, uid, repo.ID); err != nil { - return fmt.Errorf("update access table: %v", err) - } - - return sess.Commit() -} - -// DeleteCollaboration removes collaboration relation between the user and repository. -func (repo *Repository) DeleteCollaboration(uid int64) (err error) { - collaboration := &Collaboration{ - RepoID: repo.ID, - UserID: uid, - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if has, err := sess.Delete(collaboration); err != nil || has == 0 { - return err - } else if err = repo.recalculateAccesses(sess); err != nil { - return err - } - - return sess.Commit() -} diff --git a/models/repo_editor.go b/models/repo_editor.go deleted file mode 100644 index dfdb864a1c0..00000000000 --- a/models/repo_editor.go +++ /dev/null @@ -1,520 +0,0 @@ -// Copyright 2016 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 models - -import ( - "fmt" - "io" - "io/ioutil" - "mime/multipart" - "os" - "os/exec" - "path" - "path/filepath" - "time" - - "github.com/Unknwon/com" - gouuid "github.com/satori/go.uuid" - - git "github.com/gogits/git-module" - - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/process" - "github.com/gogits/gogs/modules/setting" -) - -// ___________ .___.__ __ ___________.__.__ -// \_ _____/ __| _/|__|/ |_ \_ _____/|__| | ____ -// | __)_ / __ | | \ __\ | __) | | | _/ __ \ -// | \/ /_/ | | || | | \ | | |_\ ___/ -// /_______ /\____ | |__||__| \___ / |__|____/\___ > -// \/ \/ \/ \/ - -// discardLocalRepoBranchChanges discards local commits/changes of -// given branch to make sure it is even to remote branch. -func discardLocalRepoBranchChanges(localPath, branch string) error { - if !com.IsExist(localPath) { - return nil - } - // No need to check if nothing in the repository. - if !git.IsBranchExist(localPath, branch) { - return nil - } - - refName := "origin/" + branch - if err := git.ResetHEAD(localPath, true, refName); err != nil { - return fmt.Errorf("git reset --hard %s: %v", refName, err) - } - return nil -} - -func (repo *Repository) DiscardLocalRepoBranchChanges(branch string) error { - return discardLocalRepoBranchChanges(repo.LocalCopyPath(), branch) -} - -// checkoutNewBranch checks out to a new branch from the a branch name. -func checkoutNewBranch(repoPath, localPath, oldBranch, newBranch string) error { - if err := git.Checkout(localPath, git.CheckoutOptions{ - Timeout: time.Duration(setting.Git.Timeout.Pull) * time.Second, - Branch: newBranch, - OldBranch: oldBranch, - }); err != nil { - return fmt.Errorf("git checkout -b %s %s: %v", newBranch, oldBranch, err) - } - return nil -} - -func (repo *Repository) CheckoutNewBranch(oldBranch, newBranch string) error { - return checkoutNewBranch(repo.RepoPath(), repo.LocalCopyPath(), oldBranch, newBranch) -} - -type UpdateRepoFileOptions struct { - LastCommitID string - OldBranch string - NewBranch string - OldTreeName string - NewTreeName string - Message string - Content string - IsNewFile bool -} - -// UpdateRepoFile adds or updates a file in repository. -func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (err error) { - repoWorkingPool.CheckIn(com.ToStr(repo.ID)) - defer repoWorkingPool.CheckOut(com.ToStr(repo.ID)) - - if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil { - return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err) - } else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil { - return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err) - } - - if opts.OldBranch != opts.NewBranch { - if err := repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil { - return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err) - } - } - - localPath := repo.LocalCopyPath() - oldFilePath := path.Join(localPath, opts.OldTreeName) - filePath := path.Join(localPath, opts.NewTreeName) - os.MkdirAll(path.Dir(filePath), os.ModePerm) - - // If it's meant to be a new file, make sure it doesn't exist. - if opts.IsNewFile { - if com.IsExist(filePath) { - return ErrRepoFileAlreadyExist{filePath} - } - } - - // Ignore move step if it's a new file under a directory. - // Otherwise, move the file when name changed. - if com.IsFile(oldFilePath) && opts.OldTreeName != opts.NewTreeName { - if err = git.MoveFile(localPath, opts.OldTreeName, opts.NewTreeName); err != nil { - return fmt.Errorf("git mv %s %s: %v", opts.OldTreeName, opts.NewTreeName, err) - } - } - - if err = ioutil.WriteFile(filePath, []byte(opts.Content), 0666); err != nil { - return fmt.Errorf("WriteFile: %v", err) - } - - if err = git.AddChanges(localPath, true); err != nil { - return fmt.Errorf("git add --all: %v", err) - } else if err = git.CommitChanges(localPath, git.CommitChangesOptions{ - Committer: doer.NewGitSig(), - Message: opts.Message, - }); err != nil { - return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil { - return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err) - } - - gitRepo, err := git.OpenRepository(repo.RepoPath()) - if err != nil { - log.Error(4, "OpenRepository: %v", err) - return nil - } - commit, err := gitRepo.GetBranchCommit(opts.NewBranch) - if err != nil { - log.Error(4, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err) - return nil - } - - // Simulate push event. - pushCommits := &PushCommits{ - Len: 1, - Commits: []*PushCommit{CommitToPushCommit(commit)}, - } - oldCommitID := opts.LastCommitID - if opts.NewBranch != opts.OldBranch { - oldCommitID = git.EMPTY_SHA - } - if err := CommitRepoAction(CommitRepoActionOptions{ - PusherName: doer.Name, - RepoOwnerID: repo.MustOwner().ID, - RepoName: repo.Name, - RefFullName: git.BRANCH_PREFIX + opts.NewBranch, - OldCommitID: oldCommitID, - NewCommitID: commit.ID.String(), - Commits: pushCommits, - }); err != nil { - log.Error(4, "CommitRepoAction: %v", err) - return nil - } - - return nil -} - -// GetDiffPreview produces and returns diff result of a file which is not yet committed. -func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *Diff, err error) { - repoWorkingPool.CheckIn(com.ToStr(repo.ID)) - defer repoWorkingPool.CheckOut(com.ToStr(repo.ID)) - - if err = repo.DiscardLocalRepoBranchChanges(branch); err != nil { - return nil, fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", branch, err) - } else if err = repo.UpdateLocalCopyBranch(branch); err != nil { - return nil, fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", branch, err) - } - - localPath := repo.LocalCopyPath() - filePath := path.Join(localPath, treePath) - os.MkdirAll(filepath.Dir(filePath), os.ModePerm) - if err = ioutil.WriteFile(filePath, []byte(content), 0666); err != nil { - return nil, fmt.Errorf("WriteFile: %v", err) - } - - cmd := exec.Command("git", "diff", treePath) - cmd.Dir = localPath - cmd.Stderr = os.Stderr - - stdout, err := cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("StdoutPipe: %v", err) - } - - if err = cmd.Start(); err != nil { - return nil, fmt.Errorf("Start: %v", err) - } - - pid := process.Add(fmt.Sprintf("GetDiffPreview [repo_path: %s]", repo.RepoPath()), cmd) - defer process.Remove(pid) - - diff, err = ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, stdout) - if err != nil { - return nil, fmt.Errorf("ParsePatch: %v", err) - } - - if err = cmd.Wait(); err != nil { - return nil, fmt.Errorf("Wait: %v", err) - } - - return diff, nil -} - -// ________ .__ __ ___________.__.__ -// \______ \ ____ | | _____/ |_ ____ \_ _____/|__| | ____ -// | | \_/ __ \| | _/ __ \ __\/ __ \ | __) | | | _/ __ \ -// | ` \ ___/| |_\ ___/| | \ ___/ | \ | | |_\ ___/ -// /_______ /\___ >____/\___ >__| \___ > \___ / |__|____/\___ > -// \/ \/ \/ \/ \/ \/ -// - -type DeleteRepoFileOptions struct { - LastCommitID string - OldBranch string - NewBranch string - TreePath string - Message string -} - -func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (err error) { - repoWorkingPool.CheckIn(com.ToStr(repo.ID)) - defer repoWorkingPool.CheckOut(com.ToStr(repo.ID)) - - if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil { - return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err) - } else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil { - return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err) - } - - if opts.OldBranch != opts.NewBranch { - if err := repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil { - return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err) - } - } - - localPath := repo.LocalCopyPath() - if err = os.Remove(path.Join(localPath, opts.TreePath)); err != nil { - return fmt.Errorf("Remove: %v", err) - } - - if err = git.AddChanges(localPath, true); err != nil { - return fmt.Errorf("git add --all: %v", err) - } else if err = git.CommitChanges(localPath, git.CommitChangesOptions{ - Committer: doer.NewGitSig(), - Message: opts.Message, - }); err != nil { - return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil { - return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err) - } - - gitRepo, err := git.OpenRepository(repo.RepoPath()) - if err != nil { - log.Error(4, "OpenRepository: %v", err) - return nil - } - commit, err := gitRepo.GetBranchCommit(opts.NewBranch) - if err != nil { - log.Error(4, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err) - return nil - } - - // 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.BRANCH_PREFIX + opts.NewBranch, - OldCommitID: opts.LastCommitID, - NewCommitID: commit.ID.String(), - Commits: pushCommits, - }); err != nil { - log.Error(4, "CommitRepoAction: %v", err) - return nil - } - - return nil -} - -// ____ ___ .__ .___ ___________.___.__ -// | | \______ | | _________ __| _/ \_ _____/| | | ____ ______ -// | | /\____ \| | / _ \__ \ / __ | | __) | | | _/ __ \ / ___/ -// | | / | |_> > |_( <_> ) __ \_/ /_/ | | \ | | |_\ ___/ \___ \ -// |______/ | __/|____/\____(____ /\____ | \___ / |___|____/\___ >____ > -// |__| \/ \/ \/ \/ \/ -// - -// Upload represent a uploaded file to a repo to be deleted when moved -type Upload struct { - ID int64 `xorm:"pk autoincr"` - UUID string `xorm:"uuid UNIQUE"` - Name string -} - -// UploadLocalPath returns where uploads is stored in local file system based on given UUID. -func UploadLocalPath(uuid string) string { - return path.Join(setting.Repository.Upload.TempPath, uuid[0:1], uuid[1:2], uuid) -} - -// LocalPath returns where uploads are temporarily stored in local file system. -func (upload *Upload) LocalPath() string { - return UploadLocalPath(upload.UUID) -} - -// NewUpload creates a new upload object. -func NewUpload(name string, buf []byte, file multipart.File) (_ *Upload, err error) { - upload := &Upload{ - UUID: gouuid.NewV4().String(), - Name: name, - } - - localPath := upload.LocalPath() - if err = os.MkdirAll(path.Dir(localPath), os.ModePerm); err != nil { - return nil, fmt.Errorf("MkdirAll: %v", err) - } - - fw, err := os.Create(localPath) - if err != nil { - return nil, fmt.Errorf("Create: %v", err) - } - defer fw.Close() - - if _, err = fw.Write(buf); err != nil { - return nil, fmt.Errorf("Write: %v", err) - } else if _, err = io.Copy(fw, file); err != nil { - return nil, fmt.Errorf("Copy: %v", err) - } - - if _, err := x.Insert(upload); err != nil { - return nil, err - } - - return upload, nil -} - -func GetUploadByUUID(uuid string) (*Upload, error) { - upload := &Upload{UUID: uuid} - has, err := x.Get(upload) - if err != nil { - return nil, err - } else if !has { - return nil, ErrUploadNotExist{0, uuid} - } - return upload, nil -} - -func GetUploadsByUUIDs(uuids []string) ([]*Upload, error) { - if len(uuids) == 0 { - return []*Upload{}, nil - } - - // Silently drop invalid uuids. - uploads := make([]*Upload, 0, len(uuids)) - return uploads, x.In("uuid", uuids).Find(&uploads) -} - -func DeleteUploads(uploads ...*Upload) (err error) { - if len(uploads) == 0 { - return nil - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - ids := make([]int64, len(uploads)) - for i := 0; i < len(uploads); i++ { - ids[i] = uploads[i].ID - } - if _, err = sess.In("id", ids).Delete(new(Upload)); err != nil { - return fmt.Errorf("delete uploads: %v", err) - } - - for _, upload := range uploads { - localPath := upload.LocalPath() - if !com.IsFile(localPath) { - continue - } - - if err := os.Remove(localPath); err != nil { - return fmt.Errorf("remove upload: %v", err) - } - } - - return sess.Commit() -} - -func DeleteUpload(u *Upload) error { - return DeleteUploads(u) -} - -func DeleteUploadByUUID(uuid string) error { - upload, err := GetUploadByUUID(uuid) - if err != nil { - if IsErrUploadNotExist(err) { - return nil - } - return fmt.Errorf("GetUploadByUUID: %v", err) - } - - if err := DeleteUpload(upload); err != nil { - return fmt.Errorf("DeleteUpload: %v", err) - } - - return nil -} - -type UploadRepoFileOptions struct { - LastCommitID string - OldBranch string - NewBranch string - TreePath string - Message string - Files []string // In UUID format. -} - -func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) (err error) { - if len(opts.Files) == 0 { - return nil - } - - uploads, err := GetUploadsByUUIDs(opts.Files) - if err != nil { - return fmt.Errorf("GetUploadsByUUIDs [uuids: %v]: %v", opts.Files, err) - } - - repoWorkingPool.CheckIn(com.ToStr(repo.ID)) - defer repoWorkingPool.CheckOut(com.ToStr(repo.ID)) - - if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil { - return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err) - } else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil { - return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err) - } - - if opts.OldBranch != opts.NewBranch { - if err = repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil { - return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err) - } - } - - localPath := repo.LocalCopyPath() - dirPath := path.Join(localPath, opts.TreePath) - os.MkdirAll(dirPath, os.ModePerm) - - // Copy uploaded files into repository. - for _, upload := range uploads { - tmpPath := upload.LocalPath() - targetPath := path.Join(dirPath, upload.Name) - if !com.IsFile(tmpPath) { - continue - } - - if err = com.Copy(tmpPath, targetPath); err != nil { - return fmt.Errorf("Copy: %v", err) - } - } - - if err = git.AddChanges(localPath, true); err != nil { - return fmt.Errorf("git add --all: %v", err) - } else if err = git.CommitChanges(localPath, git.CommitChangesOptions{ - Committer: doer.NewGitSig(), - Message: opts.Message, - }); err != nil { - return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil { - return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err) - } - - gitRepo, err := git.OpenRepository(repo.RepoPath()) - if err != nil { - log.Error(4, "OpenRepository: %v", err) - return nil - } - commit, err := gitRepo.GetBranchCommit(opts.NewBranch) - if err != nil { - log.Error(4, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err) - return nil - } - - // 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.BRANCH_PREFIX + opts.NewBranch, - OldCommitID: opts.LastCommitID, - NewCommitID: commit.ID.String(), - Commits: pushCommits, - }); err != nil { - log.Error(4, "CommitRepoAction: %v", err) - return nil - } - - return DeleteUploads(uploads...) -} diff --git a/models/repo_mirror.go b/models/repo_mirror.go deleted file mode 100644 index 8835c40d2f5..00000000000 --- a/models/repo_mirror.go +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2016 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 models - -import ( - "fmt" - "strings" - "time" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - "gopkg.in/ini.v1" - - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/process" - "github.com/gogits/gogs/modules/setting" - "github.com/gogits/gogs/modules/sync" -) - -var MirrorQueue = sync.NewUniqueQueue(setting.Repository.MirrorQueueLength) - -// Mirror represents mirror information of a repository. -type Mirror struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 - Repo *Repository `xorm:"-"` - Interval int // Hour. - EnablePrune bool `xorm:"NOT NULL DEFAULT true"` - - Updated time.Time `xorm:"-"` - UpdatedUnix int64 - NextUpdate time.Time `xorm:"-"` - NextUpdateUnix int64 - - address string `xorm:"-"` -} - -func (m *Mirror) BeforeInsert() { - m.UpdatedUnix = time.Now().Unix() - m.NextUpdateUnix = m.NextUpdate.Unix() -} - -func (m *Mirror) BeforeUpdate() { - m.UpdatedUnix = time.Now().Unix() - m.NextUpdateUnix = m.NextUpdate.Unix() -} - -func (m *Mirror) AfterSet(colName string, _ xorm.Cell) { - var err error - switch colName { - case "repo_id": - m.Repo, err = GetRepositoryByID(m.RepoID) - if err != nil { - log.Error(3, "GetRepositoryByID[%d]: %v", m.ID, err) - } - case "updated_unix": - m.Updated = time.Unix(m.UpdatedUnix, 0).Local() - case "next_updated_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) -} - -func (m *Mirror) readAddress() { - if len(m.address) > 0 { - return - } - - cfg, err := ini.Load(m.Repo.GitConfigPath()) - if err != nil { - log.Error(4, "Load: %v", err) - return - } - m.address = cfg.Section("remote \"origin\"").Key("url").Value() -} - -// HandleCloneUserCredentials replaces user credentials from HTTP/HTTPS URL -// with placeholder . -// It will fail for any other forms of clone addresses. -func HandleCloneUserCredentials(url string, mosaics bool) string { - i := strings.Index(url, "@") - if i == -1 { - return url - } - start := strings.Index(url, "://") - if start == -1 { - return url - } - if mosaics { - return url[:start+3] + "" + url[i:] - } - return url[:start+3] + url[i+1:] -} - -// Address returns mirror address from Git repository config without credentials. -func (m *Mirror) Address() string { - m.readAddress() - return HandleCloneUserCredentials(m.address, false) -} - -// FullAddress returns mirror address from Git repository config. -func (m *Mirror) FullAddress() string { - m.readAddress() - return m.address -} - -// SaveAddress writes new address to Git repository config. -func (m *Mirror) SaveAddress(addr string) error { - configPath := m.Repo.GitConfigPath() - cfg, err := ini.Load(configPath) - if err != nil { - return fmt.Errorf("Load: %v", err) - } - - cfg.Section("remote \"origin\"").Key("url").SetValue(addr) - return cfg.SaveToIndent(configPath, "\t") -} - -// runSync returns true if sync finished without error. -func (m *Mirror) runSync() bool { - repoPath := m.Repo.RepoPath() - wikiPath := m.Repo.WikiPath() - timeout := time.Duration(setting.Git.Timeout.Mirror) * time.Second - - gitArgs := []string{"remote", "update"} - if m.EnablePrune { - gitArgs = append(gitArgs, "--prune") - } - - if _, stderr, err := process.ExecDir( - timeout, repoPath, fmt.Sprintf("Mirror.runSync: %s", repoPath), - "git", gitArgs...); err != nil { - desc := fmt.Sprintf("Fail to update mirror repository '%s': %s", repoPath, stderr) - log.Error(4, desc) - if err = CreateRepositoryNotice(desc); err != nil { - log.Error(4, "CreateRepositoryNotice: %v", err) - } - return false - } - if m.Repo.HasWiki() { - if _, stderr, err := process.ExecDir( - timeout, wikiPath, fmt.Sprintf("Mirror.runSync: %s", wikiPath), - "git", "remote", "update", "--prune"); err != nil { - desc := fmt.Sprintf("Fail to update mirror wiki repository '%s': %s", wikiPath, stderr) - log.Error(4, desc) - if err = CreateRepositoryNotice(desc); err != nil { - log.Error(4, "CreateRepositoryNotice: %v", err) - } - return false - } - } - - return true -} - -func getMirrorByRepoID(e Engine, repoID int64) (*Mirror, error) { - m := &Mirror{RepoID: repoID} - has, err := e.Get(m) - if err != nil { - return nil, err - } else if !has { - return nil, ErrMirrorNotExist - } - return m, nil -} - -// GetMirrorByRepoID returns mirror information of a repository. -func GetMirrorByRepoID(repoID int64) (*Mirror, error) { - return getMirrorByRepoID(x, repoID) -} - -func updateMirror(e Engine, m *Mirror) error { - _, err := e.Id(m.ID).AllCols().Update(m) - return err -} - -func UpdateMirror(m *Mirror) error { - return updateMirror(x, m) -} - -func DeleteMirrorByRepoID(repoID int64) error { - _, err := x.Delete(&Mirror{RepoID: repoID}) - return err -} - -// MirrorUpdate checks and updates mirror repositories. -func MirrorUpdate() { - if taskStatusTable.IsRunning(_MIRROR_UPDATE) { - return - } - taskStatusTable.Start(_MIRROR_UPDATE) - defer taskStatusTable.Stop(_MIRROR_UPDATE) - - log.Trace("Doing: MirrorUpdate") - - if err := x.Where("next_update_unix<=?", time.Now().Unix()).Iterate(new(Mirror), func(idx int, bean interface{}) error { - m := bean.(*Mirror) - if m.Repo == nil { - log.Error(4, "Disconnected mirror repository found: %d", m.ID) - return nil - } - - MirrorQueue.Add(m.RepoID) - return nil - }); err != nil { - log.Error(4, "MirrorUpdate: %v", err) - } -} - -// SyncMirrors checks and syncs mirrors. -// TODO: sync more mirrors at same time. -func SyncMirrors() { - // Start listening on new sync requests. - for repoID := range MirrorQueue.Queue() { - log.Trace("SyncMirrors [repo_id: %v]", repoID) - MirrorQueue.Remove(repoID) - - m, err := GetMirrorByRepoID(com.StrTo(repoID).MustInt64()) - if err != nil { - log.Error(4, "GetMirrorByRepoID [%d]: %v", repoID, err) - continue - } - - if !m.runSync() { - continue - } - - m.ScheduleNextUpdate() - if err = UpdateMirror(m); err != nil { - log.Error(4, "UpdateMirror [%d]: %v", repoID, err) - continue - } - } -} - -func InitSyncMirrors() { - go SyncMirrors() -} diff --git a/models/repo_test.go b/models/repo_test.go deleted file mode 100644 index 69d90b938fc..00000000000 --- a/models/repo_test.go +++ /dev/null @@ -1,62 +0,0 @@ -package models_test - -import ( - . "github.com/gogits/gogs/models" - . "github.com/smartystreets/goconvey/convey" - "testing" - - "github.com/gogits/gogs/modules/markdown" -) - -func TestRepo(t *testing.T) { - Convey("The metas map", t, func() { - var repo = new(Repository) - repo.Name = "testrepo" - repo.Owner = new(User) - repo.Owner.Name = "testuser" - repo.ExternalTrackerFormat = "https://someurl.com/{user}/{repo}/{issue}" - - Convey("When no external tracker is configured", func() { - Convey("It should be nil", func() { - repo.EnableExternalTracker = false - So(repo.ComposeMetas(), ShouldEqual, map[string]string(nil)) - }) - Convey("It should be nil even if other settings are present", func() { - repo.EnableExternalTracker = false - repo.ExternalTrackerFormat = "http://someurl.com/{user}/{repo}/{issue}" - repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC - So(repo.ComposeMetas(), ShouldEqual, map[string]string(nil)) - }) - }) - - Convey("When an external issue tracker is configured", func() { - repo.EnableExternalTracker = true - Convey("It should default to numeric issue style", func() { - metas := repo.ComposeMetas() - So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_NUMERIC) - }) - Convey("It should pass through numeric issue style setting", func() { - repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC - metas := repo.ComposeMetas() - So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_NUMERIC) - }) - Convey("It should pass through alphanumeric issue style setting", func() { - repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_ALPHANUMERIC - metas := repo.ComposeMetas() - So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_ALPHANUMERIC) - }) - Convey("It should contain the user name", func() { - metas := repo.ComposeMetas() - So(metas["user"], ShouldEqual, "testuser") - }) - Convey("It should contain the repo name", func() { - metas := repo.ComposeMetas() - So(metas["repo"], ShouldEqual, "testrepo") - }) - Convey("It should contain the URL format", func() { - metas := repo.ComposeMetas() - So(metas["format"], ShouldEqual, "https://someurl.com/{user}/{repo}/{issue}") - }) - }) - }) -} diff --git a/models/ssh_key.go b/models/ssh_key.go deleted file mode 100644 index 0925b9ba766..00000000000 --- a/models/ssh_key.go +++ /dev/null @@ -1,758 +0,0 @@ -// Copyright 2014 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 models - -import ( - "encoding/base64" - "encoding/binary" - "errors" - "fmt" - "io/ioutil" - "math/big" - "os" - "path" - "path/filepath" - "strings" - "sync" - "time" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - "golang.org/x/crypto/ssh" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/process" - "github.com/gogits/gogs/modules/setting" -) - -const ( - _TPL_PUBLICK_KEY = `command="%s serv key-%d --config='%s'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty %s` + "\n" -) - -var sshOpLocker sync.Mutex - -type KeyType int - -const ( - KEY_TYPE_USER = iota + 1 - KEY_TYPE_DEPLOY -) - -// PublicKey represents a user or deploy SSH public key. -type PublicKey struct { - ID int64 `xorm:"pk autoincr"` - OwnerID int64 `xorm:"INDEX NOT NULL"` - Name string `xorm:"NOT NULL"` - Fingerprint string `xorm:"NOT NULL"` - Content string `xorm:"TEXT NOT NULL"` - Mode AccessMode `xorm:"NOT NULL DEFAULT 2"` - Type KeyType `xorm:"NOT NULL DEFAULT 1"` - - Created time.Time `xorm:"-"` - CreatedUnix int64 - Updated time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. - UpdatedUnix int64 - HasRecentActivity bool `xorm:"-"` - HasUsed bool `xorm:"-"` -} - -func (k *PublicKey) BeforeInsert() { - k.CreatedUnix = time.Now().Unix() -} - -func (k *PublicKey) BeforeUpdate() { - k.UpdatedUnix = time.Now().Unix() -} - -func (k *PublicKey) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "created_unix": - k.Created = time.Unix(k.CreatedUnix, 0).Local() - case "updated_unix": - k.Updated = time.Unix(k.UpdatedUnix, 0).Local() - k.HasUsed = k.Updated.After(k.Created) - k.HasRecentActivity = k.Updated.Add(7 * 24 * time.Hour).After(time.Now()) - } -} - -// OmitEmail returns content of public key without email address. -func (k *PublicKey) OmitEmail() string { - return strings.Join(strings.Split(k.Content, " ")[:2], " ") -} - -// AuthorizedString returns formatted public key string for authorized_keys file. -func (key *PublicKey) AuthorizedString() string { - return fmt.Sprintf(_TPL_PUBLICK_KEY, setting.AppPath, key.ID, setting.CustomConf, key.Content) -} - -func extractTypeFromBase64Key(key string) (string, error) { - b, err := base64.StdEncoding.DecodeString(key) - if err != nil || len(b) < 4 { - return "", fmt.Errorf("invalid key format: %v", err) - } - - keyLength := int(binary.BigEndian.Uint32(b)) - if len(b) < 4+keyLength { - return "", fmt.Errorf("invalid key format: not enough length %d", keyLength) - } - - return string(b[4 : 4+keyLength]), nil -} - -// parseKeyString parses any key string in OpenSSH or SSH2 format to clean OpenSSH string (RFC4253). -func parseKeyString(content string) (string, error) { - // Transform all legal line endings to a single "\n". - content = strings.NewReplacer("\r\n", "\n", "\r", "\n").Replace(content) - lines := strings.Split(content, "\n") - - var keyType, keyContent, keyComment string - - if len(lines) == 1 { - // Parse OpenSSH format. - parts := strings.SplitN(lines[0], " ", 3) - switch len(parts) { - case 0: - return "", errors.New("empty key") - case 1: - keyContent = parts[0] - case 2: - keyType = parts[0] - keyContent = parts[1] - default: - keyType = parts[0] - keyContent = parts[1] - keyComment = parts[2] - } - - // If keyType is not given, extract it from content. If given, validate it. - t, err := extractTypeFromBase64Key(keyContent) - if err != nil { - return "", fmt.Errorf("extractTypeFromBase64Key: %v", err) - } - if len(keyType) == 0 { - keyType = t - } else if keyType != t { - return "", fmt.Errorf("key type and content does not match: %s - %s", keyType, t) - } - } else { - // Parse SSH2 file format. - continuationLine := false - - for _, line := range lines { - // Skip lines that: - // 1) are a continuation of the previous line, - // 2) contain ":" as that are comment lines - // 3) contain "-" as that are begin and end tags - if continuationLine || strings.ContainsAny(line, ":-") { - continuationLine = strings.HasSuffix(line, "\\") - } else { - keyContent = keyContent + line - } - } - - t, err := extractTypeFromBase64Key(keyContent) - if err != nil { - return "", fmt.Errorf("extractTypeFromBase64Key: %v", err) - } - keyType = t - } - return keyType + " " + keyContent + " " + keyComment, nil -} - -// writeTmpKeyFile writes key content to a temporary file -// and returns the name of that file, along with any possible errors. -func writeTmpKeyFile(content string) (string, error) { - tmpFile, err := ioutil.TempFile(setting.SSH.KeyTestPath, "gogs_keytest") - if err != nil { - return "", fmt.Errorf("TempFile: %v", err) - } - defer tmpFile.Close() - - if _, err = tmpFile.WriteString(content); err != nil { - return "", fmt.Errorf("WriteString: %v", err) - } - return tmpFile.Name(), nil -} - -// SSHKeyGenParsePublicKey extracts key type and length using ssh-keygen. -func SSHKeyGenParsePublicKey(key string) (string, int, error) { - // The ssh-keygen in Windows does not print key type, so no need go further. - if setting.IsWindows { - return "", 0, nil - } - - tmpName, err := writeTmpKeyFile(key) - if err != nil { - return "", 0, fmt.Errorf("writeTmpKeyFile: %v", err) - } - defer os.Remove(tmpName) - - stdout, stderr, err := process.Exec("SSHKeyGenParsePublicKey", setting.SSH.KeygenPath, "-lf", tmpName) - if err != nil { - return "", 0, fmt.Errorf("fail to parse public key: %s - %s", err, stderr) - } - if strings.Contains(stdout, "is not a public key file") { - return "", 0, ErrKeyUnableVerify{stdout} - } - - fields := strings.Split(stdout, " ") - if len(fields) < 4 { - return "", 0, fmt.Errorf("invalid public key line: %s", stdout) - } - - keyType := strings.Trim(fields[len(fields)-1], "()\r\n") - return strings.ToLower(keyType), com.StrTo(fields[0]).MustInt(), nil -} - -// SSHNativeParsePublicKey extracts the key type and length using the golang SSH library. -// NOTE: ed25519 is not supported. -func SSHNativeParsePublicKey(keyLine string) (string, int, error) { - fields := strings.Fields(keyLine) - if len(fields) < 2 { - return "", 0, fmt.Errorf("not enough fields in public key line: %s", string(keyLine)) - } - - raw, err := base64.StdEncoding.DecodeString(fields[1]) - if err != nil { - return "", 0, err - } - - pkey, err := ssh.ParsePublicKey(raw) - if err != nil { - if strings.Contains(err.Error(), "ssh: unknown key algorithm") { - return "", 0, ErrKeyUnableVerify{err.Error()} - } - return "", 0, fmt.Errorf("ParsePublicKey: %v", err) - } - - // The ssh library can parse the key, so next we find out what key exactly we have. - switch pkey.Type() { - case ssh.KeyAlgoDSA: - rawPub := struct { - Name string - P, Q, G, Y *big.Int - }{} - if err := ssh.Unmarshal(pkey.Marshal(), &rawPub); err != nil { - return "", 0, err - } - // as per https://bugzilla.mindrot.org/show_bug.cgi?id=1647 we should never - // see dsa keys != 1024 bit, but as it seems to work, we will not check here - return "dsa", rawPub.P.BitLen(), nil // use P as per crypto/dsa/dsa.go (is L) - case ssh.KeyAlgoRSA: - rawPub := struct { - Name string - E *big.Int - N *big.Int - }{} - if err := ssh.Unmarshal(pkey.Marshal(), &rawPub); err != nil { - return "", 0, err - } - return "rsa", rawPub.N.BitLen(), nil // use N as per crypto/rsa/rsa.go (is bits) - case ssh.KeyAlgoECDSA256: - return "ecdsa", 256, nil - case ssh.KeyAlgoECDSA384: - return "ecdsa", 384, nil - case ssh.KeyAlgoECDSA521: - return "ecdsa", 521, nil - case "ssh-ed25519": // TODO: replace with ssh constant when available - return "ed25519", 256, nil - } - return "", 0, fmt.Errorf("unsupported key length detection for type: %s", pkey.Type()) -} - -// CheckPublicKeyString checks if the given public key string is recognized by SSH. -// It returns the actual public key line on success. -func CheckPublicKeyString(content string) (_ string, err error) { - if setting.SSH.Disabled { - return "", errors.New("SSH is disabled") - } - - content, err = parseKeyString(content) - if err != nil { - return "", err - } - - content = strings.TrimRight(content, "\n\r") - if strings.ContainsAny(content, "\n\r") { - return "", errors.New("only a single line with a single key please") - } - - // remove any unnecessary whitespace now - content = strings.TrimSpace(content) - - var ( - fnName string - keyType string - length int - ) - if setting.SSH.StartBuiltinServer { - fnName = "SSHNativeParsePublicKey" - keyType, length, err = SSHNativeParsePublicKey(content) - } else { - fnName = "SSHKeyGenParsePublicKey" - keyType, length, err = SSHKeyGenParsePublicKey(content) - } - if err != nil { - return "", fmt.Errorf("%s: %v", fnName, err) - } - log.Trace("Key info [native: %v]: %s-%d", setting.SSH.StartBuiltinServer, keyType, length) - - if !setting.SSH.MinimumKeySizeCheck { - return content, nil - } - if minLen, found := setting.SSH.MinimumKeySizes[keyType]; found && length >= minLen { - return content, nil - } else if found && length < minLen { - return "", fmt.Errorf("key length is not enough: got %d, needs %d", length, minLen) - } - return "", fmt.Errorf("key type is not allowed: %s", keyType) -} - -// appendAuthorizedKeysToFile appends new SSH keys' content to authorized_keys file. -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) - if err != nil { - return err - } - defer f.Close() - - // Note: chmod command does not support in Windows. - if !setting.IsWindows { - fi, err := f.Stat() - if err != nil { - return err - } - - // .ssh directory should have mode 700, and authorized_keys file should have mode 600. - if fi.Mode().Perm() > 0600 { - log.Error(4, "authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String()) - if err = f.Chmod(0600); err != nil { - return err - } - } - } - - for _, key := range keys { - if _, err = f.WriteString(key.AuthorizedString()); err != nil { - return err - } - } - return nil -} - -// checkKeyContent onlys checks if key content has been used as public key, -// it is OK to use same key as deploy key for multiple repositories/users. -func checkKeyContent(content string) error { - has, err := x.Get(&PublicKey{ - Content: content, - Type: KEY_TYPE_USER, - }) - if err != nil { - return err - } else if has { - return ErrKeyAlreadyExist{0, content} - } - return nil -} - -func addKey(e Engine, key *PublicKey) (err error) { - // Calculate fingerprint. - tmpPath := strings.Replace(path.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond()), - "id_rsa.pub"), "\\", "/", -1) - os.MkdirAll(path.Dir(tmpPath), os.ModePerm) - if err = ioutil.WriteFile(tmpPath, []byte(key.Content), 0644); err != nil { - return err - } - stdout, stderr, err := process.Exec("AddPublicKey", "ssh-keygen", "-lf", tmpPath) - if err != nil { - return fmt.Errorf("'ssh-keygen -lf %s' failed with error '%s': %s", tmpPath, err, stderr) - } else if len(stdout) < 2 { - return errors.New("not enough output for calculating fingerprint: " + stdout) - } - key.Fingerprint = strings.Split(stdout, " ")[1] - - // Save SSH key. - if _, err = e.Insert(key); err != nil { - return err - } - - // Don't need to rewrite this file if builtin SSH server is enabled. - if setting.SSH.StartBuiltinServer { - return nil - } - return appendAuthorizedKeysToFile(key) -} - -// AddPublicKey adds new public key to database and authorized_keys file. -func AddPublicKey(ownerID int64, name, content string) (*PublicKey, error) { - log.Trace(content) - if err := checkKeyContent(content); err != nil { - return nil, err - } - - // Key name of same user cannot be duplicated. - has, err := x.Where("owner_id = ? AND name = ?", ownerID, name).Get(new(PublicKey)) - if err != nil { - return nil, err - } else if has { - return nil, ErrKeyNameAlreadyUsed{ownerID, name} - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return nil, err - } - - key := &PublicKey{ - OwnerID: ownerID, - Name: name, - Content: content, - Mode: ACCESS_MODE_WRITE, - Type: KEY_TYPE_USER, - } - if err = addKey(sess, key); err != nil { - return nil, fmt.Errorf("addKey: %v", err) - } - - return key, sess.Commit() -} - -// GetPublicKeyByID returns public key by given ID. -func GetPublicKeyByID(keyID int64) (*PublicKey, error) { - key := new(PublicKey) - has, err := x.Id(keyID).Get(key) - if err != nil { - return nil, err - } else if !has { - return nil, ErrKeyNotExist{keyID} - } - return key, nil -} - -// SearchPublicKeyByContent searches content as prefix (leak e-mail part) -// and returns public key found. -func SearchPublicKeyByContent(content string) (*PublicKey, error) { - key := new(PublicKey) - has, err := x.Where("content like ?", content+"%").Get(key) - if err != nil { - return nil, err - } else if !has { - return nil, ErrKeyNotExist{} - } - return key, nil -} - -// ListPublicKeys returns a list of public keys belongs to given user. -func ListPublicKeys(uid int64) ([]*PublicKey, error) { - keys := make([]*PublicKey, 0, 5) - return keys, x.Where("owner_id = ?", uid).Find(&keys) -} - -// UpdatePublicKey updates given public key. -func UpdatePublicKey(key *PublicKey) error { - _, err := x.Id(key.ID).AllCols().Update(key) - return err -} - -// 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 { - return nil - } - - _, err := e.In("id", strings.Join(base.Int64sToStrings(keyIDs), ",")).Delete(new(PublicKey)) - return err -} - -// DeletePublicKey deletes SSH key information both in database and authorized_keys file. -func DeletePublicKey(doer *User, id int64) (err error) { - key, err := GetPublicKeyByID(id) - if err != nil { - if IsErrKeyNotExist(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 ErrKeyAccessDenied{doer.ID, key.ID, "public"} - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if err = deletePublicKeys(sess, id); err != nil { - return err - } - - if err = sess.Commit(); err != nil { - return err - } - - return RewriteAllPublicKeys() -} - -// RewriteAllPublicKeys removes any authorized key and rewrite all keys from database again. -// Note: x.Iterate does not get latest data after insert/delete, so we have to call this function -// outsite any session scope independently. -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) - if err != nil { - return err - } - defer os.Remove(tmpPath) - - err = x.Iterate(new(PublicKey), func(idx int, bean interface{}) (err error) { - _, err = f.WriteString((bean.(*PublicKey)).AuthorizedString()) - return err - }) - f.Close() - if err != nil { - return err - } - - if com.IsExist(fpath) { - if err = os.Remove(fpath); err != nil { - return err - } - } - if err = os.Rename(tmpPath, fpath); err != nil { - return err - } - - return nil -} - -// ________ .__ ____ __. -// \______ \ ____ ______ | | ____ ___.__.| |/ _|____ ___.__. -// | | \_/ __ \\____ \| | / _ < | || <_/ __ < | | -// | ` \ ___/| |_> > |_( <_> )___ || | \ ___/\___ | -// /_______ /\___ > __/|____/\____// ____||____|__ \___ > ____| -// \/ \/|__| \/ \/ \/\/ - -// DeployKey represents deploy key information and its relation with repository. -type DeployKey struct { - ID int64 `xorm:"pk autoincr"` - KeyID int64 `xorm:"UNIQUE(s) INDEX"` - RepoID int64 `xorm:"UNIQUE(s) INDEX"` - Name string - Fingerprint string - Content string `xorm:"-"` - - Created time.Time `xorm:"-"` - CreatedUnix int64 - Updated time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. - UpdatedUnix int64 - HasRecentActivity bool `xorm:"-"` - HasUsed bool `xorm:"-"` -} - -func (k *DeployKey) BeforeInsert() { - k.CreatedUnix = time.Now().Unix() -} - -func (k *DeployKey) BeforeUpdate() { - k.UpdatedUnix = time.Now().Unix() -} - -func (k *DeployKey) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "created_unix": - k.Created = time.Unix(k.CreatedUnix, 0).Local() - case "updated_unix": - k.Updated = time.Unix(k.UpdatedUnix, 0).Local() - k.HasUsed = k.Updated.After(k.Created) - k.HasRecentActivity = k.Updated.Add(7 * 24 * time.Hour).After(time.Now()) - } -} - -// GetContent gets associated public key content. -func (k *DeployKey) GetContent() error { - pkey, err := GetPublicKeyByID(k.KeyID) - if err != nil { - return err - } - k.Content = pkey.Content - return nil -} - -func checkDeployKey(e Engine, keyID, repoID int64, name string) error { - // Note: We want error detail, not just true or false here. - has, err := e.Where("key_id = ? AND repo_id = ?", keyID, repoID).Get(new(DeployKey)) - if err != nil { - return err - } else if has { - return ErrDeployKeyAlreadyExist{keyID, repoID} - } - - has, err = e.Where("repo_id = ? AND name = ?", repoID, name).Get(new(DeployKey)) - if err != nil { - return err - } else if has { - return ErrDeployKeyNameAlreadyUsed{repoID, name} - } - - return nil -} - -// addDeployKey adds new key-repo relation. -func addDeployKey(e *xorm.Session, keyID, repoID int64, name, fingerprint string) (*DeployKey, error) { - if err := checkDeployKey(e, keyID, repoID, name); err != nil { - return nil, err - } - - key := &DeployKey{ - KeyID: keyID, - RepoID: repoID, - Name: name, - Fingerprint: fingerprint, - } - _, err := e.Insert(key) - return key, err -} - -// HasDeployKey returns true if public key is a deploy key of given repository. -func HasDeployKey(keyID, repoID int64) bool { - has, _ := x.Where("key_id = ? AND repo_id = ?", keyID, repoID).Get(new(DeployKey)) - return has -} - -// AddDeployKey add new deploy key to database and authorized_keys file. -func AddDeployKey(repoID int64, name, content string) (*DeployKey, error) { - if err := checkKeyContent(content); err != nil { - return nil, err - } - - pkey := &PublicKey{ - Content: content, - Mode: ACCESS_MODE_READ, - Type: KEY_TYPE_DEPLOY, - } - has, err := x.Get(pkey) - if err != nil { - return nil, err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return nil, err - } - - // First time use this deploy key. - if !has { - if err = addKey(sess, pkey); err != nil { - return nil, fmt.Errorf("addKey: %v", err) - } - } - - key, err := addDeployKey(sess, pkey.ID, repoID, name, pkey.Fingerprint) - if err != nil { - return nil, fmt.Errorf("addDeployKey: %v", err) - } - - return key, sess.Commit() -} - -// GetDeployKeyByID returns deploy key by given ID. -func GetDeployKeyByID(id int64) (*DeployKey, error) { - key := new(DeployKey) - has, err := x.Id(id).Get(key) - if err != nil { - return nil, err - } else if !has { - return nil, ErrDeployKeyNotExist{id, 0, 0} - } - return key, nil -} - -// GetDeployKeyByRepo returns deploy key by given public key ID and repository ID. -func GetDeployKeyByRepo(keyID, repoID int64) (*DeployKey, error) { - key := &DeployKey{ - KeyID: keyID, - RepoID: repoID, - } - has, err := x.Get(key) - if err != nil { - return nil, err - } else if !has { - return nil, ErrDeployKeyNotExist{0, keyID, repoID} - } - return key, nil -} - -// UpdateDeployKey updates deploy key information. -func UpdateDeployKey(key *DeployKey) error { - _, err := x.Id(key.ID).AllCols().Update(key) - return err -} - -// DeleteDeployKey deletes deploy key from its repository authorized_keys file if needed. -func DeleteDeployKey(doer *User, id int64) error { - key, err := GetDeployKeyByID(id) - if err != nil { - if IsErrDeployKeyNotExist(err) { - return nil - } - return fmt.Errorf("GetDeployKeyByID: %v", err) - } - - // Check if user has access to delete this key. - if !doer.IsAdmin { - repo, err := GetRepositoryByID(key.RepoID) - if err != nil { - return fmt.Errorf("GetRepositoryByID: %v", err) - } - yes, err := HasAccess(doer, repo, ACCESS_MODE_ADMIN) - if err != nil { - return fmt.Errorf("HasAccess: %v", err) - } else if !yes { - return ErrKeyAccessDenied{doer.ID, key.ID, "deploy"} - } - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Id(key.ID).Delete(new(DeployKey)); err != nil { - return fmt.Errorf("delete deploy key [%d]: %v", key.ID, err) - } - - // Check if this is the last reference to same key content. - has, err := sess.Where("key_id = ?", key.KeyID).Get(new(DeployKey)) - if err != nil { - return err - } else if !has { - if err = deletePublicKeys(sess, key.KeyID); err != nil { - return err - } - } - - return sess.Commit() -} - -// ListDeployKeys returns all deploy keys by given repository ID. -func ListDeployKeys(repoID int64) ([]*DeployKey, error) { - keys := make([]*DeployKey, 0, 5) - return keys, x.Where("repo_id = ?", repoID).Find(&keys) -} diff --git a/models/ssh_key_test.go b/models/ssh_key_test.go deleted file mode 100644 index 1cda60c5087..00000000000 --- a/models/ssh_key_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2016 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 models - -import ( - "fmt" - "strings" - "testing" - - . "github.com/smartystreets/goconvey/convey" - - "github.com/gogits/gogs/modules/setting" -) - -func init() { - setting.NewContext() -} - -func Test_SSHParsePublicKey(t *testing.T) { - testKeys := map[string]struct { - typeName string - length int - content string - }{ - "dsa-1024": {"dsa", 1024, "ssh-dss AAAAB3NzaC1kc3MAAACBAOChCC7lf6Uo9n7BmZ6M8St19PZf4Tn59NriyboW2x/DZuYAz3ibZ2OkQ3S0SqDIa0HXSEJ1zaExQdmbO+Ux/wsytWZmCczWOVsaszBZSl90q8UnWlSH6P+/YA+RWJm5SFtuV9PtGIhyZgoNuz5kBQ7K139wuQsecdKktISwTakzAAAAFQCzKsO2JhNKlL+wwwLGOcLffoAmkwAAAIBpK7/3xvduajLBD/9vASqBQIHrgK2J+wiQnIb/Wzy0UsVmvfn8A+udRbBo+csM8xrSnlnlJnjkJS3qiM5g+eTwsLIV1IdKPEwmwB+VcP53Cw6lSyWyJcvhFb0N6s08NZysLzvj0N+ZC/FnhKTLzIyMtkHf/IrPCwlM+pV/M/96YgAAAIEAqQcGn9CKgzgPaguIZooTAOQdvBLMI5y0bQjOW6734XOpqQGf/Kra90wpoasLKZjSYKNPjE+FRUOrStLrxcNs4BeVKhy2PYTRnybfYVk1/dmKgH6P1YSRONsGKvTsH6c5IyCRG0ncCgYeF8tXppyd642982daopE7zQ/NPAnJfag= nocomment"}, - "rsa-1024": {"rsa", 1024, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAu7tvIvX6ZHrRXuZNfkR3XLHSsuCK9Zn3X58lxBcQzuo5xZgB6vRwwm/QtJuF+zZPtY5hsQILBLmF+BZ5WpKZp1jBeSjH2G7lxet9kbcH+kIVj0tPFEoyKI9wvWqIwC4prx/WVk2wLTJjzBAhyNxfEq7C9CeiX9pQEbEqJfkKCQ== nocomment\n"}, - "rsa-2048": {"rsa", 2048, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMZXh+1OBUwSH9D45wTaxErQIN9IoC9xl7MKJkqvTvv6O5RR9YW/IK9FbfjXgXsppYGhsCZo1hFOOsXHMnfOORqu/xMDx4yPuyvKpw4LePEcg4TDipaDFuxbWOqc/BUZRZcXu41QAWfDLrInwsltWZHSeG7hjhpacl4FrVv9V1pS6Oc5Q1NxxEzTzuNLS/8diZrTm/YAQQ/+B+mzWI3zEtF4miZjjAljWd1LTBPvU23d29DcBmmFahcZ441XZsTeAwGxG/Q6j8NgNXj9WxMeWwxXV2jeAX/EBSpZrCVlCQ1yJswT6xCp8TuBnTiGWYMBNTbOZvPC4e0WI2/yZW/s5F nocomment"}, - "ecdsa-256": {"ecdsa", 256, "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFQacN3PrOll7PXmN5B/ZNVahiUIqI05nbBlZk1KXsO3d06ktAWqbNflv2vEmA38bTFTfJ2sbn2B5ksT52cDDbA= nocomment"}, - "ecdsa-384": {"ecdsa", 384, "ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBINmioV+XRX1Fm9Qk2ehHXJ2tfVxW30ypUWZw670Zyq5GQfBAH6xjygRsJ5wWsHXBsGYgFUXIHvMKVAG1tpw7s6ax9oA+dJOJ7tj+vhn8joFqT+sg3LYHgZkHrfqryRasQ== nocomment"}, - // "ecdsa-521": {"ecdsa", 521, "ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBACGt3UG3EzRwNOI17QR84l6PgiAcvCE7v6aXPj/SC6UWKg4EL8vW9ZBcdYL9wzs4FZXh4MOV8jAzu3KRWNTwb4k2wFNUpGOt7l28MztFFEtH5BDDrtAJSPENPy8pvPLMfnPg5NhvWycqIBzNcHipem5wSJFN5PdpNOC2xMrPWKNqj+ZjQ== nocomment"}, - } - - Convey("Parse public keys in both native and ssh-keygen", t, func() { - for name, key := range testKeys { - fmt.Println("\nTesting key:", name) - - keyTypeN, lengthN, errN := SSHNativeParsePublicKey(key.content) - So(errN, ShouldBeNil) - So(keyTypeN, ShouldEqual, key.typeName) - So(lengthN, ShouldEqual, key.length) - - keyTypeK, lengthK, errK := SSHKeyGenParsePublicKey(key.content) - if errK != nil { - // Some server just does not support ecdsa format. - if strings.Contains(errK.Error(), "line 1 too long:") { - continue - } - So(errK, ShouldBeNil) - } - So(keyTypeK, ShouldEqual, key.typeName) - So(lengthK, ShouldEqual, key.length) - } - }) -} diff --git a/models/token.go b/models/token.go deleted file mode 100644 index 2c1f64ce03e..00000000000 --- a/models/token.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2014 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 models - -import ( - "time" - - "github.com/go-xorm/xorm" - gouuid "github.com/satori/go.uuid" - - "github.com/gogits/gogs/modules/base" -) - -// AccessToken represents a personal access token. -type AccessToken struct { - ID int64 `xorm:"pk autoincr"` - UID int64 `xorm:"INDEX"` - Name string - Sha1 string `xorm:"UNIQUE VARCHAR(40)"` - - Created time.Time `xorm:"-"` - CreatedUnix int64 - Updated time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. - UpdatedUnix int64 - HasRecentActivity bool `xorm:"-"` - HasUsed bool `xorm:"-"` -} - -func (t *AccessToken) BeforeInsert() { - t.CreatedUnix = time.Now().Unix() -} - -func (t *AccessToken) BeforeUpdate() { - t.UpdatedUnix = time.Now().Unix() -} - -func (t *AccessToken) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "created_unix": - t.Created = time.Unix(t.CreatedUnix, 0).Local() - case "updated_unix": - t.Updated = time.Unix(t.UpdatedUnix, 0).Local() - t.HasUsed = t.Updated.After(t.Created) - t.HasRecentActivity = t.Updated.Add(7 * 24 * time.Hour).After(time.Now()) - } -} - -// NewAccessToken creates new access token. -func NewAccessToken(t *AccessToken) error { - t.Sha1 = base.EncodeSha1(gouuid.NewV4().String()) - _, err := x.Insert(t) - return err -} - -// GetAccessTokenBySHA returns access token by given sha1. -func GetAccessTokenBySHA(sha string) (*AccessToken, error) { - if sha == "" { - return nil, ErrAccessTokenEmpty{} - } - t := &AccessToken{Sha1: sha} - has, err := x.Get(t) - if err != nil { - return nil, err - } else if !has { - return nil, ErrAccessTokenNotExist{sha} - } - return t, nil -} - -// ListAccessTokens returns a list of access tokens belongs to given user. -func ListAccessTokens(uid int64) ([]*AccessToken, error) { - tokens := make([]*AccessToken, 0, 5) - return tokens, x.Where("uid=?", uid).Desc("id").Find(&tokens) -} - -// UpdateAccessToken updates information of access token. -func UpdateAccessToken(t *AccessToken) error { - _, err := x.Id(t.ID).AllCols().Update(t) - return err -} - -// DeleteAccessTokenByID deletes access token by given ID. -func DeleteAccessTokenByID(id int64) error { - _, err := x.Id(id).Delete(new(AccessToken)) - return err -} diff --git a/models/update.go b/models/update.go deleted file mode 100644 index 79d62c8f6a8..00000000000 --- a/models/update.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2014 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 models - -import ( - "container/list" - "fmt" - "os/exec" - "strings" - - git "github.com/gogits/git-module" - - "github.com/gogits/gogs/modules/log" -) - -type UpdateTask struct { - ID int64 `xorm:"pk autoincr"` - UUID string `xorm:"index"` - RefName string - OldCommitID string - NewCommitID string -} - -func AddUpdateTask(task *UpdateTask) error { - _, err := x.Insert(task) - return err -} - -// GetUpdateTaskByUUID returns update task by given UUID. -func GetUpdateTaskByUUID(uuid string) (*UpdateTask, error) { - task := &UpdateTask{ - UUID: uuid, - } - has, err := x.Get(task) - if err != nil { - return nil, err - } else if !has { - return nil, ErrUpdateTaskNotExist{uuid} - } - return task, nil -} - -func DeleteUpdateTaskByUUID(uuid string) error { - _, err := x.Delete(&UpdateTask{UUID: uuid}) - return err -} - -// CommitToPushCommit transforms a git.Commit to PushCommit type. -func CommitToPushCommit(commit *git.Commit) *PushCommit { - return &PushCommit{ - Sha1: commit.ID.String(), - Message: commit.Message(), - AuthorEmail: commit.Author.Email, - AuthorName: commit.Author.Name, - CommitterEmail: commit.Committer.Email, - CommitterName: commit.Committer.Name, - Timestamp: commit.Author.When, - } -} - -func ListToPushCommits(l *list.List) *PushCommits { - commits := make([]*PushCommit, 0) - var actEmail string - for e := l.Front(); e != nil; e = e.Next() { - commit := e.Value.(*git.Commit) - if actEmail == "" { - actEmail = commit.Committer.Email - } - commits = append(commits, CommitToPushCommit(commit)) - } - return &PushCommits{l.Len(), commits, "", nil} -} - -type PushUpdateOptions struct { - PusherID int64 - PusherName string - RepoUserName string - RepoName string - RefFullName string - OldCommitID string - NewCommitID string -} - -// PushUpdate must be called for any push actions in order to -// generates necessary push action history feeds. -func PushUpdate(opts PushUpdateOptions) (err error) { - isNewRef := opts.OldCommitID == git.EMPTY_SHA - isDelRef := opts.NewCommitID == git.EMPTY_SHA - if isNewRef && isDelRef { - return fmt.Errorf("Old and new revisions are both %s", git.EMPTY_SHA) - } - - repoPath := RepoPath(opts.RepoUserName, opts.RepoName) - - gitUpdate := exec.Command("git", "update-server-info") - gitUpdate.Dir = repoPath - if err = gitUpdate.Run(); err != nil { - return fmt.Errorf("Fail to call 'git update-server-info': %v", err) - } - - if isDelRef { - log.GitLogger.Info("Reference '%s' has been deleted from '%s/%s' by %d", - opts.RefFullName, opts.RepoUserName, opts.RepoName, opts.PusherName) - return nil - } - - gitRepo, err := git.OpenRepository(repoPath) - if err != nil { - return fmt.Errorf("OpenRepository: %v", err) - } - - owner, err := GetUserByName(opts.RepoUserName) - if err != nil { - return fmt.Errorf("GetUserByName: %v", err) - } - - repo, err := GetRepositoryByName(owner.ID, opts.RepoName) - if err != nil { - return fmt.Errorf("GetRepositoryByName: %v", err) - } - - // Push tags. - if strings.HasPrefix(opts.RefFullName, git.TAG_PREFIX) { - if err := CommitRepoAction(CommitRepoActionOptions{ - PusherName: opts.PusherName, - RepoOwnerID: owner.ID, - RepoName: repo.Name, - RefFullName: opts.RefFullName, - OldCommitID: opts.OldCommitID, - NewCommitID: opts.NewCommitID, - Commits: &PushCommits{}, - }); err != nil { - return fmt.Errorf("CommitRepoAction (tag): %v", err) - } - return nil - } - - newCommit, err := gitRepo.GetCommit(opts.NewCommitID) - if err != nil { - return fmt.Errorf("gitRepo.GetCommit: %v", err) - } - - // Push new branch. - var l *list.List - if isNewRef { - l, err = newCommit.CommitsBeforeLimit(10) - if err != nil { - return fmt.Errorf("newCommit.CommitsBeforeLimit: %v", err) - } - } else { - l, err = newCommit.CommitsBeforeUntil(opts.OldCommitID) - if err != nil { - return fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err) - } - } - - if err := CommitRepoAction(CommitRepoActionOptions{ - PusherName: opts.PusherName, - RepoOwnerID: owner.ID, - RepoName: repo.Name, - RefFullName: opts.RefFullName, - OldCommitID: opts.OldCommitID, - NewCommitID: opts.NewCommitID, - Commits: ListToPushCommits(l), - }); err != nil { - return fmt.Errorf("CommitRepoAction (branch): %v", err) - } - return nil -} diff --git a/models/user.go b/models/user.go deleted file mode 100644 index 946c6c94d47..00000000000 --- a/models/user.go +++ /dev/null @@ -1,1123 +0,0 @@ -// Copyright 2014 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 models - -import ( - "bytes" - "container/list" - "crypto/sha256" - "encoding/hex" - "errors" - "fmt" - "image" - _ "image/jpeg" - "image/png" - "os" - "path/filepath" - "strings" - "time" - "unicode/utf8" - - "github.com/Unknwon/com" - "github.com/go-xorm/xorm" - "github.com/nfnt/resize" - - "github.com/gogits/git-module" - api "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/modules/avatar" - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/markdown" - "github.com/gogits/gogs/modules/setting" -) - -type UserType int - -const ( - USER_TYPE_INDIVIDUAL UserType = iota // Historic reason to make it starts at 0. - USER_TYPE_ORGANIZATION -) - -var ( - ErrUserNotKeyOwner = errors.New("User does not the owner of public key") - ErrEmailNotExist = errors.New("E-mail does not exist") - ErrEmailNotActivated = errors.New("E-mail address has not been activated") - ErrUserNameIllegal = errors.New("User name contains illegal characters") - ErrLoginSourceNotActived = errors.New("Login source is not actived") - ErrUnsupportedLoginType = errors.New("Login source is unknown") -) - -// User represents the object of individual and member of organization. -type User struct { - ID int64 `xorm:"pk autoincr"` - LowerName string `xorm:"UNIQUE NOT NULL"` - Name string `xorm:"UNIQUE NOT NULL"` - FullName string - // Email is the primary email address (to be used for communication) - Email string `xorm:"NOT NULL"` - Passwd string `xorm:"NOT NULL"` - LoginType LoginType - LoginSource int64 `xorm:"NOT NULL DEFAULT 0"` - LoginName string - Type UserType - OwnedOrgs []*User `xorm:"-"` - Orgs []*User `xorm:"-"` - Repos []*Repository `xorm:"-"` - Location string - Website string - Rands string `xorm:"VARCHAR(10)"` - Salt string `xorm:"VARCHAR(10)"` - - Created time.Time `xorm:"-"` - CreatedUnix int64 - Updated time.Time `xorm:"-"` - UpdatedUnix int64 - - // Remember visibility choice for convenience, true for private - LastRepoVisibility bool - // Maximum repository creation limit, -1 means use gloabl default - MaxRepoCreation int `xorm:"NOT NULL DEFAULT -1"` - - // Permissions - IsActive bool // Activate primary email - IsAdmin bool - AllowGitHook bool - AllowImportLocal bool // Allow migrate repository by local path - ProhibitLogin bool - - // Avatar - Avatar string `xorm:"VARCHAR(2048) NOT NULL"` - AvatarEmail string `xorm:"NOT NULL"` - UseCustomAvatar bool - - // Counters - NumFollowers int - NumFollowing int `xorm:"NOT NULL DEFAULT 0"` - NumStars int - NumRepos int - - // For organization - Description string - NumTeams int - NumMembers int - Teams []*Team `xorm:"-"` - Members []*User `xorm:"-"` -} - -func (u *User) BeforeInsert() { - u.CreatedUnix = time.Now().Unix() - u.UpdatedUnix = u.CreatedUnix -} - -func (u *User) BeforeUpdate() { - if u.MaxRepoCreation < -1 { - u.MaxRepoCreation = -1 - } - u.UpdatedUnix = time.Now().Unix() -} - -func (u *User) AfterSet(colName string, _ xorm.Cell) { - switch colName { - case "full_name": - u.FullName = markdown.Sanitizer.Sanitize(u.FullName) - case "created_unix": - u.Created = time.Unix(u.CreatedUnix, 0).Local() - case "updated_unix": - u.Updated = time.Unix(u.UpdatedUnix, 0).Local() - } -} - -func (u *User) APIFormat() *api.User { - return &api.User{ - ID: u.ID, - UserName: u.Name, - FullName: u.FullName, - Email: u.Email, - AvatarUrl: u.AvatarLink(), - } -} - -// returns true if user login type is LOGIN_PLAIN. -func (u *User) IsLocal() bool { - return u.LoginType <= LOGIN_PLAIN -} - -// HasForkedRepo checks if user has already forked a repository with given ID. -func (u *User) HasForkedRepo(repoID int64) bool { - _, has := HasForkedRepo(u.ID, repoID) - return has -} - -func (u *User) RepoCreationNum() int { - if u.MaxRepoCreation <= -1 { - return setting.Repository.MaxCreationLimit - } - return u.MaxRepoCreation -} - -func (u *User) CanCreateRepo() bool { - if u.MaxRepoCreation <= -1 { - if setting.Repository.MaxCreationLimit <= -1 { - return true - } - return u.NumRepos < setting.Repository.MaxCreationLimit - } - return u.NumRepos < u.MaxRepoCreation -} - -// CanEditGitHook returns true if user can edit Git hooks. -func (u *User) CanEditGitHook() bool { - return u.IsAdmin || u.AllowGitHook -} - -// CanImportLocal returns true if user can migrate repository by local path. -func (u *User) CanImportLocal() bool { - return u.IsAdmin || u.AllowImportLocal -} - -// DashboardLink returns the user dashboard page link. -func (u *User) DashboardLink() string { - if u.IsOrganization() { - return setting.AppSubUrl + "/org/" + u.Name + "/dashboard/" - } - return setting.AppSubUrl + "/" -} - -// HomeLink returns the user or organization home page link. -func (u *User) HomeLink() string { - return setting.AppSubUrl + "/" + u.Name -} - -// GenerateEmailActivateCode generates an activate code based on user information and given e-mail. -func (u *User) GenerateEmailActivateCode(email string) string { - code := base.CreateTimeLimitCode( - com.ToStr(u.ID)+email+u.LowerName+u.Passwd+u.Rands, - setting.Service.ActiveCodeLives, nil) - - // Add tail hex username - code += hex.EncodeToString([]byte(u.LowerName)) - return code -} - -// GenerateActivateCode generates an activate code based on user information. -func (u *User) GenerateActivateCode() string { - return u.GenerateEmailActivateCode(u.Email) -} - -// CustomAvatarPath returns user custom avatar file path. -func (u *User) CustomAvatarPath() string { - return filepath.Join(setting.AvatarUploadPath, com.ToStr(u.ID)) -} - -// GenerateRandomAvatar generates a random avatar for user. -func (u *User) GenerateRandomAvatar() error { - seed := u.Email - if len(seed) == 0 { - seed = u.Name - } - - img, err := avatar.RandomImage([]byte(seed)) - if err != nil { - return fmt.Errorf("RandomImage: %v", err) - } - if err = os.MkdirAll(filepath.Dir(u.CustomAvatarPath()), os.ModePerm); err != nil { - return fmt.Errorf("MkdirAll: %v", err) - } - fw, err := os.Create(u.CustomAvatarPath()) - if err != nil { - return fmt.Errorf("Create: %v", err) - } - defer fw.Close() - - if err = png.Encode(fw, img); err != nil { - return fmt.Errorf("Encode: %v", err) - } - - log.Info("New random avatar created: %d", u.ID) - return nil -} - -// RelAvatarLink returns relative avatar link to the site domain, -// 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 - } - - switch { - case u.UseCustomAvatar: - if !com.IsExist(u.CustomAvatarPath()) { - return defaultImgUrl - } - return setting.AppSubUrl + "/avatars/" + com.ToStr(u.ID) - case setting.DisableGravatar, setting.OfflineMode: - if !com.IsExist(u.CustomAvatarPath()) { - if err := u.GenerateRandomAvatar(); err != nil { - log.Error(3, "GenerateRandomAvatar: %v", err) - } - } - - return setting.AppSubUrl + "/avatars/" + com.ToStr(u.ID) - } - return base.AvatarLink(u.AvatarEmail) -} - -// AvatarLink returns user avatar absolute link. -func (u *User) AvatarLink() string { - link := u.RelAvatarLink() - if link[0] == '/' && link[1] != '/' { - return setting.AppUrl + strings.TrimPrefix(link, setting.AppSubUrl)[1:] - } - return link -} - -// User.GetFollwoers returns range of user's followers. -func (u *User) GetFollowers(page int) ([]*User, error) { - users := make([]*User, 0, ItemsPerPage) - sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("follow.follow_id=?", u.ID) - if setting.UsePostgreSQL { - sess = sess.Join("LEFT", "follow", `"user".id=follow.user_id`) - } else { - sess = sess.Join("LEFT", "follow", "user.id=follow.user_id") - } - return users, sess.Find(&users) -} - -func (u *User) IsFollowing(followID int64) bool { - return IsFollowing(u.ID, followID) -} - -// GetFollowing returns range of user's following. -func (u *User) GetFollowing(page int) ([]*User, error) { - users := make([]*User, 0, ItemsPerPage) - sess := x.Limit(ItemsPerPage, (page-1)*ItemsPerPage).Where("follow.user_id=?", u.ID) - if setting.UsePostgreSQL { - sess = sess.Join("LEFT", "follow", `"user".id=follow.follow_id`) - } else { - sess = sess.Join("LEFT", "follow", "user.id=follow.follow_id") - } - return users, sess.Find(&users) -} - -// NewGitSig generates and returns the signature of given user. -func (u *User) NewGitSig() *git.Signature { - return &git.Signature{ - Name: u.DisplayName(), - Email: u.Email, - When: time.Now(), - } -} - -// EncodePasswd encodes password to safe format. -func (u *User) EncodePasswd() { - newPasswd := base.PBKDF2([]byte(u.Passwd), []byte(u.Salt), 10000, 50, sha256.New) - u.Passwd = fmt.Sprintf("%x", newPasswd) -} - -// ValidatePassword checks if given password matches the one belongs to the user. -func (u *User) ValidatePassword(passwd string) bool { - newUser := &User{Passwd: passwd, Salt: u.Salt} - newUser.EncodePasswd() - return u.Passwd == newUser.Passwd -} - -// UploadAvatar saves custom avatar for user. -// FIXME: split uploads to different subdirs in case we have massive users. -func (u *User) UploadAvatar(data []byte) error { - img, _, err := image.Decode(bytes.NewReader(data)) - if err != nil { - return fmt.Errorf("Decode: %v", err) - } - - m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor) - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - u.UseCustomAvatar = true - if err = updateUser(sess, u); err != nil { - return fmt.Errorf("updateUser: %v", err) - } - - os.MkdirAll(setting.AvatarUploadPath, os.ModePerm) - fw, err := os.Create(u.CustomAvatarPath()) - if err != nil { - return fmt.Errorf("Create: %v", err) - } - defer fw.Close() - - if err = png.Encode(fw, m); err != nil { - return fmt.Errorf("Encode: %v", err) - } - - return sess.Commit() -} - -// DeleteAvatar deletes the user's custom avatar. -func (u *User) DeleteAvatar() error { - log.Trace("DeleteAvatar[%d]: %s", u.ID, u.CustomAvatarPath()) - os.Remove(u.CustomAvatarPath()) - - u.UseCustomAvatar = false - if err := UpdateUser(u); err != nil { - return fmt.Errorf("UpdateUser: %v", err) - } - return nil -} - -// IsAdminOfRepo returns true if user has admin or higher access of repository. -func (u *User) IsAdminOfRepo(repo *Repository) bool { - has, err := HasAccess(u, repo, ACCESS_MODE_ADMIN) - if err != nil { - log.Error(3, "HasAccess: %v", err) - } - return has -} - -// IsWriterOfRepo returns true if user has write access to given repository. -func (u *User) IsWriterOfRepo(repo *Repository) bool { - has, err := HasAccess(u, repo, ACCESS_MODE_WRITE) - if err != nil { - log.Error(3, "HasAccess: %v", err) - } - return has -} - -// IsOrganization returns true if user is actually a organization. -func (u *User) IsOrganization() bool { - return u.Type == USER_TYPE_ORGANIZATION -} - -// IsUserOrgOwner returns true if user is in the owner team of given organization. -func (u *User) IsUserOrgOwner(orgId int64) bool { - return IsOrganizationOwner(orgId, u.ID) -} - -// IsPublicMember returns true if user public his/her membership in give organization. -func (u *User) IsPublicMember(orgId int64) bool { - return IsPublicMembership(orgId, u.ID) -} - -func (u *User) getOrganizationCount(e Engine) (int64, error) { - return e.Where("uid=?", u.ID).Count(new(OrgUser)) -} - -// GetOrganizationCount returns count of membership of organization of user. -func (u *User) GetOrganizationCount() (int64, error) { - return u.getOrganizationCount(x) -} - -// GetRepositories returns repositories that user owns, including private repositories. -func (u *User) GetRepositories(page, pageSize int) (err error) { - u.Repos, err = GetUserRepositories(u.ID, true, page, pageSize) - return err -} - -// GetRepositories returns mirror repositories that user owns, including private repositories. -func (u *User) GetMirrorRepositories() ([]*Repository, error) { - return GetUserMirrorRepositories(u.ID) -} - -// GetOwnedOrganizations returns all organizations that user owns. -func (u *User) GetOwnedOrganizations() (err error) { - u.OwnedOrgs, err = GetOwnedOrgsByUserID(u.ID) - return err -} - -// GetOrganizations returns all organizations that user belongs to. -func (u *User) GetOrganizations(all bool) error { - ous, err := GetOrgUsersByUserID(u.ID, all) - if err != nil { - return err - } - - u.Orgs = make([]*User, len(ous)) - for i, ou := range ous { - u.Orgs[i], err = GetUserByID(ou.OrgID) - if err != nil { - return err - } - } - return nil -} - -// DisplayName returns full name if it's not empty, -// returns username otherwise. -func (u *User) DisplayName() string { - if len(u.FullName) > 0 { - return u.FullName - } - return u.Name -} - -func (u *User) ShortName(length int) string { - return base.EllipsisString(u.Name, length) -} - -// IsUserExist checks if given user name exist, -// the user name should be noncased unique. -// If uid is presented, then check will rule out that one, -// it is used when update a user name in settings page. -func IsUserExist(uid int64, name string) (bool, error) { - if len(name) == 0 { - return false, nil - } - return x.Where("id!=?", uid).Get(&User{LowerName: strings.ToLower(name)}) -} - -// GetUserSalt returns a ramdom user salt token. -func GetUserSalt() string { - return base.GetRandomString(10) -} - -// NewGhostUser creates and returns a fake user for someone has deleted his/her account. -func NewGhostUser() *User { - return &User{ - ID: -1, - Name: "Ghost", - LowerName: "ghost", - } -} - -var ( - reversedUsernames = []string{"debug", "raw", "install", "api", "avatar", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."} - reversedUserPatterns = []string{"*.keys"} -) - -// isUsableName checks if name is reserved or pattern of name is not allowed -// based on given reversed names and patterns. -// Names are exact match, patterns can be prefix or suffix match with placeholder '*'. -func isUsableName(names, patterns []string, name string) error { - name = strings.TrimSpace(strings.ToLower(name)) - if utf8.RuneCountInString(name) == 0 { - return ErrNameEmpty - } - - for i := range names { - if name == names[i] { - return ErrNameReserved{name} - } - } - - for _, pat := range patterns { - if pat[0] == '*' && strings.HasSuffix(name, pat[1:]) || - (pat[len(pat)-1] == '*' && strings.HasPrefix(name, pat[:len(pat)-1])) { - return ErrNamePatternNotAllowed{pat} - } - } - - return nil -} - -func IsUsableUsername(name string) error { - return isUsableName(reversedUsernames, reversedUserPatterns, name) -} - -// CreateUser creates record of a new user. -func CreateUser(u *User) (err error) { - if err = IsUsableUsername(u.Name); err != nil { - return err - } - - isExist, err := IsUserExist(0, u.Name) - if err != nil { - return err - } else if isExist { - return ErrUserAlreadyExist{u.Name} - } - - u.Email = strings.ToLower(u.Email) - isExist, err = IsEmailUsed(u.Email) - if err != nil { - return err - } else if isExist { - return ErrEmailAlreadyUsed{u.Email} - } - - u.LowerName = strings.ToLower(u.Name) - u.AvatarEmail = u.Email - u.Avatar = base.HashEmail(u.AvatarEmail) - u.Rands = GetUserSalt() - u.Salt = GetUserSalt() - u.EncodePasswd() - u.MaxRepoCreation = -1 - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Insert(u); err != nil { - return err - } else if err = os.MkdirAll(UserPath(u.Name), os.ModePerm); err != nil { - return err - } - - return sess.Commit() -} - -func countUsers(e Engine) int64 { - count, _ := e.Where("type=0").Count(new(User)) - return count -} - -// CountUsers returns number of users. -func CountUsers() int64 { - return countUsers(x) -} - -// Users returns number of users in given page. -func Users(page, pageSize int) ([]*User, error) { - users := make([]*User, 0, pageSize) - return users, x.Limit(pageSize, (page-1)*pageSize).Where("type=0").Asc("id").Find(&users) -} - -// get user by erify code -func getVerifyUser(code string) (user *User) { - if len(code) <= base.TimeLimitCodeLength { - return nil - } - - // use tail hex username query user - hexStr := code[base.TimeLimitCodeLength:] - if b, err := hex.DecodeString(hexStr); err == nil { - if user, err = GetUserByName(string(b)); user != nil { - return user - } - log.Error(4, "user.getVerifyUser: %v", err) - } - - return nil -} - -// verify active code when active account -func VerifyUserActiveCode(code string) (user *User) { - minutes := setting.Service.ActiveCodeLives - - if user = getVerifyUser(code); user != nil { - // time limit code - prefix := code[:base.TimeLimitCodeLength] - data := com.ToStr(user.ID) + user.Email + user.LowerName + user.Passwd + user.Rands - - if base.VerifyTimeLimitCode(data, minutes, prefix) { - return user - } - } - return nil -} - -// verify active code when active account -func VerifyActiveEmailCode(code, email string) *EmailAddress { - minutes := setting.Service.ActiveCodeLives - - if user := getVerifyUser(code); user != nil { - // time limit code - prefix := code[:base.TimeLimitCodeLength] - data := com.ToStr(user.ID) + email + user.LowerName + user.Passwd + user.Rands - - if base.VerifyTimeLimitCode(data, minutes, prefix) { - emailAddress := &EmailAddress{Email: email} - if has, _ := x.Get(emailAddress); has { - return emailAddress - } - } - } - return nil -} - -// ChangeUserName changes all corresponding setting from old user name to new one. -func ChangeUserName(u *User, newUserName string) (err error) { - if err = IsUsableUsername(newUserName); err != nil { - return err - } - - isExist, err := IsUserExist(0, newUserName) - if err != nil { - return err - } else if isExist { - return ErrUserAlreadyExist{newUserName} - } - - if err = ChangeUsernameInPullRequests(u.Name, newUserName); err != nil { - return fmt.Errorf("ChangeUsernameInPullRequests: %v", err) - } - - // Delete all local copies of repository wiki that user owns. - if err = x.Where("owner_id=?", u.ID).Iterate(new(Repository), func(idx int, bean interface{}) error { - repo := bean.(*Repository) - RemoveAllWithNotice("Delete repository wiki local copy", repo.LocalWikiPath()) - return nil - }); err != nil { - return fmt.Errorf("Delete repository wiki local copy: %v", err) - } - - return os.Rename(UserPath(u.Name), UserPath(newUserName)) -} - -func updateUser(e Engine, u *User) error { - // Organization does not need email - if !u.IsOrganization() { - u.Email = strings.ToLower(u.Email) - has, err := e.Where("id!=?", u.ID).And("type=?", u.Type).And("email=?", u.Email).Get(new(User)) - if err != nil { - return err - } else if has { - return ErrEmailAlreadyUsed{u.Email} - } - - if len(u.AvatarEmail) == 0 { - u.AvatarEmail = u.Email - } - 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) - - u.FullName = markdown.Sanitizer.Sanitize(u.FullName) - _, err := e.Id(u.ID).AllCols().Update(u) - return err -} - -// UpdateUser updates user's information. -func UpdateUser(u *User) error { - return updateUser(x, u) -} - -// deleteBeans deletes all given beans, beans should contain delete conditions. -func deleteBeans(e Engine, beans ...interface{}) (err error) { - for i := range beans { - if _, err = e.Delete(beans[i]); err != nil { - return err - } - } - return nil -} - -// FIXME: need some kind of mechanism to record failure. HINT: system notice -func deleteUser(e *xorm.Session, u *User) error { - // Note: A user owns any repository or belongs to any organization - // cannot perform delete operation. - - // Check ownership of repository. - count, err := getRepositoryCount(e, u) - if err != nil { - return fmt.Errorf("GetRepositoryCount: %v", err) - } else if count > 0 { - return ErrUserOwnRepos{UID: u.ID} - } - - // Check membership of organization. - count, err = u.getOrganizationCount(e) - if err != nil { - return fmt.Errorf("GetOrganizationCount: %v", err) - } else if count > 0 { - return ErrUserHasOrgs{UID: u.ID} - } - - // ***** START: Watch ***** - watches := make([]*Watch, 0, 10) - if err = e.Find(&watches, &Watch{UserID: u.ID}); 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) - } - } - // ***** END: Watch ***** - - // ***** START: Star ***** - stars := make([]*Star, 0, 10) - if err = e.Find(&stars, &Star{UID: u.ID}); 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) - } - } - // ***** 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) - } - 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) - } - } - // ***** END: Follow ***** - - if err = deleteBeans(e, - &AccessToken{UID: u.ID}, - &Collaboration{UserID: u.ID}, - &Access{UserID: u.ID}, - &Watch{UserID: u.ID}, - &Star{UID: u.ID}, - &Follow{FollowID: u.ID}, - &Action{UserID: u.ID}, - &IssueUser{UID: u.ID}, - &EmailAddress{UID: u.ID}, - ); err != nil { - return fmt.Errorf("deleteBeans: %v", err) - } - - // ***** START: PublicKey ***** - keys := make([]*PublicKey, 0, 10) - if err = e.Find(&keys, &PublicKey{OwnerID: u.ID}); err != nil { - return fmt.Errorf("get all public keys: %v", err) - } - - keyIDs := make([]int64, len(keys)) - for i := range keys { - keyIDs[i] = keys[i].ID - } - if err = deletePublicKeys(e, keyIDs...); err != nil { - return fmt.Errorf("deletePublicKeys: %v", err) - } - // ***** END: PublicKey ***** - - // Clear assignee. - if _, err = e.Exec("UPDATE `issue` SET assignee_id=0 WHERE assignee_id=?", u.ID); err != nil { - return fmt.Errorf("clear assignee: %v", err) - } - - if _, err = e.Id(u.ID).Delete(new(User)); err != nil { - return fmt.Errorf("Delete: %v", err) - } - - // FIXME: system notice - // Note: There are something just cannot be roll back, - // so just keep error logs of those operations. - - os.RemoveAll(UserPath(u.Name)) - os.Remove(u.CustomAvatarPath()) - - return nil -} - -// DeleteUser completely and permanently deletes everything of a user, -// 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) - if err = sess.Begin(); err != nil { - return err - } - - if err = deleteUser(sess, u); err != nil { - // Note: don't wrapper error here. - return err - } - - if err = sess.Commit(); err != nil { - return err - } - - return RewriteAllPublicKeys() -} - -// DeleteInactivateUsers deletes all inactivate users and email addresses. -func DeleteInactivateUsers() (err error) { - users := make([]*User, 0, 10) - if err = x.Where("is_active = ?", false).Find(&users); err != nil { - return fmt.Errorf("get all inactive users: %v", err) - } - // FIXME: should only update authorized_keys file once after all deletions. - for _, u := range users { - if err = DeleteUser(u); err != nil { - // Ignore users that were set inactive by admin. - if IsErrUserOwnRepos(err) || IsErrUserHasOrgs(err) { - continue - } - return err - } - } - - _, err = x.Where("is_activated = ?", false).Delete(new(EmailAddress)) - return err -} - -// UserPath returns the path absolute path of user repositories. -func UserPath(userName string) string { - return filepath.Join(setting.RepoRootPath, strings.ToLower(userName)) -} - -func GetUserByKeyID(keyID int64) (*User, error) { - user := new(User) - has, err := x.Sql("SELECT a.* FROM `user` AS a, public_key AS b WHERE a.id = b.owner_id AND b.id=?", keyID).Get(user) - if err != nil { - return nil, err - } else if !has { - return nil, ErrUserNotKeyOwner - } - return user, nil -} - -func getUserByID(e Engine, id int64) (*User, error) { - u := new(User) - has, err := e.Id(id).Get(u) - if err != nil { - return nil, err - } else if !has { - return nil, ErrUserNotExist{id, ""} - } - return u, nil -} - -// GetUserByID returns the user object by given ID if exists. -func GetUserByID(id int64) (*User, error) { - return getUserByID(x, id) -} - -// 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, ACCESS_MODE_WRITE) - if err != nil { - return nil, err - } else if !has { - return nil, ErrUserNotExist{userID, ""} - } - return GetUserByID(userID) -} - -// GetUserByName returns user by given name. -func GetUserByName(name string) (*User, error) { - if len(name) == 0 { - return nil, ErrUserNotExist{0, name} - } - u := &User{LowerName: strings.ToLower(name)} - has, err := x.Get(u) - if err != nil { - return nil, err - } else if !has { - return nil, ErrUserNotExist{0, name} - } - return u, nil -} - -// GetUserEmailsByNames returns a list of e-mails corresponds to names. -func GetUserEmailsByNames(names []string) []string { - mails := make([]string, 0, len(names)) - for _, name := range names { - u, err := GetUserByName(name) - if err != nil { - continue - } - mails = append(mails, u.Email) - } - return mails -} - -// GetUserIDsByNames returns a slice of ids corresponds to names. -func GetUserIDsByNames(names []string) []int64 { - ids := make([]int64, 0, len(names)) - for _, name := range names { - u, err := GetUserByName(name) - if err != nil { - continue - } - ids = append(ids, u.ID) - } - return ids -} - -// UserCommit represents a commit with validation of user. -type UserCommit struct { - User *User - *git.Commit -} - -// ValidateCommitWithEmail chceck if author's e-mail of commit is corresponsind to a user. -func ValidateCommitWithEmail(c *git.Commit) *User { - u, err := GetUserByEmail(c.Author.Email) - if err != nil { - return nil - } - return u -} - -// ValidateCommitsWithEmails checks if authors' e-mails of commits are corresponding to users. -func ValidateCommitsWithEmails(oldCommits *list.List) *list.List { - var ( - u *User - emails = map[string]*User{} - newCommits = list.New() - e = oldCommits.Front() - ) - for e != nil { - c := e.Value.(*git.Commit) - - if v, ok := emails[c.Author.Email]; !ok { - u, _ = GetUserByEmail(c.Author.Email) - emails[c.Author.Email] = u - } else { - u = v - } - - newCommits.PushBack(UserCommit{ - User: u, - Commit: c, - }) - e = e.Next() - } - return newCommits -} - -// GetUserByEmail returns the user object by given e-mail if exists. -func GetUserByEmail(email string) (*User, error) { - if len(email) == 0 { - return nil, ErrUserNotExist{0, "email"} - } - - email = strings.ToLower(email) - // First try to find the user by primary email - user := &User{Email: email} - has, err := x.Get(user) - if err != nil { - return nil, err - } - if has { - return user, nil - } - - // Otherwise, check in alternative list for activated email addresses - emailAddress := &EmailAddress{Email: email, IsActivated: true} - has, err = x.Get(emailAddress) - if err != nil { - return nil, err - } - if has { - return GetUserByID(emailAddress.UID) - } - - return nil, ErrUserNotExist{0, email} -} - -type SearchUserOptions struct { - Keyword string - Type UserType - OrderBy string - Page int - PageSize int // Can be smaller than or equal to setting.UI.ExplorePagingNum -} - -// SearchUserByName takes keyword and part of user name to search, -// it returns results in given range and number of total results. -func SearchUserByName(opts *SearchUserOptions) (users []*User, _ int64, _ error) { - if len(opts.Keyword) == 0 { - return users, 0, nil - } - opts.Keyword = strings.ToLower(opts.Keyword) - - if opts.PageSize <= 0 || opts.PageSize > setting.UI.ExplorePagingNum { - opts.PageSize = setting.UI.ExplorePagingNum - } - if opts.Page <= 0 { - opts.Page = 1 - } - - searchQuery := "%" + opts.Keyword + "%" - users = make([]*User, 0, opts.PageSize) - // Append conditions - sess := x.Where("LOWER(lower_name) LIKE ?", searchQuery). - Or("LOWER(full_name) LIKE ?", searchQuery). - And("type = ?", opts.Type) - - var countSess xorm.Session - countSess = *sess - count, err := countSess.Count(new(User)) - if err != nil { - return nil, 0, fmt.Errorf("Count: %v", err) - } - - if len(opts.OrderBy) > 0 { - sess.OrderBy(opts.OrderBy) - } - return users, count, sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).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)"` -} - -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 be 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() -} diff --git a/models/user_mail.go b/models/user_mail.go deleted file mode 100644 index 9a1804c91a8..00000000000 --- a/models/user_mail.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2016 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 models - -import ( - "fmt" - "strings" -) - -// EmailAdresses 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:"-"` -} - -// GetEmailAddresses returns all email addresses belongs to given user. -func GetEmailAddresses(uid int64) ([]*EmailAddress, error) { - emails := make([]*EmailAddress, 0, 5) - if err := x.Where("uid=?", uid).Find(&emails); err != nil { - return nil, err - } - - u, err := GetUserByID(uid) - if err != nil { - return nil, err - } - - isPrimaryFound := false - for _, email := range emails { - if email.Email == u.Email { - isPrimaryFound = true - email.IsPrimary = true - } else { - email.IsPrimary = false - } - } - - // We alway want the primary email address displayed, even if it's not in - // the emailaddress table (yet). - if !isPrimaryFound { - emails = append(emails, &EmailAddress{ - Email: u.Email, - IsActivated: true, - IsPrimary: true, - }) - } - return emails, nil -} - -func isEmailUsed(e Engine, email string) (bool, error) { - if len(email) == 0 { - return true, nil - } - - return e.Get(&EmailAddress{Email: email}) -} - -// IsEmailUsed returns true if the email has been used. -func IsEmailUsed(email string) (bool, error) { - return isEmailUsed(x, email) -} - -func addEmailAddress(e Engine, email *EmailAddress) error { - email.Email = strings.ToLower(strings.TrimSpace(email.Email)) - used, err := isEmailUsed(e, email.Email) - if err != nil { - return err - } else if used { - return ErrEmailAlreadyUsed{email.Email} - } - - _, err = e.Insert(email) - return err -} - -func AddEmailAddress(email *EmailAddress) error { - return addEmailAddress(x, email) -} - -func AddEmailAddresses(emails []*EmailAddress) error { - if len(emails) == 0 { - return nil - } - - // Check if any of them has been used - for i := range emails { - emails[i].Email = strings.ToLower(strings.TrimSpace(emails[i].Email)) - used, err := IsEmailUsed(emails[i].Email) - if err != nil { - return err - } else if used { - return ErrEmailAlreadyUsed{emails[i].Email} - } - } - - if _, err := x.Insert(emails); err != nil { - return fmt.Errorf("Insert: %v", err) - } - - return nil -} - -func (email *EmailAddress) Activate() error { - user, err := GetUserByID(email.UID) - if err != nil { - return err - } - user.Rands = GetUserSalt() - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - email.IsActivated = true - if _, err := sess.Id(email.ID).AllCols().Update(email); err != nil { - return err - } else if err = updateUser(sess, user); err != nil { - return err - } - - return sess.Commit() -} - -func DeleteEmailAddress(email *EmailAddress) (err error) { - if email.ID > 0 { - _, err = x.Id(email.ID).Delete(new(EmailAddress)) - } else { - _, err = x.Where("email=?", email.Email).Delete(new(EmailAddress)) - } - return err -} - -func DeleteEmailAddresses(emails []*EmailAddress) (err error) { - for i := range emails { - if err = DeleteEmailAddress(emails[i]); err != nil { - return err - } - } - - return nil -} - -func MakeEmailPrimary(email *EmailAddress) error { - has, err := x.Get(email) - if err != nil { - return err - } else if !has { - return ErrEmailNotExist - } - - if !email.IsActivated { - return ErrEmailNotActivated - } - - user := &User{ID: email.UID} - has, err = x.Get(user) - if err != nil { - return err - } else if !has { - return ErrUserNotExist{email.UID, ""} - } - - // Make sure the former primary email doesn't disappear. - formerPrimaryEmail := &EmailAddress{Email: user.Email} - has, err = x.Get(formerPrimaryEmail) - if err != nil { - return err - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if !has { - formerPrimaryEmail.UID = user.ID - formerPrimaryEmail.IsActivated = user.IsActive - if _, err = sess.Insert(formerPrimaryEmail); err != nil { - return err - } - } - - user.Email = email.Email - if _, err = sess.Id(user.ID).AllCols().Update(user); err != nil { - return err - } - - return sess.Commit() -} diff --git a/models/webhook.go b/models/webhook.go deleted file mode 100644 index 084a7ee73f6..00000000000 --- a/models/webhook.go +++ /dev/null @@ -1,620 +0,0 @@ -// Copyright 2014 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 models - -import ( - "crypto/tls" - "encoding/json" - "fmt" - "io/ioutil" - "strings" - "time" - - "github.com/go-xorm/xorm" - gouuid "github.com/satori/go.uuid" - - api "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/modules/httplib" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" - "github.com/gogits/gogs/modules/sync" -) - -var HookQueue = sync.NewUniqueQueue(setting.Webhook.QueueLength) - -type HookContentType int - -const ( - JSON HookContentType = iota + 1 - FORM -) - -var hookContentTypes = map[string]HookContentType{ - "json": JSON, - "form": FORM, -} - -// ToHookContentType returns HookContentType by given name. -func ToHookContentType(name string) HookContentType { - return hookContentTypes[name] -} - -func (t HookContentType) Name() string { - switch t { - case JSON: - return "json" - case FORM: - return "form" - } - return "" -} - -// IsValidHookContentType returns true if given name is a valid hook content type. -func IsValidHookContentType(name string) bool { - _, ok := hookContentTypes[name] - return ok -} - -type HookEvents struct { - Create bool `json:"create"` - Push bool `json:"push"` - PullRequest bool `json:"pull_request"` -} - -// HookEvent represents events that will delivery hook. -type HookEvent struct { - PushOnly bool `json:"push_only"` - SendEverything bool `json:"send_everything"` - ChooseEvents bool `json:"choose_events"` - - HookEvents `json:"events"` -} - -type HookStatus int - -const ( - HOOK_STATUS_NONE = iota - HOOK_STATUS_SUCCEED - HOOK_STATUS_FAILED -) - -// Webhook represents a web hook object. -type Webhook struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 - OrgID int64 - URL string `xorm:"url TEXT"` - ContentType HookContentType - Secret string `xorm:"TEXT"` - Events string `xorm:"TEXT"` - *HookEvent `xorm:"-"` - IsSSL bool `xorm:"is_ssl"` - IsActive bool - HookTaskType HookTaskType - Meta string `xorm:"TEXT"` // store hook-specific attributes - LastStatus HookStatus // Last delivery status - - Created time.Time `xorm:"-"` - CreatedUnix int64 - Updated time.Time `xorm:"-"` - UpdatedUnix int64 -} - -func (w *Webhook) BeforeInsert() { - w.CreatedUnix = time.Now().Unix() - w.UpdatedUnix = w.CreatedUnix -} - -func (w *Webhook) BeforeUpdate() { - w.UpdatedUnix = time.Now().Unix() -} - -func (w *Webhook) AfterSet(colName string, _ xorm.Cell) { - var err error - switch colName { - case "events": - w.HookEvent = &HookEvent{} - if err = json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil { - log.Error(3, "Unmarshal[%d]: %v", w.ID, err) - } - case "created_unix": - w.Created = time.Unix(w.CreatedUnix, 0).Local() - case "updated_unix": - w.Updated = time.Unix(w.UpdatedUnix, 0).Local() - } -} - -func (w *Webhook) GetSlackHook() *SlackMeta { - s := &SlackMeta{} - if err := json.Unmarshal([]byte(w.Meta), s); err != nil { - log.Error(4, "webhook.GetSlackHook(%d): %v", w.ID, err) - } - return s -} - -// History returns history of webhook by given conditions. -func (w *Webhook) History(page int) ([]*HookTask, error) { - return HookTasks(w.ID, page) -} - -// UpdateEvent handles conversion from HookEvent to Events. -func (w *Webhook) UpdateEvent() error { - data, err := json.Marshal(w.HookEvent) - w.Events = string(data) - return err -} - -// HasCreateEvent returns true if hook enabled create event. -func (w *Webhook) HasCreateEvent() bool { - return w.SendEverything || - (w.ChooseEvents && w.HookEvents.Create) -} - -// HasPushEvent returns true if hook enabled push event. -func (w *Webhook) HasPushEvent() bool { - return w.PushOnly || w.SendEverything || - (w.ChooseEvents && w.HookEvents.Push) -} - -// HasPullRequestEvent returns true if hook enabled pull request event. -func (w *Webhook) HasPullRequestEvent() bool { - return w.SendEverything || - (w.ChooseEvents && w.HookEvents.PullRequest) -} - -func (w *Webhook) EventsArray() []string { - events := make([]string, 0, 3) - if w.HasCreateEvent() { - events = append(events, "create") - } - if w.HasPushEvent() { - events = append(events, "push") - } - if w.HasPullRequestEvent() { - events = append(events, "pull_request") - } - return events -} - -// CreateWebhook creates a new web hook. -func CreateWebhook(w *Webhook) error { - _, err := x.Insert(w) - return err -} - -// getWebhook uses argument bean as query condition, -// ID must be specified and do not assign unnecessary fields. -func getWebhook(bean *Webhook) (*Webhook, error) { - has, err := x.Get(bean) - if err != nil { - return nil, err - } else if !has { - return nil, ErrWebhookNotExist{bean.ID} - } - return bean, nil -} - -// GetWebhookByRepoID returns webhook of repository by given ID. -func GetWebhookByRepoID(repoID, id int64) (*Webhook, error) { - return getWebhook(&Webhook{ - ID: id, - RepoID: repoID, - }) -} - -// GetWebhookByOrgID returns webhook of organization by given ID. -func GetWebhookByOrgID(orgID, id int64) (*Webhook, error) { - return getWebhook(&Webhook{ - ID: id, - OrgID: orgID, - }) -} - -// GetActiveWebhooksByRepoID returns all active webhooks of repository. -func GetActiveWebhooksByRepoID(repoID int64) ([]*Webhook, error) { - webhooks := make([]*Webhook, 0, 5) - return webhooks, x.Find(&webhooks, &Webhook{ - RepoID: repoID, - IsActive: true, - }) -} - -// GetWebhooksByRepoID returns all webhooks of a repository. -func GetWebhooksByRepoID(repoID int64) ([]*Webhook, error) { - webhooks := make([]*Webhook, 0, 5) - return webhooks, x.Find(&webhooks, &Webhook{RepoID: repoID}) -} - -// UpdateWebhook updates information of webhook. -func UpdateWebhook(w *Webhook) error { - _, err := x.Id(w.ID).AllCols().Update(w) - return err -} - -// deleteWebhook uses argument bean as query condition, -// ID must be specified and do not assign unnecessary fields. -func deleteWebhook(bean *Webhook) (err error) { - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Delete(bean); err != nil { - return err - } else if _, err = sess.Delete(&HookTask{HookID: bean.ID}); err != nil { - return err - } - - return sess.Commit() -} - -// DeleteWebhookByRepoID deletes webhook of repository by given ID. -func DeleteWebhookByRepoID(repoID, id int64) error { - return deleteWebhook(&Webhook{ - ID: id, - RepoID: repoID, - }) -} - -// DeleteWebhookByOrgID deletes webhook of organization by given ID. -func DeleteWebhookByOrgID(orgID, id int64) error { - return deleteWebhook(&Webhook{ - ID: id, - OrgID: orgID, - }) -} - -// GetWebhooksByOrgID returns all webhooks for an organization. -func GetWebhooksByOrgID(orgID int64) (ws []*Webhook, err error) { - err = x.Find(&ws, &Webhook{OrgID: orgID}) - return ws, err -} - -// GetActiveWebhooksByOrgID returns all active webhooks for an organization. -func GetActiveWebhooksByOrgID(orgID int64) (ws []*Webhook, err error) { - err = x.Where("org_id=?", orgID).And("is_active=?", true).Find(&ws) - return ws, err -} - -// ___ ___ __ ___________ __ -// / | \ ____ ____ | | _\__ ___/____ _____| | __ -// / ~ \/ _ \ / _ \| |/ / | | \__ \ / ___/ |/ / -// \ Y ( <_> | <_> ) < | | / __ \_\___ \| < -// \___|_ / \____/ \____/|__|_ \ |____| (____ /____ >__|_ \ -// \/ \/ \/ \/ \/ - -type HookTaskType int - -const ( - GOGS HookTaskType = iota + 1 - SLACK -) - -var hookTaskTypes = map[string]HookTaskType{ - "gogs": GOGS, - "slack": SLACK, -} - -// ToHookTaskType returns HookTaskType by given name. -func ToHookTaskType(name string) HookTaskType { - return hookTaskTypes[name] -} - -func (t HookTaskType) Name() string { - switch t { - case GOGS: - return "gogs" - case SLACK: - return "slack" - } - return "" -} - -// IsValidHookTaskType returns true if given name is a valid hook task type. -func IsValidHookTaskType(name string) bool { - _, ok := hookTaskTypes[name] - return ok -} - -type HookEventType string - -const ( - HOOK_EVENT_CREATE HookEventType = "create" - HOOK_EVENT_PUSH HookEventType = "push" - HOOK_EVENT_PULL_REQUEST HookEventType = "pull_request" -) - -// HookRequest represents hook task request information. -type HookRequest struct { - Headers map[string]string `json:"headers"` -} - -// HookResponse represents hook task response information. -type HookResponse struct { - Status int `json:"status"` - Headers map[string]string `json:"headers"` - Body string `json:"body"` -} - -// HookTask represents a hook task. -type HookTask struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 `xorm:"INDEX"` - HookID int64 - UUID string - Type HookTaskType - URL string `xorm:"TEXT"` - api.Payloader `xorm:"-"` - PayloadContent string `xorm:"TEXT"` - ContentType HookContentType - EventType HookEventType - IsSSL bool - IsDelivered bool - Delivered int64 - DeliveredString string `xorm:"-"` - - // History info. - IsSucceed bool - RequestContent string `xorm:"TEXT"` - RequestInfo *HookRequest `xorm:"-"` - ResponseContent string `xorm:"TEXT"` - ResponseInfo *HookResponse `xorm:"-"` -} - -func (t *HookTask) BeforeUpdate() { - if t.RequestInfo != nil { - t.RequestContent = t.MarshalJSON(t.RequestInfo) - } - if t.ResponseInfo != nil { - t.ResponseContent = t.MarshalJSON(t.ResponseInfo) - } -} - -func (t *HookTask) AfterSet(colName string, _ xorm.Cell) { - var err error - switch colName { - case "delivered": - t.DeliveredString = time.Unix(0, t.Delivered).Format("2006-01-02 15:04:05 MST") - - case "request_content": - if len(t.RequestContent) == 0 { - return - } - - t.RequestInfo = &HookRequest{} - if err = json.Unmarshal([]byte(t.RequestContent), t.RequestInfo); err != nil { - log.Error(3, "Unmarshal[%d]: %v", t.ID, err) - } - - case "response_content": - if len(t.ResponseContent) == 0 { - return - } - - t.ResponseInfo = &HookResponse{} - if err = json.Unmarshal([]byte(t.ResponseContent), t.ResponseInfo); err != nil { - log.Error(3, "Unmarshal [%d]: %v", t.ID, err) - } - } -} - -func (t *HookTask) MarshalJSON(v interface{}) string { - p, err := json.Marshal(v) - if err != nil { - log.Error(3, "Marshal [%d]: %v", t.ID, err) - } - return string(p) -} - -// HookTasks returns a list of hook tasks by given conditions. -func HookTasks(hookID int64, page int) ([]*HookTask, error) { - tasks := make([]*HookTask, 0, setting.Webhook.PagingNum) - return tasks, x.Limit(setting.Webhook.PagingNum, (page-1)*setting.Webhook.PagingNum).Where("hook_id=?", hookID).Desc("id").Find(&tasks) -} - -// CreateHookTask creates a new hook task, -// it handles conversion from Payload to PayloadContent. -func CreateHookTask(t *HookTask) error { - data, err := t.Payloader.JSONPayload() - if err != nil { - return err - } - t.UUID = gouuid.NewV4().String() - t.PayloadContent = string(data) - _, err = x.Insert(t) - return err -} - -// UpdateHookTask updates information of hook task. -func UpdateHookTask(t *HookTask) error { - _, err := x.Id(t.ID).AllCols().Update(t) - return err -} - -// PrepareWebhooks adds new webhooks to task queue for given payload. -func PrepareWebhooks(repo *Repository, event HookEventType, p api.Payloader) error { - ws, err := GetActiveWebhooksByRepoID(repo.ID) - if err != nil { - return fmt.Errorf("GetActiveWebhooksByRepoID: %v", err) - } - - // check if repo belongs to org and append additional webhooks - if repo.MustOwner().IsOrganization() { - // get hooks for org - orgws, err := GetActiveWebhooksByOrgID(repo.OwnerID) - if err != nil { - return fmt.Errorf("GetActiveWebhooksByOrgID: %v", err) - } - ws = append(ws, orgws...) - } - - if len(ws) == 0 { - return nil - } - - var payloader api.Payloader - for _, w := range ws { - switch event { - case HOOK_EVENT_CREATE: - if !w.HasCreateEvent() { - continue - } - case HOOK_EVENT_PUSH: - if !w.HasPushEvent() { - continue - } - case HOOK_EVENT_PULL_REQUEST: - if !w.HasPullRequestEvent() { - continue - } - } - - // Use separate objects so modifcations won't be made on payload on non-Gogs type hooks. - switch w.HookTaskType { - case SLACK: - payloader, err = GetSlackPayload(p, event, w.Meta) - if err != nil { - return fmt.Errorf("GetSlackPayload: %v", err) - } - default: - p.SetSecret(w.Secret) - payloader = p - } - - if err = CreateHookTask(&HookTask{ - RepoID: repo.ID, - HookID: w.ID, - Type: w.HookTaskType, - URL: w.URL, - Payloader: payloader, - ContentType: w.ContentType, - EventType: event, - IsSSL: w.IsSSL, - }); err != nil { - return fmt.Errorf("CreateHookTask: %v", err) - } - } - return nil -} - -func (t *HookTask) deliver() { - t.IsDelivered = true - - timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second - req := httplib.Post(t.URL).SetTimeout(timeout, timeout). - Header("X-Gogs-Delivery", t.UUID). - Header("X-Gogs-Event", string(t.EventType)). - SetTLSClientConfig(&tls.Config{InsecureSkipVerify: setting.Webhook.SkipTLSVerify}) - - switch t.ContentType { - case JSON: - req = req.Header("Content-Type", "application/json").Body(t.PayloadContent) - case FORM: - req.Param("payload", t.PayloadContent) - } - - // Record delivery information. - t.RequestInfo = &HookRequest{ - Headers: map[string]string{}, - } - for k, vals := range req.Headers() { - t.RequestInfo.Headers[k] = strings.Join(vals, ",") - } - - t.ResponseInfo = &HookResponse{ - Headers: map[string]string{}, - } - - defer func() { - t.Delivered = time.Now().UnixNano() - if t.IsSucceed { - log.Trace("Hook delivered: %s", t.UUID) - } else { - log.Trace("Hook delivery failed: %s", t.UUID) - } - - // Update webhook last delivery status. - w, err := GetWebhookByRepoID(t.RepoID, t.HookID) - if err != nil { - log.Error(5, "GetWebhookByID: %v", err) - return - } - if t.IsSucceed { - w.LastStatus = HOOK_STATUS_SUCCEED - } else { - w.LastStatus = HOOK_STATUS_FAILED - } - if err = UpdateWebhook(w); err != nil { - log.Error(5, "UpdateWebhook: %v", err) - return - } - }() - - resp, err := req.Response() - if err != nil { - t.ResponseInfo.Body = fmt.Sprintf("Delivery: %v", err) - return - } - defer resp.Body.Close() - - // Status code is 20x can be seen as succeed. - t.IsSucceed = resp.StatusCode/100 == 2 - t.ResponseInfo.Status = resp.StatusCode - for k, vals := range resp.Header { - t.ResponseInfo.Headers[k] = strings.Join(vals, ",") - } - - p, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.ResponseInfo.Body = fmt.Sprintf("read body: %s", err) - return - } - t.ResponseInfo.Body = string(p) -} - -// DeliverHooks checks and delivers undelivered hooks. -// 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 - }) - - // Update hook task status. - for _, t := range tasks { - if err := UpdateHookTask(t); err != nil { - log.Error(4, "UpdateHookTask [%d]: %v", t.ID, err) - } - } - - // Start listening on new hook requests. - for repoID := range HookQueue.Queue() { - log.Trace("DeliverHooks [repo_id: %v]", repoID) - HookQueue.Remove(repoID) - - tasks = make([]*HookTask, 0, 5) - if err := x.Where("repo_id=? AND is_delivered=?", repoID, false).Find(&tasks); err != nil { - log.Error(4, "Get repository [%d] hook tasks: %v", repoID, err) - continue - } - for _, t := range tasks { - t.deliver() - if err := UpdateHookTask(t); err != nil { - log.Error(4, "UpdateHookTask [%d]: %v", t.ID, err) - continue - } - } - } -} - -func InitDeliverHooks() { - go DeliverHooks() -} diff --git a/models/webhook_slack.go b/models/webhook_slack.go deleted file mode 100644 index edc26a78f3b..00000000000 --- a/models/webhook_slack.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2014 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 models - -import ( - "encoding/json" - "errors" - "fmt" - "strings" - - "github.com/gogits/git-module" - api "github.com/gogits/go-gogs-client" - - "github.com/gogits/gogs/modules/setting" -) - -type SlackMeta struct { - Channel string `json:"channel"` - Username string `json:"username"` - IconURL string `json:"icon_url"` - Color string `json:"color"` -} - -type SlackPayload struct { - Channel string `json:"channel"` - Text string `json:"text"` - Username string `json:"username"` - IconURL string `json:"icon_url"` - UnfurlLinks int `json:"unfurl_links"` - LinkNames int `json:"link_names"` - Attachments []SlackAttachment `json:"attachments"` -} - -type SlackAttachment struct { - Fallback string `json:"fallback"` - Color string `json:"color"` - Title string `json:"title"` - Text string `json:"text"` -} - -func (p *SlackPayload) SetSecret(_ string) {} - -func (p *SlackPayload) JSONPayload() ([]byte, error) { - data, err := json.MarshalIndent(p, "", " ") - if err != nil { - return []byte{}, err - } - return data, nil -} - -// see: https://api.slack.com/docs/formatting -func SlackTextFormatter(s string) string { - // replace & < > - s = strings.Replace(s, "&", "&", -1) - s = strings.Replace(s, "<", "<", -1) - s = strings.Replace(s, ">", ">", -1) - return s -} - -func SlackShortTextFormatter(s string) string { - s = strings.Split(s, "\n")[0] - // replace & < > - s = strings.Replace(s, "&", "&", -1) - s = strings.Replace(s, "<", "<", -1) - s = strings.Replace(s, ">", ">", -1) - return s -} - -func SlackLinkFormatter(url string, text string) string { - return fmt.Sprintf("<%s|%s>", url, SlackTextFormatter(text)) -} - -func getSlackCreatePayload(p *api.CreatePayload, slack *SlackMeta) (*SlackPayload, error) { - // created tag/branch - refName := git.RefEndName(p.Ref) - - repoLink := SlackLinkFormatter(p.Repo.HTMLURL, p.Repo.Name) - refLink := SlackLinkFormatter(p.Repo.HTMLURL+"/src/"+refName, refName) - text := fmt.Sprintf("[%s:%s] %s created by %s", repoLink, refLink, p.RefType, p.Sender.UserName) - - return &SlackPayload{ - Channel: slack.Channel, - Text: text, - Username: slack.Username, - IconURL: slack.IconURL, - }, nil -} - -func getSlackPushPayload(p *api.PushPayload, slack *SlackMeta) (*SlackPayload, error) { - // n new commits - var ( - branchName = git.RefEndName(p.Ref) - commitDesc string - commitString string - ) - - if len(p.Commits) == 1 { - commitDesc = "1 new commit" - } else { - commitDesc = fmt.Sprintf("%d new commits", len(p.Commits)) - } - if len(p.CompareURL) > 0 { - commitString = SlackLinkFormatter(p.CompareURL, commitDesc) - } else { - commitString = commitDesc - } - - repoLink := SlackLinkFormatter(p.Repo.HTMLURL, p.Repo.Name) - branchLink := SlackLinkFormatter(p.Repo.HTMLURL+"/src/"+branchName, branchName) - text := fmt.Sprintf("[%s:%s] %s pushed by %s", repoLink, branchLink, commitString, p.Pusher.UserName) - - var attachmentText string - // for each commit, generate attachment text - for i, commit := range p.Commits { - attachmentText += fmt.Sprintf("%s: %s - %s", SlackLinkFormatter(commit.URL, commit.ID[:7]), SlackShortTextFormatter(commit.Message), SlackTextFormatter(commit.Author.Name)) - // add linebreak to each commit but the last - if i < len(p.Commits)-1 { - attachmentText += "\n" - } - } - - return &SlackPayload{ - Channel: slack.Channel, - Text: text, - Username: slack.Username, - IconURL: slack.IconURL, - Attachments: []SlackAttachment{{ - Color: slack.Color, - Text: attachmentText, - }}, - }, nil -} - -func getSlackPullRequestPayload(p *api.PullRequestPayload, slack *SlackMeta) (*SlackPayload, error) { - senderLink := SlackLinkFormatter(setting.AppUrl+p.Sender.UserName, p.Sender.UserName) - titleLink := SlackLinkFormatter(fmt.Sprintf("%s/pulls/%d", p.Repository.HTMLURL, p.Index), - fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title)) - var text, title, attachmentText string - switch p.Action { - case api.HOOK_ISSUE_OPENED: - text = fmt.Sprintf("[%s] Pull request submitted by %s", p.Repository.FullName, senderLink) - title = titleLink - attachmentText = SlackTextFormatter(p.PullRequest.Body) - case api.HOOK_ISSUE_CLOSED: - if p.PullRequest.HasMerged { - text = fmt.Sprintf("[%s] Pull request merged: %s by %s", p.Repository.FullName, titleLink, senderLink) - } else { - text = fmt.Sprintf("[%s] Pull request closed: %s by %s", p.Repository.FullName, titleLink, senderLink) - } - case api.HOOK_ISSUE_REOPENED: - text = fmt.Sprintf("[%s] Pull request re-opened: %s by %s", p.Repository.FullName, titleLink, senderLink) - case api.HOOK_ISSUE_EDITED: - text = fmt.Sprintf("[%s] Pull request edited: %s by %s", p.Repository.FullName, titleLink, senderLink) - attachmentText = SlackTextFormatter(p.PullRequest.Body) - case api.HOOK_ISSUE_ASSIGNED: - text = fmt.Sprintf("[%s] Pull request assigned to %s: %s by %s", p.Repository.FullName, - SlackLinkFormatter(setting.AppUrl+p.PullRequest.Assignee.UserName, p.PullRequest.Assignee.UserName), - titleLink, senderLink) - case api.HOOK_ISSUE_UNASSIGNED: - text = fmt.Sprintf("[%s] Pull request unassigned: %s by %s", p.Repository.FullName, titleLink, senderLink) - case api.HOOK_ISSUE_LABEL_UPDATED: - text = fmt.Sprintf("[%s] Pull request labels updated: %s by %s", p.Repository.FullName, titleLink, senderLink) - case api.HOOK_ISSUE_LABEL_CLEARED: - text = fmt.Sprintf("[%s] Pull request labels cleared: %s by %s", p.Repository.FullName, titleLink, senderLink) - case api.HOOK_ISSUE_SYNCHRONIZED: - text = fmt.Sprintf("[%s] Pull request synchronized: %s by %s", p.Repository.FullName, titleLink, senderLink) - } - - return &SlackPayload{ - Channel: slack.Channel, - Text: text, - Username: slack.Username, - IconURL: slack.IconURL, - Attachments: []SlackAttachment{{ - Color: slack.Color, - Title: title, - Text: attachmentText, - }}, - }, nil -} - -func GetSlackPayload(p api.Payloader, event HookEventType, meta string) (*SlackPayload, error) { - s := new(SlackPayload) - - slack := &SlackMeta{} - if err := json.Unmarshal([]byte(meta), &slack); err != nil { - return s, errors.New("GetSlackPayload meta json:" + err.Error()) - } - - switch event { - case HOOK_EVENT_CREATE: - return getSlackCreatePayload(p.(*api.CreatePayload), slack) - case HOOK_EVENT_PUSH: - return getSlackPushPayload(p.(*api.PushPayload), slack) - case HOOK_EVENT_PULL_REQUEST: - return getSlackPullRequestPayload(p.(*api.PullRequestPayload), slack) - } - - return s, nil -} diff --git a/models/wiki.go b/models/wiki.go deleted file mode 100644 index bc8aaf666e5..00000000000 --- a/models/wiki.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2015 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 models - -import ( - "fmt" - "io/ioutil" - "net/url" - "os" - "path" - "path/filepath" - "strings" - - "github.com/Unknwon/com" - - "github.com/gogits/git-module" - - "github.com/gogits/gogs/modules/setting" - "github.com/gogits/gogs/modules/sync" -) - -var wikiWorkingPool = sync.NewExclusivePool() - -// ToWikiPageURL formats a string to corresponding wiki URL name. -func ToWikiPageURL(name string) string { - return url.QueryEscape(strings.Replace(name, " ", "-", -1)) -} - -// ToWikiPageName formats a URL back to corresponding wiki page name, -// and removes leading characters './' to prevent changing files -// that are not belong to wiki repository. -func ToWikiPageName(urlString string) string { - name, _ := url.QueryUnescape(strings.Replace(urlString, "-", " ", -1)) - return strings.Replace(strings.TrimLeft(name, "./"), "/", " ", -1) -} - -// WikiCloneLink returns clone URLs of repository wiki. -func (repo *Repository) WikiCloneLink() (cl *CloneLink) { - return repo.cloneLink(true) -} - -// WikiPath returns wiki data path by given user and repository name. -func WikiPath(userName, repoName string) string { - return filepath.Join(UserPath(userName), strings.ToLower(repoName)+".wiki.git") -} - -func (repo *Repository) WikiPath() string { - return WikiPath(repo.MustOwner().Name, repo.Name) -} - -// HasWiki returns true if repository has wiki. -func (repo *Repository) HasWiki() bool { - return com.IsDir(repo.WikiPath()) -} - -// InitWiki initializes a wiki for repository, -// it does nothing when repository already has wiki. -func (repo *Repository) InitWiki() error { - if repo.HasWiki() { - return nil - } - - if err := git.InitRepository(repo.WikiPath(), true); err != nil { - return fmt.Errorf("InitRepository: %v", err) - } else if err = createUpdateHook(repo.WikiPath()); err != nil { - return fmt.Errorf("createUpdateHook: %v", err) - } - return nil -} - -func (repo *Repository) LocalWikiPath() string { - return path.Join(setting.AppDataPath, "tmp/local-wiki", com.ToStr(repo.ID)) -} - -// UpdateLocalWiki makes sure the local copy of repository wiki is up-to-date. -func (repo *Repository) UpdateLocalWiki() error { - // Don't pass branch name here because it fails to clone and - // checkout to a specific branch when wiki is an empty repository. - return UpdateLocalCopyBranch(repo.WikiPath(), repo.LocalWikiPath(), "") -} - -func discardLocalWikiChanges(localPath string) error { - return discardLocalRepoBranchChanges(localPath, "master") -} - -// updateWikiPage adds new page to repository wiki. -func (repo *Repository) updateWikiPage(doer *User, oldTitle, title, content, message string, isNew bool) (err error) { - wikiWorkingPool.CheckIn(com.ToStr(repo.ID)) - defer wikiWorkingPool.CheckOut(com.ToStr(repo.ID)) - - if err = repo.InitWiki(); err != nil { - return fmt.Errorf("InitWiki: %v", err) - } - - localPath := repo.LocalWikiPath() - if err = discardLocalWikiChanges(localPath); err != nil { - return fmt.Errorf("discardLocalWikiChanges: %v", err) - } else if err = repo.UpdateLocalWiki(); err != nil { - return fmt.Errorf("UpdateLocalWiki: %v", err) - } - - title = ToWikiPageName(title) - filename := path.Join(localPath, title+".md") - - // If not a new file, show perform update not create. - if isNew { - if com.IsExist(filename) { - return ErrWikiAlreadyExist{filename} - } - } else { - os.Remove(path.Join(localPath, oldTitle+".md")) - } - - // SECURITY: if new file is a symlink to non-exist critical file, - // attack content can be written to the target file (e.g. authorized_keys2) - // as a new page operation. - // So we want to make sure the symlink is removed before write anything. - // The new file we created will be in normal text format. - os.Remove(filename) - - if err = ioutil.WriteFile(filename, []byte(content), 0666); err != nil { - return fmt.Errorf("WriteFile: %v", err) - } - - if len(message) == 0 { - message = "Update page '" + title + "'" - } - if err = git.AddChanges(localPath, true); err != nil { - return fmt.Errorf("AddChanges: %v", err) - } else if err = git.CommitChanges(localPath, git.CommitChangesOptions{ - Committer: doer.NewGitSig(), - Message: message, - }); err != nil { - return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", "master"); err != nil { - return fmt.Errorf("Push: %v", err) - } - - return nil -} - -func (repo *Repository) AddWikiPage(doer *User, title, content, message string) error { - return repo.updateWikiPage(doer, "", title, content, message, true) -} - -func (repo *Repository) EditWikiPage(doer *User, oldTitle, title, content, message string) error { - return repo.updateWikiPage(doer, oldTitle, title, content, message, false) -} - -func (repo *Repository) DeleteWikiPage(doer *User, title string) (err error) { - wikiWorkingPool.CheckIn(com.ToStr(repo.ID)) - defer wikiWorkingPool.CheckOut(com.ToStr(repo.ID)) - - localPath := repo.LocalWikiPath() - if err = discardLocalWikiChanges(localPath); err != nil { - return fmt.Errorf("discardLocalWikiChanges: %v", err) - } else if err = repo.UpdateLocalWiki(); err != nil { - return fmt.Errorf("UpdateLocalWiki: %v", err) - } - - title = ToWikiPageName(title) - filename := path.Join(localPath, title+".md") - os.Remove(filename) - - message := "Delete page '" + title + "'" - - if err = git.AddChanges(localPath, true); err != nil { - return fmt.Errorf("AddChanges: %v", err) - } else if err = git.CommitChanges(localPath, git.CommitChangesOptions{ - Committer: doer.NewGitSig(), - Message: message, - }); err != nil { - return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", "master"); err != nil { - return fmt.Errorf("Push: %v", err) - } - - return nil -} diff --git a/modules/auth/admin.go b/modules/auth/admin.go deleted file mode 100644 index 58d1a027fc2..00000000000 --- a/modules/auth/admin.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2014 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 auth - -import ( - "gopkg.in/macaron.v1" - - "github.com/go-macaron/binding" -) - -type AdminCrateUserForm struct { - LoginType string `binding:"Required"` - LoginName string - UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"` - Email string `binding:"Required;Email;MaxSize(254)"` - Password string `binding:"MaxSize(255)"` - SendNotify bool -} - -func (f *AdminCrateUserForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type AdminEditUserForm struct { - LoginType string `binding:"Required"` - LoginName string - FullName string `binding:"MaxSize(100)"` - Email string `binding:"Required;Email;MaxSize(254)"` - Password string `binding:"MaxSize(255)"` - Website string `binding:"MaxSize(50)"` - Location string `binding:"MaxSize(50)"` - MaxRepoCreation int - Active bool - Admin bool - AllowGitHook bool - AllowImportLocal bool - ProhibitLogin bool -} - -func (f *AdminEditUserForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} diff --git a/modules/auth/auth.go b/modules/auth/auth.go deleted file mode 100644 index 3265b326c6a..00000000000 --- a/modules/auth/auth.go +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright 2014 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 auth - -import ( - "reflect" - "strings" - "time" - - "github.com/Unknwon/com" - "github.com/go-macaron/binding" - "github.com/go-macaron/session" - gouuid "github.com/satori/go.uuid" - "gopkg.in/macaron.v1" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -func IsAPIPath(url string) bool { - return strings.HasPrefix(url, "/api/") -} - -// SignedInID returns the id of signed in user. -func SignedInID(ctx *macaron.Context, sess session.Store) int64 { - if !models.HasEngine { - return 0 - } - - // Check access token. - if IsAPIPath(ctx.Req.URL.Path) { - tokenSHA := ctx.Query("token") - if len(tokenSHA) == 0 { - // Well, check with header again. - auHead := ctx.Req.Header.Get("Authorization") - if len(auHead) > 0 { - auths := strings.Fields(auHead) - if len(auths) == 2 && auths[0] == "token" { - tokenSHA = auths[1] - } - } - } - - // Let's see if token is valid. - if len(tokenSHA) > 0 { - t, err := models.GetAccessTokenBySHA(tokenSHA) - if err != nil { - if models.IsErrAccessTokenNotExist(err) || models.IsErrAccessTokenEmpty(err) { - log.Error(4, "GetAccessTokenBySHA: %v", err) - } - return 0 - } - t.Updated = time.Now() - if err = models.UpdateAccessToken(t); err != nil { - log.Error(4, "UpdateAccessToken: %v", err) - } - return t.UID - } - } - - uid := sess.Get("uid") - if uid == nil { - return 0 - } - if id, ok := uid.(int64); ok { - if _, err := models.GetUserByID(id); err != nil { - if !models.IsErrUserNotExist(err) { - log.Error(4, "GetUserById: %v", err) - } - return 0 - } - return id - } - return 0 -} - -// SignedInUser returns the user object of signed user. -// It returns a bool value to indicate whether user uses basic auth or not. -func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool) { - if !models.HasEngine { - return nil, false - } - - uid := SignedInID(ctx, sess) - - if uid <= 0 { - if setting.Service.EnableReverseProxyAuth { - webAuthUser := ctx.Req.Header.Get(setting.ReverseProxyAuthUser) - if len(webAuthUser) > 0 { - u, err := models.GetUserByName(webAuthUser) - if err != nil { - if !models.IsErrUserNotExist(err) { - log.Error(4, "GetUserByName: %v", err) - return nil, false - } - - // Check if enabled auto-registration. - if setting.Service.EnableReverseProxyAutoRegister { - u := &models.User{ - Name: webAuthUser, - Email: gouuid.NewV4().String() + "@localhost", - Passwd: webAuthUser, - IsActive: true, - } - if err = models.CreateUser(u); err != nil { - // FIXME: should I create a system notice? - log.Error(4, "CreateUser: %v", err) - return nil, false - } else { - return u, false - } - } - } - return u, false - } - } - - // Check with basic auth. - baHead := ctx.Req.Header.Get("Authorization") - if len(baHead) > 0 { - auths := strings.Fields(baHead) - if len(auths) == 2 && auths[0] == "Basic" { - uname, passwd, _ := base.BasicAuthDecode(auths[1]) - - u, err := models.UserSignIn(uname, passwd) - if err != nil { - if !models.IsErrUserNotExist(err) { - log.Error(4, "UserSignIn: %v", err) - } - return nil, false - } - - return u, true - } - } - return nil, false - } - - u, err := models.GetUserByID(uid) - if err != nil { - log.Error(4, "GetUserById: %v", err) - return nil, false - } - return u, false -} - -type Form interface { - binding.Validator -} - -func init() { - binding.SetNameMapper(com.ToSnakeCase) -} - -// AssignForm assign form values back to the template data. -func AssignForm(form interface{}, data map[string]interface{}) { - typ := reflect.TypeOf(form) - val := reflect.ValueOf(form) - - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - val = val.Elem() - } - - for i := 0; i < typ.NumField(); i++ { - field := typ.Field(i) - - fieldName := field.Tag.Get("form") - // Allow ignored fields in the struct - if fieldName == "-" { - continue - } else if len(fieldName) == 0 { - fieldName = com.ToSnakeCase(field.Name) - } - - data[fieldName] = val.Field(i).Interface() - } -} - -func getRuleBody(field reflect.StructField, prefix string) string { - for _, rule := range strings.Split(field.Tag.Get("binding"), ";") { - if strings.HasPrefix(rule, prefix) { - return rule[len(prefix) : len(rule)-1] - } - } - return "" -} - -func GetSize(field reflect.StructField) string { - return getRuleBody(field, "Size(") -} - -func GetMinSize(field reflect.StructField) string { - return getRuleBody(field, "MinSize(") -} - -func GetMaxSize(field reflect.StructField) string { - return getRuleBody(field, "MaxSize(") -} - -func GetInclude(field reflect.StructField) string { - return getRuleBody(field, "Include(") -} - -// FIXME: struct contains a struct -func validateStruct(obj interface{}) binding.Errors { - - return nil -} - -func validate(errs binding.Errors, data map[string]interface{}, f Form, l macaron.Locale) binding.Errors { - if errs.Len() == 0 { - return errs - } - - data["HasError"] = true - AssignForm(f, data) - - typ := reflect.TypeOf(f) - val := reflect.ValueOf(f) - - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - val = val.Elem() - } - - for i := 0; i < typ.NumField(); i++ { - field := typ.Field(i) - - fieldName := field.Tag.Get("form") - // Allow ignored fields in the struct - if fieldName == "-" { - continue - } - - if errs[0].FieldNames[0] == field.Name { - data["Err_"+field.Name] = true - - trName := field.Tag.Get("locale") - if len(trName) == 0 { - trName = l.Tr("form." + field.Name) - } else { - trName = l.Tr(trName) - } - - switch errs[0].Classification { - case binding.ERR_REQUIRED: - data["ErrorMsg"] = trName + l.Tr("form.require_error") - case binding.ERR_ALPHA_DASH: - 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 binding.ERR_SIZE: - data["ErrorMsg"] = trName + l.Tr("form.size_error", GetSize(field)) - case binding.ERR_MIN_SIZE: - data["ErrorMsg"] = trName + l.Tr("form.min_size_error", GetMinSize(field)) - case binding.ERR_MAX_SIZE: - data["ErrorMsg"] = trName + l.Tr("form.max_size_error", GetMaxSize(field)) - case binding.ERR_EMAIL: - data["ErrorMsg"] = trName + l.Tr("form.email_error") - case binding.ERR_URL: - data["ErrorMsg"] = trName + l.Tr("form.url_error") - case binding.ERR_INCLUDE: - data["ErrorMsg"] = trName + l.Tr("form.include_error", GetInclude(field)) - default: - data["ErrorMsg"] = l.Tr("form.unknown_error") + " " + errs[0].Classification - } - return errs - } - } - return errs -} diff --git a/modules/auth/auth_form.go b/modules/auth/auth_form.go deleted file mode 100644 index 9454d856938..00000000000 --- a/modules/auth/auth_form.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2014 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 auth - -import ( - "github.com/go-macaron/binding" - "gopkg.in/macaron.v1" -) - -type AuthenticationForm struct { - ID int64 - Type int `binding:"Range(2,5)"` - 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 -} - -func (f *AuthenticationForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} diff --git a/modules/auth/ldap/README.md b/modules/auth/ldap/README.md deleted file mode 100644 index 3a3e0204368..00000000000 --- a/modules/auth/ldap/README.md +++ /dev/null @@ -1,101 +0,0 @@ -Gogs LDAP Authentication Module -=============================== - -## About - -This authentication module attempts to authorize and authenticate a user -against an LDAP server. It provides two methods of authentication: LDAP via -BindDN, and LDAP simple authentication. - -LDAP via BindDN functions like most LDAP authentication systems. First, it -queries the LDAP server using a Bind DN and searches for the user that is -attempting to sign in. If the user is found, the module attempts to bind to the -server using the user's supplied credentials. If this succeeds, the user has -been authenticated, and his account information is retrieved and passed to the -Gogs login infrastructure. - -LDAP simple authentication does not utilize a Bind DN. Instead, it binds -directly with the LDAP server using the user's supplied credentials. If the bind -succeeds and no filter rules out the user, the user is authenticated. - -LDAP via BindDN is recommended for most users. By using a Bind DN, the server -can perform authorization by restricting which entries the Bind DN account can -read. Further, using a Bind DN with reduced permissions can reduce security risk -in the face of application bugs. - -## Usage - -To use this module, add an LDAP authentication source via the Authentications -section in the admin panel. Both the LDAP via BindDN and the simple auth LDAP -share the following fields: - -* Authorization Name **(required)** - * A name to assign to the new method of authorization. - -* Host **(required)** - * The address where the LDAP server can be reached. - * Example: mydomain.com - -* Port **(required)** - * The port to use when connecting to the server. - * Example: 636 - -* Enable TLS Encryption (optional) - * Whether to use TLS when connecting to the LDAP server. - -* Admin Filter (optional) - * An LDAP filter specifying if a user should be given administrator - privileges. If a user accounts passes the filter, the user will be - privileged as an administrator. - * Example: (objectClass=adminAccount) - -* First name attribute (optional) - * The attribute of the user's LDAP record containing the user's first name. - This will be used to populate their account information. - * Example: givenName - -* Surname attribute (optional) - * The attribute of the user's LDAP record containing the user's surname This - will be used to populate their account information. - * Example: sn - -* E-mail attribute **(required)** - * The attribute of the user's LDAP record containing the user's email - address. This will be used to populate their account information. - * Example: mail - -**LDAP via BindDN** adds the following fields: - -* Bind DN (optional) - * The DN to bind to the LDAP server with when searching for the user. This - may be left blank to perform an anonymous search. - * Example: cn=Search,dc=mydomain,dc=com - -* Bind Password (optional) - * The password for the Bind DN specified above, if any. _Note: The password - is stored in plaintext at the server. As such, ensure that your Bind DN - has as few privileges as possible._ - -* User Search Base **(required)** - * The LDAP base at which user accounts will be searched for. - * Example: ou=Users,dc=mydomain,dc=com - -* User Filter **(required)** - * An LDAP filter declaring how to find the user record that is attempting to - authenticate. The '%s' matching parameter will be substituted with the - user's username. - * Example: (&(objectClass=posixAccount)(uid=%s)) - -**LDAP using simple auth** adds the following fields: - -* User DN **(required)** - * A template to use as the user's DN. The `%s` matching parameter will be - substituted with the user's username. - * Example: cn=%s,ou=Users,dc=mydomain,dc=com - * Example: uid=%s,ou=Users,dc=mydomain,dc=com - -* User Filter **(required)** - * An LDAP filter declaring when a user should be allowed to log in. The `%s` - matching parameter will be substituted with the user's username. - * Example: (&(objectClass=posixAccount)(cn=%s)) - * Example: (&(objectClass=posixAccount)(uid=%s)) diff --git a/modules/auth/ldap/ldap.go b/modules/auth/ldap/ldap.go deleted file mode 100644 index 55364bfccec..00000000000 --- a/modules/auth/ldap/ldap.go +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright 2014 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 ldap provide functions & structure to query a LDAP ldap directory -// For now, it's mainly tested again an MS Active Directory service, see README.md for more information -package ldap - -import ( - "crypto/tls" - "fmt" - "strings" - - "gopkg.in/ldap.v2" - - "github.com/gogits/gogs/modules/log" -) - -type SecurityProtocol int - -// Note: new type must be added at the end of list to maintain compatibility. -const ( - SECURITY_PROTOCOL_UNENCRYPTED SecurityProtocol = iota - SECURITY_PROTOCOL_LDAPS - SECURITY_PROTOCOL_START_TLS -) - -// Basic LDAP authentication service -type Source struct { - Name string // canonical name (ie. corporate.ad) - Host string // LDAP host - Port int // port number - SecurityProtocol SecurityProtocol - SkipVerify bool - BindDN string // DN to bind with - BindPassword string // Bind DN password - UserBase string // Base search path for users - UserDN string // Template for the DN of the user for simple auth - AttributeUsername string // Username attribute - AttributeName string // First name attribute - AttributeSurname string // Surname attribute - AttributeMail string // E-mail attribute - AttributesInBind bool // fetch attributes in bind context (not user) - Filter string // Query filter to validate entry - AdminFilter string // Query filter to check if user is admin - Enabled bool // if this source is disabled -} - -func (ls *Source) sanitizedUserQuery(username string) (string, bool) { - // See http://tools.ietf.org/search/rfc4515 - badCharacters := "\x00()*\\" - if strings.ContainsAny(username, badCharacters) { - log.Debug("'%s' contains invalid query characters. Aborting.", username) - return "", false - } - - return fmt.Sprintf(ls.Filter, username), true -} - -func (ls *Source) sanitizedUserDN(username string) (string, bool) { - // See http://tools.ietf.org/search/rfc4514: "special characters" - badCharacters := "\x00()*\\,='\"#+;<> " - if strings.ContainsAny(username, badCharacters) { - log.Debug("'%s' contains invalid DN characters. Aborting.", username) - return "", false - } - - return fmt.Sprintf(ls.UserDN, username), true -} - -func (ls *Source) findUserDN(l *ldap.Conn, name string) (string, bool) { - log.Trace("Search for LDAP user: %s", name) - 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 "", false - } - log.Trace("Bound as BindDN %s", ls.BindDN) - } else { - log.Trace("Proceeding with anonymous LDAP search.") - } - - // A search for the user. - userFilter, ok := ls.sanitizedUserQuery(name) - if !ok { - return "", false - } - - log.Trace("Searching for DN using filter %s and base %s", userFilter, ls.UserBase) - search := ldap.NewSearchRequest( - ls.UserBase, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, - false, userFilter, []string{}, nil) - - // Ensure we found a user - sr, err := l.Search(search) - if err != nil || len(sr.Entries) < 1 { - log.Debug("Failed search using filter[%s]: %v", userFilter, err) - return "", false - } else if len(sr.Entries) > 1 { - log.Debug("Filter '%s' returned more than one user.", userFilter) - return "", false - } - - userDN := sr.Entries[0].DN - if userDN == "" { - log.Error(4, "LDAP search was successful, but found no DN!") - return "", false - } - - return userDN, true -} - -func dial(ls *Source) (*ldap.Conn, error) { - log.Trace("Dialing LDAP with security protocol (%v) without verifying: %v", ls.SecurityProtocol, ls.SkipVerify) - - tlsCfg := &tls.Config{ - ServerName: ls.Host, - InsecureSkipVerify: ls.SkipVerify, - } - if ls.SecurityProtocol == SECURITY_PROTOCOL_LDAPS { - return ldap.DialTLS("tcp", fmt.Sprintf("%s:%d", ls.Host, ls.Port), tlsCfg) - } - - conn, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ls.Host, ls.Port)) - if err != nil { - return nil, fmt.Errorf("Dial: %v", err) - } - - if ls.SecurityProtocol == SECURITY_PROTOCOL_START_TLS { - if err = conn.StartTLS(tlsCfg); err != nil { - conn.Close() - return nil, fmt.Errorf("StartTLS: %v", err) - } - } - - return conn, nil -} - -func bindUser(l *ldap.Conn, userDN, passwd string) error { - log.Trace("Binding with userDN: %s", userDN) - err := l.Bind(userDN, passwd) - if err != nil { - log.Debug("LDAP auth. failed for %s, reason: %v", userDN, err) - return err - } - log.Trace("Bound successfully with userDN: %s", userDN) - return err -} - -// 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) { - l, err := dial(ls) - if err != nil { - log.Error(4, "LDAP Connect error, %s:%v", ls.Host, err) - ls.Enabled = false - return "", "", "", "", false, false - } - defer l.Close() - - var userDN string - if directBind { - log.Trace("LDAP will bind directly via UserDN template: %s", ls.UserDN) - - var ok bool - userDN, ok = ls.sanitizedUserDN(name) - if !ok { - return "", "", "", "", false, false - } - } else { - log.Trace("LDAP will use BindDN.") - - var found bool - userDN, found = ls.findUserDN(l, name) - if !found { - return "", "", "", "", false, false - } - } - - if directBind || !ls.AttributesInBind { - // binds user (checking password) before looking-up attributes in user context - err = bindUser(l, userDN, passwd) - if err != nil { - return "", "", "", "", false, false - } - } - - userFilter, ok := ls.sanitizedUserQuery(name) - if !ok { - return "", "", "", "", false, false - } - - log.Trace("Fetching attributes '%v', '%v', '%v', '%v' with filter %s and base %s", ls.AttributeUsername, ls.AttributeName, ls.AttributeSurname, ls.AttributeMail, userFilter, userDN) - search := ldap.NewSearchRequest( - userDN, 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 "", "", "", "", false, false - } else if len(sr.Entries) < 1 { - if directBind { - log.Error(4, "User filter inhibited user login.") - } else { - log.Error(4, "LDAP Search failed unexpectedly! (0 entries)") - } - - return "", "", "", "", false, false - } - - 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 - } - } - - 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 username, firstname, surname, mail, isAdmin, true -} diff --git a/modules/auth/org.go b/modules/auth/org.go deleted file mode 100644 index 53ef6245d9e..00000000000 --- a/modules/auth/org.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2014 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 auth - -import ( - "github.com/go-macaron/binding" - "gopkg.in/macaron.v1" -) - -// ________ .__ __ .__ -// \_____ \_______ _________ ____ |__|____________ _/ |_|__| ____ ____ -// / | \_ __ \/ ___\__ \ / \| \___ /\__ \\ __\ |/ _ \ / \ -// / | \ | \/ /_/ > __ \| | \ |/ / / __ \| | | ( <_> ) | \ -// \_______ /__| \___ (____ /___| /__/_____ \(____ /__| |__|\____/|___| / -// \/ /_____/ \/ \/ \/ \/ \/ - -type CreateOrgForm struct { - OrgName string `binding:"Required;AlphaDashDot;MaxSize(35)" locale:"org.org_name_holder"` -} - -func (f *CreateOrgForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -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(100)"` - Location string `binding:"MaxSize(50)"` - MaxRepoCreation int -} - -func (f *UpdateOrgSettingForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// ___________ -// \__ ___/___ _____ _____ -// | |_/ __ \\__ \ / \ -// | |\ ___/ / __ \| Y Y \ -// |____| \___ >____ /__|_| / -// \/ \/ \/ - -type CreateTeamForm struct { - TeamName string `binding:"Required;AlphaDashDot;MaxSize(30)"` - Description string `binding:"MaxSize(255)"` - Permission string -} - -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/pam/pam.go b/modules/auth/pam/pam.go deleted file mode 100644 index 7f326d42f55..00000000000 --- a/modules/auth/pam/pam.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build pam - -// Copyright 2014 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 pam - -import ( - "errors" - - "github.com/msteinert/pam" -) - -func PAMAuth(serviceName, userName, passwd string) error { - t, err := pam.StartFunc(serviceName, userName, func(s pam.Style, msg string) (string, error) { - switch s { - case pam.PromptEchoOff: - return passwd, nil - case pam.PromptEchoOn, pam.ErrorMsg, pam.TextInfo: - return "", nil - } - return "", errors.New("Unrecognized PAM message style") - }) - - if err != nil { - return err - } - - if err = t.Authenticate(0); err != nil { - return err - } - - return nil -} diff --git a/modules/auth/pam/pam_stub.go b/modules/auth/pam/pam_stub.go deleted file mode 100644 index 33ac751a34d..00000000000 --- a/modules/auth/pam/pam_stub.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !pam - -// Copyright 2014 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 pam - -import ( - "errors" -) - -func PAMAuth(serviceName, userName, passwd string) error { - return errors.New("PAM not supported") -} diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go deleted file mode 100644 index d1e28dc1194..00000000000 --- a/modules/auth/repo_form.go +++ /dev/null @@ -1,355 +0,0 @@ -// Copyright 2014 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 auth - -import ( - "net/url" - "strings" - - "github.com/Unknwon/com" - "github.com/go-macaron/binding" - "gopkg.in/macaron.v1" - - "github.com/gogits/gogs/models" -) - -// _______________________________________ _________.______________________ _______________.___. -// \______ \_ _____/\______ \_____ \ / _____/| \__ ___/\_____ \\______ \__ | | -// | _/| __)_ | ___// | \ \_____ \ | | | | / | \| _// | | -// | | \| \ | | / | \/ \| | | | / | \ | \\____ | -// |____|_ /_______ / |____| \_______ /_______ /|___| |____| \_______ /____|_ // ______| -// \/ \/ \/ \/ \/ \/ \/ - -type CreateRepoForm struct { - Uid int64 `binding:"Required"` - RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"` - Private bool - Description string `binding:"MaxSize(255)"` - AutoInit bool - Gitignores string - License string - Readme string -} - -func (f *CreateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type MigrateRepoForm struct { - CloneAddr string `json:"clone_addr" binding:"Required"` - AuthUsername string `json:"auth_username"` - AuthPassword string `json:"auth_password"` - Uid int64 `json:"uid" binding:"Required"` - RepoName string `json:"repo_name" binding:"Required;AlphaDashDot;MaxSize(100)"` - Mirror bool `json:"mirror"` - Private bool `json:"private"` - Description string `json:"description" binding:"MaxSize(255)"` -} - -func (f *MigrateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// ParseRemoteAddr checks if given remote address is valid, -// and returns composed URL with needed username and passowrd. -// It also checks if given user has permission when remote address -// is actually a local path. -func (f MigrateRepoForm) ParseRemoteAddr(user *models.User) (string, error) { - remoteAddr := strings.TrimSpace(f.CloneAddr) - - // Remote address can be HTTP/HTTPS/Git URL or local path. - if strings.HasPrefix(remoteAddr, "http://") || - strings.HasPrefix(remoteAddr, "https://") || - strings.HasPrefix(remoteAddr, "git://") { - u, err := url.Parse(remoteAddr) - if err != nil { - return "", models.ErrInvalidCloneAddr{IsURLError: true} - } - if len(f.AuthUsername)+len(f.AuthPassword) > 0 { - u.User = url.UserPassword(f.AuthUsername, f.AuthPassword) - } - remoteAddr = u.String() - } else if !user.CanImportLocal() { - return "", models.ErrInvalidCloneAddr{IsPermissionDenied: true} - } else if !com.IsDir(remoteAddr) { - return "", models.ErrInvalidCloneAddr{IsInvalidPath: true} - } - - return remoteAddr, nil -} - -type RepoSettingForm struct { - RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"` - Description string `binding:"MaxSize(255)"` - Website string `binding:"Url;MaxSize(100)"` - Branch string - Interval int - MirrorAddress string - Private bool - EnablePrune bool - - // Advanced settings - EnableWiki bool - EnableExternalWiki bool - ExternalWikiURL string - EnableIssues bool - EnableExternalTracker bool - TrackerURLFormat string - TrackerIssueStyle string - EnablePulls bool -} - -func (f *RepoSettingForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// __ __ ___. .__ .__ __ -// / \ / \ ____\_ |__ | |__ | |__ ____ | | __ -// \ \/\/ // __ \| __ \| | \| | \ / _ \| |/ / -// \ /\ ___/| \_\ \ Y \ Y ( <_> ) < -// \__/\ / \___ >___ /___| /___| /\____/|__|_ \ -// \/ \/ \/ \/ \/ \/ - -type WebhookForm struct { - Events string - Create bool - Push bool - PullRequest bool - Active bool -} - -func (f WebhookForm) PushOnly() bool { - return f.Events == "push_only" -} - -func (f WebhookForm) SendEverything() bool { - return f.Events == "send_everything" -} - -func (f WebhookForm) ChooseEvents() bool { - return f.Events == "choose_events" -} - -type NewWebhookForm struct { - PayloadURL string `binding:"Required;Url"` - ContentType int `binding:"Required"` - Secret string - WebhookForm -} - -func (f *NewWebhookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type NewSlackHookForm struct { - PayloadURL string `binding:"Required;Url"` - Channel string `binding:"Required"` - Username string - IconURL string - Color string - WebhookForm -} - -func (f *NewSlackHookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// .___ -// | | ______ ________ __ ____ -// | |/ ___// ___/ | \_/ __ \ -// | |\___ \ \___ \| | /\ ___/ -// |___/____ >____ >____/ \___ > -// \/ \/ \/ - -type CreateIssueForm struct { - Title string `binding:"Required;MaxSize(255)"` - LabelIDs string `form:"label_ids"` - MilestoneID int64 - AssigneeID int64 - Content string - Files []string -} - -func (f *CreateIssueForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type CreateCommentForm struct { - Content string - Status string `binding:"OmitEmpty;In(reopen,close)"` - Files []string -} - -func (f *CreateCommentForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// _____ .__.__ __ -// / \ |__| | ____ _______/ |_ ____ ____ ____ -// / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \ -// / Y \ | |_\ ___/ \___ \ | | ( <_> ) | \ ___/ -// \____|__ /__|____/\___ >____ > |__| \____/|___| /\___ > -// \/ \/ \/ \/ \/ - -type CreateMilestoneForm struct { - Title string `binding:"Required;MaxSize(50)"` - Content string - Deadline string -} - -func (f *CreateMilestoneForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// .____ ___. .__ -// | | _____ \_ |__ ____ | | -// | | \__ \ | __ \_/ __ \| | -// | |___ / __ \| \_\ \ ___/| |__ -// |_______ (____ /___ /\___ >____/ -// \/ \/ \/ \/ - -type CreateLabelForm struct { - ID int64 - Title string `binding:"Required;MaxSize(50)" locale:"repo.issues.label_name"` - Color string `binding:"Required;Size(7)" locale:"repo.issues.label_color"` -} - -func (f *CreateLabelForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type InitializeLabelsForm struct { - TemplateName string `binding:"Required"` -} - -func (f *InitializeLabelsForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// __________ .__ -// \______ \ ____ | | ____ _____ ______ ____ -// | _// __ \| | _/ __ \\__ \ / ___// __ \ -// | | \ ___/| |_\ ___/ / __ \_\___ \\ ___/ -// |____|_ /\___ >____/\___ >____ /____ >\___ > -// \/ \/ \/ \/ \/ \/ - -type NewReleaseForm struct { - TagName string `binding:"Required"` - Target string `form:"tag_target" binding:"Required"` - Title string `binding:"Required"` - Content string - Draft string - Prerelease bool -} - -func (f *NewReleaseForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type EditReleaseForm struct { - Title string `form:"title" binding:"Required"` - Content string `form:"content"` - Draft string `form:"draft"` - Prerelease bool `form:"prerelease"` -} - -func (f *EditReleaseForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// __ __.__ __ .__ -// / \ / \__| | _|__| -// \ \/\/ / | |/ / | -// \ /| | <| | -// \__/\ / |__|__|_ \__| -// \/ \/ - -type NewWikiForm struct { - OldTitle string - Title string `binding:"Required"` - Content string `binding:"Required"` - Message string -} - -// 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) -} - -// ___________ .___.__ __ -// \_ _____/ __| _/|__|/ |_ -// | __)_ / __ | | \ __\ -// | \/ /_/ | | || | -// /_______ /\____ | |__||__| -// \/ \/ - -type EditRepoFileForm struct { - TreePath string `binding:"Required;MaxSize(500)"` - Content string `binding:"Required"` - CommitSummary string `binding:"MaxSize(100)` - CommitMessage string - CommitChoice string `binding:"Required;MaxSize(50)"` - NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"` - LastCommit string -} - -func (f *EditRepoFileForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type EditPreviewDiffForm struct { - Content string -} - -func (f *EditPreviewDiffForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// ____ ___ .__ .___ -// | | \______ | | _________ __| _/ -// | | /\____ \| | / _ \__ \ / __ | -// | | / | |_> > |_( <_> ) __ \_/ /_/ | -// |______/ | __/|____/\____(____ /\____ | -// |__| \/ \/ -// - -type UploadRepoFileForm struct { - TreePath string `binding:MaxSize(500)"` - CommitSummary string `binding:"MaxSize(100)` - CommitMessage string - CommitChoice string `binding:"Required;MaxSize(50)"` - NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"` - Files []string -} - -func (f *UploadRepoFileForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type RemoveUploadFileForm struct { - File string `binding:"Required;MaxSize(50)"` -} - -func (f *RemoveUploadFileForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// ________ .__ __ -// \______ \ ____ | | _____/ |_ ____ -// | | \_/ __ \| | _/ __ \ __\/ __ \ -// | ` \ ___/| |_\ ___/| | \ ___/ -// /_______ /\___ >____/\___ >__| \___ > -// \/ \/ \/ \/ - -type DeleteRepoFileForm struct { - CommitSummary string `binding:"MaxSize(100)` - CommitMessage string - CommitChoice string `binding:"Required;MaxSize(50)"` - NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"` -} - -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 deleted file mode 100644 index 7bd6c7b9bc3..00000000000 --- a/modules/auth/user_form.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2014 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 auth - -import ( - "mime/multipart" - - "github.com/go-macaron/binding" - "gopkg.in/macaron.v1" -) - -type InstallForm struct { - DbType string `binding:"Required"` - DbHost string - DbUser string - DbPasswd string - DbName string - SSLMode string - DbPath string - - AppName string `binding:"Required" locale:"install.app_name"` - RepoRootPath string `binding:"Required"` - RunUser string `binding:"Required"` - Domain string `binding:"Required"` - SSHPort int - HTTPPort string `binding:"Required"` - AppUrl string `binding:"Required"` - LogRootPath string `binding:"Required"` - - SMTPHost string - SMTPFrom string - SMTPEmail string `binding:"OmitEmpty;Email;MaxSize(254)" locale:"install.mailer_user"` - SMTPPasswd string - RegisterConfirm bool - MailNotify bool - - OfflineMode bool - DisableGravatar bool - EnableFederatedAvatar bool - DisableRegistration bool - EnableCaptcha bool - RequireSignInView bool - - AdminName string `binding:"OmitEmpty;AlphaDashDot;MaxSize(30)" locale:"install.admin_name"` - AdminPasswd string `binding:"OmitEmpty;MaxSize(255)" locale:"install.admin_password"` - AdminConfirmPasswd string - AdminEmail string `binding:"OmitEmpty;MinSize(3);MaxSize(254);Include(@)" locale:"install.admin_email"` -} - -func (f *InstallForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// _____ ____ _________________ ___ -// / _ \ | | \__ ___/ | \ -// / /_\ \| | / | | / ~ \ -// / | \ | / | | \ Y / -// \____|__ /______/ |____| \___|_ / -// \/ \/ - -type RegisterForm struct { - UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"` - Email string `binding:"Required;Email;MaxSize(254)"` - Password string `binding:"Required;MaxSize(255)"` - Retype string -} - -func (f *RegisterForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type SignInForm struct { - UserName string `binding:"Required;MaxSize(254)"` - Password string `binding:"Required;MaxSize(255)"` - Remember bool -} - -func (f *SignInForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -// __________________________________________.___ _______ ________ _________ -// / _____/\_ _____/\__ ___/\__ ___/| |\ \ / _____/ / _____/ -// \_____ \ | __)_ | | | | | |/ | \/ \ ___ \_____ \ -// / \ | \ | | | | | / | \ \_\ \/ \ -// /_______ //_______ / |____| |____| |___\____|__ /\______ /_______ / -// \/ \/ \/ \/ \/ - -type UpdateProfileForm struct { - Name string `binding:"OmitEmpty;MaxSize(35)"` - FullName string `binding:"MaxSize(100)"` - Email string `binding:"Required;Email;MaxSize(254)"` - Website string `binding:"Url;MaxSize(100)"` - Location string `binding:"MaxSize(50)"` -} - -func (f *UpdateProfileForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -const ( - AVATAR_LOCAL string = "local" - AVATAR_BYMAIL string = "bymail" -) - -type AvatarForm struct { - Source string - Avatar *multipart.FileHeader - Gravatar string `binding:"OmitEmpty;Email;MaxSize(254)"` - Federavatar bool -} - -func (f *AvatarForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type AddEmailForm struct { - Email string `binding:"Required;Email;MaxSize(254)"` -} - -func (f *AddEmailForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type ChangePasswordForm struct { - OldPassword string `form:"old_password" binding:"Required;MinSize(1);MaxSize(255)"` - Password string `form:"password" binding:"Required;MaxSize(255)"` - Retype string `form:"retype"` -} - -func (f *ChangePasswordForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type AddSSHKeyForm struct { - Title string `binding:"Required;MaxSize(50)"` - Content string `binding:"Required"` -} - -func (f *AddSSHKeyForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} - -type NewAccessTokenForm struct { - Name string `binding:"Required"` -} - -func (f *NewAccessTokenForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { - return validate(errs, ctx.Data, f, ctx.Locale) -} diff --git a/modules/avatar/avatar.go b/modules/avatar/avatar.go deleted file mode 100644 index a8c3826d158..00000000000 --- a/modules/avatar/avatar.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2014 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 avatar - -import ( - "fmt" - "image" - "image/color/palette" - "math/rand" - "time" - - "github.com/issue9/identicon" -) - -const AVATAR_SIZE = 290 - -// RandomImage generates and returns a random avatar image unique to input data -// in custom size (height and width). -func RandomImageSize(size int, data []byte) (image.Image, error) { - randExtent := len(palette.WebSafe) - 32 - rand.Seed(time.Now().UnixNano()) - colorIndex := rand.Intn(randExtent) - backColorIndex := colorIndex - 1 - if backColorIndex < 0 { - backColorIndex = randExtent - 1 - } - - // Define size, background, and forecolor - imgMaker, err := identicon.New(size, - palette.WebSafe[backColorIndex], palette.WebSafe[colorIndex:colorIndex+32]...) - if err != nil { - return nil, fmt.Errorf("identicon.New: %v", err) - } - return imgMaker.Make(data), nil -} - -// RandomImage generates and returns a random avatar image unique to input data -// in default size (height and width). -func RandomImage(data []byte) (image.Image, error) { - return RandomImageSize(AVATAR_SIZE, data) -} diff --git a/modules/avatar/avatar_test.go b/modules/avatar/avatar_test.go deleted file mode 100644 index fea1c2c7377..00000000000 --- a/modules/avatar/avatar_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2016 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 avatar - -import ( - "testing" - - . "github.com/smartystreets/goconvey/convey" -) - -func Test_RandomImage(t *testing.T) { - Convey("Generate a random avatar from email", t, func() { - _, err := RandomImage([]byte("gogs@local")) - So(err, ShouldBeNil) - - Convey("Try to generate an image with size zero", func() { - _, err := RandomImageSize(0, []byte("gogs@local")) - So(err, ShouldNotBeNil) - }) - }) -} diff --git a/modules/base/base.go b/modules/base/base.go deleted file mode 100644 index 8ba211aa7af..00000000000 --- a/modules/base/base.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2014 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 base - -const DOC_URL = "https://github.com/gogits/go-gogs-client/wiki" - -type ( - TplName string -) diff --git a/modules/base/tool.go b/modules/base/tool.go deleted file mode 100644 index 52d1e178dba..00000000000 --- a/modules/base/tool.go +++ /dev/null @@ -1,535 +0,0 @@ -// Copyright 2014 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 base - -import ( - "crypto/hmac" - "crypto/md5" - "crypto/rand" - "crypto/sha1" - "encoding/base64" - "encoding/hex" - "fmt" - "hash" - "html/template" - "math" - "net/http" - "strings" - "time" - "unicode" - "unicode/utf8" - - "github.com/Unknwon/com" - "github.com/Unknwon/i18n" - - "github.com/gogits/chardet" - - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -// EncodeMD5 encodes string to md5 hex value. -func EncodeMD5(str string) string { - m := md5.New() - m.Write([]byte(str)) - return hex.EncodeToString(m.Sum(nil)) -} - -// Encode string to sha1 hex value. -func EncodeSha1(str string) string { - h := sha1.New() - h.Write([]byte(str)) - return hex.EncodeToString(h.Sum(nil)) -} - -func ShortSha(sha1 string) string { - if len(sha1) > 10 { - return sha1[:10] - } - return sha1 -} - -func DetectEncoding(content []byte) (string, error) { - if utf8.Valid(content) { - log.Debug("Detected encoding: utf-8 (fast)") - return "UTF-8", nil - } - - result, err := chardet.NewTextDetector().DetectBest(content) - if result.Charset != "UTF-8" && len(setting.Repository.AnsiCharset) > 0 { - log.Debug("Using default AnsiCharset: %s", setting.Repository.AnsiCharset) - return setting.Repository.AnsiCharset, err - } - - log.Debug("Detected encoding: %s", result.Charset) - return result.Charset, err -} - -func BasicAuthDecode(encoded string) (string, string, error) { - s, err := base64.StdEncoding.DecodeString(encoded) - if err != nil { - return "", "", err - } - - auth := strings.SplitN(string(s), ":", 2) - return auth[0], auth[1], nil -} - -func BasicAuthEncode(username, password string) string { - return base64.StdEncoding.EncodeToString([]byte(username + ":" + password)) -} - -// GetRandomString generate random string by specify chars. -func GetRandomString(n int, alphabets ...byte) string { - const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - var bytes = make([]byte, n) - rand.Read(bytes) - for i, b := range bytes { - if len(alphabets) == 0 { - bytes[i] = alphanum[b%byte(len(alphanum))] - } else { - bytes[i] = alphabets[b%byte(len(alphabets))] - } - } - return string(bytes) -} - -// http://code.google.com/p/go/source/browse/pbkdf2/pbkdf2.go?repo=crypto -// FIXME: use https://godoc.org/golang.org/x/crypto/pbkdf2? -func PBKDF2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { - prf := hmac.New(h, password) - hashLen := prf.Size() - numBlocks := (keyLen + hashLen - 1) / hashLen - - var buf [4]byte - dk := make([]byte, 0, numBlocks*hashLen) - U := make([]byte, hashLen) - for block := 1; block <= numBlocks; block++ { - // N.B.: || means concatenation, ^ means XOR - // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter - // U_1 = PRF(password, salt || uint(i)) - prf.Reset() - prf.Write(salt) - buf[0] = byte(block >> 24) - buf[1] = byte(block >> 16) - buf[2] = byte(block >> 8) - buf[3] = byte(block) - prf.Write(buf[:4]) - dk = prf.Sum(dk) - T := dk[len(dk)-hashLen:] - copy(U, T) - - // U_n = PRF(password, U_(n-1)) - for n := 2; n <= iter; n++ { - prf.Reset() - prf.Write(U) - U = U[:0] - U = prf.Sum(U) - for x := range U { - T[x] ^= U[x] - } - } - } - return dk[:keyLen] -} - -// verify time limit code -func VerifyTimeLimitCode(data string, minutes int, code string) bool { - if len(code) <= 18 { - return false - } - - // split code - start := code[:12] - lives := code[12:18] - if d, err := com.StrTo(lives).Int(); err == nil { - minutes = d - } - - // right active code - retCode := CreateTimeLimitCode(data, minutes, start) - if retCode == code && minutes > 0 { - // check time is expired or not - before, _ := time.ParseInLocation("200601021504", start, time.Local) - now := time.Now() - if before.Add(time.Minute*time.Duration(minutes)).Unix() > now.Unix() { - return true - } - } - - return false -} - -const TimeLimitCodeLength = 12 + 6 + 40 - -// create a time limit code -// code format: 12 length date time string + 6 minutes string + 40 sha1 encoded string -func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string { - format := "200601021504" - - var start, end time.Time - var startStr, endStr string - - if startInf == nil { - // Use now time create code - start = time.Now() - startStr = start.Format(format) - } else { - // use start string create code - startStr = startInf.(string) - start, _ = time.ParseInLocation(format, startStr, time.Local) - startStr = start.Format(format) - } - - end = start.Add(time.Minute * time.Duration(minutes)) - endStr = end.Format(format) - - // create sha1 encode string - sh := sha1.New() - sh.Write([]byte(data + setting.SecretKey + startStr + endStr + com.ToStr(minutes))) - encoded := hex.EncodeToString(sh.Sum(nil)) - - code := fmt.Sprintf("%s%06d%s", startStr, minutes, encoded) - return code -} - -// HashEmail hashes email address to MD5 string. -// https://en.gravatar.com/site/implement/hash/ -func HashEmail(email string) string { - email = strings.ToLower(strings.TrimSpace(email)) - h := md5.New() - h.Write([]byte(email)) - return hex.EncodeToString(h.Sum(nil)) -} - -// 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) (url string) { - if setting.EnableFederatedAvatar && setting.LibravatarService != nil { - var err error - url, err = setting.LibravatarService.FromEmail(email) - if err != nil { - log.Error(1, "LibravatarService.FromEmail: %v", err) - } - } - if len(url) == 0 && !setting.DisableGravatar { - url = setting.GravatarSource + HashEmail(email) - } - if len(url) == 0 { - url = setting.AppSubUrl + "/img/avatar_default.png" - } - return url -} - -// Seconds-based time units -const ( - Minute = 60 - Hour = 60 * Minute - Day = 24 * Hour - Week = 7 * Day - Month = 30 * Day - Year = 12 * Month -) - -func computeTimeDiff(diff int64) (int64, string) { - diffStr := "" - switch { - case diff <= 0: - diff = 0 - diffStr = "now" - case diff < 2: - diff = 0 - diffStr = "1 second" - case diff < 1*Minute: - diffStr = fmt.Sprintf("%d seconds", diff) - diff = 0 - - case diff < 2*Minute: - diff -= 1 * Minute - diffStr = "1 minute" - case diff < 1*Hour: - diffStr = fmt.Sprintf("%d minutes", diff/Minute) - diff -= diff / Minute * Minute - - case diff < 2*Hour: - diff -= 1 * Hour - diffStr = "1 hour" - case diff < 1*Day: - diffStr = fmt.Sprintf("%d hours", diff/Hour) - diff -= diff / Hour * Hour - - case diff < 2*Day: - diff -= 1 * Day - diffStr = "1 day" - case diff < 1*Week: - diffStr = fmt.Sprintf("%d days", diff/Day) - diff -= diff / Day * Day - - case diff < 2*Week: - diff -= 1 * Week - diffStr = "1 week" - case diff < 1*Month: - diffStr = fmt.Sprintf("%d weeks", diff/Week) - diff -= diff / Week * Week - - case diff < 2*Month: - diff -= 1 * Month - diffStr = "1 month" - case diff < 1*Year: - diffStr = fmt.Sprintf("%d months", diff/Month) - diff -= diff / Month * Month - - case diff < 2*Year: - diff -= 1 * Year - diffStr = "1 year" - default: - diffStr = fmt.Sprintf("%d years", diff/Year) - diff = 0 - } - return diff, diffStr -} - -// TimeSincePro calculates the time interval and generate full user-friendly string. -func TimeSincePro(then time.Time) string { - now := time.Now() - diff := now.Unix() - then.Unix() - - if then.After(now) { - return "future" - } - - var timeStr, diffStr string - for { - if diff == 0 { - break - } - - diff, diffStr = computeTimeDiff(diff) - timeStr += ", " + diffStr - } - return strings.TrimPrefix(timeStr, ", ") -} - -func timeSince(then time.Time, lang string) string { - now := time.Now() - - lbl := i18n.Tr(lang, "tool.ago") - diff := now.Unix() - then.Unix() - if then.After(now) { - lbl = i18n.Tr(lang, "tool.from_now") - diff = then.Unix() - now.Unix() - } - - switch { - case diff <= 0: - return i18n.Tr(lang, "tool.now") - case diff <= 2: - 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) - } -} - -func RawTimeSince(t time.Time, lang string) string { - return timeSince(t, lang) -} - -// TimeSince calculates the time interval and generate user-friendly string. -func TimeSince(t time.Time, lang string) template.HTML { - return template.HTML(fmt.Sprintf(`%s`, t.Format(setting.TimeFormat), timeSince(t, lang))) -} - -const ( - Byte = 1 - KByte = Byte * 1024 - MByte = KByte * 1024 - GByte = MByte * 1024 - TByte = GByte * 1024 - PByte = TByte * 1024 - EByte = PByte * 1024 -) - -var bytesSizeTable = map[string]uint64{ - "b": Byte, - "kb": KByte, - "mb": MByte, - "gb": GByte, - "tb": TByte, - "pb": PByte, - "eb": EByte, -} - -func logn(n, b float64) float64 { - return math.Log(n) / math.Log(b) -} - -func humanateBytes(s uint64, base float64, sizes []string) string { - if s < 10 { - return fmt.Sprintf("%dB", s) - } - e := math.Floor(logn(float64(s), base)) - suffix := sizes[int(e)] - val := float64(s) / math.Pow(base, math.Floor(e)) - f := "%.0f" - if val < 10 { - f = "%.1f" - } - - return fmt.Sprintf(f+"%s", val, suffix) -} - -// FileSize calculates the file size and generate user-friendly string. -func FileSize(s int64) string { - sizes := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB"} - return humanateBytes(uint64(s), 1024, sizes) -} - -// Subtract deals with subtraction of all types of number. -func Subtract(left interface{}, right interface{}) interface{} { - var rleft, rright int64 - var fleft, fright float64 - var isInt bool = true - switch left.(type) { - case int: - rleft = int64(left.(int)) - case int8: - rleft = int64(left.(int8)) - case int16: - rleft = int64(left.(int16)) - case int32: - rleft = int64(left.(int32)) - case int64: - rleft = left.(int64) - case float32: - fleft = float64(left.(float32)) - isInt = false - case float64: - fleft = left.(float64) - isInt = false - } - - switch right.(type) { - case int: - rright = int64(right.(int)) - case int8: - rright = int64(right.(int8)) - case int16: - rright = int64(right.(int16)) - case int32: - rright = int64(right.(int32)) - case int64: - rright = right.(int64) - case float32: - fright = float64(left.(float32)) - isInt = false - case float64: - fleft = left.(float64) - isInt = false - } - - if isInt { - return rleft - rright - } else { - return fleft + float64(rleft) - (fright + float64(rright)) - } -} - -// EllipsisString returns a truncated short string, -// it appends '...' in the end of the length of string is too large. -func EllipsisString(str string, length int) string { - if len(str) < length { - return str - } - return str[:length-3] + "..." -} - -// TruncateString returns a truncated string with given limit, -// it returns input string if length is not reached limit. -func TruncateString(str string, limit int) string { - if len(str) < limit { - return str - } - return str[:limit] -} - -// StringsToInt64s converts a slice of string to a slice of int64. -func StringsToInt64s(strs []string) []int64 { - ints := make([]int64, len(strs)) - for i := range strs { - ints[i] = com.StrTo(strs[i]).MustInt64() - } - return ints -} - -// Int64sToStrings converts a slice of int64 to a slice of string. -func Int64sToStrings(ints []int64) []string { - strs := make([]string, len(ints)) - for i := range ints { - strs[i] = com.ToStr(ints[i]) - } - return strs -} - -// Int64sToMap converts a slice of int64 to a int64 map. -func Int64sToMap(ints []int64) map[int64]bool { - m := make(map[int64]bool) - for _, i := range ints { - m[i] = true - } - return m -} - -// IsLetter reports whether the rune is a letter (category L). -// https://github.com/golang/go/blob/master/src/go/scanner/scanner.go#L257 -func IsLetter(ch rune) bool { - return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) -} - -// IsTextFile returns true if file content format is plain text or empty. -func IsTextFile(data []byte) bool { - if len(data) == 0 { - return true - } - return strings.Index(http.DetectContentType(data), "text/") != -1 -} - -func IsImageFile(data []byte) bool { - return strings.Index(http.DetectContentType(data), "image/") != -1 -} - -func IsPDFFile(data []byte) bool { - return strings.Index(http.DetectContentType(data), "application/pdf") != -1 -} diff --git a/modules/bindata/bindata.go b/modules/bindata/bindata.go deleted file mode 100644 index 431c9acbd69..00000000000 --- a/modules/bindata/bindata.go +++ /dev/null @@ -1,5552 +0,0 @@ -// Code generated by go-bindata. -// sources: -// conf/app.ini -// conf/gitignore/Actionscript -// conf/gitignore/Ada -// conf/gitignore/Agda -// conf/gitignore/Android -// conf/gitignore/Anjuta -// conf/gitignore/AppEngine -// conf/gitignore/AppceleratorTitanium -// conf/gitignore/ArchLinuxPackages -// conf/gitignore/Archives -// conf/gitignore/Autotools -// conf/gitignore/BricxCC -// conf/gitignore/C -// conf/gitignore/C Sharp -// conf/gitignore/C++ -// conf/gitignore/CFWheels -// conf/gitignore/CMake -// conf/gitignore/CUDA -// conf/gitignore/CVS -// conf/gitignore/CakePHP -// conf/gitignore/ChefCookbook -// conf/gitignore/Cloud9 -// conf/gitignore/CodeIgniter -// conf/gitignore/CodeKit -// conf/gitignore/CommonLisp -// conf/gitignore/Composer -// conf/gitignore/Concrete5 -// conf/gitignore/Coq -// conf/gitignore/CraftCMS -// conf/gitignore/DM -// conf/gitignore/Dart -// conf/gitignore/DartEditor -// conf/gitignore/Delphi -// conf/gitignore/Dreamweaver -// conf/gitignore/Drupal -// conf/gitignore/EPiServer -// conf/gitignore/Eagle -// conf/gitignore/Eclipse -// conf/gitignore/EiffelStudio -// conf/gitignore/Elisp -// conf/gitignore/Elixir -// conf/gitignore/Emacs -// conf/gitignore/Ensime -// conf/gitignore/Erlang -// conf/gitignore/Espresso -// conf/gitignore/ExpressionEngine -// conf/gitignore/ExtJs -// conf/gitignore/Fancy -// conf/gitignore/Finale -// conf/gitignore/FlexBuilder -// conf/gitignore/ForceDotCom -// conf/gitignore/FuelPHP -// conf/gitignore/GWT -// conf/gitignore/Gcov -// conf/gitignore/GitBook -// conf/gitignore/Go -// conf/gitignore/Gradle -// conf/gitignore/Grails -// conf/gitignore/Haskell -// conf/gitignore/IGORPro -// conf/gitignore/IPythonNotebook -// conf/gitignore/Idris -// conf/gitignore/JDeveloper -// conf/gitignore/Java -// conf/gitignore/Jboss -// conf/gitignore/Jekyll -// conf/gitignore/JetBrains -// conf/gitignore/Joomla -// conf/gitignore/KDevelop4 -// conf/gitignore/Kate -// conf/gitignore/KiCAD -// conf/gitignore/Kohana -// conf/gitignore/LabVIEW -// conf/gitignore/Laravel -// conf/gitignore/Lazarus -// conf/gitignore/Leiningen -// conf/gitignore/LemonStand -// conf/gitignore/LibreOffice -// conf/gitignore/Lilypond -// conf/gitignore/Linux -// conf/gitignore/Lithium -// conf/gitignore/Lua -// conf/gitignore/LyX -// conf/gitignore/Magento -// conf/gitignore/Matlab -// conf/gitignore/Maven -// conf/gitignore/Mercurial -// conf/gitignore/Mercury -// conf/gitignore/MetaProgrammingSystem -// conf/gitignore/MicrosoftOffice -// conf/gitignore/ModelSim -// conf/gitignore/Momentics -// conf/gitignore/MonoDevelop -// conf/gitignore/Nanoc -// conf/gitignore/NetBeans -// conf/gitignore/Nim -// conf/gitignore/Ninja -// conf/gitignore/Node -// conf/gitignore/NotepadPP -// conf/gitignore/OCaml -// conf/gitignore/OSX -// conf/gitignore/Objective-C -// conf/gitignore/Opa -// conf/gitignore/OpenCart -// conf/gitignore/OracleForms -// conf/gitignore/Packer -// conf/gitignore/Perl -// conf/gitignore/Phalcon -// conf/gitignore/PlayFramework -// conf/gitignore/Plone -// conf/gitignore/Prestashop -// conf/gitignore/Processing -// conf/gitignore/Python -// conf/gitignore/Qooxdoo -// conf/gitignore/Qt -// conf/gitignore/R -// conf/gitignore/ROS -// conf/gitignore/Rails -// conf/gitignore/Redcar -// conf/gitignore/Redis -// conf/gitignore/RhodesRhomobile -// conf/gitignore/Ruby -// conf/gitignore/Rust -// conf/gitignore/SBT -// conf/gitignore/SCons -// conf/gitignore/SVN -// conf/gitignore/Sass -// conf/gitignore/Scala -// conf/gitignore/Scrivener -// conf/gitignore/Sdcc -// conf/gitignore/SeamGen -// conf/gitignore/SketchUp -// conf/gitignore/SlickEdit -// conf/gitignore/Stella -// conf/gitignore/SublimeText -// conf/gitignore/SugarCRM -// conf/gitignore/Swift -// conf/gitignore/Symfony -// conf/gitignore/SymphonyCMS -// conf/gitignore/SynopsysVCS -// conf/gitignore/Tags -// conf/gitignore/TeX -// conf/gitignore/TextMate -// conf/gitignore/Textpattern -// conf/gitignore/TortoiseGit -// conf/gitignore/TurboGears2 -// conf/gitignore/Typo3 -// conf/gitignore/Umbraco -// conf/gitignore/Unity -// conf/gitignore/VVVV -// conf/gitignore/Vagrant -// conf/gitignore/Vim -// conf/gitignore/VirtualEnv -// conf/gitignore/VisualStudio -// conf/gitignore/VisualStudioCode -// conf/gitignore/Waf -// conf/gitignore/WebMethods -// conf/gitignore/Windows -// conf/gitignore/WordPress -// conf/gitignore/Xcode -// conf/gitignore/XilinxISE -// conf/gitignore/Xojo -// conf/gitignore/Yeoman -// conf/gitignore/Yii -// conf/gitignore/ZendFramework -// conf/gitignore/Zephir -// conf/label/Default -// conf/license/Abstyles License -// conf/license/Academic Free License v1.1 -// conf/license/Academic Free License v1.2 -// conf/license/Academic Free License v2.0 -// conf/license/Academic Free License v2.1 -// conf/license/Academic Free License v3.0 -// conf/license/Affero General Public License v1.0 -// conf/license/Apache License 1.0 -// conf/license/Apache License 1.1 -// conf/license/Apache License 2.0 -// conf/license/Artistic License 1.0 -// conf/license/Artistic License 2.0 -// conf/license/BSD 2-clause License -// conf/license/BSD 3-clause License -// conf/license/BSD 4-clause License -// conf/license/Creative Commons CC0 1.0 Universal -// conf/license/Eclipse Public License 1.0 -// conf/license/Educational Community License v1.0 -// conf/license/Educational Community License v2.0 -// conf/license/GNU Affero General Public License v3.0 -// conf/license/GNU Free Documentation License v1.1 -// conf/license/GNU Free Documentation License v1.2 -// conf/license/GNU Free Documentation License v1.3 -// conf/license/GNU General Public License v1.0 -// conf/license/GNU General Public License v2.0 -// conf/license/GNU General Public License v3.0 -// conf/license/GNU Lesser General Public License v2.1 -// conf/license/GNU Lesser General Public License v3.0 -// conf/license/GNU Library General Public License v2.0 -// conf/license/ISC license -// conf/license/MIT License -// conf/license/Mozilla Public License 1.0 -// conf/license/Mozilla Public License 1.1 -// conf/license/Mozilla Public License 2.0 -// conf/locale/locale_bg-BG.ini -// conf/locale/locale_cs-CZ.ini -// conf/locale/locale_de-DE.ini -// conf/locale/locale_en-US.ini -// conf/locale/locale_es-ES.ini -// conf/locale/locale_fi-FI.ini -// conf/locale/locale_fr-FR.ini -// conf/locale/locale_it-IT.ini -// conf/locale/locale_ja-JP.ini -// conf/locale/locale_lv-LV.ini -// conf/locale/locale_nl-NL.ini -// conf/locale/locale_pl-PL.ini -// conf/locale/locale_pt-BR.ini -// conf/locale/locale_ru-RU.ini -// conf/locale/locale_sr-SP.ini -// conf/locale/locale_sv-SE.ini -// conf/locale/locale_tr-TR.ini -// conf/locale/locale_zh-CN.ini -// conf/locale/locale_zh-HK.ini -// conf/locale/locale_zh-TW.ini -// conf/readme/Default -// DO NOT EDIT! - -package bindata - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "strings" - "os" - "time" - "io/ioutil" - "path/filepath" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _confAppIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x7b\x5b\x6f\x23\xc9\x75\xff\x7b\x7f\x8a\x5a\xed\x7f\xff\x33\x13\x34\x49\x5d\x46\x5a\xed\xd8\x72\x96\x22\x9b\x14\x3d\xbc\xb9\x9b\x9a\xd9\xd9\x81\xd0\x6a\xb1\x8b\x64\xaf\x9a\xdd\xdc\xae\xa6\x34\x5a\x04\x81\x8d\x3c\xe4\x02\x04\x79\x48\x90\x20\x40\x10\xc4\x0f\x89\x01\xe7\x66\x23\x2f\x76\xe2\x24\x0f\x9b\xbc\xcf\x7e\x07\x67\x1d\x3f\xf9\x2b\xe4\x77\x4e\x55\x93\x4d\x8d\x46\xd9\x0d\x12\xd8\x2b\xf6\xa5\xea\x54\x9d\xfb\xef\x9c\xea\x79\x57\xf4\x9d\x67\x8e\x2b\xf8\x4f\x6f\xd0\xec\xb4\x5e\x88\xd1\x49\xc7\x13\xad\x4e\xd7\xb1\xde\x15\xc3\xae\x53\xf7\x1c\xd1\xab\x3f\x75\x44\xe3\xa4\xde\x6f\x3b\x9e\x18\xf4\x45\x63\xe0\xba\x8e\x37\x1c\xf4\x9b\x9d\x7e\x5b\x34\x4e\xbd\xd1\xa0\x87\x87\xfd\x56\xa7\xad\x67\x5a\xdf\x10\xf5\xc5\x42\x24\xc1\x5c\x8a\x7c\x16\xe4\x42\xcd\xd2\x6b\x25\xd2\x44\xc8\x2b\x99\xdd\x88\x45\x30\xc5\x8b\x28\x8f\xa5\x55\x1f\x0e\xfd\x7e\xbd\xe7\x88\x23\xd1\x4e\xa7\xea\x09\xfe\x8a\x76\x94\x0b\x4f\x66\x57\xd1\x58\x82\x52\x63\x16\x24\x18\x8e\x67\xd1\x44\xdc\xa4\x4b\x91\x2d\x13\x11\xa7\xe3\x20\x8e\x6f\x2c\xf7\xb4\xef\x9f\x7a\xd8\xfd\x91\x98\x46\x39\x46\x3b\x51\x3e\x93\x99\xd8\x0a\xe5\xd5\x96\x2d\xb6\x16\x59\x1a\x6e\x89\x14\x0f\x72\xa9\x72\x3c\x09\xe5\x24\x58\xc6\xa0\xa5\xf4\x18\xa6\x00\xd6\x69\x03\xb8\xb7\xac\x97\x99\x5c\xa4\x2a\xca\xd3\xec\xe6\xcc\x72\x07\x83\x91\x38\xb2\xbc\x86\xdb\x19\x8e\xfc\xd1\x8b\x21\x0d\xbb\x08\xd4\x0c\x2b\x35\x0d\xa5\x7a\xdf\xeb\x88\xf1\x2c\xc8\x94\xcc\x2d\xba\xf1\x21\x2a\xd7\x73\x68\xe2\x37\x44\x2b\xcd\xc6\xd2\xb0\x9d\xc8\x6b\xb1\xa6\x2e\xf2\x54\x5c\x48\xb1\xc8\xa2\xab\x20\x97\x56\x6b\xe0\x36\x1c\x7f\xe8\x76\x9e\xd5\x47\xb4\xca\x24\x88\x15\xb1\xdf\x8e\xd3\x8b\x20\x16\xf3\xe0\x55\x34\x5f\xce\xc5\x38\x93\x41\x1e\x41\x92\x71\x34\x87\x48\xd2\x49\x99\xe2\x02\x9c\x2f\x95\xcc\x6c\x51\xd9\x11\x73\x19\x24\x4a\x24\xa9\x1e\x69\xf5\xea\x1f\xf9\x0d\xd7\xa9\x8f\x3a\x83\xbe\xdf\xed\xf4\x3a\xd8\x1f\x86\x61\x85\x5e\x94\x65\x90\x90\xba\x49\xc6\xe2\xd3\xa5\x5c\x4a\x11\xcb\x64\x9a\xcf\x6c\x11\x25\xb4\x9c\x92\x24\xf9\xf9\x7a\x54\x94\x4c\x85\xca\x83\x2c\x57\x82\x74\x83\x5b\xab\xd7\x71\xdd\x81\xeb\x7f\xe7\xd4\x39\x75\xfc\xae\xd3\x6f\x8f\x4e\x40\x7e\x67\x7b\x7b\x1b\x0b\x0c\x83\x7c\x3c\x13\xa4\x80\x7b\xe8\x2f\x96\x71\x0c\x5e\x30\x00\xc3\x16\xab\x19\x77\xac\x35\x3c\xed\x76\x7d\xd7\xc1\x5a\xde\xe8\x6d\x2b\x66\x72\x22\xb3\x4c\x86\xa2\x0b\x23\x4a\x94\x54\x24\xed\x45\x1c\x40\x17\x30\x47\x98\x08\xee\x17\x24\x3d\xba\xec\x46\x8a\x4c\xa7\x4f\xe6\x3a\x5f\x62\xf9\x39\x2f\x3f\x89\x62\xa9\x6d\x38\x4a\xc4\x38\x4d\x26\xb5\x58\x13\x23\x7b\x1a\x63\x5c\x3a\xaf\x95\x1f\x5b\x43\xd7\x69\x39\x70\x8d\x26\xe4\xdb\x70\xfa\x1e\xbc\xe5\x08\x8e\x10\x8c\x79\x0d\x3d\x75\xb7\xba\x6d\x93\xec\xcd\xfd\x86\xbd\x55\x65\x48\xbf\x67\xd8\x0b\x6d\x89\xb6\xc7\x7b\x90\xaf\x72\x8c\x85\xd2\xd5\xca\x9b\x96\x71\x08\x79\x5c\x41\x94\x51\x22\xc5\x75\x16\x2c\x14\xed\x92\xb8\x69\xa4\xa1\x34\x2a\xd5\xf4\x40\xce\x93\x8b\x20\x83\x95\x95\x49\x5d\xc3\x53\x44\x00\xc6\xe6\xf3\xa0\x2a\x46\xe9\x9a\x14\xaf\x8a\x01\xb5\x74\x3d\xde\x16\x9f\x90\x64\x16\xcb\xbc\x98\x63\x75\x3b\x7d\xc7\x7f\xee\xd6\x87\xbe\xf3\xd1\x08\xec\xc2\xb0\x88\xe1\x6a\xfe\x2a\xb7\xab\xf3\x10\xff\x05\xd9\x65\x98\x5e\x27\x74\xa7\x7f\x2e\x43\x1b\xbb\x79\x16\xc4\x51\xa8\x59\x9b\x63\xb3\x86\x2b\x66\x27\x80\x3f\xc8\xab\x08\x8e\x52\x1f\x76\x44\xa0\x54\x3a\x8e\xb0\xef\x50\xef\x16\xec\xcd\x6d\xa1\x96\x50\x4e\xa0\x44\xb0\x88\x6a\x57\x3b\xb5\x62\x95\x32\x9b\x57\x41\x0c\x3b\x12\x17\x37\x7a\xab\xaa\x4a\x16\xc1\x64\xf3\xe0\x82\x04\x45\x92\xe1\xc5\xc5\x75\x9a\x3c\xd0\x01\x8a\xac\x90\x04\xb8\x29\x73\x11\xa6\x52\xd1\x10\x36\x0a\xd2\xf1\xb3\x8e\xf3\xbc\x7e\xdc\x75\x7c\x8a\x75\x1c\x3b\x88\xed\xd5\x36\x36\x34\xba\x5c\xc4\x69\x10\x92\x46\x9f\xcf\x24\x47\xa6\x92\xbb\xf2\x42\x7a\x04\xb8\xc9\xb0\x68\x12\x5c\xc4\x32\xac\x16\xb1\x85\xad\xf6\x3c\xcf\x96\xf2\xdc\x72\xfa\xb4\x66\x13\x2b\xd1\xbd\xf6\x2a\xd8\x28\xb4\x6c\x28\xdc\x9a\x15\x06\x79\x50\xcb\xe7\x8b\x9a\x79\x7d\x2e\x1e\xe2\x4e\x4c\x25\xde\x87\x32\x96\x24\x54\x70\x37\x45\xd0\xc5\x9e\xd8\xc5\x1e\x59\x23\xa7\x37\xf4\x87\x75\x76\xa5\xdb\x04\xb0\xe4\x20\x61\xdb\x9f\xa7\xd8\x2b\xc2\x6f\x7a\x0d\x1a\xf9\xcd\x42\x2a\x5b\xc8\xea\xb4\x2a\xa2\x39\x02\x7b\xed\x93\x85\x9c\xfe\x86\xbe\x5c\x24\x78\xda\x4f\xf3\x19\xb9\xb1\x0e\x48\x41\x62\x18\xa7\x89\x56\xbd\xdb\x1d\x3c\x87\xc3\x50\x68\xf5\x38\x60\xf6\x82\x57\x42\x45\x9f\x49\xb2\x7e\x19\x14\x6e\x08\x95\xf5\x8e\x37\x39\xdc\xeb\x1d\x5b\x5a\x03\x88\x6c\x5e\xe7\x63\x0a\x9a\x7b\x86\x40\xb2\x9c\x5f\x40\xd6\xc6\x81\x94\x0e\x8c\xcc\xc6\x26\x8d\x7d\x0e\x8b\x44\x85\x54\xb8\x0f\xdd\x2d\x23\x52\x56\x7f\x35\x7f\xa5\xae\xa8\xb0\x53\x52\x14\x99\x0b\x78\xc7\xae\xd2\x84\x6c\x05\xa4\xf1\x94\xd2\x9a\xe5\x7c\x34\xec\x0e\x5c\x44\xf2\x7a\x1b\xd9\xd1\xef\x9f\xf6\x40\x79\x77\x7b\x83\x68\xa4\xd4\xf2\xed\xe4\x98\x4c\xc7\xf3\x4e\x6f\x11\xd9\xd9\x24\xb2\xca\x08\xb0\xf0\x08\xec\x6c\x12\x09\xc6\x79\x74\x15\xe5\x90\xb5\x94\xa1\xd5\x72\x20\x63\xce\x00\x83\x1e\xa2\x8f\x21\xb8\xaf\x7d\x71\xc9\xb2\x3e\x27\xe7\x92\x95\x71\x0a\x56\xce\xa1\xab\x3c\x80\xaf\x4c\x6d\xca\x27\x21\x39\x52\x3d\x09\xb3\x14\x6e\xfb\x2d\xcc\xab\xd2\x4e\xea\x09\xd6\xba\x62\x57\xe6\x49\x88\x1f\x97\x52\x6c\x25\x58\x5d\x67\xdc\x30\x52\x64\xce\x5b\xf0\x5d\x84\x76\x76\x6f\x72\xaf\x22\x03\xab\xfc\x26\x26\x3b\xee\x91\xe8\xa2\x64\x92\x3e\x11\xb3\x3c\x5f\xa8\x27\xb5\x1a\x12\xb1\x8c\x53\x28\x4d\x55\xa7\x69\x3a\x8d\x65\x15\x4c\xd6\xae\xe5\x05\x6c\x11\x66\x29\x55\x6d\x77\x7b\xe7\x71\x6d\x67\xa7\xe6\x2d\x17\x8b\x34\xcb\x2b\xf0\x83\x4a\x89\x81\x4a\x94\x54\x1a\xb3\x2c\xc5\xfd\xde\x07\xfc\xd2\x6c\xdf\x1a\x9d\x38\x3d\x07\x62\x80\x8e\xfc\x9e\x33\xaa\xfb\xa3\x7a\x1b\xa2\x38\x7f\x77\x32\xd9\xdf\x7b\xbc\x77\x7e\xcb\x02\xb5\xf9\xe8\x4c\x0d\x7e\x90\x41\x6e\x20\x8e\x87\x61\x61\x43\x80\x11\x87\xbd\xe8\xf8\x11\xdb\x51\xb3\xe3\x0d\xbb\xf5\x17\x3a\x2e\x18\x8b\x3c\xdc\x3b\x3c\x3c\xd8\x3e\x64\xcb\xaa\x06\xe1\x3c\x4a\x36\xed\x8b\xd2\xf5\xfd\x96\x40\xf0\x66\xd3\x10\xf6\xb7\xdf\x34\xd1\x7b\x49\xb8\xce\x70\x70\x2f\x89\x24\xcd\x91\x8f\xee\x27\xd2\x1f\x8c\x3a\x8d\xdb\x76\xbd\xbf\x41\x26\xcd\xa6\x41\x12\x7d\xa6\x01\xca\x7d\xb4\x06\x6e\xfb\x8d\xfd\xb0\x84\x48\x1c\x77\x38\xe0\xd7\xe4\x6e\x87\x3c\xb9\x08\xc8\x44\xce\xe1\xc0\x0a\x1b\xcc\x42\x9d\xe6\x2e\x80\x3b\x2e\xd7\x41\xde\x44\x57\x1f\xc0\x8d\x92\x37\xf2\xda\x31\xa0\xd2\xd3\x12\x0c\x2b\x12\xb2\xce\xfb\xe2\xd4\xed\x56\xbc\x31\x19\x5c\x69\x6f\x45\x48\x44\x6e\xc2\x22\x97\xc8\xa0\x33\x99\x80\x81\x24\x94\x19\x05\xc0\xde\x3a\x53\x51\xdc\x96\xaf\x82\xf9\x02\xbb\x02\x70\xb5\x11\x2d\x13\xc0\x47\x8d\xa5\x7d\x50\xf7\xbd\x06\x59\xaa\x8e\x89\x5f\x05\x0d\xc0\x40\xf5\x4a\x32\xac\x51\x76\xd3\xfb\xe8\xdd\x91\x1c\xef\xc3\x00\x9a\xc4\x5d\x00\x80\xa8\xad\x12\xfa\x9b\x60\x80\x6d\x7e\x13\x07\xbc\x0d\x02\x40\x37\xd0\xf2\x15\x29\x7a\xe8\x0e\x46\x03\x38\x23\x86\x93\xef\x5b\xcd\x41\xaf\xde\xe9\xe3\x8e\xf1\xfd\x2c\x05\x2e\x23\x08\x4e\x02\xc1\xc3\xf7\x1e\x16\xe3\x1f\x51\x94\x78\xef\xa1\x1e\x8e\x9b\xf7\x1e\x9e\x8c\x46\xc8\x5c\x03\x77\xf4\x48\xd5\x2c\xbe\xa9\x37\x9b\x54\x16\x6c\x57\xf9\x7f\xd6\x6a\x00\xa5\x09\x83\x12\x65\x36\x47\x28\x26\xe6\x38\x8f\x26\x11\x1c\x3f\x1d\x5f\x42\x11\xa7\xfd\x0e\x92\xca\xa0\xf1\xd4\x19\xf9\x43\xc7\xed\x21\x1c\x83\x2d\x4c\x3d\x38\x38\x20\x85\xd0\xf6\xc4\xc3\x66\xef\xe3\x47\x64\x0a\x3c\x9d\xca\x17\xa0\x89\xec\x92\x1c\xfa\x61\x01\x52\x3c\xef\x44\xe8\xa0\xf5\x08\x31\x19\x3e\xa6\xc8\x12\x10\xca\x84\xd2\x15\x4e\x15\xe4\x3a\x09\x72\x2a\x04\x3a\x0e\x08\xa9\x52\x8d\x13\xa6\xe4\x93\xa8\x18\x28\xc3\xa6\x54\x5e\x50\x0d\x54\x0e\x9f\x0c\x71\x68\x72\x3d\xce\xa1\x31\xaa\x05\x92\xf8\xc6\xd4\x48\x19\xaf\xab\xa5\x0c\x42\x80\x39\x91\x62\x82\x44\x41\x11\xa4\xc5\xd6\x48\x22\xfc\xb2\x6a\x75\x07\x8d\x3a\x30\xf5\x3d\xa2\x5e\x89\xf4\x4d\x69\xa3\x14\xd2\x91\x9e\x17\x9d\xa0\x3e\x59\xc2\x19\xd8\xf6\x69\xc9\xe0\x2a\x88\x62\x7a\x6d\x21\x3e\xb2\x97\xd1\xb0\xb5\x67\x15\xc0\x08\xae\x2f\x2e\x96\x51\x0c\xc8\x5f\xde\x7d\x4a\x0c\xe4\x55\xcb\x1b\xd5\xdd\x11\x4d\xf5\x11\x0f\x9f\x71\xc5\x57\x50\x68\xa6\xf3\x00\x93\x74\xb9\xc9\xa1\x1a\x19\x39\x55\x3a\x4c\x8c\x63\x0a\x14\xe0\xca\xa2\xb9\x2b\x03\x5b\x1b\x0f\x19\x02\x52\x48\x81\x19\xfe\x1b\x02\xc6\x82\x76\x77\x6f\x4d\xbb\x63\xe7\x31\xbc\x16\xbe\x03\xbd\xf0\xcc\x6e\xc7\x83\x77\x14\x04\xde\x7b\x58\x50\xe3\x1d\xb8\x69\xca\x55\xcf\x8c\xdc\x9c\x68\x84\x51\x26\xc7\x84\x12\x37\x4a\xd6\x07\xbf\x59\xab\x2a\x35\x7b\x60\x63\xbd\x9c\x0d\x45\xa7\xd5\x94\xa5\xf7\xa0\x36\x43\xc6\xab\x21\x9e\xe8\x51\x55\x5e\x97\xb5\xaa\x31\x1d\xab\xca\xd0\x65\xb3\xa2\x62\x12\xd3\xe5\x1c\x49\x34\x30\x88\xd4\x84\x2d\x2e\xd7\x16\xcb\x0b\x14\x37\x97\xe2\x52\xde\x60\x05\xae\xc5\xd4\xac\x82\xbb\xa9\x4c\x08\xc9\x97\xb6\xa6\x6e\xc0\xed\xbc\x44\x6b\xc5\x81\xde\xc6\x53\xe7\x85\x3f\xa2\x8a\x6d\xb5\x15\x06\xb0\xd8\x45\x89\xe4\x06\xaf\xeb\xe7\x0f\x80\x1a\x11\xb8\x25\x05\x3b\x09\x2c\x31\x89\x70\x9b\x42\x02\xd7\xb3\x08\x6e\x46\xfa\x21\x6e\x10\x7f\x57\x6b\xb5\x49\xd4\x1a\xc8\xae\xe9\xb0\xab\x85\xd1\x98\x98\xbe\x36\x66\xc7\xde\x25\xc1\x23\x52\x33\xe3\x29\xe2\x95\xd3\x3f\x07\xc7\x71\x8a\x32\x52\x2d\x52\x4c\x03\xf7\x8c\x59\x7b\x9d\x7e\xa7\x77\xda\x63\x8e\x28\xcb\xa3\xde\x77\x1a\xe5\x5c\x51\xb8\x43\xa3\xd9\xa7\xca\x9f\x70\x52\xd1\x89\xa0\x92\xc3\x1a\xb4\x5a\x9c\x63\x4c\xdb\x41\x4f\x2b\x9c\xc3\x1d\x9c\x8e\x90\xf0\xbb\x83\x76\xb9\x09\x20\x13\xc9\xb1\x1b\x32\x06\x42\xc2\x93\xff\x27\xaa\x35\xc6\xee\x63\x09\x23\xac\x8c\x83\x23\x2a\x0b\x44\x25\x5c\x66\x9c\x7e\x8f\x0e\xdf\x3f\xd8\x9e\x6d\xcf\xb7\x95\xa8\x50\x1c\x3d\x9a\xdf\xd0\x4f\xd5\x24\x1d\x02\x54\xd6\x37\x08\xd2\x23\xd8\x03\x27\x21\x8e\x57\x17\x93\x57\x45\x86\x21\x4c\x05\xeb\xe7\x37\x14\x32\x9e\x43\xe0\xd4\xc1\xa1\xc5\xa2\x89\x16\x20\xf2\x20\xdc\xfc\x61\x98\x82\x0a\xf9\x39\x62\x20\x8a\x0b\x92\xa7\x9e\xcf\x13\x4d\x77\x83\x84\xfa\x48\x6f\x1b\xb0\x2e\x51\x2a\x16\x8b\xcb\xb1\xda\xd9\x15\x15\xf2\x30\x50\xe5\xd5\x2b\xa4\x53\x7d\x07\x53\xaa\x24\x29\xa6\xa9\xaf\x36\x0b\x23\x8b\x49\xf4\x42\xd1\x05\x4a\x4b\xab\xe1\x20\x6a\x50\x72\x82\x34\x4d\xcd\xce\x28\xb3\x56\x2c\x63\x91\x1a\xef\x1a\x60\x28\x62\xf9\xd3\x05\xd5\x0f\x31\x81\x52\x6e\x19\xc0\xc4\x63\x62\x8a\x8c\x12\x85\x13\xa0\x93\x96\x1b\xf9\xef\xa6\x53\xb0\x08\xc8\xcc\x61\x6d\x10\x16\xa7\x08\x3c\x96\xaf\xe4\x78\x09\x01\x53\x50\x03\xa8\xba\xed\xa2\x66\xfe\xa2\x28\xf0\xa8\x97\x46\xd5\x18\x37\xcb\x9a\x75\x80\xd6\x52\x89\xa6\x7b\x6d\x31\xe9\x84\xdb\x42\xbc\xcb\xf6\xc7\x9d\x21\xea\x64\xc6\xc6\x05\xb6\xe1\x67\x25\x40\x13\x68\x93\xe6\x5e\xdc\x84\xa3\x6c\x52\x89\xd3\xe9\x14\x7a\x67\x50\x6a\xc3\xa1\x12\x8a\x85\x5b\x14\x55\x34\xa4\x37\x95\xce\x96\xd5\xad\x73\xf3\x8f\x60\x17\x09\x8e\x46\x58\x7a\xeb\x84\xae\x56\x40\x28\x9e\xa2\x70\xca\x67\x73\xc5\xb2\x82\x34\xa2\x6c\xc3\xcf\x74\x23\x48\x3c\xa4\xe8\x55\xd9\x21\xdb\x31\x45\x03\xec\x91\x7c\xed\x11\xa0\x82\x9a\x55\xcd\x14\x1f\x53\x7c\x72\x4d\x75\x66\x39\xcd\xdd\xfd\xfd\x9d\x0f\x18\x83\x1e\x58\x4e\xa3\xe9\xd5\x85\x30\x77\x2e\x5f\xf3\xdd\xf6\xe3\x43\xab\xb9\xba\xdd\xd9\xde\x7d\x0c\xf4\x41\x62\xbb\x40\xaa\x3d\x2b\xf5\x0b\xe7\x37\xea\xd3\x98\x3b\x86\xf0\x92\x29\x5c\x5e\x33\x8c\x87\x80\x52\x7b\x78\x11\xe5\x0f\x94\x4e\xad\xe3\x59\x4a\x9d\xc9\xe6\x71\xd1\x10\xe4\xb9\xd6\xc9\xc0\xa3\xc0\xbe\xb3\xfb\x3e\x23\x8e\x9d\x27\x7b\x7b\xdb\x07\x96\xe9\x6d\x92\xab\x5a\xa6\x51\x99\x21\xd6\x5b\xc3\xba\xe7\x3d\x6f\x16\x2d\xc2\x8d\x65\x91\xc6\x51\x4f\x17\x7d\x4c\x53\x44\x61\x67\xd4\x1c\x43\x4c\xd5\x1b\x43\x82\x89\x26\x37\x95\xc9\x32\x8e\xb7\x10\xf3\xba\xab\x1e\xa6\x1e\x5f\x90\x2d\xf6\xcf\xf2\xdf\xca\xa3\xf0\x62\x8b\x4b\x3a\x11\x5c\xa8\x34\x86\x0d\xae\xcc\x33\xe1\x74\xc2\x7d\x00\x02\x07\x06\x9d\x58\xe5\x66\x00\x31\x51\x0d\x2f\x20\x41\x53\xc8\x10\x90\x1b\x2f\xa1\xe1\x9b\x33\xab\xd3\x87\x31\x77\xbb\x08\x5c\x1b\xb1\xf0\x9d\x77\x74\xe3\x58\xf7\x95\x47\x03\xf1\xd4\x71\x86\xe2\xc5\xe0\xd4\x15\x2c\x0e\x32\x67\xe1\xd5\x5b\xce\x3b\xef\x58\x9e\xd3\x70\x81\xb7\xe0\x90\x20\xf0\xce\xbb\x1f\xb6\x9a\xce\x73\x17\xff\xff\xff\xbf\xf6\x90\xac\x7c\x99\xa7\x64\xa0\x11\x41\xea\xb9\xe4\xac\x1b\x06\x88\x0f\x08\x95\x9d\xbe\xef\x02\x2d\xf7\x8e\x11\x39\x9b\xf5\x17\x04\x3f\xdf\xb7\x1a\x83\xc1\xd3\x8e\xc3\xed\xe1\x92\x16\xfc\xe0\x5a\x2a\x32\x57\xf3\x7a\x35\xaf\x3c\x86\x1b\x93\x61\xa4\x05\xe9\x52\xf7\x56\x51\x2c\x4b\x5f\xdd\x88\x60\x09\xc5\x24\x79\xe1\x6f\x33\x19\x10\x60\x66\xec\x61\xca\x39\xbe\x41\x55\x02\x90\xe2\x51\x47\x77\xf0\xd1\x0b\xbf\x7e\x8a\xc2\xb3\x0f\x5f\xd7\xfd\x57\x63\x09\x1f\x55\x9e\x3b\xc7\xf4\xaa\x42\x0f\x0c\x2e\x86\xd4\xcf\xac\x7a\x63\xd4\x79\x46\x75\x6a\xd3\x01\x70\xc0\x15\x92\x0e\xf2\x02\x31\xb6\x73\xb8\x0d\xe2\x1e\x01\x53\xb6\xa1\xb7\x0e\x42\xe0\xe2\xdd\x14\x18\x32\x4d\x26\x51\x36\x17\xb2\x02\xb4\x14\xb3\xcb\x67\x72\x0a\x8c\xa2\x13\x06\x68\xb6\x09\xa1\xb8\xbe\x03\x5c\xd4\xf5\xb9\x9f\xef\xf6\x36\x60\x96\xd4\x20\x92\xdd\xdb\x4c\xc6\x02\x64\x5a\x6c\x10\x05\x9e\x00\xce\x4d\x97\x89\x06\xa4\xeb\xbc\xc6\xe4\x5d\xe6\xbf\x44\x94\xb7\xc8\x4d\x57\x15\x4d\x39\x53\x62\xab\xdc\xa9\x0b\x92\x1b\xee\x1b\x55\x2d\xea\xf5\x76\x5c\x2a\xa9\xdb\x7d\x68\x9a\xfa\x6f\x25\x0a\x3d\xe2\x86\x0a\xd8\x89\xd1\x49\x11\xf0\xa8\x60\x6d\xbd\xf0\x89\x9b\xf2\x70\xca\x5a\xa1\xcc\x31\x6b\xdd\x70\x00\x64\x9a\x2d\x2f\xb8\xcb\x00\xfd\x47\xb9\x62\x5b\xaf\xe9\x3e\x4d\x6d\xe7\x60\xbf\xa0\x79\x9f\x56\x57\x8b\xbc\x6d\xec\xe0\x6d\x42\x30\xe5\xe9\x38\x58\xe4\x40\xfa\x82\x9b\x2a\xda\xbc\xde\xd0\x92\xa1\xdd\xa8\x0f\x47\x70\xac\xa2\x1b\x68\xbd\x44\x45\x31\x4b\xd3\x4b\x0a\x69\x27\xf8\x15\x79\xa0\x2e\xef\xe9\xb6\x9b\xe1\x54\x3c\xa6\x77\xf5\xd8\xef\x6e\xab\x37\x65\x1c\x11\xb2\xcd\xa3\xb9\xa4\xa4\x0b\x6d\x21\x00\x00\x1b\x29\xab\xe9\x90\x05\xba\xfe\xa8\xd3\x73\x80\x60\x4c\x77\xa9\xce\x96\x12\x25\x1c\x26\x64\x09\x3e\x10\x2b\xde\xd3\xce\xd0\x1f\x75\x3d\x1f\xf3\xe8\xe4\x69\x2d\x8f\x75\xf5\x3f\x8b\x14\x83\x55\xea\x0f\x65\x73\x2d\x13\x6a\xdf\x52\x63\x90\x8b\xff\xdb\x1d\x32\xaa\xfb\x91\x8b\x51\x5b\xae\x1b\xa6\x05\xd9\xe3\xe5\x64\xc2\x89\x9c\x93\x0e\x15\xf3\x60\x37\x91\xb1\x8d\x5c\x24\x17\x54\x42\x21\xf0\x45\x9c\xb8\xcd\x51\x53\xc8\xcd\xe1\xcb\x04\x4c\x5c\x53\xad\xcd\x2f\x81\x31\x9d\x7e\xd3\x3f\x3e\x6d\xb5\x08\xa8\x39\x7d\x2d\xa0\xe2\x04\x61\xdd\x26\xc2\x46\xd9\xd5\xf4\x49\x97\x77\x7a\xfc\x6d\xa7\xa1\xb1\x7f\x71\xea\xc5\xd8\x9f\x0d\x58\xd7\x0c\x04\xf5\xe6\x6c\x99\x6a\x9e\x2f\xaa\x53\xba\x26\xab\x7c\xb2\x7f\xf8\x3e\xde\x7d\xe7\x3b\xe6\xc5\xa7\x9f\xf2\xd3\xc7\x07\xdc\x7f\x49\x73\x69\x17\xcd\x6b\x46\x5e\x28\xe2\x4d\x6d\xbf\x85\x21\x88\xf8\x5e\x6f\x34\xf4\x74\x1f\x0e\x09\x9d\x5a\x7a\x55\x78\x1e\xe9\x9d\xcb\x2a\x28\x81\x7a\xc1\x3c\x17\x2b\x91\x00\x80\xdd\x51\xd7\x53\x37\x20\xe4\xee\xa9\xdb\x6a\x88\x83\xc7\xdb\x1f\x54\x45\x47\x2f\x64\x8a\x1c\x03\x32\xd4\x9a\x10\x64\xc4\x0b\x05\xf1\x35\xa2\xf3\x6a\x3d\x93\x1f\x4b\xf0\xf8\xc4\xe9\x0e\x08\xd8\x69\xcb\xd6\x39\x88\x30\x2a\xc7\x52\xea\xa7\x84\x11\xe9\x0b\xc1\xb6\xba\x8a\x22\x3c\x87\x88\x34\x74\x1f\x66\x35\x9e\x1c\x65\x93\xe0\x46\x31\xc1\x48\x56\x97\x28\xd8\x09\xc6\xf9\xb4\x1d\x1d\xf2\x39\xb4\x71\x60\xd3\x49\x95\xd9\x2b\x23\xdd\xb4\xcc\x71\x55\x0c\xa8\xce\xa6\x1c\x8a\xf0\xa4\x78\x61\x25\xe3\x49\x85\xe2\x17\x84\x55\x9a\xa8\xb4\x89\x17\xe6\xad\xa3\x1d\xea\xc9\x08\x2c\x95\xc7\x11\x30\xf0\x09\xa8\x76\x5a\x14\x4a\xd6\x35\xc1\x1d\xe0\x55\x5b\xf7\x7d\xe8\xd5\x8c\x58\xc3\x57\xb6\x2f\x0d\xf2\xc3\x10\x10\x03\xc8\x8e\xb4\xb9\xbf\xb7\xbb\x5b\x15\x23\xe2\xc1\x00\x3d\x6e\xea\xe0\x52\xb2\xd5\xae\x06\x83\x41\x62\xff\x7c\x8b\xcc\x7b\x4b\x7c\x93\x5f\x7f\x58\x2a\x24\xbe\x75\x2e\xb4\x77\x5a\x2d\x77\xd0\x33\x5d\x7c\xda\xc4\x3a\x1d\x72\x92\x58\x04\x4a\x5d\xa7\x59\x68\x80\x50\x19\x03\x91\x60\x72\xf9\x2a\x07\xf6\x9e\xc7\x7c\xb8\x43\x5d\x8d\x04\x8a\xbc\x92\x86\x38\x3b\x6c\x9a\xa0\xa4\x5e\x41\xda\x93\x51\xaf\xeb\xd7\xbb\x23\x4a\xf0\x94\x2f\x57\x82\xb3\x5e\x8e\xe9\xd4\x6d\x03\xe0\xc9\x39\x02\x89\xc6\x51\x70\xd1\x2d\xe6\x8b\x9e\xf2\xc8\x5b\x27\xc3\x66\xb0\x55\x6f\x22\xce\x72\xaa\xd6\x4f\x0a\x58\x65\xde\x1b\xac\xd6\x6e\xc0\xd5\xb1\x5d\xc4\xed\x52\x48\xdc\xa0\x78\xb0\x0d\x80\x04\x4a\xcf\xea\x94\x8b\x0e\xb6\x0b\x42\x7a\x2f\x1a\x9d\x95\xf6\x02\x02\x09\x8a\x67\x06\x18\xd4\x18\x32\xba\xc0\x2c\x9e\xf0\x04\x49\x3d\xa7\x56\xd3\x51\x3e\x5e\xd8\xf4\xf2\xe8\xc9\xc1\xde\xfb\x1f\xd8\x85\x84\x8f\xe6\xc1\x38\xc8\xe0\x03\xe1\xc5\xd1\xb6\xbd\x48\xd3\x98\x71\xf3\x11\xc2\x94\x1d\x85\xb1\xf4\x4d\x04\x3f\xd2\x38\xa1\x58\xf9\x89\x38\x5f\xc3\xd7\x9d\x9d\xdd\x9d\x9d\xf3\xc2\x6d\x09\x9b\x70\xab\xec\x6e\x99\x52\xfd\x63\x44\x5a\x88\xf7\x2e\x79\x22\x15\x3e\xeb\x34\x37\x05\x3a\xcc\xd2\xab\x88\x30\x14\x03\x94\x29\x1c\x98\xf8\x56\x7a\x5b\x18\xf2\x84\x5d\x53\x9f\x0e\x26\x37\xc5\xa8\x1b\x49\x47\xb6\xb4\x2c\x42\xa2\x34\x4d\xbc\xa2\x08\x33\xc7\x51\xfa\x0c\xcc\xbc\x55\xe7\xff\x67\xd2\x23\xf8\xff\x04\xc0\xb1\x82\xdf\x4a\x98\x51\x8a\xac\xf1\x43\x11\xaa\xa4\xd8\x30\x32\x38\xe2\x6d\xb1\x33\xaa\x01\x9e\x14\xeb\x7d\x58\xec\xd1\xcf\x29\x30\x9e\xaf\xc4\xe4\x9b\x8f\x2a\x0c\xfe\x2e\x38\xe1\x66\xae\x66\x79\x8c\x24\x1e\xe9\x53\xea\x02\xd0\x1a\x1c\x1b\xf9\x74\x1e\xe3\x6b\x38\x43\x8d\x0f\x9d\xd1\x28\x6e\x15\xf2\x82\xad\x32\x00\x32\x66\x5c\x0e\x97\x3a\xfc\x68\x82\x80\xe5\xa7\xae\xf3\x26\x5c\x51\xa8\xf6\xf5\xfa\x1b\x73\x19\x90\x18\x07\x25\x94\xaa\xa9\xac\xcf\x2d\x8b\xad\xc3\x6b\x48\x8e\x2b\xd7\xd9\x20\x72\x88\x5c\xb3\x6d\xb5\x1b\x7e\xe1\x35\x0c\x2c\xe8\x3c\x85\x5f\xac\xa9\xc4\xd1\x44\x32\x9d\x3b\xa6\x7b\x0e\x77\x6d\x81\x8d\x5b\xce\xe6\x7c\xeb\xe5\x22\x1a\x53\x9b\x12\x48\xfb\x19\x2a\x10\xd7\x3f\x1d\x76\x07\xf5\xe6\xc6\xd9\x67\x70\x85\xbf\x99\xe2\x4f\x50\x50\xd5\x2a\x69\x0e\x6b\x28\x5a\xa2\x06\x4c\xf1\x60\x2b\x5c\xa6\x6a\xb6\x4c\xb7\x30\x08\xb6\x1f\x14\xc7\x03\x7a\xaa\x50\x28\x17\xc7\xd8\x19\x69\x42\x83\x4d\x60\xcd\x71\x52\x9d\x66\x7a\x00\x03\x4e\x7d\x59\xb3\xda\xae\xd9\x8a\x87\xe2\xa8\xc1\xa5\x88\x19\x06\xe2\x1c\xa6\xb9\xe5\xbb\xca\xe2\x13\xfa\xb2\x24\x34\xfd\x4a\x6e\xfe\xd0\xa1\xc8\x64\xc2\xe7\x1b\x73\x6e\xeb\x16\x59\xb3\x20\x5d\xd2\x61\x4b\x86\xdc\x51\x0a\x8b\xbd\xc6\xd0\xe4\x72\x41\x2c\x2a\xd1\xec\x7b\xa6\x16\x1f\xa7\x94\xe4\xcd\x90\xf5\x71\x3c\x08\x30\xbc\xe0\x54\x80\x48\xa7\xa4\x5c\x61\xe9\xeb\xeb\xeb\x6a\x1c\x5d\x14\x2c\xa6\xd9\xf4\x2b\xec\x9f\xb7\x75\x9b\x01\x12\x69\xdb\xd0\x21\xad\x62\x3f\x17\x01\x9d\x8f\x17\xe6\xd5\x72\xe0\x24\x48\x98\x4d\xff\x16\x7f\xa8\x50\xf3\x1c\x11\x0d\x00\x26\x2f\x1f\xbe\xaf\x9f\x7e\xd5\x03\xf7\x3b\xce\xdb\x4b\x44\xee\x3a\x73\x2f\xbd\x3e\xdf\x28\x9f\x4b\x2f\xfe\x87\x67\xe9\xb7\x8f\xcb\xef\x1e\xf4\x96\x33\xf4\x5b\xa7\xe7\xbb\xbd\x63\xab\x74\x72\xfe\xf8\x6b\x9e\x9c\x03\x6a\xdf\x3e\x3a\x27\x2f\x24\x61\x7b\x0b\x39\x06\xb2\x91\xba\xfd\x65\x92\x37\x09\x8e\x9a\x15\x37\xd4\xb7\x5d\x50\xf3\x4b\xf0\x49\xee\x26\x55\xe0\x12\xa4\x9d\xbd\x82\x08\xf2\xa9\xc1\x97\x18\x6e\xbe\xe9\x20\xb5\xd1\x57\x56\x0d\x5b\x9c\x26\xd1\xab\x66\x40\xe0\xd7\x5d\x5e\xdc\x98\xab\x56\xe3\x70\x77\xb7\xf8\xfd\x58\x5f\xec\x6f\xdb\x05\xe9\xd5\x85\x7e\xb5\xb7\xb7\xf7\xc1\xea\xa2\x1f\x24\xa9\x2d\x9e\x46\x28\xc2\xa8\x17\xed\xe5\x40\x38\xe6\xa7\x07\xa3\x8d\x56\xd7\xe3\x2c\xe5\x94\xcd\xb7\x34\xcb\xa4\xf3\x79\x71\x94\x5d\x94\x2a\xc1\x05\x95\x49\x25\x31\x14\x8e\x42\x35\x67\x1a\xa3\xd8\x22\xff\xa8\x2d\x2e\xa7\x35\x92\x5e\xed\x5d\x5c\x55\x90\x30\x50\x8d\x91\x95\xb4\x06\x6e\xaf\xae\xb3\x6f\x9c\x4e\xf5\xe7\x68\xeb\x3e\x61\x91\x85\x69\x7c\xaa\x5b\x44\x26\x0d\xd3\xa3\x84\x7e\xa9\x58\x30\x87\xf1\xa6\xe7\x75\x2b\x31\x17\x73\x0b\x6c\x4a\x67\x79\xdc\x93\x2f\x0e\x0b\xe7\x18\x19\x2d\x8a\x2f\x75\x8c\x6d\x16\xd3\x6c\x36\x92\x2d\xcb\xf4\x9e\xcc\xd3\xff\xcd\x4a\xeb\x76\x91\xc5\xb1\xbf\x60\x7c\x94\x05\x63\x66\xb7\x29\x2f\x96\x53\xba\xe8\x40\xf6\xf4\xfb\x3c\xc8\x98\x7f\x87\x3e\x83\xa2\x8b\x46\x16\x51\xcb\x26\xbe\xc5\xbe\xa6\x60\x75\x51\xa9\x13\x2e\xe3\x5b\xab\xc0\x66\x85\x6c\x4c\x2c\xa2\x66\x06\xa9\xa1\x6a\x9e\x9f\x15\xd3\x56\x13\x58\x18\xb7\x47\xd3\xc3\xf5\x50\x13\x09\x75\xdc\x51\xd4\x4c\x4a\xe7\x1c\x85\x31\x54\x64\x69\x8e\xeb\x87\xea\x9a\x2c\x90\x5d\x30\xa5\xc0\x40\x65\x9a\x01\x45\x8f\xde\xcc\xb4\xdd\x41\xdb\x77\x07\x23\x5d\x36\x98\x50\x45\x8e\xcc\x51\x74\xed\xcd\x54\xec\xc5\xfa\xdb\xa6\x0d\x1a\x2c\xd3\x6d\xed\xcc\x74\x28\xe1\x15\x72\x66\x49\xaf\x02\x89\x9a\x45\x93\xfc\x3e\x3a\xbb\x87\xe6\xfb\x9e\x1d\xf1\xcd\x6f\xe2\xce\xa6\x4e\x6c\x29\xc4\xf8\xde\x49\xa7\xc5\x27\x67\x87\x9c\xbd\xa7\x14\x07\x99\xeb\x10\x29\xe4\xe6\x4d\xbe\x9a\xf5\x4e\xf7\xc5\x1b\x9c\x39\xaf\x16\x51\xc6\xb1\x03\xa5\x25\xb6\x43\x04\x68\x2f\x0f\xf5\x27\x4d\x22\x98\x50\x47\x6a\x8e\x6d\xd3\x88\x4d\x71\xbd\xaf\x3f\xd2\x28\xda\x83\x25\x35\x27\x77\xe9\x38\x29\x6b\xcd\x95\x06\x92\x6b\x3c\xce\xc7\xf7\xfc\x4d\xa7\x91\xc7\x1c\x70\x04\xf1\xf7\x0e\x10\xe5\x3a\x00\x71\x7d\x14\xfe\x3e\x90\x48\xcf\x2b\x9f\xea\x8c\xf4\x29\x5c\xb6\xa2\xcd\x25\x70\x09\xfb\x83\x48\x8c\xe5\xee\xa3\x5a\x86\x65\xc6\x2d\x80\x6a\xc9\xe4\xe9\x38\x5b\xfb\xfe\x32\x5c\xdc\xb2\x7b\x1a\x52\x3e\x7c\xc7\x3d\x37\x8e\x4a\xa5\x86\x3e\x3e\x5f\x49\x49\x47\x92\x5b\x52\xa2\x87\x65\x29\xdd\xd7\xff\xd8\xdc\x40\x33\x0a\xa6\x09\x96\x8b\xc6\x85\xe8\x4c\x89\xce\x35\xf6\x56\xa9\x59\x72\xff\xc8\x5b\xed\x93\x55\x8f\xe1\xeb\xd6\x9f\xd0\xaf\x24\xdc\xbe\x3e\xf5\x48\xd7\xf9\xd9\x44\xbd\x97\x5b\x3b\xe5\xaa\x77\xcb\xde\xda\xdd\xb8\x3f\x23\xad\x38\xd4\x05\xf3\x4a\x82\x5b\x05\xde\xdb\xc2\x5b\x9f\x42\xac\x05\xb8\x79\x1a\x21\x36\x0e\x06\xac\xa6\xdb\xe1\x73\x6f\x8a\xaf\x81\xd2\x9f\xef\xbd\x42\x5a\xd1\xdb\x7b\xc2\xe7\x0a\x4f\xe8\xcf\x87\xab\xaf\x27\xb8\x8d\xf9\xeb\xe6\xe3\xe4\xa3\x65\x3e\x39\xb4\xc8\x6e\x38\xa3\x20\x89\x95\xbf\x8d\xc9\x96\x49\x42\x91\x86\x1e\x73\xf7\x90\x73\x7f\x94\xd2\x71\x29\xd2\x76\xf5\xcd\x0f\x10\xdd\x65\x52\x1e\xcd\xc6\xcb\x27\x5c\xba\x97\x58\xe5\x4f\xab\xeb\x23\x9f\x3b\x43\x6b\x68\x46\xe7\x69\x21\xa7\x16\xfe\x48\x55\xe9\x9d\x54\xf5\x47\x12\xbe\x79\x78\x66\xd1\xf7\x2f\xcd\x53\x06\x60\x1f\x6a\x57\xdb\xd9\x9e\x5b\xac\xaa\xd5\x07\x94\x33\x19\xc4\x74\x46\x4b\xe7\xb7\x86\x0c\x7d\x2e\xe4\xeb\xe7\x3e\x3f\xbf\x8b\xd2\xee\xe3\x99\xb5\x6e\x54\x1e\x6c\x13\x1e\xab\x67\xd3\xa5\x06\x86\xe4\xdc\x9c\x08\x61\x32\x0f\x50\x3d\x89\x89\x1a\x5f\x3e\x28\x52\x5f\xa5\xb2\x4c\x32\x02\x55\x2c\xb5\x4a\x25\x0f\xa6\x8a\xd2\x27\x65\x76\xce\xff\x69\xb2\xca\xf0\x51\x5e\x51\xe3\x39\xa3\xfc\x30\x1d\x2b\x7e\x40\xc4\x6a\x3b\xd5\xf7\xab\xfb\x56\xdd\x6d\x1b\x4b\x69\xf0\x09\x74\xe9\xd3\x50\x3e\x56\x24\xa3\x2f\xc4\xc3\xbc\xf8\xcc\x1d\xbd\x83\x80\x6e\x49\x97\x95\x72\x37\xab\xd6\x4b\x2c\x7c\xb6\xee\xbc\x29\x31\x8b\xa6\xb3\x18\xff\x71\x48\x87\xc7\x53\x19\x00\x6e\x33\x14\xdc\x57\xd4\xc3\xe2\xcf\x4d\xd4\xaa\x7e\x68\x76\x5a\x2d\xff\xa4\xd3\x3e\xe9\xe2\xbf\xd1\x46\xef\xbd\x8c\x18\x29\xe5\xa8\x15\x98\x25\xca\xe5\x74\x41\xe1\x80\x3a\x7a\xdc\xdd\xe7\x50\xdc\xee\x8c\x34\xe9\x72\xe2\x79\x83\x2a\x59\x6f\x30\xce\xa9\xf2\x62\x92\x71\xf9\x84\xf1\x7e\x9a\xfc\x25\x7e\xbd\x31\x62\x8f\x14\xfb\x77\x10\xd7\x20\x97\x3e\x2a\x4b\xee\xa1\x55\xa0\x5c\xdd\xe5\xbd\xc7\x52\xa6\xe3\x92\x9d\x04\x53\xf2\x5b\x45\x1d\x2c\xdc\x20\xd3\x7f\x1d\x33\x99\x8e\x8d\x91\xa0\x06\x5e\xdb\xc9\x60\xd5\x2d\xbd\xa3\x05\x4f\x5a\xae\x9a\xe7\x67\x56\xaf\xd3\x76\x75\xea\x3c\xa0\xf4\xce\xdf\xe7\xeb\x4f\x9f\xac\x46\x77\xd0\x77\xcc\x35\x7d\x4c\x6f\x2e\x51\x90\x73\x6b\xca\x7a\xa9\x9d\xf0\xac\x74\x16\x5d\xee\x6f\xcd\x50\xd5\x52\x5f\x37\xbf\x96\xd2\xb4\xe2\xb5\x07\x36\x9d\x56\xfd\xb4\x3b\xf2\x4b\x9d\x2e\xfa\xf0\x31\x58\xf0\x37\xb5\x9b\x82\x8f\x72\x39\x57\xba\x16\xd4\xdf\x57\xe8\xf2\x2f\xd0\x5d\x7d\x92\xbe\xfe\x27\x26\x9e\xe3\x77\x46\x4e\xcf\x2b\xbe\x11\x8c\x76\x0e\x29\x31\xd7\xfb\x24\x12\xe0\xa8\xca\xa9\x67\x7f\x36\xab\x34\xfa\xf4\xf7\xe4\x29\xfd\x1d\x3d\xb7\x43\x59\x69\x3a\xf6\x24\xab\xb4\x5c\x3b\x89\x2b\xfd\xae\x1d\x5f\x55\xba\xcf\xec\x6c\x59\x71\x4f\xed\x4f\x82\xca\xb7\x87\xb6\x54\x15\xc7\xb3\x17\x79\xe5\xd8\xb5\x17\x71\x65\xd8\xb5\x2f\xa6\x95\xe3\xb6\x0d\xe1\x77\x46\xf6\x24\xaa\xb4\x3a\x76\x9e\x55\x46\xae\x3d\x56\x95\xc6\xc7\xb6\xca\x2a\xde\xd0\x56\x57\x15\xcf\xe1\x53\x5d\x5a\xdf\x81\x75\x47\x6a\x66\xff\xe2\xef\xbe\xfb\xf3\x7f\xfe\xc3\x9f\xff\xe4\x6f\xbf\xfc\xe3\xdf\xb6\x7f\xf1\xd3\xef\xfd\xf2\xaf\xff\x48\xdf\xfc\xea\x67\xbf\xf3\xcb\xbf\xfa\xd3\x2f\x7f\xf2\xf7\xbf\xfa\xd9\xef\xde\x7e\xf1\x1f\x7f\xf0\xa3\x2f\x7f\xfa\x2f\xf4\xa2\x29\x97\xb9\x1a\xcf\xec\x56\x16\x24\x9f\xff\x20\x88\x94\xdd\xa7\xf2\x1c\xf5\x41\xa8\xec\x6e\x90\xc3\x22\xff\xfd\xfb\x4b\xfb\xf5\x5f\x7c\xf1\x5b\x5f\x7c\xef\x8b\xef\xbd\xfe\xc7\xd7\x3f\x79\xfd\x53\xfb\xcb\x3f\xf9\xcb\x2f\xff\xec\x6f\xfe\xf3\x87\x7f\x6e\x3b\x6a\x11\x7c\xfe\xe3\x34\xb6\xe9\x8b\xa4\xe5\x74\xf9\xf9\x0f\x15\x7d\x41\x76\x9c\x05\x2a\xa2\x87\xb1\xba\x8c\xec\xd7\x3f\xfe\xe2\xf7\x5e\xff\xd3\xeb\x7f\x78\xfd\xa3\x2f\xbe\xab\x69\xd8\x9d\x3c\x88\x23\x2a\x7a\xbc\x25\x60\x68\x1c\xc0\xb3\x12\x7b\xf4\xf9\xcf\xb2\xcb\xcf\x7f\x20\xed\x7f\xfb\x7d\xac\x9a\x47\x49\x60\xbf\xfe\xfe\x17\xdf\x7d\xfd\xaf\x66\x92\x77\x25\x13\x75\x19\x58\xba\x64\x08\xd9\x09\x28\x74\x93\xe5\x2d\xa2\xf1\x25\xd2\x30\x6b\x89\x12\x9c\xa4\x12\xe7\xcc\x62\x35\xb1\xba\x2c\xd6\x15\x2e\x3f\x9b\x59\xac\x30\xbe\x84\xca\x2c\xfe\xbb\xba\x63\x05\x52\xe1\x2c\x2d\xd6\x22\xc5\x9c\xcc\x62\x55\xe2\x32\x89\x2d\xd6\x27\x7d\x28\x78\x65\xb1\x52\xe9\x5c\x7d\x69\xb1\x66\x71\xf9\x49\x60\xb1\x7a\x69\x4d\x65\xb1\x8e\x71\xc9\xbf\x16\xeb\x9a\xee\x62\x8b\x15\x8e\xcb\x8b\xa9\xc5\x5a\xa7\x8a\x3a\xb7\x58\xf5\xb4\x60\x64\xb1\xfe\x39\xb8\x5a\x6c\x04\x54\xe4\xd0\xaf\xc5\xc6\x40\xdf\x16\x65\x16\x5b\x04\x5d\x5e\x59\x0c\x50\x8b\xef\x25\xe7\xc1\x62\xc1\xdf\x0c\xa5\xa5\x70\x3b\x8e\x03\x6e\xe3\x72\x8c\xa8\x02\xfc\xc7\x47\x51\x12\x59\x2f\x57\x23\xaa\x66\x1a\x1d\xae\xa7\x04\x06\x90\xbf\x4e\x06\xcf\xfd\x16\x4a\x3f\x14\x42\xc7\xae\xfe\xf0\xa2\x14\x83\x3d\xfa\xa7\x0b\x04\x5d\x74\x4b\xef\x76\xf1\xc9\x19\x99\x02\x54\x3b\x2d\xfe\x85\xc8\x04\x18\x01\x5a\x2a\xd3\x25\xd0\xa2\xcf\x24\x8b\x2e\x1d\x51\xe5\xfe\x5c\xf9\x8b\x17\xfd\xe1\x8a\xe9\x1d\xbe\x85\x14\xfd\x1b\x82\x2e\x22\x8f\xcf\x0d\x35\xd3\x76\x63\xaa\xff\x15\x00\x00\xff\xff\x8f\xb3\x33\xe4\x6f\x36\x00\x00") - -func confAppIniBytes() ([]byte, error) { - return bindataRead( - _confAppIni, - "conf/app.ini", - ) -} - -func confAppIni() (*asset, error) { - bytes, err := confAppIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/app.ini", size: 13935, mode: os.FileMode(420), modTime: time.Unix(1479608914, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreActionscript = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\x90\x41\x4e\x03\x31\x0c\x45\xf7\x73\x0a\x4b\xdd\x96\xcc\x1d\x90\xe8\x92\x22\xe0\x00\x93\x49\x3c\x1d\xa3\x4c\x12\xd9\x8e\x54\x6e\x8f\x9b\x80\xc4\x26\xb1\xac\xef\xef\xe7\x7f\x82\xe7\x46\x29\x82\xcf\x11\xde\x31\xa1\x17\x84\x4b\x49\x11\x59\xa6\x95\xf2\xfc\x78\x9e\x22\xae\xed\x36\x4a\x1e\x9a\x79\x9a\x4e\x70\xd5\x1d\x19\x36\x4a\x28\x7d\x7e\xfb\x9d\x73\x82\xaa\x94\x6f\xd2\x55\x6f\x5c\xbe\x30\xe8\xd0\x9d\x81\x1c\x3a\x58\x5c\x1d\xdd\xe5\x6c\xb5\x0f\x4a\x25\x7f\x04\xa6\xaa\xa6\xae\xc8\x4a\x28\x4b\xf7\x5c\xdc\x96\xf0\xfe\xaf\x6b\x8e\xb2\x97\x66\xc8\xaf\xd7\x4f\x58\x11\xf0\x1e\x52\x8b\x68\x27\x08\x18\xd0\x37\x84\x92\xd5\x53\xb6\xff\xa8\xb6\x93\xe1\x0f\xa7\x1b\x96\x0e\x4d\x47\x2d\xac\x3e\xab\xd9\x51\xde\x0a\x1f\xfe\xc1\x60\x27\x30\xbc\x84\x44\xd5\x62\x98\xe1\x92\xbc\xec\x23\x20\x64\x37\xfd\x04\x00\x00\xff\xff\x01\x21\xc8\x11\x2c\x01\x00\x00") - -func confGitignoreActionscriptBytes() ([]byte, error) { - return bindataRead( - _confGitignoreActionscript, - "conf/gitignore/Actionscript", - ) -} - -func confGitignoreActionscript() (*asset, error) { - bytes, err := confGitignoreActionscriptBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Actionscript", size: 300, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreAda = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\xf0\x4f\xca\x4a\x4d\x2e\x51\x48\xcb\xcc\x49\xe5\xd2\xd2\xcb\xe7\xe2\x52\x56\x70\x4c\x49\x54\xf0\xc9\x4c\x2a\x4a\x2c\xaa\x54\xf0\xcc\x4b\xcb\x2f\xca\x4d\x2c\xc9\xcc\xcf\x03\x4a\x27\xe6\x64\x72\x01\x02\x00\x00\xff\xff\x56\x40\x49\xd4\x33\x00\x00\x00") - -func confGitignoreAdaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreAda, - "conf/gitignore/Ada", - ) -} - -func confGitignoreAda() (*asset, error) { - bytes, err := confGitignoreAdaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Ada", size: 51, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreAgda = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x4b\x4c\x4f\x49\xcc\xe4\x02\x04\x00\x00\xff\xff\x27\x6c\x17\xd3\x08\x00\x00\x00") - -func confGitignoreAgdaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreAgda, - "conf/gitignore/Agda", - ) -} - -func confGitignoreAgda() (*asset, error) { - bytes, err := confGitignoreAgdaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Agda", size: 8, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreAndroid = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x90\xdf\x4a\xc5\x30\x0c\xc6\xef\xfb\x14\x81\x73\xa3\x22\xdb\x33\x28\xfe\x01\x51\x11\x04\x6f\x25\x6b\xb3\x9e\xb0\xd8\x96\xac\x1b\xfa\xf6\xb6\x3d\x3b\xf3\xc6\x9b\x40\xf2\xfb\xda\x7c\x5f\x0e\x70\xbb\xb0\x64\xc0\x94\x84\x2d\x66\x8e\x01\x46\x16\x9a\xcd\x55\x87\x69\x6a\xf5\xd3\x98\x03\x3c\xd4\x21\x8c\x51\x21\x1f\x09\xee\x50\x56\x9e\xe0\xe3\xa5\x08\x1c\x7d\x57\xc1\x13\xae\x08\x56\x70\x9e\xf7\x0f\x5a\x57\xd9\x23\x05\x52\xcc\xe4\x36\x34\x70\xe8\x8d\xa7\x52\x2a\x54\x74\x42\x1b\xe9\x7c\xeb\x7a\x33\x14\x5b\xae\xf1\xe7\x68\x51\xc0\xc6\x30\xb2\x5f\xf4\xcf\x22\x5c\xcc\x6e\x82\x84\xf9\x78\x0d\x94\xed\xa5\x91\x2a\xec\x92\xc6\x44\x9a\x99\xda\xe6\x37\x8d\x7e\x41\x2d\x8b\xa3\x38\x52\xf0\xbb\x93\xe1\x07\xee\xad\x70\x9a\xc9\xa4\x4d\xb4\xad\xf3\xa7\xb0\x25\x80\x44\x5f\x47\x37\xc1\x69\x64\x07\xef\x79\x71\x1c\xe1\x15\x57\xf6\x27\x1f\xe4\x38\xd7\x93\xd0\x57\x3a\x07\x08\x3b\xed\xff\x79\x6b\x31\xe5\x45\xdb\x25\xab\x1f\x73\xee\x7b\xf3\x1b\x00\x00\xff\xff\xe7\x8d\x2b\xb8\x8a\x01\x00\x00") - -func confGitignoreAndroidBytes() ([]byte, error) { - return bindataRead( - _confGitignoreAndroid, - "conf/gitignore/Android", - ) -} - -func confGitignoreAndroid() (*asset, error) { - bytes, err := confGitignoreAndroidBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Android", size: 394, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreAnjuta = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\xf0\xc9\x4f\x4e\xcc\x51\x48\xce\xcf\x4b\xcb\x4c\x2f\x2d\x4a\x2c\xc9\xcc\xcf\x53\x48\xcb\xcf\x49\x49\x2d\x52\x48\xcc\x4b\x51\x28\xae\xcc\x4d\xca\xcf\x51\x48\x49\x2c\x49\x4c\x4a\x2c\x4e\xe5\xd2\xd7\x4b\xcc\xcb\x2a\x2d\x49\xd4\x87\xb3\xe2\x81\x4a\xe2\x53\x92\xf4\x52\x92\xb8\x00\x01\x00\x00\xff\xff\xa9\xec\x11\xd0\x4e\x00\x00\x00") - -func confGitignoreAnjutaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreAnjuta, - "conf/gitignore/Anjuta", - ) -} - -func confGitignoreAnjuta() (*asset, error) { - bytes, err := confGitignoreAnjutaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Anjuta", size: 78, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreAppengine = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\xcf\xcf\x4f\xcf\x49\x55\x70\x2c\x28\x50\x70\xcd\x4b\xcf\xcc\x4b\x55\x48\x4f\xcd\x4b\x2d\x4a\x2c\x49\x4d\x51\x48\xcb\xcf\x49\x49\x2d\xe2\x4a\x2c\x28\x48\x05\x4b\xe9\xc2\xa5\xf4\xb9\x00\x01\x00\x00\xff\xff\x16\xc1\xe5\x46\x3a\x00\x00\x00") - -func confGitignoreAppengineBytes() ([]byte, error) { - return bindataRead( - _confGitignoreAppengine, - "conf/gitignore/AppEngine", - ) -} - -func confGitignoreAppengine() (*asset, error) { - bytes, err := confGitignoreAppengineBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/AppEngine", size: 58, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreAppceleratortitanium = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\x2a\xcd\xcc\x49\x51\x48\xcb\xcf\x49\x49\x2d\x52\x48\xcc\x4b\x51\xc8\xc9\x4f\x57\x48\xcb\xcc\x49\xe5\x4a\x02\xc9\xe8\x43\x28\x3d\xa0\x28\x17\x20\x00\x00\xff\xff\x9f\xf6\xb1\xea\x2d\x00\x00\x00") - -func confGitignoreAppceleratortitaniumBytes() ([]byte, error) { - return bindataRead( - _confGitignoreAppceleratortitanium, - "conf/gitignore/AppceleratorTitanium", - ) -} - -func confGitignoreAppceleratortitanium() (*asset, error) { - bytes, err := confGitignoreAppceleratortitaniumBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/AppceleratorTitanium", size: 45, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreArchlinuxpackages = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x2b\x49\x2c\xe2\x02\x93\x7a\x5a\x40\x3a\x0b\xcc\x4b\xad\x48\x05\x92\xb9\xc5\x99\x40\xb2\x2a\xb3\x00\x24\x9f\x5e\x05\x24\x73\xf2\xd3\x21\x24\x58\x6d\x71\x66\x3a\x17\x57\x41\x76\xba\x3e\x57\x71\x51\xb2\x3e\x17\x20\x00\x00\xff\xff\x6d\x4d\xf4\x14\x4b\x00\x00\x00") - -func confGitignoreArchlinuxpackagesBytes() ([]byte, error) { - return bindataRead( - _confGitignoreArchlinuxpackages, - "conf/gitignore/ArchLinuxPackages", - ) -} - -func confGitignoreArchlinuxpackages() (*asset, error) { - bytes, err := confGitignoreArchlinuxpackagesBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/ArchLinuxPackages", size: 75, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreArchives = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\x8e\x4b\x4e\xc4\x30\x0c\x40\xf7\x39\x85\xa5\x2e\x90\x90\x98\x05\x1b\xce\xc0\x31\x9c\xd4\x93\x1a\xea\x24\x8a\x5d\x0d\xf4\xf4\xd8\xd3\x0d\x9b\x67\xeb\xf9\xbb\xc0\xa7\xbd\x28\x64\x32\xa3\x09\xd6\xe1\x68\x03\xcb\x37\xd8\x46\x4a\x70\xe7\x9d\x14\xb0\xad\x50\xba\x08\x5b\x68\x98\xf8\x00\xed\xc7\x2c\xe4\x63\x05\x0f\xa5\xb4\x40\xf5\xe2\x86\x0a\x6c\x0a\xfd\xd1\x20\x1f\xbc\x1b\x70\x8b\xc1\x31\x49\x95\x7b\x03\x21\xdb\xfa\xaa\xb7\xf4\x7a\xfb\x38\x1d\x5f\x38\x9d\xf3\xc9\x93\x87\xb3\x86\xce\x57\x9e\xcf\x77\xe7\x4f\x98\xfd\x14\xf4\x50\x30\xa7\xb4\xc4\x7f\xdc\xea\x5b\x6f\xfb\x2f\xdc\xfb\x14\x34\xf5\x22\x6b\x77\x9a\x2f\xbb\x5a\xb0\x12\x08\x36\x0f\x42\xcd\xfe\x35\xae\x52\x63\xef\xe0\xb8\x47\xe2\xa4\x1a\x66\xa5\x1c\xdf\x8c\x30\xa2\xfc\xe4\x95\x8f\xf4\x17\x00\x00\xff\xff\x99\x2b\xe0\x1a\x27\x01\x00\x00") - -func confGitignoreArchivesBytes() ([]byte, error) { - return bindataRead( - _confGitignoreArchives, - "conf/gitignore/Archives", - ) -} - -func confGitignoreArchives() (*asset, error) { - bytes, err := confGitignoreArchivesBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Archives", size: 295, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreAutotools = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x84\x8c\x41\x0a\x03\x21\x0c\x45\xf7\x39\x45\xa1\xeb\x31\x14\x66\xd5\x3b\xf4\x10\x92\x46\x0d\xd5\x44\xc6\x0c\x5e\xbf\x0e\x3d\x40\x37\xe1\xe5\xc1\xfb\xf7\x5b\x71\xef\x4f\xc4\x39\x67\xc8\x7a\x06\x3b\x32\x0e\x4b\x3e\xe3\xc1\x18\x4f\xb7\x16\x3f\x0c\xf0\x5a\x37\x49\xe5\x20\x0a\xf0\x3f\x22\xd3\x04\xf0\xeb\x77\xe7\x40\x91\x0a\xaf\x9f\xaa\x51\xac\xa1\xed\x80\x64\xad\xaf\xc1\x0b\x34\x49\x3e\x8f\x85\x6f\xee\x97\x06\x14\x1d\x1e\x6b\xdd\x46\x01\x6c\x32\x86\x68\x06\x5c\xaa\xf5\xad\x3c\xe0\x1b\x00\x00\xff\xff\xbe\x48\x7d\x82\xb5\x00\x00\x00") - -func confGitignoreAutotoolsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreAutotools, - "conf/gitignore/Autotools", - ) -} - -func confGitignoreAutotools() (*asset, error) { - bytes, err := confGitignoreAutotoolsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Autotools", size: 181, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreBricxcc = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\x2a\xca\x4c\xae\x50\x70\xce\xcf\xcd\x4d\xcc\x4b\x51\x70\x4e\xcd\x2b\x49\x2d\x52\xf0\x74\x71\xe5\x52\x56\xc8\x28\x29\x29\xb0\xd2\xd7\x4f\x02\xa9\x48\x4e\xd6\x2b\xce\x2f\x2d\x4a\x4e\x4d\xcb\x2f\x4a\x4f\xd5\xcb\x4b\x2d\xe1\xd2\xd2\x4b\x4a\xcc\x06\x92\xc5\x95\xb9\x5c\x80\x00\x00\x00\xff\xff\x62\x51\x65\x31\x48\x00\x00\x00") - -func confGitignoreBricxccBytes() ([]byte, error) { - return bindataRead( - _confGitignoreBricxcc, - "conf/gitignore/BricxCC", - ) -} - -func confGitignoreBricxcc() (*asset, error) { - bytes, err := confGitignoreBricxccBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/BricxCC", size: 72, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreC = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x3c\x8f\xcd\xaa\xc2\x30\x10\x46\xf7\x79\x8a\x40\x37\xf7\x76\x51\x37\x52\xfa\x00\x15\x5c\x54\x14\xba\x10\x57\x92\x9f\x69\x9b\x1a\x9b\x90\xb4\x18\xdf\xde\x99\x08\x2e\x72\x32\x84\xf3\xcd\x4c\x0a\x7e\x96\x33\xa8\x95\x0f\xc6\x42\x64\x65\xe5\xf0\x3c\x08\x4e\xce\x48\xb0\x03\x63\x05\xbf\x04\x50\xee\xe9\xd1\xd1\xfc\x08\x42\x43\x20\x77\x54\x13\xd2\x23\x51\xe9\x8c\x0c\x22\x98\xdc\xc4\x1a\x89\x14\x54\x65\x38\x12\xfa\x49\x04\x8c\xbb\x3c\x2f\xf2\x3f\xb3\xa8\x8a\x5f\xcd\xa2\xdd\x2b\xf2\xb6\xeb\xe2\x3f\xaa\xda\x5a\x64\x74\x19\x55\x49\x2f\x6f\xea\x86\xf9\x43\x02\xb5\xad\x42\x7e\xf7\x84\x04\xb4\xe4\xb6\xd2\x20\xef\x91\xa6\x6c\x6a\xbc\x52\x53\xdf\xeb\x3d\x16\x13\x24\x8a\xb5\x20\xb7\xf1\xf7\x3d\xdd\xdf\x4e\x3b\xf6\x09\x00\x00\xff\xff\xf1\xbf\x6c\xb8\xf6\x00\x00\x00") - -func confGitignoreCBytes() ([]byte, error) { - return bindataRead( - _confGitignoreC, - "conf/gitignore/C", - ) -} - -func confGitignoreC() (*asset, error) { - bytes, err := confGitignoreCBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/C", size: 246, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCSharp = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x54\x4d\x6f\xe3\x36\x10\xbd\xf3\x57\x0c\xe0\xa2\xed\x6a\x13\x09\x28\x8a\x5e\x7a\x4a\x9c\xdd\x24\xc0\x36\x09\x6c\x6f\xb7\x80\x61\x18\x14\x39\x96\x18\x53\x24\xcb\x8f\xc4\xee\xa1\xbf\xbd\x43\x4a\x6e\xb2\xbb\xb9\x3c\x51\xc3\x99\xe1\xf0\xcd\xf0\xcd\xe0\x32\x29\x2d\xe1\xa3\xd5\x12\x7d\x80\x9f\x8f\x36\x81\xe0\x06\xf6\x88\x0e\x5a\x65\x40\xed\x80\x6c\x3f\x49\xd0\x6a\x8f\x67\x10\x2d\x84\x68\x3d\x82\xd4\x3a\x00\x37\x12\x9c\x6c\xc3\x3b\xb6\xbe\x6c\x37\xca\x34\x6c\x7d\x6f\x37\xed\x63\xc3\xd8\x0c\x86\x10\x31\x44\x28\xe0\x31\x24\x1d\x03\x5b\xd1\xcf\x62\x5a\xb3\xd9\x0c\x6e\x3b\x93\x93\xfd\xa9\x42\xe2\x1a\x96\x31\x49\x65\x29\x62\x70\xd6\x73\x7f\x84\x9d\xd2\x18\xce\xa0\x2d\x35\x4e\x39\xce\xf2\xa9\x39\xb6\x6c\x42\x87\x06\x3d\x8f\x28\xa1\x3d\x82\xb3\x2e\x69\xee\xbf\xc9\xc7\xa5\x3c\xb7\x26\xd4\xb9\xa8\xcf\x01\xfd\x79\x70\x28\xd4\x4e\x89\x31\x05\xab\xea\x90\x2c\x61\xa2\xbd\xfc\xa3\x4d\x2d\xad\x08\x91\xb2\xe6\x2a\x27\x8a\x4e\x57\x58\x5f\xc9\x0d\xb6\xa9\xa3\xbb\x2e\xfc\x06\x35\xf2\x80\x0d\x3b\xfc\xf6\x6b\xc3\xaa\xad\xaa\x05\xa1\xcb\x58\x2b\xbd\x27\x1c\x30\x72\xfa\xd8\xf6\x91\xd0\x89\x3e\xa3\x6c\x33\x76\xa2\xa0\x24\xf4\xc1\xe5\x83\xdb\x7c\x7c\xd4\x6d\x41\x55\x30\xfb\xc7\x21\xef\x6a\xdb\x11\x3e\x05\x17\x84\x28\x8b\x90\x17\x75\xe1\xa6\x94\x39\x5d\x7a\xfe\xfe\x3d\x75\x50\xf4\x38\xdd\x4e\xd1\xa1\x54\x5a\xcd\x5d\xbe\xa9\x11\x39\xbb\x75\x68\x82\xdc\xe5\x33\x09\x5f\x62\x27\xc2\x9c\xb7\x39\x36\x57\xe3\x02\x86\x30\x9e\x3b\xe2\x21\xbb\x5f\x27\x25\xb9\x11\x08\x17\x29\xda\x81\x47\x65\x0d\xac\xac\xd5\x7b\x15\xc9\xab\x73\xcb\xcc\x5d\x76\x5c\xe0\xb2\xe7\xde\xa1\x07\x45\xd3\x02\xf5\xdd\x87\x15\x08\x2b\x95\xe9\x4a\x57\x94\x61\xdb\xff\x5d\xaa\x1c\x70\x37\xf7\xc9\x14\x96\x8c\x28\xab\x8a\xd5\xd5\xb4\x22\x0a\x04\xd7\xf5\x61\xd0\xd9\xf3\xd6\x50\x87\x68\x08\x7b\x85\xd4\x1d\x9b\xa2\x4b\x11\x76\x65\x8e\xd9\xfa\x03\x6e\x0e\xce\xe7\xd2\xc9\xf3\xca\x8a\x07\x6f\x1f\x51\xc4\xb1\x0a\x6a\x6e\x1a\xd0\xc4\xb1\xee\x69\x80\xac\x3f\x55\xf4\xe2\xde\x14\x72\x7b\xd4\xae\x79\x6d\xbd\xc9\x86\xaa\xbe\x39\xac\xde\xb4\xce\xdf\xb0\xf6\xbd\x78\xd3\xba\x7f\xd3\xea\xbe\xb3\xde\xc4\x41\xff\xf2\x9d\xb5\x8f\x23\x15\x73\xad\xc4\xfe\xfc\x3e\x37\x44\x2a\x4f\xdb\xd6\x1f\x99\x4b\xad\x56\xa1\xcf\xfb\x0f\xe3\x12\xbe\x60\x0b\xf7\x85\x28\xe2\x77\x32\x9e\xe8\xbc\x4b\xd7\x18\xe1\x81\x8b\x3d\xef\xe8\x59\x5d\xbd\xe4\x99\x4c\xd9\xe9\x8b\x32\xd2\x3e\x07\xb8\xf8\x27\xd1\xab\x1d\xdf\xc5\x94\x50\x84\x03\x25\x2d\x84\xd5\x22\x48\xdc\xbd\xf6\x5f\x16\xc9\xe0\xce\xc1\x94\xed\x55\x9d\x17\xce\x9d\x4e\x2d\xb2\x71\x1f\x7b\x52\xa2\x49\x50\x26\x3d\x61\xe1\x6f\xfd\x95\x76\xac\x57\x71\x43\xbf\xe5\x05\x66\x4b\x45\x67\xcf\xf3\xd0\x33\xe2\x82\x5a\x7b\x99\x43\x97\x61\x13\x8f\x1a\xd7\x73\xb1\xb1\xae\xae\xd8\xbf\x3f\x64\x37\xd9\x0e\x52\xb3\xeb\x93\x6c\x6c\xe7\x56\x22\xcc\xa8\xf7\x24\x21\x3b\x9a\x82\xc5\xed\x45\xb3\x54\xfa\x09\xbd\x56\x5d\x1f\xf3\x63\xc8\x8c\x8f\x4a\x40\x85\x26\x07\x3f\x92\x18\x90\x42\xc5\x49\x82\x76\xde\x0e\x34\xd5\x86\x42\x62\x99\x6c\x03\x34\x86\xa7\xc0\xe2\x94\x75\x93\x83\xc1\x67\x1a\xce\x6f\x5f\x1b\x85\x05\x1a\xc4\xfa\x94\x7d\x4c\xca\x89\x30\x63\x23\xc5\x20\x55\x46\x1a\x88\x82\x93\x40\xc1\x33\x42\xcf\x9f\x10\x3a\x15\xe1\xf7\xf3\x77\x6c\xfb\xd9\x75\x9e\x4b\x5c\x94\x8a\xb6\x1f\x73\x70\xc3\xc6\x54\x55\xc3\xa6\xdd\x4f\xb6\xab\xea\xbf\xfe\xf8\xc4\xfe\x0b\x00\x00\xff\xff\x67\x6d\x1a\x58\xf1\x05\x00\x00") - -func confGitignoreCSharpBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCSharp, - "conf/gitignore/C Sharp", - ) -} - -func confGitignoreCSharp() (*asset, error) { - bytes, err := confGitignoreCSharpBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/C Sharp", size: 1521, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreC2 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x8e\x4b\xae\xc2\x30\x0c\x45\xe7\x59\x45\xa4\xce\xde\xe0\x6d\x82\x8f\x98\x81\xc4\x0a\x9c\xc4\x40\x2a\xb7\x89\x5c\x57\x6a\x77\x8f\x9d\x0a\x04\x0c\x7c\x22\x47\xbe\x47\xb7\xf3\xbb\x32\xd4\x4c\x98\xfc\x39\xf4\x18\xc5\xdf\x74\x99\xdc\xdf\xff\x44\x45\xd9\xd0\x26\xf4\xce\x75\xfe\xc2\x18\x5f\x81\x13\x42\x42\xb6\xdb\x7b\x7c\x28\xab\xd2\x7d\x08\xf7\xeb\x08\x43\x8e\x9e\x72\x60\xe0\xbc\x59\xcd\x95\x56\xfd\xb2\x97\xc8\x02\xc7\xc2\xc2\x30\xfa\xa1\xa4\x99\xf0\x5d\x40\xd7\x2f\xdd\x55\x40\x7e\x6c\x04\xb9\x51\x61\x63\x56\x4d\x1c\x16\x8c\xb3\x40\xd8\x34\xb8\xa0\xd5\x9f\xc5\x8e\x6a\x75\xcf\x00\x00\x00\xff\xff\xf8\xe6\x6b\x63\xf2\x00\x00\x00") - -func confGitignoreC2Bytes() ([]byte, error) { - return bindataRead( - _confGitignoreC2, - "conf/gitignore/C++", - ) -} - -func confGitignoreC2() (*asset, error) { - bytes, err := confGitignoreC2Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/C++", size: 242, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCfwheels = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\xcc\xb1\x8e\xc2\x30\x0c\xc6\xf1\x3d\x4f\x61\xa9\x5b\x97\xec\xb7\x5d\x75\xe3\xdd\x70\xe2\x09\xd2\xfa\x6b\x1a\x88\x92\x60\x27\xa0\xbe\x3d\xb4\x80\xc4\xc0\x64\xf9\xef\x9f\xdc\x51\x4b\xc5\x4d\x27\x30\x95\xd8\x7c\x48\x34\xe7\xc8\x10\x35\x8f\x55\x6d\xdf\xdb\xde\x98\x8e\xe6\x10\xa1\xc4\x41\x30\xd5\x2c\x2b\x5d\x17\x08\xa8\x95\x98\x1d\x2b\xf9\x6c\x76\xb0\xc9\x9f\xe1\x2f\x78\x71\x15\xcf\x97\x5f\xe4\x91\xb0\x05\xa6\xc3\xff\xaf\xe1\xd1\xea\x39\x6e\xf2\x5b\x15\x75\x68\x89\x23\xe4\x03\x1e\xf7\x8b\x9a\xa3\xbb\x38\x9d\x24\x94\xaa\xf6\xd5\xb4\xae\xf7\xb1\x00\x6f\xed\x16\x00\x00\xff\xff\x20\xb2\xd5\x74\xcd\x00\x00\x00") - -func confGitignoreCfwheelsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCfwheels, - "conf/gitignore/CFWheels", - ) -} - -func confGitignoreCfwheels() (*asset, error) { - bytes, err := confGitignoreCfwheelsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/CFWheels", size: 205, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCmake = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x72\xf6\x4d\xcc\x4e\x75\x4e\x4c\xce\x48\xd5\x2b\xa9\x28\xe1\x02\x73\xdd\x32\x73\x52\x8b\x21\xcc\xe0\xe4\xa2\xcc\x82\x92\x62\x2e\x10\x3b\x0d\x28\xcc\x95\x9c\x0b\x64\xc5\x67\xe6\x15\x97\x24\xe6\xe4\xe8\x81\x79\x5c\x50\x5e\x7c\x6e\x62\x5e\x66\x5a\x6a\x71\x09\xd8\x24\x40\x00\x00\x00\xff\xff\x37\x8a\x7f\x4c\x59\x00\x00\x00") - -func confGitignoreCmakeBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCmake, - "conf/gitignore/CMake", - ) -} - -func confGitignoreCmake() (*asset, error) { - bytes, err := confGitignoreCmakeBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/CMake", size: 89, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCuda = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\xcb\xe4\x02\x62\x10\x91\x5e\x50\x0a\x24\x0b\x4a\x2a\x80\x64\x72\x69\x52\x66\x1e\x90\x4e\x4b\x2c\x01\x31\x00\x01\x00\x00\xff\xff\xd8\x38\x0a\x95\x26\x00\x00\x00") - -func confGitignoreCudaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCuda, - "conf/gitignore/CUDA", - ) -} - -func confGitignoreCuda() (*asset, error) { - bytes, err := confGitignoreCudaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/CUDA", size: 38, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCvs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x77\x0e\x0b\xd6\xd7\xe2\xd2\x82\xd2\x7a\xc9\x65\xc5\x99\xe9\x79\xf9\x45\xa9\x40\x21\x24\x0e\x20\x00\x00\xff\xff\x5f\xf2\xf4\xa0\x27\x00\x00\x00") - -func confGitignoreCvsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCvs, - "conf/gitignore/CVS", - ) -} - -func confGitignoreCvs() (*asset, error) { - bytes, err := confGitignoreCvsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/CVS", size: 39, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCakephp = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\x4e\xcc\x4e\x0d\xf0\x08\x50\x30\xe6\xe2\xd2\x2f\x4b\xcd\x4b\xc9\x2f\xd2\xd7\xe2\xd2\x4f\xce\xcf\x4b\xcb\x4c\xd7\x4f\x2c\x28\xd0\x2b\xc8\x28\xe0\xd2\x2f\xc9\x2d\x00\x09\xe7\xe4\xa7\x17\x03\x69\x2e\x84\x36\x23\xa0\x36\xa0\x2a\x98\x02\x10\xd3\x19\xa2\x37\x39\xbf\x28\x15\xa2\x19\x49\x30\x25\xb1\x24\x31\x29\xb1\x18\x2a\x01\xb1\x0f\x64\x22\x20\x00\x00\xff\xff\x12\xb5\x37\x98\x88\x00\x00\x00") - -func confGitignoreCakephpBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCakephp, - "conf/gitignore/CakePHP", - ) -} - -func confGitignoreCakephp() (*asset, error) { - bytes, err := confGitignoreCakephpBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/CakePHP", size: 136, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreChefcookbook = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x2b\x4b\x4c\x2f\x4a\xcc\x2b\xe1\xd2\x4f\xce\xcf\xcf\x4e\x02\xe2\x62\x2e\x2e\x65\x05\xa7\xd2\xbc\x94\x9c\xd4\x22\xae\xa4\xcc\x3c\x7d\x2d\x2e\xbd\x24\x30\x17\xc8\xe2\xd2\xcb\xce\x2c\x49\xce\x48\xcd\xd3\x87\xb3\xf4\x72\xf2\x93\x13\x73\xf4\x2a\x73\x73\xb8\x00\x01\x00\x00\xff\xff\xa7\x83\x38\x45\x4d\x00\x00\x00") - -func confGitignoreChefcookbookBytes() ([]byte, error) { - return bindataRead( - _confGitignoreChefcookbook, - "conf/gitignore/ChefCookbook", - ) -} - -func confGitignoreChefcookbook() (*asset, error) { - bytes, err := confGitignoreChefcookbookBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/ChefCookbook", size: 77, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCloud9 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\xce\xc9\x2f\x4d\xb1\x54\xf0\x74\x71\x55\xd0\x55\xc8\x28\x29\x29\xb0\xd2\xd7\x4f\xb6\xd4\xcb\xcc\xe7\xd2\x4b\xb6\x2c\x4a\x2d\xcb\x2c\xce\xcc\xcf\x2b\x06\x71\xb8\x00\x01\x00\x00\xff\xff\xd6\x46\x6f\xbd\x2d\x00\x00\x00") - -func confGitignoreCloud9Bytes() ([]byte, error) { - return bindataRead( - _confGitignoreCloud9, - "conf/gitignore/Cloud9", - ) -} - -func confGitignoreCloud9() (*asset, error) { - bytes, err := confGitignoreCloud9Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Cloud9", size: 45, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCodeigniter = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x4f\xce\xcf\x4b\xcb\x4c\xd7\x4f\x49\x2d\x4b\xcd\xc9\x2f\xc8\x4d\xcd\x2b\xe1\xd2\xd2\xcf\xc9\x4f\x2f\x06\x11\xba\x5a\x7a\x05\x19\x05\x5c\x8a\x50\x91\xcc\xbc\x94\xd4\x0a\xbd\x8c\x92\xdc\x1c\xa0\x9a\xe4\xc4\xe4\x8c\x54\x7d\x2d\x90\x24\x84\x89\x24\x0b\x17\x03\x72\x13\x93\x93\x53\x8b\x8b\xb9\x00\x01\x00\x00\xff\xff\xdf\xbd\x69\x67\x6a\x00\x00\x00") - -func confGitignoreCodeigniterBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCodeigniter, - "conf/gitignore/CodeIgniter", - ) -} - -func confGitignoreCodeigniter() (*asset, error) { - bytes, err := confGitignoreCodeigniterBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/CodeIgniter", size: 106, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCodekit = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\x4f\xcd\x4b\x2d\x4a\xcc\x51\x70\xce\x4f\x49\xf5\xce\x2c\x51\x48\xcb\xcc\x49\x2d\x56\x28\xc9\x57\xc8\x4c\xcf\xcb\x2f\x4a\xe5\x4a\xce\xcf\x4b\xcb\x4c\xd7\x4b\x06\x4a\x67\x67\x96\x70\xe9\xe7\x66\xe6\x71\x01\x02\x00\x00\xff\xff\x7f\x93\x65\x79\x36\x00\x00\x00") - -func confGitignoreCodekitBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCodekit, - "conf/gitignore/CodeKit", - ) -} - -func confGitignoreCodekit() (*asset, error) { - bytes, err := confGitignoreCodekitBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/CodeKit", size: 54, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCommonlisp = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x73\x73\x0c\xf6\xe1\xd2\xd2\x4b\x4b\x2c\xce\x01\x52\x39\x99\xc5\x05\xba\x25\xa9\xb9\x05\x5c\x80\x00\x00\x00\xff\xff\x3a\xc8\xab\x61\x1a\x00\x00\x00") - -func confGitignoreCommonlispBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCommonlisp, - "conf/gitignore/CommonLisp", - ) -} - -func confGitignoreCommonlisp() (*asset, error) { - bytes, err := confGitignoreCommonlispBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/CommonLisp", size: 26, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreComposer = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x8c\x8d\xb1\x8e\xc3\x20\x0c\x86\x77\x9e\xc2\x52\x86\x9b\x08\x77\x37\x76\xed\x53\x74\x74\x88\x0b\x56\x21\x46\x86\x54\xca\xdb\x37\x28\x6a\xd4\xb1\x9b\x65\x7d\xff\xf7\x79\xc9\x45\x2a\xe9\x58\x22\xaa\x79\xd2\x32\x8b\x3a\x63\x06\xb8\x4a\xce\xdc\x60\x93\x55\x01\x4b\x49\xec\xb1\xb1\x2c\x3f\x15\x92\xf8\x07\xdc\x39\x11\xc4\xd6\xca\xc5\xb9\x40\xed\xd4\x88\x06\x37\x8b\x77\xbf\x7f\x76\xc2\xca\xde\xae\x15\x03\x8d\x79\x1e\xde\x88\xed\x7b\xdb\x22\x1d\x47\x17\xed\xb9\x9b\xac\x90\x71\x03\x1f\x65\x87\xa0\x09\x70\x58\x44\x09\x10\x12\x4f\x8a\xba\x7d\xd9\xfd\xb7\x07\xcf\x54\x7b\xf5\xb3\x71\xc2\xfd\x69\x5e\x01\x00\x00\xff\xff\xb9\xc9\x91\x8a\xfa\x00\x00\x00") - -func confGitignoreComposerBytes() ([]byte, error) { - return bindataRead( - _confGitignoreComposer, - "conf/gitignore/Composer", - ) -} - -func confGitignoreComposer() (*asset, error) { - bytes, err := confGitignoreComposerBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Composer", size: 250, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreConcrete5 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4a\xce\xcf\x4b\xcb\x4c\xd7\x2f\xce\x2c\x49\xd5\x2b\xc8\x28\xe0\x4a\xcb\xcc\x49\x2d\xd6\x4f\x4e\x4c\xce\x48\xd5\xd7\x82\xf2\x4a\x72\x0b\x80\x6c\x40\x00\x00\x00\xff\xff\xfc\xcd\x2d\x30\x2a\x00\x00\x00") - -func confGitignoreConcrete5Bytes() ([]byte, error) { - return bindataRead( - _confGitignoreConcrete5, - "conf/gitignore/Concrete5", - ) -} - -func confGitignoreConcrete5() (*asset, error) { - bytes, err := confGitignoreConcrete5Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Concrete5", size: 42, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCoq = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x2b\xcb\xe7\xd2\xd2\x4b\xcf\xc9\x4f\x02\x52\x65\x7a\x29\x5c\x80\x00\x00\x00\xff\xff\x29\x6e\x5d\x35\x12\x00\x00\x00") - -func confGitignoreCoqBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCoq, - "conf/gitignore/Coq", - ) -} - -func confGitignoreCoq() (*asset, error) { - bytes, err := confGitignoreCoqBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Coq", size: 18, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreCraftcms = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\x2e\x4a\x4c\x2b\x51\x08\x2e\xc9\x2f\x4a\x4c\x4f\x55\xd0\x48\x4e\x4c\xce\x48\xd5\x54\x88\xce\x28\x29\x29\xb0\xd2\xd7\x4f\x2a\xcd\xcc\x49\x29\xcf\x2c\xc9\x48\x06\x29\xd3\x4b\xce\xcf\xd5\xcf\x48\xcd\x29\xd0\x07\x73\x75\x8b\x21\xba\x74\xd3\x33\x4b\x32\xd3\xf3\xf2\x8b\x52\x63\xb9\x20\x32\xfa\x50\x19\x7d\x2d\x2e\x45\x34\x91\x9c\xfc\xf4\x7c\x7d\x2d\x40\x00\x00\x00\xff\xff\xf4\x22\xb6\xea\x78\x00\x00\x00") - -func confGitignoreCraftcmsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreCraftcms, - "conf/gitignore/CraftCMS", - ) -} - -func confGitignoreCraftcms() (*asset, error) { - bytes, err := confGitignoreCraftcmsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/CraftCMS", size: 120, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreDm = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x4b\xc9\x4d\xe2\xd2\xd2\x2b\x2a\x4e\x06\x92\x99\x79\x25\x40\x32\x27\x1b\x48\x54\x65\x16\x70\x01\x02\x00\x00\xff\xff\x1b\x86\x0d\x57\x1d\x00\x00\x00") - -func confGitignoreDmBytes() ([]byte, error) { - return bindataRead( - _confGitignoreDm, - "conf/gitignore/DM", - ) -} - -func confGitignoreDm() (*asset, error) { - bytes, err := confGitignoreDmBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/DM", size: 29, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreDart = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x54\x8e\x31\x4e\x04\x31\x0c\x45\x7b\x9f\xc2\xd2\x76\x14\x5e\x89\x33\xd0\x50\x71\x04\x94\x71\xcc\xac\x67\x3d\xb1\x95\x64\x58\xd1\x71\x0d\xae\xc7\x49\xc8\xec\x6a\x0a\x9a\xe8\xbd\x14\xcf\xff\x84\x2f\x5e\x7e\xbf\x7f\x3a\xb2\xaf\xab\x76\xec\x17\xc1\x0f\x37\xf3\x9b\x96\x19\xb3\x56\xe1\xee\x55\xa5\x21\x57\x49\x5d\x32\x4e\x5f\x18\xdb\x44\x40\xd3\xa6\x96\xcd\x67\xa0\xe1\x67\xb8\xeb\x19\x22\xf1\x35\xcd\xd2\xc6\xef\x41\x70\xc2\xb7\xfa\x28\xab\xfd\x2f\xe5\x54\xfb\xf3\xd2\x08\x9e\x68\x47\x5a\xda\xa0\xa5\xbd\xdf\x5f\xca\x12\x0f\xa7\x35\xc5\x9e\x79\x2d\x6c\x5b\x16\xbc\x5d\xa4\x60\x96\x4f\x31\x8f\x7d\x67\x8a\x30\xe5\xd4\xd5\x0b\x1e\x67\x09\xc6\xac\x16\xc2\x64\xce\x57\xf8\x0b\x00\x00\xff\xff\xa0\x25\x19\x5e\xea\x00\x00\x00") - -func confGitignoreDartBytes() ([]byte, error) { - return bindataRead( - _confGitignoreDart, - "conf/gitignore/Dart", - ) -} - -func confGitignoreDart() (*asset, error) { - bytes, err := confGitignoreDartBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Dart", size: 234, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreDarteditor = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x2b\x28\xca\xcf\x4a\x4d\x2e\xe1\xd2\x4b\x2a\xcd\xcc\x49\xc9\xc9\x4f\xe7\x02\x04\x00\x00\xff\xff\x75\xc6\x26\xcf\x13\x00\x00\x00") - -func confGitignoreDarteditorBytes() ([]byte, error) { - return bindataRead( - _confGitignoreDarteditor, - "conf/gitignore/DartEditor", - ) -} - -func confGitignoreDarteditor() (*asset, error) { - bytes, err := confGitignoreDarteditorBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/DartEditor", size: 19, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreDelphi = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x94\x4f\x6f\x24\x35\x10\xc5\xef\xf3\x29\x4a\xda\x4b\x76\x44\x9a\xd5\x5e\x10\x47\x76\xc3\x21\x12\x48\x28\x24\x88\x5b\xe4\xb6\xab\x7b\x8a\x71\xdb\x96\xff\xcc\xa4\x2f\x7c\x76\x5e\xb9\x67\xc2\xc0\x09\x2e\x4e\xda\x2e\x3f\xff\xea\x55\xd5\x7c\xa0\x97\x60\xe3\xb2\x70\xa8\x54\x0f\x5c\x98\xea\x9a\xb8\x90\x4c\xb4\xc6\x46\x67\x83\x7d\x3e\x71\xa0\x25\x66\x26\xeb\xd9\x04\xca\x9c\x62\x91\x1a\xf3\x3a\xd0\x97\x56\x69\xc4\x81\xc9\x3c\x35\x3f\xec\x3e\xd0\x63\xc5\x17\xe2\xcd\x91\xe9\x60\xf2\x42\x35\x12\xbe\xf9\x4d\x4a\x95\x30\x53\xca\xf1\x0f\xb6\x95\x4a\x6c\xd9\xf2\x40\x4f\x6c\x1c\x4e\x93\x37\xc1\x54\x89\xa1\x40\xcf\xc7\x33\xa4\x20\xf6\xc4\x5b\x18\x4d\xe2\x41\x85\x57\x68\x94\x60\xb2\xe0\xc3\xc6\x50\x8d\x04\xd5\x5c\x4c\x90\x89\x4b\xfd\xe6\x5d\x5d\x70\x8a\x67\x1d\x9d\x38\x17\xa8\x92\x84\x29\x2a\xde\xf3\x81\xd7\x0e\x18\x62\x27\x3f\x09\x9f\xd9\x91\x29\x54\xf9\xad\x52\xcc\xd0\x5d\x12\x1e\x72\x34\xae\xe4\x64\x9a\xee\x6b\x8c\xbe\x0c\xf4\x15\x6c\xe2\x38\x6b\xfe\xde\x58\x7d\x17\x8e\x2d\x74\x96\x7a\xa0\x21\xdb\x8d\x11\x6f\xec\x87\xcc\xa5\xe3\x3f\xc3\x4b\xf2\x32\x66\x93\xd7\x7e\x4c\x77\x1d\x7f\xfd\x38\xd0\x63\xa0\xe8\x1d\x3d\xb0\x4f\x07\xb9\x62\xc2\x78\x38\x73\x88\x0d\x27\x80\x2b\x30\x99\x9d\x62\xff\x2a\x01\x2e\x5c\x82\x3f\x7f\xfa\xf4\xbd\x06\x4a\xd1\x7c\x5d\xb3\x80\x9d\x72\x5c\x40\x21\xce\x6f\x0f\x69\xee\x9a\x66\x31\x13\xfb\x55\xc5\x64\x0e\x17\xb5\xfd\x50\xfd\xd8\x01\x1f\xc4\xcc\xd9\x2c\xf4\x4b\xcc\x75\x8a\x5e\x62\xbf\x3c\xd0\x4b\xd9\xf2\x47\x82\xf0\x60\x8b\x61\xa7\x35\xa7\x96\xb4\xa2\x17\x92\xef\x94\xed\xb6\x83\xe4\xbd\x75\xb4\x56\xea\x71\x2b\xea\xd4\x45\xa4\xa8\xc1\x0d\x5d\x16\xe0\x7a\xfe\x57\xf2\x9d\xcc\xb9\xd4\xc9\x7e\x93\xd2\x8c\xa7\x9f\xe4\xc4\x5f\x24\x38\x68\x94\x0b\xdb\x0f\xce\x01\x4e\xc2\xf5\xf6\xef\x3f\x7e\xfe\xaf\x14\xff\x50\x7b\xe0\x02\x4b\x38\xf7\x67\x4f\x57\x43\x50\xdb\xb8\x76\x99\x9f\xd1\x90\x33\x6b\x3f\x84\x49\xe6\x96\x7b\x77\x6e\xe6\x4e\xc8\x02\xea\xf9\xda\x6e\xff\x03\x6a\x2b\x9b\x22\x2d\x71\x54\x2d\x87\xf1\xf2\x31\xf5\x20\x2d\x9a\x52\xbb\x78\x81\x66\x34\xdb\x12\xab\x46\x8d\x6d\xa6\x89\x4d\x6d\x99\x37\xa3\x3a\xa9\x02\x00\xbc\x93\xf7\x87\xb5\x7b\x21\x9b\xef\x67\x46\x6e\xa6\x6a\x1d\xaf\x13\x73\xa7\xcd\xa0\xd5\x73\xec\xb9\xf2\xc7\xdd\x7e\xe0\x37\xc6\xea\xbc\xc7\x3a\xa6\x6d\x15\xdd\xb1\x09\x6b\x89\x58\x4c\x3a\xea\x46\xb6\x58\x17\x93\xfa\xff\xe8\x6f\x74\x79\x59\xb0\x56\x57\x7a\x7c\xc3\x8a\x56\xbf\x41\x31\xad\xc6\xbf\x29\xb6\x09\xbe\x73\x2d\x79\xb1\x7d\x47\x47\x52\x19\xec\x34\xef\xf6\xd7\x49\xc7\x20\xdd\x48\xf8\x68\x8d\xbf\x5e\x85\x1d\xf9\xbe\x24\xb6\x32\x89\x7d\xbf\xdd\x43\xf0\x17\xa3\x19\xaa\x35\xf6\xa0\x09\xa9\x2d\xce\x54\xa3\x7c\xa7\xb2\x55\x50\x29\xcb\xf1\x46\x1c\x15\xd1\x1f\xb1\xee\xfa\x68\xec\xb1\xa5\xb2\x7b\x7d\xbd\xec\x7e\x8b\xf0\x3f\xf7\x1a\xfd\xd5\x94\x6a\xbc\x18\x4c\x23\x5a\x00\x3f\x62\x76\xeb\x44\xf5\x07\x3b\xbb\xbf\x02\x00\x00\xff\xff\x24\x3f\x4e\xaa\x43\x05\x00\x00") - -func confGitignoreDelphiBytes() ([]byte, error) { - return bindataRead( - _confGitignoreDelphi, - "conf/gitignore/Delphi", - ) -} - -func confGitignoreDelphi() (*asset, error) { - bytes, err := confGitignoreDelphiBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Delphi", size: 1347, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreDreamweaver = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\x09\x57\x70\x29\x4a\x4d\xcc\x2d\x4f\x4d\x2c\x4b\x2d\x52\x48\x4c\x49\x49\x4d\x51\x48\xcb\xcc\x49\x2d\xe6\x8a\xcf\xcb\x2f\x01\x52\x29\xe5\xc5\x95\x79\xc9\x7a\x15\xb9\x39\x5c\x80\x00\x00\x00\xff\xff\x90\x76\xa1\xa2\x2f\x00\x00\x00") - -func confGitignoreDreamweaverBytes() ([]byte, error) { - return bindataRead( - _confGitignoreDreamweaver, - "conf/gitignore/Dreamweaver", - ) -} - -func confGitignoreDreamweaver() (*asset, error) { - bytes, err := confGitignoreDreamweaverBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Dreamweaver", size: 47, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreDrupal = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x51\xc1\x8e\x9b\x30\x14\xbc\xfb\x2b\xac\xed\xa5\xe5\x00\xdf\x80\x76\x11\x8b\x44\x48\x44\xd2\x43\x8f\x8e\x79\x60\x4b\xc6\xb6\xec\x07\x25\xfd\xfa\x3a\x36\x49\xbb\x52\x0e\x48\x33\xef\x99\xb1\x67\xe6\x1b\x6d\x26\x6d\x1c\x50\x6e\xf4\x28\xa7\xc5\x31\x94\x46\xd3\x51\x2a\xf0\x14\x05\x43\x3a\xb3\xdb\x7d\x89\x4c\x6a\xea\x41\x7b\x89\x72\x05\x2a\xf5\x68\xdc\x1c\x0f\xe7\x24\xcc\xc0\x17\x59\x91\x79\x40\x94\x7a\xf2\x59\x6e\x85\x25\xe4\x29\x6e\x19\x8a\x5d\xee\x21\x35\x81\x86\x70\x19\x0c\x71\x02\x1a\x73\x12\x2f\x2d\x9e\x6a\x91\x3e\x99\x75\x72\x0d\xc7\xff\x13\x1d\x60\x64\x8b\x42\x8a\xb0\x61\x7a\x30\x71\xe6\x6a\xd0\xe7\xb8\x21\x29\xde\x3f\xcb\xae\xae\xda\x63\xbd\xd3\xe3\xe9\x57\xdf\xd4\x9f\x97\x44\x9b\xee\x7c\x29\xdb\x36\x4b\xac\x6d\xde\xab\xee\x5c\x25\x72\x28\x9b\xee\x12\xbe\xaa\x3f\xa7\xc1\xcf\x53\xdd\x97\x1f\xfb\xb6\xaf\xca\x8f\x43\xc2\xe9\x69\x4c\xa9\xd7\xc3\xd9\x0c\xcb\xdd\xd0\xcb\x25\x0a\x98\xbf\xee\xfe\x19\x83\x15\xdc\x0d\x45\x08\x92\x5e\x97\xe0\x4f\x00\x7d\x8b\x7f\xbe\xd1\xd1\xa8\x01\x1c\xfd\x1e\x80\xa3\x3a\x14\xc5\x53\x12\x2b\x28\x63\xc3\xe2\x07\xc9\x05\x32\xce\xc1\x7b\xf2\x1b\xae\x79\x6a\x95\xb0\x05\x85\x71\xf2\x0f\xc4\x5e\xb8\x0b\xa5\xdd\x81\xd4\x03\x6c\x3b\xf2\x18\x9e\x15\xf1\x62\x87\x10\x74\x84\xdb\xac\x9c\xe5\x11\x16\x52\x73\xb5\x0c\x21\xe4\x62\x96\x9e\x93\x87\x3d\x12\x9a\x31\x29\xfd\xc2\x73\x27\x2d\x06\x90\xdc\x91\xbf\x01\x00\x00\xff\xff\x88\xfb\x2b\xa4\x5d\x02\x00\x00") - -func confGitignoreDrupalBytes() ([]byte, error) { - return bindataRead( - _confGitignoreDrupal, - "conf/gitignore/Drupal", - ) -} - -func confGitignoreDrupal() (*asset, error) { - bytes, err := confGitignoreDrupalBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Drupal", size: 605, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreEpiserver = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\xc6\x0a\xb8\x94\x95\x15\x5c\x03\x32\x83\x53\x8b\xca\x52\x8b\x14\xdc\x32\x73\x52\x8b\xb9\x70\xa8\xd4\xf2\xc9\x4c\x4e\xcd\x2b\x4e\xd5\x4b\xce\xcf\x4b\xcb\x4c\xe7\x02\x04\x00\x00\xff\xff\x67\x4c\x1e\xeb\x51\x00\x00\x00") - -func confGitignoreEpiserverBytes() ([]byte, error) { - return bindataRead( - _confGitignoreEpiserver, - "conf/gitignore/EPiServer", - ) -} - -func confGitignoreEpiserver() (*asset, error) { - bytes, err := confGitignoreEpiserverBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/EPiServer", size: 81, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreEagle = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\x90\xc1\x4e\xc3\x30\x0c\x86\xef\x7d\x0a\x4b\xdb\x69\x42\x95\x40\xe2\x8c\xd8\xc4\x61\x07\x24\x5e\x21\x4b\xdd\x2e\x90\xda\x91\xe3\x30\xed\xed\xb1\x53\x84\xb8\x7c\x49\xed\xff\x77\xfd\x67\x07\xe7\x85\x58\x10\x72\xaa\x0a\x33\x0b\xbc\x85\x25\xe3\x03\x04\xf8\x38\x1d\x21\x87\x3b\x37\x05\x65\xce\xc3\xb0\x83\x63\x88\x5f\xad\xc0\x9c\x32\xd6\xe1\x30\xd6\xdd\x8b\xf1\xd2\x99\x8d\xa6\xe8\x6e\x28\xc2\x9f\x18\xb5\x0b\xad\x78\x56\x88\x4c\x1a\x12\x55\x9b\x5b\x51\x52\xc8\x40\x6d\xbd\xa0\x40\xa0\x09\x04\x67\x14\xa4\x88\xd5\xfe\x04\x7a\xc5\x6e\x84\xaa\xd2\xa2\x36\xf1\x11\x4c\x60\x9b\x88\xcd\x59\x4b\x53\x94\xd1\x6a\x76\x5f\x91\x74\x33\x70\xce\x7c\x4b\xb4\x58\x10\x42\x48\xb3\xcb\xe1\x16\xbc\xcd\x70\x0d\xdf\xb8\xf9\xff\x6f\x06\x89\x62\x6e\x13\x4e\xe3\x80\xbe\xf6\x88\x65\xf6\x0c\xa7\xd7\xf7\xbf\x88\xfb\xfd\xde\x18\xd7\xe2\x11\xef\x4f\xce\xc7\x67\x8f\x6e\x0f\x72\x18\x4b\x8e\x7e\xd7\x8d\xae\x8f\x12\x3b\xeb\x60\xc7\x24\xa9\xd3\xa5\x4b\x49\xdd\xf0\xdb\x98\x36\x8e\x07\xff\x4c\x34\xb3\x9f\x58\xea\xf0\x13\x00\x00\xff\xff\x70\x3d\x63\xd8\x91\x01\x00\x00") - -func confGitignoreEagleBytes() ([]byte, error) { - return bindataRead( - _confGitignoreEagle, - "conf/gitignore/Eagle", - ) -} - -func confGitignoreEagle() (*asset, error) { - bytes, err := confGitignoreEagleBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Eagle", size: 401, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreEclipse = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x4f\xbd\x6e\xe3\x30\x0c\xde\xf9\x14\x42\x6e\xc9\x05\x38\xf9\x19\xae\x49\x97\xa0\x43\x06\x0f\x5d\x69\x99\x71\xd4\x32\x92\x20\xd2\x69\xb2\xf4\xd9\x4b\xbb\x31\x90\x76\xa1\x84\xef\xe3\xf7\xc3\x8d\x2f\xb7\x9e\x2e\xa5\xe6\x37\x0a\x0a\xfe\x4c\x8a\x3d\x2a\x82\x1f\x2a\xf6\x4c\xd0\xc5\xd4\x80\x9e\x4b\x03\x1b\x6f\x8f\xcd\x0e\xdf\x6d\xca\x87\xfd\x3f\x7d\x8a\x1d\x70\x0e\xc8\xde\x2c\x0a\x55\x8d\x24\xe0\x85\x54\x63\x1a\xa4\x01\xcf\x19\xfb\x82\x7a\x02\xf8\xe3\x9e\x03\xc7\x22\xe4\xb6\xb9\x12\xf8\x25\x73\x22\xae\x4a\x35\x21\x3b\xcd\x99\x5d\x37\x46\xee\xa9\x9a\x0f\xdd\xf1\xd6\xe0\xa7\x3b\xda\x4c\x82\x97\x29\x92\x6f\x4e\xd4\xac\x7a\xb7\x5a\x9c\x19\xc7\x14\x4e\x2e\xe4\x74\x8c\xc3\x58\x51\x63\x4e\xb2\xb2\xba\xdf\xc4\x24\xdd\xee\xda\x7f\x52\x28\xc4\x63\x0c\xe0\xc3\x43\x8b\xfd\x03\xe3\xd6\x8b\xe5\x1e\x2f\xe8\x76\x74\x21\xce\xe5\x4c\x49\xdd\x54\x46\xfe\x9a\x94\x51\x64\x39\x6d\xde\xc2\x94\xb2\xce\x99\xce\x6c\x03\x89\xe4\xea\xd6\xff\x0f\xad\x6d\x1f\x31\x58\xd7\xdb\xb2\x7f\xf8\xd1\x62\xbe\x78\xa1\xa4\x53\xba\x67\x17\x1e\x87\x98\xc0\x2b\xd6\x81\xe6\x8e\x2d\xbd\xfe\xa2\xe8\x3a\x03\xf0\x15\x00\x00\xff\xff\xa5\x1d\x59\xa8\xca\x01\x00\x00") - -func confGitignoreEclipseBytes() ([]byte, error) { - return bindataRead( - _confGitignoreEclipse, - "conf/gitignore/Eclipse", - ) -} - -func confGitignoreEclipse() (*asset, error) { - bytes, err := confGitignoreEclipseBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Eclipse", size: 458, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreEiffelstudio = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x08\xc9\x48\x55\x48\xce\xcf\x2d\xc8\xcc\x49\x2c\xc9\xcc\xcf\x53\x48\xc9\x2c\x4a\x4d\x2e\xc9\xaf\xe4\x72\xf5\x74\x73\x77\xf5\x2b\xe6\x02\x04\x00\x00\xff\xff\x6b\x6c\xf5\x49\x23\x00\x00\x00") - -func confGitignoreEiffelstudioBytes() ([]byte, error) { - return bindataRead( - _confGitignoreEiffelstudio, - "conf/gitignore/EiffelStudio", - ) -} - -func confGitignoreEiffelstudio() (*asset, error) { - bytes, err := confGitignoreEiffelstudioBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/EiffelStudio", size: 35, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreElisp = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\xce\xcf\x2d\xc8\xcc\x49\x4d\xe1\xd2\xd2\x4b\xcd\x49\xe6\xe2\x52\x56\x08\x48\x4c\xce\x4e\x4c\xcf\xcc\x4b\xe7\xd2\x4b\x4e\x2c\xce\xe6\x02\x04\x00\x00\xff\xff\x9c\x93\x49\x5c\x24\x00\x00\x00") - -func confGitignoreElispBytes() ([]byte, error) { - return bindataRead( - _confGitignoreElisp, - "conf/gitignore/Elisp", - ) -} - -func confGitignoreElisp() (*asset, error) { - bytes, err := confGitignoreElispBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Elisp", size: 36, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreElixir = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x8f\x4f\x2a\xcd\xcc\x49\xe1\xd2\x4f\x49\x2d\x28\xe6\x4a\x2d\xca\x89\x4f\x2e\x4a\x2c\xce\xd0\x4b\x29\xcd\x2d\xe0\xd2\xd2\x4b\xad\xe2\x02\x04\x00\x00\xff\xff\x32\x40\x48\x82\x22\x00\x00\x00") - -func confGitignoreElixirBytes() ([]byte, error) { - return bindataRead( - _confGitignoreElixir, - "conf/gitignore/Elixir", - ) -} - -func confGitignoreElixir() (*asset, error) { - bytes, err := confGitignoreElixirBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Elixir", size: 34, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreEmacs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x8f\xc1\x6a\x2c\x21\x10\x45\xf7\xf5\x15\x42\xef\x04\x75\xff\xde\x2a\xe4\x03\xb2\x49\x20\x8b\x81\xa1\xd0\xea\x6e\xb1\x7a\x6c\xaa\xcc\x90\xd9\xe4\xdb\xa3\x3d\x43\x02\xd9\x79\x2e\xf7\x9e\xc2\xc9\x38\xeb\xcc\x56\x13\xfd\x33\x4b\x6e\x79\xb9\x54\xa1\xff\x23\x04\xfb\x05\xa7\xc9\x9e\x26\x08\x9e\x36\x8c\xea\x13\x69\x69\x75\xff\xcb\x9e\x6b\x2c\x60\x3d\x71\x04\xfc\x68\xd5\x29\x5e\xc9\x71\xd6\x06\x4d\x70\xdb\xc1\x77\x0d\xc0\x64\x5e\x64\x71\xe3\x12\xf8\xda\x5f\x39\xb9\x3e\xc4\x96\xeb\x45\xc1\x9e\x51\xe2\x9a\xaf\x34\x7a\x33\xdf\x36\x2c\x74\xef\xda\xf3\x03\xfd\xe1\x20\x5d\x89\xd9\xcc\x99\x49\x21\xdc\x29\xac\xfd\x56\x95\xdb\x0f\x33\x6a\x4b\x59\x8e\x3e\xef\x68\x76\x8c\x05\x97\x63\xd0\x31\x8c\x5c\x68\x6e\xf4\xf9\xf0\x58\x2f\xc4\x23\x7d\x7a\x7b\x7e\xa5\x77\x33\x7e\x61\xe6\xca\x89\x04\xc2\x80\x63\x12\x51\xcb\xaf\xca\x0f\x0c\xf0\x1d\x00\x00\xff\xff\xf8\xd6\x58\x0c\x40\x01\x00\x00") - -func confGitignoreEmacsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreEmacs, - "conf/gitignore/Emacs", - ) -} - -func confGitignoreEmacs() (*asset, error) { - bytes, err := confGitignoreEmacsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Emacs", size: 320, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreEnsime = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\xcd\x2b\xce\xcc\x4d\x55\x28\x2e\x48\x4d\xce\x4c\xcb\x4c\xe6\xd2\x4b\x05\x0b\xc0\xe8\xf8\xe4\xc4\xe4\x8c\x54\x7d\x38\x37\xa7\x34\x39\x35\x0f\xc8\x07\x04\x00\x00\xff\xff\x9d\x93\x9f\xe6\x39\x00\x00\x00") - -func confGitignoreEnsimeBytes() ([]byte, error) { - return bindataRead( - _confGitignoreEnsime, - "conf/gitignore/Ensime", - ) -} - -func confGitignoreEnsime() (*asset, error) { - bytes, err := confGitignoreEnsimeBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Ensime", size: 57, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreErlang = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x0c\xc5\x31\x0a\xc3\x30\x0c\x05\xd0\xfd\x1f\xa5\x83\x72\x89\x64\x2c\xdd\xba\x1a\x5b\xf9\xd0\x14\xd9\x16\x8a\x02\x3d\x7e\x33\x3c\x9e\xf0\x1a\x47\x62\xa7\x9f\x78\xc8\xbc\x35\xd6\x7e\xe7\x96\x60\x58\xd1\xa8\xe7\x47\xf6\xab\x3b\xd8\x8e\x81\xa0\x2d\xfc\xd5\xee\xc6\xe2\x31\xbf\xd4\x84\xe8\x1c\x1a\x4c\x2e\xeb\xf6\x2e\xcf\xd7\xba\x41\x82\xad\x06\xfe\x01\x00\x00\xff\xff\x22\xc0\x70\x7f\x5f\x00\x00\x00") - -func confGitignoreErlangBytes() ([]byte, error) { - return bindataRead( - _confGitignoreErlang, - "conf/gitignore/Erlang", - ) -} - -func confGitignoreErlang() (*asset, error) { - bytes, err := confGitignoreErlangBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Erlang", size: 95, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreEspresso = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x4b\x2d\x2e\x28\xca\xcf\xe2\x02\x04\x00\x00\xff\xff\x2c\x1e\xba\x4d\x09\x00\x00\x00") - -func confGitignoreEspressoBytes() ([]byte, error) { - return bindataRead( - _confGitignoreEspresso, - "conf/gitignore/Espresso", - ) -} - -func confGitignoreEspresso() (*asset, error) { - bytes, err := confGitignoreEspressoBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Espresso", size: 9, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreExpressionengine = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x84\x8f\x41\x6e\x03\x21\x0c\x45\xf7\x9c\x02\xa9\xbb\x2c\xc2\x21\x5a\x55\xea\x3a\x07\x18\x79\x18\x0f\x58\x1a\x6c\x84\x4d\xdb\xe9\xe9\x4b\x52\x45\xd3\x4a\x95\xb2\x32\xff\xf3\xf9\x3c\x9f\x5f\x2e\xd3\xc5\xa4\xa1\x73\x4f\xfe\xad\x40\x42\x75\x74\x1b\x01\xde\xc1\xa0\x69\xb8\xeb\x08\xd5\x62\x86\xc3\xd0\x42\x1b\xee\x87\x2e\x58\x66\x6c\x53\xcd\x62\xf2\x2b\x45\x89\xc1\x7a\xc3\x09\xcc\x20\xe6\x82\x6c\xc7\x6d\x2d\x7f\xed\x41\xf1\x2a\xcd\x2b\xc6\xde\xc8\x76\xbf\x88\x67\x31\x5f\xfb\xbc\x91\x66\x6f\x19\xfd\x2a\xdb\x26\x1f\xc4\xc9\xaf\xe3\x7f\x75\xba\xab\x61\x09\xf8\x59\x1b\xaa\x92\x30\x72\x22\xc6\x10\x85\x57\x4a\x61\x19\x5b\xcc\xa0\x78\xae\xb9\x3e\xca\xfe\x8c\x5b\x72\x80\x3c\x0f\xac\x6b\x3f\x7d\xe1\x12\x9c\xe5\x5e\xe6\x41\x38\xdd\x0f\xa7\x7f\x6a\xae\x2f\xc2\xc9\x7d\x07\x00\x00\xff\xff\xc2\xf2\xa3\x41\x56\x01\x00\x00") - -func confGitignoreExpressionengineBytes() ([]byte, error) { - return bindataRead( - _confGitignoreExpressionengine, - "conf/gitignore/ExpressionEngine", - ) -} - -func confGitignoreExpressionengine() (*asset, error) { - bytes, err := confGitignoreExpressionengineBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/ExpressionEngine", size: 342, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreExtjs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x4b\x2c\x4a\xce\xc8\x2c\x49\x4d\x2e\xe1\x4a\xca\xcf\x2f\x29\x2e\x29\x4a\x2c\xd0\xcb\x2a\xce\xcf\xe3\x4a\x2a\xcd\xcc\x49\xd1\xe7\x4a\xad\x28\xd1\xe7\x02\x04\x00\x00\xff\xff\x9c\x9c\x0a\x09\x26\x00\x00\x00") - -func confGitignoreExtjsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreExtjs, - "conf/gitignore/ExtJs", - ) -} - -func confGitignoreExtjs() (*asset, error) { - bytes, err := confGitignoreExtjsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/ExtJs", size: 38, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreFancy = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x2b\x4a\x4a\xe6\xd2\xd2\x4b\xab\x4c\xe6\x02\x04\x00\x00\xff\xff\xf9\xc8\xaa\x14\x0c\x00\x00\x00") - -func confGitignoreFancyBytes() ([]byte, error) { - return bindataRead( - _confGitignoreFancy, - "conf/gitignore/Fancy", - ) -} - -func confGitignoreFancy() (*asset, error) { - bytes, err := confGitignoreFancyBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Fancy", size: 12, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreFinale = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x34\xcc\x31\x8e\x83\x30\x10\x05\xd0\xde\xa7\xf8\x62\x3b\x0a\x9a\x6d\x57\x5b\x72\x81\x9c\x60\xc0\x43\x18\x05\xdb\xc8\x03\x4e\xb8\x7d\x66\x14\xa5\x79\xb2\xbe\xff\x9f\x7e\x98\xe8\x11\xfa\x21\x4e\x06\x35\x31\xf7\xb8\xb8\x6a\x24\x89\x1f\x3d\x4f\xfb\xaf\x77\xc4\x7f\x9f\xd4\xc2\x0f\x6e\x25\x31\x1a\x57\x95\x92\x15\x65\xc1\x28\x99\x36\xc6\x4a\x8d\x41\x98\xce\x3b\x28\x47\x54\xa3\xa4\xed\x82\x7a\xce\xaf\xa3\x12\xe6\xb2\x0b\xfb\xc6\xce\x1c\x2b\x23\x9d\x2a\x33\xb4\x9c\x75\xb6\xa9\xa2\xfb\x1b\x65\xe3\x4c\x89\xff\xbd\x7b\x0d\x56\xe8\x42\xff\x7d\x86\x77\x00\x00\x00\xff\xff\x62\x6c\xcb\x45\xb8\x00\x00\x00") - -func confGitignoreFinaleBytes() ([]byte, error) { - return bindataRead( - _confGitignoreFinale, - "conf/gitignore/Finale", - ) -} - -func confGitignoreFinale() (*asset, error) { - bytes, err := confGitignoreFinaleBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Finale", size: 184, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreFlexbuilder = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4a\xca\xcc\xd3\xe7\x02\x12\xba\x29\xa9\x49\xa5\xe9\x10\x66\x51\x6a\x4e\x6a\x62\x71\xaa\x3e\x17\x20\x00\x00\xff\xff\xd4\x34\xbc\x13\x1d\x00\x00\x00") - -func confGitignoreFlexbuilderBytes() ([]byte, error) { - return bindataRead( - _confGitignoreFlexbuilder, - "conf/gitignore/FlexBuilder", - ) -} - -func confGitignoreFlexbuilder() (*asset, error) { - bytes, err := confGitignoreFlexbuilderBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/FlexBuilder", size: 29, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreForcedotcom = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x04\xc0\xcb\x0d\x80\x30\x0c\x03\xd0\x7b\xa6\x60\x82\xcc\x82\xd8\x20\x32\x6e\xf9\xb6\x28\xce\xfe\xe2\xf9\x97\xf3\x22\xca\x5c\xac\x3a\x47\x97\x29\x1e\xaa\xcd\x04\x5d\x38\xf8\x86\x6d\x6c\x4c\x0e\x70\x5f\xd6\xc0\x1d\x9d\xb2\x3f\x00\x00\xff\xff\x29\x8d\xb7\x96\x39\x00\x00\x00") - -func confGitignoreForcedotcomBytes() ([]byte, error) { - return bindataRead( - _confGitignoreForcedotcom, - "conf/gitignore/ForceDotCom", - ) -} - -func confGitignoreForcedotcom() (*asset, error) { - bytes, err := confGitignoreForcedotcomBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/ForceDotCom", size: 57, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreFuelphp = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4a\x2b\x4d\xcd\xd1\x4f\x2c\x28\xd0\xcf\xc9\x4f\x2f\xd6\xd7\x02\x41\x2e\xb8\x58\x72\x62\x72\x46\x2a\x58\x08\x10\x00\x00\xff\xff\x0f\xec\xf0\x51\x27\x00\x00\x00") - -func confGitignoreFuelphpBytes() ([]byte, error) { - return bindataRead( - _confGitignoreFuelphp, - "conf/gitignore/FuelPHP", - ) -} - -func confGitignoreFuelphp() (*asset, error) { - bytes, err := confGitignoreFuelphpBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/FuelPHP", size: 39, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreGwt = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x64\x50\xc1\x6a\x2b\x31\x0c\xbc\xfb\x2b\x04\xb9\xbc\x17\xd8\x35\x3d\xf4\x07\x5a\x9a\xd2\x4b\xe9\xa1\x90\x63\x50\x6c\xed\xc6\xa9\xd7\x36\xb6\x8b\xc9\xdf\x57\xf2\x86\x36\xa5\x17\x21\x34\xa3\x19\x8d\xb6\xa3\xf1\x58\x8a\x52\x1b\x78\x43\xf3\x81\x33\xc1\xce\x79\x2a\xb0\x51\xdb\xf1\x8c\x99\x6b\xe3\xca\xf0\xdc\x2a\x18\x34\x27\xc6\x30\x58\x30\x71\x49\x4c\xb4\xf0\x19\x5c\x15\x3a\xd3\x34\x73\x0e\xc7\x4c\xa4\x15\x77\x83\x20\x8f\xb2\xa1\x65\xff\x18\x99\x9e\x93\xc7\x4a\x30\x53\xa0\xcc\x0d\xcb\x88\x7b\xb7\x1b\x31\xd5\xc3\x37\xd0\x57\x96\x98\xe9\xd6\xb3\x9e\x5c\x98\x0b\x4c\x39\x2e\x60\x29\xf9\x78\xb9\xfa\xee\x9f\x1e\x86\x97\xd7\x9d\x5e\x87\xfa\xd7\xec\xea\x20\x82\xeb\xcd\x58\x5d\x0c\xe0\xe3\x5c\xd4\xc8\x67\x76\x80\x3d\x58\x1a\xa6\x98\x01\x7d\x26\xb4\x97\x9f\x80\x93\xfc\xe3\x6f\x20\xf9\xc7\x59\x26\x70\x2b\xbb\x92\x5b\x6b\x43\xa5\xd2\xb5\xa3\xb7\xf0\xbc\x7f\x87\x7f\x77\xe3\xfd\x7f\x30\x2c\x2e\xb9\x39\x4a\x01\xeb\x72\x3f\x61\xa8\x4b\xd2\xea\x2b\x00\x00\xff\xff\x85\xfb\x09\x41\x8b\x01\x00\x00") - -func confGitignoreGwtBytes() ([]byte, error) { - return bindataRead( - _confGitignoreGwt, - "conf/gitignore/GWT", - ) -} - -func confGitignoreGwt() (*asset, error) { - bytes, err := confGitignoreGwtBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/GWT", size: 395, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreGcov = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x48\x4f\x4e\x56\x48\xce\x2f\x4b\x2d\x4a\x4c\x4f\x55\x28\x49\x2d\x2e\xc9\xcc\x4b\x57\x28\xc9\xcf\xcf\x51\x48\xcb\xcc\x49\x2d\xe6\xe2\xd2\xd2\x4b\x4f\xce\xcb\x07\x53\x29\x89\x60\x2a\xbf\x8c\x0b\x10\x00\x00\xff\xff\x14\xe1\xe7\x19\x38\x00\x00\x00") - -func confGitignoreGcovBytes() ([]byte, error) { - return bindataRead( - _confGitignoreGcov, - "conf/gitignore/Gcov", - ) -} - -func confGitignoreGcov() (*asset, error) { - bytes, err := confGitignoreGcovBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Gcov", size: 56, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreGitbook = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x64\x8f\xb1\x4e\xc6\x30\x0c\x84\xf7\x3e\x85\xa5\x2e\x80\x48\xbb\xff\x23\x20\xb1\xf1\x0a\xbf\xda\xe4\xda\x9a\x26\x71\x88\x93\xa1\x6f\x4f\x82\x18\x90\x98\x2c\xfb\xce\xa7\xef\x46\xfa\x10\x07\xca\xd5\x43\x6f\xc3\x38\xd2\x7b\xae\xb1\x10\xc7\x82\x1c\xe0\x78\x29\x20\x2d\x92\x97\x1d\xf4\x70\x94\x92\x6e\xf3\xbc\x77\xcb\xa7\x4e\x56\xc2\x6c\x33\x96\xc2\x71\x37\xc9\xd7\x9d\xa3\x8e\xdd\xdc\xf7\xb2\xe8\x69\x36\x6e\xb1\x8f\xc3\xf4\xf3\x31\xf4\xf8\x37\x24\x44\x87\x68\x2f\x72\x9c\x61\x9b\xfb\xea\xf7\x57\x09\x01\xb1\x27\x51\x39\x58\x49\x6a\x83\x50\x4a\x19\x1b\x72\x86\xa3\xf5\x22\x95\x00\x4a\x90\xe4\xf1\x4c\x0a\xf4\xbf\x8e\xa4\x8d\xc9\x89\xd5\x29\xa6\xf0\x8b\x15\x58\xed\xbc\x2d\x5f\xa3\x1e\x52\xbd\x33\x6c\xec\x01\x7b\x9a\x70\x99\xd8\xfa\xde\x83\xb8\xde\xd8\x6c\xe2\x1d\xb2\x69\x75\xc5\xec\x5c\x86\xbf\x62\xe3\xa5\x17\x91\x93\xd6\xca\xde\x75\xa2\x54\xcb\x70\x5f\xdb\xa9\x4b\xf8\xaf\x3d\x4d\x48\x75\x6d\x23\xc8\xca\x6d\x24\xb7\x0d\xdf\x01\x00\x00\xff\xff\x6a\x7a\x89\x28\x61\x01\x00\x00") - -func confGitignoreGitbookBytes() ([]byte, error) { - return bindataRead( - _confGitignoreGitbook, - "conf/gitignore/GitBook", - ) -} - -func confGitignoreGitbook() (*asset, error) { - bytes, err := confGitignoreGitbookBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/GitBook", size: 353, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreGo = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x3c\x8e\x41\x4b\xc4\x30\x10\x85\xef\xf3\x2b\x06\xf6\xa2\x45\x22\x0a\x8a\x57\x51\xbc\x7a\xd8\xa3\x48\x49\xd3\x49\x37\x4b\x9b\x89\x99\xa9\x64\xff\xbd\xd3\x5d\xf5\x30\x99\xf7\x92\x97\x8f\xb7\xc3\x17\x5e\x4a\x9a\x69\xc4\xf7\xe1\x48\x41\x31\x9a\x91\x1b\xdc\xab\xd7\x14\xd0\xe7\x11\x5f\x4f\xd9\x2f\xa6\xe7\x34\x08\x5e\xed\x0f\xbe\xfe\xa7\xe5\x1a\x3a\xc7\x36\xde\x46\x18\x60\x87\x6f\x3c\x8f\x54\x05\x7a\x1e\x8e\xd0\x2b\x89\x6e\xb7\xcf\x35\x1c\x92\xda\x8f\xb5\x12\x4a\xa1\x90\xa2\x11\xa9\x29\x65\x49\x9c\xe5\xb6\x54\x8a\xa9\x91\x18\xe7\xe3\xe1\xf1\xe9\xfb\xeb\x13\x7e\xb7\xe3\xd5\x10\x9d\x0b\x13\xdf\xb9\x89\x2f\xea\xde\x05\xe8\x6d\xf7\x23\xc5\x35\xff\x99\x89\xf5\x54\x48\xb6\xd4\xd9\x53\x2b\x5c\xd5\x75\x70\x29\xb2\xf8\x94\xb7\x37\x43\x50\x23\x3b\xcf\xed\x3a\x57\x2a\x47\xf8\x09\x00\x00\xff\xff\xe0\xe2\xfb\x63\x0a\x01\x00\x00") - -func confGitignoreGoBytes() ([]byte, error) { - return bindataRead( - _confGitignoreGo, - "conf/gitignore/Go", - ) -} - -func confGitignoreGo() (*asset, error) { - bytes, err := confGitignoreGoBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Go", size: 266, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreGradle = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x34\x8c\xc1\x0d\xc2\x30\x10\x04\xff\x57\xc5\x22\x3e\xf0\xc0\xd4\xc0\x2b\x4a\x01\x14\x70\xe0\x8b\x75\xc8\xb2\xa3\x73\x0c\xa2\x7b\x6c\x92\xfc\x56\xa3\x99\x75\xc1\xd8\x47\xa1\x47\xd5\xe8\xaf\x44\x47\x8c\x21\x65\x13\x0c\x7f\x8e\xe1\x3e\xe2\x99\xd3\xa4\x81\x56\xf3\xc2\xf3\xec\x8a\x2c\x8b\xa6\xd0\xf5\xdb\x3b\xab\x87\xf6\xa8\x91\x3d\xfb\x58\xd3\xc4\xf0\x62\xc3\xa4\x0d\x9c\xdc\x3e\x0b\xb8\xdd\xd7\x52\x39\xc6\xef\x1a\x8a\x3f\xd3\x61\xbb\xdf\xca\xae\xd3\x2f\x00\x00\xff\xff\x4a\x7e\xce\x92\x9d\x00\x00\x00") - -func confGitignoreGradleBytes() ([]byte, error) { - return bindataRead( - _confGitignoreGradle, - "conf/gitignore/Gradle", - ) -} - -func confGitignoreGradle() (*asset, error) { - bytes, err := confGitignoreGradleBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Gradle", size: 157, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreGrails = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x91\xcd\xae\xd4\x30\x0c\x85\xf7\x79\x0a\x6b\xee\x6e\x44\x5b\x01\x4f\x00\xe2\x57\x42\x48\x88\x05\xeb\x34\xf1\xa4\xe6\xa6\x4d\x65\x3b\x94\xcb\xd3\xe3\xa6\xb7\x12\x23\xb1\x9a\xc4\xe7\x7c\x27\x67\xdc\x07\xe8\x13\x29\xa5\xa5\x30\xc2\xad\x30\x7c\x64\x4f\x59\xe0\x65\xff\x0a\xfc\x12\xed\xf7\xb5\x7b\x80\x37\x59\xa7\x52\xd3\x04\x3a\x91\x80\xd8\x39\x47\xd8\x0a\x3f\x36\x64\x2e\xa2\xf0\x0b\x59\xa8\x2c\x02\xe5\x06\xa9\x65\xbc\x00\x52\x20\x31\x5c\x6a\x4a\x28\x8a\xd1\x78\xaf\xf0\x54\x2a\x54\x41\xbb\x20\x5c\x0e\x2f\xd0\xa2\x68\x47\xc5\x6e\x23\x9d\xa0\xeb\xac\xd5\x05\x42\x99\x67\x6b\x61\x11\x5a\x20\xe1\x82\xbb\x63\xe7\xf9\xae\x36\x65\xec\x9d\x99\x36\x1c\xc1\xaf\x6b\xa6\xe0\xd5\xba\x34\x41\xdc\x60\xe3\xce\xc6\xc3\x8f\xf7\x6f\xbb\xcf\x5f\x3f\x0c\x21\x7b\x11\x13\x8c\x88\x78\xf3\x35\x2b\x7c\xfa\xfe\xed\x0b\x44\xaf\x7e\xf4\x72\x04\x4a\xfb\x6b\x2b\x97\x58\x43\x0b\x9b\x4b\x44\x37\xec\x83\x77\x63\x7f\xdd\xe1\xa3\x50\xfe\x1f\xec\xae\x66\x32\xef\x8a\xac\xf4\x7c\x95\xc0\xb4\xea\x0e\xe6\x92\xac\x96\xa8\x0f\x8f\xca\x3e\x60\x6f\x03\x37\xa8\xad\x68\x60\x5c\x0b\xab\xa9\xcd\x63\x5e\x0b\xf9\x89\x41\x81\x31\xe3\x19\xef\x86\x6b\xbf\x79\x6e\x72\xae\x89\x96\x3b\x55\x76\xf9\x0f\xad\x56\xb6\x89\xfd\xef\x39\xef\xd6\x92\x23\xf2\x09\xd0\x62\xcf\xe7\x6c\x55\x8e\x5d\xc9\xe9\xfe\x67\x5f\xe7\xc0\xd8\x8b\xe2\x6c\xc5\x3c\x3f\x5d\x60\xac\x64\x5f\xff\xf9\x25\xf5\x9c\x50\xdd\xdf\x00\x00\x00\xff\xff\xfc\x27\x5b\x79\x47\x02\x00\x00") - -func confGitignoreGrailsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreGrails, - "conf/gitignore/Grails", - ) -} - -func confGitignoreGrails() (*asset, error) { - bytes, err := confGitignoreGrailsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Grails", size: 583, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreHaskell = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x2c\x8d\xd1\x0a\xc3\x30\x08\x45\xdf\xfd\x94\x41\xed\x27\x0d\xab\xed\x12\x3a\x34\xd4\x2c\xcb\xfe\x7e\x96\xe4\xc1\x73\x10\xb9\x5e\xc9\x5e\x81\x69\xa3\xf7\x22\x7b\x83\x07\x5a\x4c\xca\x01\x9e\x74\x4c\x61\xf9\xe9\xd3\xa6\xe3\x80\xa9\x70\xc0\x77\x6d\x80\x23\xee\xa4\xb2\x59\x5f\xc7\x37\x9c\x2b\xb2\xe9\x91\x5f\x91\x2c\x97\x1d\x21\xfa\xf4\xbb\xa1\x00\x7a\x25\x3e\x97\xaf\x5d\xe7\x0a\xff\x00\x00\x00\xff\xff\x4a\x8c\x40\x7c\x87\x00\x00\x00") - -func confGitignoreHaskellBytes() ([]byte, error) { - return bindataRead( - _confGitignoreHaskell, - "conf/gitignore/Haskell", - ) -} - -func confGitignoreHaskell() (*asset, error) { - bytes, err := confGitignoreHaskellBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Haskell", size: 135, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreIgorpro = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x24\xcb\x31\x0e\xc2\x40\x0c\x44\xd1\x9e\x53\x8c\x44\x47\xc1\x01\xe8\x28\x38\xc8\xb2\x9e\x80\x25\xe3\xb5\x12\x2f\x4a\x6e\x4f\xb2\x34\x5f\xaf\x98\x39\xe3\xfe\x6d\x2a\x50\xaf\xd6\x45\xfd\x85\xc7\x1a\x9c\xf5\x43\x4f\x4c\x6a\x5c\x6e\xc8\x37\x37\xd4\xe2\x78\x12\x75\x66\x49\x0a\x8a\x0b\x28\x7a\xd0\x5a\x2d\x66\x1b\xb2\x21\xb9\xe4\x31\x87\xc6\xf4\x7f\x9f\x2e\xd7\x58\x63\x34\xf7\xf6\xe1\xbe\xfb\x17\x00\x00\xff\xff\x31\x87\x73\x89\x79\x00\x00\x00") - -func confGitignoreIgorproBytes() ([]byte, error) { - return bindataRead( - _confGitignoreIgorpro, - "conf/gitignore/IGORPro", - ) -} - -func confGitignoreIgorpro() (*asset, error) { - bytes, err := confGitignoreIgorproBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/IGORPro", size: 121, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreIpythonnotebook = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x08\x49\xcd\x2d\xc8\x2f\x4a\x2c\xaa\x54\x48\x49\x2c\x49\xe4\xd2\xcb\x2c\xa8\xcc\x4b\x8a\x4f\xce\x48\x4d\xce\x2e\xc8\xcf\xcc\x2b\x29\xd6\xe7\x02\x04\x00\x00\xff\xff\x05\xae\x85\xc7\x25\x00\x00\x00") - -func confGitignoreIpythonnotebookBytes() ([]byte, error) { - return bindataRead( - _confGitignoreIpythonnotebook, - "conf/gitignore/IPythonNotebook", - ) -} - -func confGitignoreIpythonnotebook() (*asset, error) { - bytes, err := confGitignoreIpythonnotebookBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/IPythonNotebook", size: 37, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreIdris = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\xcb\x4c\x4a\xe6\xd2\xd2\xcb\xe7\x02\x04\x00\x00\xff\xff\x91\x9b\x77\x19\x0a\x00\x00\x00") - -func confGitignoreIdrisBytes() ([]byte, error) { - return bindataRead( - _confGitignoreIdris, - "conf/gitignore/Idris", - ) -} - -func confGitignoreIdris() (*asset, error) { - bytes, err := confGitignoreIdrisBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Idris", size: 10, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreJdeveloper = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x3c\x8e\x41\x4a\x04\x41\x0c\x45\xf7\x75\x8a\xc0\x6c\xa5\xfb\x0c\xe2\x38\xe0\x4a\xc1\x13\xc4\xd4\xef\xb1\xec\x74\x57\x91\xa4\x1c\xfa\xf6\x16\x23\xba\x0b\xe1\xfd\xf7\xff\x89\x32\x16\xee\x1a\xc4\xad\x69\x11\x8e\x52\x77\xf2\xa8\xc6\x57\x50\x2e\x06\x19\xf7\x41\xdd\x91\xe9\xe3\xa0\xf8\x04\xbd\x9c\x9f\xe9\x0d\xb6\x54\xdb\x78\x17\xd0\x13\xcb\xf8\x2e\xe0\xe8\x86\x34\x65\x0e\x9e\x53\x3a\xfd\x66\x06\x45\x8f\xe7\xcb\x50\x1e\x0a\x27\x19\x6c\xd9\xaf\x29\xb0\xb5\x3b\xf4\x57\x5f\x7b\xb4\x1e\xff\x8d\x05\x9e\x44\xd9\x1d\x3e\xa7\x8c\xa6\xf5\x98\xd3\x17\x7f\x73\xae\x72\xcf\x69\x95\x95\x96\xa2\x78\x20\xa6\xc6\x36\x0c\x0b\xbd\x1a\x8b\x8e\x41\x86\x8c\x3d\x0a\x2b\xbd\x0f\x17\xe8\x62\xbc\xe1\x56\x6d\x4d\x72\x63\x55\xc4\xe4\x5e\x27\x95\xf5\x27\x00\x00\xff\xff\xa4\x69\x70\x04\xff\x00\x00\x00") - -func confGitignoreJdeveloperBytes() ([]byte, error) { - return bindataRead( - _confGitignoreJdeveloper, - "conf/gitignore/JDeveloper", - ) -} - -func confGitignoreJdeveloper() (*asset, error) { - bytes, err := confGitignoreJdeveloperBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/JDeveloper", size: 255, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreJava = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x1c\xcb\xb1\x6a\xc3\x30\x10\xc6\xf1\x5d\x4f\x71\xe0\xa5\x35\x45\x82\x8e\xdd\xdb\xc1\x60\xe8\xd0\xdd\x5c\xe5\x8b\x25\xe7\xe4\x13\x3a\xc5\xca\xe3\x47\xc9\xf2\x1f\x3e\x7e\xdf\x68\x3d\xa3\xaa\x31\x03\xcc\xf2\x1f\x99\xe0\x4f\x84\x15\x2e\x52\x60\xc2\x13\xe1\x6d\xfa\x9c\xbf\xdf\x8d\x4d\x75\xb7\x35\x65\xf7\x94\xbf\xe8\xaf\xb8\x11\xfc\x74\xaf\x30\x98\xd1\xee\x58\x7a\xdb\xab\xd4\xdb\xd1\x19\x4b\xbd\x21\x43\x42\x1f\xe2\x41\xe0\x0b\x6a\x00\x96\x4d\x3f\x40\x89\x20\xd4\x9a\xbf\x9c\x6b\xad\xf5\xf7\x89\xd6\x4b\x72\x74\xb8\x55\xda\xc1\x82\xab\x0b\xc4\xd9\x51\x29\x52\x96\x20\x55\xb3\x54\x7b\x4f\x6c\x82\x2e\x7d\x5c\x72\x5c\x47\xf3\x08\x00\x00\xff\xff\x9e\x86\x1d\x0c\xbd\x00\x00\x00") - -func confGitignoreJavaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreJava, - "conf/gitignore/Java", - ) -} - -func confGitignoreJava() (*asset, error) { - bytes, err := confGitignoreJavaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Java", size: 189, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreJboss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x84\xd0\x3d\xae\xc3\x20\x0c\xc0\xf1\x9d\x53\x20\x65\x63\x88\x2f\x91\x6c\x4f\x7a\x5d\x3b\xba\xc1\x89\x92\x38\x05\x01\xfd\xba\x7d\x5b\x55\x4e\x55\x05\x94\x85\xe5\x6f\xf1\x03\x4f\x27\x17\x23\x44\x0a\x57\x0a\x80\xcc\x60\xc9\xb3\x7b\x80\x0f\x6e\xa2\x2e\xd5\x74\x4f\xea\x67\xc6\x52\x8f\x17\x4e\xbb\x73\xcb\x78\x1e\x17\xdc\xbf\xef\x6d\xb2\x1b\xc0\xd4\xaf\x73\x9b\xd2\xe2\xc1\x18\x30\xdb\x62\x31\x61\x21\xdd\x5c\x98\x33\x49\x9e\x5e\xe0\x24\xe7\xc9\xf5\xdf\x79\x56\x72\x81\x96\x6d\x14\x68\xc9\x79\x7a\x5d\x65\x9e\x96\xfc\xa5\x55\xa5\x3f\x6b\x27\xab\x3d\x76\x33\x0e\xa4\xfb\x91\x29\xea\x4a\x29\x53\x37\xed\xe1\xef\xff\xd8\x36\xea\x19\x00\x00\xff\xff\xdd\x36\x93\x3f\xfd\x01\x00\x00") - -func confGitignoreJbossBytes() ([]byte, error) { - return bindataRead( - _confGitignoreJboss, - "conf/gitignore/Jboss", - ) -} - -func confGitignoreJboss() (*asset, error) { - bytes, err := confGitignoreJbossBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Jboss", size: 509, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreJekyll = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x8a\x2f\xce\x2c\x49\xd5\xe7\xd2\x2b\x4e\x2c\x2e\xd6\x4d\x4e\x4c\xce\x00\x71\xb2\x52\xb3\x2b\x73\x72\x74\x73\x53\x4b\x12\x53\x12\x4b\x12\xb9\x00\x01\x00\x00\xff\xff\xa0\x2d\x85\xce\x25\x00\x00\x00") - -func confGitignoreJekyllBytes() ([]byte, error) { - return bindataRead( - _confGitignoreJekyll, - "conf/gitignore/Jekyll", - ) -} - -func confGitignoreJekyll() (*asset, error) { - bytes, err := confGitignoreJekyllBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Jekyll", size: 37, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreJetbrains = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x74\x92\x4f\x8f\xda\x30\x10\xc5\xef\xf9\x14\x23\x71\x69\x2b\x02\x77\x6e\x5b\xd8\x56\xa0\xae\xb4\x5a\xd4\x33\x72\xe2\x49\x32\x5d\xc7\x76\x67\xc6\x85\x7c\xfb\x3a\xfc\xa7\xea\x5e\x10\xf9\x3d\xcf\xcc\x9b\x67\x4f\x60\x19\xfe\x20\x0b\x6c\x50\xbf\xb2\x21\x2f\xb0\x5e\x3d\xcb\x02\xd6\x5e\xd1\x39\xda\x4c\xe1\x2d\x55\xc3\x0b\x79\x9c\xc2\x6b\x17\xb7\x1a\xb8\x9f\xc2\x53\x8c\xcb\x60\x47\x34\x2c\x3b\x33\x92\xe5\x0f\x0a\x3e\x0b\xde\x72\x20\x0b\x5b\x4d\x96\x42\x51\x7c\x99\x51\xef\x8a\x62\x32\x81\x15\x31\xd6\xb9\x7a\x28\x2b\x23\x68\x21\x72\xf8\x95\x01\x34\xb9\xa1\xd1\x45\x31\x23\x8b\x66\x5e\x4c\x80\x1a\x18\x42\x02\xc6\x3e\x3b\x03\xed\x10\x4c\x35\xfe\xe3\xe4\xf2\x40\xa3\xe0\xd0\x88\x02\xb5\x3e\xf0\x49\x6f\x82\x73\x61\x4f\xbe\x5d\xe4\x49\xf0\x53\x90\x4b\x89\x58\x53\x43\x35\x88\xa6\xa6\x59\x64\x7c\xea\xbf\x0f\xfc\x2e\xd1\xd4\x38\x3b\x64\x5f\x17\xaa\x46\xde\xe5\x81\x58\xaa\x35\x2f\x64\x98\x50\xc6\xa6\x5b\xf4\x42\x4a\xd9\x46\x60\xe8\xa8\xed\xca\xba\x4b\xec\xa1\x21\x87\x72\x6b\x6f\x8d\x9a\x6d\x48\x5c\xa3\x64\x20\xff\xe5\xf7\x63\xe4\xb7\x5b\x7d\x20\xd9\xc1\x9b\x9e\xea\x07\x96\x68\x85\x92\x17\x47\x3e\xe2\xcc\xbf\xb3\xb1\x0e\x6f\x06\xda\xe3\xf7\x43\x91\xa3\x8a\xaf\x7b\xbc\x04\xdf\x06\x78\x3e\x44\x97\xc3\x63\x88\x2e\xb5\xe4\x6f\xe5\xfd\x28\x6f\x51\x35\x87\x29\xe7\x19\x13\xf8\x96\x97\xfc\xe0\xd6\xf2\xfd\x46\x1e\x7f\xf7\x72\x3c\xfa\x7a\x6c\x78\x8b\xff\x9c\x4f\x1e\x70\x79\x50\xc5\x3c\x24\x9d\x8f\xa4\x8f\xe8\x34\x78\xf4\x73\xa9\xb4\x1c\xe7\x9f\xfd\x9c\xde\xc2\xae\x0f\x36\x5f\xb9\x1c\xcf\x6e\xd6\x6f\x4f\x17\xd5\xa8\x33\x22\x64\xfc\x58\x53\x9e\xe0\x25\x8f\x25\x1b\xe9\xdc\xa0\x54\xcb\xf9\x38\x7c\xca\x5e\xff\x79\x97\x60\xbc\xbd\x1a\xfa\x5c\xd4\xa1\xdf\xd5\xb7\xc2\x1d\x1e\x62\x60\xdd\x89\xf2\x35\x86\x3b\x79\x96\x33\x88\xc8\x3a\x26\x7a\x87\xcb\x2a\x91\xb3\xf7\xe2\xdf\x00\x00\x00\xff\xff\x62\x56\x37\x27\x5c\x03\x00\x00") - -func confGitignoreJetbrainsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreJetbrains, - "conf/gitignore/JetBrains", - ) -} - -func confGitignoreJetbrains() (*asset, error) { - bytes, err := confGitignoreJetbrainsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/JetBrains", size: 860, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreJoomla = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x5c\xdd\xb2\xe3\x28\x0e\xbe\xef\x47\x99\xaa\x39\xd9\xda\xae\xa9\xda\xeb\xbd\xd9\xc7\x48\x11\x87\x24\xf4\xb1\x8d\xd7\xc6\xa7\x4f\xf6\xe9\x17\x0c\x98\x1f\xf3\x27\x79\x2e\x66\xfa\x04\x7d\x9f\x84\x09\x06\x21\x89\x5c\x3e\x9e\x4c\xb0\xe7\xc8\x67\xfa\xe3\xf2\xf1\x12\xa4\xeb\xe8\xb2\xfc\xb8\x90\xfb\xc0\x46\xb6\x88\x99\x08\x3e\x5f\x3a\xd2\xbd\xe8\xe5\x8f\x43\x33\x1f\x26\x3e\xd2\x51\x2c\xea\xcf\xeb\x26\xac\xa3\x7e\x91\xef\x2a\x48\x90\xe7\x52\x05\xdd\xc8\x38\xd2\xb9\x8e\x6b\xeb\xfd\xc4\x17\xc1\xc6\x45\x90\xbe\xaf\x62\x7f\x71\x3e\xf4\x64\x9d\xee\x44\xd4\x15\x77\x7c\x14\xf2\xc3\x4b\xca\xf9\xfc\x6e\xe8\xad\xa0\x4f\x3e\x33\xda\xf0\x60\x2f\xda\x7d\x36\x0c\xb9\xec\xc1\x83\x3d\x9b\x3a\x4a\x3a\xd1\xfa\x40\x75\xdc\x44\x46\x5a\x1f\xcc\x07\x1b\xef\x74\xae\xc2\xcc\x77\xd3\x80\xec\xc9\xf8\x5c\xc9\xb3\x61\x00\x7b\xfe\x6c\x18\xbe\x81\xde\x19\x69\x40\x8d\x6b\xdd\xe2\x20\xdf\xae\xa6\xae\x0d\xfc\xbe\xf6\x0d\xb8\x91\xfe\x5e\x1e\x94\xde\xeb\xc8\xa9\x5f\xe5\xd3\xd6\x71\xb3\x7c\xdc\x99\x36\xcc\x83\x85\x92\xb9\x7b\xd5\xdf\x65\x3a\x4c\xbd\x9c\xd4\x75\xcb\xeb\xd2\xf2\x3a\xff\xa6\xb7\x9e\x8d\x9f\x65\xa0\x9a\x53\xdf\x72\x3d\x1b\xfa\x18\xf4\xa2\xfd\x74\xa4\xb2\xb1\xeb\xd7\x7b\xaa\x8f\x76\x36\x5d\xe8\xf8\xe7\x7f\xfe\xad\xff\xff\x61\x17\xb2\x0f\x09\x84\x11\x96\xf7\x02\x22\x85\xab\xc7\x19\x2a\xd4\xb2\xbf\xc8\xe1\x89\x50\xab\xde\x32\x8c\xe6\x41\x6d\x2e\x4c\xce\x51\x32\xfd\xa2\x23\x98\xaa\x36\x2a\x38\x01\x62\x45\x2e\x04\x57\xf9\x58\x62\xd1\xfb\x2b\x9a\x07\xb1\x39\xf5\xcf\x2b\x59\xc5\x4b\xce\x1e\x26\xf7\x23\xc6\x47\x39\x99\xf8\x27\x6b\x9f\x07\x79\x0d\xd0\x7e\x98\x59\x6c\x77\xa7\x53\x5c\xac\x6d\xbd\x45\x9d\xa1\x42\x2d\x6b\x9a\xe7\x0c\x9c\x64\x63\xed\xeb\x81\x3b\xc7\x3d\x61\x5b\x8e\xe0\x19\x2a\xd2\xf2\xbe\xa7\x9e\x57\x80\x20\x83\x96\x94\x98\x87\xec\xb0\xdd\x53\x4f\x71\xa1\xb6\x77\x8f\x4e\xa9\xd8\x3f\xfc\x1d\x2a\xa0\x3d\xf9\xef\xca\xa4\x23\x2d\x67\x0d\x6e\xd3\x2b\xa8\x80\xf6\x44\xfb\x54\xf0\x39\xe0\xf3\xc0\x36\xdf\x8b\xdc\xff\x76\xb7\xb9\xe3\x77\xd8\xa3\xa7\xf8\xd0\x3e\x88\xdf\xfc\x21\x17\x0b\x3e\xab\x4d\xe3\x2a\xb8\x98\xce\xd2\xcf\xf5\xe0\xbd\xde\xd8\x27\x6d\xf7\xb7\xf2\x1a\x20\xfd\x10\x53\x7f\x65\x0b\x43\x10\xda\xac\x58\x07\xe9\xfb\xe8\x16\xe7\xbd\x56\x90\xd7\xe1\x18\x50\x4f\xca\x9c\xe6\x51\x1c\xb0\x53\xad\x22\x02\x08\x06\xdc\x0e\x78\xfb\x8e\x68\x60\x8b\x3a\x24\x80\xe2\x20\x8e\x26\x0f\xf6\xc4\x50\x30\x87\x20\x88\xef\xe7\x73\x90\x07\x2e\x14\x07\x6c\x6b\x8b\x90\x60\x28\x50\x4b\x40\x0f\xd6\xa3\x40\x2d\xc1\x37\xf2\x90\x05\xb5\xb7\x47\x7b\x90\x2c\xb0\x3d\x15\x33\x42\x30\xa0\x76\x06\xc2\x7a\xc1\xe1\x34\x15\xac\x42\x30\xe0\x76\xc6\x15\xc3\x80\xdb\xd1\x01\x33\x1c\x09\x6c\x4d\x47\xdd\x50\x1c\xa8\x2d\xf8\x21\x21\x64\x81\x23\x2b\x3a\xfe\x87\xe2\x40\x6d\xd9\x18\x22\x8e\x04\x8e\xdf\x6c\xce\x2f\x86\x02\x0e\xf7\xd8\x58\x26\x92\x05\xb5\xb7\x45\x44\x11\x0c\xa8\x1d\xf0\xf9\x2f\x20\x81\xad\xcd\x64\x9a\x80\x1b\x84\xe5\x40\x6c\xb5\xe2\x7a\x76\x33\xa7\xb6\x76\x0a\xef\x48\xcf\x16\xfa\x31\xbd\xa6\xe6\x70\x5c\xb7\x2e\x82\x0f\xa0\x08\x9e\xa1\x40\x03\x86\x6a\x85\x80\x13\xa0\x56\xb6\x39\xdd\xfe\x8e\x7b\x14\xb0\x25\xfe\x7c\x02\x9f\xc8\x50\x10\x96\x80\x41\x56\xf8\xf6\xae\x58\x6a\x37\x84\x13\xc0\x56\xd6\x5e\x30\x25\x55\x91\x60\xc0\x7e\x9d\xe2\x42\x6d\xf3\x51\xae\x0e\xed\xa7\x2c\x8f\x02\xb5\x34\xf1\x69\xed\x49\xfb\x7a\xe2\x73\xa0\xb6\xf6\x38\x0f\x92\x85\x09\xfd\x03\xbf\x38\xe4\xf7\xb5\xac\x37\xf0\xa4\xb4\x1c\xa8\x2d\xc1\x44\x0f\x9b\x1a\x9a\x01\xb6\xc3\x79\x7f\x03\xce\x0c\xcb\x81\xda\x5a\xc7\x99\x12\xd8\x1a\x65\x28\x50\x4b\x5f\x72\x8b\x67\xc0\x19\x68\x39\x27\xd3\x40\xf4\x9b\x48\x5f\xe6\x54\x1e\xc8\xaa\x38\xd9\x93\xa7\x3a\x20\x9d\x57\x70\xb2\x17\x40\xb7\x21\xaf\xe1\x64\x3f\xfa\x3b\x81\x45\x4c\x53\x7c\x70\x7a\x8c\x4c\xa2\x7b\x11\xe9\xb8\x9b\xbf\x4e\xb2\xb1\xe9\x39\xaa\xbe\xc9\xae\xe7\xe4\xf3\x2c\x1d\xdb\x03\x79\xd6\x7c\xb1\x13\x4c\xac\x5d\xc4\xf4\x8b\xa8\x58\xcb\x72\xb8\xee\xfa\xe4\x7b\x96\x8e\xed\xc1\x24\x85\x37\xb9\x7e\xe2\xbe\x74\xc7\x3e\x63\x7f\x24\x5f\xec\xb9\xbd\x41\x7f\x87\x0a\x6c\x4f\xbe\x38\x30\x59\x15\x10\xa1\x56\xe5\x29\x5d\xca\x97\xab\xca\xf3\x0c\x6c\x9e\x39\x2c\x65\x97\xa0\x63\x7b\x30\x72\x80\x7f\x79\x20\x62\xad\x0a\x36\xbe\x87\x0e\x67\xd8\x72\x91\xb6\xff\xfc\x16\xf7\x2b\x99\xe5\xaa\x0d\x7c\xed\x52\xfc\x33\x7d\x60\x83\x44\x9c\x64\x9f\xb1\x8f\x7b\xf7\xd3\x1a\xce\xf4\x43\xb9\x6f\x03\x9f\xf1\x43\xb1\x2b\x00\xf7\xe2\x5b\xbe\xc1\x0b\xd2\x05\x39\x90\xf1\x09\xf3\x5d\xd5\xa9\x9c\x79\xac\x05\x99\x36\x47\x96\xcb\x1c\xd9\x58\xfb\x98\x72\x99\x98\x7b\xc2\x36\xb4\x5c\x26\xa2\x22\x2d\xe3\xaa\x5d\x0e\x64\xa4\x75\x54\xe9\x4a\xcc\x45\x96\x4c\xc0\xf2\xc8\x07\x22\xd2\xea\x9d\xde\xd6\xf6\xb4\xeb\x81\x88\xb4\xfa\x62\xcf\x57\x2f\xff\x03\xce\xb0\x98\x7c\xb2\x38\xe5\xc1\x7a\x01\xac\x11\x4a\x6b\xc0\xf6\x83\xa3\x46\x5e\xd2\xf8\x8a\x1a\x39\xc3\x3c\xd1\x5d\x24\x75\xfa\x09\x3b\x50\x7a\x34\xa4\x45\x70\xd2\x28\xc5\x45\xdb\x1e\xe8\x70\xc3\xcd\xac\x9d\x8b\xb4\xbd\xd0\x07\x96\x06\xb5\xa8\xb2\x43\x76\xa7\xe9\xa4\xef\x21\x80\xce\x7b\x8a\x8f\xea\x03\xc2\x69\xf1\x79\x28\x9b\xd3\xcc\xe5\xcb\x0f\x5b\xaf\x03\x22\xb4\x94\xeb\xd6\xaf\x54\xd5\xde\xb7\x7b\xa9\x21\x0b\x6a\xef\x45\xc4\x0b\xf0\x85\x7a\x14\x88\xa5\x7a\xf1\x58\xfe\xf2\xc5\x0e\xe4\x5f\x74\x9e\x59\xf9\xc2\x45\x5e\xcd\x40\x46\xf6\x90\x83\x94\x60\xdb\x7b\x33\x2e\x79\x56\xc6\x28\xdf\xa3\x8c\xd0\x29\xab\x0a\x66\x4b\x36\x55\x31\xa9\xcb\x46\x3e\x44\xc5\xd2\x2b\x88\x30\x29\x53\x06\xeb\x74\x4a\x19\x63\xf2\x20\x65\xd0\xee\xa8\x97\x61\x2d\x7d\x32\x19\x83\x32\x68\x0b\xf6\x57\x20\x3a\x4a\x5f\x06\xe9\xf8\x7a\x19\x63\x02\xe3\xf5\x27\x5b\x72\x17\x1c\x2d\x30\x3f\x5f\xdd\x15\xa8\xfd\xe5\x3e\xaa\x71\x20\x55\xd1\x59\x92\xeb\x97\xb6\x84\xd0\x5b\x44\xd1\x46\xb6\xb3\x5a\xb2\xe5\xb5\xf7\x9b\x93\x37\xfd\xdc\x5d\xcf\xb6\x7f\xb2\xf7\x30\x33\x77\x3d\xb3\xf7\x11\xab\x57\x25\x33\xf7\x42\xf3\x37\x17\xf3\x77\x15\xb3\xd7\x0e\xe3\x9b\x77\x5b\xe1\x55\x4a\x60\xef\x01\x96\xae\xe0\x65\xef\xc8\xe5\xee\xba\x15\x6e\xb7\xc5\x22\x5d\x02\x11\x49\xfc\x2f\x72\x0b\xac\xc8\x49\xe6\xbe\x10\xd3\xb2\x6c\x29\x17\x79\xb4\x26\x5e\xa3\xde\x4b\xdd\xe7\x84\xa6\x89\xff\xa6\xd2\xb5\xba\xde\xde\x1f\xd3\xf8\xfc\x11\x5c\x93\x33\x25\x7b\x5b\xe8\x52\x7d\xce\x96\x6e\xb8\x8b\x72\x59\x88\x5f\x4a\x5a\x02\xb9\x2a\xd0\x2c\xca\xaf\x74\xcc\x82\x5c\x7d\x7d\x12\x62\xaf\x91\xf4\xac\x00\x52\x55\x23\x0f\xee\xf9\x60\xc5\x8e\xef\x47\xf3\xac\x2e\x76\x1f\x89\x82\xca\x05\x49\x34\x28\x35\xf5\x81\x65\x9d\xb1\xbb\x94\x05\xca\xd7\x9d\x2c\x4b\x1b\x50\x59\xf6\xbd\xdd\x12\x76\x15\x8f\x7f\x35\x20\x17\xa6\xe6\xe7\xe4\x5f\x0f\xcb\x3f\xb8\xab\x70\xcc\x66\x3b\x9b\x26\x41\x58\x5a\x98\xcf\x07\xcb\xb9\x12\x96\x18\xb4\x41\xcb\x4f\xb2\xc3\xe5\xa3\xb3\x46\xcd\x16\x5a\xd7\x1c\xd7\xee\xe6\x9d\x4d\x4a\xff\xf7\xb3\x09\x53\xff\x62\xa2\x38\x50\x56\x9f\x74\xa7\x05\x97\x6b\x47\xe9\x99\x43\x5c\xdd\xb6\x5f\x02\x98\x05\x79\xd5\x74\x59\x4c\x18\x4e\xca\xc3\xfc\x12\xb6\xcc\x1a\x22\x7d\x82\xb6\x17\xb0\xe9\x1d\x2e\x80\x82\x5a\xb4\xec\x9c\x30\x71\x7f\xe9\xc6\xc8\x91\x62\x5f\xb4\x32\x85\x0e\xf0\xfa\xac\xdb\x29\x71\x1c\x16\xc4\x80\xdb\x79\x83\xf1\x00\x1b\x7e\x91\x5b\x33\x1a\xa0\x5f\xbd\x35\x20\x2c\x40\x77\xdb\xaa\x75\x80\xd7\x2d\x04\x97\x75\xaa\xa8\x06\x7d\xca\x4f\xef\xe6\x75\xb8\x41\x90\x75\xbd\x7e\xc5\x65\x0d\xd4\xb0\xaa\xee\x55\x95\x65\x48\x83\x26\xce\x45\x71\xf5\xf0\x40\x75\x6d\x56\xd0\x8e\x6b\xd0\xe9\xea\x20\x2b\x98\xba\x2e\x57\x56\x56\x86\xd4\x35\xcd\x64\xbc\xab\xdb\x22\x2e\xfd\xd8\x06\x6d\xd0\x4c\xd5\xab\x7b\xbf\xaa\x9f\x02\x80\x61\xeb\xba\xab\x9b\x93\x07\x6a\xd0\xa6\xce\xa2\x4d\x98\x06\x5d\xef\xf1\xae\x4a\x80\x6a\x83\xe9\x70\x75\x9d\xdb\x2e\xdb\xb6\x6c\x06\xd0\xba\xe6\x86\xbd\x39\x80\x35\x68\x7c\xf1\xc5\xaf\x53\x6d\x01\x36\x68\xad\x3a\x07\x3e\xaa\xee\xa4\xc9\x63\xf9\xc0\xba\x36\x50\x9b\xcb\x77\xfd\xe7\x3f\x1a\x51\x6d\xfa\xfe\x6a\xc2\x94\x75\x6d\x71\xc5\x42\x24\xf1\x20\xf2\xee\xb2\xa6\xe3\x8a\xc9\x48\xa2\x74\xa9\x66\xb2\xfd\xbc\x52\x27\x5f\x5e\xed\x32\xf9\x4d\x1b\x71\x6f\xd0\xce\x57\xd8\xb6\x1f\x81\x0e\xcd\xea\xb4\x13\x36\xee\x07\x9b\xb0\x39\xdd\x21\x89\xe5\xf2\xec\x17\xf5\x49\x95\x4a\xc9\x69\x12\xb5\xaa\x30\xce\x83\xcf\x83\x69\xe7\x3a\x2e\xa2\x43\x14\xe6\x29\xcc\x87\x20\xd6\x61\xdb\x74\xae\xd9\xb5\x98\x9a\x04\xd7\xe0\xa2\x20\xe6\xb3\x0d\x7e\x98\x8f\xfe\x76\xe2\x9a\xed\xf0\x7b\xb6\x8a\x89\xfe\x1c\x2c\xfe\x81\x2d\x87\x89\x13\x8a\x4e\xea\x62\x5e\xfa\xb3\x3f\xc6\x7e\x2c\x2f\x76\x6c\x37\x46\x4a\x1e\xfe\x12\x57\x09\xf2\xce\x02\x5c\xf0\x38\x29\x56\x0e\x5d\x56\xe8\x85\x66\x7d\xb9\x17\xdd\x09\x9a\x9d\x63\x14\x8b\x5c\x1c\x3c\x15\xf9\x0e\xda\xdc\x44\xf1\x5b\x37\x47\x24\x6e\x0d\xbf\xfe\x54\xa0\x3b\x15\xda\xf6\xdb\xfc\x2d\xfa\x20\xf3\xf7\xd8\x58\xe8\xa2\x6a\x87\x20\xed\xa1\xd1\xee\x5c\xb1\xc0\xdf\x7b\x62\x99\x1f\x84\x0b\xda\xf7\x5d\xe0\x20\x71\xb1\xb9\x54\x38\xd8\xfe\xf6\x56\x58\x75\x7b\x31\xa5\xd0\x8a\x95\x41\x6c\x45\xca\x05\xb9\x5b\x9f\x32\x00\x55\xd8\x5b\x10\xa7\x3a\x69\xca\x71\x2f\x7b\x61\xae\xcf\xb7\x4d\x49\xa2\x09\xb6\xba\x82\xda\x80\x69\xa5\xc7\x87\xb6\x22\x37\xfd\x62\xc9\x56\x26\x9b\x12\x1c\x07\xc0\x4a\x5c\x89\x69\x4a\xba\xd7\x7f\xe5\x84\xae\x2e\x33\x85\x50\x95\x93\xa9\x76\x2f\x12\x1d\x8b\x52\x23\x66\x97\x5d\x57\x0c\xe9\x33\xad\x54\x95\x2b\xa6\xda\x4d\x35\x61\x4a\x54\x30\xa6\xea\xce\x2e\x66\x91\x49\x50\x37\xf1\xfe\x4a\xa6\x84\xc9\xa1\xf3\x01\xb6\xa8\x2d\xab\x3d\xd5\x39\xbb\x31\xa4\xe6\x87\x13\x1e\xbf\x6e\x27\x4b\xa9\x35\x33\xaa\x20\x0a\x57\xf9\x58\xe8\x6d\x94\x09\x91\xc9\x2c\x44\x92\x20\x1f\x10\xc9\x6c\x02\x23\x6a\xf6\x17\x1c\x2b\x0a\x7e\xf0\xd0\x36\xba\x4c\x5c\x62\x27\x3d\x82\xe2\x7d\xf4\x88\x48\x8d\x8c\x59\x5e\xd3\x23\x63\x85\x89\x91\xf1\x44\xd1\xc8\x18\x49\x72\x64\x8c\x2c\x35\x04\x46\x14\x0f\x9a\x69\x4e\x76\x5d\x3b\x01\x7b\xe2\x2a\x6a\xdf\x2a\xa0\x12\xed\x81\x3b\x11\xc9\xec\x3e\xa7\xde\xd1\x82\x58\xd7\x15\xa5\x00\x3c\x65\x51\xd7\xf5\x24\x04\xd3\xcf\x29\xd1\xea\xff\x28\xe3\x41\xa4\xcb\x4f\x12\xa2\x85\x3e\x12\xad\xa9\x71\x0b\x7e\xbb\xc6\xe7\xa8\x6d\xf2\x12\x56\x7c\x1c\xc4\x89\x37\x76\x6b\x3f\xbe\xac\x5b\xb3\x29\xa7\x38\xb4\xa7\xfa\xe5\xb7\xb9\xe4\xa5\x3e\xeb\x28\x05\x5e\x66\x55\x45\xa9\x8f\x4d\xf2\x0c\x73\x6c\xfc\x2b\x6c\xda\x03\xcd\x61\xb3\x73\x28\xd3\x69\x53\x31\x4c\x3a\x17\xa7\x72\x57\xeb\xac\x6b\xf8\x37\x77\xdc\x4b\xa1\x9a\xe8\xed\x76\x4a\xf9\xe3\x43\x7c\x8b\x1f\xff\x0f\x00\x00\xff\xff\x55\xf9\xae\x71\x73\x57\x00\x00") - -func confGitignoreJoomlaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreJoomla, - "conf/gitignore/Joomla", - ) -} - -func confGitignoreJoomla() (*asset, error) { - bytes, err := confGitignoreJoomlaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Joomla", size: 22387, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreKdevelop4 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\xcb\x4e\x49\x2d\x33\xe1\x82\x50\xfa\x5c\x80\x00\x00\x00\xff\xff\xe2\x3d\x7b\x0d\x10\x00\x00\x00") - -func confGitignoreKdevelop4Bytes() ([]byte, error) { - return bindataRead( - _confGitignoreKdevelop4, - "conf/gitignore/KDevelop4", - ) -} - -func confGitignoreKdevelop4() (*asset, error) { - bytes, err := confGitignoreKdevelop4Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/KDevelop4", size: 16, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreKate = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x08\x2e\x4f\x2c\x50\x70\xcb\xcc\x49\x2d\x56\x50\xe6\xd2\xd3\xd2\xcb\x4e\x2c\x49\xd5\x2d\x2e\x2f\xe0\xd2\x03\x12\x7a\x5a\x5c\x80\x00\x00\x00\xff\xff\xe9\xbe\x25\x0c\x22\x00\x00\x00") - -func confGitignoreKateBytes() ([]byte, error) { - return bindataRead( - _confGitignoreKate, - "conf/gitignore/Kate", - ) -} - -func confGitignoreKate() (*asset, error) { - bytes, err := confGitignoreKateBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Kate", size: 34, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreKicad = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\xcd\xb1\x0e\x82\x30\x10\x80\xe1\xbd\x4f\x71\x09\x8b\x98\x50\x98\xd9\x10\x75\x31\x31\x0c\xee\xa6\xb4\x07\x34\x40\x4b\xda\x23\xd5\xb7\xb7\xd5\xd5\xe5\x1f\x2e\xf7\xdd\x65\x70\xb5\x0e\xba\xf6\xe4\x41\xa1\xd7\xa3\x41\x05\xbb\xd7\x66\x84\x9b\x6e\x9b\x73\x0d\x13\xd1\x56\x97\x65\x08\x81\xcf\x5a\x0a\x55\x6c\xb2\xe7\xd6\x8d\x25\x63\x19\x3c\x70\xdd\xac\x13\xee\x0d\x83\x5e\xd0\xb3\x23\xaf\xaa\x2a\xb6\x17\x73\xaa\x4c\xfd\xaa\x67\x54\x45\x9a\x46\x74\x47\x5a\xb4\xa7\x1f\x81\x03\xbe\xe2\x09\x8a\x6f\x07\x67\x57\xb8\xa0\x97\x13\xae\x22\x8f\xd2\x20\xa5\xfd\x66\x27\xeb\xec\x4e\xe8\xfe\x93\x4e\xf6\x06\x43\xce\xb8\xf2\x86\x7d\x02\x00\x00\xff\xff\x7b\x7d\x33\x82\xd0\x00\x00\x00") - -func confGitignoreKicadBytes() ([]byte, error) { - return bindataRead( - _confGitignoreKicad, - "conf/gitignore/KiCAD", - ) -} - -func confGitignoreKicad() (*asset, error) { - bytes, err := confGitignoreKicadBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/KiCAD", size: 208, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreKohana = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4a\x2c\x28\xc8\xc9\x4c\x4e\x2c\xc9\xcc\xcf\xd3\x4f\x4e\x4c\xce\x48\xd5\xd7\xe2\x42\x16\xcb\xc9\x4f\x2f\x06\x0a\x01\x02\x00\x00\xff\xff\x96\xfe\x7e\x2e\x27\x00\x00\x00") - -func confGitignoreKohanaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreKohana, - "conf/gitignore/Kohana", - ) -} - -func confGitignoreKohana() (*asset, error) { - bytes, err := confGitignoreKohanaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Kohana", size: 39, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLabview = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x34\x8d\x31\x0e\xc2\x30\x0c\x00\xf7\xbc\xc2\x52\x17\xe8\x90\x57\xc0\x16\x26\x06\x66\x3b\xb1\x84\x91\xd5\x54\x71\x80\xf2\x7b\xe2\x4a\x5d\x4e\xd6\xc9\x3e\x4f\x90\x84\x1a\x36\x61\x0b\x73\xd4\x8f\x0a\xad\x3e\x28\x85\x30\xc1\xfd\x89\x8d\x0b\x54\x7a\x71\xee\x06\x27\x59\x72\x84\x87\x2c\xa5\x7e\x0d\x2e\x29\xd9\x79\xec\x16\xd5\x41\xab\x3b\xe2\xec\xe6\x37\x32\x7e\x7f\xdd\x38\xbf\x3b\x92\xee\x75\xde\xd8\xe5\x8d\x3b\x16\xec\x38\x0c\xaa\xa0\x1d\x9f\x57\x0b\xff\x00\x00\x00\xff\xff\x58\x5e\x95\x08\x8e\x00\x00\x00") - -func confGitignoreLabviewBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLabview, - "conf/gitignore/LabVIEW", - ) -} - -func confGitignoreLabview() (*asset, error) { - bytes, err := confGitignoreLabviewBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/LabVIEW", size: 142, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLaravel = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x4f\xca\xcf\x2f\x29\x2e\x29\x4a\x2c\xd0\x4f\xce\xcf\x2d\xc8\xcc\x49\x4d\xd1\x2b\xc8\x28\xe0\xd2\x4b\xcd\x2b\xd3\xd3\x42\x30\x61\x0c\x2e\x40\x00\x00\x00\xff\xff\xab\x96\x52\xb8\x31\x00\x00\x00") - -func confGitignoreLaravelBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLaravel, - "conf/gitignore/Laravel", - ) -} - -func confGitignoreLaravel() (*asset, error) { - bytes, err := confGitignoreLaravelBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Laravel", size: 49, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLazarus = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\x90\x4d\x4e\xc4\x30\x0c\x85\xf7\x3d\x85\x25\x36\x80\xc4\xf4\x0c\xec\x41\x2c\xe0\x02\x4e\xe2\x76\x32\x63\x12\xcb\x4e\x24\x86\xd3\xe3\x74\x98\x9f\xcd\x97\xaa\xf5\x7b\x5f\xe3\x07\x78\xc3\x5f\xd4\x6e\x10\xeb\xb7\x64\x26\x7d\x59\xa9\x90\x62\xa3\x04\x21\x17\xd4\x4c\x06\x8f\x86\x0b\x41\xab\x90\x88\xa9\xd1\xd3\xf4\xbc\xa3\x1f\x72\x26\x66\xa7\xd5\xf1\x78\xe2\x1c\xfc\x64\x35\xa7\xd2\xe0\x7f\x67\x1a\x9f\xc3\xea\x14\xe9\xce\x31\x5e\xd5\x81\xd3\x74\xfb\x01\xec\xad\xde\xdc\x8b\xe7\x5c\x9c\xba\x70\x8e\xdb\x9b\x5c\x96\x3a\xcc\x6a\x6d\xe3\x61\x93\xb5\xfb\x0a\xae\x11\xf9\x12\xed\xe6\x97\x31\xa1\x98\x97\x1c\xaf\x69\x16\xbb\x4f\x04\x8c\xc7\x2e\x2e\x2f\x09\x7a\xc9\x0d\x6a\x6f\xd2\x1b\x2c\x95\x13\xa9\xed\x7c\xf4\x6b\x4f\x46\x10\xb1\x40\xf0\x63\x8f\x65\x1d\xab\x39\xc1\xe8\xf7\xda\x4b\xd5\x2c\x5a\x0f\x14\xbd\x41\x5a\xae\xc5\xa3\xe7\xee\xd9\xa5\x01\x8f\x93\x6f\x67\x1e\xe6\x57\x39\xdf\xc8\x67\x20\xf4\x92\x98\x5c\xa6\xf0\x8e\x11\x3e\x3e\xc7\x4e\xc4\x23\x7f\x01\x00\x00\xff\xff\x63\xeb\xe3\x17\x97\x01\x00\x00") - -func confGitignoreLazarusBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLazarus, - "conf/gitignore/Lazarus", - ) -} - -func confGitignoreLazarus() (*asset, error) { - bytes, err := confGitignoreLazarusBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Lazarus", size: 407, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLeiningen = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x3c\xcb\x41\x0e\x42\x31\x08\x04\xd0\x3d\x47\x31\x69\x7b\x26\xac\xf8\x3f\x4a\x5b\x02\x34\xd1\xdb\x5b\x4d\xe3\x0a\xe6\x65\x46\x47\xcb\xaf\x26\xb0\x6f\x46\xaf\x70\x79\xa0\x41\x11\xbe\x16\x28\x55\xd0\x9d\x7c\x7d\x81\x76\x50\x7c\xe9\xa4\xfa\x1c\x33\x16\x66\x21\xee\xe9\x46\xea\xc9\x67\xdb\xd1\x48\x25\x9d\xec\x31\xec\xbd\x49\x65\x1e\xdc\xff\x83\x3b\xb2\x4c\x23\x87\xdc\x7f\x65\x1d\x16\xf0\x09\x00\x00\xff\xff\xb1\x74\x97\xa1\x8a\x00\x00\x00") - -func confGitignoreLeiningenBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLeiningen, - "conf/gitignore/Leiningen", - ) -} - -func confGitignoreLeiningen() (*asset, error) { - bytes, err := confGitignoreLeiningenBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Leiningen", size: 138, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLemonstand = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x54\x4f\xcb\x6e\x84\x30\x0c\xbc\xf3\x15\xae\x7a\xa8\xb4\x87\xf2\x49\xab\x6c\x6c\xc0\xaa\xb1\xa3\xd8\xa8\xdd\xbf\x6f\x02\xdd\x0a\x4e\xf3\xc8\x4c\x92\x79\x98\xc5\x67\x59\xca\xc0\x8a\xf4\xf3\xc7\x3c\x92\xc8\xce\xc7\x6c\x3a\xf1\x3c\xde\x86\xb7\x17\x3d\xe0\xff\x34\xaa\x89\x50\xf5\x16\x19\x59\x39\x3a\x8a\xcd\xbb\x6e\x99\x6a\x09\x3b\x0d\x5a\x4b\xc7\xad\x48\x73\x08\x8f\xf8\xfe\x10\xd5\xfb\xc4\x42\x7b\x63\x35\xdc\x3a\x7d\xa4\xfc\x45\x8a\x17\xab\xdd\x7a\xd6\x79\xbd\x34\xb2\x55\x3a\x6b\x27\x77\x36\xbd\x58\x8b\x95\x8b\x7e\x7a\xfb\xd6\xd9\xd9\xfc\x58\xf2\x0e\x09\x11\xfa\x3a\xd2\xb8\xdf\xfa\x58\xe0\x09\x9e\xb6\x01\x9a\x7e\x04\x7c\x27\x0d\xa0\x9a\x9c\x20\x0b\xb7\x10\xe4\x25\xe9\x4c\x0e\x61\xaf\xde\xf0\x1b\x00\x00\xff\xff\x01\x92\x39\x8f\x5c\x01\x00\x00") - -func confGitignoreLemonstandBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLemonstand, - "conf/gitignore/LemonStand", - ) -} - -func confGitignoreLemonstand() (*asset, error) { - bytes, err := confGitignoreLemonstandBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/LemonStand", size: 348, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLibreoffice = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\xf0\xc9\x4c\x2a\x4a\xf5\x4f\x4b\xcb\x4c\x4e\x55\xc8\xc9\x4f\xce\x2e\xe6\xd2\xab\x03\xd1\x7a\x5a\xca\x5c\x80\x00\x00\x00\xff\xff\x7a\x7d\x60\x16\x1e\x00\x00\x00") - -func confGitignoreLibreofficeBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLibreoffice, - "conf/gitignore/LibreOffice", - ) -} - -func confGitignoreLibreoffice() (*asset, error) { - bytes, err := confGitignoreLibreofficeBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/LibreOffice", size: 30, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLilypond = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x2b\x48\x49\xe3\x02\x92\xc5\x40\x22\x37\x33\x25\x13\x42\x01\xc9\x9c\xfc\x74\x2e\xad\x3a\x2e\x40\x00\x00\x00\xff\xff\x80\x9a\xc4\xa4\x21\x00\x00\x00") - -func confGitignoreLilypondBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLilypond, - "conf/gitignore/Lilypond", - ) -} - -func confGitignoreLilypond() (*asset, error) { - bytes, err := confGitignoreLilypondBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Lilypond", size: 33, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLinux = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x3c\xcc\xb1\x0e\xc2\x30\x10\x03\xd0\xfd\xbe\xc2\x12\x5b\x25\xfa\x15\x30\xc1\xc8\x0f\x9c\xd2\x2b\x39\x01\x49\xe4\x1c\x02\x16\xbe\x9d\x74\x61\xb4\x65\xbf\xe9\x2b\xb2\xc3\xe9\x70\xc4\xe2\xb4\x14\x95\x1f\x34\xda\x6a\xb4\x92\xac\xcb\xfc\xaf\xb7\xdd\xd9\xcb\xf3\x8d\xa0\xf6\x8c\xb5\xde\x17\x23\x5e\xd9\x53\xc6\xc3\xaf\x39\xa0\xad\x99\x12\xb5\x40\xcb\x60\x94\xe1\xe1\x23\x55\x0e\xbd\xdf\x64\xbe\x6c\xcf\xfd\x24\xbf\x00\x00\x00\xff\xff\xa3\x64\x8a\xcf\x76\x00\x00\x00") - -func confGitignoreLinuxBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLinux, - "conf/gitignore/Linux", - ) -} - -func confGitignoreLinux() (*asset, error) { - bytes, err := confGitignoreLinuxBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Linux", size: 118, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLithium = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xca\xc9\x4c\x2a\x4a\x2c\xca\x4c\x2d\xd6\xd7\xe2\x2a\x4a\x2d\xce\x2f\x2d\x4a\x06\xb2\x4b\x72\x0b\x80\x7c\x40\x00\x00\x00\xff\xff\x1a\xab\xaa\xaa\x1c\x00\x00\x00") - -func confGitignoreLithiumBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLithium, - "conf/gitignore/Lithium", - ) -} - -func confGitignoreLithium() (*asset, error) { - bytes, err := confGitignoreLithiumBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Lithium", size: 28, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLua = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x3c\x90\x31\x4f\xfc\x30\x0c\xc5\xf7\x7c\x8a\x48\xb7\xfc\xff\x1d\x32\xa1\xea\x76\x40\x62\xa8\x04\x12\x03\x23\x4a\x1c\xf7\xea\xbb\x70\x89\x9c\x46\x84\xfb\xf4\xd8\x41\x30\xf4\xd7\x27\xeb\xf9\xf9\xb5\x07\x7b\x9f\x3f\x0a\x25\x8c\x76\x69\xde\xd6\xdc\x18\xb0\x9a\xd4\x3c\xb8\xdc\x76\x63\x0e\x56\x34\x67\xb8\x54\x1b\x1a\xa5\x68\x57\x31\x57\x33\xb9\xca\xe0\x74\x2e\xf2\x46\x45\xb8\x7b\x76\xa7\x9b\x6e\x3c\x87\x33\xc2\xfe\xe7\xcc\xfa\xa8\xb8\x0c\x15\xce\x42\x4c\xab\x3a\x5f\x18\xe1\xf7\xfe\x13\xfa\x88\xac\xbe\x13\x6c\xc2\x22\x14\xcb\x42\x81\x3d\xd3\x48\x4a\x14\x84\x5e\xd5\x80\xe6\x45\x5c\x35\xaf\x17\x35\xbf\x6e\x9e\x25\x2a\x8f\x02\xd5\xfe\xa3\x2b\x38\xfb\x46\xd7\x98\x3f\xab\x7d\x58\x96\xfa\x5f\x37\x52\xd2\xfe\x79\xc0\x4d\x3a\xf9\xd2\x64\xd9\x7f\xec\x08\x6d\xf7\xe1\xa7\x38\x76\xd4\xc2\xf2\x1b\xe4\x68\xd1\x6f\xa4\xe9\x38\xcb\xab\x1f\xe7\xf7\xf9\x4e\xc4\x86\xdd\x98\xef\x00\x00\x00\xff\xff\x02\x2b\x5e\x62\x44\x01\x00\x00") - -func confGitignoreLuaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLua, - "conf/gitignore/Lua", - ) -} - -func confGitignoreLua() (*asset, error) { - bytes, err := confGitignoreLuaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Lua", size: 324, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreLyx = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\xf0\x4c\xcf\xcb\x2f\x4a\x55\xf0\xa9\x8c\x50\x48\x4a\x4c\xce\x2e\x2d\x50\x48\xcc\x4b\x51\x48\x2c\x2d\xc9\x2f\x4e\x2c\x4b\x55\x48\xcb\xcc\x49\x2d\xe6\x52\x56\xc8\x28\x29\x29\xb0\xd2\xd7\x2f\x2f\x2f\xd7\xcb\xa9\xac\xd0\xcb\x2f\x4a\xd7\xe7\xd2\x02\x31\xeb\x20\x94\x32\x17\x20\x00\x00\xff\xff\x47\x56\xf9\xb0\x4b\x00\x00\x00") - -func confGitignoreLyxBytes() ([]byte, error) { - return bindataRead( - _confGitignoreLyx, - "conf/gitignore/LyX", - ) -} - -func confGitignoreLyx() (*asset, error) { - bytes, err := confGitignoreLyxBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/LyX", size: 75, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreMagento = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x56\xcd\x8e\xe4\x28\x0c\xbe\xe7\x51\xe6\x90\x48\xbb\x4f\x50\x5b\x93\x91\x46\xaa\x9e\x69\x75\x8d\x76\x56\x7b\x29\x11\x70\x12\x77\xf1\x27\x20\xdd\x55\xfb\xf4\x6b\xa0\x52\x3f\xdd\x09\x17\x62\xfb\xfb\x62\xb0\x31\x86\x7a\x0c\x8c\x73\xf0\xbe\xf6\x4c\x59\x09\x55\xad\x8c\x18\x30\x34\x49\x50\x4c\x37\x15\xb3\xb6\xe1\x46\x00\x0d\x4a\x4d\x1a\xc3\xb9\x79\x1e\x0d\x68\x3c\x2d\x62\x5b\xf5\x60\x76\x90\x55\x01\x1e\x07\xdd\x30\xa1\x50\x8f\x41\x49\x32\xf4\x6c\x92\xe1\xfa\xbd\x67\xf5\xce\xe8\x00\x5a\x34\x1d\xf3\xb0\x8c\xb8\x77\xb1\x0c\xcc\xfe\x3a\xc9\xf4\xb1\x4c\x29\x4e\x3d\x83\x68\x47\xa3\x57\x16\x31\x73\x28\x55\xe0\xf4\x32\x07\xe8\xe3\xac\x43\x0a\xe4\x42\xbf\xa7\xa1\xf6\x81\x49\x99\x7f\x85\xc0\xa3\xab\x49\x82\x6f\xda\xeb\x6f\x87\x2f\x9f\xc0\x27\x36\xc0\x61\x23\x65\x7d\x52\x72\x05\xb4\x58\x04\xff\x28\xa0\x53\x18\x8d\xc3\xff\x40\x43\x58\x67\xfd\x35\x69\x21\x61\x1d\xdf\x32\x1b\xf8\xc8\x0a\x04\x4a\x0c\x6a\x28\xc4\xb0\x35\xca\xa2\x04\x57\x62\xe8\x1e\x87\xc9\xb1\x4e\xc2\xfe\x9d\xd1\x84\xe0\x8b\x6c\x0d\xbc\x10\xd3\x76\x72\x0e\x34\x3f\xef\xcf\xaa\x33\x85\x85\x7d\x35\xef\x5a\x1a\x26\xe2\xb4\xeb\xac\xef\xca\x1a\x17\xda\x53\x1c\xd7\x59\x3b\xf2\xf3\x0b\x7c\x81\xf1\x93\xd1\x86\xac\xc3\xcf\x34\x6c\x19\x45\x5e\xa0\x80\xf3\xe8\xa9\x1a\x0b\xb3\xfc\x06\x28\x78\xf8\x8d\x62\x28\x55\xc3\x3f\x4a\x96\xb2\x7b\xe9\x17\x87\x27\x3a\x49\xe7\xce\x98\x23\x2d\x68\x91\xb8\x55\x87\x17\x10\xe8\xf7\xd4\x91\xd0\xe8\x07\x0e\x7d\x25\x82\xa8\xed\x65\x9f\x25\x85\x74\x05\x79\xaa\x84\x07\xfe\xed\xe0\x3d\x98\xa5\xe1\x2c\xed\x6d\xcd\x84\xc0\x40\xb3\xb0\x25\x30\x00\xb5\x43\x16\xe0\x33\x94\x2c\xd7\xbe\x99\xb4\x84\x5d\x7a\x44\xcc\x47\x6d\x47\x5b\x35\x9c\x5a\x40\x92\x92\xe0\xc7\x4a\x5c\xea\x06\x5c\x53\x81\x73\xc6\xf9\xa6\xea\xd9\x1b\xd2\xe2\x6b\x1a\xaa\x26\xe6\x38\xfe\x80\x9a\xcb\x89\x3a\x44\x53\x51\x83\x10\x70\xba\x18\x2f\xd2\xdc\xaa\xe7\xe6\x91\xd0\x57\x9f\x3b\x5e\x1d\x9b\x6b\xd4\xe2\x8a\xb4\x60\x34\x15\x29\x77\x4d\x28\xa9\xa7\x40\x63\x94\x7a\x74\xd0\x4d\x43\x96\x25\xf3\x63\x92\x6e\x93\x92\xf2\xea\xb9\x91\x26\xfb\x91\xd8\xa5\xaf\xa2\x20\x93\x60\x9d\x09\x26\x9c\x6d\xd6\x3c\x77\x68\x29\x31\x93\x34\x53\xf6\xef\x2d\xe3\x74\x82\x07\xec\xa3\x46\x07\xfe\x7c\x50\x3c\x93\xdf\x98\x43\xa0\xa6\x19\x7d\xfe\xf9\xd5\x03\x9f\xe2\x5d\x11\xb5\x8d\x8d\xf5\x9c\xe5\x5e\xc2\x29\x4b\x83\x31\x83\x04\x02\xf8\xd1\x4c\x21\xdb\x6e\xdb\x10\xb5\x1d\xea\x1d\x76\xe0\x62\x5f\xf9\x46\xed\x37\x73\x9e\xd2\x5a\xa3\xf4\xdc\x6e\x5e\x2e\x12\x48\x36\x98\x2c\x53\x98\x34\x79\x8a\x2c\x0e\x7f\xdf\x2d\xeb\xdf\xd8\xc0\x93\x14\x6f\xb5\xf4\x75\xb1\x3c\x6f\x8e\x75\x20\x2f\xbb\xef\xdb\xf6\xc7\xbe\x3d\x6c\xbe\xed\xea\x70\x0a\xb3\x9e\xb7\x62\x56\xee\x80\x43\xdb\x7e\xa9\x52\x0e\x2b\x45\xee\x58\xc3\x27\x1f\x8c\x8a\x65\x91\x75\x31\xca\xab\x78\xd7\x6b\x66\xdb\x2d\xea\xac\x63\xea\x34\x33\x4a\x25\xca\xf3\x59\x9c\x2d\x9c\x51\x99\x98\x21\x6e\x96\x98\xc8\xcc\x73\x7a\x97\x41\xaa\x7a\x0e\xa3\x91\xb1\x4a\xaf\x17\x24\x1d\x3e\x4c\xf5\xa0\x3b\xe2\xbd\x26\xdf\x16\x98\x4b\x03\x89\x54\x94\xa8\x71\x2e\x4c\x7b\x1c\x50\xf7\x94\x98\x97\x76\xd7\x6e\x28\xde\x1f\x3f\x7f\xb5\xfb\x94\x01\x3f\x02\xdd\x76\xac\xf3\xc1\x31\x9e\x8b\x3d\x9b\xf8\xdc\xec\x6f\xa6\x54\x85\x0f\x16\x5a\x67\xd6\x90\x8e\x27\xb3\xe9\x34\xfa\x23\x16\x9f\x15\x2b\xf8\xed\x44\x64\xc6\x87\x27\xc7\xa3\x2d\x3d\x36\x1e\x4d\x1f\x9e\x19\x6b\xe0\xf4\xc9\xd7\xf2\x02\x3f\xc1\x7d\xbc\x89\xc6\x35\x74\x00\x97\xde\x66\xcb\xe8\xfc\x64\x59\x46\xe7\xc7\xca\x23\xfa\x31\x1f\xd7\x87\xc9\x5b\xdc\xe0\xff\x03\x00\x00\xff\xff\xd0\x6b\xd2\x32\x27\x0a\x00\x00") - -func confGitignoreMagentoBytes() ([]byte, error) { - return bindataRead( - _confGitignoreMagento, - "conf/gitignore/Magento", - ) -} - -func confGitignoreMagento() (*asset, error) { - bytes, err := confGitignoreMagentoBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Magento", size: 2599, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreMatlab = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x9c\x90\xbd\x4a\x04\x41\x10\x84\xf3\x79\x8a\x92\x4d\x74\x41\xef\x21\x44\x8c\x0e\xc1\x0b\xbc\xb4\xd7\xe9\xbb\x6b\x77\x7e\x96\xe9\x9e\x75\x4d\x7c\x76\x67\x10\x0c\x05\xed\xf8\xab\xe2\xab\x1e\x86\xdb\xbf\x9f\x1b\x06\x3c\x73\xcc\x2b\x83\xaa\x65\xa5\x95\x15\x67\x4e\x5c\xc8\xd8\x63\xfa\x80\x5d\x18\x7b\xb2\x40\x13\xd8\x8b\xe5\xd2\x23\x2f\x8c\x4b\x43\x71\x16\xc3\x29\x17\x4c\xf4\x3a\xd7\x45\xaf\xdc\xff\x24\x5c\x6b\x94\xe4\xf3\xbb\xc2\xf3\x89\x6a\xb0\x1f\x1b\xf0\x66\x9c\x54\x72\x72\xe3\x1d\xe9\xda\xd9\xa7\xc3\x11\x3b\x8c\x49\xb6\xdf\xf1\xf8\xd9\xe9\xfb\x1c\x17\x09\x6d\xcc\xfe\xe1\x88\x49\x12\x15\x69\x1b\xaf\x29\x04\x2c\x81\xac\xe9\x47\xbd\xe9\x34\x6f\x63\xe7\x0f\x12\x6b\x90\x34\xb7\xa0\x67\x3c\x7e\xff\xa2\x17\x6a\x58\xca\xdb\xce\x7d\x05\x00\x00\xff\xff\x00\x28\x67\xe1\x68\x01\x00\x00") - -func confGitignoreMatlabBytes() ([]byte, error) { - return bindataRead( - _confGitignoreMatlab, - "conf/gitignore/Matlab", - ) -} - -func confGitignoreMatlab() (*asset, error) { - bytes, err := confGitignoreMatlabBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Matlab", size: 360, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreMaven = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\xcb\xc1\x09\xc3\x30\x0c\x46\xe1\xbb\x77\x89\xb3\x43\x07\xe8\x0e\x4e\xf4\x63\x44\x2d\x59\xc8\x72\x48\xb7\xef\x25\x84\xd0\xdb\xe3\xc1\x17\xc5\x2b\x62\x4d\xd6\x25\x9f\xd2\x72\x94\x7a\xb7\xa3\xa1\x0c\xbc\xca\xfe\x99\x76\xdf\x03\x3e\xb8\xeb\xf8\xdb\x8a\x33\xd2\x25\xb2\x79\x37\x78\x30\x46\x22\x18\x94\xa0\xfb\x77\x71\xd0\xdc\x41\xcb\x45\xd2\x36\xb9\xd1\x7b\xca\x06\x7f\x8a\x2c\x87\xae\xc1\xc2\x5a\x9f\xfb\x17\x00\x00\xff\xff\x17\x6e\xed\x25\xaa\x00\x00\x00") - -func confGitignoreMavenBytes() ([]byte, error) { - return bindataRead( - _confGitignoreMaven, - "conf/gitignore/Maven", - ) -} - -func confGitignoreMaven() (*asset, error) { - bytes, err := confGitignoreMavenBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Maven", size: 170, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreMercurial = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xcb\x48\xd7\xe7\x02\x12\x99\xe9\x79\xf9\x45\xa9\x20\x56\x71\x66\x7a\x31\x98\x2e\x4d\x82\x52\xc5\x25\x89\x25\x60\xa9\x92\x44\xa0\x14\x20\x00\x00\xff\xff\x5c\x2f\x20\x72\x32\x00\x00\x00") - -func confGitignoreMercurialBytes() ([]byte, error) { - return bindataRead( - _confGitignoreMercurial, - "conf/gitignore/Mercurial", - ) -} - -func confGitignoreMercurial() (*asset, error) { - bytes, err := confGitignoreMercurialBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Mercurial", size: 50, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreMercury = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xf2\x4d\x2d\x4a\x2e\x2d\xaa\xd4\xe7\x82\x32\xf4\x72\xf3\x53\x4a\x73\x52\x8b\xb9\xb4\xf4\x72\x33\x80\x44\x6a\x51\x11\x90\xcc\xcc\xcb\x2c\x01\x52\x29\x39\x39\x20\xa1\x8a\x54\x20\x99\x08\xc4\xc5\xf9\x20\xc1\xca\x9c\xcc\x24\x20\x9d\x94\x9a\x98\x0b\xd2\x96\x02\xc4\xc9\xf1\x29\x89\x25\xa9\x5c\x80\x00\x00\x00\xff\xff\x41\x17\x46\xe8\x5d\x00\x00\x00") - -func confGitignoreMercuryBytes() ([]byte, error) { - return bindataRead( - _confGitignoreMercury, - "conf/gitignore/Mercury", - ) -} - -func confGitignoreMercury() (*asset, error) { - bytes, err := confGitignoreMercuryBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Mercury", size: 93, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreMetaprogrammingsystem = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x90\x4f\x4b\xc3\x40\x10\xc5\xef\xfb\x29\x06\x7a\x10\x1a\x92\x80\xe0\xc5\xb3\xa2\x17\x41\x68\xee\x32\xd9\x9d\x98\x8d\xfb\x27\xec\xcc\x36\xe6\xdb\xbb\xa6\x2d\xd6\xde\x66\x86\xc7\x9b\xdf\x7b\x4b\x4c\x5f\x3c\xa3\xa6\xe6\xdb\x3b\x35\xe5\x60\xe5\xe8\x17\x14\x3d\x52\xda\x37\x73\x8a\x33\x25\xb1\xc4\xaa\xcf\xd6\x99\xeb\x83\xda\xc1\x27\x05\x4a\x28\x64\x60\xc2\x23\x82\x76\xc8\x4c\x0c\x18\xce\x07\x8e\x39\x69\x82\xc1\xba\xa2\xdf\x01\x80\xc7\x90\xd1\xb9\x15\xd0\x98\x22\x5b\x41\x67\x96\xe8\x01\x8b\xe5\x80\x5a\x18\x64\x44\x01\x8d\xe1\x4e\xa0\xa7\xab\x07\x43\x2a\x32\x19\x09\x7c\x34\xe4\x4e\x6e\xa3\xc8\xfc\xd8\xb6\x3a\x86\xc1\x65\x0a\x25\xc3\x44\xd2\x27\xb4\x81\x1b\x1d\x7d\x6b\x2c\xcf\x0e\xd7\xf6\xed\xfd\xf0\x74\xff\xd0\xbe\xc6\xa5\x8b\x55\x5d\x57\x65\xaf\x0a\x63\xf5\x62\x45\x9d\x99\x3f\xca\x27\x75\xc2\xbd\x19\x1b\x8d\xa5\x8b\x9b\xb8\x42\x5c\x28\x0b\xc9\x96\x75\xdb\x12\x71\x76\xc2\xea\x77\xd9\x2c\x2e\xc3\xc5\xa0\x7b\x3e\x74\xf5\xfe\xaf\xe6\x7f\xed\xfe\x04\x00\x00\xff\xff\xb9\x6e\x6a\xb3\x87\x01\x00\x00") - -func confGitignoreMetaprogrammingsystemBytes() ([]byte, error) { - return bindataRead( - _confGitignoreMetaprogrammingsystem, - "conf/gitignore/MetaProgrammingSystem", - ) -} - -func confGitignoreMetaprogrammingsystem() (*asset, error) { - bytes, err := confGitignoreMetaprogrammingsystemBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/MetaProgrammingSystem", size: 391, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreMicrosoftoffice = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x2b\xc9\x2d\xe0\xe2\x52\x56\x08\xcf\x2f\x4a\x51\x28\x49\xcd\x2d\xc8\x2f\x4a\x2c\xaa\xe4\xaa\x53\xd1\xd2\x4b\xc9\x4f\xd6\x02\x49\xb9\x56\x24\xa7\xe6\xa0\xc9\x55\xe4\x14\x23\xc9\x39\x25\x26\x67\x97\x16\x28\xb8\x65\xe6\xa4\x72\x81\xe4\xb2\xb9\x00\x01\x00\x00\xff\xff\xdb\x73\x90\x88\x58\x00\x00\x00") - -func confGitignoreMicrosoftofficeBytes() ([]byte, error) { - return bindataRead( - _confGitignoreMicrosoftoffice, - "conf/gitignore/MicrosoftOffice", - ) -} - -func confGitignoreMicrosoftoffice() (*asset, error) { - bytes, err := confGitignoreMicrosoftofficeBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/MicrosoftOffice", size: 88, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreModelsim = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x74\x8e\x31\x4e\xc5\x30\x0c\x86\x77\x9f\xc2\x12\x0b\x64\x78\x5c\x81\x0b\x30\x31\x22\xf4\x94\x26\x6e\x6b\x48\xe2\x28\x76\xcb\xf5\x71\x96\xa7\x2e\x2c\xdf\xaf\xe4\x97\x3f\xfb\x09\x79\x6b\x32\x08\xdf\x25\x53\xf9\xe0\x8a\x1b\x35\x1a\xd1\x28\xe3\xca\x85\x14\x63\xcb\x98\x79\x50\x32\x19\xec\xef\x67\xa3\xda\x2f\x9d\x0a\x4a\x7b\x81\xcf\xfb\xdb\x57\x00\x78\xf8\x92\xd4\xce\x25\x1a\x4b\x43\x39\xac\x1f\x86\xb2\x3e\xb6\x40\xb8\x55\x63\x67\x8e\x36\xb9\xa8\xb3\xeb\xfc\x5f\xe2\x8f\x33\xd5\xee\xfc\xee\x9b\x73\xb7\x5a\x66\xa1\xeb\xc5\xaf\x5c\x8f\xff\xf5\xbf\x65\x0d\x3e\xe2\xe1\x3c\xd5\x66\x1c\x29\x2f\x90\xe4\x0c\xaf\x60\x23\x36\x4d\x83\xbb\x05\xd0\x74\xcf\x9d\x77\x8a\x99\xc6\x6d\x87\xd3\xc5\x7e\xcf\x06\x7f\x01\x00\x00\xff\xff\x42\xd3\x8b\x1f\x1a\x01\x00\x00") - -func confGitignoreModelsimBytes() ([]byte, error) { - return bindataRead( - _confGitignoreModelsim, - "conf/gitignore/ModelSim", - ) -} - -func confGitignoreModelsim() (*asset, error) { - bytes, err := confGitignoreModelsimBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/ModelSim", size: 282, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreMomentics = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\x2a\xcd\xcc\x29\x51\x48\xcb\xcc\x49\x2d\xe6\xaa\xb0\x30\xd3\xe7\x4a\x2c\xca\x05\x13\xba\x05\xfa\x5c\x25\x45\x89\x79\xc5\x39\x89\x25\x99\xf9\x79\xc5\xfa\x5a\x7a\x85\xb9\x5c\x5c\xca\x0a\x9e\x2e\xae\x0a\xc5\xa9\x25\x25\x99\x79\xe9\xc5\x5c\x7a\x30\x96\x3e\x17\x20\x00\x00\xff\xff\x0c\x04\x33\xd5\x4c\x00\x00\x00") - -func confGitignoreMomenticsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreMomentics, - "conf/gitignore/Momentics", - ) -} - -func confGitignoreMomentics() (*asset, error) { - bytes, err := confGitignoreMomenticsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Momentics", size: 76, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreMonodevelop = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x0e\x2d\x4e\x2d\x52\x08\x2e\x48\x4d\xce\x4c\xcb\x4c\xe6\xd2\xd2\x2b\x05\xf2\x0b\x8a\x52\xd3\x8a\xa1\xec\x92\xc4\xe2\xec\x62\x2e\x2e\x65\xdf\xfc\xbc\x7c\x85\x80\xa2\xfc\xac\xd4\xe4\x12\x05\xb7\xcc\x9c\x54\x90\x82\x82\xcc\x94\x24\x20\x55\x94\x5a\x9c\x5f\x5a\x94\x0c\x14\x2a\x49\x2d\x2e\xd1\x05\x72\x4b\x73\x4a\x8a\xf5\xb9\x00\x01\x00\x00\xff\xff\xf3\x3c\xfc\xc2\x5d\x00\x00\x00") - -func confGitignoreMonodevelopBytes() ([]byte, error) { - return bindataRead( - _confGitignoreMonodevelop, - "conf/gitignore/MonoDevelop", - ) -} - -func confGitignoreMonodevelop() (*asset, error) { - bytes, err := confGitignoreMonodevelopBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/MonoDevelop", size: 93, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreNanoc = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x2c\x8e\x31\x6f\xc4\x20\x0c\x46\x77\x7e\xc5\x27\x65\x68\x2b\x55\x61\xef\xda\xaa\x53\xc7\xee\x27\x8b\x40\xc2\x09\x6c\x04\xe6\x4e\xf9\xf7\x47\x72\xb7\x3d\x5b\xef\x59\x9e\xf0\x2b\x15\xa5\xca\xd5\x3b\x6d\xe8\x2d\xf2\x0a\x26\x16\x87\xf7\x4d\xb5\x7c\x59\x7b\x4e\xf3\xbd\xd9\x0f\x63\x26\xfc\xf8\x40\x3d\x29\x92\x38\xd2\x28\x8c\x30\x7a\xe9\x5a\xba\x7e\x82\xbd\x5f\x1a\x54\x90\x49\xdd\xf6\x5a\x5f\x96\x58\xdf\x1a\x6e\x94\xba\x1f\x76\xe7\x05\x91\xe1\x84\x43\x5c\xe7\x9d\x72\x32\x4f\xcf\x1e\xe7\xff\x7d\x2e\x52\xa9\xee\x08\x31\x79\x8c\x74\xfc\x25\x75\x37\x9a\xcb\x29\x7c\x57\x6a\x1b\xfe\x64\x35\xee\xa0\x39\x0d\x7a\x04\x00\x00\xff\xff\x23\xc7\x0b\x69\xc5\x00\x00\x00") - -func confGitignoreNanocBytes() ([]byte, error) { - return bindataRead( - _confGitignoreNanoc, - "conf/gitignore/Nanoc", - ) -} - -func confGitignoreNanoc() (*asset, error) { - bytes, err := confGitignoreNanocBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Nanoc", size: 197, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreNetbeans = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x34\xcc\x4d\x12\x80\x20\x08\x86\xe1\xbd\x77\x49\xcf\x84\x3f\x39\x34\x06\x0e\x62\xd3\xf1\xc3\xa6\x56\xf0\x3e\x8b\x8f\x62\x17\x3e\x4a\xd2\xd0\x05\x2f\xd0\x12\x5c\x9c\xd8\x72\x70\x14\xbf\x27\xe3\xd0\x95\xff\x85\xa4\xc8\x34\xfc\x7d\x36\xab\x2d\x31\xed\x58\xa7\xc0\xd2\x17\xbd\x69\x15\xc8\xcd\xc6\x9e\x00\x00\x00\xff\xff\xcd\x0e\x0d\x6e\x60\x00\x00\x00") - -func confGitignoreNetbeansBytes() ([]byte, error) { - return bindataRead( - _confGitignoreNetbeans, - "conf/gitignore/NetBeans", - ) -} - -func confGitignoreNetbeans() (*asset, error) { - bytes, err := confGitignoreNetbeansBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/NetBeans", size: 96, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreNim = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xca\xcb\xcc\x4d\x4e\x4c\xce\x48\xd5\xe7\x02\x04\x00\x00\xff\xff\x6e\x5e\xa9\x72\x0a\x00\x00\x00") - -func confGitignoreNimBytes() ([]byte, error) { - return bindataRead( - _confGitignoreNim, - "conf/gitignore/Nim", - ) -} - -func confGitignoreNim() (*asset, error) { - bytes, err := confGitignoreNimBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Nim", size: 10, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreNinja = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xcb\xcb\xcc\xcb\x4a\x8c\x4f\x49\x2d\x28\xe6\x82\xb2\x73\xf2\xd3\xb9\x00\x01\x00\x00\xff\xff\xee\x9e\xc8\x72\x17\x00\x00\x00") - -func confGitignoreNinjaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreNinja, - "conf/gitignore/Ninja", - ) -} - -func confGitignoreNinja() (*asset, error) { - bytes, err := confGitignoreNinjaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Ninja", size: 23, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreNode = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x44\x91\xc1\x6e\x1c\x21\x0c\x86\xef\x3c\x05\xd2\x5e\x9a\x48\xcc\xdc\x7b\x4d\xa4\x4a\x55\x4f\xe9\x03\x54\x0c\xf6\xb0\xce\x02\x9e\x62\x68\xb4\x6f\x5f\x7b\x77\x9b\x5e\x60\x8c\x7f\x7f\xfc\x3f\x73\xf2\x3f\x38\x8b\x2b\xb6\x3c\x2f\xba\xb9\x76\xd4\x00\xb8\xcd\x6c\xd5\xb3\x73\x27\xff\x36\xdb\xa0\x8a\x1e\xe2\x88\xee\x20\x30\xa5\x6e\xba\x0a\x22\x98\xe2\x95\x3a\xa6\xc1\xfd\xea\x77\xee\x9e\x9a\x8c\x3e\x2b\xb6\x81\xe0\x0b\x6d\xe2\x33\x36\xec\xd1\xca\xed\xea\xdf\x25\xf1\x1f\x2d\x33\xae\xdf\x7f\xbe\xd8\xa7\x53\x51\xd0\x43\x43\xbd\x3c\x7a\x1e\x3e\x99\x53\xee\x83\x83\xb9\x88\x02\x2f\xe8\x49\x46\x6c\xdb\x2c\xee\x1f\xca\x46\xbf\x75\x35\xaa\xb7\x0f\xec\x15\x81\xf4\x3e\x2f\x0a\x30\xd8\x97\xf3\x18\xc7\xd7\x75\xcd\x26\x79\x97\x25\x71\x5d\x53\xc7\x38\xa8\xe5\x70\x94\x99\xd5\xf3\xc9\xc4\x56\x8f\x28\x97\xb0\x53\x41\x79\x72\xcb\x6d\xc2\xe8\x8d\x01\xc3\x47\xdc\x7d\xe2\xb6\x53\x9e\x9a\x87\xb8\x39\x7d\xa5\x74\x09\x1f\x92\x3a\x1d\xe3\x1e\xa0\x1e\x3a\xab\x8e\xa9\x45\x75\x1f\x01\xb8\xc9\xa7\x03\xc3\xa8\x01\xee\x79\x8d\x07\xad\xf7\xee\x72\x1e\xb5\x3c\xb9\x6d\x52\x81\xf5\x0d\x0b\x46\xb9\x25\x7a\xc5\x03\x1b\x60\x4b\xd7\xff\xcf\xa1\xc7\x86\x12\x65\x01\x27\x59\xf4\x7f\x3d\x02\x55\x92\xb4\xee\xf1\xf7\x49\xce\x3c\x0b\x04\x0a\xe9\x8c\x6a\xae\x5e\xc3\xcd\x7c\x65\x98\x1a\x2a\xec\x5c\x00\x7b\xd0\x87\xe2\x90\x69\x38\x6b\xfe\x7a\x34\xdd\xdf\x00\x00\x00\xff\xff\xf1\x4f\x21\x09\x11\x02\x00\x00") - -func confGitignoreNodeBytes() ([]byte, error) { - return bindataRead( - _confGitignoreNode, - "conf/gitignore/Node", - ) -} - -func confGitignoreNode() (*asset, error) { - bytes, err := confGitignoreNodeBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Node", size: 529, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreNotepadpp = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\xf0\xcb\x2f\x49\x2d\x48\x4c\xd1\xd6\x56\x48\x4a\x4c\xce\x2e\x2d\x28\x56\x50\xe6\xe5\xd2\xd2\x4b\x4a\xcc\xe6\xe5\x02\x04\x00\x00\xff\xff\x7b\xcd\x03\x1c\x1e\x00\x00\x00") - -func confGitignoreNotepadppBytes() ([]byte, error) { - return bindataRead( - _confGitignoreNotepadpp, - "conf/gitignore/NotepadPP", - ) -} - -func confGitignoreNotepadpp() (*asset, error) { - bytes, err := confGitignoreNotepadppBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/NotepadPP", size: 30, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreOcaml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x8c\xb1\x0e\xc2\x30\x0c\x44\x77\x7f\x45\x24\xb6\x0e\xe5\x93\xd0\x35\x31\x91\x45\x1a\xa3\xd8\x05\xfa\xf7\xb4\x09\x13\xcb\xbb\x93\xfd\x74\xd3\x8c\x5a\xd5\x69\x9a\xe3\xaa\x9d\xe8\x94\x83\x67\x1b\xb7\xcf\xa0\x8d\x00\xd1\x25\x68\xc4\x5a\x96\x4d\x4a\x0a\x6f\x6d\x0f\xa9\x39\x24\x69\x1c\x5d\xdb\x4e\xb7\xfe\xb8\xfe\x79\x8e\x96\xd9\xcf\x91\x65\x77\x3e\xa2\xc2\xe5\xc5\xdd\x82\x89\x85\xcc\x95\x1b\x9c\x53\xb8\x4b\x61\x23\x63\xdf\x9e\x73\x82\xe3\x57\x8b\x66\xfa\x06\x00\x00\xff\xff\xec\xe3\xab\x33\xb2\x00\x00\x00") - -func confGitignoreOcamlBytes() ([]byte, error) { - return bindataRead( - _confGitignoreOcaml, - "conf/gitignore/OCaml", - ) -} - -func confGitignoreOcaml() (*asset, error) { - bytes, err := confGitignoreOcamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/OCaml", size: 178, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreOsx = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x44\x90\x41\x6b\xc3\x30\x0c\x85\xef\x86\xfe\x07\xc1\x6e\x83\x85\xee\x27\x74\x84\x42\x61\x6c\x63\x29\x3d\x0d\x8a\x9b\xa8\x8b\x88\x6d\x19\x59\x49\xe9\xbf\x9f\x5c\xba\xed\x64\x59\xcf\xbc\xf7\x3d\x37\x6d\x77\xec\x94\x05\x5d\xb3\xc9\x39\x60\xcb\xf3\x29\xd8\xe5\xb5\x7b\x5f\x50\x84\x06\x74\xee\x01\x76\x3d\x27\x88\x73\x51\xc0\x34\xc0\x85\x74\x04\xbd\x30\x7c\x89\xab\xca\x6a\x55\xdf\xec\xc7\x39\x9e\x92\xa7\x50\x5c\x73\x7c\xac\x9b\x2d\x05\x2c\xa0\xa3\x57\x88\xf4\x3d\x2a\xf8\x9c\xd1\x0b\x50\xb2\x25\x82\x30\x2b\xf0\x19\x3c\x2c\x1c\xe6\x68\xa1\x2d\xf7\x76\x26\xfd\xc4\x85\x0a\x71\x2a\x4f\x87\xe7\xf5\xda\x35\xe7\x82\x8b\xad\xcb\xe0\x9a\x2e\xb3\x86\x6a\x76\x97\xf6\x18\x33\x8b\x97\xeb\x4e\x31\x5a\xf2\x5e\x7c\x19\xd1\x86\xc3\xcd\xb3\xe2\x35\xd4\xa7\x52\x79\x5a\x12\xec\xad\x2b\x19\x95\xd9\x98\x23\xf9\x10\xae\xd0\x0b\x7a\xc5\x01\xac\xa3\x60\x34\x01\x36\xdb\x0f\x28\xa3\xff\xff\x95\x97\xdf\x01\xcb\xa4\x9c\xdd\x1b\x5a\x7f\x99\xe0\x16\x07\x5b\x0e\x03\x8a\xfb\x63\x81\x3b\x8c\xcf\x03\x95\xc9\xfd\x04\x00\x00\xff\xff\x2b\xec\x6b\x35\x64\x01\x00\x00") - -func confGitignoreOsxBytes() ([]byte, error) { - return bindataRead( - _confGitignoreOsx, - "conf/gitignore/OSX", - ) -} - -func confGitignoreOsx() (*asset, error) { - bytes, err := confGitignoreOsxBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/OSX", size: 356, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreObjectiveC = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x52\xc1\x8e\xd4\x30\x0c\xbd\xf7\x2b\x8c\x2a\x71\x58\x6d\x5a\xb1\xdc\xf6\x06\xb3\x12\xdc\x16\x09\x09\xb8\xa6\x89\xdb\x7a\x68\xe3\x2a\x71\x66\x66\xff\x1e\x27\x65\x67\x16\x2e\x33\x8d\x9f\xed\xf7\xfc\xec\x16\x7e\x39\xf6\xd8\xb4\x4d\x0b\x13\x09\x4d\x81\x23\x82\xe3\x20\x91\x86\x2c\x1c\xd3\x23\x44\x5c\x71\x1d\x30\x82\x30\xe4\xcd\x5b\x41\xf8\xb2\xf0\x60\x97\xbe\xd6\x76\xd7\xba\x7b\x78\x1e\x8e\xe8\x84\x4e\x68\x0e\xb7\x30\xbc\x87\xef\x67\x1a\xe5\x16\x69\x9a\xb6\x85\xcf\x99\x16\x0f\x13\x06\x8c\xda\xd2\x37\x43\x79\xf7\xcd\x13\x46\xad\xf7\x4f\x56\x6c\x4d\xfb\x61\x23\x71\x4e\x90\x50\x84\xc2\x94\x9a\xbb\x6e\x1b\x2e\x39\x61\x6c\xde\x79\x1c\x6d\x5e\xe4\x1a\xb8\xeb\x56\x15\xf4\xe1\xf4\xf1\x06\xbd\x06\x76\xe8\xe1\x7f\xe8\xa1\x42\x1b\xc6\xb4\xed\xc2\xdf\x26\xfc\x1b\xbe\xb8\xc2\xe1\x5f\x75\x3d\xcb\x5c\x19\x2f\xce\xcd\xe8\x7e\x73\x96\xca\xa1\xd2\x8d\x4d\xa4\x96\x16\xa8\x54\x24\xd1\xf1\xea\x2b\xb9\x75\x58\x32\x6e\x91\x82\xec\x3d\x86\xa3\x39\xf4\xd5\x1c\x28\x4c\x34\x92\xd3\xcc\x79\xb5\x9b\xfe\xd1\x56\x98\xe0\xc0\x8e\xed\x37\xf6\xa9\x2e\xe9\x27\xea\x3e\x1c\xaf\x2b\x06\x0f\x76\xb2\x14\x92\x80\xf5\x5e\xad\x01\x55\x04\x25\x11\x3c\x69\x8e\x2e\xef\xa5\xac\xec\x85\x73\x84\x9b\xf7\x1d\x7c\xe5\x33\x9e\x54\x7b\x5b\x20\x48\x33\x67\xdd\xc3\x31\xfb\x09\x61\xe4\x58\xf3\x13\x2e\xe3\x7d\xed\xb7\x45\x4e\x60\x95\x4b\x6f\x42\x3f\x74\x9b\xca\x2c\xc4\x01\x95\x5e\x1e\xb5\xc9\x2c\xb2\x3d\xf6\xfd\x94\x75\xe8\xd4\xb9\xa2\x76\x53\x11\x1d\xc7\xa9\xcf\x49\x75\xed\xbf\xe6\x86\xcc\xb2\x2e\xed\xce\x6b\xc8\x54\xfb\x8c\x72\x99\x02\x9a\xab\x76\xa3\x2e\xb1\x49\xaa\xc6\xa1\xa9\x17\xc9\x4b\xb1\xa0\x4c\xd8\x57\x63\x6c\x94\xd9\x4e\xfb\xf1\x7e\xf2\x5e\xf5\x52\x82\x85\x02\x02\x8d\x75\xb6\xb3\x0d\x52\x2c\xb0\x27\x26\x9d\xa0\x10\x15\x9f\x28\xc0\xde\x16\xca\xfd\xc2\x18\x79\xbd\x36\x03\x8f\x9b\x5a\x8b\xc1\x91\x4e\xf3\x86\xa5\x3f\xfc\x5d\x73\x6a\x9a\x6b\xac\xde\x70\xf3\x27\x00\x00\xff\xff\x4e\x18\xce\x5e\x45\x03\x00\x00") - -func confGitignoreObjectiveCBytes() ([]byte, error) { - return bindataRead( - _confGitignoreObjectiveC, - "conf/gitignore/Objective-C", - ) -} - -func confGitignoreObjectiveC() (*asset, error) { - bytes, err := confGitignoreObjectiveCBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Objective-C", size: 837, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreOpa = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x8a\x4f\x2a\xcd\xcc\x49\xe1\x8a\x2f\x29\x4a\x4c\xce\x2e\xe6\xe2\xca\x2f\x48\xd4\x4d\x49\x4d\x2a\x4d\xd7\xcd\x02\xf2\xb4\xf4\xf2\x0b\x0a\xc0\x64\x05\x84\xd4\x4b\x2a\xca\xcf\x4e\xcd\x03\x72\x52\x4a\x73\x41\x32\x89\x05\x99\x10\x52\xb7\xa4\xa2\x04\xc8\x4a\xad\x48\x05\x92\x39\xf9\xe9\x5c\x80\x00\x00\x00\xff\xff\xbd\x9b\x99\xa3\x5a\x00\x00\x00") - -func confGitignoreOpaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreOpa, - "conf/gitignore/Opa", - ) -} - -func confGitignoreOpa() (*asset, error) { - bytes, err := confGitignoreOpaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Opa", size: 90, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreOpencart = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x8a\x51\x0a\x82\x41\x08\x06\xdf\xbf\x5b\x74\x81\xdf\x33\x89\xda\xae\xb0\xea\x82\x0b\xd5\xed\xeb\x25\x88\xde\x66\x86\xb9\xe6\x61\x11\xeb\x06\x49\xe5\xdd\xc7\xb5\xe7\x06\x6b\x78\xfe\x06\xdc\x3c\xd5\x9e\x9f\x3b\x16\xa0\xf5\xc8\x55\xac\x04\x0f\x1e\x46\xca\x87\xbf\x2c\x2c\xd3\x08\xfd\xea\x63\xf1\x67\xab\x46\x13\xde\x01\x00\x00\xff\xff\xd6\x6e\x90\xf0\x73\x00\x00\x00") - -func confGitignoreOpencartBytes() ([]byte, error) { - return bindataRead( - _confGitignoreOpencart, - "conf/gitignore/OpenCart", - ) -} - -func confGitignoreOpencart() (*asset, error) { - bytes, err := confGitignoreOpencartBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/OpenCart", size: 115, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreOracleforms = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\xce\xcf\x2d\xc8\xcc\x49\x4d\x51\x70\xcb\x2f\xca\x55\xf0\xcd\x4f\x29\xcd\x49\x2d\xe6\xd2\xd2\x4b\xcb\xad\xe0\xe2\x42\x92\xf6\x4d\xcd\x2b\x45\x92\xce\x45\x93\x0e\x28\x4a\xd5\xf5\xc9\xcc\xcb\x06\x32\x7d\x32\x93\x8a\x12\x8b\x32\xc1\xca\x0a\x72\x2a\xb8\x00\x01\x00\x00\xff\xff\x62\x79\x5b\x10\x64\x00\x00\x00") - -func confGitignoreOracleformsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreOracleforms, - "conf/gitignore/OracleForms", - ) -} - -func confGitignoreOracleforms() (*asset, error) { - bytes, err := confGitignoreOracleformsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/OracleForms", size: 100, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignorePacker = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\x4e\x4c\xce\x48\x55\xc8\x4f\xca\x4a\x4d\x2e\x29\xe6\x2a\x48\x4c\xce\x4e\x2d\x8a\x4f\x06\x09\xea\x73\x71\x29\x2b\xb8\xe5\x17\x29\x24\x95\x66\xe6\x94\x28\x24\xe5\x57\xa4\x16\x73\x69\xe9\x01\x69\x2e\x40\x00\x00\x00\xff\xff\xa6\x6d\xe6\x7b\x37\x00\x00\x00") - -func confGitignorePackerBytes() ([]byte, error) { - return bindataRead( - _confGitignorePacker, - "conf/gitignore/Packer", - ) -} - -func confGitignorePacker() (*asset, error) { - bytes, err := confGitignorePackerBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Packer", size: 55, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignorePerl = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x44\x8e\xbd\x0e\x83\x30\x0c\x84\x77\xbf\x45\x57\x06\xfb\x19\x40\xa2\x52\x07\xba\x94\xa5\x53\x94\x40\x90\x52\x12\x8c\x88\xa9\xc4\xdb\xd7\xfc\x48\x1d\xa2\xfb\x2e\xe7\x93\x4d\x2e\x06\x47\x40\xe8\xd6\x10\x7b\x02\x73\x69\xc7\x5f\xbf\x98\x5e\xa3\x30\x75\x04\xd5\xfe\x0b\xb7\xea\x0c\x0f\x41\x67\x05\x30\xda\x2c\xe6\x1c\xce\x62\x25\x03\x35\x76\xf4\x43\x88\xfe\x4f\xc8\xda\xa5\xa6\x7c\x3e\xee\xf5\xab\xd5\xde\xa8\xae\x6e\x4b\xdc\x52\xbc\xe8\x93\x79\x52\x7c\x1f\xa6\x80\x69\x93\x79\xe1\x01\x79\x15\xa0\x39\x19\x61\xb3\xdf\x09\x05\xb2\x3e\xa7\x5b\x8c\x5f\x53\x22\xf8\x05\x00\x00\xff\xff\x8d\x8b\x2e\xdc\xbf\x00\x00\x00") - -func confGitignorePerlBytes() ([]byte, error) { - return bindataRead( - _confGitignorePerl, - "conf/gitignore/Perl", - ) -} - -func confGitignorePerl() (*asset, error) { - bytes, err := confGitignorePerlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Perl", size: 191, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignorePhalcon = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x4f\x4e\x4c\xce\x48\xd5\xe7\xd2\x4f\xce\xcf\x4b\xcb\x4c\xd7\x4f\x49\x2d\x4b\xcd\xc9\x2f\xc8\x4d\xcd\x2b\xd1\xe7\x02\x04\x00\x00\xff\xff\xb8\x16\x9e\x85\x1d\x00\x00\x00") - -func confGitignorePhalconBytes() ([]byte, error) { - return bindataRead( - _confGitignorePhalcon, - "conf/gitignore/Phalcon", - ) -} - -func confGitignorePhalcon() (*asset, error) { - bytes, err := confGitignorePhalconBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Phalcon", size: 29, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignorePlayframework = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x44\x8b\x31\x0e\xc2\x30\x0c\x45\x77\x9f\x22\xa8\x1b\x12\xf1\x39\xd8\xb8\x42\x9b\x58\xc1\xe0\x36\x91\xed\x82\x7a\x7b\x3c\x80\x58\xde\xd3\x7f\xd2\x9f\xd2\xb5\x6d\x5d\x29\xdd\x64\x3e\x4e\xe9\xdd\xf5\xc9\x5b\x4b\x95\x95\x8a\x77\x3d\xd2\x04\x0b\x6f\x08\x58\x17\xc8\x54\x84\x87\x11\xa0\xf0\x12\x49\x7a\xb3\xd0\xda\xeb\x2e\x64\x80\x43\xfb\x23\x5e\x3f\xff\x83\xcf\xda\x28\xf6\xd7\xbe\x0e\x04\x27\xf3\x8b\x92\xed\xe2\x60\xa4\x2f\xd2\x3c\xb8\xc2\x39\xf3\x2a\x41\x0a\x62\x65\x73\x84\x5c\xe6\x72\x27\xf8\x04\x00\x00\xff\xff\xb1\xed\x52\xdf\xaa\x00\x00\x00") - -func confGitignorePlayframeworkBytes() ([]byte, error) { - return bindataRead( - _confGitignorePlayframework, - "conf/gitignore/PlayFramework", - ) -} - -func confGitignorePlayframework() (*asset, error) { - bytes, err := confGitignorePlayframeworkBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/PlayFramework", size: 170, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignorePlone = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x2c\x8a\x41\x0e\xc3\x20\x0c\x04\xef\x7e\x0a\x12\xf0\x8a\x36\xea\xa5\x7d\x03\x09\x06\x59\x25\xd8\x4a\x28\x55\x7f\x5f\x23\x72\x19\x8f\x77\xd7\x38\xf9\x6d\x30\xc8\xca\xb6\x8b\xd1\xb3\x0f\xc7\x9c\x95\xb7\x65\x99\x6e\xa9\x26\x9e\x81\x7d\x3c\xef\x2f\x70\xc6\x6d\x29\xc3\x4a\xd5\xc3\xfa\xa1\x12\x3d\x44\xec\x58\x58\xac\xce\x4f\xfd\xf8\x5b\x0b\x87\xa8\x3a\x83\x14\xde\x78\x75\x12\x8e\x36\x26\x74\x36\x0f\x3d\x1c\x1e\xfe\x01\x00\x00\xff\xff\x14\xe9\xdb\xf1\x89\x00\x00\x00") - -func confGitignorePloneBytes() ([]byte, error) { - return bindataRead( - _confGitignorePlone, - "conf/gitignore/Plone", - ) -} - -func confGitignorePlone() (*asset, error) { - bytes, err := confGitignorePloneBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Plone", size: 137, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignorePrestashop = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x90\x5b\x6a\x33\x31\x0c\x85\xdf\xbd\x0a\x41\x1e\x7e\x18\xf2\x8f\x17\x91\x0d\x14\x52\xfa\xae\xd8\x8a\xc7\xd4\xb6\x8c\x2d\xe7\xb2\xfb\xaa\x33\x69\x49\x29\xf4\xc5\x97\x0f\x1d\xe9\xe8\xec\xe0\xa5\xc5\x0b\x0a\xc1\x39\x26\xea\x66\x07\xaf\x8b\xbe\x39\x25\xbe\xc6\x12\x36\x0a\x8e\x8b\x60\x2c\x70\xe7\xd1\xc0\xa3\xe0\x09\x3b\x81\x6b\xe4\xa9\x48\xc4\xd4\x01\x8b\x07\x96\x85\x1a\x54\x6a\x9d\x0b\xa6\xb5\x6e\x36\x46\xb5\xe7\x18\x6c\x27\x11\x6d\xd8\xe7\x69\xae\x4b\x35\x3a\xe8\x80\x6e\xa1\x3d\x08\xe5\xba\xca\x03\x15\x6a\xea\xc4\xff\x69\x05\x1b\x3d\x55\x9e\xee\xea\x9f\xba\xe0\x71\xe1\xaa\xc3\xd0\xe7\x58\xfe\x7b\xba\x58\x1c\xc2\xa3\x86\x86\x9e\xac\x71\x9f\xa3\xec\x97\x95\x5b\x4e\x76\x9a\xf5\x34\x89\x83\x35\x53\x8f\xea\x01\xeb\x4a\x74\x85\x4c\xdd\x4e\xf6\x21\xc9\xec\x47\xda\xc0\x2a\xde\x74\xea\xed\xa8\xa2\x35\x17\x4d\xe0\xb7\x55\x4e\x5e\x63\xf8\xce\xad\x36\x6d\xe3\x04\x62\xc6\x40\x7d\x0f\x97\xd8\x64\x68\x44\x0f\xae\xe4\x70\x7c\xfb\xa7\x17\x89\xfb\xb1\xc5\x09\xdd\xfb\xa8\xdd\x3e\x21\xba\x55\x6e\xf2\x4c\x62\xde\x88\xe7\x6b\x49\x8c\xde\x9a\x98\x75\xaf\x51\xb7\xcf\x47\x00\x00\x00\xff\xff\x91\xde\x81\x63\xe3\x01\x00\x00") - -func confGitignorePrestashopBytes() ([]byte, error) { - return bindataRead( - _confGitignorePrestashop, - "conf/gitignore/Prestashop", - ) -} - -func confGitignorePrestashop() (*asset, error) { - bytes, err := confGitignorePrestashopBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Prestashop", size: 483, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreProcessing = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x73\x09\x8e\x0f\x2e\xc9\x2f\x4a\xe5\x4a\x2c\x28\xc8\x49\x2d\x01\x53\x99\xc9\x89\x25\x99\xf9\x79\x7a\x39\x99\x79\xa5\x15\xc6\x46\x98\x62\x66\x26\x28\x62\xe5\x99\x79\x29\xf9\xe5\xc5\x68\x2a\xa1\xa2\x68\x6a\x73\x13\x93\xf3\x8b\x2b\xb8\x00\x01\x00\x00\xff\xff\x0f\xd4\xed\x78\x78\x00\x00\x00") - -func confGitignoreProcessingBytes() ([]byte, error) { - return bindataRead( - _confGitignoreProcessing, - "conf/gitignore/Processing", - ) -} - -func confGitignoreProcessing() (*asset, error) { - bytes, err := confGitignoreProcessingBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Processing", size: 120, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignorePython = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\x52\x3d\x6f\xdc\x30\x0c\xdd\xf5\x2b\x08\xa4\xd3\x21\x67\x2f\x45\x87\x8e\x69\x96\x02\x19\x02\xb4\x99\x8a\xe2\xa0\x93\x69\x5b\xa9\x2c\x0a\x22\xef\x72\xee\xaf\xef\x93\xef\xda\x74\xa1\xc9\x47\x3f\xea\xf1\xe3\x8e\x1e\x56\xe3\x7d\x90\xa5\xc4\xc4\x03\xf5\x24\xc5\xe2\x12\x7f\x6f\xfe\xe3\xd3\x13\x8d\xc0\xd5\x1d\x0e\x65\x0d\x3e\xcc\x7c\x38\xf4\x6e\xd7\x95\xf5\x47\x90\xe1\xa7\xdb\x7d\x28\x6b\x17\x92\x57\x75\xee\x8e\xbe\x10\x5f\x8c\xb3\x46\xc9\x8a\x9f\x54\x1a\xf8\x18\xd5\x6a\x3c\x9e\x0c\x28\x4a\x16\x1f\x7e\xf9\x29\xe6\xc9\x75\xcf\xab\xcd\x92\x1d\xe7\x73\xef\x8e\xa7\x98\x86\xde\x0d\x7c\xe6\x24\x65\xcf\xd3\xa4\x88\x40\x85\x95\xb7\x9c\xc4\x0f\x00\xae\x70\x77\xfd\xa4\x78\xdc\xcc\xa7\x8f\xbd\x2b\xbe\x1a\x20\xbd\x32\xce\xbe\x36\x91\xf8\x6d\x1f\xf3\x28\x60\xc4\xac\xe6\x13\x1a\xec\xc2\x38\x5d\x53\x4d\xdb\xf3\xfa\xf5\x96\xa8\x88\xe8\x45\x4f\xf0\x57\xb2\x99\x95\xaf\x8d\x93\xaf\x4c\x6f\x35\x1a\xfa\xa2\xe3\x4a\x9e\xca\xa6\x9a\x34\xd4\x58\x8c\xc6\x2a\x0b\x40\xe3\xa5\x24\x6f\xdc\xaa\x1c\x79\x14\x90\xfe\xab\x4d\x5b\x77\xda\xea\x62\x42\x7c\x4f\x2a\xe4\x11\x0a\xc5\xfc\xca\xc1\x68\x00\xb5\x17\xa4\x2b\x35\xc1\x0a\xdb\x92\xd6\x41\xea\xe2\x73\x1c\x59\xad\x0d\xb4\x70\x68\xb2\xdf\x0b\x27\x99\xd4\x95\x58\xf6\x70\x3a\xbb\xd8\xe6\x0f\x9c\x18\x3b\xb5\x39\xea\x7e\x88\x15\x0f\x48\x5d\xb7\x2c\xb8\x2f\x39\x1a\xe4\xaa\x61\x17\x41\xce\x5c\xfd\xc4\x54\xb9\x08\x06\xe8\x66\x5b\x12\x40\x0c\xcc\xe4\x02\xfb\xf7\x87\x77\xaf\xdb\xc1\x6f\x77\xe0\xb2\x28\xb7\x3a\xda\x5d\x96\xe4\xfe\xe5\x5b\xb0\xbb\xdf\xc2\xf6\xdc\xf7\xea\xb3\x62\x32\xb7\x93\x58\xa4\x1d\x8f\x6c\x4a\x1e\x5f\x7d\x9e\x84\xd4\x4e\xe3\xf8\x19\x30\x5a\x68\xf0\xb7\x32\xc7\x7c\xa1\x41\xc2\x69\xe1\x6c\x1b\x15\x37\x10\xb4\x3f\xdc\x8e\x64\x5b\xdc\x43\xf3\xf1\x86\xf9\x3a\x31\x76\xfe\x27\x00\x00\xff\xff\xe6\xd4\xc6\x8a\xc9\x02\x00\x00") - -func confGitignorePythonBytes() ([]byte, error) { - return bindataRead( - _confGitignorePython, - "conf/gitignore/Python", - ) -} - -func confGitignorePython() (*asset, error) { - bytes, err := confGitignorePythonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Python", size: 713, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreQooxdoo = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4a\x4e\x4c\xce\x48\xe5\x02\x93\xba\x29\xf9\xe5\x79\x39\xf9\x89\x29\xc5\x5c\x99\x79\xc5\x05\xa9\xc9\x25\xf9\x45\x5c\x89\x05\x99\x5c\xc5\xf9\xa5\x45\xc9\xa9\xfa\x70\x41\xbd\x8c\x92\xdc\x1c\x2e\x40\x00\x00\x00\xff\xff\xf4\x8a\x69\x1e\x3a\x00\x00\x00") - -func confGitignoreQooxdooBytes() ([]byte, error) { - return bindataRead( - _confGitignoreQooxdoo, - "conf/gitignore/Qooxdoo", - ) -} - -func confGitignoreQooxdoo() (*asset, error) { - bytes, err := confGitignoreQooxdooBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Qooxdoo", size: 58, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreQt = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x54\x4f\x41\x6e\xc4\x20\x0c\xbc\xf3\x0a\xa4\xdc\x88\x42\x1f\x91\x73\x0f\x79\x41\x65\x88\xab\xd0\x42\x09\x18\x2a\xed\xef\xd7\x4e\x94\x68\xf7\xe0\xd1\x78\xc6\x86\xf1\xa0\xe7\x71\xd4\xd9\xfd\xa0\x6f\xa4\xe1\x6f\xd5\x31\x38\x52\xca\x58\x8a\x99\xf1\x00\x29\x90\xe6\x84\x20\xae\x68\x6b\x8c\x82\x0f\x5e\x51\x6a\xd0\x4b\x9b\x90\x57\x3f\x6c\x49\xf0\x8b\xd6\x83\xdf\xf0\xee\xa8\x01\x6d\x3c\xbd\xd7\x6c\x3b\x61\x7d\xa1\xd6\x70\x53\x1c\x5d\xfa\x45\x0f\x3d\x65\xaf\xb8\xbe\x8c\xf5\xfb\xae\x4a\xbd\x58\x0f\x4c\x36\xf5\xc9\x6f\x7f\x87\x88\x3c\x3a\xb9\x1e\xe2\x3a\x99\x33\xca\x5c\x11\x5a\xae\x72\x09\xf4\x96\x09\xfe\x91\x0d\xd6\xdb\x69\xe8\x25\x49\xf8\x92\x22\xc7\x90\xeb\xef\xdf\xdf\x15\x0e\xf1\x0c\x00\x00\xff\xff\xe0\xb4\x7f\xfb\x24\x01\x00\x00") - -func confGitignoreQtBytes() ([]byte, error) { - return bindataRead( - _confGitignoreQt, - "conf/gitignore/Qt", - ) -} - -func confGitignoreQt() (*asset, error) { - bytes, err := confGitignoreQtBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Qt", size: 292, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreR = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x54\x8c\x41\x4e\x03\x31\x0c\x45\xf7\x39\x85\xa5\xee\x2a\x6a\x23\xd8\xb1\x63\x51\x89\x1d\xd2\x70\x02\x37\x71\x27\xa1\x99\x49\x14\x3b\x55\x7b\x7b\x32\x42\x54\x62\xe7\xff\xff\xf3\xdb\xc1\x47\x52\x2b\xed\x0e\xe7\x94\x45\x1d\x4e\xf1\x37\x8f\x8b\x6b\xc5\xbf\xe4\x76\x70\xbc\xf1\x52\xb3\x80\x2f\x41\x20\xad\x50\xd9\x5f\x78\x16\x38\xf5\x94\x03\xd4\x56\xbc\xa8\xba\xfd\xe1\x78\xc3\x69\xe3\xa7\x2f\xeb\x21\x95\x87\x78\x10\xdf\xd8\x55\x1a\x6d\xeb\x48\xa1\x7b\x09\x70\x4d\xf3\x2a\x66\x03\x79\x5c\xb4\xc7\x68\x4b\xfe\x57\xd4\x70\xde\xde\x3e\xdf\xbb\xc5\x17\xb0\x72\x91\xf5\x09\x54\x04\xa2\x59\xd5\x37\xa2\x39\x59\xec\x27\xf4\x65\xa1\xc8\x21\xcb\x9d\xc6\xd2\xa8\x49\x16\xd6\xa1\x30\x9e\xe9\xfa\x8c\xaf\x0e\xb7\xfe\x50\x78\x88\xdc\x4f\x00\x00\x00\xff\xff\x40\x88\x22\x46\xff\x00\x00\x00") - -func confGitignoreRBytes() ([]byte, error) { - return bindataRead( - _confGitignoreR, - "conf/gitignore/R", - ) -} - -func confGitignoreR() (*asset, error) { - bytes, err := confGitignoreRBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/R", size: 255, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreRos = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x64\x50\xc1\x6e\xc3\x20\x14\xbb\xbf\xaf\x40\xea\x2d\xd2\xe0\x1b\xaa\xaa\xab\xaa\x6d\x9d\x54\xed\x5e\x91\xc7\x0b\x7a\x0b\x81\x14\xc8\xd6\x5c\xf6\xed\x23\x6b\xbb\x76\xd9\xc5\xb2\x8d\x0d\x16\xf5\xc0\xce\x28\xa8\xd9\x2b\x70\x5c\x2b\xe8\x92\x3d\x58\x2a\x2a\xc5\x8f\x33\x29\x8e\xaa\x96\x98\x39\x78\x59\xf8\xbd\x7e\x24\x32\xb5\xc6\x76\xee\x6f\x82\x76\x73\x6f\x4f\x69\x70\xf9\xe6\xfe\xef\xfe\x6d\xcd\xf2\x87\x4a\xf6\x23\xc0\x42\x6c\xc8\x53\xd4\x99\x8c\xa8\x47\x61\x46\xaf\x3b\x46\x11\x09\x83\x6f\xd8\x0e\x91\xa0\x92\xd8\x58\x04\x55\x50\x61\xdf\xab\x33\xbb\xd6\xb7\xd6\x87\x48\xc2\xfe\xde\x62\x02\xa6\xd2\x31\xe1\x54\xf0\x93\x5b\x2e\xc6\x14\x24\x74\xdc\x27\x12\x29\x0f\x4d\x03\xb2\x8f\xe1\x9d\x30\x83\xc4\x2b\x2b\x99\x23\x46\xd2\x39\xc4\x4b\x68\xf5\xa2\x5b\x7a\xe6\x94\x93\xcc\xa7\x2c\x87\x44\x11\xa6\x7f\xbc\x8c\x2f\x80\x66\xc2\x11\xe1\x98\x2f\xd5\x87\xaa\x38\xe7\xa4\xea\x9d\xf6\x9e\xbd\x9d\x06\xdf\xa9\x9f\x85\x37\x99\x62\xd9\x57\x7d\x4d\xef\xaf\x3b\x5d\x8e\xe4\xa2\x9a\xc4\x4a\xe7\x96\xbd\xc0\x21\xe5\xd0\x89\x86\x1d\x25\x58\x2d\xdf\x9e\xb6\xbb\xc3\x76\xb3\x7b\xdd\xaf\xe1\x3b\x00\x00\xff\xff\x17\x57\xfe\x91\xed\x01\x00\x00") - -func confGitignoreRosBytes() ([]byte, error) { - return bindataRead( - _confGitignoreRos, - "conf/gitignore/ROS", - ) -} - -func confGitignoreRos() (*asset, error) { - bytes, err := confGitignoreRosBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/ROS", size: 493, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreRails = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x91\x41\x8f\xd4\x30\x0c\x85\xef\xf9\x15\x96\xf6\x56\xed\x24\xac\xb8\x8d\xb8\x01\x42\x88\xc3\x5c\xb8\xaf\xd2\xd4\xd3\x66\x27\x89\x83\x9d\xcc\x50\x7e\x3d\x49\x67\xcb\x02\xb7\xc6\xf6\xf3\xfb\xfa\x3c\x68\x1e\x9d\x72\x36\xaf\xa3\x65\x7b\x18\xf4\x52\x62\x50\x9a\x25\xa3\x53\x26\xd0\xac\x4c\x89\x59\x99\x69\x34\x83\x96\x1f\xc1\x17\x7c\xff\xef\xeb\xf0\x42\x95\x93\x0d\xca\xe4\x3a\x06\xef\x8c\xac\x52\x30\x2a\xe3\xe8\x8a\x6c\x67\x34\xca\xf4\x6d\xdb\x9e\x61\xd0\xc4\x7e\x56\x8c\x5c\x93\x2e\x3f\x8b\xca\xde\x5d\x02\x1e\x30\x5a\x1f\x76\x7b\xf5\x00\xdf\x4f\x9f\x4e\xf0\x91\x62\xc4\x54\x80\x6a\x81\xb2\xa0\x20\x70\x0d\x28\xe0\xcf\xb0\x52\x05\xcb\x08\xa7\x6f\x70\xf3\x65\x01\x41\xc7\x58\x04\x46\xf4\x69\x86\x9a\x03\xd9\x09\x27\x28\xd4\x85\xc0\x98\x49\x39\x4a\x67\x3f\x1b\x9f\x7c\xf1\x36\xf8\x5f\xc8\x62\xee\xb2\xe7\x42\x17\x4c\x2d\x89\x7d\xe6\x75\x9b\x5e\x37\x98\x07\xf8\x9c\xae\x9e\x29\x6d\x30\x89\x38\x36\xb9\xd8\xe2\x29\x1d\x95\xd1\x63\x4d\x53\x40\x65\xae\x98\x26\x62\xf3\xfa\x6c\xff\x70\x47\x96\x85\x6a\x98\xc0\x86\xd0\xe0\xc0\x2d\xe8\x2e\x0d\xcc\xa7\xce\xb6\xef\xc2\x8d\x12\xdf\x5c\x8e\x4d\xfe\x05\xe3\xd9\x07\xd4\x81\xdc\xe5\x11\x34\xd7\x71\x3d\xb4\x44\xa5\xd9\xee\xcf\x19\xa3\x60\xe9\x5e\x35\xb5\x60\x04\xa4\xe6\x4c\x5c\x7a\x06\x7c\x8d\xf0\x01\x9e\xf4\xd3\x93\x7e\x07\xc4\x30\x51\xaf\x0a\x45\x2c\x4b\xff\x3a\xdb\xe4\xd6\x47\xf0\x73\x83\xe8\xfe\x5e\x8e\xed\xee\xd7\xc8\xae\xef\x6b\x11\x57\xe9\x63\x23\xdd\x90\x0f\xdc\xae\x23\xfb\xec\x84\x67\x5b\x43\xb9\xb7\x9e\x1d\xc5\x4c\xa9\x31\x0b\x64\xdb\x2e\xb1\x55\xf5\x8b\x50\x82\x8e\x2f\x7f\x82\xb1\xd2\x58\xc5\xfc\xaf\x52\x83\xde\x4a\xcd\xf7\x4d\xda\x11\xbe\xde\xdd\x32\xdd\xfe\x4e\xa6\x5d\xba\xf4\xff\x13\xa5\x5b\xa7\x35\xd4\xef\x00\x00\x00\xff\xff\xe3\xee\x9e\x4a\xc3\x02\x00\x00") - -func confGitignoreRailsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreRails, - "conf/gitignore/Rails", - ) -} - -func confGitignoreRails() (*asset, error) { - bytes, err := confGitignoreRailsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Rails", size: 707, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreRedcar = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x2b\x4a\x4d\x49\x4e\x2c\xe2\x02\x04\x00\x00\xff\xff\xfb\x2a\xf8\x5b\x08\x00\x00\x00") - -func confGitignoreRedcarBytes() ([]byte, error) { - return bindataRead( - _confGitignoreRedcar, - "conf/gitignore/Redcar", - ) -} - -func confGitignoreRedcar() (*asset, error) { - bytes, err := confGitignoreRedcarBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Redcar", size: 8, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreRedis = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\xf0\x4c\xcf\xcb\x2f\x4a\x55\x28\x4a\x4d\xc9\x2c\x56\x48\xca\xcc\x4b\x2c\xaa\x54\x48\x29\xcd\x2d\x50\xd0\x00\x91\x7a\x45\x29\x49\x9a\x0a\x69\x99\x39\xa9\xc5\x5c\x5c\x5a\x20\x1e\x17\x20\x00\x00\xff\xff\xf9\xfc\x44\x12\x33\x00\x00\x00") - -func confGitignoreRedisBytes() ([]byte, error) { - return bindataRead( - _confGitignoreRedis, - "conf/gitignore/Redis", - ) -} - -func confGitignoreRedis() (*asset, error) { - bytes, err := confGitignoreRedisBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Redis", size: 51, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreRhodesrhomobile = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x2a\xca\xc8\xcf\xc9\x4f\xd7\xd5\xe2\x2a\xce\xcc\x05\x92\x49\x99\x79\xfa\x39\x99\x49\xc5\x60\x46\x50\x46\xbe\x53\x69\x5e\x4a\x4e\x2a\x98\x57\x92\x5b\x00\xa1\x13\x8b\xd2\x53\x4b\xc0\x4c\x2d\xbd\xc4\x82\x78\x2e\x2d\xbd\x7c\x20\xce\x4a\x2c\xe2\x02\x04\x00\x00\xff\xff\xbe\x88\x70\x1c\x4d\x00\x00\x00") - -func confGitignoreRhodesrhomobileBytes() ([]byte, error) { - return bindataRead( - _confGitignoreRhodesrhomobile, - "conf/gitignore/RhodesRhomobile", - ) -} - -func confGitignoreRhodesrhomobile() (*asset, error) { - bytes, err := confGitignoreRhodesrhomobileBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/RhodesRhomobile", size: 77, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreRuby = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x44\x51\xcd\x8e\xdb\x3c\x0c\xbc\xeb\x29\x08\xec\x2d\xc8\x27\x7d\xb9\xa6\x3d\xf6\x07\x3d\xf4\xd2\x3e\x40\x20\x4b\xb4\x4d\x44\x12\x0d\x89\xca\xae\xdf\xbe\x54\x9d\xee\x5e\x0c\x0e\x4d\x0e\x67\x46\x27\xbb\x60\x36\x27\x5b\xa7\x60\x9c\x0d\x5c\x66\x5a\x8c\x0b\xfc\xc0\xea\x17\x74\xc6\xfd\x28\x4d\x7c\x4a\x18\xbf\x51\xc2\x66\xdc\x76\x5f\xb4\xdb\x36\x0c\xae\xe2\xc6\x55\xda\x3f\x88\x6f\x3e\x6f\x3a\x63\xe5\x4d\x8c\x13\x6c\xe2\x24\x6f\xee\x59\x2a\x61\x23\x2e\xb7\x67\x6b\x7c\xcd\xcb\x0b\xfc\xd6\x4d\x9a\x29\x80\x30\xfc\xea\xd3\xfe\x93\x45\xa7\xae\xc6\x46\x2f\x27\x63\xf5\x44\xba\xad\xd4\x84\xeb\x6e\xa6\x4e\x29\x1e\x6b\x5f\x38\xf4\x8c\x45\xfc\x98\x86\xe0\xc3\x8a\xe0\x4b\x84\x05\x8b\x0a\x17\x8c\x30\x0f\xb9\x57\xf5\xb4\xfb\x1a\x39\xe8\xcd\xdb\x7b\x75\x7c\x0f\x30\xd8\xbe\x96\x07\x55\x2e\x83\x10\x0a\xd7\xec\x13\x35\x7f\xe8\x70\x76\xea\x25\xa6\x91\xc4\x03\x4b\xe4\xea\x0e\x6c\x5c\xa2\xe9\x59\x57\x97\x7d\x19\x4c\x30\x73\x05\x0f\xfa\xa7\xfa\xba\x83\x02\x0d\xf7\x0c\x3b\x77\xc8\xb4\xac\x02\xaf\x5e\x2f\xa8\x53\x5a\xf4\x0c\x82\xac\xd8\xf0\x50\x0a\x8d\x4a\xf8\xdb\x81\xc0\x11\x81\x9a\xd2\x51\x11\xbd\xa9\x66\x74\xa5\xf6\xa2\x18\x72\x4f\x42\x9a\x32\xe0\x87\xe6\xf6\x09\x58\x17\xeb\x2b\x35\x3c\x83\x46\x11\xee\x83\x28\xeb\xfc\x55\x59\xbe\x63\x1e\x27\x6c\xe2\x70\x57\x68\xab\xc6\xfc\xdf\xf3\x39\xde\xb1\x0a\x6d\x28\xc3\x43\x2f\x2a\x47\xf5\xf4\x6d\xbc\x2e\x95\x05\xea\x23\xc3\x67\xb8\xd8\xcb\xc5\xfe\x3f\x4c\x45\x1e\xdd\xc6\x19\x65\x1d\xd5\xec\x4b\xd8\xcf\x1f\xa6\x48\x73\xb7\xba\x54\x83\xf9\x13\x00\x00\xff\xff\xea\x80\x59\x32\x5f\x02\x00\x00") - -func confGitignoreRubyBytes() ([]byte, error) { - return bindataRead( - _confGitignoreRuby, - "conf/gitignore/Ruby", - ) -} - -func confGitignoreRuby() (*asset, error) { - bytes, err := confGitignoreRubyBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Ruby", size: 607, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreRust = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x70\xce\xcf\x2d\xc8\xcc\x49\x4d\x51\x48\x03\x92\xc5\x5c\x5a\x7a\xf9\x40\x5c\x0c\x22\x8a\x72\x32\x93\x80\x54\x4a\x4e\x0e\x17\x97\xb2\x82\x6b\x45\x6a\x72\x69\x49\x62\x12\x44\x51\x6a\x45\x2a\x48\xd0\x3d\x35\x2f\xb5\x28\xb1\x04\xa8\x3b\xa9\x52\xc1\x39\xb1\x28\x3d\x9f\x4b\xbf\x04\x48\xa5\x96\xe8\x73\x01\x02\x00\x00\xff\xff\xe4\xc6\xc8\x4e\x5b\x00\x00\x00") - -func confGitignoreRustBytes() ([]byte, error) { - return bindataRead( - _confGitignoreRust, - "conf/gitignore/Rust", - ) -} - -func confGitignoreRust() (*asset, error) { - bytes, err := confGitignoreRustBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Rust", size: 91, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSbt = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x44\x8d\xb1\x6e\xc3\x30\x0c\x44\x77\x7d\x85\x00\xcf\x16\xf7\x8e\x45\x81\x7e\x80\xbb\x17\xb2\xcc\x48\x0c\x64\xd1\x20\xe9\x18\xf9\xfb\x30\x53\xc6\x3b\xbc\x7b\x37\xc5\x85\xf6\xa3\x63\xfc\x3e\xa9\x6f\xf1\x8f\xb9\x87\x29\x36\xb3\xe3\x0b\xe0\xba\xae\xa4\x25\xf7\x3c\xeb\x6a\x89\xa5\x82\x60\xc7\xac\x08\x1b\x17\x85\x5f\x34\xa3\x51\xe7\xc5\xb2\x18\x6e\xf0\x43\x82\xc5\x58\x08\x35\x35\xdb\xfb\x54\x78\xdc\xa8\x9e\xf2\x86\x1e\x28\x4a\x3c\x66\xef\x4c\xfc\x24\xf8\xa8\xa2\x41\xe8\xb4\xfe\xef\x79\xe4\xea\x86\xa0\x52\x3e\xe1\x10\xbe\xbb\x10\x56\x66\xe7\x52\x23\x75\xf9\x33\xa4\x92\x4b\xc3\xf0\x0a\x00\x00\xff\xff\x80\x67\x5b\xb8\xba\x00\x00\x00") - -func confGitignoreSbtBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSbt, - "conf/gitignore/SBT", - ) -} - -func confGitignoreSbt() (*asset, error) { - bytes, err := confGitignoreSbtBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SBT", size: 186, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreScons = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x48\xcb\x2f\x52\x28\x28\xca\xcf\x4a\x4d\x2e\x29\x56\x28\xc9\x48\x2c\x51\x28\x2d\x4e\x55\x08\x76\xce\xcf\x2b\x06\xcb\x25\x95\x66\xe6\xa4\x64\xe6\xa5\x5b\x29\x64\x94\x94\x14\x58\xe9\xeb\x43\xa9\xf2\xf2\x72\xbd\xe2\x64\xa0\x2a\xbd\xfc\xa2\x74\x7d\x2e\x08\x3b\x33\x3d\x4f\x2f\x25\x29\x27\xb3\x24\x95\x0b\x10\x00\x00\xff\xff\x17\x75\xc9\x6e\x5a\x00\x00\x00") - -func confGitignoreSconsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreScons, - "conf/gitignore/SCons", - ) -} - -func confGitignoreScons() (*asset, error) { - bytes, err := confGitignoreSconsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SCons", size: 90, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSvn = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x2b\x2e\xcb\xd3\xe7\x02\x04\x00\x00\xff\xff\xe3\x97\xc2\xcc\x06\x00\x00\x00") - -func confGitignoreSvnBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSvn, - "conf/gitignore/SVN", - ) -} - -func confGitignoreSvn() (*asset, error) { - bytes, err := confGitignoreSvnBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SVN", size: 6, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSass = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x2b\x4e\x2c\x2e\xd6\x4d\x4e\x4c\xce\x48\xd5\xe7\xd2\xd2\x4b\x2e\x2e\xd6\xcb\x4d\x2c\xe0\x02\x04\x00\x00\xff\xff\x30\x6e\x9e\x4b\x17\x00\x00\x00") - -func confGitignoreSassBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSass, - "conf/gitignore/Sass", - ) -} - -func confGitignoreSass() (*asset, error) { - bytes, err := confGitignoreSassBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Sass", size: 23, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreScala = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\xcd\x31\x0e\xc2\x30\x0c\x46\xe1\xfd\x3f\x45\x25\xb6\x4a\x24\x97\x80\x81\x99\x03\x54\xae\x63\xd2\x40\x48\xa2\xd8\x08\x71\x7b\xda\x01\x95\xf1\x7b\xcb\x1b\x1d\x67\x52\xc5\xe8\x72\x8d\xc0\x61\xd0\xd9\x06\x6d\xc2\xe9\x96\x18\x8e\x89\x17\x81\x5b\x92\x5a\xed\x1f\xb8\x9c\x66\x8f\xb0\xca\x8f\x30\xea\x51\xcc\x63\x6d\xd3\x93\x0a\x45\x09\x1e\xda\x79\x47\xeb\xf5\x2e\x6c\x7e\xae\xd5\x76\xb5\xfc\x8a\xa9\xa8\xff\x79\xbb\x5e\x99\x32\x1d\x2f\xa7\xf3\xdf\x5b\xb7\x36\x05\x69\x52\x82\x14\x4e\xa2\x70\xef\xda\x1f\xba\x88\x18\xbe\x01\x00\x00\xff\xff\x0b\x5e\x3f\x7f\xb9\x00\x00\x00") - -func confGitignoreScalaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreScala, - "conf/gitignore/Scala", - ) -} - -func confGitignoreScala() (*asset, error) { - bytes, err := confGitignoreScalaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Scala", size: 185, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreScrivener = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x54\xcb\xb1\x0e\xc2\x30\x0c\x04\xd0\x3d\x1f\x13\xff\x04\x62\x62\x41\x7c\x41\xea\x5a\xd4\x72\xa8\xab\x9e\x8d\xf8\x7c\xc2\x90\x81\xe5\x86\x77\x77\x74\xd5\x2e\xa0\x45\xf7\x55\xce\xda\x32\x1c\xed\x2d\xe5\x9f\x97\xc6\x96\xc7\x44\x48\x3b\x79\xab\xbf\xea\x23\x98\x9a\x18\xc3\xee\x6c\x13\x2e\xce\xa0\x75\x44\xe5\x4d\xd8\x90\xaf\x42\xf7\x54\xb6\x9b\xbb\x51\xa1\x87\x44\xe8\xfe\x1c\x4f\xad\x47\x57\x44\xf9\x06\x00\x00\xff\xff\x3a\x06\x4f\xe1\x8c\x00\x00\x00") - -func confGitignoreScrivenerBytes() ([]byte, error) { - return bindataRead( - _confGitignoreScrivener, - "conf/gitignore/Scrivener", - ) -} - -func confGitignoreScrivener() (*asset, error) { - bytes, err := confGitignoreScrivenerBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Scrivener", size: 140, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSdcc = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x08\x76\x71\x76\x56\x28\x2e\x29\x4d\x4b\xe3\xd2\xd2\xcb\xc9\xcb\x06\x91\xc5\x25\x40\x32\x37\xb1\x00\x44\xa6\xe6\x02\xc9\xa2\xd4\x1c\x10\x09\x16\x2f\xae\xcc\xe5\x02\x04\x00\x00\xff\xff\x8f\x5b\x05\xc4\x37\x00\x00\x00") - -func confGitignoreSdccBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSdcc, - "conf/gitignore/Sdcc", - ) -} - -func confGitignoreSdcc() (*asset, error) { - bytes, err := confGitignoreSdccBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Sdcc", size: 55, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSeamgen = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x52\x41\x6f\xdb\x3c\x0c\x3d\xd7\xbf\x82\x40\x2f\xfd\x80\x2a\xc2\x57\xb4\x69\xd0\x53\x81\x61\xc0\x76\xda\xa1\xc3\xee\x8c\xcd\xd8\x5a\x64\x49\x13\xa9\xa4\xfb\xf7\xa3\xec\xb8\xc8\xd0\x74\xbe\x24\x14\xc9\x47\xbe\xc7\x67\xb7\x31\x0a\x4b\xc6\x64\x3b\x14\x6c\xce\x62\x19\x53\x63\x5b\x8f\xcc\xc4\xb6\xb1\x9d\x63\xd1\x1f\x7a\x4d\x3e\x76\xd4\x19\xcc\xed\xe0\x0e\x53\x4a\x88\xc5\x6c\x8b\xf3\xdd\x12\xc4\x22\xa9\xc8\x12\x65\x4a\x31\x4f\x11\xe6\x9e\xf4\x8f\xd0\x98\x4c\x4d\x85\xde\xb4\x85\x25\x8e\x5c\x9c\xd0\xea\x75\xf4\x4d\x73\x0d\x5b\x64\xea\x20\x06\x18\x44\xd2\x93\xb5\x2c\xd8\xee\xe3\x81\xf2\xce\xc7\xe3\xaa\x8d\xa3\x45\xbb\xd9\xac\x1f\x36\x0f\x1b\x7b\x7f\x77\x77\xff\xb8\x86\xaf\x80\x23\x64\x1a\xe3\xc1\x85\x1e\x5c\xf0\x2e\x10\x68\xe5\x48\x41\x58\x31\xdf\x88\x00\x5c\x5d\xc1\x5f\x1f\x7a\x0f\x53\x16\x76\xce\x13\x6b\xed\x44\x15\x2e\x7f\x6d\x0c\x82\x2e\x30\xf4\x14\x28\xa3\xe8\xa2\x47\xcc\x73\x2b\xec\x62\x86\x8e\x54\xa0\xdf\x75\xae\x22\xbd\x57\x6b\x99\x5e\x9b\x2a\x96\xd6\x2d\x50\x4e\x19\x77\x25\x57\x02\x33\x08\xdc\x28\xde\x09\xe2\x3f\x45\x3b\xd3\xf9\xdd\x5e\x35\x57\x09\x27\xe7\x67\xa4\x1b\x54\xe4\x59\xf0\x69\xaf\x17\xc2\xf1\x0d\xe4\x74\x9f\x8b\x20\x99\xb8\x78\xe1\xa5\xf4\x74\xbc\x0f\x4a\x6b\xee\x7c\x7f\x9d\x74\x0b\xb4\xea\x57\xb7\xf0\xa5\x74\x1c\x43\x85\x99\xaf\x7e\x51\xce\x11\x0f\x14\x60\x5e\x47\x9b\x7d\x47\xb9\xb9\xfe\x87\x3d\xae\xce\x64\x1f\xb4\x33\x97\x10\xaa\x60\x33\x7d\xf5\x0d\x43\x09\x0a\x02\x9f\x5b\xef\x12\x53\xb5\xd3\xf7\x01\xc3\x9e\x41\x22\x3c\xff\x88\xe1\x13\x60\xe8\xe0\x79\x9f\x71\x27\x38\x2d\x0c\x32\x90\xcb\x30\x90\x4f\xbb\xe2\x35\xcd\x47\xca\x5c\xfd\x87\xca\xd0\x4f\xc3\x7e\x15\x1d\xe0\x2a\x9d\xfa\xfe\x52\x0d\xf9\xed\xcc\x90\x4f\xfa\xfe\xa1\x59\x97\x5e\xb6\xf7\xff\x3f\xae\xd7\x9b\x47\x2d\xb6\xc7\x01\xc5\x38\x36\x3a\x5b\x25\x9e\x9d\x5a\x8d\xc2\xb1\xe4\x96\x4c\xb5\x46\x8e\xde\xb8\x3e\xc4\x4c\x26\xa1\x08\xe5\x60\x74\x5b\xc3\x7a\x48\x93\x72\xfc\x49\xad\x5e\xe9\x4f\x00\x00\x00\xff\xff\x86\xfc\xd0\xee\xc1\x03\x00\x00") - -func confGitignoreSeamgenBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSeamgen, - "conf/gitignore/SeamGen", - ) -} - -func confGitignoreSeamgen() (*asset, error) { - bytes, err := confGitignoreSeamgenBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SeamGen", size: 961, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSketchup = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x2b\xce\x4e\xe2\x02\x04\x00\x00\xff\xff\x1e\xdd\x12\xe3\x06\x00\x00\x00") - -func confGitignoreSketchupBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSketchup, - "conf/gitignore/SketchUp", - ) -} - -func confGitignoreSketchup() (*asset, error) { - bytes, err := confGitignoreSketchupBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SketchUp", size: 6, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSlickedit = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x8e\xc1\x8d\xeb\x30\x0c\x44\xef\xaa\x62\x80\xdc\x3e\xf0\xd3\xc5\x56\xb0\x15\x30\x12\x6d\x33\x11\x44\x41\xa4\x63\xa8\xfb\x95\x9c\x2c\x72\xd9\x0b\xc1\xc3\xcc\x9b\x77\xc1\x77\x96\xf8\xf8\x4a\xe2\x38\xb4\x3d\xac\x52\x64\x50\x49\xa8\x4d\xef\x1c\x1d\x8b\x64\x36\x50\x63\xc8\x5a\xb4\x71\xc2\xad\x23\xf1\x42\x7b\x76\xdc\x38\xd2\x6e\x1c\x2e\xf0\x5e\x25\x52\xce\x1d\xbe\x71\x3f\xf3\x51\x8b\x49\xe2\x59\x71\x1d\xd1\xd1\x7a\x72\xd6\xca\xed\xbf\x55\x8e\xb2\x48\x3c\x97\x8a\x3a\x2a\x35\x87\x2e\xa0\x81\x7a\x2f\x5f\xc3\xbf\xeb\xb3\x1e\xe7\xbd\x87\xf0\xb7\xe9\x26\xe6\xda\xfa\xc9\x71\x5a\x7f\x6d\xf3\x41\xdd\xa6\x80\x93\x14\x0c\xc3\xcf\xe4\x00\x25\x72\x82\xe9\xcb\xd4\x36\xdd\xf3\x4b\x62\x28\x4e\xda\xf0\x1d\x25\x42\xe3\xaa\x26\x13\xff\x56\x99\x63\xfb\xe7\x9d\x9f\xaf\xe1\x27\x00\x00\xff\xff\xd5\xa5\xf4\x61\x43\x01\x00\x00") - -func confGitignoreSlickeditBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSlickedit, - "conf/gitignore/SlickEdit", - ) -} - -func confGitignoreSlickedit() (*asset, error) { - bytes, err := confGitignoreSlickeditBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SlickEdit", size: 323, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreStella = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\x8e\xc1\x6a\x85\x30\x10\x45\xf7\xf9\x8a\x0b\x6e\xda\x82\x36\x08\x55\xb7\x62\xb7\x5d\xf9\x05\x13\x33\x7d\xe4\x11\x4d\xc8\x24\xff\xff\xa2\xb8\x78\x9b\x99\xcb\x9d\xe1\x70\x1a\xcc\x99\x92\x43\x3f\x68\x8d\x8f\x35\xb3\xf7\xf4\x09\x29\x31\x86\x94\xf1\x1f\x12\xf6\xe2\xb3\x8b\x9e\x41\x22\xbc\x1b\xcf\x49\x54\x83\x16\xbf\xf3\xfa\x77\x85\x65\x19\x7e\x54\x4d\xf3\x7d\xb7\x30\xee\xa8\x4c\x16\xd0\x61\x11\xcc\x93\xb7\x0c\xeb\x52\x5d\xe1\xac\x55\xad\xbe\x15\x75\xa1\x64\xf5\xd5\xd5\xe7\x3a\xa9\x1f\x2e\x86\xb5\x70\x07\x24\xf2\xe6\xc8\xdf\x6e\xe3\xa4\x75\x6b\x48\xde\xc9\xa7\xd9\x23\x04\x8b\x9d\x49\x4a\xe2\x13\x31\x4e\xea\x15\x00\x00\xff\xff\xe2\x54\x99\xdf\xcf\x00\x00\x00") - -func confGitignoreStellaBytes() ([]byte, error) { - return bindataRead( - _confGitignoreStella, - "conf/gitignore/Stella", - ) -} - -func confGitignoreStella() (*asset, error) { - bytes, err := confGitignoreStellaBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Stella", size: 207, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSublimetext = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x44\x90\x5d\x8e\xab\x30\x0c\x85\xdf\x59\x85\x25\xde\xae\x2e\xac\x65\xa4\xe9\x06\x42\xea\x80\xdb\x60\x47\xb6\xa3\x4e\x77\x3f\x09\xb4\x9d\xd7\xe3\xf3\xf3\xc9\x23\xc4\x10\x37\x84\x44\x19\x0d\x92\x28\x58\x5d\x32\xed\x08\x8e\x3f\x3e\xfc\x9b\x7d\xcf\x81\xd7\x1a\x56\x9c\x0f\xe7\x21\x7d\x29\x26\x54\xe4\x88\xf6\x51\xcd\x2f\x1b\xee\x6f\xd7\x30\xc2\x43\xf4\x6e\x25\xc4\x77\x79\x50\x84\x6a\xa8\x93\x15\x8c\x94\x28\xf6\xd0\x39\x36\x7d\xbc\x3d\x58\x54\x6e\x18\xfd\x15\xb3\x4d\x6a\xbe\xc2\x82\xd0\x7a\xe3\x1d\xaf\x40\xec\x02\xde\xa0\x15\x8b\x18\xb9\xe8\xf3\x3f\x54\x6e\xe6\x36\x02\x46\x2b\xf7\xf6\xc0\x7e\x76\x15\x51\x27\x61\x90\x04\x51\xd8\x95\x96\xda\x22\x06\x0f\xca\xb9\xdf\x97\xb0\xe4\x27\xb0\x78\xdf\xa8\x46\xbc\xc2\xf7\x89\x75\xe9\x2f\x18\xe1\x0f\xf3\x45\xd6\x21\x2d\x79\xe9\x7d\x89\xd6\xaa\xe1\x18\xe8\xbc\x43\xd7\xa7\x53\x9f\x6f\x26\x3c\xfc\x06\x00\x00\xff\xff\x2f\x07\x7f\x5d\x62\x01\x00\x00") - -func confGitignoreSublimetextBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSublimetext, - "conf/gitignore/SublimeText", - ) -} - -func confGitignoreSublimetext() (*asset, error) { - bytes, err := confGitignoreSublimetextBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SublimeText", size: 354, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSugarcrm = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x52\xcb\x8e\xdb\x30\x0c\xbc\xe7\x2b\x08\xe4\x50\x20\x07\xfb\x23\x16\x2d\x50\xa0\xbd\xf4\x81\x1e\x17\x8a\x44\x5b\x44\x64\x51\xa0\xa4\xa4\xfb\xf7\xa5\xa4\x6c\xbc\x5b\xec\xc5\xb0\x86\x43\x0e\x67\xa4\xe3\x11\x7e\xd6\xd5\xc8\xd3\x8f\xef\x87\x23\x7c\x5d\x23\x0b\x82\xad\xb9\xf0\x06\x93\x2f\xc6\x5a\xcc\x19\x72\xa9\xcb\x32\x1d\xe6\x07\xb2\x73\x8b\x57\xbe\xb1\xfa\x75\x24\x68\x0b\xcb\x0b\x58\xde\x52\xc0\x82\xe1\x65\x52\xe2\x2f\x4f\x19\x6e\x14\x02\x9c\x05\xcd\x65\x74\x54\x11\x8c\x05\xce\xe8\xcd\x95\xb8\xca\x04\x7f\x3c\x59\x0f\x37\x93\x81\x97\x82\x11\x02\x1a\x47\x71\x85\xc2\x3a\xa3\xf5\x6c\x94\x6b\x46\xad\xf6\x93\x60\xe2\x4c\x5d\x4e\x5b\xce\xc6\x5e\x6a\x6a\x60\x30\x16\x37\x1d\xdd\x94\xbf\xb0\x80\xc3\x2b\x06\x4e\x0d\xfa\x78\x57\x13\x75\x0b\xc8\x66\xd1\x75\x81\xba\x29\x07\x26\xba\xa1\x2a\xb8\x34\x97\x54\x40\x4d\xdc\xab\x1a\x44\x9f\x32\xef\x29\x64\xde\x10\x16\x0a\x98\x5b\xeb\x63\x3c\xe9\x79\x11\x8d\x72\x78\xee\xa9\x3e\xa4\xdb\x98\x0e\xcd\x1a\x50\x03\xe6\x07\xb0\xb1\xab\x01\xcf\x95\x82\x43\xd9\xe1\x1b\xcb\x45\x23\xf9\x9f\x97\xe7\xd3\xfc\xf9\x6f\xd9\x61\x93\x52\x20\x6b\x0a\x71\x1c\x85\x23\x3c\x0d\x71\xcb\x71\xa1\xb5\x4a\xaf\x41\xf6\x5c\x83\x9a\x0d\x99\x5b\x06\x6f\xec\x75\xda\x94\x7c\x7a\xfd\x7f\xe6\x2b\x8a\x90\xc3\x0e\xb6\x4b\x55\xd3\xea\x57\x53\xad\x69\x15\xe3\xf4\x68\x85\x52\xd1\x00\xf4\x66\x3f\x15\x88\x88\xae\x0f\x1b\xb4\xdf\x83\x75\xba\xf7\x7f\xe3\x35\xdf\x03\x6b\x37\x70\x8f\xff\xed\x12\xa7\x29\xf0\xfa\xfe\x9d\x45\xbc\xa9\x5a\x60\xf3\x2e\x61\x95\x18\xe0\xfc\xfa\xf3\x3c\x9e\xc3\x7c\xf8\x17\x00\x00\xff\xff\xf1\x91\x10\xc5\xde\x02\x00\x00") - -func confGitignoreSugarcrmBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSugarcrm, - "conf/gitignore/SugarCRM", - ) -} - -func confGitignoreSugarcrm() (*asset, error) { - bytes, err := confGitignoreSugarcrmBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SugarCRM", size: 734, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSwift = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x52\x4d\x6f\xd4\x30\x10\xbd\xe7\x57\x0c\x8a\xc4\xa1\xaa\x13\x51\x6e\xbd\xc1\x56\x82\x5b\x91\x90\x80\xab\x63\x4f\x92\x59\x12\x4f\x64\x8f\x77\xb7\xff\x9e\xb1\x43\x77\x0b\x97\xdd\x78\xbe\xde\x9b\xf7\xa6\x85\x5f\x8e\x3d\x36\x6d\xd3\xc2\x44\x42\x53\xe0\x88\xe0\x38\x48\xa4\x21\x0b\xc7\xf4\x08\x11\x57\x5c\x07\x8c\x20\x0c\x79\xf3\x56\x10\xbe\x2c\x3c\xd8\xa5\xaf\xbd\xdd\xb5\xef\x1e\x9e\x87\x23\x3a\xa1\x13\x9a\xc3\x2d\x0c\xef\xe1\xfb\x99\x46\xb9\x45\x9a\xa6\x6d\xe1\x73\xa6\xc5\xc3\x84\x01\xa3\x8e\xf4\xcd\x50\xde\x7d\xf3\x84\x51\xfb\xfd\x93\x15\x5b\xcb\x7e\xd8\x48\x9c\x13\x24\x14\xa1\x30\xa5\xe6\xae\xdb\x86\x4b\x4e\x18\x9b\x77\x1e\x47\x9b\x17\xb9\x06\xee\xba\x55\x09\x7d\x38\x7d\xbc\xa5\x5e\x03\x7b\xea\xe1\xff\xd4\x43\x4d\x6d\x18\xd3\xb6\x13\x7f\x5b\xf0\x6f\xf8\xe2\x0a\x86\x7f\xe5\xf5\x2c\x73\x45\xbc\x38\x37\xa3\xfb\xcd\x59\x2a\x86\x52\x37\x36\x91\x4a\x5a\x52\xa5\x23\x89\xae\x57\x5f\xc9\xad\xc3\x92\x71\x8b\x14\x64\x9f\x31\x1c\xcd\xa1\xaf\xe2\x40\x41\xa2\x91\x9c\x56\xce\xab\xdd\xf4\x8f\xb6\x82\x04\x07\x76\x6c\xbf\xb1\x4f\xd5\xa4\x9f\xa8\x7e\x38\x5e\x57\x0c\x1e\xec\x64\x29\x24\x01\xeb\xbd\x4a\x03\xca\x08\x4a\x21\x78\xd2\x1a\x35\xef\xa5\x58\xf6\xc2\x39\xc2\x4d\xfb\x0e\xbe\xf2\x19\x4f\xca\xbd\x2d\x29\x48\x33\x67\xf5\xe1\x98\xfd\x84\x30\x72\xac\xf5\x09\x97\xf1\xbe\xce\xdb\x22\x27\xb0\x8a\xa5\x37\xa1\x1f\xea\xa6\x22\x0b\x71\x40\x85\x97\x47\x1d\x32\x8b\x6c\x8f\x7d\x3f\x65\x5d\x3a\x75\xae\xb0\xdd\x94\x44\xc7\x71\xea\x73\x52\x5e\xfb\xaf\xb9\x65\x66\x59\x97\x76\xc7\x35\x64\x76\x5a\x46\xc1\x4c\xc9\x9a\x2b\x79\x43\xc1\x24\x25\xe3\xd0\xd4\x83\xe4\xa5\x2a\x50\x36\xec\xab\x30\x36\xca\x6c\xa7\xfd\x78\x3f\x79\xaf\x7c\x29\xc1\x42\x01\x81\xc6\xba\xdb\xd9\x06\x29\x12\xd8\x13\x93\x6e\x50\x7c\x2a\x3a\x51\x80\x7d\x2e\x94\xfb\x85\x31\xf2\x7a\x1d\x06\x1e\x37\x95\x16\x83\x23\xdd\xe6\x0d\x4a\x7f\xf8\x6b\x73\x6a\x9a\x6b\xac\xde\x70\xf3\x27\x00\x00\xff\xff\x4e\x4b\xee\xb1\x45\x03\x00\x00") - -func confGitignoreSwiftBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSwift, - "conf/gitignore/Swift", - ) -} - -func confGitignoreSwift() (*asset, error) { - bytes, err := confGitignoreSwiftBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Swift", size: 837, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSymfony = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x74\x90\xc1\x4e\xc3\x30\x0c\x86\xef\x7d\x8a\x20\x2e\xc0\xa1\x91\xe0\x09\xc6\x2e\x5c\x90\x2a\x10\x67\xe4\x2e\x5e\x17\x91\xc6\x21\x4e\x06\x7d\x7b\x9c\x66\x6b\x77\x60\xa7\xe6\xf7\x6f\xff\xfe\xdc\x5b\xb5\x85\xdd\x01\x15\x78\xa3\x1c\x0d\xac\xee\xde\xa7\x71\x4f\x7e\x7a\xbc\x6f\x34\x84\xa0\x77\xc5\xd6\x0f\x55\x94\x0e\x79\xdf\xac\x46\x3b\xd8\xf4\x85\x18\x6a\x6d\xf6\x97\x52\x73\x35\xfc\x49\xc2\x8f\x10\xd7\xf0\x22\xce\xe1\xab\xb1\x86\x2f\xfe\x65\x78\x07\x11\x46\x4c\x18\xf9\x84\x4a\x7e\x6f\x07\x1d\x96\x72\x3b\x8d\xee\x9a\x65\xbd\x2d\x19\xaf\xe0\x61\x40\xa3\xfa\x49\x6d\x69\x0c\xc4\x18\xeb\x44\x4f\x94\x38\x45\x08\x6d\x38\x84\x76\xe6\xa9\x98\xff\x1a\xbd\xf5\x05\xbd\x7c\x64\x15\x93\xc3\x2a\xb8\xde\xfb\x19\xf1\x3b\xdb\x88\x23\xfa\x24\xb0\x47\xf4\x86\xa2\x2e\xfb\x37\xcc\x98\x78\xfe\x43\x59\x76\xab\x1c\x1c\x81\x91\x9e\x1f\xec\x75\x9f\xbd\x71\xc8\xba\xaa\x93\x35\x8f\x75\x2f\xdd\x87\xb7\xa9\xa2\x0a\x47\x16\xd1\xfe\x96\x6b\x2f\x85\x34\x3e\x67\xeb\x8c\x32\x90\x40\x20\xcb\x7b\x1e\x3f\x9f\x2a\x39\x9b\xb7\x46\x90\xab\x94\x8b\x20\x36\x7f\x01\x00\x00\xff\xff\xa7\x53\xbf\x78\x13\x02\x00\x00") - -func confGitignoreSymfonyBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSymfony, - "conf/gitignore/Symfony", - ) -} - -func confGitignoreSymfony() (*asset, error) { - bytes, err := confGitignoreSymfonyBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Symfony", size: 531, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSymphonycms = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\xcb\x4d\x0a\x84\x30\x0c\x40\xe1\x7d\xee\x32\x93\x33\x85\x5a\x6d\x31\x7f\x98\x88\xf6\xf6\x76\x25\x2e\x3f\x78\x4f\x48\xfb\x5a\x23\xb1\x50\x69\x15\xe1\x35\xdb\x16\x1f\xa6\x38\x42\x0c\xf1\x66\x3a\x10\x2e\x3b\xf6\x70\x2a\x15\x4f\x67\xa3\x65\xa6\x5d\x23\x89\xf9\x37\xc7\x7f\xde\x09\x4f\x00\x00\x00\xff\xff\x34\x42\xaf\xc7\x5a\x00\x00\x00") - -func confGitignoreSymphonycmsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSymphonycms, - "conf/gitignore/SymphonyCMS", - ) -} - -func confGitignoreSymphonycms() (*asset, error) { - bytes, err := confGitignoreSymphonycmsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SymphonyCMS", size: 90, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreSynopsysvcs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x52\xcd\x6e\xdb\x3c\x10\xbc\xeb\x29\x16\xc8\x25\x3f\x9f\xe5\xfb\x07\x37\x40\x61\x17\x6d\x80\xf4\xd2\x9f\xe4\x18\xd0\xd4\x52\x22\x42\x91\x06\x97\x92\xeb\xb7\xef\x2c\xe5\x3a\x45\xdb\x0b\x4d\x5a\x3b\xb3\x33\xb3\x7b\x45\xcf\x66\x66\x97\xf2\x48\x7a\x98\x22\xcd\x6d\x3b\xdb\x4e\xcf\x83\x9e\xbc\x3c\x9c\x74\xfb\xa6\xb9\xa2\x1d\x3b\x33\x85\x42\xd1\x8c\x4c\xc9\x51\x19\x98\xc4\x8f\x53\x30\xc5\xa7\x48\xfc\x83\xed\x54\xcc\x3e\x70\x4b\xf4\x9e\x3a\xef\x1c\x67\x8e\xe7\x7a\x6b\x22\xed\x99\x40\x23\x07\xb6\xde\x79\xee\xe8\xe8\xcb\x00\x16\x2f\x24\xb8\xda\x81\xae\x95\xd2\x88\x24\xeb\x4d\x41\x41\x67\x7c\xe7\x33\x7e\x40\x6b\x84\x17\x26\x94\x83\xc5\x04\x49\x54\xcc\x2b\x47\x72\x39\x8d\x34\xa0\xd7\xcd\xff\x44\xab\x44\x9b\x83\x29\xc3\xfd\x7a\xe3\x7c\x60\x45\xdc\x37\x50\x39\xab\x83\x8f\x1c\x39\x57\x66\x18\xa6\x27\xce\x3e\xa4\x9e\x4c\xec\xe8\xe9\xd3\xee\x91\x4a\x3a\x90\x4d\xd1\xf9\x5e\x2a\xa4\x5d\xfa\xaf\xcf\x8f\x7d\x5b\x1f\xe0\x79\x88\x2e\x1b\x29\x79\xb2\x65\xca\x90\xc5\x96\x45\x4c\x3e\x81\x01\x04\xab\x73\x28\x4c\x5f\x4f\x52\x78\xdc\xd2\x98\x3a\x0e\xb2\xf8\x05\xfc\xdc\x78\x5d\x9b\x2e\xdf\x34\xb2\x08\x53\x85\x73\x54\x24\x3a\xb1\x2d\x09\x94\xa3\x39\x69\x70\xff\x48\x4d\xb3\xac\xb9\xa9\xed\xcf\x40\xbc\xdb\x5c\x60\x2f\x35\x83\xc6\x4a\xb6\x55\xf1\x23\x7c\x6a\x1e\xb4\xaa\x63\x73\x29\x84\x74\xf4\xb1\xff\x95\xbc\xd1\xb7\xa8\xfe\xa5\xd1\x69\x29\x53\x44\x19\x4c\x41\xd3\x10\x20\x03\x4c\x93\x40\x03\xea\x8e\xd9\x43\x27\x70\x34\xaa\xf9\x9e\x65\x19\xc4\xdb\x46\xa8\xac\x40\xbf\x8d\xe1\xb6\x85\x6b\x55\xb3\x4d\x33\xe6\xd0\x33\x65\x16\x6c\x94\xd0\x75\x7f\x99\x4c\xb5\x37\xe5\xfe\xa6\xce\xe5\x32\xfa\x90\x6c\x25\x45\x50\xdf\x86\xba\x47\x7f\x79\xd0\x15\xab\x6b\x81\xb8\x54\x25\xfa\x83\x87\x56\xba\x42\x1b\x7b\x6e\xf9\x72\x89\xe8\xbe\x9d\xb1\xd7\x75\xb4\xb8\xac\x1b\xd4\x7e\xe1\x43\xca\xa5\x06\xb6\x7b\xfa\x50\x05\x7c\xdf\x3e\x3e\x40\x66\x58\xb6\x06\x56\xa4\x6d\xf0\xad\xde\x80\xb1\xc1\xb7\xaf\x7c\x52\xc4\xf3\x80\x5d\xd4\xd4\x3a\x16\xdf\x47\xdd\x53\xc0\xf6\xe9\x6d\xe1\x76\xb5\xf5\xf6\xbf\x3f\x46\x50\x53\x46\xb5\xcd\xac\xa5\xa0\xaa\x19\x74\x6c\x83\xc9\xd5\xb4\x54\xf8\x76\xbd\xbd\xbb\x23\x37\x45\x5b\xff\x6b\x9b\xd9\xbe\x0c\x5d\x96\x76\x68\x7e\x06\x00\x00\xff\xff\x44\xbc\x0b\x5f\xcb\x03\x00\x00") - -func confGitignoreSynopsysvcsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreSynopsysvcs, - "conf/gitignore/SynopsysVCS", - ) -} - -func confGitignoreSynopsysvcs() (*asset, error) { - bytes, err := confGitignoreSynopsysvcsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/SynopsysVCS", size: 971, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreTags = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\xf0\x4c\xcf\xcb\x2f\x4a\x55\x28\x49\x4c\x2f\x56\x48\x2e\x4a\x4d\x2c\x49\x4d\x51\x48\xaa\x54\x48\x05\x09\xe8\x28\x24\x43\xa8\x74\xb0\xb4\x86\xbb\x5f\xa8\x42\x7a\x4e\x7e\x52\x62\x8e\xa6\x42\x62\x5e\x8a\x42\x72\x71\x72\x7e\x41\x2a\x57\x88\xa3\x7b\x30\x97\x22\x88\xd4\xe7\x02\x29\xe4\x52\x04\x91\xfa\x5c\x60\x5d\x7a\x69\x99\x39\xa9\xc5\x5c\xee\x60\x45\xee\x41\x10\x2a\xc0\x31\xc4\x83\x0b\xa2\x1b\x2a\x0f\xe5\xe4\x97\x96\xc0\x98\x99\x79\xc8\xbc\x82\x7c\x30\x8f\x0b\x10\x00\x00\xff\xff\xe7\x03\xe1\xfd\xb1\x00\x00\x00") - -func confGitignoreTagsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreTags, - "conf/gitignore/Tags", - ) -} - -func confGitignoreTags() (*asset, error) { - bytes, err := confGitignoreTagsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Tags", size: 177, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreTex = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x74\x54\x5b\x6b\xdd\x3e\x0c\x7f\xcf\xa7\x30\x14\xfe\xb4\x81\xa4\xff\x3d\xec\x61\x7b\xdb\x9d\xbd\x8d\x32\x18\xac\x8c\xe2\xd8\x4a\x62\xe2\x4b\xb0\x9d\xd3\x64\x9f\x7e\x92\x9c\xb3\x9e\x73\xda\xbd\xc8\xba\xd9\x92\x7e\x92\x7c\x75\x25\x3e\x84\x08\xc2\xca\x0c\xeb\xed\xac\x7b\x66\x84\x5c\x56\x63\x8d\x8c\x9b\xe8\x8d\x85\xf4\xb6\xaa\x5b\x54\x21\xb5\xa1\x67\x3a\x30\xcd\x48\x7b\x9b\x90\x86\x85\xf8\x1c\x54\x55\xe1\x93\x5f\x7d\x86\xe8\x40\x1b\x7c\x4c\xe8\xa0\x16\x07\x3e\xf3\x2b\xfa\x60\xaa\xba\x51\xc1\x1f\x20\x66\xd0\x4d\x0e\x6d\x5d\x5d\x89\x3c\x42\x02\x11\x17\x8c\x25\x9c\x19\xc6\x2c\x60\x55\x76\xd1\x20\x8c\x93\x03\x94\x2c\x44\x1f\x22\x72\xc3\x12\x91\x87\xac\x5a\xbc\x58\xb7\x73\xe2\x03\xf6\x13\x4b\xe0\x14\xde\x9b\xce\x9a\x30\x44\x39\x8f\xdb\x65\x39\xe2\xba\x33\x1d\xd5\x8b\x47\x29\x1c\x19\x88\x37\x94\x60\xd7\x59\xa2\x8a\xca\xec\x2c\x96\xd9\x74\x76\x2d\xc5\x33\x87\x9e\x64\x89\x64\x8f\x8b\x6f\x57\x67\x4b\xbc\xc5\x58\x2d\x72\x08\xf6\x25\xf0\x7a\xdd\x3d\x70\x24\x37\xa1\x94\x36\xaf\x90\x7f\xe2\xda\xe1\xf7\x99\x70\xdd\x2d\x69\xbb\xa9\xb8\x1a\xd2\x72\x84\x77\x7f\x9f\x95\x5e\x0b\x73\x0a\xf1\x0e\x4f\x0c\x4e\x04\x84\x32\x8a\x59\xaa\x09\x71\xc3\xd8\x78\x55\x48\x3b\x84\x68\xf2\xe8\xa8\x53\xd2\x96\xde\x49\xb6\xa8\x11\x5c\x0a\x95\x54\xa9\xa9\xb9\x36\x52\xba\x84\xbe\xd4\x4e\xa4\x28\x77\x20\x1d\x44\x94\xbd\x3c\x50\x9a\x9e\x6c\x87\x48\xbe\xd7\x70\x63\x41\x3b\xa9\x6e\x0b\x37\x4b\xf2\x03\xaf\x91\xde\xbf\x6a\xde\xfc\x3a\x9e\xf7\xff\x5f\x0a\x67\x9a\xbb\x33\xd3\xdd\x73\x47\x52\x01\x06\x48\xa0\x8e\xef\x9e\x8a\x97\xe6\xe3\xe3\xcf\x74\x2f\x3a\xfe\xd3\x7b\xbf\x82\x18\x0c\x36\xa4\x24\xa3\x01\x86\x50\x79\xa6\x54\xeb\xc0\x70\xa2\x99\x69\x62\x5f\xbf\xcc\xb8\x1b\xdc\xe1\xe6\x49\x68\x6a\x32\x8e\xdb\x0c\x31\x42\xbf\x0f\x11\x6a\x26\x6f\x72\x2c\x4b\xa1\x42\xd4\xd2\x2b\x68\xcb\x74\x64\x33\xe1\x5c\x34\x74\x7c\x34\x2a\x9b\xe0\xb1\xfb\x74\xc5\x9a\x94\x8d\x1f\x12\x37\x92\xe6\x4f\x38\x39\x81\xd1\x74\x69\xa7\x9c\x96\xe1\x46\xa0\x33\xbb\x18\x0c\x84\x0b\x5a\xb7\x4e\x52\x78\x97\x55\xa1\xc7\xf2\x89\x7d\x02\xaf\xdc\xc0\x1d\xad\x1e\xca\x59\xd3\x3c\x6e\x03\x1b\xf0\xcb\x78\xc4\x89\x62\x34\xdc\x23\xab\x36\x9e\x6f\x5c\x51\x27\xf9\x5b\x70\x1c\xd4\x07\x5c\x7d\x45\x2b\xe5\x11\x22\x54\x24\x1c\xcb\x7d\xf6\x0b\xc7\xe7\x89\x38\x6f\xa7\x36\xe5\x34\xdf\xda\x5c\xd1\x97\x7f\xa6\x88\x4c\x1b\x42\x37\x35\x18\x17\x07\x98\x56\x99\xdc\xbf\x9b\xe9\xa7\xf8\x4f\x7c\xfb\xf2\x99\xbe\x9c\x39\x8f\x94\xa6\x7e\x5d\x7e\x31\x1b\xd4\x44\x4e\x39\xe8\xe0\x43\xa9\x21\x6b\x4e\x6e\x45\xc0\x28\xcc\xaa\x19\xe6\x1f\xc6\x7f\xd2\x14\xaf\x93\xbc\xb6\x38\xfe\x7f\x02\x00\x00\xff\xff\x31\xf7\xc1\xd6\x30\x05\x00\x00") - -func confGitignoreTexBytes() ([]byte, error) { - return bindataRead( - _confGitignoreTex, - "conf/gitignore/TeX", - ) -} - -func confGitignoreTex() (*asset, error) { - bytes, err := confGitignoreTexBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/TeX", size: 1328, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreTextmate = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xd2\x2b\xc9\x2d\x28\xca\xcf\xe2\x82\x31\x52\x93\x4b\xb8\x4a\x72\x4b\x12\xd3\x8b\xb9\x00\x01\x00\x00\xff\xff\x36\x23\xd5\x9c\x1c\x00\x00\x00") - -func confGitignoreTextmateBytes() ([]byte, error) { - return bindataRead( - _confGitignoreTextmate, - "conf/gitignore/TextMate", - ) -} - -func confGitignoreTextmate() (*asset, error) { - bytes, err := confGitignoreTextmateBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/TextMate", size: 28, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreTextpattern = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\xcb\x28\x49\x4c\x4e\x4e\x2d\x2e\xe6\x4a\x2e\x2e\xd6\x2b\xc8\x28\xe0\x2a\x2a\x48\xd6\xe7\x2a\xce\x2c\x49\x2d\xd6\x07\x91\x5a\xfa\x89\x29\xb9\x99\x79\xa8\x42\x05\x45\x99\x65\x89\x25\xa9\x68\x82\xa5\x49\x39\x99\xc9\x58\x95\x43\x64\x8a\x53\x4b\x4a\x0b\xb0\xca\x94\x64\xa4\xe6\x02\x4d\x2b\x49\xad\x28\x29\x48\x2c\x29\x49\x2d\x02\x1a\xe0\xe1\x19\x1c\xe2\x1f\x14\xa9\x57\x52\x51\xc2\x15\xe4\xea\xe8\xe2\xeb\x0a\x66\x02\x02\x00\x00\xff\xff\x32\x3a\x10\xce\xb1\x00\x00\x00") - -func confGitignoreTextpatternBytes() ([]byte, error) { - return bindataRead( - _confGitignoreTextpattern, - "conf/gitignore/Textpattern", - ) -} - -func confGitignoreTextpattern() (*asset, error) { - bytes, err := confGitignoreTextpatternBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Textpattern", size: 177, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreTortoisegit = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x08\x28\xca\xcf\x4a\x4d\x2e\xd1\xcd\x49\x2d\x4b\xcd\x51\x28\x4e\x2d\x29\xc9\xcc\x4b\x2f\xe6\xd2\xd7\x2b\x49\xcf\x2c\x49\xce\xcf\x4b\xcb\x4c\xe7\x02\x04\x00\x00\xff\xff\x87\x0b\xb6\x1b\x26\x00\x00\x00") - -func confGitignoreTortoisegitBytes() ([]byte, error) { - return bindataRead( - _confGitignoreTortoisegit, - "conf/gitignore/TortoiseGit", - ) -} - -func confGitignoreTortoisegit() (*asset, error) { - bytes, err := confGitignoreTortoisegitBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/TortoiseGit", size: 38, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreTurbogears2 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x54\x8c\xb1\x8a\xc3\x30\x0c\x40\x77\x7d\x85\xe0\xb6\x40\x9c\x9f\xb8\xe5\xb6\x5b\x6e\x3a\x3a\x28\xb6\x62\x4c\x5d\xcb\x58\x4a\x48\xfe\xbe\x36\xa5\x43\x17\xf1\xf4\xf4\xd0\xe4\xea\xf5\xef\xe5\x06\xf0\x85\xdf\xbc\xd1\x9e\x0d\x03\x1f\x9c\xa5\x3e\xb8\x74\x26\xa3\x95\x94\xa1\xcb\xc1\x2e\xac\x1f\x69\x57\x18\x52\x63\x6f\xd2\x2e\x18\xeb\x32\x8d\xe0\x97\xfc\x9d\x22\x2b\x4c\x8e\x63\x7c\xcd\x39\x95\x4d\x20\x24\x35\x58\xf7\x94\xc3\xe8\x7e\x8a\x1a\xe5\xcc\x0d\xb3\x44\x85\x9a\xea\xdc\xc1\xd9\x69\xe3\xfa\x57\x92\xa1\xb1\x1a\x2e\xe8\xe5\xe0\xd6\x5f\x62\xe3\x2a\xcd\x14\xdc\xdb\x80\x33\x39\xe1\x19\x00\x00\xff\xff\x8c\xf3\xba\xc1\xca\x00\x00\x00") - -func confGitignoreTurbogears2Bytes() ([]byte, error) { - return bindataRead( - _confGitignoreTurbogears2, - "conf/gitignore/TurboGears2", - ) -} - -func confGitignoreTurbogears2() (*asset, error) { - bytes, err := confGitignoreTurbogears2Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/TurboGears2", size: 202, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreTypo3 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x64\x91\x4d\x4f\x03\x21\x10\x86\xef\xfb\x2b\x26\xe9\xad\xd1\x25\xb1\x89\xf7\xa6\x9a\xd8\x93\x1e\xbc\x78\xda\x10\x66\x58\x88\x2c\x43\xf8\xa8\xee\xbf\x17\xb6\xd5\x6e\xe3\x09\x78\xde\x99\x77\x3e\xd8\x6c\xe0\xfd\xe3\xed\x75\x07\xa7\xc7\xfe\xa1\xdb\xc0\x71\xf4\x1c\x09\x12\xc5\x13\x45\xe9\xa0\x04\xc7\x12\x41\x7a\x04\x6d\x1d\x01\xda\x48\x2a\x73\xb4\x94\xfa\x4e\x34\x24\x71\xb2\x5e\x94\x9a\x31\x9c\x83\xc5\x9a\x0f\x99\xa6\x30\xdc\xa2\x10\x59\x51\x4a\x84\x8d\x9f\x73\x92\xb8\xd6\x56\x52\x19\xea\x44\x9e\x03\xef\x14\x7b\x2d\x16\x8b\xc3\xfe\xf0\xf2\xfc\xb4\xfd\xc7\xb5\x25\x87\x47\xaf\xb9\x0f\x26\xac\x55\xa4\x50\x5b\x95\xd9\xb2\x1f\xb6\xbd\xe3\x71\x2d\xee\x11\x6d\x53\xa4\x3b\xd4\xa7\x1d\x4b\x5c\x02\x17\x8f\xeb\x12\xe6\x54\x4b\x80\x66\x87\x14\xd3\x1d\xcc\x5c\x20\x19\x2e\x0e\xc1\xc8\x13\x41\x36\x55\x4d\xf3\xe4\xac\xff\x24\xec\x5b\xa2\x06\xcf\x19\x14\x4f\x13\xf9\x0c\x5c\x72\x0b\x6a\x0e\x8e\xbf\xac\x1f\xa1\xd2\xcb\xea\x96\x5e\x2e\xc7\x90\xa2\x5a\x5d\xef\xeb\x94\xbd\xc9\x52\xb5\x2d\x75\xc2\x7a\xa4\xef\xdb\xce\xda\xe4\x7f\x5f\x31\xff\xba\x35\x2a\xba\x9f\x00\x00\x00\xff\xff\x19\x14\x54\xd3\xd2\x01\x00\x00") - -func confGitignoreTypo3Bytes() ([]byte, error) { - return bindataRead( - _confGitignoreTypo3, - "conf/gitignore/Typo3", - ) -} - -func confGitignoreTypo3() (*asset, error) { - bytes, err := confGitignoreTypo3Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Typo3", size: 466, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreUmbraco = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x74\x90\x41\x6f\xe2\x30\x10\x85\xef\xf9\x15\xb3\xe2\xb0\xbb\x1c\xc8\x7d\x6f\x5b\x92\x56\x48\x85\xa2\xb6\xf4\x82\x50\x35\xd8\x43\x18\xe1\xd8\x96\x3d\xa6\xf0\xef\x6b\x08\x12\x04\xa9\xd7\x79\xdf\x9b\xf7\xf4\x06\x30\x73\x42\xff\xe0\x83\x63\x42\xf3\x26\x49\xb3\x83\x86\x85\x1b\xeb\x02\x41\x48\x86\x22\xb4\x78\x04\x34\xd1\xc1\x3a\x5f\xc8\xd0\x1e\xad\x14\xc5\x00\x26\x1d\x94\x2c\xb7\xde\x05\xc9\x57\xd8\x38\xa3\x29\x44\x68\xc8\x52\x40\x21\x0d\xeb\x23\x2c\xda\x75\x40\xe5\x8a\xe1\xb0\xfc\xef\xfd\x67\x85\x82\xe5\xd8\x30\x59\xa9\xc8\x93\xd5\x64\xd5\xb1\xec\xa9\xf5\x01\x5b\xb6\x34\xc9\xda\x81\x62\x5f\x7b\x76\xcd\xdd\x65\x39\xf7\xab\x40\x7b\xa6\xaf\xfe\xfd\xbd\x9e\xce\xcb\x62\x8c\x6a\x4b\xba\xbc\x29\x7c\xe9\x03\xca\x59\xc9\x25\x40\x9d\x08\xd8\xb0\xa1\x9e\x3d\x75\xd8\x28\x63\x1b\x6e\x4e\xfe\xca\xd9\xdf\x02\xdc\xff\xe2\x51\xed\xb0\xc9\x33\xfd\xb9\x1d\x71\x74\x1d\xb1\xe5\x28\xb8\xcb\x80\x6c\x39\xe6\x85\x02\x20\xcc\xd2\x13\xc9\xd5\xda\xcd\xf6\x37\x47\x4c\x33\x09\x31\x65\x9b\x38\x60\xab\x4c\xd2\x04\x9a\x04\xd9\x64\x2c\xb8\x16\x7e\x48\x79\xa8\x1f\x5f\x5e\xeb\x73\x46\xf1\xeb\x7e\x9d\x4b\x4e\x79\x56\x96\x8b\xb4\xea\xba\x97\xcb\x4a\xaf\x68\x4f\xc6\x79\x0a\xb7\x60\xf1\x1d\x00\x00\xff\xff\xfa\xea\x80\x3b\x18\x02\x00\x00") - -func confGitignoreUmbracoBytes() ([]byte, error) { - return bindataRead( - _confGitignoreUmbraco, - "conf/gitignore/Umbraco", - ) -} - -func confGitignoreUmbraco() (*asset, error) { - bytes, err := confGitignoreUmbracoBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Umbraco", size: 536, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreUnity = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\x8e\xbd\x4e\x04\x31\x0c\x84\xfb\x3c\x85\x25\x3a\x8a\x4d\xc1\x13\x00\x27\x68\x40\x27\xf1\xd7\x9c\xb6\x48\x2e\x5e\xc8\x29\x1b\x47\xb6\x23\xb1\x6f\x4f\x8c\x4e\x07\x8d\xfd\x69\x32\x93\xb1\x3f\x3c\x95\x39\x47\x0e\xbc\x79\xe7\x0f\x6f\x3a\xe3\xda\x8c\xf6\x34\xc7\x93\xc1\x5d\x9c\x7b\x2e\xc9\x3b\x77\x05\xb7\x5d\xe9\x13\x2b\x72\x50\x4c\xf0\xf1\xea\x9f\x77\x20\x54\xba\x66\xaa\x10\x6a\x82\xc6\x74\xc2\xa3\xc2\x92\x0b\x8a\xbb\x9e\x8e\x62\xca\x80\x5e\xb3\x6e\x67\x96\x52\x6d\x76\x1a\x53\xd7\x66\xaf\x82\x7c\x5e\x8d\x71\xb1\x64\xcb\x29\x8e\x15\x89\x7e\x53\xa3\xfc\xdd\xbe\xb8\xd9\xc1\xdf\x01\x2b\x6a\xb8\x54\x59\x60\x32\xe5\xbf\xf7\xf1\xe2\x7d\x18\x36\xd8\x57\xb8\xe7\x20\x5f\xf0\x82\x8d\x58\xc5\xc9\x26\xb9\x2e\x34\xe9\xb7\xba\x9f\x00\x00\x00\xff\xff\x95\x84\x9f\x96\x0b\x01\x00\x00") - -func confGitignoreUnityBytes() ([]byte, error) { - return bindataRead( - _confGitignoreUnity, - "conf/gitignore/Unity", - ) -} - -func confGitignoreUnity() (*asset, error) { - bytes, err := confGitignoreUnityBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Unity", size: 267, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreVvvv = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xe2\x52\x56\xd0\x2b\x33\x29\x50\x48\x4a\x4c\xce\x2e\x2d\x50\x48\xcb\xcc\x49\x2d\xe6\xd2\xaa\xd3\xab\xc8\xcd\xe1\x02\xca\xb9\x54\xe6\x25\xe6\x66\x26\x2b\x14\xe4\x94\xa6\x67\xe6\x15\x2b\xe8\xa5\xe4\xe4\x70\x25\x65\xe6\xe9\x73\x01\x02\x00\x00\xff\xff\xcd\xef\xf8\xaa\x39\x00\x00\x00") - -func confGitignoreVvvvBytes() ([]byte, error) { - return bindataRead( - _confGitignoreVvvv, - "conf/gitignore/VVVV", - ) -} - -func confGitignoreVvvv() (*asset, error) { - bytes, err := confGitignoreVvvvBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/VVVV", size: 57, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreVagrant = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x2b\x4b\x4c\x2f\x4a\xcc\x2b\xd1\xe7\x02\x04\x00\x00\xff\xff\xfc\x50\x87\xfb\x0a\x00\x00\x00") - -func confGitignoreVagrantBytes() ([]byte, error) { - return bindataRead( - _confGitignoreVagrant, - "conf/gitignore/Vagrant", - ) -} - -func confGitignoreVagrant() (*asset, error) { - bytes, err := confGitignoreVagrantBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Vagrant", size: 10, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreVim = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x8a\xd6\x8b\x8f\xd5\xd2\x2b\x8e\x4e\xd4\x2d\x8f\x05\x12\x55\xb1\x5c\x20\x11\x64\xbe\x96\x5e\x69\x5e\x1d\x57\x70\x6a\x71\x71\x66\x7e\x9e\x5e\x59\x66\x2e\x97\x5e\x5e\x6a\x49\x51\x79\x46\x66\x71\x09\x97\x56\x1d\x17\x20\x00\x00\xff\xff\x5e\x00\xdf\xf9\x42\x00\x00\x00") - -func confGitignoreVimBytes() ([]byte, error) { - return bindataRead( - _confGitignoreVim, - "conf/gitignore/Vim", - ) -} - -func confGitignoreVim() (*asset, error) { - bytes, err := confGitignoreVimBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Vim", size: 66, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreVirtualenv = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x3c\xcc\xb1\x0a\xc2\x30\x10\x80\xe1\xfd\x9e\xa2\xd0\x39\xb9\x20\x88\xe8\xe8\x26\x38\x08\x82\x4b\xc9\x90\x5e\x53\x7b\x9a\x26\x21\x49\x0b\xf5\xe9\x0d\x0e\x4e\xff\xf4\xfd\x6d\xf3\xe0\x54\x16\xe3\xac\x5f\xa1\x6d\xa6\x52\xe2\x09\x91\xcd\xfc\xb1\x83\xa4\x30\xe3\x4e\xa9\x23\xaa\x3d\xaa\x03\x1a\x11\x13\xcf\x36\x89\xe0\xc5\xfa\x57\x08\xf2\xb6\x95\x29\x78\xe8\xce\xbd\xe6\x9a\x0b\x6b\x4f\x6e\x19\x2c\x74\x57\xa7\xb9\xff\x25\x90\x71\xd0\xdd\xb3\xa6\xc4\xb1\x64\x88\xdb\x5a\xb1\xa4\xf1\x09\x91\xa3\xc8\xd6\x8d\x34\x59\x7a\xcb\x57\xae\xab\x6f\x00\x00\x00\xff\xff\x42\xd7\x5f\x93\x97\x00\x00\x00") - -func confGitignoreVirtualenvBytes() ([]byte, error) { - return bindataRead( - _confGitignoreVirtualenv, - "conf/gitignore/VirtualEnv", - ) -} - -func confGitignoreVirtualenv() (*asset, error) { - bytes, err := confGitignoreVirtualenvBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/VirtualEnv", size: 151, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreVisualstudio = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x56\x5d\x6f\x1b\xbb\x11\x7d\xdf\x5f\xc1\xc2\x17\x6d\xa2\x1b\xaf\xda\xa0\x0d\x8a\xf6\xc9\x91\xf3\x55\x58\xb6\x1b\x29\xbd\x01\x0c\x41\xa0\x76\x47\x5a\x46\x5c\x92\x20\xb9\xfa\xb8\x0f\xf9\xed\x3d\x43\xee\xda\x8a\xed\x3c\xdc\x17\x2e\x97\x1c\x0e\x39\x67\x0e\xcf\xf0\xec\x4c\x7c\xda\x18\xeb\x49\xfc\x4f\x85\x4e\x6a\x31\x8b\x5d\xad\xac\x88\xd4\x3a\xeb\xa5\x3f\x8a\xb5\xd2\x14\x5e\x89\x55\xa7\x74\x2d\x3c\x85\x4e\x47\xfc\x4a\x53\x17\x58\x9b\x26\xc5\x86\x0c\x79\x19\xa9\x16\xab\xa3\x70\xd6\x75\x5a\xfa\x47\xfe\x64\x5d\x9f\x5b\x13\xca\xa2\x38\x13\x5f\x02\xf9\xf3\xe0\xa8\x52\x6b\x55\x65\x17\xc5\xa8\x0c\x9d\x45\xdb\x61\xae\xff\xd8\x10\x2a\x59\x35\xc4\x73\xda\x94\xb5\xad\x42\xc4\x26\xe1\x27\x2e\xc4\x8b\xa9\x35\xf6\x92\x76\xa4\xad\x1b\x7f\x95\xad\xf4\xca\xf4\xdb\xbf\xec\x5d\x3a\x4f\xeb\xb4\xfe\xed\x69\x34\xc5\xdd\x65\xbd\xa0\x55\xb7\x19\xdf\xf7\x6e\xbb\x95\x56\x15\xfe\x3f\xfb\x05\x69\x92\x81\x4e\xfb\x61\x5c\x1c\xde\xfc\x1d\xcd\x3f\xdf\x8c\x8b\x04\x0c\x3e\xdc\xdc\xbd\x5d\x2d\x94\xc1\xf7\xc6\x2e\x56\xdf\xc6\xbc\xd3\x8f\x30\xbc\xfe\xeb\xdf\xfe\x21\x52\x54\x63\xeb\xa2\x02\x22\xa2\x56\x9e\xaa\x68\xfd\xb1\x28\x77\x70\x8c\xd8\x4c\x65\xdb\x96\x4c\x14\x6a\x2d\x8e\xb6\x13\x8d\xdc\x91\x88\x32\x6c\x83\x88\x8d\x8c\xa2\xf2\x04\x1c\xd0\x27\xe1\xbc\xfd\x86\xd5\x7f\x09\x82\xb1\xb9\x87\x02\x81\xef\xf7\x7b\x6f\x6d\x2c\xce\xfa\x4e\x3a\xcc\x74\x36\xa7\x10\x91\x5c\x34\x9f\x87\xe0\xe7\x71\x81\xff\x14\x1d\x8f\x8c\x72\x18\x1c\xd5\xdd\x95\x5e\xd8\x4d\x39\xe2\xa5\xd7\x5f\xae\x3f\xcd\x01\x63\x8e\x67\xc6\x99\x28\x0f\xad\x2e\xd8\x61\x76\x95\x7e\xef\xb1\xed\xdd\x0b\xbb\x06\x57\xc4\xc5\xfc\x4a\xdc\xe6\xb3\x3e\x60\x3c\x3b\xc5\x94\xff\x6a\xad\x6b\x19\x65\x59\xb1\x9b\xcb\xeb\xaf\x45\x1f\x5e\xa9\x6d\xb5\x2d\xbf\x05\x6b\x0a\xe9\xa3\x5a\xcb\x2a\x02\xa9\x62\xb4\x54\x30\x1d\x2d\x5d\x6a\x55\xd9\xe0\x78\x4a\x6f\xd1\xb6\x14\x25\x3e\x76\xf5\x0d\xad\xab\x78\xc2\xd5\x2b\x6e\x37\x55\x6a\x6b\xb4\x3e\x38\xa6\xd6\x8a\xf9\x16\xf5\x2a\xb5\x2a\xb5\x6c\x1f\x5b\x97\xdb\x25\x1f\x02\x5d\x6d\x37\x68\x77\xc1\x85\xaa\x4a\x9d\xc0\x9d\x32\xa5\x9f\xf9\xeb\x54\xda\x21\xec\xaa\x6c\xc9\xb3\x08\x63\xd2\x74\xf1\x77\x27\x1b\x91\x90\xcf\x64\x5f\x0e\x83\xa3\x13\x86\x4c\x7e\xfd\x35\x33\xa3\x37\x52\x38\xf7\x18\x7e\xa4\x63\xef\xa6\x62\xe7\xd6\x91\x09\xf5\x9a\xbd\xa7\x36\xd9\xb3\xf9\x53\xa6\xe1\xd4\x3c\xc1\xc1\x39\x30\x36\xe4\xb3\xe7\xf6\xc0\x0e\xa4\xe3\x45\xf3\xf7\x33\x26\xe5\x6b\x71\x65\x2b\x2c\xfe\xcd\xfa\x6d\x70\xb2\xa2\xe2\x97\xb8\x4e\x94\xf9\xd0\xa9\x5a\x9a\x8a\xc4\x45\x17\x6d\x2b\x99\xb3\x62\x6e\xad\xde\xaa\x08\x2f\x1b\x97\x98\xc0\x86\x9f\x69\xd6\x48\xef\xc8\x0b\x15\x84\x14\xe5\xf5\xbb\xb9\xa8\x6c\xad\xcc\x26\x5d\x7e\x65\x8a\xe5\xbd\xc9\x88\x03\x4b\xb9\xbf\x9b\x85\x45\x1e\xc3\xc8\xa5\x8d\x33\x8a\x11\x4b\x42\x16\x02\xb8\xfd\x4f\x17\xe2\xc4\xd6\xf4\x53\xaf\xe5\x60\x91\xc2\x21\xd9\x4e\x54\x3c\x66\xeb\xac\x59\xc3\xee\xc3\x5c\x02\x1d\x5b\x4d\xec\x6e\x38\x6c\xda\x20\xfd\xcb\x0d\xa5\xf0\x70\x9a\xba\x37\x49\xec\x9f\xf8\xce\x80\x47\xcb\xbe\xb3\x1c\x15\xe5\xa8\x4a\x5d\x66\x06\xa0\x4b\xec\x37\x79\x76\x0e\xf1\x5c\xa6\x6d\xa6\x6a\xd3\xc4\xe3\xd4\xda\xc0\x32\xd6\xb6\xb8\x4b\x8c\x23\x73\xa1\xbc\xa6\x7c\x29\x7f\xa3\x95\xd8\x03\xf7\x15\x61\xa9\x78\x11\x64\x08\x2f\x8b\x92\x3f\xe7\x59\x29\xd8\xe8\x93\xc1\x05\xd7\x3a\x34\x8a\x10\x92\xed\xa2\xeb\xc0\x26\xab\x6b\x9c\xef\xee\x1d\x2d\x0e\x90\xb6\x10\xc6\x39\xb4\xaa\xbf\x6a\x39\x38\x08\x67\xc7\x72\x92\x73\xd7\x6b\xb5\xf5\x03\x2e\x0f\xe6\xe3\x84\x57\x43\xda\x8d\x4f\x47\x3f\xf2\xc0\xa8\xfc\x78\x98\x3f\x3b\x3a\x79\x66\xb4\x69\xaa\x67\x47\xb7\xcf\x8e\xba\x27\xa3\x1f\x63\xab\x5f\x3f\x19\x6d\x62\x16\x98\x09\xa4\x79\x7b\x7e\xc3\xa4\x7c\x10\x4f\xc7\x8a\x1d\x9a\x84\xc0\x6d\xee\x27\x64\x6f\x12\x54\x4c\xb7\x5b\xb7\xc8\xe3\x29\x55\xb8\x58\xbf\x77\x9e\x60\xca\x7f\x60\xce\xcd\xe5\xcd\xbf\xc0\x81\xac\xbc\xac\xad\x86\x0e\x51\x68\x65\x68\xd0\xe1\xbd\xe4\x19\x2b\x90\x93\x6a\x0b\x89\xc5\x98\x17\x7b\xec\x51\x93\xd3\xf6\x28\x42\xcf\x5d\x01\x77\x2b\xa4\x87\xb5\x6c\x05\x69\x03\x61\x8d\xc1\x31\x19\xfe\x10\x7d\x32\x79\xb1\x57\xb1\x41\xad\x8c\xd8\x4d\xe1\xe2\x39\xa4\x1b\x24\xa8\xc3\x4b\xb1\x57\x5a\x8b\x15\x89\xce\x80\x10\xfe\xe8\x50\x57\xf9\x12\xe7\x83\xa6\x0e\x07\x91\x54\x89\x99\xd9\x7d\xa0\x28\x6e\x65\xb5\x05\x75\x93\x52\x74\x6e\xbb\xe1\x80\xb8\x3c\xf4\xc3\x3d\x53\xa0\x2f\x86\x3d\xab\x54\xf1\x51\xad\xa9\x92\xb8\x67\xac\xd1\xbd\x03\x96\x6d\xc0\x09\xb2\x8e\xc6\xc3\xe2\xf1\x08\xde\xe8\x50\x91\x8b\xf9\x46\x8d\x5f\x89\x7d\xa3\xc0\x55\xd0\x0b\xcb\x71\xc3\x02\x6b\xfc\x74\x96\x95\x3f\x4a\xbf\xa1\x58\x16\x7f\x3a\xf5\xd1\x57\xc9\x47\xd5\x0d\xa8\x80\xb5\xfc\xca\x68\xec\x9e\xf8\x3a\x66\x7a\x6a\x8d\x1b\x1c\xef\x91\xf0\xf4\xf0\xc2\xd8\x37\x64\xb0\x8e\x6a\xa0\x72\xf6\xc3\x16\x9e\x9c\x0d\x0a\xa7\x57\x14\x4a\x40\xbe\x56\x9b\x74\xbd\x94\xa9\xed\x3e\x88\x0b\x4e\x77\x5f\x9c\x7a\x52\x54\xe1\xc0\x42\x94\xce\x56\x56\xa1\xa6\xf5\xe9\x82\x19\x03\x21\xa4\x73\x03\x8c\x27\x6c\xbb\x70\x6e\x80\xfc\x99\x2a\x7f\x2a\xe3\xc3\x1b\x89\x4c\x12\x2d\xd0\x26\xab\xf6\xa3\x5c\x30\x41\x27\xd5\x22\xbd\x77\x32\x7b\xb6\x44\x4e\x44\x8f\x5d\x38\x3f\xc3\xd6\xea\x19\x57\x40\xfa\x7e\x71\x3a\xcd\x0d\xe8\xeb\x43\x81\x7b\x02\x9c\xdf\xa6\x07\x09\x64\x36\x1e\x35\xb1\x99\x75\x50\xa1\xef\xbf\x8c\x8a\xd1\x77\x56\xb9\x55\x5b\x27\xb5\x5b\x31\xa3\x50\xb5\x1a\x6a\xe5\x4e\xd1\x9e\xa9\xb6\x3e\x3c\x10\x6e\x60\x77\x61\x20\x96\xcb\xd6\xd6\x9d\xe6\xe0\xad\x47\xf9\x36\x0c\x78\xcd\x59\x02\x8c\xa9\x18\x7c\xba\x18\xcf\x94\x46\x46\x35\x2b\xe0\xf0\x4e\x09\xc5\x87\x21\x91\x4b\xd6\xdc\x74\xda\xb7\x08\xb1\x73\xe2\xcf\x82\x13\xe8\xfb\x1a\x29\xd6\xde\xb6\x7c\x71\xe0\x22\x26\xb5\x37\x02\x1c\x1e\x1c\x25\x23\xac\xc5\x6d\x94\x60\xc3\x9e\x1e\xbf\x37\xb1\x2c\xe0\xbe\x95\x83\xf7\xec\x54\x22\xa1\xc6\xc6\x9e\x3f\xaf\x18\xe9\xfe\x0a\xec\x29\x3f\xb3\x36\xa0\xdd\xbf\xcf\x5f\x16\xcb\x2f\x6e\xe3\x65\x4d\x9f\xd3\x99\x96\xef\x55\x0a\x36\x3b\x43\xf5\xea\x67\xaf\xec\x66\x54\x7e\x9d\x5e\xfd\xf0\x0f\x99\xe2\xb0\x66\xff\xbd\x12\x33\xf2\x4c\xea\xe1\x89\xdb\xa6\xa2\xad\xeb\x75\x7e\x26\x05\x68\x4b\x08\x90\xf6\x48\x1a\x30\x11\x0b\xda\x3d\x50\x78\x9f\xd4\xba\x64\x09\x61\x86\xaa\xb6\xd4\x12\x7a\x13\xf3\xcf\x12\xf5\x7b\x48\x47\xaa\x32\x15\x5e\xcb\x76\x1d\xc5\x7b\xb9\xc5\x4e\xa9\xbd\x08\x81\x5a\x64\xae\x67\xe8\x35\xe0\xc6\x13\x2a\x15\x37\xd6\x83\x47\x80\x15\xa5\x89\xbb\xb0\x94\x46\xea\x63\x50\x81\x37\x7e\xca\xeb\x37\x7d\x45\xcd\x0f\x1c\xa7\x37\xcf\x99\xec\x87\x27\x84\x18\x5e\xb8\x29\x57\xfc\x78\x79\xc6\xe5\x15\xd3\x63\x06\x31\x84\x9c\x64\xe7\xb6\x17\xec\x11\x57\x97\xf9\xf4\x2a\xb3\x78\x7c\x4f\x9c\x8b\xe1\x05\x98\x4d\x2e\x29\x6c\xa3\x75\x7f\xc8\x6a\x0a\x2c\xf4\x54\x1a\xb5\xe6\x3a\x9c\x64\x95\x8d\x72\xb6\x7e\xea\xa3\x9f\x7e\xba\x78\x79\xbb\x8b\xcb\x77\x07\x48\x39\x53\x2e\x14\xff\x0f\x00\x00\xff\xff\x55\x11\xb6\xbc\x54\x0d\x00\x00") - -func confGitignoreVisualstudioBytes() ([]byte, error) { - return bindataRead( - _confGitignoreVisualstudio, - "conf/gitignore/VisualStudio", - ) -} - -func confGitignoreVisualstudio() (*asset, error) { - bytes, err := confGitignoreVisualstudioBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/VisualStudio", size: 3412, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreVisualstudiocode = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd2\x2b\x4e\x2d\x29\xc9\xcc\x4b\x2f\xe6\xe2\x02\x04\x00\x00\xff\xff\x86\x0b\x5f\x67\x0b\x00\x00\x00") - -func confGitignoreVisualstudiocodeBytes() ([]byte, error) { - return bindataRead( - _confGitignoreVisualstudiocode, - "conf/gitignore/VisualStudioCode", - ) -} - -func confGitignoreVisualstudiocode() (*asset, error) { - bytes, err := confGitignoreVisualstudiocodeBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/VisualStudioCode", size: 11, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreWaf = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x48\xcb\x2f\x52\x28\x28\xca\xcf\x4a\x4d\x2e\x29\x56\x28\xc9\x48\x2c\x51\x28\x2d\x4e\x55\x08\x4f\x4c\x03\xcb\x24\x95\x66\xe6\xa4\x64\xe6\xa5\x5b\x29\x64\x94\x94\x14\x58\xe9\xeb\x27\xe7\xa7\xa4\xea\xa5\xe7\xe7\xa7\xe7\xa4\xea\x25\xe7\xe7\xea\x17\xe8\x97\x27\xa6\xe9\x73\xe9\x01\x49\x5d\x2d\x2e\xbd\x9c\xfc\xe4\x6c\x20\x0d\x08\x00\x00\xff\xff\xd9\xbf\xe9\x68\x57\x00\x00\x00") - -func confGitignoreWafBytes() ([]byte, error) { - return bindataRead( - _confGitignoreWaf, - "conf/gitignore/Waf", - ) -} - -func confGitignoreWaf() (*asset, error) { - bytes, err := confGitignoreWafBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Waf", size: 87, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreWebmethods = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x90\x31\x0e\xc2\x30\x0c\x45\xf7\x1e\x25\x4b\x16\x2e\x80\x84\x90\x58\xdb\x01\x56\x93\x58\x51\xd4\x34\xb6\x6c\x07\xc4\xed\xe9\x01\xea\xce\xcf\xef\x49\xfe\x21\xc4\x47\x37\x2c\x02\x56\xa9\x2f\x28\x1f\x94\x98\xc1\x40\x8d\x04\xe3\x74\xcc\xdf\x0e\xb8\x51\x1a\x1b\x76\x5b\x4e\xe4\x56\x3d\xbb\x51\x51\x07\x09\x72\xab\x09\xcc\x8b\x6a\x5e\x3d\x32\x98\x49\xcc\xa1\x83\xb3\x1f\x1d\x8a\x72\x37\x9e\x89\x3c\xfd\x8b\xde\x2f\xcf\x6d\x46\x26\xad\xfb\x10\xbf\x8b\x73\xf3\xba\x9e\xed\xc4\x90\x56\x28\xa8\x7b\x2a\xc4\xe9\x1f\x00\x00\xff\xff\xfa\xae\xfc\xb3\xa8\x01\x00\x00") - -func confGitignoreWebmethodsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreWebmethods, - "conf/gitignore/WebMethods", - ) -} - -func confGitignoreWebmethods() (*asset, error) { - bytes, err := confGitignoreWebmethodsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/WebMethods", size: 424, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreWindows = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\x8e\xcd\xaa\xc2\x30\x10\x46\xf7\x79\x8a\x81\xde\xd5\x5d\xc4\x77\x68\xad\x50\x10\x17\x45\x10\x97\x69\x32\x6d\x86\xe6\xa7\x74\x52\xc4\xb7\x37\xa9\x28\x6e\x3e\x66\x71\xce\x61\x2a\xb8\x51\x30\xf1\xc1\x40\x5e\x4d\x08\x23\x39\x04\xad\xb4\x45\x16\x57\xbb\xf9\x81\xa5\x19\x04\xda\xf4\xbd\x45\x05\xa7\xe8\x0c\xae\xa0\x63\x18\x69\xda\x15\x71\x44\x9e\x53\x5c\x24\x05\x2a\x44\x8f\xfa\xa9\x73\xa9\xa6\x00\x1b\xa3\x81\x18\xde\x69\xb6\x6a\xcd\xe9\xbf\xbe\x6d\xee\xcd\xb9\x95\x75\x77\x39\x14\xe1\xf3\x45\x17\x38\x29\xe7\x72\xbd\xe0\x2c\xfe\xa5\x56\x43\x5e\xcf\xb4\xaf\xdf\x77\xf9\x55\xd8\xc6\x35\xe9\x2d\x15\xd8\x85\x59\xbc\x02\x00\x00\xff\xff\xea\xee\xa5\x7f\xd3\x00\x00\x00") - -func confGitignoreWindowsBytes() ([]byte, error) { - return bindataRead( - _confGitignoreWindows, - "conf/gitignore/Windows", - ) -} - -func confGitignoreWindows() (*asset, error) { - bytes, err := confGitignoreWindowsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Windows", size: 211, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreWordpress = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x74\x90\x51\x6e\xc4\x30\x08\x44\xff\x7d\x94\x4a\xc1\x67\x22\x40\x6d\xab\xc4\x46\xc1\x69\xa3\x9e\x7e\x93\x68\x3f\xd6\x59\xed\xdf\xf0\x46\x8c\x06\xbe\x40\x5b\x0a\x90\x3b\x12\x89\x7b\xf0\xd2\x65\x41\x83\x7d\xd1\x57\x0d\xe9\x3f\xfc\xd9\x44\xad\x7e\x97\x04\x96\xed\x39\x75\xa9\x3d\x22\xff\x62\x25\xe1\x89\x90\xb2\xdc\xdd\x19\xe9\x67\xb3\x89\xe7\xf8\x4e\x7d\x64\x47\x15\x07\x2e\xeb\x40\xaf\xd0\x81\x6c\x96\x56\xe4\x3b\xd3\x86\x3c\xe6\x9d\xf2\x5c\xfe\x50\xdb\x74\x4b\xa5\x7a\xcc\xa2\xda\x2e\x33\xc4\x55\x90\x17\x39\xde\x71\x9c\x1f\xb5\x90\x54\x17\xe8\x7b\x0f\xe1\x11\x00\x00\xff\xff\x13\xa4\xdc\x5e\x29\x01\x00\x00") - -func confGitignoreWordpressBytes() ([]byte, error) { - return bindataRead( - _confGitignoreWordpress, - "conf/gitignore/WordPress", - ) -} - -func confGitignoreWordpress() (*asset, error) { - bytes, err := confGitignoreWordpressBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/WordPress", size: 297, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreXcode = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x90\x3d\x4f\xc3\x30\x10\x86\xf7\xfb\x15\x87\x2c\x31\x54\x34\x15\x65\x63\x84\x4a\x8c\x1d\x90\x10\xab\x3f\xae\xe9\x41\x12\x47\xe7\x73\xc9\xcf\xc7\x71\xd5\x06\x3a\xfa\x79\xee\xf5\xbd\xb6\xc1\x4f\x1f\x03\x81\x01\x83\x2d\x2b\xb7\x43\x14\x42\x1f\x07\x15\x76\x59\xa3\xa4\x67\x14\xea\xa9\x77\x24\xa8\x11\xf3\x18\xac\x12\xbe\x75\xd1\xd9\x6e\x53\xb3\xcd\x35\xf7\x80\x7b\xf7\x45\x5e\xf9\x44\xeb\xd7\x05\xe3\x3d\xbe\xff\xf0\x41\x17\x02\x60\x0c\xbe\x64\xee\x02\xb6\x34\x90\x94\x2b\x03\xb8\xf9\xbc\x81\x1d\x49\xc9\x87\x9d\x55\x5b\xc7\x3e\xac\x70\xcc\x09\x13\xa9\xf2\xd0\x26\x58\x35\xa3\x9b\x72\x22\x81\xbb\x40\x07\x9b\x3b\xbd\x82\x55\xd3\x97\x42\x8f\xa7\xa7\x45\x5d\xc0\x59\x6d\x6f\xd5\xb6\xaa\x91\x24\x8d\xe7\xe2\x7f\x07\xfe\xe3\xc9\xcf\x3b\xc2\xa5\xd7\x5e\x8f\x75\xe3\xe4\xfd\x91\xfc\x77\xcc\x5a\x77\x94\xea\x6b\x9b\xb8\x7c\xe9\xac\xe6\x44\xd2\xf2\x3c\xf8\x0d\x00\x00\xff\xff\x12\x25\x8f\xde\x69\x01\x00\x00") - -func confGitignoreXcodeBytes() ([]byte, error) { - return bindataRead( - _confGitignoreXcode, - "conf/gitignore/Xcode", - ) -} - -func confGitignoreXcode() (*asset, error) { - bytes, err := confGitignoreXcodeBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Xcode", size: 361, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreXilinxise = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x91\xdb\x8e\xe3\x20\x0c\x86\xef\xf3\x14\x91\x7a\xb7\xd2\xa6\xfb\x46\x88\x83\xcb\xd2\x72\x88\xb0\x69\xe8\xdb\x8f\x4d\x82\x66\x34\x17\xfd\xfa\xd9\x80\xfc\x07\x6e\x6b\xc8\x04\x35\x81\x0b\x9a\x60\x35\x2d\x44\xb7\x3e\x42\x04\x5c\xfe\x6c\xc6\x67\x61\x20\x61\x74\x4c\x9b\x9c\x8a\xc5\xb3\xb9\x6a\x99\x31\x0a\xb0\x30\x13\xba\xc1\x17\x33\x5b\xf1\xec\xed\xe0\xe9\x95\xb9\x6b\x37\x38\xdc\x3e\x84\xf5\x29\xa4\xa3\xf3\x5f\x35\x66\x50\x36\x21\x49\x07\x3f\xb2\x95\x8e\x93\xd2\x69\xb9\x96\x46\x23\x5e\x93\x5c\x7d\x0f\x42\x64\x57\x9c\xd4\x43\xde\xfa\x61\xa4\x82\xfc\x46\x20\x0a\xd9\xe3\xf6\x9f\x12\x27\x55\x49\xef\x1b\xff\xa6\xd5\x69\xd9\xa7\xcb\x7a\xdd\xe5\x2c\x87\x1e\x57\x31\x6b\x0e\xbe\x59\x7c\x5f\x46\xfd\xec\xd5\xb9\x8c\x2d\x25\x5d\x3f\x73\xcc\x2c\xfb\xa8\x1a\x6a\x0f\x97\x73\xce\xf3\xcc\x72\x5b\xf7\x5a\x9e\x60\xe9\xef\x11\x1c\xac\x9c\x1b\x2a\xbf\xc0\xf7\xe5\xfb\x80\xb0\xf0\x8c\xf3\xbc\x42\xd2\x14\x90\x82\xbd\x3e\xe6\x77\x57\x1d\x60\x48\xc7\xd7\xb9\x3a\x0b\x79\xab\xcb\xd5\x9e\x47\x08\x9e\xfc\x63\x58\x89\x0e\x2a\x2e\x3c\xcb\x96\xfc\x08\xfe\xbe\xf4\x98\xbb\xd2\x8d\x8a\xfa\xa7\xba\x33\xdc\x40\xba\x2f\x7c\x23\x85\xd9\x13\x7a\xbc\x2f\x5f\x01\x00\x00\xff\xff\x76\xd4\xb7\xf2\x36\x02\x00\x00") - -func confGitignoreXilinxiseBytes() ([]byte, error) { - return bindataRead( - _confGitignoreXilinxise, - "conf/gitignore/XilinxISE", - ) -} - -func confGitignoreXilinxise() (*asset, error) { - bytes, err := confGitignoreXilinxiseBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/XilinxISE", size: 566, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreXojo = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\x88\xc8\xcf\xca\x57\xd0\x48\xcb\x2f\xca\x4d\x2d\xca\xa9\x54\x08\x72\x75\xf4\x49\x4a\x2c\xce\x4c\x56\x48\xcc\x4b\x51\x08\x4a\x4d\xcc\x51\x08\x2e\x29\x4d\xc9\xcc\xd7\xe4\xe2\x72\x2a\xcd\xcc\x49\x29\xd6\xe2\xd2\xd2\x4b\x49\x4d\x2a\x4d\x87\xd1\x7a\x89\x05\x05\x5c\x2e\x20\x96\x96\x5e\x6a\x45\x2a\x94\xa9\x8f\x4b\x24\x46\xc1\x27\x33\xa9\x18\xa8\xb9\x28\xa9\x34\xb3\xb8\x24\xb1\x24\x15\xc8\xae\x00\xba\x22\x1e\xc1\xcd\x4f\x2a\xce\xcf\x49\x05\x32\x01\x01\x00\x00\xff\xff\x63\x05\x7c\x8e\xa0\x00\x00\x00") - -func confGitignoreXojoBytes() ([]byte, error) { - return bindataRead( - _confGitignoreXojo, - "conf/gitignore/Xojo", - ) -} - -func confGitignoreXojo() (*asset, error) { - bytes, err := confGitignoreXojoBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Xojo", size: 160, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreYeoman = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xca\xcb\x4f\x49\x8d\xcf\xcd\x4f\x29\xcd\x49\x2d\xd6\xe7\x4a\xca\x2f\x4f\x2d\x8a\x4f\xce\xcf\x2d\xc8\xcf\x4b\xcd\x2b\x01\x8a\x68\xe9\xe5\xe4\xa7\x73\x71\x25\x95\x66\xe6\xa4\xe8\x73\xa5\x64\x16\x97\xe8\x73\x01\x02\x00\x00\xff\xff\x31\x19\x01\x9c\x34\x00\x00\x00") - -func confGitignoreYeomanBytes() ([]byte, error) { - return bindataRead( - _confGitignoreYeoman, - "conf/gitignore/Yeoman", - ) -} - -func confGitignoreYeoman() (*asset, error) { - bytes, err := confGitignoreYeomanBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Yeoman", size: 52, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreYii = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x8d\x41\x0e\x84\x20\x10\x04\xef\xf3\x8b\xbd\x72\x60\xde\xc4\x42\x87\x9d\x64\x01\xc3\xb4\xfa\x7d\x35\xf1\xa6\xb7\x4e\xa7\x2a\x95\xdc\x41\xd7\x20\x9f\x7b\xc5\x6a\xb4\xda\xc7\x84\x2c\x73\x10\x99\x28\x3a\xd7\x4e\x6b\xb8\xb0\xe7\xf9\x6a\x94\xc4\xa4\x21\x96\xaf\xf0\x87\x06\xd7\xfc\x3f\x03\x96\x75\x33\xec\xae\x72\x04\x00\x00\xff\xff\x9c\xf5\x8e\xaa\x78\x00\x00\x00") - -func confGitignoreYiiBytes() ([]byte, error) { - return bindataRead( - _confGitignoreYii, - "conf/gitignore/Yii", - ) -} - -func confGitignoreYii() (*asset, error) { - bytes, err := confGitignoreYiiBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Yii", size: 120, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreZendframework = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x34\x8e\x31\x0e\xc3\x20\x0c\x45\x77\x9f\x02\x29\x5b\x86\xa0\x5e\xa1\xad\x3a\xf5\x04\xdd\x2c\x70\x08\x12\x60\x04\x4e\xd5\xdc\xbe\x58\x4d\x97\xcf\x47\xff\x7d\xdb\x93\xb9\x71\xae\xdc\xa9\x99\x35\x26\xea\xe0\xce\xef\x52\x37\x6c\xf0\xa6\xe2\xb9\x59\x80\xc9\x3c\xd9\x61\x32\x8e\xcb\x1a\x83\x62\xfa\x5a\xdc\x85\x13\xa3\xb7\xf3\x92\x34\x1f\xad\xaa\xf0\x35\x16\x6c\x87\x09\x24\x42\x1f\x39\x47\xcf\x4b\x66\x0d\xef\x28\x08\x7e\x88\x4d\x1c\xba\xfd\x59\x87\x6e\xa3\xd3\x77\xea\x3d\x72\xf9\x47\x92\xab\x05\x21\x55\xbd\x83\x02\xba\xc3\xbc\x1e\x17\xf0\x94\x79\x40\x63\x43\xc3\x6e\x3d\xbb\x3d\x53\x11\x94\xd1\x85\x6f\x00\x00\x00\xff\xff\xd2\xff\x36\xef\xd9\x00\x00\x00") - -func confGitignoreZendframeworkBytes() ([]byte, error) { - return bindataRead( - _confGitignoreZendframework, - "conf/gitignore/ZendFramework", - ) -} - -func confGitignoreZendframework() (*asset, error) { - bytes, err := confGitignoreZendframeworkBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/ZendFramework", size: 217, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confGitignoreZephir = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x90\x31\x6f\x03\x21\x0c\x85\x77\x7e\x05\x52\xb6\x28\xe1\x96\xfc\x83\x4a\xdd\xaa\x2e\x9d\xba\x71\xe0\xe4\xdc\x33\x36\x05\x23\xb5\xff\xbe\x1c\x77\xca\xd4\xc5\x7a\xef\xe1\x4f\x0f\xf9\x64\x5f\x7c\x58\xc0\xde\x91\xa0\x5e\xec\x03\x18\x8a\x57\xa8\x76\xfe\xb5\x9f\x90\x17\x2c\xc6\x29\xa4\x3c\x19\x47\x38\xd7\xc9\x98\x93\x7d\x9f\xbf\x20\xe8\xbf\x08\x21\xaf\x50\xcc\xd9\x91\x6c\xc3\xf7\x31\x84\x7c\x6c\xe0\xeb\x46\x3c\x81\xb8\x01\x41\xf8\x8e\x8f\x56\xc0\x7a\x8e\x47\xe3\xa5\xaf\xb2\xa8\x2d\xf0\xdd\xb0\xf4\xbd\xbb\x14\x0b\x3f\x0a\x5c\x51\xb8\x23\x29\x23\x79\xed\xda\x99\x1e\x4f\x73\x43\x8a\xd3\x90\x49\x62\xeb\x1d\xbb\x79\xf3\x2b\x6c\x9f\x3c\x0f\xb7\x37\xed\xda\x07\xe4\x40\x2d\x82\x4b\xb7\x23\x20\x09\x9e\x9e\xb6\xa9\xa4\x9b\x1e\x24\x72\x55\x4f\x74\xad\xcb\xb0\xa4\xc9\x23\xbb\xc3\x25\xac\x15\xf9\xb1\xeb\xf5\x58\x8d\x58\xea\x48\x4a\xe3\x6b\x3f\x8d\x56\x97\x97\x3c\x12\x17\x21\xef\x6f\xfd\x9e\x2a\x42\xe6\x2f\x00\x00\xff\xff\x8f\x12\xa1\x26\x83\x01\x00\x00") - -func confGitignoreZephirBytes() ([]byte, error) { - return bindataRead( - _confGitignoreZephir, - "conf/gitignore/Zephir", - ) -} - -func confGitignoreZephir() (*asset, error) { - bytes, err := confGitignoreZephirBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/gitignore/Zephir", size: 387, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLabelDefault = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x1c\xcc\x51\x0e\x82\x30\x0c\x87\xf1\xf7\x9e\xa2\x49\x2f\xc0\xd4\x00\xd7\xd9\xba\x3f\xd2\x64\x16\x8c\x9d\x78\x7c\x03\xbf\xef\xfd\x13\x60\x98\x86\xc4\xa5\x3f\x49\xf4\xc2\xb5\xef\xcd\x34\x07\x48\xe6\x47\x19\x51\x18\xbe\x66\x57\xbc\xe0\x41\x92\x6e\x73\x1e\x94\x57\xb4\x9d\x8f\xec\x81\x4a\x82\xf1\x8c\xcd\xbf\xb9\x59\x3d\x4f\xf7\x34\x29\xbf\x3b\x3e\x61\x9b\x93\x2c\x17\x3e\x36\x8f\xc5\x7e\xf4\x0f\x00\x00\xff\xff\xce\x7a\x45\xfa\x77\x00\x00\x00") - -func confLabelDefaultBytes() ([]byte, error) { - return bindataRead( - _confLabelDefault, - "conf/label/Default", - ) -} - -func confLabelDefault() (*asset, error) { - bytes, err := confLabelDefaultBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/label/Default", size: 119, mode: os.FileMode(420), modTime: time.Unix(1472881344, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseAbstylesLicense = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x91\xc1\x6e\x9b\x40\x10\x86\xef\x3c\xc5\xdc\x9a\x48\x14\x95\xde\x72\x2b\xd8\x96\xb0\xd4\xda\x91\x43\x94\xe4\xd6\x81\x1d\xec\x51\x60\x17\x2d\x63\xa7\x7e\xfb\xce\x6e\x9d\x3a\x4d\xad\x48\x08\x09\x76\xf7\xff\xbf\x6f\xa7\xde\xf1\x04\xfa\x14\xb7\x9b\x45\xf1\xa3\xfc\x9e\xd5\x8b\xc7\x14\x0e\xe4\x27\x76\x16\xf2\x2c\xff\x42\x29\xbc\x78\x16\x21\x0b\xcd\x11\x2a\xb4\xd3\xe7\x8a\xfc\x80\xd6\x42\xe9\x0c\x41\x72\x55\x55\xe5\x7a\xbe\xf8\x36\x5f\xdf\xdd\xaf\x96\x79\x56\x2e\xeb\xd5\xa2\xbe\x4e\xa1\x73\x1e\x64\x47\x50\x72\x53\xd3\x23\xfc\x44\x83\xa3\x60\xd3\xd3\x27\xe8\x70\xe0\xfe\xf8\x6f\x51\x06\xc9\x1d\x51\x3c\xd1\x71\x4f\x67\xa4\xf9\x7a\x16\xb3\x10\x0c\x09\xea\x92\x01\xe3\xda\xfd\x40\x56\x50\xf4\x74\x96\x44\x8b\xd1\xbb\xad\xc7\x21\xd8\x18\x9e\xc4\x73\xb3\x17\xdd\xfa\xb0\xac\xab\xf5\x7d\x0d\xc5\xea\x09\x1e\x8a\xcd\xa6\x58\xd5\x4f\x29\xd0\xaf\xd1\xd3\x34\x81\xc6\xf2\x30\xf6\x4c\x26\x4b\x92\x99\x1b\x8f\x9e\xb7\x3b\x81\xab\xd9\x35\xe4\x37\x37\x79\x1a\xde\x5f\xff\xb7\x4e\x92\x5b\xfd\xe2\x29\xc2\x6b\xa1\x16\xdb\x50\x26\x0e\x06\x7c\x26\x40\x6b\xde\x40\x04\xcd\x46\x51\x07\x68\xdd\xc8\xa4\xad\x9d\x6a\x06\xce\x93\x46\x60\x3f\xb0\x09\x01\x3b\x94\x78\x05\xed\x5f\x16\xeb\x84\xdb\x3f\x91\xf1\xd0\x78\x6e\x7e\x5d\xf2\x04\x41\x87\xfc\x41\x23\xf4\x3f\xf6\xfd\xa9\x2a\xfb\x80\x34\x54\xbc\x27\x1d\x9c\xe1\x4e\x6f\xe3\x75\x32\x17\x58\xf7\xd6\x90\x3f\x31\x5a\xc3\x12\x77\x85\xf9\xbc\xb5\x3c\xb2\xdd\xa6\x17\xb4\x34\x80\x95\x56\x61\xf7\xbd\xe8\x1e\x1d\xa9\xe7\x40\xfd\xe2\xfc\xf3\xfb\xd1\x9d\x9b\x44\x1d\x22\x0a\x5e\xd0\xd7\x06\x4d\x6d\xb1\x0f\x52\x91\xd5\x59\xca\x7e\x07\x00\x00\xff\xff\x56\xaf\xdf\x26\xda\x02\x00\x00") - -func confLicenseAbstylesLicenseBytes() ([]byte, error) { - return bindataRead( - _confLicenseAbstylesLicense, - "conf/license/Abstyles License", - ) -} - -func confLicenseAbstylesLicense() (*asset, error) { - bytes, err := confLicenseAbstylesLicenseBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Abstyles License", size: 730, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseAcademicFreeLicenseV11 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x9c\x58\x51\x73\xe2\x38\x12\x7e\xe7\x57\x74\xf1\x72\x99\x2a\xc2\xed\xcc\xe3\xbd\x39\xc6\x09\xba\x35\x36\x6b\x9b\xb0\x3c\x2a\x58\x04\xdd\x1a\x8b\xb2\xec\xb0\xf9\xf7\xf7\xb5\x64\x03\x99\x30\x53\xbb\x5b\x95\x4a\x8c\xa5\xee\xfe\xfa\xeb\x96\xf8\x3a\xc1\x56\x96\xea\xa0\xb7\xf4\xd8\x28\x45\xb1\xde\xaa\xda\x2a\x1a\x3d\xab\xc6\x6a\x53\xd3\xd7\xe9\xd7\x51\xb1\x57\x74\x7b\x9b\x3c\x1e\x2b\xad\x2c\xb5\x86\x64\xfd\x4e\xa6\xd1\xaf\xba\x96\x15\x9d\x4c\xf3\x07\x99\x1d\xc9\xae\xdd\x9b\xc6\xee\xf5\x91\xee\x5a\x78\x19\xa7\xc3\x8e\x35\x76\x8c\xbf\xd0\x69\x6f\xe0\xc6\x9c\x6a\xd5\xf4\x3b\xbc\x6b\xd3\x60\x71\x2f\x2d\x1d\x2b\xb9\x55\x25\xf1\xd2\xce\x54\x95\x39\xe9\xfa\x95\x6a\xd3\x62\x17\xe9\xc3\x41\x95\x5a\xb6\xaa\x7a\xbf\x5a\xe4\xad\x5b\x73\x7c\x47\xa4\x7d\x3b\x6c\xdd\x99\xc6\x2d\x7c\x88\xff\x9f\xd1\xa8\x0f\x87\x08\x5d\x5d\x2a\xbf\xe7\x76\xaa\x6f\x17\x42\xa6\xe3\xd1\xe8\xa9\x91\x75\xcb\x29\xf6\xeb\x53\x1a\x80\xd3\x5e\x35\xea\xe5\x9d\x5e\x79\xc7\x99\x9a\x23\xcc\x61\x6d\x5e\x5a\xa9\x6b\x86\x29\x1d\x48\xf6\xf0\x09\x17\xdd\x8d\x37\xa6\x03\x01\x92\x89\xac\xca\xfb\x93\x2e\xd5\x84\x1a\xf3\x2e\xab\xf6\xfd\x7e\x07\x58\x13\x24\x56\xdf\xab\x3f\xb7\x55\x67\xf5\x1b\x3e\xc2\xff\x51\xb5\x9d\xac\xfc\x8a\xed\x5e\x2a\x0f\x4c\xbe\x54\x8a\xfa\x67\xba\xfb\xfa\x85\x01\x75\x16\x16\x1c\x7e\x42\x07\x53\xea\x1d\xff\x55\xcd\x2b\xbb\x61\x3b\xbb\x77\xfe\xc0\xd9\x61\x42\xa5\xb6\x6d\xa3\x5f\xba\x16\xd5\xae\xcb\x7f\x23\x3f\xab\xaa\x8a\xad\xb9\xf0\x37\xe1\x63\x1f\x81\x4c\xfd\x26\x5b\x60\x73\xcd\x60\x79\x5b\xa3\xcc\x6e\xe2\x56\xef\xbe\x7d\xe9\x09\x3f\xa2\x7c\x20\x72\x5b\x49\x7d\xb0\xae\x11\x4a\xb4\x11\xdc\xd7\x6d\x83\x92\xe2\x13\xa8\xe4\x10\x67\x7a\xdb\xbd\x6c\x49\x36\x8a\xd4\xe1\x05\xe0\xb1\x43\xd7\xb7\x40\x58\xda\x75\x4d\x8d\x64\x3e\xfb\x98\x30\x09\x07\xf9\x07\x12\x76\x54\xb8\x8c\x18\x97\xd9\xed\x80\x89\x9b\xc5\x4a\xd0\xf6\x77\x53\x03\xeb\xff\x53\xdb\x96\xbd\x7f\x6c\x58\xa4\x53\xea\x16\xed\x63\xa7\xa3\x51\xe6\x1a\x13\xcc\x05\xad\x67\x16\xef\xa7\x94\xa9\x33\xd3\xbc\xef\x36\xb3\x87\xce\xb6\xd4\xa8\x63\x63\xca\x0e\x5d\x2d\x7d\x21\x3e\xb4\xba\xfd\x27\x74\xbc\x98\x76\x7f\xdb\x4e\xb7\x20\x67\xe7\xf2\xc6\x3a\x77\x72\x69\xb6\xdd\x01\x35\x93\x8c\x73\xe8\x09\xc3\x1c\x80\xd2\x16\xdc\xc8\x0a\xc7\xb6\x31\x6f\x68\xda\x92\x4e\x1a\x9e\xd9\xed\x75\x76\xb7\x93\x83\x7f\xf5\xa7\xda\x76\xad\x6b\x59\xee\x3e\x90\x15\xf9\x16\x67\x46\x76\x8d\x39\x9c\x8f\xa3\x3b\x7f\x53\x4a\x94\x76\x91\xd9\x5b\x2d\x0f\xbe\x23\x2f\x79\xd5\xe6\xbb\x25\x4e\xc0\xf5\x16\x23\xc1\xcd\x34\x94\xea\x03\x12\x6f\xe7\x2e\x34\x87\x53\xc3\x49\xc3\x77\x82\xe4\x6a\xbb\x13\xd0\xbc\xf1\xad\xe2\x5e\xe0\xec\xc8\x77\x7a\x51\xdc\x4a\x25\xfb\x53\x75\x09\xcf\x8a\x37\x82\x86\x83\xc1\xc9\xf1\x05\xc3\x6d\xe0\x7a\x07\xdb\x5c\x2e\xed\x5e\xdb\xef\x38\x60\xba\x4c\xd7\x82\x88\x63\xa3\x2c\xf3\xa8\xe1\xe6\xd4\xe8\x16\xc7\x84\x0f\xe5\x41\x5b\x7b\xc5\xe0\x90\x2a\x98\x5a\x07\x59\x16\x24\xc5\x86\x82\x64\x46\x33\x91\x87\x71\x20\x16\x51\x96\xe3\x66\x12\x61\x94\xe4\x69\x46\xfd\x96\x9c\x8a\x79\x50\xe0\x57\x44\x61\xba\xdc\x64\xe2\x69\x5e\x90\x48\x9c\x61\x91\xba\xf7\x29\x5e\x8a\x24\x88\x69\x9d\x66\xbf\x92\xc8\x29\x5d\x27\xd1\x8c\x1e\x36\x6e\xf5\xec\x10\x3f\x67\x57\x9f\x4c\x80\xa1\xc8\xc4\xc3\xaa\xf0\x86\x67\xa3\x55\x32\x8b\x32\x0a\xe8\x39\x88\xc5\x8c\xc2\x55\x96\x45\x49\xd1\x2f\x47\xf4\x98\xa5\x8b\xef\xa0\x71\xec\x6c\x4a\xd1\xef\x61\xb4\x2c\x28\xc8\xf1\xb4\xcc\xa2\x3c\x8f\x37\x94\x17\x01\xbb\x07\x78\x36\x11\x8b\x45\x34\x13\x78\x83\x15\xec\x08\x23\x7c\x4a\x9e\x28\x87\xff\x28\x09\xa3\xc9\x6d\x9c\xcb\x2c\x7d\x16\x33\x78\xf1\xc0\x8a\x39\xde\x0d\x68\x52\x66\x85\xc6\x88\x29\xf2\x31\x3d\x04\xb9\xc8\x27\xb4\x16\xc5\x3c\x5d\x15\x03\x9d\x9b\x09\x45\x78\x03\xd3\x1e\x17\xd3\x22\x16\xcb\x58\x44\xb3\x09\xa0\x85\xf1\x8a\x61\x5c\xec\x62\xb1\x10\xc0\x2d\xd2\xc4\x23\x3a\x57\x2e\x7d\xa4\x24\x4d\xee\x45\xf2\x98\xc1\x20\x5a\x30\x2f\x5c\x94\x7e\x83\x88\xf2\x9f\xd0\x8d\x5a\x87\x73\xec\x0a\x1e\x62\x5e\xa5\x47\x51\xd0\x63\xca\x44\x2f\x83\xac\x10\xe1\x2a\x0e\x32\x5a\xae\xb2\x65\x9a\x47\x53\xe7\x02\xee\x45\x16\x51\x26\xf2\x5f\x99\xd5\xbe\xf4\xbf\xad\x50\x17\x0f\xe6\x66\x1c\xce\x82\x36\xe9\x6a\xea\x99\xba\x74\x1a\x5b\x9c\x53\x09\xd3\x24\x2f\x44\x81\xe2\xe7\xcc\x20\x58\xe1\x68\x70\xc3\x60\xbc\xef\x0b\xcd\x38\xc7\xe9\x99\x72\xc0\xf8\x14\xf3\x89\x9d\xa2\x42\x20\x39\xf2\x55\xea\x9b\xe1\xaa\x64\x17\x20\x38\x0c\x17\x8a\x39\x56\x2c\x82\x07\xc1\x49\x4d\x7b\x03\x84\x0b\x45\x16\xae\x16\xe8\x1f\x34\x46\xee\x58\x3e\x2f\xc5\xd1\x13\x62\x23\xf9\x34\x43\x6d\xd7\xf3\xc8\x15\xb7\x48\x01\xfc\xee\x5c\x4e\x4a\xa2\xa7\x58\x3c\x71\x5f\x7d\x99\x70\xba\x45\x16\x84\xc5\x84\x99\x4f\x79\xff\x5a\xe4\x68\xb8\x7c\x1e\xc4\xf1\xc7\x33\xf3\x10\x39\x3c\xb1\xcb\x34\x48\xd0\xa9\x38\xa4\xc0\xe9\x6a\x85\x8f\x33\xd4\x84\x1d\x89\x64\x78\xca\x97\x51\x08\xea\x5c\x2f\xa1\x51\x51\xe2\xd8\xc5\x61\x8e\xa3\xdf\x56\x3d\xb1\xb3\x60\x11\x3c\x21\x15\xe4\xcb\x6e\xd0\x0b\x0c\x88\x4f\x1a\x0a\xcc\x80\x51\xe2\x80\xd0\x9f\xab\xf8\x53\x01\xfc\x41\x8e\x68\xc5\x8f\x37\xeb\xfe\xf3\x2e\x1e\x62\x73\x0e\x71\x9a\x3b\x10\x4f\x69\x3a\x5b\x8b\x18\x50\x9d\x87\xbc\x48\x97\x4b\x6c\x62\xae\x16\xcb\x15\x03\x7b\x0c\x44\xbc\xca\x5c\xf0\x45\x10\x3f\xae\x92\xd0\x7b\xeb\x89\xe0\x9a\x30\x7b\x8e\x4e\xb6\xe2\x0e\xff\x90\xa9\x0f\x16\xe1\x48\x46\xcf\x51\x42\xe2\x91\xf2\x55\x38\x1f\x08\xf5\xdc\xcf\x83\xe7\x08\x9c\xf3\x72\x02\x78\xb8\x20\x86\x0c\x71\x10\x72\xe1\xfb\x82\x5f\x39\xd3\xde\xf5\x74\x60\xe7\x66\x17\xf5\x9e\x93\x14\xa7\x73\xb9\xc4\x5d\x53\xa4\x57\x8b\xcc\xc1\x2c\x0a\x70\x48\xf0\xe0\xa1\x00\xb3\x48\xfe\xbb\xca\x36\x3d\xfd\x5c\x0d\x77\xcf\x79\xb8\x38\x11\x9b\x7f\xe5\x57\x0d\x35\x1c\xc5\xe8\xf7\xc2\x5d\x01\x08\x22\x42\xd7\x32\x71\xb0\xe6\xfb\x6a\x0e\xdc\xb8\xc6\x9d\xf9\x05\xe4\x94\xf2\x74\x11\x11\x02\x89\x7c\x26\x1c\x99\x38\x16\xa9\x07\x1a\xc7\xe9\xba\x77\x8a\x52\xe6\x2e\xa7\xec\xbb\x0c\x2f\xfd\xf5\xc3\xf6\x42\x37\xa6\x9e\x9c\x8b\x1f\x2e\xd4\x95\xa3\x45\xb0\xf9\xc8\x0d\x5f\x16\x38\x92\xfd\x37\x37\xbe\x21\x73\xd3\x35\xf8\xfa\x0c\x4d\x09\xdd\xcc\xd3\x05\x64\xc3\x81\xc6\x57\xaf\xc7\x10\xa4\xb2\x76\xd2\x0a\xdf\x81\x0a\xaa\xac\xe1\x6f\x4d\x68\x82\xdb\xda\x81\x25\x1b\x04\x1d\x6b\x2d\xa7\x68\xf5\x56\x7a\x19\x85\x68\xba\x75\xf2\x85\xc5\x92\x7c\x93\xba\x72\xf2\xe2\xa3\x8a\x29\x95\xdd\x42\x12\xb0\xf9\xde\x9c\x9c\x66\xdf\x6e\xf9\xfb\x97\x0d\xbd\x44\xfe\x1c\xf4\xb3\xe4\x97\xaf\x90\xe6\x2e\x66\xaf\x7f\xa0\xe0\x0f\x72\xbb\xd7\xb5\xba\x6f\x94\x2c\x5d\xe4\x6b\xd9\x7f\x95\xf1\x0f\xa4\x74\x65\x80\xc9\x89\x28\x05\x47\x3f\x99\x19\x9c\x2c\x3e\x03\xba\xa8\x76\x7b\x05\x13\x92\x02\xca\x45\x79\x5a\xbd\x68\x04\x56\x0b\x0e\xac\x4b\x10\x72\xc4\x40\xff\xbf\x7a\x52\x90\x10\x4f\x5f\x7e\x58\xf9\xcb\x69\x38\x95\x88\xdf\x5c\x2b\xef\x07\x7a\xd5\x58\x0d\xb5\xf5\x8e\x47\x89\x29\x08\xf6\x50\x61\xb2\xda\x76\x15\x04\xa3\xd3\x4c\x4e\xd9\xb4\x30\x83\xf0\x01\x56\xd6\xd6\x4c\x3d\xa4\xda\x9b\xaa\x35\x4f\x08\x7d\x41\x00\x0a\xb3\x91\xab\x37\x24\xad\x63\x07\x7f\xcf\x19\xb2\xb6\xd3\x75\xe7\x8b\x70\x35\xba\xdc\xd0\x78\xec\x9f\x53\xf4\x13\xcf\x30\x39\xca\xb2\x74\xc2\xcb\x65\x26\xdb\x1f\x25\xc2\x59\xfe\x83\x31\xd4\xcf\x2e\x97\xa1\xf9\x73\x4f\x8d\x46\x8b\x8e\xc7\x38\x2a\x98\x91\xda\x07\xe6\x6c\x97\x7e\x50\x0a\xb6\x7e\x5c\x28\xb8\x58\xc3\x91\xb2\x7b\x6e\xee\xb6\xb7\x50\x3c\x76\x1b\xc6\x0c\x8e\x81\x89\x13\x65\xce\x58\xa6\xd6\xc6\x71\x06\xc5\x0c\xa9\xdd\x6c\x35\xcf\xf0\x67\x9d\xeb\x5b\xc2\xfa\xc9\xd5\xd7\x85\xed\x5e\xfa\xd6\x18\xa2\xe9\x9d\x2f\x81\xae\xb8\xbf\x2b\x79\xb2\x9d\x2b\x5d\x2f\xae\xbb\xa6\xe5\xb3\xa6\x5e\x3d\x0b\x9c\x30\xde\xa7\xb9\xa0\x50\x35\x2d\x8e\x26\x4f\x78\x28\x32\x59\xdf\x35\xd6\xec\xda\x13\xcf\x73\x9e\x6f\x3b\x0c\xab\xc3\x48\xce\xd6\xc3\xfc\xca\xe5\xed\xe7\x67\x07\x69\xfc\x57\xc8\x1a\xf3\x74\xd9\x31\xf0\x7a\xd7\xc0\x54\x59\x3f\x91\x7f\x98\x3c\x2f\x53\xa5\xb5\x78\x8d\x21\xa6\x1f\x94\xfd\xca\x00\x12\xf5\x71\xcc\x0f\x80\xf0\x18\x9e\x8b\x7c\x17\x7e\xa1\x6f\xbf\xfc\xf2\x8d\x62\x79\x6a\x54\x8d\xdc\xa0\x6c\x32\x03\x7f\x53\x0a\x50\xa0\x9e\xde\xfe\x14\x96\x53\x1a\x2d\x2f\x82\x1e\x9e\xae\xff\x71\xe0\xe9\x77\x87\xcc\xcd\x9c\xd7\xad\x7c\x15\x7f\x98\x17\xae\x2f\xbd\xbe\x39\x86\x2d\xbe\xec\x2d\x4f\x28\x7e\x57\x3f\x95\xb1\x19\x17\x7d\x18\x35\x6e\x0f\x19\x98\xff\xae\xda\xd8\xfd\xa3\x66\x3a\xfa\x7f\x00\x00\x00\xff\xff\x99\x75\x15\x45\x34\x12\x00\x00") - -func confLicenseAcademicFreeLicenseV11Bytes() ([]byte, error) { - return bindataRead( - _confLicenseAcademicFreeLicenseV11, - "conf/license/Academic Free License v1.1", - ) -} - -func confLicenseAcademicFreeLicenseV11() (*asset, error) { - bytes, err := confLicenseAcademicFreeLicenseV11Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Academic Free License v1.1", size: 4660, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseAcademicFreeLicenseV12 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x9c\x58\x4d\x77\xda\x4a\x12\xdd\xf3\x2b\xea\xb0\x19\xfb\x1c\xcc\xbc\x97\xe5\xec\x78\x8e\x9d\x70\x9e\x03\x1e\xc0\xe3\x93\x65\x23\x35\xa8\x5f\x24\xb5\xa6\x5b\x82\xf0\xef\xe7\x56\x75\xb7\x10\x36\x99\x64\x66\x15\xa3\xfe\xaa\xba\x75\xab\x6e\x55\x66\x99\xca\x75\x65\x32\x7a\x74\x5a\xd3\x93\xc9\x74\xed\x35\x8d\xfe\xa5\x9d\x37\xb6\xa6\xdf\xa7\x1f\x46\x9b\xc2\x78\xba\xbe\x4f\x35\x4d\x69\xb4\xa7\xd6\x92\xaa\x4f\x64\x9d\xd9\x9b\x5a\x95\x74\xb4\xee\x1b\xd9\x1d\xa9\xae\x2d\xac\xf3\x85\x69\xe8\xa6\x2d\x34\x8d\x97\x69\xc7\x2b\x76\x8c\x6f\xe9\x58\x58\x5c\x63\x8f\xb5\x76\x71\x47\xb8\xda\x3a\x2c\x16\xca\x53\x53\xaa\x4c\xe7\xc4\x4b\xa3\x9d\x2d\x4b\x7b\x34\xf5\x9e\x6a\xdb\x62\x1b\x99\xaa\xd2\xb9\x51\xad\x2e\x4f\x74\x5e\xe4\xbd\x99\x6d\x4e\x78\xaa\x68\xd3\xd6\x9d\x75\xb2\x70\x61\xc0\x3f\x46\xa3\xe8\x49\x4e\x5d\x9d\xeb\xb0\xe5\xba\xab\x87\x01\x22\xa3\x4f\x4e\xd5\x2d\x3b\x18\x57\xa7\x94\xcc\xa6\x42\x3b\xbd\x3d\xd1\x9e\x77\xf4\xc0\x34\x38\x8c\xb3\x76\xdb\x2a\x53\xb3\x8d\x4a\x2c\xe4\x1b\xde\x19\x45\x37\xe3\xaf\xb6\x83\xfb\x8a\x61\x2c\xf3\xbb\xa3\xc9\xf5\x84\x9c\x3d\xa9\xb2\x3d\xdd\xed\x60\xd4\x04\x5e\xd5\x77\xfa\x7b\x56\x76\xde\x1c\xf0\x13\xf7\x37\xba\xed\x54\x19\x56\x7c\xb7\x2d\x83\x61\x6a\x5b\x6a\x8a\x7f\xd3\xcd\xef\xb7\x6c\x50\xe7\x71\x82\x9f\x9f\x50\x65\x73\xb3\xe3\x7f\xb5\xdb\xf3\x35\x7c\xce\x17\x72\x1f\x00\xab\x26\x94\x1b\xdf\x3a\xb3\xed\x5a\xc4\xba\xce\xff\x0e\xff\xbc\x2e\x4b\x3e\xcd\x61\xbf\x6a\x3e\xf6\x11\xa0\x34\x07\xd5\xc2\x36\xa1\x82\xe7\x6d\x4e\xdb\xdd\x44\x56\x6f\x3e\xdc\x46\xb8\x1b\xc4\x0e\x40\x66\xa5\x32\x95\x17\x1a\xe4\x20\x11\xae\xaf\x5b\x87\x78\xe2\x17\xa0\xe4\x27\x7a\x78\xdb\x42\xb5\xa4\x9c\x26\x5d\x6d\x61\x3c\x76\x98\xfa\x9a\x11\x9e\x76\x9d\xab\xe1\xcc\xfb\x3b\x26\x0c\x42\xa5\xbe\xc1\x61\x81\x42\x3c\x62\xbb\xec\x6e\x07\x9b\x98\x29\x5e\x01\xb6\xff\xd5\x35\xa0\xfe\x97\xce\x5a\xbe\xfd\x0d\x5d\xe1\x4f\x6e\x5a\xb0\xc7\x4f\x47\xa3\x59\x1b\x10\x65\x32\xad\x98\xa2\x7e\x4a\x08\x38\x55\x9d\x6f\xc9\x69\x66\xc8\x24\x39\xb5\xb6\x9d\x03\x79\xef\x6d\xae\x25\x9d\x40\xa5\x8f\xe7\xf7\x5f\xe3\xfb\x40\x84\x2f\xc8\x9c\x06\x9c\x80\x38\x04\x28\xf0\x7f\x92\x30\x66\xec\x1c\x13\x5b\xc1\x91\x90\x14\xc0\xc8\xd9\xea\xda\x43\xef\x5c\x9f\x30\xa2\x47\x01\xca\x8b\x19\xe9\x06\x6c\x0e\xf4\x12\x56\x03\x1f\x5e\xcc\xb5\xcf\x9c\x69\xc4\xc8\x56\x7f\x6f\x09\x0c\xae\x5b\xb3\x33\x21\x93\x9d\x86\x7b\x72\x0f\x8d\x87\x68\x2c\xe4\xce\xe9\xf8\x0c\x47\xa6\x10\xa1\x77\x06\x72\x84\x7e\x05\x0a\x8e\x44\xa6\x9c\x3b\x21\x95\x1a\x78\x6a\x6a\x06\xe2\xfd\x8b\x40\x5d\x21\x3d\x91\x2b\x27\xec\x2f\xb3\xae\xc4\xe1\x9c\x4f\x9b\x9a\xd3\x00\xeb\x99\x01\xe1\x25\xa1\xd3\x13\x85\xc2\xb3\x92\x3f\xd1\xab\x4b\xc0\x10\xe8\x87\x90\x9f\x88\x7a\xc0\x39\x55\x12\x29\x1e\x53\x5a\x68\xc3\x58\xc8\xd1\x5a\x55\x01\xcb\x33\x47\x6b\xfb\x66\x89\x3d\x96\xc4\x60\xe3\x51\x54\x13\xcf\xde\xc4\xa9\x8e\xe0\x84\x28\x9a\x41\xd4\x3d\x49\xfa\xba\x03\xbb\x2c\x1f\x90\xf8\xea\x44\x5b\xcd\x79\x20\xfe\xea\x3a\xc7\xcd\x9a\x37\x32\x60\x16\x18\xe2\xdf\xbc\xcb\xe0\xb9\x10\x1f\xdb\x22\x67\xa0\x09\x97\xc9\x71\x84\x3b\xb6\x6b\x49\x7f\x6f\x9c\xf6\xa8\xdc\xce\xe0\x9a\xa3\x33\x2d\xf8\xc7\x15\xa5\x32\x5e\x2a\x68\xe4\x57\x72\x15\x48\xbd\x22\x48\xc0\xe4\x24\x04\xfa\x68\xbc\xd4\x03\x40\x83\x9d\x69\x69\x50\x61\x8f\xe1\x53\x8c\xc5\x65\xb5\x67\x62\xd5\xf9\x55\x68\xc8\xa4\x0a\xf3\xb6\xa6\xa4\xb2\x72\xf5\xc8\xb9\x02\xca\xc1\xfe\x50\x28\x60\x8a\x0e\xaa\x34\x39\x65\x9d\x73\x4c\xae\x54\x6a\xfb\xc4\x3a\x9b\x26\x22\x37\x25\xb0\x42\x37\x2d\xd3\x3f\x02\x05\xd2\xf9\x56\x08\x17\x93\x7e\xa8\x6a\x40\x3f\xd3\xf8\x85\xe4\xf2\xb8\x5f\xd7\x19\x12\xfc\xaa\x9d\xd8\x79\x40\x9a\x9d\x85\x0c\xdf\x12\xe3\x6c\x1d\x72\x6d\x4d\xf3\xf5\x98\xfe\x98\xad\xe7\x6b\x81\xe9\x75\xbe\xf9\xbc\x7c\xd9\xd0\xeb\x6c\xb5\x9a\x2d\x36\x5f\x27\x14\x39\x99\x62\x08\x3f\x4d\xc5\x12\x9f\x73\x49\x02\x9d\xd9\x92\x49\x1f\xea\xd2\x54\x06\xa6\x23\xa8\xc1\xa8\x18\x99\x28\x0d\x8b\xe5\xe2\x6e\xbe\x78\x5c\xcd\x17\x9f\x1e\xbe\x3c\x2c\x36\x13\xfa\xf2\xb0\xba\xff\x8c\x87\x66\x7f\xcc\x9f\xe6\x9b\xaf\x7c\xfd\xe3\x7c\xb3\x78\x58\xaf\xe9\x71\xb9\xa2\x19\x3d\xcf\x56\x9b\xf9\xfd\xcb\xd3\x6c\x45\xcf\x2f\xab\xe7\xe5\xfa\x61\x4a\x9b\xcf\x0f\x84\xd3\xf3\xd5\x03\xad\xe6\xeb\x3f\x09\x5e\x6c\x96\xf2\xf5\x9f\x2f\x33\xb9\x66\xf9\x28\x3f\x97\xab\xf9\xa7\xf9\x62\xf6\x44\xaf\xcb\xd5\x9f\xf0\x54\xdc\xa3\xaf\xcb\x17\xdc\xc1\x68\x7c\x9c\xaf\xef\x9f\x66\x73\x18\xc1\x27\x92\xcf\x9c\x53\xbe\x35\x2d\x02\x2c\x15\x09\x6e\x73\xad\x02\xb2\x8d\x72\x6d\x20\xeb\x19\x4a\xa4\xad\xed\x83\x0c\x96\xbd\x0b\x83\xe8\x3e\xa2\xc0\x55\x2e\x44\x42\x87\x80\x0f\xc2\x92\xf7\x0c\x9f\x72\x03\x92\x30\x0c\xf9\xaf\xb6\xa6\x34\xcc\xf7\x17\x39\x50\xa3\x84\x19\x97\x75\x15\x38\x52\x67\x62\x62\x0a\x31\x96\x4a\xbd\xc7\xdb\x80\xde\x3a\xa8\xf8\xb1\xd0\x12\x3d\xe6\x91\x85\xed\x37\x7d\xc8\xa8\xd6\xfb\xd2\xec\x99\x3e\xb7\x93\x50\x45\x54\x06\x6d\x60\xf2\xf3\x91\xa3\x11\x21\x2c\x58\x3a\x2e\x52\x63\xcb\xdd\x83\x34\x11\x97\x9d\x4c\x2a\xc1\xb9\x41\x6d\x6c\x99\x1c\xe9\x2f\xdf\xa0\x58\x72\x23\x82\xc7\xa5\xec\xf3\xdf\x41\xd3\xbd\xfe\x77\x17\xb1\xcd\x55\xa5\xf6\x83\xba\x56\x28\x36\x88\x13\xca\x99\x20\x25\xf0\x14\x75\xd7\x77\xe5\xbb\x18\x50\xac\x8c\x2c\x0d\x57\x3b\x90\x9f\x30\x35\xbd\xcd\x3e\x94\xd6\x8b\x11\x7b\x6b\xf3\xa3\x29\x61\xaa\xb4\xae\xbe\xb5\x4d\xa3\xf6\xd2\x27\x55\x4d\xc7\x86\xed\x94\x29\x3b\x27\x8f\x57\xaa\xdc\x75\x75\x16\x6e\x8b\x40\x88\xf4\x01\x3d\x81\x93\x4f\x21\xba\xd9\x85\xa7\xe1\x31\xed\x23\x1b\xcb\x8b\xb8\x97\x29\xee\x31\x08\x90\x57\x69\xae\x4f\x8c\xfb\x79\x91\x4d\xce\x21\x6d\x85\x54\x68\x09\x05\x9e\x30\xf5\x5f\x1d\x44\x2e\xa0\xc5\xe0\x0d\xe4\xc6\xba\xbf\xf9\x41\xf4\x53\x65\x84\x28\x73\xb9\x92\xfe\x3d\x0b\x4d\xa2\x3a\x72\x0d\x29\xcc\xd6\xa0\xb4\xfa\x2e\x2b\x06\x26\x4e\xa1\xbf\x95\x26\x3c\x63\x7c\x6e\xc4\x73\xd0\xd8\x06\x33\xb9\xcb\x89\x97\x46\xc1\x13\x67\x2f\xfc\x3b\x93\xe1\x87\x5c\x00\x75\x6c\x88\xf3\xf9\x1e\x46\x75\x70\x11\xab\xd5\x05\x32\x10\xe2\x69\xdf\xc3\xf3\x87\x41\x9b\xc0\x38\x73\xfb\x01\xfd\x1e\x0f\x3e\x8f\xd1\xec\xaa\x5a\xda\x36\xf8\xab\xd1\xf1\x39\x16\x35\x96\xf9\xab\x64\xda\x49\xc0\xbf\x31\xac\x41\xed\x33\x15\xdc\xe7\xf6\xa0\xed\xe3\xae\x0e\xe0\x87\x00\x39\xca\x2d\xd2\x95\x7d\x15\x9b\x43\x2f\xb4\xe5\xf3\x05\xe3\x64\x63\xd3\x7d\xa5\x65\x78\x37\x44\xa8\x3d\x9a\x7d\x79\x29\x56\x77\xe4\x44\xa5\xb2\x02\x8d\xcc\x1d\x7a\x96\x5c\xde\x1b\x0e\x12\x3f\x6b\xe3\x60\xaa\x85\x21\x9c\x15\xa4\x71\xd1\x7f\x99\x42\x44\x11\x7b\x83\xce\x2a\xe8\x07\x66\x82\x71\x68\x27\x74\x00\x33\xa8\x1c\x6c\xf5\x70\xdc\x8b\x83\xac\xb8\x98\x28\xf6\x01\x09\x38\xc4\xd3\x5c\x18\x7f\x7e\xd9\x0d\x51\xf4\xd8\x88\x85\x7b\x9c\x6e\xac\x37\xa8\x70\xa7\x1f\x37\x6e\xd2\x6e\x70\x3b\x00\x25\xe3\xe6\xf4\x20\xf3\x0b\x13\xef\xa0\x6b\x23\xd4\xcf\x32\x56\x38\x18\xc5\xdd\x9c\xd4\x33\x24\xa5\x0d\xa5\xa7\xf7\x90\x4b\xa5\xa9\xbb\x10\x84\xc1\x30\x74\xad\x41\xae\xa5\x41\x88\x33\x54\x1a\x44\x55\x9e\x07\x25\xdd\x05\x44\x7f\xe0\x08\x7b\xf9\x7f\x4c\xb5\x61\x1a\x3a\x0f\xe1\xd7\xda\xd0\x2f\x1d\x0f\x86\xb4\x61\x44\xea\xf0\x30\x7b\xfb\x1c\xc6\x82\x59\x16\xf2\x7b\x33\x2c\xb0\x51\x08\xe2\x09\xcd\x63\xbc\x65\x9b\x81\x71\x19\x4a\x9d\x74\xe8\x92\x8d\x82\x99\xc8\x1c\x17\x3c\xfe\x3f\x81\xbe\xf9\x0c\x94\x38\x6b\x62\x48\xd8\xd0\x7e\x0d\x5e\x33\xbb\x10\x02\x53\x32\xbf\x51\x87\x7c\x67\x62\x27\xc7\x1d\x6f\xe7\xa4\xc6\xe8\x7d\x40\x81\x1d\xc6\xf7\xe5\x7a\x4e\xf7\xda\xc5\xa1\xc2\x22\xc8\x28\x1f\xc2\x1a\x6f\x77\xed\x91\x27\xc4\x80\xb7\x4f\x72\x9d\x64\x93\x4f\x27\x05\xe7\xf0\xc6\x89\x5c\x4c\x1a\xff\x0a\x58\x63\x9e\x57\x59\x7c\x10\x4b\x87\xa3\x3a\x4c\x44\x97\xb3\xec\x79\x4e\xed\xfb\x89\x30\x7a\x87\x95\x64\x24\xe2\xb3\x4a\x79\xf3\xc2\xed\x45\x02\x36\xcd\x3d\x6f\x95\x4d\x8a\xcd\x51\x9d\xbc\x14\xc2\x5e\xbc\x39\x15\xc1\xcd\xac\xed\x07\xe8\x30\x70\xa6\x6e\xf7\x52\x3d\xf1\x09\x30\x07\xca\xf6\x54\x97\x09\x09\xfa\x24\x17\xcb\xec\x03\x02\xa0\x3c\xea\x50\x2e\x42\x33\x80\x67\x1a\x14\x3f\xc3\x19\x2b\x83\x32\xeb\x44\xc7\xa7\x42\x22\xc1\x9f\xa8\x6e\x31\xb6\x1e\x59\x9c\x48\x7b\x73\x7f\x4b\x1f\x7e\xfb\xed\x03\x3d\xa9\xa3\x13\x35\x42\x7b\xb7\xb2\xc0\x67\x4a\x33\xb8\x15\xe9\x12\xab\x4a\x3e\xa5\xd1\xf3\x79\x6a\xc0\x4d\xc3\xff\x5a\x09\x74\x92\xa2\x21\x53\xf9\x30\x35\x07\xef\x27\xfd\x1f\x96\xee\x5e\x80\xc3\x96\x24\x2a\xdb\xc1\x38\x97\x8e\x05\x55\x0b\xbd\xf0\xf5\x49\x86\xc5\xf2\x6d\x8f\x3f\xfa\x4f\x00\x00\x00\xff\xff\x4e\x7f\x03\xfb\x55\x13\x00\x00") - -func confLicenseAcademicFreeLicenseV12Bytes() ([]byte, error) { - return bindataRead( - _confLicenseAcademicFreeLicenseV12, - "conf/license/Academic Free License v1.2", - ) -} - -func confLicenseAcademicFreeLicenseV12() (*asset, error) { - bytes, err := confLicenseAcademicFreeLicenseV12Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Academic Free License v1.2", size: 4949, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseAcademicFreeLicenseV20 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\x5a\xdd\x72\x1b\xb7\x15\xbe\xe7\x53\x60\x34\xd3\x89\x38\x43\x71\x2c\x27\x69\xda\xe4\x8a\x51\x24\x87\x8d\x23\xb9\x94\x54\x8f\x2f\xc1\x5d\x50\x44\xb2\x04\x18\x60\x57\x34\xdf\xa7\x4f\xd2\x27\xeb\x77\xce\x01\xf6\x87\xa4\xec\x24\x9d\xe9\x8d\x4d\x72\xb1\xc0\xf9\xfd\xbe\x73\x0e\xf4\xb0\x36\x6a\x56\xe8\xd2\x6c\x6c\xa1\x6e\x82\x31\xea\xad\x2d\x8c\x8b\x46\x8d\x9e\xa7\xea\xf5\xf4\xd5\xe8\x61\x6d\xe3\x0b\x4b\xce\x6b\xbc\x7d\x96\xbe\x9d\x8d\x95\xde\x6e\x2b\x6b\xa2\xaa\xbd\xd2\x6e\xaf\x7c\xb0\x4f\xd6\xe9\x4a\xed\x7c\xf8\x55\xf9\x95\xd2\x4d\xbd\xf6\x21\xae\xed\x36\xbd\x7a\x97\x57\xbc\xc7\x0a\x6c\xb0\x5b\x7b\x6c\xeb\x77\xce\x84\xc1\xe6\x3e\xe0\xe1\x5a\x47\xb5\xad\x74\x61\x4a\x45\x8f\x56\xbe\xaa\xfc\xce\xba\x27\xe5\x7c\x8d\x55\xca\x6e\x36\xa6\xb4\xba\x36\xd5\xbe\xf7\x90\x96\x16\x7e\xbb\xc7\x49\xeb\x3a\x2f\x5d\xf9\xc0\x0f\x06\xe7\x7f\xab\x46\x49\x95\x52\x35\xae\x34\xb2\xe4\xb4\xe6\xcf\x26\x44\xeb\x1d\x1b\x68\x74\x39\x56\x6f\x82\x76\x35\xa9\x78\xd5\x1e\x95\x96\x4e\x55\x56\x41\xad\x4d\x30\xcb\xbd\x7a\xa2\xb5\x51\x7d\xf0\x8d\xd2\x64\x9a\xaa\xbc\xd8\xd9\xd2\x4c\x54\xf0\x7b\x5d\xd5\xfb\x8b\x15\x4e\x9a\x40\x54\x77\x61\x3e\x16\x55\x13\xed\x33\xbe\x6e\x4d\xd8\x9a\xba\xd1\xd5\x44\xc5\x66\x59\xc9\xe6\x7a\x59\x19\x95\x3e\x93\xd5\x4b\x3f\x34\xcd\xb7\xa3\x91\x1e\xd3\x83\x60\xb6\xc1\x97\x0d\x54\x3f\x52\x5b\x59\x47\x06\x82\xdf\xbe\x53\xa3\x25\xaf\xde\x62\xb9\x0e\x46\xc1\x06\xf6\x59\xd7\x38\x9f\x5d\x18\xd5\xf9\xd9\x0f\xdd\x4f\xf4\x72\x84\x5f\x96\x9a\x2d\xb6\x85\x39\x8e\x36\xc7\x96\x05\x6f\x59\xda\x58\x07\xbb\x6c\x6a\x93\x0e\x23\x63\x1d\xcb\xa2\x5d\xa9\x0e\x8f\xa0\xd7\x69\xe5\x96\xd5\xc6\x8e\xa5\x08\x69\x02\xdc\xb8\x39\xb1\x89\x2c\xac\xf6\xdf\xf1\x76\x23\x93\x05\x40\xf0\xec\x3f\xb1\x7c\x3a\x1a\xbd\xee\x79\xf2\x1d\x22\xc9\xfd\xff\xdd\x38\x49\xb1\xb7\x95\xe3\x8b\x4a\xdb\x4d\xe4\x94\x28\x91\x50\x30\x9e\xab\x03\xdc\x8b\x6f\x4b\x51\xa6\x95\xab\x5e\xeb\x5a\x91\xdb\xcc\x66\xe9\x4b\x8b\x15\xf6\x84\x47\x14\xb2\x68\xd5\x04\x67\xe3\xfa\x78\x8f\x09\x59\x6a\xa3\x7f\x25\x29\x48\x94\x68\xaa\x8a\x8d\xe8\x57\x2b\xc8\x44\x69\x13\x75\x75\x2a\x88\x4e\x39\x0e\x06\xfd\xb2\x67\xd0\x7b\xdf\x04\x04\xe0\x95\x2f\x4d\x67\x55\xc2\x9f\xda\xc0\x8d\x67\xbd\xc7\x67\x6a\x63\xb4\x8b\xe2\xf5\x60\x70\x74\x80\xac\xec\xed\x93\x51\x43\x72\x41\x6a\x4a\xf7\x0d\x34\x5f\xd9\x02\x52\x78\xc7\x91\x63\x6b\x96\x4d\x93\x22\xcf\xda\x56\x6c\xeb\xd2\x17\xcd\x06\xe6\xe5\x65\x08\xf3\x58\x20\x36\xe9\xf5\xb5\xdf\xb1\x09\x68\x97\x13\xb1\x72\x1c\x05\xfa\x09\x5e\x8e\x92\x34\xfe\x19\xfe\x47\x30\x6c\x74\xb1\xb6\xce\x5c\x04\xa3\x4b\x3e\x8e\xf0\x27\x4b\xde\xb7\xc2\xe9\x14\xa8\x3c\x04\xd9\xd9\x7a\xad\x0c\x36\x1a\xbc\x3c\x5c\xc9\x0e\x6f\x05\xea\x32\x2c\xf6\xc4\x0c\x26\x9a\xf0\x6c\xc4\x96\x02\x4c\x90\x35\x42\xf1\xc8\x0a\x02\xdb\x3d\xc2\xf0\x49\x2c\x01\x85\x08\x61\xc9\x12\x7f\x40\x0d\x84\x99\x76\xf8\x97\x1c\x24\xfb\x00\x3f\x7c\xb4\xb5\x0f\x7b\x7c\xd4\xd1\x3b\xbc\xbf\x57\x85\xae\x8a\xa6\x42\x5c\x97\x29\x7f\x37\x70\x0e\x4e\xf8\xb8\x85\xac\x14\x35\xe4\x28\x04\xf8\xb3\x71\x96\x62\x5f\x17\x85\x89\x91\x84\xa2\x24\x23\x27\x23\x76\xd9\x3a\xf8\xbf\xd5\x90\x32\xc2\xba\x46\x9c\xd0\x83\x99\x23\x7b\x4d\x78\x7f\x52\x91\x12\x0f\x2c\x94\xd8\x41\x97\x65\xa0\x73\x58\x33\x5d\xbf\xa4\x08\x69\xf9\x27\xa8\x46\xb2\xb2\x23\xc6\xe3\x98\x1a\x8d\xbe\x1a\xab\x6b\x81\x08\x0a\xda\x9b\xe0\x37\x2d\xd1\x70\xf6\x4c\xd5\xad\x41\x3c\x24\x46\x72\x7a\x23\xf0\xd9\x65\xad\xf3\x07\x8f\x88\x7e\x19\x2a\xc8\x16\xa0\xdc\x93\x27\xcb\x7b\xcc\xd4\xec\x54\x8b\x4d\x02\xb1\x9d\x26\xd4\xa5\x5c\x47\xe8\x90\x0e\xfc\xc3\x04\xff\xed\xd5\xd2\x10\x32\xb0\x03\x8d\x2b\xb1\xb3\xa1\x85\x88\xfd\x8d\xaf\x29\x59\x89\x64\x80\x8a\xcc\x1c\x94\xb3\xa4\x0b\x47\xd9\x30\x74\x29\xbc\x7d\x53\x2b\xf8\x9e\x6d\xbf\x0d\x16\xdb\xec\x82\xad\x81\x7a\x12\x1a\x91\x09\x36\x85\x5b\x56\x15\x96\xf0\x35\x7b\x8e\xb1\xcd\xc6\xd6\x50\x71\x4d\x29\xbe\x24\xd2\x32\x1b\x11\x90\x11\x9a\xf5\x63\x8f\x88\x11\x5a\x05\x27\x9d\xaf\xf0\x59\xe0\x16\x1f\x78\x01\x34\x2f\x82\xa9\xd9\x08\x6c\x1f\x36\xbe\x75\x70\x78\x65\x0a\x82\x6f\x52\x15\x62\xd6\xfb\xbe\x23\xa0\x4e\x61\xb6\x35\x85\x67\x52\x0c\xf1\x11\x6b\x8e\x78\xc2\x0b\xeb\x48\xfe\x0c\xed\x99\xb7\xa1\x04\x4b\x2a\x42\x1f\xa2\x2f\x76\x15\xf0\xa5\xb4\xa5\x1f\x04\xdd\x09\xbd\x5a\x4f\x1f\x70\x45\x8a\x14\x2d\xe8\x5f\xe5\x9a\x26\x3d\x2e\xcd\xca\x3a\x21\x87\x7b\xe8\x22\x55\x0c\x89\x25\x61\x3b\x94\x86\x36\xe8\xc7\x44\x5f\x57\xa4\xa9\xb2\x2b\xd0\x18\x40\x4a\x1e\x13\xf9\x58\x87\x40\x2e\x5f\x20\x9f\xdf\xe1\x3e\x32\x72\x80\xed\x32\x4a\x04\xbf\x06\x34\xf7\x70\x8e\x43\x4a\x94\xa2\x8d\x84\x2d\x01\xd7\xb0\x11\x19\x81\xc8\x24\xf6\xe2\x2e\x1f\x40\x76\xfa\x14\x7c\xb2\xd5\x76\x36\x52\xa9\xd3\x54\xf0\x97\x26\x40\xea\x20\x33\x99\x11\xd9\xfa\xf5\x58\x71\x4d\x1c\x93\xf5\x48\x62\x47\x9f\xa0\x01\xc2\x61\x43\x31\x5c\x62\xdd\x5f\xc7\x6a\x56\x4b\x06\xd2\xb2\x05\x47\xda\x94\xb1\x6c\xd3\xc4\x1a\xd8\x52\x6b\xeb\x26\xd9\x50\x07\xc4\x40\xf2\x1e\x57\x42\x24\x32\x6d\x80\xe8\x84\xcf\x27\x4c\x6b\x6d\x18\xe7\x28\xa6\x98\x69\x9d\x96\x70\xa8\x35\xc9\xe7\x19\x68\x42\xf1\xbb\x63\xe6\x8f\x2c\x46\xde\x01\x8b\x3b\xbb\x33\xa9\xe2\xa1\x90\xe7\x96\x85\xac\xcd\x47\x04\x50\x49\xd6\x58\x59\x29\xd3\x29\xe8\x65\x1f\x75\xd6\xb7\xc6\x2d\xef\x39\x3d\xeb\xcc\x51\xe8\x26\x9a\x23\x01\x57\x29\x03\x3f\x67\x0a\x72\x51\xa1\x03\x70\x5a\x33\x1a\x21\xc4\x61\x88\xe3\x13\x5f\xe6\x23\x81\x7d\x3c\x2f\xec\xd6\x72\x76\xb5\x47\x70\x2c\x48\x65\x91\x9a\x8f\x43\x04\xff\x66\xac\xde\xe3\x74\xe4\x0d\x03\xc2\x3b\xd4\x02\xc6\x69\x57\x08\xa7\xfd\x60\x23\x27\x9f\xa1\x5c\x6e\x17\xf6\x58\x7a\x27\x3f\xa5\x23\x87\x3c\xc2\xec\x5a\x9e\x04\x70\x79\x40\x45\x92\xf8\x3d\xc1\x5c\xce\xdf\x64\x7d\x30\x5e\x7b\x10\x65\xa8\xd4\x92\x87\xd5\x63\x7a\xd8\x15\xa5\x7c\x24\x69\xdf\xf5\x42\x92\x5b\x1c\x33\xbd\xcc\xe2\x52\x85\xa5\x38\x82\xed\x1e\x05\x9d\xc7\xb1\xfc\x4a\x1d\x5e\x87\xbc\xac\xc2\x40\xfc\x29\x71\xe1\x4b\x28\x9a\x72\xa5\xcf\xbf\xf0\x76\x61\xf0\x0d\x31\x19\x0d\xa5\x62\x81\xbc\x38\xd1\xe5\xc4\x5c\xa1\x75\xdd\x5d\x4f\x09\xef\x24\x44\xef\xd5\xfc\xfe\x4c\x7d\x3f\xbb\x9f\xdf\xb3\x68\xef\xe7\x0f\x3f\xde\x3d\x3e\xa8\xf7\xb3\xc5\x62\x76\xfb\xf0\x61\xa2\x12\x13\x67\xe6\x82\xdd\xec\x86\xd8\xbd\x9c\x24\xec\x83\x24\x93\x96\xe0\x2a\x0b\x3c\xe0\x5a\x42\x84\x4a\x9e\x4e\x0d\xd0\xed\xdd\xed\xc5\xfc\xf6\x66\x31\xbf\x7d\x73\xfd\xf3\xf5\xed\xc3\x44\xfd\x7c\xbd\xb8\xfa\x11\x07\xcd\xbe\x9f\xbf\x9d\x3f\x7c\xa0\xed\x6f\xe6\x0f\xb7\xd7\xf7\xf7\xea\xe6\x6e\xa1\x66\xea\xdd\x6c\xf1\x30\xbf\x7a\x7c\x3b\x5b\xa8\x77\x8f\x8b\x77\x77\xf7\xd7\x28\xa2\x7f\xbc\x56\x78\x7b\xbe\xb8\x56\x8b\xf9\xfd\x4f\x0a\x5a\x3c\xdc\xf1\xaf\xff\x7c\x9c\xf1\x36\x77\x37\xfc\xf5\x6e\x31\x7f\x33\xbf\x9d\xbd\x55\xef\xef\x16\x3f\x41\x53\x56\x4f\x7d\xb8\x7b\x9c\x0a\xa4\xfd\x30\xbf\xbf\x7a\x3b\x9b\x43\x08\x7a\x23\xeb\x4c\x6e\x8c\xb5\xad\xa9\xb4\x24\x2b\x41\x6d\x4a\x71\x22\x41\x1d\xea\xc3\x78\x60\x2e\xe9\xf5\xa4\x47\x6e\xe8\x87\xa7\x78\x22\xd1\x66\xcf\x2d\x65\x9b\x31\x48\xae\xbf\x8d\xb1\x77\x36\xa3\x70\x90\x5e\xda\xca\x52\x0a\x3d\xf2\x3b\x0e\xc9\x6f\x03\x6a\x7a\x84\x89\x2b\x8c\x44\x55\x93\x1f\x55\xe6\x09\xc7\xc3\xfa\x28\xe3\xe0\x99\xb5\x49\x6c\x0e\xe9\x20\xfe\x79\xeb\x35\xe5\xcc\x13\x4a\x61\x8a\xa0\xf1\x44\x62\x57\x17\x40\xd5\x3e\x3b\x4c\x12\x53\x0d\x72\x67\x49\x2c\xcb\x25\x72\x9a\x7c\x20\x13\x00\x32\x2d\x78\x95\x16\xa8\x52\x53\x7c\xe4\x4f\x71\x0b\x98\xa1\x26\x10\x87\x33\x60\xd2\x67\x29\x66\xa3\xf9\xad\x49\xe6\x2d\xf5\x46\x3f\xf5\x0a\xba\xb5\x26\x81\x0c\x65\xaa\x15\x10\x8e\x44\x51\x26\x36\xd5\x91\x1b\x54\x2a\x09\x09\x54\x4f\x76\x0f\x9f\x09\xd6\x7c\x36\xe9\x50\x79\x29\x8f\x9f\xbc\x2f\x77\xb6\x82\xa8\x3c\xd1\x89\xb5\xdf\x6e\xb1\x88\x6c\xb5\xd9\x36\x24\xd8\x0a\x1d\x56\x13\xf8\xf0\x8d\xae\x56\x8d\x2b\x64\xb7\x64\x88\xdc\x89\x49\x89\x82\xb7\xe0\xe0\x62\xa0\xa9\x1c\x46\x2d\x0c\x07\x64\x35\xf0\x7b\x95\xfd\x9e\x9c\x00\x62\xe2\xd2\x7a\x2f\x04\x9d\x1f\x92\xc8\x25\x48\x61\xcd\xa5\x29\xbb\x02\x47\x58\xf7\x4b\xc3\xfd\x08\x59\x8b\x8c\xb7\xea\xea\x6c\x1f\xbe\x88\x3d\xef\x67\xb0\x05\x9d\x71\x1f\x42\xd5\x7b\x21\x4d\xba\xde\xb5\x25\x49\x94\xd2\xa7\x13\x71\x0a\xe6\xda\x18\x85\x63\x6c\x2c\x6d\x21\x2d\x68\xe9\x45\x4c\x6a\x12\xd2\xa6\xa9\xd2\x67\x65\x07\xfa\x75\xc1\xf0\x62\x2c\x20\x74\xbc\xf8\xb9\xdb\x87\xac\xda\xdb\x88\xca\xf4\x81\x65\x00\xe2\xc8\xa2\xbf\xa3\x1c\x29\x28\xcf\x5a\x5a\x7a\x20\xbc\x76\x49\xf4\xf9\x8a\xc1\xfe\x77\xce\x69\xc8\x9f\x87\x9c\x3c\xe9\xb8\x9c\x8a\x58\x8e\xcc\xc4\xb5\xd0\x7a\xb5\xa2\x64\xeb\xb8\x64\x98\xaf\x90\xd2\x2f\xa9\x1c\x4a\x26\x12\x6c\xd5\x0c\x34\x24\x41\x9f\x95\xfd\xcb\x5c\xd4\xd5\x97\xa6\x42\xdc\x43\x8d\x61\x4e\x9c\x73\x1c\x4a\xf4\xe5\x66\x83\x3b\x78\x2a\xa7\x91\xc6\xf5\xce\xe0\x97\x8e\x2d\x61\x24\xe8\x34\xee\xcf\x7a\x7a\x24\x47\x25\x87\x14\x1f\x47\xd5\xc9\xa7\x66\x62\x9c\x99\x68\x9f\x3e\x52\xec\xa7\xca\x34\x19\xf9\x80\xc0\x7b\x25\xfa\x65\x62\xf3\x49\x5b\x78\x69\x48\xbf\xd9\xd6\x69\xec\x17\xfd\x21\x8a\xbe\x44\xd7\x7f\xd6\x06\xb6\x4f\xc7\x39\x07\xa4\x90\x78\x9c\xde\x4f\x7b\x15\x0b\x92\x44\xc8\x0e\xd1\x0b\xb3\x54\xdc\xec\xe8\x1d\x8b\x92\x33\xbf\xa1\xc2\x80\xc2\x39\xf5\xe4\x5c\xf6\x4b\x2c\x12\x56\x93\x59\xf7\x3c\x1d\x0a\x06\x81\x03\x88\xc1\x9a\x64\x31\xa9\x3e\x5f\xb2\x59\x2a\x5a\x4e\x9a\x4e\x1e\x94\x34\x1e\x32\xf4\x25\xf0\x88\x21\x65\xc4\xa1\x9d\x5a\xac\x42\x5e\x52\xd8\xb1\x31\xd3\x84\xa2\xb4\x9c\xdc\xc8\xaa\xcb\x57\xe3\x7e\x1e\x31\xf6\xa4\xc9\xe1\xac\x90\xcc\x7a\x38\xee\x73\xea\xf4\x86\xa1\x91\xb8\xa7\x59\x43\xc1\xcd\x43\x32\x76\x4a\x61\x9e\x75\x30\x3d\x7e\x36\x52\x92\xd6\xcb\xfd\x81\x0e\x6d\xfa\x96\x49\x65\x01\x5d\x41\x00\x68\x2f\xe8\xdc\x31\xa0\x46\x44\x03\x7f\x2f\x98\x7c\x05\x84\x1a\xf2\x0c\x7f\x9f\xb0\x76\xa9\x58\x43\xb9\x1c\xf0\x86\x44\xcd\xb9\x1d\x23\x86\x90\xbe\xb1\xd7\x51\x71\x5d\x88\x78\x01\xd5\x71\x94\xea\xfc\x6a\x0f\x4f\xa9\xa9\xf5\xab\x7a\xa7\x85\x33\xce\x6d\x6f\x23\xd2\x96\xc0\x0f\x88\xfe\x3b\xb7\x3a\x4e\xb5\xf3\x25\x0f\x19\xb2\x7a\x50\x7e\x99\x3c\xf5\x02\xb0\xf1\x49\x12\xa4\x7d\xc1\xc0\xbc\x25\x7d\x1e\x93\xcb\x2f\xc7\xea\x1f\x3d\x8c\x9f\xa8\x7f\x19\xd7\x48\xc0\xbc\x41\xdd\x1f\x1c\x1d\xf5\x56\xef\xa6\x6a\x46\x79\x2a\x51\x48\xe3\x94\xc6\x52\xd7\x87\x8e\x83\xa7\x45\x7e\xe8\xab\x34\x5d\x59\x06\xdf\x50\x12\x79\x57\xed\x73\xb9\x0b\x27\x84\xd4\xed\x0f\xd8\x85\x6a\x19\x2e\xf1\x07\xd5\x08\xec\x04\x16\x91\xca\x94\x96\x58\x90\x54\x7f\x5a\x26\x13\x1a\x8a\xe9\x6d\xb0\x68\x11\x71\x2c\x78\xc4\x21\xb1\x27\xbd\xba\x89\x47\x07\x29\x69\xb9\x2b\x19\x1c\xdc\x99\x94\xf6\xc1\xa6\x2b\xb8\xa1\xbe\xf0\xab\x8b\xc4\x90\xcf\x96\x87\x59\x32\xe0\x4d\x5e\xaa\x7b\x9d\xc1\xa3\x63\xf0\xb8\x4d\xbe\xb8\xe2\xa9\x9f\x2c\x70\xf4\x8d\x4b\xaf\xd8\x5e\xd4\xcc\x07\xf0\x70\x4f\x33\x68\x6c\xf4\x06\xf5\x48\x1c\x02\x93\x08\x86\xfe\x9b\x6d\xff\x62\xf1\x83\x6a\x87\x8c\xc4\x4f\x22\x90\xeb\x38\xfd\x09\xfa\x56\x54\xd2\xe4\xe4\xcf\x19\xde\x4e\x2a\xd0\x2a\xfd\x92\xe2\x91\x33\x92\xd0\x2e\x18\x19\xcc\x70\x57\x83\x0e\xb0\xaa\x7b\x14\xca\x30\xd9\x5d\x10\xcd\xa8\x10\xbc\xfc\x86\x7f\xbe\x9a\xaa\xff\xfc\x5b\x5d\xbe\xba\x54\xa6\x46\x1b\xf3\xdb\xf4\x8f\x01\xe8\x4b\xe8\xd9\x9b\x52\x88\xd8\xb1\x09\xcf\xdc\xa9\x27\x7a\xc8\x4a\x1d\xf2\x28\xa2\xfc\x35\x8f\x2f\x7c\x70\x66\x1f\xd5\x8d\xa1\x92\x6c\xee\x84\x79\x64\x47\x1e\x01\xc2\x41\x85\xf9\x04\xdb\xf0\x14\xd1\xf0\x68\x3e\xd7\x78\x5d\x06\x50\xf4\xd6\x7e\x92\xe7\xfc\x34\x9e\xa7\xdf\xa9\xab\xd8\x77\x76\x66\x0c\xa8\x04\xe4\x50\x07\x50\x86\xa5\xa8\x8b\xc9\xd2\x32\x41\x26\x63\x7c\xa6\xa8\xed\x15\x24\x3a\xeb\xf6\x85\x5a\x19\x93\x91\x9d\x76\xc4\x1e\x0d\x5f\x38\xf0\xc5\x98\x73\xc9\x80\x8c\x0c\x5c\xf1\x9d\x80\x4d\xb2\xca\x76\x6b\x34\xd3\x45\x6f\xd1\xff\xea\x84\x2f\xc7\xea\x67\xb4\x42\xa6\xaa\xb4\x33\xbe\x89\x07\x6c\x42\xd7\x7a\x26\xa6\x61\x85\xe1\x32\xbc\x32\xc4\x2a\x2d\x9f\x43\x81\x22\x21\x12\xc7\x7a\x8a\xd9\x0d\x55\x0f\x72\x89\xe1\x57\x5c\xfc\x71\xdb\x92\xf3\xf6\xc8\x8d\xf8\xb8\x36\x15\xbb\x80\x26\xc0\x2e\x39\x9e\x2c\x39\x11\x7d\xbb\x77\x5b\xc7\x31\x75\xd3\x2c\x96\xb1\x6c\x58\x53\xc3\xaa\x48\x58\x02\x9f\x34\xf3\xa4\x8b\x9a\xde\xae\xa4\xfc\x57\x63\x14\x56\x2b\xeb\x6c\xb6\xce\x19\x08\xec\x8c\xdc\xf2\x30\xa8\xf9\xe4\xe7\x7a\xcd\xc8\xe9\x0f\x6a\xbe\x41\xc3\xd7\xc0\x47\x41\x9a\x8c\x1d\x65\x91\xa6\xe7\x72\xd7\xc4\x37\x18\xa5\x7d\xb6\x65\x23\xe5\xb7\x4e\x7d\x63\xa2\xa0\x5e\xf1\x91\xb8\x97\x71\x72\x92\x02\x07\x86\xdf\xdb\x7c\x6f\x93\xca\x86\x7e\x56\x4c\x0e\xea\xd4\x1b\x12\xa2\xdb\x9f\x33\x39\xab\xc7\x08\x16\xfb\xfc\xc7\x00\x9c\xae\xfe\x28\xca\xe3\xf0\x1e\x90\xfb\x2b\x9b\x24\x62\x86\xf7\x2e\xaf\x10\x89\xf6\x68\x01\xf8\xcc\x6d\x13\xb6\x3e\x9a\x2e\x51\xcb\xd6\xc2\x10\x20\xbd\x93\xef\xdf\x88\xd6\x39\x37\xc9\x5a\x93\xd4\xc6\x0a\xaf\xe4\x46\x96\xc7\x6e\x79\x70\x27\x3f\x26\xb6\xdb\x68\xa7\x53\x79\x90\x73\x42\xb4\xe9\x3c\xb2\xdc\xb7\x5d\xf6\x41\x93\x9d\x6b\x01\xfe\x53\x00\xfe\x83\x01\xec\xb1\xb2\xab\x9a\x7b\xeb\x82\x6b\x8e\xaf\x5f\xfd\x65\xcc\x07\xf9\xd0\xa2\x3c\xe1\x3a\xca\x39\x99\x06\x81\xb4\xc9\xac\xb2\x17\x36\x5b\x1a\x07\x65\xb9\xdf\x1c\xec\xdb\x93\x8d\xc2\xee\xeb\xb1\xcc\x6a\x49\xb7\x47\xf2\x55\xae\xc8\xb2\x9a\x47\xd7\xe7\xe4\xef\x9d\x06\x4c\x52\xdb\xd5\x0d\x92\x71\x3a\x30\xba\xa8\xdb\x9b\x5b\x29\x1b\xf3\xf0\x6d\x88\x92\xf8\x89\xeb\x66\x0a\xa7\x96\xad\x79\x92\x49\xde\xa2\x8d\x79\x46\x89\x78\xa2\x41\x77\xaa\x53\x82\xa4\x59\x44\x9f\x11\x2d\xa1\x1a\xdf\xd0\x92\x3a\x0d\xbd\x25\x37\x67\xd0\x29\xf5\xd2\x6d\x2e\x77\x24\x74\x7e\x35\x56\xaf\x5f\xbd\xfa\x92\xea\x95\xc0\x75\xe1\xf5\x54\x2d\x10\x21\x80\xae\x19\xd4\x4a\xb1\x9e\xae\x11\x41\xab\xa3\x77\x5d\x03\xc4\xa8\xd0\x5d\x86\x0b\x44\xf3\x2d\x21\x69\x31\xb8\x8b\xeb\x9d\x9f\x81\xb9\x7f\x55\xdb\xb6\xfb\x5d\x2d\x44\x2a\x2f\x7b\x63\xd7\xfc\x5a\xbf\x41\x3c\x7d\x61\x24\xe4\x90\x35\x64\x57\x4f\x47\xff\x0d\x00\x00\xff\xff\x7d\x87\xaf\x91\xe9\x22\x00\x00") - -func confLicenseAcademicFreeLicenseV20Bytes() ([]byte, error) { - return bindataRead( - _confLicenseAcademicFreeLicenseV20, - "conf/license/Academic Free License v2.0", - ) -} - -func confLicenseAcademicFreeLicenseV20() (*asset, error) { - bytes, err := confLicenseAcademicFreeLicenseV20Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Academic Free License v2.0", size: 8937, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseAcademicFreeLicenseV21 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\x5a\xdb\x72\x1b\x37\xd2\xbe\xd7\x53\xa0\x54\xf5\x57\xc4\x2a\x8a\x65\x39\xc9\x9f\xdd\xcd\x15\xa3\x48\x0e\x37\xb6\xe4\xd5\x61\x5d\xbe\x04\x67\x30\x22\x92\x19\x60\x02\xcc\x88\xe6\x13\xed\x7b\xec\x93\xed\xd7\xdd\x98\x13\x49\xd9\x49\xb6\x6a\x6f\x2c\x92\x83\x01\xfa\xf8\x7d\xdd\x0d\x3f\x6c\x8c\x5a\x66\x3a\x37\x95\xcd\xd4\x75\x30\x46\xbd\xb5\x99\x71\xd1\xa8\x93\xe7\xc5\xeb\xc5\xc5\xc9\xc3\xc6\xc6\x17\x56\x9c\x35\x78\xf9\x34\x7d\x3b\x9d\x29\x5d\xd7\xa5\x35\x51\x35\x5e\x69\xb7\x53\x3e\xd8\x27\xeb\x74\xa9\xb6\x3e\xfc\xaa\x7c\xa1\x74\xdb\x6c\x7c\x88\x1b\x5b\xa7\x57\x6f\xbb\x15\x1f\xb0\x02\x1b\x6c\x37\x1e\xdb\xfa\xad\x33\x61\xb2\xb9\x0f\x78\xb8\xd1\x51\xd5\xa5\xce\x4c\xae\xe8\x51\xe1\xcb\xd2\x6f\xad\x7b\x52\xce\x37\x58\xa5\x6c\x55\x99\xdc\xea\xc6\x94\xbb\xd1\x43\x5a\x9a\xf9\x7a\x87\x93\x36\x4d\xb7\xb4\xf0\x81\x1f\x4c\xce\xff\xdb\xc9\x49\x52\x25\x57\xad\xcb\x8d\x2c\x39\xae\xf9\xb3\x09\xd1\x7a\xa7\xc8\x40\x27\x17\x33\xf5\x26\x68\xd7\x90\x8a\x97\xfd\x51\x69\xe9\x42\x75\x2a\xa8\x8d\x09\x66\xbd\x53\x4f\xb4\x36\xaa\x8f\xbe\x55\x9a\x4c\x53\xe6\xe7\x5b\x9b\x9b\xb9\x0a\x7e\xa7\xcb\x66\x77\x5e\xe0\xa4\x39\x44\x75\xe7\xe6\x53\x56\xb6\xd1\x3e\xe3\x6b\x6d\x42\x6d\x9a\x56\x97\x73\x15\xdb\x75\x29\x9b\xeb\x75\x69\x54\xfa\x4c\x56\xcf\xfd\xd4\x34\x50\x49\xcf\xe8\x41\x30\x75\xf0\x79\x0b\xd5\x0f\xd4\x56\xd6\x91\x81\xe0\xb7\xef\xd5\xc9\x9a\x57\xd7\x58\xae\x83\x51\xb0\x81\x7d\xd6\x0d\xce\x67\x17\x46\x75\x76\xfa\xe3\xf0\x13\xbd\x1c\xe1\x97\xb5\x66\x8b\xd5\x30\xc7\xc1\xe6\xd8\x32\xe3\x2d\x73\x1b\x9b\x60\xd7\x6d\x63\xd2\x61\x64\xac\x43\x59\xb4\xcb\xd5\xfe\x11\xf4\x3a\xad\xac\x59\x6d\xec\x98\x8b\x90\x26\xc0\x8d\xd5\x91\x4d\x64\x61\xb9\xfb\x9e\xb7\x3b\x31\x9d\x00\x08\x9e\xdd\x67\x96\x2f\x4e\x4e\x5e\x8f\x3c\xf9\x1e\x91\xe4\xfe\xf7\x6e\x9c\xa7\xd8\xab\xe5\xf8\xac\xd4\xb6\x8a\x9c\x12\x39\x12\x0a\xc6\x73\x4d\x80\x7b\xf1\x6d\x2d\xca\xf4\x72\x35\x1b\xdd\x28\x72\x9b\xa9\xd6\x3e\xb7\x58\x61\x8f\x78\x44\x21\x8b\x8a\x36\x38\x1b\x37\x87\x7b\xcc\xc9\x52\x95\xfe\x95\xa4\x20\x51\xa2\x29\x4b\x36\xa2\x2f\x0a\xc8\x44\x69\x13\x75\x79\x2c\x88\x8e\x39\x0e\x06\xfd\x7a\x64\xd0\x7b\xdf\x06\x04\xe0\xa5\xcf\xcd\x60\x55\x82\x9f\xc6\xc0\x8d\xa7\xa3\xc7\xa7\xaa\x32\xda\x45\xf1\x7a\x30\x38\x3a\x40\x56\xf6\xf6\xd1\xa8\x21\xb9\x20\x35\xa5\x7b\x05\xcd\x0b\x9b\x41\x0a\xef\x38\x72\x6c\xc3\xb2\x69\x52\xe4\x59\xdb\x92\x6d\x9d\xfb\xac\xad\x60\x5e\x5e\x86\x30\x8f\x19\x62\x93\x5e\xdf\xf8\x2d\x9b\x80\x76\x39\x12\x2b\x87\x51\xa0\x9f\xe0\xe5\x28\x49\xe3\x9f\xe1\x7f\x04\x43\xa5\xb3\x8d\x75\xe6\x3c\x18\x9d\xf3\x71\x84\x3f\x9d\xe4\x63\x2b\x1c\x4f\x81\xd2\x43\x90\xad\x6d\x36\xca\x60\xa3\xc9\xcb\xd3\x95\xec\xf0\x5e\xa0\x21\xc3\xe2\x48\xcc\x60\xa2\x09\xcf\x46\x6c\x29\xc0\x04\x59\x23\x14\x8f\xac\x20\xb0\xdd\x23\x0c\x9f\xc4\x12\x50\x88\x10\x96\x2c\xf1\x07\xd4\x40\x98\x69\x87\x7f\xc9\x41\xb2\x0f\xf0\xc3\x47\xdb\xf8\xb0\xc3\x47\x1d\xbd\xc3\xfb\x3b\x95\xe9\x32\x6b\x4b\xc4\x75\x9e\xf2\xb7\x82\x73\x70\xc2\xa7\x1a\xb2\x52\xd4\x90\xa3\x10\xe0\xcf\xc6\x59\x8a\x7d\x9d\x65\x26\x46\x12\x8a\x92\x8c\x9c\x8c\xd8\x65\xeb\xe0\x6f\xaf\x21\x65\x84\x75\xad\x38\x61\x04\x33\x07\xf6\x9a\xf3\xfe\xa4\x22\x25\x1e\x58\x28\xb1\x83\xce\xf3\x40\xe7\xb0\x66\xba\x79\x49\x11\xd2\xf2\x4f\x50\x8d\x64\xe5\x40\x8c\x87\x31\x75\x72\xf2\xcd\x4c\x5d\x09\x44\x50\xd0\x5e\x07\x5f\xf5\x44\xc3\xd9\xb3\x50\x37\x06\xf1\x90\x18\xc9\xe9\x4a\xe0\x73\xc8\x5a\xe7\xf7\x1e\x11\xfd\x32\x54\x90\x2d\x40\xb9\x47\x4f\x96\xf7\x98\xa9\xd9\xa9\x16\x9b\x04\x62\x3b\x4d\xa8\x4b\xb9\x8e\xd0\x21\x1d\xf8\x87\x39\xfe\xec\xd4\xda\x10\x32\xb0\x03\x8d\xcb\xb1\xb3\xa1\x85\x88\xfd\xca\x37\x94\xac\x44\x32\x40\x45\x66\x0e\xca\x59\xd2\x85\xa3\x6c\x1a\xba\x14\xde\xbe\x6d\x14\x7c\xcf\xb6\xaf\x83\xc5\x36\xdb\x60\x1b\xa0\x9e\x84\x46\x64\x82\x4d\xe1\xd6\xa9\x0a\x4b\xf8\x86\x3d\xc7\xd8\x66\x63\x6f\xa8\xb8\xa1\x14\x5f\x13\x69\x99\x4a\x04\x64\x84\x66\xfd\xd8\x23\x62\x84\x5e\xc1\xf9\xe0\x2b\x7c\x16\xb8\xc5\x07\x5e\x00\xcd\xb3\x60\x1a\x36\x02\xdb\x87\x8d\x6f\x1d\x1c\x5e\x9a\x8c\xe0\x9b\x54\x85\x98\xcd\x6e\xec\x08\xa8\x93\x99\xba\xa1\xf0\x4c\x8a\x21\x3e\x62\xc3\x11\x4f\x78\x61\x1d\xc9\xdf\x41\x7b\xc7\xdb\x50\x82\x25\x15\xa1\xf7\xd1\x17\xbb\x0a\xf8\x52\xda\xd2\x0f\x82\xee\x84\x5e\xbd\xa7\xf7\xb8\x22\x45\x8a\x16\xf4\x2f\xbb\x9a\x26\x3d\xce\x4d\x61\x9d\x90\xc3\x3d\x74\x91\x2a\x86\xc4\x92\xb0\x9d\x4a\x43\x1b\x8c\x63\x62\xac\x2b\xd2\x54\xd9\x02\x34\x06\x90\x92\xc7\x44\x3e\xd6\x21\x90\xf3\x17\xc8\xe7\x77\xb8\x8f\x8c\x1c\x60\xbb\x0e\x25\x82\xdf\x00\x9a\x47\x38\xc7\x21\x25\x4a\xd1\x46\xc2\x96\x80\x6b\xd8\x88\x8c\x40\x64\x12\x47\x71\xd7\x1d\x40\x76\xfa\x1c\x7c\xb2\xd5\xb6\x36\x52\xa9\xd3\x96\xf0\x97\x26\x40\x1a\x20\x33\x99\x11\xd9\xfa\xed\x4c\x71\x4d\x1c\x93\xf5\x48\x62\x47\x9f\xa0\x01\xc2\xa1\xa2\x18\xce\xb1\xee\xff\x67\x6a\xd9\x48\x06\xd2\xb2\x3b\x8e\xb4\x05\x63\x59\xd5\xc6\x06\xd8\xd2\x68\xeb\xe6\x9d\xa1\xf6\x88\x81\xe4\x3d\xac\x84\x48\x64\xda\x00\xd1\x09\x9f\xcf\x99\xd6\xfa\x30\xee\xa2\x98\x62\xa6\x77\x5a\xc2\xa1\xde\x24\x5f\x66\xa0\x39\xc5\xef\x96\x99\x3f\xb2\x18\xdd\x0e\x58\x3c\xd8\x9d\x49\x15\x0f\x85\x3c\x6b\x16\xb2\x31\x9f\x10\x40\x39\x59\xa3\xb0\x52\xa6\x53\xd0\xcb\x3e\xea\x74\x6c\x8d\x1b\xde\x73\x71\x3a\x98\x23\xd3\x6d\x34\x07\x02\x16\x29\x03\xbf\x64\x0a\x72\x51\xa6\x03\x70\x5a\x33\x1a\x21\xc4\x61\x88\xc3\x13\x5f\xe6\x23\x81\x7d\x3c\xcf\x6c\x6d\x39\xbb\xfa\x23\x38\x16\xa4\xb2\x48\xcd\xc7\x3e\x82\x7f\x37\x53\x1f\x70\x3a\xf2\x86\x01\xe1\x3d\x6a\x01\xe3\xb4\xcb\x84\xd3\x7e\xb4\x91\x93\xcf\x50\x2e\xf7\x0b\x47\x2c\xbd\x95\x9f\xd2\x91\x53\x1e\x61\x76\xcd\x8f\x02\xb8\x3c\xa0\x22\x49\xfc\x9e\x60\xae\xcb\xdf\x64\x7d\x30\x5e\x7f\x10\x65\xa8\xd4\x92\xfb\xd5\x63\x7a\x38\x14\xa5\x7c\x24\x69\x3f\xf4\x42\x92\x5b\x1c\x33\xa3\xcc\xe2\x52\x85\xa5\x38\x80\xed\x11\x05\x9d\xc5\x99\xfc\x4a\x1d\xde\x80\xbc\xac\xc2\x44\xfc\x05\x71\xe1\x4b\x28\x9a\x72\x65\xcc\xbf\xf0\x76\x66\xf0\x0d\x31\x19\x0d\xa5\x62\x86\xbc\x38\xd2\xe5\xc4\xae\x42\x1b\xba\xbb\x91\x12\xde\x49\x88\xde\xab\xd5\xfd\xa9\xfa\x61\x79\xbf\xba\x67\xd1\x3e\xac\x1e\x7e\xba\x7d\x7c\x50\x1f\x96\x77\x77\xcb\x9b\x87\x8f\x73\x95\x98\xb8\x63\x2e\xd8\xcd\x56\xc4\xee\xf9\x3c\x61\x1f\x24\x99\xf7\x04\x57\x5a\xe0\x01\xd7\x12\x22\x54\xf2\x74\x6a\x80\x6e\x6e\x6f\xce\x57\x37\xd7\x77\xab\x9b\x37\x57\xef\xae\x6e\x1e\xe6\xea\xdd\xd5\xdd\xe5\x4f\x38\x68\xf9\xc3\xea\xed\xea\xe1\x23\x6d\x7f\xbd\x7a\xb8\xb9\xba\xbf\x57\xd7\xb7\x77\x6a\xa9\xde\x2f\xef\x1e\x56\x97\x8f\x6f\x97\x77\xea\xfd\xe3\xdd\xfb\xdb\xfb\x2b\x14\xd1\x3f\x5d\x29\xbc\xbd\xba\xbb\x52\x77\xab\xfb\x9f\x15\xb4\x78\xb8\xe5\x5f\xff\xf1\xb8\xe4\x6d\x6e\xaf\xf9\xeb\xed\xdd\xea\xcd\xea\x66\xf9\x56\x7d\xb8\xbd\xfb\x19\x9a\xb2\x7a\xea\xe3\xed\xe3\x42\x20\xed\xc7\xd5\xfd\xe5\xdb\xe5\x0a\x42\xd0\x1b\x9d\xce\xe4\xc6\xd8\xd8\x86\x4a\x4b\xb2\x12\xd4\xa6\x14\x27\x12\xd4\xa1\xd9\x8f\x07\xe6\x92\x51\x4f\x7a\xe0\x86\x71\x78\x8a\x27\x12\x6d\x8e\xdc\x92\xf7\x19\x83\xe4\xfa\xcb\x0c\x7b\x77\x66\x14\x0e\xd2\x6b\x5b\x5a\x4a\xa1\x47\x7e\xc7\x21\xf9\x6d\x40\x4d\x8f\x30\x71\x99\x91\xa8\x6a\xbb\x47\xa5\x79\xc2\xf1\xb0\x3e\xca\x38\x78\x66\x63\x12\x9b\x43\x3a\x88\x7f\xd6\x7b\x4d\x39\xf3\x84\x52\x98\x22\x68\x36\x97\xd8\xd5\x19\x50\x75\xcc\x0e\xf3\xc4\x54\x93\xdc\x59\x13\xcb\x72\x89\x9c\x26\x1f\xc8\x04\x80\x4c\x0f\x5e\xb9\x05\xaa\x34\x14\x1f\xdd\xa7\x58\x03\x66\xa8\x09\xc4\xe1\x0c\x98\xf4\x59\x8a\xd9\x68\x7e\x6b\x93\x79\x73\x5d\xe9\xa7\x51\x41\xb7\xd1\x24\x90\xa1\x4c\xb5\x02\xc2\x91\x28\xca\xc4\xb6\x3c\x70\x83\x4a\x25\x21\x81\xea\xd1\xee\xe1\x0b\xc1\xda\x9d\x4d\x3a\x94\x5e\xca\xe3\x27\xef\xf3\xad\x2d\x21\x2a\x4f\x74\x62\xe3\xeb\x1a\x8b\xc8\x56\x55\xdd\x92\x60\x05\x3a\xac\x36\xf0\xe1\x95\x2e\x8b\xd6\x65\xb2\x5b\x32\x44\xd7\x89\x49\x89\x82\xb7\xe0\xe0\x6c\xa2\xa9\x1c\x46\x2d\x0c\x07\x64\x39\xf1\x7b\xd9\xf9\x3d\x39\x01\xc4\xc4\xa5\xf5\x4e\x08\xba\x7b\x48\x22\xe7\x20\x85\x0d\x97\xa6\xec\x0a\x1c\x61\xdd\x2f\x2d\xf7\x23\x64\x2d\x32\x5e\x31\xd4\xd9\x3e\x7c\x15\x47\xde\xef\xc0\x16\x74\xc6\x7d\x08\x55\xef\x99\x34\xe9\x7a\xdb\x97\x24\x51\x4a\x9f\x41\xc4\x05\x98\xab\x32\x0a\xc7\xd8\x98\xdb\x4c\x5a\xd0\xdc\x8b\x98\xd4\x24\xa4\x4d\x53\xa5\xcf\xca\x4e\xf4\x1b\x82\xe1\xc5\x58\x40\xe8\x78\xf1\xf3\xb0\x0f\x59\x75\xb4\x11\x95\xe9\x13\xcb\x00\xc4\x91\x45\x7f\x45\x39\x92\x51\x9e\xf5\xb4\xf4\x40\x78\xed\x92\xe8\xab\x82\xc1\xfe\x77\xce\x69\xc8\x9f\xfb\x9c\x3c\x1f\xb8\x9c\x8a\x58\x8e\xcc\xc4\xb5\xd0\xba\x28\x28\xd9\x06\x2e\x99\xe6\x2b\xa4\xf4\x6b\x2a\x87\x92\x89\x04\x5b\x35\x03\x0d\x49\x30\x66\x65\xff\x32\x17\x0d\xf5\xa5\x29\x11\xf7\x50\x63\x9a\x13\x67\x1c\x87\x12\x7d\x5d\xb3\xc1\x1d\x3c\x95\xd3\x48\xe3\x66\x6b\xf0\xcb\xc0\x96\x30\x12\x74\x9a\x8d\x67\x3d\x23\x92\xa3\x92\x43\x8a\x8f\x83\xea\xe4\x73\x33\x31\xce\x4c\xb4\x4f\x9f\x28\xf6\x53\x65\x9a\x8c\xbc\x47\xe0\xa3\x12\xfd\x22\xb1\xf9\xbc\x2f\xbc\x34\xa4\xaf\xea\x26\x8d\xfd\xa2\xdf\x47\xd1\x97\xe8\xfa\xcf\xda\xc0\x8e\xe9\xb8\xcb\x01\x29\x24\x1e\x17\xf7\x8b\x51\xc5\x82\x24\x11\xb2\x43\xf4\xc2\x2c\x25\x37\x3b\x7a\xcb\xa2\x74\x99\xdf\x52\x61\x40\xe1\x9c\x7a\x72\x2e\xfb\x25\x16\x09\xab\xc9\xac\x3b\x9e\x0e\x05\x83\xc0\x01\xc4\x60\x4d\xb2\x98\x54\x9f\x2f\xd9\x2c\x15\x2d\x47\x4d\x27\x0f\x72\x1a\x0f\x19\xfa\x12\x78\xc4\x90\x32\x62\xdf\x4e\x3d\x56\x21\x2f\x29\xec\xd8\x98\x69\x42\x91\x5b\x4e\x6e\x64\xd5\xc5\xab\xd9\x38\x8f\x18\x7b\xd2\xe4\x70\x99\x49\x66\x3d\x1c\xf6\x39\x4d\x7a\xc3\xd0\x48\xdc\xd3\xac\x21\xe3\xe6\x21\x19\x3b\xa5\x30\xcf\x3a\x98\x1e\xbf\x18\x29\x49\xeb\xf5\x6e\x4f\x87\x3e\x7d\xf3\xa4\xb2\x80\xae\x20\x00\xb4\x17\x74\x1e\x18\x50\x23\xa2\x81\xbf\xe7\x4c\xbe\x02\x42\x2d\x79\x86\xbf\xc3\x59\x4f\x48\xd1\xd8\x4c\xab\x46\x08\x95\xe8\xde\x90\xc1\xcc\x93\xcc\x42\x52\x21\xbb\x4f\x3a\x45\xc0\x63\x62\xe8\x54\xf5\x25\xfb\x34\x23\x1b\x72\x9d\xc6\x19\xb6\x0f\xf3\x42\xa8\x49\xee\xe1\xb0\x54\x3f\x76\x9b\x4b\x20\xd3\x00\xa4\x5a\xa7\x3d\x5f\x80\x31\x2e\x5d\x25\x24\xa3\x2f\x9a\xad\x16\xea\x02\xcf\xe6\xf4\x99\xfc\x7b\x31\x53\x7f\x1f\x01\xfa\x5c\xfd\xd3\xb8\x56\xa2\xe3\x0d\x8a\xfc\xe0\x48\x80\xb7\x7a\xbb\x50\x4b\x4a\x4a\x91\x8c\x66\x27\xad\xa5\x16\x0f\xed\x05\x9b\xc3\x4f\x1d\x93\x46\x29\xeb\xe0\x5b\xca\x18\xef\xca\x5d\x57\xdb\xc2\xe2\x21\xb5\xf6\x13\x2a\xa1\xc2\x85\xeb\xf9\x49\xe9\x81\x7c\x04\x65\x48\x19\x4a\x4b\x2c\x18\x69\x3c\x1a\x93\x71\x0c\x05\x70\x1d\x2c\xfa\x41\x1c\x0b\xd2\x70\xc8\xe2\xf9\xa8\x48\xe2\x39\x41\xca\x50\xf6\xdc\xe4\x60\x66\x1a\x0e\x0f\xda\x07\x9b\x16\xf0\x77\x73\xee\x8b\xf3\x44\x87\xe2\xad\x28\xd3\xdc\xc4\x96\xcd\xa8\x0d\x78\x74\x8c\x14\x37\xc9\x15\x97\x3c\xe2\x93\x05\x8e\xbe\x71\x9d\x15\xfb\x5b\x99\xd5\x04\x0b\xee\x69\xe0\x8c\x8d\xde\xa0\xf8\x88\x53\x14\x12\xc1\xd0\x6c\xb3\xed\x5f\xac\x74\x50\xda\x90\x91\xf8\x49\x04\x4c\x1d\xe6\x3a\x85\x55\x41\xf5\x4b\x97\xe9\x5d\x28\xf6\x63\x09\xf4\x45\xbf\x00\x4f\x3a\xf6\x09\x04\x6d\xc1\xc8\x14\x86\x5b\x18\xb4\x7b\x65\x33\xe2\x4b\xc6\xc4\xe1\x36\x68\x49\x55\xdf\xc5\x77\xfc\xf3\xe5\x42\xfd\xfb\x5f\xea\xe2\xd5\x85\x32\x0d\x7a\x96\xdf\x16\x7f\x0c\x2d\x5f\x82\xca\xd1\x48\x42\xc4\x8e\x6d\x78\xe6\xb6\x3c\x71\x41\xa7\xd4\x3e\x69\x22\xca\x5f\xf3\xac\xc2\x07\x67\x76\x51\x5d\x1b\xaa\xbf\x56\x4e\x68\x46\x76\xe4\x79\x1f\x1c\x94\x99\xcf\x50\x0b\x8f\x0c\x0d\xcf\xe1\xbb\x82\x6e\xc8\x00\x8a\xde\xc6\xcf\xbb\xa1\x3e\xcd\xe2\x25\x77\x43\x5f\xcf\xc1\xce\x14\x17\x4d\x29\x88\x06\xd2\xa7\x0c\x4b\x51\x17\x93\xa5\x65\x5c\x4c\xc6\xf8\x42\x05\x3b\xaa\x3e\x74\xa7\xdb\x57\xaa\x30\xa6\x83\x71\xda\x11\x7b\xb4\x7c\xbb\xc0\xb7\x60\xce\x25\x03\x32\x30\x70\x79\x77\x04\x23\xc9\x2a\x75\x6d\x34\x73\xc3\x68\xd1\x7f\xeb\x84\xaf\x67\xea\x1d\xfa\x1e\x53\x96\xda\x19\xdf\xc6\x3d\xea\xa0\x3b\x3c\x13\xd3\x64\xc2\x70\xcd\x5d\x1a\xa2\x90\x9e\xbc\xa1\x40\x96\x10\x89\x63\x3d\xc5\x6c\x45\xa5\x82\xdc\x58\xf8\x82\x2b\x3d\xee\x51\x7a\x94\xdd\x77\x23\x3e\x6e\x4c\xc9\x2e\xa0\x71\xaf\x4b\x8e\x27\x4b\xce\x45\xdf\x7d\x84\x5e\x93\x74\x34\x3e\xa1\x4b\x2a\x27\x55\xe7\xa8\x80\x86\x55\x91\xb0\x04\x3e\x69\xc0\x49\xb7\x32\xa3\x5d\x49\xf9\x6f\x66\xa8\xa2\x0a\xeb\x6c\x67\x9d\x53\xb0\xd5\x29\xb9\xe5\x61\x52\xe0\xc9\xcf\xcd\x86\x91\xd3\xef\x15\x78\x93\xee\xae\x85\x8f\x82\x74\x14\x5b\xca\x22\x4d\xcf\xe5\x62\x89\xaf\x2b\x72\xfb\x6c\xf3\x56\x6a\x6d\x9d\x9a\x44\x0e\xbf\x49\xa5\x91\x88\x96\x71\x72\x9e\x02\x07\x86\xdf\xd9\xee\x92\x26\xd5\x08\xe3\xac\x98\xef\x15\xa5\xd7\x24\xc4\xb0\x3f\x67\x72\xa7\x1e\x23\x98\xcc\xd9\xd2\xe1\x0c\xc0\xe9\x9e\x8f\xa2\x3c\x4e\x2f\xfd\xb8\x99\xb2\x49\x22\xa6\x73\xef\xba\x15\x22\xd1\x0e\xf5\x3e\x9f\x59\xb7\xa1\xf6\xd1\x0c\x89\x9a\xf7\x16\x86\x00\xe9\x9d\xee\xb2\xed\xcc\xce\x24\x37\xc9\x5a\xf3\xd4\xb3\x0a\xaf\x74\x5d\x2b\xcf\xd8\xba\x29\x9d\xfc\x98\xd8\xae\xd2\x4e\x27\xe2\xed\x72\x42\xb4\x19\x3c\xb2\xde\xf5\x2d\xf5\x5e\x47\x8d\x6f\x67\x16\xa7\xf3\xbd\x3f\xff\xef\x00\xec\x51\xd8\xa2\xe1\x46\x3a\xa3\x4d\xcf\xbe\x7d\xf5\x7f\x33\x3e\xc8\x87\x1e\xe5\x09\xd7\x51\xbb\xc9\xe8\x07\x9c\x4d\x66\x95\xbd\xb0\xd9\xda\x38\x28\xcb\xcd\xe5\x64\xdf\x91\x6c\x14\x76\xdf\xce\x64\x30\x4b\xba\x3d\x92\xaf\xba\xf2\xab\x53\xf3\xe0\xae\x9c\xfc\xbd\xd5\x80\x49\x2a\x4b\x86\xa9\x31\x4e\x07\x46\x67\x4d\x7f\x4d\x2b\x35\x62\x37\x69\x9b\xa2\x24\x7e\xe2\x22\x99\xc2\xa9\x67\x6b\x1e\x5b\x92\xb7\x68\x63\x1e\x48\x22\x9e\x68\xaa\x9d\xca\x94\x20\x69\x16\xd1\x54\x44\x4b\xa8\xc6\xd7\xb1\xa4\x4e\x4b\x6f\xc9\x35\x19\x74\x4a\x8d\x73\x9f\xcb\x03\x09\x9d\x5d\xce\xd4\xeb\x57\xaf\xbe\x3e\xc7\x3f\xdf\x50\xd1\x12\xb8\x12\xbc\x5a\xa8\x3b\x84\x09\xf0\x6b\x09\xdd\x52\xc0\xa7\x8b\x43\x70\xeb\xc9\xfb\xa1\xe5\x61\x68\x18\xae\xbf\x05\xa7\xf9\x5e\x90\x54\x99\xdc\xbe\x8d\x84\xe8\xd0\x79\x7c\x39\xdb\x37\xf8\x43\x41\x44\x7a\xaf\x47\x83\xd6\xee\xb5\x71\x4b\x78\xfc\x8a\x48\x18\xa2\x53\x93\xfd\xbd\x38\xf9\x4f\x00\x00\x00\xff\xff\x16\xb7\xbf\x92\xda\x22\x00\x00") - -func confLicenseAcademicFreeLicenseV21Bytes() ([]byte, error) { - return bindataRead( - _confLicenseAcademicFreeLicenseV21, - "conf/license/Academic Free License v2.1", - ) -} - -func confLicenseAcademicFreeLicenseV21() (*asset, error) { - bytes, err := confLicenseAcademicFreeLicenseV21Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Academic Free License v2.1", size: 8922, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseAcademicFreeLicenseV30 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x5a\xdb\x8e\x1c\xb7\xd1\xbe\xdf\xa7\x20\x16\xf8\xf1\xef\x00\xa3\x85\x24\x5b\x4e\x62\x07\x01\x36\x3a\x79\x62\x59\xeb\xec\xae\x22\xe8\x92\xd3\xcd\xd9\xa1\xdd\x43\x4e\xc8\xee\x1d\xcf\x9d\x5e\xc3\x80\xfd\x00\x79\x8d\x3c\x8a\x9e\x24\x5f\x55\x91\xdd\xec\x9e\x59\xc9\x4e\xe0\x1b\x69\xb6\x0f\x64\x1d\xbf\xfa\xaa\xd8\x17\x95\xae\xcd\xc6\x56\xea\x45\x30\x46\xbd\xb2\x95\x71\xd1\xa8\xb3\x0f\xef\x7f\xbe\x78\xf1\xea\xc3\xfb\x5f\x66\xea\xee\x5c\x7d\x76\xfe\xf0\xe4\x66\x6d\xa3\xba\xe7\xe9\x76\x6d\xd4\x69\xfa\xeb\x74\xa6\xf4\x76\xdb\x58\x13\x55\xeb\x95\x76\x7b\xe5\x83\xbd\xb5\x4e\x37\x6a\xe7\xc3\x0f\xca\xaf\x94\xee\xda\xb5\x0f\x71\x6d\xb7\xe9\xd5\xcb\xfc\xc4\x5b\x3c\x81\x05\x76\x6b\x8f\x65\xfd\xce\x99\x30\x5a\xdc\x07\xdc\x5c\xeb\xa8\xb6\x8d\xae\x4c\xad\xe8\xd6\xca\x37\x8d\xdf\x59\x77\xab\x1a\x7e\x86\x7e\x39\xdf\xe2\xb7\xd2\xf5\xf7\x78\xcc\xb5\x24\x08\x3d\x5a\xf9\xed\x1e\x3b\xad\xdb\xfc\xc0\xca\x07\xbe\x31\xda\xff\xcb\x93\x93\xa4\x4a\xad\x3a\x57\x1b\x79\xe4\xb8\xe6\x77\x26\x44\xeb\x1d\x1b\xe8\xe4\xd1\x4c\xbd\x0c\x1a\xdb\x41\xc5\xa7\xfd\x56\xe9\xd1\x73\x95\x55\x50\xb7\xf4\x50\x54\xef\x7c\xa7\x34\xd9\xa4\xa9\x77\xb6\x36\x73\x15\xfc\x5e\x37\xed\xfe\xc1\x0a\x3b\xcc\x21\xa2\x7b\x60\x7e\xac\x9a\x2e\xda\x3b\xfc\x19\xbb\xa5\xe8\xa7\x97\x8d\x49\xaa\xe2\x72\xd6\xa0\xee\x82\x6e\x49\x12\xec\x3d\x52\x75\x4e\xca\xd7\x7e\x6c\x2a\xa8\xa8\x67\x74\x23\x98\x6d\xf0\x75\x07\x53\x1c\x98\x41\x59\x47\xab\xc0\x8f\x73\x65\x2c\x6e\x07\xa5\x1b\xef\xe0\x16\xfc\x80\x07\x74\x60\x45\x35\x1e\x6a\x1a\x53\xb5\x90\x92\x1d\xfc\x95\x3a\x59\xf2\xda\x2d\xd4\x8c\x8d\x6e\x21\xa5\xae\xf5\x16\x92\x40\x3b\x13\xe6\x72\x03\x82\x6f\xe6\x6a\xe3\x6b\xbb\xda\xcf\x79\xcd\x80\xcb\xb7\x47\x04\x99\xd3\xa5\x60\x96\x7b\x55\x05\x03\x25\xe1\x5f\x38\xc5\xde\xe9\x7e\xcb\xa8\xce\x4e\x9f\x0d\x97\xe8\xa5\x88\x40\x59\x6a\x76\xe1\x16\x56\x39\x58\x14\x52\x56\x2c\x65\x6d\x63\x1b\xec\xb2\x6b\x59\xb1\xca\x6f\x36\x9d\xb3\x15\xa4\x4e\xca\x67\x83\x8e\x6d\xa3\x5d\xad\xa6\x3b\xe6\x28\xdb\xb2\xa7\xe6\x29\x76\x28\x01\x92\xb7\x68\xa9\xbd\xef\xb0\xcb\xda\x5b\x36\xb9\x6e\xe1\x1a\xec\x81\x70\xc4\x76\x0e\x86\xa9\x6d\xd5\xf2\x2a\xb0\xd4\x26\xf2\x3e\xb8\x51\x5b\xf2\x2d\x1c\x61\x1d\x02\xa2\x26\x13\xe4\x68\xfa\xf0\xfe\xa7\x08\x37\x46\x13\xee\xa0\x2c\xbb\x5c\x5e\x0b\x66\x63\x6a\xf6\x9e\x25\xfd\xef\x4b\x5e\x18\xa2\x66\x43\x6c\x4d\x20\x9f\x1c\x51\x56\x14\x6a\xf6\x5f\xf1\xba\x27\x26\xdb\x0d\x49\xb8\xff\xc8\xe3\xe7\x27\x27\x8f\x8b\x8c\xf8\x0e\x36\x75\xbf\x77\x3a\x88\xcd\xb7\xb2\x55\xd5\x68\x0b\x1b\x12\x8c\xd4\xe2\x5c\x58\x98\x82\xb5\x56\x4b\x11\xbc\x97\x81\x5d\xa1\x83\x51\x66\xb3\x44\x48\xe2\x09\x7b\x24\x68\x28\xee\x57\x5d\x70\x36\xae\x0f\xd7\xb8\x3f\x17\x45\x9c\xc8\x99\xb8\xd1\x3f\x90\x98\x24\x6b\x34\x4d\x83\xc8\x5f\xad\x20\x31\xbd\x1a\x75\x83\xab\x6b\x8d\x78\xda\x68\x32\x00\x59\xdb\x6e\xb6\x3e\xb4\xbf\x32\x02\x61\xf1\xcf\x0a\x8b\x5f\x23\xd6\x10\x66\x4f\x7d\x6d\x06\xb3\xdf\xa4\xd8\x52\xa7\xc5\xed\x53\xb5\x31\xc8\x49\x91\x36\x18\x48\x14\xa0\x20\x87\xc3\xd1\xf0\x27\x71\xa1\x09\xc5\x21\x67\x30\x25\x0c\x05\x28\x69\x68\x5b\x96\x4d\x37\x8d\xd2\x77\xda\x36\xec\xa0\xda\x57\xdd\x06\x46\x10\xbb\xd4\x26\x56\xc8\x39\x7a\x7d\xed\x77\x6c\x16\xc6\x81\xc3\x9d\x8a\x30\xd1\xb7\x88\x03\xde\x01\x90\x75\x87\x08\x41\xb4\x6c\x74\xb5\xb6\xce\x3c\x00\x2e\xd4\xbc\x0f\xc1\x5e\x16\xb9\x54\xff\x78\x12\x03\xce\x6e\xd5\x0e\xd8\xa6\x0c\x16\x1a\xbd\x3c\x7e\x92\xc3\xa3\x97\x64\x80\x8c\x58\xc8\x97\x72\x50\x8c\x28\xd0\x0f\x59\x23\x34\x8e\xac\x19\x12\xd0\x23\x66\x6f\xc5\x04\x08\x1e\xaa\x61\x64\x82\xdf\xa0\x06\x82\x52\x3b\xfc\x4b\x9e\x91\x75\x00\xe0\x3e\xda\xd6\x87\x3d\x7e\xea\xe8\x1d\xde\x07\x50\xea\xa6\xea\x08\x7a\xeb\x94\xd9\x1b\x78\x05\x3b\xfc\xb8\xa5\x02\x89\x70\x49\xb8\x72\x67\x9c\xa5\x4c\xd1\x55\x65\x62\x24\xa1\x28\x0b\x57\x82\xf0\x6c\x1d\xfc\xdf\x6b\x48\xf9\x63\x5d\x27\x4e\x28\x70\xf3\xd0\x6b\x27\x27\x9f\xcf\xd4\x73\xc9\x56\x0a\x8b\x17\xc1\x6f\xfa\x9a\xc9\xf1\x79\xae\x5e\xa7\xa2\x42\x6f\x3b\xbd\x11\xa4\x1d\x92\xc9\xf9\xc9\x2d\x02\x52\xce\x60\xda\x14\xec\x21\xc3\xed\xa4\x56\xd0\x7b\x4c\x3a\xd8\x7a\x36\x50\xb5\x01\xea\x69\x02\x68\x4a\x32\xf8\x88\xb0\x97\x2f\xa0\xfe\x00\xc1\x96\x86\xf2\x91\x2d\x65\x5c\x8d\x95\xb9\x12\x20\xc8\x36\xbe\xa5\x74\xa0\xfa\x08\x7c\xe2\x9a\x43\x59\x41\xba\xb0\x3b\xc7\x31\x42\x71\xe4\xbb\x56\xc1\xc8\x81\x8c\xb9\x0d\x96\x96\x21\xdb\xc7\x58\xa0\x41\x56\xf1\x9c\x0c\x64\xb6\x2d\x99\x38\xbd\x03\xcf\xc5\x96\xbd\x46\x05\xcf\x3a\xd2\x06\x3b\xc1\x0d\x19\xc2\xb3\x0d\x13\x66\x96\xc5\x05\xe2\x8f\x6a\xc2\xa0\xf7\x7c\x60\x03\xf8\x3d\xa0\x11\x3d\x00\x83\xa0\xaa\xb6\x6c\x1b\x36\x1b\xfb\xc4\xba\xd6\x70\x51\xef\xa0\x1d\x2c\x00\x2d\xda\x3d\x5c\xe6\x33\xb4\xe6\x4d\x21\x12\x8b\x22\xe6\xfb\x2d\xe0\x86\x6b\x09\xdb\x04\x72\x09\x1d\x7a\x3f\x4f\x00\x3c\xc5\x89\x16\x48\x6e\x32\x39\x4b\xb7\x6b\xb3\xb2\x4e\x10\xfb\x9a\x78\x08\x4c\xfd\x98\x65\x3d\x2e\x24\x17\xd7\x22\x26\x86\xa0\x53\x06\xf9\xa0\xec\x0a\xc5\x05\x68\x20\xb7\xa9\x26\x48\xd1\xbd\xa7\x26\xd0\x4e\xc7\x7d\x14\xd7\x84\x81\x4b\xc3\xd6\x0c\x70\x70\x4e\xc7\xe0\xd7\x00\xbf\x02\x50\x38\xa4\x06\xf6\x9a\x48\x27\x13\x00\xc0\x22\x4c\x48\xc6\x18\xe2\x2e\x6f\x40\x96\xfa\x18\x4e\xb1\xdd\x76\x36\x12\x49\xea\x9a\x5a\xac\xaf\x07\x6c\x4a\xf6\x41\xb6\x3e\xa1\x6c\xc5\x86\xb4\xd0\x33\xb3\x6d\xfc\x9e\xdc\x51\x16\x8b\x23\xb7\xcb\xa2\xc1\x3e\xef\x21\x01\x2e\x98\x8f\xd9\x54\x11\xff\x63\x89\xf1\xd4\x01\x8f\x62\x94\xdb\xab\x1d\x72\x93\x3d\xc1\x5a\xfd\xba\x57\xcb\x7c\x06\x9a\x61\x19\x66\xac\x43\x00\x01\xdf\xe6\x68\x2f\x4c\xba\xe2\x63\x66\x90\xe4\xe8\x01\xd3\xea\x09\x19\x4c\x91\x43\x8f\x23\x17\x22\x61\x1a\x97\x40\xaa\x42\x7d\x91\xd3\x94\x90\xd2\xfc\x24\x95\xc9\xf3\xae\x96\x52\x4a\x42\x29\x7f\x47\x94\x50\x39\xd3\xee\x38\x76\x2e\xf8\x95\x0c\x19\x3d\xd3\xeb\xa9\x44\xca\x73\x98\x2e\x07\x33\x21\x03\x07\xc8\x9c\xb1\x7a\xd3\x45\xd8\x86\x78\x31\xdb\xec\x88\x9b\x32\xaa\xdf\x67\x7e\x3d\xb5\x22\xeb\x31\x72\x66\x8a\xc8\x98\xb2\xeb\xd1\x59\x35\x43\xd0\x7c\x31\x53\x17\xed\xf0\xcc\x15\xe3\xcb\xf9\x20\x15\x02\x5e\x13\x86\xa5\xac\x99\x94\x63\x92\xf6\x90\x41\x93\xa7\x69\x01\x66\xfa\x44\x81\x90\x41\x45\x2b\x23\xb8\xc0\xb1\xd5\xa7\x70\xea\xe5\x62\x4e\x90\x4f\x17\xfe\x39\x69\xb8\x33\x44\x50\x04\x42\xf3\x0a\xbd\x99\xb9\x2c\x13\x89\xc1\x4d\x21\x2b\x5b\x96\xb2\x35\x3f\xa2\x8e\xd6\x90\x01\x9c\x47\xfa\x4f\xc2\xe9\xe4\xf9\xd3\xd2\x1c\xaf\x79\xcd\xf3\xd3\xc1\x1e\x95\xa6\x08\x98\x0a\xb8\x4a\xc0\xfb\x29\x5b\x50\x00\x56\xe8\x91\x10\xd4\x5c\x9b\x00\x79\xf0\xed\xe1\x8e\xf7\xd3\x00\xa1\x0d\xb8\x5f\xd9\xad\x65\xb4\xed\xb7\x10\x5c\x66\x26\x97\xba\xea\x69\x3d\xff\xc3\x4c\xbd\xe5\x0e\xad\xe5\xd2\xfa\x1d\x28\x98\x71\xda\x55\x42\x25\x9e\xd9\xc8\x60\x8c\x20\xc1\xcd\xfc\x60\x41\x8e\x76\x72\x29\x0e\xb9\x3c\xf4\xe2\x9c\xee\xf5\xd1\x72\x2e\x37\x7a\x0a\x9d\xdb\x9b\x8c\xe6\xc9\xfa\x08\xf0\x81\x25\x06\x93\x08\xff\x94\xe2\xa7\x9b\x7d\xe3\x20\x46\x21\xed\x87\x26\x5f\x30\x97\x63\xa6\xc0\x59\x66\x88\x2c\xc5\x41\x31\x2f\x08\xc9\x59\x9c\xc9\x55\x02\x89\xa1\xe0\xb2\x0a\x23\xf1\x3f\x5a\xf8\x53\xb2\xd8\x0d\x35\x6f\xb8\x82\x3b\x78\xa2\x32\xdc\xf3\x45\x43\x78\x52\x99\xf9\xb1\x6e\x3d\x66\x5e\x3c\x4c\x2d\x0a\x1d\xbc\x93\x08\xbd\x56\x8b\xeb\x53\xf5\xd7\x8b\xeb\xc5\x35\x4b\xf6\x76\x71\xf3\xf5\xe5\x9b\x1b\xf5\xf6\xe2\xea\xea\xe2\xf5\xcd\xbb\xbe\xd7\xcf\x98\x24\x75\xba\x41\x5c\x14\xdd\xe7\xbc\x67\x3b\x8d\x05\xb5\xd4\x82\xf8\x24\x54\x72\x74\x6a\x9c\xa9\x69\x43\xd8\x05\xbc\x62\x36\x9c\xb9\x08\x91\x0a\x38\xdc\xea\xa5\x6d\x2c\xc5\x12\xaa\x9f\x6d\x1d\xed\xc4\x99\xc0\x73\x05\x4b\x51\x0b\xee\xd4\x05\x90\x5b\xea\x59\xbe\x7e\xae\x9e\xbf\xbe\x59\x5c\x3d\x57\x57\x8b\xeb\x6f\x14\xb4\xb8\xb9\xe4\xab\x7f\x7f\x73\xf1\x6a\x71\xf3\x4e\x5d\xbe\xe0\x3f\x2f\xaf\x16\x2f\x17\xaf\x2f\x5e\xa9\xb7\x97\x57\xdf\x40\x53\x56\x4f\xbd\xbb\x7c\x43\xa5\x0c\xd6\x78\xb6\xb8\x7e\xfa\xea\x62\xf1\xed\xf3\x2b\x7a\x23\xeb\x4c\x5e\x8c\xad\x6d\x89\xd0\x33\x1c\x47\x32\xb4\x25\xea\x93\x86\x1c\xa5\x29\x47\xd4\xe2\x68\xd0\x16\x7c\x63\xb9\x1f\xbb\xc1\x88\xe7\x0b\x07\xd5\x7d\xea\x20\xcb\xfe\x38\xc3\x93\xd9\xa0\x42\x4d\x92\xa1\xce\xd5\x1b\x7e\xc7\x01\x05\x6c\x40\x33\x85\x78\x71\x95\x91\xf0\xea\xf2\xad\xc6\xdc\x42\x08\x48\x84\x7e\x60\x28\x73\x14\x53\x44\xb4\xce\x86\xe9\x81\x33\xb7\x68\x45\x28\x96\x66\xf3\x34\x79\xa8\x04\x57\x7b\xd2\x30\x4f\x04\x66\x94\x44\x4b\xa2\x5f\x5c\xec\x64\xb6\x47\xd5\x35\x23\x98\x45\xf1\x42\xa8\x62\x99\xb8\x05\xc6\xe8\x86\x03\x86\xd1\x92\x7e\x4b\x03\x11\xcd\x3f\xbb\x64\xdc\x5a\x6f\xf4\x6d\xc1\xed\xd7\x9a\x84\xa0\xfa\x18\xac\x20\x30\xd5\x21\x04\x61\xd7\x1c\x38\x41\xa5\xfa\xd8\xc5\x7b\x7a\xbb\x4f\x84\x6a\xde\x9b\x64\x6f\x7c\x64\x21\x6e\xbd\xaf\x77\x96\x68\x2b\xcf\x29\x63\xeb\xb7\x5b\x3c\x44\xf6\xd9\x6c\x3b\x12\x6c\x85\x4a\xdf\x05\x23\xa5\xbf\x59\x75\xae\xea\xa9\x0e\x69\x90\xdb\x5e\xa1\x1b\xc4\x1e\x10\xec\x23\x4d\x65\x33\x6a\x1b\x39\x1c\x9b\x91\xaf\x9b\xec\xeb\x64\x78\x1a\x0a\x11\x99\xd8\xe7\x28\x43\xf1\xe1\x66\x4d\x08\x06\xcf\x3d\xf4\xae\xa7\x93\x51\xc8\xd2\xb0\x26\xe2\xe9\x4f\x28\xd1\x15\x45\x5c\x8f\xd4\x37\x04\x61\x4e\xee\xab\xc5\x0a\xa5\x50\x88\x43\x8b\x08\x14\x46\x31\x40\x92\xe6\x3c\xc8\xdc\x67\x30\xfe\x3c\x8d\x4b\xf8\x36\xbb\x9d\x28\x52\x4c\xb3\xad\xc6\xe8\x20\xa3\x8b\x10\xcc\x9d\x17\x41\xf5\x20\xc5\xd4\x93\xbd\xd5\x56\x8a\x94\x38\x36\xf7\x22\x49\x59\xb6\xff\x6e\x58\x77\x8c\xe4\x14\xec\x89\xba\x16\x0e\xb4\x54\x37\x61\xe8\xd5\x8a\xf2\x65\xa8\x0b\xe3\x94\x83\x39\xfc\x92\xb8\x4d\xf2\x8a\x00\x65\x32\x07\x24\x28\x2b\xac\xbf\xbf\xae\xa4\x20\xc8\x76\x18\xd4\x15\x43\xa6\xf2\x81\x15\x58\x8e\x96\xa4\xa4\xb5\x34\x8d\x5a\x2d\x23\x6c\x03\x73\x8c\x1b\x9f\x47\xe5\x88\x70\x58\x86\xc9\x83\xd0\x88\x03\x9e\xf1\xb1\x29\xa9\xcc\xa0\x6a\xcf\xc5\xc7\xf7\x99\xb4\xf6\xe8\xb2\xe9\x1a\x5e\x88\xc7\x47\x95\xa9\x1e\x71\x64\x0a\x0e\x0e\x05\x9f\xa2\x96\x03\xc4\x31\x59\xa5\xe7\x09\xb5\x48\xbe\xfd\xfd\xed\x94\x8d\x03\x9d\x26\xf0\x41\x5f\x54\xb5\xc5\xaa\x02\xad\xbc\x37\x2d\x3e\xe4\x41\x2c\x81\xef\xc3\xfb\x9f\x91\xc5\x4c\xc6\x3f\xbc\xff\x85\x42\x23\x5f\xa9\x8d\x6e\xf0\x04\x1d\x79\x4c\x3c\x93\x70\x30\x65\xce\xb8\x38\xd3\x56\x1c\x49\x7a\xcf\x00\xec\x51\xe9\xa8\x78\x52\xe6\xa7\x16\x2d\xc5\xe4\x84\xbb\x24\xee\x31\x2d\x10\xec\x07\x76\x5c\x06\x1b\x3c\xc8\xf6\xce\x7c\xa3\x37\x70\xe1\x75\x21\xe4\x8f\x1e\xce\xca\xfc\x66\x70\x4b\x53\xd7\x8b\x4a\x32\xfe\xa3\x7a\x69\xd0\x18\x1a\x2b\x81\x36\xfe\x0e\x9a\xe9\x3e\x3b\x6b\xda\x8c\x99\x2d\x41\xa4\x20\x13\x87\xb5\x77\x65\xf8\x6a\x84\x2c\xd0\xf2\x01\x97\x47\xc9\xf7\x8e\x22\x86\xff\x46\x64\xde\x22\x03\x63\x3b\x26\x78\xc3\x3c\xc4\x10\xa8\x98\x5b\x89\xd2\xa3\xfd\x63\x26\x26\x91\x59\x47\x9b\x1a\x5e\x1b\x7b\x8b\x90\x0d\x99\x53\x31\xe3\x9b\x82\xb2\x94\xbd\x24\xf7\xb0\x59\xa2\x7a\x25\xeb\x91\xe8\xdf\x2c\xd3\x9a\xf7\xa0\x14\xb3\x4c\x29\x1d\xd1\xaf\xda\x9d\x96\x42\x83\xaa\x58\xd3\x6f\xf2\xef\xa3\x99\xfa\x5b\x87\xe2\x48\x87\x04\x6c\xac\x7f\x18\xd7\x09\x82\xbe\xa4\xce\xd2\xf1\xc1\x80\xde\xa1\xaf\xa4\x72\x24\x92\xd1\xf0\xa5\xb3\xd4\x8e\x35\x72\x78\x32\x41\xf3\xdc\x33\x2f\x83\xef\x28\x8f\xbc\x6b\xf6\x99\x86\xc2\xe2\x21\x4d\x65\xd4\xf7\xc5\xce\x44\x2d\x98\x7a\x8f\xc8\x01\x60\x10\xd5\x5e\x28\x23\x3d\x62\x51\x8e\xca\xe1\xa1\xcc\xd1\x08\xe4\xb7\xc1\xa2\x75\xc3\xb6\x1d\x0a\x3d\xc0\x73\x5e\xd0\x18\x1e\xf1\xe8\x5d\xb2\x12\x3c\x37\xda\x98\x8f\x00\x38\x3c\x68\x1d\x2c\xba\x82\xbf\xdb\x07\x7e\xf5\x20\xd5\x42\xf1\x56\x94\xd9\x45\xd9\x8b\x27\xa3\xbf\x71\x0c\x48\xaf\x93\x2b\x9e\xf2\x10\x54\x1e\x70\xf4\x17\x33\xa1\xd8\x37\xe0\x8b\x11\x46\x5d\xeb\x86\x0b\xd8\x4b\x50\x05\x86\xb8\xa1\x58\x8a\x60\xa6\x16\xdb\xdf\xcb\x4b\x00\x9f\x64\x24\xbe\x13\x01\x5e\x87\xf5\x90\xc2\x6a\x45\x6c\x23\x57\xc3\x1c\x8a\xfd\x3c\x09\x2d\xcc\xf7\x84\x7d\xa9\xb8\x04\x50\x2a\x1b\x8c\x0c\xd0\xb8\xdb\x40\x67\xd6\x64\x0a\x3e\x00\xa4\xef\x0f\x46\xc8\x54\xc9\x79\xb0\x50\xf0\x70\x07\xa5\x64\x69\xe8\x94\x0a\xb9\xe5\x97\xbd\x63\x17\xee\xb8\x0d\x4e\x25\x2d\x4b\x36\x2d\x6c\x08\xd5\xc7\x3c\x1c\xf0\xc1\x99\x7d\xfc\xf0\xfe\x27\xf5\xc2\x10\xeb\x59\xc8\x64\x27\x45\x26\x0f\x5c\x61\xe8\xca\x7c\xa4\xf9\xe2\x99\xad\xe1\xa3\x86\x4c\xa3\x86\x48\xa6\x28\x6c\xfd\x3c\x9f\x5b\xd0\x24\x46\x72\x30\xf4\x2c\x0a\xf6\x22\xff\xb6\x8d\x20\x13\x6a\x33\xcf\x60\x24\x7a\x62\xb2\x98\x0c\xc6\x4d\xfc\x64\x8b\x53\x90\x04\x9d\xd5\xfb\x7f\xb5\x32\x26\xd7\x3f\x5a\x11\x6b\x74\x7c\x80\xc2\x27\xa8\xce\x25\x1b\x72\x82\x33\x47\x3b\x82\x75\x64\x95\xed\x16\x25\x88\x0c\x50\x3c\xf4\xbf\xfa\xe1\xb3\x99\xfa\x16\x1d\x86\x69\x1a\xed\x8c\xef\x84\x4a\xf1\x88\xb5\x07\xb6\xa9\xc5\xf1\x73\x6d\x1a\xb6\x16\x8d\xd2\x5c\xf2\x11\x29\x3d\x17\xd1\xa6\xa0\xb8\xa4\x20\xa4\xe1\x02\xcd\xcd\xdc\x01\x61\x85\x01\x90\x23\x94\xef\x69\x46\x4c\x67\x44\xc5\xaa\x24\xe7\xe7\x33\x30\x93\x95\x75\x36\x2b\x72\x8a\x02\x71\x4a\x16\xbc\x19\x51\x26\xb9\xdc\xae\x19\xac\xc8\x3b\x63\x62\x5a\xb4\x3c\x1d\xcc\x19\x84\x72\xef\x88\x8e\x6b\xba\x2f\x13\x4b\x3e\x43\xa9\xc1\xa2\x6a\x9a\x6f\x33\x3d\x94\xce\x89\x23\x65\x9f\x8b\x1c\x39\x26\xd5\xb6\x34\x71\x13\x1f\xa3\x1d\xde\xdb\x7c\x72\x94\xa8\x6b\x19\xc0\xf3\x09\xcd\x7b\x41\x42\x0c\xeb\xf3\x99\x6c\x56\x8f\x41\x43\xa6\x50\x69\x73\xc6\xbc\x74\x54\x49\x01\x19\xc7\xe7\x96\x32\x39\x4f\x12\x71\x05\xf5\x2e\x3f\x21\x12\x81\x3d\xc8\x9e\xa9\x7f\x1e\x72\xaa\xee\x2d\x0c\x01\xd2\x3b\x79\x8a\x7b\x66\x67\x92\x46\x64\x2d\x9a\xe5\x52\x2b\x27\x50\x9e\xdb\x3a\x9e\x40\xe5\x19\x96\x5c\x4c\x05\x66\xa3\x9d\x4e\xb5\x2e\x87\xaf\x68\x33\x78\x64\xb9\xef\xfb\xcc\x49\x9b\x89\xbf\xce\x2c\x76\xe7\xcf\x3d\xf8\xa3\x10\xac\xb1\xb2\x2b\xd8\x02\x1e\xe4\xef\x37\xce\x9e\x3c\xfc\xbf\x19\x6f\xe4\x43\x0f\xac\x04\xa5\x60\xe4\x32\x19\x41\x99\x24\xb3\xca\x5a\x58\x6c\x69\x1c\x94\xe5\xee\x6b\xb4\x6e\x21\x1b\x85\xdd\x93\x99\xcc\x2d\x49\xb7\x37\xe4\xab\xcc\x78\xb2\x9a\x07\x9f\x44\x90\xbf\x77\x7a\x2f\x67\xf6\xc3\x84\x1d\xbb\xa3\x33\xa9\xfa\xc9\x71\xa2\x69\x47\x46\x00\x9e\x6d\x01\x08\x96\x70\xea\x0b\x24\x0f\xf5\x62\xfa\x18\x80\xc7\x75\x88\x27\x9a\xfd\x27\x66\x10\x24\xcd\x22\x08\x62\xb4\x04\x40\x7c\xac\x42\xea\x74\xf4\x96\x4c\x79\x49\xa7\x2f\x90\xf2\xc5\xa1\x2c\x69\x7d\x73\x7f\xdb\x61\x63\xf1\xad\xca\xbf\xff\xa5\x1e\x3f\x7c\xf8\x84\x38\x44\x60\x62\x76\x85\xf8\x01\x06\x7d\x37\x0c\xbe\xc6\x87\x29\x54\x5d\x8a\xc1\xbf\x99\x4f\xfb\xb2\x83\x41\x1a\xe5\x6c\x79\x66\x7c\x3f\xe1\x97\x63\x4b\xf9\x30\xa0\x3c\x22\x1e\x73\x4a\xf9\xd6\xe8\x9e\xf1\x21\x15\x71\x7f\x78\x4c\xae\xbe\x46\x90\xdf\xf5\x23\x74\xb8\xbb\x38\x7f\xe6\x19\xef\xb1\x26\x75\xaa\xeb\x54\x55\x66\xed\xfd\x10\x35\x7f\x19\x24\x9f\x2f\x7d\x9b\x2f\x17\x1f\x49\x51\xdf\xcb\x4c\xd2\xb2\xbf\x85\xfa\x8d\xbe\x95\x8a\x93\x8f\xa5\x26\x85\x7f\xf8\xf2\x69\x68\x0b\xbe\xe4\x44\x1e\x78\xfb\xd0\x9f\x97\xc7\x2a\x8c\x31\x2c\xef\x54\x30\xf2\x2f\x4b\x7c\xf4\x63\x91\x53\xd2\xf9\xf4\xe2\xc5\xab\x53\x16\x7f\x5f\x6c\x23\x09\x43\xb3\x4f\x39\xb1\x4d\xfc\x82\xfe\xe8\xbf\x7b\x99\x6e\xf6\x95\x24\x7e\x71\x62\xc0\xdf\x75\xc9\x8b\x32\xcd\xe6\x51\xd2\xaa\xf8\x20\x63\x65\x03\x9e\x44\x85\xd7\x08\xc3\x2d\xf0\x77\xe9\xef\x8a\x11\x6d\x7a\xed\x74\xf2\x05\xd7\x9f\xd1\x2a\xa0\x87\x16\x31\xf2\xf0\x8e\x65\x23\x0a\xf1\x17\xd6\x4b\xe0\x3c\xaf\x90\x65\x06\x7a\x88\xb9\x6c\xff\x99\xce\x8a\x58\xeb\x2d\xcd\x6c\xc1\x0c\x68\x50\x99\xfc\x91\xde\x9c\xc4\xb1\x7c\x35\x23\xa8\x54\xfa\x45\xda\x9a\xc1\x13\x13\xcf\x33\xfd\x07\x2b\x41\x33\xc0\x87\x05\x7d\x4f\xd0\xb9\x86\xc6\x0d\xc7\xbd\x47\xdf\xc6\x2d\x8d\x71\xc2\xeb\xee\x04\x7e\x2e\x69\x99\x74\xe6\xb0\x20\xfc\x97\x5c\x38\xbb\xbc\x5e\xcc\xfa\x36\x4f\xca\x9a\x18\x81\xb2\x2e\x1b\x09\xac\xca\x1a\xe9\xd7\x2b\x58\x70\x80\x15\xac\x4f\x65\xfd\xfc\xe4\x3f\x01\x00\x00\xff\xff\x17\x53\xc0\xe2\x42\x28\x00\x00") - -func confLicenseAcademicFreeLicenseV30Bytes() ([]byte, error) { - return bindataRead( - _confLicenseAcademicFreeLicenseV30, - "conf/license/Academic Free License v3.0", - ) -} - -func confLicenseAcademicFreeLicenseV30() (*asset, error) { - bytes, err := confLicenseAcademicFreeLicenseV30Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Academic Free License v3.0", size: 10306, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseAfferoGeneralPublicLicenseV10 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x7b\xcd\x76\xdb\x46\xb2\xff\x5e\x4f\xd1\xc7\x9b\x48\xe7\x30\x8c\xed\x99\xfc\x67\x12\xaf\x28\x09\xb2\x79\x46\x22\x15\x92\xb2\xc7\xcb\x26\xd0\x24\x11\x83\x00\xff\x68\x40\x32\x77\xf3\x38\x73\x5f\xe3\x3e\xca\x3c\xc9\xfd\x55\x55\x77\xa3\xc1\x0f\x25\x77\x75\xcf\x49\x6c\x4b\x68\x54\xd7\x77\xfd\xaa\xba\x31\xba\xbb\x4b\x66\x53\xf5\x31\x99\x24\xb3\xd1\xbd\x7a\x7c\xba\xbe\x1f\xdf\x28\xfc\x9f\x4c\xe6\x89\xba\xf8\x6c\x6a\x9b\x57\xa5\x7a\x37\x50\x0f\xba\x4e\x37\xea\xfd\xdb\xb7\xef\xff\xf3\xaf\x7f\xe3\xbf\x9b\x6a\xb7\xaf\xf3\xf5\xa6\x51\xff\xfd\x5f\xfc\x6b\x35\x5a\xad\x4c\x5d\xa9\x71\x99\x0e\xf1\xfc\xe7\x77\x6f\xd5\x62\x93\xd7\x99\x9a\x37\xb5\x31\x8d\xfa\x51\xcd\xdb\xbc\x31\xea\xfd\xfb\x9f\x07\x6a\xae\x4b\x75\x57\xeb\x32\xcd\x6d\x5a\x0d\xd4\xcd\x48\xfd\xf2\xd7\x77\x6f\xff\x36\x50\x4f\xf3\xd1\x05\x5e\xb3\xaa\xc8\x53\x53\x5a\xa3\xf0\x4f\xad\xb6\x55\x96\xaf\x72\x93\xa9\x67\xc7\x50\xb5\x52\xcd\xc6\xa8\x8f\x93\x27\xf5\xd1\x94\xa6\xd6\x85\x7a\x6c\x97\x78\x47\xdd\xbb\xf7\xd2\xc0\xdf\xe5\xcd\x95\x7a\xf7\xcb\xdf\x7f\x19\xe0\xcf\x5f\xde\x61\x5b\x63\xd4\xbc\x5a\x35\x2f\xba\x36\xea\xae\x6a\xcb\x4c\x37\xa0\x39\x60\xce\xd5\x56\x67\x46\xbd\xe4\xcd\x86\x36\xc8\x6b\xb5\x33\xf5\x36\xb7\xb4\xe9\x50\xcd\x4d\x4a\x2b\xd5\xfb\xcb\xec\x4a\x6d\xb4\x55\x4b\x63\x4a\xa5\xb3\x0c\x9c\x35\x15\xb6\x04\x7b\xaa\xc5\xe6\x60\xcf\xfa\x1d\xf8\x97\x1a\x0f\xb7\xbb\xb6\xc1\x3f\x4b\xd3\xbc\x54\xf5\xb7\xe1\xc5\x45\x82\x27\xfb\xaa\x64\x19\x79\x9b\xa6\xf1\x84\x76\x7b\xa5\xcb\x4c\x65\xb9\x6d\xea\x7c\x89\xf7\x48\xf2\x25\xf8\xdc\xd2\xc3\xdc\x58\xd1\x40\xa4\xa7\xac\x4a\xdb\xad\x29\x9b\x81\xc2\x72\x95\x6e\x74\xb9\xce\xcb\xb5\xca\x1b\xa2\x5e\x56\x8d\xd2\x45\x51\xbd\x98\x0c\xfb\x3e\xd6\x46\x6f\x97\x85\xb9\x80\xa6\x8d\x27\x60\xd5\xaa\xaa\xa1\x68\xdb\x74\xac\xd3\xff\x99\xb1\xf9\xba\x14\xbe\x1a\xfd\x0d\xbf\x7c\xd1\x7b\xb5\xaf\xda\x5a\xad\xa0\xc9\xac\xda\xd2\x13\xbb\xe1\xf5\x60\x99\x77\x86\x48\xcd\x50\x5d\xef\xc1\x6c\xd9\xd4\xda\x82\x2b\x32\x97\xf3\x90\x33\x16\x03\x9f\x79\xd9\x98\xd2\x69\x73\xdd\x6a\x38\x48\x03\x63\xfd\xe1\x66\xf4\x2c\x70\xfd\xe3\x8f\x58\xb2\x25\x4e\x6d\x8b\x65\xb4\x6f\x10\x08\x5b\xf0\x5a\x12\x15\xfa\x00\x97\x96\xec\x55\xdb\xa1\x62\xa7\x3b\xe0\x48\xef\x76\x05\xe9\x9a\x08\x92\x62\xa0\x73\x11\xe1\x07\x1b\x29\xa9\x64\x76\x75\xb9\x57\x15\x36\x83\xc7\xd4\xd5\xba\xd6\x5b\xf5\xb2\xa9\x88\x46\xdb\x6c\xaa\xda\x92\xfd\x61\x60\x5a\xd9\x5a\x31\xcc\x50\x5d\xce\xab\xad\x71\x6f\x39\xdd\xc4\xac\xb2\x3f\x41\x19\xcb\x7d\x70\xf6\xfb\x7c\x59\xeb\x7a\x7f\x56\x85\xa5\x6d\x8c\xce\x86\x57\xea\x6b\xd5\xaa\x14\x41\x46\x22\xec\x95\x6c\xcc\x7a\x74\xdc\x59\x58\xa4\xaa\xe0\x0c\x5f\x36\x70\xe1\x17\xe8\x68\x67\xf4\x37\x92\xb0\xa7\xcc\x01\x3d\x22\x76\x6a\x03\xf6\x6a\x62\x1c\x84\x9c\x2d\x06\xec\x57\xbb\x1a\x9b\x3b\xfd\x9d\xb7\x6c\xec\x46\xb1\x71\x74\x43\x6c\x21\x98\x9e\xc5\x54\x91\x99\x23\xe7\xef\x7c\xbe\xc7\x9d\xba\x74\x4e\x50\xaf\xc5\xa6\x1c\x11\xb0\xe7\x33\x36\x56\xf9\x8a\x49\xbf\xe4\x76\x73\x35\xe8\xb6\xaa\x4d\x6a\xf2\x67\x22\xd2\xd6\x29\x91\x46\xbc\xe3\x55\x52\xd6\x1a\x69\x8a\x02\xc6\xbd\x08\xef\xc3\x8f\xd1\xab\xb4\xc6\xb9\x5c\xcf\xad\x2a\x89\x7a\xf0\x98\x0a\x97\x44\xa4\x44\xa4\xbf\x08\xbf\x5e\xe7\x1f\xc4\x59\x3c\xb9\x6f\x65\xf5\x12\xe8\x66\x15\xd1\xb4\x44\x19\x5a\xb6\xb0\xcc\xa2\xa2\x17\x1b\xe4\x1c\xb1\x1c\x67\x33\xcb\x16\x29\x4d\xa4\xc9\xda\x90\x9e\x38\x33\x59\x21\x0e\x55\x2c\xf3\x8c\x5c\x92\xb2\x0b\xa9\xd2\x94\x1c\xb3\x6e\x0b\xa1\x44\x6c\x93\xe3\xda\x6f\xf2\xa8\x22\x9b\xd4\x14\x7f\x35\x8b\x27\xab\xc8\xb2\xfc\x4e\x6f\x17\x44\xa6\x2d\x74\xc3\xc4\x53\x53\x37\x1a\xe2\x62\xc5\x0e\x0f\xf3\x65\x5e\xe4\x4d\xee\x12\x0a\x51\x76\xfa\x3c\x69\xcf\x58\x8f\x03\xe2\xc8\x2d\xe6\x8c\x4f\x8e\x0b\x45\xdc\xe1\xd7\xe6\xbb\xde\xee\x0a\x2c\x79\x8d\x98\x6d\x51\xa2\xb4\x57\x37\x34\xb5\x31\x1c\x5b\xf8\xa9\xc9\x59\x5e\x0e\x7c\xb5\x32\x20\xc4\xbb\xb4\x88\xea\x75\xee\x7c\x0f\x9e\x91\x83\x54\x09\xd5\x50\x72\xe8\x74\xd0\xf7\xd3\x21\x07\x17\xbf\x7a\xe0\xc9\x78\x63\xcf\x71\x35\x08\x5e\x16\x79\x96\x88\x1a\x9c\x6e\xa8\x46\x70\x86\xc0\x85\xdd\xc0\x19\xb0\x64\xeb\xdd\x00\x05\x81\xb2\x0c\x13\x15\x57\x91\x82\xe4\xcc\x82\xc8\x35\xa7\xfc\xc3\xd5\xae\x17\x58\xb3\x31\x3b\xfb\xab\xba\x7c\x77\x15\x15\xc3\xbe\xbe\xc9\x1d\x2f\xdf\x5f\x41\x77\x88\x6e\xe7\x20\x51\x4d\x79\xd9\xe4\x50\x28\xe9\xc7\xf2\xc3\xc2\xac\x11\xdc\x5d\x45\xf4\xb5\x6a\x10\x9b\x03\x34\x7f\xe2\x4a\xc2\x06\x8c\xf7\x03\xcf\xa3\xc2\x42\x39\x64\x05\xa3\xc9\x56\x9c\x1c\x91\x4d\x9d\x20\x44\x93\x78\x82\x38\xe2\xe8\x1c\x83\xde\xd1\xbd\xa3\xb1\xae\x8d\x2f\x9e\x2d\x39\xac\x6d\xf0\x9a\x0d\x56\x90\xfc\x59\x56\x78\xbf\xa6\x22\xb2\xef\xb2\x43\x2f\x81\x0c\xd5\x78\x75\x54\x21\x02\xd8\x40\xde\xb5\x48\xd0\xb4\x89\x29\xac\x64\xfa\x9d\xb6\x16\x8f\x08\x2e\x78\xf6\xa8\x88\x44\xae\x03\x6e\x9d\xb5\xc0\xcb\x8b\x77\x0b\xc9\x70\xae\x14\xd3\x8e\x15\xec\x91\x97\xba\x18\x88\x8d\xb1\x8c\x2a\x08\xf4\x80\xc2\xbc\xe5\x4a\x58\x57\x59\x9b\x0a\x1b\x5c\x22\xc8\xb4\x70\x4b\x22\x80\x6c\x5c\x90\xdd\xc9\x04\x11\x2d\x5f\x6c\x7e\xc0\x02\x80\x0d\x86\x35\xe4\x29\x77\xf4\xb0\xd8\x0f\x78\x8b\x38\x23\x11\x43\xcd\x06\x70\x00\x65\x17\x3b\xa1\x5a\x93\x22\x1b\x54\x0c\x96\xdd\xe9\x64\x47\x8f\x29\x13\x7c\x31\x9c\x4d\x39\x6b\x3c\x57\x79\xc6\x9b\x67\x94\x0f\x6b\x11\x01\xd5\xca\x3b\x02\xd5\x3c\x84\xa4\xee\xef\xc7\x12\xe4\x65\x96\x3f\xe7\x59\x4b\x3c\xa9\x6a\xc9\x36\x95\x3d\x02\x18\x19\x50\xfe\x34\xf0\xca\x94\x83\x8c\xeb\xce\xa6\x23\x83\xbf\x51\x76\x4c\x83\x52\x88\xfc\x44\x79\x12\xee\x40\x9e\x02\x0b\xb3\x61\x58\xdb\x0c\xe5\x90\x8a\xd3\xc2\xe8\x3a\xd2\xb1\x6c\xc5\x51\xb7\x0c\xf8\x27\x13\xaf\x74\x5e\xf5\x83\x73\x14\x06\x73\x35\xeb\x3c\xac\xd3\x8c\xa5\x86\x82\x9e\x76\x64\xf9\x10\xae\x5c\x8e\x2a\x88\x27\x69\x92\x28\x52\x7c\x80\xfd\x28\x44\xbc\x93\x8b\x9f\xa5\x6c\x25\x2c\x25\x78\x46\x44\x93\xd9\xc3\x5c\x8d\x26\xb7\xea\x66\x3a\xb9\x1d\x2f\xc6\xd3\xc9\x5c\xdd\x4d\x67\xf8\xf1\xf1\xeb\x78\xf2\x71\xa0\x6e\xc7\xf3\xc5\x6c\x7c\xfd\x44\x8f\x78\xe1\xc3\xf4\x76\x7c\x37\xbe\x19\xd1\x2f\x2e\x2e\xde\xba\x5a\x7c\x02\xc4\x38\x0f\x63\x15\x82\x35\x01\x1e\x04\x46\x5d\xa4\x13\x5a\x83\x31\x08\x71\x43\x62\xaa\xa1\xbb\x42\xa7\x1d\x02\xe9\xd2\xc8\xa6\x2a\xa8\x4c\x58\xbd\x77\x20\x73\x0b\x50\x08\x65\x76\x79\x20\x93\xc0\xe4\xf7\x44\x39\x1e\xb1\xbe\x8a\x02\xb9\xdc\xa8\x37\x8f\xc2\xe5\x1b\xa0\x59\x03\xbd\x0c\x04\x7f\x04\x21\x38\xd1\x47\x92\x90\x0c\x92\xcd\xb4\x7a\xc3\x02\x2d\xb5\x84\x29\xef\xef\xa9\xa9\xad\x41\xdd\x52\x26\x67\xc1\xa3\x27\x44\x83\xe8\x82\xe1\xfc\x19\x06\x81\xf3\x30\x15\x11\xa1\x13\xbb\xd0\x2f\xbf\x8a\x23\xe5\xcc\x0b\xe4\xc7\xb6\xb2\xd6\x29\xcf\xbb\x6a\x4c\x59\xed\xaa\xba\x71\x6d\x0b\x01\x0a\xc7\x40\x80\xf4\x24\x01\x65\xed\xd8\x23\xac\x4f\xa4\xa1\xd6\x66\x94\x14\x48\x7e\xb1\x5b\x81\xb8\x6b\xf5\x1a\x1a\xbb\xfc\x84\x84\x87\x10\x5f\x41\xcf\x83\xb0\x9e\xf6\x63\x48\x9d\x16\x2d\x41\x6a\xda\xa1\x6a\xc9\x8f\x81\x43\xdd\xe3\x32\x98\x47\xbd\x89\x37\x7f\x03\x04\x99\x50\x82\x76\x4e\x2f\x6d\x58\x96\xa1\xc4\x73\x04\x58\xf5\x06\xf5\xe0\x0d\x25\x74\x24\xed\x67\x29\xf7\x95\xd3\x2a\x81\xa4\x3f\xe7\xf4\x94\x5c\x28\xb4\x7a\x40\xb7\x73\xdd\x0f\x92\x39\x19\x61\xb5\x8d\xcd\x39\x9a\x51\x13\x41\xdd\xf9\x89\x4e\x19\x94\xd7\x6d\x79\xa4\x77\x97\x6a\x3d\x6c\x31\xd9\xc0\x81\x2f\x26\x86\xec\x88\x00\xaf\xb6\x87\xaf\x78\x4e\xaa\x92\x50\xf3\x8a\xf7\x23\xc3\x72\x66\xe7\xf4\x98\x37\x5c\xe4\xd4\x59\x2f\x53\x97\xc8\x6f\x66\x47\x38\xaa\x64\xee\x90\x8b\x88\x39\xee\x15\x39\x25\x41\xcc\x13\x1c\x5f\x21\xbf\x3a\xbc\x12\x3c\xac\x6e\xa9\x01\x23\x5a\x96\x76\xf1\xd5\x24\x6c\x95\x55\x86\xf2\xfb\x3b\x07\x49\xf4\xfe\xcf\xb7\x8e\x81\x08\xf7\x32\x1d\x14\xd6\xb6\x87\x92\xc9\x5d\xf3\x92\x83\x63\x8b\xe4\xde\x02\x55\x21\xee\x90\xbd\x4d\x04\x64\x49\x31\xbb\x3c\x6d\xab\xd6\x16\xb2\x3b\x92\x0e\xa7\x68\xb8\x2d\x7e\xb3\xa3\x10\x47\xdd\x80\x08\x5c\xf6\x1d\x93\xf1\xaa\x28\xc8\x5c\xea\x71\x42\xa4\x85\xce\xb7\xd0\x09\x98\xf6\xc5\xfc\x83\xfa\x66\xcc\x8e\xa2\x81\xec\xef\xa1\x9a\xbc\x66\x7d\x21\x22\x40\x43\x2d\x6b\x2f\x15\x4a\xab\x46\xab\xf5\xd2\x9a\x32\xe5\x4e\x9d\x64\xeb\x48\xd3\x1a\x46\x84\x5d\x43\x17\x15\xf7\xbe\xea\xb8\xad\x87\x28\x3e\xb3\x85\x7d\x8a\x0a\xb6\xf5\x43\x04\xbf\x1a\x86\x0a\x56\x92\x96\x85\x91\xa8\x83\x26\xc8\xb5\x9b\xbd\x45\x64\x14\xde\xab\x39\x90\x7d\xd7\xa5\x1d\xd0\xd2\x1e\x33\x82\x8a\x76\xc0\xaf\xda\xb9\xe4\x42\x32\x07\xc4\x13\x41\x2a\xaa\xa5\xdf\x7d\xaf\xec\x11\x30\xd8\x79\xdf\xf9\x8d\x83\x6b\x4c\x4f\x64\xaa\x4f\xbb\x8b\x4f\x95\x07\x29\xad\xd9\xb4\x5c\xef\xb6\xc2\xec\xd9\xe8\x18\xb8\x1a\x79\xec\xa5\x9c\xd3\xfb\x19\xd0\x65\xf6\x53\x95\xc4\x8f\x62\xde\xc1\x92\x88\xd9\x53\x5e\xa9\x81\x35\xe1\xb4\x46\x5c\x44\xa4\xe0\xc1\x90\xaf\xcf\xbf\xfe\xe7\x5f\xff\x56\x17\xfa\xaa\xc3\xf3\xa9\x6e\xad\xf4\x02\x01\x04\xae\xf2\x42\x8a\x67\x0a\xc5\xb2\x56\x21\x22\x45\xb6\xf7\x37\x4b\xc9\x94\x43\xd9\x47\x03\x2b\x5a\x52\x8d\xbc\xed\x13\x4f\x46\x8e\xee\x3c\x4e\x56\x0d\x99\x85\xe5\x11\x0b\xec\x93\x24\x7a\xa0\x1a\x69\x0a\x6a\x71\x11\xe5\x7a\xd3\x9c\x52\x43\x55\xf0\x13\xc6\x52\x75\xd3\xd5\x72\xfa\x9d\x95\xca\x46\xe2\x1c\x26\x3d\x6f\x4e\x7a\x87\x91\x73\xb5\xa2\x16\xa6\x87\x8c\x34\x21\x02\xd9\x41\x93\xe0\xde\x7f\xa9\x1a\x71\xf4\xd1\x98\x8f\x28\x90\xbb\x9c\x2b\xfb\xbe\xc0\xb3\xc4\xe9\x95\x47\xde\x41\xd1\xbe\x9c\x97\x70\x22\x46\x86\x80\xa5\x99\xcc\x4d\x18\xdb\xd3\x6c\xa8\xd6\x54\x6e\x28\xa5\xbc\xd0\xd8\x02\x59\x34\xea\xe3\x44\x73\xe4\x8c\xfc\x10\x76\xa9\xa9\x68\xfa\x54\x4b\x8e\xcf\x3e\x16\x11\x62\x7c\xe7\xaa\xa0\x4c\x78\xea\x0c\x85\xb4\xa6\x84\xc0\x9d\x1c\x4d\x37\x28\x8b\xd7\xa4\x7f\x80\x21\x49\x5b\x65\x59\xb5\x48\x1e\x34\x6e\x73\xf5\x95\xbd\xfe\x4f\x24\xb4\x00\xac\xce\x77\x2a\x97\x04\x43\xd1\x6e\x0c\x3c\xba\x0a\x2e\xe0\x5c\x9c\x6c\xe1\x16\x5f\x75\x03\x05\x1e\x63\x71\x28\x47\x20\xdc\xf4\x50\x73\xb0\x4c\x2f\x0a\x5c\x5d\x34\x45\xe1\x0b\x12\x91\x52\xdc\x8e\x56\xea\x39\x37\x2f\x67\xd2\x1c\x80\x47\xf2\x3d\x35\x9c\x7c\x7e\xa5\x62\xd9\xab\xa5\x8d\x35\xc5\xca\xcf\xf4\xbc\xba\x69\x34\x49\x35\x8b\x4b\x73\x30\xb4\xe8\x58\x9a\xf7\xbe\x76\x07\x92\x90\xce\xd7\xda\x50\xe5\xff\x7f\x9b\xd7\x32\x13\x11\x6a\x07\x84\x86\x57\xec\x76\x59\x70\xbb\x90\xc1\x7b\xe5\x2e\x73\xf3\xd2\x78\x0e\xe9\xf9\x97\x7c\x2e\x6a\x46\xcf\x54\xb5\xeb\xcd\x89\xb1\x2e\x2b\x33\x5f\x0d\xbc\x57\xf9\x81\x75\xbc\x89\xf4\x61\xac\xe5\xa0\x9c\x13\xf5\x02\x56\xb6\x5c\x8a\x5c\x93\xb7\xa3\x94\xdb\x96\x39\x7c\x04\x6c\x91\xc8\xc0\x36\x52\x25\xa2\x7e\x3c\x38\xc3\x71\x99\x27\x5e\x0b\xd3\xf4\xa6\x10\x51\xfc\x88\x22\xb7\xd5\xb3\xf3\xce\x95\x4e\x69\x92\xb3\x97\x9c\xc1\x86\x38\x37\x87\x7f\xec\x43\xf1\x57\x32\x3f\xef\x24\x95\x0a\x26\x22\xb3\x3d\xeb\x82\x81\x52\x24\x9e\x1f\xcf\x8a\xb2\x8f\x74\xc4\xac\xf8\x2d\x5f\x31\x45\xa4\xa5\x7c\x4b\xe8\x85\x07\x56\xb1\xbe\x80\xc4\x3e\x2d\x16\x8f\x5e\x8c\x53\x0a\xa2\x67\x67\x64\xf7\x1d\xd4\x41\xd7\x20\x9d\x21\x8f\xcc\xd8\x2b\xb7\x32\x51\xe2\x41\xac\x43\x1f\x81\x96\xb8\x4c\x48\xaf\x3c\x8f\xc8\x09\x38\xe2\xb1\x5e\x22\xdf\x5a\xe3\x46\x6e\xcc\x22\x4d\x14\xf8\x0d\x07\x9c\xcf\x65\x75\x57\x65\xa1\xe1\x25\xb1\xa1\x6d\x55\x82\x1a\x8f\xe3\x09\x46\xd7\xdc\x4b\x74\x20\x95\x16\x5b\x83\x04\x4e\x0a\xa2\x0d\xac\x73\xdf\x2d\x82\xf8\x99\xba\xf1\x66\xc3\x5e\xd8\x05\xbf\xec\x40\xf0\x98\xb3\xfc\x80\xe6\x97\x7c\xca\xd0\x89\x49\xd3\xef\xc0\x3e\xa7\xe4\x83\x3a\xc6\xd3\x2e\x6d\x0f\xb6\x1e\xaa\xeb\xb6\x39\xb7\x1e\x39\x71\x1b\x51\xc5\xcb\x5c\xb8\x78\xd0\x20\x05\x4a\x3a\x59\x3e\x35\x7a\xc5\x15\xb9\x1a\xc7\xbd\x89\xf3\x00\xa1\xe1\x47\x03\x55\x79\xbe\x8e\x0d\xdc\x7c\xbf\x9b\x86\x49\xbf\xef\x9a\x33\xd7\x37\xa1\xd9\xfc\x4e\xa9\xc4\x1b\x9e\x2c\x5b\xbb\x6d\x7c\x43\xd2\x32\xbc\x90\x79\x18\x7e\xc1\x23\x08\x11\xab\x36\x6b\x5d\x67\x40\x10\xbc\x3b\x5e\x52\x2f\x04\xea\x64\x2a\xba\xc0\x8b\x83\xe8\x7c\x87\xc8\x73\xde\x6a\x02\xab\x4e\x4f\x8c\x5e\x08\x46\x47\x83\x5f\x6e\x6a\x6c\x7f\x72\x88\x65\x32\x0c\xa8\xe9\x24\xaa\x74\xcc\xca\x30\x08\xeb\x3e\x28\x18\x69\xc3\x2d\x66\xb7\x95\xf4\xc1\xe6\xbb\xa9\x65\x0c\xe2\x67\xa6\x32\x1a\xa4\x21\x56\x71\x52\xd9\x51\xcc\x30\x37\x05\xcd\xb3\x7c\x04\xd9\x93\x56\x83\xcc\x63\x3e\x6d\xcb\xe5\xb8\x6e\x4b\xc5\x53\xaf\xd7\xa4\x25\x4f\xd6\x37\xc7\x2c\x07\x69\xe5\x64\xd5\x38\xca\xb4\x97\xbe\x03\x7f\xc5\x69\xae\xe8\x67\xad\x9e\xab\xa2\xdd\x0a\x8a\x03\xc4\xa8\x6a\x74\xe0\x0e\x1e\x74\xf2\x49\xa7\xd4\x55\xba\x65\xed\x4b\x6b\xc4\x5d\x87\x93\xb8\xa1\x3d\xaa\xae\x17\x17\x7f\x79\xbd\xad\x3b\x14\xe0\x90\x77\x42\x42\xb2\x49\x38\xb7\xbc\xa2\xb8\xae\x96\xbf\xd3\x58\xcd\x1f\x7c\xc0\x76\x69\xdb\x70\xb2\x21\xfc\xfe\x0a\xd8\xb6\x84\xb6\xc1\xc3\x7b\xc1\xdc\xe7\x20\x37\x32\x01\x8d\x4c\x5d\x44\xc9\x60\x0b\xf2\x07\xb4\x3d\x4a\x29\xcf\x52\x09\xcc\x9b\xce\x14\x21\xf7\xa6\x55\x2d\x27\x09\x0c\xaa\xb6\x08\x0b\xe0\xed\x1f\x09\x0c\x4a\x42\x8c\x6b\x97\x04\xbb\x0f\xd7\x3f\x18\x3e\x9d\x91\x82\xad\xea\x2c\x96\x82\x52\xb5\xd5\x75\x5e\x70\x7d\x96\x99\x60\x37\x1b\xa6\x42\x24\xb8\xfd\x03\x34\x37\xf0\xd8\xfd\x58\x20\x1d\x62\x88\x4b\xdd\x40\xa1\xc8\xe5\x42\x0d\x9a\x2a\x90\x90\x1b\x9e\xbb\x1a\xb5\x37\xba\xe6\xb3\xb8\xae\xe9\xec\xe0\xf4\x7e\xe0\xda\x35\x87\xb7\x4b\x3a\x87\x94\xc3\x86\xd2\xb7\x6a\x72\x2c\xe9\x7b\x47\x42\x53\xa6\xf6\x7d\x98\xd3\x55\xec\x9b\x03\x57\x28\x59\xd5\x47\xca\xed\x60\xde\xa1\x1d\x7a\x6a\x97\xf6\xe0\xff\x40\xdd\xd4\x37\x9c\x76\x9f\xbc\x24\xa1\x25\x0f\xf4\x00\x9d\xb6\x3e\xf7\x0a\xea\x38\x3c\x58\x3c\x23\x24\xc0\x2d\x4f\x51\x75\x01\x26\x4a\x49\x54\xfc\x23\x1f\xa2\xcb\x7c\x68\xc5\x93\xe1\x92\x3a\x14\x4a\x7f\xe8\xdc\x8f\xc6\x5d\x7e\x8e\xd4\x63\x29\xc6\xe4\x7f\x1c\x8f\x2c\xa2\x07\xc7\xce\x9d\x68\x22\x03\x35\xd4\x32\xd5\x53\xf3\x76\xe9\x53\xfd\x52\xd4\x3c\xbc\x92\xf1\x74\x0c\x64\x56\x5d\x8e\x90\x39\xa8\xf0\xc1\x07\xbb\xa2\xfb\x6d\x28\x83\xb4\x88\xef\x03\xc8\xec\xbd\xdf\x96\x13\x28\x6e\x86\xea\xae\x12\x0c\xd7\xf1\x2b\x63\xd8\x93\x28\x4a\x76\xf4\xb3\x9a\x23\xb6\xf0\x7b\xec\xd1\x52\xb3\x9c\x77\xbd\x2b\xba\xfa\xa2\xb5\x1c\x14\xda\xda\x2a\xcd\xfd\x14\x14\x2e\xae\xc9\xb1\xcd\x2a\x2f\x73\x99\x9f\x53\xa3\xed\xd6\x4b\x4e\xad\xf3\x9d\x9c\xee\x67\x71\x2d\x22\xe6\x72\x37\x1d\x65\x04\x43\x27\x1e\x45\xa1\x63\x10\xd0\x49\x34\x54\x9f\x60\xee\x67\x52\x39\x83\x34\xbb\x33\x6c\x67\xe3\xfb\x9e\xc1\x91\x38\x71\x54\xf0\x31\x2d\x15\x00\x37\x84\x25\x49\xf8\x78\x37\x4c\xf8\x42\x0f\x14\xbf\x76\x49\xf3\x1a\x19\x11\x3b\xca\x50\xd1\x52\xfa\x52\xb2\xd2\x55\xe7\xf6\x5b\xfd\x3b\x97\xcf\x2d\x5c\x98\x61\xe6\xa5\x08\x48\x1c\x7f\x83\xe3\x9a\x42\x50\x86\xa5\x9c\x7c\xe5\x05\x44\xb9\xa9\x65\x68\x61\xf7\xb6\x01\x08\xe3\xd9\x22\xa5\xd2\xbe\xf8\xd4\x3b\x5b\x2a\x22\x0c\x41\x98\xe7\xb0\x95\xef\xf0\xb4\x0b\x47\x3e\x62\xe8\x2b\x0f\xf5\x7a\x75\x54\xf8\x23\xea\x84\x96\x22\xdf\xa7\xa3\x37\x37\x1e\x65\x37\xe7\x9e\x3a\x4d\x79\x6b\x77\x27\x86\x71\xae\x76\x97\x09\xd8\x19\xf8\x80\xc2\xe1\xd3\xf0\x56\xd4\x56\x1c\x10\x38\x72\x3e\x0f\x9c\x19\x57\x32\x31\x3c\x68\x19\xb0\xdb\x93\x08\xb1\x97\x08\x8d\x34\x67\xdc\x80\xf4\xa7\x20\xdd\x68\x7b\xbb\x43\x6b\x1d\xdd\xeb\x89\x88\x1c\xcc\x09\x23\x65\x40\x77\x7f\xed\xaa\xbf\x10\xa2\xf1\x9f\x8c\xe9\x06\xc8\x07\xcb\xc2\xe3\xd0\x18\x7d\xf4\x51\x81\xb8\x29\x49\x62\xbe\xef\x68\x76\xcf\xcd\xb6\x2b\xda\x3e\x65\xc7\x0d\xfd\x88\x22\x0d\x75\x6b\x8b\xb7\x18\xaa\xbc\x30\xa8\xab\xce\xee\xfe\xca\xe6\xa0\x4b\x67\x84\xe2\x7f\x7c\xee\xa7\x5b\xca\xf6\x8d\xab\x53\x54\x28\x72\x32\x62\x0f\x83\x9e\xe2\x2a\xc4\xa0\x57\x2e\x21\x61\x3e\xe1\x0b\x29\x55\x46\x95\xac\x0b\x7f\x4d\xc2\x77\xad\x27\x48\x76\x07\xa9\xfe\xde\x49\x5e\x77\xf7\xa0\x02\x63\x1c\x36\x6c\x22\x6a\x52\xf8\xc8\xc9\x31\x80\xa6\x8e\x0e\x2d\xf1\xdf\xaa\x2d\x24\xa9\x14\xb9\x2e\x53\xb2\xdb\xcf\x62\x37\xef\x00\xf1\x68\x82\x9c\x71\xd7\x1c\xb4\x11\x36\xa7\x39\x74\xb8\x04\x43\xef\xb8\xab\x32\x94\x64\x83\xec\x04\x6c\xd9\xb7\xe9\x24\x7a\x4d\xd3\x1f\x99\x5c\xf4\x4f\xe3\xdd\x18\xf7\xbc\x55\x68\x1a\xd8\xd8\xc3\x96\x35\xdc\xf2\xd0\xbe\xb1\xaa\xb9\x44\x6d\xf2\x65\xde\xc8\xc1\x4c\xa1\x5f\xc2\xdd\x0b\xd7\xea\x1d\x4b\xc3\x64\x50\x51\x2a\xba\x5c\xb0\xf4\x53\x65\x62\xbb\x07\x91\x0f\x8e\x6a\x2e\xdd\x0c\xf2\x3c\xf4\x96\x29\x05\x9d\x1b\xa7\xc1\x61\x64\x7b\xed\x86\xf8\x3d\xf3\x36\x0c\x42\xe9\xa6\x01\xcf\xdc\xdc\x45\xaf\xff\xcd\x11\xad\x70\xdc\xb1\x7f\x62\xc8\x61\x63\xa4\x0d\xbb\xff\xbf\xa1\x1c\x99\x35\xf9\xd6\xb8\x7a\xff\x1a\x58\xff\x03\x79\x9b\xf8\x3e\xca\x41\xe4\x38\xaf\xa7\x82\xe4\xc3\x30\xe4\xb1\x70\x15\x40\x9e\xc8\x15\x9f\xa3\x3b\x1a\xfd\xfb\x19\x9e\x2f\x84\x35\x27\xa0\x26\x5c\x45\x3a\xa1\xb1\x7e\x56\xca\x51\x0d\xdc\xb8\x7a\xd5\xd6\xee\xb4\x24\xba\x28\xe4\xe4\xea\x4e\x50\x7e\xe8\x7a\x45\x97\x50\x5d\xe0\xb3\x4b\x43\x13\x1b\x3e\xcb\x3c\x8c\x21\x77\xb3\x48\x30\x11\x1a\x53\xfc\x99\x92\x5d\xba\xc8\x73\x87\x87\x51\x0a\x3e\x38\xfd\x81\x89\xfe\x46\xf3\x15\x57\xca\x69\x14\x42\xc3\x21\x7f\x08\x44\x69\x1f\x2d\xf7\xef\x6d\xb6\xe6\xb9\xae\xa0\x92\xa8\xb5\x74\xd7\x06\x00\x34\xa9\xc6\x18\xbf\x68\xe5\x8c\xe9\x8f\x8a\x68\xd6\xa2\x2e\xe5\xc2\xc0\x36\x77\x17\x3a\xfd\xbb\xd6\xb6\xc6\x5e\x0d\x62\x07\x64\xa4\xcb\x5a\x64\x2f\x20\xc7\xb9\xf4\xf7\x96\x96\x7b\xc7\x15\x90\x1e\x63\x10\xf4\xba\x61\xe3\x90\x9f\xaf\x7c\x65\xa6\xab\x96\x88\x90\xc6\xc1\xf7\xb0\xc5\xd1\xe4\x82\x8f\x55\x5d\x14\xa3\x46\xd0\x10\x9c\xf6\x0d\x4e\x74\xfe\x5d\x1e\x50\xb9\x2b\x6b\x3c\x80\x8a\xce\x6f\x2a\x87\xb5\x2d\x5d\xb6\x82\x6b\xd9\x7c\xdb\x16\x08\x50\x23\xc7\x82\x72\x54\x85\xc2\xb1\x76\x30\xf2\x44\x5e\xe6\x70\xed\x2e\x52\x1a\x18\x92\xb1\x46\xf4\x9a\xab\xf5\x47\x36\xdc\x47\x5e\x79\x26\xee\xdc\xc5\x0d\x75\x78\x9f\x4c\x1f\xdc\x3e\x41\x60\xb6\x85\x00\x37\xb9\x96\xab\xea\x6a\x8f\x46\x60\xff\x23\xdf\x09\x89\xe2\xfa\xc4\x08\x14\x36\x13\x94\x5b\xf1\x05\xaa\x2a\x9c\xa4\xba\xd3\xb4\x0c\xc5\x20\xa5\x1b\x36\x7c\x56\x13\x7e\xf2\x63\x4c\x88\x11\xa6\x6d\x46\xda\x07\x77\xdf\x96\x5c\x01\x5c\x79\xed\x2e\xa1\x23\xc2\xca\x32\x43\x8a\x6b\x1b\x2f\x5b\x1a\x19\x7f\xae\x6a\x2a\x54\x61\x92\xc3\x26\x7e\x85\x7d\xc1\x6c\x07\xe7\x7b\xbd\x59\x12\xfe\xb9\x31\x05\x01\x67\xe9\x69\xe9\xee\x63\x29\x01\x69\x18\xd5\x89\x59\xfd\x99\x52\x9e\xb6\x85\x46\x8a\xcd\xeb\xb4\xdd\x5a\x4e\xd7\x92\xdc\x96\xba\xe8\x72\xb7\x89\xc9\xc7\xc3\x77\x19\x27\xfa\xf3\x33\xbf\x28\x3a\x8f\x3a\xb9\x9e\x9a\x2a\xf6\xa0\x78\x5b\x3a\x28\x1f\xf7\xa6\x65\xbb\xb6\xe6\xec\x75\x62\x5c\x06\xcb\xb4\xce\xa9\xf8\x27\x89\xf9\xe8\xfa\x90\xed\xc6\xbf\x74\xe4\x03\x4f\xdd\xbb\xc1\x17\x4f\xda\xfc\xe5\x4a\x3f\x66\x63\x5d\xd1\x68\xdb\x9d\xfe\x31\x9a\x90\x95\x1f\xfa\x9b\xd3\xb5\x72\x81\x88\x45\x8f\x43\x7f\x9c\xeb\x8a\x11\x09\xbd\xae\x1d\xc5\x66\x73\x70\x07\xba\x6f\x62\x01\xf9\x83\x6e\x34\x9a\x93\xeb\x53\x1e\x91\xd2\xbe\x93\x1b\x38\xde\xfb\x77\x3c\x6c\x27\x85\xa9\x07\x16\xd8\x54\x58\x1e\x5d\xa9\x5a\xd3\xcd\x1d\x04\xb5\xa4\x1c\xb7\x4b\x68\xb3\x5f\xe8\x88\xaa\xe6\xb3\xe6\xf8\x1a\x7c\xdc\xe0\x78\x67\xe7\xbc\xe5\x5a\x10\xbe\x40\xea\x52\x79\x55\xca\xa4\xda\x72\x54\xf2\x05\xa6\x34\xea\xd0\xc2\x4b\x1f\xdc\xf8\xb3\xdd\x85\x63\x7d\xbe\x00\xf7\x53\x56\x95\xa2\xff\x0c\x85\x27\xe3\xab\xc0\x5c\x1b\x95\xdd\xb0\xcb\x10\xfe\x73\x77\x99\x7b\x19\xcc\xf1\x1a\xce\x14\x42\x2a\x72\x4c\xca\x11\x5e\xb8\x14\xe3\x92\xa0\x2b\x82\x92\x85\x37\x55\xce\x30\x70\x71\x10\x34\xb1\x97\xf2\x6d\x46\x62\x94\x76\xa1\xb1\x3c\x5f\x50\x7b\x71\x3d\xe1\x12\x6a\x30\xcf\xb2\x72\x69\x8e\x4b\x95\x14\x54\xdb\x9c\x98\x18\xfe\x3d\x5c\x68\x3c\x9c\x44\xfc\x54\x85\x2f\x13\x0e\x40\x7a\x77\x43\x86\x6c\xe0\xef\x58\x72\x13\x54\x53\xc2\x72\x9d\xe8\xb2\xe7\xf9\xcb\x7d\x77\xbe\x19\xb7\xe4\x92\x9e\x3b\x14\x72\x74\x63\x8c\x32\x22\xb7\x59\xb6\xc7\xc7\x89\x5a\xc0\x37\x1c\xb2\x4c\x46\x0c\xe4\x01\xb0\xf5\xda\xd0\xf2\xdd\x86\xaf\x49\xf4\x44\x8c\x6e\x35\xa1\xa2\xb9\x13\x59\x49\xc2\x41\x94\xee\xaa\x65\xef\xd5\xde\xd7\x17\x32\xb0\xe1\xc3\x1d\xbd\xad\x18\x61\x78\x45\x48\xda\x68\xad\xdb\xc0\x64\x50\x76\xe9\x22\x59\x4b\x59\x8d\xd8\x07\xaa\xaf\x10\xbc\x74\xae\x21\xa2\x46\x1c\x22\xc4\xe1\x91\x7e\x44\xe8\x4e\x0a\x97\x55\x76\x7c\xc4\x7a\x71\xf1\xcb\x30\xfe\xb0\x86\xb5\xe2\xaf\xd3\xd4\xe6\x39\xe7\xe3\x79\x31\x2f\x5d\x37\x77\x67\x53\xe1\xd2\xc6\xeb\x5f\x5c\x48\xc1\x27\xbc\x4a\xe1\x83\xbf\x87\x6a\x4e\xe2\xf4\x28\x71\xaf\x04\x3f\x44\x39\xcf\x29\x95\x83\x5d\xbb\xcb\xeb\xdc\xe3\x44\x1a\x21\x59\x8a\x53\xf7\x86\x7c\x80\x42\x7c\x02\x60\xae\xf8\x8c\x13\x61\x08\xa7\x2a\x38\x41\xcb\x25\x32\xde\x22\x5c\x76\x95\xf3\x08\xb8\x1e\xdf\x56\x65\x14\xed\x0f\xd9\x72\x7f\x04\xaa\xd9\x68\xb0\x6a\x0b\xd1\xc9\xb8\x7e\x45\xd9\x6e\x97\xa6\x1e\x1e\x1e\xec\xf2\xa8\x66\xc5\xad\xf8\xc1\xd2\xa3\x76\x41\xf2\x62\x74\x4f\xd2\x95\xd5\x37\x14\xff\x74\xf3\xae\xf6\x14\xde\x0c\xfa\x5f\x2b\x84\x9b\x37\xdd\x98\x3b\x1a\x82\x1e\xb4\x1a\x2e\x90\x7c\x0a\x8b\x8f\x11\xa5\x28\xf4\xb6\xf2\x56\x96\x14\x2d\x76\x74\x9f\x28\x1d\x48\x1a\x8e\x19\x44\xe4\xfd\x1f\x0a\x3c\x08\x60\x09\xd9\xca\xc3\x77\xff\x0a\x75\x9b\xe7\xf7\xee\xae\x30\xf1\xa8\xdf\xbd\xcf\x48\x23\x4a\xa4\x87\x47\xa5\x1d\x8c\xec\x5f\x45\x88\xf7\x75\x0e\x7b\xee\xeb\xac\x1f\xec\x6b\x1f\x7b\x79\x22\x7f\x21\x6d\x6e\x90\x6f\x08\x2d\x47\xcd\x7b\x5f\xe1\xd1\xb7\x63\x8f\xf7\x7e\x36\x77\xa6\x3f\x44\x4f\xc4\x57\xa2\x73\xee\xbc\xa2\xc1\x52\x38\xe2\x3c\xf8\x10\x8b\xae\xe3\xbd\x0d\x30\xd9\x5f\x97\x8e\xb2\x01\xc3\xa2\xa3\x5b\x55\x7c\xb5\x53\x6a\x4d\xef\x93\x11\x77\xca\xd8\x4b\x58\x07\xdd\x83\x84\x19\xdf\x96\xa0\x94\x62\xfa\xb5\xd0\x7f\xe2\x41\x7d\x4a\xfc\x2d\xdb\x5d\x3c\x6a\x0f\xc8\x20\x4e\xea\x07\xa6\x8f\xa8\xb7\x00\x2d\xf4\xc9\x50\xb5\x35\x94\x35\xac\x14\xb4\x30\x14\xb5\xe1\xb6\xfd\x50\x4d\xdb\x9a\x8b\x30\x6b\xde\xa7\x12\xc4\x70\xd6\xdd\x2a\xa6\x6f\x15\xd6\x15\xfc\x49\x60\x8e\xe1\xef\x77\x5c\x20\x09\xaa\x41\xda\x6c\xe5\x36\x39\xde\xef\x46\x17\xfc\x2b\xff\x6d\x58\xff\x83\x2c\x01\x4c\xdb\x2a\xe0\x25\xfa\x66\x4c\x2e\xe9\x64\xf0\xd5\xc3\x6f\xf4\xd6\xe2\x56\xc5\x1e\xd6\x9b\x4c\xd5\x97\xd1\x6c\x36\x9a\x2c\xbe\xc2\x94\xef\x86\xea\x3a\xb9\x19\x3d\xcd\x13\xb5\xf8\x94\xa8\xc7\xd9\xf4\xe3\x6c\xf4\xa0\xc6\x73\xff\x91\xe4\xad\xba\x9b\x25\x89\x9a\xde\xa9\x9b\x4f\xa3\xd9\xc7\x64\x40\xeb\x66\x09\xad\x88\x28\xf1\x0d\xee\x88\x00\x56\x4d\xf9\xe7\xe4\x9f\x8b\x64\xb2\x50\x8f\xc9\xec\x61\xbc\x58\x80\xda\xf5\x57\x35\x7a\x7c\x04\xf1\xd1\xf5\x7d\xa2\xee\x47\x5f\x86\x58\x73\x93\x3c\x2e\xd4\x97\x4f\xc9\x44\x4d\x89\xfa\x97\x31\xd8\x99\x2f\x46\xb4\x7e\x3c\x51\x5f\x66\xe3\xc5\x78\xf2\x91\xe9\xd1\x2d\xf1\xd9\xf8\xe3\xa7\x85\xfa\x34\xbd\xbf\x4d\x66\x7c\x95\xfc\x27\x6c\xce\x2f\xaa\xc7\xd1\x6c\x31\x4e\xe6\xc4\xc6\xe7\xf1\x6d\x5f\xa6\x37\xa3\x39\xb8\x7e\xa3\xbe\x8c\x17\x9f\xa6\x4f\x8b\x8e\x77\xc8\x36\x9a\x7c\x55\xff\x18\x4f\x6e\x07\x2a\x19\x33\xa1\xe4\x9f\x8f\xb3\x64\x4e\xe2\x83\xf6\xf8\x01\x0c\x27\x78\x38\x9e\xdc\xdc\x3f\xdd\xf2\x2d\xf5\x6b\x50\x98\x4c\x17\x50\x13\x04\xc3\xb2\xc5\x94\x35\xe3\xd7\x7a\xea\xc4\x0c\xe8\x3f\x24\x33\xa8\x6f\xb2\x18\x5d\x8f\xef\xc7\xd8\x92\xae\xb5\xdf\x8d\x17\x13\x6c\xc1\xaa\x1b\x09\xe7\x37\x4f\xf7\x23\x08\xf1\x34\x7b\x9c\xce\x93\xa1\x28\x10\x34\xa0\xee\xd9\x78\xfe\x0f\x05\x01\x9c\x5a\x7f\x7b\x1a\x05\x3a\xd0\x2d\x48\x3c\x8c\x26\x37\x6c\xa6\x03\x33\x92\xb4\xea\xeb\xf4\x09\xa5\x0f\x52\xdf\xdf\xf6\x9e\x93\x9a\x12\x75\x9b\xdc\x25\x37\x8b\xf1\x67\xd8\x16\x0b\xb1\xcb\xfc\xe9\x21\x71\xda\x9e\x2f\x58\x3d\xf7\xf7\x6a\x92\xdc\x80\xdb\xd1\xec\xab\x9a\x27\xb3\xcf\xe3\x1b\xd6\xc2\x2c\x79\x1c\x8d\x67\x8a\xaf\xef\xcf\x66\x44\x65\x3a\xa1\x0c\xf1\x7e\x48\x86\x83\x83\x24\x9f\xc9\xfc\x4f\x93\x7b\x92\x74\x96\xfc\xf6\x04\x61\x4e\x38\x01\x51\x18\x7d\x84\xa3\x91\x22\x63\x9b\x7f\x19\x63\x6b\xb2\xce\xa1\xe1\x07\xfc\x0a\x1e\x74\x86\xff\x0a\x17\x9a\xaa\x87\xd1\x57\xf9\x62\xe0\xab\x77\x0d\xec\xe8\x3f\x29\xe8\x7b\x04\xf4\xd9\x39\xe6\xe8\x7a\x4a\x1a\xb8\x06\x3f\x63\x66\x0b\x8c\x90\x3a\xc8\x3c\xb7\xa3\x87\xd1\xc7\x64\x1e\x39\x00\x6f\xed\x3e\x2b\x1e\xa8\xf9\x63\x72\x33\xa6\x7f\xe0\x39\xdc\x0e\x76\xbe\x17\x9d\x20\x80\x7e\x7b\x22\x13\xe2\x17\x8e\x88\x1a\xc1\x96\x44\x81\x7c\xd0\xd9\x8b\xc2\x8f\xfc\x6c\xe2\xfd\x03\x7b\x1f\x86\xe4\x65\xb7\xf7\xb1\xef\xa9\xfb\xe9\x9c\x1d\xed\x76\xb4\x18\x29\xe6\x18\x7f\x5f\x27\xb4\x7a\x96\x4c\xa0\x2f\x0e\xa5\xd1\xcd\xcd\xd3\x0c\x61\x45\x2b\xe8\x0d\x70\x33\x7f\x42\xa0\x8d\x27\x62\x14\x92\x97\x03\x79\x3c\xbb\x0d\xb1\xc4\xee\x79\x37\x1a\xdf\x3f\xcd\x8e\x1c\x0c\x3b\x4f\xa1\x42\x22\xc9\x8e\x16\x19\x44\x56\xcc\xaf\x06\xec\x03\x6a\x7c\x87\xad\x6e\x3e\x39\xeb\xa9\x5e\xc4\x7e\x55\x9f\x60\x8a\xeb\x04\xcb\x46\xb7\x9f\xc7\x1c\x75\x6e\x1f\x30\x39\x76\x3a\x99\x3a\x0a\x4e\x8f\xc3\x8b\xff\x09\x00\x00\xff\xff\x79\xfb\x59\xf4\xdd\x3d\x00\x00") - -func confLicenseAfferoGeneralPublicLicenseV10Bytes() ([]byte, error) { - return bindataRead( - _confLicenseAfferoGeneralPublicLicenseV10, - "conf/license/Affero General Public License v1.0", - ) -} - -func confLicenseAfferoGeneralPublicLicenseV10() (*asset, error) { - bytes, err := confLicenseAfferoGeneralPublicLicenseV10Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Affero General Public License v1.0", size: 15837, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseApacheLicense10 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x56\xdf\x6f\xdb\x36\x10\x7e\xd7\x5f\x71\xc8\x4b\x1b\x40\x75\xd0\x6d\x1d\xd0\xee\x65\xb4\xcc\xc4\x04\x1c\xc9\x13\xa9\xa4\x79\x2b\x2d\xd1\x31\x37\x49\x14\x28\x29\x46\xfe\xfb\xdd\x51\xf6\xec\xa6\xd9\xba\x87\x01\x7b\x48\x44\x8b\xc7\xbb\xef\xfb\xee\x07\x95\xb8\xee\xd9\xdb\xc7\xdd\x00\x6f\xcb\x4b\x78\xff\xf1\xe3\x87\x77\xf8\xef\x23\xa8\x9d\x01\xd6\xe9\x12\x1f\x37\xde\x8d\xdd\x0c\x58\x5d\x43\xb0\xec\xc1\x9b\xde\xf8\x27\x53\xcd\xa2\xdc\x54\xb6\x1f\xbc\xdd\x8c\x83\x75\x2d\xe8\xb6\x82\xb1\x37\x60\x5b\xe8\xdd\xe8\x4b\x13\xde\x6c\x6c\xab\xfd\x33\x6c\x9d\x6f\xfa\x18\xf6\x76\xd8\x81\xf3\xe1\xe9\xc6\x01\x1a\x57\xd9\xad\x2d\x35\x39\x88\x41\x7b\x03\x9d\xf1\x8d\x1d\x06\x53\x41\xe7\xdd\x93\xad\x70\x31\xec\xf4\x80\xff\x0c\x3a\xa9\x6b\xb7\xb7\xed\x23\x94\xae\xad\x2c\x1d\xea\xc3\xa1\xc6\x0c\x9f\xa2\xe8\xfd\x0c\xbe\x86\xd4\x83\xdb\x1e\xb1\x94\xae\x42\xbb\xb1\x1f\x90\xc0\xa0\x11\x23\x39\xd4\x1b\xf7\x44\x5b\x47\x19\x5a\x37\xd8\xd2\xc4\xb8\x67\x7b\xa8\xd1\x13\x39\x38\x8f\xd5\x56\x2f\x80\x60\xb8\xb2\xd6\xb6\x31\x7e\x16\x45\x3f\x7c\x0b\x00\x03\x9d\x29\x70\x04\x80\xd4\xaa\x11\x41\xfd\xd7\x18\xe0\xc0\xab\x72\xe5\xd8\x98\x76\xd0\xc7\xc4\x5c\xa1\xe6\x0e\x77\x3c\x34\x7a\x30\xde\xea\xba\x3f\xe9\x1b\x92\x12\x8e\x9d\x41\x47\x3a\x3f\x4e\x79\xd7\xd5\x93\xf1\x83\xed\x29\xd4\xe9\x34\xb9\x47\x33\x7a\xb9\x35\x7a\x18\xb1\x2c\x28\xb1\x54\x00\x88\x37\x80\xef\xdd\x76\xd8\x87\xf4\x10\x6b\x74\xde\xd5\xfa\xf9\x05\x76\x5d\xfe\xd1\xba\x7d\x6d\xaa\x47\x72\xf8\x09\x2e\x14\x9d\x9c\xf4\x19\x90\x4e\x59\x8f\x95\x39\x73\x55\x99\x27\x53\xbb\x0e\x51\x6f\x26\x57\xe7\x75\x4a\x1a\x1f\x4b\xf0\x6c\x6f\xa9\xd4\x1a\x42\xd1\x7a\xf2\xfc\xbb\x41\xcf\x6f\x77\xc3\xd0\x7d\xba\xba\xda\xef\xf7\x33\x1d\xcc\x66\xce\x3f\x5e\x5d\xc2\xec\x22\x8a\x7e\x9a\x85\x16\xb8\x98\xce\x5f\x04\xc9\x0f\x3f\x40\x1e\x91\x5c\xbb\xb1\xad\x82\xc0\x17\x13\x41\x4c\x1c\x6c\x0c\xc5\xc7\x04\x39\x30\x6d\xe5\x3c\xa9\x11\x82\x36\x6e\x30\x47\x5a\x3d\xb2\xf0\x16\x5b\x08\xb6\xb8\xf1\x42\xab\x63\x67\x74\xde\x52\x9f\x78\xea\x85\x76\xea\x8a\xbe\xa7\xbc\x60\xe0\xd7\xde\xc7\xd0\xd5\x46\xf7\x54\x49\x98\x77\x64\x38\xb1\xfa\xf5\x44\x2e\x8a\x3e\xcc\x60\xfd\x2f\x20\x34\x98\xa5\x03\x99\x52\xd7\x98\x9b\x93\x12\xad\xf3\x61\xfb\x24\x4d\xd7\x19\x7d\xac\x3b\xeb\xa1\xd5\x8d\x89\xbf\x4b\x62\x2a\x91\x17\xc9\xc3\x8a\xfb\xf9\xd5\x0e\xd6\xed\xa1\x7b\xf6\x38\x08\x7a\x67\x28\x8f\x2f\x3b\xf9\x6f\x2b\x2a\xfa\xff\x2b\x2a\x8a\xd4\x52\x48\x90\xd9\xb5\xba\x67\x39\x07\x5c\xaf\xf3\xec\x4e\x2c\xf8\x02\xe6\x0f\xa0\x96\x1c\xd8\x9a\x25\xf8\xb8\xc9\xb3\x62\x0d\x5f\xbe\x30\x89\x46\x6f\xde\x00\x4b\x17\xf8\xf7\x00\xfc\xf3\x3a\xe7\x52\xa2\x7d\x96\x83\xb8\x5d\xaf\x04\x2e\xd1\x57\xce\x52\x25\xb8\x8c\x41\xa4\xc9\xaa\x58\x88\xf4\x26\x86\x79\xa1\x20\xcd\x14\xac\xc4\xad\x50\x68\xa6\xb2\x38\x84\xf8\xf6\x18\x64\xd7\x70\xcb\xf3\x64\x89\x3f\xd9\x5c\xac\x84\x7a\x08\x11\xaf\x85\x4a\x31\x1a\x5c\x63\x30\x06\x6b\x96\x2b\x91\x14\x2b\x96\xc3\xba\xc8\xd7\x99\x44\xb4\x48\x62\x21\x64\xb2\x62\xe2\x96\x2f\x66\x18\x1d\x23\x02\xbf\xe3\xa9\x02\xb9\x64\xab\xd5\xb7\x9c\x08\xb7\x92\x90\x64\xa9\xca\x05\x42\xcc\x72\x09\x73\x8e\x20\xd9\x7c\xc5\xa7\x48\xc8\x73\x21\x72\x9e\x28\xa2\x73\x5a\x25\xa8\x13\xe2\x5b\xc5\x20\xd7\x3c\x11\xb4\xe0\x9f\x39\x92\x61\xf9\x43\x4c\x7e\xd1\xa7\xe4\xbf\x15\x68\x84\x9b\xb0\x60\xb7\xec\x06\xb9\xbd\xfd\x8e\x24\x98\x81\xa4\xc8\xf9\x2d\x61\x46\x1d\x64\x31\x97\x4a\xa8\x42\x21\xe0\x2c\x5b\x48\x72\x2c\x79\x7e\x27\x12\x2e\x7f\x81\x55\x26\x83\x5a\x85\xe4\x31\x46\x50\x2c\x04\x46\x17\x28\x15\x6e\xe3\x7a\x5e\x48\x11\x44\x13\xa9\xe2\x79\x5e\xac\x95\xc8\xd2\x4b\x58\x66\xf7\x28\x0b\x62\x64\x05\x65\x8f\xd4\xcd\xd2\x40\x15\x15\xca\xf2\x07\x72\x4a\x1a\x04\xf1\x63\xb8\x5f\x72\x7c\x9f\x93\xa0\x41\x29\x46\x12\x48\x54\x2c\x51\xe7\x66\x18\x0f\x05\x54\x67\x1c\x21\xe5\x37\x2b\x71\xc3\xd3\x84\xd3\x6e\x46\x5e\xee\x85\xe4\x97\x98\x2b\x21\xc9\x40\x4c\x61\xef\x19\xc6\x2c\x02\x65\xca\x11\xa2\x9a\x96\x67\xf5\x19\x87\x4c\x82\xb8\x06\xb6\xb8\x13\xa1\xe8\x26\x63\xcc\xbd\x14\x87\x3a\x09\x92\x25\xcb\x83\xdc\x54\xe2\x5f\x8d\x10\x1c\x42\x3d\xb6\x71\x68\xdf\x27\x57\x8f\x38\x92\xf0\x0a\xa4\xd1\x74\xea\xec\x46\xe3\x8d\x8c\x3d\xd7\x50\x7f\x5b\xbc\xdf\xf0\x36\x1a\xe9\x6a\xc1\xf9\xb0\x31\x3b\x5d\x6f\x5f\x1d\x13\x34\x8c\xf7\x9a\x2e\x1b\xfb\x88\x37\x6b\x5d\x3f\xc3\x46\xd3\xcc\xc5\x63\xdd\xb8\xa9\x6d\x89\xd7\x5f\xa3\xc3\x57\xc8\x71\xa6\x1e\x06\xd0\xe1\x33\x22\x0d\x53\x5b\xd7\x90\xe0\x80\xc0\x0e\xa6\x1e\x97\x23\x4e\xa7\xd2\x35\x1d\x82\xc3\x21\xc2\xba\xae\x3e\x7c\x96\xe0\x57\x4b\xd1\xe2\xa8\xf4\xbd\x1d\x9e\x09\x91\xa8\x6b\xdb\x3a\x4b\xef\xfd\x46\xb7\xfa\x5d\xb2\xd3\x4d\xa7\xed\xe3\x61\x36\x37\xce\xd3\xbc\xa0\x89\x35\xdd\xbf\xae\x7d\x9d\xc5\x3f\x0f\x94\xbf\x06\x7a\x6f\xcc\x2c\xfa\x33\x00\x00\xff\xff\x40\xf3\x3f\x33\xab\x09\x00\x00") - -func confLicenseApacheLicense10Bytes() ([]byte, error) { - return bindataRead( - _confLicenseApacheLicense10, - "conf/license/Apache License 1.0", - ) -} - -func confLicenseApacheLicense10() (*asset, error) { - bytes, err := confLicenseApacheLicense10Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Apache License 1.0", size: 2475, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseApacheLicense11 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x96\xcb\x72\xdb\x38\x16\x86\xf7\x7a\x8a\x53\xda\x38\xae\x62\xe4\x24\x33\xb3\xc9\x6c\x86\xa6\x20\x1b\x53\x32\xa9\x26\x48\x3b\xae\xae\x2c\x20\x12\xb2\x50\x21\x09\x16\x48\x5a\xad\xb7\xef\x1f\xa0\x24\x5b\xee\xa4\xdc\x8b\x5e\x38\x42\x70\x39\x97\xef\xdc\x18\xb6\xb2\xd8\x2a\x5a\xea\x42\x35\x9d\xa2\xcf\xb3\xcf\x93\xc8\xb4\x7b\xab\x9f\xb6\x3d\x7d\x28\x2e\xe9\xcb\xa7\x4f\x9f\x28\xc3\x95\xc3\x4d\x61\x36\xfd\x4e\x5a\x45\x0b\x33\x34\xa5\xec\xb5\x69\x66\x14\x56\x15\xf9\x27\x1d\x59\xd5\x29\xfb\xac\xca\xd9\x64\x92\xaa\x52\x77\xbd\xd5\xeb\xc1\xdd\x22\xd9\x94\x34\x40\x87\x6e\xa8\x33\x83\x2d\x94\xdf\x59\xeb\x46\xda\x3d\x6d\x8c\xad\xbb\x80\x76\xba\xdf\x92\xb1\xfe\xd7\x0c\x3d\xd5\xa6\xd4\x1b\x5d\x78\x35\x01\x39\xb5\xad\xb2\xb5\xee\x7b\x55\x52\x6b\xcd\xb3\x2e\xb1\xe8\xb7\xb2\xc7\x3f\x0a\x42\xaa\xca\xec\x74\xf3\x44\x85\x69\x4a\xed\x1e\x75\xfe\x51\xad\xfa\xaf\x93\xc9\xe7\x19\x9d\x9b\xd4\x91\xd9\x1c\x6d\x29\x4c\x89\x7b\x43\xd7\xc3\x83\x5e\xc2\x46\x27\x50\xae\xcd\xb3\x3b\x3a\x02\x69\x4c\x0f\x50\x01\xce\x74\x47\x15\x24\x39\x01\xaf\x75\x35\xe5\x1b\x43\xa0\xae\xa8\xa4\xae\x95\x05\x90\x2f\x7f\x35\x00\x8a\x5e\x11\x38\x1a\x00\xd7\xca\x01\x46\xfd\xd3\x36\xd0\xc1\xaf\xd2\x14\x43\xad\x9a\x5e\x1e\x03\x73\x05\xe6\x06\x27\x96\x6a\xd9\x2b\xab\x65\xd5\xbd\xf0\xf5\x41\xf1\xcf\x5e\x99\x0e\x77\xfe\x35\xf3\x89\xa1\x9a\xf2\x23\xe2\x6a\xdf\x48\xd5\x4d\x51\x0d\x67\xcf\xed\x99\xef\x01\xe9\x0d\x54\xef\x83\xd1\xe9\xc3\xf5\x37\xa6\xcb\xe2\x47\x63\x76\x95\x2a\x9f\x9c\xe0\xaf\x34\x99\x66\xce\xed\x91\xcf\xe9\x51\x87\x20\x1e\xb2\xb2\x54\xcf\xaa\x32\x2d\xd4\xae\xf7\x5e\xd6\xaf\xd3\x96\x3e\x6c\xfb\xbe\xfd\x7a\x75\xb5\xdb\xed\x66\xd2\x5f\x9b\x19\xfb\x74\x75\x49\xb3\x29\x4d\xc2\x0a\x1c\x1a\xc0\xa8\xf6\x07\xd6\xe7\xb6\x00\xd4\x9e\x64\xdb\x2a\x79\xa2\x7a\x32\x42\xf7\x9d\xaa\x36\x07\x07\x01\x00\x5c\x61\x96\xa5\x6e\x28\x1c\x09\x6d\xcb\x8f\xad\xb4\xfd\xfe\x8d\xc8\x0e\xb1\xb5\xb5\xac\xaa\xa3\x60\x30\xfe\xf7\xc8\x78\x3a\xba\x31\xf5\xf2\xa6\xbf\xf6\x69\x3a\xc2\x44\x8e\xd0\x5a\xb9\x6a\x43\x2e\x18\x17\x21\x63\x51\x79\x08\x32\xc8\xd5\xa6\x57\x47\x82\x1d\x80\x59\x8d\x72\xa5\x0d\x0e\x46\x3f\x4f\x6e\x1c\x8b\xb0\xb5\xda\x95\xa4\x75\x65\xd7\x8c\x05\xd8\x75\xbe\xee\x17\x3f\xdd\x0f\xa8\xad\x94\xec\x5c\xd2\x22\x19\x10\xa6\x11\xee\xff\x5e\x18\x4f\x26\xff\x99\xd1\xea\x6f\x98\xe0\x20\x1f\x9c\x29\x00\x46\x95\x2f\x24\x7e\x57\x7f\xcc\x68\xfa\x7f\xf9\x03\x24\x65\x30\x3d\x1e\x60\x05\xa3\x8e\x88\x22\x53\xd7\x28\x8a\x60\xfa\xdd\xb1\xf5\xe2\xce\x05\xb8\xb8\x35\xb2\x56\xdd\xf7\xf3\x60\x6a\xeb\xb7\x83\x77\x21\xb8\xea\x7b\x27\xcf\x10\xc6\xec\x96\x0b\x12\xc9\x22\x7b\x08\x53\x46\x58\xaf\xd2\xe4\x9e\xcf\xd9\x9c\x2e\x2e\x42\x81\x8d\x8b\x0b\x0a\xe3\x39\xfe\x1e\x89\x7d\x5b\xa5\x4c\x08\x9c\x25\x29\xf1\xbb\xd5\x92\x63\x89\x77\x69\x18\x67\x9c\x89\x80\x78\x1c\x2d\xf3\x39\x8f\x6f\x02\xba\xce\x33\x8a\x93\x8c\x96\xfc\x8e\x67\xb8\x96\x25\x01\x65\xb7\xec\x27\xcf\x28\x59\xd0\x1d\x4b\xa3\x5b\xfc\x37\xbc\xe6\x4b\x9e\x3d\x7a\x8d\x0b\x9e\xc5\xd0\x46\x0b\x28\x0b\x69\x15\xa6\x19\x8f\xf2\x65\x98\xd2\x2a\x4f\x57\x89\x60\xe4\x0c\x9e\x73\x11\x2d\x43\x7e\xc7\xe6\x33\x68\x87\x46\x62\xf7\x2c\xce\x48\xdc\x86\xcb\xa5\x57\x18\xae\xc2\x08\x3f\x27\x17\x17\x49\x1e\xcf\xc3\x8c\x27\xb1\xf7\x22\x13\x14\x25\x71\x96\x72\x18\x9c\xa4\x82\xae\x19\x4c\x0e\xaf\x97\x6c\xd4\x0b\xaf\xe7\x3c\x65\x51\xe6\x9c\x7b\x59\x45\x20\x04\x6b\x97\x01\x89\x15\x8b\xb8\x5b\xb0\x6f\x0c\xae\x85\xe9\x63\xe0\xe4\x42\xa6\x60\xbf\xe5\xb8\x84\x43\x9a\x87\x77\xe1\x0d\x3c\xfd\xf0\x0e\x20\xb0\x8f\xf2\x94\xdd\x39\x0f\x40\x45\xe4\xd7\x22\xe3\x59\x9e\x31\xba\x49\x92\xb9\x70\x82\x05\x4b\xef\x79\xc4\xc4\x7f\x69\x99\x08\xcf\x2e\x17\x2c\x80\x86\x2c\xf4\x8a\x21\x02\xe0\x70\x8c\xf5\x75\x2e\xb8\x47\xc8\xe3\x8c\xa5\x69\xbe\x72\x5e\x5f\xd2\x6d\xf2\x00\x48\xb0\x31\xcc\x5d\x2c\x1d\x6b\xc0\x70\xae\x82\x57\x92\x3e\x3a\xa1\x8e\x81\x0f\x45\x40\x0f\xb7\x0c\xfb\xa9\xc3\xeb\x49\x85\x0e\x81\x00\xb1\x28\x7b\x7d\x0d\xfa\x00\x30\x7b\xe5\x23\xc5\xec\x66\xc9\x6f\x58\x1c\x31\x77\x9a\x38\x29\x0f\x5c\xb0\x4b\x44\x8e\x0b\x77\x81\x8f\x6a\x1f\x42\xe8\xcc\xbd\xcb\x2e\x62\xb0\x6a\x5c\xbe\xca\xcc\xc0\xc7\x95\xf8\x82\xc2\xf9\x3d\xf7\x29\x38\x5e\x46\x26\x08\x7e\xc8\x1a\x8f\x2c\xba\x3d\xe0\x76\xc9\x7d\x56\xb2\x28\xfa\x0e\x6d\xde\xcf\xd6\x67\x53\x0d\x68\x01\x98\x6e\xae\x15\xbc\x4c\xbd\x5a\xa2\xd3\xa3\x41\xd7\xe8\xff\x28\xb8\x52\x63\xd0\x0c\x6e\xe6\xa0\x5a\xd6\x6a\x2b\xab\xcd\xfb\x65\x35\x76\x9f\xda\xb8\x7e\xdb\xb8\xe1\x39\x16\x9b\x69\xde\x79\x77\xea\x4e\x9d\x52\xf4\xf3\x09\x80\xde\x64\xec\xe9\x03\xe1\xbc\x23\xb9\xbf\xb5\x74\x8d\x75\x68\xa1\xab\x1d\xd6\x95\x2e\x30\xfa\x6a\xe9\xbf\x6b\x0e\xb7\x0c\x66\x35\xc6\xba\x6b\xe5\xc7\x96\x71\xf8\x46\x89\xbd\x11\xb2\xa2\x08\x1d\x1f\x33\x01\x96\x93\x18\xd0\x4f\x0a\x53\xb7\xc0\x83\xa1\x17\xb6\x6d\x75\xf8\xe6\xc1\x27\x51\xde\xa0\x39\xda\x4e\x63\x5c\xc0\x18\x5e\x55\xba\x31\xda\xed\xdb\xb5\x6c\xe4\xc7\x68\x2b\xeb\x56\xea\x27\x0c\xe4\x3f\x03\x00\x00\xff\xff\xff\x79\xa1\xa5\xcc\x09\x00\x00") - -func confLicenseApacheLicense11Bytes() ([]byte, error) { - return bindataRead( - _confLicenseApacheLicense11, - "conf/license/Apache License 1.1", - ) -} - -func confLicenseApacheLicense11() (*asset, error) { - bytes, err := confLicenseApacheLicense11Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Apache License 1.1", size: 2508, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseApacheLicense20 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd4\x5a\xdf\x93\xdb\x36\x92\x7e\xd7\x5f\x81\x53\xd5\xd5\xcd\x54\xd1\xb2\x93\x4b\xee\x2e\xce\x93\xe2\x19\x27\xba\x73\x34\xae\xd1\xf8\x7c\xa9\x54\x1e\x20\x12\x94\x70\x26\x09\x2e\x40\x8e\x46\xfb\xd7\xef\xd7\x0d\x80\x04\x25\x79\xec\xad\xcd\xcb\x6e\xb9\x36\x23\x0a\x04\xfa\xe7\xd7\x5f\x37\xb4\x6c\x65\xbe\x57\xe2\x9d\xce\x55\xe3\x94\x98\xfd\xaf\xb2\x4e\x9b\x46\x7c\xbb\x78\x95\x89\xff\x96\x4d\x2f\xed\x51\x7c\xfb\xea\xd5\x77\x62\xb6\xef\xba\xf6\xf5\xcb\x97\x87\xc3\x61\x21\xf9\xad\x85\xb1\xbb\x97\x95\x7f\xd3\xbd\x9c\x3d\xdc\xde\xff\xba\x11\xcb\xf5\x8d\x78\x73\xb7\xbe\x59\x3d\xac\xee\xd6\x1b\xf1\xf6\xee\x5e\x7c\xd8\xdc\x66\xe2\xfe\xf6\xfd\xfd\xdd\xcd\x87\x37\xf4\x38\xe3\x55\x37\xab\xcd\xc3\xfd\xea\xa7\x0f\xf4\x64\x36\xfb\x66\x21\x6e\x54\xa9\x1b\xdd\xe1\x78\xb7\x98\xcd\xe6\x41\xa6\xb9\x70\x7b\x59\x55\xa2\x56\xb2\x11\x1d\x64\xed\x94\xad\x9d\x90\x4d\x21\x72\xd3\x14\x7e\xbd\x28\x8d\x15\xbd\x53\x99\xb0\xaa\xb5\xa6\xe8\x73\x7a\x9c\xf1\xaa\x42\xbb\xce\xea\x6d\x4f\x4f\x84\x74\xa2\xa0\x63\x54\x21\xb6\x47\xb1\x51\xb9\x7f\xfd\x1b\xec\x6c\x4d\xbf\xdb\x8b\x1f\x84\x29\xf1\x41\x63\x9d\xc9\xfb\x5a\x35\xdd\x28\x8b\xb1\x67\xc2\xe4\xa6\x3d\x5a\xbd\xdb\x77\xc2\x1c\x1a\x65\x05\xc4\xc0\x2b\xba\x3b\x0a\xd9\x77\x7b\x63\xf5\x5f\xfd\x49\x97\xd6\x76\x7b\xd9\x09\x1c\xb4\xb3\x12\xaf\x34\x3b\x5e\x14\xb4\xe6\x43\xd5\x4e\x56\xe2\x96\xb7\x3b\x3b\xb8\x6f\x48\x1d\x96\x55\x09\x99\xf3\xfb\xf1\x64\x28\x4d\x6b\x0d\xbe\x0a\xe2\x68\xe5\xfc\x71\x30\x59\x67\x4d\x05\xcb\x58\x15\x3f\x54\x2c\x62\x46\xb2\xd3\xd3\xbe\x29\xf0\x5a\x6e\xea\x1a\x07\x84\x25\xe2\xa0\xbb\xbd\xdf\xc1\x1f\xb2\x10\x6f\x8d\xe5\xb3\xdb\xde\xb6\x06\x01\x30\xda\x6d\x70\x63\x26\xe6\xe1\xfd\x39\x0b\xee\xc4\x95\xbe\xf6\x2f\x99\x83\xb2\x19\x5c\x63\xe1\x01\x3a\x58\x37\xfe\xef\x4c\x74\x46\xe4\x12\xae\xe4\x75\xfe\x21\x6b\x6a\x45\x2d\x1b\xb9\x53\xe4\x12\x3a\xcb\xf5\xf9\x3e\x08\x93\x89\xc3\x5e\xb1\xb2\xb0\x34\x9f\x28\xfd\xae\x6c\x81\x83\xa6\xb8\xc0\xa7\x2b\x8d\xd3\xd9\xf4\x6e\xaf\x5b\xda\xa3\xd4\x25\xec\xd5\x2a\x9b\xd3\xa6\x57\xdf\xbf\xfa\xd7\x6b\x3e\xc8\xc0\x0c\xc1\xb4\xa6\xef\x5c\x07\x8b\x92\x7d\xe1\x02\xab\x5c\xdc\x0b\x9b\x6d\x55\x03\x65\x73\x0d\x37\x4d\xf6\x4d\x64\x23\x47\xfe\x66\xfa\xb9\xb8\xc2\x5b\xf4\x97\x9d\x5f\xa7\xbe\xc4\x3f\xd2\xfd\x51\x17\x3d\xed\x62\x45\xea\x75\xa1\x9e\x20\x9b\x76\x74\x38\xa4\xac\xb5\x73\x1c\xae\x1c\x31\x31\xb0\x60\xf2\x24\x68\x36\x38\x21\x47\xd2\x20\x21\xea\xd3\x98\x69\xad\x2a\x95\xb5\x78\x91\xbf\x2d\xd9\xa6\x9f\x68\xf3\xda\x14\x1a\x8a\x48\xce\x86\x0c\x12\xe5\x55\xcf\x2a\x23\x6d\x44\x63\x3a\x51\xe9\x5a\xd3\x89\xf0\x8e\x33\x65\x77\xa0\x40\x71\x7c\x14\x0c\x5e\xc0\xbe\x31\x5b\x78\x8b\xf0\x55\x16\xb3\xb4\xd4\xbb\xde\xfa\x6f\x4a\x5d\x29\x4e\xef\xbb\xed\xff\xc3\xb5\xe7\x82\xca\xe6\xe8\x9f\xc1\xd4\x7d\xc5\x71\x5d\x5a\x53\xe3\xcb\x7c\x2f\x1b\xc8\x58\x09\xf8\xb7\x71\xb4\x46\xc6\xd0\xe0\x27\x55\xf8\x58\x0a\x29\xbc\x19\x78\xa3\x2f\xa8\x83\x40\x6f\x35\xa5\x80\x61\x81\x82\x3a\x3b\x78\x16\x12\xe3\xf1\x44\xb1\x41\xa3\x47\x8f\x93\x8e\x76\xf0\x79\x56\xab\x42\x4b\xd1\x1d\x5b\xaf\xde\x47\x63\x3f\x9d\x25\xed\x01\x0f\x59\x3e\xc6\x06\x8a\x96\x31\x74\x75\x13\x85\x86\x3e\xde\x38\x41\xfc\x5a\x16\x48\xf1\x47\xa9\x2b\xb9\xad\x62\x7e\x26\x58\x91\x11\xaa\x51\x10\xe5\x32\x04\x85\x4c\xb0\x06\xea\x62\xd9\x00\x36\xde\x16\x58\xa6\xd9\x70\xb2\xeb\x08\xca\xd9\x12\x83\x84\x57\x10\x57\x3d\xc9\xba\xc5\x69\x78\x05\x80\x8a\xf0\xf4\xaf\xd0\x9a\x65\xdb\x2a\x9c\xf6\x84\xf0\xaf\xcc\xe1\x9a\xb4\xbd\x51\x56\x3f\xc2\x42\x8f\x4a\x90\xe2\x6e\x7e\xea\x51\xda\xf7\x6b\x74\x8d\x62\x6e\xa5\x23\x97\x34\x9c\x36\x05\xed\x4e\x51\x8b\x38\xf0\xf8\x41\x87\xb0\x2b\x28\x86\x0f\x7b\x9d\xef\xf9\x31\x5c\xd0\x01\x73\x11\x22\x56\x3d\x6a\xe7\x83\x59\x36\x30\x41\x8c\x6c\x05\x1b\x1a\x1b\x3f\x45\x88\x98\xc6\x3f\xd7\x10\xe5\xe0\x73\xb6\xac\xc4\x01\xa6\xe2\x60\xc6\x0b\x7a\xa7\x1b\xec\x7f\xee\xc9\x67\x10\x71\xf0\xd3\xa9\x99\x82\x95\x28\x22\x83\x5f\x78\xe3\x80\xd5\x56\xd5\x12\x96\x72\xaa\x95\x96\x3d\x4f\xfa\xb3\xd0\xb5\xb2\xaa\x3a\x22\x8a\x9b\x4f\x6c\xa0\x2d\xbc\x4f\x7e\x6f\x64\xad\xae\xa3\x2b\x35\x20\xc2\x96\x32\x67\x41\xb2\xa9\xd9\xce\x04\x21\x2b\x28\x53\x92\x2f\xdf\x10\x80\x86\x7a\x79\xd1\x8f\xa7\x11\x3c\xa6\x17\x03\x66\x34\x51\x48\x91\x08\xa4\xc3\xd9\xb4\xcd\xd4\xde\x14\x87\x45\xac\xe4\x2c\x3d\xb4\xe7\xf5\xf8\xe6\x73\xa2\x66\x49\x48\x77\x84\xb5\x06\x87\xc2\x28\xae\xdf\x22\xb7\x43\x72\xc7\xba\xcd\x71\xc2\x72\xb2\x48\x21\x90\xf9\x88\xcf\x14\x67\xc3\xc5\xe4\x79\x74\x4e\x4a\x3c\xe1\x22\x1f\x4c\x31\xbb\x55\x30\x5a\x19\x15\x3f\xd9\xf9\x6b\x2b\xe7\xa0\x47\xac\x9d\x03\x30\x62\xb9\xaa\x90\x32\xd6\x00\x0e\x33\xb2\xf3\x56\x56\x1c\x17\x07\x4b\x6f\x34\x5c\xbc\xfb\x26\xd8\x57\x50\x24\xc7\xa0\x18\x0c\x42\xf6\xe8\x92\x50\x67\x0b\x7f\x09\xfa\xa7\xfb\xe2\xdf\x28\x07\x50\x4a\x57\xf4\x5a\x05\xba\x85\x7d\x92\xe2\x30\x90\x08\x77\x74\x9d\xaa\x9d\x07\x51\xd4\xb2\x5e\x11\x70\xe7\x5c\x81\xc2\x77\xde\xa9\x54\x5d\x7c\xb5\x1f\x98\x49\x6a\xd6\x6c\xaa\x4a\x39\xb5\x27\xd9\x07\x9c\x2f\xef\x1d\xd7\x4d\x3e\xab\x66\x0c\x0b\x11\xfa\x91\xb1\x88\xd4\x53\x4f\x51\xd9\xa9\x66\x31\xb2\x20\xb8\x6b\x75\xde\x9b\xde\x21\xb2\x6a\x69\x3f\x11\x28\x25\xbc\x02\x2e\x73\x7a\xd7\x30\xee\x22\xa8\xc8\xfe\x6c\xba\xcb\x31\x05\x30\x99\xaf\x61\x51\x29\xd2\x1c\x5b\xcc\xd3\xa4\x3b\xe1\x98\x83\x92\x31\x73\x9e\x09\xc7\x49\xe4\x01\xb3\xea\x93\x83\xc4\x1e\x02\x6c\x15\xe2\x03\xa4\x4a\x31\xa2\x42\xd0\xc9\x09\x08\x3a\xa7\xfe\xd2\x23\x1e\x2a\x3a\x2a\x37\xb0\xa8\x2f\x83\x44\x00\x93\xb4\x01\x50\x7c\xbb\x10\x3f\x13\x0f\xa1\xd3\xde\x0c\x9a\x46\x2a\x22\x36\xbd\xc7\xf5\x10\x78\x17\x59\xfb\x19\x40\x2a\x14\x23\x91\xd8\x42\x50\xae\x43\x48\x26\x3c\x8c\x0d\x60\x50\x50\x0b\x64\xa8\x55\x5d\x4f\x61\x0f\x44\xaa\x8a\x83\xa6\xa2\xdd\x98\xe6\x05\xbb\xd4\x41\x39\xfa\xf8\x02\x94\xc1\xee\xa8\x2b\x30\x47\x59\x75\xc7\x17\xa5\x55\xf8\xa4\xc1\x81\x1e\x4d\xce\x98\x3a\xfa\x28\x74\x32\x74\x48\x6c\x22\xb0\x16\xe9\xd1\x52\x38\x9e\xc1\x10\x85\x61\xdb\x6f\xf1\x16\x4c\x85\x78\x6b\x2b\x79\x4c\x9e\x40\x42\x5f\xd1\x1c\x3f\x09\x75\x3a\x6d\x47\xd4\x14\x16\x99\x33\x9e\x9d\xf2\xb9\x4a\x09\xfb\xff\x7b\x62\xff\xf7\x92\x20\xf0\x9f\xce\xf8\x57\x78\x41\xb5\x1d\x25\x06\x48\x76\x17\x29\x06\x84\x72\x9e\xf6\x5f\x8b\xd6\x6b\x96\x38\x07\x94\x15\xdb\xec\xe5\xa3\x62\x66\x94\xf9\xbe\xcf\x94\x25\xb1\x22\xc0\xb0\xaa\x20\x98\xff\x7f\xe4\xbd\xb1\x9d\xb7\xfb\x98\xb3\x9e\x3e\x06\x0e\xf5\x31\x12\x13\x22\xb4\xe4\x82\x78\x92\x6c\xdb\x8a\xda\x26\xd3\xc0\x9b\x6c\x47\xc2\x96\x20\x4e\x5e\x49\x0d\x8b\xfa\xb5\xac\xca\xf6\xe8\x5f\x4f\xed\x37\x60\x59\x83\x7c\x73\x4e\x5a\xcd\x59\x55\x5a\x60\xc4\xd0\x16\x6a\x3b\x49\xd2\x2b\x77\x8d\xe6\xcd\x34\x2a\x54\x20\x00\x13\xaa\xfb\xc0\x6c\x2f\xbf\x10\xba\xb3\x10\x4d\x10\xd6\x53\xa2\xa9\x40\x71\x2d\x19\x3b\xd6\x96\x85\x58\x95\xec\x55\xdd\x38\x60\x08\x05\xe5\x60\xf0\x4e\xef\xfc\xb1\x72\x27\xe9\x6b\x86\x9f\xd0\x62\x5e\x8d\x65\x02\x5c\xd3\x1a\xe7\x5e\xb0\x49\x48\xe8\xdc\xf4\xc4\x3c\xfc\x67\xf8\x53\x8a\x4a\x1e\x5c\xaf\x3b\x52\xac\x52\x3b\x0f\xc3\xb0\xcc\x20\x30\x81\xcf\x14\xa9\x9e\x83\x1e\x46\x65\x2f\xac\x4b\x3a\xc8\x7c\x34\xfc\x31\x2a\x11\x6d\x5d\x33\x97\xc3\x06\x9e\xc4\x4c\x63\x6a\x6c\xa7\x42\x84\x47\x82\x3d\xe6\x46\x28\x31\x91\x95\x78\x7c\xa6\xa4\x22\xcf\x28\x0a\xdf\x50\xeb\x0b\xfa\x18\xc2\x68\xb0\x1f\xf6\xa1\xae\xa7\x40\xce\x7e\xb7\x10\xf7\x2a\x1d\x48\x2c\xf8\xc4\x5a\x1e\x47\xcc\x39\x45\x09\x20\x94\x56\x6e\x42\xa3\x9e\xa1\x45\x6c\x71\x62\x58\x38\xa6\x07\xfc\x70\x68\x10\x35\xc0\x7f\xd1\xcb\x9e\x76\x7a\x5c\x1d\x3f\xcb\xc6\x07\xe6\xcf\xba\xb3\xa4\x4a\x79\xc7\x95\xa6\x02\xf9\xf7\xa5\x33\x42\xca\xeb\xd9\xec\x4a\x5e\xfb\x75\x3d\x02\x66\x47\xd2\x91\x30\x9e\x64\xc3\x53\x1a\xaa\x10\x96\x7c\x49\x19\xdf\xc0\x9c\x42\xd4\x8f\x24\x2e\xce\xd8\x26\x67\xf8\x59\xc1\xc8\x29\xa9\x4d\xa0\x16\xd3\xcf\x11\x2c\xc5\x02\x58\xb3\x6e\xc8\xe1\xbe\x15\xf2\x58\x33\x44\x21\xed\x44\x9d\xe5\x8e\xd5\x54\xfe\xed\x78\x52\x9e\x9c\x64\x55\x87\x3c\xc8\x22\x79\x4c\x3a\x4c\x26\xc4\x90\xe0\x82\x4f\xc2\x01\xa3\x3b\x33\x1e\xcd\x0c\x55\x27\x0b\xc1\x98\x11\x2a\x15\x8a\x28\x86\x77\x0a\x1a\xb3\x21\x1b\xa2\xdc\xdc\x07\x5f\x38\x7b\xc4\xb1\x91\xd0\x78\xb8\x8a\x6f\xb2\x20\x85\x61\x3e\x07\xf8\x26\x45\xc8\x40\x3e\x19\x6c\x17\x37\x39\x55\x20\x9a\xa1\xb8\x26\x9c\x18\x3c\x16\x7a\x15\x72\xd3\x7c\x7d\xf7\xb0\x7a\x73\x3b\x47\x36\x3c\x75\x6c\x3b\xca\x86\xb8\x27\x31\xcc\x34\xda\x93\x1c\xfc\x1a\x5b\x79\xbb\xc7\xce\x48\xc2\x03\xb2\x18\x8a\xf6\x30\xfb\xba\x60\x28\xc2\x02\xc9\x43\xbe\x80\x1d\x9c\x92\x5e\x54\x16\xf2\x4f\xb7\x14\x87\x05\xde\xac\x94\x74\xd4\x03\x0c\xf3\xa3\x31\x4f\x40\x10\x70\xc0\xeb\x28\x92\x8c\xf2\x8c\x96\x1b\x35\x2f\x52\x2b\x5e\xf6\x4c\x82\x8a\x93\x70\xb0\xa7\x13\x0b\x5d\x8e\x79\x4c\x95\x65\x37\x96\x8b\xf3\x5d\x8d\xcd\x46\x01\x03\xab\x49\x86\x21\x81\xd8\x5e\xd0\xbe\xe4\xa8\xe5\x3a\x8a\x86\xc4\x1b\x1c\xdb\xd8\xe2\x05\xa9\x71\x1c\xec\xdb\xd0\xd8\x86\xfa\x34\xd4\x57\x25\xd1\x0d\x3d\xec\x7d\x83\x90\xe2\x42\xe2\x29\xae\x9f\xbe\x7b\x1b\x26\x3e\xa0\xbc\x63\xef\x44\xe5\x99\x11\xd3\xfb\x8c\x51\xe0\x38\x19\xa5\x0e\x10\x8b\x26\x93\xfe\xb6\x44\xc7\x2f\xc6\x4d\xd0\xfc\x6b\xf3\x18\xb6\x74\x30\x2b\xd7\x2f\xa2\x57\x74\x80\x6a\x8a\xbe\x8e\xbc\x6b\xe2\xe1\x98\xbc\x3e\x53\xa7\xd0\xca\xe6\x8a\x3d\x30\xd4\xbb\x18\xd4\x3c\xc8\x00\x81\xf7\x05\xd0\xf6\x3e\x4a\xbc\xc2\xe7\xe3\xe3\x8b\x4a\x8f\x6c\x97\xf9\x56\x1d\x3a\x43\xfe\x7e\xda\x93\x93\x49\xe9\xf5\x20\x67\x2a\x1c\x85\x98\x26\xba\x35\x21\x66\x7f\xc7\x54\x9e\x37\x48\x86\xf2\xa6\xbc\x20\x01\x2f\x2b\xb9\x2f\x39\x7e\x86\x1c\xa7\xc3\x99\xc1\x9e\xbc\xd3\xd7\x5c\x05\x4c\x6a\xd0\x40\x0e\x69\x1c\xc8\xbc\x6f\x48\x92\x44\x9f\x13\x92\x3a\x1a\xfb\x7b\xa6\xdc\x61\x3e\xeb\x1b\xa2\x91\xcd\xb8\x85\xf8\xd0\xa0\xa8\x38\x0e\x21\xf5\x84\xfd\x73\x4d\x0d\x16\x6f\x97\x0e\xa9\x49\xd5\x13\x1e\x74\x79\xb4\xf1\xec\x38\x83\x4e\x39\x6d\xf7\x3d\x65\xd9\xa6\xd3\xc3\xaf\x6b\x0a\x22\x6f\x20\xd1\x92\x18\xf0\x2f\x7b\xda\x15\xde\x5d\x08\xf4\xb6\xb4\x7c\x98\x97\x33\x3c\x6f\x8d\x6f\x07\x28\xb3\x76\xdc\x52\x10\x1e\xb3\x38\xae\x07\xc2\x3a\xe5\x33\x28\x49\xdc\xb0\xb9\x2f\xaa\x7e\xfc\x05\x3b\x0d\xc4\x7c\x87\x3e\x82\x23\xf7\x18\x42\x9c\x7b\x01\xf5\xa4\xf2\x3e\xd2\xc5\x51\x71\x8b\x0e\xd9\xfa\xe9\xfd\x29\x1b\xa6\x39\xed\x7f\x00\x80\x62\xe1\x75\x04\x46\x09\xe9\x2b\x0c\xe3\x55\xe7\xf9\x61\x32\x80\x27\xeb\xc6\x1b\x0a\x2e\xdb\x3c\x78\x73\x49\x0d\xa7\x01\x88\xb2\x8f\x34\x78\x0d\x1f\x21\x4a\x88\x46\xbf\x38\x86\x5f\x14\x94\x2b\x52\xe8\x85\x2c\x5a\x70\x1d\xc6\xf4\x54\xf4\x1c\x4c\x4e\x65\x8f\x7d\x85\x92\x68\x6a\xba\x95\x23\x09\x60\x4a\xd4\xe1\x1c\x1a\x4d\xc7\x6f\x67\x43\xb7\x98\x0b\x71\x59\x40\xdc\x0b\x80\x0b\xa3\xfc\xe7\x42\xdc\x68\xc7\x04\x9e\x26\x61\xa5\xf8\x08\x22\x05\x13\x1c\x87\x40\x1e\x24\xdc\x1e\x7d\xa3\xe4\xfb\x39\x10\x7d\x06\x43\xf2\x10\xd3\xe9\x71\x26\x92\x8d\x2e\x09\xa9\xea\x46\x09\xaf\x48\xc4\xb3\xf6\x73\x58\x47\x34\x62\xe2\xb8\x6b\x9a\x75\x00\x6f\xe7\xcb\x8d\x58\x6d\xe6\xe2\xa7\xe5\x66\xb5\xc9\xc4\xc7\xd5\xc3\x2f\x77\x1f\x1e\xc4\xc7\xe5\xfd\xfd\x72\xfd\xb0\xba\xdd\x88\xbb\xfb\xf4\x36\xf2\xee\xad\x58\xae\x7f\x13\xff\xb3\x5a\xdf\xc0\xde\xda\xdf\x8f\x3d\xd1\x04\x8c\x63\x59\x73\xea\x17\xc9\x10\x6c\x8c\x7f\x9e\x82\x0d\x77\x00\x47\xb4\x51\x6c\x12\x66\xe6\xf6\x24\x83\x1e\x56\x0f\xef\x6e\x33\x18\x75\xfd\x62\xb5\x7e\x7b\xbf\x5a\xff\x7c\xfb\xeb\xed\xfa\x21\x13\xbf\xde\xde\xbf\xf9\x05\x92\x2d\x7f\x5a\xbd\x5b\x3d\xfc\xc6\x51\xf1\x76\xf5\xb0\xbe\xdd\xf8\x9b\xd2\xa5\x78\xbf\xbc\x87\x27\x3e\xbc\x5b\xde\x8b\xf7\x1f\xee\xdf\xdf\x6d\x6e\x7d\xf9\xf2\xf7\x2d\x15\x4d\x7d\x21\x6d\x8b\x83\x34\x4f\x84\x79\x3a\xee\x3b\x91\x21\xe3\x5a\x18\xae\xb5\x9a\x78\x25\x2b\x56\x22\x54\xe8\x4b\x0e\xa6\x11\x02\x93\x69\x98\x67\x9c\xce\x81\x36\xb0\x72\x56\x3b\x86\x57\x67\x72\x3d\xb4\x60\x1e\x59\xc3\x8d\x14\xf3\x9b\xf4\x4a\xea\xbc\x69\x42\x20\xfd\xd7\x02\x1f\xa2\xdd\xe8\x8d\x77\x5a\x6e\x75\xc5\xf7\x87\x2b\xaa\x6c\x02\x64\xa1\xe9\xf8\x78\xbf\x01\x1e\x55\x3c\xd3\x82\x68\x68\xe4\x26\x57\x06\x88\x89\x2e\xed\x3c\x1b\xb5\xab\x34\xb8\x49\xae\xae\xb3\xe1\xda\x2f\x3b\xb9\xf7\xeb\xbf\x18\xb0\x57\xbe\xf8\xd2\xf8\xb5\xd2\x5b\x26\x3a\x2c\xd0\x8e\xda\x5a\xd8\x3b\x1e\xd3\xd1\x35\xab\xbb\xfe\x7c\x80\x7b\x50\x9b\x60\x38\xf5\xf0\x84\x5c\x7c\x58\x68\x2f\xd9\x67\xb2\x96\xbb\xe9\xb8\x95\xde\x8b\x77\xa0\xe3\x6d\xa8\x6b\x15\x5d\x2f\xf2\x42\xe4\x02\x48\x9d\x9f\xf4\x12\x05\xf0\x83\x3a\xba\xed\x08\xdb\x45\xc8\xa4\xc1\x0b\x64\xa5\x89\xa3\xf5\x97\x87\x5c\x29\xfd\x85\xda\x29\xc4\xb3\xbd\xfa\x01\x09\x7a\xff\x04\x8d\xad\x77\x54\x8a\x75\x3e\x57\x9f\x9d\x10\x47\x49\x48\xc9\xca\xf8\xe8\xdb\x19\x53\x1c\x74\xe5\xc7\x45\xe8\x9e\x3b\xd3\xb6\x92\x06\x43\x54\x6b\x7b\x12\xb3\x94\xba\xea\xad\x2f\x03\xb2\x2a\xfb\x66\x24\x0a\x5c\x77\x26\x17\xda\x34\xaa\xa5\x18\x4c\xf5\xf6\x87\x29\x87\x40\xa0\x88\x22\x3a\x7a\x36\x8d\x19\xa6\x9f\xb2\x78\xd4\x7c\xbb\x54\x86\xbb\x68\x84\x70\x50\x36\xde\xdd\x86\x8d\x11\xc2\x3f\x2c\xc4\x32\x27\x60\x26\x85\x23\x0e\xd2\x81\xcb\xb1\x18\x26\x51\xfd\x71\x4f\x9c\xf5\x73\x69\xf6\xec\x75\x46\x24\x6c\xf9\xde\x18\x3f\xe9\xe2\x99\x56\xb8\x72\xe4\x59\x1a\x9c\x58\x2a\xce\x7a\x3c\x65\xa9\x64\x93\x2b\x2f\x75\xeb\x47\x5d\x01\x97\x8e\x1c\x44\xaa\x6e\xf8\x7a\x7c\xb8\xe7\xaa\xa2\xa4\xc2\x6c\xab\x30\x9f\x60\x0e\xf0\x92\xc0\x81\x88\xa1\x1f\x7a\x43\x7a\x0a\xf8\xc0\x81\x92\x9c\x16\xbf\x98\x03\x11\x7c\xdf\xef\x0c\x86\x61\xa3\x25\x5b\x8e\xda\xf0\x4d\x3c\x71\x74\x00\xc0\x40\x43\xc3\x98\x9a\xc7\x72\xe1\x31\x81\xdb\x08\x6d\x2c\x23\xb3\x86\xe9\x54\x7b\x1c\x26\x24\x9e\x0d\xf3\x3d\x3a\x44\xfb\x69\x16\xe7\xa7\x4f\x4f\xb6\x41\x89\xbd\x0a\x55\x82\x9b\xfb\xb5\xa0\x8c\x17\xea\x0d\x4c\x5c\x33\x58\x44\xd6\x39\x5a\x0b\x31\xdf\x5b\x3b\xde\x46\x84\xf9\x1f\x10\x12\x2d\x22\xf1\x70\x3f\x22\xcb\xce\xa3\x6e\x7b\x0c\x15\x9c\xc4\x3f\x92\xa6\xa3\xd5\x06\x66\x7b\x48\xe2\x2a\x21\x59\xc3\xf9\x88\xc3\xdb\xf5\x0d\x95\xaf\x4b\x3f\xb2\x99\xcd\x96\xef\xdf\xe3\xfb\xd5\xff\xbd\x26\xf7\x70\xbb\x0a\x88\x3b\x86\xcb\xda\xc9\x0f\x7c\xf0\x1d\x0b\x71\xf0\x33\xfc\x87\xaf\x5c\x9a\x85\x8b\xe2\x93\x96\x76\x6b\x10\xed\x16\x3d\x62\x17\x1b\xe8\x6c\xe4\xcd\xa5\x56\x55\xe1\x04\xf0\x19\xb9\xe9\x91\x77\x4b\xb7\x3d\x0a\x31\x36\xff\xfd\x8f\x39\x71\x12\x6a\x89\x43\x75\x39\xc6\xe0\x60\x98\x0b\x2d\x4d\xd2\xf4\x2d\xc4\xd5\x8d\x69\xfe\x6d\x9c\x07\xd0\x19\x71\xc3\x7f\xb9\xe6\x3e\x92\x1b\x2d\x87\x7a\x0d\xf7\x02\x77\x87\xa3\x03\x41\x4e\x2a\xa3\x47\x11\x84\xb8\x3b\x02\x53\x9f\x86\x3b\x24\x6e\x39\xfd\x99\x48\x66\xbc\x52\x39\xba\x0e\xf0\xab\x43\xb3\x26\xfd\x2a\x1f\x06\x08\x17\xe2\x73\xbe\xbd\x60\x2a\xd6\xc6\x62\x17\xef\xa3\xb6\x6a\xbc\x75\x37\x5e\x12\x47\xaf\xcc\x21\x0a\xcf\x1d\x09\x0d\xe7\x84\xd1\xd3\x4b\xa3\x70\x73\x4f\xa2\x21\x82\x34\x15\x41\x6f\x9a\x78\x4d\x35\x8c\x00\xc6\x36\x5b\xda\x7c\x4f\x17\x79\xf0\xed\x78\x27\xf3\xfb\x11\xff\xfb\x43\xfc\xce\x82\x42\xb0\x93\x7b\xa9\x3f\x66\xb3\xe0\xf3\x22\x69\x0f\xa6\xd1\x90\x89\xe4\x97\x61\xe2\x8a\x16\x0c\x3f\xd0\xba\xfe\x51\xcc\x22\x15\xa7\x8c\xf5\xe5\x22\x4c\x3d\x23\xad\xd5\x4d\x68\xad\x18\xb1\x86\x20\x19\x70\x65\xe8\x57\xcd\x96\x67\x2e\x72\x32\xe4\x89\x31\x29\xbb\xd9\x97\x7e\x87\xf6\x0e\x44\x76\xbd\xb9\x7d\x01\x39\x67\xb3\x7f\x80\xae\x0e\x3f\x73\x99\xa5\x63\x99\xb3\x1f\x5f\xd0\x74\x37\x5d\x70\x91\x98\xce\xfe\x24\x66\x0a\x33\x6d\x94\x9a\x1c\x1f\x03\x97\x89\x02\x22\x03\x4a\x35\xbb\x1e\x01\x85\xb2\x0b\x9c\x6e\x4e\x7f\x3a\x44\x71\x3a\x1b\xc9\xac\x3b\xd7\x68\x31\xfb\x5b\x00\x00\x00\xff\xff\x33\xa0\x81\xf5\x15\x28\x00\x00") - -func confLicenseApacheLicense20Bytes() ([]byte, error) { - return bindataRead( - _confLicenseApacheLicense20, - "conf/license/Apache License 2.0", - ) -} - -func confLicenseApacheLicense20() (*asset, error) { - bytes, err := confLicenseApacheLicense20Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Apache License 2.0", size: 10261, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseArtisticLicense10 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x58\xcb\x72\xdb\x3a\x12\xdd\xeb\x2b\x50\xde\x4c\x5c\xa5\xa8\x6a\xde\x8f\x9d\xc6\x56\x6e\x58\xe3\xd8\x2a\x59\xbe\x77\xb2\x04\x49\x48\x44\x4c\x02\x1c\x00\x94\xa2\xf9\xfa\x39\xdd\xe0\x53\x8f\x54\x16\xb3\xb8\xb9\x92\x48\xf4\xe3\xf4\xe9\xd3\x0d\x6f\x0b\x25\x96\x2e\x68\x1f\x74\x26\x9e\x74\xa6\x8c\x57\xb3\xb5\x53\xb2\x4a\x4b\x35\x9b\xd1\x63\x6d\x82\x32\x41\xd8\x9d\x08\x85\xf6\x22\xb7\x59\x53\xd1\x0f\xf8\x1c\xac\xf0\x41\x06\x85\x27\x4a\x64\xd6\xe4\x3a\x68\x6b\xbc\x68\x4c\xae\x9c\x38\x16\x3a\x2b\x84\x14\x6b\x99\xbd\xcb\xbd\x12\x95\x3c\x89\x94\xde\xab\xb5\xca\xe7\xc2\x37\x78\x1a\x0a\x19\xf8\xf4\x83\xad\x4f\x4e\xef\x8b\x20\x3e\xdb\x92\x4e\x57\x12\x8e\xf1\x9f\x17\xde\x56\x4a\x78\x85\x88\xa4\xc9\x14\x05\x22\xbb\x88\xe1\x33\x38\x5b\x0a\x7b\xc0\x09\x32\x93\xab\x83\x2a\x6d\x5d\xf5\x11\x2b\x51\x47\xf7\x73\x8a\xa7\x54\x62\xaf\x0f\xda\xec\xf9\x49\xe3\x95\xf3\x67\xaf\xf1\xe7\x18\x08\xb2\xc3\x1b\x42\x9a\x5c\xe4\x70\xe7\x74\xda\xb4\xa9\x76\x19\x69\x83\xf4\x2a\xeb\xd4\x47\xeb\x3e\x96\xca\x7b\x91\x35\x3e\xd8\x4a\xba\x93\xd8\x49\x5f\x00\x8c\xb9\xa8\xcb\xc6\x4f\xad\x56\xf2\x1d\xdf\x94\xf4\xd6\x48\xc0\x0c\x0b\xb9\xde\xe9\x4c\x32\x78\x8b\xd9\xec\x51\xed\xb4\x89\x50\xfe\x63\x36\xbb\x6b\xbd\xdd\xe1\xc8\x8e\x02\x86\x85\x88\x77\x59\xaa\x8c\xde\xa2\x14\x76\xc8\xcd\x8f\xe2\xcc\x45\x7a\xba\x0a\xec\x3c\x26\xa4\x9c\x3e\xc0\xe1\x41\xb5\x00\xa0\x0c\xd7\x0c\x66\x08\x93\x8c\x85\xc2\xd9\x66\x8f\x7a\xa9\xef\xa1\x91\xe5\x24\x64\x44\x7c\xf7\x1a\x60\x55\xba\x5c\xfc\x8a\x08\xf1\xdb\x38\x58\x2e\xf4\x40\x03\xbd\x13\x3a\x88\x42\x7a\x61\x6c\x00\x21\x94\x69\xad\x11\x29\xac\xe3\x27\x93\x5f\x19\xe6\x2c\xb3\x2e\xe7\xfa\x1f\x75\x28\x38\xb3\xa3\xf6\x85\xea\xeb\x77\x9e\x27\x45\x75\xfe\xdb\x1d\x91\xf6\x58\x58\x45\x74\xc1\x47\x23\xab\x68\x3e\xe2\xd9\xbd\x8c\x20\xfa\x2f\x5e\xec\xac\x1b\x13\x84\xec\x7e\xb5\x0d\x9b\x3a\xd9\x66\x4e\xf9\xe0\xff\xbf\x73\x44\x0d\x6d\xde\x89\x5c\x32\xb5\x4d\x60\x1b\xf4\x0d\xe7\xfb\xba\x44\xea\xe1\xe8\x7a\xb0\xb6\x19\x98\xd0\x1d\xd9\x29\xd5\xc6\x0a\xf4\x29\x58\x78\x10\x99\x34\xe2\x1b\xf8\xa5\x77\x27\x61\x63\xcc\xa9\xf4\x9a\x11\x40\x1e\x5a\xe2\xb8\x0f\x73\x91\x37\x75\xd9\x96\x46\x64\x85\x74\x7b\xe5\xe7\x22\xe8\x8a\x5b\xa7\x56\xb6\x2e\x89\xb9\x07\x5b\x1e\x08\x71\x62\x83\xb7\x30\xb8\x10\x1f\x90\x17\x50\x2d\xcb\xb6\x32\xa8\xe1\x7f\x1a\xed\xa8\xfc\xb6\xf7\xac\x43\x47\xc0\x4b\x66\x21\x41\x18\x2a\x4f\x03\x45\xab\x3a\xe6\x8c\x4f\x55\x03\x4e\x9f\x04\x88\x56\x52\x4c\x02\x65\x46\xf3\x48\xf7\xae\x42\xe4\x5f\x05\x0f\xf0\x2a\x23\xdc\x80\x60\x71\x0f\x74\x3e\x39\xa5\x60\x71\x79\x90\xba\x24\x8c\xee\x90\xab\x34\x3e\x1e\x31\x96\xde\x23\xa4\x62\xa2\x79\x5f\x2d\x1d\x54\x85\x7f\xbc\x2a\x77\x48\xbe\x88\xe4\x2d\x94\xeb\x65\x08\xe7\x7c\x0f\x03\x71\xa0\x00\x12\x65\x27\x0d\x74\x7c\x21\x92\x20\x64\x09\x70\x46\x1e\x9d\xca\x34\xf4\xcb\x84\x9e\x78\xec\x89\x8c\x02\xa8\x41\x26\x00\x53\x54\x41\x7a\xc5\x83\x67\x63\x7d\xc4\x6f\xf4\x7a\xa6\x34\xfb\x0e\x60\xc1\xef\x17\x82\xd0\x27\x3b\x2c\x0f\x54\x16\x48\x15\x3e\x1c\xf1\x13\x28\x90\xa2\xa0\x55\x14\xcf\xde\xb5\xb7\x8d\x43\x47\x20\xe7\xaa\xfb\xe9\xbc\x11\x7b\xdd\xee\xda\x8f\xda\x87\xd8\xe9\x14\xc5\xca\xed\x0e\x8d\x72\xf6\xa0\x73\xee\x73\xe4\x48\x64\xeb\x48\x84\x00\xc0\x87\xd6\xb8\x45\xb9\xb5\x41\xfb\x0f\xbd\x02\xa6\x60\x6a\x78\x8e\x57\x7a\x6f\x33\xcd\x7a\x01\x24\xb2\x52\x82\x73\x8e\x04\xed\x0f\x43\x72\xb2\xae\x51\xcd\xb4\x01\xc7\xf5\x77\x22\x66\x6d\x5d\x90\xa9\x2e\x89\x1b\xfc\x13\x9b\xb2\x54\xab\xa9\x30\x46\xcd\xa2\x12\x3b\x5b\x45\x19\x6e\x52\xc4\x28\x1e\x2d\xcd\x0a\x6a\xb3\xfe\xc9\x85\x18\x88\xe5\x30\x86\x46\xb2\xd2\x4a\x13\x41\xec\x0b\x4a\x14\x1c\xc7\xbf\x3c\xa5\x8c\x07\x22\x4c\xfe\x2b\xb0\x22\xa9\x3f\x0e\x49\x71\xb4\x90\xa3\xd6\xf8\x89\x10\x8c\x1a\x72\x01\x3f\x69\x99\x39\x91\xc7\x6b\xa8\x63\xdc\x29\x07\xd2\xd1\xa3\x4a\x1b\x9a\x62\x11\x60\x3a\xa7\x24\x82\x05\xcf\x0d\xf3\x9c\x66\x19\x0d\x5f\x62\x6c\x61\x8f\x8c\xda\xb1\x80\x6c\xb2\x54\xb4\x6f\xb1\x61\x7a\x35\xf6\xf9\x95\x32\x5b\x6e\x48\x28\x50\x10\x2f\xcf\xab\xae\xd0\x3b\x8c\x02\x7b\x84\x69\xcc\x1f\x79\x8f\x11\x26\x11\x02\x27\x35\x2d\x49\x2b\x9d\x17\x85\x18\x01\x42\x64\xc6\xb7\x4a\x9c\x37\x72\xbb\x01\x90\xda\x9f\xc0\x02\xcf\x99\x78\xa9\xf3\x33\x1f\xd0\x92\x37\xaf\x8c\x62\x5d\x86\x04\x92\x26\x1d\x64\x49\xd8\x90\xea\x35\x15\x4f\x0d\x0a\xb1\x6b\xde\xe9\x79\xcb\x43\x5a\x7e\xa3\xd3\x2e\x2b\xa8\xa7\x3c\x7a\xb6\xf7\xbe\x0b\xf5\xa2\x69\x16\x70\xc0\x86\x10\x8c\x6c\x93\xbf\xbe\x98\x20\x1e\x6d\xb2\xb2\xc9\x7f\x84\xc8\xf5\x36\xec\x37\x87\x85\x98\xa5\xf7\xbc\x5d\x0c\xf1\xa2\x2c\x1d\x49\x58\x43\xa9\x51\xb5\xe9\xa8\xe4\xd0\x27\x51\xd2\x09\x5e\xb7\x97\x46\xff\x37\x4e\x5f\x31\xcb\xee\xd1\xcd\x34\xcb\x98\x5a\xc6\x9a\x8f\xbe\x73\xaf\xbe\xab\xac\x09\x04\x37\xed\x51\xec\x8d\x5e\xa4\x35\x8e\x45\x1e\x34\xdf\xa1\x74\x21\x4e\xd5\x6b\xc7\xe6\xed\x1e\xc7\xea\xcc\x6a\x88\xee\xe8\x88\x34\xa1\x15\x60\xf6\xaa\x96\x8e\x44\xa3\x92\x86\xd6\x84\x9a\xb2\x21\x49\x66\xee\xde\x88\xac\xdd\x3e\x40\x42\x87\xb4\xbb\xfd\xd2\x33\xab\x21\xa3\xc0\x86\x37\x89\xbe\xb9\x2f\x7a\x51\xcc\xf2\xfb\x48\xb4\x28\x1b\xc3\xb4\xa5\xda\x3b\x47\xbd\x10\x4d\xf6\xbb\xc3\x95\x6d\xe1\x4f\x43\x3f\x9f\xad\x7b\xc8\x6f\xef\x64\xe5\xaf\x35\xb3\x4d\xbf\x61\x67\x02\x8e\x39\xc9\xe3\x38\x2b\x52\xe5\xab\xca\xfa\x53\x2d\x37\x0a\x41\xde\x64\xd3\xb8\xba\x54\x88\x52\xa7\x8e\x77\x4f\xcd\x85\x0b\x76\xaf\x18\x10\x4e\x1b\xda\x12\x5c\x93\x45\x9a\x7e\x68\x79\x3a\xae\x13\x85\xdf\xf7\xd6\x3d\xf5\xcd\x91\x07\x26\x08\xbf\x57\xe1\x16\xf4\xe0\x31\x2d\x67\x55\x4d\xdc\xe3\x15\x7c\x8c\x7e\x0f\x78\x05\x02\x40\xd0\x3e\x62\x9f\xcc\x19\x9e\x76\x76\x4d\xfb\x22\xbe\x7f\xd9\x56\x91\xe4\x83\x9f\x1f\xf2\xbc\xf3\xa9\xb9\x6f\x30\xe7\x6a\x9a\xbc\x68\xe7\x0b\x18\x27\x34\x1f\x5d\x0c\x6e\x9a\x9e\x3c\xe0\x46\x8a\x1d\x70\x4e\xde\xce\x50\xe4\xae\x32\x19\xef\x1a\x63\xb4\x51\x82\x29\xde\x3f\x2c\xd7\x4f\xd6\xe2\xff\xd1\x06\x7f\x1e\xda\x20\xee\x54\xe0\x9f\xbb\xba\xa1\x72\x63\x53\x25\x26\x8e\xce\x7a\xe4\xd2\x1a\x0e\xd0\xe1\x38\xa6\xac\xf5\xd1\x8e\x6f\x6a\xda\x04\x6e\x1f\x67\xb5\xea\x02\xea\xbc\x4f\xbb\x91\xb7\xbd\x05\x52\x39\xd2\xce\x3c\x67\x17\x17\xed\x7c\x36\x8b\xf7\x7b\xa7\xf6\xa4\x58\x8c\x49\x04\xee\x03\xa6\x91\xd7\x29\xea\x49\x6b\xab\x72\xd8\x69\xca\xfb\x41\x05\x30\x33\xa0\x72\x1c\xaa\x8c\xbb\xec\xad\x23\xde\xee\xc2\x51\xba\xb3\x9e\xb8\x2a\x09\x94\x9e\xcc\x11\x76\xd0\xfe\x2c\x4c\x5e\x94\x71\x28\x07\x1b\xc8\x29\xb7\x87\x3d\xd2\x0e\xf2\x97\x85\xa0\x2b\xba\xcf\x9c\xae\xc3\x15\x0d\x60\x58\x4b\x1a\x2d\x92\x08\x88\x65\x9c\x18\x44\xe3\x92\xcd\xc5\xdf\xb1\x0d\xd2\x83\x5e\x5f\x6f\xca\x5d\x17\x66\x43\x57\x5c\x6c\x25\x98\x93\x74\xcf\xc5\xc2\x34\xac\xba\xa3\x5b\xd4\xf4\x74\xbc\x1d\xa4\xb8\x9d\x53\x6f\x58\xba\x86\x55\x7c\xb5\xd9\x63\xb6\xbb\xf6\x92\xa9\xaa\xd8\x4f\xed\x8e\xee\x41\xca\x11\xa0\xe5\x69\xf2\xb4\xaf\x5d\xde\x11\x7a\x72\xaf\xfa\xeb\x42\x3c\x70\xaa\xca\x61\xaf\x6b\x52\x5c\x60\xd1\x97\x63\x4c\x52\x5e\xd4\x5a\xd4\xcc\x3b\xaf\x84\x7c\x73\x19\xe5\x1c\xd7\xc2\xf6\x3e\x34\x5a\x0a\x3b\x06\x9c\x39\xfd\x5b\x2c\x08\x0f\xe3\x1b\x17\xd3\x9e\xcd\x29\xff\x05\x82\x2f\x57\xca\xe4\xd6\x79\xd5\x56\xa6\xb2\x41\x75\x05\xbf\x58\x7b\xb5\x1f\x68\xd5\xed\xf2\xbe\xc6\xad\x04\x62\x89\x43\x1a\x26\x8e\x4e\x87\x80\x4d\x10\x99\x57\xda\xb7\xeb\xea\xdf\x11\xd9\xe7\xe4\x55\xac\x97\x0f\xff\x5a\xfe\xb2\x12\xf4\x71\xf3\xf2\x6b\xf2\xb8\x7a\x14\x77\xcb\x57\x7c\xbf\x13\xcb\xe7\x47\xf1\x5b\xb2\xfd\xfc\xf2\xb6\xc5\xe7\xaf\x62\xf5\xef\xf5\x66\xf5\xfa\x2a\x5e\x36\x22\xf9\xb2\x7e\x4a\xf0\xea\x6f\xcb\xcd\x66\xf9\xbc\x4d\x56\xaf\x73\x91\x3c\x3f\x3c\xbd\x3d\x26\xcf\xbf\xcc\xfb\x53\x4f\xc9\x97\x64\xbb\xdc\x26\x2f\xcf\x73\xb8\x5b\x5d\x39\x26\x5e\x3e\x89\x2f\xab\xcd\xc3\x67\xfa\xfa\xcf\xe4\x29\xd9\x7e\x65\xbf\x9f\x92\xed\x33\xf9\xfa\x04\x67\x58\xd6\x97\x9b\x6d\xf2\xf0\xf6\xb4\xdc\x88\xf5\xdb\x66\xfd\xf2\xba\x5a\xc4\xbf\x46\xad\x4c\x3e\xfb\x5f\x00\x00\x00\xff\xff\xee\xbf\x3b\x3d\xb5\x12\x00\x00") - -func confLicenseArtisticLicense10Bytes() ([]byte, error) { - return bindataRead( - _confLicenseArtisticLicense10, - "conf/license/Artistic License 1.0", - ) -} - -func confLicenseArtisticLicense10() (*asset, error) { - bytes, err := confLicenseArtisticLicense10Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Artistic License 1.0", size: 4789, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseArtisticLicense20 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x59\x5b\x77\xdb\xb8\x11\x7e\xf7\xaf\xc0\xf1\xcb\x5a\xe7\x28\x6e\x92\xdd\x6e\xdb\x7d\x53\x6c\x39\xe6\xa9\x2c\xb9\x92\x1c\xaf\x1f\x21\x12\x94\x51\x53\x84\x0a\x90\x56\xd4\x5f\xdf\x6f\x06\xe0\x55\xd4\x6e\xfa\x90\x1c\x99\x97\xc1\xcc\x37\xb7\x6f\x86\xeb\x57\x25\x26\xb6\xd0\xae\xd0\xb1\x98\xe9\x58\xe5\x4e\x89\xcf\xd7\x1f\x2f\x6e\xcc\xfe\x68\xf5\xf6\xb5\x10\x57\xf1\x48\x7c\xfe\xf8\xf1\xe3\x07\xfc\xf7\xeb\x58\xd0\x1b\x8f\xca\x66\xe2\xce\x94\x79\x22\x0b\x6d\xf2\xeb\x8b\x8b\xe9\xbb\xb2\x47\x93\x2b\xa1\x9d\xd8\x2b\xbb\xd3\x45\xa1\x12\x51\x18\x11\x43\x8e\x90\x79\x22\x12\x9c\x61\xf5\xa6\x2c\x94\xc0\xb3\x1b\xbc\xb8\xa3\x9b\x5a\x39\x61\x52\x51\xbc\xe2\xc5\x2c\x9c\x9f\x98\xb8\xdc\xa9\xbc\x18\x0b\x3c\x2e\xe2\x57\x99\x6f\x75\xbe\x15\xba\x20\xe9\xb9\x29\x84\xcc\x32\x73\x50\x09\xce\x7d\xb4\x4a\xee\x36\x99\xba\xb8\x58\xb7\x25\x28\x57\xc8\x4d\xa6\xdd\x2b\xa4\x17\x50\xb8\x80\x4a\x4e\x40\x5f\x65\xc5\xe1\x55\xc7\xaf\x42\x8a\xad\x7e\x57\xb9\x48\xad\x52\xc2\x99\xb4\x38\x48\x0b\xc3\x64\xfc\x26\xb7\x4a\xec\xe4\x51\x6c\x94\xd7\x2f\x19\x8b\x9d\x49\x74\xca\xbf\x1a\x2b\xf0\x07\xcc\xfa\x8b\xb1\xc2\xaa\xd6\xd5\x6b\x06\x48\xe7\x05\xf4\x27\x75\x8b\x57\x59\xb0\x0a\x0d\xa0\xf7\x26\x23\x3d\x76\x12\x4f\xe1\x9f\xc3\xf1\x3b\x25\x64\xe5\x85\xd8\xe4\x85\x35\x99\x30\x80\x89\xdf\x4c\xd4\xbb\xca\xcc\x9e\x10\xf1\x50\x41\x62\xa5\x28\x8c\xc9\xa0\x7f\xa1\xb3\x4c\xbc\x29\xb5\x27\x9c\xe8\x9d\xea\xbe\x7c\x97\x3a\x03\x14\xf8\x05\x9c\xf7\x30\xd8\x99\xd2\xc6\x8a\x5d\xd2\xb1\x1d\x60\xbe\x98\x52\x10\x0a\x32\x3b\xc8\x63\xcf\x8f\x3b\xf9\x46\x3a\x5a\xf8\x42\x91\x26\x0e\x47\x9b\x2c\x3b\x0a\x53\x16\x4e\x27\xea\xd4\x89\xda\xaa\xb8\xc0\x03\x07\x5d\xbc\x0e\x23\x80\x57\x2a\x37\x04\x7d\xaf\x45\x94\xb6\x1c\x76\x1a\x18\xec\x7e\xaf\x18\x3f\x97\x96\x30\xbc\xc4\x2d\x46\xe5\x08\x03\xf6\xd6\xec\x0d\x5d\x08\x3a\x9b\xb4\x0d\xc8\x98\x9f\x71\xaf\xa6\xcc\x12\x46\x5a\xc6\x67\xdc\x43\x00\x39\xa5\xde\xa0\x22\x9c\x9f\x2a\x4b\xf0\x7b\x45\x08\xe4\x16\x14\x40\xee\x56\xa5\x3a\xd7\x94\x0b\xee\xe2\xe2\xb2\x2f\xeb\x52\xec\x94\xcc\x7d\x24\xea\x3c\xd1\xef\x3a\x29\x65\x76\xe5\x46\x02\xd1\x63\xec\x56\xe6\xfa\xbf\x9c\x48\x74\x29\x97\x3b\x20\xae\x73\x7e\x3a\xae\x25\xc1\x6e\x9c\x2d\x52\xe3\x63\x02\xc7\xea\x26\x5e\xaf\xf9\xd0\xdc\xc7\xa0\xa9\xcf\x93\xf9\x51\xec\x11\x57\x47\x8f\xce\x2b\x42\x20\xae\x9e\x52\x64\x3e\xb9\x0d\x1a\x40\x20\x85\x23\x30\xd7\x32\x23\xe0\x3a\x80\x41\x15\x19\xc7\xc6\x26\x32\x87\x02\x67\xbd\xf9\x93\x23\xe8\x63\x95\x94\x56\x39\x52\x08\xd1\x74\xc9\x28\x5e\x02\xf2\xae\x4e\xca\x3a\x93\x53\x00\x89\x03\x3b\x22\xd3\x6f\xaa\x2a\x16\xed\x1c\x1b\x93\x7a\x9c\x7c\xc7\xb6\x4e\x24\x3d\xfc\x6c\x43\x1b\x23\x1e\x11\x72\xc0\x91\x9c\x9e\x22\x31\x5c\x3b\x5f\xc5\xe6\x38\xa8\xf8\xd8\x97\x27\x18\xff\x0e\x27\xbc\x57\xf5\x08\x80\xb5\x04\x86\x54\xe7\x3b\x14\x5d\x2c\xfd\x5a\x4c\xba\xe1\xcb\x75\x03\x10\x3b\x9c\x4a\xcf\x2a\xcd\xd0\xd2\xa9\xab\x02\x22\xa4\x4d\xc4\x37\x18\x0f\x89\x6c\x9a\x14\x0f\xa1\xb2\x54\x97\xc9\xb4\xdb\x5a\xe7\xca\x3a\x00\x8b\x98\xe1\xb0\xf3\x05\xb5\x1b\xd4\x8c\x92\x7c\x0b\x35\x12\xce\x52\xce\x69\xca\x79\x40\x0a\xbc\xa9\x2c\xab\xcc\x79\x34\xab\xc0\x92\x4e\xf9\xfc\x8b\xcd\x6e\x4f\x4e\xe9\x85\xe2\x98\x5e\xe6\xc8\x70\xed\x14\x27\x57\x9e\x7b\xa5\xa3\x3b\xee\xdd\x29\xd5\xf6\x7a\xaa\x5a\x59\x8a\xa2\x6e\xb7\x3e\x9c\xeb\x57\x7c\xed\x42\xba\xb7\xcc\x6a\x2c\x77\xe5\x7e\x6f\x6c\x11\x32\xa0\xf5\x14\x1b\xe9\x63\x98\x83\x1d\x35\xa4\x40\xa5\x50\xbe\x55\xd0\xf9\xad\xb4\x85\x12\x1c\x9c\x7d\x77\x5c\xa2\x8a\xa7\x64\x6b\x37\xfa\x85\x4e\x09\x52\xca\x1c\x12\xb6\x51\xf0\x75\xd3\x0c\xa0\x09\xdd\xe9\x5c\x15\x26\x47\xcd\x03\xca\x5c\x42\xd5\xf7\x3d\xce\xd6\x54\x06\xad\xfa\x4f\x89\xb6\x74\x3e\x0e\x49\xad\x7e\x38\xb4\xc3\xbb\x49\xc8\x5a\x27\x3e\x99\xfb\x63\x68\x47\x40\x09\xbd\xcd\x5f\x41\x85\x46\xd1\x62\xbd\xff\x5f\x35\x16\xb8\xa0\x73\xd4\x82\xc0\x08\x1a\x35\x80\xfb\x09\x5d\x80\x22\xb7\xad\x34\xab\x2b\x44\x1f\xe3\x93\x52\x0c\x94\x34\x1a\x49\x5c\x5a\x2e\xae\xef\xd5\x63\x96\x44\xc2\xc4\xd0\x85\x6b\x68\xa1\xf1\x00\xfb\xa8\x42\x3a\x2d\x8b\x92\xdb\xd8\xe5\x8a\x5b\xdc\x25\x85\xca\xae\x05\x60\xe8\x7c\x54\xf6\xc6\x35\xc7\xf0\x22\xfc\x2d\x0f\x21\xf2\x37\xd5\xdb\xd2\xfa\x3b\xbe\x8c\x54\x65\xb7\x53\x6f\x77\x7b\xdc\x4b\x4e\x8e\x89\xc3\x0d\xa8\x5b\x28\x7f\x98\xd9\xfc\x1b\x75\x24\x9c\xbc\x01\xb2\xf6\xe8\xf3\x9f\x92\x88\x23\x97\x65\xa0\x70\x96\x19\xa7\x41\x6a\x0d\x89\x24\x47\xea\x98\x6a\x32\x9a\x8d\xa3\x67\xbc\x52\xa4\x0d\x5d\xc9\x64\xd1\xc2\xd5\x9b\xcd\xa2\x88\x19\x51\x93\x74\x0c\x28\x69\xff\xe4\x7c\xcf\xf7\x11\x16\xfb\x17\x9f\xe1\x2a\x24\x77\x2b\x05\x4d\x7e\x71\x71\xf5\x69\x24\x2a\x2a\xd0\xe1\x00\xbe\xcf\x0e\x38\x96\x61\x03\x13\x2b\xfc\x19\xf4\x5c\x3f\x92\x3d\x86\x5c\xfd\x4b\xcb\x0d\xfa\x10\x0e\x87\xd5\x38\x3c\xf6\x45\xc7\xe7\x3b\x1d\x57\x55\x8a\xd0\xf3\x9b\x08\x63\x15\x06\xea\x66\x63\xb0\x3f\x6b\xd9\xd0\xb2\x36\x48\x3d\xdd\x61\xee\x67\x6f\x2e\x45\xdb\xed\x9f\x90\xd4\x0e\xc8\xe7\x44\xd6\xb4\xa5\x2e\x22\x39\x1b\x8e\xbe\xae\xcb\xdd\xb0\xdd\xa1\x53\x6c\x29\xea\x1c\xf9\x97\xd1\x12\xbd\x72\x3a\x88\x4f\x49\xb9\xcd\xd0\x83\x0a\x05\x95\x4c\x95\xc0\x7d\x02\xe1\xd8\x41\xd2\x39\x13\x6b\x49\x6e\x05\x46\x71\x26\xf5\x0e\xaa\xa3\x9d\x15\xbe\xc0\xd3\x45\xab\xbc\x66\x5c\x51\xfa\x60\x10\x56\xdc\x74\x8e\xec\x1c\x9d\xc7\x59\x89\x06\x21\x45\x95\x15\x1d\x80\x9a\xac\xb9\xfa\xb9\xc1\x5a\xee\xf7\xd9\x91\x81\xd9\x94\x88\x78\xfd\x5d\x39\xd8\x87\x12\x2f\x37\x3a\xd3\x20\x2d\xa1\x8c\xf9\xac\x0c\x24\xa5\x15\xbd\xa4\x45\xd2\x66\xb8\x9c\x34\x83\x25\x8d\xcb\x46\x93\x5d\x35\x79\x26\xd6\xec\xb9\x33\x93\xfd\x9c\xba\x9c\x65\x70\x87\x1a\xb6\x47\xce\x03\x72\x08\x2f\xb9\xd2\xa7\x76\x68\x1b\xfd\xc2\x49\xd4\xb0\x17\x84\xa7\x89\xd1\x6b\xe6\x38\xc2\x07\x19\xe0\xfa\x65\x30\x34\xd9\x47\x7d\x39\xcd\x7b\xe2\xea\x47\xa3\x89\x2c\xe2\x72\x8d\x0b\x55\x58\x9e\xf1\x61\xff\xb8\xd1\x40\x28\xc6\x99\x92\x16\x3e\xad\x6a\xab\x78\x35\x07\xaa\xe3\x9e\x3f\xbb\xc6\x41\xa7\xd8\xfa\x08\x82\x73\xfc\xcc\x47\x41\x95\x69\x54\x1e\x2e\x3c\x4d\xb5\x66\x0a\x94\x53\xd0\xe5\x1f\x5c\x25\x24\x45\xe1\x21\xd2\x89\x2c\xfa\xae\xe2\x92\x26\x3f\xfa\xc3\x53\xc7\x32\xab\x22\x68\xb0\xb4\xe0\x17\x94\x06\x5b\x5b\xcc\xa7\x95\xa9\xa9\xa1\xf1\x12\x47\xfd\x06\x0f\xc8\x91\x1f\x23\x86\x30\x68\xc5\x5e\xf0\xff\xd0\x88\x33\x6c\xb0\x9f\x45\x87\x62\x06\x29\x67\xfe\x70\x6c\x3c\xd6\xf9\xc6\x81\xd0\xcd\x89\xd0\x0c\xfb\x07\x5e\x8b\x8b\xab\xcd\x08\x63\x83\x03\x52\x5e\x3a\x26\xcf\x02\x25\xa3\x6e\x21\xc3\x51\x55\x13\xa9\xbd\xc5\x18\x9a\x7b\xa5\x50\xe0\x6d\xf5\x3e\xb9\x84\x86\xe0\x32\xcf\xab\xe1\xf3\xf4\xf0\x08\x58\x25\x89\x0e\xc4\x72\x08\xca\x5d\xe9\x88\x5f\x49\x8a\x53\x1a\x81\x82\x8e\xae\x35\x7c\xd5\xe1\xc3\xf7\xcf\x20\x4b\x86\xc6\x23\xbf\x21\xa8\xc8\x2f\x0d\x1a\x18\x46\x15\x93\xfb\x2e\x83\x3e\xd1\xa3\x1a\x1b\xcf\xd4\xfa\x3f\x0e\x81\xc0\x97\xd9\xb7\x88\x1d\x3d\x1a\x74\x30\xc1\x85\x9b\xb8\x2b\xeb\xc9\x96\xad\xf5\xcd\xd6\xb3\x88\x70\x83\xc5\xd2\x9c\x9e\x1d\xc3\x74\x14\xc6\x21\x8a\xe8\xf6\xe2\x61\x58\xbb\xd2\x55\x3e\x71\x84\x59\xc3\x83\xfd\x7c\xcd\xa7\xfa\x3a\x1c\x02\x98\xb1\xa9\x83\xaf\x56\x22\xa0\x17\x48\x26\x71\x48\x4c\x9f\xad\xe5\xc6\x0f\x20\x15\xca\x78\xca\xf9\x7b\x30\xf6\xcd\xf9\x99\x8b\xea\x0c\x39\x56\xd3\xba\x47\xf9\x9a\x1e\x0c\x6e\xb0\xe5\xa8\x96\x45\x0d\x17\xd1\x78\xcf\x4f\xac\x79\xd5\x1b\xae\x13\x9b\x36\x91\xf1\x15\xce\x85\x75\x46\xb5\x2d\xea\xd7\xe2\xba\xd2\xdd\x99\x7a\xdd\x30\xd4\xcf\x4f\xf3\xc2\xd5\xf5\xb2\x31\x1f\x1e\xff\xeb\x60\xbd\xee\x14\xd4\xf3\xc7\x9c\x4a\x1c\xea\xf7\x55\xee\x13\xcd\xcc\x54\xa1\x38\x0f\x6d\x19\xfb\xf4\x87\x18\x2a\xba\xf0\xe6\x56\x75\x5c\x73\x36\x5d\x56\xd4\xce\x3a\x32\x42\x2a\x8a\x77\x99\xe9\x44\x04\x0f\xa3\xf9\x37\x03\x60\x9b\x58\x55\x2b\x1b\xd7\xd5\x64\x4c\x2f\x92\xab\xf9\x45\xbf\xa6\x3a\x06\x52\x19\x4b\x6b\x8f\x5c\x37\x60\x2d\xb7\xd3\xb6\x40\x0a\x83\x98\x36\x62\x3a\x67\x0d\xfc\xca\x86\x95\x0a\x68\x88\x5c\x1d\x4e\xcc\x4e\xd4\x8e\x03\x0c\xe3\xa9\xa2\xe1\x36\x2d\x2d\x37\xc1\x13\x5d\xc3\x92\x88\x05\x79\x13\xbb\xa2\x2a\x01\x1d\xf6\x48\xbe\xe1\x20\xd4\xb4\x4e\x49\x68\xb6\x93\x29\x92\x88\xa5\x05\x7d\x25\xaf\x10\xeb\x9c\xe8\x48\xa5\x3b\xb5\x3d\xb8\x9b\xb7\xb9\x2d\xc2\x22\x55\xda\xc3\x55\x41\xcc\x35\xdf\xd5\x6d\xa2\x59\x82\x11\x8b\xfa\x75\x30\xcc\x4e\xb7\x09\x94\x37\xdd\x6e\xfe\x63\x31\xc6\xb1\x15\x36\x77\xab\xb0\x01\xf9\xc5\xff\x89\xb4\xdf\xb7\x08\x4f\x37\xba\x06\x58\xf9\x64\xbb\xb5\x6a\x2b\x8b\xd0\x26\x66\x3a\x7f\xeb\xed\x28\x61\xcf\xdf\x5a\xac\x30\x3c\xaf\x3a\x9c\xe8\xea\x0f\x36\x29\x43\xe9\x39\x0a\xb4\x26\x6c\x05\x58\x88\xa7\xbe\xbd\x39\xa2\x21\x85\xd5\xc1\x24\xf1\xec\x14\x12\xd6\x16\xb2\xbb\x51\x38\x19\x0f\x87\xeb\x50\x3d\x4b\xf9\x52\xd8\x5d\x4a\xb0\x0c\xaf\x2f\xa1\x8f\xb6\x45\x3b\xd6\xd0\xcd\xdb\xba\x75\x24\x79\x66\x3b\xbc\x2c\xed\xd4\xf5\x32\x8c\x7f\xfd\x0a\xd8\x01\x74\xb0\xce\xd1\x28\xee\x4b\x4e\x32\xa0\x0e\x45\xe3\xdf\xcf\x8c\x8b\xa0\x06\x6f\x8d\x40\x3a\xbd\xef\x3a\xd7\x76\x13\xf7\x04\x5e\x3b\xa9\xdd\x26\x90\xf0\xf6\x04\x25\x32\xc2\xde\x3f\x57\xa7\x89\x39\xf8\x4d\x1a\xde\xda\x94\x3a\x4b\x04\xb3\xc2\x0f\x32\xa3\xbe\xef\x27\x6d\xba\x5d\x8d\xe2\xd5\x8e\x81\xd1\x22\x80\x6a\xde\x14\x28\x91\xaf\xad\x9d\x2d\xc5\xd9\xa8\xf9\xd3\x09\xb6\x7e\xb0\x26\x51\xea\x3b\x8f\xbe\x32\x6c\xc7\xf9\x3b\x81\x4d\x65\xac\x7a\x7b\x27\xc0\x1a\x15\x0a\x4e\x5d\x73\x87\x06\xb2\x73\xbc\x7d\xd3\x4c\x28\x8f\xd2\x16\x7e\x7f\xd7\xf7\x18\x1c\xf2\x8f\x91\x78\xe6\x06\x7b\xf5\x27\xb4\x3a\xf0\x63\xbf\x39\x8a\xad\xde\x17\x6e\xe4\x91\xc0\x3c\x48\x1d\x58\x7d\x2f\x94\x2f\xaa\x4c\x8a\x4a\x77\xba\x4f\xf7\x99\x31\x0e\xeb\xa4\x9d\x53\xd9\x3b\x31\xee\x58\x56\xdb\x82\xd6\x9e\x6e\x33\x54\xa4\x7a\xec\xd0\x8f\x57\xac\xbe\x0c\xeb\xab\xd6\x64\x46\x1b\xbe\x93\x89\x09\x9c\x49\x65\x69\x18\xd0\xc2\x3b\xbd\xc1\x6c\x30\x45\x80\xf2\x57\x95\x2b\x0b\x6a\xf6\x48\x5e\x73\x7e\x7f\x7f\xf5\xe9\xe3\x48\x4c\x50\x8b\x4b\x22\xe3\x6d\x7a\x3d\xee\x7e\xc9\xfa\xe1\x1c\xc2\x91\x5b\xfa\x9c\x93\x57\x6b\xb7\x81\x35\xda\xb5\xf8\x72\xf4\x7c\xad\xe2\x78\xa1\x64\x26\xdd\xfd\x68\xef\x53\x06\x6d\x7b\xf7\x45\xd7\x2c\x71\xeb\xab\x55\xa3\xbf\x5f\x37\xf5\xd8\x62\x7b\xa1\xd8\xaa\x71\x43\x12\x09\x94\x4f\xa3\xd0\x3d\x07\xa6\x84\x7a\x19\xd9\xa1\x74\x03\x0d\x89\xe9\x1d\x20\xa0\x4f\x5e\x94\xa2\x26\x94\x75\xc9\x0d\x71\x5c\x53\x84\x1c\xc3\x06\xf5\x6f\x44\xa7\xab\xf8\x26\x17\x95\xf6\x04\x33\xac\x0b\x37\x2f\x5a\x52\xd4\x8b\xc8\xf0\xbe\xff\x6c\x75\x1a\x03\x57\x9f\x3e\x8f\xc4\xba\xfb\x9d\x29\xe4\x2b\x26\xe8\xdc\x37\x00\x96\xc3\x73\x58\x58\x84\x31\xb7\xb1\x92\x68\x87\x7d\x43\xd8\x2a\xfb\x4e\x1f\x68\xfc\x5f\x7c\x83\xc6\x14\xc6\x3d\x33\x5b\x53\x05\xca\xc0\xba\xf5\xea\xd3\xcf\xbd\xf3\x43\x1d\xf2\x93\x00\xcd\xba\xea\x3b\x2e\x38\x20\x3b\xa6\xd4\xc8\x92\x83\xa6\x4d\x22\xd1\xe4\x0f\x26\xfd\x10\xba\xd2\x5e\x16\xcd\x37\xaa\xfa\x03\xd8\x18\xce\x79\xf7\xbc\x7a\xec\x23\xc2\xd0\x40\x45\xb7\x91\x35\xd9\x38\xfc\xaf\x77\xbc\x5d\xaf\x57\x2d\x07\x4d\x22\x78\xed\xa8\x3a\xcd\xed\x84\x06\xf8\xaf\x4c\x7c\x34\x6f\x92\x2a\x33\x98\xb8\x9f\x59\x32\x87\xc9\x83\x1d\x4d\x5f\x2b\xa4\xd5\xbc\x35\x4f\xad\xa6\x5d\x76\xf5\x5a\xfb\xab\xa0\xe7\xbe\xc8\x98\x82\xe2\xb7\xb6\xb5\xd0\xa1\x2f\x36\xb5\x8e\x46\x3c\x6b\x9c\xfb\xc0\xea\x30\xa1\x33\x25\x15\x5a\xfe\x1b\x53\xd7\x96\xbe\xba\x16\xad\xcf\x63\x98\x10\xd4\xd6\xa7\x57\x20\x6f\x95\xb1\x54\x7a\xfc\x91\xae\xaa\xd9\x2c\xaf\xfe\xd6\x56\xdb\x5e\x29\xef\x3f\x5c\x33\xc5\x1b\x5e\x97\x03\x32\xff\x0d\x92\xf6\x75\x54\x97\xd0\xa5\x60\x91\xf1\xbd\x35\xf1\xd4\x47\x06\x62\xdc\x32\x10\xb2\x68\x19\x9d\x70\xc4\xfc\x32\xa2\x9e\x14\x36\x77\x14\x5b\xcf\xfc\x41\xb2\x38\xfe\x26\x2e\xd6\xf7\x53\xf1\x38\xb9\xf9\xe7\xe4\xeb\x54\x44\x2b\xf1\xb8\x5c\x7c\x8b\x6e\xa7\xb7\xe2\xcb\x8b\xa0\x5b\x37\x8b\xc7\x97\x65\xf4\xf5\x7e\x2d\xee\x17\xb3\xdb\xe9\x52\x4c\xe6\xb7\xb8\x38\x5f\x2f\xa3\x2f\x4f\xeb\xc5\x72\x25\x2e\x27\x2b\xbc\xf8\x13\xdf\x78\x8e\xd6\xf7\x8b\xa7\x35\x7e\xbf\x88\xe9\xef\x8f\xcb\xe9\x6a\x25\x16\x4b\x11\x3d\x3c\xce\x22\xc8\x7c\x9e\x2c\x97\x93\xf9\x3a\x9a\xae\xae\x59\xf8\xe9\x75\xb1\xb8\x13\x0f\xd3\xe5\xcd\x3d\xfe\x9c\x7c\x89\x66\xd1\xfa\x65\x2c\xee\xa2\xf5\x9c\x24\xdd\x41\xd4\x04\xca\x2e\xd7\xd1\xcd\xd3\x6c\xb2\x14\x8f\x4f\xcb\xc7\xc5\x6a\x3a\xa6\x33\xe6\x8b\xf9\x87\x68\x7e\xb7\x8c\xe6\x5f\xa7\x0f\xd3\x39\x74\x58\x4e\xc5\x6d\xb4\xba\x99\x4d\xa2\x07\x9c\xb1\x5e\xf0\x91\xd3\xdf\xd7\x74\xf3\x71\xba\x7c\x88\xd6\x6b\x6f\xe7\xcb\xe2\x69\x29\x66\x8b\x9b\xc9\x4c\xcc\x26\xcf\xd7\xe2\x69\x3e\xa3\xe3\x96\xd3\x7f\x3d\x45\x4b\xff\x08\xae\x8f\x71\xc4\x29\x1c\x38\xb9\x85\x06\x00\x98\xcd\xc4\x97\xa9\x98\x45\x93\x2f\xb3\xa9\xd7\x18\x58\xdc\x42\xce\xcd\x7a\x2c\xa2\x79\xf3\xeb\x06\x30\xc3\xc8\xd9\x38\xc8\x58\xe1\x38\x5c\x88\xa0\xc5\xed\xe4\x01\xee\x58\xc1\x84\x68\x05\x7b\xf0\x30\x4b\x79\x9e\xbc\x08\x42\x17\x18\x91\x29\x4f\xab\x69\xf5\x33\x38\x70\x2c\xa6\xdf\xa6\x73\x11\xdd\x89\xc9\xed\xb7\x68\x05\xd5\xab\xfb\x8b\xd5\x2a\xf2\x70\xd2\xa5\xd5\xd3\xcd\x7d\x38\xe4\xfa\xe2\x7f\x01\x00\x00\xff\xff\xef\xae\x74\x4a\xd5\x21\x00\x00") - -func confLicenseArtisticLicense20Bytes() ([]byte, error) { - return bindataRead( - _confLicenseArtisticLicense20, - "conf/license/Artistic License 2.0", - ) -} - -func confLicenseArtisticLicense20() (*asset, error) { - bytes, err := confLicenseArtisticLicense20Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Artistic License 2.0", size: 8661, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseBsd2ClauseLicense = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x52\x4f\x4f\xe3\x3a\x10\xbf\xf7\x53\x8c\x38\x81\x14\xf5\xe9\xbd\xe3\x5b\xb4\x92\x9b\x4c\x9b\x91\xd2\x38\x6b\x3b\x2d\x3d\x86\xc4\x80\xa5\x36\x46\x49\x0a\xe2\xdb\xef\xd8\xb4\xa2\x2c\x2b\xed\x65\x2f\x74\xf0\xcc\xfc\xfe\x4d\x52\xff\xfc\x36\xb8\xc7\xa7\x09\xae\xdb\x1b\xb8\x7d\xb3\xcd\xf0\x1d\x6e\xfd\x6b\x6f\xf9\x57\xec\xf7\x10\x9b\x23\x0c\x76\xb4\xc3\x8b\xed\xe6\x33\x65\x3b\x37\x4e\x83\xbb\x3f\x4e\xce\xf7\xd0\xf4\x1d\x1c\x47\x0b\xae\x87\xd1\x1f\x87\xd6\xc6\x97\x7b\xd7\x37\xc3\x1b\x3c\xf8\xe1\x30\x26\xf0\xea\xa6\x27\xf0\x43\xfc\xf5\xc7\x09\x0e\xbe\x73\x0f\xae\x6d\x02\x40\x02\xcd\x60\xe1\xd9\x0e\x07\x37\x4d\xb6\x83\xe7\xc1\xbf\xb8\x8e\x8b\xe9\xa9\x99\xf8\x8f\x65\x90\xfd\xde\xbf\xba\xfe\x11\x5a\xdf\x77\x2e\x2c\x8d\x71\xe9\x60\xa7\xff\x67\xb3\x7f\xe7\xf0\x59\xd2\x08\xfe\xe1\xac\xa5\xf5\x1d\xcf\x1d\xc7\x89\x0d\x4c\x0d\x6b\x0c\x80\xcd\xbd\x7f\x09\xad\xb3\xf3\xde\x4f\xae\xb5\x09\xf7\xdc\x08\x7b\x46\x0a\x00\x97\x5c\x7d\xf7\x8b\x10\xa6\x6b\xf7\x8d\x3b\xd8\x61\x3e\x9b\xfd\xf7\x55\x00\x13\x5d\x24\x70\x16\xc0\xd6\xba\x23\x8b\xfa\xdb\x1a\xe0\xe4\xab\xf3\xed\xf1\x60\xfb\xa9\x39\x1f\xe6\x1f\xce\xdc\x73\x67\x80\x43\x33\xd9\xc1\x35\xfb\xf1\x23\xdf\x78\x94\xb8\x76\x21\x9d\xed\x98\x9c\x34\x68\xb9\x34\x5b\xa1\x10\xb8\xae\x94\xdc\x50\x86\x19\x2c\x76\x60\x72\x84\x54\x56\x3b\x45\xab\xdc\x40\x2e\x8b\x0c\x95\x06\x51\x66\xfc\x5a\x1a\x45\x8b\xda\x48\x7e\xb8\x12\x9a\x37\xaf\x62\x43\x94\x3b\xc0\xbb\x4a\xa1\xd6\x20\x15\xd0\xba\x2a\x88\xc1\x18\x5d\x89\xd2\x10\xea\x04\xa8\x4c\x8b\x3a\xa3\x72\x95\x00\x03\x40\x29\x0d\x14\xb4\x26\xc3\x63\x46\x26\x91\xf4\xeb\x1a\xc8\x25\xac\x51\xa5\x39\xff\x2b\x16\x54\x90\xd9\x45\xbe\x25\x99\x32\x70\x2d\x99\x4c\x40\x25\x94\xa1\xb4\x2e\x84\x82\xaa\x56\x95\xd4\x08\xc1\x56\x46\x3a\x2d\x04\xad\x31\x9b\x33\x3b\x33\x02\x6e\xb0\x34\xa0\x73\x51\x14\xbf\x75\x19\xb4\x7f\xf2\xb8\x40\x16\x29\x16\x05\xbe\x33\xb1\xcb\x8c\x14\xa6\x26\xd8\xf9\xa8\x52\x4e\x8e\xf5\x15\x09\xe8\x0a\x53\x0a\x05\xde\x21\x9b\x11\x6a\x97\x9c\x30\x35\xfe\xa8\x79\x88\x9b\x90\x89\xb5\x58\xb1\xb7\xeb\x3f\x44\xc2\x37\x49\x6b\x85\xeb\xa0\x99\x73\xd0\xf5\x42\x1b\x32\xb5\x41\x58\x49\x99\xc5\xa0\x35\xaa\x0d\xa5\xa8\xbf\x41\x21\x75\x4c\xab\xd6\x98\x30\x83\x11\x91\x98\x21\x38\x2a\x6e\x73\xbd\xa8\x35\xc5\xd0\xa8\x34\xa8\x54\x5d\x19\x92\xe5\x0d\x3b\xdf\x72\x2c\xac\x51\xf0\x6a\x16\xd3\x95\x65\xb4\xca\x09\x49\xb5\x0b\xa0\x21\x83\x18\x7e\x02\xdb\x1c\xf9\x5d\x85\x40\x63\x52\x22\x44\xa0\x39\xb1\xd4\x5c\x8e\x31\x1f\x07\x68\x2e\x3c\x42\x89\xab\x82\x56\x58\xa6\x18\xba\x32\xa0\x6c\x49\xe3\x0d\xdf\x8a\x74\x18\xa0\x77\xda\xad\x60\xce\x3a\x5a\x0e\x37\x62\x55\xef\xe5\xc5\x17\x9b\xc4\x4b\x02\x2d\x41\x64\x1b\x0a\xb2\x4f\xc3\x7c\x7b\x4d\xa7\xef\x24\x46\x96\xe6\xa7\xb8\xe7\xb3\x9f\x01\x00\x00\xff\xff\x7d\x00\x05\x93\x06\x05\x00\x00") - -func confLicenseBsd2ClauseLicenseBytes() ([]byte, error) { - return bindataRead( - _confLicenseBsd2ClauseLicense, - "conf/license/BSD 2-clause License", - ) -} - -func confLicenseBsd2ClauseLicense() (*asset, error) { - bytes, err := confLicenseBsd2ClauseLicenseBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/BSD 2-clause License", size: 1286, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseBsd3ClauseLicense = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x52\xcd\x6e\xe3\x36\x10\xbe\xfb\x29\x06\x7b\xda\x00\x82\x8b\xb6\xb7\x76\x51\x80\x96\x68\x9b\x80\x2c\xa9\x24\x15\xaf\x8f\x8a\x44\x6f\x08\x58\x62\x40\xd1\x09\xf2\xf6\xfd\x48\xdb\x88\xb7\x5b\xa0\x97\xbd\x58\x63\xce\xcf\xf7\x33\x93\xbb\x97\x77\x6f\xbf\x3d\x07\xfa\xdc\x3f\xd0\x97\x77\xd3\xf9\xbf\xe8\x8b\x7b\x9b\x0c\xbe\x4b\x62\xa7\x13\xa5\xf4\x4c\xde\xcc\xc6\xbf\x9a\x61\xb9\x90\x66\xb0\x73\xf0\xf6\xe9\x1c\xac\x9b\xa8\x9b\x06\x3a\xcf\x86\xec\x44\xb3\x3b\xfb\xde\xa4\x97\x27\x3b\x75\xfe\x9d\x8e\xce\x8f\x73\x46\x6f\x36\x3c\x93\xf3\xe9\xeb\xce\x81\x46\x37\xd8\xa3\xed\xbb\x38\x20\xa3\xce\x1b\x7a\x31\x7e\xb4\x21\x98\x81\x5e\xbc\x7b\xb5\x03\x82\xf0\xdc\x05\xfc\x18\x0c\x39\x9d\xdc\x9b\x9d\xbe\x51\xef\xa6\xc1\xc6\xa6\x39\x35\x8d\x26\xfc\xb1\x58\xfc\xba\xa4\xef\x29\xcd\xe4\x8e\x37\x2e\xbd\x1b\x50\x77\x9e\x03\x04\x84\x0e\x1c\xe3\xc0\xee\xc9\xbd\xc6\xd4\x4d\xfb\xe4\x82\xed\x4d\x86\x9c\x9d\xe9\x84\x49\x71\xc0\x3d\xd6\x34\xfc\x8b\x08\xe0\xfa\x53\x67\x47\xe3\x97\x8b\xc5\x6f\x3f\x12\x00\xd0\x9d\x03\x37\x02\x90\x36\x9c\x41\xea\x67\x73\xa0\xab\xae\xc1\xf5\xe7\xd1\x4c\xa1\xbb\x2d\xe6\x17\x78\xee\x90\xf1\x34\x76\xc1\x78\xdb\x9d\xe6\x0f\x7f\xd3\x52\x52\xdb\x1d\x75\xc8\xf9\x7d\x49\x95\xb1\xa9\x2b\x66\xa7\x6e\x34\x91\x4b\x8c\x3f\xe8\x3e\xbb\xd3\x80\x82\xc9\x7d\x14\x25\xdb\x2d\x4e\x05\xac\x2f\xf3\x9c\x9f\x01\xfc\x4e\x4f\x26\x5e\x08\xf8\x3b\x32\xd3\x80\x57\x13\x8f\x01\x44\x46\x17\x0c\x5d\x5c\x41\x1f\x06\x5a\x5c\x18\x1d\x91\xb8\xf8\x30\xbb\x63\x78\x8b\x9b\xbe\x1d\xce\xfc\x62\xfa\x78\x39\x68\xb2\xf1\x9e\x7c\xbc\x99\xe9\x72\x3d\xf3\x7c\xe1\xaf\xb7\x42\x91\xaa\xd7\x7a\xcf\x24\x27\xc4\x8d\xac\x1f\x45\xc1\x0b\x5a\x1d\x48\x6f\x39\xe5\x75\x73\x90\x62\xb3\xd5\xb4\xad\xcb\x82\x4b\x45\xac\x2a\xf0\x5a\x69\x29\x56\xad\xae\xf1\xf0\x89\x29\x74\x7e\x4a\x09\x56\x1d\x88\x7f\x6d\x24\x57\x8a\x6a\x49\x62\xd7\x94\x02\xc3\x30\x5d\xb2\x4a\x0b\xae\x32\x12\x55\x5e\xb6\x85\xa8\x36\x19\x61\x00\x55\xb5\xa6\x52\xec\x84\x46\x99\xae\xb3\x04\xfa\x63\x1b\xd5\x6b\xda\x71\x99\x6f\xf1\x97\xad\x44\x29\xf4\x21\xe1\xad\x85\xae\x22\xd6\x1a\x60\x8c\x1a\x26\xb5\xc8\xdb\x92\x49\x6a\x5a\xd9\xd4\x8a\x53\x94\x55\x08\x95\x97\x4c\xec\x78\xb1\x04\x3a\x10\x89\x3f\xf2\x4a\x93\xda\xb2\xb2\xfc\x4f\x95\x91\xfb\x77\x1a\x57\x1c\x24\xd9\xaa\xe4\x17\x24\xa8\x2c\x84\xe4\xb9\x8e\x72\x3e\xa2\x1c\xce\x81\x5f\x99\x91\x6a\x78\x2e\x62\xc0\xbf\x72\x88\x61\xf2\x90\x5d\x67\x2a\xfe\x77\x8b\x22\x24\xa9\x60\x3b\xb6\x81\xb6\xcf\xff\x63\x09\x76\x92\xb7\x92\xef\x22\x67\xf8\xa0\xda\x95\xd2\x42\xb7\x9a\xd3\xa6\xae\x8b\x64\xb4\xe2\xf2\x51\xe4\x5c\xfd\x49\x65\xad\x92\x5b\xad\xe2\x19\x10\x34\x4b\xc0\x18\x01\xab\x90\x46\xbc\x6a\x95\x48\xa6\x89\x4a\x73\x29\xdb\x46\x8b\xba\x7a\x80\xf2\x3d\x6c\x01\x47\x86\xd6\x22\xb9\x5b\x57\x49\x2a\x1c\xaa\xe5\x21\x0e\x8d\x1e\x24\xf3\x33\xda\x6f\x39\xde\x65\x34\x34\x39\xc5\xa2\x05\x0a\x8e\xe5\xfa\xbe\x0c\x78\x30\x50\xdf\x69\xa4\x8a\x6f\x4a\xb1\xe1\x55\xce\x63\xb6\x8e\x53\xf6\x42\xf1\x07\xec\x4a\xa8\x58\x20\x2e\xb0\x7b\x06\xcc\x36\x49\x8e\x3b\x02\xab\x4b\x78\x77\xb1\x59\xda\x24\x89\x35\xb1\xe2\x51\x44\xda\xd7\x62\xec\x5e\x89\xeb\x9d\x24\xcb\xf2\xed\xd5\xee\xe5\xe2\x9f\x00\x00\x00\xff\xff\x17\xf9\x6f\x4a\xc8\x05\x00\x00") - -func confLicenseBsd3ClauseLicenseBytes() ([]byte, error) { - return bindataRead( - _confLicenseBsd3ClauseLicense, - "conf/license/BSD 3-clause License", - ) -} - -func confLicenseBsd3ClauseLicense() (*asset, error) { - bytes, err := confLicenseBsd3ClauseLicenseBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/BSD 3-clause License", size: 1480, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseBsd4ClauseLicense = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x53\x4b\x8f\xe2\x38\x10\xbe\xf3\x2b\x4a\x73\x9a\x96\x22\x56\xfb\x38\xcd\x8e\x56\x32\x89\x01\x4b\x21\x61\x6d\xa7\x19\x8e\x21\x31\xdd\xd6\x86\x18\x39\x0e\xa8\xf7\xd7\x6f\x95\x03\x6a\xb6\x67\xa5\xbd\xcc\x21\xc4\xb8\x1e\xdf\xa3\x2a\xa9\x3b\xbf\x79\xfb\xf2\x1a\xe0\x73\xf3\x04\x5f\xdf\x4c\xed\xff\x80\xaf\xee\xda\x1b\x7c\xcf\x81\x75\x1d\xc4\xf0\x00\xde\x0c\xc6\x5f\x4c\x3b\x9f\x49\xd3\xda\x21\x78\x7b\x18\x83\x75\x3d\xd4\x7d\x0b\xe3\x60\xc0\xf6\x30\xb8\xd1\x37\x26\xde\x1c\x6c\x5f\xfb\x37\x38\x3a\x7f\x1a\x12\xb8\xda\xf0\x0a\xce\xc7\xb7\x1b\x03\x9c\x5c\x6b\x8f\xb6\xa9\xa9\x41\x02\xb5\x37\x70\x36\xfe\x64\x43\x30\x2d\x9c\xbd\xbb\xd8\x16\x0f\xe1\xb5\x0e\xf8\x63\xb0\x49\xd7\xb9\xab\xed\x5f\xa0\x71\x7d\x6b\xa9\x68\x88\x45\x27\x13\xbe\xcc\x66\x3f\xcf\xe1\xdf\x94\x06\x70\xc7\x3b\x97\xc6\xb5\x98\x37\x0e\x01\x05\x84\x1a\x39\x52\xc3\xfa\xe0\x2e\x14\xba\x6b\xef\x5d\xb0\x8d\x49\x30\x66\x07\xe8\xb0\x13\x35\x78\xc4\xea\xdb\x0f\x44\x10\xae\xe9\x6a\x7b\x32\x7e\x3e\x9b\xfd\xf2\x3d\x01\x04\x7a\x70\xe0\x4e\x00\xa5\xb5\x23\x92\xfa\xd1\x1c\xe0\xa6\xab\x75\xcd\x78\x32\x7d\xa8\xef\x83\xf9\x09\x3d\x77\x18\xf1\x70\xaa\x83\xf1\xb6\xee\x86\x77\x7f\xe3\x50\x62\xd9\x03\x75\x94\xf3\xeb\x34\xf7\xba\xbd\x18\x1f\xec\x40\x50\xef\xd5\xd4\x1e\xd3\xe8\xf2\x68\xea\x30\xe2\x5a\xd0\x60\x69\x01\x90\x6f\x24\x3f\xb8\x63\xb8\xc6\xf1\x90\x6a\x6c\x7e\xee\xea\xb7\x0f\xdc\xeb\xe6\xaf\xde\x5d\x3b\xd3\xbe\x18\xea\xf8\x05\x66\x9a\x4a\x27\x83\x02\xea\x69\xba\xb1\x35\x0f\xbd\x5a\x73\x31\x9d\x3b\x23\xed\xc3\xd4\x8b\x1e\xe7\x5f\xea\xde\xfe\x3d\xc9\x45\xe6\xbf\xcd\xa1\x30\x36\xea\xa5\x70\x5f\x9f\x6e\xac\x1e\x8d\x7e\x75\x5d\x8b\x09\xbd\x7b\x4f\x8a\x0b\x63\x71\xc9\xd1\xef\xc9\x09\xe7\x51\x2a\xb2\x3e\x18\x92\x86\xce\x3b\x30\x7d\x8b\xb7\x04\x4a\x34\x4f\x2e\x98\x3b\xdd\x01\xd9\x79\x8b\xdf\x06\x1c\x31\xf0\xc1\x84\xfb\xca\x0f\x67\xd3\xd0\xce\x63\x91\xa5\x2f\xc1\xd3\xb6\xf7\xd3\xde\x0f\xc3\xe4\xbc\x5e\x0b\x05\xaa\x5c\xea\x1d\x93\x1c\xf0\xbc\x95\xe5\xb3\xc8\x78\x06\x8b\x3d\xa4\xe5\x76\x2f\xc5\x6a\xad\x61\x5d\xe6\x19\x97\xf0\x89\x29\xcc\xf9\x04\xac\xc8\xf0\xd9\x03\xff\xb6\x95\x5c\x29\x28\x25\x88\xcd\x36\x17\x58\x86\x7d\x24\x2b\xb4\xe0\x2a\x01\x51\xa4\x79\x95\x89\x62\x95\xc0\xa2\xd2\x50\x94\x1a\x72\xb1\x11\x1a\xd3\x74\x99\x80\x5e\xf3\xff\x28\x83\x72\x09\x1b\x2e\xd3\x35\xfe\x65\x0b\x91\x0b\xbd\x8f\x78\x4b\xa1\x0b\xc2\x5a\x22\x18\x83\x2d\x93\x5a\xa4\x55\xce\x24\x6c\x2b\xb9\x2d\x15\x07\x12\x90\x09\x95\xe6\x4c\x6c\x78\x36\x47\x74\x44\x04\xfe\xcc\x0b\x0d\x6a\xcd\xf2\xfc\x7b\x3d\x0b\x8e\x84\xd8\x22\xe7\x53\x57\x54\x94\x09\xc9\x53\x4d\xd4\xdf\x4f\x29\xfa\x81\x5c\xf2\x04\xd4\x96\xa7\x82\x0e\xfc\x1b\x47\xe2\x4c\xee\x13\xd2\x9e\x96\x85\xe2\x7f\x56\x98\x84\x41\xc8\xd8\x86\xad\x50\xc7\xe7\xff\x91\x8f\x4e\xa7\x95\xe4\x1b\xe2\x87\x9a\x55\xb5\x50\x5a\xe8\x4a\x73\x58\x95\x65\x16\x4d\x55\x5c\x3e\x8b\x94\xab\xdf\x21\x2f\x55\x74\xa6\x52\x3c\x41\x04\xcd\x22\x30\xb6\x40\x5b\x30\x8c\xe7\x45\xa5\x44\x34\x48\x14\x9a\x4b\x59\x6d\xb5\x28\x8b\x27\x54\xba\x43\x0b\x90\x23\xc3\xd2\x2c\x3a\x59\x16\x51\x2a\xda\x5f\xca\x3d\x35\x25\x0f\xa2\xd1\x09\xec\xd6\x1c\xef\x25\x99\x87\xaa\xb4\x64\x64\x81\xd2\x52\xa4\xfa\x31\x0d\xf1\x74\x29\xf5\x83\x46\x28\xf8\x2a\x17\x2b\x5e\xa4\x9c\xa2\x25\x75\xd9\x09\xc5\x9f\x70\x2e\x42\x51\x82\x98\x60\x77\x0c\x31\xab\x28\x99\x16\x00\x59\x4d\xc7\x87\x3d\x4c\xe2\xd4\x40\x2c\x81\x65\xcf\x82\x68\xdf\x92\x71\xce\x4a\xdc\x76\x22\x5a\x96\xae\x6f\x76\xcf\x67\xff\x04\x00\x00\xff\xff\x1c\x11\x75\x28\x58\x06\x00\x00") - -func confLicenseBsd4ClauseLicenseBytes() ([]byte, error) { - return bindataRead( - _confLicenseBsd4ClauseLicense, - "conf/license/BSD 4-clause License", - ) -} - -func confLicenseBsd4ClauseLicense() (*asset, error) { - bytes, err := confLicenseBsd4ClauseLicenseBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/BSD 4-clause License", size: 1624, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseCreativeCommonsCc010Universal = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x59\x5d\x6f\xdb\x38\x16\x7d\xcf\xaf\x20\xf2\xb2\x09\xa0\xba\xd3\xdd\xc1\x00\xdd\x79\x72\x6d\xa7\x35\x26\xb1\x0b\xdb\x69\x30\x8f\xb4\x44\xdb\x6c\x24\x51\x43\x4a\x76\xfc\xef\xf7\xdc\x7b\x29\x59\xf9\x68\x26\x0b\xf4\x71\x80\x02\xb1\x28\xf1\x7e\xdf\x73\x0f\xd9\x91\x37\xba\xb6\x7b\xa3\x46\xae\x28\x5c\x19\xd4\x68\xf4\x8b\xfa\x30\xf8\x45\xdd\x96\x58\xf5\x41\xe7\x67\xa3\xc5\x64\xb8\x9a\x7e\x9b\xa8\xd1\xfc\xe6\x66\x3e\x5b\xe2\xef\xe2\xeb\x7c\x81\xb5\xf9\x4c\x4d\x97\x6a\x36\x5f\xa9\xa1\xba\x1e\xde\xa9\xab\xe9\xe2\x46\x0d\x67\x63\x35\x9e\x4f\x64\xfd\xeb\x62\xfe\x6d\x3a\x9e\xa8\xeb\xc9\xe7\xe1\xb5\x5a\x4e\x16\xdf\xa6\xa3\xc9\x72\xa0\xc6\xd3\xe5\x6a\x31\xfd\x74\xcb\x32\xe6\x57\x6a\xf5\x05\x82\xc6\xf3\xd1\xed\xcd\x64\xb6\x3a\x6d\x67\xd5\x13\x88\x54\xc3\xd5\x6a\xbe\x98\x4d\xfe\x7c\x37\xba\x9e\xd2\x27\x8b\xc9\x35\x1b\xb0\xfc\x32\xfd\x3a\x50\xcf\x4c\x8c\x7a\x97\x22\x78\x3a\xbb\x9a\x2f\x6e\xc4\x60\xfc\x83\xb8\xf3\xe1\xf2\xdd\x74\x79\xae\x3e\x0d\x97\xd3\xe5\x0b\xfb\x6f\x86\x7f\xb0\x09\xea\x6e\xb8\x58\x0c\x67\xab\x29\x9e\x16\xf0\x61\x31\x9e\xce\x3e\x43\xe8\x44\xdd\x2e\x27\xcf\x0d\x9f\x2f\xf8\xdd\x23\x7d\x0b\x75\x37\x5f\xfc\xd1\x99\x34\x56\x5f\x26\x8b\xc9\xed\x6c\x3c\x59\x24\x12\xab\xe9\x72\x74\x3d\x9c\xde\x2c\xd5\xf5\x74\xf8\x69\x7a\x3d\x5d\xfd\xa9\xb0\x5d\x8d\x87\x37\xc3\xcf\xac\x76\x79\x7b\xbd\x22\xb5\x57\x8b\xf9\xcd\xcf\xd2\x3d\x38\x5b\xd6\xba\x36\x85\x29\x6b\xe5\x36\xea\x6b\xe3\x2b\x17\xcc\xd9\xd9\x6a\x67\x54\xae\x0f\x81\x16\x0b\x17\x6a\xf5\xbd\xf1\x36\x64\x36\xad\x2d\x55\x47\xbd\xf3\xae\xd9\xee\x5c\x53\xe3\xa7\x51\x07\xe7\xf3\x4c\xe9\xa6\x76\x05\xaa\x28\xd5\x79\x7e\x54\xa9\x2b\x37\xc6\x2b\xf3\x90\xe6\x4d\x90\xca\xaa\x8e\xde\x6e\x77\xb5\xd2\x65\xa6\x16\x26\x87\x5e\xfc\xa5\x95\xa0\x2e\x32\xb3\xb1\x25\x9e\xd7\x26\x77\x87\x4b\xd5\x54\xae\x64\xd1\x29\x15\xa6\xf3\xbc\x27\x34\xeb\x60\xfe\x6a\xd8\xd6\x43\x69\xfc\x45\xb8\x54\x17\x46\xa7\x3b\x7e\x0b\xad\x09\x7e\xa8\x73\x7e\x77\x7e\x49\xa6\xe3\xd1\x41\xa7\x2d\x75\x4e\x46\xde\xf3\x5a\x53\xef\x9c\x0f\x3b\x5b\xd1\xb6\xf7\x24\x5b\x65\xba\xd6\x6b\x1d\x8c\x88\x83\x18\x75\x7e\x87\xcf\xcf\x2f\x07\x67\x67\x23\xe3\x6b\x6d\x4b\x51\x19\xd4\xc1\x86\x9d\xaa\x9d\xaa\x8c\x2f\x74\x09\x5b\xe0\xab\x37\xb9\x2d\xff\x6a\xf8\xcd\x0e\xf1\x53\x5e\xbc\xc2\x67\x5a\x91\x20\xb5\x81\x1a\x72\xa7\x92\x00\x93\x1d\x08\x50\xed\xed\xba\xa9\x6d\xb9\x95\x2f\xd3\xd8\x7b\xf4\x32\xf6\x63\xa2\xd2\x26\xaf\x1b\x0f\xfb\x39\x02\xa9\x85\x46\xbb\xb1\x29\xbb\x83\xb8\x9d\xc7\x86\x85\xbf\xf5\x4e\xd7\x51\xc9\x3a\xc7\x17\x29\xbc\x27\xcb\xf4\x1a\x26\xd2\xee\x83\xad\x39\x65\x1b\xa3\x3d\x29\xa1\x0c\x78\x95\xe6\xda\x16\xac\xd4\x96\x1b\x0f\x63\xa4\x1a\xd6\x8d\x45\x4e\x29\x0f\x09\x2a\x20\xb3\x9b\x63\x82\x0f\x52\x07\xfb\x3d\xf6\x29\x8a\x08\x94\x79\x31\x24\x81\xa6\x06\x7e\x91\x1a\x6f\x32\x1b\xc4\x35\x2c\x04\xb5\xf1\xc6\x90\x05\x41\xc1\xf5\x60\xd7\x39\x6f\xd6\xe5\x91\xa2\x52\xa8\x03\xcc\x0e\xce\x00\x65\x78\xf7\x86\x93\x7d\x6c\x23\x15\x58\x6b\xde\x64\x14\xa5\xd6\x81\xdc\x16\x16\x65\x8b\x52\xe4\x98\x19\x9f\x5a\x04\xa8\xdd\x31\x50\xa8\x5e\x8a\xb1\x24\xac\xd0\xc7\x53\xac\x0d\x45\x9a\x62\xd4\xe2\x1c\x65\xd2\xbb\xc2\xd1\x1b\x2c\xdb\xcc\x40\x12\x55\x09\x9b\x1d\xa3\x2f\x7e\xd1\xfb\x4d\xe3\xd9\x69\xec\xc9\x1a\x6e\x86\xff\x23\x5b\x89\xa2\x2a\x70\x6a\x4b\xe5\xe4\x4d\xd5\x44\x1f\xb0\xba\x25\x09\x90\xdb\x45\x8e\xd6\x63\xd1\x58\x2f\x35\x84\x4d\x95\xf6\x75\xdb\x7c\x6c\x4f\x1b\x73\xb3\xc1\xc7\x35\x67\x91\xb3\x12\x50\xb8\x57\xb2\x5d\xbe\xa0\x3a\x97\x7c\xb5\x61\xe2\x7d\x70\xdc\xee\xd9\x8a\x90\x3c\xaa\x11\x4a\x81\x79\xa8\x4c\xda\xda\x88\x90\x64\x99\xa5\xdf\xf0\x0e\xf1\x0c\x08\x95\xef\xec\x47\x1a\x2a\x53\x06\x7e\x4e\xa4\x08\x61\x04\xde\xe9\x10\x1c\xb2\xc3\x45\x4e\x33\x85\xe4\xb7\x4d\x71\x41\xdf\x9d\x0f\x37\x1b\xeb\x0b\xea\xd8\xa4\x4d\x8e\x79\xa8\xa9\x04\xb9\xa0\xf1\x08\xf9\x81\x72\x13\xb8\x9f\x29\xab\x64\xce\xab\x78\x62\x05\x3d\x48\x4d\xa2\xf6\x2e\x6f\xca\x5a\x7b\x8b\x2a\x34\x39\x5c\x92\xce\xac\x2a\x3c\x93\x4d\x51\x2b\xdb\x44\xb2\xa4\x7f\xf0\xb2\x57\xc7\xdd\x07\x4d\x09\xbf\x95\x25\x19\x40\x00\x44\x8d\x3d\xba\x2f\xdd\x21\x37\xd9\x96\x3b\x7b\x07\x4b\x61\x33\x05\xfb\xad\x46\x76\x05\x56\x18\x5d\x52\xac\xe8\xd9\x96\x08\x43\x86\xef\x73\xb3\x45\xd0\x91\x63\xd8\xce\xae\xc3\x68\xc6\xc7\x13\xd6\x20\xdf\x1f\x06\xaf\xaa\x1b\x60\x3a\xb3\xaa\x42\x67\x28\x89\xbd\xb6\xb9\xa6\x5e\x14\x87\x48\x24\x75\xca\xda\x50\x6d\xd7\x50\x44\x60\x4c\x9d\xd3\x97\xe8\xa3\x44\x78\x57\x1a\xac\xae\x1d\x01\x46\x0b\x77\x04\x46\x3f\xd6\x0f\x30\xfd\xbb\x70\x50\x9f\xa3\x89\xd6\x54\x7f\x68\xba\xd2\xc5\x56\xc7\x37\xb5\x93\xb2\xda\xb8\x1c\x03\x02\x4a\xff\x7b\x76\x66\x07\xbc\x24\x02\x91\x44\xb4\x14\xb7\x25\x44\xe8\x4c\x57\x75\xd2\x4b\x60\x42\x05\x49\x78\xc3\x8b\x55\xae\x01\x67\x84\x1d\x4d\x89\x79\x45\xaf\x39\x01\x5e\x97\x81\x6c\x8a\x15\xfa\x3b\x74\x40\x49\xe1\xa8\xa3\xa3\x93\xde\xd0\x34\x90\xe0\xd4\x5c\x9c\x71\xbe\xc8\x5c\xa1\x99\x14\xdb\x2d\x2a\xe4\x39\xc5\x92\x20\x4a\x4a\xcb\xd6\x02\xc8\x95\x47\xf3\xa5\xc7\x56\x74\x25\x93\xa6\x9b\x07\xd2\x42\xff\x42\x64\x0a\xbd\xe5\x36\xc8\xed\xbd\x29\x4d\x08\x2a\x33\x95\xe5\x14\x11\x92\x76\xb6\xee\x07\x9d\x28\xc9\x21\x57\x12\xc1\x0d\x26\x78\x53\x6e\xb4\x8d\x9d\x5a\x73\x23\x2b\x86\xa1\xad\xf6\x59\x6f\x54\x25\x34\x66\xbf\x53\xa1\xc5\xb6\x38\x81\x6d\x88\x10\xa4\xb7\x5e\x57\x3b\xf5\xeb\x85\x46\xcb\xf2\xc0\x86\xf2\x17\x75\xc7\x66\xf6\x3a\x15\x60\x40\xe8\x83\x29\x10\x2e\x79\x3c\x4d\x8c\x46\x66\x22\xcd\xe1\x47\x2e\xed\x11\xb3\x6e\x38\xb7\x65\x16\x1a\x1a\xf9\x21\xd6\x3f\xfa\x3a\x90\x2e\xa9\xe3\xb1\xf5\xa4\x1b\x7c\xe3\xe3\x6f\xef\x3f\xbe\x9f\x8c\x48\x2c\x99\x31\x69\xbc\xab\xd0\x5c\xea\xab\xf6\x98\x89\x3c\xe3\x48\x77\x7c\x3d\x72\x4d\x99\x5a\x86\xfe\x0f\x1f\xd4\x8d\xf6\x50\xf1\xe1\xe3\xc7\xdf\x54\xe4\x21\xd2\x82\xad\x6b\x02\x88\xad\x61\x11\x3a\xc5\x00\x02\x4e\xf1\x0f\xdf\xdb\xa2\xca\x79\x9c\x0a\x50\x12\xfe\x1a\xb7\xe9\x8f\x34\xfa\x9c\x8c\xc9\xa4\xab\xe0\x5a\x8a\xfc\xe2\x17\xb1\xee\xa8\x87\xfd\xcd\x5a\xc7\x2e\x7f\x27\x6d\x14\x1a\xc4\x46\x20\x3d\x20\x45\xb9\xf6\x89\x02\x3b\x42\x45\xe5\xcc\x90\x28\xd5\xde\x9b\x80\x09\x9e\xf5\x9a\xf4\x45\xea\x46\x5e\x64\xe4\x2a\x81\x22\x1a\x82\x70\x01\xf4\x8f\xe7\x15\x4d\xa6\xa3\x78\xf8\x8a\x6f\xa1\x75\x0e\x40\xf4\xef\x81\xba\xd3\x74\x6c\xc0\x24\x96\x1a\x92\xf1\x86\x22\x8c\xc8\x4e\xe4\xc9\xd6\x02\x31\xd2\xef\xd4\xeb\xb6\x94\x41\xad\xf7\x34\x36\xd9\xf7\xe4\x89\x45\xe0\xca\x71\x5c\x10\xbc\x1a\xf4\xa0\x83\x1e\x70\xb0\x04\xa3\x39\xa7\x3f\x3d\x5e\x86\x38\x23\x00\x7b\x97\x76\x0c\x08\x39\xa6\x68\x88\x07\x58\x3b\x90\x99\x94\xbe\x35\xde\x76\x33\x30\x34\xd8\x46\xc9\x0c\x44\x2a\x29\x03\xad\x52\xf4\xe2\xab\x10\xc6\x41\x8a\x13\x0f\xab\x91\x5a\xd1\x6a\xaa\x1b\x9a\xb9\x34\x46\x63\x2f\x1c\x76\x86\x93\x87\xc9\xc1\xe3\x83\xe7\x68\x53\xca\xcf\x8b\x53\x85\x98\x07\x80\x18\x97\x0a\xc8\xa7\x81\x3d\x44\xa9\x1a\x66\x25\xaf\xc8\xbf\x4c\x1e\x8d\x97\x0b\x7b\xc9\x7d\x85\xed\x18\x5b\xde\x82\x52\x5b\x7c\xce\xd9\x3f\x58\x02\xdd\x0b\x8b\x4f\x5a\x9a\x5a\xe8\x07\x5b\x34\x85\xca\x9a\x38\xe2\x51\xf8\x7b\x9b\x09\xea\xfd\xa8\x46\xfa\x46\x47\x03\x6b\x5b\xc4\x69\x4e\xb5\x1c\x2e\x59\x4d\x34\x05\xb5\x94\x72\xa0\xb9\x56\xe3\x86\x02\xdc\x11\x7a\xfb\x44\xb0\x6c\x8a\xb5\x4c\x7c\xcc\x22\xdb\x36\xdb\x85\xdd\x5f\x3e\xe5\x8a\x3d\x2a\xf9\x66\xd6\x48\xa3\x82\x2a\x48\x30\xc4\xf9\xc8\x06\xa5\xc4\x3b\xaa\x24\x4c\x45\x8a\x9a\xe6\x58\x57\x84\x85\xbe\x37\x41\xc2\xcc\x2f\xbb\x08\xae\x81\xd3\x1b\xcb\xd3\x9a\x4f\x28\x85\x69\xbd\xe8\x31\x74\xd0\x1b\xb4\xed\x36\xd2\x4b\x69\x95\xcc\x60\x62\xb5\xe7\xb1\x5e\xdd\x11\x0f\x0c\xb1\x3c\x23\x46\x84\x58\xf4\x91\x28\x08\xe0\x42\x26\xe3\x45\xb4\x27\xec\x28\xe7\xd4\x5d\x98\xec\x3d\x64\x97\xbe\x90\x4a\x04\x48\xa4\x00\x66\xfe\x8d\x43\x43\x8a\x22\x6b\x89\x1c\xf5\x69\x8b\xd6\x31\xd8\x02\x39\x82\x87\x58\x22\xc8\xa9\xb9\x18\xa4\xf0\x48\x38\x60\xde\x37\x95\x00\x0c\x5e\x1b\xf4\x7d\xf9\xdd\x1d\x5b\xaf\xba\xaa\x8c\x23\xb4\x8d\x46\xe0\xf6\x37\xc0\x15\x1d\xd9\x47\xcf\x7f\x90\x51\x4f\x93\xef\xa5\xf3\x2a\x30\xe7\x3f\x03\x3c\xb0\x98\x6b\x9b\xa2\xdc\x8c\xba\x82\xe3\x6b\x9d\xde\x0f\xd4\x12\xe9\xcf\x05\xbd\x98\x40\xb7\x26\x9c\x32\x46\xaf\x50\xc3\x44\x58\x11\xa6\xef\x0d\x88\x5c\x64\x5d\x1c\x5d\x40\xaa\x65\x78\xc6\xe0\x67\x12\x46\xf3\x25\xc2\xfd\x13\x78\x82\xe0\xb2\x2f\x5d\xe2\xcf\xac\x0a\x4c\xdc\xef\x4d\x97\xe8\xb6\xc7\x9e\x41\x62\xad\xef\x29\x95\x48\x2a\x66\x72\x9a\x62\x30\xd5\x6f\x0e\x84\x9a\x96\x1d\x4f\x7f\x4e\xa7\x3b\xab\x40\x50\x83\x6b\xfd\x7c\x8a\xa8\x98\xee\xa5\x50\x64\x39\x5b\xb3\xc7\xf8\xae\x65\xf4\xca\xbb\xa3\xce\xeb\xe3\x3b\x3a\x21\x25\xa8\xad\x52\x88\x13\x8e\xfb\x14\x07\x59\x09\x9c\x0c\x3a\x12\x74\x4b\xdd\x55\x40\x1f\x97\xcd\x73\x5c\x56\x79\xcc\x20\x59\xf0\x40\x6d\x8a\xdf\x6f\x45\xe0\x7f\x40\xef\x27\x83\x5e\x6c\x27\x42\x3d\xba\x14\x6a\xbb\xab\xab\xeb\xcc\xa0\x08\x33\x75\xea\x0b\x1d\xda\x06\xcb\x88\x49\xf3\xa1\x0f\x6b\x1c\xc0\xc7\x5d\xdd\x3f\x78\xfd\xb0\x4b\x5b\x85\x3f\xb7\x4d\x19\x22\x49\x0d\x5d\x1c\xc4\x9d\xc4\xca\x1f\x6f\x66\xaa\x7d\x42\xd0\xf8\x9d\x8e\xc7\x41\x6f\x0a\x30\xeb\xec\x84\xea\xd1\xd4\x24\x1e\xde\x44\x49\xaa\x7b\xd5\xdb\xb6\x98\xe6\xe7\xf0\xf4\x84\x7b\xb0\x51\x13\x55\x6e\x57\xfa\x0c\xba\x8f\x4e\x95\xa2\x99\x8f\xd4\x6f\xed\x05\xec\xe4\x62\x07\x3b\x41\xe2\x85\x76\xbe\x89\xa8\xc8\xf9\x96\x78\x64\xef\x4c\x20\x07\x05\xc8\x37\x96\xa7\x01\x3b\x29\xdc\xcd\x1f\xe9\xa3\xb7\x03\xf7\xaf\x03\xc4\xed\x74\xc2\x20\x13\xc6\x36\xb0\x41\x72\x8d\xa1\x07\x6a\xe6\x08\x61\x32\x78\x2d\x9e\x54\x9a\x01\x2d\x32\xda\x9d\xc9\x1f\x97\x15\x9d\x1d\x99\xd9\x65\x1d\xb3\xa3\x9f\x1d\xad\xa3\x87\x88\x31\x5c\x2e\x3c\xd1\x0e\x1c\xea\x16\xeb\x78\x32\x21\xe0\x99\x4b\x1b\xb2\x19\x76\xac\x7b\x63\xdf\xe1\x3b\x1f\x7a\xa7\xf7\xf0\xce\xc6\x0b\x15\x26\x04\xa5\x1c\x46\x81\xf8\x1d\x3d\x86\x9e\x83\xf6\x04\xad\x36\x86\x17\x29\x00\xd0\x67\x14\xb7\xd4\xf8\xb2\x3d\x2f\x49\x6c\x63\xd4\x12\xa6\xd9\x96\xcd\x87\xa4\x06\x10\x76\x7c\x64\xf2\xdf\xf4\xfc\x63\x95\x38\xf6\x11\x18\x13\x0a\xec\xb0\xaa\xd7\x36\xb7\xc4\xed\x41\x54\xb8\xd4\xb9\xc7\xa4\x2d\xd2\x06\xcc\xa4\xc5\x02\xc1\xef\xfe\xf5\xa0\x5c\x65\xc1\x5a\xbd\x86\x8f\xa9\x69\xaf\x13\x05\xd7\x84\x22\x64\x86\x82\x49\xd0\x95\x02\xf3\x70\xce\xed\x36\xc5\xc8\x30\xa3\x38\xed\x07\x44\x33\xa7\x69\x89\x31\x5d\x32\xa0\x17\x40\x26\x52\x22\xf9\x32\x48\x18\xcc\x5f\x39\x54\xc4\x0b\xc6\x97\xba\x1e\x39\x4c\x7b\x39\xcc\x62\x95\x05\x25\x87\x24\x6c\xe4\x70\x70\x14\xd2\xdc\xe8\xfe\xd5\x46\x7b\xaf\x16\x87\x60\xec\x5c\xba\x30\x91\x6b\xa4\xfe\x15\x52\x04\x2a\x3a\xd2\xbe\x70\xe0\x7b\x21\x49\x0c\x79\xed\x59\xff\xad\x1d\x3d\x50\x57\x72\x17\x99\xbc\xd1\x25\xb7\x6e\x2f\x17\x78\xc0\x18\xe2\x90\xd4\xad\x74\x97\x87\xf0\x85\xa4\x0b\x60\x2c\x57\x71\xb8\xbb\xf6\x00\x91\x43\xe7\x74\x38\x1c\x4f\xec\x9d\x39\x67\x67\x59\x2f\xb8\x1c\x7f\x54\x6c\x99\xc5\x43\x51\xda\xdd\x90\xc5\xd8\x3d\xfb\x1f\x27\x1b\x38\xdd\x52\x7f\x31\xa2\xbd\x0e\x64\x31\x3b\xcd\xbd\x95\x35\x02\xd5\x0e\x1c\x63\xab\x7f\x80\x52\x56\xfe\x13\x8b\x0e\x55\x4f\x4d\xfd\x5f\x00\x00\x00\xff\xff\x93\x28\x3d\xff\xee\x1a\x00\x00") - -func confLicenseCreativeCommonsCc010UniversalBytes() ([]byte, error) { - return bindataRead( - _confLicenseCreativeCommonsCc010Universal, - "conf/license/Creative Commons CC0 1.0 Universal", - ) -} - -func confLicenseCreativeCommonsCc010Universal() (*asset, error) { - bytes, err := confLicenseCreativeCommonsCc010UniversalBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Creative Commons CC0 1.0 Universal", size: 6894, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseEclipsePublicLicense10 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x5a\x4b\x93\xdb\x38\x92\xbe\xeb\x57\x20\x7c\x71\x55\x84\xac\xdd\x99\x7d\x45\x74\x9f\xd4\x2a\x96\x8b\xb1\xb2\x54\x23\x4a\x76\xfb\x08\x91\x50\x09\x6d\x3e\x34\x04\x59\xb2\xfe\xfd\x7e\x99\x00\x48\x90\x52\xb9\xdd\x7b\x99\x83\xc3\x25\x89\x48\x24\xf2\xf1\xe5\x97\x09\x46\x69\xae\x4f\x46\x89\xe7\x76\x9f\xeb\x54\x2c\x75\xaa\x4a\x7c\xfc\x20\x5e\xc5\xdf\x66\xff\x3e\xd9\x3e\x45\x62\xbe\x58\xac\x3f\x3d\xcf\x57\x5f\xe3\xd5\x47\xf1\xbc\x59\x7f\xdc\xcc\x3f\x89\x38\xa1\x3f\x3f\xc7\x0f\xd1\x83\xd8\xad\x1e\xa2\x8d\xa0\x47\xb7\xd1\xe6\x53\x22\xd6\x8f\xf8\x80\x07\xa2\xc5\x32\x7e\x4e\x22\xf1\xbc\xfb\x6d\x19\x2f\x04\xfe\x45\x2b\x7c\xbc\x7b\x37\xff\xb8\x89\xa2\x4f\xd1\x6a\xfb\xee\x7e\x26\x20\x58\xec\x92\x68\x2a\x36\x11\x24\x3e\xec\x16\xdb\x78\xbd\x12\xeb\x8d\x78\x88\x93\xed\x26\xfe\x6d\x67\x3f\x3f\xf2\x06\x7e\xfb\xc5\x7a\x95\x6c\xe3\xed\x6e\x1b\x25\x58\xb7\x88\x9f\x63\x48\x7b\x9f\x90\xae\xd1\xf3\x76\xbe\x5a\x44\x9d\x16\xdd\x66\xb3\xc9\xe4\x6f\x33\xf1\x10\x3d\xc6\xab\x98\x64\x26\x93\xc9\xbb\x45\x55\x36\xb5\xde\xb7\x8d\xae\xca\x77\xa2\x50\xb2\x34\xbf\x88\x89\xbc\x17\xba\x14\xcd\x51\x89\x54\xc2\x18\xd5\x81\xff\xd6\xa5\x6e\xb4\xcc\x45\xb7\xa6\xaa\xa7\x83\x1f\xd2\x2a\x53\x42\x96\x99\xc8\xaa\xb4\x2d\x54\xd9\x48\x12\x2b\x32\x6d\xec\xf3\x2a\x13\x6d\x99\xa9\x1a\x8b\xb4\x11\xf3\x97\x5a\x29\x7a\x6a\xca\x6b\x26\xfb\xab\x4d\x95\x4c\x8f\xc2\xb4\x7b\xa3\xfe\xd9\xe2\xb9\x70\x63\x28\xa9\xef\x45\x7a\x94\xe5\x8b\x32\xa2\xa9\x78\xdd\x73\x5d\xbd\xd4\xb2\x70\xf2\x34\x1e\x90\x59\xa6\x49\x87\xf1\x23\xbf\x4e\x26\xe7\xa3\xaa\x15\xa4\x63\x0b\x2f\x06\xcb\xfe\xad\xaa\xdf\x5c\x24\xaa\x5a\xbf\xe8\x52\x36\x4a\x1c\xea\xaa\xe0\x5d\x24\x64\x84\xe7\xdb\x5f\xb0\x42\x36\xe2\x24\xeb\x46\xa7\x6d\x2e\xeb\x50\x6b\x38\x5b\x84\x16\x17\xef\x3b\x91\xe6\xbd\x13\x1a\x3e\x2f\xf4\x41\xe8\x46\x9c\xa5\x21\xa5\x20\x7e\xa4\x10\x76\xe3\x03\x0c\x96\x34\x46\xe5\x07\x41\xe7\x28\x2f\x55\x09\x87\xa4\x8d\x2e\x5f\x04\x76\x1b\x3f\xfb\xde\x88\xbd\x3a\xca\xfc\x30\x1b\x68\x65\xe0\x3f\x51\x56\x0d\xdc\x91\xe6\x2d\xb9\xf4\x2d\x83\x9c\x8f\x3a\x3d\xfe\x22\xee\xc8\xd2\x64\x4c\x85\x63\x93\x79\x8a\x2a\x6b\x73\x18\x14\x3e\x34\xd5\xa1\x39\x8f\xad\x04\x3f\xa7\x55\xf9\x47\x5b\xa6\x6c\x85\xb3\x6e\x8e\x03\xb9\x3e\x4a\x94\xae\x45\x75\x2e\x45\xee\xb2\x52\x0e\x43\xe6\x4e\xbb\x8d\x49\x59\xac\xd0\xaf\x08\xb8\x57\x25\xce\x55\xfd\xcd\xf8\xa8\x75\x32\x67\x22\x08\xf6\xaa\x76\xb1\x4e\x36\x12\x27\x55\x1b\x68\x01\x8b\x41\xb2\x6e\x9c\x07\x7b\x7d\xcd\x40\x0e\x92\xc6\x81\x44\x26\x9e\x71\xd8\xb2\x31\x56\x18\x7c\x4e\x9f\x44\x9a\x4b\x5d\x18\xa7\xb3\xdc\xe7\x8a\xdc\x34\x74\x2b\xdb\xcd\x6a\xae\x52\x65\x8c\xac\x75\x7e\x81\x55\x0e\x35\x3c\xe5\xa3\x48\x89\x96\xd2\xa0\x16\x46\xe6\x9c\x0e\xf0\xec\x30\x7a\x64\x4e\xfe\x65\x79\x8a\x2c\x5a\xec\x75\x89\xd5\x63\x73\x92\xca\xee\x4f\x7f\x6c\xfa\x75\xe4\xf2\xa1\x7b\x64\x9a\x56\x75\x26\xcb\x54\x79\x71\x61\xc6\x92\xc4\x8d\x4a\xf5\x49\xe3\x43\x60\x4a\x52\xe7\x7c\xac\x44\x8d\x53\xc1\x11\xe6\xa6\x53\x87\xa9\x6f\x63\x8c\x02\x54\xe6\x03\x68\x31\xd8\xe4\xef\x33\x01\xb4\x5b\x6d\x09\xcb\x36\xf1\xc7\xa7\x2d\x20\x0b\xd8\x94\xb4\xfb\x3f\x54\xda\xf8\x68\x6c\x54\x5d\x38\x77\x0f\x65\x33\x7e\x84\x76\xa7\x94\x87\x6d\xa1\x0e\xbc\x26\xba\x13\xc0\x3b\x65\x55\x7e\x50\xdf\xa1\x8a\x81\xde\x53\x8a\xa0\x3c\x3b\xeb\x0c\x7f\xd6\xd5\x45\xe6\xcd\xe5\xc3\x01\x62\x61\xe3\xd3\x05\x19\x7b\x6c\xba\x90\x6c\xe8\xb4\xa7\x1a\x01\x9f\xe2\xe1\x53\x4d\x29\xa0\x6e\x05\x23\x7e\xe4\x12\x03\x47\xc3\xd6\xa7\x5c\x5e\x82\x6f\x10\x82\x87\xaa\x06\x72\xf5\x6e\xe0\x08\x37\xfc\x80\xdd\x68\xe4\x32\x4e\xae\x51\x42\x4f\x09\x30\xe0\x87\xa9\x5b\x8c\x5f\xc7\x9a\x90\xc5\x91\x94\x6d\x9d\xaa\x1e\xaf\x2b\x6b\x4f\xfe\x4c\x7a\xc0\xf4\xfb\x7f\xa5\x99\x5d\x26\xf9\xa3\xdb\xc8\x19\x67\x1d\xe9\x55\xc8\x6f\x58\x8b\x3c\x99\x02\x7c\xf2\x7c\x0a\xf5\x0e\x14\x64\x95\xfb\xa8\x8b\x53\x55\x37\xf6\x8c\x38\x43\x7d\xd6\x64\x49\xe8\x65\x0e\x16\x60\xfe\x82\x49\x7f\xc6\x6e\x62\x4b\xb6\x19\xa9\x6f\x8e\x14\xda\xf2\x74\x82\xa3\x9d\x2d\x6d\xae\x4a\xbf\xe9\x95\x22\x24\x3c\xcc\x1d\x8d\xf0\x01\x26\xb1\x1b\x74\x71\x23\x18\xb4\xaf\x10\x0e\x3a\x06\x27\xe0\x33\x79\x10\xbf\xb9\x5f\x2a\x61\x43\xe3\xaa\x61\xa0\x1b\xd4\xdd\x93\xb6\xaf\xf0\x68\x27\x7b\xec\x08\x3a\xf5\x95\xcf\xec\xa1\x09\x98\xbb\x83\x13\xd6\xb2\x17\xc2\x2d\x8c\x03\x43\x5f\x6b\xc6\xaa\xcd\xc4\xaa\x12\x47\x59\x67\x5c\x44\x90\x27\xf0\x2c\x9d\x36\xf7\x4a\x50\xb0\x71\x80\x20\x68\xd3\xfb\x20\xda\xf8\x4b\xd3\xc0\x94\xc6\x22\x3a\xe2\xeb\x58\xb5\x2f\xc7\xeb\x80\x75\x91\x4a\x7b\x3b\xb9\x1c\x5d\x63\xc0\x85\x81\x54\x43\x8e\x06\x20\xd2\xb6\xba\x9c\xe2\x84\x42\x1a\xd3\xd6\x04\x95\x86\x21\x1d\x60\xf0\xaa\x9d\x2b\xe8\xc8\xe1\x46\xac\x47\xe8\xd8\xac\xc2\x2a\x5b\x6b\x2d\xf8\xf3\xaf\xce\x96\x58\x60\xed\xa5\xcb\x06\xe1\x8c\x50\x6b\xc1\xb2\x20\x1f\x66\x40\x99\x62\x20\xe2\x8c\xec\x2d\x6b\x2b\xd8\x4c\x44\xe3\x23\x02\x58\x5c\x61\xa2\x87\x73\x2d\xf7\x3a\xe7\x5a\x57\x05\x26\xc3\xd1\x7c\xf9\xda\xd7\x64\xaa\xc6\x1f\x22\x94\x2e\xf6\x92\x0c\x4f\x51\xe7\x94\x2e\x58\xdb\xc3\x9f\xe8\x59\xf7\x39\x08\x22\x04\x45\x88\x04\xb8\xa0\x84\x1a\xea\xbb\xaa\x53\x6d\xa8\x14\x90\x0d\xdc\x2a\xca\x84\xce\x27\xec\xa7\xd0\xe7\x0e\x7c\xfa\x13\x38\xe8\x21\x97\x14\x14\xd0\x15\x4a\x67\xad\xcc\x09\xce\xd3\xfd\x89\x8d\x4a\xdb\x5a\x05\x07\xfb\xa1\xe2\xa5\x52\x70\xa7\x07\x82\x99\x78\x24\xa6\xf0\x5d\x16\xa7\x5c\xd9\x2f\x09\x11\xeb\x8c\x39\xdf\x65\x9c\x07\x08\xd5\x1a\xf4\x55\xd7\x96\xbd\x21\x29\xaa\x73\xa0\x2f\xbe\x0a\x20\x7f\x40\x62\x41\xfc\x74\x80\x9e\xef\xcd\x8d\x83\xc8\x94\x45\xdb\xb8\xf2\x5b\xee\x15\xfc\x18\x10\x2e\x6f\xd1\x9e\x0e\x64\xf7\xd7\x01\x42\x55\x4c\x19\x0b\xac\x1c\xa5\x36\xfe\xbf\x95\xd5\x39\x57\x19\x02\x13\xfa\x1c\x25\x61\xc4\xe1\xa0\x53\x56\xbe\xaf\x86\xce\x52\x80\xc8\x71\xce\xf4\xf8\x09\x81\xec\x3f\x07\x80\xe3\x42\xda\xa7\x16\x77\x01\x23\xba\xf1\x1f\x33\xb4\x39\xff\xd8\xc5\x1b\xee\x64\x12\x31\x99\x0f\x94\x2f\xe4\x05\x2c\xbe\xaa\x6c\x41\xbe\x6d\x51\x92\x3b\x06\x6c\x57\x5a\x48\xe9\x37\x78\x66\x97\xcd\x64\x94\x5f\x98\x7e\x68\x12\x00\xef\x6b\x04\x58\xc7\xb5\x6c\x75\xa4\x68\xed\x82\xfa\x46\xb1\xfc\x95\x9e\xe0\xe2\x4a\x5b\x5e\x6d\x67\xbb\x1a\x85\x1a\x96\x52\xc5\xb6\x54\xc1\x25\x24\x92\xc4\x92\x75\x4e\xf8\x11\x57\xe2\x2f\x80\x90\x64\x5f\xad\xc6\x7a\x20\x4b\xbe\x93\x73\xed\xf7\x9a\x55\xcf\x42\xea\x15\xac\x24\x04\x18\x1e\x40\x37\xb9\xad\x76\x54\xbc\xc3\x8c\x9f\x86\xe2\x7e\x28\xa3\x40\x66\xa3\xc7\x6a\x3c\xe8\xd0\xba\x83\x6e\x4a\x52\x89\x30\x47\x86\xfd\xd2\xa9\xad\x4f\x70\xe4\xaf\xb6\x83\x0b\x8d\xc1\xcc\x21\x53\x3f\x63\x8b\x1e\xe0\x48\x7e\x26\x0b\x89\x06\x2f\x3c\x72\x86\xb4\x49\x99\x7f\xfa\xbf\xcc\x09\xa9\x26\x73\x7e\x08\x1e\x87\xb6\xb9\xb7\xa3\x6b\x40\xa9\xc7\xed\x44\xd9\xa2\x0a\x27\x56\xa6\xa1\x28\xc1\x79\x0c\xeb\x0c\xa5\x51\x75\x6c\xdb\x40\x55\x87\x3a\x0c\x0a\x22\x13\x54\xbb\x4c\x33\x4f\xe1\x8e\x6f\x18\x21\x5c\x42\x98\xc5\x04\xdd\x64\x18\xea\x96\xf4\x5b\x7f\x8c\xe0\x99\x01\xe8\x57\xd7\xfd\xbe\x0e\xd5\x08\xa9\xcb\xa1\xaa\x87\x89\x01\x9b\xbd\x4a\x9d\x73\xb3\xc2\x3a\x5d\xb3\x20\x76\x75\x49\x39\xd3\xc5\x2d\x44\x1f\x01\x66\x48\xb8\x6a\xdf\x48\xce\x7d\x6e\x1d\x00\x25\x12\x0d\x15\x4b\x2b\x64\x59\x42\x33\xdb\x5e\x35\x47\x2e\x2a\x78\xa2\x50\x99\x6e\x0b\x91\xb6\xa6\xa9\x0a\xdb\xfd\xb4\x54\x53\x48\xb3\xae\x63\x84\xbb\xb9\x31\x47\xfa\x7f\xa1\x06\x67\xa4\x72\x21\x89\x85\x75\x7a\x8f\xe8\x19\x69\xda\xa5\x6b\x81\x7d\x88\xc8\x8c\x96\xdc\xea\x48\xfa\x0c\x95\x0c\x52\xd7\x39\xdc\x49\x73\x94\xc5\x35\x5c\x5c\x88\xfa\x15\x61\xe3\x39\x88\x4e\x82\x2a\xf2\x5c\xad\x0a\xd0\x2a\xee\xd3\x73\x80\x07\xbb\xb1\x47\x45\x3c\xa1\x89\x50\x20\xf8\xc8\xb4\x6e\x13\x5d\x8e\x80\xfc\x0a\xc5\x59\x37\x8e\x5e\x7d\xb8\xf8\x59\x80\xb4\xd4\xc6\xcf\x1a\xa8\x10\x5f\x77\x93\x03\xa2\x2b\xbd\xe3\x38\x76\x3a\x7f\x5e\x6c\xfd\x32\xe1\x50\xa6\x2b\x50\x96\x32\xf9\xad\xaf\x37\xbc\x62\x76\x93\xc9\x7f\xce\xc4\x62\xfd\xe9\x53\xb4\x59\xc4\xf3\xe5\x70\xde\x05\xa3\x15\x04\x1b\x9c\x73\x1e\xcf\xc9\x7e\xe1\x4c\x81\x6c\x89\x4e\x55\x9d\x80\xc8\xa8\xd8\x14\x83\x83\x1a\xd9\x21\x34\x7d\xeb\x5a\x19\x85\x40\x46\xac\xd5\x48\xe1\x3d\xda\x10\xc6\x20\x4a\x1c\x9c\xd6\x74\xbc\x3b\xd7\xdf\xc0\x51\xbe\x1c\x75\xae\xac\xf7\x83\x72\x4e\x5c\xa1\x74\xc3\x98\x83\x4c\x69\x1f\xe9\x2a\x4d\xda\xeb\xdc\xf6\x73\xb3\xae\xa2\x8f\x88\x39\xb7\xca\x2e\x88\xcc\xb8\x52\xc9\x50\x98\xed\x2f\x1b\x8b\x0b\x84\x5e\x06\x44\x36\xa7\x39\x1b\x6c\x31\xf0\x97\x83\x17\xcf\x2a\x53\xb8\x0e\xba\x9d\xaa\xc6\xc1\xd7\x10\x17\x2d\x6c\x0c\x9a\x6e\xe2\xf2\x35\x13\x08\xc7\x6d\x06\xb3\xa5\xff\x8f\xb2\xd3\xeb\x19\xd5\xdd\xbb\xc0\xbb\xe1\x54\xe6\xbe\x23\x70\x94\x6d\x1c\x51\x99\x3a\x90\xcb\x2c\xfe\x64\xaa\x28\x29\xba\x14\x1a\x92\xcb\xb5\xfa\x10\x1c\xbb\x67\xa8\x24\x0d\x25\xcb\x17\xc4\x87\xb1\x80\x0c\xd0\x36\x04\xe2\x0e\xcd\x1d\xce\x1b\xc4\xf0\x5d\x5a\x31\x11\xb4\x15\xe7\xdd\x92\x1f\xa4\xd5\xb5\xa5\xa6\x0c\x8f\xb6\x24\x4f\x45\x2e\xcf\xa6\xd5\x8e\xa5\x5a\x6d\x72\xf5\x42\x75\x23\xb5\xb5\x2f\x64\xd1\x03\x96\xe8\x95\x21\x43\xbe\xa1\xb2\xef\x15\xd5\x77\x3b\x56\x92\x8c\x90\xae\x07\xc3\x06\x96\x51\x17\xda\x18\x5f\x66\x9d\x9d\x6f\x59\xd6\x8d\xdc\x4a\x15\x4c\xdc\x48\xf1\x9e\x24\xf6\x9d\xe1\xcf\x3a\xd6\xf6\x7d\xd5\x3e\xd7\x2f\xae\x95\xf3\xcc\xcd\xb8\x6d\xdc\x1c\x71\xd0\x01\x7a\x3a\x83\x86\x9e\x6d\x8b\xdc\xcc\xa5\xe5\xa8\xf6\x01\x69\x59\x38\x03\x23\xac\xc9\xf3\xa8\x5b\xec\x3c\xa4\x22\x33\x18\x11\x2b\x32\xdb\xfb\xff\x13\xcf\x21\x4a\xa8\x68\xbd\x69\x5c\x02\xca\x5f\x04\xca\x03\xe4\x15\xa7\x26\x67\x50\xf6\xc0\xf5\xb6\x0d\xcf\xb5\xb6\xd3\x54\x67\x6d\x3e\x8d\xad\x8e\x54\x32\x98\xdd\xff\x40\x02\x94\x23\x44\xaf\xab\x7c\xea\x62\x8e\x0e\x43\x29\xda\x11\xc9\x37\xf7\xb6\xf8\xc1\xe9\x60\x2c\x01\x20\x6b\xb1\xf5\x70\x36\xd0\x67\xf0\x34\xae\x4f\xa5\x7a\xc1\x51\xac\x4b\xac\x8f\xde\x34\x82\xbc\x38\xe6\xa5\xa9\x6d\x61\x8f\x97\x97\xe0\x64\x34\x74\xf0\xe4\x18\x1c\x92\x76\x06\x6c\x0f\x1a\xa0\x21\x42\x14\x5c\xbd\xc2\x66\xfe\xe7\x61\xe2\xd9\x7d\xf3\x3b\x29\x3d\x62\x3d\x9a\x31\xa7\xe4\xdd\x6e\xd9\x07\x01\x70\xf0\x5c\xe9\xb6\xe5\x69\x35\x8d\x8b\x8c\x1f\xb6\xf1\x70\xd3\x67\x32\x97\xa8\x03\x95\x80\x80\xc7\x7a\xdb\xc2\x6b\x9d\x6e\xe4\x05\x6a\x33\xae\x85\xb0\x4b\x42\x0e\xee\xaf\x17\x6e\x6b\x74\xdd\xcf\x31\xb3\x9b\x89\x5d\xcf\x4a\x5c\x1e\x4d\x7f\x14\x18\x67\xae\x04\x47\xf9\xaa\x02\xb4\xf4\x1a\x05\x28\x73\x8d\xf5\xe1\xf9\x7e\xf2\x50\x8e\x07\x1e\xd8\x95\x6d\xdd\xf8\xde\xd6\x04\x2c\x74\x14\xef\x27\x69\x29\x6a\x07\xb5\x86\x19\xa2\x69\xf3\xe6\x87\xe7\x62\x26\x43\x8b\xad\x6a\x6e\x39\xa2\xef\xbf\x66\x62\xb5\x16\x5f\xe6\x1b\x9a\x0c\x7f\x15\x93\xe8\x77\xba\xf2\x12\xf3\x44\x44\xbf\x3f\x6f\xa2\x24\x59\x7e\x15\x49\xb4\x15\x8f\xeb\xcd\xf6\x49\xc4\xab\xd1\x2d\xd8\x74\x70\x8f\x16\x5e\xe3\x81\x75\xcc\x57\xe2\x1d\x04\xc5\xc9\x3b\xf1\xdb\x3c\x89\x93\xa9\xf8\x12\x6f\x9f\xd6\xbb\xad\xdf\x2f\x8e\x12\xba\x9a\x5b\xac\x57\x0f\xf6\x0e\x8d\x46\xd3\x74\x83\xf7\xbf\xf1\xea\x61\x2a\x22\x3c\x1d\x6d\xbc\x22\xf4\x64\xfc\xe9\x79\x19\x43\x78\xbc\x5a\x2c\x77\x0f\xf1\xea\x63\x2f\x72\x19\x7f\x8a\xb7\x73\x92\x32\x65\x11\x3f\xda\x62\x1b\x6f\x97\xd1\x14\x07\x5f\x7d\x88\x57\x8f\x1b\xc8\x71\x87\x21\xf2\xf4\x84\x55\xf3\xdf\xe2\x65\x0c\x73\x60\xe5\x63\xbc\x5d\xd1\xee\x30\x80\x98\x8b\xe7\xf9\x66\x1b\x2f\x76\xcb\xf9\x46\x3c\xef\x36\xcf\xeb\x24\x72\xd3\xa1\x7e\x08\xa1\xed\xa0\x24\xbf\xf4\x11\x99\xdb\x2e\x21\x53\xd4\xd7\xea\xd2\x8f\x10\x80\xe4\x80\xdf\x5a\xd3\x8c\x83\x88\x13\x60\xb0\xe5\xb2\xc8\xb7\x7e\x6f\x0c\x1c\x2c\x56\xb9\x89\x0c\x35\x67\x28\xa5\xdf\x28\x10\x4c\x95\x6a\x0e\xc0\xae\x1c\xb9\x19\x10\x53\x27\x37\x53\xb8\x45\xd2\x45\xd8\xc9\x61\x43\xae\x32\xb9\x2e\x74\xd3\xdf\x91\xb9\x4d\xba\xc2\x0e\x89\x27\xa7\x8f\xaa\xeb\x8a\xf8\x9f\xed\xe2\xfb\x4b\x0e\xaa\x53\x3a\xe5\xd6\x80\x2a\xbb\xa7\x07\xdc\xe1\xd4\xcc\x19\x48\x4a\x26\x1b\x39\xf5\xb2\xb8\x90\x51\x0e\x9c\xfa\x8e\xb8\x2d\x5d\x8b\x61\xd3\xba\xb2\xe3\xa5\xba\x6e\x4f\xbe\xca\x5a\xd0\x67\x7c\x9e\x4c\xfe\x7b\x46\xcc\x77\xb1\x9c\xc7\xf0\x25\xf9\x7a\x19\x7b\x67\xfe\xf5\xd8\x5e\xb9\x08\xec\xee\x84\x11\x32\x1b\x8e\x2e\xc4\x93\x65\xd7\xeb\x4d\x22\x92\xa7\xf9\x72\x29\x9e\xe6\x9f\x23\xfe\xad\xdf\xf1\xd1\x3d\xfd\x10\x43\x02\xe4\x21\xaa\xbb\xbf\x16\xc8\x12\x04\xda\x72\x2a\x92\xe7\x88\x18\x3b\xe2\xfd\xf7\x08\xf1\x3d\xdf\x7c\x9d\xba\x90\x4d\xa2\x7f\xec\xf0\x10\xd3\xf9\xf9\xa7\xf9\x47\xc4\xf2\x5d\x17\xfa\x37\x22\x5f\x2c\xd7\xc9\x96\x52\x10\x41\x9b\xdc\x4f\xc5\xd3\xfa\x4b\xf4\x19\xfa\x2f\xe6\xbb\x04\x59\x33\x5f\xb9\xb4\xfc\x4a\x59\xbb\xde\x7c\x1d\xd8\x07\xa9\xf4\x14\xf1\x71\x61\x09\x3e\xdf\x9c\x34\xa5\x2e\x62\xb1\x0d\x1f\x83\x6e\x38\xf6\x36\x54\x65\x15\x7d\x5c\xc6\x1f\x23\xbe\x28\x87\xd5\x49\xca\x97\x38\x89\xee\xc5\x7c\x13\x27\xf4\x40\xbc\x72\x49\x89\x3d\x77\x5b\x7f\xff\x0e\xad\xfe\xec\x6a\x7e\x6d\x5f\x05\x80\x69\xd0\xd6\x24\x91\x07\x08\x7b\x7f\x65\xef\xb3\x70\x32\xec\x17\xf1\x7b\x03\x30\xe2\xe7\x68\x25\x62\x3c\xf5\xf0\x39\xa6\x43\x7b\x79\xeb\x24\x89\x7d\x56\x3f\x8a\x64\xb7\x78\xf2\x36\x45\xd4\xfc\xcf\x4c\x40\xfb\x68\x33\x5f\x4e\x26\xf1\x61\x38\x65\xb8\xd1\xb3\x72\xdf\xf2\x0a\x5a\x94\x51\x3c\xb6\xa5\xa2\x56\x3e\x55\x41\x1b\x3c\x0c\x7e\x1e\x3f\x06\x33\x7c\x9e\xc2\x70\x5e\xb1\x10\x17\xd7\x9d\x14\x17\xe9\x96\x3f\xa2\xb3\x95\x9a\x65\xba\x2f\xde\xbc\x39\xe2\xe2\xa2\x69\x2a\xdf\x88\x03\xca\x09\x95\x0f\x4b\x9d\x3d\xcf\x65\x76\x42\x83\x06\xb4\x05\x4d\xe5\x5a\x89\xfe\xa0\x56\xc3\x3d\xed\x49\x85\xab\xcf\x7e\xc2\xac\xa2\x2d\x3c\x79\xf6\xd7\xac\x17\x7f\x69\x34\x16\x64\x4d\x43\xfa\x04\x96\x99\xb1\x69\x03\x9c\x44\x2d\xd5\x0d\xdf\x08\x77\x53\xde\xc6\x91\xdf\x41\x7b\xe1\xe6\xe4\x77\xc1\xe5\x26\x5a\x31\xe0\xc7\x07\xcb\xaa\x78\x40\xd6\x12\x28\xd8\xcf\xcc\x8d\x5c\x33\x71\x6f\x69\xaf\xc5\xd0\xd1\x6d\x81\xeb\xe7\xef\xec\x20\x8c\x1e\x19\xdc\xa4\x8c\xf8\x3b\x63\x9a\xad\xc9\x5d\xc7\x4c\xb7\x73\xee\x32\xe5\xbe\x63\xd0\xee\xe2\x27\x1c\x35\xdb\xf3\xdd\x99\xfb\xa9\x65\x4e\x57\x0f\x38\x74\xf6\x13\x79\x1b\x43\x89\xe3\xfd\x7f\xbf\x03\x19\xb6\xbe\xb1\xf5\x83\xc8\xa5\xec\x14\xcc\xe8\x23\x4b\x0c\xec\x87\xc8\x38\xa0\xdd\xce\x60\xf4\x39\xd6\xdd\xd8\xeb\x66\x25\x18\xef\x62\xdf\x98\x38\x00\x7f\x8d\x65\xdb\x05\xf5\x1e\x16\xde\xcb\x2e\x44\x0b\x3c\x5a\x13\xe3\x70\xa1\x79\x35\xf4\x1c\xcd\xe4\xf8\x9d\x16\xdf\x53\xb7\x9e\xd8\xd1\x2e\xf4\x61\x3c\xf4\x02\xba\xeb\x2a\xb3\xc3\xd3\x02\x07\x3f\xd0\x7c\x67\xaf\xa0\x0b\x87\x82\x75\x84\x6b\x20\xca\xaa\xec\xcb\x10\xb3\x58\xf9\x17\x4e\xdf\x9d\x7b\x1a\x5e\xb3\x76\xbd\x33\xc2\xd8\xd8\xd7\x08\x86\xf5\xf9\xba\xd7\xa3\xc1\x7e\x45\x51\x6c\xc2\x69\xcf\xa9\xa6\x6c\x64\x50\x98\x89\xa7\xea\x4c\x6d\xf7\x74\xa0\x5c\xd8\xfd\xdd\xd4\xd0\xf7\x29\x57\x77\x38\x48\xf0\x5e\xe5\xb0\x07\x0c\xd5\xb2\xde\xa5\x96\x49\x97\xad\xbf\x12\xaf\x5f\xd1\x9c\xd3\xf0\x8b\x86\x00\x34\x0c\xd5\xcc\xe9\x51\xfd\x5d\xf9\xe7\x29\xdc\xe0\xc4\x7c\xe1\xa0\xd5\x4d\x10\x22\xfe\xa0\x83\xee\x51\xbe\x56\x9a\x7a\x4e\x9a\xfb\x62\xbd\x2a\x53\x0b\x45\x03\x30\xed\x26\x75\xca\xa2\x06\x75\x52\x55\x09\x93\xed\xf9\xed\x17\xdb\x6a\xb9\x71\xdd\xa1\xa2\xb6\x90\x4e\x67\x87\x34\xb6\x27\xeb\xc5\x25\x8d\x42\x48\x64\x44\xbe\x54\xed\xdf\x9a\xb0\x63\x40\xe2\xcf\xf4\x0a\x80\x41\xa0\xa8\xb3\xc0\x81\x6d\xb3\x1f\x20\x4b\xad\xdc\x68\xf9\xfe\x46\xe0\xda\x01\x33\xdf\x18\x57\xfc\x3f\x5f\xa7\xf2\x5b\x23\x8c\x0b\x40\x98\x72\x74\x38\xaf\xcd\x51\x8e\x14\xe1\x63\x5d\xc6\x57\x33\x7c\x16\xff\x12\xdd\x23\x40\x2d\xeb\xd2\x39\x7c\x35\xec\x4a\xfe\x9b\x0b\x79\xa6\x67\x8c\x7e\x29\x5d\x31\xb9\xbe\xbc\x83\x91\xfc\x4c\xf3\x5a\x6f\xf2\xa0\x20\x20\xe5\x54\xec\x5e\x49\x1a\x5c\x8c\x06\xb6\xf4\x89\xd0\x0b\x3a\x6b\x5b\x52\x5e\x10\x65\x94\xd8\x14\x44\x30\x74\x0b\x27\x90\xbd\xfd\xba\xb2\x2d\xf6\xde\x97\x3e\x5c\x03\xb7\x0c\xee\x8d\xef\xed\xa9\xf2\xb3\xbc\xd0\x2b\x57\x83\x97\x6d\xcc\xf0\x2d\x8b\x37\xd5\xb2\xd9\xe5\x2e\xcb\xed\x3b\x61\xee\x35\x9b\x8c\xa7\x1f\xfe\x7e\x7f\xea\xf0\x46\xfe\xf8\x94\x94\x33\x36\xb2\xe8\x2a\x68\x3c\x14\x50\xb9\x53\xe9\x8d\xab\xb4\xe0\xa0\x57\x97\xe4\xf7\xfd\xeb\x5b\xa1\x0a\x30\xfd\x77\x9e\xd4\x4a\xe3\xaf\xa3\x90\x2e\x7c\x45\xc1\x99\xe2\x6a\x87\x41\xf1\x90\xf7\x9c\x53\x5c\x45\xe4\xbe\x7a\x1d\xa0\x5b\xf7\x6e\x51\x59\x05\x37\xcb\xe1\xb5\xbd\x8d\xbb\x5b\x23\x23\x77\x55\x1e\x9e\xf6\xf6\x5b\x49\xe7\xa3\xb2\x17\xde\x5e\xd1\x29\xe1\x15\x5f\x75\xa5\xd2\x5a\x59\x99\xa6\x3a\x9d\x54\x3e\xbe\xd7\xe6\xfe\xc6\xdf\x86\x86\x36\xa3\xda\xd1\x1f\x7c\x58\x38\x6f\xdc\x01\x39\x34\xa0\x7a\xb8\xbd\xe2\x72\x2f\xf4\x46\x46\xd9\x8f\x03\x89\x3b\x78\x1f\x27\x3c\x8e\xc6\x87\x15\x8c\xff\xb5\xaa\xbf\x75\x53\xed\xdb\x46\x09\xd7\xee\x4a\x6e\xa1\x12\x7b\x71\x84\x2f\xe7\x68\xcd\x71\x64\x86\x0d\x3b\xb9\x64\x03\x0f\xf4\xb1\x09\x53\x5b\x9a\x13\xce\x3f\x6f\x1f\xae\xa8\xec\x85\x75\xc9\x38\x74\x51\xb2\x76\x11\x6b\x5f\xfd\x74\x83\x73\x27\x41\x82\x35\x29\x97\xb5\x76\xff\xb3\x64\xef\x53\xd8\x39\x3b\x73\xc6\xff\xd1\x12\xb9\xe3\x9a\xee\xa6\x58\x76\xc6\x40\x5a\xf5\x2c\x63\x36\xf9\xbf\x00\x00\x00\xff\xff\x8b\xa0\x9b\xf5\xf0\x2b\x00\x00") - -func confLicenseEclipsePublicLicense10Bytes() ([]byte, error) { - return bindataRead( - _confLicenseEclipsePublicLicense10, - "conf/license/Eclipse Public License 1.0", - ) -} - -func confLicenseEclipsePublicLicense10() (*asset, error) { - bytes, err := confLicenseEclipsePublicLicense10Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Eclipse Public License 1.0", size: 11248, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseEducationalCommunityLicenseV10 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x8c\x55\xdd\x6e\xdb\x38\x13\xbd\xf7\x53\x0c\x72\xd5\x02\xfa\xf2\xed\xde\x2e\x8a\x02\x8a\xad\xd4\xc2\x2a\x92\x21\x29\xcd\xe6\x92\x96\xe8\x88\x5b\x49\x14\x48\xca\xae\xdf\x7e\xcf\x88\xaa\x1d\x27\xde\x6e\x81\x00\x0e\xc9\x99\x33\x67\xce\xfc\xa8\x6c\x24\x45\xf5\x58\x09\xa7\x74\x2f\x5a\x5a\xea\xae\x1b\x7b\xe5\x8e\x94\xa8\x4a\xf6\x56\x2e\xca\x46\xd9\x9f\x9b\xd0\x07\x07\x94\x9b\xf9\x74\xf3\x91\xc4\x30\xb4\x4a\x5a\x72\x9a\x44\x7f\x24\x6d\xd4\x8b\x62\xcf\x83\x36\xdf\x48\xef\x48\x8c\xae\xd1\xc6\x36\x6a\x98\x5d\xb3\x1f\x16\x4f\xb0\x00\xc0\xa1\xd1\x80\xd5\x87\x5e\x9a\x0b\x70\x6d\xf0\xd8\x08\x4b\x43\x2b\x2a\x59\x13\x3f\xed\x74\xdb\xea\x83\xea\x5f\xa8\xd7\x0e\x56\xa4\xba\x4e\xd6\x4a\x38\xd9\x1e\x5f\x3d\xb2\x69\xa5\x87\x23\x22\x35\xee\x87\xe9\x4e\x9b\xe9\xe1\x22\xfe\x1f\x8b\xc5\xf2\x64\xf8\xa1\xfa\x48\x9f\x8e\x52\x98\xcf\xf4\xe9\xec\xde\xe8\xb6\x96\xc6\x7e\x5e\x2c\xe6\xa4\x6b\x1a\x7b\xdc\x4c\x60\x3f\xd7\x6a\x0f\x3f\xbc\xd1\xef\xb7\xbf\x2d\xbc\xb6\x17\xc1\x03\x52\x7d\xd5\x8e\x35\x53\xb6\x7a\xe7\x0e\xc2\xc8\x00\xff\x8d\xa6\x62\xfe\x35\x0e\xb5\xae\xc6\x4e\xf6\xce\x06\x50\x96\x34\x42\x1a\x32\xb2\x45\xc2\x35\x29\x27\x3b\xdc\x03\x75\x2b\x19\x62\x30\x7a\xaf\x6a\x3c\x6c\x8f\x6f\x14\xf0\x29\x7c\xb0\x1f\xc9\x8e\xdb\xbf\x65\xe5\xb8\x5a\x6c\xe2\xa4\xe9\x2c\x57\xe9\x3f\x73\xb9\xa5\x3b\x14\x77\xeb\x84\xea\x11\x2b\xa0\xd1\x72\x48\xd1\xd7\xff\x07\x2f\x8e\xe4\x75\x7f\x9f\xe2\x51\x8f\x24\x5e\x8c\x44\xb0\x46\xb8\xe9\xd8\x88\xbd\x44\x16\xa2\x0e\xbc\x92\xd6\x01\x27\x60\x30\x3a\xa8\xb6\x05\x5c\x37\xa0\x9e\x07\xe5\x9a\x37\x55\xf7\x7c\xd9\xb0\xd2\x7d\xad\x98\xec\xaf\xd1\x47\x9d\x37\xf0\x55\x76\xaa\x07\xb2\x1f\x2d\xd4\x65\xde\x01\x75\xba\x56\x3b\xfe\x95\xe6\x05\x97\xc3\xb8\x6d\x95\x6d\xa0\xbd\xb2\xce\xa8\xed\xe8\xa4\xe7\x66\xf9\xc1\x17\xf6\x7d\xa2\x93\x85\x72\xf6\x54\xb1\x89\x4a\xe0\x93\x80\x44\xfc\xab\x47\xe7\x83\xa9\x6a\x7e\xe5\x9e\xe4\xa9\x19\x46\x33\x68\x2b\x7f\x68\xe0\x4d\x77\xd0\x0c\xef\x46\x1f\x45\x8b\x4c\xe6\x92\x5d\xab\x2a\xc8\xa0\x31\x24\xea\xfe\x62\x44\x8f\xde\x08\xce\xcd\x70\x52\xdd\xf7\x9a\x7c\xa3\x28\xd4\x08\x93\x84\x51\x79\x88\x67\x29\x2f\x33\x03\x87\x41\x1b\xaf\x35\x37\xa0\xd4\xbb\xd7\x9d\xfb\x3a\x23\xcb\xc6\x20\xa5\xf6\x38\xee\x25\xba\xf3\x14\xbe\x13\xdf\xb8\x0a\xbc\x83\x76\x23\x8a\xec\xe4\x77\xf7\x4b\xa5\x43\x28\x12\xd4\x6a\x6f\x41\x7b\x25\x0f\x62\xdb\xca\xb9\x88\xe6\x44\xda\xc8\x73\xc1\xea\x4b\x1e\xd3\x32\xba\x5d\x2c\x42\x96\xda\xc8\xff\xc9\xef\xb0\x64\xee\x0a\x62\xb5\x2d\x06\x62\x44\x64\x48\x36\x48\x83\xc0\xc0\xa9\x5a\xa1\xd0\x0f\x48\xc0\x6f\x0f\x3f\x7f\xd7\xda\x0f\xb0\xa9\x5f\x30\xbc\xec\x10\xa0\x6a\x44\xff\x22\x27\x25\x2e\xa5\x99\x0b\xf8\xaf\x2b\x80\x1f\x6b\x4c\xb6\x2f\xf3\x8c\x72\x80\xde\xd0\xae\x96\x33\xfd\x37\x6a\x5f\xab\x57\x37\x5a\x87\x95\x40\xaf\xe5\x80\x86\x76\xac\x1a\x08\xd9\x89\x9e\x37\xad\xf0\x1b\x7b\xaf\x55\xed\x59\xeb\x7e\x37\x4e\xc3\x71\x1a\xbb\x37\x5d\xb0\xbb\xda\x7e\x9c\x7f\xb9\x8e\xa8\xc8\xee\xcb\xa7\x30\x8f\x28\x2e\x68\x93\x67\x5f\xe3\x55\xb4\xa2\x9b\xb0\xc0\xf9\x26\xa0\xa7\xb8\x5c\x67\x8f\x25\xc1\x22\x0f\xd3\xf2\x99\xb2\x7b\x0a\xd3\x67\xfa\x33\x4e\x57\x01\x45\x7f\x6d\xf2\xa8\x28\x28\xcb\x29\x7e\xd8\x24\x71\x84\xbb\x38\x5d\x26\x8f\xab\x38\xfd\x42\x77\xf0\x4b\xb3\x92\x92\xf8\x21\x2e\x01\x5a\x66\xc4\x01\x67\xa8\x38\x2a\x18\xec\x21\xca\x97\x6b\x1c\xc3\xbb\x38\x89\xcb\xe7\x80\xee\xe3\x32\x65\xcc\x7b\x80\x86\xb4\x09\xf3\x32\x5e\x3e\x26\x61\x4e\x9b\xc7\x7c\x93\x15\x11\xc2\xaf\x00\x9b\xc6\xe9\x7d\x8e\x28\xd1\x43\x94\x96\xb7\x88\x8a\x3b\x8a\xbe\xe2\x40\xc5\x9a\x07\x83\x43\x85\x8f\x60\x9f\x4f\xfc\x96\xd9\xe6\x39\x8f\xbf\xac\x4b\x5a\x67\xc9\x2a\xc2\xe5\x5d\x04\x66\xe1\x5d\x12\xf9\x50\x48\x6a\x99\x84\xf1\x43\x40\xab\xf0\x21\xfc\x12\x4d\x5e\x19\x50\xf2\xc9\x6c\x66\xf7\xb4\x8e\xa6\x2b\xc4\x0b\xf1\xb7\x2c\xe3\x2c\xe5\x34\x96\x59\x5a\xe6\x38\x06\xc8\x32\x2f\x4f\xae\x4f\x71\x11\x05\x14\xe6\x71\xc1\x82\xdc\xe7\x19\xe0\x59\x4e\x78\x64\x13\x08\xfc\xd2\xc8\xa3\xb0\xd4\x74\x51\x11\x98\xf0\xf9\xb1\x88\xce\x5c\x56\x51\x98\x00\xab\x60\xe7\xd7\xc6\xb7\x7e\x42\x7b\xd1\xc9\xa9\xcf\x9d\x41\xeb\x75\xc2\x7c\x9b\x7a\xed\xda\xee\xe9\xc4\x71\x2a\x0f\x1a\x6e\xb4\xbe\xd3\x44\x8d\x0f\x9f\x53\xd3\x17\x82\x97\xc7\xb4\x37\x79\xa2\x79\xbc\xfc\x07\xe4\xdd\x30\xc0\x6e\x75\x9e\x57\xee\x38\x7b\x5a\x84\x76\x90\x15\x37\x3d\xb6\xa9\x51\xce\xc9\x1e\xa3\xaa\x18\xf8\xb4\xd1\x6f\xa9\x54\xce\xef\x84\x33\x47\x30\x79\xdf\xc6\x9c\x14\xf7\xbb\xb0\x56\x57\x6a\xfa\x8e\x5e\x6c\x6c\xff\x05\xc2\xce\x12\xbc\xa3\xb0\x03\x2c\x16\x4b\x07\xd2\xe7\xb9\xb8\x32\x02\xff\x04\x00\x00\xff\xff\x15\x73\xdd\x6f\x5a\x09\x00\x00") - -func confLicenseEducationalCommunityLicenseV10Bytes() ([]byte, error) { - return bindataRead( - _confLicenseEducationalCommunityLicenseV10, - "conf/license/Educational Community License v1.0", - ) -} - -func confLicenseEducationalCommunityLicenseV10() (*asset, error) { - bytes, err := confLicenseEducationalCommunityLicenseV10Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Educational Community License v1.0", size: 2394, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseEducationalCommunityLicenseV20 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd4\x5a\xdf\x93\xdb\x38\x72\x7e\xd7\x5f\x81\xa8\x2a\x95\x99\x2a\x59\xf6\xed\xe5\x72\x39\xdf\xd3\xec\x8c\x7c\xab\x8a\x77\xc6\x35\x1a\x9f\xb3\xb5\xb5\x0f\x10\x09\x4a\x88\x29\x42\x07\x90\x23\xeb\xfe\xfa\x7c\xdd\x0d\x90\xa0\x24\x8f\x9d\xe4\x5e\xb2\xb5\x65\x5b\x12\x08\xf4\xcf\xaf\xbf\x6e\x70\x51\x76\x85\x6e\xad\x6b\x74\xad\x6e\xdd\x6e\xd7\x35\xb6\x3d\xaa\xf7\xb6\x30\x4d\x30\x6a\xf2\x57\xe3\x03\x7e\x54\x3f\xcc\xdf\xcc\xd4\xcd\xde\xdb\x5a\xfd\xf0\xe6\xcd\x1f\x27\xdb\xb6\xdd\xbf\x7d\xfd\xfa\x70\x38\xcc\x5d\x30\x65\x37\x77\x7e\xf3\xba\x96\xa7\xc2\xeb\xc9\xe4\x69\x6b\xd4\xcb\x5b\x3f\x0f\x3b\xab\xab\xe9\xe2\xf6\xfd\xf4\x5a\x15\xae\x09\x36\xb4\x41\xb9\x4a\xb5\xd8\xe1\x66\xaf\x0b\xfc\x45\x4b\xe2\xde\x33\xb5\x73\xa5\xad\xac\x29\x55\xeb\x54\xb1\xd5\xcd\xc6\xf0\xd2\x50\xb8\xbd\x49\xcf\xed\x75\x6b\x9a\x56\x6d\xbc\xc6\x9f\xb6\x51\xc1\x14\x24\x87\xfa\x3d\x3d\xb4\xc6\xe2\xbd\x29\xb0\x49\x41\x1f\x69\x7d\x63\x4c\xd9\x1f\x6a\x92\xd8\x10\x47\x84\xb6\x26\xa8\x2e\xd8\x66\x83\xdf\x6d\x48\xa2\xcc\x15\x29\xe9\xbc\xdd\x58\xd2\xf0\x5c\x56\x55\xe8\x86\x4e\xab\x5c\xd7\x94\x4a\xb7\x6f\x55\x66\x35\xcd\xcb\xc7\x66\x7b\xbf\xbc\x5d\xdc\xaf\x16\xaf\xb0\x07\x2c\xb8\x78\xfc\x79\xa5\x6e\xee\xef\xd4\xed\xc3\xfd\xdd\xf2\x69\xf9\x70\xbf\x52\xef\x1e\x1e\xd5\xc7\xd5\x62\xa6\x1e\x17\x1f\x1e\x1f\xee\x3e\xde\xd2\xd7\x33\x5e\x75\xb7\x5c\x3d\x3d\x2e\x7f\xfc\x48\xdf\x4c\x26\xbf\x9b\xab\x3b\x53\x59\x12\x1e\x36\x9d\x4f\x26\xd3\x68\xf7\xa9\x0a\x5b\x5d\xd7\x6a\x67\x20\x1c\xa9\xdb\x1a\xbf\x0b\x4a\x43\x42\x58\xbf\x94\xf5\x10\xd9\x43\x63\x58\xdb\x9b\xbd\x77\x30\x08\x7d\x3d\xe3\x55\x25\x1c\xe4\xed\xba\x63\x0b\xe9\xa0\x4a\x3a\x06\xee\x58\x1f\xd5\x4a\xcc\x1c\xd4\xef\xb0\xb3\x77\xdd\x66\xab\xfe\x24\x56\x85\xd5\x4a\x57\x74\x3b\x78\x65\x90\xc5\xf9\x33\x61\xe0\xc4\x23\x0c\xba\x6d\x95\x3b\x34\xc6\xc3\xba\x0a\x8f\x50\xd8\xe8\xae\xdd\xc2\xd6\x7f\x97\x93\x2e\xad\x6d\xb7\x1a\xce\x0e\xe2\x75\x71\x96\x49\xd1\xc6\x87\x9a\x0d\xdc\xb4\xe0\xed\xce\x0e\x86\x9b\xa1\x4e\x8c\x00\x5d\xf0\xf3\xe9\x64\x72\x1e\xd6\x3a\xfc\x14\xc5\xa1\x80\xe0\xe3\x60\xb2\xd6\xbb\x1a\x96\xf1\x26\x7d\xa8\x59\xc4\x19\xc9\x4e\xdf\xc2\xf7\x78\x8c\x42\x89\x23\x8a\x97\xa8\x83\x6d\xb7\xb2\x83\x1c\x32\x57\xef\x9c\x97\xd0\xed\xfc\x1e\x19\x15\x06\xbb\xf5\x6e\x9c\xa9\x69\x7c\x7e\xca\x82\x07\x75\x65\xaf\xe5\x21\x77\x30\x7e\x06\xd7\x78\x78\x80\x0e\xb6\x8d\xfc\x7b\xc6\x59\xa2\xe1\x4a\x5e\x27\x5f\xb2\xa6\x5e\xed\x74\xa3\x37\x86\x5c\x42\x67\x85\xae\xd8\x46\x61\x66\xea\xb0\x35\xac\x2c\x2c\xcd\x27\x6a\xd9\x95\x2d\x70\xb0\x14\x17\xf8\x74\x65\x71\x3a\x9b\x3e\x6c\xed\x9e\xf6\xa8\x6c\x05\x7b\xed\x8d\x2f\x68\xd3\xab\x3f\xbc\xf9\xe7\x6b\x3e\xc8\xf9\x3e\x33\x5d\xd7\x86\x16\x16\x25\xfb\xc2\x05\xde\x84\xb4\x17\x36\x5b\x9b\x06\xca\x16\x16\x6e\x1a\xed\x9b\xc9\x46\x8e\xfc\xc5\x75\x53\x75\x85\xa7\xe8\x5f\x1e\xb0\x91\xf9\x12\xff\x93\xee\xcf\xb6\xec\x68\x17\xaf\x72\xaf\x2b\xf3\x05\xb2\x59\xce\x64\x48\xb9\xb3\x21\x70\xb8\x72\xc4\xa4\xc0\x82\xc9\xb3\xa0\x59\xe1\x84\x02\x49\x83\x84\xd8\x9d\xc6\xcc\xde\x9b\xca\x78\x8f\x07\xf9\xd7\x8a\x6d\xfa\x99\x36\x17\x8c\x12\x14\x81\x82\xb6\x29\xea\x8e\x55\x46\xda\xa8\xc6\xb5\x40\x88\x9d\x6d\x05\xc3\x82\xab\xda\x03\x05\x4a\xe0\xa3\x60\xf0\x12\xf6\x4d\xd9\x22\x40\x24\x3f\xcd\x52\x96\x56\x76\xd3\x79\xf9\xa5\xb2\xb5\xe1\xf4\x7e\x58\xff\x17\x5c\x7b\x2e\xa8\x6e\x8e\xf2\x1d\x4c\xdd\xd5\x1c\xd7\x95\x77\x3b\xfc\x48\xe0\x09\x19\x6b\x05\xff\x36\x81\xd6\xe8\x14\x1a\xfc\x4d\x1d\x3f\x56\x4a\x2b\x31\x03\x6f\xf4\x0d\x75\x10\xe8\x7b\x4b\x29\xe0\x58\xa0\xa8\xce\x06\x9e\x85\xc4\xf8\x7a\xa4\x58\xaf\x51\x2c\x06\x81\x76\x90\x3c\xdb\x99\xd2\x6a\xd5\x1e\xf7\xa2\xde\x27\xe7\x3f\x9f\x25\xed\x01\x5f\xb2\x7c\x8c\x0d\x14\x2d\x43\xe8\x02\xf5\xa3\xd0\xd0\x47\x8c\x13\xc5\xdf\xe9\x12\x29\xfe\xac\x6d\xad\xd7\x75\xca\xcf\x0c\x2b\x66\x84\x6a\x14\x44\x85\x8e\x41\xa1\x33\xac\x81\xba\x58\xd6\x83\x8d\xd8\x02\xcb\x2c\x1b\x4e\xb7\x2d\xc1\x7a\x99\x0a\x0b\x4b\x78\x05\x71\xcd\x17\xbd\xdb\xe3\x34\x3c\x02\x40\x45\x78\xca\x23\x52\xe4\xf6\x06\xa7\x7d\x41\xf8\xd7\xee\x70\x4d\xda\xde\x19\x6f\x9f\x61\xa1\x67\xa3\x48\xf1\x30\x3d\xf5\x28\xed\xfb\x3d\xba\x26\x31\xd7\x3a\x90\x4b\x1a\x4e\x9b\x92\x76\xa7\xa8\x45\x1c\x08\x7e\xd0\x21\xec\x0a\x8a\xe1\xc3\xd6\x16\xdb\x58\x09\x6d\x0b\xcc\x45\x88\x78\xf3\x6c\x83\x04\xb3\x6e\x60\x82\x14\xd9\x06\x36\x74\x3e\x7d\x4a\x10\x31\x8e\x7f\xae\x21\x26\xc0\xe7\x6c\x59\x8d\x03\x5c\xcd\xc1\x3c\x14\xcf\x73\x4f\xbe\x80\x88\xbd\x9f\x4e\xcd\x14\xad\x44\x11\x19\xfd\xc2\x1b\x47\xac\xf6\x66\xa7\x99\x0b\xec\xb5\x67\xcf\x93\xfe\x2c\xf4\xce\x78\x53\x1f\x11\xc5\xcd\x67\x36\xd0\x1a\xde\x27\xbf\x37\x7a\x67\xae\x93\x2b\x2d\x20\xc2\x57\xba\x60\x41\x66\x63\xb3\x9d\x09\x42\x56\x30\xae\x22\x5f\xde\x12\x80\xc6\x7a\x79\xd1\x8f\xa7\x11\x3c\xa4\x57\x9b\xf3\x8b\xc4\x97\x22\x90\xf6\x67\xd3\x36\x63\x7b\x53\x1c\x96\xa9\x92\xb3\xf4\xd0\x9e\xd7\xe3\x97\xaf\x89\x3a\xcb\x42\x9a\xc8\x13\xd3\x36\x18\x25\x74\x6b\xe4\x76\x4c\xee\x54\xb7\x39\x4e\x58\x4e\x16\x29\x06\x32\x1f\xf1\x95\xe2\xec\xb8\x98\xbc\x8c\xce\x59\x89\x27\x5c\xe4\x83\x29\x66\xd7\x06\x46\xab\x92\xe2\x27\x3b\x7f\x6f\xe5\xec\xf5\x48\xb5\xb3\x07\x46\x2c\x37\x35\x52\xc6\x3b\xc0\xe1\x8c\xec\xbc\xd6\x35\xc7\xc5\xc1\xd3\x13\x3d\x0f\x8c\xac\x90\x22\x39\x05\x45\x6f\x10\xb2\x47\x9b\x85\x3a\x5b\xf8\x5b\xd0\x3f\xde\x17\xff\x0f\x72\x00\xa5\x6c\x4d\x8f\xd5\xc4\x87\x67\x79\x71\xe8\x49\x44\x38\x86\xd6\xec\x82\x80\x28\x6a\x59\x67\x08\xb8\x0b\xae\x40\xf1\x37\x71\x2a\x55\x17\xa9\xf6\x3d\x33\xc9\xcd\x3a\x1b\xab\x52\x8d\xed\x49\xf6\x01\xe7\x2b\xba\xc0\x75\x93\xcf\xda\x31\x86\xc5\x08\xfd\xc4\x58\x44\xea\x99\x2f\x49\xd9\xb1\x66\x29\xb2\x88\xde\xef\x6d\xd1\xb9\x2e\x20\xb2\x76\xda\x7f\x26\x50\xca\x78\x05\x5c\x16\xec\xa6\x61\xdc\x45\x50\x91\xfd\xd9\x74\x97\x63\x0a\x60\x32\xbd\x87\x45\xb5\xca\x73\x6c\x3e\xcd\x93\xee\x84\x63\xf6\x4a\xa6\xcc\x79\x21\x1c\x47\x91\x07\xcc\xda\x9d\x1c\xa4\xb6\x10\x60\x6d\x10\x1f\x20\x55\x86\x11\x75\x7d\x1c\x9f\x80\xa0\x0b\xe6\x6f\x1d\xe2\xa1\xa6\xa3\x0a\x07\x8b\x4a\x19\x24\x02\x98\xa5\x0d\x80\xe2\x87\xb9\xfa\x0b\xf7\x2b\x38\xed\xb6\xd7\x74\xa0\x22\xab\x4e\x80\x3d\x46\xde\x45\xda\x7e\x86\x90\x06\xd5\x48\x65\xc6\x50\x94\xec\x90\x92\x19\x0f\x83\x03\x28\x14\xf4\x02\x1b\xda\x9b\xb6\xa3\xb8\x07\x24\xd5\xe5\xc1\x52\xd5\x6e\x5c\xf3\x8a\x7d\x1a\xa0\x1d\x7d\x7c\x05\xce\xe0\x37\xd4\x16\xb8\xa3\xae\xdb\xe3\xab\xca\x1b\x7c\xb2\x20\x41\xcf\xae\x60\x50\x1d\x9c\x94\xba\x20\x1c\x92\xba\x08\xac\x45\x7e\xec\x29\x1e\xcf\x70\x88\xe2\x70\xdf\xad\xf1\x14\x6c\x85\x80\xdb\xd7\xfa\x98\x7d\x03\x09\xa5\xa4\x05\xfe\x26\x16\xea\xbc\x1f\x31\x63\x5c\x64\xd2\x78\x76\xca\xd7\x4a\x25\x0c\xfc\xfb\xcc\x01\x1f\xa4\x81\xfc\x7f\x67\xfd\x2b\x3c\x60\xf6\x2d\xa5\x06\x68\x76\x9b\x48\x06\x84\x8a\x2d\xf0\x75\xea\x8d\x33\xef\x80\xb4\x62\x9b\xad\x7e\x36\xcc\x8d\x66\xd2\xf9\xb9\xaa\x22\x5e\x04\x20\x36\x35\x04\x93\x3f\x91\xf9\xce\xb7\x62\xf8\x21\x6b\x85\x40\x46\x16\xf5\x29\x51\x13\xa2\xb4\xe4\x83\x74\x92\xde\xef\x6b\x6a\x9c\x5c\x03\x77\xb2\x1d\x09\x5d\xa2\x38\x45\xad\xed\x2e\xb5\xd6\xac\xca\xfa\x28\x8f\xe7\xf6\xeb\xd1\xac\x41\xc6\x85\xa0\xbd\xe5\xbc\xaa\x3c\x50\xa2\x6f\x0c\xad\x1f\xa5\xe9\x55\xb8\x46\xfb\xe6\x1a\x13\x6b\x10\xa0\x09\xf5\xbd\xe7\xb6\x97\x1f\x88\xfd\x59\x0c\x27\x08\x2b\xa4\x68\x2c\x50\x5a\x4b\xc6\x4e\xd5\x65\xae\x96\x15\x7b\xd5\x36\x01\x28\x42\x51\xd9\x1b\xbc\xb5\x1b\x39\x56\x6f\x34\xfd\xcc\x00\x14\x9b\xcc\xab\xa1\x50\x80\x6d\x7a\x17\xc2\x2b\x36\x09\x09\x5d\xb8\x8e\xb8\x87\x7c\x86\x3f\xb5\xaa\xf5\x21\x74\xb6\x25\xc5\x6a\xb3\x11\x20\x86\x65\x7a\x81\x09\x7e\xc6\x58\xf5\x12\xf8\x30\x2e\x8b\xb0\x21\xeb\x21\x8b\xc1\xf0\xc7\xa4\x44\xb2\xf5\x8e\xd9\x1c\x36\x10\x1a\x33\x8e\xa9\xa1\xa1\x8a\x11\x9e\x28\xf6\x90\x1b\xb1\xc8\x24\x5e\x22\x08\x4d\x49\x45\x9e\x31\x14\xbe\xb1\xda\x97\xf4\x31\x86\x51\x6f\x3f\xec\x43\x7d\x0f\x8c\x7d\x73\x76\x78\x7f\x76\xcc\x35\xf6\x24\x6a\xf2\x3e\x66\x6f\x91\x59\x25\x9c\x73\x12\x03\x96\xee\x8e\x91\xf6\x37\xbd\x17\x63\x5f\xe4\xfc\x06\x3d\xd3\xdf\x7b\x29\xb2\x5a\x3e\x8e\x63\x09\x7f\xa1\x8d\xfd\xde\xa9\x0c\xf2\x88\x81\xb9\xce\x88\xcc\xe1\x17\x5d\x87\x44\x36\x9f\xb1\xdb\xb0\xe0\x52\x96\x98\x52\xf2\x70\x38\x6b\x24\x1e\x33\xb4\x41\x7a\x2a\x56\xb4\x46\xb0\x19\x02\xcb\x70\x6c\x94\xa1\xe2\x27\xce\x53\x81\x13\x59\x43\x87\x10\xab\xd1\x1e\x6b\xab\x4e\x9a\x77\xbd\x01\xf8\x50\x18\x84\xb9\xba\x4f\x4d\x9b\xf9\x42\xf4\x87\x19\x28\x90\xa2\xa6\x29\x5d\x1f\x13\x94\xb6\xd1\x37\xc0\xd3\x7f\x9d\xab\x47\x93\x8f\x92\xf0\x1d\x85\xca\x4e\x1f\x87\x6a\x71\x8a\xef\xa8\x2d\xd6\x84\x91\xd1\x5e\x60\xb4\x9c\x2a\x44\x8e\x71\x4e\x87\xc2\xc1\x91\x40\xac\x0e\x7f\x3b\xb0\x95\x93\x26\x9d\x89\xcd\x57\x1b\xa9\xbe\x69\x63\x27\xb2\xa4\xc6\x48\xc6\x55\xae\x46\xdf\x26\xac\x27\xd5\x82\xb7\x93\x89\x9e\xcb\xb2\x0e\x89\xbe\x21\xe1\x48\x16\x31\x13\x32\xcc\x42\x93\xa6\xfd\xb6\x2e\xd2\x7a\x9e\x96\x96\x3f\x93\xb4\x93\xc9\x3a\x3b\x42\x86\x3c\x43\x33\x40\xfd\x1d\xcd\x06\x64\x00\xe4\x29\x85\xd1\xee\xd8\x86\xc2\x48\x7a\x58\x29\x11\x3d\x78\xd0\x4e\x32\x4f\x2d\x45\x2d\x7a\x3a\x1e\x54\x64\x07\x79\xd3\x02\xbd\x66\x89\xf4\x67\x93\x01\x6e\x64\x20\xc0\x05\x87\xc4\xfd\x07\x5f\xce\x78\xa4\xd6\x93\x85\x59\x8c\xf0\x19\xd5\x92\xd2\x10\x35\x14\x8f\xa0\xa1\xee\x31\x2c\x89\xcd\xf3\x8b\x0b\x67\x0f\xd5\x67\x20\xa2\x52\x64\xd2\x93\x2c\x48\xe9\x98\x87\xa3\xe8\x92\x22\x64\x1f\x81\x30\xdf\xa6\x4d\x4e\x15\x88\x56\x10\x70\x1f\xf2\x55\x5a\x4c\xf2\xd1\xf4\xfe\xe1\x69\x79\xbb\x98\x02\xc2\xbe\xb4\x6c\x39\x82\xb0\xb4\x25\x35\x06\x79\xa8\x67\xc0\xf9\x3d\xa6\x12\xb3\xa7\x86\x56\xc3\x01\xba\xec\xa9\x56\x3f\xb2\xbc\x60\x27\x82\x3a\xcd\xb3\xd9\x08\xf8\x9c\xec\x22\x2a\x0b\xf9\x0f\x37\x14\x47\x05\x9e\xac\x8d\x0e\xd4\xba\xf5\x63\xbf\x21\x47\x40\xeb\x70\xc0\xdb\x24\x92\x4e\xf2\x0c\x96\x1b\x34\x2f\x73\x2b\x5e\x76\x4c\x56\xca\x46\xd1\xe0\x4f\x07\x4d\xb6\x1a\x72\x98\xe8\xc0\x66\xa8\xf1\xe7\xbb\x3a\x3f\x1b\x04\x8c\x5c\x34\x9b\x61\xc5\x7e\xe4\x82\xf6\xd5\x80\xc8\xe8\x23\xc5\xe0\xd8\xc6\x97\xaf\x48\x8d\x63\x6f\xdf\x86\xa6\x6d\xd4\x5e\x03\x6c\x81\xab\x72\x95\x40\xfe\xca\x41\x21\xf3\x14\xa3\xa7\x34\xdd\xfd\xa0\x0e\x15\x65\x68\x79\x89\x53\x31\x5a\x8a\xcf\x18\x03\x8e\xa3\x09\xb8\x4a\xf0\xaa\xcb\x92\xfe\xed\xa9\x8b\xba\x18\x37\x51\xf3\xef\x4d\x63\xd8\x32\xc0\xac\x4c\x3a\x88\x13\xd3\x01\xa6\x29\xbb\x5d\x22\xcb\x23\x0f\xa7\xdc\x95\x44\x1d\xc3\x2a\x9b\x2b\x8d\x2e\xa0\xde\xc5\xa0\xe6\xf9\x13\x5d\xab\x30\x6b\xf1\x9d\x44\x89\x28\x7c\x3e\xf5\xbf\xa8\xf4\xd0\xa3\x30\x49\xde\xc5\x86\x9e\x7f\x1f\x8f\x52\xc8\xa4\xf4\x78\x94\x33\x17\x8e\x42\xcc\x12\x47\x1e\xb1\xe9\xff\xc1\x65\x0a\x6f\x90\xdd\xa5\xb8\xea\x82\x04\xbc\xac\xe2\x76\xf2\xf8\x95\x96\x26\x9f\xa9\xf5\xf6\xe4\x9d\xbe\xe7\x06\x67\x54\x80\x7a\x46\x4f\x53\x5c\x26\xeb\x7d\x92\x64\xfa\x9c\x74\x16\x83\xb1\xff\x30\x57\x2b\x22\xc2\x21\x0d\xaa\x72\x0a\x4a\x63\xdc\x8f\x4d\x4d\xf4\x80\x9c\x02\xaa\x00\xa3\x59\x6a\x8c\x79\xbf\xfc\x72\x81\x74\x3d\x61\xaf\x97\x47\x52\x2f\x8e\xa1\xe8\x94\xd3\x31\x8d\x10\xcd\x75\x3e\xf5\xfd\xbe\x56\x2e\x91\x06\x12\x2d\x0b\x02\x79\x58\xc8\x72\x7c\x96\xe8\x50\x4b\xcb\xfb\x7b\x0e\xc6\xe7\xb5\x93\x26\x8e\x52\x6b\xc3\xe4\x94\x00\x99\xc5\x09\x1d\x20\x16\x74\xce\xc8\x65\x49\x9f\xb9\x71\x73\x29\xaa\x32\xb6\x84\x9d\xfa\x76\x2a\x11\x30\x75\x8c\x31\xce\x1d\x9c\xf9\x62\x8a\x2e\x91\xfc\x41\x71\x6f\x36\xda\xcb\xad\xcb\x69\x0f\x43\x8e\xf9\x37\x20\x50\x2a\xbc\xf4\xf9\x29\xe7\xea\xa5\x63\xc4\x4a\xf7\xa9\xc3\xcd\x09\x99\x37\x5d\x2d\x71\xdd\xe6\x89\x69\xc8\x8a\x38\x4d\xae\x8c\x7f\xa6\x89\x79\xfc\x08\x59\x62\x3c\xca\xe2\x14\x80\x49\x52\xae\x49\xb1\x85\xf5\xe6\x6f\x9d\x8d\xf7\x2b\x54\xf6\x02\x6c\x4e\x85\x8f\x9d\x85\xa2\xe8\xb0\xe7\x91\x25\x80\x2d\x51\x89\x0b\xa8\x34\x9e\x9b\x9e\x4d\x4b\x53\x36\xa4\x65\x11\x73\x2f\x40\x2e\xac\xf0\xc7\xb9\xba\xb3\x81\x49\xb7\x61\x2a\xfe\x09\x44\x0a\x26\x38\x0e\xa1\xdc\x8b\xb8\x3e\xe6\xc4\x19\x0d\x1a\xe3\x21\xf9\x88\xdb\x83\x61\x9a\x35\x1b\x9c\x12\xb3\x35\x0c\x22\x5e\x91\x8c\x67\x63\x83\x7e\x1d\x31\x89\x91\xeb\xae\x69\x4a\x05\xc8\x9d\xde\xac\xd4\x72\x35\x55\x3f\xde\xac\x96\xab\x99\xfa\xb4\x7c\xfa\xe9\xe1\xe3\x93\xfa\x74\xf3\xf8\x78\x73\xff\xb4\x5c\xac\xd4\xc3\x63\x7e\x8f\xfc\xf0\x4e\xdd\xdc\xff\xa2\xfe\x63\x79\x7f\x07\x83\xdb\xaf\x90\xf7\x6c\x7c\x39\x64\x00\xf7\x3c\xfd\xed\x0d\x1a\x2c\xb1\x09\x13\x73\x7f\x92\x43\x4f\xcb\xa7\xf7\x8b\x19\xac\x7a\xff\x6a\x79\xff\xee\x71\x79\xff\x97\xc5\xcf\x8b\xfb\xa7\x99\xfa\x79\xf1\x78\xfb\x13\x24\xbb\xf9\x71\xf9\x7e\xf9\xf4\x0b\x87\xc5\xbb\xe5\xd3\xfd\x62\x25\x77\xdc\x37\xea\xc3\xcd\x23\x5c\xf1\xf1\xfd\xcd\xa3\xfa\xf0\xf1\xf1\xc3\xc3\x6a\x21\x15\x4c\x6e\xca\x6a\x9a\xd7\x53\x57\x47\x2f\x0c\xf0\x2c\x9f\xef\x35\xa4\x83\xec\x73\x6e\x0f\xc3\xed\xbd\x25\x66\xc9\x8a\x55\xf1\x16\x9f\xa3\x69\x40\xc1\x6c\x8e\x29\x9c\x33\x04\x30\x07\x56\xce\xdb\xc0\x08\x1b\x5c\x61\xfb\xd6\x59\xc0\x35\xde\x25\x32\xc5\xc9\x2f\x13\xcf\x9b\x5d\x44\xcb\xbf\xcf\xf1\x21\xd9\x8d\x9e\x78\x6f\xf5\xda\xd6\x72\xa1\xb9\xa4\xea\xa6\x0c\x75\x7c\x7c\xbe\xec\x80\xaf\x6a\x1e\x47\x42\x36\x74\xe0\xa3\xdb\x1e\x04\x45\x9b\x8f\x0c\x1a\xb3\xa9\x2d\xf8\x49\x61\xae\x67\xfd\x8d\xed\xec\xe4\xca\xb6\xfb\x66\xc4\x5e\x49\x01\xa6\xc9\x79\x6d\xd7\x4c\x76\x58\xa0\x0d\xcd\x23\x60\xf0\x74\x4c\x4b\x37\xe4\xe1\xfa\xeb\x11\x2e\xb8\x36\x82\x71\x1a\xbe\x10\x78\xf1\x61\x71\x2e\xc0\x4e\xd3\x3b\xbd\x19\x4f\xca\xe9\xb9\x74\x7d\x3d\x5c\x64\xf3\x3b\x1b\x34\x22\xc3\x42\x24\x03\x88\x9d\x0c\xe9\x89\x06\xc8\x8c\x95\x2e\xaa\xe2\x76\x09\x35\x69\x62\x06\x59\xa9\xab\xf5\x72\xef\xcb\xd5\x52\xee\x42\x4f\x51\x9e\xed\xd5\xf5\x58\xd0\xc9\x37\xb6\x89\x9e\xca\xd1\x4e\x92\xf5\xc5\xe1\x7e\x92\x84\x94\xac\x9d\x84\xdf\xc6\xb9\xf2\x60\x6b\x99\xf3\x7d\x46\xe1\x73\xfb\xbd\xa6\x89\x1e\xd5\xdb\x8e\xc4\xac\xb4\xad\x3b\x2f\x95\x40\xd7\x68\xb6\x07\xb2\xc0\xa5\x67\xf4\x2e\x02\x4d\xd9\x29\x08\x73\xbd\xe5\x30\x13\x10\x08\x14\x51\x44\x49\xcf\xc6\x68\xfd\xe0\x5a\x97\xcf\x96\x2f\x06\xe3\x94\x01\x4f\xda\xa8\x6c\xba\x76\x8f\x1b\x23\x4c\xff\x34\x57\x37\x05\x41\x33\x29\x9c\x90\x90\x0e\xbc\x19\xea\x61\x1e\xd6\x9f\xb6\x44\x5c\xbf\x96\x68\x2f\x5e\x45\x25\xd6\x56\x6c\x9d\x93\x19\x25\x4f\x23\xe3\x75\x31\x4f\x41\xe1\xc5\xca\x70\xde\xe3\x5b\x16\x4b\x37\x85\x11\xb1\xf7\x32\xa4\x8c\xc8\x74\xe4\x28\x32\xbb\x86\x5f\x6d\xe8\xef\x28\xeb\x24\xaa\x72\xeb\x3a\x4e\x96\x98\x07\xbc\x26\x78\x20\x76\x18\xd2\xfb\x48\x14\xf1\x91\x08\x65\x59\xad\x7e\x72\x07\x62\xf9\xd2\xf4\xf4\x96\x61\xab\x65\x5b\x0e\xda\xf0\x5b\x14\x44\xd4\x01\x01\x3d\x17\x8d\x57\x0c\x3c\x50\x8d\x5f\x13\xbc\x0d\xe0\xc6\x32\x32\x73\x18\xdf\x48\x0c\xe3\x84\xcc\xb5\x71\x32\x4b\x87\x58\x99\x43\x72\x82\x4a\x7e\xb2\x0d\x2a\xec\x55\x9a\x0a\x04\x5d\xd6\x82\x37\x5e\xa8\x38\x30\xf1\x8e\xd1\x22\x51\xcf\xc1\x5a\x08\xfa\xce\xfb\xe1\x26\x29\xce\xa4\x80\x91\xe8\x13\x89\x8c\xcb\x70\x73\x76\x1e\x76\xeb\x63\x2c\xe2\x24\xfe\x91\x34\x1d\xac\xd6\xd3\xdb\x43\x16\x58\x19\xd1\xaa\xb3\xc0\x5a\xdc\xdf\x51\x01\xbb\xf4\x82\xd4\x64\x72\xf3\xe1\x03\x7e\x5f\xfe\xe7\x5b\x72\x0f\xf7\xac\xc0\x38\xe1\x53\x2f\xbf\x8f\x86\xa5\x2c\x13\x65\x26\x08\xd0\xff\xee\xc1\x59\x7c\x03\x40\x4d\xc6\x5d\xef\xda\x21\x17\x3c\xda\xc8\x36\xf5\xd8\xb3\x81\x5a\x57\xd6\xd4\x65\x50\x80\xef\x9a\xde\xa5\x23\x3b\x4d\xd6\x74\x91\x67\x10\x82\xd3\x5f\x7f\x9b\x12\x6b\xa1\xb6\x39\x96\x9f\x63\x8a\x1d\x86\xc1\xd8\xf6\x64\x8d\xe1\x5c\x4d\xae\xee\x5c\xf3\x2f\xc3\xd0\x80\x4e\x49\x3b\xfe\xd3\x35\x37\x9b\xdc\x8d\x05\x54\x74\xb8\x1f\xc0\xdc\x1f\x1e\x49\xf4\x24\x2b\x9e\x82\x33\x34\x2c\x3c\x02\x75\xbf\xf4\x17\x84\xdc\x98\xca\xa9\x73\xf5\xc9\xc8\xf4\x12\x60\xcd\xab\x4b\x32\x01\x4d\xeb\x65\x99\x04\x0a\x02\x8a\x48\x9f\x74\x21\xcc\xd7\xf6\xa9\x20\xa6\xdb\xc6\xb5\x19\xde\xa9\xc0\x2f\x6c\xc7\x40\xcf\x4c\x21\x0c\x0f\x76\x09\x31\xa7\x2a\x8e\x33\xcf\x5e\xcc\x20\xe1\x10\x64\x16\x79\x31\x89\xf6\x49\xd7\x90\xfd\xac\x60\xe8\xc7\x69\xa4\x49\x17\xb5\x88\xaa\xe1\xce\xed\xd7\x23\xfe\xfb\x4d\xfd\xca\xa2\x42\xb4\x93\x7b\xc7\xdf\x92\xe7\xcb\xac\x8b\x98\xbc\x18\x23\x33\xf5\xd7\xfc\x6d\x47\x7a\xa0\x7f\x1f\xef\xfa\xcf\x3d\x81\x9f\x50\x92\x4b\x89\x89\x23\xee\x44\x86\x6d\x13\x5b\x32\x06\xb9\x3e\x72\xce\x7a\xfb\x89\x5b\xf3\xac\x46\x8f\x86\x43\x29\x52\x75\x3b\xf9\xc6\x8b\x9b\x8b\xdb\xf7\xf2\xf6\xe1\xff\x81\xde\x4e\xfa\x37\x9a\xf2\x49\xce\xd9\x6b\x36\x34\xef\xce\x17\x8c\x89\xec\xe4\x1f\xc1\x64\x27\x03\x95\x45\x67\x6a\xcc\xe8\xf8\x14\xc5\xfd\xbb\xa0\xb5\x6e\x36\x1d\x62\x0b\x55\x1a\xa8\xce\x2c\x72\x92\x13\x3b\x0a\xda\x81\xfc\x86\x73\x8d\xe6\x93\xff\x0e\x00\x00\xff\xff\xec\xcd\x31\x6d\x4d\x2b\x00\x00") - -func confLicenseEducationalCommunityLicenseV20Bytes() ([]byte, error) { - return bindataRead( - _confLicenseEducationalCommunityLicenseV20, - "conf/license/Educational Community License v2.0", - ) -} - -func confLicenseEducationalCommunityLicenseV20() (*asset, error) { - bytes, err := confLicenseEducationalCommunityLicenseV20Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Educational Community License v2.0", size: 11085, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuAfferoGeneralPublicLicenseV30 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x7d\x5b\x73\xdb\x46\x96\xf0\xbb\x7e\x45\x17\x5f\x22\x55\xc1\x74\x9c\xcc\x64\x36\x71\x2a\x55\xb4\x44\xc7\xac\x91\x25\xad\x24\xdb\xeb\x47\x90\x68\x8a\x58\x83\x00\x17\x0d\x48\xe6\xfe\xfa\xef\x5c\xfb\x02\x82\xb2\x33\xf3\x55\xed\xc3\xd4\xc4\x22\xd0\x7d\xfa\xf4\xb9\xdf\xf0\xe7\xd5\x07\x33\x7b\xfb\x76\x7e\x7b\x6d\xfe\x9c\x5f\xcd\x6f\x67\x97\xe6\xe6\xc3\x9b\xcb\xc5\xb9\x81\xff\xcd\xaf\xee\xe6\xe6\xe4\xa3\x6d\x5d\xd9\xd4\xe6\xe7\xcc\xbc\xfa\xd5\x5c\x35\x8f\x76\xbb\xb4\xad\xf9\xe9\xc7\x1f\xff\x71\x72\xde\xec\xf6\x6d\xf9\xb0\xe9\xcc\xe9\xf9\x19\xfd\xc9\xbc\x6d\xad\x35\x77\xcd\xba\x7b\xca\x5b\x6b\xde\x36\x7d\x5d\xe4\x1d\xbc\x9f\x99\x45\xbd\x9a\x9a\xdf\x37\x5d\xb7\xfb\xed\xe5\xcb\xb5\x5b\x4f\x9b\xf6\xe1\xe5\x1f\x27\x27\xf3\x47\xdb\xee\x9b\xda\x9a\xd2\x99\x9d\x6d\xb7\x65\xd7\xd9\xc2\x74\x8d\x59\xc1\xea\x26\xaf\x0b\x53\x94\xae\x6b\xcb\x65\xdf\x59\x03\xcf\x2e\x61\xbd\x2d\xfe\x58\x5a\x67\x9a\xb5\xe9\x36\xf0\x62\x55\xae\x6c\xed\xac\x29\x9a\x55\xbf\xb5\x75\x97\x19\x78\xdc\xac\x36\x79\xfd\x50\xd6\x0f\xa6\xec\x70\xf5\xba\xe9\x4c\x5e\x55\xcd\x93\x2d\xa6\x27\x27\x37\xad\xcd\xb7\xcb\xca\x9e\x9c\xdc\x6f\xac\x21\x4c\xac\xd7\xb6\x6d\xcc\x9f\xb6\xb6\x6d\x5e\x99\x9b\x7e\x09\xcb\x9a\x4b\x59\x1a\x16\xc8\xcd\x1a\x8e\x97\x11\x64\x95\x5d\x77\x7e\xdb\x75\xd3\x1a\xa7\x87\x46\x90\x9b\x6e\x03\x48\xfa\x52\xd6\x05\xc1\xf8\xd4\xb4\x5f\x5c\x66\xdc\xce\xae\xca\x75\xb9\x02\x20\xf6\xa6\xb0\xae\x7c\xa8\xf9\xa8\xb0\x48\x0f\x6f\xae\x9a\x06\x30\x40\xf8\x32\x4f\x65\xb7\x81\xb3\xe1\x1f\xb7\xdb\xbe\x2e\xbb\xbd\x29\x6b\xfe\x43\x0e\x3b\xc2\xa2\xb5\xed\x70\x5d\xe3\x6c\x0b\x68\xf1\xfb\x4f\xf9\x40\x02\x9a\x23\xd8\xb6\x8d\xeb\xc6\x00\xdc\xb5\xf9\xaa\x43\x78\x18\x42\x83\xbf\xc6\x70\x75\xf9\x17\x78\xfc\x29\xdf\x9b\x7d\xd3\xb7\x74\xfa\xa2\xd9\xe2\x2f\x6e\xa3\x2b\x11\x92\x2d\x41\x46\x8b\x4c\xcd\x9b\x3d\x00\x5d\x77\x6d\xee\xe0\x1e\xf0\xbd\x71\x8c\xf2\x76\x65\xdd\xd9\xba\xe0\xed\x1e\xfa\xbc\xcd\xe1\xdf\xf6\xdb\xdb\x01\x0a\x91\x18\x90\x34\x09\xc3\x39\x9c\xa5\x79\x68\xf3\xed\x8b\x17\xf0\xf8\x16\xe1\x26\x94\xc2\xcd\xb7\x76\x9b\x97\xf0\x14\x2e\x17\x90\x80\x68\xc1\x45\xca\xce\x99\x1e\x50\xe8\x00\x6f\x9f\x36\x16\x10\x6f\xf1\x9e\xf2\x2f\xb8\x6a\xf2\x4a\x86\x3f\xe1\xab\xad\x05\x3a\x69\x91\xae\x60\x2b\x01\x32\x23\xea\xda\xb5\x70\xb4\xa9\xb9\xfe\xc6\x99\x63\x14\x07\x50\xbb\x4d\xde\xe1\xc1\xcd\x26\x7f\x64\x7c\x46\x08\x88\x78\x20\x90\x7e\x7a\xa2\x53\x41\x4f\xfb\xc0\xa7\x83\x15\xb6\xa6\x5c\xd3\x92\x4f\xa5\xdb\x9c\x65\x61\x8b\xd6\xae\x6c\xf9\x88\x2f\xf7\xed\x0a\x97\x2c\x80\xa4\x5a\x20\xad\xda\x3c\xd8\x8e\xf8\x45\x5e\x84\xfb\x80\x7f\x46\xaf\xe2\x33\xd1\x9d\xfb\xed\xe1\x75\xc0\xa3\x01\xd8\x56\x0c\x1d\x2e\x52\x03\x95\x3e\x31\x9c\x72\x3f\xc0\x06\x08\xa7\x5f\xee\x4b\xdd\x3c\xf9\x75\x8b\x06\xd7\x74\xb8\x32\xa0\x17\xaf\xe4\xc2\x3e\xda\x0a\xb9\xc2\xf1\x2b\xb8\xc5\x73\x24\x05\xbb\x74\x76\xd5\x31\x01\x91\x6c\x72\xc2\x4a\x4f\x40\x45\x9d\xdd\xb9\xdf\xcc\xe9\xab\x33\x93\x3b\xb8\xf3\x8e\x38\x99\x25\x58\x53\x27\xc7\x61\x28\x4f\x7f\x3a\x83\x93\xc0\x6d\x13\x84\x24\x69\x54\x1c\x3c\x6d\xca\xd5\xc6\x3c\x00\x12\x1d\xfd\x58\xd9\x07\x00\x87\x04\x98\x23\x81\x29\x12\x2c\x8b\xaf\x0e\xd6\x7c\x49\xec\x58\x94\xeb\x7d\xb2\x1f\x1c\x75\x06\x9c\x0c\x7c\x53\xe4\xed\xde\x2c\xe1\x78\x6b\x40\x20\xa0\xb1\x00\x6a\xab\x0b\xa4\x36\x24\x57\x22\xd5\x1f\x3c\x65\x94\x82\x96\x72\x0b\x07\x07\xd1\x0c\xa2\xcf\x01\x49\x15\xc8\x57\xf0\x7c\x67\xdb\x3a\x67\xb1\xe9\x39\x05\x77\x95\xbb\xc8\xf0\x96\xe1\xdf\x7b\x4f\x0f\x4f\x25\xd0\xe6\x0e\x24\x63\x81\x3b\x81\x14\x05\x88\xb6\x00\xf7\x63\x5e\x56\x39\x08\x4b\x22\x2c\x96\x1d\x45\x74\x33\x0d\x6c\xb7\x6a\xda\x5d\x03\xc2\x0b\xe8\xff\x7d\x5e\xef\xe3\xdf\x0f\x48\x15\xff\xb7\xb1\x79\x0b\xac\x0f\x5c\x80\x98\xb6\xf0\x7e\xdf\xe6\x0f\xf0\xcf\x25\x63\xa6\xb5\xae\xaf\x3a\x3c\x77\x24\x16\xa7\xe6\x1d\x88\x6f\x38\x4e\x36\x94\x86\x7e\x6d\x80\xbb\xc0\xdb\x4c\xc5\xa3\xcb\xf8\xfa\x78\x55\x40\xd1\xde\xac\xe1\x4c\x7c\x4b\x78\xc2\x65\xd3\x77\x53\xa3\xaa\xe0\x88\x0e\x60\xfd\x84\x18\xfe\x42\x17\xc2\x37\x59\xc2\x86\x82\x61\x3a\x4b\x65\x3b\x82\x9b\x30\xcd\x0b\xe4\x2b\x60\x0a\x87\x2c\x81\xcf\xa8\xc8\x46\xc2\x84\x6d\x0d\x1e\x08\x20\xab\x6c\xee\x58\x5b\xb9\x84\x31\xbb\x26\x5a\x6a\xfa\x17\xf4\x95\x97\x33\x89\xe2\x09\xfa\x06\x49\x87\x10\xe9\x7a\xa0\x65\xc4\x24\xa1\xc9\x86\x63\xc5\x60\x30\x2d\xb8\x88\x18\x04\x30\xaf\xa1\xa6\x66\x81\xe2\xf6\x7f\xfa\x12\xd0\x4c\x3f\xf1\xc5\x21\xcd\xa0\x88\x1e\x68\x2c\x78\x1d\xa9\xb6\x2c\x54\x92\x44\xb2\x68\x9d\xc2\xa1\xe8\x6d\xfb\xba\x16\xd4\xb6\x7e\x7f\xe2\x09\x7e\x05\x58\x81\x17\xa7\xab\x04\x41\xdd\x20\x2b\xcb\x25\xf4\x4c\x29\x87\xb7\x96\xf1\xad\xf0\x63\x80\x21\xbe\xad\x12\x8f\xc8\xab\x65\xc2\xe8\x87\x37\x2a\x20\x7c\x07\xec\xc8\xe1\xb5\x69\xaa\x02\x4e\x2e\xca\x19\x2c\x09\xb8\x11\xd4\x03\xf0\xfc\xf3\xb7\x89\x74\x45\x3b\xbb\x0d\xb3\x08\x3f\x0e\x3a\x29\x77\x89\x3e\x01\xb8\x9a\xed\x0e\x9f\x33\xae\xdc\xc2\x45\xb5\xe6\xa1\xc9\x2b\x87\x08\x01\x92\x20\x2b\x06\x00\x83\x97\x41\x56\x04\x40\xc8\x36\xf2\x68\x96\x23\x28\x48\x37\x97\x6c\x4f\xc9\xbf\x37\xb9\x13\x6a\x45\xe6\x25\x09\x7f\xf4\x45\x91\x93\xca\x38\xf0\x1a\xed\x88\x77\x08\xa6\x21\x12\x41\x64\xbe\x09\x6d\x83\xfc\x59\x95\xa8\x04\xe0\x25\xc7\x4a\x1f\xc4\x62\xd9\x91\x04\x43\x01\x84\x72\x15\x56\x88\x44\xab\xb2\x1e\x23\x7d\xc5\x26\xd4\xba\x41\x63\x0f\x17\x9d\xdf\xbe\xbf\x33\xb3\xab\x0b\x73\x7e\x7d\x75\xb1\xb8\x5f\x5c\x5f\xdd\x9d\x9c\xfc\x38\x35\x17\x20\x64\x6b\x5e\x18\x1e\x9b\xdc\x47\x02\x7e\xc2\x6a\x9e\x6e\x58\x4f\xf7\xb3\x9e\xef\x9b\xdc\x87\xab\x79\xeb\x78\x02\x92\xd8\x81\xa6\xb7\x39\xc0\xef\x35\xce\x8b\xaa\x04\xcd\x5f\xe5\x4f\x22\xc2\xf3\xdd\x8e\x99\xf3\x88\xed\x88\x2c\x0a\x88\x77\x76\x5b\x22\x3a\xfa\x15\xb2\xd5\x36\x77\x5f\x04\x74\x6b\x6e\x58\xaa\xc7\x90\xa3\x20\xf6\x3b\x12\xcf\x12\x03\x0a\xbe\x8b\xf8\x0e\x14\x72\x33\xcf\x61\x27\x79\x82\xcd\xde\xa2\x00\x7e\xa6\xcb\x76\x66\x02\xca\x6e\x32\x35\x13\x79\xdc\xba\x09\x21\x7e\x82\x77\x06\xba\x1f\xf4\xcf\x84\xa4\xeb\x12\x55\x50\x51\x02\x77\xf7\x70\x7a\xb4\x0e\xc0\xde\xcf\xeb\xf2\x7f\x73\x45\xf7\x7d\x63\x26\xac\x09\x61\x09\x86\x8b\x51\xa4\xb6\xff\xba\x05\x0d\x87\x66\x5a\x91\xef\xc8\x72\xc7\x7f\xec\x40\x6b\xe8\x35\xd0\x3b\xa8\xe8\x40\x96\xbb\x0d\xc9\x07\x12\x3e\xac\x34\x54\xb3\x07\x9d\x9c\x09\x6e\x01\xdf\xac\x3c\x44\x8e\xa3\x50\xa8\x8d\xfd\x0a\xc6\x30\xbd\xc7\x7a\x20\x28\x20\xde\xc7\x29\xb7\xe6\x02\x77\xc4\xdc\x13\x05\x09\x94\x5a\x55\xa2\x68\xc7\x57\x10\x76\xfe\xaf\xc9\x32\x67\xb5\x34\x39\x78\x8a\x34\xff\x64\x05\xda\xbb\x85\x27\xf0\x2f\x13\xc1\x83\x2d\x05\x5a\x10\x71\xb5\xdf\x51\x6e\x39\x5a\x5c\xd7\xa6\x27\xe5\x67\xc1\x2f\xc8\xd7\x5d\xfe\x00\x4a\xf9\x10\xc5\x05\x51\x07\x19\x5a\x6c\x21\x81\x72\x62\x85\xa0\x6a\x29\x46\xdc\x53\xd3\x57\x05\x1b\xab\x68\xed\x14\x20\xe1\x57\x1d\xd0\x2b\x3a\x3e\x62\xb5\x94\xf0\xcf\xaa\xf4\x56\x42\x59\xaf\xf1\x22\xc8\x26\x11\x3a\x43\x12\x07\xe6\xc4\x27\xc2\xf5\x00\x07\x64\x80\xfb\x95\x85\x3b\xb6\x5f\xed\xaa\xef\xc4\x63\x23\x99\x8c\xc2\x0c\x2c\x27\xa4\x1e\x31\x9b\x58\xf1\x82\xa5\xfd\x98\xb3\x31\x0c\xd7\x75\x23\xc7\x44\x12\x00\x4b\xa4\xea\x41\x22\x1e\x91\x12\xa7\x74\xd6\x26\x28\xdf\x58\x64\x80\x89\xac\xaa\x7d\xa8\xe4\x58\xec\xb3\x59\x88\x1a\x13\x8d\x06\x30\x59\xc0\xcd\x21\x63\x9c\x6e\x0a\x9d\xa9\x47\x10\x27\xa8\x24\xc1\xec\xb4\x55\x25\xd7\x00\x08\x7a\xb4\x43\x32\x47\xde\x44\x2e\x47\xd2\xd9\x45\x07\x20\x69\x60\x6b\xdc\x5c\x17\x46\xa2\xc7\x55\xd5\x5f\x68\x5a\x6f\xb1\xb1\x37\x00\x36\x97\x15\x67\x8a\x5c\x3a\x75\x20\x73\x52\x8e\xb0\x64\xdb\xf4\x0f\x9b\x18\x9f\xa2\x8b\xf9\xb6\x41\xfc\x1b\xf0\xd7\x6a\x87\xa6\x2e\xa9\x48\x36\x5d\xc5\x69\x66\xf0\x01\x2d\xac\xc3\xfc\x2e\x8f\xac\x7b\xf9\x0f\xeb\x1c\x14\x20\xa0\x7a\x57\xe5\x7b\x10\x13\xb3\x1d\x9e\xa9\x2d\xf1\x92\x2e\xc9\x36\xbe\x6a\xc0\xd5\x44\x79\x21\x18\xb5\x5f\x3b\x24\x0d\xb6\x5f\xbb\x70\x6f\x39\xef\x57\xa3\x30\x61\xbd\x07\x72\xa0\xac\xe1\x5f\x40\x60\x8f\x25\xeb\xe5\xb5\xcd\x3b\xef\x34\xa1\x41\xef\x77\x06\x4e\xce\xa3\xbd\x03\xa1\xd5\xb4\x7f\x30\xec\x3b\xb8\x1f\xe7\x0d\x08\x5e\x89\xed\x0a\x3a\x36\x68\xd6\x16\xbd\xd1\xbd\x3a\x53\x7c\x77\xa7\x42\xaa\x23\x87\x90\x17\x4a\xf1\xf2\xc4\xb6\x29\xd4\xef\x52\x91\xea\x48\x3e\x32\x4e\xc3\xba\x87\x92\x98\x21\xdd\x80\x7b\x84\x2a\xa8\x04\x2d\xcb\xd7\xe2\x83\x1e\x5e\x62\x2f\x58\xf6\x84\x6b\x00\x0d\xea\xc8\x15\xc8\x61\x57\x47\xf2\x92\xce\x88\x96\x5a\x4e\x7a\x05\xae\x79\x47\x82\x38\x68\x16\xb0\x8b\x6c\xdd\x67\xec\x4a\x33\xc2\xe1\x5e\xd0\x87\x64\xc9\x42\x2b\x6d\xad\xed\x1c\x6f\xbf\x6a\xe1\xd7\x96\x2d\x9b\x57\x53\x73\xc7\x26\xd0\x39\x98\x40\x53\x43\x7a\x7c\x12\x59\x45\x13\x76\xb8\x13\x19\xc4\xaa\x1e\x7d\x69\x10\x5f\xf0\xf3\x36\x91\xeb\x14\xb7\x60\x66\x8c\x59\x94\xbd\x0d\x30\xd5\x27\xd7\xcb\xff\xb6\x24\xb0\x71\xf5\xc0\x52\x75\x53\xbf\x90\x8d\x75\xcd\x3c\x12\xb4\x77\x5d\x8e\xc2\xaa\x30\x0b\xc5\x56\x78\x39\xc2\x20\x33\x21\x0b\xe0\x92\x7e\x03\x3f\xb0\x5c\x95\x40\xc7\x4e\x57\x28\xd0\x7a\x60\x6b\x2c\x47\x7e\x6c\x1e\x40\xbd\xa1\xd1\x2c\x0f\x38\xb3\x6c\x0a\xe0\xa2\xe6\xd0\x5b\xf1\x1b\x39\xb5\xcd\x19\x05\x88\x7c\xe4\xf5\x55\x8f\x86\x9b\xb8\x69\x5b\xc4\x41\x05\x1e\x77\x0f\xfe\x11\xda\xaa\x02\x5e\xe9\xc8\x5f\x03\xae\x20\x9f\x27\xdf\x36\xf0\x5c\xe4\x76\xe1\xa1\x49\x96\x8a\x4c\xd1\x25\xc4\xcc\x9a\xdc\xed\x1d\x5e\xef\x65\xb9\x6c\x73\x94\x62\x13\xaf\x08\x51\x0a\x07\x6b\x41\x38\xd3\xab\x8b\x03\x35\x4a\x4f\x11\x05\x3d\x6d\x9a\xca\x0a\xbd\x9f\xe6\x67\x08\xa2\xbc\x5d\x28\x0a\x6a\xb8\x14\xc0\xa2\xde\xcd\x2e\x5f\x7d\xc9\x1f\x58\xa8\xbf\xcf\xff\x1b\x50\x70\x0e\x22\xaa\xa9\x7d\x10\x8f\x0d\x48\x91\x44\x41\xfb\xc3\x06\x07\x8f\x13\x67\x2f\xcf\xd8\x68\x07\x22\xaf\xd5\xdb\xa1\xb3\x88\xf9\xef\x01\x96\x08\xdb\xd8\x42\x0d\x39\x27\xe0\x54\x57\xac\xbe\x72\x73\x48\x36\x74\x5d\x0c\x1c\x52\x8e\x3e\x2b\x4a\x68\xc4\x4d\x12\xc7\x81\x94\x47\xf0\x16\x10\x0f\x53\x03\x84\x39\x00\x62\x22\x34\x83\x8c\xd6\xc0\x9e\x5f\x01\x2c\xa1\x53\x60\x0b\x7c\x14\x4d\x32\x90\x36\x80\xcb\x95\xbe\x64\x4e\xbf\x80\xc7\x6f\x2b\x94\xea\x75\x01\x92\xc3\xd1\x15\x33\x66\xc0\x04\x05\x0d\xa7\x28\x50\x97\x50\x5c\x34\xbc\x00\x7e\xd8\x9c\x96\x48\x05\xfb\x33\x54\xc0\x7c\x3e\x16\x74\x29\x51\x80\x27\xe6\x32\x36\x42\x70\xfb\xb2\xb2\x2d\x93\x21\x7b\x75\x60\x9f\x86\x98\x20\x3f\x07\x2c\x14\x38\x96\x39\x00\xd8\xbf\x8b\xde\x83\x35\x91\xb5\x85\x3c\xcf\x1b\x10\x0c\x6e\xd7\x70\xf0\x83\xc5\x4b\x22\x46\xca\x74\x45\xa2\x28\x41\x11\xd8\x8a\x43\xb7\xac\xb6\x56\xc3\x8c\x64\xb2\x77\x16\x31\x0c\xbc\x5a\x55\x42\x39\x6b\x86\x72\x70\xd2\x33\x02\x8b\x9c\xd9\x68\x33\x8a\x61\x35\x71\x24\x87\x0f\xca\xd4\x4e\xd8\x04\xf9\xb8\xeb\xc4\x9a\x05\x33\xa1\x41\x90\x1a\x74\xe5\xbc\x95\x10\x47\x33\x3a\x30\xc8\x2c\x13\xb9\xf2\x9b\xae\xfa\x83\x33\x43\x56\x25\x8c\xf2\x39\xaa\x17\xbb\xbe\xdd\xe1\xc2\x5d\xd3\xb0\xa5\x2d\x3f\xa0\x27\x1b\x02\x37\x71\x0c\x4e\xe9\x56\xc3\x25\x91\x79\x09\x48\x05\x82\x40\x5c\xb2\x9f\x9d\x42\x1c\x71\x24\xbe\x9c\xb2\x24\x43\x3b\x35\x6f\x91\x38\xbf\xe6\xc8\x11\x99\x19\xbb\xc5\xa0\xeb\x23\xcb\xc1\xbb\x62\x66\x5d\x56\x64\x41\xb9\x66\x85\x2a\xbc\x60\x4e\x55\x99\x4e\x3f\xc6\x2a\x59\x03\x8a\x76\xc8\x57\x1c\x35\x2e\x40\x71\x09\xd6\x38\x9b\xb0\xaf\xf3\xad\x84\x42\xaa\xb2\xfe\x82\x02\xbb\x5f\x7a\xcc\xa8\x19\xe0\x8d\xfe\xa3\x41\x7b\x09\x74\x04\x05\xba\xc4\x10\x7d\x57\x6e\xd1\xec\x28\xf2\x2e\xd7\xc0\x88\xb8\xa3\xe4\xb8\x32\x21\xac\xc1\x2f\x05\x0f\xa9\x7b\xb2\xb6\x16\x1c\x9f\xc4\x40\x44\x11\x7a\xc0\xae\x4b\xd0\xcb\xdc\x31\x8a\x56\x24\xf1\x84\x82\xbc\x81\xaf\xb1\xd3\xd6\x51\x9c\xb5\xb5\xca\x03\x26\xef\xbb\x06\x20\x96\xf3\xb1\xcb\x75\xb8\xf3\xd8\x76\xcf\x41\x92\x72\xe9\x50\xde\xf9\xb0\xa5\xcb\xb7\xfe\x54\x3f\x4d\xcd\x9b\xdc\x81\x40\xba\xf1\x6e\x07\x30\xc8\xc9\x0c\x58\x59\xe2\xb8\x0f\x94\x1c\x18\x73\x5a\x89\x18\xf5\x67\xa5\x0d\x0c\x1f\x20\xfc\x07\x31\xde\x1b\x8d\x7e\x22\x9a\x29\x07\x01\x27\x78\x6c\xd8\x31\x51\xab\x8d\x09\xaa\x23\xfa\x8b\xc2\x0f\xf8\xf8\xd6\x76\x12\x4d\xd1\xed\xed\x57\x74\x6c\x4a\x34\x50\x73\x30\x13\x30\x6c\x41\x01\xe8\xbe\xae\xca\x6d\x89\x4b\xa4\x81\x61\x95\x28\x87\x6e\x1d\xbb\x9e\xe0\x97\x80\x95\xce\xb7\xa1\x21\x2f\x24\xa7\xe0\x23\x92\x3b\x2a\xff\xa6\x80\x69\x04\x0d\xe9\x3d\x8e\xec\xca\x4a\x1c\xbf\xaa\x29\xb2\x48\xda\x04\x95\x1c\xfc\x87\xeb\xca\x0e\xbc\x01\x37\x58\x7c\x70\x3a\xd0\xd0\x75\xf3\x04\x9e\xef\x83\x75\x49\x60\x1d\xe3\xba\x79\xc9\x71\x7f\x1f\x17\x46\xae\x78\xcc\x2b\x56\xc8\x2e\xe0\x73\xb9\x4f\x9d\x3e\xb8\xf2\xcf\xe0\x49\xa2\x2d\x8c\x3e\x4d\x46\x48\x11\x73\x9f\x7d\xd6\x04\x26\x17\x52\x06\xe0\xb9\x06\xaf\x24\xb8\xab\xd1\x2d\x81\xaa\xab\xd0\x18\xca\x05\x5e\xcd\xd3\x11\x84\x4f\x18\x5b\xd2\xa4\x50\x89\x61\x22\x24\x66\xa3\xc0\x88\x61\x3e\xd8\x5b\xc2\x32\x41\xf2\xb8\x06\x89\x45\x24\x2f\x20\x62\x93\x3f\x4a\x60\x72\xcb\x3e\x5a\x6a\xb4\x82\xd7\x50\xf5\x0e\x2e\xa1\x62\x7f\x02\xc0\x22\x19\xae\x01\x50\x4e\xd2\x80\x98\x03\x61\x58\x56\x2c\x6b\xf1\xb9\x10\xf0\xc4\x7d\x24\x16\x14\xd1\xa8\x26\x65\x30\xe6\xb7\x0f\x49\x43\x0e\x9d\x0d\x1c\x05\x3c\xac\x77\xe5\x48\x47\xa2\xa8\x6a\x4b\xb6\xc6\x44\xac\xa7\x08\x26\x69\xe5\xaf\x0d\xe9\x82\x14\xcd\xa6\xf7\x31\xf0\x04\xc6\xe1\x95\xc9\x49\xcd\xb6\x77\xa8\xdf\xf0\x5e\x62\x44\x00\x33\xd0\xf5\x2c\xed\x26\xaf\xd6\x99\x30\x36\xfd\x89\x03\x0c\x1a\xd6\x13\x48\x28\x4e\xcb\x47\xa3\x93\x03\x1e\x36\xe5\x92\xe2\x16\x80\x75\xe2\x16\x75\xdf\x39\xee\x25\x79\x32\x5a\xd1\x9f\xc2\x16\xe1\xdc\x40\x37\x4e\xe2\xcf\x25\x85\xe0\xf9\xba\x36\xe5\x8e\x71\x09\x6f\x02\x9d\x9e\x7b\xa4\x49\x1c\x03\x56\x67\x62\x5f\x95\xed\xaa\xdf\xa2\xc1\x8f\xa6\x7c\x92\xc1\x46\x02\x41\xd3\x5c\x84\x95\x4d\xe8\x93\xe5\xca\xd2\x62\x7c\xd2\xdc\x91\x61\x28\x51\xd1\x34\x4f\xfd\x1a\xa3\x2b\x84\x86\x57\x3f\x12\x59\x51\x0e\x01\xf0\x8d\x49\x36\x97\xb7\x7b\x80\xee\x67\x8a\x7f\x60\xd6\x0b\xdf\xff\xc0\x09\x22\x76\xb9\x6f\x99\x4f\xdf\x22\x66\x66\xa0\x9a\x5e\x9c\x13\xbc\x8f\x68\x37\xc2\x9a\x97\xc0\x85\xe6\xe4\xaa\x49\x25\x0b\x68\x4d\x20\x8d\x25\xaa\x64\xb0\x68\x0b\xaf\xe0\xd1\x34\x5a\xaf\x2d\xfb\xfd\xb0\xdd\xa6\x6e\xaa\xe6\x81\xb2\xc7\x60\x75\x51\x42\x21\xa0\x27\x0a\xf5\x00\xaf\x9b\x75\x5f\x81\xe2\xae\x88\x60\xe0\xb0\x0f\xc2\x15\xf2\x3c\x3a\x3c\xf0\xe0\xab\x57\xaa\x6e\x3e\x2d\x6e\xae\x23\x69\xd1\xb5\xe0\xed\xc3\x9a\x05\xf8\xac\x1c\xe9\xfa\xe9\x47\x73\x01\x28\xa0\x52\x84\x57\xbf\xfe\xfa\x0b\xf1\x92\xc6\xbb\x29\xa6\xaa\xb4\xa1\x34\x6a\x31\x06\xc4\x28\x5a\x25\x48\xc0\xdc\x11\x2a\x70\x39\x83\xcf\x03\x33\x5b\x91\x2c\x48\xa5\x63\x26\x89\x51\x44\x03\x1e\x55\x32\x7f\x70\x5d\xe4\x35\x00\xcd\x2f\xcb\xe2\x70\x93\x51\x8c\xb9\x41\x1c\x81\x13\x31\xc9\xab\x40\x10\x8c\x76\x96\xa1\x60\x9d\xb6\xab\x92\x48\x45\xa4\xf0\x88\x3a\x24\xda\x45\xad\x8c\xf6\xaa\xcf\xd2\xc4\x47\x40\xae\xe2\x40\x9e\x5b\x55\x79\xb9\xa5\x93\x50\x2e\xbe\x13\x1d\x45\x9a\xcb\x84\x82\x04\x0d\xc0\x79\x73\x66\x3d\xf0\xfd\xd8\xf4\x86\x3f\xdb\x1a\x45\x2a\x39\x8a\x20\xc7\xd1\xc6\x8e\x4d\x59\xb2\x42\x32\xe6\x49\x92\xa5\x65\x5b\x68\x80\xeb\x07\x41\xa6\x9c\xec\x2f\x63\x13\xee\xee\x6f\x53\x13\xd8\xf5\xa3\x96\x8b\x9c\x4b\x94\xec\x64\x20\xe5\x47\xeb\x49\xbc\x85\xf0\x43\x9a\x87\x63\x6d\xe2\x23\x6f\x25\xe7\xce\x10\x71\xc0\x26\x65\xbf\x1d\x17\xcc\xb5\xdb\x81\x3b\xdf\xf4\xae\xe2\x6a\x96\x28\x38\x05\x7f\x91\x9c\x0e\xd2\xb4\xc5\xb8\xbb\x14\xbd\x3c\x1b\xc2\x7a\x6d\xbe\x58\xbb\xc3\xdb\xc2\x80\x35\x32\x2b\xff\x9d\xe5\x8a\x37\xf7\x52\x03\x09\x77\x96\xe8\x88\xda\x22\x8f\x3e\xc5\x52\x88\x7f\x8e\xc9\xa3\x56\xed\x6d\x11\x3c\xff\x08\x99\x09\x26\xa3\xe2\x19\x00\x04\x7f\xf9\x12\x5c\xd3\x15\x67\xdb\x60\x53\x8d\xa4\xbd\x26\x30\x1e\x88\x71\xd0\xac\xf3\x29\x83\x23\x91\x2d\x78\xaa\xd1\xe8\x74\x1a\xdb\xf6\xd7\xc8\xe5\x0e\xb8\x09\xd5\x5e\x20\x45\xd5\x8d\xfc\x37\x6a\x9f\x80\xd4\xf8\x4a\xc8\x6e\x50\x16\xc0\x75\x38\xc9\xef\xfa\xdd\xae\x41\x61\xd7\x86\xe0\x9f\x14\x14\x70\x3e\x09\x8d\xda\xb5\x45\xcb\xf7\xef\x31\x99\xbd\x57\x23\x4e\xac\x5f\xa9\x99\x1a\xa1\xb7\x67\x22\xf6\x1c\x75\xd8\x0c\x0d\x87\xc8\x9d\x2e\xc5\x22\x4c\x5e\x92\xa8\x8a\x86\x53\x62\x7a\x0d\xaa\xc7\x9b\x03\x7a\xa9\x7f\x1b\xa3\x55\xc9\x52\x59\xc9\xb5\xd0\x55\xba\x58\x6f\xfd\x76\x72\x92\x9f\x91\x81\xca\x61\x3c\xd4\xea\x2b\x40\xd4\x3e\x8a\x18\x8e\x92\x22\xa1\xd9\x7b\x98\x12\xa9\x01\x3a\x60\xbb\x16\x73\x89\x8f\x58\x67\x52\x60\xf5\xc0\xc9\xc9\xf2\x5f\xda\x83\x6b\xbc\x7c\x5e\x72\xcc\x49\x10\x1e\x88\xcd\x79\xa2\x7c\x7e\xd6\x13\xbc\x98\xbf\xe2\xdf\x51\x00\x48\x80\xe7\xa0\x65\xfc\x03\x7a\x37\x8a\x53\xbc\xab\xc9\x11\xce\x98\xc0\xb9\x56\x67\x6c\x64\xe2\x91\xd4\x22\x25\xd9\x0f\x52\xad\xf5\xbe\x6c\x14\x46\x1b\x39\x03\xe7\xf4\x30\x04\x08\xcf\x18\x4e\xc8\xc3\x6e\x40\x24\x8d\x73\xd6\x69\x12\x36\xf7\x79\xac\x44\x2b\x70\x58\x84\xd3\xe2\xcc\xd6\x59\xcc\x63\x03\xc5\x1d\x49\x80\x82\x11\x06\xa2\x96\x48\x29\x53\x69\x40\x80\xc6\xaa\x40\x9c\x2a\x29\xac\x22\x1f\x32\x43\x77\x33\x6f\x8b\x0a\xf3\xe5\x68\x29\x63\x44\x1b\x8b\x4e\x28\x48\x4e\xe1\x3f\x5b\x0c\x40\xe5\x74\x3b\x72\x72\xe2\x37\xc5\x58\xf3\xc9\x3f\x6f\x8c\x3d\xe5\x7b\x0e\x19\xa6\xc1\x14\x70\x46\x4a\xa4\x2c\x56\xae\xd1\x82\x52\xe2\x44\xe5\x56\xce\x02\xac\x2c\x92\x45\xbe\x17\x1c\x8a\x2a\xce\x34\xbc\x4e\x1b\x62\xee\xfb\x78\xfe\x03\xce\x4a\x02\x87\xed\x5d\xce\x48\x98\xa3\x99\x90\xd7\x88\x0a\x09\xff\x24\x7a\xe7\x60\x97\x28\x5c\x4c\xb4\x2e\x06\xfa\x37\x77\x10\x35\x4b\x90\xfb\xe0\x00\x79\x27\x64\x31\x93\x45\x4e\x61\x71\x0e\xe1\x79\xc5\x3e\xf0\x35\x39\x65\x46\x38\x56\x3c\x49\x1e\xac\xb0\x3b\xac\xde\x03\x46\x10\xd7\x24\x8d\x0d\x71\x29\x0f\x58\xd6\x35\x67\x6b\xc8\xca\x49\x2a\x91\x0e\xad\x92\x74\x05\x00\x6c\x49\x41\x76\x4d\x51\x6a\xb0\x85\x6d\x83\x2d\x66\x38\x50\x05\xb4\x51\x4d\x13\xd9\x2a\x94\x3d\x7c\x6c\xaa\x7e\x2b\x45\x1f\xae\x6b\xb0\xbe\x08\x7f\x4b\x12\x82\xaa\xbb\xa3\xfc\x6e\x6d\x26\xf9\xc3\x03\x52\x2d\x26\x4e\x4b\x85\x34\xa0\x88\x0e\xdf\xb9\xa4\x46\x49\x75\xb4\x42\xae\x41\x4d\xb6\xa3\x48\x2b\x72\xc9\x08\x00\x90\x58\x39\xcd\xc1\xfa\x6a\x25\x81\x11\x0e\xac\x8e\x28\x91\x98\x54\xc8\xa8\x8b\x83\xc5\xee\xc6\x14\x8b\x6b\xd1\xab\x1a\xbd\x3d\xe2\x11\xe3\x0f\x14\x58\x63\x95\xf7\x5c\x6a\x97\x8a\x97\x58\xdb\x8f\x84\x82\xfc\x42\x40\x38\xbf\xc4\x5a\xf0\x0a\x4c\x0b\x51\x80\x6f\xe1\x66\x46\xb5\xdf\x10\xb0\x83\xf8\xed\x71\x9d\xe5\x40\xc0\x22\xde\xff\x7e\x54\x75\x45\x29\xb5\x2d\x70\x21\x90\xcd\x0b\xac\x64\x23\x59\x36\x1a\xa5\x1a\xd9\x2c\x4d\xc0\x21\x84\xb5\x0d\xaa\x10\x24\x8c\x28\xc1\xf3\xb0\x57\x1a\xd5\x26\x35\x0e\x8e\x09\x28\x0c\xb2\xa9\x28\x9f\xb6\xd9\x3b\xb2\x53\x59\x93\x77\xe6\x34\x84\x89\xa3\x5f\x47\xc8\xf2\x2c\x93\x82\x9e\xbc\x2e\x43\x69\xdc\x78\xc8\xad\xfc\xca\x36\x45\x6e\x8a\xbe\xe5\x58\x96\xae\xcc\x8b\x99\x15\x88\xa5\x66\xcb\x99\x7a\x22\xcf\xa4\x6e\x99\x84\x0c\x57\x76\xb2\x12\xfe\x3f\x3b\x23\x28\xc0\x16\x9d\xe8\x9a\xed\xb2\xcc\x90\x08\x67\xfb\x0b\x54\x27\x28\x78\x64\x07\x0c\x68\xef\x6d\xde\x72\xb8\x34\x7a\xc4\xc5\xc1\x1f\x35\xed\x76\xac\x6d\x88\x90\x5b\xc1\x44\x64\xf2\x71\x58\x87\x63\x0a\x04\x3e\x68\x7c\xcc\xa3\x60\xba\x40\x1c\x3d\x55\xba\xa2\x69\xb5\xc2\x2d\xc2\x8c\xe4\x0b\xa9\xbe\x34\x32\x68\x9f\x8b\x91\xfa\x44\x85\xbf\x04\xc9\x8b\x32\x14\x9a\xe7\x3b\x12\xea\xcb\xfe\x3f\xdd\x77\xa6\xb9\x47\xb2\x9b\x6b\xcc\x6b\x70\x6e\x5d\x02\x34\xc0\x46\xae\xa9\xa5\x70\x83\xf3\xc9\xba\x17\xfa\x30\x71\xbe\x80\xf3\x55\x22\x12\xbc\x41\x4a\x14\x83\x49\xf7\x50\x36\x27\x46\xf9\x31\xe4\xa0\xa1\x7b\x50\x31\x98\xa3\xed\x27\x46\x3f\x1b\x54\x42\xa3\x91\x60\x4c\x3d\xb9\xf8\x7a\xa4\x22\x22\xbe\x98\x84\xce\x86\x05\x89\xa3\x41\x6f\xb6\x53\xb4\xb4\x96\x94\xb3\xd3\x68\x0d\x47\x5e\x9b\xd5\x2a\x77\x64\x2c\x89\xc7\x07\x3e\x17\x66\x02\xd0\x6f\xc7\xbf\xb1\x9a\xd3\x20\x6d\xe4\x51\x16\xe3\x10\xb3\xc6\xf3\xbc\x30\x74\xd3\xfa\xa5\xda\x69\xbf\x2c\xd9\x5e\x39\xc2\xb7\x4b\x71\x73\x88\x23\xf9\x1a\x04\xcb\x9c\xd5\xa0\x90\x14\xd8\x13\x80\xfd\xd3\x07\x74\xfa\x89\x53\x98\x30\x18\xe5\x67\x02\x3a\x21\x2b\xc4\x79\x07\xb5\x90\x47\x32\x3e\x4c\xe7\x14\xf0\xcf\x11\x38\xae\x48\xf1\x7f\xe4\x8d\xf9\x82\xd7\x7d\xcb\xd1\x35\xbe\x68\xb2\x9a\xbd\xf9\x22\xd6\x77\xec\x3d\x7e\x93\x9a\x06\x7e\x64\x84\x15\x5f\x3c\xc1\xfb\xc7\x2b\x25\x32\xcf\x1d\x10\x63\x76\x7c\x3b\xa9\x7f\x63\xde\xf4\xb5\x96\x42\xc3\xa7\x1c\x52\x61\x66\x26\x01\x85\x08\x0e\x61\x90\xfd\x99\xe4\x46\x58\x32\xb9\x18\xd1\x52\xd2\x14\x05\x89\x23\x65\xc8\xbe\x2c\xba\x1e\x18\xe7\x05\x29\x19\x45\x51\x41\xe1\x83\xed\xe5\xb5\x7a\x74\x32\x97\xd3\x8a\x4f\x5a\x50\xbb\x2e\x25\x99\x36\x4e\xfd\xb7\x89\x29\xff\x14\x0a\x6e\xc1\x96\x75\x9d\x3b\xfa\x66\x26\x84\x8e\x00\x6a\x08\x30\xe9\x7d\x89\x7c\xb8\xb4\xda\x3c\x12\xe7\x21\x85\xeb\x90\x3c\x39\xf1\xea\x12\x87\x0c\x43\x40\xf6\x28\x0b\xf4\x14\x37\xdb\x59\xdb\xbe\xe8\x9a\x17\xf8\xff\x5c\xf6\xe4\xcb\xdc\x12\x64\x96\x35\x7b\xd5\x6c\x03\x59\x2a\xa9\x60\x34\x8d\x24\x83\x47\x09\x21\x89\x91\xb5\x58\x42\xcd\x52\x71\x4d\xc2\x5c\x6e\x43\xb2\xb5\xbe\xb0\x38\x92\x71\xea\x99\x46\x3c\x5e\x48\xa7\x00\x9a\xe1\x24\xf3\x81\x46\xa2\x70\x5c\x04\x16\x1a\xe3\x18\xad\x8f\x43\x02\xa5\x64\x22\xf0\x88\x3e\x96\x30\xce\x32\x48\xf1\x49\xda\x19\x04\x97\x67\xc2\xa5\x4d\xea\x3a\x82\xc4\x3f\x90\x60\xbe\xf0\x06\x03\xd3\xe8\xe0\xa0\x5e\x9b\x10\x20\xb1\xb6\xc4\x12\x39\xd7\x6f\xd9\x8e\xa7\x47\xd4\x97\x08\x95\x3d\x1d\x76\x73\xd1\x99\xe1\x2a\xc8\x19\x45\xb7\xc7\x02\xcb\xc4\x45\x22\x58\x5d\x12\xeb\x3b\x7d\x18\x74\x5c\xbe\x2d\x2b\xaa\xc7\x01\x62\x85\xdf\xc1\x77\x2d\x34\x85\xe3\x82\x86\xd2\x9c\xa9\xcf\xf5\x92\xd2\xac\x0a\xa9\x6a\xd4\x3e\x07\xae\x35\x44\x83\xd9\x14\x58\xea\x87\xe5\x71\x60\x87\xc3\x6b\x68\x4c\x96\xb5\x70\x15\x9d\x31\xf7\x0a\xbd\x94\xfa\xb6\xe4\xac\x19\xd8\xe4\xfd\xb2\x5b\xf7\x15\x17\xe1\x87\x10\x3c\xdc\x4b\x53\x3d\x32\x92\xd7\xf9\x23\x17\xd2\x93\x31\x80\x75\x3c\x94\x69\x1f\x56\x0c\xd1\x36\x5e\xa3\x90\x35\x15\x3d\x80\x7e\x45\x66\x26\x09\x9a\x92\x82\x61\xd3\xed\x77\x64\x43\x34\x5c\x2e\x06\xa7\xf4\x85\x33\x40\x9a\xab\x2a\x67\xd6\xf7\xa0\xa7\xce\xbd\x66\x4d\xfb\xd0\x6b\x92\x6e\x6e\xf8\x0c\xc4\x16\x39\xf5\xb4\x85\x1a\x93\xe1\xa3\xe0\xfd\xf6\x0a\x25\x5f\x90\xfd\x8a\x21\x6d\x52\x4c\x44\xca\x3b\x8e\x8b\x03\xe0\xd4\xae\x12\x99\x4e\x58\x53\xf3\x2c\xd2\x07\x80\xeb\x55\xc5\xd6\x17\xba\xe1\xc8\x7b\x5d\xee\xeb\x6c\x44\x8b\xa3\x1a\x2e\x7a\x34\x65\x19\x53\x18\x56\xf5\x1b\x30\xb4\x7d\x4d\x4b\x93\xf6\xc6\xbf\xc0\x7e\x52\x96\xc7\x4c\x82\xfa\x1f\x09\x8c\x62\x7d\x1c\x62\xb2\x52\xa8\x17\xb5\xe9\xd0\x51\x4e\x4e\x26\x0b\xae\x54\x61\xb2\x5b\x90\x60\xa2\xff\xd6\x82\x98\x98\xbb\x22\x96\xd9\xc2\xa1\x9a\x82\xb5\xc4\xca\x16\x18\x23\xcf\x30\xe5\xbf\x69\x5a\xa9\xc4\x36\x5f\xec\x9e\x71\xcb\x72\xae\x0c\x6b\xab\x5c\x2d\xb8\xc1\x87\x00\xe0\x66\x1d\xaa\x90\x39\x6c\x71\x70\xe3\xde\x27\x11\x4e\x02\xa0\xd8\x1d\x07\xed\x1d\xd4\x35\xe6\x8e\x1a\x5e\x36\x81\x8e\x82\x2c\xae\xc7\xb2\x3c\x3b\x54\x24\x92\x6f\x03\xd7\xbc\x47\x31\xd0\xd7\x24\x3d\xc5\x24\x0d\x41\x56\x64\xee\x54\xcb\x63\xc7\x5a\xc3\x65\x7a\x70\x5b\x98\x70\x60\x01\xc0\x11\x18\x3e\x16\x57\xa3\x50\x76\x6f\x69\xd9\x89\x4e\x32\x23\x48\x36\x4b\xac\xec\xc0\x46\x2c\xb8\xbc\xc5\x3a\x49\x26\xd5\x07\x02\x32\x0e\xf4\xa9\xa0\x17\x2f\x0b\x37\xe3\xe4\x56\x5c\x86\xb2\x96\x66\x3b\x76\xbd\x62\xd4\x86\x62\x98\xc8\x0a\x5f\xad\xfa\x96\x4a\x92\x7d\x2a\x8f\xd5\x5e\xae\x5b\x45\x3c\x28\x95\x12\xeb\x38\xa0\x88\x4b\x46\x64\x99\x5c\x25\x96\x72\x48\xe5\x70\xa4\xd3\xbc\x71\x26\xf5\x44\x3b\xdb\xf5\xd8\xc2\xea\x0d\x4a\xf6\x56\xa9\x44\xe3\x74\x34\x3c\x98\x42\xe8\x48\x21\xc2\xbf\xc0\x7c\xfd\x5f\x29\xa9\x3d\xa2\xb8\xf8\xdc\x69\x04\x58\x91\x4a\x24\xb3\xb4\x63\x3e\xf5\x31\x06\x9b\x9a\x37\xbd\xe4\x52\xe2\xb8\xaf\x0f\xa2\x70\xb8\xa4\xc4\x76\x5c\xd6\x67\x78\xd5\x75\xc3\x59\xd0\xc8\xaa\x83\xb7\x3b\xaa\x38\xe0\xfc\x08\x9a\x6f\xfb\x98\xaf\x46\x09\x52\x32\x04\x09\xc2\xa9\x4c\xcd\x97\x57\x25\x81\x49\x22\x3a\x59\x90\x75\xc6\xed\xf5\xfb\x33\xa9\xd3\x89\xa1\x8f\x1c\x9d\x63\xe7\x3e\x2c\x47\xcb\x87\x4b\x28\x83\xc5\xcb\xa9\x3f\x8d\x46\x21\x55\x5b\x6b\x22\x85\x88\xb8\xdf\x61\x20\xd6\xc5\xe5\x41\xc4\xae\x81\x63\x3c\x16\xda\xe8\x20\xbe\x23\x50\x88\x2a\x53\x3a\x3a\xa4\x46\x25\xe5\xf2\x5b\x8b\x82\x7e\xf0\x5e\x4b\x30\xed\xc5\x72\x2f\x2c\x91\xc6\xd3\xc6\xd6\x07\x29\x19\x94\x50\xb6\x5a\xfb\x1a\x02\x4d\xeb\x15\x28\xc4\x2c\x57\x00\x91\x8e\x22\x29\x1f\xd2\xa7\xcc\x3b\xba\x11\x80\xf2\x58\x36\x15\x61\x83\xce\xd6\x57\x52\x9f\x86\x09\xa7\x66\x85\x95\x7c\x6b\x51\xc1\xa1\x84\x2c\x5f\xb5\x8d\x73\xf1\x42\x54\x9d\xf0\x0c\x17\xb0\x3c\x38\x7a\xc9\x6a\xef\x1e\xb8\x95\xa3\x6c\xc3\xad\x36\xf4\xb2\x8f\x4c\xf8\xa6\x39\x6d\xbd\x07\xbc\x51\x27\xb2\x64\x14\x86\x95\xb1\x7f\xa1\x2c\x56\xdc\x4d\xda\x5d\xbd\x3e\x10\xce\x24\x09\xd1\xf8\x03\x4b\xe4\x09\x01\x06\x34\x81\x12\x63\xa1\x58\x63\x42\x81\x52\xcf\x18\xfa\x93\xe4\xbf\xb8\x4d\x80\xab\x7f\xc0\xb5\x87\x5c\xc6\xbd\xe5\x30\xe5\x24\xfa\x5b\xc8\x0f\x60\x67\x53\x6b\xe3\x7a\x13\x24\x6e\xa9\x08\x3e\x5e\x64\xb3\xdc\x6b\x11\x0a\x77\x0a\x70\xd7\x1a\xd5\xd5\xd5\x96\xb3\xe8\xad\x55\x4d\x17\x52\x51\x09\x60\x11\x10\xbc\x73\x2e\xf9\x1a\xc9\xcc\x68\xd1\x00\x27\x8e\x34\x6b\xe0\xad\x46\xaa\x97\xe0\x76\x2d\x2c\x8d\x62\x37\x1b\x8c\x64\x6e\x11\x89\xcb\xb1\xe3\x50\xd2\x48\x47\x83\x4f\xd3\x70\x74\xed\xa0\x8b\x07\xcb\xb8\xd0\x81\xce\xc7\x41\x67\xd9\xa8\x65\xd8\x71\xa1\xa8\x4f\x5f\x72\xcc\x0d\x7f\x11\xd6\x23\xbb\x3d\xca\xc6\xa8\x14\x6f\xb4\xfd\x96\xd7\xe6\x44\xcf\x08\x12\xb4\xb0\xeb\x01\x8d\x90\x7a\xa4\x3a\x4e\xcb\xc5\x58\xeb\xe8\xa9\xc7\x4f\x70\xa4\x16\x84\xe3\x47\x63\x55\x21\x78\x88\x5c\xba\xcf\xb9\xc1\x02\x01\x6a\xa4\x52\xe4\x08\x9a\xc4\x11\xcb\x3b\xe9\xba\x41\xe1\x46\x06\x12\x66\xb5\x05\x69\x18\xe4\x3f\x3d\x42\x21\x82\x39\x8d\x65\x85\xd2\x54\x49\xbe\x34\x4f\x02\x05\xbc\x87\xce\x1a\x78\x4c\x14\x22\x20\x57\xe3\x49\xcf\x37\x28\x65\x9e\x9e\xf9\x8a\x38\x09\xcd\x8c\x6f\x8e\xe2\x41\x24\x61\x26\xe9\x54\x89\x6b\x90\x60\x4d\x51\x94\x96\x99\x51\xe2\x4d\xa7\x0e\x50\x90\x75\xb4\xe8\x21\xec\x06\xd7\x71\xd5\x74\x78\x81\xd4\x62\xa1\x85\x5e\x3a\xcb\xa2\xc1\xe6\x20\x15\xb5\x31\x65\x73\x2b\x89\x94\x7c\x51\xba\xa0\x28\xc6\xc0\xd3\x1b\xa4\x0a\x78\x31\x92\x83\xfa\x09\x10\x6d\xa8\x8b\x37\xb4\x1c\xeb\xda\x67\xdf\x27\x21\x58\xc0\xe2\x4f\x9c\x4b\xb8\x90\x1a\x1c\xf2\x18\xb5\xee\x00\xb3\x44\x98\x39\xa2\xde\x8f\x52\x0d\x06\x1f\x4d\xd2\x5a\xdd\xf1\x4c\xc9\xab\xbf\x93\xe4\x7c\xf5\xcb\x70\xef\xd7\xb0\x2e\xc5\xf6\x6f\x7d\xa3\x24\x39\x25\xed\xa3\xd7\x52\xa1\x1f\x25\x8a\xfa\x72\xc2\xca\x57\x79\xb4\x82\x1e\xa0\x75\x1f\xcd\x77\xde\xd4\x0f\xd5\x75\xad\xc6\xfd\x8e\x66\x28\x35\x87\xc9\x68\xe6\xa4\x16\xda\x15\x39\x3b\xd0\x65\xc7\x10\xaf\xce\x90\xc1\x7d\x41\x17\xd0\x83\xf7\xa6\x12\xf5\x0a\x37\xf6\x50\xd6\x07\x17\x93\x71\x09\x98\x1e\x99\x7f\x1b\x73\x5e\xb8\x12\x4c\xe1\x5f\x62\x28\xaf\xfd\xc2\xc2\x32\xc2\xc6\x13\xf5\x99\xb9\x28\xb6\xe7\xef\x82\x01\xc8\xfd\x70\x12\x06\xbf\x38\x83\x0b\x90\xcb\xc4\xa7\x7a\x99\x19\xc3\xba\x0f\x2f\x56\xc3\x10\x34\xd8\x25\xdf\xf2\x7f\x70\xba\xbb\x69\x23\x8c\x7b\xb7\x5a\x81\xe4\x0d\xec\x19\xd6\xc3\x55\x8c\x34\xcc\x59\x20\x11\x0d\x0a\xc4\x5a\xf0\x46\xf0\x38\x5c\x90\x27\x1e\x04\x45\xe8\xb7\x96\x7f\xe5\x9d\xb3\xf0\x28\x3b\x86\x62\xcb\x11\x2e\x1c\xef\xb7\x8e\x29\x08\xd3\xc0\xdb\x3a\xa9\x0c\x0b\x90\x93\x6d\x14\x83\x1e\x13\x08\x46\x27\xe2\x6a\x06\x94\xb0\x2e\x39\x9e\x39\xf5\x75\x67\x83\xab\x2a\xbb\x33\xe6\x24\x9e\x35\x43\xa1\x02\x6c\x1a\xe8\xb7\xa2\x73\x09\x8c\xc8\xd2\x1e\x98\x90\x6b\xb1\xd1\xa3\x67\x44\xe5\x71\xcd\xcb\xe8\x9a\xbe\xef\x15\xac\x1a\x2a\xfc\xd5\xf2\xfd\xd1\x03\x63\xe0\x0b\x2b\x69\x48\x3e\x0d\x2a\xaf\x86\x25\x15\xa4\x66\x31\x84\x00\xe6\x18\x4a\xa4\x89\x06\xc1\x7d\xe5\x22\x59\x24\x78\x62\xe1\x29\xf4\xf2\x35\xc9\xe2\x8b\x44\x7d\x3c\x5b\xf5\x61\x5a\xb4\xc6\xd5\x37\x72\xf2\xa0\x5b\x32\xe5\x39\x0a\x73\x13\x67\x8e\x15\xd7\x1c\xd5\xa9\x71\x0d\x09\x3b\x75\x6a\x1e\xe6\x66\xe4\x1c\x41\xd2\x8a\x72\x64\xcc\x5b\xec\x84\x42\x6b\xe2\x60\x9c\x53\x0c\xde\xc8\x7a\x64\x0b\x8c\x8d\x18\xe0\x96\x8b\xa4\x76\x37\xd5\x0c\x5e\x67\x8f\x29\x84\x40\x84\xe9\xc1\x13\xb9\x1e\x1a\x3b\xa3\xe1\x53\x69\x82\x1a\xdf\x18\x83\xda\x7b\x58\xae\x07\x06\x7b\x94\x02\x95\x63\xf0\x87\x40\x02\x01\xcb\x56\xe9\x01\xc8\xcf\x98\xf1\x59\x28\xc5\x26\x8d\xee\x6b\xc7\x7c\xfd\x55\xdc\x62\x93\x51\xc9\x04\x20\x80\xf0\xaf\xb9\xff\x21\xd1\xa6\x93\x0b\x98\x15\xe4\x75\x72\xf1\x84\x96\x30\x3d\xb7\x62\x72\x3a\x4c\x34\xc4\x76\x2d\x19\xe4\xc0\x35\x07\xf5\x46\x11\xe7\x34\x43\x5e\xca\xd4\x02\x92\xb2\xea\x41\x49\x5c\x1e\x9b\x93\x6a\x24\xf9\xc1\x17\x28\xdf\x3a\xb5\x96\x83\xc5\xfe\x5a\xfc\x74\xa4\xce\x38\xbd\x20\x87\x15\x5f\x1f\x14\x01\x40\xfb\x1f\x53\xf2\x24\xca\x9a\x03\x06\xa1\x3a\x91\x47\x42\x69\x37\x83\xef\x60\x1f\xde\x99\x74\x14\xd3\xfe\xa8\xd4\xb0\x52\xd4\x53\xd0\xd8\x84\x86\x19\xda\x92\x70\x0c\x90\x4a\x51\x4b\x03\x7b\xe1\x07\x9b\x31\xeb\x3e\x36\xa5\xf8\x82\x54\x05\x96\x76\xfd\x74\x02\xbd\x4d\xba\x3b\x46\xaa\xcf\xe2\x9c\x3e\x09\x90\x2e\x1a\x22\x72\xd8\xa0\x63\x43\x00\x24\x87\xdf\x76\x9b\x44\x56\xbd\xc2\xc8\xc4\xbb\xa8\x02\x8a\xac\x6c\xac\xde\xe3\xe9\x5e\xe4\x1e\x8f\xda\x73\x9d\xd8\xac\xa1\xb1\x43\x02\x8a\x51\x00\x79\x68\xad\x71\x71\x20\xb9\xff\xec\xa2\x9e\x05\x8b\x91\xb3\xb2\x12\xb0\xa5\x60\x17\xf8\x14\xd5\xa8\xd1\x97\xb4\xfa\xc0\x93\xeb\xb2\x4e\x51\x98\x76\x9c\x84\x9e\x54\x24\xd7\x9c\x9b\xd8\xb3\x50\x52\x34\x58\x1c\x47\x12\x11\x57\x23\xdf\xac\x25\x3d\xc8\xcf\x06\x74\x80\x0c\x22\x95\x1d\x19\x24\x1c\xf0\x05\xfb\x8a\x1b\x57\x7f\xf9\xd1\x14\x64\xa2\xac\x3b\xed\x3d\xc0\x6e\x01\xa1\xce\xf7\xe0\x7f\x36\x84\xf3\x7f\x0f\x85\xd1\x89\x8e\x1e\x88\xce\x51\x5a\xf7\xd7\x4e\x22\xb3\x9a\x4a\x36\x05\xd6\x65\x8b\xf5\x1e\xe5\xd6\x06\xaf\xc1\xab\x33\x11\x30\xb0\xf4\x51\x7a\xd1\xc6\xce\xbd\xb4\x73\xa6\xee\x56\x0c\x6e\xa8\x09\x5e\xf5\x92\xe6\x0b\xab\x7a\xec\xfe\x9c\x60\x57\xea\x23\x00\x9c\x9d\x17\x93\x0c\x14\xc6\xdd\x82\x58\xf0\x7d\x28\x87\xdc\xa5\x1c\xe1\xf5\x41\xe0\x47\x5c\xcd\xb3\x17\x75\x4b\xf3\x20\x08\x34\x97\x52\x44\x68\xd9\x83\xdf\x80\x8e\x89\x67\x19\x93\x20\x8b\x14\x18\x5a\x8a\x62\x65\x7e\xeb\x42\x4a\x17\xba\xe4\x9e\xc3\xf5\x67\x71\xa7\xd0\xff\x80\x9d\x44\xce\x63\xe3\xab\xe3\x71\x2a\x50\x32\x83\xd0\x67\xfa\xbd\x56\x4d\xcb\x6e\xc1\x76\x39\x39\xf9\x95\xc3\x72\x3b\x6a\xa8\x41\x1f\x41\xcc\x4c\xc9\xe5\xbd\xe3\x26\x2b\xa9\xe6\x67\x41\xab\xf5\x76\x71\xb2\x22\x5f\xf1\x8c\x86\x41\xf3\x13\xa8\x45\xae\xf2\x50\x20\xb9\x79\x69\x50\x13\xe2\x3b\xf1\x66\xf5\x0a\x64\x65\xce\xa5\xc7\x7e\x3c\xc7\x61\x8a\x83\xe2\xeb\x64\x09\x4b\x56\x20\xd7\x7c\x13\x80\xa4\x75\xf0\xdf\x48\x3d\xc7\x50\x09\x38\x38\x1f\x88\x04\xbb\xa7\x0b\x75\xeb\x73\x8f\xa2\xa8\x83\x18\x1e\xa0\xb4\x65\xd2\x9b\x1f\x97\xd4\xa2\x70\x66\x46\x4c\x8b\x6a\x47\x35\x54\xbd\x3f\xe8\x08\xb4\xd2\x09\xcc\xae\x1e\x0f\x77\x89\x58\x48\x04\xb8\x50\xc4\xc8\x0d\x24\x23\xb9\x30\x4a\xe6\xc7\xb9\x70\x1f\x1c\x63\xf8\xa0\xd3\x31\x93\x5c\x3c\x59\x10\xa2\xa1\x02\x02\x0e\x98\x9d\x27\xdb\x50\x59\x2b\x5a\xc3\x33\x55\x74\xf2\x80\x18\xcc\x17\xcd\x13\xd0\x31\x4e\x00\x05\x02\xd3\x3a\x12\x78\x85\x66\x1f\x79\x51\x73\xa4\xfd\x27\x4d\x70\xa4\xaa\x54\xee\xd0\x45\x46\xec\xa1\x6f\xe8\x9d\x85\x4c\x9a\x41\xb3\x80\xf7\xb8\xff\x91\xa7\x8a\xd0\x9e\xae\xe7\xb4\x00\x59\x59\x31\x4e\x53\x16\xc0\x30\xb0\x0c\x48\xc1\x2c\x81\x36\xe2\x70\x7f\x60\x49\x08\x5b\xc6\x69\x09\x92\x25\xde\x50\x0c\xc3\xab\x66\xb5\x99\x60\x60\x0d\xbd\xa2\x90\x87\x99\xb0\x45\x1f\x67\x66\x7c\xee\x87\x77\xe1\x86\x41\x6e\x16\x8b\xe7\x3d\xb1\x9d\x15\x52\xa9\xc8\x24\x15\xb9\x56\x96\x2b\x4b\xc1\x07\xd4\x67\xa8\x92\x8b\x4d\x8c\xc3\x35\xb6\xb6\x7d\x60\x92\x89\x87\x49\xa1\x3c\x7b\x9e\x47\xb9\x52\x57\x2b\x9e\x6a\x73\x78\x38\x29\xdd\xe6\x64\x0d\xa1\x19\x4d\xf7\xe8\xa8\x28\x73\xa3\xeb\x4d\xca\xc8\xa8\xc0\x03\x6b\x50\xfd\x03\x58\x1a\x43\x73\xfd\xbc\x10\xd4\x92\x79\xce\x7a\x70\xb6\x7b\xff\x03\xaa\x6d\x5b\x50\x3b\x1f\x87\x4b\x28\xd3\x08\x5e\x02\x08\xe5\x82\x1d\x00\x9c\xbc\x44\xf1\xb1\x60\x57\x61\x6e\xb2\x6c\x7a\x17\x4c\x2b\x30\x91\xab\x1e\xe1\x92\x96\xb9\x61\x47\xc0\xd1\x7c\x59\x32\x73\x45\x49\xf5\x08\x4c\xde\x72\x89\x7f\xa7\x62\xf5\x6e\x30\x3e\x54\x3a\xd0\xbc\x5e\xb7\xeb\x35\x16\x33\x0d\x8c\x63\xf1\xa2\x51\xda\x8c\xb9\xbb\x9a\xff\x92\x9e\x37\x0f\xeb\xa0\x1f\x1c\xb5\x3b\x75\x5d\x1f\x31\x97\x93\x79\x04\xfb\x91\xed\x03\xab\xe2\x74\xdf\xb6\xd9\xe7\x95\x24\xac\x9a\xa8\x0e\x8d\x59\x2a\x02\xe5\x9b\x6d\xe9\x69\x8f\x11\xe7\xd2\xc0\xaf\x41\xd6\xc6\xea\x2d\x21\xd6\xa4\x50\x96\x12\x3c\x2f\xb8\x25\x8f\x2f\x9f\xaa\x34\xe9\xdf\x94\x7e\xc1\xe6\xc6\x1e\x63\x1f\x98\xc5\x7a\xf0\x0e\x7a\x64\x8e\xcb\xc3\x41\x48\x17\x21\x27\x91\xb1\x1e\x02\x79\xc2\x15\x2b\x59\x28\x09\xa4\xda\xd0\xbc\x62\x36\x44\xcc\xb4\x3e\x5c\x15\x8f\x1c\xc3\x7d\x42\xc9\x11\xb5\x48\xbc\x7a\x35\x35\x37\xb4\xb7\xd3\x61\x66\x35\x87\x05\x9b\x76\xa2\xc5\x17\x03\xc3\x10\x99\xc9\x87\x58\xa9\xdc\x7d\xcc\xdf\x48\x35\x72\x34\xf2\x2c\x19\x4d\xa2\x3f\xc3\x8b\xd4\x58\x35\x0d\xed\x43\xd4\xa9\xec\xa7\xdd\x85\x12\x7f\xad\x0f\x10\x28\x81\x0b\x63\xa0\xfd\x54\x37\xe9\x8d\x48\x9e\x0b\x63\x57\x62\x7c\x4b\xb2\x08\x85\x5a\xf2\x67\x0c\xbe\xdb\x22\x9a\xfd\x50\xc5\x01\x65\xbf\x70\x16\x4a\x85\x2a\x4c\x5c\xe1\x0c\x4a\x31\x67\x90\xc3\x80\xf9\xd8\xda\xd4\xbf\x66\xaa\x1b\x50\x36\x50\x66\x2e\xba\x6a\xb2\xa9\xc1\x64\xab\xd1\x2c\x08\x0d\xc9\x87\xb5\xc3\xeb\x21\x55\x50\xb0\x8f\xdb\x74\x75\x54\xc0\x00\x25\x9c\x77\x11\x25\xaf\x99\x61\x39\xea\x31\x90\x28\x01\x34\x66\x13\x29\xcf\x8f\xf5\x95\x8e\xec\xcd\x9c\x1c\x47\x4a\xe9\x3c\x61\x72\x48\x26\xb7\xd8\x54\x93\x30\x62\x24\x14\x35\xf8\xb8\xa8\xdc\x90\xd3\xbe\x6b\xea\xa1\xa2\xb9\x3a\x88\x33\x8e\xc2\x39\x7a\xc4\x97\x8c\x26\x31\x80\xe1\x00\x2e\xb1\x1b\x62\x90\x23\x6b\x2b\xa7\x70\x85\xef\x7b\xc7\x59\x7a\x6d\x55\xe0\xe4\x26\x2f\x6b\x5e\xf0\x74\x96\xc4\x9d\x4e\x3b\xc7\x23\x0a\x3c\x42\x80\x99\x4e\x87\xcb\xb8\x16\x0a\x2f\x52\xd8\x3b\xe2\x6d\x66\xec\x30\x60\x84\x87\x21\x3c\x63\x81\xf0\xee\x7a\xec\x23\x54\x81\xb1\x29\x0d\xba\x60\x29\x34\x0b\x0e\x3e\x93\xe8\x27\x0a\x28\x4d\xd2\x23\xb2\x70\xa8\xf7\x1a\xf7\x30\xf0\xa8\x95\x80\x13\xa7\xbe\xcb\x8e\x03\x6a\xd2\x28\x85\x89\xf9\x46\xfc\x13\x9e\x59\x4a\x75\x3f\x34\xc1\x81\x7c\x57\x5a\xfd\xd4\x4f\x34\xab\xfd\xca\x43\x93\x97\xe6\x9e\x47\xef\xd0\x7e\x8f\xb6\xce\xb9\xbd\x90\x6a\x4c\x4d\x2f\x51\x7a\x7e\x24\x1e\x68\x78\x06\x32\xa6\x31\x13\xba\xe5\x89\x54\x68\x0f\xef\x8f\x82\x73\x6c\x4e\xf8\xa1\x8b\x32\xed\x9b\x0b\xba\x8f\x9c\xf6\xe8\xb9\xe2\x66\x6a\x5a\xf7\xb0\xb6\x68\x60\xa9\xe2\xdc\x0e\x00\x99\xec\xd2\x8a\x4d\xed\xfa\x00\xd0\x50\x32\xf4\x4d\xfb\x40\x87\x13\xa4\x05\xba\x1c\xc1\xf7\xf3\xae\x89\x96\xb1\x4c\x51\x7b\x73\x8b\x6f\x37\xda\x84\x01\x85\x61\x08\xaf\xdf\x64\xd0\x04\xe0\xd5\x32\x65\xf8\xd3\x71\xbd\x3e\x7c\xa0\x49\x4d\x8c\x76\x46\x85\xa6\xda\xf2\x74\xe4\xac\x70\x06\x0c\x23\x36\x61\xf3\x50\x16\x8a\x79\xb9\x07\xf6\x2f\x2c\x4e\x9f\x64\x57\x84\x4a\x41\x04\x45\xd1\xd0\x6e\xbe\xa2\x84\x1c\xd8\x07\x2e\x5d\x1c\x61\xf1\xc3\xb1\x4e\x7f\xf6\x3b\x64\xff\x96\x2c\x22\x29\x40\x29\xfc\x22\x06\xe2\xa4\x8a\xdd\x23\xef\xfb\x84\x1a\xfa\xa9\x99\xfc\x73\x48\x2c\x3a\x18\xcf\x47\x5d\x24\x21\xe2\xa7\xc1\x18\x9e\x17\x8a\x1a\x41\x3d\xfc\x21\x69\xc9\xe8\x8d\xb8\x3c\xf8\x20\x5e\xcd\x56\x4e\xcb\x16\x97\xc6\x53\x18\x2e\xee\x84\x1b\x6b\x16\x1c\xbc\xc9\x6a\xc7\xbb\xa5\x71\xa9\x45\x89\xfd\x89\xa0\x5f\xb8\x5c\x9a\xed\x14\x9f\xab\x94\x05\x4c\x3a\x7c\x9f\x0d\x57\x26\x87\xaa\xb4\x8f\x36\x14\x41\x10\xcf\xe1\x48\xe9\xd6\xf5\x39\xd7\x41\xb1\x8d\x0c\x87\xac\x6d\x32\x7a\x13\x75\x6a\x95\x16\xb2\x21\xbb\xf0\x35\xb3\x5c\x8b\xfb\xd1\x23\x2f\x98\xbc\x34\x2c\xd9\xec\xd5\xaf\x82\x27\xc4\xdd\xcd\x0e\xb8\x9c\x9a\xa9\x49\xb1\x8d\xc9\x20\xb2\x06\xe2\x5a\x5c\x2a\x45\x45\x2f\x65\xf4\x42\xd4\x28\xf3\xc3\x6c\xb4\xb6\xd6\xc3\xe6\x55\x85\xcf\x4e\xe0\x59\x75\x9c\x5c\xec\x16\x1d\xb8\xcd\xf5\x18\x63\x20\x0e\x18\x7c\xd4\x06\x89\x37\xcd\x84\x2c\x31\x9d\x74\x62\xc0\x18\x49\x50\x78\x9b\x52\xc8\xbe\xc1\x9e\x0c\xd4\xd9\x70\x4b\xd8\x68\x82\x93\x2f\xda\x92\x94\x49\xd3\xee\xa9\xcd\x73\x6c\x08\x5b\x94\x70\x73\x70\xb6\xa8\x72\x87\x8b\xb0\x33\x3f\x69\xc4\x0d\x7d\x95\x4c\xca\x94\x7d\x91\x4f\xe8\xf9\x67\x8b\x20\xb8\x12\x83\xd2\xa0\xc8\xc9\xf1\xe5\x3f\x49\x01\xe8\x71\x9f\x23\x0c\x32\x0a\x33\x92\x0e\x92\x44\x92\x47\x6a\xad\xd7\x50\xd4\x57\x1e\xd3\xa6\xcf\xe6\x45\x25\x8c\x9a\xd4\x13\x7c\x2c\xd1\x6a\x94\xaa\xcd\xd0\xd7\x47\x61\x30\xfd\x88\x02\xc3\x17\x4a\x3e\x48\xff\xed\xf2\xbd\x96\x10\x26\x39\x02\xd8\x21\x19\x8c\x20\x95\x48\x1a\x38\x95\x29\x74\x7b\x2e\x81\x8f\x25\x4a\x60\x83\x78\xbf\xe1\xda\x6c\x92\x65\x3a\x16\x7b\xc0\x12\xe8\x90\xb0\x10\xd1\x30\xdc\x01\x79\x69\x44\x35\xa3\xb6\x9e\x98\x7a\x86\xf4\x45\xa3\x2f\x0f\x45\x42\xda\x9a\x96\xac\xed\xab\x56\xa5\x78\xe6\x94\xcb\xd6\x4a\x2b\x9f\x73\x10\xcf\xbc\x71\x3a\xf1\xf7\x8c\xf5\x06\x66\x16\x00\x0e\xee\xf1\x63\x6d\x5c\x8c\x6d\xed\xf9\x53\x6a\xca\x9d\xd8\x1c\xda\x72\xec\x54\x1c\x72\xfb\xd0\x21\xf7\x4a\x76\x04\x61\xb3\x14\x0d\x28\xb8\xfb\x41\xe8\x33\x92\x69\xbe\x93\x32\xc5\x09\x0e\xaa\x17\xb2\xcd\x42\x30\xfd\xa7\xff\x30\xef\xf3\x16\x6e\x0b\xbf\x1e\xc4\xf5\x3d\x9b\x52\x67\x96\x46\x9e\xa0\xaf\x6d\xa3\xa9\x65\x6d\xef\xf3\x75\xe2\x39\xc7\xe5\x32\x34\xca\x06\xe3\x5d\xb6\x08\x93\xbf\xc2\x67\x2b\xd6\x3e\x1c\x93\x8c\xa8\x96\xca\x84\x7d\x64\x17\x2f\x6d\x5a\xae\x18\xa2\xe9\x51\xce\x52\x8f\x49\x13\xcd\x5e\xfd\x34\x35\x57\x8d\xb9\xeb\xc1\xb8\xa0\x07\xe1\xae\xaf\x71\x3d\xf7\x03\x7d\x1a\xa9\x68\xb6\x6c\xb4\x0d\x46\xca\x71\x24\xa2\x90\x89\x58\xe6\x54\xbd\x41\x1a\x9a\xd6\xd3\x48\x12\xce\x4f\xc4\x26\xa3\x07\xf4\x2c\x5c\x5e\x0b\x26\xd1\xca\xd7\xbf\xeb\x16\x63\x19\xb4\xbd\x7a\x71\x80\xc4\x5e\xc4\xb0\x8f\xff\x1c\x7f\x57\x73\x07\x18\xec\x39\x2e\x61\xd0\x84\x72\x71\xa3\x96\x2b\xb7\x7d\xd5\xe5\xb5\xe5\x41\x38\x5c\x20\x77\x30\x09\x6a\x74\x5c\x87\xf6\x5f\x61\x3c\x82\x4e\x1e\x5e\x13\xa5\x72\xe0\x5b\x6a\xc8\xe5\x24\x82\x10\x84\x7b\x4e\x23\x39\x06\x01\x21\x15\x86\x88\x59\x12\x49\x21\xb1\xad\x7d\x6a\x5a\xce\xb6\x42\xf7\x1d\xe7\x7a\xa8\xdf\x46\x1c\xe7\xbb\x15\xbd\x4c\x8a\x98\x15\xde\x02\xc9\xb2\x8d\x8d\xf4\x41\xfd\xa3\xb4\x82\xc8\x47\x96\x24\xdc\xa7\x68\x5b\x36\x64\xf3\x35\xc9\xd7\x10\xd2\x62\x32\xf5\xb7\x29\x81\xb0\x6e\x91\x7b\xb9\x24\x52\x4b\xc4\x52\x59\x19\x66\xe8\xbc\xfa\x19\xdb\xf9\xb6\x0d\x9c\xef\x4a\x2c\xec\x45\x98\x1f\xfe\x1a\x0b\xab\x83\xcd\x79\xfc\xa3\x28\xff\x6a\x51\x9e\xe0\x3d\x2a\x3b\xf4\x48\x21\xea\x38\x68\x0e\xe1\xca\x85\x68\x16\x38\xfb\xb6\xfe\xab\x38\x61\x62\x46\x34\xd1\xbe\xa5\x03\x56\x7b\x73\x7c\x04\x3a\x95\xfb\xd1\x96\xba\x93\x6f\xbd\x24\x4f\x2d\x1a\xaa\x7e\x46\x31\x69\xfa\x91\x3f\xc9\x15\x65\x6d\x9e\x73\xa0\x92\xd5\x97\x9a\xdd\x8f\x1a\x71\x9f\x6b\x9d\xfd\x76\x2b\x74\xf0\x9f\xc8\xd8\xf3\x03\xaa\x9b\xd6\xb7\x80\xef\xc3\x78\x2e\x69\x1e\xcd\xfd\xdc\x0a\xdf\xa9\x2d\x9f\x22\xe2\x16\xe7\x51\x58\x58\x0c\xc7\x03\x6a\x8f\xb7\xb6\x4b\xc2\xd5\x44\xbd\xeb\xa3\x1f\xd2\x38\xf2\xc5\x93\x60\x6c\xf8\x2f\x0b\x15\x89\xd9\x9d\x86\x1b\x7c\xa0\xe1\x5f\xa5\x47\x6f\xfc\x0f\x47\xce\xd4\x5f\x44\x57\xe2\x20\x92\x83\xcc\x98\xda\x49\x63\xdf\xd5\xf8\x2b\xc7\x95\x56\x42\xf1\x19\xc2\xd8\x93\x30\xe0\x36\x19\x70\x91\x7e\x9c\x82\x23\x9e\xc7\xaa\x4d\xab\x2a\x69\xd5\x48\x06\x7c\x50\x0d\x98\xef\x9e\x3c\x54\xfb\x5a\x65\x1d\x8e\xea\xfb\x2b\xc8\xb2\xf5\xd3\x59\xc8\x3a\xa7\xee\xde\xb8\x58\xea\x2f\x60\x00\x25\xd2\xdf\x50\x22\xc1\x05\xc1\xcb\x1f\x93\x4f\x56\x25\xc1\x36\x3c\xeb\xb1\xef\x0c\x72\xc1\xb2\x0c\x55\x6b\x65\x2d\xf9\xec\x56\xf4\xa1\x1a\x17\xc3\xf3\xfc\x97\x77\x58\x98\x63\x4a\x10\x51\x06\xff\x8f\x03\x1b\x01\x03\xc9\x6a\x74\x7e\x0c\x1d\xc8\x08\x42\xec\x66\xd8\x95\x6d\xe9\x09\x55\x5b\xff\x92\x30\x2a\xc2\xca\x35\xa4\xf8\x42\x81\x0d\x42\xf4\x45\x2a\xf9\xe0\x0a\x6d\x01\x14\x0b\x56\xc6\x56\xec\x35\x50\x6e\x6d\xed\x13\x95\x8a\x5d\x2c\xcd\xa3\xf9\xae\x64\x97\x22\x55\xf4\x70\x7c\x24\x0e\x7d\xa2\xee\x71\x54\xe2\x41\x71\xa0\xd6\xfa\xaa\x9b\xe1\x6b\xc3\xf9\xf9\xb4\x33\xef\xfb\xd0\x35\xd1\xb2\x4a\xcc\xf2\x87\xcf\xa3\x90\xc1\x24\x56\x57\x97\xa5\x9f\xb9\x93\x42\x79\x14\x4d\x51\xf4\xf0\xc8\xf7\x7f\x24\x98\xa3\xb5\x77\x87\x80\xf2\x07\x2c\x86\x10\xa4\x1f\x4f\xea\x9e\xa1\xa0\x03\x24\x85\x32\x3d\xc2\x16\xda\x3a\x29\x5a\xbf\x1b\x39\x21\xfb\xb4\xda\x34\x9a\xf8\xd2\xb5\x28\xbe\xf9\xfd\x50\x92\x15\xf9\xec\x5d\x02\xe5\x7c\xdd\xf3\x67\xf5\xe0\x97\x42\x3f\x59\xb7\xee\x69\x14\xd3\x5f\x67\x04\x5c\x49\x1a\x34\xb4\x6f\x03\x77\xf8\x41\x7b\x80\xd2\x72\xc1\x34\x45\x1f\x50\x16\x57\x93\x44\x09\x20\xb5\xb0\x18\x2f\xb4\xba\xbe\xa1\xa1\xa5\x60\xb9\x5c\xd2\xcd\xaa\x69\xef\x4f\x82\x88\x7d\x90\xc0\x5c\x5c\xaa\xd8\xb4\x51\xa5\x76\xdc\xdd\x11\x17\x4f\x24\x2f\x44\x86\xe9\xc0\x3a\xa7\x36\x0e\xae\x7d\x6f\x46\x2a\xa4\xc8\x12\x95\x6f\xcc\xa9\xde\xa7\x33\x49\x5d\x36\x13\x38\xa5\xf1\x22\xe2\x44\xd1\xf7\xf7\xa9\xef\x03\x60\x8a\xfa\x24\x9d\x00\x28\xf0\xde\xcd\x6f\xe7\x66\x71\x67\xae\xae\xcd\xa7\xd9\xed\xed\xec\xea\xfe\xb3\x79\x7b\x7d\x6b\xe0\x07\x73\x73\x7b\xfd\xe7\xed\xec\x7d\x66\xee\xaf\xe9\xdf\xf3\xff\xba\x9f\x5f\xdd\x9b\x9b\xf9\xed\xfb\xc5\xfd\xfd\xfc\xc2\xbc\xf9\x6c\x66\x37\x37\x97\x8b\xf3\xd9\x9b\xcb\xb9\xb9\x9c\x7d\x9a\xc2\x33\xe7\xf3\x9b\x7b\xf3\xe9\xdd\xfc\xca\x5c\xe3\xea\x9f\x16\x77\x73\x73\x77\x3f\xc3\xe7\x17\x57\xe6\xd3\xed\xe2\x7e\x71\xf5\x27\xad\x77\x7e\x7d\xf3\xf9\x76\xf1\xe7\xbb\x7b\xf3\xee\xfa\xf2\x62\x7e\x4b\x1f\xd2\x7a\x09\x9b\xd3\x8b\xe6\x66\x76\x7b\xbf\x98\xdf\x21\x18\x1f\x17\x17\xf3\x18\x24\x33\x99\xdd\x01\xd4\x13\xf3\x69\x71\xff\xee\xfa\xc3\x7d\x80\xfd\xfa\x2d\x2c\xf2\xd9\xfc\x73\x71\x75\x91\x99\xf9\x82\x16\x9a\xff\xd7\xcd\xed\xfc\xee\x0e\x00\x80\xb5\x17\xef\x01\xe0\x39\xfc\xb8\xb8\x3a\xbf\xfc\x70\x01\xb0\x64\xe6\x0d\xac\x70\x75\x7d\x6f\x2e\x17\x70\x30\x78\xec\xfe\x3a\xa3\xdd\xe4\x59\x5d\x1d\x81\x81\xf5\xdf\xcf\x6f\xcf\xdf\xc1\x3f\x67\x6f\x16\x97\x0b\xd8\x12\xbf\xfe\xf5\x76\x71\x7f\x05\x5b\x10\xea\x66\x0c\xf9\xf9\x87\xcb\x19\x1c\xe2\xc3\xed\xcd\xf5\xdd\x7c\xca\x08\x84\x35\x00\xdd\xb7\x8b\xbb\x7f\x1a\x38\x80\xa0\xf5\x3f\x3f\xcc\xfc\x3a\x80\x5b\x58\xe2\xfd\xec\xea\x7c\x8e\x5b\xc5\x47\x86\x4b\xc2\xd3\x9a\xcf\xd7\x1f\x40\x4f\xc0\xa9\x2f\x2f\x92\xdf\x11\x4d\x73\x73\x31\x7f\x3b\x3f\xbf\x5f\x7c\x9c\x67\xf8\x20\xec\x72\xf7\xe1\xfd\x5c\xb0\x7d\x77\x4f\xe8\xb9\xbc\x34\x57\xf3\x73\x80\x76\x76\xfb\xd9\xdc\xcd\x6f\x3f\x2e\xce\x09\x0b\xb7\xf3\x9b\xd9\xe2\x16\x71\x74\x7e\x7d\x7b\x8b\xab\x5c\x5f\x21\xfd\xfc\x32\xe5\x16\x03\x9f\x44\xbb\xd4\xba\x76\x14\x15\x57\x48\x3a\xf3\x8f\x48\x18\x1f\xae\x2e\x11\x07\xb7\xf3\xff\xfc\x00\xc7\x1c\x21\x0f\x5c\x7b\xf6\xe7\xed\x9c\x50\x1c\x53\xc3\xa7\x05\x00\x85\xf7\x36\x24\x89\x8c\x5e\x81\x1f\x02\x49\x7c\x06\xe2\xba\x36\xef\xaf\x2f\x16\x6f\xf1\x42\x84\x64\xce\xaf\xaf\x3e\xce\x3f\xdf\x25\x18\x01\x14\x07\x5a\x9d\xbd\xb9\x46\xa4\xbc\x01\x40\x16\x04\x0f\x40\x80\x18\xc2\x1b\xbb\x98\xbd\x9f\xfd\x39\xbf\x8b\x68\x82\xf6\x94\x0f\x17\x67\xe6\xee\x66\x7e\xbe\xc0\xff\x80\xdf\x81\x12\xe1\xea\x2f\x19\x4d\x57\x77\x70\x56\xbc\x55\xf8\x83\x2c\x62\x66\x70\xbd\xb8\x02\x92\xa5\x5c\xe1\x07\x60\x01\x24\xbd\x2b\x25\x19\xd8\x1b\xff\x16\x03\x7b\x1a\xf6\x3e\x24\x47\x73\x79\x7d\x47\xb4\x77\x31\xbb\x9f\x19\x82\x18\xfe\xff\xcd\x1c\x9f\xbe\x9d\x5f\x01\xa2\x88\xbb\x66\xe7\xe7\x1f\x6e\x81\xd3\xf0\x09\x7c\x03\xa0\xb9\xfb\x00\xbc\xb7\xb8\xe2\xdb\xc0\xf3\x12\x6f\x2f\x6e\x2f\x3c\x7b\x11\xc5\xbe\x9d\x2d\x2e\x3f\xdc\x1e\xd0\x1c\xec\x7c\x0d\x28\xc4\x25\x89\xf6\xa2\x9b\xe0\x27\xee\xce\x32\xba\x7c\xb3\x78\x0b\x5b\x9d\xbf\x93\x6b\x33\x09\x13\x7f\x36\xef\xe0\x2a\xde\xcc\xe1\xb1\xd9\xc5\xc7\x05\x31\xa2\xec\x03\x40\x2e\x04\x27\xd7\xb2\x82\xe0\x11\x29\xef\x1f\x53\xf6\x1b\xf1\x63\x1e\x9e\xfa\xee\x0e\x5a\x91\x82\xc6\x2a\x12\x39\xe7\x3b\x9e\xe8\xd3\x99\x09\x09\x87\xd6\x0c\x5f\x0e\xcd\x15\xd9\x12\x7b\x58\x5a\xb1\x7b\xaa\x06\x27\x56\x70\x93\x12\x0f\x4b\x96\x2a\x78\x11\xbb\x1d\xf5\xc1\x49\x29\x39\x5a\x85\xf6\x89\x9d\x9f\x9e\xbc\x3c\x72\x6a\xd8\x2c\x96\x95\xf2\x27\x89\x07\xe1\xb4\xab\x55\xd5\x70\x63\x2f\x36\x31\x7d\xa5\xef\x3b\xf0\x67\xa6\x96\xae\xa9\x70\x0e\x02\xcd\x82\x66\xbb\x03\x6d\xed\xf2\xb1\xac\x22\xd8\x47\xa2\x71\x89\xb7\xab\x75\xc7\x49\xef\x57\x68\x3a\x49\x11\x11\x3a\xd7\x87\x35\x48\xbe\x0a\x02\x5b\x95\x40\xc5\xa7\xf3\x6a\x81\xfc\xe8\x3a\x47\xbf\x84\xf8\x8e\xbf\x31\x35\x23\x0c\x70\xa1\xdf\xbd\xf6\x17\x7c\x46\x15\x76\x05\x86\xa8\xac\xef\x7c\xce\x51\xbe\x34\x64\x72\xb5\x53\xc3\x47\x15\xf6\xe1\xcb\xc1\x92\x53\x13\x20\x1f\xa8\x33\x15\xfd\xf8\x46\x32\x76\xbd\x3b\xf8\xc4\x1a\xe7\xd2\x5c\xc7\x83\xa2\xb0\x9a\x73\x43\x39\x18\x5f\x14\x2c\x79\x54\x9a\x87\x1b\x7f\x56\x96\x0d\x1c\xab\x1f\x14\xe7\x2f\x5d\xa4\x9f\xdf\xd5\x4f\x17\xfb\x8c\xa4\x0b\x5d\x07\xf7\x52\x3a\x98\x61\x71\x7d\x2e\x11\xe4\x60\x92\x6a\xf7\x9b\xb7\xe8\xa5\x4c\x74\x41\xae\x90\xcb\xd7\x08\x32\x82\xeb\x5f\xde\xea\xb3\x60\x19\x71\xab\x0d\x95\x98\x45\x6d\x16\xfc\x0d\x19\xcc\x51\xea\x64\x75\x9c\x0a\xd2\x69\xea\x5d\x8a\x06\x98\x08\xd2\x29\xca\xb4\x12\x2d\xe1\x36\x14\x02\xe2\x0c\x5d\x18\x8f\x67\xb1\x18\xc2\x7f\x81\xb2\x62\xdf\x15\x3f\x5e\xb8\x6b\x28\xa2\xc1\xa1\x29\x1d\x67\xb4\xee\xfd\xac\x5a\x3c\xcd\x1a\x0d\x4d\x40\xc9\xef\x88\x47\x7a\x57\x07\xe1\x45\x47\x07\xcb\x0f\x1b\xc6\x64\xd9\x65\x5b\xda\x35\x26\xdb\x72\x1e\xa7\x92\xfb\x39\xac\xd3\x3f\xcc\xe0\x53\xf1\xbf\xe3\xdc\xbe\x3f\xcc\xef\xf4\x7a\xa3\xcd\x96\x7f\xa0\x6b\x57\x3a\x5d\x9e\xe0\x88\xef\xf7\x37\xff\x9d\xe8\xe4\x56\xcb\xce\xa4\xdf\x55\x3e\x29\xbb\xf1\x8c\xf3\xf7\x58\xb9\xb9\x4b\x8d\xf0\x93\xe7\xac\xf0\x4c\xdd\x91\x03\x3f\xf7\x32\xea\x2f\x39\x39\x4d\x5b\x82\xcf\x0e\xdd\x93\xe9\xe1\xd1\xc3\x09\x7d\x47\xcb\x06\xf3\x4f\xda\x8f\xa5\x2e\x27\x30\x10\x5c\x5e\x66\x4e\xd0\xa3\x54\x4b\x0b\x55\x80\x5a\x5b\xaf\xe3\xef\x0c\xf3\x42\x1a\x1d\x0f\x12\x67\x6d\x4e\x86\x16\x13\x40\xfe\x6d\x83\xe9\xce\x32\x49\x9c\x7c\x87\x23\xad\x09\x2e\x76\x74\xb5\x16\x30\x26\x5f\x5f\xcd\x9e\x8a\xb6\x6f\xaf\x7d\x92\x4c\x78\x0b\x88\x24\x67\x0e\xc8\x1a\xcb\x61\xac\xf9\x7d\xd3\x75\xbb\xdf\x5e\xbe\x7c\x7a\x7a\x9a\x3e\xd4\xfd\xb4\x69\x1f\x5e\x6a\x05\xd0\xcb\x3f\xa8\x5b\xcf\x91\x23\x90\xcc\x99\xc1\x89\x2e\x2c\x20\x29\x3b\xc2\x1f\x17\xa7\x51\xfc\x18\x0c\x6e\x9b\x1a\x87\x76\x61\xd5\x4c\xbe\xc3\x5a\x26\x38\x9a\xaf\xcb\x88\xa6\x2d\xae\xf2\xf0\xe1\x44\x86\x93\x83\x96\xdf\x11\xa0\x64\xb7\x51\xf0\xc4\x43\xba\xd3\x8f\xc6\x97\x9d\x2a\x48\x56\x23\x7e\x40\x0c\xcf\x74\xe2\x92\x4c\x9d\x65\x3f\x1a\xfe\x6e\x63\xca\x83\x25\xec\x52\x53\x1c\x4c\xe6\x65\x17\x7f\xab\x89\x63\xd4\x3a\x7d\x38\x37\x13\xfd\x38\x17\x05\xcb\xb8\x27\xce\xe6\x85\x0b\x20\x50\x6e\x11\xc4\xf8\x63\x94\xcb\x2f\xb4\x22\x9c\x3f\xaa\xc3\x83\xe2\xf7\x2e\x8a\x82\xcb\xe8\x4e\x19\x20\x47\x1f\x6f\x0a\xd3\xf4\x50\xf5\x26\xb1\x97\xa5\xed\x3a\xa9\x75\x8a\xdc\x3d\xd1\x5a\xaf\x89\x00\x7c\xaf\xc1\xcf\xa1\x25\x41\x13\x63\x83\x21\x72\x9f\x07\x28\x47\x24\x12\xa2\x2c\xe0\xad\xd9\x63\x3d\x89\x7e\x22\xdf\x7f\x01\x41\xbf\xd7\x67\xdb\x33\x2a\xa5\x43\xcf\xaf\x22\x14\xc3\xe1\x28\xf1\x88\x03\x9f\x78\xda\x99\x8a\xc3\x60\x0c\x4d\x42\x11\x45\xf4\x79\xf6\xf0\xa5\x0f\xba\x37\xae\x68\x48\xa9\x13\x09\x3e\xf9\x58\x24\x9b\x32\xd4\x9e\xc4\xfe\xa6\x67\x22\xfa\x94\xf3\xf7\xb0\xc2\xff\x0b\x00\x00\xff\xff\x39\x27\x4c\x28\x1a\x84\x00\x00") - -func confLicenseGnuAfferoGeneralPublicLicenseV30Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuAfferoGeneralPublicLicenseV30, - "conf/license/GNU Affero General Public License v3.0", - ) -} - -func confLicenseGnuAfferoGeneralPublicLicenseV30() (*asset, error) { - bytes, err := confLicenseGnuAfferoGeneralPublicLicenseV30Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU Affero General Public License v3.0", size: 33818, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuFreeDocumentationLicenseV11 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x7c\x5d\x77\xdb\x38\x92\xf6\xbd\x7e\x05\x8e\x6e\xc6\x39\x87\x51\x27\xdd\x33\xef\xbb\x9b\xbe\x72\x62\x3b\xd1\x8e\xed\x64\x6d\x67\x7a\xfa\x92\x22\x21\x0b\x1d\x8a\xd4\xf2\xc3\x8a\xf6\xd7\x6f\x3d\x55\x05\x10\xfc\xb0\xd3\xb3\x67\x6f\xe2\x58\x02\x81\x42\xa1\xea\xa9\xa7\x0a\x45\x7f\xbc\xfd\x6a\xae\x6a\x6b\xcd\x45\x95\x75\x7b\x5b\xb6\x69\xeb\xaa\xd2\x5c\xbb\xcc\x96\x8d\x35\x8b\x7f\xd8\xba\xc1\x07\x6f\x57\x6f\x13\x73\x93\xd6\xd9\xce\xfc\xfc\xe6\xcd\x9b\xc5\x87\xea\x70\xaa\xdd\xe3\xae\x35\x67\x1f\x5e\xf1\x47\x32\xcd\x7d\xb5\x6d\x8f\x69\x6d\xcd\x55\xd5\x95\x39\x4f\x96\x98\x75\x99\xad\xcc\xdf\xde\xd2\x88\xb4\xfc\x56\xb8\xd2\xdc\xb7\x89\xb9\x72\xdb\x76\x67\xae\x8a\xaa\xaa\x13\xf3\xbe\x6a\x5a\x8c\xbc\x39\x37\x6f\x7e\x7e\xfb\xf6\xcd\xeb\xb7\xbf\xbc\x79\x6b\xbe\xde\x9f\x2f\x16\x97\x4f\xb6\x3e\x55\xa5\x35\xae\x31\x07\x5b\xef\x5d\xdb\xda\xdc\xb4\x95\xc9\x48\x04\x93\x96\xb9\xc9\x5d\xd3\xd6\x6e\xd3\xb5\xd6\xd0\xd8\x0d\x2d\xba\xc7\x97\xce\x36\xa6\xda\x9a\x76\x47\x0f\x16\xba\x9f\x5c\x77\x99\x18\x1a\x6e\xb2\x5d\x5a\x3e\xba\xf2\xd1\xb8\x16\xb3\x97\x55\x6b\xd2\xa2\xa8\x8e\x36\x5f\x2d\x16\x6f\x56\xe6\xcb\xdd\xe5\xf9\xcd\xfb\xeb\xcb\xc5\xe2\x61\x67\xcd\xa1\xab\x0f\x15\xcd\xe1\xe7\xf4\x3a\xa2\xff\x92\x34\xfb\xf4\x9b\x35\x29\xfd\x28\xbb\xb4\x48\x4c\x6b\xbf\xb7\x9b\xaa\xfa\x96\x98\xaa\x36\x55\xbb\xb3\xb5\x39\xd6\x10\xbd\x0c\x32\x98\xe5\x96\x34\xb6\x34\xa4\x0f\xfa\xde\x34\x3c\x19\x4d\x8e\x4f\xf3\x6a\xff\x0e\xb3\xa6\x4d\xd3\x91\x32\xad\xd7\x01\x06\xda\xed\xd6\x66\xad\x7b\xb2\x7e\xe4\x40\x19\xb5\x8d\xd4\xe1\x68\xa3\x47\x47\x6a\x26\x21\xf0\xb3\xa2\x4d\xef\xab\xdc\x6d\x4f\xb2\xeb\xc4\x58\xc7\xb2\x65\xd5\x7e\x6f\xeb\xcc\xd1\xf6\x4f\x18\x5c\x56\x65\xfc\xd1\xca\xdc\xdb\xac\xa2\xf3\xac\x5d\x71\x4a\x86\xdb\x3f\xd4\xb6\xb1\xf5\x13\x29\x7b\x4b\x0f\x42\xc0\xb4\xa3\x95\x6a\x96\xe6\xd0\x6d\x0a\xd7\x60\x85\xd4\x1c\xd3\x13\x24\x7d\xb4\xa4\x78\x48\xd9\xfa\x07\x1c\x09\x57\xd5\xa4\xaa\xe3\xce\x15\x96\x8f\x61\x63\x21\x20\x2d\xd9\xb8\xdc\xd2\x60\xda\x56\x73\xc0\x6f\x1b\x1a\x80\xc7\x78\x17\x2e\x63\x03\x6b\x48\xeb\xb9\x35\x9b\x93\x28\xba\x59\xe1\xbc\x86\x07\x94\x9a\x6f\x8e\xc4\x21\xed\x2e\xa1\xa9\xc2\x6e\xdb\x25\xaf\x47\xf6\xbc\xb7\x29\x4d\xd1\xee\xd2\xd6\xd0\x5a\xee\x29\x65\xdd\x42\x22\xb5\x9f\xde\x6c\xcc\xbe\x6b\x5a\x7c\xb2\x6f\x6c\x81\x2d\x6f\xe4\x10\xc2\x19\xa6\x7b\x3d\xc8\x95\x59\xb7\xd0\xea\xa1\xb0\x78\xb0\xe1\xaf\xe1\x6c\x1f\x6d\x69\xeb\xb4\x30\x5f\xa0\x99\xcc\xcb\xe8\x65\x61\x51\xbd\x84\xbd\xd5\xda\xc6\x3d\x96\xa4\x05\xec\x9c\xd7\x6b\xd4\xcd\x68\xab\xbf\x59\xb3\x4b\x9f\xa2\x41\x43\xe3\x2c\xe9\x38\x69\x5b\xd0\x7c\x87\xdf\x45\xeb\x62\xa6\xcd\x74\x42\x72\x0c\x9b\xa5\x18\x39\xf8\xd8\x94\x64\x69\x8d\x7c\x96\xc7\x48\xf1\x8e\xe4\xe5\x4f\x0f\x75\xf5\x58\xa7\x7b\xd3\x90\x91\x15\x39\xb6\x6e\xc5\xf4\xfc\x52\x34\xe0\xc9\xe5\x38\xd6\xa0\x29\xb5\x5f\x55\x3e\x7f\xec\xd7\xcb\x2b\xdb\xac\xcc\xfb\xae\x9d\xf8\x1a\xcc\xa3\x70\x04\x03\x82\x02\xe1\x09\x5d\xe7\x57\x6c\x31\x4b\x4b\x1c\x0d\x6d\x43\x74\x96\x96\x27\xf6\x48\x1a\xa0\xa6\x56\xdb\xc7\xb4\xce\x0b\xdb\xf0\x19\x37\xdd\xe6\x0f\xf2\x29\x9a\x83\x3c\xb4\x66\x6f\xd9\x59\x76\x0c\x41\x06\x6f\xc6\x39\x39\x24\x6d\xf8\x50\xbb\x12\xcb\xc3\xc1\x57\x86\x0e\xa0\xb6\xec\x2d\x65\x3e\x76\x0d\x57\x66\xee\xc0\x4e\x05\x31\xc4\xa6\x8e\x3b\xa0\x88\x47\x13\x1a\xee\x4a\x72\xd8\x2e\x63\xe0\xa5\x51\xb5\xdd\x92\xc9\x97\x19\x0e\xf7\xed\xca\x9c\x7f\xf9\x72\xbd\xfe\x70\xfe\x7e\x7d\xbd\x7e\xf8\xdd\x9c\xdf\x5e\x98\x8b\xcb\xab\xf5\xed\xfa\x61\xfd\xf9\xf6\x7e\x64\xe9\xe9\xe1\x50\x00\xf6\x80\x1c\xb4\x65\x51\x49\x84\x40\xb4\xbe\xe8\x9a\x3c\xab\x4d\x69\x5d\xda\x0c\xe9\x93\x9e\x36\x87\x22\xcd\xb0\xa5\x13\x9f\x43\x16\xe0\x7d\x57\x15\x30\x9f\x26\x55\xc8\xf0\xba\xed\x51\x26\x37\x84\xf4\x56\x5c\x9f\xb4\xb7\x6f\xc6\x08\xb9\x32\x80\xcf\xa5\x8f\x30\x4b\xd8\x18\xa1\x6c\x22\x3b\x0d\xd2\x36\x5d\xb6\x8b\x44\x86\xb0\xb4\x7b\x6c\xc3\xee\x37\x38\x15\xf1\xc5\x83\x38\x0e\x7b\x8a\x3a\x08\x59\x2d\xc0\x06\x1f\xe5\x39\x21\x45\x23\x07\xb5\x3c\x55\xdd\x92\x94\x78\x6e\x96\x37\x0c\x17\xf4\xb1\xc6\xb3\xa5\x9f\xed\x22\x78\x36\xa3\x00\xe4\x60\x2d\xa9\x82\xbc\xb9\x86\x61\x30\x26\x73\xa8\x6a\x39\xac\xed\x10\x43\x0f\x58\xc1\x87\xa0\xc4\x83\xee\x08\xab\x48\xd2\x9f\x80\x7b\x14\x0b\x9b\x22\x85\xfa\xc8\x98\xa0\x01\x39\xa3\x82\x42\x52\x97\x3e\x5a\x91\xdb\xc3\xee\x09\x00\xdc\xb2\xe0\xbc\xf1\x92\xdc\x27\xc7\x71\x93\xcd\xb9\xef\x22\xd5\xb6\x26\x99\x5f\xab\x09\x37\x36\xf3\x22\x0e\xe4\x57\x98\x83\x43\xda\xef\x59\xd1\x35\x84\x75\x64\x9d\x2c\x27\x06\xd6\xb6\x10\x39\x77\xee\x30\xd0\x38\x40\xbc\xe1\x85\x18\xdd\x9b\xe9\xcc\xd5\xe0\xf7\xbf\xd0\x88\x27\x20\x5d\x11\xbc\xeb\xac\x62\x18\xe2\x25\x48\x7a\x91\xb4\x79\xc5\x67\x17\x0c\x12\x6a\x10\xad\xb3\x99\x02\x4b\xb6\x98\x24\x77\xe4\x64\xad\x8a\xca\x70\x4b\xdf\x8f\x56\x58\x99\xb3\x2b\x5a\xc3\x7e\x4f\x81\xbb\x89\x71\x23\x11\xd9\xd7\xcc\x21\xad\x29\xce\x87\x08\x8d\x8d\x90\x28\x84\xe9\xb4\xf1\xac\x21\x53\x32\x13\xad\xd3\x80\x13\x03\x8f\xfd\x4e\x7e\x42\x73\x88\x77\x85\x87\x56\xaf\xd8\xc4\x07\xca\x13\xd9\x37\x42\x0a\x04\x56\xb6\x86\xbc\xa2\xad\x6a\xb2\x85\x02\x3b\x2e\x75\xf6\xa0\x7d\xaf\x29\x6f\x39\x23\x55\x09\x99\xd8\x9a\x82\xc0\x8b\x38\x46\x1f\xa1\x13\x73\xa0\xd0\x59\x35\x15\xfd\xc8\xf0\x2b\x81\x17\x2f\x42\xe3\x0f\x55\xe1\x5a\xfe\x85\xf0\xc6\xf1\x7a\x02\x7e\x6a\xdb\xfb\x95\xd0\x9b\xe5\xba\x7c\xa2\xf8\x9e\x92\x9e\x74\xd7\xcd\xd2\x00\x58\x33\x5b\xe3\x68\xa6\x5a\xf1\x50\xd6\xba\x96\x80\x94\xc7\x4a\x10\x82\xcc\x09\x3c\x50\xc2\x78\xbb\x53\xda\x34\x5d\x21\xf1\x91\x53\x51\x88\x4f\x95\xb0\x26\x0a\x09\xf1\xe9\x91\x3e\x6c\xda\x44\x88\x13\x81\x8c\xee\xe2\x03\x6c\xc2\x3c\xd0\xe1\x8e\xc4\xa7\xc0\x44\xe7\x7e\x20\x46\x45\xde\x25\xe6\x4b\x83\x64\x1d\x8c\x23\x13\xf7\x62\x5f\xb1\x27\x45\x33\x41\x8f\xef\xd3\xec\x5b\xfc\xd9\xff\xa9\xe8\xe4\xea\x0f\x00\x04\xb2\x4d\x20\xa4\xd0\xb9\x67\x20\x8a\xac\x21\x23\x0f\xb0\xaf\x6b\x9b\xe6\x29\x08\x11\x46\x03\x4d\x99\x8a\x95\x02\x29\x00\x84\xaa\x26\xc3\xd1\x43\x6a\x0e\x36\x0b\x28\xc4\x20\xf2\x94\xba\x82\x1f\x57\xcf\x7d\x54\x66\x22\x00\x9b\xe8\x73\x70\x4c\x26\x30\x8a\xfb\x4f\xce\x1e\x01\x3d\xe4\xb3\xe0\x70\x36\xef\x3d\x13\x9f\x51\x50\x48\x11\x37\x68\xed\x23\x02\xac\x42\x0b\xcf\x4d\xa8\xcd\x2a\xc7\x73\x95\x80\xc9\x19\xc2\xa2\xdb\xf3\x89\x80\x2d\x55\xd0\x10\xed\xfb\xe0\xbe\xdb\x82\xa0\xc1\x3f\x77\xa0\x13\x6c\x3d\xc7\xe8\x9f\xcc\xeb\xf4\x48\x16\x46\x03\x1b\xe1\x1b\x39\xc0\xac\xdf\x99\x7e\xaf\x2b\x4a\x94\xe0\xd3\xa1\xfd\x37\x9d\x6b\x53\x4f\x27\x5d\x79\xe8\x04\xc2\x20\xa0\x28\xae\x55\xc0\xdb\x0a\xe8\x55\xec\xea\x01\xb7\xa1\x45\xc0\xb6\x81\x49\xdb\x96\x4f\x4b\x9e\xfb\x93\x53\x53\x6c\x93\x63\x66\xf2\xca\x98\x22\x61\xfa\xe8\x48\xed\x91\x35\x98\xad\x93\xa9\xfa\xc3\xdc\xa7\xf5\xb7\xee\x40\xbc\x0f\x2e\x86\x94\x22\x70\x3f\x1c\xe5\x11\x00\x07\xed\xb8\x86\x40\xa8\x26\xe5\x02\x58\x1a\xfb\x5f\x1d\x5b\x51\x14\x8d\x10\xee\x61\x45\xd8\xa9\x52\xab\x68\xe1\x20\xa1\x57\x19\xbe\x1f\xda\xa9\x83\x5d\x14\x05\xad\xbc\xfc\x7c\x48\x69\x01\xc4\xdb\x4b\xc1\x5f\x65\x56\xbd\x2a\x58\x37\x50\x49\xbc\x39\x4d\xd4\x88\x28\x15\x5d\xce\x34\x84\x54\x71\x7e\xff\x61\xbd\xee\x33\x16\xde\x6d\x02\xb7\x73\xe5\xb6\x52\x8d\xca\x84\x89\xb9\x4e\x1f\xec\x3f\x47\x9f\xdd\x7f\xbc\xb9\x86\x06\xfe\x49\x3f\x28\xc4\x91\x05\xa4\x6a\xd6\x03\xf3\xb8\x78\xb8\x48\xd4\x6a\x53\x20\x5b\xfe\x9a\xac\x1d\x73\xe0\x89\xc6\x61\x13\xe6\xd3\x03\xcd\x31\x20\xe0\xbb\x8e\x48\xca\x40\x8d\x2b\x23\x9b\x0f\x9b\xf4\xbb\xf9\x42\x69\xed\x7d\x56\xbb\x03\xc9\xf4\xe5\xe2\x2a\x81\x05\x1f\x60\x2e\x40\x51\x3f\x58\x22\x9d\x78\x17\x0e\x23\xf6\xad\xaa\x24\x81\xe9\x90\xe2\xe7\x88\x9f\xe4\xf8\x20\x23\xa2\x53\x21\x28\xc4\xbb\x65\x9a\xc9\xa9\x04\x43\xc7\xc3\x85\xe7\x1b\xfa\x00\xe3\x71\x55\x15\x02\xd7\x38\x50\x75\xfb\x58\x31\xde\x51\x6c\x80\x1a\x19\x04\x89\x58\x1f\x34\x59\xde\x29\x5d\x14\xcf\x1b\xca\xc4\x62\xd0\xd1\xe1\x4c\x94\xe8\x36\xbc\x17\x8f\xd2\x0f\x08\x19\xe6\x0b\x99\xe6\x52\x60\x2d\x11\x37\x1b\x50\xeb\x44\x28\x25\x0f\x3d\xc0\x8a\x5d\x4b\x69\xd7\x96\xb4\x48\xbc\x45\xe8\xe2\xb6\x42\xbe\x8e\x4d\x1d\x18\x43\x52\xdd\x17\xe5\x15\xe2\x0d\xa0\xaf\x09\x02\x26\x65\x8e\xa7\x44\xf7\x44\xee\x47\x41\x73\xc8\xd5\x6b\x72\x0f\x02\x32\x61\xa3\xc4\xab\xd2\xda\xe3\x7b\x2f\xc0\xca\x5c\x05\x16\x4f\x5f\xfa\x03\x14\x7d\xe7\x15\xab\x93\x73\x31\xce\x37\x7a\xb9\x53\x91\x36\x99\xd9\xb7\xb2\x66\x42\x86\x12\x4b\xb2\x7c\x64\x34\xd0\x25\x59\x21\x1c\x44\x84\x49\x29\x1f\xf0\x01\x01\x02\x10\xbd\xe2\x05\x60\x52\x96\x4e\xc2\x13\xd5\x0d\xed\xb4\x64\xda\xaa\x83\x37\x55\x1e\x22\x09\xd6\xa1\x13\xf8\x79\x65\xfe\x71\x79\xf7\xfe\xfc\x61\x7d\x63\x3e\x7c\xfe\xf2\xfb\xfa\xf6\xe3\x62\xf1\x7b\xd5\x31\xcb\x99\xab\xaa\x0c\x63\x99\xb2\x1f\x5a\xb3\xdb\xff\xd9\x02\x42\xa2\xe9\x9f\xcd\x7d\x74\xec\x55\x9f\x8c\x32\x0e\x89\xa7\x4d\x6f\x84\x3e\x0d\xd6\x40\xab\xa9\x48\xfb\x4c\xe2\x33\x10\x16\xc6\x80\xb8\xa8\xe6\x0a\xd9\x8b\x42\x31\x27\x0a\x07\x94\x28\x20\x75\xa0\x15\x34\x53\x02\xd3\x71\x9e\xe3\xd0\x19\x57\xa8\xc0\xc8\xec\x33\x25\xa0\x95\xf1\xda\x83\x05\x20\x79\x6e\x6d\xb6\x2b\x99\x74\xd1\x29\xa3\x84\xc3\xa2\x55\x1b\x49\xf4\xa0\x20\xc4\xd5\xba\x2a\x94\x74\xa7\x7c\x80\x08\x36\x5d\xed\x93\x89\x53\x74\x8a\x8a\x92\x27\x5e\xe6\x9b\x55\x74\xd7\xf3\x59\x99\x4f\xd5\x11\x02\x26\x3a\x80\x0e\x30\xcb\xec\x41\x0a\x10\x24\xa0\xc6\xfc\x12\x94\x1f\x25\x2f\x09\x4c\x32\xe7\xca\xac\xb7\xfc\x58\x74\xde\x94\x58\xa5\x35\x8d\xb2\x65\xd5\x3d\xee\x4c\xd9\xf9\xfc\x2b\x16\x03\x95\x10\x4a\x23\x2a\xf5\x41\x15\x33\xa8\x0d\x8c\x4b\xe9\xed\x2f\xab\xde\xbc\xf8\x89\xc2\x32\xe3\x97\x43\xe8\x93\x47\xae\x09\x44\x53\x10\x2a\x03\x0a\xd2\x0d\x91\x2e\x39\x2c\xbf\xbd\x80\xe5\x24\x34\x45\x8c\x93\xdf\xcb\x62\xf1\xcb\xca\x9b\xb4\x59\xdf\x9a\xff\xfc\x7a\x7e\xfb\x40\x69\xf3\x62\xa1\x9b\xd4\x54\x26\xc0\x4c\x5c\x26\x8c\xcc\x46\x76\x0c\xfd\xef\xab\x9a\xa9\x5d\x69\xde\xbe\x79\xd3\x9b\x64\x94\xe5\x8c\xac\x33\xe0\xc8\x80\x2a\x06\x8d\x51\x5e\x5f\x30\x67\xee\x0f\x95\x34\x95\x61\x6c\x88\x04\x75\x4d\xfe\x92\x11\x5d\xac\x95\x54\x05\xf8\x82\xf1\xd2\x93\xf4\x7c\x34\xfb\xbb\x39\xbe\x2a\xd0\xc5\x29\xa1\xcc\x2e\xb2\x8f\x49\xac\x1f\xb8\xa1\xcf\x65\xdc\xca\xbc\x27\x17\xf0\x12\xf5\xa7\x3c\x23\x8f\x21\x7f\x2e\x5b\xb7\x3d\x89\xff\x34\xc3\x64\x51\x95\xda\xd8\x60\x68\x0f\x43\x89\x64\x72\xe5\xac\x22\x6e\x87\xfd\x31\x44\x32\x6b\xc4\x76\x11\x59\xc2\x01\xc9\x77\xa4\x61\x86\x99\x08\x23\x49\xa8\x27\xc7\xd5\xc1\xde\x17\xe1\xd0\xe2\xcd\x01\xf1\x75\xb7\xba\x39\xa0\x41\x2e\xc6\x46\x56\xa3\x0e\xc7\x0b\x8b\x97\x34\x71\x9d\xa9\x7f\x8e\x53\x84\xa2\x02\xa9\xe0\x2d\x9f\x42\x09\x34\x92\x71\x6c\x51\xcc\x32\xc8\x0f\x9b\xed\x29\x68\xc5\x1b\x7a\xe2\xa3\x7f\x4b\x40\xd0\x4a\xed\x22\x2e\x64\x4b\xe5\x45\xd9\x21\x57\x42\xc9\xb1\x60\xec\xeb\xad\xc2\x07\x9b\x5c\xce\xf8\x2e\xb1\x37\xa0\x32\xf4\x0c\x10\xa4\x98\x6f\x9e\xaa\xa2\x23\x85\x55\x1d\x83\xd1\xd6\xb5\xbd\x61\xe1\x00\xb5\x72\xc7\x6c\x15\x87\xe1\x6a\x3a\x9e\xaa\x64\x35\x20\x35\x32\x67\x29\x2a\xad\x84\xfd\xf4\x13\x4f\x93\xb4\x4d\x55\x12\x61\x38\xbd\xf2\x9a\x4d\x33\xae\xb1\x45\x16\x07\x9c\x73\x65\x67\x55\x52\x9e\x12\x21\x36\xff\x23\xcd\xa0\x18\x8e\xdb\xab\x89\x83\x0e\x00\xce\xd3\xab\x7f\xd5\x5b\x7b\xaf\x13\x75\x78\x5a\x36\x93\x42\x8d\x28\x29\x80\xaa\xf2\xd6\x60\x69\x70\x24\xc2\x89\xd3\x70\x06\x27\x29\xaf\xce\x8f\x8a\x28\xe7\x6b\xc0\x71\x23\xc5\x6b\x40\x32\x6d\xa9\x7e\x5d\xda\x96\x2b\x4d\x45\xa5\x5c\x3c\x2a\x39\xa5\x5a\x3a\x6e\x67\x04\x1b\xed\x3e\x91\xf2\x2b\x7d\x4a\xb6\x2c\xa5\x02\xb6\xf5\x24\xa2\x81\x3e\xb3\xd3\x25\x5f\x0b\x25\xd6\x42\x1a\x92\x08\x91\x0f\x56\x91\x57\xc7\xb2\xa8\x98\x84\x56\xe5\x69\x4f\xb6\x02\x9f\x47\x50\x86\x53\x20\x28\xc4\x0f\xbf\xf6\xc4\xd9\x4f\x0d\x9f\x6c\xab\x8c\xf8\x65\x88\x2b\x9d\xa2\x5d\xa1\x45\x90\x83\xdc\x09\x85\xb3\x69\x11\xcf\x7a\x53\xa2\x19\x3a\xc0\x0a\x29\xd8\x1e\x1a\xec\x82\xf2\x1b\x0c\x66\x66\xd3\x1b\x85\x16\xb7\x86\x96\x41\x03\x08\x1b\xc8\xe0\x5a\x70\xbd\x8a\xd0\x96\xaf\x4f\x7a\xca\x31\xd1\xe6\xd1\x11\xc6\xd4\x76\x9f\x32\xd9\xeb\xbc\x2a\xf8\xa8\x7c\x4d\x5a\xc2\x50\x38\xa7\x8e\xe6\x2f\xf0\x25\x12\x7a\xf6\x10\x73\x02\x77\x4b\xb7\xad\x06\xb2\x02\x9f\x93\xf3\xda\x49\x60\x2d\x07\x16\x72\x16\x52\x67\xbe\x08\xa9\x39\xda\xd2\x23\x34\xd7\x23\xe7\xdc\x5c\x0d\x26\xa3\x28\xb8\x4e\xc6\x27\x9f\x4a\xfe\xac\xe9\x67\x5f\x10\x85\x0b\x69\xa1\x81\xe6\x97\x52\x06\xee\xb8\xc0\x48\x3c\x40\x24\x3d\xdb\x61\x63\xcb\xda\xe8\xbe\x66\xea\x57\x47\x4b\xba\xd9\xd8\x6d\xc5\x24\xaa\xd7\x3c\x0c\x94\x50\x40\x38\xc2\x98\x1c\xb0\xde\x1f\x9d\x80\xe1\x1e\x96\xbc\x63\xee\x4a\x9f\x2a\x05\xe4\xf5\x05\xdf\x49\x99\x87\x9c\xb5\xfb\xa4\xf7\x8c\x23\x19\x68\x57\x7f\x5d\x99\x9b\xcf\x17\xeb\xab\xf5\x87\x73\x2d\x79\xbf\x44\x55\x53\x33\x2e\xf5\x4e\xb6\xd5\x13\x8e\x88\x6b\x20\x55\xf5\x55\xad\x9f\x79\xd2\x5f\x3c\xf1\x18\x32\x57\x08\xaf\xb5\x1c\x9e\x63\xb2\x9c\x4c\x0f\x56\x4e\x79\x7c\x71\x1a\x51\xdd\x50\xea\x9b\x3c\x47\x59\x7e\xe1\x59\x3c\x11\xc3\x49\x08\x49\xc4\x3e\x85\x6e\x60\xe0\xc0\x15\x20\xf1\x20\xb3\xd7\xa7\x27\xcb\xd0\x39\x1c\x77\x42\x67\x29\x2d\x6b\x50\x2c\xf7\x77\x4e\x52\xcf\x26\xc7\xed\xe3\x62\xe4\xa7\x79\xa5\x81\x8b\xeb\xb3\x8d\xcf\x8e\xc6\x0b\xbc\x5b\x2c\xce\x57\xe6\x6b\x13\xee\xc4\xfa\x94\x87\x02\x08\xee\xe0\xca\x41\x2c\x75\x5b\x18\xd3\x2b\x14\x64\x79\x20\x76\x45\x38\xdd\x82\x29\xec\xb5\xca\x3b\x56\x04\xa6\xd1\xaf\x95\x8d\x93\xba\x9f\x1c\x02\x9b\xda\x51\x63\xce\x04\xfe\x24\xa8\xf9\x52\x30\x19\xf2\x11\xff\xd0\x8a\xb8\x84\xf0\x81\x4d\x25\xfd\xc4\xc5\xd9\xd3\x73\xb5\xf3\x57\x3d\xb5\xf0\x98\xc6\x8c\x55\xe4\xd6\x8b\xa1\xa1\x18\xbe\x02\x5d\x51\x66\xe3\x4a\x5f\x5b\xeb\xd9\x11\x6d\xce\x8f\x84\xcb\xe8\x05\x77\xd3\x30\x23\x59\xbc\x5f\x91\xdd\x30\xc2\x8c\x14\xc9\x0c\x44\xbd\x36\x61\x00\xe2\x1b\x51\xda\x18\x3d\xdf\xb0\x39\x13\x05\x00\x0c\x02\x14\xc7\x57\xa7\xfa\x60\x54\xe0\x1f\x5e\x50\x3c\x73\xb0\x70\xec\x47\xb9\x14\x13\xe7\xf5\x00\xb8\x85\xb3\xfb\xab\x02\x7f\xe3\xf5\x2c\xa8\x9c\x81\xd4\xb1\xa1\x35\xd3\xd1\x7c\x4e\xae\xe5\x98\xc4\x77\x73\x1c\xcb\xb1\x00\x29\x7f\xf1\x61\x65\xee\x39\xea\x0e\x14\xc2\x19\x36\xd7\x61\x71\x18\xe3\x2b\x8b\xe7\xfc\x20\x99\xf0\x55\x5a\xe0\x62\x65\xbe\x78\x2a\xa7\x54\x7b\x9a\x97\x4e\x20\xca\x2c\x2e\x57\xe6\x3c\x47\xc8\x44\x1e\xca\x95\x1a\x48\x39\x7e\x92\x95\xcf\xe8\x3e\xba\x10\xf2\x54\x48\xf1\xbc\x0a\x09\xe0\x60\x5d\x5a\xe7\x0a\xbe\xc9\x14\x86\x14\xb5\x47\x06\x4e\xeb\x20\x3e\x87\xc8\x33\x97\x45\x8f\x33\x14\xb2\x34\x8f\x33\x4a\x01\x7a\xab\xf3\xd7\xc4\x2f\x20\xdb\xb3\xd7\x7c\xa1\x20\x8e\xba\x08\x1c\xef\x58\xfa\x4f\x48\x3b\x94\xf2\x75\x7b\xb9\xf8\xa3\x9d\x7c\x8c\x34\xed\x2f\x73\x46\x62\x86\x84\x00\x4e\xda\xcc\x5f\x1f\x68\xc7\x83\xd2\xdf\x38\xaf\x81\x3b\x85\xe5\x9f\xcd\xd6\x48\x92\x4f\x41\xa7\x1c\x8e\xc8\x49\x5b\x6e\x38\xe8\xb9\x56\x9c\xe7\x2f\xd6\x91\xe0\x8c\x00\x8a\x15\xec\x6d\x5c\x07\x55\x14\x59\xea\x9d\x64\x1b\x0a\x35\xf8\x15\x39\x09\xa9\xd8\x21\x21\xa0\x7f\x29\x40\x82\x5d\x70\x44\xf5\xee\x14\x72\x88\x84\x69\x45\x42\xd4\xea\xd8\xfb\xc7\xb0\xa9\xe2\x39\x90\x4f\xbd\x02\x26\xd0\xc1\xb4\x4c\x90\x90\x0b\xba\x2f\x6c\x60\xac\xbd\x04\x6d\x1b\xe2\x7e\x36\x88\x3d\x91\xf6\x65\x49\xfb\x7c\x28\x92\x10\x3a\x8a\xc1\xad\x05\xe5\x4b\xc5\xa1\x58\x47\xb9\x6d\x32\x8a\x74\x7e\xbd\xb9\xed\x2a\x49\x53\x91\x03\x0e\xf3\x75\x48\xc9\x07\xfd\x1f\xa3\x93\x1b\xf3\x6f\x1f\x8a\x92\x79\xdb\x61\xef\x55\x7f\xe9\xe9\x72\xfa\x27\xf8\x39\x67\xcc\xee\x9b\xe5\xba\xfe\xdc\xca\xcf\x58\xab\xac\x38\x09\x6c\x64\x3b\x47\xd4\xfd\xf9\x32\x09\x71\xe2\x81\xa3\x32\xc2\xd2\x26\x5c\xe3\xeb\x54\xfd\x59\xea\x31\xf7\x21\x8c\x52\x67\xdc\x82\x4e\xb2\x10\x29\xc3\xf6\x9d\x02\x58\x2b\x6a\x7f\x08\xa0\x0f\x1c\xc3\x89\x37\x9e\x21\x0e\x8b\x84\x5a\xa9\xc5\xfd\xc7\xcb\x21\xd0\xf6\xb1\xb2\x8d\x1a\x02\x66\xc2\xe1\xdf\x85\x99\x94\xa7\x19\x9b\x3d\xcf\xbe\x95\xd5\x91\xfe\xfb\x28\xed\x36\x4b\xac\xbc\xbc\x20\x84\x54\x15\x2f\x93\x61\x96\xae\x53\xfc\x65\xe0\x9d\x87\x01\x24\xf5\xce\xed\x63\x01\x6e\x51\x5a\x66\xb3\x5c\x07\xe2\xc0\xbb\x95\xc4\x2f\xd4\xe9\x4a\xe1\x64\xd0\xe2\x48\x26\x5f\x89\xcf\x7b\xa9\xf4\xe0\xd9\x1f\x1d\xf6\x78\x3d\x13\x81\x66\x60\x6f\x62\x63\x3d\x6e\x89\xe8\xae\x96\xa2\x32\x43\x50\xf8\x84\xef\x69\x57\xe1\x52\x5b\xa8\x7b\x63\xb4\x6d\x0b\x30\xfa\x94\x16\xbe\x6c\x8a\xc4\x21\x6a\xc0\xe2\x5b\x73\x5d\xd7\xeb\xc5\x4f\xb8\xb8\x59\x99\x0b\xcb\xe9\xea\xfc\xf1\x5c\x96\x39\x61\x82\x1e\x0d\x09\x80\xd2\x7d\x1a\xc6\xf9\xc2\xe9\xc6\xfa\x0c\x3d\x7f\x8e\x84\xd0\x5a\xb7\xb4\x56\xa5\x69\x8d\x52\x2f\x5a\xd3\x7e\x67\xde\xf8\xd8\x9f\x59\x33\x5a\xd6\x48\xf7\x01\x6e\x78\xc8\x87\xb9\x8e\x1d\x97\x9a\x68\x8e\x89\xa2\xfb\x12\xcb\x04\x72\x54\xd0\x86\xd1\x79\xae\xf3\x42\x7a\x25\xa4\x41\x03\xac\x81\x9d\x09\x85\x2b\xd4\xcb\x48\xb8\x99\xdb\xf4\xa8\x0f\x02\xc8\x1c\xaa\x56\xda\x58\xa2\x8c\x37\x3e\xf6\x50\xee\x6d\x85\x58\x48\x72\xdd\xdf\xc2\xcb\xe5\x0c\x04\x11\xd2\x25\x04\x3e\x48\x98\x82\xec\xe9\x9e\x09\x47\x2a\xe1\xf8\x0e\xe0\x9d\xe7\x03\xa3\xf1\xdc\xa4\x60\x3e\x3a\x1b\x8a\x9f\x39\xb1\x99\x98\x2b\x80\xa5\x13\x73\x6e\xb1\x19\xf3\x7e\x1c\x87\xf0\xa0\x91\xad\x45\x95\x64\x04\x88\x1f\xd9\x5a\x94\xbd\xb9\x76\xda\x64\x82\x04\xd9\x46\xe3\xb1\x35\x56\xe4\xe4\xbc\x37\x27\xbe\xe8\x05\x12\xc3\x13\x88\x57\xbf\x7e\xbd\x8d\x7b\x4d\x38\x00\x85\x49\x0e\x96\x2b\x75\xb8\x2c\x17\xf7\xd2\x5a\x02\x3b\x65\xb8\xb6\x65\xb6\xf8\x24\xd7\x68\xb8\xfd\xad\x1f\xd3\xd2\xfd\x77\xea\xed\xb7\xcf\xcd\x5d\x2b\x4d\x89\xb9\xdd\xba\xd2\xf9\xe4\x24\x0d\xf7\x96\x13\xb5\x68\x9b\x03\x46\x75\x07\xa9\xf6\x49\x4f\x63\x2e\x77\x64\x93\x92\xb1\xd2\x93\xe9\x83\x3f\xff\x2d\x7e\x6c\x54\x3f\x4e\xbc\x5d\x58\x69\xae\x8c\x4d\x24\x66\x63\xcf\x7a\xf3\x67\xdc\x6f\x02\x47\xa3\x75\xc7\xa2\x19\xc9\x1a\xf9\xbb\xd1\xfa\x3e\xea\x49\xe9\x8b\xb4\x78\x16\x15\x52\xd2\xba\x46\x15\x57\xce\x44\x3b\x44\x5f\x89\x65\x95\x56\x0c\xe6\xe4\xe9\x50\x44\x4c\x0a\xd4\x04\x4f\xbd\x83\xa7\x5a\x45\xf5\xd7\xf7\x26\xba\xaa\xe0\x2a\xa7\x0f\xd1\xc5\xa9\x97\x03\x8e\x49\x43\x71\xae\xbd\x14\xa1\x4d\x35\xcc\x20\x42\x48\xf9\xbc\xe6\xea\x29\xdf\xf9\xa0\x18\xbc\x4b\x8b\x2d\xed\xb8\xf7\x71\xee\x4e\x66\x52\xc4\x8e\xf1\x2b\x1b\xaf\xff\xb2\xb6\x1c\xf8\x25\xd2\x16\xac\x2e\x24\x86\xdc\xaf\xe4\x32\x32\xfd\x88\xe2\x07\x1c\x09\xdc\xa2\x0f\xc9\xd2\x0d\x93\x4b\xb5\x23\x4c\xa5\xb7\xb6\x62\x8b\x67\xda\xb1\x15\x1e\x3a\xf3\xa5\xa9\x48\x8b\x7a\x19\xba\x19\x96\x3f\xa4\x2e\x34\x9b\x6d\x10\xd2\x20\x7f\x6b\x22\x9a\x05\xcd\xf0\x3d\x72\xad\x9d\xd0\x56\xda\x1a\x70\x2f\x7f\x8a\xdd\x96\x7d\x81\x8e\x75\x62\x5e\x8b\xc5\xdf\x70\x1d\x74\xf3\x7e\x7d\x8b\x0b\xa1\x8b\xcf\x1f\xbe\xde\x5c\xde\x3e\x0c\x4a\x48\x7b\xa2\x95\x23\xf2\x22\x1d\xd3\x8c\x3e\xbe\xd7\xf5\xc5\xfe\x9d\x64\x92\x19\xb1\x9f\x4a\x14\xf3\x00\xf5\x57\x29\x27\x45\xcd\xcb\x7d\xd5\xab\x99\x2b\x32\xf9\x62\xb5\xf3\xf5\x12\x48\x9a\x06\x3e\xa2\x1a\x9f\x27\x07\xd1\x80\xc0\xbb\xc2\x56\x20\xae\x97\xc0\xb3\x53\xed\x6a\xe6\x07\xc9\xd1\xe7\x67\x65\x64\x54\x8d\xe5\x42\x11\x9d\xb0\xf7\x11\xc2\x8b\xb9\x0c\x47\xe2\x4a\x5e\xda\x19\x7c\x88\x83\x17\xce\x65\x59\x22\xd3\xbe\x2b\x5a\x87\x06\x0c\xb9\x64\xc2\x55\xea\x8c\x54\xea\xff\x6a\xfe\xb9\xc6\x72\x83\xfa\x98\xf6\x45\x45\x09\x0f\x77\x09\xfb\x69\x67\x26\xeb\xdb\xf0\xe0\x9b\x5c\x4e\x80\x8f\x91\xa6\xb8\x21\xb7\x0d\xbd\x50\x89\x5c\xc2\x0e\x6e\x7b\x98\x05\x72\x4f\x82\x3f\xf1\xae\x74\xa8\xf4\x6e\x18\x16\x34\xc5\x8b\xb0\x12\x9d\xa3\xd2\x8d\x48\x53\x22\x22\x36\xc9\xa4\x8c\x11\x0e\x4f\x5b\xea\xbd\x6f\x0c\x2a\x48\x7e\x3d\x22\xda\x20\x9c\x25\xb3\x6e\x5b\xe0\x56\xdc\xcb\x20\x4c\x6f\x65\x6e\xbc\xd8\xbc\xc3\x34\xff\x83\x82\x6f\xdc\xbc\x39\x0c\xb6\xde\xf4\x7e\x1c\xf4\x47\xa9\x7b\x20\xc3\x91\x01\x80\x4b\x4d\x2c\x39\x2a\x2f\x7a\x4f\x8c\x08\x64\xf3\x42\x52\xea\x83\xf1\x9c\x79\xfb\x0e\x1e\xce\x53\x9f\x4d\x6f\x7f\xed\x93\xb2\x1f\xac\x3d\x49\x2e\x34\x58\xce\x8f\x8e\x93\x0e\x4d\xb7\xb8\x7c\xaa\xfc\x18\xdd\xaa\xd3\x87\x62\xd2\xb2\x5a\x2e\x16\xff\x0f\xb8\x75\x7d\x7d\xf9\x81\x4b\xde\xe6\xf3\xd5\x1c\x78\xe9\x2b\x27\x59\x55\x14\xba\x4b\xe6\xeb\xc2\x83\xe7\x2e\x20\xff\x25\x4c\x93\xd2\x4a\x1f\x56\x1c\x11\x59\x82\xa8\xce\x13\xd2\x49\xfd\x67\x7c\x34\xfd\x3a\x53\xaf\x34\xbe\xa5\x6c\x4c\xf8\xfb\xcd\xcc\x61\x62\xd4\x6a\x50\x77\xc5\x8c\x08\x40\xd7\xc9\xd5\xe9\x28\x47\xeb\xe5\xd2\x76\x90\xc9\xbd\xaa\x57\x30\x45\xfc\x1a\x97\x24\x41\xf4\xf0\x1e\x08\xc7\xd0\x46\xd2\x98\x58\xe4\xd1\x6d\x04\xde\x1e\x08\x6a\x23\xe8\x9b\xd3\x73\xd8\xa5\x80\x3e\x47\xb9\x74\x16\x18\xa5\x51\x9c\x21\x44\x04\x43\xf3\xe5\xb0\x28\xee\xf5\x33\x3c\x95\xe9\x26\xa3\x16\xe0\x39\x75\x49\x97\x78\x7f\x07\xf3\xff\x57\xe6\xfc\xe3\xc7\xbb\xcb\x8f\x7c\x05\x63\x7e\x5b\x3f\x7c\x32\xeb\xdb\x8b\xcb\x2f\x97\xf4\xcf\xed\x83\xf9\xed\xf3\xdd\xdf\xef\xd1\xc5\x8a\x6b\x4b\x57\xa4\xb3\xad\xe7\x08\xdd\x6d\x13\xbd\x63\xd3\xc4\x91\xb6\xb1\x84\x84\x69\x6b\x35\x65\xcd\x2d\x32\x27\xa1\x12\xfe\xb8\x7c\xef\x55\xa2\xd7\xae\x88\x84\x72\xa9\x6d\x3d\x1d\xae\xb8\xdb\x31\xbe\x3c\xe6\x04\x53\x7b\x95\xf0\x52\x89\xf0\x28\xd0\xba\xe3\xae\x62\x6b\xec\x4a\xfd\xe0\x47\x37\x47\xd1\x59\xe1\x3a\x34\xda\x6a\x5f\x76\x45\x43\x64\x91\xba\xbd\xf6\x0a\x2a\xde\xf9\x81\x21\xf5\x8d\x1f\xee\x7b\x28\x29\x07\x58\xa6\x8f\x8f\x38\x9b\xd6\x2e\x7d\xb7\x49\x74\x96\xfd\x06\x0e\xe0\x40\x83\x82\x31\x0a\x2e\xaf\x35\xb6\x2a\xe6\x22\x85\xe8\x1a\x5d\xcc\x47\xc7\xe1\x8e\xa0\xc3\x4c\x74\x20\xbb\x25\x22\xe6\xbb\xb6\xa3\x47\xfd\x05\xca\x29\x94\x06\xda\xfe\x25\xa8\xe7\xde\x9a\x8a\x2e\xf1\x94\x65\x47\xcc\x5d\xab\xb6\x9e\xbf\x85\x5e\x21\x6e\x4d\x46\x37\x57\x16\xf5\x26\x37\xcf\xdd\xfd\x6b\xb1\x70\xa6\xd1\xbf\xbf\x3e\x40\x18\xa0\xc4\xbb\x6e\xfb\x92\x13\x80\x17\x84\xc0\xeb\x3a\x19\x97\x89\xe3\xe4\x65\x58\x59\xab\x86\xdd\x3a\x4d\x57\xd7\x78\xd3\x51\xa8\xcd\x84\x46\x2a\xaa\x85\x85\x28\xe3\x69\x7d\x8b\x2f\xab\x53\x1a\x6c\xa4\xdf\xb0\x9f\x3a\x95\x39\xf1\xa8\x58\x69\x3f\xc1\x62\xf1\x6f\x94\x41\xdf\x9d\xdf\xde\x5f\xb3\x33\x12\xd7\x8a\x3a\x92\x61\x4b\x7d\xcd\xa6\x7f\xeb\x2d\xbe\x71\xa0\x5c\xb5\x0a\x89\x43\xdc\xe5\xd7\xcf\x33\xbd\xb6\x99\xa9\xfd\x07\x66\xbb\x32\x77\x1c\x27\x60\x35\xcf\xd2\xaa\x78\xf2\xd0\x23\xc5\x4d\xe9\xa8\x09\x4e\xb3\x13\x57\x4f\x5e\x42\x6a\x92\x41\xce\xe3\x09\xf2\x58\xee\xb8\xe6\x31\x4f\x59\xfc\xed\x66\x70\x20\x4f\x22\x42\x91\x35\xd4\x4a\xa6\x13\xf4\x25\xd4\xbe\x9d\x24\x6e\x0a\x1f\x83\xf6\x34\x8a\x71\x3f\x55\x90\x3e\x5e\xff\x92\xa2\x0c\xba\x5f\x06\xb7\xe1\xf1\xfd\x03\x51\xa8\x2c\x6d\x14\xee\xe8\xec\x52\x32\x0b\xf1\xa1\x8d\x6d\x8f\xd6\x6a\xc7\x6a\x24\x8e\xef\x58\xfb\xb3\x6b\x24\x2f\x8f\xe6\x7e\x09\x24\x8e\xa9\x2b\xc8\x16\xff\x9d\x6c\xf1\xf2\xee\x66\x7d\xab\xb6\x18\xf7\x41\x4a\xab\x8c\xbc\x6e\x9a\xa0\x76\x5a\xf8\x15\x86\xcd\x3d\x03\x3b\xb3\xdf\xb9\x71\x31\xc5\xeb\x49\x28\xc7\x36\xd2\xe7\x25\x1a\x04\xa2\xce\xbc\x3e\xc1\x2f\x89\x09\x08\xa2\x04\xb7\x3f\xb4\xfe\x8d\xd8\xb9\xe5\x5f\x5a\x9d\x26\x7d\xaa\x9c\x66\x45\xbc\xd5\xd0\xf8\xcf\xf1\x1b\xb6\xef\xb8\xb0\xc6\xb9\x10\x1b\x67\x33\x2b\x52\xe8\xc8\xd4\x6a\x11\xfc\x58\x7a\x83\xd1\xae\xeb\x9e\x6c\xdf\x00\x59\xf9\x89\x12\x31\x7e\x6e\x9a\x99\x4c\x29\xe2\x84\x0e\x63\xf1\x10\xdd\x52\xd3\x0b\x96\xc3\xb9\x7d\x73\x1a\x13\x14\x2f\x80\x36\xb9\xa0\x6f\xb9\xe3\x1e\x58\x4a\xa3\x5d\xaa\xaf\x19\xbe\x59\x99\xab\xaf\x0f\x5f\xef\x2e\xcd\xdd\xe5\x3f\xd6\xf7\x9e\x74\x3e\x7c\x5a\xdf\x9b\xeb\xf5\x87\xcb\xdb\x7b\x7d\x09\xfa\xb9\x97\xbc\xfb\xb6\x4c\x32\x96\xd2\xf2\xcb\x7d\x4f\xae\x89\x72\x5c\x0f\x29\x3f\x78\xe3\x5c\xfc\x1f\xbd\x33\x70\x4e\xfa\xa9\x31\x13\x75\xd6\x30\x15\xeb\x82\x30\xb9\x71\x7b\x8a\xa2\xdc\xa9\xdd\x1c\x5c\xed\x42\x22\xe3\xbb\x0a\x9f\xfc\x6d\xef\xa6\x6b\x15\xef\x90\xcc\xe1\x81\x9c\x1b\x6b\xb8\xb4\x20\x2f\x0d\xf2\x12\x64\x6b\x14\x76\xe4\x15\x13\x42\xd2\xcc\xd6\x25\x57\xcc\xad\xd9\xb5\xed\xe1\xdd\x4f\x3f\x1d\x8f\xc7\xd5\x63\xd9\xad\xaa\xfa\xf1\x27\xff\xa2\xee\x4f\x78\xe9\x01\x0c\x73\xd4\xc5\x12\xbd\xb5\x2a\x85\xfe\x54\xcb\x9c\x8f\x1d\xa9\x49\xc9\x57\xd3\x97\xe2\xa7\xd5\x28\x7d\x6b\xc7\xd7\x8f\x53\x39\xcd\xac\xc3\xa6\xe5\x99\x71\xef\x4c\x64\x31\x4b\x7d\xf3\x15\xef\x90\xd5\x7e\xd4\x32\xee\x95\x76\x5a\x43\xf6\x26\xe5\x0b\xc8\xfc\x2e\x8b\xef\xac\xef\x41\x5f\x0b\xd4\xbe\x67\x46\xbb\xea\x42\x1e\xaa\xb2\x46\x02\xd5\xbe\x34\x33\x10\x41\x86\x87\x2a\x68\x7f\xbb\x74\x16\xb8\x59\x5e\xa7\xdb\xf6\x95\xaf\x95\x3d\x67\x74\x53\x7d\x05\x82\x24\xc2\xa0\x09\x6f\xa8\xe2\x29\xdc\xf9\x70\x92\xed\x2a\x34\x93\x40\x5a\xff\x88\x74\xc9\xfc\xef\xc5\x23\x46\x7c\x41\xfc\xf8\xe2\xeb\xcd\x3b\x00\x42\x5f\xee\x1a\x65\x2c\x0c\x26\x81\xe7\x92\xa3\xcd\x8c\xe3\x37\xba\x42\xfe\x11\x0e\x4d\xff\xa8\x40\x12\x05\xa3\xf8\x16\x72\x94\x9a\xe5\x71\x36\x18\x1a\x3d\xc3\x49\xf7\x01\x57\xaa\x42\x71\x52\xdf\x98\x3f\x98\xaa\x84\x56\x83\xfe\xfd\x86\x77\x8b\xf8\xcf\x41\x64\xaf\xcc\xef\x97\xe7\x77\xe6\xf7\xcf\x5f\xef\xcc\xed\xf9\xcd\xe5\xca\x7c\xe9\xc3\x3b\x5c\x81\xa2\x53\xf4\x27\x1c\x92\x61\x83\x1c\x5f\x91\x09\x6a\x8b\x02\xf2\x17\x28\xc8\x8f\xf1\x24\x31\xd1\x5f\xb0\x30\x73\x0e\x11\x1d\xf0\x0f\xce\xf3\xd7\x9e\x40\xcf\xf0\x0a\x61\xcd\xd7\xeb\xfb\x07\x82\xcd\xcb\xf5\x9d\x79\x58\x3f\x5c\x5f\xde\x47\x2d\x5f\xd3\x36\xed\xfe\x19\x1f\x72\x74\xe8\xa4\x4f\xbb\x1f\x19\xde\xca\x0a\xf5\xf6\x00\x32\xe3\x64\x7a\x5a\xfc\x78\x59\x59\xcb\xbe\x0f\x97\x8d\x8b\xb2\x9c\xb9\x57\x36\x61\x73\x84\x2e\x2c\xec\xec\x90\x25\xbf\xd2\x8e\x57\x99\x40\xc7\xe4\x75\x0d\x69\xc7\xe2\x76\x62\x68\x35\xba\x77\x1a\xad\x38\xd1\x52\x58\x70\xee\xcb\xc1\x52\xcb\x97\x34\x1c\x17\x7c\xb6\x33\xef\x73\x86\xbd\xf7\xae\x18\x5f\x18\xe1\x5e\xf7\x09\x5c\xd5\x46\x6f\xb7\xf9\x3f\x7a\x90\x55\x68\xc9\x39\xc6\x7f\x08\x40\x6a\x2b\x8a\x9f\x8d\xed\x1f\x93\x9a\x1f\x12\xbe\x42\x4d\x5a\xea\xaa\xbb\x4a\x4b\x67\xc3\x3f\xbc\x10\x48\x93\x54\x1b\x7e\xfc\x87\x24\xd0\x68\xc9\x7f\x26\x45\x39\x42\x27\xee\x3f\xfa\xb3\x11\xff\x13\x00\x00\xff\xff\x0e\xfd\x31\x7c\xf8\x45\x00\x00") - -func confLicenseGnuFreeDocumentationLicenseV11Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuFreeDocumentationLicenseV11, - "conf/license/GNU Free Documentation License v1.1", - ) -} - -func confLicenseGnuFreeDocumentationLicenseV11() (*asset, error) { - bytes, err := confLicenseGnuFreeDocumentationLicenseV11Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU Free Documentation License v1.1", size: 17912, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuFreeDocumentationLicenseV12 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x7c\x5b\x77\xdb\xb6\x96\xff\xbb\x3e\x05\x96\x5e\xfe\xf6\x5a\x8c\x9a\xa4\xa7\xff\x99\x49\x9f\x1c\x5f\x12\x9d\x63\x3b\x1e\x5b\x69\x9b\x79\x83\x48\xc8\x62\x43\x11\x3a\x04\x69\x45\xe7\xd3\xcf\xbe\xe1\xc2\x8b\x92\xce\xac\x79\x69\x6a\x0a\x04\x36\x36\xf6\xe5\xb7\x2f\xe0\x87\xfb\xcf\xea\xa6\x31\x46\x5d\xd9\xbc\xdb\x99\xba\xd5\x6d\x69\x6b\x75\x5b\xe6\xa6\x76\x46\xcd\x7e\x33\x8d\xc3\x07\x6f\x16\x6f\x33\x75\x6f\x5f\xcc\x6e\x6d\x1a\xf5\xf6\xf5\xeb\xb7\xb3\x4b\xbb\x3f\x36\xe5\xf3\xb6\x55\x67\x97\xe7\xf8\xe8\x75\x06\xff\x79\x83\xff\x79\xcb\x73\x3e\xd9\x4d\x7b\xd0\x8d\x51\x37\xb6\xab\x0b\x9a\x39\x53\xcb\x3a\x5f\xa8\x5f\xde\xc0\x08\x5d\x7f\xad\xca\x5a\x3d\xb5\x99\xba\x29\x37\xed\x56\xdd\x54\xd6\x36\x99\x7a\x6f\x5d\x8b\x23\xef\x2e\xd4\xeb\xb7\x6f\xde\xbc\x7e\xf5\xe6\xe7\xd7\x6f\xd4\xe7\xa7\x8b\xd9\xec\xfa\xc5\x34\x47\x5b\x1b\x55\x3a\xb5\x37\xcd\xae\x6c\x5b\x53\xa8\xd6\xaa\x1c\x88\x51\xba\x2e\x54\x51\xba\xb6\x29\xd7\x5d\x6b\x14\x8c\x5d\xc3\xa2\x3b\xfc\xb1\x34\x4e\xd9\x8d\x6a\xb7\xf0\x62\x25\x9b\x2b\x64\xcb\x99\x82\xe1\x2a\xdf\xea\xfa\xb9\xac\x9f\x55\xd9\xe2\xec\xb5\x6d\x95\xae\x2a\x7b\x30\xc5\x62\x36\x7b\xbd\x50\x0f\x8f\xd7\x17\x77\xef\x6f\xaf\x67\xb3\xd5\xd6\xa8\x7d\xd7\xec\x2d\xcc\xe1\xe7\xf4\x0c\x83\xff\x05\x6a\x76\xfa\xab\x51\x1a\xfe\xa9\x3b\x5d\x65\xaa\x35\xdf\xda\xb5\xb5\x5f\x33\x65\x1b\x65\xdb\x2d\x70\x70\xd3\xd5\x39\xf2\x43\x57\x44\x75\xe7\xcc\xa6\xab\x02\x45\x6a\xbe\x01\xfe\xcd\x15\x70\x07\x46\x2b\x47\x53\xc3\x52\xf8\xb4\xb0\xbb\x77\xb8\x86\x76\xae\x03\xd6\x1a\xcf\x11\x1c\x68\x36\x1b\x03\xd3\xbe\x18\x3f\xb2\xc7\x9a\xc6\x24\xcc\x29\x61\xdb\x87\x12\x98\x0e\x24\xe1\xbf\x16\x58\xb0\xb3\x45\xb9\x39\x32\x0f\x32\x65\x4a\xa2\x34\xb7\xbb\x9d\x69\xf2\x12\x98\x71\xc4\xc1\xb5\xad\xd3\x47\x0b\xf5\x64\x72\x0b\xa7\xdb\x94\xd5\x31\xeb\x33\x63\xdf\x18\x67\x9a\x17\x60\xfd\x06\x5e\x44\x02\x75\x07\x2b\x35\x44\xcd\xbe\x5b\x57\xa5\xc3\x15\xb4\x3a\xe8\x23\x52\xfa\x6c\xe0\x18\x90\xca\xd6\xbf\x50\x02\x71\xb6\x01\xc6\x1d\xb6\x65\x65\xe8\x50\xd6\x06\x09\x84\x25\x5d\x59\x18\x18\x0c\xdb\x72\x7b\xfc\x6b\x0d\x03\xf0\x35\xda\x45\x99\x93\xb8\x39\x38\x83\xc2\xa8\xf5\x91\xd9\xee\x16\x78\x7a\xfd\xe3\xd2\xea\x6b\x09\xe4\x00\x77\xe7\xc8\xa9\xca\x6c\xda\x39\xad\x97\x6f\xd5\xce\x68\x98\xa2\xdd\xea\x56\xc1\x5a\xe5\x8b\x26\xde\x22\x45\x22\x4d\x51\x88\xd4\xae\x73\x2d\x3e\xd9\x39\x53\xe1\x96\xd7\x7c\x08\xe1\x0c\xf5\x4e\x0e\x72\xa1\x96\x2d\x72\x75\x5f\x19\x7c\xd1\xd1\xcf\xa8\x87\x1f\x4c\x6d\x1a\x10\x88\x07\xe4\x4c\xee\x69\xf4\xb4\x10\xa9\x9e\xc2\x28\xc3\xc6\x95\xcf\x35\x70\x01\x77\x4e\xeb\x39\x51\x3a\xd8\xea\xef\x46\x6d\xf5\x4b\x32\xa8\x2f\xaa\x35\x1c\x27\x6c\x0b\x39\xdf\xe1\xdf\xcc\x75\x16\x5a\x37\x9e\x10\xd4\xc4\xe4\x1a\x47\xf6\x1e\xab\x1a\x24\xcd\xf1\xb3\x22\x35\x22\xef\x80\x5e\x7a\xba\x6f\xec\x73\xa3\x77\xca\x81\x90\x55\x05\x6e\xdd\xb0\xe8\xf9\xa5\x60\xc0\x4b\x59\xe0\xb1\x06\x4e\x89\xfc\x0a\xf3\xe9\xb1\x5f\xaf\xb0\xc6\x2d\xd4\xfb\xae\x1d\x69\x1e\x8a\x47\x55\x82\x51\x60\x9b\x10\xde\x90\x75\x7e\xc5\x2d\xe6\xba\xc6\xa3\x81\x6d\x30\xcf\x74\x7d\x24\xfd\x84\x01\x22\x6a\x8d\x79\xd6\x4d\x51\x19\x47\x67\xec\xba\xf5\x9f\xa0\x53\x30\x07\x98\x9a\x86\xb4\x65\x6b\x48\x31\xd8\x4e\x78\x31\x2e\x40\x21\x61\xc3\xfb\xa6\xac\x71\x79\x54\xf7\x85\x82\x03\x68\x0c\x69\x4b\x5d\x0c\x55\xa3\xac\xf3\x72\x4f\x4a\x85\x64\xb0\x4c\x1d\xb6\x68\x53\xbc\x6d\x81\xe1\x65\x0d\x0a\xdb\x91\xa5\xc0\xa5\x1b\xb3\x01\x91\xaf\x73\x3c\xdc\x37\x0b\x75\xf1\xf0\x70\xbb\xbc\xbc\x78\xbf\xbc\x5d\xae\xbe\xa8\x8b\xfb\x2b\x75\x75\x7d\xb3\xbc\x5f\xae\x96\x9f\xee\x9f\x06\x92\xae\xf7\xfb\x0a\x8d\x20\x5a\x0e\xd8\x32\xb3\x24\xda\x23\xde\x3a\x88\x04\xfd\x08\x2a\xd8\xed\x32\xe6\x3d\x68\x5a\xab\x81\x0e\xd8\x1c\xf0\x17\x66\x53\xfb\x4a\xe7\xb8\xc5\x23\x9d\x4b\x1e\xdc\xc0\xd6\x56\x28\x4e\x4e\x8b\x09\xf1\xbc\x8e\x56\x07\x0c\x5d\x4d\x12\x07\xef\x01\x37\x77\x6e\x68\x3f\xc1\x9a\x74\x20\xeb\x61\x29\x90\x1b\xd4\x10\x8d\xf4\x55\xc5\xab\x03\xa8\x3c\x1c\x90\x3d\xea\xaa\x3d\xbe\x22\xe1\xaa\xbc\x96\x74\xb5\x3f\x7a\xd8\x45\xd1\x35\xe2\x6e\x44\xb8\x69\x2b\xb8\xc9\x84\x02\x34\x5b\x25\x5b\x09\x07\x22\x0b\x6f\x02\x27\xc0\xba\x2c\x14\x5a\xf8\xb9\xf7\x88\x73\x14\x7c\x70\x04\x19\xb3\x3f\xb0\xd0\x21\xa5\x91\x8f\x38\x39\x1c\x09\xb1\x8f\x9c\xa4\x18\x88\x3d\x6b\x33\xa9\xaf\x10\x0b\xd4\xa2\x05\xc4\x47\x45\x01\xe6\xcb\xb1\xf4\xcc\x8f\xb6\x9b\x2f\xd4\x17\xdb\x29\x9d\xe7\x66\xcf\x72\xef\x35\xbd\xdc\x28\xf8\x9d\xd8\x9d\x89\xa5\xc6\x65\x13\x93\x8e\xa3\x69\x8b\x78\x8c\x64\x53\x1b\xf3\xcf\xae\x6c\xf0\x34\xc8\x59\x3a\x72\xe5\xcc\x80\x78\x6c\x95\x3e\x80\x38\x5d\xa8\xf9\x1d\x19\x4e\xa0\x45\x9c\xfe\xdc\x6f\xe1\x2a\xd8\x38\xb2\x87\xb8\x79\x5a\x47\x44\xc3\x2b\x6e\x18\x86\x6a\xa5\xf6\xb6\x61\xb1\xdd\xf4\xbd\xc9\x1e\x57\xf0\xae\x39\xf3\xee\x67\x60\xb5\x81\x3d\x3f\xa1\x07\x80\xe3\x77\x95\xe6\x43\x25\xb6\xb3\xb4\x56\xe0\xaa\x3b\xfd\x6c\x98\x6e\xef\x80\x8e\xe8\x8a\x5a\x22\x9c\xb8\x5d\x83\x21\x29\x50\xf0\x41\xfb\xca\x6f\x4c\xd5\xa6\x01\x9a\x5f\x89\x32\x3b\x93\x7b\x12\x7b\xf4\x8b\xc1\x47\xd3\x64\xbe\xe5\x55\xe7\xc0\xea\x83\x9e\x12\x9d\x38\xb0\x31\x15\xd3\xb9\x2d\xf7\xbd\x63\x46\x77\xe6\x68\x21\xf2\x73\x6e\x3c\xb3\xed\xfd\xfd\xff\x60\xc4\x0b\xda\xfc\x2a\xd8\x99\x33\x4b\x06\x99\x96\x00\xea\x99\x52\x77\x4e\x02\x13\x54\x11\xd9\xc0\x5c\x27\x05\x45\xab\xba\xc1\x49\x8a\x12\xcc\x4d\x2b\xa4\x92\xe3\x81\xdf\x07\x2b\x2c\xd4\xd9\x6a\xdb\xb9\x0c\x05\xaa\x47\x1b\x99\x1b\xb5\xd7\x0d\x00\x9f\x00\x59\x70\x07\x40\x03\xb8\x35\xd8\x71\x0e\x6f\x69\x35\x62\x37\x0c\x38\x92\xed\x35\xdf\xc0\x34\x78\x1b\x12\x5f\x5a\x9c\x93\x42\xf5\xb8\xc6\x44\xaf\x19\x25\xb1\x65\xdd\x28\x30\x04\xad\x6d\x40\x08\x2a\xdc\x6a\x2d\xb3\x07\xb6\x7b\x16\x79\x91\x19\xf0\x88\xd1\xd5\x46\x55\x60\xbf\x01\x74\x45\x90\x92\xa9\x3d\xa0\x07\xeb\x2c\xfc\x93\xe3\x9f\x60\xbf\x69\x11\x18\xbf\xb7\x15\x98\x00\xfc\x03\x4c\x2e\x19\x03\xb1\xff\x22\xd4\xbb\x05\xe3\xbd\xf9\xb2\x7e\x01\x88\x03\xd6\xc8\xef\xda\xcd\x15\xfa\x96\xdc\x34\x78\x26\x63\xae\x78\x6b\xde\x96\x2d\xf8\x12\x1a\xcb\x7e\x18\x69\xce\x50\xdf\x19\xc9\xb4\x5b\xc1\x91\xe3\x15\x32\x0f\x1e\xc4\x1a\xd2\x71\x82\x79\x4d\xbc\x62\x7a\x7a\xc0\x0f\xa3\x5d\x62\x64\x53\xbb\xba\xdc\x00\xab\xbd\xc0\xa3\x0b\xa5\x13\xdb\x94\x3c\x8d\x5e\x5b\xc2\x09\x1b\xd0\x66\xaf\x12\x71\x47\x30\xa2\x1e\xc3\x62\x14\xd3\x75\xba\x29\xdc\x53\xd8\x04\x1b\xd1\x68\x39\x40\x44\x44\x7c\xd5\xbf\x4c\x63\x27\x76\x4b\x34\xf6\xf6\x14\xc8\x04\xb3\x5f\xb7\x68\xf0\x50\xb2\xc6\x6f\x32\x81\x68\x19\x0c\xf1\x19\x20\xaa\xf1\xe7\x76\x89\xe2\xaf\x56\x20\xce\x83\x03\x03\x34\x02\x92\xbe\x07\x18\x0d\x86\x84\x35\x15\x06\x31\x67\x71\x1c\x68\xb3\x3f\xa8\x1b\x32\x1a\xc9\x4c\x28\x39\xef\x75\xfe\x35\x7d\xf6\x7f\x79\x58\x17\xa3\x25\x89\x81\xa8\x2e\x88\xd2\x01\x68\xfe\x82\x16\xb8\x70\xec\x48\xf4\x90\x98\xe1\xe8\xb7\x32\x9c\xed\xe5\x0a\xad\x2a\xe8\x39\xfa\x36\x8e\x0e\x4e\xd8\x79\x98\x26\x07\x33\x62\x5e\x35\x46\x17\x1a\xf1\x35\x7b\x9f\xc6\x10\xb2\xaf\xc5\xd9\x6a\x44\x30\x3b\xf4\xaf\x24\xca\x6e\x6f\xf2\x60\xca\xc9\x12\xbf\xe8\xb2\xa2\xd7\xc5\xfc\x3d\x0b\xd0\x65\xd7\x28\x38\x03\x06\xba\xae\x6c\xb5\x87\xf1\x8d\x79\x29\x9d\x77\x2d\x01\x65\x83\xb3\xd3\xe8\xb5\x60\xc4\x01\x51\x9a\x58\x65\x9a\x11\xbc\x2c\x1d\x21\x06\x10\x96\xed\xf0\x19\xce\x54\xee\xe8\x84\x11\x72\x5b\xe4\x38\xec\x76\x5f\x7e\x33\x15\x58\x55\xff\xde\x1e\x24\xa2\xf5\x40\x35\xbe\x59\x34\xfa\x00\x24\xc0\x40\xc7\xa0\xb5\x40\x3f\x10\xf7\x23\xbf\xcb\x8a\x7c\x18\x93\x9b\x29\xeb\x7d\xc7\xd6\x1f\x09\x64\x76\xb5\xe2\x2b\x36\xec\x2f\x2c\x19\xcb\xe0\xf2\x90\x77\xe8\xf1\x14\x0a\xbb\x69\xe9\x8c\xf8\xbd\xbf\x38\x35\x4a\x11\x1d\x2e\x45\x40\x64\x95\x19\xeb\x1d\x4a\x38\xa4\x44\x06\xc0\x08\xf0\x54\xf1\x08\x77\xba\xf9\xda\xed\xc9\xa0\xea\xb5\x43\xc0\xc9\x7e\x80\x9f\x6e\xc9\x76\x81\xc6\xe9\x06\x66\x79\x66\x4b\xd0\x6e\x0f\xe8\x39\x18\x91\x80\x75\x6f\x80\xe7\x68\xb1\x1d\x40\x10\x12\xa9\xc4\xbf\x23\x74\x44\x91\x42\x06\x88\x4d\x49\xe8\x41\x10\xc5\x67\xe6\x89\x1a\x8f\x41\xe7\xd5\x83\xf0\xb8\x52\x0b\x36\xa1\xc4\x80\x7a\x67\x3b\x44\x21\xac\xd1\x81\x0f\xfe\x60\x70\xaa\xbe\x0e\xc0\x43\xf0\x00\x15\x4c\x37\xff\xb4\xd7\x40\xef\x1c\x14\xe5\xfa\x9b\xc6\x10\x4d\x82\x80\xc8\x70\x3a\x01\x5c\x36\x25\x47\x32\x0c\x80\xe9\xab\xae\x20\x84\x0c\x0c\xbf\x78\xba\x5c\x2e\x63\x70\x2d\xdc\x03\xfd\x2c\xeb\x8d\x95\x73\xe3\x09\x33\x75\xab\x57\xe6\x8f\xc1\xb3\xa7\x0f\x77\xb7\xc8\xd0\x3f\xe0\x9f\x8e\x54\x41\x8b\xca\xf4\x84\xf0\x6a\x75\xc5\x92\x87\x0c\x00\x7b\x5d\xbc\x02\x43\x8b\x73\xe0\x1b\xae\xc4\x4d\xa8\x8f\xab\xbb\xdb\x4c\x3d\x80\x2d\x78\xca\x9b\x72\x4f\xe7\xf4\x70\x75\xd3\x0f\x1f\xb7\x1d\xa0\xd9\xde\x41\x2d\x54\xca\x85\x36\xe5\x7f\x72\x3e\x71\xdf\x0f\xf7\x1f\x32\xf5\xc7\xe5\x0d\x91\xf3\xf7\x87\x0f\x0b\xc5\xfc\x1c\x0d\x04\x4d\xdb\xa3\x58\xa3\x77\xf1\xbf\x31\x98\xe1\x90\x01\xa5\x83\x26\x41\xcd\x42\x95\xad\x61\xcb\x20\x35\xe9\x7b\x68\xd1\xf0\x41\x0e\x00\xda\xa2\xfb\x4f\xf9\x45\x31\x15\xc5\xcd\x64\xd8\x56\x57\x1e\x52\xca\x0b\x64\x58\xac\xad\x9c\x38\x8c\xd6\x1b\xa5\x94\xb5\x5e\xa1\x4d\x30\x84\x3c\x08\x29\x3a\xc5\x51\x98\xbf\xe8\x24\x3c\x62\xa3\xd1\x27\x93\x28\x03\x79\xc0\x83\x96\x40\xcf\xd1\xf6\xbc\xc3\x5a\x21\x5e\x50\x0f\xc0\xde\x39\xdb\xe1\x8c\x85\xbc\x17\x5a\x66\x1c\x42\xd1\xd0\x3d\x9e\x44\xd9\x3a\x53\x6d\x00\xe9\x00\x5a\xe5\xc8\x64\x63\xd1\x4d\x13\xf6\x27\xf3\xa7\x65\xab\x10\x57\xb3\xc6\x62\xb8\x96\x21\x5a\x2a\xd7\x9c\xb9\xc1\x6d\x82\xe5\x40\x15\xea\xc5\xaa\x1c\x45\x48\xec\x08\x68\x5a\x37\xde\xd5\x45\x02\x16\xea\x26\x44\xb1\xf0\xa3\x3f\x53\x3e\x82\xc2\x12\x87\x29\x17\x41\xf1\x76\xa4\x5b\x33\xb5\xd9\xc4\xbe\x25\x4a\x04\xa3\x56\xe3\x92\x44\x1f\x3a\x33\xe0\x25\x88\x36\x0a\x21\x13\xa3\xc5\x3c\xf9\xf0\x07\x40\x35\x2d\x90\x61\xfe\x09\x4e\xc2\xfb\x90\x35\xec\xb4\xa6\x60\x45\x06\xaf\x6d\x11\x5c\x1f\x59\x0a\xf4\x8e\x1e\x22\xcd\xaf\x6b\x9a\xa5\x50\x7f\x7c\xf9\xaf\x79\xf0\x88\x1c\x53\x80\xb5\xe9\x00\x28\x8d\xfc\x66\x82\xf8\x7c\xc0\x83\x29\x02\x20\x03\x6c\x2e\x48\x16\x4c\x85\x72\x12\x70\x3c\xfe\xcd\x98\x1b\xde\xde\x1a\x47\x99\x32\x7f\x6c\x11\x8e\x84\x30\x28\xbc\x31\x0a\x84\xd4\xd9\x47\x44\x3f\xf8\x33\x99\x01\x27\x42\xe3\x9d\x71\xd8\x17\x6e\x40\x21\xb1\xf0\x07\x0a\x13\x47\xb6\x24\x31\x18\x82\x5e\xe4\x5f\x6b\x7b\x80\x6d\x3f\x73\x72\x0a\x82\xdf\xf9\x15\xf0\x50\x02\x33\xfc\xf3\xba\x2e\x40\x8e\xc3\xcf\xb0\xcc\xfc\x23\x01\xf7\xe3\x1c\x91\xbe\x55\xf3\x07\xc9\xfb\x11\x73\xe8\x5c\xe7\x6c\x45\x29\xb4\xf7\x94\x1c\x10\xb4\x61\x48\x2b\xc1\xec\x04\x02\x61\x93\xdd\x82\x04\xee\x24\x05\x71\xe2\x78\x20\x5e\xb6\x82\xd9\x2d\x0b\x6f\xc4\xb2\xa2\x58\x3d\x28\xea\xed\xd0\xef\xe4\xc2\xc0\xbb\x5e\x81\xd3\x02\xa3\xbd\x43\x97\x54\x13\xe3\x6d\x0a\xe6\x58\x8e\x29\x4b\x10\xf0\xdc\x74\x72\x25\xdd\x05\x61\x60\x77\x62\x15\xc2\xa2\x31\x8b\xc9\x60\x5a\xe8\x2a\xd8\x43\x4a\xb2\x87\xb5\x2d\x2e\xc7\xf9\x6a\x32\x89\xda\x49\xb8\xe2\xc8\xed\xe2\xdc\xc8\x84\x03\x2f\x08\x24\xbd\x23\x85\x63\x61\x41\x57\xe0\x3d\xb0\xc7\xa4\xa7\xa8\x43\x26\x91\xbe\xc2\xb2\x2f\xb6\x64\x63\x8c\x8e\xbf\xb6\x92\x65\x56\x96\x6d\x00\x9e\x54\x50\xaa\x04\xc4\xce\x66\x6f\x17\xea\xb7\xeb\xc7\xf7\x17\xab\xe5\x9d\xba\xfc\xf4\xf0\x65\x79\xff\x61\x36\xc3\xec\x06\x07\x03\xe3\x84\x7d\x1f\x23\xf7\x73\x51\x7f\x2d\x1b\x9d\x49\x2e\xd1\x14\xe3\x53\xca\x06\xe9\x2a\x3e\x5a\x17\x8d\xbc\xcf\xb4\xc8\x99\x4b\x1e\xeb\xaf\x1c\x34\x1d\x26\xa2\x62\xb1\xfd\x48\x7b\x55\x09\x2a\x48\x60\x21\x4a\xbb\x2e\x0a\x64\xa2\x95\xed\x84\x14\xd4\x01\x06\x38\x8b\xe9\x7c\x9e\x7d\xa2\xba\xc0\xb9\x21\x1f\x6d\x53\x5a\xcb\xe4\xdb\x9a\xc2\x57\x38\x06\xac\x07\x10\x69\x76\xcd\x59\x43\x6f\x6b\x1a\x5b\x49\xde\x42\x93\x8e\x20\xe8\xec\x1a\x9f\x8f\x39\x26\x26\x51\x70\x0c\x69\x25\xd6\x30\x7a\x09\xa6\x85\xfa\x08\x71\x1f\x10\x98\xc9\x80\xa3\xcf\x53\x21\xb4\x06\x02\x05\xf1\xd7\x98\x35\xc1\x6a\x0a\x03\x54\x9e\x93\xa2\x3b\x7c\x2d\x39\x6f\x0d\xf6\xab\x81\x51\xa6\xb6\xdd\xf3\x56\xd5\x9d\xcf\x9b\xa5\x64\x60\x5a\x5d\x57\xce\x8a\x65\x1c\x66\xee\x30\x92\x13\x9b\xf0\xf3\x22\x8a\x17\xbd\x51\x19\x4a\x9a\xf0\x21\xc4\xbc\x1f\x25\x98\xc7\xc9\x3f\x8a\x81\xf9\xb0\xfc\xf6\x02\xda\x02\xa2\x01\xd3\x1d\xfd\x5e\x66\xb3\x9f\x17\x5e\xa4\xd5\xf2\x5e\xfd\xe7\xe7\x8b\xfb\xd5\x72\xf5\x65\x36\x93\x4d\x4a\x36\x28\xf8\x6c\xd9\xd0\x59\x60\x07\xd2\x8d\xa2\xad\x7d\x0e\x67\xb7\x23\x85\x26\x9d\x8b\x6f\xbd\x50\xee\x67\xe0\x66\x32\xe1\x14\x9e\xdb\xce\x36\x14\x6a\xd6\xea\xcd\xeb\xd7\x51\x94\x93\x04\xd3\x40\xaa\x83\x33\xef\x85\xae\x81\xd3\x60\x6f\x2a\xf2\x61\x51\x18\x80\x52\x26\xc4\x23\xb4\xa6\x01\x3d\xcb\x21\x7c\x6d\x2a\x56\xe1\x80\x21\x50\xe8\xd9\xa8\x24\xb3\xbf\x9b\x8a\x9f\xd9\x76\x50\x36\x8e\x67\x67\xda\x87\x41\xb5\x1f\xb8\x86\xe7\x3c\x6e\xa1\xde\x83\xea\x78\x8a\xa2\x74\x4c\xd0\x13\xd3\x06\xa4\x77\xae\x9f\xa7\x13\xae\x3a\x13\x04\x74\xd5\xa7\x88\x27\x97\x48\x97\xc9\xed\x70\x7f\xe4\xdd\x29\xea\xc4\xed\x52\x5c\x1d\x50\x04\x7b\xfe\x7f\x76\x64\x9e\x12\xa0\x02\x44\x61\x34\x0b\x98\x32\xea\x30\x1a\x02\xb6\x02\x01\x76\xc9\x6e\x65\x73\x68\x45\x0a\x16\x52\x90\x36\x51\x54\x5a\x98\xb5\xcb\xa5\xc5\x8e\xf8\x1e\xa5\x2c\x2a\x8b\xe1\x02\x6d\xf9\x18\xea\x70\x09\x8d\x43\xe4\x42\xf1\x03\xe8\xaf\x63\x47\xec\x52\x05\xc9\x3c\x2a\x6f\xc1\x80\x48\x9e\x27\xad\xad\x72\xba\x5f\xa2\x4b\x2a\xc7\x81\x42\xa2\x92\x48\x3e\x47\x44\xae\x20\x44\xc3\xc0\x24\x58\x73\xe4\x33\x1a\x4f\xc0\xe2\xe0\x67\xaa\x0e\x18\x66\x3b\x32\x62\x98\x9a\x0a\x82\x85\x07\x28\xe5\x23\x8a\x76\xf1\x30\xca\xc6\xa1\x13\x22\x36\x60\xaa\x46\x9d\x69\xf4\x5b\x35\x79\xc5\x0d\xa1\x06\xed\x6c\x0d\x40\xfe\x78\xee\x39\xab\x73\x2a\xf4\x24\x12\x87\xf6\xb1\xac\x3b\x23\x94\xd2\x94\x88\x73\x8b\x3f\x75\x8e\x8c\x21\xf0\xbc\x18\x29\x76\x3f\xf3\x2e\x51\x4e\x5a\x67\x4e\x78\x7b\x52\x5b\xa3\xd6\x09\x56\x14\x54\x32\x91\x78\x19\x04\x9b\x68\xe0\xac\x97\x06\x03\x83\x13\x12\x8e\x84\xc9\xc8\xa8\x71\x8d\x6f\x7a\x14\x55\x13\x77\xc0\x4d\xd3\xbc\xaa\x4d\x4b\x09\xfd\xca\x0a\x3c\x00\x35\xd8\x25\xf1\x93\x4f\xd8\xc8\xb8\x57\x1c\x8d\x4a\x65\x03\x51\x01\xfa\x01\x47\xc7\x56\xd8\x43\x5d\x59\x5d\xa8\x74\xcc\x2b\x1f\x9a\xfa\x19\x50\x37\x5a\x9b\x53\xfc\x25\xb5\xd0\x76\x62\x93\x23\xc3\x47\x25\x1f\x78\x0a\x7a\xc1\x89\x5f\xd2\x9b\xe0\x5b\x3a\xb1\x5c\x95\xa4\x94\xf7\x5c\x03\x0a\x7c\x6e\xd1\xa7\x45\xb1\x00\x2a\xba\x82\xb3\x4a\x66\xef\xb2\x88\x48\x29\x54\x88\x07\x2c\x09\xd1\xfe\x29\xc3\x00\xd0\x73\x44\xa1\x47\xaa\x32\x81\x91\xed\x1a\x93\xc0\x8e\xd1\x6e\x0e\x25\xd8\x0b\x86\xb2\x30\xa2\xf3\x5c\xa3\xc2\xb5\x2f\x72\xb2\x2b\x0a\xe7\xd0\xc1\xfc\x15\xfe\x88\xc9\x42\x92\x76\x75\xc4\x60\x48\x6f\x5a\x71\x66\x15\x3e\x07\x45\x34\x23\xe7\x5a\xf7\x4e\xfb\x2c\xd4\x06\xa8\xb2\xde\x90\xc7\x85\x57\x60\xae\x67\xaa\x42\x53\xca\x0d\xc2\x92\x2a\xba\x1c\xcd\xb9\x34\x49\x45\xc5\x62\x16\xaa\x83\x24\x31\x61\x7e\x4e\x93\x22\x24\x45\x54\xe2\x95\x3d\x8b\x88\x87\xc2\x9d\x5c\x12\xcd\x27\x0a\x23\x07\x03\xbc\x59\x9b\x8d\x25\x20\x15\x39\x8f\x56\x0c\x34\x9a\x71\xc2\x10\x20\x10\xdf\x9f\x4b\x36\x6c\x3b\x94\xa4\x2d\x05\x83\xf0\x54\x60\x20\xad\xcf\xb6\x1a\x98\xb9\x2f\x88\xbb\x2f\xd2\xd3\x32\xa0\x01\x76\xf5\xb7\x85\xba\xfb\x74\xb5\xbc\x59\x5e\x5e\x48\x0d\xf5\x7b\x70\x55\xab\x61\xc5\x6c\xb4\xad\xc9\x62\x23\x86\x42\x3e\x73\xfd\x96\x26\xfd\xd9\x83\x8f\x3e\x7a\x45\xe2\x25\x4f\x4c\x73\x8c\x96\xe3\xe9\x63\x7c\xd9\x87\xbb\xa1\x70\x32\x7a\x6f\x03\x92\xe8\xc3\x62\x00\x87\x23\x77\x90\xb1\x7c\x32\x74\xc0\x81\x3d\x55\x40\x8a\x7b\xe9\x3c\x79\x7b\xb4\x0c\x9c\x03\x44\xc4\x04\x69\xf7\xd6\x39\x2c\x74\xfa\x26\x06\x2e\x0b\x82\xe2\x46\x1f\x97\xe8\x69\x61\xc5\x09\x51\x99\xcb\xf9\x74\xc3\x70\x81\x77\x10\xb0\x2f\xd4\x67\x17\x9a\x2c\x62\x0e\x01\x9c\x01\x36\x75\xd4\x3d\xbf\x58\x6e\x50\x98\xce\xb1\xbc\x45\x03\x71\x57\x60\x73\x5b\x36\x77\x5c\x2c\x1b\x32\x02\xa7\x91\x9f\x05\x91\xef\x31\x33\x8d\x4e\x4a\xe4\x08\x60\x9d\x84\x87\xe4\xa0\x7c\x61\x0d\x04\xf9\x40\x05\x89\xfa\x88\x05\x64\xef\xa4\x84\x52\x89\x98\x4f\x95\x20\xcf\x23\x4c\xf0\x36\x8d\x50\x2b\xd3\x2d\x9d\x06\x7d\x32\x7c\x3d\xcf\x42\x74\x53\xd6\x3e\xbb\x1e\x91\x0e\x6c\xce\x8f\x44\x95\x71\x49\x49\x78\xa1\x66\xef\x17\x20\x37\x2e\x04\x75\x91\x91\x84\x26\x44\x6b\x33\x32\x40\xd4\x62\x03\x1b\x83\xf7\x1d\x89\x33\xb8\x73\x34\x83\x68\x14\x87\xbd\x38\xf2\x62\x52\x27\xed\xd7\x79\x4f\x1c\x2c\x2a\xf6\x33\x77\x59\xb0\xf2\x7a\x03\xb8\x41\x65\xf7\x15\x57\xdf\x42\x71\xd2\xa8\x9c\x21\x40\x23\x41\x73\xe3\xd1\x74\x4e\x65\x4b\xee\x6b\x63\x0e\xa4\xa6\xba\xa6\x15\xce\xa9\x9b\x80\x1c\x1a\xc2\x27\xaf\x82\x28\x9e\x22\x0a\x62\xfb\xc0\xd0\x71\x9c\x3f\xbb\x5c\xa8\x27\xf2\xb8\x3d\x06\x52\x8a\x8b\xd2\x08\x78\x78\xc3\x4a\xf1\x29\xbd\xc9\x46\x58\x15\x16\xb8\x5a\xa8\x90\x56\x11\x98\x3d\x8e\x65\x47\x26\x4d\xcd\xae\x17\xea\xa2\xc0\xf0\x1d\x63\x57\xca\x9e\x22\x95\xc3\x37\xe9\xb0\xc8\x1b\x0c\xea\xf0\x1e\x06\x89\xfd\xb7\x21\x68\xec\xad\x0b\xeb\xdc\xa0\x2e\x13\x7c\x01\xc6\xee\x28\xb4\x69\xa9\x58\x12\x3c\xd5\x54\xe4\x3d\x8c\x4e\x40\x32\xbd\x5d\x12\x74\x91\x34\x2e\x84\x56\x8e\x93\x96\xb0\x3d\xd5\x57\x12\x8a\x73\x98\x98\x44\x45\x3d\xd4\xfe\x09\x70\x07\xc2\xc4\x6e\xc7\xa9\x30\xd8\xc9\x87\x84\xd3\xbe\x86\x3e\x20\x33\x04\x03\xa8\xd4\x6e\xba\x78\x2b\x2d\x77\x02\x7d\xd3\x98\x06\xd5\x2f\x2c\x7f\x32\x52\x03\x4a\x3e\x06\x9e\x92\xfb\x02\xa5\x6e\x29\x57\x14\xb1\x51\x9a\x1b\x98\x2d\x13\xc2\xc9\x62\x88\x6d\x09\xa9\xb2\x90\xa7\xcb\x92\x1d\x02\x41\x2b\x4e\x97\x52\x29\xb1\xa0\x68\xa2\xc4\x88\x00\xfe\x0b\x5e\x15\x21\x09\xb9\x61\xaf\x83\x21\x88\xc8\x08\x8b\x40\x34\x6a\x0e\x51\xa9\xfa\xad\x7d\xa7\x3c\x83\xf6\x5c\x18\xd9\x1b\x5f\x05\x6e\xa4\xa3\xeb\x3b\xbb\x18\xb2\x30\xc3\xe6\x41\xd6\x41\x13\xc8\x1e\x51\xfb\x7d\x4a\x63\x40\x94\x50\x18\x78\x24\x16\xb1\x45\x9c\xa8\x59\xab\x88\x47\x85\x71\x39\xb8\x47\xbf\xde\xd4\x76\x05\xd9\x09\xc9\xc1\x78\x53\x15\xb5\xa6\xd3\xfe\xfb\xe0\xf8\x86\xa0\xdc\xfb\xaf\x6c\x5a\x80\x48\x85\x45\x69\x22\x1c\xd7\x7f\x01\x54\x53\xc8\x5c\x7e\x35\x54\x18\x9c\x5a\xf9\x84\xc8\xf2\x8a\x23\x6f\x08\xb2\x73\xc0\x0a\x21\x55\xb7\x6d\xed\x93\xa0\x52\x92\x96\xe6\x31\x99\x2a\x9e\xa5\x1c\x73\xf4\x7b\x10\x3b\x63\x23\xca\x38\x34\xa1\xbc\x36\x3d\xe3\xa6\x2e\xdd\x6b\xc2\x0b\x9e\x02\x8d\x19\x9e\xb8\xf3\xb0\xb2\x9f\x5d\x94\x7a\x09\x16\x50\xbf\xef\x37\x4d\x74\xb0\x6d\xd2\x01\x36\xe1\x43\xff\xc1\x45\x10\x2a\x47\x8e\x84\x76\x94\x58\xa7\xc4\x79\x3f\xb5\x3e\xce\x9b\x7b\x12\x64\x3e\x11\xda\x9e\x75\x8a\x7a\xee\xdd\x82\xd4\x42\x73\xc3\xe9\x20\xf2\xd9\x1b\x8e\xff\x42\x9a\xaf\x66\x38\x87\xe4\x0e\x08\xf3\x85\xb2\x22\x92\x26\xc7\xdf\xfa\xf6\xb8\xd9\xed\x84\x33\x9a\xb0\x80\x23\x49\x8b\x26\x8c\x49\x2f\x1b\xae\x72\x50\x37\x5c\x78\x42\x0d\x33\x8b\xd0\x5d\xc4\xa8\xdf\x29\x69\x21\x46\x8b\xfa\xa2\x2b\x9f\x75\xc5\x98\x23\x49\xa3\x53\xfb\x52\x9f\x69\x61\xc2\xd9\xdd\x42\x5d\x19\x8a\x34\xa7\xcf\xa8\x57\xd9\x08\xad\x88\x6e\xd0\xe5\x94\xa6\xe9\x4f\xe0\x17\x58\xeb\x1e\xd6\xb2\x12\x11\x09\x6a\x83\x35\xcd\x37\x82\x9c\xcf\x91\x36\x4a\xfb\x9f\x20\x41\x71\x2f\x18\x96\x73\x41\xab\x29\x25\x9e\x66\x9f\xa6\x7a\x61\x60\xe5\x4f\xe9\xe1\xc0\x98\xa9\xfc\x7e\x4c\xce\x8c\x6c\x95\xec\xcd\x91\x59\x9f\x6a\x97\xe3\x06\x37\xee\xaa\xcb\x7d\x39\x04\x53\x5e\xd4\xa0\xe3\xa6\x3a\xa1\x92\xe6\x35\x34\xe9\x21\xdf\x25\xdd\x80\x02\xaa\x52\x49\x09\x09\xe6\x96\x61\x09\x87\xf2\xb1\xd9\x88\x6b\xab\x48\x08\x43\x3c\x0e\x17\x02\x85\x1a\xa1\x65\xec\x44\xb2\x1c\x51\x94\x68\xf5\x8b\xa2\x27\x67\x1e\xd9\x54\x84\x7e\x27\x1d\xf9\x89\x43\x9e\xf0\xd8\x6c\xe9\x64\x62\x8a\x64\xd6\xc3\x28\x23\x96\x63\x06\xe2\x99\xe4\xae\xd1\xb3\xfc\x48\x3c\x93\x58\xb1\x6c\xc7\x9d\x81\x18\x8e\x9b\x64\x3c\x6e\x8d\x18\x39\x3a\xef\xf5\x91\x5a\x4c\xd0\x84\xa3\xf2\x00\x8a\x7f\xf5\x8a\x52\x74\x5c\xf9\xcf\xd8\x73\x85\x49\xf6\xc6\x70\x6f\x0e\x48\x07\x69\xa4\x64\x2e\x48\x8f\x63\x67\x08\x62\xcd\x17\xae\x63\x61\xdf\x49\xf3\xac\xeb\xf2\x5f\x6c\xc0\x05\xdc\xb2\x1f\x2e\x5b\xee\xa9\xef\xb7\x9e\xe9\xd0\xcb\x30\x62\x8b\x34\x6c\xe1\xa8\x6e\xcf\x79\x42\x6e\xc9\x2f\xb8\xc4\x3d\x4a\x36\xfb\x16\xa9\xd1\x8b\xbe\x29\x8a\x5f\x1b\x64\x9e\x33\x2f\x17\x86\xef\x06\xa4\x22\x92\x62\xb9\x93\x06\xe0\x13\x66\xf3\xd1\xf4\x26\xeb\x8e\x9a\xba\x38\x46\xa5\xdf\x4e\x75\x70\x15\x52\x0d\x3c\x4b\xd2\x36\xd2\x77\xc3\x67\x22\x17\x1c\xce\x59\xb2\x6a\xc3\xc1\xd8\x71\xdc\x4d\xa7\x2b\xcc\x26\x1e\xa3\x82\x6b\xc9\xbf\xfa\xc6\x21\x95\x14\x47\x28\x3f\xea\x7d\x7b\x75\x8c\x74\xa0\x62\xc2\x50\x3c\xd7\x48\x45\xb8\x65\x11\x66\x60\x22\x38\xf1\xde\x50\xde\x95\xaa\x4c\x98\x46\xde\xea\x6a\x03\x3b\x8e\x3a\x4e\x3d\x85\x84\xa6\x48\x31\x7e\x25\xe1\xf5\x3f\x36\x86\x10\x03\xbb\xe8\x8a\xd8\x85\x61\x28\xf5\x9a\x96\x39\x88\x7e\x12\x20\x04\x3b\x12\x40\x49\xf4\xe5\xdc\xd7\x57\x70\x6e\x25\x4c\x25\xb5\x61\x96\xc5\x33\x69\xb3\x0d\x2f\x9d\x8d\x6b\x2f\xbe\x97\x61\xdd\x4f\xb6\x70\x16\x6a\x32\x56\x01\x4b\x83\xd1\x9f\x4b\xf0\x19\x72\x86\xda\x40\x1a\xb9\xc8\x63\xb8\x73\x0a\x0b\xb4\xc7\x54\x6d\x49\x17\xe0\x58\x47\xe2\x35\x9b\xfd\x82\x05\xa8\xbb\xf7\xcb\x7b\x2c\x41\x5d\x7d\xba\xfc\x7c\x77\x7d\xbf\xea\x25\xac\x76\x80\x47\x07\xa8\x87\x2f\xfc\x90\xf5\xf1\x1d\x75\xdf\xed\x44\xcc\x46\x71\x15\xe9\x29\x3b\x3e\x6f\xa0\xfe\x26\xdd\xa3\xf1\xee\x4d\xcc\xb1\xb9\xa9\x94\x96\x4f\x73\x97\x3e\x3b\x83\x94\xea\x00\x61\x84\xe3\xd3\x78\x22\x19\x10\x00\x5b\xd8\x0a\x92\xeb\x29\xf0\xb0\x56\x2e\xe5\xd0\x8b\x69\x7f\x6a\x6f\x56\xb2\x8c\xc2\xb1\x22\xf4\xd0\x23\xec\xef\x5b\xf8\x41\x29\x77\x3f\xc0\x40\x70\xd4\x27\x9c\xed\x2a\xec\xd3\xcf\x8f\x7d\x38\x5c\xc3\xf7\x8e\x11\x75\x77\x2a\xb2\xe3\x45\x77\x5d\xd5\x96\xd8\xca\xc5\x45\x2d\x2c\xf9\x4e\xec\x45\xac\x86\x28\x4d\x21\x40\x41\x61\x0e\x4f\xba\x37\x93\xf8\x8a\xae\xc6\xf8\x69\x27\x26\x8b\x8d\xd7\xa8\xd1\x94\xc2\x40\xcd\x04\xfe\x52\x63\x02\x7b\x1d\xe6\x3b\x15\x8b\xdb\xb4\xba\x44\x70\x93\x3a\x3e\xbc\x9c\x74\x75\x89\xd9\xe8\x35\x19\x13\x89\x28\x13\x0b\x8b\x97\x04\xfa\xbd\x30\xd9\x28\x75\x12\x8e\x5c\xee\x91\x79\x8d\xea\x65\xb9\xfc\x7a\x80\xeb\x11\xd9\xd6\x04\xf2\x4d\x85\xd5\x7b\x4f\x03\x43\xca\x85\xba\xf3\x64\xd3\x0e\x75\xf1\x27\xb8\xec\xb4\x4f\xbf\xef\xa2\xbd\xc0\xfe\x18\x2a\x0c\xd2\x05\x01\x75\x27\x02\x80\x08\x6c\x24\xff\x49\x0a\xd4\xeb\x6f\x82\x54\xdd\x77\x62\x60\xef\xc2\xa7\x94\xc2\xf7\x02\x52\x58\x7c\x32\x9a\xfe\x35\xc6\x80\x3f\x58\x7b\xa2\x47\x88\x5c\xec\xf4\xe8\x34\xc4\x91\xe8\x8e\x52\xbc\x02\xc4\xf1\x62\xc2\xf8\xa5\x3e\x12\x9f\xcd\xfe\x3f\x5a\xbb\xdb\xdb\xeb\x4b\x4a\xcb\xab\x4f\x37\x53\x26\x4f\x6e\x5d\xe6\xb6\xaa\x64\x97\x14\x18\x30\xe0\x9e\x2a\x78\xfe\x8f\x2c\x21\xa7\x73\xa2\x33\x2a\x01\xfe\x82\x61\xeb\x3c\x8c\x1d\xe5\x9c\x86\x47\x13\xd7\x19\x6b\xa5\xf2\xcd\xa9\xc3\xc8\x22\x6e\x66\xca\x92\x26\x2d\x11\x4d\x57\x4d\x90\x80\x36\x79\x54\xaa\x1d\x04\x83\x91\x2e\x69\x5b\x19\xd5\x71\x3d\x83\x01\x27\x34\x58\xc8\x09\xa4\x87\xb6\x6c\xf2\xbc\xd2\xdf\x95\x92\x3c\xa8\x98\xe0\x1d\x82\xc0\x36\x30\x7d\x53\x7c\x0e\xbb\x64\x57\x41\xbe\x51\x4f\x1a\x46\xbe\x13\x44\x26\x84\x09\x83\x97\x8a\x7e\xe2\xde\xf3\xa7\x7f\x2a\xe3\x4d\x26\x97\x3e\xa6\xd8\xc5\x17\x82\x62\x9d\xe8\xdf\x16\xea\xe2\xc3\x87\xc7\xeb\x0f\x54\x26\x52\xbf\x2f\x57\x1f\xd5\xf2\xfe\xea\xfa\xe1\x1a\xfe\x73\xbf\x52\xbf\x7f\x7a\xfc\xc7\x13\x76\x13\x62\x69\xb3\xac\xf4\xe4\x2d\x23\x74\xf8\xad\x4b\x2e\x96\xba\xd4\x3f\x3b\x03\x96\x50\xb7\x46\x62\xe3\xc2\x60\xbc\xc5\x00\xc4\x1f\x97\x6f\xb8\xcc\xa4\xcc\x8b\xfe\x93\x8b\xe8\xc6\x83\x68\x4b\x6d\xd8\x69\xb1\x9a\x22\x59\xe9\xa9\x8a\x7d\xcf\x80\xd1\xe7\xfa\xf9\x19\xb9\xd0\xe2\xbd\xe3\xcd\x20\x63\x0b\x7c\x42\x47\x01\xdc\x08\x18\x2b\xdd\x9a\x74\x55\x53\x47\x36\x1c\x09\xb5\x25\xb0\x21\xc4\xbb\x38\x8a\xe6\x70\x89\x19\xf4\x2f\x42\x08\x05\xef\x50\x8a\xe6\x08\x31\x23\xf5\x40\x0d\x95\x8b\x7b\x4a\xf9\xb2\xf7\x42\xfd\x2e\x37\x3d\x06\xd7\x96\xa2\xd2\x60\xa2\xdb\x6f\x64\x70\x1d\x39\x5c\x27\xc1\x2e\xae\x63\x3f\xa5\x1d\x3a\x57\x29\x34\xf1\x13\x48\x09\xdc\xe7\x19\xda\x78\xbb\xf7\xd4\x75\xe0\xa4\x98\x28\xf8\x3b\xc1\xf4\x49\xc9\x20\x29\x02\xaa\x9f\xe9\x92\xc4\x9e\x9a\xf3\xe2\x2d\x09\x77\xaa\x9f\x40\xf2\x8f\x13\xd7\xb7\xa4\x64\xa1\x19\x4b\x08\xce\x16\x1f\xdb\x96\x8d\xe9\x73\xa6\x97\x7b\x4e\x63\x9a\x7e\xa6\xce\xf6\xdb\x7f\xd6\xa0\x68\x5f\x4d\x3b\xc6\x95\x43\xde\x65\x21\x61\x83\xd6\x00\x22\x9f\x32\x4f\x73\x37\x54\xc4\xe5\x36\x97\xc9\x7b\x68\xc9\x5b\xe8\xbf\x20\xa0\x6a\xfd\xdd\x85\x16\x8b\x32\xdc\xf9\xc3\xdd\xc8\x40\x62\xbf\x65\x6a\x4c\xea\x61\x8b\x65\xce\x40\x1c\x1c\xcf\xbf\x43\xb8\xfe\x78\x71\xff\x74\x4b\x3a\x0c\x10\x2d\xb9\x78\x81\x8a\x11\x73\x4a\xf1\x86\x78\x5a\x1c\x81\xc0\xd8\x86\x28\x25\x6d\x62\x8c\xf3\x8c\x2b\x52\x13\x65\x8a\x00\xa3\x17\xea\x91\xdc\x0b\x6a\xd9\x49\x34\x96\x4e\x1e\x5a\xb9\xa8\xc9\x17\x33\x97\xe3\x50\xa8\x6c\x46\x17\x74\x5d\xd6\x0b\xb0\x3c\x1a\x1f\xd2\x9d\x26\x58\xa6\x91\x8e\x2f\xdc\x06\x4d\xf2\xd8\x23\xa4\x82\x43\x62\x66\xea\xb6\xd7\x97\x01\x01\xba\x77\xf7\x65\x12\x04\xfb\x5c\x63\x1f\x5f\xb9\x71\x21\xc0\xe3\x91\x29\x38\x3e\xe5\x48\xa9\x85\x2c\x70\x22\xdd\xcb\x35\x38\x3a\x6c\xf8\xe9\x35\x0d\xa4\x1d\xa1\xd2\x71\x77\x62\xf3\x36\xa1\x52\x9c\x61\x08\x0b\xb0\xf8\x9d\x6b\x27\xc6\x1a\x7e\xd1\x20\x9d\x6c\x1d\xd6\xa6\x3d\x18\xb1\x74\x29\x57\x4e\xad\x36\x22\x8b\x92\xe4\x1e\x7e\x36\xc9\xb2\xd9\xf4\xfb\xd4\x9b\x82\x61\xb3\x2e\x2b\xb6\x5d\x31\x03\x35\x4c\xfb\x97\x3f\x00\x83\x83\xac\x76\xda\x20\xce\xab\xa7\x76\xf0\x2c\xc8\xff\x39\xca\xd1\xb8\x2e\x15\x47\xbc\x39\x67\x32\xdb\xe3\x1e\xe3\x9f\xca\xdf\x6f\x36\xf1\xdb\x1d\x64\x81\xb8\xc7\x8b\x08\x84\xad\xfc\x07\xe8\xf9\xf5\xe3\xdd\xf2\x5e\xf4\x3c\x6d\xa1\x4d\x2f\x53\x63\x13\xfc\x3a\xdc\x26\x1f\xdf\xac\x0e\xdb\x37\xdf\xa8\xe7\x55\xe3\xe5\x60\x8c\x00\x1d\xb7\xfa\xb1\x44\x21\xe0\x9a\xbc\xd1\x17\xd2\x7e\x98\x4b\xdd\xed\x5b\xff\x65\x8e\xa9\xe5\xbf\xb7\xba\xf4\x63\xb3\x88\x13\x3b\xc2\xdd\x31\x62\x09\xda\x95\x92\x32\xa4\x14\xd4\x8a\xeb\x9d\x22\x29\x34\xf3\x4a\xda\x0f\x6d\x24\xf7\x9f\xe2\xb5\x89\xf2\xc5\xc4\xde\x59\xeb\x27\xca\xd8\xb0\x50\xaf\xd5\x68\x4a\x26\x27\xdc\xf4\x60\xeb\x23\x5b\x72\x91\xb0\x02\x0d\xa7\xef\x4f\x24\xcc\xe8\x09\x90\xde\x28\xbc\x3f\xd2\x51\xfb\x34\x36\xac\x6b\xf9\xdc\xc1\xeb\x85\xba\xf9\xbc\xfa\xfc\x78\xad\x1e\xaf\x7f\x5b\x3e\xf9\x38\x60\xf5\x71\xf9\xa4\x6e\x97\x97\xd7\xf7\x4f\xf2\x69\x96\x53\x9f\x9e\x89\x1d\xbd\xa0\xce\xb5\xa1\xfb\xfc\x2f\xa5\x4b\x92\x15\xde\x5c\xff\xe0\xa3\x38\x6c\x5b\xb1\xe5\x0a\x0d\x1f\xfc\x2b\xa5\x02\x4c\x98\x87\xa9\x88\x17\xe0\x45\x1d\x60\xa1\x8a\x6f\xcc\xb8\x7d\xd9\x94\x21\xb6\xf4\x8d\xa5\x2f\xbe\xe8\xbf\xee\x5a\xf1\x25\x18\x5f\xd3\x57\x0c\xa8\x1f\x8b\x72\x44\xfc\x9d\x00\x5a\x02\x64\x0d\x50\x02\xdf\x52\x04\x2f\x95\x9b\xa6\xa6\x6a\x09\x78\xfc\xb6\xdd\xbf\xfb\xe9\xa7\xc3\xe1\xb0\x78\xae\xbb\x85\x6d\x9e\x7f\xf2\x1f\x0c\xf9\x09\x6f\xb4\x21\xe8\x1f\x34\x3f\x25\x5f\xcf\xe0\x22\x8f\x96\x7c\xf5\x73\x07\x6c\x12\x3c\xec\x62\x19\x66\x9c\x56\x94\x1b\x26\xbe\x10\xa0\xf9\x34\xf3\x0e\x37\xcd\xef\x0c\x5b\xae\x12\x89\x99\x4b\xbd\x0c\x2f\xb7\x34\x7e\xd4\x3c\x6d\xb3\x2f\xa5\x18\xe0\x45\xca\x57\x02\xe8\x3a\x64\xb8\x2a\x13\x1c\xaa\x54\x1a\x7c\xab\x95\x34\x56\x86\xd4\x80\xd0\x9a\x10\xd4\xf8\x1c\x5b\x8f\x04\x1e\x1e\xd2\xd9\xb1\xbe\x78\x46\xf8\x11\x73\xa7\x45\xa3\x37\xed\xb9\x4f\x7a\x9e\x12\xba\xef\x5c\x6a\x66\x62\xb0\x0f\xb3\xcf\xe2\xb1\xeb\xf3\xae\x3a\xdf\x5a\xeb\x38\x2c\xf7\xaf\x70\x73\xd5\xff\x9e\x3c\x08\x52\xae\x20\x64\xb9\xfa\x7c\xf7\x0e\x0d\x42\xcc\x5b\x0e\x82\x48\x32\x26\x21\xf4\x00\x45\x9b\x18\x47\x57\x81\x43\x48\x18\x0e\xed\xd0\xe0\x57\x9a\xb0\x7c\x1d\x1c\x7d\x5a\x87\x1e\x44\xcb\x45\x1a\xa0\x87\x5e\xdf\x70\xd2\x11\xcc\x70\x7a\xaf\x8f\x03\xfe\x24\x50\x18\x3a\x4e\xe2\x3d\xb3\x77\xb3\xf4\x73\x55\xf9\xb9\xfa\x72\x7d\xf1\xa8\xbe\x7c\xfa\xfc\xa8\xee\x2f\xee\xae\x17\xea\x21\x42\x27\x54\x05\x04\x0d\xf1\xc3\x52\x59\xbf\xaf\x92\xca\xa3\xe1\xd2\x52\x19\x23\xfb\xe9\x2e\x94\x1f\xd9\x93\x4c\x25\x1f\xd9\x52\x53\x0a\x91\x1c\xf0\x0f\xce\xf3\x57\x86\x89\xf5\xd4\xfd\xfa\x0c\x1f\x8f\x5a\xf1\xd9\x91\xc0\x2f\xc3\xd6\xfb\x70\x6f\x36\x54\x3f\x82\xa5\x18\x26\x29\xbc\x83\x36\x01\x15\x7c\x7f\xc7\xf3\xd8\x4f\x4d\x12\x32\x45\xeb\xf8\xce\xc0\xd4\xfd\x80\xac\x97\x92\x99\xe3\xe6\x17\x8b\x05\xd3\x3f\x07\x92\x6b\xe3\xb3\x98\xa5\x03\x19\x08\x19\xcd\x09\x40\xcb\x5f\x63\xb8\x5d\x3e\xad\xc0\xa7\x5c\x2f\x1f\xd5\x6a\xb9\xba\xbd\x7e\x4a\xda\x28\xc7\x24\xc5\x77\xbc\x3f\x96\xa1\xa3\x7b\x0c\x71\xe4\x0f\xf7\x1e\x6e\x0c\xf7\xf6\x89\x2d\xdd\x84\xc8\x5b\xb9\x06\x15\x72\xe6\xfe\xee\xc1\xb6\xc1\x0f\xcb\x00\xc4\xa3\x9e\x33\xba\xc4\x71\x00\xcf\x81\x05\xf7\x5a\xf2\x0b\xf8\x51\xa4\x4e\x42\x73\x57\x02\x4c\x12\x1b\xb0\xdc\xf4\x15\x3c\xad\x27\x62\xa7\xc0\x0b\x46\x17\x26\xb9\x0a\xec\x3f\xe9\x94\x5b\xec\xf7\x3a\xa4\x9f\x39\xe2\x24\x9a\x58\x65\x67\xe2\x6b\x9c\xdc\xc5\x7c\x43\x25\x8a\xc2\x69\xf7\xad\x95\x1c\x69\xff\xb3\x52\x01\x8a\xf9\xbb\x89\x5e\x93\x4e\x7d\x26\x0b\xbb\x7e\x29\x4b\x20\xc8\xa3\x63\xa3\x32\xf8\x28\xd6\x7f\x07\x00\x00\xff\xff\xae\x2a\x8f\x89\xf1\x4e\x00\x00") - -func confLicenseGnuFreeDocumentationLicenseV12Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuFreeDocumentationLicenseV12, - "conf/license/GNU Free Documentation License v1.2", - ) -} - -func confLicenseGnuFreeDocumentationLicenseV12() (*asset, error) { - bytes, err := confLicenseGnuFreeDocumentationLicenseV12Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU Free Documentation License v1.2", size: 20209, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuFreeDocumentationLicenseV13 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\x7c\x5b\x73\xdb\x38\xf6\xe7\xbb\x3e\x05\x4a\x2f\x63\x57\xd1\xea\x4e\x67\x2e\x3d\xe9\xad\xad\x72\x6c\x27\xad\x19\xdb\xc9\xc6\xce\xa4\xb3\x6f\x90\x08\x59\xec\x50\xa4\x86\x20\xad\x68\x3e\xfd\x9e\x2b\x00\x5e\x94\xf4\xd6\x7f\x5e\xd2\x6d\x0a\x04\x0e\x0e\xce\xe5\x77\x2e\xe0\xdb\xfb\x8f\xe6\x4d\xe3\x9c\xb9\xae\xd7\xdd\xce\x55\xad\x6d\x8b\xba\x32\xb7\xc5\xda\x55\xde\x99\xd9\xbf\x5c\xe3\xf1\xc1\x8b\xc5\xcb\xcc\xbc\x34\xf7\xf5\xb3\xdb\xad\x5c\x63\x7e\xfa\xf1\xc7\x9f\x67\x57\xf5\xfe\xd8\x14\x4f\xdb\xd6\x9c\x5d\x9d\xe3\xa3\x1f\x33\xfc\xf7\x05\xfd\xfb\x13\xfd\xfb\x37\xfa\xf7\x67\x5e\xe3\xa1\xde\xb4\x07\xdb\x38\xf3\xa6\xee\xaa\x9c\x56\xca\xcc\xb2\x5a\x2f\xcc\xff\xda\xb6\xed\xfe\xd5\x0f\x3f\x6c\xfc\x66\x51\x37\x4f\x3f\xfc\xef\xd9\xec\xe6\xd9\x35\xc7\xba\x72\xa6\xf0\x66\xef\x9a\x5d\xd1\xb6\x2e\x37\x6d\x6d\xd6\xb0\xaa\xb1\x55\x6e\xf2\xc2\xb7\x4d\xb1\xea\x5a\x67\x60\xec\x0a\xe6\xdb\xe1\x8f\x85\xf3\xa6\xde\x98\x76\x0b\x2f\x96\xb2\x8f\x5c\x76\x97\x19\x18\x6e\xd6\x5b\x5b\x3d\x15\xd5\x93\x29\x5a\x9c\xbd\xaa\x5b\x63\xcb\xb2\x3e\xb8\x7c\x31\x9b\xfd\xb8\x30\xef\x3f\xdc\x5c\xde\xbd\xbe\xbd\x99\xcd\x1e\xb7\xce\xec\xbb\x66\x5f\xc3\x1c\x3a\xa7\xf2\x06\xfe\x17\xa8\xd9\xd9\x2f\xce\x58\xf8\x4f\xd5\xd9\x32\x33\xad\xfb\xda\xae\xea\xfa\x4b\x66\xea\xc6\xd4\xed\x16\x58\xb5\xe9\xaa\x35\x6e\xd5\x96\x44\x75\xe7\xdd\xa6\x2b\x03\x45\x66\xbe\x01\xd6\xcc\x4d\x51\xc1\xec\xce\x78\x9a\x1a\x96\xc2\xa7\x79\xbd\x7b\x85\x6b\x58\xef\x3b\xe0\x9a\x53\x8e\xe0\x40\xb7\xd9\x38\x98\xf6\xd9\xe9\xc8\x1e\x6b\x1a\x97\x30\xa7\x80\x6d\x1f\x8a\x76\x8b\x24\xe1\x7f\x6b\x60\xc1\xae\xce\x8b\xcd\x91\x79\x90\x19\x57\x10\xa5\xeb\x7a\xb7\x73\xcd\xba\x00\x66\x1c\x71\x70\x55\x57\xe9\xa3\x85\x79\x70\xeb\x1a\x0e\xae\x29\xca\x63\xd6\x67\xc6\xbe\x71\xde\x35\xcf\xc0\xfa\x0d\xbc\x88\x04\xda\x0e\x56\x6a\x88\x9a\x7d\xb7\x2a\x0b\x8f\x2b\x58\x73\xb0\x47\xa4\xf4\xc9\xc1\x31\x20\x95\xad\xbe\x50\x00\x71\x75\x03\x8c\x3b\x6c\x8b\xd2\xd1\xa1\xac\x1c\x12\x08\x4b\xfa\x22\x77\x30\x18\xb6\xe5\xf7\xf8\xd7\x0a\x06\xe0\x6b\xb4\x8b\x62\x4d\x92\xe4\xe1\x0c\x72\x67\x56\x47\x66\xbb\x5f\xe0\xe9\xf5\x8f\xcb\x9a\x2f\x05\x90\x03\xdc\x9d\x23\xa7\x4a\xb7\x69\xe7\xb4\xde\x7a\x6b\x76\xce\xc2\x14\xed\xd6\xb6\x06\xd6\x2a\x9e\x2d\xf1\x16\x29\x12\x69\x8a\x42\x64\x76\x9d\x6f\xf1\xc9\xce\xbb\x12\xb7\xbc\xe2\x43\x08\x67\x68\x77\x72\x90\x0b\xb3\x6c\x91\xab\xfb\xd2\xe1\x8b\x9e\x7e\x46\x95\x7b\xeb\x2a\xd7\x80\x40\xbc\x47\xce\xac\x95\x46\xa5\x85\x48\x55\x0a\xa3\x0c\x3b\x5f\x3c\x55\xc0\x05\xdc\x39\xad\xe7\x45\x9f\x60\xab\x9f\x9c\xd9\xda\xe7\x64\x50\x5f\x54\x2b\x38\x4e\xd8\x16\x72\xbe\xc3\xbf\x99\xeb\x2c\xb4\x7e\x3c\x21\xa8\x89\x5b\x5b\x1c\xd9\x7b\x6c\x2a\x90\x34\xcf\xcf\xf2\xd4\x5e\xbc\x02\x7a\xe9\xe9\xbe\xa9\x9f\x1a\xbb\x33\x1e\x84\xac\xcc\x71\xeb\x8e\x45\x4f\x97\x82\x01\xcf\x45\x8e\xc7\x1a\x38\x25\xf2\x2b\xcc\xa7\xc7\xba\x5e\x5e\x3b\xbf\x30\xaf\xbb\x76\xa4\x79\x28\x1e\x65\x01\x46\x81\x6d\x42\x78\x43\xd6\xf9\x05\xb7\xb8\xb6\x15\x1e\x0d\x6c\x83\x79\x66\xab\x23\xe9\x27\x0c\x10\x51\x6b\xdc\x93\x6d\xf2\xd2\x79\x3a\x63\xdf\xad\x7e\x07\x9d\x82\x39\xc0\xd4\x34\xa4\x2d\x5b\x47\x8a\xc1\x76\x42\xc5\x38\x07\x85\x84\x0d\xef\x9b\xa2\xc2\xe5\x51\xdd\x17\x06\x0e\xa0\x71\xa4\x2d\x55\x3e\x54\x8d\xa2\x5a\x17\x7b\x52\x2a\x24\x83\x65\xea\xb0\x45\x9b\xa2\xb6\x05\x86\x17\x15\x28\x6c\x47\x96\x02\x97\x6e\xdc\x06\x44\xbe\x5a\xe3\xe1\xbe\x58\x98\xcb\xf7\xef\x6f\x97\x57\x97\xaf\x97\xb7\xcb\xc7\xcf\xe6\xf2\xfe\xda\x5c\xdf\xbc\x59\xde\x2f\x1f\x97\xef\xee\x1f\x06\x92\x6e\xf7\xfb\x12\x8d\x20\x5a\x0e\xd8\x32\xb3\x24\xda\x23\xde\x3a\x88\x04\xfd\x08\x2a\xd8\xed\x32\xe6\x3d\x68\x5a\x6b\x81\x0e\xd8\x1c\xf0\x17\x66\x33\xfb\xd2\xae\x71\x8b\x47\x3a\x97\x75\xb0\xf7\xdb\xba\x44\x71\xf2\x56\x4c\x88\xf2\x3a\x5a\x1d\x30\x74\x15\x49\x1c\xbc\x07\xdc\xdc\xf9\xa1\xfd\x04\x6b\xd2\x81\xac\x87\xa5\x40\x6e\x50\x43\x2c\xd2\x57\xe6\x17\x07\x50\x79\x38\xa0\xfa\x68\xcb\xf6\x78\x41\xc2\x55\xaa\x96\x74\x95\x1e\x3d\xec\x22\xef\x1a\xf1\x24\x22\xdc\xb4\x15\xdc\x64\x42\x01\x9a\xad\x82\xad\x84\x07\x91\x85\x37\x81\x13\x60\x5d\x16\x06\x2d\xfc\x5c\x9d\xdf\x1c\x05\x1f\x1c\x41\xc6\xec\x0f\x2c\xf4\x48\x69\xe4\x23\x4e\x0e\x47\x42\xec\x23\x6f\x28\x06\x62\xcf\xda\x4c\xea\x2b\xc4\x02\xb5\x68\x01\xf1\x51\x9e\x83\xf9\xf2\x2c\x3d\xf3\x63\xdd\xcd\x17\xe6\x73\xdd\x19\xbb\x5e\xbb\x3d\xcb\xbd\x6a\x7a\xb1\x31\xf0\x3b\xb1\x3b\x13\x4b\x8d\xcb\x26\x26\x1d\x47\xd3\x16\xf1\x18\xc9\xa6\x36\xee\xdf\x5d\xd1\xe0\x69\x90\xb3\xf4\xe4\xb5\x99\x01\xf1\xd8\x4a\x7b\x00\x71\xba\x34\xf3\x3b\x32\x9c\x40\x8b\xf8\xf7\xb9\x6e\xe1\x3a\xd8\x38\xb2\x87\xb8\x79\x5a\x47\x44\x43\x15\x37\x0c\x43\xb5\x32\xfb\xba\x61\xb1\xdd\xf4\xbd\xc9\x1e\x57\x50\xd7\x9c\xa9\xfb\x19\x58\x6d\x60\xcf\x0f\xe8\x01\xe0\xf8\x7d\x69\xf9\x50\x89\xed\x2c\xad\x25\xb8\xea\xce\x3e\x39\xa6\x5b\x1d\xd0\x11\x5d\x51\x4b\x84\x13\xb7\x2b\x30\x24\x39\x0a\x3e\x68\x5f\xf1\x95\xa9\xda\x34\x40\xf3\x85\x28\xb3\x77\x6b\x25\xb1\x47\xbf\x18\x7c\x34\x4d\xee\xeb\xba\xec\x3c\x58\x7d\xd0\x53\xa2\x13\x07\x36\xae\x64\x3a\xb7\xc5\xbe\x77\xcc\xe8\xce\x3c\x2d\x44\x7e\xce\x8f\x67\xae\x7b\x7f\xff\x09\x46\x3c\xa3\xcd\x2f\x83\x9d\x39\xab\xc9\x20\xd3\x12\x40\x3d\x53\xea\xcf\x49\x60\x82\x2a\x22\x1b\x98\xeb\xa4\xa0\x68\x55\x37\x38\x49\x5e\x80\xb9\x69\x85\x54\x72\x3c\xf0\xfb\x60\x85\x85\x39\x7b\xdc\x76\x3e\x43\x81\xea\xd1\x46\xe6\xc6\xec\x6d\x03\xc0\x27\x40\x16\xdc\x01\xd0\x00\x6e\x0d\x76\xbc\x86\xb7\xac\x19\xb1\x1b\x06\x1c\xc9\xf6\xba\xaf\x60\x1a\xd4\x86\xc4\x97\x16\xe7\xa4\x50\x3d\xae\x31\xd1\x2b\x46\x49\x6c\x59\x37\x06\x0c\x41\x5b\x37\x20\x04\x25\x6e\xb5\x92\xd9\x03\xdb\x95\x45\x2a\x32\x03\x1e\x31\xba\xda\x98\x12\xec\x37\x80\xae\x08\x52\x32\xb3\x07\xf4\x50\xfb\x1a\xfe\xb3\xc6\x3f\xc1\x7e\xd3\x22\x30\x7e\x5f\x97\x60\x02\xf0\x0f\x30\xb9\x64\x0c\xc4\xfe\x8b\x50\xef\x16\x8c\xf7\xe6\xcb\xea\x19\x20\x0e\x58\x23\xdd\xb5\x9f\x1b\xf4\x2d\x6b\xd7\xe0\x99\x8c\xb9\xa2\xd6\xbc\x2d\x5a\xf0\x25\x34\x96\xfd\x30\xd2\x9c\xa1\xbe\x33\x92\x69\xb7\x82\x23\xc7\x2b\x64\x0a\x1e\xc4\x1a\xd2\x71\x82\x79\x4d\xbc\x62\x7a\x7a\xc0\x0f\x67\x7d\x62\x64\x53\xbb\xba\xdc\x00\xab\x55\xe0\xd1\x85\xd2\x89\x6d\x0a\x9e\xc6\xae\x6a\xc2\x09\x1b\xd0\x66\x55\x89\xb8\x23\x18\x51\x8d\x61\x31\x8a\xe9\x2a\xdd\x14\xee\x29\x6c\x82\x8d\x68\xb4\x1c\x20\x22\x22\xbe\xe6\x3f\xae\xa9\x27\x76\x4b\x34\xf6\xf6\x14\xc8\x04\xb3\x5f\xb5\x68\xf0\x50\xb2\xc6\x6f\x32\x81\x68\x19\x1c\xf1\x19\x20\xaa\xd3\x73\xbb\x42\xf1\x37\x8f\x20\xce\x83\x03\x03\x34\x02\x92\xbe\x07\x18\x0d\x86\x84\x35\x15\x06\x31\x67\x71\x1c\x68\xb3\x1e\xd4\x1b\x32\x1a\xc9\x4c\x28\x39\xaf\xed\xfa\x4b\xfa\xec\xbf\x79\x58\x97\xa3\x25\x89\x81\xa8\x2e\x88\xd2\x01\x68\xfe\x05\x2d\x70\xee\xd9\x91\xd8\x21\x31\xc3\xd1\x3f\xc9\x70\xb6\x97\x8f\x68\x55\x41\xcf\xd1\xb7\x71\x74\x70\xc2\xce\xc3\x34\x6b\x30\x23\xee\xa2\x71\x36\xb7\x88\xaf\xd9\xfb\x34\x8e\x90\x7d\x25\xce\xd6\x22\x82\xd9\xa1\x7f\x25\x51\xf6\x7b\xb7\x0e\xa6\x9c\x2c\xf1\xb3\x2d\x4a\x7a\x5d\xcc\xdf\x93\x00\x5d\x76\x8d\x82\x33\x60\xa0\xef\x8a\xd6\x2a\x8c\x6f\xdc\x73\xe1\xd5\xb5\x04\x94\x0d\xce\xce\xa2\xd7\x82\x11\x07\x44\x69\x62\x95\x69\x46\xf0\xb2\x74\x84\x18\x40\xd4\x6c\x87\xcf\x70\xa6\x62\x47\x27\x8c\x90\xbb\x46\x8e\xc3\x6e\xf7\xc5\x57\x57\x82\x55\xd5\xf7\xf6\x20\x11\xad\x02\xd5\xf8\x66\xde\xd8\x03\x90\x00\x03\x3d\x83\xd6\x1c\xfd\x40\xdc\x8f\xfc\x2e\x2b\xf2\x61\x4c\x6e\xa6\xa8\xf6\x1d\x5b\x7f\x24\x90\xd9\xd5\x8a\xaf\xd8\xb0\xbf\xa8\xc9\x58\x06\x97\x87\xbc\x43\x8f\x67\x50\xd8\x5d\x4b\x67\xc4\xef\xfd\xc1\xa9\x51\x8a\xe8\x70\x29\x02\x22\xab\xcc\x58\xef\x50\xc0\x21\x25\x32\x00\x46\x80\xa7\x8a\x47\xb8\xb3\xcd\x97\x6e\x4f\x06\xd5\xae\x3c\x02\x4e\xf6\x03\xfc\x74\x4b\xb6\x0b\x34\xce\x36\x30\xcb\x13\x5b\x82\x76\x7b\x40\xcf\xc1\x88\x04\xac\x7b\x03\x3c\x47\x8b\xed\x01\x82\x90\x48\x25\xfe\x1d\xa1\x23\x8a\x14\x32\x40\x6c\x4a\x42\x0f\x82\x28\x3e\x33\x25\x6a\x3c\x06\x9d\x57\x0f\xc2\xe3\x4a\x2d\xd8\x84\x02\x03\xea\x5d\xdd\x21\x0a\x61\x8d\x0e\x7c\xd0\x83\xc1\xa9\xfa\x3a\x00\x0f\xc1\x03\x94\x30\xdd\xfc\xdd\xde\x02\xbd\x73\x50\x94\x9b\xaf\x16\x43\x34\x09\x02\x22\xc3\xe9\x04\x70\xd9\x94\x1c\xc9\x30\x00\xa6\x2f\xbb\x9c\x10\x32\x30\xfc\xf2\xe1\x6a\xb9\x8c\xc1\xb5\x70\x0f\xf4\xb3\xa8\x36\xb5\x9c\x1b\x4f\x98\x99\x5b\xfb\xe8\x7e\x1b\x3c\x7b\x78\x7b\x77\x8b\x0c\xfd\x0d\xfe\xd3\x91\x2a\x58\x51\x99\x9e\x10\x5e\x3f\x5e\xb3\xe4\x21\x03\xc0\x5e\xe7\x17\x60\x68\x71\x0e\x7c\xc3\x17\xb8\x09\xf3\xeb\xe3\xdd\x6d\x66\xde\x83\x2d\x78\x58\x37\xc5\x9e\xce\xe9\xfd\xf5\x9b\x7e\xf8\xb8\xed\x00\xcd\xf6\x0e\x6a\x61\x52\x2e\xb4\x29\xff\x93\xf3\x89\xfb\x7e\x7f\xff\x36\x33\xbf\x5d\xbd\x21\x72\xfe\xf1\xfe\xed\xc2\x30\x3f\x47\x03\x41\xd3\xf6\x28\xd6\xe8\x5d\xf4\x37\x06\x33\x1c\x32\xa0\x74\xd0\x24\xa8\x59\xa8\xb2\x15\x6c\x19\xa4\x26\x7d\x0f\x2d\x1a\x3e\x58\x03\x80\xae\xd1\xfd\xa7\xfc\xa2\x98\x8a\xe2\x66\x32\x6c\x8f\xd7\x0a\x29\xe5\x05\x32\x2c\x75\x5d\x7a\x71\x18\xad\x1a\xa5\x94\xb5\xaa\xd0\x2e\x18\x42\x1e\x84\x14\x9d\xe2\x28\xcc\x9f\x77\x12\x1e\xb1\xd1\xe8\x93\x49\x94\x81\x3c\xe0\x41\x4b\xa0\xe7\x69\x7b\xea\xb0\x1e\x11\x2f\x98\xf7\xc0\xde\x39\xdb\xe1\x8c\x85\xbc\x17\x5a\x66\x1c\x42\xd1\xd0\x3d\x9e\x44\xd1\x7a\x57\x6e\x00\xe9\x00\x5a\xe5\xc8\x64\x53\xa3\x9b\x26\xec\x4f\xe6\xcf\xca\x56\x21\xae\x66\x8d\xc5\x70\x2d\x43\xb4\x54\xac\x38\x73\x83\xdb\x04\xcb\x81\x2a\xd4\x8b\x55\x39\x8a\x90\xd8\x11\xd0\xb4\x6d\xd4\xd5\x45\x02\x16\xe6\x4d\x88\x62\xe1\x47\x3d\x53\x3e\x82\xbc\x26\x0e\x53\x2e\x82\xe2\xed\x48\xb7\x65\x6a\xb3\x89\x7d\x4b\x94\x08\x46\xad\xc2\x25\x89\x3e\x74\x66\xc0\x4b\x10\x6d\x14\x42\x26\xc6\x8a\x79\xd2\xf0\x07\x40\x35\x2d\x90\x61\xfe\x09\x4e\x42\x7d\xc8\x0a\x76\x5a\x51\xb0\x22\x83\x57\x75\x1e\x5c\x1f\x59\x0a\x39\x81\x00\xe5\xe7\x49\xc0\x03\x01\x94\xe7\x20\x1c\xa1\x48\x2b\xe6\x24\x46\x5f\xbe\x97\x65\x1c\x43\x7e\x56\x5c\x72\xc0\x8a\xc2\xe6\x37\x15\x11\x9a\x9b\xdf\x3e\xff\xdf\xb0\x96\x84\x2d\x60\xd0\x3a\xc0\x62\xa3\xe9\x12\x50\xa9\x31\x15\x66\x21\x60\xa7\x60\xd6\x41\x78\x61\x2a\x24\x32\x84\x0a\xf8\x37\xc3\x7a\x78\x7b\xeb\x3c\x25\xe3\x54\x32\x22\xe2\x09\x91\x56\x78\x63\x14\x6b\x99\xb3\x5f\x11\x60\xe1\xcf\x64\x69\xbc\xc8\xa5\xfa\xfb\xb0\x2f\xdc\x80\x41\x62\xe1\x0f\x94\x57\x0e\x9e\x49\x28\x31\xca\xbd\x5c\x7f\xa9\xea\x03\x6c\xfb\x89\xf3\x5f\x10\x5f\xcf\xaf\xe1\x98\x24\xf6\xc3\x3f\x6f\xaa\x1c\x54\x25\xfc\x0c\xcb\xcc\x7f\xa5\xd8\xe0\x38\xc7\x60\xa2\x36\xf3\xf7\x92\x5a\x24\xe6\x90\xe8\xcc\xd9\x50\x53\xf6\x40\x29\x39\x20\x2e\xc4\xa8\x59\xe2\xe5\x09\x90\xc3\x5e\xa1\x05\x21\xdf\x49\x96\xe3\xc4\xf1\x40\x48\x5e\x4b\x58\x50\xb3\x7e\x44\xb8\x2c\x92\xd3\x43\xbb\x6a\xea\x3e\x91\x97\x04\x81\xb9\x06\xbf\x08\x7e\x61\x87\x5e\xaf\x22\xc6\xd7\x29\x5e\x64\x55\xa1\x44\x44\x80\x8c\xd3\xf9\x9b\x74\x17\x04\xb3\xfd\x89\x55\x08\xee\xc6\x44\x29\xe3\x75\xa1\x2b\x67\x27\x2c\xf9\x24\x56\xe8\xb8\x1c\xa7\xc4\xc9\xea\x5a\x2f\x11\x91\x27\xcf\x8e\x73\x23\x13\x0e\xbc\x20\x90\xf4\x8a\xf4\x83\x85\x05\xbd\x8d\x3a\x79\x85\xbd\xa7\xa8\x43\x26\x91\x49\x80\x65\x9f\xeb\x82\xed\x3d\x62\x8b\xaa\x96\x44\xb6\xa9\xd9\xcc\xe0\x49\x05\xbd\x4d\x70\xf2\x6c\xf6\xd3\xc2\xfc\xeb\xe6\xc3\xeb\xcb\xc7\xe5\x9d\xb9\x7a\xf7\xfe\xf3\xf2\xfe\xed\x6c\x86\x09\x14\x8e\x37\xc6\x35\x81\x3e\x0c\xef\xa7\xbb\xfe\x58\xc2\x3b\x93\x74\xa5\xcb\xc7\xa7\x94\x0d\x32\x62\x7c\xb4\x3e\xfa\x11\x4d\xe6\xc8\x99\x4b\xaa\xec\x8f\x1c\x34\x1d\x26\x02\x6f\x71\x2f\x48\x7b\x59\x8a\xd1\x49\x90\x27\x4a\xbb\xcd\x73\x64\x62\x2d\xdb\x09\x59\xae\x03\x0c\xf0\x35\x56\x0c\x78\xf6\x89\x02\x06\xa7\x9f\x34\xa0\xa7\xcc\x99\x5b\x6f\x2b\x8a\x90\xe1\x18\xb0\xe4\x40\xa4\xd5\x2b\x4e\x4c\xaa\xad\x69\xea\x52\x52\x23\x96\x74\x04\x71\x6d\xd7\x68\xca\xe7\x98\x58\x5d\x31\x93\xa4\x95\x58\x26\xe9\xe5\xb0\x16\xe6\x57\x08\x2d\x81\xc0\x4c\x06\x1c\x35\x15\x86\xe8\x1d\x08\x94\xa0\xa2\xc2\xc4\x0c\x16\x6c\x18\x03\xf3\x9c\x14\x40\xe2\x6b\xc9\x79\x5b\xb0\x5f\x0d\x8c\x72\x55\xdd\x3d\x6d\x4d\xd5\x69\x6a\x2e\x25\x03\x33\xf7\xb6\xf4\xb5\x58\xc6\x61\x72\x10\x83\x45\xb1\x09\x2f\x17\x51\xbc\xe8\x8d\xd2\x51\x5e\x86\x0f\x21\xa6\x16\x29\x87\x3d\xce\x2f\x52\x98\xcd\x87\xa5\xdb\x0b\x80\x0e\x88\x06\xd8\x78\xd4\xbd\xcc\x66\x2f\x17\x2a\xd2\x66\x79\x6f\xfe\xcf\xc7\xcb\xfb\xc7\xe5\xe3\xe7\xd9\x4c\x36\x29\x5e\x2a\xc0\x02\xd9\xd0\x59\x60\x07\xd2\x8d\xa2\x6d\x35\x4d\xb4\xdb\x91\x42\x93\xce\xc5\xb7\x9e\x29\xbd\x34\x70\x33\x99\x70\x0a\xcf\x6d\x57\x37\x14\xcd\x56\xe6\x05\xd6\xf2\x54\x94\x93\x1c\xd6\x40\xaa\x03\x5e\xe8\x45\xc7\x81\xd3\x60\x6f\x4a\xf2\x61\x51\x18\x80\x52\x26\x44\x41\x60\xd3\x80\x9e\xad\x21\x42\x6e\x4a\x56\xe1\x00\x53\x50\xe8\xd9\xa8\x24\xb3\xbf\x9a\x0a\xd1\xd9\x76\x50\xc2\x8f\x67\x67\xda\x87\x71\xbb\x0e\x5c\xc1\x73\x1e\xb7\x30\xaf\x41\x75\x94\xa2\x28\x1d\x13\xf4\xc4\xcc\x04\xe9\x9d\xef\xa7\x02\x85\xab\xde\x05\x01\x7d\xec\x53\xc4\x93\x4b\x30\xcd\xe4\x76\xb8\x3f\xf2\xee\x14\xd8\xe2\x76\x29\x74\x0f\x40\x85\x3d\xff\xbf\x3b\x32\x4f\x09\x16\x02\xa2\x30\x60\x06\xd8\x1a\x75\x18\x0d\x01\x5b\x81\x80\xec\x64\xb7\xb2\x39\xb4\x22\x39\x0b\x29\x48\x9b\x28\x2a\x2d\xcc\xda\xe5\xd3\x7a\x4a\x7c\x8f\xb2\x22\x65\x8d\x11\x09\x6d\xf9\x18\x4a\x7d\x09\x8d\x43\xe4\x42\x21\x0a\xe8\xaf\x67\x47\xec\x53\x05\xc9\x14\xf8\xb7\x60\x40\x24\x95\x94\x96\x6f\xb9\xa2\x20\x01\x2c\x55\xfc\x40\x21\x51\x49\x24\x65\x24\x22\x97\x13\xa2\x61\x60\x12\xac\x39\xf2\x19\x8d\x27\xc0\x7d\xf0\x33\x65\x07\x0c\xab\x3b\x32\x62\x98\xfd\x0a\x82\x85\x07\x28\x15\x2a\x0a\xa8\xf1\x30\x8a\xc6\xa3\x13\x22\x36\x60\x36\xc8\x9c\x59\xf4\x5b\x15\x79\xc5\x0d\xa1\x06\x0b\xa8\x10\x62\x85\xe3\xb9\x72\xd6\xae\xa9\x96\x94\x48\x1c\xda\xc7\xa2\xea\x9c\x50\x4a\x53\x22\x94\xce\x7f\xb7\x6b\x64\x0c\xe1\xf3\xc5\x48\xb1\xfb\xc9\x7d\x09\xa4\x4e\x80\xcc\x93\xda\x1a\xb5\x4e\xb0\xa2\xa0\x92\x89\xdc\xce\x20\x9e\x45\x03\x57\xab\x34\x38\x18\x9c\x90\x70\x24\x4c\x46\x46\x8d\xcb\x88\xd3\xa3\xa8\x60\xb9\x03\x6e\xba\xe6\xa2\x72\x2d\xd5\x0c\xca\x5a\xe0\x01\xa8\xc1\x2e\x09\xd1\x34\x27\x24\xe3\x2e\x38\xe0\x95\xe2\x09\xa2\x02\xf4\x03\x9e\x8e\x2d\xaf\x0f\x55\x59\xdb\xdc\xa4\x63\x2e\x34\xfa\xd5\x19\x50\x37\xda\x7a\x4d\x21\x9e\x94\x5b\xdb\x89\x4d\x8e\x0c\x1f\x55\x95\xe0\x29\xe8\x05\xe7\x96\x49\x6f\x82\x6f\xe9\xc4\x72\x95\x92\xb5\xde\x73\x99\x29\xf0\xb9\x45\x9f\x16\xc5\x02\xa8\xe8\x72\x4e\x5c\xb9\xbd\xcf\x22\x22\xa5\x68\x24\x1e\xb0\xe4\x5c\xfb\xa7\x0c\x03\x40\xcf\x29\xdc\xa0\x42\x16\x18\xd9\xae\x71\x09\xec\x18\xed\xe6\x50\x80\xbd\x60\x28\x0b\x23\x3a\xe5\x1a\xd5\xc6\xb5\x8e\xca\xae\x28\x9c\x43\x07\xf3\x97\xf8\x23\xe6\x23\x49\xda\xcd\x11\xe3\x2d\xbb\x69\xc5\x99\x95\xf8\x1c\x14\xd1\x8d\x9c\x6b\xd5\x3b\xed\xb3\x50\x7e\xa0\xe2\x7d\x43\x1e\x17\x5e\x81\xb9\x9e\xa8\xd0\x4d\x59\x3d\x08\x4b\xca\xe8\x72\x2c\xa7\xeb\x24\xdb\xd5\x0b\x94\x96\x92\x27\x85\xf9\x39\x13\x8b\x90\x14\x51\x89\x2a\x7b\x16\x11\x0f\x85\x3b\x6b\xc9\x65\x9f\xa8\xbd\x1c\x1c\xf0\x66\xe5\x36\x35\x01\xa9\xc8\x79\xb4\x62\xa0\xd1\x8c\x13\x86\x00\x81\xf8\xfe\x54\xb0\x61\xdb\xa1\x24\x6d\x29\xde\x84\xa7\x02\x03\x69\x7d\xb6\xd5\xc0\xcc\x7d\x4e\xdc\x7d\x96\x0e\x99\x01\x0d\xb0\xab\x3f\x2f\xcc\xdd\xbb\xeb\xe5\x9b\xe5\xd5\xa5\x94\x69\xbf\x05\x57\xad\x19\x16\xe5\x46\xdb\x9a\xac\x67\x62\x28\xa4\xc9\xf1\x9f\x68\xd2\x97\x0a\x3e\xfa\xe8\x15\x89\x97\x54\x34\xcd\x31\x5a\x8e\xa7\x8f\xf1\x65\x1f\xee\x86\xda\xcc\xe8\xbd\x0d\x48\xa2\x46\xde\x00\x0e\x47\xee\x20\x63\xf9\x64\xe8\x80\x03\x7b\xaa\x80\x14\xf7\x32\x86\xf2\xf6\x68\x19\x38\x07\x88\x88\x09\xd2\xee\x6b\xef\xb1\x96\xaa\x7d\x12\x5c\x79\x04\xc5\x8d\x3e\x2e\xd1\xd3\xbc\x16\x27\x44\x95\x34\xaf\x19\x8d\xe1\x02\xaf\x20\x60\x5f\x98\x8f\x3e\xf4\x71\xc4\x34\x05\x38\x03\xec\x1b\xa9\x7a\x7e\xb1\xd8\xa0\x30\x9d\x63\x05\x8d\x06\xe2\xae\xc0\xe6\xb6\x6c\xee\xb8\x1e\x37\x64\x04\x4e\x23\x3f\x0b\x22\xdf\x63\xf2\x1b\x9d\x94\xc8\x11\xc0\x3a\x09\x0f\xc9\x41\x69\xed\x0e\x04\xf9\x40\x35\x8f\xea\x88\x35\x6a\x75\x52\x42\xa9\x44\xcc\xa7\xaa\x9c\xe7\x11\x26\xa8\x4d\x23\xd4\xca\x74\x4b\x33\x43\x9f\x0c\x2d\x19\xd6\x10\xdd\x14\x95\x26\xf0\x23\xd2\x81\xcd\xe9\x48\x54\x19\x9f\x54\x9d\x17\x66\xf6\x7a\x01\x72\xe3\x43\x50\x17\x19\x49\x68\x42\xb4\x36\x23\x03\x44\x5d\x3c\xb0\x31\x4e\xba\xf8\x90\x75\x41\xa3\x38\x6c\xf7\x91\x17\x93\x52\x6c\xbf\x94\x7c\xe2\x60\x51\xb1\x9f\xb8\x91\x83\x95\x57\x0d\xe0\x06\x95\x5d\x8b\xba\xda\xa5\x71\xd2\xa8\x9c\x21\x40\x23\x41\xf3\xe3\xd1\x74\x4e\x45\x4b\xee\x6b\xe3\x0e\xa4\xa6\xb6\xa2\x15\xce\xa9\x61\x81\x1c\x1a\xc2\x27\x55\x41\x14\x4f\x11\x05\xb1\x7d\x60\xe8\x38\xce\x9f\x5d\x2d\xcc\x03\x79\xdc\x1e\x03\x29\x8b\x46\x69\x04\x3c\xbc\x61\x31\xfa\x94\xde\x64\x23\xac\x0a\x0b\x5c\x2f\x4c\x48\xab\x08\xcc\x1e\xc7\xb2\x23\x93\x66\x66\x37\x0b\x73\x99\x63\xf8\x8e\xb1\x2b\x25\x68\x91\xca\xe1\x9b\x74\x58\xe4\x0d\x06\xa5\x7e\x85\x41\x62\xff\xeb\x10\x34\xf6\xd6\x85\x75\xde\xa0\x2e\x13\x7c\x01\xc6\xee\x28\xb4\x69\xa9\x1e\x13\x3c\xd5\x54\xe4\x3d\x8c\x4e\x40\x32\xd5\x2e\x09\xba\x48\x7a\x23\x42\xb7\xc8\x49\x4b\xd8\x9e\x6a\x5d\x09\xf5\x3f\xcc\x7d\xa2\xa2\x1e\x2a\x7d\x02\xdc\x81\x30\xb1\xdb\x71\x2a\x0c\x76\xf2\x36\xe1\xb4\x96\xe9\x07\x64\x86\x60\x00\x95\xda\x4f\xd7\x87\xa5\xab\x4f\xa0\x6f\x1a\xd3\xa0\xfa\x85\xe5\x4f\x46\x6a\x10\x6d\x07\x96\x92\xf7\x02\x9d\x6e\x29\x55\x14\xa1\x51\x9a\x1a\x98\x2d\x13\xba\xc9\x60\x88\x69\x09\x99\xb2\x90\xa6\xcb\x92\x0d\x02\x3d\x8f\x9c\x90\xa5\x62\x65\x4e\xc1\x44\x81\x01\x01\xfc\x0b\x4e\x15\x11\x09\x79\x61\x55\xc1\x10\x43\x64\x04\x45\x20\x18\x75\x87\xa8\x53\xfd\xe6\xc1\x53\x8e\xc1\x2a\x13\x46\xe6\x46\xeb\xcc\x8d\xf4\x8c\x7d\x63\x17\x43\x0e\x66\xd8\x9e\xc8\x2a\xe8\x02\xd9\x23\x6a\xbf\x4d\x69\x8c\x87\x12\x0a\x03\x8f\xc4\x20\xb6\x08\x13\x2d\x2b\x15\xf1\x28\x77\x7e\x0d\xde\x51\xd7\x9b\xda\xae\x00\x3b\x21\x39\xd8\x6e\xaa\xd3\x62\xcb\x98\x99\xfd\x63\x70\x7c\x43\x4c\xae\xee\x2b\x9b\x96\x1f\xd2\x60\xd1\x99\x88\xc6\xed\x1f\xc0\xd4\x14\x31\x17\x5f\x1c\x95\x1e\xa7\x56\x3e\x21\xb1\xbc\xe2\xc8\x19\x82\xec\x1c\xb0\x06\x49\xf5\xf3\xba\xd2\x1c\xa8\x14\xbd\xa5\x3d\x4d\xa6\x8a\x67\x29\xc7\x1c\xdd\x1e\x84\xce\xd8\xea\x32\x8e\x4c\x28\xad\x4d\xcf\xb8\x6d\xcc\xf6\xda\xfc\x82\xa3\x40\x5b\x86\x27\xee\x15\x55\xf6\x93\x8b\x52\x91\xc1\x12\xed\xb7\xdd\xa6\x8b\xfe\xb5\x4d\x7a\xcc\x26\x5c\xe8\x3f\xb9\xcc\x42\x05\xcf\x91\xd0\x8e\xf2\xea\x94\x37\xef\x67\xd6\xc7\x69\x73\x25\x41\xe6\x13\xa1\xed\x19\xa7\xa8\xe7\xea\x15\xa4\xda\xba\x76\x9c\x0d\x22\x97\xbd\xe1\xf0\x2f\x64\xf9\x2a\x46\x73\x48\xee\x80\x30\x2d\xc5\xe5\x91\x34\x39\xfe\x56\x1b\xf0\x66\xb7\x13\xbe\x68\xc2\x00\x8e\x24\x2d\x9a\x30\x26\xbd\x68\xb8\xc8\x41\xfd\x76\xe1\x09\xb5\xe4\x2c\x42\xff\x12\x83\x7e\x6f\xa4\x49\x19\x0d\xea\xb3\x2d\x35\xe9\x8a\x21\x47\x92\x45\xa7\x06\xa9\x3e\xd3\xc2\x84\xb3\xbb\x85\xb9\x76\x14\x68\x4e\x9f\x51\xaf\xb0\x11\x9a\x1d\xfd\xa0\x8f\x2a\xcd\xd2\x9f\x80\x2f\xb0\xd6\x3d\xac\x55\x4b\x40\x24\xa0\x0d\xd6\x74\x5f\x09\x71\x3e\x45\xda\x28\xeb\x7f\x82\x04\xc3\xdd\x66\x58\x30\x06\xad\xa6\x8c\x78\x9a\x7c\x9a\xea\xb6\x81\x95\xdf\xa5\x87\x03\x63\xa6\xd2\xfb\x31\x37\x33\xb2\x55\xb2\x37\x4f\x66\x7d\xaa\x21\x8f\x5b\xe8\xb8\x6f\x6f\xad\xd5\x10\xcc\x78\x51\x0b\x90\x9f\xea\xb5\x4a\xda\xe3\xd0\xa4\x87\x74\x97\xf4\x1b\x0a\xa6\x4a\x25\x25\xe4\x97\x5b\x46\x25\x1c\xc9\xc7\x76\x26\xae\xde\x22\x21\x8c\xf0\x38\x5a\x08\x14\x5a\x44\x96\xb1\xd7\xa9\xe6\x80\xa2\x40\xab\x9f\xe7\x3d\x39\x53\x60\x53\x12\xf8\x9d\xf4\xe3\x27\x0e\x79\xc2\x61\xb3\xa5\x93\x89\x29\x90\x59\x0d\x83\x8c\x58\x8d\x19\x88\x67\x92\xba\x46\xcf\xf2\x3d\xf1\x4c\x42\xc5\xa2\x1d\xf7\x1e\x62\x34\xee\x92\xf1\xb8\x35\x62\xe4\xe8\xbc\x57\x47\x6a\x62\x41\x13\x8e\xca\x03\x20\xfe\xe2\x82\x32\x74\xdc\x5b\x90\xb1\xe7\x0a\x93\xec\x9d\xe3\xee\x1f\x90\x0e\xd2\x48\x49\x5c\x90\x1e\xc7\xde\x13\x84\x9a\xcf\x5c\xc6\xc2\xce\x96\xe6\xc9\x56\xc5\x7f\xd8\x80\x0b\xb6\x65\x3f\x5c\xb4\xdc\xb5\xdf\x6f\x6e\xb3\xa1\x5b\x62\xc4\x16\x69\x09\xc3\x51\xdd\x9e\xd3\x84\xdc\xf4\x9f\x73\x11\x7d\x94\x6b\xd6\x26\xac\xd1\x8b\xda\x76\xc5\xaf\x0d\x12\xcf\x99\xca\x85\xe3\xdb\x07\xa9\x88\xa4\x50\xee\xa4\x01\x78\x87\xc9\x7c\x34\xbd\xc9\xba\xa3\xb6\x31\x0e\x51\xe9\xb7\x53\x3d\x62\xb9\x14\x03\xcf\x92\xac\x8d\x74\xf6\xf0\x99\xc8\x15\x8a\x73\x96\xac\xca\x49\x05\x7c\xdc\xaf\x67\x4b\x4c\x26\x1e\xa3\x82\x5b\x49\xbf\x6a\x6b\x92\x49\x6a\x23\x94\x1e\x55\xdf\x5e\x1e\x23\x1d\xa8\x98\x30\x14\xcf\x35\x52\x11\xee\x71\x84\x19\xa4\x0c\x4f\x79\xf7\x86\xd2\xae\x54\x64\xc2\x2c\xf2\xd6\x96\x1b\xd8\x71\xd4\x71\xea\x5a\x24\x34\x45\x8a\xf1\x0b\x09\xaf\xfe\xd8\x38\x42\x0c\xec\xa2\x4b\x62\x17\x46\xa1\xd4\xcd\x5a\xac\x41\xf4\x93\xf8\x20\xd8\x91\x00\x4a\xa2\x2f\xe7\xce\xc1\x9c\x53\x2b\x61\x2a\x29\x0d\xb3\x2c\x9e\x49\x23\x6f\x78\xe9\x6c\x5c\x7a\xd1\x6e\x89\x55\x3f\xd7\xc2\x49\xa8\xc9\x50\x05\x2c\x0d\x06\x7f\x3e\xc1\x67\xc8\x19\x6a\x34\x69\xe4\xaa\x90\xe3\xde\x2c\xac\xcf\x1e\x53\xb5\x25\x5d\x80\x63\x1d\x89\xd7\x6c\xf6\x17\xac\x3f\xdd\xbd\x5e\xde\x63\x05\xea\xfa\xdd\xd5\xc7\xbb\x9b\xfb\xc7\x5e\xbe\x6a\x07\x78\x74\x80\x7a\xf8\x4a\x11\x59\x1f\xed\xd9\xfb\x66\xaf\x63\x36\x0a\xab\x48\x4f\xd9\xf1\xa9\x81\xfa\xb3\xf4\xa7\xc6\xdb\x3d\x31\xc5\xe6\xa7\x32\x5a\x9a\xe5\x2e\x34\x39\x83\x94\xda\x00\x61\x84\xe3\xd3\x78\x22\x19\x10\x00\x5b\xd8\x0a\x92\xab\x14\x28\xac\x95\x6b\x3f\xf4\x62\xda\x01\xdb\x9b\x95\x2c\xa3\x70\x2c\x0f\x5d\xfa\x08\xfb\xfb\x16\x7e\x50\xc9\xdd\x0f\x30\x10\x1c\xf5\x09\x67\xfb\x18\xf6\xa9\xf3\x63\xa7\x0f\x97\xf0\xd5\x31\xa2\xee\x4e\x45\x76\xbc\xe8\xae\x2b\xdb\x02\x9b\xc5\xb8\xa6\x85\x15\xdf\x89\xbd\x88\xd5\x10\xa5\xc9\x05\x28\x18\x4c\xe1\x49\x7f\x68\x12\x5f\xd1\xe5\x1b\x9d\x76\x62\xb2\xd8\xda\x8d\x1a\x4d\x19\x0c\xd4\x4c\xe0\x2f\xf5\x25\xb0\xd7\x61\xbe\x53\xad\xb8\x4d\x8b\x4b\x04\x37\xa9\xe1\x43\xe5\xa4\xab\x0a\x4c\x46\xaf\xc8\x98\x48\x44\x99\x58\x58\xbc\x86\xd0\x6f\x85\xc9\x46\x99\x93\x70\xe4\x72\x53\x4d\x35\xaa\x97\xe4\xd2\xf5\x00\xd7\x23\xb2\xad\x08\xe4\xbb\x12\x8b\xf7\x4a\x03\x43\xca\x85\xb9\x53\xb2\x69\x87\x36\xff\x1d\x5c\x76\xda\x16\xd4\x77\xd1\x2a\xb0\xdf\x87\x0a\x83\x6c\x41\x40\xdd\x89\x00\x20\x02\x1b\xc9\x7f\x92\x01\x55\xfd\x4d\x90\xaa\xff\x46\x0c\xac\x2e\x7c\x4a\x29\xb4\xdb\x90\xc2\xe2\x93\xd1\xf4\x2f\x31\x06\xfc\xce\xda\x13\x2d\x42\xe4\x62\xa7\x47\xa7\x21\x8e\x44\x77\x94\xe1\x15\x20\x8e\x57\x1f\xc6\x2f\xf5\x91\xf8\x6c\xf6\x57\xb4\x76\xb7\xb7\x37\x57\x94\x95\x37\xef\xde\x4c\x99\x3c\xb9\xd7\xb9\xae\xcb\x52\x76\x49\x81\x01\x03\xee\xa9\x7a\xe7\xff\x97\x25\xe4\x6c\x4e\x74\x46\x05\xc0\x5f\x30\x6c\x9d\xc2\xd8\x51\xca\x69\x78\x34\x71\x9d\xb1\x56\x1a\x6d\x7f\x1d\x46\x16\x71\x33\x53\x96\x34\xe9\x88\x68\xba\x72\x82\x04\xb4\xc9\xa3\x4a\xed\x20\x18\x8c\x74\x49\xd7\xca\xa8\x8c\xab\x0c\x06\x9c\xd0\x60\x1d\x27\x90\x1e\x1a\xbf\xc9\xf3\x4a\x7b\x57\x4a\xf2\xa0\x60\x82\xb7\x14\x02\xdb\xc0\xf4\x4d\xf1\x39\xec\x92\x5d\x05\xf9\x46\x3b\x69\x18\xf9\xd6\x11\x99\x10\x26\x0c\x5e\xca\xfb\x79\x7b\xe5\x4f\xff\x54\xc6\x9b\x4c\xae\x95\x4c\xb1\x8b\xbb\x09\x63\x99\xe8\x6f\x0b\x73\xf9\xf6\xed\x87\x9b\xb7\x54\x25\x32\x9f\x96\x8f\xbf\x9a\xe5\xfd\xf5\xcd\xfb\x1b\xf8\xe7\xfe\xd1\x7c\x7a\xf7\xe1\x9f\x0f\xd8\x4c\x88\x95\xcd\xa2\xb4\x93\xf7\x98\xd0\xe1\xb7\x3e\xb9\xba\xea\x53\xff\xec\x1d\x58\x42\xdb\x3a\x89\x8d\x73\x87\xf1\x16\x03\x10\x3d\x2e\x6d\xe9\xcc\xa4\xca\x8b\xfe\x93\x6b\xe8\x4e\x41\x74\x4d\x8d\xde\x69\xad\x9a\x22\x59\x69\xa9\x8a\x9d\xd5\x80\xd1\xe7\xf6\xe9\x09\xb9\xd0\xe2\xcd\xe6\xcd\x20\x61\x0b\x7c\x42\x47\x01\xdc\x08\x18\x2b\xdd\x9a\xf4\x6d\x53\xcf\x37\x1c\x09\x75\x25\xb0\x21\xc4\xdb\x3e\x86\xe6\xf0\x89\x19\xd4\x17\x21\x84\x82\x77\x28\x45\x73\x84\x98\x91\x5a\xa0\x86\xca\xc5\x5d\xab\x7c\x9d\x7c\x61\x3e\xc9\x5d\x92\xc1\xc5\xa8\xa8\x34\x98\xe7\xd6\x8d\x0c\x2e\x3c\x87\x0b\x2b\xd8\xc4\x75\xec\x67\xb4\x43\x6f\x2c\x85\x26\x3a\x81\x54\xc0\x35\xcf\xd0\xc6\xfb\xc3\xa7\x2e\x1c\x27\xb5\x44\xc1\xdf\x09\xa6\x4f\x2a\x06\x49\x0d\xd0\xbc\xa4\x6b\x18\x7b\xea\xcd\x8b\xf7\x30\xfc\xa9\x76\x02\xc9\x3f\x4e\x5c\x10\x93\x8a\x85\x65\x2c\x21\x38\x5b\x7c\x6c\x5b\x34\xae\xcf\x99\x5e\xea\x39\x8d\x69\xfa\x99\xba\xba\xdf\xfd\xb3\x02\x45\xfb\xe2\xda\x31\xae\x1c\xf2\x2e\x0b\x09\x1b\xb4\x06\x10\xf9\x14\xeb\x34\x77\x43\x35\x5c\xee\x72\x99\xbc\xe9\x96\xbc\x85\xfe\x0b\x02\xaa\x56\x6f\x47\xb4\x58\x93\xe1\xc6\x1f\xee\x77\x06\x12\xfb\x1d\x53\x63\x52\x0f\x5b\xac\x72\x06\xe2\xe0\x78\x7e\x86\x70\xfd\xc3\xe5\xfd\xc3\x2d\xe9\x30\x40\xb4\xe4\x6a\x07\x2a\x46\xcc\x29\xc5\x3b\xe8\x69\x6d\x04\x02\xe3\x3a\x44\x29\x69\x0f\x63\x9c\x67\x5c\x90\x9a\xa8\x52\x04\x18\xbd\x30\x1f\xc8\xbd\xa0\x96\x9d\x44\x63\xe9\xe4\xa1\x93\x8b\x7a\x7c\x31\x73\x39\x0e\x85\x8a\x66\x74\x05\xd8\x67\xbd\x00\x4b\xd1\xf8\x90\xee\x34\xc1\x32\x8d\x74\xb4\x6e\x1b\x34\x49\xb1\x47\x48\x05\x87\xc4\xcc\xd4\x7d\xb2\xcf\x03\x02\x6c\xef\x76\xcd\x24\x08\xd6\x5c\x63\x1f\x5f\xf9\x71\x21\x40\xf1\xc8\x14\x1c\x9f\x72\xa4\xd4\x41\x16\x38\x91\xee\xe5\x06\x1c\x1d\xf6\xfb\xf4\x7a\x06\xd2\x86\x50\x69\xb8\x3b\xb1\xf9\x3a\xa1\x52\x9c\x61\x08\x0b\xb0\xf6\xbd\xb6\x5e\x8c\x35\xfc\x62\x41\x3a\xd9\x3a\xac\x5c\x7b\x70\x62\xe9\x52\xae\x9c\x5a\x6d\x44\x16\x25\xc9\x15\x7e\x36\xc9\xb2\xd9\xf4\xfb\xd4\x9a\x82\x61\xb3\x2d\x4a\xb6\x5d\x31\x03\x35\x4c\xfb\x17\xdf\x01\x83\x83\xac\x76\xda\x1f\xce\xab\xa7\x76\xf0\x2c\xc8\xff\x39\xca\xd1\xb8\x2e\x15\x47\xbc\x38\x67\x32\xdb\xe3\x1e\xe3\x9f\x52\x6f\x50\xbb\xf8\x75\x10\xb2\x40\xdc\xe2\x45\x04\xc2\x56\xfe\x0e\x7a\x7e\xf3\xe1\x6e\x79\x2f\x7a\x9e\x76\xd0\xa6\xd7\xb5\xb1\x07\x7e\x15\xee\xab\x8f\xef\x6e\x87\xed\xbb\xaf\xd4\xf2\x6a\xf1\xfa\x31\x46\x80\x9e\x3b\xfd\x58\xa2\x26\xef\x0b\x62\x47\x5a\xdb\xba\x1d\xde\x43\x89\x56\xac\xfe\xc3\xcb\xf3\xe5\x4e\xec\xc2\x66\xc9\x26\x2e\x84\x4b\x69\xc4\x09\x34\x27\x05\x25\x46\x29\x96\x15\x8f\x3b\x41\xcd\x6c\x16\x7a\x78\xf5\xce\x3a\xd5\xb6\x51\xb5\x9e\x8b\xfa\x94\xf6\xb5\xd2\x19\xd5\x04\xdd\xe3\x6c\x26\xe7\x0c\xd7\x5d\x69\xc7\x86\x86\x1b\x84\xf0\x23\x09\x96\xbb\xf3\xce\x99\x4f\x28\x70\xdc\xab\x2d\x45\x76\xfa\xc6\x0a\x35\x3a\xf5\x51\x87\x4c\xa3\xa9\x1e\x69\xee\xdc\x14\x55\x7f\xcb\xbe\x47\x18\xb3\xe8\x6c\x75\x4e\xe6\xd0\x62\xfb\x25\x2e\x35\x82\x34\x32\xf9\x06\x04\x9e\x92\xc0\xa8\x2c\xd2\x29\xaa\x75\x9f\xc0\x0e\xbd\x2d\x14\x3a\xc7\x9c\xdc\x4f\x00\xb7\xc3\x49\x9c\xbf\xfe\x68\x72\xbc\x4d\x9a\x54\xbb\x61\x67\x56\xae\x1f\xdc\xd5\x8d\xab\xb5\x6f\xfa\x7f\xc0\xc2\x64\x47\x27\x37\x44\xfb\xd0\xe6\xe9\x3f\xbc\x13\x81\x4a\x05\xe7\x66\xb9\xb5\x32\x34\x95\x51\x4f\x32\xde\xd6\x29\x30\xa5\x1b\x83\xda\x93\xf2\xc2\xf7\x33\xf5\x4b\x04\xe7\x49\x7b\xcd\x90\xdc\xd8\x6e\xbd\xee\xa4\x46\x17\x67\x0d\xdc\x7d\xd9\xe3\x2e\x4b\x38\x92\xb3\x0f\xb5\x1e\xc9\xc0\x83\x1b\x17\xa9\x10\xaa\x4e\x68\xc3\xe8\xaa\x75\xd4\x9f\xc4\xbf\x70\xc2\x9b\x93\xe2\x88\x20\x06\x8c\x50\x78\x16\x16\xa0\x6d\x52\x1b\xe2\xf4\x15\xef\x94\x18\x9a\x8a\x72\xe5\x61\x69\xbe\x63\x81\xd4\xa4\xe7\x1c\x8f\x3f\x4b\x37\x1d\x43\xa2\x71\x25\x84\xd3\x19\xa1\xca\x12\x36\x49\x49\x4a\x72\x77\x70\x32\x42\x47\xf8\xbc\x0c\x7e\xb4\xe4\xc7\x85\x79\xf3\xf1\xf1\xe3\x87\x1b\xf3\xe1\xe6\x5f\xcb\x07\x8d\xb5\x1f\x7f\x5d\x3e\x98\xdb\xe5\xd5\xcd\xfd\x83\x7c\x60\xe9\xd4\xb7\xa1\x62\xd3\x3c\xb8\xcc\xca\xd1\x57\x39\x40\xe1\x93\x84\xa0\x92\xf8\x9d\xaf\x58\xb1\xc4\xa0\x00\x22\xb8\x80\xff\x4a\x39\x0e\x8b\x52\x61\x2a\xb2\x83\x80\x54\x3d\xc4\x1b\x25\xdf\x7b\xf3\xfb\xa2\x29\xe2\xb5\x2e\xe9\xdd\x7e\xd6\xbe\x9a\x55\xd7\x0a\x5e\xc3\x1c\x16\x7d\x8b\x84\x5a\x1e\x29\x0f\xcb\x5f\xfb\xa0\x25\xc0\x4e\x81\x6a\xf0\x5d\x63\x40\x82\x6b\xd7\x54\x54\x91\x04\x54\xcd\x5f\xbd\x3a\x1c\x0e\x8b\xa7\xaa\xa3\x2f\x5f\xe9\x67\x7f\x7e\xc0\x7b\xa9\x18\x58\x0f\xfa\x0b\x93\x6f\xe0\x70\x21\xd5\x4a\x4d\xe8\xa9\x03\x36\x49\xcc\xe9\x63\xa9\x73\x9c\xba\x97\x4b\x5c\x5a\x6c\xeb\x99\x0c\x7e\x67\xd8\xd5\x98\xe8\xe2\x5c\x54\x11\xef\x8f\x35\x3a\x6a\x9e\xde\x64\x29\xa4\xe0\x46\x32\x49\xf0\x60\xaf\xfa\x93\xdc\x46\x0b\xa0\x55\xaa\x79\xda\xcd\x28\xbd\xcb\x21\xfd\x26\xb4\x26\x04\x35\x9a\xc7\xee\x91\xc0\xc3\x43\xc9\x28\xd6\xf0\xcf\x28\x46\xc3\xfa\x44\xde\x80\xc6\x9f\x6b\x61\xe1\x94\xd0\x7d\xe3\xd3\x04\x4c\x0c\xb6\x3a\xf7\x59\x3c\x76\x70\x0a\x87\xd7\xdb\xba\xf6\x9c\xfa\xd2\x57\xb8\x7f\xf1\xbf\x48\xde\xf8\x38\x9b\xfa\xeb\x91\x9a\xec\x73\xf8\x25\xd7\xb8\x73\xd3\xb5\x68\x14\xfb\xaa\x93\x9c\x6c\xf2\xb5\x24\xe9\xb6\xa5\x89\xfe\xe4\xb5\x0f\x24\x94\xee\xe8\x00\xe8\xaa\x8e\xde\xc7\x8c\x1c\x49\x8d\x8d\x14\xe5\xfe\x23\xee\x03\x31\x0a\xf3\xa3\xd7\x3e\xa8\xb5\xa2\x24\xd8\x7d\xf1\x02\xc2\x97\x1b\xb6\x11\x74\xcd\x6b\x7e\x67\x3d\x7e\x99\xc5\xdc\x61\xe2\x40\xf2\xb5\x57\x20\x4d\x76\x55\xf3\xd7\x7f\xcc\x43\x81\xb9\x06\x2c\x6c\xcd\xef\xee\xae\xf8\xcf\xf3\xe4\x52\xe7\x27\xfc\xaa\x90\xf9\x84\xfc\xf8\xe4\x56\x86\x70\xa1\x14\x72\xf4\x34\x7c\x74\x28\xe4\xcb\x38\x16\xe7\x50\xc1\x87\x26\x60\x9f\xdc\xc4\xd8\x40\x80\x55\x72\xaf\xa2\xf8\x28\xba\x68\x8a\xfd\xdb\x39\x25\x2d\x70\xb7\x34\x0d\x5e\x4d\x17\x3e\x1e\x8a\x2f\x85\x9c\x95\x8c\x47\xd6\xd3\x0b\x18\xba\x57\x5a\x2c\xed\x5d\x72\x6c\xe8\xb2\x0a\x7e\xb9\xe7\x7b\x9c\x88\x4c\x80\xfd\x4b\x39\x20\xa6\x00\x3d\xf0\x25\xe1\x8a\x77\x12\x3c\x8f\xf7\x4d\x3d\xbb\x51\x50\xa5\xb7\x0a\x79\x8b\x73\xc0\x29\xcd\xaf\xae\x2e\x5e\x7f\xbe\x78\xb8\x4c\x2f\xf1\x5e\x61\xd3\x14\xd2\x77\x45\x77\x90\xbc\xb9\x6c\x43\xaa\xe8\xe2\x61\x8b\xc2\x7c\x89\xa9\x61\xf3\x72\xf1\x63\x80\x2e\x71\x15\x90\xfe\xd1\x0c\x57\x75\xb3\xaf\xf5\x1b\x4f\x14\x87\x60\x49\xf9\x02\x4e\x61\x43\xc5\xea\xf0\xab\xa6\x42\x63\x73\x26\x27\x58\x61\x83\x2b\xbc\x3f\x80\xf6\x18\x3f\xdf\x02\x2c\x7e\x83\x57\x89\xf1\xe3\x05\x99\xb9\xc2\x5e\x83\xba\xa9\x0a\x4b\x9d\x92\xd4\x3a\x8e\x4d\x9c\xac\x2e\xe1\x2b\x6c\x7d\xbd\x49\x9a\xf8\x7a\xc4\xcb\x97\x40\xc8\x87\xc6\x2a\x35\x32\x6b\x59\x29\xa5\xf1\xd2\x73\x9d\x5e\x00\x69\x9c\xfe\x61\x93\xd8\xb3\xa8\x24\xdb\x40\x9f\x7f\x20\x53\x4d\x64\x6a\x6b\x8a\x5e\xdd\x4d\xb4\xe7\xb2\xa2\x53\x02\x59\x9a\xbb\xb2\x78\x2a\xe2\x57\x36\x42\x07\xf6\x5c\xba\x55\xe3\x17\x12\x4f\xa7\xa9\x8b\x8d\xde\x4c\xfa\x22\x26\x86\x1a\x91\x19\xd5\xc5\xcd\x8f\x5f\x27\x2c\x71\xa0\xe2\x10\xd3\x48\xc9\x24\x1a\x01\xf4\xc9\x77\x0c\xc2\x57\x23\x4a\x8a\xdd\x95\x45\xf9\xd4\xc6\x63\x8a\x96\xde\x3f\x83\x10\x6e\x6b\xe9\xfa\x63\x2c\x3d\x7b\x1e\xaf\x09\x02\x1f\x3e\xaf\x43\x38\xfe\xa7\x73\x26\x9e\x64\xbb\xb7\x5c\x40\x87\xe1\x0b\x97\xfc\x15\xcb\x9f\xa5\xde\x56\xef\xf1\x63\x00\xea\x7c\x8c\x9a\x18\xad\x2a\xeb\xc9\xf1\x2f\xd3\x5a\xc7\x1c\x52\xa5\x51\x85\xe2\x8f\x05\xe2\xef\x6c\x10\x18\xa7\x48\x97\xd9\x65\xf7\x84\x99\x29\x26\xe5\xef\xbd\x5c\x83\xd3\x43\x3e\x75\xc6\x28\x09\xd7\xd7\x37\xf7\xd7\x1f\xef\x5e\xe1\x55\xcb\x58\x45\x1e\xa4\xf4\x09\x48\x86\x44\x30\x6c\x77\x62\x1c\x7d\xfa\x25\x24\xe8\x83\x7b\x3f\x34\xf8\x55\x4e\x6c\x26\x0c\x69\x97\xb4\x2b\x70\x50\xbb\xc8\xd3\x72\x49\xb8\x78\x15\x30\x41\x44\xf3\x5c\x6c\xed\x67\x65\x7e\xa7\x14\x5d\x08\x88\xe2\x77\x05\x5e\xcd\xd2\xef\x90\xae\xcf\xcd\xe7\x9b\xcb\x0f\xe6\xf3\xbb\x8f\x1f\xcc\xfd\xe5\xdd\xcd\xc2\xbc\x8f\x89\x2c\x04\x4d\x98\xc2\x71\x79\x8c\x98\x7b\x97\x5c\xa8\x59\x2d\xdc\x20\x2f\x62\x9d\x65\xba\x25\xf8\x7b\xc8\x33\x33\xc9\xf7\x53\xcd\x14\x74\x1a\x9a\x8f\xd3\x9e\xff\x17\x36\x6f\xd5\xd4\xf7\x94\x32\x7c\x3c\xba\x17\x99\x49\x08\x30\xba\x07\x19\xbe\x93\x12\x7a\x51\x02\xa6\x1c\x96\x8c\x34\xb6\x71\x21\x47\xf3\xed\x1d\xcf\xe3\xe5\x36\x92\x90\x29\x5a\xc7\x17\x38\xa7\x2e\x6b\x66\xbd\x02\xd9\x1c\x37\xbf\x58\x2c\x98\xfe\x39\x90\x5c\x39\xad\x29\x17\x1e\x64\x20\xd4\x97\x27\xd2\x8b\xfc\xf5\xad\xdb\xe5\xc3\x23\x44\x1f\x37\xcb\x0f\xe6\x71\xf9\x78\x7b\xf3\x90\xdc\x69\x19\x93\x14\xdf\xd1\x34\x89\x0c\x1d\x5d\x2a\x8d\x23\xbf\xbb\xf7\xf0\x85\x98\xde\x3e\xf1\x7e\x1d\x85\x5d\xad\xdc\x49\x5f\x25\x31\x27\x49\xdc\xb6\xc1\x0f\x09\xee\x5c\x43\x17\x00\x08\x42\x1d\x20\xc6\xc0\xf6\xc7\x4a\xaa\x3d\xf8\x11\xcc\x4e\x0a\x25\x60\x4e\x3a\x75\x3c\x1a\x29\x06\x41\x4e\xba\xbb\xb0\x6f\xf3\x19\x83\x3a\x97\x7c\xfa\x45\x3f\xe1\xb9\xae\xb1\xf9\xfe\x90\x7e\xd6\x92\x4b\x9a\x82\xdf\xbd\x8b\xaf\xb1\x81\xc6\xea\x4f\x29\x8a\xc2\x4d\x10\xdb\x5a\x82\xfb\xfe\x67\x44\x43\x72\x45\x3f\x14\xa1\x9a\x74\xea\xb3\xa8\xe8\x29\xa9\x66\x23\x59\xe8\x8e\x8d\xca\xe0\x23\xa8\xff\x2f\x00\x00\xff\xff\x0a\xdc\x06\x03\xcc\x58\x00\x00") - -func confLicenseGnuFreeDocumentationLicenseV13Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuFreeDocumentationLicenseV13, - "conf/license/GNU Free Documentation License v1.3", - ) -} - -func confLicenseGnuFreeDocumentationLicenseV13() (*asset, error) { - bytes, err := confLicenseGnuFreeDocumentationLicenseV13Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU Free Documentation License v1.3", size: 22732, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuGeneralPublicLicenseV10 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xa4\x5a\x6d\x53\xe3\x48\x92\xfe\xee\x5f\x51\xc7\x97\x86\x08\x37\xdb\xcc\xdc\xcc\xee\x34\x1b\x13\x21\x8c\x00\xdd\x82\xcd\xd8\xa6\x7b\xf8\xb6\xb2\x5c\xc6\x3a\x64\xc9\xa1\x92\xa0\xfd\xef\xf7\x79\xb2\xaa\xf4\x62\x5e\xba\x37\x26\x62\xef\xa6\xb1\xaa\xb2\xb2\x32\x9f\x7c\xaf\xcb\xf1\x9d\xba\x0c\xc7\xe1\x34\xb8\x56\xb7\x77\x67\xd7\xd1\x48\xe1\xff\xc2\xf1\x2c\x54\x83\x2f\xba\x34\x69\x91\xab\x93\xa1\xba\xd0\x8b\xb2\x8e\xcb\x9d\x3a\xf9\xed\x1f\xbf\x0d\x46\xc5\x76\x57\xa6\x0f\xeb\x4a\x1d\x8e\x8e\xe4\x27\x75\x51\x6a\xad\x66\xc5\xaa\x7a\x8e\x4b\xad\x2e\x8a\x3a\x5f\xc6\x15\x36\x0f\x55\x94\x27\xc7\xea\x97\x13\xac\x88\xf3\xc7\x2c\xcd\xd5\xac\x02\xbd\x74\x55\xad\xd5\x45\x56\x14\xe5\x50\x9d\x15\xa6\xe2\xca\x9b\x40\x7d\xfa\xe9\xe4\xe4\xd3\xc7\x93\x9f\x3f\x9d\xa8\xbb\x59\x30\x18\x84\x4f\xba\xdc\x15\xb9\x56\xa9\x51\x5b\x5d\x6e\xd2\xaa\xd2\x4b\x55\x15\x2a\x01\x0b\x2a\xce\x97\x6a\x99\x9a\xaa\x4c\x17\x75\xa5\x15\xd6\x2e\x70\xe8\x86\x1f\x53\x6d\x54\xb1\x52\xd5\x1a\x1b\xb3\x34\xd1\xb9\xd1\x6a\x59\x24\xf5\x46\xe7\x38\x1e\xcb\x55\xb2\x8e\xf3\x87\x34\x7f\x50\x69\x45\xea\x79\x51\xa9\x38\xcb\x8a\x67\xbd\x3c\x1e\x0c\x6e\x4b\x1d\x6f\x16\x99\x1e\x0c\xe6\x6b\xdd\x10\x88\x1f\x70\x4b\x52\x10\xda\x1b\xb0\xad\x8c\xbf\x72\x52\x6c\xb6\x71\xce\x63\x2b\x88\x09\x1c\x3e\x6a\xbd\x55\xb5\x81\x0c\x55\x5c\x81\x11\xad\x36\xba\x4c\x76\x96\xab\xc2\x74\x76\x1c\xab\xb3\x1d\xfe\xca\xab\x32\x36\x60\xae\xa8\x4b\x75\xa9\x73\x5d\xc6\x99\xba\xad\x17\x38\x5c\x5d\x3b\x06\xc0\x67\x9a\x57\x3a\x5f\x5a\x21\x3c\x40\x25\x31\xfe\xd6\x6a\xc7\x4d\x2b\x70\xb7\x2c\x36\xfc\x62\xd6\xe4\x89\xf2\x91\x6b\x6a\xf9\xd6\x30\xfb\xf1\x23\x96\x6c\xe2\x47\xfc\x52\x63\x19\x79\x6b\xee\x81\x23\x64\xed\xaa\x28\x29\x0f\x48\xc7\xd8\x5b\x1c\x2b\x8a\xe2\x0d\xc6\xe2\xed\x36\x93\xbb\x17\x42\xed\x2d\x34\x7c\x30\xed\x41\x64\x0e\xcb\xe3\x1c\x22\xc1\x9e\x52\x6d\xcb\xe2\xa1\x8c\x37\xea\x59\xa4\x13\xd7\x90\x12\x64\x07\x29\x41\xeb\x5c\x59\x1b\xab\xad\x63\x75\x5f\xd4\x2a\x89\x73\xf2\x45\xed\x91\x55\x11\x80\xa3\x60\x86\x58\x5e\x40\x8b\x5f\xd7\x3a\x57\xcf\xb8\xdc\x56\xc7\x8f\x14\x7c\x4f\x0a\x43\x7e\x22\x27\xa5\x5e\xe9\xb2\x24\x71\x9c\xe2\x84\x38\x14\x40\x6c\x4b\xdc\xef\x58\xcd\xb6\x3a\x49\x57\x69\x02\x79\xec\x86\x72\xc1\xb7\xf5\xb3\xd4\x26\x7d\xc8\xad\x7e\xba\x22\x06\x06\xc0\xa3\x5a\xc7\x4f\x56\xe0\x1d\x65\x3d\xa4\xf8\x2d\x7e\x8e\x21\x88\x52\x19\x0d\xa1\xb7\x00\xde\xe3\xb8\xa1\x53\xea\x44\x73\x9b\xc1\xbd\x13\x62\x69\xa9\xb9\x9b\x52\x79\xd0\x95\x60\x7a\x25\x0b\x9f\x01\x10\xfc\xd9\xd9\xca\x35\x0e\x15\x3d\xcd\x63\x3b\x05\x8a\x93\x13\x7b\x36\x89\xe4\x2a\xd7\xcf\x96\x0b\x2f\xdd\x53\xab\x3a\x4f\xee\x31\x2f\x9e\x1b\xba\x4b\xd1\xbf\x21\x65\xc8\xd3\x40\x07\xf3\x82\x1b\x2b\x9d\x54\x56\x47\xe2\x37\x8c\xc8\x3e\xd7\x1d\x31\x95\x9a\x76\x9c\x10\x25\xc6\x12\x87\x5a\x17\xe9\x92\x00\xa1\x03\xc0\xba\xa5\x06\x56\x78\x92\x3d\xc2\x52\x22\xdb\x84\x91\x79\xb4\x9f\x0a\x0a\xbc\xa4\x89\x94\x72\x3d\xbb\x4a\xc0\x6b\xf6\x4f\x81\xf1\x98\x2c\xae\x84\x78\xa2\xcb\x2a\xc6\x75\xb1\x62\x8b\x8f\xe9\x22\xcd\xd2\x8a\x4a\x70\xe8\xf2\xf2\xec\xf8\x9b\xae\x9b\xe9\x2a\x09\x1b\xdc\xe2\x4d\xb1\x4c\x57\x3b\x62\x76\x30\xb8\xc0\xcf\xfa\x5b\xbc\xd9\x66\x58\xf2\x1e\xb1\x18\x37\x48\xd6\xf8\x8f\x13\x38\x64\xb5\xd6\x62\x21\xf8\xab\x4a\xe5\xc6\x62\x9d\x6a\xa5\x41\x4a\xce\xa9\xe1\x8a\x04\x46\x72\x65\xa0\x15\xc4\xe8\xa6\x68\xc1\xad\x14\xfa\x30\xb4\x76\x24\x5b\xf7\x80\x8a\x1d\x3b\xb1\xa1\x61\x83\xb3\x0e\xb6\xec\x65\x1b\xd8\x1d\xab\x00\x70\x68\xb8\xa8\xb4\x3d\x72\xc3\xff\x97\x7a\x7d\xd3\x18\xf5\x6b\x40\x50\xcf\x29\x02\x41\xf5\x0c\xb5\x55\x7a\x6b\x3e\xab\xc3\x93\x23\x71\xee\x36\xbe\xf4\x05\x4b\xdc\x1d\xfe\x74\x04\x21\xc1\x60\x1d\x12\x3a\xfe\xfd\x79\x9d\x42\x6e\x14\x83\x91\x8f\x99\x7e\x80\x89\x4a\xd8\x30\x12\xc8\x5c\xdc\x18\x76\xe5\x0e\x9a\x7f\xc3\xe5\x9c\xa6\xba\xe7\x81\xe7\x20\x33\x90\x01\x85\xad\x63\xaa\x44\x7c\x12\x9c\x98\xbb\x08\x69\x92\x27\x5c\xc7\x22\x5a\x8c\xcd\x23\xda\x23\x4a\x44\xaa\x7d\x20\xab\x89\x4c\x53\x61\x9b\x69\x84\x6d\xdd\x6e\x5e\x60\x7f\x49\x87\xbe\x93\x23\xe5\x6e\x3d\xfb\x3f\x56\xd1\xea\x85\xb7\x16\xce\x53\x58\xd2\x62\x87\xdf\x37\x9a\x87\xe8\xcc\x58\x07\xbb\x8d\x8d\xc1\x27\x46\x57\xcf\x1e\x1d\x7a\x07\x21\x8c\x54\xb4\x60\xe1\xe5\xd9\x6b\xdf\xfa\x29\x17\x16\x79\x62\x01\x7d\xa4\x79\x9c\x0d\x71\x86\x5d\x4b\xc7\x0d\x39\x20\x48\x6e\x24\x2a\x95\xc5\xb2\x4e\x2c\x1b\xe2\xcf\xa9\x5a\x40\x81\x04\xe0\x60\x33\xea\x9d\x2a\xe8\xd0\xf2\x3e\xfe\x03\x16\x6c\xeb\x4a\x22\x84\xb8\x8c\x35\xa1\x02\x16\xe9\x47\xa0\x3d\x63\x03\x59\x91\x2f\x53\x6b\xb8\x94\x0e\x15\x09\x17\xd3\xd1\xa5\xd7\x86\x15\x48\x22\xe4\xb0\x94\x31\x1d\x44\xdf\x49\x74\xe6\xe1\xf4\x66\xa6\x82\xf1\xb9\x1a\x4d\xc6\xe7\xd1\x3c\x9a\x8c\x67\xea\x62\x32\xc5\x9f\xb7\xf7\xd1\xf8\x72\xa8\xce\xa3\xd9\x7c\x1a\x9d\xdd\xf1\x93\x2c\xbc\x99\x9c\x47\x17\xd1\x28\xe0\x0f\x83\xc1\x27\xba\x17\x08\xcb\x87\x81\xc0\xe7\x09\xdd\xb8\xe8\xe4\x25\x21\x0e\xfc\xdb\x98\xf7\x5c\x94\x8f\x0e\xb7\x4c\x00\x00\x17\x5c\x96\x32\x03\x25\xb5\xcd\x62\x27\x50\x4a\xad\x35\x8a\x75\x91\xd1\xbb\x99\x78\xe7\xd2\x97\x0d\x42\xc7\x42\x77\x50\xbd\xb4\x30\x93\x7d\x56\x82\x3e\x17\x7a\x3d\x70\xd9\xd8\x7e\x70\x6b\xd9\x3b\x40\x82\xa4\x21\xb5\xa1\x8d\x8c\x0d\xf7\xe2\x96\x3a\x57\x20\xf3\xd6\x28\x63\x75\x20\x37\x59\xc4\x16\x6d\x72\xb0\xa7\x86\xbc\x07\x7e\x56\xe9\x54\x6e\xdc\xf9\x42\x1a\xa4\x2b\x5b\xdd\xf5\x25\x0a\xef\x2d\x51\xdb\xa2\x14\x65\x4a\x4c\x1a\x7a\x4a\x4d\xba\x47\x56\xe8\x45\xba\x8a\x87\xc7\x0f\x69\xb2\xce\x37\x08\x96\xe3\xe5\x12\xde\x9d\x1c\xc6\x46\x1d\xc0\x43\x1c\x00\x17\x27\xce\x0d\xc6\xbb\x1f\xcf\x29\x1b\xf6\x24\x9f\x69\x03\x70\x6c\x7a\xb1\x99\xbc\xa6\xb9\x5c\x71\xa3\x97\x69\x0d\x4f\x0e\xe9\x3d\xa5\x92\xbd\x35\xd1\x18\xbc\x6e\xd3\xa4\x2e\x6a\x93\xd9\xd3\x81\x99\xb2\x40\xe6\x81\xc0\x84\x5f\xb6\x54\x94\x59\x53\xa8\xe2\x83\x1c\x93\xdd\x55\x1d\x68\x38\xe4\xb8\x4b\x24\x59\x9c\x22\xe9\x24\xd3\xde\xb3\x9c\xda\xbc\x14\xf6\x1a\x27\x55\x13\x1e\xec\x36\xe7\x90\x44\xe9\x36\x93\x7b\x13\x30\x3e\x7b\xe3\xe6\x78\x61\x74\x8e\x43\x19\xba\xa8\xcd\xe6\x24\xae\xb1\xb9\x4d\x93\xe3\x75\x1c\x4f\x5f\x92\xd0\xb2\xdc\xec\x7d\x9c\x82\xe1\x02\x00\xb1\x31\xa3\xdd\xdc\x51\x21\xf2\x5e\xe4\x35\x12\x1a\x9d\x13\x85\x1d\xad\x77\x86\xc9\x9b\xe2\x95\x79\x00\xe3\xbe\x4f\xf9\xec\xb9\x00\xc2\x4f\x2d\x15\x17\x0c\x24\x4c\x59\xae\xca\xd7\xf5\xef\x11\xbc\x07\x50\xeb\xae\x5e\x82\x49\x0c\xa8\x87\xd2\xd7\xec\xf4\x16\x49\x3d\x88\x6f\xd7\xea\x04\xb2\x2d\x9e\xf4\x6b\xb0\x89\x11\x99\x5c\xb6\xe5\x7c\x1c\x2e\xf3\x79\x30\x88\x11\x3d\xe3\xda\xd8\x44\xa0\x09\x0d\xab\x34\xb3\x4e\x28\x81\x72\xc4\x0d\x6d\xd2\x9c\xfe\xc9\x2b\xde\xd0\xfb\x8a\xe9\x79\x58\x4a\x82\xb8\xb4\xf4\x65\xb7\x4d\xfa\xe0\x65\x88\x38\xa7\x6b\xbb\x4a\x34\x3d\x18\x2c\xba\x47\x23\x89\xcf\x5a\x48\xd0\xc0\x1b\xd2\x1d\x81\x40\x7c\x0e\xdf\x2e\x3f\x85\xb9\xb8\x9d\x25\xff\xbd\x8d\xcb\xaa\x75\x8c\xaf\x09\x9e\x0b\x24\x82\x16\xab\xc6\x31\x08\x3c\x9c\x53\x28\x50\xe9\xf5\x24\xce\xbc\x86\xce\xd2\x39\x86\x25\x8b\x33\x44\x5e\x07\x1c\x7a\x3a\xb1\x89\xb4\x5c\x0a\x71\xea\xfc\xbf\xf3\xa5\xea\x50\x7f\x4b\xf4\xb6\x6a\x2f\x6c\x81\x59\xb0\xaa\x61\xb6\x4f\xeb\x68\x23\x7d\x27\x95\x60\xee\x8a\x00\xae\x5c\xe5\xd5\x63\x62\xa8\x62\x97\x37\x15\x5b\x2e\x3e\x02\x62\x93\x23\x9f\x0f\x34\x8a\xf6\xde\x39\x2f\xca\x0d\xab\x15\x18\x5c\xbc\xb4\x45\x94\x64\x1c\xac\x1e\x4b\x98\x01\xac\x12\x1f\x9f\x59\x1f\x95\x75\xde\x49\x22\xad\x06\x09\x62\xf9\x08\x5c\x94\x0c\x27\x58\x24\xae\x99\x26\x25\x28\xee\x10\xb2\x65\x98\xf5\xf9\x26\x65\x7e\x6b\x2a\x17\x88\xf1\x8f\xda\xd4\x10\x11\x8a\x1b\x11\x3c\x1c\x16\x2e\x0f\x22\x00\x01\xc2\x9b\xf5\x64\x79\x8e\x02\x31\xb1\x01\x33\xcd\x93\xac\x5e\x8a\x61\xfe\x80\x8f\x6b\x42\xe5\xdb\x99\xd4\x21\x93\x37\xa4\x43\x43\x1f\x2f\x1b\xb5\x38\xa3\x02\x11\xbf\xf8\xa8\xad\x6c\x6c\xe1\x4e\xcd\x95\xba\x03\x58\x71\x27\x4e\xc6\x0d\x2c\xa4\x96\xf7\xc9\x89\xb5\x7e\x66\xc1\x3e\x94\x91\x14\x62\xf6\x33\xef\xff\x94\xa2\x9a\xfa\x21\x57\x07\xfd\x2e\x8f\xfe\xb2\x5f\xb3\xdc\x78\x10\xf6\x21\xe4\xd2\xe8\xd7\x90\x08\x6d\x02\xc4\xae\x73\xe0\x4b\x0d\x70\x74\x43\x01\xc7\x0f\x48\x6f\x1e\x62\xef\xf0\xe2\xdc\xba\xf6\x14\xe2\xd8\xb2\xee\x22\xba\x25\xad\xd9\xf3\xd2\xa2\x0a\x66\x9f\x10\x5b\xfa\x14\x13\x3a\x47\x0c\x6b\xb1\x7a\x2a\xb2\x7a\xa3\x5d\xed\x53\x15\x70\x7f\xda\x61\xa4\xcd\xec\x6c\x04\x85\xcb\xd3\x36\x29\x5d\x94\x5e\xbe\x9d\x4c\xaa\xb5\x54\x83\xdb\x6b\xe7\xad\x7d\x1a\x89\x0b\xfc\xfc\x7e\xb4\xdf\xe7\xb6\x93\x7a\x94\x1d\xb6\xbd\x9f\xb7\xc7\xb5\xfe\x1a\xa5\x09\x24\x57\x2c\xfe\x9f\xc9\xae\x2f\xc9\xf5\x37\x9d\x20\xb9\x45\x9e\x4c\x51\x6e\xde\xf5\xf8\x86\x2e\x1f\x2c\xfd\x64\x1d\xff\x3b\x7e\x9f\x59\xbe\x8b\x45\x7b\xee\x3f\x4e\x6c\x63\x89\x65\x67\xab\x03\xfe\x96\x69\xb1\xa3\xd2\x96\xb8\x62\x64\x1b\xa4\x14\x88\x04\x1f\xe9\x26\x84\xc5\x4e\x3a\x33\x74\x89\xa9\xf8\x85\xef\xa7\x97\x6f\x5d\xe2\x14\x42\x18\x4a\x74\x78\xc9\x19\x4c\xaf\x64\x4b\xcf\x61\x71\xa8\x9e\xe2\x0c\x25\xbf\x40\xae\x42\xfd\x16\xb3\xa0\x5c\xb3\x04\xda\xe9\xb8\xb4\xbe\xbb\xc9\x28\x5a\xff\xb8\xb3\x65\x92\x77\xbc\x16\xb1\x39\x63\x1c\x8c\xc3\x99\x8e\x37\x9a\x84\x4e\x09\xec\x76\xc1\x75\x24\xd6\xe2\x04\xf4\x42\x24\xad\xb1\xee\x4b\xaf\x27\x2c\x1b\x56\xfe\x9a\x90\x92\xb7\xd4\x97\xe6\xc4\x8e\xb5\xb9\x4e\x8a\x29\x99\x2c\x0e\x7e\x16\xcf\xf7\x2e\x83\xbe\x48\x28\x16\x0c\xa6\x7a\x79\xac\x0e\xa5\x66\x89\x33\x30\x97\x5b\x58\xcb\x9f\xd2\x02\x05\xbe\x32\x5b\x85\xe6\x45\xce\xe8\xa1\xcb\x24\x85\x30\x5f\x14\x5b\xb2\xce\x75\x33\x1a\xa6\xba\x5e\xf2\xfb\x06\xc1\x9c\x4e\x1f\x1f\x0d\x06\xb3\x0e\xb7\x56\x87\x62\xd4\xb6\x7c\xb0\x34\xa5\x53\xa7\x97\x76\xa3\xd3\x89\x2c\xe2\x7a\x54\xdd\x82\xe9\x5e\x82\x05\xe9\xb0\x65\x78\x21\x09\x43\xef\xec\x94\x8d\x98\x46\xed\x3d\x51\xc9\x89\x3e\x39\x36\xfb\x6c\xe1\x77\x9c\x51\x33\x29\x4a\xdb\xf4\xe4\x94\x5d\xe5\x21\x15\x12\xb3\xe1\x28\xe2\xb2\x80\x94\x36\x38\x56\x4a\xbf\x8b\xbe\xcb\x06\xb9\x97\x94\x3d\x55\x6b\x77\xac\xef\xa5\x51\x10\x03\xe6\x59\xba\x28\xe3\x32\xf5\x39\x7a\x8b\x12\xf1\x80\x5b\x5d\xda\xfc\xcd\xec\x4c\xa5\x37\xf4\xaa\x96\x06\xbf\xee\xdd\x99\xb1\xdc\x0c\x7d\x13\xa9\x39\x60\x0d\xb8\x03\xad\x36\xd7\x13\x6f\xb7\x42\x35\xe6\xea\x6d\x9b\x3e\xee\x1f\x8c\x3f\xf7\x4f\x86\x8b\xfd\xdf\xd6\xc5\xf2\xae\x36\x0a\xd9\x8c\x1a\x31\x58\x62\x1c\xe3\xdb\x70\x2f\x0f\xf4\xc1\xab\xe7\x83\x9d\x41\x43\xa6\xfa\xdb\x96\xb5\x5b\xb6\x6b\x7d\xa2\x37\xaf\x77\xaa\xda\x20\x67\xd0\x03\x5f\x20\x22\x61\xe2\x39\xb5\x49\xd8\x5f\xe2\x0a\x07\x3e\x15\xe9\xd2\xc6\x56\x69\x72\xc4\x75\x55\xd0\x3a\xa5\x43\x2c\xd6\x0e\xd7\x53\xe9\x5e\xa3\x4b\x3a\xd8\xfd\x10\xd3\xb9\x41\xc3\xf2\x15\xcc\xef\x89\xae\xd0\x67\x9f\xc8\x87\x6d\x37\xa6\x31\x2f\x5b\x8a\x88\x0a\xfb\xb4\xfd\x87\x15\xf2\x7b\xb1\xc8\xef\x8a\xa8\xed\xd1\xf8\xc6\x74\x5a\xfa\xd4\xd8\xb4\x17\x59\xb2\xeb\x23\xa5\x17\x54\x61\xdb\x00\x8e\xbb\x52\x6f\xd8\xe3\xc2\xff\x56\xb5\x34\xae\x61\x4e\x69\x8c\x6c\x0e\x48\xf8\xc5\x0d\x36\x5e\x34\x6a\x40\xa7\x69\xb9\xed\x17\xfc\x87\xdd\xa6\xc0\x6b\xfd\x84\x23\xdb\x8d\x85\x83\x4b\x1a\x11\x03\x95\xc0\x49\xec\xaa\xd0\x5e\x53\xb0\x92\x70\xc9\x36\x9e\x24\x8c\x6e\xa2\xf1\x5a\x5b\x09\x1c\xff\xea\xba\x06\x28\xf8\xb5\x73\x69\xef\x65\x07\xef\xb2\x39\xec\xf7\x62\xf7\x30\xe2\x94\x49\x67\xe1\x39\x15\xad\xf5\xfa\x63\xf6\x8b\x6d\x70\xbf\x68\x5c\xf6\x9b\x96\x9e\x2f\x40\x59\x9c\x6d\x55\x74\x33\x9f\xfd\x9b\xf6\x2c\x14\x29\xbb\x0c\x5c\x70\x9b\x55\x5d\xba\x32\xbd\xd3\x26\x77\xf7\x6a\x4b\xf7\x0f\x74\x29\xa5\xb4\xe7\x9c\x0b\x76\x30\x94\xd2\x46\xd3\x97\x94\x3a\xcd\x21\xcf\xbf\xdb\xc6\xd2\x5b\xe3\x20\x61\xc1\x37\x38\x4a\xfd\x94\x4a\x3d\x66\x1b\xb2\x1c\x3b\x3c\xd9\x01\x64\x53\x75\xbf\x81\x61\x2b\x38\xaa\x8c\xb7\xc6\x7f\x8f\xd5\x8c\x18\xed\x91\x10\xa0\x2f\xa4\x42\x49\xb3\x58\xaa\x4b\xb3\x4d\xcb\xd4\x8b\x8a\xc1\xc5\x50\x4f\x6e\x87\x1d\x12\x92\x41\xc8\x78\x25\xf9\x2d\x7c\x22\x3c\x7d\x26\x45\xa2\x6d\x25\xc9\x11\x4d\x13\x54\xba\x04\xc0\x60\x29\x58\x12\x20\x39\x62\x74\x19\xcc\x5b\x98\xec\x52\x85\x00\x7d\x8d\x3b\x13\xfb\x7e\x45\x5e\x6f\x16\xba\x6c\x3a\xbc\x8d\x3e\xed\xe8\x49\x80\xd2\x5f\xea\x85\xd2\xef\x7e\x77\x1a\x8e\xa9\xad\xc2\x0e\xa8\x58\x4e\x39\x4a\x4f\xe0\x60\xd8\x1f\x45\x35\xe5\x40\x9b\x4a\x76\xb2\x96\xbd\xde\xab\xab\xb1\xe5\xf0\xb8\x91\x96\x74\x34\x6d\xb1\xdf\x3b\xca\x6b\xb7\x6d\x63\xbe\x85\x85\x17\x37\x6f\x32\x7d\x2b\x82\xdd\xf7\x04\x30\xdc\xaf\xb5\xc9\x8c\xdf\x41\x97\xfa\x5f\xf0\x32\x18\xfc\x43\xf8\x91\x01\x1a\xc1\x49\x71\x22\x0f\x2a\x51\x0e\xd0\xe9\xd0\xfb\xbd\xe8\x05\xa1\xb2\x2d\x5c\x31\xd2\x9b\x97\xb9\x81\x66\x2f\x75\xea\x08\x94\x47\x5b\x88\xc9\x68\x9a\x09\xb1\x6e\x5a\x6b\xd2\x20\xf7\xf3\x2d\xc6\xeb\x76\x9a\x61\x73\x9a\x66\x12\x60\xd5\x9f\x9a\xb6\x50\xfe\xfe\x3d\xf7\x4e\x7b\x6b\xd9\xa9\xcc\x50\x8b\x8d\xa6\x6d\x19\x3b\xdc\x68\x32\x1b\xd3\xcc\x2a\x8e\xd5\xa4\x66\xde\x00\xc7\xc0\x2b\x7a\x83\x03\xd2\x97\x2d\x2b\x9c\xf4\x3c\x14\xa8\x62\x28\x3d\x31\xb9\xf2\xc9\xe3\xcd\xce\x3a\xaa\xb8\xaa\xed\x1c\x0c\xfb\xdb\x9a\x4b\x7e\xf2\x53\xee\xfe\x14\x59\x28\x15\x9b\xa2\xf2\x84\x38\xfd\xb6\x2d\x84\x25\xdc\x4a\x6d\xfd\x54\xb3\xe5\xc1\x7a\x91\x8c\x4d\xbf\xf1\x44\x7d\x0d\xa6\xd3\x60\x3c\xbf\x1f\x0c\x7e\x43\xbc\x0a\x47\xc1\x1d\x47\x02\x57\xa1\xba\x9d\x4e\x2e\xa7\xc1\x8d\x8a\x66\x7e\x52\x70\xae\x2e\xa6\x61\xa8\x26\x17\x6a\x74\x15\x4c\x2f\xc3\x21\xd7\x4d\x43\xae\xe8\x10\x92\xd1\x41\x87\x00\x56\x4d\xe4\xef\xf0\xcf\x79\x38\x9e\xab\xdb\x70\x7a\x13\xcd\xe7\xa0\x76\x76\xaf\x82\xdb\x5b\x10\x0f\xce\xae\x43\x75\x1d\x7c\x45\xf8\xf9\x73\x14\xde\xce\xd5\xd7\xab\x70\xac\x26\xa4\xfe\x35\x02\x3b\xb3\x79\xc0\xf5\xd1\x58\x7d\x9d\x46\xf3\x68\x7c\x29\xf4\x38\x9e\x98\x46\x97\x57\x73\x75\x35\xb9\x3e\x0f\xa7\x32\xc3\xf8\x1b\x0e\x97\x8d\xea\x36\x98\xce\xa3\x70\x46\x36\xbe\x44\xe7\xfd\x3b\x1d\x04\x33\x70\x7d\xa0\xbe\x46\xf3\xab\xc9\xdd\xbc\xe5\x1d\x77\x0b\xc6\xf7\xea\x5f\xd1\xf8\x7c\xa8\xc2\x48\x08\x85\x7f\xde\x4e\xc3\x19\xaf\x0f\xda\xd1\x0d\x18\x0e\xf1\x31\x1a\x8f\xae\xef\xce\x65\x3c\x72\x06\x0a\xe3\xc9\x1c\x62\xc2\xc5\xb0\x6c\x3e\x11\xc9\xf8\xb5\x9e\x3a\x99\x01\xfd\x9b\x70\x0a\xf1\x8d\xe7\xc1\x59\x74\x1d\xe1\x48\xce\x53\x2e\xa2\xf9\x18\x47\x88\xe8\x02\xcb\xf9\xe8\xee\x3a\xc0\x25\xee\xa6\xb7\x93\x59\x78\x6c\x05\x08\x1a\x10\xf7\x34\x9a\xfd\x4b\xe1\x02\x4e\xac\x7f\xdc\x05\x0d\x1d\xc8\x16\x24\x6e\x82\xf1\x48\xd4\xb4\xa7\x46\xde\x56\xdd\x4f\xee\x10\x1f\x70\xeb\xeb\xf3\xde\x77\x8a\x29\x54\xe7\xe1\x45\x38\x9a\x47\x5f\xa0\x5b\x2c\xc4\x29\xb3\xbb\x9b\xd0\x49\x7b\x36\x17\xf1\x5c\x5f\xab\x71\x38\x02\xb7\xc1\xf4\x5e\xcd\xc2\xe9\x97\x68\x24\x52\x98\x86\xb7\x41\x34\x55\x32\x37\x9a\x4e\x49\x65\x32\xe6\x80\xe1\xd3\x31\x15\x07\x80\x84\x5f\xa8\xfe\xbb\xf1\x35\x6f\x3a\x0d\xff\xb8\xc3\x65\x5e\x01\x01\x29\x04\x97\x00\x1a\x05\xd9\xd5\xf9\xd7\x08\x47\x53\x3b\xfb\x8a\x1f\xca\x16\x7c\x68\x15\x7f\x0f\x08\x4d\xd4\x4d\x70\x6f\x47\x55\xf7\x1e\x1a\x38\xd1\xcf\xb2\xfa\x88\x80\x3c\x5b\x60\x06\x67\x13\x4a\xe0\x0c\xfc\x44\xc2\x16\x18\xa1\x38\xa8\x9e\xf3\xe0\x26\xb8\x0c\x67\x1d\x00\xc8\xd1\x6e\xb6\x36\x54\xb3\xdb\x70\x14\xf1\x1f\xf8\x0e\xd8\x41\xcf\xd7\x56\x26\x30\xa0\x3f\xee\xa8\x42\xfc\xe0\x88\xa8\x00\xba\x24\x05\x62\xd0\xe9\x8b\xe6\x47\x9c\x8d\x3d\x3e\x70\xf6\xbe\x49\x1e\xb6\x67\xbf\xc4\x9e\xba\x9e\xcc\x04\x68\xe7\xc1\x3c\x50\xc2\x31\xfe\x7b\x16\x72\xf5\x34\x1c\x43\x5e\x62\x4a\xc1\x68\x74\x37\x85\x59\x71\x05\x77\x80\x9b\xd9\x1d\x0c\x2d\x1a\x5b\xa5\xf0\xbe\x62\xc8\xd1\xf4\xbc\xb1\x25\x81\xe7\x45\x10\x5d\xdf\x4d\x5f\x00\x0c\x27\x4f\x20\x42\x92\x14\xa0\x75\x14\x62\x57\xcc\x90\x13\x12\x03\x2a\xba\xc0\x51\xa3\x2b\xa7\x3d\xd5\xb3\xd8\x7b\x75\x05\x55\x9c\x85\x58\x16\x9c\x7f\x89\xc4\xea\xdc\x39\x60\x32\x72\x32\x99\x38\x0a\x4e\x8e\x4c\x37\xc6\x76\xe1\x2b\xb3\xcc\xc1\x20\xd8\xb2\x33\x97\x7e\xfb\xcc\xf2\x82\xee\x1e\x3f\x20\x09\xb5\x6f\x22\xe6\x12\xe6\xf1\xe3\x3d\xdd\xeb\x18\x19\x8d\x8b\x68\x66\x30\x70\x31\x70\x89\xf8\x99\x15\x5b\x76\x55\x6c\xc2\x63\xdf\x25\xf8\xde\xa2\x9b\x2b\xbb\x16\x88\x0b\x8b\x0f\xa5\x46\xa8\x34\x95\x42\x76\x69\x52\x56\x9f\xb5\x4d\xc7\xd7\xf5\x26\x46\x65\xe9\x5e\xd2\x2c\xb8\x84\x6f\x5f\x18\xe4\x92\x75\xaa\x25\x29\xe1\x43\x27\xd3\x4c\xd2\xf9\xc6\xa7\xe7\xf5\x6d\xb0\x6b\x66\xea\x7c\x99\xd0\xcb\xd4\x3b\x0f\x9f\xba\x5d\x5a\xdf\x05\x9c\xb7\x35\x41\x55\xc5\xae\x4c\x6e\x73\x9f\x66\x1a\x56\x74\x3b\x19\xb0\x62\x79\x28\x66\xe2\x15\x59\x26\xbb\xcd\xe6\x8d\x5f\x2b\xfd\x72\x4a\x40\x66\x75\xae\xbe\x97\xaa\x9b\x77\x61\xeb\x49\x23\xd2\xfb\xfe\x3b\xb2\x80\x27\xbd\x73\x45\x7a\x92\xd5\xc6\xa5\x61\xfd\x11\x9a\x90\x12\x1a\x66\x5d\xd4\xd9\xd2\x26\x6e\x9d\xfe\x98\x56\x07\x4d\xd0\x3f\x40\x3a\x94\xfb\xe6\xf8\xb6\x90\x36\x7d\xbf\x43\x24\x75\x9a\x6b\x9b\xf3\x81\x01\xc3\x3c\x64\xf2\x4f\x0a\x52\xf6\xfa\x1e\x5b\xe7\xee\x1f\x90\x89\xc5\x1b\x4f\x76\x51\xa6\x7a\xa5\x10\xd5\x63\x61\x56\xe6\x36\x95\xe4\x6b\xc7\xbf\xab\xfd\xb7\x81\xbb\x9d\xfa\xa7\xec\x65\x44\x97\x74\xe6\x77\x4e\xf8\x53\xd3\x76\x88\xf6\x5e\x39\x9c\x36\xaf\x89\x7a\x3a\xb5\xe9\x6c\xe7\xad\x06\x7e\x78\x75\x32\x83\x3a\x81\xb3\xfe\x37\x06\x88\xe6\xc7\xd3\xc0\xd3\xce\xa4\xd9\x3f\x84\xc4\xf1\x87\x7b\x93\x98\x97\x59\xef\xf1\xcb\x1b\x76\xfb\x82\x6e\x56\xb2\x66\x87\xba\x72\xd2\xf3\xd9\x12\x6c\x04\x0a\xb2\xc5\x87\x0f\xce\x74\x24\x3e\x40\x9f\x36\x53\x2d\xcd\x72\x42\x7a\x83\x2c\xb9\x41\xb6\x69\xe4\x43\x0a\xfb\x31\x16\x6c\x7f\x3f\xc4\xce\xb4\xfe\x9e\xf8\x6c\x97\x8a\x19\xab\x94\x42\x34\x26\x96\x92\x5d\x60\xb6\xad\xc9\x5e\xe7\xf4\x3d\x9d\x74\x87\xba\xad\xd8\x4e\xd9\x57\x04\x50\x7f\x30\x4b\xb5\x2f\x4d\x87\xea\xd7\xbf\xff\xa2\x6e\x62\xd4\x66\x01\x27\xa7\xa3\x78\x03\xb8\x2e\x1f\xb4\x7f\x5e\xfa\xf3\x6f\x43\x3e\x2d\x75\x8f\x7b\x58\xc8\xf5\x9a\xab\xf8\x9f\x1b\xd5\x48\x5f\xcf\x3e\x56\x22\x50\x34\x5f\xb0\x94\x45\x0e\xbe\xed\xc3\x1a\x64\xe2\xf0\x4e\x69\x76\x2c\x5e\xb2\xd7\xf2\xec\xcd\xd9\x86\x8d\x0f\x83\xd6\xb6\x50\x5c\x4c\x71\x95\xcd\x1c\x2b\x4b\x1f\x9d\xc7\x93\x89\x1b\xd6\x89\x13\x31\xf6\xe9\x40\x6f\xd0\x06\xe0\xeb\xcf\x83\xc1\x65\x8e\x64\xf7\xc9\x66\xd9\x1e\x9a\xbf\xe2\x5a\xfb\xa6\xf7\xed\x9b\xea\x5b\x9e\xea\xee\x4c\x0a\x26\xf3\x22\xf5\xe0\x6c\x36\xb9\x46\x42\x70\x7d\xdf\xcd\x63\x4f\x45\xdb\x4e\xd1\xaa\xda\x01\xad\xff\x36\x14\xce\xf3\x07\xf7\xde\x65\xdf\x72\xdb\x88\x20\x4e\x5a\x67\x3c\x83\xb2\xdc\x37\x64\x6b\xb7\xfe\x81\x54\x5b\x0c\x9d\x76\x8f\x49\x3e\x74\x19\x70\xef\x82\xd6\xbb\x2d\x4b\x2c\x69\xa3\xb4\x63\x4d\xcf\x97\x9c\xdf\xec\x76\xa8\x94\x3f\xa5\x9a\xea\x8c\x13\x7b\x15\xdc\x5b\xed\xc3\xc9\x0a\x47\xd4\xa5\xd1\x43\x3f\x43\xb1\xc7\x49\x6b\xcd\x34\x2d\x75\x76\x74\xa4\x45\x86\x0a\x49\x6a\xfa\xc2\xbd\x74\x81\xfa\x5e\xe5\xec\x54\xc9\x1b\xab\x44\xd8\x13\x3b\x5e\x50\xb9\x20\xf9\x31\x01\x03\x8f\xd2\x4a\xd8\xe8\xbc\x86\xac\xf4\xc6\x7c\xfc\x48\x1f\x2b\x25\xac\xa9\xd9\xbd\xea\x3e\x76\xed\x5b\xa0\x8c\x87\xf8\x48\x4f\x96\x68\x78\x86\x62\x87\x6d\x87\xfe\x31\x28\xbb\x55\xd2\xa1\x76\xbb\x37\xba\x3c\x52\xfe\xf9\xac\x61\xe1\x9c\xc9\xe3\x44\xb8\x34\x99\x68\xf0\x2d\x2b\x5f\xf7\xb4\xd3\xd7\xf6\x59\xc9\x41\x3b\x88\xf4\x09\x01\x0d\x96\xaf\x47\x4d\x5c\xee\x8e\xd5\x95\x4c\x0b\x11\x30\xd9\x62\x3f\xb5\x93\x06\x59\x4f\x54\x9a\xcf\x64\x7c\x57\x2c\x77\xb9\xf6\xa6\xcb\x18\xb5\xd8\x35\x47\xd8\x16\x7c\x7b\xb4\x98\x02\x63\xaf\x73\xa0\xde\xde\xfe\xdd\x81\xf5\x07\xb8\xe7\xe6\x03\x7b\x7f\x69\x69\x67\x0f\x9b\x2d\x22\x68\xd9\xe6\x14\xf2\x32\x4e\x9e\x66\xf3\x1f\x7c\xeb\x5d\x9a\xa3\x66\x1c\x05\x2e\xfe\x8f\x4c\xaa\xab\x38\x79\xd4\x25\xe3\x23\x45\x81\xd2\xb4\x14\x7b\x9a\xef\x60\x6d\x45\xfe\xfb\x50\x9d\x20\x97\x2a\xd3\xcc\xbe\x82\x77\x3f\x0f\x91\x41\x69\x93\xca\x28\x14\x8b\xbf\x00\x4f\x44\x6f\x5c\x7d\x68\xa6\x0a\x76\x50\x2d\x5d\x9a\xff\x19\xfc\x27\x00\x00\xff\xff\xd1\xb7\x23\xcf\x85\x2f\x00\x00") - -func confLicenseGnuGeneralPublicLicenseV10Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuGeneralPublicLicenseV10, - "conf/license/GNU General Public License v1.0", - ) -} - -func confLicenseGnuGeneralPublicLicenseV10() (*asset, error) { - bytes, err := confLicenseGnuGeneralPublicLicenseV10Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU General Public License v1.0", size: 12165, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuGeneralPublicLicenseV20 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\x5c\xdb\x72\xdb\x48\x92\x7d\xd7\x57\x54\xe8\xc5\x52\x04\xad\x6e\x7b\x76\x66\xa7\x5b\x4f\x94\x44\x59\x9c\x91\x29\x0d\x49\xd9\xa3\xb7\x01\xc9\xa2\x88\x31\x08\x70\x51\x80\x64\xfe\xfd\x9e\x93\x59\x05\x14\x78\xb1\x7b\x62\x23\x76\x63\x7b\xbb\x45\xd4\x25\x2b\xaf\x27\xb3\xb2\xf6\xd3\xe8\xc9\x7c\x1a\x8c\x06\xe3\xfe\xbd\x79\x7c\xba\xba\x1f\x5e\x1b\xfc\x33\x18\x4d\x06\xe6\xe4\x8b\x2d\x5d\x5a\xe4\xe6\x63\xcf\xfc\xad\xce\xad\xf9\xf0\xdb\x6f\x1f\x4e\xae\x8b\xcd\xb6\x4c\x5f\x56\x95\x39\xbb\x3e\xc7\x4f\x7f\xfd\xad\x27\x1f\xcc\x6d\x69\xad\x99\x14\xcb\xea\x2d\x29\xad\xb9\x2d\xea\x7c\x91\x54\x98\xde\x33\xc3\x7c\x7e\x61\x4e\xfe\xcc\x21\x49\xfe\x2d\x4b\x73\x33\xa9\x30\xb8\xea\x99\xdb\x74\x59\xad\xcc\x6d\x56\x14\x65\xcf\x5c\x15\xae\xe2\xf0\xcf\x7d\xf3\xeb\xc7\x0f\x1f\x7e\x7d\xff\xe1\x4f\xbf\x7e\xe8\x99\xa7\x49\xff\xe4\x64\xf0\x6a\xcb\x6d\x01\x1a\x52\x67\x36\xb6\x5c\xa7\x55\x65\x17\xa6\x2a\xcc\x1c\xe4\x98\x24\x5f\x98\x45\xea\xaa\x32\x9d\xd5\x95\x35\x18\x3b\xc3\xd6\x6b\x7e\x4c\xad\x33\xc5\xd2\x54\x2b\x4c\xcc\xd2\xb9\xcd\x9d\x35\x8b\x62\x5e\xaf\x6d\x8e\xfd\x31\xdc\xcc\x57\x49\xfe\x92\xe6\x2f\x26\xad\xb8\x7a\x5e\x54\x26\xc9\xb2\xe2\xcd\x2e\x2e\x4e\x4e\x1e\x4b\x9b\xac\x67\x99\x3d\x39\x99\xae\x6c\x58\xc0\x99\x65\x51\x9a\x35\xc8\x35\x2e\x9c\x97\xff\x2c\xac\x4b\x5f\x72\xa5\xab\x4a\xbe\xe1\xc7\xb7\x64\x6b\xb6\x45\x5d\x9a\x25\xce\xbb\x28\xd6\xfc\xe2\x56\x32\x1e\x24\xcb\xce\x38\x52\x75\x61\xae\xb6\x20\x36\xaf\xca\xc4\x81\xaa\x0a\x5b\x89\x5c\x6c\x6e\xcb\x24\x33\x8f\xf5\x0c\x3b\x9b\x7b\x4f\x3e\x88\x4c\xf3\xca\xe6\x0b\xdd\xe9\xa5\x4e\xc0\xd6\x0a\xcc\xff\xe9\x4e\xfc\xd6\x90\xfc\xfe\x3d\x86\xac\x49\xa6\xab\x31\x8c\x9b\x36\xa7\xc1\x16\x32\x96\xe7\x04\x33\x40\xa2\x33\xb5\x83\x3a\x5c\x98\x29\x39\x79\x84\xb2\x64\xb3\xc9\xc8\x70\x2e\x4c\xee\x08\xe3\xed\x51\xcd\x78\xe7\x22\xfe\xe5\x72\x98\x24\xdf\x9a\x02\x73\x4a\xb3\x29\x8b\x97\x32\x59\x9b\xb7\x55\xc1\x95\xeb\x6a\x55\x94\x0e\x4c\x5a\x43\xf6\x1c\x59\x3b\x95\xd9\x85\x39\x9b\x14\x6b\xeb\x67\x1d\xdb\xaa\x73\xb4\x79\x01\x0d\x01\xf3\x66\xdb\x86\xd5\xf7\xd6\xe1\x78\x47\x39\x9e\xbb\xca\x26\x8b\x8b\x73\xf3\x5c\xd4\x66\x9e\xe4\x72\xd2\xad\x51\x4a\x84\xed\x9e\x5c\x07\xe9\x15\x05\x14\xe7\xeb\xca\xe6\xe6\x0d\x2c\xdd\xd8\xe4\x1b\x19\xd1\xe1\x7d\x8f\x9f\x48\x4d\x69\x97\xb6\x2c\x79\x12\x2c\xe4\x45\xd7\x13\x1d\xdc\x94\xd8\xfc\xc2\x3c\xd4\xc7\xa8\x72\x7b\x3a\x17\x0b\x33\xa9\x48\x97\x59\x25\xaf\x2a\xda\x48\x2d\x22\x4b\x69\x0d\xa4\x43\x9e\x39\xf3\x4a\x53\xbe\xa8\x0e\x88\xf9\x80\x41\xaf\xd8\xda\xa4\x4b\x59\xfa\x2d\x75\xab\xf3\x5e\xbb\x55\x69\xe7\x36\x7d\xe5\x22\x75\x39\xe7\xd2\x0b\x08\xa5\x14\x6e\xbd\xd8\x4a\xac\xcb\x4f\x84\xb6\xe2\xcf\x68\x2a\xc7\x78\x15\xed\xa8\x21\xa6\x43\xeb\x0c\x68\x9c\x2b\x95\x5c\x24\x37\xb9\x7d\x53\x7a\x03\xd3\x2f\x55\x7d\xc2\x72\xdf\xf2\xe2\xad\x59\x77\x51\x70\x4d\xc7\x95\xc1\x66\x07\xd1\x4c\x0b\x4e\xac\xec\xbc\x52\xd1\x89\x37\x73\x22\x92\xdc\x46\x9c\x2c\x2d\xf9\x34\xa7\xfa\x38\x5d\x1c\xac\x98\xa5\x0b\x2a\x29\x5d\x11\x59\x69\x73\x31\x70\xbf\x85\xae\x44\xb2\xa9\xca\xee\x9b\x7e\x2a\x28\x93\x92\xf6\x5a\xca\xf1\x74\x14\x2d\x49\xe6\x74\x76\x81\x25\xbb\x2c\xa9\x64\xf1\xb9\x2d\xab\x04\xc7\xc5\x88\x0d\x3e\xa6\xb3\x34\x4b\xab\xd4\x7b\x1f\xae\xec\xf9\x79\x50\x9e\x31\x1f\x7b\xa4\xc8\x0f\x5e\x17\x8b\x74\x49\xcd\x05\x23\x6e\xf1\xb3\xfd\x9e\xac\x37\x19\x86\xfc\x68\x31\x57\xcf\x57\x26\x09\xec\x06\xa7\x56\x56\xac\x0d\x7f\x55\xa9\x9c\x57\x1c\x85\x59\x5a\x2c\x24\xbb\xd4\xb0\xfe\x97\xd4\xeb\x1e\x34\x23\xc5\x52\x39\x58\x43\x67\xd2\xf2\xa0\xab\xa7\x17\x62\x5d\x32\x75\x47\x93\x31\x63\x2b\x86\xd5\x6b\xb4\x2c\xd2\x2c\x3d\x6a\xa3\x74\x17\xa6\x0f\x65\x68\xa8\x70\x2b\x28\x03\x86\xac\x83\x1a\x20\x7a\xd0\xef\xc8\xa2\xaa\x2a\xf8\xaf\x34\xa8\x01\x4d\xd7\x1e\xd2\x0f\xe8\x3b\x42\x55\xf5\x06\x69\x56\x76\xe3\x7e\x37\x67\x1f\xce\x25\xfa\x68\x30\xec\xf2\x9b\xea\x78\xf6\xf1\x1c\xbc\x83\x79\x7b\x05\x89\x02\xd0\xdb\x2a\x05\x43\xc9\x1f\x27\x1f\x33\xfb\x02\xf3\x96\xb8\xe6\x24\xe2\xfa\xc0\xd6\x8b\xc5\x81\x35\x7f\x91\xb0\x23\x02\x8c\xf7\x03\xcd\xfd\xcc\x81\x39\x94\x82\x4d\x28\x2b\x71\x97\xf0\xaf\xfe\x20\x5c\x93\x34\xe1\x38\xaa\xe8\x62\x83\x41\xd1\x83\xa2\x09\xaf\x6d\x88\xb4\x35\x15\xd6\x55\x98\xe6\x1a\x29\xa8\xff\xcc\x0b\xcc\x2f\x19\x74\xb6\xad\x77\xe8\x38\x90\x0b\x33\x5c\xee\x45\x14\xa1\x3c\x55\xbf\xeb\xe0\xb2\xb9\x89\xcd\x9c\xfa\xfe\x4d\x02\x07\x0c\x02\xf3\x96\x3c\x06\x9d\x48\x75\x40\xad\x97\x16\x68\x79\x0b\x6a\xa1\x1e\xce\xc7\x6d\xee\x58\x40\x1e\x69\x9e\x64\x3d\x95\x31\x86\x31\xa6\x80\x0f\x88\xe2\x6b\x89\x9c\x65\xb1\xa8\xe7\x4a\x86\x04\x0d\x8a\x16\x6a\xc9\x05\xe0\x8e\x33\xca\x9d\x22\x88\xd6\x0a\xe1\xe7\x1d\x06\x6c\xea\x4a\x22\x0a\x35\xe5\x96\x1f\xb3\x6d\x4f\xb6\x88\x3d\x12\x09\xaa\x56\xc0\x0e\x08\xd3\xd8\x09\xa1\x9d\x8c\xac\x10\x32\xe4\xec\x9e\x27\x1b\x7e\xa6\x27\x80\xc6\xd1\x9b\x8a\xd7\x78\x2d\xd2\x85\x6c\xbe\xa0\x3f\x2c\xf5\x08\x88\x56\x41\x11\x18\x05\x61\x92\x49\x77\x3f\x39\x41\x9a\x2f\xd2\xd7\x74\x51\x93\x26\x53\xcc\x44\xa6\xba\x47\x83\x5c\x7a\xf4\x9f\x16\x5a\x39\x17\x23\x93\xc0\xb3\x6a\x97\xc1\xbf\x11\x77\x6c\x95\x94\x5b\xf8\x27\xfa\x49\xa8\x03\x35\x05\x12\x16\xc1\x08\xb7\xd7\xc9\x82\xa8\xc5\xcc\x33\x9b\x94\x11\x8f\x75\x2b\xb1\xba\x59\x03\x96\x16\xaa\x95\x5e\xab\xde\x79\x45\xa1\x5b\xc7\xcf\xe4\x79\x33\x2e\x11\xe0\x75\xa1\x50\x6b\x43\xc9\x37\xe6\x2a\xe1\xa8\xc0\xf1\xd4\x4d\x72\x45\xda\x07\xc8\x8f\x4c\x24\x28\xb9\xea\xd9\x5c\xe3\xfe\xb2\x20\x96\xe3\xa2\x83\xf1\xe7\x89\xe9\x8f\x6e\xcc\xf5\xc3\xe8\x66\x38\x1d\x3e\x8c\x26\xe6\xf6\x61\x8c\x3f\x1f\x9f\x87\xa3\x4f\x3d\x73\x33\x9c\x4c\xc7\xc3\xab\x27\x7e\x92\x81\x9f\x1f\x6e\x86\xb7\xc3\xeb\x3e\x7f\x38\x39\xf9\xd5\x63\x9f\x03\x60\xc7\x6b\x98\xb0\x10\xa4\x29\x14\x79\x2b\xca\x6f\xde\xd2\x09\xed\x20\x0c\x9c\x83\x27\x66\x0c\xdd\x64\xc9\xbc\x45\x20\xad\x1b\x59\x15\x19\xc3\x84\x4b\xb6\x1e\x91\xae\x81\x20\xc1\xcc\xd6\x0f\x2c\xd4\x30\x65\x9e\x32\x27\xc0\xdb\xc3\x30\x41\xe2\x8c\x39\x7d\x54\xf2\x4e\x81\x79\x2d\x18\xd2\x53\xe4\xd1\x50\x2f\x1e\x3e\x3a\x02\x89\x57\x37\x96\x98\x53\x39\xc9\x2c\x51\xfb\x94\x8d\xc3\x6a\x66\x6d\x11\xb0\x8c\x4d\xe5\xc4\xd1\x17\xae\xc1\x75\x41\x69\xfa\x0a\x49\x40\x6b\x64\x15\xa5\xbd\x3d\x6f\x96\xbc\xfd\xae\x1a\x94\x0a\x2d\x38\x38\xb6\xd5\xb1\x9e\x6b\x41\x47\xe3\x95\xcd\xa6\x28\x45\xbc\x82\x09\x7a\x81\x80\x06\xf8\xf3\x04\x74\xd7\xb1\x2a\xb8\xe0\x41\x9b\x20\xbb\xa0\x37\xe0\xf9\x55\x60\x19\x0c\xae\x4e\x5e\xc0\xb1\xb3\x3b\x78\x3a\xd8\xf6\x12\x0c\xee\x35\xe3\xb9\x9f\x60\xef\x79\x56\x13\x7b\x73\x87\xa2\xa6\x02\x03\x92\xfa\xcf\x79\x23\x17\x73\x1a\x6f\x7e\x0a\xec\x38\xa0\x67\xf6\xda\x2e\x2e\x2b\x59\x2c\x4a\x2b\x6e\x2f\x71\xe6\x14\x81\xe0\x94\x9e\x1c\xde\xfa\x55\xe3\x7c\xe1\xb9\x4a\x74\xf4\xc7\xb4\x9d\x5e\x85\x36\xd5\x41\xb8\xad\xce\x5e\xaa\xcb\x14\x68\x55\x57\x2e\x15\x33\x46\x30\xc4\xea\x5e\x4f\x92\xb9\xa0\xf6\xb2\xce\xf7\xf8\xee\x7d\x6c\xc0\x2b\x76\xd1\xf3\xa8\x4b\x16\x83\x5b\x84\x65\x17\xeb\xdd\x29\x81\x92\x22\x27\x5e\x5e\xca\x7e\x14\xac\xb8\x74\xf1\x8b\x69\x25\xd1\xcd\x1c\xd5\x32\x73\x06\xc7\x66\x37\x04\x50\xb9\x50\x07\x27\x44\xe2\x66\x16\x10\x5b\x7c\x11\x8e\x79\x80\xe2\x73\x38\x56\x0f\x54\x1a\x0d\x2b\x6b\x42\x66\xae\xe5\xb8\x4b\x08\x23\xcd\x56\x8b\xc2\xd2\xb1\x7f\xf0\x58\x24\xd9\xfe\xf1\x04\xb3\x59\x44\xd2\x9a\x16\x03\x27\xae\x03\x8f\xa9\xae\x69\x2e\xc6\xb1\x86\x57\xaf\x01\xa7\x60\x77\x70\xdb\x36\x42\xb0\x64\xcc\x26\x9d\xd7\x45\xed\x32\xdd\x1d\xde\x46\x7c\x33\xd4\x16\xbf\x6c\x68\xe2\x08\x18\x38\x82\xc4\x7b\x4f\x64\x3c\x2a\x32\x32\xef\x73\xfc\x21\xe6\x59\x92\xae\xc1\x13\x10\x1d\xa2\xf8\xa5\xf9\x66\xed\x86\xd6\x40\xf9\x07\x8c\xa6\xd3\x5c\x88\x40\x44\x32\x4c\x6c\x3b\x3e\x50\xb3\x36\x8e\x4e\x66\xce\xe6\xd8\x85\xb1\x09\x67\x6b\x97\xe6\x18\x81\x82\x6d\x6e\x17\x45\xf5\x2e\xeb\xa0\x06\x72\x94\xe0\xd2\x9a\x7d\xb2\x02\xb2\x55\x04\xd6\x8e\x86\xa0\x1a\x29\x69\xae\x22\x10\xd4\x63\x12\x38\xd9\xd5\xd6\xc1\x32\xb2\xa0\xd5\x62\xc8\x21\xdf\x4a\x3c\xc2\x4a\x02\x58\xc4\x2a\x89\x47\x7c\xc5\xc6\x3b\x17\x9e\xb9\x81\x3a\x11\x96\x62\x10\xfd\x1e\x92\xea\x00\x7d\x41\xce\xc7\x56\x6f\x3c\x4e\x93\xf5\xf4\x4c\xe5\x61\x75\x09\xae\x72\xc7\xa5\x55\xab\x5a\x02\xdd\x5a\x89\x3d\x6a\x1d\x3d\x1f\x1c\xf7\xb5\x54\x7c\x7a\xd7\x03\x7a\xcf\x7e\x28\x84\x4c\xfc\xd1\x3e\x40\x92\xb0\xd9\x43\x5a\x99\x00\x64\x42\x69\xad\xaa\x88\x9e\xc2\xd9\x28\x30\xff\x7e\x72\x92\x9c\xb7\x28\x7e\x9e\xd4\x4e\x33\x80\x06\xfa\x2d\xd3\x4c\x43\xe6\x1c\x5c\x15\x96\xe2\x7c\x34\xeb\xa0\x6c\x8e\x9e\x54\xec\x38\x98\x82\x70\x59\xfd\x8c\xce\x0e\x5e\x67\x41\x2d\xf7\xea\xa6\xa3\x20\x81\xd9\xde\xfe\xa2\x8d\x3c\x74\xb3\x64\xc4\x23\x30\xc4\xdb\x92\x4f\x47\x53\x3a\x85\x22\x93\x2f\x02\x9f\xca\xaa\x0d\xdf\xfc\xcd\x69\x4c\xe3\x59\x76\xdd\x5d\x10\x24\xe7\x08\x58\x2e\x96\xcc\x5a\x3a\x60\x28\x21\x08\xd0\x1d\x12\x9e\x3a\x68\x2e\xe3\x90\xd8\x5d\x5a\x2e\x64\x05\x2a\xca\xb1\x48\x1f\x42\xfb\xc9\xc9\xfc\x3c\x20\xed\x86\xc5\x21\x8a\xe7\xd0\x1d\x41\x82\x80\xa1\x0b\xad\x9c\x08\x96\x67\xed\xa8\x4c\x18\x65\xe8\x49\xde\x58\xa7\x80\xf3\x8c\xf2\x36\x65\x1b\x75\x50\x3e\x42\x22\x25\x63\x65\xf0\xb0\xd4\x77\x51\xad\x68\x21\xc1\x73\x3e\xf8\x69\xe5\xa7\x5c\x20\x7e\x96\xf4\x03\x92\xb9\xb1\x9c\x41\xe7\x5d\x92\xf9\x00\x3f\xea\xad\xf2\xbc\xa8\xe1\x33\x58\x8b\xf3\x61\x55\x94\xfd\x0f\xf8\xb1\x06\x48\x1d\xcf\x4c\xce\x08\x3b\x91\x5e\xf4\x02\x9a\x6a\xe4\xef\x35\x9b\x82\xf0\x83\xcf\xdb\x02\x82\x94\xb9\xc4\x82\x23\xd0\x6d\x3b\x28\xb9\x11\x4b\x47\xf9\x7d\x38\xb4\x59\x16\xe2\x10\x97\x32\x92\x7e\x16\xe6\x35\xb5\x6f\x47\xbc\x1b\xf0\xc6\xe0\xfb\xdc\x8a\xcf\xf9\x9d\x31\xb2\x13\x42\x2b\x67\xb3\x65\xa8\xf9\x05\x76\xb3\x6e\xc9\x50\x25\x11\xb9\x11\xb4\xf2\x58\x93\xf5\x2e\x77\x7b\xea\x87\x8e\x87\xd8\x26\xb8\xff\x4f\x9d\x96\x5a\x03\xd1\xd5\x76\x16\xba\x38\x17\x78\x2e\x75\x0b\x19\xba\xd6\xb4\x5e\xca\x61\x3e\x12\x34\x9a\x28\xdb\xb5\x0a\x2f\x49\x61\xca\x20\x8e\xcf\x09\xd2\x31\xe3\xac\xaf\x7b\x08\x47\x98\xd6\xc9\x0c\x0f\x62\x8e\xd9\x99\xf7\x78\xa0\x6c\x46\x32\x12\x57\xe4\x58\x4d\x0a\xa8\x84\x34\xa5\xe0\xba\x16\x30\x70\xb0\xb3\x30\x29\x2a\x13\x37\x70\x5e\x53\xd7\xe0\xec\x2b\x53\xa2\x8a\x6a\x1e\x4b\x44\x77\x20\x54\x11\xbb\xeb\xb1\x88\x24\x75\xe1\xf6\x98\x2c\x4a\x36\xe4\x8b\x9d\xec\x78\x16\x29\x39\x24\x6e\x67\xeb\x0b\x73\x55\x57\xc7\xc6\x43\x51\xd7\xd1\xaa\x98\x2c\xae\x44\xb2\x3d\x75\x19\x9a\x4e\xa4\xee\xc7\x01\x41\x9c\x63\x8c\x13\x7d\xc0\xd1\x35\x42\x7e\x56\xe4\xc7\x3d\x4b\xcf\x97\x5d\xdb\x92\x84\x26\x5d\x1e\x28\x7b\x0c\x0b\xe0\xff\x9d\x75\xe8\x20\x78\x4a\xb6\xf4\xdb\x04\x70\x58\x8b\xb7\xd7\xa2\x04\x7e\x90\x3c\x50\x8f\x55\xda\x97\xa4\x5c\xc0\xa1\xcb\xee\x98\x64\xde\x18\x60\xb5\x34\x35\xc5\xc4\x5e\x54\x91\xe7\xf2\x52\xf4\xae\x1a\x52\x3d\x9f\x24\x98\x10\xd2\x44\xd5\x37\x01\x98\xae\x5b\xbe\xc1\x30\xcd\xc8\x4a\xde\x1d\xe4\x9e\x58\xcd\xc8\x31\xee\xd2\x40\x48\x2b\x81\xfb\xed\x56\x9a\x93\xd8\xef\xb6\xd4\x5c\x34\x14\xae\xb4\x3e\xc3\x4a\x42\x76\x90\xd9\x51\xd6\x23\xd4\x64\x2c\x2a\x84\x1c\xc8\x1d\x94\x1a\xce\x3c\xcc\x99\x11\xa4\x7a\x67\xb2\xa6\x47\x4b\x5e\x5e\xc8\xa5\xb0\x6c\x48\x54\xe4\x1c\xe4\xca\x41\x53\xde\x45\x49\xe2\x08\xe5\xc7\x1f\x28\xcd\x39\xff\x4e\xcc\x6b\x91\xd5\x6b\x0d\xaa\xf0\xfb\x45\x89\x6c\xc8\xfb\xec\xf6\x7c\x8a\x5a\x5b\xf7\x33\x2b\x83\xbf\x8b\xa8\x6b\x23\x97\x24\x17\x07\x22\xd7\x9f\x7e\x0c\xb1\x77\x0f\xb0\x4b\x3b\xc3\x93\x6e\x12\x80\xcb\xc7\x73\xda\x75\x31\xfb\x37\x6b\x1b\xa1\xfa\x0c\xd9\xcd\xeb\x4a\x9c\x0d\xb1\xd4\x0f\x80\x8f\x23\xf2\x01\x0d\x1f\x15\xff\x1c\x83\x3f\xf0\x04\xac\x5b\x79\x8b\xd2\xea\x02\xce\xaf\xc8\xa7\x3f\x47\x94\xdd\x10\x03\x40\x73\x1b\x39\xf0\xb7\xcc\x4a\x24\x2b\xb5\x96\x2b\x61\x6e\x0d\x9b\x00\xf6\x79\xcf\xf0\xac\xde\xb0\x4d\x1a\x7a\xde\xd2\x83\xad\xfe\x24\xfd\x3f\x72\x04\x11\xa9\x17\xd7\x1c\x2b\x15\xeb\xa4\x4c\xa1\xf1\x75\xa8\xca\xb4\xd5\x39\xc6\x16\xc5\x50\x97\x60\x5b\x4f\x70\xd4\xfe\x69\x92\xc6\x7a\x04\x1a\xf7\xcc\x6b\x92\xa5\xba\x14\x78\x94\xc1\x15\x57\x52\xf6\xb2\x66\x6b\x93\x52\xee\x42\x5a\xe8\xdf\x42\x9b\x6d\xcf\x83\x66\x8f\x7d\x72\x5e\x17\x69\xad\x37\x0f\x80\x59\x6f\x8f\x02\x82\x67\x70\xb3\x65\x40\xc3\x9e\x51\xb1\x56\xf6\x24\xb6\x7a\x3e\xef\x71\xb6\x8d\xba\xbb\x42\xe8\xf0\x5c\xa1\xda\xff\x3f\xaf\xe7\xc7\x34\x27\xcd\x79\x64\xb5\xff\x28\x87\x14\x14\xe9\x7d\xae\xe6\x28\xbb\xb7\x3a\x47\x8e\x08\xa4\x21\x25\xac\x24\x03\x09\xb9\x3a\x28\xf9\x53\xae\x3b\x35\x47\x5f\x4a\x59\x2e\x27\x5c\xa4\xdb\x43\xf6\xb4\x57\x72\x08\xb9\x7c\x87\xa4\x18\x20\xfd\xdc\x0e\xe5\x88\x01\xa9\x78\x65\x62\x56\x0c\x36\x94\x5a\x59\x31\x93\x7a\x16\x5c\xfc\x4c\x99\xec\xc1\x47\x27\xbb\x5e\xb6\xbe\x41\x6b\x51\x4a\x87\x5c\xab\x29\xe7\xd7\x4d\xf8\xe3\x20\xb9\xb9\xd5\xc2\x67\x37\x35\x02\x0b\x79\x99\x78\x2b\x20\x3e\xa6\x57\x4b\x61\x8d\x72\xc5\x9b\xeb\x8e\x21\x5f\xde\x23\x0b\xbf\x63\x8f\x9a\x39\x4b\xda\x66\x11\xc8\xac\xb2\xda\x89\x49\x24\xce\x15\xf3\x34\x54\xa2\xa0\xe0\x09\xd5\xda\x2e\xd3\x3c\xd5\xe2\x25\xf3\x1d\x3f\x5e\x7d\x69\x99\x6e\xf4\x2a\x76\x11\xc7\x20\x12\x97\xfa\x0a\x95\x20\x17\x96\x9b\xb3\x2c\x89\x83\x7f\x7b\xa2\x0b\x73\x07\x71\xbf\x92\xe5\x02\xce\xdc\xc6\x8a\x9c\x6d\x00\xa1\xbd\xbd\xe3\xc4\x36\x21\x77\x64\x74\xfc\xbe\x10\xc6\x93\xc8\xdd\x5a\x53\x65\x69\x00\x69\x3c\xed\x8c\x39\xb3\x96\xe9\xfc\xca\x60\xd1\x4c\x93\x04\x4a\xe9\xbc\x55\xfb\x75\xf2\x6f\x09\x9b\x6b\xa8\xb0\xc0\xcb\x33\x3d\x20\x29\xfe\x06\xc5\xb5\x99\xa2\x0b\x47\x5f\x7c\x1e\x0e\x88\x30\x53\x6a\xee\xe8\xb6\xae\x02\xf8\x92\xfa\x0e\xbd\x68\xf7\xf8\x4c\x64\x1c\x83\x87\x40\x0f\xa1\xb9\xd9\x2a\xc0\xed\xc4\x9b\xa3\xd4\x77\xbb\xcc\x43\x9c\x5e\xee\x05\xfc\x68\x75\xa2\xa4\x48\xf7\x79\xef\xe1\x4b\x54\xa2\xe6\x92\xe0\xcc\xe7\xb2\xb5\xef\x5e\x10\x7c\x9b\xf8\x9b\x5c\x51\x06\xa9\x0e\x7b\x5c\xda\xcc\x22\xde\x86\xbf\x15\x48\xdb\x5d\x60\x4f\xf9\x02\x60\x16\x3c\x29\x8b\xe1\x43\x2d\x40\xdd\x1d\x44\x86\x1d\x37\xc8\x92\x3f\x11\x6e\xfd\xb2\xda\xc9\x47\xdb\xf2\xe2\x7a\x83\x3c\x27\xea\xc0\x88\x16\xd9\xa9\xd5\x44\xcc\x00\xef\xfe\xab\x8d\xfa\xba\x10\x4b\x30\x5a\x2a\x41\x9e\x26\x85\x6b\xc5\x9f\x31\xea\xe8\xa2\x01\x55\x53\x9e\xc4\x7e\xdf\xb0\x7e\x2a\x99\x8f\x0f\xd6\xc1\x61\xc7\xd9\x55\x9f\x96\x86\xa8\xb5\xc6\x2c\x81\x28\x6f\x02\xe6\x8a\xa3\xbb\xff\x60\x73\xac\xcb\x0b\x1a\xd5\x3f\xb9\x74\x49\x6a\xfa\xfa\xca\x47\x29\x86\x89\x94\x42\xec\x60\xcf\x43\x54\x35\x36\x18\x98\x4b\x04\x2c\xd7\x2b\x8d\x4b\xd5\x72\x91\xf0\x22\xdc\x51\x8b\x68\xe9\x77\xf7\x97\x6c\x6f\xb1\xc2\xa5\x7f\x5a\xb6\x1d\x2b\x0d\x61\x62\x36\x22\x22\x26\x27\x52\xf6\xf7\x04\x20\x99\xe3\x8d\x11\xfe\x77\x59\x67\xea\x54\xb2\x34\x41\xe2\x07\xb9\xfd\x59\xe5\x16\x14\x20\xce\x13\xa9\x8c\x9b\x6a\x27\x7d\x70\x29\x6b\x81\x4d\x07\x02\xe7\xf8\x3e\x05\x3a\xd9\xe6\xec\x04\xb4\xa2\xdb\xbc\x06\x7c\x61\x2a\xae\xc5\xd2\xee\x55\xa8\x2f\xa5\x1d\x97\x0a\xeb\x32\x95\xdb\xbd\x6c\x68\xae\xd8\x93\x90\x50\x95\x12\xa2\x56\xe9\x2c\xad\xb4\x38\x9e\x25\x6f\xcd\xc5\xb7\x4f\xf1\xf6\x4f\x23\xcb\x20\xa2\x14\xbc\xd9\x9d\x85\xca\x1e\xc9\xee\x40\xe3\x9d\x72\xf9\x99\xaf\x06\x1d\x87\xdc\x5a\x72\xe1\xa5\xdd\xbc\x51\x18\xdd\x3e\xf1\x85\xd4\x8e\x78\x2b\x01\x9f\xbc\xe6\x95\x02\x88\xef\xca\xf9\x4f\xee\xc7\x94\xe2\x96\xfc\x1d\x16\xee\x24\x27\x92\x87\xfd\xe5\x42\xaf\x2d\xaa\x74\x6d\x7d\xbc\xff\x11\x48\xff\xc9\x79\xab\xb8\x19\x60\xc7\x72\xbc\xd6\x33\x20\x05\x33\x6c\xfc\x58\x73\x0f\xab\x5f\xb4\xbf\x62\xef\x82\xbc\x7b\x39\x1e\xe8\x82\x59\x8b\x03\xaa\x9a\x3e\x90\x03\x1c\xeb\x7a\xa5\x14\xd1\xc0\x17\x0e\x97\x75\xe9\x2b\xd6\x51\x97\x86\x3f\x57\x5b\xc5\x7e\xd7\xe6\x88\xde\xa1\x7a\xc3\x17\x95\x06\x27\x56\x72\x9f\xb4\x6b\x43\xbe\xad\x43\x31\x11\x12\x52\xfc\xdf\x39\xe5\xd2\x5a\x9e\xbf\xc0\x89\x5c\xf0\x4e\x05\x1e\x22\xfa\x6f\xd6\x55\x7c\x28\x67\x09\x04\xa6\xd9\x14\xe2\xe9\xf6\x91\x6a\xff\xbb\x5e\xbc\x48\x91\x4d\x51\x49\x94\x52\xfa\x3b\x5b\x00\x4d\xc6\x18\x1b\x06\x2d\xbd\x30\x43\xb9\x9e\x35\x16\x73\xa6\xb7\xb5\xeb\xd4\xb7\xde\x85\xb9\xce\xd5\xd6\x9d\xf7\x62\x05\x14\x9c\x2b\x5c\x14\x2d\xa0\xe2\x9c\x85\xa6\x91\xd9\xd6\x53\x05\xa4\x27\x18\x04\x39\x6e\xb3\x71\xe3\x9f\xcf\x43\x64\x66\x53\x1c\x2c\xa4\xf2\xe0\xbd\xd9\x62\xaf\x62\x21\x57\x5b\xde\x8a\x11\x23\x58\x91\xe4\xbe\x8d\x12\x1d\x9f\x2b\x85\x29\xdf\x2f\x24\x85\xa7\xa8\x86\x5e\x78\xac\xed\xd8\xe9\x02\xd5\x72\xe9\xba\xce\x60\xa0\x56\xaf\x66\xf4\xba\x00\x81\xe3\xc5\xc3\xc8\x03\x7e\x59\xcc\xb5\xed\x6b\xb3\x10\xa4\x60\x8d\x68\x9a\x8f\xf5\x7b\x32\xdc\x46\x5a\x79\xc4\xee\xfc\xad\xb9\xd9\x6d\xe6\x49\x76\xae\xfe\x61\x98\x75\xa6\xc0\x4d\x1b\x28\x4d\x59\x6c\x91\x08\x6c\xdf\xcb\x85\x7c\x64\xd7\x11\x2e\x08\x9b\x40\x66\x8a\x72\x0b\xe9\x5e\x29\x9a\xdb\x2c\x7f\xa3\xb1\x40\x30\x98\xb3\xbd\x41\xaa\xe6\xcd\x5f\xc8\x05\x05\x45\xe0\x18\x4d\x95\xcd\x6a\xfa\xe0\x3b\x23\xa9\x0a\xa0\x2a\x70\x77\x06\x1e\x11\x2b\x6b\xed\x28\x8e\x6d\x32\x6c\x26\x5e\x10\xae\xb8\x64\xa0\x6a\x2a\x38\x22\xe2\x1f\x90\xaf\x98\x6d\xe7\x8e\xa5\x53\x43\xc2\x7f\xae\x6c\x46\xe0\xac\x19\x2d\x1b\xcf\x72\x35\x48\x2b\xa8\x4e\xc5\x1a\xaa\xfb\xe9\xbc\xce\x12\xb8\xd8\xb4\x9c\xd7\x6b\x27\xee\x5a\x9d\xdb\x2c\xc9\x5a\xdf\x6d\xe3\xe5\xe3\x8e\x4d\x2d\x23\x86\x6b\x8c\x30\x28\xba\x19\x38\x38\x9e\x49\x95\x68\x50\xbc\x2d\x2f\x2b\x87\x9d\x2a\xd9\xa6\x2e\xc5\x7b\x1d\x28\x93\x41\x32\xb5\x57\x2a\xf9\x4b\x6d\x3e\xea\xdd\x70\x6d\xf7\x02\xeb\xef\xd0\xd4\xad\x2f\x78\x49\x85\x2d\x74\xb6\x85\xf2\x9a\xf0\x2a\xad\xb6\xe1\x12\x46\xd0\x84\x8e\xbc\xec\x6e\xbe\x4a\x7c\x02\xc3\xd3\x45\x14\x86\x2b\x35\x1f\x8c\x78\xe8\x97\xd2\xaf\x58\xad\x76\x1a\x56\xbb\x22\x56\x90\xdf\x6b\x4b\xa2\x29\x55\x9f\x7e\x44\x43\xfb\x46\xbb\x20\x82\xf6\x6f\xa4\x74\x4e\x86\x99\xcf\x72\x60\x5b\x60\x78\xd4\xcf\xf2\xc2\xee\x09\x18\xb5\xba\x1c\xbf\x4b\x93\x66\xbf\xf1\xbe\xa0\x94\xfb\x3e\xf6\xc3\xed\x51\x24\x09\x70\xe9\x21\x33\x4c\xd2\xa7\x20\xd2\xbd\xe7\x5d\x79\x91\x6b\x85\xda\x89\x55\x4a\xf7\xc8\x3c\xca\xd0\x9a\x49\x97\xbe\xec\x59\x6f\x9a\xab\x55\xe9\x3e\xfa\x65\x51\xe4\xca\xff\x05\x02\xcf\x42\xfa\x30\x25\x36\x1a\xb7\x12\x95\x21\xfe\xf3\x9d\xa4\x1d\x0f\xe6\x69\x0d\xf4\xb5\xae\xc8\x13\xa9\xf7\x29\x4d\x63\x82\x77\x82\x3e\x08\xaa\x17\x5e\x15\xa9\xc0\xc0\xe9\x8e\xd1\xc4\x5a\x2a\xad\x64\x24\x94\xbb\xb0\x1c\x2f\xdd\x41\x6f\x3e\x27\x9c\x81\x0d\xf6\x55\x47\xce\xec\x7e\xa8\xd2\x80\xea\xaa\x03\x95\xc2\xbf\x36\xdd\x64\xbb\x95\x88\x5f\x7c\x83\xe8\x8e\xb7\x4a\x5d\xd4\xa5\x40\x19\x84\x06\x37\x49\x82\x4a\x3a\x2c\x9f\x89\xce\x3a\x9a\x3f\xdb\xb6\x97\x4d\x71\x4a\xae\xee\xb9\x45\x21\x7b\xed\x3a\xf4\x88\x92\x66\xb9\x0e\x1d\x07\x62\x81\xdc\x32\x2f\x16\x5a\x62\xa0\x06\x40\xd6\x2f\x96\xc3\x37\x2b\xb9\xaa\xee\x1c\x31\xea\x2c\x41\x44\xf3\xd7\x63\xea\x84\x9b\xa3\xb4\x7d\x6e\x9d\xa9\x9d\x3e\x79\x2d\xd8\xe4\x12\xfe\xd7\x85\x20\x8c\xc0\x08\x75\x1b\xb5\xf3\x1b\xd8\x05\x98\x9d\x7b\x4b\x4e\x34\xac\x46\xe4\x03\xd5\x17\x30\x5e\xde\x67\xe8\x51\x23\x0a\x61\xe2\xd0\xc8\x50\x20\xf4\x97\x81\xb3\x62\xb1\x7f\xdf\x75\x72\xf2\x9b\x76\x9b\x1c\xed\xd6\x26\x9b\x42\x8f\x43\x69\x5f\x53\xb9\x39\x55\x79\xb3\xf9\xf7\x55\x1f\x26\x34\x37\xe9\x47\xda\xb6\x35\xf4\x13\xb9\xd2\x90\xf0\xef\x0b\x33\xe1\xc1\x3a\x4b\x48\xd6\x04\x8d\x44\x60\x4f\xe9\xd4\x41\xb8\xdb\xa4\x65\x1a\x10\x23\x8b\x49\x8e\x16\xeb\x67\xe8\xa3\x01\x12\x08\xa8\xc9\xda\x1b\x26\x2c\x2c\xd4\x2b\x13\x57\xad\x2d\x3d\xb2\x45\xd3\x73\xa8\x37\x12\x50\x42\x69\x1a\x14\x3c\xed\x17\xa3\x98\x58\x20\x65\xf1\x90\xe2\x83\x7c\x6b\x9c\x99\x62\x0e\x23\xf2\x7a\x3d\xb3\x65\x63\x02\x0d\xac\x65\xd1\x66\x29\x49\xf9\xce\xd0\xbd\xc4\x41\x3d\x64\xd4\xae\xe6\x03\xec\x29\x3d\x01\xfb\xa0\xca\xb0\xc2\x69\xaf\xdb\x34\xde\xf4\x41\xb4\x85\xee\xa8\x18\xba\x93\x74\x78\x93\x0a\xce\x2c\x10\x55\x94\x21\x3c\x74\xb6\x0a\xe2\x6d\x9b\xe0\x8e\x29\xc3\xde\xd1\x9b\x9b\x07\xe5\xc1\xf6\xa7\x1c\xe8\x35\x38\x0a\x8e\x2c\x20\xfb\x30\x85\x89\xe8\x7f\x40\xcc\xc9\xc9\x87\x5f\x1b\xbc\x18\x9a\x36\x23\xb3\x10\x7c\xb0\xd7\xe2\x21\x7d\x66\xea\x74\x3b\x8d\xeb\xfe\x9a\xad\x63\xb9\x3b\x30\x5a\xb5\x4c\xee\x70\x69\x5b\xb6\x1b\x14\x42\xa3\x39\x01\x7b\x9b\x34\x2b\x1a\x6c\x3c\x7f\x13\x22\x63\xef\xf6\x93\x83\xee\xec\x76\x6c\xd8\xa5\xbc\x71\x28\xd6\x96\xe6\xe5\x34\x06\x34\x75\x44\xd7\x74\x07\xeb\x3b\x06\xc6\x2d\xe1\x79\xb0\x39\x28\xfb\xa2\x25\x85\xbd\xd5\x2f\x45\x92\x39\x45\x06\x56\xde\x1b\x78\x8d\x53\x20\x00\x4f\x53\x6b\xf7\x2b\xe6\xb7\xd9\xbe\xfc\x14\xde\xbe\x74\x9f\x94\x28\xc6\x58\x17\x0d\xc4\xe0\x9b\x18\x6d\x32\x58\xc0\xb3\xf8\xe0\xd1\x4c\x79\x51\x47\x92\x6d\x21\xe7\xd1\x83\xf9\xda\x1f\x8f\xfb\xa3\xe9\x33\x84\xfe\xe1\xc2\x5c\x0d\xae\xfb\x4f\x93\x81\x99\xde\x0d\xcc\xe3\xf8\xe1\xd3\xb8\xff\xd9\x0c\x27\xe1\xb9\xd4\x8d\xb9\x1d\x0f\x06\xe6\xe1\xd6\x5c\xdf\xf5\xc7\x9f\x06\x3d\x8e\x1b\x0f\x38\x22\x5a\x49\x3a\x4e\xa3\x05\x30\xea\x41\xfe\x1e\xfc\x73\x3a\x18\x4d\xcd\xe3\x60\xfc\x79\x38\x9d\x62\xb5\xab\x67\xd3\x7f\x7c\xc4\xe2\xfd\xab\xfb\x81\xb9\xef\x7f\x45\x26\xfe\xcf\xeb\xc1\xe3\xd4\x7c\xbd\x1b\x8c\xcc\x03\x57\xff\x3a\x04\x39\x93\x69\x9f\xe3\x87\x23\xf3\x75\x3c\x9c\x0e\x47\x9f\x64\x3d\x76\xb5\x8e\x87\x9f\xee\xa6\xe6\xee\xe1\xfe\x66\x30\x96\xd6\xd7\x5f\xb0\xb9\x4c\x34\x8f\xfd\xf1\x74\x38\x98\x90\x8c\x2f\xc3\x9b\xee\x99\x4e\xfb\x13\x50\x7d\x6a\xbe\x0e\xa7\x77\x0f\x4f\xd3\x96\x76\x9c\xad\x3f\x7a\x36\x7f\x1f\x8e\x6e\x7a\x66\x30\x94\x85\x06\xff\x7c\x1c\x0f\x26\x3c\x3e\xd6\x1e\x7e\x06\xc1\x03\x7c\x1c\x8e\xae\xef\x9f\x6e\xa4\xab\xf6\x0a\x2b\x8c\x1e\xa6\x60\x13\x0e\x86\x61\xd3\x07\xe1\x4c\x18\x1b\x56\x27\x31\x58\xff\xf3\x60\x0c\xf6\x8d\xa6\xfd\xab\xe1\xfd\x10\x5b\xb2\x0d\xf7\x76\x38\x1d\x61\x0b\x61\x5d\x5f\x29\xbf\x7e\xba\xef\xe3\x10\x4f\xe3\xc7\x87\xc9\xe0\x42\x19\x88\x35\xc0\xee\xf1\x70\xf2\x77\x83\x03\x78\xb6\xfe\xe3\xa9\xdf\xac\x03\xde\x62\x89\xcf\xfd\xd1\xb5\x88\x69\x47\x8c\x3c\xad\x79\x7e\x78\x42\x8c\xc0\xa9\xef\x6f\x3a\xdf\xc9\xa6\x81\xb9\x19\xdc\x0e\xae\xa7\xc3\x2f\x90\x2d\x06\x62\x97\xc9\xd3\xe7\x81\xe7\xf6\x64\x2a\xec\xb9\xbf\x37\xa3\xc1\x35\xa8\xed\x8f\x9f\xcd\x64\x30\xfe\x32\xbc\x16\x2e\x8c\x07\x8f\xfd\xe1\xd8\x48\xbb\xf1\x78\xcc\x55\x1e\x46\xf4\x25\x1f\x2f\x28\x38\x28\xc8\xe0\x0b\xc5\xff\x34\xba\xe7\x49\xc7\x83\x7f\x3c\xe1\x30\x07\x94\x80\x2b\xf4\x3f\x41\xd1\xc8\xc8\x58\xe6\x5f\x87\xd8\x9a\xd2\xd9\x15\x7c\x4f\xa6\xe0\x43\x2b\xf8\x67\xa8\xd0\x83\xf9\xdc\x7f\xd6\x0e\xe7\xe7\xa0\x1a\xd8\x31\xb4\x40\x77\x35\x02\xfc\x6c\x15\xb3\x7f\xf5\x40\x0e\x5c\x81\x9e\xa1\x90\x05\x42\xc8\x0e\x8a\xe7\xa6\xff\xb9\xff\x69\x30\x89\x14\x40\xb6\xf6\x0f\x0c\x7b\x66\xf2\x38\xb8\x1e\xf2\x3f\xf0\x1d\x6a\x07\x39\xdf\x2b\x4f\x60\x40\xff\x78\xa2\x08\xf1\x83\x5f\xc4\xf4\x21\x4b\xae\x40\x1d\xf4\xf2\xa2\xf9\x51\xcf\x46\x41\x3f\xb0\xf7\xae\x49\x9e\xb5\x7b\xef\xeb\x9e\xb9\x7f\x98\x88\xa2\xdd\xf4\xa7\x7d\x23\x14\xe3\xdf\x57\x03\x8e\x1e\x0f\x46\xe0\x97\x98\x52\xff\xfa\xfa\x69\x0c\xb3\xe2\x08\xce\x00\x35\x93\x27\x18\xda\x70\xa4\x42\xe1\x79\xc5\x90\x87\xe3\x9b\xc6\x96\x44\x3d\x6f\xfb\xc3\xfb\xa7\xf1\x9e\x82\x61\xe7\x07\xb0\x90\x4b\x8a\xa2\x45\x02\xd1\x11\x93\xf3\x9e\xe8\x80\x19\xde\x62\xab\xeb\x3b\x2f\x3d\xd3\xb1\xd8\x67\x73\x07\x51\x5c\x0d\x30\xac\x7f\xf3\x65\x28\x56\xe7\xf7\x01\x91\x43\xcf\x93\x07\xbf\x82\xe7\x23\x21\xc7\x48\x07\x1e\x68\x81\x3f\x39\xb9\xd3\x06\xa5\xbe\x24\x99\x5a\x30\x9d\x4a\x7c\xc7\x8f\xcf\xf4\xaa\x23\x60\x19\x1f\xc8\x9c\x64\xd2\x52\x2e\x45\xdc\xcc\x8a\x0d\x1b\xb1\x14\xea\xb4\x9d\x39\xd1\x1b\x2f\x8f\xf6\x7d\x34\x7c\x91\x07\x11\xc0\xf8\xc8\x2c\xb4\xee\x55\xbb\x26\xc2\x68\xbe\xe6\xd3\x68\x0e\x62\x85\x40\xca\xcb\x2b\x26\x0e\x1a\xd0\xb5\x21\x43\xa2\x4c\x5a\xed\xb8\x7b\x8d\x72\xcd\xf3\x15\xf6\x07\x75\x8a\x95\xd1\x3b\xc8\xb8\x81\x4b\xb0\x8c\xbe\x0a\x0b\xe5\xd5\xaa\x4a\xfc\xad\x51\x0b\x7b\x9a\x66\xd8\x22\xbe\xe9\x84\xf5\x4a\x76\xe3\x92\x25\x49\x26\xb9\xcd\xe4\x75\x18\x2b\x0d\x74\x72\x4b\xc4\x2f\xfe\x96\x84\x57\x7b\xcd\x3b\x49\x7d\x90\xa1\x0d\x79\x08\xff\xaf\x76\xeb\x6f\x9d\x00\xc9\x9d\x47\x60\xdd\x86\x5a\x59\x4a\xd6\x70\x2b\x29\x8d\x08\x66\x8b\x2e\xe1\xad\x39\x6d\xa2\xfd\x29\x60\x7a\x1e\xfa\xe6\x36\x85\xe4\x35\xd2\x0f\x23\x6d\x73\x72\xce\x5a\xaf\x0e\xe4\x79\x1f\xc3\x36\x38\x04\x9e\x90\x8f\x32\x35\xdc\xe3\x47\x47\x7f\x07\x0c\xc6\xeb\x25\xad\x6e\xb1\xaf\x2b\xd1\x3e\x9e\x44\x04\x2f\x8d\xd4\xa6\xfb\x58\x78\x8b\xff\xd1\x49\x0c\xe1\x82\x5f\x7c\x4a\x19\x3d\x9b\xe9\x08\xf5\xb2\x79\xc6\xd7\x11\xa5\x02\xd8\xe8\x35\x14\x7e\x38\xd8\x2b\xf9\xc3\x77\xb4\xec\xaf\xfa\xa3\xb8\xef\x32\x7a\x62\xa0\x6f\xa2\xc3\x06\xf7\xd1\x8d\xd5\x59\xb7\x81\xf8\x7c\x1f\xf6\x5e\xec\x1f\x38\xae\x21\xf8\xac\x69\xc5\x96\x99\xca\x73\x32\x80\x25\xd8\x0a\xc4\xa4\xe9\x47\x08\xcd\x74\x23\x21\x3c\x5f\x36\x0f\x12\xfc\x05\x9e\x94\x60\x33\x69\xc4\x0b\x3d\x91\xa0\x79\x37\xc2\x82\xec\x9f\x07\xd8\x89\xb5\x3f\xe3\xa6\x3e\x89\x96\x17\xa9\x4c\x86\x9c\x6f\xce\x8e\xd5\xb3\x6d\x5f\xe8\x74\x64\xfc\x48\x44\xf1\x5d\x62\xcb\xb6\x4b\x66\x9a\x50\xd7\x3f\x08\x52\xf5\x05\x7a\xcf\xfc\x1f\x5e\xa0\x5f\x18\xbe\xb0\x93\xd4\x3d\x6e\xca\x60\x69\x4b\xdd\xa7\xdc\xee\xeb\x8b\x41\xea\x92\x65\xc7\x57\x59\xe4\x38\x8b\xbe\x6e\x03\x38\x87\xdf\x4a\x33\xad\x45\x76\x9a\x25\x3a\xad\x9d\xbd\xc6\xbb\xf9\x47\x15\x09\x59\x58\x36\xcd\xaf\x59\xfa\xcd\xfb\x42\x69\x22\xc4\x38\x71\x2f\x4e\xdf\x14\x74\x9a\x44\x61\x1b\xf6\xf7\x93\x93\x4f\x39\xf0\xef\xab\x02\xef\xa0\xbd\x7f\xf9\xad\xb7\x6b\x9b\x2c\xd6\x74\x6d\xd3\xc4\x33\xe7\x05\xf1\xbd\x48\xa2\x7f\x35\x79\xb8\x07\x44\xb8\x7f\x8e\x91\xed\xa5\x68\x80\x17\xbe\xa9\xb6\xd0\xe0\x7f\xc9\xdb\xcb\xb7\x77\xfe\xe1\xd4\xae\x71\xb7\xd1\x42\xdc\xb7\xcd\xb8\x87\x16\x78\xbb\xb6\xee\x1f\x0d\x35\x45\x9c\x90\x1f\x5d\xc6\xdb\xcc\xdf\xc5\x04\xf8\x57\x64\xab\xed\x86\x59\x97\xdc\x31\xb5\x1d\xd0\x81\x2e\xd9\xbf\x99\xed\x35\x35\xbc\x17\xed\xf4\x20\x77\x92\xba\x63\xef\xac\x1e\x96\x72\xb1\xe1\xef\x22\xda\xed\xe4\xba\xd6\xd7\x7e\x66\x0c\x4c\x72\x73\x2e\x49\x93\x64\xfa\xd1\x33\x9f\x83\x94\xf9\x57\x3b\x5a\x29\x17\xdb\x9e\x51\xb8\x58\xf2\xfd\x1c\x04\x7c\x93\x02\xc3\xda\xe6\x35\x78\x65\xd7\xee\xfd\x7b\xfa\x60\x49\x6b\x5d\x9d\xea\x85\x6a\xf3\x3e\xbd\x6b\x95\xd2\xd1\xc6\x27\xb4\x32\xc4\xc2\x5b\x14\x5b\x4c\x3b\x0b\x0f\xb5\x9b\xfe\x5d\x3f\x7b\x6d\xcb\x73\xa3\x8f\x8f\xb1\x38\x93\xe9\x4c\xef\x1a\x72\x6d\xf2\xe6\x15\x2f\x1f\x8c\xb5\x05\xb2\xf6\xbd\xc9\x69\xfb\x2c\x23\x80\x05\x1a\x31\x5f\x76\x3b\x79\x6e\x78\xe7\x7b\xb8\x13\xb6\x2d\x6c\x32\xf8\x7e\x69\x53\x92\x29\x54\x4c\xbe\x2e\x78\x2e\xb6\xc5\x62\x9b\xdb\x60\xd1\x0c\x60\xb3\x6d\xb3\x8b\xf6\xe2\xb4\xbb\x8b\x35\x30\x30\x7b\xbf\x1a\x4c\xee\x5f\x91\x66\xbf\xe3\xcd\x94\xf4\xda\xc1\xee\x9c\xbe\x43\x75\xc6\x37\x85\xb0\xe7\xc4\x9d\x37\x45\x2d\x6c\xf5\x37\x52\x62\xee\x92\xf9\x37\x5b\x82\x99\xda\xb2\xc1\x87\xca\x50\x8e\xe9\x16\x46\x45\xff\xf1\x01\x68\xaa\x4c\x33\xf9\xff\x8e\xd1\xfe\xfa\x08\x52\xd2\xf0\x86\xe9\x0b\xb4\xe6\xe4\x7f\x03\x00\x00\xff\xff\xcf\x8c\xfe\x68\x7d\x43\x00\x00") - -func confLicenseGnuGeneralPublicLicenseV20Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuGeneralPublicLicenseV20, - "conf/license/GNU General Public License v2.0", - ) -} - -func confLicenseGnuGeneralPublicLicenseV20() (*asset, error) { - bytes, err := confLicenseGnuGeneralPublicLicenseV20Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU General Public License v2.0", size: 17277, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuGeneralPublicLicenseV30 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x7d\xdd\x72\xdb\x58\x92\xe6\xbd\x9e\xe2\xdc\x59\x8a\x80\xe5\x72\xd5\x74\xf5\x74\xb9\xa2\x22\x68\x99\x2e\x73\x5b\x96\x34\x92\x6c\x8f\xef\x16\x24\x0e\x45\x8c\x41\x80\x83\x1f\xc9\x9c\xab\x7e\x90\xd9\x07\xd8\xd7\xd8\x47\xe9\x27\xd9\xfc\x32\xf3\xfc\x81\xa0\x5d\x3d\xb3\x11\x7b\xd1\xd1\x65\x11\x38\x3f\x79\xf2\x3f\xbf\x93\xf8\xfd\xea\x83\xf9\x7d\x7e\x35\xbf\x9d\x5d\x9a\x9b\x0f\xaf\x2f\x17\x17\x86\xfe\x37\xbf\xba\x9b\x9b\x93\x8f\xb6\xed\xca\xa6\x36\x3f\x65\xe6\xc7\xbf\x98\xff\x31\xd4\xd6\xfc\xf8\xc3\x0f\x7f\x3e\xb9\x68\x76\xfb\xb6\x7c\xd8\xf4\xe6\xff\xfc\x6f\xfe\x8b\x79\xdb\x5a\x6b\xee\x9a\x75\xff\x94\xb7\xd6\xbc\x6d\x86\xba\xc8\x7b\x7a\x35\x33\x8b\x7a\x75\x6e\x7e\xdd\xf4\xfd\xee\x97\x17\x2f\xd6\xdd\xfa\xbc\x69\x1f\x5e\xfc\x76\x72\x32\x7f\xb4\xed\xbe\xa1\x11\xcb\xce\xec\x6c\xbb\x2d\xfb\xde\x16\xa6\x6f\xcc\x8a\x06\x37\x79\x5d\x98\xa2\xec\xfa\xb6\x5c\x0e\xbd\x35\xf4\xec\x92\xc6\xdb\xe2\xc7\xd2\x76\xa6\x59\x9b\x7e\x43\x2f\x56\xe5\xca\xd6\x9d\x35\x45\xb3\x1a\xb6\xb6\xee\x33\x43\x8f\x9b\xd5\x26\xaf\x1f\xca\xfa\xc1\x94\x3d\x46\xaf\x9b\xde\xe4\x55\xd5\x3c\xd9\xe2\xfc\xe4\xe4\xa6\xb5\xf9\x76\x59\xd9\x93\x93\xfb\x8d\x35\xbc\x7b\x5b\xdb\x36\xaf\xcc\xcd\xb0\xa4\xf1\xcc\xa5\x8e\x49\x6f\xe6\x66\x4d\xfb\xca\x78\x49\x95\x5d\xf7\x7e\xbe\x75\xd3\x9a\xce\xed\x16\x6b\x6d\xfa\x8d\x6d\xcd\x97\xb2\x2e\x78\x71\x4f\x4d\xfb\xa5\x3b\x97\x29\xf4\x9d\x8e\x5f\xda\x36\x5d\x3f\xf5\xe6\xae\xcd\x57\x7d\xb9\xa2\x55\xf0\xab\x06\xbf\x16\xb6\x2b\x1f\x6a\x21\x4a\x9f\x7f\xa1\xc7\x9f\xf2\xbd\xd9\x37\x43\xcb\xcb\x2a\x9a\x2d\x7e\xe9\x36\x6e\x24\xde\xb6\x25\xc2\x58\x9d\xdf\xbc\xde\xd3\xd2\xeb\xbe\xcd\x3b\xa2\x4c\xff\xdd\xed\x96\x75\x6f\xeb\x42\x26\x7c\x18\xf2\x36\xa7\x7f\xdb\xef\x4f\x48\xb4\xc5\x01\x81\x53\x78\xf3\x39\xed\xa6\x79\x68\xf3\xed\xf3\xe7\xf4\xf8\x16\x2b\xef\x06\x7a\x85\x4e\xa3\xb5\xdb\xbc\xa4\xa7\x30\x5c\x20\x03\x08\x83\x41\xca\xbe\x33\x43\x47\x23\x9d\x9b\x4f\x56\x16\x7c\x9c\xaf\xe8\xc1\xef\x6d\xc9\x13\x9c\x16\x85\x4d\xb8\x09\x5f\x61\x29\xf9\x6e\x57\x81\x95\xf2\xaa\x6b\xb0\xad\xbc\xde\xeb\x59\x80\x78\xb4\xd2\xca\xe6\x1d\x68\x01\x3e\x03\xe1\x97\x7b\x5e\x60\x3e\xf4\x9b\x06\x4b\xfc\xdc\x0c\x66\x95\xd7\x3c\x10\x7e\xc2\x20\x4c\x2b\xdd\x7d\x47\x3b\x68\x1a\x62\x82\x4f\x1b\x5b\x9b\x27\xda\xef\xce\xe6\x5f\xb0\x96\x64\xf7\x19\x7e\xc2\xe6\x5a\xbb\xb6\x6d\x0b\xb6\xa5\x81\x94\xde\x19\x33\xef\xae\xa5\x0d\x9d\x9b\x6b\x1a\x7b\x7a\xa7\x87\xfc\x12\xa8\xde\x6f\xf2\x1e\xeb\x32\x9b\xfc\x51\x28\x16\x9d\x65\x24\x62\x41\xb2\xd2\xc3\x39\xd5\x93\x6e\x1f\x84\xa0\x34\xc2\xd6\x94\x6b\x1e\xf2\xa9\xec\x36\x67\x59\x98\xa2\xb5\x2b\x5b\x3e\xe2\xe5\xa1\x5d\x61\xc8\xc2\x1a\x7a\x05\x54\x7a\xb0\x3d\x8b\xa3\xbe\x48\xac\x45\xff\x8c\x5e\xc5\x33\x11\x03\xfb\xe9\xe9\x75\x9c\x34\xad\x6d\x25\xab\xc3\x20\xb5\xa9\xed\x93\xac\x33\x10\x1b\xeb\xf4\xc3\x7d\xa9\x9b\x27\x3f\x6e\xd1\x60\x4c\xe6\x17\x22\x2f\xcb\x65\x83\x17\x7b\xbb\xea\xe5\xc8\x58\x99\x75\x7c\x14\xb5\x15\x0a\xee\x5a\xfb\x48\x1a\x45\x78\x02\x1c\x4b\x14\x2b\x6c\xbd\xc7\x01\x61\x60\x19\x51\x5e\xc4\x2a\xf3\xee\x8b\xff\xa9\x01\xe9\x5b\xc8\x12\xd3\x4b\x9f\x3a\x37\xa4\x0e\xe8\x94\x1b\x1c\xba\x3f\x91\x95\x6d\x7b\x92\x09\xa2\x5d\xb7\x23\x01\x2a\x97\x65\x55\xf6\x38\x09\x25\xd5\xe4\x11\xc5\x24\xca\x30\xbb\x3e\xbc\x6d\x8a\x72\x0d\x66\xfc\xe5\x70\x3c\x5a\x15\xfe\x86\x3d\xc7\x5c\x00\xd9\xe0\x2d\x12\x59\xde\xd2\x48\xf6\x6b\xbe\xdd\x55\x34\xea\xb7\xe6\xef\x86\xd5\x26\xc8\x39\xd1\x6d\x63\x59\x74\xe8\x5f\x7d\xc9\xe4\x60\x99\x36\x6b\xab\x5b\xdd\x0e\x24\x86\xbb\xbc\xa3\xdf\x6a\xd6\x67\xa0\x8a\x5d\x95\x34\x60\x4d\xf4\xe3\xfd\xe4\x5b\xbf\xaa\xee\x80\xa7\x0a\x11\x38\x1e\x67\xc4\xdc\xf4\xf2\x9e\x65\x2d\xf3\x0c\x18\x31\x9d\x90\xca\xf3\xe3\xb9\x99\x11\x9f\xf8\x25\x75\x1b\xe2\x13\x66\x69\xe5\x10\xb2\x44\x9d\xe9\x78\x81\x7b\xe1\x22\xfa\xaf\xd2\x71\x08\xd1\xe8\x0d\xb1\x45\xd5\xec\xc0\x13\x3c\x7b\xa2\x87\x6e\x2e\xa7\xf8\x8a\xe4\xa4\xdf\x98\xfe\x89\xd8\xa2\xb7\xbb\xee\x17\x73\xfa\xf2\x8c\xf8\x85\x34\x5d\xcf\xa6\x45\x4c\x29\x08\x93\x1c\x2b\x18\xfa\xf4\xc7\x33\xa2\x37\x29\x06\xe5\x39\x22\xae\xd3\x6e\x0f\xe5\xa3\x63\xb8\xca\x3e\x90\x4e\x60\x2b\xda\xb1\xc1\x56\x33\x9a\xc5\xa7\x47\xc3\xbd\x60\x85\xa8\x2c\xa2\xe7\x8d\x39\x0b\xbf\xa7\x67\x3c\xab\xea\xb8\x67\x6e\x33\xac\x70\x79\x93\xb4\xc1\x15\x29\xc6\x96\x34\x9e\xfd\xba\xab\x58\x99\xbb\x43\x68\xad\x58\x5b\x92\xee\x16\xb6\x63\xaf\xfa\xa2\x1c\xe9\xfb\x73\x83\x79\x97\xc4\x75\xa2\xed\x47\x73\x76\x74\xba\x61\xb6\xd6\xfe\xfb\x50\xb6\x56\x67\xe1\xc5\x97\x24\xa0\xde\xde\x2c\x2d\xb1\x43\xfb\x85\xfe\x94\x77\xaa\x40\x8a\x4c\x0e\x50\x56\x55\xb2\x42\x26\x83\xbf\xc5\x39\x90\x95\x81\x46\xa5\xb7\xf2\x5e\x09\x53\x18\x52\xbb\xe4\x88\x34\x43\x47\xbb\x82\x25\x90\x95\x80\xcf\xa1\x04\x4a\xfa\xc1\xcf\x47\x44\xbb\x6b\xb6\x4c\xb1\x72\x35\xa1\x77\xa1\x21\x64\x57\x26\x5f\xd1\x03\x2c\x76\x44\xa4\x1e\xf6\x8d\x76\xdd\x0e\xf5\xc4\x26\x46\x12\x8d\x17\xca\x82\xd9\x8a\x64\x2b\xaf\x68\x39\xc3\xc3\x86\x1f\xd9\xe6\xf5\xb0\x26\x57\x81\x98\xbf\x75\xba\xad\x6b\xa0\x59\x60\xbf\x89\xd0\x30\x90\xf0\x84\x68\x3e\x3a\xe4\x7a\xd5\x6c\x77\x24\x92\xb4\x7d\x65\x42\x1a\x23\x2f\xb7\xb2\x37\x39\x5b\xe2\x21\x3d\x86\xc8\x30\x4c\xa8\x62\x56\x5f\xa6\xdb\x13\x0f\x6f\x69\xc8\x15\x89\x33\xb9\x6c\x6d\x1d\xf4\xc1\x12\xb2\xd0\xac\x56\x43\x0b\x5f\x42\xe6\x22\x6f\x4b\x27\x2b\x86\x55\x2f\x4e\x10\x79\x49\xc4\xbb\xc5\x40\xa6\x17\x73\xd1\x5b\xd0\x20\x25\x0d\x01\x5f\x10\x6a\xa1\xb3\xb4\xfa\x27\x61\x29\xf6\xe1\xd8\x8c\x0f\x35\x68\xba\xeb\x73\xda\x4e\xa2\x4c\x49\x6d\xb3\x2e\x0d\x27\x01\x72\x28\x79\x1d\x75\xc1\x4d\xac\xd7\x9b\x0d\x29\x45\x51\x0c\xea\x76\x39\xcb\xd6\x74\xd6\xaf\xf4\xdc\x2c\x74\x5f\x9e\x7d\xf2\x96\x16\x46\x7f\x5b\xd2\x71\xd6\x7d\xa9\x24\x56\xaf\x81\x08\x07\x69\xe0\xc5\xe0\xf7\x82\x58\x37\x2f\x98\xa1\xec\x57\xf8\x55\xb2\x28\x1a\xec\xb1\x74\x32\x2a\x33\xea\x9b\x18\x6a\x3d\xe0\x64\x0f\x18\x83\x96\x9e\x81\xbf\x61\x9b\x9c\x75\x12\x2d\x33\xd2\xe4\xe2\x3d\x91\x60\x97\x35\x56\x97\x19\x0b\x2f\xdb\xe9\x69\x10\xb2\xdf\xd0\xb2\x68\x39\x34\x0c\xb9\x86\xbc\x91\x8a\x7d\x1b\xcf\x7c\x3b\xfc\x8c\xfd\xdf\xf5\xf4\x5f\x1d\x54\xe4\x50\x15\xc1\x8b\x76\x0f\xa8\x41\x21\x29\xa2\x75\xa8\x06\x01\xe7\xb1\x34\x33\x27\xac\x23\x33\x0e\x65\xcc\xae\xcb\xf3\xdd\xd0\xee\xb0\x6d\xb0\x26\x89\x5f\xdb\x89\xd3\xce\x0c\xd3\x74\xaa\xd3\x8b\x86\x09\x09\x07\x83\x45\xf2\xb1\x29\x0b\xe1\x46\x32\x60\x44\x79\x53\x80\x3f\x5b\x79\xd8\x2d\x48\x5c\x3a\xa6\x4f\x9e\x78\x07\x34\x17\xb6\xc0\x76\x83\x4e\xde\x92\x42\xa5\x63\x7f\x04\x93\xd1\x13\xe4\x5e\xd9\x3e\x6f\xf7\xc4\x52\xc1\xec\xe3\xb0\x82\x16\x22\x65\x3d\x78\x25\xe4\xa6\x23\xf1\x53\x5d\x32\x74\x32\x6b\x64\xf2\xdd\xcc\x75\x53\x3f\xc7\x52\x34\x18\x50\xee\x56\x3b\xc3\xae\x55\x43\xd2\xd0\xf3\x69\x83\x09\xa1\xb6\x49\x24\x23\xcd\x0d\x5e\xc1\x83\xa2\x36\x56\xec\xfe\xd2\xa3\x38\x0a\x0c\x3a\xbf\x7d\x7f\x67\x66\x57\x6f\xcc\xc5\xf5\xd5\x9b\xc5\xfd\xe2\xfa\xea\xee\xe4\xe4\x87\x73\xf3\xc6\xae\xcb\x5a\x06\xa6\xc7\xfe\xfe\xb7\xff\xbc\x8f\x8c\xc7\xdf\xff\xf6\xbf\xc4\xdf\xe4\x53\x74\x82\xf2\x93\xe7\xb7\xa3\x3e\xb5\x0c\xe5\xe3\x3f\x8c\xc3\x0e\xf4\xd6\xe6\xb4\x01\x6f\xcc\x9e\x57\x25\x91\xba\xca\x9f\x94\x64\xe2\x23\xd3\x54\x53\x71\x52\xa6\xea\x83\x58\xcd\x6e\x4b\xd0\x83\xe4\x0f\x96\x8a\x5c\x2a\xbf\x76\x6b\x6e\x84\xa2\xe9\xd2\xe1\xb5\xfb\x59\x73\x56\x73\xf0\xde\x35\xe6\x22\x3e\xd4\x03\x09\x5b\x3f\x37\xf3\x9c\x66\xd3\x27\x24\xcc\x2b\x0a\x3a\xdc\x4e\x6c\x08\xcd\x46\x26\x95\x66\x39\xc7\x7f\xea\x4b\xb6\xe3\x9d\xd2\x29\xd0\xdf\x82\xdf\x82\x3f\x6e\x11\x1a\xd8\x44\xa7\xd1\xda\x29\xc8\xcd\xeb\xf2\x3f\x72\x47\x7f\xe2\x2c\x7a\x53\x6c\x2f\x0f\x25\xeb\x14\xb2\xb9\xa0\x97\x7d\x4c\xf8\x4d\x45\xbe\x63\x61\xc3\x3f\x76\x79\xdb\xbb\x73\xe1\x77\x48\x50\x88\xbb\xf3\x6e\x83\x23\x13\xf3\x08\x1d\x1e\x1c\x89\xe0\x07\x64\x4a\x6f\x3a\x83\x5a\xcd\x07\x3b\xa9\x08\xd2\x6a\x78\x7a\x2b\x71\x40\x44\xb5\x13\x0d\x86\x8a\xed\x81\xcc\x03\x0e\xaf\x2a\x50\xc5\xaf\x3d\xb2\x5a\xd8\x85\x2e\x0b\xfe\x40\xe9\x02\x27\xf6\xfb\xf8\xbf\xe8\xa5\x25\x87\x50\xf2\xf0\xf8\x49\xa2\xca\x0c\xcf\xac\x1a\x1a\x91\x9e\xc2\xdf\x98\xa0\x4c\x13\x5b\xea\xca\x49\xba\x6a\x3f\xb7\xf2\x40\x34\x89\x9b\x81\x9f\xd4\x9f\x3d\xbd\x21\xdc\xf9\x03\x89\xeb\x14\xc9\x0b\xe6\x1e\x0e\x09\xc4\x36\xb2\x4d\xc8\x29\x28\xc1\xbf\x9a\x21\x25\xe4\x53\xd0\x20\xe2\x15\x13\x17\x40\x73\x22\x11\x60\xc1\xb3\x64\x1c\xe8\x9f\x55\xc9\x4c\x28\x56\x6e\x8d\x83\xb1\xac\x13\x85\x0f\x59\x41\xad\xf8\x89\x70\x5c\x24\x25\xa4\xa7\xbf\xc2\xb0\xd1\xff\xd9\xd5\xd0\x6b\xea\x02\x72\xef\xb5\xa4\xf1\xae\x1b\x7e\x85\xeb\x5d\x3e\xe6\xe2\x93\xd3\xf1\xdd\xe8\x46\xc1\x12\x64\xf4\xab\x81\x2c\xe1\x11\x55\x72\xca\x7b\xa5\xd1\xdc\x2e\x63\xbd\x42\xc1\x9c\xb2\x48\xfe\x98\x97\x15\xaf\x54\xbd\xf5\x1d\xeb\x01\xf1\x4a\x89\x05\x3b\x78\x41\xa4\x56\x6b\x1a\x19\x31\x01\x9f\x16\x8c\xe9\xa3\x44\x1b\x24\x49\x4f\xb6\xaa\xfc\x51\x10\x89\x1e\xed\x21\xeb\x43\x7e\xa1\x0d\xd4\x47\xf0\x9b\x60\xad\x61\x6b\x2c\xc0\x0d\x0e\x41\xd0\x38\x86\x8f\x01\xde\x94\xba\xfb\x12\x98\x9c\x9b\xf7\xec\x30\xd4\x44\xae\x9c\x9d\x56\x39\xd7\x9c\xcd\x22\x2c\x1f\xbb\x51\x11\x4d\x6b\xdb\x63\x2d\x72\xe2\xf0\x5c\x7b\xf2\x5b\x3b\x78\xdb\x9c\xc6\x10\x17\x5a\x33\x48\xb2\x01\x22\x0d\xf8\xb6\x0e\xb3\x3c\x5a\x19\x9e\xff\x40\xae\x99\x05\xb9\xc9\x33\xde\xb3\x2a\x99\xed\xc4\xc0\xe0\xa8\x2e\xd9\x4b\xbf\x6a\xe0\x70\xb0\xea\x50\xca\xb2\x7b\x20\xbc\x27\xd1\xad\x9e\x5f\x2e\x73\xd6\xa5\x33\xaa\x34\xd4\xb6\xac\x2d\x5b\x6c\x38\x11\xcc\x69\x64\xcd\x7d\x24\x84\xb8\xc2\xcf\x2e\xa9\x09\x3f\x7b\x60\xb8\x9a\x57\x10\xe2\x8b\x9e\xce\x49\x42\x30\xa5\xd3\xb7\xdd\x79\x55\x43\xa7\xca\xb2\x13\x9b\xd0\x17\x4a\xf5\x8f\xd9\xe5\x21\xbf\xc5\x65\x0a\x9c\xea\xed\x58\x77\x0a\x5d\xc3\xb8\x87\x1a\x5b\x56\xca\x81\x1a\xd9\xaa\x92\x22\x7f\x39\x1a\x9f\x05\xf4\x9a\x7d\x21\xfa\x28\x1c\x05\x99\xdb\x4e\x5c\x03\x9a\x55\x12\x41\xbc\x47\xe2\x00\xf2\xa4\x0b\x51\xd5\x3b\x56\xd2\xc1\x0a\xe5\xc4\x9b\xf5\x90\x49\x7c\x2b\x04\xa7\x73\x41\xd6\x43\xb4\x0c\x8f\xb4\xb5\x96\xe3\x56\x68\xc9\x96\x7e\x6d\x69\x0c\xe2\x8c\x97\xe4\x36\x49\xb0\x79\xc1\xc1\x26\x1b\x7d\xe2\x83\x28\x02\xc5\xc9\xaf\x83\x02\x53\x7d\x24\xbe\x01\x32\x40\xa4\xce\xe8\xe7\x6d\xa2\xf3\x39\x93\x25\x82\x19\x8b\xab\x44\x17\x3d\x5b\xaa\xeb\xe5\xbf\x59\x56\xe7\x32\x43\x10\x2f\x78\x20\x3a\xbd\x1b\x37\x4f\x14\xf0\x1d\xbc\xd5\xbc\x2d\xcc\xc2\xd1\x2d\x1e\x20\xa2\xa6\x08\xa5\x28\xe6\x92\x7f\xa3\xd0\xb4\x64\x77\xac\x73\x63\x14\x70\x3b\x68\x0b\xe4\x51\xe6\x90\xcf\xe6\x81\xcc\x20\xfd\xdb\x3d\x40\x11\x5b\x53\xec\x91\xb3\xc8\x1c\x3d\x57\xb9\x38\x8b\x7e\xa2\x4e\xbc\x3c\xd6\xf8\x42\x29\x96\xfd\xd5\x50\xe5\x3e\xbb\xb6\x05\x2d\x2a\x72\x02\x87\xfc\x01\x29\x90\x5a\x97\x87\x64\x1d\x31\x5b\xb5\x17\xa7\x2c\xdf\x36\xf4\x5c\x88\x6f\x79\xe3\xac\x5f\x55\xc7\xb8\x21\xd4\x3f\x03\x39\x38\xc2\x21\xa6\x5a\xb6\x39\x74\x9b\x1a\x3a\x36\x98\xd0\xce\xc1\xcb\x50\x49\xf5\x66\xe4\xc0\xdc\xf2\x53\xcc\x51\x4f\x9b\xa6\xb2\xca\xff\xa7\xf9\x99\x64\x5b\xf9\xed\xc2\x91\xa1\xa6\xc3\x21\x4a\xba\x33\xda\xe5\xab\x2f\xf9\x83\x28\xfb\xf7\xf9\xbf\x11\x19\x2e\x48\x6d\x35\xb5\xcf\x72\xfb\x88\x89\x53\x84\xde\x4b\xa0\x09\x0e\x1e\x67\x49\x5f\x9e\x91\xa5\x6a\x1f\xa1\x4f\x6b\x71\xc6\x44\xbf\x3a\x5f\xdd\x2f\x58\x03\xc5\xa9\x81\xa0\x00\x88\xe3\x90\x20\x12\x57\xdf\x1c\x32\x0f\x1f\x99\x2c\x0e\xdc\xe3\x9e\x55\xe3\xd4\x1d\xb3\x2c\x62\x54\x42\xde\x10\x74\x38\x37\xcc\xa0\xa3\x65\xd0\x81\x28\xef\x40\xf8\x1a\x9a\xf7\x2b\x2d\x4d\xf9\x95\xc4\x04\x0f\xc3\x9d\xe3\x10\x8d\x95\x3d\xbf\x66\x4e\xbf\x50\xb4\x6a\x2b\x68\xfb\xba\x20\x6d\x22\xa1\xac\x50\x87\x5c\x58\xb2\x7e\x3e\x10\x17\xf6\x5b\x19\xf0\x4c\xce\xf6\x58\x1e\x36\xa7\x25\x38\x61\x7f\x06\xe3\x2c\x7b\x14\xe5\x97\x32\x06\x45\xf9\x5d\x26\x4e\x0a\xa6\x2f\x2b\xdb\xfa\x18\x41\xe2\xcb\x90\xa6\x97\xe7\x48\x94\x82\xfc\x8a\x24\x90\x3a\xe8\xa3\xf7\x90\x39\xe0\xa4\x8d\xb2\xe9\x45\xd3\x4a\x8a\xaf\xc0\xf2\x44\xe9\x8c\x54\x4b\x99\x8e\xca\x9c\xa5\x64\x22\xdf\x72\x94\x18\x8b\x82\x4b\x89\xd4\x7a\xe4\x00\x25\x73\xa1\x1c\xb4\x96\x95\x8e\x76\x7b\xc6\x4b\xc3\x68\xf1\x64\x9c\x8d\x6d\x5c\xb6\x29\x6c\x56\xb8\x9e\x29\x4a\x7a\x73\xd7\xab\xf7\x4b\x6e\x44\x53\x69\x00\x18\xbc\x88\x73\xf3\xae\x79\x42\x08\x9b\xc1\x30\x16\x8d\x15\x66\x77\x72\xe7\x46\x7d\xd6\x99\xb1\xd0\x32\x55\xc7\x11\x67\xdf\x34\xe2\x9d\xeb\x0f\x24\x05\x81\x19\x93\x6c\xb2\xe3\xdf\x56\x63\xbb\xc8\x05\x25\xa2\x12\x53\x80\x96\x9c\xaa\x1f\xad\x38\x92\x4c\xbc\x9c\x8a\xa6\xac\x56\xd2\x5f\x3e\xcd\x3a\x75\x8e\xc1\x07\x88\xbc\x0a\x1f\xcf\x99\x75\x59\xb1\x87\xd5\x35\x2b\x98\xf6\x42\x24\xd6\xe9\x78\xfe\x31\x36\xd5\x2e\x35\x6e\xc7\xf2\x25\xa5\x9c\x82\x0c\x9a\x52\x4d\xca\x6e\xfb\x3a\xdf\xa2\x14\xc5\xee\x6c\x8d\xd4\x5a\x37\x2c\x3d\x65\x9c\x7b\xe0\x83\x04\x27\x2c\xfc\x42\x9c\x0b\xd3\xd4\x5d\x30\xac\xa8\xa0\x90\x50\x6e\xe1\x8e\x14\x79\xcf\xc2\xb1\x1d\x6a\x17\xd3\x72\xf4\x2b\x8c\xb0\x46\x9e\x61\x49\xde\x99\xb5\x2e\x2d\x10\xaf\x21\xaa\x9b\x11\x71\xbb\x84\xba\x22\x20\x93\x54\xe5\xd4\x7e\xcc\x40\xde\xff\x77\x99\xdc\x96\xa3\x7a\x5a\xb9\x13\x01\x24\x03\x1b\x4e\x77\xf1\xf6\x24\x42\x3b\x9c\x79\x6a\xba\x6f\xad\x24\x15\xd2\xb1\xda\x93\x3c\x0d\xad\x88\x53\xe2\xba\xab\x1f\xcf\xcd\xeb\xbc\x23\x9d\x74\xe3\xa3\x12\x92\x8f\x93\x19\x49\xb2\x66\x99\x1f\xb8\x60\x37\x15\xf3\x32\x2f\xba\x9f\x1d\x6b\x20\x05\x81\xf5\x1f\x64\xa0\x6f\x5c\x56\x9f\xd3\xb2\x70\x03\x69\x07\x8f\x8d\xc4\x2d\xce\x99\x13\x7e\xea\x99\xfd\xa2\x14\x06\x1e\xdf\xda\x5e\x13\x92\x6e\x7a\xa4\x8a\xc9\x4f\x80\xdf\x9a\x93\xc7\x80\xd4\x07\xa7\xc7\x87\xba\x2a\xb7\x25\x86\x48\x73\xd7\x4e\xa1\x1c\x46\x7e\x12\xa9\x52\xd8\x42\x0e\xbc\x9c\x06\x3d\x5b\x8b\x95\x8c\x03\x49\x8e\x5e\xf5\xdf\xcb\x7d\x4a\x0c\x36\x7f\xa5\x1c\x9c\x8c\x94\x21\x99\x6e\x6b\xae\xef\xb1\x41\x81\xad\xe3\xf4\x58\xd9\x0f\xbd\xba\xe2\x61\xf0\xd1\xee\xc8\x50\xd7\xcd\x13\x05\xca\x0f\xb6\x4b\xd2\xfe\xa8\xa5\xe5\xa5\x14\xb0\xe0\x68\x32\xdf\x40\x28\x1e\xf3\x4a\xec\x72\x17\xe8\xb9\xdc\xa7\x31\x21\x1d\x39\x17\x3c\xc8\x45\xde\x72\x46\x1c\x44\xd1\x28\x40\x82\xda\x64\x4d\x51\xc5\x84\x02\xdb\x10\xb0\x84\x68\x36\x3a\x25\xb2\x76\x15\xfc\xa2\x5c\xd7\xeb\xca\xda\xbc\xc2\x27\xe4\xa7\x5c\xa1\x16\x39\xc9\x06\xcc\x6c\xdc\x62\xd4\x5f\x1f\xcd\xdd\xf8\x3a\x99\x72\x57\xd7\x80\x59\x54\xf1\x12\x21\x36\xf9\xa3\x08\x1a\x69\x69\x0e\xdf\x52\x3f\x96\x82\x89\x6a\xe8\x24\x25\x87\x21\x68\x59\xac\xc2\x95\x3c\x5a\x6d\x24\x2d\x47\xba\xd0\x15\xb4\xd6\x92\x4f\xaf\x83\x1e\xd6\x74\x52\xc4\xa3\xae\xba\x48\x56\x18\x19\x65\x97\x02\x97\xf4\xdb\x28\x7e\xc0\x66\x7d\x94\xc7\x26\x12\x9a\xaa\x2d\xc5\x29\x53\xad\x9e\x12\x98\x95\x95\x3f\x36\xf0\x85\x64\x30\x87\xce\xa7\x5a\xe2\x35\x8e\x8f\x4c\x77\x2a\xa5\x28\xce\xe4\x27\x84\x20\x61\xe0\xe3\x59\xda\x4d\x5e\xad\x33\x15\x6c\xfe\x93\xe4\x1f\x5c\x6a\x50\x57\x92\xb1\x04\xf3\xd6\x24\x51\x19\xa5\xba\xb7\x22\x2d\x2e\xba\x97\xb4\x99\x56\xf3\x78\x44\xbf\x0b\x5b\x84\x7d\x13\xdf\xb8\x4a\x04\x6a\x60\xb6\x92\xe3\xda\x94\x3b\xa1\x25\xbd\x49\x7c\x7a\xe1\x89\xa6\x69\x0e\x5f\x4a\x5f\x95\xed\x6a\xd8\xc2\xf7\x87\x57\x9f\x20\x3d\xc0\x20\xf0\xd2\x7d\xc6\x34\xe6\x4f\xd1\x2b\x4b\x8b\x1c\xa7\xb9\x63\xff\x90\x4e\x88\xfd\xf6\x04\xcf\xf1\x0a\xc9\x17\x26\xc3\xcb\x1f\x98\xad\x3a\x38\x0a\x44\x6f\x54\x8b\x3b\xe4\x74\x4f\x4e\x7e\xe2\xf4\x88\x2b\x75\x7c\x90\x52\x87\xc4\xe2\xb7\x22\xa7\x6f\x41\x99\x19\x59\xa6\xe7\x17\xbc\x5e\x24\x80\x31\xe6\x25\x49\xa1\x39\xb9\x6a\x52\xcd\x42\x46\x93\x58\x63\x09\x8b\x4c\x8e\x6d\xe1\xed\x3b\x3c\x23\x97\x58\xa6\x53\x58\x6d\xea\xa6\x6a\x1e\x18\xd3\x41\x4e\x17\x97\x2b\x03\x79\xa2\x4c\x10\xc9\xba\x59\x0f\x15\xd9\xed\x8a\x19\x86\x36\xfb\xa0\x52\xa1\xcf\x23\xf6\xa1\x07\x5f\xbe\x74\xe6\xe6\xd3\xe2\xe6\x3a\xd2\x16\x3d\x52\xfa\x34\x66\x41\xa1\xac\x24\xc3\x7e\xfc\xc1\xbc\x21\x12\x6c\x97\xf4\xfa\xcb\xbf\xfc\xe5\x67\x96\xa5\x8e\x74\x2d\x22\x28\x4e\xcb\x3a\xde\x70\x3c\xaa\x89\x7c\xce\x24\x26\x44\x70\xd5\x1d\xdd\x43\xe7\x00\x0d\x22\x56\xac\x0b\x52\xed\x98\x69\x85\x1f\x64\xc0\x56\xb5\x38\x49\xc7\xc5\xc1\x03\xf1\xfc\xb2\x2c\x0e\x27\x99\xa4\x58\x37\x4a\x2f\xf0\x4a\xd2\x57\x89\x21\x84\xec\xa2\x43\xc9\x39\x6d\x57\x25\xb3\x8a\x6a\xe1\x09\x73\xc8\xbc\xeb\x8b\xe1\xcd\x81\x64\x8a\xe9\xd3\xea\xf7\xaa\x42\xc1\x0c\x3b\x61\x7c\x4c\xaf\x36\x8a\x2d\x97\x0b\x10\xc4\x7b\x49\x32\xf4\x71\x44\xa5\x49\x85\x5c\x2a\x3a\xb6\x86\x4a\xe5\x78\x91\xf4\x38\x5c\xec\xd8\x93\x65\x2f\x24\x13\x99\x94\xf2\x69\x5b\xb8\xdc\xd7\x33\x25\xa6\xee\xec\x1f\xa6\x26\x9d\xdd\x3f\x9d\x9b\x20\xae\x1f\x1d\xac\xea\x42\x13\x68\x27\x23\x2d\x3f\x89\xbb\xf2\x1e\xc2\xb3\x2e\x71\x5d\xc4\x9a\xf8\xa4\x1c\xe0\x1d\xc8\x55\x13\xe1\x48\x4c\xca\x61\x3b\xad\x98\xeb\x6e\x47\x91\xbd\x14\x5f\xd9\xe1\x08\x39\x2b\x94\x67\x20\xfb\xdd\x06\x3c\x6d\x91\xb6\x57\x70\xd8\x37\x33\x5b\xaf\xcc\x17\x6b\x77\x38\x2d\xe4\xb7\x73\x29\xf9\x72\xb5\x16\x7a\xc5\xbb\x7b\xa9\x83\x84\x99\x35\x59\xe2\x7c\x91\x47\x5f\xa6\x29\x34\x4c\xcf\x57\xab\xa6\x75\xee\xb6\x2a\x9e\x3f\x87\xe2\x86\xb0\x51\xf1\x8d\x05\x28\xfd\xf2\x25\x45\xa7\x2b\x2b\x5a\x63\xef\x13\x6c\xaf\x78\x19\x0f\x2c\x38\x70\xeb\x02\x3e\x62\x3a\xe1\x45\x4f\x35\x2e\x79\x9d\xa6\xbf\xfd\x31\x0a\x6e\x07\x93\x30\x88\x08\x1c\x55\x37\xfa\xdf\xb0\x3e\x81\xa8\xf1\x91\xb0\xdf\xe0\x44\x00\xe3\x08\x04\xa1\x1b\x76\xbb\x06\xca\xae\x0d\x39\xc1\x80\x10\x08\x90\x0f\x5a\xc0\x9f\x62\x36\x7b\xef\x9c\x38\xf5\x7e\x3f\xba\x62\xfa\x01\xbf\x7d\x23\xa9\x2f\xc9\x87\xcd\xd8\x71\x88\x22\xea\x52\x3d\xc2\xe4\x25\x4d\xae\xb8\xac\x4a\xcc\xaf\xc1\xf4\x78\x77\xc0\x1d\xea\x3f\x4d\xf1\xaa\x16\xba\xac\x96\x66\xf8\x28\xbb\xd8\x6e\xfd\x72\x72\x92\x9f\xb1\x83\x2a\x99\x3d\x58\xf5\x15\x11\x6a\x1f\x25\x12\x27\x59\xd1\x43\x77\x38\xc0\xd4\x84\x8d\xe2\x3b\x72\x86\xa2\x3d\x02\x30\x45\x31\x13\x68\xbb\xfc\x2f\xcd\x21\x75\x74\x0f\x6b\x9b\x0a\x12\x54\x06\x62\x77\x9e\x39\x5f\x9e\xf5\x0c\xaf\xee\xaf\x86\x77\x9c\x07\xd2\xc5\x4b\x1e\x33\xfe\x01\xd1\x8d\xa3\x29\xce\xea\xef\x7f\xfb\xcf\x23\xb2\x81\x8a\xdb\xc9\xc9\xea\x2c\xc0\x7c\x9c\x57\xca\xfa\x9f\x34\x5b\xeb\xc3\xd9\x28\xa3\x36\xb1\x0f\x29\x0b\x22\x23\x48\xcf\xc0\xf5\x93\x38\x9a\x18\xa5\xe9\x3a\xdb\x39\x4c\x40\xee\x4b\x5f\x89\x65\x90\xcc\x88\x20\x0b\x44\xb4\xb3\x58\xce\x46\xc6\x3b\xd2\x02\x85\x10\x8d\xd4\x2d\xb3\x53\xe6\x34\x02\x2f\x34\x36\x07\x1a\x58\x29\xe0\x91\xe3\x48\x20\x97\x1e\xf2\xb6\xa8\x80\x18\x81\xb7\x2c\xb8\xa3\xbd\xe4\xcf\x39\x13\x08\x04\xd4\xfd\x08\xff\xc3\xf9\x90\x51\xec\x14\x53\xcd\xd7\x0b\x03\xb6\x31\xdf\x6b\xb9\x3d\xc9\xa7\x50\x40\x52\x82\xbb\x14\xf0\x10\x06\x54\x10\x18\xa3\x2b\x3a\x4b\x6b\x15\xb5\xec\x40\x59\x92\x91\x2a\xce\x5c\xe6\x9d\x27\xdc\xe4\xdd\x37\xca\x23\xb4\x57\x56\x3a\xe2\xf3\x4a\xb1\xc2\x1c\x2d\x93\xbc\x02\x29\x34\x03\x94\xd8\x9e\x83\x59\xa2\xec\xb1\x22\x08\x78\x6f\xdf\x9d\x41\x4d\x2d\xaf\xdc\x27\x08\x38\x42\x61\xaf\x59\xf0\x35\xc8\x94\x4b\x26\xcf\x1b\xf7\x51\xbc\x29\x55\x35\xa6\xb1\xa3\x93\x96\xca\x0a\xbb\x03\x2c\x80\x84\x41\xc3\x93\x34\x3d\xc4\xd1\x29\xbc\xeb\x5a\x0a\x39\xec\xe9\x24\xe8\x8f\x43\xcf\x24\x1d\x81\x16\xb6\xe4\x9c\xbb\xab\x62\xba\x7c\x8b\xf8\x07\x5b\x14\x3f\x60\x06\xda\x80\xd7\x2b\xd9\x5f\xe1\x02\xe3\x63\x53\x0d\x5b\x31\x45\xa4\x30\x9a\x96\x38\x0d\xbf\x25\x35\x43\x67\xbf\xa3\x92\x70\x0d\x51\xce\x1f\x1e\xc0\xb7\x52\x5f\x2d\xdd\x6a\x03\x99\x98\x00\x7d\x17\x55\x96\x83\xad\x76\xab\x77\xf9\x4d\xf1\xa7\xd8\x3a\x0a\x70\x8a\x16\x91\x78\x3b\xcd\xc1\xf8\xce\x5b\x22\x67\x9c\xc4\x1d\x64\xd1\xd4\x54\x28\xc6\x6b\xa0\x25\x61\xc7\x39\xc0\xe8\x88\xae\x26\x4f\x90\xe5\xc4\xf8\x2d\x05\xf1\x58\xe5\x82\xf1\x1b\xa9\x98\xd8\xea\x4f\xa4\x84\xfc\x40\xc4\x3c\x3f\xc7\xd6\xf0\x8a\x5c\x0c\x35\x84\x6f\xe9\x74\x26\xad\xe0\x78\x61\x07\x69\xdc\xe3\xb6\xab\x23\x45\x0b\xba\xff\xe9\xa8\x09\x8b\x2a\x6e\x5b\x92\x44\x62\x9d\xe7\x80\x2a\xb1\x3e\x9b\xcc\x56\x4d\x4c\x96\xd6\xe7\xb0\xc2\xda\x06\x93\x48\x5a\x46\x8d\xe1\x45\x98\x2b\x4d\x70\xb3\x39\xa7\x00\x85\x0c\x07\xfb\x56\x5c\x6e\xdb\xec\x3b\xf6\x57\x15\x83\x65\x4e\x43\xb6\x38\xfa\x75\x82\x35\xcf\x32\xf6\xcd\xb6\xbb\xbc\x2e\x5d\xc6\xe7\x58\xea\xad\xfc\x2a\xbe\x45\x6e\x8a\xa1\x95\x9c\x96\x1b\x59\x06\x33\x2b\x52\x4d\xcd\x56\x0a\xfa\xcc\x9e\x09\xdc\x9f\x15\x8d\xe0\xe3\xc4\x18\xff\x7f\xdb\x23\x19\xc1\x16\xc1\x74\x2d\xfe\x59\x66\x58\x8d\x8b\x1f\x46\xe6\x93\x0c\x3d\xc4\x01\x79\xed\xbd\xcd\x5b\x49\x9b\x46\x8f\x74\x71\x12\xc8\xb9\x78\x3b\xb1\x38\xad\x80\x9a\x85\x12\x91\xeb\x27\xe9\x1d\xc9\x2d\xf0\xf2\xc9\xf2\xa3\xa4\x82\xaa\x81\x06\x7c\xce\xf0\xaa\xb5\x55\xa7\x20\xa6\x8c\x96\x10\x19\x05\x1b\x39\xb6\xdf\xca\x95\xfa\x7a\x85\x3f\x04\x2d\x99\xca\x2a\x5c\xe9\xef\x48\xca\x2f\xfb\x7f\x74\xde\x99\x2b\x47\xb2\xff\x5c\xa3\xbc\x21\xa5\x77\x4d\xd4\x90\x18\x75\x4d\xad\xf8\x0e\x29\x37\xbb\xb9\x10\xcb\xc4\x65\x03\x29\x5d\xa9\x4a\xf0\x8e\x29\x73\x0c\x6a\xf2\x01\x3c\xaa\xce\xf9\x31\xe2\xc0\xe1\xcd\x1d\x90\x41\x0a\x7c\x7c\xfa\x75\xa3\xce\xbf\x38\x55\xca\xa3\x91\x62\x4c\x23\xba\xf8\x78\x14\x34\x11\x1f\x4c\xc2\x67\xea\x73\x3f\x6a\x62\x68\x3a\xf9\x2d\xbe\x4a\x5e\x01\x21\x9a\x8b\x81\xee\x5c\xd6\x46\x32\xb0\xcd\x6a\x95\x77\xec\x30\x69\xe4\x47\xb1\x17\x0a\x02\x88\xdf\x05\xbc\xc8\x69\x7e\x4d\xd6\xc6\x50\xf0\xe9\x15\x8b\xd5\xf3\xb2\x30\x0e\xd7\x86\xa5\xf3\xd5\x7e\x5e\x8a\xcf\x72\x44\x6e\x97\x1a\xee\xb0\x44\xca\x31\x28\x95\xa5\xb8\xc1\xa9\x29\xf2\x29\x88\xfa\xa7\x63\xbc\xbb\x90\xfc\x4c\x97\xce\xc4\x0a\xf9\xde\xe8\x50\x8f\x9e\xa7\xf2\xb5\x24\xfe\x73\x2c\xae\xf5\xd8\x5f\xfe\xa3\x4c\x2c\x07\xbc\x1e\x5a\xc9\xb2\xc9\x41\xb3\xe7\xec\x5d\x18\xf5\xc2\x13\x94\xfd\xf7\xb8\x69\x14\x4f\x46\x54\xf1\xd8\x0a\x99\x3f\x1e\x29\xd1\x79\xdd\x01\x33\x66\xc7\xa7\x53\xe8\x9c\xc8\x66\x09\x6a\x71\x8e\x47\x78\xf8\x54\x52\x2b\x22\xcc\xac\xa0\x40\xe0\x90\x0e\xd9\x9f\x69\x8d\x44\x34\x53\x17\x13\x5a\x91\x4f\x51\xb2\x38\x32\x86\x12\xd3\x22\x00\x41\xbe\x17\x60\xf6\x90\x4d\x05\xc4\xf6\xab\x4f\x09\xc5\x3b\xeb\x72\x1e\x51\x30\xc9\x70\xac\x4a\xad\xa9\x4d\x73\xff\x6d\xe2\xce\xb3\x63\xa2\xfb\xda\x90\x62\xe8\x8e\xbe\x99\x29\xa3\x63\x81\x2e\x15\x28\xfe\x11\xe9\x31\x8f\xf3\x91\x58\x2e\xaa\x5d\xa6\xea\x3c\x54\x72\x3b\xb0\xa7\xd4\x5f\xbb\x24\x30\x43\x2a\xc8\x1e\x15\x81\x81\xf3\x67\x3b\x6b\xdb\xe7\x7d\xf3\x1c\xff\x2f\xc8\x28\x8f\x86\x4b\x88\x59\xd6\x12\x5d\x8b\x0f\x64\x19\x65\x21\x64\x9a\xa8\x09\x4f\x32\x42\x92\x2b\xa3\x17\x97\x56\xb4\xe2\x9a\x95\xb9\x9e\x86\x16\x6d\x1d\x5c\x20\xd6\x71\x2e\x42\x8d\x64\xbc\x60\x9f\x5d\x5c\x71\xd6\xf9\xc4\x23\x51\x5a\x2e\x5a\x16\x1c\x72\x2e\x30\x46\xa9\x81\x52\x2b\x12\xd8\xa2\xcf\x29\x4c\x8b\x0c\x38\x3e\xa9\x3e\x93\xe2\xf2\x42\xb8\xb4\x09\xcc\x23\x68\xfc\x03\x0d\x16\xe1\x71\x90\xa2\x46\x98\x03\xcb\xc6\x8e\x75\x97\x5a\x4c\x41\xd3\x75\xc3\x56\x3c\x7a\x7d\xcc\xc5\x15\x01\xf8\xd3\xe3\x16\x24\xef\x9d\x8e\x84\x03\x53\x84\x40\x96\x44\x27\xc6\x8e\x00\x74\x12\xdb\x3d\xf7\x30\xd9\xba\x7c\x5b\x56\x0c\xd5\x21\xa6\xa5\xdf\x29\x8e\x2d\x5c\x49\xa7\x0b\x96\xca\xd5\x50\x7d\xe9\x97\x8d\x67\x55\x28\x08\x92\x54\x30\xd1\xde\x41\x13\x19\x9a\x5d\x00\x19\x08\x24\x1d\xf9\xe3\xf4\x1a\x9c\xca\xb2\x56\xe9\xe2\x7d\xe6\xde\xb0\x97\x0a\x83\x4b\x76\x9b\x91\x6f\x3e\x2c\xfb\xf5\x50\x31\x76\xa8\x0b\x29\x79\x3a\x9f\xa6\x7a\x14\x62\xaf\xf3\xc7\xa6\x95\x02\x27\xc9\x1d\x20\x3e\x5c\x78\x1f\x83\x89\x78\x1a\x6f\x59\xd8\xab\x8a\x1e\x40\x7c\x91\x81\xe2\x09\xa1\x46\x18\x64\xd3\xef\x77\xec\x4f\x34\x82\x2c\xa3\x9d\x7a\x4c\x0d\xb1\xe9\xaa\xca\xbb\x2e\xba\x04\x31\x0e\xf6\x5d\x25\x75\xf0\xff\x1a\x2d\xc0\xc8\x3e\x58\x44\x72\xbe\x72\x10\xa0\x27\xe3\x47\x71\x37\xc4\xad\x53\x0e\xc9\x7e\x45\x9a\x9b\x8d\x14\xb3\xf5\x4e\x72\xe5\xee\xe2\x45\xe4\x46\x01\x6e\xf3\x4d\xc2\x8f\x16\xee\x8e\x2b\xf6\xc4\x10\x96\x47\x37\x24\x4c\xb0\xe8\x30\xc9\xc5\x00\xb7\x56\x28\x85\x54\xab\x9f\x40\x56\x3b\xd4\x3c\x34\x5b\x72\xfc\x85\xe6\x53\x04\x9f\x08\x0c\x7c\x01\x30\x19\xe7\xff\x24\xed\x64\x15\xd3\xe7\x49\xa7\x5b\x61\xd8\xf8\x42\xe0\x2b\xc2\x7c\x0b\x56\x53\xfc\xdf\x01\x27\x13\xcb\x5a\x24\x3a\x5b\xda\x58\x53\x88\xd5\x58\xd9\x02\xb9\xf3\x4c\xef\x05\x29\xa8\xdb\x7c\xb1\x7b\xa1\xaf\xe8\xbd\x32\x8c\xee\xf4\x6c\x11\xdf\xfd\x81\xee\x13\xe0\x8c\x9d\xbe\x00\x74\x18\xf4\x31\xf3\x24\x0b\x54\x3f\x64\xfc\xbe\x5c\x8b\xec\x8e\x3a\x62\x36\x59\x9d\xdc\x7b\x1b\x80\xdc\xb3\x63\xc3\xa2\x75\x38\x0a\xd5\x07\xa8\x83\xa1\x66\x6d\xaa\x2e\x6a\x48\xbe\x42\xc8\x53\xab\x8f\x2b\x99\x8d\x20\xf9\xf4\x06\x85\x28\x02\xc9\xca\xc8\xb6\x04\xa4\xc2\x55\xbf\xa5\x95\xa0\x3a\xa9\x98\x80\x75\x96\x00\x7c\x6c\xf3\x02\x6e\xeb\x62\x9d\x14\x99\xea\x03\x85\x19\x27\xff\x9c\xe2\xd7\xa8\x0b\x93\x49\xd1\x2b\x46\xa7\xac\xf5\x36\xa9\x84\x62\x31\x69\x03\x46\x26\xf2\xca\xe5\x26\x53\xde\x85\x12\x9f\x98\xc1\xdc\x4d\x15\xc9\xa1\x22\x28\xd6\x71\x92\x31\xba\x08\x83\x47\x92\xa3\x04\xc4\x43\xc1\xc6\x91\x8d\xf3\xce\x9a\xc2\x8c\x76\xb6\x1f\xca\x7e\x1f\x5d\xa8\xe4\xe8\x95\xa1\x1b\xa7\x93\x29\xc3\x74\x85\x7c\x25\x0e\x19\x32\x72\x67\xff\x43\x11\xb8\x47\x0c\x99\xec\x3b\xcd\x0c\x3b\xa2\x32\xcb\x2c\xed\x54\x8c\x7d\x4c\xc4\xce\xcd\xeb\x41\x6b\x2c\x71\x3e\xd8\x27\x55\xf4\xd6\xf4\x9a\x6c\xa5\xd8\x36\x1c\x75\xdd\x48\x75\x34\xf2\xf2\xe8\xed\x5e\x6f\x19\xa2\x6e\x02\x77\x6e\x1f\xcb\xd5\x24\x43\x6a\xe5\x20\x21\x38\xa3\xd7\x3c\xea\x2a\x49\x56\x32\xd3\xe9\x80\x62\x3b\x6e\xaf\xdf\x9f\x29\x7e\x27\x5e\x7d\x14\xf8\x1c\xdb\xf7\x21\x4a\x2d\x1f\x0f\xe1\x04\x2c\x1e\xce\xc5\xd7\x70\x12\x19\x9c\xed\x0a\x2c\xcc\xc4\xc3\xae\xe0\xab\x58\x11\x6c\x88\xc5\x35\x48\x8c\xa7\x42\x1b\x6d\x44\x8f\xc8\x33\x55\xe6\xf8\xe8\x90\x1b\x1d\x2b\x97\xdf\x1b\x94\x6c\x84\x8f\x62\x82\xab\xaf\x9e\x7c\x61\x99\x35\x9e\x36\xb6\x3e\x28\xd5\x40\x43\xd9\x6a\xed\xb1\x05\xae\xdc\x57\x40\x89\x59\x41\x06\xb1\x9d\x62\x4d\x1f\xca\xaa\x22\x3b\x6e\x22\x5a\xca\x63\xd9\x54\x4c\x0d\xde\xdb\x50\x29\x6c\x0d\x85\xa8\x66\x05\x80\xdf\x5a\xcd\x70\x40\x96\xe5\xab\xb6\xe9\xba\x78\x20\x46\x2d\x7c\x43\x0a\x44\x1f\x1c\x3d\x64\xe7\xff\x1e\x84\x99\x93\x62\x23\x37\x76\xf8\x65\x9f\xa9\x10\x2f\x16\x88\x39\x6d\x5d\x41\x74\xe3\xab\xf6\x5a\x65\x18\x03\x67\xff\x01\xd4\xac\x86\x9f\x3c\xbb\x8b\x02\x49\x39\xbb\x9b\x73\xb8\x85\xfd\x84\x05\x13\x99\xc8\x88\x89\x52\xac\x51\x64\xe0\x92\x34\x52\x81\x0a\x0a\xd0\x30\x8a\x68\xf5\x67\x3a\xf6\x50\xdf\xb8\xb7\x92\xb6\xc4\xfd\x86\xf0\xd7\x50\x35\x90\xcb\x52\xad\x8d\xb1\x28\x60\x70\x05\x0d\x1f\x07\xe0\x2c\xf7\x0e\xa0\x22\x97\x0b\xe4\x56\x1c\x63\xee\x6a\x2b\x15\xf6\xd6\x3a\x6b\x17\xca\x54\xc9\xe2\xa2\x65\xc8\xcc\xb9\xd6\x71\xb4\x62\xe3\x00\x05\x52\x50\x72\xd5\x04\xef\x41\x32\x96\x42\x6e\x82\x85\x6b\xb7\xe4\x30\xcb\xcd\x92\x18\xb1\x1d\xa7\x97\x26\x2e\x41\xf8\xf2\x8d\x64\xdc\x0e\x2e\x00\x01\xe2\x85\xa0\x3a\x9f\x5e\xba\xe8\x47\x87\xd4\x8e\x31\xa4\xbe\xb4\xa9\x97\x11\xdb\xde\x89\x1f\xfb\xf0\x51\x95\xc6\x69\x72\xbe\xd6\x1a\xc6\x96\x02\xd0\x04\x11\x1c\xe8\xeb\x01\x8e\x48\x3d\x81\x9c\x73\x50\x32\xb1\x3c\x6e\xd7\xd3\x3b\x38\x82\x13\x91\x9c\xd2\x14\x62\x04\x9b\xc8\xf5\xde\xbc\xdc\xc9\xc0\x82\x1a\x45\x91\x1c\x21\x93\x06\x67\x79\xaf\x97\x75\xa0\xe0\xd8\x49\x42\xc5\x5b\x89\x86\xc4\xff\xe9\x11\x0e\x51\xca\xb9\xfc\x56\x40\xad\x6a\x51\xa6\x79\xd2\x55\xd0\x7b\x08\xe0\xb4\x59\x83\x84\x1d\x4f\x6e\x7f\x23\x94\xf3\xf9\x99\x47\xcb\x69\xba\x66\x7a\x72\xa8\x08\xd5\x86\x99\x96\x5a\x35\xd7\xc1\xca\x35\x25\x51\x0a\x41\xe3\x82\x9c\xeb\x72\xc0\x89\xd7\x49\x40\x44\x98\x8d\x8e\xe3\xaa\xe9\x71\x80\x7c\x13\xc3\x81\xc0\x5c\xf7\x19\x77\x29\xf9\x20\xb5\x2f\x37\x4f\x14\x0e\xc6\x25\x84\xa2\x98\x5a\x9e\x3b\x41\x06\xc8\xab\xa3\x1c\x4c\x50\x58\x11\x82\x48\xdb\x76\x3e\x38\x72\x63\x9f\xfd\x31\x0d\x21\x4a\x16\x3f\x49\x7d\xe1\x8d\xe2\x73\x38\x7a\x74\x98\x04\x54\x8e\x50\x4d\xe2\x2b\x22\xa5\x73\x1a\x7c\x86\xc9\xe1\x78\xa7\xab\x27\x2f\xff\xc4\xda\xf3\xe5\xcf\xe3\xb9\x5f\xd1\xb8\x9c\xef\xbf\xf5\x77\x2e\x39\x38\x69\x1f\xbd\xa5\x0a\xd7\x56\xa2\x4c\xb0\x14\xb1\x3c\x02\xa4\x55\xf2\xf8\x06\x04\x3c\xab\x73\xf7\x03\xf2\xae\x75\xb9\xc0\xa3\x95\x4b\x57\xdb\x14\x32\x4b\xa1\x0b\xbe\x45\x2e\xc1\x74\xd9\xcb\x8a\x57\x67\x10\x70\x0f\xf6\x22\x7e\xf0\x51\x55\x62\x62\xe9\xc4\x1e\xca\xfa\xe0\x60\x32\x81\x87\xb9\x2d\x1f\x69\xc3\xe0\x51\x62\x6e\xfd\xa1\x2f\x03\xf7\x36\xf1\xd4\x78\xe2\xab\x69\x5d\x94\xef\xf3\x67\x21\x0b\xc8\x7d\x33\x21\x59\x7e\x71\x46\x07\xa0\x87\x89\xa7\x06\x6d\xec\x23\xf6\x0f\x07\xeb\x52\x12\x58\x44\x9d\x6f\xe5\x3f\xa4\x0c\xce\x6d\x1c\xda\xb8\xa3\x83\x54\xbd\x64\x91\x32\x81\x3d\x03\x56\xae\x12\xa2\xa1\x8e\x01\x26\x1a\x81\xc7\x5a\x8a\x48\xb0\x1d\x01\xeb\x69\x14\xc1\x59\xfb\xad\x95\x5f\x65\xe6\x2c\x3c\x2a\xc1\xa1\xfa\x73\x4c\x8b\x4e\xe6\x5b\xc7\x1c\x84\xf2\xf0\xb6\x4e\x50\x63\x61\xe5\x51\x5b\x8c\x83\x63\xe1\x4c\x45\x8c\x72\x80\x86\xed\x92\xed\x99\x53\x8f\x49\x1b\x1d\x55\xd9\x9f\x89\x24\x49\x77\x28\x4e\x19\xf0\x1d\xf7\xad\xda\x5c\x5e\x46\xe4\x6d\x8f\xdc\xc8\xb5\xfa\xe9\xd1\x33\x6a\xf2\x04\x0f\x33\x39\xa6\xbf\x32\x4b\x9e\x0d\x83\x82\x1d\xb2\x7f\x72\xc3\x48\x86\x01\x65\xc3\xfa\x69\x84\xca\x1a\x43\x2d\xd8\xcc\x22\x95\x40\x2e\x19\x34\x12\xf9\x25\x2e\x35\xee\x71\x8d\xea\x95\x60\xd7\x2a\x57\x88\xf6\x5d\xf1\xc5\x83\x48\x7d\x9e\xdb\xd9\xc4\x14\xd4\x26\xe8\x1c\xdd\x7d\xb0\x2f\x99\x93\x3b\x4e\x7f\xb3\x74\x4e\x81\x6f\x8e\xda\xd5\x18\x5f\x22\xc1\x9d\x73\x13\x73\x33\xb1\x93\xa0\x6d\xd5\x40\x0a\xf5\x2d\x2e\x4c\xc1\xa3\x38\x68\x8b\x16\x2f\x6f\x62\x3c\xf6\x07\xa4\x44\xce\x08\x21\x0f\xb6\x95\x1b\x19\x09\xb6\x37\xb5\x0e\xde\x6e\x4f\x19\x85\xc0\x88\xe9\xc6\x13\xdd\x1e\xee\x83\x46\x4d\xdc\xd2\xc2\x35\xde\x98\x5a\xb5\x8f\xb4\xba\x81\x84\xec\x51\xc1\x2b\xc7\xd6\x1f\x12\x0a\xbc\x58\xf1\x4c\x0f\x96\xfc\x0d\x77\x3e\x6e\x64\x04\xab\xee\xb1\x65\x1e\x9f\x15\xdf\xc0\xc9\x18\x4e\x41\x04\x60\xfa\x3b\x4c\xc0\x98\x71\xd3\xe6\x08\x22\x0e\xfa\x3a\x87\x7a\xca\x4b\x28\xdb\xad\x84\x9d\x0e\x0b\x10\xb1\x6f\xcb\x8e\x39\x49\xce\x01\x16\x29\x92\x9e\x66\x2c\x4f\x99\xf3\x82\x14\x76\x3d\x82\xcc\xe5\xb1\x4b\xe9\x1c\xa5\xca\x17\x56\x5b\xf7\x5a\xde\x45\x5e\xfb\x2b\x8d\xd7\xc1\x9d\x71\xd9\x41\x37\xab\x31\x3f\x19\x03\x5a\xed\x3f\x9f\x73\x44\x51\xd6\x9a\x38\xf0\x70\x08\xe9\x7d\xe6\x6e\x3b\xf8\x0b\xf0\xe3\x33\xd3\x8b\xc8\x3c\x3f\x0c\x5b\x27\x6d\x3d\x84\x83\xa6\x1a\x40\xcc\xe0\x4f\xd2\x36\x48\x33\x45\x57\x1e\x24\x1a\x3f\x98\x4c\x44\x17\xfd\x47\x14\x7b\x03\x84\x58\x7a\x2b\xa8\xd7\xd5\xdb\xe4\xf6\xc7\x04\x32\x2d\xae\xf5\xb3\x02\xe1\x70\xc1\x37\x08\x1c\x5f\xe0\xb1\x21\x11\x92\xd3\x6f\xbb\x4d\xa2\xab\x5e\x22\x43\xf1\x2e\x42\x47\xb1\xa7\x0d\x74\x9f\x74\xe4\xe3\x30\x79\xd2\xa7\xeb\xd5\x6f\x0d\x17\x3f\x34\xb1\x18\x25\x93\xc7\x1e\x9b\x80\x07\x39\x0d\x20\xa1\xea\x59\xf0\x1a\xa5\x5a\xab\xc9\x5b\x4e\x7a\x51\x5c\x51\x4d\x3a\x7e\xc9\x55\x20\x7a\x72\x2d\x8d\x6a\x02\x09\xd3\x1b\x29\xe1\xea\x2a\xd8\x35\x97\xbb\xef\x59\x80\x1a\x8d\x06\x5f\x53\x8c\xcc\x52\x0d\xb9\x59\x6b\xd9\x50\x9e\x0d\xe4\xe0\x5e\x37\x5b\x1b\x3b\x25\x92\xf8\x25\x1f\x4b\xee\xb7\xfe\xfc\x83\x29\xd8\x4d\x59\xf7\xee\x6e\x02\x6e\x13\xf4\xe2\x46\xbf\xa7\x18\xb4\x61\x9a\xff\xf7\x48\x18\xed\xe8\xe8\x86\x78\x1f\xa5\xed\xfe\xb1\x9d\x64\x72\xde\xa5\xb8\x03\xeb\xb2\x05\x0e\xa4\xdc\xda\x10\x39\x78\x73\xa6\x0a\x86\x86\x3e\xca\x2f\xee\xde\xe7\x5e\x6f\x7b\xa6\x21\x57\xbc\xdc\x80\x19\x5e\x0d\x5a\xfe\x0b\xa3\x7a\xea\xfe\x94\x50\x57\x71\x13\xb4\x9c\x9d\x57\x93\xb2\x28\xe4\xdf\x82\x5a\xf0\xf7\x54\x0e\xa5\xcb\x49\x84\xb7\x07\x41\x1e\x31\x9a\x17\x2f\xbe\x54\x2d\x3d\x24\xe0\x32\xa5\x84\x70\x70\x08\x3f\x01\x6f\x13\x7b\x99\xd2\x20\x8b\x74\x31\x3c\x14\xe7\xcc\xfc\xd4\x85\x42\x1a\xfa\xe4\x9c\xc3\xf1\x67\xf1\x4d\xa2\x7f\x27\x5f\x89\x03\xc8\xc6\xa3\xe7\xd1\xe0\x30\xe9\x1c\xea\x11\x00\xde\xaa\xa6\xb0\x5c\xf2\x5d\x4e\x4e\xfe\x22\xe9\xb9\x1d\x5f\xb8\x41\x9c\xa0\xae\xa6\xd6\xf6\xde\xc9\x25\xac\x04\xed\xef\x70\x78\x71\xd1\x42\xda\x6c\x99\xf1\xe5\x28\x32\x8b\x82\xfe\x88\xda\xec\xf1\xad\xb4\x04\x2b\xe2\x6f\xea\xcd\xea\x15\xe9\xca\x5c\xa0\xc9\xbe\xb3\xc7\x61\xa9\x83\xf3\xec\xec\x0d\x6b\x75\x20\x77\xb5\x27\x5a\x92\xc3\xc9\x7f\xa7\x24\x1d\xaf\x4a\x97\x83\x16\x44\xac\xd8\x3d\x5f\xb8\xd0\x3e\xf7\x24\x8a\x2e\x18\xd3\x03\x5c\xc6\x4c\xae\xf0\xc7\x70\x5b\x28\x67\x11\xc4\x14\x70\x3b\x69\xa1\xea\xfd\xc1\x8d\x41\xab\x17\x85\x25\xdc\x93\xde\x30\x91\x08\xb9\x76\x8b\xc2\x11\x13\x27\x90\x74\x3c\x43\xa6\xcc\x77\x83\x91\x7b\x72\x42\xe1\x83\x9b\x90\x99\xd6\xe8\xd9\x83\x50\x0b\x15\x08\x70\x20\xec\xd2\x18\x87\x21\xaf\xf0\x86\x67\xce\xd0\xe9\x03\xea\x30\xbf\x69\x9e\x88\x8f\xd1\x49\x97\x18\xcc\xe1\x4b\x88\xa1\xb8\xb5\x92\x57\x35\x47\xae\x07\xa5\x85\x8e\xd4\x94\xea\x19\x76\x91\x13\x7b\x18\x1f\xfa\x80\x21\xd3\xcb\xa2\x59\xa0\x7b\x7c\x3f\x52\x9a\x91\xf0\x9c\xdd\x20\xe5\x01\xf6\xb2\x62\x9a\xa6\x22\xa0\x2d\x33\x15\x52\xe1\x2f\xea\xc8\xfd\xc1\x92\x09\xb6\x8c\xcb\x13\xac\x4b\xbc\xa3\x18\x7a\x64\xcd\x18\x1e\x8b\xf4\x1a\x62\xa3\x50\x91\xd1\x72\x7e\x5a\x47\xf2\x75\x20\x99\x49\x2e\x15\xca\x85\xb2\xb8\x8d\x94\xf8\x5a\x49\xf3\x39\x2e\x2c\x76\x9d\x15\xd4\x29\xc5\x82\xee\x19\x46\x79\x89\x9b\x71\x38\xc6\xd6\xb6\x0f\xc2\x36\x71\x8f\x2a\xe8\xb4\x6f\xcb\xa9\xa0\x78\x1d\x1a\xaa\x36\x87\xdb\x53\x68\xb7\x14\x6e\x7a\xd7\x83\x31\xda\x2a\xf4\x6e\x74\xc4\x09\xc4\x8c\xc1\x1f\xc0\xa7\xfa\x07\x00\x9b\x81\x70\x06\x45\xe8\x20\xf5\x52\x01\x91\xea\xf7\xfe\x19\x37\x0d\x2c\xf8\xca\x9f\xa4\x4d\xb8\xea\x48\x91\x02\x29\xe6\x42\x82\x00\x34\x6f\xe2\x3c\xd9\x10\x75\x68\xd3\xde\x8e\xde\xbd\x22\x37\xb9\x1a\xb0\x2e\xbd\x56\x37\xbe\x31\x70\xb4\x76\x96\xb4\x6a\x71\xec\x7a\x64\x4d\xde\x7b\x89\x7f\x67\x30\x7b\x3f\xea\x95\xab\xb7\xd4\xbc\x6d\xb7\xeb\x35\x80\x4e\xd1\xf5\x1e\x2e\x33\x49\x34\x0d\x8d\x33\x15\xf4\xba\x5a\x98\xde\x8b\xf3\x6b\x1d\xdd\x19\x87\x85\xe7\x9b\xd9\x47\x5c\xe6\xa4\x65\xc1\x7e\x62\xfa\x20\xae\x68\xf9\xda\x36\xfb\xbc\xd2\xe2\x55\x13\x61\xd4\x44\xac\xa2\xa5\x7c\xf7\xea\x7a\x7a\x0f\x49\xea\x6a\x14\xdb\x40\xbc\x81\xec\x52\x66\x4d\x40\xb4\x5c\xec\x79\x2e\xd7\xf6\xe4\xf0\x19\xc1\xc9\xff\xe6\x52\x0c\x2e\x40\x0e\xc8\x81\xa0\xa2\xf5\xe0\x83\xf4\xc8\x25\xd7\x87\x83\xa2\x2e\x42\x6d\x22\x13\x5b\x44\x3a\x45\x50\x2c\x59\x80\x0b\x32\x6e\x34\xaf\xb4\x25\xef\x96\x31\x47\x9a\xb6\x8a\x3b\x97\x61\x9e\x00\x47\xe2\x2b\x14\x2f\x5f\x9e\x9b\x1b\xd7\x78\xd1\xf5\x45\xab\x25\x41\xd8\xb4\x5e\x6d\x1c\x38\x88\x10\x28\x9f\x6e\x65\x38\xfc\x54\xdc\x91\x5a\xe6\xa8\x7b\x5a\xd2\xc5\xe4\x26\x74\x89\xe4\x0b\x58\xe7\xe1\x9a\x11\xdf\x68\xf6\x4d\xf5\xc2\x35\x00\x87\x17\xd0\x75\x3e\xeb\x46\x0b\x8f\x9a\xc5\xe9\x1d\x8a\xd1\xb3\xa1\x4f\x4b\x4c\x79\x5f\x40\x82\x82\x4b\x7e\x40\x42\xde\x16\x51\xab\x88\x2a\x4e\x32\xfb\xc1\x43\x47\xe2\xbc\x92\x36\x9c\xf9\x4a\xdd\x1b\x48\x1b\x09\xa2\x78\x9f\xee\xaf\x99\xb3\x15\xd0\x13\x5c\xb1\x8b\x8e\x9d\x7d\x6c\x72\xe1\x6a\xb8\x09\xe1\x02\xf3\x21\xc6\x78\x3d\xe6\x10\x4e\x00\xca\xb5\x5e\xd7\x5a\x60\x44\x18\xa9\xc5\xa8\xd1\x77\x15\x63\xdd\xea\xb1\x25\x71\x51\x68\xca\x47\x72\xf2\x3f\x75\x0f\x75\x62\x6e\x91\xea\x38\x7b\xca\xfb\x09\x8d\x46\x32\x7f\x9a\x4d\xc5\x2c\xe8\xba\x92\x04\xc0\x83\xcf\x97\xea\x29\x75\xee\xae\x36\xdf\xb9\xe2\x76\x3c\xa0\x9b\x64\xe7\x3a\x7e\xc4\xc3\x4b\x93\xbc\xc0\xb8\x97\xd7\x89\xf8\x12\xf1\xb2\x23\x0f\x2c\xe7\x14\x86\xbf\x2b\x8f\xf6\x7c\x6d\x55\xa0\xf1\x93\xd7\x3d\xcf\xa5\xa1\x4b\x12\x62\xa7\xb7\xcd\x23\x4e\x3c\xc2\x86\x99\x6b\x36\x97\x09\x56\x0a\x87\xa9\xe2\x1e\xc9\xba\x08\x7a\x68\x4a\x22\x0d\x14\xbe\xe1\x95\xc8\xec\x6e\xdb\x47\x38\x03\xf9\x2a\x97\x88\x01\x6c\x5a\x14\x89\xec\x49\xed\x15\x27\x99\xd0\xe6\x30\xd9\xa4\x53\x16\xf5\xde\xe5\x43\x0c\x3d\x6e\x35\x11\x25\xa5\xf1\xb2\x97\x44\x9b\x5e\xae\x42\xe1\xbe\xd1\xb8\x45\x5a\xce\x33\x2e\x88\x3b\x3f\x70\x4c\xcb\xe3\x9f\xfa\x06\x69\xb5\x1f\x79\xec\x0a\x6b\x3b\x5d\xff\x0e\xcf\xf7\x68\xeb\x5c\xae\x25\x4a\x6b\x74\x4d\xe0\xcb\x13\x71\x9b\xc4\x33\x6e\xc1\x4a\x3b\xe2\xa3\xc6\x46\x5c\xa3\xf1\xf4\x18\x39\x6f\x27\x5e\x86\x6f\xe7\xa8\x4d\xc1\x05\x03\x7e\x64\xc3\x47\xb7\x16\xdf\xc3\xe6\x71\x0f\xe1\x47\x23\x27\x16\x2d\x3f\x68\xd9\xec\xb2\x56\xe2\x85\xd7\x07\x0b\x0d\xa8\xa2\xef\xba\x0d\xae\xaf\x41\x8a\xe9\x95\x04\xbf\xef\xe6\xcd\x2c\x0d\x44\xa3\xbb\xd6\x5b\x7c\xff\x6e\x4e\x68\x7b\xe8\x21\x07\x61\x92\xd1\xbd\x01\x6f\xad\x19\x04\x80\x27\x19\xeb\x51\x26\x99\x05\x57\xf3\x44\x22\x34\xc2\xa5\xba\x5b\x52\x47\xf6\x4a\x7b\x40\x86\xb1\x09\x93\x07\x04\x29\xca\x76\x0f\x12\x7a\x58\xf4\xb5\x94\x28\x85\xd1\x22\x4a\xa2\xa5\xad\x49\x2b\xf5\x01\x1f\x99\xb0\x83\x6f\x33\x1e\x25\x5f\x7c\x6b\xad\xd3\x9f\xfc\x0c\xd9\x7f\x4b\x25\x65\x49\x2b\xe7\x83\x45\x70\xe0\xe4\xa3\xa2\x36\x8a\x8a\x88\x9f\xff\x3a\xe6\x96\xd0\x61\xcf\xe7\x64\xb4\x64\xe2\x7b\xc9\x18\x69\x46\x0a\xfb\xe0\xe2\xff\x31\x77\x69\xe3\x8e\x18\x54\x7c\x90\xcd\x16\xff\xa7\x15\x5f\xcc\x65\x5b\x64\x6d\x72\x7f\x6e\xea\x9a\xe1\xe8\x4d\x31\x42\x3e\x68\x8d\xc1\x18\x25\x6e\x36\x92\xb5\x11\x90\xb5\x76\x46\x76\xd5\x4c\x1d\xc0\xa4\xdf\xa0\x10\x97\x56\x38\xa2\x2a\xed\xa3\x0d\x30\x09\x16\xbb\x0c\x36\xa9\x1b\x72\x41\x4b\x89\xf7\x4c\x9b\xac\x6d\xd2\xd3\x13\x16\xb6\x4a\xe1\x6e\x90\x18\x39\x69\xd1\x6e\xf1\x6d\xf6\x28\x46\xe6\x18\x0e\xc0\xce\xc1\x45\x5c\xf4\x84\x06\xc3\xd9\x81\xa0\xf3\x55\x6c\x36\x71\x53\x6a\x88\x7d\x83\x18\xb5\xcb\xa0\x55\xc4\x2f\x93\x07\xe2\x5c\x35\xdf\x0a\xc7\xa1\x70\xfd\xda\xbc\xd1\xf0\xb5\x0b\xec\xd5\xf5\xa3\x8b\x03\xa6\x83\xa0\xba\x9e\x62\x4b\xd0\x40\x96\x5f\x76\xa3\x58\x5b\x78\x59\x33\x3e\x69\xbf\x81\x29\x96\xe0\xe4\x37\x17\x99\xfd\xf5\x7c\x76\x5d\x67\xe3\x29\x4b\xf6\xec\xd0\x39\xa3\x2d\xd9\xa8\x34\xed\x5e\x2f\x88\x4e\x75\x71\x8b\x4a\x72\x1d\xed\x2f\xc2\xf7\x08\x6c\x3b\xf3\xbd\x4a\xba\x71\x24\x93\x29\xa8\xd9\x43\x81\x42\xd7\x00\xf1\x0f\x42\xa0\x31\x02\x10\x45\x21\x90\x07\x09\x25\x50\xd1\xe3\x11\x49\x68\x85\x14\xba\x2c\x1d\x94\x91\xb4\xd2\xd4\x5a\x6f\xa8\xf8\x56\x7a\xcc\x9f\xbe\xde\x17\x81\x1d\x5d\xd9\x4f\xe9\xb1\x84\x1f\xa9\xf8\xce\x70\x23\x90\x13\x65\xee\x23\x11\xb2\xbe\x00\x0c\x61\x33\xb8\xcb\xf7\x0e\x6c\x98\x54\x11\x68\x86\xa4\xb5\x82\xe2\x95\x5c\x6a\x55\xdb\xd8\xed\x05\x34\x1f\x6b\x95\x20\x0a\xf1\x7c\xe3\xb1\xc5\x41\xcb\x5c\x5f\xee\x91\x58\x20\x54\x11\x45\xe2\x12\x75\x07\x2c\xe6\x72\xae\x19\x5f\x08\x8a\xf9\x67\xcc\x63\xdc\x43\xf3\x50\x2d\xa4\x97\xda\x92\xb1\x3d\xbe\x55\x21\x36\xa7\x02\x70\x2b\xb9\x0d\x6d\xe1\xd3\x4c\xd2\x99\x1e\x7f\x3e\x13\xf3\x81\xda\x03\xad\x43\x6e\x07\x8a\x51\x2e\xa6\xa6\xf6\x32\xea\x3f\x75\x20\xae\x87\xbb\xac\xdc\x39\x95\x28\x17\x8f\x0e\x25\x58\xeb\x27\x58\x9b\xe5\x5c\x41\x21\xf7\x25\x94\x3f\x23\xbd\xd6\x24\x7d\xef\x3d\x4d\x9e\x72\x1f\x48\x67\x21\xdd\xfe\xe3\x3f\x9b\xf7\x79\x4b\xa7\x85\xef\x74\x09\x0a\x68\x53\xba\x06\xa8\x51\x8c\xe8\x11\x70\xdc\xf7\xac\x1d\x7c\x45\x4f\xe3\xea\x18\x54\xc3\xcd\x70\xb6\xd2\x6c\xdf\xf7\x0e\x73\xbe\x03\xc5\x0f\x3e\x59\x93\xf4\xc0\x56\xfc\xc2\x3e\xf2\x92\x81\x29\x8e\x81\x8d\x21\xdf\x1e\x55\x35\xdd\x36\xb9\x27\xda\xcb\x1f\xcf\xcd\x55\x63\xee\xfc\xf7\x75\xe8\xac\xaf\x31\x5e\xf7\x8c\x3f\x16\x55\x34\x5b\x0a\xa0\x17\x6b\x33\x6a\x4a\x27\x79\x8a\x42\x7b\x6a\x99\x53\x17\x1f\x72\xdb\xb5\x81\x9b\x9a\x48\x05\x23\xf6\x1c\xfd\x42\xcf\xc2\xe1\xb5\xe4\x19\xad\x3c\x52\xde\x4d\x31\x55\x63\xdb\xbb\xb8\x8e\x88\x38\xa8\x2a\xf6\xd9\xa1\xe3\xef\xba\xea\x82\xfb\xbe\xc0\xb4\x86\x81\x27\xd5\xc5\x57\xbc\xba\x72\x3b\x54\x7d\xee\xbe\x63\x22\x30\xba\x83\x5e\x52\x93\x0d\x3f\xdc\xcd\x2d\x64\x2b\x78\xe7\xe1\x35\x35\x2c\x07\xd1\xe6\xfe\x50\x05\xe2\x9b\x5a\xdc\xd1\x63\x94\x2d\x72\xba\x10\x84\x65\x8d\x14\x2a\xdf\xee\x82\x9b\xc3\xbc\xad\x10\xcf\xa3\x2d\x88\x0b\xe2\x58\xe0\xfc\x35\x47\xaf\x92\x22\x59\xa5\xb7\x48\xb1\x6c\x63\x57\x7d\x04\x92\xd4\x7b\x23\xfa\xed\x34\xcd\x05\x3a\xaa\xf1\x57\x68\x74\x24\xff\x49\x86\x14\x71\xe6\x02\x70\xae\x30\xac\x5b\x08\xaf\xe0\x26\x1d\x8e\x2c\x55\x95\xa1\x09\xcf\xcb\x9f\xce\x81\xb2\x0e\xde\x25\x3e\xab\x30\x43\xf0\xd8\x1c\xfb\xba\x82\xf9\xaf\x81\xf4\xbc\x6b\x35\x6e\x05\x52\x7f\x51\x2d\x84\x06\x11\x07\x55\x09\x67\x81\xa6\x3e\x99\x30\xf9\x4d\x88\x6f\x2e\xde\xdd\xee\x52\xc7\x2c\x74\xa5\x08\x2d\x48\x93\xde\x03\xe9\xe7\x06\x24\xd9\x74\x0c\xf4\x57\x55\x09\x6a\x3e\xe9\xbd\xc0\x30\x1c\x7f\xa1\xed\x50\xaf\x3a\xb0\xab\xc3\x3f\x1f\xfa\xf8\x7f\x60\x73\x59\xa8\xb3\xfd\xc4\x68\x9f\x95\x6d\x05\x65\x17\x75\x9b\x0f\xa1\x96\x8b\xab\x04\x2c\x90\xf6\x87\x02\x59\x14\xd3\x2d\x57\x9d\xc0\x2a\xff\x84\x2b\xa3\x74\xbc\xb4\xea\x8f\xc9\xc7\x5f\x62\xbd\xc0\xf7\x11\x8e\x7d\x11\x4f\xe0\xa6\xda\x2e\xab\xd5\xb1\xf4\x9b\x4f\x28\x26\x1e\x7c\x53\xe6\x1b\xdf\xcd\x63\xf1\x42\x15\x07\x8b\xa6\xff\x47\x0f\x3e\x22\x6f\x32\x0c\x6f\x0d\x21\x9d\x76\x95\x03\x10\x7d\x57\xb6\xa5\xf7\x3a\xdc\xcd\xad\x24\xd3\x85\x45\x0a\xf4\x0f\x2f\x14\xb8\xdb\x51\xf1\x89\xca\x27\x38\x78\x0a\xff\xbd\x1d\x71\x81\x41\xe9\xce\xe5\x83\x1c\x5b\x02\x4d\xc5\x2d\x3b\xd9\x51\x00\x17\x0d\xb4\x6f\x1c\x88\x7b\xa2\x1e\xd0\xfd\xee\x00\xcf\xe5\x20\x9a\xce\xef\xf3\x90\x5e\x79\x3e\xbd\x54\xf5\x1d\x3a\x91\x97\xeb\x80\x70\xa8\xc9\xc6\x5f\xc6\x70\x5f\x17\xe4\xfe\xec\x59\xfa\xfd\x3d\x05\x37\x23\x61\x17\x65\x76\x8e\x7c\x13\x46\x23\x6c\x87\x95\x3a\x5c\xa5\x7c\xab\x60\xbc\x06\xc7\x09\x21\x3b\x7a\x8c\x6f\x0e\x28\x14\x60\x55\x4c\x2a\x58\x9e\x94\xa6\xdf\xa7\x4c\x28\x11\xac\x36\x8d\xab\x4e\xb8\x41\x38\xe1\xf4\xc7\x97\xc7\x89\x98\x6f\x9e\x20\xf1\xcb\xd7\xbd\x7c\x0c\x8b\x7e\x41\x44\xc1\xca\xe0\xd8\xb7\x94\x8e\x9f\x27\x86\x50\x18\xbd\x43\xd7\x63\xe8\x67\xee\xb6\x46\x0a\xe8\x4a\x8b\xa8\x81\x48\x71\xbd\x3f\x4a\xcd\x3b\x13\x27\x04\xe1\xd1\xdd\x1b\x2e\xbc\x0f\xa6\xe3\x92\xcf\xd2\xb9\x56\x7e\x0b\xa0\xe8\x83\xe6\x47\x62\x30\x59\xd3\x46\x78\xda\x18\x83\x1f\x97\xb7\x93\x17\x22\xc7\x60\xe4\x1d\x31\xd8\x5e\x10\xca\xcd\x04\x86\x85\x3d\x01\x51\xdd\x3e\x6e\xe0\x3d\x29\x7a\x56\x58\x9a\x8b\x2c\x11\x3b\x42\xc5\xfd\xe9\xdc\xa3\xb5\x85\x87\x3e\x29\x5e\x1b\x8a\xed\xdd\xfc\x76\x6e\x16\x77\xe6\xea\xda\x7c\x9a\xdd\xde\xce\xae\xee\x3f\x9b\xb7\xd7\xb7\x86\x7e\x30\x37\xb7\xd7\xbf\xdf\xce\xde\x67\xe6\xfe\x9a\xff\x3d\xff\xd7\xfb\xf9\xd5\xbd\xb9\x99\xdf\xbe\x5f\xdc\xdf\xcf\xdf\x98\xd7\x9f\xcd\xec\xe6\xe6\x72\x71\x31\x7b\x7d\x39\x37\x97\xb3\x4f\xe7\xf4\xcc\xc5\xfc\xe6\xde\x7c\x7a\x37\xbf\x32\xd7\x18\xfd\xd3\xe2\x6e\x6e\xee\xee\x67\x78\x7e\x71\x65\x3e\xdd\x2e\xee\x17\x57\xbf\xf3\x78\x17\xd7\x37\x9f\x6f\x17\xbf\xbf\xbb\x37\xef\xae\x2f\xdf\xcc\x6f\xf9\x73\x4a\x2f\x68\x72\x7e\xd1\xdc\xcc\x6e\xef\x17\xf3\x3b\x2c\xe3\xe3\xe2\xcd\x3c\x5e\x12\x7f\xe1\xe3\x8e\xd6\x0d\x91\xff\xb4\xb8\x7f\x77\xfd\xe1\x3e\xac\xff\xfa\x2d\x0d\xf4\xd9\xfc\x75\x71\xf5\x26\x33\xf3\x05\x0f\x36\xff\xd7\x9b\xdb\xf9\xdd\x1d\x2d\x82\xc6\x5f\xbc\xa7\x45\xcf\xe9\xc7\xc5\xd5\xc5\xe5\x87\x37\xb4\x9e\xcc\xbc\xa6\x11\xae\xae\xef\xcd\xe5\x82\x36\x47\x8f\xdd\x5f\x67\x3c\xa3\x3e\xeb\x46\xc7\x82\x68\xfc\xf7\xf3\xdb\x8b\x77\xf4\xcf\xd9\xeb\xc5\xe5\x82\xa6\xc4\x77\xa0\xde\x2e\xee\xaf\x68\x0a\x26\xdf\x4c\x56\x7f\xf1\xe1\x72\x46\x1b\xf9\x70\x7b\x73\x7d\x37\x3f\x17\x22\xd2\x18\x44\xf2\xdb\xc5\xdd\x5f\x0d\x6d\x41\x49\xfb\x2f\x1f\x66\x7e\x1c\xa2\x2f\x0d\xf1\x7e\x76\x75\x31\xc7\x54\xf1\xb6\xe9\xa0\xb0\x5b\xf3\xf9\xfa\x03\x99\x06\xda\xf5\xe5\x9b\xe4\x77\x90\x6a\x6e\xde\xcc\xdf\xce\x2f\xee\x17\x1f\xe7\x19\x1e\xa4\x59\xee\x3e\xbc\x9f\x2b\xc5\xef\xee\x99\x3c\x97\x97\xe6\x6a\x7e\x41\xab\x9d\xdd\x7e\x36\x77\xf3\xdb\x8f\x8b\x0b\xa6\xc2\xed\xfc\x66\xb6\xb8\x05\x8d\x2e\xae\x6f\x6f\x31\xca\xf5\x15\x78\xe8\xe7\x73\x01\x83\xfb\xd2\xc6\xa5\x43\x20\xc3\xe9\xbf\x02\xfb\xcc\x3f\x82\x39\x3e\x5c\x5d\x82\x06\xb7\xf3\x7f\xf9\x40\xdb\x9c\x60\x11\x8c\x3d\xfb\xfd\x76\xce\x24\x8e\x39\xe2\xd3\x82\x16\x85\x73\x1b\xb3\x45\xc6\xaf\xd0\x0f\x81\x2d\x3e\x13\x83\x5d\x9b\xf7\xd7\x6f\x16\x6f\x71\x20\xca\x36\x17\xd7\x57\x1f\xe7\x9f\xef\x12\x8a\x10\x89\x03\xbf\xce\x5e\x5f\x83\x28\xaf\x69\x21\x0b\x5e\x0f\xad\x00\x14\xc2\x89\xbd\x99\xbd\x9f\xfd\x3e\xbf\x8b\x78\x82\xe7\xd4\x2f\x34\x67\xe6\xee\x66\x7e\xb1\xc0\x7f\xd0\xef\xc4\x8d\x74\xf4\x97\x42\xa6\xab\x3b\xda\x2b\x4e\x95\xfe\xa0\x83\x98\x19\x1d\x2f\x46\x00\x5b\xea\x11\x7e\x20\x31\x00\xeb\x5d\x39\x96\xa1\xb9\xf1\xb7\x78\xb1\xa7\x61\xee\x43\x76\x34\x97\xd7\x77\xcc\x7b\x6f\x66\xf7\x33\xc3\x2b\xa6\xff\x7f\x3d\xc7\xd3\xb7\xf3\x2b\x22\x14\x4b\xd8\xec\xe2\xe2\xc3\x2d\x49\x1b\x9e\xc0\x1b\xb4\x9a\xbb\x0f\x24\x7f\x8b\x2b\x39\x0d\xec\x97\xe5\x7b\x71\xfb\xc6\x8b\x18\x73\xec\xdb\xd9\xe2\xf2\xc3\xed\x01\xcf\xd1\xcc\xd7\x44\x42\x0c\xc9\xbc\x17\x9d\x84\x3c\x71\x47\x01\x3b\x0e\xdf\x2c\xde\xd2\x54\x17\xef\xf4\xd8\x4c\x22\xc8\x9f\xcd\x3b\x3a\x8a\xd7\x73\x7a\x6c\xf6\xe6\xe3\x82\x05\x51\xe7\xa1\x45\x2e\x94\x26\xd7\x3a\x82\xd2\x11\x9c\xf7\xe7\x73\xf9\xc2\x05\xbe\xca\xe0\xb9\xef\xee\xe0\xd2\x88\xc4\x9e\x50\xe6\x45\xa2\xeb\xfc\xdd\x14\x3c\x56\x25\x2c\x1c\x40\xf4\x1e\xb4\x2a\xb8\xd9\xf0\x7d\x39\x71\x75\xaa\x06\x3d\x06\xe4\x3a\x89\xb4\xbc\x55\xac\xb2\xaa\xde\x9e\x6f\x2c\x29\xe0\x17\x1e\xa0\x7d\x92\xfc\xe6\x80\xf6\x28\x12\xdf\x8b\x2f\xaa\x23\xe5\x4f\x1a\x93\xa3\x57\xd1\xaa\x6a\xe4\x1a\x26\xae\x9b\x7c\xe5\x26\xfd\xf2\x0d\xa1\x65\xd7\x54\xb8\xb5\xce\x1d\x7d\xc5\xdb\x80\x3b\x5e\x3e\x96\x55\xb4\xf6\x89\x8c\x48\x12\x87\x39\x74\x68\x72\x4b\x27\x5c\x0f\x48\x09\x11\xee\x19\x8f\x51\x22\xbe\x46\x8d\x4b\x25\x64\xdf\xd3\xae\xa3\xc4\x7e\x7c\x9c\x93\xdf\xc4\x7b\x27\x1f\x10\x9a\x31\x05\x04\x8e\x75\xef\x50\xe0\x9f\x61\xc6\xae\xc8\xf7\xd4\xf1\x3b\x5f\xfe\xd1\x4f\xc7\xb0\x4f\xff\x14\x1a\xe8\x39\x50\x82\x7e\xc8\x58\xcb\x1b\xba\xc8\x07\xbe\x43\x08\x9c\x78\xa3\xc5\x93\xa1\x3b\xf8\x8e\x96\x94\x35\xba\x5e\xda\xfc\x00\x73\xb7\xe1\x5c\xb8\x87\x6e\x36\xfe\x7b\x85\xe9\x07\x99\xc5\xbb\xb1\xee\xf3\xe9\xf2\xbd\x82\xf4\x3b\xaf\xee\xf3\x9d\xbe\x38\xd4\x05\x6c\xf8\xbd\x02\xbc\x32\x40\xa0\x73\xcd\xe2\x05\x47\xd4\xdd\x53\xf2\x4e\xbc\x82\xf9\x16\x9c\x97\xec\xf2\x35\x96\x8c\xe5\xfa\x97\xb7\xee\x59\xf2\x8e\xe4\x42\x04\x83\x80\x22\x30\xbc\x7c\x08\xa4\x4b\x3f\xbc\xc8\xbe\x94\x66\x21\xa3\xa6\x7c\x69\x2f\x5c\x1e\x89\x87\xd0\xaf\x50\x4a\xa5\x24\x34\x37\xb3\x52\xa2\x8e\x3e\x47\x58\x49\xa4\x8b\xaf\xd6\xed\x1a\x8e\xce\x24\x47\xe0\x1a\xd2\xac\x07\xdf\x73\x94\x3f\x98\x0a\x4f\x93\xc8\xf2\x2b\x68\xc9\xef\xba\x56\x66\xd1\xf6\xc9\x03\xc4\xf5\x1e\x1d\x76\xd9\x96\x76\x8d\xc2\x47\x6e\x5c\x6f\x1f\xcd\x6b\x9f\xff\x66\xa2\x6f\xe3\x9f\x5e\x9c\x99\x5f\xd1\x79\xed\x37\xf3\x2b\xbf\xde\xb8\xab\x71\xbf\xe1\x6a\xb9\x7c\x0c\xd4\x21\x2e\x92\x33\xfe\xc5\x7f\xba\x3a\x39\xd9\xb2\x37\xe3\x8f\xf8\x4e\xd7\xff\xbe\xe9\xe5\xe6\xdd\x1f\xf7\xbe\x33\x17\x7f\x1c\xa4\x03\x2e\xa3\x0b\x00\xa7\xe9\xb5\xcd\xb3\xc3\x70\xe4\xfc\x70\xc3\x61\x5f\xfe\xc6\xc1\x06\xd9\x7f\x77\x5f\xc6\xc5\x97\x24\x3a\x74\x64\x12\x3d\x3a\x17\x0b\xba\xdf\xb9\x59\xaf\xfc\xad\x54\xb4\x9d\xe0\x71\x5c\x6a\x32\xa8\x9a\xf5\x81\xa7\x44\xcb\xfe\xbe\xa3\x74\x67\xff\xe0\x37\xe6\xf9\x2b\xc0\x88\x65\x1d\x3a\x2b\x66\x57\x8f\x31\x4e\x55\xd9\xb7\x8e\x28\xee\xc3\x15\xc8\xc6\xa1\x1a\xb1\x2e\x92\x11\xd6\xfc\xba\xe9\xfb\xdd\x2f\x2f\x5e\x3c\x3d\x3d\x9d\x3f\xd4\xc3\x79\xd3\x3e\xbc\x70\xd8\x8b\x17\xbf\xf1\xfd\xa9\x8e\x9d\xfe\xa4\xfb\x07\xfa\x6c\x88\x22\xe4\x4c\xb4\x7c\xa8\x9a\x1b\xa7\x23\xf3\xd6\x36\x35\x5a\x2b\x01\xaf\x90\xef\x80\x24\xa1\x2d\x85\x08\x6c\x17\x47\x88\x8a\x74\xae\xe2\x0c\x48\xe6\x55\x96\x7e\xa1\x23\x07\x21\x5a\xd7\x91\x98\x21\xb9\xb2\x23\xbe\x3a\x8b\x56\xa5\x3d\xb7\x1a\x94\xde\x9b\x71\x3b\x57\xb4\x76\xf9\x85\xc4\x52\xe7\xfc\xcd\xfc\x21\xb9\x32\x29\x9b\x49\xef\x5f\xa6\xe3\xec\xf5\xdd\xf5\xe5\x87\xfb\xf9\xe5\xe7\x38\xc6\x78\xc5\xe7\xa7\x47\x87\x36\x3e\xd6\xfc\x4f\xfe\x24\xf8\xd3\xb3\x73\x1d\x6b\x2c\x9b\x41\xf7\xb3\x32\xb6\xd5\xaa\xd9\x6a\x72\x30\x15\x55\x91\x4c\x7f\x63\xd8\x87\xf4\xaf\xe2\x79\x56\xcf\xe2\x15\x68\xcb\x89\xcd\x7e\x87\x94\x1f\xd7\xe9\x8c\xff\x54\x9d\x5b\x18\xcf\xef\xdf\x56\x46\x73\xdf\x31\x4f\xee\x01\x27\xfd\x48\x8f\x65\x1c\xaf\xd7\xec\x21\xf8\x72\x72\x50\x79\x7e\xe6\x2d\x93\x1d\xfd\x1d\x5c\x90\xf9\x4a\xcd\xee\xef\x1f\x16\xa1\xf1\xae\x36\xfe\xe7\xf5\x0c\x1c\xf4\x73\x8f\xd8\x25\x64\x73\xd9\x7c\x15\x0c\x58\x24\x1c\x0c\xf6\x04\xd6\x91\xe7\xb5\x24\xb4\xcd\x1e\x60\x02\x4d\x18\x87\xce\xf9\xee\x93\x6f\xb6\x3d\x63\x48\x15\xe2\xcd\x8a\x13\xcb\xa4\x68\xb8\xdc\x84\xa6\x40\xae\x33\x96\x63\x93\xe0\x80\xb9\x76\x3f\x11\x0f\x67\xd2\x7a\xc4\x7d\x25\x82\x33\xd6\x52\xcf\x4e\x65\x45\x3e\x03\x1c\x7d\x7f\x50\x1c\x28\xbe\xba\x22\x91\xae\x17\x65\x7c\xa3\xf9\x0f\xc9\xe5\xfd\xb7\x85\xdf\xe7\x5f\x04\x6a\x16\xb7\xd0\xaa\x1f\x92\x33\xd2\xae\xd6\xe1\x0b\xc6\xfe\xfb\x55\xe1\x86\x42\xa4\x71\x73\xa0\xb3\xda\x06\x15\x44\xab\xdf\x7c\xda\x47\x99\x1a\xbd\x3f\x09\xd6\x65\x4a\x88\xe2\x65\x58\x8f\x2c\x04\xe9\x64\xb9\xf5\x1c\x26\xd4\x32\x4d\xaf\x29\x41\xf5\xfa\x74\x70\x4d\x2d\x89\x10\x3d\x39\x0c\xc0\x93\x16\xf6\xf1\x89\xe7\xf8\xe3\xf9\x97\x00\x61\xb5\xc7\x93\xcb\x5d\x6f\xf3\xe2\x30\x29\x8a\x36\x33\x7c\xc5\x05\xe8\x5d\xbe\xfd\x04\xf0\xca\xe4\x29\xec\x36\x25\x39\xb9\xcd\x6e\xb3\x7f\xf1\xb4\xd9\x3f\x27\x1a\x3f\xaf\x1e\x76\xd5\xf9\xa6\xdf\x56\x74\x30\xff\x37\x00\x00\xff\xff\xdc\xfc\xcc\x14\x0a\x87\x00\x00") - -func confLicenseGnuGeneralPublicLicenseV30Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuGeneralPublicLicenseV30, - "conf/license/GNU General Public License v3.0", - ) -} - -func confLicenseGnuGeneralPublicLicenseV30() (*asset, error) { - bytes, err := confLicenseGnuGeneralPublicLicenseV30Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU General Public License v3.0", size: 34570, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuLesserGeneralPublicLicenseV21 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xa4\x7d\x5b\x73\x1b\x39\xb2\xe6\xbb\x7e\x05\x56\x2f\x2d\x45\xd0\xea\x96\xe7\x4c\xef\x76\xfb\x89\x92\x28\x9b\x3b\xb2\xa4\x21\x29\x7b\x1c\x1b\x1b\xb1\x45\x16\x48\x56\xbb\x58\xc5\xae\x8b\xd4\xdc\x5f\xbf\xf9\x65\x26\x50\x40\x91\x94\x35\xb3\x11\x67\xe2\xb4\x24\x14\x90\x48\xe4\xe5\xcb\x0b\xe0\x8f\xf7\x4f\xe6\x6e\x34\x9d\x8e\x26\xe6\xe3\xe8\x7e\x34\x19\xde\x99\xc7\xa7\xab\xbb\xf1\xb5\xa1\xff\x8d\xee\xa7\xa3\x93\x2f\xb6\xaa\xb3\xb2\x30\xef\x2f\x2e\x07\xe6\xd6\xce\xab\x36\xa9\x76\xe6\xf2\xb7\xdf\x7e\x3b\x39\xb9\x2e\xb7\xbb\x2a\x5b\xad\x1b\x73\x76\x7d\x8e\xdf\xd1\x10\xfc\xc5\xdc\x56\xd6\x9a\x69\xb9\x6c\x5e\x92\xca\x9a\xdb\xb2\x2d\xd2\xa4\xa1\x59\x06\x66\x5c\x2c\x2e\xcc\xc9\xdf\x2f\x69\x48\x52\x7c\xcf\xb3\xc2\x4c\x1b\x1a\xdc\xd0\xdc\xd9\xb2\x59\x9b\xdb\xbc\x2c\xab\x81\xb9\x2a\xeb\x06\xc3\x3f\x0f\xcd\x2f\xef\x2f\x2f\x7f\x79\x77\xf9\xb7\x5f\x2e\xcd\xd3\x74\x78\x72\x32\x7a\xb6\xd5\xae\x2c\xac\xc9\x6a\xb3\xb5\xd5\x26\x6b\x1a\x9b\x9a\xa6\x34\x0b\xa2\xc6\x24\x45\x6a\xd2\xac\x6e\xaa\x6c\xde\x36\xd6\xd0\xd8\x39\xad\xbc\xc1\x1f\x33\x5b\x9b\x72\x69\x9a\x35\x7d\x98\x67\x0b\x5b\xd4\xd6\xa4\xe5\xa2\xdd\xd8\x82\x96\xa7\xe1\x66\xb1\x4e\x8a\x55\x56\xac\x4c\xd6\x60\xf6\xa2\x6c\x4c\x92\xe7\xe5\x8b\x4d\x2f\x4e\x4e\xfe\xd7\x0c\x1f\xd2\xff\x35\x6b\x6b\x96\x59\x55\x37\xa6\xb2\xb9\x4d\x6a\x5a\xfd\x59\x99\xc4\xd3\x5b\x73\x67\xeb\xda\x56\xe6\xe3\xe3\xdd\x85\x19\x63\x8e\x1a\xd4\xb5\x45\x53\x9b\x44\xbe\xaf\xdb\xc5\x82\x06\x95\x95\xfb\x84\x0f\x22\x9b\x57\x60\xee\x63\x3b\x27\xfa\xe8\x47\xa6\x71\xe0\x67\x7f\x3f\x30\x6b\x5b\x2c\x2c\x7f\xe0\x7e\x59\xb4\x9b\x39\xad\x45\xc7\x73\xf1\xbf\x4f\x4e\x1e\x2b\x9b\x6c\xe6\xb9\x3d\x39\x99\xd1\x18\xdd\x65\x6d\x96\xb4\xd0\x86\x58\x6a\x6a\x77\x26\xf8\x5f\x6a\xeb\x6c\x55\x08\xf3\x9a\xe4\x3b\xfd\xf2\x25\xd9\x99\x5d\xd9\x56\x66\x49\x67\x92\x96\x1b\xfc\xa5\x5e\xf3\x78\xe2\x2b\xb3\x87\xf8\xde\x5c\x98\xab\x1d\x6d\xa8\x68\xaa\xa4\x26\xd6\x39\xfa\x3f\xda\xc2\x56\x49\xde\xa3\xbf\xe6\xb5\xb2\xa2\xb1\x45\x2a\x6b\xad\x48\x84\x12\xfa\xd9\xfe\x78\x2d\xfc\xcd\x13\xfd\xee\x1d\x0d\xd9\x80\xd0\xba\xad\x84\x0b\x7e\x3f\x74\x2e\x3c\x16\x3b\xa5\x33\x23\x22\x6b\xd3\xd2\x21\xd4\x17\x60\x45\x77\xe2\x83\xe8\x80\x0e\x12\x3c\x30\xc9\x76\x9b\x43\x5a\x40\x51\xb9\xa1\x55\xb6\x76\x91\xd1\xac\x3b\x65\x59\x02\x89\xf3\x4b\x6f\x93\xc5\xf7\x64\x65\x6b\x22\x6f\xb7\xcd\x16\x3c\x2e\xe7\xa3\xcc\xf0\x4b\x3d\xe0\x63\x2a\xc1\xbb\x2d\x69\x04\xd1\xdd\x36\xeb\xb2\xaa\xcd\xcb\xba\xa4\x85\x16\x59\x6a\x41\x01\xed\x82\x59\xfe\xad\x6c\xcd\x22\x29\xf4\x67\xfa\x4b\x29\x42\xfb\x02\x76\xac\x68\xfd\x06\xec\x54\xc9\x24\x21\x2f\xbe\xd3\xf0\xca\x2e\x5b\xd0\x93\xcc\x4b\x0c\x5d\x5b\x5e\x28\x52\x81\xb2\x62\xfa\xca\x2a\xcd\x0a\x48\xdf\x61\xa6\x38\xc1\x9f\x5b\x52\xb7\xca\x90\x82\x11\x13\x56\x3b\x4f\x20\xf6\xb1\x23\x56\x54\x4d\xb6\x68\xf3\xa4\xa2\xb5\xc1\xc9\x39\xab\x07\xed\x12\xdf\xda\xbf\xb6\x79\x52\xf0\xae\x6b\x9a\x88\x14\x8b\x0e\xe7\x2b\x89\x34\xef\x61\x6b\x93\xef\xd0\x86\xe8\xc8\x07\xf8\x13\x18\x46\x1b\xb1\x55\x05\xdd\xa4\x15\x9d\xc4\xd0\xe8\x16\xab\x40\x51\xb7\x15\x11\x7a\x61\x1e\xda\x63\xc7\x5a\xef\xc9\x7c\x28\x4a\x89\x70\x6f\x9d\x3c\x8b\x60\x05\x42\x19\x98\x93\xce\x8a\x44\x54\x9a\x33\x15\xd9\x6a\x25\x12\xc8\x0c\x26\x09\x7b\xa6\xa5\x4d\xb6\xe4\xa9\x5f\xb2\x7a\x7d\xfe\xa1\x5b\xaa\xb2\x0b\x9b\x3d\x63\x92\xb6\x5a\x60\xea\x94\xcf\x02\x47\xbc\xb2\x0d\x9b\x20\xfd\x90\x74\x85\x7e\x0c\x3e\xc5\x18\x55\x90\x48\x09\x40\x05\x4e\x83\x88\x5c\x08\x99\x98\x85\x6c\x84\x7d\x11\x82\xb7\x55\xb9\xaa\x92\x4d\xfd\x81\x87\xfa\xf9\x44\x41\x89\xf0\x8d\x4d\xe3\x55\xd2\x12\x2b\xd4\x96\x05\x6a\xc5\xca\x54\x62\x96\xc6\x2e\x1a\xd1\x5e\xb6\xff\x35\x9f\x53\x61\x03\xbe\x56\x16\x5c\x5b\xc8\x61\xf3\x9c\x34\xff\x3c\x0b\xac\x33\x44\x1d\xec\xb5\x05\x1b\x1d\x5d\x48\xe6\x63\xa9\x2c\xc9\x5a\x7e\x97\x3f\x95\x38\xa7\x0a\x16\xa4\x8a\xc6\x5d\x98\x99\xfc\x14\xad\x46\xd6\xa5\xce\x49\x3e\xd9\x2b\xd8\xaa\x49\x88\x07\x34\x62\x4b\x7f\xcc\xe6\x59\x9e\x35\x99\xda\x44\xcc\xad\x5c\x3e\x78\xca\x0d\x1b\x51\xb1\xca\x34\x5c\x87\x6e\xca\x34\x5b\xee\xa0\x94\x27\x27\xb7\xf4\x6b\xfb\x57\xb2\xd9\xe6\x24\x87\x6f\x9c\x6a\xe0\x15\x91\x0e\xa3\xc9\x78\xb3\x6c\xb7\xcc\xd2\xd2\x2c\xbc\x44\x4b\x4a\xbc\xca\x54\x18\x49\x54\x32\x9a\x87\xfd\x07\xd9\x36\xfe\x95\xb0\x89\x19\x4b\xac\x5f\x41\x6e\xe9\x43\x31\x13\xfc\x75\x4f\xba\xe9\x23\x5a\x98\xad\x86\x93\xbc\x40\xda\x44\x8c\xbc\x20\x92\xdb\x92\xad\xe4\x30\x23\x62\x9d\x58\x40\x5f\x32\xf2\xd1\xd1\x56\x3c\xb5\x24\x15\xcf\x30\x59\x8b\x12\xcc\xa0\xbd\x97\xf3\x3f\x20\x25\xcb\x2c\x17\x53\x1a\xef\x64\x40\xeb\x75\x94\x31\x21\xe4\x4e\xb1\x1c\xfd\xbc\xd9\x5b\xc8\x24\x4b\xd8\x1d\xda\x14\x6c\x80\x08\xbf\x9f\xd5\x8f\x21\xa1\xa6\x15\x88\x00\x3a\x64\x76\xe3\x17\x66\x48\xbf\xf3\x34\xd6\xeb\xf2\x45\xe6\x57\xa9\x26\xfc\x50\x0b\x21\x44\xc3\xf7\x42\xfe\x9a\x39\xa9\x86\x79\xb2\x87\xc4\x5d\xc8\x4b\x4c\xf3\x52\xbe\xab\x1b\xbb\x35\x1b\x3a\xcf\x32\xfd\xdd\x9c\x5d\x9e\xe3\x38\x16\x1e\x18\x45\xbc\x02\x7d\x67\xef\x79\x44\xb9\x24\x7b\xa6\x62\x1f\x7a\xa7\x97\x75\xb6\x58\xf3\xc9\xd7\x72\x00\x76\x45\x96\x8c\x71\x4e\xcd\xfe\x5e\x81\xce\x20\x94\x32\x9a\xf7\x67\xf6\xf0\x2c\x97\xc1\x92\xb1\xbe\xda\x84\xa6\x0e\xd4\x8f\x95\x96\xad\x8b\x53\x5a\x32\x17\x40\x57\x66\x41\xb8\xa6\xf2\xa7\x23\xee\xb5\x28\x69\x6c\x05\xc7\xbd\x53\x1b\xa7\xee\xd9\xad\x65\x86\x84\x73\x58\x09\xc2\x33\xa1\x2f\x99\xae\x8c\x6c\xc3\x7c\xc7\xfe\x14\xe0\xcd\xe6\xb5\xd8\xab\x6d\x52\x8b\x8b\x18\xf4\x45\x9d\x0e\xab\xcd\x53\x77\x2a\x90\x73\x2f\x2d\x6c\xa6\x15\xa1\x89\xf3\xca\x08\xb7\x11\xa3\x14\x15\x45\xc2\xd5\xfd\x55\x1c\xec\x4f\x35\xad\xb2\x6d\x1b\x71\xbf\x2f\x19\x69\x14\xe6\x99\x13\x3d\x74\x28\x8b\x46\x08\x25\xa6\x11\x8e\xda\xa8\x8a\x6d\xf8\x30\xe7\x8c\x63\xaa\x32\x6d\x17\x32\x88\x35\x03\x62\x72\x8b\xf9\xf3\xdd\x20\x44\x05\x0d\xef\x62\x5b\x62\xa3\x40\x4b\x75\xc3\xac\x5e\x13\x44\x6b\x9c\xe4\xda\xbf\xe8\x38\x18\xd3\x91\x89\x80\x07\x0d\xcd\xf4\x85\xf9\x6a\xd9\x6d\x1c\x70\x56\x09\xeb\x19\xbe\x20\xcd\x01\xf9\x96\x69\x27\xb9\x21\x6f\xef\xac\x21\x2f\xc1\x28\x88\xa7\x8f\x26\x67\xf2\xe7\x30\x8d\xd0\x94\xa4\xb3\xa0\xcf\x1e\x37\xd2\x78\xf2\x80\x89\x6e\xc5\xac\xcb\x9c\xcc\x2f\x5b\x5c\xf2\xc6\xa5\x3a\xe7\x8c\x6c\x2a\x03\x0e\x10\xc5\x10\x80\x07\x7b\x74\xc1\x4b\x10\xb7\xc4\xc0\xf5\x80\xb2\x13\x12\x56\xce\xb9\x65\x2e\x31\x43\x9a\xce\x00\x00\xc0\xf4\x3c\xbe\x00\x32\x16\xa9\xac\x88\x14\x88\x8e\xe2\x33\x70\x2e\xe0\x68\x87\x21\xb2\x62\x91\xb7\x29\xf6\xc9\x70\xce\x83\xb3\x01\x64\x68\x51\x12\x51\x72\x9c\x31\x0e\x3a\x8a\x68\xc1\x82\x3e\xa2\x64\xfc\xfe\x66\x54\xe9\x9c\x52\x00\x27\x03\xa2\xa0\x16\x34\xff\x9f\x6d\x46\xba\x4d\xaa\x43\x96\x02\x1c\xe1\xd3\x78\x03\x54\x63\xb1\x69\xc5\x67\x77\x30\x0f\xfc\x77\xcb\xfa\xb5\xc0\x3e\x9a\xcd\xb2\xb3\x95\x60\x8a\x4d\x3e\xe3\xac\x35\x24\x37\x1c\x4a\x63\x8a\xb2\x78\x17\x21\x09\x87\xe0\x12\x2f\x57\xbc\x66\xf1\x9d\xb6\xa4\x46\x72\xcf\xeb\xd5\x50\x3d\xc1\xc9\x44\x54\x5b\x8b\x00\x32\xf6\x4f\xbb\xd1\xd8\x29\xc9\xf8\x3c\x13\xc4\xe8\x44\x86\x4c\x2e\x2f\x01\xbb\x48\x13\x30\x6c\x94\x09\x64\x30\xd6\x2d\xab\xef\xc4\x45\xe2\x6e\x95\x3d\x27\x2c\xd1\xfa\xb1\xb7\x04\xde\x66\xcd\xde\x00\x7d\x1b\x27\xf0\xca\xa2\x1a\xe1\xdb\xda\x33\xaa\x2c\x88\x0e\xb5\x7a\x74\x4e\x59\x15\xd3\xbd\xc4\x07\xf8\xdf\xa2\xa2\xf3\xac\xb2\xc4\xc1\x47\x92\x67\x59\xff\x55\xb9\xf1\x6b\x6e\x40\x40\x9e\xfc\xd5\xcd\x83\x23\xf5\x44\x1c\xf7\xd1\xe2\xc5\x16\x82\x1c\x02\x89\xc0\x90\x53\x59\xfb\xf4\xd8\xe2\x73\xbb\x48\x34\xe0\x48\x4b\x12\x02\x0c\x67\x59\x51\x97\xe2\x0c\xcc\x4f\x75\x87\x98\xc9\x37\xbf\x4d\x4c\x5d\x68\xac\xc8\xa1\xd6\x4d\xc4\xd0\x3a\xb5\x64\xd2\xca\x2d\x6c\x18\x2f\xce\x76\xd2\x24\xe9\x33\x19\x53\x8a\xba\x0c\xb4\x97\x6d\xa1\x6d\xc0\x87\x7d\x01\x55\x84\x48\x7e\xcf\x7f\x24\xa1\x80\xb8\x9b\xa4\x2e\x39\xfe\x68\x95\x23\x3f\x12\x06\x0e\xa5\x61\xe8\xbc\x66\x5c\x98\x4f\xe5\x0b\x51\x59\x45\xb1\xa5\xe3\xb2\xdf\x5c\xb0\x3a\x69\x9d\x53\x45\x0d\x2d\xcd\x22\xab\x16\xed\x06\x2e\x82\x90\x7b\x1f\x57\x12\x85\x15\x28\x2e\x17\x14\x55\x01\xe2\x0e\xd4\x2d\x6f\x28\x5e\x87\xdf\xf2\xd3\x38\x08\x4e\x2e\x85\xd0\x4a\xa2\x01\xc2\x0b\x08\x68\xe0\x8a\x08\xff\xe6\xb2\x57\x76\x08\xb1\x41\xd8\x75\x6e\x33\x83\x39\x26\xae\x82\x6e\x3a\x82\x77\xcb\x64\x01\x0c\x4e\xe4\xa5\x49\x95\x12\x4f\x09\x9b\x2f\xd6\x99\x7d\x16\x2b\x33\xd8\xe7\xbb\xb7\xe9\x9a\x41\x71\x91\x62\x28\x98\x66\x28\x52\x4d\x1f\xfe\xd9\xc2\xc4\x21\x68\x94\x48\x93\x5d\x5c\x08\x2f\x44\xfe\x18\xa7\x26\x64\xc3\xff\x28\xe7\xc8\xa5\x60\x67\xa4\x7d\x2d\x20\x84\x27\x21\x38\x99\xb1\xba\x07\x89\x46\x3d\x96\xa1\x10\xa0\xc9\x39\x3c\x58\x61\xfb\x73\x9c\x26\x29\x99\x98\xbd\x18\xd6\xb8\x78\xb3\x93\x48\xe8\x3b\x73\x2a\x90\x9a\x57\x55\x98\x8e\x93\xe8\x50\x0d\x25\x42\x88\x5d\x31\xa0\x6b\x19\x22\x04\xc1\xb3\x07\x4f\xc5\x01\xc6\xda\x22\x99\xe7\x7c\x30\x2b\x40\x09\x9a\x54\x73\x40\x74\xa4\x5b\x5b\x6e\x73\xdb\xcd\x99\x73\x48\x3a\x2f\xd3\xdd\x5e\xd0\x7a\x61\x22\x19\xdb\xa7\xc8\xb9\xb5\x6b\x9f\x98\x7a\x95\x1c\x56\x8a\x8d\x58\xc9\x90\x08\x16\x40\xc2\x0e\x32\x19\x34\x39\x61\x46\xd7\x3b\x72\xf4\x9b\x01\x9f\xa2\x25\xdb\x94\x88\x95\x7c\xa6\x93\x4b\x8a\x2e\xab\xf4\xf3\x5d\x56\xb4\x7f\xed\x7d\x47\x3c\x1d\xe6\xe4\xa2\xda\xd5\xfa\xc7\x07\x80\x23\x67\xe3\xa1\x66\x2b\xf0\x08\x8c\x8e\x7e\x72\xc6\x6b\xe0\x0d\x1d\x7d\x16\x86\x4e\x3c\x4e\x74\xc6\xf9\x39\xd1\x93\xd8\xd9\x31\x25\xca\xac\xb5\xa6\xfa\x9c\x5d\x94\x88\x1b\xbc\x20\x21\xc4\x68\x22\x93\x58\x54\xb5\x85\x4c\xe5\xe6\x75\xfe\xd0\xa3\xe6\x7e\x72\xb1\x83\xf6\x6b\x1c\x03\x29\xbe\x8f\x64\x38\x0d\x51\x16\x69\x26\x81\x30\xfb\x7c\x0a\x16\x68\xc2\x20\x5e\x70\x49\x27\x59\x60\xa1\x5e\xaa\x84\x9a\x5e\x98\xc7\x04\xe8\x9f\x31\x6b\x03\x1c\xa6\xf2\x80\x85\x1d\x12\x59\x70\x16\xe8\xc5\xb2\xd7\x3f\x85\xb3\x8d\xd3\x3c\x2a\xbc\xa7\xbc\x88\x1b\xc1\x5b\x6c\x6b\x55\x61\x37\x44\xfc\x1f\x27\x1e\x2a\x4e\x28\x92\x36\xd6\xe2\xc5\xd8\x79\x03\x37\x3a\xd4\x13\xc2\x08\x98\x6d\xf9\x65\xc2\xe9\xa8\x0e\x3f\x3a\x08\xd0\x0f\x1f\x43\xa0\x43\x2c\x07\xf7\x46\x93\xcf\x53\x33\xbc\xbf\x31\xd7\x0f\xf7\x37\xe3\xd9\xf8\xe1\x7e\x6a\x6e\x1f\x26\xf4\xe3\xe3\xb7\xf1\xfd\xc7\x81\xb9\x19\x4f\x67\x93\xf1\xd5\x13\xfe\xc4\x03\x3f\x3f\xdc\x8c\x6f\xc7\xd7\x43\xfc\xe2\xe4\xe4\x17\xc5\x81\x4e\xc8\x86\xa4\x8e\x16\xc9\xe4\x10\xe9\x41\x29\xbc\xe5\x08\x52\x09\x62\x0d\xdc\x99\x4b\xd4\xe7\x19\x90\x20\x20\x41\xea\x68\x9b\x27\x8b\x0e\x9a\x76\x51\xa5\x40\xf1\x6e\x1e\x09\x6c\xb2\xff\x6b\x53\xb6\x22\xb4\x64\xb2\xd3\x3c\xb6\xba\x88\x2e\x5a\x4c\x4d\xeb\xd2\x28\x2a\x35\x2e\x29\xfe\xba\x0e\x9d\x49\x1a\x9b\xcc\x39\x4d\x71\xda\x04\x3b\x3f\x3d\xbf\x30\xa3\x84\x11\x11\xff\xcc\xfa\x96\xa4\x69\x65\x39\xb4\xa3\xa3\x3a\xa5\x50\xf6\x14\x2a\x6b\x4e\xbd\x74\x6c\x6c\xc2\x5b\x5d\x90\xe4\xd9\x85\x83\x78\x9e\x57\xcb\xb6\xd0\x74\x8e\x46\xb7\x69\xd2\x40\xf9\xec\x96\x61\x62\x5d\x72\x2a\xbd\xd4\xa8\xe1\xd9\x16\x08\x1a\x39\xf3\x1a\x60\x4f\x9c\x83\x0a\xb8\xb7\x57\x67\xc2\x6c\x0e\x23\x10\x0d\xf0\xee\x21\xf0\xd1\x8a\xbc\xdc\x39\x1b\x7f\x92\x4e\x32\x93\x76\x41\x11\x23\x0c\x9d\x2a\xde\xa9\xea\xe1\xe9\x40\x52\x99\x03\x49\x51\x76\x87\x0e\x88\x78\xe8\xe4\x59\x1d\x84\x06\x98\x88\x39\xf4\xe8\xe0\xe9\x38\xad\x86\x9b\x3c\xa0\x66\x77\x31\x23\x6d\xa6\xa9\xdd\xce\x02\x21\xe2\x2a\x76\x21\x0c\xe6\x59\x64\x81\x4e\x98\xf2\xe4\xe5\x77\x6f\xcd\xe0\xe5\x13\xa4\x2a\x64\xac\x8a\xa4\x73\x8c\xe1\xcc\x04\x27\x2a\x77\x6a\x19\xd9\x6b\x25\xc0\x57\x5c\xb0\x55\x1c\x42\x68\x66\xfc\x61\xfa\x14\x5d\xca\xa9\x64\xd0\x41\x7c\x26\x56\xa5\xc0\xd2\x05\xf3\x50\x44\x3b\x4f\x8a\x55\x4b\x40\xe6\xc2\x9c\x7d\x22\xbd\x27\x6c\x86\x44\xd0\xc0\xcf\x00\x0a\x50\x97\xe1\x10\x4f\x0f\x1e\xb9\x6e\x76\xe8\xfa\xe7\xc2\x0b\xbb\x39\x0d\xc9\x39\xbd\x38\x3f\x39\x39\x9d\x76\x79\xaf\x53\x0d\x53\x79\xef\xc2\xd7\x46\x8c\x2c\xb2\xcf\x12\xc5\x6e\x9c\x21\xe6\x41\x02\x07\x19\x82\xc7\x1b\xa5\x2d\x20\xfd\x74\xcb\xf3\x79\xdb\xe5\x93\x63\x61\xd6\x57\x35\x41\x33\x7b\xe1\x5f\x5c\x35\x83\xa6\x6e\xe1\x63\x49\x9f\x9d\x91\x20\x8f\x9d\xb7\x35\x1f\x70\x52\xd7\x25\xa1\xbf\x86\xc3\x61\xda\x25\x81\x35\xd8\xcf\x25\x9d\x9b\x46\x20\xb9\x75\xe3\x79\x05\x8a\x20\xb6\x52\x1f\xd1\xc2\x19\x92\x1a\xb9\x91\xc4\x59\x57\x95\xc8\x90\xb2\xc8\xf3\x28\xfc\xea\x62\x8a\x21\xfc\xa8\xa4\x52\x4b\x15\x3d\xa4\xa5\xdf\xe6\x6e\xa0\x13\xc8\x5a\x44\xc1\x77\x67\x51\x3e\x48\x9a\x87\xd1\x56\xdb\xd4\x48\x2b\x72\xd8\x45\xb3\x5b\xf1\x19\x84\x47\x41\x12\x99\x72\xcd\x5f\xc4\xee\x33\x14\x56\xcd\x13\xb9\x04\x87\x4d\x25\xc2\xa6\x89\xb7\xad\x46\xd5\xac\xac\x51\x08\xeb\x08\x73\xc1\x1d\x07\x70\x65\x21\x39\x1d\x4e\xe6\x64\x0d\xa7\xde\xcc\x51\xcd\x34\x67\x19\x69\xda\x16\x49\xeb\xa2\x09\xf0\x46\xcf\x91\x73\xed\x04\x89\xd9\x9c\x8f\xfb\xa5\x12\x1c\x9a\x35\x64\x55\xbf\xfa\x82\x8d\x6a\x67\xd5\xe2\x64\x31\x67\x8d\xd5\x5c\x46\xcc\xcf\xc5\xd8\x05\xbb\xf3\x7f\x89\xe0\x8a\x77\xc0\xe1\x78\x3a\xcb\x4b\xcd\x1b\xc3\xf9\xbf\xb5\x8a\xea\x27\xf9\xa9\x3e\x2c\xd6\x49\x1d\xd5\x39\x60\x23\xb4\x4c\xb4\xb1\x69\xd6\x12\xd8\xd2\xd8\x28\xac\x39\x10\x67\xb7\x04\x82\xcb\xb6\xce\x85\x0c\xb2\xe1\x55\xb9\xad\x20\xde\xf4\x9b\x2d\x7c\x52\xbd\xc6\xde\x39\x9b\xa9\xd4\x86\xa3\x02\xcb\xa6\x5e\x54\x77\xb3\xc8\x93\x6c\x23\x28\xce\x25\x32\x3f\x98\xef\xd6\x6e\xa1\x35\x90\x27\xa7\x81\xf2\x99\x46\x21\xac\xfa\x02\x81\x02\x5f\xcf\x60\x4e\x60\x51\x32\xaf\xc3\x04\x5e\x37\x75\x8f\x89\x89\x10\xeb\x9d\xad\x9b\x29\x2f\xe9\xb4\xfb\xe8\x91\xce\xc4\x1f\x88\x94\x95\xb8\x38\xe0\x13\xaf\xdb\xf5\xae\x46\x0a\xc5\xe9\x01\x5b\x43\x57\x21\x4b\x34\x43\x9c\xb8\xd4\x37\xcd\x92\x68\xfe\xba\xdc\xaa\x36\x63\x57\x3e\x9f\xeb\x70\xb1\x18\x4b\xfb\x97\xab\xbe\xba\xa2\x04\x91\xf3\xbe\x13\x11\xcd\x33\xf3\x7c\xb2\xa7\xea\xb0\x64\x38\x0f\xd4\xf3\x14\xcd\xba\x65\x6c\xba\x11\x62\x8f\x2a\xd0\x40\xf1\xec\xbe\x40\xb2\xbe\xc6\xf6\xd6\x79\xd6\x03\xe0\x66\xaa\x5b\xbb\x44\x19\xf4\xd9\x1e\x92\x3b\xc6\x36\x1b\x6b\x45\x08\x64\x17\xb5\x0d\xb0\xf4\xef\x27\x27\x04\x07\x60\x79\x3c\x2e\x17\x27\x01\xe4\x49\xc6\xc1\xe6\x4b\x8d\xc4\x7b\x2e\x9f\x58\x37\x3f\xef\xaa\x32\x92\x4e\xe1\xb8\x80\xeb\x22\x7e\x36\xd8\x61\x3a\x0e\x3e\x0b\x62\x0c\x4c\x86\x93\x43\xce\x97\xb1\x51\x73\x5a\xc2\xc7\x93\x06\xd3\xb8\xe0\x22\x85\x02\xa8\x24\xca\x28\x5a\x7f\x71\x70\x7d\x89\xc9\x42\x5f\x26\x68\x4a\x41\x5c\x0a\x91\x29\x4a\x27\x7e\xf0\xc8\x92\x40\xaa\x04\x63\xe2\xb4\x8f\x02\x49\x1f\xf7\xa6\xe7\xa8\x24\x91\x0c\x25\x0b\xd4\xdd\x76\xce\x17\xfb\x6d\x3b\x49\x09\xc0\x93\x07\x62\x02\x33\x18\x75\x61\x6a\x06\x80\x42\x63\xdd\x32\xc2\x66\xbf\x21\xda\xdf\xc7\x79\x3d\x7b\xe7\xd6\x1f\x84\xbe\x2a\xa9\xf9\xe3\x6a\xc5\x2d\x20\xae\x12\xf1\x82\x74\x66\xf8\x8d\xc0\x8b\xe7\xf2\x3b\x3c\x47\x83\xbf\xee\xa2\x1a\x1b\xc5\xe1\x65\x49\xd0\x20\x81\x0e\xdb\x25\x09\x76\x23\x29\x18\x1f\x41\x0e\xdc\xb6\xed\x33\x87\x07\x31\xc5\x6c\xb3\xe1\xa1\x78\x57\x8a\x1c\x43\x1e\x30\x07\x06\x31\x4d\xe4\x7f\x20\xa8\x1c\x15\xbb\x9c\x31\xfd\x00\xad\xaa\xd9\xf8\x23\x21\xc5\x07\x25\x5a\x47\xb1\x6f\x5b\x71\x2d\xa2\xb2\x1b\x0e\x32\x80\x3a\x48\xaa\x96\x6d\x4e\xe7\x74\x16\xe5\x02\x82\x23\x60\xe7\x14\xa4\x42\x60\xe9\x59\x03\xff\x6c\xb9\x2c\x5f\x96\x34\x35\x70\x6c\xe2\x17\x70\xce\x4a\x72\xa1\xb4\x21\x84\xf7\xef\x18\x8f\x30\x42\xd9\xf3\x89\x01\x33\xa2\xea\xc2\xb4\x25\xd3\x2a\x64\xbc\x47\x61\xef\xcf\x96\xe6\xab\xbb\x52\x43\xf0\xdd\x3b\x2f\x11\x7b\x8c\x13\x98\xe3\x00\x86\xff\xb3\x0b\x19\xc5\x20\x26\xf9\xef\x2e\x85\xfb\xda\xd1\x64\x9a\x97\x08\x76\xdf\x9b\x51\xce\xe5\x10\x97\x80\x35\x67\x5a\xac\xe6\x9d\x6c\xa4\xa0\xcb\x13\xab\x2f\x89\x6d\x0b\x73\x95\xd5\x94\xeb\xb1\x19\x78\x46\x7f\xe6\x4d\x29\x63\x54\xe7\x50\x1c\xe3\x2f\x14\x56\xed\x05\xcf\xb1\x45\x25\x01\x9c\xbb\xdc\x27\xcd\xb6\x93\xba\x4b\xca\x80\x27\x3c\x1f\x0c\xae\x11\x70\xc1\xaa\x60\x81\x5a\x05\x79\x43\xf6\xee\xd9\xd6\xaa\x0e\xa1\xce\x6b\xf5\x02\xa5\x69\x98\x84\x01\x3a\x08\xb8\x8f\xaa\xdb\x26\x64\xc4\x93\xff\xe2\xf4\x29\xb0\xee\x5c\xa0\x4d\xea\xde\xd2\x17\xe6\x4a\x5a\x58\x0e\x8d\x97\xa4\xa0\x9f\x95\x3e\x76\xa2\xaf\x1c\xd4\x88\x2b\xab\x5f\x77\x38\x92\xe7\x08\x90\xab\xb3\x8f\x3c\x87\x97\x99\xe2\xb8\xd1\x43\x7e\xa2\x74\x69\x7b\xce\xa7\x49\x1e\x46\xa3\x19\x8d\x90\x49\x3b\xfe\x42\x43\x94\xaf\x03\x4a\xdd\x80\x97\x19\xa8\x35\x6f\xd9\x1c\x32\xcc\xc1\x2f\x2c\x57\x66\x79\x5b\x95\x5d\x21\x52\xd2\x74\x38\xda\x85\x5e\xe0\xc0\xa5\x23\x61\x46\x1f\x0e\x82\x0e\x36\x4c\xcf\xdd\x57\x8d\x27\xd5\x69\x15\xf4\x19\xa0\x28\x68\xba\x60\x8c\x5b\xc7\xc5\x6e\x1a\x26\x41\x6b\x85\x5e\xbb\xa2\x53\xec\x39\x83\x80\x0f\x86\x0e\x69\xed\xd2\xdf\xba\x94\x84\x92\x14\x36\x57\x92\x9e\x72\x2d\x0b\x61\xbc\x71\x88\xd9\x61\xcd\xa6\xf2\xb9\x81\x67\x27\x7e\x87\x4e\x4d\xd2\xab\x49\x2a\x9e\x7a\x40\x86\x0d\xad\x30\xab\x15\xb8\xe4\xa6\x75\xd1\x24\xef\x83\xab\xbd\x87\x00\xfb\x5e\x0e\xef\xcc\x05\xb1\xaf\x08\xcd\x39\x7e\x4e\xcc\x73\x99\xb7\x1b\x4d\xab\xd7\x4d\xc9\xb9\x77\x64\x2d\xc2\xfd\x09\xee\xed\xac\xca\xbc\x72\xb1\x4a\x40\x5d\xe7\x54\x39\xdc\x39\xe0\x54\xff\xd6\x41\x31\xb2\x5e\xec\x33\x45\xbb\x62\x99\x7c\x53\x2d\x93\x83\x3c\x9b\xa4\x7b\xb8\x94\x3d\x31\xfa\x10\x8a\x00\xb7\x76\x3c\x47\x05\x20\x2d\x35\xf9\xef\xfd\x61\x92\x23\x1b\xf7\x76\x1c\xdd\x6b\x02\x09\xc6\xbc\x89\xf8\xa8\x35\x32\xdc\x48\xbc\xca\x85\x39\x63\x10\x52\xd8\x17\x49\x50\x48\x96\x1b\x10\xc0\x7f\xff\xef\xb0\x8c\xdd\xdd\x76\x6b\x91\x88\x0a\x10\x01\xcc\xaa\x14\xa6\x77\xb2\x27\x37\xb9\xa3\x2c\x68\x04\xbb\x38\x37\x37\x62\x18\x05\x42\x14\x3b\x57\x1f\xd0\x1e\xcb\x42\x11\xa8\xf2\x90\x4e\xfd\x41\x3a\x3f\x11\x9b\xea\x18\xe4\xdc\x53\xe9\xbd\x0b\x4e\xca\xe9\x7e\x56\x55\x96\x29\x80\xbb\x90\xb8\x21\x69\x74\x44\xfd\x66\x16\x47\xb9\x4c\x3a\xd7\x1a\x3e\x59\x8b\x35\x02\xf9\x19\x9a\xc7\x29\x26\x25\x4c\xbd\x8f\xae\xea\x1a\x31\x35\x02\xc9\x38\xff\x40\xe8\xa3\x33\xe9\xae\xd5\x81\xe5\xcd\xd9\x6f\x49\x7c\xa6\x07\xa2\x66\x96\xd0\x7e\x36\x9e\x7d\x4d\x80\xbd\xff\xeb\xf5\xc8\xb6\xaf\xec\x41\x56\xab\xea\xd5\x8f\xe1\xfb\x45\x37\x5d\x3c\xf1\xfe\x9c\xd3\xca\xd2\xe6\xe4\xfa\xf7\xba\x4c\xa1\x24\x8b\x8e\xc7\x23\x35\x02\x12\x22\xe7\xbd\x84\x25\x87\xa2\x92\x85\x6b\xf2\xc8\x82\x86\x08\x1f\x6c\x2f\xca\x4a\xba\xda\xb8\xb5\x61\x83\x82\x5c\x61\xdf\x91\x5b\x4f\x05\x22\x74\xb1\xb8\xeb\x2b\x72\x0e\xec\x07\xd9\xe0\x23\x04\xb2\x9d\x53\x1b\xb6\xa0\x99\xca\x4d\x52\x65\xae\xfa\x06\x09\xeb\xba\x71\x91\x86\xf2\xf1\x07\x29\x5f\xdf\xcc\x87\x4c\x73\x72\x8c\x86\x14\x84\xa5\x1c\x15\x72\x7b\xb4\x17\x06\x6d\x44\x09\xda\x25\x38\x33\xae\xca\xe7\xbf\x02\xae\x7a\x4e\x72\x86\x2e\xf1\x04\x7b\x89\x35\x07\x8c\x18\x37\xf0\x64\xf4\x9f\x4d\x56\x2f\x33\x8d\x18\x02\x90\xd6\x6b\x02\xed\xcd\x35\x60\x54\x6f\x7c\x2d\x2a\x0c\x90\xba\x34\xd7\x66\x6b\x39\x71\x7e\x80\xa0\x5e\x06\x20\x60\x0d\xf1\xee\xef\xc8\xfe\x46\x42\xee\xab\x04\x45\xd9\x93\xd0\x5e\xa8\x1d\x01\x1b\x74\x0a\x13\xa3\xc3\xf6\x57\xf1\xe9\x7d\x97\x37\x47\xb9\x80\x7b\xec\x38\x1b\x08\x77\x57\x45\x49\x75\xce\xe3\xd4\xae\x10\x70\xb8\xbe\x73\xe7\xeb\x3b\x53\xc9\xac\x49\x4b\x46\x06\xb5\x2f\x73\xbd\x0a\xe0\xb5\xb5\x9f\xa0\xee\xd3\xae\xc1\xad\xf6\x60\x2c\x69\xe1\xda\xa7\x05\x5f\xf3\x93\xbe\x2c\xef\x9a\x24\x5e\x27\x76\x9f\x17\x0b\xae\xaf\x72\x94\x18\xa8\xb5\x33\x35\x87\x1a\x4c\xbc\x2d\x09\x1a\x27\xfc\x81\xe9\xd9\xf4\xb3\x24\xe7\x03\x05\x50\x1a\x95\xbe\xa1\x62\x16\x50\x23\x7d\xd9\xca\x9b\x23\xe9\xd4\x0b\x6f\xb2\x7e\xe5\x64\x82\x55\x74\xce\x4a\xdb\x57\x4d\x0e\x3f\xe3\x7a\x87\x76\xf8\xbc\xca\x3c\xfe\xcd\x26\xe1\xce\x94\xdc\x29\xec\x9a\x6c\x11\x3a\x3a\xb2\x80\x6d\xa1\x61\x8f\x70\x77\x68\x13\x5c\x9e\x4b\x72\x2c\xae\xcb\xe1\x75\x41\xe9\xe9\x61\xac\xf0\x22\x6c\x61\x46\x55\x2f\x73\x20\xa3\x8a\x60\xb5\xeb\xf1\x87\x86\x70\x62\xa9\x68\x5c\x4c\x28\xb5\x10\x09\x9b\x02\x5d\x40\x9d\x21\xda\x86\xf4\x08\xfb\x2f\xb2\xda\xa5\x86\x92\xb8\xe3\x08\x4d\x80\x35\x8a\x78\x5d\xb7\xb8\x24\x36\x1c\x39\xd2\xd1\xce\xa5\x5d\xbe\x75\x20\xb1\x33\xfa\x14\x92\x17\xb1\xa8\x92\xb2\x2e\xc2\x2e\x5b\x39\x03\xce\x58\x17\x84\x45\x2b\x4e\x10\x22\x84\xda\x90\xb7\xa8\x10\x8b\x21\x83\x42\xa7\xdd\x2e\x9a\x96\x9b\x89\x76\x50\x23\x49\xb3\xea\x7d\x14\x4d\x25\xd4\x1b\x2e\x3b\x24\x8b\xaa\xac\x83\x5f\x64\x05\xed\x3e\xac\x94\x9d\x21\x1e\xc0\xef\x38\x78\xe0\x88\x04\xed\x24\xb6\x58\x35\xeb\x73\x1f\x1e\x46\x69\xef\x90\x60\x80\x80\x22\x4c\xcc\xf7\x23\x1b\x39\x2c\x01\x34\xae\xe5\x6b\x4f\x0e\x08\xdf\x8d\x3a\x79\x8d\x6b\x56\x00\x1c\x81\x5c\x71\x0d\xe4\x88\x1e\x4a\x2b\xa8\x04\xf0\x30\x32\x3d\x6f\xff\x2b\x02\xf8\x07\xd0\x43\x38\xc5\x0e\xfa\x07\xfd\x8a\x35\x18\xf8\x2c\x6c\xcf\x8b\x1c\x95\xf8\x57\x92\x98\xbf\xa2\xa5\x79\x17\x2a\x68\xbc\x61\x9f\x0a\x40\x46\xf3\xd0\x36\xba\x3e\x3c\x5a\x51\x03\x44\x29\xb5\xa8\x64\xa7\xe4\xf6\x16\x28\xa5\xee\xd9\x43\x11\x66\x92\x3f\x10\xa1\x66\x71\x61\xb7\x61\x93\x80\x87\x0e\x9a\x6a\xf5\xf9\x67\xb9\x03\xc5\xe5\x79\xe7\x51\xfe\x6d\x7b\x2c\x8d\x67\xe8\xbe\x3d\x50\x9f\x3c\x72\xaa\x83\x7d\xc8\xe7\x58\xa4\x5c\x76\x1c\x96\x7c\xf6\xba\xcc\x16\x7b\x29\xe2\xee\x24\xb4\x49\x32\x2a\x66\xf5\xeb\x81\x0c\xd2\x18\x1f\x71\x63\x5c\xf9\x22\x97\x76\xa4\x3b\x1d\x90\x1c\xf1\xfe\x8a\x18\x21\xa8\x85\x8d\xb0\x9d\xb7\x2b\xbe\x7a\xb6\x9f\xda\x76\xb5\x00\x7f\x25\xa0\x9f\x21\x16\x46\x75\xf5\x90\x28\xa7\xdb\xaf\x10\x65\x5a\xf7\x83\x2f\x6e\xba\x6b\x20\xe1\x10\x97\xc1\x61\xa2\x5f\xf3\x2a\x9e\x2c\x4d\x8f\x1d\x2e\x71\x70\xf2\xca\x13\x94\xb6\x02\xd5\x58\x7e\x39\xc7\x96\xd5\x84\xbf\x76\xf5\x5e\xdd\x26\x0c\x2c\xb5\xbc\xab\xf8\xb7\x57\xdf\x71\x3c\xf7\xf4\x6f\x4a\x09\xab\xe3\xee\xa2\x44\xe2\x4b\x2e\xd6\x88\x8c\xbb\xe8\x9b\x9b\x7b\x54\x80\x0f\xef\x40\x5a\xdb\x3d\x39\x14\xf9\xa2\x89\xdd\xd7\x09\xe4\x76\x8c\xd4\x08\x86\x1e\xb4\xfb\x3d\xff\xff\x40\xf7\xbd\xdd\x75\xcd\xcc\x3e\xcd\xeb\xae\x43\xbc\x20\xf3\xe1\x4e\xd7\xaf\x7e\xf6\x23\xec\x7f\x18\xee\x9f\x73\x05\x6b\xdf\xce\x45\x58\xe8\x48\xf3\xd3\xe0\xc0\x96\xf7\x36\xf9\x9a\xee\xf3\xc1\x85\xe6\x51\xfb\x06\x22\xdc\x1d\xf6\xf8\xf3\x11\xc2\x43\x07\x97\x20\x42\x79\x66\x4f\xe4\x2e\x98\x84\x66\xc4\xa7\x5c\x83\x5d\xf5\xba\x1e\xfa\xc5\x0a\xe4\x13\x1a\xf1\x5d\xc4\x3e\xd2\xf3\x32\xed\x11\x82\x94\x9c\xbf\xa3\xb2\xb6\x5d\xe5\x98\x33\x5c\xae\x30\x5f\x6b\xf1\x26\xeb\x67\xa1\xf4\x46\x42\x81\x5b\x5c\xb5\xc4\x58\xc0\x3f\x73\x69\xaa\x73\x37\x5c\x44\x1b\xc2\x74\x75\xd0\x71\xe7\x69\x0e\x96\x83\x03\x9b\x9f\x9b\x27\xee\x0c\xac\xdb\x4c\x36\x1b\xf7\x5d\x53\x7c\x07\xc2\xb3\x7a\x13\xb5\x17\xef\xd5\x27\x29\x2a\xf1\x33\x74\x9f\xc0\xdb\x16\x6a\x62\x71\x15\x86\xcf\x15\xc9\x1f\x34\xb9\x65\x9b\xb8\x08\x1a\xdc\xdb\xc9\x21\x14\x28\x7d\x91\x32\x21\x4f\xe9\x41\x43\xa5\xc5\xe5\x96\x2f\x1d\x6a\xc7\x60\x88\x96\xb5\xdf\xc0\x4f\xd5\x41\x13\x4e\x10\x34\x11\x58\x0e\x6e\xe0\x04\xd5\x13\x08\x03\xfd\x97\x73\x78\xc7\x3b\xef\x7c\x17\x47\xd6\xf5\x0e\xba\x26\x09\xde\x38\x4b\x2d\x47\x73\xda\x9e\xb6\x37\x13\x97\x92\xb4\x45\xe3\x1d\xdb\x89\x86\xf3\x33\x9e\xbf\x41\x76\xaa\x09\x0c\x48\xa2\x31\x32\xc6\x49\x45\xef\x98\x99\x49\x7c\x9a\x96\xc3\xe2\x81\xa1\x80\x38\xd3\xeb\x17\x8d\xc1\x7d\x65\xb9\x83\x62\xcd\xce\x26\x80\x7b\x68\x82\x75\x17\xcd\x38\x1a\x16\x6b\x08\xea\x15\xcd\xd7\xf1\x7d\x8b\xa0\x2c\xf3\x6b\x32\x70\x8e\x5e\x6a\xc5\x5a\x2d\xa4\xd0\x94\x3b\x41\x7d\x2f\xf8\x02\x97\x32\xb8\x3f\xb5\x72\x85\x5f\x36\xb0\x61\xf0\xe1\xcb\x85\x07\x13\xf0\x6a\x7e\xfe\xe3\x4c\x81\x54\xbc\x5f\xcf\x10\x48\x9a\xa3\xdb\x6c\xc7\x80\x03\xf9\x02\x22\xd7\x9e\x9b\x2f\x34\xc0\xe5\xfb\xbc\x4c\x70\x82\x50\x65\x5a\xdb\x1f\xd2\x58\xf4\xeb\x90\xbb\x2e\x37\xe7\x2f\xa0\xba\x6f\x59\x19\x98\x4f\x3c\x6d\xe2\xf2\x68\xdc\x54\x54\x44\x82\x1d\xa4\x2c\xe2\x2e\xa5\x57\x11\x56\xe4\x5b\xb9\x57\x0c\x11\x02\x5f\x23\x6d\xa4\xce\xe8\xdb\xe6\xd0\x59\xae\x69\x9e\xca\x8a\xf9\x74\xf6\x31\x4c\x79\x81\x4f\xe8\x7b\xf2\xb1\x37\x3b\x5e\xd7\x9e\xee\xe1\xe2\xa0\x27\x60\x12\xfd\x84\xae\x89\x3b\xd9\x61\x05\x03\xf2\xd8\xcd\x9a\x2e\xd5\x57\x6d\xe4\x52\x76\xf0\xd9\x19\xfa\x17\xa4\x13\x4d\x7d\x05\x11\x3c\x97\x2c\x27\xd8\x72\xde\xa9\xda\x26\xf9\xa3\x94\xab\x03\x65\xc1\xc6\xf9\x4c\xed\x2a\x51\xfd\xdd\x56\x85\xcd\x35\x16\x82\xb3\x3f\xf7\xe1\x4b\xaf\x11\x59\xda\x70\xe0\x60\x7b\xac\x20\x9b\x57\x23\x63\xc8\xc1\x8c\x66\x6e\x74\x29\x1f\x15\xaa\x0e\xbb\x9c\x53\xf7\x35\x62\x3c\xe9\xdd\x5c\x23\xd3\xec\xed\x41\x56\x47\x89\x29\xb9\x83\x9f\x52\xf0\xe4\xb2\x04\x92\xb4\x8d\xae\xc3\x22\xdd\xd6\x68\xb7\xe9\xb6\xca\x6c\x03\x5e\x74\xf7\x7a\x78\x66\xad\xd2\x79\x96\x26\x91\x75\xd9\x6b\xbe\x76\x69\x9d\x6e\x7d\x29\x6f\xa0\x8f\x4d\x53\xe1\x98\x0e\xce\x68\x5e\x0a\xbb\xbb\x06\xe8\x0e\xcd\xaf\x34\xbc\x2b\x0e\x65\x58\xe2\x22\x1f\x31\xe4\xbf\x77\xa9\x5c\x49\xd8\x79\x9b\x2f\x45\x71\xbf\x19\xbe\x0a\xfd\x4a\x5f\x16\x12\x47\xef\xe6\xbb\x77\xd2\x57\x86\xcc\x06\x7a\xc6\xf2\xb0\xe5\x5f\x29\x63\x59\x71\x95\xbb\xbd\xc5\x5e\x69\x60\xdb\x8b\x3a\x6a\xc7\x30\x6d\x50\xf6\xbe\x64\x3f\xd0\xf0\x65\xcf\xa3\x76\xf0\xe0\xae\xb8\xa7\x4d\x65\xf4\x18\xc5\x99\xf6\xea\x21\x82\xed\x1e\xcf\xd0\xee\x81\xbd\xf4\x73\x77\xf9\xfb\xa5\x7c\x05\xe2\xf6\xf7\xe4\xfc\x50\xe8\xe9\xd9\x6c\xbe\x52\x77\x25\xaf\x1d\xb5\x6e\x77\x05\x91\xfd\x5d\x68\xdb\xf5\x1b\x73\xd9\xfb\x41\xa9\x74\xe4\x7c\x3c\x1e\x49\x1d\xdc\x94\x4e\x85\x8b\x30\xc2\xa1\xae\xb7\xe2\x87\x55\x65\x2e\xdf\xe2\xf1\x03\xc1\x94\xdc\xc0\xce\xad\xc5\x99\xaa\x84\x57\x37\xfc\x39\xe0\x45\x68\xc8\x3d\x0b\x89\xfe\xff\xd1\xa9\x82\x08\x21\x8a\x3a\x82\x7c\x07\x28\xd1\xf8\xab\x89\x8c\x77\xb1\xa9\x41\x54\x8c\x8c\x0b\x1f\x62\x95\x61\xa9\x89\x48\x34\x6d\xe7\xbb\x4e\x1a\x1c\x4b\xa3\x68\x08\xcd\x17\x24\x39\x1b\xfa\xaa\x93\x27\x7f\x33\xf9\x3f\x26\x84\xd6\x78\x2e\x33\x95\x47\x86\x68\x49\x8b\x2a\x83\xbb\x2d\x88\x43\xc5\xb5\x3a\x1b\x95\xa7\x0f\x51\xe8\xdd\x8f\xcb\xc4\x03\x91\xb3\x6f\xf5\xfe\x58\xca\x57\x4c\x8e\x7b\xc3\x80\xbd\x17\x24\x7f\x7f\xca\x0e\x95\xbb\x27\x22\xb2\xaa\x7b\x5f\xc5\x13\xc6\xde\xc2\x21\x40\xd6\x79\x47\x80\xb4\xdd\xc0\xdc\xf0\x85\x56\x0e\x8b\x32\xdc\xf6\xa2\xe3\xfc\x4d\x8e\xd3\x55\x0b\xbc\x1f\x47\x85\x6b\xc1\x67\xd3\x2b\x9a\x66\x88\x61\x3d\x5c\xe0\x06\x15\x49\xeb\x47\xae\x17\x35\x6f\x8e\xb5\x71\xd7\x7a\x85\x4e\x3f\xb1\xce\xf1\x55\x1f\x0d\x98\x8e\x9f\x0a\x92\x9a\x4d\xbd\x57\xe3\x73\x17\xeb\x12\xa7\x5b\x15\xeb\xd3\x3a\x9b\x67\x8d\xcf\x55\xfa\x27\x11\xb4\x0b\x64\x7f\x37\x51\xc7\xcf\xdc\x35\x17\xf2\x95\xc6\x30\x37\xdd\xeb\xe9\x3d\xd3\xce\xc2\xe3\x55\x79\x89\xd6\x49\xc1\x10\x1c\xa9\xc0\xc8\xf2\x89\x76\x6b\xf6\xcb\xdd\x29\x5e\x7b\x11\xd9\x73\x2f\xc8\xfc\x3b\xb7\x6a\x84\xe2\x8e\xfc\x1e\x0b\x7b\xfd\x0b\xdc\xaa\x71\xf9\x8b\x5e\x9c\xe0\xd8\x48\x9a\x65\x5f\x2b\x4e\xfe\x60\xc3\x82\x01\xf5\xfe\x7c\x4f\x75\x54\xec\x6b\xce\x44\x07\xb7\xbb\xd9\x5d\x74\xb7\x62\xf1\x17\x79\x7a\xa3\xff\xc8\x40\xa0\xc2\x26\x7e\x6b\xc0\xbb\xd5\x56\xe2\xf5\xc6\xbb\x8d\x03\xdc\x8b\x0d\x57\xb6\x91\xeb\xf1\xb8\xf8\xde\x56\x6c\xef\x63\xe8\x52\xc4\x9b\xaa\x7f\xea\x5a\x4a\xd4\x2c\xaa\x11\x60\xf1\x26\xa6\xac\xf9\x8e\x40\x5f\x9f\xf4\xe9\x0f\x2d\x84\x5b\x3c\x75\xb2\x70\x35\x2e\xd1\x42\x75\xe0\x41\xed\x4e\x5d\x41\x54\x51\xba\xbc\x44\x32\x4b\x41\x2d\x9a\xa6\xb8\x14\xbe\x70\xb7\x29\x49\xc6\x1a\xf3\x47\x9b\xae\x18\x9c\x49\xef\x7e\xd0\x84\xa2\x57\xe3\xb3\x62\x89\xc8\xc5\xba\x41\x4b\x3d\xda\x52\xf7\xcf\x37\x52\xcf\x40\x38\xdf\x61\x10\x3b\xe0\xbe\xad\xeb\xd6\xd6\xe7\x83\x50\x1e\xb9\xe0\xca\x8c\x64\x99\x80\x18\x9d\xb9\x14\xef\x7c\xa7\x54\xf1\xe5\x27\x22\xdc\xdf\x51\x72\x2d\x49\x30\xdd\xe7\xc6\x57\x16\x05\xcd\xb9\xa4\x85\x5b\x62\xaf\xc7\x89\x73\xc6\xaa\xd4\xe4\x3e\x00\xf4\xf8\xf1\x21\x27\x52\xc7\xbf\xf5\x4f\x8b\x28\x46\x0c\x31\x92\xbb\xd3\x23\x95\x58\x00\xb5\x4d\x9b\x93\xbe\x5a\x69\x07\x97\x06\x66\xf2\x29\x2b\xed\xf9\x3d\x60\xa6\x59\x7b\x3d\x33\xc9\xd2\x35\xe2\xdf\x83\xcf\xb4\x2c\xb1\x77\x86\xbb\x40\x30\x8f\x68\x61\xc2\xfd\xc1\xbd\x9b\x93\xd9\xb2\x7b\x23\xc1\xe9\xd6\x0b\x3f\x5d\xc1\x55\x1c\x49\x18\x57\xe5\x2e\xc9\x9b\x9d\xdc\x9d\x0c\xb4\x7c\xbf\x56\xcb\x3d\xad\xdc\x41\x03\xd5\x80\xdf\x72\x1d\xf4\xda\x70\xe1\xf3\xf3\x30\xcc\x85\xff\x89\x82\x7a\xae\x7c\xd1\x36\x82\xc2\x0b\x57\x83\xf4\x59\x2f\x88\x02\x51\xe5\xb8\xcb\xc8\xdc\xe7\x80\x43\x57\xc7\xc3\xe6\x9a\x6c\x5a\x56\xf0\x5b\xbe\xe7\x8b\x8f\xf8\x15\xf2\xa5\x3a\xb5\x57\x8a\x0e\xba\xce\xe8\x3f\xd7\x36\x47\x2a\x41\x52\x13\x78\x03\xa0\x10\x9d\xb4\xd2\xb0\xc9\xc7\xda\x7f\x4f\x2a\xb8\x20\x2d\xa6\x6e\x9e\xe4\x9d\x29\xb7\xe1\xf4\xe1\x63\x63\xdc\x1a\xe5\x6b\xc8\x7e\x54\xd7\x5b\x79\xf0\x03\x6e\xec\x60\x11\xea\x5f\xcc\x1e\x47\x8d\x75\xae\xe7\xf5\x40\x67\x1d\x1d\x4d\xab\x52\xc5\x3f\x89\xd2\x07\x6f\x64\xd4\xd1\x3d\x40\x88\xea\x4e\x7b\xe4\xb8\x29\xcf\xbd\x81\xe4\x3a\xf2\x98\x59\x08\xc9\xb5\xd2\xcf\xe8\x42\x46\x7e\x88\x17\x77\x37\x4f\x6b\xec\x2e\xa0\xd0\x75\xf9\xab\x73\xc2\xa6\x57\x95\xce\xc8\xd8\x36\xbe\x78\x1f\x9e\xb1\xc6\xba\xbe\x89\x32\x83\xe8\xc3\x8e\xe8\x63\x29\xd2\x33\xd4\xdd\x79\x07\x28\x00\xbf\xcc\x67\xde\xaf\x5c\x08\x66\xb0\xc2\x09\x9c\x15\x7a\x8d\x48\xa9\xc5\xe4\xe8\x22\xfe\x39\x1f\x5c\xea\x36\x15\xf7\x38\x85\x37\x02\x43\xa0\xef\x84\x9d\xed\x96\x12\x97\x49\x82\x57\x64\xa2\x30\xc1\x5b\x22\x61\x8e\xd4\xf5\xcb\xca\x47\x1f\x14\xbe\xb7\x5b\x7f\x9d\x83\xaf\x52\xfe\x9c\x96\x85\xb0\x5f\x1f\x62\x23\x25\x67\x4f\x69\xea\x35\x4b\x0c\xe0\xa0\xbe\x46\x16\x59\x30\xa5\xd5\xd1\xd7\x99\x22\x25\x52\xee\xc4\xfa\x8b\x92\x6a\x04\xd5\x0f\x8a\x15\xe6\x0a\x94\xeb\x96\x3a\x22\xd5\xdc\x35\x06\x42\xb1\x4a\xee\x1e\xec\x79\xd1\xcc\xc8\x9c\xd8\x60\x9f\x65\xe4\xdc\xee\xbb\x2a\xf1\xa9\x75\x73\xa0\x67\xe2\xf2\xbd\x2f\xd7\xf4\x6f\x70\xfd\xcc\x8f\x75\xec\x37\x62\xd5\xc1\xd5\xaa\xf0\x69\x03\x7e\xf1\x90\x53\x0c\x9a\x90\x99\x47\x92\x3f\xdf\x75\x95\x9c\xf0\xe6\x5a\x3d\x88\x41\xc9\xde\xad\x57\x98\x44\x4e\x00\xc4\x57\x99\x0e\x38\x03\x2e\x3c\xa6\xa9\x64\x17\x20\x02\x74\xd8\x2b\x8b\x84\xd6\x76\xcd\xc5\xf1\x68\x8b\xc1\x8d\x41\x72\x69\x5a\x63\x11\x2b\xec\xb7\xd2\x15\x1d\xa2\x4f\xa3\xa7\x28\xe5\xca\x98\xdc\x5e\xe0\x4a\x54\xc7\x08\x31\x1b\x6d\xad\x0b\xd8\x94\x5f\x28\x10\x4d\xd6\x17\x0a\x02\xf2\x09\xe5\x97\xa4\xbc\x95\x34\x6c\x70\x7a\xc7\x53\x88\xdb\xf2\x4b\x9f\xea\xd5\x0a\x82\xbb\xe7\xdf\x3f\xd3\xbf\x49\xd7\xc1\xd1\x27\x08\x39\xa5\xa2\x37\xab\x2a\xfb\x9c\xf1\xed\x0f\x39\x70\x3c\x1d\xa7\x39\xe9\xae\xb2\xfa\xea\x3d\x61\xc1\x00\x00\xb4\xd0\x28\xfa\xff\x9a\x2d\x8a\x66\xe2\x68\x0a\x17\x39\x68\x47\xb0\xee\xfc\x12\x46\x56\x65\xfe\x61\x24\x57\x0a\xf0\x0f\x3a\xa1\x81\x49\x4a\xe8\x9c\xc8\xe5\xc7\x73\x48\xcc\xf8\x0e\xbd\xde\x35\xe6\x25\xfc\xbb\x4d\xd2\xcc\x4c\xc2\xc8\x15\x54\x86\xd9\x41\x16\x5e\xfa\x25\x13\x3e\x46\x3a\xe7\x96\xb6\x8e\xe3\x8e\x5f\xd5\xf4\xaa\xe0\x21\xae\xa6\x86\xeb\xe0\x29\xa3\xee\xf1\x85\xd8\x89\xb2\xa9\x0c\xba\x27\xd5\xd3\x9e\xf2\xdb\x21\xfc\x6c\x83\xce\x70\x3a\x88\x9f\x1e\xf4\x57\xb4\xf4\x52\xbe\xb3\xd7\x07\x83\x11\x55\x2d\x67\xd5\x7c\xc5\xa2\x72\x6e\x22\x5a\xca\x9d\x72\x77\xa7\xfc\x98\x4c\xec\x6d\xbd\xbb\x0a\xa1\x2d\xae\x5d\x20\x11\x73\xa2\xab\xf9\x93\x25\x73\xe8\xde\x0d\x91\x5b\x29\x6f\x26\x82\x64\xf7\xbf\x3c\x60\x74\xed\xa1\x81\x5a\x30\x40\xd8\xeb\xe3\xe0\xca\x4f\xf0\x96\x8c\xcf\x61\x4b\x67\x7e\xa4\xb9\x7d\x1c\x5d\x1c\x28\xca\x70\x53\x3f\x1e\xdd\x89\x7d\x84\x7b\xa0\x10\xf8\xbd\x0b\xa9\x05\x1c\x7a\x47\xe0\x3d\x66\x68\xeb\x7e\xb0\xed\xde\x6a\xc7\x86\x7d\xe0\x67\x33\xcb\x8d\x85\x92\xd5\xe2\x12\x7c\x82\xbd\xf6\x9d\x45\xf2\x26\x26\xdc\x18\x9f\x80\xd3\x3c\x12\xf9\xb4\x23\x05\x19\xbe\x55\xc9\xc5\x88\xa5\xe8\x5e\xf5\x1c\xbd\x86\x82\xb6\xb1\x56\x5e\xdf\xa1\xef\xbb\x5c\x80\xa4\x97\xdb\xfe\xab\x3d\x9a\x8c\x44\x7e\xad\xf4\x80\x03\x95\x46\x2e\xd9\x70\x23\x84\xba\x12\xff\xc9\x4a\xcc\x49\x0e\x04\x79\xff\x60\xbe\x0e\x27\x93\xe1\xfd\xec\x1b\x89\xc0\xdf\x2f\xcc\xd5\xe8\x7a\xf8\x34\x1d\x99\xd9\xa7\x91\xb9\x1b\x5f\x4d\x86\x93\x6f\x66\x3c\x75\x8f\x14\xdf\x98\xdb\xc9\x68\x64\x1e\x6e\xcd\xf5\xa7\xe1\xe4\xe3\x68\x80\x71\x93\x11\x46\x04\x33\xf1\xe3\x0e\xc1\x04\x34\xea\x81\x7f\x1e\xfd\x6b\x36\xba\x9f\x99\xc7\xd1\xe4\xf3\x78\x36\xa3\xd9\xae\xbe\x99\xe1\xe3\x23\x4d\x3e\xbc\xba\xa3\xe1\xc3\xaf\x14\xa6\xff\xeb\x7a\xf4\x38\x33\x5f\x3f\x8d\xee\xcd\x03\x66\xff\x3a\x26\x72\xa6\xb3\x21\xc6\x8f\xef\xcd\xd7\xc9\x78\x36\xbe\xff\xc8\xf3\xe1\x01\x89\xc9\xf8\xe3\xa7\x99\xf9\xf4\x70\x77\x33\x9a\xf0\x2b\x13\x3f\xd3\xe2\xfc\xa1\x79\x1c\x4e\x66\xe3\xd1\xd4\x3c\x4e\x1e\xbe\x8c\x6f\xe2\x3d\x9d\x0e\xa7\x44\xf5\xa9\xf9\x3a\x9e\x7d\x7a\x78\x9a\x75\xb4\xd3\xde\x86\xf7\xdf\xcc\x3f\xc6\xf7\x37\x03\x33\x1a\xf3\x44\xa3\x7f\x3d\x4e\xf0\x76\xf3\x8d\xa1\xb9\xc7\x9f\x89\xe0\x11\xfd\x71\x7c\x7f\x7d\xf7\x74\xc3\x0f\x58\x5c\xd1\x0c\xf7\x0f\x33\x9a\x9d\x36\x46\xc3\x66\x0f\xcc\x19\x37\xd6\xcd\x0e\x62\x68\xfe\xcf\xa3\x09\xb1\xef\x7e\x36\xbc\x1a\xdf\x8d\x69\x49\xbc\x78\x71\x3b\x9e\xdd\xd3\x12\xcc\xba\xa1\x50\x7e\xfd\x74\x37\xa4\x4d\x3c\x4d\x1e\x1f\xa6\xa3\x0b\x61\x20\xcd\x41\xec\x9e\x8c\xa7\xff\x30\xb4\x01\x65\xeb\x3f\x9f\x86\x7e\x1e\xe2\x2d\x4d\xf1\x79\x78\x7f\xcd\xc7\xd4\x3b\x46\xec\xd6\x7c\x7b\x78\x22\x4f\x41\xbb\xbe\xbb\x89\xfe\x0e\x36\x8d\xcc\xcd\xe8\x76\x74\x3d\x1b\x7f\xa1\xb3\xa5\x81\xb4\xca\xf4\xe9\xf3\x48\xb9\x3d\x9d\x31\x7b\xee\xee\xcc\xfd\xe8\x9a\xa8\xc5\x57\xd3\xd1\xe4\xcb\xf8\x9a\xb9\x30\x19\x3d\x0e\xc7\x13\xc3\x2f\x7b\x4c\x26\x98\xe5\xe1\x1e\x96\xe5\xd7\x0b\x1c\x1c\x09\xc8\xe8\x0b\x8e\xff\xe9\x1e\x0f\x61\xd3\xe8\x7f\x3e\xd1\x66\x0e\x08\x01\x66\x18\x7e\x24\x41\x03\x23\xc3\x33\xff\x3a\xa6\xa5\x71\x3a\xfd\x83\x1f\xf0\x27\xf4\x87\xee\xe0\xbf\x91\x08\x3d\x98\xcf\xc3\x6f\xf2\x98\xc8\x37\x27\x1a\xb4\xa2\x7b\x6d\x24\x96\x08\xe2\x67\x27\x98\xc3\xab\x07\x70\xe0\x0a\x7f\x66\xb2\x88\x10\xb0\x03\xc7\x73\x33\xfc\x3c\xfc\x38\x9a\x06\x02\xc0\x4b\xeb\xb3\xde\x03\x33\x7d\x1c\x5d\x8f\xf1\x1f\xf4\x77\x12\x3b\x3a\xe7\x3b\xe1\x09\x29\xd0\x3f\x9f\x70\x84\xf4\x0b\x9d\xc4\x0c\xe9\x2c\x31\x03\x64\x50\xcf\x0b\xea\x07\x39\xbb\x77\xf2\x41\x6b\xf7\x55\xf2\xac\x5b\x7b\x5f\xf6\xcc\xdd\xc3\x94\x05\xed\x66\x38\x1b\x1a\xa6\x98\xfe\xff\xd5\x08\xa3\x27\xa3\x7b\xe2\x17\xab\xd2\xf0\xfa\xfa\x69\x42\x6a\x85\x11\xf8\x82\xa8\x99\x3e\x91\xa2\x8d\xef\xe5\x50\xb0\x5f\x56\xe4\xf1\xe4\xc6\xeb\x12\x8b\xe7\xed\x70\x7c\xf7\x34\xd9\x13\x30\x5a\xf9\x81\x58\x88\x29\x59\xd0\xba\x03\x99\x3e\xdc\xce\x48\x07\x46\xe7\x03\x96\x01\x33\xbe\xa5\xa5\xae\x3f\xe9\xe9\x99\x48\x63\xbf\x99\x4f\x74\x14\x57\x23\x1a\x36\xbc\xf9\x32\x66\xad\x93\x75\x48\x0f\xa6\x63\xe5\xc9\x83\xce\xa0\x7c\x04\xf0\xb8\x97\x81\x07\x5e\x9b\xe1\x0e\x65\x58\xf9\x21\x87\x9c\x92\x4e\x9d\xb1\x97\xa7\x5f\x7e\x83\x55\xbd\x27\x44\x73\xe7\x4a\x75\x1c\x59\x73\x36\x55\xde\x44\x93\x2b\x2d\xf1\xf3\xa2\xc1\x83\xc1\x8a\xfe\xd5\x39\xca\x5b\x51\xfd\x57\xc0\x1c\xda\x62\x08\xc7\xef\x39\x72\x77\xc9\x06\x57\xd3\xf4\x59\x8b\xac\xe9\xd9\x76\x06\x1a\xd6\xbd\xc2\x2e\x0f\xb7\xc6\x8f\x91\xba\xab\xc7\xfe\xcd\x6a\x4e\xad\x32\xfe\x17\x94\x8c\x79\x7b\x49\x90\xbd\x67\x4f\x90\xf2\x1c\xc8\x8d\xa2\x22\x91\x87\x2d\x07\xc7\x0a\x3c\x3f\x78\xb4\xed\x5c\xde\x41\xf5\xb7\xa4\xdc\x12\x03\x54\x31\x12\x2d\xdd\x76\x60\xcb\xdf\x5b\x8a\x5e\x97\xe5\xf7\xea\x10\x91\x25\x4b\xb0\x11\xce\xdf\x7f\xbc\x71\x63\xc9\x4d\x4a\x55\x88\xbb\xf1\xb4\x02\x2d\xed\xcf\xa5\xbc\xc0\x1e\xbe\xd3\xc9\x0f\xd7\x88\x03\xe6\x80\xc0\x35\x9b\xc4\x6f\x08\xf0\x54\x3c\x87\xbe\x88\x2a\x3d\x02\x5d\x33\x87\x35\xa7\x1e\x5d\x9c\x72\x37\xae\x86\x99\xdb\x92\xa3\x2a\x6e\xf6\x97\x9a\xd3\x5a\xdf\xd3\xd4\x72\x17\x2e\xc4\x02\x4f\x10\x7f\x70\x96\xfc\x69\xd8\x0f\x92\xfb\x17\x1e\x0a\x54\x9f\x24\xb9\x86\x8b\xa8\x89\xb4\xe7\xca\x4b\x71\xfc\x88\x84\xe9\xfd\x6b\x00\xe8\x2e\x91\xaf\x80\x19\x18\x30\xf9\x97\xd8\x7d\xe0\x18\x09\xd6\x07\x7f\x8b\x2a\x92\x27\xc1\xcd\xc1\xfb\xb6\xf4\x8b\x23\x62\xf0\xc3\x47\x38\xf9\x62\xe8\x5b\xd1\xe7\x87\xe0\x49\x1b\xf7\x4f\x20\x74\x50\x53\x13\xa1\x44\xd6\x59\xfc\xb6\xc2\xf9\x3e\xec\xbe\xd8\xdf\x79\x98\xcc\xd0\xe8\x6d\x8d\x5b\x0c\xee\xf5\x3d\x07\xd3\xe4\x8e\x94\x84\x3f\x0e\x14\xc0\x80\x39\x60\xf0\xc1\x37\xa2\x6b\xf7\x3b\xe7\x82\xf9\x26\xb4\x7f\xdd\x81\x68\xee\xfb\x76\x22\xfb\xc7\xae\x7d\x6a\xed\x1b\xd9\x2a\xff\xbe\x00\xbf\xd6\x88\x98\xcc\xb5\xac\x86\xf2\x7a\xb8\x0f\xe6\x2d\x47\x16\x5e\x8f\xe9\x98\xf8\x01\xf1\x2f\x89\xf1\x1b\xc1\xb2\xfc\xcb\x13\x03\xf3\x9f\xff\xcb\x13\xdc\x03\xca\xe9\x04\x79\x2a\x5d\xd3\x49\x85\x59\x8b\x11\xe7\xa6\x41\x79\x26\x1a\x92\x65\x71\x71\xb5\x2a\x0b\xda\x89\x3c\x73\xbc\xe5\xe7\xab\xb3\x3c\xe6\x0d\xf7\x45\xe3\x05\x6e\x96\x20\x4b\x47\x57\xee\x68\xe0\x99\xbb\x2b\xe8\xef\x81\x6b\x10\xb3\xb1\xd5\xb9\x91\x97\xcb\x29\xca\x40\x84\x95\x4b\x06\xba\xe0\xd7\xbd\xb9\x0e\x88\xbe\xea\x2e\x6b\xd2\xbd\x7c\x72\xea\x7b\x49\xc3\x4e\x36\xd7\x65\x48\x06\xee\x93\x3e\x8f\x98\xa0\xd8\xbc\xcd\x49\x23\xe5\x42\x27\x3e\x81\x2a\xa3\xfc\xff\xad\xdc\x95\xe9\x0e\xbd\x6e\xc2\x50\xd8\x95\xf9\xce\xaf\x22\xef\x18\x75\xab\xb3\x01\xb2\xdc\x65\x64\x4e\x82\xa5\xcd\xff\xb9\xa5\x40\xfd\x27\x52\x9e\xae\xc2\x0f\xe2\x5e\xf4\x39\xd7\xef\x45\x39\xaf\xcf\x7d\x82\xe3\x84\x96\xf8\x9f\xa0\xc0\x4c\x88\x9b\xe5\xc6\x7c\x4a\x16\xdf\x29\x40\x3f\x39\x91\x3e\x2f\x5c\x67\x20\x89\x9a\xed\xcc\x75\x89\xd3\xbb\x24\x9f\x5a\x65\x39\xfe\x35\x92\x5f\xcc\x89\xff\xf5\x23\x91\x92\xb9\xa7\x07\xbe\xc0\x02\x92\x62\x26\xcd\x4f\xfe\xf5\x25\xd9\x3f\x47\xeb\xff\xed\xe4\xff\x05\x00\x00\xff\xff\x65\x8e\xde\x6f\x1d\x65\x00\x00") - -func confLicenseGnuLesserGeneralPublicLicenseV21Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuLesserGeneralPublicLicenseV21, - "conf/license/GNU Lesser General Public License v2.1", - ) -} - -func confLicenseGnuLesserGeneralPublicLicenseV21() (*asset, error) { - bytes, err := confLicenseGnuLesserGeneralPublicLicenseV21Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU Lesser General Public License v2.1", size: 25885, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuLesserGeneralPublicLicenseV30 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\x59\x5d\x8f\xdb\xb8\x15\x7d\xf7\xaf\x20\xe6\x65\x67\x00\xd7\xc9\x26\xe9\x16\x5d\x14\x05\xa6\xb3\x93\x34\xc5\x6c\x1a\x64\x92\x16\x7d\xa4\xa5\x2b\x9b\x8d\x24\xba\x24\x65\xc7\xfd\xf5\x3d\xf7\x92\x92\x29\xf9\x23\x93\x14\xed\xc3\x62\x33\x36\x79\x79\x3f\xce\x3d\xf7\x90\x7e\xf3\xee\x93\x7a\xb8\x7f\x7c\xbc\xff\xa0\xde\xdc\xbf\xbb\xff\x70\xfb\xa0\xde\x7f\xfa\xd3\xc3\xdb\x3b\x85\xff\xee\xdf\x3d\xde\xab\xd9\xdf\xc8\x79\x63\x5b\xf5\x72\xae\x5e\xfc\x5e\xfd\xa5\x6b\x49\xbd\x78\xfe\xfc\x77\xb3\x3b\xbb\xd9\x3b\xb3\x5a\x07\x75\x7d\x77\x23\x1f\xa9\xd7\x8e\x48\x3d\xda\x2a\xec\xb4\x23\xf5\xda\x76\x6d\xa9\x03\xf6\xce\xd5\xdb\xb6\x58\xa8\x3f\xac\x43\xd8\xfc\xfc\xec\x59\xe5\xab\x85\x75\xab\x67\x7f\x9c\xcd\xee\xb7\xe4\xf6\x16\x26\x8d\x57\x1b\x72\x8d\x09\x81\x4a\x15\xac\x2a\x60\x5d\xe9\xb6\x54\xa5\xf1\xc1\x99\x65\x17\x48\x61\xed\x12\xf6\x1a\xfe\xd2\x90\x57\xb6\x52\x61\x8d\x8d\xb5\x29\xa8\xf5\xa4\x4a\x5b\x74\x0d\xb5\x61\xae\xb0\x5c\x15\x6b\xdd\xae\x4c\xbb\x52\x26\xb0\xf5\xd6\x06\xa5\xeb\xda\xee\xa8\x5c\xcc\x66\x1f\x79\xdf\x36\x45\x26\x76\x48\x49\x2e\xc8\x7b\x72\xea\x0d\xb5\xe4\x74\xad\xde\x77\x4b\x18\x57\x0f\xe9\x00\xd3\x16\xd6\x6d\xac\xd3\x01\xa7\xf3\x96\x00\x97\xbd\xb8\x59\xd8\xb6\x34\x1c\xab\xb8\xd5\x5b\x7e\x99\xdb\x3e\x6d\x74\xae\x7c\xb7\xd9\xd4\xc4\x8e\x23\xf4\xe5\x5e\xd6\xeb\x32\x5a\xc3\x72\x49\x8b\xf7\x62\xba\x46\x32\x78\x11\x21\x0e\x44\xf1\x7c\xa1\x6e\x0f\x0b\x7f\xa1\xca\xb4\xd1\x07\x7c\x77\xeb\x55\xe7\xb1\x76\x4d\x8e\x0c\x2a\x70\x25\xa9\x4a\x87\x5e\x29\x47\x15\x7c\xe4\x4c\x9f\xf4\xf5\x62\x1e\xe6\x12\x31\x2f\xbd\x92\xb8\xde\x3f\x7c\xd5\xde\x69\x43\x70\xf3\xea\x23\x56\x3c\x98\xa5\xd3\x6e\x9f\x5b\xd1\xc8\x28\x2c\x21\x80\x9d\x75\x9f\xd5\x8a\xff\x68\xfb\xfc\x1c\x02\x99\x2b\x8b\x23\x1c\x3e\xd3\x2d\xbc\x52\xb7\x48\xa5\x29\x04\x74\xca\x3a\x58\xb9\xb3\xcd\xd2\xf0\xc6\xbf\xb3\x19\xed\x55\xc9\x59\xca\x72\x78\xdb\xaa\xab\x6c\xd7\x15\x63\x45\xb7\xfb\x78\x2c\xcc\x06\xd5\xe8\xcf\x24\xc9\xe4\x80\x70\x86\x41\xa1\x5c\xa5\x0b\x52\x1b\x67\xb7\xa6\x3c\x54\x2d\xc5\x11\xf1\xb7\x5b\x9b\x62\xdd\x23\x4f\xbc\xdc\x19\xd8\x58\x6a\xae\x0a\xdc\xcb\x36\x2c\x52\xed\x00\x56\x0d\x38\x2c\x8b\x5a\x7b\xc1\x11\xb2\x20\xff\x1c\x9c\x1e\x9d\xc3\xc6\x4b\x02\x72\x4a\x2c\x6c\x6c\x29\x0e\x76\x5e\xcc\x3c\xc1\x4d\x0e\x5e\x5d\x8d\x12\x14\xa3\x8f\xb1\x63\x57\xd9\x15\x71\x57\x21\x8b\xd8\x30\x92\x5a\x9b\xf6\x73\x3a\x23\x4f\xf7\xce\x84\xf5\x38\x28\x2e\xed\x46\xbb\x60\x8a\xae\xd6\x6e\xda\x6e\x7d\x10\xb2\x2f\x26\x8b\x3f\x1e\x17\x6c\x87\x8a\x35\xba\x14\x7e\xd0\xb5\x07\x2f\xa0\x87\x29\x81\xef\x01\x8e\xe0\xdf\x89\xa0\xae\xa4\xad\xf1\xf1\xaf\xf0\xb4\x01\xd6\xee\xac\x73\xe4\x37\xdc\x98\xf0\xf6\xd1\x76\xae\x00\xf0\xab\x13\xb0\x68\x48\xb7\x3e\x9d\x7e\xbc\x47\xb6\x1c\xb9\x36\x57\xf4\xa5\xa8\xbb\x32\x66\x62\xaf\x7c\x5c\x5b\x70\x19\x78\x03\x68\x62\xa0\x83\xe3\xb8\x18\x58\x73\x26\x0d\x8f\xc2\x30\xca\x0d\x0a\xe6\x6d\x9d\xe8\x92\xe9\x73\x04\x94\x2c\xd1\xb1\xfb\x04\x54\x3d\x88\xf2\x34\xf4\x59\x18\x47\x92\x17\xea\x0e\x2e\x7e\x2d\x0f\x76\xf9\x4f\x2a\x42\x8c\x06\xc7\x3d\xc3\xe2\x69\x80\x47\x6e\x81\x1d\xb3\x7c\x80\xf9\xb5\x78\xda\x05\x53\x9b\xb0\x67\x3c\xad\x9c\x06\x5d\xb6\x44\x0c\x46\xb6\xe1\x28\xa2\x8c\x37\x1d\x27\xa9\x72\xb6\x39\x3e\x86\x7b\xeb\x90\x7a\xfe\xfa\x71\x0f\x56\x6c\x12\xa0\x86\xc1\x30\xb1\x86\xbc\xfc\xb8\x50\xf7\x5f\x0a\xda\x48\x16\xc0\x31\x8f\x08\xf1\x98\xa9\xde\x3f\x2c\xd4\xec\x1f\xb6\x03\xee\x18\xf8\xed\x96\xf6\x53\x36\xc2\x5c\x03\xe7\xf8\xb8\xdd\x63\x3f\xc7\xf9\x6a\x98\x47\xfd\xb8\x60\x64\x5b\x78\xbb\x24\xf6\x74\xc9\xe3\x90\x9b\xc9\x9f\x3b\x76\x36\x7b\xb1\x80\xd3\x7c\x22\x6f\xf8\xd5\x96\xa6\x32\x87\xca\x7a\xf8\xf5\xb6\x52\x7b\x76\x8d\xbf\x8a\x6e\x61\x4c\x8e\x1b\x4a\xf0\xc1\xd5\xe0\x95\x2e\x2e\x4d\xc9\xf3\xf8\x4e\x81\x12\x62\x41\x72\xb2\xad\xba\xb6\xe8\x49\x53\x2a\x87\x4f\x97\x14\x47\x93\x89\x1c\x30\x69\x77\xa1\x46\x90\x62\xc4\xcb\x60\xf4\x3a\xe7\x63\x66\x52\x60\x79\x25\x53\x19\x54\xe0\x19\xd1\xbb\x35\xb5\xe3\x3d\x48\x99\x69\xb7\x16\x20\xbe\x99\xf3\x37\x6d\x8c\x71\x9c\xfe\x43\x9c\x4d\x9f\x97\x44\x28\x3f\xcf\x66\xfa\x26\xd5\x64\x3c\x1b\x06\xe2\x13\x67\xa3\xd1\xcf\x00\x34\xc6\x89\x05\x00\x35\x33\x0f\x55\x00\x62\xe0\x78\xb1\xa7\x43\xdf\xc5\xd6\x34\xd1\x47\xda\xb2\xe7\x93\xd0\x4b\x4b\x91\xd5\x25\x3d\x91\x53\xa7\x09\x9c\x8f\x43\xf4\x68\x82\x5a\x59\xcc\x72\xd6\x0e\xb1\x85\xf1\x07\x8e\x46\x43\xec\x70\x22\x0e\x72\x42\x96\x1c\xa5\x09\x50\x43\x1d\x94\x06\x40\xe4\xa8\xd1\x06\x20\xe3\xde\x04\x2a\xaa\xae\xc6\xcc\x73\xb3\xd9\xf2\x10\xf2\x80\xa0\x79\x24\xd3\x96\x05\x55\x4a\xd6\x19\x21\x31\x85\xaa\x8e\xe1\x2d\x6b\xe2\x4c\x48\xba\x38\xe5\x80\xe4\xcb\x85\xfa\x6b\x24\x03\xe6\x0d\x16\x72\x49\x02\x09\x44\xe1\xb8\x33\xb0\x2d\xad\xda\x33\xfa\x9f\x49\xb3\x63\xaf\x4d\x4d\x8c\xd9\x8f\x13\x3e\xe1\xa0\xd3\x28\xcd\xb3\xca\xf5\xce\x04\x16\xfe\xce\x6d\x6b\x08\x19\xb1\x5a\x99\x3a\xd6\x48\x24\x63\x4a\xd8\x68\xec\x4c\x7a\xd7\x77\x98\x2c\xf9\xf9\x29\x6d\x22\xdd\x6c\x15\xbb\xa4\x58\x5b\x64\x62\x82\x18\xa0\x20\x9a\xce\xdc\x2a\x0f\x7e\xa5\xd1\x5e\x1b\xa8\xd6\x28\x5a\x5b\x00\xdd\x21\x9e\x9a\x1d\xd3\x0d\x61\x21\x6a\x2d\xfd\x04\x11\xdb\x15\x81\xf1\x55\x6b\x9c\x18\xa2\x6a\xd4\x45\x01\xa1\x65\x79\x15\x33\x2c\xa6\x56\x0d\xfb\x85\xb3\x9e\x11\x88\x41\x7b\x00\x56\xdc\x00\x9e\xdb\xd4\x22\x3f\xaf\x03\x09\xd8\x2a\xda\x91\xcc\x64\xe2\x2e\x52\x35\xb5\xab\xb0\x46\x1f\x31\xda\x4b\x34\x31\xfa\xb1\xcf\x50\x65\x59\xff\xa2\x6e\xb1\x63\xde\x98\xad\x68\x83\x06\x7b\x01\x72\xc4\x82\x14\x44\x04\x91\x46\xce\xf2\x9e\xcb\xf3\x27\xc9\x9f\xc8\x10\x91\x9a\x3c\xc3\x42\xd2\x86\x93\x25\xfc\x21\xa3\x9a\x55\x14\x0f\xb7\x9e\x4e\x27\x72\x6e\x21\xb8\xbe\x2d\xa0\x37\x36\x3c\x44\xa6\x47\x8b\x73\x63\x36\x48\xd0\x4f\xc7\x9e\xb8\x0d\xc0\xe6\xab\xc5\x78\x16\xf8\x53\x0c\x3f\x9e\x3d\xe7\x41\x92\xa0\x11\xc0\x24\x3c\x45\x56\xc4\x84\x37\x67\x1e\x61\x5e\xdf\x12\x08\x01\x79\x67\x64\x60\xfe\xe2\xea\x02\xdf\x73\x0e\xee\xfd\x9e\xea\x83\x3e\x53\xf0\x27\x68\xf1\x23\x51\xd0\x44\xc1\x22\x4c\xc7\x64\x81\x08\x89\xef\x37\x04\xc4\xa1\x13\x79\x9a\x96\xb4\xec\x56\x72\xe5\x11\xcc\x4f\x98\xdf\xc4\xd1\x21\x2a\x0a\x0e\x4a\x89\xff\x7b\x60\x1c\xcb\x9a\xff\x23\x34\x26\x5a\xf1\xfb\xc0\x51\xdc\xe0\xa6\x7a\xac\x85\xc4\x4f\x5c\x3e\xd1\x6e\x7b\x2f\x46\xe3\x65\x37\x66\x03\xc2\xbb\x93\xbc\xd3\x17\x2a\xba\x5c\xff\x90\x1c\x3c\x5d\x3f\x28\xa6\x21\xea\xc6\x46\xf5\x02\x67\x92\xc9\x39\x0f\xcc\x1d\x81\x02\x78\x70\xc6\xf1\x4c\x2d\xf6\x96\xc6\x31\xb4\x92\xda\xe9\xf8\x62\x26\x24\x4d\xa3\x8b\xf0\xd3\xa2\x2d\x6f\xd4\x2f\x56\x65\x03\x22\xaf\xfd\xf3\x9b\x24\x3f\xe4\x9b\x4b\x3a\x3a\x9b\x3d\x43\x8f\x8c\x67\x6f\x7f\x45\xbc\xac\x43\x19\x18\x3a\x4e\x04\xdf\x99\x20\x03\x08\x7f\xc5\xed\x79\x0f\x4a\x39\xe2\x0b\xc1\x7c\x94\x06\xa4\x26\xd6\x4d\x89\x9e\xe4\xcb\xc9\x54\x33\xf6\xc8\x98\x0a\x87\x43\xeb\xe5\x02\x9a\x8d\xa6\xbb\x4f\xbe\x67\x22\xfe\x53\x73\x36\xba\x6d\x59\x0a\x6e\xa8\x88\xcb\x32\x7d\xf7\xd3\xb4\x2e\x8c\x81\x62\x90\x77\xa7\xd2\xca\x22\xf5\x46\x7d\xe2\x4e\x38\xe4\xc3\xaf\x35\xf7\x43\x9d\x90\xd3\x10\xbf\x6c\x18\xdf\x88\xbd\xfe\x32\x76\x7c\xfb\xba\x3d\x58\x38\x6c\x41\x85\xb8\xf6\x92\xcd\x6b\x56\x4d\x2c\xe0\xf0\x6f\xd7\x21\x1e\xd3\xd0\x69\x49\x09\xd2\x70\x98\xbe\xac\xe1\x81\xd7\x76\xb8\x79\x70\x0d\x7e\xe0\xe6\x68\x36\x5d\xe0\x34\x88\x10\x8f\xc5\xbb\x46\xb7\xee\x32\xd1\xc3\x39\xc5\xbf\xea\xfd\xd7\xab\x11\xcf\xec\x67\xfc\x70\x8f\xfd\x8d\xb4\x7e\x30\x1c\x51\x16\xee\xe4\xf2\x43\x37\xea\x7d\x1c\xe2\xd0\x2a\x3e\x60\xa2\x46\x0c\xbc\x6d\x19\x65\xd9\x1d\xc2\xb6\xf0\x25\x91\xe2\xce\x76\x75\x99\x5f\xd2\x59\x77\xfd\xab\x33\x2e\xce\xf5\xa4\x0a\x22\xad\x9a\x83\xa1\xf1\x45\xe0\xa8\xe0\x31\x11\x72\x4e\xea\x57\xfa\x12\x38\x7d\x12\xda\x91\x31\xd6\x13\xc4\x7a\x40\xa2\xb7\xf8\x4e\xdc\x17\x23\x91\x66\xe8\x42\xda\xc6\xec\x95\x5f\xde\xfb\x0e\x49\xd7\xf7\xd8\x23\x3d\x9b\x7c\x77\x9b\x2c\xd4\x75\xba\x8c\xc8\xcb\x48\xbc\x54\xbd\x2a\x9f\xc7\xee\x3c\x97\x7a\xd5\x74\x3e\xb0\xec\xc9\x58\xfc\x22\xcf\x70\xf0\x97\x29\x64\xa1\x4e\xf9\xf1\x63\x54\x40\x72\x5c\x5f\xbe\x8b\x8e\xfd\x8f\x1a\xfa\x66\x36\xfb\x6d\xa6\x3e\x86\x3b\x6a\xa6\x40\x30\x61\x10\x68\xdf\xde\xe9\xca\x60\x28\x71\x1e\x8f\xc4\xf4\x22\x73\xea\xe9\x48\xf1\x03\x82\x38\x69\x7a\x36\xe5\x07\xa0\xfa\x60\xb0\x97\x28\xb1\xbc\xf1\x7a\x76\xe9\x30\x56\x2e\x59\x8e\x93\x50\x4d\x5f\x9c\x19\xce\xf3\xfe\x0d\x74\x10\xdc\x3a\xbd\x19\x65\xc4\x75\x49\x77\xa7\x3e\xbc\x2c\x58\xc7\xc3\xff\xc8\xfe\x89\xf9\xef\x21\xc2\xcf\xe7\x6e\x0e\x97\x06\x2b\x71\x37\x6c\x9f\xcb\xd0\x3c\xc5\x47\xe5\xd7\x86\x5f\x94\x2a\x17\x54\xd4\x49\xf7\xe3\x84\x1b\x6e\x80\xd9\x4b\xdc\x69\xdf\x23\x2d\x00\x3c\xb1\xb3\x77\xfc\xd0\xcb\xb4\x51\x99\x34\x79\x87\x2e\xe3\xaf\xb3\x48\xfb\xfb\xd7\x28\x41\xf0\xf9\xa7\x85\xfa\x40\x5b\xe3\xb3\x17\x87\x27\x3f\x09\xa7\x6b\xde\xb9\x1f\x00\x22\xce\x79\x87\x5f\xb3\x7c\x95\x43\xd2\xbb\x52\x4b\xbb\x9e\x69\x9e\x7e\x5e\x7a\x1b\xe2\x89\xc5\xd4\x8a\xff\x2f\xd4\x23\xe3\x6e\x64\x4d\xe6\x0f\x3f\x63\xe0\x8a\xc6\x2f\x90\x68\x0f\xbf\x31\xce\x84\x9e\x8f\xfb\x79\x96\x76\xc4\xc1\xc0\xbe\x82\x01\xa1\xbe\x78\x43\x49\x90\xe3\xb5\xbc\x92\x94\x25\x96\x7b\x39\x02\x75\xc5\x18\xe2\xd2\x0b\x03\x14\xe4\xe4\xd1\xfd\x9e\xe5\x71\x4f\x9b\x28\xe0\x0a\x18\xe0\x96\xe4\x1f\x31\x50\x85\x0e\xe1\x73\x31\xfa\x15\xb8\x2f\x2e\xc9\x09\x81\x8d\xa6\xad\x97\x66\x00\x6f\x13\xf6\xb3\x3a\x1e\xf8\xa8\xef\x53\x85\x13\xf9\x9a\x90\x4c\x1c\x93\xf5\xd7\x33\x78\xc5\xa2\x17\x78\xe7\xeb\xe4\xf0\x38\x7b\x15\x5f\x02\x48\x9e\x85\x58\x6a\xb1\x23\x6b\xbd\x8d\xe4\x99\xd8\x15\x47\x0c\x9d\xa9\xce\xfe\x0c\x42\x46\x1a\x49\xfc\x61\x64\xc7\xea\xe7\x9e\xba\xf8\x0a\x30\x71\x21\x5b\x99\xde\xab\xcf\xa1\xea\x29\x89\x3b\xbc\xd5\x48\x06\xf9\xa2\x37\xce\xfe\x37\xfc\xea\x31\xbc\x4a\xad\x2d\xbf\xcc\xb0\xe7\xdf\x9c\xf5\xf8\xce\xf3\xe4\x08\x67\xb3\xef\xc0\x06\xc0\xf9\x05\x5e\x6a\x06\x6f\xc1\x63\x01\xdc\x20\xb5\xa8\x3a\x79\x81\xf8\xf6\x6e\x83\x04\x45\x27\xcd\x18\x1b\xfb\x79\xaa\x27\x1f\xf2\x83\x8f\xb1\x14\x0a\x53\x35\xc8\x6f\x58\x52\xd3\x82\x5f\x59\x35\xdf\x5d\x52\x85\xb3\x9e\x60\x11\xaf\x85\x12\x75\x17\xd6\xd6\x99\x7f\x47\x8a\xe0\x61\xca\xa1\xf1\x8f\x7f\x31\xc1\x72\x4e\xbf\x73\x72\x81\x5a\xcc\xfe\x13\x00\x00\xff\xff\xab\x58\xaa\xf3\xbb\x1c\x00\x00") - -func confLicenseGnuLesserGeneralPublicLicenseV30Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuLesserGeneralPublicLicenseV30, - "conf/license/GNU Lesser General Public License v3.0", - ) -} - -func confLicenseGnuLesserGeneralPublicLicenseV30() (*asset, error) { - bytes, err := confLicenseGnuLesserGeneralPublicLicenseV30Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU Lesser General Public License v3.0", size: 7355, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseGnuLibraryGeneralPublicLicenseV20 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xa4\x7d\x69\x73\x1b\xc9\x91\xf6\x77\xfe\x8a\x7a\xf9\x45\x64\x04\xc4\x19\xc9\xf6\xbc\xeb\xd1\x27\x90\x04\x25\xd8\x14\x49\x83\xa4\x64\xc5\xc6\x46\x6c\x03\x28\x00\x6d\x35\xba\x31\x7d\x10\x83\xfd\xf5\x9b\x4f\x66\xd6\xd5\x00\x29\x7a\x36\x62\xd7\x16\xd1\xdd\x75\xe4\xf9\xe4\x51\xe5\x8f\x37\x8f\xe6\x7a\x7c\x3e\x19\x4e\xbe\x99\x8f\xa3\x9b\xd1\x64\x78\x6d\xee\x1e\xcf\xaf\xc7\x17\xf4\xf3\xc5\xe8\xe6\x7e\x74\xf4\xc5\xd6\x4d\x5e\x95\xe6\xfd\xc0\xfc\xad\x2b\xad\x79\xf7\xd7\xbf\xbe\x3b\x3a\xba\xa8\x36\xbb\x3a\x5f\xae\x5a\x73\x72\x71\xca\xbf\x99\xab\xda\x5a\x73\x5f\x2d\xda\x6d\x56\x5b\x73\x55\x75\xe5\x3c\x6b\xe9\xcb\x81\x19\x97\xb3\x33\x73\xf4\x17\xbc\x92\x95\xdf\x8b\xbc\x34\xf7\xed\xc0\x5c\xe5\x8b\x76\x65\xae\x8a\xaa\xaa\x07\xe6\xbc\x6a\x5a\xbc\xfa\x79\x68\x7e\x7e\xff\xee\xdd\xcf\x6f\xdf\xfd\xe9\xe7\x77\x03\xf3\x78\x3f\x3c\x3a\x1a\x3d\xd9\x7a\x57\xd1\xd4\x79\x63\x36\xb6\x5e\xe7\x6d\x6b\xe7\xa6\xad\xcc\x8c\x16\x61\xb2\x72\x6e\xe6\x79\xd3\xd6\xf9\xb4\x6b\xad\xa1\x77\xa7\x34\xed\x1a\x0f\x73\xdb\x98\x6a\x61\xda\x15\x7d\x58\xe4\x33\x5b\x36\xd6\xcc\xab\x59\xb7\xb6\x25\xcd\x4f\xaf\x9b\xd9\x2a\x2b\x97\x79\xb9\x34\x79\x8b\xd1\xcb\xaa\x35\x59\x51\x54\x5b\x3b\x3f\x3b\x3a\xfa\xcf\x07\x7c\x48\xff\xd7\xae\xac\x59\xe4\x75\xd3\x9a\xda\x16\x36\x6b\x68\xf6\x27\xa5\x0a\x0f\x6f\x69\xf4\x69\x9d\xd5\x3b\xf3\xf1\xee\xfa\xcc\x8c\x65\xac\x6e\x3d\xb5\x35\xbd\xfa\xde\x4c\xed\x2c\xeb\x68\x6e\x9a\x64\x59\xd1\x9a\xb6\x39\x6d\xdc\x8d\xf0\xde\x8d\x51\xd5\xf3\xbc\x74\x83\xfc\xd7\xd1\xd1\x5d\x6d\xb3\xf5\xb4\xb0\x47\x47\x0f\x3c\x03\xaf\xbf\x31\x8b\xaa\x36\x6b\xa2\x96\x69\x1c\xa9\xf1\xff\x73\xdb\xe4\xcb\x52\xc8\xd2\x66\xdf\xe9\xc7\x6d\xb6\x33\xbb\xaa\xab\xcd\x82\xf8\x32\xaf\xd6\x78\xd2\xac\xf8\x7d\xa2\x18\x6f\x1c\x2b\x3a\x33\xe7\x3b\xa2\x55\xd9\xd6\x59\x43\x44\xc1\x42\x20\x14\x1f\x6d\x69\xeb\xac\x30\x77\xdd\x94\x66\x36\xd7\x6e\x76\x7c\x9f\x97\xad\x2d\xe7\x32\xd7\xb2\xcb\x88\xa7\x2d\x71\xfe\x87\x73\xe1\x99\x5f\xf4\xdb\xb7\xf4\xca\x1a\x0b\x6d\x3a\x7a\x0d\xd3\xfa\xfd\x10\xf1\xf8\x5d\xec\x94\xb8\x41\x8b\x6c\x0c\x91\xaf\x6e\xce\x40\x8a\xc0\x4b\x59\xed\xb5\x23\xfd\xc1\x15\x0f\x4c\xb6\xd9\x14\x10\x04\x2c\xa9\x5a\xd3\x34\x1b\x3b\xcb\x69\xd8\x9d\xd2\x2c\x83\x30\x3d\x27\xbb\x7e\x51\x03\xde\x09\x8d\x91\x95\x3b\x53\xd1\xbc\xb5\xf2\x1c\x43\x6f\x57\x15\x71\x37\xeb\xda\x55\x55\x37\x34\xec\x2c\x9f\x5b\xbc\x2b\x3c\x3f\x33\xdf\xaa\xce\xcc\xb2\x52\xff\xe6\x7d\x31\xb5\xfc\x08\xb4\x93\xaa\xa2\xdd\x7d\x5d\xd9\xd2\x6c\x79\x8d\xd9\x77\xc8\x45\x42\xb3\x01\x1e\x61\x7d\xb5\x5d\xd8\xba\x86\xd8\xd2\x24\x4a\xf2\x01\x0b\xef\xa6\xa6\x6d\x9f\x99\x5b\x1a\xfc\x25\x0e\xc6\xd2\x12\x33\x21\x6b\xb1\x30\xb3\xca\x9e\x84\x25\x11\x3b\x23\x15\x0b\x9a\x95\x2c\xcf\x9c\x28\xb3\xeb\xa5\xf0\x8e\xf5\x8e\xf8\xf6\x44\x53\x9b\x7c\xc1\x43\x6f\xf3\x66\x75\x3a\x08\x53\xd5\x76\x66\xf3\x27\x0c\xd2\xd5\x33\x0c\x3d\x87\x22\x30\xb5\x96\xb6\x65\xb5\xd4\x0f\x49\xca\xe8\xcf\xe8\x53\xbc\xa3\xa2\x95\x88\x0f\x7d\x0e\x42\xd3\x1a\x67\xb2\x4a\x0c\x52\x9a\xd2\x6e\x65\xbd\x9b\xba\x5a\xd6\xd9\xba\xf9\x20\x2c\x75\xc3\x7d\x2f\xab\xad\x1f\x77\x5e\x61\xcc\x06\x23\x13\x99\x59\xf0\x2a\x7c\xd8\xda\x59\x2b\xbc\x63\xe3\xd7\x30\x4b\x4a\x1b\x51\xb2\xb6\xa0\xd3\x0c\xc2\xd3\xc8\xe0\x44\x8a\x69\x3e\x87\xe0\xc0\x86\x81\x94\xb6\x64\xd5\xd4\x29\x64\x24\x2c\x1b\xe2\xd5\x7c\x97\x47\x15\x78\x52\x43\xcf\x6a\xde\x9e\xbc\x75\x66\x1e\xe4\x9b\x64\x16\xd2\xc0\xa6\x20\x39\x66\x9b\x68\xeb\x36\xa3\xed\xd2\x1b\x1b\x7a\x98\x4f\xf3\x22\x6f\x73\xb5\x1b\x18\x59\xe9\x79\x90\x9f\x91\x29\x1b\x60\x41\xfa\xee\xba\x9a\xe7\x8b\x1d\x44\xf9\xe8\xe8\x8a\x7e\xb6\xbf\x67\xeb\x4d\x41\xf2\xf8\xea\xb1\xb6\x2b\xcb\x3a\x43\x84\x6f\x73\xde\x2b\x2b\xb7\x59\x58\x1a\x85\xa7\xe8\xc8\xa2\x2d\x73\x95\x3b\x92\x8a\x9c\xc6\x29\x89\x2c\x30\x00\x61\xff\x42\x51\xa2\xf9\x12\x22\x4a\x1f\x8a\x72\xf1\xd7\x3d\x41\xa6\x8f\x76\xac\x57\x03\x2f\x64\x91\x60\x89\xc4\x78\x99\x23\xa3\x2d\x5b\x21\xe7\xf4\x9d\xd6\xa5\x32\x22\x96\x3a\xd9\x89\x5f\x2c\xbd\xf2\x04\x3d\x9f\x55\xa0\x05\x6d\xbd\x9a\xfe\x0b\xd2\xb1\xc8\x0b\xb1\x36\xbd\x8d\x34\x55\x58\x17\x2f\x83\x7c\x09\x26\xa3\xbf\x0f\xcd\x93\x2d\x5a\xa2\x17\xed\x09\x6a\x2e\x62\xee\x47\x75\xde\x06\xf2\x4b\x33\xd0\x02\x88\xc9\xec\xc4\xce\xcc\x90\x7e\xf3\x6b\x6c\x56\x24\xd3\x3c\x81\x4a\x33\x79\x4f\x5d\x09\x2d\x82\x25\x9e\xfe\x95\x3b\x69\x26\xf6\xc2\x72\xac\x89\x57\xd5\x1c\x3c\x54\x89\xc7\xd8\x91\xd0\x93\x7d\xa0\xa5\x6c\x49\x42\x5b\xbb\x69\x7e\x35\x27\xef\x4e\xd9\x15\x0b\x1e\x48\x77\x41\xab\x39\x79\x7f\x4a\x63\x91\xc5\x52\x99\x8f\x9c\xf1\x76\x95\xcf\x56\xcc\xf6\x46\xa8\x6f\x97\x64\xb1\xd8\xc7\x37\xec\x1c\xd5\xc9\x0f\x62\x11\xa3\x31\x7f\x62\x1f\xc8\x42\x19\x4d\x47\xcb\x1f\x16\x0d\xf1\x1b\xb2\x65\x33\x1a\xd9\x7f\x55\xd5\x6f\x1a\xbf\x1b\xe0\x0c\x12\x21\xb6\x28\x4e\x6d\x9d\xda\x30\x8b\xac\x03\x1c\x1d\xd4\xaf\x69\x69\xc6\xc6\x33\x4f\x1c\x54\x59\xd1\xf7\x35\x5c\xdf\x2e\xd8\x3a\x36\x2f\x6e\x31\x90\xa8\x98\x59\xf4\x9c\x97\x9c\x93\xb1\x98\xee\xd8\x17\x61\x0a\x5b\x34\xe2\x25\x37\x59\x03\x60\x11\x2f\x0e\x8e\x2f\x92\x20\x5a\xab\xb2\x0c\x3a\xe0\x65\x89\xad\xb5\x82\x17\xc1\x11\x39\x41\x1a\xa2\xa3\x22\x8c\x81\x17\x3d\xf8\x2e\x22\x02\x61\x0a\x92\x02\xf2\xe2\x75\x35\xef\x66\xb2\x1c\x76\x69\x40\x26\xa4\x6e\x18\x88\x5c\x4c\x01\x69\x06\x0f\xe2\x31\xd5\xc9\xbd\xa1\x17\x36\x5d\xcb\x3e\x12\x62\x73\x85\x87\x05\x33\x7c\x97\x58\x59\x81\x4f\x84\x64\x08\x32\xd0\x4c\x04\x34\x40\xce\x96\xbc\x2f\xd3\x40\x4d\xf6\x06\x8f\x61\xdd\xbe\x5a\xf6\x10\x6c\x09\x9f\xaa\x7c\xce\x93\xcf\x21\xfc\xb5\x6c\x01\xc2\x9e\x95\x30\x31\x9e\xb7\x90\xce\xd4\x11\xf1\x2e\xf2\x72\x9e\x93\x82\x76\xec\xea\xab\x29\x73\x57\xe6\xf1\x58\x0a\xce\xa4\x03\x25\x8c\x25\xf9\xa4\xdd\xb2\x25\x25\x76\xae\xd9\xb7\xae\xa2\x5d\x94\x2d\xdb\x7f\xf2\xaf\xb6\x05\x37\xdd\x5c\x64\x90\xf1\x80\x24\x06\xc2\x44\x42\xc0\xdc\x63\x96\xac\xb3\x39\xbb\xfb\x19\x41\xc6\x3a\x62\x80\xac\x81\xf5\x73\xea\x71\xdd\x5c\x84\x56\x05\xef\x8d\xca\x12\xfc\x18\xfd\x0c\x86\xf8\xf7\x32\x86\xa8\x44\xf3\xcf\x00\x81\xc0\x6a\x01\x1f\xe4\xe5\xac\xe8\xe6\x58\x3c\x43\x9d\x08\x5f\x10\x1b\x66\xd5\x13\xe3\xd1\xe9\xae\x07\x37\x9f\x85\x7b\x03\x55\xd0\x6d\xd6\x04\xc8\x80\x75\x12\xd1\xc9\xab\xec\xbc\x2b\x85\x5b\xea\xe3\x32\x0e\x2d\x5e\x8f\xcd\x9c\x02\x46\xa0\xcc\x2f\x3f\x1d\x1e\x7b\xf9\xad\xcb\xc9\x12\x90\x36\x91\x59\x01\x35\x17\x75\xb5\x4e\x77\x45\x54\xfc\x00\xfa\x8a\x43\xa8\x48\x5e\xb3\xb9\x22\x81\x45\x57\x14\x62\x9a\xe6\x55\xf9\x86\xc8\xd9\x34\x14\x12\x78\x0e\xb1\xcb\xc7\x7b\x12\x13\xb0\xa7\xc8\xe8\x79\xc6\x92\x92\x4c\xa2\x2b\x3a\x13\x88\x4e\x53\x34\x55\xe9\xf9\x9f\x11\xf6\xd9\x10\x3a\xa6\x85\x6e\x64\xdf\x6e\x03\x20\x61\xca\x20\x99\xc8\x69\xf4\xb4\xe8\xc4\xe9\x43\xc6\x89\xa7\x8c\x44\xb7\x10\x07\x91\x66\xb6\x58\x53\xdb\x6e\x2d\xc1\x45\xb1\x83\x58\x32\x3c\xea\x7c\xae\xb0\x30\xf8\x30\x6c\xb4\xc9\xc9\x49\xed\x68\x00\xe7\x26\xae\xc9\xf5\xe0\xdf\x3d\x57\x97\x45\x2e\x9b\xfe\xae\xe2\x10\x29\x31\xec\x39\x13\x43\x00\x35\xef\x29\x99\x61\xcf\x07\xd0\xeb\x19\x59\x88\x6a\x59\x75\xcc\xed\xba\x2b\x4b\x99\xbe\x27\x4a\xbc\x09\x48\xc5\x4c\xf0\xb7\xfe\x7c\x66\x3e\x51\x50\x46\xf2\x0b\x19\xa7\xaf\x5a\xfb\x7b\xdb\xc1\x1c\xd1\xd8\xe2\x34\x9a\x20\x79\x70\xab\x24\x3e\xf6\x77\x3b\x23\x13\x45\xd6\x8e\xa7\x87\xe9\x98\xe6\x90\xe0\x6d\x55\x7f\xa7\x65\x91\xa8\xd5\xf9\x13\x4d\x03\x64\xb0\x48\xcd\x5c\xb2\xf8\x54\x5b\x0e\x8a\x32\x59\x0e\x32\x71\x0d\x44\x86\xc4\xa4\xe9\x66\x2b\x92\x89\x73\x0d\xfb\x5c\x08\x0a\xb6\x42\x01\x23\xae\x0e\x22\x82\xfd\x68\x0a\x48\x4d\x10\x98\x39\x19\x47\xd8\x05\xb1\x5c\xb4\x87\x82\x69\xb8\x26\x17\x17\x0c\x21\x62\x30\x1a\x7e\xe0\x23\x50\x0e\x1c\xe7\x44\xc8\xa2\xda\xc0\xde\xbb\x51\xba\xc6\x46\x4c\x63\x95\xfb\x0a\x68\xc3\xf6\xc4\xce\x1d\xec\x22\xb9\xab\xf1\xeb\x3c\x17\xe4\xb9\x66\x8f\xef\xa7\x95\xd9\x20\x99\x04\x34\x88\x00\x9e\x67\x5d\xe9\x00\x2b\xab\xb5\x88\x1e\x91\xa5\xac\xca\xb7\x09\x26\x27\xde\x74\x05\x51\xc8\x92\xa1\x55\x2c\xc8\x91\x9f\xd0\x10\x51\x96\x7f\x93\x7e\x01\x36\x9c\x12\xb1\x16\x79\x64\x01\xc4\x15\x90\x6b\xea\x7a\x30\x94\x0d\x0d\x61\xa1\xc6\x16\x4f\xde\xa6\xbc\x6c\xa1\x44\xcc\x43\xb4\x2b\xd9\x87\x98\x80\x07\x37\xa1\xa1\x5f\x04\x07\xd8\x06\x93\x31\x2d\xf0\x96\xe5\x98\xc8\x61\x2a\x17\x63\x65\x90\x51\x6c\x16\x63\x42\x82\x92\xf1\xa2\x40\x27\x1d\x56\xcd\x16\x87\xe5\xb3\xaa\xde\x54\x35\xdb\x4e\xb1\x54\xa4\x37\x27\x5f\xd5\x1c\x81\xcd\x0d\x0c\x06\x63\x42\x32\x10\xb3\x55\x6e\x99\xc6\xd0\x0e\x00\x8d\x65\x56\x13\xce\x71\x58\x93\x46\x58\x91\xcd\xa4\xf5\x30\xa2\x95\x7c\x89\xb7\x6d\xf2\xf1\x5c\x05\xfe\xc0\xb7\x58\x69\x36\x63\x25\x5d\x74\xa5\x46\x2a\xca\x0f\x25\xfa\xd9\x29\xa2\x19\x5a\xcf\xc6\x46\xf6\x2f\x57\x14\x52\xc0\x60\x23\xbe\xcd\x1a\x20\x61\xa5\x39\x52\x37\x3e\xf2\x0c\xd2\x2a\x06\x78\x03\xb0\xe4\x61\x2e\x47\xa3\x41\x56\xa1\x3e\xc0\x92\xac\x0f\x01\x3c\x90\x8d\xc1\x8b\x02\xcd\xd4\xe8\x2c\x2a\xe4\x80\xce\xcc\x5d\x46\x48\xbd\xe0\xd8\xbe\x85\xd3\x56\x44\x2a\x96\x59\x5c\xcf\x2c\x18\xe2\xcc\x1c\xc3\xb2\x98\x69\x26\x38\x2e\xb6\x82\xc7\x3c\x89\x7b\x83\x77\xda\x35\x22\x8f\xfe\x15\x8e\xed\xb0\xcc\xb5\x28\x19\xdc\x61\x23\x11\x31\x5b\x2a\xf8\x5e\x27\xe4\x51\x60\x05\x99\xe2\x9f\xb0\x46\x12\x9e\x92\x0c\x01\x66\x81\xd8\x2c\x25\xea\xea\x47\x17\x44\xae\x1b\x28\x2c\xaf\x43\xbc\xdc\xa6\x22\xc0\x0d\x53\x29\x71\x99\x03\xad\xb4\xdb\xa9\x7d\x1e\x39\x1c\x56\x1a\x92\xc0\x95\xe0\xb5\x52\x3e\x41\x1a\x40\xb2\x2e\x70\xcb\x60\xd6\x68\xf2\xf9\xde\x0c\x6f\x2e\xcd\xc5\xed\xcd\xe5\xf8\x61\x7c\x7b\x73\x6f\xae\x6e\x27\xf4\xe7\xdd\xb7\xf1\xcd\xc7\x81\xb9\x1c\xdf\x3f\x4c\xc6\xe7\x8f\x78\xc4\x2f\x7e\xbe\xbd\x1c\x5f\x8d\x2f\x86\xf8\xe1\xe8\xe8\x67\xaf\xbe\x32\xe5\x70\x49\xf2\xc0\xb2\x11\x41\x0a\xa0\x2d\x6f\x0a\xdd\x8e\x04\xd1\x78\xf2\x66\xd0\x0b\xe4\x27\x36\x45\x36\x0b\x5b\x0c\xe1\xcc\xaa\x2a\xa0\x03\x44\x15\xc9\xfa\x08\x00\xce\xff\xc7\x02\xb1\xd7\xe4\xb8\x9a\x6c\xa7\x09\xc4\x35\x89\xcb\xd4\x46\xa1\xca\x5c\x02\x08\x1e\x51\x64\xd2\xb9\x82\x1f\x98\x9d\x93\x8c\xe2\x18\x0a\x12\x8b\x82\xc6\x38\x6e\xa3\x9d\x1e\x9f\x9e\x99\x11\x42\x1b\xc5\x12\xe2\xdb\xe6\x73\x32\x2a\x0c\x0e\x1b\x73\x4c\x56\xe5\x18\xa1\x90\x39\xf6\xc2\xb7\xb6\x59\x29\x2e\xb0\x28\x24\x02\x62\x23\xe3\x68\x13\x14\x54\x63\xab\x79\xd6\x02\x18\x00\xbe\xd0\xa0\x0d\xd2\x12\x5e\x14\x4a\x82\xba\x88\x47\x8a\x9d\x73\xb4\x82\x1c\xf6\x9d\x76\x63\x4e\x84\xda\x30\x86\x0c\x15\xbc\x15\x4f\x66\xe4\xe9\x4e\x59\xd7\x49\xf8\x23\xbf\xed\xf4\xfa\x58\xc9\x75\x0c\x47\x46\x9a\x39\x90\x0c\x58\x60\x32\xac\xe5\x1e\xa7\x69\x1f\xac\x6d\xb2\x06\xc4\xac\x53\xa8\xe9\x41\xf6\x38\xa3\x41\xf1\xf3\x21\x2d\xbe\x4e\x09\x69\x73\x15\xf0\x90\x7d\x84\xd6\x94\xbb\x18\x52\xf0\x28\x32\x41\x90\xa6\x22\xdb\xfe\xaa\x6a\x27\x19\xc9\x0c\x18\x43\xde\x55\x99\x74\x70\x20\x1e\x99\xd4\xb3\x76\x5c\x43\x0e\x4c\x17\xe0\x73\xdd\x95\xea\x78\x6c\xc5\x3c\x33\x7d\x7a\x88\x38\x49\xff\xc6\x3a\x88\xce\x44\xaa\x39\xb1\x90\x03\x9b\xac\xd4\x8c\x26\x59\xef\x2e\x5b\x52\x50\x73\xf2\x89\x14\x9e\x94\x1c\x49\x88\x81\x1f\x01\x2b\x60\x8f\xa8\xa8\xc0\x41\xc4\x22\x27\xaf\xa8\x8f\x4b\x2f\xed\xe6\x38\x5e\xce\xf1\xd9\xe9\xd1\xd1\xf1\x7d\x48\xb9\x1c\xab\xa9\xe1\xbd\x0b\x5d\x25\xe2\xe2\xe4\xa6\x04\x1a\x6b\xe7\x31\xf8\x25\xce\x7c\x4b\x42\x24\xdd\x28\x6d\x01\x98\xf6\x2a\x36\x5d\x83\x90\x98\x89\x73\x8b\xaa\x09\x9a\x54\x8a\x9f\xb8\x6c\x33\x0d\xdd\x21\x83\x83\xc8\x4d\xad\xc4\x80\xac\x43\xd7\x30\x83\x29\x56\xa8\xc8\x90\x89\x8b\xa5\x5d\x2e\xc8\x6a\x10\xd7\x17\xc4\x37\x71\x1d\xe2\x2b\xf9\x7d\x9e\x61\x56\xe7\x1b\xc9\x5f\x6b\xc9\x02\x61\x77\x61\x24\x69\x93\x79\xff\x93\x23\x2e\x2e\xf4\x87\x34\x7b\x06\x5d\x06\xc2\x93\x34\x5e\x15\x6c\xeb\x2b\xbd\x19\x74\x02\xce\x3f\xb1\xe2\xc1\xa2\x7c\x90\x98\x83\x33\xa7\x5d\xdb\xe4\x1c\xb4\x92\xc1\xa6\xd1\xad\xb8\xa4\x6c\xc6\x2e\x37\x60\x76\x87\xd5\x03\x76\xbd\x0e\x49\x0e\xc9\x1e\x38\xb4\x27\x08\x9a\x06\xde\x74\x8a\xd1\x58\x59\xb3\x38\x3f\xe0\x16\xc6\xae\x2b\x5f\xf0\xf4\xa0\x13\x27\x3d\x38\x63\x90\xb7\x9c\xf8\x31\xcf\x6a\xa6\x39\xa1\x70\xdf\x6e\x00\xd4\x04\x1f\x28\x72\xec\x21\x0e\x0d\x1e\x2a\x62\x00\xd8\xbd\xad\xf3\x56\x6c\x37\x59\xd5\xaf\x9a\xa2\xf4\xda\x59\x77\xe0\x2c\xc6\x6c\x30\x9b\x4b\xb8\xf8\xb1\xe6\x28\xe5\x60\x77\xfe\x89\xdb\x53\xea\xdf\xe3\xf7\x89\x97\xef\x34\x65\x09\x6c\xf1\xda\xfa\x95\x1f\xe4\x4d\x73\x58\xac\xb3\x26\xc9\xa6\xc3\x46\x60\xab\x24\xb0\x6b\x3b\xcf\xbb\xf5\xc0\xa5\x2b\xa3\x84\x37\x28\xbb\xc9\x67\x1d\x85\x64\x85\x2c\x83\x6c\x38\xa7\x38\x48\xbc\x11\x4d\xc0\x27\x35\x2b\xec\x9d\x93\x69\xba\xda\xf8\xad\xc8\xb2\xa9\x1b\xd5\xdd\xcc\x8a\x2c\x5f\x0b\x94\x75\x69\xb2\x0f\xe6\xbb\xb5\x1b\x68\x0d\xe4\xc9\x69\xa0\x7c\xa6\xe0\x8f\x55\x5f\x10\x56\xe4\xdb\xb5\xf0\xc2\x80\x72\xda\x30\xe4\x02\xf6\xa7\xbd\x85\xa1\x7b\x44\xcc\x64\xb1\xc1\xdb\xea\x48\x45\x45\xdc\xf6\x68\xe8\xda\xeb\x97\x67\x88\x14\x2f\x38\x2f\xad\x69\x3d\xe2\xea\x6a\xd7\x90\x2e\x15\x4e\x0f\x24\x49\xa4\x05\x98\x4c\xf3\x93\x99\x4b\xbb\xd2\x28\x99\x96\x08\xaa\x8d\x6a\x33\x76\xe5\xb3\x85\x21\x0b\xc9\x89\xa7\xdf\x5d\x75\xcc\xe5\xc3\x69\x39\xef\x83\x88\x68\x96\x93\xc7\x93\x3d\xd5\x87\x25\xc3\x79\xa0\x9e\xa7\xe0\x04\x97\xcb\x68\xbd\xa0\x40\x03\x85\xcb\xfb\x02\xc9\xfa\x9a\xda\x5b\xe7\x59\x0f\xa0\x9b\x7b\xdd\xda\x3b\xe2\x15\xa9\xf5\x21\xb9\x63\x6c\xb3\xb6\x56\x84\x40\x76\xd1\xd8\x08\xaa\xff\x7a\x74\x94\x49\x68\xe0\x13\xa6\xe2\x24\x90\x32\x23\xe3\x60\x8b\x05\xa0\x48\xb6\xe7\xf2\x89\x74\xd3\xd3\x50\x10\x90\x90\x57\x8a\xb7\xb0\xe8\x7e\x34\xd8\x61\x62\x87\x04\xcc\x79\x09\x93\xe1\xe4\x10\x81\xa3\x18\x35\xa7\x25\xcc\x9e\x79\x34\x8c\x4b\x09\xcc\xa1\x00\x2a\x89\xf2\x16\xcd\x3f\x3b\x38\xff\x96\x50\xa4\x4d\x7c\x99\xa0\xa9\x38\xa9\x57\x56\x4e\xfc\xe0\x91\x59\x3d\xf2\x5a\x40\x26\xb8\xfd\x3c\x92\x74\x29\xa8\xf9\x29\x52\xce\x24\x43\xd9\x4c\x52\x2a\xea\x8b\xfd\xb6\x9d\xa4\x44\xe0\xc9\x03\x31\x81\x19\x92\x2d\xa1\xa1\x19\x00\xca\x1a\x9b\x8e\x11\x35\xfb\x0d\xd1\xfe\x3e\xce\xeb\xd9\x3b\x37\xff\x20\xf6\x55\x88\x6e\xe1\x8a\x96\x5c\x7c\x77\xc9\xee\x2d\xea\x9d\xf1\x37\x02\x2f\x9e\xaa\xef\xf0\x1c\x2d\x9e\xee\x92\xf2\x4e\x66\x96\x55\x45\xd0\x20\x83\x0e\xdb\x05\x09\x36\xa7\xf0\x89\x02\xae\xee\x33\x70\xdb\x96\x94\x6c\x6f\xc5\x6c\xb3\x39\x12\xc6\xae\x14\x39\xc6\x34\x60\x0a\x0c\xd2\x35\x91\xff\x81\xa0\x52\xbc\x4f\x1c\x6f\x44\x53\xe8\x0f\x68\x55\xc3\xc6\x1f\x49\x0e\x66\x94\x68\x1d\x45\x53\x1d\x05\xe2\x5c\xa6\x5b\x73\x94\x01\xd4\x41\x52\xb5\xe8\x90\xb7\x3d\x49\x4a\x68\x11\x0b\xd8\x39\x45\x91\x17\x2c\x3d\x6b\xe0\x6f\x1d\x57\x7d\xab\x4a\x6b\x2f\x99\x9f\xc0\x39\x2b\x04\xa7\x35\x8c\xf6\xd6\x16\xc5\x5b\xc6\x23\x8c\x50\xf6\x7c\x62\x44\x0c\x76\xee\x24\x0b\x15\x32\xc7\xf7\x1d\x99\x56\x59\xc6\x7b\x14\x95\x7e\xeb\x68\xbc\x26\x64\xad\xa3\xef\xde\x7a\x89\xd8\x23\x9c\xc0\x1c\x07\x30\xfc\x63\x97\xeb\x16\x83\x98\x15\xbf\xc2\xcb\xf7\x56\xb3\xc7\x9a\x5c\xbb\x11\xa2\xdd\xf7\x46\x14\xbe\x1c\xa2\x12\xb0\xa6\x2b\x94\xf2\x4e\xd6\x52\x4b\xe4\x81\xd5\x97\xa4\xb6\x85\xa9\xca\x6a\xca\x85\x9b\x1c\x34\xa3\xc7\xbc\x29\x25\x8c\xea\x1c\x12\x61\xfc\x85\xc2\xaa\xbd\xd8\x3c\xb5\xa8\x88\x81\x5d\x6a\x98\x46\xe3\x5e\x0b\x80\xac\xba\xc7\x1f\xce\xd2\xba\x7c\xb1\xc4\xef\x9a\xc3\x91\x7c\x95\xaa\x43\xac\xf3\x9a\x5a\x45\x65\x08\x26\x61\x80\xaa\x35\x77\xb0\x84\x6d\x42\x46\xfc\xf2\xb7\x4e\x9f\x22\xeb\xce\xc5\x41\xa4\x2c\x93\xa9\xcf\xcc\x39\x92\x3d\x87\xdf\x97\x6c\xb8\x1f\x95\x3e\x76\xa2\xaf\x14\xd4\x88\x8b\x93\xae\x2f\x38\x1c\x97\xe0\xf6\xc8\xd5\xd9\x47\x1e\xc3\xcb\x4c\xf9\xbc\xd1\x1b\x68\xe7\x45\x28\x18\x4a\x9a\xc7\xf5\x67\x48\x84\x4c\xda\xf1\x3b\x52\x78\x8e\xf1\xa2\x2b\x32\x8d\x4b\xf0\x4a\x56\x9a\x61\x0e\x7e\xe0\x3a\x8c\x6c\x4b\x52\x5b\x64\xf7\x79\x76\xfa\x88\x50\x23\x72\x27\x5c\x0c\x7f\xa0\x0f\x07\x51\xef\x10\x86\xe7\x7c\x61\xeb\x97\xea\xb4\x0a\xfa\x0c\x50\x14\x95\xfb\x19\xe3\x36\x49\x3f\x01\x5e\x93\xa0\xb5\x46\x97\x53\x19\x14\x7b\xca\x20\xe0\x83\x26\x57\x06\xf1\x54\x12\x4a\x52\xd8\x5c\x4b\xf6\xcb\x55\xcb\xe3\x78\xe3\x10\xb1\xe3\xfc\x77\xed\x73\x03\x4f\x4e\xfc\x0e\x71\x8d\xf6\x3c\x2e\xb9\xca\x20\xd9\xeb\x35\xca\xa1\xd9\x72\x09\x2a\xb9\x61\x5d\x34\xc9\xfb\x00\x55\x0e\x02\xf6\x3e\x0a\x33\x27\x2e\x88\x7d\x41\x68\x4e\xf1\x77\x66\x9e\xaa\xa2\x93\x6c\x02\x61\x80\xb6\xaa\x29\x64\xc5\x0e\x92\xfd\x09\xee\x0d\x56\x65\x5a\xfb\x3c\x7b\x58\x5d\x70\xaa\x1c\xee\x1c\x70\xaa\x7f\x0a\x50\x8c\xac\x17\xfb\x4c\xd1\xae\x54\x26\x5f\x55\x4e\xe3\x20\x0f\x59\xcd\x3e\x2e\x65\x4f\x8c\x2a\x78\x19\xe1\xd6\x40\x73\x94\x18\xe7\x02\x8a\xa3\xfe\x83\xac\x40\xba\xef\xf5\x38\x7a\x90\x76\x20\x44\xef\xbc\xb2\x16\xf8\x14\x1a\x01\xe3\x8d\xa4\xb3\x9c\x99\x13\x06\x21\xa5\xdd\x4a\x82\x42\xca\xf8\x80\x00\x2f\x34\xbc\x3d\x4f\x32\x76\x77\x9b\x8d\x45\x22\x2a\x42\x04\x30\xab\x9c\x52\xe4\x0e\x00\xda\x93\x1b\xdc\xad\x2c\x6a\x37\x3a\x3b\x35\x97\x62\x18\x05\x42\xf8\x06\x2e\xd7\x03\x57\x2a\x02\x55\x1a\xa2\x0b\x02\x41\x06\x6f\xcb\xbd\xd3\x68\x39\xb7\x4c\x38\xe5\x74\x3f\xaf\x51\x01\xae\x43\x06\x55\x6b\xd5\x78\xa3\x79\x35\x89\x93\xdc\x25\xf1\xb5\x81\x4f\xfe\xad\x83\x8a\x2b\xe4\x67\x68\x9e\xa6\x98\x74\x61\xea\x7d\x74\x56\xd7\x28\xa7\x11\x48\xce\xf9\x07\x42\x1f\xc1\xa4\xbb\x2a\x3b\xcb\x9b\xb3\xdf\x92\xf9\x9c\x1f\x88\x9a\x93\x82\xa2\x03\x1d\xec\x6b\x22\xec\xfd\xe7\x97\x23\xdb\xbe\xb2\x47\x59\xad\xba\x57\x8b\x83\xef\x17\xdd\x74\xf1\xc4\xfb\x53\xd0\x5e\x5b\x6c\x5c\x97\x58\x54\xe1\xe3\x64\xd1\xf3\xf1\x48\x83\x80\xa4\x44\x2f\x26\x87\x25\x87\xa2\x92\x99\xb4\x16\x00\x78\x04\xe3\xe4\x83\xed\x59\x55\x4b\x47\x15\xd7\x57\xd7\xa8\x7f\x94\xf6\x2d\x8a\xca\x02\x11\x42\x2c\xee\x8a\xe6\xce\x81\xfd\x20\x1d\xfc\xcc\x02\xd9\xce\xa9\x0d\x9b\xd1\x48\xd5\x3a\xab\x73\xae\xaf\x6a\x09\x3e\x74\x4b\x22\x0d\xe5\xe3\x0f\x52\xbe\xbe\x99\x8f\x89\xe6\xe4\x18\x1d\x1f\x08\x4b\x39\x2a\x9c\xcd\xe0\xdd\x9c\x30\xb0\x24\x65\x71\x1d\x9e\x53\xe3\xaa\x7c\xfe\x2b\xe0\xaa\xa7\xac\x60\xe8\x92\x0e\xb0\x97\x58\x73\xc0\x88\x71\x03\x0f\x46\xff\x6c\xf3\x66\xa1\x15\xb9\x18\xa4\xf5\x5a\x0d\x7b\x63\x0d\x18\xd5\x03\xd7\x74\xcb\x55\x2f\x40\x0a\x69\xae\xf5\xc6\x72\xe2\xfc\xc0\x82\x7a\x19\x80\x88\x34\x44\xbb\xbf\x20\xfb\x9b\x08\xb9\x2f\x13\x94\x55\x4f\x42\x7b\xa1\x76\x02\x6c\x50\x28\xcb\x9b\xa4\xc9\x52\x7c\x7a\xdf\xe5\x4d\x51\x2f\xe0\xfe\x2e\xce\x06\xc2\xdd\xd5\x49\x52\x9d\xf3\x38\x8d\x2b\x04\x1c\x2e\x1f\x5d\xfb\xf2\xd1\xbd\x64\xd6\xa4\xbc\x8d\xfe\x85\xa6\x2a\xb4\x03\xdb\x6b\x6b\x3f\x41\xdd\x5f\xbb\x06\xb7\x12\x16\x50\x08\x54\x14\x8d\x4f\x0b\xbe\xe4\x27\x7d\xa9\xb7\xf0\x8d\x05\x2f\x2d\x76\x9f\x16\x33\xee\x11\xe2\x28\x31\x52\x6b\x67\x6a\x0e\x15\xeb\xbd\x2d\x89\xda\xab\x3d\xc3\x94\x37\xfd\x2c\xc9\xe9\x20\xa9\x4e\xbd\xa6\x20\x97\xb6\x11\x04\xda\x3c\x93\x4e\x3d\xf3\x26\xeb\x17\x4e\x26\x58\x45\xe7\xac\xb4\x7d\xd5\xe4\xf0\x33\xad\x77\x70\x0b\xf0\x0f\x88\xc7\xbf\xac\x69\xec\x1a\x25\x35\x55\xd8\xa8\x58\xeb\xc9\x16\x1b\xf6\x04\x77\xc7\x36\xc1\xe5\xb9\x24\xc7\x22\x35\xac\x1f\x09\x4a\x4f\x0f\x53\x85\x17\x61\x8b\x33\xaa\xda\x46\x8f\x8c\x2a\x82\xd5\xd0\x82\x0d\x0d\xe1\xc4\x52\xd9\xba\x98\x50\x6a\x21\x12\x36\x45\xba\x80\x3a\x43\xb2\x0d\x69\x4f\xf5\x5f\x60\x0a\x49\x0d\x05\x97\xc4\xfc\x43\xf7\x59\x83\x2a\x5e\xe8\xd3\x93\xc4\x86\x5b\x8e\xf4\x4d\x73\xe5\x98\x9b\xc2\x25\x76\x26\xb6\x16\xd9\x56\x2c\xaa\xa4\xac\xcb\xb8\xc3\x53\x78\xc0\x19\xeb\x92\xb0\x68\xcd\x09\x42\x84\x50\x6b\xf2\x16\x35\x62\x31\x64\x50\x88\xdb\xdd\xac\x45\x6a\xa2\xc8\x76\x50\x23\x49\xb3\xb2\xbd\xac\x6a\x4d\x25\x34\x6b\x2e\x3b\x64\xb3\xba\x6a\xa2\x1f\xf2\x92\x76\x1f\x57\xca\x4e\x10\x0f\xe0\x37\x0e\x1e\x38\x22\x21\x25\x27\x0b\xbc\x6c\xa5\xa5\x5a\x73\x29\x51\xda\x3b\x5e\x30\x40\x40\x19\x27\xe6\xfb\x91\x8d\x30\x4b\x00\x0d\xf7\xd4\x20\x2b\xdc\x97\x03\xc2\x77\xa3\x20\xaf\x69\xcd\x0a\x80\x23\x92\x2b\xae\x81\x3c\xa3\x87\x52\xe2\x97\x00\x1e\x46\xa6\xe7\xed\x7f\x41\x00\x7f\x8b\xf5\x10\x4e\x91\x3e\xe3\x98\xd1\x2f\x58\x83\x81\xcf\xc2\xf6\xbc\xc8\xb3\x12\xff\x42\x12\xf3\x17\xb4\xd3\xee\x62\x05\x4d\x37\xec\x53\x01\xc8\x68\x1e\xda\x46\x68\x7c\xd6\x2e\x3e\x5f\x6a\x51\xc9\x9e\x93\xdb\x9b\xa1\x94\xba\x67\x0f\x45\x98\x49\xfe\xb0\x08\x35\x8b\x33\xbb\x89\x7b\x10\x3c\x74\xd0\x54\xab\xcf\x3f\x73\xf1\x58\x5c\x8a\xf3\x28\xff\xb6\x3d\x96\x7e\x47\xf4\x87\x1e\xa8\x4f\x3e\xc3\xd5\xc1\x3e\xe4\x73\x24\x52\x2a\x3b\x0a\x4b\x3e\x7b\x55\xe5\xb3\xbd\x14\x71\xe0\x84\x76\xdb\x24\xc5\xac\x7e\x3d\x90\x41\x1a\xe3\x23\x8b\x16\xdf\x6a\x2b\xa7\x2c\xa4\x33\x1a\x90\x1c\xf1\xfe\x92\x94\x46\x50\x0b\x1b\x61\x3b\xed\x96\xdc\xd1\xb6\x9f\xda\x76\xb5\x00\xdf\x8d\xde\xcf\x10\x0b\xa1\x42\x3d\x24\xc9\xe9\xf6\x2b\x44\xb9\xd6\xfd\xa4\x97\xd0\x9f\x36\x88\x5f\x71\x19\x1c\x5e\xf4\x4b\x5e\xc5\x2f\x4b\xd3\x63\x87\x4b\x1c\xbe\xeb\x98\x17\x34\xef\x04\xaa\xb1\xfc\x72\x8e\x2d\x6f\x08\x7f\xed\x9a\xbd\xba\x4d\x1c\x58\x6a\x79\x57\xf1\x6f\xaf\xbe\xe3\x68\xee\xd7\xbf\xae\x24\xac\x5e\x0f\x90\x09\x42\xfa\x51\x72\x69\x1c\x5f\x72\xb1\x46\x64\xdc\x45\xdf\xdc\xe1\xa4\x02\x7c\x78\x07\xd2\xc3\xed\x97\x43\x91\x2f\xfa\xa4\x7d\x9d\x40\x4e\x64\x48\x8d\x60\xe8\x41\xbb\xdf\xf3\xff\x05\xba\xef\xed\x2e\xf4\xd3\xfa\x34\xaf\x6b\x71\xda\x22\xf3\xe1\xb8\xeb\x67\x3f\xf9\x11\xf6\x3f\x0c\xf7\x4f\xb9\x82\xb5\x6f\xe7\x12\x2c\x14\x03\xc3\x44\xe9\xf6\xb7\xbc\xb7\xc9\x97\x74\x9f\x19\x17\x9b\x47\xed\x1b\x48\x70\x77\x94\x3b\x10\x16\xc2\x43\x47\x2d\xf8\xb1\x3c\xb3\x27\x72\xa7\x1b\x62\x33\xe2\x53\xae\xd1\xae\x7a\x5d\x0f\xfd\x62\x05\xf2\x09\xad\xf8\x2e\x6e\xc5\x47\xf6\x3f\x5d\x08\x52\x72\xfe\x7c\xc4\xca\x86\xca\x31\x67\xb8\x5c\x61\xbe\xd1\xe2\x4d\xde\xcf\x42\x69\xbf\x7b\x89\xc3\x42\x8d\xc4\x58\xc0\x3f\x0c\x3e\x2b\x7f\xba\x42\xb4\x21\x4e\x57\x6b\x8f\x5f\xb2\xe6\x68\x3a\x38\xb0\xe9\xf3\x02\x9a\xf9\x04\x1f\x07\x54\x03\x43\xa1\x54\x2e\x08\x85\xf6\x86\x33\x86\x2d\x03\x17\x6b\x76\x36\xab\xf9\x7c\x58\x38\x1d\xc3\x71\x94\xe8\x11\x66\x57\x1c\xa8\x3d\x56\xbc\x10\x9c\xb0\x0c\x09\xfd\x5f\xb2\x81\x73\x11\x52\x65\xd4\x3a\x13\x05\x35\xeb\x4a\xca\x26\xa5\x92\xae\x61\xb8\xa8\xc5\x0d\xef\xd5\x63\xd8\x2a\x35\xae\x03\x61\x66\x2c\xb8\x7f\x38\xc6\x94\x5a\xe9\xcb\xb1\xa5\x04\xc8\x61\xb3\x81\x00\x07\x22\x4d\xa9\x8b\x7d\xa1\x17\x5c\xa6\xc8\x0b\x0e\xa7\x96\x0a\xa8\xc8\xce\x15\xce\xe7\x89\x59\x85\xb5\x09\x83\xbb\xac\x8e\x3f\x20\xe7\xbe\x6d\x5c\xeb\xbf\x0c\x9b\xb9\x0c\x0c\xb7\xa3\xc4\x1a\x3c\x88\x83\xdd\xb4\xbf\xe5\x45\xdf\x9c\x58\x65\xee\x32\x02\xb6\x84\xa6\xf5\xfb\xf0\xf9\x28\x9a\x26\x08\x6a\x2b\x8a\xe7\x34\x2b\x4e\x96\x80\x4e\xe8\x98\xf1\x51\x1b\x9b\x6c\xd7\xa3\xe7\x81\xc6\x60\x0f\xda\xc7\x06\x8d\x8f\xbd\x41\x77\xa2\xa5\x49\xef\x7c\x48\x10\xd5\x6b\x39\x69\x19\x7d\x76\x82\xaa\xb7\xf4\x2f\xe9\xc8\xb4\xd8\xa9\xe4\xc6\x40\x92\xd3\x60\xcf\xd6\xd9\xbf\x38\x31\xbd\x26\xe3\xcd\x2a\x7d\xa2\xda\x48\x2b\xfe\x6e\xeb\xd2\x6a\x1b\x7f\x03\x17\x71\xea\x41\x2f\x17\xea\xd8\xbf\xef\x9a\xd6\xae\xa5\x79\x03\x66\xb9\x47\x86\xba\x43\x6b\x4f\x57\x32\x04\xf6\xa7\x4b\x78\x2a\x1f\x4b\xcc\xc2\x81\x93\xf4\x6b\x44\x06\xd2\xf2\xb7\x42\x7e\xb2\x34\xa1\x7d\x35\x4e\x67\xc8\xc9\xda\x39\x41\x6e\x17\x5b\x6a\x8f\x64\x7c\x80\x0f\x49\x1a\x26\x48\x7c\xc2\xa4\xd7\xe1\xab\xb5\x1d\x4f\xd2\x2c\xb1\x2c\xfd\x3d\xfb\x64\x40\x98\x5f\x92\xe2\xe8\x7e\xd2\x04\xaa\xeb\xfb\x9e\x56\x42\xee\xb5\xaf\x6c\x07\x0c\xa8\x0d\xa4\xdc\x4b\xb2\x17\x97\xa7\xa5\x21\x22\xc8\xff\x0f\x09\x40\x49\xf3\xb8\x62\xa6\x96\x52\x93\x76\xe5\x97\xba\x79\x90\x6e\x78\x3b\xdd\xbd\x95\x6e\x24\xc4\xc3\xe8\x34\x2a\x6c\x54\x1d\x8d\x5b\x5b\xe3\xf3\xb8\xc9\x64\x2f\xb4\x3d\xed\x61\xd5\xc6\x11\x4c\x4f\x09\xf8\x3e\xb2\x7d\x78\xea\x8b\x65\xcf\xda\xc0\x83\xbb\xe2\x4e\x28\x95\xd1\xe7\x56\x9c\x6b\x87\x17\xe2\x9e\x70\xd8\x5d\x6b\xce\x7b\x49\xcb\x70\x4c\x75\x5b\xbd\x00\x8c\xfa\x7b\x72\x3e\x28\x46\xb0\x6c\x32\x5f\xa8\xd6\x51\x18\xea\xcf\x4f\xf0\xd7\xbd\x73\xd0\xf1\x2e\xb4\x39\xf7\x95\x19\xd0\xfd\x50\x46\xfa\x38\x3e\x3e\x8f\xbf\x0f\x6e\x4a\x87\x5a\xa0\x4d\x87\x29\x14\x2a\xf2\x3f\xac\x45\x72\xd1\xef\x77\x12\x5a\x41\x22\x5b\x3e\xe6\x87\x86\xd4\x5c\x55\xc2\xab\x1b\x1e\x47\xb4\x88\x8d\xb8\x27\x21\xad\xff\x3f\x82\x2a\x88\x10\xa2\x14\x20\x78\x69\x80\xc4\xbe\x3f\x2a\xc5\x28\x09\x9b\x1a\x24\x25\xac\x34\x5d\x2e\x16\x19\x56\x9a\x16\x89\x56\x5f\x39\xec\x21\xd2\xe0\x48\x9a\x60\x68\x94\xec\x49\x72\xd6\xf4\x55\x90\x27\x7f\x9a\xf2\x0f\x2f\x84\xe6\xc0\xb1\x3c\x21\x18\x83\xa7\xac\x43\x6e\xba\x45\xfe\x03\x65\x31\x48\x2c\x3c\x7a\x52\xd4\x3c\xb4\x42\xef\x7a\x5c\xfe\x16\x38\x8e\xfd\xaa\xf7\xc5\x52\xf4\xe0\xe5\xb8\xd3\xd6\xec\xb9\x20\xf9\xfb\x43\x06\x2c\xe7\x8e\xaf\xe7\x75\xb8\x35\xc1\x2f\x8c\xbd\x05\x67\x81\xf5\xa0\x8e\x5f\x80\x34\x6b\xb8\x03\x62\x02\xa6\xf3\xac\x64\x0c\xf1\x57\x61\xa7\xcb\x31\x7b\x1f\xce\xe7\x28\x98\x37\xbd\x52\x5b\x8e\xc8\xc7\x43\x05\x6e\x6b\x90\x64\x70\xe2\x76\x51\x29\xe5\x08\x0d\x87\x40\x97\xe8\x0f\x13\xeb\x9c\x9e\x80\x55\x98\xfd\x3c\x57\x90\x0a\x6b\x9b\xbd\xca\x90\x3b\x2c\x9e\x39\xdd\xaa\x59\x9f\x56\xf9\x34\x6f\x7d\x86\xcb\x9f\xe1\xd6\xde\x81\xfd\xdd\x24\x7d\x22\xd3\x5d\x7a\xe0\x2c\x39\x85\xd9\xf6\x2b\x3c\xe5\xee\x85\x5a\xae\xc4\x78\x38\xa6\x39\xf3\x02\x23\xd3\x67\xda\xe3\xd7\x2f\x92\xce\x71\x85\x83\xc8\x9e\xbb\x17\xe2\xdf\x39\xea\x21\x2b\x0e\xcb\xef\x91\xb0\x57\xf5\xe6\x02\xff\xbb\x9f\xb5\xdd\xbe\xcd\xd7\x56\x5b\x2c\x5f\x2a\x69\xfd\x60\xc3\x82\xff\xf4\x40\x6f\x4f\x75\x54\xec\x1b\xce\x5f\xea\x89\xaf\x70\xaa\xd1\x9f\x4b\xc3\x13\xb9\x2a\xa0\x7f\x30\x3a\x52\x61\x93\x9e\x8f\xf6\x6e\xb5\x93\x28\xaf\xf5\x6e\xe3\x00\xf5\x52\xc3\x95\xaf\xb9\xcf\x88\x8f\xf5\x76\x35\xdb\xfb\x14\xba\x94\xe9\xa6\x9a\x37\xa1\x11\x41\xcd\xa2\x1a\x01\x16\x6f\x22\xca\x8a\x3b\xcb\xfb\xfa\xa4\x97\x15\x68\xf9\xd4\x96\xf4\x9f\x33\x57\x19\x11\x2d\x54\x07\x1e\x55\x7c\xfa\xa5\x67\x62\xd7\x3b\x24\x40\x14\xce\xa2\xd1\x86\xcb\xa7\xda\x30\x4a\x3f\xd0\x0e\xcc\xbf\xba\xf9\x52\x4e\x11\x71\xf5\x3c\x6a\x5c\xd0\x93\xb9\x79\xb9\x40\xcc\x62\xdd\x4b\x0b\x65\x6c\xa5\xbb\xe7\x43\x9e\x27\x72\x26\x77\x9d\xeb\x55\x34\xee\xdb\xa6\xe9\x6c\x73\x3a\x88\xa5\x91\x8b\x74\x4c\x46\x96\x08\x08\xd1\x89\x4b\x0b\x4e\x77\xba\xaa\xaa\x9e\x33\x0e\xf7\xe7\x58\x5c\x1b\x0b\x0c\xf7\xa9\xf1\xd5\x28\xc1\x72\x2e\xd0\x75\x53\xec\xf5\xc5\x70\x9e\x51\x55\x9a\x9c\x07\x60\x1e\xe6\xf5\x02\xf5\xfc\xb7\xfe\x26\x04\x45\x88\x31\x42\x72\xe7\x40\xa4\x7a\x07\x98\xb6\xee\x0a\xd2\x56\x2b\x2d\xc4\xd2\xf4\x4a\x1e\x65\xa9\x7d\xa2\x07\x8c\x34\xeb\xae\x27\x26\xd9\xb9\x56\xbc\x7b\xf4\x99\xa6\xb2\xf7\x78\xb8\x8b\xc4\xf2\x19\x1d\xd4\xb3\xd1\xa6\x7f\x49\x45\xd6\x3b\xf9\xad\xc7\x0c\x39\xf3\x2f\x49\xc6\xba\xda\x65\x45\xbb\x93\x83\x7c\x91\x8e\xef\xd7\xf7\xb8\x0f\x92\xbb\x2e\x2a\xbe\xc1\xa0\xf2\x5d\xd7\x5a\xa4\xf7\x39\x5d\x98\xe5\xd2\xff\x45\xe1\x3c\x57\x4b\x68\x1b\x51\xb2\x5e\x8e\x6b\xc9\x55\x3d\x10\x05\x5a\x95\xa3\x2e\xe3\x72\x9f\x37\x8c\x1d\x1d\xbf\x36\xd5\x04\xc5\xa2\x86\xd7\xf2\x7d\x42\xcc\xe2\x17\x96\x2f\x15\x8d\xbd\xf2\x65\xd4\xa9\x44\xff\x5c\xd9\x02\x49\x04\x49\x4a\xe0\xbc\x77\x29\x1a\x69\xa5\xc9\x8f\xd9\x2a\x67\xd9\x69\x88\x59\x57\x64\x64\x6f\xf3\x7a\xd6\xad\x1b\xb6\xdd\x62\xe8\xa6\x59\x11\x0c\xb9\x8d\x87\x8f\x8f\x54\x72\x3b\x4d\x38\x67\xeb\xde\x0a\xfd\x78\x07\x3f\xe0\x66\x00\x16\xa1\x78\xde\x46\x82\xb2\xa8\x19\xcb\xf5\x49\x1e\xe8\xc6\x22\xd6\x74\x2a\x55\xfc\x97\x28\x7d\x74\x44\xbf\x09\x87\xbe\x10\x97\x59\x1c\xf6\x92\x5c\x28\x37\x72\xb9\x1b\x5b\x5c\x17\x17\x13\x0b\xc1\xb8\x56\x87\x19\x5b\xc8\x9b\x1f\xd2\xc9\xf9\xfa\x0c\x0e\xac\x8b\x64\x85\xd1\x6d\x1b\x78\x8c\x4d\x2f\x6b\x1d\x91\x91\x6d\x72\xc9\x41\xc2\x63\x8d\x74\x7d\xe3\x1d\x0e\x63\xb3\x1d\x11\x3f\xdf\x3b\x7f\xbe\xa9\x01\x09\x40\x2f\xf3\x99\xf7\x6b\x2b\x7a\x3d\xba\xb5\x60\x89\xfe\x14\x1c\xd5\x66\x93\xa3\x93\xf8\xeb\x47\xb6\x88\xca\x6a\xee\x8b\x89\x4f\x91\xc5\x30\xdf\x09\x3b\xdb\x2d\x5d\x5c\x2e\x49\x41\x91\x89\x52\xfa\x20\x9b\xd6\x9f\xd9\x8b\x13\xfc\xfe\xa3\x0f\x0a\xde\xbb\x8d\x3f\x02\xc0\xe7\xef\x7e\x9a\x57\xa5\x90\x5f\x6f\x5b\x22\x25\x67\x3f\x69\x9a\x15\x4b\x0c\xc0\xa0\x9e\x84\x4f\x2c\x98\xae\xd5\xad\x2f\x98\x22\x5d\xa4\x1c\xd3\xf4\x87\xeb\xd4\x08\xaa\x17\x14\x2b\xcc\x55\x0b\xd7\x61\xf3\x8c\x54\x73\xa7\x11\x16\x8a\x59\xd0\xf4\xc9\x77\x40\x6c\x35\x2f\x32\x25\x32\xf0\xe9\x59\x29\x44\xee\xb9\x2a\xf1\xa8\x4d\x7b\xa0\xce\xfe\xee\xbd\x4f\xf1\xf7\x4f\xfd\xfc\xa4\x17\x1f\xf5\x9b\x77\x9a\xe8\x38\x0e\x98\xe0\x6e\x5a\x20\x6b\x03\xe6\x5a\x7f\x9e\x6d\x9a\x48\xfe\x74\x17\xb2\xff\xf1\x69\xa7\x66\x90\x42\x92\xbd\xa3\x92\x30\x89\x1c\xfe\xa7\xc7\x5f\x0e\x38\x03\x2e\x56\xcd\xe7\x92\x5b\x80\x08\xe0\x82\x34\x8b\x54\xd6\x66\xc5\x05\xd5\x64\x8b\xd1\x29\x33\x72\x69\x9a\x97\x17\x2b\xec\xb7\x12\x12\xd5\xc9\xa7\xc9\xc5\x71\x72\xcc\x48\x3a\xde\xb9\x7a\x11\x08\x21\x66\xa3\x6b\x74\x02\x3b\x27\x62\x97\xaa\xc9\x99\xf8\xd5\x68\xf9\xd1\x81\x6b\x97\xdc\xf1\x2b\xc4\x65\x11\x0b\x9f\xe4\xd5\xac\xf3\xb4\x9a\xef\xd7\x3b\x88\xa7\x7f\x92\x4a\xf5\xb3\x97\x90\x71\x42\x45\x4f\xe3\xd4\xf6\x29\xe7\x13\x03\xc2\x70\xdc\x6a\xa5\xbd\x6f\x7b\x35\xd6\xe7\xee\x11\x60\x10\x40\x78\x56\x93\x44\xc9\x10\x1c\x44\x4d\xf9\x3a\x87\x1c\x66\x1d\x97\x3c\x6c\x72\xda\x86\xd3\x3f\x3e\xbe\x5e\xb6\xe1\x72\x19\x74\xbb\x48\xbd\x95\x73\xb7\x7c\x85\x07\xc9\x57\xc1\xb6\x5a\x0e\xa6\xf2\x14\xfe\xe2\x19\xe9\x7c\x25\x29\xe4\x72\x1b\xa3\x6b\xdf\xbd\xd7\x68\x73\x5d\xa6\x97\x24\x2c\x3b\xda\x33\xf8\xec\xde\x90\x5b\xf5\xbc\x0e\x78\x64\xab\xd9\x60\x78\x8d\xf4\xd5\xbd\x38\x42\x6c\x64\xd4\x6a\xa7\x2e\xf6\x18\xb6\x00\xc7\x24\x7d\xdb\xe2\xf1\x20\xbd\x0d\xcd\x9f\xe7\xd1\x03\xe2\xce\x50\x1f\x8c\x41\x54\xa7\x9c\x39\xf3\xf7\x05\xd6\xce\x3f\x24\x53\x39\xf6\x86\x13\xc8\xcf\x09\xc3\xde\xd6\x43\xdf\xbc\xf6\x43\x86\xf8\x21\xa5\x44\x28\x10\x93\x09\x73\xa0\xde\xbd\x22\x47\x18\x5e\xbd\x08\x12\xda\x3f\x7b\xa4\xe8\x7a\x09\x23\x7d\x60\x64\xb0\x27\x90\xdc\x47\x28\xe6\xb6\x77\xeb\x03\x6b\x71\xa2\xb2\x7d\x00\x5d\x72\xfe\xa5\xe5\x10\xc1\xe5\x80\xb8\x03\xbc\xce\xe5\xe2\xb3\xe0\x1c\xdc\x3d\x6a\x00\xee\x21\x92\x16\x54\x18\xee\x08\x72\xae\x32\x36\x72\x3f\xd8\x76\x6f\xb6\xe7\x5e\xfb\xc0\x57\xf8\x55\x6b\x0b\x25\x6b\xc4\x17\xf8\x9c\x7a\xe3\xdb\x50\xe4\x9a\x3e\xf8\x2f\xe6\x80\xd3\x3c\x12\xf9\x79\x58\x0a\x12\x7b\xcb\x8a\xeb\x0f\x8b\xf8\xea\x88\x80\x07\xfc\x4d\x17\x00\xa5\x21\x05\x20\x59\x65\xbd\x5f\x22\xba\x2b\xb2\x74\x17\x7b\xad\x2b\x8f\x34\xdc\xc5\x1d\x52\x35\x57\x1f\xe2\x3f\x59\x8a\x19\x29\xf8\xda\x80\x5b\xf3\x75\x38\x99\x0c\x6f\x1e\xbe\x91\x08\xfc\xe5\xcc\x9c\x8f\x2e\x86\x8f\xf7\x23\xf3\xf0\x69\xe4\x2f\x12\x1d\xdf\xbb\xcb\x43\x2f\xcd\xd5\x64\x34\x32\xb7\x57\xe6\xe2\xd3\x70\xf2\x71\x34\xc0\x7b\x93\x11\xde\x88\x46\xe2\x93\xff\xd1\x00\xf4\xd6\x2d\xff\x3d\xfa\xe7\xc3\xe8\xe6\xc1\xdc\x8d\x26\x9f\xc7\x0f\x0f\x34\xda\xf9\x37\x33\xbc\xbb\xa3\xc1\x87\xe7\xd7\xf4\xfa\xf0\x2b\x45\xe7\xff\xbc\x18\xdd\x3d\x98\xaf\x9f\x46\x37\xe6\x16\xa3\x7f\x1d\xd3\x72\xee\x1f\x86\x78\x7f\x7c\x63\xbe\x4e\xc6\x0f\xe3\x9b\x8f\x3c\x1e\x6e\x17\x98\x8c\x3f\x7e\x7a\x30\x9f\x6e\xaf\x2f\x47\x13\xbe\x82\xe0\x27\x9a\x9c\x3f\x34\x77\xc3\xc9\xc3\x78\x74\x6f\xee\x26\xb7\x5f\xc6\x97\xe9\x9e\x8e\x87\xf7\xb4\xea\x63\xf3\x75\xfc\xf0\xe9\xf6\xf1\x21\xac\x9d\xf6\x36\xbc\xf9\x66\xfe\x3e\xbe\xb9\x1c\x98\xd1\x98\x07\x1a\xfd\xf3\x6e\x32\xba\xc7\xf6\x69\xec\xf1\x67\x5a\xf0\x88\x1e\x8e\x6f\x2e\xae\x1f\x2f\xf9\x76\x83\x73\x1a\xe1\xe6\xf6\x81\x46\xa7\x8d\xd1\x6b\x0f\xb7\x4c\x19\xf7\xae\x1b\x1d\x8b\xa1\xf1\x3f\x8f\x26\x44\xbe\x9b\x87\xe1\xf9\xf8\x7a\x4c\x53\xe2\x3a\x84\xab\xf1\xc3\x0d\x4d\xc1\xa4\x1b\xca\xca\x2f\x1e\xaf\x87\xb4\x89\xc7\xc9\xdd\xed\xfd\xe8\x4c\x08\x48\x63\x10\xb9\x27\xe3\xfb\xbf\x1b\xda\x80\x92\xf5\x1f\x8f\x43\x3f\x0e\xd1\x96\x86\xf8\x3c\xbc\xb9\x60\x36\xf5\xd8\x88\xdd\x9a\x6f\xb7\x8f\xe4\x29\x68\xd7\xd7\x97\xc9\x73\x90\x69\x64\x2e\x47\x57\xa3\x8b\x87\xf1\x17\xe2\x2d\xbd\x48\xb3\xdc\x3f\x7e\x1e\x29\xb5\xef\x1f\x98\x3c\xd7\xd7\xe6\x66\x74\x41\xab\xc5\x57\xf7\xa3\xc9\x97\xf1\x05\x53\x61\x32\xba\x1b\x8e\x27\x86\xaf\x7d\x98\x4c\x30\xca\xed\x0d\x2c\xcb\x2f\x67\x60\x1c\x09\xc8\xe8\x0b\xd8\xff\x78\x73\x8d\x9d\x4e\x46\xff\x78\xa4\xcd\x1c\x10\x02\x8c\x30\xfc\x48\x82\x06\x42\xc6\x3c\xff\x3a\xa6\xa9\xc1\x9d\x3e\xe3\x07\xfc\x09\x3d\x08\x8c\xff\x46\x22\x74\x6b\x3e\x0f\xbf\xc9\x4d\x13\xdf\x9c\x68\xd0\x8c\xee\x2a\x8a\x54\x22\x88\x9e\x41\x30\x87\xe7\xb7\xa0\xc0\x39\x1e\xf3\xb2\x68\x21\x20\x07\xd8\x73\x39\xfc\x3c\xfc\x38\xba\x8f\x04\x80\xa7\xd6\xeb\x76\x07\xe6\xfe\x6e\x74\x31\xc6\x3f\xe8\x39\x89\x1d\xf1\xf9\x5a\x68\x42\x0a\xf4\x8f\x47\xb0\x90\x7e\xd0\x41\xcc\x90\x78\x89\x11\x20\x83\xca\x2f\xa8\x1f\xe4\xec\xc6\xc9\x07\xcd\xdd\x57\xc9\x93\x30\xf7\xbe\xec\x99\xeb\xdb\x7b\x16\xb4\xcb\xe1\xc3\xd0\xf0\x8a\xe9\xbf\xcf\x47\x78\x7b\x32\xba\x21\x7a\xb1\x2a\x0d\x2f\x2e\x1e\x27\xa4\x56\x78\x03\x5f\xd0\x6a\xee\x1f\x49\xd1\xc6\x37\xc2\x14\xec\x97\x15\x79\x3c\xb9\xf4\xba\xc4\xe2\x79\x35\x1c\x5f\x3f\x4e\xf6\x04\x8c\x66\xbe\x25\x12\x62\x48\x16\xb4\xc0\x90\xfb\xdb\xab\x07\xd2\x81\xd1\xe9\x80\x65\xc0\x8c\xaf\x68\xaa\x8b\x4f\xca\x3d\x93\x68\xec\x37\xf3\x89\x58\x71\x3e\xa2\xd7\x86\x97\x5f\xc6\xac\x75\x32\x0f\xe9\xc1\xfd\x58\x69\x72\xab\x23\x28\x1d\x01\x3c\x6e\xe4\xc5\x03\x57\x91\x70\x3b\x2b\xac\xfc\x90\x63\x4d\xc9\xa2\x3e\xb0\x97\xa7\x1f\xbf\xc1\xaa\xde\x10\xa2\xb9\x76\x15\x3a\x0e\xa9\x39\x89\x2a\x97\xd4\xc8\xf9\x87\xf4\x12\xa9\xe8\x0e\x53\x85\xfd\xea\x1c\x97\xd2\xf8\xda\x86\x2b\x58\xba\xc6\xbb\x18\x09\xdc\xf8\x4e\x39\x6e\x45\x58\xe3\x1c\x93\xde\x81\xc0\x97\x1e\xd9\x24\xa8\x89\xef\x2e\x94\x2b\x26\xd3\x7b\x13\xdd\x39\x55\x7f\x23\x2d\x67\x54\x19\xf8\x0b\x3c\xc6\xb8\xbd\xec\xc7\xde\x1d\x19\xc8\x74\x0e\xe4\xf8\x49\x99\xc9\xcd\x53\x83\xe7\xea\x3a\x3f\xb8\x2a\xe6\x54\x2e\x56\xf5\x47\x6a\xdc\x14\x03\x14\x2f\x32\xad\xd8\x06\xb0\xe5\x0f\xb9\x24\xd7\x60\xba\x0b\x97\x9b\x6c\x01\x32\xc2\xf9\xfb\x8f\xd7\xee\x5d\x72\x93\x52\x0c\xe2\xd6\x2d\x2d\x3c\x4b\xaf\x6c\x25\xb7\x62\xc5\x17\x69\xf1\x2d\x27\xe2\x80\x39\x12\x70\x57\x3d\xa7\x07\xce\x79\x28\x1e\xa3\x59\x71\x4a\x46\xda\x02\x42\xff\x86\x35\xc7\x1e\x5d\x1c\x73\xeb\xa6\xc6\x97\x9b\x8a\xc3\x29\xee\x0c\x97\x52\x13\xf6\xd9\x49\xfd\x82\x6f\xcb\x05\x4c\x20\x9a\x12\x7d\xc0\x4b\xfe\x34\x6e\x01\x29\xfc\x75\x00\x25\x5f\x4d\xc7\x59\x35\x9c\x5a\xcc\xa4\x97\x53\xee\xf5\xe1\x1b\x07\x4c\xef\xae\x6e\x34\x94\xc8\x57\xc0\x0c\x0c\x98\xfc\xb5\xca\x3e\x62\x4c\x04\xeb\x83\x3f\x72\x93\xc8\x93\xe0\xe6\xe8\x2a\x4e\xfa\xe1\x19\x31\xf8\xf1\x5d\x80\x7c\x8c\xf0\xb5\xf0\xf3\x43\x74\x01\x4a\x7a\xa4\xc8\x27\x40\x69\x55\x27\xe9\x39\xfc\xd3\x7d\xd4\x7d\xb6\xbf\xf1\x38\x89\xa1\x51\x1b\xdf\x4f\xe5\xae\x4a\x72\x28\x4d\xce\xd3\x48\xf4\xe3\x30\x01\xec\x97\xc3\x05\x1f\x7c\xd3\xb2\x76\x4a\x73\x0e\x98\x4f\xcd\xfa\x9b\x00\x68\xcd\x7d\xd7\x4e\xcb\xfe\xb1\x67\xbf\xb7\xf6\xb5\x54\x95\xcb\xc2\xf9\xc6\x67\xc4\x64\xae\xbf\x31\x96\xd7\xc3\xad\x2f\xaf\x62\x59\x7c\x98\x22\x90\xf1\x03\x22\x5f\x92\xe3\x57\xa2\x65\xb9\x1e\x7e\x60\xfe\xe0\xf5\xf0\x7a\xe9\x2b\xe7\x11\x72\x24\x29\xd7\x9a\x47\xf2\x17\x9d\x71\x87\x99\x5c\xdb\x0c\xc1\xb2\x38\xe5\x58\x57\x25\x6d\x44\xae\x5d\xdd\xf0\x3d\xbb\x79\x91\xd2\x86\x9b\x68\x71\x53\x30\x8b\x90\x25\xde\x55\x3b\x7a\xf1\xc4\x1d\x2c\xf3\x87\x86\x35\x88\x59\xdb\xfa\xd4\xb8\x8b\xbd\x1b\x44\x58\x85\xa4\x9e\x4b\xbe\x85\x98\xcb\x7f\x68\xc2\x0d\xe9\x92\x70\x4d\xc6\xb1\x6f\x3c\x0c\xf7\x2b\x2e\x7c\x4b\x1a\x19\xb8\x4f\x7a\xeb\x6c\x86\x1a\xf3\xa6\x20\x8d\x94\xd3\x7f\xf8\x04\xaa\x8c\xaa\xff\xb7\x6a\x57\xcd\x77\xa5\x75\xf4\x84\x5d\x99\xee\xfc\x2c\x72\xe9\x4d\x98\x9d\x0d\x90\xe5\xc6\x22\x73\x14\x4d\x6d\xfe\xfb\x8a\x02\xf5\x37\xa4\x3d\xa1\xb0\x8f\xc5\xe1\xf2\x3f\xd8\xe0\xef\x65\x35\x6d\x4e\x7d\x66\xe3\x88\xa6\xf8\x1b\x56\x60\x26\x44\xcd\x6a\x6d\x3e\x65\xb3\xef\x7c\xf9\x9f\xb4\x76\xa1\xf7\x9d\x24\xea\x61\x67\x2e\x2a\x30\xf0\x1d\xf9\xd4\x3a\x2f\xf0\xbf\x18\xf0\xb3\x39\xf2\x3f\xdf\xd1\x52\x72\x77\x4e\xfd\x0b\xc9\x17\x34\x33\x6b\xdf\xf8\xab\x7a\x64\xff\x1c\xad\xff\xbf\xa3\xff\x0d\x00\x00\xff\xff\x47\xae\x91\xd4\xb6\x60\x00\x00") - -func confLicenseGnuLibraryGeneralPublicLicenseV20Bytes() ([]byte, error) { - return bindataRead( - _confLicenseGnuLibraryGeneralPublicLicenseV20, - "conf/license/GNU Library General Public License v2.0", - ) -} - -func confLicenseGnuLibraryGeneralPublicLicenseV20() (*asset, error) { - bytes, err := confLicenseGnuLibraryGeneralPublicLicenseV20Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/GNU Library General Public License v2.0", size: 24758, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseIscLicense = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x54\x91\x41\x6f\xe3\x20\x10\x85\xef\xfe\x15\x4f\xbd\x6c\x2b\x59\xdd\xfb\xde\xa8\x8d\x63\x24\x0c\x59\xc0\xad\x7a\x74\x6b\xd2\x20\x35\xc6\x32\x4e\xab\xfe\xfb\x1d\x9c\x8d\xba\x2b\x45\x90\x11\xf3\xbe\xf7\x66\x2c\x6c\x05\x19\x5e\xfd\x94\xfc\xaf\xa2\x8a\xf3\xd7\x12\xde\x8e\x2b\x6e\x5f\xef\xf0\xec\x87\xe5\x36\xdd\x95\xa8\xe2\x69\x1e\xa6\x2f\xc4\x05\x7b\xbf\xa4\x38\xfd\x48\x50\xc3\xc9\x17\x05\x95\xa7\x90\x52\x88\x13\xd6\x88\x73\xf2\x25\x5e\x89\x51\xe2\x14\xc7\x70\xa0\x7b\x98\xc6\x9f\x24\x1b\x43\x5a\x97\xf0\x72\x5e\x3d\xd6\x63\x48\x48\xf1\xb0\x7e\x0e\x8b\xc7\x81\x1e\x33\x7a\x3e\x2f\x73\x4c\x1e\x9f\x61\x3d\x66\x9f\x7c\xc7\xf3\x8a\x83\xf7\xa0\xfe\xa3\x5f\xfc\xcb\x17\xde\x96\x61\x5a\xfd\x58\x62\x5e\xe2\x47\x18\xfd\x48\xb4\x61\xa5\xc3\x63\x78\x89\x1f\x7e\x33\xbf\x0c\x30\xc5\x95\xa6\xca\xfe\x17\xc7\xf9\x3b\xe9\xf5\x69\x9e\x69\x40\x84\x09\xc3\xfb\x7b\x56\x06\x9f\xee\x8b\xc2\xb5\x1c\x56\x37\xee\x89\x19\x0e\x61\xb1\x37\xfa\x51\xd4\xbc\xc6\x0d\xb3\x54\xdf\x80\xa9\x1a\x79\x6b\x35\x1d\x92\x89\xce\x82\x49\x09\x6a\x37\x4c\x39\xc1\x2d\x9e\x84\x6b\x61\xf8\x8e\x99\x1a\x4e\xc3\xb5\x44\xf9\x26\xaa\x4a\xf6\xb5\x50\xbb\x4d\x25\xba\xbd\x14\xc4\xfe\x47\xad\x1b\x74\xdc\x54\x2d\x95\xec\x41\x48\xe1\x9e\x37\xc7\x46\x38\xc5\xad\xbd\x27\x00\x94\x06\x7f\xe4\xca\xc1\xb6\x1b\x84\xc2\x3c\x70\x48\xc1\x1e\x24\x47\xa3\x0d\x09\x9e\x61\xf7\xbc\x12\x4c\x96\x94\xd3\xf0\xca\x95\x24\xbc\xfe\xa3\x8e\x4a\x2b\xcb\x7f\xf7\x04\xa1\x1e\xd4\xac\x63\xbb\xec\x7d\x91\x5e\xcb\xa7\x96\x39\xab\xc9\xca\xd0\x38\xb6\x97\x2e\xc7\x6e\x8c\xee\x20\xb5\xdd\x92\xf6\x96\x93\x01\x73\x2c\x4b\x69\x53\x94\xd2\x96\xa4\xe3\xb4\x45\x93\xa3\x32\xfa\x55\x4e\x68\x95\xbb\xc9\xd4\x19\x96\x13\x28\xbe\x93\x62\xc7\x55\xc5\xb3\x50\x6f\xdd\x4e\x1b\x6a\xec\xed\x5f\x41\x09\x66\x84\xcd\x8e\xba\x77\x59\xad\x37\x20\x31\x14\xbf\x10\xb7\x3d\xe7\xcf\x45\x29\x36\x7f\x6e\x68\xf8\x8e\x6d\xd4\xe6\xff\xbd\xdf\x17\x7f\x02\x00\x00\xff\xff\xa0\x86\x5c\x37\xe9\x02\x00\x00") - -func confLicenseIscLicenseBytes() ([]byte, error) { - return bindataRead( - _confLicenseIscLicense, - "conf/license/ISC license", - ) -} - -func confLicenseIscLicense() (*asset, error) { - bytes, err := confLicenseIscLicenseBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/ISC license", size: 745, mode: os.FileMode(420), modTime: time.Unix(1472881344, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseMitLicense = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x52\x5f\x6f\xc2\x36\x10\x7f\xe7\x53\x9c\x78\x6a\xa5\xa8\x7b\x9f\xaa\x4a\x26\x31\xc5\x5a\x88\x23\xc7\x94\xf1\x18\x12\x43\x3c\x85\x18\xd9\x66\x88\x6f\xbf\x3b\x97\x96\x76\x12\x12\xf2\xf9\x7e\x7f\x9d\xb5\xd0\x50\xda\xce\x4c\xc1\xcc\x72\x77\xbe\x79\x7b\x1c\x22\x3c\x75\xcf\xf0\x7a\x33\xad\x7f\x83\xd7\xee\x7b\x3a\xb8\xb1\x37\x3e\xbc\xcd\x66\xb5\xf1\x27\x1b\x82\x75\x13\xd8\x00\x83\xf1\x66\x7f\x83\xa3\x6f\xa7\x68\xfa\x0c\x0e\xde\x18\x70\x07\xe8\x86\xd6\x1f\x4d\x06\xd1\x41\x3b\xdd\xe0\x8c\x58\x04\xb8\x7d\x6c\xed\x64\xa7\x23\xb4\x40\xdc\xb4\x19\x07\xa4\x09\xee\x10\xaf\xad\x37\xb8\xdc\x43\x1b\x82\xeb\x6c\x8b\x7c\xd0\xbb\xee\x72\x32\x53\x6c\x23\xe9\x1d\xec\x68\x02\x3c\xc5\xc1\xc0\xbc\xb9\x23\xe6\xcf\x49\xa4\x37\xed\x08\x76\x02\xba\xfb\xba\x82\xab\x8d\x83\xbb\x44\xf0\x26\x44\x6f\x3b\xe2\xc8\x70\xa9\x1b\x2f\x3d\x79\xf8\xba\x1e\xed\xc9\xde\x15\x08\x9e\x02\x07\x22\xbd\x04\x4c\x40\x3e\x33\x38\xb9\xde\x1e\xe8\xdf\xa4\x58\xe7\xcb\x7e\xb4\x61\xc8\xa0\xb7\x44\xbd\xbf\x44\x1c\x06\x1a\xa6\x3a\x33\xca\xf1\x87\xf3\x10\xcc\x38\x12\x83\x45\xdf\x29\xeb\xc3\x5d\xda\x21\x95\x33\x15\x1a\xef\x15\x25\xdd\xeb\xe0\x4e\xbf\x93\x60\x45\x87\x8b\x9f\x50\xd2\x24\x4c\xef\xb0\xb2\xa4\xf8\x8f\xe9\x22\x4d\x68\xfd\xe0\xc6\xd1\x5d\x29\x5a\xe7\xa6\xde\x52\xa2\xf0\xe7\x6c\xa6\xf1\xaa\xdd\xbb\x7f\x0d\x3c\xde\x73\x72\x11\xad\x7e\x5a\xa0\x07\x38\x3f\x5e\xf5\x7e\x15\x86\x16\xbd\xef\xcd\xbd\x30\xd4\xc5\x7a\xdb\x1f\x71\x3c\xc9\x87\x88\x0f\x6f\xb1\xfb\xb3\xf3\x49\xef\xff\x31\x5f\x50\x7f\xc5\xa1\x91\x4b\xbd\x65\x8a\x83\x68\xa0\x56\xf2\x43\x14\xbc\x80\x39\x6b\xf0\x3c\xcf\x60\x2b\xf4\x4a\x6e\x34\xe0\x86\x62\x95\xde\x81\x5c\x02\xab\x76\xf0\x97\xa8\x8a\x0c\xf8\xdf\xb5\xe2\x4d\x03\x52\x81\x58\xd7\xa5\xe0\x38\x13\x55\x5e\x6e\x0a\x51\xbd\xc3\x02\x71\x95\xc4\x2f\x59\xe0\xf7\x8c\xa4\x5a\x02\x09\xde\xa9\x04\x6f\x88\x6c\xcd\x55\xbe\xc2\x23\x5b\x88\x52\xe8\x5d\x06\x4b\xa1\x2b\xe2\x5c\x22\x29\x83\x9a\x29\x2d\xf2\x4d\xc9\x14\xd4\x1b\x55\xcb\x86\xa3\x7c\x81\xb4\x95\xa8\x96\x0a\x55\xf8\x9a\x57\xfa\x05\x55\x71\x06\xfc\x03\x0f\xd0\xac\x58\x59\x26\x29\xb6\x41\xf7\x2a\xf9\xcb\x65\xbd\x53\xe2\x7d\xa5\x61\x25\xcb\x82\xe3\x70\xc1\xd1\x19\x5b\x94\xfc\x53\x0a\x43\xe5\x25\x13\xeb\x0c\x0a\xb6\x66\xef\x3c\xa1\x24\xb2\xa8\xb4\x76\x77\xb7\x5d\xf1\x34\x42\x3d\x86\xbf\x5c\x0b\x59\x51\x8c\x5c\x56\x5a\xe1\x31\xc3\x94\x4a\x7f\x43\xb7\xa2\xe1\x19\x30\x25\x1a\x2a\x64\xa9\x24\xd2\x53\x9d\x88\x90\x89\x04\x71\x15\xff\x64\xa1\xaa\xe1\xd7\x8b\xe0\x0a\x9d\x37\x0d\x7f\x78\x29\x38\x2b\x91\xab\x21\xf0\xcf\xe5\x97\xd9\x7f\x01\x00\x00\xff\xff\xdd\x88\xcd\x24\x35\x04\x00\x00") - -func confLicenseMitLicenseBytes() ([]byte, error) { - return bindataRead( - _confLicenseMitLicense, - "conf/license/MIT License", - ) -} - -func confLicenseMitLicense() (*asset, error) { - bytes, err := confLicenseMitLicenseBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/MIT License", size: 1077, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseMozillaPublicLicense10 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xdc\x7c\x5b\x73\xdb\x46\x96\xff\xbb\x3e\x45\x57\xaa\xfe\x65\xa9\x8a\xa6\x6d\x25\x4e\x26\xc9\x13\x4d\x41\x36\x26\x14\xc9\xe1\x25\x8e\xe7\xe5\xef\x16\xd8\x14\x31\x06\x01\x0e\x2e\x92\x99\x4f\xbf\xbf\x73\x4e\x37\xd0\x00\x21\x4b\xd9\xaa\xbd\xd4\x6e\xed\xae\x45\xa0\xd1\x7d\xee\xf7\xce\xcd\xec\x9f\xe1\x64\x32\x52\xf3\xf5\xbb\x49\x38\x56\xf8\xbf\x60\xba\x0c\xd4\xd9\xef\x26\x2f\xe2\x2c\x55\x6f\x86\xaf\xcf\xde\x0c\xd5\x95\xd9\xc6\x69\x5c\xe2\x49\x31\x3c\xc3\x03\x3c\xfa\xfc\x79\x9c\xa5\x65\x1e\xdf\x56\x65\x96\xbf\x78\xa1\xf6\x46\xa7\x85\x32\x3a\xda\x29\x93\x96\x71\x79\x54\xe5\x4e\x97\x2a\xca\x8d\x2e\x4d\xa1\xb2\x5c\x45\x6e\x3d\x7e\x96\x19\x5e\x1b\x79\x4b\xe7\x64\x5b\x75\x93\x6d\xe2\x6d\x1c\xe9\xe6\x94\xcb\xce\x29\xca\x42\x55\x9f\xc6\x5b\x64\xfb\xdb\x38\xad\x77\xa1\x47\xb3\x3c\xbe\xc3\xa3\x44\x8d\xb3\x8d\x19\xa8\x43\x1e\xe3\xdb\xd6\xf6\xaa\x2a\xcc\x46\xdd\x1e\x95\x56\xde\xfe\x03\xa5\xd3\x0d\xef\xd0\x5e\xbc\xd7\x1b\x43\x8b\x19\xa1\x83\xce\xcb\x38\xaa\x12\x9d\xfb\x9f\x32\xbc\xdf\x0b\xbc\xf7\x26\xc7\xe6\x74\x76\x0b\xd0\x16\x54\xea\x04\x22\x3c\x78\x0e\x3a\x0c\x62\xeb\xcb\x81\x8a\x53\xa1\x7b\xa4\x0b\x83\x1f\x51\x52\x6d\xe2\xf4\x4e\x1d\xb2\x5c\xb6\xc6\x26\xb9\xc9\xb6\x0c\xe3\x0f\x04\x63\x90\x98\xa8\xcc\xb3\x34\x8e\xd4\x55\x5c\x08\x0e\x74\xe0\x8d\x89\x76\x3a\x8d\x8b\x7d\x0d\xb8\xc6\xbf\xf6\x99\xba\x33\xa9\xc9\x75\x92\x80\x6a\x51\x64\x0e\x25\x90\xc4\xc9\x04\x61\x91\x6d\xcb\x07\x9d\x1b\xb5\x31\xf7\x26\xc9\x0e\x7b\x48\x00\x61\xb2\xaf\x52\x12\x84\xad\xc5\xcd\x34\xc7\x96\x39\x76\xdf\x9a\x9c\x70\xdc\xe8\x52\x33\x6c\x6f\x19\xb6\xaf\x26\xaa\x4a\x7d\x9b\x34\xd4\xf3\x49\x4a\x47\xea\x94\xf7\xdc\xab\x8c\x30\x23\xb6\xa4\x6a\x99\x55\x79\x64\x78\x09\xef\xf5\x23\xed\x15\x92\xcc\x82\x70\x57\x02\x96\xc9\x5b\x0c\x89\xd3\x4d\x7c\x1f\x6f\x2a\x2c\x00\x80\x56\x68\xe3\x0d\xfd\xb1\x8d\x71\x9c\x96\x65\x27\x9b\x38\xac\xbd\x23\x55\x9a\x41\x28\x8c\xca\xcd\xbf\xab\x38\x17\xd1\x0a\xbe\xee\xe2\xdb\xb8\x54\x23\x86\xe7\x27\x82\x67\xa2\xf3\x3b\x7c\xff\x31\xcb\xbf\x78\x14\x7e\xc0\x4f\xf5\xb0\x8b\x89\x83\xcc\x7d\xd3\x41\x19\xd0\x75\x79\xa9\x1e\xe2\x92\x96\xcb\xd1\xea\x8e\x96\xa7\x72\x2e\x81\x56\x9a\x7c\x5f\x88\xfc\xc4\x85\x9a\x00\xb4\xb4\x10\xba\xfc\x8d\xe1\x90\x07\x1e\x35\xb0\x6a\x93\x45\x15\x31\x8e\x97\xfd\x4c\xcb\x5a\x62\xd6\x00\x0c\xea\xeb\xcd\x86\xad\x01\xe9\x31\xa0\xdb\x80\xb3\xfc\x73\x9b\x67\x7b\x91\x88\xea\xb6\x28\x75\x1a\x31\xf0\x90\xb0\x2a\x2a\x2b\xc8\x07\x20\x32\xb1\x65\x5a\x8f\x46\xd0\xd6\x87\xdc\xdc\xc7\x59\x55\x74\xec\x81\xfa\xb8\x33\x69\x47\x12\x0a\xd0\x3b\x31\xba\x10\x5e\x69\x55\x98\x3c\x36\x8c\xf6\x36\x4e\x0c\x14\x43\xb7\x36\xc1\x07\xbf\x9c\x9d\x8d\x86\x6a\xf4\x1c\x0c\xc8\x5a\x81\x1a\xbc\x9d\xe6\x0d\xf9\x91\x86\x1d\x84\x6e\x9d\x80\xfe\x08\xd8\x67\x67\xef\xe4\xbc\xd4\x3c\xc8\x26\x62\x15\x65\x27\x21\x26\x59\x94\x7e\x5d\xff\xd6\xbe\x30\xc2\xaf\x89\x49\xad\x2f\x6a\x26\xf9\xb2\x89\xad\x21\x57\x07\xd8\xdd\xbc\xd1\x54\x16\x1d\x11\x3a\xe2\xbd\x29\x22\x58\x81\x46\xa3\x9f\x2b\xdb\x44\xf8\x8e\xb9\x25\x03\xc5\x1b\xe3\xcf\x52\xa4\x31\xde\x33\x14\x71\x59\x73\x4c\x55\xe9\x86\xa5\xa0\x11\x4f\x82\x83\x64\x59\x27\x70\x0a\x9b\x63\x9b\xd7\x6d\x01\xef\xc8\xf4\x1b\x76\x47\x1e\xc8\x2d\x35\x07\x05\x61\x68\x68\x27\xb1\x19\x42\xe8\xd6\xee\x64\xa0\xf6\xfa\x0b\x31\x76\xdf\x32\xca\x10\x8e\xb8\x1c\x78\x36\x15\xe6\x8f\x96\x54\x10\x2f\xbc\xa9\xf9\x08\x27\x93\x54\x56\x35\x8a\x22\x8b\x62\x2d\xd6\x11\x24\xdf\xea\x88\xec\xa2\xf3\x9f\x4e\x34\x89\xde\x87\xd2\x3a\x22\x1c\xc3\xce\x31\x4b\x98\x53\x71\x22\xf2\x4a\x94\xc4\xe6\x25\x0e\xad\x1d\x02\x4c\x5d\x63\x21\x07\xac\x34\x2a\x81\x0d\xa7\x77\x85\x50\x80\x59\x0b\x2c\x80\x35\xd9\x32\x2d\x9b\xea\x3c\x2e\x08\x25\x7d\x47\x00\x97\x4f\xe8\xa1\x58\xd6\x07\x03\x74\xbf\xa4\xd9\x43\x0a\x5e\xde\x6b\xc0\x85\x43\x3b\xb6\xc9\x91\xb3\x89\x05\x0a\x15\xed\x32\xb0\x67\xa8\x56\x1d\x49\x8a\x00\xfd\xad\x98\x70\x86\x29\x37\x05\xa1\x4f\x27\xe6\xd1\x2e\xbe\x07\x08\xc4\x23\x72\xd9\x19\x2c\xb3\x11\x67\xac\x0f\xf8\x09\x27\x0e\x9a\x82\x90\xee\x3b\xa6\x07\x29\xee\x4b\xf9\x96\xb8\x53\x4b\x37\x04\xe4\x01\xdf\x93\xab\xaa\xc1\x26\x26\xa7\x20\xf4\x8e\x8c\xb0\xc8\x0d\x07\x18\x9f\xb2\xca\xb3\x6d\x1d\xaf\x00\xe2\x9a\x3b\xfc\x69\xbd\x83\xf9\x6a\xf2\x28\x2e\xe8\x2c\xd0\x6c\x47\xfc\x23\x39\x16\xa1\x27\xc8\x92\x23\xbd\x63\xe3\x4c\xa2\x62\xa9\xe3\xcc\xf1\xa0\x2d\xf0\xbc\xff\xb6\x62\xcb\x78\x6f\x03\xae\x8e\xcd\x06\x26\x45\x05\x3a\x88\xba\x2c\xe1\x3f\x69\xd1\x8f\x14\x80\x5d\xe3\x73\x0f\xb8\x98\xa4\xca\x61\x23\x02\x6b\x44\x22\x2d\xec\xce\xc3\xb0\x9c\x51\xd4\x50\xb8\x1f\x09\xeb\x15\x0b\x53\x6c\x31\x62\xef\x8d\x93\x9c\x58\x32\x46\xd8\x5b\x8e\x3d\x54\xf9\x21\x2b\x4c\xe3\x61\x1a\xf9\x26\x18\xec\x47\x35\x55\xcf\xf5\x85\x68\x62\xf6\x40\xb4\xda\xc0\x8a\x44\x25\x9f\x96\xca\xdf\x03\xd6\x00\x0d\x5d\xe0\x75\xf2\xd0\x32\x78\xaf\x53\x7d\x67\x38\xa2\x20\x11\xaf\xea\xf8\x72\x00\x8c\x0c\x8b\x29\x6c\x02\x1f\xa9\x65\x57\x96\xdd\x87\xb8\x10\xf5\x38\xbf\xbd\x50\x10\x60\x90\x77\x17\x1f\xc4\x37\x6c\x41\x0d\xf8\xf1\x88\xf6\x3c\x7f\xfb\xfa\xff\x5d\xf0\x39\x59\x5e\x4b\x73\x56\x95\xe4\xbd\x58\xe3\x0b\xc8\x8b\xc4\xaf\xb7\x88\x7f\x60\x1a\x48\xa1\x5a\x1b\x7a\x30\x41\xac\x20\x53\xbe\xc8\x37\x76\xea\x92\x98\xb6\xea\x0d\x28\xde\x23\x1a\x2a\x87\xea\xac\xff\x2d\x79\x7c\xa0\x78\x47\x8b\x0a\x62\x82\xc4\x0c\xc9\xe6\x25\xc9\xf8\x40\xe5\xd9\x51\x27\xe5\xf1\xe5\x36\x37\xf8\x95\x66\xe9\x4b\xf3\x15\xec\x2f\xe2\x7b\x03\xd3\xc0\xc7\x0f\xc8\x21\xff\x8b\xa8\xce\x81\x77\x9c\x6f\xd8\xeb\x1c\xd9\x44\x25\x14\x96\x91\xbc\x93\x9a\x19\x7a\x1a\x25\x3a\xde\x93\xb3\x64\xce\x65\x64\xa4\x70\x8c\xc1\xfb\x4d\x15\xe1\x4f\x36\x92\x47\xe2\x64\x71\x48\x34\xfe\xc0\x67\xa2\xb8\x38\xc6\x1e\xc9\x2a\xb1\x71\xd1\xa5\xe9\x31\x34\xe7\x3d\x71\xcd\x85\x48\x1a\xde\xd0\xbf\xe0\x43\x37\xd6\x25\x9d\x29\x6a\x97\xa9\x95\x17\x52\xfd\x4a\x47\x02\x66\x30\x5c\x64\xf8\xa0\xc5\x83\xc3\x80\xd1\x77\x74\x82\xde\x92\x17\x24\xf6\x6d\xea\x94\xc4\x29\xc0\x29\xe9\x59\x2e\xe1\x18\x80\xf2\x4e\x83\x9a\x94\x08\x0c\x88\x1a\x8c\x5c\x41\xd6\xf1\xfc\xf3\xe7\x75\x19\x27\xf1\x9f\x70\x3a\x17\xcf\x45\x72\xa0\x40\x12\x58\xab\x84\x2c\x94\x4d\x85\xcc\x57\x02\x56\xc2\x03\xd2\x5a\x96\x2a\xc1\x40\x22\x1d\x0d\xf3\x0d\x43\x46\xa1\x44\x04\xfb\xa7\x73\xfe\xd4\xa4\x6c\xdc\x48\x2a\xf0\xcb\x82\xf2\x6c\x62\x13\x1a\xe4\x73\xf1\x29\x9d\x79\xc7\xc9\x5a\xde\x82\x65\xaf\x8f\x64\xb3\x5b\x87\xba\x63\xb6\x55\xce\x0a\x78\x92\xc9\x78\x59\x4c\xc1\xa2\x0f\xad\xf0\x13\x39\x27\xf0\x01\xa5\x2d\xfe\x8b\xff\x3b\xb2\xde\xa6\x89\xa4\xc1\x2c\x65\xcc\x58\x1f\xe7\x7e\xd6\x58\xff\xcc\x61\x00\xe4\x59\xe2\x12\xda\x41\x17\x31\xf4\x40\xd4\xe4\x94\xfa\x03\x52\x8f\x6e\xf6\xf0\x5f\xa6\x31\xad\xe4\xb9\x23\x7f\x3d\x89\xfb\xff\xa0\x36\xfc\x05\x68\xfe\x9b\x94\xe2\xfb\x61\x3b\xf9\x9e\x41\x9a\xee\xbc\xb7\xf0\x16\xa3\xc3\x21\x71\xc9\x0b\x78\xe7\x7c\x89\x38\x8a\xf6\xfe\xe2\xdd\x09\x71\x11\x35\xae\x27\x64\xfe\xe3\xba\xfa\xa2\x28\x42\x7a\x56\xc6\xe8\x47\xbe\xce\x1e\x27\xf1\x3e\x2e\x05\x24\x17\x8e\xb0\x7a\x77\x63\x3d\x2f\xa0\x69\x89\xa3\x25\x5d\xa3\x2d\x10\xab\x14\x7c\x74\x09\xc1\x23\xa0\x3c\x2b\x58\xaa\xd3\xc1\x93\x70\x49\xb8\x4a\x74\xd8\x57\x08\x7e\x6d\x7c\xc4\x61\xe8\xe1\x78\xb2\x0f\x2b\x17\x9c\x40\x7e\xf4\xde\xb7\xd1\xa3\xad\x1a\x1c\x86\xb2\x35\x50\x23\xc1\xc9\xb6\x5c\xd9\x40\x7c\xb3\xa7\x30\x89\xa5\xc8\x22\x25\xc5\x8b\x3e\x3a\x89\xa8\x27\x58\xc7\xc2\x82\x98\x03\x7b\x47\x65\xe1\x42\x60\x12\x04\x92\xed\xc7\x70\xb7\x35\x16\x44\x4e\xf1\x21\x26\x25\x7e\xe1\x42\x54\x12\x6c\x26\xc8\x50\x7d\x40\x04\x76\x4f\x7e\xcd\x81\x5b\x13\x22\xad\x33\x62\x18\x47\x57\x0a\x10\x4c\x88\xfb\x0c\x44\xb3\xc0\xee\xdc\x4a\x1b\x1d\xb5\xbf\x1f\xbe\x65\xf9\x85\x4c\x8c\x24\xf8\x86\x5e\x94\x4c\x44\xbf\x48\xa3\xce\x28\x2d\x6e\xe5\xe7\x7f\x45\x86\x99\x8d\xb7\xe2\x92\xbd\x20\x3f\x6e\x55\x82\x24\xe3\x7b\x4a\xb2\x1a\x4b\xcb\x95\x0b\x8d\x64\x75\x6f\x36\xb1\xe6\xa2\x82\x9f\x6e\x35\xb4\xcf\xd5\x3d\xbd\x4f\x9b\x4a\xd8\x93\x25\x35\x6b\x4e\xb2\xd4\x08\x4e\xd9\x5e\x1d\x99\x09\x42\xfd\x9e\x53\x6a\xac\x7e\x95\x4c\x70\xdb\x45\x96\x60\x78\xf2\xdc\x81\x90\x2a\x37\x7b\x1d\xa7\x9d\x74\x08\x12\x47\x0a\x03\xa3\x86\x4c\x0f\x1e\xf4\xfc\xcd\xe5\x05\x1c\x5e\x5a\xee\x80\x39\xdb\x7d\x0e\xc7\x89\x15\x31\x29\x0d\x87\x47\x09\xe9\x6f\x44\x54\xaa\x37\x93\xb0\xcc\x6d\x56\xc4\x5f\xd5\xf9\x8f\x9d\x8d\x34\x97\x84\xcc\xbf\x2b\x12\xab\x96\x0c\xb7\x6b\xaa\x2d\x81\xd8\x81\x03\xb7\xc6\xa4\x5d\xc4\x41\x40\x76\x08\x8d\xb0\x8b\x02\x92\x61\x83\xe2\x1c\x60\x10\x63\x87\x23\x58\x5c\x59\x11\xb6\xe5\x88\x3e\xed\x13\xf2\x14\xde\x19\xd0\x93\x94\x68\x4e\x5f\x3c\xcd\xdc\x98\xaa\xc4\x31\x17\x03\x5c\x61\xd9\x0b\x3d\x58\x1f\xc8\xde\x1b\x49\xfb\x7b\x2b\xde\xea\xac\x36\x4f\x92\x0a\x51\x02\xd9\x32\x9d\xb5\x2e\x1c\xdb\xba\x60\xcb\x07\xcc\x5f\x29\x32\x39\x05\x76\xaa\x4b\x60\xde\x99\xc2\xaa\xbd\x6c\x65\x75\x8c\xc9\xd2\x3a\xc6\x15\xc1\x99\xef\x5c\x72\x38\xda\x0d\x86\x7d\x16\x14\x91\xd2\x1e\x58\x83\xad\xc8\x99\x4a\xc9\xd4\x6a\x5a\x77\xea\x6f\xb0\x18\x39\x42\xb5\x8d\x4b\x02\x21\x4b\x5e\x1a\x98\x20\xba\xe2\xfa\x5b\x3b\x74\xad\x8b\x01\xd6\x55\x9d\x66\x48\x52\x28\x71\x9e\x8a\xd6\xa4\x7a\x5f\x67\x73\xbd\x05\x5c\x97\x93\x7a\xc2\x20\x3e\x82\x82\x21\x5b\x63\xb6\x85\x2f\xfe\xf5\x88\x19\x80\xc7\xe1\xb8\xce\x11\xdc\x22\xea\xdb\x32\x67\x24\x25\xb3\x64\xcc\x38\x4b\xf5\x53\xc8\x6e\x45\x8a\x05\xe6\x87\x21\x40\xf7\x42\xd6\xb9\x0b\x59\x6f\x74\x49\x6e\x42\x42\xd6\x15\x8b\xd9\x9c\x23\xdc\x31\xc7\xb2\x90\xa4\x70\xcb\x47\x73\xd2\x42\xf5\x1b\x84\x6b\x77\x96\xd5\xda\x46\xc3\x12\xf7\x4a\xc5\xa3\x2f\x2e\x66\x13\x4f\x98\x78\xca\xb9\xad\xd2\x48\x3c\x00\x1b\xf4\x5c\x4a\x4d\x14\x46\x51\x69\xaf\xe2\x00\x48\x28\x70\x5a\xde\x43\x60\x75\x3c\x15\x9e\x12\x51\x95\x88\x2c\xfb\x5c\x69\x26\xf8\x55\x2c\x4f\xdb\x90\x60\x53\xd8\xf9\xf9\xf3\x24\x78\x3f\x9a\xbc\x78\x61\x69\xec\xe8\x6b\xdb\x41\x84\x56\x2d\xc2\x82\xaa\x2d\xed\x35\xaf\x81\x55\x51\x6d\x29\x97\x27\x61\xdd\x18\xa8\x4e\xe2\xa8\x53\xdb\x14\x40\x64\xab\x5f\x62\xad\x9d\x96\x45\x48\x5c\x40\x5f\x42\x26\xbb\x65\xa5\x63\x5b\xd4\x90\x59\x0c\x9e\xa8\xda\x17\x8e\x14\x3a\x66\xad\x31\x32\xfa\x51\x1f\x7a\x29\x3e\xba\xd8\x91\x15\x20\x15\x3b\x90\xb2\x48\x32\xc2\x98\x30\x11\x84\x74\x24\xa0\x09\x55\xf9\x0e\x71\xad\xe3\x5f\x5a\xf6\xb2\x09\xe4\x39\x71\xe5\x4d\x4b\x5a\x23\x19\x44\x51\x9a\x43\xa1\xce\x19\x0f\xcd\x55\x58\x9c\xc2\xe5\x4e\xaf\xf4\x06\xfb\x96\xd0\x33\xaa\x36\x72\x88\x92\x9a\x87\xe2\x2e\xcf\xaa\x43\x71\xe1\x07\xe4\x91\x4e\x48\x5a\x4a\xa9\x6b\xc6\x29\xfb\x60\xc4\x8e\x14\x57\xed\x32\xa2\xaf\x21\x13\x70\x5a\x85\x65\x06\x50\x9d\xbc\x21\x65\xed\x00\x84\xd2\x66\x33\x94\x6c\xc5\x8f\xe6\x47\xf3\xb0\x11\xf9\xfc\xc4\xe2\x90\x93\xf6\xc2\x68\xe0\x83\xe4\x72\xbf\x27\x4c\x9a\xfa\xac\x0b\x0e\xa1\x94\x5e\x92\x53\xa7\x43\x22\x68\xe2\x5d\xfa\x13\x0f\x44\x7a\x89\x67\xfa\x00\x93\x27\xee\x3a\x29\xb2\x5a\xe6\x59\x27\x84\x2a\xb5\xb1\x68\xf3\x93\x95\xff\xed\x50\x2d\x5c\xc1\x7d\xca\x76\xa8\xe5\x21\x36\x95\xa0\x24\x56\xa5\x31\x54\x4d\x61\xde\x35\x05\x59\x42\x4e\x03\x58\xd7\xeb\xf4\x4b\x8d\x62\xf5\xda\xa6\xcc\xf5\xee\x5a\x9f\x3e\x90\x3c\xb5\x8d\x5b\x4f\xdc\xc9\xb6\x91\x15\x2f\x6b\x1b\x37\x65\xcd\x93\x4b\x8a\x29\x26\x72\x15\x38\x9f\x7d\xe7\xc5\x45\x13\xa9\x22\xfa\x24\x8a\xe6\x62\xda\xb9\xdf\xe3\x4b\x81\xcd\x1b\x2d\x25\x5a\x4a\xd5\x34\xe2\xe8\xe0\xb8\x74\x8d\x06\xc4\xe6\x12\x26\xe0\xdb\x03\x65\xa0\x24\xfe\x9e\xcd\xf7\x2d\x5f\x2b\xa8\x64\x0f\x5b\x19\xe9\x0e\x14\x4d\x7b\x8b\xca\xbb\x90\xd5\x13\x33\x77\xb2\x71\x92\x59\x69\xac\x55\x4e\x73\xee\x72\xaf\xc9\x1c\xb1\x2f\xcc\x20\x57\x74\xd0\x85\x25\xb6\xa6\xc2\x44\xae\x1e\xb2\x2a\xd9\x50\xdc\x9b\xc4\x5f\x6c\xba\x9c\x64\xd9\x17\x66\x93\xec\x65\x0f\x6a\x32\x92\x68\x97\x91\xee\x51\x9f\x8b\xa2\x79\xcb\x78\x57\x08\xa7\x88\xc1\x70\xa4\x04\xb6\xea\x9c\xea\x2e\x47\x2a\x6d\x1c\x28\x31\xa6\xfc\x6f\x63\xf6\xa9\xb5\xf6\x49\x5c\xc7\xf2\x4d\xae\xca\x1b\x7b\x0c\x6c\x04\xa1\x9b\xfa\xf5\xa4\x1f\x1b\x04\x72\x99\xe4\x7f\xa0\x06\xeb\x2f\xa9\xe0\xad\x81\x85\xda\x36\x99\x78\xe6\x1e\x3d\xee\xd2\x6d\xf7\xd0\x6f\xc9\x37\xc1\x0a\x9b\x43\x30\x5e\xdf\x16\x59\x82\x88\x89\xac\x14\x62\x55\xdb\x3a\xae\xeb\x0b\xff\x19\xfc\x49\x98\x98\xae\x12\x9f\x70\x14\x9a\x80\x1e\x4d\xc2\x69\x4b\x5a\xfa\x2e\x37\x22\x32\xb2\xe5\xf6\x5b\xc1\x8c\xe4\x9e\xbe\x7c\x6f\x2d\x82\x0d\x0c\x90\xae\x2a\xcf\xbf\x15\x16\x39\x99\xf0\xf7\xb1\xb2\x56\x54\x09\x97\x83\x9e\x8f\xb2\xe4\x4e\x6c\x24\x09\x5d\x36\x52\x3f\x76\x4a\x18\xd8\xd0\x0b\x93\x6c\x99\xa5\xb6\x5b\xc4\xef\xa6\x46\xd6\x6d\xea\x7b\x1f\x4a\x9f\x8e\x84\xc2\xc6\xdf\xb6\xf5\xb8\x77\x52\xd5\xb8\xc9\x37\x2f\x61\x2a\x25\xce\x91\x44\xc1\x94\xd6\x64\x75\xa2\xda\x81\xcb\xa1\x08\x94\x26\xfe\xb0\x5a\x49\x91\xeb\x93\x39\x42\x5f\xe7\x30\xf6\x53\x86\x27\x12\xcd\x56\x1f\xd1\x9a\xa8\x3a\x17\xd8\x21\xcc\x90\xce\xa9\x33\xad\x8c\xd4\xb6\x4a\x60\x05\x12\xeb\x2e\x7d\xb5\x6b\x91\xc1\xd6\x5f\x2c\x36\x2e\x37\x86\x1b\x2b\x0e\x30\x60\x59\x55\x24\x75\xaa\xbf\x79\x66\x74\x3b\x78\x24\xb6\x65\xf7\x48\x0d\x49\x9a\x05\x79\x24\xd2\x7d\xc2\x19\x9c\x44\xbb\xaa\x47\x3e\x38\xef\xea\x89\xb9\x3b\xe5\x24\xa1\xb9\x76\xc5\x5f\x7a\xcf\x66\x44\x5a\x90\x03\x0b\x1d\xdb\x41\x9b\x22\x09\x6f\xea\xfe\xa8\xeb\xf8\xfb\x7c\xf2\xda\x8f\x90\x07\x97\x59\xc6\xa9\xb4\xf8\x62\x9e\x6b\xa8\xe3\xd5\xfe\xa2\x82\x78\x57\x2b\x4d\x0e\x38\xe7\x4c\x7b\xf0\xda\x64\xc6\xb6\xbf\x11\xdb\x23\xd8\x63\xcb\x4e\xa5\x36\xb6\x6c\x89\xcb\xc5\x6b\xca\xbe\x28\x1c\x65\x7b\x3a\xf6\x6e\xd3\x7a\x98\xc1\x2e\x2d\x44\x3b\x00\x38\x7f\xe4\xb5\xd1\x9d\x4b\x7e\x9a\x01\x8e\xe0\x0d\x01\x1d\x76\xcf\x32\xb7\xa5\x57\x0d\xb3\xf1\x3b\x6f\x74\xca\x06\xa6\x79\xbf\x69\x25\x3a\x7d\xcb\xea\xf5\x7a\x82\xff\xd5\x76\xb8\xf6\x41\x7d\x66\xf6\xa7\xa1\x5f\xb4\xf7\xed\xa9\xcd\xe1\x5b\x45\x7d\x69\x87\x52\xa9\x99\xd4\xad\xa5\x2c\x5e\xd3\xe0\xaf\x8d\x0e\xf5\x35\x38\xfc\x23\x65\xfc\x06\xe7\x25\x9c\xae\x6f\x2a\x4e\x92\x52\x17\x92\xd0\x60\xda\xa0\x23\x1f\x05\x15\x72\xfb\x8c\xfb\x89\x0c\x34\x36\xd0\xe9\x4f\x27\x55\xe6\x44\xb9\xf6\x53\x14\x6c\x52\x23\x5e\x5d\x49\x88\xb6\x84\xe1\xaa\xa4\x98\xb8\x30\x77\x95\x8c\x52\x48\xc2\x20\xb1\x20\x57\x69\x9b\x82\x91\x6d\x1e\x48\x37\xdf\xb6\xf2\xd3\x63\xb7\x95\xdf\x53\x30\xa6\xca\x93\x6d\x3b\x15\xd9\x5e\x2a\xd6\xcd\x0c\x40\x8b\x11\x36\x7a\x2c\x1a\xd0\xf2\x1a\x34\x09\x22\x1d\xb1\x7e\xe1\x4a\x85\x0f\xcc\xe3\x50\x58\xd3\xba\xd7\x5f\xe3\x7d\xb5\x77\x0d\x0b\x87\xdc\xaf\x75\x79\xa3\x55\x91\x68\xea\xf9\x45\x9d\x36\x47\x92\x8e\x19\x68\x0b\x84\x90\x78\xb9\xac\xea\x4c\x5b\x5c\x96\xf3\x31\xbe\x57\xe9\xa4\xa5\x8f\x64\xb6\x3f\xf0\x31\x27\xdf\xd7\x33\x13\x7e\xce\x5f\xf4\x64\x2e\x43\x58\x25\x2a\xba\x76\x5a\x45\x10\x3b\x0e\xf3\x6d\x93\xad\x8f\xb2\x03\x91\xc7\x3e\x34\x9a\x72\x00\xc8\x2c\x05\x01\x2b\x6f\x7e\x45\x00\xc0\x64\x39\xfc\x37\x25\x7d\xc5\x17\x2a\x0f\x00\x06\x7c\xed\x8a\x92\x6c\x1b\x79\x72\x00\xa2\x05\xc1\x7c\x7b\xd2\xc2\x69\x1b\xdd\xb3\x55\x4b\xd6\x69\xa9\xcc\xc6\x46\xad\x72\x5f\xbf\x55\xa1\xdc\x18\xce\x02\x39\x9e\x8d\x0e\x7a\xb2\xc0\x3a\xd8\x77\xbe\xbc\xa3\x39\x08\xe0\x5c\x94\xe6\x28\xdd\x0c\x2c\xf0\x94\xc9\x14\xf9\xb8\x17\xc8\x4d\x4d\x59\x44\xfa\x40\x9c\xe0\xe9\x4e\xd7\x7e\x1a\x67\x39\xa2\x47\x9b\xd4\x7c\xfe\xec\x96\x51\x4f\x9c\xec\xd4\x81\x5a\xa5\x05\xa9\xc8\x7d\xcc\xe3\x7a\xe9\xe6\x95\x54\x10\x9c\x5f\xe9\x9e\x6f\xfd\x01\x4d\x8e\x11\x9f\xf1\x2f\xf8\x4e\xf9\xac\xf3\x43\x5c\x9d\x01\xed\xef\x62\x2a\xd4\x6a\x16\x1b\x18\xa0\x0a\xc7\x90\xdd\x73\xcb\xd2\x6a\x7f\xcb\x66\xf4\x47\x0a\x92\x02\x16\x67\x3a\xaa\x83\xd7\x2c\x8d\x3a\x2a\x5a\x97\x1e\x2c\xec\x75\x57\xa9\x95\x17\x76\x62\xc3\x3a\x82\xa8\xb3\xd6\xe4\x41\x1f\x65\xd0\x26\x4e\x45\xe9\xa9\xb4\x0b\xde\xf4\x06\x8b\xba\xae\x8d\x0f\xbd\x2d\x8a\xcc\x4b\xe2\xe8\x73\xeb\x4d\x4e\xc2\xa0\xd6\x6e\xe2\x52\xfa\x6b\xee\x0d\x99\x1b\xec\xa0\x35\x8e\x6d\x60\xbb\x4d\xea\xca\x7a\xc0\xb6\xe6\xfc\xce\xce\xc5\x4a\x81\x90\x06\x24\x9a\xa2\x94\x1c\xee\x75\xab\x3a\xa9\x7f\x9d\xf2\x9f\xd6\x07\x99\x45\x5c\x23\xcf\xe3\x7b\x08\x12\x82\x5f\xe7\xed\x6c\xb5\xad\x69\x0a\x71\x75\x5c\xd5\x2d\xf1\xc7\x5a\x62\xe7\x4d\xb5\x9c\x08\xc9\x19\xc5\x86\x1c\x3f\x69\xb1\xe1\x9a\x01\x81\x7a\x24\x76\x38\xa5\xab\x47\x22\xff\xf2\x28\xa2\x5f\xe0\x24\x9b\x8d\xd8\x88\x2a\x15\x1c\x8d\xba\x10\xa9\xc8\x9a\xa0\xf0\xb0\xcb\x35\xcd\x50\xd1\x9c\xed\x9f\x10\x66\xfd\xe2\x05\x0d\x4f\xd9\x89\xfc\xf9\xa4\xfe\xe9\xfe\x6c\x94\x8a\x7f\xd1\x63\x17\xec\x40\xbe\xb6\x15\xfb\x5f\xf0\x1c\x06\x9d\x44\x53\xf6\x27\x84\x19\x95\xc3\x81\x22\x30\x2c\x96\x0c\x23\x4e\xa5\x9a\xe2\x4f\x30\xf0\xa8\x94\x1b\x9e\xaa\xa3\x38\x2f\x74\xe3\x2f\x3a\x82\xe4\x36\xa8\x47\x5a\x1f\x8f\xed\xa8\xba\xc3\x98\xaa\x39\x8f\x4e\xb4\xa2\x8b\x5a\xbe\xda\xef\x86\xea\xfc\x1a\x9f\x48\xb9\xee\xe9\xd2\xfe\xe0\x74\x98\xd1\x8f\xba\xdc\x16\xdf\xaa\x12\xd9\xf2\xa8\x34\x72\x69\xf9\xbe\xa0\xe6\x58\xc1\x5d\x6b\x83\x38\x65\x63\xad\x7e\x7b\x54\xb4\x6b\xdc\x2f\xce\xce\x10\xb7\x5d\x85\xcb\xf1\x64\x14\xde\x04\x0b\x35\xbb\x56\x1f\x47\x8b\xc5\x68\xba\xfa\x04\x99\x1e\xcf\x7e\x0f\x16\xc1\x95\x1a\xcf\xae\x02\x15\x2e\xd5\x7c\x31\xfb\x3d\xbc\xc2\x83\xf5\xf4\x0a\x8b\x57\x1f\xf0\xcc\xdd\xc6\x98\x4d\xd5\x68\x0a\x96\x8f\x96\x58\x09\xa6\xbf\x1b\x2d\xc3\xe5\x40\x7d\x0c\x57\x1f\x66\xeb\x55\xbd\x2b\x9d\x30\x9a\x7e\x52\xbf\x85\xd3\xab\x81\x0a\xf0\x16\x1b\x05\x7f\xcc\x17\xc1\x72\x89\x8d\x67\x0b\x15\xde\xcc\x27\x61\x80\x97\xe1\x74\x3c\x59\x5f\x85\xd3\xf7\xcd\x2e\x93\xf0\x26\x5c\x8d\x56\xe1\x6c\x3a\x70\x3b\x86\xc1\x12\x80\x8c\x56\xf8\x7f\x81\xea\x02\x7c\xbd\x08\x02\x3a\xf1\x2a\xb8\x0e\xc6\x2b\x80\x03\x1c\xc7\x1f\xf0\xd5\xe8\xdd\x24\x18\xa8\xeb\x70\xa5\xae\x71\xe4\x48\xcd\x47\x8b\x55\x38\x5e\x4f\x46\x0b\x35\x5f\x2f\xe6\x33\x42\x68\xa1\xa6\xb3\xe9\xcb\x70\x7a\xbd\x00\x0c\xf8\xdf\x21\x1f\x11\xe0\xc8\x45\xa0\x16\xe1\xf2\x37\x05\x5c\x57\x33\x7e\xfa\x8f\xf5\x68\x12\x02\xbb\xd1\xf4\x4a\xcd\x83\x05\x36\xbd\x19\x4d\xc7\x7c\x76\x1f\x5c\x84\x8f\xfa\x34\x5b\x23\x66\x01\x5e\x93\x2b\x26\x49\x6b\x11\x91\x3a\xb0\x70\x87\xf8\x2b\x9c\xf2\x1a\x90\x69\x8e\x27\x03\xfa\x58\x9d\x4f\x67\x82\x76\x38\x0d\x57\x21\x22\x9a\xab\xe0\xf7\x60\x32\x9b\x13\x1f\x17\xbc\x7c\xc6\xe4\x1d\xcf\xa6\xab\x45\xf8\x6e\xbd\x9a\x2d\x2e\x00\xf3\x72\x7d\x13\x58\xa8\x96\x2b\xc7\x8f\x69\x30\x06\x07\x46\x8b\x4f\x6a\x19\x2c\x7e\x0f\xc7\x4c\xf6\x45\x30\x1f\x85\xbc\xd9\x78\xb6\x58\x10\x24\xb3\xe9\x50\xd8\xde\x2f\x33\x74\xd4\x72\x15\xae\xd6\x2b\x70\x05\xe2\x40\x4c\x9d\x32\x68\x44\x60\xa1\x46\x23\x33\xb0\xe0\x33\xb5\x5e\x06\x0e\x86\x2e\x95\x46\x6b\x70\x7d\x11\xfe\x13\x8f\x80\x46\x20\x42\x17\xfc\x31\x0e\xe6\x2b\x5f\x02\x1b\x50\x60\x9e\xff\x06\xf8\x82\xc5\x4d\x38\x1d\x09\xb0\x9d\xe8\xc5\xc6\x8e\x36\xd5\xe4\x09\x2e\xa8\x4a\x3d\x7c\x20\x0e\x9b\x8c\x03\xcd\xc0\x60\x3d\x14\x92\x2a\xe0\x11\x77\x94\x6d\x61\x66\xcb\x8d\x98\x76\xf0\x2d\xf6\x84\xf6\x89\x65\x24\xba\x5e\x44\x19\x04\xbb\xc2\xdb\x9c\x4b\xdd\xb4\x1c\x6b\xbe\x7f\xad\x36\xe4\x74\xa1\x91\xb7\x34\x2e\xcc\xf5\x96\x07\xdd\x8c\x77\xca\x72\xc4\x66\x00\xa8\x19\xe2\x2a\xfa\x4a\x13\x5e\xe9\x5f\x3a\x63\xc9\xb1\x46\x4d\xec\x04\xf2\x98\x7b\x72\x56\x2e\xad\x6d\x5d\xde\xf1\x83\xbd\x39\x15\x15\x8a\x66\x58\x67\x60\x33\xae\x98\x4a\xda\x52\x3e\xf6\x3b\xf5\x54\xbf\x97\x68\xe5\xd6\x1c\x33\x4b\xdc\x6f\x1c\xd0\x06\x07\xec\xfa\x79\xe8\xe9\x34\xc9\xc1\x24\x1c\xbd\x0b\x49\x95\xc0\x3a\xe1\x31\x64\x64\x1c\x2e\xc6\xeb\x9b\xe5\x8a\x54\x6a\xc9\x3a\x56\xbf\x92\x50\x1e\xd2\x3c\x5b\x7c\x82\x4d\xf8\x10\xb0\xc4\x43\xd2\x57\xea\xbc\x36\x20\x90\xee\xf7\x93\xf0\x7d\x80\xcf\xe1\x00\x59\x1d\x46\xa4\x44\x10\x6c\xd6\x90\x8f\xe1\x12\xd6\x60\xf9\x61\x34\x99\xf4\xeb\xd3\xa0\x5f\x9b\x06\x4e\xcf\x20\x82\xee\x19\x21\xe1\x0b\x72\xbd\x66\xb9\x9e\x93\x61\x5b\x38\x69\xc7\x3f\xcb\xf5\xf8\x83\x98\x9e\x00\xb6\xe9\x5d\xc0\xd8\x4f\x02\x32\x2a\xa4\xdf\x2d\x25\x06\x14\x4b\x90\xe8\xda\x3e\x84\xf9\x0c\x17\x6c\x09\xc8\x20\x00\x58\xb6\x97\x30\xce\xb0\x6d\x93\x81\xa8\x2c\x54\xec\x1f\x6b\xab\x7f\x57\xa3\x9b\xd1\x7b\x10\xcf\xa9\xda\x87\x11\x91\x00\xfb\x3e\x61\x65\xdd\x77\x74\xee\x64\xb6\xe4\x0d\xde\xcf\x66\x57\x1f\xe1\xff\xf1\xc5\x6c\xf1\x9b\x5a\xae\x66\xf3\x39\x16\x11\x65\x6f\xe6\x6b\xda\xf4\x7a\x14\x4e\xd6\x0b\xb6\xa1\x37\xa3\xc9\xf5\x7a\x3a\x96\xdd\x2c\xf0\xc4\x41\xa2\xb5\x23\xe8\x0d\x99\xe5\x16\x94\x72\x18\x51\x05\x2c\x98\xaa\xd0\xa3\xd5\x27\xcb\xa8\x0f\x23\x98\xc5\x77\x01\xbd\x9d\x92\xbd\x25\xef\x21\xd6\x16\xe6\x7b\x19\x8a\x14\xd5\x54\xb6\x3b\x0f\x9d\x01\xea\x95\x39\xbb\x33\x99\xd5\x11\x98\xf5\x89\x18\xd1\xbc\x24\x12\x5c\x05\x23\x58\xee\x99\x63\x07\x40\x0e\xa7\x7f\x5f\x2f\xd8\x30\xaf\x27\x2b\x92\xb5\xeb\xc5\xec\xc6\x83\xf6\xc5\xd2\x93\x3e\xe7\x2e\x82\x3f\x56\xe0\x0b\x1f\x12\x8e\x99\xe5\x93\xd1\x47\xb2\xf9\x1f\x00\xf7\x6a\x29\x9f\x37\x40\xc2\x4d\xcc\x60\xb3\x71\x50\xb8\xbc\x0a\x99\x96\x30\x7b\x33\x01\x74\x32\x99\x7d\xb4\x9b\x82\x93\x4b\xc6\x69\xd1\xc1\xb0\x11\x8d\x47\x25\x03\x82\x34\x13\x47\xda\xec\x43\x7c\xf2\x36\xba\x19\x7d\x6a\xd3\x86\x3c\xd8\xd9\x19\x5d\xf1\x59\x0f\x41\xda\xf7\x24\xf6\xd3\x1b\xc2\x2c\x20\x1d\x85\x27\x59\xda\x39\xc0\x93\x7a\x34\x4f\xe0\xef\xf7\x74\x53\x81\x2a\xb4\xa5\xd9\x0f\x10\x34\x70\xd4\x4e\xa1\x27\x4c\x88\x72\x23\xfb\x12\xfa\xfc\xf0\x37\x35\x1e\x5e\x0f\x17\x43\x75\x39\x7c\xf3\xfa\x8d\x3a\x9f\x51\xca\xff\xe6\xe7\x9f\xdf\x42\xa5\xa9\x88\x2c\xa9\x15\x59\x9c\xd6\xd6\x27\xb7\x8a\xe8\x98\x74\xf3\xc4\xa2\x76\x3d\xd9\x82\xe6\xd5\xbe\x68\x09\xdf\x8a\x69\x41\xf6\xe6\x72\x78\xf9\xe6\x52\x9d\x2f\x91\xf9\x5b\xd8\x78\xa4\x98\x60\x93\x66\x3d\x5c\xc5\xc9\x72\x82\xc6\xc3\xee\xf2\xa7\xe1\x4f\x97\xaf\x2f\x5f\xbe\x01\x29\xf2\xac\xba\xdb\x35\x8f\x7e\x50\xe7\x7f\xaf\x90\xf1\x58\xac\xc9\x94\x0a\xe1\x39\xda\xe7\xce\x6e\x80\xcd\xd6\x05\xcd\xe7\xe9\x88\x4b\x56\x7d\xc5\x35\xca\x31\xa4\xd9\x7d\x52\x73\x15\x17\x46\x5c\x45\x5e\x7d\x03\xcf\x1a\x20\xce\x9f\x06\xb3\xf5\xb2\xeb\x4b\x69\xfc\xd8\x14\x5c\x10\x93\x72\x0c\x75\x97\xc9\x67\x52\xed\xd2\x5e\xae\x44\xc2\x9a\x73\x85\xcf\x4d\x3b\xef\x79\x2a\x44\xd9\xbb\x9e\x54\xd0\x95\xeb\x74\xd6\xeb\xf4\xdc\x2c\xc1\xda\xc4\x05\xb3\xc0\x9d\x7a\xd2\x91\x91\x79\x2e\x99\xb7\xad\xbf\x15\xdf\xc2\x95\x7d\x6a\xce\xb8\x99\xcd\x76\x05\xa6\xd5\x10\x77\xd9\x83\xb7\x2b\xf5\x28\x4e\xfc\xd5\x6d\x3b\xa1\x1a\xeb\x24\xc6\x07\x69\xac\x55\xa2\x1f\x1a\x08\x0a\x75\x6e\xfa\xaa\x3e\x5e\xaa\x89\xf5\x03\x8a\x23\x80\x75\x5d\xc1\x2f\x9a\x7c\x06\x4c\xe5\x51\x71\x6e\xbf\x50\xdb\x96\x72\x26\x7c\x5b\xbe\xcc\xb6\x2f\xdb\x67\x0d\xd5\xc7\x4e\x3d\x8f\x86\xbf\xf9\xde\x72\xdd\xef\xa8\xa7\xdd\x28\x4d\xb6\xf3\xe5\xa4\x7b\x11\x12\x92\x3f\x69\x60\x61\x2b\x43\x71\xa9\xbb\x7e\x43\xed\xd6\x92\xa5\x45\x6a\x52\x24\xb7\xb9\xe4\x12\x48\xd1\x6e\x29\x7b\x03\xf5\x70\x00\x77\x91\xd5\x3a\xe5\x52\x16\x15\x2f\xe5\x9e\xcd\x08\x0a\x05\x4c\xa5\x1e\x58\xa5\x09\x2d\x6e\x92\x35\x96\x0c\x56\x99\x87\x3c\x26\x65\x1d\xb8\x5a\x9a\xc0\xdd\x6e\xbf\xf8\x39\xb2\x90\x95\x63\xa4\xf4\xe8\x3e\x68\xad\xff\xc6\x7c\x50\x71\xd1\xb0\xd1\x9b\xba\xdf\x72\x02\x46\xca\x77\x1b\xcb\x2d\x1a\x9d\x23\xb7\xca\x6d\x15\xae\x2e\x63\x26\x19\x5f\xa5\x12\xf2\x1d\xf4\xd1\xdd\xb0\x8b\xb2\xc2\x5e\xbc\x6c\x3e\xfb\x95\xd3\x53\xbe\x61\xd7\x3c\x3c\xc5\x6b\x54\xab\x48\x0d\x18\x4b\x39\x95\x20\x11\xb6\x69\x9a\x91\xca\x69\x74\xa0\xe2\xae\x67\x23\x6f\x03\xaf\x86\xa2\x2b\xea\x9b\x09\xdd\xff\x3e\xba\x59\xbe\x82\xea\x5f\x09\x65\x6c\x15\x35\xba\xb0\x5d\x80\xd2\xf5\x81\x9f\x03\x49\xeb\x62\x82\x51\xff\xaa\xf2\xb8\xd8\xc4\x91\x7f\xd9\xfb\xda\x6c\xb8\xb1\x06\x00\xf3\xb2\x2e\x8a\x4d\x33\x9e\x29\x4f\x6d\xbb\x55\x4a\x58\x3e\xec\x4c\xd2\x7b\x43\x25\x26\xb9\x82\xf6\x0c\x7c\xfb\xd9\xd0\x9d\x9f\x64\x5e\x7c\x7b\x10\x9c\x9c\x04\xa0\xb5\x6c\x23\xfa\xd4\x63\x32\x86\x4a\x94\x38\xcf\x20\x1e\xdf\x1a\x23\x6f\xcd\xd7\x03\x07\xdc\xd2\xb4\xd4\xdd\x0a\x69\x2d\xfc\xd3\xba\xb8\x98\xde\x93\x16\xd1\x82\x54\xf2\x79\x4d\x93\xd1\xae\x1d\x40\x53\x72\xb9\x44\xc5\xa0\xdc\x52\xcb\xc0\xcb\xfb\x2c\xdb\x14\xa4\x94\x38\x8e\x2e\x0c\x26\x47\x6b\x00\xcc\x46\xae\xe4\x92\xd2\xb7\x2b\xef\xa2\xda\xb5\xed\x68\xfa\x77\x3a\xbd\xab\xf4\x9d\x4c\x43\x36\x77\xcd\x6a\xbe\x92\x8f\x2c\x73\xba\xa7\xe7\x6e\x57\xf2\xfc\x64\x2e\x23\x57\x4d\x3d\x41\xaa\x4d\x1d\x15\x24\x87\x70\x39\xe4\xf4\x13\xc1\x43\xe8\x45\x44\x9c\x7a\x91\x73\xb0\x05\x6f\x6a\x40\x72\xc9\xc8\x8e\x84\xd8\x5b\x9a\xad\xfb\x33\xf0\xa5\x5b\x29\x5e\x77\xd2\x28\xaf\x00\x3f\x78\x74\x58\x76\xa3\xf7\x9a\xe6\x44\xe9\xb2\x28\x1b\x91\xc7\xc6\x34\x49\x00\x5c\xab\xd5\x9f\xfb\xc3\x33\xff\x62\x64\xa7\xaf\x7a\xcb\xc3\xf9\x76\xd0\x5a\x2a\xb3\x72\x3b\xf9\x60\xef\x6d\xb7\x1c\x6a\x33\x1e\xdd\xcc\x19\x4b\xc3\x88\x05\xbd\xe0\x05\xf5\x38\x19\xd7\x98\x04\x14\xf1\x8a\x34\x1f\xcc\xa0\x48\x11\x5c\x68\x55\x4f\xd9\x6c\x35\xcd\xd8\xb8\xb9\x61\xd7\x13\x94\xab\xf8\xdc\x89\xe0\xdc\xcb\xc8\x00\xaf\xad\xca\x7b\x0d\xb0\x9a\x70\x76\x1e\x84\x9b\xe8\xd4\xc8\x92\x66\x29\x5f\xd2\x01\x63\x83\x3f\x38\xea\xe4\xff\x06\xc0\xe7\xcf\xab\x5d\xfb\x5a\x39\x13\x87\x5b\x25\x3a\x3f\x31\x0e\x8f\x94\xca\xbc\xff\x30\x87\x3a\xa7\x75\xdf\xd9\x37\xdf\x5d\xfc\x5a\x57\x3a\x49\xd6\xe4\x32\xa5\x3b\xc0\x34\x12\xd4\xd3\xc2\xae\x73\x54\x57\x73\xb6\x83\x8d\xba\x75\xfd\xa1\xce\xf4\x4b\xb5\x2b\xcb\xc3\x2f\xaf\x5e\x3d\x3c\x3c\x0c\xf7\x02\xe7\x30\xcb\xef\x5e\xdd\xcc\x27\xaf\xce\xce\x96\x75\xa0\xe7\xdd\xf1\x68\x8c\xab\x17\x7f\xb4\x2f\x81\x10\x09\xbf\xe3\x1a\xd7\x77\xee\x96\xd3\xb7\x4b\x5c\x76\x70\xdf\xea\xb7\xbd\x70\x91\xc4\xa4\xdf\x4b\x63\xda\xdd\x04\x6b\x2a\xc8\xa3\x53\xd1\xae\x51\x69\x89\x3e\xbc\x1b\xbd\x24\x2c\x7e\x53\xec\x04\x72\xf0\x72\x75\x72\xbf\x0e\xd8\xfc\xff\x67\xfd\x8f\xfd\xba\xa7\x4b\xdc\xf7\x5f\x00\xf8\xc6\xb6\x43\x35\x77\x77\x97\xbc\xdb\x65\xfd\x6b\x59\xc0\xc6\xe0\xa5\x14\xed\xcf\xc7\x17\x76\xe1\x63\xbb\x4b\x71\x64\x21\x14\x59\x20\x16\xcd\xef\x79\xf8\xd2\xb3\x35\xe7\xc5\xc5\x2f\xcf\xc5\xf9\xc5\x8b\xb3\xff\x08\x00\x00\xff\xff\x3d\xeb\xd7\x0a\x6a\x46\x00\x00") - -func confLicenseMozillaPublicLicense10Bytes() ([]byte, error) { - return bindataRead( - _confLicenseMozillaPublicLicense10, - "conf/license/Mozilla Public License 1.0", - ) -} - -func confLicenseMozillaPublicLicense10() (*asset, error) { - bytes, err := confLicenseMozillaPublicLicense10Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Mozilla Public License 1.0", size: 18026, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseMozillaPublicLicense11 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\x5c\x7b\x6f\xdb\xc8\xb5\xff\xdf\x9f\x62\x60\xe0\x62\x2d\x40\xd1\x6e\x92\x7d\x66\xff\xd2\xca\x72\xa2\x56\x96\x5c\x49\xde\x34\x2d\x16\x17\x94\x38\xb2\xd9\x50\xa4\x2e\x1f\x76\xd4\x4f\x7f\x7f\xe7\x9c\x79\x91\xa2\x6c\xa7\xb7\x05\x6e\x51\x6c\x64\x69\x38\x73\xde\xef\xe1\x75\xfe\xcf\x24\x4d\x23\x75\x53\xaf\xd3\x64\xa3\xa6\xc9\x46\x67\xa5\x56\xbf\xeb\xa2\x4c\xf2\x4c\xbd\x1e\xbc\x3e\x7b\x3d\x50\x97\x7a\x9b\x64\x49\x85\x6f\xca\xc1\x19\xbe\xf8\x6e\x80\x2f\xcf\x47\xf9\x6e\xa7\x8b\x4d\x12\xa5\xea\xb6\xd4\xe7\x6a\xa7\xa3\xac\x54\x71\x52\x56\x45\xb2\xae\x69\xb5\xca\x0b\x95\x57\xf7\xba\x78\x4c\xb0\xe9\x2e\xfa\x9c\x64\x77\x0a\x7f\xab\x51\xfe\xa0\x0b\x1d\xe3\xdf\x58\xab\xe8\x21\x4a\xd2\x68\x9d\x6a\x55\xe5\x2a\xc2\xef\x49\x11\xab\x7d\x54\x54\x07\x3e\x4c\x8e\xca\x64\xd3\xbc\xb0\xe7\xe8\x68\x73\xaf\x74\x56\x25\xd5\x01\x8f\x44\x95\xda\x14\x3a\xaa\x74\x49\x67\x6e\xec\x72\xfc\x89\x3d\xe9\x44\xfe\x95\x41\xda\xaa\xeb\x3c\x4e\xb6\xc9\x26\xf2\x08\xbd\x69\x9e\x61\xf1\xb7\x67\xf1\x06\xf9\x6e\x9d\x64\x6e\x0f\xfa\x6a\x5e\x24\x77\xf8\x2a\x65\x34\xfa\x6a\x5f\x24\x78\xb4\xb1\xb9\xaa\x4b\x60\xb9\x3e\x00\xad\x60\xfb\xbe\x8a\xb2\x98\x77\x68\x2e\xde\x45\xa0\xc6\xda\xa0\x43\x04\x48\x36\x75\x1a\x15\xe1\xa3\x0c\xed\x5b\x86\xd6\x53\x30\x04\xb3\x01\x93\x3a\x82\x07\x5f\xbc\x04\x19\x06\xb0\xf1\x64\x5f\x25\x99\xd0\x7c\x13\x81\x97\x49\xb6\x49\xeb\x98\xd8\xb9\xcf\x0b\xd9\x9a\xf8\xac\xf3\x2d\x43\xf8\x3d\x20\x1c\xa7\x7a\x53\x15\x79\x06\xb1\xba\x0c\x65\xe2\x5a\x6f\xee\xa3\x2c\x29\x77\x16\xec\x08\xff\x9a\xaf\xd4\x9d\xce\x74\x11\xa5\x29\x28\xb6\xd9\xe8\x7d\x05\x0c\x71\x2e\xc1\x57\xe6\xdb\xea\x31\x2a\xb4\x8a\xf5\x83\x4e\xf3\xfd\x0e\xbc\x27\x3c\x76\x75\x46\x22\xb0\x35\x98\x69\x7f\x6a\x55\x60\xf7\xad\x2e\x08\xc3\x38\xaa\x22\x86\xec\x07\x82\xec\x8b\xde\xd4\x15\x49\x9c\x05\xa1\x21\x8f\x38\x30\xca\x78\xc7\x9d\x48\x2f\x31\x24\x53\xcb\xbc\x2e\x36\x9a\x97\xf0\x4e\x3f\x62\xa7\x09\x69\x05\x68\x76\x29\x30\xe9\x22\x64\x45\x92\xc5\xc9\x43\x12\xd7\xf8\x1d\xc0\x19\x51\x4d\x62\xfa\xb0\x4d\x70\x58\x24\xcb\x8e\xf6\xb0\x18\x07\x07\xaa\x2c\x87\x30\x68\x55\xe8\xff\xa9\x93\x42\x44\x6a\xfc\xe5\x3e\x59\x27\x95\x1a\x32\x34\x3f\x01\x9a\x69\x54\xdc\xe1\xf1\x8f\x79\xf1\xd9\xd3\xf6\x11\x7f\xa9\xc7\xfb\x84\x38\xc7\x5c\xd7\x2d\x74\x01\x5b\x9b\x87\xea\x31\xa9\x68\xb9\x1c\xac\xee\x68\x79\x26\xa7\x12\x60\x95\x2e\x76\xa5\xc8\x4d\x52\x5a\x9b\xc1\x50\xfc\x4c\x50\xc8\xdf\x9e\x12\x58\x13\xe7\x9b\x9a\x18\x66\x16\xbd\x76\xcb\x42\x26\xdc\x47\x0f\xd6\x3e\x40\x16\xef\x2b\x52\xdd\x3b\xf0\xb0\xea\x5b\x25\xde\x45\x5f\x92\x5d\xbd\x53\xfa\x4b\x45\xdc\xdf\xe7\x65\x99\x60\x83\x3e\xf0\xd3\xcc\x28\xe8\x0d\x03\x98\xec\xb4\x95\xeb\xc4\x90\x97\x77\x22\x64\xcb\x7a\x5d\x82\x8c\xd8\x80\xa5\x4c\x08\xda\x67\x96\x93\xd4\x43\xf8\xec\xa3\x0c\x45\x49\xd6\xe4\x41\x1f\x80\x3e\x11\x27\xc9\x18\x87\x5f\x80\x41\x43\x3f\x1c\xc1\x69\x9b\x38\x66\x63\x49\x60\xe3\xc0\x18\x32\xc9\x7f\x6e\x8b\x7c\x27\xb2\x0c\x10\xaa\x28\xdb\x30\xf1\xa1\x1a\xf5\xa6\xaa\x0b\x86\x58\x27\x46\xe0\x3a\x34\x99\xb6\xde\x17\xfa\x21\xc9\xeb\xb2\x65\xc3\xd4\xc7\x7b\x9d\xb5\xa4\xb8\x84\xb4\xa4\x3a\x2a\x45\xd2\x22\x55\xea\x22\xd1\xcc\xb6\x6d\x92\x6a\x28\x74\xd4\xd8\x04\x0f\xbc\x53\x67\xc3\x97\x80\x4f\xe6\x15\xe4\xe3\xbd\x22\xde\x8d\xbf\x8a\x40\x6a\xf0\xef\x08\xee\x53\x30\xf3\x61\x99\x7e\x94\x1d\xc4\x86\xcb\x36\x42\x46\xb2\x80\xdd\xd6\xe9\xf4\xa6\xec\x30\xbe\x03\x73\x1a\x0f\x58\xe6\x84\x1a\x85\x8d\xa1\x0f\x7b\xf8\x88\xc2\xdb\x16\x16\x79\x51\x16\x92\x5a\x5d\x6e\x60\xb6\xbc\x0d\x7a\xa9\x46\x12\xc1\x5b\xce\x81\x44\x8b\x37\xee\xb7\x85\x34\xa9\x1c\xa7\x54\x9d\xc5\xcc\x7d\xaf\x56\x04\x07\xe9\x60\x94\xc2\x81\xc5\x87\x26\x8f\x9b\x8a\xd9\xd2\xc5\xd7\xe2\xa5\x6f\x22\xd6\x95\x51\x1a\x25\xbb\x86\x94\xee\xe5\x87\x0d\xfd\x70\x51\xf6\xfa\x38\xe6\x51\xe5\x8f\xb4\x1d\xe8\x4b\xb2\x1e\x6d\x89\x38\x5e\x45\xbc\xd1\x27\xfb\x90\xd7\x95\x4a\x93\x5d\x52\x31\xe9\xfb\xd8\x19\xdf\xc5\xe4\x06\xf3\x8d\x2e\x4b\x41\x39\xda\x83\x8b\x51\x05\x3e\xf1\x39\xe2\x46\x82\xd3\xbd\x15\x20\x1c\x58\x47\x8d\x93\x7b\x4d\xc0\x07\x04\x0f\x2d\x2b\x98\x0f\xbb\x4e\x64\x10\x23\xbd\x3d\x0e\x2a\xc8\x1f\x98\x80\x63\xd7\xf0\x80\x10\xea\xa4\x0a\x71\x21\x85\xc7\x92\x1a\x3a\x81\x5f\x9c\x08\x02\x91\xb4\x36\xfa\x5c\x96\x39\xc2\x1c\x71\x46\x20\xc9\x36\xda\x90\x1b\xb2\x31\x91\xd5\x27\x12\x96\x7d\x65\x7c\x3e\x8e\xe1\x28\x24\x4f\x59\xcc\x10\xe0\xf0\x52\xa2\x09\x36\xaf\x70\xa8\xf3\xbe\xf0\x2d\xde\x23\xf5\xd9\x24\x08\xda\x2c\x8d\x80\x1d\xb8\x92\xd3\x88\x64\xab\xa8\x48\x4a\x42\x24\xba\x23\x30\xab\x67\x4c\x86\x38\xb0\x47\x0d\x24\x3f\x83\xc1\xe0\x93\x0f\xb7\x9a\x6e\xc0\x12\xd1\xc5\x1a\xdf\x80\x69\xf7\x39\x18\x34\x50\xab\x96\xf0\x6f\x00\xf3\x5a\x3c\x25\xc3\x54\x80\xe1\x22\x37\x51\xb1\xb9\x4f\x1e\x00\x02\x71\x86\x85\x01\x2e\x50\x4b\xb4\x03\x61\x28\x72\x44\x49\xa0\x24\xc8\x67\x9f\x33\x71\x62\xac\x5f\xc9\xb3\xc4\x13\xa7\x90\x90\xe9\x47\x3c\x4f\x96\xda\x81\x4d\xac\xcd\x40\xde\x7b\x72\x77\x22\x2b\x14\xbf\x7d\xca\xeb\x73\x75\x81\xdf\xe8\x53\x71\xde\x73\xa2\xde\x72\xc4\x91\x4a\xf5\x1d\x3e\x1a\x87\xac\xbf\x50\x0c\x5b\xd2\xa9\xc6\xde\xb3\x12\x8a\xf8\x12\x8c\xe9\xc1\x4a\x7c\xe8\x1b\xac\x0f\xec\x37\xb5\x95\xf7\xdf\xd6\x6c\xce\x1f\x4c\x10\xdd\x72\x94\xc0\xa9\xac\x41\x11\xd1\xf5\x25\xc2\x15\x5a\xf4\x23\x29\xeb\x15\x1e\x0f\x80\x4b\x48\xaa\x04\x2f\x11\x57\x2d\xf2\x68\x20\xb7\x4e\x9d\xa5\x8c\x34\xab\xb4\x7f\xa4\x6c\x12\x58\x94\x12\x83\x0f\x87\x4a\x38\xc7\x0a\x25\xe3\x83\xad\xe5\xd0\x7d\x5d\xc0\x99\x6a\xef\xd4\xbd\x74\x03\x02\xf3\x8c\xd5\xc0\x8b\xa8\x27\x5a\x98\x3f\x12\x9d\x62\x18\x87\x0d\x7b\x56\xa2\x33\x7d\x66\x7f\xbd\x89\xa0\x07\xbc\x4e\xbe\x34\x6c\xde\x45\x59\x74\xa7\x39\x78\xc3\x59\x65\xed\x82\x78\xef\xc4\x61\x08\xf8\xc4\x48\x76\x75\x09\x04\xe3\x73\xb1\xee\xb1\x91\x2a\xca\xfb\x64\x4f\x5b\xec\xf2\x42\x4b\x80\xb6\x4d\xb6\xa0\x0a\x02\xa8\x0d\xed\x7e\xf1\xc3\x77\xff\xd5\xb3\xdc\x82\xad\x22\x87\xcb\xfa\x5e\x42\x6e\x24\x4d\x58\x23\xd8\x84\x61\x20\xc5\x6a\x6c\x19\x40\x05\xf1\x82\x6c\x85\xa2\xef\x4d\xec\x1b\x62\xd9\xaa\x33\x82\x7b\x4f\x86\xec\xd4\x8f\x64\x5a\xad\xb1\x2b\x89\x07\x12\xa5\xa5\xf1\x2b\x12\xf5\xbe\x2a\xf2\x43\x94\x56\x87\x57\xdb\x42\x6b\xb2\xca\xd9\x2b\xfd\x05\xdc\x2f\x93\x07\x0d\x83\xcb\xa7\xf7\x29\x84\xf8\x07\x91\x9d\x23\x23\x97\x30\xb1\x7d\x4a\x29\x04\x26\x61\x27\x6d\xd3\xf4\xad\xd8\xde\x77\x67\x67\xd1\xc0\x48\x43\xf7\x3a\xa3\x00\x17\x41\xd4\x6b\xec\x34\x45\xd7\x05\xd2\x93\x5d\x54\x7c\xee\xb5\xac\xf6\x31\x86\x00\xaa\x26\x20\x0b\x8d\xad\xe3\x7a\x83\x8f\x6c\x84\x0f\x24\x2d\xe5\x3e\x8d\xf0\x01\xeb\xc4\x44\x94\x9c\x7a\xb2\x66\x90\xca\xb9\xfc\x51\x77\x98\xb4\x8b\x8e\x60\xb5\x27\xb2\x8c\x5f\xac\x57\x6a\x25\x2e\xd8\xf5\x5b\xd2\xcb\xd2\x45\x14\x91\x0a\x42\xe5\x5f\xf9\xd8\xb3\xb5\x25\x8d\x38\xcc\xd2\x78\x4c\x50\x6a\x5b\x40\x6c\x7c\xf4\x2b\x5e\xa5\x0f\x0c\x49\x9a\xc8\x5a\x83\x92\xfc\x71\xdb\x76\xfa\xa0\x03\x56\xe3\x03\x42\x5b\xcd\xe9\x5d\x5f\x08\xb3\x27\xe1\x4e\x88\x2e\xf4\xb0\xd8\x9a\x9c\xec\x3c\x1b\xb7\x32\x4a\xb5\x03\xdb\xe7\xcf\x44\xba\xbc\xd4\xdd\x21\x51\x27\x65\x10\x63\x6d\x06\xbc\xd8\x50\xb8\x14\xa9\xb3\x11\x0d\x14\xdd\xda\x1f\x08\x33\x2b\x36\x41\x42\x3a\x46\xc6\x57\x03\x22\xfc\x0a\xd0\x73\x89\x7f\x62\xb2\xdc\xc7\xec\xde\x26\x05\xfc\x90\x67\x5c\x2b\xf8\x71\x51\xcd\xa9\xcc\x41\x9d\xc5\x03\x35\xcb\x2b\xe2\x9f\x53\xd3\x06\x60\x04\xd0\x1a\xde\x8a\xd4\xc1\x8a\x64\xea\x03\x24\x83\xd4\x3b\xf5\xba\xc7\x04\x64\xc7\xc9\x01\x25\x69\x17\x07\xb0\xda\x87\xaf\x0d\xe0\x7e\x55\x6f\x7a\x60\x02\x47\x29\xa7\xd7\x60\xcf\xb7\xb2\xb5\x15\x87\x1d\xcb\x08\x1b\x39\x92\x8c\x77\x2a\x11\xa3\x18\x06\x1b\x27\x83\xd7\xc4\x2c\x7e\x36\x0d\x17\xc9\x66\x6d\x74\x2e\x91\x7d\xe5\x03\x90\x2f\xd9\x06\xc1\x3c\x85\x95\x0b\x63\x79\x96\x5f\x6f\x1e\xfa\x92\xde\x87\x9b\xfd\x1b\x2c\xd5\x7f\xc8\xe6\x34\xaa\x29\xff\x46\x73\xd3\xac\x96\x48\x49\x89\x35\x9f\x7d\x42\x48\x9b\x6e\x53\x64\x82\x31\x8e\xf4\x80\xb6\x48\x03\xed\x10\x95\x09\x28\x1c\xf0\xb3\x6d\xa4\x5a\x59\xf9\xbf\x64\xb4\x5e\x66\xb3\xfa\x2d\xa3\xf5\x44\x11\x2a\x44\xd8\xa0\x16\xa5\x79\xe6\xc0\x4b\xb2\x86\x0c\x33\x7a\x94\xcf\x74\xd4\xd2\x9a\x04\xb3\x5e\x36\x78\xba\x17\xd8\x4b\x66\xa7\x98\xc6\xb6\x59\x0c\x4c\xe9\x13\x16\x92\x4d\xc1\x0b\x11\xeb\xe4\xa4\x10\xf8\x4d\xa7\x9e\xbe\x70\xdf\xff\x1b\x35\x9e\xb6\xdd\xc6\x3a\x96\x30\x8f\x6f\x9c\xdd\xe6\xcf\x4f\xda\xee\x10\x12\xb1\xda\x44\x6f\x82\x30\x2c\xe5\x76\x25\x54\xcf\x19\xe9\x37\x5f\x6d\xa4\x29\x92\xf5\x86\xba\x61\x76\xa2\xd2\x18\xed\xd8\x5b\xe4\x0e\x22\x9e\xb0\xdd\x9d\x2b\x5f\x64\xbe\xbd\xa1\x6c\xe6\x8c\xa0\x47\x17\x0f\x4f\x5b\xf2\xaf\x91\x90\x96\x79\xbf\x80\x09\xd5\xfb\x2a\xd4\xfc\x13\x48\xf5\x5c\x74\x6c\x1d\x02\x3b\xaa\xef\x7b\xcf\xdb\x84\x76\xbd\x93\xb3\xb3\x75\xa9\xb9\x24\xf5\x52\xf0\xe1\x7e\xde\x0e\x9a\xb5\xdd\x39\x6c\xeb\x9d\x2b\xc5\xbc\xa5\x00\x79\xb8\xdf\xa7\x81\x3f\x74\x3e\x7f\x75\x64\x6d\x25\x9f\x21\x2f\x23\x76\x97\x1d\x40\x1e\x7e\xed\xca\xfa\x2c\xe2\x2f\x2a\x4b\x3e\x5d\xb5\x08\x05\xf8\x38\xcb\x0d\x12\xb8\x06\xc1\x76\xd1\x81\xb2\x5f\xef\x3a\x10\xbc\x65\x48\x51\x9f\x89\x73\x5e\x94\x1c\xba\x9a\xdd\x51\x7a\x28\x51\x22\xd1\x61\x57\x43\x71\x4d\x46\xc8\x09\xf8\xfe\x70\xb4\x0f\x8b\x16\x22\xb4\xe2\x10\xfc\xde\x44\x8f\x63\x23\x87\xc3\x40\xb6\x06\x6a\x54\x6e\x12\xab\x4b\x02\xbe\x63\x8b\x4a\xca\x6a\x90\x92\xfa\x4d\x17\x9d\x58\x40\x10\x10\xe0\x4f\x7a\x14\x59\x16\xf6\xde\x54\xa5\x4d\xfe\x49\x0e\xc8\x7f\x9f\xc2\xdd\x94\xf0\x91\x2d\x26\xfb\x84\x14\xf4\x1b\x1b\x1d\x90\x51\x66\x82\x0c\xd4\x07\x64\x9d\x0f\x94\x77\x5a\x70\x1d\x21\x32\x57\xb9\x84\x19\xb3\x15\x67\xc1\xc4\xd6\x95\x83\x05\x66\xe7\x46\x8d\xcf\x52\xfb\xed\xe0\x07\x16\x5f\xc8\xc4\x50\xca\x0e\x49\x4a\x19\x37\x00\x0e\xbb\x00\x8a\x0a\x98\x8d\x1a\xea\xd7\x88\x30\x73\x71\x2d\xbe\x2c\xa8\x6e\x24\x8d\x4e\x83\x14\xb8\x9e\x13\x2c\x1f\x75\x70\x75\x39\xda\x61\x57\x1d\x27\x11\x17\x7e\xc3\xea\x92\x27\x7d\xa1\x1e\xe8\xf7\xcc\xf7\x59\x9e\xed\xd7\x70\x7b\x2e\x3b\x90\xfb\x67\x9c\x60\x6e\x0f\xcc\x03\x21\x7e\xc7\x29\x0e\x2b\xf1\xa6\xc9\xb6\x8d\x2c\xc1\xf0\xec\xb9\x7d\x21\x55\x81\x40\x30\xc9\x5a\x75\x20\x08\x1c\xe9\x0b\x02\xdd\x47\x9d\xc2\xd9\x5d\xbc\x86\x4b\xd8\x81\xc8\xf7\xc0\x9c\xcb\x97\xce\xf7\x25\x95\xed\x05\xa4\xa4\xbe\x1b\xa2\x92\xdb\x8c\x63\x22\xb7\x59\x99\x7c\x51\x17\x3f\xb6\x36\x8a\x82\xce\x41\x53\x84\x9b\xdd\xba\x86\x40\x90\x2b\x5b\x6b\x9d\xb5\x11\x07\x01\xd9\xe3\x7b\x59\x17\xfd\x23\xbb\x06\xbd\xd9\xc3\x1e\x26\x16\x47\xb0\xb8\x36\x12\x6c\x4a\xc7\x5d\xca\x27\xe4\x29\x83\x33\xa0\x26\x19\xd1\x9c\x9e\x78\x9e\xb9\x09\x19\xfa\x84\x6b\x9f\xb6\x65\xd9\xec\xc4\xbe\xa5\xbe\xe3\xa5\x96\x2a\x67\x67\x27\xd5\x1b\x27\x29\xfe\x50\xb9\xac\x61\x38\x4f\xa9\x82\x29\x96\x32\x7b\xa5\x1b\x60\xd5\xd7\x2a\x2e\x41\x79\xa7\x4b\xa3\xf4\xb2\x95\x51\x31\xe3\x96\x9a\xb1\xb3\x67\x3b\x17\x58\x0f\x66\x83\x41\x97\xfd\x44\xd2\xb0\x03\xd2\xe0\x2a\xe2\x9a\x4a\x6a\x53\x8e\xd4\xad\x16\x09\xec\x45\x81\xa0\x2a\xb6\x65\x2f\x88\x52\x50\xf8\x4a\x91\x68\x70\x18\xd2\xcc\xe2\x5c\x11\xd4\x38\xaa\xe3\x0c\x5a\xca\xc2\xd6\x4f\xd1\x9a\x2c\xf2\x2d\xac\xce\x0e\xa1\xad\xc2\x05\xb2\xd0\x77\xd9\xbb\x29\xb2\x9b\x1e\x05\xff\x75\xc2\x0a\xc0\xdf\x70\x8a\x63\x09\x6e\x10\x0d\x4d\x99\x35\x91\x52\x49\x63\xcc\x38\xf2\x08\x4b\x66\x47\xe1\x22\xc9\xcb\xf7\x03\x80\x1e\xe4\x7c\x37\x36\xe7\xbb\x8e\x2a\x72\x12\x67\x67\x84\xc4\x8a\xa5\xec\x86\xc3\x2e\x13\xab\x9c\x4d\xb6\x47\x01\x21\x55\xaf\x53\x1d\xdf\x19\x86\x47\x2e\xb4\x14\xe3\xd8\x90\xd6\x6f\xca\xa7\x93\x4d\xee\x8d\x99\xbe\x0d\x04\xc9\x94\x80\x75\xd8\xf4\xb3\xb1\x76\x57\xea\xd7\x70\xcd\x25\x57\x28\xf0\x2d\x42\x88\x7e\x63\x59\x4b\xcc\x2a\xfd\xa5\x12\xe1\x66\xdf\xdc\xd6\xe3\xc6\xdc\x44\x95\x54\x54\xc3\x3d\x9f\x8e\xdf\x0f\xa7\xe7\x86\x17\x96\x0f\x66\x1e\x81\x48\xe5\x44\xdd\x44\xad\x7e\xc2\x42\x7e\x06\xa7\xca\x7a\x4b\x35\x4e\x12\xea\x58\x43\xc5\x52\x4b\x3f\x67\x7a\x00\x8f\xe9\x0e\x88\x51\xb7\xda\xb8\xa9\xc0\xbf\x26\x23\xf2\xb5\xb4\xe7\x98\x24\x9e\x23\xde\xd2\xb6\xd5\xa5\x65\xf6\xa2\x93\x0e\xb7\x45\xbb\xf2\x9e\x8c\x07\x69\xe6\x9e\x74\x4c\xd2\x79\x3e\x81\x49\x22\x74\x24\xb9\x4e\xa9\x29\xb2\x4f\x74\x33\xcb\x92\xac\x26\x30\xb7\x41\x3b\x0b\x14\x93\xdd\x2b\x2c\xb2\xd1\x77\xa5\xf7\xa5\xba\x60\xb4\x22\x6e\xb8\xe1\x38\x6e\x0e\x05\x2d\x0b\x98\x47\x4e\x99\x53\x70\x8a\x03\x9c\x4c\x3f\x96\x77\x45\x5e\xef\xcb\x1e\xa8\x19\x95\x88\x2b\xd6\x00\x76\x13\xa5\xe4\x09\x2a\x11\x2e\xc4\xdd\xe4\xc2\x11\x79\x52\x54\x76\x9f\x13\xdd\x35\x99\x90\xe3\x9e\x15\x33\x86\x1a\xa2\x9e\xb2\xce\x7f\x08\xe5\x75\x0c\xc5\x22\x05\x0f\x91\x1d\xde\x4c\x8e\x54\xe6\x9b\x56\x63\xb4\x11\x25\x05\x11\x39\xb0\x83\xa4\xef\x76\x84\x97\xef\x6d\x11\x8d\x4e\xeb\x1f\xd4\xbd\x99\xdd\xd9\xd0\x5d\x9c\x97\xa3\x43\xa6\xa9\x0f\x18\x21\x02\x25\x32\xec\xf6\x69\x60\x5a\x01\x73\x87\xb2\x44\x69\x99\x3b\x48\x39\xc2\x11\xea\x39\xa3\xd4\x14\x00\xa2\xc5\xa6\xa7\x16\x9a\xfa\x48\xd6\x76\x51\x63\x39\xdc\xb8\xb0\xbf\x96\x7c\x72\x5f\xf9\xfc\x0a\x2a\xb7\x49\x73\x0a\xb6\xf7\x75\x51\xd6\x34\x1f\x00\x48\xbd\x4c\x7e\x2f\x99\xb5\xe4\xb4\xe1\x9e\x6b\x9d\x26\xb0\xc5\xe5\x51\x4a\x74\x44\x76\x22\x49\xf3\xf7\xdc\xba\x06\x3b\x91\x74\x51\xf6\x6c\x25\xa3\x4d\xf3\x40\x77\x8d\x59\xb2\x23\x11\x9d\xf3\x09\xc7\x5d\x60\x0a\x64\x41\x1f\x63\xea\x66\xec\x0e\x42\x3f\x1d\xd7\x22\x0a\x62\xfa\xbc\xbb\xf0\x9d\x6c\x3b\xf5\xc3\x0a\x77\x9c\x44\xb0\x85\xa0\xc8\x4a\xba\xd4\x76\x22\x83\xe0\xdc\x23\xd3\x62\x85\x0a\xbc\x50\x18\x27\x35\xa2\x5c\xf6\xf9\xb5\x96\xee\x6c\xe9\x67\x22\xa8\xbd\x06\xe9\x3f\xf2\xda\x47\x1b\xa7\xb9\x91\x68\xa7\xc4\x11\xe7\x52\x0f\x44\x2c\xf1\xce\x79\x71\xe8\x51\x93\xa9\x20\x6b\x8c\xf8\x04\xf9\x77\x5e\xa7\x31\xc5\xe0\x69\xf2\x99\x7a\x8c\x38\x3d\xcd\xf3\xcf\x52\x6d\xe2\x6d\xcc\x19\x8c\xa6\x0f\xeb\x29\xdf\xe3\xd8\x9e\x9b\x4f\x21\xc7\x89\x99\x36\x31\x41\xb2\x41\x01\x72\x21\xbe\x9c\x21\x0a\x19\x6c\x66\x5a\x0c\x12\x0d\xb3\xe8\x47\x7b\x3c\xe6\xac\x1b\x21\xbf\xc2\x8e\xa2\xb8\xfb\xa6\x0f\xb7\x13\x51\x21\x9d\x05\xfb\x86\x53\xef\xc8\xb6\x1a\xce\xdd\x7c\xc7\x71\x02\x3b\x97\xbc\x55\x17\xb2\xe8\x6e\xee\x73\x32\x71\x34\x34\x42\x29\x97\x19\x72\xb3\x7d\x5a\x0a\xec\x34\xc7\xb3\x7d\xf5\x18\x15\x24\xc3\x07\x2a\xc6\xee\xa9\x08\x46\x49\x7a\xac\x77\x3c\xc8\x45\x2d\xd0\xc4\x25\x5c\xbe\x9e\xc0\x1b\x07\x54\xf7\x70\xb7\xf3\xf3\x8e\x1c\x31\x46\xb8\x9d\x4b\x92\x9e\xb3\x34\x31\x86\xe0\x3c\x1c\xc1\x56\x20\xe5\xac\xd7\x7e\x75\x3a\xf2\x32\x85\xab\xb0\x0c\xe2\x79\x44\x6e\x87\xb4\x21\x5a\x97\x79\x8a\xc0\x96\x9c\x01\x32\x0a\x53\xd6\xa6\xe7\x58\xaa\xfe\x15\xfc\x49\xc3\x98\xae\xa2\xe7\x9c\x2b\x50\x25\xd6\x57\x05\x4c\xb1\x3e\xba\x2b\xb4\xe8\x91\x6c\xb9\x7d\x2a\xe6\x94\x02\x41\xa3\x2a\x68\x10\xf4\x30\x40\xe5\xea\xa2\x78\x2a\x7a\xb5\xda\x12\xee\x63\x14\xb0\xac\x53\x2e\x61\xbd\x1c\x65\xc9\x70\x09\x21\x46\x97\x8d\xd8\x8f\xad\x32\x13\x36\x0c\xa2\x59\x53\x0e\x2b\xbd\x28\x06\x45\xfd\x76\xa5\x2b\x78\x4e\x66\x47\x48\x26\x4c\x92\x64\x62\xc2\x9d\x15\x2a\x17\xe1\xbd\xa5\xea\x0b\xc7\x28\x48\x82\xfa\xec\x19\x88\x7a\xb0\xae\x52\x8e\x96\x0c\x4f\x57\x46\xe7\x5a\xf9\x48\xdf\x26\xbf\x04\x9e\x8f\x07\x8d\xe2\x53\xce\xf1\x6c\x72\xd7\x35\xe1\x92\x84\x01\xce\x33\x15\x82\xc6\xbc\x8b\xd1\x7d\x97\xc4\xdd\x23\xf0\x93\xf1\x24\x6b\x1c\x18\xa9\x6d\x9d\xc2\x2c\xa7\x26\x50\x09\x35\xd1\x93\x46\xbd\xb5\x75\x33\x83\x8d\x2d\x6a\xc0\x27\x95\x7b\x18\xfa\xbc\x2e\x53\x57\xa2\x89\x5f\x98\x97\xf4\x4f\x64\x25\xdc\xd9\xa3\xc1\x19\x1a\x11\x3d\x91\xa3\x74\x98\xb3\xd0\x74\x1d\x97\xb5\x3b\x64\x86\x13\xe6\x8e\x6c\x69\x7b\x34\x38\x79\x64\x26\x6d\x32\x62\x93\x93\x7c\x2b\xd6\x46\x06\x69\xfa\x06\x62\x36\x97\x26\xe1\x15\x7e\xb9\x29\x1f\x5b\xc6\x0e\x79\x17\x0c\xd1\x98\x96\x26\x8f\xc6\x64\x32\x9e\x92\xf0\x20\xa1\xcb\x29\xba\x2b\x44\x92\x27\x18\x09\xb3\xc0\x59\x0f\xd1\x81\x6b\x9c\x6b\x33\x77\x86\x4c\x0d\x31\x38\xbb\x46\x2a\x9b\xb2\x01\x4c\x6d\xb8\xef\xa8\x8d\xc0\xc6\xe6\x56\xc7\xa3\x72\x76\x53\x57\xa1\x37\x4b\x4b\xd1\x18\xea\x92\x64\xad\x8e\xb0\x71\xb7\xcf\x33\xc5\x12\xdc\x13\xd0\x62\xf7\x22\xab\x5c\x05\x95\x4d\x93\x65\x25\xd2\x70\x6a\xb3\x81\x69\xde\x6d\x81\x89\x4e\x4f\x19\xc7\x4e\x87\xf1\xff\xda\x5c\x3b\x57\xd5\x65\x8d\x7f\x1a\x84\x9d\xc8\xc0\xec\x9a\x82\x4c\xa3\x51\x29\xd3\x3c\xd4\x1c\x21\x0d\x6c\xe8\x4f\xd0\xfd\xf8\xba\x51\xe3\xae\xc6\x6d\x78\xa4\x8c\xbb\xe2\xbc\x94\x6b\x2f\x71\xcd\x99\x6c\x66\x43\x3a\x1a\x60\xef\xb7\xc4\xa3\xac\x0b\xdd\xe9\x03\x8e\x44\xc0\x9b\x45\xab\x3e\xad\xba\x07\x57\x3d\x9c\x37\xa3\x68\x89\x66\xc8\xd4\xa5\x44\xb7\x4b\xd8\xb2\x5a\x0a\xc3\x0b\x7d\x57\xcb\x14\x20\x9e\x72\x61\x34\x17\xdc\x7d\xf1\x8f\xc0\xe4\x84\x9c\x37\x91\x29\xb4\xec\xd0\x9e\x42\xeb\xa8\xfd\x53\x15\xd1\x4c\x00\x94\xf9\x4e\x9a\x0f\x7e\x7c\xad\xc1\x08\x13\x78\x97\x02\x5a\x5f\xfd\x03\x8e\x42\xa6\xa2\x0a\x9e\x84\xe3\x2c\xca\xc2\xda\x0c\xc8\xdf\x71\x8a\x14\x42\x77\x1a\xac\xa7\x87\xb8\x7f\x75\xc5\xab\x46\xbd\xc9\xf7\x6a\x4a\x57\xec\x30\x5d\x43\x0d\xed\xe1\x2e\x27\x8d\x3b\xb8\xfa\x88\xb8\x35\xeb\x87\x42\xcf\xd3\xaa\x1e\x9c\x28\x44\x88\x6b\x3f\x7a\xde\xcd\xff\x85\x75\x9a\xb2\x33\x23\x1a\x4b\x82\x69\xd0\xb5\x68\x16\x39\xc7\xf4\xa6\xa4\xe4\xa5\xc0\x53\xb6\x2f\x02\xda\x85\x86\x4f\x04\x41\x66\x29\xe3\x18\x01\x0c\xeb\x38\x00\x06\x1c\x43\x72\x09\x23\x51\x7e\xa6\xa2\x0e\x60\x58\x53\x67\x4f\x32\x32\xb6\x95\xdc\xbb\x85\xac\x41\xe6\x7e\x38\xea\xce\xb5\xc6\x72\x56\x0d\xe1\xa7\xa5\x72\xa1\x66\xd3\x28\xe6\x76\x5b\x19\xca\x5f\xe1\x3c\x90\x3b\x9a\x08\xa2\x2b\xbb\x34\x29\x82\x75\xf7\x2d\x4d\x42\xd8\x67\x63\x3b\x4b\x68\x9f\xda\xf2\xc0\xe4\x4c\x3f\xfa\x25\x67\x33\x5d\x95\x9b\x68\xaf\xb9\x9d\x5d\x67\x2e\x09\x1f\xe5\x05\x42\x4e\x93\x1e\x9e\xdb\x55\x34\x21\x0a\xa3\xb5\xa7\x79\x90\x92\xf4\xe5\x21\xe1\x59\x79\x49\xc5\xa9\x0c\xf3\xd0\x7d\xb8\xf1\x0d\x34\xbe\x4d\x3c\xc6\xbf\xe0\x39\xe5\xc8\xd6\x27\x71\x3d\x0d\x74\xbf\x4b\xa8\x02\x1f\xb1\xc8\xc0\x1a\xd5\x38\x86\x8c\xa0\x5d\x96\xd5\xbb\x35\x9b\xd4\x1f\x29\x88\x1a\xb3\x28\xd3\x51\x4d\xa4\xe6\xd9\xa6\xa5\xae\xae\x26\x64\x40\x77\xcd\xc2\x46\x7a\xdd\x0a\x1d\x5d\x30\xe1\xb2\xd3\xf4\x31\x3a\xc8\xc4\x68\x92\x89\x01\xa0\x9a\x3d\xd8\xd2\x19\x4b\x46\xae\xe7\x31\x08\xb6\x28\xf3\x20\xed\xa3\xc7\x8d\x63\x09\xa0\xed\xd8\x4d\xbc\x4b\x77\x2f\xc5\x53\xd9\x63\x07\x85\xb1\x4c\xa3\x11\x04\x49\x03\xfd\xb8\x90\x63\xfb\xbd\xb9\x51\xe3\x6e\x8f\x04\x65\x43\x39\x3c\x68\x42\xb6\xf2\x58\x97\xd9\x1f\x8f\xe0\x33\x87\xb8\xf7\x51\x24\x0f\x11\xcf\x54\xb0\xe3\xe3\x9a\x5b\xb3\xd7\xc7\x5d\x0f\xe5\xa6\x7e\x4e\x35\x3a\x2f\x44\x71\x0e\x86\x8e\x9c\x83\xc4\x14\x02\x88\xc5\xe5\x46\xdb\x9e\x2c\x6a\x52\x39\x75\x73\xb7\x12\xbe\xfa\x36\x40\x2f\x70\x76\x64\xad\x11\x25\x51\x41\x82\xe3\x52\x1b\x2c\x95\xb9\x0f\x0f\xf7\xf7\x45\x44\x45\xbd\x73\x73\x39\xf0\xbc\x8f\x8f\xf3\xbf\x4d\xa6\xd3\xe1\xcd\xd4\xfc\x21\x1f\x9c\x2a\xd1\x97\xe6\x2b\xfc\xa3\xdc\x74\x47\xb6\xe5\x89\x23\x60\x52\xc2\x8e\x93\x58\xca\xe6\x84\x2d\xe3\xb1\xdf\x53\x20\x06\xc4\x0f\x21\x34\x76\x06\xa2\xe2\x55\xa6\x30\xda\x58\x21\x51\x5a\x79\x1c\xa6\xf9\x09\xc6\xc6\xc5\x43\x16\xec\x20\xea\x63\xe4\x5b\x82\x67\xf7\x76\x97\x50\x4e\x87\x85\x54\xf4\xe9\xbc\x38\x49\x87\x3b\x79\x6c\xfe\x36\x50\x17\x57\x89\x0c\x5d\x19\x67\xf4\x64\x8f\xa7\x7f\x3c\x36\x18\x06\x6c\x76\x8b\xa7\xaa\x47\xa6\xce\x2d\xfd\x7c\x5a\xbe\x2b\xa9\x49\x5a\xf2\xf0\x82\x46\x8c\x13\x1b\x07\x71\x34\xed\xd2\x10\xff\xde\xd9\x19\x42\xbe\xcb\xc9\x72\x34\x1d\x4e\xae\xc7\x0b\x35\xbf\x52\x1f\x87\x8b\xc5\x70\xb6\xfa\xa4\xce\x46\xf3\xdf\xc7\x8b\xf1\xa5\x1a\xcd\x2f\xc7\x6a\xb2\x54\x37\x8b\xf9\xef\x93\x4b\x7c\x71\x3b\xbb\xc4\xda\xd5\x07\x7c\x37\x9d\x8c\xc6\xb3\xe5\x58\xcd\x67\x6a\x38\x53\xe7\xc3\x25\x16\x9e\xab\xdf\x86\xcb\xc9\xb2\xaf\x3e\x4e\x56\x1f\xe6\xb7\x2b\xbf\x25\xb6\x1f\xce\x3e\xa9\x3f\x4f\x66\x97\x7d\x35\xc6\xaf\xd8\x66\xfc\xd7\x9b\xc5\x78\xb9\xc4\xb6\xf3\x85\x9a\x40\xd6\x26\x63\xfc\x38\x99\x8d\xa6\xb7\x97\x93\xd9\x7b\xbf\xcb\x74\x72\x3d\x59\x0d\x57\x93\xf9\xac\x6f\x77\x9c\x8c\x97\x00\x63\xb8\xc2\x7f\xc6\xaa\x0d\xee\xd5\x62\x3c\xa6\x13\x2f\xc7\x57\xe3\xd1\x0a\xe0\x00\xc1\xd1\x07\x3c\x35\xfc\x6d\x3a\xee\xab\xab\xc9\x4a\x5d\xe1\xc8\xa1\xba\x19\x2e\x56\x93\xd1\xed\x74\xb8\x50\x37\xb7\x8b\x9b\x39\xa1\xb3\x50\xb3\xf9\xec\xd5\x64\x76\xb5\x00\x0c\xf8\xff\x80\x8f\x18\xe3\xc8\xc5\x58\x2d\x26\xcb\x3f\x2b\xa0\xba\x9a\xf3\xb7\x7f\xb9\x1d\x4e\x27\xc0\x6e\x38\xbb\x54\x37\xe3\x05\x36\xbd\x1e\xce\x46\x7c\x76\x17\x5c\x84\x8f\xfa\x34\xbf\x45\x6c\x03\xbc\xa6\x97\x4c\x92\xc6\x22\x22\xf4\xd8\xc0\x3d\xc1\xa7\xc9\x8c\xd7\x80\x4c\x37\xf8\xa6\x4f\x0f\xab\x8b\xd9\x5c\xd0\x9e\xcc\x26\xab\x09\x22\x9f\xcb\xf1\xef\xe3\xe9\xfc\x86\x98\xb8\xe0\xe5\x73\x26\xef\x68\x3e\x5b\x2d\x26\xbf\xdd\xae\xe6\x8b\x1e\x60\x5e\xde\x5e\x8f\x0d\x54\xcb\x95\xe5\xc7\x6c\x3c\x02\x07\x86\x8b\x4f\x6a\x39\x5e\xfc\x3e\x19\x31\xd9\x17\xe3\x9b\xe1\x84\x37\x1b\xcd\x17\x0b\x82\x64\x3e\x1b\x08\xd3\x4f\x08\x0c\x8e\x5a\xae\x26\xab\xdb\x15\xb8\x02\x61\x20\xa6\xce\x18\x34\x22\xb0\x50\xc3\x4b\x0c\xcc\xfd\x5c\xdd\x2e\xc7\x16\x86\x36\x95\x86\xb7\xe0\xfa\x62\xf2\x37\x7c\x05\x34\xc6\x22\x72\xe3\xbf\x8e\xc6\x37\xab\x50\xfe\x3c\x28\xb0\xe5\x3f\x03\x3e\x28\xb6\x99\xd6\xa2\xbf\x79\x8c\xff\x28\x59\x3e\x6a\x05\xba\x21\x14\x71\xf0\x95\xd9\x04\xeb\xa1\x91\xd4\xa3\xd8\xf0\x68\x81\x29\xf4\x6c\xb9\xd5\xd6\x8c\xdc\xc5\xa0\xc8\x35\x42\x3e\xc5\x2d\xa2\xf4\x83\x7d\xe7\xba\xe0\x72\x3b\x2d\xc7\x9a\xb7\xdf\xa9\x98\xbc\x34\x54\x72\x4d\x17\x66\xb8\x7e\x23\x53\xc0\x62\x36\x64\x39\xe2\x38\x00\xe4\x27\x5b\xcb\xae\x52\x47\xd0\xa4\x91\x7e\x68\x7a\x70\xa8\x89\xa1\x40\x12\xf4\x40\xde\xcd\xa6\xc4\x8d\xd1\xe4\x30\x30\xbc\xa1\x82\x44\xe9\x87\xb6\xfa\x26\x5d\x4b\xa8\xd6\x2d\x65\xfb\x70\x64\x83\x7a\x08\x12\xdd\xac\xf5\x21\x37\xc4\x7d\xe2\x80\x26\x38\xcc\xb2\x37\xae\x24\x20\x33\x1c\x15\x99\xeb\xca\xd6\x46\xd7\x7c\x47\x4b\x17\x95\xd4\xb7\x4c\x77\x2a\x9c\xf5\x33\xfd\xd0\x0b\x9e\x4f\xe6\x32\x58\xac\xf1\x15\xf5\x04\x28\xdd\xb9\xe3\x35\x91\x94\xfb\x7a\xee\x6a\x55\x77\x36\xdf\x1c\x1e\x3d\x99\x63\x37\xd2\x6b\xb3\x21\xf7\x57\x59\x3a\x28\x03\x91\x7c\x74\x63\xcb\xbb\xee\x52\x1b\xb9\xff\x92\x6e\xee\x51\x30\x97\xec\xc1\x22\xc4\xaa\xa0\x88\xbe\xb3\x85\x42\xb9\xca\xc1\xcf\x07\xab\xbe\xe9\x1e\x35\xed\x9e\x54\x70\xe4\x09\x6f\x03\x9a\x76\x4b\x78\x17\xf6\x44\x3f\x3c\x38\x96\xe0\x25\x9c\x3a\xda\xe2\x26\x98\xa6\xf1\xd0\x4e\x1e\xf7\x55\xbd\xa7\xe9\x36\x23\xe6\xc6\x9b\xb1\x93\x6d\x1c\xe0\x54\x0d\x92\xcb\x69\x2d\xe4\x82\x86\x2d\xea\x2c\xd5\x65\x49\x2a\x67\x14\xc6\xee\x24\xbd\x5e\x6e\xb5\xee\xd9\xfb\x99\xad\x09\x4e\x99\x96\x42\xe6\x9a\xf4\x4c\xf9\x85\x4a\x89\x45\x62\x6b\x84\x7b\x84\x64\xe1\xe9\x08\xe8\x6a\x1a\x23\x48\x4d\xb5\x86\xc3\x47\xd7\xe7\xd4\x76\x0a\xde\xa6\xeb\x88\x71\x68\x86\x88\xd5\x5b\x66\xfd\xea\xf2\x89\xa9\xca\x36\x35\xe5\x96\x13\xcd\x95\x12\x4a\x71\x11\x3d\xda\x48\xcd\x89\xbb\xc8\x72\x3b\xcb\x3f\x31\x25\xea\x64\xaf\x7d\x10\x6b\x54\x8b\x6c\x8e\x50\x7d\x4e\x2c\x8f\x50\x24\xa4\x40\x1e\xd1\x16\xaa\xe8\x1b\xed\x22\xa3\x42\x61\x46\x93\x50\xb1\x70\x37\xa0\xae\xa9\xea\x70\x9a\xa2\xdd\xdb\x08\x8e\x50\x33\x51\xae\x25\x40\xd6\x3f\x31\x99\xf1\xd5\x42\xd8\xb4\xd4\x81\x05\xaf\x4c\xae\xbe\x4f\x8a\xc6\x75\x0c\x21\x8c\x95\x1e\x68\x76\x92\xc3\x5a\x82\xe4\xe6\x0a\x3f\xf5\x86\x07\x3c\x87\xcf\x49\x8d\x19\xe2\xa5\x29\xf5\x22\x96\x4f\xee\xba\x46\x3f\xcc\x59\x5e\xa6\xba\xa7\xa6\x8c\x9e\xd3\xdd\x16\xa5\x0c\x69\xba\x54\xf7\x98\x5c\x3c\xc6\x2d\xc3\xe4\x76\x96\x1c\xa9\x71\xfe\x19\xfb\xf8\x99\xf2\xc8\xe5\xc4\x3c\x63\x25\x16\x4d\xc6\xc9\xcd\x1d\xa7\xb8\x0f\x6a\xa4\x3c\x27\xe5\xa6\x64\x99\x18\xf7\x51\x6c\x56\x3d\x31\x65\x1c\x8a\x29\x99\xff\xb7\xce\xfc\x8b\x9d\x7f\xd2\xc8\x5b\x81\x6f\xe8\x70\x68\x3d\xff\x03\x86\xd3\x34\x4f\x64\x8a\xdf\xca\x30\x94\x33\x4f\x69\xd2\xc3\xf5\xa4\xd7\x07\xdf\x19\xa0\x3b\x18\x55\x25\x43\x11\x3d\xf3\xf2\x10\xa3\xc6\xc6\xc7\x19\x39\xec\xc2\xd4\xab\x8c\x61\xbb\xd4\x2e\x9d\xc2\x3e\x44\x69\xad\x5b\x89\xcd\xd3\x46\xfc\xe4\x50\x93\xf1\xc6\x54\x8f\x43\x1e\x45\xea\x4c\xfe\x69\xb3\xc9\x6b\x06\x8a\xca\x51\xac\x47\x6e\xc6\x76\xc7\xbf\xd0\x84\xa9\x05\x42\xe8\x24\x66\x23\x77\x49\x1c\x73\x96\xab\xa5\xa2\x7c\x0f\xa6\x86\x15\x46\x06\x2d\xa8\x7e\x16\xa8\x7e\x26\x55\x96\xb1\x0c\x02\x4d\x43\x5c\xb9\x9f\xef\x2e\xf6\x90\xf5\x91\x12\x6e\xe8\xf1\xad\x24\xe6\x85\xd4\x12\x69\x2e\x04\x72\x51\x94\x3d\x13\x1b\xf9\x66\x1e\x40\x4f\xe2\x20\x40\x32\x05\x7f\x93\xd8\x06\x3b\x05\x51\xa1\x67\x61\x80\x40\x33\xb2\x0a\x7e\x01\xf6\xbf\x0c\x82\x74\x85\x42\xdc\xe9\x64\xf8\xdb\x84\xb3\x84\x33\x89\x5e\x11\xfd\x8e\x26\x8b\xd1\xed\xf5\x72\x45\xc9\xc2\x92\xb3\x07\xf7\x93\x14\x33\x11\xa7\xcf\x17\x9f\x90\xed\x7c\x18\x73\x2c\x8f\x18\x7e\xa5\x2e\x5c\x6a\x84\xb8\xfd\xfd\x74\xf2\x7e\x8c\xc7\x7b\x7d\x09\xf4\x87\x94\x1e\x20\x64\xe7\xd8\xff\xe3\x64\x89\x3c\x67\xf9\x61\x38\x9d\x52\xca\xd0\xef\x4e\x17\xfa\xdd\xc9\x42\xdf\xa6\x11\x88\xb0\xed\x77\x84\x48\x18\xa7\xbb\x35\xcb\xdb\x1b\xca\xdb\x16\x36\x98\xc7\x3f\xcb\xdb\xd1\x07\xc9\xac\xc6\x48\xbd\x7e\x1b\x33\x05\xa6\x63\xca\x99\x68\x05\x0e\x5e\x82\x32\x57\x66\x03\x24\x84\x93\x05\xe7\x36\x94\xe2\x00\x3e\xce\x00\x91\x6c\x22\x5b\x9b\xf6\x25\x09\x41\xd2\xf0\x97\x5b\x93\x51\x5c\x0e\xaf\x87\xef\x41\x34\x9b\x3c\x7c\x18\x12\xea\x00\xe0\x99\xbc\xd1\x3e\x47\xe7\x4e\xe7\x4b\xde\xe0\xfd\x7c\x7e\xf9\x71\x32\xc5\x31\x1f\xe7\x8b\x3f\xab\xe5\x6a\x7e\x73\x83\x45\x44\xd1\xeb\x9b\x5b\xda\xf4\x6a\x38\x99\xde\x2e\x38\x2b\xbc\x1e\x4e\xaf\x6e\x67\x23\xd9\xcd\x00\x4f\x9c\x23\x1a\x5b\x1a\x5e\x53\xa2\xd9\x80\x52\x0e\x23\x42\x80\xea\x33\x35\x09\xc8\xf3\xc9\x30\xe8\xc3\x10\x89\xde\x6f\x63\xfa\x75\x46\x19\x24\xe5\xc3\x92\x3f\x22\x21\x5d\x4e\x8c\xf0\x58\xc2\x9a\x9d\x07\x36\xa5\xea\x16\x35\xd9\x99\x12\xc5\x21\xf8\xf3\x89\x68\xef\x7f\x24\x12\x5c\x8e\x87\xc8\x45\xf1\x41\xd8\x01\x90\x27\xb3\x3f\xdd\x2e\x38\xd5\xbc\x9d\xae\x48\xc6\xae\x16\xf3\xeb\x00\xda\x6f\x96\x81\xd4\xd9\x04\x78\xfc\xd7\x15\xf8\xc2\x87\x4c\x46\xcc\xe5\xe9\xf0\x23\x65\xb1\x1f\x00\xf7\x6a\x29\x8f\x7b\x20\x91\xf8\xce\x91\x85\xe2\xa0\xc9\xf2\x72\xc2\xb4\x44\x22\x37\x17\x40\xa7\xd3\xf9\x47\xb3\x29\x38\xb9\x64\x9c\x16\x2d\x0c\xbd\x68\x9c\x94\x0c\x08\xd2\x5c\x88\xe3\xf7\x21\x3e\x05\x1b\x5d\x0f\x3f\x35\x69\x43\x39\xf9\xd9\x19\xbd\x63\xe4\x76\x00\xd2\x4a\xd1\x8d\x2d\x9b\x35\x43\x25\x15\xce\x3b\x9a\xf5\x74\x91\xde\x5d\xb3\x4a\x2a\xbd\xeb\x9f\xcb\x3b\x80\x22\x89\x70\x95\xbd\x77\x2f\x65\x9c\xef\x7f\x56\xa3\xc1\xd5\x60\x31\x20\x5b\xfc\xdd\x6b\x75\x31\xa7\x4e\xc7\xeb\x5f\x7e\xf9\x01\x7a\x4c\xfd\x75\xa9\x2a\x93\xc5\x0c\x37\x3e\x7a\xa9\xc9\x39\xdb\xba\x27\x97\x34\xfb\xec\x02\x56\xd0\xfe\x8b\x24\x86\x6d\x41\xf5\x1a\xbe\xe1\xf5\x1b\x75\xb1\xd4\x7b\x0b\x17\x5f\x45\x25\xb8\x64\xaa\x14\xf1\xe9\xd1\x72\x82\x25\xc0\xec\xcd\x4f\x83\x9f\xde\x7c\xf7\xe6\xd5\x6b\x90\xa1\xc8\xeb\xbb\x7b\xff\xd5\xf7\xea\xe2\x4f\x75\xa6\x2d\xc6\x64\x46\x99\xe2\xef\x3d\xc5\xc7\xd8\xec\x96\x29\x6e\x5e\x52\xd2\xd5\x60\xa4\xe2\xaa\x4c\x5f\x1e\xb5\x9d\xfd\x0b\x7d\x5e\x0f\xd4\x75\x52\x6e\xe0\x0e\xa2\x4c\xd3\x6b\x65\x9a\xbd\x8f\xc6\x10\xa1\x96\x9c\x9e\xee\x14\x3b\x47\x43\x0c\xd9\x00\x2c\x7e\xc1\x80\xb9\x7b\xbb\xe3\x29\x67\x65\x5e\x8b\x45\x01\x8c\xbc\xc1\xc7\xe4\xce\x1d\xef\x85\xc0\xda\xd4\xd6\xe4\x80\x3a\xcd\x3e\x6e\xb4\x5c\x4f\x60\x76\xf8\x67\x9d\x4f\x46\xd2\x98\x17\x3b\x7b\x03\xa9\xd9\x73\x6a\x0c\x60\xda\x22\x68\xb0\x6b\xab\xec\xe1\xf6\x0c\x0b\xc9\x23\x38\x42\x3c\x90\x25\x91\x4a\x91\x8a\xec\x7d\xe6\x1f\x14\x69\x83\x33\x83\x0a\x3b\xd6\xf7\x29\x35\x03\xd6\x6e\x86\xa1\xf4\x65\xd9\x1e\x8f\x62\x1a\xdf\x9c\xc8\x1c\xe3\x16\xcf\x56\xaf\xf2\xed\xab\xe6\x59\x03\xf5\xb1\x95\xec\xd0\x4d\x4f\xbe\x69\xee\xa6\x40\xdc\xe5\x0d\xea\x0e\x98\xdb\xce\xa4\x74\x1b\x44\x4a\xff\xa4\x01\xda\xad\xdc\xf1\xc8\xec\xeb\x33\x68\x2e\xad\x62\x61\x91\x2e\x1c\x89\xad\xc9\xbe\x63\x70\x80\x0a\xd7\x9c\x5b\x4a\x74\x72\x9b\x71\xef\x8e\xda\xb7\xf2\x9a\x8c\x21\xb4\x09\x88\xf6\x4d\xfb\xdd\x65\x30\xcd\x69\x93\x2e\xf2\x36\x5e\xdd\xa0\xd5\x3f\xea\x22\x29\xe3\x64\x13\xa6\x1d\x57\x3a\xe6\x19\x97\x11\x32\xbf\xca\xc5\xda\x33\x12\x5a\x70\xc6\x0c\x43\x49\xb7\xc8\x33\xc8\x5c\x2f\x46\x18\x85\xa8\x4b\xde\x5a\x42\x9d\x4d\x04\x30\x11\x0d\xd6\x17\x54\xb8\xa8\x79\x06\xeb\xe8\x19\x8e\x12\x73\x7e\xa1\x81\x90\xae\x7d\x07\x65\x93\x97\x55\xf9\xdc\x1b\x80\x36\x04\xad\x2c\x35\xf1\x95\x8b\x47\xa1\x0a\x38\x4f\x1f\xca\x6f\x68\x0c\x50\x7e\x46\xb6\xc5\x61\xa9\x0c\x10\x45\xed\x4e\xa4\xa3\xf9\xcc\xb5\xf1\x32\x0a\x11\x79\x41\x26\x01\x7b\x44\xb7\xcb\x6c\x1f\x9e\xee\x1a\x14\x12\x5c\x81\x74\xcb\x48\x06\x56\xdf\xe7\x79\xcc\x13\xff\x38\x8e\x5e\x37\x93\x1e\x8c\xd8\xe9\x58\x2e\x70\x91\xa8\x35\x3b\xdc\x22\x50\x4e\x62\xfd\xdc\x0c\xf2\xdd\x3a\x92\x09\xe8\xc8\xbf\xa3\xc4\x31\x96\x8c\x72\x55\xd0\xbb\x5d\x6c\x0a\xc2\x19\x52\x21\xc5\x08\x5f\x8c\x97\xde\x4e\x4b\x3e\xc8\x0a\xbd\xa1\x61\x5d\x43\x78\x99\x1f\x60\xda\x9b\x4b\x11\x43\x2a\xdc\x57\x8f\x14\x9e\x76\x8f\x87\xb4\x2a\x00\xf6\x46\xbf\x53\x86\x23\xa6\xca\xc6\x3c\x4d\x11\xed\x22\xce\x68\x8a\x44\xae\x88\x9f\xba\xde\x42\x3c\x37\x2f\xad\xaa\x2b\xc0\xf8\x4f\xc7\xb1\xc6\x04\xd4\xd1\xb8\x06\xe7\x6e\x76\xd6\x45\xde\x49\x47\x82\xd7\x8d\x48\x88\x84\xd1\x76\x3b\xeb\x61\x6e\x4d\x35\x88\x24\xb7\xed\x69\x70\x43\x66\x83\xf8\xb2\x3d\x5f\x56\xe6\x7e\xab\xa9\xb7\x26\x72\x29\x24\x8b\x45\xe3\x1d\xd7\x7c\x27\x84\xf9\x97\x70\x63\x5e\x5e\xe3\xb6\x4b\x4a\x6b\xa9\xdd\x80\x0d\xf1\x09\xe9\xe8\x75\x9d\x56\x09\x9c\xc0\x2b\x93\x73\xc4\xd2\xa5\x3b\x3b\x46\x88\x87\xcb\x74\x99\xdc\x49\x01\x2b\xb8\xf3\x7d\x54\xa1\xa5\xaa\x9f\xdb\xd8\x50\x2f\x3e\x1f\x74\x7d\xe9\xde\x86\x65\x64\xf3\xf8\xdc\x3d\xe5\x1a\x60\xc8\x41\x26\x48\x84\x5b\xcf\x00\x20\xcc\x0b\x26\xd6\xec\xaa\xeb\x9b\xa9\xad\xd6\xf0\xf4\x57\x26\x7d\x50\x9b\x59\x7a\x3b\xef\x6b\x23\x27\xe7\x8f\x8c\x45\x3d\x1e\xc2\x08\xdf\x68\xe8\x9b\x58\xaf\x4e\xf4\xda\xb0\xe8\x7c\x75\xdf\x7c\x1b\x1d\x8b\x1d\x6f\x1c\x15\x47\x86\xf6\xf9\x77\x9d\x4a\x35\xd7\xbd\xc1\xb0\xf7\xab\x6b\xd1\x92\xda\xca\xfb\x8c\xec\x01\xc6\xfb\x9d\x98\xc2\x73\xa5\x72\xdb\x2b\x97\xfb\x1b\x8d\xdb\xba\xbe\xd5\x0d\x1e\xde\x57\xd5\xfe\xdd\xb7\xdf\x3e\x3e\x3e\x0e\x76\x02\xe7\x20\x2f\xee\xbe\x05\xdd\xbf\x3d\x3b\x5b\xba\x38\x2d\xb8\x72\xec\x1b\xeb\x41\x00\xd1\xbc\x93\x4c\x6a\x61\xbb\x6d\xe6\x0d\x14\x4f\x77\xdb\xcc\x45\x52\x63\x2a\xcd\xfd\xdf\x34\x21\x53\xb9\xd4\xba\x39\x04\x61\xc4\xc1\x30\x7c\xe3\xad\xa3\x84\x0f\xc1\x0b\xb5\x48\xa5\xc3\x39\x9e\x23\xc8\xc1\x4a\xe2\x64\xb3\xe1\x09\x6c\xfe\xfb\x45\xff\x33\x4f\x77\x14\xe1\xbb\x5e\xa9\xf2\xc4\xb6\x03\x75\x76\x63\xb5\x23\x78\xf5\x47\xf7\x62\x73\xb5\x63\x7f\x90\x69\x83\x8b\x51\xcf\x2c\x54\x67\x27\xb7\xa7\x2e\xcd\x42\x68\x02\x3b\xaf\x8b\x07\xbe\xcf\x13\x58\xbb\x8b\xb2\xf7\xee\xe5\x58\x0f\xbd\x26\x92\x69\xae\x4e\x2a\x83\xb9\xb0\x5e\x97\x0d\xb1\x09\xa6\x3b\xb4\x1c\xea\x1b\xf0\xac\x07\x7f\xc7\x57\x7f\x28\xa7\x0d\x7d\x1f\x6c\xf1\x3b\x60\xb9\x92\xeb\xe3\x41\x6c\xf4\x77\x01\xed\x8f\xc6\xc0\x5c\x10\x11\x92\x4f\xd4\x51\x2c\x67\xf2\xb5\x72\xa9\x9f\x22\x34\x26\x45\x7b\xa4\x39\x1c\x2a\x2e\xa5\x69\xfe\x68\xab\xe6\x87\xa3\x4e\xbd\xc5\xea\xf4\x9d\x7b\x2d\x90\xfc\xd1\xf0\x40\xa4\xc2\x6e\x73\x8e\x42\x4b\x3b\xb5\x72\xfa\x0c\xbf\x3d\x34\x91\x67\xd6\xe5\xfa\x05\x3f\x11\xeb\x8d\x44\xe3\xeb\x83\x79\x4b\xa6\x29\x81\x05\x54\x61\x0c\x4d\x34\xb4\x4f\xe9\x72\x15\xf5\xe1\xbd\xa1\x30\x95\x65\x7e\x01\x14\xeb\x5e\xf0\x6c\xf8\x6e\x49\x8b\xd4\x1f\x8d\x19\x59\xa2\x9a\x19\xa5\x30\x6f\x39\xea\x3a\xbe\xdf\x98\x12\x23\x61\x78\x09\xd2\xc1\x7b\x05\x03\xeb\xdf\x84\xe1\xfc\xec\x0c\xc9\xf1\xf8\x1d\x47\x70\x7c\xc1\xd1\x6e\xe4\xed\xb7\x0c\x57\xf3\xf4\x44\x99\x92\xf0\x83\x6b\x6e\x8c\xc2\x3f\x63\x49\xd1\x39\x41\xcc\x6f\x58\xec\xd4\x67\xb1\xb0\xe5\x3d\xdf\xe4\xb1\x6f\x9c\x3b\x01\x49\x11\xf9\x02\xbc\x5b\xb6\x45\x4c\xec\xc6\x03\x9b\xa6\xa2\x75\x0f\x5f\xfc\x62\xeb\x7d\xa3\xff\x1b\x00\x00\xff\xff\x31\x36\xc7\x0d\x41\x5b\x00\x00") - -func confLicenseMozillaPublicLicense11Bytes() ([]byte, error) { - return bindataRead( - _confLicenseMozillaPublicLicense11, - "conf/license/Mozilla Public License 1.1", - ) -} - -func confLicenseMozillaPublicLicense11() (*asset, error) { - bytes, err := confLicenseMozillaPublicLicense11Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Mozilla Public License 1.1", size: 23361, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLicenseMozillaPublicLicense20 = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xa4\x5b\x69\x8f\xdb\x46\x9a\xfe\xde\xbf\x82\x30\xb0\x98\x6e\x40\x6e\x1f\x9d\x63\x26\xf3\xc9\x93\x38\x59\x03\x9e\x20\x18\x27\x1b\xec\xc7\x12\x59\x94\x6a\x9a\x62\x69\xaa\xc8\x96\x35\xbf\x7e\x9f\xf7\xa8\x62\x91\xa2\x6c\x67\x16\x08\xe2\x16\xc5\x3a\xde\xfb\x79\x0f\xfd\xdd\xff\xdb\x75\x9d\xa9\x7e\x19\xb7\x9d\xab\xab\xf7\xae\xb6\x7d\xb4\xd5\xff\xd8\x10\x9d\xef\xab\xd7\xf7\x2f\x6f\x5e\xdd\x57\x3f\xd8\xd6\xf5\x6e\xc0\x93\x78\x83\xcf\x78\xf2\xec\x7b\xdf\x0f\xc1\x6d\xc7\xc1\x87\x67\xd5\xc1\x9a\x3e\x56\xd6\xd4\xfb\xca\xf5\x8d\x7b\x72\xcd\x68\xba\xca\x87\xaa\xb3\x3b\xfc\x61\xfb\xc1\x0d\xe7\x6a\xd8\x9b\xa1\xaa\x83\x35\x83\x8d\x9b\xaa\x4e\x1b\xd8\x58\x0d\x1e\x5f\x5a\xf9\x8e\x8e\xf5\xed\x86\x56\xfb\x13\x76\xfd\xde\x3f\xd9\x60\x9b\xea\x83\x6f\x87\x93\x09\xf6\x9e\x6e\xf0\x7a\x7e\x83\x74\xdf\x74\x13\xde\xcc\x1f\xb6\xae\x4f\xfb\xf1\xa3\xbc\x82\x08\xa1\x87\x1e\x4f\x43\xac\x6e\x5d\x5b\x99\xfe\x7c\x57\x8d\x11\x07\x6d\xcf\x95\xa9\xca\xcd\x4d\xdf\xc8\xdd\x8f\x26\x0c\xae\x1e\x3b\x13\xca\xef\xff\x14\x67\x1b\xf3\xfd\x1e\xca\xfb\x15\x17\x5b\x12\x43\x97\x30\x57\xf6\xe5\x8d\xbe\xe2\x8d\xe6\x8b\xd2\x66\x1f\xfc\x18\x6a\xa2\xaa\xb1\xd5\x8f\x3e\x1c\x88\x8d\xa7\xbd\x83\x10\x88\x58\x16\x18\x98\x5f\x52\xb2\x37\xb1\x32\xc3\x00\x39\xd9\x86\x5f\xea\x3d\x0e\xa6\x77\xab\xb7\x1f\xf7\x6e\xeb\x86\xea\xcd\x86\xbf\x78\xfb\xd1\xd6\xe3\x60\xb6\x9d\x6e\x8d\x7b\xc6\x11\x3b\x2f\xcf\xdc\x30\x77\xfe\xee\x1b\xd7\xba\xda\x64\xc6\x5e\x79\x17\xe7\xb0\x92\xd4\x26\xd2\xa1\x75\x37\x36\xae\xdf\x55\x47\x1f\x64\x25\x89\xc3\xfa\x96\x29\xff\x1a\x94\xbf\xeb\x21\xc5\x23\xb6\xa5\x7b\xfc\xee\x06\xec\x69\xa1\x37\x8d\x09\xe7\xa4\xaa\x51\xb9\x71\x73\x73\x6b\xee\x44\x4c\x7f\x94\xfa\xc6\xc6\x1a\xef\xe0\x61\xc1\x87\xbf\x25\xa5\x5c\x72\xff\xaf\xd0\x4c\x1c\xb6\x2d\x0e\xbb\x90\xea\x09\x27\x1d\x0c\xc8\x36\x4f\xc6\x75\xcc\xc5\xb1\x6f\x6c\xe0\xb7\x07\x1b\x0e\xcc\xa4\x27\x35\x32\x18\x14\x69\xbb\x35\xa1\x73\x78\x47\x95\x55\xe9\xdb\x54\xb8\x3c\xdd\xb4\x32\x5d\xf4\x6b\xdb\x98\x4b\xa6\x30\x03\xbf\x01\x03\x17\x62\x4c\x9a\x03\x65\xaf\x5a\x15\x2b\xed\x75\xf2\xe1\x51\x8c\x81\x88\xea\x2f\x24\xc7\xfb\x7d\x8b\xfd\xde\x9b\xb0\xc3\x4b\xbf\xe3\xfd\xbc\x97\xac\x16\xe3\x66\x9b\xb3\x2b\x7a\x7e\x22\xe1\xc9\x09\x07\xd8\x7f\x80\x6c\x58\x1d\x4c\x15\x2d\xd4\x1f\x8f\xaa\xd6\xe1\x96\xe0\x03\xfd\x1b\x37\xb2\xa1\x8b\x4c\xfa\xaa\x0f\xf8\x33\xdd\x47\xe8\x9d\xec\x1e\x0b\x1a\x5f\x8f\x07\xb8\x1c\x7e\xe9\x2f\xf9\x25\x62\x42\x7a\x6f\x6f\x9e\x48\xef\x88\xf4\xe0\x76\xfb\x81\x64\xbd\x0b\xa6\x1f\x36\x49\xea\x07\xf3\xd1\x1d\xc6\x43\x65\x3f\x0e\xd8\x0a\x1a\x1a\x23\x29\xe1\x06\x06\x66\x99\x0a\x15\xfd\xe0\x0e\x36\x71\x31\xe9\x1c\xef\x44\x94\xc4\x71\x1b\xed\xbf\x46\x6c\xd0\x9d\x37\xcc\x74\x32\x16\xd3\x75\x69\x05\x1f\x1e\xc9\x15\x3e\xd9\xb3\xb8\x1e\x26\xa1\x14\xe3\xab\x97\x20\x61\x66\x60\xa5\x14\x75\xa3\xd6\x77\x9d\x3f\x81\xa6\xef\xc4\x0e\x58\xc0\xc4\x4f\x77\x29\x4c\xe1\x6c\xb0\x71\xec\x70\x76\x1b\xfc\x01\xaf\x57\xa6\x69\xd8\xc1\x83\x01\x1b\x58\x44\x67\xf9\x03\x7d\xcb\xae\xf8\x50\x5c\x20\x1d\x4a\x1e\x1c\xb4\xb1\x12\x5e\xb7\x12\xba\x4a\x6f\x4f\x9f\xb9\x0e\xed\x65\x9c\x12\xb5\x2a\xee\x57\x14\x75\x7e\x31\x2c\x8e\xef\x3b\xe3\x0e\xe0\x03\x6b\x7f\x69\xe2\x13\x63\x8e\xf2\x66\x4d\x6f\xde\xc6\xbb\x4d\xe1\x6e\x48\x17\x3d\x8c\xaa\x73\x07\x37\x30\x45\x1b\x2c\xc4\xb3\x66\x53\x1d\x83\xaf\x6d\x8c\xe2\xd6\xcc\x91\x55\x73\x8c\xb2\x4d\x14\x8d\x9d\x36\x9f\x14\x8b\x24\xc7\x3e\xaf\xbc\x0c\x13\x76\xf2\x63\x07\xc1\x12\xe9\x6d\xc0\xe9\xb6\x11\x8b\x6e\xbd\x98\xb1\x2a\xcb\xd2\xe6\xcf\xaa\x85\x8f\x58\xb2\x41\x5c\xe2\x7f\xa2\xed\x3a\xfe\xc3\xb7\xad\xa5\xcd\x78\x97\x68\x48\x2f\x55\xa5\xc9\xeb\xe0\x9a\x07\x72\xa9\x2c\xb8\x01\xfb\xc7\x56\xdc\x8a\x75\xac\xba\x6e\x88\xcb\x50\xb8\x78\x38\x45\x54\x61\x3d\x85\xdb\x0b\x27\x93\xc3\xbe\x53\xc7\x61\xab\x9f\x7e\xfe\xad\xfa\xc9\xf6\x36\xc0\x0a\xe6\x88\x62\x53\x42\x8a\x4d\x7e\xf9\x3d\x78\x8d\xb5\x9f\x5f\xf3\x6a\x5a\xf3\x86\x88\xf7\x9f\x5d\xf3\x40\xe7\x70\xf4\x3e\x57\x1d\xb9\x9c\xe4\x6f\xa3\x70\xdb\x23\x04\x75\x1a\x43\x84\x4a\x0a\xda\x4b\xed\x2c\x11\xc5\x85\xc7\x3c\x06\x8b\xab\x90\xa6\x92\x1c\x44\x58\x33\x4b\xd1\x8d\x29\x88\xff\xaf\x1f\x9f\x55\xb7\x78\x8d\xfe\x0a\xcf\xee\xb2\xaa\x2e\x10\x93\x99\x63\x26\xfb\xd1\x86\xda\x91\xf8\x93\xb3\x48\x11\xa0\x70\x13\x74\xd3\x72\x99\x23\xff\x29\x27\x8a\xd6\x5b\xb1\x89\x19\x0e\x23\x59\xfb\x8e\x74\x3a\xa6\x0f\x1d\xbb\x20\xe6\x9a\x4b\x07\xc1\xa5\x1f\xc0\x4d\x7d\x43\xfc\x38\x76\x96\x33\x8f\x63\x80\x67\xb4\xca\x51\xf2\xbd\x19\x28\xe2\x02\xba\x26\xb1\x50\xe2\xb3\x85\x2f\x3d\xd9\x00\x1f\xe3\x82\xad\xd9\x4d\x12\x03\xe8\x6f\x76\xbe\xb5\x01\x08\xe3\xf7\xe4\x21\xfb\x1b\x62\x6e\x6f\x76\x96\xdc\x7a\x86\x17\x42\xcd\xe4\x91\x61\x33\x7c\xa2\x91\x5d\x39\xd8\x9c\x1c\xa9\x04\x3e\x91\x27\x02\x9c\x84\x06\xec\xdd\x91\xb6\x38\xf8\x60\x25\xd8\xb5\xae\x05\x53\x8e\xe0\x33\xed\x7e\xfb\xf5\xcb\xff\xba\x4b\x52\x86\x97\x88\x03\x3c\x01\xb1\x3f\xee\xe1\x89\xd8\x54\xb6\xd0\x3c\x48\x98\x5c\xfd\x6c\xcb\xe2\x56\x90\x3b\x6c\x26\xa1\xe9\x9f\xc8\xc6\x23\xbb\x14\x98\x58\x93\x80\xf4\x6b\x02\xd2\xfa\xdd\xcd\x5b\xb3\xf0\x1e\x04\x85\x40\xd2\x4e\xbe\x07\xcb\x25\xd2\x76\xcd\xf3\x93\x23\x1b\x0f\xfe\x6c\xba\xe1\xfc\xbc\x0d\x16\x9f\x7a\xdf\x3f\xb7\x1f\x21\xeb\xe8\x9e\xb2\x5e\x6b\x30\x10\x41\x3a\x38\x6b\x48\xb8\x1e\x48\xd1\xe0\xe6\x40\x30\xc8\x56\xa5\xba\x2d\x82\xbf\x3a\x37\xf1\x1d\x8d\x3d\x98\xf0\x78\xf7\x59\x57\xe7\x09\x3b\xe3\x52\x16\x3b\x37\x63\x8d\x3f\x61\x0e\x05\xfe\xd9\x88\x5d\x9c\x49\xee\xf1\xd8\x19\xfc\x81\x0b\xb4\x8c\x0a\xf1\x44\x33\x01\x71\xbb\x59\x72\xd0\xfe\x63\xe7\x01\xc6\x2e\x3c\xd6\x26\x79\x1d\x4f\x0e\x19\x14\x8a\xd5\x91\xfe\x9a\xe8\xf0\x35\xeb\xe9\x2c\x6a\x8a\x33\x88\x0c\xb6\x25\x70\x14\x60\xe6\xaf\x74\xb0\xc4\x2b\xe1\xd6\x2c\xd0\x64\xe1\x2e\x48\x26\x12\x37\x42\x38\xb9\x66\xf5\xcb\x73\xa7\x6c\x17\x2e\x79\x4e\x60\xf6\xce\xff\x99\x6b\x7e\x4d\x89\xd0\x5b\x1c\x0a\x3b\xc1\x49\x3f\x10\x8c\xba\xf9\x75\x3f\x39\x36\x51\x1f\x41\xb6\x1f\xd4\x9a\xa0\x76\xc2\x1e\xa8\xf3\x91\x4c\x10\x94\x48\xd4\x9d\xce\x85\x8e\xc3\xf0\x21\x80\xbc\x77\xcb\x08\xb5\xe4\x01\x5b\x66\x2f\xa6\x4a\x07\xcf\x32\x2c\xc6\x71\x21\x0e\x85\x70\xe3\x82\x87\x89\x84\x07\x32\x94\x14\x89\x23\x6d\xc9\x36\x51\x7d\xa8\xa1\xa3\xd7\xc9\x61\x7f\x93\x69\xaa\x4c\x90\x1b\xf8\xbe\xcb\x5a\x9d\xde\x5e\x73\x99\x3f\xfb\x0c\x79\x60\x0f\xba\x80\xdc\x68\x3a\xea\x84\xbc\x98\xe3\xf6\xe1\xd8\x91\x62\x31\x50\x12\xbf\x14\x0b\x06\xa4\x15\xe4\x22\x56\x70\xd0\x95\xb3\x07\x12\x40\x76\x2d\x85\x64\x18\x31\x6d\xb1\x09\x99\x74\x32\x45\xbd\x13\x39\xe5\x44\xd2\x32\x49\x55\x53\x6f\x35\xe0\xd5\x14\xbf\xd8\xcf\x9b\x8b\x14\x28\xd8\x03\xf6\x57\x82\xae\xe3\xb6\x96\x3d\xb3\x60\x96\x03\xc3\x3c\x76\xcd\x74\xf4\x77\xc8\x98\xef\xc8\x25\x49\x6e\xcc\x38\x54\xfd\x87\x0b\x0d\x5b\xd8\x19\x59\xf1\x61\x99\x15\x2e\x0f\x13\xcf\xec\xdc\xdd\x5a\xc2\x7e\x69\x0a\x45\x0e\x11\x13\x7b\x6f\xe1\xf4\xec\x71\x28\x0d\xfb\x8a\xb9\xdc\x29\x69\xf5\xba\x89\x67\x78\x46\xac\xbd\x90\xa2\x13\x3d\x37\xc0\xf3\x7d\x6d\x57\xaf\x07\x5d\xfe\xb5\x90\x32\xd2\x10\x2b\xc9\x8b\x20\x3c\x62\x92\x6a\x99\x6e\x96\xbd\x6b\x24\xf7\x11\x9e\x28\x15\xd5\x8f\xa4\x55\x7e\xe7\x25\xbd\x2b\x4d\x93\xf8\x35\x51\x7c\x30\x67\xd2\xd0\xde\x12\x64\x25\x64\x46\xf1\x13\x09\x33\x2c\x80\x79\x55\xe4\xb8\x01\x79\x08\xe2\xa9\x08\xb2\x70\x06\x0f\xf7\x5f\xdd\xb1\x15\x02\xa3\x7c\xc8\xe9\x4a\x4e\xae\xab\x1b\xd8\xc9\x0c\x60\xc3\xe5\xc5\xd2\x72\x34\x3e\x51\x6a\xad\x39\x05\x5d\x9a\x75\xa3\xde\x7b\x3a\x1a\x97\x9a\x9c\xc0\x7a\xbe\x2c\x02\x31\x45\xc2\x94\x93\xe3\x84\x2c\x12\x5b\x6f\xa3\xb5\xf9\xf6\xc8\x8d\x5e\xdf\x11\xb7\xbe\x2c\x2d\xe6\x42\x0f\xc2\x0e\x9c\x4d\xe9\x16\x8a\x45\x13\x5b\x1e\x84\x2d\x5f\xdf\x57\xff\x40\x4c\xb3\x90\xbb\x38\xa8\x95\x48\x1d\xd2\x0b\xb1\x2c\x09\x4c\xdf\x6f\x2d\x1c\xc8\x13\xd8\x76\xa9\xd2\xac\x5b\xec\x78\xdc\xce\x11\x3b\x53\x09\x0c\x29\x8b\xb8\x7e\x36\xd9\x38\xb6\x04\x38\x88\x2f\xaa\x43\x29\x61\x2d\xd3\x48\x3c\xbb\x3c\xe1\x13\xb9\xe5\x6b\x2a\x11\xfc\x68\x5c\xa8\x7e\x8b\xec\x68\x0b\x36\x6b\xe2\x4d\xa0\x01\x5c\x6a\x68\x6f\x4e\x97\x4a\x3d\x26\x4c\xc2\x11\x4e\xc5\x77\x84\xa3\xac\x19\x22\xc0\x73\x9f\x25\xb1\x46\x32\x8e\xcb\xf4\x02\x11\x5b\x3a\x8b\xc3\x25\xff\xd5\x58\xa3\xe9\x8c\xa2\xb5\x8a\x94\xf4\x09\x91\x13\xac\xe4\xfb\x7d\x7b\x5f\x00\xa6\xea\x46\xa5\x13\x21\x1e\xe4\x03\x0f\xf7\xaf\xe9\x7f\x0f\x12\x53\xa1\xc8\xcc\xcd\x7a\x7a\x5f\x41\xdc\x67\x62\x21\x0e\x7a\x20\x21\xc7\x23\xd6\xb8\xad\xeb\x18\x3f\xd3\x43\x2a\x7c\xce\x7c\x7d\x9b\x92\x57\xce\x5b\x6f\xde\x20\x40\x34\x8b\x17\xd6\x3c\xc7\x5a\x1d\x2c\xe5\xa2\xc4\xce\x79\xf5\x8c\x55\x88\x58\x2b\x95\xd2\x4a\xa0\x86\xd4\xf5\xf8\x71\xae\x9b\x02\x53\x8d\x88\xb0\xdb\xd5\xe2\xd2\x3c\xe2\xd0\x42\x7e\x19\x6e\x8e\xee\x0e\x64\xed\x8e\x6e\xae\xb2\x17\x89\x79\xae\x9a\x2e\x49\x02\x2b\xe9\x59\x9f\xb4\xea\xca\xb1\x22\x98\xbd\x3f\xd1\x2b\x88\x49\x00\x6a\x7e\x4b\x59\x3e\x6c\x93\x34\xe4\xca\x35\xe1\xd4\xb8\xdc\x05\x1b\x3d\x1c\x05\x9d\x74\x94\xbe\xb1\xa5\x11\xb7\x6b\xd5\xfa\x4c\xc3\x9f\x16\x9e\x75\xa5\x7c\xf5\x40\x48\x69\x29\xcd\x65\x91\xf3\xe6\x1d\x7b\xae\xd2\x5d\xad\xc9\x73\xb9\x0c\x47\xf6\x1a\x7f\x15\xe1\x2c\xd6\x30\xe7\xb9\x7c\xb7\xb5\xcb\xba\xe0\xaa\x7e\x98\x38\x2f\x4a\x4e\x6e\xe9\x95\x30\xf5\x13\xf2\x54\xa9\x2d\x2f\xf9\x69\x31\xac\xd6\x6b\x49\xb8\xd0\xc1\x08\x3f\x4f\xdb\x48\x16\xc7\xcb\xa8\xea\x85\x20\x83\xa4\xac\xa7\x54\x8e\x61\x46\xbd\x27\x38\x4d\xa8\x65\x4a\xad\x24\xac\x47\x0e\x09\x33\x4b\xd1\x2a\x5b\xbe\x76\x81\xbf\x93\x0e\x14\x42\xe0\xdb\x2d\x09\xfa\x8c\xce\x6f\xb4\x00\x97\xb1\xd3\xa0\x2b\x60\x6b\x00\xdc\xe4\x4a\x79\x1d\x97\x7c\x90\x7e\xdb\x66\xb2\x84\xb4\x26\xd5\x68\x96\x47\xe7\xd0\x5e\xe8\xa8\x78\x47\x82\x5f\xac\xac\x7f\x4c\x41\xd7\x50\x22\xe9\xec\xc3\xa5\xce\xce\xd2\x96\xea\x26\x71\x4b\x9d\x05\xe9\x46\xc1\xb8\xf9\xcb\x7a\x48\xe2\x56\x11\xa3\x97\x4c\xe0\x6c\x93\xf4\x75\x89\x26\x66\x30\x62\x19\x9a\x13\xbb\x2e\xca\x77\xd5\x3b\x2d\x6f\x15\x97\x71\x91\xd5\x6f\x06\xf9\xd6\xab\xc6\x5a\x60\x2e\x5d\x8e\xef\xad\x14\x25\x83\x5d\xe9\x08\x6c\xb4\x63\xb3\xee\xba\x48\x6e\x5f\xd2\x57\xd8\xcc\x89\x13\xd8\x20\x41\x6f\x28\x73\x87\xee\x52\x55\xaf\x26\x01\x85\xae\x8a\xc5\x2d\x4f\xe5\x4a\x65\xf4\x93\x2a\x66\x1d\xca\x25\xc2\x82\x87\x07\x4a\xa3\xe5\x45\x84\x53\x7f\x94\xba\x4b\x3b\x06\x0e\xa6\x5f\x06\xba\x66\x97\xca\xa5\xbc\x82\x70\x36\xa3\x2b\x77\x65\x25\xfd\x8a\x13\x1a\x3c\x8b\x93\x3a\x12\x93\x25\xcf\x98\x9b\x04\x01\x3c\x64\x3d\x02\xa1\xb9\x32\xa7\xa7\xf4\xba\xc3\xed\x14\x1a\x27\x10\xa1\x5f\x6e\x52\x3e\x94\x3f\x83\x44\xae\xcc\x52\x13\x0f\x1b\x82\x2c\x0a\xf1\x52\xc1\xea\xca\x9c\xb2\xc5\x47\xc3\xb1\xfd\x7c\x97\x6a\xcd\xe0\x05\xe9\xd7\x35\x93\xbc\x12\xfd\x36\x95\xe2\xef\x6c\x28\x44\xaf\x50\xb8\x46\x90\x7a\x3a\xed\x23\xa8\xfd\x30\x9e\x22\x33\x6a\xce\xd5\x63\xef\x4f\x3d\x00\x91\x14\x66\x60\x0d\x75\x3d\x06\x03\xb0\x17\x99\xbb\x00\xa0\x6f\x04\x58\x25\x2b\x79\x33\x81\xef\x5f\x59\x70\x93\x13\xd8\x7b\xaa\x6a\x62\x6f\x2e\x44\xa8\x1d\xf8\xe4\x9a\x4d\xd5\x5a\xb6\xd2\x4d\xc1\xa9\x38\x1e\xa5\x30\xe1\xa0\x0e\x87\x9e\xea\x83\xcc\x3c\xe5\x16\x42\x45\xe7\x76\x09\x9a\xf8\x99\xe5\xcd\x83\xce\xa5\xd5\xff\xb7\x3f\x01\xf6\xe2\xb4\xec\xd2\x3d\xe9\x36\x67\xe8\x20\x85\xfd\x0f\xd1\xbe\xb5\x7b\xd3\xb5\x72\x5b\x52\x1c\x9f\x1e\xad\xa4\x3f\x05\x94\xe1\x02\x13\x21\xd2\x6d\xf4\x1d\xb4\x1c\xbb\xd6\x9d\x35\x5a\x77\xa7\x75\xac\xb7\x9f\x22\x75\x73\x8d\x56\x72\x14\xcc\x43\xf1\x37\xe2\x0f\x41\xfb\x14\x7d\xb5\x3c\x67\x76\xc1\x32\xc7\x75\xcf\xf6\x5c\x11\xcd\xf3\x94\x2d\x65\xe5\xd3\x49\xd0\xf2\x31\xe8\xe6\x17\x95\xa5\x45\x2e\xf5\xe5\xb2\x12\x3b\xa6\xdb\xf1\xdd\x27\x3c\xa5\x55\xe0\x32\x6f\xbb\x62\x3a\x4c\xdf\x35\xd3\xa9\xa8\x5e\x44\x50\x35\x95\x8c\xfe\x39\x06\x17\x1b\x57\x6b\x2d\x07\x9e\xe0\x5d\x9f\x2f\x43\x89\x23\x47\x8f\x1f\x46\xe6\xd0\x07\x6c\x39\x0a\xa0\xfd\x87\xdd\x8d\x9d\xa6\x53\xef\x28\x97\x26\x7e\x53\x85\x4c\xba\x6c\xcc\x30\x75\xb4\x65\x04\x2a\x1a\x5e\xab\x31\xff\xa2\xac\x15\xa9\x86\xc5\x0e\xa8\xbb\x8a\x66\x1b\xb9\x5d\x94\xdb\x6d\x40\x53\xa3\xb5\xdd\xd0\x90\xf2\x32\xec\xcc\xd7\x25\xac\x97\x55\xf0\x3b\xae\x69\x2f\x63\xe4\xfa\xd5\x3e\xdd\x57\x64\xfc\xc3\x45\xea\x84\xfb\x14\x88\x4c\x82\x48\x31\x4d\x4b\x3b\x40\x72\x86\x8b\x73\x94\xb7\x43\x81\x64\x1d\x87\x80\x9c\x16\x1c\x3b\x53\x0b\x80\x04\x64\xc3\x89\xa9\x07\xc7\xca\xd0\x28\x4f\x17\x49\x4c\xbc\xca\xa8\xb5\x4a\xd6\x5b\xf5\x85\x33\x27\x07\x2c\xc1\x3d\x74\x55\xef\x49\xec\x13\x1f\x37\xa2\xf5\x6b\x97\x9e\x72\x5d\x8a\xac\x16\x9e\xba\xd3\x06\x8b\x99\x47\x43\xc8\x07\xde\x12\xa6\x16\x1f\xa9\x54\x37\x30\xba\x66\x90\x36\x68\x9f\x9c\x0b\x6c\xd0\x2e\xa8\x26\xdc\x28\x39\x4b\x05\x1b\xf4\x19\xd9\xdd\xaf\x53\xee\x7c\xbd\x54\x28\x85\xc0\x41\x17\xe3\x04\xd8\xe8\x01\xbb\xd4\x1c\xfa\x9d\x64\x0c\xc8\x67\xbb\x2b\xda\x4a\xa0\x81\x55\xa2\x70\x88\xba\x4a\x8b\xac\xbc\xc8\x49\xf7\x99\xd4\x6b\xf8\xa2\x6b\x49\xe3\xf6\xca\xec\x08\xa7\xc2\xc1\xba\x9e\xb8\x8f\xf5\xa4\xa7\x0c\xf1\xa2\x62\x96\x0d\xb6\xec\x6c\x14\xb5\x1a\xfb\x01\xd7\xbf\xf0\x43\x54\x7d\x87\x24\x48\x0e\xf4\x56\xeb\x04\xed\x64\x56\x44\x71\xe1\x52\x01\xda\x64\x0d\x96\x92\xbc\xef\x77\x9e\xa2\xb8\xd6\xe3\xdd\x4a\x05\x9d\x98\xc6\x41\x85\x62\x65\x7b\x56\xc7\xa5\x55\xab\xfe\x79\x62\x4b\x2d\x2d\x07\xe2\xd4\x45\x36\x72\x0c\x4e\xf2\xe3\x6f\x5e\x56\x8d\x39\x83\x9c\x96\x02\x71\xae\x4c\x30\x7f\xb7\xa6\x7e\xa4\x4a\x86\xaf\xa6\x2d\xef\x91\x75\x07\xeb\x53\x78\x4a\x54\xfc\x31\xae\xae\x50\xba\x4a\x28\xd3\xe7\x6c\xfc\x0f\x28\x54\x14\xea\xb4\x03\xc9\x25\x75\x9e\x39\xc8\x24\xc2\x26\xac\xa3\x7a\xae\x56\xfa\xb0\xff\x62\x6f\xf5\x4c\x4b\xdd\x59\x5e\x73\x8a\x6d\x4b\xbd\x9c\xd8\xfc\xb0\x64\x73\x90\xf3\x8f\xc3\x44\x17\xdd\x82\x2d\xee\x35\x03\x7f\xda\x50\x26\x23\x06\x72\x68\x43\x8a\xb0\x66\x47\xfd\xfe\xa1\x6c\x4c\x52\x3c\xa5\x7e\xf0\xc0\x95\x91\x84\xf6\xca\x22\xb4\x34\xe2\xb9\x06\xaa\x28\xb1\xb1\x78\x14\x0c\xee\x4f\xe1\xa8\xd9\xf1\x5b\xa6\xd6\x96\x4f\xed\xa1\xdb\x36\x3c\x4f\xfd\x7b\xa2\xb0\x0e\x70\xba\xfa\xe4\x8e\xfc\x9f\xdd\xc9\x30\xc8\x45\xb5\x3c\xb5\x92\xa5\x13\xd9\x9d\xcb\x66\x25\xd9\xbe\x5e\xac\x1c\x38\xb8\x6e\xc2\xe0\x1e\xf3\xf6\x3c\x1b\x04\x29\x8e\x8b\x57\x13\x28\x35\xff\xb2\x81\xb3\x0c\x2f\x71\x6f\x4a\x2f\xc5\xfc\x7f\xa0\x70\x2c\x8e\xf9\x29\x65\x10\x93\x0f\x9c\x6f\x1a\xab\xaf\x65\x0a\x09\x62\x4b\x0d\x08\xda\xd1\x92\x7b\xa0\x16\x7d\xc2\xb5\x0c\x78\x24\xff\x2b\xa5\x90\x22\x08\x91\x41\xb4\x51\x41\x14\x9c\x0d\xe0\xb0\x94\xae\x58\x57\xb7\x16\xbc\x79\x32\x9d\x6b\xba\x73\xd9\xca\x60\xbb\x50\x7d\x9a\x6d\xb5\xe2\xf7\xb2\x2e\x96\xb4\x08\xf9\x71\x0c\x4f\xd4\xab\x2a\xbe\x01\x23\xbe\xe1\x24\x5a\xc1\x0e\x31\xe1\xf7\x84\x75\x6e\xd6\xf2\xc3\x9c\x09\xaf\x9c\x2d\x06\xff\xcc\x90\x41\x3e\x2b\x5b\x8d\x34\x4e\x92\x21\x94\xa2\xd6\x47\xa8\x4a\xee\x53\xc2\x97\x06\x9a\x75\x68\x36\xa9\xa1\x24\x05\x0a\x0e\x8e\xd0\xdd\xa2\x26\xb8\x59\x1d\x50\xd1\xdd\xc9\x8b\x5c\x9f\x3b\x73\xe4\xc0\x2c\xfb\x80\xc6\x12\x38\x88\x34\xd9\x12\x80\xff\xfb\x41\xba\xb0\xad\x1b\x34\x96\x16\x2e\x4e\xdb\xf8\x15\xbb\xaa\xfe\xb9\xea\x35\xfe\x93\x10\x49\xd6\x49\x8e\xcf\xc5\x47\xc2\xa6\x1a\xec\xff\x85\x74\xc5\x29\x60\xd4\x56\x6e\x4a\xec\xae\xdd\x6d\x1a\x1e\xf8\xb0\xe7\xb1\x98\xb5\x61\x1f\x16\x80\xd5\xfb\x93\x34\x75\xe6\x46\x61\x9d\x64\x13\xb7\x5c\x7d\x99\xa7\x06\x77\xe4\x3c\xc6\x83\x9d\x55\x9d\x64\xfa\x28\xf5\x47\xa4\xcd\xc2\x3c\x0e\xf6\x68\x9c\xc0\xbb\xda\x07\x9d\x34\x20\x7a\x69\x8a\x61\xa6\x2e\x59\xae\xc8\x1b\x23\xfc\x14\xb7\x32\xa1\x06\x24\xce\x9e\x07\xbe\x52\xe7\xe9\xa2\xc3\x48\xa3\x0c\x39\x87\xb9\xe4\x07\xa0\xc4\xde\x07\xf7\xef\x75\x65\xd3\x3c\xb3\xf8\x66\xba\x17\xd4\xfa\xdb\xb2\x6d\x4a\xa7\xbc\xcf\x30\xfd\xe6\x37\x5e\xd3\x23\xe0\xb9\x50\x8f\x07\x49\xb9\x53\xac\xd7\xaf\x64\x5e\x04\xbc\x62\xed\x4b\x43\x14\xe0\xe3\x50\x26\xe1\xbd\xdd\x21\x27\xa2\xa6\xd7\xdd\x26\x8f\x57\x6c\x16\xf3\x15\x62\x7d\x0b\x71\xa4\xe1\x1b\xca\x18\x4f\x7b\x3f\x6b\x04\x5f\x30\x83\xda\x77\xb9\x2f\xa3\xee\x67\x6b\x39\xf3\x10\x3c\xc7\x20\x4b\xd3\xa8\x34\x2d\x32\xcd\x8d\x70\x5e\x22\x13\x85\x35\x6c\x17\xca\xde\xa9\x64\x7b\xed\x27\x91\x98\x1a\x73\x30\x3b\x9b\x9b\x6a\x94\x15\x83\x18\x1e\x8d\xf8\xa4\xe9\xa5\x75\x2d\xb7\xe5\x22\x03\x5c\xd8\x11\x6c\x0b\x9f\x78\xbb\x9d\xf7\x0d\xc1\xc4\x8d\x94\xaa\xe2\xe0\x8f\x47\x2c\xd9\x70\x08\x1d\xe9\x08\xc2\x3a\x63\x90\xdc\x19\x99\xed\xd8\xd7\xb2\xb7\x92\x94\xe7\x02\x59\x08\x34\x73\x43\x63\x3f\xe5\x9d\xf9\x68\x2e\x4b\x91\x33\xcf\x30\x83\x7b\xad\x2a\x80\xc9\xc5\x4a\x55\x98\x10\x4a\xab\x23\x37\x51\x5b\x1b\x53\xb5\x57\x77\x56\x95\xef\x66\xaa\x54\x64\x7c\xbc\x33\x5b\xdb\x91\x90\x2d\x57\x3a\xd3\x97\xc4\x90\xc6\x1a\xea\xca\x06\x92\x5f\xe4\xcc\xd2\xf5\x48\x0b\xcf\x9a\xc0\xf2\x90\x5a\x46\x1b\xa9\x33\x3c\x69\xd5\x22\x75\x28\x7a\x48\x9d\x39\xe5\x4c\x42\x47\x07\xa6\x4b\xc2\x83\x10\x42\x29\xf3\x4f\x1a\xfc\xd4\x39\xd9\x4e\x6a\xdd\x95\x0e\xc4\xa4\x36\x7d\x49\xe1\xa4\x28\x57\xf5\x44\x0b\x71\x60\xce\xb4\xcf\x3c\x3b\x9e\x7a\x15\x89\x37\xe4\xdc\x6e\x6e\xfe\x4c\xa6\x99\x81\xce\xcd\x1b\x4e\xfd\xf3\xe7\x60\x29\x07\x22\xc4\xe1\xe7\x06\xaf\xed\xdc\x6d\xf0\x23\x55\xbd\xb8\x4e\xe2\x52\x11\x7d\x0c\x83\xb6\x35\x4b\xa2\xc9\x6e\x75\xf0\x81\x1c\x66\xdf\x10\x5a\x3b\x00\x58\xc9\x30\x25\x71\x0e\xf1\x12\xb4\x1e\xc9\x4d\x51\x3a\x48\x7b\x6c\x69\x9e\x30\x81\x7f\xe5\x6c\xbe\x9e\x48\x1c\xf7\x28\x0b\xae\x10\x86\x26\x86\x08\x3d\xe5\x05\x26\x8b\xe1\x59\xb8\x24\x52\x27\x53\xad\x2d\x84\x39\x3c\xf7\xed\x73\x15\xa6\xe4\x1f\x91\x0b\x86\x7b\x62\xc1\x72\x8e\x43\x0e\x47\xa8\x64\xc0\x62\xb2\xc2\x14\x45\x85\x2d\x0f\x3e\x96\x20\x4e\x24\x58\x02\x3d\xc8\xe0\x2f\x40\xf8\x70\x97\x00\x21\xa6\xb7\x7e\x8c\x8b\xfe\xe6\xac\x67\xab\x50\xd7\x0e\x05\xbc\xa1\xeb\xd7\xa0\x3f\xcd\x09\xc7\x71\xfb\x4f\xaa\x2a\x1c\xa8\xe6\x2f\xd3\x59\xbe\x65\x80\xcb\xe0\x2f\xd1\x76\x01\xcc\xf0\xe7\xde\x76\x8d\xa6\xa7\x63\x6f\xc9\x34\x6b\x2b\xd1\x58\x8c\x22\xaf\xcd\xac\x07\x2f\xd5\x7e\x7b\xd1\xab\xc2\x44\x66\xdd\xfe\x54\x03\x2b\x76\xbd\xaf\x58\xdf\xc0\xf0\x79\xe5\x42\x60\x98\xa2\x9b\x02\x44\x80\x3f\xbb\x11\xfa\x2e\xca\x95\x27\xe8\xf2\x5d\x38\xea\x85\x91\xfc\xb2\x22\x76\xd6\xb6\x20\x29\xc0\xe4\x1f\x88\xba\x28\x38\x37\x2d\x99\x73\x22\x03\xfe\xe5\x8f\x1c\x5e\xde\x27\xa4\x1d\x17\x83\xb0\xfc\x25\x12\xf5\x9f\xed\x69\x7a\xe5\x26\xfd\x66\xe5\x47\xc8\xbc\xc9\xe5\xba\xb2\x71\x13\x07\x8b\xb0\xd2\xe4\xfa\x84\x29\x60\x5d\xd1\x4e\xc3\xe6\x0f\x3c\x67\xc3\x55\xcd\x69\x02\x6e\x65\x2b\x6e\xc3\xcf\xe6\xc5\x65\x9e\x8d\x3d\x1f\x75\x99\xe2\x9e\xa7\x9c\xe7\x33\xa6\xb3\x52\x09\x8d\x0d\xa4\xa9\x86\x34\x5c\xb4\x73\xe4\xcc\x0d\x07\x47\x68\xda\x88\x6d\x48\xe1\xd2\x6b\xfd\x78\xd8\x5a\xe5\x51\x9e\xf4\xa2\xad\xe7\x0c\x59\x69\x99\x7d\x69\xc5\x9f\x3e\xcc\x46\x2d\x32\xef\xf5\xed\xa9\xf1\x9c\x66\x14\x68\xbe\x2a\xe5\x9c\xeb\x15\xf2\x2b\x03\x19\x5c\x91\xbd\x18\xf0\x50\xee\x4d\xbd\xe4\xa5\x10\x99\xfa\x87\x7b\x6d\x93\xe3\xbd\x89\x70\x58\xdf\x79\xea\x94\xe7\xa1\x20\x9e\xba\x99\x75\xa8\x97\x4d\x69\x5a\x75\xe2\xf1\x09\x9f\x5b\x67\x2c\xbf\xb2\xf5\xc7\xd6\x19\x33\x55\xe7\xcb\x56\x1b\xe1\x3b\x53\xe5\xd9\xc3\x6b\x33\x2b\x4e\xae\x09\xef\x68\x0e\x76\x46\xa3\xa4\x4a\xdc\x27\x11\x8c\xab\x3e\x34\xa3\x6c\x5e\x31\x1f\x64\xc8\x2a\x99\x26\x81\xa4\x82\xa2\xf3\x5e\x7c\xe9\x7c\xa3\xb4\x44\x9a\x9e\x31\x0d\xb1\x4d\x77\xbb\x13\xf6\x7e\x55\x36\x1a\x69\x22\x6d\x75\x48\x1f\xcb\xbe\xa4\x73\x96\xfb\xe8\x53\x3f\xa2\xd0\xcc\xff\xdf\xd6\xd7\xba\xbe\xeb\x3a\xbc\x29\x4a\x12\xd7\x7e\xe6\xb3\x14\x56\xaa\x43\xa6\x5f\x0a\x81\x41\xf9\xb7\x51\xd5\xf3\xcb\xeb\xa7\x75\xd2\x03\xd3\x21\xb0\x8b\xb7\x5c\xcc\x11\x44\x25\x3b\x33\xc1\xf5\x9f\xe1\x6d\xaa\xa7\x7b\x9a\x97\x97\x30\x53\xcc\x4c\x60\xc1\x2f\xef\xf9\x57\x46\xa4\xea\x13\x73\x9b\xa2\xd6\x43\xb5\x5e\x49\x96\x8a\x8e\x3f\x39\x3a\x70\x7b\x3f\x0c\xc7\xef\x5e\xbc\x38\xc8\xa9\xf7\x3e\xec\x5e\x60\xc3\x17\x38\xea\x05\xc8\xcd\x15\x79\xda\x3c\xd7\xe4\x19\xeb\x45\x17\x12\x22\x07\xae\x2d\xb9\xcb\x45\xe6\x22\xa7\x94\xe3\xa7\x72\x79\xd1\x85\x58\xae\xea\xbc\x36\xb7\x6e\x59\x79\xb9\xfd\xf1\xfe\xdd\xf7\x6f\x7f\xfe\xf0\x36\xff\x6a\x84\x6a\xbf\x9d\x7d\x22\x93\x15\xd0\x8f\xac\xe5\x4e\xd1\x4f\x59\x17\xce\x3f\xb7\xe8\xdc\xa3\x55\xbc\xea\xfd\xe3\x64\xcf\x66\xaa\x50\xe5\xe6\x5d\xd3\x94\x9d\x11\x69\xc0\x0d\x53\x0b\x0f\x2c\x9f\x7a\x91\x79\xe2\xbb\xd0\x8b\xbf\x41\x2f\xbe\xf0\xb7\x6a\x9f\xd5\x92\x2f\xdb\x47\x47\x44\x5a\x57\xcc\xe0\x7c\x46\x87\x6e\xfe\x2f\x00\x00\xff\xff\xf0\x25\x2b\xe8\xeb\x39\x00\x00") - -func confLicenseMozillaPublicLicense20Bytes() ([]byte, error) { - return bindataRead( - _confLicenseMozillaPublicLicense20, - "conf/license/Mozilla Public License 2.0", - ) -} - -func confLicenseMozillaPublicLicense20() (*asset, error) { - bytes, err := confLicenseMozillaPublicLicense20Bytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/license/Mozilla Public License 2.0", size: 14827, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_bgBgIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xdc\xbd\xeb\x8e\x5b\xd7\x99\x28\xf8\x9f\x4f\x41\xab\x21\xc4\x06\x4a\x34\x9c\x9c\xb9\xc0\xb0\xec\x49\x9c\x3e\x4e\x66\x62\x27\x13\x39\xc0\x00\x82\x40\xb3\xc8\x5d\x55\xbb\xc5\x22\x19\xee\x4d\xc9\x72\xa3\x01\xa9\xd4\xbe\x05\x83\x56\xe2\x76\xc6\x86\x4f\x6c\xd9\x4e\x77\x9f\xe9\x7f\x54\xa9\xa8\xa2\xaa\x54\xd4\x2b\x90\xaf\x30\x4f\x32\xeb\xbb\xad\xf5\xad\xcb\xde\x64\xc9\xca\x9f\x83\x20\x96\xc4\xbd\xee\xeb\x5b\xdf\xfd\xd2\x19\x8d\xda\xbd\xac\xe8\x5e\x5e\xfe\x69\x39\x5b\x1e\x2f\x9f\xae\x6e\x2f\x17\xcb\x07\xcb\x53\xf3\xaf\x27\xe6\xff\x67\xcd\xd5\x1d\xf8\x61\x75\x67\x75\xb0\x3c\xc4\x1f\xde\xca\x4b\xf3\xe3\xea\x0f\xa6\xe5\x21\xfc\xb7\xd1\xd8\x1b\xee\x67\x97\x97\x5f\x2f\xa7\xab\x8f\x97\x53\xd3\x75\xd1\xe8\x75\x8a\xbd\xed\x61\x67\xdc\xbb\xbc\xfc\xde\xfc\xf4\x00\x7f\xcc\xde\x1f\xf5\x87\x63\xd3\xf2\x2b\xd3\xf2\x80\x5a\x2e\x1f\x36\xf6\xb2\xfe\xe8\xf2\xf2\xbe\xf9\xfb\x93\xe5\x62\xf5\x69\xa3\xc8\x77\x07\xed\x7c\x70\x79\xf9\xd9\xea\x43\xf3\xe3\x11\xfd\x30\x9c\x94\x97\x97\x5f\x2e\x8f\xf5\x6f\x13\xd3\xef\x5b\xb3\xa6\x87\xcb\x39\xac\xcf\x2c\x68\x6e\xfe\x3f\x5d\x3e\x36\xa3\xcf\x60\xe1\xb3\xc6\x38\xdb\xcd\x8b\x32\x1b\x87\x0d\xa7\xab\x8f\xcc\xdf\xef\x35\x6e\x66\xdb\x45\x5e\x9a\x35\xfd\xd5\x7c\x36\xbb\xa4\xde\x8d\x1b\xd9\xb8\xc8\x87\xb0\x86\xe5\x6c\x75\xdb\xfc\x0c\x6d\x47\x9d\x5d\xd3\xf0\x3b\xea\xbf\x3c\x33\xbf\x7d\xb4\x9c\x36\xca\x6c\x7f\xd4\xef\xc0\x10\xff\xaf\xec\x74\x79\xd6\xe8\x77\x06\xbb\x13\x6c\xff\x67\x73\xaa\xf3\xe5\x49\xa3\x3b\xce\x4c\xab\xf6\x20\xbb\x09\x63\xfc\xc1\xfc\x7a\x64\xda\x1f\xe2\x48\xb3\x56\xab\xd5\x98\x14\xd9\xb8\x3d\x1a\x0f\x77\xf2\x7e\xd6\xee\x0c\x7a\xed\x7d\x3c\x2c\x73\x30\x38\xa3\x59\x9e\x99\xd1\x6c\x6c\x79\x6a\xd6\x73\xb2\x9c\x37\xe9\xb2\x56\xff\x6c\x86\x3f\x6d\xf2\xbf\x5b\x78\x32\x59\xcf\x1c\x60\xbb\x53\xc0\xfa\x9f\xc2\x9e\x61\x96\xa6\xe9\x04\xe7\xbe\x68\xe0\x54\x83\xce\x7e\x7a\xf4\x46\xb6\xdf\xc9\xfb\xb0\xf0\xd3\x96\x19\x13\xee\xc4\x6c\x73\xd4\x29\x8a\x9b\x43\xb8\xd0\xfb\x66\x14\x00\x92\x53\xf3\xeb\x38\x6b\x97\xb7\x46\x19\xdc\xd5\x1f\x10\x3c\x8e\xcc\x79\xc1\xe1\x43\x3f\x03\x1e\x66\x36\xd3\xf6\xcc\xcc\xd9\xed\x8c\xca\xee\x5e\xe7\xf2\x9b\xf4\x67\xc3\x74\x1d\x0d\xcd\xd1\x0f\xc7\xb7\x2e\x2f\xff\x5d\x4e\xd4\x0c\x3a\x37\xd3\xcd\x1a\xc3\xf1\x6e\x67\x90\x7f\xd0\x29\xf1\x16\xbe\x31\xdf\x1f\x72\x8b\x63\x7b\x77\xfb\xf9\x78\x3c\x34\x37\xfb\x8d\xf9\x76\x8a\x73\x13\xf0\x99\x23\x6e\xc3\xe8\x00\x92\x66\x11\xcb\x45\x73\xf5\x61\x34\x01\x34\xda\xcf\x77\xc7\x78\x73\xd4\x6e\xda\x34\x10\x38\x5f\x3e\x54\xe0\x41\xad\x68\x1a\x19\x0c\x80\x36\x9a\x6f\x67\x38\xbe\xae\xe6\x83\xd9\x8e\xcd\x79\x23\x30\xc0\xab\xa9\x5e\x84\xd9\xa9\x5a\xc0\x22\xbd\xd3\xce\xc0\xc0\x12\x35\xfd\x2b\x5e\x3b\x40\xce\x29\x0e\x3c\x87\xd3\x3e\xab\xe8\xbb\x9c\x37\x3a\xbd\x7d\x03\x0b\xa3\xce\x20\x33\x77\xfa\x47\xb3\x68\xd8\xe3\x99\x7a\x08\x07\xe6\xdf\xf4\xb2\xcd\xa5\x21\x34\x1a\x18\xe8\x74\xbb\xc3\xc9\xa0\x6c\x17\x59\x59\xe6\x83\xdd\x82\x9e\x37\x75\x59\x2c\x1f\x13\xfc\xe1\xac\x0a\x08\x0d\x40\xd4\xb4\x6f\xdc\x1a\x4e\x2c\x80\x03\x64\x4e\x57\x9f\xc0\xee\x56\x07\xde\x20\xd4\xcc\x8d\x23\xed\x0e\x78\x9f\xc1\xa0\x66\xa5\x65\x7e\x23\x2f\xf3\xac\x80\xed\x9d\xf0\x76\xcc\x81\x23\xca\x9a\x37\x46\x93\x7e\xdf\x80\xc3\xef\x27\x59\x51\x9a\x26\x5f\x98\x11\xee\x99\x06\xb8\x01\x73\x4a\x80\x26\x4e\xb1\x0b\x6e\xbd\x91\x17\xc5\x24\xa3\x76\x70\xc1\x06\xa3\x99\x39\xba\x9d\x41\x17\x8e\xef\x1b\x33\xe2\x09\x5c\x6d\xa3\x71\x35\x1f\x14\x65\xa7\xdf\xbf\xd6\xe0\xbf\x00\x76\x3a\xc3\x39\x01\x2a\xe4\xe6\xca\xbc\xec\x33\xd2\xf8\x83\x39\x5e\x3b\x2b\xdc\x81\x6d\x3c\x67\xc0\x98\xd1\x41\xe0\x4b\x46\xf4\x8a\xd0\x23\x58\x15\x61\x08\xbb\x18\x8c\x74\xe0\x3a\x35\x7a\xc3\xee\x75\x83\x3a\x00\x8f\x02\xa2\x33\x87\x60\x5a\xbe\x35\xdc\x2d\x9a\x88\x05\xc3\x1e\xcd\xe5\x61\xf3\xe7\xd8\x05\x30\x82\x99\x01\x9f\xfd\x63\x18\x6a\x75\x7b\x0b\xde\x80\x79\xdb\xab\x7b\x72\x29\x1f\xd3\x8b\xc6\xf3\x7f\xad\xd3\x2c\x3b\xe3\xdd\xac\xbc\x7c\xa1\xbd\x6d\x50\xdc\xf5\x0b\xcd\xbd\x71\xb6\x73\xf9\xc2\xc5\xe2\xc2\xeb\xb8\x54\xb9\xa9\xd5\x5d\x3a\x28\x46\x94\xf7\x5e\x7b\xb9\xf3\x7a\x13\xef\x65\x6e\x26\x98\x12\xa6\x81\x2d\x6d\xd1\x3c\xf0\x9a\xcc\xbe\x8f\x04\xa2\x00\xbe\xf9\xce\x89\x24\x3d\x21\x60\x47\xc4\x92\x80\x03\x0b\x1e\x4d\x3c\x53\x83\x72\x9b\x02\xe0\x82\xa9\x5f\x68\x00\x14\x18\x64\xdf\xee\x6d\x13\xcd\xa3\x33\x82\xc7\x32\x47\x94\x0a\x2f\xf0\xed\x5b\x57\xfe\xcf\x5f\x6d\x35\x7f\x33\x2c\xca\xdd\x71\x86\x7f\x37\xff\x31\xbd\x7e\xd2\xa4\x87\xdb\x7c\x37\xff\xf9\xcf\x5a\x0d\x33\x06\xdf\x6d\xd5\xc3\x78\x40\xfb\x87\xf5\xe0\xc6\xcc\xaf\x66\x25\xd8\x11\x51\xe6\xf7\x66\xbc\xa7\x7e\x5b\xdd\x6e\xcf\xac\x00\x29\x85\xa5\xb3\x80\xb5\xd3\x18\x3b\x8d\x9c\xcd\x4c\x84\xe4\xbf\x84\xd3\xab\x9e\xc9\xb4\x13\xd8\xf9\x0b\xdd\xfd\x16\x9d\xca\x53\x1c\xe8\x18\xdf\x06\xd1\xd4\x5f\xbe\xf3\xce\xaf\x7f\xfe\xb3\x66\x36\xd8\xcd\x07\x99\x39\xe1\xe6\xa4\xdc\xf9\x5f\xdb\xbb\xd9\x20\x1b\x77\xfa\xed\x6e\x4e\x10\x75\xa4\x21\x1a\x67\x3d\xc6\x1b\xfb\x48\xa0\x1f\x0f\xd9\x90\xaa\xa2\x6f\x88\x5c\x2f\x23\xe2\xfc\x08\x40\xa3\x79\xe5\xca\xaf\xcc\x76\xca\x3d\xb3\x15\xb3\xe9\x83\x46\xf1\xfb\x3e\x5c\x99\x2c\xf0\xdf\x60\x29\x40\xee\x60\xd8\xc4\xc5\xa4\x36\xd8\x7a\x6d\x7b\xfc\xba\x6c\xad\x6a\x67\x40\xbb\x91\xd5\x39\x5d\xfd\x0b\x9e\xea\x19\xbd\xc2\x03\x18\xc8\x3c\xbc\x7f\x96\x89\x4f\x10\xff\x23\x21\x8d\x1e\x17\x8e\x44\x50\x75\x22\x4d\xee\x02\x82\x31\xcf\xc1\xf4\x69\x35\xb2\xf1\xb8\x6d\xf8\x85\xf2\x16\xc0\xa0\xda\x26\x61\x41\x98\x68\xc3\x3d\x35\xe9\x70\xe1\xad\x3e\x82\xbf\xe0\xc3\x99\xc9\xdb\x39\x86\xf5\xd3\x6c\xf9\xe0\x46\xa7\x9f\xf7\x0c\xb0\x0a\x38\xd0\x90\x67\x42\xa4\x8f\x11\xcd\x9c\x22\x52\x9c\x36\x2f\xb4\x2e\x00\x2b\x71\xe1\xd2\x05\x40\x13\xf8\x58\x67\xb8\x8f\x3a\x98\x6e\x35\x06\xc3\x36\xd1\x19\xe0\x5b\x7a\x79\xd1\xd9\x36\x3c\x0c\xf1\x5e\x63\xa6\xe1\x5f\x9b\x35\x1d\x22\xdf\x43\x8b\x06\x74\x86\x77\x71\x82\x47\xfe\xb1\x60\x60\x7e\xc5\xb7\x63\x76\x4d\x5e\xf9\x03\xe0\x54\x1d\xda\x38\x44\x90\x9f\x3b\x94\x62\x4f\x03\xb8\x54\xe6\xb3\x8e\x84\xc0\x2d\x68\x0e\xc4\x37\xf0\xcb\x74\x0d\x45\x74\x84\x49\xdf\x9e\x10\xd5\xc4\xb3\xa3\xb3\xc1\xd3\x4a\x8f\x6d\xc8\xf4\xba\xdb\x3b\x03\x58\x69\xc8\xb3\x62\x3c\xf3\x8d\x01\xd0\x4f\x19\xbb\x54\x52\xe2\x39\xb2\x1c\x8f\x84\x33\x40\x76\x0f\x78\xfc\x18\x11\xac\x6b\x6d\x9f\xdc\x7d\x26\xa5\x88\x92\x23\x90\x40\xb1\x60\x01\xf0\x5b\xc9\xbe\x98\x36\x40\x0e\x9a\x97\x9a\xe6\x1b\x81\xda\x13\xe8\x6e\x56\x72\x02\x77\xb8\xfa\xd4\x74\xff\x74\xb9\x78\x01\x79\x42\x7e\x16\xdf\x98\x67\x73\x86\x5c\x91\x7e\x8a\x27\xe6\x42\x9f\xc4\x9c\x14\x1e\xba\xeb\x6d\x97\xfe\x19\x72\xee\x1f\xd3\x19\x19\xb4\xc9\x2c\xdb\x0c\x88\x1a\xbe\xa2\x78\x24\xda\x15\xca\x38\x9f\x22\xb0\x99\x19\x81\x0f\x38\x20\x99\x47\xda\x33\x31\x3a\x74\xe4\x86\xb1\xde\x0c\x59\x90\x05\x42\xe4\xbd\x56\x63\x3c\x31\x62\x4a\x15\xde\x16\x3e\xde\x51\xe1\x13\x38\x69\xdb\xc9\xee\xe3\x7b\x7c\xa7\x44\xfc\xc2\x41\xe0\x74\x6f\x9b\x23\x7d\x40\x0c\xe4\x11\x31\x17\x4f\xe8\xef\x78\x73\xc0\x79\x10\x72\x81\x7f\xf3\xa9\x22\x55\xde\xe8\x5c\x45\xb4\x20\x69\x85\x66\x08\x11\x1f\x22\x3d\x43\x14\x87\x46\x74\x30\x6f\xfd\x73\x26\xd8\x86\xa9\xe0\xdf\xd4\x56\xf8\xb8\x42\x28\x9e\x36\x91\xa5\x35\xab\x12\x10\xfd\xdd\x6f\x7f\x85\x6f\x08\x61\xe4\x0e\x91\x91\x69\xd3\x72\xd5\x8e\xc6\xac\x3e\xc6\x23\x39\x36\xc4\xe3\x17\x40\x55\xf6\xda\xa3\xe1\xb8\xbc\x6c\xfe\x45\x27\x76\x1b\xe8\x08\xff\x6a\x17\xf2\x35\xad\x91\x1e\xe3\xd4\x36\x64\xca\x62\xba\x6a\x19\xd7\xbc\xc7\x26\x80\x24\x3f\x83\x99\xe3\x4c\xe8\xb9\x2e\x9a\x16\x3f\xfb\x48\x8d\x51\x96\x77\x13\x4f\xf5\x6a\xf7\xca\x72\x44\xcb\xfd\xc5\xbb\xef\xfe\xc6\xad\xd7\xfe\xee\xbd\x43\xf3\x65\x8b\xd7\x0b\x40\xf3\x98\xde\x61\xc5\x53\x26\x08\x26\xf2\x63\x18\x33\x83\x52\xe0\x6d\x4f\xc6\xfd\xcb\xfe\xc9\x6e\x80\x10\x4c\xa7\x18\x18\x13\x37\xa8\x78\x35\x03\x5d\xb0\xa3\x97\xe1\x3f\x57\x36\xba\x47\xb3\xb3\x29\xa3\x68\x03\x04\x4c\x67\x11\xfa\xbc\xce\xb8\xd8\x99\x16\x4e\x5b\x8d\xfe\x70\xb7\x3d\x1e\x0e\x4b\x4d\x53\x05\xaa\x97\x8f\xcc\xf6\x41\x08\x25\x56\xdb\xdc\x87\xdf\xdc\x6e\xec\xf3\xf8\x01\x23\x11\x3c\x61\xfc\xb6\x40\x95\x02\xae\x9e\xa5\xea\x43\x44\x0c\xf1\x04\x06\x79\x0f\x47\x40\xf6\x34\xf6\x7e\x8a\x34\x6c\xc1\xed\xce\x92\x98\x9c\x64\xef\x75\x9c\x25\x6d\x1b\xce\xf8\x0e\x1e\xbb\xe6\x31\x1a\xc5\xbe\x01\x1c\x64\x1e\xaf\xbc\x6d\x00\xca\xd3\xd4\xe0\xb7\x9d\xf1\x70\x9f\xf4\x2d\x47\xc2\x88\xbb\x0f\x4a\x8a\x08\xa0\x43\xb7\xf7\xd6\x41\x7f\x69\xfe\xf6\xbf\xbe\xd9\xfc\x9f\x7e\xf2\xe3\x1f\x9b\x6b\xf9\x8b\x47\xd7\x08\x83\xce\x9a\xa8\x57\x9a\x9b\x05\x2b\xb4\x1e\xc2\xa0\x77\xad\xc2\x03\x21\xdb\x70\x08\x2c\x18\xdc\x0a\x4a\x0f\xcd\x0b\x44\xcb\x2e\x34\x5f\xc3\x13\xfb\xdf\xb2\xf7\x3b\xfb\xa3\x7e\xd6\xea\x0e\xf7\x5f\x6f\x35\xe0\x27\x83\x3e\x09\xf1\xfe\xd9\x1f\xf3\x58\x9e\x28\xbe\x5e\xf8\x0d\x85\x28\xee\x92\x24\xe9\x95\x9d\x44\xbb\xd4\xee\x0e\x07\x3b\xf9\x78\x1f\xa4\x55\xfb\xf2\x19\x5b\x33\x02\x79\x44\x2c\x88\x7d\x9b\x6b\xb8\x1c\x5c\x4f\x7b\x30\x2c\xf3\x9d\x5b\xfe\xa8\xe6\x9a\x49\xd1\x02\xef\x8c\x55\x00\x88\xc9\x11\x13\xd0\x2e\x91\x1c\x9a\xcd\xdf\xc8\x40\x92\x1e\xdf\xc8\xbb\xd9\x1a\x98\xf2\x91\x1d\x3e\x3a\x73\x33\x08\x52\x73\x0d\x5f\xf3\xc6\x70\x67\xa7\x6f\x98\x7f\x66\xdc\xbd\xfd\x02\xa3\x74\x8a\x7c\xf2\x19\x6d\xed\x11\x51\x22\xaf\x8f\x41\x6a\x23\x50\xdc\x7d\xa9\xb1\x64\xf3\xcd\x9f\xbf\x43\x58\xf2\x36\x91\x55\xc6\x24\x47\xc0\x38\xd8\x77\x33\xf3\xc6\xdd\x02\xc0\x70\xf4\x9d\xe0\x08\x5e\x22\xd2\xb8\xb9\x65\xd9\x09\xda\x22\x72\x2e\x38\x19\x10\xba\x41\x37\xf8\x1e\xa1\xed\x89\x08\xdb\x86\x9c\x31\x23\xbb\x3b\xee\xdc\xe8\x18\xc1\x37\x5c\xb4\xe9\x78\x1b\x39\x4c\x7c\x84\x77\x9a\x6f\x71\xbb\xa8\x63\x6a\xcf\x40\x4b\xa5\x43\x53\xa0\xfc\xcc\xe0\xe9\x33\xe2\xb2\x8e\x11\x0b\x7d\xcc\xd2\xeb\x7c\x8b\x38\x0d\x9c\xe9\x63\xd8\x89\xde\x3b\x91\x66\x22\xc9\xb0\xf3\x88\x23\x20\xcc\xc9\xcf\xe9\x04\x55\x0a\xcc\xc1\x2c\x50\xfd\x12\xb3\x15\x42\xb9\xb8\x0f\x0f\xc2\x32\x03\x8b\x4e\xd0\xd5\x9f\xd9\x42\x21\xbe\x6b\xa0\x8d\x0f\x1c\x7e\x6f\x35\x76\xb2\x5e\x06\x1a\xb7\x5e\x9b\xcf\xa5\x3f\x1c\x5e\x97\x83\xd1\x32\x99\x93\x1c\xbd\x53\xf1\x26\xab\x1a\x4d\x0e\xfb\x7e\x24\xdc\x44\xa2\xdf\x26\xd3\xd0\x11\xe9\x27\x40\x72\xc5\x21\x72\x0f\xa8\x63\x02\x26\x1f\xee\xbf\x9f\x6f\xf3\x85\x3a\xd8\xf1\x85\x20\x1f\x7e\x50\x2f\xfb\x04\x81\x3e\xa1\x9b\xc6\x47\x9c\x1a\x26\xfd\x82\x52\x97\x48\xf4\x01\x99\xb8\xfa\xb9\xb6\xec\xf7\x5a\xa9\xc5\x13\x58\x94\x74\x75\x18\x2a\x02\x8d\x48\x98\x0d\x70\xe1\xa2\xf7\xf5\x30\x85\x28\x81\xfd\x36\x7a\x5f\x4e\x21\x83\x17\x05\x1a\x3a\xad\x55\x30\x87\xcd\x9d\x44\x65\x56\xbf\x3f\x45\xb0\x22\x38\x6f\x91\x5e\x68\x9c\xb5\xd9\xf2\xd0\xbe\x91\x83\x92\xde\x43\x6d\xc7\x48\xaa\xfe\x60\xda\x3f\xf2\x45\xcd\x43\xc7\x0a\x10\x38\x1d\xcb\x59\xcc\x44\x4d\x6c\x31\xac\x56\x47\xcd\x93\xb3\xca\x11\x7c\x27\x97\x71\xe8\xf4\xf7\x15\x77\x0c\x3f\x3f\x11\x9d\x04\x93\x5c\x23\xa8\x21\xc1\x61\xb1\xc5\x9b\x17\x7a\x01\xa7\x85\x64\x98\xd4\x71\x67\x56\xd5\x86\x02\xc2\x0c\xb9\x7a\x3b\xb8\x3f\x18\x2f\x2c\x35\x2a\xeb\x53\x2b\x2e\x00\x31\x1c\x1a\x6f\x5a\xac\x93\x66\x1d\x2f\xdb\x9f\xbe\x46\xb1\x10\xf8\x3b\xf3\xca\x1e\xd1\x3e\x16\x2c\x76\xf9\xc6\x92\x75\xd2\x75\xd2\x3c\x72\x48\xa7\x44\xac\xa9\x79\x10\x5b\xb8\x5a\x10\x3b\x99\x87\x4e\xbc\x9e\x7b\x38\xbd\xd2\xc6\x36\x7f\xf9\x73\x1c\xc9\x53\x83\x4c\xc9\xce\xc1\x6a\xcd\x39\xa2\x6c\x46\x82\xc0\x78\x7f\x2c\xef\x63\xed\x7a\x95\x90\x20\x47\xb4\x8e\x11\xd4\x3b\xac\x3f\x14\x83\x4b\x68\xc8\x4a\xbb\x0f\x2e\x63\xc1\x02\x7e\xa3\x46\xc3\xd1\x60\x6e\xc7\xfb\x9a\xe4\x74\xec\xb3\xf3\xb4\x23\x3c\x76\xd2\xcc\xc4\xca\xf4\xf6\xee\x10\x74\xff\x5f\x46\x4a\xf2\xc7\x28\x69\x36\xca\xac\x28\xdb\xbb\x79\xd9\xde\x01\xb6\xad\x87\xda\x25\x44\xd1\x4f\xcd\x9f\x9f\xe0\x05\xa0\xd2\x9a\xac\x96\x08\x35\x8e\xeb\xba\x60\x3a\x5e\x20\x01\xea\x09\x7e\x33\xb0\xf5\x6a\xf3\xe2\x0d\xd6\x35\xfe\x04\xd8\x2e\x20\x29\x79\x1f\xb0\x93\x58\x20\xf8\xb6\x0f\x9d\x41\x50\x29\xd1\x8e\x00\x39\xe0\xde\xad\x56\xd2\x69\xd2\xb7\x84\x9c\x33\x46\xa0\xb7\x82\xf7\x86\xac\x0d\xf1\x1b\x56\xa9\x06\x14\x8b\xa0\x28\x9c\x0e\x9e\xc3\xc5\x82\xc4\x24\x98\x7a\x77\xb8\x3d\xc9\xfb\x3d\xaf\x15\x8c\xd2\x6a\x88\xd6\xaf\xb7\x2d\xaf\x2c\x01\x44\x4e\x67\x5e\xa1\xd7\x6b\x8a\xc0\x35\x43\x19\x48\x64\x23\xf3\x05\x8f\x4b\x26\x49\x6a\x6d\xce\x9c\x69\x67\x03\x0d\xc3\x8c\x66\x71\xa8\xde\x00\x10\xce\x61\x55\x21\x70\x27\xfb\x1d\x83\xf1\x6b\x34\x29\x34\x61\xa0\x4d\xa9\x97\x6e\xf9\x0e\x9d\xed\x00\x7a\xdd\x05\x3d\x1b\xf3\xd4\xe1\x4c\x66\x55\x45\xf3\xd2\xeb\xe6\xbf\x8d\xa2\x73\x23\x23\xce\x7f\xb7\x06\x0e\x59\x5c\x9c\x46\x2c\x07\xad\xf3\x9f\xd1\xe2\x78\xd7\x61\x4a\xef\x68\x3d\x44\x59\x7f\x85\xe7\xc2\x05\xea\x66\xdd\x99\xbb\x7b\xa5\x37\x58\x4c\xba\xdd\xac\x28\x48\x9d\xf3\x00\x8e\x81\x70\xd4\x27\xd0\xfe\x85\xe6\xf2\x5b\x9c\xe1\x10\x29\x02\x99\xdb\xb7\x98\x37\x05\x3e\xeb\x01\xce\xf7\xa1\x55\x89\x6f\x21\x09\xf8\x8c\xa9\x18\xde\xc2\x29\xe3\xf4\x27\xd6\xf2\x85\xf0\xcb\x92\x11\x18\xd3\x17\xa2\x80\x62\xf9\xe4\x08\x75\x77\x42\x0a\x81\x2c\xb0\x5e\x6a\xfe\x82\x3d\xb3\x40\x17\xb0\x0e\x24\x63\xe9\xbd\x06\x1c\x1b\x57\xc1\xd7\xe1\x5a\x63\x42\x1a\xd2\x61\xbf\x97\x8d\xad\x5a\x95\x59\xe5\x59\xd2\x6e\x6e\x1b\x6b\x44\x5a\xdc\xcc\x0d\x44\xb7\xad\xb7\x04\x40\x53\x99\xbd\x5f\x82\x06\xe3\x36\x2e\x40\xb1\x20\x49\xb8\x46\xe4\x88\x4e\x07\xa8\xab\xd9\xbf\x85\xaf\xb1\x20\x4b\x0e\x9b\xe2\xa2\x37\xd7\x28\xf6\x86\x37\xd1\xbd\x40\x5a\xdf\x67\xc1\xe7\x11\xf1\xbb\x9f\x26\xbb\x81\x93\x42\x77\xd8\x37\x58\x71\x08\x8c\xe8\x0d\xdb\xfb\x3b\x8f\x1d\x4e\xeb\x55\x61\x69\xc3\xf1\xae\xb7\xb2\x0a\x8b\xb5\x69\x49\x36\xf7\xa0\xb1\x67\x76\x9f\x36\x90\x5f\x22\xd7\x93\xfb\x31\xbb\x65\xde\x27\xdb\x72\x5b\xe6\x05\xa1\x4d\x99\x57\x8b\xae\x0a\x4d\xcf\xae\x9c\x58\x6e\xe3\x2a\xbb\xab\x5c\x6b\x70\xbf\xd0\x49\x61\x8a\x06\xb9\x22\x89\x8f\xcc\x2e\x8a\xac\x33\x06\x6c\xf5\x3d\x00\x2e\x3c\x0e\xd4\x18\x34\xae\x76\x26\xe5\xde\x35\xe5\x0d\xd2\x66\x53\xbb\xf6\x0a\x79\xdc\x24\x90\xf5\x0d\xe3\x56\xdb\xb0\x97\x8d\x40\x57\xb1\x5f\xec\x92\x83\x0a\xbf\x39\xb6\xab\x7a\x9d\xde\x68\xb2\x0b\xc8\x27\x4c\x77\x50\x88\xc3\xe5\x3c\x04\x93\x68\x31\xec\xe6\x9d\x7e\xfb\x19\x87\xfe\xce\x92\xfc\xe4\xe0\xbe\xf0\x42\xde\x2d\xfb\xa3\x12\x8d\xeb\xc4\xd7\x3d\x22\x7d\x3c\x73\x0b\x31\xab\xa7\x4c\x4f\xf4\x86\xe7\x15\x3a\x93\xa6\xa0\x1d\x79\x30\xe8\x73\x01\x4a\x5b\x10\xf9\xf1\x7d\xab\x25\xca\xd3\xaf\xc3\x90\xcc\xb4\xb3\x81\x70\x1a\x4a\x74\x70\x48\xc8\xbf\x54\xec\xe5\x59\x95\x3f\x15\x1b\x31\x97\xbf\x9f\xed\x6f\xc3\xac\x19\x39\x27\x3c\x45\xf6\xe5\x8c\xd8\xff\x59\x63\xc7\x3c\x2e\xc4\x79\xc2\x92\x7d\x81\x16\x4d\xc2\x8e\xb3\x88\x0f\xc3\xf6\xd9\xe6\xed\xdf\x10\x8f\x2b\x43\x88\x6f\x02\xb3\xce\x3c\xba\x77\xaa\x8b\xc0\x95\xe3\x8d\xe6\x1a\xf7\x2c\x0b\x2b\x2d\xe1\x29\x49\xc0\x45\xe5\x57\x91\x0d\x4a\x0b\x31\xd6\xf9\x86\xc4\xa1\x27\x56\xe3\x5e\x71\xcc\xf6\x18\x9f\xf2\xa5\x92\x0f\x0e\x5a\x41\x5e\xdb\x7e\xfd\x62\xf1\xda\xcb\xdb\xaf\xb3\xaa\xd2\x39\x3b\x10\x23\xa5\x5c\x98\xb4\x9a\x55\xc4\x68\x40\xc5\x86\x64\x1c\x88\x7e\x18\xf7\xf4\x24\x70\x42\xb8\xc3\xa8\xea\x10\x65\x0c\xfa\x72\xb1\x07\xe4\x71\x0a\x30\xb5\xa5\xed\x05\xc7\x28\x42\x00\x96\xf8\xc4\xf3\x79\x30\x00\xa1\x54\xde\x69\xb9\xaa\x45\xfe\x2f\x19\x61\x38\x8b\x4a\x9c\x23\x4c\x68\x89\xd7\x08\xc5\x1c\xee\x5e\xbe\x6d\xb8\x68\x43\x32\xd1\xe1\x0e\xa9\xdd\xb1\x92\x64\x19\x22\xd8\x85\x29\xe8\xc0\x82\x5b\x95\x23\x8f\x58\x60\x41\x82\xd2\x43\x89\x3a\xf5\x50\xcf\xa6\xfc\x4e\x40\x98\x4e\x61\x95\xda\xe7\x0a\x0f\x04\x01\xa6\x9f\xef\xe7\xe5\x3a\x44\x03\x6c\x88\xe0\x9b\x43\x84\xc1\x27\xac\x8c\x67\x46\x77\xe1\x03\xcf\x9c\xf9\x98\x08\xfa\xa6\xf6\x9c\xe5\x3e\x9a\x9e\xa3\x01\x4a\x7f\x27\x16\xe6\x7f\x42\x1e\x66\x67\x04\x3e\x5b\x16\x4c\x88\xb8\x33\x6e\x58\xe0\x2c\x07\xb6\x13\x02\x38\x61\x3f\x83\x07\xf6\x3a\x45\x7b\x32\xe0\xd7\x92\xf5\x2c\x12\x3a\xb2\x4f\x97\x7a\xa1\x9c\xa0\x10\x37\x5c\xa1\x7e\x2b\x47\x9b\x28\xe0\x5f\xb4\x4f\xe5\x25\xf3\x2b\x39\x16\xb1\xfe\xc5\x3e\x11\x16\x72\x99\xf9\xd9\xf8\x79\x72\x7b\xbd\x42\x27\xf7\x3b\x6d\xa3\x77\x0b\x42\x04\x34\x1a\xd0\x80\xf3\x29\x9e\xc1\x89\xc5\xf5\x06\xe4\xee\xa2\x68\x2e\xca\x9f\x4b\xa8\x36\x37\x0b\x66\x70\x91\xe3\xfb\xcf\xa0\x23\x19\xac\xf5\x23\xdd\x70\x35\xf5\xbb\x66\xeb\x0e\x8a\x97\x05\x52\xde\x32\x53\xf6\xb4\x35\xc6\x10\x16\x54\xec\xf3\xc0\x97\xd3\xa4\xd6\x73\x32\x07\x06\xfe\x0a\xb8\x43\xd8\x68\xb9\xf1\x3e\xf5\x8d\x62\x93\x17\x35\xf8\xbd\x14\x6f\x15\x6e\xed\x34\xc6\x32\x81\xc4\x4f\x8b\x70\xc4\xe6\xeb\x8d\x7a\x09\x47\xdf\x45\x53\x43\xf5\x5b\x66\xfc\xc3\xce\x47\x9b\x11\x06\x66\xa4\xff\x80\xae\xb3\xcc\xb8\x27\xb8\xfe\x56\xb0\x74\x6b\x1f\xdb\xe0\x28\xd5\xd1\xc8\x6b\xf1\xbd\x44\x80\x98\x38\x01\xa1\x1c\x0e\xdb\x86\x31\x1f\x97\x97\x51\xb2\x3a\x26\xeb\x34\x89\x2a\xa9\xe3\x49\x3a\x91\x58\x63\x1b\x42\x3b\xa8\x37\x4e\xcd\x2f\x27\x44\x9b\xff\x67\x76\xc4\x02\x8c\x04\x3e\x3b\x03\x83\xc7\xbb\x86\xfb\xb3\x64\xe3\x6b\xe4\x5d\x9d\x0d\xa4\x5a\xe3\x68\xa7\x56\x6a\x47\x84\x0b\xb4\xfc\x92\x4d\x21\xde\xac\xb3\x7d\x93\xbf\x40\xe3\x2a\xc0\xe5\x35\xa2\x61\xc0\x0f\xdb\x95\x58\x24\x3a\x0d\x28\x19\xe3\x44\x75\xe9\x9a\xa2\xd9\x81\x58\xb9\x74\x5f\x51\xf5\x75\x2f\xec\x19\x81\xd4\xb2\x83\x56\x5c\xfe\xab\x92\xff\x6b\xf5\xa1\x47\x09\xb9\xda\x8d\x27\xc6\xbf\x94\xf4\x0d\x27\x37\xec\x75\xcc\xd1\xdd\xca\x50\x40\x9f\x9a\xeb\xc4\xfb\x6b\x98\xdf\xb1\x1b\x6d\x9d\xdd\x26\x4d\x7b\xc3\xf0\xed\x5f\x6b\xfc\xce\x88\x2c\xef\x6c\xa6\x01\xfc\xad\x11\x7b\xde\x09\xdd\x86\x62\x27\x66\x94\x3b\xff\x9e\x8e\x3b\x34\x1a\xfb\xe7\xfb\x9b\xa4\x32\xf1\xb7\x19\xb9\x43\x82\x08\xaa\x1c\xc6\xe3\x83\xbe\x72\xe5\x17\xef\x92\x3a\x54\xad\x07\x7d\x3c\x98\x55\x6e\xfc\xa2\x2c\x47\xc5\xef\xc6\xfd\xcb\xe4\x73\xe0\x7b\x39\x98\xe9\x6f\xf5\x87\x9d\xde\xef\xaa\xfc\x1f\x62\xf3\xee\xbb\x59\x67\x3f\x3a\x01\x54\x86\xcd\x61\x75\x8d\x9f\x1a\x51\x2e\x3e\xa1\xbb\xd6\xb2\x68\xf9\x49\xc7\xfa\x37\x7e\x0a\x1a\x9d\xbf\x4f\xa8\x3e\x37\x50\xe0\x36\xde\xc9\x6e\xfe\x6c\xdc\x19\x74\xe3\x59\x45\x5e\x64\xa7\x8a\xc6\x9b\xc3\x7d\xc3\x07\x5d\x99\xec\xef\x77\xc0\xc1\x1e\xd8\xf0\xe3\xd5\xbf\xa8\x55\x92\x7a\x81\x7c\x5f\xef\x71\xf3\xb7\x0d\xf8\x62\xcc\xc2\xf7\x81\x92\x21\xd5\xf8\xcd\xbd\x61\xde\xcd\xc8\x5a\xf3\x40\x9c\xda\xa2\xb6\xef\x8e\xb3\x8c\xe1\x2d\x76\xa6\x34\x23\x0d\xca\x4c\x44\x5f\xab\x41\x65\x62\x69\x0d\x24\x19\xfa\xdf\xbf\xb7\x06\xdf\xad\x9c\xe3\xe3\x7b\x8d\x4e\x7f\xb4\xd7\x41\xbd\x8a\xed\x1d\x1b\x45\xb3\xa6\xa7\xfc\xc2\xd1\xee\x92\xd5\x09\x15\x59\x73\x64\xcf\x16\x42\x1f\x56\xe4\xeb\x34\x7b\xf1\x52\xfb\x25\x7f\x8a\x9e\x21\xe8\x3f\x78\x9a\x2d\x6f\x02\x35\xe9\x02\x8d\xbc\x53\x33\x65\x91\x7f\x90\xd5\x4c\x44\x5c\x32\x9f\x03\xb9\x36\x5d\x2c\x4c\x37\x54\x21\xd6\x77\x45\xba\xea\x54\xd8\xd6\x4f\xf2\x62\xa1\x49\x86\x19\xaa\xf3\xfe\x79\x87\x82\xce\x8f\x2f\xa1\xa8\x0a\xd4\x62\x11\x8d\x49\x4c\x91\x7f\xc9\xb3\xa6\x4f\x86\xd7\xa0\x6e\x33\x0a\x78\x28\xad\x19\xc3\x7f\xf5\xa6\x4f\x3e\xe8\xf6\x27\xbd\x73\x6c\x46\x69\xdf\x7e\x74\xb1\xf8\x11\x4c\x3b\xb8\x6e\x04\xe2\x01\x0f\x81\x04\x74\x8e\x9a\x5e\xd1\x85\x99\x81\x1e\xe2\x84\x9f\xc0\x76\x5f\x95\x38\x98\xb6\x99\x7b\x38\x1e\x67\xdd\x52\x22\x62\xdc\xaa\x23\x36\x1d\xa8\xb5\x65\x13\x3c\x45\x78\xc0\x10\xac\xf1\x39\x59\x7d\x6d\xb9\xf7\x3f\xa0\x65\x91\x42\x1c\x0e\x5a\x2e\x22\xa8\xbd\x9d\x65\x83\x76\xd9\xb9\x9e\x0d\x6a\x48\x04\x09\x2a\x73\x42\x27\x87\xac\x26\x8a\xdc\x03\x5a\xe4\x91\x19\x0d\xfb\x65\xe0\x41\x9a\x24\x29\xb5\xe3\x0e\xc7\xbb\x6b\x87\x4d\xfb\xa2\x3a\x23\x4e\xc5\xd0\xa5\xc1\xf9\xeb\xc7\xb6\x34\xa0\x76\x2c\x82\x6c\x1c\xc7\x9c\x6f\x6f\x73\x56\xbf\x66\x4c\x7b\x51\x16\x20\x1c\x24\x6d\x78\x61\x56\x54\x4b\xb0\x93\xa4\x6f\x20\xb2\x75\x46\x66\x7c\xc3\x8b\x8c\x31\xa0\x4c\x59\x7b\xc8\x88\x28\x4c\x1a\xb9\x24\x59\xc5\x89\xb6\x04\x1c\xba\xb8\x30\x40\x00\xde\x3a\xd2\x97\x4f\x0f\xd7\xdc\xd4\x6d\x52\x7c\x45\x0b\x30\xcf\x0d\xb8\xa3\xe7\xb5\x02\x36\x3c\x1c\xa0\x5b\x91\xf5\x6f\x5b\xb3\x06\xc7\x24\x9e\x7b\x05\x7c\xd8\x4f\xb5\x7b\x99\x9a\x8d\xaf\x18\x9f\x79\xf6\x7e\x0e\x31\x20\x9f\x2f\xa7\xf2\x90\x85\xb5\x8e\xbd\x80\xed\xc3\xc6\x07\x84\x76\x4f\x5c\x12\x38\x47\x76\x8a\x12\x74\xef\x74\x72\xa2\x2d\x07\xb9\xfb\xc3\xc0\x24\x45\xf6\x7f\xd2\x5c\x9d\x55\x9a\xc0\x58\xd1\xc7\x6f\x20\x79\x80\x56\x44\xf0\x83\x0c\xe8\x0a\x80\xd2\x99\x23\x79\xec\x82\x24\x90\x61\x00\x8a\xf0\x30\xe9\xbd\xb4\x64\x7f\xe6\xd8\x7b\x3f\x79\x77\x87\x4d\xe7\xf2\x5f\x89\x08\x0c\xce\x93\xcb\x04\xd7\xe0\xeb\xd9\xad\x2a\x09\x73\xab\xb9\xb4\xc6\xec\x19\x0b\x39\xa8\xf7\x43\xdd\x16\x12\xe8\x7b\xd2\xc2\xc6\x2f\x59\xa1\x03\x34\x4b\x4e\x58\xd1\xec\x2a\x58\x12\xc1\x90\x04\x3a\xe5\x1b\xd9\xd8\x30\xed\x76\x25\x14\x42\x92\x60\x77\x9e\xfa\xf2\x4c\x7a\x60\x5c\xf0\xc2\x05\x48\x10\xfe\x98\xe2\x19\x3c\x71\x60\x19\xd2\x47\xa7\xba\xda\x4a\xaa\x43\x1f\xc2\x4b\x00\xeb\x45\x9d\xd1\x3d\x62\x7e\xc9\xf5\x0a\xf6\x42\x06\xb4\xa2\xcc\xfb\x7d\x80\x44\x0e\xd1\xac\xd6\x1e\x7a\x77\xcb\x2e\x46\x1a\x00\xd2\x31\x95\x66\x17\xf7\xad\xbb\x46\x02\x94\x1e\x5a\xef\x3a\xbc\x1d\xde\x9b\xf2\x72\xa3\x16\x78\x76\xf0\x3e\x70\xac\x53\xcf\xd2\xca\x8e\x91\xc9\xb7\xd1\xe2\x0d\x82\x9a\x0e\xc3\x35\xab\xf7\x77\x28\x4a\x73\xb4\xb6\xdd\x25\xd5\xf0\xea\x80\x9d\x9e\xa2\xcd\x56\x02\xf2\x9a\x0d\xc3\xb3\x7a\x8a\xd7\x74\x16\xec\x36\x3a\x05\xcf\x24\xe6\x16\x24\x7e\xd0\x49\x6b\xdd\x0a\xdd\x9d\x01\xbb\x84\x37\x6b\x3d\xfd\xd3\x41\x21\xfe\xfe\x13\xb7\xfd\x2c\x77\xbb\x58\x7b\xb7\x8b\x8d\xee\xb6\x0e\x6d\x50\x04\x64\x7b\x1b\x05\x31\x8d\xa7\xff\x03\x31\x1f\x4a\x3f\xe2\x89\x80\xc2\x58\x1d\x6e\x6e\x5c\x05\x6c\x7f\xad\x61\x18\xc0\xc1\x6e\xd6\x16\x3f\x53\x11\xde\xd1\x05\x03\xe3\x6b\x3c\xaf\xc4\xc6\x3f\x0c\x0d\x4f\x0f\x0e\x85\x29\xfb\xca\x99\x8b\xad\xc6\xa8\xd8\xd8\x70\xc9\x31\xb3\xa8\x25\xb8\x8b\xe6\x63\xeb\x70\x02\xa8\xe0\xf1\x92\xc3\x67\x1b\x3b\xc3\x7e\x7f\x78\xd3\x5a\x39\x85\x36\x2c\x78\x29\x6c\xe9\x34\x4b\x1e\x03\x3e\xf8\x77\xa4\x69\x33\x76\x57\x5b\x70\x6f\xf4\x5c\xf8\xce\xd9\x43\x50\xb4\xa6\x4f\xf1\xef\x93\x81\x7c\xf9\x9a\x90\xad\xfb\xfc\xb8\x01\x46\xab\xfd\x16\x72\x3f\xa0\xab\x19\xdf\xc8\x7a\x1b\xf2\x3c\xc0\xad\x37\x97\x33\xed\x8c\xc1\x76\x35\x37\xe4\xa8\x53\x1a\x2a\x3f\x20\xf5\x2c\x6e\xfb\x7c\xa3\x0b\xbd\x83\xe3\xc1\x07\xb7\x22\xd7\xd0\x05\xdc\xb2\xc4\x33\x5f\x6b\xd8\x00\xe8\xfb\x4a\x6f\x95\xf6\xb3\x12\x68\xf8\xa3\xba\x79\x26\x11\xc5\x65\x8d\xf1\x09\xd9\xb2\x31\x17\x0e\x75\xa1\x1c\x8b\xe6\x81\x6b\x26\x04\x74\xf4\xf3\x2e\x5a\xda\x0a\x5a\x86\xe7\x18\x63\xa4\x76\x32\xd4\x27\xa2\xee\x21\x5a\x34\xeb\x67\x25\xc9\xfd\xfc\xce\x7c\xb5\x73\x63\x92\xf7\x2e\xff\xee\x97\x3f\x6f\x34\x46\x93\x6d\x33\x4f\x5b\x6d\xd8\xc1\x5a\x18\x5c\x27\xc7\x92\xb2\x29\xad\x61\x96\x11\x79\x04\x23\xcf\x3d\x77\xef\x59\xc2\xf3\x57\x8c\x50\xda\x83\xdc\xd3\xac\x93\x4b\xaf\x1f\xde\x4e\xfe\x2b\x55\x1e\xf8\xf3\x60\xb8\xbb\x00\x35\xe2\x5b\x25\x6a\xc4\x39\x19\x78\x66\x2b\x6b\xf1\xdd\x12\x1c\xed\x6c\xaf\x73\x17\xd2\xa4\x2d\xd0\x96\xe5\xb7\x42\x00\xdb\xa4\x7b\x3f\x54\x75\xeb\x07\xee\xc0\xaf\x2e\xcc\x8f\x14\xb7\xe8\x8a\x89\x3a\x6e\xf3\x66\x20\xa4\x7e\x20\x5a\x1d\xf1\x84\x25\xad\x61\x45\x42\x0d\x50\x34\x93\x0b\xf4\x7f\xa3\x45\x72\x7c\xfc\x64\xd4\x03\x75\xad\x85\x91\x2f\xec\xfb\x0c\xc0\x76\x1a\x34\x75\xea\xd6\x3a\xfb\xa3\xff\xde\x9b\x3e\xb7\xd2\x12\xac\x5b\x9b\x0e\x23\x21\x40\xcd\xbc\xf3\x62\xdb\x68\x30\x96\x35\x41\xba\xd8\x3d\xea\x82\xcc\xe2\x94\xe1\xf3\x18\x6d\x8e\x80\xc2\xcf\x48\x08\x50\x3e\xfd\x2e\xb8\x00\x41\x93\x22\xf1\x3f\x25\xf3\x33\x7a\x2f\xc4\xa0\x89\x66\x74\x83\x67\x26\x82\x5e\x9c\xcf\x72\x2a\x87\x01\xfb\xcb\xb3\xf7\xfc\xf6\x2d\xb6\x12\x79\x1e\x2b\x56\x2d\x19\xbb\xf9\xd7\x6b\xd3\x2b\x7d\xfd\x3f\xb3\xae\xf6\x48\xc4\xd7\xcc\x65\x7d\xc4\x27\x45\x39\xdc\xb7\x04\x12\x2d\x24\xac\x57\xa9\xf1\x7d\xf7\x9d\xf9\xcd\x1d\x0d\x87\x05\x7b\xdd\xa8\x88\x0e\xa5\xbe\x14\x3d\xaa\xee\xc5\x80\x27\x3d\x3c\x10\xad\x49\x44\xe0\xed\x63\xca\x78\xd3\xec\xc3\xd0\xca\x41\xa9\xe7\x77\x68\xd4\x9f\x15\xb4\xd5\xee\xf8\x90\x2c\xb5\xf3\x7d\x54\xd0\x42\x06\x9d\x8f\x95\x48\xe8\xc2\xd3\xcf\x9c\x89\x8b\xed\x06\x53\xe7\xf1\xd8\xf2\xf7\xe2\xde\x50\x9d\x63\xa1\xb7\x8d\xa6\x0d\xe0\x53\x64\x74\x1e\x3d\x2c\x79\x0d\x8a\xae\x79\xd0\xbf\x64\x27\x09\x2f\xb3\x50\x42\x34\x6e\x0c\xfb\x5a\xd8\x26\xbd\xf4\x5d\x09\x3a\x73\xcd\xe0\x46\x95\xe1\x66\xb9\x10\x79\x41\xa7\xaa\x01\x3b\x43\xdb\x6f\x19\x19\x1d\xce\x2c\x6f\x13\x74\x4f\xa9\x5b\x3e\x5b\x2b\xd8\x9f\x05\xfa\x8c\x69\x2b\x3c\x99\x10\x8f\x55\xa8\x07\x42\x7c\x33\x0d\x8f\xbc\xe9\xdc\xb5\x7c\x91\xd1\xba\x59\xac\xc8\xf1\x3f\x4a\x7f\x40\x08\xe6\xc0\x41\x74\x7c\x78\x8a\xf4\xf0\xf2\xff\x76\x84\x27\x6d\x37\xd4\xe4\x87\xf4\x6a\x85\x32\x37\x59\x87\x78\x1f\x05\x71\xda\x1c\x69\x5e\x9d\x39\x67\xba\x66\x20\x52\xe4\x25\x58\x93\x85\x1f\xa5\x5e\xcf\xa9\x48\x38\x6e\xcc\x8e\x54\x05\x18\x5a\x8b\x52\x15\xbf\xe1\x62\xf4\x42\xae\xc2\x5c\xd9\x38\x27\xe3\x8f\x17\x4a\x2f\x3f\x8b\x85\x94\xf3\xdc\x78\xda\x18\x6f\x57\x82\xb8\xb8\xbd\xc2\x57\xf6\x58\xcc\x77\x89\x6e\x72\xb8\x2c\x7d\x82\xd4\x94\x8f\xf2\x3e\x11\x13\x27\xb1\xf9\x29\x20\x2c\x48\x56\x1e\xe3\x53\xa5\xc9\x3a\x8b\x7c\x23\xac\x56\x1c\xdd\xac\x25\x76\xf4\x23\xe7\x4b\x5f\x61\x45\x36\x73\xfd\x3f\x4b\xf2\x4e\x66\x11\xd2\x09\x90\x4f\x7d\xaa\x0a\x9f\xdf\x08\x37\x67\x5f\xb4\x67\xdf\xa3\xb5\x3c\xc0\x07\x3b\x53\x9b\x26\x20\xf7\x1e\xf3\x0b\x8d\x4e\xaf\x87\x98\x8a\x0f\x1d\x4d\xc0\x4b\x09\x54\x9c\x85\xa4\xaa\x8e\x0c\xc3\x48\xe1\x28\xb1\x97\xb2\x6d\xd5\xf6\xfc\xf0\x8a\x6c\xf0\x9c\x7d\xef\xd0\x6c\xf2\x3f\x84\xdb\x9d\x3d\x31\x1f\x81\x6f\x76\x2d\x56\x50\x7c\x20\x3c\x7f\x4c\x42\x19\x7b\x59\x81\xaf\x1a\x7f\x25\x44\x41\x58\x1e\xea\x34\xbd\x4b\x17\x43\x39\x8c\x49\x4f\xf0\x7b\xc1\xf6\xf8\x78\xf0\x82\xc9\x5f\x24\x3d\xee\x56\x5a\x48\x52\xef\x08\xad\x7a\x06\x27\x9d\xad\x0e\xcc\x76\xbf\xf7\xf5\xbc\x08\x0b\xc7\x6a\x25\x34\xaa\xa7\x23\x26\x85\xa1\x75\x7a\x21\xf7\xbc\x13\x14\x93\x54\xca\x03\x51\xe3\xf9\x58\x34\xf4\x60\x4a\xa4\xc0\xa8\x8a\x40\xf9\x0c\x67\x70\x56\x4a\x51\x8f\x3e\x5a\xda\x8c\x32\xe4\x87\x28\x7a\x7e\x0e\xa4\x23\x92\xfb\x90\x1c\x93\xa7\xbc\x20\x32\x6f\xb2\x8e\x84\x32\x52\xb0\xdf\xd0\x6b\x45\x39\x1e\x0e\x76\x5f\x47\xf5\x06\xb7\x63\xb8\x07\x02\x7a\xf2\xc6\x6b\x2f\x73\x8b\xa6\xe7\xbc\xc2\x56\x85\xbb\x14\xbb\x10\xbb\x47\xbf\x95\x97\xbf\x98\x6c\x13\x78\xbf\xd6\x51\x59\xb9\xaa\xc2\xe7\x22\xe6\x6b\x9e\xb8\x6e\xca\xda\x65\xed\x45\xce\x03\x5f\x54\x89\xde\x54\x2e\x43\x8d\x9f\x45\x72\x0e\xc3\xf0\xf5\xcd\x69\xc9\x01\x8b\x82\x4b\x24\x2f\xb6\x33\xba\xfb\xa7\x96\x34\xa4\x03\x76\x31\x77\x86\x60\x49\x1f\xd0\x35\x8e\xf4\xdc\x43\xf8\x25\x69\x83\x5c\xc2\xef\x40\x59\xf9\x9e\x7a\xca\x31\xf6\x30\xc3\xb1\x9a\x49\x9d\x02\x3c\x5b\x99\x04\x65\x40\x9a\xe4\x33\x6b\xcd\x8b\x35\x80\x09\xdd\x85\x4c\x01\xb6\xfc\x03\x79\x9e\x28\x79\xb6\x1a\x32\xb2\xef\xfb\x21\x77\x36\xc5\xef\xdd\x3a\xa7\x0a\xc6\x0b\x9a\xf3\x5f\x58\x85\xa5\x3e\x2d\xa7\x32\xab\x43\x53\x2f\x08\x77\x80\x57\xa0\x79\x03\x39\x87\x34\x77\x90\xbc\x97\xf3\x72\x07\x24\x57\x7b\x8b\xae\xe4\x0d\x38\x78\xd5\x43\x5d\x2b\x95\xc4\xc5\x31\x61\x1e\xc6\x38\x26\xd4\xf0\x5c\xb8\x84\x68\x9b\x72\x07\xde\xbb\xab\xe0\x11\x92\x1c\xc2\x70\xa0\xf1\xfb\x8c\x34\xcd\x53\xb2\xf7\x11\xe8\xdd\xf7\x0c\x7a\x8b\xa4\x1e\xec\x0c\x9d\xc7\xda\x4e\x27\x2c\x91\xb8\xce\x1b\x9a\x5d\xd9\x02\xe5\x30\xc2\x51\x09\xe2\xa4\xa3\x25\x1a\xb9\xa7\x1f\x89\xf3\x01\x8c\xcc\x8d\x70\x8a\xff\x4b\x93\xfe\xd1\x28\x87\xd7\xcd\x33\x4d\x8d\xff\xd3\xdf\xfc\xf2\x39\xcd\x61\x69\x2c\x2b\x4e\x2b\x29\x6c\x44\xf5\x7c\x95\x2a\x99\x03\x7d\xad\x2b\xc1\xc4\x13\x5c\x07\xe8\x5f\x38\xd2\x66\x03\xb2\xfb\xc3\x27\x6b\x35\x3d\x23\xaf\x35\xfc\x28\xfd\x92\x8f\x8f\x91\x79\xae\xa4\x5f\x93\xc1\x76\x3e\xe8\x91\x20\x71\x88\xf0\xb6\xe0\xe8\x0f\xa7\xb6\x87\x16\x0e\xab\x04\x1a\xe8\xe0\xe9\x34\xc9\xee\xe3\x06\x63\x57\x5b\xb9\x8e\x0e\x8e\xd2\x46\x08\xa8\x13\xdb\xc0\x66\x7c\x44\xbe\xa1\x98\x29\x44\x04\x50\x0d\x20\xc2\x61\x84\x6f\x9b\xb3\xab\x71\x0c\x16\x4f\xf5\xaf\x24\x5f\x3b\x4b\x4a\xc0\x6b\xeb\x81\x09\x40\x0b\xbe\xd0\xb8\x67\x6a\x19\x31\x11\xf4\xdd\x67\x63\x58\x86\x8f\x31\x5a\x02\x46\x06\x47\x47\xd2\x8f\xae\xb4\x76\x17\x22\xa6\x0a\xdf\xe4\x3f\x17\x52\x3b\x8a\x3d\x1d\x11\x14\xe2\x8d\x38\x55\x58\x05\xd6\xe3\x77\x19\x11\x21\xef\x68\xec\xd9\xae\x3b\xd7\x9a\x5e\x04\x4c\x59\xe0\x4f\x4b\x8c\xd9\xc3\x70\xbc\x00\x27\x84\x27\x66\xde\xc3\x5f\xab\xdc\x33\x24\x94\x01\x99\xbe\x93\x25\x45\x5f\xdc\x26\xc3\x78\xc2\x53\xe1\x4c\xd2\x14\x20\xa2\x67\x3e\x66\x75\x60\x79\x99\x87\xe2\xce\x70\xb4\xb4\x41\x8e\xd6\x7f\xde\x92\x4b\x3e\x17\x4d\x30\x35\xd0\x57\xc9\xd4\x29\x80\x9f\xad\xdd\x7d\x7a\xe8\xf3\x51\xd9\x67\x9c\xba\x9e\x20\xd7\x5b\x5f\x34\x65\xae\x0b\xe1\x3e\x37\x21\xd6\x77\xe0\x50\xd6\x97\x69\x64\x82\x8c\xd1\x9a\x4d\xae\xa1\xd5\x4d\x61\xf6\x6d\x80\x9d\x81\xa1\xc7\x0a\x66\xe8\x64\xc2\x78\x70\x1d\x38\x90\xde\xb9\x70\x94\x20\x2d\xf2\xa6\xac\x03\xfd\x97\x15\x17\x1a\xb1\xfd\xa1\x0b\x3d\x0f\xe4\xcc\x17\x62\xc5\xd7\xfa\x25\x8c\xb6\xf1\xb6\xad\xfd\x07\x42\x6c\x7f\x4c\xf2\xe7\x52\x3c\x7c\xc8\xc9\xe7\x5e\x53\x09\x43\x7f\x06\x9d\xc0\x37\xe6\x22\xff\xac\x04\xa0\x20\x7d\x98\x59\xb3\x56\x80\xb2\x8f\x84\x50\x77\xde\x93\x59\xc8\x0b\x36\x41\x45\x78\x28\xf7\x3d\xcf\xca\x14\xd8\xc3\xb1\x06\x67\x29\x49\x38\x2a\x4e\x34\x75\x78\xd2\x33\xe0\x8b\xf4\xa1\x04\xf6\xc9\x05\x5f\xff\xc7\x4b\x95\x1b\xd9\x83\xaa\x73\x83\x79\xe3\x2a\xb8\x01\x5c\x6b\x28\xaf\xaf\xc0\x55\xaa\xa1\x7c\xf9\xd6\xfb\xf8\x3b\x67\x4e\x97\x30\x8f\x2c\x0c\x1b\xb9\xf4\xcd\xd9\xf7\x48\x79\x4d\x01\xe8\xb2\x26\xee\x84\x81\x9d\x38\x13\x32\x2f\x60\x7c\x2b\xb6\x9a\x0b\x71\x04\x09\x98\xe4\x44\xab\x6c\xd6\x04\x16\x35\xa2\x77\x41\xe4\x6c\x35\x6e\xe4\x45\xbe\x9d\xf7\x91\xa3\xfd\x8c\xf0\x31\xe6\x07\x02\xce\x15\xbf\xc1\x27\x2f\xa9\x61\xda\xe9\x04\x16\xff\x5a\x31\xea\x0c\x9a\x5d\xc3\x58\x17\x97\x2f\x4c\xf2\xe6\x38\xeb\x35\x21\x4e\xdf\xc8\xbc\xff\x9d\x9d\x64\xcc\x75\x19\xc8\x35\xcd\x5e\x8f\x46\x87\xe4\xf0\x5d\xe0\xc6\xab\xb3\xaf\x8b\x4d\x24\xcc\xa7\xa8\xd3\x0e\x31\x2a\xf4\x6c\x84\x36\x28\x3a\x91\xc7\x54\xbd\x1e\x40\xb6\x1b\xed\x61\x1e\xef\x01\x32\xdb\xcb\x31\xbd\x98\x34\xe3\xe8\x84\xdb\xb8\x74\x16\x10\x34\xf2\x5f\x70\xba\xa0\x63\xab\x61\x0f\x72\xb7\x85\xf9\xf2\x0d\x16\x79\xa9\xd1\xed\x0f\x07\x0e\xdc\xea\x82\x8e\x97\x5c\x3d\xc2\x6a\x0e\xa2\xec\x92\x6f\x34\x59\x1a\xda\x34\x9d\xf9\x7d\x19\x13\xd4\x17\x2f\x34\xf0\x1c\xc8\xb3\xe9\x5b\x6f\xb5\x89\xd3\xa7\x07\x83\x3d\x28\xdb\xe2\xb7\xf1\xfe\x78\xed\xd4\x2a\x06\xc8\xaf\x63\x4b\x4e\x60\x2a\x21\x0d\x95\x07\xd8\xab\x03\xa5\xb6\xdc\xa4\x02\x01\xbb\x68\x13\x9e\xfa\x66\xa9\x72\x4d\x61\x76\x43\xf3\x09\x0a\x59\x88\xf5\xee\x21\xeb\x5c\x91\x63\x44\x45\xde\xf2\x84\x5a\xed\xe6\x65\xbe\x3b\x80\x84\x12\xb2\xfe\xc0\xae\xda\xb2\x2d\x9a\x60\xe4\x92\x3a\x19\x46\x2e\xea\xe7\x5d\xc3\x46\x67\xe0\x18\x00\xe9\x70\x60\xa5\xc7\xf2\x63\x30\x9a\x52\x12\x9f\xba\xc6\x4b\x95\x1c\x50\x02\x4b\xc6\x59\xa7\x67\xb0\xda\x6f\xf1\x0f\xfe\x57\xe5\x60\x7a\x41\xb4\x5a\xea\x00\xce\x8e\xc3\x76\x3e\xc8\x4b\xe2\x0e\x5c\xb6\x9e\xb9\x72\xe8\xd0\x9c\x52\x05\x06\x01\x15\xa9\x4d\x89\x62\xc5\xb5\x20\x3f\x21\xc0\x91\x5a\x88\x64\x88\x20\x88\xd3\xa9\x21\x12\x75\x24\x7a\xd9\x4e\x67\xd2\x17\x9f\x34\x30\x0f\xf3\x66\xea\xd2\xf1\x71\xfd\x0c\x43\xe9\x27\x03\x4c\x50\x7a\x22\xf8\x87\x34\x68\xde\x77\xc5\x2d\x2a\xd7\xe1\x00\x1b\x11\x1f\xf3\xd4\xa1\x72\xe6\x95\xe2\xcc\xcb\x0b\x21\x86\x42\xbc\xad\x97\x68\x42\x2e\x4d\xa8\xcd\xc8\xf6\x16\x8d\x2a\x4b\xce\xc1\x5f\xfb\x46\x87\x6b\x32\x1c\xe0\x5d\xa3\xaf\xab\x0d\x0d\x60\x6c\xe4\xe6\x6d\xbe\xc8\x46\x02\xbc\x8d\x97\x64\xa4\x4e\xaf\x37\x46\xf6\x30\x0c\x6d\x0b\x8b\x80\xf8\xed\xf9\xb8\xac\x99\xc3\x25\x72\x51\x46\x8e\xc8\xad\x7a\x1e\xd8\x7d\xb5\x15\x81\xcc\x94\x27\xe4\x8f\x33\x6d\x72\xb4\x34\xba\xe8\xf3\xd4\xa8\xf6\x29\x6e\x0d\xba\xb1\xe2\x87\x0c\x28\xa6\xcf\x87\x50\x21\xe6\x26\x44\x8f\xa0\x4f\xdf\xd7\x04\x6f\xab\x7f\x11\x61\x1e\x68\x2d\xfa\xf3\xed\x76\x3e\xc0\x16\xce\xa5\x4f\xbe\x02\xbe\x2a\x92\x18\x6d\x75\x8f\x3d\xf4\x0c\xe4\x76\xf7\x38\x12\x7f\xb8\xd3\x46\x48\x46\x61\x26\xc1\x83\x90\x1d\x75\xe6\xd2\x71\xce\xd1\x19\x46\xee\xca\x12\x44\xcb\xab\x9e\x22\xba\x9b\x33\x04\x80\x75\x87\x78\x90\xd4\xcb\x98\xb6\x92\x2e\x83\x9b\x05\xa0\x3c\xb3\xcf\xe0\x5a\x56\x8a\x89\x16\x21\xef\x69\xe0\x3e\x18\xb9\xcb\x1b\xe6\x7e\x90\x81\x1f\xc8\x04\xd2\x19\x05\xc9\x11\x37\x80\xa3\x06\x97\xb9\xf1\xcb\x4e\x48\xa5\x1b\x8d\x0e\x5c\xb3\x4d\xf8\x22\x9f\x83\xf5\xd8\x0b\xe0\x2b\x9a\xdb\xfd\x49\x66\xc8\x68\xf0\x50\x84\xc1\x90\xd9\x08\xbf\xfd\xc5\x5b\x4d\x12\xc7\x71\x87\x16\xf1\x04\xa9\x77\x99\xce\x2a\x9d\xee\x18\xea\xe1\xc2\x54\xfc\x2e\x75\xf5\xcb\x6f\xfd\xf2\x5d\xcf\x9a\xc7\x4a\x38\xe7\xf3\xa0\x13\xd4\xd3\x5b\xf3\x12\x87\xdb\x05\x98\x03\xdd\xcf\x8b\x82\x64\xef\x41\x2e\xce\x13\x36\x0f\x2d\x3a\x43\x7d\x1c\xc9\xbe\xc7\xa2\xff\x87\xbb\xb6\x19\xca\x03\x9f\x8b\x14\xe8\xcb\xbc\x2e\x31\x16\x04\x7b\x53\x56\x2c\xac\xc6\xb0\xf4\x22\xec\x68\x07\x97\xaa\x91\xae\xdd\xba\xf3\x74\x4d\x64\xbc\x97\x59\x25\x48\xe0\x5f\x57\x36\xfa\xcd\x32\x67\x41\x99\x25\x8a\x0c\x60\x34\x46\x0c\x53\x00\x35\x8e\x55\x32\x0f\x01\x5b\x24\x19\x1c\xc7\x50\x61\x2e\xeb\x22\xeb\xef\xf8\x9c\x94\x13\xba\x83\xfe\x15\x79\xa0\x66\x3a\x33\x07\x19\xa1\xad\x9c\x8b\x72\xe6\xe8\x96\xc1\x73\x83\xeb\x40\x72\x9d\xe6\xe8\xb1\xfb\xe0\xf4\x0b\xba\x01\x6a\xf0\x5d\x1b\x1b\x3c\x48\xb9\x46\x9c\xa7\xfe\xff\xf7\x7f\x7f\x79\xe9\x4d\x39\xf6\x37\xcb\x71\x1f\xfe\xe5\x2c\xd8\x4a\x5b\x05\xcd\x61\x44\x84\xaa\x40\x61\x76\xe2\xcd\x0c\xca\xda\x9b\x14\x3f\xf8\x35\xa3\x29\x9f\x06\x2c\x9f\x34\xec\xf7\xf0\xd3\x99\xe9\x5c\xa0\xdf\x1a\xba\x67\x7f\xa8\xa9\x83\xe9\x47\x9f\x3c\x9a\x61\xba\x50\x6d\xac\x0a\x82\x31\x18\x86\xf9\x3f\x17\x01\x1b\xfa\xfb\x49\xde\xbd\xde\xde\x9d\xe4\x90\x04\xe2\x4f\xa4\x22\x42\xad\x39\x3f\x11\x4e\x92\x0c\x25\xd6\xf0\x85\x97\x7b\x79\xc1\x68\xe5\x2b\x0f\x19\xa4\xd0\x0a\x32\xea\x2a\x19\x17\x72\xb3\xdd\xe1\xfe\x7e\x67\xd0\x4b\x65\xe4\x4a\x72\xd1\xce\x5b\x77\xa9\x93\x4a\x12\xc1\xc2\x2f\x47\x8d\xd1\x04\x62\x91\x21\x50\x80\xd7\x46\xac\x14\xb3\x74\x29\x16\xe7\xd3\xf4\x5c\xce\xb4\x51\x39\x17\x6e\xc2\x1c\x02\xd6\x2a\x59\x27\xdb\xea\x2a\x06\xeb\x3d\x33\x2e\x81\xf3\x29\xb9\x07\x21\x91\x59\x9e\xbc\xd0\x68\x50\x7e\x0e\x00\xf0\xa3\x46\xc0\x82\x36\xca\x71\x86\xda\x85\xaf\x93\xe1\xe1\x3b\x79\x1f\x52\x1d\x70\x2c\x05\x14\x8f\x29\x3b\xbb\x50\xe5\xc7\x2c\x91\x7c\x43\x99\x87\x7d\x82\x30\x75\x82\x41\xcd\x4b\x9b\xc7\x9a\xa6\xa0\xde\x59\xe1\xee\x9b\x7c\x20\xcc\x50\x98\x41\xce\xf6\x34\xdc\x4b\xaa\xbc\x17\x54\x08\xdb\xa0\x32\x58\xbf\xb3\x9d\x41\xbb\x3f\x23\x93\x72\x82\x87\x32\x37\x58\xab\x9f\x15\xa5\x81\x3b\xfe\x82\xa5\x01\x1a\x5d\x0c\x91\x2f\x28\x3e\x83\xb7\x8b\xb9\x1d\xfa\x59\xa7\xc8\x0a\x55\x57\x10\x38\x2a\x70\x67\x1e\x77\x6e\xfa\x15\x08\x3c\x79\x06\x9b\x18\xb8\xa6\x72\x79\x5f\xb2\x02\xe5\xb6\x9c\x61\x46\xc9\x83\x71\x0c\xd0\x75\x3c\xf2\x71\x73\x3c\x14\x90\xa2\x0e\x21\xae\xfb\x12\xaf\x85\x5c\x3f\x8b\xe6\x36\xad\x39\x35\x87\xd4\x24\x7d\x90\x94\x9d\x32\xcb\x79\x9c\xce\x9a\x4a\xa7\x36\x53\x35\x5e\xa2\xf4\x39\x78\x10\xac\x5a\xb5\x22\x54\xa3\x91\xf5\x20\x54\xa5\x85\x65\xf4\xf2\xbe\x94\xe3\x73\x2b\xe6\xef\xe4\x10\xcb\x4d\xc8\x01\x76\x1e\x35\x82\x3f\xb8\xc9\xb7\xfc\xbc\x30\x7f\x88\x20\x80\xa0\xf9\x68\x9c\xe1\xc9\x91\x57\x63\x91\xcc\x24\xe8\x17\x20\x93\x9e\xdd\xce\x00\x43\x7f\x60\x3e\xc8\xa4\x02\x2c\x0f\x4e\x5c\xa4\x4a\x1d\x31\xe0\xd3\x72\x74\x46\x6a\xc6\xf4\x14\x54\x2e\xca\x1c\x4f\x30\xf4\x76\x86\xb8\xad\x66\x7b\x07\xc1\xed\x48\xe7\xfd\x89\xc1\x3b\xdb\x59\xdb\x2c\xb4\x63\xa5\xc4\xef\x13\xd1\xee\x07\x62\x83\x22\x59\x55\xbf\x33\x2f\x4b\x10\x6f\x87\x54\xd2\xe9\x42\x6d\x87\xd5\xcb\x41\x12\xbd\x9d\xed\x80\xc2\x00\x7e\xba\x5c\x1b\xd7\xb5\x21\xa9\x5e\x1d\xe8\xa0\xc7\xb9\xed\x1b\x1c\x93\x27\x7b\xcb\x82\xc4\x24\xe0\x8e\x57\xdb\x5d\xea\x8f\x75\x0f\xd2\xc0\xde\x1c\xe7\xa5\x18\x2e\x13\x27\xbb\x0c\x52\x28\x6a\xd6\xce\x51\xbb\xd9\xf3\x3c\x62\x0a\xa6\xc1\x6d\x59\x1e\x44\xaa\xa7\x59\xd1\xa6\xce\xc3\x40\x9e\x25\xc8\x39\x98\x5d\x4e\x0e\xc6\x49\x37\x3c\x27\x24\x06\x55\xd3\x5a\x1d\x31\x45\xd4\x2e\x39\xa5\x97\xf5\x43\x13\x26\x2c\x62\x1e\xb7\xbc\x58\x69\x81\xc5\x27\x2a\x7b\x01\x7b\xdc\xfb\x5c\xd2\xcb\x86\x6c\xd9\x89\x84\x74\x05\xb6\xef\x2d\x11\xac\xe6\xb6\x9a\x44\x94\x8c\x10\xe4\xed\xb3\xa5\x2d\x62\xab\x1d\x81\x48\x1a\xa3\x5f\x92\x6b\xf8\x59\xa7\x7b\xfd\xca\xa8\xd3\xcd\xec\x49\x00\x47\x47\xf1\x56\x0e\x63\x74\xb3\x7e\x1b\xe3\xe9\x2e\xe3\xf0\x14\x86\x21\x9f\x91\x64\xf8\x98\xc8\xbf\x6a\x9f\x74\x72\x37\xf0\x03\x29\xf7\x47\x81\x7b\xa7\xb9\xe0\x97\x5f\x93\xbb\x78\xfd\x47\xaa\x71\xd4\xee\x47\x0e\xbf\xf6\x30\x1f\xd9\x5f\x96\x54\xc1\x8f\xd3\x53\x33\x6a\xd1\x2d\x53\x21\x60\xfa\x3b\x6f\x65\x9f\xd2\xc9\x30\x7f\x97\xf6\x61\x5d\x44\x65\x71\xa4\x7a\x2a\x5a\x92\x6e\x5b\xc6\xde\x67\x0a\x15\xc4\xf1\x64\xbd\x1c\x7c\xf2\xfb\xb7\x0c\xad\xa2\x67\x2c\x58\x4e\x87\x6b\xf8\x47\xe8\xc3\x20\x65\xf3\x77\xd8\x8e\x8d\x53\x22\xd2\xd2\x70\x97\xe0\x3c\x2f\x60\x4e\x3c\xb6\x52\xb9\x75\x38\x26\x52\xa6\xd6\xec\xa3\xb5\x75\xf9\x89\x7a\x94\xb5\x8b\x5c\xdc\x2b\x56\x3a\xf7\x3d\x6a\x89\x43\xa9\x63\x57\x5a\x9a\xac\x4a\xac\x2a\x86\x8c\xe1\x6d\x54\xa7\x0e\xd2\x47\x1b\x85\x0c\x85\xaf\x9c\xa9\xe0\x76\x26\xbc\xa6\xa7\x5a\x89\x34\xd8\x51\xb6\x1e\xca\xae\x40\x83\x0a\x13\xd8\x07\xed\xeb\x2d\xe2\x95\x1d\x4f\xc7\x38\xeb\xb0\xd6\x97\xee\xb0\x4e\x0d\x6b\x27\x22\x50\x31\x9c\x14\xf0\xc8\x1d\x46\x6b\x6c\x03\x41\x0d\x3a\x4f\xc5\x22\x31\x1c\xbf\xa3\x18\x5b\xbc\xb1\x04\xfa\xda\x74\x7e\x7b\x7a\x38\xbd\x5d\x8d\x5c\xca\x26\x1b\xb5\xee\x08\x3f\x70\x19\x48\x7d\xa1\x06\x83\x11\xc3\x8c\xf0\xb4\x6b\x78\x71\x39\x77\x9f\x56\x38\xd7\xdb\x0a\x8a\x6a\x17\x5c\xa3\x3e\x38\xc7\xba\x08\x0d\xf6\xda\x37\xf7\xd4\x2a\xd7\xf8\x6b\x5a\xbe\x89\xdc\xab\x1f\x90\xc9\x3c\x11\xab\x47\xd4\xc8\x9e\xa1\x10\x64\xc9\xf2\xe9\xb3\x6a\x44\xaf\x5a\x6b\x8c\x45\xe9\x74\x80\xe4\x3f\x1b\xd2\x74\xab\xd9\x58\x39\xbf\x5f\x72\xb0\x4f\x04\xfa\xd8\xf4\x53\x0a\x81\x84\xc4\x87\x71\xdc\x5c\x94\xd3\x3e\xf2\xf0\x51\x8c\x15\x63\xa3\x65\x49\x59\x33\x9b\x29\xfa\x63\xb6\xb7\xa5\x78\x0f\xff\xb6\xc2\x37\x2b\xb0\x43\xea\xb2\x4d\x81\x7a\x33\xf0\x30\x90\xca\x34\x12\x50\x3d\x64\x32\x57\xba\x83\x8a\x35\x62\x4d\xb5\x61\x9b\x83\xdf\x44\xc8\x48\xd4\x23\x7d\x92\xa0\x7d\xe6\x94\x5f\xae\xf4\xa2\xfe\x67\xef\x95\x1c\x53\x90\x1c\xb1\x9f\x3a\xed\x13\x28\xb8\x14\xc1\x2e\x26\xdb\xe6\xd9\x07\xce\xf9\x5c\x47\x22\xa1\x53\x73\x18\x99\xd3\x85\xe0\x5e\xac\x34\x94\x94\x38\x16\x52\xe7\x29\xb9\x5e\xb1\x39\x1d\x9e\x63\xe1\x7a\x46\x58\x01\xee\x20\x94\xc3\xfc\x81\x1b\x22\x08\xb7\x2a\x04\x62\xf9\x9c\x4c\x96\x1e\x32\x3d\xaa\xfd\x0e\xfa\x23\x82\x7e\xea\x09\x0b\xf6\xf2\x05\xb4\xe4\xc0\x7a\xfd\x51\xe2\xfa\xec\x97\x7d\xc9\x6e\x07\x48\x64\x81\xae\xea\x92\x97\x55\x9a\x10\x03\xf4\x39\xc5\x04\xd8\x5f\x6d\xe2\xfe\xc5\x25\x56\xd4\xea\x09\x0d\x7d\x95\xaf\xfc\xb6\xe6\x36\xf3\x3c\x16\xfb\xb7\xd1\x88\xc7\x56\xe7\x30\x55\x0d\x5a\x69\xbd\x82\x6a\x00\xb8\x19\xda\x28\x38\x9f\xb9\xb6\xba\x65\xb7\x9f\x41\xa0\x2d\x0f\xf8\x25\xe6\x1f\x9e\x93\x55\xc5\xeb\xe3\x8f\x6f\x55\x18\x56\x83\x11\xcc\xae\x1a\x78\x2b\x08\x5a\xd2\xec\xaa\x71\x62\x01\x41\x97\xe1\x28\x1b\xe8\x1e\xc0\x69\x1c\x2e\x17\xcc\xf7\xb9\x3e\xfe\x82\xbb\xfd\x61\x01\xa9\x8f\x5d\xbf\x2f\xf0\xca\xd6\xf7\x34\xac\x5c\xbe\x3b\xc8\x38\x6d\xe1\x53\x0e\x5e\x97\x32\xda\xd1\x5e\xbc\xe6\x7a\x2b\xf3\xfa\xde\xe0\x4e\x6d\xbb\xda\x23\xab\xe9\x44\xcc\x63\xa0\x70\x4c\xc3\x8b\x85\x05\xe2\xda\xd2\x90\x40\x8d\xda\xa3\xbe\x91\x48\x82\x2a\x15\x67\x01\xfc\x50\x5d\x07\x6f\x1d\x32\x85\xb7\x9a\xc4\x44\x34\x49\x69\x58\xbf\xbe\xe9\x55\xb4\xd8\x51\xea\x0b\xd2\xff\xb2\xaf\x86\xef\x28\x55\x51\xb0\x99\xb7\x2a\xa6\x08\xd2\x49\xa3\xf3\x00\xa5\x9a\x4a\x81\x6e\x38\x7b\x3e\xd8\x19\xa2\x17\x81\x99\xc8\x96\xe6\xf4\x7a\xfa\x39\x67\x5c\xa1\x4a\x65\x15\x88\x52\x48\x53\x84\xd8\x87\xab\xbb\xcd\x0b\x89\x23\xbf\xc0\x4a\xd1\x87\x04\x79\x7e\xc6\x68\x5d\x7c\x7a\xc5\x31\x6a\x0b\xaa\xaa\xed\x5c\xb7\xe6\xa1\x67\xc3\xa6\xa7\xc4\x72\x28\x9d\x93\x84\xc8\x2e\xfd\x24\xd7\x15\x27\x55\xe9\x55\xa1\xce\x7d\xa3\x23\x9f\x14\x59\x5c\xbb\x4f\xe9\x4b\xce\x3d\xa0\x50\x6a\xa5\xe9\x8b\x93\x4c\x31\xb5\x8a\x00\xcc\xf3\xe3\x00\xd6\xc3\xbf\x7c\x20\x48\x54\xdf\x86\xe6\x46\xdc\x53\x76\xb6\x2f\x83\x09\x79\xe1\xa3\x0f\xfb\x1e\x00\xd3\xd8\x46\xc7\x21\x96\x91\x66\xac\xc6\xe6\x67\xf3\xe7\xf8\xa5\xe8\x06\xc0\x6b\x17\x46\x82\xee\x96\x6c\x81\xf1\x34\x6e\x67\xc9\x97\xc6\xfd\xab\x31\x75\xd8\x40\x4f\xa2\x9e\x44\x62\xa6\x78\x90\x8d\x90\xa4\x6b\xbb\x9b\x9b\xb6\xde\xa6\x34\xc2\xb3\x73\xd5\x60\x3f\x1e\x4b\xd9\xa7\x13\x5f\x5a\x50\x92\x48\xd4\xf7\x5e\x61\xef\x63\xa5\xcb\x4f\xf5\xa3\xed\x40\x82\x6d\xd0\x63\x51\xd8\xfe\xb1\xf6\xa6\x65\xfc\x04\x66\xbd\x3b\xa9\x11\x08\x2b\xf6\x20\x43\x06\x0e\xf0\x9d\x5f\x56\xde\x3e\xbe\xca\x01\xf6\xb3\x01\x38\x40\x80\xa0\x45\x03\xb0\xc3\x1a\x3a\xb2\x0a\xaa\x92\x38\xb3\x45\x30\x42\x81\x29\xc1\xef\xb3\x13\x0f\xa0\x86\x07\x8e\x20\xa8\x36\x2d\x7c\x42\x25\xb1\x45\x8f\x1d\x33\x92\x68\x09\x14\xc1\xb5\x54\x4c\x4d\xa2\xad\x91\x4e\xcd\xea\x45\x39\x14\x05\x14\x85\xf2\x4a\x72\x0c\xb0\x7a\xd8\x21\x80\xc6\x13\x23\x1d\x69\xd7\x2b\x07\xd8\x1f\x16\x25\x30\x5c\x1c\x8f\x1c\x64\x94\x65\x4b\xd8\x0c\x7d\x7d\x6c\xfc\x45\xe5\x42\xe2\x81\x40\xf3\x74\xb2\x76\x20\x40\x18\x08\x05\x97\x7d\x74\xd1\xbc\x78\xf5\x95\x6b\x05\xc1\x80\x0b\x88\xbc\xfa\xe3\x6b\x46\x30\xbc\x78\xf5\x27\xd7\x0a\x10\x03\xa3\x41\xda\x3b\x9d\xeb\x59\xcd\x48\x38\x80\xf4\x42\x3b\xc5\x70\x52\x38\xb3\xe1\x9c\x62\xb2\x1c\xcd\x87\xaa\x51\x2a\x9b\x16\x55\xd3\xd3\x98\x8e\xeb\x50\xd7\x20\xba\x5e\x5b\x51\xf0\x64\xb3\xc1\x64\xbf\xcd\xc7\x57\x20\x4a\xd4\x07\x46\x79\x4e\x64\x40\x6a\x05\x7e\x2b\xe5\xe5\xf7\xe2\x83\x75\x27\xf5\x77\x20\x40\x5f\xc4\x43\x7a\x4f\x7a\x4b\xb2\x14\x1a\xc4\x95\x57\xae\xf4\x80\x0e\xb3\xbe\x39\x12\x14\xac\xf0\x0d\xbb\x95\xa1\x8b\x94\xfc\xcc\x4b\x45\x77\x66\xe3\xdf\x62\x6d\x43\xcb\xa7\x0c\xf8\x0f\xff\xbc\x02\xda\x21\x5b\xa0\x96\xff\x47\x04\x5f\x8f\x9b\xa2\xcc\x8b\x06\x18\x67\x78\x71\x3c\x87\xbb\x38\x96\x15\x55\xde\x92\xa0\xc7\x46\x73\x0e\xf5\x78\x4a\x31\x10\xb0\x82\xf6\xb1\x7c\x15\x0f\x13\x00\x0f\x5e\xb4\xb7\x13\xb8\xe4\xbc\x07\x8f\xc1\x80\xf5\x05\x7b\xdf\xf8\xaf\xd7\x11\xc0\xbd\x5b\xa7\xe5\xcb\x48\xc1\x1e\x35\x8d\x3e\xef\xc0\xac\x23\x36\xad\xec\xd0\x9c\x51\x49\x67\x3e\x51\xfc\x36\x6b\x63\x7d\x25\xec\xf9\xe6\x1c\x0d\x21\x8b\x3f\x38\x63\x7c\xec\xdc\xab\x97\x27\x6e\x49\x52\x48\x0d\xa4\xd5\xef\x50\xd1\x78\x1b\xd3\x67\x7a\xcd\x6a\x9c\xf7\xb9\x85\x94\x8f\x95\x6c\xe9\xa8\xdf\xf5\xe3\xb2\xe3\x0a\x60\x81\x62\xca\x05\xe8\x50\x20\x22\xe7\x57\x15\xcd\x0f\xd7\x6e\x24\x95\xed\x43\x02\x93\x15\xba\x36\xf1\x1a\xc8\x86\xf7\xad\x6f\xe1\xb4\x3b\x8d\xb4\xc8\xb2\xf2\xce\x0d\x9b\xf1\x6b\xee\x08\x27\xf3\x84\x51\xaa\x7f\x5f\x68\xf1\x5b\x9b\xd3\x84\x63\xfc\x0f\x4c\xb4\x73\x10\xb7\x0f\x5b\x43\x34\x08\xa0\xaf\x1a\xa6\xd4\xbd\xbd\x22\xc5\x21\x26\xd9\x0e\xea\x59\x7b\x1a\xd4\x24\x61\x41\xf1\x1b\x04\x55\x1c\xb4\xbf\x7d\xf5\xbe\xaa\x32\xb1\xac\x6b\x7f\xce\x50\x30\x35\x5e\x5d\x32\x96\x65\x22\xef\x0a\xaa\xd7\x09\xee\xce\x50\x13\xba\x90\xea\xfe\x6b\x62\xc1\xd4\x61\x9f\x3b\x10\x26\xbd\x67\x97\xa5\xc5\x6d\x87\x7c\xf8\xd6\xd8\x45\x15\x29\x1c\x75\xc6\x65\xde\xcd\x47\x1d\x26\x87\x2a\x69\x2a\x47\xa9\x48\xeb\x4e\x59\x76\xba\x7b\x80\x49\x9d\xdc\xf1\x5e\xa4\x35\x5e\xa3\x2a\x86\xd7\xcc\x56\xca\x85\x64\x40\x39\x46\x1e\xf4\xf4\xbd\xc4\x44\x3d\x83\x3c\x40\x90\xaa\x9f\x48\x97\xa6\x9d\xdb\x69\xde\x6b\x90\x5b\x4c\xac\xc2\x62\xa3\xd3\x34\xe9\x23\x43\x7d\x0c\xba\x35\x27\x93\x39\x5b\xe6\x77\xac\x61\x77\xc1\xcc\xa2\xa3\x85\x09\xd3\xbd\x18\x28\x6d\x57\xa9\xe1\x4e\xdc\xcd\x81\xf6\xf5\x9c\x36\x97\xf3\x66\x58\x8e\x7c\xcd\x52\x6d\xb1\xea\x29\xca\x02\x70\x59\xae\x08\x36\xae\xee\x11\xc4\x12\xa1\xfe\xba\x15\xac\x70\xbb\x63\xe4\x5e\x82\xb4\xa5\x57\x69\xdd\xab\xc4\x1b\x6e\x8b\xfe\xbc\x6c\xd6\x69\x0f\x83\x9b\x78\x5e\x50\x29\xef\x27\xf1\x74\xe2\x2b\x19\x82\x2f\xf3\xa4\x0f\xea\x54\x1b\xab\x8f\x1a\x7c\x28\x58\x83\x6c\xce\x01\x26\x80\xe2\xd6\xe5\x1e\x08\x1e\xe5\xd0\x2e\x41\xd5\xda\x46\xe5\xfa\x42\x0e\xc8\x3f\xeb\xe5\x99\x68\x34\x6c\x99\xec\xc4\xa6\xc3\x5c\xb7\x73\xa7\x33\xf9\x03\x57\x0c\x6f\xb2\xb8\x40\x76\x0e\xbb\x32\xc8\x91\x0c\x7f\x43\xd2\x05\xf2\xc8\x7b\x41\xc9\xc9\x0d\x2e\xd1\x5d\xd4\xca\xe6\x96\x39\x42\x15\x34\x86\x87\x9c\x42\x49\x5b\xc5\x93\x1b\x5a\xfd\x32\x4e\xfe\x32\x30\xe6\x3d\xa6\xdb\x7f\x87\xff\x20\xea\xcd\x97\x56\xa1\x8f\xdb\x00\xf8\x91\x70\x31\xf0\x4a\x0f\x0c\x9f\x7c\x20\x64\x55\x05\x1d\x20\xf0\xc2\xb2\x7a\x81\xa6\x9b\xa5\x09\xf0\xac\x13\xde\x02\xff\x2e\xe8\x52\xbe\xfc\xc4\x7e\xe1\xe9\xf7\xb3\xf1\xae\x30\xf2\xbc\x0a\x35\xb5\x19\xf8\xf9\xcc\x66\x86\xf9\x2f\x46\x3c\xe1\x2d\x77\xb6\x81\x97\xbe\x91\x8d\x0b\x76\xf4\xff\xd6\x67\x15\xbc\x76\x49\x43\x80\x6b\xc0\x16\x8d\xfb\xa1\x58\x18\xba\x45\x51\x0f\xe6\x78\x0d\x70\xe3\xc6\x55\xc8\x45\x0d\xfb\x68\x45\x04\xc7\xf8\xad\x47\x15\x4b\x3f\x46\xdf\x66\x8e\xaa\xb8\xda\x96\x77\x1f\x10\x5e\xe3\x2e\x61\xa6\xde\x3e\x3c\x02\x69\xf3\xfd\xc6\x0b\x9a\x79\xb3\x2e\x53\x19\x01\x5f\xe0\x09\x8c\xd0\x0d\x2e\x5f\x14\x70\xfe\x39\x0e\x60\x19\x3b\xcf\xe5\x60\xed\xac\xab\x74\xcd\x68\x0a\x42\xb0\xd6\x23\x3f\xb1\x59\x8a\x09\xb0\x95\xe3\xee\x91\x73\x75\x32\xfc\xcf\x9d\x60\x5e\x18\x92\x90\x75\xaf\xe7\x2e\x10\x8d\xbc\x52\x25\x39\x98\x38\xfe\x53\xf8\x34\xe2\x72\x09\x2e\x77\x42\x1d\x59\x93\x3e\x04\xf4\xa5\xbd\x5c\xe1\x14\xd9\x5f\x94\x99\x63\x0e\x0d\xa2\x70\x2f\x9b\x7d\x8c\xfd\x01\xad\xaa\xc0\x92\x84\xce\xa0\x8d\x61\x62\x78\x87\x2a\xec\xc7\x3a\x3d\x6c\x0e\x32\x61\xda\xbb\x35\xf7\xa1\x96\x80\xe1\x27\xe1\x2a\xe2\x08\xc2\xcd\x97\x12\xa2\xfd\x8a\x10\xac\xe0\xcc\xc9\xb5\xdf\x22\x64\x0f\xc5\xac\x0e\xea\x56\x2c\x1a\x69\x57\x80\x20\x4a\x53\xb9\x3a\x10\x9e\xf2\x0e\x8b\x4a\x56\x1a\xb5\x69\x90\xd2\xfe\xd0\xfa\xfd\x92\x6b\x11\xd9\x37\x45\xba\x09\x37\xa1\x97\x4a\xcb\xf3\xa8\x94\xf7\x94\xd7\x5f\x13\x0f\x84\x68\x6a\x32\x60\xf4\x8c\x03\xb2\xb5\xfc\xbd\xb4\xf5\xb6\x02\x7f\x4d\x25\x3c\x2f\xb8\xa2\x35\xb6\xf5\x75\x6f\xfb\xc5\xbf\xbb\xd8\x7b\x89\x11\x02\x27\x15\xa0\x9b\x4f\x45\x33\x62\x4d\x57\x6e\x56\x97\x63\x91\x82\xff\x2a\xe0\xeb\x04\x23\xc0\x71\x0e\x2e\x92\x1a\x3a\x09\x69\x40\x45\x0c\xf7\x5e\x43\xb9\x5b\x2b\xce\xd4\x29\xb2\xd5\xe7\x5a\xf5\xbe\x6a\xb7\x4e\xc5\x1f\x36\xed\x45\xea\x31\xa8\xe3\xa1\xd7\x35\x6c\xf7\x26\xe6\x11\x22\x03\x61\x39\x2d\x0c\x70\xc7\xd6\xc8\x66\x2d\x8c\x88\x1f\x2c\xd6\x53\xf1\x44\xd3\x86\x4a\x26\xff\x20\xc0\xa3\x60\x2f\xeb\xa0\x9d\x4f\xf1\x2c\x04\xe0\xd6\x12\xaa\xd9\x7e\xbf\xba\x81\xf2\xe3\x51\x92\x16\x3d\x04\xbd\x92\x14\x5b\x94\x38\x7b\xa7\x46\x44\xb1\x82\xb2\x3f\xcc\x74\x8b\x74\xc4\xb1\x6e\x60\x8f\xf0\xab\xe8\xe4\xa0\x28\x69\xe0\x37\x68\x3e\xbf\xe4\x9f\x59\x26\xd9\x95\xad\xd9\x56\x7f\x97\x98\x28\x99\x06\xc2\xdc\xf7\x3b\x65\x2a\x30\x4a\xc1\xb5\x68\x16\xe8\x32\x1f\x0b\x96\xe1\x65\x6d\xa5\x6b\xb2\xfd\xc8\x9c\x01\xfe\x0f\x34\xcd\x4f\xc0\x3a\x77\xf4\xa3\xc4\xa9\xfa\x02\xa9\x39\x50\xeb\xa5\xeb\x5b\x12\x13\x39\xd8\xd4\x58\xa1\xee\x41\xa9\xfc\x12\xf7\x84\x3e\xe5\x0a\x74\x3e\x0b\xbc\x6f\x57\x07\x12\x5d\x13\x78\x60\x5a\xff\x75\x0b\x5b\xab\x03\xdf\xfc\x29\x1c\x03\x71\x2a\x28\xcc\x9f\x30\xd9\xf0\xa5\x64\x44\x16\x11\xa0\x45\x3a\x23\xf5\x71\x9d\x6e\x24\xbd\x49\x3e\xdc\xfb\xa1\xf4\xd9\x54\xf8\x83\x8e\x7c\x93\x14\xd7\x2f\xf8\xc0\x5c\xa9\x77\x09\xd6\x72\x2e\x8d\x8b\x5d\xd5\x73\x50\xb2\x2c\xd6\xa7\xdb\xf9\x21\x2a\x96\xd4\x16\x43\x78\xde\x48\xb9\xd2\xb8\x99\x5f\xcf\x21\xe7\x17\x0a\xe4\xf8\xaf\xd6\xcd\xac\x6f\xa4\x86\x2c\x5d\x09\x15\xaf\x8f\x9b\xbf\xe0\xb5\xe7\x33\xe6\x6f\x38\xb3\x81\x15\x8a\xb3\xd8\x22\xa5\xe6\x91\xb8\x0f\x1e\x23\x86\x61\x93\x56\x9c\xd4\x09\xdd\x05\x35\xc7\xb1\xf2\x52\xf3\x2c\xd8\x5f\x8b\xc2\xac\xbd\x57\xf0\x90\x9d\x13\x95\x93\xa1\x0b\xa5\x3a\x92\xa7\xd1\xa2\x85\x33\x22\xd8\xc9\xc7\x05\xd4\xa1\xdd\x0d\x31\xed\x53\x0e\x92\x10\xae\xd4\x67\x55\x69\x0c\xe9\x96\xf8\xc4\x6a\x06\x6a\xa1\x95\x0c\xe9\x91\x28\x53\x7a\xb4\x08\xc9\x0f\x9e\xee\x24\x99\x08\x7c\x17\x70\x32\xb5\x69\x25\x74\xe8\xd0\x1d\xf2\xbe\xca\x11\x6f\x69\xab\x45\x24\xf0\xbe\x59\xcd\x4b\x7c\x7a\xa0\x4e\xe6\x05\x87\xfe\x90\xc9\xa5\x62\xbc\x3c\xaf\x13\x7d\x47\x2e\x16\x09\xe7\x56\x3f\xbd\x89\x1e\x05\xc8\x3e\x0e\x84\x08\x06\x26\x6e\x6f\x4f\xca\x52\xaa\xf2\x68\xdd\xaf\x77\x9e\xb6\xd5\xd7\x6b\x4e\x92\xf2\x30\xe9\x1e\x5e\x50\xca\xda\x5e\x50\x40\xb8\x9b\xb5\x5f\x51\x11\x80\x51\xce\xa6\x68\x53\x24\xea\x83\x0a\x90\x25\x7d\xaf\x2c\xd8\x03\xfb\x68\x66\x94\x52\x80\x52\x55\xa1\xb3\xa5\x05\xbf\xc8\x1d\x34\x80\xc6\x80\x83\xac\xaa\x26\x99\x2a\x97\x64\xe7\x88\x46\x9d\xab\x4b\x25\x4b\x73\x22\x0b\x42\x05\x58\x91\x16\xa6\x68\x34\xa4\x4a\x4f\xa2\x20\x82\xfd\x66\x78\x35\xae\x9c\xf3\x0d\xc3\xa2\xfa\xe6\xac\x3a\x48\x0e\x02\xb3\x0e\xa6\x7f\xa0\x34\x55\x8b\x8a\x3e\xad\x0e\xd4\x07\xe6\xc0\x99\x54\x2d\x60\x02\xa8\x8a\xce\x18\x85\xc4\x9d\x55\x58\x51\x55\x73\xb8\x25\xae\x7a\xc7\x89\x29\xea\x5a\x4f\x06\xe6\x71\xe7\x03\x17\xb6\x3e\xc3\x63\x74\xa1\xf6\x6a\x4f\x7b\xc3\xe1\xf5\x82\x6b\xc0\x5c\x42\xd4\xe9\x1d\xe1\x6e\x5e\x52\x8b\xb7\xf2\xb2\x19\x7f\xde\xee\x14\x79\xb7\xed\x2e\xc3\x25\xb0\x17\x67\x8d\xaa\xbb\xe1\x18\xf2\x9a\x7b\xac\x48\xdf\x61\x47\x80\x04\x1a\x6d\x1a\x06\xec\xe9\x92\x34\x03\xc9\x2f\x30\xcc\xf1\x5c\xd0\x21\x1f\x40\xc2\xb4\xdd\x31\x27\xbf\xe4\x5e\x88\xa5\xbc\x9a\x67\xa9\xb9\x09\xfc\x95\x7e\x62\x8b\xe0\xf4\xd9\xf4\x13\x30\x35\x64\x49\x9f\xb6\xd4\x9e\x72\xf2\xbb\x60\xaf\x66\x61\x98\x6d\x6d\x21\xd7\x92\x3d\xa4\xdd\xf9\xad\x2f\x76\xa2\xc0\x85\x4a\x43\x40\xf4\x71\x50\x01\x47\xd7\xf3\x59\x57\x01\xc7\x16\xbd\x61\x8e\xd2\x65\x83\xb1\xf9\x9e\x78\x21\xf7\x6c\x3d\xe9\x6a\xb7\x71\xf8\xa4\x4e\xa2\xd3\xbb\x01\x9c\x65\x4f\xed\x10\x55\x95\x2a\xd8\xa8\x1e\xc0\x00\xc9\xd8\x42\x10\x92\xd3\x05\xb9\x29\x12\x32\x66\x56\x6f\x0d\xa9\xca\xe6\x7e\xe7\x09\x78\x0c\x40\x6a\x9a\x41\xa7\xdf\x26\x46\x27\x76\x9e\x33\x7f\x3c\x64\x6d\x1a\x67\x6d\x4a\x8e\x93\xbd\xbf\x76\x1c\x5d\x67\x27\x1a\xc3\xeb\xdf\x9e\x54\x15\x45\x3f\xe7\x20\xc2\xd7\xda\x44\x5b\xb6\xfc\x07\x41\xaf\x4a\x19\x62\xd3\x7c\x53\xed\x14\x2e\x70\x44\x17\xc0\x06\x67\xb1\x38\x86\x2b\x63\x66\xd6\x06\x29\x3b\x86\x57\x9b\xc4\xec\x7a\xd5\xfd\x93\x91\x6c\xc3\x0b\xac\x4a\x51\xc4\x47\xa3\xed\xbf\xe9\x2b\xc6\xd9\xda\xe5\xb8\xd3\xbd\x2e\xee\x96\x74\x47\xc9\x9b\x9e\x3e\xd7\x45\xd8\xab\xa9\x5c\x44\x02\x50\x9e\xdf\x12\x78\x3e\x84\x09\x11\xad\xff\x2d\x94\xa3\xd7\x40\xdc\xf3\x5f\x0d\x9d\x45\x51\xde\xea\x13\x8f\xbc\x9c\xdb\x94\x50\x73\x66\xee\xef\x06\xe3\x3d\xbf\xe5\xbc\x5a\xbb\x1e\xb0\x27\x67\xe3\xbc\x0b\x4e\x0c\x86\x3f\x21\x35\x77\x7d\x0f\xac\x40\x6f\xbb\x7d\x87\x5b\xb0\x79\x83\xea\xae\xc2\x57\x53\x2b\x39\x27\x4a\x3e\x4c\x3a\x00\x3f\x3c\x5d\xe7\x62\x00\x4f\x1c\xe4\x12\xff\x11\xea\x9e\xfd\x53\xf3\x1f\x01\xf9\x9b\x3f\x72\xc3\x2b\xbc\xff\x4f\xd6\x8a\xc4\x71\xce\x15\xb5\xd5\x6c\x6e\xc8\xe5\x9a\x2c\x92\x36\x0d\x2d\x2e\x28\x3a\x61\xf6\xd8\x22\x5d\xdf\x0c\xc9\x84\xc6\xfd\xa8\x87\x8d\x9e\x7e\xa0\x1d\x4d\xc6\x52\x6a\x81\x2e\xa1\x50\xa7\xec\xac\x33\x81\x6c\x07\x31\x5c\x7f\x02\xf6\xf1\x80\x03\x7e\x15\x50\xf6\x3a\x18\x6f\xf7\x01\x05\x3e\x60\xc6\xa6\x3b\xb2\x25\x14\x6f\x5c\x53\x10\x1d\xa8\xec\x35\x98\x8b\x0a\xca\x66\x05\x49\x44\x74\xf6\x7e\xbf\x84\xea\x8a\x73\x41\x1d\xfa\x16\xd5\xb5\xfa\x5c\xcd\x8d\x1b\xd6\x3f\x72\x11\x97\x8a\x43\xb6\x8d\x66\x17\xc1\x04\x58\x46\xa1\xcb\xd6\x7d\x48\x4a\x87\xa6\x73\x11\x46\x03\x55\x82\x69\xe4\x41\xa0\x0a\x25\x44\x89\x83\x36\x9c\xdd\xec\xf5\x2b\x3c\x76\x65\xc1\x5f\xd9\xb2\xe8\xa9\x6b\x77\xf9\x68\xe7\xf1\x21\xb0\xf0\x55\x18\xe9\xeb\x52\x73\x5d\x12\xdd\x13\x35\xb1\x88\x9d\x69\x2e\x71\xc3\xcd\x34\x97\xf3\xfa\xf8\xdb\x8d\x73\xe9\x26\x76\x66\x9d\x31\xfd\x6c\xba\x33\x65\x4d\x09\x0f\x31\x1e\x84\x92\x7b\xf7\x2e\x57\x1d\xfa\xc6\x1b\x4d\xd9\x09\xa2\x5a\x3a\x1a\x17\x0e\x8a\x1d\x5b\x04\x5d\x17\x01\x0e\xde\x0f\x6b\xa4\xa3\x9e\x3a\x11\xa2\xeb\x0e\x57\x59\x93\x00\x92\xce\xb8\xae\x6e\xb4\x4b\x6a\x43\xb5\x1d\x93\xc5\x87\xb7\x38\x40\x5d\x0c\x27\xcb\x74\x56\x89\xb3\x2a\xd9\x11\x8d\x49\x89\xd3\xf0\x81\xf5\x33\x52\x0c\x08\x77\x0e\x22\xbe\xac\xd3\x4b\x7b\xbd\x25\x09\x09\x59\x40\xa9\xc3\x42\x33\xc1\xdc\x71\x02\xf1\xd4\x69\xd4\xad\xf1\xc7\xa9\x35\xb2\x88\x12\xad\xd1\xa9\xe4\xce\xb3\xd4\x8a\x82\xd5\x73\x3b\xca\xa1\xd5\x9d\x20\x08\x2e\xb9\x1a\xfd\xa2\x62\x50\x41\x52\x5f\xa7\xf6\x05\x24\x59\xbc\x1d\x5d\xbe\xc8\x50\x11\xaf\xb4\x18\xeb\x0c\x6e\x47\x96\xd8\xba\x4c\xd7\x4e\xe7\xa6\xb0\x0f\x0c\xf4\x6a\x24\xda\x84\x8e\x89\x3e\x3f\x43\x01\x37\x36\x66\x22\x16\x09\xd4\x28\xe2\xc1\x25\xc2\xa9\x0d\xb8\x8e\x4a\x74\xab\x51\xb5\xe4\xb4\xa5\xd2\xed\x23\xbb\xef\xd5\xc5\x23\xca\xbf\xb1\x7a\x2a\xb9\xc2\x00\x4b\x57\x69\xc9\x96\x52\x4f\x18\x58\x0f\x56\x0e\x22\x18\xdd\x56\xab\xa5\xb5\x5f\x2c\x52\x33\x79\xfa\xf0\xc0\x09\xe3\xd8\x1b\x63\x7d\x2e\xd9\xe5\xd4\x77\xb2\x88\xab\x6f\x3a\x16\x23\x91\xa8\xa3\x66\xf0\xb0\xe3\xc6\x17\x98\x96\xbb\xff\x36\xd7\x97\xbe\xb9\x0a\xfa\xfa\x37\xca\x30\x5f\xbd\x9c\x1f\x6f\x40\xee\x3d\xc8\x72\x36\x99\x85\xf5\xc7\xa9\xba\x9f\x2d\x9d\x48\x56\x47\x06\xa2\x1a\xcd\x3e\xa2\x2d\x4f\xec\xd8\x8a\x83\x34\x30\x03\x7f\x80\x26\x97\x36\x73\xa5\x56\x58\x7e\x54\x77\xf4\x98\xc5\x89\x48\xc6\xda\x5c\xde\x62\xc3\x42\x6d\xfa\x99\x88\x80\x94\x74\xe0\x10\x35\x95\x98\xd5\x55\xa9\xb2\x92\xa9\xf9\xc3\xc5\x78\xef\x2a\xac\x73\x3f\xb3\x9a\x35\xfd\x5c\x16\x91\xcd\xa9\x4a\xfb\xb5\x51\x79\xdc\x8a\x3c\x54\x9b\xd8\x10\x53\xd4\x80\xfd\xfd\xd9\xad\x21\x41\x4b\x94\xfe\xb1\x73\x1d\xe5\xfa\x2a\x86\x26\x31\xba\xe5\xba\xee\xc7\xac\xce\x6a\x5d\x3e\x5c\x6b\x7e\x54\x93\x88\x86\xaa\x62\x5b\x7e\x1d\x86\x8d\xeb\x2f\x28\x75\x5d\xaf\xed\x07\x4a\x78\x19\x13\xd8\x0d\xfa\x4e\x14\x3c\x51\x39\x80\x46\xc2\x5e\xdd\xac\x59\xf5\x68\xf1\x03\xf0\x97\xe4\x57\x5a\x4a\x1a\x03\x86\x63\xe5\x9b\x1f\xe4\xd0\x5e\xaa\xda\x1c\xd5\x1b\x49\x8e\x15\xd5\x97\x48\xf1\x95\x7e\xc1\x9a\xb9\xfc\x5d\x55\x2f\x49\xcf\x5d\x51\x2e\xd1\x82\x77\xed\x33\x3d\x77\x6d\x34\xd9\xe7\x38\xdb\x1f\xde\xc8\x2a\xee\x2c\x8a\x92\xb1\x26\xe5\xa8\xb6\x8c\xd6\x7e\x63\x6e\x09\x2c\xcc\x5e\x1d\x10\x9f\x62\x42\x5b\x6a\x90\xe1\x78\x57\x27\x79\x06\x87\xd3\xed\x10\x10\x92\x6e\x5c\x36\xef\x99\x9f\xf6\x2a\xcd\x61\xda\x3a\x99\x75\x40\x88\x1b\xc9\x8b\x36\x2c\x69\x3f\xdb\xdf\xe6\xec\x13\x91\x6e\xe5\x1e\xe5\x98\x66\x73\x9a\xf3\xb9\xe0\x5c\x2b\xe9\x35\x30\x73\x59\x2f\x3d\xfa\x15\x01\x37\x5b\x35\xbc\xc4\x9b\xd9\x36\x98\x7d\xfc\x57\x6c\x5a\x2b\x23\xd1\x34\xb0\x21\x59\x23\xbe\x36\x24\x11\x48\xa9\xf8\x4f\xa9\x8f\x33\xa7\xfa\x29\xd6\xce\xf2\x60\x49\x25\x25\xa5\x40\x33\x24\x74\x6e\xfe\xe6\xd7\x57\xde\x6d\x32\xcc\x3e\x04\xf2\xcc\xa2\xff\x43\xe1\x6e\x00\x88\x3f\x15\x7b\x03\x40\xba\x14\x13\x3d\xc4\x5a\x5b\x98\x01\xca\x89\x1f\x5e\x5a\x2e\x90\x59\x13\xd5\x9a\xf9\xd0\x82\xcc\xd0\x7e\x45\x53\x15\x93\xb6\xc2\x84\x43\x48\x75\xee\x7a\x29\xe3\x9d\x36\xe7\x70\x4d\x3e\xa2\x6f\xa1\x9c\x1c\x76\x58\x58\xc6\x65\x61\x79\x4d\x7d\x98\xe0\xf6\xae\xb9\x63\xba\xa3\x8a\x58\xa2\xca\xcb\x0a\xbb\x9d\xaf\xc2\x73\x30\xec\x0f\x73\x78\x21\x51\x6d\xf5\x91\x79\x70\xb6\x86\xb8\x18\xe3\x16\xc8\x95\x3c\x5c\x7a\x09\x38\xb9\x62\xc9\x81\xad\x8f\x88\xb7\xc9\xbc\xea\xb3\xa3\xb2\xe8\x48\x2c\x1e\xf3\xa0\x99\xe5\xb9\x59\xe8\x39\x5d\xc9\xa5\xf0\xb8\x2d\x08\xf6\x86\xc1\xf3\x1b\xd9\x18\xb3\xfc\xce\xac\x92\x36\xb5\x91\x35\x03\x58\x5e\xdf\xc0\x30\x84\x91\x38\xef\x87\xfa\x61\x19\xa6\xb8\x99\x3d\xd4\x6a\x7e\xe9\x6e\xb4\xf9\x75\x2b\xb3\xe7\xa6\xb7\xc8\x17\x1b\x00\x4e\x84\x9d\x04\xd7\xa1\x7a\xf5\x93\xc0\x65\x3c\x75\xd9\x9e\xef\x36\x1b\x1b\x67\x4c\x28\xd8\x61\x9d\x62\xc5\xd1\x6a\x79\x82\xf5\x88\x8e\x96\xf3\x38\xf1\xe8\x1d\x7e\xb3\x12\x00\x02\x79\x3f\x74\xde\x5e\x5a\xff\x1d\x57\xf8\x40\x56\x3c\x8f\x5f\x63\xcb\xfa\x1e\xbb\x24\xc5\x89\x63\x1b\x67\xc5\x68\x88\xb5\x54\xc0\x6f\xce\x45\x5f\x44\x0d\xc9\xdf\xaf\xf0\x3d\x34\x7d\x31\x9e\x5b\x8e\x3a\xb7\x30\x84\x2c\x59\x4c\x36\x6a\xbd\x3d\xec\x01\x24\xe2\xcb\x5b\xc4\xe6\x7e\x82\x31\x6d\xf3\x5f\xb9\xe4\x9b\x2a\x3f\x84\x2b\x01\x0d\x02\x91\x69\xdf\x12\x8d\xcf\xb2\xb2\x22\xce\x32\x55\x54\x85\x87\xb7\xb9\xb5\xf4\xfa\x59\x5d\x49\xeb\xe0\x9a\x9a\xb6\x10\x27\xb3\x04\x36\x95\xca\x56\x10\x31\xe7\x67\xb2\x08\x74\xfe\x51\x25\xfe\xf0\x20\x28\x6b\x30\x3d\xb8\x3f\x72\xe2\x81\x00\x17\x9c\x79\x8a\x86\x33\x20\x16\x41\xc5\x30\x86\x37\x0f\x74\x2c\x29\xa4\xac\x58\x67\x4c\x72\xa2\x20\xf6\xa6\x4c\xeb\x20\x4f\xae\xa2\x2a\xc1\x9e\xca\xd8\xb8\xd5\x5c\x71\x31\x6f\x16\x73\x3d\xb4\xed\xfb\x6f\xdb\xb2\x27\xb0\x87\xc4\x49\x24\x8a\x19\xa7\x10\x83\x34\xaf\xab\x6d\x5c\xd7\x9f\x25\x3b\x1e\x26\x70\x6b\x48\xf6\x50\xfc\x0a\x83\xad\x21\xfd\x29\x92\xcf\x06\x30\xe0\x2a\xb4\xbd\xcb\x79\xdb\xb3\x2a\xfb\x2e\x39\xb2\x2e\xc5\x7f\x36\x34\x7e\x6a\x17\x44\xca\x9b\x57\xa1\xe0\xc3\x3b\x22\x36\x6f\x6e\x15\x2d\xae\x4a\x01\x1f\x84\x15\xed\x31\x09\xa2\xb9\xf1\xef\xc8\xbc\x93\x2a\x85\x40\x4b\xb3\xbf\x1d\x72\x4e\x42\x0c\xfd\xf2\xbd\x9f\x1f\xf9\xa4\x50\x54\x8d\xc2\x22\x05\xda\x3c\xa7\x99\xb6\xee\xa5\x86\xd8\x0a\x13\xaa\xd8\x61\x0d\xfd\x2f\xfe\xef\x57\x7e\xfd\xce\x56\xf3\xfd\x4b\x37\x6f\xde\xbc\x04\xca\xd1\x4b\x93\x71\x3f\x1b\xc0\xc9\xf6\xb6\x9a\xff\xd7\xdb\xbf\x7a\x89\xb4\x17\xc8\xb7\x7d\x8e\x0e\x81\x5e\x52\x99\x65\x2a\x5f\x6c\xca\xa9\x13\x74\x50\x9c\x3d\xce\xee\xfb\x0c\xa9\x04\x1d\xe4\xdf\x88\xc1\x62\x8c\x5a\xed\x72\x51\x43\xb9\x19\xfc\xfd\x4a\x2e\x22\xbe\xa5\xde\xad\x96\x82\xba\xe3\x8c\x9d\x71\x80\xdf\x51\xa0\x5e\x18\xa1\xe8\x3a\xca\x47\xf4\x1a\x53\xc2\x84\x36\xd4\x86\x3d\x73\xb3\xac\xba\xed\x9c\x84\xe6\x4c\xea\xe6\xc7\xec\x2b\xa7\x92\x1b\x99\x2d\x9d\xc8\xfc\xa3\xa4\xc8\x9c\x7b\xc0\x4f\x19\x7c\x85\xd4\x46\xf0\x55\xc9\x5e\xbe\x11\xce\x85\xb5\x19\x86\x83\xfe\x2d\xe0\x7f\x00\x28\x04\x8f\x06\x6f\xcd\x2a\xe8\xe0\xdc\xe9\xd9\x5b\xb2\x6f\x13\x43\x8a\xdb\x64\x38\x49\x91\x0d\x7a\xed\x0c\x18\x1a\x8c\xc7\x95\xbd\x59\x0d\xa5\x72\xce\x76\x0a\x4a\x7f\xbb\xd1\x98\x5d\x83\x9e\x0a\xce\x65\x79\x22\xb0\x43\xe6\xda\x29\x9b\x23\x54\x76\x51\x94\xfd\xc1\xb8\x74\x26\x85\xf4\xe2\x01\xa3\x00\x8f\xc3\x10\x06\x75\x43\x1b\xa3\x9d\x4c\x8e\xa9\x62\x82\x89\x69\x56\x8e\x03\xf1\x15\xe8\x08\xab\x2f\xd6\x84\x54\xd5\x74\xe6\x25\xad\x19\xa1\x29\xea\x5e\x17\xe9\x33\xdd\x8a\xa3\x7f\xe0\xb7\xa0\x55\x14\x98\xb5\x95\x70\x1a\xe6\xae\x87\x41\xa2\x29\x19\x4e\xe9\x98\xb7\x54\x4d\x9c\x44\xea\x51\x2f\xd9\x82\x6b\x9b\x28\xa5\xab\x93\x32\xc8\x79\xb3\x16\xdd\xf7\x45\xb4\x0b\x8c\x2e\x1f\x9e\x81\xae\x4b\x52\x79\xda\xe6\xb5\x38\x4e\x2e\x7a\x00\x96\xe2\xa5\x8b\xad\x38\x0a\x0b\x05\xe7\x33\xe4\x80\x1c\x9b\x13\x7e\xb6\x91\x81\x92\xff\x8a\x1d\x22\x25\x11\x23\x27\xae\xe1\x8a\x24\x1b\x90\xc6\x98\x0c\x9d\x06\xfc\xd7\x96\x75\x85\x88\xfd\xd5\x34\xe5\x0f\x79\x75\xe0\x18\x90\x5d\x50\x6a\xe3\xf3\x49\x2a\x95\x7a\x54\x66\x5f\xac\xfe\x44\xb3\x2f\xb5\x02\x15\x77\xf4\x97\x55\x21\x7e\xfa\xca\xea\x9a\xd5\xb0\x16\xd4\xae\xa6\x46\x41\xe0\xaf\x86\x52\x89\x89\x60\x97\x63\x98\xb7\xe7\xa1\x3d\x8f\xa9\x9f\xe7\xed\x8c\xfb\x88\x88\x5f\x35\x03\x47\x84\xc6\xf1\x70\x15\x49\xe8\xe7\x54\x24\x50\x97\xa4\x12\xaf\x18\x2f\x91\xce\x15\x18\x8e\x52\xe7\x70\xd2\x92\xcf\x14\xbf\x90\xca\x59\x1c\x90\x3c\x2a\xfb\xed\x15\x3d\x0f\x5a\xf4\x86\xfb\x9d\x7c\x40\x0b\x7d\x42\xaa\x89\x88\x6e\xee\x75\x06\x03\x08\x8e\xfa\x8a\xde\xb1\xb6\x09\xf4\xb2\x51\x7f\x78\xab\x7d\x3d\xbb\x45\x99\xd3\xa3\x0a\xf8\x87\x88\x78\x8e\x30\x4c\x2d\x7a\xdf\x70\x64\x6e\x84\x40\xd9\xee\x97\xbf\xae\x1d\xc7\x8d\x11\x6a\xa8\xd7\x0e\x62\x35\xd4\xce\x9f\x01\xb9\xb8\x27\x96\xb9\x52\x9e\xea\x2d\x67\xb3\x15\xa4\xee\x7b\x31\x89\x66\xf2\xca\x95\x5f\x04\x95\xf8\xad\xda\x97\xfc\x4e\x54\x18\xe1\x3a\x87\x04\x2c\x58\xa5\x4e\x39\x9d\x3b\xcc\x53\x81\x70\x4e\xd3\xb9\x62\xab\xd7\x9f\x84\xb6\x0e\xa5\xc3\x29\x53\xe7\x5d\x27\x20\xb9\x0e\xd0\x72\x3b\x83\x80\x64\x8c\x67\xad\xcd\xaa\x6e\xcf\x6d\x5a\x77\x6b\xb3\x38\x62\xdb\x47\x1a\x30\x25\x7a\x85\xd3\x94\x5f\xad\x05\x04\x70\x49\x3b\x40\xe6\x85\x6f\x78\xa3\x00\x11\x0f\x96\x61\xce\x00\x19\xbb\x6c\x25\x6b\xa6\xb7\x25\x52\x7c\x65\x77\xa5\x56\xce\x83\xf9\x64\x38\xe0\xb3\x3e\xa0\x8d\x14\xaa\xca\x7a\x77\xb0\xf9\x63\xab\xad\xce\x1f\x46\x08\xae\x42\x3f\xa3\xe3\xc8\x92\xb4\xc6\x19\xff\xd9\x75\xa9\xa9\x03\x51\x95\xf5\x70\x9f\x64\x0c\x5a\x07\xa2\xd5\x91\x87\xbd\x7c\x67\xa7\xb5\x3d\x1e\xde\x2c\xb2\x76\x31\x9c\x8c\xbb\x59\xb2\x1c\x54\x90\x86\x04\x7b\x41\x56\x1d\xf3\xe8\x56\x5e\x76\x1c\xfa\x44\x01\x66\x97\x57\x5e\x2a\x39\xfa\x84\x99\x39\xd0\xa8\x74\xa3\x93\xf7\x21\xb1\xbb\x8a\x17\x0f\x5d\x62\xbc\x44\x45\x2d\x1a\x00\x92\xdf\xb7\xe1\x6f\xed\xa2\xec\x94\x44\x4d\x59\x94\xe7\x6a\xdc\x5c\x29\x80\x79\xc3\x69\x55\xd2\x23\x35\x5c\x31\xea\xe7\x25\x96\x13\x93\x2c\x2e\xe8\x4c\x4f\x38\x0c\x96\xcf\x87\xa1\xba\x4c\x06\xf9\x4e\x9e\xf5\xb8\x53\x90\xe8\x24\xd5\x09\x16\xcb\xf0\x1c\x65\xff\x24\xcb\xb9\x48\x45\x90\x53\xcb\x56\x75\xb0\x62\x91\xf5\x83\x73\x81\x21\xae\x4b\xc0\x55\xcd\x9b\x17\x7b\x4a\x9e\x62\x5e\xb5\x19\x4e\x14\x78\xd4\xa4\xfa\x30\x80\x18\xea\xfc\xb3\x5f\xbe\x43\xff\xc0\xda\x61\x94\xa6\xf8\x3f\xd8\xd1\xeb\x9e\xab\xc4\x84\x4d\xb0\x3e\x42\x31\x19\x8d\x20\x36\x08\x30\xdf\xbf\x29\xf0\x61\xa5\x9b\x77\x1f\xec\x3a\x20\xd5\xb6\x39\x6c\x6c\x69\xfd\x3a\x54\x52\x0e\x7a\xed\xaa\xf4\x9a\x35\x89\xd1\xdc\x50\xb6\x6d\xbf\x33\xb8\x65\xab\x04\xb0\x02\x3b\x4e\xd7\x7f\x46\x7c\xee\x3d\xa8\xe8\x48\x12\x8e\x52\x56\x85\xf3\xa6\xa7\x0c\xc7\xa4\x6d\xf8\xb5\xd3\xa4\x00\x5e\x2b\x5d\x08\x4f\xbe\x52\x21\x46\xfc\xbb\xca\x3d\xa6\x53\x6b\x49\xcb\xde\xb8\xb3\x53\x42\xf1\x16\x56\x77\xc2\x99\xda\x8f\xe6\xc8\xed\x28\x22\xd5\x84\x59\xb5\x5d\x6b\x03\x95\xdb\x12\x16\x30\xe5\xe2\x21\xfa\x3b\x46\xd6\x27\x45\xbd\x99\x6d\xd3\x01\xc5\xfa\x65\x07\xbc\x01\x10\xa9\x7c\x4b\x14\x71\xe8\xec\xe8\x4e\x99\x9a\xda\x26\xa1\xa3\x36\xd5\x59\x04\xa2\x82\x71\x62\x62\x7d\x5d\x60\xc9\x47\x77\x74\x2a\xa0\xff\x3e\xfa\x6e\x52\x66\x13\x8a\x6c\xe0\x9c\x10\x6a\x16\x1b\xe8\x70\x07\xc1\x63\xea\x42\x7c\xe9\x9c\x1c\x53\xdc\xf2\x0e\xc3\x9b\xc7\x93\xce\x98\xc8\x3e\x62\xef\x2d\x57\x77\x3b\xa1\xaf\xff\x54\x4c\x9b\x4f\x10\x8c\xce\xea\x2c\xf2\x4a\xc1\x28\x8f\x86\x95\x1d\x5a\xd3\x61\x4b\x69\x70\xb0\xf8\x52\xb2\x34\x88\xd2\x4f\x48\x18\x0b\x70\xb2\xa7\xb2\xb3\x9b\x50\x47\xeb\x60\x87\xa9\x6a\x8b\x8a\x41\x7a\xf5\xde\x08\x95\x45\xe6\x93\x25\x3e\x93\x85\x2d\x55\xbe\x87\xc7\x62\x38\x43\x77\x20\xaf\xed\x53\xca\x9d\x78\xdb\x5a\xa7\xe8\x80\xc3\xfb\x3e\xa3\x22\xff\xbc\xc0\x34\x23\x29\x9f\x6b\x99\x47\x69\xc4\x31\xa6\x3a\xc5\x04\xd8\x98\xd4\xa3\x23\x3a\xe0\x91\x4e\xfb\x19\x54\x9f\xa8\xfd\xfa\x62\x19\xe4\x70\x07\x77\x8b\xf8\xe5\x86\x75\x9a\x67\xd5\x09\xf2\x2b\x50\x84\x1a\x4b\xee\xe6\x6b\x65\xbe\x07\x9c\xf6\x80\x29\xdc\x23\xe0\x31\xb7\x9a\xc4\x5e\xa6\x1e\xa4\x15\x33\x30\xe1\xbf\x8d\x39\x38\xd6\x0c\xcc\x5d\x2e\x1b\xb4\x58\x9e\xb1\x18\xed\x81\xf2\xd4\xed\x32\x4e\x72\x61\xd7\x3c\xd9\xee\xe7\xa4\x8c\x89\xde\x6f\x05\x86\x80\xe0\x77\xc6\x86\x61\xf4\xfb\xc7\x0a\x3b\x4e\xfd\x27\x6c\xf1\x63\x32\x63\x48\x12\xe3\x92\xf0\x6f\x3b\x56\x38\x0a\xd7\xe3\xb3\x0a\x0e\x39\x8c\x1a\x08\x9b\x9f\xcf\xa9\xc0\xbb\xb8\x5a\x8f\x82\x38\x6e\x08\xba\xa0\x76\x4b\x3d\xb9\x73\x73\xaf\xd1\xf2\x2d\xc7\xfa\x59\x18\xee\xf0\x00\xf9\xd0\xb5\x3e\x00\x21\xaa\xf2\x23\xed\xbd\x71\x59\x7e\xf2\x65\xa7\x10\xa3\xad\x93\xa6\xa2\xf9\x38\x6d\x4e\x54\x42\x7f\xe9\xe5\xe6\xb5\x16\x4c\x9d\x27\x6e\xe1\x86\x93\xc4\xa4\x5c\xa3\x86\xb3\x8f\xa2\x4a\x06\x6b\x42\x5f\x1d\x8e\x77\xaf\x35\xd0\xe5\x0a\x4b\x49\x26\xfc\xb5\x2a\x9d\x97\xb0\xdb\x0e\x28\x84\xbd\xbe\xf7\xd9\x48\xb4\xf0\xcf\xa2\x7e\x18\x5b\xc8\x12\x46\x90\xe4\x23\x7e\xba\x82\x3a\x6f\xae\xc8\xff\x88\x55\x90\x27\xac\x40\x3c\xe1\x6a\x92\xa4\x78\x03\x0a\x78\x66\x26\x17\xcf\xa3\x96\x94\xa5\x36\x2b\x09\x52\x70\x24\xe7\xa3\xaa\xcf\xe7\x4c\x7d\xd0\x18\x65\xc3\x11\x90\x84\xbf\x86\x29\x79\x1a\xe6\xaa\xa1\xa4\x69\x31\xdc\xcf\x30\x42\x4d\x64\x0b\x9b\x42\x56\xdc\x21\x80\xdd\x2c\xb3\xce\x3e\x64\x7a\x01\x06\x16\x6b\xee\x60\x95\x4b\x76\x4f\x2b\x2e\xc7\x19\x7f\xb8\x01\xac\xb9\x80\xea\x52\xa0\x0c\x8c\x6b\xd8\xeb\xca\xdc\x30\x45\x2a\x15\x49\x13\x6d\x1f\x50\x33\x02\xae\x2c\x9d\x57\x0a\xfa\x26\x68\x3b\x77\x34\xf3\x60\x83\x35\x7d\x2d\x24\xfc\x67\x42\xdb\xb1\xf2\xa3\xd0\x18\x3a\xc4\x88\x14\x96\x7b\x58\xa6\xb2\x2a\xd3\x62\x9a\x2e\xb1\xaf\xcb\xb4\x6d\xb8\x14\xbb\x42\xbb\x8c\xaf\x98\xdf\xc1\xe7\x46\xd9\x4e\x57\x1c\xb0\x96\x18\xf7\x0d\x1a\x01\x0a\x3f\xe7\x45\xe1\x90\xe9\x57\xce\x3e\x74\x86\xa8\x74\x61\x23\x3d\x9c\x60\x9f\xc8\x6b\xc5\xe1\x84\xf1\x34\x50\xee\x7d\x9f\xaa\xc6\x1a\x91\x27\x1b\xdf\xc8\x12\xe8\xa2\xda\xf7\xd0\xea\x5d\x7c\x75\xb4\xc1\x1e\x6e\xdc\x51\xa7\x84\xe0\x66\xed\x90\xb9\x21\x76\x90\xd8\x71\xc4\x49\x32\x99\xa8\x0e\x75\x6e\x40\x9e\xf3\x87\x67\x04\xb1\xa8\x28\xc6\x41\x9e\xff\x0c\xe5\x68\x40\xd5\x7c\x9c\x96\xa1\x3f\xec\x72\x46\x91\xff\x46\xaf\x30\x4c\x03\xf2\x83\xf2\x36\xf8\x9d\x37\xf2\x7a\xaf\x39\xe1\x73\x7a\xbe\x73\xd2\x08\xf3\x76\x83\x9c\x11\xe2\xd3\xbc\xda\x20\x67\x84\x2a\x06\xa3\x12\x48\x34\x25\xa9\x80\xe9\xb5\x26\xb2\x6e\xe5\x27\xcc\xe0\x13\xe9\xdc\xe8\x18\x46\x7f\xb3\x03\x99\x8a\xa5\x87\x6c\xaf\xcf\xf7\x90\x52\x71\x3c\x35\xb4\x2b\xb4\xd4\x74\xba\x94\xf1\x7e\x3d\xb3\x96\xa6\x2c\xe1\x78\x72\x49\xdf\x54\xef\x2f\xf2\x04\xf2\x72\xc2\x26\x43\xd1\xfe\x56\xc1\x3a\x2f\x54\xc5\x23\xb8\x73\x39\x6f\x5c\x02\xf7\x07\x82\x63\xeb\x14\x3c\xd3\xcd\x38\x92\xf5\x7d\xed\x15\x84\x07\xba\x20\xa7\x0a\x72\x77\x76\x5e\x2f\xde\x39\x3f\xbb\xb6\x55\x7b\x5e\x57\xbb\x6a\xcf\xfd\xe4\x2c\x49\x53\xa9\x67\x0e\x90\x34\xd3\x09\x8f\x87\x58\x59\x3c\x55\x17\x7f\xb8\x0e\x42\x0d\xa2\x66\x56\xa3\xc5\x7f\xee\xe5\xa3\xf6\x8d\xbc\xc8\xb7\xf3\x7e\x0e\x75\x89\x3f\x43\x8c\x0f\x68\x17\xa9\xda\xab\xb6\x3d\x8a\x5a\x5d\x25\x69\x51\xbe\xc3\xe0\xbb\x25\xba\x5a\x7f\x30\x6f\x5a\xae\x06\x12\x2e\xd8\x1e\xe3\xfc\x06\x3a\x51\xfc\x77\xc7\xf2\x84\x1f\x2b\xc6\x73\xf2\x3b\xe9\xfc\x82\x5d\xb5\xc7\x43\xaa\xfc\x8f\x01\x73\x6e\x0f\x35\x45\x42\xfc\x01\xe2\x6a\x24\xf2\x9d\xe2\x2e\xe2\x60\x16\xf9\x6e\x18\xf7\x1b\x92\xc6\x0d\xd1\x94\xfe\xc8\xac\x62\x0c\x30\xcc\xa1\x85\x65\x11\xe0\x46\x2f\x16\xaf\x86\xfd\x07\x50\xca\xd5\xb1\x99\xf3\x06\xb1\x95\xad\x7f\x18\xe6\x03\xd9\x9d\x57\x9d\x04\xf9\x64\x6e\x94\x5c\x20\x7d\x02\x11\xc9\x96\xe6\xff\x5c\xdb\x2b\x42\x83\x62\xdc\xc1\x5e\xd4\xf7\x21\x9f\x46\x00\xef\xfb\xa3\x02\xbe\x79\x24\xfa\x65\x1b\x02\xc7\x9e\xd4\x77\xd0\x57\x8c\xd5\x5e\x11\xb8\xb7\x78\x6e\x54\xaf\x54\xaf\x96\x69\x06\x94\x4b\x89\xdb\x9f\x6b\xb1\x36\xb0\x60\xcd\xc2\x5c\xf0\x6b\xec\x7b\x6b\xfd\x3e\x5c\xca\x1e\xd0\x21\xcb\x5e\x30\x97\x99\xdd\xcb\x1f\xab\x22\xd2\xd1\xb9\xcc\x0f\x48\x4c\x0c\x70\xbe\x9b\x50\x61\x37\xac\x22\xdd\xf2\x6c\x2a\x73\x1b\x0a\x9e\x0c\x7a\x64\x7f\xe0\x4d\x2e\x0c\xed\xc1\x9e\x91\xdb\x72\xf2\xd6\x18\xbc\x48\xc8\x14\xe0\x92\x57\xcd\x5b\x52\x0b\x7c\xd8\x45\xcc\xb4\x27\x5e\xba\x30\x23\x73\x71\xd5\x24\xb7\x48\x54\x11\x47\x36\xba\xf3\xa3\xe0\xb9\x1b\xd9\x76\xde\x38\xe5\x80\xf6\x68\x5b\xc3\x19\xc9\xa9\x8a\xe4\x18\x0b\xa6\x4d\x25\xf2\xb1\xe4\xf6\x6c\xfc\x2f\xf5\x64\x42\x4c\xd2\x65\x35\x7f\xe4\x5f\xad\x05\xcf\x1e\x76\xb4\x61\x58\x3e\xb1\x8c\x91\x5e\xb4\x6e\x35\x7b\x92\x93\xa8\x6b\xcf\x50\x67\x6e\xf5\xb1\x8a\xc1\x8a\xe4\xc9\x14\x61\x16\x26\x61\xab\x22\x17\x2f\x64\x4a\xbd\x1b\x3e\x29\x9b\x0b\xc2\x26\x5e\xf3\x81\xca\x2a\x04\x52\xa0\x74\x6e\x66\x24\xde\xaf\x0a\x03\x09\x1f\xda\x8c\xab\xbd\xd7\x59\x78\x5b\x1a\xb9\x47\x2f\x2a\x1e\x53\xf0\x9b\x75\x91\x27\x77\xd3\x00\x1f\xcb\x63\xd0\x54\xc4\x02\xfb\xab\xd5\xc7\xbb\xe4\x78\x33\xcf\x98\xf1\x90\xb5\xd0\x72\x51\x01\x09\x81\x2d\x45\x07\x5b\x23\xf2\xfb\x24\xe5\xb9\x6f\x59\x67\x98\x7c\x86\x2d\xd3\x81\xd9\x28\x0f\x0f\x1a\x2c\x5d\x41\xbb\x4e\xda\x9b\x70\x93\x9d\x13\xfd\x78\xc6\x9d\xdb\x7d\x56\xe2\x35\x22\x5c\x9e\x84\x62\xcf\xea\x59\x0f\x62\xab\xfe\x18\xec\x31\x79\x04\xae\x9e\x94\xfd\x80\x03\xf4\xf4\x73\x51\x80\xfd\x34\xa9\x47\xb3\x11\xb7\xa8\x90\xac\x8a\xb8\x4d\x78\x87\xb4\x5a\x21\x5e\xb5\xd3\x07\xce\x68\x95\x29\x76\xc2\x95\x70\x38\x31\x25\xcb\x0a\x79\x5b\x37\xd9\x60\x38\x40\x0d\x3a\x78\x27\x52\xdb\x64\x2e\x01\xcf\x99\x94\xdd\xbe\x38\xf7\xb9\xa8\x00\x83\xcb\x71\x2a\x82\x0a\x15\xbb\x2a\x45\x22\xd9\x9d\x17\x94\x35\x3a\xb4\x02\xbe\xd0\x68\x5c\x45\x78\xbe\xd6\xe8\x75\x8a\xbd\xed\x61\x67\xcc\x25\x63\xb0\xe4\x71\x03\xfc\xf7\x8b\xa4\xf3\xbe\xd9\xaa\x91\x33\x3b\x83\xfc\x83\x8e\xe8\xa9\x62\xf2\x8b\x96\xee\xda\xcb\x6e\x40\x69\x7d\x28\x64\x2b\xba\xa8\xbf\xda\x07\xc3\x15\x59\xac\xb7\x0d\x28\x0d\x50\xd6\xde\xe5\x04\x4f\xa8\x75\xa6\x6c\x1e\xa2\x54\xe0\x2c\x12\x18\x72\x68\x93\xea\x59\x17\xd0\x43\x3e\x27\x68\xb9\x3f\x1c\xe4\x1c\x60\x8d\x9b\x5d\xfd\xcb\x92\xeb\xee\x1a\x2a\xae\x93\x65\xdf\x97\xfc\xd8\x0d\x4c\x03\xcc\x3f\xfa\x8a\xf0\x46\x39\x2c\x3b\x7d\x74\x53\x01\x55\xfb\xab\xcd\x8b\xbd\x86\x3b\x50\xf4\x4d\x31\x80\x80\x09\xf5\x56\x91\xff\x8c\x6a\x38\x34\x58\xa5\xe3\xd4\x7e\x3a\xe0\x4b\x0f\x77\xcb\x00\xd5\x3e\xba\xe7\x4c\x8a\xe4\x06\x24\x7e\xc3\x3f\x04\x72\x40\xc5\xf9\x81\x8a\xa5\x16\x48\x39\xab\x31\x2a\x09\x61\xed\x58\x1e\xb4\xe6\x72\x91\xfd\x7c\x6d\x1b\x5d\x11\xb6\x5f\xaf\x30\xaa\x6f\xe9\x16\x09\xce\x2c\x68\xf1\xd4\x97\x94\x03\xc7\x4a\xdd\x34\x46\x39\xde\x40\x67\xea\x34\xa6\x0e\x72\xfc\x11\xc8\x4c\x8c\xbc\x78\xe2\xbb\xe7\xca\x1d\x7f\x73\x09\x4e\xfc\x2d\x78\xe9\x51\xd4\xef\x51\xa2\x14\x6f\x2d\xa0\x4d\x94\xf4\xb9\x67\x94\xe9\x64\x86\xb1\xc4\x2a\x37\x73\x78\x56\x0a\xf8\xc4\x17\x3c\x71\xe6\x5e\xaa\x37\xff\x90\x0e\x9d\x7f\x4c\x78\x78\xb0\x7c\xba\x01\xb6\x33\x57\x3d\x47\xff\x52\x42\x25\x8e\x1a\xd4\x56\x73\x88\x7e\xb5\x45\x32\xab\xce\xd1\x73\xc5\x0e\xfa\x8b\x55\xa8\xba\x2f\xc7\x35\xa0\xfd\x99\x73\x83\x79\x79\xcf\x3c\xf0\xbb\xcd\x16\x2c\x49\x17\xeb\x3b\x1e\xb5\x52\x8f\x34\x61\xfc\x49\x68\x20\x93\x3d\x8b\x9b\x79\xd9\xb5\x71\x11\x2a\xff\x4e\xb2\xf5\x78\x32\x08\xca\xa6\xab\x66\x50\x94\x04\x8a\x00\x6d\xe7\x83\x5e\x7b\x08\xe8\x94\xd0\x93\xad\x50\x42\xf1\xeb\x61\x65\x86\x5f\xff\x14\x10\x6f\x51\x3b\x90\xb2\x2d\x6b\x6d\x78\xcd\x70\x1b\x65\x92\x72\x53\x32\x27\x9e\x0f\x30\x2e\xa3\xe3\xb4\xa7\x45\x68\xc4\x0f\xe6\x5f\xea\x30\x56\x51\xe8\x23\x3d\x38\xf5\x0e\xa7\x7a\x82\xea\xbd\xd5\x8e\xfd\x6c\x1b\x44\xa6\x05\xd8\x97\xfc\x46\x56\xbb\x35\x28\xc4\xf4\x21\x4e\x3d\xaf\xe0\x68\xa6\x6b\x46\xaf\xd8\xd7\x06\x03\x2b\x1b\xc2\x39\xb7\x87\x8c\xf0\x60\x97\x38\xab\xba\xed\x59\x3d\x93\xf5\x40\x4d\x20\x73\x52\x49\x39\x25\x30\x3e\xdb\xa7\x84\xac\x29\x72\x3b\x72\x97\xad\x5d\x50\xc5\x89\x3c\x8f\xb5\xc4\x2e\x1e\x89\xe5\x9d\xf3\x4c\x77\xf3\xb2\xbd\xdb\x95\xb3\x0c\x5e\xb2\x3f\x88\xa6\xca\x87\x15\x37\x5a\x31\x72\xfa\x50\x12\x8a\x3a\xf6\xb8\x54\xcb\x98\x39\xad\x7b\xf5\x7a\xaa\xf7\x37\xce\x30\xb9\x7d\xa7\xdf\x6f\x17\xc5\x1e\x85\x3b\x10\x1a\xb4\x37\x42\x10\x7a\xa1\x65\xbe\xbf\x0c\x78\xc8\x30\x8f\x1f\x64\xe8\x79\x5f\x5c\xb0\x87\xdb\x7c\x91\x1e\xe8\xf2\x89\x68\xc0\x5e\xc5\xe7\x7b\x89\xb8\x17\x3f\x30\x23\xd2\x57\xb8\x1c\x94\xb8\x9d\x97\x6a\x17\x58\x01\x41\xf5\x3c\x8b\xf2\x55\x55\x5b\x63\x74\xb9\xd1\xf1\xa8\x38\xab\xaa\x33\xf2\x9f\x97\x33\xa1\x1c\xa3\x01\xde\x51\x33\xd1\xa5\x25\x29\x61\x2d\x42\x78\x11\x51\x22\x78\xa9\x90\x7b\x28\x5a\x3b\x58\x66\x91\xe4\x36\x36\x2d\x85\xd8\x65\x90\xad\x01\x9b\x33\x3d\x0d\x8c\x7f\x51\x9e\xf4\x27\x69\xee\x1d\xe6\xab\xb8\x08\x7d\x14\x15\xb7\xf1\x37\xd8\xfc\xd6\x33\xdf\x61\x3e\x80\x3a\x35\x3e\x5a\x04\x6f\xb8\xb9\x08\xd0\x76\x19\x9c\x98\xf7\xbc\x68\x72\xcd\x6c\xcf\x8e\xf3\x24\x46\x2d\x7c\x21\x95\x88\x0d\xcf\xa6\x62\x5f\xc9\x73\xd2\x72\x07\x78\x72\x8c\xcd\xed\x96\xf9\x7e\x16\x8a\x3c\xe4\xeb\xa8\xfd\x51\x35\xb3\x32\x19\x43\x74\x44\x7b\x77\x38\x1e\x4e\xca\x7c\x80\xc1\x7b\x98\x3a\x05\xed\xf2\x6f\xc9\xcf\x45\xa2\xcf\xbe\x91\xdf\xc7\xb7\xda\x13\x2a\x22\xe4\xba\x2d\x52\xf6\x45\x44\x7e\x14\xd3\x7f\xa0\xc6\x42\x81\x4f\x46\x02\x77\x91\x2e\x79\x48\xb1\x04\xe8\x42\x42\x4f\x97\xb3\xea\x51\xb8\xff\x70\xbb\xec\x50\x0d\x94\xfb\x4b\x49\x7b\x50\xd3\x6b\x34\xc4\x62\x00\xed\xbe\x79\x0d\x93\x51\x1b\xce\xce\x5c\xf4\x9f\x48\x13\xdd\xb4\x6f\x55\x9c\x60\x1d\x90\xdb\x6c\x11\x56\x84\x8f\x96\x22\x5b\x89\x46\xb5\xfb\x11\x8f\xba\xe6\xda\x6d\xed\x8c\xb3\x78\x9c\x05\x5b\x40\x1e\xd8\x15\x1e\xfa\xab\x4c\x8e\x28\x57\xb7\x97\x75\x46\x9b\x5f\x1c\x46\xf0\xb6\xd2\x23\xe2\x48\xeb\xcf\x7f\xd3\x21\xf2\x5e\x9f\x0d\x9d\x94\xcf\xe4\x3c\x5d\x31\x62\x2e\x2e\xa2\x70\xae\x41\xd8\x0b\xb2\x47\x75\x6d\xe4\x80\x8f\x36\xde\xc6\x70\xfb\x1f\xb2\x6e\x59\x48\xa4\x0d\xd7\x5d\x3d\xac\xef\xb9\x3d\x1c\x96\x45\x39\x36\xdd\x8b\x92\xb2\x3d\xe0\xc5\x44\x1b\xe1\xa4\xc6\x60\xae\x00\xa4\x63\xbb\xf9\x1a\x08\x33\x40\x74\x1f\x5f\x54\xbe\x22\x32\xa6\xd1\xb0\x1e\x3a\xdc\x2f\x46\x46\x8c\x31\xe3\x4f\xba\xe5\xc4\x90\x90\xca\x55\x99\x0d\xbe\x7d\xc5\xb4\x25\x9f\x4a\xde\x73\xdd\x40\x55\x60\xb2\x6e\x9c\x6e\xa7\xbb\x97\x6d\xba\xa2\x37\xa1\xf1\xe6\x43\xd5\xac\xa9\x76\xa4\xd1\x78\xb8\x93\xf7\x81\x5e\x6c\x4f\xba\xd7\xb3\x12\x6a\x00\xec\xb5\x31\x5a\xa5\x66\xcc\xdf\x48\xaf\xe6\xcf\xb0\x57\xf3\x17\xa6\x57\xf3\x5d\xe8\xa5\xf9\xcc\xae\xb9\xc8\xb2\x83\x91\x68\xd5\x63\xbd\xf5\x66\x93\xfd\xf7\xa6\x8e\x6f\xd4\xe2\xaf\x91\x27\xa1\x10\x12\xea\xba\x18\x2d\x81\x30\x5c\xf3\x58\xa5\x8c\x40\xa4\xfa\xaa\xc0\x2a\x83\xec\x7d\xe6\x88\xbb\xb7\xba\x18\xa6\xc3\x1a\x93\x43\x8a\x4c\x42\xda\x86\xb4\xe8\x64\x79\x6a\x29\x1a\xcb\xfa\x6f\xbd\xa9\x46\x42\xd5\xa0\x19\x89\xe8\xd8\x67\x2b\x1b\x40\x41\xd9\xbb\x95\xc2\x06\x98\x21\xaf\x2b\x51\x12\xdb\xd7\x12\x10\x15\x85\x71\x1c\x4e\x67\xfb\x8c\x3a\x88\x3a\x6c\x27\x48\x48\x76\xd7\xda\xf4\xd3\x6b\xe4\x3e\x91\x2f\x6f\x5d\x5f\x5e\x9e\x42\xe4\xe6\x33\x69\x87\x29\x75\xe4\x7e\x67\x00\x45\xda\xcc\x33\x80\xe0\x83\xbf\x5a\x33\xee\xa9\xaf\x92\x4c\xd6\xeb\xb8\xc7\x03\x81\x43\xae\xf5\x9e\x4a\xf9\xe4\x2a\x49\x5c\xba\x38\x0d\x0c\xff\x22\x82\x7e\x4f\xe7\x80\xe0\xab\x93\x26\x54\x0d\xad\xd2\x75\x80\x9b\x31\xdb\x16\xab\xac\xe9\x33\x79\x11\xf7\x52\x69\x4d\xa8\x01\xe6\x66\x19\x67\xbb\x60\x02\xa0\x4c\xf3\x52\x5f\x74\xca\x22\xe0\x32\x99\xd3\xb1\xfa\x9c\xac\xef\x6f\x42\x47\xe8\x9d\x62\x3a\x3e\x59\x1d\xdf\x66\x91\xc8\x2d\x1e\x32\xac\xff\xaa\xa7\x23\x3d\x11\x47\xb6\x7e\x2d\xfa\xc3\xf5\xda\x43\xee\x0e\xcf\xba\x6f\x3d\x50\xc9\xe5\x4c\x8f\xdc\x1f\xee\xe6\xa2\x68\x5b\x97\x42\x48\xe2\x74\x49\x52\xe1\x51\x46\x9d\xa2\xb8\x39\x1c\xf7\xac\xa7\xc7\x37\x2e\xb9\xd9\x4a\x05\x1f\x1f\x5b\x29\x81\xb3\x75\xaa\xc0\x0e\xd1\xdf\xde\x93\x03\x61\x71\x84\x90\x68\x16\xd4\x81\xa5\x13\xb6\x59\x64\x3d\x7f\xcc\x9a\x03\x76\xa0\x9f\x0c\x9b\x89\x61\x7f\xbf\xf3\x3e\xa9\x7e\x10\x12\xd1\x78\xf2\x17\xec\x75\xa7\xd5\xa4\xa0\x02\x48\x9d\x11\x4b\x0e\x15\xbd\xc9\x8c\xf9\x22\x93\x5c\x89\x12\xbb\xf4\x8a\x2e\x74\x7e\x27\xe1\xa4\xde\x44\x3d\x33\x01\xd1\xa9\x30\x72\xa7\x78\x23\xe6\x92\x5e\xe2\xe9\xf2\xa2\xad\x5e\xa6\xef\x88\xcb\x20\x09\x63\x4f\x2b\x9e\xac\x39\xe9\xbd\x7c\xdb\x1c\x12\xc2\x43\xd5\x00\x9c\xe5\x01\x4e\xfc\x01\x6f\xdb\xe5\x17\x60\xa9\x4f\xc1\x1e\xac\x89\x50\x41\xed\x70\x69\x4b\xad\xa7\x1e\xc4\xa7\x2f\x60\x0b\xbe\xe3\x90\x14\xae\x4d\x89\x4c\xea\xc6\x5e\x85\xde\xe1\x73\xeb\x48\x75\x47\x63\x95\xa6\x57\xd2\x50\xcf\x93\xef\x8f\x86\x63\x38\x16\x7c\x46\xb5\xfb\x08\x83\xec\xe1\xe7\xa7\x68\x71\x96\x0c\x9b\xa7\xea\x15\xa6\x94\x41\x49\xe8\x0f\xdc\x62\xb4\xb6\x54\x3a\x54\x7b\x0c\x3f\x56\x56\xe2\x18\xc2\x8b\x32\x37\xb2\xff\xf0\xe6\x80\xed\xa7\xe9\xed\xf9\x15\x56\x0e\x19\x7b\x12\xa1\xb6\xb9\xef\x52\x69\x03\xee\x5b\xdb\x68\x32\x14\x61\x93\x6a\x04\x36\x2b\x92\xab\xcb\x1b\x66\x33\xd7\xfe\xdc\x75\xc5\x5a\x5a\xde\xa6\xa1\x24\x13\xc6\xe8\x24\xf7\x9c\x48\xbc\x1c\x6c\xb9\xca\x1d\x6a\xdd\xb6\xc9\x75\x94\x5c\x1d\x67\xe2\xfc\x75\xea\x7b\x2f\xdb\x32\xde\xb3\x4a\xef\x59\x08\x2e\x51\x77\xef\xc5\xa9\xa5\x90\x64\x6d\x0e\x05\x73\x0e\x94\x2b\x7b\x53\x26\xa3\x36\x00\xcb\x67\x1a\xf0\x87\x28\xd0\x08\x7f\xad\xf6\x16\x6b\x90\x55\x1b\x39\x84\x4d\x17\x55\x91\xb8\x8a\x06\xaa\xf1\xb5\xa5\x06\x7a\xc9\xf4\x4b\xc2\x21\x58\x46\xbb\xd9\x29\x0d\xe7\x1f\x58\x86\x95\x9c\xcd\xcd\x8c\xc8\x05\xbb\xfb\xf7\xd8\x18\xca\x0d\xa8\xae\xa1\x08\x61\x54\xfd\x0e\xed\xf5\x4c\x9b\x37\xdd\x79\x35\x17\x00\x73\xd1\x80\x03\x88\xee\x4d\x78\xf9\x2e\xcf\xce\xc1\x52\xf0\x50\xea\xac\xe8\x17\x95\xdc\x89\x7f\xc9\x06\x20\xb3\xf4\xfc\x3c\x61\x0b\xfe\x78\xde\x70\x37\x75\x24\x71\x0e\xc5\xf5\xeb\xc5\x8e\x91\x29\x71\x83\x8e\x45\xd6\x9d\x8c\xf3\xf2\x16\x60\xe2\x72\xd8\x1d\xf6\xe5\x6d\x1d\x2c\xc9\x95\xff\xd4\xb9\xf7\x82\x56\x0c\x5f\x00\x75\x4d\x65\x84\xa2\x2f\x7b\xc3\x82\xb8\xef\x15\xa7\x14\xe7\xdf\x81\xcc\xd0\x89\x18\x7a\xc1\xbf\xa1\xa5\xb0\x37\x90\x75\xbf\xf8\xf3\x77\x5e\xb2\x79\xf1\x54\x25\x4d\xdd\x5a\xd8\x31\x18\x6a\x8a\x3c\xca\xa9\x10\xa4\xf5\x9d\x2c\x0f\xf7\x59\xa4\xf8\x77\xe5\x60\xd5\xb0\xab\x3b\x3e\x03\x26\x39\x9d\x30\x58\x12\xec\x38\x2a\xb3\x9e\x76\x9a\x09\x95\x49\x1c\x30\x9f\x40\xda\x7e\xb6\x75\xeb\x9a\x5b\xcd\x32\x84\xae\xb3\x2d\x81\x39\x10\xa2\xb6\x31\xf8\xf9\x4f\xb8\x56\x00\xfe\x5f\xff\x4e\x12\x61\x63\x21\xb2\x3b\xe4\x09\xa8\x7b\x84\x87\x5f\x25\x3b\x08\xa8\x95\xe5\x38\xdf\x9e\x94\x99\x4a\xcc\xf9\x47\xc6\xea\x0f\xa0\xc2\xaf\x62\x0d\x66\x95\x7d\x7c\xf7\xab\x1a\x7e\x7a\x11\x25\x38\xd6\x6c\x63\x65\xe9\xc6\x95\x8e\x85\xc5\xe4\x98\x36\x5d\xac\xe5\xe6\x48\x8b\x6d\x73\x11\x84\x4b\x3d\xef\xd6\x8a\x49\xf5\x69\xa0\xd2\xfb\x09\xe3\xed\x7b\x51\x57\xf3\x90\xfa\xe9\xa9\x80\xa8\xd3\x36\x3f\xb5\xf0\x6c\xfb\x15\xa0\xf7\x03\xe8\x26\x3d\xd0\x21\xdb\x91\x94\x82\x01\xfd\x74\xec\x98\xd6\xe4\x46\xc6\x13\xd4\x7b\xd1\xc9\xdb\x7c\x73\x1b\xbc\x41\xaa\xd6\xef\x17\xea\xa7\xc5\xd6\x00\x0d\xfa\x3b\x56\xf7\xac\xf4\x64\xe4\xfe\xfb\xc0\x66\xb7\x8b\xce\xe5\xb7\x8b\xe6\x4f\x7b\xcd\x2b\x3f\x15\xf4\xb5\x5f\x8e\xda\xe8\xaf\x70\xe5\xed\x77\x7f\xb3\x11\xc2\x33\x3d\x10\x3f\x51\x87\x3b\x11\x92\x82\x06\x88\xa8\xb0\x81\x70\xb7\xb2\x0f\xae\xb2\x41\xb8\xcf\x16\x69\x56\xcc\x77\x93\x85\x71\x4a\xde\x3f\x4f\xf7\xdb\x44\x90\xf4\x00\xdf\xc9\x92\x7e\xfa\x1d\xeb\x84\xe9\x4d\xba\xa2\x32\x0d\x5f\x10\xb9\x39\x23\x67\x69\x97\x0a\xd8\x6b\x5b\x89\xa9\x08\xe5\x91\x07\xe8\xbd\xb8\x88\xb1\x63\x39\x35\x35\x6c\x97\xfd\xc2\xaf\x5f\xfc\xee\xaf\xae\x34\x13\xb8\xd2\x5e\xc7\xf5\x7c\x04\x9d\xda\x90\x77\x51\x74\x1b\x0b\x17\x29\x23\xc2\x33\x5e\xa6\x24\x81\x99\xe2\xa8\x70\x1e\x5c\x97\x52\x68\xa9\x5c\xd3\x08\xbc\xb2\xb3\xf1\x8d\xbc\x9b\xc5\x54\xf1\x37\x3f\x7d\x9b\xf8\xc3\x53\x52\xf4\xf9\x1b\x30\xff\x18\x5a\x8d\x8b\xbf\x15\x38\x6d\x84\xac\x27\xec\x7e\xf7\x31\x51\xd9\xb4\x26\x85\xd9\x86\x7c\x44\xf5\x61\xf8\x8a\x05\x20\x42\x75\x88\x92\xd2\xa3\xa0\x00\x9b\xbc\x79\x2d\x17\xe0\x4b\xc7\x87\x6b\x7a\x05\xd2\xb2\x63\x5e\x12\xea\x1f\xce\xb0\x54\x37\x5a\x5a\x1d\x94\xa8\xc2\xa4\x39\xa4\xb5\x31\xac\xeb\xb6\xbe\x61\xc4\xaa\x9e\x73\x5d\x10\xc6\xc6\xe7\xbd\xa6\x26\xe1\xea\x60\x83\x4b\xf0\x86\x6a\x13\x03\x18\xc7\x5b\xd4\x8d\x80\x32\x40\x3c\x8a\x9f\x9f\xa6\xfe\x08\xab\x83\x62\xcf\x5f\x31\x89\xdf\x35\x4a\xa0\xb9\x24\x72\xdc\x0c\x1c\x0f\x57\x2a\x63\x65\x85\xa2\x08\xe9\x97\x0b\xe8\x48\x3b\x8e\x06\x8c\x98\x1c\x23\xad\xff\x21\x21\x3d\xdc\xc6\x43\x72\xb9\x88\xaa\xdc\x4a\x5b\x0c\x1f\x11\x89\x7b\x75\xe0\x78\x72\x5f\x19\xa4\x7c\xa4\x5b\xfa\x2a\x82\xe2\x2a\xb5\x57\x18\xca\xb0\x89\x7a\x70\xec\xba\x2c\x26\x6f\x71\x64\x56\x8c\xf6\xf2\x2c\x09\xd1\xd2\xb1\x33\x1a\x25\x1c\x0e\xa5\x48\x91\x64\x83\x96\x14\xed\xaa\xd3\x0d\xc2\x85\x61\x6a\xae\x0d\x7a\x56\xa6\x5f\x5f\xd3\x37\x25\x5d\xf0\xa7\xe1\xce\x4e\x3f\x1f\x18\xae\x09\xb3\x8e\x7d\x63\xb0\x3f\x40\xe7\x63\xd0\x8c\x52\xe2\x26\xc3\xc6\xd8\x61\xf2\x02\xd1\x3a\x98\xf2\xd1\xdc\xbd\x4b\xbc\x92\xc2\xea\x71\x36\x30\x4c\x44\xb3\xfa\x04\xae\x1d\xef\xfc\xd8\xc6\x8b\x4d\x65\xdc\xf1\x04\x41\x7b\x5c\xad\x51\x9e\x47\x6c\x96\xee\x4b\x6b\xff\x56\x96\x6b\xf9\x2f\xe7\x9f\x29\x7e\xe4\xd2\x09\xf4\x04\xe3\xe1\x10\xbc\xc7\xc1\x3d\xf3\x1b\xa4\x8f\x8b\xc0\x35\xa6\x2a\xa2\xc2\x42\x0e\x38\x69\x77\x31\xed\x9e\x1e\xec\xbe\xd7\xdb\xe5\x67\x24\x9f\xa4\xc0\x53\x8e\x87\x32\x47\x59\x3f\x8e\x3e\x58\x3b\x7f\x77\x9c\x8f\x92\x65\x02\x14\x8f\xe0\x0e\x19\xb2\xd2\x17\x8c\xcf\xea\x4f\x7b\x11\xa4\x36\x59\x52\x4e\x9c\x29\x29\x35\xea\x31\xb0\x5d\x5c\xb1\x27\x6f\x8a\xf3\xf2\xa6\x03\x04\x54\xf3\x84\x0e\x60\xe6\x00\x15\x5a\x80\x86\xa4\x6c\x6f\x4f\x0c\xeb\x6b\xb0\x21\xbd\x5c\x71\xe1\xbf\xbd\xf2\x72\x5a\x11\x63\x47\xe6\x3d\x8f\x31\x55\xc3\xd5\x3c\x0b\xf8\xec\x4b\xd8\xea\x43\x1f\x83\x48\xfc\xef\x2e\xff\xbc\xd9\xde\x27\x7c\x18\xaa\xcf\x1a\x68\xd3\x4d\x21\xff\x29\xd6\x46\xf2\xe0\xe0\x88\x52\x1d\x2b\x87\xb6\xa0\xcf\x2e\x2c\x29\xea\xf1\x90\x64\x54\x27\x04\x34\x5f\xfc\x91\xe9\x70\x89\x3a\xfc\xe8\x25\x3d\x88\x11\x2b\xf2\xfd\xc9\x3e\x65\xd4\xcd\x3f\xc8\xda\xdd\xbd\xac\x7b\x5d\xd8\x48\xc5\x35\x1e\xd3\xc3\x9e\x5b\xa9\x9f\x42\x50\x99\xa5\x7d\x42\x49\xa7\xbc\xb4\xc2\xd1\x82\xc3\xb9\x0a\x30\x96\x9c\x7b\x40\x8b\x99\xb6\x2d\x02\x8f\x58\x1f\xee\x98\x8e\x9e\x50\x03\x68\xa5\x94\xfb\x35\x56\xbf\xb8\x6f\x5a\xb1\xe5\x7e\xad\x7c\x5b\xaa\x4d\x51\xf4\x09\x6b\x5d\xb9\xf2\xab\x14\xa2\x75\x2d\x44\xba\x79\x71\xe5\x25\xc8\x1e\x99\x65\xed\x8e\xb3\xe2\x25\xd5\x45\x5d\x7e\xf0\xab\x1d\x04\xfb\x5e\x28\x7e\xdf\xcf\xcb\xec\x27\x17\x20\xce\xec\x42\x99\xf7\xb6\x2f\xbc\xe4\x91\xc3\x1c\xb3\x50\xa6\x8f\x53\x62\xc9\x14\xcf\xef\x63\x19\x36\xaf\x66\x20\x86\xbb\x2a\xf2\x5f\xa2\x07\xda\x1d\x4a\x65\x84\xe6\x33\x95\x8c\xe3\x51\x18\x28\xe3\xe8\x9b\xbd\x3e\x5f\x76\x0f\x09\x92\x15\x31\x02\x72\x64\x43\xe6\x92\x41\x1c\x76\xcf\x90\xdf\x96\xc6\x60\x07\xff\xed\x49\x59\x62\x15\xcf\xa5\x4b\xb5\xcb\x62\x3f\x96\xba\x38\xae\x16\x55\xec\x41\xfc\x7e\x92\x8f\x0d\x4b\x9e\xef\x0e\x80\x75\xa3\x74\x89\xd1\x31\x04\x8a\x13\x95\x65\xd0\x65\x55\xe4\x11\xf1\x40\xc5\x6a\xfd\x57\x67\xaa\xd6\x4c\x1f\xa6\x8b\xac\x3d\xaa\xf0\x6d\x07\x07\x16\x09\x88\xe7\x79\xe5\x32\x17\x4b\x7f\xdd\xce\xa8\xec\xee\x75\x7c\xb9\xef\x4d\xfa\xd1\x72\x35\x54\xff\x01\x72\x9e\xb6\xfb\xe4\x8c\xff\xd5\x72\xc1\x71\x34\x33\xab\xd0\x08\x8c\x90\x9a\x92\x17\x59\xe9\xf4\x91\xf5\xe3\x00\x43\x28\x4e\xd3\x7e\x0d\x13\xa5\xa4\xb4\x2f\x41\xea\x42\xad\x09\x71\xb3\xda\x61\x1d\x6f\x23\x63\xfc\x7e\x92\x4d\xcc\x82\xb2\xc1\x2e\x3c\xcd\xcf\x85\xb9\xa7\x49\x6d\x80\x0a\xd7\xac\xb3\x57\x45\x95\x13\xd0\xc1\xc3\x70\x5a\x9e\xfb\xca\x31\xb3\xed\xe4\x38\x68\x09\x74\x5c\x4d\x48\x40\xfb\x99\x55\x02\x0d\x0d\x77\x8a\x41\xae\x3d\x06\x26\xa3\xa7\x1a\x51\x72\xff\x7a\xea\xce\x8d\x04\x4a\x0d\xbe\x1a\x86\xb0\xf9\x8b\xbf\xff\xd5\xaf\x83\xe6\x09\x04\xcc\x5f\x2a\xd1\x36\x7f\x5f\x8b\xa4\xd1\x59\x04\xa9\x30\xe9\x13\xbf\x5c\xea\x6a\x60\xab\xa0\x60\x22\x3d\xe2\x27\x8e\xe3\xb6\x3d\xdb\x3b\x30\x61\xaf\xa2\x6e\x6c\xa2\xd0\x22\x0b\xbb\xe9\xe1\x89\xa8\x83\x72\xe0\xd5\xe6\xc5\x1b\xf1\x64\x05\x26\x76\xfd\xbe\xb2\xb7\xce\x40\xe9\x95\x38\x51\x23\xb7\xec\xcd\x53\xcc\x11\x5f\x3c\x06\x14\xad\xe5\xe3\xa8\x4b\xd2\x9a\xe3\x5e\x16\x39\xcd\x6d\x06\x50\x27\xb8\xe2\xa9\xdf\xb5\xd3\x33\x58\x84\xb2\xe3\x99\xaf\x4d\x76\x90\x78\x8a\xc7\x76\xdb\x6f\x8a\x9e\xb9\x37\x3a\x7d\xdb\x96\xcb\x80\xa0\x80\xa9\x98\x69\xbb\xa6\x81\x6d\xc9\xfe\xfc\x56\x65\x8b\x74\xce\xc1\x07\xc5\x9a\x6f\x86\x1d\xee\x10\x2d\x53\x24\x87\xbb\x8f\xc6\xc3\x1b\x79\x8f\xb3\x4a\xd8\xb0\x74\xb0\xaf\x9d\x54\x75\x95\x2e\x1b\x1e\xe0\x51\x38\xae\xdd\xb1\x41\x6e\x79\x42\xa5\x87\x6f\x81\x48\xd4\x9c\x10\x8d\x26\xf0\x8c\xdb\x01\xeb\xd2\x00\x81\x5a\x2f\xf6\xfb\xad\x1a\xd6\x6e\x68\xb7\x6b\x6f\x89\x7c\xee\xc0\x13\x91\x5d\xfc\x2b\xef\x4b\x0e\xb0\x9f\xef\x64\xec\xa9\x77\x1f\x5b\x81\x9f\xfa\x91\xd5\x2b\xa8\xcc\xa4\x2b\x5b\xb9\xd4\x9d\x29\x8c\x2c\x23\xee\x95\xe5\xa8\xa0\x02\x61\x50\x41\xf8\x8a\x2d\x49\x12\x1c\xd8\xb3\xcc\x18\x6f\x1e\x67\xb6\x57\x9a\xa3\xf7\xe8\x86\x37\x3a\x47\x6b\x14\x39\xd4\xb0\xb8\xef\x1e\xa0\x0c\xc5\x7c\x1c\x18\xcb\x85\x51\x9b\x5b\x19\x85\x08\xba\xba\x02\xc1\xbb\xbb\x63\xca\x86\x17\xe2\xde\xb7\xf8\xf7\x00\x0a\x76\xb2\x1e\x84\x44\x66\xbd\xb6\x74\xf3\x60\xc1\xab\x97\xa9\x53\xe7\xcd\xed\xce\xc1\x2d\x67\xa3\x5d\x9b\x86\xba\x8f\x2c\x18\xeb\x22\xec\xe5\xbb\x7b\x7d\xf3\x7f\xce\x8a\x2c\xae\x46\x68\xa0\xf9\x88\x74\xc5\x9a\x49\x92\x50\x6c\x0a\x00\x06\x75\x02\xc5\xef\x78\x65\xb7\xfc\x6a\x10\xc4\xf2\x70\xee\x7e\xbd\x0e\xf0\xda\xc2\x35\x80\x12\xa5\xb0\x0e\x5f\x1e\xc3\xe4\x7c\xbf\xec\x30\xa2\x0c\xe0\x7c\x14\xc8\xa3\xbc\xe8\x8c\x5b\x86\x82\xbe\x54\x39\x0b\x94\x06\x1a\x1b\xbe\x09\x5d\x21\xce\x39\x1f\x35\x3c\xc4\xf7\x39\xc7\x50\x22\xe6\x63\x8f\xd2\xf3\x71\x49\x81\xda\x59\x52\xd5\x1d\xfc\xb0\x94\x17\xed\xd1\x2e\xa5\xe4\x00\x5f\x86\x37\xab\xc1\x03\x9d\x31\xa4\xf5\xf9\xa3\x69\x0d\x91\x2e\x12\xa4\x3d\xb7\x0e\xbe\x7a\x8d\xf9\xee\x58\xe2\x22\x36\xe4\x92\x9e\x20\x68\x45\x34\x8b\x46\x1b\x8f\x87\xe7\x61\xb9\x56\xb6\xe6\x5a\xcb\x72\x72\x3a\xbe\x7b\xe1\x41\x78\x7f\x38\x38\xd7\x4a\xbd\x8c\x30\x9a\x9f\x83\xd1\xb0\x10\xde\xb9\x56\xaa\xab\xea\xf9\x07\xbe\xf9\x30\xe0\x5f\xac\xb4\x55\x9b\xa1\xaa\x84\xd6\x0a\x3a\xa7\x15\x76\xba\xb1\xa4\x83\x68\x75\xc7\x46\x0e\x7b\xd3\xfc\xc7\x8b\x25\xb7\x9f\x35\x07\x28\xbf\x15\x86\x92\xf7\x26\xa0\xf5\xff\x57\x5c\x10\x1a\xb4\x5c\x8f\xec\xfd\x32\x70\x2c\x17\x1d\x8c\x34\xc1\xec\xf6\xc3\x49\xe1\x0a\x4a\xcc\xc9\x22\x19\x36\xcc\xde\xcf\xba\x93\x44\x6c\x4e\xa4\x7a\x74\xf9\x2d\x80\x7c\x93\x0a\x5b\xc5\x8f\x3b\xff\x1b\x71\x2b\xfb\x88\x28\x94\xed\x95\xce\x5a\x6c\x77\x0c\x7a\x31\xf1\xf6\xb5\x72\x1a\x3a\x49\x25\xd7\x1a\x5f\x77\x4a\x59\x2a\xc9\x3b\x24\xbf\x05\xfd\x13\xb5\x5f\x1b\xe4\xf3\x90\xce\x58\x3d\xa5\x97\x95\xc0\x9e\xba\x82\x15\x11\x8a\x05\x15\x00\xa2\xe3\xc7\x64\x4c\x20\x24\x0d\xd1\xbc\xe8\x4a\x2f\x6b\x92\x51\x41\x6e\xc4\xac\x1c\x9f\x2f\xbd\xd4\x10\x6e\xcd\x59\x3f\xeb\x62\xe2\x60\x5d\xa5\x61\xee\x05\xf6\xd9\xc6\xe6\x74\x55\xf3\x3f\x09\xe3\x71\xec\x48\x89\x6d\x9a\x0f\x48\x8d\x4a\x1d\xd0\xc9\x17\x9c\xfd\xad\xb9\x80\x6a\x73\x92\x7a\xdb\x0d\x8f\x96\x24\xea\x42\x59\x8c\x55\x40\xb6\x37\x0f\xb2\x05\x41\x3f\xd9\x43\x3a\x86\x3b\x3c\x24\x75\x06\x5a\xa3\xa5\x7f\x6b\xbf\x92\x48\x7d\xa3\x0f\x23\x01\x6a\xf2\x75\x38\xba\xfc\x6b\xf0\x92\x09\xf7\x26\x86\x99\x00\x2e\x56\xb6\xde\xb4\xb7\xc4\x8d\x42\xb0\x1b\x57\xe9\x96\xaf\x49\x82\x70\x74\x3a\x55\x8e\xb8\x47\x49\x37\x50\xbf\x9a\x5f\xf3\x62\x01\xb5\xfc\x1a\xe3\x8c\x93\x55\x83\xdf\x2a\x91\xf8\x39\x13\x98\xbb\xcb\x74\x21\x2b\x4e\x64\x8a\x85\x5e\x2f\x5e\x7d\xe5\x5a\x61\x2b\x3f\x03\x70\xba\x59\xae\xfe\xf8\x9a\x99\xe8\xe2\xd5\x9f\x5c\xa3\xa9\xa8\x18\x94\x37\x95\xac\x96\xb5\xf9\xaa\xaf\x19\xf6\xe5\x62\xdc\x7d\x39\x1c\x05\x7c\x48\xfd\x66\xf0\xf1\xbf\xc8\x14\x74\x20\xe8\x10\x78\xf9\xbd\xa5\xab\x5e\x3a\xd7\x68\x52\x2f\xb2\x78\x99\xbc\x07\x5f\x86\x43\xb9\x58\xfc\x1d\xcd\x07\x83\xbd\xd7\x30\xe4\xa9\x70\x83\x91\x92\x54\x86\x5b\x33\x02\x0d\x30\xce\x86\xa3\x6c\x60\x47\x08\x6a\xa7\x36\xbd\xf5\x6d\x34\x20\xef\xcf\xab\x17\xfb\x5e\x70\xf3\xb8\xd0\xba\xea\xaf\x7a\x26\x18\x29\x39\x11\x6e\xdd\x9f\x27\x38\x81\xe7\x32\x0f\x9f\x50\x30\x51\xed\x41\x3d\x9f\xfd\x19\x58\x84\x38\x4d\xb9\x1a\x9d\xfb\x86\x23\x9d\xcf\x0f\x2f\xfb\xd9\x78\x37\x3a\xb4\x85\xaa\x08\xf6\x9c\x16\x5f\x8e\x3b\x83\x62\x87\x0b\x08\x5c\x8e\x1d\xb9\x93\x8f\x9f\x9e\xab\x7b\xab\xe1\x8b\xc3\x59\xf0\x11\x61\x89\xdb\xb2\xb3\x1b\x3d\x52\x5d\x3b\x43\xaf\x13\xdf\x29\xbe\xc3\x1f\xcb\x23\x4d\xbd\xe7\x0b\xaf\x6b\x54\x00\x55\xe3\xda\x84\x12\xd0\x79\x85\x5c\x72\xcf\x9c\xc2\xfb\x09\xb2\x41\x47\xab\xbb\xce\x83\x1b\x0a\xa2\x51\x1e\x1a\x2e\x25\x65\x70\x61\x39\x1c\xf6\xaf\x35\x3a\xbb\x0a\xa7\xcc\x1b\x3b\xe3\xe1\x3e\x66\xd4\x15\xb7\xd8\x06\xff\x63\x86\xce\x38\xaf\x14\x97\x2f\x16\xcd\x57\x50\xe0\x45\xd5\xe4\x19\x6c\xb2\xf1\xca\x3e\xfd\x4c\xca\x5d\xd4\x6a\x9b\x1f\xf7\xb8\x2d\xb1\x0d\xaf\xf4\xb8\x0d\xaa\xe6\x1b\xaf\xdc\x54\x23\xa1\x7b\x99\x61\x51\x60\x24\x43\x00\x65\xac\x19\xca\xd5\x1f\x35\x5e\xb9\xc5\x3f\x3d\x24\xef\x5c\xd4\xfd\x14\x99\xe1\xff\x7a\x66\x3d\x70\x76\x4d\x38\xa7\x9e\xbf\x2c\xc3\xeb\xe4\x03\xf0\xc3\xf3\x9a\xa8\x25\xce\x1b\x7b\xc3\xc9\x38\x18\x01\x17\x8b\xe1\xa6\xb7\x82\x8e\x98\x1a\xaf\x71\x33\xcb\xae\x27\x26\x95\x1d\x20\x83\x55\xee\x45\x73\xf2\x56\xcc\xc0\xb7\xb2\x4e\x30\xa7\xda\xd6\xbc\x31\xee\xdc\x6c\xcb\xd6\x82\xed\xc0\x27\xd9\x92\xb7\x8d\xc6\xd5\xde\x78\x38\xfa\xc0\x88\x04\xd7\x1a\xbd\x6c\xa7\x33\xe9\x43\x08\x7c\xc1\x41\xd4\xa0\x40\x6e\x06\x2e\xff\x51\x98\x3f\xb9\x4c\x48\x46\x05\x17\x13\x40\xcc\xe3\x1d\x72\x78\xf8\x14\x61\xed\xc4\x8e\xe2\x38\x3d\x64\x50\x98\xc7\x92\xec\x1d\x4b\xce\x04\x01\x83\x5a\x37\x4e\xae\x04\xd3\xce\x07\xa3\x89\x58\x9a\x93\x8a\x4c\xaf\x9f\x3f\x32\x6b\x97\x0f\xac\xf3\xa8\x04\x98\x90\x0b\x48\xab\x81\x86\x6f\xa8\x62\xb7\x0d\x02\xc5\xb7\xa1\x75\xc1\x95\x06\x6c\xbe\xf8\x8f\xff\x88\x12\x69\xfe\x41\xf6\x4f\xff\xd4\x7c\xfb\x67\xe4\x60\x8b\x6c\xfc\x1c\x8d\xae\x87\xec\x71\xe0\x49\xab\xcc\x71\x68\xb3\x85\x19\xc8\xc8\xb8\xff\xd5\x1b\x0b\x2a\xd7\x60\x1e\x41\x0a\xa2\x09\xf2\x08\xba\x82\x7f\x8d\xff\x3f\x00\x00\xff\xff\x22\xf4\x77\xd8\x4e\x4f\x01\x00") - -func confLocaleLocale_bgBgIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_bgBgIni, - "conf/locale/locale_bg-BG.ini", - ) -} - -func confLocaleLocale_bgBgIni() (*asset, error) { - bytes, err := confLocaleLocale_bgBgIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_bg-BG.ini", size: 85838, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_csCzIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\xbd\x4b\x6f\x1c\x47\x96\x30\xba\xcf\x5f\x91\xd6\x40\xb0\x0d\x50\x65\xb8\xfb\xbb\x0f\x18\x2e\xfb\xca\x92\xdd\xb2\x65\x51\xbc\xa6\xac\xb9\x90\x21\x94\xa3\x2a\x83\xac\x64\x65\x66\x54\xe7\xa3\xe4\xaa\xc1\xec\x7b\xd1\x46\x6f\x6f\xb7\x36\x1f\x17\xbd\xe0\x42\xf0\xa2\x77\x0d\xc8\x1b\x92\x7f\xe4\xfe\x92\x7b\x5e\xf1\xca\xcc\xa2\xe8\xe9\xf9\x06\xd3\x16\x2b\x32\xde\x71\xe2\xbc\xe2\x3c\xd4\x7a\x3d\xcb\x74\xb3\x98\x7e\xa1\x77\x73\x53\xe8\xa6\xad\x2e\xcf\xd3\xc6\x74\xab\xda\x94\xf0\xd7\x1f\xf2\x36\x6d\x8a\xee\xfa\xd7\xb9\x4a\x92\xa5\x29\xf5\xf4\xa1\x29\xaf\x7f\x49\x32\xd5\x2c\xe7\x46\xd5\xd9\xf4\xe8\xfa\xaf\x7a\x59\xe8\x2c\xd1\x3f\xad\x0b\x53\xeb\xe9\x51\x6d\x16\xcb\xcb\xf3\x9d\x6e\x93\xa5\x2e\xd6\xd3\xc3\xcb\xf3\xb5\xd9\x5c\xbd\xce\x54\xd2\xe4\xa7\xd5\x2c\xaf\xb0\x4d\xbe\x2c\x2e\xcf\x1b\xec\x5d\x73\xb1\xe9\xda\xe9\xd3\xac\x5f\xda\xad\xa7\xdf\xe9\xd3\xbc\x69\x6b\xb3\x51\x54\x5c\xd3\x4f\x5d\xf7\xcb\x5f\xe9\x39\x34\xd4\xd3\x7f\xd7\x73\xb3\xb9\xbc\x48\xe1\xd3\xe5\x79\xb5\xda\x26\x1b\x5d\x37\xb9\xa9\xa6\xcf\x75\xbd\xd3\xc9\x5a\x9d\xea\xe9\x71\x5b\xab\x4a\x25\xad\x2e\xd7\x85\x82\x36\xd7\xff\x53\xcd\x0b\x03\x25\x85\xaa\x4e\x3b\xac\xf1\x8d\xda\x6d\x57\xc9\xa2\xd6\xf0\x79\x56\xe9\x57\xd3\xe7\xdb\xd6\xc0\xac\xdb\xc9\x64\x92\x74\x8d\xae\x67\xeb\xda\x9c\xe4\x85\x9e\xa9\x2a\x9b\x95\xb8\xee\xef\xaf\x7f\xcd\x61\x2e\xba\x68\x56\x97\x6f\x53\xfe\x9c\xaa\x34\x53\xc5\xf5\xf9\xe5\x1b\x5a\x8e\xce\x60\xf5\x33\xd5\xb8\x0d\xb8\x3e\xd7\x55\x7a\xa6\x56\x26\xa1\x4e\x2b\x55\xc6\xfd\x5c\xa4\x67\xe5\xe5\x45\x65\x12\x5d\xaa\xbc\x98\x7e\x79\xef\x09\xfc\x03\x6b\x68\x9a\x57\x06\xf6\xfe\x91\x6e\x0a\x03\x3b\x32\x6b\xb7\x6b\x3d\x7d\x51\x99\x4d\x97\xee\x54\xa6\xda\x64\xa1\xd6\xed\x62\xa9\xa6\x0f\xee\x1f\x3d\x7b\xf0\xe8\x7e\x02\x95\xd6\x06\xf6\xc7\xd4\x5b\xd8\xb8\xb5\xd9\xe5\x2d\x8c\xfe\xd7\xc4\xd4\xa7\xaa\xca\x77\xaa\xc5\x1d\x7a\x2a\x3f\x16\x3a\x29\xf3\xba\x36\xf5\xf4\x45\xbd\x50\x19\x0c\x01\x3b\x30\xc3\x1e\xa6\x87\xb0\xb7\x6f\xd3\x3a\xe8\x01\x3f\x95\xf9\x69\x8d\xfb\x88\x5f\xcf\x53\xfa\x05\x7d\xf0\x17\xea\xe7\x90\x8e\x64\x17\xf4\x76\x62\xea\x55\xd0\x5b\xc3\xbd\xa5\xb5\xd9\x5d\x9f\xb7\x57\xaf\xd7\xba\x82\x3d\xc3\x8a\x30\x43\xe9\xd7\x04\xd3\x83\xe3\x3b\xd5\xf4\xed\x78\x5d\xab\x0d\x01\x41\xf0\x5d\x65\x25\x6c\xf4\x5a\x55\xba\x98\x1e\xe1\x7f\xd3\x66\x0d\xe0\xb0\xc1\x4f\x8b\x85\xe9\xaa\x76\xd6\xe8\xb6\xcd\xab\xd3\x66\x7a\xa8\x9a\x56\x6d\x70\xbc\xf4\xf2\x9f\x57\x3f\xb7\x5d\x32\xf2\x29\xd9\x9a\xce\x9d\xf9\xf4\x39\x9e\x9c\x1c\x31\x7f\x71\x4d\x9e\x2b\x38\xd3\xb4\xf2\x0d\x61\xc0\x36\xdf\xe4\x6d\xae\x9b\xe9\xfd\x15\xfd\xb9\x4d\xd6\x5d\x51\xc0\x86\xfe\xb1\x83\x0b\x07\xd0\x60\xae\x7f\x85\x53\xdb\xe8\x15\x34\x84\xff\x6f\xd5\xf5\xaf\xd4\x36\x6f\x1a\xa8\x31\xbd\xfc\xdb\xca\x14\xdb\x04\x0e\xb5\x5a\xc0\x82\x5e\xd4\xdd\xf5\x79\xde\x26\xc9\x0f\x79\x05\xc3\x14\xc5\xcb\x44\xfe\x98\x7e\x4d\xff\xe2\x0e\xb4\x79\x0b\x13\x7d\x5c\x9b\xd5\x36\xcd\x6d\x29\x4e\x19\xfe\xb7\xc1\xb5\xce\xaf\x5e\x2f\x93\xcc\x2c\x56\x00\xcb\x78\x4f\xe1\x46\x1d\xaf\x0d\xf4\xdc\x5e\xbe\x69\xf5\xbd\x22\x4f\xff\x60\x4e\x9b\xb4\xdb\x54\x79\x0b\x07\xf3\x90\x6a\x76\x07\xe9\x1a\xee\x3b\xec\xd2\xd5\xeb\x56\xa7\x4d\x8e\x3d\x36\x97\x6f\xca\x74\x0d\x85\x45\x0e\xd7\x3c\xfd\x54\xa5\xad\xaa\x4f\x75\x3b\xbd\x33\x9b\xc3\x85\x5a\xdd\x49\x97\xb5\x3e\x99\xde\xb9\xdb\xdc\xf9\x0c\xb0\xcb\xc6\x64\x9f\x7e\xa4\x3e\x3b\x48\x2b\x7d\xfd\x6b\x5a\x5d\xbd\x5e\x98\x74\x57\x5e\xbd\xae\x70\x5c\xdc\x80\xf6\xf2\xa2\x35\x72\x7f\x17\xfa\xbd\x04\xf7\x09\x6e\xf6\x2c\x9b\x33\xaa\xa2\x79\x6d\xb6\xb8\x67\xdd\x99\x4e\x9f\x6c\x8f\xff\xef\x6f\x0f\xd2\x23\xd3\xb4\xa7\xb5\xa6\xbf\xe1\x3f\xd0\xe0\xf7\x30\xc2\xdc\xa4\xcf\xf2\x87\x5f\x4c\x12\x68\xcc\x5b\x12\x1c\x37\x5c\x14\x35\x47\x4c\x45\x5f\xf1\x0a\x3d\xdb\xae\x83\xd2\x25\x74\x39\x7d\x04\xff\x81\xce\x0a\xba\xa0\xfe\x72\xf6\x2f\x21\xf4\x40\xb7\xf7\x10\x5b\x6e\xe2\xae\x65\x7b\x8f\x78\xab\xf4\x01\x1d\x03\x4d\x3b\xc5\x1d\xff\x35\x3f\x83\x85\x7f\x7d\x78\xf8\xf4\xe1\x17\xa9\xae\x4e\xf3\x0a\x76\x56\xa7\xbb\x0a\xf0\xc2\xc6\x74\x69\xa3\x32\xf8\x6f\xd7\x9e\xfc\x9f\xb3\x53\x5d\xe9\x5a\x15\xb3\x45\x3e\x49\x9a\xa6\x00\xc4\x93\x01\x36\x3b\xfe\x36\x7d\x72\xf9\x8f\x0c\xa6\xd4\x2e\xa7\x0f\x00\xa4\x00\xd3\xfe\xb1\xc0\x2d\x93\x91\xa9\x2c\x5d\x21\x5e\x9f\x9b\x1a\x7a\x1c\xee\x90\x9b\xf1\xe5\x9b\xc9\xa7\xf3\xfa\xb3\x60\xb2\x6e\x8a\x6a\xde\x98\xa2\x6b\x71\xeb\x16\xd0\x23\x00\xc3\x2a\x83\x63\x80\xa3\x52\x75\x0b\x47\x81\x10\x41\xb4\xa2\x9b\x24\xba\xae\x67\x80\x5e\xdb\x2d\x1e\x9b\x9b\xd8\x16\x26\x61\x07\xc2\xbb\x5f\xca\x94\xae\x7f\x29\x47\xa6\x54\xe9\xd2\x2c\x61\xe9\xf3\xcb\xb7\x6d\x8a\xf7\x77\x97\x55\x97\x17\xdc\x77\x5e\x6d\x54\x91\x67\x70\xa8\xfb\x76\xde\xf5\x71\xfd\x0b\x5c\xa7\xd4\xcc\x1b\xb5\x24\x3c\x81\x1b\xbb\x4d\xef\x4c\xee\x00\x76\xbe\x73\xef\xce\x24\xa9\xcc\x8c\x11\x06\xe2\xf2\x2c\x6f\x80\x18\xe8\x19\xd3\x99\x9a\x31\xe3\xa1\xf4\x02\x2b\xdc\x6c\xd7\x15\xd0\xaa\xd4\x7e\x5f\xe4\x8c\x36\xae\x7f\x49\xe7\x7a\x07\x9f\xdb\x0d\x10\x8a\x00\x9d\x38\xd4\x13\x6e\x8a\x45\x50\x21\x0c\xb9\x8a\x7e\xd2\xfd\x95\x27\x16\x00\x18\x96\x9f\xce\xf5\x02\xca\x03\x74\x93\xaa\x75\x91\xaf\x08\x05\x02\x65\x0f\xf7\x65\xf0\xc1\x02\xc7\x8b\x4c\x23\xd1\xd0\x78\xc2\x15\xd7\xdd\x28\x24\x59\x01\x42\x4d\x37\xba\x58\xe1\x71\xc1\xed\xec\xae\x7e\xae\xf0\xcf\xf5\xe5\x9b\xa6\xd4\xe5\x7b\x44\x5a\xf8\x88\x1f\xd3\xca\x09\xa9\xab\xac\xd6\x0d\xa3\x74\x8f\xde\x81\x71\x70\x95\xed\xf0\xcf\x01\x5f\x2e\x96\xd5\x36\xdd\xec\xb2\xcb\xf3\x42\xe3\x7a\x82\x26\x1a\x59\x10\x00\x81\x8e\xee\x40\x61\x10\x33\x6e\xd3\xcc\xa4\x2d\x80\x06\xa0\x09\x37\x0e\x6c\x6f\xdd\x01\xc3\x80\xb7\xf4\xf2\x6f\x57\x3f\xeb\x96\xae\x59\xc3\x38\x8d\xd0\x8b\xab\x60\xc7\x7e\xa6\x2b\xe8\xa2\xb3\x77\x3a\x2d\x3b\x80\xf9\xb4\x04\x44\x84\x68\x0e\xd6\xd7\x76\x6b\x1c\x6b\x65\xd7\x75\xb1\x0c\x47\x8c\x97\x06\x7b\x43\xe7\x87\x63\x76\x88\x33\x08\x81\x02\xe6\x31\x40\xbb\x2b\xe4\x9b\x80\x92\x2b\xf9\xe9\x66\x80\x6b\x30\x1b\xc0\x9c\xd7\x7f\x42\x64\xf6\xfd\x77\xdf\xa6\x2b\x60\x45\xa0\xbb\x66\x05\xfc\x4a\x7a\x7c\xfc\x08\xaf\xfa\x72\xb6\x36\x75\x0b\x94\xa2\x6e\xb1\xc8\x95\xd8\x7e\xae\xfe\x0c\xb3\x05\x10\xc2\x32\xbc\x97\xc0\x20\xc1\x3e\xd2\xd5\xbd\x7c\x83\xc4\x73\x43\x24\x0b\x9a\x02\x6a\xa9\x81\x25\x9a\xa4\x87\xb0\xed\x70\xe4\x67\xfa\xcc\x43\x18\x6d\x19\x42\x78\x07\x54\x20\x68\x8e\x90\x45\x33\x59\xb6\xed\x3a\x98\xca\xa3\x67\xcf\x8e\x7c\xd9\x9e\xc9\x00\x4a\xe7\xf9\x94\x0e\x08\x11\x62\x0b\xd3\x21\x9f\x38\x21\x80\xec\xea\x62\x8a\x6b\x8f\xa0\x14\x0a\x6f\xbd\x4f\x38\x93\x8f\xf0\x3f\xc7\x70\x0e\x26\x5b\xa9\x1d\x7c\xda\xa4\xfa\x1e\x32\x4e\xb0\xd2\x49\x52\x98\xd3\x59\x6d\x4c\xcb\xa0\x7a\xdf\xc1\x27\x94\x03\x5c\x46\x5f\xed\xa8\xae\x12\xec\xa8\x2a\x11\x29\x33\x1c\xee\xd4\x3a\x6f\x08\x97\x40\xb3\x2d\x5c\x4b\xb3\x46\x34\xe1\xee\xe5\x43\x03\x58\x48\xe3\x3d\x39\x0f\x59\x01\x62\xe2\x86\x64\x88\xe7\xc8\x4c\x2b\xa1\xcf\x6d\xd2\x94\xb0\xa5\x44\x7e\x8e\xe9\xb4\xd2\xe3\x27\xb0\xd1\x54\x7a\x02\x8c\x39\x30\xca\xfe\x87\x9d\xec\x97\xb6\x9b\x73\x06\x51\x00\x47\x93\x15\x3a\xfd\xee\xab\x07\xe9\xff\xf6\xfb\xdf\xfd\x6e\x92\x3e\x09\x90\x0a\xdc\x78\x38\x56\xac\xd3\xc1\xee\xe9\x41\x5b\xc2\xc2\xf2\xf7\x46\xa7\xc0\xae\x81\x38\x00\x17\xf1\xc7\x3b\x87\x80\x3b\xee\xa4\x9f\xd2\x62\xfe\xaf\x75\x9d\xaf\x0a\x95\x4d\x16\xbb\xcf\xee\xfc\x38\x49\x68\xb3\x6b\xbe\x84\xc3\xf9\x00\xb1\x82\xfb\x85\x1c\x77\xa1\x6d\xd5\x01\x2f\xcb\xdc\xfd\x6c\x61\xaa\x93\xbc\x2e\x01\xcc\x36\x06\x48\x19\xcc\xb3\xdd\xc0\x39\xe3\x7e\x39\xcc\xcb\x9d\xcc\x2a\xd3\xe6\x27\x5b\x57\xb3\x03\xde\xd4\xd4\x15\xdd\x78\x7b\xfe\x65\xc2\x50\x3f\xc3\x7f\xf2\x85\x1e\x1e\x02\x7f\xef\x10\x78\xa0\x0c\x69\xdc\x62\xc9\xc7\xa1\xe7\x89\x39\x39\x29\x80\x2a\x33\xb9\x7d\xa1\x2c\x01\x00\xbc\x51\xa6\xf2\x2d\xaa\x03\xb7\x61\x0d\x92\xcb\x73\x21\x15\xb0\xe8\xeb\xbf\x03\x1e\xa9\x01\x75\x1a\xb9\x4d\x44\x8e\xba\xf4\x83\x07\x0f\x0f\x3f\x4c\x73\x80\x54\xb8\x79\x59\xb7\x42\x98\x01\x6e\x8a\xfb\x86\xbb\xb3\x41\x6e\x12\x80\x8e\xe8\x57\x81\xf7\x11\xf0\x10\x62\x28\x10\xd4\xae\x5e\x03\x72\x11\x6a\x05\x1c\x37\x80\xa3\xaa\xfd\x98\x4c\x88\xd3\x3f\xc8\x87\x41\xcd\xfe\x1c\x7b\xf5\x83\x8d\x48\x77\x59\x6d\xce\xf4\x24\x75\xa8\x3a\x5f\x19\xf8\xaf\xc3\x9b\x48\xfa\xe8\x5e\x54\x6a\x89\x4c\x5b\xf0\x29\x67\x40\x02\x8a\xb0\x58\x1a\xe4\x2d\x92\x13\x9d\x69\x14\x16\xb2\x99\xcc\xa3\x30\x66\x05\x13\xf9\xb2\xc2\xe9\xa5\x5f\xd9\xcf\xe9\x7d\xfa\xdc\xa4\xdf\xd2\xf7\x7d\xed\x64\x19\xd2\xda\x55\x4a\x95\xb4\xe6\x5a\x29\xa2\xf9\x26\xfc\x6e\x40\xc2\x40\xe6\xa3\x5e\xe8\x54\x80\x22\x9d\xab\x06\xbf\x54\x69\x91\xcf\x65\x1b\xfc\x0e\x47\xfc\x80\xdd\xb5\x12\xe8\x51\x05\xfb\x44\xfc\x9a\xaa\xbd\x44\x3a\xda\xac\xb7\xe5\xae\xb1\x07\xe8\x03\xb9\x8f\x8e\x13\x10\x3e\x40\xb8\x0a\x80\x6e\xe2\x29\x00\xe5\x68\x5a\xf0\xcc\xca\x79\x16\xf8\xed\x31\x5a\xb9\x2f\xae\xe6\x26\x80\xbc\x33\x0b\xce\x34\x10\x80\x12\xc9\x8d\x40\xd7\xd3\x56\xff\xd4\xda\xe6\x48\x05\xf3\x80\xd3\x99\x30\x2f\x0e\x02\xa7\x48\xf2\xb3\x4d\x0e\xb2\xb1\xbd\x11\x40\x35\x68\x3d\xeb\x40\xba\x45\x32\x02\x34\x65\x67\x60\x47\xf9\xfa\x32\x63\xaf\x57\xa3\x7d\xc9\x0c\x8f\x45\x78\xb7\xf8\x56\x5a\x6f\x65\x7b\xa2\x01\x80\x15\x09\x20\xb1\x3c\xf0\x70\x8b\xc2\x06\xd1\x7e\x14\x78\x80\x4f\xeb\x36\x79\xc6\x64\xcd\xf5\x01\x8c\x0e\xec\xc3\x02\x19\x27\xb7\x4e\xba\x83\x84\xf1\x3a\x1c\xe3\xaf\x13\x11\x27\x45\xc6\x63\x21\x04\x38\x42\x64\x16\x80\x80\x02\xa2\xff\x4b\xba\x04\xd9\x9e\x4e\x89\x19\x03\x7b\x7e\x42\x89\xdf\x82\xfc\x96\x6f\x02\x46\xa3\x49\xbf\x7e\x38\xfd\x18\x50\x02\x4c\x15\xb8\x7d\xd5\xb5\xc0\x15\xb4\xf9\x02\x56\x2c\x4d\xcd\x86\xd5\x08\x96\x0d\xb1\x93\x18\x20\xae\x1e\x93\x29\xd5\xf6\x6b\x12\xc6\x38\xcf\x44\xb0\xad\x2f\x3e\x42\x74\x9b\x01\x40\x2d\xe9\x3b\x37\xb2\x4a\x88\x3e\x5e\x77\x63\x8b\x18\x3a\x3b\x35\x24\x3c\xf3\x4f\x82\x33\x64\x85\x92\x16\x24\x80\xd9\x69\xde\xce\x4e\x10\x27\x67\xd3\x07\xcb\xed\x5c\x31\x8c\xe1\xa7\x8e\x57\x0b\xa4\xbb\x4b\xdf\x87\x6a\xef\x7f\x92\xde\xdd\x88\x24\xf3\x7b\xc4\xf2\x78\xf3\xf3\x02\x01\x5a\xc4\xec\x0d\xaa\x74\x60\xdb\x33\xc6\xa9\x24\x18\x56\xc0\x93\x65\xc0\x79\x20\x97\x20\x22\xc5\x81\x95\x52\xe1\x60\x80\x59\x5b\x56\x56\x78\x05\xf9\x7d\x91\x03\xd3\x49\xf2\x70\x0e\xe0\x52\xd3\x5f\xaa\xb8\x7c\x03\x0c\xe4\x2a\xdd\xa5\x77\x1b\x94\x53\xd3\x53\x33\xef\xf2\x22\xa3\x01\xe1\x16\x58\xe1\x03\x44\x0f\x01\x8a\x51\xb1\x12\x5a\x12\xc0\xf3\x1d\xbb\xbc\xa0\xf5\xd8\xb6\xb7\xe7\x9a\xfb\xfd\xbc\xa5\x7e\x1c\x2f\x8b\x1b\x03\xc0\xb3\x58\xfa\xf3\x16\xce\xd7\x31\xbe\xd2\x81\x5a\xb5\x9d\xac\xd6\x81\x22\xf4\xd5\xa4\xf7\x3e\x83\xff\x26\x0d\xcc\x9f\xe9\xee\xa9\x3d\xa1\xef\x99\xe1\x86\x06\x2b\x2a\xef\x10\x49\x21\xb2\xab\xf4\x2e\x53\x70\x70\x85\x89\x16\x15\x5d\x94\x1b\xa0\x74\xcf\xce\x30\xf4\x34\xdd\x02\xc4\xcb\x66\xfa\x1c\xaf\x17\x48\x25\xef\xa5\xdf\x80\xa0\x91\x42\xd5\x2c\x3f\x48\x11\x1d\x9e\x35\x7c\x7e\x9b\x2d\xe0\x05\xd1\x54\x4c\xd2\x2f\xd4\xa6\xa5\xc9\x01\xe9\x82\x8d\x05\x08\xa0\x9f\xfe\xb8\x62\x0e\x70\x74\xdb\x89\x19\x1c\xdd\xef\xe4\x07\x54\x7f\xbe\x4c\x3a\x96\x9d\x4c\x91\x85\xea\x80\xe0\x86\x31\xc5\x1b\x70\x54\x4e\x61\x60\xdb\xf2\xcd\x6b\x5e\xe5\x70\x74\x33\xa7\x4f\xc5\x03\x40\x14\x4c\x7a\x55\x46\xab\x2b\x2e\x21\xcd\x0b\x6a\x5a\xbb\xa4\xdc\x12\xf8\x34\xd3\x27\x3d\x61\x29\x69\x96\xe6\x15\xa9\x23\xa5\xc2\x0b\xc2\x9c\x70\x8f\x37\x80\x01\x7b\x02\x0b\xaa\x32\x17\xa6\x80\x0b\x65\x90\x3e\x6d\x6c\x9b\xe3\xb5\x29\x88\x79\xed\xf5\x0d\xa3\x82\x44\xc8\x83\x86\xba\xb8\xad\x68\xf9\xf0\xcb\xb9\x28\xf9\x54\x42\xd8\x9c\x34\xc6\x6e\x0e\x00\x63\xa2\xd2\x9a\x00\x94\x90\xde\x8c\x47\x7c\xae\x49\xe4\xcc\x81\xe5\x0a\x46\x44\x16\x0c\xb6\x5d\xf4\xca\x2f\x59\x85\x49\xda\x4b\x37\x25\xbc\x00\x8d\x3f\x85\xcb\x0b\xe0\xf3\x54\x0d\x57\xe1\xf9\x16\x77\x4a\xa1\x92\x0c\x90\xeb\xf2\x65\xa0\xca\x9d\x89\x06\x10\x55\xba\x42\x54\x19\x0a\x10\x46\x75\xeb\x59\xd0\xa5\x5e\x23\x87\x5a\x36\xa7\xd3\x6f\xf2\xeb\x5f\x53\x64\x80\xb5\xd4\xfa\x3c\x3d\xb2\xf4\x83\x80\xec\xbd\xa4\x31\x8b\x5c\x15\xb3\xdf\xd0\x7a\x6d\xce\xa4\x6d\xcc\x2c\xb0\x72\xb9\x5c\xb7\xd3\xa7\x25\xb0\x7c\x00\x42\x88\xb8\x80\x96\xa8\x42\x07\xbc\x02\xdc\x02\x20\x8d\x2c\xac\x6d\x27\xa9\x57\xd8\x34\xb6\x63\x77\xdd\x40\x74\xd9\x02\xe6\xbb\x28\xbb\x3e\x3f\x83\x33\x44\xa4\xde\x1b\x89\xb9\x6d\xa1\x8c\x31\x5d\x64\xc0\x06\xca\xbc\x85\xff\xd8\xd1\x61\xd3\x4a\x5d\xce\xb1\x37\x62\x90\x15\x20\x24\xe6\x2f\xf2\xb4\x04\xe6\x18\x88\xe9\x29\xdd\x3b\x21\x2f\x50\x05\x20\x03\xa5\xcc\x0b\xa1\x30\x58\x43\xf7\x6b\x00\xa2\x86\xdb\x4d\xb7\x9d\x6a\x7d\x6e\x1f\x05\x00\xe9\xbd\x42\x1a\x05\x30\x30\x67\xc5\x93\xdd\xd8\x17\x96\x0b\x73\xb7\x5f\x68\x1b\x73\x60\x24\x30\x34\x20\xf6\xdb\x2d\x66\x15\x74\xb4\x5e\x5e\x21\x2e\x10\x98\xa2\x06\x58\x80\x0a\x45\xd8\x4f\xe7\x9f\xdd\x6d\x3e\xfd\x68\xfe\x99\xa7\x26\x07\xe9\x0e\xef\x66\x6d\x0a\x1e\x2c\x67\x28\x16\x4e\x1f\x70\x0b\x50\x34\x73\x8d\x52\x13\x2a\x5b\xe1\x14\x80\xc2\x34\x78\x81\xcf\x00\xb4\x61\xa0\xbb\x59\xba\x34\x59\x5e\x11\xba\xce\x0c\xf4\x85\xad\xfa\x3b\xbe\x44\x95\xad\x01\x8c\x08\x87\x47\xba\x64\xcd\x57\xc7\x82\x31\x29\x95\xdd\x04\x48\xcc\x17\x48\x86\x66\xcb\x7c\x0e\xf4\x16\xb0\x5a\xf0\xea\x22\x6c\xd9\x4e\xad\x50\xdd\x77\x0e\x3c\x41\x5c\x91\x19\x1c\xa2\xb0\x65\x67\x31\xf7\x99\x0e\x1a\x20\x6c\xad\xfd\x1b\xce\x01\xa1\x28\xa4\x2e\x38\x0b\xab\x11\x76\xb8\xfe\x95\x46\x85\x20\xe0\x40\xdc\xf6\x22\x2f\xf3\xf6\x06\xf8\x46\x24\x97\xa5\x8b\x25\xe0\x2b\xa0\xc2\x7c\xf6\xb0\x89\xbf\x02\xf2\x57\x45\x6a\x90\x86\xc1\x5d\x0f\x41\x31\x04\xfd\xb5\xb9\xfa\x79\x45\x9a\xac\xdf\xa7\x40\x89\x00\x34\x51\x2b\xa3\x56\xc8\xff\xef\x56\x1d\x76\xb6\xc3\x57\x92\x49\xb2\x54\xcd\xac\xab\x04\x36\x40\xa8\xa0\x5b\xf0\x22\x03\xb6\x1f\x7a\x3a\x20\xba\xcf\x37\x16\xf9\x09\x16\x3d\xe1\x38\x2d\x56\x87\x3f\x09\xab\x83\x00\xe7\xe0\xe2\x43\x98\x08\xc8\x1a\x19\xcf\x19\xf8\x41\x64\xee\x00\x7c\x05\x9c\x48\xf5\xee\x85\x58\x22\x12\xeb\x10\x82\x11\xd6\x94\xe0\x22\xd8\xd1\x22\x5f\x31\x9f\x62\xf7\x13\x35\xe3\x05\xac\x1c\xa8\xe2\x0a\x44\x2d\x90\x29\x7f\xd5\xb2\xad\x32\xfd\xc7\xae\xcd\x2e\x63\x5d\x3f\x4a\xdc\x05\x33\x47\xc1\xc6\x2d\x2d\x79\xea\x44\x25\x41\xbc\x55\x43\x18\xac\xd5\xd3\x67\x70\x77\x47\x35\x02\x4c\x14\x41\x14\x84\xa9\x34\x29\x9d\x09\xb1\xdf\x04\x22\xba\x9c\x24\x34\x15\x9c\x51\xbb\x6f\x42\xb4\xfb\x80\xc0\x65\x52\x32\x0d\xfe\x84\x6f\x00\x1d\x5d\x21\x0d\x33\xc4\x0b\xaf\x12\xee\xcc\x61\x85\xa7\x73\x68\xaf\x7a\x75\x2c\x79\x5f\xa0\x74\x3e\x02\x52\xab\xcb\x7f\x64\xe1\xd6\xdb\xd6\x02\xd9\x80\xc3\x6a\x28\x28\xf8\x48\x7a\xa4\x7f\xd2\x9b\x81\x55\xb6\x8c\x6c\xf5\x9c\x9e\xdf\xe2\xa9\xb9\x66\xad\x31\x33\xa0\xcd\x75\x3b\x7d\x78\x79\x51\xac\x14\x7f\x17\x85\x23\x29\x64\x00\x5c\xf3\x12\xb9\x33\x90\xc5\xfe\x77\xd2\x51\x03\x85\x4e\x2a\xc0\x59\x85\x59\x00\x61\xb1\xd7\xfd\xd0\x54\xf7\xa8\x24\x95\x92\x26\x5d\xa8\x0a\x4e\x10\x2e\x8d\xaa\x4e\x61\x32\x32\x66\x93\xb6\xcb\xda\x74\xa7\x4b\xd1\x43\x26\x3f\xe0\x5e\xbf\x64\x1c\x82\xb4\xd0\xf6\xe8\xaf\x8f\xda\x8b\x4a\x5c\x23\x96\x01\x9e\x6e\xae\x5e\x5f\xff\xb5\x15\xb2\x3d\xbc\x16\xb7\x3a\x37\x47\x81\xfa\x0c\xdf\x41\x48\xe5\x7a\xa7\x85\x82\x36\x73\x9e\x41\x07\xa2\x01\xb2\xed\x71\xa9\x06\xd0\xc5\xcb\x64\x8b\x8f\x6e\x80\xe0\x2a\x03\x02\x5b\x02\x85\x58\xed\x05\x02\x1a\xbd\x9f\xa1\x8c\xf7\x32\xf9\x1e\x98\x88\xc3\xbd\xf2\x12\xf2\x1b\x87\x81\x1e\x3d\x62\x89\xbe\x1c\x97\x88\x92\xa3\x58\xbc\xfa\x4e\xf3\x03\xad\x68\xd9\xe9\x12\x08\xdd\x3b\x3e\x7e\xf4\x8c\x45\x3a\xee\x7e\xc5\xb2\x07\x29\x79\x1f\xb5\xed\xba\xf9\xbe\x2e\xa6\xac\xd7\xfc\xfe\xbb\x6f\xa1\xe3\x6d\x61\x54\xf6\xbd\xa8\x4b\x81\xa0\xa0\xfa\xad\x4b\x9e\x69\x55\x86\xb3\x6c\xe1\x5e\x76\xc9\x7d\x60\x7d\xc2\x52\x43\xc7\x46\xba\xc8\xfb\xc8\xa9\xef\x99\xbe\x17\xe8\x92\x43\xfd\xea\x8b\x5a\x55\x8b\xa8\x1b\xd2\x84\xa7\xd0\x57\xbb\xd1\xc9\x03\x53\x02\x46\x3f\xee\xca\x52\xd5\xdb\xe9\xf1\xb2\x66\xdd\x71\xad\x37\xf9\xce\x7e\x7d\x02\xa7\x8b\xaf\xea\x2f\xa8\x5f\x15\x7f\x7c\xb0\x34\xf9\x02\xdf\x54\xdf\x02\x95\xac\xed\xb7\x67\xb5\xd6\x34\x66\xef\xed\x0a\x1a\x01\x37\x0c\x50\xfb\x14\x15\x68\x89\x53\x22\x68\x7a\x67\xfe\x71\xcf\xd3\xc9\xdb\xc9\x8f\x89\x2a\xd6\x4b\x45\x8c\xb6\xab\x1c\x5c\x3f\x51\x0a\xd0\x9b\x46\xa5\x0e\x52\xc4\xb3\x4d\x81\x5a\xa1\xab\x9f\x73\x79\x32\xba\x07\xc4\x64\x96\xc6\x5d\x65\x80\x3a\x7f\x4b\x77\x07\xa8\x2f\xf8\x19\x10\xc0\x48\xb7\x0d\x2c\x7c\xac\xb3\x10\x35\x6c\x34\x60\x1e\x7c\x92\x04\x12\x05\x4d\x48\xdc\x1a\x36\xf3\x8f\x5d\x95\x26\x38\x86\x96\x20\xe7\x09\x56\x81\x66\xea\xa7\x9b\x9b\x41\x05\x37\x64\xd8\x90\xe9\x85\xdf\xec\x10\x59\x9e\x0f\x89\x06\xb4\x40\x25\xfe\xbe\xfa\x00\xc2\x50\x23\xaf\x16\x45\x97\xed\x9f\x0b\x40\x2c\x88\xb1\x3b\xbd\x48\xdf\xbf\xdb\xbc\x8f\x5d\x56\x2b\xe0\xff\x2a\x69\x70\xa8\x77\xd0\x17\x1a\xab\x2c\x50\x9f\xf0\x89\xb5\x7d\x98\x41\xbf\xa6\xae\xf5\xa2\xc5\x8b\xa7\x70\x3c\xab\xd6\x22\x01\x16\xd0\x31\xbe\x1f\x4f\x3c\x92\xf6\x92\x34\xbf\xc7\x29\xb9\xa9\xac\x1a\x13\x4e\x15\x77\x14\x19\x6f\x6c\xce\x6f\x72\xd6\x72\x63\x36\xd7\xba\x9a\x01\x1f\xa4\xab\x71\xc1\x10\x78\xa8\x33\x14\x05\x70\x69\xc8\x4f\x4c\xf8\x35\xac\xdf\x76\x04\xd1\xf4\x9b\x4e\xd0\x70\x63\x5f\xc3\xe0\xd9\x6e\xd0\xac\x05\x3c\xb1\xaf\x1d\xe1\x8c\x61\x13\x3e\x72\xaa\x0e\x2b\xcd\x46\xd0\x85\x6d\xc2\x2f\xc5\xad\x9a\xf8\x2d\x71\x7b\xeb\x0f\x03\xb5\x3e\xb8\x9b\xdd\x5e\xd9\x99\xf6\x19\x55\x9c\x80\xdb\x6b\xb2\x99\x09\x54\x26\xac\xd9\x3a\x03\xc4\xcf\x5a\x1c\xed\xf8\x71\xd6\x0d\x58\x3d\x66\x35\xbe\x8b\x01\x65\x1f\xf4\x0f\x30\x85\xc4\xe4\x1d\x03\xc8\x4c\x37\x85\x42\x63\xa9\x37\x2b\xc5\xbc\x71\xc6\x8c\xb1\xd5\xa7\x8e\x74\xef\xa8\xe1\x3b\x67\x6f\x41\x2d\x98\xef\x85\x98\x1d\x21\x8c\xea\x9f\xa0\xbd\x00\xf5\xdb\x40\xab\x58\x69\xfa\x42\x40\x8d\xb3\x43\x71\x9d\x17\x35\x7d\x9a\x21\x39\x95\x47\x11\xe4\xbf\x74\xc6\x8c\xa0\x6b\x0d\x63\x0b\x04\x04\x2b\xe3\x0b\x9b\xa1\x72\x19\xe0\xf5\x80\x8e\xe7\xfa\xef\xe9\xe6\xfa\xd7\x6c\x2b\xf7\x14\x48\x96\x82\x9f\xa1\x4e\x00\x18\x02\x9c\x07\x5d\xde\x33\x9d\xe9\xca\x77\x09\xd7\xc5\x6e\x07\x3e\x61\xae\xf4\x76\x8c\x63\xe3\x61\x49\x3f\x8e\xfd\x12\xd5\x22\x1d\x06\x72\x24\x4c\x21\x91\x40\xa2\xee\x0a\xf5\x31\x28\xce\x6e\x74\x0d\xb4\xdd\x75\x2a\xaa\xc0\xd2\x2c\x8b\xfd\xed\x03\x89\x63\x6d\xa0\xf8\x3c\xc3\x59\xc8\x29\xc3\x87\x02\xd5\xc8\xc0\x8b\x57\xf9\x42\x70\x68\x24\xef\xf1\xcb\x29\x1d\x1e\x48\x66\x40\x6a\xad\xd6\xec\xa9\x23\xb3\xb0\xa2\x62\xa9\x44\x49\x96\x00\xd6\x2e\x0a\x3c\x10\xb6\xa5\x7a\x1e\x30\x58\xa4\x98\x84\xc9\xd8\x8d\x8a\x70\x3e\xef\x61\x00\xc9\x93\xf4\x89\x28\x9f\xcf\x70\xb3\xce\x32\x54\x96\x6c\x60\xff\x4a\xb5\x23\x9c\x8f\xb2\x05\x2e\x4b\xb5\x13\x19\x15\xe5\x1d\x34\x97\x8a\x06\x3d\xd3\x76\xdc\xab\x9f\xe1\x80\x41\x42\xed\x0d\x5b\x45\xaa\x9e\x49\xfa\x8d\x26\x25\x3f\xde\xd7\x3c\x1c\xd8\xc8\x8b\x37\x8d\x2c\xb3\x20\xc6\x8d\x3b\x6e\xda\x0d\x3e\xfd\x20\x38\xf6\xf6\x80\x64\x8d\x00\x61\xf5\xb7\x21\xbc\xbe\x07\x69\x79\xfb\x55\x27\x6c\x83\x34\x9b\x13\xf7\x12\x5c\x9b\x07\x20\x58\x12\xf2\x42\xfe\x05\x99\x99\xe0\xd2\x24\x3f\xe0\x1d\x7b\x99\x30\x27\x2d\x0f\x4d\x96\x5f\x14\x5e\x37\x40\x5b\x40\x05\xf0\x25\xac\x4b\xce\x0c\x90\x61\xc3\x12\x36\xc8\x47\x20\xed\x01\x85\xc9\x2a\xed\xad\xee\xd0\xfa\x2b\xd2\x5c\x89\x55\x18\x30\xad\x1a\x7e\x9e\x21\x75\x52\x6c\x1d\xa6\x92\x13\x53\x14\xe6\x15\x6a\xb6\x8e\xbd\xb6\x20\x41\x2b\x9b\x1a\xa1\x6b\x0e\x00\x3c\x1f\xd8\x49\x48\x2b\xd4\xbb\x62\x2b\xb8\x7c\xc8\xe6\x71\xa1\x2d\x69\xe1\xb6\x48\x09\xaa\x17\xf1\x9d\x24\x6d\xec\x27\x54\xc1\x94\x13\xc2\xda\xc8\xbd\xd7\x1b\xd4\xff\x8e\xe1\x68\xa4\xc2\x78\x04\xb5\xde\x41\x2d\x7a\xd0\x04\x6c\xed\x5b\xaf\x55\x0b\x98\xaf\x62\xa9\x92\x56\x92\x4d\x9f\xef\x4c\x1d\x63\x7c\xc0\x3d\xd4\x9f\xe2\xfe\xf8\xca\xaf\x19\xd3\xe0\x49\x58\x8b\xba\x97\x89\xb5\xba\x3b\x62\x7b\xbb\xde\xd3\x85\x1c\x52\x38\xd3\x73\x3a\x16\x95\x08\x32\x68\x40\x5a\xf3\x4c\x35\xeb\xe9\xa6\xc7\xc6\x69\xfe\xf9\x49\x0d\x2d\x0e\x80\x41\x23\x35\x11\x08\x0d\xd6\x0e\x81\x34\x9e\x81\x61\x64\x06\x98\x12\x64\xe4\x63\x86\x39\x91\x8e\xba\x1c\xb6\xea\xeb\x87\x49\xb2\xee\xe6\xd0\x87\xb7\x13\x94\xb3\xb5\xe6\xa0\x76\x29\x81\x86\x65\x44\xd0\x3e\xc3\x87\x0d\x07\x14\xfc\xfa\x6b\x49\x2b\x89\x9a\xd1\x0b\xf7\x66\xd7\xaa\xa5\xd5\x28\x01\xd8\xad\xf8\xe2\x79\xcd\x8d\x42\x03\xd3\xcb\x0b\x7e\x82\x32\x20\xbc\x02\x82\x96\x77\xa9\x73\x52\xe4\xd4\x06\x8e\x1a\x87\x28\x0d\xf5\xe1\x54\x85\x8e\x78\x3b\x72\x2e\xca\xc3\x2c\x54\xb9\x52\x5f\x78\x15\x59\x21\xc9\xd8\x96\xa0\x22\x07\x2c\x01\x8c\x23\x1b\xfa\x15\x66\xc5\x78\xe5\x00\x85\x4b\x6b\xda\xb5\x93\xbb\x35\xc6\x0c\x00\x4c\xa1\x99\x64\xc5\x52\x40\xe1\x45\xb2\xc0\xd4\x37\x41\x51\x98\x9e\x64\x9f\xe0\x3b\x99\x49\xba\x35\x9a\x5e\xb8\x13\xb0\x77\x57\xf6\x3f\xfe\x1a\x08\x9e\xde\x9e\x93\xf4\x7e\x97\xff\x6c\xd6\xb0\x8c\x73\xc2\xf9\xd8\x05\xfc\xff\xc4\xa2\x85\x1b\x2d\x75\x5d\x75\xd3\xaf\x6e\x95\x5e\x84\xf2\xa8\x96\x62\x8b\x16\x77\x8a\xce\x6e\xa5\x7f\x86\xa4\xc4\x84\xdb\xd0\xc1\x25\x30\x2b\xd4\x0b\xd2\x8d\xed\xdb\x83\xca\x8b\xb8\xbc\x8f\xcf\xb7\xac\x84\x61\x55\x38\xca\x5d\xed\x18\xf2\x12\x2b\x11\xcd\xfa\xa0\x7d\xaf\xf3\xfd\x67\x79\xfb\x2a\x6f\xdf\x97\x01\xfd\x9b\xd2\x22\x4c\x67\x89\x31\x32\x9a\xe7\x37\x60\x7f\x8c\x69\x44\x25\x6f\x8d\x17\x00\x5d\x93\x0a\x6c\xac\xbe\x1c\x9e\xd4\xbd\xbf\x6a\x3b\xe0\x23\x76\x2c\xe5\xf8\x97\xa6\x9e\x6d\x82\xbd\xb1\x30\x45\xc0\x9e\x55\x6b\x9b\xcb\x05\x0e\x9e\xc4\x46\xc6\x43\x51\xdb\x6f\x05\xe1\xb3\x59\x5e\xa2\x24\x7b\xa8\x96\x35\x71\x5f\x2c\x96\x0a\xfa\x32\x73\x94\x37\x57\xa8\x0a\x8b\x26\xeb\x00\x2d\x78\x11\x13\x1b\xbb\xfe\x74\x11\xfc\x02\x20\x02\x4c\x28\x60\xe4\x35\xe3\x0c\x3a\xac\x43\x31\x45\xc0\x57\x1e\xb7\x78\xca\x82\x0a\x58\xbd\x80\x9b\xeb\xbe\xb3\x15\xf6\x52\x0c\x6d\x50\x25\x31\x8b\xbe\x23\x47\xd9\x46\xda\x89\x11\xf6\xfd\x45\x4f\x18\x8a\xde\xf1\x26\xfd\xd9\xfa\x2b\x46\xc8\x8e\x1b\xd1\x12\xc7\xae\x98\x99\xa4\x87\x5b\x66\x9b\x52\x67\x70\x19\x28\x9a\x1d\x8e\x12\xe3\x3f\x6b\x92\x47\x7b\x11\xe0\x2b\x99\xc4\xff\x32\x6c\x25\x02\x0a\x8b\x46\xcd\x88\xfe\x47\xec\xd3\xe5\xfb\xb1\xa8\x3d\x1c\xaa\x7f\xbb\x58\x72\x4d\x11\xae\x02\x72\xb0\x2c\xd4\x26\x32\x0a\x73\x64\x61\x48\x07\x0c\x09\xbe\xfc\xb4\x6b\xfd\x0c\x04\xc3\xa3\x58\x5b\xe7\xa4\x92\x79\xc4\x3d\xda\xdf\xa2\xc1\x63\x48\x84\xb5\xa0\xf7\x81\x1d\xd5\xde\x15\xae\xc2\x57\xc4\x4d\x11\xbe\x20\x9e\xc5\xd2\x50\x79\x4b\x30\x45\x53\xdc\xf6\xaa\xf2\xb2\x7c\x7d\xb6\xeb\x1e\xb4\x02\xac\x47\xb2\x89\x18\x6c\xa8\x1d\x42\x57\x5e\x21\x3f\x81\x1c\xe1\xae\xa7\x01\x9c\xa4\x0f\x96\x0b\x82\x0b\x8f\x09\x3f\xef\x8f\x6c\xa1\x6e\x28\xab\x02\xec\xa9\x08\xf6\x1a\x9e\x9f\x7a\x2f\x51\x59\x46\xf7\x81\x57\x8f\xbc\x5c\xe6\x90\xd1\x50\xc3\x89\xb5\xe3\x9a\x37\xd4\x99\x45\x8f\x50\xf8\x10\x22\x0f\x4f\xe3\x8f\x03\x48\x82\xac\xea\x1e\xf5\xfe\xf2\xd6\x80\x8c\x52\x60\xcb\xf0\x2f\x3d\x3e\x01\x04\xee\x7d\x7e\x92\xe7\xa6\x60\x46\x93\x60\x29\xf1\x8d\xae\x68\x73\x47\xa0\xb5\xbf\xcf\x78\x8d\xc9\xe4\x10\xee\x8d\x5c\x0f\xc7\x9f\xd9\x0b\xc2\xa2\x19\x10\x40\x64\xd4\x70\x44\x14\xe5\xec\xf6\xf2\x47\x62\xea\x08\xb0\xc8\x24\x14\x25\x18\xbd\x03\xf2\x1a\xb5\x1d\x80\xcc\x37\xa4\x35\x83\x7b\xdd\x6e\xd1\xb5\x40\x95\x86\x84\x18\xab\x6c\xed\x50\xd4\x44\xc3\x52\x5c\xbc\x33\xfc\x65\x2a\x9c\x97\xf1\xab\x39\x08\xea\xc4\xa0\x15\x25\xec\xf5\xf5\x2f\x05\x5a\xea\xb5\x88\x57\xd4\x7c\xdb\xb0\x6c\x52\x9b\x1d\x70\x68\x95\x2a\xd8\x72\x57\x9e\x0c\x3e\x45\xd3\xb0\xea\xf4\xb3\x43\xbd\x61\x21\x46\xad\x3e\xff\xf4\x23\x29\x4c\x8f\x4c\x86\xc2\x8c\x3c\xdc\x66\x86\xe7\x81\x47\xb9\xda\xa2\x09\xf4\xa3\x6e\xde\xd1\x13\x90\x41\x07\x0b\xef\x50\x11\xda\x9b\x5b\xa9\x09\xce\x36\xdc\x0d\xf4\xb6\x10\x33\xbc\x2d\xd4\xa4\x17\xeb\xa8\x8f\xb9\x66\x41\x1b\xce\x1d\x64\x8b\x8b\x72\xcb\xfe\x19\xc8\x4c\x92\xf5\x12\xac\x34\x42\xc8\xa6\x5d\x29\xb6\xf2\xb2\xf8\xc8\x9a\x07\xdb\x2b\x34\x3c\x37\x67\xb5\x0c\x9f\x02\x65\x12\x69\x71\x1d\xbb\x8b\xb8\xdc\x9e\x09\xde\x01\xe9\x7d\xe2\x1a\x12\x1f\x45\x0d\x3d\x6b\x2d\xfd\xe3\x73\x77\x4b\x25\x25\xb3\x62\x00\xf2\xa4\x95\xf2\xe2\x9d\xed\xa1\xa7\x6b\xa7\xf2\x45\xa4\x56\x16\xd8\xf3\x74\x9b\x2e\xab\x5f\x09\xcb\x2c\x7d\x4e\xd1\x82\xf8\x7b\x16\x8f\xe2\x36\x08\x16\xb5\x2b\x18\xc1\xa3\xa1\xca\xbf\x5f\x6d\x80\x43\x99\xf0\x05\x4d\x02\xf4\xd9\x07\xdd\x80\x81\x1c\x45\x9a\x83\xc1\xec\x72\x1f\xfb\x85\xf6\xd7\x28\xe8\x92\xb1\xa5\x88\xbc\xac\xfa\x42\x79\x97\xb4\x4e\x74\x3e\x87\x8a\xb5\x4c\x5b\x7b\x88\x5c\x01\x5d\x2d\xac\xe4\x7b\xfd\x96\x1e\x10\xcf\x43\x26\xcc\xc9\xc0\xb4\xfb\x2d\xb2\x50\x7c\xd9\xc9\x52\x5f\x0e\xe0\x4c\x87\xa6\xe9\x5e\x9d\x05\x70\xff\x7f\xa4\xf8\x47\xd2\x9a\x15\x40\x58\xd8\x1e\x99\x6e\x68\x84\x2f\xd8\xac\xb1\x0b\x7a\x50\x63\x5d\x38\x24\x25\xf2\xa2\xa0\x28\xb8\x23\xf4\x02\x4a\x34\xbc\x71\x42\x24\xfc\x10\x2f\x10\x6b\x08\x32\x86\xa3\xde\xd9\x78\x92\x3e\xcd\xd8\x7a\x83\x2d\xe6\x59\x68\x5b\xb3\x5a\x01\xef\xb8\x33\xed\xc7\x67\x69\x24\xff\x1b\x7c\xa4\x06\x76\xb3\x9a\xe7\x15\x5c\x27\x6c\x9d\xb7\xf2\xd3\x9d\x67\x4f\xd8\xd5\xad\x50\x18\xea\xd4\xe3\x63\x45\xb5\x67\xb4\x79\x6e\xc1\xa6\x31\x73\x9e\xa3\x03\x2f\xe1\x60\x64\x3b\xf5\x4a\xbc\x52\xc4\xbc\x86\x9b\x3f\xdf\x52\x21\x73\xe7\x44\x13\xed\xee\x77\x7c\x3a\x0d\xef\xd0\x91\x94\x6e\xdd\xca\xe8\xf9\x7c\xe3\x9a\x17\x07\x69\xe8\x05\xc4\xc0\xb4\x65\x8a\x19\xc0\x3b\x29\xfc\xee\x1f\x7d\x3d\x49\xdc\x1c\x78\x80\xc7\xa4\x9d\x3c\x0f\x0e\x1f\x9f\x0a\x2e\xff\xb9\x2e\xaa\xd0\xbe\x72\x44\xe6\xe2\x4e\x42\x84\x61\xfb\xd8\xfa\x15\x0f\x57\xeb\xd7\x19\x57\xe2\xd3\xd0\x96\x70\x86\xbb\x19\xce\xae\x7f\xe1\xdc\x4e\x00\xa0\x3a\xf6\x18\x79\x55\xa4\xff\x6b\x24\x11\xf4\x62\x2a\x9a\x59\x00\x8a\xec\xea\x35\x7c\x44\xb8\x43\xec\x07\xe5\xc8\x37\x8a\x2e\xd5\x61\x26\x39\x63\xc6\x4d\xe1\xb9\x8f\x21\x28\x01\x81\x68\xca\x17\xc1\x66\x8c\xb6\xef\x61\xae\x52\xd8\xbf\x77\xf4\x15\x60\xb3\x0d\x59\x9b\xeb\xca\x71\x85\xe1\x69\x59\x3f\x91\x71\xc4\x16\x2e\xd2\x5d\x82\xa7\x23\x23\xf7\x36\x3e\xe6\x58\x8c\xd3\x99\xab\xf7\xd2\x43\xbd\x23\x9b\xa5\xeb\x3f\xa1\xc9\x2f\x2a\x54\x08\x6d\x39\x09\x94\x99\x2f\x99\x56\x0e\x77\x4a\xe6\x60\x1f\xd9\x45\xde\x8c\x1e\xd5\xa5\x4a\xa8\x17\x10\xee\x3d\x85\x7f\xe0\x52\x02\xd2\x13\x9c\x4b\x46\xe0\xa1\xea\x16\x9d\x2c\xbd\x1e\xc1\xf2\x16\xf6\xf5\xd3\xf3\x15\x74\x6b\x36\x70\x95\x17\x1a\x79\x5c\x6b\xe8\xdb\x9b\x9d\x33\xf7\x6d\xec\x79\xf5\xe6\x2f\x76\xc7\x1e\x26\xc4\x55\xb6\x57\x2b\xc0\xd5\x16\xd1\x20\xf4\xb5\xf5\x06\x35\xed\xd2\xf9\xf8\x99\x25\x3f\x20\x9b\xf5\x32\xe1\xf7\x8a\xe7\xf6\xc1\xc0\x3f\x91\x8d\x3e\xc0\xfb\x07\x34\xe1\xb2\x1e\xa2\x0c\x3e\xfe\xfa\x03\x1c\x02\xea\x7c\xe1\x9c\x90\x39\x6e\x44\xe1\x0f\x02\xc6\x0a\xb6\xa7\x5d\x21\x4e\x3b\x40\xd7\x1e\x6b\xbc\xa6\x0b\x46\xd4\x2a\xed\xaa\x1c\x80\x24\x62\xad\x04\x07\x82\x1c\xb8\x99\x24\x9b\xbc\xc9\xe7\x79\x41\xea\xdc\x3c\x43\x6f\x51\xb4\x83\xe7\x62\x2c\x8d\xfd\xcd\x42\x7f\x67\xa0\x0d\x9f\x36\x6b\x55\xa5\x0b\x58\x70\x33\xbd\xd3\xa1\xb9\x7d\x46\x46\xf8\x77\x3e\xb3\x6e\xf8\x6f\xe1\x38\xa1\xce\x67\x83\x0e\xd1\x8b\x7a\x01\xc4\xf6\xd8\x9a\x5a\x6d\xb6\x55\xd7\x82\x3c\x01\x20\xc1\xd7\x87\xcd\x89\x86\x76\x95\xc4\xae\xb2\x0d\xdf\xbb\xc7\xbf\x18\x8e\x8f\xee\xdb\x76\x55\x1f\x88\x46\x82\x2f\x38\x3e\x8b\x1a\x40\xd0\x5e\xb5\x65\xbd\x46\xa2\xc3\x88\x1c\xbd\x3f\x4c\x16\x85\xa9\xdc\x19\x46\x86\x7d\x24\xf2\x03\x03\x4a\xee\x5e\xe2\x3d\x53\x7e\x9e\x1e\x2a\x34\xed\xcf\x37\xcc\xcb\xde\xe8\x70\xcc\xd1\x07\x3a\x64\x6a\xdf\x4b\x68\xe2\xf4\xf4\xf0\xdd\x5e\xb7\x73\xaa\x43\x7e\x56\xdf\xd9\x72\xb8\x1a\x3b\x2e\x1f\x1c\x6a\xe0\x1b\x6a\xf5\x03\x1b\x0f\x04\x37\xac\x5a\x9e\x7f\x85\x0c\xae\xf3\x86\x7f\x63\x0c\x02\x89\x3f\x40\xbf\x4f\xf3\x36\x3f\xad\xd0\xa4\xd7\x7a\x4c\x6e\xe7\xba\x86\xd1\xae\xcf\x29\x6a\xc1\x36\x9d\xb8\x2a\x09\x9a\x18\x54\x8d\x9e\x7e\x8b\xff\x2e\xdc\xef\x7e\x53\x2a\x66\x23\x3a\x56\x60\xc1\x50\x2a\x83\x3b\x76\xcc\xea\xac\xef\xbe\xbc\xff\xf0\xc9\x97\x52\xb8\x67\xdc\xce\xb9\x13\x4b\x6d\xf4\x62\x98\xe5\xb0\xfe\xe9\xd7\x55\x8e\x3c\x90\xa0\xc6\x76\x00\xf5\x0d\x5b\x6e\x57\x2c\x5a\x50\x2f\x68\xa8\x27\x1d\x9b\xce\x5a\xeb\xf2\x33\x99\x33\xd3\x0d\xba\x00\xc4\x73\xa2\xba\xc2\xbe\xef\xa0\xf5\x08\x3b\x18\xc9\xb3\x8e\x04\x30\x00\xdc\xda\x55\x1a\xba\xb8\xfa\x39\xc7\x07\xaa\xa8\x98\x77\xfe\x3b\x5d\x9a\x8d\x4e\x15\x01\x28\xc8\x85\xfa\x1e\xda\x1d\xad\xf2\xea\x14\x7e\x9f\xe8\x1a\xb7\x11\x4d\xa9\x88\x8f\x49\x61\x7a\xa7\xba\x66\x99\x02\x3d\x85\xda\xa5\x96\x66\xb6\xeb\x1c\x9f\x7d\x01\xdd\xd1\x93\x2b\x50\x2a\xb6\x87\x26\xf9\xec\x03\x12\xb7\xd5\x87\xb6\x2a\xb0\xd0\x35\x52\xa6\xfb\x2c\x32\x5b\xcb\xe9\xf8\xab\xc0\x87\x7d\x24\x26\x19\x83\xc4\xc4\xcc\x58\x05\x8a\x98\x11\x92\x08\xd7\xf3\x6a\xb9\xfc\x67\xa6\x50\xf4\x91\x3e\x89\x3f\x6f\xb6\xd5\x22\xe2\xd0\xb1\x60\x09\xe4\x02\xcf\x8b\xec\x41\x5f\xa1\x11\xc4\xd8\xfb\xd3\xa9\xda\xf5\x8b\xf1\x52\x34\xfe\xa2\x70\xcc\x03\x7a\x0c\x82\x33\x5c\x2c\xc5\xe0\xd3\x9c\xcc\xe8\x4c\xc9\x79\xca\xe2\x76\xf4\x7f\xb9\x3c\x5f\x16\xde\xda\x84\xad\x5d\x0d\xbd\x5b\xdc\xcd\x02\x67\xea\x00\x85\x19\xb2\x5d\x1f\x7b\xad\x1a\x33\x9c\x18\x79\xac\xba\xd5\x5b\x15\x12\x90\x4d\x37\xd2\x57\xff\xa1\xaa\xd2\xa8\x21\xee\xda\x65\xf8\xec\x8b\x1a\x02\x71\xb2\xa2\x0d\x95\x00\x19\x3e\xc8\x80\x8d\x91\x11\x7e\xd8\x4f\x25\x88\x88\x46\x78\x9a\x1c\x02\xe6\x45\xa7\xef\x7c\x26\x00\x56\x5a\x24\x6d\xbb\xa4\xcb\x73\x44\x13\xba\x88\xf1\x90\xad\x32\x61\xac\x6b\xc1\xf0\x50\x31\x8a\x45\xb5\x38\xeb\xaf\x46\xeb\x09\x91\x47\x96\x2e\x34\xb5\xf2\x0e\xb8\x1f\xfd\xe1\xeb\x67\xe4\xa0\x4b\x3a\x87\x85\xd8\x6f\x89\x46\x15\x9a\x75\xd6\xd9\x72\xe2\x06\x40\x76\x27\x6f\x1a\x66\x1b\xab\x1c\xcf\x32\xb2\x3c\x48\xf3\x12\x9d\x89\xd9\x34\x89\x9c\x1f\x7b\x6f\xc3\xbe\x2b\xef\xec\x81\x56\x93\xe4\xe9\x71\xa8\xf9\x29\xff\xdc\xb7\xa5\x59\x1d\xc0\xc6\x5e\xfd\x25\x78\x01\x0e\x4d\x40\xbd\x9b\x77\xe9\x3b\x97\x07\x7e\xda\x55\x34\xbc\xed\xbf\xf0\xcb\x35\x23\xda\x61\xa3\x9d\xe0\x05\x01\x10\xa1\xb2\x00\xff\x5b\x7a\x42\x2e\xbc\xd0\xc9\x49\x48\x48\xea\x80\xee\x04\xcb\xb4\xee\x64\xcc\xda\x5b\x75\x4f\xab\x91\xaf\x5b\x6f\xe1\xaa\x55\xab\xe9\x63\xa0\x24\xda\xff\x76\xec\xef\x0b\x96\x16\x18\x20\x83\x06\x62\x45\x75\x84\x16\xb8\x41\x15\x72\xd4\xcb\x1b\x31\x72\xfd\xff\xfe\xfc\xff\xde\x7b\xc0\xbb\xf3\xa0\xad\x8b\x7b\x0f\xb0\x3d\x1e\xd3\x73\x54\x32\xfe\x15\x18\xa9\x55\x17\x35\x37\x20\x82\x12\x16\x19\x79\x68\xe6\xf2\xe0\x49\x1a\x31\x0b\xa0\x4b\x43\x0f\xdb\x80\xa4\xf9\xb7\xfd\x45\x91\x62\x02\x42\x9c\xa0\x12\xc1\xc6\x2c\x82\xe1\x81\x70\x76\xc9\x1f\xbb\x7c\xb1\x9a\x9d\x76\x80\x1b\xa7\x8f\x99\x9d\x3b\x0f\x54\x68\x4a\x18\x8c\x76\x99\x37\x12\xc8\xc6\x03\xfb\x80\x3e\x85\xce\x22\x44\x82\x17\xa6\x04\x6e\x3c\x1b\x78\x8c\x84\x77\x74\xe3\xbc\xd7\x48\xa2\xa1\x4d\x81\x0b\xbe\xee\xd0\xde\x10\xe1\xcb\x8e\x8b\x2e\xb2\xad\xd5\x4a\xf1\x5b\x4d\xd8\xcf\x6e\xa4\x1f\x90\xb1\x68\x1e\x30\x79\x0a\x1f\x31\xce\x48\x3a\x63\xc7\xd0\x43\x61\x53\xab\xeb\xbf\xb3\x52\x71\x5e\xef\xe0\x8c\xd7\xb8\x39\xdb\xf7\x92\x84\xcc\xa5\x5f\xa0\x6b\x2f\x2b\xb7\x30\x82\x88\xa5\xa6\x4c\x43\xdb\x5a\x53\xac\x24\x53\x26\x27\x79\x81\x86\xb6\x62\x4d\x81\x71\x32\x5a\x75\x3a\xfd\x0a\x4a\x6b\x8e\x19\x60\x8d\x29\xe6\x68\xe3\x0d\x4c\x3d\x88\xbf\x5c\x19\x05\x5e\xb6\x14\x85\x16\x00\x86\xf4\x71\xdb\x0b\x6d\x83\xf1\x70\x7c\x1c\x1c\x10\x03\xe3\x38\x38\x85\x9a\x6b\xf8\x7e\xfd\x3f\x31\x36\x0d\x34\x2e\x73\x8c\x54\x05\x07\xda\x4c\x9f\xa0\xf5\xdf\x1b\x28\x5b\x90\x31\x29\x5a\x59\x90\xfd\x68\x0d\x82\x89\x6a\x70\x70\xf1\x0e\x4c\xe8\xc5\xb7\x56\xaf\xa6\xc7\x1d\xc2\xe8\x5b\x2e\x58\xa2\xa1\x12\xbe\x92\xd0\xbf\x70\x73\xa8\x94\x9c\x97\xb0\xae\xf7\x9f\x4a\x1b\x6a\x76\x51\x62\xb8\x93\x4d\xc7\xf5\x48\x4c\xa3\x6b\xf7\x0c\x69\x3e\x6c\x23\x3d\xe1\xf2\x47\xb4\xf9\x2e\x90\x31\x95\xe3\x92\xa7\xc2\x33\x91\xfd\x8b\x1c\xa4\x39\x8e\xab\xd1\x73\x91\x4d\x12\x9d\xa1\xd1\xc8\x84\x02\x25\xe1\x33\x36\xeb\x1f\x85\x55\x93\x8f\xfc\x3c\x29\xdf\x05\xaa\xe2\x1a\xf8\x0f\x7f\xff\x1e\x83\x24\xe5\xfd\xef\x6b\xb4\xb5\x85\x21\xf8\xb9\xac\x41\xfa\x89\x4f\xc5\xcc\xc6\xda\x4a\x6c\x5c\x3e\xa3\xbe\xd0\x1a\x1d\x29\x0f\x75\x0a\xf5\x35\xfe\xe0\xc0\x05\xc2\xc4\xc5\x96\x5b\x9d\x8d\xcd\x14\xcd\x88\x2e\x61\x34\xad\x36\xd8\x1f\x5b\xb5\xec\xe0\xca\xcc\xf5\x0c\x86\x54\x96\xcb\xb3\x56\x4f\x14\xa1\x63\x47\xa4\xa1\xb3\xa0\x87\x5b\x78\xf9\x4f\xec\xb0\x23\xdb\x5a\xd4\x1a\xd4\x4b\x5e\x8b\x55\x9b\x5a\x1b\x62\x19\x82\xf0\xef\x5c\x9f\x20\x6f\x8d\x45\xae\xff\x35\x9d\x34\x12\x4d\xb3\x63\x33\xe7\x3e\xbd\x11\x3f\x15\x1e\xd0\x74\xfd\x9e\xad\x02\xc2\xad\x54\xec\xef\x6e\x5a\xeb\x12\xdd\x2f\x5f\xd5\x79\x6b\x15\x71\xf1\x72\xbd\xee\x83\x80\x05\xc4\x9a\xbc\xe1\x97\x9b\xab\xd7\xe2\x4d\x41\xcb\x56\xb0\x6a\x8b\xc1\x6f\x5c\x3c\xdb\xa1\xd0\x3c\xbd\x9e\x90\x20\x74\x54\xb9\xed\xb5\x21\xef\x39\xf0\x44\x0e\x8a\x7c\x91\xd8\x3e\xc7\x9c\xa1\x4f\x17\xf2\xa6\xac\xaa\xe0\x11\xd1\xcd\x30\x18\xd3\x09\xeb\xd3\x67\xc8\xc0\x66\x69\x96\xe3\xbb\x32\x00\xcf\x41\x7a\x06\xfb\x90\x22\x2b\x94\xc2\x46\x01\x92\x81\xf5\xc1\xb4\xd2\x8f\x26\xe9\x33\x43\x6c\x36\x32\xea\x61\x83\x53\x8c\x03\x43\x4c\xf8\x5c\x9f\xe6\x55\x85\x5c\xbb\x39\xa1\x82\x93\x5c\x17\x59\xd0\xc9\x1c\x98\x7a\x60\x90\x28\x0c\x0f\xcf\x06\xa8\x1e\xe2\xab\x00\xd0\x17\xba\x98\x91\xe5\x15\x10\x6f\xb6\xa9\xb0\xdf\x08\xb9\xb8\x8b\x42\x6e\xb1\x28\x12\xe2\xfe\x6e\xad\xc9\xba\xd4\x45\xc5\x78\x5b\xae\xfd\xbb\x20\x6c\xe7\x47\x9f\x56\x70\xb5\x37\x33\x39\x83\xcf\xde\x0f\x2a\x87\xf5\xde\xf7\x97\x1b\xcd\x07\x62\x23\x07\x94\x67\x63\x00\xb3\x5a\xa5\xb0\xa5\x4c\xb5\x64\x93\x7b\x91\x1e\x64\x04\x20\xb1\x35\x72\x54\xa8\x4b\x23\x16\xe3\xf2\x0d\x73\xd7\x4c\x46\x83\x93\x92\x5e\x78\xab\x8b\x2d\xe0\x32\x06\x66\xb9\x88\xb4\x01\x56\xe0\xb5\x1b\xc0\x20\x5a\xe2\x5b\xa2\x38\x07\x58\xbd\x94\xe5\x5a\xb9\xf5\x3d\x04\x81\x3b\xe4\x35\x25\x5a\x2a\x3f\xac\x27\xbc\x96\x14\x39\x92\xeb\x74\x5c\xa4\x4d\xe6\x5b\xef\xf5\x5c\x78\x13\xda\x8e\x88\x22\xcc\x25\x4f\x95\x8b\xc2\xb3\x8e\xa2\xab\x35\x96\xa8\x4c\x42\x24\x6b\xad\x04\xc9\xc6\x89\xdc\xfb\x09\xe1\xda\x70\x48\xb4\x98\x70\x77\x62\xc3\x9b\x3e\x74\x0b\xca\x9c\x6b\xa1\xd6\x22\x97\x58\x71\x79\x9f\x8b\x82\xed\xc7\x12\xd9\x02\xc5\xef\x2d\x33\x0f\x91\xf5\xa0\x45\x79\x2c\xdb\x58\x63\xed\x25\xbd\x71\x59\xf8\xb0\x77\x04\x79\x06\xc5\xf7\xf3\xcb\xaa\x05\x0c\x4d\x8d\x72\x96\x5c\xd7\x0a\x4d\x62\x52\x64\x92\x53\xc0\x26\x2a\xc5\x7a\x29\xfa\x12\x05\xb7\x8c\x2b\xc3\x67\x1f\x42\x70\x78\xa1\x69\x14\xd7\x64\xfa\x8c\x2e\x20\x7f\x93\x11\xa1\xfb\x8a\xb9\x1e\xbc\xa4\xb7\xee\x9d\x10\x33\x46\x5d\x00\xa6\x8f\x85\x6f\xbb\x21\x76\x0c\xee\x7f\x8b\xaf\xee\xb5\x4e\xa5\x7a\x5f\x56\x6f\xec\x92\xf7\x0d\xc3\x57\x3b\x9b\xbd\x5a\x06\x83\xca\xf3\xa4\x0b\x9b\x66\x35\x3c\xf8\x76\x92\xee\xd0\x17\xef\x1c\x7d\xf1\x98\x0a\x4c\x6e\x56\x44\xa5\x8f\x0b\xcd\x71\x95\x30\x90\x50\x49\x8f\xb2\x4c\xf2\x11\xc7\x1f\xa4\x0b\x13\xf4\x2f\xa6\xd6\x0e\xe6\x03\x56\x7c\x6d\x55\xb5\x64\xa7\x13\x5f\x00\x24\x4a\xeb\x26\xc0\xfd\xf1\x1a\x7b\x10\x75\x9f\xb7\xef\x55\x0e\xa7\xef\x0f\x4a\x2a\x45\xdb\x36\x7e\x3c\x70\x22\x82\x10\x11\x3d\xa0\xe7\x39\x9e\x09\x9c\x01\x9e\x03\xec\xbf\x7c\x44\x0c\x8d\x1f\xfd\x5c\x28\x0a\x92\x99\x89\x89\x14\xc1\xe6\x57\x24\x58\x51\x98\x16\x2a\xfd\x88\x31\x41\x70\xc0\x34\x4d\x92\x55\x48\xd4\x0a\x90\x6d\xd3\xcd\x01\x9c\x1c\x92\x5b\x9b\xcc\xc9\x6e\xc1\x9d\x15\x3b\x71\x1a\xd7\x31\x4e\xc8\xc3\x60\x7d\x8a\x64\x40\x6e\x21\x11\x23\xc5\x0e\x27\x29\xc5\xa9\x08\x47\x0d\x7b\xc0\x1e\x71\xf8\x98\x05\xa3\x10\x65\x84\x96\x2d\x63\x3a\xe9\x31\xa8\xb6\x58\x1c\xd6\x1f\x91\x8d\x5e\x65\x3d\xa7\x80\x09\xb4\x15\x4e\xf0\x61\xef\x11\x7b\xb3\xdb\x32\xd4\x37\x00\xf9\xba\x0f\x08\xaf\x76\x85\x65\xec\x65\xe5\xca\x89\x92\x3c\x54\x6d\x57\xba\x22\x8e\x40\x70\x0c\xd0\x4a\xb1\x49\x6d\x31\xa0\x42\x4d\xc1\x3a\xaf\x5e\x9f\xd1\x07\xeb\xae\x8f\x11\x50\x0f\xc5\x49\x1e\x18\xf6\xa0\x78\xd2\xe7\xcd\x83\x4f\x78\x65\xf1\x2b\x09\x6a\x1c\x58\x12\xc4\x82\xa0\xc2\x02\x78\xf4\x7a\x26\x3d\x08\x36\xb5\x15\xa3\x9e\x1c\xc3\x3f\x7d\x92\x17\xf4\x2c\x10\x0f\xe3\xbf\xe3\x50\x25\xd7\x19\x19\xca\xd7\x13\xca\x59\x0e\xbb\xc3\xc8\x40\x41\xc5\xa7\x80\x69\x91\xae\x8d\xd6\x05\xa9\xb2\x41\xe7\x61\x57\xfb\x85\xda\xb0\xc6\xc5\xd6\x8e\x96\x01\x44\x10\xa3\xc0\xd2\x11\xa9\x05\xbf\x31\x0c\x27\xe9\x6a\xc9\x1c\x77\xbe\xb2\xee\xad\xdb\x55\xc5\x65\x8f\xd5\xe3\x6b\x14\x50\xd1\xfe\xf9\xc9\x09\xf1\xe1\x4a\xf0\xcf\xd5\xe0\xfb\x6c\x8d\xe1\x43\x25\x70\x85\x90\x33\x7b\xa0\x78\xc7\xa2\xd1\xa4\x4b\x3f\x66\xbf\x5b\xee\xd2\x46\xdf\x6d\x26\x36\xa6\x0d\x5f\x20\xe2\xac\x33\x0d\x60\x8f\x36\xec\x1c\xff\xb2\x63\xa1\x72\x7f\x17\x68\x2f\x06\x77\x99\x6c\xfa\xd8\x17\x67\x6b\x1d\x94\x2f\x44\x20\xe5\x18\x09\x51\x80\x46\x76\x64\xf4\xae\xd6\xa1\x8b\xb5\x49\x39\xea\x2c\x37\x56\xd6\x61\xdb\xc6\xc2\x1c\x9d\xe5\x64\xdf\xf4\x7a\x1a\xf4\xdb\xac\xa8\x6b\x90\xa3\x26\x1b\x85\x96\x39\x9b\xdb\xb4\xb2\xb8\x35\x10\x0d\x6f\x44\x70\xee\x0d\x41\xfa\x25\x9c\xc5\xd1\x58\x78\x00\xba\x0d\xad\x9a\x4f\xef\x66\xa9\xa1\xab\xc0\xda\x58\x77\xe4\x78\x03\x6c\x85\x9d\x1a\x7c\x17\xc5\x01\x83\x04\x23\x09\x3f\xfb\xf0\x23\x12\xf8\x06\x20\x77\xd1\x8a\xee\x0f\x9f\x08\xd0\xbc\xc3\xfa\x99\x0f\xc0\x48\x5a\xef\xc5\x0d\xfd\xef\xef\x1e\xa1\x1c\xed\xe0\xa6\x5b\xeb\xab\x60\xd8\xd6\x5b\x0c\xb1\xdb\xdb\x87\xd5\x0d\x8f\x14\x4f\x30\x2c\x8e\x68\x4c\x5c\x10\x36\xba\xc9\xdb\xd1\xda\x8d\x04\x9b\x06\x40\x00\xbe\x88\x28\xe3\xf5\x5f\x49\xb7\xf0\x16\x45\xb3\x72\xac\x11\xdf\xdd\x0c\xcd\xc6\xb1\xcd\x73\xaf\x7a\xa7\x26\xf9\x58\x1b\x10\xf7\x50\xa3\x8f\xec\x19\xb6\x79\x51\xe6\x6c\x44\x87\x3a\x2d\x68\xd4\xf4\xda\x34\xe8\xff\x7e\xac\x61\x2a\x40\x46\x47\xbe\x4d\x08\x86\x71\xeb\xce\x2a\x4f\x83\x46\xea\x21\x1e\xe2\x7a\x8d\x25\x61\x23\xb5\x80\xc3\x84\xf9\x89\x24\x75\x48\x26\xf0\x95\x09\x5f\xed\x01\x37\x8c\xce\x42\xab\xc6\x37\x13\x37\x23\x99\x8d\x48\x3c\x63\xcd\x4a\xd3\xb4\x48\x48\xc9\xb8\x53\x9f\x71\xc0\x9d\x15\x86\x39\x69\xdf\x31\x56\xd0\x4a\xfc\xcc\xc6\x9a\xe1\x4d\xa4\xf3\x99\xda\x7b\x68\xd2\xbb\x3f\x7c\xfc\xb2\x09\xac\xc7\xcb\xc0\xb0\xef\x87\xdf\xbd\x04\xb6\xf3\xee\x0f\xbf\x7f\xd9\x20\xb3\x39\xe8\x66\x76\xa2\x56\xfa\xc6\xbe\xa8\x0b\xdb\x8e\x94\x45\xa6\xa3\xd8\xe5\x3a\xe3\xc7\x36\x4f\x27\x7e\x6a\x81\xc3\x28\xc2\x93\x60\xc4\x41\x98\xdd\xe3\x8d\x08\x6b\x64\xf2\xd9\x61\x0d\xd7\x5d\x57\xce\x64\x4f\x1a\x44\x2b\xbc\x1b\x12\x40\xd6\xf6\xc0\xdf\xf1\xed\xa5\x9d\xfe\x68\xdc\x86\x15\x7e\x07\xfe\x0d\xd9\xee\xbb\xb4\xf8\x1f\x6d\x33\xeb\x0c\xc0\xad\x5d\x94\xc9\x6f\x24\xa0\x14\x3a\x66\xb2\xff\xdf\x82\x4d\x14\xc4\xb7\x8c\x95\x36\x7e\x1e\x9f\xbb\xa9\x1a\x67\x39\xc8\x17\x1e\xc3\x41\xb8\xcb\x4e\x62\xd9\x24\x46\x95\xf4\x83\xf9\x04\xc0\x66\xf1\x37\x3b\x2d\xae\xf3\xd4\x2d\x0a\xe5\xb1\x5d\xaf\x45\xad\x69\x87\xa5\x3b\x94\x05\x8c\xe5\x54\x7a\x55\x6e\xec\x75\xb4\xa1\xd0\x71\x0b\x97\x41\x93\xde\x01\xe2\xde\xf3\xf1\xd1\xbe\xe7\x19\xc2\x1d\x80\xd1\x1d\x77\x04\xf4\xeb\x33\x82\xa4\xe8\x20\x78\x6e\xb6\x0b\x3f\x8b\xdf\xdc\x91\x68\x2a\xa0\x16\x43\x42\x86\xe6\x3c\x8a\x4c\x20\x5a\x31\x44\x01\x3c\x99\xee\xac\x92\xe2\xb7\xf5\x0e\x42\x0f\xe6\x1a\x60\x46\xdb\x8d\x68\x63\x66\x19\x8a\x99\x5e\x74\x8c\xd3\x43\xd2\xd1\xb7\x62\x91\x62\x1b\xea\xd0\x46\x2d\x20\x5d\x43\x64\x8b\x1b\x87\x95\x22\x29\x91\xf4\x7d\x4a\x0c\x00\x39\x1c\x71\x85\x81\xe8\x48\x97\x25\x1d\x93\xfa\x52\xd4\xa9\x6e\x9e\xb1\x96\xc2\x4e\x41\x6d\xb4\x55\x60\xf5\xb8\x88\x30\x0e\x45\x9f\x5d\xe7\x2a\xb0\x74\x58\xf3\x17\xaa\xde\xa8\xbd\x35\xd0\x9e\x08\x2e\xad\x7c\xf6\x37\x96\xbf\x7b\xa0\x6d\xfa\x2c\x05\x9f\x54\xbf\xc1\xd8\xca\xf8\x4b\xa4\x03\x8b\x3f\x85\x91\x3e\xf6\xcd\x74\xc4\xd0\xed\xe6\x8a\x7b\x6c\x71\x6d\x23\xf2\x07\x16\x53\x2d\x36\x10\xc3\xd8\x84\x62\x85\x63\x4d\xd8\xec\x2a\x31\x22\xf1\xa8\x19\xd4\xf8\xc8\x56\x41\x6b\x19\xa8\xfd\x66\xb9\x01\x0a\x5d\xab\xba\xcd\x17\xf9\x5a\x09\x1a\x45\x8b\x2c\x81\x47\xbf\xc9\xaa\x6d\xd5\x62\x89\xd7\xdb\xb3\x7a\x3f\x3e\x0e\x83\x0f\x85\xb1\x3b\x11\x44\x53\x1b\x00\x04\x06\x44\x30\x5a\xe8\x1f\x47\x3a\xcb\xe0\x06\x20\x13\xda\xef\xcc\xe9\xdf\xa8\xaf\x1f\x13\x7e\xfa\x09\x04\xcc\xf5\xbe\x64\x08\x5c\x11\xae\x3b\x6a\xad\x9c\x2a\xf6\xc8\xd4\x70\xf3\x94\xd5\xc5\x8e\xd7\xb2\x36\x36\x52\x35\xc3\x34\x05\xa2\xa1\x54\x41\x6c\x55\x17\x85\x48\x64\x07\x34\xdf\x89\xe6\x30\xe9\x75\x8f\x01\x63\xa7\x3b\x8e\xc1\x32\x32\x45\xfe\x77\xba\x96\x71\xe5\x73\xf4\x94\xc6\x4f\x68\x6c\x41\xc8\x8f\x6e\xb2\x1f\x06\xcd\x1a\xba\xa2\x45\x0d\x05\x99\x69\x55\xaa\xd0\x14\x02\xd5\x89\x35\xb0\x5b\xf8\xa6\x0a\x82\x8d\x6b\xd4\x2e\x91\x17\x6b\x8d\x1b\x9b\x89\xd2\x82\x62\x71\x23\x86\x42\x2f\x40\x7a\x1e\x6c\x0d\x85\x1b\x70\x73\x87\x8d\xb0\xae\x47\xb2\x33\x71\x94\x0b\x1e\x01\xbd\xc8\xc3\xdc\x15\xd3\x1f\xf7\xe5\xae\x48\x4b\xbd\xcb\xd3\xf6\xea\x75\x89\xa6\xdf\xdc\x65\x99\xc7\x16\xf9\x9f\x84\xdc\x0a\x20\xe0\x8f\x68\x90\x8f\x90\x65\xc9\x04\x19\xff\x1b\xfd\x60\x94\x2c\xbb\xdb\x97\x68\xdf\x01\x30\x84\xd5\x18\x00\x90\xa6\xa3\xc5\x5e\x77\xf5\x33\x46\x23\x84\x21\x33\xab\x6d\x41\x37\x23\x51\x59\xe3\xbb\xa8\xa5\x04\xf4\x77\xa8\xcf\x96\x8f\xbf\x77\x1f\x65\x94\x52\xd7\xa7\x96\xa1\xe1\xc1\x64\x9c\xe2\xbf\x69\x1c\x79\x70\xba\xfb\xc3\xff\x00\x96\x4c\x56\xa6\xe6\xc8\x7c\x60\x7e\x1b\x36\xac\x79\xec\xe8\x42\x54\x23\x52\x3b\xf9\x0f\xac\xff\x7a\x21\xae\x77\xfe\x0d\x4f\xaa\x08\xf3\x00\xb0\x44\x6b\x0b\xa2\x44\x09\xce\x76\x81\x8c\x98\xcc\xee\x3b\x06\xb6\x34\x74\x7e\xc6\x85\x72\x36\xae\xbc\x43\xe1\xbd\xe2\x5d\x9c\x1e\xdb\x0f\x6f\x03\xb0\x93\x6f\xcf\x6e\x1c\x6c\x88\x17\xa5\xab\xf7\xa4\x27\x8c\xcd\x0a\x57\x8f\xac\x9f\x1f\xc2\xdf\x62\xb4\x68\xaf\x7b\x3e\xec\x0e\x7f\x23\x05\xc5\xa0\x67\x3b\xf4\xf8\xd9\x18\x10\xc3\x9d\x9d\xac\xf3\x54\x43\x3b\xe9\xbe\x7d\x1f\x8f\x99\x37\x80\x87\x34\x99\x94\xe1\x11\xa1\xcb\x96\xa2\x78\xaa\x80\x18\x31\x6d\x84\xc4\x3c\x10\x32\x00\xf7\x22\xf0\xf1\xa2\xa8\x62\x14\x1c\x0e\x33\xa5\xa0\x3b\xc0\x2a\x35\x2b\x55\x02\xf5\x5e\x51\x53\x8a\x93\xdc\x39\xc4\xa4\xaa\x19\x99\xe1\xd1\x6e\x85\xe6\xb8\x7b\x77\x2c\x7c\x8b\x88\xe2\x10\xcb\xce\x05\x5d\x93\x91\xd4\x6f\xeb\x3d\x7e\xeb\x18\xeb\xdf\x99\xae\xa3\x79\x2e\x2e\x12\x23\xdd\x51\x02\x29\x89\x3a\x8b\xbb\xb4\xdd\x3f\x8b\x5e\x72\x15\x06\xb3\xab\xbf\xb4\x21\x7c\xa5\x68\x04\x42\xce\x9c\xce\xea\x55\x5c\xa1\x10\xa1\xf2\x20\xad\xc7\xa3\xdc\x71\x84\xe7\x8e\x2d\xd6\xd8\xf3\x9a\x24\x2d\xe9\xca\x74\x95\x60\x03\xea\x41\x94\xed\x3f\x86\x66\xa2\x11\xd3\xbd\xaf\xcb\xc0\xa6\x7f\xf4\x3b\xb2\x17\xec\xf1\x84\x6e\x53\x7d\x4b\x67\xeb\x0b\x95\x7b\x57\xca\x32\x67\x0a\xec\xb7\x25\xc2\xc6\xe9\x07\xff\x76\x37\xfb\x70\xf2\x63\x12\x98\x57\x04\x74\xd9\xea\x46\x82\x8f\x7b\x75\x43\x41\x9d\xbd\xfa\xa1\x7e\x9d\xcc\xea\x4e\xd1\x4f\x08\x03\xbb\x84\xb3\x30\xb3\xac\x03\x80\x43\xc4\x8f\x9a\xce\x62\x79\xfd\x4b\xbb\x0d\x7d\x16\xfb\xd3\xf2\x6a\xdb\xc1\x40\x5e\xf6\x8a\xd7\x89\xef\x08\x4b\xad\x32\xd2\xd3\x11\x71\xc1\xa7\x77\xd1\xe2\xa6\xab\x30\xbc\x8d\x0d\x56\x2b\x0c\xeb\x24\x1a\xa3\x4f\x9f\x46\x36\x2e\xe4\xb4\xc3\xf2\xc0\x14\x38\x2c\xb5\x4b\x7f\xa6\xeb\xf2\xf2\x4d\x95\x7e\x40\xee\xf5\x64\x9e\xfe\x61\xbc\x3c\x8d\xe1\x4a\x84\xdf\x0f\x3e\xb8\x78\xd5\xd2\xd3\x8c\x20\xa2\x9d\x7e\xc5\x59\x1d\x28\x62\x35\xa0\x71\xea\xbd\xe3\xe8\x2a\x2e\xf8\x4d\x10\x87\xec\xfd\x2d\xfc\xdf\xbd\xb2\xbc\x97\x65\xef\x8f\xac\xd9\x71\xa9\xa2\x87\x1b\xb7\x23\x70\xfa\xd7\xf7\xc2\x1e\x42\x2e\x7f\x6c\xc7\xc8\x70\xc4\x1f\x90\x8d\xa4\x57\xe8\x35\x69\x65\xe8\xf9\xda\xb6\xbb\xfe\x85\xef\x39\xac\x98\x1c\xa5\x60\x06\x39\xf0\x75\x30\xc3\x2a\x8f\xa7\x1d\x0b\x48\xc1\x97\x38\x52\xe0\x0d\x13\x12\xdb\x3a\x66\x1a\xed\xbb\x83\x5b\xf8\x36\x5a\xb9\xcd\x5e\xf3\x5e\x7c\xe4\x03\x29\xc4\x3d\x5f\x8c\x54\xdb\x23\x83\xb8\x91\xff\x5b\x64\x90\xb1\x71\xfb\x67\xbb\x57\x00\x49\x5e\xe5\xab\x7c\xfa\xef\xf0\x1f\xfa\x6b\xf2\x4a\x17\x0b\x8c\x02\x6d\x83\x33\x62\x36\x11\xfc\xfa\x5e\xf4\x99\xd7\x85\xe5\x08\x7e\x64\xa6\x69\xd8\xb0\x8c\xfc\x6a\x1a\x09\x49\x0d\x1c\x29\x5c\xfa\x0e\x25\x0c\xbc\x87\x6b\xcc\x4b\xb1\xa2\x18\x27\x9c\x58\x0c\x48\xe2\x99\x5a\xd1\x2e\xec\x08\x36\xd0\x79\x94\xc6\x11\x10\x3d\xc9\xeb\x06\xe3\x52\x9e\xea\xe0\x92\x4b\x46\x34\x4b\x4c\xb9\x81\x4d\x14\x88\x45\x8a\x8b\x84\x73\xa7\x2f\x6c\xfa\xe6\x92\x0c\xd2\x77\x0e\xa6\x70\xaa\x63\x3b\x41\xe4\xa2\xa3\x9e\xad\xe9\x7a\x6c\xa9\x81\xf6\xd8\x39\x89\xfd\xee\x7a\x9b\xee\xc3\x94\xbd\xfc\x4a\x38\xda\x95\xf0\x2a\xfc\xda\x8c\x11\xc6\xa8\x37\x8a\xda\x4e\xa3\x5a\xab\x94\x78\x34\x32\xf9\x96\xa1\xe8\x95\xe4\x6e\xc3\x76\x59\xc0\x9a\xf2\xb3\x82\x54\x47\x9c\x4b\x2d\x08\xb4\xb1\xc7\xd9\xbc\x6b\x01\x0c\xdc\x35\x88\x3b\xb6\xab\xb5\xb5\xf8\xb9\xa4\x89\x76\xcc\x7a\x38\x05\xd5\xe4\x51\xab\xbf\x25\xbe\x1e\x06\xf3\x5c\xe8\xd9\xc7\xec\x3c\x29\xc0\xec\x26\xc9\x9c\x31\xca\x8e\xc2\x18\x4f\xd2\x2f\x3a\x26\xf7\x3e\x19\x1d\xaa\xf1\xf2\x89\x3f\xc7\xfe\xcb\xb7\x3d\x56\x02\xc4\xc8\x73\x98\xcc\xbe\x87\x9e\xc3\xae\x27\xd7\x76\x1b\xec\x2e\xeb\x8a\x43\x8b\x7a\xaf\x64\x46\x5b\x58\x8a\x53\x36\x9a\x55\xd0\x96\x4d\x38\x81\x10\x5c\x2f\xc9\x09\x92\xfb\x4f\x41\x88\x76\xdc\x3e\xd6\x37\xa1\x3f\xd7\x9e\x2a\x13\x0a\xc2\xef\x7c\x82\xf6\xd5\x22\x4b\xb3\xe9\x0b\xb2\x23\xdb\x57\x07\x37\x6d\x7a\xf5\xe7\x36\x9e\x6b\x5c\xa7\xab\xe8\x15\x8c\x4c\xb6\xbb\x9a\x22\x0f\xf8\xaa\x4b\x63\x56\x8d\x4b\xc9\x09\x4c\x1d\xd9\x7e\xba\xcf\xa7\x79\xcb\x35\x1e\xf1\x17\xca\xf5\xe5\x3f\x83\x78\x9d\x2f\x7c\x6a\xc5\x17\x5e\x58\xad\x46\xb6\x50\x6c\xaf\xc7\xf2\x3a\x5a\xcf\x0a\x57\x17\x3d\x1e\x6c\x6e\xca\x23\x6b\xec\xe7\xdd\x20\x00\xb7\x0c\xfb\xc5\x26\x98\x39\xa3\x36\xa7\x64\x2e\x7f\x1c\x54\xd7\x3c\x04\x67\x5e\x98\x5f\xbe\x81\x95\x1e\x04\x81\x9b\x6d\xbe\x44\x96\x97\x1c\x2c\xa3\xb3\xc6\xbc\x00\x48\xe3\xfc\x2b\x1c\xb1\xba\x9b\x04\xd3\xc4\x23\x7a\x1a\x24\xa9\x70\xf8\xc6\x55\x11\x23\x0a\xbf\x49\x72\x57\xc7\x76\x48\xc2\xa2\x20\xab\xf8\x9b\x03\x12\x05\xfc\x65\x1e\xcc\x50\x65\x1b\x24\xa2\x99\x9f\x00\x06\x28\x32\x28\xf8\xc6\xb9\xaf\x5c\x0b\xbc\x36\x56\x1f\x23\x39\x6b\x38\xe0\x14\x5d\xc6\x60\x61\xa8\x2b\x47\x5f\x1a\x4c\xab\x45\x34\xc5\xbd\x86\x6e\xd0\xa0\x7c\x83\x42\xeb\xdb\x1b\x1a\xeb\x9f\x46\x1a\xa3\xa2\x85\x3f\xc0\x1a\xe3\x36\x51\x7d\x97\x90\xec\xb6\x95\xc5\x6c\xac\x97\x71\x86\xd3\xd7\x50\xa4\x04\x7a\x65\xa6\xd0\xb8\x28\x48\xb2\xea\x8c\x61\x40\x37\xb0\xf7\xce\xea\x1e\xf5\xd6\x88\x96\x31\x36\xaa\x1f\x8f\x15\x6c\xe3\xfb\x66\xd5\xa6\xe3\x5b\x47\x2d\x67\xe4\xd3\xa4\x7d\x68\x26\xd8\x3d\xbf\x87\x18\x00\x6a\xc9\x02\xf7\xcd\x9d\xba\x55\xf7\x3b\x95\x83\x71\x9b\xb5\xb7\x17\x69\x42\x3b\xd6\x63\x42\xc3\xdd\x06\x81\xc6\x86\x21\xdb\xdf\x07\x4f\xa2\x69\xb7\xe8\x98\xda\x52\xb8\x08\x34\x40\xb5\x1b\x79\x43\x5f\x9f\xdc\xd8\x19\x2a\x4f\x75\x9d\x2f\x38\x8f\x1d\xb1\xd9\x37\xd7\xa7\x70\xc0\xb6\xd1\xfd\xe2\xc4\xfe\xbd\x1a\x6b\xe8\x57\xce\xa7\xf9\xc4\x87\xd5\x90\x5d\x04\xe0\xc0\xf7\x47\x51\xf1\xd5\x6a\xb7\x15\xaa\xf7\x1f\x18\x4a\xec\x3f\xd3\xff\xc0\xbb\x08\xff\xe4\x80\x79\x7f\xfa\x4f\xa7\x1f\xaa\xcd\x68\x14\xb5\x83\x51\x5f\x58\x95\x52\x6b\xde\x90\x10\xe5\x90\x1c\x1b\xc3\xd9\x3a\x32\xcb\x6f\x62\xc5\x8e\x0b\xdd\x21\x06\xca\xc0\x10\x62\x45\x0c\xbc\xb9\x15\xa1\x7f\xb5\xd0\xeb\x96\x4e\x25\xc0\x5b\x99\x22\x5b\xbe\x1d\xbe\xdb\x1f\xea\xb9\xde\xad\x25\x5f\xde\xee\xf2\x1f\x55\x80\xa9\x29\x05\x30\xc5\x65\x45\x25\x50\xc3\xfe\x5e\x2e\x11\xb1\x8b\x2b\xca\x04\x3b\xf2\x31\x1c\xa1\xea\x00\x67\x93\x54\x8c\x30\x42\x27\x89\xb3\xbc\x0a\xa2\xce\x05\x84\x0e\xf5\x69\x9c\x8a\x85\x49\x04\xac\x7f\x0e\x1c\xef\xaf\x55\xec\xfc\x31\x68\xd2\x3f\x5a\xd7\x41\x8b\x3c\x8d\x78\x06\xed\xeb\x6d\x92\x86\x18\x39\xd6\xa0\x58\x4f\xee\xe1\x2c\x85\x6f\x6a\x80\x71\xba\x97\xc6\xbe\xe4\x38\x3a\x46\xf8\x63\x45\x9d\x8c\xde\xf7\x5f\xd9\x33\x99\x9e\xa3\xf9\xad\x67\xe3\xf3\xf7\x89\xb9\x22\xcd\xc2\x64\xc3\x9a\x1c\x16\x21\x8b\x0c\x5c\x47\x22\xab\xd0\x12\xaa\x68\x9a\xed\x76\x3d\x89\x2e\x58\xd5\x9c\xe8\x9a\x1f\xa8\x51\xa1\x4e\xc0\x91\x2f\x30\xf8\xe8\xb0\x9a\xb3\x8c\xa6\xba\x43\x1f\x55\x82\x89\xb2\x1b\xa4\xb2\xf3\x6a\x80\x03\x14\x65\xc2\xa0\x15\x3e\xd1\xeb\x70\xb4\xf0\x74\x5e\x60\x3e\x38\x76\x34\xb0\x46\xfd\x98\xba\x02\x73\x47\x54\x7d\xb0\xd6\x14\xad\x88\x33\x9a\x05\xb1\x7e\x6f\x1a\xe2\x77\x30\xc4\x91\xf3\x16\x40\xe3\x0d\x76\x20\x84\x39\xb3\x67\xc0\x0d\x83\x05\xa1\x58\xf1\x65\x84\xd7\x45\x81\x60\x81\x91\xd9\xf9\xba\xa8\xf4\x18\xce\x00\xf1\x9a\x3c\x23\x5a\x09\xdd\x31\x41\x71\xea\x13\x1f\xdf\xab\x17\xfa\x4a\x80\xf6\x93\x01\xc3\x10\xda\xbb\x93\xbe\x22\x26\xc8\x41\x2d\x8b\xbd\x70\x89\x2c\x3e\xa0\xb7\xac\x6d\x72\xd0\x0b\x89\x41\x7a\x47\x34\x89\x02\x51\xd1\x8b\x12\x41\x58\x66\x14\x26\x26\xe3\x03\x45\x57\x2e\x90\x56\x14\x25\xc6\x61\x39\x97\x16\x78\xb7\x19\xeb\x20\x94\xab\x1f\xda\xf9\x59\x91\x3e\x42\xd7\x7b\xa3\x96\x05\x13\x8b\xb7\x68\xe8\xd4\xd6\xab\xc8\xbb\xf4\x8d\x5a\xa1\xb4\xef\xf7\x29\xf2\x36\x8c\xbd\x79\x7e\xe3\x46\x8d\xed\x51\xe7\xd0\x52\x1e\xc4\xac\x28\x76\x41\xc0\x8a\x9d\x1d\x63\x6f\x4f\xbf\xbb\x45\xa8\x0c\xca\x0e\x07\x5b\x59\xc6\x9b\x80\x77\x16\xc3\x52\x60\x55\xbc\xf6\x28\x6f\x1c\x58\xae\xe0\x20\x32\x34\x49\x95\xbf\x9d\x1d\x29\x20\x82\x67\xfe\x08\xfc\x7b\xd3\x23\xaf\x22\x5c\xed\xfd\xa2\x48\xc9\x3b\x3a\x7d\x95\xc3\x9f\x73\x8d\x8a\x0e\xa2\xbb\x6b\x0d\xff\xa9\x80\x34\x9e\x00\xf6\x48\x2d\x2c\xf4\xbb\x0c\xc1\xe3\x26\xe4\xe8\x54\x2f\xfb\x84\x02\xaf\xbc\xb1\xd2\xe5\x00\xba\xb6\xa3\xf1\x18\xb7\x63\x97\x9c\x4d\x1b\x7a\xf4\x37\x10\x97\xd4\x8a\x38\xc3\x08\x17\x8f\x74\x73\x5b\xb4\x9f\x91\xc7\x76\x48\x35\x82\x00\x26\x63\x81\x4b\x02\xd9\x04\x73\xc2\x04\xb6\x1a\x41\x48\x3f\xd2\x99\xf7\x0e\x55\xed\x6f\xda\x0b\x04\xd6\x6b\xc8\xb1\xca\x24\x10\xd6\x10\x30\x62\x7b\x11\x09\x07\x36\x14\xa6\x4d\x3d\x66\x92\xb0\x7f\x8e\xa3\x2d\xc3\x47\x19\x1f\x18\x7e\x8d\x6e\x52\x25\xf9\x18\x10\xea\x93\xcd\x3a\x88\x43\x04\x0d\xd2\x5e\x8f\x61\x22\xc9\xa9\x2d\x3a\x88\x7c\x4f\x60\x31\x3b\x47\xf6\xd9\x1a\xdf\xca\xe3\x91\x4d\xb4\x11\x62\x02\x11\x98\xcc\xe3\x39\xd3\x61\x68\x84\xcc\x06\xf1\x81\xb9\x1a\x9a\x21\x7b\x75\x0a\x66\x47\xf0\x2e\xfd\xf8\x8a\x39\xef\x1d\x44\xcf\xc1\x7c\x2d\xb0\x11\x68\xf9\x29\x32\x66\x7f\xff\x27\x91\x44\x84\x72\x00\x45\xd9\xe7\xec\x67\x41\x06\x46\x9b\x13\xc1\x06\x56\xf7\x84\xf5\x00\xe4\xbb\x0c\xb3\x37\xf5\x1d\x81\x04\x80\x46\xc7\x9d\xc4\xb0\xf9\x4a\xcf\x51\x71\xe2\x20\xfa\x15\x69\x58\xde\xb2\x86\x45\xaf\x7a\x0a\x18\x51\xae\xc6\x5a\x18\x7e\xdf\x5f\x9b\xcc\x50\xe0\x08\x6f\x09\x50\xda\x9c\xe9\xf8\x27\x3a\xf4\xa7\x47\x4f\x8f\x9f\xa5\x1d\x66\x67\x07\xdc\x71\xf9\x66\x92\x3e\xce\xb6\x1c\x99\x0c\x0d\x8a\xaf\x5e\x2f\xc8\xac\xa3\x42\x8c\x8b\x61\xb8\x0e\x6c\xa8\x52\x34\xce\xa4\xd0\x70\x51\xa8\xd2\x66\xad\x17\xf9\x49\xbe\x62\xeb\x46\xe0\xb0\x16\x1c\x91\xfd\x22\x08\x0c\x90\x3e\x27\xeb\x49\xe8\xde\xa4\x14\x6e\xb6\x84\x93\xda\x71\xdc\xc4\xcd\xcd\x7e\x36\xce\xe9\x9b\x33\x8f\x49\xf8\x1b\x5e\xf4\xf5\x2f\x68\x49\x10\x12\x73\xde\xc7\xf8\xe2\xdd\xb4\x9f\xfd\x06\xc3\x28\x57\x7c\x67\xb8\x03\x8a\x4d\x4b\x23\xa3\xde\xfa\xcc\x45\x8e\x5a\xe9\xe0\x01\x19\x24\xa8\xf3\x15\x7a\xf5\xc3\x34\xa3\xc7\x64\x7a\x0b\x55\xd2\x64\x29\xfe\xc9\x29\xc0\x2b\xb5\x7b\xc7\xcd\x1b\x4c\xd4\x5e\xbb\x7f\x8f\x97\x76\x0b\x6a\x22\x5d\x4d\x28\x7d\x2b\xf4\x97\xc3\x11\xa1\x0b\x7a\xd3\x4a\xb0\x51\x1b\xeb\x26\x7f\x47\x1b\xde\xac\xa7\x18\xd8\x14\xf6\xf8\x44\x15\xb0\x72\x54\xe9\x5b\xd0\x72\xb1\x4b\x49\x0d\x42\xa9\xa4\x39\x1a\x29\xa5\x87\x75\x41\x3d\x83\x60\xcf\xc3\x03\x7e\xd7\x14\xec\x36\xe0\xf4\x25\x46\xca\xab\x91\x1d\x71\x97\x11\xd0\xe0\x09\x30\x26\xf4\xda\x68\x27\x87\xec\x0f\x8a\x53\x86\x02\x5b\xb5\xfe\x65\xbe\xd1\xab\xae\xca\x0e\x38\x84\x30\x00\x2f\x86\x16\x23\x76\xc4\x1e\x5f\x1e\xf6\x32\x9c\xaa\x7d\x6d\xf6\x46\x35\x63\x75\xe0\x7a\x62\x88\x1f\x8c\xf5\xb7\xb9\x7a\x7d\xf5\x97\x61\x1d\x7e\x25\x6b\x28\xf4\x6f\x1e\xab\x5c\x6d\x95\x35\x27\x92\x42\xbe\x93\xf4\xf6\xe8\xcb\xd6\xb4\xc3\x7a\x73\x93\xc1\x59\x5f\xbd\xc6\xa0\xd4\x24\xde\x8c\xa8\x6f\x85\x95\xb4\x31\x56\x97\x81\x32\x57\xac\x88\xd8\x0f\x9c\xbc\x32\xa0\x14\xf3\x51\x72\x08\xd6\xb7\x40\x94\xdc\xb3\xf8\x46\xc2\x24\xda\xe4\x76\xf2\x4c\xe1\x5d\xaa\x38\xb1\x2f\xe1\x0d\x7f\xe4\xf8\x30\x42\xfe\xda\xe7\x19\x07\xc4\x0f\x95\x20\x58\x8d\xf9\xc4\x68\xbf\x65\xe2\xec\xd4\x2e\x93\xbf\x07\x02\x9e\x85\x80\x4a\x53\x1c\x4a\x52\x72\xb0\xe8\x24\x26\x70\xe9\x66\x67\x28\x78\x80\x98\xf6\xa6\x87\x44\x3b\xb1\x2d\x7b\x9d\xf4\x6c\x7f\x0f\x3c\x50\x61\x37\x9c\x2e\x73\x64\x22\x61\x7c\x33\x59\xd6\xb0\x52\x14\xa2\x74\x58\x4d\x98\x3e\xa9\xed\x1e\x53\x07\x28\x2c\xa0\x1f\xbc\x76\x0a\x9d\xb8\x83\xcb\x55\xe8\xd0\xd6\x00\xa4\x6b\xfb\xdc\x82\x04\xc0\xea\x99\x50\x7b\x89\x21\xc0\xe1\x58\xbf\xff\xee\xdb\x03\xf7\x34\x87\xa8\x23\xb2\x35\x30\xee\x5e\xfb\x74\x03\x74\x75\x0b\x35\x49\x9d\x6a\x84\xb1\x5b\x40\x13\xda\x03\xca\x57\xf0\x16\xf9\x73\xda\xe9\x13\xd1\x0f\x62\x08\x5a\x0e\xd8\xc7\x6a\xb2\x75\x9c\xe2\x98\xc8\x44\x80\x6f\x3f\xf8\xe6\xf8\xe9\xe1\x41\xfa\xd3\xbd\x57\xaf\x5e\xdd\xc3\x3e\xee\x75\x35\x90\x62\x5c\x04\xdc\xd0\xff\xe7\xc9\xb7\xa9\x6a\xd7\x93\x0f\x2d\xa9\x09\x30\xef\x19\x26\x51\x10\x73\x3b\x4a\x70\x53\x51\x60\xc8\x9b\xc9\xce\x21\xbd\x3f\x52\x88\xde\x57\x31\xa1\xed\x91\x1c\xb9\x78\x4e\xc1\xcc\xae\xbb\x11\x83\x8b\xa7\xec\x43\x05\xf5\x2b\x34\x7a\x51\x6b\xd4\xda\x07\xd1\x6f\x83\xaf\xc0\x23\xad\x6e\x4e\x51\xd0\xaf\x9c\xc3\x90\x6e\x3a\x83\xf0\xf9\xbd\xca\x81\x05\x70\xa0\x0d\xdf\x68\x1b\xfc\x0f\x58\x83\xf9\x36\x05\xf9\xa1\x60\xae\xa6\x8f\x5c\x85\xb7\x80\x33\xfb\xbc\xdf\x9e\x42\xa5\x98\xaa\xd8\xc2\x6d\xac\x82\x2c\xed\x9e\x3e\x30\x34\x3a\xd2\x60\x5f\x00\xfb\x1d\x51\x1a\x4a\x8d\xe8\x9e\xec\x21\x7d\x3c\x39\x2f\x74\xa2\x80\x18\xb8\x9f\xf7\x3a\xe0\xcc\x04\xc0\x22\x02\xfa\x28\x91\xaf\xa1\xbc\x04\x07\x6c\x47\x69\xfb\x1a\xb6\xea\x59\x7e\x8c\x7f\x97\x60\xef\x83\x78\x29\x12\x80\xd2\x99\x47\x0c\xb6\x37\xb2\x47\x3a\xda\x63\x86\x74\x43\x1b\x51\x8b\x40\x49\x2a\x25\x29\x9b\xe0\xc3\xba\xc8\x00\x07\xd3\x2e\xda\x12\xc4\x8c\xf8\xaf\x75\x25\x3a\x48\xbb\xca\xff\x4d\xd6\xc9\xe2\xa9\xeb\x7e\x92\xf5\x09\xfe\x34\x75\xf0\x94\xa6\xb3\xc1\x3e\xe1\x39\x5b\x6f\xbf\x51\x18\xe0\xa7\x14\xcf\x00\x48\xd0\x7f\xa2\x27\x99\xe9\x25\xbc\x76\x68\x8d\x52\xe3\x72\x36\xdc\x58\x0c\xe4\x9c\xb9\x2e\xb6\x60\x56\xa3\x51\x1d\x0a\xc1\xc3\xd4\x29\x43\x8c\xc5\x51\x04\xe0\x60\x04\x80\x0f\xe4\x4d\xc7\xd2\xf1\x2d\x62\xb0\xf6\xf2\xe2\xfa\xd7\x1e\x8b\x4e\xf8\x35\x16\x1b\x6f\x62\x34\x26\x03\x44\x6e\x79\x7c\x8b\xc8\xf7\xf2\xa4\x52\x3f\x1a\x70\x8c\xcb\x23\x72\xaa\x47\x04\x54\x3b\xd2\xbb\x98\x5f\x76\xa8\xb2\xbc\x54\x4e\xde\xd3\x19\x27\x7e\x80\xfd\xc0\xbf\x42\x4e\x83\xe6\xe3\xb0\xd8\x80\x5c\x91\xe7\x36\xa1\x14\x4f\x89\xac\x38\x83\x8f\x57\xa7\xac\x24\x0a\x7d\x23\x8e\xb1\x3a\xc5\x71\x24\x53\x59\x61\x07\xe3\x30\x60\x3d\x74\xc5\x71\x6e\x6d\x90\x61\xd5\xff\x9c\x99\x52\xe5\xd5\xf4\xa1\xa1\x4c\x44\x03\x5c\xb7\x54\x55\xa5\x8b\xe9\x63\x4c\x1e\x58\x84\xdb\xb6\x2e\xcc\x36\x4e\x2d\x84\x5c\x2a\xdc\x10\x09\xe0\x13\xad\xd2\x57\xef\xc7\x44\xdf\xd3\xc8\x37\x10\x9c\x3a\x36\x46\x5a\x2a\x0a\x57\x6f\xd1\xa4\x0d\x63\x8c\x29\xb7\x5a\xe6\x52\xc5\x1f\x56\x8c\x04\x59\xae\xb4\xf1\x77\x83\x08\xe2\xc1\xa6\x51\x64\x2d\xbf\x38\x89\xd0\xed\x03\xe5\xc7\x33\xa8\xd8\x32\xfd\x4c\x13\x42\x77\xa0\x1c\x69\x8d\x42\x4b\xb7\xb1\x05\xc6\x71\xd7\x5d\x8d\xb1\x28\xf1\xe3\x93\x88\xe3\xc4\x87\xed\x7d\xb0\xf8\xc7\x23\xdb\x7d\x9b\x80\xf1\xd1\x31\xee\x8d\x07\x1f\x77\xfb\x8e\xc8\xf0\xe3\x87\x1c\x4b\x9f\xbf\x01\x3a\xf6\x5b\x85\xed\xd9\xae\xc8\x38\xcc\x89\x9e\xc8\xf0\x80\xb4\x09\xb0\xb2\x41\xef\xa9\x38\xd6\xf2\xb8\x26\xe8\x1d\xf2\xe7\xd8\x2c\x7b\xe1\xe5\x87\xe7\x38\x6e\x50\x96\xe5\x27\x27\x93\x79\x6d\x5e\x35\x18\x8d\xbd\xab\x17\x64\x8c\x4e\x26\xc2\xba\x4d\x77\x12\xc1\xec\x82\x22\x98\x6d\xb9\x36\x07\x36\x99\xd6\x26\x03\xf1\x87\x8b\xd8\x04\x6a\x2a\xb1\x7a\xa8\x88\x8c\xc1\x49\x4d\xb4\x51\x80\xe2\xe7\x00\xa9\xdf\x99\x5d\x66\x13\xc4\xd1\x93\x81\x64\xfb\x44\xe3\x70\x7c\x92\x3d\x9f\x70\x53\x0c\x68\x31\xc3\xbf\x28\xc8\x7c\x33\xfd\x9e\xbc\xce\xd0\xac\x49\xb5\x68\x7c\x04\x0c\x68\xed\xba\x42\x29\x04\x95\xa0\xbe\x65\xb3\x2e\x40\xf2\xc0\xe0\x5b\x34\x22\x70\x4b\x14\x33\x20\x08\x01\xe6\xeb\x76\x15\x70\xc6\x3a\xe3\xda\xdf\x68\x8c\xae\xcb\x11\x7b\x30\x56\x97\xd4\xc3\x39\x88\x33\x99\xd5\xa3\xdf\xcd\x5c\xb0\x12\x91\x9f\x1c\xbf\x03\xc4\x2d\x73\xf6\xf8\x8e\x25\x82\x06\x16\x4c\x91\xb5\xb2\xfd\xa8\xb0\x02\xb0\x5b\xf3\x3a\xae\x20\xc7\x03\x58\x14\xfe\x77\x79\x5e\xbb\xc9\x53\x68\x31\x4e\xc2\x65\x83\xa8\x49\xd4\x2b\xfa\x2c\x09\xb8\xd6\x14\x9d\x09\xee\xe8\x57\xf8\x0c\x81\x5f\x52\x5f\x88\x3a\x73\x05\x37\x18\xc3\x41\xe5\x18\x48\xc4\xa4\x14\x50\x8d\x7b\xc0\xf8\x6a\xa5\xaa\xb6\x36\x92\x07\x48\xe1\xfc\x18\xe7\x83\x91\x71\x3c\x00\x1a\xbe\xda\x3a\x83\xea\x33\x7a\x1b\x20\x63\x3a\x89\x16\xe4\x12\x10\x01\xbb\x87\x77\x87\x7b\xb8\xfe\x25\xb1\x71\xe4\x26\xc3\x78\x72\xf6\x0b\x47\x09\xa4\xbf\x25\xc3\xd2\xa6\x5f\x25\xab\xd5\x49\x8b\xb6\xff\xf8\x12\xee\x4a\x61\x91\xb6\x1d\xa9\xc9\xe5\x5d\x13\x83\xc2\xd5\x3e\x82\x1d\x1e\xee\x9c\x2c\x1c\xd4\x9c\x6c\x2f\xdd\x07\xb2\x99\x15\x19\xd9\x15\x2a\x94\xfd\xa7\xfe\xc8\xfc\x41\x5a\x0f\x14\xef\x65\x72\xb7\xc1\x38\x36\x72\xb7\x07\x93\xe6\xab\x36\x1b\x0b\x13\x18\x2e\xdd\x1b\xe5\x62\x74\x05\xe0\x1a\x6b\xb1\xcc\xcc\x3a\xb4\xcc\xdc\xb1\x81\x00\xfa\x85\x53\x58\x7f\x1e\x64\x12\x2d\x22\xe8\xe3\xa1\x6e\x15\xad\x32\x2d\xcc\xa9\xc4\x2f\x13\x25\xa9\x04\x82\x76\xa2\xc9\xf5\x2f\x25\x79\x35\xed\x3a\xa8\xc5\xcc\x39\x25\x96\xda\x6c\xc9\xf2\x53\xf2\xeb\xf2\x28\xad\x3a\x8d\x64\x6c\x89\x08\x11\x7c\x27\xb9\x0e\x73\x43\x46\x6d\x7a\x71\x1b\xa2\xa0\x8d\x12\xe6\xd0\x66\x56\xb1\xc6\xa4\x6c\xf1\x69\x3f\x92\xfc\x32\x5c\x75\x44\x16\x6d\x61\x4c\x0a\x6d\xa9\xd8\xe9\xa9\x75\xa3\x22\xd0\x21\x74\x20\x11\xfb\x5c\x39\x4a\x96\x28\xf1\x1c\x72\x10\x0b\x1e\x75\x32\x19\x01\xb9\x38\x3f\xc5\xfa\x06\xf8\x0b\xda\xc8\x76\xbc\xc8\xae\x7f\xc1\x1b\xc5\xc6\x13\x44\x4e\x42\x08\x92\x67\x43\x84\xaa\x0d\x1b\xf1\x32\x34\x70\xbc\x69\x87\xf1\xfd\xac\x7a\x76\xd8\x6e\x60\x4c\xa6\x08\xa2\xc2\x0b\xb1\x31\x41\xb3\xa5\x01\x90\xa2\xf5\x2b\x5f\x2f\x6b\xfe\xba\xea\x5d\x33\x82\x30\x7b\xd1\x2c\x33\x3d\xbc\xa2\xcc\x0a\xdb\x7a\xf6\x15\x75\xf4\x66\x8c\x3c\xd3\xec\xad\xb3\x4f\x41\xec\x36\xab\x71\x3a\x10\xa6\xcc\xa8\xe3\xda\x5c\xbe\xc9\x54\x04\x66\x6a\x9c\xdc\x0e\x46\x73\xc9\x99\x6c\xf7\x83\x5c\x6b\x42\x57\xcd\x7b\x83\xcb\x11\x5b\xc9\xfa\x2e\x10\xf1\xe2\xc3\x2d\xcf\x04\x80\xbb\xc7\x25\x0d\xfa\x11\x77\x83\xbe\x2b\xb1\x0d\x9d\xcc\x9e\x05\xbe\x9d\x75\x15\xb5\xf1\x07\xb7\xa4\x1f\x77\x22\x6d\xf2\x83\xa9\x4f\x5f\xfa\x84\xd7\x71\x14\x1a\xff\xae\x42\x35\x5c\xc6\x48\x5b\x0d\x13\x47\xba\x40\x6e\xbd\xca\x61\xde\x80\xe3\xd5\x06\xe3\x28\x5e\xb0\xad\xd0\xd6\x57\xb5\x99\xe2\x24\x49\xc0\x05\xb9\xe2\x47\x39\x02\x30\xeb\x1d\x8b\xf6\x94\x60\xd7\xd9\x7e\xfb\xa7\x24\x8e\xde\x6a\xcd\x84\xbf\x67\x39\xcc\x24\x6b\x10\xb7\x0b\x8c\xd5\x9e\x61\x94\x87\x6a\x83\xa1\x1f\x1b\x53\x6a\xb4\x89\x42\x49\x81\x62\x4f\x6a\x56\x2f\x2f\x0d\xe5\xee\x6e\xa6\xcf\x80\x5f\xdd\x26\x14\xa5\x50\x5e\x9d\x9a\x29\x3d\x32\x21\xe9\x91\xf2\x28\xed\x6c\x24\x2e\x07\x01\xf6\xb0\xbb\x41\x44\x5b\xcc\x00\x4d\x7b\x13\xb8\xa2\xb8\x9c\xe1\x51\xa2\x70\x2e\x1e\xab\x16\xc7\xb1\x96\xad\x47\xfd\xa7\x37\x72\xdb\xd8\xfc\x51\x3b\x0c\x19\xc2\xb9\x6a\x6d\xf6\x69\xef\xde\x8e\x89\x0a\x26\x7e\x1c\x2f\xc2\x8b\xa1\xbc\xb5\x2d\x61\x5b\x07\x9a\x3a\x55\x8e\xa2\x49\xb3\x91\x83\x41\xdb\x3f\x64\x78\xae\xff\x14\x3e\xeb\x97\x1c\x13\xba\x0d\xba\xf8\x7c\x34\x11\xee\x30\xb5\xba\x0d\x2c\x2e\x86\x67\xff\xa5\xe8\xe2\xfd\xee\xfa\xb1\xc5\x47\x6c\x99\x6f\x65\x32\xbe\x27\x6f\x6a\xa8\xdc\xb7\x09\x54\x39\x7a\xeb\xc0\xac\xd8\xa5\x55\xfd\x9e\x7c\x31\x48\xc5\xba\xdf\xe8\xd8\x62\xd5\x31\x7b\xdf\xb8\xee\x58\x26\xcc\x60\x17\x06\xd8\x4a\x74\x16\x91\x55\x1e\x5b\x31\x43\xab\xdf\x6c\xc4\xec\x6f\xe4\x50\xdd\xb2\x3f\x53\x27\xab\x44\x6f\x9a\x65\x90\xae\x73\x8f\x39\x4e\x80\x0b\xfa\xda\x97\x5e\x86\x18\x32\xfe\xbd\xa1\xba\xac\xf7\x69\x30\x9d\x61\x8a\x15\xf5\x5f\xcd\x0f\xb3\xc7\xce\xe2\xa6\x44\x31\xfd\x09\x22\xf6\xe8\x67\x8b\x09\x10\xef\x58\x75\x7e\x17\xbc\x79\x45\x07\x36\x24\xcb\xb8\xbc\x19\x3c\x44\x1d\xb9\x14\x09\xfd\x57\x58\x9f\x64\x8a\x95\x78\x5e\x19\x8d\xa6\xad\x59\xa4\x1d\x2e\x23\x23\x99\xdc\xef\x98\xe4\x31\xf2\x59\xd1\x93\x44\xf0\xf0\x44\xfe\x5d\xe6\xeb\xd9\x78\x4a\x98\x20\x1d\xfa\x27\xae\x15\x27\x8d\xf6\x19\xed\x7a\x1f\x2c\xda\x33\x44\x7f\x6d\xc6\x4e\x97\x1b\xc6\xd7\xae\x89\x2f\x46\x22\x3a\xfe\x65\xbc\xa3\xcd\x60\x58\xfe\x77\x56\x1b\x92\x87\x6d\x72\x78\xe5\x27\xdc\x0f\x6e\x12\x37\x9c\x5e\xfd\x19\xaa\xbb\x42\x36\x01\xb1\x76\x2f\xb6\x14\x28\x3f\x14\x3e\xe5\x10\xad\xae\x54\x68\x60\xa4\x0b\xb4\xc6\x3a\x3c\x09\x94\x5e\xee\x36\x9f\xf4\x5b\x54\x98\xd1\xdc\xec\x38\x9a\xfb\xd5\x5f\x12\xa6\x95\x13\xcc\xcb\xee\x92\xb2\xb7\x52\x18\x0f\xcd\x65\xc8\xf7\xd8\xa8\xcb\x47\xf8\xca\x69\xac\x16\x6d\x58\x21\x26\x6f\x48\x32\x52\xb1\x27\x64\xb9\x67\x59\xd0\xeb\x25\x46\xd7\x71\x21\xe6\x9b\x4d\x2f\x5b\xfb\x44\xfa\x8d\xe2\x3d\xcb\xc8\x1c\xdb\xb9\x1b\xa9\xb1\x6f\xe8\x66\xb1\x44\xc5\x3d\xf9\xbe\x21\xe3\xdf\x8c\x8c\x78\x80\x6c\x26\x6e\x5f\x85\x9e\xab\xfc\x86\xb2\xc1\x4c\xf9\x3c\x0c\x39\x0d\xb9\x89\x38\xdd\x8f\x35\x69\x1d\xa9\xf5\xae\xc9\x18\x79\xe7\x27\x7f\x70\x90\x53\x2a\x60\x22\x6d\x78\x0d\x98\x46\x33\xc8\x4b\x84\x16\x78\xa4\x91\x03\x8c\x8a\x73\xb5\x26\x39\x2b\x0a\x23\x11\xab\x9f\x50\xf8\xb3\x19\x6f\x7b\xa6\x32\x5b\xbb\x24\x9b\x26\x20\x98\x20\x13\x58\xf7\x46\xbb\x76\x8c\x0b\x3e\xab\x0d\x69\x2d\x7f\x21\x70\x6f\x06\x5c\x85\x85\x7f\x38\x75\x51\xc5\x16\x03\xbd\x59\x88\x50\xfa\x8b\x0d\x55\x2c\xc4\x61\xba\x60\xaf\xbc\xe7\x37\xa2\x1c\x9e\x99\xe3\xff\xfe\x2c\xfc\x5f\xc0\x9a\xdd\x8a\x4a\x73\x45\x1b\xad\x1c\x19\xc2\xc8\x7c\xd4\xb1\x54\xac\x01\x25\xe6\x4a\x2e\xb9\xe4\x7d\x6c\xed\xbd\x0c\x07\x0e\xfa\x1b\x50\x82\x7d\xf5\x62\x13\x02\x26\x00\xfe\xdc\xbc\xc1\x9a\xb6\xa8\x80\x96\x2b\x69\x99\xd1\x9e\x3a\xef\x19\xaf\x55\xa2\x0e\x1a\x00\xd9\xb8\x24\x35\x9c\x91\xb7\xcc\xad\x84\x31\xde\xa7\xa3\x9c\x84\x48\xa2\x0f\x26\x74\x36\x84\xf1\xd9\x20\x55\xd8\x5c\x98\xd0\x6a\x4b\x6e\xf7\x6b\xbe\xf5\xf6\xf4\x05\xef\xb8\xc3\xff\x64\xb0\x5c\xb9\xe1\x3b\x89\x5d\x43\xb7\xbb\x25\x5c\xb3\x8d\x57\xca\x43\xc5\xa8\xe6\x5f\x9d\x9e\x20\xa7\xdb\x4d\xcf\x61\x99\xde\xb3\x5d\x7f\x6a\x8c\x56\xfe\xd5\xa9\x59\x5c\x75\x8b\xb9\x1d\xc4\x53\x53\x56\xf3\x49\xb8\xba\x87\x4e\xde\x31\xf7\x48\xd6\xfa\x2e\x34\x95\x0c\x41\x5d\xcc\x18\x49\x0e\x1c\x31\x63\x0c\xbd\x3f\x26\x93\xfe\x95\xf3\xb1\x97\x1d\x55\x0c\x3d\x15\xc2\x71\xc4\xe0\x92\x5c\x64\x84\xe4\xfa\xce\x2a\x10\x2c\x51\x6a\xc7\x47\xbc\x7e\x0a\x34\x97\x5a\x06\x9f\x45\x2a\x45\x26\x16\xda\xa2\xe0\x83\x20\x47\x0e\x45\x51\x65\x83\xef\xca\x06\x47\xd4\xe4\x71\xed\x74\x60\xc0\x11\xfd\x40\x47\xfa\x32\xc9\x54\xb3\x9c\x1b\x55\x73\xce\x1c\xd2\x55\xa1\x6d\x42\x13\xa6\x64\x4f\x2c\x62\x63\x79\xc6\xf3\x81\xc9\xde\xbd\xc5\x5c\x63\x4b\x0c\x3e\x29\x52\xca\x8b\xf5\xf5\x2f\x8d\x99\x6f\x25\x9f\x3b\xe1\x36\xe2\x60\x4f\x43\x74\x2e\x16\xda\xd3\x63\x76\x07\x23\x25\xbf\x37\x4c\x4c\x4a\x53\xe5\x64\xa2\x4b\x99\x69\x6c\xd2\x10\xe7\x2f\x7e\x44\x5e\xe2\x9c\xe2\x96\x0b\x6c\xd2\xd8\xa4\x35\xad\x2a\x50\xd6\x5a\xe9\xf2\x93\xf4\x6e\x96\xf8\x75\x4f\xec\x8b\xc0\x02\x35\xb8\xfc\x36\xa0\x82\xcf\x64\x9d\x24\x0b\x67\x83\xf6\xb0\x2d\x66\x94\x2e\xe9\x89\xa1\x43\xcf\x63\xb5\x91\x2c\x3a\xa2\x98\x11\xb7\xb6\xb1\xd1\xd8\xd7\x1b\xbd\x0a\xe6\x28\xba\x72\x7e\x54\x1b\x26\x3e\xfd\x74\x4e\xaa\xe1\xf9\x67\xa1\x3a\xf5\x20\x28\x0e\xd4\x1f\x61\xb1\x63\x16\x83\x14\xd3\xe1\xf7\x1e\x35\xf7\x1f\x90\x29\x62\x75\x52\x34\x0a\xe5\xf8\xd1\xbd\x52\xb5\xea\x8d\xea\xf0\x7a\xdc\xa7\x33\xdb\xf7\x45\xa1\x01\x7f\x58\x3e\x96\x6b\x37\xfa\xee\x77\x35\x2c\x16\xa7\xde\x68\x07\xb6\xc3\x65\xd0\x13\x14\xe0\x05\x4e\xbe\x86\xa9\x2f\xfa\x4b\x1a\xda\x29\x86\x5f\x83\xb8\x15\xbe\xd0\xc5\xcf\x8b\xb6\x71\xa4\x35\x5e\xff\x91\x8d\xe9\x98\xd7\x1a\xec\x63\x61\x96\x93\x31\xf8\x8b\x34\x3c\x66\x00\x8a\xbe\x5e\xf3\x2a\xb7\x79\x9d\xd6\xc8\xd3\x8d\x56\xaa\x3b\xf4\x40\x67\x16\xdb\x7f\x47\x13\x11\x8c\x8f\x43\xc9\x89\x0d\x25\x4d\x13\x7e\xa3\xd2\x3e\xc9\xf1\x45\xaa\x28\x87\x32\x08\x82\x4f\xef\x43\x9d\xdf\xdd\xd8\x83\x57\x79\xda\xc0\xb8\x37\xf6\x35\x74\x76\x10\x22\xbe\x0d\x77\x45\xf8\x80\xbc\x22\xe3\x11\xe5\x05\xe0\xc6\x25\x72\xf5\xa3\x59\x5b\x41\x06\xac\xed\xad\xba\x19\x9b\x75\xaf\x9f\xdf\x34\x53\x22\x2c\x48\x62\xf2\x8d\x1e\xce\x11\x3f\x00\x9a\xee\xb1\x07\xef\xe8\x65\x38\xc5\xf1\x6e\x7e\xd3\x3c\x89\xc0\x57\xa7\x4c\xd2\x06\xf3\x84\x56\x68\x00\xba\xed\xe3\x11\x11\xda\x99\xcf\x83\xc1\xec\x03\x1f\x85\x0b\xb8\x79\x8c\xe1\x2a\x62\xa1\xe8\x86\xae\xb7\x07\xb7\x5b\xda\x69\xde\xce\x4e\x17\xb2\x24\x17\x4d\x00\x2e\x61\x91\x67\xa4\x56\x08\xf5\x08\x7b\xda\xb9\x69\x5e\xfe\xcd\x35\x1b\xd1\x42\x0c\x0d\x0b\xe8\x11\x17\x95\x85\xbe\x5f\xcc\x09\x59\x2d\x50\xe1\x38\x6b\x9a\x25\x19\x72\xd0\x65\x6d\x94\xcf\x6b\x30\x81\x2f\x1f\x71\x16\x01\xb4\xd1\x22\x73\x8f\xf7\xd3\x0f\xba\xb5\xd9\x99\x9a\xe2\xc1\xbd\xf9\xc4\x59\x10\x54\x7a\xb3\xab\xf2\x15\x6a\x12\xd9\xc2\x5f\xd4\x27\xb8\x69\x0b\x5d\x6d\x3f\xbc\x71\xf0\xe1\x09\x78\x9f\xe1\x20\xd9\xff\x76\xe0\xf9\x43\x99\x2c\xb6\x7b\x56\x16\x18\x3d\x05\xcb\xb3\xe6\x4e\x1c\x23\x25\x1d\x13\xbb\xd2\x0f\x5c\xba\xcc\xb7\xb0\x9c\x92\x28\x86\xd5\xe1\x6d\x29\x31\x20\x46\x7b\x8a\x5c\xa9\x81\xeb\x5c\x11\x37\xd1\xa1\xc0\x50\x71\x0e\x43\x4e\x0a\xb2\x67\xed\xe1\xf4\xdc\x06\x3c\xba\xc5\xec\xc6\x5c\xa0\x68\x23\xe2\x7d\xc0\x34\xab\xbd\xcb\x44\x31\x80\xd3\x3c\x4a\xbd\xea\x2e\xd4\xd8\x58\xb7\xbe\x57\x63\xc3\xf9\xd8\x47\xff\xf5\x21\xe4\x7e\x71\x54\x8c\x70\xd1\xc1\x22\x18\x04\x42\x0e\x87\x5c\x44\x60\x83\xdb\x1c\xe8\xd5\x43\x33\xa7\x9c\xfc\x1b\xb3\x73\xde\x23\x21\xb9\xe8\x6a\x34\x04\x99\x9d\x9a\x1a\x28\x55\x5e\x71\x46\x25\x09\xa6\xf1\x07\x5b\xd8\x8c\xb4\x00\x31\x17\xb3\xe7\x74\x14\x9a\x27\x68\xb4\xd9\x92\xa9\x11\x8a\xfb\x0a\xdf\x9d\xc3\x0b\x4d\x6c\xa0\x6d\x89\xfa\xfe\x05\xbd\xf7\x10\xcf\x6e\x4d\x3c\xa4\x15\xc0\x19\x32\x8b\x41\x63\x69\x66\xe6\xad\xa2\x68\x2a\xcc\x4d\xc2\x09\xbe\x69\x56\x2a\x68\x19\x34\x59\x1b\x8a\xf2\x30\x2b\x00\xca\xba\xf5\x0c\x37\x04\x75\x01\xaa\xc1\xf0\x76\x4b\x4a\x28\x22\x9c\x62\xb7\x42\x44\x8b\x4c\xde\x70\x44\x3b\xd1\xa8\xfd\xda\xcf\x79\x6c\xa5\xd2\xf4\xa4\xd6\x71\xb3\x0e\x93\x4b\xb1\x3d\xf6\xb0\x91\xdd\xda\xa5\x56\xeb\x5b\x6c\x2c\xc5\x41\x20\x63\xb5\x55\x78\xa4\xd4\xba\xbf\x59\x2f\x64\x97\xce\xb9\xf1\xf5\xdf\x6f\xd1\x38\xcf\x28\x3b\xc2\xd5\xcf\x79\xf5\x1b\x1b\x92\x55\x9a\x8b\x28\x42\xea\xf6\xdb\xb7\x96\x57\xcf\x6c\xfa\xbd\xdd\xab\x5b\x8d\x6d\xe6\x67\x7a\x01\xec\xc7\xd3\x39\x46\xbc\xda\xee\xa9\x3a\x37\xa6\xc5\x34\x6d\x6b\x94\x19\xc8\x0e\x9c\xc3\x51\xd9\xad\x0d\x5a\x61\xd4\x2b\xb4\x24\xc2\xf8\x18\x3b\x45\x44\x04\x2d\x77\x42\x49\x02\x3a\xb8\x2d\x54\xee\x99\x4f\x89\x29\x69\x61\x2e\x75\xb7\x68\x3b\x40\x8f\x32\xa1\xef\x65\x3a\xf8\x01\x20\xa0\x4e\x9f\x1c\x43\xbd\x9b\xda\x0d\x4e\xfa\xc2\x35\xde\x0e\x5b\x2f\xd4\x62\xa9\x6f\x33\xec\x03\xac\x78\x63\xcb\x9b\x07\xee\xb7\x07\x4c\x74\x92\x17\x88\x24\xe7\xdd\x62\xa5\x31\xa9\x5f\xb3\x9c\x91\x01\xcf\x18\xb0\xaa\x4a\x15\x5b\x0c\x87\x09\x7f\x43\xa5\xae\x88\x44\x43\xe0\x0d\x4a\xdd\x2a\xb2\x52\x1b\x99\x86\xfd\x96\xfe\xe1\x41\xc8\x82\x83\x5c\x8c\xc1\x8a\x48\x70\x94\xab\x8d\x0c\xf9\xd8\xe8\x85\x59\x21\x63\x2c\xd1\x05\x50\x34\x6a\x9c\x64\x8c\xb2\x0a\xbe\xaf\x22\xa9\xcc\x56\x11\xde\xc0\x68\xff\xcc\xb8\x2c\xb6\x8b\x42\xb3\xb6\x98\xc4\x95\x14\x8b\x56\xa8\xde\x88\x27\x45\x32\x33\xb4\xf0\x28\xdb\x64\xe9\xda\x8a\xcf\xfb\x5a\x31\x3a\xb5\xcd\x10\xf2\x48\x62\x5f\xab\x6e\xa7\xf6\xd4\x5c\xa3\xb5\xd8\x8d\x55\xed\x54\xb8\xa6\x13\xe1\xc7\xaa\xca\xc8\x16\xb7\xc1\x37\xd6\x5d\xb0\xe3\x67\x09\x87\x87\x51\x42\x15\x5a\x08\x87\x6e\x16\x6f\x53\x2a\x93\xba\xf8\xd2\x6e\x1f\xcf\xfa\x8f\xed\xc8\xe7\xeb\xd6\x56\x44\xf1\xeb\x1b\x7e\xa8\xe5\x12\x2b\x34\x64\x6c\xd4\x4e\xb4\xd0\x7e\x8a\x43\x7c\x71\x21\xb3\x01\x91\x9a\x84\x3f\x48\x6a\x0f\x9f\xd3\x43\xca\xc9\x4f\xa2\xd6\xa7\xa8\x12\xe2\xf0\x11\x27\x5b\xda\x12\x74\xac\x0d\x38\x41\x74\x31\xe0\x6a\x64\xdb\xe5\x23\x62\x04\x6b\x8c\x2d\x63\x79\x65\xef\x08\x00\x39\x91\xe6\x51\x84\x77\x59\x1f\x09\x76\x6c\xeb\x49\xb6\x67\xe9\x8e\x35\x3c\x5d\xa8\xe1\xe1\xba\x94\xe8\x79\xfa\x44\x32\x3b\x87\x1d\x14\xe6\x34\x17\xb9\xf6\xa8\x97\x17\x9d\x5f\xc4\x6f\xe8\x75\xad\x9a\xe6\x95\xa9\x33\x9f\xe5\x7f\xb1\x6c\x7d\x8e\xdd\x0b\x1b\x43\x03\x3d\x60\x35\x9a\x11\x48\xee\x7f\xbb\x28\x61\x00\x19\x21\xf8\xd0\x98\x47\xf4\x9b\x25\xbc\x6e\xb0\x35\xf6\x1d\x39\xdc\x19\x07\x3d\x56\x7d\x1f\x41\x4d\xa9\x7e\x92\x14\xc5\x36\xbb\xfa\xb7\x98\x6f\xdd\xe6\x50\x1f\x4d\xa0\x2e\xd2\xdf\x9e\x0e\x58\xf7\xfa\x01\xab\xcd\x38\x27\xd2\xbd\x8f\x25\x4a\x87\x25\x23\x1b\x9b\x6d\xdf\xc7\x56\x92\x57\x3a\xca\xf6\x0e\x4c\x31\x77\x8e\x59\x01\x1d\x10\x3f\x93\x6c\x0c\x04\x19\x67\x3a\x55\x7d\xa0\xc6\xb7\xb3\x7c\x0e\x2b\xa6\x73\x8b\xeb\xd3\x0e\x2b\x34\xb2\x25\x87\xe2\x58\xd3\x12\x8c\x46\xf7\xa2\x3f\x52\x13\xdf\x13\xb2\xc4\x40\x3f\x39\x62\xcf\x87\xe3\x88\x5a\xd9\xe9\xd6\x23\x87\xc6\xa8\x0f\xce\x4a\xce\xa9\xc6\xf7\xf6\xf3\xae\xd4\xe5\xa3\x00\x23\xa7\x4d\xf1\xe4\x3c\xc0\x48\xd5\x3d\x86\x03\xc1\xf8\xf6\x82\x03\xcb\x5d\x60\xc0\x06\x56\xf7\x0e\xf6\x85\x03\x4f\xbb\x20\x0e\x1a\x1f\xc8\x6c\x0a\x1a\x0c\xfa\x62\x7a\xee\x15\x07\x64\x2b\xc8\xe2\x93\x8a\xa3\x07\x79\x55\x70\x63\x35\x3a\x73\x4e\x48\x98\x29\x77\x29\x78\x3e\x18\xc8\x09\x2d\xa5\xfa\xd3\xb1\xae\xf2\x70\x84\x79\x89\x5c\xa1\xcc\x02\x68\x5d\xe8\x3d\x5f\x4a\x56\xdc\x60\x48\xf2\xfd\x0b\x2d\x34\x8c\xe4\xfe\xa4\x49\x9c\xd9\x39\x4d\xc2\xfd\x0b\xad\xe5\x2e\xff\x46\x73\xd8\x6f\x82\x0e\x5d\x73\x50\x81\x08\xeb\x1f\xe1\x7f\x05\xba\x22\x8b\x31\xae\x1f\x28\xd4\xb8\x20\x34\xe0\xa2\x82\xc1\xfb\x5d\xc2\x2a\x6f\x42\xe5\x37\x8d\x15\xdf\x64\x6e\xd3\x7f\x95\xe7\xd2\x70\x12\x5c\x32\xb4\x13\xe0\x72\x4a\xcb\x8e\xca\x23\x4e\xcc\x0e\x3b\x22\x1f\xd0\x8d\xbf\x91\x7c\xec\x9a\x6d\x1c\xb1\x38\xce\xe0\x4d\x1a\x79\xc1\xbb\x37\x4c\x5c\x10\x2e\x08\xba\x8c\x71\xad\x9e\x9d\x5b\x63\xb4\xe9\xf0\xdd\xff\x2d\xab\x56\xed\xd7\x60\x29\x5c\xe2\x52\x66\xf1\x4f\x4d\x29\x1e\x33\x0e\x5c\x46\xe1\xe3\xb9\xbc\x67\x78\xe7\xca\x69\xb2\xde\xcf\xd2\x93\x80\xe0\x73\xa4\x15\xed\xd7\x68\x34\xc8\x34\x79\xbb\x9d\x51\x42\x85\x85\x29\x10\xbf\xb7\x86\xf2\xcd\x28\x89\x69\x16\x54\xef\x79\x1b\x71\xe1\xd2\x60\x78\x71\x92\x5c\xa5\x04\xd1\x05\x26\xab\x68\xe5\x37\xe9\x3a\x33\x67\xc8\x40\x22\xd9\xc3\xc3\xf0\xa3\x25\x56\xd3\x47\xba\x29\x18\x3b\x4a\xc5\xb1\x5a\x96\xa4\x7d\x1f\x29\x7b\xc8\x14\x78\x49\xed\xcf\xd0\x73\x1d\xb0\x6b\x46\xb8\xb6\xd2\xd7\xe7\xf9\x09\xbb\x5d\x5f\xa0\x53\x91\xb5\xe1\xb3\xf1\x9d\x2c\x7e\x35\x1b\x72\x32\x65\xed\xe5\xc4\xee\x3d\xf2\x4a\x94\x27\xe3\xb9\x25\x1a\xe9\x1c\xb8\xbf\xa5\xcb\x77\x19\xbc\x40\x84\x6d\x60\xc1\x0f\x0f\x43\x47\x54\x39\x94\xb6\xad\xf3\x79\xd7\x6a\xef\xe3\x7a\x9f\x4b\x62\x95\x0d\x60\xae\xb3\x70\x9b\x87\xed\xa2\x77\xb8\x17\x00\xa5\x8b\xa5\xf2\xe9\x78\x2f\x7a\x24\x0f\xf3\x60\x98\x16\x7d\xd0\x01\x63\x8e\x8f\xc4\xa9\xfb\x43\x36\x03\x3e\xa1\x31\x60\x57\x88\xcd\x47\x7f\x2a\x34\xfd\xc7\x18\x01\x92\xa8\x82\x98\xe9\xf5\x6b\x35\x5d\x6d\x79\x98\xcb\x37\x67\x65\x08\xa1\xae\x0e\x00\x56\x31\xfd\xf2\x1e\xfe\x43\x9c\x2f\x65\x40\x1d\xac\xbd\x41\xd9\x15\x61\x01\x58\xc1\xdd\x06\x11\x3c\x6c\x9b\xe2\x8f\x5b\xb6\xbc\xc4\x8c\xee\x5d\xfa\x05\xd4\xf1\x30\xc6\x71\x8f\x7b\x4c\x2e\x16\x5a\x88\xe5\xf7\x5b\xa9\x76\x1c\x40\x43\x5c\xad\x44\x02\x3d\x6b\xd4\xf4\x49\x93\xde\xcf\xd2\xe3\xfb\xf6\x1a\x95\xed\x7a\x46\xaf\x01\xf1\x3d\x4c\x8f\x9f\x3c\x3b\x0a\xea\x04\x57\xa5\xff\xc9\xdd\x99\xf0\x83\x8d\xfe\xc2\xf7\xae\x71\x78\x01\xbd\x15\x71\xab\xb7\xe3\xf5\x9c\x99\x3b\xc1\xc4\x18\xd3\x87\xe5\x64\x42\x60\x30\xcb\x09\x19\x52\x5d\x5e\x70\x44\x14\xe9\x79\x92\xf2\x2d\xdf\x86\xf1\xd3\x0d\xb2\x8b\x73\x34\xf1\x66\xd5\xca\x96\xa2\x2e\xd4\x68\x9c\xfa\xfe\xc1\xfb\x93\x08\x8b\xcd\xda\xa2\x71\x11\x18\xe5\x02\xf2\x7d\x79\xf6\xed\xb1\x5d\xf8\x2a\x5f\x63\xbd\x19\x7a\x63\x9e\xd0\xe3\xb0\x6e\x56\x86\x6c\xbb\x82\x5d\xf4\x0d\xd6\x68\xd6\x00\xfb\x87\xf1\x95\x43\xc4\xd6\x14\x00\xd1\xf3\x6d\x7a\x74\xff\x49\x3c\x09\xca\xb3\x60\x25\x04\x37\x9d\x9d\x12\x69\xc0\x3d\x44\xda\xdb\xd9\xe6\x6b\x20\x70\xf9\xda\xee\x6c\x14\xd6\x3d\x88\xdb\x31\x86\xfc\xfb\x9c\xa2\x90\x8a\xb8\xae\x63\x1c\x23\xa2\xd1\x93\x3e\xc6\x5b\xde\xe8\x98\x37\x89\x48\xc5\xa8\x95\x6a\xd4\xd9\x4d\x26\xa0\x61\x4f\x23\xf1\x78\x47\x17\x3f\x16\xbc\x6d\x74\x19\x51\xfd\x19\x53\xb0\x9e\x89\x4d\x4f\xa8\xd9\xdf\x30\xb0\x8e\x1a\xdf\xb2\x38\x58\xd4\x98\xfd\xa5\x00\x22\xf1\x75\xb9\x78\x6b\xbe\xe3\xf8\x5c\xba\x13\xa7\x3e\xf3\xb6\x3a\x65\x28\x5d\x8e\x5b\x1a\xe0\x46\x5f\xff\x09\xe6\xd1\xa1\x59\x18\xdc\x4f\x13\x52\x10\x8c\x5a\xd1\x1b\x12\x10\x33\xc6\x72\x7c\x3b\x09\x77\x20\xe4\xfe\x5e\x8c\xaf\x7d\x2f\x33\xc8\x86\x05\x56\x11\x3d\x30\x33\x70\x6a\x68\xa9\xa7\xd6\xeb\xe8\xb2\xa9\x75\x91\xa3\xde\x25\xfc\xbe\x41\xce\x0d\xbd\x6e\x46\xbf\xda\xd8\x0c\xfd\x6f\x3d\x7e\x42\x4a\xcd\xc9\x49\x91\x57\x1a\x73\xa0\xe9\xe9\x77\x1a\xf6\xa6\x4c\xa1\xec\x1e\x16\xba\x96\x79\x43\xf7\x1b\x15\xe0\xa4\x40\x46\xbf\x05\x7a\xcd\x25\xbf\x2b\x09\x48\x4c\x3c\xa0\xb4\xa8\x3b\x3a\xdd\xda\xf2\xca\x12\x07\xcc\xc5\xdf\x08\xeb\x85\x23\x8f\xd6\x41\xee\xb6\x36\x06\xed\x28\x00\xe9\x3f\x26\x09\x95\x6e\xae\x4b\xdc\xdd\xe3\x70\xed\x96\xa3\x75\xc3\x82\xfc\xfd\xde\xd5\x9e\xab\x32\x79\x96\xa7\x1a\xdb\x0b\xac\xf0\x76\x5d\x48\xda\x77\xa8\xef\xda\x36\x8b\x3a\x5f\x07\xc1\x39\x9a\x15\xfe\xee\xfc\xca\x30\x1b\x93\x5c\x2f\xda\x2e\x1f\x11\xcc\xcc\xd9\xca\x9a\xa6\x14\xb0\x92\xae\xeb\x66\x39\x02\x4c\xc7\xc7\x8f\xc2\x0a\x96\xc5\x7d\xa1\x28\x97\xfc\xdb\xf0\x1b\xf2\xe9\xed\x6c\xde\x01\xc5\x85\xab\xc8\x50\x68\x1f\xe1\xe3\x98\xd9\xcc\x6d\x06\x4d\xc7\x21\x09\xbf\x78\x66\x34\x28\x2c\xc8\x88\xc8\x7f\xb3\xae\xbc\x85\xe9\xd0\x2d\x37\x38\x6a\xac\x3d\xb2\xcd\xe7\xf4\xce\x16\x0d\x84\x9e\xc2\x14\xaa\x89\x6a\x3e\xc0\xcf\x14\xf6\xa9\x73\x86\x26\xbd\xda\xa7\x38\x03\x5f\x77\xa5\x53\x28\xc1\x98\x0d\x2d\x1e\x9a\x6d\x94\x7e\xf0\x3e\xd4\xbf\xc7\xf5\xdf\xff\x30\xec\x83\xe4\xcc\xae\x64\xc7\xee\x7c\xa7\x39\x4b\x93\x4f\xd1\xe4\xe4\x50\x0a\xd2\x85\x96\x89\x18\x34\x62\x6c\x36\xfd\x9e\x30\x4d\xc6\xb0\xad\x6f\xea\xae\xe1\x7c\xe4\xc4\x33\x6b\xb3\x13\xd4\x72\x82\x8e\x2f\x0a\xe5\x06\x5f\x1a\xca\x48\xbe\x34\x86\xc4\xe0\x43\xd3\x14\xd1\x6d\x3d\x3e\xfe\x76\xe4\xab\x65\x88\x3e\x90\x60\x03\x70\xd8\xef\x63\x74\x37\x8c\x83\xef\xb7\x14\x1a\xf8\xe3\xe8\x15\xfa\x1e\xa0\xed\x9d\xe6\x8f\x98\xdf\xe2\xf7\x77\x52\x95\xde\x69\xf3\x6c\x7e\xe7\xc3\x08\xa9\xe6\xe4\x75\x3a\xc0\xaa\xcc\xa3\xf8\x9b\x26\x6a\x4b\x8d\x3c\xaf\x0b\x37\xfc\x7c\x8b\x71\x51\x48\xd9\x12\x04\x95\xd5\xc4\x18\xeb\x72\x80\xfe\x2c\x67\x63\x91\x9f\xd7\x72\xba\x09\xa1\x0b\xb6\x2d\x26\xb2\x21\x79\x2c\xac\xc7\x77\x90\x30\xdc\xb5\xf6\x58\x53\xf2\x7c\xda\xbc\x9f\xe4\xb4\x19\xcc\x31\x48\xad\xd8\x53\x69\x49\x07\xb4\x38\xd1\xcc\x86\xf2\xda\xde\x25\xf5\x80\xd9\x2e\x6c\xc5\x40\xdd\xdd\x12\xa8\x85\xfd\x5b\xa8\x75\x0b\x52\x91\x8f\x38\x4f\x67\xd0\xa5\x0f\xee\x1f\x3d\x7b\xf0\xe8\xbe\xa3\x51\x1c\x61\x05\x3d\x85\x67\x05\x19\xa0\x90\x8e\x1f\xe1\xcd\xc0\xcd\xb4\xfc\x1a\xc6\x24\xb8\xfc\x47\x16\x20\xcb\x46\xb7\x5e\x2a\x0d\x9a\x7f\x8b\xf9\x9d\x14\xd7\x26\x70\xa3\x34\x68\x1d\x89\xa7\xca\xc1\x8a\x0d\x62\x35\x84\x95\x91\xb0\x70\xd2\xe6\x8f\x9d\xee\x60\x14\x5d\x9d\x02\xa4\x3e\xbc\xbc\x28\x56\x4a\xe2\xbb\xb9\x8d\xe4\xe8\x26\xa4\xfa\x87\x9d\x23\xe5\x3f\x11\x06\x52\x6d\x06\xf1\xdb\x1c\x84\xdc\x9e\x0b\x0f\x4f\x75\x94\x75\x40\x9b\xf9\xcb\x37\x85\x04\xb0\xa7\x23\xf6\x73\x97\x56\xfb\x48\x80\x7c\xb6\x80\x00\x37\xce\x40\x1d\x81\xd2\x47\x5f\x7e\xfb\xb4\x57\x71\x04\x55\xc8\x97\x11\xd4\x22\x5f\xc6\x11\x09\xbd\x23\x10\xee\x26\x31\xd4\x06\xf8\xdb\xad\x30\x6d\x1e\x45\x1b\x61\xc9\xd4\xd6\x77\x55\x67\x98\xae\x1e\xe3\x7b\x60\x0b\xb1\x0f\x77\x71\xf9\x00\x5c\x78\x07\x28\xa8\x16\x71\xef\x8d\x2e\x96\xaa\x30\x94\x9f\x7e\xd0\x57\x83\xbe\xd3\x2f\xfc\x98\xdc\x98\xf8\x38\x23\xfd\xdb\x8e\x26\xee\x24\xd8\x84\x6c\xe4\x20\xfc\xc1\x91\xdd\x58\x5c\x7f\x70\x04\xf6\x33\x3f\x1f\x0e\xbb\x43\x31\xd1\x3e\x88\x47\x55\x55\x06\x57\x0c\x13\x0c\xe3\xbf\x97\x17\xf5\xfe\x9a\xf4\xd4\xbf\x51\xc5\xf4\x6b\xf9\x63\x7f\x55\xf8\x11\x6b\x8b\xc2\x9a\xfe\xd0\xd8\xd4\x7a\x38\xd9\x5a\x17\x01\x0a\xb3\xf5\xd0\xc8\x22\x27\x37\x7f\xb2\xbf\x66\xe7\xd7\x5e\x5d\x5b\x67\xa4\xd3\x75\xd0\xca\xd5\x5f\xc0\xf5\xcd\x7b\xa2\xa8\x30\x5d\xfc\xa9\x87\x8f\x10\x5f\xf0\x07\x87\x92\x02\xb9\x2a\x6e\x72\xba\x70\x5b\xc6\x0f\x88\x78\x91\x53\x5b\xd4\xe1\x73\x5e\x6f\x85\x45\x7e\xa2\x83\x27\xca\xb6\x16\x49\x20\x5e\xe3\xb2\x6d\xd7\x0d\x87\x29\x3b\xb2\xe4\x90\x55\x7e\x18\x2b\xf5\xb8\xb7\xb4\x5e\x9f\x16\x25\xf6\x56\xe9\xf6\x2f\xa7\x57\xe7\x91\xed\x1b\x84\x65\xeb\xb5\x10\xba\x39\x3d\x26\x0c\xad\xa8\x7e\xa4\x59\xeb\x91\x89\xd3\x9a\xfd\x1d\x3d\x86\xb0\xb8\xfd\x0f\xf2\xa5\xb7\xf5\x27\x3a\x43\xdb\x4e\x4c\xd8\xcd\x0d\xbf\xa4\xf2\xf4\x2b\x5b\x9e\xde\xa7\xf2\xc6\x2d\x06\x1f\x58\x64\x21\x8f\xad\xf1\x14\x3e\xf1\xe6\x9e\x5d\xc6\x2a\x76\x46\x14\x4c\x65\x99\x9f\x2e\x0b\xf8\x5f\xeb\xe7\xb5\xe3\x1c\x18\x42\xf6\x9a\x6d\xd5\xaa\x9f\x30\x7e\x87\x0f\xaf\x72\x51\x86\x81\x53\x82\xae\xf1\x6d\x8b\xba\x45\xd1\x07\x78\x32\xf5\x93\x23\x7d\xf8\x3e\x06\x52\x4c\x1c\xa3\x05\x24\xcc\x73\x7c\xeb\x76\x6f\x1f\x3d\xc1\x61\xd0\x27\x46\x88\x82\x45\xb5\xa8\xc3\x1f\xe9\xdd\xcd\x8a\x1e\xdf\xa2\xa1\x76\x95\x0a\xa8\x52\xd4\x31\x47\x33\xf9\x6d\xdd\xb9\x78\x25\x41\x87\x70\x01\x54\x8d\x09\x79\x60\x8a\xa5\x6e\xeb\x6d\x00\xf2\x34\x60\x7e\x5a\x5b\xb3\x9f\x11\x42\x47\x9f\x3d\xd8\x73\x0b\xca\x84\xb4\xa7\x81\xcd\x79\xe5\xb2\x21\x15\x2a\x02\x85\xc2\x54\x7b\x07\xb3\xb1\xdc\x61\x57\xc8\x65\x2e\x92\x21\xb0\x35\x05\xb2\x7b\x47\x63\x1f\x32\x20\xde\x85\x77\x34\xc3\x77\xfd\x40\x32\x1c\xde\x3d\x28\xf5\x3b\x8b\x55\x88\x63\xb6\x5a\x03\x28\xb0\xf3\xb5\x1e\x04\x93\x45\x8d\xf9\xd0\x40\x5c\x47\x05\x3a\xe9\xcd\xd3\xcb\x7f\x16\x66\xb9\x75\x35\x42\xe2\x6b\xcb\x1a\xc0\xdd\x59\xc7\x41\x88\x36\xf5\xd2\xd7\xd5\x3f\xb5\xa1\x91\x05\x66\xf1\x0e\x43\x5f\xba\x8a\x14\x15\xc4\x74\x6c\x0f\x99\xe9\xeb\x73\x0c\x7d\xb0\xb7\xb6\xfe\x49\x2f\x3a\x67\xf6\xf5\x10\xbd\x27\xc2\x38\xaa\x41\xaf\x46\xe2\x75\xdb\x3e\x48\x37\x0e\x65\x7e\x39\x61\xe2\x4a\xbb\x1a\x94\x46\x19\xe9\xee\x14\xb0\x61\x67\x7a\xdf\xe0\xde\x88\xcf\x8d\x6d\x5d\x35\xac\x07\x84\xe4\x84\x43\xb9\x73\x9f\xf7\x86\x6d\x41\x61\x87\x32\x0a\x23\x33\xb3\xd9\x22\x6d\xfc\x21\x2e\x1e\x6b\x85\x2c\x2c\xfa\x60\xdc\x5f\x01\xc8\xbb\xc1\x01\xd1\x2e\xc8\x73\x1f\x23\xc0\xd4\x62\xa9\xec\x3e\xc3\xa2\x7d\x05\x09\x5e\x82\x4f\xe3\xf3\xab\xd7\xb5\x58\x43\xba\xba\x79\xc5\x8a\x01\x6e\x81\xef\xf4\x5f\x53\x90\x83\x8a\x5f\xd3\xb1\x49\xd0\x2f\xa9\xe8\xb8\x2a\xa6\x43\x16\x2b\x69\x9c\x02\x6c\x7e\xbf\x1e\x8e\x1e\x1b\x52\xab\xb1\x15\x3a\x11\x32\x2c\x98\x7d\x1c\xda\x8b\x84\x2b\xb3\xc7\x69\x8b\xcc\x7a\xfa\x74\x3d\x19\xcc\xd1\xc6\x72\x0f\xce\x24\xb2\x1c\xb9\x21\x71\x45\xf2\x03\x6f\xfa\x4b\x1b\x94\x82\xde\xa8\x6d\x36\xf6\x22\x7a\x5e\x8e\xc2\x00\xde\x6d\x30\x04\x60\x52\xeb\xca\x65\x03\xc2\x77\x66\xce\xfd\xa4\xe2\x86\x3b\x97\x4a\xfb\x63\x9f\x4a\x1b\x1d\xe2\x7d\xe2\xf1\xdf\xbd\xc4\x3e\x39\xd5\x36\x74\x2b\xa9\x12\xa9\x5b\x76\x61\x2d\xc8\x93\x33\xce\x54\xde\xd4\x8b\x8f\xfa\x4d\x39\x32\x79\x50\x0b\xbf\xfd\x0f\xdb\x2d\xaf\x91\x1e\x4d\xa7\x3f\xfa\x55\x92\xaf\x46\xb8\xbe\x8f\xf8\x5d\xf5\x23\x5e\xe9\xbf\x49\x82\x70\xcc\x7f\xce\xa9\x74\xa5\x87\x8e\x73\xe9\xfe\xa6\x0e\x24\xa5\xb7\xf4\x10\x64\x21\xfe\x6d\xdd\xc8\x52\xe2\x3c\xf0\x7e\x45\xfb\xd2\x15\x87\x7d\x4b\xa2\xf7\x3d\x4b\x8c\x7b\xb6\x0b\xfd\x57\xfa\x95\x95\xf7\x3a\x8e\x36\xe0\x5f\x9a\x36\xc0\x0c\x5a\xb6\xca\xce\xb2\xd7\x5c\x11\x78\x23\xa5\x2b\xeb\x94\x73\xab\x1d\x1e\x49\x40\xfd\xa3\xcb\x27\xff\xaf\x4c\xd4\x65\xdf\x70\xb7\x26\xeb\x5d\x18\xb9\x2e\xee\xae\x78\x75\xfc\x47\x41\x6a\x84\xb1\xfb\x48\xa1\x5b\x5b\x75\x3a\x65\xd7\xca\xc2\xc5\xc0\x0a\x27\x46\xf7\xa6\xb9\xf3\x99\x9b\xd3\xf0\x6e\xf5\x2e\x23\x86\xf2\x73\x49\xec\x1d\x26\xa7\x38\xe0\x55\x10\x20\x1e\x64\x0b\x0c\x79\x27\xe1\xfd\x92\x1f\x5a\x63\x8a\x97\x89\x3a\x95\x55\x26\x20\xe4\x97\x14\x26\x00\x23\x9e\x61\x88\x00\xfc\xbb\xda\x22\x86\xfc\xb8\xc1\x9c\xa8\x1f\x4b\xf4\x76\xd3\x25\x1f\x97\x58\xc0\x09\xf7\x89\x15\xec\x38\x35\x23\x7e\x5a\xe2\x27\x29\x5c\x9a\x2c\xaf\xb0\x30\xe3\x0e\xb2\x4a\x97\xc9\xc7\xaf\xf8\x07\x88\x85\xfc\x1b\x48\x1e\x97\x80\xfc\xd5\x60\xac\x69\x28\xdb\x72\x09\xe6\xa1\x2f\x93\x46\x03\x6f\x91\xd1\x24\xee\x66\x32\x0b\x55\xe6\x09\x8d\xa9\x6d\x39\xfd\xc2\xe2\xa5\xe9\x6a\x5b\x48\x33\xc0\xc2\x4c\x6d\x6d\x59\x56\x6d\x93\x57\x5a\xaf\xec\x6f\x9a\x08\x91\xea\x76\xe9\x3a\xe3\xa9\xe4\xc9\x56\x2b\xd7\x19\xcc\x66\x9b\xd4\xea\xd5\xcc\x4e\x88\xa7\x42\x45\x76\x2e\xf4\x2f\x6c\x6f\x56\x9b\x35\xe6\x6e\x7b\x99\xd8\x6c\xb6\x36\x8d\x2d\xf2\x1e\xe4\xee\x4f\xb1\x8b\xac\xb9\x7f\x43\xb6\x45\x73\x4c\x14\x91\x37\x2b\xfe\x26\x21\x80\x27\x89\x4d\x4f\x9d\x57\xeb\x4e\x74\xeb\x87\x98\x14\x48\x9c\x74\x7d\x00\x78\x89\x9d\x85\x91\xc9\x27\x09\xa9\xf0\x31\x06\xe0\x1c\xd8\xb5\xe7\x56\xc7\x6a\x25\xab\x0f\xfe\xe3\x3f\x88\x91\x06\x68\xf8\xcf\xff\x4c\x9f\x7c\xf1\x21\x45\xfd\xdb\x5e\x9f\x53\xc8\x00\x0a\xd0\x5f\x06\x2c\xb6\xd3\xd1\x42\x3b\x28\xff\x2a\x6a\x8a\xa1\xaa\xc8\xad\x96\x2c\xb3\x6c\x02\x5b\x8e\x65\x98\xfc\xff\x01\x00\x00\xff\xff\x28\x78\x6e\x74\x42\xe9\x00\x00") - -func confLocaleLocale_csCzIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_csCzIni, - "conf/locale/locale_cs-CZ.ini", - ) -} - -func confLocaleLocale_csCzIni() (*asset, error) { - bytes, err := confLocaleLocale_csCzIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_cs-CZ.ini", size: 59714, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_deDeIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\xbd\x4b\x8f\x1b\x47\xb2\x2f\xbe\xe7\xa7\x28\x6b\x20\xd8\x06\x9a\x14\x3c\x73\xfe\x0f\x18\xa6\xfd\x6f\xbd\x65\x4b\xb2\x8e\x5b\xb6\x01\x1b\x02\x55\x24\x93\x64\x4d\x17\xab\x38\x95\x55\xdd\xea\x1e\x0c\xf0\x5f\x9c\xe5\x5d\x5f\xdc\xc5\x05\xce\xc6\xb8\x1f\xc1\x2b\xef\xfa\x9b\x9c\x4f\x72\xe3\x17\x11\xf9\xaa\x2a\xb6\x74\x34\xe7\x0e\x30\x56\x33\x2b\xdf\x19\x19\xef\x8c\xc8\x0f\x87\xc5\xda\xd8\xd5\xfc\x51\x51\x65\xa6\xa8\x36\xf9\x6a\x67\x9a\x93\xcc\x9a\x72\x69\xdb\x6c\x6b\x76\xb5\x6d\x4d\x6b\x9a\xec\x49\xd1\x4e\xcf\x4c\x73\x51\xac\xcc\x64\xb2\xab\xf7\x66\x7e\xd6\xe6\x4d\x6b\x4d\xd1\x9a\xc9\x3a\xb7\xbb\x65\x9d\x37\xeb\xf9\xcd\xff\x5c\x9a\xc6\x16\xab\x5d\x3b\x31\xef\x0e\x65\xdd\x98\xf9\xa3\xe6\xbc\xab\xd6\xa6\x9a\xec\x4c\x79\x98\x3f\x2d\xca\x8d\x99\xd8\x62\x5b\x2d\x8a\x6a\x7e\x5a\xed\x4d\x89\x6f\x5c\x50\x77\xed\xfc\x74\x19\x97\x74\x87\xf9\x0f\x66\x5b\xd8\xb6\x29\x4c\x43\x85\x0d\xff\x30\x4d\x5a\x7a\x69\x96\x96\xa6\x31\xff\x99\xfe\xe5\xf9\x5c\x60\x0e\x75\x35\xff\x49\xfe\x9d\x1c\xf2\x2d\xcd\x97\x3f\xb5\x66\x7f\x28\x73\xaa\xfc\x53\xdd\x94\x54\x3c\x29\xf3\x6a\xdb\xf1\xf7\x43\x83\xd5\x4f\x56\x8d\xa1\xef\x8b\xca\x5c\xd2\xd4\x69\xb0\xb2\x34\xd5\x6c\x36\x9b\x74\xd6\x34\x8b\x43\x53\x6f\x8a\xd2\x2c\xf2\x6a\xbd\xd8\x63\x75\xf7\x4d\xd5\xb5\xd7\xa6\x91\x0f\x19\xad\x34\xdb\x9b\x5d\xc3\xd3\x37\x6b\x5a\xe3\x22\xb7\xb4\xcc\xad\xe1\x65\xb5\x59\x5e\xda\x09\x77\x55\xe5\xfb\xd0\x1a\x3f\x26\x66\x9f\x17\xe5\xfc\xd1\xf4\x05\xfd\x43\x53\xb6\xf6\xb2\xa6\x1d\x7d\x25\x7f\xb4\xb4\xf6\x45\x7b\x75\xc0\x7e\x56\xa6\x6b\x71\x5a\x5b\xb3\xa4\xd5\xaf\xf2\x43\xbb\xda\xe5\xf3\x07\xf2\xef\x84\x2a\x1e\x6a\xda\x8f\xba\xb9\xa2\x6d\x72\x7f\x4e\xea\x66\x9b\x57\xc5\x75\xde\x62\x63\xbe\xe7\x1f\x96\x7f\x4c\xf6\x45\xd3\xd4\xcd\xfc\x05\xff\x33\xa1\x75\x2f\xd0\xc3\xfc\xa5\xe9\x8c\xcd\xa2\x1e\xf0\x65\x5f\x6c\x1b\xec\x1e\x3e\x66\x2f\xf8\x07\xba\x90\x4f\xdc\x0d\xbe\x34\x59\xd4\xd9\xa6\x6e\xce\xb5\xb3\xc7\xf4\xe7\xb4\xd7\x23\xcd\x4b\x7a\x4b\xe7\x94\x57\x74\x26\xfc\x31\x2e\x37\x55\x46\x67\x7b\x99\x97\x2d\x2d\x3c\x5f\xef\x69\x7b\x0f\x79\x65\xca\xf9\x29\xfe\x06\x44\x48\xf3\x7c\xb5\xaa\xbb\xaa\x5d\x58\xd3\xb6\xb4\x4f\x76\xfe\x5d\x5d\xb5\x35\x6d\x19\x9f\x67\x47\x3b\x47\x00\xe6\xbe\x3d\x4a\x8a\xaf\xea\xce\x1f\xf3\xfc\xd9\xae\xc9\x5e\xf1\xdf\x52\xee\xdb\xd0\x07\x93\xa5\x0d\x69\xd0\xb6\xb8\x28\xda\xc2\xd0\x81\x9f\xf3\x9f\x37\xbf\x61\x9e\x87\xae\x2c\x69\x4b\xff\x46\x3b\xd0\xda\xf9\x2b\xfa\x45\x7b\x20\xbf\x26\x85\xb5\xf4\xc7\xfc\x19\xff\x33\xa1\xb3\xac\x56\x58\xcd\x72\xd9\x18\x82\x45\xea\xf4\x57\x8c\x91\x97\xe5\x9b\x89\xfe\x31\x7f\x26\xff\xca\x42\xdb\xa2\xc5\x34\xa3\x22\x6b\x57\xbb\xa6\x68\x5b\x93\x6d\x6e\xfe\x68\x32\xba\x4a\x99\x01\x18\x57\x19\x5f\xd8\xc9\xba\x5e\x9d\x13\x20\xe3\x32\xd2\x3d\xfa\xd9\x54\x55\xf6\xa4\xde\xda\xac\xa8\x2a\xd3\xec\xf2\x72\x99\x5d\xd4\x55\xf6\x90\x6b\x65\xe5\xcd\x6f\xdd\xa6\x3d\xc9\x4a\x63\xd1\x41\x61\x32\xdc\xed\x6c\xc9\xfd\xa3\xeb\xaf\xf2\x8c\x7a\xdd\x9a\x76\x7e\x67\xb1\xa4\xab\x74\x7e\x27\xa3\x9d\xd9\xcc\xef\xdc\xb5\x77\xbe\x7e\x4e\x37\x6e\x93\x53\xb5\xaf\xee\xe5\x5f\x13\x32\xa9\xf2\x2e\x5b\x77\xcd\x6a\x77\x92\x2d\xcd\x45\xdd\x70\x87\x05\xb5\xae\xd6\x97\xb9\xcd\xf2\x6e\x93\xad\x69\xf7\x68\x5c\xbe\xab\xd9\xcd\x6f\x84\x37\x9a\xea\x93\x09\x36\x8f\x0a\x16\xeb\xa5\x60\x2b\x9e\x30\xc1\xfe\xcd\xef\x6d\xb1\x6d\xb3\x17\x57\x67\xff\xfa\xfc\x24\x7b\x45\xb8\x6a\xdb\x18\xfe\x9b\xfe\x43\x0d\xfe\x92\xd5\xd4\x41\xf6\xba\x78\x78\x7f\x36\xa1\xc6\xb2\x5b\x0f\x09\x80\xab\x25\xcd\x35\x85\x07\x7c\xc7\xfd\xf2\x9f\xe9\xd7\x04\xf8\x6f\xfe\x94\xfe\xc3\x77\xd6\xdf\xd7\x91\xeb\x49\xcd\xf9\x4a\xfb\xe6\x7c\xa7\xa9\x54\x77\xfa\x3e\xef\x19\xa0\xd7\x00\x1b\xca\xda\x2b\x99\x3b\x96\x9d\x3d\xab\xaa\xfa\xe1\xfd\xe9\xa3\x6a\x5b\x54\x26\xdb\x17\x2d\x6d\xf0\x3e\xfb\xc5\x14\x00\x04\x02\xff\xeb\xac\x6b\x37\xff\xef\x82\xa6\x6a\x9a\xbc\x5c\xac\x8a\xd9\xc4\xda\x92\xb0\xd0\x9a\x70\xd7\xd9\xf3\xe9\x8b\x7a\xdd\x59\x9a\x58\xbb\x9b\xbf\xa2\x5d\x9f\xd8\xbf\x95\xd8\x33\x1d\xfe\x21\xed\x03\xa6\x56\x1c\xe8\x5b\x76\xdd\x35\x6e\x8b\xa6\x61\x8f\xa6\x7e\xee\xb3\xec\xab\x65\xf3\xf5\xd8\x94\x69\xcf\xe8\xaf\x7c\x69\xeb\xb2\x03\x50\x61\xa8\x93\xec\xd2\x83\x11\xe1\xb7\x4c\xe9\x04\x9d\xb8\x05\xc8\x11\xd6\xbb\x2c\x9a\xf5\x6c\x62\x9a\x66\x41\xe8\xb7\xbd\xc2\x41\xf2\x44\x07\xc7\x94\xf9\x29\xf0\x3c\xd7\x79\xb3\xc9\x2a\x90\x13\x02\x41\xaa\x42\xe8\xbd\x92\x7e\x8a\xea\x22\x2f\x8b\x35\x1d\xa9\xdf\xf8\x41\x17\x28\x8e\xbb\xb8\x33\xbb\xc3\x08\xfa\xce\xf4\x4e\x66\xaa\x76\xc7\x68\x64\x36\xa9\xea\x85\xa0\x12\x20\xf5\x35\x61\x9a\x25\x21\x78\xa1\x34\x82\x4e\xe6\x58\xf8\xf9\xcd\xef\x15\x96\x8e\xa3\x0a\xd4\x87\x40\x47\x3b\x5f\x9b\x9c\x2f\x3d\x28\xd2\x49\x56\xef\x2a\xde\xab\x2c\x42\x4c\x84\xfc\x80\x85\x68\xf3\xe5\x46\x32\x61\x89\x36\xc5\xe1\x33\x85\xac\x87\x74\x25\x92\xd6\x53\x07\x6b\x47\xb6\x65\xe2\x40\x43\xc0\xfc\xb4\x2c\x41\x75\x00\x4c\x29\xa2\x02\xd1\xe7\x1d\x7b\xc9\xfb\x43\xed\x4f\x2b\x9c\x30\x7d\xf5\xdf\x1c\xd8\x3c\xa5\xf5\xf0\x45\x47\xdd\x8a\x2b\xc7\xf8\x98\x79\x86\x9b\x3f\xa8\xd7\x4f\x98\xec\xc8\xa9\x06\x0c\x3f\x25\x0a\x7c\x0d\x08\xa6\x06\xa1\x82\xeb\x9c\x66\x68\x98\xb1\xf0\x0d\xe8\xf6\x13\x2c\x35\x18\xb0\xa8\x04\x19\xec\xb3\xa8\x0f\x80\xd4\x81\x6f\x44\xd3\xce\x26\xb4\xfb\x0b\xbe\x96\xa7\x9d\xa5\x59\x10\xe2\x01\xbe\xc8\xfc\x25\x75\xdf\xe3\x3b\xe0\x3e\x66\xfb\xce\x5a\x3e\xcc\x5f\xba\x6d\x53\x6c\x36\x96\x18\x17\xc2\xb9\x84\x50\x70\xa6\x82\x3b\xf3\x98\xfe\xc5\x6b\xc9\x76\x39\xa1\x1f\x06\x26\x8c\x98\x47\xe3\x87\x11\x80\x47\xf9\x4e\xc8\xf1\xac\x6b\xa2\xef\xd5\xfc\x21\xff\xa3\xbf\xfc\xcc\xb0\xf0\x5d\xde\x66\xb4\x12\xba\x2b\xe7\x98\x82\xa2\xc3\xec\xec\xec\x69\xf6\x5d\x59\x57\xd3\x1f\x7f\x78\x6e\x71\xe7\x77\x8b\x03\x01\xc1\x1c\xe5\xaf\x80\x79\x5c\x49\xbc\x4c\x7c\xc8\x40\xa4\x2c\xda\x33\xe7\x46\x30\x37\xcb\x9e\x03\x5c\x4a\x82\x23\xcc\x7e\xcf\x7d\x13\x38\xc6\xb0\x3b\x9b\xec\xda\xf6\x20\x43\x3c\x7d\xfd\xfa\x95\x8c\xe1\xcb\xfc\xd9\x05\x64\xcd\x63\xbd\xec\xf6\x7b\xfa\x1b\x17\x5d\x16\x4d\x70\x8d\xcd\x5a\xe6\x0e\x3c\x01\x5a\x5d\x43\xc4\xcd\x01\x9b\xc5\x8a\x5c\xf1\x87\xec\x04\xa6\x73\x0f\xff\x39\x0b\x1b\xa2\x67\x50\x11\xfa\xc4\x7d\xe6\xe3\x10\x16\x8a\xf6\xaa\xac\xb7\x8b\xa6\xae\x5b\x01\xcb\xe7\xf5\x76\xed\x30\x60\xfa\xc9\x0d\x1e\x9f\x30\xe0\x8f\xce\xdf\x35\xa2\x11\x08\xf6\x40\x5a\xc1\x74\x29\x90\xd2\x9d\xab\x0f\xb8\x07\xfe\xd2\x7d\xaf\x3f\xfb\x77\x8e\x79\x3b\xad\x23\xd3\x73\xdc\x74\xaf\xa2\xdd\xd3\x46\x33\xd5\x39\x7b\x41\x9b\xcf\xa4\x87\xcb\x36\x4d\xbd\x27\xa6\xb5\x0a\xbf\xfc\x51\x10\xd7\x0b\xc0\x9f\x9e\xae\xe9\xbc\xad\xc9\x2a\xe2\x63\xb3\x1f\x1e\x3f\xc8\xfe\xaf\xbf\xfc\xf9\xcf\xb3\xec\x51\xd5\x5e\x1a\xec\x4b\x45\x58\x5f\xf0\x01\xcf\x20\x73\xf5\x19\xfb\x16\x7b\xb0\x67\xfb\xbc\xfd\x32\xbb\x83\xcb\x7e\x27\xfb\x8a\x27\xfd\xff\x99\x77\x39\xb1\xcc\x66\xb6\xaa\xf7\x5f\xcf\x26\x28\xa2\x1b\x25\xd7\x4e\x07\xd6\xfe\xdc\x37\x8f\xc1\xfc\xf7\x88\x87\x15\xfe\x7d\xb1\xaa\xab\x4d\xd1\xec\xe7\x09\x26\xa5\x2b\x68\xc1\x33\xc9\x15\x0c\x20\xc9\x1d\x2f\xaa\xba\x2d\x36\x57\x6e\xf7\xe8\x96\xe5\x38\x0d\x7f\x63\xa3\xea\x96\xa1\x7d\x61\x65\x83\x75\xd7\xe5\x0a\x4c\x19\x5e\x2c\xb1\x49\xd4\xcc\x64\x04\x6d\xd8\xfc\xe4\x04\xea\xcd\xa6\xa4\x4d\x12\xc2\xfa\xbd\xfc\x10\xe2\x1a\x8f\x11\xd7\xa2\x8b\x71\x20\x49\xe5\xc1\xc3\x97\x04\xaa\xb4\xf5\xb4\x95\xc4\x34\xae\x3b\xd4\xde\x73\xc3\xe4\x82\x65\x8c\xf7\x1e\x2a\x54\x29\xba\x03\xb2\x50\x7c\x27\x33\x05\x52\xd9\x9a\xb2\x30\x1b\xc6\x75\x8e\x2e\x11\xc7\x7d\x91\x13\x55\x9d\x3f\xd1\x3f\xa6\xb2\x86\x64\x88\x41\x6d\x9d\xa1\x6b\xc3\x9b\xb0\x54\x3c\xb5\x36\x1b\xa2\x31\x34\x88\xc9\xfe\xb5\x63\xa2\x34\x36\x5d\xe1\x82\x97\x45\x89\xf3\xf4\x73\xde\xd3\xbd\x67\x5c\xb7\xab\x57\x3b\x9a\x2d\x98\x3d\x01\x27\x5b\xe0\x5e\xd2\x05\x22\xae\xb3\x22\x7a\xb5\x9e\x86\x1e\x66\x93\x0d\xe0\x91\x36\x60\xbd\xd0\xf9\x95\x75\x7d\x4e\x13\x3c\xa3\xed\x53\xf8\xdd\xdc\xfc\x4e\x75\x78\x5e\x55\x32\x3a\x13\x1d\xba\x89\x22\x04\x1c\xe9\x49\x17\x0c\x54\xf8\x61\x7d\x02\xbf\xfc\x24\x9c\x0e\xa0\x09\xc7\x91\xd4\xae\x0f\xf4\x1f\x4b\x32\x00\xdd\x58\xbd\xb9\xc4\x82\xe6\x96\xf7\x68\xcd\x28\xaa\x2c\x96\x6e\x7f\x0d\xc9\x96\xdd\x12\x08\x62\x94\x9f\x48\xf9\x87\xd1\x93\x8b\xeb\xeb\x62\x7a\x5c\x07\xcb\x59\x9e\xd8\xa4\x47\xf6\x92\x6e\x7a\xc2\x3b\xd0\xe4\x1d\x03\xe3\x9a\x80\x19\x01\x2b\x57\x95\x66\xcb\x8c\x48\xc5\x03\xf7\xc4\xc9\x18\xe6\xd3\x1a\x0e\xea\xe5\xd7\x94\xd0\xd8\x96\x88\x22\x81\x55\xc1\x48\x38\x9d\xad\x69\x48\x0c\xa4\xe2\x92\x2e\xec\x4c\xf8\x79\x92\x67\x55\x0d\xb0\xa0\xfe\x2f\x45\x3e\xaf\x18\x49\x31\xf5\xcd\xbd\xd0\x1c\xd1\xd4\xeb\x6e\x4b\x52\xc1\xf6\x78\x37\x3a\x2b\x6c\xc0\x68\x07\x6e\x17\x70\x60\x39\x00\x5b\x87\xa5\x8e\x89\x5e\x6d\xb0\x79\x4f\x6e\x7e\x23\x74\x40\x54\x6b\xa7\xd3\x61\x2a\x2c\xd5\x9c\xc2\xe2\x5e\xac\x80\x98\xa9\x28\xaa\xd2\xa1\xc8\x28\xe0\x19\xf7\x37\x7f\x30\xa5\xfd\xab\x69\xaf\xdb\xac\xa2\x3b\x92\x9d\x0f\x98\xc2\x29\xcb\xa6\xfe\x1c\x32\xc0\x2c\xf3\x87\x61\xd2\x9f\xdd\x79\xf6\x70\xfe\xc5\x9d\xcf\xa9\x7c\x77\xf3\x1b\x51\xb9\xbc\x6b\x89\x7f\x68\x0b\xba\x06\xbd\xce\x7e\x00\x0f\x63\xdc\x8c\x94\x13\x8c\x6b\xf4\x99\x41\xae\x37\x54\x46\xf4\x98\x51\x8f\xc1\x15\x71\x0f\xbf\x64\x1e\x79\xfb\x5e\x45\xa1\xd1\x1b\x5d\x48\x85\x0a\xb3\x8b\x2d\xb1\x0a\x73\x95\x3f\xb9\x44\x20\xad\xa5\xbe\x16\xdb\xa2\x5d\x6c\x40\x52\xd6\xf3\xc7\x66\x47\x94\x05\xb0\xb5\xcf\x5e\x1b\xc6\x76\x36\xfb\x94\x2a\x7c\x9a\x7d\x57\xef\xf7\x84\x61\x6a\xfb\x65\x76\xf7\x42\x85\x9e\xbf\x80\x58\x00\x21\x14\x25\x20\x56\xa4\x75\x8c\x32\x55\x8d\x10\x21\xc0\x16\x7b\x7c\xf3\x07\x0e\xc6\x49\x21\xcc\x51\xcf\x32\x11\x7b\x04\x97\xe1\x14\x71\xfc\x84\xee\x8b\xeb\x02\xd8\x91\x84\xdf\xea\xe6\xb7\x86\xb1\x05\x77\x05\x54\x71\x97\x78\x16\x00\x7a\x0b\xe5\xd9\xcb\x67\x0f\x9e\xbe\xe6\x56\xdb\x7a\xd9\x11\x7e\x71\xa3\xce\x26\x4e\x6a\x21\x99\x45\x81\xe5\x88\x34\x2a\xf8\x53\x58\xfc\xf3\x9a\x58\xa9\xf3\x96\xd7\xe7\x3a\x18\x63\xb6\x13\x46\x99\x36\x9c\x16\xb9\xbd\xf9\xa3\xa4\x13\xe1\xa6\x9e\x1b\xc6\xde\x10\xf0\xac\x76\x8c\x1e\xc7\x79\x57\x34\x77\x72\x4d\x03\x1c\xc0\x94\xc1\x7f\xff\x12\x2b\x9e\x7e\x4d\xff\x9d\xd8\xfc\xc2\x08\x39\xdf\x8e\x9d\xd6\x99\xb2\xeb\x22\x3b\x7c\xc7\xf5\x3a\x41\x6b\xc9\x82\x92\x1b\x24\x30\xa3\x17\xe3\xd1\x70\x5f\xd2\x85\x39\x58\xb2\xdd\x8a\x90\xb2\x9d\x3f\xa5\x6d\x00\x82\xc8\x7e\x2e\xca\xf2\x9c\xc0\x83\xa4\x13\xfa\x5b\x69\x12\x71\x4e\xbb\x13\x50\x26\x1b\xf4\x19\x8c\x6f\x84\x6b\xad\x5a\xba\x53\x85\xc1\xd9\x33\x8f\x3f\xe3\x96\x97\x37\x7f\x80\xe4\x80\xe6\x11\x10\x60\xa3\xb7\x15\x8b\x3d\xd4\x11\x49\xea\xe1\x60\x53\x8e\xf3\x95\xc8\xda\x7b\x70\x91\xd3\xdb\x4f\x67\xf2\x2b\x94\xaa\x6f\x26\x9d\x48\x5f\x35\xa8\x52\x72\x23\x85\xac\xf6\xb4\x83\xae\xa2\xbf\x9e\xc4\x33\xd3\xc1\x2e\xbc\x42\x16\x27\xd3\x9a\x77\x2d\x2b\xc0\xe8\x5f\x3e\x85\xa0\xa4\xb5\xac\x2f\x25\x7a\xbe\xda\x59\x53\x12\xa3\x75\xc5\x90\x65\xe7\x2f\x98\x4f\x8c\xe5\xb2\x89\xdd\xd5\x97\xac\xf3\xd4\x2a\xbf\x18\x70\x50\x50\x76\x26\xf5\xa0\x2a\x5d\xd5\x25\x5d\xbc\x1a\xc7\x7c\xe1\xaa\x3f\x61\x59\x14\x74\x7b\xd3\xe2\x74\x7a\xbd\xd3\xc8\x75\xb3\x75\x03\xa7\x3a\x3f\x7c\x14\xed\xa2\xfb\x2e\xea\x45\x3b\x61\x8c\xcf\xda\xe8\xbb\x50\x08\xb5\xd0\xe0\x82\x2b\x50\xbd\xda\x8c\x40\x8a\xf5\x76\x32\x85\x67\x15\x8b\x44\x55\x3a\xf2\xe4\x57\xd5\x54\xbf\x11\xcd\xe9\x3c\xf9\x8a\x1b\x63\x83\xde\xc7\x9a\xbc\xa1\x8b\xc3\x3c\x05\xb5\x24\x3c\xbc\x7b\x13\x69\x8c\x17\xaa\x78\x54\x7d\xa7\x00\xb0\x17\xf6\x03\xfb\xbb\x33\x07\x70\xca\x7b\xbb\x9d\x3f\x65\x49\x12\xa0\x08\x01\xb4\x68\x2d\xab\x0d\xb8\xe5\x37\xd9\xb7\x4c\x38\x72\x25\x3a\x9f\x4c\x6c\xbd\x2a\xf2\x72\xf1\x91\xfd\x10\x57\x79\x4e\x60\x7b\xd8\xa0\xab\x94\xd1\x10\xd5\xf6\xfe\xd0\xce\x1f\xd9\xac\xed\x00\x9d\x36\x2b\x4d\xb1\x3e\x19\x51\x78\x5c\x76\x44\xca\x23\x8e\xc3\xe3\xcc\x48\x4f\xc4\xf7\x2a\xaf\x58\x34\x4b\x28\x40\x9f\x25\xc2\xf4\x59\xef\x3d\x36\xee\xfd\x58\x20\x18\x70\x15\x76\xaa\x82\xcc\x70\x42\xb4\xd5\x7b\xb3\x5f\xa2\x73\x13\xab\xdf\x69\xdc\x02\x4a\x73\xe2\x46\xb6\x7c\x4b\xfb\x54\x8c\xf6\x68\x0b\xa1\x48\xaa\x98\x5b\xab\x7c\xe3\x8c\x14\x84\x52\x2f\x01\x23\xac\x8f\x0c\x8a\x32\xb7\xfb\x31\xaf\x10\x36\x87\x99\x82\x99\x23\xa8\xc2\xe8\xb1\xa0\x43\x3d\xb7\xfe\x34\x00\xed\x60\xf5\x92\xad\xe8\x2d\x9c\xb6\xf9\xab\xe5\xd7\x77\xed\x57\xf7\x96\x50\xb3\xb2\xd0\xe5\xcf\x04\x6c\x5e\x53\x2b\x61\xe5\xd1\x59\xa9\x4d\x72\x25\x8c\x3d\x91\xda\x97\x25\xc4\x9b\xdf\x08\x13\x80\xd1\xb9\xbb\x26\xce\x9d\xed\x36\x27\x50\x14\x0c\x81\x20\x5f\x5e\x77\x74\x9b\xa9\xdf\x9b\x7f\x67\x16\x68\xc5\x97\x9d\xaf\x9b\xbb\x05\xa7\x9e\x77\xf4\x03\xf3\x96\x4c\x68\x75\xbb\x62\x49\xf4\x9d\xf0\x65\x64\x06\xc2\xd6\x2e\x6b\xd6\x99\x27\x15\x84\xa3\xc2\xdd\xdd\xeb\x9d\x02\x02\xa5\x0b\x26\x24\x8a\xf5\x8c\x2d\xf4\x8c\x0a\x75\x84\x72\xb9\xbf\x78\x0f\x00\x1b\x7e\x26\x23\x50\xd9\x18\xde\xf7\xb2\x20\x7c\x7e\xf4\x2e\xd0\x1d\x13\xad\xb5\xe8\x7f\xa2\x9b\x66\x32\xb7\xd8\xf8\x7c\xc0\x82\x0a\xe3\x1b\xee\x48\xce\xf2\x04\x3a\xf9\x0b\xe1\xb1\x8a\xb5\xa8\x90\xc7\x68\xcc\x65\x98\x21\x2d\x6e\x9d\x57\x15\x33\x8d\xfb\xbc\x9c\x4d\x76\xb9\x5d\x74\x95\x42\x0b\x89\x3b\x7c\x69\x9e\x12\xdd\xab\x89\x0a\x9f\x44\x93\xe2\xc9\x74\x95\x67\xc7\x5a\x27\xef\x7b\xfd\xc0\x67\x1e\x5a\x3e\x27\xf2\x06\xd5\x2d\x2b\x38\xb9\xe1\x28\x98\x31\x84\xb4\x8e\x24\x0a\x25\x32\x1e\x32\x97\x1e\xf0\x4f\xb2\x73\x42\xed\xe7\x0e\x0f\xf1\x7a\x59\x79\x43\x25\x9b\xba\xdc\x0a\x7a\xb8\xdf\xb5\x2d\x98\x21\xde\x71\xb7\x10\xe8\x19\xb5\xb1\x07\xb8\xb1\x1d\x35\x62\xfd\xba\xee\x00\x2b\x0c\xe9\x4e\xb9\xc2\x2c\x9f\x65\x0c\xd9\x1a\xd6\x23\x0d\x16\x0e\xa8\x81\x62\x9d\x97\xea\x40\xc9\x63\x45\xba\x8c\x3c\x21\xcc\xab\xbd\x65\x5a\x3a\x13\xd0\x75\x87\x13\xa6\xd7\x5d\x73\xf3\xc7\xea\x9c\x1a\x5e\xb3\xc1\x65\x38\x49\xe9\x75\x88\x4d\x92\x96\x9e\x8f\x58\x41\xf9\x30\x44\x89\x2c\xf1\x45\x07\x84\x6a\xbc\xaa\x7c\x09\xe9\xbb\xdb\xb8\xd3\xf1\xcc\xc5\xac\x37\x70\xa2\xd8\x4d\x56\x46\xb2\x7a\x7f\x52\x74\xc3\x65\x5a\xbe\x75\x5b\xd7\x0b\x62\x04\x9a\x96\xd5\xd3\xbe\x3e\x2b\x53\xe9\x3a\xad\x59\x9d\x42\xf3\xfd\xbf\x9d\xe1\x22\x83\x7d\x55\x35\x80\x15\x61\xb8\xb2\x5e\x11\x01\xf3\x64\x12\xf7\x77\x5a\xd6\xe7\xd0\x98\x7d\x27\x02\xa9\x93\xd0\xb8\xf3\x9b\xdf\x1b\x58\x9f\xe5\x9e\x5f\x14\xb9\x70\x69\x6a\x18\x9a\x11\x05\xc6\x31\xbd\x11\xe4\x03\x1a\xec\x3a\x96\xbb\x96\x1f\xc3\x3f\xbe\xbe\x88\x28\xf7\x83\xe8\xe2\x2a\xf6\x61\xe7\x03\xcf\xcf\xd3\x34\xc7\x8c\x0e\xc5\xe0\x72\xcb\x8a\xd1\x93\x88\x3d\x0d\xcd\x54\xc9\x15\x3e\x01\xb9\xdf\xa7\x01\xb1\xd4\x7a\x9d\xd3\x5a\xaf\x8c\x9d\x7f\x9b\xd3\x66\x12\x93\x51\x10\x6f\x54\xaf\xd1\xe2\xe6\xdf\x78\x4b\xa8\x1a\xe1\x9b\xfd\x9b\xc9\x8f\xc4\xb7\xbc\x1c\x48\x75\x60\x6d\xb8\x34\x52\x6b\xe3\xf7\xe4\x51\x64\x7b\xf6\x4b\x7e\x35\x90\xfe\x7e\x30\x6c\x22\xf3\x8b\x37\x3d\x5b\xf4\xd9\xd9\xd3\xd7\xa2\x6d\x83\xd2\x99\xa8\x03\x0b\xc0\x25\x8f\xfd\xb4\x6d\x0f\xf6\xc7\xa6\x9c\x8b\x06\x17\xba\xdf\x57\xf9\x55\x59\xe7\x6b\x14\xea\x9f\x5c\xfc\xda\xe4\x7b\x9e\x25\xfe\xe0\xb6\xa7\xc4\x67\xbd\x4c\x4d\x16\x1d\x18\x34\x2b\xfb\x3a\x61\x5c\xfe\xe8\xb8\xb8\x39\x79\x69\x2e\xef\x37\x79\xb5\xd2\x5e\x44\x77\xc2\x05\x6c\xd9\x98\x3c\xa0\xcd\x2e\xda\xb3\x8e\x64\xc9\xe6\x6a\x2e\xbf\xb2\x5f\x3a\x9b\xe3\x0c\x36\xb4\x5c\x8c\x22\xc5\x2f\x68\x6f\xe0\x2f\xa0\x95\x5e\x3a\x35\xa4\x7e\x7e\xb0\xab\x8b\x95\xff\x0a\x2d\x76\xbe\x2b\x27\xaf\x1b\x63\x5e\x3a\xf3\xa0\x68\xa0\x1f\x30\xb8\xb7\x73\x51\x5c\x4f\xbc\x36\xc3\xb0\x19\xfd\xed\xb8\x91\xe7\xed\x24\x2f\x0f\xbb\x9c\x19\x7c\x5f\xf3\x1c\x84\x82\xe4\x38\x47\x8e\x59\xf8\xe1\x7a\x15\x11\xc2\x06\x5a\x02\xe3\xef\xa3\x18\xc0\x16\xb1\x05\x2c\xe9\x74\x4d\x68\xf4\xe3\x3b\x9e\xf5\x7b\xb6\xc5\x75\x58\x92\xb7\xb9\x3c\x69\x6e\x7e\x27\xb6\x81\xe5\x66\x96\xb2\xde\x4e\x58\xfc\x1b\x54\x66\x9c\x22\x28\x85\xea\xba\xa1\xe2\x01\xf6\xf9\xbb\xb4\x1d\xef\xdb\xee\xe6\x77\x61\x64\x8e\xb6\x13\xa2\xe1\x1a\x01\x87\x0a\x01\x54\xbc\xd9\xbf\xff\xd4\x02\x56\x8a\x5b\xea\x13\xe4\x52\xa5\xa2\x5a\x95\xdd\xba\xbf\x64\x1a\xfb\x35\xa4\xaf\x4f\xef\xda\x4f\x93\x59\x74\xd5\x39\xf1\x8e\x95\x56\xff\x91\xa8\x36\xf6\x1c\x28\x4f\x84\xe8\x2f\x9d\x7b\xc7\x82\x3a\x86\x1e\x60\xd5\x7a\xcd\x9c\x6d\x8b\xfd\xde\x89\xe9\x37\x7f\x30\x33\x42\x38\xd1\xe3\xea\x48\xce\xa7\x2d\x8f\xd1\x29\xb7\x84\x72\xab\xd7\xd4\x3b\xa6\x2c\x96\xc6\x54\x0b\xe2\x99\x4c\x95\x0a\xa1\x58\xb7\xe3\x7a\x98\x0f\x66\x25\x27\x6b\x23\xfa\xed\x7a\x28\xe6\x48\x53\x62\xb2\x07\x2d\x63\xe9\xcf\xde\x32\x6c\x4b\xe8\x61\xd0\xd8\xe1\x8c\x23\x6d\xe4\xd8\xb9\x3e\x2d\x76\xdd\x43\x79\x62\xbf\x8a\x5a\x5d\x0a\x2f\x1d\x36\xc6\xef\x6e\x38\x8f\xa1\x94\xee\xf1\x63\x50\xa3\xa8\x12\x07\x6a\xd6\x16\xa6\xb1\xf5\x22\x51\xe5\x88\x02\x4e\x88\x16\x8b\xb0\xc2\xa6\xe6\x0d\xd1\x74\xd5\x56\xac\xd5\xa4\xf8\x6c\x57\x09\x97\xb7\x35\xbc\x26\x93\xf5\x77\x5a\xc7\xc2\xe8\x23\xe3\x11\xb8\x81\xd0\x7c\xd8\x80\xf1\x30\x8a\x7b\x2d\x58\x90\x02\x0b\xb6\xef\x19\xc9\x13\xcb\xf7\x8c\x93\xdb\x64\x1c\xbf\x7b\x6a\xdd\x91\xde\xbd\xea\xca\xbc\xa3\xdf\x2c\xd3\x49\xfd\x48\x09\xce\x9f\x20\xff\xa9\x2a\x6f\x52\xe6\xb6\x85\x5e\x41\x16\x3d\x7f\x54\xb5\x1b\x90\xac\x8a\x97\x51\x42\x00\xa3\xbf\x5f\x14\xed\x96\xd0\xdb\x1a\x1e\x28\xc2\xcb\xef\xb3\x47\xe0\x05\xda\x9b\x3f\x08\xcb\x4d\x01\x51\xd1\x49\x5e\x77\xe5\xcd\x6f\x96\x24\x3f\x4c\x1f\x7c\x7a\xc1\x96\xcf\x08\x53\x89\x8f\x44\xd4\x05\xc9\x7a\xa9\xd9\x9c\x67\xce\xb8\x81\x2e\x9d\xdb\x2e\xd8\x71\xcf\xcd\xd5\xfc\x39\xf1\x7a\xce\x82\x42\xf0\xa8\xc3\x16\xa2\x41\x7b\x4e\xa4\xe7\x44\xd5\x18\x29\x91\x05\xbb\xc9\x57\xf9\x40\x0c\x09\x31\x82\xd0\xd1\x41\x9d\x04\x51\x9b\x20\x99\x98\x04\x3f\x02\x33\x51\x8c\xdc\x47\x3b\x8a\xd0\x82\xf6\x75\x42\x65\xc0\x35\x2c\xff\xe4\x95\x1e\x1c\xfd\xad\xd8\x8f\x8f\x48\x05\x1c\x55\x76\x38\xd5\xa9\x75\xce\x84\x96\xf5\x80\x24\x28\x12\x2d\x77\x9a\x42\xd0\x75\xda\xa4\x82\x95\xab\xcc\x21\x6d\x08\xed\xb1\xa1\x15\xce\x79\xa2\x22\x9c\xd0\x99\x96\x25\x8e\x50\x1c\xd3\x3c\x1b\x07\x95\x73\xe1\x35\xeb\x89\x12\x2a\x13\xfe\xdf\x29\xe0\xaf\x3b\x28\x61\x68\xdb\xcb\x9b\xdf\x2d\x16\xc7\xd7\x94\x57\x48\x8c\xc2\x36\x32\xe8\xca\x58\x10\xb6\xe0\x7b\x26\xc2\x3a\x34\xb1\x18\xc1\x01\x0a\x1f\x70\xea\x08\x71\xa2\xd2\x8e\xf4\xaf\xab\xbf\xee\x54\x9e\x16\xcb\x5e\x00\x34\x56\x82\x09\xee\xeb\xad\x4d\xa6\x9d\xc0\xca\xff\x81\x45\x4e\xc4\x67\x6b\xb1\x64\x0e\x28\xba\x55\xbf\x14\xa6\x9c\x2a\x5f\xd4\xbb\x4c\xc4\x59\xe2\x0a\xbe\x99\xd0\xe4\xe9\xee\xa9\xb9\xcd\xf1\x9d\xe2\xce\xe4\xbd\xe5\x60\x55\x9b\xfc\xb5\x26\x92\x5e\x83\x80\xd0\x4d\x68\x1b\xc3\xd6\xa6\x7d\x70\x4f\x84\xa3\x5c\xa2\x6b\x53\x07\x3a\x62\x66\xff\xfb\x86\x80\x4e\xd5\x84\xc1\x97\x6e\x42\xcc\x73\x59\x5f\x42\x21\xf7\x58\xa5\xc9\x09\x3c\x8c\x1a\xe8\x9c\xf3\x0b\xe5\x07\xdb\x9e\x66\x51\x1a\x41\xab\xcc\x8d\x32\xea\x54\xcb\xb4\x17\xba\x24\xfa\x9b\xc5\x11\x51\x69\x8a\xb8\x3a\x81\x16\x68\x3f\x63\xcc\x0f\x01\xa0\xb9\xa0\xa1\x62\x37\x12\xc6\xf9\x4c\xd5\x81\x20\xa4\x8a\x28\xa0\x42\xc3\x03\x74\x13\x4d\x25\x02\x2a\x2f\x60\x9d\xd0\x0c\xb9\xd8\x30\xbe\x4b\x4f\x91\xea\x5f\xec\x88\x2d\x04\x1d\xe7\x7a\xf8\x66\xe2\x9c\x13\xd5\x31\x71\x68\xa3\xd1\xa3\x89\x8e\x42\x2f\xbe\xed\xf1\xe5\xaa\x4f\x9c\x9f\xd5\xd7\x45\x90\xc0\xe0\x92\x41\x5b\x2f\xe4\x37\xb8\x6b\xc0\xe8\x0d\x0d\x6d\x4f\x37\xbb\x36\x84\x47\x8d\x38\x58\x7a\xf0\x9f\x74\xc5\x7a\xfe\x63\x41\x52\xcb\xa1\x5b\x52\x5f\xde\xa1\x32\x3e\x59\xeb\x5c\x2b\x9d\x53\xad\xd7\xf2\x8c\xc9\xed\x37\xbf\xfb\x96\x6c\x00\x36\xec\x5a\xc2\xde\x1f\x05\x95\x13\x46\xba\xee\x4e\x94\x38\xf6\x9d\x03\x58\x55\x73\x7d\xf3\x07\xdb\x0d\xd5\x2d\x86\x27\x2c\xee\x23\xb1\xb7\xa6\xea\x2b\x9a\xcc\x39\x13\x03\xad\xc2\x24\x00\x41\x39\x62\xae\x3c\x43\xa0\xda\xcc\x75\x22\xcb\x06\x2b\x6b\x95\xaa\xaa\xf4\x40\x4f\x70\x57\xe2\x5a\x0c\x06\x40\xe0\x4e\xb2\xdd\xc0\x69\x94\x89\xf4\x4f\x04\x9b\x10\x4f\xab\x35\x5d\xa3\x46\xc4\x95\x81\xc7\x33\xc4\x6a\x71\x55\x83\xb9\x1d\x40\xd0\x1d\xe0\xb7\xb2\x48\x81\x85\x2d\x39\x44\x6c\xc4\x6c\xdd\xab\xe3\x65\xd6\xe0\xf5\xaa\x0a\xc6\x48\x6c\x8d\x7b\x80\xf6\x52\x90\xc1\xa8\x43\x33\x61\x22\x59\x4e\xdb\xaf\xe6\xf4\x6b\x82\xbf\x04\x85\xb0\x62\xb9\x68\xce\x9d\x12\x4f\x7d\x7e\x9e\x17\xd5\xb9\xc5\xce\x88\xf6\x2f\x36\x5e\xd7\xa0\xd7\xac\x40\xa5\x8b\xd1\x61\x33\x68\x27\x9a\x11\x1f\x5a\x75\x09\x50\x07\x81\xe5\x95\xe8\x76\x22\xbf\x80\xd4\x15\x00\x6a\x06\x95\x1b\xff\x29\x3f\x05\x6f\x2f\xef\x6c\x5b\xef\x1d\xc2\xbc\x3f\x70\xbb\xb0\x51\xb3\xd8\xdc\xbe\xda\xd5\xb5\x55\xb3\x82\xb4\x15\xab\x42\x5c\x9b\xc4\xcb\x9b\xdf\x76\x65\x38\xcb\xc1\xdd\x4f\xcd\x8a\xe9\xf9\xcb\xdd\xa5\x09\x12\x0a\xad\x5a\xd7\xf6\x54\xad\x7d\xc9\x48\xe1\x66\x1f\x20\xa7\x87\x1d\x61\xac\xb6\x28\xf6\x10\x89\x21\x67\x44\x9e\x20\xea\xe4\xe2\x85\x25\x62\x10\xe0\xfc\x91\xcc\x34\x06\xba\xd8\xcb\x64\x1a\x99\xfd\x04\x0a\xab\x5b\xc0\xd0\x01\xd8\x50\x3d\xa3\x17\x6a\x52\x97\x11\x3f\x1a\xad\xd0\xe1\x4c\xec\xb2\xff\xae\xfb\x1c\xbc\x96\xa0\xf5\x58\xdc\x52\x65\xa0\x08\x19\x11\x13\x86\x83\x8e\x89\x07\xbd\x85\xa4\x77\xd2\xb5\x93\x5b\xe9\xaf\xd7\x2c\x8b\x1d\x54\x83\x71\x81\x75\x9d\x05\xdf\x1b\x28\x6a\xab\xd0\x81\xb3\x28\x45\x08\x4d\x07\xfe\x78\x74\x16\x6b\x0f\x23\x0d\x1d\x0b\x5c\xb6\x27\x67\x79\x07\xff\xf1\xaf\x91\x93\xbf\xc8\x6b\x81\x32\x1c\x9a\x62\xcf\xe6\xf7\x31\xc1\x8d\xed\xb8\x23\xc8\x1f\x48\x3e\xc7\x84\x4c\xf6\x98\x24\xee\xe8\x25\x81\x8a\x77\xe8\x15\x8a\x9f\x57\xd2\xbb\xfb\xed\x3c\x18\x4a\x1b\xc6\x75\x03\x7a\xb7\x68\x77\x8b\xa4\xee\x73\x77\x4f\xdc\xc4\xe9\x1b\xf0\xb2\x2a\x8d\xcb\xf1\xcf\xb2\x40\xa8\x54\x5d\x7b\xe7\x5c\xd9\x73\xd5\xe3\x65\xb2\xdf\xca\xb3\x6a\x53\xab\xd9\x48\x34\x1b\x22\xd9\x88\xdd\x8c\xbd\xc7\x47\x3b\x08\xda\x6e\xe6\x33\x66\xd9\xcf\xb5\xe7\xd6\xa9\xc3\x76\x93\x83\x30\x7d\xd3\x9f\x9f\x03\xc3\xfe\xae\x0f\xc8\x83\xe7\x3e\x3f\x99\xe4\xeb\x35\xdf\x19\xd9\x18\x7e\xe3\xd1\x6b\xbe\x2b\xaa\xeb\x4e\xfc\x87\xb9\xb6\x19\xd1\x42\x8e\x57\x5a\x24\x66\x33\x58\x6e\x8e\x99\xca\xf6\x89\x9d\x8c\x19\x2c\x67\x22\x73\x4c\x7b\x2c\xe9\x78\xfd\x6f\xc5\x36\x32\x5c\x68\x28\xb0\xd3\xd7\x11\xc1\x38\xe6\x6c\x02\x89\xa1\x72\x60\x1a\xf3\xb3\x4e\x90\x5d\x35\xb2\x23\xc3\x0d\xe5\xe5\x6f\x0d\x36\x00\x88\x4e\xef\xcd\x11\x86\x2e\x79\x1d\xb3\x66\x59\x2f\xfa\x18\xef\x24\x3a\x10\xa0\x83\x88\xc6\x97\x1a\xfb\xf7\x1c\x6a\x68\x06\xb0\xa6\x27\x15\x0a\x60\xc5\x36\x38\x4c\x8b\x30\x47\x65\x1c\x28\x89\xfc\xe7\x41\x91\xb7\x52\x7c\xac\x06\xbd\x54\x5e\xfb\xa4\x1a\x2f\xe9\x82\xa7\xa5\x16\x8a\xaf\x6c\xdb\xd4\xd5\xf6\x6b\x12\x47\x3a\x2f\x52\xf1\xf3\xb1\x6f\xbe\xba\xa7\xdf\x32\x36\x63\xf8\xd9\x9f\x56\x25\xf1\x00\x38\x02\x18\x67\xbe\xca\xa3\xb7\x28\x8f\x9a\x6b\xd3\x6d\xd5\xd1\xb2\xa7\x9d\xe6\xe7\x29\x2c\x2c\x25\x4d\x70\x15\x4d\xf4\x2c\x8e\x9b\x11\x85\x22\xf4\xb8\x37\x68\x33\xf3\x20\xce\x1b\x9d\x9e\x44\x7f\xb3\xa9\x4a\xa4\x76\xf2\xde\xca\x36\x66\x6c\xb1\x48\xdf\x83\x55\x60\x88\xd0\x94\xeb\x87\x79\x28\x51\x5f\x11\x55\x8d\x3b\x68\xa2\x0e\x02\x16\xd8\xab\xfb\x7e\x10\xe9\x54\xc5\x35\x9b\xb8\xee\xe6\x3d\x6d\x3d\xca\x57\xa9\x86\x5a\x21\xca\x03\xb1\x68\xd1\x7b\xcb\xe6\x0b\x76\x3b\x14\x7f\xe2\x30\x26\x2b\x3b\x1c\x42\x74\x6b\xf3\x18\xb3\xd7\x71\x79\xac\xe2\x31\xdc\x69\x7b\x53\xb3\x11\xf2\xc4\x5c\x76\x37\xbf\x37\x6c\xf1\x19\x7b\x00\xa0\x82\x40\x50\x35\x78\xa8\x9e\x65\x2f\xa0\x5b\x6e\x47\x70\xe6\x60\x66\x6e\xa7\x7a\x4b\x79\x2f\xd6\xa4\xd5\x3f\x8d\x36\x0c\x52\x33\x6b\xb2\xf8\xc8\x7f\xe9\x4a\xe7\xcd\x21\x70\x81\xcf\x78\xc3\xe2\xa4\xe7\xef\xbc\x69\xb6\x4a\x44\x1b\x3e\x53\x58\xca\x4d\xb8\xf9\x29\xc0\xc8\xc4\x0a\xf1\xda\x70\xea\xb1\xff\x27\x7b\xcd\xca\x03\x3f\xde\xa4\xad\x49\x16\x1a\xf4\x64\xb3\xd7\x28\xbf\xbd\x13\x71\x3a\x6e\x03\x1e\x13\x01\xf4\x27\x4f\x95\x4c\x66\x13\x61\x34\xc2\x68\xea\xfc\x72\x14\x6b\x05\xd2\x06\xed\x99\xf4\xd2\x68\x37\xb7\x20\x27\x3f\x36\x1f\xfb\xfb\x10\x54\x57\x2d\xe9\xdf\x79\xdc\x28\x74\xaa\x5f\xfd\xb9\x3f\x2c\xd2\xee\x19\x2d\xe9\xcc\xd4\x3b\xc4\x01\x83\x74\x11\x61\xf8\x9c\xbb\x58\xf0\x5e\x63\x38\x6c\x02\xba\x20\xd4\x68\x89\xd3\xd3\xdb\x4e\xb0\x9b\xc3\x3a\xce\x5b\xaf\x0f\x80\xd4\x15\x49\x5a\xbe\x64\x30\x90\x93\x31\x8a\x03\xe5\x00\xad\xdf\xc9\x58\xad\xcc\x55\x5a\xdf\xc4\x31\x95\x98\xb8\xde\x13\x2f\x9a\xb1\x43\xe5\xe9\xab\x67\x11\x24\x3a\x05\x93\x1f\x5f\xc6\xf8\x96\x9f\x1f\xb8\x49\x30\xcb\x48\x63\x32\xdf\x11\x77\x5a\xb8\xdb\x36\x53\x10\x63\xc4\xc4\xcd\xc4\x4a\xe9\xd7\x27\x6b\x93\x0e\xb9\x50\xe4\x99\xf4\xbb\x1c\x83\x11\xde\x39\xd9\xa8\xd1\x1b\x28\xbd\xb4\x9f\x10\x69\x0f\x0a\x4c\x51\x5a\x46\xfe\x82\xeb\xb0\x35\xf5\x81\x51\x29\x1b\xb0\x58\x17\x2c\x3a\x30\xe2\xc0\x0f\xb8\x6f\x4e\x71\xcb\xea\xa4\xbc\x12\x77\x62\xdd\x4f\x8f\x02\x65\x21\x1e\x09\xc6\x87\x1e\x30\xe1\xab\xe8\xc8\xfd\x59\x7a\x98\x1b\x6d\x73\x1c\x29\x1e\x92\xce\x92\x6d\x79\x1f\x86\xec\x3d\x16\xfb\x20\x9c\x18\xaf\xd3\xdf\x8b\x57\x7d\x18\x66\xfc\x7b\xf4\x6c\xdc\xe5\xf8\x84\x1d\x2f\x45\x42\xc0\x38\xb2\xbf\xcc\x4b\x85\x49\x91\xf0\x91\x08\xb9\x74\xa3\x74\x0e\xce\x37\xa0\xa7\xaa\xd2\xaf\x89\x4a\xe2\x94\x65\x04\xd9\x8e\x40\x03\xd6\x79\x07\x26\x90\x58\x67\xaf\xe6\x85\x64\xc1\x8a\x74\xc7\xad\xb0\xf3\x6f\xe0\x4f\xd8\x37\x80\x5d\xd6\x8b\x2d\xc1\xd8\x1e\x36\x10\xbd\x25\x9f\x78\x5f\xea\xde\xfc\xe4\xc4\x2e\xf8\xc1\xf6\x36\x71\xab\x4e\x2b\xaa\x77\xf7\xf8\x72\x5c\x1d\xef\x8b\xae\x0f\x32\xd8\x3d\x5f\x20\xa1\xbf\x28\xda\x39\xd7\x4b\xef\x40\xa1\x97\x61\xd5\x59\x7c\xb2\x93\x5f\xa1\xc9\x7d\x33\x11\xd3\x8a\xb3\x09\x05\x5b\xe0\xc0\xc7\x20\x58\x09\x95\xc3\x03\xf3\xb2\xed\x5a\xd3\x0c\x2c\x58\x58\xb4\x61\xcf\xae\xcb\x9b\xdf\x77\x95\xd8\x9d\x3b\x9b\x9d\x77\x84\x9f\x2a\xbc\x47\x56\x53\x0c\xdd\xae\xe6\x5c\xdc\x8a\x70\x14\x06\x46\x98\x4e\x1d\x39\x3c\x5d\x83\x50\x0a\x40\xb8\x20\x90\x58\x16\x25\x68\xe4\x19\xda\x2f\x73\x6a\x5b\xb4\x52\x8e\xe2\xf8\x11\x5a\xf2\xf6\x9d\x49\xcd\x57\xf6\x40\x12\xc4\x0a\xaf\xe7\xe6\x77\xba\x22\x6b\xcc\x3a\x83\x4f\xed\x9d\xaf\x49\x38\xbc\xc8\x5b\x3a\x75\xaa\xf0\xf5\xa0\x3b\xbc\x80\x5f\xa9\xde\x38\xf5\x4e\xc0\x3b\xb7\x0d\x2d\x95\xc8\xbf\xd9\xb6\x8a\x65\xf8\xfa\x09\xf5\x4e\xde\x45\x7e\xe0\xf0\xec\x27\xe0\x6c\x02\xd1\x5c\xf0\x0c\xdf\xad\xef\x33\x96\x95\x82\xde\x4d\x01\xe2\x67\xd1\x46\xf5\xb4\x70\x3c\x1f\xbc\xdc\x67\xfb\xd8\xe7\x93\x55\x49\x12\xa7\xeb\x89\xfd\xbc\x1c\x83\xce\xcc\xb9\xb8\x7d\xe3\x7d\x1e\x01\x49\x06\x7d\x6f\x15\x8c\x41\xb7\xbf\x17\xe7\xf6\x60\xac\x3f\x99\xf0\x6c\xd9\x22\x12\x1d\x02\x0a\xc5\x31\xf3\x5c\x9e\xc3\x61\x56\x20\x5e\x52\x34\x76\x8c\x59\x7c\xd0\x4c\xe7\xd8\x21\xef\xbc\xed\xef\x6e\x50\xc5\x10\x35\x13\xed\x05\xb5\x52\xd3\x36\x5f\xa2\xfb\xfc\xfc\xcf\x14\x4b\xb8\x82\x70\x31\x5c\x9b\x7c\xd8\x08\x2e\xd9\x16\x04\x7b\x15\x7c\xa4\xdd\xfb\x7a\xd1\xce\xf9\xa7\xd3\xd9\xcc\x57\xc9\x34\x02\x05\x76\x75\x42\x10\x4e\xf8\xd7\xcc\x9f\x17\x04\xdf\xd7\xee\xe7\xd1\x5e\xa4\x1a\xb7\x6c\x4c\xbe\xe6\xcb\x86\x7f\xf4\x97\x6b\x27\x85\xf1\x40\x4e\x5b\x88\x07\x24\x0b\x82\xc4\x36\xde\x5f\xc8\x0b\xfc\xea\x8c\x6b\x61\x8b\xdc\x23\x35\xdc\x2d\xed\x05\x2f\x73\x69\x09\x41\x89\xa8\xde\xcf\xfd\xc3\x0a\x5e\xcf\x6b\xb3\xc9\xbb\xd2\x59\x9b\xe6\xfe\x41\x98\xd8\x99\x34\xfc\x04\xe1\xdf\xae\x32\xc1\x42\x9b\x14\x6b\x8c\x12\xfd\xe6\xd9\xb6\x4b\x53\x58\x71\x30\x8c\x28\xad\x93\x71\xf8\x3d\x83\xa3\x1c\x7d\x67\x73\xe9\xbb\x80\xc1\xfa\x82\xd8\x4f\x71\x27\x9f\x3e\xd3\xdf\x65\xf6\x59\x51\x39\x09\xff\x73\x57\x9b\x18\x73\xc8\xe8\xae\xb2\x73\x92\x4a\xbf\x2a\xa8\x48\x7c\x04\x90\x28\xe7\x12\xac\x84\x16\x9a\x4f\xf7\xb6\xd9\xeb\x64\x64\xdf\xe9\x9e\xec\xf6\x40\x53\xda\x23\x73\xfc\xf6\xaa\x5a\x45\x3c\x3f\x7e\xee\x88\xb2\x88\xde\x73\x72\x09\xef\x0e\xf1\x4f\xaf\x97\x6c\x5e\x6f\xd8\x20\xb6\xcd\x61\x9d\x87\xbf\xbb\x98\xc5\x5a\x91\x7b\xf9\x9a\x58\xbe\x35\x56\x2d\x5b\x74\x76\xab\x9d\x3a\xbd\xd6\x9b\x05\x9f\x25\x58\x0e\xb1\x71\x09\x4a\x67\x34\xc5\x5a\xa5\xfc\x5d\xb1\x07\x6b\x7e\x5a\x5d\xe7\xbb\xd2\xa9\x42\xf4\xa4\xe9\xba\xf4\x2f\x95\xbe\x01\x4e\xac\x61\xde\x8c\xd6\xc7\xf9\x1f\x61\x45\xeb\x75\xf1\x41\x86\xb4\xca\x40\x77\xdd\xb5\x3b\x36\x3e\x07\x1f\xb2\x10\x4f\x62\xa2\x41\x4e\x24\x1c\x84\x0f\x72\x62\x11\x0f\x22\xfe\x74\x9c\x5a\x30\xdf\x00\x34\x9c\xe0\x6c\x7e\x7f\xb1\x2c\x3b\x73\xe7\x6b\x81\xa1\x18\x63\xfb\x9e\xfb\xf7\x08\xe5\xfa\x0a\x56\x6a\xcc\x04\x01\x3b\x70\x74\x40\x24\xec\xe8\xb1\x6a\x91\xd4\xc4\xec\x0a\x63\x91\xf0\x9e\xfa\xde\x93\x67\xaf\xe1\xc0\xe4\x5d\x7b\x33\x51\xfc\x36\xfa\x18\x95\x83\x31\x88\x13\xa7\xeb\x9e\x56\xbe\x2f\xac\x15\x5e\xb3\x2a\xa0\xd3\x60\x09\x02\x06\x7c\xe3\xc2\x24\x00\x24\x59\x76\x78\xb6\xc7\xe3\x71\x71\xc5\x74\x5d\x27\xb6\x6c\xdf\x6f\x78\x49\x03\x47\x51\x7e\x46\x03\x60\x54\x1f\x51\x7e\x51\x93\xbc\x9e\x39\xe9\x1b\xaa\xf5\x39\xb3\xb3\x39\x7c\x0f\x0d\x55\x13\xfa\x1f\xbc\x51\x0a\x61\x6c\xc4\xdb\x40\xaf\x1f\x13\x18\x39\x27\x7f\x77\x08\x72\xb8\x58\x69\x48\x20\x3d\xfc\x1c\x9b\x38\x8d\x4d\x12\x2a\x82\xc7\x1f\xd0\x2f\x26\xf3\x2a\x6e\x09\x8f\xdd\x82\x15\x3c\x5c\xd1\x35\xac\xce\x89\x9d\xd3\x73\xf4\x45\x9e\x6d\x96\x4f\x71\x6d\xf5\x1b\x7b\xc8\x6c\xa6\x12\x88\xff\xf8\x6f\xff\x63\xfa\x40\x36\xe1\xac\x6d\xb6\xf4\x37\x0e\x20\xee\x16\x87\xf5\x28\xe2\xaf\x55\x92\x21\xe9\x95\x11\x4a\xc0\x26\x90\xd7\x45\xc7\xdd\xff\x40\x75\x81\x68\xd4\xec\xde\x46\xe2\x48\x52\x1c\x2b\xc1\x38\x0e\x10\x70\xcf\x04\xda\x0a\x86\xc7\xef\x9c\xcb\x79\x20\xac\x7f\xeb\x8a\xd5\xf9\x62\xdb\x15\x6b\xe2\x6c\x89\xdb\xcb\x9d\x4a\x4f\xf9\x8e\x76\x57\xd8\xc8\x55\x22\xb9\x76\xe7\xcc\x74\xc4\xcf\x71\x98\x28\xaf\xe4\x85\x60\x88\xe6\xe4\xdf\x67\x54\xbd\x10\x47\xc0\xc4\x2d\x34\x45\xf2\x56\x4d\x1e\x16\x5e\x1b\x02\x98\xc9\xa1\x83\xc3\x25\x20\x4d\x46\xbf\xcf\x1c\x2a\x36\x27\xe9\x80\x9f\x71\xf7\x1b\x67\x68\xcc\x5e\xbe\x34\x1b\x9a\x3e\x87\xfb\x38\xc2\x64\xc2\xd5\x33\x3c\x5b\x60\x2f\x3d\xe6\xde\x55\xa4\xbc\xc4\xd3\xb4\xe6\x93\xc9\x84\x1d\xc4\x1f\xd0\x7f\x26\x4a\x56\x95\x9a\xb6\x8d\x41\x68\xae\xa6\x23\x19\xa8\x99\x6c\x8a\x12\x5e\xc5\xea\xe7\x81\xf8\x26\x6d\xbe\x9d\xc3\x65\xd5\x79\xbf\x4a\xe4\x95\x7c\x9b\x49\xd5\x4a\xbb\x23\xa9\xf9\xbe\xfe\x31\xa1\x26\x76\x4e\x55\xfa\xd1\x8a\x10\xd7\xa8\x1f\xcf\xa8\x24\x01\x83\x0a\x9f\xe3\x1f\xba\x49\x25\x15\xd2\x99\xf0\xb3\xad\x52\x9f\xda\x9b\xc9\x8a\x7d\x63\xad\xfa\xc8\x82\x85\x29\x4d\x6e\xd9\x1b\x44\xfe\x98\xb0\x39\xba\xc9\x2f\xe7\xdf\x93\x00\x5a\x54\x79\x29\xb6\x0e\x29\x27\x08\xe0\xe0\x56\x3f\x31\x52\xdf\x48\x21\xbf\x04\x43\x8b\xd3\xca\x8a\xbf\xd4\x3e\x1b\x6b\x0c\xb4\x95\xf3\x45\x7b\xe5\xfe\x92\x0f\xf0\x6c\x2f\xc1\x9a\xaa\x08\x18\x4c\x97\x24\x65\x6c\x9b\xfa\xe6\xdf\xf9\x1e\x11\xe9\x33\x2c\x8b\x4d\xcc\x1a\xa7\x36\xe3\x10\x57\xb0\xb0\xb3\x81\x83\x5b\xb9\x4f\x62\x2a\x95\xaf\xd2\x1d\x8c\xa3\x6c\x1a\x75\x55\xf0\x4f\x5c\x61\x69\xf2\x66\xc9\x4f\x8d\x5d\x8d\x43\x63\x78\x6d\x62\x9f\xb3\x88\x5b\x06\xff\xa1\x4e\x5e\xf2\x39\x16\x3e\xd4\x5f\x11\x7a\x87\x3f\x0f\x3a\x86\xc3\x3d\xa8\x0e\x8f\x60\xd5\xa4\xc7\x8e\xa8\x8e\xb1\x73\xa8\xca\xa9\xba\x74\x74\x27\xa3\x26\xd3\xe4\xab\x77\xeb\x5c\xf7\x1d\x5d\x8f\xa5\x59\xd0\xb0\xb9\x67\xf7\xa2\x77\xd0\x2c\x53\x48\xa4\x39\xd8\xf2\x05\x02\x97\x30\x84\xbb\x77\x46\xd1\x82\xf8\xf5\x98\xa8\x28\x65\x3c\x42\x29\x62\x57\x61\x2e\xb4\x16\x7f\x48\x2a\x12\xbe\xc9\xcd\x81\xf1\xf1\x12\x08\xda\xf0\x26\xcc\x7f\x14\x0b\x8d\xf4\x41\x67\x19\xa6\x7d\xe2\x27\x26\x3e\x89\x76\x88\xac\x5d\xaf\x4e\x8d\xd1\xdb\x82\x60\xce\x8b\x36\x60\x87\x17\xb1\x97\xe0\xba\x54\x89\x37\x7f\xd8\xb1\xaf\x5f\x0b\x99\x14\x88\xee\x5a\x95\x5e\xaa\x3a\xfa\xaf\x59\xb7\x78\xd0\xf0\x34\x63\xfd\xa3\xf4\x71\x44\x2d\x1f\xe9\x9d\x1d\x38\x83\xd7\xe2\x47\x5c\x61\x99\xe2\x9d\xe2\x6c\xdb\x78\xe0\x19\x8d\xe9\x05\x7a\x6c\xb4\x78\x3e\x0a\xc9\x15\xe4\xef\xd0\xff\x49\xb6\x2d\x96\x51\x24\x21\xa0\x5f\x76\xde\x11\xd2\x95\xdd\x9b\x65\xfd\xf6\x88\x93\x14\xcc\x9a\x44\x2a\x8d\xde\xc0\x4d\xce\xaf\x01\x6d\xf6\x18\x46\x6c\x9b\xf4\xe3\x94\x93\x3f\xe0\x67\x4b\x2c\xb4\xf1\xb3\x25\x42\x89\xcd\x8b\x2e\xca\xca\x94\x0b\x76\x28\x9b\xe7\xde\x5b\xc4\x7d\x65\xdc\xe4\x6f\x5d\x7c\x3e\x34\x49\xaa\xb9\x8a\xa0\x03\x3a\xfb\x76\x7f\x28\x45\x6b\x2f\x0b\x66\x52\x40\xdb\x7e\xef\x2b\xb7\x4b\x5f\x7f\x1a\xd5\x9f\xf3\x89\xc4\xf4\xd1\x23\x0d\xc8\x08\xf2\xd9\x39\x2f\x24\x40\x28\x9f\xfa\x90\xa7\xf3\xdd\xcb\xe3\x04\x1f\xd4\xd1\xf8\xf7\xdd\xa2\x6c\x4b\xa9\xad\xf0\x82\xb1\x6d\xc6\x69\x70\xc3\x19\x6b\xc7\xeb\x02\x4e\x0c\xe5\x15\xe1\x49\xb9\x05\x7a\xbd\x1f\x16\xe2\x00\x2c\xea\x7e\xd5\x82\x39\x8e\x57\xea\x4c\xb1\xf8\x3b\xfc\xe2\xcc\xa9\xc5\x9c\x8b\xa1\xdf\xc9\x30\x5c\x20\xde\x3a\xc2\x23\x86\x09\xa7\x5f\x13\xc5\x88\xb4\x0f\xfd\x49\xb8\xa6\x82\xa3\xd4\xe9\xcb\x0b\x2f\x7f\x3a\xc5\x10\x2c\xba\x44\xab\x32\xa5\x55\x99\xc4\x26\x0b\x23\x87\x21\x45\x49\xc5\x5b\x38\x78\x29\x12\xef\x4c\xdf\xd1\xa8\x7f\x2b\x14\x15\x2f\x8d\xa3\xf8\xee\x4a\xf7\x03\x93\xc5\xb1\xcd\xa4\x0f\x47\xb1\x4b\x08\xf4\x57\xc2\x78\x38\x92\xac\xaf\x08\xfa\xb6\xbc\x28\x62\x56\x40\x63\xbe\x43\x39\x3f\x2a\x01\x03\x92\xcb\xe5\x16\x89\x6b\x2f\xf6\x6f\x67\xcb\xa5\x6d\xea\xbf\x54\x67\x2e\x4d\xf0\x08\xeb\x3b\x71\x77\xa3\x3a\x43\x74\xc0\x43\xf8\x11\xfb\x68\x68\x38\x73\x04\x8d\xeb\xc7\x5e\x3a\xba\x12\x46\x74\xf8\x1b\xa1\x36\x88\x93\x24\xa6\x6f\x4b\x3c\x8e\x6e\x51\x3a\x16\x22\xd3\x95\x70\xd5\x92\x77\xd1\x01\xf1\x87\x39\x8c\x8d\x15\xe9\x13\xd2\x61\x05\x1d\xac\x17\x97\xbb\x68\x12\x1c\xb9\x84\x83\xf5\x71\x84\x45\x7d\xa5\x27\x63\xe1\x92\x41\x7c\x66\xca\x17\xc8\x50\xe4\xba\xf3\x1e\x8d\x58\x78\xa5\xc7\x56\x6a\x75\x37\x88\xd1\x11\xfc\x13\xc1\x89\x9e\x08\x69\xd0\x07\xa3\xd6\xdf\x18\xbd\x0f\x8a\x20\xab\x70\x69\xc6\xfb\x62\x60\x50\x14\x11\xdd\x0e\x89\x7a\x9a\x82\xe3\xa3\x00\x17\x2e\x5c\xa1\x20\xf7\x8f\x01\x50\x3a\x49\x45\xb6\x40\x31\x08\x36\xa0\xe2\x41\x3c\x3f\xa2\x7b\x3b\x38\xf2\x44\xf3\xe2\xb8\x5a\xf5\x42\x9d\xca\x18\xae\xe3\xf8\x13\xea\x9f\x7c\x2f\x30\xff\x6b\x4f\x58\x31\xcd\x99\x7b\x68\x03\xd9\x2f\x42\xe7\xb6\x5b\x12\x00\xcf\x7f\x64\x95\x50\x04\x9a\x26\x0e\x09\xeb\x50\xb6\xf8\xf9\xf1\x2c\x3c\xc7\x67\x93\x69\x3c\x75\x8c\x5f\x18\x5e\xb6\xfb\xd8\x1c\xe2\x9e\xd0\x33\x26\xe3\x9a\x79\x2e\x52\x3c\x10\xd1\xc5\xc4\x31\xd5\xb3\x3e\x73\xed\xca\x35\x72\x81\x16\x4b\x1c\x4e\xcb\x7a\x5b\x5f\x05\x7c\xd8\xfc\x31\x33\x63\xbe\x2c\x67\x25\xc9\x9c\x9f\xdb\xf9\x42\xa5\x32\xf3\xf0\xf6\xcd\x7d\x61\xda\x45\xf3\xec\xf6\xbe\x48\x22\x54\xdc\xfc\x5b\xc9\xce\x99\x5a\x48\xc8\xd6\x68\xac\x58\x1f\xac\x01\x11\x77\xc5\xad\x8e\x05\x8c\xa8\x78\x96\x88\x15\x51\x39\xae\x3f\xca\x18\x54\xb2\xc1\xe7\x15\x89\x13\xcd\x22\x6e\x6c\x23\x49\x35\xaa\xe8\x25\x95\x58\x50\xe9\x0d\x14\xea\xf0\x60\x47\x2a\xca\x90\xa3\xfd\x8d\x0f\x8d\xc0\x52\x51\xfd\xef\xe1\xcb\x61\xb2\x44\x5e\x4a\xba\xaf\x2d\x1e\x7f\xfb\xfa\x4f\xf8\xad\x44\x0d\x2e\xf6\x78\xab\xdc\x72\x38\x62\x33\xff\xa5\x73\x9e\xc4\xc3\x39\x8f\x54\x62\xa5\xf9\xe8\xac\xe1\x6f\xe0\xea\xbf\x2c\x0c\x64\x5d\x82\xe6\x7e\xe7\x42\xcc\x45\x5e\x8c\x14\xc2\xa1\x1f\x3d\x3d\x39\xf5\xfe\xf1\xc9\xc7\xc5\xa1\xcc\x57\x46\xe3\x9c\x70\x95\xa9\xa3\xc3\xc9\x28\xda\x15\xd7\x18\x8e\x25\x5d\xb9\xe0\xcf\x76\x26\xa6\xb3\xe7\x39\xfc\x6b\xea\x38\x04\x5a\x32\x89\x7e\xab\xa2\xda\xd4\x78\x95\x1d\x9e\x84\xc8\x1b\x40\x19\x34\x20\xa7\xc4\x1f\x73\xa4\x7f\x17\x7b\xcd\xe1\x6c\x30\xad\x77\xa2\x4d\xb8\xe3\xdf\xd1\x77\xc2\x13\xdb\x5e\xd0\xd0\x23\xf3\x1b\x37\x17\xdc\xbe\xa6\xce\x1a\xa7\x8a\x90\xb9\x9d\x21\x4c\x86\xce\xef\x58\x23\x87\x75\x83\x7c\x1b\x23\xbb\xe7\x1e\xd1\x49\x8f\xaf\xb5\x5d\x84\x76\x25\x70\x8f\x74\xce\x37\xa0\xcd\x97\xf3\xbb\x6b\xc4\x59\x0a\xa3\x32\xb0\xbb\x2f\xdb\x00\xe8\xee\xbb\x6a\x37\xa2\x83\x1f\xfb\x02\x1e\xc1\x12\xe7\xbc\x6a\x23\x2c\x91\x39\x23\x47\xaf\xc5\xad\x88\xa0\x5f\xa7\xdf\x73\x7c\xd7\x23\x3b\x4a\xaf\xf9\x2d\x97\x31\xd4\x40\x0c\xe0\x7e\xff\x08\x55\x9a\xdc\xcc\xe3\x63\xb0\xe6\xfa\xf5\xd5\x61\xa4\x78\x86\x50\x49\xaa\xc8\xe1\xc8\x7e\xaa\xcd\x19\xab\x69\x35\x8a\x39\x9d\x34\x89\x84\xaa\xe0\x85\xac\x70\xc9\xac\xf6\x58\x1b\xb9\x8c\x6b\x78\xd9\xa3\xc9\x4f\x91\x67\x09\x43\xef\xd8\x4c\x89\x9e\x54\xd0\xbf\x82\xa1\x43\xa3\x47\x0d\x16\x55\xb5\x00\xe0\x5e\x75\xcb\x91\x4f\x9d\x2a\x79\xe4\xe3\x8c\x01\x54\x03\xf0\xb4\x63\xcd\x99\x20\x51\x0d\xa6\x48\x47\xaa\x10\xe7\x4a\x53\x52\x51\xec\x3b\x12\x2e\x24\xa0\x54\xec\x74\x3e\x3a\xb6\x21\x81\x53\x5b\x9d\xee\x11\x3d\xbb\xda\x72\x34\x15\xe1\x27\xdf\xd7\x7c\x5f\xdb\x76\xc5\x3a\xbf\x16\xcd\xf7\xa6\xe0\xc6\xa2\x06\x6c\x6f\x1d\x34\x6a\x76\x69\xaa\x62\x7b\xac\x21\xee\x1a\x9f\xce\xfc\xee\xaf\x5f\xbc\x41\x3c\x5d\x78\x0f\xc2\x85\x13\xe2\x6a\x70\x7f\xfc\xf5\xcf\x6f\x88\xfd\xbc\xfb\xeb\x5f\xde\x58\xf0\x9d\x83\xe6\x8b\x4d\x7e\x6e\xe6\xa1\xb5\xf4\xc6\x06\x21\x34\x75\xf5\x59\x79\x55\x77\xac\xb5\x22\xe9\xb3\xd8\x46\x64\xe9\x1d\x1d\x92\x86\x9b\x49\x31\x81\x04\x52\x1d\x20\x82\xb5\x7e\x79\x32\x44\x04\x55\xb7\x5f\xe8\x0e\x58\xe0\x8a\xef\xe4\xef\xbc\xf1\x3d\xeb\x57\x98\x7e\xda\xf9\xdb\x68\x63\x4c\x58\xf4\x9f\xc0\x71\xdf\xe5\xf5\xbe\x75\xed\xdc\x0b\x09\x69\xe0\xc3\x96\x9e\x81\x00\xf8\x48\x3e\x43\x27\x21\x91\x44\xfd\x34\x82\xbf\xc8\x25\x7b\x3d\x7d\xe3\x27\x5e\x7b\x27\x4b\x66\xf5\xb7\xc5\x92\xbd\xeb\x97\xc4\x69\xf6\x82\x06\x1a\x17\xe2\x76\x96\xa2\x47\xfe\xc1\xde\x9b\xe2\x6e\x9c\x7e\x75\x13\x97\x5a\xdf\xf9\x75\xab\x58\x6c\x07\xcd\x1a\xc3\x87\x20\xf5\x7f\x66\x6d\x73\x26\x87\xdc\xaf\xf2\x9e\xae\x2f\x47\xdb\x2a\xad\x76\xe0\x1a\xb7\xea\x1d\x36\xce\x09\x92\x13\x1d\x4f\xb1\x06\x44\x12\x80\xdd\xf1\x27\xc5\xbf\xbe\x66\x58\xd3\xe0\xf2\x1e\x28\xde\xa6\xf3\xfc\x4f\x77\xa5\x13\xf7\xb0\xfd\x36\x86\xa1\x02\xea\xff\x8d\xef\x51\x1d\x27\x84\xc1\xf9\xb0\xee\xc3\x1b\x63\x15\xcc\x1a\x44\x78\x35\x15\x1e\xc0\x86\xb1\x0e\x35\xa7\xb9\x70\x52\x4b\x13\xe6\xe0\x22\xab\x71\xc6\x86\x56\x25\x5a\xff\xbd\xe7\x8c\xa3\xa5\x2e\x40\xa6\x0b\x31\xc1\xaa\x8d\xc4\xd7\xd9\x45\x60\xc2\x14\x59\x21\x99\xab\xa4\x52\xd8\xf3\x8e\xad\x7c\x19\x91\xb5\xd2\x29\x1d\x3d\x0c\xb2\x86\xf5\x7e\x50\x04\xbb\x69\xf6\x55\x23\x6e\x22\xf9\x05\x12\x6d\x68\x48\xc0\x1e\x77\xa1\x2c\xd9\x52\x3d\x90\x93\x8f\xb4\xee\x5a\xd9\xbf\x0d\x06\xeb\x7f\x85\xdf\x14\x5d\xfc\x11\x4e\x27\x80\xb3\xf5\x0c\x46\x9f\xe8\x49\xcd\x23\x6b\x91\x8f\xaa\x7b\xf3\x9e\x7a\xc9\x47\x8d\xc1\x22\x9c\x85\x53\xda\x0d\x9b\xc3\xb0\x2e\x75\xca\xd1\x6e\x46\x9c\xf7\xb8\x36\x9b\x93\x81\x5b\x73\x16\x60\x23\x3f\xd7\x4a\x17\x12\xfc\x47\x8f\x7b\xe2\x8d\x0f\xe5\x54\xc5\x3a\xd2\x6d\x1a\xe2\x08\xd9\x1e\x72\xa2\xc0\xab\xe2\x90\x2b\xc2\xbd\x6f\x00\x1d\x88\x35\xe5\x6a\xe5\x6d\x4b\xc2\x21\x2e\x77\xe0\xef\xde\x7e\x17\xb8\x5a\x40\x5d\x30\x05\x88\x56\xef\x75\xbe\x64\x0d\x84\xa0\x8c\xb7\x23\x5d\xad\x09\xbe\xc1\x73\x0e\xbb\x72\xe1\x37\xaf\x3b\x96\x8c\xdf\x4e\xc4\x3c\xe5\x85\xca\x26\x8b\x0d\x55\xfa\x91\x6e\x34\xad\xc4\x8c\x6a\x79\x11\x32\xa2\x94\xb8\x21\xe3\xb5\xe5\x94\x7e\xb9\x24\x8e\xd6\x99\xca\xe2\x46\x3d\xb5\xa3\x1b\xd9\xab\x2a\x13\xbd\x46\xc4\xda\xa7\x63\x2d\x73\x62\xcf\xef\xd3\x7f\xfa\x73\x90\x7f\xe7\xc3\x59\x26\x26\x3f\xa7\x31\x74\xc6\x3d\xdd\x93\x1a\x5e\x18\x5d\x49\x67\x27\x7c\xe5\x23\x44\xc7\xa8\x0a\x7d\x1f\x04\x45\x30\xfb\x3e\xb9\xda\xed\x0e\x9c\x59\x5b\xfb\x51\x49\x04\x62\x4a\xc5\x6c\x8d\xd5\x38\x57\x6e\x1e\xec\x0a\x8b\x29\x4b\xac\xed\xa7\x26\x77\xae\x3e\x99\x54\x51\x4f\x6a\xe9\x1d\x2f\xed\xe3\x04\x29\xf3\xb7\xd4\xf9\x50\x75\x04\x96\x3a\xd9\xc6\xeb\xcb\x22\x72\x6b\x85\xa1\xba\x80\xd0\x81\x07\xec\x08\x1b\x10\x71\x32\x84\x7f\xef\xf1\x58\xf7\xc0\xce\xac\x15\x17\xff\x89\x7f\x08\xad\xd7\xad\x15\x61\x35\x19\x25\xc8\x91\x52\x87\x71\x94\x1c\xfc\x5e\xee\x19\x73\x3e\xeb\xcc\xa9\x55\x98\x8b\x82\x6d\xd6\x61\x7c\xfe\x5b\xf4\x34\xae\xfc\x2f\xa1\xfc\xda\x45\x18\x92\x08\xac\x3a\xca\x1e\xda\x58\x65\x77\x64\x30\xd0\x9a\x7f\x6a\xa0\xbb\xbf\xfe\xcb\x1b\xeb\x87\x63\x65\xff\xae\x71\xd7\x80\xee\x26\xd8\x10\xc4\x2a\x53\xef\x1f\x8f\xf5\x93\x1a\xa9\x62\x29\x7c\x11\x75\xd7\x13\xa7\xd3\xf4\xb1\xcd\xb5\x8a\xf2\x0b\x04\x3f\xbc\xb0\xe0\x1d\x65\xfb\x77\x43\x49\xaf\x69\x14\x05\xf8\x90\x6b\x2f\xd0\x70\xfa\xfd\xc1\x88\xa3\x06\x88\x28\xdb\x4d\x76\x4d\xb8\x32\xb2\x6b\xf3\x5f\xc6\xd7\x08\x38\xd3\x1a\xfa\xee\x21\x1d\x79\x80\xf8\xfa\x7b\xf5\x89\x76\x44\xcc\x3d\x6c\x9b\xec\xb7\xed\x94\xcd\xde\xb9\x3a\x31\x86\xab\xcb\x2d\x91\xf7\x73\xf6\xed\x94\xf4\x47\xe9\xbb\xbd\x10\xac\x41\xde\xb8\xba\xc5\x14\x76\xc1\x96\x11\x8e\x10\x5c\xf0\x63\x88\x4d\x59\x9c\xb7\xfc\x4a\x0d\x4a\x65\xc9\xcc\xc3\xec\xa1\x73\x17\x48\xdc\x9e\xbd\xc7\xa5\xa4\xd2\x29\x2a\x91\x0b\xf0\x24\x04\x4f\x00\x96\xa5\x7b\xd0\x2e\xb0\x9f\x57\x0b\x76\x09\xe4\x2d\x4a\x9e\x87\x24\xdb\xa4\x01\xa1\x42\xf0\xe9\xfe\x2e\xf9\x17\x00\xbe\x5f\xf6\xd7\xfa\xd0\xae\x55\x4e\x7a\xff\x00\x2e\xf6\x8a\xdb\x17\xc3\x08\xe9\xf8\xb0\x49\x12\x9e\x7d\x5e\xe1\x25\x6e\xff\xf6\x79\x68\x0b\x9d\xaa\x4b\x74\x0f\xc8\x52\x84\x95\xa2\xa5\xd1\x0b\xcd\xf0\xdf\x55\x7a\xaf\xb9\xb5\xaa\xd0\xdf\xf6\x52\xcb\x0c\xae\x84\xec\x48\xca\x4c\xf3\xe2\x63\xcc\x28\x4c\x4d\x6f\x43\x3f\xfb\xd3\xdd\xf5\xe7\xcc\x6e\x42\x31\x8f\x20\x2c\xa6\xea\xf9\xba\xb0\xcd\xce\x13\x2c\xb9\x64\xbd\x77\xa5\x1e\x13\x77\x1a\xe5\x1e\x66\xf2\x5f\xd2\x55\x4a\x4c\xcb\x76\xf6\x76\x12\xb9\x7c\x44\x94\x37\x56\xa5\x44\x15\x86\x7a\x9f\xe8\xe3\x51\xdd\x4f\xbf\xce\x3a\x16\x08\x11\xf2\x26\x9e\x42\xbd\x58\x77\x04\x73\x2c\xc5\x63\xa3\x1e\xdf\xfc\x56\x96\xa2\x3d\x81\x2b\x66\xb7\xef\xcf\x47\xe5\xce\xfe\x20\x89\xd0\x99\xae\x11\x96\x82\x1d\xd1\xb8\x88\x5b\x97\xcb\x17\x2b\x63\x19\xb4\xf0\x12\xdb\xf1\x6b\x04\x58\x92\x90\xcd\x3d\x52\x88\x47\x14\x42\x94\x68\x8e\x3d\x1d\x8a\xea\x09\xc3\xfc\x9a\xae\x77\xec\x6a\x33\x1b\x3a\x2b\xc7\x1f\xdd\x76\x0c\x76\x22\xfb\xcc\xa5\x32\xf9\x3c\x5d\xbe\x81\x3f\x97\x41\x08\x00\xa3\xfe\x85\xfe\xa3\x0f\x67\xae\xbd\x2e\x04\x74\xe6\x92\x48\x44\x4c\xf4\xfd\x71\x7a\xc1\xaf\x67\x19\xd1\x7b\x09\x92\x96\x5b\xcd\x40\x92\x7d\xfa\x2d\xfd\x6f\xba\xdf\x4f\xd7\xeb\x4f\x35\x40\xdc\x70\x83\x3c\xeb\x1a\x6f\xd4\x11\x3f\x07\xa7\x7c\xfa\x24\xee\x86\xf9\xfd\xb8\x71\xe4\xd0\xd2\xab\x16\x1d\xf2\x4f\x83\x74\x58\x1c\x21\x2f\xdf\x9a\xf3\xe6\xe6\xb7\x0d\x87\x82\x4b\x6c\xec\xcc\xf0\x0d\x80\xe1\x05\x71\x5b\x17\x1c\x82\x9e\x88\xa6\xb0\x5e\xc2\x46\xed\x99\x91\x49\xd7\xdb\x97\xa6\xa2\x6f\x2a\x7a\xc4\xcb\x70\x02\xc8\x70\x0d\xb2\x5f\x31\xe3\x89\x23\x8a\xda\xda\x68\x03\xab\x9e\x1c\xe0\x13\x2f\x7d\x92\x42\x9b\x0a\x36\xf1\x0c\xbc\x78\x33\x52\x51\x29\x40\x8a\x16\xfe\x8b\x44\x9c\xb1\xe1\xc6\xa0\xe4\x88\x80\x33\xb9\x2c\xce\x8b\xf9\xcf\xf4\x1f\xfe\x6b\x06\xdb\x31\x62\x8b\x47\xd1\x38\x8b\x7d\x86\xef\x9f\x24\x15\x82\xbc\x86\x6f\x0c\xdf\x92\x28\x8b\xc8\x3e\xcb\xd1\xfb\x38\x3c\xd2\x5f\xe1\x2f\x21\x99\xb9\x08\x8b\x66\xeb\xfa\xbc\x4b\x35\x27\x08\x82\x0c\x97\xde\xc6\xbb\x67\xcd\x64\x38\x85\xfb\x4d\x41\x60\xb3\xe0\x9c\x96\x29\xc6\x01\xed\x92\xcc\x11\x92\xeb\x92\x1b\x45\xb9\x2f\xf9\xb7\xca\x07\xa1\xd8\x0b\x07\xfc\x59\x82\x5c\x6c\xd5\x9d\x4d\x2a\x04\xec\xc3\x55\x9c\x3f\x7f\xea\x72\x12\x50\x4e\x98\x4d\x12\xdc\x25\xe0\x17\x5d\x0e\x67\x0e\x88\xe6\x61\xbd\x5e\x80\x3f\xb3\xff\xbb\x8e\xc1\x86\x97\xbb\x36\xf3\x3a\x17\x9d\x59\xe4\xb0\x46\x98\x9f\x9b\x31\xa8\xa3\xd7\xc5\x92\xe3\x0c\xc7\x12\x7d\xb2\x42\xf7\x3d\x2c\xd4\x2d\x4f\xde\x83\x45\x55\x64\x30\x0f\xd5\x83\x6a\x88\xda\xba\x32\x8b\x2f\xe4\xc5\x09\x57\x16\x1e\x1c\xa2\xa9\x63\xc1\x19\xc4\x3d\xb4\xf9\x68\x69\x6c\xd1\x3d\xe3\x47\x98\x12\x93\x1f\x31\x7b\xfd\xc9\x8d\x9a\xdc\x01\x65\x53\x19\xc6\xd9\xdd\x3d\x11\x3f\xfa\xd0\xdb\x77\x69\x35\xd3\x4a\xb4\xcb\xa2\xb2\x0e\xcf\x0c\x62\x45\x35\x36\xf6\x58\xae\x4c\x57\x3c\x93\xa3\xb5\x9a\xfe\x2a\xfe\x12\xa5\x02\xa0\x8d\x74\x8c\x83\x9c\xc8\x91\x5a\x33\xce\x05\x21\x81\x5c\xf9\x45\xb6\x39\x56\x91\x9d\xec\xe6\xea\x54\x77\x7b\x55\xec\xe2\xfc\x39\xd8\xce\x5b\xab\xe1\xc9\xc7\x86\xf6\x58\xe3\x9f\x64\xde\x72\x17\x1a\xec\xea\xfa\xdc\x22\xf2\x12\xff\x11\xca\xb7\x45\x2b\x9f\x90\xd1\xee\x69\xfa\x0d\x89\x82\x56\x21\x7b\xe8\x93\x06\xe3\x8c\x6f\xa5\xba\x9f\xfb\xba\xea\x82\x7e\x64\xe3\xf1\x20\xc4\x65\x5e\xfd\x76\xf8\x44\x64\xac\x63\xb4\x40\x6a\x97\xa6\xde\x46\xef\x59\xb2\xb3\xb8\x5d\x90\x30\x5c\x8c\x8c\x44\x94\x58\xe5\x33\x8d\x81\x27\x01\xcc\xa1\xbf\x91\x84\x29\xb3\x68\x6a\x38\x9b\xef\x43\xde\x14\x1f\xab\xca\xd7\x50\x9f\x8d\x71\xe0\x8a\xd0\x41\x38\x2b\x89\x51\x03\x3f\xea\x0f\x0c\x23\x25\x81\x26\x41\xa1\x4f\xc0\x44\x4b\xa1\xc4\x94\x42\x79\xf2\x5a\x65\x69\x68\xa6\xbb\x64\x0d\xf9\xfa\x02\xb4\x77\x1d\xcd\x11\xaf\x8e\x5a\x96\x72\x8f\x1c\x09\xae\x95\x50\x04\xa6\x06\x71\xb2\xaa\xb0\x72\x28\xee\xa1\xae\x42\xe6\x38\xa6\x3a\x8f\xd8\xbb\x92\x24\x16\xa3\x54\x24\xc4\x97\x49\x5a\x99\x77\x49\x2b\xfe\x75\x4b\x93\xa4\x3a\xa7\xdf\xd3\x26\xd2\x02\xd1\x96\x8f\xd7\xf5\xef\xde\x3a\x7e\xa7\xab\x59\xbf\x7c\x9a\x56\x7e\x30\xd2\xed\xf1\x78\x11\x18\x58\xb3\x80\xda\x22\xc4\x7c\x87\x42\xef\xdc\x49\x9a\x7e\x1c\x51\xeb\x69\x4c\x1f\xfc\x3d\x7d\xdd\xe4\x9c\x6e\xf6\xfd\x7b\xc5\x6d\x17\xad\xd4\x8f\x36\x4d\xb9\x04\xdf\xd3\xfb\x76\xaf\xd7\x8f\xdb\x46\xe9\xe4\xec\x8a\xce\x75\x3f\xd6\x87\x36\xe0\xcd\x51\x5e\x97\x36\x61\x1a\xf1\xbb\x32\x82\x9f\x8f\x74\x65\x87\x3d\xc8\x04\x6c\x7b\x55\x4a\x50\xeb\xca\x9e\x43\x03\xc3\x76\xd0\xb1\x8e\x74\x61\xf6\xcb\x5b\xbb\x9a\x49\x5c\xe6\xd5\xfc\xa5\x8b\xcf\x7c\x7b\xf5\x28\x96\xf3\x6a\x7e\x9a\x04\x76\xbe\x6d\xd1\xe1\x55\x71\x9c\x15\xf5\x55\x99\xb7\xd7\x7c\x7a\x8d\x92\xbf\xbf\x23\xe0\xdb\x3f\xb2\xbf\xe3\xc2\xd2\x3f\xf0\x2c\x7a\xf7\x0f\x47\x0f\x7d\x7a\xe2\x24\x08\xde\x49\x92\x6d\xd4\xa6\x37\x54\xa3\xfd\xe9\x96\x68\xca\x49\x7f\x4c\x11\x88\xb1\xd8\x2d\xb3\x4c\x55\x32\x71\x8e\x56\xb8\x5d\x47\xa1\x53\x10\x9e\xd3\x65\x9c\x64\x6f\x8b\xfd\xcd\xef\x5b\x79\x26\x1f\x3a\x5e\xe7\xec\x6c\x78\x2d\xae\x37\xc2\x77\xe2\x47\xa8\xc1\x39\xad\x39\xc4\x2e\x54\x4e\x56\x9e\xbc\xe1\xb9\x0a\x7c\xf3\x38\xe2\x4f\x14\x17\x16\xfc\x4c\x2c\xc8\x0f\xc4\xf3\x3e\x65\xf7\x59\x24\x7a\x2f\x42\x2b\x8d\x6f\xe5\xaa\xc5\xf4\x0d\x8a\x3d\x04\x71\x91\x27\x2f\x38\xc0\x32\x7d\x77\xd2\xed\x2f\xd1\xba\xac\x06\xad\x12\x75\x8d\x12\x0a\x56\xd4\x14\xb7\xf5\xb6\x35\xd2\x9f\xd7\x06\x65\xe1\xe1\x99\xe8\x33\x6e\x79\x16\x3f\x9c\xba\xb2\x57\x96\xf8\xab\x69\xa6\x73\xf9\x49\x5f\xc7\xbb\x81\x20\x3c\xea\xc3\xcc\xf8\x41\xcd\x6d\xb3\xfc\x67\x67\xe5\x6c\xc1\x3f\xf2\xee\x95\x5d\xef\xad\xfe\xa0\xbe\x44\xa3\x90\xbc\xbe\xf1\x5b\xc1\x81\xb0\xfa\x61\x7b\x3b\x4b\x2e\x68\x65\x37\xde\xee\x17\x87\x7c\x1d\x56\x4a\x22\xb6\x44\x5d\x03\x67\xa7\x90\xe4\xc3\x2a\x2f\xaf\x2f\x85\xde\xa7\x81\x69\x35\x22\xf1\x19\xbf\x64\x45\xbe\x2e\x7d\xef\x27\x49\x42\xa2\x49\x8c\x4c\x35\x39\x53\x0e\x31\x20\xc4\x45\x2d\xdd\x2e\x2a\x08\xbf\xe8\xd5\x57\x12\x4c\x5d\xd6\xee\x16\xf9\xc7\xa9\xd8\x2a\x42\x2c\x74\xab\xd7\x1c\x5e\xaf\x49\x92\x98\xdd\x36\xf4\x9f\xd3\xa1\x85\xae\xef\x8a\x30\xfa\x7b\x07\xee\x6f\x88\x15\x35\x99\xbb\x94\x8d\x4b\xd8\x21\x0d\x34\xc2\xd5\x60\x3e\xc0\xa9\x6a\xfd\x94\xcb\x2d\xd1\xa1\x9d\x44\x17\x12\xa7\xf4\x54\x73\x45\xd0\x58\x06\xcd\x38\x3f\x70\xf1\x50\xf8\xe5\x80\x2d\x61\x2b\x26\x0b\x10\xa2\xb8\x0e\x61\x95\x46\x2a\x8e\x44\x11\x81\x8c\xce\xac\x83\x34\xff\xc0\xdb\x73\xab\xb0\x33\x3a\x72\xff\xce\x67\x4e\x4f\x2e\xf9\x7e\x7d\xa6\x27\xbe\xf9\x3c\x21\xa6\x27\x77\xed\x58\x77\xb1\x1e\x20\x02\xf9\x68\x1d\xa3\x1a\x81\x68\x6a\xba\x71\xc3\x6b\x33\xdc\xbf\x78\xeb\x38\xb9\xce\x7a\xd0\xa8\xa7\xf5\x3f\xf1\x7e\x1f\x0a\xfe\x3f\x9b\xad\xcb\x2b\xf2\x81\x5b\x77\x64\xd7\x62\xc8\xf8\xc8\x30\x25\xc7\x07\xf9\xb3\x0c\x12\x0d\xe1\xc3\xc7\x80\xdb\xce\x6d\x1c\x80\x2c\x49\xf3\x7d\xc5\x3a\x0e\x09\xa0\x47\x97\xe6\x64\x24\xb2\xca\x09\x5d\xea\xf3\xb2\xb3\xc5\x85\xf1\x2e\xd3\x54\x28\xba\xa0\x93\xc8\xc3\x87\x01\xc2\x85\x90\x11\xe1\x8e\x81\x34\x72\x8e\xb8\x65\x0d\xfc\x5a\x0c\xbb\xc5\x6f\x22\x41\x6f\x3d\xa4\x3b\x76\x37\x84\xbf\x80\x9f\xf7\x4e\x36\xa9\xdf\xe3\x11\x08\xbb\xd5\x9e\x7e\x4c\x0e\x1a\xe9\x68\xea\x04\xeb\x5e\xdc\xd3\x21\x32\x11\x07\x10\x7d\xb6\xe2\xdc\x40\x82\x0c\x98\x9f\x33\xd7\x2b\xe4\xe2\xb5\xfe\xe1\x9e\xc2\x8c\x74\xf7\xc1\x44\x6b\x1c\xdd\xa7\x11\x6e\xa2\x60\x6f\x41\xc0\x42\xae\xa3\x71\x9f\x96\x34\x84\xde\xb1\x16\xbd\x70\x74\x71\x7b\x99\x65\x1a\x40\xb1\x0f\x08\xc9\xe0\xc3\xf9\x25\x23\x05\x5d\x67\x34\xc8\x10\x01\x8c\xb6\xd1\xe7\x44\x43\x28\xc3\x95\xd1\xe7\x7e\x21\x49\xed\x08\x15\xc4\x93\x8e\x78\x5c\x2f\x86\x25\x07\xa3\x39\x2b\x8f\x87\xa8\x73\x93\x6c\xcc\xbe\xbe\x30\xe3\x3b\x39\xdc\xc3\x10\x9e\x2c\x88\xf7\xfc\x9e\x40\x32\x8a\xc6\x2e\xda\x7e\x11\xf2\xb8\x00\x7e\xda\x41\x4d\x84\x64\x1f\x21\x7e\x03\x4c\xc2\xcb\xde\x11\x3c\x1a\x50\xd5\xd8\x30\xd8\xdb\x83\xb1\x97\x6b\x89\xc0\x07\x69\x87\xf3\x3f\x48\x32\xc0\x79\x92\xdf\x54\xa2\x03\x44\xa9\x46\xf6\x2e\xbe\xbf\x8f\xea\xf4\x31\xc3\x02\x40\x2f\x45\x3b\xe4\xb4\x44\xe3\x90\xcc\xda\x22\x47\x27\x44\x9b\xe4\x13\x47\x83\x18\xb0\xdf\xec\x89\x13\x04\x5d\xae\x72\x50\xf8\x82\x19\x01\x15\x63\x98\x3d\x31\x2d\xf0\x2d\x1e\xa5\x23\x4f\x83\xe1\xb7\x36\x12\xab\x33\x02\x0e\xc4\xfa\x95\x74\x8d\x9c\x00\x42\x82\xa0\x4a\x9a\x39\x75\x54\xf9\xfe\xec\xb5\xb7\x1f\xe6\x8a\xfb\x72\x9f\x69\xa3\x82\xc4\x6f\x67\xd9\xa3\x46\xc0\x89\xa1\x8b\x81\x93\x1f\x73\x42\xb7\xb6\xbf\xfd\x3d\x93\x5f\xe7\x13\x3c\xf0\x97\x18\x9a\x81\x5e\xcb\xc7\x70\xcd\xdc\xee\x45\xc1\x05\x8e\xd5\x3d\x1e\xef\xcc\x0f\x79\x24\xb6\x59\xca\x54\x09\x77\x51\x49\x8a\x54\xa0\x33\x84\x90\xbd\x90\x87\xe6\x71\xbc\xb3\x9f\xc7\x22\x62\x1d\x9f\x9d\xbb\x59\x6e\x45\xb7\xc4\x38\x1b\xf4\x32\xe3\x64\xc8\xd4\x15\x91\xc2\xe6\x6a\x7e\x26\xbc\x20\xbb\x2e\x0f\x37\x24\xad\xac\x72\xba\x9c\x33\xc0\xdd\x16\xfb\xae\x74\x41\xc7\x3b\xbb\x9b\x3e\xa2\xd1\xb7\x74\x01\x3c\x27\xa9\x33\x9c\xa6\xba\x38\x82\xb9\x0f\x1b\xd0\x2d\x14\x49\x9a\xa7\xe9\x6a\xaf\x91\x93\xbc\xb3\x92\xd1\x1e\xdb\xca\x56\x63\x7e\xd7\x4c\x63\xa4\x68\x1a\x46\x41\x17\xa7\x04\x06\xb5\x33\x73\x2e\xdc\x02\x33\x0a\xc8\xb6\x61\x88\x0d\xca\x04\xce\x25\x1d\x58\xd4\xb1\x04\x08\x10\x63\x08\x81\x42\x91\xe0\x2d\x37\x6f\x67\xbe\x3f\xad\x36\xa0\x5a\x63\x15\xec\xa1\x46\x4c\xa6\xd3\xaa\x95\xdc\xba\xfd\x1a\x62\x11\xe4\xb8\x1c\x1b\x0e\xf4\x30\xb2\x3d\x07\xc9\x6b\x36\x47\x9e\x7c\x0e\xfe\x33\xac\xb2\xac\xd7\x57\x2e\xc6\xea\x40\x9b\x2c\x47\xe8\x55\xca\x21\xf5\x7e\x05\x96\xca\xe5\x56\x11\x1d\x02\xf2\x60\xc2\xca\x99\xbe\x3f\xf1\xaf\x0e\xf5\x4d\x46\x9c\xfa\x9a\x8a\xa4\x5b\x97\x5d\x86\x03\x69\x76\x95\x84\xfe\x08\xcf\x25\xf9\x19\x0a\x42\x24\x06\x66\x4f\x24\x90\xeb\x6e\x59\xf4\x74\x2f\x3a\x73\x89\x40\x10\xb8\x60\x80\x1f\xc6\xa2\xa1\x98\x79\x17\xc6\x4f\xc8\x1f\x87\x2a\x91\xa8\x50\x85\x04\xc6\xd5\x38\xa1\xb3\xec\x79\x1e\x1e\xe8\x7b\x17\x68\x36\x45\x0b\xc8\xea\x0a\x00\xa1\x49\x0a\xfc\xe1\x7c\x38\x26\x1d\xea\x4a\x34\xba\xc1\x77\xef\x88\x8d\x2a\xfd\xe3\x50\x16\x4d\xeb\x72\x9d\x5e\x2c\xfd\x31\xfc\xaf\x87\x17\x21\x5b\xc1\xb3\xa2\x1d\x03\xb6\x55\x65\x58\x8c\x74\x71\x5e\x72\x02\x2e\xc2\x08\x2b\x5a\xc1\x4b\x3f\x34\x2d\xc2\xa5\x6b\x7c\x66\xa2\x99\x55\xa5\x89\x07\xdc\x3d\xb6\x26\x3d\x7c\x44\x66\x63\x0c\xae\x92\x6c\xc9\x6e\x8a\xcc\x4c\x0b\xda\x13\x61\x75\x7f\xc0\x9b\x7a\xef\x9f\x9e\x7d\xf6\xed\xd9\xf7\x2f\x4f\x74\x9e\xef\xa6\x97\x97\x97\x53\x54\x9f\x76\x0d\x7d\x45\xe1\x5a\x27\x4e\x75\xcc\xfe\x6b\xd3\xae\xbe\xba\x47\xff\x7e\x4e\x9c\x07\xc8\x41\x8a\x53\x25\xbc\x83\x98\x40\xff\x19\xfa\xa0\x57\x89\xb5\xd8\x71\xba\xc0\x98\xdb\xc4\x09\xca\xeb\x17\x39\x41\x0e\xda\x14\xf1\x2c\xab\x86\x06\x3e\xe3\x7f\xa2\x62\x62\x5f\xce\xc7\x73\x58\xf4\x2b\x15\x34\x06\x4f\xe0\x19\xfd\x91\x8e\x2e\x15\xc4\x51\xf9\x31\xfb\x28\x07\xcd\x3a\x14\xbb\x7a\x17\x80\xd5\x2c\xed\xb2\x63\xfa\x1c\x92\xe4\xc7\x3c\x60\x26\x1d\x4b\xf1\x4d\xbf\x3d\x87\xa0\xa9\xab\xf2\x8a\x90\x49\xc3\x72\xaf\x9c\x0f\xca\x1d\x1c\x39\x38\x98\xf5\x1b\x73\x66\x53\x03\x1c\xcd\xde\x9c\x34\xff\x9d\x0b\xdc\xe7\x85\x42\x96\xdc\xbc\x50\x38\xe8\x42\xf2\x51\xcc\x71\x23\x09\x1a\x25\x22\xa3\xea\x21\x45\xdc\x2b\x42\x9f\xc3\xc6\xe2\xd4\xe2\x0d\xd6\xe3\xdf\xd5\xe2\xc0\xde\xa2\xf7\x10\x95\xc6\xbf\x1a\x1a\xec\xc5\x11\x0f\xac\xdb\x2a\x0e\x15\xc2\xc1\xcb\xff\x24\x76\x32\x3a\x19\x3c\x02\x38\x89\x4c\xcd\x27\xd1\x13\xa8\x13\x9f\x14\x2c\x94\x88\x2b\x75\x2c\xa8\x9d\xf8\x47\x67\x49\x6a\xa6\x34\x9a\xdb\x60\xcb\x70\xae\x73\x50\xe9\x51\x40\x70\x74\x81\x83\x0b\x39\xed\x5d\xc4\xed\x45\x08\x89\x33\x33\x4b\x32\xe6\x7e\xa9\x8f\x61\xa6\x98\x85\xc5\x38\x86\x2d\x3a\x5c\x71\x7d\x5b\x1b\x8f\x5d\x58\x23\x1f\x18\x2a\x21\x45\x40\x2d\x1b\x02\x1d\x11\xf7\x5d\x6c\xfd\x14\x1f\x32\x32\xec\x33\x41\x31\xc5\x1f\x60\xda\x3e\x07\x7d\x04\xd9\x6a\xed\xd1\xfe\x35\xe8\xff\xb8\xc0\xac\xe2\x5f\x7f\x98\xa1\x34\x27\x4f\xc1\x1c\x87\x83\x9c\x55\xcf\x39\xa6\x35\x3f\xc6\x1b\x5a\xff\x78\x26\x8c\x80\x98\x46\xbc\x8e\xd1\x0f\xbf\x2b\x67\x2c\x11\x88\xc3\x63\x09\x16\x72\x56\x98\x34\xf8\xfc\x19\xea\x01\x01\x72\x54\xc2\x6d\xd0\xee\x0d\xb8\x7a\xde\xc6\x59\x1f\x0f\x45\x11\x92\xfb\x9f\xd6\xf5\x3e\x2f\xaa\xf9\x43\xfe\x67\x80\xbf\x76\x84\xa0\xf0\xa0\x3a\xaf\xf2\x32\xde\xae\x43\x59\x5f\x49\xca\x81\x87\xfc\x77\x92\x46\x2a\x5e\x61\xa8\x3a\xac\x39\x2e\x08\x85\x16\xce\x39\x68\xd0\x8c\x55\xca\x15\xa1\xbd\x52\xe0\xcb\x0b\xc7\xb3\x2c\xe4\x68\x93\xb8\x4f\x6b\x18\xd1\xe0\x3a\xea\x2c\x28\xbd\xe8\xeb\xeb\x41\x10\x64\x49\x05\x15\x6d\x21\xc7\x27\x0b\x0b\x0e\xb9\xb5\xa3\x37\xbf\x47\xd6\x36\x54\x34\xc4\x6e\x7a\x63\x4b\xee\x45\xd9\xf7\x55\xd2\x84\x01\xc3\xe1\x86\xd9\x01\xe2\x96\x69\x8a\x80\x61\xeb\x0f\xc9\x0d\x90\x1c\x6b\x1c\xf9\x9f\x03\x99\x0c\xba\xfc\xa0\xd0\xff\xe3\x87\xae\x02\xdf\xb0\xcf\x31\xf5\xea\xa0\xdd\x31\xdd\x8a\x4a\x80\x83\x5e\x03\xea\xaa\x5a\x7b\x10\x9f\xba\xb5\x09\x51\xae\xc7\x55\x2b\x51\x8c\x51\x67\x19\x94\x98\x2d\x1f\x10\x2b\xf9\xd6\xd9\x87\x5d\x1d\x3f\xe2\x63\xde\x6a\x6b\x80\xff\xb2\xa9\x2f\x2d\xe2\xe8\x77\xcd\xca\xcc\xff\x15\x26\x10\x4e\x0a\x1e\xc7\x77\xe0\x8a\x78\xb8\x41\x50\xf6\x63\x63\x0f\x9c\x32\x99\x0b\xc5\xbd\x4a\x5d\xfa\xa5\x88\xfd\xdb\x59\x49\x73\x41\x14\x01\x81\x2d\xf4\x91\xc8\x43\xfa\xaa\x46\x83\xf8\x91\x08\x37\x42\xb8\x8e\x05\xfe\xe2\xac\x00\x88\xc2\x42\x75\x89\xa5\x6f\x01\x53\xe7\xc8\xc8\x2f\x41\xd3\x42\x65\x7b\x28\x49\x3c\x40\x64\xb3\xf9\x13\x7e\x3c\xd4\x22\xac\x28\x2b\xb6\xa3\x5a\x5d\x55\x6c\x88\x12\xbb\x7a\x36\xdf\x93\x98\x10\x57\xc2\x68\xfa\x9c\xcd\xe9\xb2\xd9\x5f\xb8\xff\x14\x21\xa8\xba\x01\xf8\xae\x2e\x55\xe5\x97\x47\x51\x4c\x14\xc2\x23\xd1\x57\xbf\xdd\x71\x9d\x5f\x44\xd4\x93\xed\x27\x44\x7a\xff\xd9\x4b\xf9\xc1\x71\xda\xa2\xe8\x60\xe9\xb2\x35\xc5\xda\xe1\xc0\xf1\x3a\xd7\x52\x67\x8a\x9d\x12\x91\x4c\x02\xb4\xc8\x4b\x01\x89\x7e\x25\x51\xe7\x68\x0b\xa5\x03\x44\xa8\xdb\xe7\xd5\x95\xbe\xb7\x78\x24\xa2\xb1\x13\xed\x14\xa4\x55\x63\x45\x44\x09\x63\x4b\x6f\x70\x2c\xc5\xbb\x18\x5f\x37\x04\x62\xe1\xe1\xfd\x76\xf9\x47\x08\x2e\x24\xdf\x6c\x18\x9a\xcf\x7d\x91\xf0\x8a\xfc\xb7\xc6\x6f\xd0\x2a\xbe\xc6\xba\xc9\x37\x2d\xa2\xf6\x52\xaf\x1b\x5f\x4a\xcb\x77\xcd\x5e\x35\x66\xda\x6f\x44\x27\x0a\x90\x23\xd8\x59\x16\xa5\x2f\x65\x57\xdd\xc8\x3d\xd7\x95\xe7\x10\xc1\xe7\xe1\xc0\xc2\x21\xb9\x77\x32\xb4\xf6\xbb\x90\xbe\x02\xba\x1b\x8c\xc8\x57\x47\x32\xee\xf3\xfd\x41\xc4\xbc\x64\x99\xc1\xf9\x97\x7d\x05\x7f\x22\xe2\xe1\xbc\x34\xd4\x9f\x93\x5f\x7e\x25\x89\x5c\x66\xc9\xdc\x63\x27\x71\xdc\xa5\x35\xb3\x5b\xa5\x86\x84\x88\x72\xee\xf4\x5e\xa0\x35\x37\xbf\xb5\xc1\x3f\x42\xb8\x6c\xef\x1e\xaa\xc7\x15\x46\x6a\xf3\xad\xa6\x4c\xc8\xb7\x2e\xe4\xba\xfb\xc2\x12\x17\x5e\x47\x25\xb5\x8f\xc4\x97\xae\x38\x22\xa4\xc4\x82\xed\x07\xcd\x34\x95\x7f\xad\xb7\x95\x70\x0f\x3f\x1d\x5d\x7a\x4c\xfa\x5c\x59\x8f\xdc\xb9\xe2\xc4\x95\x2f\x3a\x61\x0d\x7f\xe8\xc3\x1e\xfa\x0f\x10\xff\x20\xc8\x70\xb0\x89\xff\xf8\xff\xff\xd7\x08\x80\x0d\x53\x85\x64\x63\x20\x17\x35\x70\xfb\x51\x30\x8e\x17\xa4\xae\x2e\x64\x44\xc6\x38\xde\xb4\x4b\x7e\xeb\x09\x04\xb7\xd4\x7b\xe7\x7d\x5a\x0e\x4d\xbd\xee\xc0\x70\x43\x36\x87\xa3\x6f\x7b\x4d\xd7\x6c\xcd\x76\x35\x36\x4b\xfb\xed\xe8\xfb\x76\xfb\x59\x21\x71\x26\x09\x00\x6e\x80\x3e\x80\x05\xf8\x85\x1b\x6d\x72\xd7\x22\xd7\xb9\x04\x08\xdd\xbd\x73\x5d\x8e\x5c\x28\x65\x8b\x5d\xcd\x87\xe9\x22\x3d\x35\x4e\xaa\x83\x72\xbf\xb7\x86\xf3\x25\x2b\x86\xf4\xd9\xa1\x16\x55\x06\xe5\xb6\x47\x97\xa1\xfc\x02\xb0\x45\xbe\xb3\x47\xed\x1b\x83\x61\x83\x2d\x4d\x26\x78\x2b\x49\xed\x5f\xa4\xd4\xfb\x96\x39\x29\xd7\x4f\xc4\x3f\xb1\x9c\x3a\xe4\x9e\x06\x9d\xe9\x6b\x09\x7f\x3b\xa3\x98\xf3\xee\x31\x44\x98\xbf\x3e\x74\x25\x52\xea\xfe\x9a\x4c\x7e\xad\x9b\xed\x9b\x90\x31\x5d\x0d\x2e\x9a\x96\x3b\xcd\x47\xcc\xb5\x7c\x0e\x51\x57\x75\x24\x95\xe8\x78\xcb\x38\x4b\xc3\x13\x38\x78\x0a\x8f\x08\xad\x63\x9a\xfe\x55\x38\x6f\xa4\x65\x70\xef\x5d\x0f\x84\xb3\xb6\x44\xa8\x67\x2e\x0e\x2f\xf2\x28\x27\x06\x9d\xe0\x4e\xce\x01\x71\x9d\xf3\xf1\x69\x1c\x1d\xe3\x60\xea\x03\xb2\x96\x52\x5d\xf6\x27\xa6\xbd\x43\x3c\x4d\x5b\xef\x0d\x5c\xaf\x42\xc6\xef\xa2\x92\x78\xaa\xc8\x05\x6f\x39\xf9\xbb\x9d\x70\x48\x47\x35\xf9\xb0\x35\x8b\xad\x3a\xa6\xd1\x0f\xc7\x13\x10\x47\xc1\x07\xd1\x9f\xd2\x35\xce\xff\x1d\x26\x8d\xfd\x19\xbe\xb1\xf1\xb9\xe8\x7d\x02\x7a\x29\xba\xa5\xa6\xdb\x60\x8e\x31\x96\x32\xe3\x4e\x7d\xc7\x3a\xb3\x2a\x7a\x85\xef\xfc\x2f\x73\x9d\xd6\x85\x46\xc1\xaf\xc2\x68\x1e\x89\xd5\x4d\xb7\x47\xd8\x4c\x89\x28\xe1\xf2\x7e\xec\xb9\xe1\x37\x52\x3f\x09\xe2\xcd\x9a\x5a\x8e\x96\x77\x3f\xca\x84\x65\x6d\xdb\x6d\x8c\xaa\xac\xdc\xb0\x2c\x0d\x7d\x33\x9a\x1d\x79\x98\xbc\xdf\x07\x76\x1f\x66\xe3\xbf\x3d\xbc\xfb\xa0\xab\x0f\x0a\xf0\x3e\xee\x4e\xfc\x21\xbe\xea\xb7\xe7\xdc\x8d\xf5\xf6\x69\xf2\x5d\xff\x65\x98\x85\xf7\xe3\x7d\x9d\xd3\x06\x1e\x8f\x25\x7b\x62\x8e\xe5\x76\x6d\x07\x3e\xd3\x04\xb5\xef\x71\x99\x5e\x0f\x13\xef\x4a\xd2\x64\x31\xdd\x24\x57\x18\x9a\xbf\xa2\x49\xdd\x7a\xc7\xd3\xba\x1e\xc9\xe8\xea\x5f\xc1\x27\xdd\xbe\x2f\xdb\x70\xdf\x1d\x27\x69\x7c\xd4\x13\xc7\xe5\xd5\x19\xc9\xad\x7e\xb4\x4d\xd8\xa6\xde\x0c\x85\x44\x39\x6f\x95\x88\x24\x05\x67\xc2\x8f\x49\x05\x74\xc4\x63\xa2\x97\x13\x68\x64\xa2\xc0\x46\x1a\x31\xe7\x83\x16\xe6\xb1\xd7\xc8\x6e\x1c\x5f\xdc\xfb\xfd\x09\xc6\x8c\xd9\x91\xb2\x47\xd2\xaa\xf1\xa9\xc7\xda\xe6\xb0\x3b\x89\x9f\xaf\xaa\xc6\xfb\x20\x97\xea\xc7\x91\x2a\x4d\x50\xfc\x4c\xff\xdd\x15\x87\xc5\x91\x1c\x3f\x8c\x38\xd2\xfc\xfb\x5f\xfa\xe6\x92\xa3\x3c\xce\x4d\xde\xfb\xe4\x50\xea\x2b\x4e\xb4\x93\xe1\xe8\xf0\xb8\xcd\xd5\xe1\x52\xa3\x5f\xfb\xc5\xae\x6d\xd4\x7b\xbf\x03\xf9\x77\xd1\xd4\xa5\xf1\xd4\xca\x36\xb0\xc4\x84\x39\xf6\x02\xbb\xa4\x4d\x7d\x2b\x5f\x2e\xee\x1d\x71\x3a\x15\xfd\x40\xec\x05\x95\x73\xe8\x74\x79\xcc\xaa\xe5\x4a\x60\x7d\xd0\x5b\xeb\x77\x4b\x45\xa8\xe8\x30\xbf\xec\xb7\xaa\xea\x4b\x7d\x7d\xe2\xe9\xb1\x10\xe4\xd9\x5f\x6b\x08\xc8\x74\x00\x9c\xfe\x5f\x0b\xfb\x73\x90\x52\x70\x5a\x2e\x60\x36\x1e\xea\x68\x90\xec\xe1\xd7\x5e\xde\x0d\x26\x48\x0c\xba\x69\xee\x91\x42\x53\xae\xb1\x33\x07\x67\x06\x08\xcf\xe9\xa4\xcf\x24\x46\x77\x1a\x9a\x7b\xa4\xc6\xd1\x61\x2d\xab\x47\x8e\x0f\xae\x02\x84\x24\x01\xe8\xcf\x81\xdf\x3a\xb9\x39\xb0\x1b\x6d\x3a\x83\xf8\xfb\xd1\x19\xb0\x49\x83\xc7\x62\xa3\xbe\xfa\xe1\xf2\x6d\x1b\x99\x9c\xa8\x32\x51\xfb\x88\xb3\x55\x7f\x8e\x2e\x5d\x43\x3c\x2e\x3c\xd7\xcf\x87\xe9\x1b\xa4\xc1\x11\x12\x2c\x1f\x19\x92\xed\x80\xf5\x88\xb2\xcd\x2c\x99\xd5\x1c\xa4\x07\x8c\x11\x47\xb2\xa2\x71\xf5\x4d\xec\x93\x3c\x16\x29\x3a\x41\x2f\x6e\xa9\x8e\x69\xc4\x1a\xf7\x81\x71\x94\x8f\xb7\xd3\xf0\xd4\x42\x21\x2d\x5c\xd8\x78\x30\x93\xf1\xee\x79\xf4\xec\x0e\x79\xcd\x75\x9c\x9b\x52\x3c\x7a\xa2\x32\x1f\xf4\xaa\xb8\x7f\xac\xd3\xb8\x16\xef\x70\x60\x84\x9d\xe4\xc5\xec\x32\xd8\xb1\x52\x5e\x9f\xfa\x17\x0f\x9a\x5a\xa9\x60\x2f\x1f\x49\x5d\xc4\x6f\x22\x0a\x09\x21\x11\x6f\xbe\xf3\x8f\x8e\x56\x17\xb9\xb7\x12\x74\xde\x42\x3d\x86\x13\x0d\xfe\x23\x71\x3f\x31\x0e\xe8\xc3\x4d\x1f\x28\xdd\xf1\x47\x28\xc4\x9f\xfe\x97\x59\xb4\x07\x8e\xc7\x46\xcb\xe9\xfb\x50\x47\x8a\x32\x3e\x74\x0e\x29\x4e\xf9\xa7\xa6\x91\x20\x91\x14\x79\x7c\xe8\x6c\x62\xec\x32\x3e\x97\x04\x2c\xdc\xc4\x60\x41\x05\x01\x57\xfc\xd5\xc7\x1b\x04\x16\xc3\xa9\x47\x30\x3b\xf3\x87\x17\x49\x5d\x83\x16\x1e\x71\xb0\x53\x21\xcb\x85\xb1\x53\x61\xa4\x86\x8f\x14\xdb\xf0\x2d\xec\x5d\x20\x3f\xca\x55\x6f\x8c\xab\x91\x7b\xa4\x3e\x90\xfc\x3c\x27\x50\xca\xd0\x63\x45\x27\xff\x8e\x63\x30\x6a\xd2\x97\xd4\x0b\x56\x12\xf9\xb0\x71\x28\xc2\x9d\x4e\x6f\x34\xc8\x4b\xe4\x53\xd0\xa6\x1a\x35\xa8\x28\x51\x44\xec\xcc\xaf\x7c\x9e\x6f\x26\xd4\xed\x6e\x59\xe7\xcd\x7a\xce\x6e\x68\xa2\xef\x86\x7b\x82\xf5\x82\xef\x44\xa2\x47\x5c\xe7\x2a\xcb\x24\x42\xf9\xe4\xb8\x84\x8b\x70\xce\xb0\x8f\xa9\x9c\x72\xaa\x3f\xf9\x91\x26\x9b\x05\x98\xff\xdc\x22\xa9\x24\xfd\xd3\x89\xd9\x71\xa2\xde\xd2\x73\x79\xcd\xc6\x49\x72\x0a\xc5\xe9\xfb\xba\x2a\xd8\x6f\x57\xfe\x25\xbc\x38\xe9\xbf\x4f\x97\xdc\xc5\xfc\x5b\x4c\xa7\x93\xb6\x6e\xf3\x52\xf5\xf9\x5f\x66\x77\xd7\x93\xb0\x64\x56\xe9\x63\xdf\x56\x73\x6f\x3f\x88\xbe\xd6\xce\xfd\x08\xf2\x9b\xf7\x44\x8a\x9b\xf3\x14\xd9\x0c\xd1\xf9\x09\xcb\xdc\xd8\x20\xd1\xd9\xb1\xb1\xe4\x81\x39\x3b\xea\xb0\x85\x63\x99\x57\xe7\x72\x77\x96\xac\x55\x5e\x7e\xed\xb5\xb0\x27\x51\x59\xba\xed\xf1\x97\xe4\x61\x59\x9c\xfe\x3c\x54\x49\x91\x68\x3c\x90\x26\x59\x6a\xe3\x52\x9f\xc8\x2d\x2e\x94\x34\xa5\x69\x99\xb3\x62\xc5\x65\xce\x6b\x3e\x94\x04\xff\xf9\xb4\x54\xfc\x8e\x5c\xee\xe4\x17\x86\x30\x42\xd2\xfb\x63\x7d\x8c\x12\x97\xc9\xbb\xab\x74\x69\xa2\xd1\x8b\xcb\x9e\xd7\x5b\x22\xc7\xac\x60\x4f\xbb\x74\xe2\x42\xd2\x65\x12\x2e\x23\xea\x04\x6e\x14\x71\x01\x3b\x6b\xbd\xce\x6d\xda\x9c\x11\x58\x6f\xa3\x1c\x6d\x86\x4a\x63\xd8\xe2\xb4\x62\xc7\x7e\x33\x1b\x83\x35\xd1\x09\x04\x6d\x99\x2b\x1f\xad\x4b\x82\x31\x52\x65\xfd\x4c\x7c\x07\x72\xa9\x8f\xd6\xa1\x49\xd0\xd5\xb3\x2e\x48\x50\xa8\x82\x68\x2b\x88\x14\xc4\x59\xa4\x6b\xce\x52\xf7\xd2\x25\xa5\x94\xf7\x12\xc4\xb6\xe0\xd2\x5a\x51\xa6\x54\x62\x5e\xba\xa5\xbd\xa7\xa8\x1c\xeb\xb7\xea\x75\x56\x49\x6f\x3e\xfd\xaf\xc4\xfd\x88\x1e\xc0\x84\xae\x95\x4a\x17\x15\x3b\x8e\xe4\x41\x36\x85\xe1\xd2\x3f\xc7\xf1\x69\xbb\x43\x3e\xda\x0f\xe8\x21\x9d\x64\xf4\xba\x47\x8d\xf3\xa6\x1a\x0f\x49\x72\x7c\x9a\x4c\x41\x40\x4b\x8a\x0b\x17\xe7\x38\x7a\x4d\x71\x2a\x1f\x6e\x99\x64\xd2\x3e\x9d\xde\x48\x3f\x1f\xb0\x6f\x4c\xa1\xab\xad\x10\xa8\x41\x47\x8c\x74\xec\xcd\x6f\x84\x60\x58\xb3\x0c\x96\xac\x6e\x8c\x44\x08\xdb\xb2\x6b\x9e\x61\x87\xcf\xa9\x33\xe1\x1d\x9f\x7a\x32\xd2\xd1\xa9\x47\x23\x9e\xf4\x87\x8c\xc7\xf9\xd0\x7d\xdf\x16\xed\x62\xbb\xd2\xe5\x3d\x21\xee\x00\x09\x47\x1f\x80\x89\x5f\xa9\xf8\xde\x7b\x6d\x9f\x8f\xc1\x7f\xdc\x8b\x9f\xfa\x48\x6f\xea\xda\xa3\xd9\x69\x07\x59\x27\x23\xfd\x11\xb4\x06\x12\x39\x2c\x9e\x6d\x63\x38\x0c\x02\x42\x61\x5b\xbb\x13\xaf\x16\x89\x4d\x3e\xa3\xdf\xf7\x24\xe9\x41\x71\x6d\xd8\xed\xc1\x7e\xca\xf1\x0d\x90\x89\x0e\x04\xfe\xb3\x53\x5a\x3a\x61\x91\x2f\x13\xbc\xbe\xf6\xf9\xa8\x89\x21\x62\x42\x22\x3e\xe6\x7c\x82\x3b\xb1\xe6\xf1\xfe\x7e\x7e\xeb\x34\xd2\xf3\x4a\x0c\x3e\xd9\x77\xf4\x7d\xec\x3c\x30\x39\x76\x5e\xa3\xd5\xb3\x56\x75\x74\x80\xc8\x53\x4a\x7b\xef\x23\x45\xf1\x04\x86\x8e\x3f\xd9\xce\x64\xed\x2c\x6e\xfa\x4c\x99\xd1\xdb\x48\xc0\x28\xde\x17\x08\x06\x08\xbc\x83\xe5\xd4\x91\x3d\x0b\xf3\x91\x3d\x88\xa7\x98\xe4\xb0\x92\x99\x89\x85\x34\x99\xdb\x91\xdd\xc0\x64\x90\x51\x39\xdd\x0a\xe4\xad\xfd\xc8\x7b\x78\xec\x16\x62\xb0\x5e\x3a\xdc\xdb\x47\xfc\xb0\xfb\xc8\xd9\xf5\xa3\x61\xfc\x34\x44\x36\x3e\xb2\xea\x78\x22\x60\x27\x23\x3e\x87\x73\x98\xd0\xfe\xb6\xc5\x1e\xd1\x76\xf0\x6b\xfa\x23\xff\x8a\x89\x47\xd7\xc0\x45\x64\xb1\xad\x9b\xba\x23\x09\x97\x5d\x06\x99\x5e\x13\x40\x6b\x91\x1d\xa9\x4f\x42\x2b\xf2\x0a\x75\x1c\x05\xc8\x37\xf1\x51\x7e\x89\x6b\x62\x7f\x13\xdf\x8e\xb9\x3f\xd7\x0a\xba\xfe\x95\x06\x9f\xd9\xaa\x23\x48\x93\x09\x6b\xe8\xb4\xe2\x51\x5b\x6d\x55\x2f\xdb\x9c\xa3\xb4\x3c\x6a\x24\x5c\x04\x3c\xc8\x87\xb5\x0f\x35\x07\x8e\x58\x94\x04\x3f\xdd\x61\x81\xf5\xda\xf9\x2b\x29\x24\x86\x04\x85\xd9\x6b\x14\x0e\x47\x70\xf3\xd2\x46\x2f\xb8\x34\x3b\xd5\xd2\x63\xad\x36\x8d\xe9\xb5\x78\x4c\x25\x83\xda\x6e\xe7\x76\x26\x3f\xf4\xf7\xed\x29\x95\x4d\xf1\x9c\x01\xa1\xe4\x93\x7d\xe3\xda\xb7\x6c\x00\xb7\x94\x61\x8f\xb4\x2a\xd6\xa5\x99\xff\x58\xa9\x73\xfd\x87\x35\x61\xff\x33\x95\x3b\x3e\xac\x89\xda\x30\xd7\xf3\xc7\x70\x1b\xd5\xb7\x43\xb7\x36\xac\x97\x7f\x25\xc4\x6e\xe7\x5c\xe5\xfb\x25\x3c\x2a\x62\xc0\x5c\xd6\x75\x8b\x94\xe9\x07\xb0\xf5\xec\xa9\xcd\xf1\xa6\x5c\x29\xf8\xfa\xd5\xf9\xf8\x9e\x49\x83\xdb\xa0\x86\xdb\x0e\xa6\xb5\x47\x66\x5e\x1a\xae\xe9\x56\x6d\x47\x28\x4a\xc7\x7c\x71\x46\xc5\xd3\x33\x5f\x3c\x3e\xe8\xa0\xb1\x1f\x98\xdb\x67\x2e\x3d\x27\xdf\x61\x0d\x77\x12\xb5\x5e\x41\x3b\x3c\x32\xf6\x03\x94\xbf\x7f\xf0\x41\xf3\xe1\xb2\xb3\x41\x5f\xf1\xa5\x61\x8b\x0d\x30\xd6\xb2\x5b\x9d\x1b\xe4\x33\xb4\xbb\x05\xbb\xe5\x84\xae\x5e\xb9\x4a\xd9\x7d\xae\x94\x3d\xa5\x4a\x88\xf7\x42\x10\xfc\xbd\x56\x8a\xe9\xfa\x8a\xce\xa0\xcd\xd9\xb7\x6c\x64\x3a\x4f\x1e\xd0\x09\xc8\xe7\x98\x5f\x26\xd9\x14\xf1\x8a\x58\xa0\xd3\xfb\x08\xee\xd9\x77\x70\xca\x81\x0a\xfc\x1e\x12\xce\xe1\xba\x53\xdc\xd2\xf3\xa1\x68\x88\x94\x03\xc2\x5d\xac\xae\x56\x08\xbb\xa2\xd9\x07\x1a\x8c\xff\xcb\x15\x5e\x1b\x47\xb5\x59\x68\xa5\xda\x8a\x32\x0b\x3c\x3a\xc1\x0d\xd8\x8f\xd6\x16\x9c\xe6\xaa\x0b\xfa\xe2\x75\xbd\x22\x0e\xc4\x8c\x55\x3c\xe0\xc3\x6d\x35\xdd\x04\xa4\xa2\x3a\x1d\x8f\xd4\xd3\x41\x89\x4f\x7a\x40\x72\xcd\x79\x3b\x11\x55\x81\x3c\x7f\xdc\xe7\x15\xa2\x88\x11\xd4\x99\x32\x28\x0f\xa4\x02\xcc\xdc\xce\xbe\x24\x2a\x7f\x76\x84\x8d\x4c\xdd\x5a\xcf\x49\x3f\xfa\xdb\xb1\xef\x6b\x71\x29\x97\xd4\xc1\xf2\x25\x04\xee\xd2\x12\x21\xb3\x89\x0a\x42\x3e\x68\x9e\x10\xf7\x20\xa0\xcd\xf2\xbd\x7e\xe1\x97\x0a\x8d\xd9\x42\xf1\x22\xc1\x1a\x36\x57\x30\x21\x30\x9b\xf1\x03\x97\x37\x1a\xa2\x4a\xf5\xcf\x95\x4b\x43\xc5\x06\x6b\x09\xb9\x17\x85\xaf\x10\x87\xe1\x68\xd1\x9e\xb5\xc8\xad\xc4\x74\x90\x75\xbf\x27\x76\xe4\x4c\x7b\xe8\x87\x89\xd7\xa5\xb3\xac\x25\x5e\x98\x03\xad\x8a\xfd\x1b\xe3\x76\xad\xca\x99\xad\xe7\xcf\x91\xd0\x3a\x6e\x5c\x42\x40\x16\x51\xd3\x45\xe3\x87\xc4\x29\xcf\xe6\xfa\x6a\x1a\x69\x07\x86\xeb\xb2\x6e\xd6\xce\x30\xf0\x1c\x79\x04\xc5\xa8\xc2\x4f\xb6\xf0\x64\x1d\x7e\x43\xca\x7b\x21\x9a\x2d\x7f\x74\x4b\x51\x86\x4b\x6e\xbc\x89\xf2\x4c\xd3\x76\x48\xe1\x7b\x4d\xb2\x61\x4f\x3c\x2c\xc9\x6e\x2e\xfb\x3b\xb4\xcf\xdf\x69\x3e\x66\x97\x64\xfe\x45\x2f\x9f\x7c\x94\x48\x3e\xe5\xf3\x8e\xf5\x20\xfa\xce\xcf\x4e\x49\x0e\x98\x7e\x41\xe7\x2c\x29\x95\xf0\x2c\x8c\x4e\x76\x5b\xd6\x4b\x74\xee\x5e\x96\x71\x92\x7b\x0d\xb2\x29\x01\x83\x3e\xd7\x7e\x91\xae\xd0\xc3\xb4\x6a\x4f\x65\x11\xf0\x5a\xc8\x7b\x40\x4e\x1b\xb3\x2b\x96\xb4\x5e\x3e\x30\xa9\xbf\x8f\xea\x83\x65\x16\xa7\x1e\x03\xfd\x12\x62\x13\x8a\x61\xbd\xba\xee\xe4\x58\xa3\x61\xf9\xc2\x24\x43\x42\xeb\xc4\x37\x08\x70\x8e\x27\xd1\x1a\xb0\x4e\x21\x05\xae\x11\x78\x86\xc6\x5c\xf2\x70\xb2\x4b\xe7\xb9\xd1\x66\xe1\xcd\x60\x9c\x3b\x2a\xe9\xa7\xe0\xac\xec\x92\x6a\xfd\xb6\xbe\x4e\x5c\xfa\xf5\x84\xf9\xc6\x43\xe4\x90\xd6\x7d\x14\xa4\x14\x16\x52\xd3\x88\x54\x1c\x33\xce\xbb\xd1\xbd\x70\xab\x18\xa1\x2d\x48\x3a\xa8\x2f\xab\x24\xf1\xb7\x03\x33\x98\x8d\x34\x4f\x4a\x92\x51\x3e\x8b\x33\x0f\x8b\xc5\x47\x34\xad\x21\x1b\x0b\x7b\x38\x26\x91\x0b\xe2\x01\x11\xbf\x09\xce\x4b\x83\x8d\xe1\xb1\xbc\x79\x54\x22\xbd\x24\xc6\xa4\xfe\xd0\xd9\xc0\xff\xa9\x37\x87\x0b\x67\x0b\x9d\xc5\xbb\x93\x38\x87\xe7\x6e\x06\xb7\x3b\x85\xd3\x84\xe5\x9d\x7d\x82\xf9\x7b\xfa\x61\xae\x14\xd0\x3a\xff\x8c\x1d\xa8\xb8\x60\xc4\x7f\x4a\x14\xcb\x8c\xd4\xd3\xfe\x93\xcb\x2a\x95\x7a\x06\x6b\x29\x0c\x63\xca\xef\x9e\xe9\x5c\x0a\x39\xd7\x3c\x12\x90\xab\x22\x54\x14\xcd\xf2\x0d\x91\x2a\xec\xdc\x2b\x43\xb5\x34\xcd\x4b\xce\x4a\x6e\x45\xaa\xc9\x2c\x87\x68\x54\x6a\xba\x48\xd5\x99\x68\x27\x13\x4b\x81\xd6\xf0\xf3\x96\xdf\x3e\xbf\x96\xfc\x34\x9c\x00\x32\xa6\x87\x52\x3e\xea\xda\x16\xcd\x8e\xbb\x19\x52\x8b\xd6\x77\xcc\xb5\x84\x24\x0c\x6a\x55\x61\x3a\xd6\x90\x44\x51\xb4\x57\xb8\x76\x6d\xbd\xaa\x4b\xf6\x7d\x20\xbe\x08\xee\x56\x5c\x76\x5e\x97\xa5\x56\x4e\x9f\xff\x48\xd9\xae\xb6\x78\xf8\x6a\xdd\xec\x70\xab\x49\x50\xf2\xb3\x65\x7d\xe2\x9a\x1a\xbd\xcc\xe4\xbd\x6f\x5c\xee\xa8\xd0\xfc\x95\xfc\xd1\xde\x52\xc7\x51\x2a\xaf\x43\x01\x5c\xfb\x76\xac\x5d\x28\x08\x99\x96\x78\x1a\xfe\xae\x8d\xa3\x0e\xcf\x1c\x41\x17\xbb\x09\x27\xa1\x95\x0b\x01\xb4\xbe\xab\x77\x1c\x40\xa3\xef\xb7\x36\x73\x27\x01\x66\xc8\x25\xd3\x28\xac\x98\x81\x1d\x87\xc0\xd6\xa4\xb8\xe2\xba\x0a\x1e\x86\x0f\x5f\xba\xb3\x68\x89\xef\x58\x76\xad\x09\x2f\x45\x4f\xb5\x28\x09\x61\x77\xb4\x7a\x9a\xc9\x30\x90\x6a\xff\x90\xf9\x67\x10\x69\x17\xb0\x5d\x79\x00\x78\xc8\x75\xb4\x1d\x1c\x84\x22\x89\x94\x97\x90\xb2\xd9\x60\xd4\x74\x82\x3f\xd5\xe3\x73\xb3\x5d\x6f\x25\x78\x45\x33\x5a\x93\xa0\xa5\x0c\xd5\x1e\x4d\x5f\xd0\xef\x7e\x25\x0b\x71\x11\xe7\x4d\xb0\x04\xb2\xee\xca\x71\xa6\xf7\xa9\x78\xca\xca\xdc\x77\x0e\xaa\x24\xf0\xb0\xdf\x6a\xf9\xe9\xfa\x64\xd3\xa6\xd6\x60\x7a\x98\x3d\x8e\xbf\xef\x41\x3c\x17\x36\x9f\xbf\xb0\x44\x2e\xb3\xb3\x53\x77\x15\xf6\xed\x61\xc1\x8a\xf3\xb3\x17\xaf\x5f\x4d\x8f\x5d\x79\x54\x63\xa0\x47\xad\x2c\x82\x7c\x7c\x60\xe8\xe7\xe6\xd1\x15\x70\x31\x4b\xe4\xfa\x20\x10\x28\x3b\x1c\x9a\x4c\x2e\x92\x1d\xaf\x36\xc6\x99\x31\xec\x89\xef\xc4\x23\x0e\x78\x09\x06\xed\x9c\xb1\x9c\xbc\x9f\x86\x50\xa3\xbd\x86\x57\xfc\x30\x7b\xb2\xd9\x26\xcf\xee\x9c\xdc\xa1\x9b\xd1\x12\x2d\xad\x82\x33\x54\x8c\x89\x16\x6d\x49\xa8\xfc\xf9\xd9\xf4\x27\x8e\x80\xa0\x4a\x4a\xe6\x8d\xfd\x0b\x79\xb7\xde\xf3\xe2\x80\xea\x0b\x3c\x6e\x24\x46\x1b\xad\x5e\xb9\x24\x13\x92\x0b\xf8\x00\xab\x9e\x6f\x70\x80\x95\xde\x34\x17\x08\x78\xcc\xa0\xf3\xea\xf4\x85\xc6\x26\x89\xe0\x46\xe7\xc1\x19\x18\x1c\x2f\xcf\x49\x64\x35\xaf\x83\xe9\x71\xf2\x83\x79\xb5\xc5\x81\x96\x50\x1c\x0e\x6e\x63\x99\xed\x1e\x62\xc1\xd4\x05\x32\x62\x3a\xf5\x38\x52\xbe\x6e\xc8\x49\x07\x16\x2f\x10\x83\x24\xa4\xd0\x48\x93\x0f\x78\xe8\x36\x4b\x28\x40\xa2\xcc\x7c\xdf\x1a\x46\xb4\x7b\x29\xcb\x1d\xf7\xfc\xde\x1d\x49\x59\x2f\xa5\x00\x51\x30\xb3\x91\xe5\x79\xee\x2b\xae\xbd\x10\x82\xc5\xde\x26\xff\xa9\x26\x91\xb3\xe1\xb0\x5d\x3f\x26\xf6\x51\x4f\x11\x05\x56\xe6\xcb\x0a\xf7\x24\xf2\xb6\x4e\x99\x47\x83\x2e\xdb\xf9\xac\x78\xdc\x19\x3d\x99\x54\x8b\xbc\xe7\xc5\x42\xd8\x72\x8f\xfe\x85\x45\x94\x88\xfa\x1a\x85\x02\x7a\x1b\xc5\xce\x44\xa9\x67\xf1\x9a\x63\x8e\x6d\x64\x62\xb7\x72\x6e\x62\x79\x77\xba\x5a\xb5\xc3\x8b\xae\xf6\x3c\xb1\xc6\x6b\xc5\xfc\x70\xe8\x19\x26\x4f\x2b\xac\x2b\x58\xf1\xb9\xca\x05\x2e\x9e\xfb\xc0\x29\x07\x7a\x7d\x20\x9a\x41\xa8\x30\x45\x4c\x03\xfd\x9a\x72\x0a\x5a\x58\x6f\x36\x25\xa1\x2e\xe4\x3c\xe3\xf0\xce\xf8\x31\x7d\x51\xaf\x3b\xeb\x9b\x11\xa3\x89\xcb\x0f\x95\x31\x2b\x5f\xb7\xf3\x1f\xf8\xcf\xe9\xf3\x7a\x9b\x44\xe9\x70\x2d\x68\x77\x98\x4a\x46\x46\xd1\x75\x14\x0f\x2b\xae\xc6\xc3\x3e\xcf\x3b\x04\x5c\x69\xd3\x71\x99\x2d\x6d\xea\x1a\xbe\x06\xed\x2e\x8e\x9e\x16\xe5\x96\xf7\xdb\x0c\xd3\xff\x8a\x9f\xd2\x45\x6d\xe2\x24\xf4\xe2\x3e\xd7\x3a\x7c\xe5\x72\x1a\x69\x7b\x5a\x55\xbf\x31\xad\x6e\x74\xa4\x55\x53\x1c\x34\x28\xc5\xd9\x39\xfe\x9e\x82\x73\xf4\x93\xc6\x91\xe8\x5d\xe1\x3d\x78\xa9\x41\x37\x4d\x41\x38\x92\x3f\x8e\x50\x31\xdf\xb9\xdd\x79\x50\x39\x7b\x9a\x9a\x5e\xe2\x3a\x43\x0e\x35\xfa\xc8\xe1\xdf\x16\xcb\x8e\xe8\x2b\xdd\x2d\x01\xc0\x24\xb6\xb2\x40\xa1\x0f\x13\x17\x35\x1d\x05\x11\x7c\x08\x1c\x64\x54\x58\xb2\x33\x8d\x7c\x7b\x2e\xc9\x4d\xfb\x55\x46\xcf\x22\xae\x80\xa7\xb3\x1c\x73\x88\x2b\x05\x13\xdc\x94\x43\x0e\xbd\xda\xe4\xeb\x5e\xed\x2d\x46\x44\xdd\xef\xf8\xef\xec\xb3\x4f\xe9\xc3\x54\x3e\x7c\xfa\x79\xd6\x6f\x01\xc9\x7b\xdf\xed\xe5\xbd\x73\x71\x6d\x24\x0f\xd3\xdc\xd3\x44\x71\x24\xae\x90\x42\x36\x90\x56\xce\xf4\x6a\x6e\xeb\x06\x72\x54\x25\xda\x8e\xb3\x5e\xb3\xca\x9f\xe6\x7a\xe9\x0e\xd3\x7b\xa1\x8c\x5e\x7d\xaa\xe7\x25\x90\x50\x14\x98\xf8\x50\x16\x04\x97\x50\xc6\x50\xd6\xbf\x5b\x54\x6e\x6d\x29\xd7\xeb\xec\xec\x79\xef\x46\x87\x8f\x8e\xa1\xf9\x0c\x8f\xf1\xf9\x8a\xdc\x41\xae\x4a\x84\x92\xbf\xf3\x79\x54\xff\xd8\x11\xea\x27\xdf\x8d\x74\x61\xff\x56\x12\xd1\xfe\xcb\x1d\xf6\x2e\xbb\xd3\x16\xeb\x25\x75\x16\x63\xc4\x82\x5f\x68\x7a\x94\x48\x3f\xa7\xa3\xb0\xee\xf5\x86\x06\xfc\xaa\x8f\xd1\x2b\xec\xea\xf4\xbe\x8b\x8c\x2a\xc1\x7a\x8b\x94\x09\x19\xe0\x2f\xc7\xb7\xa4\xac\xca\x18\x02\xe3\xc7\xca\x52\x5f\x5d\x3c\x5c\xe6\x08\x0e\x67\xbe\x29\xa1\x6a\x8e\x79\x1e\x50\x66\xf7\x3a\xd8\x4f\x5d\x92\x73\xba\x64\x9d\xfc\xec\xf1\x54\x5d\x00\x41\x34\x1a\x56\xe2\x09\xe5\x89\xa6\xcb\x0b\x55\x35\xa9\x5f\x67\xaa\x12\xed\xaf\xec\x23\x60\xdb\x2d\x3b\x5e\xb5\x32\x79\xab\xfc\x40\x02\x7b\x3e\x7f\x20\xff\x66\xc3\xed\xd1\x58\x23\x78\x62\xbb\x28\xc5\x23\x43\xeb\x80\xe4\xf0\x7b\xf5\xe7\xb0\x12\x59\x7e\x7c\x10\x36\xc4\x9a\x36\x48\x8e\x51\x6b\x27\x30\x0e\x5a\xba\xa6\x2e\xfe\x92\x82\x8c\x0b\x6a\x36\x0a\x32\x7f\xeb\x88\xcb\x5b\x94\xa6\xda\x12\xc4\xfe\x1c\xc7\x24\xab\xd2\x6b\xad\x21\x40\x58\xdb\x4e\xf4\x6c\xfe\x0b\x51\x20\x51\x2a\x32\x10\x87\x78\x20\x1e\x2a\x86\xbc\x75\xc6\x7f\x16\x62\x9d\xe8\xf1\xd7\xf1\x81\x06\x0e\xe0\x05\xff\x1a\x9f\xba\xd6\x3c\x8a\xdc\xf5\xbb\x3b\x76\xba\x73\xf5\xfc\xe9\xa3\xe7\xdf\x67\x0f\x47\x60\x58\x2b\x0f\x30\x86\x96\x0f\xb0\x8b\x96\x8f\x62\x13\xd6\xe1\x33\x96\x66\xb1\x91\x51\xb3\xc0\xa6\xd3\xc6\x6b\x45\x5f\x67\x81\x94\xf2\x1a\x68\x54\x43\xdc\x01\x1a\xe3\x96\x79\xe5\x53\xc7\x33\xd7\xbe\x31\xbb\x52\x82\xf6\xe4\xdb\xb1\x1e\x2d\x9e\x19\xc7\x1d\xa8\xd7\x88\x66\x89\x72\x91\x6a\x66\x7e\xe3\xc5\x61\x4a\xf7\x5d\x1c\xa3\x46\xb7\x5d\xea\x0d\x77\xdd\x7d\x17\x0b\x9c\xf6\x23\x96\xb6\xd1\x7e\xa4\x5e\xbe\xa6\x7b\x43\x7b\x28\x15\x4f\xe5\x57\x5a\x85\x0d\xd6\x17\x79\xa9\x75\x9e\xe9\xcf\x72\x30\x60\xe5\x7a\x61\x0f\xb0\x84\x51\x30\xe2\x21\xec\x91\x28\xff\x1c\x9f\x97\xab\x7b\x68\xea\x8b\x02\xca\x0a\x57\xfb\x95\x16\xb8\x8a\xae\x82\xeb\xd5\x7d\x4f\xa3\x07\xfa\x59\xd2\x15\x2c\x54\x68\x7c\xc0\x7f\x4f\x63\x38\x53\x6c\x82\x3b\x2f\x35\xb5\x92\x8d\x12\x31\x68\xd5\xed\xca\x6f\x89\x1a\xdc\x1e\x0c\x37\xc5\xad\xa2\x2c\x36\xc6\x59\xf1\x64\x19\x23\xb8\x66\xd7\xb6\x07\x1b\x82\x6b\x3d\x7d\xfd\xfa\xd5\x59\x6f\xde\xa1\x1f\x9d\xfc\x18\xe2\x39\x14\x6c\x4f\x5d\x8c\xb9\xd1\x32\x40\x87\xf7\x70\xd1\x36\x6a\x23\x25\x74\xf3\xfb\xf4\x55\xff\xee\x63\xee\x6d\x23\xef\xeb\xe6\x4f\xf4\x8f\x51\x72\xa4\x5b\xb9\x81\xd2\x96\xb3\xf1\x6b\xa3\xc7\x37\xbf\xaf\x11\xc3\x08\x7e\x7a\xf1\x44\x92\xc4\x1b\x7e\x93\x8b\xd6\x2d\x03\x61\xa6\x46\x21\x05\x75\xdc\xd4\x38\xfc\xc7\xae\xd8\xee\x4a\xfa\x7f\xcb\x21\x40\x90\x54\xa6\xcd\xdf\xed\x68\x2d\xc8\xff\xce\xe9\xd0\x90\x2c\xcd\x0d\x15\xf5\x02\xdb\x0e\xf7\x00\x79\xc2\xc2\x34\x24\xb1\x29\x24\xd8\x46\xf6\x99\xa6\x0a\x96\x40\xd0\xc5\xe7\x47\x9b\x22\x80\x51\x43\xf4\x86\x35\xd7\x51\x27\x2c\xdf\x85\x5e\xb8\xdb\xf1\x5e\x24\xba\x86\x6f\xeb\x7c\x70\x3e\x3b\x15\x7a\x9d\x34\x22\x40\xcc\x9b\x2d\x9b\x5e\x4f\x9b\x2d\xe7\xf1\x32\x49\xa7\x05\x22\x37\x99\x63\x24\xe3\x45\xb1\x1d\xee\xa7\xe6\xe9\x39\xda\x84\x93\x1c\xa4\xbe\x5b\xc9\x91\xe1\xbd\xc2\xb1\xd6\x0f\xf0\x31\xae\xcd\xe1\xd1\x8e\x54\xc6\xab\xa2\xde\x62\x8f\xd4\x7c\xf2\x60\x12\xcb\x45\x47\x80\xdf\xc2\x07\x78\x8b\x97\x33\x71\x65\x11\xe8\x48\x74\x12\x8e\xd3\x39\x94\xcf\x56\x0d\xb1\x4f\x0f\xe8\x3f\xe2\xac\xeb\xcb\x03\x7d\x72\x25\x10\xcf\xd6\x5d\x69\x78\x56\x07\xa2\xdc\xa1\xae\x79\xd7\x7a\x33\x7f\xe6\x84\x4b\x4e\x89\xa8\x35\x38\xbc\x44\xdd\xf9\xa0\x5e\x63\x75\xcc\x3b\xb3\xea\xbc\x27\x50\x54\x23\xb8\xbf\x03\x13\x6a\x1a\xed\x6e\xc3\x41\x0b\xe8\x7a\x5d\x23\x4a\x87\xaf\x31\x92\x96\xd1\xcd\x1f\x62\x15\xbc\xdd\x9b\x16\x42\xed\xe8\xb8\xf1\xb0\x96\x6b\x39\xa7\x7c\xe7\xf1\xae\x39\xc8\x20\x62\x8d\xf9\xe9\xbb\xda\x1c\xa3\x46\xc2\x8f\x2c\x34\x22\xc9\x0b\x5f\xcf\xae\x5d\x80\x49\x61\x3b\x7d\xab\x7c\x25\x3e\xf7\xce\xe1\x3c\x0c\x6e\xe0\x92\x09\xef\x0c\xf6\x68\xb3\x51\x4c\x40\x5f\x87\x56\x3e\xa8\xb5\xec\x57\x2a\x2a\x91\x83\xa5\xaa\xbc\x4d\xb0\x97\xb0\x0a\x77\xfb\x73\xc3\x6e\xa2\xa1\x3f\xd6\x2e\x49\x4d\x10\x60\xf8\x78\x72\x7f\x71\x92\xb6\x5e\x6d\x37\x76\xf6\x22\xda\x95\x61\x6d\x2f\x56\xc5\x05\x8b\x2f\x22\x65\x42\xbc\xac\xde\x81\xba\x2f\xf5\x61\xfe\xfd\x61\x36\x98\xaf\xea\x85\x86\x87\xf3\x1e\x27\xdb\xc9\xaf\xb2\xfd\x6f\x5c\x7c\x02\xb6\x82\x72\x2a\xbc\x34\x2a\x7b\x12\x40\xee\xae\x45\xf4\xb8\x10\x40\xb1\x31\x95\xcf\x45\x33\xd2\x36\xce\x27\xfd\x45\x9c\xa0\x3a\x4e\xa5\xfd\xe7\x37\xe8\x58\xf2\x4a\x53\xdf\xdd\x9e\x08\x60\x5e\x55\x60\x09\x39\x4d\x9f\xef\x9c\x9f\xeb\xa5\x29\xb8\x6d\xb3\xba\x37\xe8\x81\xf0\x71\x5a\x0d\x1f\xff\x45\x3f\x6e\x0d\x9e\x1c\xb5\x6e\xd5\x6c\xe4\x9b\xbf\x45\xf7\x6c\xe8\x8b\x97\x7b\x4f\x2c\x80\xf7\x64\xe1\x7f\xd2\x94\xd8\xdc\x87\x06\x70\x7c\x3b\x91\x8c\xb2\x1f\xd9\x8b\x0f\x0d\xf9\x76\xa2\xe9\xac\x3f\xaa\xa3\x7e\x58\xc9\xb7\x6e\x71\x69\x0a\x74\x74\x9a\x84\xa9\x8c\xfb\xd6\x5c\xe6\xfd\xae\xdd\x41\xbb\x85\xfe\xf3\x3d\x8e\xad\x7a\xd8\x2b\x00\xf7\x3f\xdb\xf3\xc8\x36\xc8\x7b\x94\x8f\xdb\x55\xc9\xcd\xc9\x4f\xad\xde\x4e\x46\x32\x34\x7f\xd4\xea\xaf\xbb\x24\xef\xf4\xdb\x89\xcf\x89\xe0\xa1\x3c\xbe\x7a\x72\x75\xfc\xbd\x71\x95\xf9\xf9\x57\x5e\x8d\x5d\xcd\x09\x87\xf1\x6c\xf3\x2d\xf7\x85\x20\x32\xf1\xac\xf8\xba\xd8\x3b\x5f\x87\x09\x0d\xef\x54\x7c\x93\xfc\x65\x91\x14\xfd\x3e\x5b\xfb\x2f\xe0\x59\x10\xa2\x49\x73\xef\x47\xef\x5f\xef\xfa\x6c\xf2\x84\x62\xda\xba\x2e\xdf\x4c\xf2\x6d\x3d\x27\x56\x6d\xb2\x69\xea\x3d\xbf\xea\x2e\x80\x1a\x2f\xe7\x7f\x05\x75\x9c\x7c\x61\x91\x83\xf3\x0b\x17\x8d\x7b\xf2\xc5\x5e\x7e\x4b\x12\xc0\xc9\x17\x3b\xfd\xdc\xca\xd7\xb5\xfc\xa4\x95\x4d\xbe\xb8\x94\xbf\x7f\xae\x61\x69\xfd\x82\x28\x9c\xb6\xac\xab\x9c\xfa\xbd\x92\x5f\xdf\xe6\x3b\xe4\xaa\x20\xe6\x60\x4d\x23\x61\xe1\x9a\xf4\xde\x85\xff\x9e\xec\x79\xa4\xf4\xa3\x8c\x5e\x4d\x76\x75\xd7\xf4\x9a\xb5\xd2\x6a\x9d\x5f\xa5\x1f\x5e\xb3\xc0\x78\x69\xcc\x79\x5a\xce\xd3\x63\xa2\xde\xee\x7a\x83\x60\xa2\xf4\xe9\xca\xe4\xbd\x41\xbe\x65\x0b\xc5\xa4\xc9\x2f\x17\x6e\xea\x7e\xba\x28\x74\x53\x76\xd3\x9c\xfc\xba\x6e\xea\x03\x72\x86\xbd\x99\xb8\x4c\xaa\x2e\x85\xea\x2f\xdd\x3e\x7b\x5a\x43\xa0\xc5\xad\xda\x15\x78\x1e\x2a\xe9\xf3\xc4\x0e\x21\x6f\x14\xb8\x1c\x2c\x37\x7b\xac\xb8\x1c\xcc\x45\x75\xe8\x54\xcb\xec\xa3\x7d\x6b\xfc\x43\xfc\xa4\x0f\xc1\x98\x28\xfe\x49\x3b\x1a\x89\xc8\x4c\xbe\xf6\xd1\xe3\x66\x13\x56\x69\x23\xd0\xdc\x52\x95\x90\xc4\xa1\xde\xfc\x7e\xf3\xef\x26\xfb\xec\xef\x7f\x67\xce\xb8\xb8\x36\xff\xf8\x47\xf6\xe2\xfe\xe7\xaa\xbd\x60\xf2\x07\x27\x27\xce\xd3\x2f\x1e\x5d\x51\x1b\x62\xab\x1f\x27\xcd\x10\xe3\x88\x9f\x5d\x46\x81\xf2\x42\x80\xff\xc9\xff\x0e\x00\x00\xff\xff\x64\xe7\xfc\x0f\x92\xea\x00\x00") - -func confLocaleLocale_deDeIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_deDeIni, - "conf/locale/locale_de-DE.ini", - ) -} - -func confLocaleLocale_deDeIni() (*asset, error) { - bytes, err := confLocaleLocale_deDeIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_de-DE.ini", size: 60050, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_enUsIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\xbd\xeb\x72\xdb\x48\xb2\x27\xfe\x1d\x4f\x81\xf6\x84\xc3\x76\x84\x4c\x47\xcf\x9c\xff\x25\x3a\xfa\xb2\x6a\xb9\xdd\xf6\x39\x96\xad\x63\xa9\x67\x76\xb6\xc3\xc1\x06\x49\x88\xc4\x31\x09\x70\x00\xd0\xb2\x66\x62\x22\xf6\x01\xf6\x01\x76\x5f\xef\x3c\xc9\x66\xfe\x32\xb3\x2a\x0b\x00\x25\x7b\xe6\xf8\x83\x45\x54\x65\xdd\xb3\xb2\xf2\x56\x59\xc5\x7e\x3f\x5f\x95\xdd\x32\xff\x2e\x3f\xcd\xf7\x45\x55\x6f\xcb\xae\xcb\xbb\x72\x7b\xfd\x74\xd3\x74\x7d\xb9\xca\x7f\xae\x7a\xfa\x6e\x3f\x56\xcb\x32\xcb\x36\xcd\xae\x24\xd0\x97\xf4\x27\x5b\x15\xdd\x66\xd1\x14\xed\x8a\x12\x9e\xdb\xef\xac\xfc\xb4\xdf\x36\x2d\x03\xfd\x24\xbf\xb2\x4d\xb9\xdd\x73\x19\xfa\x93\x75\xd5\xba\x9e\x57\x35\x7d\x5e\xd2\xaf\xfc\x55\x2d\x29\xcd\xa1\xb7\xa4\xb7\x87\x5e\xd2\x0e\x7b\x4b\xfa\x65\x9f\xb5\xe5\xba\xa2\xde\xb4\x94\xf4\x4e\x7f\x66\x37\xe5\xa2\xab\x7a\x6e\xe9\x4f\xf2\x2b\xfb\x58\xb6\x5d\xd5\x70\xed\x7f\x94\x5f\xd9\xbe\x58\x33\xc0\x05\xfd\xc9\xfa\x72\xb7\xdf\x16\x28\x70\xa5\x3f\xb3\x6d\x51\xaf\x0f\x02\xf3\x5a\x7f\x66\xcb\xb6\xa4\xac\x79\x5d\xde\x50\xea\x19\x3e\x66\xb3\x59\x76\xa0\x49\x98\xef\xdb\xe6\xba\xda\x96\xf3\xa2\x5e\xcd\x77\x32\xcc\x5f\x28\x3d\xd7\xf4\x9c\xd2\x73\x4e\xc7\x10\xca\x15\x0d\x75\x5e\x74\x3a\x0e\x9a\x4b\x1a\x79\xd1\x65\xa8\xaa\x2e\x76\x56\x9a\x7f\x66\xe5\xae\xa8\xb6\x3c\x6b\xfc\x97\xfa\xdd\x75\x37\x0d\xa6\xf6\x42\x7f\xd2\x1c\xcc\xfb\xdb\x7d\x89\x29\x78\x7a\x45\xbf\xb2\x65\xb1\xef\x97\x9b\x82\xbb\x29\xbf\x32\x02\xda\x37\x34\x17\x4d\x7b\x0b\x38\xfb\xc8\x9a\x76\x5d\xd4\xd5\x5f\x8b\x5e\xe6\xe7\xad\xfb\xcc\x76\x55\xdb\x36\x3c\xb5\xe7\xf8\x91\xd1\xc8\xe7\x5c\x0f\xa5\xbc\xa1\x49\x70\xb5\x70\xce\xae\x5a\xb7\x32\x8b\x9c\x79\x8e\x2f\xae\x45\xf2\xb4\x26\xc9\x0a\xb5\x5d\x37\xed\x07\x4d\x7d\xc1\x3f\x07\x55\x52\xe7\x34\x37\xed\x57\x51\xd3\x7a\x68\xee\x39\x3e\x12\x80\x2e\x2b\x56\x3b\x9a\xe1\x7d\x51\x97\x3c\x75\xa7\xfc\x45\xf3\x45\x5f\x59\xb1\x5c\x36\x87\xba\x9f\x77\x65\xdf\x57\xf5\x9a\xd7\xe0\x54\x92\xf2\x4b\x4d\xca\x5c\x5e\x48\xbb\x6d\x0e\x61\x95\x29\xfd\xcf\xf4\x99\x5f\xc8\xa7\xe4\xb9\x42\xc8\x0c\x25\xa9\xc9\xbe\xfa\x58\xf5\x55\x29\x8d\xd9\x47\xb6\x3f\x6c\xb7\x34\x9f\x7f\x39\x94\x5d\xcf\x59\x17\xf4\x4d\x33\x20\xdf\x59\xd5\x75\x07\x94\x78\x85\x1f\x19\x2d\x6a\xbd\xc4\x70\xce\xf0\x23\xcb\x7e\xad\xea\xae\x2f\xb6\xdb\xf7\x99\xfe\x60\x60\xf9\x25\xf3\xd4\x57\x3d\x3a\xab\x89\xf9\x65\x5f\xee\x3b\x9e\xe8\xfc\x45\xd5\x76\xfd\xd3\xbe\x22\x54\x7b\x77\xa8\xb3\x55\xb3\xfc\x40\x48\xcc\x1b\x12\x5b\xe9\xd5\x75\x4e\x63\x7a\x44\x68\xdc\x1e\xea\x9a\x46\x91\xff\xdc\xd0\xc8\xa8\x99\x6a\x55\xe6\xcf\x01\x7d\x92\xef\xb7\x65\xd1\x11\x48\x59\xac\xf2\x6f\x8b\xbc\x2f\xda\x75\xd9\x7f\xf7\x60\xbe\xa0\xcd\xf3\xe1\x41\xbe\x69\xcb\xeb\xef\x1e\x3c\xec\x1e\x7c\xff\xf3\x81\x8a\x6d\xab\xba\xec\xbe\x7d\x56\x7c\x9f\x2f\x0b\xca\xa1\xb1\xde\xe6\x8b\xf2\x9a\xf7\x0a\xb5\x95\x13\x92\xd6\x6b\xde\x27\xb7\xfd\x86\x1b\xa4\x05\xa3\x1f\x5d\xce\x1b\xf5\xab\x8c\x67\x89\x36\xf2\x7c\xb5\x30\xa2\x84\x0e\x21\xb9\xa5\x59\x3a\xbf\xbd\xfc\xf7\xd7\x27\xf9\x05\x51\xa6\x75\x5b\xe2\x37\xfd\x47\x25\xfe\x90\xd3\x68\xaf\xaa\xe7\x3f\xce\x32\x2a\x6b\x13\xf2\xbc\xe8\x8b\x05\xf7\x3d\x2c\x12\x67\xca\x1e\x0a\x79\xd8\x49\x4c\xeb\x40\xd7\xba\x1e\xbb\x53\x77\xe6\xe4\x3e\xa4\x3a\x74\xf3\x86\x3a\xde\xf0\x0e\xa6\xf4\x30\xb3\x17\x32\x67\x54\x55\xfe\xea\xcd\x9b\xb7\xcf\x7f\xcc\xcb\x7a\x4d\x33\x93\xdf\x54\xfd\x26\x3f\xf4\xd7\xff\xff\x7c\x5d\xd6\x65\x5b\x6c\xe7\xcb\x8a\x27\xa5\x25\xbc\xca\x69\x96\x64\x88\xb3\xac\xeb\xb6\x44\x60\x56\xdc\xca\xe5\xe5\xeb\xfc\x9c\x7e\x52\x67\xa8\x2c\x77\xa4\xdf\x64\xdd\x5f\xb6\x3c\x51\xa1\xc1\xab\x4d\x99\x03\x67\x01\xd4\x5c\x0f\xe7\x25\x5f\x69\x5f\x67\xf9\xb7\x8b\xf6\x7b\xd7\xbf\x62\xd1\x35\xdb\x43\xaf\x25\x6f\x36\x65\x8d\x85\x22\x54\x6a\x7b\xa2\x56\x46\xfb\x67\x59\xd9\xb6\x73\xa2\x9b\xfd\x2d\x2f\x8f\xf6\xe5\x58\x2b\x52\x19\xa1\x72\xdd\xf4\xb4\xfc\x39\xca\x49\x15\x55\xfd\xb1\xd8\x56\x2b\x5a\xa4\x38\x91\x69\x59\x24\xae\x1a\x5a\x6f\x2e\x4d\x18\xdd\xdc\x60\x8a\x68\x83\x11\x59\xcf\x1f\xcc\x1e\x80\xce\x3e\x78\xfa\x60\x96\xd5\xcd\x5c\x88\x00\x53\xe4\x55\xd5\x15\x0b\xa2\xce\x72\x5a\xb4\x46\xec\xfe\xcc\x78\x27\x5d\x51\x88\x3c\x81\xe0\x35\xe1\x13\x08\x84\x9f\x91\xb2\x20\x32\x0d\x5a\xa2\x54\xc4\x8f\xdd\x48\x4e\xc0\x0b\xa1\x3a\x21\x61\x34\xe6\xcc\x16\xda\xb0\xf2\x74\xbf\xdf\x56\x4b\x69\xfa\x67\xc9\x8b\x08\xca\xe7\xb1\x4e\x8a\x87\x03\x82\x59\x9e\x43\x33\xea\x35\x53\xa5\x3c\x21\xef\x28\xbf\x29\x69\xc7\x6d\x0e\x6b\x39\x93\xb6\xcd\x61\xf5\x15\x0e\x07\x5b\xb9\x48\x82\xf3\x77\x0d\x75\x18\x58\x15\x00\x62\x13\xa7\x44\x50\x98\x05\x68\xcb\x5d\xd3\xf3\xc4\x69\x31\x26\x73\x37\x15\x65\xd2\x48\xbb\xe2\x23\x1d\x6e\x7d\x23\x5b\x79\x45\x5b\x75\xc9\x15\xcf\x32\x22\x2b\x73\xdd\x4e\x44\x7f\x64\x4b\x59\x5a\x8a\xbb\x80\xda\x1d\x68\x17\x6e\xa8\x32\x9e\x78\xe6\x43\xa8\xca\xa9\x7e\x62\x48\x54\x0f\xa8\x03\xed\xf8\x86\xce\x4c\x5e\xe8\xe7\xf8\xa1\xdf\xbe\x7e\xea\x55\x71\x7d\x4d\xbd\xea\x68\x37\xbd\xcc\x97\xdb\x86\xb6\xe2\x2f\xef\x5e\x77\xbc\xd1\x36\xf3\x7d\xd3\x82\xff\xa0\xac\x0b\xfa\x19\xd2\xdc\x44\x33\x44\x7d\xd8\x2d\xe8\xeb\x66\x53\x2d\x37\x32\xed\x5c\x82\xf7\x07\xa5\x52\x13\x87\x8e\x96\xf0\x24\xa7\xad\x45\x23\xa0\x29\x03\x02\xf0\x18\x0c\xeb\x18\xfc\x9a\x70\xec\xd0\xd2\x76\xda\xf4\xfd\xde\x5a\x7e\x79\x75\x75\x21\x4d\x87\xd4\xbb\xda\x2e\x1c\x66\x60\x0d\xb6\xcc\x11\xd5\x79\x53\xcf\x80\x24\x87\x76\x3b\xc0\x1f\x1a\xab\xe5\x1c\x99\x17\xee\xc2\x33\xfe\xef\x32\x4e\x0f\xe6\xb9\x23\x5e\xef\x06\xd8\x44\x73\x0c\x2e\x65\x96\x6d\x9b\xf5\xbc\xa5\xd5\x30\x64\x7a\xdd\xac\x05\x81\x92\x8c\xd8\xd2\x73\x43\x09\x9e\x8d\x9b\x96\xb9\x36\x82\x04\xc1\xe2\x45\xa6\x4d\xd2\xec\xb9\x9f\x6e\x97\xbc\xd5\x84\xb8\x35\xd0\x76\xc8\x07\x9f\x44\x99\x20\x4e\xee\x4c\xdf\xd1\xfc\x29\x35\xbf\x3c\xa7\x59\x05\x49\x47\xea\x75\xdb\xec\x28\xf5\x05\xfd\x89\x09\xb1\x8f\xe7\x5c\x1f\x60\x8a\xd5\x8a\x0e\x9b\xee\x24\x7f\xf7\xe2\x2c\xff\x7f\xfe\xf0\xfb\xdf\xcf\xf2\x57\x3d\x6f\x6c\xc6\xf5\xff\x60\x1c\x2d\x74\x26\x22\x28\x11\xc0\x9e\xd0\xf8\x01\x6f\xd4\x07\xf9\xb7\xc8\xfd\x6f\xe5\xa7\x82\xf8\xcc\x72\xb6\x6c\x76\xdf\x33\x71\xdf\x15\x44\x4a\x38\x87\xb0\x5f\xb7\xc5\x65\x59\xaf\xe8\x87\x70\x7d\x9a\xe5\x88\x8b\x66\x3b\x1e\x50\x98\xdf\xf9\xb2\xa9\xaf\xab\x96\xc7\xf3\x53\x0d\xdc\x32\xb6\x38\x3f\x93\x1c\x63\xa1\x68\xca\x88\x1e\x55\xd7\xb7\x11\x14\x23\x7d\xc3\x89\x8a\x1e\x99\xe0\xf0\x5c\x49\x7d\x98\xe3\x4b\x41\x6d\xc6\x82\xb7\x34\xba\xd6\xa6\xbb\x8b\xf3\xdd\x5c\x5f\xf3\x89\x6f\x67\x95\xb6\xf0\x56\x52\xe5\xd8\xf2\x20\x84\xda\x7b\x30\xf6\xcf\x75\x4b\x9c\x3d\x7f\x93\x97\x1f\x09\x77\x99\x86\xb6\xcd\xea\xb0\x04\xbe\x32\xec\x09\x93\x7e\x22\x38\x1d\xed\xb4\x65\xa9\xc8\x12\x48\x0e\x77\x8d\xe9\xda\x92\x80\x88\xd2\x18\xe9\x27\x6e\xf4\x23\x9d\x23\xad\x6b\xe2\x67\x4b\xd2\xde\x8f\x60\x47\x9d\x0a\x25\x78\xe4\x4b\x5a\x70\x42\x0a\xe9\x45\x27\x9d\x92\x6c\xda\x3c\xb4\x2b\x0e\x24\xe5\x14\x2b\xea\xcb\xe2\x16\x54\xac\x63\x5c\x58\x95\xd7\xc5\x61\x4b\xab\x7d\x5d\xd2\xfa\x11\xbb\xbc\x9a\x6b\x5b\xdb\xa6\xf9\x80\xc6\x74\xaa\x5e\x18\x40\x7e\xaa\x95\xbe\x06\xc4\xb1\x92\xa1\xb3\x5a\x3e\x80\x85\x4e\x69\x0b\xb4\xd3\xf8\x78\x8f\xf9\xcd\x9e\xa6\x59\x27\x53\x57\x3a\xe7\xf3\x96\x72\x6a\xa2\x20\x0b\x1d\x74\x9c\xcb\xc1\x31\x6a\xb3\x73\xc9\xc2\xa1\xcf\x9b\x2c\x30\x9a\x54\x20\x7c\x37\x2c\x4b\x3b\xa7\x26\x0e\x51\x8e\x5b\xde\x62\x22\x7d\xd9\xc9\x4b\x04\xba\xc4\x38\xe7\x51\xd6\xd1\x81\x9b\xc8\x93\xe6\x87\x66\xdf\x09\xcf\x98\x83\xd9\xe0\x1a\xad\x02\x66\xb2\xa6\xfb\x32\xcb\x94\xd1\x9c\xab\x98\x3a\xff\x58\x41\x08\x0c\x5b\x4c\xaa\x54\xd1\x95\x67\xf8\x8f\x0c\xc0\xd2\x65\x37\x59\x36\xf4\xe6\x2d\x0f\xb2\x0b\x42\xa0\xe0\x09\x0f\x17\x2d\x30\xf3\x4b\x98\xf5\xb1\xc2\x41\xa7\x48\x8e\x79\x59\x30\x7f\x46\x4d\x53\x53\x5d\x59\xa2\x06\x2a\xff\x8c\xea\x44\x99\x99\x4a\x40\x2a\x94\x18\xd3\xcc\x0c\xcf\xaa\x01\xf7\x84\xd3\x94\x4a\xdb\xb4\x0e\x38\x9b\xbc\xad\xd6\x1b\x3a\x5d\x9a\x9b\x13\x99\x94\x9b\x4d\x53\xf2\x9e\x7f\xf5\xfc\xbb\xaf\xa5\x1f\x6b\x3e\x5b\x43\x21\x3e\x95\x8b\x03\x6d\x08\x9a\x31\xdd\x7a\xd2\x85\xc0\xdd\x00\x72\x24\x6b\x09\xd0\x50\xe8\x1d\x31\x53\x81\xd0\x29\x7d\xf3\x79\x4a\xd8\x22\x8c\x94\x36\xc1\x59\x1a\x16\x42\xaa\x82\xd2\x7c\xdd\x40\x50\x33\xc1\x88\xd9\x85\xac\x27\xb1\x6b\xbe\xae\xfa\xf9\x35\x53\x5b\xae\xf8\x05\x57\xc0\xdc\x0b\xe5\xe4\x8f\x28\xeb\x51\x4e\x14\x9b\xa4\xcf\xd5\x37\xf9\xc3\x8f\xca\x6a\xff\x81\xc9\x28\x6f\xc5\x6a\x8b\x15\x51\xf1\xaf\x2d\x85\x93\x36\xd5\x43\x60\x5b\xbb\xc3\x1e\x87\xbb\x72\xc8\x41\x8c\x5a\x35\x37\x35\x13\x0c\x1c\x17\x44\x1a\xab\x65\x45\x87\xdc\xa2\xaa\x0b\x3a\x1d\xad\x16\x1c\x43\x0f\x09\x25\xde\xbc\xbd\x02\xe0\xba\x59\x1c\xaa\xed\xca\x00\x66\x99\x71\xd1\xc4\x43\xeb\xe2\x7b\x79\xc4\x92\x2a\xe9\xcb\xb2\x69\xf9\xfc\xc5\x68\xac\xe0\x11\x5e\x90\x0f\x6f\x61\xde\x2b\x16\x04\x01\x8b\x72\x81\x6d\xe3\x69\xa0\xd5\x5f\x6e\x94\xa9\x03\xda\x54\x5d\xfd\xa8\x47\x4f\x97\x07\x6a\x8b\x56\x9e\x93\xa9\x60\x97\x3f\xfd\x9e\xfe\xcf\x98\x45\x94\x43\x6b\x3d\x9e\x78\xce\xcc\x25\xf3\x20\x5b\x31\xe9\x6a\x82\xe3\x61\xa5\x0d\x83\xdd\x58\x7d\x7f\x0d\x05\xba\x83\x20\x2d\x6b\x89\xb6\xb4\xac\xe5\x57\xf4\x83\x45\xde\xf5\x16\x8b\x50\xf4\x2a\x97\x36\x34\x6f\x8c\x20\x27\xb2\x67\xae\x69\x68\x4c\xfe\xfb\xe2\x43\x09\x51\x36\xce\xf9\x14\xf7\x73\x74\xde\xb2\x5f\x59\x67\xf6\x3e\x3b\x08\xe7\xde\x6c\x57\x41\xba\xc4\x6e\x20\x6a\x54\x26\x2a\x9f\x08\x13\x10\xbd\x23\x09\x65\xb9\x99\x07\x85\x1b\x4f\x64\x5f\x7e\x02\x8f\x83\xac\xa8\x7f\xe3\x5d\xc2\x59\xd9\xee\x16\x4b\xcc\x03\x3f\xbf\x8d\x2b\xcc\x0a\x89\x6e\xd3\xdc\x40\x7b\x15\x20\x2e\x29\x05\x7a\xab\x84\xbf\x67\xad\xd7\xb2\xd9\x12\xbe\x37\xbc\x2a\x1f\x23\xfc\x99\x4f\x4d\x2b\xa7\x76\x49\x18\xd1\x66\x53\x6d\x0d\x65\x89\x82\x48\x73\x45\x41\xd4\x65\xa0\x94\xaa\x59\x04\x41\x25\x7c\x51\xbd\xc8\x8c\x16\x1e\x6a\x17\x6b\xf9\x55\x2d\x9c\xb7\xef\x27\xcd\xb1\x6a\x1d\xdf\x67\x06\x97\xf4\x49\xc8\xad\x4c\x7a\x97\xa8\xc2\xba\x81\x2e\x8c\x95\x42\x45\x0b\xdc\xbe\xc4\x0f\xaa\x9b\xc8\xdd\xe6\xbd\xd3\x0a\xce\x0d\xf3\x4c\x3b\x08\xcd\x95\x52\xbc\xc8\xa1\x6d\xca\x3d\x33\x73\xbb\x0e\x28\xbb\x65\xf5\xc9\xad\x0a\x37\x01\x79\x7f\x90\xb3\x84\xb0\x99\x28\xf0\x57\x59\xd7\x30\x31\x98\x7f\x61\x15\x3f\x56\x84\xa6\x28\x9f\x9e\xc3\xa2\xae\x24\x19\x84\x07\x43\x14\xe0\xf6\x24\x15\x7b\x37\x24\xdc\x2f\x4a\xe2\x09\xb4\xd8\x6a\x66\x6a\x0b\x46\x2f\x12\xb6\xb1\x9f\xa1\x62\xc5\x0e\x94\x92\xcd\x88\x41\xe0\x1e\x0a\x09\xd6\x56\x02\x2b\x0a\x46\xd3\xf3\xa3\x13\x6d\xd2\x84\xed\x4a\x96\x6d\xe6\x3b\x51\x6d\xca\x57\x7e\x5e\x66\x74\x52\xaf\xb1\xcb\x64\x1b\x7c\xc7\x2a\xad\x35\x44\x40\xdd\x17\x0c\x50\xf6\xfe\x8c\x50\x08\x4b\xf9\xc1\x54\xc9\x44\xb5\x6e\xa0\x62\x64\x3e\x69\x38\xfd\x74\x9a\x52\xf6\xcc\xce\x1c\x61\x5f\xc0\x39\x77\x44\xc9\xe2\x24\x9e\xe6\xac\x13\xf6\x50\x2a\x05\x84\x51\x31\x3c\x13\xb4\x6f\x17\xdf\x3f\xec\xbe\x7d\xb6\xf8\x3e\x90\xfd\xe5\xa6\x5c\x7e\x10\xd4\xad\xea\x45\xf3\x09\x4a\x07\x28\xbf\x4a\xaa\x95\xb6\xf2\xc3\x55\xbe\xa1\x5c\xc8\xbc\x44\xa6\xa8\x18\xcd\x3b\xe7\x26\x6b\x46\x7d\x61\x6a\x36\x13\x65\x63\x29\x7b\x23\xe2\x23\xb4\x8e\x8c\x91\x38\x9b\x0c\x25\xa9\xd0\xa6\x5a\xd0\x89\x47\x84\x0b\x72\xf2\x6b\xfc\xbd\xd0\xe4\x72\x35\x80\x70\x6c\x44\x1b\xc8\x2c\xeb\xe8\x42\x01\xee\x24\x40\xe3\xf8\x14\x65\x22\xba\xf0\xca\x62\xfe\xb6\xd5\xae\xea\x47\xa8\xc8\x44\xb7\x50\x94\x56\xe5\xa8\xad\x0d\xc6\x10\x67\x97\x8e\x2e\xaa\x86\x38\x0d\x43\xcf\x9b\x82\x84\xeb\x3f\xe4\xd4\xc6\xa1\x67\xf9\x91\x55\x56\x3d\x9d\x5d\x05\xb3\x2a\x24\x58\x17\xdd\xfc\x50\xeb\x32\x11\xfb\xac\xc8\xf9\xb2\xc2\x89\xca\xed\xda\x16\x72\x50\xa9\x3c\x97\x3f\x0e\x2b\xf8\x64\xa6\x6a\x52\x94\xe2\x53\x8e\xfb\x53\xb1\xf0\x51\x4c\xe1\x02\xd1\xf3\xba\x94\x19\xc2\xf8\x19\x8c\xd1\x86\x44\xea\x38\x59\x24\x97\x7f\x60\xae\x9b\xd7\x77\x71\xe8\xfb\x86\x45\xcb\x2d\xe3\xa0\x94\xb1\x3e\x9f\x01\x10\xc2\x77\xac\xef\x56\x96\x25\x9d\x25\x95\x8e\xc1\xa3\x74\xa0\x23\x62\xe8\x60\x11\x3f\x1d\x9a\xf2\x04\x01\x6a\x25\x3a\xc9\xa2\xbe\x8d\xea\x2e\xf4\x81\x9b\xeb\xa7\x7b\xf2\xb8\x2d\x9f\xc4\xbe\x84\xfd\x87\x12\xda\x1f\x29\xed\xb6\xe6\x3b\x64\x8a\x42\xdd\x36\xb0\x9d\xa8\x4b\xd5\x74\x06\xd4\x68\xd3\xa9\x45\x3e\xef\x32\xa2\xf3\xc4\x63\xaf\x30\xcb\x34\x08\x94\x9e\x0d\xda\x8a\x22\xfd\x78\xfa\xfa\xb4\xc7\xf1\xd0\xed\x9b\x66\x4e\xe7\x22\xb4\x31\xd6\xbd\x7c\x5b\xd6\xeb\x44\x8d\x09\xe3\x18\xf0\xed\xff\x65\xd5\x63\x3d\x87\xfc\xe9\x36\xe0\x9b\xa6\x7e\x8a\xb4\x20\xc0\x58\x69\x55\x7c\x5b\x83\x5c\x4d\xdb\x1c\xd6\x1b\xd5\x61\x65\xbf\xf2\xac\xbd\xcf\x74\x5d\x4b\x57\xa7\x62\xbd\xe5\xd8\xfa\xcb\xde\x0e\xf0\xc6\x06\xff\xb1\x6c\x59\xd8\x07\x50\xb2\xf0\xc7\x56\x24\x9d\x90\x40\xd2\x23\xdf\xf4\xce\x13\x20\x4d\xbe\x3e\x6c\x4f\xf2\x1b\x61\xa8\x62\x99\xa0\x68\x50\x56\x8b\x51\x5c\xac\x82\x34\xbc\x66\x55\xd0\xf8\x6e\x61\xeb\xf8\x33\x1d\xca\x35\xec\x4b\x4d\x46\x19\x52\xe8\x1c\x3f\x08\x94\x35\x25\xef\x33\x3e\xac\xdf\x0c\xe4\x05\x3e\xd5\x35\xcd\xf1\xac\xc8\xfa\xc9\xdb\xcf\xc2\x98\x2f\x26\x44\x8b\x77\x65\x34\xa3\xe1\x57\x18\xfc\xe5\xe5\xcb\x2b\x53\x7d\x5c\xbe\xcc\x3f\x94\x5a\xf7\xcb\xbe\xdf\x77\xbf\x40\xa9\x26\x1a\x32\x56\xa7\x5d\x14\xb7\xcc\xc7\x4b\xb2\x7e\x20\xe3\xaa\x2c\x76\xda\x49\xfe\x29\x55\x9c\x12\x13\xa1\x89\xfc\x93\xf8\x12\xa7\xac\xcd\xc0\xd1\xfe\x94\x08\x32\xb2\x8b\x32\x62\x2d\x7e\x6c\x8b\x7a\x69\x85\x99\xd5\x58\x20\x41\x4a\x9e\x91\xa0\x52\xf5\x97\x07\x12\x57\x60\xf2\x93\x6f\x5a\x26\x24\x68\xf6\x39\x4d\x85\x18\x39\x35\x7b\x27\x09\x9a\x7d\xb6\x69\x58\x17\x10\x72\x97\xf8\xce\xae\xda\xb2\xd4\x56\x5f\x98\x65\x21\x03\x7b\x29\xbc\x8f\xfc\xca\x82\xe0\x5b\xaa\xed\xef\xb7\x91\x0e\xfc\xb7\xac\xd8\xee\x49\x36\x67\x06\xd6\x81\x41\xdd\xbb\x50\x11\x3d\x07\x08\x36\xf6\x61\x47\x38\xbc\x84\x1a\x85\x0a\x3c\x7e\x3a\x7f\xe2\xd4\xff\x69\x65\x2b\xa2\x77\xff\x50\x85\xfc\x5b\x76\x65\xac\xb7\xab\xfe\x6a\xa3\x48\xaa\xe3\x74\x3a\x3b\x08\x02\x72\x48\x84\x0a\x40\x38\xfd\x58\x26\xe9\x59\xfb\x4b\x09\x24\xf7\x24\x55\xef\x8a\x4f\xf7\x15\xdc\x35\x13\xe5\x84\xaa\xc7\x42\x46\xbc\x75\x88\xc9\x06\x27\x70\x56\xef\x1e\x05\x26\xdc\x24\x90\xaa\x5e\x6e\x0f\xab\xa3\x1d\xe9\x0e\x0b\xda\xeb\x2c\x4f\x3d\x7a\xd8\x3d\xe2\x2a\xeb\x0f\xc4\x1c\xd5\x01\xfe\x17\xf9\xce\xf1\xfd\x8d\x99\xa0\xe7\x54\xad\x08\x99\x79\x30\x46\x13\x8f\xb7\xe2\xf3\x12\xc2\xe2\x2c\x92\x5a\x2f\x40\x86\xfd\x09\x4d\x9b\x0a\xf8\x81\x44\xb1\x7a\x0d\xb2\x34\x61\xe1\x2c\x9a\xcd\xe7\xcc\x6b\xcd\x59\x30\xab\xbd\x24\xc5\xe7\x83\x71\x14\xe0\xc6\x00\x31\x13\xa3\xc6\xb8\xdc\x80\x80\x1c\x2d\x4e\x1c\xe5\x44\xe9\xb7\x63\x83\xcb\x91\xf2\x3d\xd1\x80\x89\x0a\x02\x69\x38\x5a\x50\xd6\x1e\x85\x0e\x1d\xe4\xe5\x84\xb6\x8d\xcb\x31\xd4\x2c\xce\x52\x98\x70\xbf\x36\x5e\xee\x0c\xf3\x9c\xaa\x09\x58\xe5\x46\xe8\xd7\xc2\x7d\xc1\x29\x0b\x54\x79\xa3\xc7\xd1\x8e\xe5\xe2\xee\xc0\x47\x2b\xcb\xd0\xc2\xa9\xa6\x33\xca\x4c\x13\xaa\x2a\xd1\xc4\xf1\xea\x09\x9f\xf8\xf4\xb8\xaf\x7e\x80\x7d\x61\xd5\x5e\xb7\x34\xae\x58\x2b\x0f\x40\xc7\xaa\x0d\x8a\x8f\xf2\x53\x05\xd3\xc2\xcf\xd5\xc7\x52\x55\x1f\x41\xe3\x83\xbc\x59\xb6\xa5\xfd\xcf\x22\xb0\x8c\x4a\x44\x9a\xe6\x23\xef\x28\x6e\x8f\x73\xa5\x9c\x98\x1a\x74\x50\x8c\x24\xaa\x44\x81\xbd\xb3\x5c\x9d\xb0\xed\xb5\x07\xef\x82\x0d\x5a\x6c\x6f\x8a\xdb\x0e\x0a\x41\x23\x32\x6c\xa5\x91\xe2\x4c\x41\x88\x7f\x5b\xa3\x57\x5e\xbe\xa5\x5d\x63\x33\xc1\x46\x2d\x3e\xd1\x02\x9b\x75\x03\x35\x08\x28\x84\xaa\x18\x3f\x3a\xde\x41\x0f\x40\x56\xe1\xb0\xee\x82\xc5\x3d\xc9\x76\x15\xc1\x38\xaf\xc4\x7e\xa2\xec\x09\xf3\xb6\xd4\x0c\xf3\x9a\x44\x82\x65\xae\x2b\x88\x12\xe8\x92\xd3\x89\x1d\xa8\xfe\xa7\x22\x23\x55\x34\x87\x2c\x72\x47\x35\x11\x1f\x98\xb4\x2a\x66\xcb\x92\x74\x51\xae\x74\x7d\xb5\xdd\xf2\x4c\x9b\xc3\x4a\x22\xb3\x20\x17\xfb\x04\xd3\xd4\x6d\xaa\x7d\xde\xc0\xa2\xe1\xa7\x30\xa2\xad\x93\x0e\xd8\x6a\x57\x42\x06\x63\xcb\x0e\x1d\xb8\xdd\x75\x09\x13\xcf\x2e\xbf\x66\xa7\x8a\x99\x36\xcd\xc2\x86\x38\xa8\x1c\x69\x59\xc4\x59\x34\xed\x0f\x08\xac\x9d\x5b\xa8\xb4\x69\x31\x21\xc2\x8e\x80\x3e\x60\x56\x63\x4d\x9d\xf5\x81\xd1\x6c\x34\x05\xe0\xf9\x13\x83\xf0\xe4\x3c\x5c\x27\x3a\x14\x69\x1f\x98\x76\xcf\xb8\x33\x71\x00\x99\x0b\x17\x92\xec\x8a\x2b\xe4\x18\x7f\x32\xdc\x18\xd9\xaf\x8c\xf7\xef\x33\xe1\x84\xe7\xc1\x4e\x73\x26\x9c\xb1\xb0\xb5\x48\xcc\xfe\xa3\xa1\x83\x16\x46\x87\x7f\xa5\x5f\xb0\x50\x64\x89\xe5\x79\xa0\xe0\x51\xd7\x1b\xc6\xc9\x0b\x42\x25\x3a\xeb\xd5\xff\xe6\x36\xbb\x6e\xb0\x9f\xa0\xff\x79\x61\xbf\x33\xf6\x6e\x68\x81\x5c\x97\xfa\x2b\x51\x28\x49\x21\xd1\x36\xbe\xb0\xdf\x9a\x1a\x92\x68\x5b\x84\x94\x5f\xf4\x67\xc6\x3a\x89\xdd\x0c\xf4\x97\xf9\x6d\x18\xa9\x1c\xd5\xe5\x43\x95\xf1\xdf\xf2\x66\x0e\x9e\xf8\x2b\xa2\x3c\xb5\xc8\x70\x42\x04\x7c\x51\xcd\x0e\x55\x04\xdf\x08\xae\x25\xfb\xd5\xfc\x92\xde\x67\xd1\x7b\xc9\x1c\x97\xa6\x14\xec\x61\xfa\xc5\xec\x94\xe9\xae\xee\x94\xf7\xfd\x37\xfa\xa9\xfa\x28\x50\x0c\xfc\x50\x85\x02\xbc\x14\xcc\xb4\x0c\x67\x27\xf7\x99\xa9\xf6\x2f\xd5\xaa\x29\x4e\x7d\x97\x3f\x97\x1f\xa6\x9a\x38\x54\x18\x63\x45\x12\xc2\x1e\x0b\xe7\x7c\xaf\x74\x25\xc3\x20\xd4\xf5\xce\x2b\x27\x46\x92\xad\x54\x02\x6e\xc2\x2c\x85\x38\x3b\xd9\xe8\xe3\x24\x5c\x56\xdb\x43\xf4\xad\x9d\x15\x94\x6d\x7b\x2c\xae\x13\xd8\x4d\xb9\x30\xd3\xd8\xbe\x6c\x75\x9c\xbb\x82\x84\xd0\x8f\x55\x11\xd4\x62\x8e\xa7\x09\x87\xae\xe9\xb5\x12\x59\x10\x52\x86\x28\x21\x8d\xa5\xb1\x05\x66\x6d\x8f\xe0\x3f\xd5\x5a\x89\x65\xaa\x06\xbb\xc3\xae\x53\x76\x26\xbe\x60\x97\x31\xf8\x80\x8c\x9d\x1e\xb9\x09\xb5\xd0\xbd\xd6\x9f\xd9\x61\xcf\x26\x2f\x37\x97\xbf\x20\x21\xcc\x65\x9a\xef\x64\x3d\xcc\xaa\x15\x0b\x6a\x2d\x01\x5f\x39\xe1\x8f\xed\x3e\xba\x8f\x27\x9c\x19\x75\x4b\xaf\x86\x20\x51\x09\x04\x1a\xa5\x03\xc7\x42\x89\x1b\x02\xa6\x96\xce\xb9\x9c\xf5\xd1\xdb\xaa\xfe\xd0\xe9\x4a\xf1\x3c\x79\xb9\x17\xca\x3a\xc2\xf7\x43\xa9\x92\x08\xff\x1c\xbb\xce\xa9\xc9\x54\x0d\xa8\x8b\x5b\xd3\x66\x88\x89\x55\x51\x9f\x0d\xb7\x10\xb6\x8e\xdb\x6a\x87\x46\x5a\xb3\xd1\x9a\xed\x11\x26\xe2\x48\xd1\x68\x1e\xf2\x33\x31\x1b\xeb\xee\x22\x91\xaa\xe9\x54\x7b\x1c\xe9\x1e\xa7\x41\x39\xa4\x64\x4f\x97\x25\xd6\x23\xab\x76\x6a\xe6\x6b\xec\x70\xdd\x4b\x73\x35\xb4\x44\x68\xdd\x5a\x67\x6a\x80\x39\xb5\x3a\xc5\x3c\x6d\x63\x02\x75\x99\x57\x3b\x91\x07\x7f\x31\xe3\x35\x16\x3c\x08\x0c\xc8\x9e\xa5\xfd\x19\x62\x89\xb6\x6b\xe6\x97\x7b\x90\xc5\x50\xc1\xdb\xf3\x64\xf9\x03\x45\x6a\xb6\x09\xbb\x66\xe3\x08\xf9\x3c\x79\x2e\xff\x0d\x2c\xaf\x41\x6d\xc1\x7b\x6c\x3e\x00\x51\x49\x3f\x81\x9c\xe4\x8a\xad\xad\xa3\x1c\xf1\xa0\xf7\xa3\x1d\x63\xe5\x6e\xd8\x61\xce\x0d\x5c\x71\x7c\x35\x33\x27\x34\xd6\x34\x8b\x19\x17\xde\x42\xe2\x31\x55\xc3\x06\x2c\x55\x38\xa2\xa2\x8d\xfe\xb3\x24\x25\xd6\x2c\x22\x45\x17\x24\x89\x53\x21\x9c\x6c\xb5\x11\x57\xdb\x90\xaf\xde\xb6\x09\x7d\x2d\xcd\x05\xc7\x53\xe0\x7d\x5b\x41\xf3\x90\x52\xe2\x11\xed\x4d\xe8\x2c\xc8\x6c\x03\x87\x92\x48\x5e\x69\xdc\x5a\x15\x9f\x5b\xf8\x65\x29\x41\xb7\x45\x3b\x80\xb9\x62\x4d\xb6\x8d\x60\xb9\x82\xff\xa1\x8f\xf4\x21\x54\x51\xc6\xfa\x5c\x13\x06\xf9\x36\x18\xc9\xb6\x05\x99\x18\x0d\xfb\xbf\x7d\x2c\xc3\xc1\x51\xd5\xe2\xcf\x13\xac\xb5\x09\x75\xca\x9f\x83\x5c\x11\x3a\x88\x3d\xc0\x88\xd5\x0f\xc3\xd6\x23\x1e\xfd\x94\x5a\x12\x64\x6c\xe9\x2e\xfa\x2a\xa3\x1e\x01\xc7\xa3\xcd\x7b\x05\xe4\x49\x15\x7d\x0c\xe5\x21\x44\x95\x14\x52\xe7\x89\x9d\xa3\x13\x6d\xce\xe7\xdb\x36\x98\xff\xf8\x2f\x30\x6b\x24\x4d\x45\xb3\x46\xe8\xe4\x60\x87\x8d\x46\x39\xde\x6a\x94\x01\x56\x48\x71\xd9\x31\x34\x8a\xcd\x81\xaf\xe1\x56\x44\x82\xe1\xe9\xa1\x24\x70\x3f\x8a\x09\x38\x9a\xd8\x31\x0e\x5e\x75\x70\xa5\x15\x71\xa6\x1b\xe9\xcc\xd3\x35\x3f\x85\xbc\x46\x93\x22\xb0\xe0\x0c\x89\x99\x60\x4e\xdf\xf6\x3a\x71\xd1\x34\x0f\xe2\x51\x11\x3c\x1c\x47\xf6\xcc\x13\x15\x92\x36\xd5\x7a\x43\xe3\xaa\x76\xec\x48\x00\x4c\x32\x6b\x75\x94\x61\xf9\x8b\x48\x54\xb3\xae\x59\x49\xc5\x2d\x88\x4b\x63\xd0\x81\x7f\xdb\xf5\x6d\x53\xaf\xbf\x7f\xde\xb0\x70\xc9\xba\x1b\x3e\x5c\x7f\xf8\xf6\x99\xa6\x13\x19\xe6\x25\x64\xff\xd7\x9f\xab\xfe\xe5\x61\xf1\xa8\xcb\xd7\xec\xc8\x0d\x3b\x56\xe1\xdc\xbb\xd5\x85\x44\xfc\x4d\x6f\xea\x30\x2d\x70\xf6\xa6\x3d\xde\x35\x5b\xda\x20\x69\x91\x66\xb7\x93\xe5\x25\x02\xb6\x13\x48\xf4\x1f\x5e\x27\x65\x8d\x99\x2b\x5b\x9d\x1f\xaa\x70\x16\x50\x3c\xae\x8f\x2e\x9b\x71\xa8\x89\x46\x44\x79\x44\x06\x5e\xaa\x66\x32\x1e\x44\x50\x87\x58\x29\xf0\x1f\xe3\x52\x58\x47\xd6\x2f\x8d\x75\x31\x10\x5b\xb8\x0a\x2b\x4e\x25\xa9\x1f\xc2\x87\x71\xda\x72\xa4\x0b\x55\xc4\x72\xc8\xcb\x67\x8f\xe9\x92\xc1\xb9\x87\xee\x01\x5d\x07\xfb\x5b\x29\x9a\x8c\x5d\xe9\x99\x0d\xc0\x51\x34\x9d\x91\x48\xd3\x86\x30\x09\x55\x2b\x85\xa6\x59\x2f\x3c\x35\x13\x07\x3b\xa1\x68\x82\x90\x24\x5b\x31\xbd\xfe\x4c\x6a\x36\x6a\x37\x0e\xdc\x9a\xfb\x0c\x8a\x86\x31\x9d\x62\x3a\x68\x2c\xd0\x9f\xe8\x42\xbd\x56\x6d\x09\x32\xd8\xd5\x3b\xca\x79\x6f\x1a\x35\x0c\xe6\x96\x88\x35\x21\xc1\xae\x2f\x93\xad\xcc\x9d\x80\x73\xae\xb8\x5e\x41\x01\xf3\xff\xe5\xab\x82\xe8\x40\xdf\x7c\x20\x54\x1a\x17\x41\xfa\xb1\x42\x81\xbe\x98\x70\xa4\xd4\xe5\x34\x12\x87\xa1\xb8\xa4\x76\xfd\xa3\x04\xc6\xd1\x15\xad\x35\xb8\xbf\x89\xf6\x08\x17\x26\xd8\x49\x68\x25\x74\x44\xc9\x80\xfa\x78\x85\xfd\x4f\x1c\x5b\xcd\x40\x10\x48\xf9\x87\x7e\xfb\x65\x49\xea\x77\x9b\x85\xa8\xf7\xa1\x76\xe4\x53\xd0\x61\x2e\x53\x11\x06\x79\x41\x0c\x07\xbc\x72\x4f\xa5\xc2\x2b\xce\xee\xd4\xc5\x5d\xdd\x23\xac\xc8\xcf\x9a\x88\x3d\x00\x40\x99\xf0\x2e\x4c\x04\xbe\xa2\xe2\xc3\x6a\x51\xb7\x1c\x75\xb8\xc5\x1a\x10\xd6\x19\xc1\xdc\x88\x9b\x4e\x7e\x7a\xf1\x8a\x0e\x8c\xd0\xa0\x55\xfa\x53\xb1\xdc\xe8\x02\xde\x88\xd6\x03\xce\x3c\xdb\xed\x90\xe2\x06\x49\x42\x8a\xdb\x4d\x04\x94\xc4\x16\x0f\x83\x1a\x0d\x48\x06\x93\xe6\xcb\x1c\x97\x9d\xd3\x04\x49\x6b\xe8\xc9\xf0\xac\x0a\x43\xfd\x8a\x66\x36\xe8\x23\x79\x6b\xed\x6f\x99\xfa\x3b\xb7\xbc\x42\x66\xe8\x06\xf4\x7b\xe0\x0f\x48\x90\x30\x7a\xe7\xbc\x85\xdb\x40\x3f\xac\xc3\x4a\x41\xfc\x52\x7a\x32\x32\xb9\x98\x91\xa8\x4c\x16\x9b\xa2\x2c\x7b\xab\x27\x1d\xf3\x7d\x74\x86\x11\x3f\x2a\x0e\xee\xa0\x32\x7e\x54\x0e\x95\x2f\x26\x9b\x0d\x18\x2d\x4d\x0f\xe8\x4d\x2e\xc7\xa0\x38\x8e\xc0\x45\x56\x44\x2c\xc1\x08\xe7\x30\x4f\xb5\xdc\x94\xdb\x2d\xed\x07\x6d\x3d\xda\x63\x75\xe8\x89\x8b\x85\x02\x39\xf9\xb6\x8c\xbc\xad\x4c\x85\x57\xe5\x59\x65\x04\x41\xdb\x0d\xde\x0d\xa2\x7c\xb0\xd3\xfa\xec\xf4\xcd\x9b\xb7\x57\xf1\x90\xe6\x7d\x50\xaf\x88\x95\xf8\x2a\x78\x46\x8e\xfa\x65\xfe\x91\x61\x01\x53\x88\xe8\xa1\xa9\x25\x8e\xc1\x79\x32\xe5\xbc\x3f\xd6\x0d\x68\x4f\xc3\x7d\x31\x5a\x9e\xf4\x7f\x75\x6c\xfd\xb2\x5f\x99\xbb\x79\x9f\x99\x42\xfc\x2d\xff\xcd\xbc\x4d\xc1\xd9\x62\xb0\xf5\xa2\xc9\x26\xde\x43\xa1\x0e\x34\xab\x91\x8d\x01\x44\xfa\x50\x40\xd4\xa2\xb9\x6f\x70\x56\x5c\xe7\x30\xe5\x9f\xb0\xca\xb4\x69\xb1\x61\x78\x72\x0f\x75\xf5\x97\x03\xd8\x33\x58\xe0\x67\x19\x3b\xdc\x2e\xaa\xad\x1c\x28\x7f\x0c\x1f\x92\xce\xbf\x06\x77\x25\x5c\xe3\xf4\xf5\x6d\xb7\x67\x7f\x65\x3a\x1b\xba\xef\x1e\x1c\xaa\x9c\xb5\x88\xec\x7a\xf7\xe0\x7b\x92\x5f\xd8\x26\x4f\xcb\x47\x10\xdf\x8f\xaa\xe3\xeb\x90\x4b\x51\x3e\x06\x6f\x19\xe0\xad\xa6\xf3\x6e\x61\x7e\x37\xd1\x78\xca\xc4\xff\x03\x6d\xf2\xdd\xcb\x38\x8e\xc7\x2a\x75\xd3\x1c\x61\xef\x7e\x2c\xb6\x87\x54\x05\xc3\xad\x73\x99\xee\x49\x86\x8b\x20\xb1\x2c\xbc\xa7\x70\x9b\x97\x33\x08\x1b\x7e\xc0\xa4\xf5\x77\xdf\x0a\xe4\x7b\xbf\xcc\xf8\x7d\x95\xa1\x27\xaa\xa4\x1e\x5e\x03\x45\x9e\xdd\xd0\xe0\x3c\x5c\xd3\x40\xea\xc4\x6a\xb8\x1b\x5d\xc5\xb6\x17\x05\x75\xee\x56\x93\x49\x0b\x06\xe1\x15\xbb\xb7\x6a\x0a\x0c\x14\xac\x5b\xb6\x15\x6e\x99\x48\x3a\xdf\x05\xce\xdd\x3d\x60\x24\xae\xab\x9e\x84\x75\xf6\x95\x0c\x8d\x5f\x12\xf2\xd3\x3c\xcd\x42\x56\x6e\x37\x8b\xbb\x8c\xe8\x07\x1d\x69\xb8\x4e\x2c\xbf\x2c\x65\x54\x9c\x4f\x7f\x81\x85\x46\x8e\x59\x4e\xdd\x0a\xfc\x43\xbf\x27\x4a\x29\xa0\x35\xc9\xa6\x92\x66\x5e\xd5\x15\x53\x80\x57\xf4\x87\x4e\x77\x91\x04\x52\x7c\x15\x3e\x17\x95\xa8\xb6\x47\xc4\xf0\x50\x8f\xfa\x37\xea\xf2\xa8\x63\xa3\x5b\x20\xbd\xd1\xa0\x6a\x7f\xcc\x1f\x12\x72\x71\x4f\xd0\x4b\xc4\x44\x01\x0f\xb5\xa8\x9e\xe9\x6f\x92\x68\xf3\xee\x18\x1a\xb9\x53\xf6\xb4\x6f\x8b\xe5\x07\x26\x2e\x84\x33\x65\x4b\x52\x01\x9c\xba\x0a\x3e\xff\x72\x42\xb4\x35\x4d\x80\x58\x18\xd4\x63\x4a\x8a\x59\xe5\x15\x4b\x10\x1f\x85\x13\x93\xeb\xc7\xaf\x2c\xe5\x31\x8b\x9e\x4f\x0c\xd0\x04\xc7\x00\xa7\xea\x8f\x41\xbe\xf5\x53\xcd\x85\x6a\x2f\xa7\x0d\xc9\xa7\x08\xeb\x27\x60\xbd\xa3\xe9\x5a\xb1\x4d\xaa\xd8\x76\xb9\xca\xbb\x66\x86\xb7\xfa\xc0\xc8\x76\xb7\xf5\x32\xb2\xb2\x97\xf8\xca\x6e\xd8\xfa\x2d\x26\x89\x3f\xe9\x4f\x58\x24\xd6\xc5\x5f\x25\xf5\x32\x7c\x60\x0b\x74\xba\x29\x3a\x35\x2f\xd0\xe2\x2c\x37\xea\x57\xd7\x5c\xcf\xe5\xde\x22\x8e\xf4\xab\x60\x26\x65\x7a\x02\x38\x6a\x7d\x57\x7c\xaa\x76\x87\x5d\x1e\x00\x51\x94\x77\xc9\xc3\xd4\xf0\x31\x9b\x36\x5f\x0c\x4d\xe5\x5f\x6e\xc5\x18\xd6\x70\xb7\x31\x83\x1d\xe8\xe6\x6c\x03\x34\xa2\x93\xb8\xcc\x64\x7a\x03\xdd\x6e\xf2\x86\x2b\xe8\x72\x95\xd7\xe7\x1e\xa7\xdf\xa6\xa1\x2a\x52\x92\x0a\xaf\xea\x05\x91\xc4\x07\xdf\xcb\x2a\x1a\x3d\xb5\x5a\x75\x7f\x9c\xeb\x25\x78\xb7\x41\x14\x62\x26\x44\x33\x22\xdb\x19\x6e\xd3\x45\x5c\x9b\x80\x4a\x8e\x5c\x65\x7b\x0b\x77\x23\xef\xd9\xcf\xaf\xae\x70\x1f\x8f\x90\x56\xd4\x7f\x7a\xe9\x90\x5d\x72\x66\xa1\x4e\x3e\x8d\xab\xae\x13\x2e\xad\xae\x30\xf1\x4c\x29\x27\x14\x84\xa2\x53\xd0\xca\x52\x0c\xb0\xda\xa2\xb7\x3b\xbb\xb8\xa9\xab\xfb\x2b\x49\xd4\x82\x9c\x08\x65\x45\x6a\xea\x33\xef\xbc\xc2\x5f\x05\xb5\x6a\x83\x55\x37\x2e\x9b\x37\xe8\xea\xde\xd1\x93\x40\xe3\x09\x34\xd7\x99\x10\x73\x4b\x57\xd2\x7e\x1d\xce\x08\x5c\xe5\xe3\x0b\x3d\xe9\xe1\x80\xb8\x03\x85\x5f\x77\xef\x76\x4a\x1b\x85\xd9\xa9\xfd\xed\x9c\x4d\x0d\xe0\xa0\xf6\xb7\x31\xc1\xb1\x9a\x94\x41\xd3\xe9\x80\x83\x3b\xcc\x05\x56\xf9\x3f\xff\xd7\xff\x7e\x7a\xc6\xc3\x3e\xeb\xdb\x2d\xfd\x52\x4e\x9e\xe1\x65\x19\xa4\x82\xfc\xed\xbf\x91\x44\x76\xa3\xbe\x2f\xbf\xc8\xaf\xcc\xbe\x41\x0a\x28\xbf\x53\xe5\x3f\x7e\x64\xfa\xc5\x14\x21\xd3\x30\x0a\x4c\x0a\x32\x16\x87\x15\x6d\x48\x14\xf6\x87\xd9\x5f\x0e\xd5\xf2\xc3\x5c\x74\x38\xdf\xe5\xff\xce\x5f\x39\xae\xe6\xeb\x79\xce\x47\x43\xa0\xf3\x40\xce\xc1\x61\xe1\x7d\xdd\x71\x08\xea\x6d\x98\x78\x2e\x14\x29\x7f\x72\x6b\x94\xd9\x00\xf9\xbe\x5f\xb6\x3f\xb0\xb7\x17\x23\x84\xb5\x76\x41\x29\xb8\x3b\xc9\x89\x42\xf0\x43\x0d\x58\xd9\x51\x1d\x68\x9e\xba\x2b\x57\x69\x27\xd9\x30\x64\x39\x3f\xe4\x1d\xdf\x6a\xa3\x21\xab\x48\x94\xa9\x6f\xe9\x19\x5f\x45\x0c\x87\x97\x1e\x5a\x7d\x5b\x42\xe8\xa3\x3f\x19\x9d\x89\xec\xc3\xa8\x66\x6d\xbe\x4e\xde\x17\xb0\xff\x22\xdd\x8c\xda\x6c\x15\x2f\xd6\x5a\x11\xa4\xbd\x1f\xf5\x67\x46\xe9\xfc\x7d\x45\x7f\x46\x51\x1d\x38\x06\xc4\x38\xf6\xc3\xb6\x58\x94\x48\x7e\x8d\x1f\x84\xfc\x74\x2c\xf7\xb4\x22\x72\x48\xd9\x47\xb6\x84\x5f\x9e\x20\x22\x7e\x65\x7a\xed\x48\x0c\xe1\xf2\x33\x83\x29\xaf\x2d\xd8\x1c\xfd\xae\xb8\x91\x4f\x9a\x2e\x8d\x05\xf2\x52\x7e\x49\x32\x6e\x5c\x08\x28\x2e\x5c\x04\x78\x30\xf4\xba\x1b\x2e\xec\xb7\x64\xb1\x87\xec\x96\xb9\x3c\x5b\x06\x33\x19\x51\x46\x2e\x19\xc2\xa3\xf2\xf5\x92\x3a\xcb\xca\x15\x2f\xd1\x0c\xe1\x3f\xc4\x08\xc9\x7a\x00\x30\x3b\x9a\x25\xa6\xa9\x79\x30\x51\xc2\x83\xd2\x03\xf0\x1f\xcb\xfe\x89\x7e\x27\x99\xfb\xb6\xc4\x30\xc4\xd6\xd1\xc9\x5e\xc4\x75\x3a\x61\x71\x3b\x03\x14\x5a\x30\x47\x65\xec\xb3\xcb\x34\x7e\x2e\x1c\x10\x2c\x85\xa0\x5b\x5c\x3b\x65\x3e\xc5\x01\x80\xcc\xa4\x13\xd8\x33\xbe\x27\xbd\xcd\x80\x81\xb1\xeb\xc4\x7c\x51\xce\xa9\x81\x22\x32\x49\x7f\x36\xa7\x8a\x05\x9c\x61\x0b\x43\x23\x9a\x29\xe8\x70\x1b\x58\x5b\x59\x6c\xc9\x6d\x1c\x76\x8d\xde\x57\x0e\x1a\x27\x51\x34\x30\x0e\x5f\x33\x88\xc2\x90\xdd\xd3\x88\x1b\x0c\x6b\x9e\x47\xbe\x3e\x93\xa8\xdd\xa8\xbc\x40\x3f\x1a\x17\x2b\x51\xe6\xb8\xb7\xad\x7a\x21\xdf\x01\x68\x58\xe4\x52\x77\x54\xb1\x7c\xd1\xe8\xc4\xac\x8f\x2e\x45\x9a\x0b\x9f\xd3\x54\x65\x3a\xad\x42\x34\x44\x63\xee\x03\xf7\x21\x0c\xdd\xd4\x51\xac\x45\x63\x7c\x99\xc9\xb5\x17\x84\x4b\xe8\x7c\x98\x77\x8b\x87\xd5\x89\x5c\xf2\x06\x7b\xc1\x1a\x16\x22\x46\x7b\x90\xf9\x67\x33\x86\x35\x9d\x86\x2f\xb0\x6e\x64\x64\x44\x7b\xca\x75\x25\xb1\x54\x20\x62\xf1\xbc\x97\xdb\x95\xab\x84\x89\x13\xf1\x14\x88\xa8\x21\xfd\xc1\x41\xd2\xb4\x0e\x5f\x97\xe5\x76\x0e\x4f\x15\xca\x90\xcf\x90\x09\x02\xe0\x90\x5e\x7d\x76\x07\x38\xcf\x6a\xd5\x9e\x38\x7b\x55\xa1\xd3\x34\x3e\xfb\xd6\x86\xfd\xfd\x23\x07\x15\x01\x1e\xc5\x6d\xb9\x92\xcb\x03\x6a\x7e\xf6\x79\x43\x3f\x0e\x9f\xa7\x5d\x53\xdf\xe2\x10\x55\x6a\x85\x5b\x1d\x76\xbf\x9f\x68\x7f\xcf\x77\xda\x69\xba\xe3\x91\xe5\xd6\x46\x2b\x91\xa9\xdd\xde\x12\xd5\x11\x2c\x0d\x3b\x4a\xc7\x6b\x00\x36\xed\xaa\x38\x31\x3e\x4e\xc0\x9f\xf2\x70\x1f\xe0\x22\x47\x50\xa4\x20\x23\x36\x17\x4f\xba\xd8\x82\x9d\x71\xa6\x8c\xa9\x83\xcf\x75\xac\xe7\x1a\x17\xfe\xe1\x23\x88\xfe\x20\x52\x82\x84\x4c\xc9\x99\xd8\xdb\x9d\x96\x99\xa7\x83\xe6\x32\x05\x47\x11\x3d\xbb\x53\x7f\x6e\x3f\x13\x03\x67\x86\x21\xf2\x2a\x59\x5b\x94\xe1\x70\x7c\xa1\x59\x13\x71\x57\xa4\xac\x9d\x6d\xc2\xff\xc8\xd9\x1c\x8f\x30\xd9\x6c\x89\xf5\xa3\x0b\xf1\x79\xbc\x14\x6d\xb8\x60\xe8\xcf\x07\x74\x11\xa8\x63\xcd\x57\x71\x84\xaf\x17\xa6\x60\x5f\xa8\x6d\x5d\x2e\x47\x16\x72\x70\x0c\x18\xc4\xbb\x1a\x0a\x43\x46\x3b\xb1\x48\x8c\x7a\x93\x48\x25\x9e\xc1\xf8\xec\xfa\xe7\x4a\x2a\xe9\x84\x98\x8b\xcc\x19\xa7\x27\xc4\xd6\x41\x0b\xb7\xca\x51\x1b\x6d\x1d\x08\xa9\x41\x1c\x3c\xd6\x90\x7a\x04\xcc\x6f\x36\xae\x59\xa3\x77\x23\x23\x96\x42\xe7\x1d\xc9\xa1\x65\x0c\xcc\xc3\x17\x96\xa4\xe4\xec\x6e\xed\x4b\xbc\x02\x03\xe3\x9b\xea\x8d\x6f\x58\xba\x06\xdd\x4e\x1a\x21\x9c\x36\x9c\x17\x5a\x65\xc8\xcd\x3a\xe6\x88\xfb\x54\x09\x7b\x51\x0a\xc9\xef\x37\x8e\xbc\xa7\x23\x1d\xe1\xd9\xa9\x4c\x23\x74\x11\x71\xc9\x3e\x1f\xe3\x68\x6d\xb4\x21\xa6\x0b\xcc\x67\xc8\xea\xd0\x6a\x88\x8c\xe3\x8f\x19\xce\x8e\xfd\x41\xe8\x90\x66\xae\x1e\x2d\x8a\xab\x2f\x44\x16\x09\x6a\xe0\x67\x6a\xe2\x8c\x8b\x8d\xae\x8a\xab\x3b\x8b\x27\x8e\xba\x76\x87\x05\x21\x97\x12\x38\xf9\x50\x51\x27\x6e\x61\xf5\x9b\x45\xbb\x81\xd5\xe9\x06\x0d\x07\xae\xa7\x33\xeb\xfa\x91\x56\x7d\x1d\x5c\xa7\x34\xff\xcb\x44\x05\x99\x71\x8c\xb3\x31\xe7\x68\x39\x83\x7b\xae\xba\xd4\x31\xff\x5a\xec\x48\x2f\xd8\x8a\x64\x69\x05\xc4\xf0\xdc\xae\xb0\x84\xf4\x5d\xb8\x5f\xa2\x37\x4d\x42\x8e\x9e\x24\xcf\xa1\x61\xd2\x34\xbb\xde\xfc\x96\xff\x86\x54\xa2\x8f\xaa\x64\xa4\xbf\xe1\xfa\xaf\x04\xe1\x63\x22\x09\x46\xda\x25\xcf\x86\xcc\xb3\xcb\xe2\x3d\xcc\x89\x22\x1b\x21\xdf\x67\x2f\x89\x61\x6e\xe7\xa1\xfc\x19\x7f\xe6\xdb\x51\x2d\x81\x1b\xf7\xcc\xf8\xa0\x19\x0f\x43\x4d\x4d\x82\x49\x73\x1e\x52\x5a\xdc\x4d\x01\x73\x90\x8e\x04\xf6\x2d\x47\xed\x70\xb2\x40\x52\x31\xab\xbb\x07\x35\x43\x03\x3e\x0d\x4f\x27\x23\x47\xa0\x80\x0d\x40\x7f\x8e\xfb\xe9\x80\xa4\x9b\xc5\x04\x28\x9b\x62\x23\x1c\x0d\x7c\x08\xa4\x1b\x29\x1c\xa6\xc3\xd5\x8b\xeb\x43\x4b\x3b\x5c\x20\xc9\x9c\xef\xb7\xc4\x24\x85\xcb\xf0\x00\x0a\x67\x64\xd2\x4c\xa8\x4c\x1b\x4b\xea\x93\xba\x82\x86\x76\x66\x56\x90\xd7\xbc\x6b\x0a\xe6\xc9\x56\xe5\x35\x7c\x8c\xf9\x32\x1c\xf1\x6c\x29\x22\x0c\x8b\xb3\xdf\x8f\x27\x3a\xf5\x7f\xfe\xcf\xff\xd3\x43\x99\xa9\xf8\x74\x5b\xf6\xd1\xd9\x2b\xb9\xe8\xf9\x20\x8c\xf5\x81\x5d\xfa\x2c\x16\x4d\x12\x9e\x43\xbc\xc2\x25\x2c\xdb\xb0\x6b\x7a\x41\xf4\x48\xbf\x26\xd4\xcb\x98\x14\x2a\x79\xac\xc8\xa1\x53\x9f\x4d\xa1\xb7\xf7\xc2\x1b\x0d\xf5\x42\x5b\x24\x64\xa0\x42\x52\x47\x08\xb4\x19\xe8\xa8\x44\x64\x90\x6a\x81\xe1\x7d\xb1\xa0\xd2\x0f\x57\x40\xef\xb0\x9a\x8c\xbc\x31\x4b\x70\xd9\x32\x55\x3c\xb7\xa5\x4e\xd6\xd8\xe7\xf1\x01\x2e\x7a\x6e\xc1\xcc\xa0\xf3\xde\x4e\x94\xb8\x73\x8b\x0f\x61\x8e\xd6\x3c\xda\xc8\x5a\xf2\x8e\xfd\x16\x21\x38\x2a\xe0\xf1\xaa\x8f\x94\x53\xcd\x27\xf4\x9d\xe3\x9c\x19\xc7\xbd\x08\x1a\x08\x0e\xe0\x26\x1f\x93\xa0\x9d\x46\x2a\xa5\x85\x65\xee\x22\x74\x75\xa5\x86\xf2\xa9\x42\x82\xad\x2b\x76\xa8\x95\x32\xb2\xf1\x10\x02\xe9\x48\x91\x1d\x2b\xcb\x61\x34\xd2\x22\xe7\x21\x61\xa2\x48\xa7\x01\xd9\x38\x22\xda\x38\x67\x06\x7c\xec\xf5\xb0\xe8\x26\x41\x98\x6c\x00\xe4\x2d\x7e\x4c\x81\x88\xfb\x48\x90\x76\xde\xe9\x35\x73\x73\x60\x9d\x6c\x98\xef\x6e\x84\x12\xaf\x71\x93\xa3\xfd\x8c\x72\x7c\xb7\x8f\x0f\x3a\xf1\x16\x3a\x6f\x70\xe1\x0e\x9f\x77\xb4\x13\x0b\x48\x43\xa3\x12\xbc\x93\xb0\x0a\x2c\x3e\xe2\x77\xfe\xf0\xd7\xaf\xdf\x77\xbc\x0c\xd1\x0d\xeb\xd7\xdf\xbf\x27\x3e\xf0\xe1\xaf\x7f\x78\x0f\xff\xab\x51\xe1\xf9\x35\x8b\xea\xe3\x1a\x50\xd0\xa0\xa1\x6c\x69\x0e\x41\xcb\x42\x3f\x23\xc1\xfe\x24\x4b\xf1\xa9\x4f\xb7\x78\x08\xe4\x36\xd8\xe1\xab\x90\x95\xee\xf0\xfa\xb0\x9b\xeb\x18\x3b\xa1\x00\xf6\x15\x8a\xdb\x0c\xcc\x0b\x6e\xf2\xb7\xf0\x1d\x87\xfb\x3b\x66\x7a\x1f\x62\xa4\xbf\x59\x31\x73\x98\x16\x68\x17\x3a\xed\x54\x1d\xe8\x82\x27\x9d\xd9\xae\x57\x4e\x19\xa2\xc5\x7e\x08\xdd\x6c\x9c\xe3\x97\x9c\x03\x30\x60\x04\xde\x9d\x4f\x80\x94\xa4\xe1\xc3\xc6\x9b\x66\x59\xa7\x02\x88\x2e\x3a\xee\x43\x7a\xf0\xb6\xc4\xac\x1a\xdc\x3b\x7c\x0e\x32\xef\xaa\xac\x4d\x0a\xe8\xc1\x19\x51\x4c\x41\x07\x0b\xa5\xd3\x2c\x4c\x05\xcd\x71\xb5\x62\x84\x22\x04\x79\x10\xa6\x1b\x5f\xdf\x03\x59\x92\x49\x97\xf6\x42\x1d\xf6\xf9\x85\xb5\xa8\x3a\x80\xa0\x42\x3d\x6a\x22\x5c\xc9\xea\xc8\x50\xf5\x2e\x9d\x8a\x2b\x5f\xd6\xc4\xbe\xd1\xc0\xd2\x17\xf8\x11\x5b\xb6\x10\x37\xe0\x78\xcf\xdc\x67\x40\xf3\xc4\x9f\x41\x13\x2d\xfc\x97\xdd\x8a\x56\x39\x3f\x71\x8b\xd4\xa0\x2f\x26\x91\xf1\x6d\x27\xc3\xb5\x9a\x23\x3c\xe9\xd5\x3d\xad\x51\x15\x7e\xac\x76\x0c\x9d\x1b\xe8\x06\xac\x6d\x96\xe8\x88\x6c\xd2\x9f\xc1\x21\x6e\x4c\x4f\x60\xa2\xd2\x7c\x1a\x6c\x13\x99\x2c\x7c\x0d\x01\xc4\xc7\xe4\xe1\x6a\x92\x3f\x8a\xa8\xa9\x3b\x17\xb1\xe6\xd2\x53\x47\x20\x27\x06\x23\x19\x03\xcd\x52\x9a\x19\x62\x04\x48\x07\x11\x29\xc0\x62\x17\x8e\x6b\xd1\xcb\x30\x00\x0d\x4e\x2e\x93\x60\xd3\xde\xdf\xc2\x63\x78\xff\xa5\x0a\x72\x69\xf4\xf8\x66\xff\x5d\xe7\xd2\xa4\x75\x1f\xf7\x60\x9a\x6e\x3c\xea\x3a\xa5\xaf\xf7\xe8\x39\x1d\x99\xdc\x17\x6d\x5f\x2d\xab\x7d\x11\x48\xe5\x85\x4b\x31\xc8\xa2\xef\x8b\xe5\x86\xb7\xb5\x67\xba\x7e\x13\x95\x80\x6a\x02\x18\x1f\x31\x1c\x58\x74\x08\xe2\xb7\x89\xd2\x21\x66\x99\x2f\x1d\x12\xb9\x8a\xdf\x32\x31\x71\x38\x81\xcd\x9b\x3a\x34\x93\x3d\x74\x88\x67\x4e\xb5\x97\x9c\x12\xd4\x97\x93\x70\xb6\x4a\x06\xdc\xdf\x34\x79\x30\xc0\x20\xe2\x3a\x9f\x60\xa9\xde\x0d\x0a\xba\xa0\x95\x48\xab\x45\x88\xb4\xef\x70\xc1\x6b\xd8\xa0\xb6\xf0\x5d\xae\xbf\x34\x3f\xb1\x0d\xe5\x03\x9b\x90\x8d\xbc\x61\x93\xf9\x61\x8b\x15\x81\x77\xaa\x7c\x5c\x8b\x5f\xa5\x01\x21\xec\x35\x73\x5b\xb1\x2d\x77\x88\x48\x50\x6c\xf5\x95\xe7\xdc\x45\xb9\x2c\x98\x51\x47\x9f\x79\xac\x1b\x0e\xc3\x1d\x47\xcf\x8a\xa8\x8f\x7c\x5b\x5c\xea\xe7\xeb\xa8\x3e\xde\x38\xaf\x58\xa8\xde\x14\x2d\x83\x99\x5a\x94\xfd\x0d\xae\x9d\xc3\x79\x9d\x27\x57\xd4\x49\xdd\x37\x9e\x8b\x20\xea\xf9\x0c\x6d\x3c\x63\x56\x62\xa5\x94\xf4\x77\xf8\x10\x7a\xaa\x53\x39\x90\xfc\x26\xd0\x00\xd4\xc8\x16\xf5\x06\x38\xcc\x16\x83\x92\x4d\x48\xdc\xd0\xca\x94\x11\x42\xd7\xbf\x65\x0b\x9e\x11\x6e\xfc\x26\x84\x65\xe7\x74\x4d\xff\x43\x48\xd7\xfa\x51\x93\x72\x19\xd6\x8c\xa4\xfd\x73\xd5\x53\xe9\x7f\x79\x6f\x38\x4a\x5b\x65\xee\xc9\x35\xf0\x33\x7e\x26\x50\x43\x1d\x4c\xcc\x0b\x0a\x21\xfc\x55\x3d\x9c\xe6\xeb\xa1\x4e\xa8\x22\x53\x13\x5c\x52\x24\x43\x7d\x2f\xfd\x4a\x52\xaf\x49\x08\x64\x32\xa5\xb3\x19\x5c\x10\x67\xc9\xd4\x80\xfd\x6e\x63\x4b\x8c\x35\x21\xe7\x6a\x54\x6d\xa0\x4b\x0a\x93\x92\x25\xa9\x82\x83\x77\xd3\xfe\x30\xc7\x53\xfa\x0a\x2e\x66\xd3\x75\x29\xec\xea\x10\xef\x5a\xf3\x2c\x52\x21\x18\xb4\x1c\xb5\xb5\xbe\x57\xdd\x1c\xd7\x4d\x44\x5d\x7a\xa5\x77\x48\x88\x1c\xf5\x79\x48\xa7\xe6\xe4\xb2\xb3\x84\x93\x5d\x4b\x70\xde\x10\xc1\xfe\x9a\xbe\x37\x08\x9d\xc9\x00\xd7\x25\x07\xbd\x03\x87\x19\x48\x44\x51\xcf\xe1\x51\x85\xa1\x26\x7e\x19\xc9\x30\xd4\x49\x43\x27\x64\x10\x10\x33\x54\x05\x1f\x98\xcf\xab\x4d\x7c\x7b\xa7\xea\x0b\x24\xa0\x0f\x8a\x4e\x1b\x77\x77\xbc\xad\x61\x24\x7a\xc1\x87\x5d\x51\x8b\xaf\x64\xc5\x61\x02\x58\xb1\x22\x71\x91\x70\x73\xa3\xdf\x4c\xd4\x2c\xb5\x0d\x48\x0a\x90\x67\x6a\x67\x03\x61\x0f\xb5\x6e\x40\x94\x0a\xca\xdf\xdf\x54\x29\xf2\xa8\x0f\x48\xaa\x88\x1c\x1d\x65\xd3\xa1\x7a\x92\x55\x0b\x4b\x91\x4c\xdb\xe3\xdf\x3d\x5c\x3d\x91\x4d\x8c\x1b\x1c\x23\x77\x37\x4e\x94\x81\xfb\xc3\x9b\xa9\x68\xd5\x21\x8a\x18\xa3\x0c\x1f\x14\x0c\xc4\xba\xf4\xdf\x32\x67\x83\x77\x67\x59\xd4\x0d\xb8\xec\x09\x45\x86\xcb\x9d\x56\x66\x0c\x01\x56\x51\x67\xf7\xb0\x4b\xda\x6e\xe6\xb4\x35\xe6\x2a\x69\xd2\x71\xc2\x1b\x85\xbf\x86\x3d\x30\x09\x6b\x58\x73\x10\x37\xd2\x01\xb1\xde\x9a\x8f\x10\x89\x8f\x25\x24\xda\xb9\x1d\xb0\x6a\x5f\x2e\x6e\xab\xe9\x54\x99\x81\xa4\xfa\x01\x85\x9f\x9c\x1c\xe3\x38\x11\x4f\xc9\x67\x4c\x78\x5f\xfa\xdc\x38\xe6\xe7\x34\x60\xd6\x1b\xe7\x8f\xcd\x76\xf8\x24\x1d\x64\x29\xb7\x68\xf9\xaf\xcf\x08\x91\x51\xb5\xaa\xb9\xac\xbc\xd6\x88\xca\x35\x25\x46\xea\x3c\x09\x46\xfa\x47\xb7\xf4\xef\xe9\x6e\xf7\x74\xb5\x7a\x34\x31\x6a\xc7\xb3\x85\x61\x0f\x8c\xd4\xaa\x1c\x19\x50\x49\x57\x93\x63\x81\xa7\xe7\x0e\x1e\x07\x7e\x9d\x7e\x81\x3e\x90\xce\x69\x66\x3a\x9c\xdd\x54\x70\x37\xae\x5e\xc7\xf4\xbf\xd9\xb3\x89\xc5\x6e\x0b\xf0\x86\x96\x8b\x50\x7e\x2c\x03\xf1\xc1\x65\x0d\xa2\x71\xdd\xd9\xc1\xe0\x1d\xa5\xec\x1c\xd1\xee\xdd\x91\x49\x91\x17\x02\x8e\x4e\x89\x63\xdb\xe3\xb4\x06\xd6\x7d\x02\x70\x9a\x71\x8f\xad\xff\x57\x32\xef\x53\xcd\x4f\xa1\xc1\x3d\xec\x7b\x76\x53\x7d\xa8\xa8\xc0\x9f\xe8\x0f\x7e\xcf\x34\x7e\x5a\x1e\xe3\xa5\x51\xbb\x9c\xfd\x55\x92\x6f\x63\xe5\x1c\xf8\xdb\xb0\x4d\x95\x75\xe3\xb9\x84\xe5\x97\xdb\x21\x87\x2d\xbb\x4c\x7d\x90\xd3\xb4\x59\x1e\x20\xd7\xdf\xea\x75\xfe\xff\xc0\xdd\xfa\x86\x98\xba\x8d\xc6\x73\x07\xcb\x5c\xf5\x8a\x54\x33\x69\x50\x71\x1c\x81\x3e\xe6\xfa\x74\x92\x6e\x72\xf1\x64\xa0\x74\x9c\x9e\x02\xee\x1f\x57\x42\x82\xb2\xc9\x9a\xae\x4c\x72\x84\x97\xdb\xd9\xbe\xd6\x37\x1a\x3d\x5b\xf2\xcd\xc5\x38\x75\x24\xe0\x91\x8b\x73\x09\xf3\xc7\x7c\xff\x85\xef\x2a\x62\xbd\x55\x13\x17\x09\x84\x8e\x03\xc1\x86\xb5\x25\x16\x86\x5d\x1b\x70\xca\xd5\x06\x54\x97\xff\xb0\x83\x2d\xd5\x34\x0a\x28\x47\xc4\x18\xe0\xc0\x74\x4e\x99\xab\xc6\x5e\x45\xd7\x64\x3c\x31\x6f\x38\x1e\xb9\x14\x92\x80\xa8\xe3\xc4\x34\x14\x5f\x93\x5e\x96\xf3\xaf\x8d\x4b\xf0\x17\x47\xc4\x94\x4e\x7d\x13\xc6\x94\xa5\x2e\xe5\x4b\x43\x60\x4c\xde\xef\x65\xdb\x23\x0a\x66\x58\xa1\xb1\x19\x16\x88\x84\xaa\x06\xb7\x1f\x53\x4b\xac\xab\xa3\xd3\x65\xee\xdc\x24\xda\x3d\x7f\xbb\xa5\xa7\x9f\x1c\xbb\x77\xea\x61\x25\x4b\x9b\xc9\x62\x21\x44\xc8\xde\x42\xee\x6a\x96\x0b\x36\xac\x0c\xb5\xfb\x3e\x02\x36\x93\xeb\x13\x1a\x36\xef\x18\x90\xd8\xaa\x15\x93\x8e\x01\xe1\x85\x23\xf1\xc0\x3f\x06\x42\xa2\x9c\x9a\x64\xd8\x41\x53\x7f\x47\xe0\x4d\xd3\x7c\x90\x50\xd3\x0b\xfc\x8c\x39\x6b\x7e\x63\x46\x32\xf9\x35\x95\x97\x69\x2e\x49\x77\xd5\xd2\x3f\x2d\xf5\x23\x27\x4c\x4c\x9e\xba\xc7\x3a\x48\xf5\x65\x1f\x83\xb2\xe7\x79\x7c\x90\x8b\x3d\xcf\x89\x8d\xb8\x19\x57\xc5\x60\x1c\x84\x5d\xb9\xe5\x58\x25\xe7\x84\xc0\xda\xf7\x73\xd3\xb2\x2f\x0b\x0d\xcb\x3a\x73\x1d\x91\xa9\x7f\x6b\xb1\xce\x2f\x93\x25\x50\x8b\xbc\x1b\x91\xba\x1d\x8d\x47\xa4\xf1\x10\x98\xcd\xfb\xbc\x68\x22\x53\x51\x44\x86\xae\x19\xa1\xf6\x62\xf5\x91\x4f\xc3\x55\xf2\x64\x98\xa6\x4d\x74\x86\x37\x42\xb8\x73\x28\xef\x03\x80\xc0\x77\xb7\x5d\x5f\xee\xdc\xf8\x58\xff\xcb\x17\x12\xf8\x71\x13\x3d\x02\xf8\x3c\xe7\x78\xee\x04\x81\x42\x29\x34\x7b\x48\x0d\xa1\x2d\x6d\x00\x9e\x80\xea\xb3\x2f\x3f\x19\x28\xb6\x39\x07\xa4\x3c\x0e\x6e\x03\xf8\x63\xf2\xf2\xc0\x82\x67\x48\xfc\x19\xc4\x0c\xc4\xae\xe7\x78\x18\x8a\x26\xef\x36\x35\x6a\x12\x83\xeb\xe6\x50\xce\xd2\xc1\xb4\x88\x8a\x16\x97\x3c\xca\xf6\xc8\xc4\x00\x66\xae\x30\x83\x19\xda\xf2\x5d\xc8\x9b\x12\x37\x22\xef\xa8\x2b\x0c\x6e\xaa\xae\x30\x7f\x47\x2a\xd0\x04\xcc\x49\xe0\x17\xc3\x4c\xc2\x7a\x9d\x5f\x69\x8d\x3c\x1b\x2f\x00\x33\x2e\x2f\x6d\x77\xfd\xad\xf8\x42\x4d\x57\xf0\xa6\xd8\xe1\xba\x3b\x43\x7d\x73\x67\x1d\x33\x0b\x5d\x49\x47\x8b\xfc\xba\x1b\x1c\x21\x2f\x63\x99\x53\xf7\x79\xd7\x58\xfd\xbb\x11\x2c\xd9\xb2\x08\xe6\xad\xef\x72\xe2\xfc\x8d\x2f\xbe\xfc\x3d\xff\x1b\xef\x1e\xfa\x53\x11\xf9\xfb\xf4\x77\x53\x8d\x84\x57\x35\x78\x67\x9e\x8c\xae\xe9\x89\xcc\xc5\x93\x80\x62\x0e\x65\x20\x38\x0e\x30\xc6\x4b\x79\x9d\xdd\xfd\xa5\x9d\xae\xd1\x9d\x98\x35\x6b\x2b\x3a\x51\xd3\xd3\x63\x55\xc0\x6d\xeb\xaf\x62\xce\x7d\x8e\xaf\xfc\x7f\x30\xeb\x1a\x40\xf0\xd8\x20\x82\x0d\xb2\xca\xa3\x93\x6b\x2e\x1a\x34\x4d\x22\xf1\x88\x4e\xbf\x08\xb1\xd6\xbb\xf4\xfa\x40\x7a\x60\xc6\x80\xe9\x12\xca\xa7\xa8\x25\xaa\x89\x04\x70\x72\x47\x08\xeb\x85\xfa\xa0\x21\xea\xd9\x8b\xf4\x5d\xb9\x3e\x6c\x49\x82\x71\x37\x48\x86\x05\x86\xcb\x62\xf5\x28\xaf\x0b\x22\xcd\x93\xc3\x21\xc2\x51\x97\xa3\x6b\xe1\x2e\x89\x3a\x02\xb6\xfc\xaa\x87\x04\x44\x18\xb6\x22\x4c\x47\x07\xae\xe3\xa9\x46\x8f\x4b\xaf\xae\x26\x0d\xbb\xd9\xd0\x3e\x40\x5d\x36\xd5\x0b\xb1\x62\x85\x3e\xc8\x0d\xd6\x89\x1e\x44\x8b\x9c\xdd\x61\x55\x55\xda\xe0\xd8\x17\x68\xb9\x68\x3d\xb8\x55\x14\xc5\x2f\x81\xb2\x08\xdc\xd2\x25\xd8\xcb\xd3\x80\x44\x7e\x3b\x48\x90\x3b\xbe\x07\xa0\x3f\xdf\x5a\x98\xbc\x31\x58\xd0\xe2\xc4\xd8\x78\xe9\xa4\xf0\x5c\x28\x1e\x60\x43\xe8\x22\xa5\x71\x19\xf9\xc0\x0c\xef\x88\x69\x3c\x72\xf0\x31\xb8\xf8\xdd\x4d\x74\x6f\xb0\x4c\x8c\x13\xf2\xf4\x17\x10\x4f\xa4\x91\xea\xda\xe1\x30\x5c\x2d\x39\x62\xc0\xc7\x6a\x75\x20\x1a\xc4\x9d\xb9\xab\xde\xdf\xa7\xf5\xd2\x3c\xe2\x92\xd1\xd1\xba\x07\x03\xc2\x0e\x0f\xef\x49\xc2\x91\xe5\x3a\x46\xed\x9c\x1c\x11\x13\x9f\x60\x9a\xd2\x9d\x84\xe8\x9b\x79\x8c\xbf\xe7\x05\x37\x91\xca\x80\x1f\x12\x84\xc4\xb0\xf4\x9b\xd1\xb1\xac\xb6\xa4\x9f\x5a\xae\x13\x07\x21\xab\x24\x27\xc1\x6c\x41\xdf\x9a\x83\x65\x89\x42\x38\x7c\x59\xab\x19\x95\x51\x75\xa3\x97\xa0\xd9\x85\x7b\x92\xe9\x9e\xac\x7f\x62\x7f\x79\xbe\x9e\x27\xce\x1e\x88\x43\xf8\x33\x6e\x98\xc9\xe9\xc3\x31\xb7\x31\x92\x3e\xdf\x79\xd2\x64\x1d\x8e\x8e\x9d\x18\xca\x30\x14\x57\x24\x98\x03\x67\x6e\x74\x6d\x8a\x1e\x1d\x99\x28\x1b\x40\x12\x41\xf3\x1f\x99\xad\xe3\x13\x15\x09\xd1\xbd\x37\xe3\x8f\xd7\xf7\xfb\xa3\x84\xcd\xdd\x5f\xf7\x62\x16\xd3\x4a\x7d\x9f\xd4\x94\xd8\x7e\x88\x72\x25\x14\xcf\xa5\xb2\x27\x3a\x4d\xf9\x89\x6a\x11\x4e\x82\xcb\x82\x84\x12\x74\xa1\x0e\xbc\x3d\xb9\x3b\xde\x57\xdc\xf4\x90\x09\x38\xb5\x8b\xd8\xc6\x95\x41\x45\xc0\xe7\xe7\x9e\x3d\xe8\xd9\xae\x7f\x2d\x0a\x21\x41\x8b\x61\xa5\x47\x31\xe5\x1e\x45\xc5\x31\xd6\x7c\xba\x32\x13\xe7\xee\x89\xff\x36\xde\xfd\x66\x3d\xc7\xb3\xbf\xb0\xa0\x47\xd1\xa4\xf8\x00\x06\xce\xe8\x32\x42\x64\x18\xc1\x9d\xa8\x6a\xf2\x44\x88\xa1\x4e\x43\xd7\xac\x40\x7b\xbc\x7b\x69\x74\x85\x7c\x22\xaa\x82\x13\x18\xf8\xe1\x82\xc4\x4b\x80\x7d\x81\x79\x3c\x89\xb7\xc0\xd1\x02\x83\x30\x41\x49\x5d\x69\x98\xa0\x31\xbe\x0c\x1a\xb6\x58\x41\x63\xa9\xb5\x69\xbd\x51\xdc\x77\x6c\x62\x48\x93\xc5\x12\xbb\x85\x3c\x12\xc6\xf8\x18\xfd\xde\x37\xf2\x7c\x93\x97\xdd\xe3\x45\xa0\xe1\xf1\x38\xc0\xd9\x3b\x62\x0b\x59\xa7\x44\x8d\x77\x6c\xe6\xce\x26\x67\x4d\x83\x7f\x78\x29\x14\x6e\xce\xf2\x84\x55\xea\x59\xaa\x0e\xd0\x38\x1f\x67\xae\x04\x02\x7f\xc7\x5b\xcc\x6c\x88\x5b\x8c\x26\x3e\x89\x03\x9e\x5e\x64\xd6\xeb\x70\x12\xe7\x09\x8c\xa4\x2f\x3b\x4b\xa4\x17\x66\xe3\x11\x34\x5a\x5f\xbf\xd1\x67\xc5\x87\x81\x7c\x35\xf7\x66\xd3\x38\xb6\xea\xfe\x06\x18\xf1\x6e\x44\x25\xa1\x48\xaa\x0a\x8a\x81\xe6\x22\x68\x1a\x55\x7d\x01\x63\xd3\xee\x40\x93\x03\xcd\x22\xb4\x14\xfa\x56\xe9\xdb\xcb\x2b\x18\x9e\x69\xd1\x88\x65\x59\xf3\x09\x9f\xff\x89\x44\x44\x3c\x1e\xc7\x4f\x86\x2a\xf9\x5c\x2e\x39\xf8\x5b\x55\xeb\xd3\x5a\x37\xa5\x45\xe5\xa9\x57\x7a\xde\xf9\xd0\x80\x26\xa0\x8b\x01\x3a\xc7\x3b\x9e\x70\xd0\xda\x97\xcb\xea\x9a\xb8\xda\xd7\xb4\x56\xb5\xbc\x54\x65\x3e\x33\x77\x5e\x7f\x08\x23\xc1\x05\x58\xb6\x53\xfb\x43\x5a\x32\xfd\xfe\xd0\x93\x70\x34\x3d\x43\xd0\xa9\x30\x38\x36\xc3\x77\xe9\x9e\x71\x2a\xc8\xd9\x5f\xf1\x21\x93\xeb\x05\xcd\xcf\xd9\x07\xa3\x3e\xf8\xa7\xcd\xa4\xe9\xcf\xa5\xec\x5a\xd5\x0c\x6f\xe1\x85\xbe\x70\x50\xfa\x0e\x71\x61\xf0\x7d\x0f\xb8\x4d\xc1\xa5\xbc\x71\x03\x2f\x42\xbe\xf2\xab\x68\x11\x6a\xb5\x87\xf5\xc0\xb2\xd9\x1c\x75\x63\x7d\xca\x64\x1b\x71\x88\xe8\xda\xcd\x70\x9c\x82\xfb\x62\x40\x96\xe6\x48\x68\x3c\x94\x78\xb0\x75\x57\xdc\xca\xeb\x6d\x6c\xe7\xed\xe8\xf4\xac\x57\x9d\x5d\x8c\xe4\x27\x32\x36\xcd\x0d\xab\x90\xed\xbe\xce\x68\x49\xc6\x7d\x8b\x16\x50\x33\x7b\x4e\x80\x74\xfb\x46\x22\x80\xbc\xd3\x9f\x63\x20\x31\xec\xf0\xa8\x5e\xca\xaf\x31\xc8\x5e\x1f\x14\x09\x4f\x8b\x8c\x41\x16\xcd\x8a\xd7\xec\x47\xfa\x33\xd6\x33\x86\xf7\xd3\x4d\xd9\x88\xbd\xbc\xe7\x3b\x85\xe2\xa7\xcb\x19\x84\x9d\xe5\xf6\x5a\x42\x7f\xb3\x80\x59\xda\x1d\x5b\x70\x2c\xfa\x82\x21\xc7\x7c\x41\x05\x3a\x4f\x08\x5a\x06\x67\x74\xef\x6f\xa0\xaf\xa4\xfa\x78\x9e\xc3\x3e\xc9\x0d\x5c\xed\xd7\x2b\x11\x0e\xb0\x9a\x50\x30\xca\x83\x56\x27\x2c\x5c\xef\xdd\x45\x28\x53\x48\xed\xe5\x31\x29\x8e\xa4\x4a\x34\x00\xe1\xf4\x0d\x44\xa4\x2b\xb9\x04\xe7\xc2\xd9\x44\x9e\x9a\x43\x29\xf2\x84\x8d\x7b\xa4\xe1\x87\x78\x82\x24\xf0\xd0\x08\x22\xba\x7a\x02\xc8\x02\xfd\x0d\x79\x24\x05\x8f\xda\xcb\x97\x09\xf9\x70\x04\x38\x79\xd8\x1e\x1d\xd5\x47\xa2\x44\xc9\xc2\x84\xd5\x74\x2a\xce\xad\x83\xe7\x8a\xf5\x4e\x8e\x18\xf2\x4b\xb4\x7c\xe3\x11\x2a\x09\x12\x74\x8b\x76\x65\x57\x7d\x95\x30\xf3\x25\x2f\x10\x60\x1f\x7f\xb6\xd8\x76\x8d\x55\x21\xf7\xc0\x3e\xf0\x4d\x1f\x5a\x6f\xc8\x0e\xaa\xfc\x62\x31\x2e\xda\x93\x98\x16\x1f\xf6\x4c\x9e\x85\xd6\x5b\x3b\x18\xf2\xe3\x7f\xbd\x7c\xfb\xe6\x24\xff\xf4\xf4\xe6\xe6\xe6\x29\x17\x7f\x7a\x68\xb7\x1c\xda\x71\xc5\x8f\x18\xfc\xf7\xf3\xd7\x27\x79\xd9\x2f\x9f\xcc\xf2\x73\xa1\xda\x91\x18\xaa\x13\x05\x1c\xa4\xe0\x91\x40\x04\xe2\x1f\xa7\xe6\xba\x63\x54\x0b\xea\x1f\xe4\xf1\xcc\x1d\xaf\x9e\xb9\xcf\xdb\x5b\x36\x70\xa3\x77\x8c\xc2\xb2\x2d\xe1\x7d\x8e\x1f\x2e\x83\xb8\x86\x0f\x53\xe1\xae\x87\x20\x15\xb5\xa3\xdd\x78\xb5\xd4\xc7\xb7\x07\x20\xe6\x70\x79\x06\x57\xcb\xa8\xa0\xe5\x85\x0b\xa7\x30\x6b\x5c\x89\x4a\xb1\x65\x2f\x39\x60\x16\xa5\x2d\x44\xb9\xfa\x61\x58\x18\x51\x17\xf0\x76\xec\x77\xf9\xbf\xe2\x1a\xf3\xc6\x4c\x46\x9c\x65\xb8\x05\xe0\xd9\xb0\x30\xde\xfd\x72\xd2\x0f\x0d\x40\x5e\x33\x33\xe9\x2b\xe6\x05\x09\x6c\x54\x89\x2a\xc3\xd8\x6d\x9d\x5f\x1a\x32\xe5\x18\x70\x4d\xaa\x1b\x17\x49\x5d\x0a\xa6\xb3\x6d\x5e\xe4\xb6\xea\x89\x86\x62\x30\x7b\xfb\x78\x1e\x12\x97\x95\xc4\x59\xe5\x0e\xd0\x10\xfd\xc7\x3b\x9a\x88\xeb\xf2\x89\x38\x64\xaf\x4e\x72\x73\x66\x3e\x51\xc3\xe1\x89\xdd\x7f\xa2\x5f\x87\x3a\xfe\x16\x47\x52\x15\x88\xec\x13\x8e\x0b\xfc\xa9\x26\x96\x0d\xcd\x62\xf5\xd7\x89\x49\xc1\x61\x2a\x41\x33\x26\x17\xd9\x51\x78\x80\xaa\x12\x6e\x2c\xbe\x0b\x69\xcd\xf5\x79\xc0\x72\x98\xe1\x9e\x69\x2f\x7b\xc4\x7f\x9e\xa2\x26\xa2\xad\x0a\x78\x17\xf7\xbf\x51\x68\x3d\x3f\x85\x15\x95\xd8\x79\x09\xfd\x03\xf1\x4b\x25\x9e\xe9\xe3\x7c\x36\xa2\xae\x91\x77\x55\xea\x3a\xe2\xcf\x14\x70\xd0\xc6\x88\x2d\xd2\xa5\x18\x8b\x53\xb1\x85\x63\x1c\xa0\x5c\xf3\x30\xce\xc4\xde\xa0\x40\x00\xd2\xe7\x21\x2d\xe5\xa7\x8d\xce\xe0\xe4\x48\x89\x0c\x6e\x90\x82\x12\xf8\x33\x81\x39\xf3\xd4\x51\x9c\x41\xe0\x26\xce\x96\x12\x8b\x97\x33\x8a\x19\xec\x79\x15\xa9\xd5\x22\x40\x4a\xa4\xca\x41\xe6\xaa\xd9\x15\x30\x99\x3e\xc7\x8f\x11\x6d\x22\xe6\xbc\x16\xf7\x10\xf9\xe5\x67\x6b\xbf\x6d\x6e\x2d\xac\xf2\x73\x7c\xe9\x53\x11\x7e\x64\x11\x4c\x07\x15\x21\xa7\xea\x8a\xcc\x34\xa0\x50\x3b\x64\x4a\x56\xc2\x3f\x95\xf7\xc1\xb1\xa4\xac\xd5\xa6\x3a\x2d\x9e\x11\xde\x61\x80\x75\x21\x8d\x41\x29\x2f\x4f\x6b\x74\x62\x37\x35\x88\x98\xe3\x07\xf0\x67\xf7\xaa\xa3\x4a\x51\x35\x2b\x82\x42\x37\xbc\xde\x22\x71\x68\x9a\x1a\xc5\x38\x1c\x70\x80\x1a\x86\x2d\x8e\x23\x3d\x1a\xb6\xd8\x17\xf5\xb1\x8b\x5d\x51\x9c\xfc\x61\x12\x26\x2d\xf8\xc9\xb2\x8c\x23\x13\xc7\xa1\x7e\x46\x70\xe2\xe9\x95\x1b\x8a\x4e\xf7\x2e\xf5\x5d\x0e\x3c\x2b\x3f\xb8\xcf\x08\x53\x3c\xbc\x28\xfe\x19\x52\xd4\x54\x5f\xe2\xa4\xb8\xd9\xbd\xcf\x9d\x67\x55\x5d\x5f\xcf\x16\x2d\x09\x11\x1c\x0b\x18\xaf\xea\xf3\xd9\xc4\xdf\xf9\x25\xbe\x05\x44\xc3\x1f\x7c\xa7\x71\x10\x24\x51\x6f\xaa\x7c\xa7\xae\xc8\x92\x08\x1f\xda\xe1\x2b\xe3\xcf\x29\x47\xfc\x69\xdf\x34\x78\xd4\x41\x72\x66\x52\x04\x4f\x39\xf3\x2f\x44\x31\x0e\x4f\x39\xa3\xd0\x25\xa7\x38\xb0\x6e\xbf\x25\xfe\x5b\x9f\xb4\xbf\xe4\x0f\x04\xff\x71\x10\x87\x9a\x24\xf1\x72\x65\x30\xbf\xc8\xa7\x87\xe2\x2a\xc3\x95\x16\x53\xc1\xf2\x4d\x2d\x8d\x20\x00\xe1\x21\x2a\x67\x81\xa1\x06\x47\x60\x84\x56\x15\xa4\x83\x08\xe2\xa3\x9e\x3e\x5c\x05\xc5\x50\x84\xd0\x89\x06\xc1\xfa\xf1\xd5\x1b\xf9\x44\xe4\x1f\xbd\x83\x8a\x08\x46\xec\x40\x2d\x59\xfa\xa2\xc9\x1e\x11\x0c\x4a\xb9\xc3\x4e\x70\x9c\x97\xbb\x64\x73\x35\x95\x50\xeb\x21\x86\x91\xd4\xc1\xb1\x8e\x76\x44\x0b\x82\x7f\xf6\x25\xab\x5e\xe5\x83\x25\x28\x79\x95\x8e\xe3\x1c\x45\x97\xd5\x86\x83\xde\x10\xf9\xb8\xf6\xae\xdc\x41\x4b\xc1\xd5\x66\x16\xb6\x69\x36\x15\xbe\xc9\xf2\x24\xea\x96\x68\xcb\x65\x97\x2a\x48\x80\x58\xb5\xc5\x35\xfc\x19\xf9\x6f\x48\xa5\x81\xc5\x62\x17\x6d\xf9\x74\x58\x8c\x16\x4f\x50\xea\x12\x3f\x42\xba\xfa\x23\xf2\x9f\x90\x56\x6c\xc4\x17\x26\xae\x4c\x5c\x31\xf3\x67\xa7\xfd\xf5\xb0\xd3\xc0\x14\xba\x11\x07\x0d\x62\x17\xc4\xc7\x5d\xb1\x47\x10\x87\xcb\x8f\xd5\x3b\x3a\x22\x30\x7b\xb7\xc9\xc3\xfc\x70\xa8\xba\x5e\x82\x2e\xef\xdb\x66\x75\xe0\xb7\x38\x7c\xbf\x93\xd2\xc2\xbe\x94\x86\x8d\xfc\x42\x31\x64\x0c\x84\xf9\x91\xb7\x32\xd8\x7f\xa7\xa5\x89\xe0\xf7\x81\x24\x06\x86\x6e\xf2\x6a\x47\xf5\x7f\x94\xf7\xa8\xa5\x7a\xe2\x2d\x43\x50\x68\x62\x33\x6b\x89\x4b\x6b\x79\xd0\x4f\xd9\x8b\x57\x49\x99\xf8\xfa\xac\x19\x85\x63\x38\x12\xca\x07\xdf\xb7\xf4\x61\xd4\x98\x89\xe5\x20\xf9\x32\x76\xd7\x81\xe4\xc4\xb1\xd4\xf1\x29\x63\x39\xa9\x8f\x93\x43\x0b\xdd\xce\x1a\x1e\x2b\xe4\xb0\x7c\x24\x4c\xfe\x6b\xf9\xc5\xda\xcf\x31\x36\x8d\xc3\x96\x53\xde\xd3\xe1\x5a\x3b\xf8\x30\x01\x7f\x2a\x1f\xb1\x8d\xa5\x21\xde\x25\x17\x9f\xbd\xa2\x4f\x30\xc5\x14\xa6\xba\xb4\xb4\xed\x9f\xe2\xf8\x8a\xdd\x18\x7a\xaa\x86\xe6\x14\x51\x22\xca\x8c\xb0\x9d\x7d\x00\x6d\xa7\xc0\x09\x30\xdd\x2e\xc0\x9e\xb8\x61\xe0\x8d\x3b\xda\x68\xc2\x1c\x46\xa8\xd4\x50\x36\x01\x2c\x47\xa1\x66\x45\x05\xfb\x10\x66\xfa\xf4\xb3\x76\x86\x5e\x7f\x78\x85\x86\x75\x49\xc1\xe6\x44\x28\x73\xc7\x59\x37\x6a\xcd\x1b\x6e\xa4\x89\x7b\x0e\xb7\xe1\x1e\x48\x7d\x08\x5d\x3d\xca\x82\x30\x05\xd5\x3d\x32\x62\x41\x46\x75\xa9\xcf\xb5\xdb\x57\x86\x07\xe1\x39\x67\xed\xbf\xde\x30\xc3\xc1\x6c\xbf\xb3\xec\xd7\xa6\x5d\xbf\x8f\xcf\x72\x06\x3d\x7e\xa2\x8a\x87\x36\x87\x61\xc2\x33\x5a\x47\x00\xe3\xd3\x5a\xb1\x46\x43\xe0\x9f\x79\x9b\xa6\x1a\x78\x06\x10\x5d\x9a\xbc\x16\x0d\x5f\x5a\x8b\x32\x3d\xb3\xc8\x89\xf2\x22\xa0\x3a\xb9\xfa\xe6\x24\xa0\x61\x74\x9d\xfc\x45\xef\x8c\xab\xdb\x36\x07\xdd\xe3\x1f\xfc\x68\x23\x07\x5b\x63\x45\xba\xb8\xb3\xbc\x42\x02\xce\x21\xf6\x68\xe1\xf7\x22\x45\x2b\x4a\x7f\x33\x84\x0a\x53\xd3\x01\xa7\xea\x2f\x4d\x1f\x3c\x9c\x97\x3c\x74\xe7\xe2\x5f\xe1\x09\xca\xc4\x33\x97\x2b\xc7\xac\x4c\xf8\xec\x87\x57\x4d\xb5\x13\x32\x85\x48\xbd\x0b\x3a\x09\xe1\xcc\xd4\xe1\x60\xe1\x27\x50\x17\xae\x81\xd5\x22\xe4\x00\xa9\xf0\x2c\x66\x9d\xdc\x8b\xed\x66\xb1\x19\x47\x6b\x36\xe2\xd0\x1f\x8b\x31\xd3\x08\x9f\xc4\x1f\x04\x3e\x89\x8e\xaa\x0a\x96\x42\x42\xb0\x4b\x72\xbe\x25\x49\x77\x9b\x68\x5c\x50\x11\x4b\x08\x3f\x1c\x79\xd8\x6f\xfc\x0c\xec\x97\xc7\xc6\x1d\xd7\x71\x77\x74\x5c\xe7\x9f\x38\x76\x4b\xbc\xc3\xbb\x76\xfa\x41\x39\xaf\x56\x1e\xbc\x2c\x17\xb2\xa6\x9e\x98\xfb\x47\x1c\x38\x53\x50\x47\x96\x92\x29\x08\x35\x7d\xae\x49\x59\xfd\x42\x09\x53\xff\x39\xb7\xd0\xf4\xe1\xd4\x61\xaf\x47\xaf\xa0\x25\x9d\xfe\xb2\xd7\xd0\x8e\xba\x60\x24\xb4\x62\xa8\xa4\x18\x3d\x41\x80\x01\xde\x59\x24\x7d\x90\xc0\x77\x38\x28\xd6\x9d\x0b\x84\x5a\x4d\xe5\x29\x02\x31\xae\xdd\xff\x1e\xc1\x11\xd3\xf9\x5d\x0f\x13\x0c\x7b\xc9\x34\x26\x84\x8b\xf0\x9d\xbc\xb3\x84\xe7\x4b\x9a\x81\x19\xf6\x1f\x7f\xac\x60\xda\x22\xca\x4a\x8c\x1b\xd3\x3e\x83\x8f\xb1\xf9\x8b\x1a\xb1\x6b\x17\x3e\x4d\x24\xd6\x48\x68\xe3\xcc\x81\x03\x95\xc9\x1d\x3c\xd4\xab\x54\x7b\x16\xdf\x79\x9d\x27\x0f\x14\x9c\xc7\x97\x64\xe3\x5b\x05\xdf\x84\x62\xea\x1c\x69\xaf\x1b\x0d\xd2\x23\xa5\xc4\xcd\x8f\xbd\xbc\x16\x10\x81\xe4\x1b\x5c\xe2\x64\xce\xb0\x7c\xda\x86\xfc\x9d\xb7\xcd\xb6\x0c\x1d\xcd\xdf\x35\xec\xde\x6a\x20\x69\xb0\x84\xb4\x60\x28\x13\xd2\x55\xf0\xb7\x68\xf1\x21\x5d\x1e\xc6\x45\x44\x14\x97\xaa\xa7\xa5\x8f\x38\x09\xce\x5a\x6b\x87\xa0\xf2\xcd\x10\xba\x46\xf4\x38\x3d\x57\xd9\x33\x5e\x0e\xd5\x19\xa2\x31\xc8\xc3\xb3\x9a\x92\x36\x2a\x69\xcc\xe3\xc4\x58\xa8\x7c\x65\x40\x5f\x51\x19\xe7\x0f\x82\x90\xe3\x4c\x09\xe1\xc7\xed\xe5\x65\x66\xd1\x35\xe6\x47\x2d\x66\xe3\x34\x2a\xb7\xd4\x3a\x08\xc1\x2a\xf7\x62\x92\x76\x3d\xc4\xe7\x34\x8c\x3b\x0f\xc3\xe6\x4e\x4c\x85\x0b\xcd\x9a\xea\x96\xe5\x6d\x31\x69\x05\xbe\x8a\xb1\x1f\xb8\x7a\x91\xf6\xc3\x43\x7c\x4e\x3f\xb8\x15\xdc\x2f\x17\x91\xef\x8e\xfe\x70\xd0\x52\x71\xaf\x4c\x5c\xaa\x86\x5d\x8c\xe1\xb1\xaf\xdc\x49\x0e\xb7\xb4\xd5\x80\x33\x61\x9b\xcf\xf8\x48\x95\x1c\xf1\x22\x9a\x60\x1e\xc4\x45\x74\xf2\x79\xa1\xfb\x89\x00\x2e\xf2\x73\xc9\x00\xea\x9c\x3f\x93\x40\x8b\xe3\x73\x49\xfa\x15\x99\x3d\x70\x5f\x4a\x1b\x34\xf3\xfe\x23\x59\xe0\x2c\x0c\xb0\x70\x7e\xfe\x50\x01\xeb\x67\x2b\xb9\x02\x44\x74\x4d\xe1\x0d\xe6\x5a\x1d\x57\x16\x88\x39\xa0\x02\x11\x1f\xc3\xd9\x8e\xf5\x7c\x9b\xb3\x27\x94\x30\x9b\xd8\x50\xcd\x15\x0f\x50\x6c\xdc\xf7\xae\xaf\x1c\xce\xa2\xf1\x77\x80\xab\x3b\xef\xf4\x8d\xbb\x12\xcf\x75\x79\xdb\x3d\x20\xcc\x51\x31\x69\xe6\xb7\xfa\x18\x41\x22\xda\xad\x5b\xc4\x38\xb0\xb5\x66\x62\xe1\x50\x01\x15\x7e\x13\x46\xc9\x0a\x8b\x01\x35\x80\x47\x0c\x55\xf4\xe8\x2e\xa2\xf0\x05\x1d\x00\xd9\xb8\xbb\x07\x20\x0b\x12\x55\x87\x03\x17\x47\x12\x70\x57\x47\x64\xcf\x7f\x41\x47\x40\x37\x3e\xb3\x23\x27\xd6\x0b\x7d\xa5\x79\xb5\x9a\xdc\xff\x77\xf5\x6f\x20\x08\x01\x39\x93\x67\xc4\x8d\x18\xc0\x53\x0c\x92\xda\xa4\xa7\x98\x53\x38\xcf\x66\xc3\x5d\xe2\x5c\xdd\xdc\x4e\x71\x5e\xb5\xd6\x17\x38\xb5\xe9\xed\x03\x3d\xe5\x62\x55\x35\xad\x3b\x9e\x1f\xac\x7b\x7f\x43\x21\x7d\xc8\x80\x1d\xad\xfb\xf6\x56\x39\x1d\x84\xb0\x4e\xde\x61\x88\x41\xf1\x45\xa6\x83\x73\x87\xbc\xe1\xfe\x2b\xd6\xea\x7d\xb6\x2a\xba\xcd\xa2\x29\xf0\x5a\xee\x73\xfb\x9d\x89\xae\x4c\x0c\xdc\x78\xd0\x3b\xbe\xe4\x9d\x0f\x5f\xf6\xbe\xf3\x59\xf6\xf4\xe1\xfe\xe1\x4b\xfe\x9d\xbc\x65\xb5\x36\x16\x71\x7d\xd0\x9b\x7e\xea\x0c\xcb\x33\x8e\xdb\x54\xac\xfa\xe6\x84\x6c\xd7\xd4\x95\xf8\xdd\x9d\xcb\xaf\x8a\x9f\x65\xf7\xd7\x55\x5f\xf0\x87\xbc\x21\xa8\x29\x7c\x3b\x31\xeb\x9b\x1e\x2f\xc4\x5c\xf1\xdf\x6f\xf2\x87\xab\x2c\x0e\x1d\x5a\x6d\x56\xd0\x2d\x45\x37\x2a\xbf\x5d\xbe\x7b\x03\x1c\x97\xed\x5b\x7b\xd4\x3c\xd6\x80\x6e\x42\x07\x7f\x70\xdd\xd6\x4e\xa2\xd2\x43\x37\xd5\xa2\xdd\x41\x85\x37\x08\xeb\xff\x17\xa6\x9d\xf9\x76\x01\xa5\xeb\xe2\x7b\xd1\x5c\x9e\xb8\x84\x64\x41\x7c\xc6\x3e\xbc\x6b\x99\x24\xa7\x47\x69\x4c\x97\x67\x68\x92\x24\x0e\x2e\x9c\x24\x14\xcb\x51\x2b\x66\x81\xf1\x69\xe6\xfe\x1c\x53\xcc\x11\x3a\xa9\x3d\x7d\xdc\xd0\x67\x89\xc7\x7f\x92\x24\xb7\x4b\x06\x23\x11\xbd\xb0\x4f\xdb\x36\x6b\x3a\x3a\x45\xd7\x9c\x0e\x4f\xf9\xf5\xb4\x4e\xbb\xcb\x9d\x54\x81\x90\x56\x3e\x05\xc6\xe0\xbe\xe8\xd2\xd2\xd8\x9f\x3e\x41\x2f\x20\x8f\x00\x63\xec\x24\x22\x3e\x13\x88\x64\x62\x78\x40\x26\x91\xc5\xa7\x20\xbb\x9b\x4a\x9e\x07\xb9\xc4\x8f\x49\x98\xf6\x00\xad\xe3\xa1\x76\xb9\xec\x66\xc0\xb1\x38\xf0\xfe\x63\xa3\x8f\xe9\x70\xb0\x84\xf0\xd6\x63\xfe\x16\xdb\xb1\xbb\xb3\x90\x3b\x17\xd9\x1f\x5d\xdf\x97\xd4\x92\xee\xa6\xc1\xf4\x01\x19\x6b\xd6\xa3\x56\xfd\xbc\x8a\x28\x1f\x76\x91\xf3\x28\x10\xb7\x45\xbd\x15\x2c\xfb\xb3\xea\x18\xf4\x32\x42\x84\x6a\xbe\xbc\xab\xa0\xff\x4c\xef\xa9\x37\x83\x4e\x26\x34\xcf\x40\xee\xa9\x61\xd0\xc5\xc9\x2a\xbe\xbc\x93\x38\x69\xeb\xb5\x9c\x3a\x47\x3a\x79\x8b\x07\x42\xdb\x95\x0a\xae\x5b\x76\xaa\xfd\xd9\x1c\xfd\xee\xa9\xf2\x58\xaf\xef\xac\xf3\x0b\x86\xb1\xae\xfa\xf9\x7a\x19\xbb\xcf\x8f\x23\xb7\x0b\x26\xdc\x7c\xb8\x97\x4b\x89\x09\x54\xa7\x4a\xcb\xe9\xe2\x77\x4d\x30\x3a\xc4\xea\x8a\xa9\xea\x8f\xf5\xad\x2d\x71\x37\x9a\x83\xa9\x76\xdd\x46\x5d\x06\xde\x95\x62\x66\x79\x34\xa3\xb4\x67\x85\xbe\x4b\x55\xc2\xb8\xde\x3d\x92\x88\xb7\x8f\x97\x05\xee\x26\x7e\x83\x17\x45\x40\xda\x51\xda\x38\x5b\x9e\xad\x27\x77\x36\x34\x18\x8b\xa3\xeb\x6e\x6e\x5b\x74\xa5\x2f\x3f\x6b\x04\xce\x41\xc6\x0f\x83\x11\x45\x89\x18\x48\x1e\xf1\xd8\xc9\xc4\x3d\x66\x77\xad\x72\x25\xb7\x7f\xd5\xc7\x53\x0f\x6d\x8b\xe7\xaf\x96\xce\x23\x03\xf2\xed\xde\xb1\x42\x8f\x92\x5e\x7c\xd9\x18\xf9\xf1\xbb\xd1\x46\x78\x87\x64\x7d\x0c\xef\x1f\xda\x0e\x53\x15\xff\xb3\xdb\xa1\x75\xbd\x1a\x6e\x0a\xcf\x1e\xe0\x75\x2f\x9a\xbb\xbe\xc2\x31\x71\x29\xaf\x7d\xfd\x82\x6f\x4f\xae\x0f\x2d\xbb\x14\xcc\xd7\x4d\xdb\x10\xc6\x49\x04\x70\x49\x23\x8e\x42\xd3\xba\x89\x02\xb0\x58\xdc\xce\x0f\x1a\x5f\xc3\xca\x9c\x23\x99\xd8\x3e\x0e\x4e\x11\x4b\x81\x79\xb2\x32\xac\x87\x5e\xaa\xf5\x02\xdc\x94\x95\x3a\xb5\x0c\x57\x52\xcb\x34\x0b\xbe\xf0\xa5\x71\xc7\x00\xfc\x56\x53\x1c\x2c\xec\x84\x1c\xc5\x99\x30\xe0\xb0\x9f\xf3\x50\x11\x76\x42\x92\xf3\xd7\x48\xce\xaf\x38\x79\xdc\x82\xf5\x2a\x14\x1b\x74\xea\x58\xb9\xeb\xb6\x1c\x95\x79\xc1\x8f\x42\x0d\xe1\x6d\xe6\x36\x65\xb1\x1f\xcd\xdb\x4b\x4a\x1c\xcd\x1a\x20\xc7\x13\x00\xd8\xe3\xb3\xe0\x4b\x55\x2b\x08\xd1\xbe\xc4\xab\xd5\xf6\x58\x1b\x15\xbc\x8b\x86\xf0\x35\x33\xf1\x47\x4a\x28\x37\x35\xec\x95\xda\xf6\x46\xbd\x6a\x16\x1c\x46\xa6\x33\xe8\xb7\xf2\xe9\xa0\x16\x4d\xd3\x93\x2c\x47\xa0\xc4\x46\xc2\x55\x56\xa6\xe9\x47\x4b\x67\x46\x78\xf9\x61\x34\x53\x02\x3d\x9e\x2a\x81\x3e\x3e\x57\x3b\x7e\x9a\x8f\xda\x6a\x0f\xcb\xfe\x40\x34\x27\x34\x78\x7e\xc9\x4f\xfa\x5d\x86\x8c\x51\x8b\xa3\x92\x1e\x43\x87\x85\xa7\x5a\x5e\xf2\xc3\x8a\x93\x4d\x9f\x71\xce\x9d\x6d\x8f\xca\xfa\xc6\x47\xc5\xa7\x76\x4a\xdb\x10\x61\x61\xa2\xb4\x38\x2c\x3f\x94\xfc\x3c\x53\xb7\x99\xc3\xa9\xc3\xd7\x75\x61\x60\xf9\x8f\x00\xcb\x5f\x12\x58\x7e\x05\x8d\xdb\x44\xad\x74\x8e\xee\xca\xbe\x80\x13\x92\xab\xe5\xe7\x33\x5a\x01\x49\x9e\x2a\x05\x4d\xdc\x5c\xe5\x1f\xdd\x85\xcc\x92\xba\x1a\xde\x42\x59\xa7\x22\xd1\x69\x00\x99\xaa\x8d\x63\x49\xcb\x81\xbe\xbc\x5d\xea\x9b\x61\x9f\x7a\xee\xc3\x3b\x49\x71\xb0\x90\xf1\x08\xd6\x68\x24\xfc\x50\x10\x8a\x86\xc0\xaf\x52\x42\x29\x14\x2c\x02\x0b\xe1\x22\xb8\x0b\xf6\xdd\x99\x02\xdc\x17\xb2\x99\x8e\x42\x5a\xf3\x06\x68\x2d\x0f\xe1\xb4\xd1\x4e\xa6\x52\xc8\x8a\x08\xd8\x72\xef\x4b\x9f\x5b\x27\x9c\x83\x9f\x03\xae\x7d\xd9\x63\xeb\x9c\xa6\xb0\x6c\xa1\x75\x16\x95\x68\xa4\xb5\x17\xa8\x15\x4c\xe4\x0a\x48\x13\x92\x62\x9c\x30\x5e\x7a\xb2\xdf\x96\x97\x84\xce\x91\xb4\x78\x80\xd2\x5f\x4d\xb3\x90\x66\x21\xd0\xbb\xa6\xc3\x5d\xbc\x2d\xd7\xac\xa8\x90\x8b\xe4\x08\x1d\x86\x1b\x41\xef\x90\x6c\xd2\x8d\xbf\xe3\x75\xd5\x60\x94\x6e\x60\xa9\x53\xa2\x0d\xf3\xfe\xb0\x6a\x33\xad\xc3\x07\x15\xd6\x91\x41\x74\x31\xaf\xbc\x54\xed\x60\xde\x79\x02\x29\x2f\x59\x8a\x61\x73\xeb\x4b\x43\xae\x34\x41\x6d\x50\xc3\x6b\xc8\x9c\x6e\x96\xf7\x45\xd7\xf1\xa3\xd2\x51\xd5\x0d\x63\x01\xab\x5c\xe4\x62\x0a\x54\xed\x70\xbb\x3d\xd4\xca\x31\x59\xef\x95\x45\x92\x5d\xed\x23\xcc\xd9\x43\xdd\x9a\x73\x9f\x51\x31\xce\x85\xc3\x14\xf8\xb5\xa4\x38\xb2\x2b\x3e\xe9\xb3\x8e\xf1\xdd\xd8\x73\x7d\x21\xd6\xdd\x9f\x3d\xb3\xdc\xd7\xfc\x58\xec\xb1\xb2\xa6\xe3\x7b\x7c\x49\x04\xe6\xe9\xd7\x78\xd2\x86\xf6\xc3\x7a\xdb\x2c\x0a\x76\x62\x91\x37\x82\xf1\xde\xec\x13\xad\x83\x5f\x71\x72\x48\x39\x7c\x67\xbc\x18\x20\x29\x8d\x7e\x53\x2d\x68\x50\x22\xe8\x8f\x0b\x18\x80\xbd\x43\xb1\x0e\xb8\xcc\x2d\x29\x8a\x27\x85\x10\xd6\x83\x33\x04\x43\xf9\x99\xba\xa0\xb4\x34\x9c\x87\xbd\x9d\xef\xf5\xcc\xd5\x31\x7c\x54\x83\x2b\xe3\x9e\xf0\x60\xb6\x4f\x62\x3f\xf9\x7a\xe4\xbd\xd5\xb9\x21\xdb\x7d\x75\x1d\x7d\x9e\x75\x12\x65\xa2\x7e\xdf\x30\x46\x48\xbf\x21\xe7\x9d\xe6\xe3\x14\x37\x10\x3c\x95\xaf\x66\x47\xad\xa3\xeb\xa9\x84\x56\xe5\xfe\xc6\xcb\xd5\xfc\x12\x54\xce\x3c\x2f\xde\x28\x60\x11\xcb\x5f\x95\x0f\xd1\x2d\x62\x50\x7d\x76\xdb\x8d\xb1\x33\xe8\x48\x50\x9d\xa4\xef\x00\x47\x67\x11\x1f\x9a\x23\xed\x47\x1b\x29\x42\x4f\xf9\xe6\xbd\x76\x2c\xed\x80\xd8\xf1\x9a\xd6\xfb\x56\xa5\xca\xcd\xa4\x2b\x13\xee\x53\xa7\x6e\xc9\xee\xf2\x0d\xa6\x5a\xe5\xfe\xf0\x80\xba\x27\xc6\xed\x84\xca\xa3\x84\xa7\xde\x48\x48\xdd\x7c\x90\x14\x0d\x3f\x66\xf3\x11\x15\x2c\x08\xf7\xb0\x3d\xb7\x9d\x93\xd6\xa4\xc4\xf8\x3d\xfe\xb4\x0b\x92\x32\x36\x0d\x4b\xba\x6a\x0f\x73\x7b\xc3\x5a\x55\xc1\x33\xa8\x10\x85\x7b\x6b\x2d\x6d\xf8\x1c\x2a\x34\xc3\x4a\x67\x07\x5d\x1e\x50\xda\xa4\xdb\x52\x4a\xc2\xb2\xda\x55\x7b\x25\xe6\x9a\xe5\x7a\x2f\x29\xfe\xa5\x14\x49\x29\x11\x63\x88\x29\x8f\x44\x1b\x5a\x69\xfa\xd8\x29\xcb\x75\x52\xab\x19\x74\xce\xd5\x0a\xa8\xe9\xc3\xc2\xf5\xa6\x2b\x49\x8e\xe0\x97\xec\x69\xe7\xf6\xcd\xb2\xd9\xe2\xb4\x94\x34\xde\xb4\x48\x53\xd8\xe1\x2d\x0d\x49\xc5\x95\x68\xbe\x52\xd2\xf5\x9a\xb2\x97\xb7\x52\x2e\xf8\xad\x14\x49\x81\xf6\x6e\x05\x7f\x69\x56\xd6\x3d\x7f\xe3\xd3\xed\xa4\xb2\xdc\x0b\xfd\x9e\x82\x71\xee\x55\x45\xcb\x4f\xb5\x7c\xa3\xc1\x8b\xad\x0e\x84\x5b\x6e\x5a\xf1\x73\xde\x6f\xb9\xbf\xfc\x80\x2a\x0c\x6f\x6c\x86\x90\x87\x8c\x36\xd5\x7a\x03\x8f\x03\x22\x49\x6b\x71\xe1\xe7\x5d\x34\xb3\x89\x67\x36\x48\x63\xb2\x83\xfd\x51\x33\xcb\x8f\xec\x5d\xe9\x40\x30\x22\x00\x84\x11\x15\xbd\x04\x82\x2a\xa7\xae\xe5\xe5\x21\xf7\x28\xf4\xf0\x8d\x29\x10\x88\x70\x60\x73\xef\xf9\x2a\xd7\xd3\x0a\x91\x56\x77\xfa\x94\xa7\xdc\x31\x4d\x02\x5e\xcd\x46\x2d\x98\x9f\x15\x42\x66\xde\xd3\x9b\xee\x60\x5d\xbf\x3c\xdc\xd7\x73\x42\x05\x04\x79\xc3\xdf\xa3\x60\x1d\x4b\x83\x0b\x7d\xc1\xad\x64\xfd\x71\xcc\xe2\xa5\x52\xbc\x90\xcb\x27\x9f\x0c\x6f\x24\x7c\xa7\x4d\xb2\x84\xef\xb4\x9a\x61\xda\x0b\x00\x62\xf0\x4f\x20\x76\x7c\xd6\xce\xbb\x82\x09\x13\x9d\x2a\xab\xfc\xf2\xd4\x90\x7e\xd7\xef\xed\x35\xf7\xcb\xf3\xab\x8b\x3b\x76\x11\x83\x2a\x86\x03\xd2\xa1\x39\x67\x29\xaa\x23\xcb\xe1\xbb\x05\x68\x90\x1d\xa3\xca\x19\x38\xd7\xc9\xd6\xe9\xa6\xe1\xee\xe2\xd5\x18\x79\x49\xfa\xa2\x39\x5b\xca\xeb\x5e\x5a\x66\x96\x9f\x13\x3f\x53\xb1\xaf\xa6\xb5\xa6\xfe\x82\xfc\xf0\x71\xb9\x2f\x5a\x7b\x07\x09\xcf\x58\xe7\x8f\x4e\x1e\xcd\x12\xba\x33\xef\xf1\xe6\x9c\x06\x3a\xbb\x7a\x7d\x49\x3f\x97\xed\xad\x38\x23\xe8\x48\x3f\x54\x7b\x06\x9b\xf3\x9d\x32\x61\xa8\x29\x05\xb0\x7f\x44\x8a\x6d\x7c\xb6\x5a\x97\xed\x47\x8e\x18\xaa\xf8\x73\x71\x7a\x0e\x65\x11\x25\x79\xb2\xa3\x4d\x23\x3c\xb8\xb1\xeb\xb1\x13\xb4\x1c\x4d\xc2\xae\x1b\xe9\xac\xf6\x38\x7b\xe8\x8f\xd5\xe3\x22\x17\x0f\x79\x6a\xf1\x2c\xb0\x99\x1e\xf1\x77\x29\x74\xc2\xe6\x05\xaa\x3e\x94\x03\xd2\x32\xf7\x5d\x50\x9a\x25\x74\xdc\x1f\xda\x69\x3d\x9f\xe9\xa2\xe7\x2b\x73\x0c\xd6\x5d\xa3\x9e\x8c\xa7\x94\x96\x48\x20\xe7\x72\xb4\xa8\xaf\xc4\xa0\xea\xe0\x35\x31\x2e\xe1\xcd\xea\xe3\x89\x9d\x70\x7d\xbb\xc3\xdd\x4d\x51\x0e\x5c\x57\x15\xee\xa7\x1d\xa9\x5a\xf8\x2f\xc0\x10\x86\xc3\xdf\x42\x8d\x93\x6a\x68\x8e\x2c\x5e\x0c\x19\xc7\x8f\x4a\x88\x41\xd9\x45\x46\x13\x5e\x1e\xa7\xaa\xf2\x5c\x6e\x98\x03\x9e\x2b\xed\xc6\x3d\xac\x97\x54\x23\xb2\x9b\xde\x3f\x31\x9f\xf5\xd7\xce\x50\x38\xf5\xf2\xe8\x2c\x53\x7b\xb4\xe9\x5f\x83\x75\x5a\xf5\xaf\xa9\x91\x5a\x61\x8b\xfd\x3e\x9c\xfb\xfb\xfd\x36\x39\xf4\x1d\xc8\x47\xa1\x9b\x0e\xe2\x8f\x1a\xdf\xce\x01\xc9\x9d\x71\x0f\xc4\x57\xc7\x15\x60\xc8\x0f\x68\x72\x73\x7d\xcd\x2f\xe5\xf3\x13\x39\x1a\x65\x95\x3f\x39\x7c\x77\x68\x5f\x23\x21\xcc\x59\x21\x0c\x05\x2b\x8f\xe9\xb9\x86\x47\x78\x87\x44\x9e\x1c\x03\x6f\x0f\xc0\x03\xee\xef\xbb\x43\x2d\xb2\xba\xcb\xd2\x86\x38\xcb\x37\x02\xf6\xb3\x6d\x1a\xb6\xbb\x83\xd4\x3b\xde\xf3\x1d\x25\x13\xa3\xd1\x6f\xc2\x04\xb3\xfd\x7b\x39\x97\x17\xeb\x5d\x19\x58\xdf\x97\x72\x61\x6b\x54\x88\xfa\x3d\x2e\x41\xfd\x3e\x02\x2e\x3e\x5e\xc6\xb9\x5d\xe2\x4b\xce\x9a\xd0\x63\x84\x44\x94\x3d\x65\x03\x96\xb4\x21\xd2\x61\x0e\x42\xc5\xdd\xc6\xa1\xc6\xe5\xcb\x69\xbc\x60\xa8\x31\xab\xe9\x32\xf1\x8e\xef\x5c\x83\x9c\xce\x05\xe5\x94\x6d\xee\xf3\x1f\x35\xf6\xa9\x60\x9e\x2f\x76\x04\x0d\x38\xcb\x73\x82\x2e\x79\x0b\x3f\x12\xcb\x7d\x8d\xaf\x11\x50\xb2\x72\xa3\xa9\x24\x00\xbe\x30\x89\xd8\x2c\x0a\xf4\x6f\xe5\xad\xc4\x64\x99\x00\x5c\x73\x73\x01\x8c\xbe\xf2\xc7\x8f\x28\xeb\xa9\x64\x3d\x7a\x32\x2a\xc3\xa2\xf8\xee\xb0\x93\x1b\xaa\xd5\x5f\x4b\x79\xe8\x83\x59\x09\xc9\x40\x6b\x97\x6c\xca\x39\xe3\x8c\xbb\x8a\x76\x13\xa5\xba\xb0\x76\xab\x45\x5c\xba\xe7\xe6\x6e\x31\xb9\x7e\x04\xe9\x65\x87\x98\xea\x39\xf0\x98\xea\x25\x8f\x98\xaa\x58\xe5\xb7\x10\xa5\x76\xdd\xd6\x76\xd1\xe5\xe5\xeb\x74\xab\xc6\xdc\xc8\x9e\x3c\x66\x5e\xf3\x01\xbf\x53\xc6\x11\x98\x1f\xe4\x7c\x23\xfa\x89\x2b\xa1\x53\xed\x27\x55\x53\x87\x75\x74\x7f\xd9\x56\x7d\xf9\x87\x07\x70\xa1\x7a\xd0\x57\xab\xc5\x83\x27\x09\xd5\xab\x70\x5f\xcf\x91\xbd\x6a\x79\x64\x7e\x82\xda\x8f\xb5\x5a\x5b\x17\xc2\xf3\x9d\x3c\x7c\xa6\x2c\xaa\xfa\x7e\xa7\x53\x6b\xf4\x28\xb2\x22\x81\x1a\x79\x36\xc4\xfa\xc5\x57\x53\x5b\x97\x11\x83\xa9\xe3\xb2\xeb\x3b\xab\xe6\x47\x24\xc7\x0e\xca\x03\x6c\xf6\x20\x9b\xde\x82\xb3\xee\xe1\x0d\xb6\x57\xb5\x5c\x6e\xd5\x22\x18\x49\x50\x63\x9e\x73\xff\xbd\xe6\x72\xd8\xff\x11\xb6\xda\x28\xee\xc6\x5a\xe5\xc6\x96\xc5\x9e\x18\xf3\x22\xf2\x61\x67\x92\x10\x0e\x04\x09\xce\xc0\xb7\x27\xe7\x5b\xf5\x41\x90\x00\x0e\xb8\x43\x49\x1b\x99\x9d\x0e\xc2\x60\x89\xad\x89\x72\x5b\x52\xe8\x1d\xe7\x05\x39\xcf\x17\xb6\xd2\x16\x9a\x26\xac\xbc\x05\x4e\x98\x5c\x79\x44\x58\x9a\x6f\xcb\x7a\x0d\xb4\xfb\x77\xfe\x24\x16\x9a\x3f\xc3\x0c\x49\x44\x04\x68\xbe\xf9\xe6\xdf\x77\x16\x23\x01\x0a\x70\x4a\x09\x6b\x7b\x2f\xaf\xeb\xd7\xc6\x9f\xc9\xe7\xf8\x9e\xee\xa1\xc2\x1e\x25\xbf\x9a\x6f\xeb\x48\x9b\xa4\x71\xab\xf7\xf2\xa7\xd7\x6f\x07\x90\x13\xbb\x5b\x73\x26\xa8\x81\xe6\x4c\xec\x7d\xe8\xcb\x41\x44\x55\x8c\x83\xa6\x1c\x54\x14\xbb\xc5\xe0\x02\xc8\xfc\x5a\x2e\xb4\xca\x43\xbb\xf2\x66\x1b\x5f\xcd\xe0\x12\xd8\x77\xf6\xe2\x37\x1e\xd8\x1d\x95\xee\xf4\x91\xca\x08\x1e\x1f\xe4\xd0\xc8\x49\x5c\x38\x32\x3e\xe2\xf2\x13\xe6\x18\x6e\x3e\xd3\x53\x2c\x90\xe3\x19\xb6\x7c\x31\x72\x45\xff\x3e\x98\xb5\x26\x6b\x12\xc8\x62\x45\xd8\x2f\xd7\x66\x01\x7a\x2a\xdf\x29\x10\x2c\xc1\x1f\x8b\x6d\x80\x7a\xa5\x09\xa3\x56\x6b\xdf\x66\x2d\x8e\x1e\x8e\xd0\x89\x7b\xaa\x23\x74\x72\x01\x6c\xfa\x20\x57\x68\xbe\x1f\x5c\x99\x1f\xa8\xc0\x5f\x68\x92\x81\x1a\x48\xac\xd9\x20\xb4\xea\xd0\x4f\xda\x5c\x55\x90\xda\xce\xf0\x95\x60\x97\xd2\x08\xde\xd4\x02\x1b\xc9\x04\x2b\xda\xa5\x84\x01\xaf\x97\x61\x66\xcc\xc0\xf5\xf3\x59\x98\x1b\xb1\x85\x0d\x06\xb3\xad\xae\xcb\x60\x39\xd3\xd1\xbc\xa6\xb4\x04\x78\xd3\xf7\xfb\xce\x62\x09\x71\xd8\xbf\xcb\xfc\x2d\x7d\x0c\x06\xe1\xab\xd2\x91\xc4\x9a\xc2\xcc\x54\x30\x67\xba\x89\x91\x84\xe9\x29\x37\x68\x3d\x91\x1c\xb8\x1e\x49\x43\x4a\xbc\x6e\xf5\xfe\x55\xdc\xc5\x3f\x6b\xd2\x60\x46\xaf\xcb\x15\xae\x93\xaf\xe6\xa1\x84\xce\xeb\x0b\xcb\xe1\x20\x0b\xd0\x5d\x86\xf9\xad\xfa\xd8\x71\xd6\xef\x4f\x76\x9a\xa1\xac\x3f\x88\xc8\xc0\x6a\x2f\xc4\xae\x77\xbd\x92\xc0\x0c\xb7\x75\x5f\x7c\xca\x5f\x5a\xbe\xaf\x81\x0d\x2c\x28\xcd\x5c\x3c\x78\x19\x82\x44\xa9\xd7\x48\xc0\x39\x5e\xf0\xad\xfb\xf5\x56\x22\x12\x3c\x39\x5a\x9c\x23\xb9\xb4\x74\x8c\xa8\xba\xd8\x2a\x3a\x8b\xa9\x69\x6d\x5c\x66\xba\x36\x0b\x83\x10\xea\x90\xf7\xea\x1e\x8b\x94\x89\x40\x08\x49\x41\xc2\xc8\xa2\x5d\xab\xcd\xf3\xb4\x5d\x1f\xe4\x19\x5f\x5f\x75\xc5\xd1\x6c\x4a\x77\x42\x9c\x57\x16\xdf\x66\x70\x46\x08\x38\x1e\xab\xf0\xd0\x08\x3d\xae\x62\xf9\x44\x09\xb8\xce\xbb\x02\x67\x70\xa5\x8f\x0e\x97\x13\x45\x10\x07\x2a\x96\x40\x08\xa8\x3b\x0b\xa8\x6d\x57\xc0\x69\xa4\x63\x60\x2f\xbb\x04\x14\x62\x99\x65\x12\x85\x18\x4a\x19\x43\x86\x01\x63\x68\x3e\xcf\xb3\x65\x2b\x11\x5c\xf9\xcf\x15\x3b\x9c\x86\x1c\x7f\x3a\x59\x5a\x47\xb4\x6f\x75\x90\x70\x0f\xfa\x33\xc2\xc7\x17\x9b\x65\x97\x5a\xc6\xc4\x2b\xcf\x29\x40\xf9\xa9\x5c\x1e\x9c\x97\xcd\x4f\xf2\xad\x66\xed\x58\x4d\x63\xf7\xa2\x0e\x35\x5e\xf8\xbe\x90\x14\x07\x33\xf5\x0c\x98\x75\x1d\x12\x90\x49\x42\x47\xdb\x0f\xcd\xdb\x7c\x67\xe6\x37\x6e\xee\xd8\xfa\x9a\xce\x56\xc4\xff\x81\x2b\xb9\xc1\x22\x92\xc8\x0a\x91\x23\xe6\x21\x92\x04\x42\x8a\x08\xa4\x46\x95\x08\xf0\xea\x10\xad\xcc\x18\xdb\x0b\x43\xab\x25\x7b\x14\xb2\x13\x44\x1e\x9e\xe1\x3f\xdd\xc6\x92\x34\x64\x0f\xf1\x5c\x3f\x13\x98\xaa\x16\x99\x54\xb2\xc4\x36\xfb\x4a\xd2\xb4\x4a\xe7\x1f\x6f\x4a\xa1\xf0\x5a\x7c\xd0\x3c\x5d\x6a\xca\x10\xd2\x5a\x06\x10\x7b\xb0\x0d\x67\xc3\x8b\x3c\x3e\x0d\x21\xa9\xdd\x25\x06\x37\xa6\xe1\x32\x5a\x56\xb3\x67\x0e\x62\x3f\x1b\xf5\x36\x68\x76\x74\x45\xcc\xdb\xff\x3e\xaf\xd1\xec\x57\x99\xfb\xf7\x76\x6b\x5d\x4d\x94\xe6\x19\xe0\xbc\xf1\x92\x20\x5a\xf2\x1a\x78\xd6\x96\xb5\x7b\xef\x41\xbe\x92\x42\xc9\x6b\xa0\x5f\xc7\x57\x3f\xf9\x46\xd7\xd1\xd7\xd4\xc3\x03\xd5\xa8\x95\xaf\xa8\x88\x19\x7a\xf0\x72\x6a\xd7\x2e\x9f\x0d\xcb\xb2\xd9\x32\x05\xe3\xcc\x7f\xb1\x8a\x65\x8c\xf6\x94\xf7\x6f\xfa\x7c\xb6\x7c\xbb\xf1\x3d\x13\xdb\xda\x33\x19\xe9\xef\xdc\xfb\xd6\xe9\xdb\xe3\xf6\x8a\xf7\x17\x54\x30\x78\x72\x3c\xbe\xe1\xfd\x25\x9d\x90\x61\x0c\xdf\xa4\xb5\x35\x4b\xde\x73\xf4\x15\xea\x53\xb3\x47\x06\x35\xaa\x4e\xc6\xf6\xc5\xb5\xe9\x08\x87\xd5\x85\x81\x7e\x79\xf7\x06\x2f\xb0\xbb\x27\xea\x9b\xfa\x4b\xe6\x6d\xf2\xdd\xcd\xdf\xf4\x7d\xd0\x2f\xee\x56\x88\x94\xae\x78\x6a\xdf\x83\x5d\x23\xb8\x3f\x8d\xf8\x71\x23\x21\xf8\x20\x87\xfb\x88\xf8\x4e\x1f\xbe\x1b\xc0\x76\xff\xd8\xfa\x78\x47\x0c\xf6\x90\xbd\xbe\xac\x0f\xe5\x82\xfe\x4a\x72\xd5\xe9\x3b\x87\xa2\x49\x7e\x18\x5e\xef\x25\x7a\xd0\x37\xcd\xf6\x7d\x56\xac\x79\x48\xf4\x7f\xc6\x3b\x58\xef\xf5\x62\x33\xd3\xcf\x4c\x3e\xf9\xd7\xd7\x5c\xf3\xd7\x1a\x09\x98\x5f\x57\xf8\x7a\x87\x04\x79\xb0\x0a\x09\x1b\x24\x6c\x38\xb8\x1e\x7f\xae\xf0\xb9\x2a\x6e\xf1\x75\x83\xaf\x9b\xb2\xfc\x20\x85\x41\x9c\xa9\x78\x53\x93\x90\xc4\x29\xb7\xf8\xbe\xe5\x77\x29\xf1\x76\xc3\x12\x11\x87\xf1\xfc\xa7\x7d\xe0\x91\xcf\x1a\x66\x38\xa4\xdb\x07\xa5\x73\xab\x9a\x2a\x3f\x1f\xb2\x6f\xe5\xad\x26\xe1\x17\xbf\x4a\x47\xcd\x6b\x92\xfc\x7c\x88\x33\xb5\xdf\x58\x85\xf2\x9b\x52\xb9\x1f\x9a\x28\x3f\x29\xad\x2d\x6e\xe6\xb1\x5f\xfa\x0b\xa9\xb1\x57\xfa\x8b\xa6\x77\xd5\x36\x7b\x7e\x4d\xe7\x7d\x66\x2f\xf3\xc5\x27\xf9\x9e\x53\x9e\xb9\x37\x73\x40\x2c\x56\xf9\xdb\xcb\xe0\x87\x3d\x47\x6a\x99\x65\xf6\x12\x67\x55\xef\x0f\x41\x11\x1b\x5f\x81\x15\xb0\x18\x6f\x58\x2e\x77\x12\xd4\x2c\x83\x9a\x97\x83\x70\x2d\xc0\x30\x41\xc1\xcb\x9a\x96\xfc\xf1\xdf\xfe\x06\x78\xfa\xfd\xf7\xbf\xe7\xe7\x3f\x3e\xc9\xcb\x4f\x1c\xfa\xbf\xcb\x77\xea\xc1\x64\x60\xf4\xfd\x22\x81\xe4\xb8\x32\xb8\x73\xa7\x2e\x33\x72\xe7\x0e\xcd\x67\xff\x37\x00\x00\xff\xff\x5c\x56\x9d\xe4\x06\xdb\x00\x00") - -func confLocaleLocale_enUsIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_enUsIni, - "conf/locale/locale_en-US.ini", - ) -} - -func confLocaleLocale_enUsIni() (*asset, error) { - bytes, err := confLocaleLocale_enUsIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_en-US.ini", size: 56070, mode: os.FileMode(420), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_esEsIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\xbd\xcb\x6e\x1c\xc9\xd5\x30\xb8\xcf\xa7\xc8\x96\x21\x48\xc2\x50\x25\xb4\xfd\xcd\x05\x8d\x2e\x79\x28\x4a\x6a\xf5\x80\x92\xf8\x89\x94\x8d\x6f\x1a\x42\x75\x56\x65\xb0\x98\x52\x56\x66\x39\x23\x93\x12\x65\x78\x31\xfb\x79\x80\xc1\xec\xb4\xec\x85\x16\x1f\xbc\xf3\xc6\x40\xf3\x4d\xfe\x27\xf9\xcf\x35\x6e\x99\x55\x94\xda\x36\xe0\x16\x2b\x32\xee\x71\xe2\xc4\xb9\x9f\x62\xbb\x5d\x94\xc6\xae\xe6\xaf\x9b\xdc\x9a\xee\xb2\x5a\x55\x6d\x5e\x9a\xfc\x87\xaa\xcf\x8b\xa1\x6f\xf3\xa2\x6e\xdf\x16\x65\x9b\x5f\xe5\xb6\x6a\xf2\x55\xbb\xd9\xd6\xd5\xaa\x80\x5a\x8d\xb1\x59\x76\xd1\x6e\xcc\xfc\xc7\x06\x5b\x65\x65\x61\x2f\x96\x6d\xd1\x95\xf3\x93\xa2\x31\x35\xf6\xb2\x6a\x9b\xbe\x6b\xeb\xcc\x7c\xd8\xd6\x6d\x67\xe6\x4f\xe8\xdf\xa2\xcb\x2e\x4c\xbd\x9d\x1f\x5e\x0d\x65\x91\xd9\x6a\xdd\x2c\xaa\x86\x7b\x29\x3a\x98\x85\xad\xae\xff\xde\x70\x79\x3b\xf4\xf3\x23\xd3\x75\x69\xf9\xb0\x9d\xbf\x32\xeb\xca\x42\xef\x59\x47\x7f\x98\xce\x97\xbc\x37\x4b\x5b\xf5\x66\x7e\x72\xfd\x69\x5d\x35\x45\x0e\xbf\xb3\x4b\xd3\x59\x98\xf4\xfc\x4f\xf8\x2f\xf6\xb3\x2d\xd6\xae\x46\xd6\x1b\x58\x57\x81\x4d\xea\xa2\xe9\xab\xba\x2e\x32\xf8\x63\x3d\x60\x9d\x1f\xcb\xaa\xdd\x14\xd9\xaa\x33\x50\x61\xd1\x98\xf7\xf3\x23\xf8\xb3\x9b\xcd\x66\xd9\x00\x5b\xb6\xd8\x76\xed\x79\x55\x9b\x45\xd1\x94\x8b\x0d\xae\xf2\xc4\x74\x50\x80\xeb\x1f\xec\x50\x74\x15\x6e\xde\xe6\xfa\x93\xa5\xa9\x9b\x12\x16\xbb\x28\x2c\x74\x6b\x60\xa4\x73\xd8\x4c\xd8\x5d\xd8\xd7\x36\xa3\xee\x9a\x02\x76\xf4\x45\xbb\x59\x76\x26\xe8\x21\x33\x9b\xa2\xaa\xe7\x47\x6d\xd7\x99\x36\x37\xb5\x59\xf5\x1d\x2c\xa2\x5a\xb5\xb0\x0e\x6b\xdf\xb7\xb0\xeb\x47\xb8\xd9\x85\x35\xd7\xff\x5d\xc0\x9e\x2c\xfa\xab\x2d\x1e\xcd\xba\x33\x96\x7a\x6a\x06\x73\xd9\x66\xab\x62\xdb\xaf\x2e\x8a\xf9\x11\xff\x9b\x41\xcd\x6d\x0b\x9b\xd5\x76\x57\xb0\x7f\xf2\x27\x8c\xd7\x76\xeb\xa2\xa9\x3e\x16\x3d\xee\xd9\x4b\xf9\xb1\xa2\x8d\xdb\x54\x5d\xd7\xc2\x6e\x5f\xff\x42\xa0\x90\xc1\x8e\x2c\xb0\x97\xf9\x0b\x1c\x21\xef\x82\x5e\xf0\xd3\xa6\x5a\x77\xb8\xb3\xf8\xb5\xc8\xe9\x17\xf7\xc3\x1f\xa9\x2f\xfe\xd6\x85\x3d\x9e\xb7\xdd\x3b\xe9\x11\xff\x84\x15\xd4\xa3\xae\x61\x92\xd2\xb4\x8d\x67\x58\x34\x70\x70\xf4\xf9\xb0\xdc\x54\x0d\x42\x05\x40\x90\xaf\x44\xc0\x5b\xe0\xa7\xc5\x16\x61\xd5\x43\x6c\xe1\xea\x73\x57\xc5\x6a\xd5\x0e\x4d\xbf\xb0\xa6\xef\xab\x66\x6d\x71\x97\xcf\xab\xf5\xd0\x49\x2f\xd8\xa6\x2e\xf2\xd5\x00\x87\x09\xb0\xbc\xa3\x56\x76\xd5\x0e\x0e\x50\xe6\x67\x43\xbe\x25\x10\xe1\x62\xd7\x08\xca\x57\xbe\x1d\x8e\x0e\xc3\xf7\xd5\x65\xd5\x57\xc6\xce\x0f\xe9\xcf\xb2\x28\xb3\xed\x50\xd7\xb0\xe3\x7f\x19\x8c\xed\xed\xfc\x04\x7e\xe5\xaf\xe4\x57\x56\x59\x0b\x7f\xc0\xb9\xaf\x2a\x80\x2f\xb8\x50\x70\x49\x57\x45\xb3\x82\x35\x1e\xd1\x3f\x70\xf9\xb2\x9f\xaa\xc6\xf6\x45\x5d\xbf\xc9\xe4\x0f\xa8\x8f\xff\xca\xa8\x7d\xd5\xc3\x2c\x4f\x0a\xdb\xea\xf2\xaa\xe0\x73\xbe\x6d\xbb\x7c\xdb\x55\x1b\xd3\x15\xf9\xa5\xf9\x98\x95\xed\xea\x1d\x5c\x03\xbc\xd2\x70\x09\x4f\xab\x1c\x26\x72\xfd\x29\x37\x6f\xcd\x6a\xe8\xe1\x52\xb4\xf9\x0f\xed\xda\x02\x24\xd3\xdf\x8f\xa9\xf6\x41\xfe\xeb\x27\xec\xe7\xbc\xb8\x84\xff\xd6\xa6\xc8\xbf\x2f\xf2\xbe\xe8\xd6\xa6\x9f\xdf\x5a\x2c\xe1\xee\xbd\xbb\x95\x5f\x74\xe6\x7c\x7e\xeb\xb6\xbd\xf5\x10\xbb\x2c\x6c\xbe\x05\x8c\x54\xd8\xef\x1f\x14\x0f\x73\xb8\xa5\xbc\xf9\xab\x62\xb3\x44\xb4\xd1\x14\x65\x91\x9b\x86\x6a\xe6\x5b\xbe\xd6\xdf\x64\xb8\x4b\x80\x09\x16\xe5\x92\xb1\x1c\xcd\x84\x0a\x0d\xdc\xaf\x01\x70\xc3\xb2\xe0\xeb\x51\x16\x3d\x2c\xf7\xf9\xd5\xe9\x7f\x1e\x1f\xe4\x27\xad\xed\xe1\xe2\xd0\xdf\xf0\x1f\xe8\xe1\x0f\x79\x9b\x9f\x55\x8f\x1f\xcd\x32\xe8\x8a\x37\xe8\x28\x3a\x2b\xec\x23\xea\x8b\x2a\xe2\x1d\x3c\xab\xb6\xed\xf8\xeb\x05\x0c\x31\x7f\x06\xff\xa1\x5b\x3f\x7f\x2d\xf7\x7c\xf2\x36\x43\x4f\x09\x5a\xa8\x8b\xf1\x60\x72\x00\x27\x6e\x5b\x07\x40\x64\xd5\xca\x00\xba\xc8\x37\x2d\xdc\x9a\xfc\xc7\x17\x2f\x5e\x3e\x7e\x84\x40\x46\x30\x3b\x9a\xff\xaa\x80\x1f\x80\x49\x61\x67\x87\xfe\xfc\xff\x58\xac\x4d\x03\x87\x5c\x2f\x56\x15\x6c\x3d\x9c\x36\xed\xce\x2c\xb3\xb6\x06\x44\x57\x9a\xf9\xf3\x16\x0e\xf4\xf4\xf4\x18\x66\xdd\x5f\xcc\x5f\x0d\x78\x03\xfe\x52\xe3\x7e\xcb\x5c\xb0\x08\x5e\x90\xbc\xe8\x56\x17\xd5\xe5\x78\x17\xd2\xcd\xcd\xbf\x5f\x76\x0f\xdd\x02\x0e\x10\x66\xe8\x90\x3a\xea\x67\x69\xdb\x1a\xff\x58\x0d\x04\x49\x15\x3e\x18\x30\x55\xc4\x9d\xee\xed\x9a\x65\xf0\x5a\x2c\x00\x9b\xf7\x57\x78\xe8\x34\xb1\x63\xed\x60\xb4\x6d\xc9\xf8\x79\xd3\xe6\xdb\xc1\xc0\x57\x84\xa2\x2e\xbf\x2c\x56\xd7\x9f\x0b\xee\xb2\x6a\x2e\x8b\xba\x2a\xe1\xec\xf5\x34\x9e\xd4\x50\x7f\xd7\x81\x24\xfd\xe1\x43\x88\x9b\x99\xd7\xf0\x29\xd8\xe6\x5b\xb3\x5b\x79\x53\xe5\xb7\xee\xdf\x9a\x65\x4d\xbb\x60\x94\x84\x0f\x49\x59\xd9\x62\x09\x8f\x0a\x3f\x6e\x1d\xe3\xe1\x17\xda\x1d\xc0\xf2\x45\xb1\x84\xd3\xc5\x59\x12\x62\xe4\x97\x8f\xdf\x68\x7c\x9d\x68\xdb\x18\x2b\xc5\x68\xad\x6c\xbb\x70\x8f\x14\x09\x0a\xd4\x1d\x17\xfc\x66\x33\xe0\x8d\x5a\xee\xda\xa0\x4c\x21\x65\xf2\x66\xfc\xc0\x1f\x89\xac\x80\xfb\x97\x21\xcd\x31\x86\xe7\x42\x08\x0b\xc2\xba\x52\xc3\xc3\x74\x93\x17\x7f\x19\xae\x3f\xe3\x62\xfd\xa6\xf7\x43\x8c\xf8\x11\xab\x14\x75\x8f\xef\xed\x0a\x10\x5d\xfb\x0d\xbd\x6e\x0b\x07\x9d\xe9\x23\x82\x7d\xbc\x2a\xaa\x8f\xf9\xdd\x57\x6d\xdb\xdf\xf3\xb5\x75\xdc\x33\x00\x70\x4b\x67\x16\xb4\xc2\x1f\x78\x9f\xac\xd2\x49\x70\xec\x40\x29\x74\x65\xd1\x5d\x7f\x6a\x04\x07\xc1\xfc\xaa\x0e\x5e\x69\x6c\x30\xcb\xba\x01\x48\x16\xbc\xe6\x4f\x18\x29\x76\x0c\xb4\x7a\xe9\xf5\xb3\x0e\x0b\x90\xa5\x94\x43\x63\x56\x40\xf7\xc0\xd4\x19\x7c\xe0\x39\x32\xb6\x65\x48\xa6\x15\xbd\x2a\xae\x3f\x7f\xa4\x75\x05\xaf\x37\xac\xdf\xe8\x40\xb8\xe3\x80\xb4\x80\x82\x01\x1a\xeb\x71\x8b\x87\xd9\xca\x4f\x37\x9c\x45\x3a\xef\x1c\x66\xcb\x77\xc4\xe6\xaf\x5f\x1d\x5b\xbe\xf2\xab\xba\x6d\xa0\x17\xc4\xd5\xa7\xa7\xcf\xf0\xee\x5f\x2c\xe0\x47\x0f\xcf\x8e\xe9\x7a\xbc\xfd\xcf\x5c\x99\xf6\xf7\xe2\xfa\x1f\xf0\x38\xd0\xee\x6e\xb9\x16\xfc\x65\x07\xbe\xa3\x25\xf7\x74\x90\x97\xd7\xbf\xbc\x35\x75\x8b\xfb\x85\xf8\x7e\xd5\xf2\x80\x00\xda\xf4\xe8\x15\x32\xe0\x45\xdf\x6f\xa3\x11\x9f\x9d\x9d\x9d\xf8\x52\x07\x21\xfc\x11\x37\xbf\xce\xe1\x2d\x84\x33\x58\x0d\x40\xe0\xc0\x91\x24\xc0\x35\x23\xe8\x1a\xba\x7a\x0e\xab\xdc\x01\x7b\xf0\xf5\x2b\x37\x07\x67\xf5\x00\xff\x73\x0a\x9b\x8f\x38\x6f\x3d\x34\x78\xd5\x89\x60\xb3\x11\xc5\x06\xc7\x51\xb7\xeb\x45\x07\x20\x37\x02\x4d\x21\x60\xa3\xef\x3a\x93\xc7\x0e\xa0\xf2\xb2\x6d\xf0\x6a\xd6\x9b\x62\x65\x70\x06\x0c\xa1\xdc\x18\xba\xcf\xda\x2d\xe2\x8b\x5d\xf7\xb1\xdd\xae\xe8\x2b\x13\x95\xbb\x5e\xb3\x3a\xe2\x07\x78\x21\x99\xdd\xc0\xbe\xd3\xd3\x75\xfa\xfc\xec\x24\xa7\xf7\x8b\xca\xce\xbb\x76\x33\x7f\x6c\x6c\x69\xfc\x6f\xf7\x0a\x98\x0d\x20\xd9\x06\xef\x04\xf4\x4a\x83\x1e\xe4\xaf\x9e\x1e\xe5\xff\xeb\x1f\x7e\xff\xfb\x59\x7e\x42\x08\x05\x06\xcb\x01\xbf\xc3\xa5\xc7\x8a\x88\xbd\xe8\x02\xf9\xb7\x69\x4c\xfa\x1e\x00\xda\x66\x3c\xc4\xc7\x0e\x74\xe2\x06\x70\x6f\x7e\x8b\xf1\xca\xad\xfc\x7b\x1a\xeb\xff\x34\x1f\x0a\xa0\xee\xcd\x0c\xee\xdc\xc3\x59\x86\x45\x70\xd5\xe8\x3a\xc6\x33\x13\xea\xfa\x49\x48\x5d\x4b\xed\xa9\x67\x59\x6e\x9d\xf4\xe0\xd8\x90\x05\xbd\xab\xdd\x66\xfe\xcc\x61\x68\x80\xb0\x23\x2e\x94\xdd\xe5\xf9\x3a\x7e\x85\x8e\xa1\x69\x81\x1b\xb8\x8a\x5a\xd9\xfc\x45\xcb\x2c\x82\x27\x36\x8f\xe4\x20\xe0\x6c\x0c\xd2\x8e\x78\x44\xe6\x86\x33\xc4\x3b\x77\x95\xb7\x08\x1c\xee\x50\x6d\xd6\x9e\x9f\xd7\x55\x63\xf8\x29\x3f\x94\x3b\x47\xb4\x02\xbe\xea\xf0\x90\x40\x77\xe6\x03\xdd\x89\xb0\x2a\x5c\xbb\x2d\xb0\x5f\x8f\xfd\x3d\xc5\xad\x7b\xfc\x02\xde\xe3\x55\x3d\x58\xbd\x83\xd4\x0b\x62\x80\xae\x2d\x87\x95\xa0\xe7\x3e\xc0\xa7\xab\xa1\xb3\x34\x1f\x9e\x12\xe1\xce\xba\x5d\x01\x50\xe3\x76\x02\xca\x92\x17\x10\xf8\x85\xcb\x02\xf6\x23\x19\xd1\x01\xe7\x0f\xf2\x7d\xd4\x60\x3c\x51\xad\x8a\xef\xc3\x50\xd4\x44\x05\xe2\xb6\x14\xf9\xf9\x40\x50\x00\xd0\x6a\xf1\x66\xc0\x83\x52\x16\xb3\xdc\xa3\x7f\x6e\x47\x27\xb0\x34\xc4\x29\xe3\x2b\xbe\x2e\xf0\x3b\x5e\x7f\xac\x23\x28\xdb\xe6\xb4\x05\x80\xef\x4a\x83\x68\x03\x69\x13\xd8\x0d\x62\x41\x90\x2c\xae\xa5\x33\xd8\x19\x80\x7b\x00\x18\x40\xc9\xd0\xcf\x2c\x3b\x87\x9f\xc8\x29\x95\x0b\x99\x7f\xdd\xb6\xef\x60\x01\x1e\x22\x96\xd7\xff\xb0\x80\xdb\x4a\x7a\x98\x0f\x75\x4a\x4f\xa9\x1d\xcc\x64\x57\x0f\xb2\x11\x3b\xfa\x71\x4b\x3b\x97\x7e\x3a\x46\x6e\x40\x7b\xc5\x1b\xad\xdf\xe9\x36\x5e\xff\xbd\xac\xd6\x80\x18\x97\x15\xe1\x5d\xa0\x7d\xf0\x0b\xac\xbb\xae\x96\xb2\xcb\xfe\x08\x23\x22\x26\x38\x8f\xc3\xa1\x6f\xef\xbb\x5b\x30\x55\x7b\x7c\x86\x28\x94\xb8\xef\xe8\x1d\x04\x71\xd9\xf7\x03\x44\x1f\x2d\xed\x6f\x44\xb2\x6c\xdb\x12\xf7\x9d\xa9\x22\xa6\x88\x2c\x31\xc3\x05\x60\x4a\xc0\x9e\x38\xa4\x72\xc5\x7a\x0b\xf0\xc2\x0a\x83\x1c\xd7\x90\xf9\xbc\x52\x0e\x82\x68\x42\x6e\x20\x35\x78\xf3\x70\x16\xc9\x44\x75\x9e\x33\x66\x4a\x80\x43\x17\xc9\xc7\xe2\xb2\x32\xef\xc3\x0b\xc8\xf2\x14\x6c\x72\xca\x32\x8f\xbc\x5d\xd6\xd5\xba\x60\xdc\x4f\xfd\xff\x09\x00\x50\x64\x17\x76\xb2\x3f\x99\xe8\x29\x6e\x49\x04\x9c\xf0\xb4\x30\xd4\x22\xd6\x6d\x80\x81\xeb\x94\x5b\xb2\x07\x54\xf3\xb2\x42\x7a\x83\xd8\xab\xa2\x41\x2c\xb8\xc1\x5b\x8a\xfd\xf0\x4e\x72\x1b\x44\x4e\xda\x8e\x1e\xd1\x16\xfe\x7c\xa0\xcb\x9d\x09\x73\x2d\xac\x2d\xf3\x5e\x2f\x10\x5b\x33\x41\x43\xa4\xcd\x8d\x74\x6a\x5e\x5c\xb4\x1d\x8a\x0c\xec\x06\x4e\xd7\x9f\x34\xbd\xef\x80\x74\xd7\x45\xfe\xe3\xe3\xf9\xb7\xb0\x3b\xf0\x83\x0e\x19\xd8\xd2\x4b\xc0\xd7\xeb\x8a\x89\xb3\xa4\x37\x38\x90\xcd\xf5\xa7\x1e\xd0\xa9\xa0\x18\x9e\xe4\x2e\x6e\xae\xde\x39\x31\x69\xb8\x43\x54\x93\x90\xd4\x21\x23\x27\x4f\x43\xf4\x91\x9e\x85\x2e\x0f\xab\x71\x0f\x3b\x45\x3e\x04\xf5\xf1\x84\x84\x8f\x5f\xac\x81\xda\x53\x66\x9e\x69\xbf\x0c\x0e\xb2\x5f\xac\xab\x7e\x71\x8e\x4f\x59\x39\x7f\x0a\xf5\x50\xac\x87\x98\x79\xc9\x00\x07\x0f\x23\x71\x54\x77\xa0\xda\x9d\xef\xf2\xdb\x97\xc2\xc6\xfd\x01\x1f\x25\xc4\x25\x55\x8d\x97\x00\x05\x14\x97\x22\x3e\x43\x4e\xc0\xb6\x48\x81\x15\xca\x44\x1d\xe4\x9e\xa3\xc7\x03\x47\xfc\x88\xbd\x2f\x01\x46\xf0\xd4\xda\x73\x14\xf0\x21\x1b\x00\x54\x42\x7e\x1b\xc0\xed\xc5\x4b\xdc\x64\xd7\x25\x94\xae\xdb\xe5\x50\xd5\xe5\x2c\x53\x76\x0b\x98\x2d\x01\x22\xe1\x4d\xc6\x87\x14\xf3\x5d\x0d\x41\x19\x51\x0b\x40\xb2\xd1\x62\xb4\x2f\xcf\x0c\x28\x47\xc8\x1d\x74\x8e\x86\x0e\x79\x03\xe8\x05\x1a\x5e\x7f\xc2\x0b\x4e\xdd\x38\x2a\x1d\x37\x05\x08\x8d\xd5\x45\x48\xa8\x33\xcd\x99\x08\x3e\x62\xd2\x52\xe6\x16\x00\x32\x20\x35\x78\x87\xa0\x77\x9b\xdf\x7f\x08\xff\xcd\x6c\x71\x69\x98\x80\x58\xeb\x79\x3d\x41\x09\x19\x9e\x97\xf0\x18\x63\xd6\x3d\x5a\x64\x74\xf1\x76\xee\xd9\x14\x60\x0b\x69\x92\x2e\x5b\x41\xcb\x0e\xc8\x7b\xd8\xf9\xa3\xca\x34\x97\xa6\x01\xa2\xe2\x9b\x1c\x88\xe3\x02\xd1\x83\x69\x56\x80\x31\x08\xaf\x40\x97\xb8\x15\x17\xc5\x15\x20\x06\x80\x02\xc0\x0b\x22\x01\x02\x92\x1f\x6e\xe7\xf5\x2f\x5d\x0f\xaf\x1e\x3d\xc1\xd7\x9f\xe1\xcc\x8c\x3f\xec\x98\x2c\xd6\x43\x22\x84\x17\x51\xb8\xe3\x49\x66\x3f\xa1\x24\xfa\x4d\x36\x30\xd7\xd8\xd6\x25\xf2\x21\xe9\xd5\xcc\xdb\x29\x32\xd2\xc9\x5c\xb4\x5d\x78\x15\xed\xfb\x0a\x0e\x7a\xe1\x64\xdb\x0b\xe2\xe4\x3f\xf4\xf3\x23\x91\x3b\xd1\xf5\xa1\x22\xbe\x97\x8f\xb5\x66\xb6\xb9\x22\x88\xb3\xf3\xe7\x55\xcc\x3f\x66\xf6\xa2\x7d\x4f\xa2\x62\xad\xc0\xd4\x01\x09\x89\xa3\x9a\x28\x63\x5e\xb5\x35\xdc\xbe\x16\xdf\xc3\x4b\x6d\xf0\x2a\xe4\x46\xa1\x82\x7e\x87\xbe\x61\x54\xe0\x89\x79\xd0\x44\xe0\x09\x9f\x58\xde\x2a\x53\x12\x71\xab\xcd\xe8\xc1\x20\x51\x3e\xbe\x2b\x00\x86\x22\x46\x9c\x01\x24\x91\x88\x92\x47\x7d\xd2\x00\xc7\x9d\x2c\x25\xfb\x49\x64\xfb\x6f\xb2\xf1\xd4\x48\xb4\x65\x55\xb6\x05\xeb\x36\x28\x08\x9a\x3f\x1a\x10\x39\x40\x53\xc0\xc8\x17\x6f\x02\xc1\xfa\x42\xa4\xad\x2c\x60\xa7\xa7\x81\x1e\x6a\x15\xaf\x3a\x12\xfb\xc2\x6c\x91\x2a\xdf\xd8\xf5\xfc\xd7\x7f\xfe\x17\x30\xc7\x00\x93\x28\xb4\x72\x6f\xc9\x1f\xf3\x5f\x3f\xb1\x42\x41\xf5\x06\xdf\x64\xb6\x45\xf4\xb3\xf8\xba\x4e\x9e\x34\xf5\xf5\xa7\x8f\x80\x4d\xbf\x49\xe8\x13\x16\xfc\x6f\xb6\xfd\xfc\x18\x29\xbc\xa6\xc7\x77\xf2\x20\x12\xc6\x30\x3a\x08\x64\x35\x40\xe5\xe5\x81\x74\x0b\xe1\xa6\x40\xbe\x12\x05\x72\x23\xba\x85\xa8\xf7\xaa\x47\x82\x61\x34\x32\xbd\x0c\xc1\xb8\xb3\xfc\x38\x60\x36\x89\x4b\x08\xd9\x0d\x14\x73\x44\x93\x6a\xe2\x59\x59\xa4\x49\x36\x66\xb3\xc4\xae\x0d\x1c\x21\x5c\xcd\x5f\x00\xd7\x6c\x4c\x06\x3c\xd5\x9a\x2e\xa4\x3c\x58\xcf\x4c\xde\xd6\x24\x86\x6e\xe1\x61\x0e\x85\x45\x54\xd5\x04\x55\x7f\xfd\xe7\x33\x40\x01\xae\x76\x3f\x84\xb5\xff\xa8\x7a\x1c\xc0\xa6\xef\xa1\xea\x0b\x91\x73\xc4\xfb\x0f\xb3\xbe\xfe\x4c\xb4\xa0\x61\x62\x60\xa6\x4f\x28\x53\x87\xc4\x38\xe1\x26\xe8\x59\xbc\x6e\x58\xcf\xa1\xf7\x9c\x45\x6f\xc1\x56\x58\x44\x4d\x80\xaf\x2e\x2b\x9c\x53\x91\x7f\xbf\x7c\x78\xdb\x7e\xff\x60\xf9\x30\x39\x99\xcd\xb6\x1b\xcc\xb2\xc0\x59\x2f\x01\x95\x9b\xb7\x84\x2c\x0d\xce\x9f\xe5\xcc\x48\x00\xc1\x12\x80\x0c\x24\x52\xe9\x76\x99\xe3\xfc\x54\x30\x80\x6a\x32\x23\xc2\x39\x98\x1a\x09\x6d\xa0\x7d\x40\x1f\xad\xe8\x3a\xd3\xed\x52\xa8\x67\x12\x90\x36\x8a\xe1\x1d\x5a\x5e\x54\x4b\x78\xba\x89\xba\x12\x65\x4e\x9b\x4b\x71\xd9\x26\x15\x98\xcc\x3a\xd5\xe6\x0c\xd0\xbe\x36\xa0\x4c\x6c\x5f\xd0\x63\x62\x11\x90\x36\xc5\x01\x30\xcd\xf8\x5e\x2b\x28\xd2\xb7\x29\x38\xa4\xda\x08\x26\xb4\xdb\x75\x05\x5c\xef\x34\xfc\x23\x78\x11\xbd\x08\x97\x8f\x1f\x41\xba\x12\xb0\xe3\xd7\x9f\x19\x43\xe2\xa1\xd1\xcb\x43\xcb\xe5\x63\xc1\x1b\x50\xc2\x08\xb6\xc2\xed\x3d\x47\xee\x90\xb4\x17\xd1\xa9\x18\xbb\x45\x9d\xc3\x1f\x00\xf0\x1a\xa0\xe5\x00\x6a\x2f\x0a\xbb\x18\x1a\x39\x61\x60\x7b\xe8\x5e\x3c\x03\x7c\x48\xe4\x05\x41\xdc\x98\x7a\xba\xeb\xce\xfc\x1e\xbf\xc8\x78\x4b\x15\x4a\xf0\x8a\x9e\x56\x58\x0e\x7d\x23\x97\xca\x5b\x37\x34\x3b\x21\xca\xcb\xe8\x2c\xbd\x7c\x24\xd2\x02\x8c\xba\xe1\x9b\x48\xe0\x18\x90\x46\x07\xd0\xf1\xc7\x7c\x05\xdb\xf3\x4e\x38\x65\x07\x45\xf9\xb2\xed\x49\x40\x45\xbb\xac\xab\x71\xb5\x59\x00\x4a\xf0\x45\xfb\x89\xaf\xcf\x8e\x25\xc6\xbb\x2b\x72\x1e\xa2\xe5\x2c\x61\xc1\xde\xa0\x5c\xeb\x0b\x44\x2c\xb2\x41\x40\xc6\x50\xbb\x12\x65\x60\x0d\xc0\x91\xbf\xa4\xb3\x8c\xe6\x8a\x53\xee\x75\xc6\xeb\x82\xa6\x1c\xce\xf8\x6e\x67\xee\xc9\x9c\xe9\xc5\xa4\x91\x94\x55\xea\x70\x08\x40\x70\x2b\x00\x2b\xe8\xb3\x55\x22\x25\x52\x68\xda\x10\xb7\xbc\xd2\x16\x28\x35\x8a\x10\x8b\x23\x26\x56\x28\xd6\x88\x60\x13\x2b\x0a\xdf\x3a\x3a\x45\x44\x0a\x1f\xb6\x15\xf1\xb7\xb2\x6a\x66\xee\xda\x59\x32\xb6\x4a\xb5\x68\x99\x47\xc9\x32\xbb\xdd\xf3\x72\xed\xfb\xb6\x5d\x00\x05\xd0\xf5\x48\xe1\xd4\x6d\x03\x44\xf7\x50\x8e\x97\xec\x65\xed\x28\x6d\x00\x8e\x05\xa9\xc0\xfc\x7f\x43\x3d\x41\xb3\x20\x41\x89\x7f\x2e\x85\xab\x45\xf0\x23\xba\x5c\x24\x29\xc6\xba\x4e\x1a\xa7\x28\x43\xc4\x15\x0c\x03\x5c\x5e\x0e\x7f\x5f\x5e\xff\x62\x55\x40\x3f\x83\xa7\x19\x4f\xf2\x0d\x63\x29\x7c\x9c\x75\xa4\xe0\x36\x32\x06\xa3\x55\x32\xb6\x72\x95\x99\x71\x01\x52\xa2\x3a\xaf\x70\x4a\x76\x12\x48\x77\x1d\xe9\xc7\x55\x91\x6e\x9d\x7b\xf7\x94\x06\x75\xaf\x99\x22\xda\x12\xae\xd8\xd2\x11\xa6\xbe\x81\x08\xd5\x3c\xcd\x0a\xab\x05\x5a\x09\xaa\xc0\x12\xdb\xb2\x80\x35\x5e\x19\x3b\x3f\xbd\xfe\x0c\xdb\x0a\x04\x63\x06\x85\xd8\xe0\x49\x89\x82\x12\xa8\x84\x32\xc5\x37\xd9\x6b\x38\x82\x17\xd3\xdc\x1e\xd2\x3b\xf1\xa7\x58\x4f\xfd\x84\x36\xe3\xf1\x4d\x17\x2d\x3b\x99\xe2\x17\x5f\x19\xd2\x20\xfe\x69\x30\xf5\x25\x5e\x3d\xc0\xef\x1d\x20\xa4\x2e\xbd\x1d\xa7\xa7\xcf\xce\x88\x8b\x8d\x34\x2a\x47\x35\x70\x13\x24\x46\x38\x7d\x96\x3d\xeb\xfb\xad\x7d\xdd\xc1\xf5\x24\x21\xf5\xeb\x57\xc7\x30\xe4\x55\xdd\x16\xe5\x6b\x2f\x0a\x27\x9e\x2d\x3b\x33\xc5\x26\x5d\x12\x8a\x18\xb6\x6d\x76\x08\x14\x5b\xb2\x11\xc8\x56\x77\x4e\xf5\x4e\xfa\xf6\x27\x5f\xc1\xb9\x66\x2f\xcc\xfb\x47\x5d\xd1\xac\xa4\x5f\x7a\xbd\xbd\x8a\xa7\x2b\x36\x45\x76\xd4\x6e\xe0\xbd\x39\x1d\x36\xc0\x28\xa3\x99\x82\x1d\xe0\x3a\x50\x5f\x2b\xfa\x22\x15\x9e\x03\x68\xa0\xc1\xc6\x73\xd3\xd8\xe2\xad\xe1\x9d\x0e\xbe\x1f\x5d\xb4\xd5\xca\xc0\xc5\xc5\xdb\xc9\x5f\x64\xa7\x70\x8e\x3c\xff\x33\x40\xad\x34\x11\x27\x94\x17\xdd\x65\x76\x44\x2a\xbc\x7e\xce\xff\x22\x94\x39\xc1\x8b\x21\x23\x86\x9f\x27\xb5\x63\xed\xec\xe7\xac\xa8\xb7\x17\x05\xf1\x10\xae\x6a\xa2\x07\xf4\x62\xc5\xc3\xfa\xbc\x68\x60\x7d\x1d\x6a\x0a\x00\x15\x61\xab\xbb\xf7\x17\xf7\xe2\x6e\x4a\xc0\xe5\xda\x15\xb6\xa5\xa6\xf8\x48\x49\x97\xf0\x8c\x53\x37\x40\xc6\xa1\xde\x95\x59\x25\xb8\x23\x50\x05\x1e\x1b\x04\x43\xd2\x93\xa1\xe0\xee\x2d\xbc\x88\xd0\x7f\x4e\x8f\x1c\x12\x65\xa2\xb8\x69\x80\x35\x65\x85\xc9\xcf\x40\xab\x7d\x34\xe3\xf1\x50\x03\x07\xc7\x73\xfd\xdf\x2d\x3c\xb7\x50\x8b\x18\xcf\x51\x4d\xa7\xfa\x04\xca\x02\xb1\x98\x45\x6e\xd7\x2f\x1d\xdb\x15\x1f\xf6\xb5\x23\x55\x19\xb0\x46\x1f\x00\x8b\x8f\xda\xf2\xd3\x16\x1c\x80\x50\xf0\x93\x2f\x9b\x70\x8c\xd0\x0c\x15\x3c\xe3\x46\x78\x0b\x7c\x1d\x92\x67\x97\xbb\x66\x55\x23\x96\x5a\xae\x0a\x40\xad\x45\x7e\xe7\xb6\xbd\x83\xbd\x36\xef\x80\x9a\x6d\xa4\x05\x33\xee\x48\x93\xb5\x0d\x3c\x9e\x65\xfb\x9d\x5a\xdf\x2c\xa0\x6b\x16\x50\xa0\x04\x41\x05\x87\xf2\xe8\xf0\x51\xcd\xfc\x7b\xe1\xc5\x0d\x63\xed\x6c\xfc\x88\x35\x88\x10\x2b\x32\xfd\x98\x79\x6b\xa2\xc5\x12\xa8\x85\x45\x5f\xbc\x33\xcd\xfc\xbf\xf0\x99\x43\xd4\x88\x87\xad\x5c\x31\xb1\x1f\x58\xc6\xd7\x6e\xc6\x7a\xd0\xbd\x4d\x43\x41\xc9\xa8\x39\xf0\x01\x7b\x5b\x27\xe6\x3a\xe3\x0e\x7a\x40\x40\xfb\xc7\x67\x74\x34\x6e\xc9\xe0\x40\xad\x60\xf9\xe5\x97\x52\x39\x57\x85\xca\x6e\x70\x57\xda\x99\xdf\x3b\x77\x0a\xfe\xc8\xa6\xc5\x0a\xfe\x58\x5c\xcd\x96\x04\xcc\x00\xa9\x1d\x19\x7d\x05\x42\x28\x92\x1c\x86\x6f\xa9\x05\x46\xe7\x1f\xc4\xe6\x38\xf9\x09\x8a\x38\x7a\x52\x9e\x54\x65\xeb\x04\x5a\xac\x1e\x0b\xb5\xe0\xd1\x73\x33\x31\x20\x00\x24\x3e\x84\xff\xd6\x11\x81\xf2\xdf\x56\xc8\xdf\x4c\x8e\xe8\x9e\xf4\x7f\x61\xbc\x98\x5b\x14\x4b\x3b\xbc\x09\x04\x03\xa1\xe0\xad\x6a\x4a\xb6\xa1\xc3\xfb\x43\x00\x32\xcb\x80\xc6\xe9\x51\x0c\xc2\x8b\x4f\xc5\x74\xc0\x03\x56\x84\xcb\x11\xf1\x57\xa8\x7e\xe9\x44\x2e\x77\xfd\x8f\x1a\x69\x45\x60\x30\x80\x19\x16\xf5\x82\x80\x1a\xab\xb2\x74\xd5\xc0\x71\x3f\x46\x74\x40\x03\x56\xa4\x44\x6a\xe3\x5d\x71\x74\x28\x6a\xc7\xdf\x99\xab\x98\x14\x25\x2a\x6d\x43\x6f\xc0\x16\x9e\x23\x22\xbd\x2e\x89\x60\x5a\x09\x55\x4f\x6f\x37\x3c\xdc\x28\x1c\x44\xb1\x16\xf2\xff\x54\xe3\xca\xf5\x48\xc6\x4c\xee\xcd\xb9\x84\xb5\x8c\x9b\x1f\xa0\x4e\x0b\xa8\x1e\x78\x32\x49\x90\xcf\x62\x4a\x87\xe5\xf2\xbd\x47\x84\x2a\x00\x7b\xfd\x19\xb8\x55\x78\xf6\x63\x79\x24\x3f\xfc\xb8\x9e\x55\x20\x84\xcc\x2c\xda\x4e\xe2\xae\xb3\x45\xe0\x99\xe3\x45\xa1\x2b\xc0\x98\x7e\x87\x08\x7b\x0d\x0d\xde\x9d\x91\xd4\xeb\x40\x45\x31\x38\x07\xa0\xd6\xba\xa2\xab\xe9\x2d\x04\x70\x68\xec\x39\x6c\x02\xfd\x66\x1b\x34\xd8\x6a\x1e\x14\x79\x41\xb4\xf8\x8b\xc6\xf4\x07\xc9\x78\x87\x07\x8b\xe5\x62\xd1\x70\x05\x72\xfb\xa8\xd5\x47\x32\xb9\x75\xf0\x41\xea\x0e\x1d\x0f\x01\x2b\x59\x28\xe1\x99\x18\xab\xe1\xa1\x0e\x8a\xa7\xbf\x64\xa5\x6e\xac\x7d\x6b\xcd\xd8\x48\x6e\xb1\x24\x92\x29\xb8\x11\x28\x2d\x85\xc7\x38\x67\xeb\xa0\xbe\x6a\x82\x0b\x01\x74\x2c\xde\x9f\x37\x19\x3c\x33\xcd\xda\x88\x76\xd0\x89\x30\x01\x5e\x44\x85\xfa\x16\x5e\x8f\x45\xdb\x28\x7d\x4d\x2a\xbd\xda\x9b\x88\xa2\x19\x62\x24\xdf\x13\xf3\xc4\x2b\x6f\x9c\x98\x6f\xaf\xff\xb1\x24\x23\xce\xf3\xb6\xae\xdb\xf7\x28\xff\x3b\x35\x40\x73\x00\xad\x67\x6c\x86\x74\x11\xa0\x0a\x54\xe8\xf5\xc5\x8a\x95\x96\x54\x0f\x85\xd5\xa7\xcc\x08\x03\x65\xc5\x65\xdc\xb0\x03\xe8\x97\xdf\x8f\xcd\xdb\x82\x40\xcf\xf2\x07\x14\x39\x6d\x66\x84\xa7\x91\x99\xe8\x2e\x11\x3c\xfd\x5d\xc7\x57\x59\xf0\x3a\x7f\x66\x35\xab\x6b\xb3\x2d\x7a\xc0\x5c\x0d\x33\xc6\x34\x59\x6a\x0e\xc5\x9d\xbc\x15\xcd\x08\xd5\x53\x9f\x4e\x6a\xb0\x45\xed\x6d\x4f\xcf\x75\xf6\x93\xda\x71\xbe\xc9\xd4\xd0\x93\x0d\x81\xa7\x6d\xfa\xe4\x0c\x58\x8b\x9b\xc9\x95\xb6\x73\xa2\xd9\x2d\x9b\xd5\x90\xbc\x12\x36\xbc\xc4\x02\xfa\x61\xc8\x78\x0a\xb7\x17\xc5\x5f\x76\x7e\x18\x1a\x63\x93\xd8\xf7\x65\x2c\xf2\x05\x04\x66\x90\xd9\x57\x34\x27\xac\x1a\x1c\xc7\xfc\xf5\xeb\x1f\x1f\x67\xd9\x76\xc0\xd3\x5a\xc4\x33\xd6\x43\x6c\x75\x25\x2c\x59\x3a\x9b\x16\x36\x18\xeb\xea\xa3\x95\xb8\x41\x45\xdc\x40\xea\x60\x62\x89\x7b\x60\xb3\x2c\x71\x9d\x4d\x6c\xcc\xd0\x99\x9a\xfe\x2c\x4a\xe6\x48\x03\x9d\xbc\x5c\xe0\x48\x4d\x8f\xb2\x1f\xe1\xd5\x0d\x92\x4b\x11\xdb\x5a\x93\x91\x77\x40\x34\xb9\x07\x5c\x64\xa7\xe5\xfc\x38\xd4\x82\x4e\x73\xca\x74\x19\x1b\x7f\xaa\x8e\x67\x06\x7e\x74\x04\x0a\x00\x49\x68\x87\x1b\x2a\x01\x85\x1b\x9d\x36\x40\xc7\x71\x48\x01\x7e\x8c\x03\x3a\x86\x69\xd8\xa2\x0e\xc4\x1d\xc0\x21\x69\x84\xe0\x6b\xa7\x36\xc2\x71\x05\xc7\x02\x3b\x23\x62\x11\x69\x16\xda\x30\x7d\x4a\x67\x7a\xeb\x77\x5b\x97\xe7\xc4\xf5\xd2\x2b\x9a\x56\x56\x21\xdf\x13\xa4\xb2\x68\x3b\xd4\x1a\x0a\x8f\x99\xf5\x32\xa6\xa9\xe9\x0d\xe3\x57\x7d\x65\x90\x3c\x04\xcc\x45\x02\xbc\xbc\xf0\x12\x02\x12\xde\xc2\x15\x19\x48\xdb\x8a\x7f\x00\xe4\x8f\x8c\x93\xc5\x66\x41\x2c\x18\x96\x57\x2c\x54\x62\x9d\x81\x33\x9d\x20\x91\x25\x19\xc2\xec\xb2\x9a\x78\x34\xb6\x95\x70\x96\x12\x4e\xa9\x3f\xd8\xbe\xdd\x28\x3a\x54\x0d\xbc\x8e\x11\xd8\x82\xe0\xb6\xb4\xad\x15\x25\x05\x57\x3f\x65\xa6\xb1\x15\x25\x45\xab\x38\x54\xce\xcb\x77\xaa\xe7\x39\x52\xc4\xa9\x25\x88\xdc\x52\x98\x0e\xac\xa8\xe9\xb5\xa9\xbb\xb4\xae\x63\xe4\xd6\xfd\x42\x09\x6d\x2d\xaa\x0d\xb2\xbc\x4f\xbc\x8d\xad\xca\xb6\x3d\x5b\x43\x55\x9a\x59\x3c\x33\x07\x48\x93\x2a\x42\xf7\x24\xdc\x0c\x5d\x0a\x31\x1e\xcb\xc9\xa5\x09\x05\x14\x6d\x5d\x4e\xdb\x50\x71\xc7\x64\xcd\xef\xbe\xb3\x49\x7f\x2c\x00\x42\x39\xc8\x22\xaa\xe5\x55\xe7\xcd\xa8\xfe\x04\xd5\x3e\x1e\xd4\x13\xea\xc5\x2c\x5d\x44\xb2\x3b\xae\x25\xef\x86\xbf\x2e\xc9\x66\xe4\xc0\xa4\x10\x35\x66\xd9\x3a\xd9\xbb\xad\x10\x82\x83\x5d\x1d\xcd\x35\xc0\x59\x32\x87\x7f\x17\xc6\x8a\x06\x61\xce\xc8\xaa\x20\x4a\xad\xc9\xa6\x24\x51\xe2\x3d\x21\x0d\x7e\x40\x62\x82\xcc\x1c\xcb\x9b\x9b\x32\xfb\xa5\x8f\xc5\x24\xdf\x05\x94\x0c\xe0\x85\x6d\x41\x78\x8b\x2c\xd4\x3f\x12\x2a\x61\x2d\xef\xf8\x95\x20\xbb\x35\xa4\xc5\x18\xff\x63\x19\x6c\x19\x90\x43\x28\x0a\x3a\xd1\xce\xb4\x44\x64\x8f\xcf\xe1\x32\xa8\x91\xad\x1b\x50\xaf\x19\x57\xd1\xdb\xe5\xe6\x0c\xdf\x10\x3b\xfb\xa7\x72\xcf\xfa\xb8\x2e\x2f\xf4\xb0\x0e\xb9\x88\x2f\x62\x37\xad\x27\xf6\x60\xe5\xf8\x40\xb2\x93\x05\x19\x30\x72\xcb\x40\xde\x8e\x9d\xce\xf2\x5f\xff\x09\x34\x93\x11\xd9\x2d\xa1\xce\x3f\xa6\xd3\x51\x98\xfd\xf5\xd3\x93\x7a\x72\x5c\x00\x5d\x5b\x95\x8e\xaa\x4d\xc1\xf7\x9b\xac\x28\x4b\xba\x64\xbc\x45\x87\x00\x39\xb0\x18\x81\xd9\x1b\x97\x45\xad\xe3\x96\x7b\x6b\x2d\x22\x55\x1e\xf2\x46\x37\xab\xef\xdc\x0a\x9c\x02\x8f\x44\x2f\xbf\x41\x77\xb7\x85\xf9\x7c\x00\x98\xf9\x12\xd5\xdd\x2c\x98\x74\xf0\xfe\x46\x53\x4d\x0f\x18\x91\x26\xed\xc2\x04\xc6\x94\x1b\xe6\x88\x3e\x7f\xc7\x02\xf2\x0f\x87\x44\x2e\x4f\xf7\x92\x3e\x11\xa1\x48\x60\x47\x1c\x07\x73\x55\x75\x65\xd9\x96\x63\xe5\x5a\x3b\xf8\xb1\x8a\x78\xe4\x09\xce\x05\xbe\x43\x62\x8b\x78\x45\xc1\x2f\x30\xcf\xb6\x69\x3f\xae\xd0\x38\x0e\xc7\x12\x65\xc7\xf7\x28\x6d\x6f\xd6\x0f\x43\x45\x6d\x81\xee\x7b\x7f\xfc\xfe\x81\x7c\x42\x9d\xb3\x1d\xea\x9e\x60\x79\x3d\x5c\x7f\x2e\xc4\x3e\xfe\xd9\xb0\xe4\xad\xfd\xbe\x08\x5c\x7a\xd8\x63\xa0\x0b\xe6\x4c\x7e\x3d\x88\xe1\xea\x61\xc5\xbb\x11\x35\x40\x73\xa5\x1a\x55\x84\x78\x44\x03\xa0\x01\xf6\x03\xaa\xd9\x50\x91\x6c\xc5\x15\x7c\xc3\x6d\x73\x9c\xb0\xd2\xd8\xa1\x74\x48\x6c\x37\x48\x31\x20\x0a\x18\xaa\xae\x4c\x8c\x1c\xa4\xa0\x29\x24\xf3\xb5\x13\xa2\x8d\xa8\x93\x58\xb2\x95\xb4\x17\xcd\x3e\x99\xb0\x39\x21\x95\xb6\x9f\x90\xd6\xd3\xb7\xd5\x48\xd2\x2c\xb0\x10\xdc\x70\x79\x23\x75\x71\xcc\x97\x08\xc0\x15\xe9\xb5\x16\xc4\x87\xdb\xe2\xd0\x9e\x2e\xc4\x21\xbe\x47\xc8\x68\xf3\x3e\x1c\x8d\xf6\x2c\x46\x79\xe8\xe3\x25\x60\x44\x18\xcf\x4f\xa3\x51\x2b\xc1\xfc\xb2\xad\xd1\x4e\x90\xed\x48\x6b\xb1\xe2\x41\xf7\x85\x92\x4a\x3d\x51\xa8\x98\x2d\x44\x6c\xa3\x61\xfd\xc2\x8f\xc3\xe1\x52\x84\xc6\x1b\x7e\xfd\xcb\x07\x60\x50\x19\x9b\xc1\xc2\x0e\xf5\x1a\x9a\x86\x05\x43\x74\x6c\xaf\xf5\x4c\x89\x98\x64\xc1\x0f\xf9\xb3\x61\x35\x74\xc5\x51\xd6\xf6\x05\xe2\xcd\x2b\x56\x77\x11\x87\x8b\x4a\x61\xb2\xf8\xa6\x13\xe9\x91\xa4\xf2\x37\x92\xe7\xa6\xf3\x42\x36\x88\x31\x0e\xbc\xe0\x22\x5c\xb2\xf9\xff\x9e\x97\x70\x3b\x6c\xd6\xb7\xef\x00\x12\x83\x1e\xce\xb0\x40\x78\xa7\x5d\x8d\x1c\xf2\x60\xee\xd0\xa3\x8e\x98\x4f\xf4\x08\x40\xed\x5e\x22\xac\x81\xa0\xea\xd0\x06\xa2\xc3\x5d\xad\xa7\x10\xc6\xe5\xf5\xe7\x66\x35\xd4\xed\x14\xce\x18\x9a\x65\xd5\x10\x7f\x7f\x59\x61\x25\xa4\x5b\xa9\x28\xa4\xa8\x60\x30\x19\xca\xed\x54\xe9\x1a\x94\x85\xc7\x90\xe4\xee\x62\x17\xb4\x51\xc1\x52\x71\x63\x68\xaf\x88\x10\x39\x64\x9f\x18\xa5\xd7\x81\xeb\x65\xdc\x22\x36\x45\xda\x98\xd1\x0d\xe3\x6c\x6a\xcc\xfb\x6f\x83\xad\xb7\xbc\xf7\x36\x01\xd6\x3a\x3f\x3c\xf9\xd1\x2b\x47\x5d\xa7\xdc\x92\x9c\x1e\xd8\x3a\x25\x34\x70\xe7\xce\x73\xb1\x4c\x6d\xd4\x73\x47\x59\xc4\x3c\xb0\xf3\x98\x09\x24\x34\x89\xce\x8d\x67\xe9\x16\x13\x2f\x64\xea\x23\xef\xb1\xa1\x6b\xd2\xb2\x91\xb3\x9f\x09\xd9\x04\xd0\x1c\x08\xa9\x35\x39\xb7\x1d\x11\x01\xf9\x61\x24\x07\x5c\xb5\x5b\x91\x11\xf1\xd6\x51\x6f\x41\x67\xba\xed\x70\x8f\x3f\xbd\xd0\xdb\x6f\x51\x98\x59\xb7\xce\xfe\xc1\xa1\x20\x5e\x83\x43\x42\xe1\xf9\x4e\x62\xa2\x33\x1d\x4d\x0e\xf9\x44\x46\x9b\x6e\x39\x85\x9d\xcc\xce\x19\xa7\xd6\x99\x8e\xe4\x82\x0a\xa5\x11\x5b\x7d\xa2\xac\x6d\xeb\x9b\x4f\xe2\xab\x70\x75\x31\x19\xb6\x73\xf0\x29\x5a\xcc\xa1\xae\xfc\x05\x9d\x12\xd9\x4e\x19\xb1\xe6\x50\x36\xb2\x47\x0a\xff\xfa\x17\xa6\x62\x8a\x40\x00\x14\x5c\xda\x4c\x67\xa4\x7a\x7b\xbd\xc4\xde\xb6\x48\x2a\xa8\x0d\x4f\x11\x0a\x58\x42\xe2\x74\x08\x6c\x45\x89\x3e\xa5\x2d\x29\x1a\x92\xd2\x5f\xc1\xa1\x2b\x69\xf0\xe2\xa5\x27\x05\xac\x09\x1d\x15\x57\xa6\xfb\xc6\x99\x3e\x27\x13\xf3\x5c\x9c\x4c\x91\xa5\x22\x71\x2d\x31\xd1\x0e\x6b\xd0\x33\x15\xad\x44\xeb\x06\xb8\x98\x27\x6e\xd1\x4c\x3f\x0f\x64\xfd\x7e\x01\x04\xf1\x07\x70\xa2\x6c\xce\x1f\x11\xd7\xd9\x4f\x28\xf7\x7c\x93\xb1\x0a\xe1\xc4\xcb\xf6\xbd\x7a\x6c\x97\xce\xdf\xeb\xcf\x84\x7c\xc2\xdb\xb8\xee\x90\x16\xb5\x42\x05\x58\x36\x07\x0b\xcc\x38\x91\xb3\x83\x9b\xd8\xa3\x54\x78\x63\x36\x80\x4e\x96\x35\xf1\x3f\xba\xc1\xd7\xff\x20\xef\x31\xb7\xcb\xb3\x0c\x4d\xf5\xc9\x86\xef\x6a\xfe\x27\xf9\x13\xfd\xc3\xa9\x18\x4b\x03\x1f\x36\x93\xda\x36\x7f\x6f\xb7\x80\x03\xe0\xb9\x02\x48\xbd\x35\x54\xf0\xb9\xcc\xd1\x8a\x15\x09\xad\x0a\x25\xa5\x30\x0e\xd4\x78\x38\xea\x0d\x3d\xf3\x57\x4c\x3c\xc5\x86\x62\xef\xcd\x12\xa1\x9a\x7d\x15\x88\x36\xef\xa7\xdd\x27\x05\x2f\x15\xa4\x44\xde\x3d\x8f\x5c\x26\x62\xc7\x33\xc1\x88\x00\xba\xb8\xbb\xbb\x44\x53\x7e\x74\xac\x6e\xef\x65\xe8\xae\xe7\x8e\x64\x44\xc9\x2a\xad\x46\xb5\xd0\xf4\x33\xa4\x67\xf7\x7a\xa7\x53\x1c\x0b\xa4\x46\xbf\xc9\x68\x62\xa4\x11\x60\x2b\x83\xa7\x53\xa1\x0b\xa8\x12\x39\xcc\xa9\x9d\xab\xd6\x43\xf7\x39\xfa\x3a\x3a\x42\x76\x9e\xc0\x3e\x00\x2a\x02\x5b\x9e\xfc\xd2\x1f\x3c\x2b\x1a\xa8\x2f\x06\x41\x7d\x9f\x56\x5d\xb5\xe5\x7b\x45\xc5\x18\xd9\x42\xa3\x5a\x50\xc1\xba\xea\x51\xef\xdf\xb9\xcd\xf1\xb2\x2d\xb8\x2d\x1a\x11\x83\x40\x76\xe6\xea\x66\xe8\x5b\xde\x58\x33\x3f\xc6\x7f\x01\xf1\x68\xc1\xb8\x13\x9c\x15\xb0\xf4\x17\xe2\x14\x5a\x6b\x03\x58\x7d\x49\xf6\xa6\xf8\x8f\xfc\x1a\xb5\x66\xba\xda\xcd\x82\xb0\xa1\x88\xba\xb8\x05\x6a\xa7\xda\x05\x00\x62\x2f\x31\x44\x18\x4f\x92\xdb\x16\x57\x44\x2f\x33\x9d\x0b\xc2\xc4\x55\xb2\x28\x93\xdc\x0f\x35\x49\xa6\x83\xe4\x33\x0a\xbf\x96\xe6\xbc\x00\xc0\x10\x1d\xcc\xfc\x15\xaa\x5d\xb6\xa4\x13\x23\x7f\x2f\x09\x90\x01\xa8\x15\xb8\x94\xf9\xc9\xd0\xad\xe1\xa5\x0b\xcb\xf8\x5c\x5e\xc1\x1d\x47\x0a\xd9\xcb\x4a\xc5\xb1\xd8\x1b\x72\x11\x5f\x51\x34\x52\x4c\xc8\x4a\x3b\x42\x05\x66\x77\x59\x60\xe4\x06\xfe\x43\x19\x18\xb5\xea\xce\xef\xc2\xbb\x43\x7c\xed\x3d\x6d\x03\xf4\x70\x87\x0f\x53\x6c\x8c\x14\xb4\x49\x2a\xf2\x3c\x03\xd6\x9a\x2c\x22\xae\x58\x4c\xb3\x42\xef\xb5\x46\xc8\xc5\x40\x94\xac\xfe\x3d\x68\xfd\x4f\x61\x06\xbc\xdc\x60\xa6\xfd\x13\x15\x6e\xaf\x1a\x44\x23\xd7\xff\x3f\x53\xde\x16\x3a\x07\xb4\xe6\xe4\xe2\xef\xd1\xe2\x61\x42\x7b\xb4\x2e\x3e\x62\xe9\xd3\xa2\xb1\x74\x55\xe0\x4f\xfc\xaf\xe8\x82\xe0\xac\x56\x17\x62\x9e\xda\x9e\x2f\xe8\x1c\x59\xaa\x13\x6a\x67\x89\x39\xaf\x57\x45\xf3\x91\x35\x5c\x79\x7d\xfd\x19\xdd\x38\x9d\x95\x09\xfa\xa7\x94\x31\xd2\xc2\xae\xc8\x52\x7a\x5a\xe7\x34\xad\x8e\xff\xd7\x55\x50\xfb\x7b\x9e\x54\x44\x35\x06\x65\xc4\x03\x3a\x16\xab\x9b\x5a\x6c\xa3\x25\x11\x59\xe2\xe8\x14\x41\x60\x96\xf0\xfb\xce\x27\x44\xf4\x3c\x70\x35\x23\x0c\x8e\xa8\x3b\x5f\xd6\x83\xb9\xf5\x50\xa1\x4a\xd1\xb7\x76\x4b\xb7\xea\x39\xfe\xe8\x42\xa7\x75\xfd\x3e\x63\x34\xad\xc0\x7a\x54\x87\xc2\xc7\x60\x7a\x71\x3d\x81\x55\x67\x2f\xa9\xe6\x3c\xde\x2f\xfb\xc1\x0f\x3f\x9e\x91\x91\x93\xb8\x95\x90\x14\x35\x0f\x7d\x64\x67\xae\x6b\xa6\xfa\x2c\x93\x94\x4d\x05\x87\x02\xf8\xb7\x37\xe9\x66\xe7\xd5\x86\x3c\xa0\xba\x18\x54\x44\x3e\xeb\xbb\xf3\xfe\x2d\x68\xb5\xe9\x7c\xbe\x6b\x99\x83\x73\x65\x39\xf0\x2a\xdb\xdc\x0b\xf0\xa3\x48\x02\xda\xa5\x28\xe3\x9f\xbb\x53\x83\x3b\x5a\x7b\x77\x18\xb9\x68\xf4\xc8\xa0\xd9\xf4\x5b\x3c\x63\xba\x2f\x00\x1b\x54\xca\x7f\x6b\x29\xfb\x6b\x03\x96\x3c\x9f\x33\x19\xcf\x42\x6c\x75\xd1\xd3\x10\x3c\xa9\xe9\x0f\xe2\x29\xb2\x9d\x01\x3a\xf1\xaa\x45\x22\x6f\x7b\x05\xb7\xaf\x79\x07\x74\x1d\xb2\x0d\xbe\x20\xa0\x8a\xe9\x53\x19\xd6\x16\x83\xa9\x13\x38\x48\x42\xf8\xff\xe3\xff\xfd\xff\xf2\xff\x25\x3f\x82\x3d\x38\xea\xbb\xfa\xfe\x91\x4a\xe6\xb4\x4b\x3c\x10\xe9\x25\x66\x5e\x80\xd7\x24\xbc\xe1\x35\xc5\x97\xd5\xba\x42\x26\x94\x8b\x9d\x42\xd9\x46\x0a\x96\x52\xb5\xd1\x84\x61\x54\x39\xdd\xd1\xce\x10\x7a\xc9\x50\x22\x20\xcc\x05\xf9\x4e\xf8\x17\x15\x6e\xd8\xea\xdd\x02\x51\x94\x99\xff\x40\x52\xaf\x57\xd7\x9f\xb6\x70\x10\x42\x6e\xf4\x17\x95\x95\x87\x84\x21\x79\xd7\x63\xa3\x61\x94\x16\x68\x99\x08\xa4\xa2\x27\x0e\x9a\x34\xae\x12\x53\x0a\x88\xb5\x1a\x23\x66\x60\xe4\xc0\x67\xb3\xed\x80\x36\x86\x08\x41\x21\x15\x72\x02\xa5\x13\xa7\xc7\x90\xc6\xde\xef\x3b\xfa\xa3\x09\xc1\x02\x28\x58\xc8\x14\x1d\x89\xf7\x81\xed\x1c\x23\x1b\xf7\x5f\x3f\x5d\xb2\xcd\x2a\x99\x3c\xc0\xa6\x96\xe6\x9b\x2c\x23\x93\xec\x23\x36\xc1\xce\x82\xd7\x33\xeb\x3b\x63\xe6\xd7\xff\x4f\xb7\x6c\xeb\xec\xbc\xaa\xd1\x72\x57\x0c\x1c\x30\x16\x4a\x5f\xac\xe7\x4f\xa1\xb4\x13\xcd\x1f\xd9\x39\xc0\xe0\x3d\x5a\x17\x03\x03\xc0\x55\xd1\x36\x01\x3e\xd8\x0c\xaa\xdb\xf9\x13\xf9\x38\x19\x11\x09\x03\x28\xa5\x81\x93\xea\x62\x69\xea\xb0\xdd\x06\x2e\x98\xed\x91\xb1\x82\x5b\xa6\x7f\x66\x6c\x36\x8a\x01\x9e\xe8\x5f\xd8\xa0\xda\x14\x96\xec\x22\xf8\x8f\x8c\xb4\xb4\x5d\xf1\x1e\x66\xf3\x9e\x7f\x00\x04\x50\x7c\xad\x67\xf0\xef\xf5\xdf\xd1\xb0\x93\xcb\xc9\xed\x0a\x6b\xa2\xd7\x95\xab\x4d\xdc\x09\xdd\xa1\x13\xfd\x8b\x3f\xa0\xdd\x78\x8d\x44\x28\x9f\x83\xd3\xf7\x59\xe7\x39\xd1\x0a\x93\xc1\xf7\x85\xcc\xc6\x5b\xa6\xce\xb3\xcc\x94\x78\x66\x33\x0a\xad\x85\x8a\x66\x36\xb4\x55\xe3\x56\xf9\xca\x2a\x46\xae\x70\x3a\xa0\xa1\x71\x52\x01\xff\xe1\xcf\x6c\x21\x9d\x7e\xdf\x76\x86\x56\xc5\xaa\x2c\x8b\x6c\x09\x7a\xf0\x61\x29\x8b\x9a\xc8\xe4\x09\x49\x75\xab\x4d\xe0\x19\x26\x2b\x16\xec\x19\x4d\xdb\xf1\x05\xa1\x21\xd0\x2c\xfb\xef\xb5\x33\xa9\x8d\xc6\x23\x92\x83\x9c\xee\xa2\x99\xd1\x65\x0b\xa7\x67\x82\x9d\xd2\x9a\x9b\x01\x6e\xc7\xd2\x2c\x60\xac\x42\x69\x38\x34\xe6\xb2\x3e\x98\x04\x3d\x12\x44\xd6\xe1\x46\x12\x07\x9b\xb3\x7d\x57\x4b\x16\xa9\xbc\x02\x17\xea\x25\x19\x80\x10\xea\xd2\x9c\x23\x41\x8d\x45\xd2\x3b\x77\x13\x20\xd3\x14\x13\xf8\xa0\x56\xb2\xd8\xc0\xfa\x58\xba\x56\x41\x83\x5f\x67\xa0\x7a\x9a\x5e\xe9\x05\xba\x94\xbe\xef\xaa\x5e\xc5\x69\x32\x1d\x36\x63\x15\xf9\x86\x90\xc1\x80\xd6\xfa\xa1\xbb\x69\xd9\xc5\xf4\xaa\xd9\x4e\x84\xe6\x17\x89\x40\x14\x50\x89\x62\xd9\x2b\xf6\x70\x40\x8a\xa4\x11\xb9\x46\x31\xa8\x7a\x5b\x73\xee\x0a\xdd\x22\x83\x51\x1d\xa7\x3d\x3f\x21\xb9\x9d\x48\xfe\xa3\x97\xf3\x00\x86\x45\xc9\x9b\x58\x33\x92\x1d\x3d\x46\x9f\xb9\x42\xe0\xb4\xc4\xa4\x3c\x98\xe5\x27\xec\x90\x22\x5b\x9a\x74\x70\x69\xd8\x6b\x9a\xd4\x89\x15\x1b\x07\xc2\x96\x6c\xa3\x4e\x3a\xd3\xab\xce\x48\x66\x08\x0f\x5b\x1b\xc0\xfa\xca\xd4\x0b\xb2\x8b\x9a\xaf\xd4\xe4\x41\x3f\x12\x4a\x71\x57\x67\x64\xa6\x3e\xbe\x3a\x28\xe0\xee\x61\x55\x4e\xd9\x01\x5b\xfc\xbd\xee\xc8\xc3\x3b\x41\xb5\xb0\xc6\x1d\x7f\xdb\xd1\x1e\x20\x34\x51\x08\xbf\xa6\xa6\x43\xe1\x37\x99\xea\x86\x0d\xee\x45\x0f\xea\xb6\xbd\x88\x5e\x48\x78\x66\x50\x08\x8a\x6a\x09\x0d\x3c\x13\x9c\x9f\xf4\xc4\xfb\x5c\x5f\x01\x92\x63\xe0\x96\x7b\x19\x6f\x42\x15\x1a\xa4\x36\xec\xba\xbd\x29\x54\x40\xa2\x24\x28\x37\xbd\x8f\x7b\x70\x8b\x1c\xbd\x9c\xbc\x44\xc7\xf4\x0f\xae\x0c\xe3\xfd\x4d\x55\xd8\xc2\x3a\x4f\xec\xde\x4b\xb5\xd8\x5d\x89\xa4\x0d\x3c\xa1\x2b\x7f\xa7\xf1\x49\xc9\x25\x26\xdf\x2c\x44\xb6\x6a\xa8\x47\xb6\x48\x1c\x06\x21\x50\xfa\xd0\xfc\x69\xac\x70\x4f\x12\x93\x98\x14\xd4\x05\x63\x2e\x8d\x3e\xcb\x11\x93\xa0\xd7\x6d\xda\x19\x41\x3b\xd3\xe7\xb5\x46\xb6\xe6\x8a\x49\x06\xeb\x8c\x08\xe9\xaa\x5e\x39\xc5\x96\xe2\xb9\xd8\xd0\x58\xc0\x44\x6e\xc8\x15\x92\x09\x05\x5f\xd8\xe3\xc2\x69\x5b\x99\x01\x22\xc1\x8a\xbf\x4b\xb0\x93\x40\xb4\x0b\x75\x1b\xcc\x37\xba\x70\x7b\x47\x75\x7b\x41\x83\xba\x39\x24\x5b\xa1\x32\x07\xe1\xc2\xd2\xfe\x1d\xf9\x73\xd3\x48\x84\xc5\x31\x8e\x05\x50\x81\xe8\xb0\x05\xe4\x89\x6c\x58\x8a\xde\x5c\x14\x00\xcb\x38\x1c\xfd\x1f\xaf\x8a\x80\xac\xbf\x71\x28\xbe\xfe\xe5\xe2\xfd\x45\x30\x70\xaa\xa9\xf4\xa3\x2a\x3e\x0d\x4c\x52\x98\x98\xa3\x99\x6c\xb6\xe6\xe3\xf5\xdf\x11\x61\xd3\x83\x52\xb7\xb3\xfd\x92\x2c\xef\xce\x46\xca\x55\x02\x78\x94\x51\x40\xc9\x2f\x53\x43\xb5\xee\xbe\x38\x04\xb8\x72\x02\x5d\x15\xfe\x27\x17\xc8\xb6\x28\xfe\x14\x3f\x26\x24\xab\x1c\x5a\x8b\x37\x22\x01\xcd\xc8\xfc\x5f\x57\x8f\x6f\x87\x9c\xb7\x03\xb4\x5d\xbb\x0b\x67\x27\xa8\x15\x91\x0c\xba\xe0\x93\x50\x8d\x81\xc0\xbd\x6d\x34\x45\x89\xd6\xe3\xe7\x43\x61\xb2\xda\x85\x18\x50\xf1\xc3\xab\x61\x19\xbc\x68\xfe\x01\xb3\x4b\x26\x86\x89\x83\x9c\xb8\x1b\xe2\xcb\x02\xbc\x6d\x87\x25\xc0\xa2\xc3\x9a\xfc\x53\xd9\x3c\x8f\x0b\xc4\xf2\x9b\x06\x77\xb4\x99\xf5\xa3\xdb\x90\x4a\xb3\x62\x0f\x31\x31\x64\xd8\x1a\x7b\xc3\xb1\x4f\xa7\xda\x66\x4a\xe2\xce\x52\x52\x57\xcb\x23\x2f\x7e\x41\x85\xfe\xeb\x39\xaa\xff\xc4\xc3\x5f\xcb\x50\x18\x01\xcf\x20\x86\xfb\xf1\x85\x9b\xd8\x5b\xcb\x95\xd3\x9b\xf4\x14\x4d\x3c\x5d\x11\x87\x65\x38\x44\x49\x57\x15\xf4\x00\xe8\x95\x62\x03\x5a\x29\xd7\xa8\x05\x18\xa2\x97\xf5\xe3\x95\x23\xfa\x83\x6f\xb3\x11\xa9\x1f\x7c\xc3\x1b\x8e\x9f\x89\xd1\x33\x53\x35\x56\x40\xe7\x77\x0b\xe9\xe3\x18\x88\x0a\xf2\x69\x9d\xaa\xe9\x38\x08\xcf\x40\x24\x43\xf9\x1a\x38\xdc\x64\x2d\x1e\xce\x57\xd4\x11\x27\x2b\xb7\x5b\xd3\x2c\x26\x86\xb5\x12\xa8\x29\x5d\x49\x6b\xd1\x69\x7a\xaa\xfe\x0a\x83\x2e\x97\x71\x7d\x78\x5d\x31\x80\x31\x50\x0c\xf8\x2f\x89\xf8\xc7\x33\x75\x95\x74\xa2\x85\x54\x4e\x96\xee\xea\xe1\xca\xd3\x3a\xfc\x42\xcb\xb3\x3c\x79\x88\x72\x4a\x7c\xcc\x7a\x92\xa3\xef\x8b\x2d\x5a\xa6\xc6\xe1\x40\xf4\xa8\xf0\x92\x45\xc3\x49\x97\x3c\xa8\x49\xba\xe4\xee\x34\x4c\xb4\x9d\x49\xd0\x20\x8a\x71\x43\xce\xe1\xcd\xdb\x01\x3d\x97\x29\xa8\x17\xdc\x01\xb1\x28\x19\xc1\x45\xda\x0f\x1a\x7d\xcd\xcf\xca\xe2\x12\x25\x07\x0d\x9b\x1a\xa8\x83\xb5\x9b\xa9\x84\xc8\x63\x62\x83\x3c\xab\xf9\x45\x65\x7f\xf1\xfc\x16\xef\x82\x56\xbf\x25\xe2\x12\x47\xd3\xb4\xce\xce\x6e\xe7\x54\x0b\xf4\x03\x9c\xed\x9a\xe4\x84\x56\x20\xec\xe8\x4b\xd6\x39\x58\x33\x7f\x6d\x95\x4f\xf9\xaa\xa6\x8a\x7d\x3d\x6b\xea\xb0\x1f\xf9\xab\x46\x18\x17\x99\xdf\x50\x55\xa0\xbd\x13\x6e\xe3\x78\x36\x3c\x0a\x5d\x95\xbe\x58\xce\x6f\x97\xa3\xcb\x41\x17\x43\x3f\xa6\x37\x41\xe4\x13\x0c\x2c\x29\xe4\x85\x1f\x91\x5a\x20\xbd\x43\x3f\x7f\x91\x9c\x68\xa8\x8f\x48\xdb\xee\xc1\x1a\x69\x8d\x64\x84\xeb\x7f\x04\x38\x24\x52\x79\x24\x1d\xa4\x17\xb9\xc8\xd3\x49\x40\x8d\x75\x05\x35\x82\x11\xfc\x3d\xed\x92\xca\x4e\x8e\x3c\x51\x3e\xc3\xd0\x41\x22\x82\x39\x73\x9e\x00\x55\x20\x8c\x99\x6a\x63\x25\x52\x3a\x9c\x3a\xb0\x81\x6e\x9a\xe4\xab\x5e\x4d\xb5\xe0\x1b\x5c\xa2\xb9\x38\x36\xc0\x3b\x8c\xd5\x51\x5a\x34\xdd\x00\x99\x08\xd8\x1b\x24\xea\xa8\x01\xc5\x41\x41\xd3\x9f\xb8\xae\x45\x37\xfd\x97\x1d\x3a\x79\xa6\xab\xc6\x4f\x33\x82\xd0\x7e\xfe\x9c\x1d\x7b\xd8\x2e\x28\x5d\x12\x55\x44\x14\xa4\x15\x11\x3c\xd7\xc3\x68\xe9\x54\x0f\x3a\x81\x3e\x52\xce\xac\x2c\x5c\xef\x2c\xe7\x9c\x9a\x8a\x29\xec\x54\x43\xf6\xb9\xbd\xb1\x39\xd2\x3c\xf8\xb0\xa2\xe1\x19\xcd\x12\x7e\xa0\xfa\x7c\x0c\xf9\x7e\x34\x57\xdf\x70\xac\xd3\xb4\x01\xde\x31\x3a\x94\xb9\xdc\xb0\xfc\xf6\x4f\xdf\xbe\xe1\x63\xf1\xb6\x7d\x3f\xfd\xfe\x0d\x90\x9e\xb7\x7f\xfa\xc3\x1b\x32\xe9\x1b\x35\x5e\x9c\x17\xef\xcc\x44\x0f\xd4\x50\x6b\x93\x88\xa9\x1d\xac\x73\xb9\x70\xd4\x82\x7b\x13\x3e\xf4\xee\xe3\xa9\x86\xdc\x88\xb1\x01\xe1\xf4\x43\x1e\x28\xc2\x05\xa5\x06\x89\x63\x5c\xe0\xfa\x1c\x36\x0b\xd9\x03\x4b\xa8\x82\x77\x80\x5c\xa3\xb4\x39\x7f\x46\x8d\x4c\x3f\xbf\xa3\x5b\xd4\xfa\xe5\xff\x8e\xe2\x9b\x03\x72\x0a\xd7\xae\x0e\x01\xdc\xd8\x45\x14\xfd\xf5\x9f\x28\xc0\xee\x58\xee\x5e\xb2\x39\xb0\x89\x04\x40\x7e\x06\x7f\x74\x93\x6c\x9d\x41\xe1\x21\x62\x08\xcf\x8b\x38\x8e\x62\x16\x23\x3e\xfa\x21\x69\x17\xe2\x2f\x3a\x21\xa9\x21\x83\xa1\x9f\x4e\x54\xb9\x33\xb4\x9f\x5c\xeb\x95\x29\x96\x5d\x95\x7e\xdb\xd9\x53\x17\x57\x97\xa7\x59\x21\x4d\x2b\x26\xa7\x03\x7b\xfb\x33\x4e\x01\x78\x1d\xd8\xd8\xaa\x44\xa8\x02\x30\xb9\xe5\xf6\x98\x7e\x3d\x24\x88\xc1\x7d\xfe\x39\x9e\x8d\xf4\xc0\x43\x7f\x75\x1f\x22\xc2\x80\x5a\xd4\xcb\x06\xf1\x5a\xcb\xe1\xe8\x51\xf8\xe9\x71\x1d\x4b\x16\x55\x78\xf0\x75\x83\x6c\x89\xca\x15\x12\xda\x0d\xac\x91\xc1\x5a\x0c\x5a\xc6\x7f\x97\xfe\xfb\xd8\x72\x45\x3e\x68\xa0\x48\x8d\x5f\x40\x72\x89\xc8\xd8\x96\x63\x50\x1a\xf5\x5e\xf0\xdc\xe0\xd0\x54\x9d\x35\xb9\x1a\x7e\xb6\x0d\x46\xef\xd3\xc0\xca\xd2\x3d\xc9\x3c\x25\x82\x86\x4e\x35\x11\x69\xe8\x44\x8a\x4b\xd4\x9a\x50\x5c\xbb\xe4\xf9\x0f\xc3\x59\x4c\x13\x63\xb0\x7c\x5e\x77\xbb\x8b\x5c\x63\x13\x23\xb8\x98\x3b\x68\x0c\x0f\xa5\x74\x7d\x83\x57\x69\x44\x12\x70\x83\x89\x95\xf1\x07\x11\x96\x91\xe5\x5a\xf2\xc9\x47\x14\x71\x2a\xf7\x94\x6a\x08\xfa\x48\xec\xdf\xf6\xd7\x74\x0e\x08\xec\x24\x4b\x91\x2c\x1c\x85\x31\xc4\x0e\x05\x56\x2c\xda\xd4\x50\x16\xe5\xe7\x53\xef\x71\xe4\x96\x87\x5e\xce\x89\xa9\xdb\xf4\x44\x54\xe0\xab\xf3\xe5\x19\x25\xf6\xb8\x01\xd6\x04\x58\xea\x2b\xf4\xca\x10\xcc\x19\xfc\xf6\xef\x67\xd1\xf7\xc5\xea\x02\x2f\xbc\xa7\xd6\xee\xf8\xe8\x42\x4e\x3a\x81\x10\xab\x52\xfb\x2d\xc2\x25\x45\xcf\x41\x9a\xf8\xce\x44\x57\x25\x5c\x0b\x24\x25\xe7\x3f\x27\x5d\x69\xcc\x4a\xee\xf0\xe7\x8c\xd5\x44\x8e\x9b\x6c\xf3\x50\x61\x24\x1f\xd1\x9c\xb3\xe8\x8c\x13\xda\x1e\xd1\xef\xc2\xc9\xca\xa7\xab\xf1\xb9\xb9\xba\x68\x92\x82\x62\x37\x34\x4c\x51\xb3\xf8\x44\xa4\x98\x73\xce\x06\x9b\x03\x2c\xa9\xb5\xc8\x2c\xe9\x1c\xe3\x60\xce\xf1\x3f\xe9\xa0\xfc\xef\x7c\xe5\xe6\xd6\x36\x52\x25\xd2\xb5\x39\x1d\x1b\xc5\x5c\x91\xc5\xb7\x68\xe5\x30\xd4\x70\x4a\x48\xff\xf1\xdf\x6c\x07\xa1\x15\xfa\x0b\x24\xa2\xfa\xd6\x8d\xf3\x02\xcf\x1d\x5f\x28\x1d\x70\x96\x1f\xe3\xcc\xdd\x2a\x35\x46\x45\xa3\x9d\xa0\xeb\x76\x98\xd4\x64\xfe\x73\x24\xed\x89\x36\x02\x05\x8b\x46\xf2\x81\xb8\x2e\xbf\x0b\xc9\x09\xc0\xa0\x0f\xa8\xdf\x07\x48\x53\x94\x82\x4d\x7f\x47\x3f\x18\xa7\xca\xfe\x84\x4c\xe6\xc4\xd9\x12\x0a\xe2\xa3\xa2\xb7\x36\x3f\x1f\x2c\x33\x3f\x38\x46\xa9\x92\x0f\xbc\x49\xdf\xa3\x66\x53\xb1\x36\xfd\x8d\xf0\xa8\xa5\x7f\x70\xa5\xd2\xf3\xc6\x74\x6b\xa5\x29\x78\x00\xe9\x1a\x17\xf4\x9b\x3b\x87\x96\xff\xf1\x46\x21\x0e\xee\xca\x42\xb1\x33\x21\x95\xa3\x10\x55\x47\x95\x62\x29\x8f\xff\xc2\x92\xa6\x43\x15\x0f\x79\xb1\x9f\x56\x92\xa7\x1c\x8e\x9e\x16\x14\x64\x1e\xa1\x97\x54\x64\xe5\xe1\xce\xf2\x45\x23\xaf\x9a\x92\xe4\xfa\x24\xc4\x0f\x2c\x4f\xd1\xc8\x54\xb7\x62\x16\xed\xd6\xfc\xa9\x96\x07\x40\x23\x9f\x7e\xfd\xf4\x64\x34\x12\x7b\x6e\xf8\xf8\x50\x11\x26\xe2\x1e\x80\x54\x46\x05\x20\x99\x24\xa3\x85\x26\x07\x90\x55\xc5\x5c\x04\x75\x22\xc3\x95\xd8\x89\x95\xdd\x02\xeb\x40\xe6\x99\x40\x88\x4a\x48\x89\x8b\x22\x50\x6a\xa5\xee\x5c\x25\x87\xa7\x7f\xa7\x6b\xaa\x2c\xe0\x02\xb3\x7a\x47\x6e\xef\xce\xae\x84\xf6\x85\x3c\xe0\x25\x57\x49\xe8\xc3\x8a\x44\x20\xe0\x2a\xb2\x0f\xf5\x81\x76\x45\xfa\xb8\x22\x6d\x82\x04\x64\x66\x5c\x48\x47\x86\x18\xcf\x5f\x56\x78\x85\x17\x64\x2c\x47\xfb\xe6\x2c\x65\xd3\x33\x72\x46\x34\xee\x28\x26\x62\x27\xbb\x1e\xc9\x74\xe9\xc6\x4e\xa3\x60\x66\xbb\xfb\xd5\xfd\x44\x31\x88\x5f\xf0\xee\xd1\xd2\x9c\x37\x07\xda\x77\xbe\x29\xe0\xbd\xaa\xa5\x53\x09\xcd\xc6\x2e\x29\xa4\x48\x1b\xf5\xcd\xfd\x45\x58\xe8\xa9\xde\xf7\x09\xe4\x40\x90\x3f\x34\x72\x93\xa9\x99\x08\xaa\x7f\x7e\x0d\x8b\x2f\xfd\x82\xe1\x2e\x88\x41\x62\x0a\xe9\xf0\x05\x7e\xb3\xc2\x95\x97\xcd\xf2\xeb\xe0\xe4\x42\xd7\x22\x89\xa9\xc8\xb1\xe2\x22\xe8\xbc\xfb\xbb\xdb\xe5\x3d\x17\x4d\x8f\x9d\x8d\xd2\x08\x3d\x35\x07\xd2\x4e\xe0\x52\x60\x17\x1e\x94\x81\x34\x36\x0c\x77\x12\x68\x11\x15\xae\x14\x24\x9a\xea\xfe\x9c\x05\x26\x11\xc1\xab\xe8\xa5\x14\xc1\xe7\x49\xe9\x4a\xf0\x7d\x5a\xc2\x92\x56\x28\x95\xe1\xc2\x18\x28\xe1\xe0\xed\xa2\x1c\x00\xd4\x10\x7d\xe3\xb3\x74\x4e\x01\x01\xc4\x88\x2f\x9d\x06\x30\x74\xc8\x4f\xa4\x7d\x2b\x7f\x13\xaf\x09\xc5\xf2\x17\xa6\xa0\x28\xc0\x9d\x41\xab\x38\x27\x11\xa5\xed\xd5\x10\x1f\x5d\x4a\x36\xcd\xa2\x01\xf8\x65\xd9\xb3\x3f\x4c\xde\x9e\x5d\x7f\xee\x87\xba\x0d\x3f\x8c\x4d\x76\xc3\x8f\xba\xe8\xa7\xe1\x82\xf3\xbb\xaa\x57\xbd\x17\xaf\xd2\x04\x36\x4e\xe1\x17\x17\x5b\x5b\xba\x5b\x70\xe2\x0c\x54\x32\x69\x0a\x0d\xd6\x4e\x46\xfb\x1a\xc7\xa7\x3a\xc8\x5d\x18\xb0\x3b\x57\xf0\xbf\xfb\x9b\xcd\xfd\xb2\xbc\x33\xb1\x0d\xb1\x31\x80\xfb\x1c\x9b\x03\xb0\x75\x65\x84\xa3\x83\x8e\x02\xb2\x7b\x7a\x3b\xc9\xf8\xc3\x1f\xdd\x6b\x2b\xb9\xbd\x06\x33\x52\x46\x8b\x3f\x9e\xce\x82\x4e\x95\xe2\x66\x35\xe7\x43\x83\x9a\x98\x82\xe3\x51\x86\x21\xfb\x93\xd3\x4d\x78\x99\xe0\x93\xd0\xfa\xcf\xe5\xa9\xdc\x3f\x5b\xe7\xd1\xe6\x35\x60\x14\x23\x2d\xde\x21\x75\xd6\x21\x26\x69\xf7\x16\xc5\xcc\x43\xe7\x7b\x99\xaa\x24\x48\x3a\x92\x1c\x78\xc1\x61\xe0\xfd\x91\x32\x11\x57\x23\x6e\x21\x70\x14\x9b\xf0\x8b\x99\x1a\x7b\x07\x38\xec\x37\x0c\xc9\xde\x57\xef\xaa\xf9\x9f\xe1\x3f\xf4\xd7\xec\xbd\xa9\x51\xd4\x01\x9d\x44\xa1\x1d\x01\x66\xb1\xce\x37\x51\x25\x5e\xed\x31\x7f\x92\x40\x4f\xf5\xb0\x26\xc2\x1b\x8d\xa5\xd0\x37\x63\x40\x1d\x39\xb9\xac\xb6\xab\x41\x64\x11\x24\xa1\x06\x80\x47\x14\xcb\xd1\x9d\xae\x28\x9d\x87\x68\xfd\xeb\x36\xdf\x98\xb7\x68\x35\x4a\x83\x09\xb0\x9f\x03\x7b\x8c\x41\x2d\xd7\x4a\x58\x52\xd4\x23\x4e\x96\x27\xcf\x33\xd7\x8f\xd2\x4f\x52\x89\x10\xe3\xf4\xc1\x99\xbb\x85\x15\x38\xfc\x81\xeb\x99\x4d\x14\xa2\x1a\x6a\x99\x1e\xdb\x67\xc0\x73\x4c\xe6\x2e\x1c\x50\xbb\xed\x45\x07\x2b\x81\x5d\x55\x54\xc8\x27\xec\x71\x89\xac\x8b\x22\xd2\xd3\xa8\xc2\xa7\xc7\x23\x92\x29\xb7\x0c\x47\xba\x8c\xdb\xac\xf9\xbe\xfe\x7b\x94\x89\x0f\x11\x38\xd5\x27\xd8\xc7\xee\x16\xcb\xa1\xef\xd1\x32\x9b\xb9\xe9\x68\x81\xfa\xed\xc5\xd4\x0a\xd9\x6d\x29\xec\xc1\xf9\xf5\xec\xaa\x88\x21\x05\x56\x66\xf1\x2d\x27\x73\x0a\xe0\x3b\xa0\x99\x98\x9e\x46\xce\x4f\xc8\xe9\x9b\x63\x63\x89\x07\xa4\xf8\x0e\xcd\xfc\xb9\xee\xd3\x5d\xfb\x11\x27\x7d\x83\x5d\x1f\x4e\x92\x69\x83\x8d\x66\xf1\xae\x37\x9a\x4f\x0e\x0f\x23\xb7\x4f\xa5\xa0\xa4\xb4\xa9\x52\x3e\xe3\xdc\x50\x76\xfe\x72\x2b\x31\x82\xdc\x97\x20\xd2\x3c\x31\x0c\xfc\x23\x69\x1e\x55\x9a\x91\x07\x50\x90\x64\x13\xa5\x4f\x3b\xaa\x92\x09\x1a\x83\x22\x92\x3c\xbb\xaa\xe1\xc6\xcd\x8f\xe1\xa2\xed\xa9\x03\x88\x1a\x15\x57\xb0\x11\x3f\x36\xaa\xc2\xf2\x75\x2f\xda\xf6\x9d\x9d\xff\xd9\x2c\xe9\x0f\x5f\xbe\xae\x7a\xfe\x84\x39\xdb\x9e\xc5\xdf\x80\x6d\xae\x56\x93\x49\x3e\x71\x5f\x1f\x5d\x7f\xb2\xe8\x1e\xe1\xaa\x8b\x79\xf5\xae\xfa\x48\xdb\xa9\x4b\x85\x6b\x83\xfe\x0e\x9a\xef\xf4\xd4\x39\x3b\x48\x92\x93\x71\xd7\x58\x1b\xd3\x88\x74\xed\x9a\xec\xe0\x4f\x63\xff\x88\x70\x0c\x7c\xd4\x28\x9b\xd2\x97\x33\x06\x1a\x40\xdb\xcf\xae\x22\x5a\xaa\xf7\x79\x3a\xfc\x37\x31\x7b\x70\xab\xdd\x19\xd3\x26\x38\x2f\x0e\x65\x82\x44\xe8\xd7\x46\x11\x2a\x92\x80\x86\xae\xcf\xa2\xbc\xc4\x27\xb7\x0c\x26\xf2\x16\xf0\xb6\xa1\xec\x4c\xe4\xca\x11\x1c\x28\xde\x19\x11\x8f\x49\x58\x1f\x89\x61\x8e\x1b\x87\x1f\x83\xe5\xa1\xc8\x1b\xb5\x05\x98\x30\x8d\xde\x19\x52\x54\xe2\x5f\x14\x27\x70\x4d\x22\xff\xa8\x3a\x9a\xb4\x25\xd5\xf9\x71\xe1\x72\x5f\x39\xaa\xe8\x92\xce\x49\xa9\x50\x59\x7f\x8e\x66\x33\x6a\x21\xcf\x57\x9c\x99\x87\xa4\x79\x28\x8f\x71\x41\x59\x48\x76\x40\x2f\x20\x8e\x20\x29\x32\x2f\x8a\x35\xb9\x66\x48\xb0\x71\x4a\x96\xd2\x75\x45\xb0\xa9\x2c\x1f\xe3\x31\x7c\x82\xa8\x0e\x90\x8d\xc4\xdf\x08\x55\x75\xd3\x5b\x46\x5d\x2c\x30\x81\xc8\x3b\xa2\xbd\x76\xb6\xcf\xeb\x6a\x8d\xe6\x58\xe4\x46\x14\x5d\xd9\x68\x4f\x27\xfa\x93\x1f\xb2\x71\xbb\xe7\x25\xf5\x68\xdb\x84\xa8\x7d\x2a\x14\x2d\x47\x38\xae\x5d\x57\xc9\xd4\xa4\xe7\x71\x57\x3c\x1b\xdb\x5f\xd5\x64\x77\x5d\xd5\x91\xd2\x5a\xac\xb1\xf6\xcf\xef\xbb\xbd\xbd\xce\x24\xda\x2f\xbc\x76\x14\xae\x77\xb5\x7f\x12\x33\x8a\x02\xac\x6d\x0e\x7d\x98\xdf\xa9\x76\x7e\x1f\x02\xff\x18\xcb\x11\x33\x28\x08\x8a\x77\x83\xe3\xf7\xef\xaf\x18\xf7\xeb\x6f\xf9\x5f\xf1\x06\xc2\x3f\x15\xa0\xd7\x0f\x7f\x53\xf9\x92\x32\x98\xa3\x50\x68\x07\xbb\x9c\x94\x4c\x7e\xfd\x19\xc3\x73\xaa\xb9\xa3\xdf\x94\x00\x04\x89\xa1\x4e\x21\x30\x32\xce\x57\x7f\x7c\xb3\xed\x35\xae\x54\xb5\x1c\xc4\xeb\x59\x63\x6d\x04\x60\x50\x16\x64\xa3\xf7\x11\x95\xe8\xff\x77\xcb\x17\xed\x04\x9e\xfd\x75\x17\xec\x11\x25\x90\xa6\xd8\xa8\x28\x49\xb2\xec\xd0\x85\xa1\x1c\x6b\x71\xb8\x08\x1d\xc6\x38\x95\xc2\x54\xe0\xdb\xf4\x01\x0f\x9e\x2c\x14\xb8\xf5\x22\x78\xc3\x20\xa1\xac\xfe\x09\x7b\x68\xf0\x6c\xea\x51\x9b\xe8\xb0\x56\xbe\xfd\xc8\xfd\x62\x47\x87\xb3\x3c\x44\xb4\x4d\x3b\xf6\xc7\x1e\xcf\x53\x88\x24\x0b\x54\xd2\x7d\xca\xeb\x13\x0a\x2b\xdc\x1c\x50\x85\x30\x76\x02\x21\xff\xa2\x5d\x93\x01\x7a\xd9\x47\x05\xd1\xf1\xed\xc4\x4e\x39\x35\xa7\xf7\x09\x17\x09\x66\x4a\x81\x70\x75\x0e\x76\x40\xfe\x72\xe1\xa8\x8e\xa5\x94\x39\x73\x2c\x0d\x99\x0b\x0a\x43\xed\x79\x41\x66\x76\x2a\xc9\x0a\x6f\x0d\x85\xdc\x9c\x9f\xb9\xd8\x9b\x3e\x68\x29\x3a\x56\x8f\x6a\x4a\xec\x08\x5f\x7d\x6c\xd2\xcf\xa1\x61\xd5\x3b\x32\x49\x58\x2b\x1c\x08\xe5\x32\xb3\x91\x2d\x7e\x92\x96\x69\x62\x96\xd1\x81\x9d\xec\x0b\x59\x00\xfb\x41\xd7\x76\x04\xd5\x00\x5d\xe1\xec\xf6\x0d\xf2\x7b\x18\x04\x1d\xa2\xd1\x85\x51\xc7\x71\xc9\xd6\xbe\x6c\xa8\x71\xe0\xe7\xab\x7c\x20\x59\x19\x7d\x6c\xd5\xc8\x3d\x0c\xb3\x8b\x65\x80\x3f\x2e\x92\x96\x53\x33\x45\x3c\x27\x6a\x43\x2f\x88\x96\x00\xc3\x98\x53\x40\x94\xb1\x01\x37\x2b\x5e\x65\x0a\x6c\x91\x7c\xee\xbb\x11\x29\x11\x5b\xc3\x3b\x59\x31\x46\x9e\x8c\x1e\xf0\xa0\x3a\x83\xc7\xeb\x86\xe3\xca\xb0\x4a\x4c\x5c\xd2\xd3\xf6\x6c\xfb\xb5\xa4\xc8\x39\x83\x41\xaf\x73\x74\x01\xfd\x64\xbf\x9e\x0b\x99\x9c\x48\x72\xb9\x23\x26\xe8\x2a\x0f\xd3\x49\x33\x57\x44\x53\xa2\xfd\xb9\x3d\x26\xaa\x12\x46\xfe\x78\x6a\x39\xe9\x4b\x80\x32\x0c\xba\x96\x6e\x17\x92\xa0\x58\x1e\x79\x27\x3b\x3d\xf2\x97\x4b\x6a\xc6\x9b\x7c\xe1\x4d\x22\x38\x6d\x4b\xd0\xf2\x40\x0d\xec\xfe\x5d\x3b\x3c\xbd\xb9\x11\xe6\xf4\xd1\x31\xf2\x93\xd7\x4f\x1e\x3f\xf1\xc6\xd0\x9d\x61\x94\x6a\xc7\x8b\x8f\x6e\x5d\xda\x63\x70\x72\xe8\xb6\x5b\x34\x24\x5a\xf0\x31\x39\x30\xec\x81\xcb\x4a\xe6\xec\x10\x93\x4d\x54\x5f\x6e\xd2\x35\x44\xf0\x08\x5c\xd2\x41\x2a\xe5\x39\x10\x99\xb9\xb3\x6e\x41\x41\x50\x9b\x20\xac\x95\x26\x39\xaa\x83\x9c\x64\xe4\xb7\xbd\x7b\x7d\xe4\x29\x85\xdb\x76\x16\xc7\x6a\xc0\x07\x2b\x78\x73\x48\x6c\x87\xb4\xc8\x16\x1d\x49\x38\xe1\x12\x05\x05\x34\xb5\xc2\x53\x3a\xc6\x48\xd2\x04\xf3\x18\xbf\x11\x1e\x52\xc6\x0f\xc3\x37\x3b\x19\xa0\x20\x94\x91\x15\x9f\x16\x72\xdb\xaa\x13\x07\x69\x02\xfa\x3d\x91\x33\xc7\x38\x8c\x2d\x36\x44\xdb\x1c\xd8\x6d\x78\xee\xb0\x78\x47\xa4\x71\xfa\x4e\x4d\xf4\xa5\xcf\xe3\x71\xf0\x82\x4d\x5c\x4b\xde\x08\x17\x6d\xba\x24\x51\x05\xc0\xc2\x68\x92\x71\x00\x97\xe0\x91\x36\x61\xe0\x96\x80\x5b\xc3\x14\x3c\x81\x81\x4a\x18\x4d\xb0\x0d\x01\x64\x77\x1b\x6f\x56\x50\x8f\x9b\xb9\xb9\x6b\x98\xbd\x31\x98\x45\xe3\xfb\xc8\x67\x63\xa1\x42\xdb\x4d\x06\x80\x9c\x98\xe2\x64\x9b\x40\xe9\xe5\xc2\x20\x38\x92\x47\xbb\xe9\xa6\xbc\x13\x14\x8c\x35\xf2\xf7\x74\x34\x34\x1d\xbc\xa3\x90\x11\x3b\xb7\x68\x6a\x73\x1c\x84\x87\xbc\x3e\x19\xf0\x73\x2e\xcb\xd0\x40\x5a\x2c\xfa\x95\x1a\x98\x05\x4d\x28\xa5\x83\x8f\x51\x80\x3a\xdf\x65\xb2\xbf\x74\x19\xa2\xe8\xd3\x2e\x40\x69\xe0\x31\x8f\x0a\x03\x0d\x53\x67\x39\x40\xe7\x2e\x5c\x41\xf3\xab\x28\xa8\xfb\x82\x93\xd3\x85\xc1\xbd\xe3\xe0\xee\x75\x42\x20\x1c\xc4\x0a\xc7\x20\x12\x63\x3c\xe0\x2c\x06\xbe\xf7\x2c\x34\x72\xb0\x2a\x42\xa4\x44\xb6\xe4\x39\x72\x15\x32\xc9\x02\xe1\x80\x0b\x9f\x60\x5b\xb9\x41\x4d\x23\xd6\xa5\xa1\x4d\x85\x49\x87\x13\x84\xbb\x09\x44\x36\xa5\x52\x86\x66\x97\xa2\xfa\x6b\x38\xe0\x58\x7e\x14\xd7\xab\xc3\x3a\x40\x7b\xaf\x54\x2d\x7f\xc0\x61\x31\x3b\x4a\x3d\xc6\xc6\x30\xbd\x18\x1d\x9d\xbc\x3c\x3d\xcb\x31\x47\x71\x59\x88\x83\x9e\x4f\x65\x2f\x09\x14\x50\x84\x4f\xfe\x8f\x94\x4e\xd7\x48\x36\xca\x90\x60\xa2\x8c\x85\x1c\x12\xa7\x21\xa1\xf8\x0d\x71\x71\x7e\xd0\x20\x90\xba\x4d\x68\x7d\x11\x12\x28\x5c\x3c\x71\xf5\x46\xfb\x9e\x56\x4d\x2d\x9f\xe8\x5e\x49\xa5\x24\xbc\xea\x58\x87\x41\x2f\x24\x14\xb3\x5f\x76\x45\xb1\xcb\xf6\xdc\xba\xd1\xd8\xfe\x5d\x91\x79\xee\x50\x5a\xa4\x3d\xcc\x28\x15\x2f\x74\x53\xc1\xc3\x76\x35\x3f\x43\xd5\xad\x04\x26\x35\xeb\xe2\x86\xea\x82\x63\x38\x85\xda\x40\xe1\x1e\x30\xd7\x3a\xc1\x81\x73\xf0\x97\xae\x9c\x99\xc5\x92\x22\xb7\xd9\xbc\x10\x41\x59\xe9\x36\xe9\xa6\xd1\x74\x8d\x27\xdc\x09\x27\xb6\xb3\x6e\x8b\x1d\x39\xa7\x37\x4b\x64\x4f\x78\xb5\x82\x89\xcc\x98\xd8\xe4\x8b\xd8\xb7\xf8\x5a\x14\xf5\x9a\x44\x90\x18\xc2\xbf\xa1\x76\xea\xf4\x5c\xa0\xf5\x10\x7a\x38\xb0\x8e\xce\x9d\x4e\xd0\x9f\x1d\x43\xcf\x4c\xb5\xf5\x27\x0a\xec\x53\x55\xd0\x60\xc3\xa2\x2d\xaa\xdd\x62\xe5\x89\xcd\x66\xd5\x21\x26\x39\x5d\x15\x4b\x43\x31\xbf\x47\x75\xb6\x9c\x30\x6b\x2e\x89\xb3\xc6\x15\x96\x6d\x79\x85\xd9\xd8\xba\xad\xa4\x3a\x14\xdf\xa6\x91\x0c\xda\xa3\x10\x27\x8c\xa6\x00\x60\x78\x37\xcf\x07\x36\x20\xd5\x98\x4e\x12\xba\xa6\xc5\xaa\x07\x1a\x99\x43\x3c\xc4\x89\x62\x62\x2f\x47\xab\xb4\xd7\x85\xf4\x46\xa1\x49\xca\x56\xe3\xf0\xf8\x34\x83\x1c\xf8\x91\x65\x2a\x24\x40\xee\xc2\xe8\xca\x71\x12\xfc\x70\xc7\x65\xf2\xec\xaa\xef\x43\xed\xd1\x80\x3e\x14\x0d\x05\xca\x44\x7f\xeb\x30\xeb\x7d\x4c\x8c\xbe\x45\xdf\x8e\x16\x8d\x0b\xdf\x16\x5d\x4c\xab\xb2\x9b\x6a\xca\x91\xd0\xf5\xa6\x1d\x1e\xcf\x26\x0d\xc4\xf6\x2c\x82\x6e\xad\x35\x8a\xa9\x3a\x51\x57\xc8\x3c\x69\x12\x8a\xb9\xe3\x7a\xc1\x4b\x11\xde\xca\x09\xb4\xcb\x42\x35\x44\xbe\x2a\x43\x2b\xe2\xa3\x20\x59\x6d\xcb\x38\xbd\x34\x98\x67\x59\x82\x6b\xbb\x60\x9b\x72\xc3\xed\x40\x8a\x13\xd8\xb4\x33\x8d\xff\xa7\x90\xe0\x9e\x00\xf1\xd3\x0c\x74\xf8\x4c\xd5\xc3\x38\x5e\xc1\xa9\x6f\xd1\xdd\xff\xeb\xf4\xe5\x8b\x03\x99\xe1\x87\xfb\xef\xdf\xbf\xbf\x8f\x0d\xef\x0f\x5d\x0d\x44\x3f\x14\x96\x32\x65\xa8\x63\x36\x0f\x4d\xbf\xfa\xfe\x01\xfc\x7b\x4f\x9c\x91\x28\xe7\x33\x05\x18\x9f\x78\x28\x04\xe2\xfe\xa5\xc7\x41\xee\x9a\x93\x99\xa3\x08\x2f\xbd\x76\x72\xa8\x71\x20\x23\x07\x4b\x21\xc1\xb3\xea\x60\x16\xa7\xf4\x4f\x58\x0e\xc4\xcf\xbb\x3d\x79\x11\xd2\x9a\x15\xf4\x1d\x4e\x08\x7f\x8f\x2a\x05\x66\xc9\x81\x54\x1f\x4f\x91\x81\xe5\xd7\x7f\xfe\x27\x9e\x92\xbe\xe0\xd1\xe1\xa8\x5d\x7f\xc3\x79\xc5\xac\x52\x8c\x02\x6d\x7f\x4c\x3b\xa4\x70\x2f\x6d\x53\x5f\x71\xa2\x7f\xcc\x56\xc4\xe0\xc2\xc7\x8a\x9f\x55\x9b\x99\x36\xa5\xac\x9d\xc8\x82\x5e\x91\x01\xe7\x5c\xa2\xe1\x79\x8f\x5e\x7c\x25\x03\xdf\xf9\xa4\x39\xe7\x43\x98\x3f\xbe\xfe\x05\x2e\x33\xbe\xb7\x66\x8d\xd2\x32\x89\x09\x2b\x7d\x8d\x5b\x05\x26\x97\xd3\xdf\x24\x36\x5a\x1c\xe1\x85\xcd\x43\x8a\xf1\xea\x03\x63\xad\xc8\x46\x6b\x4f\x45\x95\xad\x7a\xf3\xa9\x03\xb5\x50\x3a\x50\x4b\xa4\x03\x32\x60\x94\x32\xc2\xb4\x58\x26\x4e\x8a\x05\x9a\xbe\x58\xff\x83\xa4\xc0\x3a\x51\xcf\xed\xa5\x5f\x9c\xe5\xf5\x01\xc6\xb8\x76\xca\xbc\xb2\x18\x6d\x12\x9e\xda\x1c\x5f\xf4\xc9\xd3\xa6\xe9\xe3\xa3\x81\xbf\xf2\x22\x11\x71\x04\x48\x8a\xd2\x73\xb2\xf6\x6b\x54\xec\xa2\x7a\x79\xc4\x15\x60\x1f\x07\x45\x42\xa0\x3a\xec\x8b\x38\x1d\x8d\x1f\x8b\x48\xd0\x8d\xe8\x90\x70\xa1\xd2\x0c\xa7\x71\xf4\x73\x17\xc1\x48\x5f\xc9\x11\xc6\x75\x64\xb7\xc7\xb8\x23\x0a\x50\xaa\x4e\x0d\x14\x70\xd8\x30\xf7\x3f\x8f\x46\x11\x6e\x50\x47\x11\x0b\x99\xd1\x08\xec\x7a\xa5\x24\x10\xe6\x3a\x7a\x42\x49\x8b\x31\x38\xb2\x7a\x76\x45\x8c\x40\x8c\x77\xc6\x6f\x04\xe3\x03\xff\x4c\x10\x57\x61\x54\xa7\xe8\x73\xdf\x45\x9e\x17\xa7\xd8\x88\x43\x9b\x63\xf0\xd5\x69\x55\x28\xf7\xcc\xc1\x74\x39\x10\x70\xf2\xa9\x04\x5a\xab\x6a\xe6\x8f\x5b\x94\x22\x8f\x51\x14\x90\x6f\x0d\x9b\x30\x85\xda\x87\xd2\xc0\xab\x7c\x15\xe5\x21\x82\xe9\x02\x61\x0c\x44\x02\x50\x6b\x26\x5e\x9d\xaf\x1d\x87\xa8\xdf\xd5\xc6\xd7\x77\x06\x39\x2b\xad\x8f\x17\xaa\xeb\x30\xc9\x93\x30\x8c\x96\x22\xff\x04\x32\x25\x36\x08\x98\xe5\x1c\x07\x13\xdd\xe7\x6a\x26\x4a\x91\x8b\xf4\x61\xef\x85\xaf\x59\x49\x42\x5c\x1f\x13\x3a\xd8\x3c\x0a\xe5\xe5\x57\xfa\x82\x53\x3d\x3b\x70\x75\xe9\x8d\x83\xc9\xc9\x62\x42\x91\x4d\x64\xc0\x37\xb5\xc8\x71\x14\x77\x57\x2b\x8e\x42\xcf\x50\xcc\x51\xbf\xeb\x9b\xc6\xbd\x39\xf6\x7c\xd4\xf2\x06\x1d\xd5\x38\xae\xfc\xb1\x4b\xb9\x9f\x74\x86\x9b\x3d\x36\xd9\x2b\xa6\x19\x9e\xe8\xac\x53\xe6\xee\xcb\xa1\x64\x6f\x9a\x8d\xa9\xd5\x5a\xe3\x82\x37\x37\xd3\xaa\x90\x62\x2c\x82\xc1\x15\xb0\x8e\x81\xba\x9c\x4e\xb5\xb1\x77\x82\x41\x6c\xbb\x89\x49\x4d\x07\xa7\xcf\xca\xea\xfc\x7c\xb6\xec\xda\xf7\x16\x83\xb9\x0f\xdd\xca\xcc\x9f\x7c\x80\xbe\x3b\x26\x89\x35\x4c\x1a\x55\x43\x8c\x0b\xa0\x44\x61\x53\xb8\x84\x4d\xae\xe6\x92\xdf\x96\x8a\xc8\x9c\x9d\x84\x34\x97\x45\x55\x63\xd8\x88\x48\x34\x5f\xe7\x8f\xa1\xd6\xb4\x19\xfb\x8c\x7b\xc0\xa0\x18\x0b\xfc\x8b\x82\xd2\xdb\xf9\x73\xa6\xdf\x69\xbf\x4b\x4c\xc4\x8f\x6a\x56\x56\xc9\x9c\x9f\x07\x4d\x70\xa9\x3d\x85\x33\x9b\x3f\xc6\x20\xf9\x80\x0a\x2e\x91\xc7\x08\xaa\x0c\x0d\x90\xa8\xa6\xe4\x4a\xaf\x1b\xa1\x57\xc3\x5a\x38\xa2\x70\x15\x2c\x39\x55\x42\x24\x88\x37\x72\xbb\x74\xdc\x8e\x17\xa4\x13\x0a\x95\x1f\x68\x6e\x8c\x8e\x56\x2d\xe5\x87\xd0\x1a\x57\xe1\x77\x55\x40\xb8\xcf\x72\x12\x80\x2e\x1f\xfd\xf8\x82\x7f\x50\x0c\x33\x72\x35\xc7\xd0\x6c\x32\x24\x7f\x92\x24\x5c\x5b\x0c\x78\x62\x59\xbc\xea\x7d\x72\x26\x43\xb3\x40\xe5\x0e\x20\x80\x33\x0d\x88\x4a\x21\x8d\xd8\xc6\x7d\x63\x84\xb7\x4d\xd1\x5c\xa9\xeb\x85\xb0\xca\x2e\x42\x07\x6b\x72\x85\xab\x82\x55\x4b\x7f\xae\xb3\xa0\xaa\x44\x08\x6e\x1b\x27\x75\x64\x6d\x70\xa6\x11\xeb\x66\xe3\xc8\x75\xfa\x85\x23\x11\xd2\xdf\x62\x82\x27\x55\x5c\x8d\xb2\x2b\xce\x7b\xf5\x53\xeb\x5c\x31\xec\x89\xb6\x3b\xe9\xcc\xfd\xb4\x15\xe7\xf7\xa6\xd8\xdc\xf0\xaf\x2b\x26\xeb\x5e\xe6\x67\x5d\x59\x81\xec\xf8\xdc\x9f\x5a\x78\xda\xec\x18\x63\xd0\xdc\x4d\x62\xdd\x10\x3e\xe8\xd2\xd1\xe8\x4e\x2d\xc2\x98\x83\xf9\xd3\x81\x9c\x7e\xc3\x85\x7a\xab\xe1\x13\x4a\x85\x47\xc1\x3c\x79\x43\x94\xf7\x26\xb3\xcf\x59\x34\xdf\xd0\xd8\x18\x09\x30\x49\x47\x5e\x1a\x67\xc9\xcb\xf4\x14\xf9\x38\x60\x78\x68\x6f\xe7\xe4\x32\x3a\xb1\x77\x0a\x00\x4e\x69\x1c\xe5\x2c\xf9\xa5\xd0\xae\xb4\x28\x83\x31\xfb\x62\x3d\x91\x32\xc4\x79\x3d\xfa\x6a\xc4\x6e\x61\x00\xcb\xaa\x69\xa3\xd6\x2e\x8e\xeb\xaa\x5d\xf3\x73\xe1\x48\x53\xc6\xe5\x6c\x1d\x4a\xc7\x8d\x61\xce\x64\x33\x82\x29\x44\x2f\x9e\x96\x8e\x5f\x39\xfd\x12\xd8\xfb\x01\xbf\x19\xc2\x08\xe1\x80\x30\x32\xa0\xfb\x88\xec\x1d\x32\x23\x14\x57\x03\x48\x4f\x94\x41\x8f\x81\x6b\x9c\xca\x02\xbe\xdd\x4f\xcf\x3f\xa8\xef\x63\xd8\x3a\x30\x11\x61\xc5\x06\x13\x45\x11\x66\xa6\xe7\x31\x2f\xb6\xbd\x97\x9e\x95\x83\xc6\x2d\x76\xab\x4d\x4c\xbf\xdd\x58\xb8\x5b\x44\xb5\x0b\x08\x8d\x40\x1f\xad\x68\xf9\xd6\xa8\x19\xed\x32\xbd\x3d\x04\x57\x7a\x7f\xc4\xda\x7d\x74\xf1\x98\x94\xd5\x5a\x8f\x02\xe9\xe7\x64\xd5\xe8\xe1\xdd\x55\x63\xca\x1c\xfc\x95\x6e\x53\x64\x2c\xeb\x19\x32\xd4\x64\xe1\xf3\xc1\xea\xb8\x49\x01\xea\x68\x98\x44\x1f\xc7\x03\xdc\x98\x93\x2a\xbd\x02\xb1\x71\x6d\x42\x02\xe9\xb4\x25\x31\x74\x10\x43\x65\xdc\x8f\xb8\x41\x4c\x5f\xa9\x34\x1b\xb7\x5b\x8c\x78\x8f\x5a\x72\xd2\x40\x30\xb5\x59\xf6\x53\xdb\xad\xdf\xf8\xb4\xd7\x71\xbc\x99\x09\xed\x04\x55\x75\xd9\x23\x93\xfa\x2e\x43\xc8\xae\x86\x5f\x90\x58\x20\xd1\xc3\xf8\xd4\x02\xf0\x14\xfa\xdc\x02\x33\x0d\x3d\x8b\x69\x73\xd9\xa6\xfc\x65\x34\x1a\x45\x7f\x55\x9b\x63\x1f\x53\xa2\xcd\xb6\xa6\xdd\x72\xb6\x50\x24\xaf\x2d\xe6\x3a\xc6\xf8\x92\xb6\xdd\x18\xb4\xb9\xfa\x11\x7f\xa2\xac\x97\xa4\xbd\x15\xa6\x5a\x31\xc5\x06\xf8\x29\x4a\xa5\x6c\x33\x8a\x7f\x28\x3a\x1d\x3b\x17\x35\x8e\x16\x47\xd9\x66\xc3\xb8\xca\x61\xa0\x5c\xec\x2f\x0d\x90\xcb\x89\x9a\x69\x8b\xc6\x5e\x34\x2e\xa5\x78\x28\x2a\x94\x16\xf4\x6d\x4f\x13\xdd\x6c\x49\x19\x14\x66\x1c\x97\x78\x61\xe2\xf2\xdf\x29\x79\x29\x39\xa3\x25\xd5\x98\xf7\x92\xe7\xec\x75\x6e\x3c\x9f\x8b\xe0\x49\xc3\xb2\x3b\x54\xb0\x70\x9c\x38\xdf\xcd\x1f\xb9\x41\x14\x93\xda\xcb\x91\x1a\x60\x56\x49\x44\x1e\x28\xe3\x61\x5b\x51\x9a\xc4\x6a\x9c\xa8\xa7\x9b\xa2\x97\x8f\x20\xee\xdf\x9a\x44\x77\xba\xf3\xc9\x20\xe6\x3b\x4c\xab\xbf\xc4\x8c\x7d\x77\x5a\xd6\x50\x5e\x3f\xca\xcf\xea\x3e\xee\x48\xd4\xfa\xaf\x98\x43\xc7\x4d\xf6\xa7\xde\x1c\x6d\xd2\x8d\x19\x38\x53\xab\x6b\x68\xfe\x6f\x4a\xdd\x9a\xce\x65\x2c\xba\xf9\x92\x64\xa2\x92\x49\x74\x6a\x6d\x4e\x87\x1f\x04\xac\xf1\x5c\xd2\x1e\xab\xa0\x18\x2d\xa6\xa2\x9e\x24\xed\x8d\x70\x8c\xfb\xdb\xf8\xdd\xda\x65\x6e\x33\xee\x64\xd2\x02\xe7\x20\x49\x8b\x93\x1a\xfe\x78\x1b\xc8\x6f\x76\x59\x57\x4c\xa4\xc7\x99\xb6\xb2\x90\xea\x88\xf3\xa6\x73\xe4\x8c\x5e\x90\xa9\xa6\x9e\x9e\x1a\x41\xde\x6f\xc9\x9c\x33\xa5\x2d\x57\x11\xd1\x7b\xd5\x98\x33\xb5\xcb\x8c\xfa\x5b\xb3\x1a\x7a\x9f\x78\x2b\x94\x40\x8f\xd3\xc7\x84\x1b\x39\x71\x24\x98\x3c\x8c\x1f\x96\x99\xfc\x7b\x51\x6d\x17\xd3\x99\x72\xb0\x87\xe7\x86\x5e\x4d\xc0\x97\xdf\xb9\x86\x4c\xfc\x02\x76\x90\x2c\xd8\x71\xb9\x62\xed\x55\x68\xd8\x2b\xb9\x6a\x7c\x55\xfc\x8d\x18\x66\xba\x7c\xba\x8f\x74\x3c\xfe\x77\xd1\xb5\x70\xb0\xaf\x5a\x4e\x56\x20\xaf\xa5\x9f\xec\x38\xca\x4b\xdc\x7c\xfe\x9c\x5b\xb8\x62\xb6\x22\x09\x3c\x43\xa5\x1c\x08\x1c\x14\x18\x6b\x02\x7c\x57\x2e\x8f\x7b\x12\xe4\xd7\x59\x5f\x48\xf2\x63\xe0\xc6\xbe\x4b\x9b\x34\xed\x7b\xa5\x05\x32\x26\x01\x66\x98\x61\x1e\xf9\x7f\x80\x7e\x29\x49\x87\xe5\x52\x24\xf1\x34\x5e\xf5\xa1\x13\x03\xaa\x5f\xd0\xa8\x4e\x94\xa6\x42\x5e\x5f\x4d\x44\x68\x28\x40\x11\x07\xdf\xb7\x43\x0c\x4c\x33\xe9\x2a\x8a\x8f\xed\xc7\xf3\xde\x4a\xe3\x6a\x7b\x86\xac\x8d\x19\x0f\x85\x0a\x84\xeb\xcf\xcc\x69\x70\x24\x3f\x92\xe0\x93\xb2\xbb\xf6\x33\x21\xc3\xdf\xf1\x4c\xa2\x54\x4b\x13\x55\xf7\xcc\xc6\x0f\x46\x61\x31\x70\xc4\x7d\x73\x2b\x5c\xee\xd6\xc0\x2c\x87\x90\x40\x30\x4b\x4d\x87\x10\x0e\xe7\xac\x7d\xca\x94\x8a\x42\x0d\xdc\xf4\x73\xce\x5f\x09\x84\xed\x88\xc2\x39\x4e\x8d\x81\x25\xdb\xf1\x38\x95\xde\x97\x62\x8c\x2b\xed\x42\x1b\x00\xdd\x6d\x56\x17\x93\x26\xd7\xbe\x15\x6b\x33\x13\x2c\xc3\x33\x57\x1a\x56\xee\x98\x4d\xc9\xca\xaf\xa1\x16\xb8\xbe\x46\x78\x47\x02\x37\x66\xc9\xa2\x6e\x29\xf4\x37\x92\x85\x72\xc9\xf5\x62\xea\xad\x2c\x92\x69\x04\xdd\xc6\x2f\x45\xb7\xbb\xde\xe8\x84\xe9\x31\x40\x7b\x2a\xc7\xac\xe1\x0b\x60\x7d\x4c\xb2\xf1\x63\x90\x1f\xb7\xce\x50\xcb\xc7\xd6\x50\x00\x45\x4d\x72\x23\x22\x5b\x2f\xa1\x55\x13\x91\xa9\x8b\x1a\xce\x2f\x30\x7d\x93\x0e\x6f\x60\x26\x67\x21\xe2\x48\xa1\x2d\x5c\x68\x60\xb5\x26\xe6\xad\x0a\x30\x82\x81\x1c\x70\x7c\x47\x77\xc9\x2d\x50\x56\x14\xe1\x9c\x51\xfe\x33\x0f\x23\x31\xfa\xf9\x6d\x33\x72\x38\xea\x86\x39\x11\x52\xba\x0a\x51\x4f\xf1\x25\x53\x63\x24\xf3\xdb\xa6\x76\xb8\xe3\x46\xed\x9e\xe0\x41\x38\xbf\xab\x9d\xb8\xe8\x0b\xe6\x1d\xb1\x91\xaf\xa6\xeb\x3a\xe4\x44\xf6\x90\xc4\xed\x4e\xd8\x43\x86\x2a\xb8\xd9\x2c\xbd\x7f\xee\xab\x57\x83\x45\xfe\x1f\xc9\x58\x62\xc2\x29\x9e\x46\xf2\x02\xfb\x2e\x1b\x60\x65\x24\x2c\xb9\xf3\x46\x4a\x13\xee\x18\x8e\x2f\x5e\x91\xe0\x8d\x14\xb4\xba\x4d\x2e\xb4\x5f\x94\x8b\x65\xd5\x5d\xff\x82\xf9\xc1\xd8\x0d\x1d\x99\xab\x9f\xe8\x50\xdf\x64\x65\x61\x2f\x96\x6d\xd1\x95\xf3\xc7\xfa\x57\x86\xd6\x10\x76\xfe\x5a\x84\x94\x99\x62\x3d\x61\xb6\x22\xb9\x42\xb6\x73\x8f\x31\x25\xdb\x05\x46\xd8\x14\x4e\xea\x70\xe8\xf9\x97\x34\x64\xcc\x97\x3e\x06\x62\x15\x0e\x6c\x5b\x64\x26\x49\x29\x9a\xd8\x79\x33\xdb\xb4\x0d\x0e\x31\x7f\xce\xff\x3a\xaa\x36\x70\xbb\x3f\x61\x6f\x7b\x4e\xf5\x4b\x25\xe2\x2d\x9d\xf5\x6d\x5f\xd4\xf3\x33\xfc\xef\x77\xf9\xed\x32\xf3\xeb\x27\xed\x43\x85\xfa\x0d\x22\x83\x9d\xae\x23\xa8\x41\x2c\x81\xb2\x9c\xce\x58\x2a\xec\xe2\x0a\xa7\x48\x9a\x93\xc1\x72\x37\x6c\x64\x24\x73\xa5\xbf\x4f\x65\x1d\x13\x23\xb3\xfb\xfc\x31\xba\x68\x5a\xe3\x8d\x77\x4a\x4e\x3b\xcb\x28\x15\x2f\xda\xf7\x4b\x92\x87\x2f\x1f\x3a\x49\xf2\x41\x50\x16\x4b\x7e\xc2\x2f\xa2\x25\x75\xee\x72\xe1\xb7\x98\x16\xf0\xe5\x9c\x3d\xa9\x8c\x0b\x5d\xb6\xa4\xa8\xb4\x58\x8d\x87\x64\x8c\x1e\x15\x45\x5e\x05\xc1\xe4\xbc\x6f\x41\x54\x2c\x7a\x5c\x0a\x96\x53\x92\x24\x8b\x33\xce\x85\x95\xac\x4b\x10\x17\x96\xb2\x1f\x75\xb2\x4a\x96\xeb\x87\x65\xe7\x83\x51\xfb\xc3\xba\x5d\x57\x4d\xf8\x4d\x79\x95\xb8\x5b\x8d\x68\x11\x96\xba\xf8\x82\x61\xe1\xa8\x2d\x23\x82\xa8\x08\x96\x8c\x8a\xc6\x80\xfd\x8d\x37\xb0\xe4\x20\x14\xb3\x29\x40\x9c\x50\x08\x78\xbe\x75\xb2\x81\x7d\x5f\x61\x16\x2c\x4a\x19\xd8\x0d\x5b\x0c\x25\x39\x55\xad\x1b\x9a\xf9\x13\xe6\xc9\xc2\x0a\x18\x50\x06\x63\x1e\x51\x36\xe7\x96\x12\xcc\x69\x8c\x6f\x17\x9a\x88\x77\xf2\x25\xdc\xf7\x0b\x34\x72\xf1\xde\x55\x7b\xfb\x89\x1c\x2a\x6e\xee\x4b\x5d\x2b\x76\xbe\xf2\x7e\x2c\x21\x17\x90\x23\xee\x99\xf1\x12\xce\xda\x7a\xfa\xc7\x87\x41\x54\x70\xd3\xea\xf6\x8b\x7a\x72\xb3\x3f\xdb\xdd\xd1\xd7\x4f\x99\x5e\x23\x56\xe7\x99\x78\xb2\x42\xe1\x86\x99\x90\x22\x31\xe9\xfe\xae\xc2\xd9\xde\xd0\xd3\xd7\x4f\x9a\x68\x84\x66\xcd\x8f\xa2\x6a\x27\x42\xa2\x9c\xf5\x64\xce\x54\x35\x1a\x8d\x78\x7f\x2c\x95\xac\x72\xac\xed\x64\x2d\xb5\xd1\x16\x6e\xae\x3f\xa0\xda\x7b\xef\xf8\x13\x2b\x8d\x26\xf0\xaf\x0d\xfe\x15\x9b\xb3\xae\xfa\xc5\x7a\x25\x9b\xa2\x17\x8b\xb2\xbf\x18\x20\x6c\x82\x54\x9c\x80\xf9\x31\x18\x98\xa4\x7e\xdf\x71\xa8\x61\x6f\x93\x4b\x0c\x56\x45\x13\x54\xe9\x4a\x3c\xc1\x9c\x3c\x81\x68\x7c\x7e\x9c\x64\xf4\x08\xd7\x00\x4e\xc5\x38\x14\x18\xc3\xdb\xda\x0b\x32\x97\x79\x65\x7c\xf2\x8e\x20\xc3\xca\x0c\xbe\x3f\xe0\x3c\x0f\xd5\x47\x43\x56\x25\xf6\xce\x5d\xb8\x26\x0d\xbb\x53\xc6\xa6\x19\x81\xd5\x8e\xa4\x3a\xc5\x40\x68\xf0\xba\x7d\x5c\xa1\xcb\x14\xbd\x78\xf7\xf6\xce\x63\xea\xd2\x25\x0f\x9c\x9e\x50\xc7\x33\xee\xf7\x9c\x50\xd0\x7f\x60\x67\x16\x2d\xd6\x43\x31\xcb\xaf\x4a\x93\x46\x5f\x99\x82\xe9\xbb\x9a\x0e\xd5\x19\xd3\x91\x02\x9f\x0d\x1a\x08\x04\x86\xde\x45\xf7\x0b\xa4\xa6\x91\x0d\xf6\x8e\x9d\x08\x67\x3a\x01\x08\x5f\x33\xcd\xaf\xd9\x29\x4c\xb4\x9b\x5c\xf4\x57\x58\xe8\x12\xef\x4e\xdf\xf7\x31\x1d\xab\xdc\x7c\x78\xa9\xdc\x6d\xb2\x37\x8c\x79\xc3\xe5\xae\x47\x16\x3e\x3b\x86\xf1\x9e\x0c\x5d\xb0\x08\xf6\x4f\xf5\x62\xe8\x90\x5e\x43\xa5\x49\x07\x9b\x0f\x24\x25\x1a\xff\x99\xcd\x56\xec\x8b\x7a\x34\x7d\x11\x8b\x7d\x4d\x29\x1a\x3e\x7b\x43\x87\x46\x3c\x8b\x75\xdb\xb5\x03\x70\xc7\x66\xfe\x43\xdb\xe1\x1f\xee\xfd\x8f\xc8\x49\xad\x4e\xea\xba\xab\xc5\x40\x81\x9c\x5e\xb3\x30\x88\xca\x2a\xd5\x09\x04\x8d\x88\xc2\xd5\x26\xa8\x8d\x59\x91\xea\x8e\x48\x5e\x11\x76\x52\xc3\x57\xa2\xc9\x09\x09\x51\x69\xd5\x2e\xfb\x82\x42\xeb\x68\xdd\x97\x4b\x52\xec\x87\x55\xb7\x2d\x05\xff\x58\xd4\x00\x62\xc3\x76\x81\x3b\x61\x65\x2b\x08\xe2\xa2\xb8\x95\xdb\x01\xeb\x46\x07\x9a\x4c\x70\xdc\x81\xcc\x2f\x98\xf2\xb8\xf5\x39\x40\xeb\xb8\xe5\x71\xb5\x34\x1a\x3c\x79\xdc\x54\x37\xf5\xc2\x14\xdb\x78\x4b\x9f\x41\xc9\x78\x3f\xa9\xde\xae\x8d\xd1\x56\x13\x1b\x14\xb6\xab\xca\xda\x8c\xda\xfc\x28\x84\xc1\xae\x36\x64\x1a\x38\x6a\x05\xb7\x05\xa6\xbb\xa3\x8d\x50\xb7\xe3\xf9\xc9\x96\x8c\xc6\x6a\x97\xf0\x32\x00\x21\xf4\x12\xfe\x15\x7f\x33\x74\x89\x80\x4f\x41\xcd\x65\xdb\xf6\xc8\xc0\x6f\x91\xb1\x21\x63\xf9\x60\xd3\x00\x7f\x9d\x54\xec\xf0\xf3\x48\xeb\xc5\xac\x0d\xb4\xd8\xb3\x7d\xd4\x78\x62\xfb\x36\x98\x30\x18\x06\xec\x06\x14\xb6\x00\xcd\x12\x8d\xfa\x44\x3f\xc0\xc5\x79\x7e\x0a\x35\xf7\xb5\x74\xc3\x8e\x5a\xb9\x81\x23\xc8\x04\xae\xf3\xc2\xec\x1c\xda\x84\x9d\x1c\x61\xd5\xbd\x6d\xa7\x07\xa7\x76\x93\xa3\x6f\xbb\xf6\xbc\xaa\x11\xc7\x2d\x87\xd5\x3b\x83\xb9\x1b\xed\xc5\x82\xac\xa5\x7c\x5f\x27\x5a\x29\x7f\x44\x95\xf2\x67\x50\x29\x3f\xc3\x4a\xda\x69\x08\x22\x40\x2a\x6c\x30\x50\x0d\x1a\x07\x06\x67\x40\x25\x82\x2a\x5f\x45\x64\xc0\x23\x26\x03\x5c\x5f\x11\x13\x0c\x5c\x3d\xc6\xa6\x22\x4e\x57\xae\x2f\x72\x0c\xae\xe3\x97\x84\x7f\xa1\x43\x0c\x47\x65\x43\x96\x37\xd7\xa4\x41\x61\x7f\x98\x94\x81\x89\x99\xd5\xd5\x0a\x73\x8e\x3a\xc7\x18\x34\xb9\x5e\xd5\xca\x42\x4f\xce\x30\xe8\x87\x78\x7d\xe8\x27\xc6\xc9\x64\x1a\x56\xe7\xcc\xfe\xb7\xf9\x0f\x47\x23\x4c\xa9\x4d\x4e\x0a\x38\xe6\x9c\xd1\x24\x4a\x4e\xa6\xab\x6e\x0b\xbc\x94\x7b\xeb\xea\x44\xb8\xaa\x86\x69\xe3\x26\xa3\xca\x32\xba\xd0\x84\x22\xed\x80\x1a\x2c\x83\x61\xff\xd7\x4d\xd1\x60\x40\x39\x80\x57\x53\xc3\xd0\x0d\xeb\xfa\x7f\x40\x03\x2f\x79\xcc\x9d\xa8\x86\x5b\xa1\x75\x84\xd3\x1e\x92\x81\x04\x9b\xf0\x1d\x11\x4b\xa2\x95\x3c\xe7\x28\x25\xca\xd5\x94\x12\x2f\x0b\x60\x48\x3e\x4c\x44\x78\xe3\x2f\xfa\xf6\x07\x54\x2a\x7f\x90\x64\x2c\x9c\x85\x45\xfb\x21\x7f\x13\x7e\xa2\x25\xac\x08\x06\xc5\x67\x77\x46\xef\x17\xeb\x22\xe3\x8a\x41\x5d\xe1\x1c\x7e\x83\xe5\x85\xca\x66\x5a\xd5\x0d\x86\xc9\x33\x69\x1b\x46\xef\x97\xc5\x11\xf3\xc9\xc6\xb7\x6c\x1b\x88\xa3\x07\xd2\x2a\xe4\xa4\xb9\x2a\xa5\xea\x66\x93\x80\xb0\x31\x09\x0d\x52\x4e\x9c\x92\x27\x10\xc2\x90\xfc\x09\x44\x20\x4c\xf5\xba\x2d\xac\x7d\xdf\x76\xa5\xaa\x6f\x1e\x03\xb5\x9e\xbb\xbc\xa2\xe2\x0c\x67\x29\x3a\x08\xc7\x20\x17\xbb\x4e\xf6\xb5\x44\xf7\x2b\x6b\xae\xff\xbb\xd0\x15\x0a\x49\xc8\x78\xc4\x84\x02\x72\xe8\x1c\x8a\x04\x69\xcb\xae\xdd\x68\x58\xe0\xb7\xcd\x6b\xd4\xd9\x2e\x2d\x82\xa6\x4d\xf1\x41\x32\x57\x6b\xba\xfd\xe3\x71\x3e\xfd\x6e\x0c\x27\xa3\x76\x2c\x5b\xbe\xeb\xc4\x82\xc0\x09\xdc\xff\x56\xf2\x4e\x58\x36\x8b\xd6\x60\xb4\xeb\xba\x5d\xca\x05\x2c\x0d\x1a\x35\xb4\xf7\xa4\x57\xcc\x08\xe9\x80\x99\x94\xda\xb2\xdc\xc0\x3d\x11\x5f\x43\x39\x80\xae\xbd\x00\xfa\xbe\xe7\x83\x8c\xea\x4f\x78\xaf\x03\xd6\xed\x90\x9c\x0f\x86\xa2\xeb\x11\x36\x1b\x8b\xc3\x8b\x89\xcb\x43\xa6\x32\xe8\x6a\x48\xf4\xfb\xbe\x0e\x82\x64\x5e\x8e\xa4\x47\xe6\x37\xec\x87\xf3\xd0\x73\x7e\xf9\xa8\xaf\x80\x81\x8d\x3b\xdc\x9b\xb9\x7e\x12\x9a\x42\xcd\xd5\x49\x08\x4d\x11\x2c\xec\x35\xc0\x88\x6a\x62\x2c\xb5\x1a\x23\x5e\x88\xa0\x3b\x3a\xa9\x40\xef\x47\x94\x02\x86\x07\x6a\xd9\xd1\x30\x96\x55\xd2\x66\x31\x17\xc9\xae\xe0\xc8\x09\x04\xf1\x2c\x3a\x8e\x28\x24\x92\xef\x70\x64\x8c\xfa\x85\x86\x6f\xc9\xc0\x41\x50\x01\xce\x9d\x46\x83\xa6\x62\xd5\x60\xd8\x42\x35\xd7\xc8\x83\xfa\xc0\x3a\x14\x5e\x2d\x1e\x77\x64\x08\x79\x3a\xe8\xc0\xa9\xe2\xaa\x48\xad\x20\x51\x10\xcf\x61\x18\x6e\x7e\x11\x5e\xa6\x26\x83\x31\xc2\xa7\x82\xd8\x20\x8f\x8a\x52\x5d\x66\xc6\xf2\x7d\xc2\xf3\x5f\x30\x6a\xf4\x10\x70\xcb\xb1\x69\x02\x97\x87\xb3\xe1\x92\xd4\x5c\x82\x4b\x29\x69\x3f\x65\x11\x47\x31\x34\x39\x60\xf1\x07\xf4\x97\x24\x19\x3b\x10\xbd\xb0\xd1\x52\x3a\x91\xe9\x9d\x14\x11\x82\xaa\xa7\x97\x90\x68\x7d\x27\x30\x35\x77\x81\x01\xcf\xe3\x10\x26\xb0\xd2\xb5\x71\x9f\x83\x25\x71\x89\xcf\x8a\xc6\xbf\x0d\x65\xf2\x2c\xd5\x23\x8f\x0b\xa7\x8c\x2b\x83\x29\x47\x0e\x66\x93\xd3\xa2\x6a\xc9\xf3\x33\x59\xd1\x22\x4d\x56\xf5\x57\x78\x9d\xfb\x16\xc8\x29\x3c\x17\xfa\x43\x1e\x2a\x40\xb8\xc8\xbe\x4a\xf5\xc4\x81\x8c\x0b\x2f\x5a\xdb\xcf\x9f\xc1\x7f\xe4\x37\xa2\x10\x0c\x53\xd7\xf5\x5a\x83\x64\xba\x65\x33\x7f\x04\xff\xe6\x8f\x5f\x84\xa5\xfa\xd4\x91\xa9\xb8\xbc\x5b\x39\xd6\x9b\xaa\xa4\xef\xe1\x61\x79\x49\x82\x21\x38\xcc\xef\xf2\xe3\xe8\xcd\xc3\xe7\xab\xa8\x37\x68\xb4\x26\xf6\xdb\x94\x0f\x9e\x62\x1a\xb6\xe4\x28\x46\x59\x0f\x57\xe2\x1b\xc5\xf7\x0c\x89\x02\x1f\xb7\x0c\x23\xaf\x98\x4b\x4e\x67\x22\xe7\x81\x34\x17\x25\x52\x79\x24\x5a\x98\x88\x97\x55\x8d\x4b\x58\x1b\x56\xfb\xf8\x45\x40\x88\xe9\xc1\xf4\x14\xa4\xb0\x37\xde\xbf\xf8\x90\x4b\xda\xd8\x28\x72\xb8\xa1\x59\xa4\x92\x64\x8f\x79\xa1\x0b\xa2\x87\x91\x29\x06\x72\x2f\x4c\x89\x0f\x31\x6e\x4f\x06\x9c\x8d\x46\x8c\x27\xd9\x84\xc0\xec\x2b\x01\xe9\x1d\xd7\x2b\xb6\x70\x07\xab\x72\xbc\x00\x00\xa0\xda\x57\x23\x7c\x86\x08\x0e\x90\x1a\x5a\x86\xa2\x9d\x53\xd2\xc2\x22\xdf\xbb\xf4\xf9\x63\x31\x40\x17\x35\x56\xde\x94\x9c\x0d\x3e\xf4\xcc\x13\xc4\x20\xc6\xc1\xb3\x39\x6e\x76\x3b\xb1\xad\xa4\xc5\x1e\x55\x2a\xc2\x87\x99\x6b\x6e\xf0\x4d\x5f\xd8\x62\xfe\xdc\xe6\x87\x65\x7e\x7a\xa8\xf7\x67\xd3\x6f\x17\xa4\xf4\x98\xbe\x8f\xf9\xe9\xf3\xb3\x93\xa0\x2e\xdd\x15\x2c\xcb\x83\x0b\x83\x1f\x82\x4b\x13\xb6\xd1\xc8\x3a\x7c\xf1\xac\xde\x3c\x8b\x6f\x2d\x53\x1f\x76\xba\xe6\x17\x93\x8e\x18\xd5\xbe\x03\x0a\x06\x11\x58\xc5\xd9\x22\x4b\x1e\x44\x02\xbf\x04\x15\xe8\xd1\xe3\x77\x17\x23\x39\xa0\xff\x19\xc7\x28\xd0\x59\xad\x24\x58\x05\xc0\x16\x90\xdf\x07\x77\x66\x11\x96\x5b\xf4\xb5\x0d\x82\x79\xae\xaa\x73\x92\xc9\x9c\x1d\x9f\xea\x46\xbc\xab\xb6\x58\x69\x81\x9e\xb6\xc0\x08\xbc\xc4\x25\x12\x55\x4b\x05\x6e\x53\x7d\x8b\x2d\x1a\x7c\x50\x68\x1d\x33\xb2\xe3\x3e\x95\x90\x3b\xf9\xc9\xe1\xf3\x78\x1e\x94\x2a\x44\xb9\x0e\x9c\x51\x2d\x53\xc2\x44\x6a\xf7\x5f\x09\x9b\xa1\x18\xbb\xda\x92\x81\x92\x35\x6f\xdd\x66\x87\xa9\x07\x90\xd6\x19\x19\xb7\x1e\x4e\x62\xe5\x98\x00\x4d\x20\x25\x30\x7a\x65\x52\xd4\xbd\x30\xb1\x23\x66\xd2\x2c\x62\x72\x34\x86\x52\xe4\x53\x18\xbe\x29\x37\x98\xe4\xee\x9c\xd1\xa4\x19\x6e\xd8\x71\x48\x07\xd6\x37\xf7\xad\xef\x49\x62\xbf\x3b\xb9\x6d\x4a\x3c\xd2\xd3\x47\x46\x4a\x41\x2a\xb4\x3d\xdd\x72\x0b\x6f\xc5\x9a\xac\x2e\x49\x7d\x36\xed\xe0\x29\x70\x49\xa4\x61\x25\x9e\xb9\x64\xe5\xb2\xb9\xfe\x85\x02\x06\xf9\x29\x78\xf0\x2c\xf0\x12\xa1\x0f\x12\x7b\x06\xb0\x8b\x9f\xb3\x5f\xf2\xfa\x79\x1f\x96\x9b\x67\x61\x72\x8e\x4f\xca\x29\x2d\x0d\xa5\x7c\x09\xfc\xc2\x28\x28\x67\x1f\xa3\x19\x37\xe8\x2c\x5c\x7a\xec\x56\x33\x86\x99\x29\xba\x32\xf0\x41\xe5\xc3\x53\x99\xf6\xa4\x55\x46\x2c\xce\x96\x06\xc5\x76\x3b\xa1\x7d\x3e\xa4\x60\x32\x7c\x3c\x41\x45\xe8\x1a\xdd\x28\x6d\x60\x92\xbc\xa3\x66\x10\x5a\x63\xba\x52\x42\x95\x48\x69\x7b\x7e\x5e\xc3\x9e\x62\xa6\x3d\x83\xb9\x37\x00\xaf\x56\x0d\x5e\x55\xf3\x21\x6a\x5c\x59\xc2\x09\x28\x7e\x27\xe1\xf5\x1a\xfd\x3d\x5c\x98\x99\xfc\xb8\x5d\xb3\xb0\x89\xbe\x6b\xab\x6e\x20\x60\xe8\x54\x71\xa7\xce\x62\xfa\xda\x07\xd5\xfc\xf8\xa5\x61\xb5\x5b\x34\x79\xa2\xa3\xbb\xb6\x45\xab\x14\x78\x46\x5e\xb1\xe6\xa7\x0e\x09\x67\x77\x20\x68\x14\xb2\x22\x37\xd0\x71\x0b\x42\xc4\x4f\x35\xe8\xcf\x13\xe4\x6a\xa1\x72\xab\x56\x35\x33\x58\xd8\x17\xb5\x44\x69\x79\xbb\x76\x43\xa2\xc9\x66\x12\x4a\xe5\x94\xca\xfc\xfc\xd1\x8b\x45\x2e\x1b\x6d\x49\x7c\x89\xf3\x1f\xd9\xcd\x25\xa4\x85\x5c\xef\xf6\x62\x07\x78\x9d\x9e\x3e\x0b\x2b\x29\x95\xac\x8f\x47\xd9\x86\x5f\x91\xee\xef\x17\xcb\x01\x1e\x70\xb8\xa3\x0c\xb6\x73\x92\xb6\x90\x55\x00\x03\xa9\x0b\xda\x1e\x35\x9d\x06\x1d\xfc\x12\x52\xb1\x41\x71\x4d\x66\x58\xe1\x57\x96\x00\xc3\xa9\x52\x6a\x7a\x57\x31\xd9\xe6\xae\xb8\xfe\xfc\x31\xfc\x8e\xae\xe2\x14\x5c\x2b\x3e\x8a\xc0\x83\x7d\xdb\x0d\x66\x59\x24\x6d\xd6\x38\x78\x04\x28\x9c\x1b\xb0\x64\x21\xa8\x68\x3b\xef\xde\x81\xea\xf7\xb9\xfa\x9d\x7b\x61\x17\xb8\xce\xcd\xb0\x61\xff\xfe\xea\xa3\xe1\x84\x63\xf3\xb3\x62\x03\x6f\x07\xb2\xb5\x9f\x1b\x11\xcd\x84\x53\x89\x9e\xdf\x7d\xdd\x59\xed\xc9\xba\xd9\x68\x9f\xd6\x1d\x7b\xb9\xdc\x89\x54\x70\x54\xa5\xb1\x1f\xa3\x28\x3a\x68\xe3\x59\x27\x5f\xe6\x79\x0f\x5f\x16\x32\x5d\xbe\x94\x40\x33\xb9\x9e\x50\x6c\x6d\x1d\x62\x88\xd3\xe3\x89\x6f\x4a\x4b\xdd\xe5\xf8\x13\x44\x60\xdf\xc2\xd4\xab\x28\xf6\xb9\x75\x2f\x68\xe1\x4e\x26\x29\x73\x3d\x70\x5b\xfb\x17\x00\x62\xf3\x87\x5b\xf9\x55\x7e\x0b\x68\xb8\x25\xf4\x11\x22\xdd\x8a\x1c\x94\xf7\x62\xdd\x55\x80\x63\x54\x7a\x6a\x90\xb4\x76\xe1\xb2\x4f\xd9\x60\x06\xa5\x72\x62\x21\x23\x3a\xe4\x16\x4b\x88\xea\x7e\x12\x52\xdd\x29\x3a\x54\xea\x28\x42\x86\x84\x97\x84\x3a\xd2\x09\xa3\x1f\xbf\x48\x66\x59\x5c\x27\x09\x58\x34\x4c\xc0\x23\x4e\x47\x4f\xb2\x80\xb8\xa9\x26\x9a\xd5\xc4\xb3\xe4\x01\xec\xe7\x0d\xa0\xc0\xee\xc0\x91\xec\xf4\x94\xd9\x17\xed\x83\xd6\x2c\x72\xe3\x17\x91\xc0\xf8\x0b\x17\x9a\x5c\x84\x68\xb9\xb5\x38\x63\x6b\xb2\x33\x1c\x5f\x6f\xca\x73\x7f\x53\x28\xbc\x83\xf6\x2b\x24\xe6\xaa\xd8\xf6\x80\x11\x5c\x9e\x89\x23\xfe\xed\xde\x35\x0e\xb8\x83\x6e\xe8\x8b\x9a\x6c\x79\x3c\x5d\xfc\xa7\xaa\xe4\x9b\xad\xc1\x1e\xdc\x76\x59\xd3\x7b\x5e\x38\x68\xfb\xca\xb0\xf3\x3c\xda\xc8\x86\x7c\x34\xcc\x6d\xd4\x99\xf6\xa6\xa1\xca\x76\xde\x44\x97\x2a\x45\x1a\x00\xbb\x3b\xc0\x80\xa6\x59\x23\xb7\x23\xbb\x80\xab\x97\xe0\x7e\x1c\x16\xc7\x6d\x2f\xc7\xcb\x21\x55\x06\xbc\x9c\x70\x6f\xe9\x5f\xae\xc8\x91\x0d\x15\x80\x76\x12\xfd\x7f\x1a\x11\xfd\xe1\xa9\x7f\x11\x69\xc2\x46\x14\x08\x04\x49\xd3\x48\xee\x12\x3c\x0a\xf2\x59\xa1\x03\xee\x6d\x8b\x30\x51\xc8\x31\x3e\x7b\x72\xfc\x32\xa9\x3a\x81\x6e\xe4\xcb\x08\x39\x49\xf9\x14\x2a\x22\x45\x08\xbd\x07\xc4\x20\x8b\x0a\x84\xae\xf4\xf8\x2d\x70\xf5\x16\xe7\xd8\x63\x39\x7f\x8a\xdc\x1f\x59\x15\x4b\xbb\x3a\x6d\x9a\xb3\x3a\xe4\xbb\xfc\xf6\xe5\xb8\x17\x6b\x48\x28\x3b\x6a\xe3\xe8\x44\xec\x95\x52\x69\x61\x1f\x33\x77\x0c\x6c\xa6\x37\x7d\x0a\x64\xa1\x17\x57\x1c\xed\xb9\x7e\x66\x15\xe9\xbe\x37\x01\xb5\xa3\xd7\xbf\xc4\xf5\x81\xe8\xda\x52\xf6\x6b\xfc\x57\x1f\xc0\x1d\x75\xc9\x32\xe1\xb2\xa8\xd9\xca\xf1\xb2\xa8\xdb\x3d\x95\xe1\x07\x65\x46\x65\x42\x31\xae\xe8\xcf\x8b\xed\xde\xf7\x4d\x3a\x41\x55\xda\x04\xf0\x09\xc0\x26\x8b\x40\x2f\x8d\xf1\x13\x4f\xea\x6b\xbd\x3d\x60\xee\x7a\x70\x0b\x80\x1b\x5b\xa5\xac\x30\xb3\xa8\xf8\x21\x41\x52\x88\x4f\xb8\x85\xc3\x53\x12\x86\x63\x05\x8c\x01\x05\xfb\xa2\x0b\x1e\x36\x5d\xaf\xdc\x66\xb2\x96\x34\xda\xd1\x5e\xb5\xac\x35\xaa\x2c\x93\x85\xd7\xd5\xb9\x49\x94\xb1\x8a\x9f\x26\x96\x7f\xd1\xf7\x5b\x2b\x61\xec\xe8\xdd\x7d\x76\x76\x76\x72\x9a\x2c\xf4\x86\x2e\x65\xea\x6e\x47\x2b\x52\xc1\xef\x3e\xb4\x1f\x37\x05\x0a\x6f\x93\xea\xf2\x26\xcf\x9d\x40\x81\x6a\x5e\x7f\x0a\xaa\x2a\xbe\x00\x02\x93\xdc\x5a\x43\x9c\xf1\x83\x94\x25\x9b\x7f\x8e\xc9\x6e\x51\x1a\x20\xde\xb2\xc1\x0b\x70\x48\x05\x40\xc7\x3d\xa5\x3a\x65\x40\x3b\xa1\x6e\x68\xe7\xf4\x51\x01\x14\xd4\xd3\x49\x51\xec\x9e\x8b\x6a\x7d\x51\xc3\xff\xfb\x70\x6a\xa8\xb6\xaa\xc5\x24\x1d\xad\x69\xfb\xe2\x43\xe5\xa3\x02\x85\x7d\xa1\x56\x8e\xfa\x41\x9e\xca\xa2\x2a\xaf\x31\x6c\x82\x4d\xf1\x83\x58\xa5\x07\x05\x77\xf1\xd9\x1d\x1a\xb4\xd7\x6d\xd5\xba\xea\xde\xce\x8e\x30\xe6\x18\xcc\xbf\x47\x05\xc3\x11\x7a\xd3\xe2\x9f\x26\xed\x16\x2d\xe6\x24\xcd\x3c\xe5\x3b\xa5\xe4\x93\x30\xfc\x74\xbf\x1c\x25\xe7\xb9\xd7\x31\x86\x86\xac\xd4\xeb\x5d\x89\xa9\xe2\x02\x91\x36\x51\x4f\x00\xe1\x45\x87\x3e\x59\xdd\x7a\x90\x7c\xab\xb8\xb7\x47\xd1\x68\xd5\xba\x53\x1b\x25\x7e\xde\x14\xfa\x7c\x96\x54\xaa\x13\x51\xcc\xdc\x92\x32\x79\xed\x6b\x38\x36\xcd\xd3\x9c\x5e\x36\x02\x83\x1a\x50\xd4\xde\x8e\xe2\xc4\xb2\x54\x3f\xea\x81\x22\x20\x7e\x79\x07\x58\x3d\xd9\xa8\x2f\x6f\x8c\x16\x0c\x01\x2b\xba\x1b\xa7\x05\xdc\x27\x56\x0c\xd9\x67\xfe\xa8\xee\x1e\x33\x0c\x96\x08\x94\x48\x27\x80\x78\x04\x3f\xdd\xb7\xf0\x55\xd6\x32\x0b\xc8\xbd\x1c\x50\x67\x09\x37\xb7\x2c\x7c\x5d\xf3\xa1\xf7\x46\x26\xae\x98\xa2\xd0\xb4\x03\x00\x02\x62\xb8\x0a\x90\xac\x7e\x31\x1f\x90\xe9\x37\x63\x3b\x8d\xa0\x6d\xab\x81\x92\xc9\xd9\x81\x44\xd5\x9e\xf7\xd7\x6a\x13\x79\x5d\x75\xae\xc8\xd3\x02\xf1\xd0\x05\xe4\xef\xe4\xf8\xe1\xd6\xfb\x01\xd4\x6b\x46\xfd\x4f\x24\xd7\x21\x72\xaf\x53\x8e\x34\xea\x80\xa2\xad\x28\xd2\x15\xc6\x2a\x02\xe2\x40\x02\x1a\xfd\x89\xb2\x63\xf9\x58\xb4\x75\x11\x1b\x68\xb8\xb6\x88\x5b\xd0\x1f\xe6\x50\x5c\x3f\xfc\x54\x48\xca\x8f\x06\x42\xf3\xd3\x5a\xd2\x93\xb1\x5d\xa8\xab\x82\x22\x69\x57\xe9\x31\xff\x98\xaa\x57\x35\x2c\x74\xe0\xda\x68\x5b\x70\x6a\x9c\xc9\x34\x7f\x2c\x82\x4e\x49\x1a\xc8\x75\x29\x0e\x85\x48\x1b\x7d\xf7\xd1\x14\x58\x76\x08\x13\x98\xf0\x05\x88\x63\xb5\xbb\x46\x9e\x35\x0d\x4b\x16\xdf\x86\x76\x30\xe1\x22\x93\x43\xd7\x2f\xed\x76\xfe\x72\x3b\x1b\x4d\x3c\x70\x83\x68\x76\x3a\x41\x79\x93\x55\x27\xd5\xb3\x93\x89\x8d\xb2\x9f\xf8\x84\xde\x68\xe4\x14\x52\xb4\xc3\xdf\x98\x9c\x33\xb6\x90\x8d\x42\x50\xde\xa6\x58\xbc\x59\x67\x1a\x97\x14\x2b\xac\x0b\xe5\x78\xdb\xe4\x2d\xd1\x3c\xf4\xdf\xfa\x3c\xf4\x45\x98\x8d\xff\xf7\x6f\xb0\x47\x4e\x53\x0f\x9d\x4a\xaa\x50\xea\xf4\xa2\xfa\xd8\xaa\x27\x62\x92\xbf\xdf\x76\xab\x07\x69\x5b\xca\x7a\x1f\x55\xc3\x8f\xff\xa1\x1d\xf3\x12\x49\x07\x3c\xff\xd9\xbb\x19\x69\x70\xd7\x70\x89\x0f\x58\x53\xfc\x80\x17\xfb\x3b\x49\xad\x5f\x3c\xfc\x39\xe3\xbc\xd4\xd2\x09\x46\x83\x85\xad\x8a\xf2\x96\x7d\x59\x37\x92\x19\x5f\xfa\xa1\x6c\xf8\xd5\x6f\xeb\x49\x96\x15\x85\xba\xfd\x59\xb2\x25\x47\x39\xc0\xc3\xde\x28\xa3\xda\xce\xd5\x25\x7d\xf1\x22\x31\xd2\xd9\xd7\x76\x27\xab\x8c\xfb\x73\x8b\xfd\x2d\x3d\x22\x74\xa0\x7d\xae\x1e\x00\x79\x85\x61\x5f\xcd\x6f\xd9\xbb\x89\x94\xee\x3f\xfb\xd4\xf3\x5f\x3d\x39\x97\x59\x85\x80\x97\x7f\x55\xba\xd4\xe8\x32\xf1\x95\x98\xbc\x0f\xfe\x7a\x51\x34\xdf\xbe\x58\x07\xd7\x80\x52\x09\x16\xeb\x68\x36\x74\x13\x08\xd2\x65\x22\xa3\xcb\x92\x5c\x2f\xd4\xd5\x49\x46\x5e\x4b\xb8\x9c\xcb\xfc\xfb\xcc\xea\x06\xcc\xbb\xce\x95\x00\x4f\xf4\x6d\x5b\xbf\xc9\x8a\x35\xdc\xc9\x62\x65\xb2\xf3\xae\xdd\x50\xf0\x06\xb6\xa1\xe4\x0c\xa5\xf8\x9b\xff\xfa\xd6\x62\x96\xdf\x6f\x35\x84\x7f\xf6\xed\x86\x7f\x73\x56\xd1\xec\xdb\x0b\xfe\xc9\x75\x4b\xfe\x51\x5e\x7f\x86\x1f\xef\xb5\x21\xda\x62\x40\x3b\x40\xe7\xdc\x12\x30\xec\xb7\x57\xfc\x37\x4a\x1b\x32\x6b\x80\x30\x28\x61\x1c\x5c\x75\x8e\xcb\x2c\x5d\xc6\x80\x8c\xc6\x31\xf1\x47\xc9\x68\x9a\x5d\xb4\x43\x17\x7f\xc1\x69\xa0\xad\xe8\x55\x5c\x8c\x13\xb2\xd9\x7b\x63\xde\xa5\xa3\xe0\xdc\xe8\x7d\xef\x2f\x92\x31\x0c\x46\x49\xbc\x32\x45\x32\x02\x49\x41\xb3\xae\x78\xbf\xd0\x69\xbb\xa9\x62\xa1\x4e\x57\xa7\x98\xfd\x54\x76\xed\x16\x93\x13\xbe\xc9\x34\x61\xb3\x66\x6a\x3e\x1d\xae\x7f\xa9\x7b\x43\xce\x46\x7f\x19\xae\x3f\xe7\x04\xa7\x56\xe2\x4c\x51\xbc\xb1\xce\x91\xb9\xb3\x4c\x33\xb9\x57\xcd\x76\x10\xd9\xfd\x8b\x51\x34\xa5\xb4\x99\xc0\x80\x21\x0d\xd3\x2c\x23\x55\x01\x46\x9e\x5c\x02\x95\xf6\x04\x01\x50\x05\x3e\x3e\x94\xe5\xdd\xbf\xfe\x95\x88\xed\xea\xa3\xf9\xdb\xdf\xf2\xe7\x8f\xee\xe5\xe6\xc3\xca\xb0\x79\x6d\xef\x04\xca\x4c\x87\x43\x5d\xa0\xd0\x9f\x46\xd5\x31\x7e\x1a\xf9\x3d\x93\x21\x99\x7b\x6d\xa5\xfb\x2c\xfb\x9f\x01\x00\x00\xff\xff\x1f\xf1\x3f\xaf\x86\xee\x00\x00") - -func confLocaleLocale_esEsIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_esEsIni, - "conf/locale/locale_es-ES.ini", - ) -} - -func confLocaleLocale_esEsIni() (*asset, error) { - bytes, err := confLocaleLocale_esEsIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_es-ES.ini", size: 61062, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_fiFiIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\xbd\xdb\x8e\x1b\x47\xf2\x37\x78\xcf\xa7\x28\x6b\x20\xd8\x06\x5a\x14\x3c\xf3\xed\x01\x86\x69\xaf\x2c\xcb\x27\x9d\x7a\xdd\x2d\xcd\x0e\x0c\x81\xce\x26\xb3\xc9\xea\x2a\x56\x71\xea\xc0\x36\x3d\x18\x60\x2f\xe6\x72\x1f\x60\xf7\xde\xcf\xe0\x17\xd0\x9b\xfc\x9f\x64\xe3\x17\x11\x79\xaa\x2a\xb6\xa4\xf9\x0f\xbe\x01\xc6\x6a\x56\x46\x9e\x33\x23\xe3\x1c\x66\xbf\x5f\xae\x6d\xbb\x5a\x3c\xcd\x0f\x7d\x57\x57\x59\xde\xb5\xf6\xc1\xb6\x6e\x3b\xd3\x75\x7d\xf6\x5d\xde\x65\x7b\x53\x1e\x6c\xd9\xcf\x66\xdb\x7a\x67\x17\x4f\xba\xbe\x25\xd0\xd9\xda\xb4\xdb\xab\xda\x34\xeb\xc5\xd3\xfa\xc6\x96\xa6\xef\xcc\xcc\xfe\xba\x2f\xeb\xc6\x2e\x2e\xfb\xae\xc8\x67\x5b\x5b\xee\x17\x8f\xf6\xbd\x99\xb5\xf9\xa6\x5a\xe6\x15\xf5\xd1\xdc\x98\x7e\xdd\x67\x6d\xde\xbe\xfd\xfd\xed\xef\x95\x94\xd4\x7d\x17\x8a\xfa\xb2\x6e\xe5\x73\xbf\x5f\xfc\x64\x8b\xbc\xed\x6c\xf3\xf6\x8f\x7c\x7d\x9c\x35\x76\xc3\xbf\x06\x9f\x6f\xed\x55\x9b\x77\x76\xf1\xc2\x76\x5d\x8e\xb1\x75\xb3\x83\x6d\xda\xbc\xae\x16\xaf\xf9\xdf\xd9\xde\x6c\xec\xe2\x02\xa3\xee\xec\x6e\x5f\x1a\x02\x7e\x6e\xca\x32\x9f\x95\xa6\xda\xf4\x28\x7c\x9a\x5b\xfa\xb9\x6a\x2c\x95\x2d\x2b\x7b\xbb\x78\xd6\xd7\xf3\xf9\x7c\xd6\xb7\xb6\x59\xee\x9b\xfa\x3a\x2f\xed\xd2\x54\xeb\xe5\x0e\xf3\x7b\xfa\xf6\xf7\x63\xd7\xbd\xfd\xfd\xe6\xed\xef\x5c\x96\x97\x79\x76\x63\xb2\x52\x66\xc5\xa3\xb7\x6b\x9a\xf0\xd2\xb4\x3a\xb1\xae\xaf\xac\xad\x4c\x56\x84\x9a\x15\x41\x72\xfb\x95\xd9\x25\x4d\x12\x6c\xd5\xb7\x33\xbb\x33\x79\xb9\xb8\x78\xfb\xfb\xb6\x78\xfb\xc7\x9e\x36\x24\xa7\x79\xb4\xed\x6d\x4d\x4b\x7e\x61\x4a\xd3\x9a\xca\xd0\x92\x2c\xbb\xe3\xde\x72\x2f\x75\xde\x99\xac\xef\xd7\xb6\x2c\xa9\xaf\xd9\xca\xec\xbb\xd5\xd6\x2c\x1e\xcb\xbf\x33\x82\xa5\x56\xf2\xae\x6e\x8e\xb4\x80\xfb\x7a\x56\x37\x1b\x53\xe5\xbf\x99\x0e\x2b\xf5\x92\x7f\xb4\x06\xbf\x66\xbb\xbc\x69\xea\x66\x71\x6e\x69\x62\x33\x5a\x8d\x25\xaa\x2e\x5e\xd1\xc6\x67\xf8\x8b\x3f\xed\xf2\x4d\x83\x85\xe4\xaf\xfc\x83\xab\x4a\x11\x57\xe7\x92\x3d\xb5\x61\x68\x36\xf8\x7e\x5d\x37\x85\x7c\xdd\x1a\xd3\x18\x6e\x8b\xce\x19\x97\xd1\x60\xa4\xa8\x4e\x06\x42\x73\xdc\x58\x2e\xfc\x5b\x59\xd2\x6a\xe7\xeb\xb7\xbf\x27\x20\x34\xe7\x99\x59\xef\x68\xad\xf7\xa6\xb2\xa5\x03\xeb\xea\x0c\xbf\xb1\xa9\x66\xb5\xaa\xfb\xaa\x5b\xb6\x38\x1e\xd5\xa6\x5d\x5c\xd2\xac\xaa\xcc\xd0\xef\xbe\xa0\xff\xcc\x7c\xc1\x23\xff\xe9\x58\xf7\x7e\xdb\x17\xe7\xba\xc5\x6d\x2e\xdf\x47\xf0\x54\x40\xbd\x74\xf9\x21\xef\x72\x4b\xed\xd7\xf9\x8e\xda\xd8\xf7\x65\x49\x0b\xf7\xf7\xde\xb6\x5d\xbb\x38\xa7\x5f\x99\xfe\xca\xbb\x59\xde\xb6\xf4\xd7\xe2\x65\xb5\xb1\xe5\xce\x74\x33\xda\xad\x6a\x45\xc3\x3f\xb7\x4d\x8f\x9b\x34\xfb\x39\xaf\x68\x69\xca\xf2\xcd\x4c\xff\x40\x6f\x7c\x2e\xa8\x3a\x0d\x4a\x7f\x1d\x4c\xbe\xb5\xb6\xcb\xea\xae\x33\xb6\x6d\x4d\x66\x2b\x5a\xc3\xc2\x36\x9d\xf1\x87\xed\x8f\xb7\x7f\x54\xb3\x75\xbd\xa2\xaf\x4b\xdc\x49\xba\x40\x3f\xd6\xad\x94\xd2\x69\xcb\xbe\xab\x37\x6d\x6e\xb2\x6f\x18\x82\x56\x86\x2f\x27\x96\xf1\x2c\xab\x4b\x9b\x6d\x8f\x07\x5a\x73\x1c\xef\xde\x66\x5f\x98\xac\x33\xcd\xc6\x76\x8b\x7b\xcb\x2b\xba\x3d\xc5\xbd\x6c\xdb\xd8\xeb\xc5\xbd\xfb\xed\xbd\x2f\xeb\xed\x0d\x8d\xe5\x8b\x87\xe6\xcb\x6c\xdb\x53\x55\xba\x61\x2d\xa6\x4b\x83\xaa\x6c\x95\x15\x3d\x35\xbe\xc3\xf4\x3a\x3a\x30\x1d\x23\x80\x8c\xfe\x29\xe9\xff\x19\xee\x6d\xd9\x99\x8f\x66\x58\x23\xba\xcd\xcb\xf5\x95\xe0\x25\x8c\x0e\x7d\x1e\x80\x98\x6c\xf6\xfc\x78\xf1\x7f\x3e\x3b\xcb\xce\xe9\xe0\x6c\x1a\xcb\x7f\xd3\x7f\xa8\xc2\x5f\x08\x28\xcf\x2e\xf3\x6f\xbe\x9e\xcf\xa8\xae\xac\xd2\x65\x6e\xbb\xba\x30\x15\x5d\x8c\xb0\xdf\x28\xc5\x9d\x89\x0a\xbb\xe3\x71\xbf\x27\x8c\x45\xad\x2e\x7e\xa0\xd9\x57\x34\x24\xbe\x9b\xf1\xbd\x9c\xb8\x7e\xd4\x14\xdf\x5e\xd7\x54\x65\xaa\xac\xca\x77\x39\x0a\x74\xa9\x5f\xc6\x4b\xa8\x6b\x9e\xfd\xf0\xe2\xc5\xcb\x6f\xbe\xce\x76\x35\xed\x5b\xdd\xd0\xe2\x53\x59\xdf\x5d\xff\xef\xcb\x8d\xad\x6c\x63\xca\xe5\x8a\xee\x94\x6d\x80\xe5\x68\xfb\x7e\x97\x59\xb7\x34\xb0\xf9\xac\x6d\x4b\x42\x42\x6b\xc2\x67\x17\xcf\xb2\x8e\x2e\x17\x0d\xab\xdb\x2e\xce\xeb\xb2\xe8\x67\xed\xdf\x4b\xac\x9d\x76\x3d\x5c\x18\x02\xf7\x33\xde\x03\x7e\x9e\x7d\x71\xd5\x7c\xf9\x54\x07\x65\xae\xda\xba\xa4\xed\x21\x24\xea\x00\x68\xc4\x7d\xc5\xa3\xae\x2a\x8c\xe5\x77\xff\x1a\x54\xf3\x99\x6d\x9a\x25\xa1\xd3\xee\x88\xbd\xe2\x41\xbc\xb3\xc3\xcc\xe6\xd9\xa1\xa6\x4b\x5e\x96\x58\xf4\xed\x0d\x66\x84\x76\xf2\xea\x60\xca\x7c\x4d\xdb\x16\x96\x34\xaa\xaf\xeb\x6a\xb1\x04\x49\x1b\x58\xa4\xc2\x52\x33\xd9\xbd\xf9\x3d\xac\xe2\xbd\x07\xf7\xe6\xb3\xaa\x5e\x0a\x4e\x00\xc6\x5e\x13\xa6\xb8\x22\xec\x2d\xaf\x47\x23\xe8\xee\x49\xc7\x6d\xec\x6b\xcc\xd5\xed\xcb\x1f\x98\x21\x5d\x52\xff\xb8\x54\x5d\x4e\x1f\xca\xbe\xa6\x2b\x4a\x53\x38\x7a\xdc\x42\xeb\x9e\xbb\xa1\xcb\x12\x38\x1c\xa4\x27\x24\xa0\xa1\x56\xcf\xca\xe4\xd4\x67\x6e\xbf\xe5\xb8\x5e\xd4\xb4\xb4\x65\xdf\x52\x4f\x96\xae\x4e\x17\x1d\x5a\xbc\xd3\xbc\x2e\x1e\x86\xcf\x99\xfb\xec\xb6\xfc\x99\xc1\x23\x10\x23\x48\x42\x07\x80\xc4\x45\xdb\xe2\xc2\xe5\x2d\x8f\x00\x87\xb1\x3e\x18\xbe\x84\x72\x4b\x3f\xe2\x07\x42\x36\x12\xef\x43\x95\xdd\xf4\x7d\x43\xf7\x96\x77\x2e\x14\xba\xae\x9e\x9a\xbc\x28\x72\xa6\x10\xac\xac\xdb\xbe\xee\xb2\x8e\xf0\x9c\xa1\xdd\x02\xca\xb2\xb4\xef\x3b\xfe\xa1\x7d\x6f\x4d\x61\x77\xb4\xb8\x75\x4d\xc7\xa7\xe9\xe9\x89\xc7\x15\xbb\xe8\xe9\x0a\x74\xa3\xb7\xd1\x95\xfb\xfe\x42\x31\x16\x17\x8d\x1e\xe9\xde\xca\x82\xee\x31\x91\xf6\xc8\x83\xe0\x71\xe7\x32\x6c\x3a\xbd\x34\xd3\x96\x7b\xc0\x46\x03\x9b\x10\x7e\xa0\x0d\xcd\x99\x3a\x28\x8a\x5a\x9f\x5b\xf9\xe6\x3a\xbb\x7c\xfb\xfb\x8e\xfa\x20\xf4\x5a\xf4\x5c\xf1\xe2\xe2\xfb\xac\x28\x69\xe0\x79\xf6\xea\xa7\x67\x36\xdf\xe6\x15\xee\xe2\x76\xb9\xaf\x9b\x6e\x81\x52\xfc\x41\x6f\xb4\xfb\xe6\x5a\x3a\xe7\xcf\x59\xd5\xd3\x51\xa5\xa1\xd5\x9d\xb4\x25\xd7\x08\x47\x3a\xf7\x13\x07\xc6\xc5\xfb\x8f\xc9\xf1\x01\x29\x5a\x7f\x44\xf9\x99\x49\xce\x29\x5a\xe9\xe8\xa9\xc9\xab\x0a\xcb\xb9\xed\xba\xbd\x0c\xe6\xfb\xcb\xcb\x73\x37\x1a\xff\xf5\x8e\xe1\xb4\xee\x44\xd1\xde\x11\x86\xc5\xa2\x75\xb6\xb4\xd8\xb9\x39\x1f\xb0\xbe\x29\xc3\xb1\xa3\xd9\xbb\x8f\x27\x17\x0b\x23\x78\x88\xff\x5c\x0c\xd7\x0c\xbb\x41\x84\x0a\xfd\x55\xe0\xa5\x09\xc4\x8d\xae\x68\x59\x6f\x96\x0d\x61\x45\x39\x86\xcf\x6a\x40\xc9\xf9\x4b\x4a\xfc\x71\x27\x00\xeb\x0e\x1b\xed\xa2\x3f\x60\x74\xb5\xea\x3d\x6e\xba\xbf\x5b\xaf\x09\xbf\x10\x1e\x19\x5c\x2b\x26\xb2\xdc\xed\x8b\x48\x2d\x87\xe6\x62\x32\x61\x47\x4b\xc9\x2f\xc4\xc5\x73\x5a\xe0\xdc\x3d\x13\xfc\xfd\xba\xa9\x77\x8b\x67\xd4\x80\x75\x8f\x85\xff\xec\xb1\x71\xdc\x7c\x19\x81\x56\x59\xdd\x12\x1d\x63\xcf\xb2\x9f\xbe\x7d\x9c\xfd\x2f\x7f\xf9\xf3\x9f\xe7\xd9\x85\x0d\xc8\x62\x6f\xcb\xa2\xc0\x13\x19\x37\xe0\xaa\x00\xd5\xde\x7b\x41\xa7\xe0\x5e\xf6\x05\x4f\xe6\xff\xb0\xbf\x1a\xa2\x71\xed\x7c\x55\xef\xbe\xa4\xe7\xb6\x5e\xd7\x44\x17\xcc\x67\x28\xa3\xcb\xc4\x37\xee\x59\xd2\x7b\xdc\xae\x03\xf3\x88\x6c\x00\x1a\xe8\x4e\x21\xc5\x97\xab\xba\xba\xce\x9b\xdd\xe2\x65\x97\xd0\x1b\x03\x2c\x4a\x67\xa3\xc1\xbe\xd0\x3d\xe3\x05\xaf\xea\x2e\xbf\x3e\x8e\x2a\x25\x33\xcc\xcb\x1d\x4d\xd1\x91\x68\x0d\x91\xf4\x4b\xfc\x93\xaf\xac\xee\xd7\xb9\x5c\x21\x3e\x53\x20\x2b\x26\xf6\xac\xbe\xbe\x26\x00\x2b\x0f\xe6\xb0\xb7\x97\x52\x28\x8f\x68\x0c\x49\x17\x66\x4f\xcc\xc7\x39\xdf\xbc\xe4\xce\x3d\xfe\xe6\x45\xb6\x3b\xd2\x0f\xba\x2b\x74\x75\x2a\x79\x0a\x68\xad\xcc\x59\x56\x08\x3e\x6c\x6c\xdb\x37\x2d\xdd\x55\x7a\xbb\x68\xe9\xbb\xda\x8d\x8b\xd1\xe2\x9e\x80\x8c\xa3\x8b\x08\x11\xe9\xdb\x44\xd4\xf3\xc1\x10\x91\x33\xd5\xe7\x77\x5a\xe6\xf9\xb0\x61\xa5\xd3\xc3\xf5\x55\x79\x85\x0a\x62\x43\x68\x61\x3a\x3e\x7c\x1d\x51\x6a\x7e\xcc\x8e\x89\x29\x7a\x02\xcf\xea\x2a\xa0\x62\xdc\x2e\x8f\xaa\xe8\x92\x85\x83\xbb\xc3\xd3\x88\xd3\x47\x84\x1e\xed\xeb\x7c\x76\x6d\xd7\x16\x1c\xc1\x7a\xa9\xc3\xa2\x9b\x5f\xd0\xb8\x9e\x54\x18\x6d\xf6\xad\x2b\xce\x1e\x71\x71\x9b\x3d\xe3\xf2\x53\xf5\x74\x56\x5a\xdb\x03\x65\x46\x6b\x0b\x14\x61\xc0\x8c\x8e\x74\x54\x5e\xef\x69\xc8\x2d\xd1\xe9\x2b\x9b\xe9\x79\xc9\xae\xe8\x44\xac\x31\xaf\x32\xbf\xd2\x25\x09\x6b\x9f\xd0\x05\x13\x8b\xc8\x0c\x71\x7a\x9c\x27\xeb\x4e\x6c\x83\xbb\x36\x68\x62\x70\x23\xce\x80\x2e\xab\x88\xa4\xc0\x75\x27\x4a\x63\x6d\x70\xa2\xac\x10\x46\x3c\xf7\xa5\x63\xe4\x86\xe7\xd7\x31\x76\x29\x98\x1b\x86\x29\x08\x79\xe4\xa0\xbb\xb5\xe0\xee\x21\x75\x47\x2b\xf4\x25\xd3\xdf\xc4\x56\x2a\xcf\xbe\x3c\xe4\xc4\x0d\x0f\xbb\x3e\x18\xb3\xce\x3d\x17\x5f\x28\x8b\xbb\xe3\xee\xe8\xed\xde\xae\xf1\x76\xe1\xc1\x12\x76\x7c\xaa\x4d\x1d\xe7\x6b\xe3\x38\x0e\x8c\xaa\x08\xcc\x72\x17\x8f\x97\xa9\x35\x9c\x4d\x6d\x5c\xda\xa5\x35\xcc\x69\xd7\xe9\xe0\xde\x18\xa6\x3c\xac\x82\xd0\x23\x20\xed\xf1\x1a\x87\xe1\xb5\x0f\x07\x68\x89\x9b\x99\x2b\x03\xa9\x7c\x9d\xb0\x1d\x17\x79\x45\xb4\x03\xd1\x6c\x8e\xf5\xd0\xcd\x19\xd2\x80\x59\x75\xa4\x71\x80\xeb\xda\x51\x9f\xbc\x00\xd1\xb8\xb3\x1f\xbe\x59\x7c\x46\x58\x33\xae\x57\xe7\x85\x25\x26\x9d\x5e\xa1\xbe\x23\x9a\xc3\x80\xde\x16\x6c\x20\xc3\x10\xe4\xf6\xb7\xa4\x9f\x98\x10\x64\xa0\x13\x32\x83\x01\x15\xea\xf9\x14\xc5\xd2\xa1\xe4\xb5\xe0\x63\x13\x30\xba\x54\x15\xa1\x43\x44\xbd\xc6\x6f\x83\x72\xa2\xcb\x4d\x2d\xcc\x2f\x3d\xa7\x4c\x50\xcd\x3a\x1a\xff\x72\x93\x77\xcb\x6b\xbc\x1e\xeb\xc5\x13\x22\xc7\x6a\xe6\x18\x7a\x5a\x40\x0b\x59\x92\xc9\x3e\x26\x80\x8f\x89\xe8\xdc\x11\x59\x58\x9b\xcf\xb3\xfb\x07\x65\x57\xfe\x82\xe7\x00\x97\x9f\x30\x29\x1d\xe4\xc5\x8f\x7d\x49\x78\xa9\xed\x33\x91\xe2\xd0\x29\xc2\x36\x10\xf3\xa9\xec\xc5\x90\x2d\x35\x20\x39\x0e\x79\x63\xf4\xbc\x5f\xe5\x15\x76\x9f\x48\x40\x69\x40\xde\x4a\x42\x78\x98\xef\xfd\xf6\x2c\x7b\xf2\x43\xb6\xa9\xaf\xfa\xbc\x5c\x2b\x44\x47\xef\xa3\xe3\x40\x88\xff\xd0\x83\x30\xe2\x1e\x5b\x0c\x04\x7d\x63\x0b\x65\x06\xae\x56\x4a\x3a\xc7\x14\x28\xd0\x0e\x0d\x8e\xb8\x74\x19\x1e\x57\xf3\xb4\x2d\x66\x4e\xcc\xc5\x6a\xab\x54\x70\xdf\x26\xc7\x47\xfb\xab\x8e\xc5\x71\x78\xb4\xa8\x9d\x36\x7b\xf0\x25\xfd\x77\xd6\x9a\x83\x95\x87\x78\xe3\x76\x40\x45\x13\x09\x71\x94\xd9\x68\x5b\x92\xd1\x27\xe7\x7f\xf2\xe8\xb5\xe3\x39\xb8\xd3\xd0\xf6\xab\x15\xe1\x8e\xc5\x25\xde\x68\xba\x84\xb5\xf9\x28\x23\xa6\x77\xb7\xb3\xf4\x84\x13\x32\x24\xee\x96\x1f\x8c\x0c\x7d\x75\x6d\x2e\x02\x87\xb3\x4c\x64\x39\x5b\xd3\xb7\x85\x61\x7e\x44\x3f\xf4\x75\x49\x0b\x8e\x2b\x07\xf4\xdb\xe6\x61\x6b\xc6\xc4\xa1\x2c\xb4\xa7\xfa\xb0\x5e\x05\x51\x5b\x46\x36\x67\xf6\x33\x24\x96\x6f\x66\xbd\x70\x48\x75\xb9\x4e\xd9\x08\xb9\x34\xfc\x88\xb5\x53\x62\x36\x57\xc5\x5f\xa3\xf6\x36\xa7\xad\x5a\x7a\xd1\x27\x16\xbd\xb3\xbf\x76\xc0\x62\xdb\x35\x38\x2a\x96\x84\xae\xe9\xa1\x2f\x50\x52\x50\x6b\x66\xb6\x3b\xf2\xf1\x68\x85\xab\x22\x0e\x61\x5b\xdf\xb2\x1c\x51\x3f\x5f\xd0\xef\x0c\xbf\x33\x2f\xa1\xcb\x6d\x0b\xe9\xe3\x0a\xf4\xdf\x55\x8d\xf7\xe5\xe0\xa0\xff\x46\x4f\x37\xcd\x95\x88\x10\xe1\xb8\xd0\x3c\xf1\x7b\x6d\x22\xc1\xa3\x5e\xe8\xb3\xc8\xe1\x5a\x91\xe3\xd1\x27\x46\xbb\x2c\xc4\x7d\xa1\x2c\x3f\x1d\x1e\x15\x45\xcd\xe9\x00\xb0\x74\x2b\x0c\x95\x0a\x0c\x44\x5b\x3f\xab\x58\xf7\xcd\x2c\x94\x75\x2c\x1d\x69\x17\xaf\xf0\x5f\x22\xcf\x4c\x83\x23\xcc\xff\x50\x05\xc2\x6c\xdb\x37\x91\x34\x75\xa9\x32\x38\x48\x55\xb3\xbe\x67\xe2\xa8\xcc\x03\x11\xb9\xb5\x7b\x10\x9d\xbb\x76\xb3\x78\x49\xe4\x9c\x1c\xbc\xaf\xb2\x91\xb8\x18\xc8\xf6\xa3\x59\x5b\xaf\x72\x53\x2e\xdf\x55\xfb\x59\x0e\x19\x93\x54\x49\xdf\x6b\x11\xe9\x12\xdb\x4e\x5c\x4d\x43\x2f\xf1\xe0\x51\xa8\x2b\x61\xba\x2c\x04\xe0\x11\x25\x30\xcf\x12\x59\x0e\x58\xa7\x23\x6d\x06\x9f\x26\x7e\x49\x5a\xc8\xcf\x3d\xa2\x07\x53\x36\xea\x57\x64\xba\x53\xbd\xc6\x27\xd0\x51\xcb\x40\xf8\xa7\x87\x43\xeb\xb7\xb3\xbb\x2b\xb4\x6a\x17\xcf\x7b\x46\xe7\x74\x8f\xe9\xbd\xbd\xa6\x03\xc1\xd7\x44\xb1\xfd\xab\xaa\xde\xd2\x9d\x2f\x82\x34\x82\x41\xec\x9d\x20\x5f\x39\x29\x3c\x21\xa9\xdb\xc5\xa5\x3e\x83\x5d\x21\xeb\x5b\x7d\x95\x25\x52\x78\xac\xf3\xdc\xbd\x33\x42\x0f\x31\xa5\x4f\xaf\x44\xe7\x56\x9b\xe5\xbb\x9e\x13\x18\xf0\x33\x95\x92\x96\x34\xcd\x63\xc0\xd8\x96\x10\xd8\x17\x57\x5f\xde\x6f\xbf\x78\x78\xf5\xe5\x00\xf1\xd3\xcb\x5c\xe8\x1b\x66\xf6\x42\x32\xb4\xb6\x6f\x0c\xbd\x24\x55\x76\x7f\x9d\xe1\x7a\xc7\xe2\x4c\xc0\xad\x95\x91\x4e\x17\x9f\xc6\x47\x5f\xdb\x1c\x04\x43\xb9\xcb\xf3\x02\x58\x87\x25\xba\x56\x2e\x85\x3b\xbf\x8f\x0a\xfa\x56\xcb\xf1\xa5\xab\x41\xf5\xb6\xf9\x15\xbd\x7b\x84\x99\xf2\x8a\x30\x12\xfd\x37\x3b\xd7\x8f\x76\x3d\x28\x17\xc2\xe2\x6f\xd4\x5e\xa6\xed\x11\x13\x99\xed\x3d\x38\x68\x59\x06\x24\xdc\x58\x5a\x42\xbb\x19\xd0\x0b\x0d\x23\x83\x7a\x23\x63\x24\x8d\x4d\xe7\x25\x25\x7a\x3c\xef\xd2\x63\x0c\x42\x5c\x8f\xbf\x21\xc4\x46\x04\x86\x8c\x76\x78\xba\x64\xa5\x73\x22\xfd\xa9\xcc\x0c\x4f\xf5\x1a\xe7\xfa\x2f\x7c\x90\x20\x0a\x64\xcc\x7c\x6c\x72\x39\xe3\xb4\x27\x55\x50\x31\xcc\x67\x5b\xd3\x2e\xfb\x4a\x77\x9d\x28\x78\x3e\xde\xdf\x13\x16\xc6\x33\x4b\xeb\x09\x61\x10\x3f\x80\x4a\x6e\xd0\xc9\xa8\xab\x29\x46\x36\xfb\xc4\xef\xf2\xa7\xf3\x0c\xe2\x69\x9c\x7c\x1a\x18\xed\x19\xa6\x32\x7d\x6a\x0c\xe3\x6e\x47\xa1\x75\x61\x64\x72\x94\x8e\xb4\xd7\xd5\xe0\xd0\x14\xc4\xe5\xe0\xbd\xa1\x97\xcb\xd4\x20\x18\x0d\x78\xb2\x8a\x1e\xf4\x0e\x54\x00\xaf\xae\xce\xe3\xa9\x82\xe2\x15\xc2\xf4\x07\xad\xb3\xc0\x46\x4e\xd3\x89\x85\xa6\x13\x62\x1d\xbb\xbb\xa4\x8b\x06\xbc\xd5\x59\x88\x4b\xba\x69\x76\x1e\x42\x46\x7d\xf2\xcb\x3c\x97\xab\xb0\x63\x61\x89\x0a\xcb\xe9\xd8\xb1\xdc\x09\x63\xc4\x50\xbb\xe9\x91\x7e\xe2\x87\xfa\xe9\x68\xac\xee\x7a\x13\x32\xc5\xeb\x32\x58\xd1\x6a\x26\xcd\x7a\xbc\xf0\x02\x40\x81\x4c\x6c\x73\xff\x1a\xaf\x58\x08\xcd\x27\xcf\xef\x4e\x51\xd7\x84\xf2\x72\xd9\xf2\x6a\x4b\x07\xb5\xc7\xee\x61\x97\x0e\x4c\x93\x09\xda\x8a\x7b\xf0\xe2\xbd\xc1\x1c\x78\x74\x9d\x49\x07\xdd\x46\x8f\x33\x61\xd8\x25\x3d\xa5\x90\xbe\xf9\x29\x11\xde\xed\x85\x4c\xf3\xd2\x93\x03\x16\x00\xb4\xb9\x2a\x20\xfe\x57\x91\x19\xb3\xf8\xb6\x22\x2c\x55\xd6\x2b\x7a\x4c\xdc\x05\x7f\x51\x57\x0f\xf8\x8b\xbb\xa2\x2d\xb1\x4f\x15\xed\x5f\x46\x1c\x54\xb5\xb1\x99\xeb\x9e\xc8\x86\x6d\x53\xf7\x9b\xad\x8a\x14\x67\x3f\x63\x27\xde\x08\xd6\xc0\xb3\xe7\x5a\x4c\x6e\x97\x49\xf1\x87\x07\x16\xb2\xfb\xb5\xd9\x1e\x04\xa1\x45\x3b\xe2\x51\x61\x3e\xdc\x9a\xcb\xe3\xf6\x86\x08\x3b\x46\x6c\x43\xb1\x8c\x23\xca\x7e\x1a\x3e\x6d\x4c\xfd\x55\xe0\x9d\x3a\x4f\xaf\x85\x6a\x2a\x97\x09\xa4\x1c\x8b\x0d\x4c\x85\xe9\x11\xf7\x43\xf3\x23\x36\x71\xf1\x94\xdf\x38\x5a\xbd\xc5\x13\xa2\x33\x68\xc7\xa9\xca\xf3\xbe\xc6\xf6\x11\x20\xbd\x2c\xbb\x37\x33\x10\x06\x2f\xa6\x99\x14\xd0\x0f\x5c\x24\x52\x66\x96\x63\x3f\x19\x29\x3b\xf5\x4a\xcc\xce\x47\xcc\xcc\x4f\x36\x55\x79\x7a\x09\x7b\xd0\x7d\x5e\x5c\x7c\x7f\x29\x32\xbd\x8b\xef\x21\x31\xc8\xb5\x9b\xef\xbb\x6e\xdf\xbe\x6a\xca\x85\x08\x27\x21\xcb\x3c\x37\x47\x9a\xe7\x1a\x1f\xf5\x4f\xfe\x7c\x69\xcd\xee\x85\xe8\x21\x20\x62\x95\xea\x8f\x88\xae\xe1\x8f\xcf\xfa\x83\xd3\xf4\x3c\x02\x5a\x7e\x72\x17\xdb\x34\x7b\x61\x6f\xbf\x6e\x4c\xb5\x92\xba\xf4\x2b\xbb\xe2\x9f\x19\xe8\xd2\xd9\xe3\x7a\x47\xa8\xfc\xa2\xdf\xed\x4c\x73\x5c\xc8\xaf\xac\x95\x9f\x5a\xf8\x1c\xaa\xbd\x8d\x75\x85\x3b\xf9\xa9\x85\x8f\xb7\x75\xbe\xf2\x65\x2b\xfe\x35\xbb\x6c\xac\xe5\xde\xbe\x25\x76\x20\x03\xbd\x4c\xd0\x44\x91\xd2\x81\xd4\x7f\x67\x9e\x2b\xb7\xac\xad\xfd\x65\x4a\x41\xf1\xcb\xcc\x94\xfb\xad\x61\x8a\xd7\xc3\x25\x82\x77\x66\xae\x69\x1d\x04\x15\x8b\x58\x19\x9b\xa2\x57\xbe\xcc\x0f\x39\x1d\xf1\x4f\x1e\x2c\x3f\x0d\xba\x9a\xb4\x59\x7a\x70\xfe\xdb\x4d\xe3\xd3\x1e\x47\x38\xe9\xa4\xcd\x7f\xb3\x27\x9a\xae\x8b\x1a\xbc\x20\x01\x31\xe7\x33\x05\x28\x74\x03\x63\x4e\x46\x22\x79\xa5\x2a\x4b\xe2\xbb\x3c\x0a\xa1\xfa\xe6\xd7\x77\xd7\xb7\xd5\x89\xda\xf2\x3e\x44\x3b\x00\xdc\x4f\x2c\xcc\xc1\x09\x6f\x46\xa8\xc0\x52\x2d\xc8\xde\xef\xa8\x43\xe7\x97\x80\xf2\x6a\x55\xd2\x85\xb8\x73\x5c\xc2\xa2\xd4\x2d\x71\xe7\xf7\xdb\x8f\xd1\x72\x55\x10\xb5\x57\x69\xa5\x4b\x68\x02\xe4\xcd\x66\xf6\xef\x73\x67\x54\xb0\xa4\xc6\xeb\xa6\xb1\xab\xce\x99\x17\xc8\x38\x4a\x42\xf6\x60\x8e\xf1\x48\x79\x44\x1d\xf1\xb8\xee\xa6\xde\x98\xe8\x1d\x0a\x6f\xbb\xcd\x0f\x90\xf5\xc8\xbb\xbf\xab\x6f\xe8\x41\xf6\x16\x12\xcb\x2b\xba\xd8\x4b\x7a\x10\x6c\x35\xc1\xc3\xd5\x4c\xf8\x3b\xea\x58\x05\x59\xc4\x92\x0f\x6b\x06\x94\x33\x55\x85\x68\xe2\x51\x8d\x84\xad\x3a\x59\xb3\x23\x74\x31\xaa\x1a\xa1\x8e\xa9\x3a\xb2\xf7\x0c\x4f\x93\x5c\x27\xd8\x4f\xa9\xa2\x89\x5a\x7e\x3d\xfc\xfa\x86\xbd\x38\xc1\xdb\x46\x1a\x48\x27\xbd\xc0\x06\x11\x12\xa0\x6d\x66\x43\x95\x48\x88\xc1\x92\xa5\xe4\xd1\x72\xc4\x9b\xb2\xf1\x85\xe0\x5d\x10\x73\x6a\x0f\x12\xa6\x78\xb2\x69\x3a\x53\x78\x5e\x3e\xac\xed\x9a\x8b\x6e\xcc\x7b\xb4\xef\x1f\xc5\xf7\x6f\xdd\x2f\x4b\xd4\xae\x97\xc9\xd8\x5f\xa9\x5e\xbc\x9e\x41\x18\x53\x43\x35\xc6\x2a\x15\xaa\xdf\x81\xf7\x96\xd9\x2d\x5e\xd3\x76\x43\x6d\x5b\xa5\x92\x56\x51\xe0\x89\x6c\xd4\xcd\x88\x08\x80\x7c\xc7\x0a\x75\xd7\x6a\x0b\xe9\x15\x71\x78\x67\x84\x9b\xda\x62\xa0\xc2\xa5\xfb\x29\xba\x39\x46\x5e\xf4\x9a\x19\xe8\xc5\x8e\x45\xb4\x46\x74\x53\xdc\x5a\x40\x03\x59\xd8\xa3\xd2\x66\x2c\x88\xd9\x1f\xdb\xee\xc8\x1c\x52\xa0\xc4\x69\x59\xfd\xeb\xd8\x41\x60\xd2\x42\x50\x02\x6e\xf5\x60\x1b\x7a\xd2\x7d\x3b\x6c\x81\xa1\x8f\x83\xab\x6e\xe2\xba\x2d\x75\xb3\x83\xe6\x8f\x59\x10\x83\x0e\x65\xc1\x5b\x3e\xc1\xac\xa4\x3c\x98\x93\xdc\x9b\x25\x5e\x8b\x1e\x56\x27\xba\xba\x24\xba\x72\x5a\x5c\x35\xa3\x8b\x51\x96\x58\x6d\x31\x48\x82\x21\x0f\x9e\x5c\x21\x38\x8f\x5b\x98\x06\xc9\x72\x80\x08\xf4\xcb\x04\x5d\x47\xc5\x07\xb5\xae\x84\x2b\xa9\x3c\x32\x74\x06\x00\x7c\x4f\xf2\xbc\x11\xb4\x58\x59\x96\xe8\x82\xd2\xe6\x1e\xc1\xe6\xc0\x06\x69\xa2\x43\xda\x62\xda\xf1\xe3\x71\xd4\x5f\xbc\x81\xe3\x7e\xf9\x44\x41\xdc\x85\x01\xc8\xf3\xa5\x23\x71\x0d\xd2\xe6\xf2\xc3\xc1\xc3\xc0\x21\x1b\x4e\x5e\x99\xda\xb8\x1f\xe5\xb6\x86\x2b\xf1\xef\x4d\x7d\x26\x86\x3e\x4b\xa1\x55\xe2\x5b\x51\x6f\xd7\x56\x49\x98\xdc\x8c\xaf\xc5\xec\x67\x5c\xa3\x37\x33\xa1\x98\x55\xab\xb3\x78\x2c\xf4\xf3\x91\xd9\x5f\xfe\x34\xa3\xcb\x58\x2d\x6b\xe2\x9b\x89\xd7\xa1\xfb\x72\x9c\xc5\xf2\x2f\x15\x33\xa9\x5d\xd5\x91\xa5\xc2\x7c\x87\x44\xe7\xdd\x41\x84\x51\x96\xf5\x2d\xa4\x50\x17\xcc\xf6\xdf\x98\x8e\xf6\xcb\x00\x2f\x2c\xde\xfe\x8b\xae\x9e\x65\xa1\xc9\x51\x01\x21\xda\x64\xc0\x0e\x04\xad\x7c\xd3\x9a\x74\xf0\xf5\xf7\xb3\x7a\x6f\xf9\x4c\xe2\x33\xdf\xd9\x19\x44\x25\xbb\x39\xa3\x5c\x10\xe0\x44\x19\xaf\x27\x10\x2d\xde\x4f\xe5\x74\x61\x38\x39\x8f\x6a\x11\xf5\x45\xd8\xaa\x12\x2e\x90\x87\x3c\xd5\xc0\x0e\x08\x40\xde\xe1\x21\x4e\xc0\x92\x3a\xa3\xb3\x37\xb3\xa1\x59\xda\x84\x59\x92\x2e\xb9\x28\xda\x66\x7a\x8f\x5b\x4f\x0c\xc3\x3a\x4d\x84\x68\x84\x23\xda\xdc\x98\x92\xb5\xe2\x60\x4a\xd8\xd0\xa4\xcc\x57\xfc\xda\xb5\x4e\xeb\x2f\xba\xd4\xa1\x90\xb1\x9b\x11\xb9\x6d\x89\xa1\x55\x95\x17\xcb\xf4\xfa\x3c\x99\x5c\xf6\xc3\x37\xb3\xd9\xbe\xbf\xa2\x26\xbd\x3d\x9d\xdf\xc9\xbd\x9f\x81\x1a\x58\x8a\xe6\x65\xc4\x04\x30\xf7\xc3\x6f\xa1\xab\xe9\x4c\xa9\x6c\x17\x33\xc6\xcc\x34\x77\xc7\x03\xfe\xf4\xda\xe3\x1c\xf2\x14\x82\xaf\xb0\x80\xfb\x7a\x4b\x24\x25\xbe\xb9\x63\x54\x8b\x55\x02\x13\x96\xc0\x55\x76\xdb\x1d\x59\x98\x77\x03\x3c\x6e\x7a\x96\x0a\xf8\xa7\xd6\x3f\xbe\x2a\xd8\x5b\x13\x07\xf4\xc0\xe9\x74\xf9\x70\xb2\x21\x59\xdb\xd9\x81\x0e\xd5\xe6\xba\x9b\x78\x94\xf2\x6d\xc7\x32\xaa\xf8\x99\xa0\x4d\xc1\xeb\x7e\x0d\xa3\x41\x51\xee\x10\x89\xca\x0c\xc6\x84\x79\x2b\x38\x54\x56\x57\x5e\xe4\x37\x86\x15\x92\xfd\x7e\x0d\x3e\xd2\x9f\x8d\xb7\xbf\xe3\xd6\x00\xbf\xb8\x35\x4e\x21\x3c\x83\x18\x8c\x1b\x59\xd0\x28\xf5\x44\x06\xa7\xbc\xa2\x15\xe5\x94\xde\xe6\xd3\x06\xab\x3c\xb1\x35\xa4\x94\x43\x58\x27\xa6\x52\x3b\x11\xe8\xea\xeb\x36\x32\x17\xe9\xcc\x1e\xaf\x11\xd8\xf3\x02\x56\xb4\x55\x41\x8c\x8c\xee\x25\xe8\x41\xde\x5d\x88\xe4\x20\x0f\x23\x1c\x46\x47\xc8\x74\x85\x19\xd9\x4c\xaa\xe2\x58\xd5\xc8\x57\x47\x11\x8e\x88\x9a\x59\xb5\xce\xd9\xd5\x31\xc3\xd7\x93\xda\xea\xa1\x9a\xda\x69\xa9\x9d\x92\x15\x42\xde\x9d\xc3\x69\x43\xb5\xa8\xd3\xb1\x77\x7d\xa2\x52\xa7\xf5\xa8\xeb\x56\x25\xe1\x52\xf3\x35\xeb\x42\xac\x08\xc3\x13\x58\xdd\x27\x67\x0f\x30\xda\x48\x00\xa9\x4e\x46\xef\x1f\x0d\x8a\x70\x5e\xd5\x2d\x53\x1b\x02\xaf\x34\x1a\x34\x0f\x16\x37\x4c\x9b\x91\xd2\x32\xdf\x81\xbd\x3c\x1f\x2b\xfa\xf9\x24\x38\x4b\x06\xcf\x6b\x50\x43\xf3\x74\xa0\xa3\xf3\x04\x98\xd6\x2b\x8f\xee\x3e\x5a\xee\xbc\x44\xda\x49\x56\xa7\x78\xb1\x46\x5d\x46\x14\xde\x0b\x37\x2f\x5f\x8c\x75\x0d\x82\xec\x3e\xa2\xed\xe8\x45\x81\xac\x60\x99\x40\x8c\x6d\xa5\x65\x1b\x7c\xa5\x09\xca\x7a\xd4\x69\xa2\x0a\x9c\x0f\x67\xe0\x97\xe3\xc2\x0b\xae\x98\xcc\x8c\xe7\x1d\xee\xcb\x3c\x7b\x4d\xe3\x81\x04\xdd\xeb\xaa\x4d\xa4\x13\xd7\x8b\x66\xf9\xe9\x16\x41\x64\x17\x89\x3d\x62\xfc\xa4\xc3\xf8\x8f\x60\xa7\xa8\x7d\x61\x55\xda\x69\xd4\xdc\x39\x2b\x6d\x05\xfa\x9e\x5b\xa2\xb3\x3d\x16\x70\x76\x16\xe6\xda\xc2\xf7\x30\xae\x7f\x42\xa4\x46\x0b\x1c\x36\x29\xf5\x82\x3c\xd4\x19\xbd\x39\x4c\x1f\xe3\x75\x31\x6b\x61\x04\x1e\x63\x73\x5a\x8f\x26\x67\x61\x8a\x6f\x1e\xef\xb8\x7e\x54\x59\x1b\x14\xa4\x62\x2d\x2d\xfd\x13\x23\x9c\xbb\xfb\x24\x10\x72\x8d\xfc\x68\xa9\x84\x31\x6e\x22\x48\x8f\x68\xfb\x01\xa0\xcc\x4f\x30\xde\x94\xc4\x9b\x69\xc4\x98\x35\x70\xe4\x18\x4d\x6c\x6b\xab\x14\xfd\xd1\xf5\x13\x2c\x58\x8a\x46\x34\xa3\x35\xee\x0d\x54\x31\x37\x40\x84\xe6\xab\x61\xe7\xfe\xf8\x0d\x54\x2c\x41\x91\x94\x1c\xc5\x8f\x66\x66\xbd\xe6\x4b\x22\x53\x7f\x26\x67\x4f\xaf\xc5\x68\x5b\x18\x3a\x85\x4c\x04\x5e\xbe\x78\x99\xe8\x83\xa0\xb7\xf8\x77\x75\x40\x20\x8b\xfe\x27\xab\x7f\xfc\x24\xdc\x62\xbe\x9a\x5c\x0d\x4f\x9c\xb0\xf7\xc7\x14\x76\xd3\xeb\xe1\xc9\x30\x7f\x41\x3c\x3d\x96\x1b\xee\x0e\xcc\x96\x5b\x50\x66\xad\x98\x74\x8b\x0e\x12\x77\xd3\xd3\xea\xd8\xb2\x76\xaf\xa2\x6a\x0a\x8e\xb9\x37\x0a\x95\x26\x69\x65\xe6\xd9\x53\xe6\x25\x2b\xa9\xac\xa4\x9f\x5c\x75\x58\xca\x14\x96\x91\x82\x21\xa4\x41\x1c\x66\x25\xfa\x52\x87\x18\x0e\xcc\xbb\xb2\x59\xad\xe5\xbf\x41\x9c\xd3\xf5\x02\xb3\x47\xc3\xb0\x30\xa8\x85\xc1\x0b\x90\x52\x53\x58\xe1\x90\x99\xeb\xe3\x85\x87\xcd\x07\xd1\x5c\x62\x23\xab\x22\xfe\x2f\xda\xae\xa9\xab\xcd\x97\x4f\x3a\x5a\x41\x3e\xd6\xa0\x06\x68\xf4\xd5\x57\x5f\x3c\xd4\xb2\x4b\xb7\xab\xdf\xe5\xdd\xb6\xbf\xa2\xf6\x6b\xc2\x6e\xf0\x3b\x08\x7e\x06\x65\x5f\x13\x7b\x13\xb1\xa0\xec\x72\x00\x3e\xa6\xc1\x75\xa0\xcb\x9c\xc2\xb3\x35\x75\xce\xcb\x07\x77\x8b\xdc\x30\xbc\xbc\x01\x07\x60\xde\x82\x38\x1a\x23\x86\xb9\x91\xe9\x96\x1a\x44\xb9\xab\x11\xef\x8e\xef\xd9\x11\xd7\x91\x18\x87\xc9\x5b\x48\x01\x64\xbd\x2b\x2f\x70\xfb\xc3\x5b\xd6\xe1\x7c\xcf\x7d\x55\x26\x91\x44\x02\x44\x6c\x79\x05\xa2\x8f\x69\x5c\x47\xec\x8a\xfc\x5a\x44\x41\x81\xcb\x72\x35\x41\xe5\x73\x37\x4c\x2c\xe2\xeb\x4a\x05\xbd\x17\xae\x5f\x77\xb8\xd2\x93\x1c\x44\xe3\x8e\x77\x99\x3e\xc1\x1f\x39\xb4\x88\x05\x50\xa4\xe8\x86\x1e\xd0\xa2\x67\x2d\x52\xa4\x38\x04\x4c\xd1\xe2\x89\x5a\xc1\x2c\x5f\xcc\x13\xc7\x28\x51\xed\xbe\xfa\x77\x60\xc5\x51\xef\x1e\x2f\xfa\xb9\xbf\x0b\x29\x32\x7b\x2a\xcb\x22\xf2\x1e\xde\xa8\xa7\x6e\x17\x69\x24\x34\x7a\xbc\x1d\xf0\x39\x70\xbc\xea\x93\x5c\xbe\xe3\xe9\x15\xd6\x48\x79\x56\xc3\x1b\x84\xbb\x61\xfd\x4a\x74\xee\xb6\x0b\x07\xe2\x0f\x48\xf6\xbf\x09\xcd\xc4\xef\x87\x43\x62\xb3\xae\xa6\x5b\x3b\xd1\x82\x1a\xc0\x3b\xd1\xf2\x7b\xb4\xe4\xf1\x92\x70\x82\x1e\x2b\x39\xcd\x23\xb8\xb7\xd6\xb1\x87\xb9\x37\x4b\x74\xe6\x17\xa7\xd0\x52\x82\x8e\x42\x7d\x65\x10\x6d\x2e\x96\x14\xce\x4a\x52\x36\x18\x75\x6a\x36\x76\x90\x4b\x09\x66\x54\x91\x08\xd1\x99\x15\x61\x81\xb5\xa3\x6a\x19\xb4\xd5\x8f\x61\x3f\x3d\x1b\x2b\xbc\x60\xa5\x70\xc9\xf6\x06\x54\x6c\xb8\xd6\x92\xd7\x32\x4c\x9c\xce\x58\x91\x97\x6f\xff\x20\x6c\xd0\x19\x9e\x72\xbc\xa8\x3c\x77\x71\xd7\x50\xa3\x16\xa9\xee\x4d\x5a\x92\x1d\x90\x7d\x6a\x65\x95\x08\x84\x90\xce\x00\x84\x9d\x56\x08\xfb\xac\x4d\xc4\x09\xc2\x66\x17\xd2\xb6\x47\xe7\x3f\x80\xfb\xac\xf8\xa6\xfb\xbe\xa4\xb5\x1f\xeb\x22\x19\x59\x2e\x62\x20\x11\xec\x84\x4e\x02\xd7\x24\x75\x19\x57\x9c\x47\xd5\x14\x63\xf8\x29\x85\xe9\xa4\x33\x49\x01\x64\xc9\x6d\x1b\x37\x55\xf0\x33\xd4\xd7\x5d\x9e\x0f\x68\xdc\x8f\xb2\xd7\x03\x11\x6c\xbd\x87\xcf\x5e\xd6\xda\x4a\x8d\xe4\xd8\x7e\x52\x64\x9e\x56\x9c\x72\x82\x8d\x67\xa2\x75\x67\xc3\x6b\xa8\x72\xf3\xca\xa3\x24\x19\xb3\x22\xa5\x78\x57\x03\x66\xfa\x3e\xdd\x55\x5b\x25\x6b\xa7\xc7\xa3\x9e\xae\x9c\x62\xab\xed\xfb\xb4\xf4\xbe\x18\x4c\xab\x76\xce\xfb\xa2\x00\x99\x33\x81\xc2\xe2\x89\xfa\xe3\x9e\xce\xa9\x4a\x47\x52\xdc\x49\xe9\x65\x6f\xff\x85\xe3\xd2\x57\x78\xf2\x1c\x53\x26\x27\xcf\xf9\x81\x30\xd1\xcd\x56\xee\x74\x63\xb4\x7f\xa7\xcd\x8e\x44\x3d\x81\x5e\x76\xec\xbd\xd2\xe0\x41\xb2\x28\x72\x85\xfd\xb1\xc5\x9c\x41\xe1\xdd\x18\xc7\xc3\x78\x5a\xe0\x87\xec\xf5\xcb\x1f\xfc\xf3\x9f\xed\x99\x99\x47\xed\x78\xbb\x9d\xfd\xea\x60\x34\xfe\x70\xe9\x26\xa6\xc5\xde\x07\xb0\x0c\xdb\x3c\x80\x88\x91\x18\x1b\x3b\xea\xb2\xe1\x4e\x96\x35\x3c\x38\xc5\x36\xf7\x2c\xdb\x0e\x37\x66\xf6\x33\x08\xa2\x37\x33\x91\xfd\xbf\x54\x31\x7c\xd0\x3a\xc5\xda\xed\xa0\x8a\x52\x4a\xe8\x7b\x26\x62\x23\xdd\xc9\x11\x27\xbc\xe5\x0b\x42\x94\x65\xdf\x67\xe5\x71\x2b\x38\xf4\x8c\x28\x24\x8b\x52\x98\xa9\xf4\x62\x1f\x70\xc3\x4a\x80\xbe\x2b\x8d\xe9\x7a\x45\xae\xfc\x84\x10\xbf\x56\x0b\xd6\x24\xc0\xfc\x0a\x02\xbd\x23\x8c\xfd\x8a\xe3\xe1\x78\x6c\xe5\x23\xbe\x0d\x3c\x77\xd8\x6b\x8a\x86\xf2\x45\xbb\xa7\x89\xaf\xe0\xd0\xb0\xb8\xd7\x83\x4c\x26\x32\xda\xfe\xda\x11\x09\x45\x4f\x5c\xc7\x1c\x30\x6d\x15\x01\x7d\x39\x6a\x0b\xde\xbd\x2b\xd0\x30\x23\x43\x38\x3e\x8e\xa6\x80\x8b\x2a\x8c\x41\xe4\x4a\x28\xd3\xad\x82\x79\x08\xdb\xd8\x1a\xe7\x3d\xc6\x00\x4a\x6e\x3c\x08\xf8\x16\xbb\x59\x7d\xf2\xa8\x39\xb0\x28\x16\xac\xac\xdc\xc7\x20\x6c\x92\xee\xe9\x44\xa0\x46\xc1\x6e\x47\x9f\xce\x56\x65\x5d\xf9\xcd\x89\x4d\xdd\x88\xb3\x30\xe2\xc3\x64\xd8\xd3\xb7\x35\x5f\x65\xaf\x85\xf8\xb0\x81\x43\x21\xea\xf9\x4e\xc7\x58\x38\xc1\x83\xe6\xfc\x68\xc6\xc3\x64\xf9\xfd\xb7\xe8\xde\x88\x13\xb4\x7c\x66\x1f\x22\xf7\x59\x7d\x34\x70\x02\xa4\x74\xb4\x77\xea\xc2\xb8\xd3\xeb\x02\x20\x3a\x0d\x95\x3b\x55\xba\xe9\x5d\xe7\x75\xa1\xe2\xe6\xdf\x1f\xe0\x8e\xcd\x1f\xe0\xfd\xae\x9e\xef\xfc\x7b\x93\x77\xf9\xa6\x82\x61\xaa\x73\x59\xa2\x83\xb7\xea\xb2\xb9\x2f\xc8\x9c\xff\x7c\x3b\x2b\xf3\x15\x9d\x58\x0b\xea\x88\xfe\x25\x64\xa0\x1f\x5c\x5d\x27\xe1\x2a\xb5\xdc\x09\x91\xa8\x2b\xb3\x66\x13\x0a\xcb\xc6\x8a\x0f\x06\x05\xc3\xfa\x1e\x8e\x05\xe4\xd0\x14\xd5\xcb\xbc\xca\xbb\xc5\x23\x46\x55\xc0\x27\xfe\x08\xb3\x85\x71\x9f\xb3\x01\x83\xb6\x9a\xab\xb3\x23\xd7\xa6\xbf\x9d\x55\x2a\xef\x01\x1e\x3b\x5e\xff\xb5\xbd\x36\x7d\xe9\x74\x1d\x50\x22\x82\x39\x95\x5f\xea\x0d\x4f\x58\x8e\x70\xe8\xe2\x1c\xff\x4d\x3e\xc9\xba\xfe\x64\x77\x84\x3e\x33\x53\xc1\x07\x71\x57\x77\xf6\x41\xd7\x98\x15\x3d\x0b\x1b\xfa\x7d\x6d\x1b\x5b\x11\xe6\xce\xba\x2d\xb8\x22\x98\xf9\x11\x27\xd2\x64\xac\x4f\xe1\xa7\x7b\x6b\xb5\x9a\x6b\x3a\x87\x86\x93\xe6\x23\xc6\xbb\x19\x28\x49\xb6\x79\xc8\x3e\xa1\x3d\xee\x72\xf3\xa9\x03\x24\x22\xb5\x61\xc1\x1b\xc3\x29\x83\x9e\x96\xc9\x08\x13\xcd\x68\x29\xcc\x5e\xc2\x63\x8b\x1d\x1d\x84\x3f\xa9\xef\x05\xa4\xbb\x20\xce\xe6\xae\x59\xa6\x83\xdb\x63\x85\xeb\xfe\x8c\xfe\xce\x2e\xf8\xef\xd9\x2d\x94\xfc\xd0\xc7\x80\x89\x2b\xd4\x2f\x83\x55\x32\x1b\xf3\x1b\x7f\xc7\xa1\xce\xb7\xa6\x69\x0c\x63\x4b\xb6\x54\x2d\xc0\x11\x43\x6b\xa2\x9a\x16\xda\x9f\xd5\x56\xed\x1b\xeb\xeb\x25\xef\x17\x47\x28\x70\xba\x53\x58\x10\x12\x97\xdf\x2b\x3e\xd9\x11\x4f\x0f\x14\x4a\x04\x08\x2d\x4c\xc3\xfa\x62\x62\xff\xb1\xaf\x66\x3e\xa5\xbc\x89\x6c\x00\x3e\x50\x6b\x13\xd5\xbc\x5b\x5d\x43\x8f\xed\x7a\x09\xa5\xa6\x22\x13\x7e\x4f\xfa\xbd\x99\x69\xd4\x04\x71\x40\xbf\x80\xd6\xad\x56\xdf\xf3\xb8\x64\x0a\x3d\x3b\x05\x30\xfb\x65\xa6\x58\x12\xe8\x31\xbb\x22\x0a\xfc\xde\x97\x08\xb7\x90\x3b\xec\xe8\x9a\xe4\xb3\x8e\xce\x1a\x6d\xcc\x95\xcc\x05\xef\xb9\x23\xf4\x94\xf1\x9c\x09\x87\x68\x02\x28\x79\x32\xbd\xb9\x50\x70\xf8\x7c\xf8\xdd\x0f\x97\x30\x40\x11\x9d\xa6\xf7\x76\x8b\xbc\xc8\xd4\xa1\x73\xee\xdb\xa7\x99\xd2\xd6\xb6\x42\x6f\x55\x39\xbf\x21\xea\x7c\xe3\xa4\x92\x5d\x5f\x1f\x62\xef\xb9\x5c\xf0\x26\xd4\xde\xae\x95\xe0\x24\x00\x7b\x3e\xf6\x10\x78\x1d\xb9\x2c\x64\xb1\x1c\x94\x07\x70\x36\xd4\x5c\xf2\x90\xf5\x5b\xe4\x48\xea\x3a\x50\xf5\xb4\x6c\xda\x84\x72\x5a\x2f\x07\x63\x71\x8d\x7a\x91\x99\xb2\x30\xb6\xe2\x53\x4e\x07\x82\x8b\x04\x4f\x13\x5d\x36\xc2\xf0\xec\x2c\xda\xda\xf2\xda\xa1\x76\x01\x95\xa9\xc2\x6d\x16\xda\x11\xc8\x00\xf8\x22\x74\xa0\x8a\xf6\xc7\x25\xd4\x25\x8b\xa7\x4c\x56\x87\x0f\x9e\x52\x94\x82\xae\x8f\x80\xd5\xb6\xe7\x1c\xfa\xea\xec\xbf\xfe\x9f\xff\xf7\xc1\x63\x9e\xf8\xe3\xae\x29\xe9\x4f\x21\xd0\x55\x4e\x86\x4a\xd8\x0f\xd7\x4a\xf6\xf2\x29\x71\x5e\x7c\xcd\x9d\xa6\xb4\xd3\xab\xde\xcb\xed\xf7\x57\xdf\x12\x60\xcb\xda\x08\x22\xe8\x32\x71\x33\x67\x54\xe0\x55\xb3\x3a\x6d\x7e\xf1\x66\x60\x9f\x45\x22\x9c\xb3\x7a\x01\xa8\x7d\xf6\xf7\x3e\x5f\x15\xcb\x4d\x9f\xaf\x09\xef\xd2\xee\x41\x12\xa4\x4f\x75\xb7\xcd\x5b\x39\xd7\xee\xd0\x46\xef\x40\xec\x79\xc0\x0f\xdb\xaa\xde\x11\xe7\xb7\x0e\xbc\x1a\xdf\x28\x75\x45\x6a\x88\x02\x86\x04\x61\xb6\xef\x61\xe4\x06\x94\xac\x1a\x76\x22\x40\xd9\xbc\xd2\x1d\x10\xa6\x50\xa6\xeb\x72\x37\x34\x24\x0e\x06\x30\x24\xab\xc4\x98\x6e\x28\xbe\xa4\xfb\x4c\xab\x07\x01\x41\x9e\xf2\x36\x33\xb6\xac\x7d\x0a\x53\xda\x99\x3e\x48\x62\x3e\x38\xeb\x1a\x4b\x2b\xd1\xf7\xb3\x6b\xea\x95\x48\x2e\x55\xcd\x23\xca\x41\x67\x36\x70\x21\x62\x31\x96\x44\x57\x11\xd3\xe8\x8d\x6b\x83\x58\x36\x69\x25\xef\x66\xf4\x19\x48\x7a\x33\x11\x88\x04\x34\xaf\x44\x2b\x79\xb0\x3f\x1e\x69\xfa\x7f\x74\xb3\xd2\x5c\x59\xfa\x78\x29\x2c\x39\x4b\xfc\x69\x83\x41\xe4\x51\xcd\xe7\xcc\x72\xec\x89\xfb\xee\xbb\xd9\x8a\x8d\x10\x5b\x35\x46\xcc\xe1\xf9\xc7\x96\xec\xad\x77\xea\xea\x66\xac\x7e\x6c\xcc\xed\xe2\x27\x43\xb3\x97\x9f\x5b\x5c\xb5\xe6\xb8\xf8\x9e\xff\xcd\xf5\x2b\xfb\xab\x00\xd2\xb9\xab\x34\xa1\x06\x90\x86\xe1\xb3\x7f\x2e\xec\x05\xeb\x0d\x89\x5d\xe5\x52\xd8\x06\x97\x20\xc7\x16\x97\xd4\x74\x86\x6f\xb0\xb5\xa7\xcf\x19\x7f\x86\xa9\xfd\x15\x61\xec\x2d\x51\xef\xb3\x99\x5d\xc3\xe6\x60\xce\x21\x6a\xa0\x3d\x85\x85\x26\xfe\x70\x05\xa2\x33\x93\xb2\x57\xfc\x77\x52\x8c\x7f\xa4\xf0\x09\xfd\x95\x14\xed\x1b\xcb\x93\x10\xbd\x0c\xb4\x63\xfc\x3b\x13\x63\x88\xd6\x81\x89\x89\xf1\x92\x1b\x82\x4d\x32\x10\x3a\xb7\x48\x2b\x29\xd6\xc7\x28\x22\xc2\xa1\x7a\xc0\xb8\x9e\x8b\x92\xee\xf9\x3e\x84\x31\x74\x6e\xd6\x0e\x68\x47\x17\x6a\x79\x65\x97\xd4\xb8\x71\x54\xce\xdf\xea\x3e\xc3\x77\xac\x04\x9d\x52\xe3\xac\x52\x69\x6d\xe8\x4d\xa5\x6f\x0d\x54\x87\xfb\x1a\x8e\x08\x32\x5e\x14\x8d\x9a\x66\xdc\x75\x65\xaf\x41\x37\xe2\x53\x68\x17\x25\x02\x1f\x42\x0f\x65\x02\xc9\x13\x02\x71\x04\xca\x27\x6e\xcd\xf1\xbb\x7e\x3e\xdf\xf0\x87\x13\x33\xda\xc2\xf3\xed\xb6\xc9\x3b\x27\xd3\x09\x9d\xa3\x28\xe3\xa2\x4c\x8a\x3e\x78\x5e\x62\x91\xc0\xc3\x71\xe8\x94\xad\x69\xf9\xcd\xdf\x1a\xa2\x0f\x41\x35\x09\xc4\x3a\x53\x10\x28\xf0\x8f\x1f\xf9\x23\x05\x4a\x82\x3d\x48\xe4\x60\xd1\x4f\xb1\x80\xc1\x4f\x78\x78\x45\x7d\x79\xfe\x90\x18\xe9\x8c\x5e\xdb\x6c\x9d\x43\xf5\x48\x6b\x76\x96\xdd\x60\x46\xa0\x0c\x32\xda\x5c\xba\xee\x34\x01\xcc\xe8\xe1\x3c\xbb\xac\x99\x70\x04\xe9\x19\x57\xd8\xd4\x32\x27\x4b\x83\xdc\xe4\x50\x84\x6c\xb2\xfa\x5a\x57\xdb\x96\xeb\xa8\x91\x2b\x22\x53\x89\x5e\x58\x59\x3f\x1a\x7a\x1d\xea\x26\x3a\x9b\x2b\x5b\x2e\xd9\xd2\x66\x21\x3f\x7c\x11\xdf\x72\x7f\xb8\xd5\x02\x79\x70\xb6\x21\x44\xed\x88\x69\x58\x3c\xa2\x29\xd1\xd2\x3d\xfc\xc2\x4d\xf6\xcb\x8f\x23\x18\x57\xfc\x71\xb8\x74\x6b\x0e\x2f\xc5\xff\x24\x25\x6a\x75\xa2\x07\x23\x2e\xd1\x01\xa9\x7d\xb4\x3c\x28\x68\xd7\x40\x8b\x20\xd1\x20\x88\xe6\xee\x6c\xb5\xa6\x0d\x43\x69\x93\xf3\xe7\x68\x27\xb4\x09\x59\xca\xf2\x48\x98\x44\xce\xa2\xde\x19\x9d\xa3\x2b\x76\x8b\xac\xd2\x0c\x47\x90\x09\xf0\x03\x4c\xf2\x1e\x7b\xb5\x38\xe9\x86\x14\x84\xce\xc2\x3b\xe5\xda\xe7\x2f\xb4\x97\x4e\x3e\x52\x79\x6b\xf1\xd0\x0a\x5d\x20\x39\xae\x32\x58\xde\x4b\x3c\xad\xf4\x57\xb6\x8f\xe2\x4c\xcd\x63\xcc\xe6\xcc\xb8\xd8\x7a\x05\x0b\x33\xb0\x43\x8f\xd7\x40\xec\x2a\x1e\x27\x9b\xed\x8f\xa8\x22\xab\x2b\xab\x8f\xdd\xb7\x5a\xe0\x1c\x25\x08\x9b\x70\x81\x6f\xce\xbd\x52\x25\x18\xbc\xa3\xbc\xb0\xee\x31\x92\xcb\xa4\x45\xc2\x0f\xb5\x19\x94\x4a\x29\xd6\xf0\x6d\xf9\x23\x8e\xc7\xd6\x28\xc6\xab\x3a\xc2\x2b\xdc\x50\x2e\xac\xd4\xde\xc0\x1e\x82\xcd\xde\x81\xf6\x8d\x3c\x00\x18\x5c\x74\x49\xee\xea\xc6\x4f\x96\x7b\xf1\x55\xe8\x35\x11\x6c\xc5\xf3\x95\x1e\x5b\x9c\x2e\x1e\x38\xee\xd8\x7b\xb7\xbe\x54\x04\x48\xf8\x7e\x29\xdc\xa0\x5b\x18\xd7\x87\xb4\x4f\xd8\x22\x33\x11\xbe\x1c\x30\x8f\xad\x9b\xf2\xa9\x6e\xe4\x72\xae\x97\xb7\xdb\xa8\x53\xc1\x63\xaa\x27\x0a\xa8\x4c\x61\x61\x27\xb8\x62\x3c\x25\xa7\x8a\xbe\x68\xbd\xf9\xdd\x62\x8e\xc7\x25\xd1\x6b\x19\x71\x80\x56\x14\x72\x75\x86\x88\x5d\xb7\xe0\x79\x19\x1b\x27\x9d\xd0\x19\x76\x67\x5c\xf0\x90\x3b\xcc\x1b\x56\xe8\xb9\xb3\x0e\xf1\xd1\xc1\x36\x82\xc8\xbb\x6d\x84\xb4\xd3\x79\x0e\x4e\xd7\x23\x59\xc2\xdb\xbc\x93\xd3\xfd\xa1\xe7\x8c\x76\x45\xbb\x01\x06\x00\x9d\x80\x7d\xa1\x7d\xc0\x5e\xd0\x1e\x44\x0f\x07\x0a\xc3\x58\x38\x9c\x4c\xbd\x54\xe3\x18\x3e\x9f\xdf\x32\xe3\xc0\x91\x2a\xf8\xeb\x43\xb9\xf6\xd1\x26\xf3\x30\x99\x2c\x67\x56\x22\xc2\x9c\x6d\x7f\x45\x47\x8a\x91\x98\xfc\x29\xa7\x2b\xba\xac\x6a\xb3\xcb\x7d\x7a\x32\xa5\x4d\x3a\xf5\x14\x0b\x8f\xf7\x8e\x1e\xe3\x16\xd0\x22\xba\x7e\x35\x51\x7d\xe6\x08\xbd\xf9\x88\xe0\x73\x05\xea\x12\xfc\xa4\x23\x6a\x5b\xbe\x59\x16\xd2\xbb\xf2\x6b\xe8\x74\x50\xea\xbf\x80\x5d\x86\xcf\x81\x2d\x72\xa8\x5a\xdc\x67\x45\xe6\xc4\xcc\x41\x10\xeb\x3f\xf3\xe3\x70\x2e\x5a\xad\x9d\xba\x96\xf9\x42\x71\xdb\x7e\x0d\x0f\xb4\x1d\x88\x5a\xf7\x9d\xf0\xa0\x45\x5c\xc2\xb5\x7c\x76\xae\xcf\x88\xf7\x28\xb1\x07\x85\x0a\x8e\xbe\xcf\xc7\xb4\x6f\x54\x88\xbb\x8b\x72\x70\x2d\xaa\xb0\x82\xcd\x4a\x0c\xb2\x22\xfa\xb7\x59\xba\x56\xbc\xc7\x56\x37\xd9\x9e\x27\xab\x63\xaa\x7a\xd0\x61\x80\x79\x92\xab\x27\x09\x83\x4d\xf4\x1a\x40\x43\xc7\xbb\xe9\x86\x11\x35\x25\x82\x7f\x74\xe0\x18\x86\x31\x74\x97\xb6\x4f\x17\x71\x1d\x55\xb8\xe8\xcb\x1b\x8e\x2d\x73\xaa\x06\xbd\x8b\x88\x8a\x69\x17\x2f\xd5\xb2\xa7\x1f\x8f\xd7\xc3\x84\xe1\xd6\x53\xd0\x50\xb5\x3a\xd0\x27\xc1\x77\x32\x2c\x81\x5c\xb0\xc5\x0f\x6c\x2b\x64\x26\xb6\x55\xb7\x8d\x37\xdd\x6d\xc5\xa8\x78\xb9\x2f\x89\x2a\xd2\x18\x00\xfe\x00\x88\xfc\x07\x17\x30\xe9\x4c\x5b\x04\x87\x39\x6c\x50\x1a\xf3\x92\xd3\xb9\xa8\x25\x9e\xe1\x56\x19\xd0\x60\x6b\x4b\x97\x01\x68\x17\x2e\xaf\xd7\x99\x9c\x95\x53\x95\xf3\xea\xba\x0e\xa8\xa8\xfa\xaf\xff\xfb\xff\xeb\x58\xe8\x28\xb5\xb2\xa3\xed\xe6\x19\x68\xe0\x15\x8b\x87\x80\x8f\x55\xbc\x78\x0f\xef\xfd\x33\x40\xdd\xcb\xae\xfa\x0e\x12\x7a\x73\x05\xba\x91\xee\xb4\x22\x24\xda\x48\xa0\x65\xc4\xd3\x19\x0d\x8c\xea\x01\xcd\x9d\x18\x55\x2a\x2f\x36\x32\x1a\xd4\x3b\x55\x81\xfa\x40\xec\x00\xc1\xbf\xef\x84\x76\x58\x35\xb0\x61\x01\xbd\x31\x76\x92\x16\x5c\x85\x80\x59\x25\x50\x85\x34\xca\x47\xbc\x33\x57\x8b\xfb\x08\x22\x54\x23\x18\x98\xdf\x42\x1c\x67\x57\xd6\xf2\x51\x0e\x27\x4e\x79\x6d\xd9\xdf\xcb\xc1\xde\xc6\x85\x78\xca\x5b\x5e\x01\x36\x00\x30\x2c\x0c\x34\x53\x88\x41\x6b\xdd\x79\xdd\x87\x30\x27\x5a\x9f\xc2\x00\x5a\xf5\xf4\x95\x0b\x00\xc4\x1b\xd8\x53\x4d\x8f\xef\x95\xd6\x93\xe8\x99\x22\xb6\x1c\x97\xcc\x11\x14\x44\xc5\x0a\x1a\x23\xb0\x76\xd2\x85\x29\xe8\x56\xc3\xe5\xd2\xfe\x12\xc9\x11\x06\xab\xfe\xe3\xc3\xa5\xe6\x4a\x72\x60\xd7\xb0\xf1\x45\x1d\xb9\xe8\xe2\xd7\x33\x05\x0e\x59\x0d\x82\x62\x10\xb9\x05\xf0\x1f\xeb\xae\x80\x46\x00\x6a\x04\x50\x28\x2d\x07\x4d\x48\xeb\xb5\x70\x2c\x7e\x66\x6e\x20\x1e\x1f\x8d\x01\x85\x73\x3e\x9a\x62\xd0\x56\x4d\x95\x03\x6f\xb4\x1d\xbf\x42\xd3\x00\xf4\x96\xc3\x41\x5a\xf8\x9c\xb7\xff\x6a\x0b\xab\x16\x55\x91\xa9\xec\x64\xc7\xd6\xb4\xae\xda\x53\x83\x60\xa9\x15\xeb\x07\x8c\x73\xd0\x7f\x47\xfd\x5d\xdd\x76\x78\x11\x61\x23\xf4\xa4\xe2\xea\x85\xfc\xac\xf3\xf5\xe4\x42\x48\x97\xae\xce\x6b\x38\x43\x9e\xaa\x85\x5b\xc6\x1b\xb3\xb8\xff\xf3\x67\x6f\x5a\xa8\x25\x09\xc7\x06\x73\xac\x9f\xff\xfc\x86\x28\xc5\xfb\x3f\xff\xe5\x4d\x0b\x22\x71\x54\x6d\x79\x4d\x2c\x7a\x52\x97\xab\x38\x38\x16\xa8\xd4\x7d\xbb\x78\xb2\x56\xc1\x6e\x40\xdb\xbf\x76\xea\xce\x71\x30\xe9\x9d\x97\x80\xb9\x13\x57\x7e\xed\x22\xff\x0d\xae\x7c\xd5\xef\x96\x3a\xdb\x16\x28\x41\x27\x8a\x60\x2e\xae\xba\x7c\x81\x94\xbf\x5b\xfc\xe2\x7f\x85\x89\xfe\x09\x04\xf1\x7d\x9e\xe3\x2f\xae\x92\x33\xd7\x16\x68\x1f\x3a\xef\x51\xa3\xc4\x76\xaf\x7f\xdc\x1a\xa2\xca\x09\xb5\xad\x23\xd1\x87\x56\xfa\xca\x0f\xb1\x1e\xdb\x79\x69\x6c\x54\xe2\xef\x45\x68\x39\x4f\xf1\x1b\xff\x90\xb9\xa6\x05\x6e\x40\x02\xf0\xd4\xed\xaa\x44\xce\x8c\xa0\x1b\xcb\xeb\x29\x60\x8f\x10\x3a\x21\x78\x5c\xa7\x20\x77\xb4\x68\x26\xeb\xe9\x23\xea\x8e\x98\xaf\x31\xd8\x2e\x2c\xb6\xc3\xcf\x58\xeb\x7c\x8d\x23\x45\x67\xe5\x9e\x5f\x76\xfe\xf5\x25\x1f\x9a\x64\xf1\x65\x64\xda\x06\x74\x5c\xd4\x42\xb0\x2d\xf9\xb0\xb6\x54\x48\x40\x50\xdc\xda\x01\x66\x1d\x38\xaa\x9d\xc6\x39\x55\x7c\x87\x27\x58\xe8\x62\xd5\x10\x7f\x40\x17\x1c\x13\x33\x50\xc3\xbe\x63\x17\x10\x88\x28\xe5\x10\x09\xa8\xe8\x77\xfb\xbd\xa9\xfc\x6a\x0d\x6c\x12\xf4\xab\x8b\xbe\xe6\xfc\xbe\x59\x0a\x90\x18\x4a\x5e\x10\x44\xe6\xcc\x29\x11\x1d\xd4\x71\x48\x74\xd4\x10\x29\x8b\x15\x71\xfe\x54\xb1\xb0\xcf\xf9\xfd\xbb\x01\xa6\x2e\x19\xae\x67\xe2\xfe\x16\x97\x12\x87\xca\x0c\x1e\x79\xb1\xd1\x48\xa9\xab\x14\x84\x26\x5d\x27\x04\xd8\x01\xc1\xbd\x86\x30\xb0\x07\x71\x56\xbf\xe9\x6b\x2b\x10\xe1\xe8\xb6\x9e\x02\x08\xb4\xe1\x00\x78\x6a\x6a\x52\x92\xb8\x3c\xa5\x45\x1a\x09\x21\x1a\xe8\x8e\x5b\xe8\xdb\x89\x26\xa0\xd1\x8c\x20\x63\x9b\xc9\x49\xe0\xd4\x14\xa9\x9b\xac\x19\x6c\xc8\xd9\x0c\x8e\xad\xc6\x61\xee\x20\x56\xd2\x89\x09\x92\x98\xe7\xa9\x3d\x2c\x9b\x0a\x8f\x2c\x8f\xa6\x87\xe1\xa3\x7d\xe9\x08\xee\x34\xa0\x8c\xd0\xe9\xde\x34\x5d\xbe\x22\x42\x45\x51\x6a\xcd\xaa\x3d\x82\xbd\x09\x2b\x8c\x20\xcb\xab\x2d\x2e\x7e\x20\xd6\x7e\x11\xa1\x82\xca\x12\x70\x4a\xc1\xb6\xc3\x9d\xeb\x36\xa3\xf2\x5f\x26\xea\xae\xe9\xf8\x83\x2a\x8c\xea\xba\x4f\xdc\xc0\x2f\x33\xd1\x72\x04\xbe\x8f\x85\x66\x50\x77\xc0\x58\x56\xca\xe8\xe2\x42\x8a\xe4\x85\x9b\xaf\x25\xa4\x3a\xfb\x2e\x15\x2d\x3d\x04\x93\x60\xb2\x4b\x0a\x5b\x98\x6d\x67\x82\x9f\x24\x74\x3e\x34\x85\xbd\x53\xad\xc0\x20\xd8\x35\xc7\x26\x3b\x69\x8b\x88\x59\xb9\xc0\x7f\x86\x3d\xc9\xbf\x8b\x03\x77\xa2\x85\x89\x3e\xc8\xeb\x81\xd4\x7e\x41\x27\x5b\x43\x03\xde\x97\x90\x30\xf5\x25\xcf\x01\xaf\x45\xf9\xf6\x8f\x63\x77\xe4\xe0\x4d\x0e\x8e\x6e\x3c\x11\x4a\x5d\xed\xbb\x7a\x22\x3a\x51\x1f\xb3\x9d\xba\x86\xba\x9c\x31\xb9\x58\xee\x61\x9c\x98\xe0\xd6\xd2\x1a\xeb\x8c\x89\x99\x81\x25\x01\x21\x46\x8e\x24\xe6\xda\x87\x2f\x6d\x1c\x1a\x7f\xf1\xcb\xcb\x2a\xa8\x60\x6f\xea\x64\x33\x60\xc6\x92\xaf\x99\xd4\x00\xb2\x5b\xcb\xe5\x17\x27\xdc\xcf\x63\xaa\x82\xb0\xe8\x43\x6e\xff\x21\x48\x8b\xb5\x62\xd4\x3f\xf1\x0f\xc1\xab\xba\x8a\xc2\x19\x82\x4d\x3b\x8f\x36\x42\x4b\x19\x19\xc9\x1e\xb2\xbd\x17\x02\x7c\xad\xf9\xaa\x20\x56\x1a\x75\xb2\x56\x84\x8e\xd0\x43\x91\xfe\x36\xfb\x02\x2a\x3b\x87\xc5\xf9\x6f\x19\xb1\x06\xb0\xd2\xd2\xbf\xf8\x52\xed\x8f\x88\xf7\x8d\x23\x42\xa4\x5b\xe9\x8f\x8d\x76\xff\x93\xfd\x51\x63\xff\x83\x88\x28\x9d\xa5\xb9\x5a\xc6\x08\x7d\xf1\xd4\xb6\x45\x4f\xbd\x12\xf3\x11\x43\x0c\x24\x3b\xa1\x48\x24\x4c\xcf\x61\x78\x24\x7e\x17\x3e\xd4\xad\x02\x29\x15\x40\x47\x88\x67\x38\x88\x81\x93\x10\x00\x4e\x6f\x9b\x5c\x0b\x1f\xaf\x5b\xbc\x35\xdc\x26\xec\x60\x48\x30\x4f\xd6\x8e\x1e\x41\xb7\x60\xd1\xf9\xd2\xb2\xcb\x89\xa6\xd9\x3d\xda\xaf\xf1\x00\x5f\x49\x0b\xb8\x3b\x74\x95\xd8\xb4\xd4\x21\xdc\x7d\xa4\x10\xf5\xb8\x95\xcf\x77\x43\x1c\x4e\xed\x43\x96\xf2\x6d\x10\xbd\x97\xc2\x24\x06\xc8\xd2\x41\xde\x12\xbe\xb0\x6c\x1c\x44\x94\x4e\x75\x5d\xe6\x05\x9c\x89\xd4\xa1\x45\xdc\xe5\xd8\x87\x9b\xd0\x99\xe5\xb3\x4e\x43\x18\xa8\x8f\xf7\xde\x31\x10\x2e\xa1\x74\xf1\xba\x82\x53\x2c\x94\xd8\x94\x80\x4c\x4c\xb5\x64\x8b\x29\x5e\x91\xc4\x76\x23\x59\x15\x67\x87\x1c\x1d\xf7\x51\x74\x52\xdf\x22\x5b\xc4\x8c\x1b\xed\x06\x8d\xbe\xf5\x91\xfa\x4f\xb7\xea\x82\x1d\x70\xbc\x44\x5e\x07\x7b\x63\x4e\x77\x35\x95\x52\xc1\x35\x4e\xfc\x5c\xd5\x8b\x0d\xb8\x34\xac\xeb\x0a\x0b\x43\xf5\x0a\xd9\x89\x9b\x57\x72\x82\x52\x5c\xf4\x37\xd7\xd8\x04\x72\xe0\x23\xdd\x57\x7a\x67\xb9\x9a\x0a\x9b\x7f\x51\x7b\x8d\x10\x66\xde\x1f\x6f\x03\x53\x06\xef\x9d\x66\xc2\x7c\x23\x5f\x8e\x74\x2b\x3e\xf9\xd3\xfd\xf5\xa7\x08\x7f\x02\x13\x29\x97\x22\x85\xc3\xa1\xb0\x29\x5b\x74\x17\xf8\x84\x39\xfb\x36\xc4\x6d\xeb\x4c\x5a\xce\x11\x66\x22\x5d\x7d\x78\xf0\x62\x29\x60\x54\x3e\x25\x22\x89\x8a\xa7\xc5\x24\x43\x80\xb5\x67\xa7\x10\x52\x22\xee\xbd\x5e\xae\x7b\x3a\x2f\x40\xc0\x90\x5d\xaa\xd4\x56\x5d\x13\x88\xc8\x1d\x8c\x64\xc8\x62\x0c\x3b\x52\x56\x26\x9d\x1f\x24\xe6\x78\x85\x10\xe5\x9c\x90\x7c\x2c\x8e\x44\x68\x85\xe6\xc6\xb6\x51\x30\x34\xa5\xfe\x70\x26\xe2\xd6\xc3\x23\x71\x62\xa1\x84\x6a\x7d\xd9\xb5\xb8\xfc\x71\x41\x6c\x63\x19\x7f\x76\xf3\x7e\x9e\x4e\x3a\xfb\xe4\xa0\x61\xe9\x89\x7c\xfb\x34\x9d\xa1\x35\x4d\x10\x84\xc6\x45\x3e\x52\xad\x36\x0a\xdb\xd7\x1d\xf1\x21\x83\xb6\x99\xfc\x14\xeb\xdb\x38\x76\xeb\x59\x1a\x09\xe9\xe3\x03\xfd\xef\x41\x51\x3c\xd8\xef\x3f\x9e\x58\x04\x4f\xef\x45\x12\xaa\xe0\x2f\x44\xed\x8f\x68\xbe\xa8\x89\x98\x8a\x4e\x05\x55\x03\xa0\x68\xd3\x5c\x32\x12\x10\x1e\x44\x7d\x18\x6f\x0d\x14\x37\x90\xc3\x41\xf9\x06\x07\x3e\xcb\xb7\x3b\x0e\x5e\xa0\xa1\x83\x08\x6b\x82\x73\xac\x8e\xe9\x5c\x52\xae\x24\x2a\x49\xa3\x97\xbd\x6b\x90\xba\x14\x42\xb4\xa5\xe2\xf1\x3e\xb8\x51\x69\xc0\xdd\x29\x82\x38\x39\x29\xca\x05\x44\x2b\x9b\xf2\x01\x13\xc0\x29\x17\xb0\x3b\x51\xf3\x34\x1f\xd0\x8e\xf9\x80\x36\xe2\x03\xda\x29\x3e\x60\x6a\x18\x53\xa7\xe2\x2e\x46\x60\x76\x4b\xbd\x2f\xfe\x4a\xff\xe1\xbf\xe6\xb7\xb6\x5c\x21\x0e\x6d\x14\x68\x0e\x85\xb0\x7e\x8a\xcb\x65\xba\x28\x11\x1b\x72\x44\x08\x3c\xa3\x8d\xdf\xe2\x4c\xb3\xe5\x2a\x51\xf6\xc4\xfc\x8a\x10\x0a\x32\xeb\xfa\xc6\x16\x20\x96\x08\x0d\x4a\xb2\x18\xa6\xba\xd5\x9d\x24\xf7\x07\x6b\x87\xd4\x16\xdc\x93\x1e\xf3\xeb\xbc\x69\x11\x5a\x6f\x23\xd7\x3e\x89\xe7\xcd\xe9\xce\x18\x38\xe4\x11\xe3\x9f\x4a\x75\xcb\x57\xa6\xb9\xf3\x18\x5a\x9c\xce\xb5\x45\x71\xa5\xf5\x65\xce\xe0\x38\xb5\x58\x08\xae\xe9\x5b\xe4\x9c\xe9\x41\x0b\x38\x99\x82\x3e\xf8\x47\x76\x14\x49\xf1\x86\x4e\x85\xc3\x40\x73\x87\x8e\xd5\x8e\x3a\x64\x9b\x5d\xed\x8d\x75\x08\x88\x43\xc6\xa7\x5e\xe4\x16\x8e\x92\x40\x54\x34\xa9\xc1\x67\x1e\xcd\x2d\x45\x5d\xe0\xf9\xe1\x64\x72\xae\xf0\xd5\x70\x7e\xe2\x19\x12\x41\xa8\xeb\xc8\x34\x0c\x02\x0f\xae\xec\xf2\x33\x4f\x9d\x78\x6f\xe8\x43\xef\x08\x5a\xf0\x6e\x4a\xcf\xce\x87\x7e\x45\xe2\x9e\x41\x0f\x2d\x1e\x0b\xbf\xe5\x42\x5b\xba\xad\xe6\x8e\x06\x7a\x62\x9c\xad\x07\xe8\x04\xc7\x4a\xc3\xe7\xe0\xed\x8d\x83\x76\x05\x9f\x4b\xdf\x4c\xcb\xa7\xa0\x8b\x96\x56\xe4\xb1\x6b\x09\x02\x55\x88\x1b\x96\x13\xc2\x72\x6c\xa5\xa9\x34\x63\xee\xd3\x5c\xac\x53\xda\x38\x49\x49\x28\x8c\xa2\x40\xd3\x32\x06\xa9\xcf\x09\x88\x39\x07\x8a\x5d\x70\x5c\xc2\x53\x20\xac\x4e\x5f\xfc\x15\xff\x3d\x05\x82\x65\x5a\xfc\x44\xff\x39\x05\xd0\x57\xaa\x1f\x5a\xbc\x72\x7f\x05\xd0\x6d\x4d\x18\x72\xf1\x57\x7b\x45\xb4\x71\xd1\x47\x93\xd9\xe4\x9d\x94\x7d\xc7\x7e\xb7\x69\x21\xb1\x91\xf9\x2a\xe4\x57\x03\xbe\x6e\xc7\x79\xda\xe6\x6a\x69\xeb\xe1\x9e\xf3\xef\xec\x42\x7f\x07\x40\xd8\xa8\xbb\x6c\x74\xb0\x51\xcf\x5e\xd4\xb7\xe3\x66\x00\x84\xa8\xf9\x4d\xbd\x61\x33\x68\x6d\x0e\xdf\x61\x71\x91\xb3\xa1\x80\x2b\xf5\xb1\x79\x89\xf1\xa4\xdf\xdb\x0c\xc7\x81\x45\x12\x57\x35\x42\xee\x4a\x04\x66\xf8\x3d\xfb\x41\x60\xa9\x5f\x87\xf0\xf4\x1a\x29\x3a\x00\xa8\xad\x40\x98\xb6\x27\xed\x27\xe6\xae\x11\x1e\xd8\xc9\xe3\x3d\x42\xab\x28\xb6\x67\x27\xeb\x89\xc8\x2a\x12\x19\x2a\x1a\xac\x59\x1f\xf0\x56\xae\xc3\x68\xd8\xfb\x75\x62\x20\x38\xfa\x2e\x88\x03\xa7\xe8\xc0\x07\x5a\x34\x7a\x00\x76\xd1\xdc\x20\x77\x86\x2b\x03\x12\xf1\xf0\x23\x00\xad\x1f\x62\xef\x03\x57\xe2\x43\x0a\x0b\xeb\xac\x00\xeb\x88\x81\xbe\x2c\x04\x79\xe0\x2b\x5c\x50\x5d\x95\x04\x9c\xf3\x14\xbd\x02\x28\x96\x99\x5f\x0d\x44\xf2\x3c\x0d\xac\xd2\x9a\x28\x87\x84\x27\x36\x11\x27\x88\xad\xf6\xa9\x85\x07\x89\x97\x04\x12\xa2\x6d\xad\x8b\x23\x0c\x0e\x50\x24\x12\x96\xee\x25\xe7\x67\x73\xdd\x89\x60\x2a\x59\x22\xfe\x94\xb1\x63\x88\x6d\x4e\x2c\x12\xc3\x2c\x15\x26\x59\xad\x32\xdf\x6c\xbb\x5b\x8b\xff\xde\xd5\x92\x9f\x66\xda\xd2\x68\x2d\x0f\x39\xe1\x7e\xe8\x4b\xd8\x2f\xd9\x37\xa1\xf0\xbc\x3e\x4a\x58\xf2\x9a\x82\x96\x08\x55\x2a\x59\x1a\x21\x31\xc7\x95\xa5\x6b\xc2\x52\x30\xcf\xd2\xf1\x64\x3f\xf0\x98\x2f\x05\x24\x7b\x01\x5a\x65\x93\x5d\x00\xe6\xf3\x3b\x5b\x98\x73\xe8\xcf\x7c\xb5\x78\x21\xff\xde\x0d\xcc\x91\x45\x5d\x8d\x47\xd1\x8f\xbb\xa6\xa8\x27\x81\x63\x01\x04\x57\x5c\x21\x38\xbc\x4b\xb5\xbc\x42\xff\x40\x54\xa3\x7f\x66\xff\xc0\xd5\xa1\x7f\x72\xc2\x7d\xbf\xfe\xd3\x0b\x61\xd2\x88\x4e\x74\x94\xce\xc4\x1f\x4b\x83\xea\xdc\xc8\xb2\x4b\x2c\xd3\xb2\x8c\xd1\x04\x33\x99\xea\xa9\x33\x08\x2b\x14\x0b\x1f\x34\x7c\x83\x4a\x46\x6e\x24\xd6\x00\x30\x29\x11\xb2\xa5\xd9\xde\x44\x29\x93\xb4\xe1\xb5\x61\xeb\xb2\xdf\xa0\x67\x7e\x0d\xcb\xf0\x03\x6c\xcd\x8f\x45\x84\xf9\x39\x01\x27\x47\x68\x84\xf4\xa4\x15\x6f\x19\xce\xf8\x29\xcf\xa9\x0b\x32\xa8\x0f\xe4\x4d\xcd\x6f\xa4\x8f\x54\x00\xd8\x41\x18\xf1\x83\x7a\x6f\x75\x72\x19\xd9\x64\x22\x7e\x48\x20\x7d\x02\x6f\xd0\x83\x4a\x81\x24\x91\xbd\x44\x0a\x35\xcd\x87\x3f\xfd\x10\x38\xda\xa2\x1d\x32\x94\x79\x93\xff\x8a\x73\x8c\xb2\xfc\x64\xdc\xcc\x3c\x53\xc9\x84\x8a\x22\xbc\x7b\xe9\x78\x34\x4a\x83\xb4\x44\x84\x3c\xc8\x9c\x4f\xa8\x73\x69\x1d\x76\x29\x4e\x76\x77\x74\xcc\xca\xb3\xfc\x3d\x7b\x76\x9a\x40\x1f\x00\x1a\xdd\x55\x75\x3b\x86\x14\xef\x6b\xf1\x44\xc2\x56\x30\xa0\x15\x9a\xdb\x0f\xc3\x07\xfa\xe1\x01\x0d\xc2\x91\xc4\xb7\xa0\x6a\xaf\x61\xb5\xa1\x9e\x41\x21\x62\xe0\x18\x28\x65\x3c\x64\xf6\x1a\x34\x70\xe7\xa2\xf2\xb5\x7c\xc4\x8b\x38\x4d\x9f\x95\x0c\x51\x49\x88\x42\xab\x04\x7c\x14\x1e\x7e\x9c\x1c\x67\x62\x9c\xc9\xfe\xc8\x39\xb0\x95\x75\x57\x55\xfc\x9f\x71\x36\x5b\xa1\xb5\xeb\xc8\x5d\x8c\x3d\x47\xbb\x71\x7a\x9e\xbb\x7a\xf9\xb3\xeb\x65\x2f\x62\x6f\x19\x5a\xc7\xb7\x6e\xaa\x8f\x78\x92\x2c\x90\x41\x34\xfe\x38\x44\xa7\x08\xf9\xc7\x1d\x02\x03\xa9\x1a\x2c\x84\xb4\x56\x3d\xb6\x0f\xfe\xe3\xe3\x6e\xca\xbd\x77\xe7\xb2\xcd\x3f\x1f\xbd\xc8\x71\x48\x3e\x7e\x93\xa5\x89\x49\x38\xe7\x13\xea\x58\xc6\x2e\xae\x71\x86\x90\x30\x95\xf3\x88\xda\x83\xc9\x85\xa2\xe8\xc3\x28\xef\xc9\x5e\x27\x6e\x9a\x0f\x7f\x69\x32\x11\x64\x71\x60\xcc\x38\x0f\x17\x31\x2c\x68\xa3\x9a\x6a\x32\xe6\x49\xf9\x6a\x44\xd3\xb8\x83\x31\x8d\x86\x37\x08\x65\x18\x39\x13\x0d\x40\x64\xc9\xbe\x47\x48\x87\xfa\x4c\xd2\xa3\x42\x1d\x12\x56\x90\x2f\xc7\x7f\x76\xed\xa6\x97\xad\x8b\x10\x94\xf9\x20\x87\xfa\xd3\x4d\xff\x79\x02\xf7\xb9\xad\x89\xfc\xf8\x35\xac\x41\xa7\xb1\xfa\x55\x4a\x79\xa6\xd1\xe2\xcb\x9e\xfd\xbb\x41\xe1\xbb\x93\xe4\x2c\x80\xce\x9c\x2d\x05\x95\xdd\x48\xfe\x94\x54\x85\x1d\x62\x19\x4c\xa0\x82\xc1\x60\xd9\xf3\x04\x8b\xf1\xa8\x2c\x59\xe8\x8e\x13\x42\x7f\x5e\x59\x08\x0f\x32\x3c\xcd\x7b\xd8\xfa\x57\x44\x97\x5f\x13\x11\x92\xb9\xb3\x32\x6c\x72\x74\x7c\xee\x92\x65\x9c\xa2\xdb\x93\x16\x76\x81\x76\x7f\x47\xf0\xbb\x31\x42\x10\xed\xfd\xab\x18\xc1\x44\x4c\x8b\x29\x98\xa6\x13\xd4\x7d\xc9\xd6\x4b\x70\x48\x9c\x68\xc7\xbd\x15\x8f\x58\xad\x50\x6b\xf4\xe1\xbe\xe5\x85\x65\x25\x03\xaa\x36\x77\x0e\x2a\x0d\xbc\x10\x1e\x28\x0d\xa7\x10\xf1\x0d\x48\x08\x11\x19\x27\x24\x21\xc4\xc6\xdb\x7c\xba\x66\x1a\xa4\x68\x5c\x33\x0e\x54\x34\x3e\x1a\xc9\x18\x5c\xb0\xa2\x31\xff\x5a\x37\x41\x0b\x3f\x36\xa3\x18\x84\x30\xba\xb3\xba\x7f\x18\x39\x0a\x4b\x31\xc8\x51\xcb\x89\xcb\x4a\x84\xd4\x95\x27\x44\xbd\x77\xc3\xac\xdc\x61\x97\x6b\xbf\x75\x8f\x6b\x1d\x86\xc0\x91\x52\xa8\xb9\x62\x3a\x3e\x88\x1f\x9d\x78\x01\x4d\x2f\xe5\x78\x8a\x03\xbd\x54\x60\x56\xd9\x6c\x5b\x72\x93\xc5\xe6\xaf\x6c\xc7\x1d\xbf\x9c\xf3\xa8\x12\x87\x4d\x0f\x6e\xd2\xd0\xfb\x5d\x0d\xb6\x62\x3c\x82\x42\xf2\xba\x71\xda\x43\xde\xce\x41\x2c\xe3\xe4\xb1\xe4\xf1\xe4\x1c\x84\x79\x29\x39\x8f\x92\x20\xb3\x83\xe7\xb7\xd2\x20\xca\x67\x92\xdf\x76\xd8\xcb\xf8\x4c\xb1\x52\x28\x39\x91\xb7\xf6\x0a\x62\x0a\x7f\x8c\x6f\x45\x92\x81\x14\xdb\x89\x88\x43\x25\x94\x4e\xce\x81\x70\x84\x74\x8d\xd4\x89\x9e\xd0\xfe\x0d\x53\x89\x0d\x5d\x37\xce\xca\x7b\xfe\xf2\xe2\x92\xc3\x9d\x6e\xbb\x7e\x07\x33\xd9\x9e\xfd\x3f\x77\x39\xbd\x0d\x8f\xe0\x8f\x8b\xf7\x04\x83\x66\xaa\x92\xc1\x7a\xc9\xcf\x2e\x29\x46\x11\xe7\x8a\x0d\x12\x25\xbb\x9a\x4b\x90\x5a\xa9\x32\x45\x23\xb9\xf0\x0f\xec\x97\x57\x09\xcf\x33\x09\x62\x85\x84\x76\x37\xef\x08\x56\xe1\xa7\x9a\xd5\xb4\x38\x10\x7c\x41\x81\x1e\xbf\xe4\xb2\x36\xe1\x06\x39\x62\x63\xbc\x46\x43\xd0\x94\x8c\xd4\x0a\xef\x16\x5e\xdf\x48\xd8\x0e\x17\xfc\x99\x70\xd8\x56\x1d\x45\xef\xbc\x12\xa3\xde\xdd\x7d\xf8\x6b\x98\xe2\xfb\x20\x7a\x6d\x67\xce\x69\x0e\xa9\xb1\x9c\x48\x71\x24\x49\x41\x26\x7f\x1d\xcf\x3b\x80\x35\x0e\x14\x07\x37\x7c\xfb\xbb\xe6\xc2\x11\x1d\xc1\x31\x83\xdf\xb1\x9f\xd8\x0d\xe1\xf7\xb2\x77\x49\x13\x85\xda\x0b\x3b\xa2\x8f\x4a\x6e\xde\xd5\x5f\x48\xca\x87\xe7\xfa\x36\x9e\xaf\x8f\xf2\xe6\xbb\xac\x2b\x08\x81\x32\xe8\x35\x20\xfa\x24\xb6\xa1\xe7\x9c\xbd\x88\x2e\x22\x66\xf8\x9c\xc0\x9f\xd3\xe7\x10\x4f\xc7\xa1\x45\x8e\xa3\xad\x60\x09\xe9\x68\x58\x4e\xb3\x7a\xae\xba\xd4\x09\x80\x96\xe8\xa5\x16\x6f\x0b\x4d\x79\x6a\x25\x45\x33\xd4\x8a\xba\x2d\x21\x64\x15\x60\x2f\x79\x5b\x5c\xfe\x96\x31\xc0\x55\xbd\x3e\x2e\xbe\xa6\xff\x8c\xe5\x90\xb2\x33\x4e\x18\x59\x70\xd8\x67\x38\x3f\x98\x4a\xed\x2d\x2a\xc1\x2f\x80\x00\x47\x7b\x26\x11\x03\x21\x3a\x37\x1c\x98\x00\x27\x87\x63\x45\xfb\xea\xce\x1a\xe2\x26\xca\x32\x05\xcd\x8b\x0b\x91\xc6\x5a\x98\xd4\xc2\x21\x04\x0e\xbe\xf1\xc1\xe2\x38\xba\xc1\x70\xbc\xe2\x23\xac\x71\xc0\x5a\xed\xd4\xc7\xe5\x0d\x79\x22\xce\x32\x0b\xb9\xa3\xda\x0e\xe0\x87\x0b\xd4\xa5\xb6\xa2\xf3\xec\x42\x23\xc1\xfd\xc1\xe8\xb2\x0b\x9c\x9c\x4f\x3d\x6e\x9a\x43\x1d\xa5\x20\xf7\xcc\xaf\x5e\xda\x24\x17\xdd\x68\xa0\x1a\xc4\x9a\x21\xd9\xa6\x6f\x04\xe1\xec\x57\x15\xc8\x0f\x6d\x44\x61\x69\x05\x27\x18\x3d\xba\x79\x4f\xa2\x6c\xdd\x50\x44\x51\x8b\x72\x5f\xa9\xf0\x06\xf8\xd7\xc9\x6a\xf4\x64\xe6\x09\xf2\x74\xa8\xf3\xd5\x4f\xcf\x38\x70\x78\x42\xd0\x2a\x46\xae\x20\x06\xb4\x07\x10\xb1\x95\x86\xee\x95\x9c\xd0\x09\x12\xce\x76\x50\xcd\xe7\x6d\x74\x20\x38\x19\x77\xe5\xa8\x7e\x0e\x47\xea\xd6\x92\x5e\x02\xb6\xb4\xcf\x3e\xf9\xf1\xe2\xe5\x8b\xb3\xec\xd7\x07\xb7\xb7\xb7\x0f\xc0\x1a\x3e\xe8\x9b\xd2\x56\x18\xf2\xfa\x2c\xfb\xbf\x9e\x3f\xa3\x47\xad\xb2\x9f\xc6\x08\xdd\xa8\x11\xd7\x91\x6e\x2b\x52\x68\x56\x77\xe3\x77\x7d\xa9\x04\xb9\x77\x43\xe4\xae\x77\x89\x65\xa9\x71\x3e\xa4\x98\x22\xc4\xae\xb9\x08\x26\xba\x67\x1a\xc4\x24\xa2\x23\x56\x44\x58\x72\xf8\xe3\xf8\x4a\xb7\x44\x52\x14\x77\xc4\x10\x1f\x42\xe6\xd4\x1b\x0f\x05\x2a\xf5\x02\x24\x50\x3a\x18\x81\x12\x03\xd1\xd7\x6c\x15\x1a\xa4\xbd\xd8\x20\x39\x0c\xcf\x69\x27\x60\xca\xca\x9c\x7c\x2e\xfa\xae\xc1\x03\xc4\xeb\x1f\xbf\x1d\x52\x9d\x43\x42\xd4\x55\x79\x94\x3c\xc5\x72\x88\xf0\xd1\x1d\x22\xce\xb5\x27\x21\xa0\xe6\xc3\xca\x9c\xa5\xcd\x02\x1d\xb3\x45\x9d\x8f\x2b\x55\x79\x5e\x4d\x1e\x35\xcf\xab\x8d\x5a\x90\xb8\xe1\x0b\x7e\xe1\x2a\x91\xa9\x81\xc9\x62\xb1\x92\xcb\x7a\x57\x8d\x6b\x79\xf3\x85\xe9\x12\x59\x14\xf1\xbf\x3d\xf3\x61\x22\x44\x9b\x3f\x5e\x80\xc8\x3a\x06\x46\x31\xd9\x4f\xf2\xe3\x2e\x40\xe9\xe0\x3c\xf2\x44\xce\xc4\xf6\xfa\x2c\x13\x0b\x11\x08\x45\xdd\x17\x20\x34\xfc\xeb\xfc\x40\xce\xb2\xbe\x0a\x7f\x8b\x63\x8f\x2a\xd7\xdc\x4f\xb6\x8d\xc0\x4f\xd5\xd2\x6c\x69\xf5\xf2\xdf\xec\x7a\xb4\x12\xd8\x29\x1a\x47\xbb\x9d\xdc\x57\x8f\xf9\xf9\x01\x16\xb2\x3b\x42\x29\x9c\xfe\x91\x33\x3e\x12\xd2\x49\x18\x01\xcd\x0c\xa9\xd6\x48\x7f\xd3\xb0\x64\x12\x44\x96\x2d\x7c\x22\x64\xb1\x83\x4c\x03\x11\x1b\x1d\xad\xe7\x6e\xbc\x3c\x9f\x12\x6a\x4e\x83\xed\x25\xe8\x8c\x71\x59\xc2\x0b\x4d\xbe\xe2\xf3\x11\xb6\x74\xa4\x6b\x50\x23\x4d\x10\x66\x0a\x9b\x74\x92\x52\x45\x81\x63\x1d\x73\x59\xbe\x8b\x93\x84\x9f\xf8\xb6\x38\x7a\x04\xe9\x3c\x34\x3b\x0e\xab\xd5\x3b\x47\x3c\xa4\x92\x6a\x1e\x8d\xe4\x76\xe3\xe6\x86\x48\x85\x1d\x62\xf9\xc6\x07\x44\xef\x08\xf4\xd4\x8e\x1d\x40\x6c\xc5\x0e\xb5\xca\xa6\x11\xa1\x1c\xef\x70\x42\xe9\x4b\x63\x1a\x44\x32\x09\x7a\x39\x00\x59\xd7\xf0\x16\x82\x61\x6f\x41\x14\xc8\x24\xaa\x82\x62\xae\xb2\x84\xa9\x0c\x8c\xbe\xe2\x25\xdb\x97\xf5\x51\x22\x3f\x7f\xc3\x7f\x87\x1c\x1c\xf1\xc4\x02\x9c\x9f\xd3\x3a\x80\x57\x53\x0d\xca\x0a\xc4\x8d\xe6\x3e\xdf\x26\xf4\x45\x74\xce\x1e\x78\x29\x4a\xf6\xc2\x0e\xf2\x6b\x21\x8d\x40\x6e\x24\x2b\xe2\x30\xb6\x65\x17\xc5\xe6\x8d\x25\x30\x1c\xa6\x27\x4c\xe8\x49\xa7\xc9\x2a\x69\xc0\x15\xe2\xd7\x13\x6f\x25\x14\x47\x3c\xf6\x54\xee\x99\x98\x4e\x4d\xcd\x6a\x1c\xbf\xd8\x43\xa5\x91\x96\xa3\x99\xdf\x11\x65\x39\xae\x1b\x42\x2d\xa7\x75\xcd\x8e\x75\x1b\xa2\xa6\x11\x82\x2f\x51\xfc\x27\x3b\x35\x8a\xa4\x1c\xcf\xf5\x9d\xc1\x94\xa7\xf7\x31\xe5\xa4\xde\x63\xe3\x63\x7e\x2a\x39\x56\xd3\xcc\x94\x10\x28\x51\xb8\x5d\xdb\x1d\xbd\xae\xeb\x0f\x17\x61\x3e\x15\xe7\xdd\xc5\x5a\x4d\x8d\xc5\xad\x49\xb2\xb4\x77\x5a\x05\xad\xf3\xeb\xeb\xf9\x55\x53\xdf\xb6\x08\x43\xdc\x37\x2b\x0b\x17\x52\x8d\x7e\xb8\xb6\xac\xd4\x32\x02\x25\x21\x1d\x16\x9c\x55\x74\x47\x48\x81\x3f\x8a\x3d\xcb\x42\xfe\x91\x4f\x6c\xbc\x9b\xe6\x93\xff\x86\xbe\x3b\x4e\x32\xb9\x01\x04\x7a\xc0\x8d\x99\x4b\x55\xce\xcb\x8d\xbf\x38\xbc\x72\xeb\xa3\x0e\xad\xa5\x3e\xcc\x3c\xea\x2e\x02\x6d\xf7\xf4\x1e\x73\x90\xa2\xc5\x8f\x86\xe7\xc7\x9c\x11\xe1\xb7\x08\xa8\xaf\xf2\x6b\xea\x5a\xc0\x82\xb1\xf2\x10\x14\x1d\xaa\x43\x8e\x12\x03\xf7\xd7\xac\xcd\x17\xaa\xd0\x51\x90\x26\xc8\x75\x6f\x98\x8f\x88\xa0\xf9\xc0\x1d\xb1\x81\x11\x50\x02\x21\x42\xbb\xd0\x86\xae\x3f\x21\xb6\xaf\x7f\x78\x21\x3f\x38\x5a\x91\xc4\xaa\xd1\xd9\xfb\xf0\x8c\x5c\xae\xb9\x63\xf6\x1c\xb2\x81\xae\x11\x07\x92\xe0\x05\x0a\x1f\x21\x7f\x35\x70\x22\xce\xbb\x24\xe8\x92\xb4\x80\xd0\x4c\xc4\x5d\x1d\xd5\x8a\xfc\x02\x92\x5a\x09\x2e\x70\x6b\x1b\x09\xd2\xc1\x61\x99\x7c\x2b\xa8\x8f\x0a\x0a\xe5\xe2\x47\x38\xd7\x24\x34\x3a\x73\x71\xa6\xe6\x13\xf1\xa6\x5c\x91\x44\x03\xe3\xbf\xe5\xda\xde\x28\x88\x87\x58\x37\xe6\xba\xe3\xb0\x5f\xb0\x8d\xcf\x6b\x5f\x40\x13\x73\x35\x9f\xb4\xf9\xa0\x90\xf6\x0e\xa7\xec\xb5\x81\x6d\x94\xfb\xc8\xa6\x8f\x3b\x35\x98\x72\x1f\x0d\x38\xd9\x68\x83\xc3\x3e\x05\x2b\xff\xc8\x8c\xff\x7e\x9b\x49\x57\x41\x00\x18\x3a\xe5\xdb\x22\x39\x78\x9f\x85\xcb\x92\x4c\x36\x18\x55\xea\x62\x58\x6d\x2f\xe7\xfc\xfa\xc8\xa6\xe9\xf2\x21\x74\x44\xfb\x59\x4d\x80\x1c\x26\x10\xb5\x20\x44\x4e\x1b\x02\x0e\x8b\xa5\x49\x89\x1c\xfc\x46\x03\xab\xfa\x8c\x22\x90\xb1\xe1\x99\x6f\x1c\x43\x55\x29\xcd\xca\x46\x7c\xb0\x1e\x10\xa9\xa3\xeb\x8b\xc8\x4f\x61\x17\x11\x92\x4c\x03\xe6\xba\x12\xe6\x62\x38\xe3\x58\x02\x3e\x08\x12\x9a\x46\x68\x03\x39\x2b\x84\x6d\xe9\xf3\xcd\x83\xc2\xd5\x0d\xef\x8c\x90\xeb\xbe\xbd\xe4\x45\x72\x5f\xc7\xaf\x90\x2b\x11\xe3\x29\xa7\xab\x8b\x0f\x09\x5f\x72\x3a\x21\x05\xdd\x66\x78\x53\xb8\x22\x70\x51\xe0\x00\x9e\x99\x35\x5b\x95\x40\x7a\x3a\x3e\x5b\xc3\x90\xea\x76\x74\xd4\x22\x58\x17\x48\x58\xec\x04\xa3\x9c\x7b\xaa\xba\x92\x9a\x4e\x32\x80\xfd\x25\x3e\xa5\xe6\xfc\x16\x6d\xe8\x7c\x60\x18\xeb\xfb\x41\xc2\x2e\x22\x9d\x07\xe7\x26\x9c\x3e\x58\x1a\xea\x6d\x71\xa6\x86\x08\xbf\x09\x95\x75\x72\x80\xdc\xad\x71\xf6\xb5\xd2\x4e\xd4\x93\x12\x94\x0e\x2e\x55\xbf\x0d\x7a\xf5\xaf\xe4\x6b\xbd\x15\xaa\x84\x18\x96\xa7\x42\xc6\x43\x0c\x3c\x78\x15\x0f\x60\x80\x39\x5f\x08\xeb\xaa\x70\xfa\x26\x1e\xbd\x51\xfb\xee\xa1\x93\x71\xdc\xf9\xc4\x0d\x8f\x78\x6a\x7f\xe8\x5a\xe8\x54\x5d\xd0\xc9\xf9\x9f\xa6\x41\x46\x4d\xa9\x1d\x38\x6e\x8d\xc4\xb8\x21\x6c\x58\xb1\xae\x98\xbe\x06\x78\xe7\xfb\xd6\xd2\xf1\xeb\x8c\x90\xdc\xb3\x9f\xeb\x66\xf3\x26\xe4\x3b\x55\x29\x7f\x9c\xdd\x8d\x0b\x7d\x3a\xb2\x29\x08\x89\x38\xef\xfc\xb0\x45\xc8\x13\x5a\x94\xf3\x79\x6e\x9a\x2d\x01\xa7\xe2\x79\x0e\x2d\xc2\xce\x33\x1c\xe5\xba\x13\x93\x91\x34\xcc\x35\x72\x2a\x09\xb7\x8a\xc4\x8b\xb0\xa0\x8d\x9b\x90\x78\x8b\xce\xe6\xf2\x3c\xf2\x77\xdf\x13\x63\x49\xb7\xf9\x07\x31\x0b\x47\x4e\x4c\x04\x87\x6b\xe9\x95\x81\xfd\xcb\xd3\xbe\x6b\x7b\xf0\x63\x3d\x67\x6c\x6d\x25\x45\x2b\x12\xaa\xdd\x22\xd6\x02\x6b\x16\xda\x85\x68\x0f\xac\xfb\x9c\x64\x25\x6c\x38\x2b\x61\x14\xb8\x0b\xed\x04\x0b\x5f\xce\xeb\xc9\xab\x10\x7b\x02\xf8\xec\xb0\x49\x36\x69\xfe\x3a\x09\xe6\x73\xa2\xcb\x1b\xdc\x39\x03\x5d\xc9\x12\xa7\x91\x0b\x80\xc4\x22\x59\x46\x27\x2d\x17\xde\x97\x4b\x9c\xee\x7c\x27\xae\xcd\xe7\xce\xf5\x33\x2b\x8e\x78\x5d\x69\xae\x2d\x3f\xf3\xc8\x19\x43\x7f\x7d\x25\x55\x92\xa0\xac\x2c\x43\x29\x82\x7e\xeb\x0f\x51\x21\xc2\xb5\x0f\xfa\xad\xbc\xcb\xc3\x11\xce\x99\x0b\x61\x65\x57\x89\x30\xe9\x13\x01\x78\x27\x52\xea\x7e\x60\x20\xde\x89\x16\xee\x0e\xc8\xeb\xcd\x19\x3f\xd4\xf8\x76\x22\x21\x5f\x2c\x5e\x4e\x33\xf3\x85\xa2\x71\x86\xbe\x53\x6a\xe3\xbb\xcd\x3d\x53\x60\x8f\x79\xe2\xf9\x7f\xb0\xa2\x59\x4d\x48\xe9\x90\xfe\x07\x2c\x48\xd3\x34\xa7\x63\x69\xc4\x20\x3d\x5c\xba\x71\x13\x39\xed\xde\x77\x12\xa9\xbd\x46\x82\x1b\x86\xd2\x8a\x61\xee\x02\x7d\x60\xef\xaa\xa2\x6b\x12\x8f\x36\x4e\x0d\x10\x2c\x21\xce\xfe\xed\x94\x06\x27\x54\xec\x51\x6e\x83\x13\xaa\x76\x85\x03\x8e\x51\xca\x25\x5d\xd3\x29\xd5\x75\x54\x27\x21\x32\x4e\xcc\xef\x1d\xa9\x0f\xa6\x54\xa0\x23\x45\xe9\x0d\xe4\x5e\x9d\x0a\xbe\x2c\xeb\x43\x63\xb1\x27\xfb\xa2\x70\x4a\x29\x56\x30\xfa\x70\x6f\x8a\x8e\x06\xe9\x8f\x91\xba\x45\x90\xf3\x5c\xff\xdd\xe6\xfb\x65\x94\xe3\xe0\x47\xcd\x9a\x0b\x0f\x61\x17\xfa\xbe\xfd\xdc\x57\x92\x0c\xa4\x3e\xf3\xe8\xe0\xbb\x43\x8d\x38\xfb\x26\x73\x69\x06\x38\xab\x8f\x07\x6c\x90\x31\xcb\x3a\x61\x5f\xd2\x86\x14\xa5\x8d\xa8\x61\x66\xdc\x84\xfc\xbb\x6c\x6a\xa4\x40\x95\x17\xa6\xca\x9a\xba\x2e\xf3\x30\xce\x41\xe0\x86\xb4\xaa\xd6\xf2\x5f\x45\xe3\xef\xac\x1c\xdc\x57\x7a\xf4\xdd\xc7\xde\x7f\xd4\x67\x30\xd9\x29\x7e\xaf\xe4\xa9\x23\x56\xe3\xf3\x21\x6c\x55\xdf\xea\x73\x59\x1d\x89\x60\xe0\xe7\x72\x8e\x88\x10\x92\xae\x57\x3f\x24\xbd\xc9\x27\xd0\x37\x2e\x1a\xeb\xb3\xbe\xe8\xe5\xad\x18\x17\x0e\x82\x9c\xf3\xc3\xa1\x51\xce\x59\x01\x87\xb4\x38\x4c\x47\x8b\x83\xa3\x24\x61\x50\x97\xc8\xca\x3d\x6d\xed\x3c\x89\xfe\xaa\x44\xb9\xb3\x71\x99\x00\xf9\x90\x5e\x25\xc4\xb8\x41\xe6\x64\x8b\xd7\x0f\x26\x03\x92\xc6\x1f\xd6\x5d\x9c\x69\x50\x3a\x60\x8f\x0b\x1f\x81\xd6\x1b\x33\xaa\x6d\xc7\x04\xd0\x7b\x8c\x42\x8d\xc1\x20\x9b\x7e\xa8\x41\x3d\x39\xff\x5a\xc5\x86\x00\x7d\xa7\x09\x71\x5a\xe1\xfb\x3d\xa3\x25\x03\x83\x1d\x02\x50\x1d\x01\x74\x08\x9f\x88\xbc\x8b\x6e\xb0\x2e\xd2\xf6\xe5\xe8\xc5\x8e\xd2\x7b\x72\xfc\x6d\x81\x9f\x78\x3a\xa5\x80\x0f\x6b\x3b\xa2\x14\xf4\xf4\x3a\x51\x64\x97\x66\x25\x8a\x71\x00\xa7\xe1\x70\xd3\x4a\x84\x16\xf0\x11\x8e\x31\xc6\xd8\x40\x34\x80\x0f\x5f\x20\x19\x9c\xa3\xe5\x7e\x3a\x6e\x99\x3c\xf2\x34\x9d\x14\xbf\xcf\x23\x2c\x90\x2e\x20\x31\xc8\xbc\x81\x75\x20\x37\xed\x77\x77\xcd\x30\xce\x3c\xc5\xdd\x32\x25\xcb\xa4\xfb\x71\x93\x8a\xc2\xdd\x28\x63\xe4\x3d\x86\xf5\xc6\x9a\x5d\x7c\x6c\x02\xde\x3e\x4b\x7b\x93\x74\x4a\x58\xc6\x69\x43\x59\xac\x7a\x11\xed\xc0\x04\xeb\x33\x1e\x83\xe7\x7d\x24\x4a\x98\x8e\xe1\x2e\x13\xcb\xe8\xe2\x0f\x8f\x4a\x72\xfc\x77\xe1\x76\xb9\x6d\x2f\x1d\xfa\x58\x47\x5a\xb2\xcf\x47\xd3\x9b\x44\x13\xba\x14\x4c\xaf\xa7\xb8\xe2\x43\x47\x51\x24\x48\xe5\xee\xa1\x94\x78\xeb\xd8\x3f\x9f\xee\xed\x60\x18\x63\x8c\xf1\xa1\x23\xf1\xd7\xe0\xc1\xfb\x0e\xe5\xcc\x0d\xe4\x4c\xb2\x7e\x9c\x32\x81\xb2\xf9\xe9\xb1\x26\xfc\xcf\x65\xb4\xac\x1e\x41\xb0\xcd\x18\xb3\x64\x23\x9b\x31\xf6\x0d\x98\xcf\x87\xb7\x24\x84\x5c\x4d\x6f\x0a\x5b\xdc\xba\x6e\xd9\xa0\x8d\x1d\x11\xf4\x8d\x0b\x8d\x54\xc4\xcd\x81\x83\x86\x92\x89\x21\xd8\x6c\x93\xcd\xbd\x8e\x4d\xce\x3c\x93\x9f\xac\xa2\xb5\x10\x17\x8b\x19\xea\x41\x3c\x05\x48\x8a\xda\x90\xfb\xfe\x67\xde\xa0\x37\xb3\xb5\x69\xb7\x57\xb5\x41\xd6\xe0\xfa\xc6\x96\x10\xb5\xcc\xa0\xbe\x6e\x13\xdd\xf5\x4c\x70\xd0\x6f\x9a\x35\x3d\x4d\x92\x3e\x95\xd4\xbe\xef\xb6\x30\x1f\x50\x1e\xe1\xb2\xa6\x9d\x94\x1c\x2b\x92\xe9\x6a\x13\xe1\x5a\x35\x76\xc5\xe3\xcf\xce\xeb\xb6\xdc\x25\x79\x70\x11\x8d\x9f\xf8\x12\x18\xd9\xd1\x9d\x3c\xd4\x9c\x19\x3f\x78\xb3\x3e\x89\x3c\x59\x25\x81\xe1\x5e\xa2\xa9\x8a\x36\x8e\xd0\x0c\xad\x59\xc9\xf6\x79\x9c\x80\xea\xf3\xec\xfe\x7a\x16\xa6\xcd\x92\x69\x84\x1a\x58\x2d\x2e\xf4\x2f\xf8\xc4\x44\x00\xf5\xde\x36\x3a\x6f\x49\x00\x56\x41\x48\x1e\xea\xb3\x43\x18\x4b\xd4\xfb\xe1\x24\x0e\x3c\x5e\xb8\x12\x41\xba\x3e\xd5\xa9\xb8\xaa\xb2\x31\x07\x9b\x3a\x14\xf0\x3c\x02\xe5\x88\x64\x55\x57\x2c\x42\xbd\x4a\xbc\x6e\x60\xf9\x12\x0a\x52\x7b\xc2\xb8\x44\xe8\x33\x97\x36\x2b\x2d\xe3\x74\x1b\xf1\x87\x2e\xa4\xb3\x49\xbf\xb3\x85\x50\xda\x25\x14\x9b\x36\x81\x72\x89\x9c\x5d\x6a\xe7\x0a\xbc\x40\x32\x4a\x0d\x41\x15\x7f\x0b\x11\xe7\x92\xa6\x5c\x9a\x43\x4d\xc1\x96\x76\x2d\x4e\x03\x83\x31\xb2\x8b\x4a\x0a\xe7\xe4\xde\x69\x87\x3a\xba\x5d\xde\xaa\xf6\x05\x2b\x1a\x43\x78\xca\x3e\xa9\x17\x7b\xcc\x27\xeb\x10\xe2\x70\xa5\xf3\x62\x05\x33\xd2\xec\x73\x8a\xd9\xc1\xe2\x01\x05\xa4\x9f\xf6\xde\xe6\xe7\x44\x1d\x51\x66\x39\xfd\xc8\x7c\xea\x64\xaa\xe8\x45\x4f\xa7\x4a\x5f\xa6\xe0\xda\xdb\x1c\x39\x4c\x24\xfd\xf8\x24\x44\xd3\x57\x70\xf5\x6e\x20\xf8\x0d\xe5\x30\x48\x40\x6c\x10\xce\x49\x59\x73\xde\x9f\xf3\x9e\x75\x3d\xb0\x3e\x7d\xe0\xf5\x6d\x2f\x1f\x51\x51\xde\xdd\x59\x33\xa4\x6e\x11\x65\xdd\x44\xfd\x3b\x9f\xdb\xd0\xb6\x3e\xdb\x79\xc5\xf6\x0a\x26\xf0\x96\xed\x22\x4d\xbf\x89\xf4\xe1\x30\x72\x68\x35\xef\xa6\x60\x95\xf7\x69\x68\x62\xb0\x46\x0c\x26\xb8\x2d\xf0\x66\x1f\x36\x58\x7e\x44\xf0\x9c\xe4\x07\x3b\x1c\x26\xa7\x53\x91\x18\x39\xf5\xc4\xf0\x92\xaa\xc3\x81\x25\x75\x3f\x6c\x48\xfc\x42\x57\x1b\x79\xb2\xa6\x86\x04\xcc\xd4\x5b\x4e\x5e\xca\x71\x45\x99\xd8\x12\x3d\xa3\x77\x81\x60\x73\xc0\x77\xb4\x3d\x39\xe6\xf7\x6e\xfc\x3d\x27\xb5\xc9\xbb\xe5\x66\xa5\x93\xd1\x93\x4c\x5c\x28\xdb\xac\x14\x10\x54\xc8\xf3\x8f\xb8\xab\xd3\x95\xa6\x46\xe9\x42\x7d\xd9\x2d\x47\x41\x8a\x9b\xab\x4e\x0f\xa5\xb1\xec\x7a\x8d\x70\xb1\x6d\xbb\x65\x7b\x82\x57\xce\xff\xb6\x70\x9e\x50\x1f\xcf\xa9\xec\xa1\xc4\x06\x87\x8d\x0f\xdb\x1d\x7c\xec\xe7\x8d\x40\x08\x0d\x13\x67\x9f\xe3\xf0\xf1\x4b\xe1\xf2\x5c\xf3\x5a\x69\xde\xf8\x4f\xef\xec\x77\x38\x27\xef\x56\xe9\x9a\xaa\xab\xe0\x1a\xac\x43\xbb\x7b\x99\xa3\x3e\x22\x53\x9b\xa9\x09\xba\x3b\xe8\xf0\x9c\x9a\xe7\x89\x68\x84\xca\x3f\xe9\x7c\x06\x31\x67\x25\x4a\x8b\x2a\xc2\xb2\x7d\x8d\xc8\x1f\x9c\x01\xb0\x87\x38\xf8\xc4\x2c\xe3\x11\x4c\x6d\xdf\x4d\x88\x19\xeb\xfb\xff\x37\x66\x0c\xa1\xf4\xe0\xb6\xfc\x64\x69\x9c\x75\xfe\xdf\xbe\x2e\x53\x8d\xff\xf7\xaf\x4b\x23\xa3\x1b\xcf\x2a\x26\x45\x20\xb2\x6e\x68\x09\xbb\x1c\xf9\x73\x43\x12\xb3\x57\xfc\x25\x46\xe5\x7d\x03\x13\x85\xe5\xa6\x6e\xea\x9e\xb8\x4a\xbb\x78\x71\x2c\x8e\x7c\x8c\xbe\x73\x9f\xba\x09\x78\x62\x18\x91\xcf\xa2\xe7\x00\x20\x5c\x45\xf4\xab\x20\x80\x2a\x27\x70\x8f\xea\x31\xc1\xe6\x6a\x41\x20\xbe\x62\x25\x88\xa7\xe0\xb4\xaa\x71\xb2\xf4\xa8\xaa\x56\xaa\xaf\x58\x89\xbb\x5e\x3c\x57\x48\x50\x48\x31\xdc\xbe\x66\x77\xf4\x25\xf1\x52\x45\xbf\x5f\x62\xa2\x8c\xf9\x2a\x48\xe2\xf3\x4c\x3e\x67\x9c\xc0\x6f\xd4\xb8\x1b\x91\xd6\x92\x2e\x44\xb0\x4f\x53\x9c\xac\x72\xdd\xd8\x31\xf8\x9e\xc3\x9f\x0c\x2a\xb8\x35\xdb\x5a\xb3\x1f\xae\x18\xbe\x65\x13\xeb\xc5\xb0\xc3\x99\x7f\x0f\xe0\xdd\x89\xe9\xc7\x35\xf2\x35\xb1\xe7\x09\xb4\xda\x47\x53\x47\x74\x68\x38\x93\xf6\x89\x9a\x6c\xa5\x94\xd6\x8d\x2c\xb4\x4f\xd4\x52\xad\x5d\x32\x42\x5d\x0d\xdb\x8d\x47\x59\x5f\xdd\xd8\x55\xd7\x0a\x34\x7e\x70\x04\xb5\x08\xea\xaa\xae\x3b\x62\x11\x09\x94\x90\x09\xdb\xde\x62\xd1\xbe\x76\x5f\xb3\x7d\x5e\xd5\xd5\xd4\xb2\x09\xf8\x70\xdd\xce\x09\xfc\xe4\xba\xed\x90\x76\x90\xfa\x69\xfa\x55\xd7\xd3\xe5\xd2\xce\x9e\x5f\x20\x57\x61\x63\x0a\x84\x48\x96\x68\x8e\xe3\xee\x46\x75\xc3\x21\x4d\xaa\x77\x13\xdd\xae\xcc\x6a\x6b\x27\xfa\x7d\x8c\xef\xef\xec\x78\x54\x3b\xf4\x9c\x36\x30\xd1\x35\x2b\x30\x4a\xa0\xa4\xab\x7e\x55\x58\x24\xa4\x6a\xb7\x4b\x36\x08\x89\xd6\x8c\x81\x70\x7b\xf2\xec\x6b\x06\xcb\xbe\x27\xb0\xec\x92\x63\x42\x0c\x9b\xa4\x77\x96\x5e\x1c\x36\x14\x08\x4d\x7c\xf7\x38\xc3\x47\xe7\xbf\x33\xac\x53\x13\x3b\x89\x40\x26\xcc\x6a\xe9\x05\x04\xb5\x1a\x5f\x74\x08\xa5\x1d\xf7\xe5\xb9\x48\xbe\x95\x1c\x0a\x74\xd8\x24\xc2\x69\xcb\x9b\xbf\x3a\xae\x10\x22\x5b\x3d\x92\x33\x1a\x0a\x3d\xee\x70\x18\xa7\xc7\x22\xaa\xc0\xbc\x25\x55\x60\x3c\x29\xd1\xb9\x21\x59\x26\x70\xce\xc8\xe9\x2d\x58\x86\x88\xcc\x55\x09\xf8\xeb\x3b\x24\x24\xec\x8b\x7a\x0a\x74\x0f\x93\xa0\xbb\x61\xdd\x40\x04\x94\x19\xdd\x29\x30\xed\xb7\xc5\xda\xd2\x03\x82\xf7\x46\x38\x7b\x71\x36\xd3\x4c\xf1\x10\x8d\x94\x31\xaf\xcf\xe6\xfb\x9c\x93\x12\x45\x48\x9d\x2b\x95\xa0\x0a\x76\xaa\x9b\x48\x1b\x1c\xca\xc1\x82\xbc\x00\xe3\x21\xbf\x1d\x29\xbd\x66\x0b\x63\xf8\x94\xf4\xae\x84\xc3\xf7\x78\x29\xb2\x7e\x75\xef\x29\xc4\x07\xf2\x45\x63\xe0\xa3\x37\x5f\x97\x4d\xce\x1b\xbb\x01\x19\x28\xae\xec\xd7\xc7\xe0\x76\xd4\xd8\x82\x0b\xde\xfe\x81\xb3\xf8\x40\x45\x08\xed\xc0\x65\x3f\x9a\x50\x62\xe5\xc8\xf9\xb1\xef\x08\xfd\x36\xd7\x8a\x49\xec\x64\x9d\x12\xf3\x35\x62\xe0\xa7\xc2\x8e\x56\x98\x4c\x05\xe0\xa4\x9d\x48\x49\xe9\x52\x74\xc6\x15\xcb\x7a\x93\x2b\x0f\xa7\x4a\x31\xf1\x79\x4b\x83\x6d\xb8\x85\x05\x33\x73\x5b\x37\x6b\x27\x62\xff\x51\x63\x5b\xd9\xc8\xb1\x85\x4e\x4e\x5e\x6a\x94\x0f\x31\x80\x82\x09\x4b\x59\xc2\x34\xc7\x1d\x02\xa1\x99\xe4\x82\x87\x30\x78\x97\x9a\xd2\x5c\x15\x97\xef\xd0\x56\x86\x05\xf1\x67\xc3\x59\xc2\x08\xfb\xae\x10\x3b\xf3\xab\x26\xaa\x74\xc9\x6e\x9f\x6b\x52\x5b\x47\x9e\xb9\x60\x89\x9a\x05\x94\xfd\x19\x11\x71\xec\x54\x03\x22\x4f\xfc\x04\x62\x24\x93\x3d\xf8\x2c\x8a\x6a\x22\xf3\xdd\x94\xf5\x15\x24\x09\x12\xa7\xa0\x6f\x91\x36\x97\xc8\x47\x69\x0d\x49\xaf\xfc\xf1\xbc\x8c\xb2\xa3\x23\x67\xc8\xe0\xb4\xd2\x4a\x6c\xf3\x2b\x9a\x20\xef\x92\xa4\x5b\xd4\xb9\xc2\x1e\xc5\x15\xbb\x5c\x1d\x04\x13\x75\xc2\x27\x3d\xe8\x21\xca\xdc\x19\xbe\x8c\x04\x9d\xee\xd0\xb3\x01\x00\x1c\x82\x98\x9a\x9d\xac\xeb\x6a\xc8\x02\x65\x91\x6b\x97\x49\x1a\xc9\x77\xfb\xba\xe9\x24\x5f\xec\xdd\x0d\x75\xdc\xd0\x38\xf9\xec\xe4\x51\x89\x54\x09\xf5\xce\x07\x70\x50\xd0\x3b\x35\xd2\x11\xb6\xa0\xd3\x43\x74\x7b\x7d\x5b\x69\x26\xd2\xa9\x25\xda\x26\x21\x3b\x90\x10\xde\x40\x9a\x7f\x64\xdc\xa8\xee\x0c\x67\x1c\x65\xa3\xf2\x21\x1f\xbd\x27\x97\xc9\x5d\xf8\x0e\x28\xb3\xbc\xdc\x33\xee\x1d\xa1\x60\x60\x7b\x73\xb2\xf3\x1b\xd5\xb9\x8e\xfa\x4e\x35\x32\xc3\x31\xb0\x94\x6e\xad\x21\x1f\x24\x4d\xb0\x8e\x2a\x11\xd7\xa5\x43\x1a\xc7\x1f\x77\xb7\xef\xa4\x71\x31\xb5\x26\xae\xc9\x09\x2a\x4f\x54\xfa\x8c\xca\x2b\x78\x6a\x08\x2a\xe7\x2a\x01\x53\xf3\xcf\xc4\x4e\x88\xbf\x38\xd5\xd2\x8f\x4e\xa5\x24\x22\x5e\x46\xd1\x69\x67\x2c\x94\x1e\x76\x22\xc0\x03\x4d\xaf\x7c\x0c\x5d\xcb\xef\x09\xad\xb3\x14\x48\xa6\xed\x41\xa2\x6d\x29\x42\xca\xb6\x56\x93\xec\xba\x6f\xc3\x24\xaf\x2c\x80\x56\xec\x9a\x0c\xd8\x21\xe7\xd1\xa0\xa5\x02\xe2\xc7\x26\xea\x63\x45\xe2\x5a\xea\x47\x2f\xbf\xe3\x34\x31\xf2\xc5\x72\x18\xac\xb5\xda\x35\x09\x19\x2c\x25\x53\xa6\x5c\xd1\x20\xa5\x29\x1d\x5c\x17\x37\xc9\xc5\x2a\xdf\x93\xe2\x2a\x8c\xa0\xb5\xc4\x30\x20\x65\x3e\xdd\xcd\xae\x5e\xd5\x25\x91\x31\xf2\x25\x3b\xd7\x2f\x0a\x39\xe5\xe0\x21\x25\x5b\xe2\x17\x17\x3f\xc0\xbf\xa1\xf3\xa3\x05\xe2\xa0\xcb\xdb\x10\x6b\xa9\x5f\x58\x7e\xb7\x16\xdd\x38\x2d\xce\x37\x2f\xe2\xef\xee\x49\x72\xa5\xad\x21\x1a\x85\x96\x7d\x0a\x26\x58\xb6\x3a\xb1\x86\x22\x60\x57\x29\x84\x17\x65\x2d\xb1\x8f\xf9\x83\xf0\x21\x05\x78\xa7\xb7\xbf\xcf\xb3\xb7\xff\xf2\xd1\x08\xf0\x2f\xd2\x4f\x1b\x30\x12\x84\xea\x35\x8c\x4d\xd7\x4b\x96\x7c\xb9\xd3\x73\xb7\x0d\x20\x7d\x38\xf2\x7c\xec\x5e\xbf\x35\xc4\xee\xc1\x89\xbd\xb3\x31\x1c\x4d\x37\x86\xf2\x73\x26\xa6\xb3\xc9\xaf\xa8\x8f\x49\x47\xbf\x8a\xb9\x67\xe7\x2a\x69\x4f\xd6\x49\x54\x49\xfa\x88\x87\x17\x7c\xf8\x9e\x45\xe2\xeb\x92\xb6\x52\x5c\x05\x07\xd1\xb8\xc2\x34\x43\x6f\x3c\xba\x27\xb4\xe1\xef\x18\x55\xdb\xcb\x44\x2e\xe0\xbb\xf5\x0e\x58\x3a\x49\x74\xd0\xe8\x66\x14\x6f\xff\x80\x23\x45\x7e\x1a\xb6\x05\x97\x88\xfd\x5f\xbc\xa8\x7b\x7a\x63\xbc\x07\x29\x44\x18\xa5\x3b\x4b\xea\xdb\x52\x8a\xaf\xad\xb6\x21\xc1\x47\xe3\x95\x6d\x35\x04\xa9\xeb\x84\x55\x8c\x0a\xe6\xc9\xc9\x01\xd0\x0e\xaf\xf0\xb2\x35\xc4\x65\x65\x8f\xd6\xd9\xc5\x23\x77\x73\x76\xdd\x5e\x12\xd8\x5f\x3c\xbf\x3c\xe7\x08\x35\xa3\xab\x07\x18\xbe\x1d\x0c\x92\xa7\x57\x04\x85\x7c\x4d\xb8\x70\x1f\xdf\x15\x17\x26\x42\xee\x5c\x0b\x27\x51\x22\xa8\xfb\x0e\xa6\xba\xee\xf6\xb1\x04\x7a\x12\x7c\x40\xd7\x85\x23\x81\xa8\x4c\x10\x3e\x1a\x91\xab\x79\x4f\xa4\xa8\x55\x76\x6a\x79\xd5\x5a\x33\xea\x2b\xb3\x4d\xed\x8c\xbb\xf2\xb2\xe0\xcb\xf1\xf1\xd9\xc7\xf3\x04\x71\x2d\xbb\xb2\x1d\x05\x67\xbb\x7c\x76\xf1\xa0\x15\x37\x57\x9d\x79\x91\xef\x01\xb9\x84\xe3\x1b\x91\xdf\x2f\xb7\x18\x0e\x81\xb9\x00\xef\xaa\xdf\x57\x54\x02\x9d\xba\x6d\x0e\x88\x7e\xca\x27\xec\xfc\xd1\x73\xcd\x95\xef\x1c\xa7\x93\x21\x70\x34\x74\x47\xe1\x8f\x06\x13\xc2\xab\x4b\x5c\xb6\x98\xde\x77\x58\x39\xdf\xc3\x19\x0f\x76\x7c\xae\xe5\x38\x4c\xb3\xdb\x69\x11\x30\x76\x0e\x47\x8d\xe9\x41\xf7\x52\x24\x34\xa1\x7f\x26\x06\xac\x83\x03\xbe\x93\x7d\x88\x5f\x82\xf0\xce\x27\xe3\x79\x07\xbd\x1d\xb7\x10\xd1\x61\xe9\x9c\x1c\xc6\x9f\x0a\xf8\xe4\x20\x13\x98\xa5\x3c\x41\x92\xa8\xc6\xab\x6a\x53\x63\x8d\x31\x7c\xa2\xd0\x77\xf3\x8f\x6d\x35\x46\x66\x75\x7a\x7c\x98\xf8\xca\xd5\xc5\x6d\x62\xb5\x85\xf6\xaa\x21\xcf\x00\xcd\x15\xdc\x2e\x6c\x95\x46\x00\x48\xf3\x05\xe8\x3c\x4d\x2e\x31\xe3\x0c\xcc\xe4\x76\x69\xc8\x9a\x2e\x8a\xe2\xa6\xf8\x94\x31\x2a\x6e\x3d\x87\xdc\x56\x92\x2c\x9a\x6c\x42\x92\x45\x83\x3c\x4d\x96\x89\x82\xdb\xc9\x55\x55\xdd\xad\x72\xd5\x2a\xb2\xbe\x51\x38\xb3\xdf\xcb\xbd\xb8\xa8\x09\xa2\xa4\xd6\xf9\x4e\x44\xa5\x07\x84\xb0\x73\x85\xea\x32\x10\x15\xc3\x7b\xdc\x17\xc3\x79\x5c\xcb\xa6\x5e\x7c\x2d\xaa\xaf\xaf\xc1\x84\x22\xa1\x8f\x5d\xbc\x94\x1f\x0f\x58\x45\xed\xea\x12\x01\x89\xcb\x08\xa9\x2e\x8b\x49\x37\x5e\x2f\x14\x05\x2c\x83\xd5\x15\x9c\x7a\xf0\x5a\xc0\x51\xc6\xd5\x6e\x7a\xde\xdc\xc6\xab\x5f\xe2\x77\x8a\xb3\x98\x7a\x30\x1e\x81\x80\xf5\x6d\x3c\x02\xa6\x35\x9b\xba\x86\x3a\x9f\x90\xf4\x4f\x1c\x90\x8f\xf8\x80\x86\xcf\x25\x21\x30\xbf\xce\x90\x1a\xad\x96\x92\x74\xdf\xc3\x5f\x74\x9a\x83\x21\x04\x27\x98\xae\x4e\x53\x1b\xd6\x7d\x46\x53\xb9\xbb\x92\xe4\xd5\x76\x9e\xbc\x1c\x9d\xbb\x35\x0d\xa4\x40\xfa\x7e\xf8\x49\x60\xbb\xf4\xbe\xf0\x8a\x3c\x65\x94\xdd\x59\x0d\x29\xa8\xe7\x29\x5a\x9f\x70\x7e\xda\xad\x3b\x3c\xec\xa9\x3a\x3c\x37\x28\x9f\x22\x37\xa3\x62\x4e\x6e\xbc\xd4\xe8\xaa\x4b\x39\x90\x0c\xcb\x27\x16\x24\x97\x6a\xee\x59\x00\x28\xf1\xdc\xf7\x7a\x50\xe3\x76\xee\x38\x49\x28\x8e\x89\xc5\xe8\x73\xc9\xd6\x2b\x52\xfa\x14\xd1\x25\x2d\x02\xc5\x31\x98\x89\xe1\xc2\xc2\xff\x38\xb5\xd4\x04\x01\x27\x4c\x8e\xfe\xc2\x50\xe7\x28\x56\xef\x40\xa7\xbe\xd2\x68\x32\xa6\x1a\x54\xdb\x60\x00\xa8\xf4\x94\xff\xce\x3e\xf9\x98\x0a\x1e\x48\xc1\xc7\x9f\x8e\x7b\xda\xc1\x3b\xa5\xdf\x89\x07\x6c\xfe\x9b\x95\x34\x26\xc8\xd3\xc0\x87\xfc\x80\xc4\x80\x6c\x6c\xd2\x16\x35\x21\x36\x9f\xd0\xe4\xae\x36\xda\xe9\xea\xc4\x32\xfb\xdb\x76\xe5\x76\xfa\xd2\xdb\x80\x4c\x60\x0a\x02\x8b\x39\x8e\xf0\x35\xa5\xe0\xc3\xf7\xc0\xaf\x84\x6f\xee\x14\xfa\xf3\x16\x8a\xda\xb6\xd4\xfb\x78\xf1\x2c\x4b\xb0\x41\x28\x73\xc4\xc9\x27\xec\xfb\x7a\x0f\xd4\x1f\xa2\x46\xdf\xfb\x34\x82\x0d\xbb\x34\xf8\xe8\x2b\xdf\x6b\xff\x4e\x04\x91\xfd\xcb\x3d\x20\xee\x7b\x5d\xbe\xbe\xa2\x06\x62\xc4\x99\xb3\xeb\x5f\x84\x39\xfb\xf1\x72\x78\x29\xa0\x05\x3d\x1a\x85\x18\x35\x6b\x16\x80\x79\xea\xf4\xa0\x32\xb5\x76\x84\xdd\x1c\x95\x31\x89\xdb\x12\xd2\xc2\x8d\x0d\x1e\xaf\x52\x4d\xed\x25\x34\xf6\xbb\x73\x26\x8d\xaa\xad\x8f\x90\xa8\x54\xc4\x8d\x84\x11\x4b\x5e\x3a\x97\xa7\x8e\xbd\xe9\x74\xbc\x03\x1b\x1a\x71\xe3\xaa\xc0\x7d\x2a\x07\xe0\x1a\xe1\xc9\xaa\xe0\x33\xa1\xc1\x63\x83\xa9\xc1\x44\x07\xc7\x79\x62\xba\xe6\x7d\x4f\xb8\x52\x69\x2b\xb3\x27\x06\xdd\x8c\xe8\xb3\xc7\xf2\xdd\xbf\x4f\x12\x48\x02\x5e\x9c\xcb\x92\x2d\x1e\x42\xb8\x09\x09\xe9\x9b\xc1\x66\x8d\x23\x26\x70\x08\xa6\x8c\xfd\x9f\x2b\xcb\x62\x83\xb0\x6e\x34\xa7\xc0\x40\x46\xad\xbd\x80\x0f\x8e\x09\xac\x63\xda\xa4\x3f\x52\x2e\x72\x8e\x1e\xa9\xbf\x0e\xc3\x4d\x85\x15\xfb\x7b\x6f\x7b\x6a\xdc\x56\x1b\xe0\xa3\x1a\xaa\x23\x62\x2a\xfa\xe8\xec\x48\xc0\x07\x16\xad\xd3\xe3\x28\x46\x37\x1d\x8b\xa7\x0a\x53\x48\x1e\x9e\x80\x52\xde\x93\x52\x8e\xf7\x36\xd0\x0c\xf1\xee\xee\x4f\xd2\x0f\x5a\xe7\x8e\xa7\x40\x21\xdc\x61\xa0\x4b\x58\x4f\x1d\x81\xef\x9f\x3c\x7b\x39\xa8\x32\x42\x20\xfa\x7d\x12\xe1\x68\xd9\x29\x04\xc3\x92\x7b\xc6\xe2\xcc\x3e\x7a\x99\x7d\xc7\x01\xbc\xe2\xfb\xea\x6a\x78\xe0\xe5\x35\x27\x43\xd6\x58\x5f\x31\x68\x15\x42\x20\xc9\x8d\x11\x87\xc7\x0a\x11\x56\x11\xcd\x39\x24\x49\xce\x2c\x91\xd5\x4a\xaa\x4d\xf4\xd0\xc2\x13\x76\xdc\x3e\x93\xf2\xdc\x03\x53\xe3\x93\xad\xcf\xfd\xf6\x89\x79\x93\xee\x1e\x9b\x32\x8d\xb7\x4b\x60\xa6\x76\xcb\x41\x88\xba\x4e\x5b\x79\x8d\xd0\xeb\xaa\x2a\x1f\x37\x26\xa0\x66\x4d\x97\xce\x36\x29\x6c\x5b\x13\x6b\x10\x9e\x71\x81\x64\xa5\xf7\xc1\x94\x83\x66\xe9\xe4\x72\x88\xf7\xd1\x08\xaa\x14\x10\xd2\xcf\x63\xab\x16\x71\x08\xaa\x16\xe1\x6c\x31\xf2\xd5\x51\xff\x00\x7a\x18\x77\x67\x4c\xb5\x28\xe0\xbe\xa1\xf1\x41\xf0\xe1\x41\x25\x60\x0a\xcb\x0a\x15\xd6\xc1\xf8\xc7\xd1\x43\x4c\x2d\x05\xdd\xef\xdc\x89\x3b\xd8\x75\xc9\xc6\x74\xb4\xa2\x2d\xe0\x11\x81\x1c\x73\x96\xac\x49\xb0\x52\xd5\x55\xdb\xac\xfc\x9a\x89\x12\x4f\x74\x69\xb2\x5c\xfc\xd7\x70\x62\x65\x7e\x2d\xaa\xfe\x30\x33\xdc\x5b\x38\x17\x3a\xd0\x6d\xd7\xed\xdb\x28\xe8\x12\x02\x27\x5e\x0c\xe6\x11\x9a\xd1\xc9\xd8\xa8\x1d\xbf\x40\x39\x2b\x74\xdd\xfa\x3c\xf5\x4e\x66\xf1\xc2\x38\x20\x7d\x56\x05\x4a\xf9\xef\xe1\x3b\xb1\x69\xc4\x9b\x6d\x0a\x3d\x7c\xa7\x65\x83\x15\xbd\xb6\x6b\x98\x0e\x22\xed\xac\x54\xd5\x4c\x00\xdf\xba\xef\xd9\x23\xfe\xde\xfa\x51\x43\xb7\xa1\x23\x86\xea\xe2\x31\xff\xd9\xcb\x73\x1a\xc3\xb8\x41\x71\xc0\x8a\x6d\xbe\xd9\x72\x7a\x80\xc5\x37\xf2\x39\xe3\xa0\x17\x17\xc7\xaa\x33\xbf\x66\xdf\xbb\xd2\xb8\x3e\x54\x46\x5c\x17\xdc\x4d\xbb\x78\x4e\x70\x5c\xe7\x19\x7e\x66\x9f\x5c\xd7\x4d\x06\xe7\xbf\x6a\x53\x4a\x7c\x86\x4f\x4f\x56\x46\xe8\x9b\x86\x9e\x32\xc8\xc4\x7d\x33\x8f\xfd\xb7\x41\x5b\xa8\x31\xdd\x96\xa6\x15\x74\x2d\x7c\xcb\xe1\x1e\x3e\xe9\xea\xec\xca\x4a\x48\x88\xa4\x1a\x9d\x3d\xd3\x6c\x58\x7d\xfb\xa8\xd9\x70\x0e\xa0\x36\x69\x36\xdf\x34\xce\x0c\x05\x2f\xd1\x73\xfe\x0d\x0f\xb9\x4b\xf9\x92\x02\x73\x2a\x90\x00\xcb\x19\x40\x5e\xb1\x20\x61\x0a\x7e\x55\x22\x23\xbb\x03\x7f\x8c\x5f\xd9\x4b\x67\x24\x3a\x55\x81\xc3\x63\x39\x78\x8e\x8c\x75\x27\xb8\x2a\xa7\x01\x4c\xf3\x1b\x83\xc6\xec\x99\x1e\x96\x67\x1c\x8a\x61\x78\xbc\x01\xc0\x44\x2b\x17\x33\xd5\xea\xcc\xc5\xe7\xab\x86\x28\xb3\xc7\x4d\x5d\x05\xd3\x5a\x6f\x4b\x1e\x09\xf3\xdd\x97\x96\xb0\xde\xba\x47\x26\x6d\xc4\x37\x30\x3d\x32\xa2\x39\xe0\x38\xf7\xb6\xdc\x7b\x57\x34\x4e\xd8\x9d\x96\xdb\x5f\xed\xaa\xf7\xd6\x42\x8e\xd5\x65\xb3\x9f\xd0\x44\x2d\x76\x5e\xca\x9a\xb5\x62\xc5\xcf\x11\x56\x9b\x9a\x31\x4b\x00\x4e\x12\xb0\xb9\x91\x83\xd1\x5b\x3c\x2a\x0b\x84\xd3\x3d\xd9\x7b\xe8\x1c\x10\xce\xee\xde\x19\xb0\x6b\x82\x22\x70\x6d\x77\x99\xe2\xbb\x5a\x1c\x47\x65\x4d\x28\x93\x1e\x4f\x0d\xa1\xe1\x68\xe0\x38\x6c\xab\x2a\x07\x5d\x2d\xd0\x83\xa9\x21\xbd\x1f\x05\xa7\xe7\x87\x6d\x87\x8f\x79\x21\x36\x75\x1e\x82\x26\x1e\x60\x52\x2b\x55\xcd\x15\x15\x5a\xcb\x2b\x61\xbc\xa5\x06\xa7\x00\x8d\x19\x6f\x86\x27\xfa\x32\x34\xcd\x62\x2d\x81\x86\x92\x46\x13\x88\x18\x16\xdb\x0e\xc1\xc6\xfd\x4f\x2d\x50\xcc\xaa\xc5\xdf\x96\x9f\xb1\x30\x23\x9e\x96\xdf\x4f\xf7\xad\xde\xeb\x0a\x4d\x8c\x51\x65\x51\xa7\xb7\xe8\x4e\x3b\xd9\xd9\xcf\xb2\x05\x6f\x9c\x87\x3f\xab\x5f\x45\x5a\xc9\xf6\x85\x49\x98\x31\x49\xef\x3e\x23\xa6\xdc\x67\xcc\xf0\x36\x93\x1c\xe4\x80\x68\x22\xa9\xa5\x09\x59\x3f\x0b\x09\x59\x5d\x46\x90\xd3\x99\xf1\x7d\x92\x71\x6a\x56\x9c\x78\x68\x10\x71\x96\xd7\x34\xfb\x6d\xdb\xac\x1e\x0e\xdb\x10\x9d\xb5\x26\x1f\x8f\x80\x01\xf2\x3f\x5c\x37\x32\x51\xc9\xd4\xfe\x8b\xa4\xdc\x57\x8f\x84\xb8\x8f\xf6\xa1\x28\x11\x1f\xca\xc4\xff\x14\x65\x2c\x8f\xb3\xcb\x23\x3b\x7b\xf1\xa1\x0d\x24\x79\xe5\x75\x08\x21\x41\xec\x07\x0e\x46\xa6\x93\x66\x18\x96\x0d\x4c\xd2\x6c\xc6\x8d\x69\xe2\xe0\x13\x13\x4b\x9b\x92\xf9\xa5\xe9\x60\xdf\xa7\x2d\x9d\x63\xda\xd8\x70\xaa\x1f\xde\x6c\x9a\x68\xff\x97\xc2\x67\xda\x77\x4e\x25\xef\xb7\x6a\x13\xa9\x50\x7f\x89\xd2\xe4\x7e\xf0\xca\xf9\x18\xf4\x7c\x7a\x43\x98\xf9\xf8\x36\x4c\x66\x2e\x9e\xb8\x5e\x1c\xab\xb1\x33\x9b\x70\x09\x38\x98\x4f\x3c\x0c\x3e\xfb\x71\x1a\xfd\xd3\xf7\x64\x70\xc3\x5c\x4a\x6d\x4e\x75\xec\x30\x34\xa7\xd6\xce\x4b\x8e\xe7\xc5\x72\xef\xfb\x2e\x0f\xb3\x65\xc3\xf8\xd9\xcf\x5d\x5d\x97\x6f\x66\x66\x83\xb9\x75\x44\x4a\xcf\xae\x9b\x7a\xc7\x2e\xd3\x86\x5e\x19\x88\x26\x8e\x40\x75\xb7\x0b\xfc\xfb\x59\xbb\xf8\xcc\x07\x55\xbe\xdf\xce\x3e\xdb\xd1\x6f\xa4\x09\xeb\x3b\xfd\xb0\xa5\x0f\x9d\x2f\x5e\xd3\x2f\x97\x1f\x14\xbf\x6f\xe9\xf7\x01\x6e\x57\xb5\xd4\x26\x74\xfd\x59\x56\xf4\x30\x06\x6f\xa5\xc6\x11\x10\x7d\x2d\xbf\x5a\x4b\x6f\xff\x9a\x93\xac\x6b\xa7\x46\x12\xb1\x22\x2f\x19\x7f\x76\x7d\xf3\xf7\x6d\xdd\x37\xad\x66\xce\xd7\x4f\x6b\x73\xe4\x2f\x3e\x33\x2b\xe7\x04\xb4\xb6\xe0\xaf\x32\x14\x69\xb3\xae\xba\x2d\x7f\x94\xe1\x20\x21\x27\x7d\x3e\x5a\x23\x4d\xd2\x98\xf4\x53\x63\x6e\x97\x6e\x60\x6e\x54\xfc\xd1\x0d\xcb\x8f\x89\x56\x77\xdd\xd4\x7b\xa4\x2b\x7a\x33\x73\x69\x12\x5d\x7e\xc4\xf3\x7e\x5d\x77\x21\x1c\x5a\xe7\x83\xe6\x43\xaf\xa1\x29\xb9\xb2\x12\xa2\xce\x9d\x3e\x51\x4d\x87\x08\xa9\x2e\x65\x6a\x5e\xed\x7b\x15\x4c\x6b\x7c\x20\xcd\x94\x93\x47\x91\xce\x6e\x42\xc8\x78\x36\xc3\x9c\xcf\x58\x02\x8e\xc0\x65\x57\x22\x84\x64\x30\x16\x00\x7d\xf2\x8f\x7f\x30\xd9\x9a\xff\x66\xff\xf9\xcf\xec\xf9\xd7\x9f\x66\xfc\xf9\x58\xba\x28\xc0\x60\xb3\x9c\x48\xb3\x02\x38\x91\xbb\xdf\x26\x35\x10\xa9\x87\x3d\x1d\xc5\x7a\x48\xf5\x34\x2e\xea\xda\xec\xff\x0f\x00\x00\xff\xff\x28\x8d\x5c\xe8\xa1\xdf\x00\x00") - -func confLocaleLocale_fiFiIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_fiFiIni, - "conf/locale/locale_fi-FI.ini", - ) -} - -func confLocaleLocale_fiFiIni() (*asset, error) { - bytes, err := confLocaleLocale_fiFiIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_fi-FI.ini", size: 57249, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_frFrIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\xbd\xdd\x8e\x1c\xc7\x95\x2e\x7a\x9f\x4f\x91\xa2\x41\x34\x09\x34\x8b\x90\x3d\xe7\x07\x82\x4a\x3e\x64\x93\x92\x68\x34\xa9\x36\x9b\xa2\x0f\x8e\x40\x94\xb2\xaa\xa2\xab\x92\xcc\xca\x2c\x67\x64\x36\xd9\x34\x0c\xcc\xad\x0f\xce\x03\x9c\x7d\x67\xcc\xc5\xde\xe2\x0c\x30\x57\x73\xb3\x31\x77\xea\x37\x99\x27\xd9\xeb\x5b\x6b\xc5\x5f\x66\x56\x93\xf2\xf6\x6c\x03\x16\xbb\x22\xe3\x3f\x56\xac\x58\xff\xab\xd8\xef\x17\x6b\x63\x57\xf3\xef\xeb\xdc\x9a\xf6\xb2\x5c\x99\xfc\x9b\xb2\xcb\x8b\xbe\x6b\xee\x6d\xaf\x3f\x2c\x4d\xbb\xb9\xfe\x90\xdb\xa2\xb6\xf9\xbe\x2d\xad\xc9\xd7\x26\xef\xae\xff\xb9\x33\x59\xb6\x6d\x76\x66\xfe\x60\xb5\xea\x4d\x59\x65\xeb\xc2\x6e\x97\x4d\xd1\xae\xe7\x2f\x8a\x65\x65\x8a\x1e\x15\x97\x4d\xbb\xce\xcc\xbb\x7d\xd5\xb4\x66\xfe\x58\xfe\x6d\xb3\xad\xa9\xf6\xf3\x07\xe5\xda\x64\xb6\xdc\xd4\x8b\xb2\x9e\x9f\x34\x75\x6d\xde\x95\x4d\x2d\x25\x4d\xdf\xcd\x1f\x5d\x7f\x58\xa5\xa5\xfd\x7e\xfe\xa4\xb6\xab\xb6\xdc\x77\x28\x6b\xcd\xa6\xb4\x9d\x69\xe7\xe7\x47\x25\x17\xb7\x26\x7b\x6b\x96\xb6\xec\xcc\xfc\x9c\xfe\x93\xd3\x8f\xec\xd2\xb4\x96\x2a\xcf\x5f\xca\xbf\xd9\xbe\xd8\x98\xf9\x19\xfd\x27\xeb\xcc\x6e\x5f\x15\x54\xf7\x69\xb3\xbe\xfe\xa9\x32\x59\x55\xd4\x9b\x1e\x9f\x4f\xf1\x87\xc9\x56\xad\xa1\xcf\x8b\xda\xbc\x9d\x9f\xb4\xd7\x1f\x4c\x3b\x9b\xcd\xb2\x9e\xf6\x68\xb1\x6f\x9b\x8b\xb2\x32\x8b\xa2\x5e\x2f\x76\x58\xd9\x19\x17\xe4\x7d\x57\x56\xa5\xa5\x46\x7d\x9b\x9b\x2e\xdf\x57\xbd\xe5\x99\x9b\x35\xad\x71\x51\x58\x59\xe6\xaa\xa3\xfd\x34\x75\xde\x15\x75\x97\xff\x91\x06\xe2\x4e\xeb\x82\xf6\xf2\x59\xb3\xcb\xd7\x47\x51\x37\x99\xd9\x15\x65\x35\x7f\x7c\x0f\xff\xd0\xe4\xad\x7d\x4b\x3b\x4a\x53\xee\xb0\xbb\xf8\x6d\x68\x1f\x16\xdd\xd5\xde\xa0\xf3\x8b\xb2\xdd\x99\xf7\xd9\xaa\xd8\x77\xab\x6d\x31\x3f\x91\x7f\x33\xaa\xb2\x6f\x68\x5f\x9a\xf6\x0a\xdb\xba\xbf\xfe\xb7\x2e\x6b\xda\x4d\x51\x97\xef\x0b\x6c\xe5\xfc\x3b\xfe\x61\xf9\x47\xb6\x2b\xdb\xb6\x69\xe7\x4f\xcb\xb6\x29\xdb\x8c\x96\xbf\x40\x73\x9a\x5b\x7f\xc9\xa7\xaa\x1d\xe0\xc3\xae\xdc\xb4\xd8\x42\xfe\x56\x55\x26\x97\x02\xf4\x22\x9f\xb9\x27\xd7\x72\x17\x7a\xbc\x68\xda\x37\xbe\x1c\x3f\xb8\x94\xe6\x14\xba\x6a\x92\x39\x15\x35\x9d\x0c\x57\xf8\xe6\xfa\x03\xc1\x50\x5e\x19\x9b\x54\xb1\x59\xb1\xde\xd1\x2e\xef\x8b\xda\x54\xf3\x07\xf8\x9b\xa0\x43\x27\x53\xac\x56\x4d\x5f\x77\x0b\x6b\xba\xae\xac\x37\x96\x20\xa0\x2d\x76\xd7\x3f\x75\x2d\xf5\xb2\xee\xf3\x55\xb3\xdb\x13\x40\x4f\x7d\xce\xae\x9a\xde\x9f\xf8\xfc\x65\x43\x65\xb9\xfc\x92\x2f\xbe\xcd\xcb\x86\x2e\x48\xd4\x8e\x06\xed\xca\xcb\xb2\x2b\x8d\xa5\x3b\xc2\x7f\x5e\x7f\xb0\xd9\xbe\xaf\x2a\xda\x50\x3a\x77\xdb\xd1\x40\xf4\x2b\x7f\xae\xbf\xb2\xd2\x5a\xfa\x63\xfe\xa2\x5c\xbd\x31\xf4\x93\xce\xb1\x5e\x61\x31\x75\xdd\x57\x74\x6d\xb2\x1f\x08\xce\xbb\xa2\xaa\x5e\x65\xfa\x07\xee\x03\xfe\x95\x55\x76\x65\x47\x53\x44\x51\xdb\xaf\x78\x4f\xf2\x3d\x4d\x31\xaf\x0a\x9a\xb1\xd9\x95\xd7\x3f\xd1\xdc\xcd\x3b\xba\x57\x3d\xd7\x5f\x37\x34\x4e\xbb\xc0\x6d\xc4\x2d\x2a\xf3\xcb\xa6\xb7\xae\x82\x79\x9f\x7f\xd3\x6c\x6c\xbe\x69\xaf\xff\x89\x50\xc2\xf5\x5f\xf3\x47\x5c\xfd\x38\xdf\x99\x76\x55\x02\xfc\x2a\xba\x71\xe8\xfc\xcb\x82\x60\xb9\xdd\x98\x6e\x7e\x6b\xb1\xa4\x5b\xf4\xe6\x56\xbe\x6d\xcd\xc5\xfc\xd6\x6d\x7b\xeb\x2b\xda\xab\xd5\xf5\x87\x75\xdf\x9a\x2f\xef\x17\x5f\xe5\x45\xd7\x99\x9a\x36\xc3\xec\xe8\x9f\xbc\xb8\xc4\x1d\xa0\xae\x76\xcd\xba\xbc\x28\xe9\x58\xff\xd8\x37\x25\x2e\x45\x4e\x63\xda\x86\xf0\x90\xa5\x05\xac\x68\x8f\x01\xed\x1b\x93\x7f\x96\x61\xef\xe8\x76\x2f\xd6\x4b\xc1\x5b\x3c\x4b\x2e\x34\x6d\x97\x3f\xbd\x3a\xff\xfd\xe9\x71\x7e\xd6\xd8\x6e\xd3\x1a\xfe\x9b\xfe\x43\xf5\x7f\x93\x37\x7d\xfe\xa2\x7c\xf4\x70\x96\x51\x4b\xd9\xaa\x04\x0a\x78\x29\xcb\x42\x10\xdc\x9a\x2e\x2a\x5d\x79\xcb\x75\x71\xb9\x5e\xd0\x7f\x18\xa1\x0d\x2b\x6c\x69\xa4\xf9\xb7\x74\x21\x0c\x5f\xe3\xf9\xf7\xd1\xe5\x9d\xbe\xaf\xd4\x65\xb8\xec\x13\x3d\xd2\x77\x3d\x92\x97\xa6\x2f\xe9\x2a\xbc\x57\xc4\xc2\x50\x4f\x5b\xc5\xf8\xe5\xc9\xb3\x67\xdf\x3d\x7a\x48\x3b\x68\x56\x28\x7d\x6d\x18\xdf\xae\x68\x45\x84\x5f\x7e\xc2\x8a\xfa\xee\xe2\xff\x5c\x6c\x4c\x6d\xda\xa2\x5a\xd0\x89\x31\x2c\xf0\xfe\xcc\x32\x6b\x2b\xc2\x5c\x6b\x46\x7e\x26\x3f\x3f\x3f\xa5\xb9\x76\xdb\xf9\x63\xa0\xc4\x15\x9f\x4d\x66\xff\x58\x61\x9b\x75\x2a\xa7\xd4\xf7\x96\x60\xa8\xc6\x75\xb9\x28\x57\x5b\x1c\xd6\xc4\xec\x47\xbb\x9d\x7f\xb9\x6c\xbf\x92\x4d\xc1\x42\x6a\xd7\x4d\xb1\xb4\x4d\xd5\xe7\xf4\x20\x58\x1c\x37\x83\x1e\xa1\x96\x5d\xd1\xb6\x54\x2f\x42\x8f\xee\x55\x9a\x65\xa6\x6d\x17\x84\xb4\xbb\x2b\x9c\x3d\xcf\x37\x9a\xd5\xe4\xf1\x0d\x67\x93\xd7\x74\x08\xa6\xef\x72\x7a\xbf\x08\x76\x2f\xe9\x09\x92\x6e\xcb\xfa\xb2\xa8\xca\x35\xc1\x85\x3b\x1d\xea\xba\x96\x03\x9a\xea\x37\xe9\x8c\x9e\x29\x02\xea\x52\x70\x52\x7c\x02\xb7\x66\xb7\x30\xf2\xad\x7b\xb7\x66\x59\xdd\x2c\x04\x41\xe1\xd1\x58\x13\x84\xd0\x1b\xb9\x90\x27\x4c\x90\x14\x21\x10\xda\x02\xf4\x09\x0c\xf8\x1e\xc0\x82\x0d\xb1\x8c\x46\x70\xf4\x47\xa6\xd6\xfa\x72\x79\xf8\x49\x5e\xf1\xcb\xc4\xfb\xca\x38\x2c\x2f\x02\xe6\x23\x30\x89\x37\xcd\xe1\x47\x85\xc9\x53\x06\x25\x0f\x96\x01\x0d\x0e\xba\x98\xdc\xb3\xcc\xc1\xd5\xf8\x22\x11\xb5\x40\x7b\xd4\x16\xfd\x3b\xf4\x8d\xdb\x99\x81\xc6\x88\x41\xbe\x3a\xa2\x92\xaa\x5c\x29\x72\xd6\xaf\x0e\xd4\xe4\x8d\xc7\x16\x5c\x30\xca\xe2\xc5\x56\xfe\x38\x2e\x19\x05\xc7\xa8\x3f\x2f\x09\xba\x3f\xe3\x47\x6e\x31\x04\xe3\x9c\x4e\xa3\xac\x71\x78\xd6\xbd\x5c\x36\xd4\x74\x43\xbe\xc0\xd6\x57\x51\x15\x26\x81\xe8\x94\x00\x84\x16\x10\xd8\xf0\x86\xd3\xc1\x6c\x88\xc2\xa1\x53\xc1\x98\xb3\xac\xed\x89\x2a\x19\xdc\xfa\xdc\x5e\x59\x3a\xff\x9d\xf1\x5f\xfd\x1d\x8a\x5f\x76\x82\x25\x50\x59\x97\xf4\x22\xe6\xf4\x3c\x5d\xff\x64\x81\x63\x09\xd6\x26\x26\x0c\x62\xc2\xa1\xe5\x96\xb7\x94\x90\x58\x43\x24\x41\x3d\x7f\xc4\xff\x18\xfd\xe9\x46\x3a\x31\xd4\x51\x71\x71\x41\xb4\x86\x91\x75\x35\xfd\xb2\xc2\x83\xb0\x3e\xfa\xfe\xf9\x29\x5d\xf8\x6f\x81\x03\xb6\x8b\x7d\xd3\x76\xf3\x33\xfa\x0f\x8a\x7c\x89\xeb\xe6\x59\xbf\xa3\x93\x6c\x18\x46\x50\x47\xa6\x4f\xd4\x0b\xbd\x73\x7a\x0e\xb8\x9c\x58\x0d\x35\x3f\xc6\x21\x55\x05\x3d\x62\x34\x49\x80\x89\x60\x9c\x04\x86\x0b\x7a\xec\x6b\x7e\x9b\x6a\xba\x6f\xf4\x20\xce\xb2\x6d\xd7\xed\xa3\x79\x7c\xfb\xe2\xc5\x59\x28\x3b\x34\x13\xe0\x85\x04\x8a\x72\x50\x8b\xd8\x9e\x62\xc6\x00\xd5\xb7\xd5\x1c\x2b\x9d\x84\x36\xfa\xf8\xa9\x3b\x85\xe9\xdc\xc7\x7f\xce\x71\x08\xb4\x40\xb9\xec\x84\x6c\x8f\x0c\x13\x65\xb3\xac\x6a\x36\x8b\xb6\x69\x3a\x81\xbd\x13\x87\x8f\xac\x43\x93\x04\x59\xcd\x26\xad\xe5\x46\x7f\x4e\x07\x4c\xaf\x56\x83\x87\x74\x7d\x44\x4b\x68\xcb\xae\x6f\x4d\xda\x1a\x4b\x68\x36\x74\xe7\x1a\xa6\x7b\x27\x2f\xdd\x45\xb1\xea\xab\x8e\x56\x78\x61\x85\x64\x9c\x7a\xe1\x7a\x4f\xe0\xe3\xc5\x35\xd6\xd2\x83\xda\x96\x44\xf6\xec\x68\xb7\xc3\x3b\x96\x9f\x3f\xa5\x23\xe0\xc2\x8b\xb6\xd9\x81\xb8\xbd\x34\xb5\x3c\xd4\xa1\xd8\x2d\xe1\xc1\x9a\xfa\x16\xec\x48\x18\xea\xdd\x9e\xde\xfa\x12\xf0\x7d\x9c\x3f\xff\xfa\x24\xff\xdf\x7e\xf3\xeb\x5f\xcf\xf2\x73\x80\x7a\x5f\x03\xb3\x48\x65\x3a\xaa\x96\x46\xae\x72\x5b\xd2\x55\x35\xc7\xf2\xd4\x0b\x29\xb8\x2b\xba\xfc\x16\x21\x8a\x5b\xf9\x97\xbc\x92\xff\xcb\xbc\x2b\x50\x69\x46\xd8\xe9\xab\x59\x86\x22\xba\x52\x7c\xeb\x84\x2c\x1e\x0d\xed\xea\x4c\x3e\xbf\xe3\xda\x8e\x8f\x58\xac\x84\x80\x16\x6a\x4d\xa0\x55\x8b\x04\xc4\xb8\x65\x19\x71\x20\xbc\xd1\x75\x43\xbb\x7e\x15\x37\xe2\x12\x07\x97\xb8\x2a\x02\x29\x19\xdf\x15\x50\x8c\x7c\x08\x87\x4f\x48\xd9\x07\x00\x01\x71\x61\xf8\xa0\x4d\x6c\xd6\x5c\x5c\x54\x74\xdd\xe5\xed\xf6\x43\x32\xfd\x64\xf2\x2d\xbd\xa5\x79\xe0\x99\xe2\xba\x74\x99\xf6\xc4\x3e\x3d\x8a\xef\xa2\xc9\x4f\x1e\x3d\x23\x72\xee\xfa\x9f\x77\x06\x0f\x2e\x51\x6a\x6b\xa1\x1b\x67\xf9\x0b\xdc\x25\x41\x89\x38\x31\x3a\xae\x95\xf1\x78\x10\x78\xb1\x2d\x97\x3d\xbf\x84\xd4\xb0\x6a\x56\x05\xdd\x03\xf7\xa8\x11\x07\x70\x59\x10\x41\x38\x1c\xcd\x73\x97\xfa\x7d\xd4\x60\x62\x92\xae\xae\x5c\x3e\x9a\x81\xce\x84\x20\xcf\x0a\x0e\xb1\x98\xc5\x71\xde\x39\x0c\x2e\xf5\x51\x93\x66\x4a\x08\xa6\xa2\x5b\xb5\x2d\xc0\xc3\x32\x79\xce\x75\x22\x34\x6c\xf1\x40\xa3\x9c\xd0\xd4\x05\xed\xf6\x2c\xbb\x30\x6b\x83\x97\x6f\xbd\xd0\x59\x55\x4d\xf3\x86\xa6\x15\x76\x1b\x7b\x42\x64\x47\x4b\xff\x07\x9a\x70\x23\xf6\x35\x9d\x3a\x48\xfc\x03\x3d\xe8\xf2\x22\x40\xf1\xdd\xb8\xb6\x26\xea\x8e\x36\x56\xe7\x29\xcf\x9f\xdb\xbe\x66\x4f\x5f\x64\x1f\x5c\x33\xd0\x27\xe0\xd1\x41\xeb\x97\x4b\xdd\xb2\x70\x20\x09\x95\x31\x38\x14\x5c\xb8\x9e\x90\x36\x23\xa0\x18\xb6\xa7\x1a\x4f\x43\xd1\xa1\x2e\xe8\x56\x9b\xbe\xd2\x53\x49\x48\x0a\x9c\x1f\x3d\xa5\xb4\x2e\x25\x5f\x00\xea\x42\x7c\xd0\xcb\x46\xb8\x06\x03\x3b\x26\x56\xf6\xeb\x3d\xc3\xab\xf2\xb3\x69\x0d\x37\x2b\xc2\x16\xb5\x90\x6b\x4c\xcb\xc9\xf5\xd3\x26\xca\x08\x1d\xb1\x54\x63\x40\x47\xf1\xb5\x8e\x40\x62\x26\x2c\x06\xb1\xd5\x2a\x9d\x58\x5c\x96\xe6\xed\xfc\xf1\xbb\x72\xc3\x64\x18\xbd\x6c\x75\x7c\xc1\xd1\x33\xbd\x20\x25\xce\x92\x17\x0b\x46\xc5\x4e\x76\xa2\x53\x3d\xa7\x7d\xd1\xdb\xa5\x80\x6c\xf4\xe2\x42\x36\x60\xc2\xf6\x30\x75\xe0\xbb\x9c\xe5\xa7\xf4\xe7\x65\x69\x4b\xd9\xc4\xa2\x6e\xea\x2b\xc2\xe3\x4a\x34\xb6\x7c\x39\xb9\x09\x3f\x8f\xae\x19\xf3\x05\x0e\x2b\xdc\x4f\x17\x3f\x53\xae\x59\xb9\x58\xe1\xa8\x84\x10\x25\x40\x54\x2a\x74\x69\x08\x3d\x33\xfa\xfb\x18\xb5\x99\xa7\x24\x4e\x71\xc5\xb0\x7b\xf4\xe4\x51\x3e\xcf\x3f\x27\x64\xd6\x16\x2c\x57\x02\x3e\xa5\x29\x0a\x0b\x18\x68\x9f\xa3\x22\xe1\xda\xdd\xdc\x26\xf1\xe4\xe4\xf8\xda\xe0\x80\x28\x65\x40\xff\x26\x3c\x99\xe2\xf9\xf0\xd5\x0b\x53\x94\xe5\x0a\x55\xa5\x9b\x58\x2e\xa3\x44\x46\x3a\x15\xe5\xd0\x17\x1b\xa2\xd6\x1c\x9b\xae\xc4\x5b\x46\x60\xde\x2d\x36\x65\xb7\xb8\xc0\x43\xc5\xa4\x38\x8a\x94\xd9\xa0\xa5\x09\x24\xdf\xa2\x2a\xb7\xf2\x02\xa4\xcd\xb6\x21\x6c\x9b\x7f\x91\xdf\xbe\x54\xbe\xec\x37\x78\x77\x80\x5f\xca\x0a\x77\x41\x05\x13\x2a\xed\xca\xf7\x44\xc3\x30\x3a\x01\x64\xb4\xa6\x5e\xf3\x39\x1a\x30\x5f\x60\xd4\x1d\x5b\x34\xcb\x3d\x87\x19\x61\x4a\xc1\x4d\xae\xab\x65\x59\xf3\xd5\x6e\x00\xe1\x25\x4b\x66\xe8\xac\x84\x23\x77\xcf\xf9\x6d\xba\xb5\x8e\x83\x22\xfe\x49\x81\x69\xc8\x5e\x8f\x98\xa8\xb2\x5e\x35\xc4\xed\xad\x88\xc0\xe5\x95\xb9\x2e\x02\x21\xaf\xc4\xd4\x25\x13\x51\x81\x34\xf6\x42\xa8\x5c\x9b\x18\xe9\xc0\x13\xdc\xd8\x1b\x02\xb2\xd5\x76\x48\x73\x1f\x05\xf1\x07\x91\xf3\x74\x93\x08\xce\xb1\xf3\xd8\x9e\xea\x70\x55\xc2\x76\x3d\x51\x2b\x34\x88\xcd\xef\x7d\x45\xff\xcd\x2c\xdd\x0e\x21\x18\x36\xfe\x14\x8b\xc0\x21\x18\x7f\x96\xa8\xd1\x0b\x40\x8f\x8e\xd2\x2d\x38\xb9\x83\x9f\x04\xe9\x7e\xe1\x7e\xeb\x04\xda\x6c\xbf\xa2\xe7\xd1\xce\x1f\x96\xa6\x26\x0c\x42\x68\xe0\xb3\xfc\x19\xae\xb3\x25\xa0\xa2\xca\x5b\x6a\x6b\x88\x33\xf3\x2c\x77\x71\x45\x87\x4f\x73\xc2\x56\x00\x36\x8f\xf3\x62\x47\x5b\xf8\xfe\x9e\xc8\x82\x3a\x06\x1f\xaa\xe2\x30\x00\x8a\xc3\x61\xa7\xa4\xef\xe9\x91\x99\x66\xbc\x62\x42\x98\x3a\xb5\xc3\x73\xcb\x7e\x80\x24\xf9\x55\xd6\x0b\x1b\xd8\x54\x6b\x90\xfc\xc3\x0b\x8c\x97\xda\xa4\x82\x50\x57\x37\xb9\xcb\xf6\x6d\x49\x27\xbf\xf0\xf2\xe8\x05\x93\xec\xef\xba\xf9\xc3\xc2\xae\x20\x48\xf3\x64\xfc\xbb\x8e\x81\xa9\x1b\xc8\xab\x77\x57\x0c\x82\x76\xfe\x34\x66\x1a\xed\xb6\x79\xcb\xd2\x5e\xfd\xf8\xc0\xa1\x7c\x88\x79\x19\xae\xb5\x26\xc4\xc4\xab\xa6\xa2\x7b\xd9\xe0\xdc\x2f\x5d\x83\x47\x8e\x9b\x8b\x3e\x12\xb9\x4e\xa3\x11\x33\x2b\x83\xa5\x02\x4d\xfa\x22\x12\x54\xf9\x28\xe2\x53\x9b\xf1\x43\xc2\xa2\xf7\x97\xc0\xf5\x04\x8c\x2a\x38\x9c\x11\x10\xb1\x4c\x52\xc7\x83\x7c\xe0\xb2\x89\x96\x90\xfd\xa0\xa2\xf8\x57\x59\x3a\x25\x16\x5d\xd9\x98\x8b\xa5\xf5\x9a\x82\x48\x93\xf9\x73\x47\xa3\x40\xfe\x48\xc8\x7b\xfb\x2a\x12\x8c\x2f\x54\xb0\xaa\x02\x72\x3c\x0c\xb5\x0a\x75\x55\xa4\xea\x89\xeb\xad\xd9\x83\x26\xdf\xd9\x0d\x46\x7d\x4d\x38\xc4\xbf\x44\x74\x1d\x7e\x9b\xab\x68\xdc\x41\xde\x67\x99\x6d\x56\x65\x51\x2d\x3e\xb9\x83\x07\x16\x2d\xa8\x7d\x05\x29\x61\x4a\xbe\x88\xcc\x9e\x26\xc4\xb4\x4b\x43\x98\xee\x98\xdf\xc7\xf4\x31\xa4\xfd\x27\xb8\xbd\xfe\x00\xf9\xbc\xe7\x5a\xe9\xdf\x08\x4d\x02\x6c\xa8\x98\xe9\x80\xc1\x8d\x04\xf1\x4e\x48\x75\x48\x76\x61\xca\x78\x2a\xa2\x81\x07\x6c\x45\xe0\x10\xf8\xb2\x0c\xe7\x54\x8c\x67\x64\x40\xa2\xec\xcc\x6e\x89\xce\x0d\x91\x13\xa0\x07\x2f\x59\x04\xc5\xb2\xd4\x32\x23\x9a\x6c\xc3\xd7\x72\x8a\x03\x6a\xe4\x75\xe0\x4a\xe6\x23\x95\x7e\xfe\xeb\x6f\x9d\xf2\x85\xb0\xea\x5b\x42\x4e\x4a\x4f\x30\x52\xfa\x6d\xee\x85\x35\x72\x6c\x10\x42\x74\xcc\x2c\xce\xb2\x78\x91\xbc\x07\x84\xe1\xea\xce\x1d\xc4\xf7\x01\x54\xdc\x1b\x9a\xec\x0a\x9d\xaf\xac\x9b\x10\x59\x73\x45\xff\x52\xc1\x97\xcb\xaf\x6e\xdb\x2f\xef\x2f\xbf\x8a\x4e\x84\xb6\xa3\x15\xd1\xb1\x08\x24\x96\xcd\xf5\xbf\x76\x8c\x7e\x09\x2c\x56\x66\x2f\x9c\x1b\xae\x02\x01\x27\xed\x21\x11\xaa\xf8\x78\x7b\x2d\xb8\x50\x45\xe4\x58\x0f\x1d\x4e\xe7\xbb\x19\x91\x49\x4c\x85\xca\xf5\x72\x40\xef\x28\x79\x69\xa1\x00\x4f\xcb\xdb\x96\x4b\x7a\xdb\x09\xd7\xc5\x8a\xad\x1c\x1b\xd3\x82\xe5\x1c\x54\x71\x34\x57\xe8\x43\x31\xa4\x54\xc7\x64\xad\x71\xd4\x21\xe4\xef\x0e\x06\x89\x34\xf9\x8f\x7f\xfc\x2f\x87\xa0\x90\x96\x86\xdd\xae\xca\x5d\xd9\x8d\x81\x1f\x68\x01\x82\x78\xc6\x4f\xcc\xc4\x60\x2d\xb2\xf3\xc2\x39\xb5\xcd\x3e\xbf\xa0\x2d\xa4\x97\xa2\x06\x59\x1e\x76\x1c\x57\xdd\x5a\x7a\x38\x5a\xd9\xd7\xdf\x10\x66\xaa\x7b\x26\xdd\xb7\x85\x5d\xf4\xb5\x9e\x23\xf1\x3f\x0c\xf9\x0f\x9b\xfa\x35\xf6\xf8\xb6\x3d\xd6\xad\x72\x74\x83\x42\xfd\x1d\x7f\xae\x77\x41\x76\xf2\x63\x2c\x67\xaf\x3d\x01\xe2\x73\xa7\x9f\x50\xc2\xb4\x35\xd7\xff\xad\x27\x6a\x72\x45\xc7\x3a\x09\x40\xf4\x5a\xd0\xad\xd8\x16\x65\xc7\xb5\x19\xd8\x2a\x95\xa3\x12\x91\x4c\xfb\x58\x81\x08\x7d\x2f\x6c\x13\x00\x87\x28\x53\xa2\x90\xca\x7b\x6b\xe6\x78\xad\xee\xa1\xae\xe2\x44\x6b\x97\x4e\x92\xde\x32\x60\x0a\xd2\x9b\x9a\x80\xca\x61\x98\x4c\x63\xd4\x04\x45\xd9\x49\x42\x37\xe9\xfa\x85\x04\x91\x4a\x20\xda\x08\xd2\x65\x5d\x02\x0e\xb3\x8c\x67\x81\xc9\x74\x07\xe6\x72\xa7\xbd\xeb\x66\x03\x72\x55\x67\x43\x07\x45\xa0\xd1\x95\x45\xe5\x04\xa5\x04\x1d\xbb\x54\x75\x68\x63\x04\xf0\x3c\x6a\xe0\x95\x0d\xa1\xb6\x7b\xf5\x57\x10\x3e\xc4\xb0\x24\xa0\x2b\x44\x4f\x72\x06\xc9\x53\x4f\x07\x52\xe4\xf4\x00\x95\x2d\xc4\x7e\xe9\xd0\x5e\x1c\x37\xda\xe5\x74\x4a\x32\x56\x32\x2b\xdf\x45\xd7\x34\x0b\x7a\xa4\xdb\x6e\x2c\xda\x86\x74\xc9\x4b\xe9\xff\xf7\x44\x46\x8f\xdb\xb3\xeb\x77\x10\xd0\xd7\x0b\x96\x64\xf8\xfb\x7d\x1a\xb8\x52\xc2\x55\x22\xe7\x20\xda\x49\xe4\xe1\xcc\x9f\x01\x52\x89\x66\xae\x99\x66\xc6\xf5\x4b\x86\xbd\x2c\x0b\x15\xd6\x66\x3f\xe0\x4c\x5e\x65\x7a\xcb\x8c\x1f\xc2\x5f\xaa\x62\x0a\x97\xf8\xea\xc2\x6d\x1c\xc4\x79\x29\x3c\x7d\xe4\x54\x27\xb6\xd0\xbf\x54\x8e\x7c\x8c\xd4\xec\x38\x81\xde\xda\xd2\x1c\x13\x2b\xa0\x44\x65\x68\xa0\xc2\xaf\x40\x6e\x12\xec\x32\x0d\x45\x2b\x6e\xd6\x05\x2d\xf9\xca\xd8\xf9\x77\x7d\x49\xdb\x4b\x14\x5d\x9d\xb1\xa2\xef\x0a\x6a\x27\x5e\x00\xd5\x83\xf8\xe0\x55\xf6\x3d\x4d\xed\xd9\x34\xdf\xf6\x9c\x48\x95\xf0\x29\x28\xa0\x1f\xf3\xa6\x3c\x48\xd7\x7e\x36\xc9\xde\x3d\x37\xa9\x86\x7c\x04\xda\xe7\xe7\xdf\xbe\x60\x36\xf3\x99\xd7\xf9\xac\x08\xb8\x59\x2a\xfe\x6d\xd7\xed\xed\xf7\x2a\x4f\x66\x51\x30\x8d\x72\x55\x35\xc5\xfa\x7b\x2f\x64\xb6\x81\xab\xc1\xd4\x89\xfd\x7f\x61\x8a\xdd\xb3\x44\xe7\x01\x5c\x5a\xee\x4d\xf6\x80\x88\xa8\x68\xa9\x60\x88\x5b\xa7\xe7\x66\xbd\xf5\xe3\x8f\xf1\x96\xd9\x33\xf3\xf6\x61\x5b\xd4\x2b\xd7\x8f\xbc\xa3\x91\xbe\x8a\x3f\x9a\xec\x84\xa8\xfe\xb2\x3b\xef\x89\xa1\x6c\xaf\x00\x08\x16\x72\x74\xe5\x2a\xe8\x8b\x56\x78\x2a\xb2\xe0\xb9\xfe\xab\x0f\x7c\xf8\x7e\x42\xfc\xc1\x8a\xb6\x8f\xfe\x79\x17\x7d\x7c\xd1\x1a\xc3\x13\x38\x19\x6a\x06\xa9\x1d\x2e\x5b\x37\x97\x7f\xfb\xcc\x4b\x43\x0c\x5b\x04\xfc\xe8\x95\x4a\x8c\xeb\x83\x62\xe9\xc7\xac\xa8\xf6\xdb\x82\x89\x77\x5f\x97\xae\x2f\xdf\x36\xa9\xb7\x1e\x28\xd9\xb8\xc1\x71\x5e\xb3\x86\x00\xd8\x83\x45\x7a\x1d\x0d\x46\xc4\xd3\x9d\x7b\x8b\xbb\xb9\x72\x4a\x69\xe7\x6b\xc2\xcb\x7f\xeb\x00\xc7\x53\xdd\x63\xd4\x35\xd3\x13\xf4\x74\x63\x30\x5b\xbe\x37\xf1\x10\xae\x7f\x51\xf3\x74\x05\xee\x32\x93\x22\xa8\xcc\x0c\x60\xdc\xe0\xb6\x9d\x42\x53\x39\xd5\x2c\xde\xdd\x5c\xb3\x78\xa7\x35\xe5\x01\x72\xd5\x06\x8f\x8e\x47\xcb\x3f\x66\x50\x87\xb8\x5a\x00\xe7\xe8\x13\xb1\xe8\x55\xbf\xf6\x63\xa5\x88\x94\x56\x81\x77\xf2\x1e\x61\xc0\xeb\x7f\xa5\x03\x3d\xba\x6d\x8f\x68\x29\x7d\xfd\x86\x28\xc5\x5a\xdb\x3c\x26\x0e\x9f\xf9\x55\x50\x30\x84\x20\xbe\x70\xd6\x29\x0b\xcf\xfe\x03\x5f\x3b\x39\x5d\x0d\xe8\xa2\x52\xbb\x6f\x44\x6a\x31\x0b\x08\x3e\xe2\xea\x07\x08\x1e\xd2\xe1\xb1\xb0\x3e\xa9\x92\x74\xac\xb8\x7b\x16\x4c\x6f\x16\x4b\x63\xea\x45\x57\xbc\x31\xf5\x04\xe7\xb9\x16\x86\x03\xf6\x4f\x33\xd1\x1e\x4e\xb6\xf1\x3c\xa0\x6b\xe0\x14\x66\x33\x98\xdb\x4c\xb7\x39\x4a\x34\x99\xc9\x40\x1d\xa1\x90\x03\x8d\x14\x97\xa4\xf5\xe5\xbc\xb9\x2e\x2d\x6b\x3d\x40\x8d\xc3\x39\x99\x59\x58\xbc\xdf\xe2\x70\x26\x93\xec\x77\xb2\xa3\xbe\x2e\x44\xb6\xf4\x18\xb4\x6c\xe6\x14\x89\x70\x58\x0e\x37\xf1\x68\x89\x74\x92\xd1\x95\xc8\x60\x22\x81\x8e\x15\x08\x3b\xd4\x2f\xc1\x15\x5e\x9d\x8f\x77\x4c\x5d\x12\xd1\x4b\xfb\x42\x84\x24\xcb\xaf\x64\xa4\x8f\x74\xef\xdf\xcc\xc3\x9d\x27\x5b\x30\xd5\xa9\x17\x40\x11\xd9\x6f\x3b\x50\x7c\x89\x5d\x18\x11\x7b\x28\x37\x02\x7f\x55\x61\x3b\xb0\xff\xb2\xb0\x81\xb4\x0a\x2c\xee\x3b\xba\x7f\xad\x70\x04\x8c\x2d\xda\x1a\x73\x01\xef\xd7\x9a\xe4\x59\x49\x97\x3b\xcb\x9f\x54\x82\x73\xae\x54\xc7\x4c\xe4\x24\x2b\x93\x06\xf5\x32\x4f\xd5\x41\xf9\xfb\xc6\x5c\x45\x84\x5d\xb9\xdb\x37\xf4\xf2\x2f\x05\x4d\x09\x4e\xf0\x14\x8a\xbe\x8e\x2c\x13\x83\xe0\x06\x1c\x2f\x11\x30\xf4\xb8\xfb\x9e\xd8\x32\x87\x09\xfa\x3e\xda\x47\x27\x9f\x2f\x99\xa9\x35\x83\xfe\x9c\x3e\x0a\x92\x39\x50\xfb\xc4\x1c\x77\xac\x8d\xc5\x79\x12\xc4\x61\xa5\x7f\xec\x8f\x58\x0e\x59\x89\x89\xd0\x2c\x87\x12\xf7\x1e\x75\x48\xb4\xa8\x3f\x37\x16\x5f\xd5\xa0\xaa\x69\xff\x5a\x62\xe0\xe8\xd5\x75\x92\xba\xeb\xbf\xd0\xe3\xb8\x92\xb7\x77\x9b\x08\xf3\x79\x35\x99\xa5\x43\xa8\x70\x24\x62\xf9\x36\xe2\xcd\xba\xa6\x07\x47\x63\x07\x20\x46\xd7\x85\xd9\x0e\x08\x84\x4a\x96\xd0\x7b\x91\x50\xce\x32\xf5\xb5\x01\xe7\x42\xc3\x82\x44\x12\x7d\x56\xbf\xa7\x0e\x76\x86\x6f\x17\x0a\xe8\x89\xaf\xed\x05\x9b\xb8\xcd\x74\x1e\x60\xaa\x60\xf8\x96\x4c\x83\x56\x12\xcf\x83\x76\xa9\x94\x09\x98\x74\x06\x89\x44\xe9\xe0\x34\x60\x51\xd5\x85\x49\xf8\x59\x09\xde\x1a\x6c\x87\xf0\x30\x09\xda\xfa\x5f\xb9\x29\x99\xd8\x9a\x2d\x84\xc6\x89\x6e\xda\xa9\xa7\x7b\x88\x89\x03\xd0\xa6\x57\x2d\xfb\x01\x37\xf3\x55\x26\xf4\xba\xaa\xe6\x88\x74\x11\xea\x5d\x09\x69\x51\x4c\xbe\xa6\x27\x7c\xd1\xd4\x4a\x06\xe3\xe6\x05\x0b\x4a\x98\xf3\x79\xb1\x99\x9a\xf8\x5d\x05\x03\x3f\x11\xbd\xc3\xaa\xf3\xa2\xa9\xaa\xe6\x2d\xc4\x6a\xb4\x32\xd0\x86\x96\xce\x13\xd6\x4d\x6b\x9c\x24\xeb\x09\xb9\x06\x44\xbe\x0f\x50\x43\xe4\x3d\x5a\x3a\x3f\xef\xcb\xcb\xd6\xd0\xcd\xd2\xdf\xcf\x8c\x08\x1a\xad\x94\x43\x78\xb3\x9b\x31\xf2\x06\xb9\xdf\x5e\x8a\x1a\x01\xa8\x0f\xcf\x30\x9f\x08\x51\xee\xf8\x82\xe7\x27\xd4\xde\xc3\x02\xaf\xad\x85\x2f\xe5\x19\x32\xad\x5c\x5e\x48\x3b\x2f\x76\x10\x85\x19\x73\x3e\x3b\x9b\xbe\x04\xd8\x4b\x67\xf6\xf8\x2a\x73\xa6\x91\x62\x03\x3b\xb2\x79\x3b\x13\xa5\x89\xec\xf6\x03\xd9\x5f\x45\x10\x96\xd8\x3d\xa8\x65\xd9\xf4\x84\xa5\x7d\x4c\xa2\x1a\x30\x59\xe7\xf8\xdd\xbf\xcb\x22\xd3\x0d\x3b\x7f\x10\xfd\xc8\x58\x68\xfa\x5d\x22\x30\x5d\x13\x83\x0f\xe3\x5f\x0f\x3f\x95\x67\xa5\xfa\x72\x3d\x7f\xf2\x08\x46\x1d\x11\x67\x91\xf1\x61\xad\x16\xe9\x12\xe4\x08\x57\x6e\x61\xb1\x7c\x66\x40\x43\xb1\xe6\x40\xcf\x1b\x34\x08\xed\x76\x11\xde\xd7\x78\x0b\x03\x8a\x81\xf2\xb8\x52\xb1\x8b\x17\x93\x1e\xe7\x45\x59\x5b\x31\x7c\xe4\x56\x1d\xf4\xef\x79\xb3\x87\x21\x15\xdf\xb0\x3f\x98\x65\x6e\xd8\x4c\x05\x6a\x77\x66\x2d\x81\xfe\x58\xd4\xe3\x5f\x6f\xff\x9e\xab\x08\x72\xcd\x2c\x6c\xa2\xed\x26\x3e\xf6\x9e\xe3\x63\x8f\x1a\x65\x61\x81\xe0\xdb\xa6\x4c\x2d\x31\x99\x9f\xad\x87\x54\x00\x81\x12\x0c\x58\xbd\x8a\x8d\x05\x67\xa6\x4b\x0d\xaf\x69\xb2\x19\x06\x61\x85\xf3\x29\x78\x6a\xc7\xdf\xf4\xfb\x35\xf8\x59\x6f\x4e\xab\x6f\x0a\x36\x49\x06\x76\xa7\x9b\x56\xf4\x8c\xa9\x9e\xd0\xae\x64\x8d\x21\x8b\x95\xd8\x02\x12\xdf\xaf\x7f\xa2\x5b\xae\xb7\x3b\xb2\xa8\xae\x07\x64\x8c\x8c\x73\xfd\x61\x58\xd5\x09\xc9\x04\xbd\xc5\xb3\x71\xf6\x41\x74\xb8\xf4\x78\xed\x08\xe0\xd8\x92\x76\xdd\xd4\x62\x94\x50\x11\xf7\x0b\xe3\x88\xbc\x25\x68\x6d\xda\x8e\x59\x89\xbf\x26\xac\x3c\x4b\x43\xe9\xc2\xf4\xcc\x84\xf2\x1f\xed\xc8\xbc\x57\xcd\x04\xd4\x68\x60\x79\x25\xc2\x1e\x2f\x80\xf7\xb6\x01\x22\x31\x66\x76\xf7\x90\xb1\xc2\xb8\x51\x64\x9f\xe0\xd4\xe7\xbd\xed\x9a\x9d\x43\x84\xde\x2c\xc1\x0f\x12\x9b\x58\xd0\x66\x35\x8d\x55\x99\xbf\x34\x38\xbf\xfe\x50\x19\x31\xe5\x8a\x24\xff\x95\xc3\xa1\x7a\x80\x5a\xf9\x29\x6d\xaa\xb0\x3e\xaf\x55\x11\xaf\x26\x20\x7c\x63\x69\x2a\x84\x17\xeb\xce\x77\x1d\x2e\xb0\x9b\x8d\x68\xe0\xa8\x57\xf0\xdd\x61\xb9\x8c\xc5\x16\xe5\x8e\xcd\xf6\x8d\x37\x4c\x4d\xec\x3e\x22\x15\x1f\x9e\x47\xae\x3c\x4b\xe7\xe7\xe1\xeb\x65\xf4\x0c\x78\xc9\xfb\x61\x68\x73\x30\x14\x21\x3d\x7f\x7b\x52\x01\x43\x53\xad\x0f\x08\xda\x75\x65\xd8\x59\x5f\xc1\x5b\xcc\xa7\x52\x1a\x08\x31\x16\x49\xc5\xe7\xa6\x2b\xf6\x22\xcf\xa8\xa7\xda\x4c\x10\xf6\x13\x83\xc7\xa4\xfc\x60\x45\x7e\x67\x92\x66\xee\x0e\xa5\xdb\x21\xef\xb9\x9a\xaf\x32\x57\x02\x6c\xce\x36\x09\xbd\x0d\x12\x6c\x6f\xb3\x3c\x35\xe3\x08\x9b\xe9\x4c\xfe\x6e\xb8\x2c\x1d\x46\xb8\x25\xeb\x98\x24\xeb\x04\x48\xea\x69\xa0\x5f\x23\x67\x83\x62\x50\x51\xb8\xad\xc3\x8f\x83\x92\xab\x85\x98\xee\x7c\xc2\xbb\x00\x93\xaf\x23\x35\xf8\x0a\x98\x1f\x0c\x30\xdd\x05\xc8\x6f\xce\x7c\x8f\xae\x48\x05\x83\x44\x8f\x5c\x94\xe0\xc8\x21\x98\x31\xd1\xc8\xee\x7e\x49\x35\x7f\xad\xfc\xdc\xe9\x23\x50\x34\x7f\xa0\xb9\x7b\x23\xb7\x81\x40\x31\xad\x2e\x6b\x0e\x77\x74\x35\x25\xd3\xf6\x34\x5c\xc1\x2b\x2d\x6b\xb1\xec\xe3\x85\x7a\x49\xb7\x1d\xa1\x49\x80\x50\xe5\x94\x49\x0e\x65\xb6\xf9\x6f\x87\x53\x70\x50\x79\x3a\x98\xaa\xbf\xb3\x3a\x3e\xb6\x3b\x86\xd1\xfc\xb3\xac\x58\xaf\xf9\x0e\xc9\x9e\x3c\x78\xcd\x56\xa3\x8c\x19\x6a\xe7\x7a\x32\x58\x3e\x5a\x0c\x6b\x8f\xbe\x2d\x12\x75\x17\xc0\x7e\xfe\x7d\xdc\x67\x2a\x9c\x38\x34\xed\x48\xd9\x05\x72\x2c\x66\x68\xfe\x2e\x7a\x2e\x9a\xfc\xae\xac\x05\x3f\xc1\x33\x83\xe6\xd0\xdb\xa1\xd8\x7e\x16\xad\x2a\x45\x8c\x07\x76\xc8\x4f\xbf\xc0\xfe\x0c\xf7\x9c\xee\x9a\x5e\x2a\x4f\xf7\x45\xd7\x6a\xe5\x49\x40\x0c\x0a\xb6\x31\x3e\x12\x10\x88\x4c\x2e\x32\xcc\x9d\x98\x55\xc9\x44\x17\x3e\x55\x4c\xda\xaf\xe3\x2e\x6e\x84\x2c\x07\xb0\xef\x09\x60\x2b\x61\x7a\xd4\x06\x82\x3a\x23\xdc\x87\xb7\x0e\xb6\xcb\xef\x85\x5d\xc0\xa0\xaa\x94\xf8\xd2\x76\x6d\x53\x6f\xbe\x7a\xa8\x76\x50\x47\x05\x11\x2d\xbf\xfd\xf2\xbe\x16\x43\x75\x6d\xfb\x0a\x6a\xa6\x9a\x47\xdc\xf4\xde\xf8\xf9\xcb\x22\x72\x85\x71\xa6\xf1\xce\xe0\xcd\x4d\x9b\x1d\x63\x88\xd5\x01\xba\x6c\xfa\x75\x2b\xb6\x5b\x69\x53\x3a\xac\x65\x05\xab\x72\xcb\xc6\xb3\x6c\x96\xce\x9e\x1b\xdc\x7a\xe6\xa1\x7a\x6a\x03\xbd\x6d\x37\x7d\x8c\xc4\x43\xa7\x91\x31\x73\x90\x78\x7b\x7a\xd6\x9d\x69\x24\x2f\x72\x7d\x30\xb9\xc4\x7d\x7c\x5f\x0f\x5b\x29\x6e\x17\x2e\x1e\xe4\xa3\xf2\x60\x22\x7d\x9a\x65\xae\x7d\x24\x69\xe7\x43\x46\xf9\x6a\x20\x35\x56\x88\x08\xb7\xbd\x88\xee\x93\x13\x40\x30\xdb\x72\x23\x00\xc2\x1c\x40\xf0\x20\x76\x27\x60\x41\xb7\x9c\x83\x78\x30\x52\x02\x0c\xeb\x4e\x23\x41\x3f\xa9\x08\xfd\x05\xcb\x54\x6f\xe9\xf6\x69\x28\x6f\x34\xa4\xdb\x86\x93\xc1\x28\x07\x90\x1c\x2d\xe8\x81\x6c\x47\xce\xde\x8d\xb6\x93\x33\x7b\x04\x21\x12\x53\xb0\xee\x35\xc5\x7a\xa9\x0a\x5c\x54\x3c\x43\x0b\x05\xa4\xc9\x0b\xcf\xd7\x32\x96\xa1\x63\xe1\x83\x22\x46\xb6\x33\xee\x4e\xfa\x85\x8f\x20\x26\x5f\x33\xa4\xf2\xea\xff\x0f\x27\xbc\xb2\x4c\x48\xd9\xac\x6b\xde\x10\x24\x26\x3d\xe5\xaf\x4d\xa7\x66\x52\x71\x3f\x37\x76\xe3\x71\x8b\x30\x90\x11\x66\x69\x1d\x2f\x69\x85\x97\xf4\xd8\xc1\x3a\xdb\x92\x14\xa9\xd0\x71\x47\x38\x45\xf5\x7e\x82\x5f\x0f\xf4\x93\x22\x95\xd8\xac\x6a\x12\xa5\xf4\xf5\xb2\xac\x69\xff\x4b\xb1\x54\x69\xb5\x20\x9c\xab\x88\x76\xc2\x90\x32\x62\x05\x83\x6b\x19\x31\xa0\xd2\x82\x9b\x2c\x78\x13\xe3\x45\xf3\x0e\x8a\x42\x9f\x41\xc1\xd9\x97\x56\x56\x5d\x76\xd4\x70\xc7\x37\xac\x5d\x5b\x4f\x8e\x71\x17\x72\x3c\x56\xb6\xe8\x77\xdc\xe9\x71\x64\x35\x06\x0a\x4f\xb1\x19\x24\x85\x7f\xec\x4b\xaf\x13\x15\x25\x87\x3b\x3b\x7d\x77\x30\x9b\x0f\xe0\xf4\xd8\xce\xf3\xc1\xd9\x13\x55\x8c\xfa\xa9\xe8\x59\x6c\x0b\x8c\xc1\xe3\xb1\x46\x8d\x09\xa7\xda\x5d\x1d\x65\x36\xc7\xcc\x95\x74\x51\x47\x4a\x42\x59\x84\x5f\xf2\xc4\x72\xa7\x6a\xc8\x51\x18\xeb\x09\x70\x01\x48\xbf\x9b\x0e\x32\xfd\xd2\x07\xf7\x0e\x46\x48\xf4\xd8\xea\x65\xe6\x67\x75\x1f\x9e\xec\x7a\xba\x53\x7f\x44\xb1\xf5\x4c\xee\xbc\xc1\x88\x76\x54\x33\x5c\x53\xc3\x69\xa3\x57\xb9\x2f\x00\x8c\x05\xbb\x1e\xb9\xc9\x1a\x03\x7a\x8b\x41\xe4\x00\x8e\x1b\xce\x65\xba\xcd\x18\xd7\x0d\x97\x70\x03\xba\x1b\x3a\xe0\x1c\xc6\x77\xf1\x32\x02\xca\x1f\x8e\x35\x22\xf0\x86\x47\xf0\xec\x88\x4d\x97\x9c\x07\x1d\x3c\x5d\x12\xde\x13\xa6\x2f\xb1\x54\x89\xee\x94\x8e\xec\x94\xf2\x61\xa5\x89\x36\x5e\x6b\xa9\x98\x20\x91\xc6\x32\x81\xbf\x16\x2a\xdc\x3b\xb7\x86\x19\x12\xc8\xca\xfb\x10\x09\x74\x80\x71\x1c\x61\x51\xb6\x04\x4a\x6c\x70\x4b\x8c\x4e\xa0\x2b\x3e\xf3\x66\xc9\x83\x09\x3a\x3d\xb6\xa8\xe0\xc2\x81\x0e\x16\xa2\x96\xd3\x83\x57\x2d\x5d\x8d\xab\xea\x30\x70\xbc\xa0\xb0\x80\xc1\xd2\x0e\x9f\x61\xf6\x03\x04\xa5\xaf\x32\x51\x67\x9c\xc5\x92\xe0\xa0\x37\x1b\x2a\xf2\x83\x42\xcd\x79\x00\xd2\x17\xe2\x5e\x30\xd4\xb1\x57\xe8\x1c\x09\x5d\xbb\x67\x2e\xee\xb2\x2d\xbc\x3e\x15\xf4\x50\x07\xbd\xc1\x87\x5d\xd3\x82\x55\xc4\x7e\xbb\xad\xed\x6b\x90\x25\x7e\x4f\x67\x19\xcc\xe7\x97\x84\x9b\xe8\x8d\x7b\xe9\xfe\x24\xf2\x83\x8b\x51\x1a\x1c\xc3\xbc\x4e\x4a\x8e\x6a\x5f\x80\xd6\x21\xdc\x3f\xbf\x45\xd8\xae\x35\xeb\x1c\x06\xa4\x4c\x9a\xc1\x26\x8f\x86\xa0\x1a\x5f\x8d\x3a\x82\xab\xfb\x0a\xd4\xd6\x01\x7b\xc1\x1c\x2e\x71\x2d\x61\xc7\x70\x73\x14\x4f\xbc\x0b\xfe\x7f\x30\x86\xe3\xb5\x1e\x9e\x86\xcc\xc2\x8e\xa7\x01\xef\x7a\xb7\xa8\x3b\x6c\xd2\xc2\x7c\xb5\x73\x7d\x10\xc0\xbc\x2c\x98\x45\x76\x82\x2e\xb6\x00\x73\xd3\x41\x07\xf6\x6e\xb6\xaa\x9a\xda\x9f\x50\x42\x0a\xab\x9f\x5f\xbf\x67\x12\x90\xc0\x20\x7f\xc9\x3e\x0a\xef\x6f\xf6\x0c\xaf\xb8\x31\x13\xbf\x9f\x65\x3c\x4b\x51\x2f\x78\x53\x52\x94\xc5\x70\xc2\x75\xd8\x25\xed\x6b\xfe\x62\xa4\x64\x74\x74\x44\x26\x5e\x86\xa3\x15\xc8\xe1\xbe\xc6\x46\x07\x4e\x90\x61\x54\xad\xcb\xd7\xe0\x91\x89\x83\x4c\x50\x29\x22\x43\xb8\xa8\x10\x5c\xb0\xa1\xab\xb0\xa9\x61\x0b\xec\xa0\x85\x2d\xa8\xad\xba\x38\xef\x24\xa2\x04\xb6\xd7\x49\xa4\x66\xbe\x49\x46\x98\x87\x5e\x56\x33\x3f\xc5\xbf\x2b\xff\xdb\xfb\xe1\x0f\xe5\x6a\x91\xb7\x75\xa5\x4d\x5a\x43\xc0\x64\xe6\x5f\xeb\x97\xe7\xfc\x53\x4b\xa7\xfa\x19\xce\x4a\x6a\x42\x27\xd6\x2c\x70\xaf\xe7\x4f\x22\x03\xa1\x55\x80\x7c\x4f\xcd\x6b\x53\xf5\xc2\xf2\xf6\xdc\x36\x8c\x01\xb2\x4a\x0d\x83\x07\xc7\xe8\x8e\x6f\x6d\x2e\x0a\x62\x93\x54\x71\x33\x7f\xa8\xba\x9a\xc8\xf9\x4a\x43\x4f\x10\x8a\x25\xda\x73\x7e\xd6\xc3\x17\x21\x29\x4b\x5f\xa2\xf7\x2a\x26\xa7\x91\x58\x39\x54\x8b\x67\x23\x34\x24\x25\xae\x8c\xf8\xef\xae\x0c\x93\x27\x41\x19\x24\x5a\x14\xa6\x01\xbc\xba\x5e\x3c\x7d\xdd\x58\xac\x04\xa1\x2b\x41\xdb\x22\x7f\x54\x6c\x27\x2e\x06\xd8\xf9\x1d\x66\xa8\xef\xba\xca\x44\x6a\x03\xbb\x06\x47\x48\x1f\xe8\x22\xad\xa0\xa2\x22\xc7\xcf\xb3\x65\x85\xb2\x7a\x89\x74\x64\x3d\x74\x30\xaa\x41\x79\x5b\x0b\x1c\x6a\x85\xc3\xf7\x02\x9a\x99\x1b\x83\xa9\x7b\x7b\x55\xaf\x12\xfa\x1e\x05\x5b\xba\xcc\x4e\xfa\xfe\x16\xc6\x13\xd0\x48\x7d\xb7\x84\x62\xc8\x19\x7a\xe3\x8a\x16\xef\x51\x7e\xee\xff\xe4\xab\x65\xf9\xa2\x59\x55\x36\xd1\xe1\xae\xb6\x6a\x50\xda\x5c\x2c\xf8\xb0\x59\xc0\x3f\xd0\x29\x13\x46\x83\x8e\xa9\xf4\x5e\xdb\x50\x55\xb3\x55\x4a\x51\xa9\x48\xc2\x23\x36\x38\x14\x81\x90\xbe\x41\x9d\x15\x59\x55\xfc\xa7\x68\xb6\x7c\xf7\x44\x08\xd4\x06\xa2\xe5\xbe\xdb\xce\x9f\xc9\xa6\x03\x41\x83\x0f\x7a\x10\x1b\x69\x69\xd4\x93\x34\x30\x44\x88\x7c\x12\x7f\x9e\x78\x4d\xac\xd2\xb4\x09\x2a\x07\x0e\xcf\x97\x55\x6f\xe8\x3d\x11\xe8\x71\x88\xdc\xf5\xc6\x97\xea\x29\xfd\x30\x31\xe4\xba\xcf\x33\xc1\xce\x13\xb0\xc8\x1f\xa6\xab\xb9\x47\x1f\xf1\x41\x82\x83\x3f\x96\x9b\x7a\x3e\xdf\xff\xe6\xc9\x0b\xc8\x27\x42\xf0\x06\x4f\xf8\xa9\xeb\xa7\xeb\x7e\x0f\xf1\x12\x53\x1a\xd4\x37\x71\x69\x6b\xe7\x4b\x86\x78\x41\x96\xf1\xae\x9a\xbb\x89\x8c\x0b\x16\x06\x6d\xa7\xf2\x10\x0f\x14\x22\xd3\x0d\xbd\x06\x6f\x13\x58\x67\xc6\x8e\x41\x5c\xc2\xb6\x99\x62\x9d\x70\xcc\x7f\xf3\x45\x07\xc3\x48\x73\xa6\xa1\x3f\xf0\xdf\x22\xfe\x27\xa6\x02\xb6\x8c\x6d\xe8\x5c\x4d\x02\x1e\x8b\x45\x40\x74\x8e\xe2\x99\xa2\xf7\x8b\x5f\x1d\xbd\xff\xfa\xee\x10\xa4\x70\x29\xfe\x66\x4b\x86\x7d\x5f\xda\xf0\x46\x2d\xac\xa9\x2e\xa6\x62\x3a\x70\xdb\x18\x31\x06\xb6\x0a\xe6\x16\x60\x93\xde\xb3\xb4\xa4\x60\x02\x70\x7f\x45\x57\xae\x7e\x43\x34\x1f\x38\x89\x50\x10\x71\x8d\x7b\xba\x79\x51\x55\x35\xbc\x7a\xb0\xdf\xf7\x57\x6a\xde\xfc\x1f\xff\xdf\xff\x7f\xef\x04\xdb\x71\xd2\xb5\x15\xfd\xa5\x36\xef\xae\x47\x1c\x94\x74\x43\x2c\x29\x23\x89\xa1\xba\x59\x0a\xbd\x4e\x1a\x28\x03\xba\x87\x52\xa1\x91\xe8\x64\xc3\x78\x04\x64\x31\xf5\xc9\xe1\x7d\x80\x3b\x32\x08\x15\x18\xcc\x54\xa0\xb0\x8e\xde\x56\x42\xcb\xab\x37\x0b\x96\x96\x01\xd3\x7a\xf7\x63\xe8\xd1\x10\x1c\x4a\x80\xb5\xdb\x96\x56\x9f\x14\xfc\x8e\xdf\xa7\xd8\x13\x85\xdf\x65\x75\x9d\x9b\x70\x47\xf1\xb4\x1c\x01\x0d\x22\x32\x39\x33\x46\x38\xda\x65\xfb\x1e\xd6\x86\x80\x1a\x19\xe8\xbc\xe9\x95\x69\x88\x4e\xc9\x43\x15\x7b\x11\x8f\xfa\xe0\xf1\x69\xa6\x1c\x6b\x63\x48\x3d\x5e\x32\x6c\x7a\x59\x2e\x71\x6e\x6c\x40\xc7\x3b\x4c\xbb\xb6\xa6\x93\xce\xd8\xaa\xfa\x84\xfe\x93\xa5\x0f\x64\x46\xf3\x30\xb0\x10\xa0\x2b\x2b\xaf\xff\x45\x59\xc1\xf6\x56\x0d\x20\x10\x4f\xa4\x2b\x36\x44\x0c\x54\x5d\xab\x52\x3f\x67\x07\x21\x97\x96\xbe\x6a\x9f\xc4\xd9\x6a\xaf\x36\xa3\x52\x3b\x7f\x41\xff\x19\x86\x1d\x42\x84\xa2\x61\x64\xa2\xaa\x58\x1a\x2a\x7c\xcc\x7e\x9b\x84\x66\x2d\x5d\x0c\x42\xa1\xc4\x98\x51\xc3\xdf\x15\x08\x98\x90\x89\x55\x28\x8b\x31\xf0\x2f\xed\x48\x65\x0a\x6b\xd0\xd5\x32\xa8\xed\x59\x9d\xdb\x16\x6f\xe7\xcf\x8b\xb7\xf2\x83\xce\x97\x23\x53\x7d\xcb\xff\x8a\xed\x04\xca\xd9\xcf\x09\x35\x5f\x8a\x17\x6c\xee\x5b\x00\xcd\x14\x7c\x2b\x4e\x4b\x38\xae\xe3\x67\x8d\x98\x35\xfc\x15\x76\xe0\x15\xa8\x4e\x9c\x82\x23\x9e\xd8\x42\x05\x3e\x0d\x9b\xb6\x51\x99\x84\xa0\x3b\xe7\xb9\x9b\x65\x66\x0d\xfb\x8e\x19\x87\xa7\x2a\xab\x60\x56\xeb\x6c\x5a\xf5\xbb\xa8\x20\xa5\xca\x0b\xd6\x33\x82\x73\x4b\x48\x35\x57\x15\xff\x48\x45\xaf\x17\x1c\xd4\x20\xc6\x8c\x97\x29\x34\x39\x2c\x1c\x4c\x0b\xbf\x86\xf5\x48\x21\xae\x0d\x56\x45\xcd\x16\x2f\xe8\x19\x16\xeb\x78\x38\x78\x08\x3b\x7f\x92\x98\x6b\x45\xba\xaf\x88\x60\x83\xca\x8c\xfd\xde\x92\x29\xf2\x15\x4b\xe7\xb9\x32\xc3\xa9\xee\x7a\xba\x1e\x4b\xb3\xa0\x41\x0b\x47\xc3\x45\x06\x3c\xb2\x9b\x40\x36\x31\x00\x8a\xf0\x67\xef\x38\x83\x46\xac\xf2\x1a\xab\x28\x3f\x59\xa2\xf8\x95\x0e\x87\x65\x84\xba\x34\x17\x20\xb6\x51\x14\x8f\x79\x01\x2f\xf8\xed\x90\x64\x1d\x86\x94\xaa\x46\x7d\x3a\x49\x83\x5f\x76\x22\xdb\x98\x5a\xf7\x16\xee\x9e\x6f\xdb\xb2\x73\x92\xb7\x78\x1a\xc1\xc0\x4e\x1e\x45\xc3\xd1\x48\x34\x94\xc7\xdf\x61\x07\xc4\x08\x85\xa7\xec\x90\xbe\xa3\xfc\x13\xe1\xf7\xb4\x48\xe4\x33\x0f\xd8\x20\x92\xd8\x81\x49\xc1\x7b\xb7\x63\x43\x39\x9c\x9b\x0e\x09\xd7\xc5\x68\x54\xcf\x93\xcf\xcf\x78\x15\x41\xfb\xd5\x86\xc0\x25\xc7\x39\xab\xfb\xe8\x1a\x75\x2a\x98\x82\x4a\x9a\x90\x1b\x3d\x87\x20\x14\xf8\x19\x6a\x19\x32\xee\xcf\x72\xee\x28\x18\x78\x0d\xbb\x12\x27\x69\xc1\xd7\x4b\x22\x49\x40\xc0\x6c\x8b\xdd\x1e\x9c\x87\xf6\x24\x2f\x5a\x6b\x3a\x9e\x52\xdb\x32\xa9\xeb\xa7\x4d\x0f\x5f\xd3\x47\x97\x65\x65\xaa\x05\x9b\x61\xcd\x0b\x35\xb3\x70\xdf\x18\x4b\xf9\x8b\x27\x48\x6b\xc2\x10\x45\xab\x43\xa0\xde\xed\xf6\x41\x05\x48\x3b\x7f\xff\x4b\xb7\x49\x5f\x1d\x45\xf5\xe2\x2a\x47\x01\x6b\xac\x39\xd6\x60\x2a\x8b\x8a\x6b\x8c\x8c\x97\xe2\x8f\x3a\x5b\x0d\xda\xa2\x2f\x6a\xa4\xe6\x91\xd0\x30\xb5\x11\x93\xf2\xe0\xbc\xb1\x66\x9a\xbc\xaa\xc0\xe1\x86\xb3\xd5\xde\xd6\x25\x54\xfe\xd5\x15\x61\x4c\xb9\x0b\x7a\xab\xc3\xf3\x27\x35\x44\x56\x20\x66\xeb\xee\x62\xab\x7c\xc5\xd1\xaf\x52\x7c\x0f\x7b\x71\x8b\x7d\xb9\xbc\xbc\xc5\x0d\x19\x5e\x6a\x1d\xc5\xbf\xd1\xbe\xb3\xaf\xbc\x72\x47\x47\x09\xa2\x30\x21\x58\x9c\xa8\xc2\x05\x77\x40\x58\x24\xef\x84\x15\x69\x27\xf1\x82\xe5\x1a\x63\x6f\x16\xe3\x75\x67\x33\xc8\x36\x52\xd8\xc3\x83\xae\x13\xf1\x6e\xa5\x66\x3a\xc3\xfb\xa1\x18\x79\x69\xf4\xe9\x57\xbd\x96\x7b\x78\x0e\x38\x3a\xb8\x6e\xdc\x23\x5e\x81\x25\xbf\x12\x22\xc4\xc6\xa6\x8c\xc2\xf3\xc4\x3a\x34\xe1\x01\x57\x11\xdf\xe2\x20\x88\x4f\x8b\x9e\x52\xd0\x21\x85\xdc\xf2\xd3\x23\x3a\x3b\xec\xb4\x74\x24\xec\x63\x88\x9a\x06\x07\x42\x95\x42\x17\xb0\xc0\x51\xed\xaa\x9f\xbd\x52\xcd\x6d\x1c\xa7\xe8\xc0\xe8\x7e\x43\x78\x70\x3f\x97\x88\x8d\xbb\x88\x91\xd6\xe1\x25\x35\x69\x9f\x8c\xf5\x11\x9b\x82\x28\x49\xa2\x33\x36\x44\xf9\xb8\x5d\x1a\x74\xe9\xe9\x68\x45\xfd\xef\x07\x4c\xbf\x5b\xfc\xd4\xcc\x15\x11\xac\x17\x6f\xb7\xd1\x98\x89\x8e\x34\xc4\xbd\x03\x9a\x46\x75\x4f\xf6\x0f\x34\x23\x6c\x86\x51\xaf\x84\xc7\x81\x85\x36\xdc\x3e\xdb\xd9\xcd\xe2\xb0\xc8\xf5\x8d\x65\x62\x7b\x11\x56\x97\xfc\x26\x41\x82\xe1\x3d\x62\xbd\xf5\x0d\x3d\x26\xee\xea\x14\x11\xb5\x2f\xd7\x9b\xae\xc6\xaa\x51\x7e\xee\xa2\x29\xed\xe0\x32\xb5\xea\xab\x8f\xee\x63\x99\xa0\x4d\xb7\xe5\xef\x02\x98\x74\x72\x8a\x67\x81\x6a\xe0\x48\x3f\x7f\x42\x6c\x1b\x01\xdf\x15\x84\x05\xe2\xeb\x18\xa4\x92\xf0\x7f\x54\xaa\x2c\x4c\x86\x63\x5a\x35\x0b\x35\xdb\x62\xd8\x56\x33\x6e\x84\x10\xd4\xcb\xbb\x43\x7c\x5a\x45\xae\xf7\x21\x5b\xf0\x6e\x8f\x09\xa0\x88\x58\x8b\x86\x37\xec\x9c\xf2\xf3\x5f\x99\xd7\x8b\x30\xbd\xed\x97\x04\xc0\xb1\xb9\x07\x3b\xba\x44\xd7\x20\xc2\x0f\x6a\xfc\xce\x93\xf3\xa4\xa1\x1d\xcd\x4e\xdc\x4e\xcd\x2f\x9b\x4c\xdc\x23\x46\xc0\xac\x5e\x04\x6b\xe8\x94\xb8\xe3\x30\x19\xfc\x6a\x38\x5a\x7c\x36\xa4\xc9\x5d\xf9\xc8\xb9\xdf\x29\x3d\x93\x5a\x17\x50\x57\xbe\x68\x81\x23\x5b\x5f\x08\xf1\x08\xd8\xcb\x9e\x4d\x68\x5d\xe9\x2e\x75\x21\xf3\xe5\xfc\xea\x3d\xa2\xff\xf8\x12\x89\xd8\x70\x06\x7d\x32\x78\xdd\x1d\x07\x9b\x74\x1f\x09\x49\x4b\x58\xb4\x95\x7e\x70\xa1\x0d\x10\x85\xd7\x21\xeb\x8e\x19\x95\xe8\xcb\x6c\xcc\x9e\x44\x1f\x81\x37\xf0\x5d\x7c\xd7\x21\x0f\xd0\x5a\x71\xa5\x15\xf1\x2a\xed\xc2\xf5\x73\x71\xc1\x37\x03\xbb\x1b\xaa\x27\x9d\x7a\xf6\x47\xb8\x9f\xc1\x78\xe1\x2b\xb3\xbd\xf9\xeb\x61\x1d\x19\x2e\x54\x0b\x23\x8e\xeb\x22\xe0\x53\x54\xf5\xbb\xfe\xb2\x15\x72\x73\xa2\x57\xa2\x2b\xd7\x8b\xc1\xdc\x08\x42\x0c\x7c\xa8\x93\xf9\xd3\xab\x0d\x16\xd6\x20\x8c\x85\x44\x24\xbe\xfe\xeb\x78\x82\xbe\x56\x6c\x52\xcd\x06\x5c\x54\x5c\xb0\xb4\x6f\xb8\xd5\xbe\x89\xec\x76\x5c\xd5\xd5\x14\x5a\x20\x62\xd2\x47\x07\xaa\x07\xe6\x63\x01\x4f\x9e\x99\x54\x5a\x30\x16\x8b\x63\x86\x88\x53\x8c\x6b\x80\x8b\x9a\x8c\xab\x7d\x47\xe4\xc7\xb8\x77\xe9\xd9\x45\x88\xb6\x33\x51\xa4\x9d\x68\x74\x1c\x58\x7f\xd5\xd6\xec\x96\x6c\x44\x45\x40\x2c\xda\xb1\x04\xb6\xec\xa1\xae\x20\xeb\x65\xec\x77\x04\xdc\x27\x7a\x5d\xc6\xd3\x49\xeb\xd4\x96\x72\xa5\xcc\x43\xea\xa9\x7e\xcb\xdd\x87\x53\x0c\x71\xcb\x79\xae\xf7\x2e\xa4\x41\x58\x20\xc4\x00\x2e\x82\xec\xa1\xc9\xc7\x7e\xef\x07\xa6\x7e\x48\xb1\xe0\xfb\xfb\xa4\x0d\xe8\xad\x99\xfb\x78\xb0\x2b\x8d\x5c\xfb\x29\x0d\xdd\x13\x10\xd8\xef\x94\xe3\xf5\xc1\x8b\x4c\xac\x32\x71\xaa\x8b\x30\x80\xa0\x5d\x09\x9b\x23\x23\xf1\x0d\xeb\x8a\xe5\xfc\xf6\x3a\xff\x0e\xc8\xce\xc3\x22\xdf\x28\xf7\xe9\x6b\xbe\x46\xee\x93\x4a\x61\x04\x9a\xae\xff\x32\x04\xa1\xf8\x33\x48\x17\x6b\xb0\x69\x8a\x0f\xa2\xc9\x24\x2a\x94\x61\xeb\x03\x58\x66\xf8\x75\xd4\x3f\x63\x86\xb4\xeb\x41\xdb\x70\xff\xf9\x8f\xa9\xef\x9b\x92\xbe\x47\x5d\x8f\x2f\x74\x2e\x5f\x26\x07\xf0\xc2\xf1\x89\xf2\x19\x42\x15\x39\xa9\x93\x53\x33\x76\x2a\x7e\x9a\xaa\x6e\x35\x8a\x3a\x9d\x3e\x31\xb0\xf3\xdf\xf7\x1a\x0b\x82\x43\x55\x14\xba\x82\xc9\xa6\x72\xe7\xd7\xb0\xa6\x47\x4b\xbe\xf5\x56\xe3\x97\xf6\x93\x2d\xf0\xec\xd0\x8a\x40\x71\xa2\x05\xdf\x43\x2d\x83\x65\xc6\xa0\x89\x45\xbc\x81\x17\x2d\xd8\xf5\xf1\x87\x19\x03\x2e\xed\x1c\xa8\x4f\x35\xa0\x9a\xaa\x06\xe4\xe5\xaa\x11\x71\x55\x9a\xfa\x7e\x3d\xdc\x37\xae\x48\x34\x35\x75\xe1\x78\xc9\xc8\x2c\xbd\x0d\x2f\xe6\xd4\x34\x4c\x61\x7d\xab\xa6\xac\x6d\x54\x3f\xb6\x6e\x9f\x6a\xbb\x6b\x6c\x27\xf4\xac\x04\x44\x60\x4a\x5a\x0b\xc6\x7b\x1e\x86\x8b\xdb\xec\x78\xcc\x71\x23\xdc\x3b\x3e\x1b\x3e\x17\x7a\x83\x6e\xff\xf0\xf9\x2b\x39\x9d\x60\xfd\xf8\xc3\xaf\x5f\x11\x75\x7c\xfb\x87\xdf\xbc\xb2\xa0\x8b\x47\x6d\x17\x17\xc5\x1b\x33\x67\x1a\xa5\x8b\x3a\xe0\x76\xae\x32\x8b\xd9\xe8\x20\x39\xf2\x7f\xee\x69\x8f\x3a\x7e\x4f\xde\x75\xf2\x15\x42\xee\x22\xfa\x22\xc8\x81\x1f\x80\x09\xdc\xb0\xd6\x4f\x29\x6e\xa8\xfb\xdd\x42\x97\x6b\x81\x39\xf4\xef\xe4\xbd\xd4\x32\x28\x9c\xba\xf9\x8f\x45\xd8\x9e\xb0\xf6\x5f\xb1\xe9\xe7\x6d\x5e\xf7\x8f\xae\x9d\x73\x99\x90\xea\x3e\x68\xe9\xf5\xff\x4b\xa0\xa6\x06\x19\x34\xc9\xc2\x87\xeb\xaa\xc0\x42\xd8\x58\xc0\x15\xcd\xe6\xb7\x7e\xc6\x8d\xb7\xbe\xe4\xc7\x29\x78\xce\xf9\xf7\xc9\xb3\x42\xb3\x14\x3b\xf2\x0f\xde\x80\x70\x09\xe4\x8b\x9b\xa3\xd4\x38\xd1\x05\x73\x30\xcf\x8b\xa4\x7a\x6b\x78\x97\xa5\x1e\x51\x7f\x0d\xd3\x38\x83\xaf\x37\xf4\xd6\x0e\x9b\xe8\x53\xef\x80\xf0\x24\x8e\x5b\xe8\xd6\x3e\x38\x47\x9c\x82\x10\x4a\x1c\x6a\xa8\xc8\xcb\x35\xa0\x8f\xe0\xe9\x96\x3b\x0d\xfe\xf1\x95\x80\xd6\xad\xe4\x50\x64\x8a\xda\x8b\xcc\x06\xe0\x38\xec\x28\x9f\xea\x29\xe9\x48\x45\x33\x54\x4d\xc1\x22\x28\xb7\x11\x0f\xc7\x04\x43\x60\xf6\xb0\x80\xdf\x67\x2b\x16\x0e\xca\xf5\xfd\xc2\xf1\xe8\x01\x45\x0a\x0d\x16\xd1\x47\xc7\xe7\x23\x94\x11\xa5\x7f\xe2\x7f\x98\x80\x22\xa6\x0c\x7c\xf4\x93\x0b\x78\xe9\x42\x3e\xb0\xa0\x25\xb1\x66\x4e\x63\x7d\x05\x6e\xb7\x35\xf0\xbc\x84\x01\xb4\x9a\xd3\x36\x35\x78\x1a\x35\x4a\xd7\xee\x59\x08\xec\xe3\x87\xb8\x09\xa7\x32\x1a\x37\x13\xe2\xad\xe6\x8f\x7d\x24\xa7\x76\x40\x59\x84\x80\x1f\x4a\x43\xa5\xdf\x69\x13\x78\xf5\x7d\xa5\xe6\x3a\x93\x75\x60\x8f\x45\x37\x5c\x38\x87\xf4\x63\x80\x69\x46\x02\xfa\xc0\xe5\x02\x1b\x83\xba\xbc\xaa\xeb\xbf\xb0\xa0\x20\xfd\x32\x94\x0b\xa6\x5f\x93\x78\x2a\x2b\xcf\xee\x4e\x4c\xf5\x90\x05\xe0\x0d\x55\x63\x0b\xdf\xc8\x74\x2d\xb2\xf6\xbb\xfe\xb0\x51\x43\x2d\xb1\xc5\xb0\x63\x7b\x86\xd8\xdd\xf1\x9d\xdb\x84\xc3\x16\x64\xd3\x13\x09\x16\xe0\x4b\x53\x1d\xb4\xfd\x8b\xd1\x2f\x5f\x0d\x78\xc1\x28\x0a\x3e\x8b\x7e\xbb\x7a\x45\xd7\x15\xab\x2d\x5b\xb4\x79\x12\xf0\xc7\x51\x08\x22\x96\xc1\x04\xe9\x59\xf0\x74\x6b\xea\x0d\x4d\xef\xc7\x89\xde\xd6\x74\x3d\x40\xa6\x86\xde\xc4\xfb\x22\x09\xb2\x89\xab\xf0\x63\x26\xea\xb6\xc0\xdf\x82\xdd\x89\x75\x6f\xfa\x1d\x76\x79\x45\x6b\x62\x79\x35\x7e\xab\x0f\x45\x90\xde\x4c\x57\xd7\x83\x74\x6d\xd6\xb0\x55\x76\x1a\x41\xc6\xc6\x4c\xcd\x89\x7e\x56\x62\x8f\xaa\x5f\x49\x1f\x4e\x9d\x27\xe5\x6d\x27\x12\x81\x51\x3a\x26\xe2\x7c\x22\xd6\xa2\x19\xce\x45\xfe\xf5\xd3\xd0\xcf\x89\x36\x53\xb5\x98\x1c\x8a\x51\xd5\x9f\xba\x3f\x0d\x0c\x43\xfa\x8a\x0e\x53\x48\x5c\x98\x80\x70\xc8\x73\xa8\xf5\x7a\x36\x05\x71\x35\xbb\x2d\x88\xb7\xae\xf1\x23\x7a\x76\xab\x85\xba\x50\x6d\x20\x0b\xb1\x15\xa4\x7f\x59\xbe\xa6\xd1\xdf\x93\x9d\xb1\x12\x0f\x10\x20\xee\x57\x09\x6f\xfc\x38\x87\xcb\xfc\x47\xea\x1d\x7d\xbb\xf0\x1a\xe9\x26\x8a\x8a\x1c\x32\x58\xc3\x82\x36\x1e\x80\xdd\xd3\x11\xb9\x33\xa2\x72\x08\x41\xdf\xe7\x11\xee\x83\xd4\x59\x83\xe2\x21\x5c\xfd\x2b\xfe\x21\x18\x5b\x77\xd3\x31\xcf\x46\x99\xbb\x09\x60\x61\xcc\x26\x67\x7e\x09\xd9\xf3\x45\x6f\xd5\x9c\x0c\xe3\xac\x9d\x9c\x27\x7e\x41\x4c\xfe\x25\x14\xd0\x5f\xe9\x0b\xc1\x7f\x8b\x40\xc9\x95\xff\xc6\x97\xeb\x28\x84\x00\x36\x8e\xfe\x91\xc1\xa8\x3f\x1d\x4a\x69\xb9\xff\xe9\xa1\xa8\x97\x7f\x78\xe5\x80\x9a\xae\xe7\x22\x7e\x12\x60\x07\xeb\x7f\x24\x75\x52\xa1\x57\xf8\x22\x92\xb9\xaf\x9d\xc0\xcc\x09\x52\x5d\x15\x25\x34\x08\x72\x78\x6d\xc1\x58\xab\x15\xea\x42\x9f\xa5\xe8\x78\xe3\xcd\x97\xcb\xa1\x4e\xda\xec\xbb\x1a\xe1\x4c\x88\xbf\x79\x6b\x66\xc9\xee\xcd\xbf\x76\xfb\x15\x81\x97\x7e\x12\xbc\x9b\x8c\xe0\x34\x7d\x7e\x97\x47\x8e\x1f\xd2\x0b\x51\xfa\xd0\xd1\xb2\x41\xf8\x69\x1c\x9c\xca\x1b\x7c\xc6\x2a\x92\x28\xec\x25\x2e\x46\xdb\x40\x8c\xca\x6a\xcc\xb6\x28\xad\xf7\x85\xb1\xf1\xbb\x71\x94\xe0\x78\x15\x4c\x40\x57\xeb\xd6\x57\xda\x05\xe4\x9f\x6f\x58\x8a\x1e\x87\x3a\x57\x67\xb3\x0a\x50\x91\xc4\x8d\x40\x78\x62\xfc\x11\x1b\x4a\x14\x17\x34\x05\x3a\x2d\x49\x62\xc4\xb1\xa9\x80\x83\x69\xda\x15\x47\x7a\xe2\xb8\xb7\x31\x0e\x2a\xea\x05\x5b\x35\xf2\x1e\xc6\xef\x57\xb2\xe0\xc8\xdc\x29\xde\xca\x34\x34\x75\xd4\x27\x9b\x94\x7d\xbc\xdb\x34\x53\xca\xe1\x9e\x59\x81\x50\xf4\x36\xd9\x8c\xc3\xc3\xa9\xdc\xe5\x6b\x7f\x8b\x09\xfc\x7a\x3c\x14\x12\x40\xfb\x42\x48\xfd\xd4\x7b\x6c\xd8\xab\xf4\x94\x20\xae\xd0\x1f\xed\xed\x04\x16\xe1\xbb\xd0\xd7\x7a\xcd\xb9\xa9\x6a\x01\x7e\x1c\x98\x35\x05\x98\x07\x42\xf2\xe4\x2f\xd4\xdf\x2b\x62\xc5\xca\x11\x82\x44\x67\xf7\x3c\xf4\x71\x65\x93\xdf\xf9\xd5\xed\xf5\x5d\xa7\x50\xf1\x2e\x64\x03\x53\x54\x2b\xc5\x43\x9b\x49\xb7\xdb\xac\x12\xb4\x6c\xe6\x23\x99\xa6\x4c\x74\xf3\x7e\xcc\x22\xab\x95\x44\xa2\x2c\xd2\x95\xe8\xe3\x84\x44\x28\xfa\x3a\x25\x15\x1a\x7e\x5e\xcf\x6f\x3b\xc1\x6b\x32\x6a\xb3\x58\xf7\x04\x41\xc0\xe1\xce\x24\xaa\xe8\x34\xfb\xc7\xf6\xfa\x03\xe8\xd8\xe1\x44\x54\xe4\x3b\x1a\xc2\xf1\x5c\xe9\xa2\xa0\xbc\xd8\x9a\x02\xe2\x50\x66\x7b\xde\xb3\x68\xff\xb5\x48\x82\x19\x45\x69\xe8\x16\x23\xbe\x10\x8e\x22\x4b\xba\x1f\x4a\x68\x47\x1b\x24\xc4\xf3\x8b\x92\x00\x3d\x2e\x1e\xd9\x4f\xc7\xdf\xdc\xba\x1f\x0d\x17\x9c\xdf\x09\xf9\x4b\xee\xa6\xcb\x34\x45\xeb\x84\xe3\xf1\x07\x1f\x6d\x5c\xfb\x5c\x08\x30\xb0\x4a\x50\x52\x88\x08\xce\x1a\xed\x6d\x12\x92\x92\x4d\x17\xa2\xc8\x6c\xe2\x3e\x6d\x7b\x2a\x38\x7a\x40\xff\xbb\xb7\xdb\xdd\x7b\xfd\xfa\x68\x62\x6b\x62\xff\x14\xde\x9b\xd4\x12\x83\x65\xaf\x43\xd4\x1c\x75\x12\x53\xfb\x00\xf5\xd1\xf6\xb2\x59\x4e\x38\xc8\x28\x7f\x56\xaa\xdf\x5f\x49\xde\x05\x4f\x96\xc5\xc7\x5c\x0b\xfb\x4e\x0c\x55\x5f\x2a\x56\xd8\x20\x50\x05\xdd\x0d\x51\x35\xa5\xeb\x4a\x39\xa8\xe8\xcb\x20\x64\xe3\x4d\xf3\xbd\x69\x4f\x26\x63\x06\xa4\xdb\x92\xb2\x28\x2e\x82\xcb\x68\xb0\x9b\xfc\x92\x78\x5c\x23\x00\x43\x4f\xd6\x08\x51\xe0\xf5\xe8\x06\x22\x47\x65\x51\x2e\x6e\xe0\x4a\xa6\x46\x1f\x2d\xf7\x63\xae\x49\x59\xf6\xb6\x7c\x53\xce\xff\x40\xff\xe1\xbf\x66\x6f\x4d\xb5\x42\x1c\xef\x10\x3e\x53\x1f\x52\x54\xa1\xfa\x71\x25\x59\xec\xa9\x7e\x63\x7f\xc5\x23\x53\x4b\xa8\x83\xe6\xfa\xbf\x3b\x03\x52\xc6\xc7\xeb\x66\xd5\xab\x70\xe4\xd2\x25\x2c\x7c\xcd\xc6\x12\x2a\xa8\x87\x1d\xff\x51\x41\x33\xac\xca\x86\x83\x2a\xf1\x48\x0a\xda\x17\x65\x6b\x11\x3e\x74\xe3\x11\x40\x92\x40\x10\x1f\xa4\x7e\xc8\xa5\xc9\x3f\x95\x90\xe7\x52\x67\x8c\xa8\xaf\xb6\x54\x90\xc8\x15\x1b\x13\xeb\x5e\x82\xcd\x86\xaf\xe6\xfc\x04\x52\x9b\x17\xe8\x53\x5b\xc7\xa5\xd0\x03\xc9\x0f\xe7\x0a\xa1\x5b\x6a\xe7\x5d\x15\x6b\x7f\xf3\x3b\xde\x24\xe6\xae\x2e\x8f\x43\xf6\xf3\xf8\x91\x48\x20\x9d\x21\x9b\xd1\xeb\xb8\xac\xa8\xb9\x2d\x3e\x7f\x12\xac\x2c\x4a\x43\x78\xdb\x4a\x03\x86\x7b\x94\x2c\x96\x7d\x47\xf0\x11\x04\x13\xc9\x8a\xdd\xd7\xc0\xe1\x45\xab\x15\xaf\xb2\xa8\x56\x04\xfd\x45\xb2\x2f\xa1\x26\x22\x47\xac\xcc\xe2\x73\xb1\xde\x8e\x83\x2d\x28\x99\x24\xa4\x34\x58\x4c\xa5\xa4\x91\x85\xe9\x8a\x40\x1b\xc9\x63\xae\xff\xdd\x1d\x39\x77\x36\xd0\xf1\x7f\x5f\xeb\x22\x09\x85\xa2\xd2\xc7\x7d\xba\x7d\x57\x22\x60\xb5\xd1\x66\x8a\xd4\x39\x76\x4a\x88\x4f\x49\xc3\xad\x4d\xa5\xdd\x74\x85\x33\x39\x47\x3b\xff\x4e\xfe\x0d\x1f\xa2\x30\xfa\xcc\x0b\x44\xbf\x0e\x54\x9a\xb1\x0b\x56\x9c\x1c\x14\x12\xad\x03\x75\xd9\xda\xcf\x41\xdd\xa1\x4a\xd8\xb8\xf9\xe9\x0d\x15\x7a\x62\x14\x88\x40\xa3\x1d\x78\x52\xab\xaa\x2d\x54\xdd\x36\xcd\x1b\x3b\xff\x83\x59\xf2\x1f\xa1\x7c\x53\x76\xf2\x09\x59\xe8\xbe\x4d\xbf\x11\x77\x5d\xae\x0e\x24\x32\x95\x1c\x1b\xa1\xae\x1a\xaf\xfb\xca\xcf\x89\x97\xad\x38\x25\x8c\x26\x77\xf5\x35\xe1\x29\xe2\xd2\xb5\x9e\x7b\xaf\x11\x26\x35\x9d\x4b\xea\xb8\x5b\xb4\x41\x46\x95\xb6\xd9\xb0\xd7\xc1\x79\xea\x6e\x12\xb9\xcc\x04\xd2\xde\x27\x0f\x65\xd2\xfe\xfa\x5f\xc7\xb4\x3d\xee\xb7\x04\x14\x87\x71\x17\xb5\xaf\x67\xd1\x3c\x7d\x8c\x29\x97\x8f\x24\x7c\x53\xd3\x90\x90\x90\x55\x82\x4b\x45\x27\x23\x01\x65\x60\xa9\x9d\x06\x7c\x8a\x8d\x4f\x42\xac\x27\x15\x15\xc7\x21\x9e\xc0\x28\xd1\x63\x01\x96\xd1\xdf\x0a\x6f\xec\xe2\xc7\x29\xd6\x97\x78\x4c\xd7\xd3\xa7\x04\x03\xd5\x15\x3b\xa1\xbb\xfa\xb8\x2d\x6a\xd2\x17\xb2\x2a\xa1\x30\x5a\x1b\xe4\xec\x40\xe8\x48\xff\xc6\xaf\xc8\xf7\x51\x4a\x50\xbe\xa5\xf2\xd9\xa4\x6d\x60\xea\x3b\xd1\x86\x28\x3a\x6e\x23\x9f\xa3\x36\x49\x7d\x9f\x44\xef\x0f\x9f\x56\xd7\x3d\x51\x71\x8e\x22\x4d\x19\xd6\x12\xa2\x6c\x4b\x4e\xc2\xc5\x9c\xbe\xa0\x52\xf4\x2d\x09\x40\x8f\xca\xca\x3a\x35\x37\xa7\x5a\xe4\x20\x51\x22\x60\x8b\x76\x56\x24\x6d\xa3\xbd\x72\x19\x17\x45\xe0\x22\x6a\xc4\xe9\xad\xe3\x0e\x16\x74\xf3\x91\xca\x36\xd9\x43\xdf\x07\xa7\xa4\x13\x4a\x25\x74\xf7\x91\xdd\x3d\xd0\x2d\x6d\xf3\xb2\xdf\xdc\xd3\xf2\xf1\x0e\xea\x07\xde\x3b\x25\x60\xbf\x56\xea\x95\x93\x0f\xd2\x05\xa2\xf6\xb9\x56\x1b\xb7\x93\x61\x6d\x77\x05\x13\x66\xfc\x17\x33\xae\xe1\x91\xb0\x91\x28\x06\xd4\x9a\x43\x67\x0e\x66\x90\x7f\x71\x63\x5f\x90\x9f\x9a\xb6\x5c\x69\xd6\x45\xb6\xc8\xbf\xb1\x3e\x47\x48\x76\x8d\x1e\xe8\x8f\x83\x2d\xc3\x6a\xa3\x74\x53\x4a\xb9\x84\x44\xb7\x47\xc6\xee\x89\x88\x0b\xae\x5e\xfa\xa4\xfd\x09\xf1\xda\xfe\x9c\xff\x09\xb7\x98\xfe\x21\xea\xd6\xbc\xfb\xb3\x93\x16\x29\x1d\x3c\x0e\x5b\x77\x1c\xc5\x85\xf5\x8e\x19\xe2\x9f\x16\x32\x4b\xd2\x6e\x45\xb0\xc6\x4c\xf0\x10\xd4\x6c\xc2\xf0\x87\xe0\x06\x66\xdf\x39\x59\x2c\x81\x2f\x92\xe3\x69\xfe\x65\x8d\x8b\x12\xc1\xe3\x9a\x03\x4e\x2e\xde\x43\xab\xff\xff\x34\xe2\x45\x22\x65\xa1\x0e\x27\xc3\xe6\x50\xb7\x90\x07\x59\x71\x8b\xdb\x37\x62\x4b\x29\x2c\xeb\xd0\xe5\xce\x73\xd7\x7e\x7d\x00\x04\xd0\xa0\x88\x2c\x38\x8b\xdf\x27\x08\xcd\x3a\x15\x9e\x75\x82\x9d\x5d\x9b\xa6\x5d\x4b\xbe\xa7\x51\xfd\xf1\x59\xad\x7c\x07\x2b\x13\x21\xfa\x51\x57\x12\x9f\x75\xc2\x10\xb6\x64\xe9\x9d\x44\x96\x19\x8e\x26\x04\x8e\x25\x0a\xe7\x5e\x3e\x52\x40\x5c\x16\xe9\xe0\x6e\xc8\x30\x89\x68\x1b\x20\x20\x5a\xc3\xc7\xc6\x0c\x05\x34\x6c\x11\x3e\x3d\xbc\xd3\xaa\x26\x9e\xf6\x2a\x7b\x1c\xd0\x17\xd2\x40\x02\x47\xb0\xd3\xa2\x97\x58\x84\x24\x16\x3c\xd5\x94\x1b\x98\xdc\xa9\xe4\xb2\xd4\xf6\xc2\x84\x00\xa5\xeb\x81\x97\xe5\xb8\xaa\x9c\x50\x6c\x1d\x18\x6d\x8d\x80\x86\x44\x00\x1e\x04\x75\x66\x0b\xa1\x24\x08\x75\xe3\x62\xb6\x45\x0e\x69\xa0\x2f\xc0\x6c\xb0\x0d\xc8\x20\xc7\xf0\x78\x2a\xf1\xf1\x09\xcc\x98\x76\x8d\x40\x16\x95\x0f\x19\x51\xc6\x31\x47\x52\x68\x56\x23\xe4\x78\x9e\x74\xcf\xcb\xcb\x92\xd8\xfd\xea\xa6\xe1\x7e\xed\x86\xa3\x3d\x97\x6c\x9b\xbf\x6c\xc8\x61\x58\xdb\xc8\x37\xef\x0a\xfe\x07\x05\x82\x3b\x9a\xf7\x53\x53\x00\x46\x53\x95\x62\x10\x1b\x1b\x8d\xff\x01\xa7\x08\xce\x36\x65\xc5\xb8\xc0\x0b\xed\x56\x1e\xbe\x34\xad\x71\x00\xf2\x2f\x46\x04\x02\xeb\x01\x63\xdb\xc4\x20\xd6\xed\xf9\x8d\x9e\x6c\x21\x60\xf1\xbd\x5a\x01\x87\x05\x09\x93\xfc\x7e\xd4\x11\x9a\x1e\xe7\xf0\x3b\xd6\xcb\xe2\xbc\xd5\x20\x53\x73\xee\x16\x43\x66\x62\x72\xe0\xf4\x0e\x73\xdc\xe7\xc8\x10\xc1\x74\x69\x6a\x60\x25\x63\xf6\x92\x2a\x66\xaa\xc7\x01\xd3\xed\x9d\xb7\xa3\x94\x72\xdc\x45\x10\x67\xf3\x1a\x3d\xb1\xe6\xe3\x91\x05\x5c\x3c\xf4\xb9\x88\x7c\x0b\x07\x95\xf4\x25\x90\xf4\xf5\x48\x6e\xa9\x61\xef\x56\x3e\x9a\x87\xfe\x99\x04\xf3\xd0\x8d\xe2\x5d\xca\x7d\xfa\xb4\x61\xd7\x37\x22\x3b\xef\x1c\x11\xe1\xcf\x60\xcb\x7d\x10\x93\x0d\xba\xfe\xf5\x54\xd7\x11\xdf\x38\x0c\x5e\x12\x08\xdb\x63\x02\x7d\x56\x0b\x94\x36\x85\x95\x6f\xca\xee\x38\x16\xa3\x1c\xeb\xfb\x17\x4c\x5d\x5c\xbc\x00\x1f\x0a\x26\xce\x7d\x06\xf2\xf0\xf0\x7c\xd9\xed\x8b\xf6\xe3\x45\x12\x85\x02\x0e\x57\x25\x4b\x3d\x6a\x48\xf1\x30\x43\xfa\xc5\xc1\xd0\x8a\x7d\xcb\x0e\xc9\x30\xa4\x66\xc8\x16\x11\x7e\xda\xff\x01\x08\xfa\x98\x03\xd5\x21\x16\xc3\xf7\xa5\xbc\x69\x2e\x8a\x93\xe9\x58\xa1\x63\x94\x21\x36\x14\xcf\xa6\xf0\x51\xc4\x6c\x15\x6f\x98\xb2\x94\xd7\x20\xc2\xee\x13\x1d\x46\x8f\x10\x93\x21\xd7\xff\x56\x25\xd9\x12\xdd\x3a\x7d\x3c\xed\x61\x04\xcf\xe4\x5d\x8b\x22\xcf\x1c\x8e\x38\x13\x31\x3d\x48\x0c\x14\x99\x8d\x44\xc6\xf3\xc9\xa1\x1f\x6e\xe2\xb7\xf3\x99\xcf\x21\x17\xb5\x73\xb1\xdd\xc6\x30\x93\x0c\x1b\x85\x77\x1b\x73\xe4\x4d\x7b\xc0\x0c\xe2\xe8\xf0\x2c\x27\x5b\x7b\x15\xd0\x20\xb6\x3f\xa7\x38\x65\x13\x39\xe7\x56\x23\x9e\xd6\xd2\x85\xba\x8e\x44\x80\x27\x40\x6b\x93\x3d\x3d\x20\x85\xfc\x6d\x98\x52\x6b\x76\xcd\xa5\x99\xde\xbb\xc4\x5a\x27\x40\x74\xcc\x43\xb3\xed\xbf\x24\xca\x8c\x8d\xa7\x23\x67\x80\xf4\xf1\x85\x09\x75\x10\xc7\x20\x91\x45\x88\xb0\x00\x65\xe9\x72\x70\x04\xdf\x0f\xdf\xd1\x10\x80\xd7\x7b\xff\x9b\x10\xd3\xc6\xc7\xec\x33\x70\x55\xae\xe5\xcd\x4d\x0e\x63\x96\xb0\x5d\xe0\x3d\x38\x67\x82\x64\xc0\x1b\x9f\xc2\x88\xd0\xd4\x11\x0e\x0f\xe0\xd4\x54\x1c\x55\x3f\x0d\xa6\x1f\xad\x63\x96\x82\xee\x5b\x91\xdb\xc4\x80\xae\xa2\x9c\x81\x84\x27\xf0\xc5\x4e\xd4\x23\x92\x04\x0d\x7a\xb0\xaa\x0c\xcc\x0d\x7a\xf1\x13\x39\xfb\xee\xfc\x05\xc7\x5e\xc8\x67\xf9\x29\xf3\xc6\x9c\xf0\x80\x8d\x86\x89\x0b\xaa\x35\xb6\x94\x91\x74\xdd\xf0\xb9\x84\xd0\x44\x52\x77\xaa\x68\x34\x58\x02\x71\xac\x09\x8d\x29\x6a\x34\x8d\xea\xd1\x96\x93\xbc\x4b\x88\x7c\x58\x80\x17\x9c\x41\x56\xba\xa5\xb7\x61\xc5\xbc\xef\x2c\x7f\xb0\x97\xd4\x9f\x78\xe4\xd7\xec\x55\xeb\x45\x34\xd4\xf0\x46\x57\xa6\x6f\x38\x00\xe6\x3a\x5a\xb0\x04\xa9\x0c\x6f\xba\x14\x2f\xa6\x05\xfe\xa3\x5d\x1c\x56\x9f\x10\xfc\x6b\x95\x94\xc4\x18\x89\xff\x59\xee\xbd\xf5\x7e\xe6\x12\x52\xe7\x52\xb4\xdc\x37\x04\x62\x3c\x38\x8f\xe8\x2d\x71\x13\xf8\xa8\x12\x60\xd8\xdb\x8c\xb3\x01\x53\x97\x20\x83\xae\xe6\x2f\x8c\xed\x4c\x9c\x81\xf7\x23\x0d\x64\x2f\x1e\x87\x5c\x74\x17\x30\xb3\x42\x44\x03\x17\xf1\xd5\xf5\x97\xe6\xa2\xc5\xe9\xbc\x1d\x49\x1e\xa7\x87\x98\x58\xe6\x5a\x53\x16\x0f\x02\x6f\xaa\x97\x28\xec\x2c\xc0\x27\x04\x15\x6c\xb4\xcd\xa7\x47\xe2\xdd\x15\xc0\xe9\xd0\x91\xe8\x3d\x46\x02\xe3\xd6\x04\xa5\xbf\x45\x64\x45\x24\x74\x1a\xcf\xdb\xe9\xb6\xa1\xc9\x46\xcc\x91\xa9\x1a\xc8\x00\x64\xd9\xcc\x94\xff\x18\x57\x11\xa5\x9b\xa5\x4d\xed\x38\x6e\xc9\xcf\x7f\x1d\xd7\xd9\x4b\x06\xb0\xb9\x66\x02\x1b\x57\x58\x36\xeb\x2b\x42\xc6\xed\x7e\x42\xae\x1b\x10\x02\x0b\x77\x41\x49\xa9\x29\x7b\x55\xaa\x89\x34\xdb\x30\xa3\xbc\xea\x4b\x11\xbc\x4b\xf6\x6f\x69\xc0\xf6\x4b\x9d\x58\x11\x71\x43\x51\xae\x15\x5c\x20\x7b\xea\x82\x59\x06\xbf\x8e\xa1\x7d\xca\x3a\x8d\x33\x3d\xcc\xa9\x3f\x1b\xcd\x5b\xa2\x0e\xc8\xdd\x2b\x01\x6a\x98\x8c\x2a\x54\x41\xfc\x5e\x1c\xb3\x37\xc8\x3b\x78\x6c\xc4\xf6\xc2\x6a\xab\x0f\x5c\x24\xbe\xef\x40\x2f\x88\x1c\xab\x9f\x2b\x04\xc9\x24\xd8\x81\x63\x6c\x0e\xeb\x51\x68\x50\x7c\xff\xda\xf7\xc4\x74\xe2\x58\x72\xdf\x26\x08\xc3\xd5\x18\x04\x94\x1d\x57\x54\x82\x4e\xeb\x3b\xf7\x6c\x9a\x3d\x0f\xed\xcc\xe2\xa7\xd0\x7e\x60\xab\x5a\x85\x35\x15\x50\x01\x81\x3b\x79\x14\xaf\x99\xa9\x2d\xd6\x7a\x28\x02\x86\x68\x2f\x60\x5a\xf6\xa2\x40\x00\xd6\xa3\x18\xc1\x2b\x76\x1f\xc4\x54\x0f\xd6\x96\x92\xb2\xd9\xe7\xdf\x2f\x3a\x97\xec\x12\xc1\x78\x59\x0a\x56\x24\x81\xa1\x63\xc2\xfd\xce\xef\xce\xbf\x7b\x76\x9c\xbf\xbb\xf7\xf6\xed\xdb\x7b\x68\x7d\xaf\x6f\xf1\x06\xd1\x94\xd7\xc7\xf9\xff\xfd\xf4\x94\xf0\xe4\xea\xae\xfa\xea\x8b\xe7\x2c\x9b\xfb\x80\xc2\x67\x2d\xf4\x2f\xc2\xff\xdf\x4e\xe0\x7f\xbd\x3d\x5e\xc0\x8c\xaa\x8f\xdc\xf4\xbe\x97\x04\x7a\x31\x29\x8a\x43\x4c\xc3\x2d\x29\xec\xc4\x54\xcd\xaa\x35\x1a\x1a\x91\xe3\x67\xc5\xaa\x01\x4b\x64\xce\x9b\x38\x29\xc4\x30\xc7\xe0\xa0\x66\x49\xdd\x47\x93\x43\xd2\xff\xd5\xf5\xbf\xc5\xa2\x5b\xa9\x97\x98\x08\x47\x92\x71\x04\x42\x15\x00\xf9\x3d\xc2\xeb\xe3\x60\x7f\xd2\x83\x5d\xf9\xf7\x8d\x2d\x0f\xee\x49\x62\x2e\xa5\x01\x92\xd7\x46\x7a\xe1\xd8\x34\x4d\x5d\x5d\x11\xac\x79\xfb\x21\x8e\x0f\xcd\x20\x86\xcf\x0e\xda\xee\x10\x08\x68\xf8\x25\x7b\x77\x36\xec\x88\x93\x88\x1a\xe0\x73\xb6\x8f\x9c\xff\xee\xa8\x28\xa3\xd4\xfe\x8e\xcd\x84\x19\x6f\xe4\xbe\x3f\xe8\x44\xd2\x40\xcc\xcf\x60\x78\xd2\xc1\x80\x7b\xd7\x94\xe2\x7b\x25\xe0\xb8\xd2\xb4\x18\xaf\x43\xe7\xe3\x3e\x62\xe3\x92\xe9\x8f\xb2\x77\x1a\xaa\xe6\x18\x42\xaa\x17\xc5\x46\x83\x85\x8d\x37\x28\xb2\x69\x4a\xcc\x98\x6e\xa8\x28\x03\x9c\x25\x46\x70\x6c\xe6\x73\xac\x36\x3b\xc7\x79\xeb\x0a\x54\xfd\x7b\x0c\x8b\x22\x48\x76\x69\xda\x12\x67\x2a\xfc\xb6\xc7\xb1\x4b\x57\xac\xe1\x4c\x3e\xc4\x29\x9c\x39\x3f\xad\x57\x98\x25\x04\x7a\x38\x78\x9a\xa1\xdd\x4e\x42\x04\xcf\x1f\xef\x03\xbf\xf4\x8c\x58\xa2\x50\x7b\x01\x61\xb1\x74\x85\x05\xd8\x17\xc3\x52\x1f\x2e\x51\xc8\x50\xc4\x89\xf0\xfa\x1a\x04\x90\xa7\x57\x18\x0f\x51\xa5\x44\xe8\x4a\x91\xa2\x8b\x75\x2a\x20\x9b\x4c\x1c\xe8\x91\x71\xe3\x90\x91\x73\x10\x3f\x66\xe1\x14\x01\x3b\x5a\x7a\x98\x27\x64\x82\x18\xd4\x16\xc9\x38\xae\xff\xc8\x97\x69\xcc\x26\xba\x31\x6e\xa6\x35\xc5\xc5\xca\xd1\x3e\xc8\xf6\x74\xea\xc8\x11\xef\xc3\x15\x63\x27\x9e\x47\x82\x9a\xd2\x17\x86\xdd\xc9\x19\x59\x84\x57\xe3\x09\x9e\x78\x8e\xe4\x96\x06\x79\x3f\x47\x3d\x76\x87\xf0\x11\x8e\xc7\xda\x45\xe9\x4c\x82\xfd\x72\xa0\xe4\xe1\xa7\x75\x03\xa5\xed\xfc\x11\xff\x33\x46\x59\xdb\x02\x46\x11\xf3\x93\x82\x5e\xfa\x78\x8f\xf6\x55\x73\x15\x67\x65\xd2\xc0\x78\x55\x53\x32\xce\x49\x57\x14\xaa\x8f\xa3\xcd\x53\xc3\x47\x93\x0d\x43\x23\x8d\xb3\xc9\xb5\x5c\xf4\x0e\x0e\x21\xde\x07\x1c\x87\x48\x5d\xa0\x54\xd8\xcd\xb0\xaf\x24\xa5\x1d\x02\x22\x1f\x15\x9b\xb2\xd3\xe0\xbe\x2e\x8a\xbe\xa5\x4b\xe0\x63\xdb\x86\x88\xca\xd1\xb6\x71\x1c\xb2\xb0\xc6\x97\x51\x2a\x69\x47\xbb\x16\x62\x8f\xb7\xd2\x45\xc4\xab\x8f\xc5\x37\x91\xe5\xdb\xd4\xd2\x86\x41\xec\x7d\x9d\x4f\x89\xbe\x3f\x18\x76\x14\x0a\x7d\x96\x76\x17\x07\xe2\x9f\x9e\xf8\xc7\x8d\x37\x92\x73\xbd\x31\xda\xfe\xb0\xeb\x4f\x8a\xbc\x3f\x7d\xfa\x63\xb6\xaf\xf8\x25\xc0\xf3\xd1\x18\xfc\xc3\xa9\x7a\x8b\xb0\x61\x78\x6a\x67\xfa\xe5\x22\xcc\x04\x7f\x2b\x50\x10\x9f\xc0\x13\x4e\xcd\x2b\xda\xc1\x1b\x4f\xf5\x70\xfc\xfe\x8c\xc8\xf9\x8b\xd9\xb2\x6d\xde\x5a\x84\xb6\xef\xdb\x15\x2c\xad\x5a\x18\x51\x88\xbd\xc4\x39\x97\x49\x35\x09\xdd\x82\xef\xd8\x31\x2e\x12\x1b\xa6\xb9\x26\xea\xe5\x22\xb6\x09\x67\xc9\xcd\x25\x61\x7a\xb0\x0a\x73\x4f\x72\x3d\xa2\x0a\xac\x62\x01\x6f\xc4\x6c\xc5\x4c\x1a\x21\x56\xc7\x02\x7f\x71\xa0\x7e\x8b\x68\x01\x1c\x97\x43\xf2\xf4\xa1\x88\xdb\x46\x95\xed\xbe\x22\x26\x01\x41\xcd\xe6\x2f\x7b\x76\x6f\xa6\xe9\xc1\xb3\x39\x54\xe1\x44\x54\x66\x1d\x2a\x69\x66\x2a\x57\x07\xdd\xaa\xd7\x98\x13\x73\xdf\x5e\x87\x30\x17\xde\x6a\x3f\x48\xc1\x79\xf7\x5c\x65\xaa\xcb\xc0\x18\x7d\x8f\x02\x42\xd3\xd7\x48\xd6\x16\xea\xe8\x8e\x13\xe2\x7c\xf8\xe4\x99\xfc\xe0\xc8\x6c\x92\xa7\x4c\x23\xd0\xb9\xc8\x5c\xfc\x59\x13\x93\x49\x5f\x30\xe5\x77\x4e\xe7\xd8\xcc\xc0\xfe\x43\xb4\xb4\x32\xc4\xc6\xdd\xd3\x3c\x03\x1a\x86\xae\xa8\xd7\xd2\x0f\xe2\xd5\xed\x8a\xfa\x4a\xbd\x13\x4e\xc4\x7b\x33\x0e\xda\xe6\x93\x1b\xe9\x55\xe3\x43\x00\xda\x8b\xac\xab\x4d\x2f\x1d\x87\x38\x3b\xd1\x4e\x85\xc8\x2c\x38\x2c\x17\x99\x6f\xe6\x23\xf4\xbd\x14\x51\x83\x8f\xd9\x37\x93\x88\x8a\xfc\x77\x30\x5a\x73\x02\x09\x57\x69\xdd\x16\x17\x1d\x51\x69\x0d\xd4\x5d\x51\x39\x6d\x88\x6b\x0b\x57\xdb\x7b\xfb\x10\xff\xcf\xd7\xa1\x43\x5e\xb2\xd5\x02\xfe\xf1\xa5\x89\x17\x9c\x2b\x2c\xc0\x8f\xcf\xc3\xf9\x85\x63\x75\xce\x25\xaf\x7b\x98\x90\xd0\x9b\x79\xdb\x3a\xfb\x71\xe7\xe5\x30\x31\x32\xdf\x9c\x85\x0f\xb7\x98\x4b\x41\xb2\xf4\x60\x79\xab\x8e\x91\xfc\x42\xe9\xfa\x05\x55\x80\x24\x6c\x43\x4c\x06\xc7\xaf\x25\x4b\x89\x2d\x78\x5d\x84\x9b\xaa\xd9\x44\x51\xb9\x44\xc2\x51\xf8\x24\x78\x49\x7e\x2b\xc8\x8a\xa1\x78\x31\xea\x12\xc9\x51\x80\x3c\xbe\x55\xeb\x4d\xc9\xa5\x2f\x63\x76\xc5\x26\x61\x8a\x11\xf8\x31\x7c\x63\x6e\xed\x04\xb7\xfb\xe7\xbf\x26\x4d\x26\x63\x58\xd3\x87\x24\x90\x2a\x9b\x34\xb3\x30\x30\x8a\xaa\x09\xaf\x1e\xd9\xa0\x68\x12\xd1\xfb\xe8\xca\x86\x6f\xa2\x2b\x4f\x6d\xec\x22\xf8\x61\xd4\x00\xe0\xb9\x2c\x6d\x2f\x71\xa9\xfd\x67\x70\x8e\x60\x60\x24\x1c\x07\x10\xea\x7f\xfc\xe3\x7f\x9d\x00\x3e\xa5\xb5\x2a\x47\x31\x88\x40\xd7\x1f\x62\x8b\xfd\xdb\xa9\xb5\xc3\x44\x6b\xdd\x95\x67\x12\x67\xa0\xe7\x88\x9f\x6d\x23\xce\x27\x2e\x14\x99\xf6\x85\x5b\x0d\x8d\x73\xb9\x66\x9d\x8a\x33\x24\xaf\x65\x18\x88\x06\x1c\x4b\xbe\xf7\x41\x4e\xc3\x86\x0d\x2c\xaf\xfd\x54\xb0\xb1\xcc\x02\x88\x6b\xae\x87\x5f\x98\xb1\xca\xd5\x3b\x2f\xe8\x18\x36\x45\x2b\xd0\x93\x8f\x6f\x22\x03\xa1\xbb\x8b\xc1\x80\xbb\x18\x5f\x65\x21\x91\x5d\xd5\xe1\x9b\x3a\x59\x7d\xa4\x44\x61\x32\xe6\xe5\x81\xaa\xd3\x8f\xb5\xdb\xc1\x24\x5d\x18\xc3\xde\x37\x2e\xa7\x32\x27\xec\x2e\x6e\x4a\x3a\x30\x1a\x2a\x7a\x7f\xdd\x00\x3e\x78\xd6\xe1\x37\x77\x78\x8b\x52\xbb\x58\xa6\xb0\x5c\x6f\xdc\x72\xe5\x03\x9b\xf9\xbb\x12\xa8\xaa\x51\x67\xea\x73\xe0\x42\xd4\xa0\x89\x73\x43\x08\xb5\x9d\xdf\xa8\xd5\xc8\xa2\x2b\x0f\xe2\x36\xcb\x7e\x68\xda\xcd\xab\x90\x48\x7c\x18\xf2\x26\xd6\x54\x70\x2d\x9f\xa8\x33\xae\xea\x52\xa8\x4c\x37\x39\x98\x84\x81\xef\xfc\x38\x5b\xf9\x38\x0f\x83\x78\x93\xae\x4a\x15\x53\x49\x52\x06\xc9\xe0\x37\x73\xe1\x7a\x91\xcc\x38\x32\x01\x4f\x66\xc1\x61\x74\x9d\xd1\x70\x14\xe1\x22\xdb\x9b\x66\x5f\x49\xf6\x4c\x62\x5f\x2d\xd2\x56\x23\x1a\xa7\x6d\x76\x06\x96\x54\x4f\xf8\x67\xab\x42\x62\xba\xe9\x9c\x3d\x1d\x51\xb8\x38\x3b\xb6\xcd\x38\x08\xa4\xaa\x8c\x2c\xf1\x99\x88\x4a\xee\x4a\x93\xe4\xbe\x2e\x0c\x75\x1c\x5c\x18\x7d\x4d\x5a\xad\x6b\xf2\x6d\xde\xbc\x91\xef\x8b\xcf\xdf\xee\x92\xb6\xcb\x5c\xa4\xfc\x70\xed\x28\x66\x38\xa7\x48\x8f\x93\x07\x0a\x22\x71\xe1\x48\xd8\x4e\xce\xa7\x82\x17\xcd\x8c\x4d\xbc\xe6\x5d\x16\x79\x8c\xe6\xfa\x3d\xd3\xb4\x8c\xde\x31\xd1\xf7\x21\x75\x93\x20\xde\x4e\x84\x55\x97\x12\x46\xd9\xd9\xd2\xc8\xf5\xf5\x63\x0b\x20\xdc\x13\x4b\x7e\x35\x1a\xe2\x7c\x20\x37\xc4\x75\x4f\x61\xe9\x3f\x27\x6b\x71\xaa\xbe\xfb\x5b\x2d\xcd\xe3\x94\xb7\x75\x7e\xa2\x29\x6f\x63\x91\x7f\x9a\xfb\xd6\x7f\x99\x4e\x82\xfb\xe9\x16\xcb\x69\x85\x90\x05\x37\x36\xfa\x4e\xb7\x31\x90\x7c\x87\x14\xfb\x62\x04\x4d\x8d\x3e\x39\xe9\xad\x33\x84\x5e\x1f\xce\x75\x5b\x1d\x1d\x50\x94\x4e\xa7\x59\x3d\x95\x18\x3c\xb1\xe5\xba\xcf\xf4\x3a\xc2\x4c\x91\x3d\xcf\xe1\x4c\xac\x87\x4d\x7a\x06\x68\x6e\x28\x15\x1a\x27\xfd\xd1\x54\x3d\x37\x35\xf2\xbb\x96\x3a\x5f\x8c\x5b\x8e\x33\xe7\x8c\x8c\x70\xe2\x44\x40\x4f\x9e\x3f\xbf\xfe\xcb\xcb\xc7\xcf\xcf\x9f\x3c\x3c\x7d\x1c\x27\x02\x3a\x60\x97\x31\xca\x08\xf4\xfe\xa0\x7d\x86\x36\x00\xa2\x9a\x48\x0b\x74\xf3\x1e\x79\xec\x36\x91\xfa\xfd\xe6\xd4\x47\x30\xfe\x9c\xe2\x9a\x23\x35\x98\xc8\x8f\x18\xb8\x2e\x9d\x7a\x1c\x84\xae\x4a\x22\x55\x5e\xaa\x0c\x7a\x24\xa5\x56\x6b\x24\xc5\xd6\x61\xb3\xbc\x8b\xf3\xe0\xee\x2b\xea\x9f\xe9\xbf\xdb\x72\xbf\x98\xce\x05\x24\x71\x99\xe5\x81\xf8\xc2\x37\x13\x56\x42\x63\x99\x0f\x4a\x1d\x66\x7d\x2e\x94\xba\xa4\xe2\x09\x75\xe8\x27\x04\xde\x67\x93\xc5\xc3\xb6\x69\xff\xf2\xef\xa2\x6d\x2a\x28\x2c\xd5\x9c\x47\xe6\x96\x87\xb9\x4d\x05\x63\x49\x7b\xd0\x07\xcf\x97\x8a\x05\xc9\xfc\xf1\x3b\x4e\x42\xe2\x8b\x89\x0a\xa1\xd2\xdf\x13\x23\x03\x06\xcc\x95\xea\x53\x3b\x08\x3a\x1c\xd2\xf7\xca\x74\x84\xfd\xfa\x62\xd8\xaa\x6e\xde\x46\xda\x69\x36\xfa\x2d\xe5\xe9\xc9\xe4\x89\x9e\x21\xe6\x0b\x2d\x5f\x43\xbf\x68\x61\x3a\x13\x29\x03\x35\xe6\xc2\x6f\x3f\xf0\x56\xb4\xa7\x22\x24\x1c\xd7\x09\xef\x68\xfc\x54\xb1\x85\x0e\x28\x71\x8e\x1c\xe7\x4f\x5c\xa2\x7c\x20\x51\x97\x24\x19\xb0\x11\x6c\xcd\xb4\xef\x24\xfe\x77\x98\x00\xb3\x2f\xd1\x14\xe2\x6a\xd3\x73\xe0\x17\xf2\x27\x64\xee\xa6\xe9\xd0\x34\xf2\xa5\xc4\xa5\x08\x26\xb6\xc6\xcb\x3e\x59\x27\x7e\x14\xe2\x89\x83\xdf\x9c\x9a\x1c\xdb\xe4\x0e\x26\x37\x70\x74\x1a\x57\xfc\xe8\xf4\x26\xe7\x74\x1c\x4f\x28\x4e\x5d\x5f\x89\x47\x38\x27\xc9\x38\x72\xd1\xc2\xa7\xac\xfe\x64\x26\x37\xa4\x86\x90\x0a\x93\xcf\xb5\x7c\x62\x90\xb7\x23\x5a\x85\x1f\x96\xf8\x1e\x58\xbf\x9a\x3a\xa0\xd9\xea\xb0\x31\x73\x22\x33\x62\x79\x18\x67\xb0\x66\x03\xb1\x71\x16\xc2\x4f\x43\x47\xc3\xc7\x51\x56\x30\x20\x45\x51\xf1\x34\x21\x11\x0f\xd3\x07\xf2\xd5\x45\xb1\x07\x6d\x3a\x7c\xbd\xd2\x7e\x38\x78\x39\x48\x3b\x45\x06\xd1\x25\x56\xbc\x30\xea\x71\x3a\x77\x5c\x4a\x29\xa6\x0d\xa2\x07\xc2\x01\x52\x9a\x45\x4e\x2d\x18\x14\xb3\x32\x3e\x27\xa2\x91\x95\xdd\x6c\x1c\xce\x59\xba\xe3\x34\xa9\x2b\x27\x09\x1b\xc2\x7a\x3c\xac\x23\x29\x74\xc5\x87\xf8\xbb\x59\x8c\x1f\x86\x50\x33\x00\x7f\x56\x6e\x06\xb3\x71\x53\x47\x80\xc3\x17\x20\x9c\xee\x17\x12\x92\xc0\x2d\x49\x53\x60\x3a\x5c\x12\x52\xa2\x1d\x46\x27\x7f\xf3\x5c\xfc\x0d\xfc\xd8\x6c\x5c\x24\x24\xb1\x3e\x3c\x8c\x3b\xfe\xe6\x99\x1c\xba\x41\x87\x37\xe7\x38\x9e\x14\x42\xfb\x1f\xc4\x15\x87\xa6\x9c\xb0\x6c\x8f\x5c\xe6\x20\x01\xd1\x04\xf6\xd5\xda\x91\xf9\xca\x03\xd6\x8e\xc3\xb8\xe0\xb3\xd9\xf0\xde\xf8\xd1\x62\x75\x57\xfe\x28\xf8\x56\x0c\x47\x55\x0b\x4d\xc9\x26\xe3\x2d\x52\x43\xaf\x35\x3d\x32\x2c\x30\xa8\x35\xe5\x8c\xeb\xab\xac\x9d\xd0\x2d\x0a\x83\x42\x48\x8a\x36\x64\xcd\x81\xdb\x99\x09\x25\x72\xe6\x07\xde\xf5\x57\xd9\xba\xb0\xdb\x65\x53\xb4\xeb\xf9\x0b\x30\xd9\x05\xab\x93\x50\x3b\x83\xb9\x83\x55\x67\x34\x4d\xf5\x25\x78\xe8\x7d\xa1\x7c\x4e\x84\x95\x6c\x36\xb9\xa3\x48\x11\xb7\x05\xb7\xa9\x7c\xcc\x03\xfd\x19\xf2\x23\x88\x55\x99\x10\xa0\xce\xb8\x2c\x53\x2b\x6e\x62\x97\x10\x12\xec\x5c\x5d\xeb\x6c\xb6\x6b\xea\x52\x8c\x74\x89\x13\xa4\xb5\x15\x92\xce\xc6\xfb\x9b\x9f\x39\x2f\x73\x49\x57\xcc\x65\xde\x73\x38\xeb\x9a\xae\xa8\xe6\x2f\xf0\x5f\x84\x6f\x5d\x67\x61\xf1\xac\x34\xa0\x7d\x23\x0a\xed\x5c\xff\x62\xaf\xab\x50\xa1\xd9\x9b\xd6\xad\x3b\x18\x3d\xc5\x3d\xd0\x2c\xcd\x8e\xf5\x1c\x3d\xd0\x09\x42\x4b\x21\x47\xa3\x4e\x7e\x6a\x2c\xf1\x11\x47\x4c\xf4\x42\x62\xb9\x04\xdb\xf8\x66\xa3\x32\x2a\x7e\x77\x96\x2c\xb6\x5e\x7e\x95\xc8\x77\x8f\xa3\xf2\xf8\x81\x48\x3e\x88\x7a\xd3\xbb\x91\xc5\x9f\xdc\x95\x88\xcb\x6c\xb4\xb1\x71\x6e\xb3\xa4\x12\xb2\x35\x25\x05\xe2\xb9\x30\x28\xc2\x2d\x8f\x4b\xbc\x95\x7f\x34\xb9\xc8\xd6\x7f\x50\x7e\x28\x79\x72\x32\xc6\x12\x32\x0c\x96\x6e\xc5\xc5\xe2\xc5\x95\xce\x58\xf5\x13\xe9\x20\x35\xee\x8a\xa4\xcc\x23\xa8\x45\xb8\xda\xf8\xbb\x33\x6e\xfc\x58\x3f\x12\xb9\x2f\x59\xe9\xf5\x3f\x71\xf8\x2f\x34\x8f\xcb\x15\x15\x4e\xd6\x5d\x0f\xcd\x3e\x42\x15\xa7\x8e\x99\x4d\x41\x63\x9a\x0b\xfd\x28\x80\xe6\x64\x65\xfb\xb6\x44\x1e\xae\x87\x85\x5d\xb1\xac\x78\xaa\x4e\xdb\xd7\x44\xd7\x23\x76\x5b\x97\xd4\x40\x2c\x15\xc4\xf3\xe1\x94\xd3\x8d\x24\xb9\x23\x0c\xcf\x84\xb9\x06\xf5\xc6\x11\x89\x2d\xe0\x77\x7c\xd1\xed\x8d\xcd\xfd\xd3\xcb\x3e\x1a\xf2\xc5\x35\x8c\x78\x76\xff\x20\x0f\x45\x12\xa1\x6f\x7d\xcf\xc5\xd2\x8f\x99\x22\xe5\x6b\x6d\x44\xd8\x78\x1a\xcb\x41\x97\x1a\x06\xda\x4f\xea\x28\x9d\xec\x54\x37\x7f\xd3\x94\xf9\x59\xc1\x03\x83\x00\x87\xe9\x64\x5d\x30\x44\xf7\x35\x8f\x73\xdc\x7d\xa4\xa7\x78\xb6\x37\xf6\x33\x35\x69\xf3\xd1\x59\xf3\x33\x5f\x6f\xe4\x59\x9b\xda\x62\xdf\x7d\x71\x55\x28\x7d\xd6\x2b\x79\xe6\x95\x8b\xdf\x40\xb1\x7c\x63\xcf\xe3\x3d\xff\xc4\x7e\x7f\xd9\x51\x6c\xca\x6e\xb1\x59\xe9\x62\xe0\xfe\xc0\x62\x2b\x37\x1e\xdd\xce\xee\xe0\xde\xc7\x4d\x6f\x98\x6d\x23\x16\x04\x20\xfe\x90\x4c\xbf\x60\x1a\x05\xa3\x1c\x9c\x13\x21\x44\x44\x47\x40\x9c\x6b\x6b\xb7\x6c\x71\xf2\xfc\xfa\xc3\x3d\xa6\xd9\xc4\xc0\xd4\xe7\x80\x98\x51\x85\xfb\x92\x54\xa1\x7c\x6f\xd8\x04\xc3\x1e\xe5\x77\x0a\xe7\x69\xa6\x64\x94\x3c\x04\x54\xc9\xde\xe3\xc7\xe5\xb2\xf1\xb9\xd6\x79\x1b\x8d\xbd\x7b\xe3\xf8\x53\x20\x35\x78\x5c\xa2\x6d\x6f\xdd\x64\xbb\x1b\xa0\x29\x1a\x24\x32\xca\x4a\x57\xea\x41\x4a\x04\x3b\x8a\x26\x83\x14\x2f\x01\xe6\x3b\x1c\x32\x16\xe2\x9f\xa2\x5e\xc7\x69\x6a\xcc\xd8\x7e\x3d\xb1\x56\x66\x21\x9a\x13\x7d\x1e\xd8\x87\x78\x8a\xe3\xb3\xfe\x94\xe9\x4d\x6c\xcf\x4d\x9b\x03\x81\xd8\xe0\xaa\xd1\xce\x94\x51\xa6\xdd\xf1\x7d\x83\xe0\xab\xf1\x37\x03\xa3\x1f\xb8\x6f\x53\xdd\x8f\x57\x65\x7c\xa0\x1b\x7e\x65\x63\x82\xe0\x23\x43\xa5\x8b\xf5\x93\x1e\xdf\xc3\x98\x2e\x62\x8f\x5b\xda\xe8\x8e\xb0\xc9\xfc\x7b\xfe\x87\x49\x28\x94\xf7\xc9\x5b\x44\xac\x1f\x48\xdf\x4d\xd3\x12\x34\xd2\xc3\x3d\xff\xc6\xfd\x05\x06\xb0\xe3\xe8\x76\x76\xa2\x01\x31\x13\xc8\x6f\xd4\x73\x44\x20\x47\xda\x02\x1c\x9e\x42\xd1\xc4\x9e\xf0\xda\x3a\x6a\xcc\x74\xa3\x6b\x0a\xed\xc1\x4a\xb4\x4b\xae\x09\x7f\x37\xc8\x3d\xd6\xf4\x6c\x85\xe2\x5b\x6a\x9b\x66\x09\x3e\x34\x6e\x42\x25\x88\xd7\x14\x55\xdd\x37\xac\x84\x58\x54\x04\x48\xfd\x7e\x81\xb5\x83\xfe\x65\xd1\x18\x6d\x3b\xd1\xc7\x12\xae\x94\x9f\xd7\x33\xae\x9c\x6c\xc9\x60\x7a\x83\x0e\x8e\x1e\x54\x4e\x97\xe0\x97\x3a\x6e\x7c\xd1\x9a\x61\x43\x93\x9f\x96\x4b\x2f\x6b\x9e\x68\xea\x76\x76\x6b\x8a\xfd\xc4\xbe\xbe\x28\xe8\x5a\x7e\x4b\xdf\xe2\x5b\xc5\x75\x0f\xee\x4d\x68\x32\xb1\x4d\x71\xd3\x72\x8d\x8c\x83\x13\xcd\x88\x89\x79\x0e\x80\x3e\xd4\x8e\x4d\xe8\xa6\x8f\xff\xa3\xf3\x55\x55\xeb\xf4\x7c\x2b\xde\xab\x14\x06\xb8\x71\xb3\x7c\x4d\xf8\x1e\x89\x93\x5f\xe3\x39\x99\x1c\x65\xd9\x34\x1d\x98\xe0\x3d\x78\x08\x36\x37\x1f\x6e\xe6\x19\xdc\x62\x1e\xba\x6a\x29\x47\x41\x0d\x0e\xee\x28\xb7\x1b\xef\xe5\x0e\x19\x82\x69\xb0\xb6\x67\xa9\x84\x9d\x18\x11\xd7\xfa\xdc\x57\xc8\x9f\x9e\x53\x8b\x9b\x7a\xf0\x63\x0f\x1b\xb9\xe1\xe3\x33\xd9\xad\x0a\x42\xd0\xbf\x6c\x02\x27\x68\x72\x63\x1f\x93\x53\xe0\x66\x53\x73\xd8\xb7\xcd\x05\x8d\x46\x28\x70\xd9\x83\x3f\x41\xc0\x8c\xed\x82\xad\x8a\x42\x4f\x67\x5c\x49\x43\x5a\x9d\x2b\x8f\xcc\xec\x32\xdb\xeb\x52\x0b\x7c\x93\xde\x63\xea\x60\x45\x47\xd2\x15\x6c\x38\x17\x1f\x0a\x15\x79\x3e\xef\x64\x6a\x52\x0d\x91\xc0\x88\x8f\xc4\x0c\x65\xe1\x6f\x6e\xe8\x24\xba\xcd\xa2\xfa\xe2\xb8\x0c\x8e\x4f\x9e\x38\x6a\xa4\x27\x10\x4a\x65\x75\xb5\x82\x79\x0d\xd4\xad\xa2\x6b\xa1\x29\x68\x54\x81\xa8\x3e\xb3\xcf\x54\x9f\x31\xf1\x23\x1f\x52\x73\x0d\x5e\x9a\x1e\x9e\x6f\x4e\x46\xe8\xd1\x55\x3e\xe3\xb8\xa4\xd4\xa9\x60\xc5\xa9\x7a\x7b\x54\xf1\x15\x27\x46\x95\x0a\x21\xe4\xd7\x44\x55\x1d\xce\x21\x2a\x7e\x9a\xa8\x82\x08\x2d\xc4\xcb\x73\x57\xd4\x88\x4e\x46\xc0\x67\xaa\xf9\x37\xf4\xc2\x3b\x78\x4a\x44\x1a\xd2\x00\x4a\x7a\xaf\x0b\x1b\x25\xff\x15\x52\xdf\x55\x55\x86\x4b\x7f\x3a\x4e\x61\x2d\x51\x5e\x10\x98\x49\x3f\x4c\xc5\x0a\x93\x4f\xf2\x98\x7b\x19\x89\x14\x6a\xa6\x11\x4d\x65\xe1\x4a\xd9\xeb\x42\x1e\x61\x8d\x53\x71\x71\x95\xe8\x43\x9e\xc5\xfe\x9a\xeb\xa3\xf4\xc5\x16\xd1\x52\xec\xa8\x12\x96\x3b\x76\x96\x66\xdb\xe7\x51\x1c\xca\x91\x8f\xb7\x74\x91\x98\xda\xe9\x8a\x99\xa9\x13\x63\x53\xb1\x2f\x65\xf9\xf8\x40\xe4\xa3\x95\x39\xf5\xb6\xe8\xb5\x8d\x8d\x3b\xa8\x1a\xe2\xc4\x17\xd3\x7e\x36\x87\xbb\xdb\x13\xfb\xf9\xb6\x69\xd7\xde\x29\xa1\x60\x4b\xb4\x7b\x95\xe4\x4b\x4c\x22\x5a\x8a\x0a\xbb\x75\x2b\x51\xc2\x4e\x30\x41\x88\xcc\x29\x97\xfe\x06\x95\x71\xd8\x07\x0f\x3a\x71\x8c\xcb\x93\x18\x68\x76\xc5\x3b\xcd\x30\xed\xb2\xde\x3f\x8b\xf2\xda\xf7\xbb\x84\xb2\x5a\x25\x10\x30\x6a\x2a\xd2\xd5\x3b\xc1\xd5\xe1\xde\xe7\xb2\xbc\x10\xfc\x08\xce\x7b\x3b\x58\x13\x6c\xaa\x66\x59\x48\x94\x72\x56\xb2\xd2\xee\xdd\xd5\x7e\x91\x66\xd1\xc3\xee\x89\xb7\x7d\x77\x91\x28\xa0\x6a\xd4\xad\x6d\x9b\x6d\xb9\xa4\x55\xf2\xc9\x0c\xaa\x7a\xcb\x09\x18\x42\x1a\x11\xaa\xac\x02\x48\x60\x10\xbe\x07\xa1\x95\xd3\xa7\xf0\x05\x1b\x58\x85\x14\x53\xb7\x85\xed\x35\xe0\x62\xc7\xb4\x77\xd4\x93\xaa\x57\xf8\x4e\x17\x51\x82\xfd\x34\x81\x15\xcb\x84\xdb\xc6\xf1\x71\x4c\x07\xc7\x1d\x4b\x0e\x79\x49\x0e\x7f\xa0\xf3\x20\xd9\xb6\x79\x2d\x89\xfd\x39\xe8\x0b\xdf\x2e\x69\x9f\x4f\x64\xa0\x9f\x84\xaf\x09\x17\x15\xf9\xa2\xb5\x6f\x30\x2b\x48\x41\x8a\xf0\x19\x71\x25\xcd\xdb\x5a\x93\x9b\x8f\x37\xd8\x47\xc6\x8e\xe7\xa6\x1e\x81\x92\x79\x38\x08\x86\x6d\xe4\xf6\xdc\xf4\x12\x96\x23\xc4\x8a\x98\x25\x63\x22\xa6\x14\xdb\x60\x25\x90\xe0\x47\x53\x7d\xae\xfa\xbf\xf7\xec\x01\x58\x32\x8f\x9e\x48\x29\x3f\x6d\x22\x08\x22\xae\x79\xe2\x57\x6e\xb8\x59\xbc\x55\x03\x37\x6a\x9d\xd0\xc7\x43\xa9\xd2\x5c\x24\x18\xc1\xc1\x67\x22\x15\x6f\x73\x7d\x8f\xfb\xf9\xd7\xc0\x42\x8c\xcb\x86\x06\x62\x22\x16\x67\x8c\x7f\x78\x24\xff\x12\x48\xe5\x29\x75\xbc\x7c\xf1\xe3\xcb\xcf\x81\x65\x80\x14\x72\xaa\x7d\x16\x26\x95\x97\x25\x2e\xbe\x96\x23\xbd\xbe\xe5\xfc\xfa\x6e\x9c\x41\xde\x76\x96\xd5\x2b\x12\x4e\xa6\x7a\x86\xff\xa6\x9a\x4e\x37\xf3\x21\x36\xb6\xda\x09\x82\x63\xc7\x8e\x3d\xde\xe0\x4d\x9e\x87\x29\x3c\xae\x0d\xdd\x0a\xe5\x67\xc8\x02\x26\xbf\x0d\xe7\xca\xf4\x6f\xad\x96\x4e\xd9\xfb\x45\x8b\x89\xbc\xab\x0e\x0d\xcb\xf5\x52\x51\xea\x81\x9a\xd6\x10\xc7\x53\x76\x57\xb8\xcf\x5d\xb3\x6a\x2a\x1c\x14\xff\xc1\xc4\xa0\x85\xe0\xb4\x85\x51\x80\xd6\x1f\x78\x53\x49\xe1\xb6\xb1\xdd\xfc\x5b\xc4\x51\xd0\x02\xa0\x90\xf9\x19\xfd\x47\x7f\xb3\x94\x74\x5d\xcf\x1f\x42\x26\xfa\xe8\x59\x5c\xea\x5e\x3a\xf9\xb6\x6b\x18\xf5\xa2\xd0\x4c\xd5\x72\xef\xe1\x03\x0e\x21\x46\x95\x98\x2c\xf8\x22\x3f\x31\x49\x53\xbe\xc1\x96\x96\xf1\x46\xc2\x5c\x70\x5c\xe8\x59\xfe\x4c\x1f\x5f\x24\x20\x29\x24\xa8\x7a\xdc\xc8\xe5\x0d\x62\x7c\xd9\xa8\x21\x04\x80\xb2\xac\xae\x7f\x42\x98\x50\x24\x90\x03\x49\x34\x73\x07\x05\xba\x8c\xf3\x7b\x44\x34\x18\x28\xea\x76\xb5\xcd\x39\xe5\x47\x54\x8f\x96\x1f\xd7\xf2\xbb\xa0\x6e\x93\x9d\x09\x0e\xb9\x0f\xb4\x68\x1c\xb8\xef\x60\x9b\x44\x99\x27\xd4\x42\x1b\x91\x0a\xf1\x5b\x7a\x59\xb8\x0c\x3e\x30\x28\xec\x25\x64\xf6\x18\x94\xbc\xd5\xf6\x60\x0a\xb3\xd1\x1c\xd2\x39\xaf\x7b\x36\x26\xaf\x3d\xd0\x87\x8a\xb6\x6f\x47\x75\x5d\x32\xe4\x62\x07\xe5\xde\xa8\x09\x81\x59\x15\xd5\xe7\xc4\xb1\xf7\x50\x38\xac\x69\xc1\x07\x03\x56\xc0\x4d\x00\xbd\x3a\x75\x26\x0b\x8b\xb5\x56\x48\x7a\xcc\x26\xf8\xef\x5c\x30\x06\x09\xaf\xe0\x8f\x44\x42\x37\xbb\xe4\x2b\x13\xdb\xcf\x0a\xe2\xb4\xd6\xe0\xad\x97\x8a\x3b\xd0\x0b\x0b\x5b\xcc\x9f\xc2\xfa\x24\x3f\x7f\xe0\x6e\xdd\xae\xdb\x2f\x58\xe7\x70\xe0\x1e\xe7\xe7\x4f\x5f\x9c\x45\x95\xc3\x0d\x1b\x7e\xf1\x57\x2d\xfe\xe0\xa2\xd1\xc8\x6d\xb5\xee\xba\x46\x01\x67\xec\x74\xcd\x4f\xa1\x37\xe9\x1d\xe8\x20\x6f\x5b\xb7\xaa\xe4\x93\xbe\x67\xf9\x99\x7f\x19\x5d\x19\x7c\xba\x59\xcb\x2d\x92\x59\xe7\xfd\x24\xe1\x1c\xd8\xfd\xa0\x6c\x37\x3d\x0d\xf2\xf3\xbf\x1c\xe7\x3f\xff\xfb\x2c\x41\x8b\x8b\xae\xb2\x71\x58\xd3\x93\x6d\x79\x71\xa1\x8c\xc0\x8b\xd3\x73\xb7\x07\x6f\xca\x3d\x6a\x2e\xe0\x9e\x4a\xcc\xc4\x33\x99\xe4\x25\xe2\x6d\x32\xed\x1a\xaa\xee\x61\x1f\x61\xda\x4b\x84\x8a\x8e\xfd\x42\xce\xa5\x2c\x3f\x7b\xf0\x34\x9d\x00\x27\x9d\x70\xdc\xca\xfc\xc4\x69\xd8\xf2\x07\x21\x7f\x85\x43\xec\xe5\x1e\xc2\xf6\xda\x9a\xb2\x72\x5b\x9b\x64\xe6\x92\x60\x99\x89\xa1\xea\x21\xdc\x1d\x38\xb0\x21\x50\x38\x67\xe9\xf0\x2a\xa5\x6c\x0f\x5e\xa4\x11\x24\xfd\xfc\x2f\xb7\x2d\xed\xed\xcd\x9e\x89\xb3\xe4\xe9\x39\x60\x98\x3a\x05\xa7\xc5\x47\x4d\x51\xe3\x8e\xc7\xd4\xe2\xc7\x36\xc5\x6d\xe6\x44\x68\x3a\x8e\x37\x37\xbd\x87\x8e\xea\xe4\xe7\x72\xda\x72\xe7\x13\x5a\x46\x66\x1f\xa3\x75\x5f\x16\x0e\xa6\x23\x7b\x9e\xcb\x03\x1e\x19\x0a\xa9\x4c\x6d\x96\xea\xf0\x7a\xa0\x5f\xc9\xd6\x21\x99\xca\xd5\xc8\x5d\xd9\x1d\x91\x8a\xd8\x81\xce\xdc\x51\x97\xb8\xaa\x96\x1d\x93\xa2\x48\xa0\x03\x07\x2a\xe7\x16\x2f\xe2\x95\x4e\xfd\xb3\xad\xec\xca\x31\x47\x62\xee\x66\xf1\x3e\x24\xc4\xe8\xe1\xb3\xbf\xc1\x6f\x53\x94\x14\x4e\x14\x3e\x65\x1c\xe1\x2e\xa0\x64\xcf\xe6\xda\xc5\x7e\x3f\x24\x5e\xf6\x7b\xef\xb8\x16\x55\xa2\x3e\x9d\xaf\xde\x8d\xf5\x92\xd0\x15\x13\x75\x06\x44\x8d\x96\x36\x17\x17\x15\xfd\x44\x4e\x39\xf6\x16\x32\xa2\x6e\x62\xcf\x27\xdf\x52\x7c\x39\x16\x2d\xd3\x86\x60\x29\x21\x07\x09\x51\x1c\x8b\xfc\x77\x0d\x1e\xbd\x2a\x0a\x02\xfe\xbc\x71\xb9\xc2\xb9\x8b\xb6\x67\x88\x68\x13\xea\xc0\x9b\x59\x44\x95\xc2\x3c\xe0\x3b\x21\x2a\xed\x68\x11\x4c\x93\xb7\x4d\x03\x3b\x11\x7a\x58\x1e\x4b\x3e\x7b\x6f\xa9\xee\x89\x72\x77\x24\x10\xbe\xaf\xd8\xc9\x32\x6a\x75\x22\x1a\x26\xfe\x28\xe1\x87\x22\x3d\x48\x5b\xac\x80\xd4\x5d\x0f\xb4\xd8\x61\xf3\x78\xd0\xe7\x5c\x1b\x0b\x76\x9e\xa0\xba\x15\x7e\x06\x6c\xde\x98\x06\x0b\x38\xe7\xb2\xb0\x24\x80\xac\xde\x46\xde\x23\xf5\x0a\xa3\x63\x1c\x21\x47\x3e\xdc\x68\x0f\x03\xf0\xd9\xed\x34\xe4\x9d\x9f\x7f\x1b\xd7\x19\x12\xe3\xd1\x27\x30\x1b\xdd\x62\xd9\xd3\x53\x4f\xf7\x57\xa0\x19\x07\xbd\x2b\xda\x56\xe3\x65\x0b\x08\x43\x80\x80\x58\x06\x69\xf3\x69\xf8\xc2\x97\x40\x28\x47\x85\x1c\xa9\xa8\x0e\xdf\xc4\xbe\x14\x50\x13\xd7\x9a\xde\x75\x39\xa3\xb8\x1e\x5c\xb1\x39\x7e\x55\x7c\xc0\x2e\x5e\x95\x0f\x19\x30\x68\xb1\xc1\xf8\x51\x7d\x09\xd5\x63\xf2\x0d\x11\x76\xac\x3e\x61\x0a\x12\xde\xe5\xe6\xc2\xe6\x77\x6e\x51\xb3\x7b\xd2\xec\xd6\xdd\xb8\x2b\xd0\x44\xbb\x7e\x27\x8e\xf4\xe5\x7b\x23\x49\xb0\xe6\x2f\xe5\x75\x8e\x4e\xae\xc8\xab\xa6\xde\xf4\xbe\x5b\x7e\x52\xa8\x2d\x64\xae\x37\xf4\x47\xec\x1e\x3c\x47\x45\x60\x9a\xb4\xb2\xfe\xfc\xd7\xcb\x03\x88\x87\x87\x7d\xa8\xb6\x4a\xce\xf9\x3b\x6a\x15\xb8\xb5\x50\x16\xb1\x3a\xa1\xd0\x73\x79\xa1\x68\x78\xa3\xa3\x4f\xd6\x56\xd1\x5d\x3e\x3f\x3f\x9d\xf8\xe6\xe8\xb0\x3b\xb7\x90\x91\x14\xf9\x04\x6e\x45\xc1\x20\xee\x46\x2d\x86\x10\x30\xf8\xe4\x3b\x62\x0a\xee\xe7\x7f\xc9\xed\x1f\xab\xb2\x33\xbf\x01\x45\x60\x3a\x14\xbc\x78\xf2\xe8\x21\xfd\xba\x9b\x20\xeb\x92\x5d\x82\x0f\x63\x6b\xfa\x1e\x2e\xa9\x4a\x73\x0d\xc8\x72\x1f\x2a\xfa\x99\x08\x96\x20\xb5\xe3\x28\x12\x52\xac\xca\x6a\x7a\xcf\x94\x8a\x1f\xe2\x51\x47\x6c\x25\x58\x94\xcd\x52\xbc\x35\x74\x80\x55\x78\xcf\xab\x7c\x58\x44\x89\x9a\x31\x24\x72\xcb\x77\xd9\xe1\x87\xa2\xe4\x30\x7b\xc9\xca\xea\xb2\xb4\xb2\xa7\x6d\xa0\xf4\x9a\x25\xa1\xfb\xa2\x6b\x7c\x56\xa1\xc8\x01\x57\x7b\xe0\x55\xab\x24\x5b\xa4\xd7\x34\x30\x56\x38\xb5\xbe\xc1\x3d\x18\xbc\x15\x97\x13\xd7\x82\x3d\xa3\xcd\xc1\x4b\xa1\x94\xea\xaa\xd8\x77\xab\x6d\xa1\xe4\x32\x87\xa4\x3a\x91\x22\xff\x0e\x4a\x90\x1b\xf8\x79\x2f\x2a\x36\xcf\x39\x65\x99\xaa\x15\x75\x2c\xfd\x47\xa2\xe2\xf8\x7d\xb1\xa6\x0b\x6c\x77\xd4\x6c\xa0\xb4\xa7\x91\x9e\x12\x13\xfd\x08\x6a\x0d\xab\x02\xc6\x41\xcf\x1e\xb2\x5c\xac\xb0\x49\xc8\x72\xa1\x67\xb4\x2e\x81\x7a\x4f\x43\x9a\x7a\x43\xf0\x7d\x1a\xe1\x86\x51\x3c\x3d\xbf\xc7\x12\xa3\x86\x15\x29\x74\xe8\xf3\xc7\xef\xf6\xa5\x83\xda\x23\xe8\x18\x4a\x0f\x38\x9f\xc2\x33\xc4\xe7\x7b\x03\xed\xa2\xb7\x85\x6d\x25\xa2\x03\xd7\x56\x07\xde\x14\xfd\xea\xa0\x82\xee\x68\x93\xc0\xc2\xb7\x8f\x4f\xbf\x1b\xd4\x1d\xe2\x18\x2d\x1e\xe3\x23\xfd\x70\x08\x01\xb1\x06\x86\xdf\x03\x66\xad\x9d\xee\x05\xde\xaa\x6d\x09\xb9\x98\xc9\x11\x73\xd1\x55\xf7\x35\x17\x17\xe8\x77\x3d\x7f\xb2\x13\x57\x11\x3e\x01\x13\xe2\x2c\xca\x7d\xf6\x0f\x0b\x51\xf8\x50\xbd\x7c\x91\xdf\xbe\x1c\x77\x05\x1f\x02\x84\x00\x18\xb7\xd1\x38\xd5\x12\xa2\xd3\x75\x32\xf3\x67\x21\x86\x76\x93\x47\xc1\x96\x76\x69\xbd\xe1\xe6\xbb\xaf\xa2\x63\x3d\x74\xa0\xa2\x92\x4d\xaa\x16\xeb\x02\x09\x0d\xe6\x0f\xf0\xaf\xbe\x7d\x93\x15\x59\x7d\x70\x59\x54\x08\x69\xc4\x7f\x18\x7b\xa0\x26\x34\x0b\x74\x03\x35\xa1\xa4\xab\x12\x0e\x49\x0c\xcf\x0f\xbd\x5b\xfa\x7d\x58\x7d\xdf\x36\xe0\xd6\xdb\xf9\xd7\xa0\xb4\xc0\xc1\xcb\x95\x19\x54\x77\xd5\x0e\x6e\xc1\x45\x68\xee\x67\x4d\x57\xb3\x4c\xd9\x66\x29\x1a\x20\x22\x60\x0d\xf9\x90\xa4\x89\x90\x22\x8f\xb9\x37\x2b\xbf\x55\xa2\x66\x75\xfb\x05\x15\xf2\x70\x55\x55\x79\x61\x54\x73\xdb\x73\x38\x01\xa0\x18\xfd\xe8\x7b\xdc\x76\xdd\xde\x4a\x60\x38\x44\x8b\x3d\x8f\x5e\xcb\xc1\x12\x42\x77\x31\x82\xf0\xcb\xf1\x9b\x54\xb2\xb2\xfd\xc0\x1e\x1d\x3d\x41\x52\x91\x61\x5d\xc5\x05\x73\x27\x50\xd0\x6a\x6d\x39\xe2\x17\x36\xad\xb8\x77\x26\xb7\xfe\x1b\x2d\x1c\x6c\xe9\x85\x81\xef\x11\x67\xc6\x97\x36\xf1\xc6\x4a\x91\x75\x31\x63\x02\xd5\x03\x05\xd3\x21\xf0\x81\xce\x28\xaa\xe6\x26\xc5\x81\x6d\xb6\xe5\x66\x4b\x6f\xde\xb6\x1b\x3e\x4e\xb6\x6f\x97\xad\xda\x52\x23\x54\x5b\x57\xbc\x73\x11\x4a\x39\xe6\x4d\xd4\x21\x74\x7c\xdc\x19\xf8\x27\x3c\x34\x9b\x5a\x5e\x03\x0e\xac\xf3\xb4\x78\x97\x0b\x39\xd2\xd7\x1c\xcb\xca\x71\x18\x77\x0f\xf6\x81\x30\x5d\x44\xd9\x76\x50\x45\x04\x4d\x23\x3f\x8a\x5c\x0e\xb5\x7a\x18\xc0\x75\xae\x91\xb2\x72\xe6\xd8\xa6\x3b\x97\x18\x33\x69\x97\x9e\xdf\xf1\xfd\x11\x1e\x2a\x94\xa4\x48\xba\x21\x30\x2e\xda\x8d\x9d\x3f\x68\x37\xbd\xb7\x28\x0b\x00\xcc\x23\x95\x9b\xd6\xd9\x2f\xe1\x51\xa2\x4d\xad\x8a\x32\x2f\x77\xec\xf1\x91\xfb\x99\x4a\xbd\xe8\x92\x4a\x63\xce\x2c\x75\x53\xdb\xdd\x48\xfd\x26\xf6\xe2\x09\x18\xc0\x87\xef\xc6\x5e\x92\xdc\xbc\xb7\x4e\x50\xff\x56\xdc\x03\xc7\x0a\xfc\xf4\x0e\x10\x48\xf0\xd6\x60\xa3\x3e\xbd\xf5\x37\x27\xb7\xb2\x98\xc7\x3c\x84\xa5\x06\xec\x24\xaa\x46\x2c\x72\xcf\x1b\x82\xef\xce\xcd\x62\xb6\x6a\x89\x36\x7c\xa1\x16\xea\x27\x2d\xb2\x28\xea\x17\xff\xb8\xba\x02\x4b\x75\xd6\x04\x3b\xf3\x33\x82\xf7\x20\x23\xf2\xf5\xcd\xbb\x8e\x35\x52\x30\x33\x71\x85\x1c\xa7\xa5\xe9\x2d\x47\x14\x58\xc1\xe5\x3f\xfa\x68\xde\x19\x58\xa0\x0f\xed\xd8\x22\x3e\xde\x46\x1d\x35\x4e\x65\x8f\x7f\xfb\x90\x0b\x98\x39\xc1\xc0\xf9\xbb\x06\xe3\x34\xa3\x6e\x19\xe0\x5b\xe7\xdf\x9a\x5e\x44\xb5\xca\xb1\x02\x73\x4d\xcd\xcb\x55\x4c\xa4\x0b\xce\x79\xc5\x39\x84\x68\xaa\x3d\xf0\xa8\x23\x7f\x16\x57\x95\x23\x45\xad\x0d\x48\xd7\x85\x06\xfc\xd1\x90\x51\x51\x68\x45\x21\xe5\xe2\xf8\xdc\xbe\xbd\x3a\x60\x30\xa2\xc3\xc6\xf8\x29\x18\x98\x19\xc3\x84\x88\xcd\x76\xf3\x73\x28\x64\x56\x1a\xfb\xc1\xd7\xa2\xdd\x48\xea\xf1\x98\x52\x34\xa8\x29\x19\x77\x80\xb7\xf5\x23\xe2\x66\xa0\x44\x10\x9e\xef\x3d\xea\x9a\xa5\x83\x52\x1f\x36\x59\x5e\x1f\x5b\x89\x7a\x88\x36\x98\xf1\x40\x68\x5b\x03\x29\x0f\xda\x63\x62\x93\xc6\xf1\xf1\x6e\x84\x56\x81\x0f\x8d\x4b\x16\x9f\x3b\x93\x9b\x78\xe5\x29\x1c\xb8\x0f\xcd\x3e\xf2\xf2\x19\xad\xc6\x8b\x90\xa3\xc1\xa3\x04\x60\x07\x0d\xe9\xb3\x1f\xe4\xa0\x5e\xb9\xd8\x20\xac\xb9\x2f\x9c\x99\x4d\x70\x21\x4b\xe3\x3a\xde\xe6\xf0\xb7\x59\x6b\x6a\x9f\xc8\x09\x09\xb1\x97\x44\x5b\xb1\xf1\x72\x95\xe4\x32\x71\x49\xd0\x3f\x1f\x26\x47\x0f\xb9\xe2\x7f\xfd\x0a\xbd\x4a\x9a\x74\xea\x58\x13\x56\x6a\xc7\x12\x04\x96\xbd\x53\xd3\xec\xf2\xb6\x5d\xdd\x1f\xb6\x65\x77\xe2\xb4\x1e\xbe\xfe\x83\xeb\x59\x96\xc9\x8a\xe6\xf9\x8f\x85\xc6\x48\xc5\x33\x46\x57\x76\x59\xf1\x76\x45\x4b\xbd\x2f\x1a\xe9\xfb\xb2\xe8\x5f\x69\x82\x77\xe4\xae\x97\x8c\xc9\xda\x8f\xcb\xa9\x86\xc2\x4f\x6b\xae\x89\xd9\x07\xed\x61\x85\x2d\x33\xfa\xc4\x6e\x74\x39\x69\xfa\xfe\x24\x83\xb7\x9c\xa4\xd1\x08\xc7\xbe\x47\x4d\xcc\x7f\x60\x59\x37\xf4\x27\xc1\x64\x3f\xa9\x2f\x5d\xe3\x0d\x9d\x85\xf5\x7e\xe2\xec\xc4\x3d\x2b\x1c\x9f\x16\x08\xc8\xfd\xc2\x13\x9c\x48\x20\x3e\x58\xaa\xcf\xfc\xff\x89\x9b\xe7\xd3\x96\x28\xe0\xc6\x59\x49\xe2\xab\x24\xf7\xc1\x5f\x86\x04\xb0\xc3\xed\xe2\xa8\xb8\x5d\xb1\x09\x37\x40\x03\x49\xc5\x53\xe1\x2b\xc0\x10\xfe\xeb\x1b\xe1\x3f\xba\x59\x08\xae\xa8\x29\x61\xa1\xf0\xe2\xdf\xa2\x6a\xb8\xbd\x76\x01\xe8\x08\x31\x74\x4d\x53\xbd\xca\x8a\x4d\x33\x97\x78\x7c\xd9\x45\xdb\xec\x38\xf8\x01\x14\xb0\x19\xfe\x88\x52\x69\x7e\x6e\x91\x59\xf6\x73\x17\xc9\x3e\xfb\x7c\x27\xbf\x25\xef\x65\xf6\xf9\x56\x7e\x22\x29\x04\xfd\x5a\xcb\x2f\x36\x8b\xf8\xfc\xad\x6b\x29\xa2\xd5\xcf\xe9\x5d\xd3\xb6\x4d\x69\xb3\xcf\xaf\xe4\x47\x81\x20\x1e\xe8\x9b\x06\xc2\x5a\x73\x2c\x6d\xed\x23\xe7\x67\x32\x50\xfa\x51\xcb\xb2\x2d\x1e\xde\xe4\x0b\xcf\x03\x06\xae\x57\x69\x39\xdb\x0b\x65\x6f\x8d\x79\x33\x1c\x46\xb4\xa1\x78\x74\xbb\xed\x60\x14\x4c\xf3\xca\x14\x83\x21\xb0\x49\x6d\xf1\x76\xe1\x66\xed\x67\x8a\x42\x37\x5b\x37\xc3\xec\x87\x75\xdb\xec\x91\x41\xef\x55\xe6\xb2\x05\xbb\x34\xc1\x78\x22\x1a\xab\x79\xad\x3c\x65\x5b\xae\x4a\xd6\x15\xb1\xa3\xcb\x7b\xcd\x8c\x10\x85\xd8\x6a\x67\x99\x4b\x29\x5e\xd6\xfb\x5e\x85\xf4\x83\x34\xf7\x10\x99\x24\x8d\x52\x6d\x01\x07\x1e\x61\x2d\xd3\x2c\x63\x35\x01\x02\x3b\x2e\x89\x90\x3b\x0d\xde\x3e\x1c\xf9\x8b\xe5\x5b\x77\xfe\xf4\x27\xa6\xc5\xcb\xf7\xe6\xcf\x7f\xce\x9f\x36\x77\x19\xe0\x59\xa2\x14\x84\x60\x6c\x5d\x58\x48\x6d\xfa\xfb\xeb\xa8\xc1\xc3\xbb\x08\x1b\xc6\x5e\xc6\x6c\x96\x96\x44\x35\x76\x71\x2a\xb3\xff\x11\x00\x00\xff\xff\x98\x5f\xac\xcc\xde\xed\x00\x00") - -func confLocaleLocale_frFrIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_frFrIni, - "conf/locale/locale_fr-FR.ini", - ) -} - -func confLocaleLocale_frFrIni() (*asset, error) { - bytes, err := confLocaleLocale_frFrIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_fr-FR.ini", size: 60894, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_itItIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\xbd\x4b\x93\x1c\xc7\xb2\x26\xb6\xaf\x5f\x91\xc4\x35\x18\x40\xb3\x46\xd1\x78\xce\xe8\x61\x34\x16\xa9\x66\x03\x20\xa0\x8b\x47\x5f\x34\xc0\x23\x89\x06\x2b\x44\x55\x45\x57\xe7\x45\x56\x66\x31\x33\xab\x9b\xcd\x6b\xc7\x6c\x96\x5a\x68\xa5\x95\xb4\x3b\xda\x8d\xcc\x66\xa5\x9d\xd6\xfc\x27\xf3\x4b\xc6\x3f\x7f\xc4\x23\x33\xab\x01\x72\x2e\x17\x44\x57\x86\xc7\xdb\xc3\xc3\xdd\xc3\x1f\x6e\xbf\x5f\x6e\x7c\xb7\x5e\xbc\xab\x8b\xce\xb7\xd7\xe5\x6f\x65\x53\xfc\x58\xf6\x85\x3b\xf4\xcd\xa3\xa6\xdb\x97\xbd\xeb\x9b\x62\xdf\x36\x35\xfd\xe3\xaa\xea\xc1\xa1\x6b\x66\xb3\xab\x66\xe7\x17\xcf\xe8\x7f\xb3\x8d\xeb\xae\x56\x8d\x6b\x37\x8b\x73\x57\xd7\xbe\xaa\x9a\x62\x53\x16\x6b\x02\x6f\x1b\xfa\x31\xf3\xbf\xee\xab\xa6\xf5\x8b\x27\x1d\xfe\x75\xb3\x2b\x5f\xed\x17\xa7\x25\xb5\x3e\xeb\xca\x6d\xbd\x2c\xeb\xc5\xe9\x7a\xed\x37\xa5\xfc\x6c\x0e\x3d\x81\xae\xf5\xd7\x61\xbf\x78\xe3\xb7\x65\xd7\xb7\xae\x2f\x67\x2d\xff\xe9\xdb\xf4\xdb\x8d\x5f\x75\x65\xef\x17\x17\x25\x0d\xef\x6f\x7e\x35\xbb\xf6\x6d\x57\x36\xf5\xe2\x27\xf9\xd7\xcf\xf6\x6e\xeb\x69\x6c\xdb\xb2\x76\xb3\xde\xef\xf6\x95\x23\xf0\xb7\xfa\xc7\xac\x72\xf5\xf6\x00\x88\x17\x25\xfe\x98\xad\x5b\x4f\x9f\x97\xb5\xbf\x59\x9c\xd1\x9f\xf3\xf9\x7c\x76\xa0\x75\x59\xd2\x02\x5c\x96\x95\x5f\xba\x7a\xb3\xdc\x61\x3e\xe7\xfc\xa1\x29\x0e\xbd\xaf\x7b\x5f\x78\x5a\x1b\x9a\x31\x0f\xdb\x6f\x68\x56\x4b\xd7\xf1\xc4\xba\xae\x29\xfc\xe5\xa5\xef\xfb\x03\x16\x72\x8d\x35\xe3\x26\x6b\x47\x4b\xf8\x8a\x7e\x6a\x13\x33\xbf\x73\x65\xb5\x78\xf2\x08\xff\xd0\xa8\xbb\xee\xa6\xe1\x55\x95\x3f\x68\xf6\xcb\xfe\x76\xef\x17\x67\x4d\x7d\xe9\xdb\x1d\x0d\xd5\xed\xfb\xf5\x95\x5b\x9c\xc9\xbf\x33\x82\xd8\x37\xb4\x18\x4d\x7b\x4b\x2b\x64\x7f\xce\x9a\x76\xeb\xea\xf2\x37\x5a\x2c\x5a\x95\xd7\xf2\xe3\x37\xf7\x1b\xaf\xcd\xae\x6c\xdb\xa6\x5d\xbc\xe4\x7f\x66\x34\xe9\x25\xda\x58\xbc\x3a\x34\xd7\x4d\x91\xb4\x81\x92\x5d\xb9\x6d\xb1\x74\x28\x74\xc5\x4b\xfc\x92\x46\xa4\x90\x1b\x92\x8a\x49\x73\x97\x4d\xfb\x51\xbf\x3e\xa5\x3f\x87\x6d\xd2\xd8\xb4\xbd\x66\x30\x30\x57\xd3\xa6\x70\xf9\x8f\xbe\xeb\x4b\xc2\x88\xa2\xf2\x39\x54\x39\x73\x9b\x1d\x2d\xf4\xde\x11\xda\x65\xd8\xe7\x76\xf4\x9d\x31\x44\x5a\x73\xeb\x75\x73\xa8\xfb\x65\x47\xbb\x40\xdb\xdc\x2d\x9e\xef\x68\x18\xbd\xb4\x52\x6c\xa8\xda\x03\x05\x99\x4d\x82\xcc\x6e\x9b\x43\x40\x81\xc5\xf3\xaa\xe8\x0f\x7c\x24\x80\x00\x52\x36\x5d\x8d\x3a\xee\xcb\xeb\xb2\x2f\x3d\xe1\x42\xcf\x7f\xfe\xfe\xff\xcc\xf6\x87\xaa\xa2\x75\xfe\xe5\x40\x13\xeb\x16\xe7\xf4\x8b\x96\x85\x7f\xcd\xca\xae\xa3\x7f\x81\x5b\xab\xca\xef\xa8\x81\xb5\xab\xd7\x34\xb9\xd3\xba\x26\x30\xda\xe2\x9f\xcb\x9a\x5a\xaf\xaa\xf7\x33\xfd\x63\xf1\x5c\xfe\xd5\x99\xf6\x65\x5f\x79\xc6\x19\x9a\xd7\x83\x32\x2d\x2b\xf6\xbe\x2d\xca\x8a\xc6\x5d\xee\xe8\x24\x5f\x5f\x97\xcd\x6c\xd3\xac\x3f\x12\x72\xe3\x4c\xd2\xb1\xba\xf0\x05\xc1\x97\x84\x8f\x65\x85\x45\xae\x37\x44\x0a\x9a\x6d\x57\x74\x87\xe2\x31\x43\x9e\x70\x23\x97\xee\x9a\x4e\x00\xed\xc7\x76\xcb\xbb\xf2\xad\x2b\x7a\xd7\x6e\x7d\xbf\xb8\xb7\x5c\xd1\x81\xfa\x78\xaf\xb8\x6a\xfd\xe5\xe2\xde\xfd\xee\xde\x77\x74\xae\xbc\x2f\xb6\x87\x72\xe3\xbe\xfd\xca\x7d\x07\xca\x50\xb8\x9e\x30\x5e\x07\x45\xa3\x71\x4c\x31\xdc\x6e\x55\x3a\x6a\xf6\x97\x83\xab\xd6\x4d\xe7\xd0\x2b\xaf\x8a\x2b\xf6\x7c\x7a\xbf\x98\x61\xd1\xe8\xb0\x2f\x37\x2b\xa1\x59\x3c\xb8\xda\xe3\x90\x11\x99\x2a\x5e\xde\x5e\xfc\xcb\x8b\x93\xe2\x9c\x36\x60\xdb\x7a\xfe\x9b\xfe\x47\x15\xfe\x5a\x34\xc5\xdb\xf2\xf1\x0f\xf3\x19\xd5\x94\x25\xca\x30\xe0\xb1\xeb\xdd\xca\x75\x9e\x8b\x71\xc6\xde\x96\x7b\x46\xa4\x8d\x15\x5c\x11\x30\xd1\x3b\xda\x22\x1c\xdd\xc5\x3b\x39\xb1\xe3\x43\x4a\x0d\xc4\x73\x4d\x88\x15\x5b\xa0\x12\x5d\xe6\x77\xba\xbc\xd8\x8c\x5d\xd3\x63\x29\x9f\xbf\x7a\xf5\xfa\xf1\x0f\xbc\x36\xeb\x66\x53\x5e\x96\x6b\x47\xbb\x70\xf9\x3f\x2e\xb7\xbe\xf6\xad\xab\x96\x84\xfe\x58\x79\x9e\xe1\x7c\xd6\x75\x15\x11\xa1\x8d\x5f\xbc\x6c\x36\xae\x22\xa4\xfa\x47\x71\x71\xf1\x82\x86\xd3\x5f\x2d\xce\x7d\xbb\x6e\x5a\xa2\xd1\xdd\x2f\x15\xd6\x4a\x3b\x25\xa4\x45\x71\x41\x03\x6d\xaa\x03\x28\xba\x60\x83\x8d\x6f\xb8\x52\xc5\xb7\xab\xf6\xbb\xf3\xb8\xd9\x87\x8e\xc7\x9b\xb7\x41\x5b\x05\x1c\xa9\x04\x9d\x4a\x26\x6e\xe1\x16\x99\xcf\x7c\xdb\x2e\x89\xce\xf6\xb7\xd8\x30\x1e\x1c\x46\xa1\xe3\x2b\x70\x96\xb2\x25\x1a\x0c\xa1\xa8\x69\x35\xf6\x87\xdf\xff\xbf\x82\xb6\xd7\xd3\x10\xae\x0f\xb4\x58\xd2\x6a\x59\x5f\xd3\xbc\x37\xb4\x97\xb6\xe0\xd4\x72\x3d\x5c\xf3\xd8\x0c\x11\x04\x3a\xa0\x9e\x90\xac\x05\xee\xb5\x65\x71\x6f\x7e\x8f\x68\xf6\xbd\x47\xf7\xe6\xb3\xba\x59\x0a\x21\x01\x6d\xdf\x94\x9d\xa3\xb3\xb7\x6c\xc3\x15\x43\x54\xf3\x15\x8f\xa4\x21\x7c\x40\x29\xed\x5e\x0f\x44\xad\x5c\x61\x50\x82\xcb\x1d\x21\xb5\xa3\xa5\xa0\x55\xe3\x6b\x84\x2e\x87\x3a\xa1\x45\xd8\xe9\x74\x51\x8c\x7a\x29\x0e\xbd\x00\x9e\xcb\xdf\x4a\x92\xb2\x9a\xba\x1c\xcd\x83\x74\x39\xdc\x7c\x36\x33\x14\x99\xc0\x6b\xc2\xe0\x1f\xb0\x0e\xdc\xdc\xe9\x7e\x5f\x11\x5e\x29\x45\xa4\x6b\x3f\x22\xea\x64\x51\xa0\x0a\xeb\x96\x08\x17\xed\x75\x09\x04\xb0\x45\xa6\xc9\xd3\x85\x36\x20\xdb\x05\x91\x7b\xbe\x0b\xd7\x57\x74\x94\x9b\x2f\xf8\x46\x5a\x66\x68\x59\xbc\x69\x9a\x9e\x77\x29\xb9\x0a\x02\x98\xf5\xf9\xf6\x40\xd4\xb2\x28\x8b\x78\xa3\x31\x4f\xd2\x7a\x3a\x2f\x65\xd1\xd1\x2e\xd6\x75\x43\xff\x56\xd7\x0e\x70\xb5\x11\x8a\x4d\xd9\xfa\x35\xc0\xe7\xb3\xf6\x40\xec\x03\xce\xea\x93\xce\x13\xf5\xe1\xb3\x45\xcc\x8b\x1c\x5c\x2b\xb4\xfe\x5e\x68\x01\x0d\xec\xda\xf3\x0e\xd2\xff\xf5\xf2\x76\x09\xce\xb6\x36\xf8\x64\x60\x9e\x91\x1f\x08\x01\x72\x44\x24\xa6\xa1\x0b\xbc\x5e\x3c\x6e\xb0\x7b\x8d\xfe\xb4\x8e\xfe\x05\xe3\x6c\x68\xc4\x97\xd5\x81\x2e\x35\xc2\x99\xc3\xb6\x2a\x8b\x77\x6f\x5e\xd8\x81\x5c\x57\x0d\x5d\x7d\x5b\xe2\xc2\xa8\x51\x3a\xd6\xcf\x70\xdc\xaf\x96\x7b\x5a\xd9\xc5\x39\xfd\x8f\xbf\x85\x4f\xd6\xee\xab\xc3\xce\xb7\x4c\xb2\xf6\x0c\x63\x24\x9c\xfa\x22\x0a\xc1\x67\x92\x9a\xa7\x9a\x27\x84\xb6\x74\x99\x3a\x3b\x4f\xdc\x6d\x8e\xd6\x74\x6d\xf4\xde\x6e\x77\x19\xc1\x55\xdf\xef\xd3\x21\x3c\x7b\xfb\xf6\x3c\x7e\xb4\x41\x48\x19\xee\xdf\x6e\xdd\x54\xe8\x9a\xd1\x38\x41\xae\x39\x63\xd7\xa1\xad\x16\x98\xf1\x08\xed\xa8\xe0\xcf\x2e\x14\x46\xf4\x15\xfe\x77\x41\x1b\xb2\x71\x72\x8b\x5c\xd1\xfd\xe2\x80\x91\x35\x23\x2c\x9f\x8c\xc2\x57\x44\x0a\x88\x9d\xa5\x9e\xe7\xb3\xaa\xd9\x2e\xb1\xa9\x03\x24\xdd\x78\xba\xd8\x9a\x6d\x5e\x6c\x43\x7b\x6c\x48\x06\xc4\x5b\x13\x6a\x75\x38\x21\x40\x99\x52\x89\x1a\x57\xa6\xa3\xd9\xec\x41\x3e\xa6\xcf\xe6\x53\x87\x35\x22\xf4\xbd\x56\xce\x6f\x0a\x48\x99\xc1\x6e\x47\x2b\x1d\xae\xa0\xe2\xe2\x25\xad\x3e\x7f\xbb\x6c\x9b\xdd\xe2\xb1\x8b\x3f\x6c\x8c\x2f\x1d\xd3\x76\x1a\x21\x1d\x09\x42\x84\xe6\xa4\x78\xf3\xf4\xac\xf8\xef\xfe\xfa\x97\xbf\xcc\x8b\xf3\x84\xa8\x12\x25\x67\x32\x15\x00\x0b\x1e\x0c\xd1\x60\xfa\x1f\x1d\xe7\x1d\x50\xe8\x1e\xa8\xc4\xbd\xe2\x5b\x2e\xfa\x9f\x7c\x47\xf4\x8b\xe8\x3b\x51\xfb\xef\xe6\x33\x7c\xa2\x83\x24\x47\x8d\x87\xcb\x07\xe4\x65\xd9\xcb\x51\xd3\xf2\xd1\x55\x99\x43\x19\x6b\xbf\xa4\x63\x7a\x59\xb6\xbb\xc5\xa9\xe0\x63\x61\xdc\x2e\x16\xf5\x4d\x4a\x6d\xb9\xe1\x65\x4d\xf4\xe0\xf2\x36\x40\xbf\xc2\xcf\x12\xfb\x0e\x9c\x78\x22\x8b\xc7\xb8\xbf\xe4\x6b\x69\xed\x27\xc9\x24\x8d\xe4\x42\x4e\x08\xd1\x42\x62\xe3\x4b\xfe\x49\x97\xd8\xac\xb9\xbc\xac\x88\x81\x91\xdb\xd6\x7a\x89\xb7\xee\x6b\x29\xce\xc0\xe8\x48\xec\x49\x6e\x79\x1c\xce\x14\x56\xf2\xec\xf1\xab\x82\x58\x39\x1a\x18\xe1\xcc\x2e\xd4\x27\x1e\x72\x03\x52\x77\xed\x4e\x88\x9c\xe2\x86\x22\xf4\x69\xcb\x8e\x90\xd0\x47\x32\x87\xb1\xa0\xa8\x59\xbb\x6a\x87\xe5\x22\x22\xa3\xd7\x14\x1d\x53\x22\x81\xae\xe5\xee\xb8\x21\xf4\x16\x05\x39\x2d\x1e\xc1\x8f\x07\x69\xa0\x05\x70\x82\x98\xb9\x9a\x08\xeb\xfa\x40\x67\x70\xc7\x74\xc4\xcb\x00\xcb\x02\xa7\x50\x21\xaf\x7d\xbd\x6d\x68\x80\x74\xab\xd2\x61\xea\xc1\x2e\xa1\x94\x49\x69\x59\x88\xac\x43\x53\xf4\x1b\x7f\x49\xa4\x10\x77\xf7\x25\xfd\x0d\x21\x62\xb3\xd4\x61\x54\x4d\xf3\x91\xc6\xf1\xa4\xc6\xe8\x8a\xa7\x56\x5c\x9c\x72\x71\x57\xbc\xe0\xf2\x63\xf5\x74\x16\x5a\x3b\x00\xe9\xf8\xba\x42\xa0\x0a\x5c\xc4\x5d\x5a\xde\xec\x3d\x49\xbb\xc4\xb7\xaf\x95\x5d\xa1\x7f\xc1\x30\x50\x09\x5d\x12\xe5\x4a\x97\x22\x2e\x73\xc6\x0d\x24\x8b\x96\x61\x64\xf1\xd2\xd5\x44\x75\xfc\x64\xad\xf1\x82\x8f\xd8\x87\x9d\x54\x27\x74\x8c\xab\x78\x22\x07\x94\x17\x3d\x65\x07\x40\xe7\xe9\x72\xc2\xe2\x13\xa7\x21\xb7\x15\xe4\x17\xe2\x2f\x78\x31\x96\x26\x1c\x86\x73\xa4\x42\x62\x5e\xac\xa3\x7a\x43\x47\xa6\xf4\x22\xb6\x33\x63\xe5\x0a\x05\x10\x62\x5b\xd4\x24\xa3\xd9\x90\xe6\xc2\x86\x93\x38\xaa\xf2\xfb\xf2\xba\x24\x69\xd9\x3a\x92\xb6\xe4\x32\x2e\x4c\x00\x46\x2b\x3f\x61\xf9\x19\xc1\x59\x18\xf7\x93\xcd\xe8\x80\x2e\x6c\xd2\x8a\x4b\x44\x4e\xb7\x40\x30\x9b\xf4\x75\x68\x8b\x45\x03\x42\xce\x92\x4e\x7c\xc7\xba\x0a\x5e\x9b\x5e\x8e\x8e\xc2\xf1\x1a\x06\x60\xbe\xa1\x4c\x32\xcf\xf7\x60\xae\x22\xa5\x8a\x73\x22\x65\x80\xfb\x23\xbe\x40\x38\x70\x22\x89\xc4\xe3\xe9\xa2\x83\xbd\x93\x75\x2f\xb8\x1e\xce\x33\x09\x34\xc4\x33\x6c\xd0\xfa\x09\x6d\x29\x0e\xc1\xa1\x26\xf6\x24\x30\x1f\xc5\xf3\xc7\x8b\xaf\x8b\x06\x6c\x68\x4b\x24\x80\x45\x4f\x1e\x0b\xad\xfa\x80\xe5\x83\x0e\x86\x08\x30\x1d\x2e\x3d\xf6\x32\xba\x09\x12\x76\xaa\xc3\x38\xcd\x1a\x50\xf8\x91\xa6\x61\xc0\x79\x06\xe9\x45\x89\x6f\x2c\x09\xd4\x37\x80\x48\xd5\x54\x55\xa1\xdc\x25\xbe\x9b\x50\xba\xdc\x36\x10\x85\x55\xfa\x54\xce\x68\xd6\x13\x56\x2c\xb7\x65\xbf\xbc\xc4\x95\xb0\x59\x3c\xa5\x42\x68\x6d\xa8\x09\x14\x31\x19\xa6\xd5\x62\x91\x82\xc0\xbe\x29\xee\x5f\xab\x10\xf3\x57\xd0\x79\x1c\xfd\xb2\x02\xf6\x0a\x73\xe0\x0a\x55\xf5\x08\x6b\xdc\x1d\xf6\xc2\xfa\xa8\x14\x41\x27\xa7\x04\xf1\xd9\x32\x22\x76\x42\xa3\x84\x6b\x0f\xf5\x56\x24\x55\xb6\x74\x51\x1c\x2e\xe9\xd2\x28\xf9\xec\xb9\xe2\x7e\x77\x52\xbc\x7a\xfd\x2a\x03\xdc\x36\xab\x43\x59\x6d\xe6\x33\x13\x3c\x48\xec\x50\x1c\x01\xdf\xce\xeb\xb6\x3d\xd8\x41\xce\x64\x10\x8c\xed\xf7\xff\x44\x20\x6d\x4b\x15\x1c\xcf\xca\x5a\x99\x60\x8f\xa7\x38\x4c\x05\x6f\xb8\x6e\x60\x5d\xb1\x24\x84\x1c\xeb\xab\xc5\x1b\xc2\x43\x7c\xb2\xbe\x02\xa6\x71\xa7\xf4\xc7\x37\x05\xcd\xaa\x78\xf4\x1d\xfd\x7f\xd6\x11\x77\x2b\xb7\xec\x76\x62\x23\x84\xa5\x16\xb6\x4a\xb8\xfc\x7c\x6e\xd9\xf0\xb3\xb3\x92\xe3\xa3\x1d\x0b\x46\x0b\x1e\x17\x57\xb1\xfa\x82\x25\xdd\x81\x31\x7f\xf1\x83\xaf\xe9\x2a\x21\x5c\xff\xa2\xb8\x28\xdd\x8e\x44\x43\x4f\x7c\x21\x51\x23\xba\x2e\xfb\x43\xe1\x56\x2b\xda\x23\xe2\x01\xc1\x52\x02\x93\x4e\x8a\xd5\x01\x67\x12\x4c\x57\x5f\xe2\x68\x34\x71\x67\x72\x8e\xee\x45\xb3\x95\x25\x65\xc1\xb5\xec\x6c\x2d\x79\x1c\xb3\x9f\xa1\xc6\x7c\x3f\x3b\x88\xb8\xd3\x54\x1b\x70\xd2\x38\x27\x22\xdf\xd3\x15\x36\xd0\xc6\x19\x50\x38\x0e\xdd\x4d\x49\x3b\xb0\x0c\x4a\x50\xac\x6c\xef\x7f\xed\x17\x67\xac\xce\x28\x1e\x5b\x01\x18\x19\x14\xcc\x76\xb7\xbc\xed\x74\x3c\x8a\x5d\xe9\xcb\x54\x0c\xea\xae\x9a\x1b\x56\x2e\x2a\xc4\x4f\x65\x47\x17\x02\xab\x0a\xa0\x5c\xf4\x11\x27\x88\xc0\x42\x33\x49\x1c\x24\x1d\x88\xa6\x65\x2e\x52\x2b\xc5\xf6\xd0\x25\xad\x11\x91\x45\x74\x4a\x77\x7a\xb7\x78\xe1\xd1\x69\xf1\x3a\x57\xa3\x51\xa9\xe8\xef\xc2\xa0\x54\x83\xc7\x14\x99\x55\xbd\x3f\xe1\x76\x20\xec\x51\x0d\xd5\x9c\xf6\x9d\xf5\x5e\xd2\xe7\x2b\xaa\xd2\x43\x3e\x8e\x48\x4b\x8b\xab\x9a\xdf\xf7\xb3\xe1\xc0\x58\x87\xd2\x89\x12\xa5\x24\xfe\xcc\xb5\x84\xc4\x67\x74\x02\xa0\xe0\x22\x9a\x77\xf5\x3e\x51\xc3\x2e\x15\x95\x58\x1d\x0b\x8a\x5b\xb3\x36\x51\x09\x5e\x64\x1c\xaf\xfc\x1e\x7c\xe6\xae\xdb\x2e\x9e\x39\x62\x53\x4a\xa2\xad\x91\x3e\x7f\x5f\x88\x92\x99\x04\x56\xf7\xc5\xac\x6b\x70\xda\x97\x9f\x5f\xb7\x93\x1a\x8d\x54\xcf\xef\x77\x51\x0e\x93\x44\xbf\x10\xe4\xed\xf6\xa5\x5b\xcb\xdd\x9d\xdf\xef\x74\x32\x09\xef\xf9\x62\x34\x26\x80\x04\x78\x42\xf9\x48\xa6\x80\x3d\xc4\xc6\x89\x18\x36\xb8\x0c\x40\x14\x3a\xe6\xa2\x46\xfd\x33\x35\x1e\xf5\xae\x87\xd7\xb8\xe7\x7c\x30\xe0\x8f\x59\x48\xc8\x46\xc5\x1c\x24\xb4\x0a\x24\x69\xfb\xdd\x0a\x4d\x7b\x70\x07\x84\xea\x6e\x57\xce\xe8\xf2\xdb\xf2\xc9\x1a\xf1\xf2\x7c\x0a\xc1\x04\x3a\x06\xf2\x9f\x00\xfa\xde\xd4\xfb\x44\xc5\x6e\x16\x3f\x10\xc3\xbb\xad\x59\x7a\x4d\x57\xfd\x39\xcb\x55\x65\xcf\x9b\x36\xb7\xcb\x49\xb8\x29\x66\xfe\x3b\x6a\xce\xd6\xfe\x5d\xed\x18\x33\x9c\xca\x2f\xb2\x98\x32\xf9\x30\x45\x3a\xfc\x25\xfe\x75\xc5\xb7\xab\xef\xee\x77\xdf\x7e\xb5\xfa\xee\x04\x44\x5e\x14\x6e\xaa\xd2\x58\x13\xd5\x06\xe1\x63\x59\x9a\x05\x46\x3c\x65\x30\xfb\xd0\x12\xfb\x41\x93\x28\xee\x13\xa3\xd8\x8a\x42\x95\x2e\x2c\xc2\x9d\x49\x7d\xd0\x5c\xd4\xbf\x5e\x4e\x8a\xa1\xf1\x69\xe0\xd2\xa1\x44\x36\x34\xa6\xa6\xaf\xca\x15\xdd\x8d\x44\xbe\xf4\x45\x04\x2c\xc1\x4f\xa5\x07\x4b\x33\x28\x16\xb6\x44\xd5\xd0\x46\x69\x69\x92\x25\x28\x70\x57\x2a\x6a\xb1\xe6\x82\xe1\x4f\x02\x5e\xdd\x85\x55\xad\xe7\xf5\xac\xca\x5d\xd9\x1f\xc5\x68\xba\x53\x69\x49\xc0\x5a\xf1\x5a\xe2\xaa\xf6\x8f\x6c\xc1\x05\x7d\x04\xbf\x68\xc9\xe8\x3e\xa6\xaa\x98\x47\x8e\xe4\xac\xfd\x65\xbe\xec\xaf\x44\x6d\x88\xee\x13\x4b\x79\xe5\xba\xe5\xa1\xd6\x2d\x26\x36\x9f\x31\xfa\xac\x74\x0d\x5f\xc7\x57\xae\xcc\x65\xd4\xb8\x37\x51\x98\xe7\x5b\xc6\xf6\x9c\x66\xff\x30\xec\xf1\x97\xd4\xbf\x5c\xc4\x68\x88\xf8\x00\x7f\x7d\x60\xe5\x9c\x4b\x06\x1f\xb0\xa5\x81\x62\x44\xc1\x7c\x5b\x29\x5a\x31\x03\x76\x52\x5c\x62\xa3\xd7\x74\x3b\x11\xbf\x51\x15\xfb\x43\xd5\x39\x5c\x14\x50\x8e\x75\xc4\xd2\xd9\x32\xda\x04\x08\x70\xed\xb8\x94\xf9\xe8\x5a\xf4\x44\xb1\x41\xda\x8f\xc9\xe5\x53\x8d\x00\x73\x3d\x42\x7b\x7a\x1f\x55\x22\x41\x52\x97\xaa\x7a\xeb\x1b\x20\xb8\x4f\xda\xfa\x75\x3c\x4a\xf3\x19\x0f\x09\x23\xeb\x27\x07\xf6\xb0\x2d\xbf\xb4\xc1\xe9\x29\x88\xc3\x6a\x7d\x19\x6f\x76\x1f\x74\x94\x33\x69\x2e\x1c\xf3\x37\x06\x66\x2d\x84\x3b\xd2\x6e\xe6\x35\x64\xe8\x11\x46\x41\x93\xd3\x6c\x20\x81\x0d\x8f\xec\xda\x6d\xb0\x4d\x4d\x64\x1f\x74\x79\x63\xaf\xa6\xee\x18\xcc\x27\x0c\x59\xe6\x13\x86\x1c\xaa\xf5\x4d\xb3\xa4\xdb\xb6\xed\xc1\xbd\x55\x87\x7a\x7b\xe5\x71\xcb\x0a\xc7\x13\xb4\xb0\x43\x05\x34\x6d\x59\x53\xfc\xf7\x51\x89\x0c\xd5\x71\xbd\x64\xb1\x3c\x1c\xef\x1f\xab\xc8\xfc\xa0\x3e\x97\x96\xd2\x94\x0a\x2f\x3b\xd5\xf0\x9b\x00\xa3\xbd\xd1\x89\xdc\x41\xcc\x17\x2d\xe2\xec\x67\xac\xff\x7b\x21\x21\xb8\x0a\xad\x83\x44\x27\xef\x32\x52\x62\x2f\x58\xa1\x86\x30\xe9\x3f\x19\x79\x53\xb0\x21\xfa\x7c\x72\x1f\x93\x0d\xd7\xeb\xc6\xf8\xb6\x5c\xfa\x35\x4a\xd8\xf3\xb5\x53\x28\x10\x09\x41\x81\xbd\x8b\x2d\xa8\xda\xc6\x4a\x68\xc9\x0a\x62\x63\x36\x0d\xa6\x0d\xe5\xc8\xfb\xd9\xad\xef\x16\x17\xbf\xff\x67\x5a\x61\xe2\xc8\x66\xbc\x64\xb7\x78\xee\xe0\xb9\x10\x18\x54\x53\xef\x67\xef\x68\x5f\x5e\x0d\xa5\x1b\x30\x1a\xf1\x63\xc2\x76\xb0\x3e\x88\xc4\x12\x5b\x00\x65\xee\xce\x47\x72\xd0\x1b\xcf\xaf\x40\xb4\x14\x35\x75\xc0\x8f\x8f\x61\x15\x2e\x2e\x9e\xbd\x65\xf9\x8b\x5b\x87\xa2\xfb\x9a\x95\xa4\xb3\x67\x7d\xbf\xef\xde\xa9\x6a\x93\x35\x91\xd4\xf2\x6d\xd5\xb8\x8d\x7d\xd4\x9f\xb3\xb7\xde\xed\xe2\x00\xf1\x6b\x76\x4a\x5c\x4f\xfc\x04\xb9\xaf\x8d\x8f\xa1\xcc\x44\xcb\xe0\x9f\x0c\x25\xae\xd9\x2b\x7f\xf3\x43\x0b\xd5\x92\x54\x67\xe6\x28\xbc\x84\xac\xb8\x64\x76\xd6\x10\xd1\xef\x2f\x0e\xbb\x9d\xc3\xdb\x70\xe9\xf7\x25\x5d\x0c\xa2\xe6\x5c\x73\x99\x82\xbc\xa4\x1d\xc3\x63\xb8\xfc\xcb\x42\xc0\x00\xe2\xec\xaa\xa1\xb3\xba\xb8\x00\x37\xee\x92\xd2\xb7\xad\xf7\x3c\x82\x44\x87\x5a\xb1\x3a\x74\xc6\x9c\x2f\x18\x38\xfe\x17\x78\x10\x44\x7f\xcf\xaf\xc6\x1f\x8e\x3c\xf5\x7c\x98\xb9\x6a\x7f\xe5\x98\xbb\x0e\xa0\x78\xca\xc1\xeb\x26\xcb\xf4\xf1\x3d\xc7\x55\x97\xae\x86\x12\x1c\x82\x43\x83\xc3\x04\xa9\xa4\x7c\xf8\x68\xf9\x65\xde\xce\x86\x68\xea\x9f\x6f\x8b\x7e\xee\x0f\x50\x82\x7c\x20\x0e\xe6\x37\x9b\xc0\x03\x7e\x36\xd0\xb1\xdf\xef\xe6\x0f\x66\x2c\x18\x45\x80\x0f\xf2\xb0\xc0\xc2\x41\xcd\x8f\x0b\x15\x13\x13\x92\xca\x22\x35\xf9\x30\xdb\xb9\x5f\xef\xac\xb5\xc3\xbb\xee\x6e\x54\x4d\x2e\x8b\x74\x2d\x89\x7c\xe6\x3a\x5d\xa1\xe6\x4a\x44\x3f\xcc\xa0\x68\x1f\xc3\x03\x47\x03\x48\x59\xaf\xab\xc3\xe6\xe8\x50\x88\x38\xd0\xd1\x27\xb9\xcf\x15\x0f\xee\x77\x0f\xd0\x66\xfd\x91\x98\xb9\x5a\x2b\x3c\xc1\xff\x3d\x11\x71\xa2\x78\x74\x7e\x68\xd7\xbf\x31\x83\x85\x25\x35\x0d\xc1\x74\xdd\x83\x87\x51\xc5\x94\xde\xde\x2d\x9d\xb6\x3d\x89\x2d\xc4\x3c\x05\x62\x1d\x05\x5d\x12\x5f\x36\x07\x9f\x13\xe8\x58\x87\x7a\x9a\x47\xd3\x8a\xe5\xca\xfb\x7a\xd9\xbb\x8f\xbe\x0e\x8f\x83\x2a\x16\xd3\x6c\x85\xc5\x0f\x8f\x24\x73\x79\x82\x3a\x56\x2f\x7f\xae\x9a\xac\x4f\x4c\xef\x5d\xd5\xab\x07\xb9\xe5\x45\xd2\x46\x68\xa2\x27\x42\x70\xe7\x10\x40\x29\x26\x3b\x17\x04\xe0\x5a\x34\xfd\xcd\xe2\xc5\x83\x72\x40\xe4\x26\xab\x85\xa5\x0a\x4b\x1d\x77\x26\x21\xa8\xc0\x79\x5b\x71\x05\xe8\xc1\xb3\xa1\x8c\xfe\xde\x2c\x33\x75\x06\x2b\x9b\x32\x76\x8f\x70\x76\x7d\x68\x5d\xdb\x89\x44\x9f\x3c\x22\xe6\x4a\x0e\x90\x5a\xba\xef\xbb\xd2\x99\xb6\xa4\x99\xe8\x84\x50\x0c\x17\xc8\x1f\xe9\x45\xb4\x72\x60\xd2\xcb\xe6\xb3\xfb\x09\x17\xa2\x5d\xa0\x60\xfc\xae\x18\xf1\xd3\xe5\xe0\xc6\x5c\xda\x98\x53\x8b\x21\xa0\xad\xff\x95\xee\xbb\xf8\xba\x18\xfa\x06\xe2\xfa\x0e\x77\xe1\x7c\x56\xb9\xae\x87\x74\x2e\x33\x8b\xc0\xe8\x8c\x26\x43\xa4\x90\xdf\x04\x76\x44\xd9\x71\xf0\x44\xbf\x53\xf5\xa0\x03\x90\xd1\xda\x46\x75\x8f\x98\x29\x50\x68\x5e\x9c\x95\x45\x4a\x90\xc0\x08\xc2\x36\x29\x5b\x07\x3a\x29\x36\x53\xbc\x25\x7e\xf4\xb7\x63\xd6\x8c\xd5\x6a\xfc\x91\x9a\xdf\xb6\x6e\xc3\xd7\xc1\x75\x5c\x0f\x48\x98\xe1\x02\xfc\x06\xfa\x81\x83\xa8\x97\x19\xe6\x36\xb4\x2c\x76\x1a\x46\xe3\x8f\x35\xc0\xea\x52\x5a\xd9\xc3\x8e\xfb\x94\xf9\x3b\xa1\x48\x2e\x57\xe7\x25\x4d\x5c\x37\x10\x49\x40\xc6\x49\xde\xa2\x5b\xd4\x94\x5a\xa7\xa2\x3a\xd6\xe7\x45\xee\xbd\x2d\x0f\x44\x8a\x54\x07\x37\xeb\xe8\x24\x54\x58\x74\xb1\x79\x1a\x88\x53\x2c\x49\xf9\x8d\xc7\xab\x0d\x89\x9f\x46\xb0\x69\x2d\x23\xce\x9e\x14\x1b\xda\x93\xde\x8c\x58\xc4\x56\xa7\x72\x6d\xa5\xb7\x46\x47\xbc\x6c\xd9\xd6\xc2\x83\xea\xda\xff\xfe\x8f\xb9\xf6\x0c\x91\x07\xf6\x4d\x63\x39\xce\xba\xcc\x19\x7a\xed\xff\x41\xfe\xe4\x7e\xc2\x72\xbb\x40\xb6\xbc\x44\x34\x14\x21\x47\x83\x09\xaa\xd2\x74\xf0\x62\x4f\x94\x57\xbb\xcb\x06\x39\x38\x9d\x61\xa6\x71\x8e\x2e\x9d\x63\x15\x3a\x9e\x89\x25\xd0\x52\x38\x8f\xe4\x10\xd0\x34\x5b\x6c\xeb\x43\x29\xf9\x92\xcd\x6b\x60\xda\x55\x27\x3b\x64\x67\x62\xf6\x33\x8e\xd0\xfb\x19\x5d\x0c\xf5\xd6\xeb\xa3\x8f\xe9\xd4\x8c\xdf\x95\x97\xad\x7f\x6d\xe8\xaa\x6d\x6a\x10\x03\xbe\xc5\x44\x91\x39\x4b\x55\x65\xa9\xea\x49\x2d\xb2\x6e\x83\x3d\xd6\x3f\x08\x29\x57\x2b\xbc\x43\xcf\x2e\x61\xb0\x78\x03\xd5\xd4\x85\xdf\x1e\x1c\x8c\x10\xa9\x07\x22\x0a\x8b\x9f\x9a\x1e\xc6\x82\x02\x00\x65\x27\x00\xca\xbe\xd4\x2f\xf2\x93\x90\x5f\x7f\xe2\xc5\x80\xad\x0e\xa0\x24\x28\x7f\xff\xff\x67\x50\x8a\xec\xe6\x4c\x6b\xc1\x6e\xb7\xd7\x4c\xa4\x8d\xfe\xf2\x0d\x8a\xd1\xd3\x45\x46\x65\x4c\x9b\x63\x85\x3d\xdf\xf3\xb5\x08\x83\x3c\x40\xb6\x15\xa1\xdb\xf7\xd0\xf7\x44\xf1\x78\xab\xd2\xeb\x8d\x5b\x0b\x6a\xe7\x1a\x52\x7d\xc9\x96\x22\x3f\x9b\x95\xda\xfb\x99\xd9\xb2\xa9\x15\xe3\x84\x25\x93\xae\xb9\x3c\xc4\xcd\xf4\x24\x77\x8b\x33\x1c\xd7\x52\x6c\x10\x58\x27\xb6\xb0\xa7\x87\x0b\xfe\x59\xce\xf4\xbd\x1f\x6a\x9a\x6e\x91\x3c\xf1\x97\x33\x56\x41\x0e\x74\x8f\x1b\x48\xf0\x7e\xf1\x04\x6a\x07\x92\xc7\x4d\x88\x39\x94\x9b\xc5\xbb\x72\x33\x9b\xd1\xe6\x50\x03\xcb\xc1\x78\x6d\xcf\x1a\x9b\x48\xa6\x12\x19\xf1\x3d\xb4\x10\x56\xa1\xe0\x77\x55\x5c\x84\x9d\x53\xeb\x87\x66\x5b\x43\x40\xeb\x55\x4c\x02\x7b\x83\x65\x74\xd9\xb9\x3c\x29\x44\xdf\x03\xbb\x02\xa2\x4a\x74\xd2\x1a\xfa\xa9\xa8\x7b\xe3\x57\xd1\xc6\xd3\x41\x2e\x6b\x61\x43\xd2\x89\x4a\x9d\xb5\x2b\xe1\x8a\x0d\x97\xae\x6a\xf1\x36\x2c\x32\xea\x3b\xd7\x11\x89\x31\xd8\xc6\x95\x55\x78\x62\x4a\x76\x9c\xb0\x05\x26\x85\xf1\x99\xe7\x4c\x44\xb1\x26\xb7\x8e\xa5\x1f\x33\x34\xce\x8f\x98\xe7\x74\x20\x44\xba\x38\xec\x37\x90\x16\x6d\x85\x4f\xc1\xf6\xd3\x08\x0b\x43\x8d\xbc\x3c\x08\x7f\xb9\x15\xa4\xe9\xd8\x68\xbd\xb4\x3e\xdb\xba\x46\x31\x70\x6e\x67\x39\x98\xbe\xbe\x33\xec\x97\x63\x4d\xa3\x1d\x40\x98\x12\x4a\x09\x97\x89\xcd\x62\x13\xe2\xeb\xdf\x3c\xb6\x91\x6d\xe8\x36\x8d\x99\x62\x94\x45\x55\xd6\x1f\x71\x57\xd0\x05\xc1\xa2\x1b\xd6\x2f\xdf\x4a\x56\x25\xd2\x39\x38\xb0\x2d\x2d\xfe\x70\x23\x3b\x4b\x7d\x5f\xd6\xd7\xe6\xd5\xad\xa8\x4d\xde\x90\xe8\xd3\xd2\x08\xe4\x50\x30\x3e\xb0\x04\x79\xec\x59\x7b\xf8\x9e\x6d\xcf\xd9\xf6\x08\xcb\xcf\xeb\x46\xdd\xec\x01\xd5\x85\xc6\x3b\xd8\x8e\x08\xb3\x46\x6b\xd3\x34\x9d\x2a\xc4\x05\x9e\x44\x30\x7e\x21\x35\x8d\xb8\xd2\x43\xdd\x2e\x6b\xd4\x76\x93\x78\x88\x32\x7b\xa0\x51\xbb\x00\x3e\x7e\x34\x12\x7e\x28\xb2\x5a\x76\x1a\x75\xd4\x0e\x78\x5d\x01\x53\x20\xbe\xc6\x59\x32\x45\x5a\x12\xd9\xdf\xb2\xfd\x1d\xdb\xbe\xa8\x2d\x40\x13\xc5\x8a\x07\x25\x89\x9d\x78\x77\x9d\xe7\x63\x0b\x98\xf4\x02\xaf\x3c\x93\xc3\x2b\x18\xfb\x81\x57\x3e\xe2\x95\x1f\xe0\x95\xa1\x4d\x7c\xb4\x94\x6b\x22\x50\xb2\xa6\xda\x4c\x68\xa3\x6d\x52\x58\xd1\x50\x2a\xb6\xc8\x89\xc9\x35\xf4\x00\xcb\x0c\xe4\x8d\x7f\x14\xb5\x02\x93\xca\xa5\xc8\x44\xbf\x88\x6d\x59\x7f\xc3\xf7\xc0\xf9\x70\xf8\x71\x59\x72\xf5\x4b\xd4\x62\x0b\x35\x18\xa8\x59\xe6\xc5\x6b\xba\x0a\xd8\x48\x11\xef\xc9\xac\x5e\x25\x12\xc7\xe6\x99\xa6\x19\xb7\xa6\x12\x6a\xa4\x9d\xff\x19\x5a\x14\xf8\x85\xb4\x61\x11\x45\xba\xa0\x64\x29\x4d\xcb\xa4\x06\xdd\x5a\x1c\x6c\xba\xcb\x08\xc7\x60\x22\xc9\xdc\x49\xcc\x99\xd1\x00\x05\x1c\xd2\x71\x5e\x5c\xb3\xff\xf1\xfa\x64\x16\xa8\x34\xb1\x87\x52\xf3\x96\x2e\x11\x69\xc1\x3e\xa8\xa6\x4c\x1f\x30\xcd\x6c\x45\x61\xf4\x84\xe8\x8b\xb7\x1c\x8c\x30\x4c\x2a\x02\x31\xd5\xcf\x72\x19\xe8\x84\x73\x10\x99\xd2\x0b\x5e\x32\xda\x1d\xbe\xb6\x41\xa3\x76\x8d\x54\x1a\x9a\x5f\x79\x6e\x91\x29\x5c\xb0\x0b\x22\xba\x07\x7b\x2c\x39\x20\x8c\x3f\xf0\x60\x60\xfb\xbe\x94\xba\x41\xd7\x4e\xbd\x95\x20\x3d\x85\x52\x3a\xda\xaf\xef\x87\x23\x0a\x84\x7c\xb8\xc0\xd2\xf7\x90\x80\x7f\x31\x73\x9b\x0d\x1f\x05\x59\x0a\x50\x96\x43\xbd\x4d\x08\xd0\x50\xe6\xe4\x0a\x03\xe0\x61\xc9\x32\x7b\xd5\x01\xab\xf2\x47\x5f\x72\xc0\xed\x64\x66\xe9\xe6\x7a\x12\x15\x98\xbc\xab\x74\x41\x10\x2f\x57\x42\x3b\x46\x0c\xec\x27\x1f\x73\xe4\xa6\x55\xc3\x8c\x72\x6c\x25\x62\xe3\x1f\x5c\x87\xc3\x95\x88\x0c\x48\xbc\x1d\x0f\xf5\xe8\x6e\xb4\xe3\x11\xd8\xac\x70\x40\xd6\x91\xdf\x42\xa7\x90\xa6\xc2\x62\x32\x2f\xe6\x99\x37\x63\xf4\xd2\x8b\x92\xa9\x2e\xcd\xbe\x54\x23\x9c\xd8\x44\x10\x29\x86\xdc\xcd\xbc\x38\x6f\xe8\xd8\xfc\xfe\xff\x8a\x21\xad\xb7\x3a\xca\x3e\xf2\x1d\x8a\x6f\x62\xc9\x82\x67\xd4\xde\x14\x59\xc1\x4a\xb6\x12\x32\x9e\x0a\x0d\x34\x92\x1d\x1b\x82\x82\xb6\xb7\xbd\x33\xb1\xb6\x3f\x88\x9d\x9b\x28\x87\x9c\x58\xb8\xaa\x2a\xff\xdb\x0e\xef\x39\xdb\xef\x98\x87\x76\x62\x53\xfe\xfd\xb7\x5f\xe9\x57\x7e\x46\x0f\xbb\xcb\x5e\x05\x18\xce\x8f\x65\xff\xec\xb0\xe2\x37\x99\x6f\x5d\xe2\x7c\xa0\x76\x3a\x3a\xb4\xb8\x10\xec\x89\xd0\x30\x3c\xac\xed\x2a\x96\xac\xb3\x9a\x7b\x75\xc1\x28\x2e\xd9\x53\x83\x4e\x91\x78\x2f\xc0\xa4\xb4\x21\xc2\xd2\xb1\xdd\x31\xe3\x9a\x8b\xa4\x96\x8d\x65\xed\x9c\x4c\xec\x55\xb0\xdd\xa5\xb2\x44\x5f\xf3\xfb\xff\xae\xe8\x91\x98\xed\xf2\xbb\x88\x2a\x4c\xcd\x14\x43\xda\x30\x79\x65\x1e\x5a\x62\x6e\x89\x5b\x3a\xcb\x41\xc4\xea\xb9\x11\x01\x59\x79\x46\x91\xb1\x58\x1b\x34\x9f\x59\xed\xe0\xb0\x40\xdd\x28\x5a\xa1\x68\x3d\x52\xdd\x2a\x12\xa6\xb7\x94\x1c\xd6\x28\xc7\x07\x71\x46\x8e\xaa\xa2\xbc\x1b\x50\x13\xa5\xab\x58\x24\xa3\xaa\x36\x9d\x69\xba\xba\x1e\xaf\x60\x4e\x5d\xcf\x4c\x36\x1d\xe8\x15\x82\xf2\x44\x89\xa9\x18\x96\x57\x30\x9a\x30\x43\xb0\xd2\x8c\x8a\xb3\x33\xf1\x13\x6e\xd3\x94\x82\x8e\xfa\x4d\x56\x21\xe9\xcf\x3f\x08\x37\xb5\x8c\x68\x34\x79\xac\x22\xcd\xef\xd4\xa8\x01\x91\x44\x56\x03\xf1\x1e\xbe\x13\xe5\x8e\x9d\x2c\x2a\x83\x87\x82\xc9\xad\xaf\xe8\x23\x8e\xb7\x0b\xf2\x2b\xb1\x1a\xfc\xee\xc1\xdb\x02\x5e\x49\x96\xe3\x59\xe2\xc9\xc3\xbe\x1a\x4c\x1c\x74\x98\xb5\xf0\x8e\xe8\xa9\x2c\xfe\x87\x82\x59\xab\x72\xd6\x37\x1f\x09\x25\x93\x36\xf4\xc9\x91\xbf\xf3\xb4\xdc\x10\x4d\xa7\x1b\x0a\xf4\x4c\x44\xc4\x40\xcd\x00\x3b\x90\x17\xcd\xb8\x02\x96\x20\x62\x96\x31\xa2\x65\x78\xe5\xa5\xa3\xa6\x86\x91\xa6\x28\xe9\xb4\xbe\xd1\xb4\x72\x5e\xbc\x09\x5a\xb2\x28\xa6\x19\x38\x4e\xae\x28\xb4\x02\xe1\x01\x47\x5a\xaf\x88\x58\xb3\x59\xa6\x34\xa3\x5f\xc2\xce\x9e\x66\xbd\xf9\x44\xdb\xd2\x27\x74\x5b\xf6\x6a\xc9\xeb\x94\x30\x37\xc5\x5b\x5e\xb8\xc4\x10\xf2\x5c\xb9\x7a\xaf\x6e\x1b\x6a\xe3\x62\x15\xf1\xa9\x90\x37\x1c\xae\x2a\x3b\xd2\x29\x43\xa4\xcd\x61\x26\x78\xc8\xd6\x16\x9a\xc2\x2b\x59\x12\x06\xcd\xb4\x7e\xb6\x47\x82\xdb\x81\x29\x64\x42\x7d\x7a\xfe\x5c\xdf\x19\x43\xef\xd2\xc7\x63\x27\x88\x82\x57\x4a\x36\xac\x3a\x11\xf1\x58\x30\xc0\x5d\xe3\x0c\xed\x4b\x68\xa2\x12\xf7\x88\x4c\xb6\x92\xc6\x22\x4d\x91\x79\x84\xd9\x66\x33\x9d\x2a\x93\x95\xf7\x9d\x3e\x65\xf5\xb6\x82\xd6\x5f\x98\x75\x76\xa2\x80\x45\x41\xff\xcb\x1c\xc3\xde\x04\xe6\x7a\xba\x1d\x93\xaf\xe0\x54\xe8\xbe\x11\xd4\x60\x86\xd2\x6c\x28\x60\x23\x63\xf6\x57\x6d\xd5\x24\xaf\xf6\x81\x78\xc9\x64\x8c\x7c\xa5\x48\x70\x84\x86\xbd\x3d\x3a\x8a\xe9\xda\xb2\x29\xda\x04\xa3\x75\x72\x1e\x27\x27\xf3\x39\xb4\x0e\x15\x53\xa7\x8c\xa3\x1c\x63\x3a\xcd\x8c\xd3\x39\xde\x7f\xe0\x74\x02\x17\xf9\x45\xc1\x06\xb4\x66\xfc\xd3\x8a\xfd\xad\x4a\x73\xad\x57\xb3\xf8\xa1\x9f\x88\xf5\x6d\xcf\xde\x41\x24\x55\x05\x91\x16\xab\x8a\xe0\xc5\x83\x44\x1b\x93\xf0\xce\x7b\x70\x8d\x35\xf6\xcc\xcc\x2d\x8c\x1c\xd0\x75\x6f\x8c\xc6\xeb\x57\xc5\xf9\xeb\xb7\x6f\x7e\xff\x8f\x91\xcb\xd0\x33\xe4\x44\x1d\xd0\xbb\x2f\x82\x69\xec\x60\x58\xc1\x40\x36\xdd\xe6\xc1\xd8\xd5\x5e\x37\x43\x04\x97\x4f\xc3\x20\x53\xa2\x1b\xe8\x5c\x2f\x56\xd8\x3a\xa6\xc8\x9d\x8b\x27\x01\xc8\x22\x9b\xd7\x13\x6b\x7b\x22\xa6\x2b\xe9\x16\xce\x7e\x06\x43\xf6\x7e\x26\x8f\x0b\xe7\xc9\x0b\x40\x7c\xf2\x1a\x3d\x94\xc7\xc7\x30\xf3\x1e\x2c\x76\x25\xd1\x5e\xd8\x56\x13\x0f\x51\xf2\xc3\x71\xf2\x76\xc3\x74\x67\xd5\xfa\xeb\x12\x16\x32\x6b\x22\x3c\x30\xa4\xdd\xf9\x9d\xbc\x62\x63\xd4\x61\xb9\x0f\x35\x0d\x74\x5d\x86\xb5\x9e\xcf\x60\xa1\xc8\xba\x8f\x5b\x58\x3c\xca\x9f\xbf\xff\x43\x3e\xe3\xeb\xc0\x25\xa8\xcd\x1e\xe2\xbe\xed\xf6\x8e\x48\x22\xdd\x9e\xdd\xe2\xde\x01\xa3\xda\x14\xb0\xb3\xbc\xf7\x1d\x44\x38\xe8\x52\xa9\x27\x02\xf9\x6e\xd4\x1e\x7c\x93\xd7\xac\x87\x3d\x62\x12\x05\xdd\xf8\xc6\xaf\x89\x3f\x54\xa6\x55\x8e\x93\xd8\xc2\x27\xa3\xd8\xf8\xeb\x84\xee\x1e\x1f\x90\x8c\xa7\x1c\x8f\x07\x4e\xd2\x36\xc9\x87\x2f\x12\x4d\xd7\xa6\xb4\x13\x7f\xed\x2a\xb6\xf8\x60\x02\x2c\xaa\x46\xb0\xaf\x61\x50\x68\xe2\xcb\x19\x5c\xa2\xc2\x9e\xe1\xfe\x5f\x45\xcb\x3a\x57\x9a\xd7\x27\x98\x23\xf8\x4e\x31\x26\x7e\x5f\xfc\xc4\x76\xf3\x77\x3b\xf1\xb2\xbf\x3e\x18\xe0\x2f\x66\x3c\x58\x7e\x50\x80\x43\xb7\x4b\xd1\x86\x8b\xd8\x25\x49\x8a\x36\x4e\x3e\x8d\x76\x32\xf8\x53\xa6\xca\x84\xeb\xb8\xf7\x6a\x09\x98\xac\x31\xda\x89\xef\xb4\x72\x55\x79\xd8\x07\xca\x81\xe3\xaf\x70\xe5\x37\x37\x7e\xfe\xb0\xa5\x43\x41\xb3\x6f\xa3\x2b\x23\x9d\x36\x54\x20\x69\xb0\xb0\x50\x00\x1d\x3a\x9b\x07\xd0\x19\xd1\x20\xba\x71\x11\x0f\x60\x0d\x77\x4e\xfb\x3d\x6a\x42\x1e\xd6\x82\xbf\x97\x42\x93\xbc\xb1\x81\xc9\x24\xff\xa3\xbf\xc6\xbd\x53\x45\xeb\xde\x18\x4f\x01\xc5\x0b\x56\xb3\xc4\x69\x26\xb1\x9c\xe6\xa6\xb7\x4f\x20\xfc\xc9\x8a\xe0\xfa\x53\x7f\x33\xaf\x5a\x50\x76\x7f\xef\xac\x17\x62\xa8\xd4\x8a\x96\x77\x8b\xcd\x67\x93\xcd\x22\xaa\xe1\x88\x6d\xd3\x87\x9a\xc5\x1b\x7e\x9b\xf9\x41\xdf\x66\x12\xa7\x1d\x8d\x11\x40\x94\xf6\x50\xc3\x16\x14\xd7\x4b\x99\x7d\x94\xed\x78\x43\xa7\x1d\xbe\x93\xf5\xad\xb8\x69\xfa\x47\x74\x9e\xd6\x1f\x69\x3b\xe8\xf7\x25\x74\xea\x74\x55\x14\xfd\x95\x83\x5d\x14\xc9\x24\xf5\x16\x34\x0d\x4f\x43\x70\xba\xe9\xaf\xbc\x56\xb3\xa6\xe1\x84\xd8\x12\xda\xd3\x42\xc8\x1f\x95\x05\x16\x28\x1e\x12\xe5\xa3\xad\xfa\xd2\x40\x89\x9b\x6e\x73\x4d\x06\x8e\xb0\x14\x0e\x60\x64\xac\xe9\xc3\xb1\xda\x39\xb4\xe2\x24\x98\x3c\x9c\x43\x99\x89\x65\xa8\x79\x1b\xec\x71\x45\xbc\xcd\x89\x7e\xd2\x1d\xa5\x4d\x33\xe7\xde\xdd\xd6\x4c\x4c\x1c\xfc\xf3\xf8\xef\xd9\x0d\x6c\x16\xf0\x9a\xf4\xba\xd3\x67\x9d\x56\x5e\x94\xb6\xee\x37\x7c\x7e\xea\x6a\x3e\x1f\x1d\x1f\x17\x7d\x23\xa2\x5d\x5a\x5f\xa9\x11\x66\x73\xb9\xe4\x1d\x04\x1b\xf1\x7c\xf0\x8c\x4d\xb4\xa9\x75\x51\x7c\x28\xb8\x46\xb4\x10\x81\xb5\xf6\x26\x43\x17\x6e\x68\x3e\xf5\x10\x65\x26\x06\x09\xf4\xfd\xee\xdf\xe1\x39\x6a\xf0\xc0\x7f\xbf\x9b\x7c\x94\xaa\x3d\x14\xca\x87\xfe\x6a\x91\x79\x0e\x0d\x4c\xa0\x34\xf8\x44\xee\x9d\xbf\x8b\x31\x28\xd2\xf2\xe3\xf7\x85\x6a\x0c\xeb\x9c\x48\x83\x3a\x17\xab\xea\xe0\xef\x7d\x27\x3b\x6a\x14\xda\x1a\xe5\xf3\xc3\x01\x2f\xd2\x03\xa4\xa5\x73\x21\xba\x86\x83\x8f\x0f\xcc\xc5\x14\x01\x17\xa7\xe1\x04\x0f\x53\x47\x4c\xb5\xbf\x89\x7e\xac\x5f\xfd\xf8\xfc\xad\xb8\x61\xee\x53\x93\x2a\x75\xe5\x65\xcd\x2c\xe3\xa0\xb4\x0e\x4e\xa7\xec\x3a\xe1\x19\xeb\x92\x36\xe5\xd5\x60\xb1\x83\x16\xa6\xcd\xb6\x5a\x54\xbc\xb1\xa1\xe8\x47\x01\xb3\xc6\xdc\x39\x45\x3a\x4d\xec\x31\x4f\x92\x57\xdb\x22\xd1\xf9\x43\xf4\x6d\x7b\x88\xbe\xb1\x61\x7d\x97\x8f\x81\x43\x26\xde\xe4\xf5\x44\xf1\x1d\x22\x7f\xdb\x25\x42\x48\xc2\x5f\xf5\x22\x08\x77\x0b\x3b\xbd\x12\xcd\xbb\x8c\x97\x0a\x83\x08\xef\x0f\xc9\x44\x75\x1f\x71\xca\x60\xe6\xf6\xb7\x4b\x3c\x14\x11\xff\x46\x72\x42\xfc\x1d\x98\x5c\xfe\x4e\xbc\x6b\x52\x24\x76\x4d\xe7\xb0\x8c\xa7\xc6\xff\xcb\xff\xf1\x7f\x3d\x3a\xa3\x29\x9f\xf5\x6d\x45\x7f\x88\xf6\x90\x65\x0e\x54\xc1\xfa\xbf\xfe\x67\xf9\x42\x24\xf4\x50\x33\x2d\x18\xbf\x0b\xcb\x67\x7b\x3d\x06\x6d\x58\xbc\x6d\x20\xe4\xc2\x58\xab\x41\x88\x1c\x7c\xc2\xeb\x33\xcf\x56\xee\xd5\x19\xf4\x01\xe2\x99\xa6\xba\x80\x4d\x72\x15\xfe\x72\x28\xd7\x1f\x97\xd0\x8c\xf9\xc5\x8f\xac\x1f\x6b\xdd\x9e\xfe\x51\xe6\xa0\xbf\x2a\x3b\xbd\x10\xc0\x03\x8c\x2f\x96\xd4\xf5\x82\x6f\x51\x18\xf8\x39\x92\x91\xf9\x02\x11\x61\x2a\x65\x7e\xa8\xfd\xd2\x9c\x17\xd8\x77\x6b\xb6\x3f\xc0\x5c\x0f\x94\x5d\x3a\x3a\xa7\xdf\x76\x9d\x2b\xae\xd4\xa2\xb7\xae\xc6\x95\xb9\x4b\x1a\x22\x87\x48\x98\x66\xf9\xd8\x38\x30\xb7\x07\xe9\x55\x96\xc0\xa2\x82\x8d\xd9\x94\x5f\xcc\x66\x6c\x6f\x7c\xc6\xb6\xc5\xb3\xa9\x5b\x6e\xd6\xb7\xde\x2f\x4e\xab\x15\x3c\xe7\x1f\xc2\x80\xf1\xcb\x19\xdd\xa7\xb0\x4f\x55\xeb\x05\x04\x84\xe8\xdd\x76\xf1\x94\xbe\xb6\xc2\x85\x4b\x09\x6c\x1f\xdc\x56\x5b\x85\x81\x81\x23\xa6\x38\xb6\xeb\xb6\xdd\xe2\x2d\x95\x0f\xc3\xb9\x20\xf2\x4b\x1e\xf1\xa5\x9b\x55\x6e\xe5\xe9\xe3\x93\x1e\xcf\x16\x3d\xdf\x7f\x15\x26\x5d\x53\xc5\xb7\x44\xe2\x0f\x98\xcd\x4c\xac\x2c\x81\x97\x6c\x6d\x49\x22\x9d\x77\x1d\x3a\x2e\xd9\x9d\x7f\xc6\x4f\xb3\xad\xbb\x59\xbc\xa6\x05\x2d\x59\xa0\xe4\x4f\xb4\xdb\x1c\x0f\xe8\x8c\x78\xed\x06\xce\x00\x4e\xbe\xb3\x67\x0f\xe0\x7f\x12\xa7\x98\xac\x12\x4b\x4d\x7c\x3c\xce\xed\x2f\x29\x80\xd9\x74\x05\x26\xd1\x36\x86\xd9\x0f\xda\x12\xb5\xf6\xa7\x93\x5d\x6f\x7c\x2a\xad\xec\x1a\x61\xab\x67\x33\xea\x87\x46\x32\xe7\xa0\x40\x78\x67\x16\xf1\x9e\x0d\x44\xb5\x48\x9e\x17\xa5\xf4\x8c\x9f\x11\x8b\xa7\x49\x31\xfe\x91\x42\x33\x03\xce\x6a\xef\x21\x7e\x50\xe3\xf2\xa2\xd5\x2d\x4e\x09\xc7\xc4\x2e\x47\xd9\xe9\xab\x00\xba\x86\x03\x43\xbf\xe4\x06\x61\xc1\x8d\x0b\x80\x5b\xee\x8c\x68\x46\x1d\x40\x62\xac\xad\xdc\x56\xcd\xd2\x2c\xbb\x2c\x36\xd9\xd8\xf8\x68\xe5\x03\xfc\x25\x2e\x93\x81\xee\x0e\x74\x2e\x56\x7e\x49\xfd\x3a\x63\xbe\xfe\xd7\xe6\x50\xe0\x7b\xb1\xf2\x60\x86\x9c\x61\x19\xd4\x30\xee\x23\x34\x14\x7c\xf9\x37\x1d\x34\x3d\x3c\x3d\x14\xa1\xbf\xac\x69\x26\x88\x2b\x7f\x09\x8e\x17\x9f\x62\xbb\x28\x11\xf8\xe4\x28\x09\x64\x01\x48\x70\x69\x60\xc1\xd2\xd6\x4c\xf8\x0f\xb3\x7a\xcc\x1f\xc6\xdd\xf2\x8c\xae\xe0\x56\x78\xd3\x96\xbd\x29\xc3\x62\xe7\x28\x2a\xb8\x48\xf5\x05\x7f\x78\x5e\x62\xe0\xc1\xc3\x31\x02\x0d\xcc\x10\x45\xf3\x95\xeb\x0a\xa8\xd2\x0b\x81\xd8\x98\x52\x08\x36\x11\x44\xeb\x0d\xef\xc0\xbb\xb0\x23\x8e\x60\x1f\x0c\x0f\xf0\x93\x3b\x82\x2f\x5d\xd2\x57\x90\x7c\x89\x18\x17\x74\x61\xc7\xb0\x22\x27\xc5\xbf\x62\x46\xe0\x32\x0a\xc4\x48\xab\x37\xa0\x41\x34\xa3\xaf\xe6\xc5\xdb\x86\x39\x58\xf0\xc0\x69\x85\x6d\x23\x73\xf2\x34\x48\x3a\x64\x35\x96\xba\xb9\xd4\xd5\xf6\xd5\x26\x69\x64\x45\xfc\x32\x71\x1e\xd0\x4b\xea\x68\xe8\xc2\x21\x16\x36\xa2\xed\xda\x57\x4b\x36\x51\x5a\xc8\x8f\x50\xc4\x64\x21\xe0\xbe\x50\x89\xe2\x4c\x7e\x1a\x10\x94\xce\x3d\x49\x1d\x8b\x53\x9a\x12\x2d\xdd\x57\xdf\xda\x64\xbf\x7b\x90\xc0\x58\xf1\x83\x78\x2e\xf1\x6a\xbf\x78\xc7\xff\x64\x25\x6a\xbc\xa3\x88\x91\x96\xe8\x80\x76\x62\x4f\x2e\xb7\x15\xda\x25\xae\xcb\x82\x62\x10\xf3\xcf\x7e\x40\x1b\xbd\xbe\xf8\x73\xb2\x13\xda\x84\x2c\x65\x75\x4b\xc4\x47\x70\x51\xcf\x8c\xce\xd1\x8a\x6d\x91\x55\xcd\x60\xbc\x9d\x00\x3f\xc2\x24\xef\xb1\x37\x90\x69\x78\xa4\x20\x76\x16\x2f\x3d\x6b\x9f\xbf\xc0\x55\x4c\xab\x50\x99\xd6\x8a\xad\xd0\x01\x12\x74\x95\xc1\xf2\x5e\xe2\xca\xa6\xbf\xe0\x1c\x04\xfe\x97\x49\xc0\x3c\x25\x7f\x66\x1a\xc7\x46\x40\x72\x8d\x5b\xcb\x05\x3e\xa6\x6b\x20\x66\x29\x67\xd9\x66\x07\x14\x55\x3a\xb6\xf2\x7a\x5b\x3e\xd5\x82\x42\x0a\x40\x4d\xb8\x20\x34\x67\xd7\x5a\x05\x69\xf3\x56\xee\xe8\x6e\x21\xd7\x96\x1c\x26\x2d\x12\xc1\x0c\xde\xb2\x43\xaa\x11\xda\x0a\x28\x8e\xdb\xda\xc9\xa9\x7a\x52\xf7\x44\x57\xb8\xa1\x52\x64\xba\xbd\x83\x5d\x49\xf0\xbe\x75\x46\x42\xfb\xf4\x90\xdc\xd5\x4d\x98\x2c\xf7\x12\xaa\x2c\xde\x2a\xb5\x8a\xf6\x73\x68\xbe\x96\x81\xe3\x8c\x7d\x76\xeb\x4b\x25\x80\x74\x15\x2c\x45\x2c\xb5\x85\xb1\x3e\xa4\x7d\xa2\x16\x85\x4b\xe8\xe5\x40\x8a\xed\x6c\xca\xc7\xba\x91\xc3\xb9\x59\xde\x5c\x25\x9d\x0a\x1d\xd3\x67\xb6\x48\xca\x14\x96\x78\x1c\xda\x78\xee\x99\xb1\x8a\xbe\x68\xbd\xf9\xdd\xfa\x1a\xf8\x43\x7d\x2c\x48\xf8\xf4\xfc\x6a\x09\x5d\x91\x27\x1a\x0c\xe1\x9b\xa9\x71\xd6\x09\xe1\xb0\xe1\xb8\xd0\x21\x43\xe6\xad\x2b\xeb\x88\xeb\x70\xc5\x22\xc9\x43\x08\x79\x7f\x95\x10\xed\x7c\x9e\x03\xec\x3a\x95\x25\xbc\x29\x7b\xc1\xee\x3f\x8a\x67\xb4\x2b\xda\x0d\x28\x00\x5c\xa4\xb1\x2f\xd0\x85\x71\x4c\xac\xf4\xe2\x40\x61\x1c\x0b\x87\xd4\x69\x96\x6a\x73\xc4\xf8\xf9\x94\x45\x10\x8e\x07\xc2\x5f\xbf\x92\x63\x9f\x6c\x32\x0f\x93\x39\x7d\x16\x48\x12\xca\xd9\x1d\x56\x84\x52\x4c\xc4\xe4\x4f\x0d\x34\x15\x0f\xab\xda\x3e\x73\x9f\x81\x93\xe9\xb2\x4e\xf1\x99\x7b\xe3\xf1\xde\xd1\x63\xda\x02\x5a\x44\xd7\xef\x26\xaa\xcf\x8c\x33\x9c\xe7\x1c\x62\x17\xbe\xab\x7b\xb5\x99\xae\x41\x5c\xb0\xb0\x06\x01\xe6\x12\x6f\x60\xe2\x80\x6d\x9f\x20\x91\xd3\xed\x73\x7a\xe0\x38\x12\xf6\x75\x37\xf4\x0f\x0a\x25\x7c\x45\x20\x8e\x5e\xf8\xa2\x9e\xf2\xe0\xc8\xaf\xfd\x9a\x44\xfb\x08\x4c\x54\xd0\x8a\xec\xf1\xd2\x1c\xcb\x11\x78\x53\x58\x43\xe5\x9a\x5d\x52\x32\x1f\x31\xcb\x49\x19\x8e\x2f\x8a\x83\x54\xe4\x15\x2a\x6b\x61\x4d\x8c\x73\xbb\xd4\x76\x88\x13\xb7\xc8\x92\x7e\xaa\xc9\xc0\x8a\x07\x4e\xbc\x19\xf4\x18\x21\xac\xd7\xf0\x65\xdc\x6b\x04\x7e\x69\x7f\xe1\x96\x28\xf3\x11\x22\x38\x4d\x02\x7a\x4a\x4c\x6c\xf1\x72\xba\x51\x3a\x83\x9b\xc9\x56\x61\xaa\xd1\x65\xc0\xd0\x0b\x6d\x6b\xc8\x3b\xc4\x98\x6f\x6b\x27\x4f\x00\xa3\x21\x06\x30\x7b\x4c\xc7\x93\xc9\x91\x1a\x78\x95\x36\x70\x99\x7d\x31\x05\x2a\x67\x4c\xc4\xc7\x89\x3d\xb5\x4d\x13\x8b\x9f\x89\x2d\x13\x80\xe5\xbe\x22\xc6\x28\x8d\xd1\xc0\x5e\x35\xa1\x02\xce\x61\xd6\xa1\xb6\xcb\xdd\x3e\x19\x36\x2b\x4d\x06\x15\xf0\x5c\x5e\x68\x5e\xe0\x78\xb9\xa0\xfc\x04\xfd\xf5\x3d\x98\x35\x41\x97\x63\x95\x61\x97\x15\x69\x52\xfd\x5f\xfe\xe3\xff\xdd\xb3\x1a\x54\x6a\x15\xb7\xbe\x9f\x17\x60\x86\xd7\xac\x72\x02\x61\x56\x85\xe7\x3d\x5c\xfc\x2f\x00\x75\xaf\x58\x1d\xfa\x1e\xac\xff\x0a\x0c\x64\x2f\x61\x7d\xa0\x53\xa9\x99\x4b\x46\xf8\xa2\xd1\xc0\xa8\x1e\xe8\xdd\x91\x51\x25\x4a\xe7\x35\x6e\x5b\x2e\x47\xbd\x63\x15\xa8\x0f\xd8\xe4\x0a\x21\xfe\x24\xb4\x91\xd7\x28\xb2\x45\x3a\xc7\x64\x4a\x5a\x08\x6a\xee\x40\x62\x25\x02\x88\x34\xca\xa8\xde\xbb\xd5\xe2\xfe\xa6\x38\xdd\x23\x98\x47\xd8\x43\xe0\xb6\x15\x9d\x01\x9b\x43\x91\x8a\xe8\xb2\xbd\xa3\x9d\x4d\x4b\x71\xa3\x77\x3c\xff\x31\x4d\x48\xf4\xe4\xc3\xba\x77\x9c\xfa\x21\xc4\x44\x0f\xf1\x10\x1e\xef\xe1\xce\xc3\x18\x61\x60\x34\x3b\xee\xa2\x48\x2b\x25\x9d\x0c\x1b\x08\xaa\xd2\x89\xef\x73\x84\x5f\x51\xed\x84\xc5\x5a\x34\x8b\xa7\x49\xf0\x4e\xe3\x1a\xd3\x8e\x13\x37\x12\xc6\x0d\xc7\xdd\x48\x32\xd3\x1a\x82\xbf\x1b\x98\x4e\xa3\x02\x73\xd3\xfc\x2a\x38\x0d\xce\x8f\xc3\x0d\x84\x23\x01\xc7\x7b\x1b\x0c\x35\x78\xf9\x5d\x3d\x9c\x43\x07\xd7\xed\xd7\xed\x06\xcf\xee\xe3\x92\x39\xa3\x68\x9f\x5e\x30\xc3\x59\x31\x18\x88\x89\x81\xc9\x15\x35\x05\x25\x0d\xa8\x10\x64\xf6\xd4\x7d\x29\x56\x81\x72\x79\x4d\x0d\xc1\xbb\x6e\xa2\x12\xce\x43\x53\x5c\x4e\x8e\x1a\xba\x12\xdc\x90\x30\xb8\x7a\x2e\xaa\x2c\xfd\xe9\xa6\xc7\xcf\x7d\xc4\x1a\xec\x20\x34\xae\x81\x43\xc6\x1b\xb1\x70\x38\x62\x4d\x71\xff\xe7\xaf\xdf\x77\xd8\x8a\x60\xf0\xf6\xd5\xfd\x9f\xff\xf2\x9e\xd8\xc6\xfb\x3f\xff\xf5\x7d\x07\x8e\x71\x54\x77\x79\x49\xf2\xfa\xa8\x01\xae\x66\xb0\xac\x80\x69\x0e\x9d\xc6\xda\x06\xb5\x82\xc9\x49\x9d\x5e\xa9\xbf\xf6\x56\xaa\x42\x7a\x79\xed\x72\x62\xc0\x84\x98\x69\x41\x93\xd1\x82\x8d\x16\x31\x2d\x88\xd7\xd0\x61\xb7\xd4\x19\x77\xa0\x14\xfa\x77\x24\x23\xf2\x1b\x2f\x0c\xfd\xe2\x43\xf8\x15\x67\xfe\x4f\xe0\x96\xef\xf3\x9c\x3f\x58\x25\xb3\x89\x17\xe8\x18\x91\xb0\x55\x4e\xfc\xa0\x7f\xdc\x38\x62\xd9\xc5\x38\x2f\xe8\x45\xb4\xd2\xf7\x61\x80\x4d\xb0\xa1\x83\x6a\x69\x5d\xca\x5b\xb9\xba\x5c\x99\x81\x5f\x39\xcf\xe9\x1e\xff\xe0\xa9\x6e\x06\x14\xd1\x06\xa5\x10\xba\xd9\x12\x71\x35\x01\x6e\x3d\xaf\xa6\x40\xbd\x29\x1d\xf1\x10\x83\xa2\xa3\x0d\xb5\x19\xb4\xde\xa5\x86\x64\x0a\x37\xdc\x1a\x5e\x5c\xde\x18\xac\x6c\xb9\x21\x21\x04\x28\x72\x2f\x2c\x32\xff\xfa\x8e\xd1\x25\x5b\x6a\x19\x8c\xb6\x80\x9e\x19\xbf\xfe\x58\x1b\xaa\x27\x20\x28\x69\xc5\x1e\x1b\x37\xb2\x23\x0c\x55\xe0\x99\xa0\x70\x26\xd9\xfc\xb1\x0e\x60\x3f\xec\x03\x2b\x1c\x7a\xb5\xd0\x4b\xc4\x25\x9f\x25\x3f\xe2\xb9\x1b\x5b\x5c\x68\x89\x05\xbc\x33\x2f\x78\x56\x02\x64\xd6\xa7\x17\x04\x51\x40\xf8\x12\xe1\x0d\x3e\x6e\x86\x5f\x35\xb8\x77\x7e\x13\x0c\x48\xc3\xba\xbe\x10\x1b\xc1\x06\x98\x7b\xb4\x58\xd7\x24\xfd\x2d\x2e\x10\xe4\x6b\x70\xb1\xc7\x90\x06\x23\x1e\x4c\x20\x68\xc2\x32\x53\xd6\x19\x1e\x83\x81\x4d\x0c\x9d\xc3\x11\x37\x2d\xe5\x11\x29\xf9\xb4\x06\x1b\x5b\x97\xdd\xfd\x02\x3b\x39\x29\x29\xca\x7d\xc6\xf2\xb2\x41\xa4\x88\x63\xac\xdf\xd0\x3c\xeb\x53\x70\x43\x43\xac\x84\xf3\x0c\x26\x57\xec\x64\x03\x64\xcb\x0c\xf5\xb1\x73\x83\x1b\x36\x18\xef\x97\x13\x36\xa6\xd3\xdd\x9b\xda\x33\x0c\x33\xd8\x01\x0d\x4d\x4b\x13\xca\x88\xd8\xb7\xe5\xba\xdc\x3b\xa5\x8e\xe7\x50\x21\xc8\xef\xb0\xd8\x88\x0a\xb4\xbe\xc2\xa1\x8e\xdc\xd8\x07\x51\x1f\xa8\xd6\x00\x08\xc9\xd6\xf3\x05\x34\x60\x54\xfe\x61\xa2\xee\x86\xb0\x1d\x6c\x5f\x52\xd7\x3e\x71\x03\x1f\x66\xf2\xf8\x11\xe4\x3b\x92\x05\xd2\xc0\xf7\x52\x08\xfb\x7b\x5a\x84\x44\x8f\x59\x5f\x22\xf1\x04\xaf\x6c\x54\xe3\x4f\x02\xab\x0d\x70\xa8\x81\x40\x01\xaa\x54\xa3\xe3\xcf\x01\x84\x72\x9d\x9c\xf9\x8c\x84\x76\xe7\x83\x86\x11\xbe\x6f\xc1\xb1\xdb\x07\x1d\xca\xbf\x8b\xb5\xf5\xa5\xe5\xd9\xdb\x91\xbd\x19\x69\x04\x0e\x9d\x7c\x83\x57\xf7\x43\xd5\x77\xc6\xcb\xb5\x25\x7e\xe2\x41\xb3\x6f\x1b\x79\x6a\x37\x50\x3a\xef\xc4\x0d\xf5\x4d\xe8\x8f\x2f\x90\x07\xbf\xff\xa7\xa2\x2e\xf5\x01\xad\x08\x43\x10\x07\x86\xf5\x15\xa2\x40\xd9\xb4\x39\xfc\xa0\x2f\xae\x3c\xed\xc1\x61\x7b\xe0\x57\x5e\x69\x1c\xae\xc7\x69\x16\x82\xc5\x87\x27\x0f\x24\x3c\xc0\x5e\xa2\x40\xf9\xf1\x6a\x61\x32\xfc\x57\xc9\x4b\x0b\xb3\xf7\xad\xef\xbb\x6f\x12\xb3\x79\x10\xd0\xaf\xb8\x87\xaf\xc0\x49\x6c\x94\x98\xfe\x13\xff\x10\x92\xaa\x2b\x99\x8a\x84\x63\x34\x60\x62\x24\xfb\x79\x8d\x93\xb2\x5a\x61\x3c\x78\x34\x45\x17\x1b\xa3\xe2\xe0\x60\xf0\xc6\x67\x24\x9b\xff\x2e\xe2\xc7\xbf\x86\x8f\xda\xee\xce\xb7\x5b\x63\x24\xa4\xf9\x2b\xa7\x1e\xc3\x7f\xb2\x61\xaa\xf7\x1f\x88\x03\xd2\x61\xbb\xd5\x32\xa5\xcf\x40\x46\xfe\x21\x0f\xb3\x29\x50\xf6\x98\x17\x0b\x54\x61\x94\xbe\x3b\xf5\xfa\x6a\x68\xf7\x36\xe1\x03\x4f\x43\x6f\xf5\x90\x21\x61\x88\xd8\xe6\x8e\x2a\xef\xe0\x5c\x65\x9e\x2d\xc3\xe2\x1d\x5b\xf7\x44\x84\xd0\xcf\xfa\xb2\xc7\x9e\x0d\xe5\x0a\x36\x63\xc1\xa4\x93\x4d\x65\xba\xa1\x5b\x90\xb4\x80\x78\x97\x84\xfa\x6c\x10\xfb\x1c\xd1\x2f\xcb\x60\xbd\x36\x18\x5d\xa7\x3c\x50\xdb\x80\x2a\xae\x1d\x32\x0b\x88\x2c\x9f\x1a\x48\x6e\xd8\x49\x27\xa3\xa4\x1b\x79\xda\xb7\x69\x94\x1d\x1d\x7d\xcf\x16\x46\x30\x61\x09\x19\x67\x34\xaa\x4d\x7d\x59\x95\xe8\x20\xfa\xd3\x97\x1c\x2c\x04\x11\x89\x12\x6f\x21\x33\x44\xd5\x1c\x13\x8a\xe6\x12\x3b\x1c\x0e\x34\xec\x5e\xab\x58\xeb\xea\x25\xdb\x67\xf1\x4a\x45\x8f\xae\x74\x72\xe3\x90\x51\xed\x56\x1c\x95\x86\xa1\x5c\x43\x9b\x6c\x48\x33\x68\xf6\x5f\x26\xd6\xed\x73\x9b\x0e\x84\xc0\x98\xcd\x6c\x3d\x8e\x77\xac\x0a\x83\x27\x8a\x38\x01\x6d\x34\x2e\x71\x68\x3b\xf1\x98\x99\x68\x57\xda\xca\x88\x0b\x21\x1a\x94\x6c\x13\x07\x9d\x31\xfa\x50\xeb\xb9\xe4\x4a\xaa\x35\xfe\xa0\x0a\x93\x07\x8c\xcd\x40\x82\x42\x0e\x80\x38\xf4\xe1\x78\x15\x2b\x0f\xe4\x01\xe3\xcd\x63\xe9\x82\x52\x99\x1f\x99\x7c\x9d\x2f\xdf\xc3\x7f\xba\xbf\xf9\x52\xf8\xc0\xce\xe5\xd6\x4e\xac\x82\xe5\x8f\x32\x61\xc5\x3a\xee\x04\x2f\x3a\xd4\xf4\x8d\x13\xa5\x3f\x1e\x7c\x78\xe1\xeb\xed\xfc\xc3\x2c\x79\xab\x4f\x2e\xb6\xa8\xac\x4b\x8a\x27\x54\x1d\x49\xe9\x94\xba\x63\x58\xbc\x51\xd9\x07\x61\x36\xd2\x7e\x9b\x25\xd1\xe3\x25\x0b\x9a\xc1\x1e\x44\xe2\x39\x72\x08\x35\x36\x4b\x1c\x0c\x84\x95\x8a\xa3\x0e\x4c\xe0\xc8\x27\x05\xc5\x37\xae\x10\x44\x59\x03\xbd\x96\x83\x19\x61\xc4\x85\xde\x9c\xfa\xa3\xb3\x95\xf2\x08\x59\x2f\x09\xd9\x9f\x5c\x24\xe1\x42\xdf\xd2\xae\x54\x4d\xfa\x7d\x64\xef\x99\x96\xd9\xe4\x1f\x0f\x26\x5d\x3c\x6c\xf6\xac\x19\xa9\xd8\x52\x30\x99\xab\x77\xad\xa9\x7e\xd3\x82\x10\xdb\x57\x5b\x5c\x0a\x16\xb0\x6b\xb3\x06\xc2\x17\x07\xa9\xe1\xf2\x9a\xdd\x93\xd9\x44\xa5\xc1\x57\x1e\xdc\xd2\x7f\x8f\x76\xbb\x47\x9b\xcd\x83\x89\xc5\x48\x3d\x88\xa2\xe6\x28\x77\xa0\x62\xc8\x21\x9b\x97\xb4\x94\x71\xca\xd3\x0b\xcb\xf6\x09\x71\x23\x35\xa5\xc7\xc0\x74\x48\x67\x17\x1a\x40\xd8\xc8\xee\xf7\xff\xcc\x8e\x76\x62\xfb\x28\xee\x33\x38\xf3\x08\xd1\xd4\xc2\x81\x2c\x9d\x51\x2e\x71\x24\x25\x43\xa6\xfc\xae\x31\x06\x9f\xf0\xc0\x97\x15\x6c\x28\xb4\xcb\x57\x27\xf1\x0c\x97\x98\xc5\xfe\xf8\x02\x05\x66\xdf\x94\xda\x1a\xae\x7d\x6a\x14\x03\x87\xdd\xc1\xa5\x14\x6e\xb4\xb8\x57\x89\xc3\xc5\x9f\x60\xff\x8f\x79\x5e\x4c\x8d\x28\x41\x95\xb8\x18\x89\x57\xf8\x11\x5f\xb3\xd9\x4d\xf9\xb1\x5c\xfc\x8d\xfe\xc7\x7f\xcd\x6f\x7c\x05\x9f\xca\x18\x75\x19\x86\xaf\x05\xca\xbf\xc8\x00\x64\x05\xf0\x9d\x63\x8b\x56\xec\x47\xdb\x70\x20\x18\x4d\x86\xd3\xac\x0f\xac\x35\x60\xa7\xdb\x18\x89\x58\xaf\xa1\x32\x04\x88\xd8\xb2\xb5\xba\x20\x13\xec\xc5\x38\xfa\x27\x5d\xd4\xea\x53\x40\x97\x21\xf7\xab\x27\xe2\xb2\x6c\x3b\xc4\x23\xdc\x2a\xa5\x60\x3f\x73\xd8\xf1\xc8\x0d\x2d\xb0\x69\x52\x37\xfe\xa0\xcc\x37\x7f\x37\x73\xad\xa4\x58\x5c\xf8\xad\x49\x73\x87\x8f\xe5\x66\x0d\x9d\xdb\x2d\xc8\x41\x11\xeb\x4c\x9c\xf2\x3e\x26\xa5\x8a\x81\x2e\x58\x21\x92\x12\x1b\x9d\x0e\x07\xda\xe6\x3e\x59\xde\xce\xba\x63\x93\x61\xed\x8b\x9f\x0f\xee\x77\xb0\xe8\x0d\x4c\x5f\x93\x67\xbe\x02\xc9\xe7\x7a\x7c\x46\xd0\xe6\x52\xde\x0b\xa2\x80\x9c\xcd\xd2\x4a\x5f\x4d\xcc\x53\xdc\x66\x12\xa0\xf0\xd2\x73\x7e\x04\x0e\x4e\xf5\x6b\xbf\xfc\x3a\xb0\x86\x52\x41\x50\xde\xe9\x08\x85\x37\x86\xa8\xa7\xac\x71\x1e\xf3\x95\xa9\x21\x1e\xa6\x70\xf3\xcd\xe3\x1e\x0e\x5f\x8b\x9f\x44\xe7\x54\x11\x41\xa4\x75\xc6\x42\xa0\xb5\xae\x7d\xe2\xcf\x9a\x34\xa6\xaa\x47\x9f\xac\xb1\x68\x60\xa3\x4f\x65\xba\x67\x1c\xb0\xea\x48\xc2\x37\xfb\x3a\x17\x6b\x95\x6e\xf1\x7a\x3f\x28\x48\x30\x9e\x59\x7d\xfd\x25\xf7\xd3\x34\xd4\x9c\x03\x75\x2d\x24\x70\xe3\x11\x10\x7e\x5e\x5f\xfc\x0d\xff\x3f\x06\x82\x05\x63\x0f\x83\x63\x00\x87\x5a\x9f\x89\x88\xf5\xd2\xbf\x22\xe8\x55\xd3\x7c\xec\x16\x7f\xf3\x2b\xfe\x23\x7e\xdf\x12\x13\xc4\x45\x48\xb4\xf4\x2c\x2f\x23\x49\xb2\x5c\x1f\xcb\x9e\x27\x39\xa6\x22\xb0\xda\xf0\x06\x68\x35\xda\xbf\xd0\xdf\x11\x10\x26\xf3\x96\x38\x10\x26\xf3\xc5\xab\xe6\x66\xdc\x0c\x80\x90\xac\x80\xc8\x08\x1b\x58\x6b\x73\xf8\x0e\x86\x8c\x43\xba\x17\x56\x4a\xac\x3d\x1b\x46\xc2\xe5\x80\x7e\x5f\x01\x7f\x38\xe5\x0a\x2d\xce\x01\xaf\x60\x1c\x6f\xd8\xcf\x93\x41\x84\xf0\x38\xef\x2c\x09\x40\x2c\x54\xdb\x81\x30\x95\x10\x4d\x65\x1a\x57\x34\x98\x06\x38\xcb\x4f\xc6\xaf\x29\x39\x78\x8d\x44\xab\x71\x55\x66\xf8\x10\xda\x73\x9b\x6b\x1c\xb5\x4d\x1c\x80\x62\x21\xc2\xa3\xd4\x48\xca\x12\x61\x81\xf2\xaa\xa4\x92\x6c\x28\xf8\x40\xab\x44\x27\x65\x97\x4c\x08\xca\x65\xf8\x53\x20\x29\x11\xdf\x0b\x78\xf1\x43\x6e\x03\x2a\xe7\x2a\x39\x2c\x4c\xb4\x52\x58\x3d\x89\x08\x11\xd0\xd6\x4d\x84\xcd\xe0\x42\x7e\xa7\xcf\x84\x35\xef\xd6\x24\x81\x07\xd1\x5c\x49\xe0\xd1\x7a\x73\xc8\xe0\xc7\x26\x92\x12\xd1\xb0\xe6\x9d\x5b\x73\xd4\xdf\x9a\xfd\xf8\x11\x8f\x92\x78\x85\x8d\x4b\xd6\x4f\x58\xd0\x6c\x55\x44\x1b\xcc\x9e\x29\xbe\x3d\xb2\x2e\x0c\xb3\x54\x98\x6c\x81\xaa\x72\x7b\xd5\xdf\x78\xfc\xff\xae\x96\xc2\x0c\x07\x2d\x59\xde\xbf\x2d\x68\x98\xf8\x41\x06\x9e\x60\xb4\x4c\x5a\x8b\x17\x48\x19\xd1\xa7\xca\x85\x62\x09\x7e\xd4\x36\xcc\xb6\xb8\x78\x72\xac\x01\x19\x44\xd7\xdf\xc2\x40\x4b\x47\x56\x3c\xe7\xd1\xbf\x15\x90\xe2\x95\xdb\xe1\x2c\x5d\x00\xe6\x9b\x3b\x5b\x98\x6b\x5c\x54\x49\x38\x56\xae\xef\x06\xe6\xb0\xab\x56\xe3\x34\xf9\x71\xd7\x34\x65\xbf\xec\xc1\x1c\x02\x5e\xf2\xf4\xaf\xf7\xcc\xbf\x21\x46\xd4\xdf\x8b\x7f\xc3\xb1\xa1\x7f\x08\x47\xfc\xaf\x7f\x37\x9d\xcc\xa5\x3c\x98\xb7\x6c\x6e\x74\x92\x0a\x7a\x6c\x7f\x24\x12\x9d\x30\x6a\x54\x2d\xc1\x17\x16\x4a\xd5\x56\xd1\x92\xf4\xf8\x4c\x8a\xec\x82\x2f\x75\xaf\x6c\x8f\x6a\x49\x4a\x0b\xb9\x90\x1c\xa0\x8d\x63\x63\xb2\xdf\xf0\x92\xfc\xbf\xc1\xd6\xfe\x1c\x53\x27\xd1\xa6\x73\x11\x88\xb3\xa0\x72\x48\x4b\xe8\x60\x3a\x71\xcc\x91\x70\x84\x62\x6b\x3f\xf4\xfa\xb1\xe4\x04\x03\x57\xb0\x3c\xc8\xc3\xbc\x48\xc2\x44\x77\x21\x50\x94\x84\x81\x94\x5b\x33\xb9\x3b\xa0\xa5\xea\x55\x5b\x25\xe9\xf4\x92\x60\xa7\x6f\xfc\xb6\x41\x4c\x85\x51\x05\x73\x61\x11\xfd\x35\x57\x8d\x8e\x6a\xea\xbc\x41\x4d\xe5\x43\x6d\xb5\xb5\x79\x61\xe1\x08\xa3\xdf\xee\x50\xc1\x11\xbc\x6f\xc7\x83\x55\x9e\xa4\x23\xa6\xe4\xd1\xb1\x96\x9a\x9e\x7d\x25\x07\x6d\x15\x3e\x8e\x96\x8a\x3f\x77\xb8\xe3\x11\xd8\xb3\x60\xf0\x00\x96\x74\x0b\xc1\xb6\x6a\x54\x41\xfc\xda\xd9\xdd\x2a\xf7\x67\x10\xe5\x9a\x8d\x6a\xe0\xd9\x8e\xcb\xc1\xa4\xcf\x1a\xff\x56\xe9\x60\x90\xe6\x08\x11\x18\x61\xa9\xd0\x5d\x5a\xa8\xea\x10\xc5\x71\x0c\x28\x9b\x96\x42\x2b\xa3\x99\x0c\xc9\x45\x54\x09\x01\x60\xdd\x38\xf2\xa4\x26\xd5\xfb\x85\xa3\x5a\x21\x1e\x01\xe8\x34\x24\x9d\xcd\x83\x61\xce\xcb\xf1\x30\xd2\xfd\xc3\x51\xbf\x29\x2b\x24\x2b\xe8\x82\x89\x78\x79\xc9\xcf\x0d\x7c\x34\xc4\x72\xb4\xe4\x64\x26\x1b\xea\x8e\x4f\xf7\x5d\xad\xfe\x25\x6d\x95\x1d\xa0\xda\xeb\xe3\x2d\xd7\x45\x9a\x22\x59\xe8\xc3\x25\x5e\x78\x1f\xb4\x6a\x80\x23\xe6\xda\x5c\xa3\x9b\xea\x17\x1b\xa4\x4f\x68\xc9\xb9\x4b\xc2\x84\x0d\x84\x42\xf8\x00\x71\x8c\x2d\x71\x1b\x12\x04\xe2\x57\xa5\x88\xc4\xdf\x8c\xee\xf6\x2c\x50\x62\xa9\x3a\x56\xde\x83\xbf\x65\x17\x77\x02\x2e\xdb\xfd\xda\x8c\x48\xa9\xed\x4e\x39\x03\xd6\x61\x04\xcd\x19\xdd\xa1\xdb\x06\x57\x00\x4c\xd0\x89\x78\x08\x13\xb5\x12\x7e\xdd\x95\xf5\x7c\xba\xf5\xb8\x8b\x2a\x1a\x24\xae\xf7\x3e\xa6\x39\x51\x49\x41\x3a\xc6\x94\xef\x77\x53\xed\x65\x41\xa9\xd2\xe9\xc9\x80\x73\x6f\xc2\x20\xff\x97\xe1\x25\xac\x1c\x04\x55\x8a\x84\x38\x5f\xba\xb1\xcb\xd3\x00\xd2\x12\xa2\xbb\xe2\x1a\x29\x1a\x43\xc0\x8d\x20\x62\x37\xe2\xb1\x1b\x03\x1d\xd5\xe6\x7b\x66\x8e\x48\x40\x56\x4f\x27\x28\x97\x82\x38\x7b\x44\x4c\x7e\x3c\x1a\x62\x7a\x2c\xc6\x54\x2d\x0b\x58\xf0\xee\xf7\xff\xf3\x78\xb8\x82\xe3\x0d\xff\x65\xaa\xe1\x64\xd7\x42\x2c\x81\x54\x88\xef\x27\xc2\x11\x65\xd3\x97\x87\x81\x32\x20\x25\x07\x64\xe2\xcf\xe5\x46\x42\x09\x9b\x61\x46\xe1\x63\x14\x0a\x56\x4b\x27\x0f\xe7\xc7\x47\xcd\x8e\x2d\x20\x15\xa7\x15\x53\xc3\x8f\x9d\x1c\xed\x95\xe7\x58\x6d\xb8\xc7\xf7\x50\x2a\x20\x0f\xdb\x65\x8f\x84\xa6\x8a\x4f\xc3\x26\x33\x14\x9b\xa6\xc3\xc7\xa2\x9f\x1d\x13\x0a\x52\x95\x55\xa3\xec\xf9\x14\x9e\xde\x11\xc1\x70\x4c\x50\xc4\x76\x20\xd8\xc1\x46\x0b\x82\x28\x1e\xb9\x8f\xcc\x59\x8e\xc8\xff\x44\x6b\x76\xf3\x9c\x1f\x0b\xef\x1b\x02\xf9\x0e\x83\x0a\x66\xb7\x58\x12\xff\x22\xde\x7a\xa9\x7e\x2c\x95\x5c\x90\xee\x23\xb1\x90\x08\x71\xb0\x84\xa9\x49\xcb\xee\xa8\x96\xee\xd5\x44\xc5\x71\x58\xb5\x31\x0a\x65\xa3\x08\x81\xa6\xc6\x72\x73\xd3\x1e\x0b\x3b\x35\x3d\xd4\xc9\x9a\x59\xfc\x0e\x73\x18\x8f\xbc\x88\x9a\x74\x69\x45\x1c\xd8\x09\xbf\xfe\x4d\xb3\x6f\x8a\xfc\x31\xec\xb8\x9a\x30\x0c\x47\x3c\x8f\x8e\x2e\xde\x91\x65\x43\xfc\xc1\x7c\x9b\xc5\x5a\x5c\x12\xcc\xa5\x16\xb7\x67\x62\x3c\x2e\xe1\x66\xe7\x49\x05\x8e\x7b\x1f\x5d\xc1\xf1\x3e\xb9\x1a\xac\xfa\xbb\x31\xe7\x30\xe4\xf4\x62\x88\xb0\xdd\x60\xc5\xe7\x99\x68\x05\xf1\x82\x63\xa5\x4b\x76\xaa\x18\x2c\x5d\xe2\x44\x69\x3c\x74\x7e\x4d\x1c\x74\x69\xe1\x9f\x26\xba\x6d\xee\xee\x16\x48\x79\x23\xea\x92\x88\xc6\xaa\x3f\x19\xa8\x55\x4c\x92\x35\xed\x4a\xa1\xf9\x5e\x2a\x0e\x37\xbf\x43\x5c\x14\x66\xae\xa0\x4f\xe1\x38\x65\xfe\x9a\x95\x87\x24\x43\x6c\xe1\x48\x02\xbf\xef\xe2\xfc\xf5\xc5\xdb\x79\xf1\x1a\x51\x97\xe2\xf5\x13\x93\xe2\xc7\xe0\xe7\x60\x57\x25\x1d\x5e\x2f\xb9\x20\x08\x07\x38\xd8\xa7\x85\x32\x86\xb8\x8c\xac\xc1\xa3\x50\xdb\xdd\xde\xaf\x55\xd1\x38\x2f\xde\x41\x71\xca\xa1\x5d\x86\x8a\x6b\x65\x0d\xef\xf4\x34\x11\x17\x63\x17\x56\x84\x4d\xa7\x52\x76\x41\x3e\x8f\x0d\x6e\x46\x2b\x38\x84\xb4\x28\x1f\xd1\xb8\x4e\x21\x84\xf6\xab\xaf\x5d\xc9\xde\x23\xf9\x7b\x1d\xcd\x1b\x38\x00\xcd\xed\x6d\xa1\x1e\xb0\xf3\xe2\x71\x93\x59\xed\x59\x0c\xe0\xef\xef\x18\x41\x72\x82\x74\xb8\x7f\xe0\x9e\xd0\xd6\xe6\x9c\xf6\xd2\x86\xb3\x78\xeb\x65\x3f\x98\x2b\xdd\xa6\xb4\x68\x12\x5e\xe3\x55\x78\xcc\xaa\x80\x0d\x66\x01\xef\x6a\xc1\x9b\x38\x47\xa0\x10\xda\x65\x87\x46\x5b\xa5\x6e\xa4\x70\x9b\xee\xc1\x26\xc9\x23\xb3\xca\xc1\x13\x89\xb0\x5f\x8c\xba\x43\x67\x84\x15\x07\x22\x49\xcf\xfb\x62\xe7\xa8\x6b\x8c\xe9\x92\xf8\xe9\x8e\xee\xe2\x7a\xd3\x99\x57\x69\xd9\xb3\x3b\x4e\x57\x1c\xf6\xe6\x18\x35\xda\x92\xf1\xc8\xec\xc9\x38\x84\x82\x98\x02\x41\xb2\x8f\x0e\x06\x10\x1d\x2b\xe1\xc6\x20\xf2\xca\xd5\x2d\x9e\xc9\xbf\x63\x80\xbd\x24\xe2\x59\x58\x42\x9e\x11\xc0\xaa\xd9\xdc\x2e\x7e\xa0\xff\x8d\xf5\xa3\xb2\x23\x88\x93\xcb\x4a\x52\x65\x76\xe4\xa4\x43\x63\x7d\x79\xa8\xe5\x21\xc0\x02\xd9\x70\x69\x2f\xa9\x90\x98\x47\x1c\xbb\x14\x4b\x60\x3b\x25\x19\x9a\xc7\x14\x11\x78\xc5\x2a\x82\x63\xdf\x85\x0c\x63\x21\x50\x69\xc9\x24\x4c\x0e\x6b\x16\x2c\x3a\x25\x5e\x3a\x6a\xf1\x75\x56\x5c\x2a\x40\x15\x04\x95\x81\xc0\x12\x38\x4a\x63\x9f\x89\xf9\x0f\xc7\xf8\xab\x13\x86\xcf\x52\x7e\x17\x2f\x38\x79\x3c\x94\x6f\x19\x43\x28\xa9\xe4\x2d\x83\x20\xdd\x52\x21\x70\x11\x2f\xe7\x78\x3c\x31\xec\x54\x4e\x04\xac\x7c\x14\x78\x72\x00\xa7\x4c\x98\x82\x47\xc5\xec\xb3\x0c\x2a\x21\xdd\xba\x6d\x48\x44\x81\x40\x03\xbe\xd5\x07\x86\x36\x04\x1d\x11\xcd\x12\xa8\x6f\xb0\xf8\x51\x75\x63\x24\x97\x0e\x4c\x6d\x57\xfa\x9d\xc6\xd1\xcb\xa5\xba\x03\xb6\x4b\x28\xba\xbb\x96\xb7\x35\x24\x5b\x47\x48\x66\x8e\x71\x16\xda\xd1\x00\x85\xb0\x71\x97\x48\x26\xe1\x7d\x19\xdb\xce\x36\x4f\xb0\xb3\x8a\x41\x56\x39\x30\x4d\x4d\x33\xd0\xcb\x8d\xf7\xef\xe1\xff\x7c\xf1\xfa\xd5\x49\xf1\xeb\xa3\x9b\x9b\x9b\x47\x68\xe1\xd1\xa1\x65\x64\xa1\x13\x7b\x52\xfc\x2f\x2f\x5f\x9c\x14\x7e\xbd\xfe\x52\x87\xc0\xf6\x65\x16\x22\x21\x1b\xb7\xc8\xf1\x35\x7b\xea\xff\x31\x62\x3f\xa0\xf5\x7a\xac\x58\xff\xab\x47\x0b\xba\xca\x8c\x89\xc4\xae\x8a\x6b\x82\xa6\x85\x2a\xde\xd2\x8f\x94\x01\x59\xb7\xd4\xf9\x05\xff\x93\x7c\x26\x5e\xe4\x63\x8c\x1d\x9f\xa6\xfb\x1a\xc0\x20\xb6\x63\xd0\x40\xe3\x87\x1b\x42\xa4\x96\xac\x89\x5a\x1a\x1b\x67\x0c\x1c\x02\xfe\xf0\x07\xbc\x72\x5e\xb3\x05\x5a\x0b\xfb\x27\x6c\x41\x12\x8e\x49\x71\xeb\xfb\x61\x2b\x1c\x01\xa3\xa9\xab\x5b\x49\x64\x1d\xb0\x42\x50\x0c\xa5\xf6\x48\x36\xac\xc9\x89\xfa\x90\x77\xf0\x96\xcd\xff\x16\xcf\x9a\x34\x86\x97\x49\x80\x2c\x92\x25\x11\xd4\x06\x8d\x48\xac\xf8\x85\x9c\xd5\x5d\xa9\x0a\x40\x20\xd2\xba\x24\xee\x07\xb7\xcf\x01\xe4\xc6\x9a\x1e\x37\x10\x0d\x35\xa6\x8b\x64\x9d\xc4\x71\xf8\x44\x82\x61\x88\x99\x42\x33\x5e\x8a\xc4\x12\x28\x33\x01\xba\x03\xd0\x54\x8b\x89\xf9\x8e\xd8\x89\x9f\x14\x62\x0a\x73\x52\x98\xe5\xf8\x09\x7b\xc4\xe2\x5f\xf3\x51\x39\xc1\xb9\x0e\x7f\x8b\x1b\x92\x3e\x03\xda\x4f\x36\x01\xc1\x4f\x7d\x48\xba\x42\x06\xc9\xdf\xfc\x66\xb4\x10\xd8\x2a\x8e\x5f\x32\xb9\xc3\x42\x52\x88\xbc\xf3\x9d\x3c\x54\x1e\x26\x64\x88\xd3\x80\x4a\xc6\x91\x66\xf8\xd9\xec\xae\x4e\x99\x44\x80\x51\xeb\x7b\x4e\xa3\x1f\x9c\x5f\x90\xff\xdc\x30\x48\x54\x11\x86\x89\xf0\xb5\x12\x5a\x40\xe4\x3b\x66\xe5\xec\xcb\x01\xfb\xca\x04\x70\x24\x4b\xdd\x0c\x59\x9a\x09\x29\x4a\xe9\x6c\xca\xff\x32\x9d\x1d\x71\x6f\x0a\x38\xec\x69\xb2\x0f\x49\x0f\x31\x96\xd5\xac\x97\x68\x66\x3d\xea\x46\x3c\x6e\x8c\x79\x91\xdc\x2e\xec\xdf\x53\x3c\x0e\x9f\x72\xa6\x3c\x0f\x19\x35\xbe\x1f\x84\x26\xc4\x2b\x22\xb0\xf8\x99\x41\x7e\x71\x01\x30\xb6\xc7\xc7\x3b\x51\x08\x61\xa4\xd1\x4f\x27\x9f\xef\xa4\x65\x89\x11\x2a\x91\x4e\x07\x45\x9b\x66\xe7\xca\x7a\xf1\xb8\x81\xb6\xb4\x19\x91\xa9\x2b\xda\x51\x71\xfe\xcf\x1e\x25\x37\x7e\x5f\x35\xb7\x12\x26\xfc\x31\xf1\x40\x25\x94\x4b\x92\x96\x25\x9f\x59\x04\x8c\x93\x7a\xcc\xdf\x8a\x7f\xf6\xb7\x53\x0d\xaa\xd1\x0b\x18\x12\x06\x43\x1f\xc5\x15\x23\x56\x88\x46\x5c\x23\x5b\x1e\x1e\x46\x38\xda\xd7\x9c\x83\x7b\xc2\x8f\xe1\xda\x55\x5b\xc9\xb5\x51\xa5\x91\xb6\x23\x6b\x92\xac\x0c\xc7\x2f\x8a\xb3\x78\xa5\x99\x59\x83\x3c\xc6\xd9\x4b\x5d\x32\x8a\x54\x47\x92\xda\x88\x4d\xcd\x61\x1c\xb3\x3a\x40\xe5\x51\xb7\x5f\xa4\x3d\x84\x04\x69\x38\xc6\x99\x48\x9c\x07\xd8\x1e\x1a\x28\x24\x2d\x24\xf6\x09\x83\x27\x96\xa3\x41\xb3\x93\xda\x9f\x15\x34\x7b\x7a\xcf\x06\x92\xd5\x27\xf7\x78\x2a\x68\x36\x58\x3a\x95\xf7\x92\x41\xe1\x1d\x16\x11\xa6\xcb\x8e\x15\x05\x12\x0b\xd8\x50\x41\xe3\xca\x36\xa6\xc6\x48\x1f\x11\xa6\x82\x67\xdf\x35\x16\x5b\x99\xc7\xb1\xef\x63\x0e\x0e\x33\xe2\x9e\x2f\xe7\x24\xe7\xdf\x74\x08\x30\x7d\x68\x91\x8e\xf2\x12\x51\xb3\x5c\x92\x4c\xb6\x43\x16\x6a\xb0\x07\x0c\x2d\x61\x28\x16\xf2\x8f\x7c\x12\xeb\x9b\x85\xa6\xaf\xe4\x4f\x6c\xc3\xcc\xca\x8c\x6b\x47\xf2\xf9\x0a\x31\x6f\xe8\x7b\xc1\x96\x85\x12\xf6\x07\xb2\x07\x07\x06\x9a\x4b\x15\x4e\xd9\x8e\xbf\x38\x6a\x76\xb7\x78\x29\x5c\x14\x57\xbb\xc0\x97\x04\xac\xdb\x93\x4c\xc0\x91\x97\x92\xcc\xee\x2a\x90\xfb\x3d\xf2\x39\xba\x04\xfa\x50\x13\xab\xe8\x37\xd3\xf0\x5c\xb8\x8e\x15\xd0\x93\xba\x11\x29\x53\x70\x7f\x83\x7b\x42\x53\x85\x34\x2a\x68\x44\x8d\x31\x96\x34\x01\x55\x74\x4b\x00\x7c\x5a\x9c\x28\xa3\x62\xe0\x56\xdd\x07\x22\x60\x3f\x3c\x7f\x25\x3f\x38\x00\x13\x3b\x03\x73\x58\x29\x8e\xde\xc4\x05\x9a\x39\x68\xcf\xf1\x25\xe8\x14\x3d\x95\xb0\x99\xb4\x48\xf1\x63\xb0\xe7\x2d\xf1\xb8\x4e\x22\x27\x94\x19\xb4\x89\xd2\x02\x42\x4f\x11\xe3\x7e\xab\x36\xf2\x17\x60\x00\x25\x12\xc2\x0d\xc7\x6e\x6c\x44\xde\x4c\xac\x82\x1b\x04\x19\xaa\x6f\x15\xca\x82\x5d\x98\x23\x15\x1a\x9d\x59\x1c\xad\xf9\x28\x9e\x96\x15\x48\x14\x34\xfe\x5b\xd5\xb1\x0a\xd1\x04\x90\x4d\xeb\x2e\x7b\x12\x16\x7f\xe3\xf0\x9f\xf2\x8d\xa6\x64\xb5\xce\x5b\xff\x68\x54\x87\x36\x0c\xd8\x45\x18\x02\x5c\x0a\x9f\xd9\x92\xd3\xc4\xc3\xf0\xd5\x41\x9e\x4d\x36\x36\xdd\x45\x76\x24\x60\x57\x4c\xfe\xbf\xa9\x13\x47\xfd\xf1\x31\x59\x26\x11\xd1\x8a\x0b\x3b\x20\xe9\x54\xa3\x89\xe8\x39\xf2\x6e\x11\x57\x63\x2b\x03\x15\x00\x5e\x72\x38\x64\x69\xdb\x6c\x0e\xeb\x7e\x9e\x8d\x3b\xa9\xfb\xd8\xf7\xe2\x0b\x2e\x8b\x8e\x24\xe4\xfc\x96\x0f\x4e\x87\xdf\xee\xba\x02\x26\x4a\x2d\xcc\xeb\x37\x16\x95\x44\xf5\x0d\xe5\x8e\x5a\xbf\x06\x2b\x66\x8d\x13\x37\x94\x88\x8b\x08\xbb\x16\x4b\x58\x50\x79\xbd\x5a\x95\x5e\x78\xab\xb4\x8e\x39\xc0\x87\xd7\x6f\x30\xa9\x31\xfc\x9c\xb8\xd8\xc7\xec\x25\x28\x3d\x84\x27\x1f\x4b\xa0\x20\x21\x67\xb5\xd1\xf4\xe6\xb1\x8f\xe3\xdb\xc6\x4a\xc4\x92\x4b\x4c\x6d\x53\xc4\xe0\x03\x1d\xa2\x93\x85\x12\x48\x4b\xe0\xf8\x25\xf2\x19\x1b\xa8\x41\xd1\x3a\xc6\xa8\x4c\xc9\x2c\x7a\x4f\x2a\x7c\x34\xda\xf3\xa4\x86\x2e\x05\xa1\xe2\xba\xec\x42\x72\xc5\x01\xb2\x98\x15\xf3\x5e\xfc\xa7\x34\x52\x30\xef\xb5\xbe\x56\x85\x39\xe7\x86\xbe\xa1\x43\x41\x19\xa0\x8e\x24\x9f\x18\xa3\x3d\x4c\x22\xe5\xbc\x88\x4d\x64\x7e\x6a\x18\x8d\xec\xdc\x04\x63\xe1\xf1\x81\x13\x6e\xd1\x00\xe5\x06\x0b\x77\xd0\x1b\xf9\x9c\x43\x8f\xb4\xfa\xc7\xa0\x32\x3f\xbf\xe4\x4e\x54\xb8\x98\xff\xd0\x99\x50\x5f\x32\xe6\x40\x0a\x48\xb2\xd7\xd6\x93\xae\x7d\xa3\xce\x12\x7e\xc0\x3a\x08\x1c\xc0\xb1\xeb\x6f\x78\x2c\x72\x0b\xca\xc5\xbb\x3a\x6e\x68\xc2\x90\x44\xdc\xd7\xc4\x1f\xa3\x66\xd4\xfa\x1d\x71\x0b\xc5\x4e\x86\x9f\x85\x7b\x31\x6a\x8f\xf0\xe6\xd5\x47\x57\xb5\xfe\x35\x9b\xfd\x4c\xa4\xe4\x7d\xcc\x80\x3b\x0a\xd2\x91\xa7\xbe\x65\xc0\x90\xb0\x2e\x83\xd6\xfc\x3b\x93\x1a\xfc\xa4\x7d\xc1\x66\x98\x88\x5b\x50\xf2\x0c\xb4\x54\x96\x95\x23\x95\x73\x54\xf2\xc2\x4b\x30\x72\x7e\x8e\x9e\x5b\x84\x4b\x24\xdf\x64\x73\xe0\xc1\xf8\x38\x04\xa5\x19\x8e\x06\xdf\xfd\x66\xb6\x27\x91\x93\x08\xc0\xbb\x5e\x3c\xcc\x49\xd2\xc2\x33\x20\x8d\x1b\x06\x3e\xcf\xf1\xd3\x15\x50\x1d\x10\xef\xda\x70\x32\x5f\xe8\x54\xdd\x6e\xc6\x01\xdb\xf4\xc5\xa2\x5b\xf0\x1b\x45\xa9\x1f\xb3\x2c\x95\xd3\x31\x38\xd1\x90\x0c\x53\xf3\x42\xa0\x49\xac\xc5\xc8\x29\x22\xe4\x0f\x4e\xf2\x8a\xf3\xb7\xe3\x90\xb6\x96\x3f\x09\x9f\x27\xb9\xb4\x12\x1e\x56\xfd\x7d\x38\xc7\x27\x72\x69\x04\x74\x42\x26\x62\xd1\x1b\xad\x13\x27\xb7\x72\x1e\x3b\x0c\xa1\xe3\xa1\x47\xec\x18\x4e\xf0\x2f\x69\xe2\x7b\x01\xcf\x62\xd7\xaa\xfe\x85\x6e\x0d\x12\xe7\xd8\x9d\x6b\x18\x0c\x38\xa8\x64\x0a\xa7\xb9\x3e\xf8\x88\x76\xbf\x1c\x1c\xd1\x96\xef\x27\x93\x6d\x5a\x8c\xe3\xc1\xab\xd0\xbf\x53\xe2\xcd\xa9\x07\xa7\xa3\x59\x38\x27\xcd\x68\x3f\xc3\xe0\xf8\x58\x8e\xc7\x54\x79\x1d\xad\x59\x49\x72\x8e\x25\x21\xeb\xe3\x1b\x7e\x44\x84\x47\xd0\x9f\xb5\x71\xcd\xc1\xa3\xa8\x9f\x99\x04\x4f\x2c\xc7\xa7\x1f\xbf\xd5\x7a\x96\xea\x4d\x18\xcf\x26\xd6\x0a\xc1\x2f\xe4\x68\xfa\x47\x7d\x77\x2b\x6b\x16\x51\xec\x19\xb7\x2e\x86\x83\x1a\xeb\x39\x06\x99\x09\x5f\x67\x76\x41\x9a\x92\x50\xaa\x44\x8e\x45\x29\x45\x16\x76\xf2\xb8\xf1\xc9\x80\xa8\x0d\x55\x20\xc3\x74\x17\x8a\xdb\x9f\xa8\x15\xb3\x60\xe4\x8b\x1e\xc4\x37\x48\x6f\x6e\x68\xdc\x81\x94\xa6\xbf\xfc\x37\x58\x99\x7c\x71\xcc\x3a\xe0\x13\xd9\x31\x86\xa3\x07\x31\x9b\x48\x91\xf1\xfa\xee\x39\x07\x12\x38\x9d\xd7\xf8\x93\x59\x33\x62\x6a\x90\x89\xac\x19\x53\xcf\xba\x41\x87\x52\x9a\x56\xab\x63\x36\x2a\xd8\x2a\xf3\xdb\x87\xe5\xdb\x49\x55\xb5\x92\x84\xc5\x88\x7b\x5c\x50\x79\xcf\x99\xdc\x62\xa4\x16\x92\x0b\x63\xae\xff\x5e\x95\xfb\x65\x92\x29\xe3\x65\xf8\x5a\x84\xa4\x19\xb7\xdf\x84\x4a\x92\x36\xd7\x58\xb1\x66\xf0\xdd\x68\x33\x3c\x71\x4a\xcb\x93\x11\x61\xf8\x37\x24\x97\xc9\xef\x83\xca\xc3\x1e\xe4\xdf\x65\xdb\xd0\x7e\xbe\x39\x34\x95\x06\xe3\xe7\x97\xf9\x38\xbe\x89\xe0\x18\x79\x03\x3c\xc1\x36\x7e\x95\xe7\xde\x45\xc8\xf0\x14\x0a\x88\x2d\x81\x6e\x75\xb5\x02\xbb\x56\xbb\xf0\x5d\xef\xe7\x7c\xeb\x02\xb7\x6f\x99\xd3\x49\x6e\xfa\x66\x58\xa5\x6e\x6e\xec\x3a\x27\x96\x61\x26\x57\xf9\x1c\x31\x38\x16\xcf\x3b\x66\xe7\xe9\xfa\x97\x8f\xc3\xce\xe5\x2b\xf8\x31\x8b\x82\x6b\x89\x9f\x68\xa9\x5e\x88\xca\x6c\x0c\x34\x08\x58\xcf\x97\xab\xbc\xc7\x65\x79\xd7\x63\x36\x22\xb8\xf5\x73\x0a\x0f\x7e\x42\xec\x80\xbd\xa9\x06\x52\x3a\xc8\x82\xf1\x26\xc3\x80\x44\x92\x0e\x24\x85\xfb\xbc\x91\x54\x1e\xd6\x0a\x13\x5d\x9f\x68\xee\x4c\x44\xc8\x81\x4e\x1c\xa9\xd0\x6d\x38\xec\xfb\x32\x1c\xce\x69\x66\x28\x3a\x01\xf9\x79\x03\x92\xbe\x3c\xc7\x1e\x90\x35\x11\x1b\x58\x1e\x9a\xb9\x31\xf2\xd0\x44\xd1\xb1\x95\x47\xb5\xbe\x1d\x59\xa0\xc9\x08\x2c\xbe\x7a\xda\x6b\xcd\x4a\xca\xa8\x9a\xcc\xb9\x29\x3c\x5c\x4d\x5d\xeb\x52\x26\x96\xa3\x23\x3e\xe7\x79\x6a\xdb\xa5\x4c\xeb\x20\xb9\xd6\x67\xd1\x11\xaf\x75\x0d\x36\x18\xe2\x12\xe7\xa4\x0b\xcc\xeb\x1b\x6b\xd4\xe3\x1b\xda\xe6\x6e\x7c\x2a\x9f\x3f\x31\xbb\x0c\x9c\xe4\xe7\x72\x0b\x02\x6b\x01\xa4\xc1\xc0\x0e\x6c\x2f\x93\x16\x39\x2a\x31\xb8\x40\x3d\xf7\xa7\x71\x87\xe8\xb4\xbe\xd4\x73\x9a\x0d\x22\x69\x78\xea\xe2\x38\x02\x69\xac\x65\x90\xea\x74\x63\xf5\x92\x0c\x37\xc4\x09\xad\xf2\x4e\x27\x5f\x0e\x98\x4b\xc9\xfd\x28\xaf\x81\xb4\x9b\x9c\x36\x84\x73\x4a\xc9\x6e\x6d\x04\x3d\xb2\xd3\x78\xd4\x76\x6b\x3c\xc2\x68\x89\x41\xc3\x9a\xb6\x2f\x99\xa7\xd4\x63\xcc\x37\x87\xc5\x45\x25\x44\xdf\x0a\x98\x94\xbc\x1e\x2a\x1d\x0a\xd8\xf0\x4d\x9c\xb0\xe5\x90\x3b\x4a\x6b\xb2\xb4\x47\xb2\x29\x39\xbd\xf9\x93\x63\x0a\x44\xe9\xae\x51\x19\xdd\x31\xe2\xf2\x89\x01\x09\x1d\xf9\x93\x03\xca\x29\xd3\xe7\x8c\xaa\x3c\x09\xc3\x72\x60\xad\x12\x52\x93\x11\x19\xbc\x9f\xdf\x31\xea\x4c\x24\x4c\xfc\x30\x40\xb9\x05\x09\x03\xc1\x61\x53\x3d\x96\x56\xc7\xa6\x7a\x09\x06\xce\xe7\xc3\xa3\x16\x0b\xd3\xe3\x76\x57\x67\x6a\x5f\xc8\xae\x29\x96\x03\x28\x36\x4a\xb4\x91\xb5\x0f\x78\x9a\x33\xef\x95\xd4\x3f\xe5\x8a\xf9\x31\x44\xbf\xab\x7b\x3e\x7f\x9b\x32\x5d\x9e\x98\x43\xe4\x84\x95\x72\xc8\xef\x0f\xdd\x18\x31\x41\x3f\xf3\x26\xbe\x9f\x6d\x5c\x77\xb5\x6a\x1c\x27\xf0\xc6\xab\x98\xc8\x85\x96\x0c\xb6\x99\xb1\x56\xd1\x44\xf3\xd4\x9c\x3f\x30\xf1\xaa\x1b\x98\x1d\x59\x5f\x64\x5e\xba\x92\x0c\x75\x2c\x29\x9d\x4a\x16\xec\xb5\xd6\x62\x06\x77\xcb\x0c\x6d\xb9\x3d\x98\x9b\xa7\xda\x27\x2f\x4e\xaf\xc1\x99\x71\x48\x00\xcc\x62\x47\x5c\x48\x83\xe8\x2a\xc4\xc5\xc8\xbf\x12\x2b\x37\xf1\x6c\xe6\x14\xd4\x92\xf3\x93\x7f\xb3\x7f\x2a\x2d\x76\xd3\xbb\x6a\xf1\x16\xff\xf7\xdf\x14\xf7\x37\xb3\x38\x71\x56\xf2\x23\xb6\xf5\x1a\x6a\x63\xf9\xeb\xca\x27\xe5\x21\x30\x06\x64\x47\x4b\x7a\x9d\xd6\x67\x5f\x40\x7e\xa7\x38\x74\xdc\x86\xb0\x66\x3a\x44\xde\x73\x1d\xfd\x44\xa7\xe2\xa6\x4c\xfb\x8a\x47\x12\x8e\x2c\x04\xd3\x26\x98\xd3\xd0\xa5\xf8\xed\x8a\xd5\xd2\xab\xef\x34\x77\xf8\x49\xf2\x25\x57\xcd\xa4\x25\xfa\x48\xa8\x1c\xe4\x95\x4f\xcb\x52\x9e\x62\xd8\xba\xe0\x93\xdf\x1e\xe8\xf4\xa5\xa5\xd7\x4d\xde\xf3\xb8\x47\x35\x3d\x4f\x3f\x99\x03\x5e\x36\x30\x35\x56\x1f\x54\x4d\xb3\x8e\x4e\x8c\x8a\x13\xbb\xe4\x95\xc4\xad\x28\x9b\x97\xe8\xe6\xd2\x4f\x97\x4d\xad\x77\xb5\x50\xa1\xb4\x4c\x05\x8d\xf4\x53\x6f\x39\x41\xd2\x8f\x21\xde\x5a\xfa\xb1\xac\x39\x19\xff\x95\x58\x96\x65\x6d\xd0\xc9\xcd\x26\xd7\x5b\x2e\xd9\x24\x35\xa3\xa6\xff\x4c\xa0\x2a\x22\x75\x6c\x5c\x30\x81\x74\x89\x66\x22\x60\xdf\x24\x76\x2e\xbb\x9b\x12\x49\x6f\x24\x4b\xff\x24\x44\x7b\xa8\x17\x4f\x78\x39\x93\x62\xd8\x6c\x20\x58\x0c\x67\x67\x6d\x38\x61\x14\x62\x78\x10\xf9\x78\x7d\x8a\xa3\x2b\xd9\xa5\x42\x32\xd8\x3b\x6b\xc6\x9b\x96\xb9\x2a\xbc\x0f\x4c\x36\x72\xd4\xb5\x24\x36\xae\xf7\x37\x01\xad\x7b\x11\x8f\x14\x53\xba\xc0\xf3\xf4\xa1\x13\x43\x22\x35\xbb\x2b\x3f\xab\x9d\x89\xc1\x0e\xdb\xf9\xfc\x71\xf2\x6d\x81\x7b\xa3\xbc\xf6\x93\x23\xe4\xa2\x61\x82\xc7\x4f\xb4\x33\x35\xc2\xd0\xce\x1f\xf5\xda\x19\x75\xc5\xb7\x77\xbd\x95\x4b\xcb\xec\x81\x5d\x55\xe5\x7e\x7a\xeb\xa6\xdd\x68\x7a\xb9\x0a\x26\xcf\x50\xc8\xf3\xcb\xdf\x27\x1a\x8c\x89\x7e\x3f\xbb\xc5\x24\x84\xfe\x54\xca\x91\x74\x0a\xdb\xb2\x5f\x6e\xd7\x3a\xf4\xa7\x9a\xe8\x90\xf3\xca\x6f\x58\x81\x48\x8b\xe5\xda\x15\x7c\xd4\xc1\x22\xf8\x35\x2b\x9a\xba\xc3\x91\xb5\x4f\x5b\x1b\xac\x79\xc6\x52\x88\x34\x70\xe9\xa0\x5d\xf8\x8c\xfe\x8e\xad\x7f\xeb\xd9\xf9\x1e\xa1\x82\xbb\xee\x8a\x2d\x35\xde\x94\x22\x00\x43\xef\x26\x11\x9d\xe7\x54\xf4\x95\x04\x8b\x87\x05\x15\x1b\x74\x3c\x28\x1e\x46\x27\xa7\x6f\x8a\x68\x0f\xc2\x87\x6b\x8f\xb0\x84\xbe\x66\x9a\xe9\xe4\x0a\x31\xeb\x25\xd8\x8a\xf8\x2f\xef\x1c\x42\x36\x6f\x9f\xb4\x1d\xae\x11\x28\x73\x99\x9b\x1c\x6a\x1a\x27\x9b\x4d\xec\x96\xc2\xf4\xc0\x93\xc4\x23\x21\x10\x4c\x43\x87\x79\x4f\x1f\x86\x6c\x80\x8d\xf9\xa4\x67\xe9\xda\x24\x56\x4e\x64\x18\x72\x3b\x5d\xa4\xbc\xf4\x75\x12\xea\xad\x39\x32\xf5\x74\x8c\x13\x67\xed\x8e\x01\xda\x52\x1c\x3f\x64\x70\xb0\x47\xc0\x93\xec\x90\xbd\xe1\x8f\x9c\x7d\xf2\x4f\x1e\xb5\xa9\x66\xff\xdb\x8e\x5a\x9b\x8c\x69\x78\xe0\x52\x86\x85\xd3\xe3\xd1\x92\x11\x3f\xe5\x49\x92\x42\xb8\xe5\xb2\x2e\x4e\xe3\x0d\x47\x14\xe9\x82\x81\xd2\x2b\xe2\xd0\xc2\x32\x64\xb9\x6d\xda\xe6\x40\x12\x9a\x5f\xfc\x68\x7f\x11\x93\xc9\x65\xe5\x04\x38\x3f\x2a\xdd\x2e\x0f\x1c\x2b\x46\xdd\xfb\x79\xdb\x5f\x72\xea\x5b\x67\x75\xd3\x8b\x90\x59\x3c\xab\x89\x67\x85\x35\xbf\x33\x59\x8d\x53\xf9\x82\xdc\xd8\x60\x02\x93\x8a\x5a\xa5\x59\xc1\x21\x33\xa9\xf1\xba\xe7\x87\xe7\xf4\x2a\xdd\x37\x1c\xcc\x60\x59\x11\x4a\x1c\xf6\x4b\x2c\x45\xa7\x19\x20\xc4\x0e\xbf\x38\x3f\xd4\xa2\x13\x18\x77\x60\x63\xd2\x6a\x32\x20\x51\xec\x6b\x97\xe3\x3a\x97\xad\x37\xf8\x0b\xd8\x82\x3b\x71\xf6\xdb\x4c\x55\xb1\xc5\xbb\xf2\x6e\x3f\x5c\xba\x67\xf4\x6d\x6a\xd1\x18\xf6\xd8\x02\x70\xa5\x89\x55\x48\x2b\x95\x1b\xa4\xe5\x4a\x2b\x3c\x97\xbb\xf3\x68\x05\x36\x12\x1b\x56\x29\xde\x75\xcd\x91\x0a\xfa\x40\x3a\x18\x96\x3e\x5e\xbb\xf1\xc0\x9a\xd5\xbf\x12\xfd\x25\x5e\x7d\x8b\xf0\x48\xfa\x68\x82\x3a\x09\xe0\xaa\x69\x7a\x88\xa0\x7b\x70\xed\x6c\xff\x9c\xad\xd6\x79\x59\x31\x4d\xff\xc1\xc0\x72\xc6\x9d\x2a\x1c\x5b\xb2\x0b\x94\x4e\xad\xd9\x0e\x99\x2f\x97\x78\xe2\x5a\x93\x34\x4e\x57\xfb\xa0\xcb\x0b\x7d\xfc\xf2\xc5\xcb\x0b\x82\xbc\xab\x66\xe8\x74\x50\xc7\xba\xcd\x50\x6f\xed\x08\x33\xef\xe8\x17\xc2\x49\x6c\xe6\xcc\xe5\xa2\xcf\xb8\xfa\x54\xe7\x5c\x6b\xaa\x77\xba\x20\x89\xda\x80\x4e\xad\x0e\xeb\x8f\x1e\xc9\xcc\xba\xab\x25\x9b\xe8\xc4\x86\xde\xc2\x72\x58\xd6\xfb\x19\x15\xf3\x29\xfa\x81\xc1\xa7\xd6\x91\xae\xe9\x9d\xef\x1d\x5b\x94\x25\xab\x2f\x5f\xd4\xad\xf9\xc7\x33\xb1\xf0\xcf\x6b\x36\x70\xca\x5e\xaa\xb0\xa6\x67\x11\x4c\x71\x68\xe5\xb4\xea\x69\x36\xe9\xb1\x8c\x92\xdb\xd4\xec\x10\x75\x5d\xd8\x86\xf5\xed\x1a\x1e\xea\x6d\x23\x39\x62\x89\x20\x94\xeb\x8a\xd9\x7d\x1a\x4b\x52\x83\xc5\x52\xaa\xc1\x24\xf4\x31\x7b\x41\x48\xf8\xa4\x0c\x4a\x08\x99\x81\x9d\x73\x1c\x4f\x21\x5a\x61\x7e\x53\xd0\x7b\x58\x67\x7d\x12\xdc\x86\x20\xd0\x22\x1d\x17\xfb\x10\x2b\x74\x00\xad\x83\x40\xf8\x28\xbf\x3e\xc8\xa2\x10\x80\x68\x05\xc4\x6f\x70\xe7\x6a\x84\x9b\x22\xfc\xf3\x55\xd4\x21\x20\x8a\x0a\x5f\xcc\xaa\x39\x90\x0a\x78\x76\x0f\x4f\x58\xf1\xe5\xdd\x52\xcf\x2b\x90\xc9\x3b\xfa\xdb\xf8\xf6\x8d\xd8\x79\x73\xda\x4f\x29\x90\xa0\x4f\xb9\xa6\x5b\x8a\xec\xb6\xdd\x1b\xac\x66\x4d\x90\x74\x09\xf6\x91\x7d\x02\x5a\xbf\xc5\x16\x4b\x8c\x83\xcb\x5b\x71\x09\x7b\xc3\x1f\x35\x1c\xe6\x2b\x75\xfb\xe3\x1f\x6f\x1b\x22\x55\x74\xc5\xc5\x09\x8d\xcc\xbf\x4d\x88\x48\x0d\x4f\x35\xef\x48\x23\x21\xea\xfa\xde\x82\x95\x4a\x33\x79\x48\x6e\x9d\x1d\x8b\x53\x62\x85\x79\x9a\xa9\x50\x8a\x0b\xfe\xaa\x70\x9c\x3a\x76\xf1\x82\x13\xc8\xa6\x55\x91\x93\x52\x85\xc7\x41\xf5\x17\x28\x41\x68\x1a\x83\xdf\x93\x5c\x76\x43\x9c\x42\x34\x00\x71\xec\x00\x28\x49\xce\x0a\x76\xa3\x85\x41\x75\x71\xa8\xd5\xda\xcf\x06\xae\x0c\x94\x9c\xf3\x18\x73\xf1\x9c\x7f\xab\xb5\x89\x2d\x47\x34\x50\x1f\xf0\x4c\x71\x0d\x02\x72\x04\x1b\xa5\x1c\x35\x76\xee\x57\x4d\x9d\x6a\xd9\x9b\x5f\xe4\xd9\x99\x2d\x0b\x3b\x15\x87\xc0\x82\x89\x2a\xea\x48\x2b\xa2\xbf\x7c\xf8\x9c\xc3\x4a\x10\x09\x78\xf4\x35\x37\x44\x67\x42\x82\xfc\x6a\x0a\xe8\x6d\xd5\xac\x9c\x64\x25\xd7\xa8\x76\x5f\x6a\x8b\x48\xa1\x16\xb0\x54\xf5\xa0\x36\x6d\x84\xc9\xcd\xf1\x96\x56\xeb\xaa\x5c\xd1\x6c\x79\x8b\x16\x6f\x61\x35\x19\x04\xcf\xae\xb0\x62\x4b\xf9\x42\x30\x49\x37\x8c\xf3\x83\x2e\xae\xf8\x45\x76\x27\xce\xff\xf1\x69\x22\x3b\x11\x6c\x67\x01\xb7\x2e\xe6\x76\x27\x5a\x10\xfe\x7a\x67\xea\x5a\xac\x4d\xeb\xd5\x75\x4e\x9c\xed\xb2\x96\x24\xe5\xb1\x24\x33\x1e\xb6\x26\xd6\xbc\x16\x6a\x38\xb3\x31\x91\x37\xdc\x3b\xf2\x25\x4f\x22\x56\x78\x0d\x91\xb8\x4c\x8c\x5b\x39\x66\x1c\x79\xe5\xd7\x81\xe5\xb0\x44\x99\x88\xf7\x6f\x6e\x6a\x51\xa9\x0e\x06\xcf\x19\x4a\x59\x77\x2d\xc1\x8d\x39\x40\x6f\x93\x7b\xa0\x70\x24\xd2\x52\xa3\x27\x06\xcb\x35\x92\x18\x9a\xe0\xf0\xcf\x0f\x74\x69\x7f\x88\x42\x04\xc3\xa8\x41\x77\x22\xb5\xb1\xb8\x62\x1d\x6e\x62\x9f\x83\xa7\xa4\x13\x60\x53\x22\x1a\xc9\x00\x9c\xbd\x92\xb6\x15\xac\x2f\x55\xfe\xaf\x02\x75\x19\x59\xc5\xe9\x72\x64\x2f\x21\x09\x55\xfa\x62\x06\x45\xaf\x78\xa0\x7f\x82\xba\x0f\x54\xc0\x5c\x2d\xd2\x6f\xfe\x99\xd8\x6b\xf1\xef\xfc\x19\x6c\x26\x6a\x63\x26\xd8\x47\x3a\xcb\xcd\x15\xd2\xe3\x2c\x55\x27\x5e\xbc\xa5\x20\x0e\x44\x7e\xe7\xcf\xef\xaa\xb0\x9e\x4b\x32\xf9\x8e\x73\x45\x1b\x24\x72\x02\x76\xc8\x0e\x6d\x40\xc3\x7c\xc3\xac\xd4\x56\x42\x9b\x8d\x7a\x40\x6a\x5f\x72\x59\x71\x8e\x32\xad\x83\x70\xc6\xe1\xd9\x5c\xe2\x48\x4a\x6a\x61\x6f\x00\x61\xd8\xf2\x3b\xa6\x1b\x92\xdf\x9e\x03\xae\x6d\xcc\xeb\x49\x3e\x4e\x58\xd5\x25\x43\xcc\x3c\x75\x5c\xaa\x80\xf7\x29\x58\xd4\x34\x1e\x03\x03\x17\x40\x62\xef\x2d\x0e\x66\xdf\xac\x9b\x0a\xfe\x84\xfc\x05\xe7\x92\xbf\x28\xe4\xc0\x05\x47\x3e\xc2\x67\x7e\xf1\x8c\xfe\xa7\xbf\x41\x05\x16\xe7\x20\x05\xfa\x81\x35\x89\x9b\x7a\xf1\x03\xfd\xeb\x8a\xc7\xaf\xd2\xcf\x76\x4b\x69\xe1\xb9\xfe\x9c\x02\x09\xae\x5f\x89\xb2\xc4\x22\x7f\x2b\x08\x5f\xcc\x1c\xdf\x56\xe2\x97\x5f\x95\x0e\x41\x65\xe0\x31\x23\x74\xbf\x3b\x70\xb4\x26\x39\x29\xb8\xb0\x5c\xd5\x8b\x49\x07\x11\xa4\x2d\x1d\x6e\x5d\x78\xf0\x40\x9c\xd0\x00\x6c\x01\x09\xc0\x50\xd0\x49\xe0\xc6\x04\x80\xa6\xf4\xf8\x95\x5c\x87\xea\x5c\xa9\xcb\xde\x4b\x94\x33\x1f\x3d\x30\x4f\x7b\x0b\x0f\x6f\x9f\x8e\xc2\x66\xaf\x53\x72\x69\x87\x1b\x1b\x96\xfa\x70\xd5\x7b\x44\x93\xe3\x28\xdf\x92\x13\xf7\xda\x55\x48\xda\x92\x06\x72\x9b\x8f\xda\x1f\x8c\x23\xc1\xc5\x08\xd3\x1d\x86\xc3\x3d\x83\xc7\xe3\x04\x24\xe1\x41\x95\x80\x3d\xc1\xef\x21\x50\x07\xb1\x10\x5b\xb8\x78\xea\xe9\x38\x16\xb1\x00\x9b\x83\x0d\x27\x64\x10\xb7\xe8\x5f\x0d\x79\x24\x30\xed\xe2\x69\x19\xe3\x69\x59\xb3\xfc\x3e\x19\xca\x39\xe0\xd6\x80\x4d\x14\xc0\x1d\x2e\xd4\x65\xe7\x16\x2f\xbb\xe2\x74\x53\x5c\x9c\x1a\x9a\xef\xfa\xfd\x92\x35\xe1\xd3\x87\xa6\xb8\x78\xf9\xf6\x3c\x81\x0d\x78\x3d\x2c\x88\x08\x9e\x96\x58\x48\x0f\x39\x23\x9d\x1e\x92\x68\xcc\x58\x4e\xc3\x1d\x67\xcf\x60\x4e\x0c\xcf\xe6\xb6\x5c\x4b\x86\x3c\xad\x31\x2f\x5e\x12\x97\x52\xee\xc1\xb4\xc8\x17\xf8\x72\x1c\x2a\xb8\x84\x98\x6b\x0c\xfc\x43\x6e\xf9\x65\xc6\x15\x0f\x4e\x1e\xcc\x33\x2a\xb3\xec\xab\xce\x42\xf6\xd1\x99\x38\x83\xca\xab\xd9\xb6\xee\x92\x44\xdd\xb7\x2f\x2e\x6c\xa6\x1f\xcb\x3d\x20\x97\x1c\x40\xe3\x16\x26\xe8\xbd\x8b\xd1\x34\x22\xe0\x1e\x6f\xf1\xbe\xbd\x46\xd4\xdb\x84\xd8\xa8\xe2\x08\x56\x1f\xc5\xf9\xe9\xcb\x7c\x04\x1c\x48\xdf\x98\xf4\x64\x2c\xc6\xa2\xcb\x86\x9c\x86\x50\xfd\x46\x35\xcb\x3d\xa7\x39\xe9\x60\xc9\x6c\x2d\x66\xf1\xbc\xcb\x41\xb0\xd5\x69\xba\x98\xb3\x75\xae\x38\xcd\x11\x21\xfa\x95\x09\x8f\xe7\x22\x95\x0f\xd7\x2d\x92\x11\xe6\x8f\xa0\x83\xfc\xda\x12\x0a\x22\xd7\xbc\xa5\x64\x3d\x5e\xdc\x79\x2b\x9f\x69\x31\x99\x36\x95\x72\x52\x70\xb3\xff\x9c\x35\x98\x8a\xf2\xe5\xee\x02\x5d\xca\xa5\x23\x19\xc7\xf2\x21\x3f\x56\x5e\x64\x02\x5e\x02\xe8\x31\x33\x9c\xd7\xa1\x2f\x12\x43\x8d\x30\x7d\xe5\xed\x69\x80\x78\xb0\x63\x71\x47\x14\x2b\x99\xed\x2a\xd5\x27\xf1\x48\xc3\x0c\x04\x5a\xc8\xa7\xa0\x63\xef\x77\x30\x4d\x21\xde\xad\xe6\x20\x6b\x5a\x8b\x23\x88\x88\x1b\x9d\x42\xa1\x5b\x57\xb3\x62\x41\x18\x75\x49\x60\xce\xcf\xd1\xf3\x74\x8a\x19\xf7\x95\x0f\xe2\x13\x59\xd6\xf5\x81\xdc\xd4\xaf\x93\xcf\xe5\xa6\x76\x55\x50\x62\x29\x93\xd3\x75\xba\xdf\x57\x61\x97\x12\x88\x6b\xb1\x4e\xef\xe4\xf8\x1c\x01\x32\x77\xff\xa9\xf2\xc1\x0d\xaf\x5f\x9b\xcb\xcb\x8a\x78\x19\xa4\x8b\x62\x57\x13\x0d\xd7\xf1\x5a\x3e\x87\xba\x88\x60\x47\x87\x1b\xaa\x60\x56\xa7\x6e\xe1\x71\x2b\x67\x88\x30\x93\x24\x54\xa6\x0a\x6f\xb8\xd8\x2a\xb5\x07\xde\xcb\x56\xac\x11\x7c\xc1\x3a\x09\xcd\xa2\x1b\x00\x06\xfd\x06\xbd\x45\x04\x02\xa7\xd9\x36\x0d\xec\x03\xf0\xd4\x69\x6f\x0a\x6f\xe8\x93\x74\x9a\x78\x0b\xe8\xda\xe3\x5d\x6d\xcd\x0e\x72\x77\xd6\x64\xe7\x3b\xb6\x21\x58\x87\xf5\xa0\xa9\x7d\x66\x45\x18\x32\x36\xdb\xd0\x27\x27\x6e\xcf\x39\xb7\x0b\xfe\x16\x27\x02\xf7\x00\x3d\x3c\xbc\x2e\x03\xda\xa4\xcb\xf4\x5c\xdc\x08\x22\x26\x75\x57\xc7\xd0\xe8\xe2\x59\x0a\x34\x60\x34\x93\x12\xce\x99\xbd\xd4\xe0\xbd\x4b\x41\x4d\xb6\xd5\x40\xf6\x4f\xfc\xb0\xc0\xbe\x69\xa5\x69\x7c\x41\x49\xc2\x06\x26\x5f\x2b\xb6\x7b\x49\x0a\x39\xdc\x74\xb7\x46\xd0\xa7\x14\xee\xc8\xc2\xa6\x20\xf0\x88\xe5\xd8\x3c\x39\x18\x3f\x70\xf1\xc2\xa3\x70\x50\x61\x8b\xbe\x33\xf0\x7f\xe6\x8f\xc5\xc3\x07\x04\xf1\x48\x20\x1e\x7c\x99\xd6\xc2\xc4\x76\x87\x9d\x78\x24\x97\xbf\x79\x49\xa3\x83\x53\x26\x37\x8e\xc8\xc3\x9b\x92\xa4\xac\x8e\x29\x2e\x57\x30\x35\x9d\x8c\xe6\xae\xf6\xe0\x96\x7e\x67\xdd\x70\xbc\x56\x47\x76\xf8\xb1\xda\x98\x24\x80\x51\xbc\x88\xdf\x22\x9f\x1e\xbf\x45\xb1\x24\x7e\x4b\x4e\x63\xf2\xb5\xeb\xaa\xe1\x31\xbc\xb8\x78\x31\x01\x60\x0c\xcd\xc3\x0e\xd6\xcc\x50\x0c\xdc\xc3\x75\x84\x80\xe3\xf7\xbe\x4c\xe0\xb3\x6d\x18\x7c\x0f\x6d\x70\xf5\xee\x17\x44\xc5\xfc\xeb\xbd\xc2\x17\xf7\xfa\x72\xb3\xa2\x66\x52\x02\x5a\xb2\xab\xe6\x31\x0a\x0a\xfe\x23\x1e\x2e\xd5\x0a\x42\xf1\x55\x85\x98\xb4\x12\x3e\x69\x83\xc7\xf6\x60\x82\xcf\x5c\xbd\x70\xb5\x43\xea\x66\x5c\xcb\x63\x0b\xd8\xe9\x72\xb6\x25\x8c\x0d\x7e\xc9\x6d\xa2\x73\x8c\x59\x08\xd8\xeb\xf9\xfc\x50\x75\xae\xf6\xd3\x95\x2d\xd9\xa1\x25\x3f\x64\x37\x48\x8b\xf3\xc4\xba\x0f\xd6\xe9\x60\x7d\x7e\xf2\x30\xac\xb4\x8a\x3c\x33\xd5\x7a\xf2\xf8\x71\x12\x4c\xd9\x39\x9c\xcb\x00\xa7\x93\x19\xad\x43\x7e\x28\xc4\xe9\xf9\x5c\xfc\x56\xee\x6e\xed\xf6\xc4\xef\xbb\x10\x16\xfa\x4c\x7e\x87\x3b\x48\x22\x79\xc0\xbd\x76\x59\xb1\x65\x85\xe8\x80\x8b\x9f\x4a\xd1\xf6\x17\xe2\x74\x1b\xd7\x82\x78\xa2\x28\x06\x26\xf5\xde\x78\xe5\x75\xa0\x42\x32\x19\x50\x06\x36\x6c\xcb\x1a\xb3\x00\x47\xd3\x18\x63\x11\x34\x14\x98\x83\x77\x2d\x2b\x5f\x6f\x09\x57\x5f\x90\x70\x7f\xe5\x11\x91\x5c\xa7\x4e\x07\x21\x2c\xa8\x84\xd3\x60\xbd\x3a\x5d\x6f\xfa\x92\xaa\x7a\x4c\x31\xbd\x93\xf8\x65\x86\x1b\x77\x31\xd7\x57\x9e\xb9\xeb\x74\x47\x8f\x32\x09\x2f\xb9\x70\x00\x3a\x4d\xe3\xb5\xd0\xf6\x9e\x8e\x58\x13\xef\xe7\xe2\xd9\x93\x17\xaf\x07\x90\x23\xe2\xa0\xdf\x47\x84\x44\xbf\x4f\x10\x0e\x56\xc6\x33\x91\x66\x81\x11\x7e\x02\xae\xf0\x86\x96\x29\x81\x0e\x40\xcb\x4b\xf6\x86\x16\xc3\x70\x76\xd5\xf0\x12\xa7\x05\x49\xbc\x50\xd1\xc5\xc4\xd8\xa3\xba\x10\xb5\x38\x14\xad\x75\x01\xf7\x68\x17\x19\x7a\x09\xf8\xe2\xb4\x8d\x79\x58\x63\xb1\x73\x9a\x5e\x62\xb6\x75\xca\x01\x07\x0b\x6c\x85\xf2\xae\x36\xdd\x8a\x3c\xc2\x65\x80\x6e\x43\xe7\x02\x77\xec\x06\xa9\x21\x39\xd6\xe4\x04\x14\xbf\x4d\x93\x84\x4f\x8b\x27\x7f\xd0\x99\x9c\x00\xa3\x1f\x9c\x42\xaf\xf6\x5d\x97\x74\x18\x37\x42\x8c\x7a\x8f\x11\x4a\xa9\x34\x84\xc6\xea\xc1\x14\x1b\xb1\xf4\xd9\xec\x71\x0c\x6a\x20\xd6\x72\xe6\xda\x76\xae\x85\x61\xa8\x74\xb6\xca\xa1\x94\x78\xc6\x1f\x07\x24\x04\x27\x5e\xa0\x03\x15\x79\xd7\x49\x72\xb6\x1c\x7e\xbb\x0e\x2b\x24\x4f\x6b\xc9\x32\x6d\x2c\x83\x74\x78\x04\x1b\xcc\xaf\x2a\x2f\xbd\xbe\xdb\x1d\x10\x50\x62\x34\xbb\xab\xbe\xdf\x77\x49\x6c\x2a\x84\x9c\xbc\x18\xcc\x66\xd4\x88\x0e\x30\xac\x50\xc9\xaf\xac\x47\x96\xfe\x69\x13\x19\x1f\x83\xd4\x5b\x6d\x11\xe4\xe7\xcb\x04\xc8\xce\x2f\x09\xec\xec\x62\x97\x52\xed\x1f\xf5\xdb\x60\x31\x2f\x71\x43\x70\x7e\x71\xad\xa2\xe9\x1d\x9e\xda\xf7\xe2\x94\xbf\x77\x61\xcc\x78\x52\xd0\xf1\xc2\xba\x24\x8c\x99\xa5\xbc\x04\xc6\x06\xc3\x31\x3d\xae\xca\xed\x15\xe7\x7c\x90\x21\x51\x07\x12\xd8\xe3\xb6\xee\xdd\xaf\xc5\x33\x2b\x4d\xeb\xe3\xd5\x86\xeb\x42\x8e\xe8\x16\x2f\x09\x8e\xeb\xbc\xc0\xcf\xe2\x21\x54\x5a\x08\xe2\x59\x6f\x2b\x89\x5f\xf1\xe5\xd1\xca\x08\x00\xd4\xd2\xcd\xc2\x5a\x68\x6b\xe6\x2c\x7c\x1b\xb4\x85\x1a\xd3\x6d\x49\xc0\x8c\xd0\xc2\x53\xb6\xab\x79\x28\x42\x2a\x87\xcc\xc8\xaa\x11\xf6\xb9\x76\xdb\x2d\x7e\x3c\x2b\x4e\xdb\x2d\xe7\x77\xea\xb2\x66\xcb\x6d\x6b\xc6\x21\xb8\x17\x5e\xf2\x6f\x7e\x72\x94\x2f\x39\x30\xe7\x70\x89\xb0\x1c\x65\xff\x9d\xd8\x2b\x4d\xc0\xc3\xcf\x20\x36\x7d\x56\x31\xb1\x0a\xf9\xfe\x26\x2a\x70\xd0\x30\x83\xe7\x78\x61\x77\x82\xeb\x3b\x31\x80\x69\x7e\x63\xd0\x54\x1a\x9a\x46\xee\x44\xf4\x01\xd0\x80\x7f\x44\xa9\x99\x7e\xcf\xd7\x2d\x71\x46\xcf\xc5\x06\xb7\x94\xb7\x2a\x42\x35\x2b\x8d\x57\x91\x7d\xe1\xf4\x25\x07\x7e\x45\xa2\x3b\xc6\x45\x48\x64\x4d\x7f\xe1\x0a\x7d\xb7\x27\x46\x00\x11\x2a\x42\x71\x48\xbb\x4e\x20\x17\x60\x3d\x87\x00\xfe\x57\xc8\x9f\x66\x9e\xc3\x79\x3b\x98\x90\xc4\xb7\xf2\xa4\xad\xc6\x1e\x46\x25\x46\x37\x89\x32\x89\x68\x6a\x60\xe3\x74\x7c\x36\x05\x08\x5c\x8b\xd7\x2d\xbf\xfa\x40\xd0\x6a\x26\x47\xa1\xcc\x44\x3a\x06\x22\x2e\x6a\x4c\x6f\x76\xea\x9a\x75\x0a\xe2\x55\x62\x5f\x6f\x16\xea\x06\xcc\x11\x67\x36\x1c\x6f\x64\xa9\xd1\x47\x62\xac\x9c\x18\x4b\x4d\x5e\x78\xd1\x4a\x13\xaa\xba\xb5\x18\xcb\x9f\xca\x1a\x84\xee\x3d\xec\x22\x61\x79\x41\xd4\xaa\xf2\x1c\xcb\x53\x62\xa0\x07\x10\x9a\x7f\x04\x7a\xcc\x3f\xa6\xc0\xca\x5a\x24\x5f\x01\x2e\x19\x1b\x24\xc3\x86\xd5\xf0\x49\x93\xac\x61\x12\x50\x84\x99\x52\x2d\x56\x68\xbb\x2f\x87\xb0\xe8\x7c\xc2\x80\x97\x97\x2a\xc0\x46\xb1\x29\xfd\xb2\xfc\x3a\xf5\x7c\x48\xa6\x95\x6f\xab\x15\x34\xfb\xc5\xeb\xfd\x7c\x34\x56\x55\x14\xfd\x18\x7a\x4d\x1c\x20\x52\x4b\xdf\x98\xea\x5f\x62\xca\x07\xcb\x5f\xf6\xef\xe0\x95\x79\x6f\x11\x0f\xf8\xa9\xf3\xca\x99\x19\x42\x16\x66\x3f\x8f\xc8\x26\x49\xfb\x67\xad\xaf\x43\xce\x94\xcc\xf0\x11\xd1\x1f\x6a\x89\xa9\x19\x12\xf7\x7e\x9d\x65\xf3\x8d\x79\x8b\xff\x82\xc4\xef\x92\xd6\x97\x9a\x0c\x09\xe5\x65\x28\xec\xd4\xa3\x59\xf2\x06\xb9\x8e\xbb\x76\xfd\x95\xd6\xbe\x6f\xd5\x71\x66\x72\x30\x14\xfe\x07\x6b\x5b\xa6\x29\x59\xf7\x3f\xc0\x9f\x50\x52\xde\xe3\x59\x5b\x5e\xed\xd2\x81\x75\x5f\xc9\x8b\xde\x57\x32\xe1\x7f\x4a\x72\xd3\x4b\xc6\x50\x6d\x47\x82\x22\x6a\x56\x9b\xcf\xaa\xae\xd9\x84\xb5\xbe\x05\x53\xfc\x23\x2d\xe8\x4c\xf2\x34\xd2\x9a\xaa\x32\x4b\xbc\x9a\xb6\xa6\xc9\xa1\x8f\xcc\x66\xd0\x96\x4c\xea\x0f\xb7\xa5\x53\xcb\x1b\x0b\x33\xfc\xe3\x43\x13\x67\x90\x64\xcb\xf4\x8b\xfb\x33\xdb\x36\x91\x1e\xf7\x83\xa4\xbf\xfd\xe3\x23\x0b\xf1\xfd\x0d\x53\x43\x14\xff\xd1\xc1\x11\xfc\x9f\x44\xfe\x78\x94\x38\xa6\x25\xd1\xcb\x14\xe9\x91\xff\xc1\x6d\xb3\xe1\x30\xd2\x77\xf7\xbe\x0b\x23\xc9\xcf\xd2\xd7\xd9\x69\x98\x25\x49\xd3\x39\xe7\x75\x42\x9d\xa5\x48\x2f\xd6\x24\xbd\xf8\x7d\x4b\xc4\x4d\xe4\xa1\x6f\x9a\xea\xfd\xcc\x6d\x9b\xc5\xa5\x9b\x21\x79\x2f\x7b\x67\x23\x08\xed\x06\xea\x82\x19\x7e\xc1\x49\xfb\xeb\x6e\xf1\xb5\x86\xa0\xe6\x04\xb9\x5f\xef\xe8\x37\x27\x7b\x93\x9f\x57\xf4\x13\x56\x0b\xf8\x7b\x43\x7f\xf3\xeb\x82\x14\xdd\x70\xcd\x1e\x16\x66\x92\x69\xf1\x6b\xba\xb3\x50\x1b\xfa\x73\xfc\xbc\xa5\x1f\x6c\x9e\xce\x69\x4b\xd0\x05\x67\xd3\x97\x3f\x4b\x49\xc7\x0b\x9b\x3b\xfe\xca\x7f\xf2\xc7\xab\xe6\xd0\xf2\x27\x08\x19\xf7\x61\x1c\x7d\xcb\x3f\xb9\x6b\x86\xb8\xf1\xfe\xa3\x36\x25\xdd\x33\x1c\xf5\xde\x5f\x49\x5b\xbe\x63\xb8\x5b\xef\xa4\x25\x1a\x05\x7f\x68\xdd\xcd\xd2\x46\xa2\xc3\xe0\x6f\x36\x0e\x19\x04\x2d\xdf\xa6\x6d\xf6\xc8\x3f\xf5\x7e\x66\x09\x2e\x2d\xb3\x25\x32\x46\xac\x25\x91\x0c\x1b\xf2\x23\xbe\xb4\x65\x54\x93\x10\xd3\x1c\x87\x0a\x91\xf0\x2d\x2f\x6e\x59\xef\x0f\xaa\xea\x7d\xa5\xa1\xa2\x82\x3c\x6b\xd0\x1a\xcf\x3a\x84\x7f\x46\x80\xe3\xf9\x8c\x35\xcb\x88\xe0\xb6\x22\x8e\x0a\x61\x17\x4d\xf7\x22\xf2\x12\xd7\x79\xf8\x6f\xff\xc6\x9c\x6a\xf9\x9b\xff\xfb\xdf\x8b\x97\x3f\x7c\x89\xd0\x70\xf0\x99\xad\x32\x78\x31\xa1\x72\x00\x27\x0e\xf7\x69\x56\x03\x51\x8a\xd8\x4d\x91\x8d\x71\xd4\x4d\x91\x5b\x9f\xcd\xfe\x6b\x00\x00\x00\xff\xff\xfc\x4e\xea\xe1\xe8\xe2\x00\x00") - -func confLocaleLocale_itItIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_itItIni, - "conf/locale/locale_it-IT.ini", - ) -} - -func confLocaleLocale_itItIni() (*asset, error) { - bytes, err := confLocaleLocale_itItIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_it-IT.ini", size: 58088, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_jaJpIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\xbd\x7b\x6f\x54\x57\xb6\x38\xf8\x7f\x7d\x8a\x73\xb9\x42\x24\x52\x30\x4a\xf7\x6f\xa4\x51\x94\xca\x1d\x9a\xbc\x7a\x26\x49\x33\x31\xb9\xad\x51\x84\x2a\xc7\x55\xc7\x76\x5d\xca\x75\xea\xd6\x39\x85\xe3\xbe\xba\x92\xcb\xe6\x65\x6c\xda\x74\x08\x26\x3c\x12\x02\x01\x0c\x36\xd8\x10\xf2\xe0\xe1\x80\x34\x1f\xa5\xed\x2a\xdb\x7f\xe5\x2b\xcc\x7a\xed\xe7\x39\x55\x76\x6e\xb7\xa6\xd5\x0a\xae\xb3\xd7\x7e\xaf\xbd\xf6\x7a\xef\xb0\xd1\x28\x55\xa2\xa4\x5c\x7c\x2f\xde\xba\x3b\xb9\xb5\xf4\xcd\x7a\x7b\xb1\xb3\x72\x7d\xeb\xbb\x93\xeb\xed\x4b\xeb\xed\xeb\xeb\x53\xcf\xd7\xa7\x97\xd7\xa7\x2f\xae\x4f\x5f\x5d\x9f\x7a\xba\x3e\x7d\xe6\xbd\x6a\xba\x3e\xf5\xe3\xfa\xf4\xda\xfa\xf4\x05\xf8\x52\x28\x8c\xc6\x63\x51\x11\x8b\xf1\xd3\xb7\x85\x4a\x98\x8c\x0e\xc5\x61\xb3\x02\xdf\x26\xd7\xa7\xa7\xd7\xa7\x7e\x5e\x9f\xbe\xbd\x3e\x7d\x8d\xca\x67\x0a\xd1\xe7\x8d\x5a\xdc\x84\x1a\x53\x77\xd7\xa7\x56\xa9\xcd\x4b\xeb\xd3\x0f\xa8\xf4\x5e\x61\x34\xaa\x35\xa0\xe2\x57\xd4\xe9\xa5\x42\x52\x1d\xa9\x97\xaa\xf5\x22\xf6\x38\x75\x6b\x7d\xfa\x31\xff\x97\xbf\xc7\xad\xd4\x2e\xb8\xb9\x3e\x75\x07\xc6\xc7\x65\xad\x86\x5b\x04\xe3\x80\xe6\x9a\xd1\x48\x35\x49\xa3\x66\x71\xf3\xf2\xf3\xed\xb9\xef\x0b\xe3\xd1\x50\x52\x4d\xa3\xe2\x9f\xdf\xf9\x83\x82\x3e\x53\x38\x1e\x35\x93\x6a\x0c\x7d\x4e\x9f\xc7\x41\x4d\x3d\x59\x9f\x5e\xc4\x3e\x1b\xe1\x08\xce\xf3\x0a\x7f\x2c\xa4\xd1\x58\xa3\x16\xa6\xf8\xe9\x14\x76\x82\xb3\xb8\x4f\xb3\x38\x53\xa8\x85\xf5\x91\x16\x82\xf3\x9a\x16\xca\xcd\x08\x20\x4b\xf5\x68\xbc\xb8\xf1\xcb\xb5\xee\x99\xf3\x03\x03\x03\x85\x56\x12\x35\x4b\x8d\x66\x3c\x5c\xad\x45\xa5\xb0\x5e\x29\x8d\xd1\xb2\x4c\xdf\xa1\x0e\x7e\xa2\xa6\x78\x65\x2e\xae\x4f\xdd\xa0\xc1\x2d\xaf\xb7\x97\xd6\xdb\xf7\x68\x8a\x51\x05\x16\xa6\x14\x26\xfe\xda\x74\x9f\x9c\x59\x6f\xbf\x2c\x50\xf3\xf5\x70\xcc\x6a\xb1\x73\xfe\x5c\x21\x1a\x0b\xab\xb5\xe2\x3b\xfb\xf1\x1f\x98\x51\x92\x8c\xc7\xb4\x53\x7f\xa3\x8d\x58\x95\x3d\x6a\x46\xa5\x74\xa2\x11\x15\x3b\xa7\xce\x75\x4e\xde\xee\x9c\xbd\x5a\x28\x87\x8d\xb4\x3c\x1a\x16\x0f\x1d\x3c\x7c\xe4\xd0\xfb\x07\x0b\x00\xd2\x88\x61\xed\xe2\xe6\x04\xd4\x5e\x5a\x9f\xfe\x9a\x16\xea\x0c\xfc\x5d\x88\x9b\x23\x61\xbd\xfa\x97\x30\xc5\x55\xdc\xfc\xf1\xc4\xe6\xd3\x2f\x0b\x63\xd5\x66\x33\x6e\x02\xe8\x75\xd8\x65\xe8\xa5\x00\x6b\x51\xc2\x36\x8a\xdd\x85\x87\x84\x6a\x27\xfc\x66\x10\x62\xac\x3a\xd2\xc4\x35\xd6\x40\x9b\x8b\xcf\xb7\x6e\xcc\x49\x19\x35\x69\xd5\xb7\xdb\x1e\x8e\x9b\xc7\xec\x32\x58\xc3\x7b\xb4\x0c\xab\xeb\xed\x95\xbc\xae\x60\xd4\x56\x37\x32\xea\xb0\x0e\xbb\x48\x45\xfc\x65\x7d\xea\x8b\xcd\x95\x1b\x9b\xe7\x4f\x15\xc2\xca\x18\x2c\x7f\x23\xac\x47\xb5\x22\x7f\xda\x9a\x3c\x89\xeb\x38\x7d\x0e\xf6\xa9\x10\x96\xcb\x71\xab\x9e\x96\x92\x28\x4d\xab\xf5\x11\xdc\x25\xc0\xcf\x65\x42\x51\xc0\x95\x33\x5b\x77\x1f\x74\x56\xae\x14\x74\xb1\xfc\x9e\x88\x5b\x1a\x27\x8a\xd6\xf6\x7f\x47\x1b\xb3\xcc\xe5\x7e\x25\xe8\x2c\xad\x1e\xaf\xa6\xd5\x48\xba\x59\x45\x94\xc4\x3a\x17\xf8\x8f\x42\xa3\x55\xab\xc1\x6a\xff\x67\x2b\x4a\xd2\x84\xdb\x5d\xc6\x35\xc0\xf3\x77\x97\x8f\x75\xa1\x9a\x24\x50\x5c\xdc\x5a\xfa\x7e\x1b\x16\x18\x36\xbc\x5e\x86\xa9\xad\x4f\xc1\x00\xbe\x23\xe4\x42\x42\x50\x28\x7c\x5a\xad\x27\x69\x58\xab\x1d\x2d\xc8\x1f\x45\x85\x7c\x4f\x69\x31\x69\x98\x69\x35\xc5\xf1\x67\x0a\x60\xf9\xd6\xdb\x97\xd7\xa7\x66\x3b\x33\xe7\xd6\xdb\xcb\x9d\x97\x27\xb7\xee\xb4\x01\xa7\xbb\xcf\x16\x3a\x53\x97\xa9\x14\x56\xff\x05\xfe\x77\xea\xf4\x7a\xfb\x54\xa1\x12\x97\x8f\xc1\x29\x41\xaa\x00\xa7\xf6\x6d\xfa\x05\x14\xea\xbd\x78\x24\xc1\xad\xb8\xbb\xd6\x99\xbd\x28\x2d\x7e\xfb\x43\xe7\x3c\x60\xfe\xea\xfa\x24\xb4\x78\x81\x36\x59\x8e\x2a\xf6\x74\x6b\xa6\x7b\xf5\x07\xa8\xd2\x39\xfb\xed\x7a\xfb\x8c\x1e\x01\x00\x07\x6f\x86\x41\x1a\x36\x47\xa2\xb4\xb8\xa7\x34\x04\x27\xf7\xd8\x9e\x60\xb4\x19\x0d\x17\xf7\xec\x4d\xf6\xbc\xb5\x3e\x75\x9f\xa6\x31\x83\xa8\x45\xf3\x79\xf3\x40\xf8\x16\x8e\x74\x0a\x3a\x9b\xdf\x5a\x7a\xb0\x3e\x05\x9d\x2d\xc2\xdf\xeb\x6d\x68\x1a\x46\x73\xe2\xd7\xb5\x76\x01\x17\x1b\x28\x4b\xa9\x32\xa4\xc8\xeb\x48\x12\xf0\xe8\x3e\x9c\x18\xfc\xbf\x3f\x80\x7f\x0f\xc7\x49\x3a\xd2\x8c\xf8\x07\xfc\x17\xc0\x7f\x1f\xd0\xec\xaf\x03\x60\x70\xa4\xfa\xf6\x1f\xe0\xe7\x9c\x5a\xa4\x45\x9c\xe7\xe4\x54\x01\x5a\x94\xe5\x9d\x3e\x4d\xf3\x7b\xb9\x3e\x7d\x99\xfe\x78\x2a\xf8\x80\x10\x78\x7a\xb3\x00\xb0\x2a\x9b\x77\x57\xb6\x6f\x7c\x03\x44\x3b\x49\x8b\x9a\xa6\x13\xb1\x30\x84\xa2\x37\x61\x80\xa6\x85\xa6\xf8\x4d\x23\x71\x81\x52\xd9\x29\x9e\x23\x8e\x99\x30\x0c\xb1\xe0\x09\xfe\xb7\x3d\xf7\xc7\x8f\x3e\xfa\xd3\xdb\x7f\x80\x19\x77\x17\x4e\x77\x1e\x5c\x22\xb4\x9a\x46\x04\x69\xcf\xb5\xd2\xe1\xff\xbd\x34\x12\xd5\xa3\x66\x58\x2b\x95\xab\x54\x7d\x0a\xb7\x4a\x56\x60\x8e\x7e\x9e\xa5\x25\xa2\xa5\x48\x92\x1a\x10\xcd\x4a\x54\x1c\x1c\xfc\x20\x58\x9f\xbe\x29\x83\x6c\x84\xe9\xa8\x8c\xbc\x90\xfc\x67\x0d\xb7\x41\x86\x25\xab\xbc\xde\x9e\xc5\xd5\x25\x1c\xc9\x59\x22\x87\xe0\xf2\x02\x4c\x4e\xbd\x39\xd4\x7c\xcb\xbe\xf7\xd6\xdb\x77\x09\x59\xef\x6c\x2f\xcc\x76\x16\x67\x19\x09\xb7\xaf\x5c\x45\xa4\x6a\xaf\x6e\xfe\xf8\x53\x67\xf5\x85\x54\x06\xac\x3b\x73\x6f\xf3\x4b\x81\xb7\x31\x05\x27\x11\x35\x9b\x25\xb8\x4a\xd2\x09\xc4\x15\x1a\x7a\x2f\x5c\xc8\x1f\xab\x74\xb1\x79\xef\x19\x75\x8d\xc3\x20\xfc\xbf\x8b\x6b\x8f\x4b\x78\x8e\xda\xb9\x8a\x78\x2a\xdd\x55\xeb\xc7\xc3\x5a\xb5\x02\x78\xa4\xf6\xb3\x47\x07\xb0\xa9\xd0\x0a\xef\xd4\x9e\x81\x3d\xd0\xe8\x9e\xfd\x7b\xa0\xb3\xad\xbb\x8f\x3a\xf3\xab\x34\x9f\x25\x99\x46\x3d\x2e\x31\x49\xc4\x9b\xac\x52\x4d\xc2\x21\xb8\xd5\xf8\xbe\x6d\xca\x4d\xa0\xa9\xa4\x4b\x0a\xa1\x3d\xbe\x14\x71\x90\xed\x2b\x30\x0b\xbe\x9d\x71\x52\x27\x6e\x74\xce\x3e\xdd\xf5\xbc\x78\x19\x15\x65\x16\x14\x76\x88\xb3\x85\xcb\xb8\x4b\xf7\x9e\x6d\x5e\xfe\x85\x9a\xcf\xb4\x57\x50\x88\xc8\x87\x4d\xce\xef\x4a\xe7\xe4\xdd\xad\x33\xf7\xe5\xa0\x21\xf3\xc4\xc7\x01\x39\x8c\x4b\x44\x51\x1f\xd1\xca\xfd\xcc\x3c\x03\x1e\x0a\x05\xa4\x70\x70\xf3\x87\x6f\xbb\x97\x81\x14\xcd\xd8\x37\x0d\x2e\x34\xa0\xc9\xc9\xdb\xeb\x53\x73\x1e\x8e\x30\x35\x69\xc4\x25\x41\x6b\xe7\xe6\x22\x0c\x58\x66\xae\x43\x30\x5e\xc3\xaa\x0e\x71\xed\xda\x4f\xa9\xd5\x95\x00\xb8\xb7\x80\xda\xe0\xc3\x72\x26\xc8\x34\xb8\xaa\xa8\xe7\x69\xba\x42\xee\xd3\x75\xc2\x45\xcb\x1b\x2f\xbf\xee\x3c\xf8\x0a\xc7\x85\xc3\x54\xc7\xb0\xd9\x02\x7e\x0b\x09\x08\x32\x8e\x37\xe6\x0c\x19\x51\x05\x7a\x24\x36\x6f\x03\x1d\xb9\x5d\x07\xde\x4c\xd6\xdb\x4f\x70\x1c\x7c\xa1\x01\x99\xc0\x63\xd8\xee\xcc\xc3\xf9\x7f\xcc\xbb\x01\x0b\xc6\x1d\x12\x72\x74\xef\xde\xdb\xbe\x7c\x1e\x3e\x76\x67\x26\xbb\xd7\x66\xe4\x56\xe8\x45\x3a\x2a\x31\x70\x40\xc8\xe3\x01\x61\xbf\x21\x4c\x25\x7f\x33\xcb\x76\x81\x66\xb9\x3a\x38\xf8\x3e\x1e\x5e\x5c\x06\xe6\x52\x1f\x7f\xf2\xf1\x07\x78\xa7\xfc\xf2\x68\xfb\xfa\x4b\x75\x63\x09\x41\x1a\x2d\x35\xe2\x66\x0a\x04\xe9\xfd\x00\xe7\xc6\xec\xa0\xfa\xac\xc9\xd0\xe0\xfb\x8a\x94\x30\x8b\x09\x07\xe0\x25\x11\x08\xf7\x26\x53\x0d\x6c\x5e\x5c\xea\xcc\xff\xcc\x08\x02\xcc\x58\x2e\x1d\x09\x2c\x64\x46\xc6\x5d\xb7\xc2\x67\xa8\x33\xb7\xe0\x6f\xdb\x68\x9a\x36\x78\xb4\xef\x1f\x39\x72\xd8\x1a\xae\x2e\xd0\x4b\xd1\x03\xbd\xf1\x76\x7a\x01\x82\xc2\x8d\xce\x3c\x74\xf9\x37\x39\xa4\xde\xa8\xa1\x27\x3c\x02\xad\x66\xad\x4f\x3b\x2b\x01\xac\xa9\x82\xb3\x77\xa0\xbd\xc2\x67\x8d\xaf\x4e\x1a\xe8\x81\x00\xff\x19\x24\xdc\xf0\xf6\xe4\x2c\xdd\xca\x8f\x01\x72\xe3\xc9\xe4\xf6\xf4\x5d\xc2\xe3\x1b\xc2\x7b\xa0\x04\x32\x2d\x22\x07\xa3\x16\xe2\xdf\x63\xe2\x08\xd5\x66\xc2\x4e\x3c\xf9\x2b\x32\x08\x7a\x95\x6a\xf1\x48\xa9\x19\xc7\xa9\x3a\x7e\x70\xdf\x3f\xd4\x74\xd7\x2d\x35\x68\x4e\x40\xf6\x2d\x02\x58\x79\x15\xba\x3c\xb7\xf5\x02\x66\x3d\x99\x73\xb6\x90\xe2\xc4\x0d\xa4\x93\x9a\xe4\xac\x4f\x2d\xe1\x6a\xa9\x45\x12\x9a\x43\x0c\xbc\xe6\x00\xd4\xdc\xac\x8b\x49\x71\x96\x63\xb0\x89\x74\xcb\x0f\x7e\x48\xbb\xab\xae\x7a\x2a\x18\x6e\xc6\x63\xc5\xce\xcf\x2b\x9d\xd3\xcf\x36\x9e\x3d\x33\xdf\xd4\x14\xb6\x61\x05\x5f\xde\x20\xa2\xa9\xbb\xb8\x49\x87\xe5\x3e\x9f\xc3\x8f\xdf\x3d\x14\xfc\x6f\xbf\xff\xdd\xef\x60\xe0\x86\xb7\x9e\xfe\x46\xdd\xe5\xab\xf9\xf5\x60\xdd\xda\x2f\x89\x41\x93\x9b\x6d\xcf\x47\x40\x19\xf7\x04\x6f\xd2\xac\xfe\x8f\xe8\xf3\x10\x64\xaa\x68\xa0\x1c\x8f\xbd\x85\x2b\x82\x1f\x81\x7a\x10\x6d\x31\x23\x6a\xaf\x6c\x5f\x7d\xde\x79\x70\x5e\x77\xa1\xe0\x34\xc9\xb7\x61\xb3\xa2\x0d\x8b\x80\xa5\x72\x5c\x1f\xae\x36\xc7\x44\x14\x44\xce\xe8\xe6\xb3\xad\x25\x24\xc3\x40\x3d\xec\x5b\x87\x9a\x2f\xd5\xe3\xb4\x3a\x3c\x61\x96\x7c\x7b\xf2\xca\xe6\xf5\xdb\x39\xd0\x30\x58\x90\x20\x4b\xf8\x4f\xb5\x1c\xe9\xbd\xb4\x8e\x3b\x5e\x61\x5f\x43\x87\x1b\xcf\x17\x08\x89\x6d\xa6\x42\xd0\xbd\x10\x0f\x0f\xd7\xaa\xf5\x88\xd9\x1b\xc2\x84\x8b\x9a\x03\xd5\x9c\x4e\x4e\xef\x76\x3d\x38\xc3\x0d\x94\x83\x45\x8c\x98\x24\xdc\x57\x47\x4e\xb7\xc1\x4c\xda\x64\xfb\xd0\xdb\x1f\x59\x84\x48\x6e\x62\x39\x5e\x70\x5b\xa3\xec\x39\x8b\xb7\x16\x9e\xde\x5f\x84\xff\x70\x51\x5c\xd5\xb5\x08\xa2\x62\x04\x40\x8a\x3b\x1e\x02\x97\x5d\x7c\x4f\xfe\xf0\x27\xee\xdc\xf5\xd2\x40\xa6\xb6\x4c\xc8\xb4\x71\x97\xf8\x88\xa7\xc4\xb2\x7c\x6b\x86\xe5\x37\x76\x07\x2f\x8e\x93\x77\xf9\x0a\x24\x84\x3c\x4f\x55\x90\xf2\xba\x77\xd2\x32\x11\x90\xef\x10\x52\x29\x0d\x14\x85\x99\x51\xf4\xf3\xfa\xfa\xd4\x14\x61\xf2\x2c\x31\x4c\x8c\xfc\xcb\x84\xf6\x4b\xaa\x68\xd9\x59\x85\xe1\xa8\x12\xa1\x18\x5b\x29\xc9\x3c\x6a\x71\x7c\x0c\x26\xf2\x4e\x1d\xa7\x17\xbc\xab\x8a\x83\x83\x54\x9c\x04\x1f\x50\x79\xaf\x7a\xb2\x0c\x52\x5b\x03\x05\xa1\xd4\x66\xa8\x20\x8d\x03\x38\x39\x56\x79\xdc\x88\xea\x41\x02\x12\x64\x39\x0a\x04\x3d\x83\xa1\x30\xc1\x92\x7a\x50\xab\x0e\xc9\xb2\x0e\x14\x72\xd9\xb7\xad\xd3\x4b\x9d\x9f\x1f\xf5\x62\xcd\x72\xeb\xc8\x40\x7b\xd7\xbc\x04\x1b\x63\xf8\x33\xa6\x0e\x70\x57\xbb\xfc\xa1\x62\x0e\x89\x45\x83\x9e\x22\x9a\x77\x49\x6b\x24\xf8\xdf\x9c\xb3\xe0\x02\xea\xd3\xa0\xf6\x9b\x37\x7b\x6a\xd6\x19\x1e\x8e\x01\x36\xb8\x8d\x02\x8a\x34\xb7\x24\x0d\xe4\xc8\x62\x24\xe5\x35\xa3\x92\xa8\xa9\x4a\xc7\xab\xd1\xb8\xaf\x8f\x11\x3d\x9a\xe9\x96\x66\xa9\x64\xd3\xed\x85\xef\xb7\xee\x2c\x6a\x96\x3a\xb7\x45\x35\xf2\xdd\xb4\x0b\xab\xa7\xc5\xde\xa9\x2f\xa4\x75\xc3\xdd\x5e\x26\x7a\x7d\x81\x4a\x5f\x0a\x17\xe6\x35\x8b\x18\x7c\x89\x98\x8b\xd5\xac\x06\xcd\x92\xa9\xb1\xbb\xad\x3b\x44\x12\x6c\xae\x82\xb9\x6f\x51\x51\xb0\xec\xbb\xf1\xfc\xec\x2e\x78\x7f\x9b\x5d\x5b\xb5\xd8\x35\x61\xc8\xff\xf8\x76\x50\x0c\x5e\x27\x82\x2e\x33\x46\x71\x1a\xf7\x6e\xf6\xe2\xe6\x95\x13\x28\x35\x58\x88\xa4\x99\xc1\xcd\x73\xdf\x77\x5e\x5c\x72\x4e\x23\x8f\x90\xe9\x72\xcf\x71\x69\x42\xcc\xd0\x59\x45\x9a\x27\x65\xf8\xd7\x8c\xdc\x2e\x3d\x01\xf8\xb2\x91\x56\x58\x29\x67\x8f\xdf\xbf\xe1\x44\xd7\x52\x1a\x01\xc6\xb7\xa8\xb8\xdf\x3c\xc5\x4b\x94\xa4\xa5\x91\x6a\x5a\x1a\xc6\x2b\xb1\x52\xdc\x07\xfc\xfe\x3e\x80\x7d\x4c\x77\xf3\x63\xba\x89\x4f\x49\x0d\xd4\x8a\x3c\xea\x5e\xbc\xf4\x46\xb0\xf7\xb8\xc8\xc9\xbf\xc7\x6b\x0e\x89\x4d\xb5\x86\x47\xa7\xa8\x44\x81\x25\xfa\x3f\xd2\xd6\xc0\xd3\x8a\xa2\x74\xaa\xe5\x55\x1c\xd2\x8f\x9a\xff\x53\x6c\xea\x09\x7b\x1b\x47\xe2\xa1\x56\xb5\x56\xc9\x36\x43\xb7\x90\x48\x93\x40\xac\xef\x77\xd6\xe6\xa9\xeb\xf3\x34\xcb\xb3\x2c\x1f\xb8\x75\xa6\xbe\x08\xf6\xa2\x50\xc6\xd7\xd2\xa4\xda\x3c\x4d\xae\xf3\xa4\x6d\x25\xfa\x82\xe0\x2b\x38\x9a\xaf\x26\x51\x5c\xe7\x5c\xf7\xc1\x77\xea\x3c\x38\x28\x49\xab\xa6\x5a\xdb\x95\x7c\x16\x28\xb1\x66\x4e\x51\x40\x24\x23\xd4\x8e\x16\x94\x70\xf9\xc7\x42\xa0\x36\xbe\x2c\x25\x67\x15\xc8\xe5\xfc\x8b\xce\xb5\xbb\xf6\x39\xa0\x22\xb3\x7c\xd0\x60\xb2\xff\x2d\xf8\x4f\x21\x09\x8f\x47\xcc\xe6\x8c\x28\x7c\xe8\x2e\xce\xd2\x61\x5b\x51\x92\x9c\xe0\x00\x13\x13\x67\x4e\xce\x41\xde\xf9\xa0\xe4\x4d\x4b\x61\x6d\xd2\x2a\x97\xa3\x04\x95\x93\x00\x7f\x8a\x90\xea\x6b\x10\x6b\xbb\x67\xfe\xb6\x8e\xd8\x4e\xa7\x1d\xc7\x0e\x1c\xe1\x5c\xa0\xb0\x7b\x1b\x78\x74\xad\x5a\x23\xa9\xb8\x73\x5f\x64\x66\xee\x02\x5b\xb8\xfd\x0b\x7d\x79\x69\x2b\x0d\x51\x60\x56\x93\xe8\xc9\xbd\x7b\x92\xe6\x1c\x72\xe5\x38\xae\x53\xd6\xf0\x0b\x9f\xa2\x69\xe3\x68\xa1\xc5\xe2\x7b\x5c\xab\x78\x32\x2c\xa9\x47\x84\x93\x7d\xc7\x1c\x56\x75\xe6\x4d\x15\x97\x36\x24\xe3\x55\xd8\xe1\x92\x36\x94\xe0\x1e\xa5\xd1\xe7\xa9\x63\x30\x09\xb4\xc5\x84\x78\x96\xc7\xb4\xdc\xa7\x50\x1d\xcb\xa7\x17\x95\x4a\xa7\xbb\x57\x5f\x16\xc6\x26\x08\xfd\x12\xba\x66\xcf\x9c\xca\xd1\x6e\x27\xa3\xf1\x38\x19\x17\x04\xd0\xc7\x51\x54\xbb\x5e\x24\x85\xc4\xf2\xd6\x8d\xbb\x9b\xb7\x9e\xfd\x7d\xf2\x0e\x10\xb0\x1a\xd0\x80\x18\x2f\xf2\xe3\xaa\x62\xe7\xe4\xa3\xce\xf9\x39\xbf\x79\x18\x40\xdc\x1c\xb1\xfa\x57\xca\xf3\x09\x51\xd1\x3b\x43\x53\x3a\x7a\xba\xd8\xc4\x74\x74\x81\x0c\x44\x6b\x88\xb3\xa2\x86\x1e\x00\xd4\x23\x5d\xb7\x8c\xd8\x20\x48\x66\x76\x85\x4f\xc5\xa2\x74\xb4\x90\x3b\x3d\xd2\x6d\x26\x96\x72\x33\x89\xc2\x26\x1c\xb0\xee\xad\x6b\x9b\x3f\xdc\x84\xea\x61\x2b\x1d\x3d\x6a\x99\x68\x4a\xa2\xbb\x47\x6b\xc0\xd6\x9d\xf9\x5e\x37\x96\x91\x24\x46\xa3\x06\x8a\x1f\x63\xc9\x48\xb1\x7b\xe9\x26\xf1\x15\x7e\x15\x10\x4d\xbb\x73\x70\xb1\xdd\x10\xde\xa1\x3d\xfb\xeb\xda\x75\xb8\x17\xe9\xef\xf3\x82\x97\xe6\x5a\x77\x91\x39\x89\xcb\xd5\xb0\x56\xfa\x87\xfb\xdb\x9e\xfc\xae\x7b\xfe\x59\x4e\x07\x2e\xef\xc6\x56\xa9\xb1\x46\x5a\xdc\xfc\x12\x87\xb3\x75\xf7\xb1\x7f\x1d\xc3\x79\x51\x94\x48\xf1\x4d\xab\xac\x03\xd8\x78\xfe\x15\x69\x02\xee\x90\x30\xee\xdc\xe0\xda\xc2\x86\x28\x62\xee\x3a\xe0\xd6\xce\x76\x2e\x02\x79\x3d\x81\xfa\x8a\xa9\x79\x92\x3d\x5c\xa2\x9d\x19\x1f\xdf\x97\xfd\x47\xc7\xe3\xd2\x62\xa8\x92\xef\xba\xf7\xae\x6f\x4d\xff\x62\x51\x2b\xb6\xa9\x7d\x67\x5d\x55\xc2\xda\x8d\x45\x63\x43\xd8\x57\x54\xcc\xec\xcf\x75\x82\x7b\x61\x58\xcd\x61\x38\x01\x44\x65\xf2\x6f\x7b\x3c\xad\x2f\xbf\x62\xe9\x81\x60\xa3\x5d\xc1\xbe\x50\x9d\xe1\xee\x29\xbb\x26\xdc\x11\xe3\xbe\x35\xc9\x67\x4d\x5d\xf4\x52\x5b\x94\xd9\x77\x61\x52\x98\x57\x27\x29\x37\x89\xea\xa9\xda\x7d\x63\x0c\x63\xc1\xd8\x48\xf4\x5f\x04\x6f\x0e\xbd\xb5\x37\x79\xf3\xc0\xd0\x5b\x70\xfd\x82\x28\xdc\x56\xeb\x4f\xc3\x9d\x9c\xd2\xbc\x7e\x67\x65\x6e\xe3\xd9\x29\xda\xc9\xab\xa4\xc0\x25\xde\x9a\xec\x2e\x7b\x2b\xdd\xcb\x53\xdb\x0b\x17\x36\x9e\xdf\xee\x9c\x62\x3c\xb0\x0f\x79\x9e\xd6\x06\xd8\x39\x1e\x4a\xee\xd5\x4e\x56\xb0\x88\xc9\x86\x3a\xc2\xd9\x93\xc1\x5c\x7d\x67\x6e\xa1\x00\xd3\x1c\xad\x0e\x01\xaf\x04\x97\x04\xa9\x02\xcd\x26\x6f\xde\x69\x77\x1f\xdc\xf4\x20\x98\x99\x75\x46\xe9\xef\xc2\xaa\x83\x29\x30\x5c\x6a\x47\x09\x8e\x0e\x82\xe9\xd3\xf0\xdb\x8e\x42\x33\xa2\x2d\xaa\x55\xc7\xaa\xe9\xee\x8e\xa9\x6b\x11\xbc\xec\xe8\xdd\xcc\xe9\x58\xdd\xfe\xf6\xf9\xe6\xd3\x36\xef\xe6\xc6\xcb\x1b\x2e\xf3\x86\x03\xfe\x7d\x40\x24\xfc\x2c\x6b\xfc\xfc\x71\x8d\x86\x49\xa9\x55\x17\x84\x02\x81\x95\x4e\x28\xa9\x50\x2f\xd0\xbc\x6e\x20\xa3\x48\xdc\xda\x45\xa2\x06\x6d\x7b\x1d\x3d\x6e\x37\xb0\x75\x46\xc1\x2b\x1a\xd7\x5e\x45\x8e\xbf\x7b\x6d\x49\x21\xc1\xa2\x5a\x49\x94\x58\xb2\x48\x4a\x23\xff\xd6\x02\x3e\xa7\x66\x44\x5c\x26\xb0\x8d\x20\xe3\x7d\xf9\x94\x10\xf2\x4e\xe7\xd4\x39\x35\x71\xdf\x9a\xb8\xf1\x64\x96\x30\xf2\x1a\xb1\x88\x8f\x89\xcb\x65\xdd\x35\xe1\x65\x2e\x2e\xd2\x36\xa9\x55\xd8\xcd\x06\xc0\x51\x71\x47\xc0\x76\x24\xe2\x49\x2e\x78\x5d\x8a\x0e\x90\x58\xf5\x84\x2e\x87\x54\xb1\xea\xfd\x56\x52\x6c\xa3\x3e\xce\xd2\xe6\x2f\xdc\x84\xcb\x41\x68\xb7\x11\xe8\x94\x2d\x84\xe6\x82\x53\x4a\x65\x46\x1e\xc5\x42\x1e\x42\x9b\xf1\x56\xb2\x93\xda\x79\x46\xdc\x78\x4f\x92\x68\x75\xa0\x59\xbb\x32\x6a\xc6\x76\xb8\x03\x68\xef\x49\x79\xff\x58\xf1\x52\x73\xdd\x6b\xd7\x41\x34\x04\xe6\x49\xcd\xf2\xba\x56\x92\xdb\x82\xbd\x3d\x1e\xa3\xd8\xf5\x29\xb5\x3b\xf5\x9d\x66\xa9\xdb\x4b\xe3\xb8\x04\x5c\x59\x33\x2d\xfe\xba\xb6\xc0\xe6\x35\xc0\xeb\xee\xb3\xc9\xac\xc2\x12\x85\x5c\x61\xb0\x33\x36\xaa\x3a\x90\xed\x5a\x5c\x06\xde\x40\xd1\xbb\x8f\xe2\xfa\x7e\xfa\x12\xc8\x97\x24\x28\x87\x75\xc0\x94\xa0\x3c\x1a\xd6\x47\xa2\x40\x0d\x21\x09\xd2\xd1\x66\xdc\x1a\x19\x25\x7e\x7b\x00\xd8\x20\xdc\xd9\xa3\x4c\x44\x91\x11\xd2\x14\xb4\x0f\xbd\x73\x54\x2e\x3d\x49\x32\xb6\xc6\x12\x6e\x5f\xec\x74\x88\xfb\x8b\xdc\x7d\xd8\x71\x03\xa4\xe6\x80\xe1\xcd\xf2\x44\x0f\xcd\x1d\x00\x17\xd7\x39\x7b\xdd\x00\x6b\x1d\xaf\xe6\xbc\x9f\xd8\xf5\x70\x91\xe2\x4a\x08\xab\x34\x81\x9e\x16\xb8\xcb\x27\x60\x0f\x8a\x44\x4d\xe0\xff\x67\x0a\x50\x8c\x0d\xb0\xb7\x01\x80\xc3\x55\x3f\x76\xb4\xf0\x09\x30\xa0\x1f\x65\x14\x08\x1f\x03\xb3\x2a\x5f\x1d\x7e\x15\xcb\xde\x61\x2f\x9d\x5c\x25\x7a\xe1\x70\x2f\x9d\xc3\xc7\x91\x98\xfd\x33\xfc\x84\x76\xe3\x19\x1c\x7c\xff\x08\x29\x3e\xc8\x40\x35\x45\xa2\x72\x7b\x05\xba\xec\xcc\x9c\x2b\xbc\x9f\xa6\x8d\xe4\x93\x66\x8d\xec\x41\x83\x64\x91\x39\x1c\x4e\xd4\xe2\xb0\x82\x1f\x51\xf5\x83\x17\x96\x16\xaf\xd9\x66\x73\x24\x0a\xc7\x64\x1a\x6d\x2a\xf9\x16\x27\x70\x10\x78\x6a\xfa\xda\x9d\x79\x09\x7b\x4a\x9f\x50\x9e\x7c\x67\x47\x4d\x47\xe1\xa3\x68\xfc\x0f\xcd\xb0\x5e\xe6\xfa\xf0\x2b\x18\xa2\x9f\x01\x4a\x61\x85\x43\xf1\x18\xdc\x7c\x83\xad\xb1\xb1\xb0\x39\x51\xe4\x5f\x41\xc2\x3f\xa5\xf0\x43\xd8\x6f\xf4\xbd\x92\xc2\x31\xfe\x29\x85\x87\x46\xe3\x6a\x59\x97\x95\xe9\x57\xe1\x48\x33\x8a\xa8\xb7\x77\x41\x48\x0e\x50\x54\x04\x68\x10\xc9\x88\x81\x50\x92\x17\xfe\xf7\x44\x41\x2b\xe8\x22\x72\x3e\x52\x56\x77\xe7\x68\x16\xc2\x5a\x63\x34\x24\xf9\x4e\xc0\x68\xff\x96\x45\x5d\x8e\x57\x00\xa1\x2b\x5c\x3f\x17\x1f\xa2\x0f\x04\x50\xc8\xe9\x79\x5a\xdc\x8b\xd0\x0d\x9a\xd8\x99\x4e\x63\x97\x93\x4a\xa7\x8d\x4a\xb8\x3d\xa5\x3d\xa4\x78\x3b\x81\xda\x79\x24\x5f\x78\x33\xe5\xda\x38\xed\x31\x54\xe0\xa2\xe0\x71\xec\x0b\xfa\x8d\x64\xf2\x16\x8d\xc4\xc8\xa0\xaf\xec\x7f\xb5\xd7\x48\x5e\x29\xc1\x6d\x8c\xd0\x33\xdc\xc4\x2b\x03\xaf\xfa\x23\x33\xe6\xca\x7e\x96\xd8\x60\x1f\x30\xb6\x7f\x51\xeb\xf9\x99\xb0\x45\x53\xcf\x34\xbf\xd0\xcf\x09\xe4\xb3\x02\xe9\x28\x4c\xfd\x7d\x41\xe7\xe1\xdf\x88\x5e\xcd\x93\x75\x60\x0a\xdb\x10\x4f\x93\x1e\x2b\x05\x03\x18\x0b\x3f\x77\x1b\xd1\x95\x80\x39\xe5\xeb\xbf\x57\x55\xbe\x8a\xf5\xea\x22\x7f\x22\x5a\xe3\xfe\x57\xb1\xd1\xd7\x40\x23\x68\xf3\xcc\x6b\x02\x0f\x58\x90\xab\x0d\x85\x4a\xd5\x7a\xb9\xd6\xaa\x98\x31\xf3\x80\x3b\x67\x2e\x05\xfb\xf6\x26\xfb\xc8\x3a\x7e\x7e\x19\x99\x9b\xbe\x6b\xdf\xaa\x1f\x03\x79\xa2\x2e\xad\x6c\x3c\x39\xd7\xfd\xea\xaf\x64\xc7\xb8\xcb\x72\xfa\x1b\xca\xf3\xaf\x04\xfd\xc5\xcd\x66\x54\x4e\x95\xc6\x1d\x9d\x93\x36\x9e\x4c\x6e\x9d\xfe\x41\x11\xde\xab\x4a\x61\x23\x62\x80\xb9\xf0\x8c\x5e\x2b\x73\xbd\xdd\x35\xb7\xb4\x5f\x24\xcd\xa3\xce\x21\x4f\x97\x68\x7c\x1c\x4b\x43\x51\x54\x2f\xa5\xe1\xb1\xa8\x9e\x55\xd0\xac\xb2\x90\xac\xac\x53\x39\xbc\x38\xfb\x4c\x64\x1b\xf2\xe9\xf2\xae\xda\x02\xe9\x2e\xd3\x94\x71\xf2\xd8\x4d\x0b\x29\x90\xd4\x9c\xd1\x18\xf2\xba\xab\x56\x18\x33\xa9\x05\x58\xa6\x4a\xff\xcb\x77\x37\x0d\xea\xc5\xd6\xbb\x6a\x50\xa2\x97\x56\x2c\xbb\xa5\xbd\xf4\xa9\x34\x64\xa0\xb9\xd0\x5e\xa5\xe4\xe8\x55\x49\xf7\x6e\x79\x3e\x5c\xcf\xea\x58\xf9\x02\xb3\x5a\x27\xf6\xbe\x7d\x8f\xae\xee\xd9\x1d\xe4\xc6\x4c\xaf\x70\x1e\x90\x19\xb0\xbb\x15\xcb\x1f\xbb\x96\xc0\xc5\x45\x73\xfc\xe7\xf4\xa6\x99\x1b\x77\x8a\xbd\xd6\xed\xc4\xce\x5d\x68\x4d\x72\xf4\x39\xf0\x35\xc5\xee\xdc\x69\x62\x1f\x95\xf5\xd2\x55\x29\x77\x1e\x7c\x45\xfa\xe4\x4b\xce\x4e\xd4\xc2\x24\x45\xad\x1e\xaf\x45\xb1\x33\x73\x76\xfb\xf2\x2d\xe5\xdf\xe1\x39\xf1\x08\x5e\xa2\xd5\xe5\xda\x64\xe7\xc5\x9c\x12\x01\x1e\x2b\x73\xb7\x30\xd5\x9d\x33\xb7\x11\x46\x2d\xa1\x56\x1b\xfb\x46\x35\xcd\xe1\xa3\xdb\xcc\xb1\x68\x82\xdd\x65\xbe\x70\x05\x39\xa5\x85\xdf\x9b\xa0\x7a\x16\x95\x43\xc7\xa3\x26\xf0\x5e\xba\x12\xb9\x88\x3a\xaa\xe5\x15\xe4\x79\xa0\xa8\x57\x5b\x28\x4a\xe2\x32\xcc\xb2\x5d\x52\x6b\xa7\x15\x39\xbe\x4b\x7a\xe6\x25\xc3\x9f\xe2\x7d\xb7\x08\x90\xac\xdd\x84\xff\x6e\x3d\x43\x56\xa0\xaf\x8e\x02\xf8\x22\xa5\x8b\x07\xa0\xad\xbb\x6b\xae\x0a\xfe\x85\xa5\x88\x2f\x24\x69\xb5\x56\xc3\x1d\x60\x47\x69\x8f\xfb\x56\x6e\x4e\xbe\x42\xd4\x90\x79\xbc\x9e\x33\x27\x45\x76\x52\xce\xa7\xde\x0d\xd4\x8f\x2d\x3e\xdf\x7a\xf0\x7d\xce\x86\xf0\x38\x50\xc2\x47\x47\xe8\x1c\xa5\x07\x0b\xda\xec\x20\x9d\xb3\xf9\x32\x18\x05\x80\xe6\x9a\xed\xc9\xc9\xce\xe9\x67\x4a\x62\x9a\xb5\xf1\xab\xa7\xcb\x16\xa2\xa3\xbf\x24\x24\xf4\xaa\x86\x65\x20\xd9\x49\xab\xa5\xf2\x54\x1a\x99\xe5\x81\x2b\xd3\x5d\x9e\xad\xe7\x37\xb5\xf8\xda\x73\x5c\x05\xf6\x1e\x2e\x31\x9b\x6a\x1d\x3c\xe5\x63\xf0\xbd\x70\x59\xd3\x0b\x74\xa7\x3e\xc6\x23\x03\xab\x6c\x0e\x1e\xb2\x01\x20\x2d\xe0\xb9\x3d\x5a\x60\x41\x4d\x2c\xfe\x45\xcf\x5b\x41\x24\x8b\xff\x88\x81\xed\x89\xeb\xc5\xce\xfc\x14\x39\x34\x1b\xcc\x31\x7e\xf9\xe4\x0d\xee\xa9\xc2\xc5\x51\x7c\x82\x6e\x61\x1c\x8e\x52\x62\x4c\x3f\xcf\x77\x1c\x1f\x8e\x6b\xb5\x78\x9c\xf5\xe7\xec\xe8\xf0\x80\x89\x12\x20\x45\x88\x64\xac\xa8\xdc\x2f\xd6\x04\x96\x2d\x6a\x1a\x56\x7d\x76\xbf\xb5\xea\x39\x5f\xb7\x16\xbf\x83\xb5\x2f\xa0\x7e\x74\x6c\x80\x2e\x1a\x94\xfe\x9a\xc7\xb1\x13\xf7\x7a\x11\x0e\xa7\xbd\xba\xf1\xec\xcc\xe6\x0f\x27\xf2\xaf\x2b\xd3\x0c\x30\xf4\x40\x73\xeb\xac\x30\xa1\xf9\x54\x1c\x51\x4c\x09\xdd\x2f\xd9\x93\x4c\xb7\xae\xbc\x5c\xbd\xd6\x35\xf7\xf1\xa9\x72\xc4\x3f\x5a\xe8\xe3\xb2\xdf\xd3\x44\x9c\xb3\xc3\x05\xa1\x5e\x89\x25\x9f\x89\xfa\xbf\x38\xf8\xd1\xa0\x77\xf4\xd0\x5f\xae\x56\x2d\x93\xfa\x36\xe9\xe9\x5c\x57\x20\xe3\x8c\xd8\x64\x2a\x51\x2d\x4a\xa3\x1c\xb5\x28\x23\x7e\xa1\x55\xad\x14\x3f\xa9\x56\x0a\x85\x46\x6b\x08\x9a\xb6\x42\x11\x1c\x7c\x09\xf2\xe6\x29\x91\x2c\x59\x2d\x69\xbe\x2b\xd8\x6a\xe7\xe4\xfd\xed\x85\x59\x59\xde\xc9\xf6\xc6\xf3\xe7\xdd\x13\xf3\x59\x2d\x03\xeb\xa6\x50\x52\x64\x8f\x2b\x9f\x49\x51\xfa\x54\x3e\xb3\x93\xed\x3f\x47\x43\xb6\x21\xb7\x7b\xe1\xdc\xc6\x2f\xd7\x2c\x67\x06\xb2\xe0\x3c\x9f\x65\x6a\x40\xde\xa3\x16\xd2\x68\xd6\x46\x33\x3b\x62\x7b\xa8\x14\x1d\x57\x28\x85\x3d\xa8\xbc\xbe\xb5\x40\xd7\xa0\x85\x4f\xea\x9c\xe6\xa8\x6c\x86\x31\x12\x43\xbc\x09\x2e\x52\x4b\xe7\xf8\xfa\xcc\x8f\x45\x42\x5d\x4e\xca\xc1\x48\x0f\xfc\x7d\x6d\x35\x2a\xa8\x5a\xc9\x41\x3d\x71\xc9\x82\x11\x74\x17\x1e\x7a\x70\x46\x23\xe2\x6c\x91\xbf\x9d\xc8\x71\x50\x75\x6b\x99\x15\x57\x2f\x14\x2a\x1b\x60\xa4\x98\xbf\x39\x35\x7d\xa7\xaa\x5f\x4f\xa9\xaf\x99\x88\xab\x2a\xab\xc6\x2b\x13\xb5\x67\xbe\xb2\xd2\xd5\x54\xce\x76\x17\x9e\x76\x1f\x5f\xcc\x77\xc6\x45\xab\x6a\xb5\xde\x8a\x8a\x9b\x3f\x5d\xc1\x98\xa1\x5e\x11\x2d\xe2\x54\x25\x2e\x56\x43\x13\x4a\xc7\xa9\x75\xe3\xec\xe3\xe2\xd2\xe1\xf9\x85\xce\x8b\x4b\x3d\x1d\xbb\x7c\x8f\x2e\xe5\xd0\xa5\x3c\x92\x5a\x49\x1a\x8f\x19\x12\x6f\xf9\xb0\x65\xfc\xd3\x7c\xa7\xa6\xf2\x68\x1c\x27\x62\xa7\xe4\xfa\x26\xc8\xc9\xad\xb9\xdd\x7e\xd2\x3d\xfb\x8d\xda\xfe\xbc\xfb\x44\xdb\xee\xd1\x3d\x95\x70\x85\xe9\x03\x0c\x10\x68\x7b\x3d\x55\x95\x8c\xcf\x81\xb7\x0a\x42\x34\x1a\xa8\x23\x32\x8b\x40\x74\xb6\x54\x1d\xa3\x78\xb9\x3e\x6e\x74\x4e\x5c\xdb\xea\xe6\x97\xcf\x3b\xd3\xf3\xae\x23\xc8\x94\x3b\xfa\x7c\xdc\xcd\x9d\x51\x1f\xf4\x55\x78\xd8\xcf\x00\xc7\xd7\x6c\x5c\xb3\xd8\x73\xcb\xf1\xc2\xa5\xe3\xb8\x15\x1a\xca\x8a\x38\xf3\xfd\x4e\x51\x39\x57\xda\x15\xb0\xad\xb2\x73\x50\x3a\x47\xf2\xea\x35\xac\x1d\x44\x2d\x6f\x0d\xcc\xca\xe6\xb5\xd2\x79\x62\xc5\x50\x65\x16\x54\xdb\x19\x7b\x4d\x67\xf3\xc7\xb9\xcd\x2f\x1f\xe1\xce\xfa\x1e\x6c\x76\x50\xc7\x9c\xe7\xa6\x66\x26\x2b\x63\xdd\x35\x25\xce\xdf\xcd\xbc\x18\x0f\x92\x91\x13\x09\x87\x74\x24\x62\x15\xfa\xd7\x1b\xc2\x84\x02\xb2\xa4\x9d\x73\xef\x5d\x52\x2e\xbb\xdf\x10\x51\xcb\xbf\x06\xe1\xca\x52\xbe\xc4\x27\x6c\xbf\x60\x75\x71\xe5\x5f\x77\x70\xdd\x56\x49\x05\x9a\xe9\x65\x4d\x15\x89\xd2\xdd\x07\x68\x2f\xab\x30\x31\x3e\xeb\x0c\x25\x47\x59\x4d\x05\x4a\xf0\xd6\xf1\x74\x06\x5a\x7e\xf0\xe0\xd4\xdc\x77\xb4\x40\x19\x06\x9b\x77\xfe\xae\x67\x08\xcc\x3a\x17\x31\xbd\xef\x4e\x9f\xec\x7c\xfb\x68\x7d\x6a\x4a\x55\x77\xd6\x82\xe9\xbb\x25\x97\xcd\x1a\xfd\x87\x1e\xa2\x42\xf0\xcc\x94\x2c\x04\xf7\x1b\x57\x14\x23\xac\x54\xe8\xe0\xf2\x52\x69\x34\x8f\x08\x29\xbc\x09\x6e\xbd\xfc\x05\x58\x72\xaa\x92\x6b\xf4\xd0\x20\x9e\x4f\xa2\x80\x97\x1c\x9b\x3c\xda\x7a\x8b\xc2\x8e\x2e\xf7\xb1\xc7\x5b\x36\x5b\x3d\xec\x76\xf7\xfe\x0d\x54\xd2\xef\xad\x04\x9e\xa1\xbd\x33\x7f\x09\xa1\x51\x24\xa0\xe0\x46\x5b\x9b\xa0\x8c\x66\x42\xb1\x39\xec\xc6\xd8\xf1\x73\x65\x5a\x3d\x76\xb5\xc6\xde\x0a\x79\xaa\xa6\x39\x35\xff\x2c\x65\x96\x43\x97\xc3\x05\xdb\x81\xb7\x15\x12\xf0\xf5\x77\x59\x71\xac\xa4\xf1\x90\x02\x77\xfa\x62\xd6\x72\x9e\xcd\x93\x78\xfc\xa9\xd9\xc0\xb1\x8e\xa0\x12\x52\x9c\x68\x99\xd1\x34\xce\x6a\x28\xc2\xa3\x17\xdd\x25\xc7\xb2\xac\x06\xa6\xf0\xc9\x0b\x10\x12\x63\xe2\x9b\x49\xda\x8c\xeb\x23\x6f\xe9\x60\xf7\x5c\x27\x8e\x37\x0f\x08\x58\xa0\xf4\x11\x2b\x26\x24\x15\x6d\xdc\x5f\xd2\xd8\xdc\x50\xa0\x37\x43\x2b\x82\x35\x70\x17\xf1\xcb\xeb\xdd\x33\xe7\x31\x86\x35\xc8\x03\xe3\xd9\x9e\xb9\x4f\x1e\xb5\x4b\x9d\x8b\xf3\xdb\x37\xe6\x10\x58\x1f\x01\xd1\xc7\x04\x79\xab\x0f\x65\x96\xbe\x91\xd9\xfb\xed\x73\x3f\xa2\x9c\xd6\x47\xad\xa8\x6a\x12\x4b\xc8\x35\x51\xdf\xfb\x95\xd2\xe9\xad\xd8\x0d\xb1\x96\xd2\x12\x9d\xdd\xb6\x54\x3b\x45\xdf\xb4\x85\x05\xe5\x1e\x26\x1d\x41\xa8\x2c\xf6\x92\xde\x09\xdb\x51\x12\xa1\x21\x15\xb9\x28\x4c\xae\x54\x4c\x54\x71\x99\x84\x54\xaa\xf9\x69\xa2\xea\x9a\xde\xf2\x81\x6c\x8a\xaa\x87\xf1\xdb\xc9\xe7\xb2\x12\x9e\x18\xde\xc4\x01\x3a\x51\x75\x80\x77\xbb\x23\xab\xe4\x85\xe4\x8f\x54\x2d\x9b\x3d\xad\xd5\xfe\x34\xf5\x5f\x68\xcd\x31\xa6\xc0\x59\xc6\xeb\xac\x76\x24\x1c\xe8\x5e\x9b\xdc\xfc\x71\x8a\xf1\xa6\x7b\xe9\x36\x85\x97\x2a\xe5\x05\x94\x6d\xbd\xfc\x1b\x5e\x91\x3f\x3c\xa7\xf8\x6f\xd4\xc9\xd1\x16\x27\x29\x32\x8b\xf6\x6d\x44\x58\xf3\xeb\xda\x25\x68\xc3\x26\x81\xd0\x30\xfa\xd7\xe4\xe8\xde\xe3\x63\x80\xc0\xff\x78\x3b\x9a\x94\xb1\xf0\xde\x87\xd8\x64\xe5\x7a\x43\xeb\xc4\xf3\xcf\x25\x6b\x79\x6d\x5d\x57\xc1\x2f\x3f\x93\x6c\x93\xf1\x08\x64\x2d\xa1\xf8\x7d\xef\x96\x90\x6d\xfe\x78\x7e\xbd\xfd\x58\x75\x94\x47\xce\x5a\xf5\xa1\x6a\xbd\x52\x54\x5e\xda\xe8\x5f\x2e\x5a\x1c\x2e\x31\xc8\x91\x9d\x24\x46\x2a\x98\x6a\x2e\x6d\x50\xdc\xbf\x5a\xc5\x90\x5a\x29\xd1\xe6\xb0\x2e\x62\x8d\x26\x7c\x56\x4d\x55\x50\x39\x10\x4f\x78\x54\x64\x3d\x36\xcb\xc8\xa1\xbc\xe2\xdd\xc9\x8d\x58\xbc\xaa\x5b\x83\xe8\x23\xa3\x41\xc2\x0b\xcf\x9f\x94\x5e\xde\x81\xb6\xe3\xba\x03\x15\x22\x1c\x1c\x3c\xfc\xc7\x40\x79\x65\xea\x33\xd6\x97\xd5\xd5\xe3\xd2\x01\x13\xa4\x5c\xbe\x4b\x7b\x7e\xce\x89\x5e\xb2\x07\xb0\xd3\x15\x27\x2a\x06\x67\x1c\x6e\xc7\xdc\xa9\x48\xf1\xa6\x65\xb4\xd7\xeb\x45\x53\xab\x9e\xb7\x4e\x2e\x10\x6f\x77\x94\xb8\x22\x69\xfe\xe6\x58\x34\x42\x2d\xb0\x43\x23\x02\xa0\xa6\xc6\x41\xd6\x9a\xe6\x2e\xda\x46\xc5\x01\x2c\xc1\x97\x44\x8b\x2e\x89\x33\x2a\xe2\x95\xcf\xbb\x6c\x3c\x9b\xeb\x3c\x83\x8f\x77\x29\x90\xa5\x77\x7c\x39\x69\xfa\x7b\xe9\xf5\x2d\xb2\xcf\x4b\x25\x34\xdd\x46\x5a\x43\xfd\xfb\x60\xaf\xbb\x3e\x2b\xfd\x9a\x11\x92\xb0\xcb\xb6\xf2\xee\x0d\xe7\x66\xe8\x1d\x97\xfb\xcf\xb9\x34\xec\xe5\x71\x44\xcd\x5d\xad\xc4\x0e\xb7\x09\xac\x3f\x70\x0c\xc0\xe3\xfa\x3e\xa4\xbd\x66\xa5\xb4\x1d\xce\xa1\x34\x5e\xb7\x4b\x2a\xc2\xc0\x65\x73\xd5\x24\x7a\xbb\x96\xca\x86\x09\x9c\xa3\xdd\x12\x61\x4e\xa5\x3f\xa1\x0e\x33\x1e\xbc\x2b\x73\x74\xcc\xdd\x59\x4e\xb6\x15\xa3\xa8\x91\xb5\x73\x72\x1a\xc5\x81\x33\xcf\x69\x81\x3d\x92\xc2\xae\x0f\x4b\xda\x42\x61\x18\x48\xcb\xe3\xb7\xe4\xcd\x45\xf5\x28\x3e\xd2\xde\x54\x75\x0c\xab\x7f\xa7\xb8\x13\x56\xd0\xd6\xb5\x99\xb5\x15\x75\x1f\x3e\xd9\x78\x7a\xd2\x9a\xe4\x25\xe5\x61\x65\xf1\x73\x53\xe8\x9a\xb9\xf9\xd3\x65\x40\x26\x1b\x93\xfe\xad\x50\xf8\x14\xcd\x1b\x47\x0b\x6c\x95\xa4\xb0\xd8\x35\xc2\x9e\x35\x63\xc2\xcf\xf3\xa7\x32\xf6\x7d\x95\x84\xe1\xfa\x03\x5a\xa7\x3b\xe4\xd3\x3a\x8b\xab\x85\xd2\x37\xf4\x32\xaf\x96\x7b\xfb\xf4\xb9\xad\x5b\xa7\xb5\x7d\x46\xaf\x63\x8e\x5b\x00\x20\xd4\xa3\x67\xec\x47\xea\x63\xcd\xf1\x6a\x52\x1d\xaa\xd6\x90\x6d\x61\x3e\xf6\xc0\xf6\xd7\xdf\xf0\x5f\x5c\x86\x45\x6e\xc0\x7b\x36\x23\xc3\x9b\x49\x23\xac\x07\x65\xe0\x8e\x92\xe2\x9e\x56\x35\x68\x46\x95\x00\x03\x46\xf6\xbc\x65\x09\xf7\xa4\xf2\x9e\x3e\x03\xe3\x04\xe0\xb7\x8c\xf5\xce\xef\x05\x33\x23\x95\xc9\x70\x93\x75\x40\x46\x65\x44\x67\xed\xe7\xce\x99\x9f\x38\xa4\xce\x3e\xfd\xbd\xf2\x34\xc1\xec\x7b\x8f\x2f\xe8\x39\xc0\xc0\x72\x1a\xb4\xf8\x26\x33\x5a\x4c\xe0\xa4\x16\xe6\x15\xd1\x11\x4f\xde\x72\x34\xc5\x36\x6d\x72\x12\x3c\x2d\x6f\xb7\xef\x79\x3a\x93\x57\x0b\xe5\x5a\x5c\x8f\x4c\x4a\x03\x93\x3a\x80\xf9\x64\x7d\x53\x74\xae\x3e\xa4\xd3\xc3\x96\x4b\xa8\xfe\x30\x9b\x21\xc8\x92\x9b\xb4\xfc\x46\x42\x15\xe9\x86\xa7\x36\x4f\x2e\x7a\xee\xf6\x62\x91\x3a\x26\x76\xcb\x6c\x04\x8e\x35\x7e\x06\xa4\x10\x7d\xfb\x33\x1c\x7b\x2e\xc9\xe2\x8d\x33\x79\xad\x5e\xcd\xd8\x7e\xe7\x57\xb7\xee\x2c\x6c\x9e\xfd\xa9\x7b\x72\x16\xed\x2f\xbd\xd4\x62\x74\x5a\xe8\x14\x6f\x2d\xdd\xef\x7e\xf5\x57\xfe\x80\x39\xcd\x54\x3e\x33\xfa\x30\x52\x4d\xab\x23\x75\x0c\x2b\x52\x69\x2d\x80\x0e\x94\xd3\x60\x40\x17\x04\x2a\x47\x5a\x52\xa8\x55\xcb\xc0\x50\xe1\xe1\x24\x64\x40\xd5\xfb\x63\x4a\xa0\xc0\xdf\xcd\x4c\x9c\xe2\xc0\x8b\x30\x17\x95\x76\x33\x0a\x2b\x70\xd0\x3f\xa6\x7f\xe4\x97\x6a\x81\x3f\xba\x15\x11\x3d\xfc\x1c\x6d\xa6\xb5\xb0\x95\xc6\xa5\x6a\xbd\x9a\x16\xf9\x43\x0f\x05\xb5\xca\x2d\x91\x6d\x09\x56\x30\x6b\x48\x3e\xf3\x75\xf7\xda\x75\x0c\x33\x90\xc0\xa2\x1e\xfb\x2e\xb1\x44\x95\x68\x38\x6c\xd5\x94\x0d\xb9\x98\x09\x2c\x5f\xb1\x8d\xc7\x92\x4c\x0d\x6e\x98\x56\x3d\x2a\x1e\xc6\xff\x3a\x9f\x78\xef\x3e\x8e\xc6\xe2\xe3\x51\x10\xd6\x27\xe0\x3c\x8e\xc5\x69\xb4\x3f\x6d\x86\xe5\x63\xd5\xfa\x08\xfc\x1e\x8e\x9a\x51\x1d\x6e\xe1\x20\x1d\x0d\xd3\xa0\x1e\x07\x70\x36\x46\xa2\x66\x40\x86\x6b\x0c\x07\x4f\x47\x23\xa9\xa6\x9a\xae\xa2\xe3\xca\xf1\xb0\x66\x72\xb8\x05\x20\x09\x6d\x5f\xf9\xf2\x15\xb8\x7a\x5f\x55\x50\x20\xd8\x35\xf9\x72\x57\x40\xae\x56\xd5\x81\xe2\x81\x1e\xae\x45\x61\x12\x05\xe2\xcf\x16\xd4\x23\xe4\x0e\xc2\xe6\x04\x46\xaf\x37\x03\x58\xbe\x0a\x48\xed\x20\x06\x25\x00\x42\xe3\x92\xda\x03\xaa\x35\x92\x1a\x93\x89\x7a\x59\xcb\x8d\xc8\x0f\x5c\xbb\x5e\x18\x47\x8f\x33\x32\x5e\xc3\x0d\x84\x8b\x39\x4d\xde\x2a\xdf\x29\xfb\xf5\x48\xf8\x17\x2c\x1d\xd4\x7f\xd2\xf9\x4a\x9c\xf3\x24\xf6\x68\xd8\xc4\xf2\xa8\x84\x5d\xc4\xc3\x25\xda\x54\x64\xe7\x8e\xc0\x78\xe8\x36\x0a\x46\xc3\x24\x20\x28\x20\x7e\x63\xe1\xe7\xd5\xb1\xd6\x58\xa0\xc0\x02\xaa\x18\xc4\xc3\xa8\x8d\xb3\x2d\xf4\x03\xf9\xd6\x6e\xff\x86\x31\x06\xef\x3e\x8a\x94\x9d\x0c\xde\x59\x6f\xb6\xe5\x4c\xbb\x59\x15\x79\x3d\x42\xc3\x4e\x2b\x1d\xd5\xfe\x2a\xa2\xa5\x2a\x48\x6e\x3e\x95\x6b\xec\x1b\x3a\xb8\x0f\xe5\x58\x58\x2c\xa4\x64\x1c\xb3\xc1\x77\xba\xf0\x88\xeb\xb1\xee\x14\xbc\x4c\x82\xa1\x5a\x2b\x22\x7a\x2b\x98\xe5\x5c\x24\x86\xe1\xd1\x1d\xf5\x38\x71\x92\x41\x50\xa0\x06\xf8\x56\xd0\x68\x6b\x5f\x0b\x2e\xe2\xe6\x80\xfb\xfa\x46\x4e\x50\x73\x80\xdc\xa7\x0f\xbc\xf7\xc7\x23\xe2\xbf\xa9\x7d\xe1\x8c\xd9\x22\xb0\x13\x82\x04\x3a\x89\x57\xc6\xd3\x9f\x36\x56\xf5\x0d\x2b\x36\x56\x4d\x12\x66\xff\xeb\x55\xcf\x12\x92\xc9\xe4\xa4\x03\xc4\x4d\x40\xf6\x4e\x49\xb4\x54\x4f\x26\x7c\x16\x83\x0b\x74\xec\xac\x31\xba\xe4\x04\x32\xa3\x87\x97\xeb\xd2\x22\x19\x32\xfc\x2c\x52\x8b\xb9\x1e\xad\xba\x6f\xf1\x8e\xe2\x6d\xea\xe3\x1d\x25\x87\x9f\x33\xd9\xd0\x79\x37\xc1\xa5\x78\x8c\x01\x6d\x7b\x5f\xa1\x94\xeb\x26\x89\x6a\xc3\x9c\x1d\x6b\xd1\x13\x1d\x7c\x87\x21\xf4\x7a\xcb\xe0\xa8\x73\xe9\xba\x0e\xe0\xe5\xb8\x31\x01\xc4\xa2\x7e\xac\xa8\x05\x51\xf3\xcd\x8a\x49\xd0\x42\x6a\x46\x8f\x68\xa0\xd9\x33\xf7\xef\x73\x5f\x05\x87\xac\x8c\x70\x87\xd2\x66\x6d\xff\x21\xa3\x86\xed\x9e\x55\xa2\xae\xdd\x21\xe1\x88\xfa\x20\xd1\x0e\xad\x3a\x91\xc5\xe2\x27\xfc\x2f\x13\xc9\xe2\x9f\xe9\xef\x16\x06\x6c\x37\xa1\x08\xff\x21\x12\x49\xc4\x91\xd6\xac\xf8\x2e\xfc\xa7\x80\x8a\x38\x8b\x35\x10\xdd\xdb\x7f\xb6\xaa\xe5\x63\xa5\x91\x56\x95\x92\xd5\xac\x12\xde\xb1\x9f\x88\xd2\x55\x0b\xf7\x95\x8e\x56\x13\xdb\x75\x2b\x27\x5c\xde\x39\x81\xea\x7e\xb4\xa2\x73\x89\xf7\x28\xc7\x63\x63\x61\x5d\x26\xa7\x33\x1b\xa8\xfc\x38\xed\xc5\x3e\xcc\xaa\xca\x37\x61\x9b\x55\x5b\xe8\xa9\x8f\x57\x9f\xf2\xb4\x33\xad\xc2\xb1\x7a\x1e\x58\x4d\xa3\x33\x40\xf7\xd2\x4d\x0a\x9e\xcf\x0c\x1f\xf9\xb8\x4b\xda\x7d\x9e\xd9\x24\x98\x30\xe5\xa5\xeb\x49\xec\x28\x86\x80\x4f\x50\x9b\xdc\x27\x17\x49\xb4\xc3\x88\xd4\xee\xd7\xb7\xe1\xbf\xe4\x81\x8e\x02\xc5\xbf\x14\x0a\x65\xce\x07\x24\xe1\x4c\x05\xcd\x2f\x58\xdc\x41\xda\x8c\x90\x1e\x9f\x10\x6b\xe0\x70\xb5\x86\xb1\x2d\xe2\x9d\x86\xd9\xf9\xd2\x70\xa4\xe8\x3a\xa3\x29\x0a\x35\xf5\x92\xa2\x17\xbf\x50\x9e\x20\xcb\x64\x56\x67\x7f\x8c\x87\xd2\x19\xb9\x95\xd9\xdd\x85\x94\xdd\x14\x6b\x7a\x39\x44\x31\xeb\x68\xaf\x6c\xa3\xb5\x70\x28\xa2\xc2\x7b\x24\x18\x2c\xc3\x71\xae\x45\x49\x0a\x38\x92\xa8\xbb\x64\x7a\xd9\x4a\x6d\xf1\xb8\x50\xa6\x90\x0d\x39\x35\xd7\x25\x18\xac\x19\x11\xf3\x20\x9e\x6e\x92\xa3\xa2\x40\x7e\x2e\xcd\x70\xbc\xf8\x71\x38\xce\x3f\x00\xed\x28\x55\x6d\xe7\xd1\xed\xee\x83\x1f\xf8\x1b\x45\xa0\x0b\x94\xc9\x01\x01\x44\x98\x74\x41\x0c\x83\x24\x37\xe4\x83\xcc\xda\x0a\x31\xb2\x3e\x26\x36\x1d\x21\x30\x94\xab\x86\xc2\x81\xde\x5f\xc7\xab\xa1\x73\x8b\x29\x03\x10\x99\xbf\x9a\x00\xd8\xc9\x36\x07\xda\xe7\xda\xa4\x2b\xc8\x1b\x0c\x50\x0e\x5b\xf4\xeb\xc1\x08\x18\xfc\x43\x15\xb0\xb7\x05\x97\x7d\x42\x7f\x3b\xc5\xf8\x4f\x49\x1c\x82\x1c\xde\x79\xf3\xe7\xbb\xdb\x57\x4f\x29\xb0\x46\x33\xa2\xf9\xb3\x6d\x3d\x01\x2e\x92\x7e\x07\x87\xf8\xb7\x02\xe3\xe0\xb1\x12\x35\x8a\xd1\x66\x78\x11\x53\xeb\x49\xf1\x10\xc7\x95\x61\x11\x30\x90\xf5\xfd\x74\x47\x53\x91\x33\x14\x3a\xf1\x3c\x9e\xec\xfa\xf8\xa3\x1a\x6b\xc1\x11\x1c\x8a\x4a\xd0\x53\xa8\x78\xe1\xff\x27\x6e\x05\xf8\x3d\x18\x8a\x90\x31\x0d\x55\x38\x50\x1a\x03\x9b\x75\x0c\xbe\x35\x83\x46\x33\x06\x96\x2a\x92\x18\xb7\x04\x8b\xb0\x5b\x67\x5d\x88\xec\x0f\x45\xc3\x28\xaf\xe0\x27\xd3\x2e\x96\x30\xbc\xc9\x69\x1c\x30\x24\xcd\x0e\x39\x66\x64\x3b\xed\xd6\x94\x42\xab\xff\xe4\x94\xb1\xdc\x9a\xdc\x28\xe6\xe4\x18\x6f\x56\x53\xa5\xd4\x36\xe3\xc0\xa2\x80\x8a\x02\x2e\xfa\xcd\x53\x64\xf7\x3b\x1a\x99\xba\x63\x28\xa2\x89\xb8\x3c\xe4\x4f\xd1\x3a\x17\x30\x44\x25\x10\x10\xf4\x48\x9b\xf8\x17\x8d\x76\xc8\x3f\x52\x08\x35\x23\x1f\xfc\x0c\xf0\x27\x75\x84\x59\xab\xad\xbe\xb4\x42\xa5\x78\x24\x46\xa6\x3c\xa8\x54\xd1\x25\x05\x96\xef\xb5\xe0\x3f\x70\x46\xc8\xea\x05\x80\x1e\x40\x74\x60\x02\x38\xa3\x03\x03\x01\xc0\x36\x45\x34\xb1\x2b\x8c\xc4\x3c\xa7\x08\x06\x39\x52\xad\xd7\x71\xd5\x81\x5f\xe6\x85\x8f\x6a\x15\xab\x91\x21\x10\x63\x80\xf5\x2b\x47\x7a\x34\x70\x41\xc6\x4d\x0b\x67\xcb\x51\xad\x44\x7e\xab\x19\x6f\x2f\x05\x43\xc4\x44\x63\xbf\x4e\x0f\xec\x10\x17\x81\x45\x5b\x55\x0a\x72\x6c\xf1\x20\x4c\x11\x96\xf2\xc0\x9b\x6a\xf2\x6f\xed\xb3\x60\x8a\x2a\xec\x46\x2c\xa2\xfa\xb8\xa2\x03\x93\x2e\x14\x3f\x2b\x07\x8d\x74\xa1\x8b\x2f\x32\x46\x89\x5f\xe3\x5b\x17\x87\x00\x6c\xb1\xca\x14\x08\xf2\x5a\x1a\xd5\x2b\xb0\x99\x58\xda\xac\xd2\x67\x6b\x97\xa4\x09\x5e\xe6\xda\x04\x10\x2b\x46\x59\x39\x5a\x12\x05\xa7\x8a\xd5\x06\x88\x06\x4c\x31\xdf\x0c\xbc\x1f\x27\xbc\x87\x22\xb1\x95\x42\x91\x0b\x4c\x67\xe6\x8e\x56\xed\xd3\x17\xd8\x67\xa5\x53\xab\xeb\x68\x3e\xd3\x0a\x9c\x33\x46\x65\x1e\x2c\xed\x33\x72\x1e\xf0\x57\x80\x37\x48\x20\x79\xab\x07\x6c\xca\xa8\x7c\xad\xc9\x43\x13\x17\xc6\x8b\x13\xb4\xd7\x20\xdf\xed\xcf\xc7\x63\xa1\x74\x43\x91\xdc\xd6\xef\x4a\x81\x8a\x9f\x05\xea\x43\x05\xba\x5d\x75\xa1\xd6\x50\xff\x30\xc1\xec\x43\x52\xe4\xd0\x45\x3e\x71\x52\xc4\x42\xb5\x48\xaf\x0e\x95\xd1\x6d\xe9\x73\x80\xdc\x42\xc8\x47\xef\x9d\x7a\x0a\x74\x88\x1a\x12\xb9\xb7\x11\xa2\x53\x1e\xc5\x27\x06\xd0\x4e\x48\x67\x32\xc0\xc1\x59\x27\xa9\x5f\x37\x7a\xb2\xd4\x8b\xae\x42\x42\xac\x2a\x93\x1e\x13\x44\x33\x1a\x38\x1e\xc4\x5d\xb7\x5e\x12\x82\x09\x97\x45\x89\x55\x0a\x6a\x61\x54\x1f\xdc\x3e\x90\x94\x20\xb4\xe8\xab\xa7\x81\xd0\xa2\x7e\xaf\x6e\xf8\xe0\x56\x4a\xe3\xa3\x56\xa7\x4c\xec\xc4\xcc\x6f\xe8\x9d\xc0\x06\x49\x15\x10\x81\x7a\x26\xf4\x82\x2f\x52\x6f\xa0\x7f\x0a\xf0\x43\x35\x60\x6e\x83\xd1\xa8\x19\x91\x86\x0f\x0e\x49\x12\x01\xa1\x46\xc5\x09\x91\x6c\xa7\x13\x40\x66\x85\xec\x4c\xac\x14\x56\x8f\x84\xd5\xba\x41\x7a\x68\x04\x28\x60\x93\xa9\x7d\x3a\x6a\x51\x76\x77\x9e\x1e\x76\x1d\xe4\x25\x1c\xaf\xa6\x8c\xe6\xbf\x15\xcf\x60\x57\xa4\x1b\x24\x05\x98\x17\x08\xf7\x05\xf6\x01\xf7\x02\xf6\xc0\xba\x5d\xb0\xd0\x8c\x85\x72\x8e\xc6\x25\xf1\xc6\x24\xfc\x7c\x97\xe4\x34\xca\x32\x48\x5f\x0f\xf0\xf9\xb7\x36\x99\x86\x49\xe2\x0b\x49\x6c\x16\x39\x4d\x5a\x43\x80\x52\x44\xcd\xf8\x4f\xc6\x2e\xeb\xd4\x4a\x50\x0f\xf5\xa9\xf9\x9d\xc4\xe9\x54\xb3\x3e\x34\xde\x3e\x3d\xda\x2d\x60\x8b\xd8\xf5\x27\x39\xd5\x0b\x8a\xc7\x1c\xc8\xe5\x35\x55\xa1\xe4\x0f\xb2\xcb\x50\x64\xe4\x74\x42\x0a\x68\x18\xed\xe2\xde\x37\xd4\xa2\x60\x90\xe5\x2f\xd7\xb6\x26\x4f\xea\xaf\x42\xdf\xd9\xe1\x78\x9a\xa8\x13\xbd\x2f\xa1\xca\xe9\xfa\xe8\x5e\xba\xbd\xf1\xfc\x2b\xfd\x8d\xf3\x4a\x75\xe6\x6f\x61\xe0\x88\xfa\x08\x74\x31\xb2\xbc\x81\x75\x2a\x25\x7c\x75\x42\x7f\x65\x97\x1e\xab\x68\x20\xc3\x89\x5b\x65\x78\x8a\xb1\xd8\x94\x8a\xc0\x67\xc1\x94\x81\x03\x6f\x96\xfc\x56\x4c\xea\x83\xa9\x9b\x36\xb4\x66\xf3\x7b\x70\xf9\x6e\xe7\x3b\x40\xf7\x1a\xcc\x4e\xd5\x7a\x8c\x0d\xf3\x63\xda\x75\xc5\xbc\x04\xe2\xcb\xe3\x8d\x27\x0f\x88\xbd\xdb\x61\xc8\x20\xe4\x26\x98\xfc\xc4\x6a\x43\xab\x7d\x9e\x59\x7a\xe5\x1d\x9a\x81\x6b\x17\x1f\xf8\x80\x6d\x9f\x3d\xd9\xf9\xe5\x02\x62\x4b\x66\x8e\x59\x98\x5e\xd3\x42\xd7\x99\x2c\xb0\xb3\x74\x7c\x74\x8b\x8c\x1c\x46\xea\x36\x8d\x08\x1a\x58\x62\x75\x16\x5b\x18\xa6\xd4\xa8\x01\x67\xa6\x33\x9f\x09\x58\xe7\xfc\x39\x3c\xdc\x4e\x77\x19\xd4\xf2\xfb\xe5\xf6\xb4\x0d\x61\x80\xcd\x90\x1f\xe0\xb9\x0d\x91\x15\xac\x44\x70\xca\x90\xb0\x47\xa4\x5a\x65\x14\xec\x55\xb9\x5a\x1f\x8e\x0d\xb1\xab\xff\x7d\xf2\x72\x4a\xba\x71\xae\x15\x4c\x44\xe9\x40\x80\xac\x78\x99\xb4\x8e\x48\xf1\x45\x0b\xbe\x07\x59\x8b\x0f\x10\x6a\x4f\x30\xd4\x4a\x53\x94\x41\x86\x90\x7d\x05\xaa\x21\x24\x0f\x76\x1a\x09\x3f\x66\x5b\xcd\x0c\x0c\xea\x21\x21\xed\x31\x2a\xd7\x72\x12\xf2\x68\xb0\x5e\xaf\x0a\xd0\x47\xf1\x93\x24\x62\x0a\xbf\x23\xb4\xa2\xdb\x46\x62\x34\x04\x94\xe8\x1f\xb7\xa0\x2a\x18\xda\xcd\xe9\xfb\xb8\x51\x3a\x16\x69\x38\x54\xdc\x5b\x09\xec\x33\xa1\x77\x13\x91\xde\x00\x18\x84\x57\x00\xa2\x81\xf0\xb6\x3b\xaf\x14\xd9\x86\x84\xd6\x42\xdb\x62\xd8\xeb\x46\x53\x9f\xb9\x1c\xcd\xa1\xdb\xd0\x2e\x29\x8c\x0f\x9d\xd3\x75\xbf\xe3\xea\x9e\x1f\x69\x4c\x1f\x33\xb2\x7b\x2b\x5f\x77\xd5\x0e\x26\xda\xce\xc0\x83\xa8\x13\x65\xfb\x46\x4b\x1d\x26\x29\x5b\xb2\xce\xeb\x9c\xf6\x8c\xf2\x5a\x61\xfd\x3b\xaa\x2e\x6e\xe1\x1b\x47\xd9\xc2\x01\xcc\xc1\x28\xaa\x19\xdb\x66\xea\xde\x05\x4e\x85\x44\x5e\x18\x02\xdc\x01\x86\x49\xc8\x86\x22\x82\x6e\x4c\x61\x4e\x75\x3e\x16\x15\x8c\xa5\xc1\xda\x96\xc6\xcd\xb7\x4a\xe6\xd5\x1e\x43\x73\x4f\x8c\x02\x20\xd5\xb6\xf4\xb2\xcb\x1b\x6b\x5f\xf3\xeb\x2d\x5e\xbd\x04\x53\xe9\x6c\x3c\x81\x49\x3d\xed\x5e\x7d\x89\x99\x58\xb2\xe5\x03\x74\x24\x52\xb4\x10\xa1\x04\x96\x03\x80\x34\x8b\x01\xd0\xd3\x9c\x2f\xd7\x1c\x30\x60\x56\x60\x84\x22\xd7\xb1\x2f\xa2\x1b\x6b\x72\x3d\xb7\xf7\x28\x4c\x54\xa5\xf5\x36\xb6\x6d\x57\xcd\xab\x31\x16\x27\x29\xde\xed\xe8\xb3\xba\xf1\x64\x12\xd3\xe9\xdf\xba\x42\xda\xe8\xc7\x2a\xc4\x36\x7f\x9e\xd8\x93\x57\x51\x92\x62\xe4\xd6\xc5\xf3\x4d\x9b\x55\xe4\xbf\x82\xbd\x9f\xbe\x7e\x14\x78\xe7\x09\xcb\x41\xf8\xd3\xdf\x1d\x05\x4e\x78\xef\xa7\xbf\x3f\x9a\x90\x3b\xb0\x5f\xb5\x34\x1c\x1e\x8b\x32\xf5\xa9\x9a\x82\x25\x8d\x53\xdc\x02\x61\x7b\xe6\x9c\x79\x45\x4b\x5f\x1f\x9f\xc3\xc2\xdf\xbf\x91\x29\x60\xe2\x63\xf2\xe1\xe7\xd1\x9e\x8a\x06\xc8\xd2\x9e\x7a\x6b\xac\x24\x6b\x91\x30\x7d\xca\x2e\x80\x94\xa3\x9d\x2b\x2d\x7e\xa6\x7f\x99\xe9\xff\x2b\x8a\x01\x7b\x69\xe6\x9f\xa9\x4a\x2a\x52\x8a\xa1\x75\x36\xf9\x83\x4d\x11\x31\x5a\xf2\xc7\x78\x08\xb2\x08\x90\x5b\x86\x37\x92\x2e\x54\xfa\x37\x3d\xc8\xd8\x38\x27\x73\x08\xb3\xeb\xa2\x9c\x25\x7b\x2e\xed\xa5\x1f\xc5\xed\x85\x99\xf5\xf6\x57\xd6\xe1\xe0\x42\x35\x42\x06\xb2\xe7\xaf\x0c\x06\xd9\x55\x6b\x46\xb4\xee\x5c\xe5\x63\xfa\xe1\x15\xf5\x6b\xf5\x2e\x66\xfd\x5a\x98\xf5\x6e\x7b\x85\x91\x36\xec\xff\xfb\xad\xb7\x91\xb4\x01\xf4\x27\xae\x7e\xb5\x82\xa8\x07\xc8\xb4\x47\x6f\x04\xfd\x7a\x8b\x10\xcb\xd9\x0e\x1e\x96\xb4\xa0\x7e\xfc\xc6\x36\x44\x5b\x02\x50\xd2\x8a\x58\xc9\x2b\xbc\x6b\x04\x15\xa0\xe5\x08\x2e\x6a\x11\xeb\x7e\x5b\x07\x20\x8f\xa5\xc4\x15\x7d\x6d\xa2\xa6\x75\xdf\x2a\xdd\x2a\xa5\x0b\x7a\x4c\x57\xde\x35\x65\x4c\x7d\xa9\x8f\x43\xd6\xf1\x49\x4a\x54\xc2\x70\x95\x9f\x88\xb4\x22\x8e\x87\xff\x20\x40\x04\x28\x84\xb2\x10\x8b\x31\xe4\x0a\x1d\xeb\xf8\xe6\x1d\x59\xaa\x35\xa7\x42\x3a\x52\xd1\xce\xaa\x31\xe6\x6b\x52\xd4\x00\x40\x16\x2e\x72\x5a\x61\x8f\x1d\x91\xb7\x2a\x0c\x2b\xe8\x96\xc3\xd4\xe3\xa6\x2d\x61\xac\x6c\xcd\x7c\xef\x83\xa0\x97\x1a\x1e\x5f\x9f\x7b\xe0\x72\x83\xad\x74\xc8\xbb\xd7\x96\xb6\x16\xbf\x43\x9f\x2c\xff\x92\x63\xf0\x9c\xb9\x71\x81\xe8\xe3\x44\x0f\xe7\x14\x49\x6a\x2f\x7b\x98\x12\x25\x98\x6d\x81\xfd\x3c\x2d\xc0\x9c\xf6\x7c\x4f\x4e\xc3\x04\xef\xe0\xab\x99\xb9\xc0\x51\xf8\xe4\xf8\xa8\x5d\xfb\x64\x5a\x5c\x93\x37\x1a\xe3\x9c\xa9\x87\xbf\x83\xfb\xa5\xd5\x16\x12\xdb\x46\xd8\x4c\xab\xe5\x6a\x23\x14\x82\x7b\xd8\xfa\xad\xe0\xc2\x34\x0d\xcb\xa3\x48\x0d\x0c\x73\xf9\x19\xab\x59\x44\xbb\x82\x08\x8b\x8a\x8c\x30\x40\x95\x21\x94\x7f\x96\x53\xb7\x02\xa7\x01\xb9\x58\xab\xae\xfa\x44\x0d\x7c\x56\x60\x13\x94\x2b\x01\xe7\xdb\xa3\x18\x10\x4e\x35\x2a\xd9\xb2\x7a\xe1\xee\xea\x97\x5b\x6b\xd3\xf9\x50\xbc\x83\xbf\xae\x7d\x41\xd7\xba\xe3\xa9\xa3\x6b\x72\x68\x55\x6e\xd7\xbd\x4c\x92\x76\x4f\xf8\x4a\x43\x51\x47\xb5\xfb\xc3\xe0\x7f\x8b\xce\x18\x1d\xab\x5f\xd1\xb5\xe7\xad\x39\xf6\x3b\x59\xa2\x18\xfd\x4f\x5a\xb5\x14\x53\x05\x9c\xef\x7e\x73\x0d\x83\x02\xee\xcc\xd2\x94\x66\xdd\xcc\x8a\x76\x7e\x27\xa9\x0b\x64\x04\xb8\xb5\x34\xd6\x63\x61\x41\x0b\x68\x8b\x94\x91\xb0\xc4\x65\x20\x11\x95\x43\x14\x95\x70\x52\xa4\xed\x1d\x8d\x60\xc3\x94\x71\x91\xd5\x82\xc7\x23\xa0\x44\xdc\x3a\xe6\x1d\xb1\xdf\x2f\x2c\x7e\x26\x49\x8f\x73\x17\x13\x6f\x4a\x72\xc7\x98\xe2\xbc\xd9\x4e\x06\x8e\xed\x85\x0b\x6e\xf4\xd0\x0b\x4a\xf5\x6d\xb1\x39\x40\xb8\x0f\x50\xb7\x07\x90\xd7\xa9\x08\x11\xff\x57\xfa\xc1\xa4\x5c\xd6\x9e\x05\xe6\xdf\xbc\xa1\x44\x0b\x19\x61\x90\x31\x60\x13\x4f\xd4\x1c\x89\x88\x69\xaa\xc8\xb5\x92\xf0\x2d\xf3\x26\x1a\x7b\xd5\x35\x42\x7f\xc3\x91\x80\x0a\xea\xfb\xef\xf5\x77\x69\x9d\x5a\x12\x6e\x88\x3b\xe1\x2f\xff\x58\xe3\x50\xfb\x7f\x01\x1b\x27\x13\x08\x87\x4a\xf6\x7d\x51\xdc\x58\xbb\xb2\x75\xef\x91\x53\x9a\xa3\x3b\x33\xc5\xac\xc7\x73\xad\xa4\x5e\xbe\x80\xeb\x02\x2e\xac\x06\xa0\x15\x4d\x43\x39\x8a\xf1\x67\xbe\xba\x6c\x03\x01\xae\x25\x08\xd3\xe8\x06\x25\x6b\x0a\x70\x4d\xb9\xd5\xec\x05\x22\xc1\x70\x9a\x5f\xb1\x70\x7b\x44\x5c\x53\x30\x62\xd0\xbb\x24\xc1\x79\x39\xa8\x66\x08\x63\xa6\x41\x1d\xe8\xc4\xed\x02\xd7\x8f\xf6\x4c\x8a\x0e\x78\x1b\xfe\x66\xcb\x96\x3f\x7e\xad\xb1\x66\xc8\xa0\xd2\x8a\x34\xe7\x88\x4e\x64\x50\x89\x6c\x95\xa8\xca\x90\x08\x51\x35\xb1\x6a\x02\xd4\x28\x22\xef\x3e\xd2\xb4\x23\x3b\x0a\x34\x11\x33\x1c\xf2\x57\x3c\x8b\x94\x3c\x07\xa9\x6a\xa3\x19\x8f\xa0\x72\xfa\xb5\xa0\xa1\x96\x74\x18\x7e\x8f\x06\xf8\xc4\x2d\x02\x0c\x03\xd1\x1d\x8b\x89\x69\x56\x3d\xc0\xe5\x5f\x22\x4f\x49\x5a\x1f\xc6\xae\x23\x99\x29\xa0\xf6\x64\x28\x0a\x04\xed\x10\x1e\xc7\x59\x06\x01\x74\xc2\x6a\x88\xfc\xd2\x76\xd3\xd6\xbe\xb4\x57\x6b\x9a\x8a\xa4\x5a\x7f\xad\xe6\x9c\xf4\xee\x49\x79\x7f\x2f\xff\x44\x09\x96\xbf\x50\x5c\xc2\x65\x27\x37\x35\x79\x72\x75\x67\x66\x29\xb6\x6c\xd1\xda\xdb\xbe\x69\x80\x2c\x0c\x73\xe9\x55\x2f\x22\x61\x35\x9c\xa1\x13\x84\xf8\xad\xba\x1c\x68\x6a\x4e\x4c\x00\x9f\x89\x92\x0a\x96\x46\x21\xbb\x1c\x08\x8d\xed\xde\xda\xa0\x2d\x47\x2c\x04\x64\x3a\x04\x50\x67\x9d\x5f\xf9\xd7\xbd\x95\x57\x99\x28\x24\x68\x53\xb0\xac\xe0\xa4\x4f\xa7\x8f\x7c\xa0\x2c\xcc\x23\xca\x0d\x4d\x8f\x87\x6c\xc1\x41\x33\x1e\x02\xa1\x3d\xe5\xb3\x82\xe5\xce\xe1\xdf\xbe\x79\x3a\x19\x0b\xba\xa7\xb6\xc9\x82\xe9\xad\x71\xf2\x81\x2a\xc5\xbd\xfc\x98\x04\xcb\x46\x3a\x15\x89\x3d\xbc\xb8\x04\x07\xad\x24\xd2\x3c\xe6\x06\x16\xdd\x8e\x37\xa8\x22\x25\xab\x99\xcf\x74\x61\xc9\x5d\xee\xa4\xd1\xca\x81\x57\x1b\xf9\x39\x1a\xdf\x32\x76\x8e\x41\xce\xe0\xe2\x0f\x9b\xe7\x4f\x39\xc8\x67\x2d\x4e\x60\xab\xab\x73\xee\x13\x7b\x18\xea\x32\xea\x5b\xdb\xae\xa1\xe4\xe5\x97\x92\x11\xc7\xf1\xbf\x19\xb0\x5d\xbf\xed\xcf\xd6\x2a\x75\x2f\xdd\x0e\x5e\xf1\x1e\xa8\x7b\xd5\x5d\x9a\x08\x53\x93\xfc\x74\xa6\xf3\xd7\xe7\xf6\x77\xfd\xfe\x8a\x34\x56\x62\x84\x92\x95\x67\x33\x87\xe3\xce\x6f\xde\x94\x53\xde\x86\x93\xed\x7d\x13\xf0\xbf\xfd\x63\x63\xfb\x2b\x15\xf4\x5e\xcd\x87\xf6\xb3\x98\x65\x16\xcc\xe2\x75\xf3\x16\x2e\x1b\xf4\xab\x76\xc1\x23\xf1\x56\xc3\x24\x58\xf4\xdc\x07\x91\x38\x3c\x78\x0b\x4d\x36\x9e\x3d\x5b\x27\x3d\x7e\xf7\xe7\x9f\x37\x9e\x3e\x92\xb4\xf9\xe2\x4b\x29\x8e\x43\x3d\x5a\x97\xc7\xac\xce\x6e\xcd\x60\x56\x62\x71\xce\xcb\x7d\x92\xcd\x5e\x87\x7c\x81\xce\x82\xd0\x52\x4f\x8f\x29\xa9\x8b\x3b\xbf\x7d\x99\xde\x6e\x56\x59\x47\x75\x58\xcb\xed\x3f\x36\xaa\xb8\x4e\x07\x55\xb5\xb8\x95\xbf\x2c\x4a\xf6\xca\xa9\xe3\x04\x2a\xf5\x9c\x60\x0f\x61\x4c\x4e\x71\x7b\x79\xeb\xde\xf7\x9d\x5f\x2e\xfc\x4f\x04\xb0\xbc\x21\xf5\x5f\xac\x5d\xc9\x62\x85\xf1\xea\xb1\x6a\xf1\xcf\xf0\x1f\xfa\x6b\x60\x3c\xaa\x95\xf1\x99\x15\xfc\x12\x78\x19\xad\xd1\xd3\xd4\x06\xe2\x25\x41\x48\x71\x11\xf6\xe2\xcb\x25\x29\x04\xb4\xb1\x28\x0e\xbd\x80\xab\x0b\xa7\xbb\x57\x9f\xd0\xfb\xa2\x28\xe3\x6c\xdd\x3a\xdd\xbd\xf8\x10\x31\xb9\xbd\x88\xca\xc7\x9f\xbf\xc0\x08\x4f\xc2\x7c\x9d\x5a\xbf\x3b\x33\x69\xce\x25\xf5\x2f\x27\x72\xb8\xda\x4c\x30\xdd\xf7\x08\x29\x56\x3b\x67\xbe\x5e\xb7\x9f\xf1\x76\xdf\x0a\xd3\x75\xbd\x77\xf9\xe9\x9b\x88\x3f\x52\xe4\x09\x3f\x0e\x24\x27\xe4\x19\x89\xec\x2b\xca\xef\x90\x21\x55\x8c\x86\xeb\x97\x63\x45\xba\x49\x9e\xa3\xd3\xca\xdb\x7a\x99\xf5\xbc\x28\xab\xa3\xc2\xeb\xe6\xba\xbc\x02\x3a\x9f\xa5\x9c\xd4\x01\xbd\xd7\xe4\xce\x06\x87\xc0\x2a\x15\x82\xa0\x48\x07\xe9\x9f\x0c\x5a\x94\x21\xf9\x82\xb7\x4a\xbc\xda\xf8\x9a\x0e\x55\xa2\x53\x88\xcd\x96\xd8\x7c\xa5\x34\x1f\xce\xf4\x55\x99\xbc\x79\xe3\xae\x91\x8a\x68\xb4\xe0\xec\x87\xe0\xe4\x88\x65\x40\x31\x9d\x7a\x39\x2a\xbd\xce\xbc\xdd\x38\x32\x9f\x5a\x0b\x1a\x31\xaf\xc9\xd2\x06\x0a\xeb\x22\x6c\x0c\x04\xc2\xe5\x03\xdf\x57\x8e\x9a\x69\x58\x05\x1e\x57\x6f\xb3\xef\x0f\x21\xe9\x20\xdc\x7c\x11\x8c\xe8\x66\x7c\x73\x9e\xc0\xe7\x20\x4e\xe2\x63\x0e\xa7\x20\x20\x3d\xbd\x8a\x26\x61\x15\x3d\xbd\x4e\xe4\x3f\xbd\xaf\x7e\x0f\xb0\x47\x56\xe2\x3f\xda\x6a\x00\xac\xf7\x94\x70\xf9\x7c\x0d\x5f\x7f\xf8\x01\x7a\x8c\xab\xa8\xb2\x02\xe4\xc3\x90\x33\x49\x11\x30\x6c\xeb\xc5\x5a\x2f\x18\x5c\x3d\xb8\xda\x1f\xf4\x01\x69\xd5\xc5\x7c\x59\xfc\x44\xfd\x65\x40\x47\xe3\xf8\x58\x52\xfc\x73\x34\x44\x7f\x98\xef\x23\xc0\x28\x52\x11\xbd\x2f\xcd\x37\x32\xbf\x79\xa0\x41\x40\xdc\xaf\x96\x4b\x7a\x01\x3b\xd7\x9f\x75\xaf\xdd\xf7\x97\x51\x9c\xfa\x35\xd4\x87\xf4\x3b\x18\x94\xdf\x06\x10\xc3\x7d\xe4\x79\xa9\xa2\x0e\x13\x97\xb0\x9f\x4c\x6b\x08\x8b\x8f\xf5\x89\xd8\xa3\x5a\xc5\xef\x22\x1a\xed\x46\x28\x82\x25\x6a\xa1\x8d\x16\x76\xa2\x95\x46\x03\xd6\x58\x70\xdd\xe5\xc9\x3a\x9d\xb9\x4f\x97\x8a\xcf\x8c\x87\x39\xa8\xb4\x63\xcb\x8f\xd9\x06\x4e\x73\x85\xec\xf7\xae\xd2\xe3\xb5\xfd\x97\xb8\x7e\x5b\x7a\x3c\xdd\x6f\x58\x39\x8e\x7c\x40\xc5\x0c\xb1\x3b\x7b\xa3\xb3\xf6\xa3\xbf\x37\x78\x3c\xf8\x82\x90\x97\x47\xf1\x03\x2c\x62\x92\x46\x63\xd6\x74\xd1\x1e\x81\xa1\x62\xf8\x90\x31\x5d\x45\x68\xae\xc6\x47\xff\xa0\x9c\xaa\xb8\xb0\xe8\xc1\x68\x60\x3b\xb7\x16\xb6\xa7\xef\x72\xcb\xf9\xec\x8b\xae\xec\x54\xa4\xe7\xa5\xa5\xb2\x5c\x74\xfc\x3c\x41\x6f\x70\x9e\xca\xbf\x57\x49\xd4\x11\xf2\x34\x84\xbb\xce\xee\x48\x6c\x24\xc7\x00\x9e\xf1\x51\xd2\x36\x44\x13\xae\x5f\x00\x88\x1f\x16\x0e\xb0\x76\xd2\x59\x1e\xb6\x17\x50\xd0\x5d\xd4\xec\xb1\x40\x04\x53\x12\x18\x67\xa5\x6a\xd5\x91\xd1\x74\x3c\xc2\xff\xf6\x6b\x49\x4f\xcb\x6d\x89\x97\x42\x98\x14\x44\x0e\x0a\x7e\x43\x3e\xef\x31\x79\xf8\xff\x4c\xe2\xd7\x29\x7a\x35\x57\x56\xd9\xb4\x2b\x8d\xd0\x22\x09\x7b\xbe\x43\x7b\x18\x6c\x40\xd9\xbe\xe8\x15\xee\x1c\x7e\x3c\xdb\x38\x8f\x37\x49\x27\xd0\xd5\x51\x26\x11\xfc\x91\x26\x7a\x84\x41\x82\x8f\xc2\x31\x3c\x9e\x83\x08\xf3\x46\xdf\x16\x50\xf3\x1c\x35\xab\xe5\x22\x3f\x63\xd0\x1f\x96\x5e\x46\x50\x15\x0e\x5a\x3f\xfa\xad\x00\xef\xac\x72\x10\x41\xe1\xda\xf2\x73\x91\x6b\xec\xbf\x30\x60\xf1\xbf\x83\xff\xc2\x13\x0c\xff\x54\x81\x7c\x7e\xfe\xdf\x4a\x89\x36\xcc\x0e\x22\x4d\xf2\xdb\x7b\xcd\x16\xb2\xc9\x91\x8f\xa5\x69\x9c\x3d\x55\xb3\x30\x8b\x14\x02\x0e\x62\xd9\xd2\x3b\x69\x10\xd1\x5d\xbc\x91\x06\x9c\xb3\x95\x1c\x20\x9b\x55\xb8\xa7\xf1\x42\x32\xed\x54\x42\x72\xc7\xfc\x0b\x7a\x46\x74\xce\x3d\xda\xbe\xfc\xac\x73\xed\x61\xe7\x89\x45\xa1\x91\x17\xe0\xdc\xe7\xa8\x07\x4b\x38\x26\xb1\x11\xdb\xd9\x3c\x8c\xdd\x49\xb4\x24\x79\x17\x70\x36\x2a\x86\xde\xa2\xcb\x3c\xb1\x66\x5d\x40\xa8\x50\x4c\x8b\x87\xf8\x5f\x74\x11\xff\x38\x1a\x69\xd5\xc2\x66\xf0\xb1\x5e\xa7\x0c\xb8\xbb\x25\xf2\x91\xd5\x6a\x4c\xf8\x69\x69\x60\xa1\xb8\x25\xcb\x1d\x32\x20\x86\xc4\x38\xf6\x36\x23\xd4\x67\x46\x95\x81\x6c\x1f\xcc\xc3\x24\xc0\xc4\xec\xe7\x5a\x46\xcb\x42\x14\xc3\xe9\xd6\xda\x54\x19\x01\xa9\x54\xf3\xc6\x40\x1b\x6e\x46\x00\x97\x2e\xec\x4b\x4e\xff\xca\xae\x7c\x88\xff\x0d\x78\x89\x30\x06\x30\x0b\xcb\xd9\x57\x2a\x45\xb3\x66\x96\x13\x2c\xc3\x30\x55\x53\xc3\x21\xff\x7c\x3b\x0c\x60\xc0\x39\x02\xf5\x64\xd8\x33\x36\x62\x50\xde\xf3\x9b\x59\x20\x65\xc4\xca\xbe\x2b\x69\x52\x0c\xe9\x34\x03\xfa\x6d\x5e\x07\x2b\x40\x30\xa0\xfc\xf0\x6e\x7a\x79\x0c\x4c\x52\xe9\xbd\x97\x55\x82\xf2\xbc\xdb\x40\x8f\xc4\xda\x30\x8d\xb7\x56\x96\xf3\xb9\xce\xe4\x2c\x0a\x27\x4e\x2f\x2b\xf2\xdc\x97\x23\xed\xcc\xe5\xe5\xcd\xf1\xb3\x6b\xf4\x1f\xc3\xef\x00\x69\x10\x3f\x15\xa6\x50\x7c\xaf\x0a\xee\xa8\x0e\x93\x6d\x8b\x83\x87\xd9\xdf\x3a\x6e\x8e\x84\xf5\xea\x5f\x2c\xfd\xda\x30\xfa\x10\xec\x6b\x8a\x8b\x19\x87\x43\x50\x8d\x24\x67\xab\x88\x54\x89\xb9\x55\x27\x1c\x51\x59\x6b\x2e\x7b\xcf\xef\xe9\x97\x4d\x54\x6e\xc5\x2f\xac\x7c\xa3\x99\x34\x16\x3e\x13\x40\x66\x52\x96\x13\x57\x74\xec\x94\x68\x7b\xf2\x60\x6d\xc1\x72\xc5\x0e\xb6\xe2\x3a\x5a\xbe\xce\x4b\x6d\xb2\xda\x39\xfd\x8c\x02\xe1\xac\x3c\xfd\x28\xc3\xce\xf7\x4b\xb4\x9f\x3b\x88\xcc\x61\xb6\x65\x12\x5c\x6f\x49\x31\x4a\xcb\x4c\x3c\x08\x52\xed\xbd\x49\x5e\x6b\xb6\xb4\x9e\xbf\x10\x9c\xd2\x45\xa5\x4d\xb4\x24\x74\x43\x92\x25\x1b\x77\x6e\x60\xa0\x0e\x07\xf1\xc0\x7b\x9d\x35\x4f\x53\x61\xad\xe4\x55\x7b\xe9\x60\xd1\x3a\x2b\xe8\x4b\xb5\xab\xd5\xcb\x2e\x9c\x93\xcf\x06\x53\x93\xb0\x47\x7b\x6e\x77\xc6\xdf\xbd\x5f\xa3\xbf\xeb\x41\x5a\x29\xf6\xae\x1e\xd5\x31\x32\xc5\x92\x1b\x91\x56\x4f\xb0\x51\x51\x59\x51\x0c\x59\x7d\x4d\xd2\x08\x60\x29\x8a\x22\x68\x78\x79\x8d\x2f\x56\x60\xec\x95\x23\x10\xed\x35\x1f\xc3\x28\xc1\x56\x6c\xef\x0b\xfb\x64\x79\x23\xa5\x18\x32\x44\x9e\x83\x30\x3c\x4a\x15\xa0\xd8\x46\x54\x9e\xd0\xcd\xdd\xc0\x70\x9c\x3a\x88\x09\xc3\xc0\xd2\x68\xd3\x8d\xdf\xa4\x8d\x3c\x79\xd4\x3a\x3f\x44\xab\x97\x48\x61\x69\x8d\x1c\xa4\x08\x3c\x61\xb4\x5f\x52\xe4\x2c\x31\x61\x57\x93\xdc\xbb\xdf\x92\xb0\xc2\x63\xc4\x74\xf2\x55\xc1\xcf\x25\xe4\xb4\xa5\x6e\xa6\x5e\x4f\x33\xc0\x95\x60\xeb\xb6\xd4\xb3\x0b\xbd\x47\xe9\xe6\x31\x52\xf9\x8b\x14\xb5\xb3\x65\x1b\x7c\x28\xd0\x72\xad\x31\x8e\xf0\xf4\x96\x31\xab\x42\xd8\x79\x5a\x65\xb2\xec\x55\x37\x9b\x20\xd2\x6f\xa3\x4f\x6a\x53\x1f\xa5\x9c\x41\xbd\x4d\xdf\xf2\x04\xf2\xb8\x69\x3c\x4a\x0e\x59\x5f\x83\xb7\xe5\xeb\x0e\x95\x2c\xdb\x1a\x31\x9f\x84\xae\x26\xd8\x86\xe2\x57\x1c\xf1\xdf\x0a\x3d\xf4\x59\x1a\x0f\xa5\x83\xb7\x63\xc7\xc1\x4d\xa5\x5b\xff\x37\x33\x24\x8e\xf3\xcb\x5f\xc4\xec\xda\xf5\xd4\x68\x1a\x41\x9b\x22\x2f\xf8\xa5\x74\xdb\xcd\x7c\x90\xbe\xd3\x0c\x2d\x5a\x4d\x0f\x31\x99\x0c\x18\x68\x47\x1e\xf2\x16\x5e\x58\x0b\xbc\xfb\xbc\xd1\x48\x36\x2a\xb5\x9f\x3b\x25\x4e\xb0\x65\x32\x94\x36\xe8\xed\x1c\x7e\x40\xb8\xe8\x3d\x98\xa3\xdf\x49\xd9\x78\x32\xd9\xb9\x70\x83\x78\x0a\x79\x48\xe6\x9f\x36\x0a\x44\xdd\x71\x56\xd2\x28\x65\x4d\x90\x83\xe1\xa4\xb2\x91\xab\x59\x54\x3a\xcc\xd6\xf3\xe3\x39\x8b\x9b\x33\x4f\x59\x55\xa1\xf2\x37\x49\xde\xaf\xcd\xcb\xcf\x30\x67\x1f\x65\x5c\xf3\x5e\x17\x62\x41\x51\x65\xb7\xb8\x40\xac\xd3\xb2\xca\x6f\xfd\x85\x7a\x51\xc3\x70\x70\x6e\xcb\x73\xdc\xb2\x9b\xdf\xf4\x6b\x6a\xf9\x1b\xf8\xaf\xd7\xd7\x27\xcd\x1a\xf3\x32\x87\xff\x34\x78\x24\xeb\x08\x42\xcf\x12\xcf\xd8\x7a\xf8\xad\x7b\x8f\x37\x7f\x78\xa8\x9e\xe7\xbc\x21\x3e\x22\xed\x95\x9c\xf8\x2f\x2b\xc1\x93\x5a\x1a\x93\xcc\x00\x3d\x41\x7a\x25\xdf\xb5\x78\x05\xae\x67\x0e\xb0\xb5\x13\xfe\xd5\xee\xc3\xda\xb6\x09\x29\xeb\x91\xfd\xd5\x4a\xd0\x25\x36\x88\xbb\xdb\x27\xcf\x6d\xbc\xbc\xc1\xa1\xee\xbf\x31\xb9\x6b\xcf\xf1\x68\x56\x47\xcd\x61\x37\x79\xb3\xfd\xe6\x06\xd0\x01\x1b\xdb\xac\xe2\x1d\x5e\xa4\x37\x66\x70\xb3\x78\xc0\x3b\x80\xf3\x92\x0c\x46\x78\x75\x07\xe8\x6e\x1c\x60\xda\x06\x72\x15\x4a\x03\x05\x44\x74\x0b\x8d\xda\x14\xb3\x2c\xed\x04\x49\x46\x7d\x98\xdf\x83\x9a\xe4\x11\x6c\x41\x55\xd6\x97\x32\x1c\x2a\x16\x9f\x74\x67\x20\x81\xb7\xa2\x81\xe0\x8f\x69\x30\x16\x42\xd7\x38\x26\xf4\x9c\x48\x80\x1d\xa8\x57\x12\x15\x43\x8e\x0f\x54\x8e\xc6\xe3\x40\x81\x1b\x2a\xac\x51\xb7\x20\x79\x09\x06\xb2\x23\x33\xde\x03\xae\xa3\x5a\x0e\x60\xd2\x88\x39\xb5\x16\xe5\xd7\xc6\x6c\x2f\x94\x5a\x2b\x03\xc9\x56\x46\x64\x13\xbe\x22\xad\xcc\x64\x16\xa4\xc1\xef\x7d\xfa\x8f\x7d\x66\x01\x87\xe2\x8a\x3c\x94\x8a\x09\x5e\xb2\x8a\x60\xde\x2d\x5f\x1b\x8c\x99\x4b\xf0\xdb\xd6\xe9\xa5\x8d\x5f\x2e\x88\xd1\x92\x33\x5d\xcc\x9f\xdf\x78\x71\x35\x37\xb1\x91\x96\x54\xac\x14\xb6\xf9\x69\x04\x84\x99\xc5\x73\xff\xa3\x95\xf5\xe6\xa2\x9d\x6e\xd7\x1a\xcb\x8a\xfd\xf2\x86\x16\x98\x54\xea\xb8\xbe\x09\x5b\xfd\xf9\x72\x86\x04\x3e\xb4\xf4\x1c\xb5\xd5\xcd\x9c\xfb\xb4\xd2\x82\xfd\xc4\x85\xfd\xce\x34\x0d\xfa\xb1\x78\x8b\x64\x1c\xc0\x55\xc2\x08\xf7\xd1\x1b\x0f\x0c\x16\xe2\xde\xb3\xcd\xcb\xbf\xe8\xe7\x42\xac\xd7\x88\xad\x5d\x00\x30\xf3\xf8\x7d\x9e\x34\xad\x66\x65\x1e\xaa\x91\x15\x93\x74\xda\x19\xc0\x1e\xb9\xb5\x25\x95\x88\x67\x09\x10\xf6\x55\xea\x16\xed\x71\xf9\x3a\x71\xeb\x22\x93\x64\xbc\x8b\x6d\x92\xce\x6f\x88\xfe\xc9\xbb\x11\x50\xfd\xb8\xbc\xf5\x78\x6d\x6b\xe9\x81\x89\xdf\x71\x2f\x2f\xb9\x04\xf0\x11\x7b\xd2\xcc\xe1\xe5\x21\x4a\xba\xcc\x1d\x22\xf7\xaf\x9b\x5e\xdf\xcb\x9d\x8c\xc3\xd8\xbc\xf8\x90\xb4\x02\xb3\x5a\x04\x54\x39\xf6\x6f\xf2\x01\x7a\xe5\xff\x1c\xfc\xd3\x47\x3a\xcf\xca\x6b\xd2\xf5\xe7\xfb\xc7\xc7\xc7\xf7\xa3\xd4\xbe\xbf\xd5\xac\x45\x75\xfc\x58\x91\xb1\x00\x4c\x34\xf6\x96\x7e\x10\xe2\xcd\x03\xf0\xeb\xd5\xc0\xca\x11\xd5\x0f\x3f\xd5\x45\x67\x59\x20\x39\xa9\x56\xbf\x38\xe7\x3f\xab\x7b\xc6\xbd\xe5\xac\x74\x86\xbd\xe5\x44\xa1\x1b\xa4\x86\xef\xf1\x50\xb0\xcd\xbb\x23\xae\xa8\xb8\x25\x07\x61\x02\x13\xc7\x64\x71\x7d\xe5\x26\x8c\x78\x73\xf1\xab\xce\xaa\x65\xfc\x4a\x80\x01\x3c\x96\xf3\x08\x11\xfa\x97\x7b\x40\x55\xe8\x92\x87\x86\x27\xf1\x16\xf7\xe9\x0e\x8a\x01\xc5\x15\x1d\x93\x5c\xdd\x73\xe4\x1c\xba\x65\xd4\xa5\x7c\xcf\xe7\x88\x90\x15\xc0\x13\x86\x4f\x37\xd9\xe4\x45\x44\x73\xb2\xf0\xd9\x47\xcd\xbb\x6c\xb9\x71\x4a\x42\x14\xd7\x6b\x13\x45\x46\x0e\xfc\xad\x94\xc7\x1e\x0a\xaf\xb7\x5f\xfa\xb5\xe9\x89\x76\x23\x1a\x9b\xd7\x05\x14\x83\x60\xc9\xe2\x39\x2f\xfc\xb9\x8d\xf1\x1b\x43\x45\x05\xb5\x44\x24\x6d\x45\x67\x4c\xcc\x49\x6d\xe9\x37\xc0\x1e\x49\x9c\xff\x21\xbf\x50\xa9\x31\x2c\x67\xe9\xc9\x9c\x4c\x44\x62\x80\xcf\xac\x95\xe5\x5f\x77\x18\xd5\xe1\x1f\xf3\x8f\x7e\x80\x92\x6d\xd0\x76\x7d\xe3\x30\x91\xd7\x02\xf6\x15\x7b\x2d\x50\x81\x23\xaf\x51\x6a\x00\xfc\x57\x45\xc2\xbd\x16\xb4\xea\xe6\x6f\x0e\x9b\x14\x2b\xb1\xfa\x49\x2e\x4f\xf8\x53\x4c\x8b\xa3\xb0\xdc\xd5\xbf\x38\x5a\x65\xb3\xd3\x45\x27\x51\x54\x1e\x2a\x98\x0b\x34\x63\xe5\xcb\xaf\x4b\xf9\xf1\x25\xf6\xd0\xdc\x36\x7e\xb9\x9f\x7a\xaf\x17\xba\xce\x75\xd6\x2e\x92\xeb\x37\xbd\x7b\xca\xc9\x95\xf1\x8e\xca\xa7\xa5\xcc\xc1\xf5\xb2\x2f\x56\x4a\x44\xc0\x33\xf2\xb3\xe6\xb1\x76\x25\x39\xcb\xb5\xe1\xc9\x35\x39\x97\x86\x00\x3a\x7d\x5a\xbc\xb7\xd2\x81\xf4\x55\xca\xe5\x89\x4f\x3e\xd3\xce\x81\x80\x8a\x7d\xc4\xf7\x16\xf5\xcb\x04\x74\x0f\x2c\x51\x7a\xbf\x25\x87\x90\xd0\xa0\x24\x63\xa2\xbe\xf6\x32\x24\x8f\x72\x24\x10\x45\x32\x37\x9f\xf7\x5a\x07\x96\x4a\xc6\xd9\x5b\x42\x41\xb3\xc9\x17\xf9\x7d\x7c\x17\x79\x72\x5e\x9f\xf1\xa8\x60\x36\xe1\xbb\x0f\x51\x89\xc7\xc2\x2a\x82\xcc\xa0\x67\x0b\x0d\x20\x43\x4a\x47\xc3\x7a\x9d\xe2\x7d\xdb\xe2\x5c\x86\x2f\xdd\x2d\xdb\xeb\xdc\xa8\xc5\x13\xfc\xce\x0b\x2d\x17\xfb\x16\xdd\x52\xaf\x1e\xda\x6b\x61\x60\x73\x40\x73\x04\x5b\x03\xcf\x6b\x27\x4a\xff\x4c\x02\x6b\xf3\xb4\x06\x89\xd4\xea\x1a\xe7\xa7\x53\x33\xfd\xb4\x57\x89\xad\x80\xbb\x7d\x01\x60\x3a\x0f\xa7\x90\x4f\x74\x8c\x04\x77\x7b\xda\x06\x28\x6d\x9e\x35\x61\xf4\x2b\xe6\xd6\xa5\xe9\x5f\xd7\xfe\x86\x97\xf5\xd4\x94\x7b\x10\x32\xaf\x4e\x1a\xe5\x5a\xd6\x87\x33\x6f\xfe\xf9\x9c\x99\x25\x47\xb8\xaf\xb6\xe4\x4d\x7b\xae\xef\xf3\x2d\x76\x3b\x3d\xdf\x70\xc9\x6d\x76\x87\xc7\x5c\x1c\x0c\xc8\x7d\xa0\x25\xdb\x2a\xb9\x13\xee\xf8\x50\xcb\xbf\xf4\xc0\x14\xed\x4b\x98\x83\x62\x59\x65\x7c\xa6\xa2\xeb\x50\xd8\xb3\x0d\x57\x7e\xcf\xcd\x09\xb8\xab\x77\x5b\x50\x69\xfa\x9b\x5e\xc4\xea\x3b\x76\xa3\x43\xce\xdb\xa9\x7c\x51\x1f\x16\xb2\x50\xa9\x0e\x0f\x0f\x0c\x35\x41\xbe\xc5\xc7\x4e\x5a\xcd\x32\xe2\x24\xbf\x45\xf2\x54\x73\x8f\x0c\xc5\xf9\x8b\x8a\x5b\x77\x96\xf8\x37\x3b\xb2\xb9\x81\x22\x54\x40\xe1\x12\xa4\xba\x3b\x1e\x56\x6b\x68\x91\x29\x76\x7e\x5e\xc1\x54\xed\xda\x72\xd4\x5e\x55\x6f\x6f\x64\xb4\x60\xd4\x04\x4a\xdc\x25\xfc\x8b\xde\x72\x49\xa4\xbe\xb6\x75\xb1\x34\x65\x81\x26\x8d\x1a\x08\x70\x98\x02\xaf\x08\x70\x9d\x99\xef\x33\x10\xad\x7a\x75\xb8\x1a\x55\x18\xe6\x13\xfe\x11\xfc\x3b\xfc\x10\x18\xec\x46\xa8\xcd\xc9\x47\xdd\x6b\x33\x8a\x03\xdb\x5b\x09\x80\xfc\xe4\x24\x87\x33\xae\xb3\xe6\x95\x27\x2b\xdd\xbf\xae\xc7\x28\x6c\xf3\x6f\x77\x83\x0c\x10\x6f\x8c\x69\x47\x5e\xff\x9f\x94\xfd\x01\x62\xfd\x87\x3f\x7e\xc4\x3f\x28\xef\x5f\x36\x43\x20\x74\x64\x4d\x59\x9e\x0a\x6d\x50\x12\x23\x38\xcf\x94\x5a\x09\x4b\x02\xf3\x51\xc7\x19\x54\xd1\x45\x25\x48\xe3\x38\xa0\x4c\x88\xdc\x02\x26\x46\x1c\x0b\xeb\x13\x12\xf1\x33\x88\x16\x12\x4e\xb7\x33\x1e\x35\x39\x6d\x15\xae\xab\x15\xad\x10\x63\xba\xbb\xfa\x84\x40\xa9\x8c\x4a\x2a\x4a\x15\x1b\x2d\xa8\x84\x8f\x03\xf9\x89\x1f\x55\x29\xe7\x09\xa5\xbf\x8b\x6e\x2a\x50\x1f\xb2\xd2\x0c\x87\xd3\xa2\x64\x0f\xc5\x1b\x59\xe7\x94\xc4\x80\x75\xd5\x86\x4a\xf7\x9d\xd3\x00\xec\x3b\xe1\xe7\xca\x0c\x3a\x4b\xa9\xaf\x76\x84\xa9\xfa\x16\xa2\xfe\xc5\x36\xf6\x49\x53\x1b\xcf\x6f\x6f\x5f\x3e\x17\x90\x2b\xe7\x13\x6b\x67\xad\x1d\xcf\x49\x79\x39\xc0\x87\xad\x24\x09\x41\xe5\xc4\x05\x26\x35\xa8\xbd\x16\xc6\xc5\xfc\x30\xfa\x88\x24\xa3\x81\x5a\x3f\xd4\x67\x01\xa7\x8b\x99\x77\xd1\x03\xae\xd2\x2a\xa7\x03\xce\x2c\xac\xba\x4a\xaa\x5c\x12\xd4\x45\x1a\xf1\x50\x74\x17\x8e\x8e\x7b\x79\xe3\x97\x8b\x48\x35\xbe\x7c\xda\x59\x38\x61\xe4\x70\x7c\x59\x7d\x05\x7d\x00\x16\xbf\x43\xfc\x3c\x7b\x8f\x9d\xd4\x7a\x2a\x59\xd4\x30\xd2\x70\x44\xbd\xea\x85\x52\x01\x3f\xe8\xa0\x8a\x48\x9a\xf5\xe2\xfc\x9c\x9a\xc2\xef\x9a\x9c\xad\x4a\xb4\x50\xc2\x8c\xbc\x41\x8e\xda\x04\x63\xec\x72\xc4\x0f\xf8\xb8\x79\xf9\x99\x43\x51\xed\xe1\x65\x2f\x62\x55\xd4\xeb\xf2\x55\xe5\xb6\xcb\x26\x0a\x75\x16\xea\x11\x99\x51\x78\x77\x01\x18\xfd\x75\x7a\xe4\x82\xcb\x51\xd6\x46\x29\x8f\xf9\x11\xae\xbc\xf1\xe4\xc1\xdf\x27\xef\xe4\x60\xaf\x9f\xa5\xda\x42\x3d\xb9\x9c\x59\xbc\x23\x69\x30\xaf\x7e\x36\x59\xb7\x54\xc7\xc7\xa8\xbe\xfe\x46\x3d\xee\x3a\x49\x37\x93\xb0\x9e\x8a\x3a\x2b\x0b\x06\x5c\xf2\xe8\xde\x91\xb3\x7c\x3d\x82\x10\xf4\x38\x18\x61\x9d\x73\x8e\x0a\x2c\xda\x0f\x73\x18\xd0\x75\x9a\xcf\xf2\xc6\x93\x59\xf2\xb2\x3e\x67\x7c\xa7\x1d\x7c\x36\x67\xda\x6d\xd0\x3d\xac\x22\x05\x68\xe0\xec\xdc\x35\x4b\xe0\x54\x61\xfe\xc1\x5e\xa2\x95\x1e\x60\x2e\xb7\x90\xd3\xb0\xcd\x27\x74\x56\x5f\x74\x5e\x5e\xe3\x2f\x20\x13\x5a\x68\x9c\xcf\x00\x50\x30\xc8\x39\x41\x66\xeb\x39\xc1\xec\x28\x1c\xdb\xb1\x1e\xf4\x2e\x94\xfb\xfe\xe9\x74\x7d\xb3\xb5\x5b\xbc\x9c\x58\x56\x44\xaa\xc8\x5d\xa7\xab\x1c\xf7\xec\x4c\xdb\x12\x36\x54\x3c\x12\x8e\xb0\xbf\x1c\x87\x16\x07\xf4\xd5\x10\x2c\x15\xfe\x9d\x14\xdf\x56\x7f\x15\x0a\x9f\xc6\xcd\x91\xa3\x05\xb2\x06\x52\xc2\x52\xb6\x19\xb2\x19\x0e\x69\x09\x96\xe8\x67\xb9\xdd\x62\x25\x21\x5b\xcf\x74\x9b\x76\xf8\x54\x74\xda\x33\x94\xe3\x77\x49\xd7\xa0\xd9\xae\xf2\x0b\x33\x5b\x77\xae\x50\xc2\x1a\x7e\x5b\xe6\x84\xd1\xb8\x88\x12\x04\x5a\x33\x46\x48\xd1\x75\x50\xd6\xe8\x3c\x0f\xf4\x42\x23\x8a\x1b\x40\x6a\x38\x4c\xa8\x00\x6b\x82\x69\x64\x13\xb8\x58\xd1\xa7\x6f\x6b\xe9\x21\xc9\xeb\x5f\x74\x67\xaf\x76\x5e\x9c\x2c\xa4\x51\x38\x96\xb0\xf8\x45\x03\xa7\x7c\xa8\x62\x93\x4c\x8a\x2a\x05\x07\xe6\x9f\x97\x22\xfb\x5d\x02\xdf\x52\x6f\x27\xe0\xc6\x86\xed\x5b\x55\x3a\x30\x13\xc0\x25\xb2\x63\xc8\xb0\x82\x52\x25\x0b\x30\xae\x3b\x7d\xce\x85\x53\x6b\xcb\xb1\xc5\x68\xda\xba\x3c\xa5\x99\x65\x91\x29\x6c\xe7\x60\xab\x55\xe6\xed\x28\x33\xb9\x85\x4f\xba\x2b\x9f\x96\xa9\xb1\xcb\x0b\x30\x14\x9f\xa2\x9e\x5a\x53\xf6\xb4\x55\x3c\x37\xd4\x82\x93\x80\xdf\x3a\xbc\xa6\x15\xad\x32\x13\x27\x37\x24\xde\x92\x45\x01\x5b\xc9\x7b\xed\x41\x23\xa2\x79\x8c\xe1\xd9\x99\xcd\x1f\x4e\xfc\x4f\x1e\x79\xd0\x6d\xad\xcb\x7b\xd0\x2f\xdd\x28\xab\x55\x65\x80\xed\x21\x5c\xfe\x03\xf1\x0d\xbd\x1f\xb6\xb7\x6d\x47\xd9\x17\xee\x75\x69\xbf\xa7\xee\x7f\xbb\x33\xbd\x0b\xa8\xa9\x9c\x3e\xa4\x3b\x3f\x13\xee\xfb\xe5\x03\x56\xdb\x6e\xf9\xec\x42\x4a\x45\xec\x55\x11\x0e\x0f\x63\x0e\x37\x60\x69\x03\x4c\x18\x8e\xae\x13\x94\x53\x4d\x92\xea\xda\xbe\x7d\x03\x99\x71\x7a\xef\x9b\x1b\xea\x63\x3d\x6e\xae\x1e\x48\x37\xb4\x79\xe7\xb1\x8b\x7f\x8c\xf1\x73\xc8\x77\x29\xd3\x6f\x9a\x11\x42\xef\x04\xbd\xc3\xcb\x66\x6a\xf0\xff\xbf\x3c\x68\xd6\xc3\x23\xc8\x7f\xd9\x2c\xeb\x19\x24\x70\x48\xab\x98\x81\x33\xf4\x3b\x7f\xd6\x9a\xaa\x39\x8b\x04\x72\x68\xee\x2c\xe5\xc0\xe6\xbe\x62\x96\xe7\x7f\xe1\x36\xca\x2c\x19\x0a\xb7\x41\x46\x91\x9f\xd5\x17\xd8\xa2\xe1\x32\x70\x0a\xa2\x4b\x71\xd4\xb9\x34\xa8\xa9\x59\xa3\x71\xcd\x7d\x86\xba\x20\xd7\xc3\x80\xfc\x3b\x5a\x6d\x94\xac\x17\xcc\x3e\xd4\x5f\x83\x7f\xd7\x5f\xdf\xd0\x95\xd8\xff\x9c\x33\xe5\x2f\xd0\x18\xc9\xee\xe7\x16\x9b\x97\x9e\xfc\x87\xc1\xb4\xd1\xd2\xd4\x68\x56\x8f\xeb\x34\x1b\x0e\xac\x0f\xa2\x6f\x63\x7a\x59\xcd\x6b\x86\xff\x2d\x35\xe3\x5a\xe4\xdc\x7b\xb8\xd7\xbf\x00\x0f\xfc\xbd\x99\x42\x4e\x7e\x25\xb7\x15\xf7\xe2\x54\x65\xec\xe8\xa4\xf2\x06\xa9\xaf\xc0\x93\xc0\xc7\xed\xc9\xc9\xce\xe9\x67\xfa\xa3\xdc\xda\xb4\xe9\x24\xf2\x2d\x5b\x57\xa9\x35\x36\xad\xd4\xf4\x2a\xd6\xe3\x71\x13\xf0\x24\x57\x3d\xdf\xf5\x03\x98\xd1\xa9\xd8\x99\x9f\xc2\x5a\xfc\xc5\x19\x01\x7f\x42\x1e\x4d\xa5\x9e\xb7\xd5\x99\x9e\x66\x29\x0b\xdd\xf3\xea\x5c\xcd\x7a\xf5\x6d\x2f\x7c\x4f\x9e\x31\x77\xbd\xd7\x3c\x76\xb0\xaa\x73\x9f\x4e\x76\x7c\x66\xe5\x59\xc2\xc9\x1f\xa2\x0d\xbe\xfb\x31\xc2\xf2\xc2\xe4\xa7\x26\xc9\x9c\xf9\x37\xcb\x24\x3f\xaf\xf2\xf4\x88\x7d\xc5\x7d\x24\x72\x2a\x7f\xc8\x14\x9e\xa7\x86\x6c\xbd\xa7\xe7\xeb\xeb\x72\xc0\x7f\xc3\xb2\x3a\x76\x9f\x03\xe2\x28\x00\xb2\xc1\xfc\x59\x7a\xa6\x77\x01\xf1\xb9\x87\x57\xe3\xae\x16\x5e\x3d\xed\x92\x1d\x8a\x7a\xec\x25\x2f\xfb\x26\xd7\xf5\x19\x07\xfe\xca\xae\xea\x59\xbe\xc9\x8d\x23\xf9\x8d\x24\xee\x89\xe1\xca\x3d\x6d\x28\x90\x5b\x45\x40\x35\xdd\xe4\xdd\x60\x76\xcc\x56\x8f\x51\xf0\xc1\x0d\x7f\x09\x0c\x7b\x2c\x93\x0f\x9c\xf3\xce\x40\x3b\x31\x21\x0c\xa5\x9e\x88\x40\x6e\xd9\x5f\x51\x7d\xb5\x2a\x7c\xa8\x10\x9c\xf1\x18\xcc\xeb\xdd\x90\x84\x4c\x07\x3a\xc7\x9a\xde\xb2\x15\xa7\x03\x1b\x34\x77\x8b\x73\x5e\x77\xce\xbb\xba\x32\x98\xb1\xe2\xd2\xd3\x55\x62\x28\xe7\x25\x6b\x54\x8e\x62\xfb\x89\x77\x26\x48\x0f\x0a\x3c\xf6\x29\xce\x78\xda\x9d\x5c\xcc\xc9\xac\x92\x9d\x83\xb6\x04\x88\xfb\x87\x3d\xa4\x5d\x88\xae\x16\x6d\xdb\x91\xa5\xd7\xd8\x69\x13\x4b\x8d\x48\x6e\x2c\xcb\x8d\x37\x02\x7f\x3d\x32\xa4\x91\x95\xac\x7c\x66\xdd\x47\x28\x57\x94\xb2\xa9\x2f\x5d\xdc\xfd\x80\x6d\xd2\xf9\x4f\x19\x70\xee\x66\x3a\xa4\xb2\xc7\xc8\x99\xde\xed\x7e\xe4\x9a\x82\x9a\x03\x0b\x87\x6b\xc7\x91\xdb\x58\xe9\x93\x4e\xc3\x16\x4d\xb6\x9d\x6b\xcf\xa3\xf6\x53\x59\xa7\xee\x15\x45\x42\x7b\xcc\xce\x93\x9b\x7b\x8e\x42\x53\x4a\x72\x62\x26\x29\xdf\xcd\x95\x9d\x89\x9a\xe3\xf4\xf1\x1e\x8d\x30\x1e\xd9\xfd\x3a\xf3\x89\x85\xb8\x62\x53\x3c\x1f\x9f\x8b\x57\xf8\x81\xc8\x57\xad\xf6\xeb\x71\x9d\x94\x37\x68\xd5\x26\x48\xc3\x22\xe6\x3e\xd2\x9b\x79\xca\xca\x55\xe5\xa8\x60\x1d\xfc\xfb\x0a\x11\x87\xaf\x38\xfc\xc8\x4a\x67\x93\x71\x29\x2a\x7c\x4a\xd8\x72\xb4\x50\x09\x93\xd1\xa1\x38\x6c\xa2\x4d\x72\xd2\x6c\x10\xba\x1c\x92\x7e\x9b\xbc\xbd\x8d\xdb\x4f\xc1\x16\xb0\x94\x04\x55\xe8\xab\xd3\xc0\x7c\xfc\x98\x6b\x58\xe4\x4e\x7e\xdf\x90\x9f\x48\x1e\xd1\x2a\x5b\xca\x1d\x31\xb5\x42\x5d\xbb\xa1\xfa\x12\x15\x52\xb4\xa3\x69\xd9\xd3\xb9\x30\x16\xd7\xab\x94\xc8\x13\xfd\xbf\x66\x9d\x47\xb4\xac\x14\x17\xef\xe2\x9f\x05\x4a\x38\x40\xbf\x3f\x80\xbf\x0a\x69\x9c\x86\xb5\x62\xe7\xfc\x99\xad\xbb\x67\xde\x08\xf6\x56\x0a\x66\x21\xc8\xc6\x84\x2f\x72\x94\x61\x7a\x8f\xa0\xdc\x2a\xd2\xb1\x33\x89\x84\x7e\xd9\xd5\x28\x44\x9b\x0c\x61\x2d\x77\xb8\x81\x35\xc0\x35\x22\xcd\x5c\xc0\xc1\x59\x4f\xf3\xba\xe6\xbc\x13\xfc\xd6\xbd\xb6\xc6\xa9\xcc\x84\xe8\xdf\xf9\xe6\x10\xd9\x2e\x86\xf0\xa5\x46\xd9\x9b\xd7\xac\x8f\xbc\x31\xf6\x17\xe6\xd9\xb7\xcf\xfd\xf8\x9a\x53\xd7\xd9\x2b\xa7\xc8\x7a\xcc\xd3\xfd\x2e\x39\x55\xed\x8f\x5b\x37\xe6\x3a\xb3\x17\x5d\x30\x73\xfd\x38\xc3\xa0\x64\x9a\x2e\xa4\xc9\x54\xeb\x7e\xff\x45\x21\xc2\x77\x8a\x0b\x31\x6e\x05\xee\x2c\x38\x10\xfa\x81\x37\x2a\xfd\x52\x61\x66\xca\xa2\x16\x75\xbf\x93\x9d\x85\xbc\x2c\x40\x52\xb6\x8b\x44\x9a\x73\xa1\x73\x12\x6c\xb9\x00\x92\xd9\xd3\x1f\xa8\x71\x46\x81\x75\x5c\x75\x4b\x85\xce\xf8\xeb\xe8\x65\x3c\xc9\xab\xdb\xfd\xf9\x39\xa6\x23\xb0\x2c\x8d\x81\x1d\x74\x98\x1f\x19\x9c\x83\xd7\xac\x5b\x52\x71\x67\xca\x11\x35\x0f\x30\x19\xaf\xa6\xf4\x3e\xc7\x53\x79\x87\x70\xba\x9d\x0b\xd7\x6c\x81\xb4\xb4\x72\x1d\xcd\x08\xa6\x18\x9d\xb8\x30\xf3\xda\x50\xb5\x5e\x29\xc5\xf4\xee\xe9\xe6\x8f\xe7\x89\xbf\xe6\x9c\x0a\x33\x96\xe6\x0c\x3d\x78\x83\x3f\x1d\x04\xa0\xc0\x3c\xbe\x40\x0b\xde\xb7\x45\x4b\xcd\xd3\xaf\x65\xad\x88\x34\x5d\x64\x58\x1b\xd7\x87\xc9\x74\x2a\xcc\x52\xb5\x4e\x4e\x5f\xa1\x51\x88\x24\x45\xb4\xd8\xf8\x0e\xc9\x99\x87\xda\x59\x54\x23\x66\x5c\x3d\xf2\xbe\x8b\xb6\x8d\x31\xc1\xe2\xe4\x73\xfa\xcb\xbe\x0a\xbf\x23\xcb\x96\xe9\x9e\xee\x4f\xbc\x49\xab\xc7\xb3\xa4\x9d\xcc\x59\xae\xd7\xc4\x34\xbd\x5d\x8a\x08\xb1\x60\xd8\xef\xfe\xad\xf6\x8a\xab\xdb\xa1\xf5\xdd\x70\xa0\x99\x8e\x89\x33\xaa\x8f\xf0\xed\x8e\x6e\x7f\x99\x0c\x99\x70\x5a\xe6\x7b\xbd\xec\xed\x4a\x4e\xf7\xb5\x11\xb8\xcf\x4c\x9d\x0e\xf5\x4c\x0f\x92\x73\xa4\x0e\xf9\x6a\x46\xe5\xb8\x59\x91\x57\xa2\x6b\x71\x92\x92\xf7\x3e\xdb\xe7\xcd\xdb\x47\x79\xd1\x8a\x03\x56\x8f\x23\xd5\xb4\x34\x52\x96\xa9\x65\x06\xbf\x48\x4b\x78\x5f\xdd\x21\x4f\x68\xf0\xf7\x6d\x5b\x22\xce\x82\xce\xa9\xa3\xab\xca\x6f\x3f\x17\x05\xb3\x8c\x8a\xc9\xdc\x69\xf5\x1c\xe4\x76\x4d\xfd\x9e\xe8\xb1\x7b\xcd\x88\x92\xcb\xe0\x03\x0b\x49\x32\x4a\xae\x5d\xfb\x06\xe0\xaf\x03\x01\x3f\xf6\x83\xfe\x9f\xe4\xf1\xb5\xcf\x7f\xca\xbc\x73\xea\x1c\xc6\x50\xb9\x59\xfd\x7e\x5d\x3b\xb3\xf5\xe0\x4e\xe7\x6f\x67\x7f\x5d\xbb\x42\x31\x58\xe4\x80\xb3\xf1\xfc\x76\xe7\xd6\x02\x3d\x26\xa9\x91\x00\x2b\xfc\xba\x36\xd3\x77\x28\xb9\x6b\xa1\x6f\x5b\x57\x91\x8c\xa2\x42\x77\xfe\x2a\x19\xab\x66\x7a\x63\xab\xd5\x89\xe5\x65\x99\x77\x42\xc4\x3b\xd6\xbe\x59\x2c\x9a\x72\xea\x9c\xd2\x5d\xa3\x5e\x02\xa6\x6d\x87\x62\x18\xf5\xbc\x7a\x67\xd8\xcb\x0f\x4b\x7c\xe8\x39\x6d\x6e\xe9\xb9\x0e\xf6\x10\xfb\x1c\xe6\xec\x50\x91\xd5\x97\xa1\x9a\xb3\x6c\xc6\xdc\xe7\x38\x37\x23\x7c\x49\xde\x3b\xce\x1f\xd3\xc7\x6a\x58\x03\x74\x08\xc2\x5d\x1f\xb1\x1d\x9a\xfd\xc7\x0e\x6d\xd3\x1a\x93\x7f\x74\x6d\xbe\x0f\x8d\x54\x4d\x58\xc9\xb4\x4a\x0e\x18\xe6\xd5\x6a\x54\x57\xdf\x5d\xeb\x4c\x9f\xeb\x5e\x9e\xda\x5e\xb8\x60\xdf\x78\xad\x26\x3a\x7a\x95\x46\xe2\x66\xdc\x4a\xab\xf5\xa8\xb8\x39\xff\x82\xe4\x82\x95\xf7\xd4\xa7\x1c\xf0\x31\x90\x47\x9a\x13\xa5\x16\x65\x55\xd3\x35\x24\x75\xda\xf4\x12\x9b\xfb\xb6\x4f\xcf\x5b\x55\x89\x59\x56\x15\xd1\x08\x56\x26\xa3\x69\x67\xe6\x7b\x74\xd0\xc4\x08\xa3\x3b\x0a\x9d\xaf\xeb\x86\x88\x7b\x38\xe3\xb2\xcf\xd2\x44\x3c\x84\x09\xc7\xa0\x85\xed\x93\xe7\xd0\xdd\xcc\x3c\x01\x23\x75\xdd\xee\x1b\x31\x25\xf2\x29\xd5\x00\xc1\x5a\x8d\x12\x2e\x51\xc2\xd9\xfd\xc9\x25\x17\xa3\x40\xd0\xfb\xad\x73\xf5\x9b\xee\xc5\x87\xd9\xde\xd4\x80\x75\x45\xe9\x04\x86\x0f\x63\xef\x55\x6b\xb8\x19\x65\x6a\x60\x1e\xdb\x2f\x5f\x64\x6a\xa8\x95\x1d\x8d\xc2\x46\x76\x5d\xbf\xa0\xad\xbc\x94\xb7\xae\x54\x61\xc7\x35\x91\x06\x82\x1e\xab\x63\x37\x52\xad\xd4\x22\x15\x7d\x81\xbe\x56\xcb\xf6\x08\x76\xd5\x00\xf9\xa7\x16\x79\xb0\xea\x21\x9a\x4c\xfd\x1e\x95\xc5\x3d\x00\x25\xc9\x4c\x15\x74\x3d\xa7\xd5\xf3\x8e\xb5\xdf\x54\x3c\xf4\x1f\x51\x19\xd3\x5a\x9b\x26\x50\x8b\xb9\x60\x67\x43\xb4\xea\x0c\xc5\x71\x9a\xa4\x4d\xa8\x08\x92\x13\xc5\xa9\x70\x5e\xbf\x05\xc5\x2a\x3f\x35\x69\x94\xd0\x9e\xca\xa4\x0f\x89\x4f\xde\x7e\x70\x1b\x3b\x6d\x88\xd5\x48\xaf\x25\x1d\xc3\x27\xf3\x61\x48\xcd\x56\x39\x6d\x01\xa5\x94\x71\x7d\x38\x88\x8f\xed\x77\x17\x67\xb7\x27\xbf\xa5\xc0\xbc\x95\xbc\x51\x64\x2a\xf7\x1a\x89\xd7\x9c\xdd\x44\x39\x2c\x8f\x46\x39\x03\x38\x84\xdf\x77\x1e\x41\xa6\xba\x1e\x02\xf4\x0f\xa3\x30\x43\xf0\x1a\xb4\x4f\x6d\x33\x06\x62\x88\x64\x74\xa8\x55\x3e\x16\xe1\x9b\xbc\xc9\x68\x89\xdc\xf8\x4c\x73\xeb\xd3\xf3\x96\xce\x81\x44\x62\xdc\xbb\x65\x74\x22\xfd\xe6\x3c\xb1\x76\xfd\x68\x8c\xcd\x9d\x94\x61\xe3\xd2\x90\x7c\x5a\x75\xf3\xef\x1d\x22\xc7\xf9\x97\x56\xbc\xd8\x42\xe7\xc5\x25\x5b\x4e\xc1\xe4\xcd\x25\x11\xdd\x85\x52\xa0\xd4\xa2\x9b\x60\x85\xbf\x93\xca\xeb\x37\x8c\x0a\x1f\xdc\x61\xa6\xa9\x3c\x51\xc6\x7c\x31\xf7\x6f\x00\xf9\x40\x0a\x7d\x88\xb4\x47\x64\x9e\x47\xa4\x5e\xb6\x2a\x91\xaa\x02\x2a\xd1\x5d\x00\xe2\x17\xd4\x00\x70\x7a\x12\x9d\x9d\x34\xdc\x7b\x80\xa9\xb3\x82\x7f\xef\xd0\xc6\x93\x49\x80\xe9\xb4\xaf\x75\x1f\xdc\xcc\x23\xc2\x1a\xbe\x81\xfe\xa0\xbb\xa8\xa0\xc6\xc3\xf0\x9b\x57\x7f\xe0\xe0\x0b\xb7\xa2\xbb\x15\x4c\x38\xdf\x3b\xc4\x0c\xa5\x50\x4c\xd6\x25\x71\xec\xfe\x58\x58\xc7\x44\x93\x80\xc0\x14\xbc\x60\xdc\x1a\x59\x29\x49\xc6\x4d\x0a\x64\xe0\x3a\xe8\x10\xa3\x6c\xcd\x92\x3b\x33\x23\x4a\x89\x5b\x8c\x54\x40\x31\x56\xa4\x57\xfe\xa2\xc4\xa8\x8a\x1f\xba\xd3\x99\x5b\x50\x20\x94\xfe\x91\x04\x8d\x19\xd2\x1d\x3c\x96\x82\x5c\x9e\x5a\xca\xe4\x15\xae\x62\x6e\xda\x62\x81\xa1\xb0\xb1\x66\x34\x82\x4a\x3f\xce\x5b\x34\x3c\x51\xdc\xbc\xfc\x7c\x7b\xee\x7b\x1d\xb4\xef\xf9\x76\x72\x30\xa4\x35\x7d\xcb\x2d\x3f\x3b\xfd\x5d\x66\x51\x46\x26\x8a\x5b\xb4\x3d\x67\x65\xf2\x24\x32\xb3\x6b\x39\xeb\xe8\xb4\xbb\xab\x40\xe0\xe1\xa8\x15\x55\x16\xf0\x65\xb3\x3b\x54\xb5\x16\x8f\x54\x45\x7d\x20\xd5\x6d\x85\xca\x79\xb5\x0d\x8d\x30\x49\xc6\x81\x71\x32\x06\x39\x4a\x3c\x80\x5c\x2b\xa5\xa1\xc5\xa1\xbe\xa0\xb7\xfa\xe5\x6f\x3f\x7a\x56\x90\x88\x79\x4e\x26\x32\x56\x8e\xe9\x4c\xec\x89\x72\x9b\x74\xc4\xbc\x9e\x1c\xa6\x59\x1c\xe3\xac\x91\x69\xd2\x59\xb6\xb1\xf0\x73\x16\x67\x09\x0f\x50\xc1\xf9\x61\xf8\x79\x75\xac\x35\x66\xe5\x54\x0b\x0e\x49\x59\xf0\x41\x75\xac\x9a\xf6\xaa\xc9\xfa\xfa\x57\x06\xa3\x34\xd8\xff\x3a\x3d\xbe\x9a\x44\xc1\x48\x2d\x1e\x0a\x31\x7b\x12\x65\xc5\x0d\x6a\xd8\xc0\xab\xd2\x02\xbe\x2f\xec\x62\xb5\x3d\xce\x6c\x40\x74\x1e\x6a\xc2\x0a\x8e\x56\x87\x60\xbe\xb4\x7f\xec\x6f\x23\x53\x47\xef\x3f\x55\xac\x1e\x33\x04\x18\xab\x73\x3e\x2f\x3a\x33\xaf\xd3\x3d\x3a\x63\xd9\x36\x5a\xd7\xb0\x70\x4b\xa1\x0e\xba\x54\x61\x8c\x72\x89\x83\x94\x7b\xb7\x15\x64\xa2\xdc\xdd\x44\xc5\xfd\xda\xaf\x8e\x35\xe2\x26\x4e\x11\x11\xd8\x99\x22\xa6\x1d\x30\x16\x13\xf6\xd3\x26\xe0\x80\x80\x03\x5b\xb3\x9d\x8b\x7a\xfe\xba\x03\x4b\xf0\x3c\xc8\x41\x3a\x1d\x3f\xc7\x8d\xe4\x7a\x04\x65\x69\x9a\xa8\x15\x84\x8a\xe0\xc3\x12\x98\x30\x88\xad\x06\x1e\x34\xa7\xf8\xc9\x13\xc3\x95\xa5\x0f\x6d\x30\xbe\x50\xa6\x54\x27\x12\x10\x6a\xa5\x70\x5b\x51\x79\xe0\x32\x61\xac\xf6\x68\x30\x85\x21\x7a\x57\x66\x95\x4d\xfc\xc4\x9a\xe5\xe0\x69\x9b\x91\x16\xf5\x90\x14\x00\xde\x6e\xec\x41\xa1\x5d\xc5\x6d\xff\xdc\x9e\xef\x41\x58\xcb\xe9\xf8\xd9\x66\x4e\xc3\x2e\x52\x7a\xc3\x44\x38\x9f\x8d\x73\x3b\xe9\x29\xf8\x57\x13\x81\xdb\x17\x0d\x7d\xf0\x1d\x42\xe9\x63\xae\x3f\x28\x9b\x4d\xe8\x72\xf1\xef\x43\x7f\x9b\xfc\xae\xb9\x66\x8e\x1b\x0d\x17\xd8\x83\xe2\x2f\x7d\x7c\x7c\x18\x60\x3c\x4c\xf1\x5d\xa0\xe2\x9f\xf9\x5f\xf9\x8a\x4f\x78\x27\xc5\x41\xfc\xaf\x7c\x91\xe7\xbf\x38\x47\x69\x81\x8c\x3b\x72\x01\x38\x53\xe0\x2b\xc0\x1f\x36\x43\xbb\x2f\x55\x58\x51\x4c\x62\x4a\x13\x28\x6b\x0e\xfc\xc5\x7b\x81\x93\x3f\x46\x94\xac\xb3\x22\x49\x3b\x2b\xf2\x55\xfb\xf5\x66\x82\x50\xed\x11\x53\x83\xea\xae\x73\x9b\xa5\x72\xeb\x32\xc3\x0b\x8c\x4b\x92\x08\xe4\xbd\x6a\x3a\x81\x04\x20\x8d\xcb\x71\xad\x38\x28\x5f\x82\xc3\xf2\x45\x20\xf3\xc2\x37\xb9\x64\x34\xa6\x94\x23\x57\x25\xd9\x08\x7f\x44\xaa\x53\xd4\xf9\x34\xe4\x23\xa9\xb3\x2b\xd8\xc8\x79\x15\x81\x3a\x13\xbc\xfd\x91\x5d\xaa\x6e\x54\x17\x46\x94\x3a\xd3\xab\x62\xc7\xcb\xa9\xa0\xae\x60\xd6\x85\xbd\xa1\x53\x9c\x3b\x15\x91\x28\x5c\xb9\xd4\x99\xff\x99\x52\xcf\xf3\x99\xb9\x82\xba\xac\x6f\xd7\x36\x7f\x38\xe7\x07\xc4\xcd\x70\xb8\x9c\xd0\xe0\x2c\x1d\xb7\x32\x0d\x2f\x29\x47\x6d\xd7\x30\x29\xfb\x87\x3c\xa2\x3c\xc7\x25\x6c\x11\x9b\x69\xcd\xeb\x5c\x16\x20\xac\xcf\x27\x98\x76\x4b\xaf\x4b\x98\x72\x6a\xd6\xc8\x24\x2e\xf8\x44\xfe\x08\x74\x59\x4f\x58\xc7\x5e\xfc\x01\xfa\x76\x05\xd1\x58\x23\x9d\x50\x57\x32\x86\xa7\xef\xc7\xe7\x7b\xf0\x55\x98\xe1\x6a\x54\xab\xa0\x83\x3c\x3e\x5a\x68\x27\x9f\x1d\xc8\xb4\x6f\x61\x74\xe7\xd1\x37\xdd\xc9\xc5\x0c\x44\xd2\x6a\x6a\xa0\x07\x97\x7a\x00\x01\x52\xd5\x8a\xef\x10\x25\xc1\x64\xc0\xf9\x50\x09\x8a\xf2\xb8\xdb\xc5\x77\x23\x38\xd0\x66\xd6\x94\x84\xfb\x0f\x50\x00\xab\xc5\x8f\xf8\x7f\x9e\x4a\x65\xce\xe6\xcf\x4b\xe9\x65\xf3\x57\xcd\x93\x87\x81\xc0\x1d\xc4\x1f\x3d\x00\xc7\x90\x39\x28\x25\x61\xf1\xc3\x24\x38\x58\x09\x06\x0f\xaa\xc3\x33\x96\x36\x4a\x64\xee\x19\xfc\xf0\xc8\xe1\x40\xce\x1e\xaa\xb8\x56\xb6\x6f\x7c\x63\x01\xd1\x09\x21\x18\xff\x98\x60\x29\x1d\x15\x29\x75\xcf\x8b\xca\x42\xc6\x67\x0f\x9d\x86\x32\x9e\xd8\x68\x51\xcf\x9c\x48\xaf\x9e\x3a\x1a\xbc\xfb\xc0\x78\x68\x04\xc0\x70\x08\x90\x88\x61\x35\xcb\xfc\xb2\xb5\xd4\x18\x08\x3e\x04\xfe\xac\xda\xc0\xf8\x3d\xfe\x82\x71\x77\xad\x1a\x86\xef\x05\x49\xd4\x08\x31\xf6\xab\x82\xcf\xb5\x62\x3c\x66\x18\xec\x7b\x6d\xdf\x80\x43\xc2\x4a\x69\x2d\x29\x1e\xf9\x60\x30\x30\xc7\x0d\xce\xd1\xb5\x19\x95\x40\x86\x7c\x2d\x65\x09\x8e\x55\x1b\x08\x5e\xc2\x78\x78\x90\x24\xa0\x16\x9d\x8b\x25\xc3\x71\x4c\x7d\xb1\x79\xad\xbd\x79\xf1\xb6\xa2\x2d\xe8\xcd\x13\x35\x8f\xe3\x43\x01\x84\x61\x87\x0f\x7e\x68\x67\x0f\x33\xe4\x4d\x06\x43\xaf\x39\x29\x89\xa5\xb8\x75\x7a\xa9\x33\x7b\x91\x05\x96\x9e\xa3\x82\xc9\x8b\xde\xe6\xb1\xd9\x0f\x92\x33\x78\x9b\x45\xd9\xac\x63\x80\x64\xe1\x35\x03\xab\x90\x61\x27\xbe\x55\x5f\x22\xd9\x48\x65\x6e\x22\x2b\x0c\xf5\xcc\x7a\x60\xdf\x16\xba\x39\x8d\x95\xc6\x7b\x7d\x47\x57\x70\xbb\x21\x7f\xbe\xc2\xf8\xc9\xa5\x60\x27\x23\x55\x77\x8f\xe2\xf3\x6c\x90\x12\x5f\x51\xe4\x71\x26\x77\x50\x2f\x20\x89\xee\x70\xda\xda\xc1\xc5\x4c\x61\x12\x31\x71\x55\x89\x4a\x67\xce\xd8\x71\xd7\x30\x0f\x9a\xb5\x12\x46\x5f\x0c\x84\xe1\x1c\x80\x3a\x85\xbf\xa4\x0d\x05\xea\x67\xf2\x34\x47\x89\x40\x51\x7a\xe8\x3a\xe9\x59\x58\x7e\xe0\x7c\xc8\xe4\xa0\x31\x60\x4f\xc6\x66\xdf\x34\x2e\xec\x82\x6b\x63\x4f\x12\xa5\x42\xd7\x7e\x25\x8e\x0a\xbd\xbb\x38\x8b\xba\x01\x01\x0d\x1b\x0d\x15\xe9\x78\x93\x18\xa2\x25\x2f\x12\x02\x8f\x83\x05\x7b\x9c\xb8\xac\x7c\x50\xba\x31\xcf\x8b\x4d\x8d\x3d\x56\xac\x9a\x2a\x1b\x4e\x8f\x9a\x94\x1c\x47\xc0\xf3\xb8\x05\x29\x8a\x87\x87\x6b\xd5\x7a\x84\x8f\xa3\xca\xfb\xcc\x17\x15\x13\xf7\x58\xe7\x3e\xd2\xed\x70\x72\xdd\x12\x5a\x00\x48\x69\x0e\x8b\x81\x71\x22\x6b\xc6\xfd\x44\x04\x73\x3b\x3d\x15\x9d\x63\x69\xa1\xd9\x22\x7c\x68\x8a\xd9\xde\xf8\xfe\x58\xe5\x34\x14\x55\xee\x8d\x80\x18\xda\x66\x1c\xa3\xbf\x4d\x3a\x9a\x67\xd6\xe5\xf1\xe0\x4f\xe4\x35\xf4\x0e\xa2\xf3\x4b\x99\x02\x99\xad\xea\xdb\x5f\x5f\xde\xbc\x72\xc2\x8b\xa1\xee\xd1\x02\x4c\xd6\xaf\xce\x93\x0d\x7a\xd5\x0f\xbc\x21\x94\x9b\xd5\x86\xce\x99\xf4\x54\xf9\x1a\x5c\x12\xc1\x9f\x6f\x29\x3d\x4d\x4a\x67\xce\x47\x90\xd6\x4b\xe5\x22\x41\xfe\x44\xe9\x40\xd4\xda\xe9\x1e\x92\x51\x85\xa3\x83\x83\xef\x07\x94\x70\x7c\xa4\xc5\xbe\x12\x36\x8c\xcf\xd7\x5a\x45\xc8\x94\xa7\x25\x79\xc1\xa0\xc4\x78\x4f\x3c\x7a\x1a\xfc\x41\x9e\x35\x18\xa4\x8f\x76\x25\x41\xaf\xb7\xe9\x1f\xbb\x80\xee\xd2\xc3\xf0\x1f\xfb\x63\x8d\xdc\xd3\xb8\xec\x03\xfa\x3b\xf0\x41\xcc\x12\x7f\x0c\x7f\x05\x87\xe1\x2f\xbb\x18\xb3\x1e\x50\xda\x3f\x02\xf9\xbf\xa2\x89\x80\xd2\xfd\xe5\x80\x8d\x60\x47\x02\x04\x7f\x07\xaf\xec\x83\x82\xfd\x5c\xb0\xef\xd5\x4c\x0d\x60\x3a\x50\xbd\xc2\xa9\x2a\xaa\x7f\x89\xf8\x45\xc6\xe2\x87\xfc\x39\xc0\x9e\x06\xd1\x00\x78\x08\x3f\xf7\xab\x98\x64\xea\x24\x7a\x97\x2a\x43\x9a\x90\xe4\x78\x5f\x79\xe4\x04\x80\x3d\xd1\xc4\x14\x78\x9c\xbe\x29\xb0\xc5\x1b\xf3\x55\xd0\xc8\x3b\x70\x50\x90\x24\x35\x3e\x73\x83\x83\x1f\x04\xd9\x33\x6f\x00\x14\xe7\xf2\xca\xfa\xe4\x1c\x3e\x84\x8d\x8f\xad\xac\x4f\x52\xa4\x5a\xfb\x25\x9a\x70\x4d\x15\x39\x1f\x36\xfe\xcb\x57\xdd\x08\x72\xb4\x7b\x92\xff\xac\x55\xd3\xe8\xf7\x7b\x28\x9f\xf3\x9e\xb4\x5a\x19\xda\xf3\xaa\x43\x76\xab\x14\x20\xef\xd0\xdd\x0b\x79\x0b\xa5\x35\xa0\x11\xf2\xb0\x3a\xe9\xfe\xf6\xd5\xe7\x9d\x07\xe7\x35\x43\x8b\x07\x8d\x93\x66\xc3\x5d\x46\x62\x7f\x86\xb4\x29\xbe\x44\x73\x24\x3d\x28\x19\x65\x94\x60\x68\xf1\x46\x52\x6f\x33\x71\xc5\xe9\x6b\xb4\xb1\x8f\x75\xaa\x0a\x47\xd3\xa8\x47\xcd\x4f\x7d\xab\xa7\xbf\x39\x64\x5c\x22\xeb\x1e\xab\xff\x7e\x01\xe3\xec\x3e\xd2\x95\x68\x82\xa2\xe8\xd5\x33\x13\xb7\x45\x6f\x36\x1e\x22\xe3\x8b\x5c\x0f\xe7\x25\xcf\x8a\xb2\x10\x3c\x23\xe7\xb0\xa9\xc5\x3e\x99\x05\x55\xb3\xc2\xc0\x95\xc3\x06\xf0\xfd\x61\xf1\x10\xff\x9b\xc3\xb5\xa9\x6b\x8a\xf3\x55\x61\x82\x83\x52\x8d\xbd\x7c\xb4\x5f\x8b\x79\x04\x67\x85\x6b\xcb\xcb\x8d\xe8\x85\xe5\xa6\xbf\xd2\x6b\x95\x44\xa9\x11\x30\xed\x46\x3d\xb1\xb2\x4f\xd3\x78\x53\x3e\x97\x14\x03\xaa\x61\x95\x9d\x50\xd0\x4c\xd2\x45\x49\x14\x84\xc0\x50\x9e\xd0\x52\x2d\xaa\x8f\x20\x5e\xe3\x02\xde\xe6\x0b\x6f\xfb\xe2\xcf\xc0\x38\xe8\x75\xe7\x44\x52\x64\xa3\x80\x3b\xb2\x28\x69\x07\xe5\xf0\x7e\x4b\x33\xbb\x63\x1d\xd6\x3c\x6e\xdb\x42\x51\xe1\xb3\xed\x8d\xb7\xd8\x10\xd9\xfa\x7b\x79\x6c\x88\x80\x2a\x4a\x6f\xed\x0f\xf1\xb9\x2e\x94\xc2\x16\x38\x99\x71\xf1\xfd\x77\x3e\xf8\x13\xed\xd2\x37\x2c\xed\x33\x36\x78\x35\x72\x28\x8c\x94\xe4\x13\x25\x29\xcc\x27\x41\x64\xc1\x20\x7a\x4e\xe2\x27\xe5\x87\x25\x82\xfe\x0e\xfe\x56\x50\x1a\xa0\x34\x8c\x8d\x81\xf0\x09\xff\xf0\x63\xe3\x00\x4f\x19\x63\xe9\xe8\xe3\x27\x64\xd2\xdf\x08\xf6\x1e\xcf\xd6\x4d\x30\x97\xc3\x11\x03\xac\x53\xc3\x62\x81\xaa\x3a\xa0\x57\x9c\x9d\xfd\x64\xc1\xd9\x87\xcf\x5d\x67\x06\xf0\x2f\x54\x55\xca\xb6\x4e\x4d\xbe\x38\x3d\x82\x76\xb5\xf7\xb6\x8c\x81\xc3\x0a\x1c\x2a\xe2\x09\x1d\x68\xf6\xd5\x9c\x24\x43\x33\xc9\xc2\x4e\x25\xf2\x61\x38\x1e\xd6\xfc\x5a\xdb\x0b\x17\xb6\xaf\x7c\x99\x19\x4d\xdd\x87\xeb\xfe\xf5\x36\x30\xf1\x16\xdd\x65\x1f\x7f\x3d\xf0\xe7\x0a\x52\x78\x4b\x77\xe0\x0a\xbc\xd1\x8c\x8f\x57\xc9\x0f\xde\xad\xa0\x55\xd6\xac\x42\x9a\xb4\x86\xaf\xaa\x18\x9c\xf6\x21\xb3\xcb\x04\x67\xb3\x1a\x29\x1e\x7b\x55\x3d\x62\xb4\x66\x3c\x4a\x5d\x62\x85\x44\x83\xeb\xf8\xe0\x46\x88\xca\xa7\x5e\x23\x65\xbd\xb0\xca\xfe\x19\xb8\x2b\xaa\x66\x5e\xab\x0e\xb3\x43\x47\xce\x5a\x29\x6e\xfa\xa2\xa6\x02\xaa\xf6\x68\x9a\x36\x12\xce\x17\xf9\xfe\x91\x23\x87\x07\x03\xbe\x48\xbd\x89\xda\x6d\x3b\xc3\xcf\x69\x58\x2f\x6b\x95\x6c\xeb\x6a\x55\x39\xec\xd8\x5d\x46\x05\x22\x77\xac\xc0\xd8\x57\xac\x7f\x97\x8c\x34\x39\xc4\xb9\x48\x59\xea\xee\xe9\xa0\xe6\xde\x57\xa4\xec\xc0\x70\x54\xa1\xec\x34\x15\x89\x91\x56\x8f\x20\xbd\xab\xbe\x07\x07\xe9\xbb\x61\x91\xd0\x66\x23\x63\x47\xcb\x4c\x2e\x23\x8b\x30\x6a\x68\x94\x25\x6a\xb4\x3a\x32\x4a\x4f\x6e\x15\xdf\x96\x37\x40\xde\xc6\x64\x47\x83\x13\xf5\x34\xfc\x3c\x78\x5f\x95\xda\xf5\xd1\x4c\x46\x75\x51\x04\x4a\xd0\xba\xc6\x75\x3e\xc0\x9f\x01\x71\x28\x61\x80\xee\x5a\x35\x4e\x7c\xf4\x6a\xcf\xca\x98\x2c\xaf\x09\xd7\x1d\x2a\xe2\x75\x33\x87\xf4\x37\xaf\x2d\xac\x91\xdf\x16\x67\x5a\xd2\x2d\xbc\x4b\x2e\x5f\xaf\x00\x5d\x42\x4d\x0f\xe6\x5a\x72\xaa\x01\x86\x86\xcd\x11\x34\x86\x07\x07\x9b\x23\x2d\x7a\x19\xc3\x69\xb6\x3a\xd2\x54\xde\x49\x78\x1d\x7d\x48\xbf\x51\xf4\x3e\xc2\x5f\x5c\x60\x7a\x6a\xcf\xc0\xd2\xf3\x47\x9f\xb0\x63\x5d\x0e\x7c\xb9\x16\xd7\x4d\xd3\x87\xf0\x57\xf0\x27\xfd\xfe\x47\x4e\x05\xca\xe4\xa9\xe0\x29\x89\x67\x5f\x70\x31\xf5\x23\x30\xcc\x2f\x0b\x6a\x0b\x66\x9a\x7c\x70\x3e\x23\x8f\x64\x20\x04\xcb\xb7\x4a\x60\x53\x3c\xae\x0a\xf3\x18\x28\x37\xf1\x79\x06\xf8\x4f\xa0\x5d\xe0\x75\x99\x7d\xd9\xa9\x6f\x09\x90\xd2\x4a\xab\x26\x92\xdc\x23\x92\x40\x6f\x33\x27\x66\xea\x45\x9f\xa7\xe2\x95\xa1\xbf\x51\x5a\xa0\xb8\x95\x88\xef\x85\xfe\x1e\x7d\x1e\x95\x5b\xda\x8f\xcc\x71\x6d\x30\x55\x63\x7e\x76\x81\x0a\x95\x03\x15\xe7\x79\xc3\x48\x08\x0d\xe8\x3c\xfe\xac\xc6\x8b\x22\x1c\xbe\x7f\xdd\x81\x95\xb9\x74\xbb\x7b\x79\x2a\xb7\x6b\x69\x9c\xfd\x40\xde\x28\xa8\x00\x19\x15\x7f\x22\xcf\x81\xd6\x28\x3b\x4c\x36\x66\x46\x41\x53\x7a\xb2\x4a\x94\xe2\x85\xab\x9f\xcf\x3e\x4b\xae\x08\x33\xf4\xb8\x8c\xc9\x3a\x2a\x09\xcb\x54\x4d\x64\x18\x39\x47\xc5\x4d\xdb\x87\xd7\x8c\x23\xaa\x45\x65\x4a\x96\x51\x64\xdf\x7a\xce\x00\xa5\xcb\x61\xea\x06\x42\x3b\x80\x32\xd0\xd6\xe2\x77\xa8\xe2\x52\xa0\xd5\x3a\x8b\xd8\x5c\x01\x8d\xeb\x9d\xf9\x73\xf8\x34\x96\x69\x8b\xb4\x60\x5c\x8e\x1e\x52\xd4\xca\xf6\xb7\x27\x37\xaf\xae\x18\xb5\x9a\x07\xed\xf4\x8b\xec\xa1\x72\xc1\xf0\xc0\x3d\xa1\xce\xfe\x5c\x7a\x3d\xe3\x0d\x62\x4d\x4f\xef\xac\xfa\x16\x37\x8a\x7f\x6a\xa0\x48\xe1\x8f\x5b\x5b\x2b\xfd\x7d\xda\x9d\xea\xeb\x53\xde\x8b\xa3\x2a\x6f\x0c\xdb\x85\x33\x2f\x56\x06\x6e\x52\xd3\xbd\x89\x64\x34\xf5\x1e\x3c\x27\xae\xb3\x19\xd5\xf5\x8b\x74\x9c\x21\x79\xef\xa7\xaf\x1f\x4d\x74\x8a\x64\x32\xd4\x5a\x0d\x7e\xfa\xbb\xa3\xd0\xe6\xa7\xbf\x3f\x2a\x8d\x4a\xde\x21\xd3\x39\x67\x8b\x71\x5f\xb0\x16\xfe\x96\x1e\xd8\xe5\x9e\x4c\x7b\xaf\x63\x7b\x7b\x3f\xfd\x5f\xdc\x20\x54\x75\xcb\x0e\x24\xcd\xf2\x01\xe9\x75\xaf\xea\xd6\x0b\xda\x76\xbb\xe1\xa5\x21\xbb\x65\xf1\x33\x0e\x3f\xb2\x17\xe4\x00\x5b\x34\x0f\xe0\xd2\xec\x4d\xfe\x95\x9a\x56\xeb\x43\x49\x0e\xce\xe9\xb6\x3e\x2b\xf0\x93\xf8\xd2\x16\xa7\x33\x96\xf7\x04\x77\xd1\xe2\x67\x05\x4e\x7c\xac\xea\xab\x34\xc8\xbf\xa5\x05\x99\x8d\x93\x99\xf9\x33\x89\x51\x77\xd3\xaa\x3b\xed\xd1\xeb\x86\x07\x64\xf7\x55\x6b\x1a\x01\xd4\xbc\xdc\x56\x65\x7a\xf6\x33\x88\x3d\xda\xcc\x9d\xa4\xdb\x98\x9e\xeb\x6f\x6e\x4e\x5e\x93\xfa\x9f\x6c\x20\x7a\x54\x98\xd8\xb2\xcf\x0a\x63\x51\x73\xe4\x9f\xb7\x76\x24\x7d\xf1\xdb\xc7\x97\x2c\x14\xd1\xaf\x31\xf1\x61\xf4\x4f\x22\x1f\x29\x73\x9e\x30\x41\xbe\x7d\x3a\xd5\xe1\x6c\x3f\x51\xcf\x33\x59\xb8\x4c\x19\xab\xd3\x70\x24\xe7\xbc\x58\x07\x90\xaf\xc7\x87\x41\xbf\x83\x63\x21\x79\xef\x93\x13\x8f\x61\x2e\x51\x79\x09\x3b\x51\xb9\xed\xc8\x0b\x31\xd8\x5b\x71\xf2\x25\xe2\x7d\xbe\xfa\xe5\xd6\xda\xb4\xb9\x2f\x0a\x9f\xa6\x71\x5c\x3b\x5a\x08\x47\x30\x16\xf6\x5c\x61\xb8\x19\x8f\x99\xbc\x1a\x48\x46\x0a\xf2\xab\xf0\x7a\x52\x7c\x3d\xd8\x5c\xfc\x02\x1f\x81\x7b\x7d\x0c\xfe\xee\x9c\xa1\x87\xb5\x5f\x1f\x85\xbf\xf9\xa2\xa3\x9f\x15\xfc\x79\xe9\x36\xfd\x3d\x0e\x7f\x6f\x4f\x3e\x52\x45\x70\x53\xc2\x87\xf5\xe9\x9f\xba\xd7\xce\xd0\x87\x09\x6c\xe6\xe9\x0f\x52\x2e\x8f\x85\x14\x61\xd8\xd2\x0f\xbf\x2f\x8c\x5f\xa0\x33\xf8\x3d\x1a\xb7\x9a\x54\x6e\xfa\xab\x84\x13\xfc\x85\xbb\x1c\x8f\xa2\x63\xf4\xdb\x74\x0b\xbd\xa6\xa3\xf4\xcd\xf4\x3c\x11\x85\xdc\x10\xf4\x8e\xbf\x9b\xe1\x78\x49\x75\x0f\x7d\xd3\x6f\xd5\x39\x74\x0d\xeb\x54\x69\xc6\x0d\x7c\x30\xf4\x68\x41\x3d\x7e\xee\xbc\x7a\x4e\x2f\x78\xb8\xbe\x44\xa4\x41\x79\x20\x5e\xcd\x26\x9b\xfb\xaa\x4e\x07\x23\x51\xbf\x26\x78\x50\x3f\x13\x60\x29\xb8\x24\xdd\x1b\x48\x50\x8d\x96\x52\x7a\x9b\x7c\x72\xb7\xa8\x6d\x37\x9f\x2a\x76\x92\x6d\xd2\xc9\x0d\xfb\xeb\xda\x5f\x0b\xa4\x83\xc7\xcc\xa4\x43\xc4\xf0\xb9\xaa\x77\xad\xd2\x7a\xe5\xbf\xfe\x8b\x58\xe9\xea\x5f\xa2\xff\xfe\xef\xe0\xc3\x3f\xbc\x1a\x48\x82\x90\xc9\x36\x2a\xc1\x6e\x2d\x3a\xa0\xc0\x7e\xbf\xeb\x41\x03\xaa\xfd\x74\x12\x63\x69\xbc\xb8\x46\x89\xc2\xce\x24\x5f\x95\xfb\xbd\xf0\xff\x05\x00\x00\xff\xff\x97\xdc\xa7\x0b\x8e\xff\x00\x00") - -func confLocaleLocale_jaJpIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_jaJpIni, - "conf/locale/locale_ja-JP.ini", - ) -} - -func confLocaleLocale_jaJpIni() (*asset, error) { - bytes, err := confLocaleLocale_jaJpIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_ja-JP.ini", size: 65422, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_lvLvIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\xbd\x4b\x8f\x1b\x47\xb6\x30\xb8\xe7\xaf\x48\xab\x21\xd8\x06\x4a\x14\xdc\xfd\xcd\x03\x86\x69\x8f\x6c\xb9\x6d\x59\x52\xb9\x3e\x97\xac\xc5\x35\x04\x3a\x48\x66\xb1\xa2\x98\xcc\x64\x67\x64\x96\x5c\xd5\x68\xe0\xd3\xe6\xae\x66\xa7\xcd\x2c\x5b\xd3\xbb\xd1\x0f\xe8\xc5\xf8\x7a\xc5\xfa\x23\xf3\x4b\xe6\x3c\xe3\x95\xc9\x92\x7c\xfb\xe2\x6b\xa0\xad\x62\xc6\x3b\xe2\xc4\x89\xf3\x3e\x66\xb7\x9b\xaf\x4a\xb7\x9c\x3d\xb7\xe5\xba\xb2\x45\x7f\xed\xba\xfd\xab\xd5\xfe\xd5\xd6\x15\xdf\xd8\xae\x70\x65\x7b\x69\x9d\x3b\x2a\x36\xc6\x15\xad\xd9\x40\xe9\xdb\xce\x15\x97\xa6\x6a\xa0\x52\xf1\x4d\x33\x99\x9c\x37\xdb\x72\x76\xba\x7f\xb5\xe9\xb7\x6e\xb2\x32\xee\x7c\xd1\x98\x76\x35\x7b\x54\x9f\x35\x3b\x53\x97\x95\x75\x93\xf2\x97\x5d\xd5\xb4\xe5\xec\xd1\xf5\x6e\xff\x1a\x7b\x98\x9c\x97\xd5\x6e\x76\x62\xaa\xfd\xdb\xd5\xf5\xfe\xed\xc2\x4c\x9c\x5d\xd7\x73\x5b\xcf\x4e\x6c\xa9\xc3\xd8\xd2\xf1\xe7\xa6\xef\xa0\xe9\xe0\x73\xbf\x9b\xfd\x50\xee\xff\x61\x5d\xd7\x42\xaf\xf8\xb9\x2d\xd7\xf0\xab\x6c\xf3\xef\x2f\xcb\x85\xb3\x5d\x39\x7b\xba\x7f\x75\x01\xeb\xa8\xcc\xce\x4c\x2e\xcb\xd6\xd9\xa6\x9e\x3d\xc7\x7f\x2f\xcc\x64\x67\xd6\xe5\xec\x09\x96\x74\xe5\x76\x57\x19\xa8\x7e\x6a\xd6\xa6\x33\x97\xe5\xa4\x32\xf5\xba\xc7\xf2\xe7\xb8\x6e\x33\x59\xb6\x25\x94\xcf\xeb\xf2\x25\xcc\xeb\xb2\xb4\xab\xa6\x9b\x4e\xa7\x93\x1e\x76\x6b\xbe\x6b\x9b\x33\x5b\x95\x73\x53\xaf\xe6\x5b\x5c\xf4\x13\x5b\x76\x4d\x87\x23\x17\x5c\xd6\x17\x7d\x0d\x3b\x68\x5b\xd8\x33\x5a\x49\xb9\x82\x95\xcf\x8d\x8b\x16\x7f\x01\xd3\x2e\x36\xfb\x57\x13\xea\xb4\x36\xdb\xa8\x9f\xcb\xfd\xab\x76\x05\x9b\xba\x35\xb6\x9a\x7d\x7d\x6f\x67\x5c\xe7\x60\xfa\xce\xbd\x6c\x60\xdf\x4f\x4c\xdb\x54\x25\x6c\xc5\xbc\xbb\xda\x95\xf2\xb3\x30\x1d\x74\xd6\x42\x7b\x3b\x59\x9a\x5d\xb7\x3c\x37\xb3\x13\xf8\xb0\x30\xfd\x0a\x07\x6a\xa0\x3f\x68\xb2\x6b\x60\x9b\x9a\xf6\x0a\xf6\x6f\xd7\x5c\xe3\x9f\xf6\xc2\x4d\x9a\x76\x6d\x6a\x7b\x6d\x3a\xdc\xae\xef\xf9\xc7\xfe\xd5\x12\x37\x6d\x6b\xdb\xb6\x69\x67\xa7\xbb\x66\xdd\xe3\x41\xc3\x8e\xcc\xb1\x9b\xd9\x77\xa6\xaf\x01\x60\xe2\x6e\xb0\x6c\x6b\xd7\x2d\xee\x2c\x16\x9b\x02\x7f\x49\x47\x5c\x48\x9d\x71\x53\x17\x77\x79\xd6\xb4\x1b\xf9\x6e\xba\x15\x42\x4d\x67\xec\x48\xf7\x30\x53\xe9\xba\x49\xa7\x69\x6a\x38\x3d\x2a\xc6\x55\x03\xf4\xae\xa0\x8b\xb4\x92\x9b\x98\xd5\x16\x8e\x81\x60\x76\xf6\x00\xff\x2e\x14\x7e\xcd\x72\xd9\xf4\x75\x37\x77\x65\xd7\xd9\x7a\xed\x66\x8f\x9b\xba\x33\x05\x9c\x51\x67\xf0\xb0\xfa\xad\x9d\xf8\xb2\x47\xf1\xd7\xab\xa6\xf7\x20\x31\x7b\x66\x2e\x9d\xc0\x80\xe3\x12\xdf\x08\x8a\x6c\xda\x1f\x0c\xda\xd9\x4b\x8b\xf0\x3b\x7b\xb0\xa1\x3f\xf7\xaf\xba\x72\xb2\xeb\xab\x0a\xf6\xf8\x2f\x3d\x54\x86\xc1\xae\x01\x0a\x6e\xfe\xbd\x2f\x76\xb6\xdc\xb5\xc6\x49\x63\xb8\xb2\x50\x3e\x3b\x69\x9b\x45\xb5\x7f\xbd\x85\xc5\xc1\xb1\xd7\x4b\x5c\x58\x07\xff\xed\x26\x93\x9f\x6c\x0d\x83\x55\xd5\x8b\x89\xfc\x01\x17\x16\xff\x95\x1d\xeb\x6c\x07\x13\x8e\x3f\xc1\x91\x34\xfb\x5f\x2d\x0c\xd4\x6e\x1b\xd8\x7a\x7b\x0d\x7f\x9b\x0a\x46\xff\xad\xe9\x26\xab\x66\xb9\x01\xe0\xc7\x6b\x5d\xe2\x11\x02\x66\x58\xbb\x02\x26\xbf\x29\x2a\x82\x5b\x57\x5c\x97\xdb\xe2\x21\x55\x3b\x2a\xec\x75\x65\x1c\x7c\x07\x7c\x03\x67\xb3\x7f\xbb\xb6\xc5\x67\xa6\xe8\x4c\xbb\x2e\xbb\xd9\x9d\xf9\x02\x2e\xdc\xe6\x4e\x71\xde\x96\x67\xb3\x3b\x77\xdd\x9d\xcf\x2f\xcd\x0a\x0e\xbd\xc6\x69\x7c\x76\xdf\x7c\x7e\x44\xb3\x40\xb8\x2d\x60\xf9\x35\xec\x4b\x71\xf3\xc6\x5c\x00\x42\x82\xab\xbd\x7f\xf5\xc1\x04\xf7\x07\x2e\xfc\x7c\xb5\x60\xec\x46\xb3\xa9\x4b\xd8\xa4\xa5\x2d\xa1\x2a\xb4\x7d\x7a\x75\xfa\xdf\x9f\x1c\x15\x27\x8d\xeb\xd6\x6d\x49\x7f\xc3\x7f\xa0\xd1\x9f\xf0\x6e\x16\xcf\xec\xc3\x2f\xa7\x13\x68\xcf\x3b\xf1\xd0\x74\x7d\xb1\xd8\xbf\xba\x86\xdb\x92\x1c\x13\xd6\xc0\x7b\x16\x57\x40\x8c\xe0\x00\x2f\xba\x0e\x2e\x92\xeb\x5b\xb7\x32\x00\xa4\x8e\xae\x72\xb8\xc6\xc3\x3b\x0b\x7d\xd1\x4d\x8f\xfb\xaa\x1b\x67\x7a\x46\xad\x0b\xdd\xde\xe3\x64\x21\x16\xb7\x10\xba\xe4\x15\x15\x8f\x8e\x8f\xbf\x7f\xf8\x65\xb1\xba\xb6\xb5\x2d\x4c\xcb\x48\x1b\x70\xec\xf6\xa2\x87\xfd\xda\x01\xf2\xe9\xce\xfe\xf7\xf9\xba\xac\x01\xd5\x54\xf3\xa5\x9d\x4e\x9c\xab\x00\x53\xad\x00\xdf\x9d\x3e\x81\x83\xbd\xf9\x0d\x2a\xe3\xe4\xba\xf3\xd9\x57\xe5\xfe\xd7\x9b\x37\x13\xf7\x97\x0a\x77\x53\x86\xcf\xb7\xa9\x58\xe9\x7c\xf7\xaf\x5d\x71\x06\x58\xc9\x14\x4b\x6a\x38\xfd\x6c\xd1\x7e\xfe\x88\xe7\x77\x81\xc7\x6d\x16\xae\xa9\x6e\xde\x76\x0d\x55\xe8\x8f\x0a\xd8\xc9\xb6\xdb\xbf\xbe\x80\xe9\x03\x82\x92\xe7\xa6\x9f\x4e\xca\xb6\x9d\x03\x1a\xee\xae\xf0\x08\x69\x2a\xe9\xa2\xeb\xa6\xc5\x67\x0a\x2e\xf1\xe1\xd9\x94\x88\x2d\x5a\x03\x0d\x00\x42\xe0\x54\x60\x02\xd2\xb3\xad\x01\x05\xd8\x15\x9c\xad\x6e\xf9\xa0\xa5\xdf\x77\x00\x9b\x4b\xd8\x46\x07\x65\xf8\x9c\x14\xce\x6e\x17\x4d\xd5\xbb\xe2\xce\xf4\x0e\x22\xf2\x3b\xf7\xee\x4c\x27\x75\x33\x67\xec\x81\x58\x7f\x65\x9d\x59\xc0\x0b\xc0\xaf\x51\xcb\x78\xd3\xbf\x48\x78\x99\x7a\xe9\xd4\x74\x0e\xae\xe7\xba\xc3\xe7\x75\xbb\x7f\xdd\x16\xb5\xb9\x84\xf3\xe4\x17\x05\x66\x8f\x5d\x72\x17\x4d\x6b\xe0\xf4\xea\xce\xc5\x5b\xa3\x08\x4b\xa0\xe8\xc1\xb0\xba\xd9\x16\xb6\x2d\x00\x09\xd8\x35\x5c\x12\x5b\xc0\x15\xe1\x9d\x83\xb7\x88\x60\x6e\x3a\x99\x28\x28\x30\xa0\xd3\x4d\x81\x33\x80\x6b\xd4\xe2\xbd\x2c\x53\x70\x47\x7a\x21\x7a\x8d\xea\x04\x42\xb5\xd0\xc3\x29\x0d\x85\xe7\x9e\x62\x5a\xdf\xa4\x87\x6b\x5b\xda\xee\x03\x7a\x7a\xf8\x98\xa3\x97\xa7\x2f\xd6\x95\x81\xe3\xc0\x03\x34\x7c\x7e\x26\xd4\xd4\x41\x9e\x5b\x67\x89\x54\x31\x1d\xdc\xaa\x8a\xb0\x01\xcc\x3a\x7a\x1b\x2c\xe0\xa1\x8d\x93\xce\x60\x13\x04\x55\xac\x6c\x5b\x6e\xa8\xc2\xfe\xd5\x74\xd2\xf6\x40\x50\xe0\xfd\x04\x1a\xc5\x56\xf8\x28\x56\xe1\xa2\x6a\xa1\x8e\x19\x9e\x74\xda\x5f\xe8\x60\x01\x40\xad\xf4\x91\xcc\x17\x31\x37\x90\x36\x40\x4a\xc5\x93\x31\x00\x49\x1b\xdc\xb6\x30\x3c\x00\x2e\xc0\x11\x6d\xbc\xf6\x44\x88\xd5\xe1\xf1\x21\xd6\xbc\x79\xb3\x7f\x1b\xa6\x63\x00\x2d\x35\x88\xf6\x66\x0f\x1b\x00\x9a\xda\xc9\x4f\x9d\xdc\x33\x83\x28\xaa\x2b\x37\x50\x58\x9c\x9e\x7e\x5b\x6c\xaa\xa6\xde\xbf\x96\x59\xfd\xf8\xc3\x13\xbc\xf1\xe7\xf3\x5d\xd3\x76\x33\x2c\xc6\x3f\x9c\xff\xa4\xbd\x9c\xc0\xdf\xa6\xa8\xe1\x8c\x5a\xa4\xfe\xfa\xb6\x57\x44\x53\x7c\x77\xf3\xd6\xf5\xd4\x33\x5e\xd7\xb2\xb5\x50\x01\x20\x19\xe7\x86\x67\xdd\xf5\x9b\x9b\x37\x70\xb5\x61\xa9\x00\xe5\xfb\xd7\x40\x4a\x21\x31\xe3\xd1\x14\x34\x9c\x4e\xce\xbb\x6e\xc7\x53\xf8\xf6\xd9\xb3\x13\x99\x83\xff\x38\x36\x89\x02\x48\xc7\x25\x4e\xc4\xf0\x56\x00\x38\xc2\x53\x0a\xe4\xc4\x16\x16\x5f\xc0\xae\x11\x62\x86\x4a\x17\x88\x1f\x00\x57\xf0\xd5\x82\x7f\xa7\x04\x98\x7d\x5b\x45\x40\x0b\xdb\xa0\x5f\x47\xf7\x0d\x67\x75\x1f\xff\x73\x3a\xd8\x3e\x3c\xac\x92\xa8\x2e\x23\x58\xe1\x15\x2c\xce\xc1\xb1\x01\x3a\x42\x44\xe3\x0c\x20\x24\x18\xb5\x6a\xd6\xf3\xb6\x69\x3a\x06\xec\x9b\xff\xe8\x81\x8e\xab\xe0\x12\x68\x5f\x11\x04\xa4\x75\x75\x46\x0f\x43\x05\x3a\x02\x18\x28\x83\xe4\xdf\xa0\x4f\x00\x7a\x43\x58\x17\x50\xf9\xa4\xd9\x21\xb6\xf1\xb7\xf9\xb8\xf4\x77\x3f\xbb\xc8\x44\x3d\x4a\xad\xaf\x65\x35\x3b\xb3\x31\xd5\x0e\x77\x36\xa7\x6d\xb6\x70\x30\xf4\x9e\x9d\x3e\x85\xd3\x6a\xe3\x47\x8d\xca\xce\xda\x66\x3b\x3b\xd5\x2d\xb8\x88\xbe\xea\x5a\x74\x0c\xb3\x82\xd6\xe5\x51\xf1\xc3\x9f\xbf\x2a\xfe\x97\x3f\xfd\xf1\x8f\xd3\xe2\x21\xe0\x19\xb8\x37\x05\x01\x3e\x5c\xf2\x1a\x29\xd5\x9b\x37\xd6\x6f\x32\x37\x21\x04\x0f\x84\xe0\x16\x16\x03\x1b\x71\xe7\x58\xd1\xce\x9d\xe2\x33\xae\xe9\xfe\x8f\xf2\x17\x03\xa4\x7b\x39\x5d\x36\xdb\xcf\xa7\x13\x5c\x21\xdc\x59\xba\xd5\x61\x6e\x26\xeb\x57\xab\x79\x34\x1a\x57\xdd\x29\x31\xcd\x7c\xc5\x7c\xd9\xd4\x67\x40\x79\x20\x8d\xb7\xe3\x57\xab\xf5\x9c\x86\xbe\x33\x66\xe7\x3a\xbb\x6b\x11\x11\xe1\xa7\x9e\x06\x98\xd7\x40\x7a\x9f\x5d\x45\x0d\x4b\xbf\xe9\xd7\x40\xc0\xe1\xa6\xf7\xb0\x6d\x74\xa1\xe6\xf4\x0c\x2e\x4b\x39\x9e\x53\xfa\x68\x10\xee\x96\x16\x5e\x28\x79\x24\xd3\x23\x6a\xce\xce\x00\xf7\x95\xfc\x90\x87\x51\x16\xe5\xb5\x43\x4c\x52\x3a\x7d\xd9\xfb\xa4\x2a\x5c\xb7\x1d\xf0\x51\x0f\x3a\x6d\xf0\xd5\xc3\x63\xa0\x1a\x00\xdf\xc0\xe5\x5a\xf5\x1b\xc6\xd7\xd2\x74\xff\xea\x08\x9f\x06\x2b\x00\xd0\x33\xd4\x31\x4c\xc2\x85\x5b\x13\xe3\x08\x60\x59\x37\x82\x19\x10\x55\xc9\x63\x08\x17\xf5\x12\x98\xa9\x36\x1a\xea\x1b\xf9\x14\xc1\x5d\x3f\xa8\x3f\x98\xa0\x6f\x25\xdb\x01\x1b\x7e\xd9\xc0\x3f\x34\x35\xfa\x85\xa5\xf8\x47\xbf\x06\x3c\x04\xf3\xaa\x70\x5e\xaf\xbb\x08\xa3\x5b\x02\x26\xc1\x48\xf8\x1c\x6d\xe0\x41\x87\x2a\x0d\x3d\x22\xaf\x2b\x20\x13\xce\xca\x55\x89\xac\xca\x6a\x2e\xf3\xa8\x9a\x66\x03\x13\x09\x5b\x6b\x76\x08\xac\x0d\x34\x62\x92\xde\x14\x0b\x5b\xc1\x8d\x2c\xb6\xe5\xa6\x42\x36\xf7\xd5\x45\x7f\xa8\x1b\x59\xd5\xef\xeb\xec\x08\xa8\x5b\x3f\x6b\x80\x03\xd3\x01\x76\x6d\xf1\x32\x00\xff\x66\xa2\x2e\x14\x40\x16\xa6\x22\x8e\x19\x68\xbe\x6b\x58\xfc\x42\x76\x2e\x1c\x4a\x42\xa1\x84\x2d\xf6\xfb\xd4\x07\xf0\x26\xb2\x65\xb4\xe1\xe0\x84\x0e\x36\x3f\x42\x50\x81\x25\x24\x74\x0d\x0a\x13\x5a\x24\x1c\x95\xee\x81\x87\xa3\xaf\x7b\x17\x77\x83\xa4\x4c\x8f\xa4\x4f\x4d\xa3\x2b\x07\x1b\xb6\x6f\xd5\x36\xf8\x48\x2e\x0c\xf1\xb2\x7d\x56\x51\x66\x18\xbf\xda\xe1\xda\x42\x73\xb8\x48\x47\x81\x81\xea\xe0\x62\x01\xbf\x81\x7f\x64\xdd\x4e\x99\xaf\x00\xd6\x5a\xa4\x15\x73\xd8\xf1\x97\xd1\x34\x62\x0e\x03\x9a\xc1\x11\xf5\x88\xbe\xaf\x59\x0c\xc1\xe7\x67\x76\x40\x00\x6f\xf0\xfc\x50\x0c\xe1\x46\xbb\x94\x09\x3f\x83\xdd\x8a\xbb\x48\x01\xb8\xf5\x5d\x71\x4f\x47\x30\xfc\x2d\x95\x61\x66\x1b\xa0\xc9\x61\x55\x72\x08\x52\x55\x48\x32\xb8\x4d\x43\x54\x46\xdc\xd4\x76\x2a\x9c\xb1\x30\xab\xcc\x51\x1d\x03\xa5\x5a\x67\x7c\x88\x9c\xdf\x08\xd9\x8a\x10\x88\x2c\xe3\x51\x44\x55\x21\x73\xf2\xe8\xe1\xec\x13\x78\x2f\x6f\xfe\xbd\xdc\x0e\xc8\x5d\xa1\x9f\x8c\xa3\xa9\x22\xda\xb7\x6e\x63\x75\x32\x8c\x1a\x99\x4d\xdf\x0c\xb9\x71\xae\x34\x2a\x37\xc9\xa8\x66\xe1\xbd\x04\xb3\x47\xd4\xb4\xa2\x71\xa4\x69\xe8\x1d\xd0\x5e\x59\xf0\x92\x51\xdb\xf2\x04\x29\x37\x3d\x5f\x37\x28\x0a\x60\xfe\x19\xb8\x06\xa4\xee\x26\x80\x85\xbb\xf9\xda\x76\x73\xc4\x9b\xe5\x6a\xf6\x18\xcf\x03\x49\x71\x91\xc4\xc0\xde\x7d\x08\xc5\x1f\xc2\x82\xe0\x8e\xaf\xfa\x4f\x8b\xbb\x97\xc2\x7b\xfd\x09\x1f\x10\xc4\x21\x80\x1a\x00\xb2\x67\x4c\x83\x5d\xb2\xec\x0a\x0f\xbe\xa3\xcb\x6e\x94\x1d\x82\x8d\x86\xae\xaf\x01\xc8\xca\x8b\x80\x03\x89\x3e\x03\xf4\xb2\xb4\x40\x34\x34\x80\x62\xe0\x94\xdb\x46\xba\xe9\x11\x6f\xdf\x05\x30\x3a\xfe\xfa\xf9\xa3\xd3\x62\xdd\x2c\x7a\x20\x84\xb5\x70\x3a\x51\xa6\x09\x58\x26\x81\x84\x43\x5c\xb1\x23\x3e\x06\xf6\x0c\x4e\xdc\xd1\x22\xb4\xed\x28\x9d\x6f\x06\x6c\x9a\x41\xaa\xba\x2e\x37\x0d\xd2\x3f\x86\x7a\xf0\x24\x38\xee\xc3\xd6\xc0\xb5\x1e\xa3\xd4\x65\xe0\x9b\x37\x38\x34\x92\x82\x36\x2e\x85\x8e\x5c\x71\xef\x73\xf8\xef\xc4\x99\xcb\x92\x5f\xf3\xb5\x9e\xc6\x31\x34\x59\x01\xc1\x4a\x14\x9c\x90\x58\x08\x5a\x50\xa5\x17\x04\x96\xac\x25\xb9\x14\xd0\x9a\x67\x2b\x60\x3c\x84\x49\xdd\x08\x06\x0f\xd7\x2f\x97\xa5\x73\xb3\x27\xc6\xee\x80\x4f\xa7\xc3\x32\xdb\x0f\x8a\xa7\x88\x09\x01\xea\xca\x25\xe1\x29\xc2\x1a\x80\x04\xbe\x23\xf2\xf6\x3a\x50\xd3\x08\x4f\x80\xb3\xb0\x6f\x60\x1d\x7b\x5e\x24\x91\x1b\x1f\xf8\x09\xa6\xf4\xe7\xb1\x72\xcc\xf0\x5e\x10\xdd\x78\x88\x16\xc5\xbd\xdf\x30\x64\xda\x9a\x37\x7f\xf2\x13\x0a\x79\x5f\x4c\x7a\xe6\xee\x1a\xd8\xf5\x36\xbf\x57\xf4\xa4\x96\x99\x34\x52\xeb\xca\x25\x73\x2f\x2d\x1c\xdc\xdc\x0b\x89\xf1\x04\xba\xf2\x97\x6e\xf6\x14\xa5\x38\x88\x79\x45\x68\xbc\xff\x95\xf1\x46\x09\x84\x21\x10\x50\x57\x04\x38\x0e\xaa\xd5\x36\xe1\xec\x26\xee\xbc\x79\x49\x62\x56\xa9\x01\x03\x89\x5c\x40\x04\xac\xa1\x3a\xd0\x17\x0e\xa5\xb4\xcb\xa6\x82\xc3\x6d\xf0\xf1\xba\xd4\x66\xa7\x66\x65\xda\x05\x63\x9b\xa4\x7f\x18\x1a\x78\x57\x1a\x19\x8a\x32\x81\x21\x14\xb2\xcc\x52\x66\x46\x32\xcb\xfd\xaf\x76\x42\x38\x9c\xe5\xe2\x1b\x23\x32\x6b\x84\x3a\x91\xcb\x4d\x01\x6e\x48\xfc\xc7\x83\xf3\x5d\x8e\x86\x6d\xa0\xe6\x4f\x22\x33\x7f\xc1\x62\xd9\xf8\xbe\x58\x12\x24\xb9\x70\x00\x28\x7c\x34\x2d\xdc\x88\xa7\x4c\x2c\x40\x6b\x40\x99\xe7\x2f\x22\x39\xf5\x5c\x44\x98\x5e\x5e\xcd\xaf\x2c\x23\xe7\x40\xdf\x9e\x97\x3b\xa4\x85\xb7\x8e\xe4\xa8\x04\x09\x28\x74\xf8\xa2\x50\xc9\x34\x2e\xa4\x33\x6b\xb3\xfa\x60\xe2\x9a\xa5\x35\xd5\xfc\xdd\x6d\x4f\x0d\x91\xa0\x56\x1b\xa6\x44\x04\x8b\xcc\xb7\xbb\x0e\x28\x08\x38\xb3\x9a\x04\x45\x47\x29\xe5\x40\x30\x69\x94\xc0\x30\xd3\xe2\x09\x21\xb7\x23\xb8\xa8\xd7\x84\xa0\x71\x5a\xf0\x9c\x20\xee\x40\xee\x2e\x79\x49\xfa\x9c\xde\xc1\x49\x12\x06\x3f\x3c\x9e\x0b\x4c\x42\x4a\xcd\xe7\x33\x81\xad\xdb\x96\xdb\x05\x76\x59\x92\x6c\x55\x54\x0e\x05\x20\x70\x3b\x01\x76\x65\x4d\xf7\x4f\xdf\x14\x20\xde\x2c\x12\xce\xf2\x9e\x60\x79\x39\x2c\xb7\x52\xfe\x85\xea\x39\x00\xe9\xbd\xcc\x04\x60\xb2\xb7\x41\xd1\x71\xe1\x8f\x66\xaa\x8f\x19\x93\x67\xc4\x7e\xb8\xb2\xee\x74\x9f\x45\x90\x9e\x2d\x4c\x97\xec\x08\xf7\x36\xc2\xcf\x3a\x24\x1d\x3f\x5b\x7c\x7e\xd7\x7d\x76\x7f\xf1\xb9\xbe\x2a\x47\xfe\xc9\xc2\x41\x01\x97\xf6\x7e\xbf\xf8\xb5\xef\x7a\x40\x0a\x1b\x78\x4e\x56\x05\x5c\x60\x78\xca\x90\xf4\xd9\x20\xff\x80\x24\xd0\xce\x2c\x4a\xbb\xee\xfa\xc1\xa6\xc3\x04\x01\x2b\xc2\x81\x91\xec\xbb\xe4\x4b\xa2\x90\xcb\x42\xf0\x6b\x92\xc1\xe1\x88\x0c\xba\xd0\xe4\xdc\x2e\xe0\x4d\x05\x6c\x67\x6b\xdc\x41\x40\x85\xeb\x0e\xc9\x9d\xae\xb4\x1b\x5c\x1a\x5c\xa7\xb4\x16\x53\x30\x0f\x5a\x91\x64\xf0\x94\xf1\xe5\x80\xbb\xfa\x2b\xdc\x1c\xa7\xad\x99\x6a\x23\x20\x6b\x14\xc6\x88\xd6\x1a\x40\x18\x72\x92\xb0\xc3\x95\xdd\xda\x6e\x14\x9e\x09\x83\xf3\xa6\x5e\xe0\xc3\x62\x64\x35\x09\xb8\xf5\xb4\xaf\x88\xb5\x16\x70\xce\xbf\xd9\x00\xe8\x6b\x63\x49\x90\xf6\xa7\x02\xc6\x85\x5e\x50\xbe\x70\x6e\xdc\xbc\xaf\xe5\xac\x81\xc3\x20\xa0\x3e\x85\xeb\xbd\xb1\xf4\x8e\x7f\x87\x2f\x31\x3d\xa4\xd1\x59\x77\x39\xff\x5b\x7c\xe4\x8f\xf7\xe3\x69\xf1\x1d\x12\x13\xa5\x33\x1d\x51\x65\xfb\xd7\x5b\x7b\x18\x52\x7a\x42\xf9\x61\x94\x54\x3e\x2b\x00\xc4\x78\x26\x00\x0e\x14\x40\x3d\x5a\x0b\x62\x4b\x56\x2c\xc2\xfb\x0f\x1c\x0c\xa9\x08\x60\xf1\xb2\x9b\xb2\xa0\xe3\xd0\x80\x84\x85\x0c\x42\xf8\x12\xe2\x1b\x1f\x06\xea\x0f\x6c\xa9\x48\x3a\x88\x7c\x72\x84\xb3\xba\x72\x76\xf3\x77\xe0\x70\xb3\x7d\x40\x00\x20\x44\x85\xda\x25\x3c\xe9\x08\x3a\xa6\x13\x9a\x10\xd6\xeb\x64\x9f\x47\x26\x15\xcd\x85\x05\x07\x88\x06\x80\xb9\x47\xe1\x25\xbc\xeb\x5d\x4f\x0a\x56\xe9\x57\xa7\xc7\x7d\x06\x14\xd0\xe1\x86\x35\x02\xe3\x82\x27\xf4\x45\x5f\x22\x73\x3f\x00\xab\x7e\xe4\x84\x90\x23\x24\xd9\x24\xdc\xb4\xd5\x35\x82\x2e\x3c\xc3\xfb\xb7\x6b\x14\xed\x00\x02\xdc\xc2\xac\x6e\xde\xd0\xf9\x11\xb3\xdf\x19\x3d\x43\x26\xda\xa6\xd9\xb4\x82\x44\x77\xec\x30\x8c\xcc\xd9\xcf\xd7\x37\xeb\x9a\x66\x0e\x4f\x74\xdb\x09\x05\xe0\x00\x90\x5b\x16\xaa\xaf\x62\xb1\xcf\xd6\xc0\xb1\xa1\x14\x01\xb6\xfd\x7f\x45\x71\x7a\x0d\x37\x75\x09\xaf\x8b\x5e\xfe\x67\xc4\xb3\x54\xcd\x06\x45\xbc\x25\x1d\x0a\xb3\x35\x35\xc9\x3e\x11\xd0\xa2\x0d\x23\xf2\x68\x0a\xcf\x20\x1e\xd5\x0b\xc6\x26\xf8\x10\x6a\x6f\x7a\xab\x14\x62\x98\x30\x8e\xb0\x8a\x6f\x21\xb4\x7e\xcc\x0b\x24\xe8\x8e\x60\xc7\x0e\x0f\x51\x09\xbf\xf4\x1c\xfd\xfb\xa3\xe4\xdf\x0f\xe9\x2b\x87\x58\x66\xd3\x03\xfe\xc7\x4b\xec\xb6\x28\x7f\x0f\x6d\x44\x82\x14\x28\xc6\x75\x47\xe0\x04\x4f\x3e\x90\x8a\xb8\x58\x38\x73\x58\xed\x55\x09\x24\xc5\xfe\x15\x6c\xe2\xec\x78\xff\x7a\x02\x5f\xb1\x99\x50\x58\x50\x0d\x65\x68\x2f\x26\x3f\x02\x09\x71\x3c\xc6\x1e\x21\xa1\x41\x05\x09\x85\x1e\x84\xfc\x5f\x47\x6a\x67\x2f\x43\x3b\xc9\xb8\xa9\x1f\xca\x03\xca\xe7\xd3\xd3\x6f\x9f\xb1\x50\xeb\xf4\x5b\x55\x7f\x98\x58\x87\xf0\x6d\xd7\xed\xdc\x8f\x6d\x35\x63\xe1\x2b\xca\x69\x4f\xcc\x55\xd5\x98\x15\x7e\x7c\x8e\x02\x0f\x84\x61\xfc\xfe\xac\x34\x5b\x9a\xe9\x63\x62\x97\x92\x6e\x1e\x00\xfd\x43\x65\x0f\x52\x36\x37\xaa\x81\x18\xfc\xeb\xc0\xca\xe5\x62\xc1\xc9\x71\xf9\xf2\xcb\xd6\xd4\x4b\xee\x87\xd5\xca\xa6\xbb\x36\x6d\xbc\x1b\x5f\x35\x5b\xc0\xf8\xa7\xfd\x76\x6b\x48\x6d\x7e\xb9\x7f\x7b\x4d\x03\x6d\x9a\x1d\x9c\xbc\xad\xa2\x5a\x4f\xe1\xc4\xd1\x88\x20\xaa\xa5\xa2\x3f\xad\xf2\xd5\x79\x63\x97\x49\x0d\x26\xfa\xcb\xc9\xb3\xb6\x2c\x69\x22\x7f\x8e\xf4\x6b\xd0\x0a\x68\x64\x00\xe8\x53\x94\x43\x93\x0a\x9f\x85\x09\x25\x69\xd2\x7f\xce\xaf\x19\x89\xe6\xdd\xf4\xe7\x89\xa9\x76\xe7\x86\xe8\x70\x5f\x55\x2b\x7a\x45\x17\x8b\x09\x2a\x84\x62\x54\x30\x9b\xea\x0c\x58\xa2\xd7\xb0\x41\x8b\xbe\x25\x79\xdb\xd2\xee\x48\xd0\x86\x58\x64\xd5\x6c\x7b\x54\x32\xc2\x0d\xff\xe8\xde\xfc\xe3\x74\x08\x20\x37\xff\xf5\x61\x8e\xf2\x31\x68\xdc\x5d\x5f\x6f\x00\x3d\xff\x0c\x94\xd2\x75\x58\xb6\xaa\x51\x80\xdd\xf3\xea\x3a\x40\x3c\x66\x0b\x15\x89\x69\x4b\x2a\x1b\x91\x3c\x3b\xc0\x42\x51\x13\x46\x55\xfb\x57\xd8\xc6\xfc\x32\xda\xa6\x2e\x05\x73\x91\xf2\x72\xb4\x29\xbf\x3e\xfe\x3c\xe0\x8d\x61\x44\x9c\x3f\xc3\x50\x15\x75\x11\x71\x45\x65\x28\x51\x65\xf3\x33\xbc\x01\xcb\xaa\x5f\x85\x29\xb0\xde\x89\xb6\xb1\x60\x3e\xa9\xf8\xf0\xae\xfb\x10\xfb\xa9\x37\x40\x2f\xd6\x52\xf3\xb8\xbc\xc6\x77\x01\xee\x8c\x30\x75\x9f\xaa\x05\xc8\x1c\xba\x6c\xda\xb6\x5c\x76\xb9\x2d\x08\x2c\xcc\x99\x4d\x8b\xe8\x8b\xb4\x94\x28\x13\x85\x05\xb6\x25\x32\xa9\xcd\x34\xe0\xf7\xc0\x8c\xcb\x55\xef\xeb\xe8\xb6\x7b\x41\x1a\xb4\xe5\x07\x91\xd6\x85\x62\x4a\x54\x41\x22\x86\x56\xeb\x96\xf9\xa2\x2c\xeb\x79\x67\x36\x65\x3d\x60\x2c\x71\xa5\xc0\x50\x18\x7b\x8d\x72\xa2\x8e\x1e\xa7\x5d\x33\xcf\x9b\x25\xf8\xea\x60\x53\xa0\xb8\x07\x2d\xbf\x1f\xd7\x4e\x8e\x35\xef\x00\xe7\x0c\xda\x0f\xf1\xcf\x48\x4b\x06\x04\x6a\x05\x8b\x5e\x65\x18\x94\x6a\x93\xb9\x84\xca\x77\xcd\x34\x6c\x8e\xdf\xef\x70\x62\x63\xdc\x77\xb4\xc7\xfc\x8e\x1b\x14\x99\xc2\xdb\xd1\x92\x85\x51\x24\x82\x61\xc1\x58\x44\xcb\x57\x48\xbb\x09\x27\x75\xc4\xd2\xf1\x70\x76\xed\xe8\x4b\x80\x6b\xf4\xe4\xc2\x60\x18\x00\x40\x7c\xb3\x7e\xd7\x38\xfb\xb7\x28\xba\x81\xd2\x4d\x7c\x80\x87\xc7\xf0\xef\x2d\x8f\x70\x60\x00\x26\x91\x86\xa0\xe8\xbb\x96\x9d\x26\x60\x2e\x7f\x81\xc7\x16\xc9\xc3\x57\xab\x54\xae\x54\xc2\x15\x43\xda\xf0\xf5\x74\x52\xc1\xb9\xa1\x54\x80\xd7\x48\x92\xd0\x48\xf3\x58\x37\x74\xe2\x0c\xe5\x6f\xd7\x8d\x08\xf3\x00\x3a\xc2\xf2\xfa\x29\x30\xd4\x68\xc0\x22\x0a\xfa\x9c\x76\x56\x19\x06\x91\x55\x49\xbb\x89\xa7\x05\x51\x61\xbb\x29\xaf\x52\x72\xb0\x4e\xe7\xa2\x5c\x1a\xf6\x15\xb4\xb6\xf2\xec\xa2\x34\xcb\xa1\x48\x07\x39\x63\x54\xe3\x9e\x5d\xf9\x4e\x8f\x0f\xf7\x73\x31\xe8\xe7\x08\x88\xcc\xce\x6b\x81\x18\xde\x49\x6a\x85\x9b\x0d\xab\x13\x84\x97\x32\x8f\xf1\x39\x11\xd9\x87\xaa\x0f\x83\x17\x05\x45\x17\x2a\x93\x83\xd7\x1b\x4e\xdd\x9e\x21\xef\xc8\x14\x92\x17\xd2\xb1\x60\x0a\xe8\xb2\xaa\xc2\x83\x10\xb3\x33\x26\xad\x91\x7f\x11\x7c\x8e\xc7\x60\x52\x08\x0e\xfb\x09\xd3\x44\xfd\x8f\x23\xe3\x45\x9e\x6c\x2e\xd3\x5e\xa1\x51\x0b\x49\x93\x22\x52\xb3\xcb\x0e\x85\x67\x81\xfc\x18\x59\xa0\x8d\x4f\x22\x17\x1f\x21\x8f\xb7\x42\xe5\xba\x1f\x3e\x1d\x7b\x07\x77\x47\x46\xf6\xd3\xb8\x79\xd3\x24\xbd\xf4\x8c\xd0\xb2\x5d\x20\xee\x26\x19\x0c\x57\xf6\x3f\x73\x43\x26\x6c\xca\x35\x5f\x10\x01\x15\xdd\xac\xa7\x40\xc0\xed\xff\x29\x84\x54\x7c\xad\x80\x30\xc5\x4b\xf8\x62\x02\x0f\x53\xbd\x2e\x45\x5d\xe6\x05\x83\xaa\x15\x13\xfd\xdc\xe4\xa2\x81\x67\xbc\x21\x73\x51\xd2\x7a\xe1\x53\x18\x0c\x18\xd1\x66\x2e\x11\x98\x89\x2d\xdd\xd5\xec\xa4\x5f\x54\xd6\xe1\x6b\x6d\x22\x9b\xba\xb3\xa6\xaa\x9a\x97\x28\x53\x3b\x2d\x37\x2a\x52\x83\xe1\x5b\x04\x41\x32\x9e\x22\x8d\x0a\x40\xe9\x35\xac\x7b\x7d\x8d\x53\xb2\xd2\x0a\x85\xbf\xd8\x4a\x7e\x72\x0f\x70\xad\xe4\xe7\x31\x20\x77\xfc\x80\xb2\x9e\xed\x94\xb0\x39\xe2\xfb\xf6\x12\xba\x8e\x2c\x43\x05\xdd\xe1\x0b\x4e\x4f\x01\x4a\x99\xc2\xdb\x11\xda\xc2\x15\x01\x24\x58\x33\x3b\x4b\x93\x3e\xd8\x4d\x2c\xd0\x40\x5e\x48\x6d\x0d\x5f\x4c\xd4\x1e\xf1\x44\x4c\x11\x73\x5d\x88\xec\xfd\x49\xb2\xe7\x6c\x22\x02\xc8\xc1\xa5\xb4\xbb\xc8\x01\x67\xa7\x0d\x69\x15\x94\x39\x43\xeb\x8a\xca\x2e\x49\x04\xe5\x82\xe1\xc5\x84\xa4\xa9\xe9\x83\x3b\x59\x95\x55\x09\x4c\xf9\x43\x86\x2c\xe6\xc0\x7a\x9b\x2c\xec\xd1\xc3\xc9\x64\x87\x67\xb7\xf4\xd6\x94\x72\x94\x28\xe2\x57\x9b\x4a\xb5\xbd\x25\xf9\x4e\xcc\x66\xfb\x67\x16\x91\xbe\xb4\x43\x5a\x85\x90\x96\x7f\x71\x33\x2e\xfe\xa2\x67\xe1\x46\xac\xa1\x67\x79\x85\x8a\x09\x6c\x26\x26\x60\x52\x98\x25\xc9\x68\xf7\x83\x6c\x5c\x87\x7f\x2c\x0d\x50\x69\x78\x79\xb7\xde\x02\xb9\x8f\xc8\x28\xff\xd0\x8b\xa0\x12\x95\x11\xf7\x3c\xb3\x1b\x29\xf2\xd8\x6c\x2c\xe6\x78\xa3\x57\x8a\x0e\x1f\xd5\xa4\x67\x68\x22\x4a\x4f\xef\x89\xad\x6a\x27\x50\x31\x6a\x05\x8d\x5c\xb6\x68\x7f\x33\x15\xcc\xa4\xdf\xad\x90\x03\xd6\xed\x4e\x6f\x62\x9f\x15\x7b\x8e\x96\x77\x43\xaf\x2b\x54\xb1\x84\x7b\x3c\x3f\x1b\x74\x2b\x76\xaa\x77\x7d\x68\xe2\xec\x21\x59\x96\xea\xf2\xaa\x2a\x63\x23\x54\x67\xd9\x08\xd6\x78\xf3\x1d\xb5\xc1\xe1\xd3\x52\x8b\x37\x2f\x7a\x11\x91\x0e\x2a\x1f\x6c\xdd\x97\xb3\x67\x7d\xbb\x23\xd9\x58\x6e\x24\x2b\xca\x7a\x51\xdd\x2f\xae\x58\xf4\x23\x52\xf6\x58\x53\x8f\x84\x33\xd9\x27\x09\xb8\x1d\x34\x1f\x78\x20\x4a\xfa\x00\xb5\x23\x9a\x7e\xe7\xf5\xd7\xbd\xeb\x9a\xad\xe2\xc2\xa0\x67\x66\xa3\xd7\x6d\x3f\x40\x8b\xcb\xf3\xa6\x71\x22\xf0\x97\x46\xc4\x3f\x8a\x50\x9a\x65\xfe\x79\x23\x39\x49\x69\x70\xea\x75\x5f\xf1\xfa\xac\x5c\x52\x98\x12\x60\xc5\xba\xd3\xda\x72\x67\x23\x95\x5b\x93\xb5\xeb\x77\xc8\xbc\x87\x8d\x20\xcc\x35\xb7\x5b\xe4\x84\x1f\x64\x26\x1a\xb8\x2b\xf8\xf2\x3b\x41\x5e\x84\x77\xa6\xe9\x04\x0f\x40\x1a\x1d\x02\x31\x93\xa3\xc0\x06\x34\x9e\x82\x90\xc7\x76\x1e\xa2\x59\x38\xd3\x54\xab\x58\x2b\xec\x17\xe4\x29\x46\x32\x31\xf7\x35\x58\x20\xe0\x0d\x84\x50\xde\x31\x4f\x2a\x3c\x52\x2b\x02\x91\x49\x31\x5f\x84\x42\x90\x11\x72\x5e\x2b\x1b\x2f\x83\x33\xf1\xa6\xfa\x39\x4c\xf3\x55\xf8\xed\x10\x06\x2c\xdf\x01\xff\x46\x9b\x69\xf1\x0c\xb5\x03\x44\xc0\xa1\xe8\xcc\x90\x90\x1c\xb5\x3a\x88\xc9\xe8\xb6\x08\x26\xbc\x68\x94\xf4\xe4\xa9\x47\x98\x4a\x46\xff\xdd\x78\xca\x38\x15\x89\xc2\x41\x10\x2b\xe4\x32\x0e\xc8\xa9\x95\xbe\x94\xc6\x86\xfa\x65\x56\x93\x79\x29\xc2\xf2\x27\xad\xdd\x92\xcc\x3c\xc7\xf4\x29\x6a\x27\xd1\x3b\x5a\x68\x34\x11\x35\xe9\xc4\x86\x08\x31\xf4\xca\x08\xd2\x86\xc5\x42\x97\x28\xcd\xf1\x5d\xeb\x17\x91\x06\x3e\xf2\xb2\x3d\xa4\x23\x76\x5c\xab\xd1\x0b\xc2\x75\xf8\x5e\xf8\x89\x42\x09\x22\x59\x5d\xf1\x4a\x15\xaf\x59\x05\x5e\xd2\x43\x2a\x6d\x98\xda\x4b\x05\x8d\x47\xbc\x2c\xa6\xc1\x0c\xcb\x6e\x81\xae\x23\x71\x35\x1a\xfe\xc8\xbb\x84\x94\x5b\xcd\xb6\x72\x22\x57\x8c\x30\x1f\x00\xc2\x73\x91\xa0\xb3\x2e\xb9\x53\xf4\xf7\x45\x3e\x1d\x85\xad\xaf\x07\x8f\x68\x04\x61\x4a\x12\x9a\x0f\x26\x66\xb5\xa2\x3b\xc0\x7b\xa0\xb4\x99\xea\x1a\x33\x99\x29\x56\xce\x2b\xaa\x50\xdc\x97\xcd\x13\x55\x16\xea\x58\x86\xea\x2b\xb2\x57\x54\xe5\x15\xc1\x7f\xaa\xbe\x42\x6a\x28\xd6\x58\x25\x22\xdc\xf7\xd6\x55\x0d\x65\xec\x41\x5b\xe5\x67\x9b\xe2\x26\x5c\xf6\x28\x60\x26\x37\x74\xa7\xab\x47\x1c\x25\x77\xc0\x93\x5a\xf1\x2d\x48\xc9\x2e\x1c\x14\x59\xb5\xb0\x79\xca\x8f\x11\xa1\x46\x90\x74\xf3\x77\x4b\x2c\xb4\x33\xa4\xbc\x75\x29\xb9\x02\xbc\x27\x9a\xc9\xaa\xca\xe3\x02\xaf\x41\x34\x06\xde\x85\x82\xe0\x18\xb7\x0c\xa1\x8c\x0d\x81\x61\xe5\xa4\xcc\x42\xa3\x13\x20\x8d\xf6\x6f\xf1\x36\xb0\x4d\xb1\x68\x09\x3e\x73\x5d\xdb\xd4\xeb\xcf\x9f\x9b\x0b\x83\xee\x5d\x6b\xc4\x65\xde\xd5\xeb\x8b\xcf\xee\x4b\x79\xf1\x60\x07\x74\x58\xe7\x99\x40\x04\x57\x32\x9b\xc2\x7b\xf5\x99\x89\xfc\x3f\xf6\xff\x40\x23\x75\x7c\x74\x93\x4d\x40\x5f\x10\xa2\xb9\xb0\x41\xdd\xa0\x39\x1c\x3c\x46\x49\x4b\x52\xa4\xa1\x84\x0e\xa6\xdf\x35\x34\x86\xa3\x4e\x76\xde\x37\x06\x7b\x99\x7a\xd8\x4d\xf7\x34\xe6\x73\x95\x00\x8e\x84\x38\x44\x7e\xec\x02\x4f\x21\x13\x53\x12\x3e\x92\xe5\x68\x5b\x22\x5e\xa8\xed\xc9\xb0\x99\x41\x22\x11\x9e\xc2\x3e\xb2\x90\xc7\xae\x82\xec\x41\xbb\x40\x73\xbb\x81\xec\x1c\x0b\x97\xa9\x44\x58\xa0\x24\x00\x26\xbd\x5a\xf1\x26\x32\xb3\x70\x18\x28\x3f\x50\xc4\x86\x1b\x23\x68\x4d\x17\xe3\x11\x5b\x2a\xcd\x0f\xe8\x2d\xaf\x38\x82\xe0\x52\x49\x42\x82\xde\xc6\x31\x1b\x1b\xb2\xf5\x97\x65\x02\xca\xb7\x20\xb5\xc1\x24\x74\x33\x92\x6d\xc8\x77\x20\x43\x6b\x11\xaf\x09\xe4\x1d\x89\x80\xf8\x14\xf7\xaf\x57\x44\xf5\xb0\x47\x94\x3f\x71\x72\x09\x51\xae\x93\x8d\xe5\x1c\x09\x01\x22\xbe\x93\x4f\x0c\xaf\x4f\xa9\xf7\x15\xc0\x29\x9d\x51\x78\xc1\x76\x3a\xd2\xff\x56\x00\x12\xab\x15\x4d\x4d\xba\x66\x03\xe0\x98\xf4\x62\x51\xb2\x54\x01\xe3\x95\xf6\xe1\x0e\xf6\xe1\xf1\x0e\xf3\x72\x31\xd6\x89\x50\x04\x4a\x06\x98\xcb\x6b\x9c\xd8\x64\xaa\x15\x88\x0c\x5c\xda\x8e\xa5\x98\x4c\xbb\xa1\x0c\x98\x0c\x86\x5d\xca\x1c\x32\x5d\x6e\xdb\xb8\x73\x9b\x1d\x67\x8c\x79\x7a\x71\x41\x18\xc7\x3c\x7d\xbd\xb0\x35\x32\xea\xda\x95\x7c\x09\xe7\xcc\xa3\x23\x75\x49\x66\x13\xbc\x2b\xc6\xd7\x77\x01\xf1\x1a\x6a\x31\xa7\x3d\x4d\xb7\xa1\x6c\x5d\x43\x02\x3d\x17\x20\x50\xb6\x19\xb6\x81\x9d\x68\xc4\xd6\x86\x5b\xef\xff\x6f\xc5\x59\xfc\xfc\x71\x55\x3e\x2e\xc7\x1b\xf6\x0c\x3f\x59\x5d\x1b\x49\x8c\xfa\x6b\xc5\x75\x17\xfd\xcd\x1b\xd9\x29\x24\xa6\x60\xce\x9d\x3f\x49\x2b\x8f\x93\xda\x74\xf6\xec\x3e\xf2\xe0\xe4\xd1\x74\xe2\x67\x20\x04\x12\x50\x91\x78\xca\x74\x10\xe5\x96\xa7\x81\x7f\xd0\xf6\x57\x48\xc3\x8e\x5f\x28\x01\x2c\x76\x8f\xc2\x46\xb1\xde\xcb\xaf\x37\x5f\xab\xac\x32\x2d\xe7\x93\x28\x9d\xbc\xdd\xf9\xfe\xb9\xc1\xe5\x0b\xbb\xd0\xb9\x0f\x8a\x93\x81\x5c\x17\x6a\xd3\x6e\x01\x66\xa8\x9b\x4d\x83\x6c\x11\x7a\xa1\x00\x60\xa3\x7f\x0a\x32\xed\x6a\xfe\x55\x97\x89\x6b\x08\x5e\x6b\xa4\x9a\x3a\x8f\xd6\x78\x01\x82\xd8\xe2\xe3\x0f\xd8\xed\x44\xcf\x3e\xc6\x3e\x32\xf7\x98\x98\x1b\x6d\x9d\xa1\xbc\x00\x47\x43\x30\x12\xf4\x47\x06\x2c\xf1\xb1\x98\x5d\x25\x24\x2b\xbc\xc9\x0c\x11\xb0\x4c\x81\x85\x5b\x10\x5f\xbc\xc2\xc0\x27\x84\xc5\x8c\x9d\xc4\x08\x06\x84\x13\x38\x2e\x0d\x9b\x26\xe1\x63\x1d\xc9\xfd\x80\xba\x22\x97\x84\x78\x86\x2e\x9f\x21\x7a\x2c\xe9\x5c\x54\x03\x2f\x7c\x63\xa4\x72\x97\x0a\x31\x5f\xaf\x36\x79\x04\xa7\x44\x9d\xeb\x9c\xe0\xea\xc7\xbc\xfc\x11\x11\x00\x6c\xc9\xc0\x52\x4b\x25\x41\x8e\xbf\x7e\xf0\xec\x9b\x1f\x1e\x7d\xfd\x6f\x5f\x1f\x3f\x3a\x7d\xfc\xc0\x93\x1e\x1f\x78\x83\xdf\x6c\x62\x0f\x22\x53\x19\x7f\xb4\x7d\x36\x7d\xb1\x3e\x66\x2f\xe0\x70\xfe\x59\xa5\x80\x8c\x3d\xd6\x61\xdc\xb5\x6e\x6d\x79\x5d\xd6\x68\xce\x2c\x6f\x9d\xa8\x2a\x46\x4f\x71\xf2\x13\xca\x35\x5f\x4c\x58\xdb\xb0\xff\x7f\xbc\xac\x36\xa8\xc1\x0e\xe9\xea\x83\x9e\x4c\x1d\xd7\xcc\x82\x0c\x28\xaf\x1b\xf1\xb0\xd3\xba\x24\xa5\x81\x5d\x45\x0e\x03\x7d\xf6\x04\x25\x5d\x72\x54\x00\x13\x19\xb6\x01\xcb\xa4\x9b\xdb\xd7\x96\x58\x3f\xbf\xab\xd3\x09\x22\x19\x60\xc5\xf1\xd1\xfb\x81\xb4\x85\xe4\xdc\x4f\x5f\xf1\xa3\xce\x83\x76\x25\x76\xdf\xe6\x33\xdb\x19\xe0\xc7\xe0\x6d\x75\xb3\x3b\x3d\xce\x73\x55\xa0\x75\xe8\x9d\xcf\xe1\x3c\x80\x46\xef\x80\x52\xc3\x2a\x9f\x0f\xfa\x43\x07\xf1\x25\x4a\x42\x87\xb6\x59\x62\xce\xd6\x95\x76\x69\x19\x71\x08\x1e\x8c\xcd\x3c\xcb\xc4\x8d\xef\x9d\xf3\x80\xfa\xc3\x99\xa0\x8f\xba\x2e\xef\x23\x04\x5f\x32\xfa\x69\x3b\x36\x2a\x1d\x08\xa8\x94\x75\xeb\x83\x4b\x7b\x93\x6c\x49\xef\x3e\x9e\x2c\xe1\x4a\x96\x63\x5e\xbf\x09\x41\x4d\xc0\x4f\xa2\xc6\xd8\x57\xed\x0b\xa0\xae\x59\xa4\x44\xc6\x2d\xb7\xba\x57\x47\x81\x18\x88\xa4\x46\xf1\xe4\x07\x13\x5a\x11\x29\x14\x1e\xc8\x0c\x93\xf9\x71\x39\x79\x7e\xf9\xf2\xba\xe1\xaf\x83\x03\xd7\x1a\x26\x75\x86\xdc\xe6\x1a\xab\x48\xa5\xe0\x15\xce\xc8\x12\x30\x28\xb3\xdd\xde\x8e\x99\x19\xfe\x84\xa1\x19\x34\x2c\x03\x7d\x58\xdb\xce\xae\x6b\xb4\x08\x96\xa1\x59\x02\x26\x4c\xc6\xd4\x17\xa3\x6c\x08\xa3\x3b\xd8\x49\x65\x97\xf0\x22\xa3\xf4\x11\xfe\x5d\x96\xfa\x7b\xb4\x7d\xc5\x75\x58\x4c\x85\xb3\x02\x60\xc3\xb0\x11\xce\xa2\x05\xb0\xfc\x1e\x6d\xc9\x7e\xd1\x5a\x33\x8c\x8e\xce\x0d\x73\x80\xd7\x6e\xf6\xa8\xb6\x48\x4b\xb1\x89\x23\x92\xc6\xf1\x6e\x23\x1d\x6c\x55\x96\x67\x08\x64\xc9\xfb\x0a\xfe\x85\x1b\xe9\x7b\x13\x8b\x5f\x3a\x35\x6f\xea\x9b\x9c\xda\xaa\x3c\x33\x7d\xa5\xaa\x99\xd9\xb1\xf8\x3e\x11\x13\xcd\x5a\x19\x89\xea\x00\xa8\xb8\xaf\x31\x66\x07\xaa\xa1\x92\x6f\x7c\x0e\x8f\xbc\x2a\x08\x59\xc3\x02\x25\x25\x28\xa8\x72\x44\x58\xf5\x4b\x95\xbe\xea\xf7\x78\x16\x08\xaf\xf0\x3e\x27\xfa\x1f\x19\xc0\xa2\x92\xf7\x12\xf5\x09\x6c\x4c\xdd\x08\xb3\xcd\xdf\x01\xdb\xb8\xe2\x23\x62\xd3\x61\xa4\x8f\xb5\x11\x10\xe8\x2d\x11\x7a\xdc\x26\xb8\xf6\x25\xc5\x3c\x6d\xd1\x15\xd3\xc3\x67\x7a\xf6\x4a\xc7\xe2\xfd\xeb\x44\xd5\xd5\xe4\x72\xf5\xfb\x2a\x0b\x93\x4e\x89\x05\x70\x57\xf5\x72\xc8\x04\x38\x5b\x9f\x03\x3e\xa4\x83\x74\x93\x97\x68\x1f\x81\xba\xa5\x63\x62\x50\x23\xf5\xd2\xda\x5c\xe3\xf7\x7f\x43\x9d\xd2\xcd\x6f\x37\xff\x8e\x8a\x4d\xb8\xad\x74\x85\x9c\xbf\x32\x99\x33\xb3\x68\x92\xe0\x9c\x97\xe7\x62\x6f\xda\x9c\xcd\xe9\xdc\x91\x56\x89\xde\x07\x64\x79\xe1\x0f\xb8\x42\x80\x7e\x60\x9b\x81\xf5\xad\x28\x50\x04\x2d\x1c\x97\xf8\xd1\xdd\xd5\xc7\xde\x6f\x27\x83\x37\xd4\xac\xa0\x94\x7c\x44\x6f\x35\xfe\xda\x30\x23\x09\x78\xb4\x85\xc7\x0d\x8e\xea\xf5\xbb\x35\x57\xb7\x75\x94\xa9\xaf\x00\x52\x56\x73\x54\x0d\x67\x78\x30\x71\x63\x9a\x48\x7c\x11\x0e\xc9\xf0\xd4\x87\x17\xd1\x90\x0c\x71\xf1\xe1\xa7\x88\x08\xc6\xe4\x11\x40\xec\x5f\x2c\xaa\xbe\xbc\xf3\xb9\xc6\x25\xd1\x07\x40\xbb\xa4\x1b\x47\x23\xbe\xce\x2e\x9c\xd4\x98\x32\x32\x57\x50\x7d\x1c\x7b\x15\x7b\x70\x1d\xa9\xa9\x9c\x02\x73\x01\xf4\x40\x05\xe7\xe4\xfb\xdf\x3c\x7a\x46\x3e\xc9\x48\x3d\xb0\x4d\x18\xf9\xfa\x91\x48\x56\xe2\x29\x90\x1b\xa6\x76\xbd\x43\xdb\x4f\xe7\x98\x2e\x45\xe0\x98\x7d\xa7\xfe\x3a\xe2\x6f\x05\x57\x63\x8b\x3e\xd8\xb8\x0e\xee\x27\xf1\x4d\xe8\x43\x5f\xc1\xcf\x04\x2d\x35\x25\x48\x03\x1a\x2d\x21\xb1\xc3\x4d\x91\xe5\xe2\x69\x1d\x91\x8d\x69\xb8\xef\xac\x40\x46\x73\x28\xef\x79\xe2\x42\xd7\xa2\xfe\x0f\x27\x38\x50\xfc\xcb\x2d\xa4\xe7\x47\xcf\x44\x9f\x1f\x80\x14\xfa\xae\x0f\xab\x2f\x60\x8f\x64\x57\x56\x67\xb9\x85\x83\x19\x7b\xe1\x58\xdc\xb5\x65\x56\x23\x52\x92\x23\xf1\xb8\xbb\x82\xcb\x57\x6f\x80\x06\xc4\x90\x46\xe1\x83\xa7\xb3\x8f\x99\x2f\xe9\xe2\xda\x6a\x92\x15\xac\x68\xff\xbf\xff\xf3\xff\xba\xf7\x15\xed\xc5\x57\x5d\x5b\xdd\xfb\x4a\x55\x90\xdc\xb6\xc7\xa6\x78\x48\x34\x0a\xfb\x1f\x8c\xd9\x88\xf6\x35\x21\x19\xd8\x7e\xc6\x30\x8c\x73\xc8\x5a\x92\x74\xd1\x88\x6c\x60\x54\x36\x4c\x89\x55\xd8\x54\x10\xa4\x5d\xa9\x76\xbb\xdd\x78\x1c\xe4\x26\x28\xcf\xf0\x8e\x7f\x86\x9f\x60\x33\xf9\x4b\x6f\x97\x9b\xf9\xba\xb7\xab\x12\x30\x8f\x33\x41\x88\x67\x84\x78\xe9\xce\xad\xe3\xcb\xc1\x10\x3f\x7c\xd9\x62\x2f\x15\x7a\xc1\x97\xcd\x16\x2d\x66\x72\x57\x95\x04\x3b\xb1\x51\x0d\x90\xe9\x2b\x14\xcf\xf7\x68\xc7\x88\xf6\x05\x3c\xd2\xb1\x37\x3e\x57\xcd\x20\x42\x40\xd4\x06\xad\xc3\x05\x0e\x2f\xf0\x81\xc9\x88\x12\x26\x24\x60\xde\x14\x66\x63\x9c\x58\x65\x53\xca\x23\x14\x0b\xb3\x08\x13\xf5\x3b\xa6\x22\x12\x1e\xf8\xce\x0f\x26\x13\x32\xd6\x7e\x8c\x91\x95\xe4\xa9\x7d\xc0\xaf\x6b\xd7\x96\xf8\x1d\xe8\xf7\x33\x5b\xa1\x61\xaf\x18\x49\x60\xe8\x90\xce\xac\x67\x7f\x86\xaf\x84\x45\xe8\x35\x16\xfb\x4a\x28\xe8\xb5\x23\x0c\x08\x84\x45\x76\x02\x5f\x31\x74\xd0\x7a\x2c\xe0\x0f\xc6\x09\x3a\x18\x1f\xa8\x32\x8b\x12\x35\x30\x9d\xdd\xff\xb3\x44\x41\xd4\x16\xee\x9b\xeb\xe0\xc0\xb0\x6f\x42\xfd\x28\x91\x45\xe3\x4a\xa0\x29\xc8\x34\xd5\x45\x56\xa9\xb0\x41\x55\x69\x5c\x49\xfe\x6b\x28\x48\xb2\x13\x52\x02\xb7\x06\x0d\x1e\x50\x52\xde\xb2\x2f\xb8\xe3\xef\x00\x03\x14\x56\xea\x39\x59\xc1\xb7\x25\x7f\x25\x2f\x29\x6c\xf2\x83\x98\x3b\xd5\x71\xd3\x9e\x2b\x21\xc2\x32\x74\xd3\x4e\x38\xc6\xc4\x25\xf3\xe1\xa4\xe0\xe5\x2a\x68\x64\x5e\x21\x6d\xcb\x27\xc5\x0a\x44\xb6\xee\xc2\x47\xbc\x12\xc7\x69\x32\x30\x12\xcb\xaa\x7e\x32\x81\xfb\x07\x73\x9a\x52\x78\x29\xd4\x6f\xb3\x68\x82\x1a\x6b\x19\xab\x2e\xb9\x38\x57\x55\x0a\x01\x28\x35\xf1\x1f\xae\x07\x1c\x56\x93\x15\xee\xda\x92\x96\xca\xba\x33\x3c\x24\x40\x22\x00\x3c\xec\x1a\x16\x60\x54\xeb\x2f\x4d\x4d\x06\x33\xd8\x27\x5a\xc2\xe3\xeb\x43\x9d\x3b\xbc\xe0\x18\xd2\x07\x8a\xf6\xff\xf0\x93\x50\x35\x37\xe2\x70\x34\x04\x95\x68\x10\xc9\xdc\xe8\x1a\xd2\x04\x7f\xf0\x8d\xf1\x22\x26\x13\xdd\xf6\x70\x83\x16\xe5\x1c\xc6\x34\x4a\x1f\x3e\x0a\x7c\x51\x20\x3f\xb7\x62\x08\xbd\x15\x67\x0c\x74\xe0\x46\xeb\x07\xe2\x41\x2e\x59\x30\xb5\xc2\xa3\x7a\x15\x5f\xc1\x9b\x37\x96\x89\x56\xb8\x61\x32\x22\x21\xe5\x45\x79\x86\xe4\x3a\x7e\x42\x78\xf2\xdd\x55\x61\x2b\x87\x86\x48\xa3\x08\x5b\xbb\x55\xc1\x87\x5f\xf4\xc3\x60\x3e\x35\x5c\xf1\x39\xfa\x82\xbe\x6c\x6d\xa7\xe2\xbf\x99\xfa\xb4\xbc\x2b\xb0\xcb\xbf\xbc\x7c\x36\x56\xa1\xc9\xea\xbb\xf1\x67\x02\x5f\xa5\xa5\x46\xc5\x31\x1e\x76\x91\xae\x22\x1f\x29\x5a\x24\xe9\x90\x11\x13\x31\xab\xe1\x55\x08\xe8\xf4\x18\x0d\xe8\xe5\x01\xb4\xd9\x5e\xd0\xdf\x47\x2f\x31\xdc\x18\xef\xef\x47\x9c\x58\x1c\xb2\x07\xd8\x8d\xc8\x89\xe7\xfe\xb4\x78\x42\x2f\x16\x3d\x2e\x83\x4e\x48\x6c\x07\xd5\xe0\x21\x75\x4d\xdb\x4b\xdc\xae\x74\x82\x26\xeb\x12\x85\xbb\x1b\x03\x94\x1f\x2a\xcc\x77\x24\x9a\x82\x63\x42\x2c\xe6\xd7\x01\x8f\x28\xec\x73\x74\x61\x96\x65\x35\x27\x13\xae\x99\x61\xdb\x0d\x2d\x22\xdc\x15\xae\x1e\x6b\xf3\x00\x68\x18\x95\x79\x40\x40\x11\x7f\xb7\xdd\xc5\xba\x48\x38\x82\xfb\x9f\xe9\x86\x7d\xfe\x61\x54\x33\xad\xf4\x61\x40\x17\x68\xa6\x20\x1e\x3c\x2c\x40\x8a\x8b\x53\x2b\xa7\xb8\x44\x26\xb9\x65\xff\x00\x11\xdb\xfa\x21\x6a\x1f\xc3\x05\xfd\x48\x76\x15\x50\x21\xd4\x79\xaf\xcf\x70\x7c\xc0\xd2\x15\x9e\xc2\xb2\xab\xae\x00\x37\xf2\x2d\xd0\x27\x28\x96\x6e\xb5\xb1\x97\x81\x42\x29\x5d\x6c\x54\xbf\xb1\x48\x47\x29\x60\x6e\x7f\x0f\xb7\xe2\x0e\x79\x8b\x79\x89\x8f\x0e\x1c\x1e\x71\xc5\x1c\xfa\x7c\xab\xb8\x88\x9f\x71\x7e\xd5\x82\x0e\x10\xce\xde\x8e\x3d\x52\x18\x1b\xca\xd8\x30\x49\x3b\x8d\x51\xb6\x1a\x16\x92\xd1\x14\x59\x7b\xb1\xae\x35\x77\xd0\x88\xb7\x26\xb1\xed\xc9\x2f\x84\x20\xdd\x45\x29\x8f\x3e\xd3\x87\x6c\x94\x91\x03\xac\xf3\x7d\xea\xd3\x5d\x21\xe3\x7f\xc5\x34\x88\xbc\xce\x72\x87\x25\xd8\x54\xca\xfc\xa6\x3a\x3d\x85\x0f\x3a\x33\x78\x26\x91\xf2\x30\x7a\xa5\x45\x71\x4b\x7d\x5d\xa2\x57\xf8\x86\x9d\x3f\x58\xcc\x29\xc6\x32\x00\x2a\xa9\x0b\xf7\xd8\xa8\x43\x24\x40\xe3\xf8\x61\xc5\xb3\x24\x63\xc3\x22\x3f\x80\x68\x80\x34\x84\xd7\x3b\xc6\x22\xcc\x8e\x81\x23\x80\x84\x04\x1a\x70\x0d\x24\x8f\x6c\x54\xc0\x75\x47\x18\xcb\x0f\x11\xfe\x85\xe9\x8e\x06\xc2\x81\xdb\x3a\xe7\xab\xbd\x9a\xbf\x3c\x8f\x86\x92\xb5\x90\x77\x04\x61\x72\x96\x2a\x71\x54\xcd\x66\x07\x5c\xd2\x02\x56\x75\xf3\x1b\xc6\x55\x32\x2b\xb2\x77\xc5\x1b\xd1\xf1\x1c\xba\xe9\xed\xe2\xb2\xdc\x0b\x8e\x43\x12\x56\x04\xad\x88\xa3\xe1\x6a\x8a\x7e\x2b\x1a\x16\xdf\x05\xbd\x09\x09\xb2\xf3\xde\x12\xbb\x1c\x39\xf9\x4b\x22\xda\x1e\xa8\xa8\x41\x50\xfb\x70\x65\xd3\xed\xc8\x40\x91\x77\x98\xfc\xe4\xf4\xbc\xe8\x58\xdf\x03\x1e\xe1\xb4\x04\x6d\x22\x16\x41\x47\x7b\xbe\x14\x72\x59\xe9\xc4\x84\x9c\x0a\x53\xa0\xa0\x52\xcd\x5c\x2c\xb6\x08\x86\xa3\xb8\x0a\xd4\x16\xd9\x8b\xfb\x3e\x58\x08\x3f\xef\x02\x02\xe2\xa0\x82\x0c\x5e\x84\x97\x5d\xbf\x00\xd0\x8b\x0d\x1d\xe0\x7d\xb8\x79\x13\xbd\x34\xd1\x2d\x17\x7b\x76\x9a\x83\xa7\xde\x5c\x3c\x89\x3c\x2e\x90\x10\x51\xc8\x37\x47\x5d\x1e\x9e\x52\xdc\x2f\x8e\x83\x73\x1b\xa7\x0e\x47\xfb\x9c\x28\x3d\x3d\x1d\xa1\xab\xb5\x28\xf5\xe7\x8f\x30\xb5\xaf\x71\x86\x2a\x4f\xf5\xf7\xd7\x8f\x28\x1f\x69\x5a\xf6\x79\x0b\x55\xe5\x5d\x99\xfd\x9b\x77\x36\xd3\x12\x7a\xaf\x30\x88\x47\xf4\x8d\x03\x36\x3c\x27\x54\xe3\x69\x7f\xc4\xb9\x65\x2b\x48\x16\x3e\x6b\x20\x03\x8c\x80\x2b\x86\x70\xca\x79\x44\x45\xd3\x01\x9b\x11\x95\x21\x32\xc0\x62\x02\xaa\x92\x6a\xc0\x16\xc6\x35\x96\xc0\x63\xb4\x73\xe9\x43\xb9\xd7\x72\xac\x2f\xcf\xbd\xe4\xcc\x4b\x3e\x62\xa8\x48\x6c\x6c\x5a\x79\x64\xf0\xa8\x7e\x03\xd7\x8e\x31\x61\xd6\x2a\x19\xa3\xd9\x95\xf5\x3c\x9e\x0e\xe9\x00\x6c\x79\x7b\x2b\x60\x95\x1d\x3a\x70\x87\x76\x44\x6b\x8f\x35\xb4\x71\x3b\x78\x9a\x31\x7c\x30\x8e\x83\xf6\x8f\x68\x69\x63\xdd\x70\x15\xbe\x9a\x6e\xa2\xd1\xea\x4d\xb6\x3f\xa1\x26\x6d\x8f\xd4\x02\x16\x5b\xaa\xf1\x2b\x8f\x57\x91\xdc\xe3\xfd\xa9\xc7\x5b\x27\xc7\xca\x60\xa1\xc7\x35\x28\x9f\x03\x21\xb3\x2c\x25\x3c\x88\x07\x90\xf4\xe1\x4e\x06\x95\x6e\x3d\x55\x21\x3d\xfb\xfd\xe0\x5e\x35\x76\xb3\x9b\x4a\x04\x5b\x7f\x23\x11\xc7\x37\x5d\x8d\x02\x56\xd6\x07\xc1\xa5\x0c\x70\x47\xa1\x51\x0f\x75\x85\xb6\x74\xb4\x23\xab\x12\xae\x1d\x39\x27\xd6\x25\xfb\x51\xe8\xfa\xa6\xc5\x71\xea\xd8\x5e\xdc\x19\xcc\xf4\x8e\xe7\x43\x15\xfb\xf5\x71\x1c\x32\x12\x45\xb3\x07\x7c\xc4\x40\x20\xc6\xf2\x30\x3f\x3d\x34\xc3\x31\x85\xc3\xfb\xad\xad\x77\x24\xe2\xe7\xd0\x8c\x64\x70\xf8\x5e\xcd\x14\xd1\x07\x06\x39\x46\xf3\x7e\xd3\xfd\xcc\x55\x43\xa1\x9a\x13\x42\x85\x1c\x11\x87\x07\xa0\x8b\xd3\x99\xc5\xec\xee\x4a\x03\x9b\xf9\xa3\xa5\xeb\xe1\x0b\xf5\x6a\x68\xa9\x48\x51\x18\x3c\xbe\xce\xe0\x2d\x2e\x44\xfa\xc3\x01\x11\xbe\xec\x04\xbc\xc5\xb1\x63\x08\xa5\xd2\xea\xdd\x68\x25\xaf\x78\x68\x08\x97\x5f\xe3\xbc\x87\x5b\x6f\x72\xa8\xb3\xb6\x50\xe7\xb6\x41\x0e\x36\x26\x89\xf8\x73\x92\x82\x0f\x0b\xa6\x18\x92\x48\x44\x48\xcf\x49\x9b\x13\xac\xe3\x46\xab\x3b\x09\x5b\x0e\x10\x00\xfc\x27\xe2\x83\x9b\x37\xfb\x7f\xda\x96\xc0\x15\xb9\xe7\xb1\x56\x7c\x8f\x57\x68\x47\x8f\x8d\xc4\x2f\x4f\xae\x02\xfa\xef\x8c\xb4\xd9\xa2\xfb\x57\x53\x23\xf5\x88\x6d\xbe\x76\x6c\xb5\xbc\xa5\x6b\x98\xb7\x70\x18\x68\xe0\x31\x93\x53\x23\x45\x53\x02\xdd\xce\xbf\x62\xf9\x71\x53\x1d\x44\x48\x50\x07\xde\x3f\x73\xa0\x06\x90\xcb\x30\x29\x61\xf6\xd0\xbd\xa7\xf6\x01\x10\x86\x8b\xe0\x71\x4b\x34\x34\xe5\x06\xb0\xbd\x0e\xdd\x5f\x37\xef\x6a\xb4\x6d\x5c\x87\xaf\x2f\x1a\xf3\x41\x23\xb5\x67\xd9\x34\xf8\x85\xfc\x04\x0e\x8f\x15\xb5\x53\xff\xe4\x91\x66\x78\xe5\xe8\x38\x66\xc1\x62\xf2\xa7\x3f\xbe\x00\x02\xf7\xee\x4f\x7f\x7a\xc1\xc6\x95\x7c\x15\x4d\x71\xf7\xa7\x4f\x5e\x0c\x1b\xce\xcf\xcc\xa6\x9c\x51\xa3\xf1\x9a\x24\xfa\x6a\x7a\x0c\x8a\xbe\x63\xa9\x17\xe9\x02\xc3\x6b\xf0\x0b\xc0\x30\xf2\x34\xdb\xf0\x91\x31\x01\x87\x77\x63\x44\x60\x12\x44\xb0\xd2\xb0\x98\x14\xdf\x35\xd0\x1b\xfd\x76\x2e\xeb\x76\x88\x27\x64\xc5\xaf\xda\x80\x46\xb8\x14\xf5\x48\xdd\xec\x67\xbf\x25\xc0\x2e\xf9\xf5\xff\x01\xc9\xfb\xbb\xb4\xf4\x9f\xb5\x99\x3a\x3e\x70\x6b\x1f\x02\xf4\x39\x19\x07\x77\x04\xf9\xe8\xea\xe3\x4d\x37\x22\x57\x3d\x3f\x87\xfe\x0b\x3f\xcd\xc6\x9b\x68\x3e\x87\x26\x12\x75\x04\xd8\x14\x33\x4d\xd1\x1d\xfd\xf0\x84\x40\x5a\xa6\x73\xe1\x3a\x8f\xf5\x6c\xc9\xfb\x3a\x6b\xd0\x96\xb4\x9f\xd2\x1b\xef\x67\x1c\x90\x21\xad\x76\x5b\xc7\x07\xdb\xca\xfb\xac\x40\xe7\x5b\x65\xa7\x86\x9b\xae\xb3\x73\xb8\xe5\x76\x85\x00\x07\xd0\x72\xc7\xef\x3e\xfd\xfa\x9c\x00\x2a\x39\x03\x9e\x9e\x76\xd2\x49\x1f\x11\xef\xf4\xfb\xba\x13\x29\x09\xd4\xa2\x0e\x15\xa1\x10\xe3\xdc\x04\xa2\xc6\xd3\xdd\x6c\x8e\xfc\x3b\x06\xd8\x35\x94\x86\x42\x08\x71\x3f\xaa\x06\x1e\x03\x1a\xfd\x09\x1a\x5c\xb0\xb0\x9b\x8d\x79\x14\xfa\x07\x56\x3e\x52\xa0\xf1\x21\x35\xc4\x03\x49\x3d\x12\x53\xe7\x10\xa3\x0b\xe1\x30\x30\xa5\x5e\xc4\xd7\x38\x96\xa9\x38\xd3\x02\x6d\x66\x3d\xc0\x89\xe4\x75\x11\xb0\x66\x2a\x2b\xd1\x19\xc0\xf3\x1d\xdc\x83\x32\xca\x80\x03\x09\x0f\xe9\xb8\xb4\x1a\x6c\x41\x13\x93\x7b\x9b\x16\x43\x18\xe4\x75\xd0\x0e\x0b\x6e\xf0\x80\xd4\xe7\xf2\x00\xcf\x2e\x22\x16\x46\xdf\x2c\x6e\x30\x5c\x1e\x7f\x4f\x04\x72\x69\x91\x04\x4d\x09\x13\xc5\x83\x63\x23\xaf\x61\x17\xe4\xd9\xe1\x6b\x06\x73\xb0\xd1\x9a\x63\x2e\x1e\x42\x1f\x92\xe9\x95\x58\x89\x31\xa1\x4e\x9e\x1b\x97\xd6\x21\x82\x49\xed\xf4\x75\xad\x64\xa4\x7f\xd0\x00\x70\x7c\x06\xde\xab\x43\xe6\x7c\x9b\xe9\x73\x84\x5c\x77\x06\x88\x2e\x0c\xc6\x21\x08\x96\xe4\xef\x0b\x84\x51\x8f\x09\x4c\xd7\x99\xe5\x39\x5e\xff\x40\xcf\xfd\x8c\x16\x26\x18\x88\x0b\xe8\x83\x9a\x9c\xd4\x39\x0a\xaa\xa8\x3f\x00\x26\x11\x78\xd5\x57\xa2\x6a\x80\xdb\xf8\x79\xa4\xbf\x15\x5c\x0c\x24\x36\x0f\xf4\x97\x84\xb9\x04\xba\x1a\xfb\xfc\x79\xc2\x4a\x30\xcf\xa5\xba\x71\x49\xa3\xe8\xca\x10\x2b\xa0\xeb\x95\x17\x16\x9f\xb2\x55\x14\x0b\x4b\x83\x96\x66\xb4\x32\x1f\x6b\xd2\x62\x65\x2f\x7b\xe7\x95\x78\x24\xe6\x14\x86\x60\x5c\xde\x39\xcd\x7a\x5e\x18\x20\xcd\x77\x66\x0b\x64\x73\x3e\x26\xff\x3b\x73\x61\xb8\x2d\x52\x7c\x5c\x2b\xd1\x2a\x0e\xb4\x89\xba\x25\x0d\x9a\x73\xf4\x55\x87\xa2\x11\xd2\x1e\x95\x62\x14\xdd\xa2\x1b\xcd\xd4\x57\xeb\xce\x91\xf6\xea\x1a\x3f\xe8\x31\x45\x26\x29\xa2\xb1\x3b\x32\xbc\x95\x30\xa0\x64\x8c\x14\xa6\x45\x0c\x2c\xea\x2a\xd9\x03\x9d\x02\x7f\x58\xed\x1d\x1d\xe6\xe3\x74\x26\xb3\x9f\xbf\x8b\x04\x51\x07\x0e\x8b\x52\x46\xec\x50\x9b\x52\x6e\x71\x8f\xf1\x1f\x1e\xa2\xdc\x7e\x1a\xf9\x7e\x20\x6a\xbe\x4f\xe3\xdc\x47\x72\x66\x25\x68\xfa\x0f\xf4\x83\x91\xb5\xec\x2a\xf3\xb4\x8f\x6e\x3f\x1d\xa9\x4c\x78\x8e\x0f\x9b\x6e\x1c\x32\x36\xbb\xaa\x5f\xf1\x91\xe3\xa0\xab\x58\xae\x0e\xd7\xf7\x33\xd4\x03\xeb\x13\x41\x7f\x53\x48\x3d\xf9\xfa\x27\xff\x55\x06\xd8\x96\xed\x5a\x49\x1c\x1e\x27\x0c\x70\x61\xfe\xa5\x11\xa0\xf1\x7f\x7b\xa1\x00\x00\x57\x13\x09\x11\x8c\xee\xca\x86\x43\xa7\xf4\x28\x24\xa5\x03\xf1\x54\x28\x64\xa9\xda\x23\x95\xe7\xc1\x31\xb3\xce\x91\x6b\x08\x35\x01\x50\x43\xcb\x09\xf1\xb6\xc2\x83\x0d\x68\xbb\x6c\x59\x82\xda\x1c\xd8\x72\xd1\xae\x21\xa7\xde\x47\xdb\x4c\x06\xb9\xd3\x64\xbb\x60\xf2\xfe\x10\x5c\x04\x5c\x52\x7a\xf3\xf7\x03\x43\x0c\x0d\xcf\xa3\xd3\x74\x1f\x48\x4f\x40\xb7\xa3\x3a\x94\xec\xc4\xc9\xf8\xa8\xc4\xc8\xac\xe3\x3d\xb2\xcb\x33\x5d\x08\xf5\x62\xc9\x3d\xf1\x54\x73\x99\x05\x56\xd1\x15\x59\x07\x38\xa5\x5c\x6e\x28\xa8\x6c\x43\xce\x14\x18\x84\xb6\xa2\x5d\x50\x27\xb6\xf2\xa8\xd8\xda\x76\x43\xf1\xe4\x34\x34\x60\xef\xf9\x10\x92\x24\x88\x8b\x39\x83\xb8\xa9\xe7\x64\x67\x48\x1b\xa2\x86\xc9\x87\xf6\x9d\x63\x4b\x47\x31\x97\x69\x57\xe0\x08\x69\x5b\xa2\x3e\xc9\x94\x6b\xd0\xad\x3d\x84\x66\xc5\x2b\x94\x1c\x19\x0e\x76\xef\xa2\xd5\x02\x2a\xdf\xff\x7a\x78\x3c\xb5\x69\x66\x83\x3e\x3d\x39\x5c\xfb\x16\x20\x04\x0d\x93\x35\x3c\x5d\x6b\x9d\xa8\xcc\x7c\xe7\x2e\x81\xa0\x14\x0d\x8d\x1a\x4d\x98\x0c\x04\xf5\xaa\x10\xa4\xf7\xb5\xdc\x5b\xea\x47\x64\xef\x3f\x8b\xb3\x0a\xfb\xda\xb2\x76\xd8\xdf\x00\xa3\x1c\x93\x06\xe0\x65\x5b\xf7\x9e\x40\xe7\xe2\x3d\xd0\xe0\x47\x7f\x40\xe3\x3d\x80\x27\xca\x0e\x92\xc4\xf3\xc0\x4d\x26\x2f\x32\x24\x22\xf3\xab\x43\xb6\x94\x1e\x22\x49\x9d\x8b\x10\x94\x2f\x0f\x63\x6a\x45\x56\x21\xd1\x1b\x3a\x90\x64\x44\xb5\x46\xa5\x38\x51\xf9\x01\x49\x4e\x5e\x63\xe5\xf9\x1e\x0a\x9b\x1b\x4f\xa3\x99\xaf\x7a\x00\x35\xc4\xd8\x5f\x96\xd7\x1a\xcb\xd0\xe4\x93\x50\x56\x67\xd0\x75\xe0\xa8\xd2\xc5\xa1\x96\xe1\xbc\x34\x2b\x96\xa2\xe1\x4b\xc0\xa6\xa1\xb9\xd8\x96\x41\x4a\x83\xab\x20\xa9\x11\xc8\xce\x69\x32\x5a\xf6\xac\x0c\x84\xcd\x51\x5d\xa6\x9e\x9f\xdb\xd6\x89\x69\x73\x54\x96\xda\x3c\xc7\x05\xba\x0f\xcf\x7c\x3c\xc7\x8f\x82\xae\x98\x8c\x63\xa3\xa5\x97\x64\x01\x26\x32\xec\xb8\xc8\x87\xf5\x96\xee\xd0\x90\x1d\x68\x0e\xed\x95\x10\x1a\x42\xbf\xa4\xde\x70\x71\x68\x6e\x74\xb9\x11\x13\x89\x90\x99\xe3\xc3\x35\xfc\xef\xde\x76\x7b\x6f\xb5\xfa\x70\x64\x47\x3c\xf9\x99\xcb\xd4\xc6\x1d\x11\x7d\x36\xa4\x0f\xe2\xae\x02\x49\x7f\xeb\xbe\x92\xe9\x4b\x7c\xb0\x41\xd0\x4a\xd1\x1a\xd4\x00\x90\xe8\x7b\x8c\x79\xe3\x55\xea\x03\xb1\x7b\x29\xc6\x1e\x4b\xcc\xc8\xb6\x25\x63\xc6\x05\x39\x5e\xc1\xb5\x69\xe1\x3a\xa3\xd8\x36\x03\x80\x84\x87\x8a\x0a\xd2\x88\x8c\xef\xb3\x00\xde\xb0\x47\x91\x92\x3e\x69\x82\x9b\x3e\xb6\x77\x21\xfa\x41\xba\x7b\x9e\x6b\xc9\x8e\x20\xf6\x65\x19\xa9\x3e\xc2\xba\xe4\x73\xcf\xb8\x17\x72\x72\xb8\xc5\x29\x3d\x70\xda\x1a\x61\x05\xf6\xf6\x16\x7e\x66\x6c\x52\x07\xc1\xe9\x10\x57\x03\x7b\x31\x79\x69\x37\x16\xee\xdb\xc6\x72\xc4\x68\xfa\x3d\x7d\x59\x56\xcb\x86\xac\xf9\xe3\x08\x9b\x97\x5a\x6b\xff\xfa\x83\xa4\x9e\xe6\xcd\xd4\x4e\x84\xc2\xed\x38\x57\x0f\x7b\x2a\x32\xea\x5f\x35\xc0\x09\x8b\x24\x85\xc3\x81\xb6\xcd\x05\x5c\x9f\x5e\x5d\xcc\xd9\x25\xad\x11\xfd\x33\x02\xe2\x94\x87\x92\x2b\x73\x86\x9e\x57\x73\xca\x50\xe9\xf1\x09\xe7\xe1\xc3\x57\x9e\xab\x86\xfc\x95\xf4\x53\xb8\x00\xfa\xaa\x6a\xc4\x50\x99\x03\x55\xc4\xdd\xb1\x71\x46\xa8\xa1\x6e\x02\xa9\x6d\xca\xec\xc7\x6b\x6f\x16\x04\xcf\x91\x44\x63\xdc\xb1\xdf\xf2\xdb\xad\xbe\x55\xc8\xa1\x46\xb8\xc8\x7e\x2c\xcb\xa1\xa8\xfb\x34\x6e\x88\x32\x12\x86\x24\x8b\x7a\x19\x8f\x54\x2e\x77\x9d\x98\x04\x50\x25\x7c\x09\xa8\x1e\x5d\x0a\xec\x65\xbe\xe8\x3b\x80\x06\xe1\xed\x93\x85\x69\x11\x6b\xa1\x2a\xbf\x2d\xea\x65\x16\x55\x11\x83\x9c\x78\xe9\xa1\x0e\x5a\xdb\x2e\xcb\xf9\x27\x18\x80\x36\x44\xbf\xe2\x1e\x85\xc4\x46\x56\x53\x28\xec\xe9\xb8\xab\x62\x24\x26\x84\x13\xf6\x90\x3d\x0d\x07\x97\xab\xed\x03\x54\x71\x9c\x9e\xf7\xf0\x0c\xf7\x7d\x39\x76\x83\x8a\xf6\x94\x45\xcf\x03\x37\x05\x32\x75\x30\x14\x97\x7e\x3c\x79\xa5\x7e\x9d\x72\x56\x29\x37\xfb\x7e\xc7\x01\x9b\x7c\x41\x14\x4b\x9f\x58\x08\xf5\xd8\x3b\x50\x63\x4a\xae\x59\x69\xea\x8c\x43\xbd\x4d\xc9\x22\x6f\xf6\x43\x6c\x7a\x77\xa8\x2a\xee\x9d\x84\xda\x97\x18\x46\x87\x6a\xf6\x35\xe9\xf0\x28\x72\x89\xd7\xe6\x45\xb5\xcf\x9b\x66\xe3\x66\xcf\x10\xae\xd1\x3f\xa4\xd8\xbf\xda\xff\x33\xda\x88\xb5\xed\xb8\x06\x26\x9c\xcb\xca\x80\x5f\xb7\xcb\x90\xd1\xf3\x04\x39\xf7\xd1\x0c\xa1\x53\xb1\x5d\xf7\x55\xbd\xdb\xca\x78\x75\x74\x32\xd1\xe4\xa8\xa7\x91\x6b\x09\x47\x7b\x1f\x76\x8b\xd5\x31\xc3\x09\x66\x47\x63\x4b\x74\xe2\x22\x9c\x8e\x12\xdc\x53\x08\x11\x1f\x45\x3c\x84\xd9\x75\xfd\x65\x09\xc8\x8f\xa3\x8c\xdb\x71\xa6\x22\xcc\x0c\x4f\xe8\x7b\xc9\x27\x02\xf8\x7d\x1b\x45\x96\xf2\x95\xc4\x16\xc4\xaf\xd6\xe7\x7a\x08\x8b\xed\xe3\xf3\xe2\x08\x33\x48\xd0\xfe\xde\x40\x4f\x14\xe9\x42\xa4\x64\x8e\xaf\x4c\x93\xf9\x2e\xf8\x61\xcc\xea\x12\xdf\xe7\x55\x7c\x60\x98\x4e\xa4\x3f\x70\x08\x78\x9b\xc4\xef\xc9\x87\x61\xba\x0c\xb7\x34\x5a\x2e\xca\xee\xd1\x59\x09\xb3\xb0\xd1\x3b\xe3\xd5\xab\x16\x7d\x91\x2f\x29\xcf\x94\x6f\x6a\xd3\x96\xe5\x2f\xa3\x2d\xd9\x89\x6a\xbc\x59\xd2\x84\xd2\xdc\xed\xff\x87\xba\x62\xc5\x78\x44\x9c\x4c\x0e\xb7\x53\xf7\xba\x10\x88\xca\xea\x7b\x7e\x69\xdb\x6b\xf2\xd1\xef\xaf\x7d\x24\x1a\x34\x9c\xba\x84\xd3\xc0\x8f\x41\x22\x87\xa3\x92\x57\x70\x85\xaf\x74\x18\x8d\x25\x7a\xf9\x0e\x06\x02\xc0\x49\xe0\xbd\xfe\xc0\x4e\x52\xfb\x39\xa0\x0c\x4c\x20\x3b\xb2\xa5\x3d\xfb\xaa\xf6\xef\xee\xd2\xaf\xfb\x40\x97\xba\xd7\xb7\x76\x24\xad\x68\xdb\x84\x60\xd6\x5d\x1f\x69\xe8\x23\x17\x79\x2a\x7a\xd8\x13\xcf\xc6\x75\x57\xc0\x09\x8c\x74\xa5\xa9\x12\x22\xbb\xde\x02\xc3\x3e\xba\x4f\x6f\xed\x0a\x25\xb7\x65\x6b\x97\xb3\xaf\x30\x8a\xb2\xbd\xbd\x2e\x85\x6c\xd6\x06\x5f\xf6\x2d\xdf\xff\xe5\x81\x96\x61\xe9\x21\xde\x9e\x10\x3c\x3e\xd7\x23\xbf\x90\x7f\xc5\xa8\x6d\x7f\xfb\x2b\xde\xc4\xbf\xfd\xd5\x02\x06\xfe\xe5\x6f\x2a\x92\x4a\x9d\xec\xd0\xa0\x7c\x34\xd8\xac\x21\x2f\xc7\xc0\x69\x15\x76\xe5\xe3\x82\x62\xfa\xa5\x6d\x04\x69\xc4\x96\xe7\x80\x36\x2e\xe9\x70\x44\x7f\x71\xfe\x29\xe4\xe4\x38\x22\x4b\x8f\x16\x0c\xeb\x1e\x15\xe9\x19\x6e\x5a\x19\xb2\x5e\xbc\x46\x93\x80\x2f\x29\xfc\x04\x06\xc9\x84\x9f\x11\xba\xa3\x3c\xd4\x14\xfc\x16\x25\x50\x8e\x1d\xe7\x24\x23\xb6\x41\x8f\xd7\x28\xca\xed\x56\x03\xc5\x24\xde\x25\x23\x6f\xfd\x34\x7e\xcf\x50\x68\x87\x6a\x36\xfa\x97\xb4\x73\xd7\x48\x82\x51\x30\xa3\xc4\x1a\x3e\x6f\x13\x04\x3f\xe2\x31\x45\x31\x6a\x82\x13\xd4\x26\x74\xb9\xa3\xb4\x7c\xc3\x3e\xa7\x05\x23\xe2\x36\x73\x64\x37\xde\x59\x7f\x38\x55\x21\xa2\x1c\x50\x51\xf7\x8a\xd4\xb1\xdf\x8f\xe8\x86\x0e\xaf\x87\xa6\x40\x71\x1b\x9b\x3c\xb0\x03\xb9\x04\x20\xa7\x35\x32\xbe\xaa\x6c\x13\xeb\x67\x3f\x34\x3b\xf8\x0f\x1a\x71\xc8\x8a\xc4\x47\x71\xc8\x53\x84\x1d\x73\x87\x4e\x61\x9a\xdc\x9c\xda\x9d\x95\x21\xaa\x69\x14\x33\x75\x58\x8b\x4f\x4b\xab\x0e\xa5\x3c\x51\x63\x1f\x87\x21\xca\x99\x77\x19\x89\x29\x24\xfb\x1e\x7a\xb3\x85\x84\x1d\xe3\xe9\xd6\xdc\xc8\x7c\x93\x03\xa4\x6b\xbe\x33\xd7\x18\x0e\x98\x03\xb4\x68\x10\x09\x4b\x39\x5f\x91\x58\x40\xb7\xbf\xc8\x5f\x0e\x47\x0b\xb1\x94\x6f\x1b\xe0\x8f\x3a\x80\xb2\xae\xef\x3f\x40\x1a\xef\x16\x60\x84\xfa\x91\x28\xbc\x65\x4d\x92\x72\x32\x4f\x09\xed\x90\xd9\x1c\x99\x0c\x22\x35\x51\x68\xaa\xe0\xda\xaa\x6b\x05\x62\x74\x74\x19\xeb\x13\x21\x9a\xd7\x69\x79\xf0\xea\x09\x9e\x55\xa8\xf7\xe9\x80\x8e\x88\x5d\x01\xe2\x47\x1a\x85\x2d\x6e\xb4\x76\xce\x6e\x72\xdd\xc0\xb1\x8f\xdc\xc9\x21\x3b\x22\x61\xc2\x0f\xb0\x23\xa3\xc3\x1e\xbe\xbc\x3e\x12\x07\x11\x89\x8c\x69\x51\x5e\x17\x16\x34\xa4\x9f\x32\xa6\x3d\x71\x00\xce\xd6\x66\x0f\x72\xf0\x36\x9a\x6a\xba\x95\x03\xdf\xc2\xac\x5e\x26\xc2\x48\x9d\x3d\x51\x42\x41\xfb\xef\xed\xcf\x87\x18\x66\x0d\x54\xb1\x06\xef\x5e\x85\xf4\x69\x71\x44\x6b\x92\x41\x5c\x1e\xb2\x0e\xe9\x08\x2a\xc8\x66\x3a\x9f\xdb\xe1\x9d\x7e\x8f\x80\x26\x87\xbb\xfb\xe3\xa0\xbb\x3c\x06\x49\x14\x54\x85\x23\x52\x0c\x91\x0d\xed\x0b\xfa\xf0\x5a\x76\x0c\x87\xad\x42\x16\x48\x3e\x0f\xe5\x38\xe4\x94\xe6\xad\x5f\x08\x44\x94\xdd\xca\xe3\xce\x68\x9a\xc7\xc3\x2b\x20\x2f\x31\xdc\x15\xca\xf5\x6d\xc6\xfd\xe2\xd9\x54\x9b\x03\xac\x6c\x4c\xcb\x51\xcc\x50\xc8\x17\x8e\x29\x1f\xe1\x00\x24\x0e\xd1\xbc\x17\x1c\x1d\x62\x6a\xc6\x01\xba\x61\x76\xf9\x50\x00\x5c\x33\x8a\x0a\xd9\x00\xe4\xbb\x21\x92\x8b\x18\x3d\xb3\x21\xba\x35\x79\x4c\x46\xba\x1a\x79\xc2\x4c\x8e\x36\xc7\x42\x85\xba\xf4\x0d\x8d\xc2\xe4\x1c\x0a\x8f\x13\xb1\x55\x98\xa5\x28\xb2\x73\xc9\x83\x40\x56\xa9\xdd\xcb\x2d\x4d\x93\x98\x75\x2e\x6f\xa8\xe1\xc3\xb8\xf3\x11\xe0\x49\x66\xa1\x71\xeb\x86\x42\x81\xa6\x0d\x46\x1c\x99\x4d\x4e\x2c\x0e\xbd\xbd\xa5\x57\x7d\x6d\xa3\x34\xed\xdb\x1c\xfc\x52\xb4\xe2\xa2\x94\x83\xac\x53\x14\xeb\x1c\xb4\x89\x41\x2e\xdc\xde\x16\xd2\x4e\xa7\xd3\x96\xdb\xe6\xb2\x1c\xdf\xb7\xdc\xc4\x48\x63\x63\x6a\x54\xf1\xc0\xc6\x93\xb7\x01\xa7\xd7\x8c\xcd\xb2\xbd\xdc\xd0\x53\x15\x68\x95\x1d\xa4\x42\x98\x4a\x23\x44\x73\x40\x75\xef\x22\xdb\xf7\x38\xd0\xf7\x30\xc5\x9a\x00\x06\x86\xaf\xc9\xc1\x62\x9a\xf0\x6c\xc8\xa6\x50\xc6\x05\xce\xb5\x17\xe2\x44\x0f\x5f\xfe\x10\x56\x9f\xad\x1a\xbc\xc6\x31\xc0\xca\xd8\x80\x6e\x9a\x02\xe2\xcb\x72\x81\x82\x9e\x08\x7c\xbb\x43\x32\x21\x12\x08\x49\x94\x86\xb4\x4e\x41\x81\x36\x34\x7e\xb8\x72\x96\xa8\x3e\xe0\x0c\xcd\xf8\xd7\xce\xb4\x6a\x8e\x8e\x3f\xc9\xbb\xbf\xd9\x92\xba\x81\x63\x57\x93\xec\x06\x71\x2d\xb7\xd9\xbf\x9a\x16\x8f\x81\xf3\x46\x29\x05\x91\x47\xb4\x9c\x95\x93\xb8\x00\x5b\x5a\x78\x87\x51\x0b\x7c\xe0\x15\x6e\x48\x39\x93\x94\x9f\xf7\xe1\x51\x4f\xbe\x3f\x7d\x96\x2a\x16\xd9\x9f\xb3\xbf\xbe\x16\x3a\x06\x3e\x6f\x28\x7e\x66\x88\xd4\x79\xab\x73\x54\xba\x07\x40\x0b\x37\xb0\x0e\x0c\xe3\x00\x8c\xe2\xfe\x15\xc7\xda\x0c\x54\x01\x6f\x73\xb8\x82\xf2\x8e\x1f\xdc\xec\xbc\x41\xf6\xa0\x67\xed\xde\x27\x9c\x64\xa2\x93\x20\x2b\x1d\xc9\x2a\x7b\x29\xce\xea\xef\x73\x0d\x07\xd3\xd2\x3b\x98\x41\xc4\xad\x5a\x89\xbc\xb7\x29\xe5\x0b\x86\x2e\x2d\xf0\x18\x57\xb3\x67\xa5\xe3\xa8\x70\x98\x67\xbd\x7c\x47\x6d\xa1\x16\xd9\x23\xd9\x56\x48\xd4\x60\x94\x84\x7b\x02\x25\xbe\x1f\x2b\xf1\x26\xb0\x31\x49\x51\xd8\x2a\x3b\xdd\x47\x73\x48\x56\x37\x3e\xb4\x5f\x3b\x4d\x18\xea\xdc\x93\xb5\x27\x18\xdb\xaf\xc4\x15\x14\x92\x81\xd0\x1d\x72\x7c\x48\x66\xaf\xcc\xcd\x6f\x68\x5b\x03\x98\xa0\x5e\xb1\x78\x6f\xbb\x7f\xdd\x92\xda\x4d\x9d\xf8\x09\xf6\xb9\x13\x0c\x9f\x2e\xc7\x85\xa2\xf0\xc1\xfc\x54\xb1\x7f\x92\x58\x7d\x8d\x54\x03\xbe\x18\x23\x41\xb1\x11\xfe\xc8\x1e\xb3\x22\xd1\xcd\xbe\x31\xd5\x65\x99\x88\xfd\xb4\xc6\x8e\x93\x95\xcd\x1e\x52\xd2\x13\xcc\xcd\x8e\x59\xd7\x87\xf5\x16\xcd\xea\x4a\x83\xb4\x0e\xc4\xcb\x7c\x7a\x2a\x63\xee\x39\xda\x31\xc7\x45\xa0\x24\x29\x88\x0f\xa6\xb1\x86\xa9\x12\x55\x28\x26\x81\x26\x4d\x12\x29\x33\xc5\x09\x4d\xa2\xff\xa2\xa4\x82\xbc\x4b\x12\xbb\x1a\x36\x9a\x5b\x93\x41\x82\x7f\x90\xa6\x83\x29\x71\x34\x02\xf1\xb4\x55\x58\x26\x7c\xbe\x01\xb0\xb8\x74\x12\xba\x50\xc3\x7e\xd2\xc1\xe0\x89\x31\xb2\x0d\xb1\x00\x61\xda\x0f\x28\x8c\xc3\x45\xd3\x09\x6c\x91\xf5\x73\xcf\x01\x35\x7a\x0e\x13\x23\x7d\x89\xf0\x66\x6c\x3a\x14\xf5\x6e\xff\x3f\xb0\x7d\x30\x35\x1d\xd4\x52\x4b\x6b\xae\xe8\xb2\xdd\x16\x1a\x4e\x2a\x8b\x3a\x39\xc3\x37\xd1\x5b\xc0\xab\xff\xf1\x3a\xe4\xe7\x69\x46\x51\x2a\xcb\xbc\x10\xb1\xaa\x90\x2b\x35\xdc\x60\x84\xcf\xb7\x10\xd9\x1c\xd4\x78\x46\x47\x19\xb2\xff\x90\xf6\x94\x98\x3c\x91\x1a\x72\x9c\xc3\x55\x60\x53\x3c\x4e\x12\x11\x56\xf1\xd1\x77\xa7\xdf\x1f\x1f\xc9\x14\x7e\xb9\xf7\xf2\xe5\xcb\x7b\xd8\xf6\x5e\xdf\x56\x65\x8d\x1f\x57\x3a\xa7\xcf\xca\xed\xe7\x7d\xd7\x4d\x3f\xbb\x0f\x7f\x7c\x3c\x2d\x1e\x96\x9d\x84\x1e\x23\xd0\x49\x4c\x44\x52\x29\x91\x3e\x0d\xff\x85\xcf\x80\x5c\x1a\x12\x5e\x27\x29\xfe\x62\x32\x14\x4f\x92\xdd\x58\xe8\xda\xa0\xc4\x62\xe7\x62\x22\x66\xd9\xc2\x54\x8e\x1b\x8c\x9e\xbb\x4b\xc0\xc1\x01\x4d\xb3\x19\xc9\x32\x21\x79\x31\xb2\x7a\x16\xc6\xa2\x99\x3c\xda\x34\x48\xb5\x25\xf3\xe0\x2a\x6c\xc6\xfc\x98\x8d\x97\x83\x40\xfd\xb2\xd4\xa8\x8f\x8f\x45\x7c\x47\xc7\x8c\xf2\xa0\xeb\xbe\xea\xd8\x3c\xa2\xa3\x6b\x67\xaf\x11\x68\x51\x4b\x2d\xfb\x84\xe9\xaf\xe8\x56\x7d\x91\x77\x48\xd1\x6d\x9a\xba\xba\x92\x24\x98\x5e\x94\xa9\x30\x27\xd4\xa5\x8c\x96\x0a\x35\xb8\x0b\x4a\x5e\x5a\x22\x72\x26\x73\x4e\xf2\x3c\x68\x02\xd4\x28\x6f\x89\xcc\xdf\x18\x43\xc9\x9d\x70\x6e\x89\x90\x0f\x87\x1c\x80\x2f\x93\x9e\x86\x6d\x52\x23\x98\xf1\x62\xd1\x3b\xb0\xe7\xbe\x04\xbb\x31\x6a\xf8\x91\x91\xdf\xba\x25\xef\xb2\xd6\x72\xb7\x35\xd1\x01\xd9\xc2\xe8\xc8\x1b\x22\xb9\xa3\x90\xa4\x41\xcd\x97\xc8\xe0\x07\x10\x03\x72\xb9\xde\xcb\xc9\x49\xfa\x23\xa6\xa4\x0f\x58\x68\x71\x48\x4f\xcd\xbe\xe0\xad\xd9\x25\xd2\x27\x62\xdf\x81\x2a\x6e\xb0\x7f\x78\xf6\x61\x81\xc9\x81\x8f\x82\x89\x7f\x37\xc6\x81\x04\xe5\x84\xe3\xe2\x11\x4e\xb8\x8c\x39\x96\x11\x9b\xe7\xdf\xd5\xd4\xee\x59\x82\xea\x6c\x8a\xc7\x58\x23\x04\xa5\xf2\x52\x51\xc4\x13\x27\x50\x9d\x91\xd7\x84\x4f\x53\xfe\xae\x7b\x17\xa5\x34\xca\xec\x09\x0e\x57\x72\xfd\xa9\x0f\x1e\x79\x80\x7e\x94\xfa\xc9\xf8\x39\x8d\xd6\x1d\x36\xa4\x19\xe1\x33\x75\xe8\x77\x51\xae\xec\x36\xa6\x54\x12\x66\xa8\x12\x75\xbc\xc8\x43\x98\x16\x4a\xd9\x0a\x46\x77\xfc\x7a\x71\x04\xbb\x64\x17\x19\x19\x85\xb7\xe9\xe4\x91\x32\x2b\x89\x5f\xc8\x29\x56\x23\x6f\x2e\xd4\xa6\x49\x44\x35\xa5\xf4\xb2\xc8\x0a\x19\xa2\xe3\xe0\xc8\x14\xfd\x79\x80\x27\x57\x24\x2e\x98\x3d\x6c\x00\x19\x0c\x4b\x51\x8d\x5b\x97\xd5\xec\x31\xaa\xe3\xab\x58\x87\x52\xee\xaa\xe6\x8a\xb3\x1b\x00\x5e\x20\x5c\x1c\x67\x93\x8a\x17\x18\xea\x46\x8c\x98\xe5\x46\x1a\x3a\xcf\x07\xe7\x1f\x0e\xa0\x71\x2a\x47\xea\x1b\xd2\x7d\x68\xee\x51\xe7\x91\xa8\x17\x4c\x4d\x8b\x67\x98\x53\x00\x63\x2a\x31\xd1\xc5\x49\x06\x24\xe9\x4c\x14\x10\x9a\xa2\x65\x27\x11\xf5\xa3\x5d\xa4\xa0\x69\x61\xbd\x68\x3b\x1f\x22\xeb\x7b\x27\xe2\xd1\x15\xc5\xdd\x0c\xec\x03\xc7\x16\x9b\x45\xfe\xf7\x55\x06\x19\x0b\x30\x17\xd2\xf8\x90\x99\x49\x49\xd2\x45\x48\x5c\x30\xbe\xa1\xef\x61\xa2\x92\x9c\x6d\x9c\x95\xe0\x40\x8f\x6a\xd4\x76\x28\x31\xc1\xf8\x91\xa7\x9c\xe4\xef\x82\x96\x83\x76\x6e\xe3\xbd\x8c\x59\xbb\xdd\x92\xae\x80\x02\x40\x25\x81\xe6\xde\x87\xb5\x1c\x9b\xe0\x3b\xf6\xed\x16\x7f\x9e\xc9\xca\x9e\x9d\x4d\x17\x6d\xf3\xd2\x61\xb4\xff\xbe\x5d\x96\x14\xe6\xbe\xba\x79\xbb\xa1\xbb\x55\x72\xf2\xe2\x55\xcf\x35\xd1\xe5\x03\x60\x8a\x23\xcf\x38\xfe\xc6\x26\x5a\x33\xef\x84\xc0\x5f\xc9\x4a\x9e\xc4\x41\x97\x18\x7b\x65\x81\x1e\x9a\xc1\x11\xc4\x5b\x39\x77\x1c\xf5\x51\xad\xe8\xa7\xdc\x18\xa3\x8b\xcc\xf1\x2f\xca\x63\xe0\x7c\x44\x38\x37\xe8\x01\xcb\x61\x6f\xe1\xd9\x89\x5a\xba\x5d\x05\xdc\x09\x06\x59\x9b\x3d\xe4\x30\xc3\xf0\x7e\xa0\xc0\xc2\x45\x95\xfa\xda\x9e\xd9\x72\xc5\xd5\xe2\x3c\x5c\x71\x45\x1c\x5d\x5c\xeb\x84\x0e\xba\xbb\xd2\x37\x5c\x62\xcb\x85\x70\xd7\x78\xd8\x51\xb5\x1d\x19\x90\x48\x46\x1a\x8e\x11\x1d\x62\x1c\x45\xf5\x54\x22\x08\xb4\xb0\xaf\x22\xe7\x02\xf8\xf4\xcb\x47\xc7\xfc\x83\x62\xc6\x71\xa6\x3b\x0d\x5b\x27\xc1\xcb\xa8\x58\xb2\xae\xed\x76\x68\xe3\x03\xb7\x12\x23\xbd\x50\x80\x74\x1f\xf1\xb0\x4c\x58\x32\x23\xf1\xf1\xc9\x41\x3f\x0a\x8e\xc7\xbd\x61\x0c\x3d\x60\xd0\xae\xc4\xb1\xe3\x21\xf0\xdf\x96\x57\x1b\x3c\x83\x24\xa3\x03\x75\xe3\xe9\x8b\x10\x6d\x8f\x52\x25\x6d\xa8\x53\xca\x44\x4d\x11\x02\xa7\xc3\x48\x81\x5a\xc2\xf1\x1e\xe9\x6f\x15\xf1\x72\x15\x1f\x5e\x70\xba\x6a\xcd\x59\x37\x7b\x5a\x56\xb5\x0f\xf9\xcc\x05\xb0\x68\x6d\x4a\xba\x18\x7b\x8d\x6d\x51\x68\x03\x98\x19\x41\x52\x2b\xc2\x81\x12\x24\xc2\x3f\x00\x94\xfe\x33\xd9\x0f\x13\x5d\xe7\x3f\x19\xe4\xed\xa3\x53\x0f\xa7\x17\x79\xdb\x68\x74\xac\xbb\x1a\x46\x88\x34\x25\x32\xef\x68\x54\xba\x58\x9c\xae\xff\x91\xbf\x52\x2e\x59\x7a\x30\x4b\xa6\x44\x30\x4b\x89\xd3\x2d\x7d\xa9\xa1\xb9\x72\xe9\x2d\xdc\x48\x24\x18\x6d\x57\x6a\x4c\xdb\x69\xb2\x9a\xa8\xbf\xc0\xca\x01\x09\xf6\x5b\xdf\xd2\x03\x4c\x4e\x1d\x1a\x34\x3c\x96\xe9\x92\x38\x12\xcd\x9e\x5d\x27\x81\xfb\xf1\xb4\xfb\x6b\xa6\x7a\xc3\x20\x40\x94\x6b\x2e\x88\x75\x1a\x63\x5e\xcb\x89\x15\xe4\x04\x9f\xd6\x25\xed\x84\x7c\xf4\x0b\x6d\xba\x23\x89\x26\xa8\xb1\x2a\x1c\xe9\x54\x39\x1a\x46\xb0\xbe\xd7\xc4\x19\xeb\x3e\x9a\x47\xfe\x16\x6a\x41\xf6\xfe\xe9\xe7\xc4\x8c\xb0\x8b\x21\x88\x10\x41\x1a\x8c\x51\x78\x07\xad\x84\x4c\xa9\x0d\x7e\x38\xec\x5f\x58\xa2\x10\x7c\x08\x88\x51\x06\x17\x92\x73\x01\x54\x2a\x5c\x0c\xa0\x32\x6a\x95\x52\xd6\x72\xcf\xd9\x6c\x94\xc8\x67\xbd\x13\x84\x35\x29\x84\x86\x64\x7c\x24\x7c\x68\x05\x32\x58\xf2\xdd\x62\xaa\xa3\xb7\x98\x77\x3c\x6c\x4a\x62\x84\xee\xc7\x27\x43\x97\x73\x7f\x20\x01\xec\x02\x08\xa3\xa9\x2e\xdf\xbf\x60\xab\xbb\xd5\x9b\xd8\xa7\xb0\xa7\x77\x91\x45\x28\x83\xbe\x84\x52\xd6\x5a\x91\xae\x76\xbc\x2a\xe9\x62\x74\xef\x82\x0e\x26\xaf\x33\xf2\x4e\x6b\x7f\xb1\xe0\x57\x62\xed\x53\x6c\x0c\x87\xfb\x46\xe2\x33\x84\x2a\x77\xcb\xfb\x3b\x18\xcc\x6b\x55\xf4\x40\x0e\x2a\x09\xf3\x1b\x93\x1a\xf7\x86\x0e\x02\xc1\xd4\xc5\x57\x2a\xa7\x9a\x06\xdd\x89\xc7\x86\x04\x5b\x46\x21\xc2\xc2\xb6\x1b\x1f\x93\xcd\x6c\xa3\x5b\xab\x6e\xb3\x30\xef\xe0\x21\x0b\x6c\xc6\xe4\xa7\xa6\x5d\xbf\x08\xd9\xd0\x45\xe3\x73\x28\x13\x3a\x55\xf4\x69\x45\x0f\xd4\xa6\x6c\x32\x36\x6f\x35\x48\x3f\xd1\xa4\x3a\xa1\x3c\x01\x05\x99\xf7\xa0\x64\xfa\xe8\x60\x0e\x8a\xa9\x86\x0c\xc6\x6c\xcb\xde\x82\x3d\xe9\x97\x43\xf8\xaa\xe1\x73\x14\x92\xd1\x4d\x76\x65\xb3\xc3\x47\x95\x68\x78\xf4\x15\xaf\x2f\x31\xf4\xa7\x6b\xb6\x25\xda\x75\xfd\x78\x6d\xec\x52\x4c\x84\xf0\x70\x28\xe5\xbb\xf3\x39\xde\x27\x14\x65\x52\x14\x51\x6e\x16\x3b\x41\x73\x49\x92\x84\x38\x09\xdc\x1e\x85\x48\xc4\x3e\x73\xdb\x7b\x0e\x4f\xdc\xd3\xa6\xa5\x4e\x3f\x3e\xe9\xfc\x48\xa6\x79\x2e\x3c\x50\x3f\xc4\x38\x6f\x22\xf0\xa2\x78\xa5\x21\x37\xa2\x0f\x12\xc0\x41\x55\xfc\x44\x38\x4c\x00\x90\x0b\xd3\x30\x86\x76\xe8\xe7\x61\x92\x31\x93\xe8\xe2\x22\x06\x23\x33\x13\x1f\x31\x55\x54\x9c\xdc\xdc\x8a\x0b\x8d\xf8\x10\x7d\x31\x9a\x24\xf9\x60\x72\xfe\xdf\x1f\x6e\xfe\xf6\xae\xb2\x80\xf3\xde\x2e\xf8\x77\x9a\xc4\x8f\x27\xdf\x45\x23\xeb\x5c\xdc\x38\x96\x8f\xd7\x17\xde\x92\x98\xf7\x3f\x6b\x59\x9d\x56\xf7\x08\x2d\xdb\x95\xd8\xfc\xf9\xb0\x20\x24\x36\xc1\x11\x8b\x6d\x80\xdb\xff\x12\x83\xed\x2c\xbf\x79\x3e\xfd\x2c\x0b\x6c\x36\x7b\x2e\x35\xff\x89\x55\xa4\x86\x44\x29\x32\xc9\x65\x3e\x59\x16\xa3\xc1\xac\x07\x0d\xde\x91\xd5\xc8\x9b\xdf\x0c\x7a\xfa\xcf\x64\x36\x3a\x60\xbb\xf1\xae\x14\x47\xf9\x9c\x11\x0f\x31\xb1\x95\xed\xf1\x88\x55\x44\xd4\x24\x90\x41\xa9\x45\x1e\xbd\xc8\x83\x44\x4e\xe8\x2d\x75\x30\xf3\xd1\x98\x8a\xfd\x90\x42\xde\x47\xc1\x8e\xe4\x8f\x91\x5c\x7b\x98\xf1\x27\xd0\xf7\x12\xc0\x34\x9e\x2e\x92\x50\x13\xc1\xf1\x53\xf9\xf7\xdc\xee\xe6\x51\x7a\xa3\x87\x1e\xf3\x9b\x90\xa7\xc6\x7c\xea\x5b\x71\xb6\x72\xcd\xf2\xe8\xb2\xef\x8a\x48\xd5\xf7\xab\x90\xd4\x42\x7d\xa8\x07\x1f\x28\xd6\x9e\xe4\x3e\xca\x0b\x86\x3d\x88\xf5\x72\x36\xef\x39\x66\xdd\x4d\x66\x5b\x01\xf6\x0d\xf3\x1c\x06\x9c\x49\xdb\xcf\xbe\x44\x7b\x0a\xeb\xbf\xb2\xc5\x89\x86\x12\xf4\x9f\x81\xdc\xb8\xa4\x38\x69\xa8\xe6\xf0\x5f\xe5\x6d\xcd\x4e\x8e\xdf\xbb\xf0\x74\x92\xe0\x1c\x78\xaa\x4f\xf3\x76\x75\xf3\x32\x7e\x8f\xd9\xdf\x85\x1f\xe4\xe9\x45\x63\xa3\x94\x8c\x00\x39\xf2\x3d\x9d\x08\x7f\x43\xf2\x4b\x63\x7b\x3f\x19\x93\xf6\x0d\xeb\x65\x2f\x9d\x3e\x9a\xc2\x27\x48\x22\xac\x8d\x4f\x69\x80\x97\x37\xb3\x43\x49\x72\x39\x4d\x65\x84\x24\xcc\x78\xe2\xdb\x34\x98\x4c\x5c\xf5\xf7\xcc\x26\x42\x19\xf5\x48\x22\x84\x77\xcd\x95\xf4\x47\x3c\x03\xb2\x10\xd6\xc9\x3e\x48\xcd\x85\xf3\xd9\xc6\x75\x03\xd9\x01\x73\xd8\xa4\x53\x66\x37\x78\x54\x56\x50\x70\x0e\x2d\x76\x2c\x98\x48\xe7\x11\x23\x3f\xb2\x95\xf1\x10\x84\xc6\xce\x03\x93\xb0\xb0\xcb\x9a\xab\xe2\xb1\xd2\x19\x75\x9c\xb4\x82\xeb\x8c\xbf\xef\x5c\x46\x77\xc2\x0d\xc8\x99\x70\x49\x0e\xe4\x4f\x7c\x4f\x84\x83\x56\x26\x03\xb3\x25\x6d\x3b\x6e\x96\x6d\xe2\x90\xdb\x3c\x49\x25\x41\x3d\x2d\xb6\xe0\x8b\xca\xa5\x39\x6d\x10\x98\xb8\x94\x3a\xe0\xda\x1a\x30\x1f\xc9\x52\x79\xd4\x94\x1c\xd5\xe3\x5d\x51\xa9\x5a\x60\x85\xcb\xbc\x49\x86\xef\x87\x1d\xfa\x64\x79\x52\x2f\x3c\x1f\xc3\xaa\xf1\xa9\x25\xc6\x3b\x87\x5f\x89\x22\x5b\x3f\x09\x3a\xd8\x3a\x3d\xb2\x1c\x27\x8b\x12\x3c\x13\x31\xcc\x1d\xcf\x02\x37\x1d\x99\x92\x12\x1a\xd1\xac\xc6\x85\xab\xd3\x18\x89\xe4\xa0\x73\xf3\xf7\x98\xec\x8d\x9e\xf1\x48\xf9\x10\x00\xc4\x1f\xfa\xa7\x71\x94\x25\x5a\xd9\x38\x02\xf2\x87\x70\x0b\xd2\x79\xef\x29\x25\xd9\x0e\xde\x6b\x52\xb4\x88\x4e\xc2\xf8\x0f\x30\xce\x6d\xc8\xe5\xbd\x27\x95\x5e\x8b\xdf\x31\xab\x23\xcd\xde\x40\xf3\xcb\x51\x48\xf4\x08\xb9\xd1\x5d\x8c\x66\x9c\x70\x76\x8f\xc7\xea\x7a\xd4\x42\xf6\x94\xc4\x82\x8e\xd9\x53\xa6\x3a\xb7\xe9\x34\xbf\x63\x7e\xa0\xab\xb1\x7b\x96\x28\x70\x75\x66\x64\x05\x2a\xc9\x6f\xf8\x61\x0e\x7d\xd6\xc0\xd6\xa2\xe4\x01\xd5\x8f\x54\x25\xb6\x75\xd6\x1c\x47\x64\x81\x02\x04\xfa\xfe\x1f\xb6\x36\x91\xb5\x64\x14\x85\xfd\x88\x62\xe8\xf6\x5b\xa2\xde\x82\x90\xae\x6b\x80\x56\xfa\x89\xce\xe7\xc5\x04\x26\x78\xbe\x68\x4c\xbb\x9a\x3d\xaa\xcf\x9a\x9d\xa9\x4b\xa0\x49\x26\x68\x7a\xe1\x82\xdd\x85\x9d\x08\xee\x33\xc2\x43\x25\x98\x70\x92\xec\xf3\x0f\xf1\xf6\x62\x7c\x6b\xf4\xfb\x52\xd6\xa8\xef\xbc\x17\xd8\x52\xa2\x63\x03\xc5\xbb\x46\xdf\x28\xf8\xa7\x17\x49\xe9\x44\xec\xc8\x67\xa7\xb4\x8c\x2d\xd9\x90\xf9\x80\x03\x93\x6d\x53\x63\xff\xe4\xda\xde\x73\x12\xc4\x49\xe4\x70\x8f\xf2\xe5\xfd\x2b\xce\xf8\xcc\x1f\x54\x6d\x3b\xc1\x30\x2e\x15\xe5\x66\x7a\xf5\x69\x71\x17\x28\x13\xbf\xfa\xa9\xaa\x29\x96\x28\x7a\x66\x85\x85\x89\x8a\x9b\x5d\xd9\xca\xe2\x1f\xaa\xd1\x55\xdc\xfa\x0a\x4e\x6b\x4b\xba\x90\x3e\x9e\x76\x1f\xa6\xc8\x9a\x90\xde\xb9\xb1\x41\xd9\x7d\x9e\x52\x02\x93\xfd\x10\xc5\xe6\x62\xfb\xa7\xe2\xb3\x05\x09\xb7\x17\x91\xef\x1d\xd2\xce\xe1\x73\xfa\x2e\xc5\x25\x3e\xd1\x79\xd0\x35\x25\xe5\x09\xf2\x89\x0b\x28\x2b\x15\xe3\x93\xf8\x73\x88\xc0\xeb\xa2\xd4\x53\x65\x52\xc7\xdb\xa4\x25\x13\xf1\xee\x03\xc9\x57\xef\x1e\x18\x7f\x8d\xbc\x10\xe2\xcf\x79\x22\xeb\xa4\xac\xdc\x8c\xcc\xd6\x25\x09\x09\xe3\x12\xd5\x3e\xc4\xdf\xaa\x66\x6d\xeb\x82\x15\x01\x49\xc1\x90\x6d\x89\x86\xc0\xd0\x66\x00\xfc\xdb\xf4\xb3\x0f\x84\x18\x7f\x64\xb3\xaa\x1e\x63\x2e\xf7\x59\x7d\x45\x15\xc9\x7c\x50\x34\x4b\x11\xe9\x47\x1a\xa0\x5c\x90\x2c\x95\xe0\xc9\x18\x01\x52\x16\x67\x78\x40\x8d\x84\x4f\x63\x95\xdd\x4b\x8b\xc9\xc7\x50\xab\x48\x30\xd2\x8d\xd6\x6a\x7b\xa0\xde\x0d\x26\x88\x8b\xcb\x31\x4e\x0d\x46\x53\xa2\xf4\xdd\x0d\xa7\xfb\xf3\x81\xd7\xeb\x32\xa8\x55\x5d\xf1\x3d\xdc\xfe\x73\x78\xf3\xf7\xbf\x52\x88\xc8\xdb\xfa\xf0\x6f\x38\xc7\x36\xbe\xad\x9f\xc3\xcf\x7b\xb2\x35\x42\x20\x00\xaa\x44\xfb\x18\x13\x98\x6b\xa7\xe4\x13\x3b\xd2\xd4\x25\xdb\x47\x86\x7c\xe9\xef\xd3\x47\x3c\x5f\xeb\xfb\xa0\xe4\xe9\x5d\x7d\xab\x5b\xd4\xa0\x77\x7a\x83\xf0\x35\xb2\x97\x65\x32\xb7\x3c\xb9\xe8\x39\x8c\x30\x36\xbd\xa4\x83\x78\x62\xa3\x3d\xfc\xbe\xc9\xd1\xcb\x5f\xaf\xf9\xbd\x4b\x37\x2e\x71\x3e\x92\xb8\xa6\xca\xe2\x33\x71\x07\xdf\x51\x8c\xcf\x36\xae\xef\xe8\x3b\xdd\xd0\xb1\xbe\xed\xc1\xae\x0f\xc8\xf9\x93\xf5\xac\x6d\x37\x5f\x2f\x65\x1d\x6c\x74\x9d\x6c\x0e\x21\x61\x67\x38\xf4\x17\xca\xfc\x81\xfd\xfd\x08\x1a\x15\xeb\xe5\xc7\x07\xba\xf1\x53\x7e\x98\xb6\x45\x2b\xae\xf1\x0c\xc6\xb1\x91\x04\x67\x12\x31\xf1\x1c\xdb\x92\x02\x43\x60\xa4\x6f\xe7\xce\xc9\x1c\xe5\x24\x4a\x28\x52\x7c\x38\x85\xcf\xf7\x39\x83\x84\xbd\x2e\xc9\x40\xc3\x7d\x28\xd1\xda\x3f\xc2\x74\x29\xaa\xda\x06\x52\xab\x2e\xef\xe1\x0e\xf9\x57\x40\xa4\x3b\xe2\x15\x0a\x97\xe5\xe3\x5b\x47\xce\x2e\xe4\xd8\xbb\x32\x34\xff\x8a\x26\x9b\x5e\xc6\xa8\xff\xc8\xbc\x2b\x5b\xde\x10\xe6\xbd\x0a\x5b\x6c\xac\x3f\x4a\x12\x8c\x91\xab\x29\x69\xfd\xbc\x05\xdf\x26\xa1\x2a\x34\x29\x90\xc9\xe5\xb3\x07\x96\x1e\x4f\xed\x96\x7b\x94\xcc\x6a\x78\x9d\xe2\x5d\xb0\xe9\x26\x60\x0e\xe1\xec\x4a\x3d\x08\xf1\x16\x6d\x9c\x5c\xf8\x5d\x77\x6c\x5b\x74\xed\xcd\x5b\xf8\x19\xee\xc1\x3b\x86\x7a\xcf\x1b\x36\xec\xd8\x1e\x15\x62\x5e\x30\x3a\x55\x3b\x4d\xa8\x2a\x4a\x67\x0a\x5b\xd9\x59\x78\x90\x4e\x39\xb9\x69\x20\x11\x50\x91\xb1\x49\x9e\x82\xbe\x45\xf3\x95\xf9\xba\x69\x9b\x1e\xf8\xe0\x90\xea\x00\x4f\xeb\x9b\xa6\xed\x61\x1f\x6b\x33\xd6\x04\xf8\x5c\x4c\xc5\xd4\x53\xd4\xa3\x13\x38\x61\x8c\x99\xe3\x75\x26\x94\x69\x8a\x03\xcf\x85\xa6\x44\x0e\x6a\x43\xd4\x39\x2c\x49\xf9\x44\xb9\x3b\x2f\xd8\x12\xc8\x47\xc9\x1f\x69\x2e\x0d\x9b\x45\x67\x28\x40\xcd\xa3\x12\x9d\x4d\x47\xab\xee\x1a\x8a\x8b\x31\xaf\x00\x98\xfa\xdd\x1c\x77\xc3\xdb\xcc\x90\xf3\x37\x87\xf0\x10\xc1\x12\xce\x3c\x79\x21\xb3\x29\x4a\xfb\x07\x3c\x8c\x0b\xf3\x7c\x47\xfb\xb3\xb6\x1c\xb4\x35\x1d\x62\x8a\xcb\xe6\x50\x53\xdd\xde\xf3\xd2\xec\xb2\xcd\xe5\x4d\xda\x20\x81\x5b\x7a\xed\x94\x24\xd6\xf7\xed\xa9\xdd\xc1\x9d\xd2\xc6\xc3\x1d\x8b\xdb\xd9\x95\xa4\xab\xf0\x67\xf9\x9e\xed\xc8\x84\x2e\x02\xa1\xf7\x6c\x27\xba\x58\x54\x43\xf2\xe6\xbc\x47\xd3\x66\x71\x51\x2e\x81\x9a\x78\x9c\x56\x73\x05\x16\x60\x16\x98\x50\x7f\xd1\x34\x1d\xf2\xc5\x3b\xe4\x17\xc8\xce\x9d\x03\x7b\xf1\x2c\xc9\xc0\x09\xd8\xb6\x90\x6c\x18\x58\x0b\x14\x02\xa3\xed\xcf\x36\xe3\x1e\xa0\xf5\xc1\xbd\xe5\x66\x23\x60\x8b\x79\x90\x61\xe8\xb6\x5f\xa2\xb7\x94\xcb\xc6\xc7\x8b\xf6\xf4\x14\x73\x29\x63\x95\x4d\x77\xf3\xb6\x4d\xee\xdb\xa0\xf9\x60\xe4\x77\xb4\x5f\x9a\xe5\x79\xf9\x8e\xf1\xbf\xc2\x3a\xef\xdd\xc1\xd8\x0c\x6e\xeb\x01\xf8\x8e\x33\x40\x64\x80\x0a\x17\xfd\x72\x53\x62\x42\x49\x77\x3e\x27\xc3\xa3\x91\x7d\xe4\xda\xfe\x34\x00\x0e\x1c\xd9\x5d\xa2\x5d\x0c\xb4\xe9\xab\x78\x73\x81\x1a\xd8\xc2\x93\x42\xb6\x75\x59\x57\x40\x0e\x7e\xf3\x55\x21\xa5\x31\x3c\x34\xc0\x23\x63\x14\x28\x62\x21\xe5\x8e\x23\xc5\x3d\xb2\xac\xa5\x45\xd6\xcb\x79\xfe\x12\x7d\x52\xab\xe4\xbe\x62\x86\x06\xa6\x49\x96\x57\x4b\xbc\x36\x98\x45\x07\x29\x18\x1c\x1c\x70\x76\x6b\x31\x7c\x5e\xa8\x4f\x6c\x32\xd4\x27\x04\xfd\x04\xd1\xb1\x18\x4a\xed\x82\xb1\xf3\x37\x5f\x0d\x90\xa6\xb6\x60\x5c\x89\x30\x0b\xdd\x7b\x4f\xbc\x1c\xad\xfb\x36\x3b\x83\x17\xf2\xfd\x1a\xe9\xcc\xb8\xcd\x49\x19\x66\x73\xb8\x8d\x4c\xcb\xcd\xa0\x92\xa0\x32\x96\x65\xb0\x53\x2a\x40\x18\xc6\x6e\x23\x29\x47\x90\x6e\x70\x94\xde\x4b\x83\xf1\x63\xc8\xb9\x37\x16\x82\x90\xe9\x97\x2a\xe2\x06\x06\x00\xc0\x21\x68\x35\xe4\xb8\x9e\xb3\xc2\x98\xbf\x28\x97\xb0\x42\x23\x7d\x7b\x29\xc9\xe5\xa5\x6c\x2c\xac\x1a\x17\x31\x21\x90\x48\x51\xb8\x40\xb2\xb1\xf8\x49\x68\x03\xf2\x15\x69\xcb\x35\x0a\x8c\x38\x30\xc7\xd9\x55\x94\x51\x39\xf6\x6f\xd6\x98\x44\xde\x00\xc4\x4b\x55\xfa\x68\xb5\xa9\x99\x3f\x2e\xf2\x5d\xa1\x3e\xa7\xd2\x3a\x0a\xdc\x2f\xeb\x24\x66\x8e\xad\x56\xbd\xf0\x67\x19\xd2\xa8\x5f\x86\x65\x50\x52\x72\x00\x75\x09\x0f\xb5\x7f\x15\x77\x41\xcc\x39\x73\xb5\x03\x19\x12\x3e\x7f\xe8\x8e\xeb\x69\xba\xf8\x10\x76\xc6\xb9\x97\x4d\xbb\x52\x0d\x87\xf8\xb2\x91\x18\x4c\xfc\xd7\x28\x57\x79\x10\x54\x0b\xf5\xa8\x4b\x12\x2a\x90\x91\x40\x19\x09\x97\xd1\x88\x9c\xbf\x8e\x05\xa5\x0e\xee\x07\x61\x67\x3c\x18\xb1\xd5\x55\x0c\x3d\x5b\xf3\x8b\xa4\xd2\xc6\x43\x46\x51\xd9\x53\x20\xc1\xec\x96\x0c\x01\x13\x72\x33\xf8\xd8\xa0\x59\x19\xc6\xfb\x3e\xd4\x05\xcb\x67\x3f\xfa\xf1\x1a\xc3\x27\x17\xf7\x3e\x21\xab\x11\x7d\x43\xfb\x62\x5d\x35\x0b\xca\x15\x4f\xbd\xf4\xec\xfb\x5e\x37\x1b\xe0\xa0\xe0\xa2\xf5\x5b\x20\x8b\xb9\x63\x4c\x3a\xe9\x41\xf9\x31\x41\x03\x06\xa3\x19\xc0\x34\x6c\xc6\xb9\x5d\xc0\x32\xe9\xb0\xd8\xb9\x9e\x6c\xed\x49\xf3\x62\x2c\xcc\xa3\x5c\xa3\x71\x17\xe6\xd8\x60\x5a\xb1\x74\xd1\x18\x74\x25\xf2\x56\x07\x74\x58\x51\x14\x0a\x05\x13\x34\x19\x41\xd7\x40\x22\xd8\xf3\x7e\x7c\xed\x20\x27\xbd\xcf\x2e\x98\xc1\x67\x33\xe9\x88\x53\xea\x73\xa6\xfc\xc3\x9d\x0d\x12\xef\x67\xf2\xfc\x51\x18\xf2\x56\x1f\x9b\x08\x86\x14\x10\x0e\xdb\x2b\xc4\xe0\x82\x71\xc4\x2a\x0c\x3c\xc1\xe2\x61\x0a\xe1\xbd\xd1\x93\xb9\xa4\x1c\x42\x05\x7b\x2a\x1c\x08\x40\x84\xee\x9f\x8d\x8b\xc4\xc3\x79\xb6\x66\x95\x02\x88\xdf\xd4\x56\xdd\x74\x9a\x38\x8a\xd1\x34\x99\x0e\x46\xcf\x42\xfb\xae\xc3\xb3\x19\x68\x31\xd5\xf3\xdf\xcf\x23\x9d\xc4\x0e\xee\xbb\x4c\xc1\xcf\x67\xc4\xe0\x24\xda\xb9\xd8\xee\x8f\x41\xf5\xb6\xa0\xb2\xd0\x0f\x07\x45\x48\xde\x85\x34\x04\xc2\xf8\xd3\x40\x2d\x09\x1d\x1d\xc7\xb6\x73\x6e\x9a\xd9\x9e\xd1\x37\xd5\xfb\x3d\x8c\x4c\xcf\x58\x66\x4e\xc8\x3e\x1d\xfd\x87\x24\xa2\xd6\xe8\xe0\xdc\x74\x68\x06\xc0\xdf\xe3\x87\x88\xbf\x0c\x0c\x13\xf8\xf3\x4b\xd3\x51\x6a\xfa\xe7\x5e\xd6\x2b\x05\x28\xd4\x74\xc1\x6d\x10\x71\x6a\x2c\xec\x95\x5a\xc3\x04\xf6\x24\xed\x17\x84\x9d\xac\x69\x04\x65\x8f\x2e\x8c\xdb\x63\xe0\xf2\xdc\xf4\x00\x1f\x8a\x5e\xcb\xd3\x6d\xe7\x8f\x51\xb6\x34\xfe\x50\x52\x5a\xd1\x55\x88\x28\x67\xa4\x60\xc4\xc4\xd0\xc4\x33\xa7\x9e\x86\x33\x26\xdf\xd5\xa8\xda\x81\xb7\xa8\xce\xe6\xe5\x4a\x60\xa0\x6c\x77\x85\x97\xbf\x6b\x96\x4d\x35\x7b\x88\x9b\x2d\xeb\xc6\x6f\x9b\xa6\xd2\xca\x99\x83\x16\x7f\x3c\x6f\x5c\x07\x50\xe1\xfa\xd6\xad\x98\x4e\xe0\xef\x88\x79\x66\x27\xf0\x1f\xfd\x40\xe2\xd3\x15\x06\x75\xb5\x91\x91\xc2\xc3\xe3\xb8\x58\x9f\xc3\xac\xd2\xce\xa0\xcd\xc9\x58\x45\x7d\x37\xbf\x4c\xc5\x49\x64\x28\xc0\xad\x58\x92\x14\x62\xe4\xc0\x1d\xbe\x79\x63\xcf\x5a\x82\x1c\x7a\xae\x30\x02\x86\xe7\xde\xe8\xe9\x25\x5c\x56\x50\xd2\x82\x35\xbe\xc7\x5b\xb2\xa6\x41\x22\x1b\xe8\x13\x4c\x97\x33\xd5\xc3\x42\xaa\x8d\xf2\xaa\x78\x6a\x0d\xa3\xf3\x6e\x4d\x87\x1b\xbd\x14\x1b\x80\xa8\x2e\xac\x3f\xaa\xe9\x17\x6f\xba\xae\xb5\x0b\x38\xad\x43\x4e\xc5\x24\x16\xb2\x68\xd4\xe8\x0e\x36\x49\x54\x83\x23\x84\x44\xfa\xbe\xa6\x81\x12\x69\xb5\x68\x1e\x1b\x9e\xbf\x0b\x09\xe2\x95\x0f\x17\x2e\xf0\x6d\x93\x02\x78\xa0\x8a\x3f\x5e\xbf\x73\xfe\x00\x54\xd5\xec\xeb\x7b\x70\xa4\xdd\x2d\xd5\x1c\xb2\xcb\x78\xf6\x70\xb7\x44\x3d\xac\x75\x7b\x8a\xc5\xe6\x32\xb8\xa2\x53\x2c\xc9\x40\x83\xbb\xe2\x08\xd6\x31\x5d\x8d\x5f\xfc\x40\xa4\x3e\x96\x3a\x09\xe5\xcb\xf5\x3c\x60\x6f\x91\x16\x98\x3b\x33\x7b\x7a\x5a\x3c\x58\x15\xa7\x0f\xf4\x2a\x6d\xbb\xdd\x9c\x34\x0c\xa7\x4f\x9f\x9d\xe0\x3e\x1e\xbe\xa2\x58\x97\x2e\x0e\x55\x6d\x87\xb7\x07\x2b\xd0\x0d\xa2\x0a\xbb\xe8\x1a\x69\x70\x1c\xbe\x8c\x88\x07\xc9\xc2\x14\xb8\xb7\x15\xdd\x4b\x3b\x5e\xef\xfd\x09\x4c\x5b\x02\xca\x2c\x6f\x7e\x6b\x3a\xe9\xb1\x67\x92\xb5\x77\xd3\x82\xaf\xbe\xd1\x0f\xd9\x7b\xa8\x81\xb4\x08\x96\x60\x58\x80\xb2\x0f\x8f\x3e\x9c\x26\x18\x6f\xde\x55\x2e\x0a\xa3\xf9\xec\xc9\x69\x21\xd7\x91\x8d\x06\x65\xf9\x1b\xbb\xc3\x9a\x73\xf4\x6c\x05\x76\xe1\xd1\x35\x29\x76\xa8\x3a\x7d\x92\x5d\xd5\xfa\x3b\xb4\xab\xc0\xa8\x34\x4b\x81\xcf\x93\x07\x4f\x7d\x98\x9a\x1c\xe7\xc9\x44\x28\xf1\x87\xf2\x25\xd1\x94\xa2\x4c\x22\x4d\xca\x91\xe8\x68\x78\x90\xb3\x13\x03\xbb\xa3\x9b\x1d\xa7\x0f\x18\x9c\x7b\x6a\x1f\x23\xa7\x13\x98\xaf\xac\x7e\x4a\xbc\x9a\xf0\xe8\x24\x7c\x8f\x19\x8c\x33\xce\x02\x05\xef\xc6\x69\xf2\xbe\x84\x28\xf7\xb7\x4d\xf7\x76\x4b\xd7\xb8\xbf\x90\x7c\xe0\xbd\x96\x3f\x0c\xb2\x97\xb5\xeb\x93\x8a\x73\x7e\xf9\x38\x85\xe3\x60\x80\x60\xff\x33\x6c\x13\x8c\x47\x07\xfb\xf5\x7e\xd6\x40\x0a\x90\x44\x42\x5a\xf1\x79\x65\x6f\xb6\xe0\xf1\x54\x5c\x34\x18\x81\x1f\x1f\x0a\x41\xb0\x63\x6b\x32\x64\xac\xb6\xea\xf1\xb5\x89\xaf\x0d\x5b\xb0\x91\xb7\x49\x40\x4d\x1a\x08\x94\xa9\x3c\x9c\x9d\x37\xac\x9d\xc6\xeb\x4c\x32\x16\x8c\x2c\xf1\xa0\xdf\x26\x5b\x36\xa8\x04\x5c\xec\x1c\x54\x02\x9e\x6a\x26\xb4\xae\xd9\xed\xe6\xd1\xdb\x54\x27\x69\xf9\xa2\x3a\x97\x1e\xcb\xd6\x91\x07\x5d\x54\x01\x83\x61\x84\x0a\x18\x0f\x43\x0a\x33\x0a\x43\xbe\x36\x67\x67\x95\xad\x4b\x4c\xa2\x47\x49\x5a\x08\xd3\x97\xde\x3d\xc9\xd7\x5b\xc1\x6d\xc7\x9b\x8d\xb2\x79\x12\x66\xaf\x11\xdd\xc9\xb5\xde\x9a\xf6\xe6\x0d\xca\xe7\x5f\xf3\xdb\x4b\x8e\x6c\xac\x14\x60\xcc\x23\x9d\xb4\x3d\x1d\x32\xc6\x6f\x56\x21\x8e\x0f\x0e\x16\xd7\xd9\xb2\x2f\x9e\xd4\xc9\xa7\x42\x84\x73\xdb\x34\x68\xe2\x01\x2f\x42\x42\x35\xf3\x0d\xd2\x10\x6e\x64\x81\xaf\x87\x81\xf6\x16\x4b\x72\x99\x8c\x1a\xb3\xc1\x07\x20\x23\x56\x9d\x0d\xf4\x43\xda\x1a\xd6\x9b\x37\xbd\xf9\x8f\x64\x91\x46\x93\x25\xdf\x32\x85\x65\x6b\x77\x1a\x16\x65\x83\x7f\x6b\xa4\x00\xbf\x32\x3c\x50\xb9\x5e\xb4\x51\x3f\xd0\x17\x0c\x81\x16\x28\x9b\x1c\xf4\x03\xbc\xb9\x73\x0f\x6c\xa7\xdf\x1e\x00\x34\xac\x34\x20\x90\x5d\x5c\x8a\x3c\x40\x37\x5f\xf4\xf0\x30\xc3\xa5\x64\x20\xc6\x8d\x62\x6e\x37\x8a\x8b\xce\x45\x36\x6e\x3b\x0e\x64\x58\x12\xd1\xac\xd1\xd7\x8a\x4c\x9d\xb8\xf0\x71\x65\x7a\xe7\x93\x02\xc8\xc3\x1c\xd5\x8d\x4e\xcd\x6c\x10\xb8\x97\xe5\xfe\xd7\x9b\x37\x71\x15\x74\xbc\xa6\xf8\x56\x54\xed\x81\xba\x7e\xfb\x4c\x5c\x07\xda\xac\x71\x0a\xd8\xe2\x31\xfd\x5d\x7c\xf4\x21\x14\xdc\xe3\x82\x0f\x3f\x1e\x69\x83\x14\xcc\xb6\xdf\xb2\x5f\xbc\xbd\x2e\x39\x0b\xd8\xec\x29\x7e\xe6\xe8\xfa\x41\x37\xca\xc2\x7b\x13\x26\x71\x5b\x47\xce\xf7\x81\x22\xd2\xbc\x13\xe7\x8f\x7a\xb5\xd0\x93\x7e\xe8\x6d\x86\xdc\x81\x13\x87\xba\x11\x8b\x14\x3e\x0e\xb9\x8b\x50\x96\x31\x5a\xa1\x80\xa0\xf2\xc9\xe0\xd6\x42\x89\x73\x15\x5f\xdc\xd3\xd3\x27\x43\xf4\x11\xca\x95\x5a\xfa\x88\x03\x3a\x9c\xc0\x2c\xd6\x6d\x79\xfa\xdf\x9f\x44\xe6\x4f\xf6\xe3\xa8\x21\x9d\xcc\x57\xc9\x19\xc8\x57\xdf\x95\xe4\x2b\x2e\xee\xb8\xbf\x54\xb6\x2b\xff\x74\xa7\x00\x1e\xbc\xb8\xd3\xd9\xd5\xe2\xce\xc7\x09\x3e\xb6\xe4\xea\x4b\x3b\x77\x62\x36\xa6\xda\x35\x94\x2e\x6c\x7c\xe7\xbc\x64\xb5\x44\x3a\xda\x87\xa6\xf6\x91\xc9\xba\xa2\x54\xd2\x3a\xb8\x69\x24\x18\xcf\xa3\x4d\xa5\x85\x02\xd2\x94\x10\x9b\xe1\x59\xca\xe8\x21\x9d\x34\xba\xc3\x73\x73\xb1\xc6\x91\x54\x28\xea\x76\xef\x9b\xbd\x0e\x37\x67\x1d\x50\xae\x64\xa0\xd5\x8c\xb4\xe4\x47\x1b\xbf\x91\xc6\x73\x25\xc9\xd2\x69\xc1\x22\x50\x3e\xa1\x25\xc6\x66\x78\xd9\xea\xb2\x6b\x10\xd6\x18\x00\x78\x1b\xae\xc6\xda\xb4\xf1\x7d\xf0\xbd\x09\xed\xb8\x34\xbb\x6e\x79\x6e\x22\xaa\x71\x15\xd8\x66\x0a\x76\xa0\xaf\x1d\x87\xbb\x41\xc7\xed\x79\x45\x26\x33\x1c\x11\x87\xe2\x7c\x60\xd8\x8c\x6a\xdd\xc7\xaf\x86\x2b\xbb\xc0\xdb\x46\xad\x4e\x88\x97\xc5\xdb\xa6\xe4\x94\xaa\x7b\xa2\x5e\xb4\x1b\x8d\x2f\x26\x30\xf4\x6c\xff\x76\x53\x69\xd8\xac\x71\x20\xfa\x4b\x5f\xf6\x30\x54\x59\xaf\xf1\xb1\xb2\x64\x16\x4a\x5b\x10\x2e\x07\x87\x99\x21\xf5\x05\x3c\xaf\x08\x5f\x12\x6c\xaf\x6e\xe0\x09\xbc\x0e\x18\xe3\x16\xd2\x3d\x6c\x67\x7c\x84\x11\xf9\xc1\x3a\x01\x7a\x41\xc6\x27\x2a\xf5\x0f\x3f\x0e\x52\x41\x4f\x1d\x2e\x5f\x13\x9d\xf5\xb7\x5f\x3f\xf9\x3e\xab\x39\x8e\x45\xa4\xf0\x20\xfa\x91\xf2\x03\x98\x86\x54\x1e\x84\xe3\x89\xb7\x0d\xca\x8e\x08\xc9\xf3\xad\xf4\x80\xe2\x6b\xcf\xf1\x85\xa6\x74\x32\x16\x2d\xeb\xf0\xae\xd4\x87\xdb\x1b\x09\x53\x48\x89\x1b\x89\x05\xf8\xb4\xb8\x7b\x39\xec\xd4\xa1\x23\xfb\xc9\xc1\xd6\xa5\x86\x72\x95\x81\x8c\xf6\x36\xf5\x27\xc5\x86\x6f\x72\x50\x6c\xe3\x36\x7e\x44\x5c\x71\x44\xbe\xa5\x15\x58\x3f\xaa\x96\xb5\x78\xc1\x55\x17\x3d\xde\x21\xd7\x37\x2b\xb8\x73\xe8\xb1\x12\x37\x90\x8f\xd6\xa5\x75\xc9\x98\xe1\x12\x4d\x69\xe3\xca\xfc\x95\x82\x07\xe5\x33\xa9\xd3\x9a\x80\x79\xf8\x55\x46\x14\x60\x5a\x80\x90\xae\xb5\x11\x8a\x66\xfb\x72\x4f\x33\x3b\x7b\x91\x4e\x3e\xa2\x64\xa4\x2e\xb0\x07\x97\x16\xe5\x32\x5a\xbb\x6e\x08\x63\x10\x93\x11\x83\x8e\x56\x1c\x3e\x00\x7d\xe1\x6a\x5b\xae\x48\x32\x73\x68\xa7\xe0\xd6\x5b\xe1\x80\x4f\xe1\xd6\x03\xcc\x8e\x12\xe9\x82\xc5\x10\xd9\x70\x93\xd9\xfe\xff\x85\x53\x0b\x69\x36\x9c\x6f\xac\x4d\xd6\x4b\xbf\xab\xac\x59\xfd\xe6\x2b\xd2\x6e\x9a\x91\x6d\xd5\x45\x57\xf6\x8c\xed\x39\xfc\xaa\x53\x74\x77\xde\x75\x3b\x17\x47\xa2\xfb\xf6\xd9\xb3\x93\xd3\x6c\x31\x51\x27\x3c\x29\xb4\x65\x4a\xe8\xd7\x0c\xfb\xed\x2c\xa9\xdd\x75\x03\x1f\x50\x98\x91\x43\x88\x4f\x2b\xcb\xb3\x3b\x7b\x42\x7a\x12\x2b\xc1\x49\x06\x8f\xc8\xba\x65\x7f\xd0\x08\xa5\x7c\x23\x9f\xb2\xbd\x3d\x2b\x57\x68\x99\x8a\x19\xe6\xb9\x45\x24\x60\x90\x50\x31\xf4\x0c\x92\x76\xc5\x14\x14\x1e\x34\xac\x01\xf5\x44\x32\x7f\x54\x00\x8d\xcf\x1d\x2b\xe9\xc4\x28\xd4\xcd\xb9\x5d\x9f\x57\xf0\xff\x2e\x9a\xde\x48\xc0\x1b\x38\x30\xb3\x71\x24\xe9\xa1\x74\xe9\x4d\x42\x0d\x60\xaf\xa8\xab\xa3\x1e\x91\xed\x72\x41\xd7\x47\xb6\x1f\x51\x32\xe6\x86\x22\xad\xf6\x1c\xc1\xdd\xb1\x12\x65\xcb\x66\x6c\xdb\x83\xfd\x61\x24\xaf\x16\xde\x45\x54\x39\xdc\xd2\x33\x7c\x5f\x34\x55\xda\xb7\x95\xc8\xae\xa3\x7d\x73\xa0\x99\x5b\x7a\x64\xd6\x87\xfb\xa3\x58\x83\x1a\x81\x26\xee\x0e\xe0\xdc\xb4\x6b\x52\xd0\xc3\xbf\x94\x65\x2f\x1d\xce\xae\x5b\x35\x71\xc2\x77\xf0\xa9\x5d\xb7\x41\xb8\x9e\xc2\x37\xd7\xa7\x1c\x5a\x5a\xdd\x67\xe6\x92\x24\x58\x3e\xd4\xe2\xb0\xe5\xb2\x6a\xea\x30\xce\x63\x72\xcc\x49\x73\xbb\x1e\x68\x48\x91\x09\xb5\x9d\x8f\xf5\xc7\x11\x15\xdf\xab\x03\xb1\x52\xc0\xe6\xb0\x0d\x23\x75\x63\x8e\x53\xc0\x74\xc8\x69\x8e\x03\x2d\x36\x21\x0a\x7c\xd8\x80\xd9\x4c\x75\x9f\x98\x2e\x5b\x20\x20\xbf\x82\xff\xa8\x89\xb9\xf7\xac\xc8\x55\x2c\xfa\xd9\x01\x36\x5f\xc1\x63\x36\x83\x3b\x79\x86\x86\x17\xbe\x7e\xf9\x4b\x17\x2c\x4d\x5c\x6e\x9f\xa1\xd5\x28\x84\x4b\xd3\x27\x81\xf4\x0e\x54\x2d\x7f\x29\x97\xbd\xb7\x74\x23\x31\x00\xc6\x0c\x66\xe0\x8a\x3a\x6c\xc4\xe4\xb6\x5d\x50\x96\x0f\x8a\x30\x4c\x1f\xc3\x62\xb2\x7c\xac\xba\x16\xe4\x65\x01\xe5\xbd\xa2\x70\x88\x87\x07\x8f\xc4\x14\x54\x47\x7d\x53\xd4\xe5\x43\xf2\x0d\x22\x0f\x7b\xc0\x5d\x45\x1b\x50\x78\xa8\x55\xd9\x21\xb9\x20\x81\x7f\x38\x03\x5e\x17\x55\x37\x05\xd6\x00\x00\x76\xbe\x1d\x92\xb8\xa9\xdf\x89\x9f\x42\x59\x95\x4b\x8a\x96\x00\xd8\x4f\xb4\x75\x64\x2a\xea\x6b\xc0\xbc\x43\x1d\x8e\x29\xc3\x51\xb5\xad\xd4\x67\xd4\xa4\xd5\x6d\xcd\xb2\x07\x6e\x44\x1e\x3b\xbb\x90\x77\x02\xf5\xc4\x51\x33\x13\x8d\x42\x02\x41\x6e\x85\xe2\x3b\x89\xe4\xa6\x73\x6a\xf2\x9a\x38\x9b\xc4\x7a\x3c\x32\x44\x09\xcb\x8b\x18\xd6\xf8\xd3\xfc\x93\xc4\x1f\x2a\x5e\x6b\x74\xce\xfa\xb5\xd9\xcd\xbe\xdf\x4d\x07\x53\x15\x89\xde\xe8\x89\xdd\xea\x52\x30\xf9\x89\xcf\xe3\x85\x46\x07\x21\x0d\xbc\xba\x57\x99\xd4\x58\x23\x89\xea\x78\xd7\x61\x48\xc7\x49\x5b\xd6\x3e\xc5\x14\x92\x9b\x70\xc9\x96\x59\xb3\x28\x45\xfc\x27\x69\x8a\xf8\x90\x2c\xff\x8f\x2f\xb0\x4b\x4e\x16\x0f\xbd\x4a\x16\x4e\xea\x15\xa6\xb2\x34\xe3\x01\x45\x7b\x0e\x88\x05\x8f\x48\x96\x77\xdf\xb5\xcb\xfb\x79\xa7\xa9\xdb\x5b\xd6\x02\xeb\xfd\x37\x1d\x9c\x77\x82\x34\xc2\xb3\x9f\x03\x2f\x7a\x61\xa2\x44\x23\xd1\x5e\xdc\x67\xdd\xf1\x7d\xde\x95\x3f\x48\x22\x7c\x4c\xf0\xcf\xe9\xa6\xa5\x23\x24\x11\x57\xd7\xbf\xbb\x0f\xc9\x65\x2f\x9d\xa4\x19\xec\xf7\xaf\xdb\xdf\x3f\x27\x5e\x5d\x12\xc2\xf6\xe7\x70\xe0\x07\x52\xb2\xc7\x5d\x53\x82\xb3\x83\xab\x4d\x3b\x96\xd0\xb6\xff\x52\xbf\xb2\x03\x59\xc7\xc3\x8d\xf8\x57\xa6\x0e\xf0\x86\x66\xc1\xb2\xcb\xaa\x06\x21\xca\x59\xdd\xb7\x82\x7f\x97\x7d\xbf\x9d\x1e\xc9\xec\xfe\x73\x48\x72\xfe\xaf\xed\xb5\xcf\xb1\x42\x57\x84\xed\x59\x2e\x32\xfb\x18\xb9\x74\xfe\xc6\x65\x09\xbb\xc6\x6e\x33\x05\xf1\xed\xcc\x7a\x16\xed\x00\x86\x3f\x4b\xe6\x44\x97\x8b\x6e\xcc\x1f\x87\x37\x6b\x70\x17\xb3\x6b\x8d\x01\x1d\x25\xc9\xae\x8b\x03\x34\x6a\x10\x83\xbb\xab\x28\xde\x1d\xa0\xa7\xae\x69\xaa\x17\x13\xb3\x6e\x66\xa6\xdb\x01\x73\xb3\xff\x75\x72\xd6\x36\x5b\x0a\xcd\xa0\xc9\xe7\xd1\xaa\xf9\xe6\x37\x44\xe0\x2f\x67\x1c\xa3\xe1\x13\x37\xfb\x44\xa2\xf7\x5b\x4c\x30\xfb\xc9\x16\x7e\x6b\x4e\x51\xfc\x7d\x8e\xe5\x5d\x8f\xd4\x28\xfe\x5c\xc1\x4f\x0e\xdc\x85\xbf\x5e\xc2\xaf\xba\xa4\xec\xff\xfc\x01\x5e\x52\x6c\xbf\x7f\x0d\xe4\x2d\xb7\xbf\x82\xdf\x30\x10\x15\xbb\x12\x88\x95\x95\xc3\x94\xf2\x9a\x30\x80\xb3\xc6\xd7\xa8\x87\xc6\xcf\x3c\x32\x7f\x3e\x6f\xfa\x96\xeb\xe2\xf0\x86\xbe\xad\xcc\x15\x7d\x5a\xb1\x59\x11\x26\x1a\x46\xaf\x57\xfc\x24\xf3\xe0\xaf\x30\x8f\xee\x9c\x7b\xc4\xb9\x00\x81\x80\x5f\xaf\x4a\xc3\x3d\xc2\x84\xe8\x43\x6b\x5e\xce\x75\x52\x3a\x23\xfa\xa8\x53\xd2\xf9\xc0\xfe\x02\x5b\xb9\xc3\x7c\x82\x2f\x26\x9a\x71\x59\x53\x2d\x3f\x2a\x2f\xcb\x6a\x89\x9a\x5f\x71\x44\xba\x79\x53\x5a\xb5\xa0\x0a\x09\x37\xa1\x82\xa4\x1f\xeb\xd7\x37\x6f\x34\xc4\x17\x06\x72\x9a\x4e\x34\xb7\xbb\xad\x77\xbd\x28\x09\x28\xfe\x6b\xef\xb4\x4f\x0c\x8c\x10\x27\xb8\xca\xfa\x98\x4e\x48\x43\x81\xd1\x21\x17\x40\x35\xfe\x99\x3c\x5e\xe0\xda\x50\x64\xff\x8f\xfe\xfa\x57\x22\xe2\xed\x75\xf9\xb7\xbf\x15\x4f\xbf\xfc\x98\xe4\x1d\xcc\xf5\x16\x5b\x25\xec\x1b\x0d\xaa\xd4\x48\xc3\x1e\x1b\x02\x1b\xf0\xe7\xa4\x2d\x86\x2c\x23\x27\x66\xb2\x69\x13\x27\x66\x71\x3d\x99\xfc\xff\x01\x00\x00\xff\xff\xfd\xf7\x23\xdf\xa6\xee\x00\x00") - -func confLocaleLocale_lvLvIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_lvLvIni, - "conf/locale/locale_lv-LV.ini", - ) -} - -func confLocaleLocale_lvLvIni() (*asset, error) { - bytes, err := confLocaleLocale_lvLvIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_lv-LV.ini", size: 61094, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_nlNlIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\xbd\x5d\x72\x1b\x49\x92\x2e\xfa\x8e\x55\xa4\xd4\xa6\x2b\xc9\x8c\x84\xa6\xba\xe7\xda\x1d\x2b\x2b\xa8\x2e\x25\xaa\x24\x75\xe9\x87\x23\x52\x55\x76\xbb\x4c\x86\x4a\x20\x83\x40\x12\x89\x4c\x74\xfe\x10\x22\xdb\xda\x6c\x16\x70\x17\x70\x66\x09\x63\xf3\x70\x36\x70\xde\x6a\x27\xb3\x92\xe3\x9f\xbb\xc7\x5f\x66\x82\x52\xf5\x3c\x9c\xb6\x2e\x11\x19\xe1\xf1\xef\xe1\xe1\xee\xe1\xe1\x9e\xee\x76\xf3\xcc\x34\xcb\xd9\x0b\x53\x26\xc6\x94\xd7\x55\x97\xe5\x2b\x93\xdc\x9a\xe2\x72\x65\xd6\x55\xd3\x9a\xe4\x65\xde\x26\x8d\xa9\xaf\xf3\xa5\x49\x56\x04\xbb\xae\xcd\x35\x41\xe7\x65\xf2\xb2\x9a\x4c\xd6\xd5\xd6\xcc\x5e\xd1\x3f\x93\x2c\x6d\xd6\x8b\x2a\xad\xb3\xd9\xa9\xfd\x35\x31\x9f\x77\x45\x55\x9b\xd9\x4f\xa6\xde\x98\xb2\x34\xe5\x64\x6d\x8a\xdd\xec\x15\xfd\x33\x69\xf2\x55\x39\xcf\xcb\xd9\xeb\xb2\xa8\x56\x2b\xca\xe2\x84\xaa\x6b\x67\x1f\xf3\x36\x4c\xea\x76\xb3\x93\xb4\xdc\x9a\x22\xa3\x94\xda\xac\x72\xea\x55\x3d\xfb\xc0\x3f\x6a\x53\x53\xe2\xde\x2c\x9a\xbc\x35\xb3\x9f\xe5\xef\xe4\xda\xd4\x4d\x5e\x95\x68\xb6\xc9\xcd\x64\x97\xae\xcc\xec\x2c\x5d\xe5\x65\x3a\x69\xcd\x76\x57\xa4\x04\x7b\x7e\x95\x2e\x8a\xaa\x2a\x27\x45\x5a\xae\x3a\x40\x5c\xa4\x69\x31\x59\xd6\x86\x72\xe7\xa5\xd9\xcf\x9e\xd7\xe6\xb7\xff\xa4\xea\xa7\xd3\xe9\xa4\xa3\x19\x98\xef\xea\xea\x32\x2f\xcc\x3c\x2d\xb3\xf9\x16\xc3\x7a\x69\x16\x75\x97\x6f\xa8\x15\xce\x32\x45\x42\x13\xb3\x35\xa6\xe6\x8e\x9b\x8c\x86\x37\x4f\x1b\xf4\x7e\x65\xd0\xff\x24\x2d\x9a\x09\xd7\x55\xa6\xdb\xb0\x78\x99\xa6\xdb\x89\xd9\xa6\x79\x31\x7b\x71\x8c\x3f\xd4\xe7\xa6\xd9\x57\x34\x99\x3f\xa7\xcb\x75\xbb\xaf\xe8\x27\x8d\x7d\xde\xde\xec\x78\x36\xf3\xcb\x7c\x99\xb6\x34\xb6\x65\xba\x6b\x97\xeb\x74\xf6\xfc\xe4\xec\xe2\xf9\xab\x93\x09\x01\xed\x2a\x9a\x84\xaa\xbe\xa1\x29\xb2\x3f\x27\x55\xbd\x4a\xcb\xfc\x96\x8a\xd0\xb4\xbc\xe7\x8f\x86\xcb\x6f\xf3\xba\xae\xea\xd9\xf9\x2e\x37\x2b\x53\x4c\x68\xdc\x73\xd4\x30\x7b\x97\x9b\x6e\x6f\x12\x5f\x1b\x67\x6d\xf3\x55\x8d\xc9\xd3\x5c\xf9\xa4\x5a\x24\x8f\x6b\xd2\xac\x1f\xab\x9d\xa6\x5f\x56\xf5\xc6\xa6\xfe\x40\xbf\x39\x91\xfa\x63\xd3\xaa\xb0\x37\x69\x49\x2b\xc1\xb9\xcf\xcc\x9a\x26\x32\xcc\x6d\x26\x69\xb6\xa5\x19\xdd\xa5\xa5\x29\x66\x27\xf8\x8d\x9f\xd4\xeb\x74\xb9\xac\xba\xb2\x9d\x37\xa6\x6d\xf3\x72\x45\x33\x2e\x09\x79\x49\xa8\x52\x14\x94\x04\x5c\xb2\x99\xaf\xc3\xd4\x9b\xaa\x73\x0b\x3b\xfb\xb8\x4f\x74\x21\x25\xdd\x15\xa1\x8c\xa8\x2e\x6a\xb1\xcd\xaf\x73\x74\x8a\xda\xe2\x9f\x86\xfe\x5f\x4e\x76\x5d\x51\xd0\x04\xfe\xb5\x33\x4d\xdb\xcc\xce\xe8\x2b\xb1\x5f\x93\xbc\x69\xe8\xc7\xec\xc7\x3d\x7d\x61\x34\xb4\x76\xe5\x12\x23\x29\xcb\xae\x60\x3c\x9e\xfc\x82\x56\xd2\xa2\xf8\x34\xd1\x1f\xdc\x59\xfa\xcb\xb3\xd3\xd2\xbe\x30\x61\x0a\xfd\xd8\xed\x08\xe5\xae\x09\x3d\x92\xcc\xd0\x0e\xae\xb1\x63\x37\x3c\x71\x3b\xca\xad\xd1\xa7\xac\x5a\x12\x8e\xcd\xb1\xf3\x68\xdf\x9c\x14\x4d\xd2\xd1\x46\x66\xd4\x4b\xb6\x69\xba\x69\x69\x23\xaf\x9a\x64\x91\x63\x83\x26\xa7\x0c\x7d\x94\x14\xc6\x34\x49\x96\x96\xa8\xf7\xbb\x34\xa1\xba\x56\xa6\x9d\xdd\x9f\x2f\x68\xbf\x6c\xee\x27\x44\x05\x2e\x67\xf7\x1f\x34\xf7\x9f\xd6\x39\x21\x68\x91\x5f\x51\xe1\xef\x9e\xa4\x4f\xb9\x33\x59\xda\x52\x23\xb9\x69\x9b\x84\xf6\x22\xed\x17\x0c\x8f\xba\x44\x95\xdd\x9a\x64\xc7\x5b\xf1\xde\x04\x33\x43\xb3\x36\xcf\x16\x42\x84\xb8\x1b\x04\x6f\x68\x63\x27\x6f\x6f\xce\xff\xf5\xcd\x51\x72\x46\x34\x68\x55\x1b\xfe\x7d\xfe\xaf\x04\xfd\xa7\xa4\xba\x4c\x2e\xf2\xd3\x67\xd3\x09\x95\x93\x29\x39\x4d\xdb\x74\x91\x36\xe6\x38\x5a\x24\x64\x63\xbb\xb8\x5c\x7c\x4d\x40\xd4\x88\x60\x35\x2d\xef\xc3\xfe\x1e\x1c\xdb\x76\x54\x0f\x6f\x57\x5b\x4f\xc2\x90\x94\xaa\x33\xaa\x55\x24\xaf\xcb\xb2\x3a\x7d\x46\x24\x80\x46\x47\x7b\xc3\xd0\x14\xb4\x97\xff\x32\xa7\xae\xd0\x14\x14\xf3\x65\x9e\x6c\xd2\x9a\xa6\x9b\xda\xa2\x3c\x5e\x33\x1e\xe4\x74\xd2\x34\x05\x11\x94\x8c\x88\xd2\xf9\x9b\x63\xfa\xd1\x35\xd4\x91\x76\x4d\x34\x2b\x9b\x34\x7f\x2d\x30\x47\xda\xd6\x2b\x2a\xb9\x4b\xb3\xe4\x5a\x16\x86\x4a\x63\x4a\x8e\xed\x9c\x1c\x67\xda\xc7\xe9\x77\x8b\xfa\xa9\x2c\x35\xcf\x2a\xe3\x02\xc8\x0f\xa8\xbc\x25\xe7\x47\x84\x06\xe6\x92\x17\x19\xa9\xe9\xa2\xa9\x8a\xae\x93\x06\xaa\xdd\x74\x62\xea\x7a\x4e\xe4\xb2\xbd\xc1\x0a\x71\x87\xb4\x3d\xdb\x5c\x22\xcd\x95\x1b\x94\xd8\xa6\xab\xa4\xa4\x25\x07\xe6\xac\xa4\x70\x5e\x5e\xa7\x45\x9e\xd1\x2a\xd9\x39\x8c\x4a\xf1\x44\x4a\x99\xd6\xd0\xf9\xd0\x24\x9b\x8e\x71\xf0\xfe\xf4\x3e\x28\xe9\xfd\xe3\xfb\xd3\x49\x59\xcd\x65\xdb\x83\xea\x66\x44\x09\x16\x44\x81\xe5\x14\xa8\x85\x9c\xfd\xd9\xa0\x5c\x2b\x15\x65\xa0\x59\x36\xd3\x24\x84\x5f\x54\x77\x42\xa7\x56\xba\x31\x05\xd5\x79\x5b\x01\x19\x79\xbc\x0b\xa6\x30\xf4\xd5\x24\x4a\x40\xc2\x21\x5b\x5a\xa3\xf8\xf0\xcc\x02\x27\x7b\x87\x19\xb4\x9e\xa5\x1f\x72\x72\x4b\x7b\x60\x3a\x99\xd8\xf5\x16\xd4\xbc\xa8\x0c\xea\x20\x8c\xa4\xd9\xc7\x29\x40\xa8\x11\x61\x29\x8e\x60\x9e\x9a\x93\xdd\xae\x10\xa2\xce\xf8\x65\xd3\xed\xca\x9f\x15\x69\x4a\xdb\x69\x9d\x53\x17\xae\x22\xaa\xc9\xb3\x48\xc7\xf1\xaa\xae\x68\xa8\x05\xd1\x2c\x1a\xd2\x3d\x3e\x08\x64\xd5\xdc\x39\x40\x14\x23\x21\xec\xc8\x69\x63\xe7\xb5\x59\x72\x8a\x87\xf3\x14\xa2\xc0\x24\x6e\x2b\x3d\xfc\xeb\xb0\x38\x26\x43\x4e\x7f\xde\xca\xbe\x1e\xc2\x18\xe2\x0e\x8a\x14\x63\xaa\x3b\x3a\xb5\xb1\xbb\xe8\x24\xbf\xae\xb0\xf7\x33\x63\x49\x8e\xdd\x69\x16\xc6\xb6\x7a\x8a\xea\x1c\x4c\xb2\xad\x80\x15\x95\xa1\x51\xae\x92\xb5\x59\x2c\xa8\xd1\xb6\xe2\xf5\x5d\xc5\x7d\x0a\xfb\x80\xe3\x17\x05\x19\xe7\x15\x99\x3c\x19\xa4\x83\xb5\x9c\x9d\x12\xaf\x92\xdb\x2f\xd7\x38\x55\x49\xeb\x7b\xd9\xd2\xc0\xae\x8b\xca\x64\x42\xab\x92\xf3\xf3\x57\xc9\x06\x5c\x42\xf2\xf1\xc3\x9b\x86\xf6\xe9\x7a\xbe\xab\xea\x96\xf6\xe9\xab\xe3\x1d\xa1\x40\xeb\x92\x6c\x4d\xef\xba\xed\x96\xba\xaf\xfb\x93\x61\xa8\x83\x84\x88\x7b\x54\x76\x8c\x9d\x47\xd9\x3a\xce\x96\xc8\x2c\xad\x2a\x01\x28\x0a\x55\x5b\xdb\xea\x65\x57\x2e\xc7\x10\x78\x3a\x59\xb7\xed\x4e\x7a\xf1\xea\xe2\xe2\x4c\xbb\xe1\x12\x1d\xba\x20\xb9\x94\xce\xec\xd3\xb4\xa6\xe1\xb5\x38\xdc\xe8\xc0\xde\x6e\x53\xec\xbc\x3a\x29\x3a\x66\xa5\x08\xed\x81\x6c\x5d\x5d\x04\x38\x88\x01\xdb\xe4\x2f\xcd\x12\xfa\xf1\x04\xff\x9c\xeb\x64\x51\x99\x06\x6b\x41\x79\xfc\x13\x13\xc0\x18\x93\x30\x8f\x63\x91\xc8\xce\xc2\x84\xb8\xbd\x79\x5d\x55\xad\xa0\xeb\x9b\x6a\x75\x4c\x04\x25\x4e\xf5\x7d\x90\xc5\xbe\x91\x51\x11\xcc\x02\xc7\x60\x99\xf1\xf9\x62\x31\x50\x5b\xa0\xdd\x58\xed\x40\x23\xdc\x76\x7c\xcf\x9f\x34\x91\xf1\x26\xe4\x6e\x29\x88\x30\x60\x8e\xe5\x8d\x79\x88\x2d\x4d\x33\x9f\x20\xe7\x6f\x2f\xce\x12\xfc\x92\xb4\xcb\xba\xda\xce\x4e\x2e\x6f\x81\xe9\xb5\x4f\xb2\xbd\x7e\xc1\x55\xa6\x9a\x7f\x94\x7c\xf8\xe1\x79\xf2\x7f\xff\xe9\x8f\x7f\x9c\x26\x98\x53\x90\x91\x95\xd9\x63\xe6\x40\x97\x64\x8e\xd2\xac\xa6\xed\x06\x9a\x02\x6a\x8b\xd5\xbb\xff\x8e\xf6\xcd\xfd\xef\x38\xfb\xff\x35\x9f\x53\x62\x64\xcd\x74\x59\x6d\x9f\x26\xc4\x62\xd1\x41\x4e\xeb\x88\x2c\xda\x52\xbc\xf7\x6c\x6f\x12\x23\x03\x7a\xd2\xdf\x81\x0a\x3c\xce\x69\x0a\x97\x3d\x5f\x56\xe5\x65\x5e\x6f\x85\xc9\x01\x5b\x11\x12\x57\xee\x49\xc3\xf5\xcc\xcb\xaa\xcd\x2f\x6f\x3c\x9c\x34\xca\xa9\x82\x50\xb4\x7b\x18\xf7\xe7\x3a\xb1\x3a\xdb\xe7\xb2\x21\x70\xfc\x30\x97\x90\x9c\x4b\x76\x13\x9f\xe5\xd5\xe5\x25\xfd\x32\x72\x4a\xbe\xbf\xbc\x4c\x0a\x3e\x63\x71\x54\x62\x85\xec\xee\x88\xe0\x68\x3f\xec\x48\x76\x38\x97\xcc\xe4\xf9\xe9\x3b\xde\x4d\x84\x88\xb4\x0f\xb2\x0e\xdb\x8b\x2b\x38\x22\xca\x4c\x08\xe1\xf1\x48\xd1\xb3\xa8\x36\x24\x11\x24\x29\xb8\xf7\x45\xc5\xe8\x64\xcf\x1f\xda\x45\xd7\x74\x88\xd1\xd9\xaf\x3f\x6c\xb7\xd1\x82\xef\x4d\x1f\xbc\xd7\x23\x57\xd8\x8f\x7e\x51\x57\x4c\xb4\xa8\x1a\xed\x96\x80\x38\xc2\x9b\x81\x6d\xf0\x0b\x49\x3f\x7f\xfb\x5f\x24\x63\xe1\xc4\xbe\x14\x6c\xe1\x51\xd0\xde\xc8\xa6\x93\x4b\x43\x95\x12\xbf\x9e\xcd\xb5\x7d\xda\x9d\x1b\xea\xc0\x8b\x12\xdd\x4a\x7e\xb0\xd9\xc9\x89\x36\xf2\x86\xf3\x0f\x95\xd3\xee\x6b\x69\x07\xe4\xba\x28\x50\x44\xa6\x13\x42\xc0\x20\xbf\x02\x8f\xda\x10\x43\x4d\xf3\x63\xb7\x15\x98\x14\xca\xa1\x59\xce\x17\x3a\x0d\x7e\x7a\xa3\xe3\xdd\xce\x16\x64\xd2\xde\xd1\x3e\x5a\xa0\x37\xc9\x23\xc5\x64\x66\x31\xe9\x38\xe3\xdd\x41\xa1\x4c\x40\x43\x9c\xcc\x06\x8b\x6d\x78\x9c\x73\x2b\x61\xbd\xf6\x68\x96\x3c\x97\xb4\x1e\x88\xb6\xfc\x13\x73\xb0\x89\x26\x26\xcc\x02\x71\xd3\xcc\xf2\xa1\x3f\xc7\x61\x87\xae\xd3\xd2\x2f\xe8\x54\x98\x62\x92\xf4\x54\x3c\x9e\x5f\xe7\x24\x8a\xda\xc1\x28\x73\x6c\x80\x94\x10\x28\xc1\x56\xd0\x99\x21\x0c\xf5\xc3\x06\x27\xc5\x6d\xce\xc7\xf3\x68\x3d\xda\xc1\x13\x19\x3d\x76\x16\xd1\xcf\xe8\x68\xb6\x73\xe1\x6a\x5c\x98\x4d\x7e\x45\xd3\x71\x44\xbf\x6e\x2b\x13\xc2\xe8\x24\x52\x79\xaa\x25\x2f\x9f\x84\x83\x72\xe5\xd1\x9d\xa9\x0a\x6e\x2a\x4e\x09\xb3\xff\x91\xa8\x27\x8e\x12\xe6\x9f\x88\x59\x36\x46\xb9\x50\x80\xba\x7a\x74\x4d\x30\x30\x5e\x95\xa3\x24\x8b\xb8\x04\x2a\xfb\xfa\x74\xf6\x4d\xb2\xa9\xf3\xab\x15\x31\xb8\x5d\x4b\xe7\x7a\x9b\xd3\x4a\xc5\x15\xd1\xa1\xb1\x6e\x7d\x4f\xbc\x24\x65\x29\x4c\xc0\x0d\x6a\x9b\x0a\x3a\x26\xa9\xf7\x78\xc3\x80\x70\x2a\xbd\xf4\x79\x22\xab\x9b\x88\x6f\xd4\xf2\x22\xef\x7b\xc6\x52\x25\x7f\x95\xfc\xe6\xab\x4a\x65\x55\x9e\xe7\x9a\x79\x9a\x49\x4b\x44\x6a\x4e\x0c\xd0\xfc\x12\xc4\x3b\x9b\xbd\x64\xf6\xa0\xd1\x69\xa4\xf5\xec\x36\xed\xb7\xc9\x43\x82\x78\x98\xd0\xd1\x40\xf2\x74\x56\x25\x0f\xae\x55\x8a\xf8\x13\xc8\x34\xf6\x74\x5e\x00\x6f\x21\xd6\xb2\xaa\x84\xb6\x63\x6e\x32\x94\xc7\x29\x0a\x4a\x44\x13\xd3\x95\xc0\x2e\xc6\x59\x65\xfb\x69\xf2\xab\x7d\xc9\xc4\x86\x56\x81\x48\x6d\xbe\xcc\x7f\xfb\x4f\x90\x4e\x5a\x6b\xc2\x35\x5b\x19\x30\xfa\x01\x91\x55\xcb\x90\xaf\xaa\x45\x97\x17\x99\x66\x4f\x27\x56\x2c\x20\xa1\x40\x51\x02\x3d\xb1\xa2\x4b\x74\xe2\x0a\x49\xe3\x8a\x96\x55\x8d\xa3\xff\x5b\x0c\xc7\xd6\x30\xca\xe3\x2a\x8b\xbb\x4d\x77\x09\xfd\x19\x94\x75\x8c\x27\xe6\x82\x90\x65\xb9\x26\xde\x13\x64\x61\xc8\xa9\xba\xf2\x94\xb8\xee\xf2\x2c\x5f\xf9\x3c\xaa\xab\x49\x8e\x9f\xd2\xbf\x93\x26\xbd\x36\x72\x52\xae\xec\xba\xfc\x28\xfc\x9f\x24\x76\x82\xcb\x5c\x13\x89\xe5\xc4\xf2\x95\xd1\x28\xa2\xdd\x81\xa9\xe0\x84\xe3\x03\xf3\xb0\xc2\xbe\x5f\x69\x05\x82\x2a\x4d\xb7\xa4\x13\xb3\x99\xfd\x6c\x8a\x4d\xb5\xbd\x97\xfc\x9c\x5f\x49\x81\x6b\x42\xae\x6e\x95\x25\x22\x8f\xf3\x5a\x32\x6b\x2c\x5c\xdc\xca\x6c\xaa\x5b\xec\x29\x3a\xb1\x8b\x84\xb8\x89\xdb\x5c\x8e\x62\x30\xda\xd8\xb8\x8d\xeb\x62\xcc\xa1\xbd\x2f\xa5\x13\xd8\xf8\x60\xd5\xb8\x33\x93\x5f\xa0\x0b\xfc\x34\xe9\x44\x6a\xa9\x8a\x6c\x20\x5e\xe3\x8c\x32\xb1\x7e\xcb\x02\x06\x7b\xa8\xd9\xe7\xb4\x28\x73\xa7\x4f\xc4\xd4\xb6\xe6\x73\x3b\xfb\x39\x6f\x1a\x10\x41\x82\x12\xfa\xa2\x19\x93\xed\x0d\x63\x42\x33\x7b\x8b\x41\x87\xf2\xca\xa4\x59\x57\x7b\x56\xd6\x29\xc4\x39\x7d\x27\xf8\x8e\xc0\xa0\xe2\x5b\x56\x05\xed\x8a\x0a\x6b\x75\x6d\xa1\x5f\xd2\x19\x06\xbd\x63\x5c\x27\x35\x47\xe2\x97\xb6\x16\x29\xa8\x28\x47\xd4\x60\x9a\xa9\x1f\x13\x26\xbe\xac\x2a\x7d\xc6\xf4\x14\x58\xa3\xfa\xa0\x29\x2d\x3d\x2b\x9b\xa4\xc5\xd7\x25\x44\x85\xa8\xb9\xc9\x2f\xaa\x46\xfd\x24\xca\xbd\x48\x9e\x63\x2d\x46\x13\xcc\x33\xb1\x59\x69\x4d\x38\xfd\x17\x10\x6b\xa8\x94\x88\x26\xae\x3f\x05\x7a\xcd\xb9\xd2\xb7\xd9\xdb\x34\xdd\x00\xa5\xa8\x3d\x4b\x66\x09\x33\x3d\xef\xb7\x36\x3b\xf0\x87\xdb\x66\x35\x7b\xc5\xf8\xd2\x11\xc9\x17\x1a\x2d\xe0\xdf\x27\x6f\xa1\xd4\xec\x92\xb2\x43\xc9\x7b\x93\xa6\x5a\xe6\x69\x31\xff\x3d\x35\xfc\x58\xed\x76\xb4\xa6\x65\x77\xaf\x77\x98\x8b\xbe\x95\x44\xf1\xd9\x39\x6d\xde\x9b\xa3\x88\xf3\xa4\x7d\x49\x1b\x96\xb5\xd1\x38\x17\xb3\x69\xf2\xce\x98\x2d\xb6\x5b\x9b\x2e\xb1\xc9\xf8\x64\xc8\x8c\xa7\xea\x2a\x91\x91\x8c\x09\x0d\x71\x9f\xd5\x40\x27\x41\x8c\xb5\xa9\x85\xb9\x86\x8e\x6e\xc5\x04\x30\x2d\xa3\xa6\x77\x9e\xa3\x1e\xf4\x82\xe6\x6e\x6b\xb6\x0b\xd4\x46\x5c\x6a\xd9\xae\xab\x2e\x23\x1c\xb8\x9a\x10\x83\xbe\xe2\xcd\x33\x38\x31\x40\x14\x57\x06\xf2\x29\x60\xcc\xdd\x30\xdf\x5b\x85\x38\xd1\xae\x3d\xeb\xec\xed\xc2\x95\x15\x6d\xc7\xde\x7a\x4c\xed\x69\x24\x6c\x11\xb3\xe9\x8d\x29\x5b\x3b\xaf\x2f\xf8\xd4\x73\x23\x6d\x8c\x1d\x14\x8d\xa8\xed\x3a\x6a\x97\xa5\xc4\xef\x16\x4f\x1f\x34\xdf\x3d\x59\x3c\x3d\x4a\x9e\x29\x74\xc2\xf5\x5f\xd7\x69\xba\xb2\x6a\xc3\x07\xd4\x2e\xeb\xf8\xb6\x82\xbf\x7e\xc2\x5a\x30\x3e\x45\x5b\x55\xc2\x09\xb0\x80\x20\x18\x6f\x11\xd1\x09\x0d\x1e\x13\x27\xd4\xc7\x75\xbe\xa0\x83\x8e\x79\x0b\xc8\x84\xc4\xb7\x9f\x69\xa2\xc9\x7a\xf9\xc2\x52\xfc\x7f\x54\xa9\x9b\x11\x1a\xc7\xce\x81\x83\x27\x65\xc0\x23\x90\x39\x1c\x32\x16\x55\x80\x0d\x42\x6f\xb1\x7a\x3c\x3d\x45\xbe\xcd\xdb\x1e\xf2\x75\x4a\x32\x21\x8a\x97\xc0\xd7\x34\x21\x5a\x8b\xe9\x61\x6c\xb6\x93\xb1\x32\xc4\x79\xab\x3e\x56\xd0\x9c\x46\xc6\xb3\x80\xb9\x9d\x26\xbc\xa6\x49\x86\x43\x8a\x5a\xec\x5a\xab\xbb\xa5\x81\xd3\x1c\xad\xf8\xf4\xb1\x95\x91\xa4\x9f\x36\xf3\xae\xd4\x45\x24\x66\x5c\xf9\x05\xf0\x7f\x38\x5e\x6d\x9f\xe4\xd0\xb6\x2b\x99\x29\x76\x8a\xfc\xf8\xc8\xad\xde\xe3\x69\x22\xfa\xc0\xb2\x5a\xc9\x41\x1f\x62\xb9\xd4\x44\x73\x72\x0d\x69\x87\xa6\x89\x28\x75\xc7\x35\x97\xa2\xa5\x77\x43\xdc\xe7\x05\x8d\xa0\x02\xcc\xa6\xc8\x37\xac\x3d\x14\x35\x80\x32\x0e\x29\x44\x99\x64\x53\x42\x83\xc8\x33\xaa\x1d\xff\x11\xd0\xac\xbe\x12\x1c\x89\xe7\x86\xbb\x85\xf6\x58\x79\xdd\x32\x2f\xc1\xf2\xab\x15\xce\x99\x73\x69\x98\xc2\xb4\x86\x55\x11\xe1\x38\xed\x41\x8d\x23\x0d\x04\x25\x43\x87\x43\x4a\x33\x9d\x70\x4f\xd0\xa1\x76\xbc\x3f\x81\x5e\x8f\xa1\xa4\x5b\x8f\xa8\x5f\x24\x5b\x17\xcd\x63\xed\x14\x6d\x8d\x9a\xef\xa1\x9a\x70\xb3\x7e\xe0\x12\x51\x2d\xee\xec\x5c\xb2\x66\x57\xf1\x68\x1f\x6d\x39\x64\xa1\xef\x54\x6f\xc1\x52\x12\x4d\xbb\x32\xc4\xac\x25\xc2\x21\x3b\xed\xb5\x65\x75\x0a\x77\xf4\xbf\xda\x09\x59\xa7\x2d\x03\x84\x05\x17\x81\xbd\xe7\x6a\xa0\xcd\x38\xa7\x83\xb1\x6e\xc1\xf9\x50\xd6\xaa\x15\xa6\x2d\xae\x85\x35\x69\xe0\xa1\x31\x7e\x92\x5b\x1a\xaf\xbf\x56\x5d\x67\x49\x64\xa5\xa8\x96\x44\xf2\xed\x56\x7e\x57\x95\xc7\x9c\xe2\xa5\xa9\x65\x5a\xd2\xda\x25\x44\x23\x09\xb3\x12\xdb\x07\x92\x55\xd6\x75\xd5\xad\xd6\xcc\x90\x4c\xe9\x9c\xc2\x74\x7f\x9a\x28\x56\x98\x3b\x89\x83\x03\x12\x16\xda\xf3\xd8\x57\x26\xc4\x8a\xfe\x22\x9d\xd3\x44\x00\x64\x74\xa6\xfc\xb9\x67\xb9\xa9\x0f\x01\x11\x93\x34\xda\xa3\x47\xc9\x9e\x99\x2c\x0f\xae\x9a\x0f\xe1\xbd\x18\xed\x16\xbc\xfc\x34\xa2\x2a\x4b\x69\x48\x37\xa6\x99\xfd\x39\xa5\xc9\x9a\xd1\x21\x35\xa1\x44\x56\x94\xa4\x25\xfa\xc5\x27\x34\xd4\x37\x9f\x26\x1f\xe9\x20\x7f\x37\x22\x6c\xe0\xb4\xe7\x74\xa8\x7f\xf4\x38\x72\x97\x72\xac\x58\x9a\x85\x63\x3e\x1b\x91\x4a\x3e\x98\xe0\xde\xb0\x27\x8b\x9c\x9f\xbf\xba\x10\x4d\xcc\xf9\xab\xa4\x29\x4c\xd7\x32\x79\xa3\x86\x5f\xb5\xed\xae\xf9\x58\x17\xac\x67\x3c\x3f\x86\x42\xf0\x2c\xbd\x01\xfb\x8f\xc4\x77\xc4\xae\x56\xd4\x26\xa8\x07\xb2\x2e\x4c\xba\xe5\x6e\xe2\x87\x54\x70\x42\x9c\x07\x27\xd1\x0f\x62\x56\x9c\xb2\x7a\xc2\x77\x77\x2f\x82\xeb\x4e\x7f\x4e\x4f\x26\xef\xcc\xfe\x59\x9d\x96\x4b\x29\x4a\x5f\xc9\x82\x3f\x13\xf0\x95\x93\xe7\x24\xd4\xe4\xed\x79\x47\xa2\x4d\x7d\x33\x93\x2f\x5a\x1d\xfe\xd4\xcc\xb7\xb4\x78\xb8\xcf\xd5\xcc\xad\x7c\x6a\xe6\xf3\x75\x95\x2f\x5d\xde\x92\xbf\x26\x17\xb5\x31\xdc\xda\x33\xd1\x01\x35\x50\x3f\x3e\x07\x73\x49\x08\xf8\xba\xc4\x31\x3e\x71\x02\xb5\xe1\x6b\xce\x31\xd5\x7f\x5a\xec\xd6\x29\xf3\xad\x0a\xc4\x3b\x08\x44\x88\x09\x01\x11\xd1\xe2\x32\x2d\xbb\x2d\x2d\x83\xd9\x60\xab\x03\xf4\xd1\xf1\xfc\xb1\xdb\x58\xc3\x8a\x32\x22\x7b\x5f\xae\xec\xc8\x57\x45\xd5\x3e\x9a\x3e\x4e\x76\x38\x03\x7b\xd5\x36\xf9\xad\x09\x2b\xe3\x0b\x03\xc9\x64\x32\x4e\x4c\x29\x0b\x22\x3d\x30\x47\x02\x1e\x84\x14\x80\xc8\x58\xda\xb2\x48\xbd\x4d\x3f\x47\x65\xe8\x90\xa0\xa4\x3b\x8b\x08\x49\x17\x78\x4b\xba\x83\xa1\x29\x7f\xc5\x08\x3d\x9d\x40\x03\x7d\x10\x94\x50\x0f\x02\xe5\xb2\xe8\x32\xdb\x81\x5f\x85\x72\x35\xdd\x82\x76\x2f\xd0\xf3\xe1\x83\xe6\xa1\x6f\xfc\x57\x92\x50\xe8\x74\xda\x97\x0a\xfe\x9e\x8e\xce\x0d\x9f\xbc\x97\x55\xd7\x7e\x6b\x6f\xd4\xe7\x54\xa9\x48\x8d\x33\xd5\xf6\x24\xb4\xbf\x55\xd0\xae\xa0\x88\x89\x48\xaa\x17\x26\x03\xbe\x0d\xdd\xf4\x77\xf5\xd1\xcd\x11\xc9\x02\x65\xaf\x2e\x67\x18\x30\x5f\xd0\xf7\xbc\x85\xbe\xa3\x2f\x40\xd1\x0c\xd0\xac\xe6\x4e\x63\x34\x95\xeb\x9b\x7e\x29\xbe\x4c\x39\x50\x80\xd8\xcc\x01\x7c\x60\x11\x70\xa8\x58\x4b\xdb\x7a\x50\xce\xed\xf5\x91\x02\xb2\xc6\x0c\x4c\x03\xcb\x66\xbd\xe3\xba\x07\xed\xc6\xee\x66\xd4\xcf\xff\x50\x88\x0c\x66\xb2\x27\xe2\x43\x6d\x47\xc8\x56\xb3\xf1\x45\xa0\x24\x60\x35\xce\xc7\x88\x63\xba\xe2\xeb\x8f\xe8\x2a\x49\xaf\xd2\x56\x06\xba\x80\x6c\xa4\x2e\x42\x1b\x90\xfc\x83\x95\x99\x7c\x65\x98\x6b\xbe\xab\x12\x77\x20\x8d\x56\x11\x8e\xcd\x57\xe2\x34\x16\xe6\x33\x41\xd1\x94\xac\xd8\x0a\xc7\xab\x2a\x58\x7d\x9d\x0a\x7e\x4e\x27\x45\xda\xb4\x10\x52\xa5\xc3\x38\xe6\x3d\x24\x5f\x47\x81\x39\xa6\xb5\xa9\x5b\x65\x6b\xf6\xf9\x95\x5c\xd2\xe7\x0d\x5f\x36\x98\x12\x76\x40\xd4\xdb\xe4\x91\x1d\xd3\x63\x91\xa1\x58\xe3\x94\x6e\xa7\xc9\xc7\x44\x49\x52\x2d\xfa\x27\xb0\x89\xbd\x02\x74\x1a\x3a\xee\xc3\xf1\x43\xb8\x32\xdb\x98\x1b\xcb\x12\xed\x4d\xa0\xdc\xc8\x59\x7f\x4d\xc3\x10\x9e\x86\xaf\xcc\xf4\x4c\x92\x7e\xd2\x66\x62\xa3\x1c\xa8\x5f\xa0\x6a\x80\x0c\xc7\xc9\x37\xae\x5e\xb9\xfc\x4b\x9d\xda\xa8\x6c\xeb\xaa\x10\x03\x84\xcb\x5e\xa5\x47\x30\x80\xa0\xe3\x30\xbf\x4a\x56\xcc\x30\xd6\xcc\x06\xd1\x10\xa1\x31\x61\x51\x08\x2c\xd8\x51\x72\x4b\x73\x89\x5c\x36\xb4\x80\x32\x05\x6a\x5c\x22\xd4\x74\xc2\x59\x95\x4f\x60\x95\x43\x24\xb3\x11\x4d\x1c\xf4\x22\xc4\xec\x15\x05\x16\x42\x2c\x6b\x3e\x7a\x71\x5b\x56\xdf\x72\xbe\x3c\x6d\x19\x0d\x9c\xd8\x69\x7c\x07\x88\xe9\x26\x9b\x25\x58\x99\xf1\x70\xd1\x68\x60\x20\x23\x59\x8d\xcb\xaf\xa9\xb6\x08\xf1\x01\x96\x34\x41\x83\x68\x8a\x16\xc4\x10\xfb\x45\x2b\x81\x3b\x23\xc8\xae\x3b\x5e\xd8\x40\x91\x21\xb2\xc5\xa2\xd5\x6b\xc2\xbc\xdc\x34\x72\x09\x55\x0e\xdb\x16\x82\xd2\x1b\xe3\x69\x74\x41\x1d\x8e\x53\xc7\x28\xd6\x20\x91\x0a\xe6\xf7\x0d\x71\x22\x06\x29\x73\xe1\x0d\x82\x9d\x71\x5a\x11\xae\x28\xc7\x10\xee\x09\xe2\xb3\xb0\x87\x3e\x4d\x84\x11\xd5\x9b\x8d\xd9\xcf\xf9\xd5\x2d\x09\xb4\xc4\x15\xaa\xe5\xcf\x65\xd5\x56\x93\xab\x8a\xce\xc1\xaa\x0c\x2c\xb7\xaa\xdd\x24\xec\xed\x2c\xd2\xd0\xa8\x35\xd0\xcd\xec\x3d\xf1\xf0\x8b\xb4\x36\x49\xea\x8c\x82\x48\xae\x2f\x8a\x6a\x0f\x25\xcd\x4f\x10\xf1\xa0\xa1\xa1\x86\x89\x1e\x80\x1f\xad\x6b\x96\xfc\x01\x01\xdd\x1f\x20\x6c\x09\xfe\x20\x14\xd7\xaf\x77\x4e\x2c\x10\x49\x71\x02\x85\xc1\x76\xca\x34\x13\x7c\x6e\x7d\x4d\x35\x9e\xf6\xaf\xd9\xe5\xec\x63\x44\x56\x20\xa6\x26\xbe\xe8\x0e\x87\x62\x5d\x8a\x78\xc5\x1d\xcd\xd8\xc8\xa4\x57\x0d\x81\xd5\xb8\x9f\xb4\xd5\x89\xd1\x46\x65\x56\x3c\xc3\x58\x8f\x5f\xac\xb1\xd4\xa7\x89\x35\xa7\x3a\x53\x5b\xaa\x31\x45\xb9\x4e\xff\x59\x30\xe9\xba\x7f\x9b\x59\xb0\x41\x1b\xd5\x29\x11\xb1\xc0\x1f\xa2\xd0\xa6\xa5\xb9\xdc\x1c\x5b\xf1\x02\x77\xd4\x72\x65\x5d\x95\x4d\x60\x6d\x81\xbb\x40\xe8\xe8\xde\x87\xea\xb9\xcc\x14\xa6\x65\x3e\x58\xd0\xca\x09\x14\x5d\x9e\xcd\xe8\xbf\xc9\x64\xd7\x2d\xa8\x36\x67\x10\x26\xeb\x49\x7b\xc0\x9a\x85\x59\x13\x40\xb9\xc2\xd8\xf7\x65\xd0\xca\xc2\x43\x63\x4b\x27\x9c\xbd\xe1\xb6\xb7\x77\x4c\x3f\xe4\x5a\x4f\x77\x24\xd6\x05\xf6\x88\x60\x7e\x09\x5f\xd9\x98\x8a\x48\xbb\x28\x7d\x59\x48\xc7\x70\x73\xd8\x14\x21\x05\xb4\xfb\x3a\x4f\x21\x6e\xab\xd1\xa3\xbf\x4c\xcf\x78\x21\xdc\xf9\xe9\x4e\x54\x55\x75\x65\xb3\x17\x9f\xb1\xd4\xe1\x35\x79\x70\xf1\xe3\x69\xb0\x5f\x56\x50\xe1\x75\x57\xf6\x91\xc1\x9b\x74\x11\x26\xc1\xe0\x8d\xcf\x43\x42\x57\x6a\x04\xa7\x06\xf3\xf8\x7d\x9b\x4c\x48\x85\x7c\x9f\xf7\xa6\x12\xcb\xc5\x6e\x97\x41\x84\x8b\x90\x85\xef\x12\xae\xf6\x6c\x2d\xda\x03\x70\x62\x99\x37\xd2\xc3\x8c\x3b\xc1\x0c\x05\x57\x3c\x59\x74\xfc\xe9\x1e\x77\x96\x96\x1f\xf5\x87\xeb\x7a\xd6\x07\xb1\xfa\x1e\xe6\x9c\x2c\x14\x98\x47\x2c\x23\xcf\xf6\x4a\x09\xa1\x1a\xa3\x2c\x4c\x5b\x9b\xcd\x86\x6f\xe0\x76\x81\x70\x4a\x19\xbf\xfd\x4f\x31\x8f\x30\xa2\x82\xa3\x5d\xd1\x19\xa2\x4b\xa0\x88\x69\x39\x62\xf5\xa7\xb7\xab\x7a\xd7\xba\xb8\x11\xfd\x04\x14\xb8\x21\x51\x12\xcd\x23\x2b\xcf\x0f\xdd\xeb\xf6\x2f\x74\xed\x7d\xae\xbd\xa6\xec\x9a\xb6\xda\x5a\xca\xc7\xb4\x8d\xb0\xa5\xb5\x77\xcc\xd1\x45\x3a\x49\x46\x55\xa3\xfa\x62\x81\xff\x11\xe6\x3f\xa1\x46\x88\x93\xed\x2a\xd9\x4a\x5d\x4d\x7a\x75\x11\xac\xa7\xec\x3e\xea\x05\x88\x5e\x6b\x4b\xf8\xcd\x28\x37\x2c\x41\xc5\x10\x35\xfd\x18\x99\x42\xcd\x49\xac\x58\x41\x44\xb6\xb7\xde\x7a\x6b\x2f\x24\x0e\xea\x9e\xcb\x85\x91\x8b\xd1\x69\xdc\x35\x87\x3f\xd1\xad\x9f\x6c\x48\xe9\xf4\x38\x2a\x59\x44\x09\x6f\xf4\x18\x39\x42\x21\xba\x2a\x02\xae\xee\x95\x8e\x23\xc8\xc7\x34\xba\x7c\xb6\x7b\x0d\x73\x6b\x16\xcf\xe7\x11\xd0\x2b\x53\xaf\x21\x40\x09\x70\x40\x38\x47\xf8\x63\x69\xf0\x4e\xa6\xb8\x37\x08\x7f\x63\x14\x95\xf1\x33\x40\xc3\xe7\x83\x31\xc3\xb1\x2c\xd6\x75\x9d\x98\x34\xee\xed\xfa\x47\x7c\xaa\xd8\x6b\x07\xd4\x47\x1b\xfc\xef\xd3\x9e\xa0\x19\x10\x3b\xee\x15\x33\x00\x62\x7d\xa2\x0a\x04\xa6\xc0\xd0\xa6\xa8\x05\xf1\x68\x26\x6b\x19\x6a\xa7\x51\xb4\x34\x7c\x57\x13\x52\xe1\xfa\x32\x24\xe6\xd8\xf6\x3d\x33\x25\x41\x16\xbd\x76\x17\xea\xac\x56\x1b\xd1\x55\xf3\xb5\x49\x5a\x31\x20\xe0\x8a\xeb\x1b\x22\x6d\xdc\x80\xfd\x56\xad\xd5\x6b\xcb\x1a\xb3\x59\xa6\x76\xc2\x6e\x12\xa7\xd8\x92\xbd\xe1\x7a\x4c\x99\xa0\xa1\xaa\x35\xf9\xc9\xf3\x47\x3d\x08\x19\x5c\x5f\x4b\xea\xf8\xa9\xf6\xc8\x0f\x2e\x38\x7f\xf2\x92\x2d\x89\xac\x55\x42\x40\xd4\x62\x21\x61\x9a\xfc\x9c\xb3\x26\xed\x9a\x75\x36\x20\x6b\xdf\xf7\x3b\x60\x31\xec\x85\xbb\x2b\xf1\xd8\xe5\xaa\xca\xee\x4d\xd2\x2c\x63\xcc\x97\x11\x0b\xba\x87\x7d\x26\x8c\xb8\x06\x52\x94\x0c\x19\xda\xc8\x1f\xcc\x9f\x47\xf7\x1e\xd0\xe9\xf3\x5d\x87\xe2\x6d\xa8\xf6\x56\x45\x03\x6d\xf5\x4c\x75\xbb\xee\xda\x03\x9c\x0e\x0c\x64\x0b\x5e\x51\x56\x11\x2e\xaa\xcf\x6a\xc6\xc6\xe2\x3b\xfd\xb5\xb7\x1e\xad\x89\xe5\x8c\x2d\xcb\x50\xa1\xa6\x97\x08\xf9\xd2\x34\xfd\xcb\x10\xd7\x63\x3b\x5b\x60\xbd\xc2\xd1\xef\xd3\x46\xf6\x04\xc6\x48\x8c\x9b\xc5\x6f\xc7\x2b\xa9\x99\x7c\xa0\xbc\x6b\xb8\x5a\x16\xb0\xac\xe4\xe4\xa6\x08\xc5\x1c\x66\xe4\x42\xce\x8b\xfc\x0a\xac\x76\x2a\x06\x1d\x51\x4d\xcc\x6e\x78\x95\x3a\x6f\xd3\x34\x42\x8c\x69\x12\x30\x53\x28\x1e\x15\xed\x64\x53\xaf\x99\xfe\x43\x05\xdf\x38\x3b\xbe\xef\x68\xb7\x54\xe5\xea\xe9\x29\xdf\xd1\xc1\x12\xc4\xac\xbb\x82\x25\x91\xef\xbf\x7b\xa2\x99\xc9\xf3\xb5\x59\x6e\x92\xaa\xc3\xd5\x04\xcc\x43\x73\x12\x5c\x78\x17\x62\x7a\xbf\x4b\x03\x2b\xf4\x84\xcd\x6e\x79\xf6\x31\x94\x70\x14\x6c\x95\x4e\xe2\x43\x0c\xef\xac\x71\x09\x94\x21\x20\x10\x17\x48\x9a\x3a\x9c\xe4\x49\x0c\xd4\xa2\xf1\x44\x52\x6e\xa0\xde\x38\x03\xe7\x68\x36\x6e\x06\x04\xa9\x2c\xed\x98\xba\x12\xcc\x6c\x70\x09\xe0\xe4\xae\x5f\x6a\xab\x12\x50\x71\x99\xa9\x3a\xc2\x0a\x31\x69\x31\x9d\xd8\x0a\xdc\xd2\x32\xab\x85\xd4\x65\xac\xad\x54\x14\x70\x78\xa5\x6f\x2d\xc2\xc1\x30\x2b\xcf\x9d\xdc\xb2\xb6\x6c\xb9\x34\x21\xae\xdd\xb3\xa4\x08\x93\xe0\x09\x91\x1d\x86\x23\x45\x61\x95\x01\x89\x18\x00\x0a\xde\x01\xbf\x43\xa9\xce\xdd\xca\x86\xd5\x80\xf6\x32\x32\x01\x32\xa5\x71\x39\x43\x60\x18\x26\x04\x54\xa9\x4f\x92\x70\xc1\x9c\x29\x9f\xf5\xfd\xb0\x07\x76\x32\xc2\xb6\xee\xa4\x4b\x34\xbc\x0b\x37\x21\x10\x01\x59\xad\xc2\x8b\xf7\x06\xb2\x73\xeb\xcf\x06\xca\x84\xa5\xba\x15\x04\x5f\x8a\x00\xbf\x84\xee\x27\x10\x06\x69\x5e\x78\x55\x5a\xf0\x25\xb2\x11\xf9\x4a\x7a\x0c\x65\x94\xd4\xb0\xd9\x37\x55\xf2\xff\x24\x19\xdb\x56\xb7\x15\xed\xa5\x41\x0d\x9c\x8a\xc1\x0c\x4b\x78\x33\x5b\x47\x3c\x44\xa4\x52\xd2\xe1\xf6\x37\xf5\x43\x85\x2c\x27\x5c\xe9\x85\xfe\x61\x92\x91\x31\xc3\x8e\x1d\x2c\xa6\x33\xfd\x1a\x12\xa9\x3b\x97\x4b\x45\x4f\x2b\xa0\xbc\x6a\x3b\x98\x9d\x04\x00\xa3\x34\xa3\x2b\x17\x79\x49\xf3\x5d\x35\x02\x09\xc1\x80\x93\xfc\x72\xa2\x4d\x7f\xe3\xc4\x72\x58\xd9\xea\xa0\x3c\xc9\x4c\x19\x7a\xce\x33\x35\x3b\x23\x62\x4f\xf2\x6c\x01\xdb\x36\x8b\x5d\x0d\x67\x35\x8e\x4b\x10\x43\x7e\x35\x9a\x90\x62\xba\x8d\x2e\x78\xb6\x1d\xc5\x91\x35\x69\x64\x9a\x2e\xa4\x12\x19\x0a\x2b\x51\x56\x46\x20\xb1\xb8\x74\x32\x84\xb8\x4c\x33\xc6\xda\xaa\x93\xb3\xd7\x8d\x9e\xb1\x6c\xc9\x06\x22\xe4\x5a\x95\x7a\xff\x52\x81\x4d\x60\xe2\x57\x76\x47\xaa\x7a\x2b\x36\x76\xe9\xb1\x67\x54\x32\xb9\x76\x82\xd8\xf8\xb6\x99\x2a\x0e\x09\x21\xb9\xd9\x2e\xaa\x02\x06\x73\x2a\xb7\xb9\x51\xcb\x88\xfb\x43\x8d\xb3\x65\x0d\x8c\xa3\x2f\xd1\x4c\x62\x21\x02\xd2\x12\x4c\xc3\xbd\xe4\x2f\x7d\x7d\x9a\x63\x2b\x77\x07\x57\x06\x2c\x28\xad\xaa\xe8\xff\xc0\x97\x62\xcc\x8c\x2c\xb7\x39\x34\xfb\xe0\x53\xc1\x07\x8b\x99\x25\xcc\x20\x71\x4a\xec\xa9\x41\x47\xcb\x64\x4c\x21\xdb\x14\x62\x85\x27\x6a\x63\xe8\xa1\x13\x7d\xfd\xa5\xc2\xb2\x5c\x3f\x8d\x11\xb9\xb1\xb1\x05\xeb\x37\x4e\xf3\xee\x26\x72\xe1\xc0\xdc\x8e\x38\x8c\xdd\xbd\x35\x09\x08\x1e\x36\x27\x49\x50\x7a\xc1\x41\xeb\xd1\x06\xba\x94\x84\xe4\x48\x6c\x74\x66\xc1\x79\x67\xd2\xbe\xd2\xa6\xed\x45\xad\xdf\xdc\xc1\x4d\xad\xc2\x84\xc2\xf5\x1a\x4c\x73\x61\x45\xeb\x80\x9a\x67\xe6\x92\xb8\x68\x62\x3e\x2f\xc3\x31\x43\x17\xc9\x02\x08\x14\xcf\x96\x6b\x48\xde\xbd\x7e\x71\x91\x78\x3e\x81\x64\x8b\x6e\x95\x64\x75\x9a\xd2\xb2\xdf\x73\x56\x98\xbd\x1e\x3a\xf3\x15\x57\x3d\xf5\xa2\x37\x0c\x35\x0d\x3d\x19\x9e\x30\x7d\x40\x47\x14\x6d\xff\x31\x1c\x5a\x61\x22\x37\x44\xb8\x9c\xc6\xc7\xcd\xf0\xc8\xe2\x4d\x7e\x81\x1a\xf1\xd3\x44\x94\xf4\x2f\x54\x6d\xee\xaf\x74\x46\xaf\x7c\xfd\x85\x8f\x7d\x5c\x80\x0d\x0a\x75\x43\x00\x75\x6c\x2f\x65\x36\x15\x98\xfd\x6d\xba\x21\xb1\x1e\x86\x67\x2d\xec\x34\xd8\x30\x49\x24\x18\x3b\xa3\x1d\x2d\xfb\xc6\x4d\xe8\x74\x72\x9d\x37\xf9\x22\x2f\x70\x96\xfd\x05\x3a\x29\x68\xb5\xd6\x26\xcf\x24\x03\xe9\xd1\xc3\x9d\xf0\x12\x85\x5a\xfd\xae\xd9\x51\xa7\x97\x74\x5c\x36\xb3\xfb\x5d\x4e\xd9\x90\xde\x3e\xb7\xf7\x9f\x92\x9c\x73\x4d\xe7\x13\xb5\x44\x10\x4f\x07\xb5\xe1\xb5\xe8\x12\xaa\x51\x3a\x2b\xbd\xed\x96\xe8\x8f\x79\x7b\x94\xbd\x77\xa9\x39\x53\x96\x6c\x5f\x31\x9a\xde\xdd\xee\x6f\xff\xa1\xcd\x8a\x9d\xf4\x55\x19\x34\x8f\x57\xaa\x76\x44\x8f\x7e\x0a\xf4\x3f\x6e\xf3\xe2\xbd\x09\xcd\x31\x56\x19\x69\xf6\x09\x8c\xbc\xd0\xd8\x49\xef\x50\x4b\xf3\x78\xb2\x2c\xaa\xd2\xf8\xf9\x19\x70\xb8\x78\x26\x43\x48\xf2\x7d\xf2\x8c\x6d\xaa\xef\x7e\x5f\x99\x70\x3d\xfc\xb6\xf2\xde\x84\xbb\xc9\x2a\x76\xff\xb8\x97\x5b\x15\x03\xb2\x8d\x7d\x88\xd2\xec\x68\x54\x8d\xf6\x5f\x72\x06\x0b\xa7\x82\x3d\xc6\x14\xae\x30\x77\xd0\x30\xd1\x47\xb9\xf0\x86\xec\x46\x88\x43\x6a\x6d\x17\xf4\xf6\x91\x77\xc2\xfb\x2d\x9e\x86\xe7\x57\x50\x5d\x4a\x32\x1e\x56\xcb\xa3\x6a\xfe\x5c\xd1\xd6\x5e\x95\xb0\xc4\xd4\xf6\xcf\x69\x3f\x2d\xdb\x64\xea\x32\x12\xfb\x38\xbb\x99\x14\x39\xb1\x4e\x8d\x99\xbd\xc1\x5f\x68\x0b\x35\x21\x2e\x6b\xf4\x25\x5f\xa1\x50\x56\x1b\x44\x0d\x92\x48\x4e\xa5\xe9\x68\xda\xe6\x57\xc7\x71\xf2\x78\x1d\x8d\xbe\x07\xf7\xf2\x45\xbf\x34\x8c\xcb\xe7\xa0\x50\xc4\x64\x53\x97\x53\x3a\x35\x51\x38\xeb\xe3\xbf\x9a\x1e\xae\x4c\x63\x1b\xc8\xc2\xd7\x25\x41\x5b\xd6\x2a\xf3\xc0\x8b\x6b\x22\x88\x69\x57\xd8\x3b\x8e\xd9\xb9\x7d\xd8\xa1\xd7\x1b\xfa\x76\x9b\x88\x6b\x57\x42\x7f\x4a\xff\x46\x49\xb2\x2e\x1f\xcc\xb6\x22\x01\x36\x2d\x6f\xf4\x4d\xdf\x71\x5b\xa7\x4b\xd6\x5b\x12\x8a\x81\xb0\x31\xdf\xbf\xc6\x35\x09\x8c\xe4\x68\x1f\xd1\x84\xe0\x2a\x05\xaf\x33\xda\xb5\x7d\x0a\x68\xab\xce\x71\x9b\x79\x4d\xec\xe3\x5b\xfe\x4e\xec\xf7\x23\x12\x9d\x1f\x5b\x20\x62\x9e\xa1\x72\x99\xf1\x2b\xf0\x63\x31\x4c\x89\xb3\xf4\xc5\xaf\x8a\xd7\x65\x55\x65\xb7\xa9\x90\xa8\xf0\x0a\x63\x25\xd7\x9c\x8d\xf2\xc2\x5c\xd1\x22\x2d\x36\x53\x5b\x1b\x33\xe4\xcd\x4d\xb9\x74\x2c\x39\xf1\xa0\xf4\xb9\x26\x32\xa6\x6f\xca\xf7\xb8\x95\xef\x5f\xbf\xac\xd2\x5b\x24\x9d\xbb\x9f\xbc\x47\x9a\x19\x1e\xa8\x37\x7a\xb5\x42\x6b\xb3\x5c\xab\x35\x60\x75\x39\xe7\xb5\x02\x73\x70\x1a\x5c\xf3\x0a\x65\x12\x73\x07\xda\xff\x02\x83\x6b\xd0\x2d\x36\x0a\x1b\xc2\x67\x31\xb1\x5a\xe0\x09\x07\x04\xc2\x91\xeb\x9b\xc0\xb0\xf7\x1f\xbe\xbc\xf9\xd0\xbb\xce\xfe\xf2\xcd\x4d\x69\xa0\x64\xed\xda\x75\x68\xa7\x63\x9f\x9a\x4c\xf4\xc9\xbf\x3c\xa5\x7e\xab\x0f\xfe\x13\x7e\x4a\x1d\x66\x1d\x3c\x0d\x6e\xd5\xe2\x37\x22\xcd\xa0\xc9\xc9\xa2\xe8\xcc\xfd\xa7\xb2\x90\x96\x30\x33\x55\xb6\xf5\xf2\xb6\x40\x93\xf2\xf0\xcc\xd5\x69\x01\xa6\x42\x67\x2d\xb2\x3d\xc7\x57\x62\x91\x6d\x04\xc2\x1f\xd9\x1b\x25\x71\xfe\xe5\xe2\x93\x97\xaf\x2f\x60\x4c\xe2\x5e\xdc\x19\xff\x02\x6c\x97\x66\x53\x57\x23\x4e\xf8\xbc\x69\x84\xd1\xa3\xc9\xc4\x2d\xfe\xc2\xd8\xe7\xc7\xb1\xfe\x92\x49\x03\x2a\x29\x7a\x27\x16\x61\x69\xbe\xc5\x73\x4d\xb9\x44\xb1\x75\x7b\x6b\x7b\xd8\xd4\xf5\x4d\xed\x6d\x5f\x8e\xe4\x2d\xa7\x55\x7e\xa7\xd6\x26\x45\x5e\x09\x5a\x45\xf8\x36\xdd\xf9\x8a\xf5\x8a\xda\x2d\x1f\xb8\xc0\xf0\x8a\x5a\x77\x13\x1f\x1e\x8d\xb8\x82\x70\x07\x07\x21\x07\xa7\xcb\x71\x60\x32\x7f\xa2\xf0\x0b\x47\x22\x72\x97\xf6\x28\x59\x45\xd7\xd6\xf6\x60\x52\x59\x28\xb5\x56\x5e\x2d\x18\xb4\xdd\xcd\x1c\xd7\x29\x42\x21\x4c\xed\x53\x1c\x13\xfb\x12\x72\x69\xce\xe2\x42\x90\x2b\x36\x3b\xa7\x75\xb7\xc1\xa1\xfb\x5f\xff\xff\xff\x38\x7e\x8e\x91\x3f\x6f\xeb\x02\xbf\xb6\x98\x5a\x27\x24\xa0\x1c\x56\xc8\x57\x45\xb2\x23\xd3\x83\xd9\x3b\xb3\x12\xd7\x21\xfc\xf5\x93\x5c\xa9\x76\x78\x4f\x01\x8b\x20\xd0\x91\x9a\x09\x05\x5f\xd2\xf2\x70\x09\xa8\xde\x4c\x20\xe5\x2b\xe9\x62\x45\x5f\x70\xe8\xfd\xb5\xcb\x97\x9b\xf9\xaa\xcb\x61\xee\x59\x9a\x42\xde\xdc\x43\x67\xa5\x0c\x41\xbb\xce\x1b\x41\xea\x1f\xf9\xa4\xe9\x9f\x1c\xa1\x91\x3e\x1f\x99\xfa\x82\x47\x2c\xf5\x83\xab\x97\x70\x7f\xb1\xbd\x31\x49\xb8\x97\xfa\xde\xa4\xa9\x0a\x33\xd9\x75\xb0\x41\x03\x11\x97\xf6\xce\xe8\x5b\xdf\xbc\x5b\x03\xdd\xb0\x8e\x41\x79\x6e\x9d\x3a\xcb\x4f\xe1\x07\x7b\x9a\xaf\x3a\xd9\xee\x2d\x6f\x8e\xac\x21\x09\x23\x1f\x0e\xef\xda\x1a\x55\xde\x9b\x4c\xd8\xf4\xf5\x39\xfd\x33\xd1\x33\xec\xe4\xb2\x4d\xf9\xd2\x6c\xd2\xd2\xae\x9e\x3d\xab\xaa\xed\xe4\x92\xd8\x62\xe2\xfc\xf4\x26\x1f\xcf\xfc\xdb\x74\x35\xfb\x81\x53\xed\x4d\x3e\x2d\x31\x25\x6a\x2d\x70\xba\x61\xeb\x81\xf4\x9d\xae\x1a\x22\xfe\x0b\xa8\x3e\xfb\x3e\x36\xe0\x8f\x43\xfc\x70\x1c\x8b\x05\x33\x0a\x14\x0c\x6b\x8b\x6c\x69\x6b\x90\x70\x54\x1a\x7e\xb3\x51\xec\x52\xbe\xfe\x62\xfb\xc0\x46\xed\x04\x61\x49\xca\x66\xe3\x8d\xa8\xf9\xf4\x41\x2b\x5f\x4b\xd6\xe9\x7e\xf6\x81\x16\x45\xbe\x68\x85\xd9\xf5\xca\x4b\x3c\x0a\xc8\x71\x05\x98\x2b\x1c\x3f\x01\x01\xf0\xcf\x06\x1a\x73\x3a\xf4\x6a\x57\x8a\xa5\x06\xde\x0e\x67\xf6\x97\x64\xc0\x50\xb7\x00\x67\x38\xbb\xa0\x9a\x13\xbe\x20\xcd\xa1\xa5\xa3\x93\x1a\xc9\xb0\x6b\x5f\xd0\x89\xb7\x26\x09\x62\x32\x21\xa1\x9f\x1a\x9f\xb2\xd3\x15\x5c\xa9\x8a\x32\xdd\xb2\x2f\x9a\x2b\xd7\x6a\x02\xa0\xe6\x8e\x89\x5e\xb5\x95\x16\x06\x7f\x2c\x04\xc4\xbd\x7e\x1d\xbb\xda\xf0\x70\xe4\x92\xa7\x51\x23\x0a\x91\x14\xcb\x94\x6f\x39\x15\x52\x8c\x7f\xe7\x5c\x21\xac\x85\x41\xf8\xb9\xe6\x86\x9f\x48\x81\x70\x1d\xb7\x66\xd3\xb4\x9e\x3f\x62\x62\x26\xd7\xde\xbd\x1e\xf1\xfe\x89\x3a\xee\x38\x51\x0b\xb7\xed\x08\xe5\x17\x66\x4e\x4d\xa5\x96\x6f\xfa\xb3\x11\x6d\x49\x2e\x34\x5f\x31\x4a\xe8\xfc\xd6\x56\x21\x9d\xb7\xcf\x0c\x81\x6f\xcc\x07\x7a\xf3\x69\xdb\x02\x53\xbe\x05\x68\xa1\xe1\x61\xb9\xea\xe3\xdd\x7c\x63\x4d\x58\x84\x04\xe2\x30\xc8\x5b\x77\x5b\x89\x4d\xdb\x1a\xff\xd8\x32\x1c\x82\x95\xe8\xdd\x60\xbd\x60\x1d\x54\x11\x0d\x78\x8d\x07\x68\xfb\x3a\x6f\xad\x96\x0b\x4f\x21\x12\x64\x25\xc8\x4a\x38\x2b\x91\x2c\xa0\x0c\xc6\x98\x54\x6c\xd5\x40\xdd\x35\x6a\x9b\xcd\x59\xad\xc5\x33\x37\x5e\x31\x77\xe0\x3e\x59\xd2\xfc\x03\xf0\x90\x19\x8a\x75\x0a\x8e\x86\x5f\x81\x02\x22\x53\xc5\x42\x03\xb3\x80\x9b\x7b\x0e\x23\xc1\xac\xf0\x93\x0f\xc1\x4b\xdc\xc4\xe3\x93\x1b\xc2\xdb\xab\xa0\x2d\x27\xd9\xce\x2e\x2a\x3a\xcc\x33\xe7\xde\xe1\xe6\x28\xb9\xc2\x88\xc0\x6d\x24\x10\xbb\x69\x1e\x77\x38\xd6\x93\x27\xd3\x84\x60\x6b\x65\x74\xc3\x02\xab\x4a\xc6\x04\xfe\x9b\xf0\x93\x5f\x34\x82\x94\x50\x02\xae\xd5\xb3\xa0\x92\x05\x31\xc5\xc4\x83\x2c\x8d\xeb\x0d\x9d\x33\x55\x1d\x20\xf2\xd2\x14\x73\xb6\xe4\x99\xc9\x87\xcb\x62\x1a\xe1\x36\x83\x9a\x16\x3f\x97\x4f\x0b\x04\x75\x72\x4b\xd2\xcd\xec\x84\x86\x44\x53\xf7\xe4\x3b\x3b\xd8\xa7\x0f\x03\x18\x9b\xfd\xd0\x6f\x57\xdc\x61\xcf\x3e\xf2\x9f\x28\x47\x8d\x59\x4e\xf9\x4f\x94\xa3\x1d\x52\xc3\x67\x39\xae\x50\x2f\xbf\xd4\x10\x77\x08\xc4\xe1\xb7\x50\xd8\xe2\x25\x67\xb3\xac\x73\x4e\x0e\x56\x42\xab\x90\xa9\x2c\x6e\x88\x10\x09\x42\xea\x96\xd2\x31\xda\x6c\x3b\xc9\xaa\x4c\xb0\x5c\x9e\x00\x1f\x63\x90\xf7\xf9\x15\x8a\x55\xd7\x48\x86\x6f\xcc\x1f\x7b\xb6\x7e\x4e\xa1\xb5\xb4\xea\x89\xd2\x99\x81\xfb\x5a\x2e\xb1\x3f\x81\xae\xd2\x59\x5e\x4b\xf5\x73\x93\xec\x02\xcf\x4b\xd3\x90\x30\x5a\x7b\x31\x36\x8c\xc1\xc4\xf4\x0c\xcc\xc3\x39\x10\x43\x8d\xe7\xd1\x62\x3b\x14\x55\xca\xb6\x30\x7a\x48\xfe\xa0\x19\xf6\xbd\xc3\x02\xfe\x11\x28\xc3\x55\x67\xcf\xb7\x02\x52\xe8\x8d\x9c\xce\xcd\x4c\x4c\xdd\x65\x33\x69\x96\x48\x5f\x2c\xf3\xf0\xf0\x3c\x4d\x71\x75\x39\x14\xc7\x21\x9d\xca\xae\x7a\x51\xb6\x44\x75\x84\xcd\x17\xc1\x6d\x97\xc2\xd0\x02\xb6\x5b\x6b\xb6\xb8\x95\xf3\x03\x9d\x0b\x36\xc9\x5d\xcd\xb8\xc1\x72\x2b\xae\x08\x1d\x46\x26\xb1\x79\x4e\xb0\x00\x4b\x8d\x8e\x63\x8f\x7d\x75\xed\x4c\x42\xf1\x26\x9c\xd8\x2a\x91\x3d\xed\xc4\xd8\x36\xa4\x7e\xa2\x16\x09\xec\xea\x14\xbc\x2f\xaa\x36\x76\xc8\x87\x9a\x91\xcd\x99\xcd\xf7\xeb\xa0\x51\xa1\x63\x7a\x73\xe6\x49\x99\xc2\x26\x74\x26\x2c\x99\x4e\xa9\x0b\x99\xcc\xb6\x3e\xbd\x5b\x61\xf3\x9c\x18\x84\x0d\x2e\x30\x0c\xdf\x2b\xd2\xde\x68\x0c\xd1\x60\x48\xd8\x4c\x8d\xa3\x46\x08\x87\x2d\x8e\x0b\x1d\xb2\xc8\xbc\x4a\xf3\x32\x50\x70\x56\x6c\xfd\x28\x84\xbc\x5d\x07\x44\x3b\x1e\x67\x0f\xbb\x4e\x64\x0a\xf7\x79\x2b\xd8\xfd\x7b\xf1\x8c\x56\x45\x9b\x01\x05\x00\x9b\x81\x75\x81\xc5\x43\x0d\x44\x0a\x0f\x0e\x64\xfa\xbe\xb0\x3b\x95\x6a\xae\x16\x38\x8c\x9f\x3f\xb0\x0c\xc2\xde\x21\x38\xf5\x89\x6c\xfb\x60\x91\xb9\x9b\xcc\xe0\xb3\x54\x12\x50\xce\xa6\x5b\x10\x4a\x31\x11\x93\x9f\x82\x5d\xc1\x66\x55\x53\x60\x6e\xd3\x31\x38\x4d\xd4\x28\xdb\x0b\x71\x32\xbe\xef\x68\x31\xac\x01\x35\xa2\xe9\x8f\x23\xc5\x27\x96\x4d\x9c\xf6\xd9\x45\x9b\x1e\xbf\xc5\xb5\xa9\x97\xb8\xd0\x82\xe2\xcf\xa5\x40\xfa\xa6\xe3\x86\xe4\x6f\xd3\xd5\x2e\x55\x09\x38\x71\x3b\x6c\x16\xe8\xd2\xf9\x44\x38\x4d\xdb\x6e\xeb\x92\xe4\x11\xf5\xfb\x2e\x33\xbe\x78\x09\x1e\x4a\xd5\x4a\xb5\x7b\x6e\x0c\xcf\x86\xc2\x18\xca\x85\xb7\xd9\x06\x39\xd3\x98\x35\x0e\x32\xb0\x3f\x91\x28\x72\x0f\xff\x0c\xb3\x97\xc4\x1e\xd7\x73\x2d\xed\x19\x96\x62\x50\x8f\xe3\xb6\x95\xd9\x4e\x8b\x5e\x2b\x1e\x80\x5b\xda\x8e\x40\x49\x63\x1e\xd0\xb7\x37\x06\x0d\x9b\xcc\x00\x18\x26\x9d\x0a\x07\xae\x2e\xaa\x96\xb6\x55\x16\x75\xa0\x29\xaa\xf6\x10\x38\x98\xc6\x55\x69\x8c\x5c\x11\xef\x89\xfb\x63\xe3\x88\x61\x47\x1d\xa0\xef\x27\x1b\x18\x8a\x55\x93\xe8\xbc\x7a\x93\xe0\x8a\xf0\x1c\x1c\x84\x96\x1d\x24\xe2\xe1\xc8\x6a\xea\x8a\xc9\x6a\xbf\xe9\x2d\x99\x64\xce\x77\x05\xb1\x3c\xfa\x06\xff\x02\x8c\xb8\xac\x19\x76\x56\xd4\x88\xd6\xc5\x4d\x45\xab\x2f\xd5\x38\xcd\xed\x54\xee\x4f\xde\x60\xb3\xa4\x60\xad\xf8\x56\x07\xd4\x54\x54\x14\x31\x46\xf4\x0b\xc3\x00\xc9\x53\x98\xf2\xbf\xfe\xed\xdf\x5b\xd6\x5c\x4a\xa9\xe4\xc6\xb4\xd3\x04\xac\xed\x92\x55\x49\x20\xb3\xaa\xa3\xbc\x8f\x63\x9c\x87\x78\x3f\x59\x74\x2d\x2d\x5f\x92\x2e\xc0\x0e\xd2\x56\x55\x3a\x03\xe5\x10\x9e\xda\x36\x66\xd8\x31\x2a\x07\xea\x75\xa0\x57\xb1\xbe\x3a\x95\xde\xa0\xdc\xa1\x02\xd4\x06\x4c\x4e\x85\xac\x7e\x11\xda\x12\x4b\x2f\x97\x79\xaa\xc5\x44\x47\x6a\xb0\x05\x3c\xc1\x14\x1f\x10\x52\x29\x63\x79\x9b\x2e\x66\x0f\xb2\x04\x28\xee\x56\x0f\x48\x6d\x33\x56\x8a\xd0\x36\x53\x25\x6f\x59\xda\x08\x41\xc2\x1c\x9c\xcd\xa2\xca\x0e\x36\x7f\xa4\xde\xee\x95\x3a\xbc\xc7\xfb\x00\xfd\xaa\x63\x9d\x79\x7f\x37\x6b\x69\xb7\x39\xd8\x82\x95\x37\x9e\x19\x82\xc0\x09\xe3\x17\xea\x3f\xb8\xaf\xb4\x16\x56\x79\x5e\x40\xd3\x39\x4c\x9f\xc2\xef\x86\x6a\x1b\xd8\x61\xde\xc6\xaa\x1c\xc6\x60\x1b\xf5\x07\x4b\xab\x4c\xfc\x04\x3a\x9e\x5c\x11\x1a\xb7\x8e\x72\x8c\x95\x12\xbc\xcd\x60\x10\xac\x85\x56\x46\xfc\x75\xb2\x13\x28\xaa\x60\xac\xd4\x16\x37\x21\x15\x24\x1d\x2e\x45\x34\x47\x3c\xe7\x8e\xc0\x37\xec\xca\x0e\x5a\x48\x3a\x1f\x86\x59\x53\x46\xcf\x56\xe8\x07\x49\xc1\x63\x20\x20\x1c\x04\x42\x07\xcf\x01\x00\xb1\x81\x51\x29\xe6\x03\x7f\x04\xe6\xb5\xa3\xad\x9a\xb4\xb1\x05\xde\xc2\x90\x58\xed\x68\xbe\x50\x6c\x5b\x35\x2d\x4e\x3e\x18\x41\xbd\x35\x70\x89\x43\x92\x32\x11\xc5\xcd\x60\x72\x7d\x2b\x0e\x9e\x9b\x19\xc0\x63\x4f\xf1\xfc\xcf\x1e\xfc\xf2\xcd\xa7\xc6\x9a\xe7\x20\x39\x93\x35\x70\x26\x65\x4f\x1e\xfc\xf2\xc7\x4f\xc4\xfb\x3d\xf8\xe5\x4f\x9f\xd8\xe0\x6c\x50\xc7\xfc\x92\x84\xee\x83\x15\x71\x71\x5b\x86\xd5\x2b\x55\x87\x1b\x8b\x3a\x5f\x05\x67\xc3\xe7\x56\x35\x95\x99\x89\xf7\xbd\xfa\xb6\xeb\x6d\xfb\x4c\x33\x5e\xf6\xb6\x7d\xd9\x6d\xe7\x3a\xf4\x06\x64\xa1\xda\x6d\xe5\x8d\x41\x50\x5e\xb2\x71\x31\xd0\xce\x7e\x75\x5f\x7e\xc0\x7f\x00\xa7\xfb\x80\x87\xfa\xab\x2d\x64\x0d\xbc\x05\xda\xfb\x8e\xab\x95\x8b\xee\xf4\x07\xec\x1b\x40\xdc\x04\xde\xcb\x70\x54\xe8\x7b\xd7\xc7\xca\x99\xb4\xbd\x10\x3f\x3c\xd6\x6d\x41\xce\x16\x6e\xd3\x98\xc0\xf1\xc7\xec\xbc\x80\x53\xb0\x28\xc3\x76\x26\x00\x48\x98\x10\x98\x4b\xdb\x26\xae\xdc\xb5\x4c\xcd\x6b\xa2\xc0\xaf\x4c\x5d\x05\x53\xaa\x79\x71\x85\x0a\x73\x47\x95\x7a\x7c\x5a\x54\xfb\x60\x88\xa3\xf3\xdb\x4d\xd7\x09\x93\x6c\x89\x33\x74\x45\x34\xcd\x79\x46\xd2\x04\xb0\xe5\xbe\x9b\x71\xfe\x7a\xca\xa8\x12\xcd\xbb\xf4\x4c\xab\x59\x4b\x8f\xb2\xdf\x5f\x8d\xca\xfc\x04\xc5\x15\x41\xdc\x80\x0f\x60\xbe\xe7\x82\xe6\xc9\x72\x18\x50\x17\xf3\x34\x42\x8c\x11\x69\xe5\xae\x86\x04\xb7\x1f\x46\x4d\xed\x2a\xf6\xe1\x7d\xc6\x7f\x7c\xfb\xd6\x01\x0f\xb1\xc2\x6f\xe9\x7c\x66\x15\xa0\xcb\xee\x19\x49\x68\xaa\x75\x6f\x66\x5f\x67\xb3\x4c\x1f\x59\x7a\x9e\x13\x44\x92\x97\x56\x16\xc3\xd3\x2e\x8b\x72\x25\x6c\x7e\xf9\x52\xcf\xa1\x13\xab\xf4\x9e\x59\xed\xa3\xed\x59\xff\xc9\x86\x6d\x9c\xc4\x39\xda\x76\xec\xd1\xa9\x77\xba\x0b\x17\x84\xdf\x6c\x55\x15\x65\xd2\x40\x69\x84\x9c\xb9\x29\xc0\xf0\xf7\x72\x61\xab\xf2\x20\x1b\x65\x95\x3c\x7a\x36\x72\xa0\xf3\x5a\x1b\x6f\xbc\x1a\x83\x8f\x8e\x46\xb2\xfa\x6f\xa1\xe2\x5c\xf5\x52\xa0\xaf\xe3\x46\x18\x3e\x67\x2a\xd5\x63\xf6\xc7\xa1\xee\x30\xfe\xcc\x95\xe3\xf4\x16\x50\x81\x15\xba\x5c\xfb\x46\x36\xea\x6e\xa4\x5f\x30\x8c\x1a\xef\x87\xd5\x60\xf2\xe4\x0f\xac\x5f\x43\xfb\xcf\x80\x56\xee\x48\xfa\xcf\x97\xf9\x2e\x55\x7a\x09\x9f\x50\x25\x75\xa1\x76\x8b\x93\xb6\x6d\xba\x5c\x63\x83\x7b\x46\xec\x57\xd1\x03\xa8\xf8\x0f\x54\xc4\x70\xd2\x04\xaa\x2c\xca\xff\x75\xa4\xac\x75\xaf\x16\x94\x75\x1e\xd7\x50\xc1\xaf\x13\xb9\xd0\xf0\x42\x9c\x49\xd8\xc7\xb8\xf5\xce\xa2\xd9\xb4\x2b\xa1\xfb\x71\x2a\x49\x36\xed\x62\xf3\x9f\xe0\x65\x93\x7a\x2b\x1f\x40\x3b\xfb\x35\x2d\xd2\x12\x15\x40\x39\x77\xe1\xc2\x5e\x76\xed\x8d\x14\x2b\xda\xe0\xab\x05\x76\x2c\xac\x32\xdf\xfb\xcb\x80\x69\xaf\x05\xb8\x77\x9b\xe1\x9f\x7e\xcb\xf2\x77\x76\x6d\x1b\xd5\xfc\xe8\x66\x28\xbe\x11\xb2\x13\x51\xe1\xf6\xbc\x2b\xda\xc6\x9a\xdc\xe2\x23\x6d\x99\x1e\x5f\xc3\x23\x8d\xeb\x44\x59\xd1\xae\x27\xae\xa8\xad\x5c\x7b\x2f\x9c\x87\x37\x6b\x7d\x29\xcd\x33\x11\x86\x59\x22\xfb\xa3\x63\x43\xc2\xd4\x5a\x5d\xc0\x2b\xba\xb5\xcf\x16\xb7\x0a\x52\x3d\x5e\xdb\x86\xde\xdf\x67\x0f\x13\xa9\x5e\xef\xbf\x77\xfe\x0e\x2a\x5d\x25\x6d\xc7\x0f\x52\xf8\xce\x80\x27\x58\xd4\x49\xcd\xb7\x81\x95\x3a\xc8\xe7\x13\xae\xfc\x09\xd8\x8a\xcc\x92\xd2\xe4\x0f\x0f\x12\x7c\x83\xa2\x3d\xb4\x33\x29\x92\xe0\x59\xb8\x1a\xf0\x11\x89\xcb\x0c\x05\x61\x92\x24\x8b\xbb\xcf\x8b\x04\xd5\x67\x4a\xbf\x1b\xde\x8a\xdf\xe1\xb6\xce\x9e\x0b\xfc\x3b\x69\xd2\x2d\x82\x42\xc0\x72\x93\xf7\x89\x05\xf9\x93\x03\xd1\xca\xb7\x98\x3a\xe5\x37\xa4\x0d\xb1\x8c\x88\x5b\xe1\xea\xac\x39\xf5\x81\x26\xc5\xe7\xd4\xa0\x1d\xaa\xe9\x9f\x3f\x35\x76\x28\xe9\x62\x1e\x52\xef\xd9\x69\xde\x2c\x69\x46\x73\x13\x01\xc4\x3a\x19\x9f\x23\xaa\xa1\x67\xee\xc6\xc9\x3d\x76\x52\x18\x3d\xe9\x09\x51\x78\x58\xee\x90\x17\x1b\xce\x40\xb3\x9c\xa4\xdd\x02\xe7\xac\xf5\x5d\xc9\xe0\x6c\xee\xed\x1c\x37\x8b\x53\xc1\x69\x34\x4d\xb3\xf3\x60\x1e\x02\xf4\xd1\x5c\x18\x28\x30\xb6\xd8\x56\xf2\x78\xe6\xee\x69\x11\x38\x4c\xa4\xbd\xc1\x26\xad\xef\x19\x5d\x03\xca\x09\x6d\x61\x92\x89\x45\x9a\x7a\x18\x52\xd2\x76\xa4\x0e\x3f\x4c\xe2\xac\x6b\x2c\x21\x8e\x5a\xd5\x7b\x38\xdc\x63\x6e\x60\x1b\x66\xc7\x90\x37\x44\x29\x0c\x5b\x10\xcd\x9e\xeb\xa3\x17\xae\x01\xfc\x1e\x91\xad\x56\xac\x4c\xc1\xaf\x2d\xcc\x2d\x1e\xcf\x5f\xb3\x8f\xdf\x26\x74\xfe\xcf\x97\x71\x25\x9e\x1a\x26\x15\x21\xd7\xa2\xc8\x37\x9b\x80\x5e\xa4\xe5\x9c\xad\xad\x78\x46\xbc\xd9\x46\xd4\x3f\xd8\x70\x84\xfe\x3e\x23\xe4\xb2\xfe\x9f\x5d\x7d\x6c\x22\xf3\x35\x55\xf2\xb0\xdd\xe3\x28\x59\x12\xa5\x06\x34\xa3\xc1\x18\xc3\xcd\x3f\x6c\xc0\xc5\x06\x10\x03\xa7\x85\xc9\x33\xeb\x1f\x13\xae\x29\x4b\xb6\x7d\xe7\x2e\x2b\x96\xac\xf4\x96\xd0\x84\x6d\x54\x3b\xe4\x12\x8f\xd8\xf4\x70\x28\x26\x35\xe7\xc1\x36\xc5\x4a\x84\x44\x59\x4b\x31\x46\x77\xa5\xee\x53\x2e\xad\x3a\xe2\x8f\x3c\x6c\x36\x51\xd3\xa7\xc6\xc9\x43\x65\x22\x4d\xf9\x50\xcd\x81\xad\x77\x4c\x3f\x13\xa3\x64\xed\xd1\x1f\x1e\x64\x8f\x19\xdd\xd4\x6a\x92\xc9\x64\x70\x29\x1a\x3d\x6f\xf1\xe8\x3a\x4d\x7e\xa2\xde\x87\x4f\xff\x79\x6a\xa6\xc9\x24\xb8\x9e\x0f\x4f\x3d\xa7\x1a\x08\xb2\x43\x15\x88\x32\x46\x61\xf6\xb8\x26\xa4\x0f\x90\xcd\x1e\x38\xf9\x6c\x08\x02\xe3\x8f\x8e\xb0\x07\xb4\xd6\xaa\xe6\xae\xd3\x22\x63\x5d\x6c\xaf\x2b\x22\x8f\xf5\xeb\x57\x19\x25\x1e\x15\xf4\xdb\x38\x62\x08\x61\x58\xc1\xe6\xf4\x8d\xde\x18\x51\xdd\x29\x38\xbe\xc9\xe9\x6f\xb7\x62\x40\xe4\x5b\x51\x9d\xa0\x4e\x90\xdc\x67\x87\x00\x1a\x97\x20\x6f\x4d\x34\x7b\xbc\x23\x9e\x99\xc0\x9e\x25\xcc\xb4\x83\xfe\xc9\x8f\x37\x79\x24\x97\x89\x84\xc8\x8f\xe3\x61\x9a\xb4\x86\xe9\xe5\x6a\xd0\xb4\x73\xfc\xaa\xd5\xcd\x65\xfd\x61\x75\x07\x5f\x14\xe1\x6c\xca\x2b\x0e\xeb\x7e\x83\x2f\xd8\x99\x6c\xdd\xbf\xa2\xff\x1d\x6f\xb7\xc7\x59\x76\x7f\x64\xdc\x8e\xc1\x73\xe3\xb7\xd7\x53\x01\x9b\x97\x3a\x4d\xca\xbd\xb0\x86\x80\x59\x1e\xc5\x2f\xb6\x41\xf0\x2b\x65\xc3\x7e\x18\x67\x7e\xbd\x08\x66\x4f\x1f\x8b\xda\x85\x3c\xc2\xde\x66\xd3\xfe\x9a\xad\x8a\x5b\xf1\x06\xcd\xef\x08\xe3\x61\x84\xa2\x06\x71\xe5\x41\x96\xf2\xe4\x6e\x64\xf6\x2d\xec\x48\x1f\xf5\x71\x6f\x60\x96\x01\x9c\xd9\xde\x31\x27\xfe\x61\xee\xbd\x18\x2b\x94\xcd\x77\xad\x86\x16\xf1\x23\x80\xff\x07\x38\xfd\xb1\x5e\x0c\xd0\xe0\xe0\xbb\x87\xc9\x64\x9f\x6f\x72\x9a\xab\x4d\xce\xbf\xa6\x7b\x53\x2c\xe1\xa9\x55\x1d\xba\x89\x6f\x43\x64\xdf\x8b\xf2\x65\xa0\xaf\xe5\xe0\x47\x86\xb5\xe6\x08\xde\x35\x0b\x7d\x67\x32\x59\x57\x57\x50\x1e\x67\xd5\xb2\x63\x55\x4a\x6d\xdd\x3b\x64\xca\xba\xc8\xab\x16\x69\x42\x71\xf9\x32\x27\x4a\x38\xe7\xe8\x55\x4c\x16\x7c\x84\x1f\x39\x44\x05\x38\x8c\x6e\xc5\x09\xca\x35\x73\xba\xf2\xcc\x21\xbc\x3c\x33\xb7\x75\xda\x57\x37\x01\x80\x35\x3b\x8e\xcd\x08\xe0\x83\x9c\x70\x5b\x0c\x23\xe1\xf3\x2e\xe0\x32\x6e\x4d\x60\x46\x13\xd2\x05\x1d\x0f\x3b\x48\x0e\xfa\x69\xbd\x20\x4b\x2e\xdb\xf0\x6a\x63\x7c\x01\xf0\xc0\x3a\x28\x0e\x19\x86\xd4\xba\x2b\x80\xe3\x1f\x2e\xc7\xb8\x8e\x5a\xe7\xa2\xf1\xf7\x82\x6e\x34\x4e\x9b\xfb\x6e\x6c\xa4\xf2\x3a\x25\x80\xf2\xe2\xec\x21\x40\x8c\x7d\x69\xe6\xdf\x30\xfb\xc0\x6f\x3e\xa4\x83\xc2\xb3\x42\x4c\xb3\x2c\x6b\x8c\xb6\x78\x5b\xd3\x31\x2d\xbf\x85\x1b\xf5\xef\xfd\xea\xf5\x6f\x6d\x5f\xd4\xc1\xa3\x4f\x87\x5f\xc7\xda\x8e\x3d\x42\xd9\xba\x77\xea\x6b\x69\x74\x72\xff\xeb\xdf\xfe\xbd\x09\x26\x56\x34\xa9\xee\xc1\xa2\x57\xa2\xb2\x07\xa5\x03\x51\xb1\x6c\xea\x54\x96\xb2\xe1\xb8\x19\x1c\xc2\x41\xd3\x03\x67\xc9\x78\x03\x0a\x3c\x57\xe6\xe1\x00\xcc\x94\xdf\xc8\x4b\xd4\xae\x43\x20\x7c\xbb\x3d\xfb\x19\xff\x1e\x02\xc1\x3c\x41\x87\x96\x1d\x02\xe8\x4a\xbd\xd7\x99\x7d\xb4\xbf\x3c\xe8\xba\xaa\x36\xf0\x92\xbd\xe0\x1f\x3e\x7d\x95\xb7\x92\xf5\x32\x6f\x8f\x7b\x79\x70\x26\xbe\xf4\x91\xc0\x9e\xb1\x6f\xf1\xd1\xc0\x62\x53\xb5\xa2\x75\xb0\x6a\x21\x7f\xae\xdf\x1e\x10\x16\xea\x36\x5e\xda\x39\xfd\x4e\xde\x55\xfb\x61\x35\x00\x82\x9b\x79\x04\x6d\x11\x5a\xc6\xd5\x21\x1d\xdb\x8c\xbb\x91\xd8\x5c\xe7\xd8\x96\x64\x47\xfa\x5e\x03\x2b\x99\xaa\xd2\xd4\x74\xb8\xb4\x12\x7f\xb3\xd3\xa0\x13\x98\xec\xf7\xde\x89\x7b\x13\x4d\xbb\xde\xdc\x8f\xa2\x87\xb7\xce\xf3\x8b\x20\xee\x1e\xc0\xe9\x7d\xd1\x9b\x0a\x78\x74\x28\xb1\xfd\x7b\x45\xf0\x38\x95\x51\xff\x2a\x78\x8c\x82\x32\xfa\x46\x49\x9f\x49\x86\xc6\x09\xae\xd5\x34\xbb\xc6\x71\x99\xf9\x6e\xbe\x34\x29\x27\xf1\x01\x52\xf5\x90\x16\x9b\x42\xc3\x1d\x4a\x08\x0b\x26\xdb\xcd\x0d\x8d\x6c\x1b\x8c\x1c\xea\x64\x50\x68\x44\x8d\xe1\xb3\x01\x57\x79\xf0\x60\x4f\xf9\x5c\x24\x86\x35\x9f\x43\x58\xf1\x73\xa1\x55\xdb\xa3\x20\x98\xa8\x08\x9a\x63\xee\x84\x25\xd8\xc9\xe6\x61\xd8\xb9\x32\x69\x36\x10\x43\x10\x13\x24\xf6\xd9\x2c\x8e\x11\xd9\xb1\xc4\x2d\xe6\x81\xc9\x0e\xb1\xbe\x8b\x22\xcd\xd8\x6d\x2f\x0b\x5b\xae\x21\xd1\x44\x45\x53\xc3\x49\x09\x3f\x15\x81\x25\xf4\xe8\xe4\x30\xcc\x5c\x61\xa2\x59\x2a\xf2\xd5\xba\xdd\x1b\xfc\x7b\x57\x4d\x6e\x80\x71\x4d\x76\x46\x38\x55\x13\xc7\xe6\x52\xb3\x78\x66\x94\x93\xa4\x51\x1f\x6b\x34\x9c\xc4\x8c\x54\x33\x2c\x2c\x4d\x37\xed\x0d\x4c\xa8\xb4\x3f\xc9\x6b\xee\xf3\x85\x36\xfd\x2e\xdd\x02\x77\xcf\x01\xf3\xed\x9d\x35\x4c\xc5\x21\xe7\x12\x61\xa0\xf0\xf7\x6e\x60\x76\xf3\x69\x4b\x9c\x04\x1f\x77\x0d\xd1\x46\xcf\x50\xa1\x0d\xc6\xdc\x70\xff\x22\xcf\xdf\xf8\xdc\xf9\x1b\x7c\x1a\xfd\x3d\xf9\x1b\xb6\x0c\xfd\xc9\x69\xef\x7d\xfe\xbb\x3d\x93\xdc\x34\xba\xa0\x81\xb1\x73\x27\x0e\xb0\x51\xda\x67\x87\xb1\xf0\x66\xe4\x41\xba\x7b\xfc\xcd\x4a\x11\x3a\x0c\x37\xa6\x6d\x02\x6c\x62\x81\x53\xba\x69\xe3\x96\x3c\x0c\xb5\x26\x6c\x9f\x86\xa8\x25\xd6\xf7\x01\x9d\x49\xe2\xd6\x8d\xed\x6f\xab\x95\x7b\xa9\x28\x02\x84\xab\x38\x4b\xd9\x40\xec\x56\x6c\x33\xae\x61\x21\x80\x78\x6e\x01\xd5\xe2\xd0\x92\xec\xa2\x11\xfa\x94\x46\x1e\xd7\x88\x3f\x3a\x65\x74\x7a\x2f\x77\xf4\x7c\x1d\x3e\xdf\xd2\xf3\x35\x3c\x66\xa0\x6f\x6a\xa1\xf2\xc0\x5f\x66\xe0\xb8\x22\x44\x6e\x2a\xa3\x77\x5b\xfd\x32\x6e\xc9\xe4\xb9\xdd\xad\xd1\xb8\x00\x7a\x03\x11\xd4\x25\x77\xd4\xbd\xfa\x7c\x90\x28\x79\xe7\x51\xaa\x97\x71\xaf\xa4\x80\x28\x33\x1d\x36\x2b\x9c\x4a\x43\xac\xca\x71\xc2\x94\x98\x16\x4c\xde\x7f\xdc\xca\x13\x35\xed\x46\xb0\xc4\xd5\xd6\x9a\x49\x0f\xba\xc1\xcb\x3f\xda\x11\x7b\x2d\x6d\x95\x2e\x83\x8e\xd8\x9b\x40\x99\x3b\x8e\x37\xa2\x4f\x71\xa3\x33\x44\xa1\xe5\x4d\x79\xd6\x7b\x76\x70\x23\x2f\x5b\xec\x94\x19\x4b\xea\x84\x1d\xad\xb7\xd1\x1b\x9b\xf0\x90\xa0\x2d\x54\x36\x97\xf6\xea\x88\xfd\x2b\x3a\x3f\x82\x43\x28\xd5\x0c\xb1\x36\xc3\x59\x74\x0b\x9f\xeb\x3c\x8a\x8b\xd3\x1f\xef\x50\x53\x5f\x0b\x85\x1e\x0f\x39\x38\x59\x17\x86\x18\xd4\x08\x34\x82\x77\x23\xdd\x8b\x56\xeb\x23\x7b\x04\x47\x80\x4f\xf7\x0c\x1c\xb4\x3c\x73\x68\xec\x1b\x97\x2b\xd1\x2c\xbf\xce\x49\xaa\x2e\xe2\xe0\x25\x77\x35\xf3\x47\x6e\x06\x2f\x53\xbb\xcc\xb7\x82\x9a\x64\x9b\xf7\xf7\x4b\x7f\x84\x39\x47\x78\xfb\x98\xfc\xf6\x1f\xbf\xfd\x87\x7d\xe2\xae\xd0\xfe\xcd\x7b\x54\x62\x21\x3e\x60\x06\x3d\x02\x5d\xd3\x0b\xb3\x9f\x2a\xd1\x5a\x3a\x67\xf8\xb1\x84\x28\xfa\x31\xaf\xa7\x6a\x43\x44\xfa\x76\x70\xd0\xf3\x05\xd7\xcf\x72\x10\x5b\x4d\x67\xe8\xa1\x64\x04\x5c\x8d\xa5\x69\xae\x3f\xca\x11\x1e\x74\x60\x8f\x37\x91\x2b\x8e\xd7\xc7\x9b\xa9\x5c\xc3\x72\xd0\xec\xdc\xcd\x0a\x62\x74\x10\xa7\xff\x0c\xc6\x0a\x1f\x2d\x97\x3f\xda\xca\xe1\x9d\xc9\x8d\x64\xca\x3f\x30\x89\x7e\xc0\x13\xad\x9e\xd9\x7c\x1e\xb4\x48\x23\x75\x87\xc2\xef\xe9\x40\xf5\xc6\x25\xa1\x37\x1e\x7a\xfb\x6a\xc2\xb5\x19\x38\x4a\x1c\x3c\x55\xea\x81\xfa\x79\xe3\xa8\x01\xec\xfb\xb9\x4f\x58\xbd\xd0\xcd\xc8\x53\xcb\x75\x3e\x1c\xeb\xf1\xf3\xfd\x69\x62\x95\xa5\x3c\x73\xf6\x8d\xb6\xf7\x44\x05\x66\x6e\xd0\xc7\xe1\x54\x7a\xf4\x00\xa5\xb2\xc6\xb5\x70\x18\xe0\xcd\x69\xbf\x4c\xba\x7a\xb5\xff\x71\x58\xbb\x77\xa6\x15\xbc\xfa\xef\xab\x35\xdc\xeb\xf1\xde\x42\xe4\xe5\xc2\xac\xea\x5c\x5e\x83\x23\x88\x93\xc5\xd0\x23\x7b\xa0\x1e\x85\x66\x19\x7a\xf4\x3a\x97\x10\x50\xe6\xb8\x0b\xf2\x3b\x26\x85\x1f\xab\x60\x66\x4e\xe8\xf8\xe5\x17\xae\x88\xdf\x80\x87\x78\x50\x61\x60\xb7\x1b\xbe\x3f\x46\xcf\x2f\x5b\x5e\x67\xc1\xa1\x7e\x95\x21\x5a\x7d\x88\x48\xf2\xb8\xf7\x9c\x43\x72\xc4\xb0\x92\x7c\x2c\xe0\xd3\xb8\x2b\xbe\x21\xe9\x10\x9b\x80\x77\x31\xa9\x0a\x24\x29\xda\x32\x73\x47\xff\x59\xdf\xa1\xb4\x1f\xe6\xb4\xc3\xea\xec\xc9\xe3\x4e\x8a\x10\x7d\x7d\x9f\x2a\xbe\x28\xec\x9f\x20\xb1\xd3\x89\x03\xce\x26\x02\xd1\x05\x81\x21\x02\x83\x07\xab\xd8\x76\xcb\x1a\x7a\x9b\x3a\x54\xca\x4d\x67\x50\x2c\x8f\x3d\x86\xf5\x51\x23\x6a\xf4\xa7\x31\x72\x18\x35\x30\x72\xcf\x1f\x98\x66\xdc\x5d\x26\xf0\x4f\xe4\x4f\x25\xe7\xb4\xa5\x60\x6e\x6e\x3c\xc6\xeb\x6d\xcc\xff\xb0\xca\xef\x63\xe8\xda\xc9\xb6\x2b\x8f\x7e\xbe\x66\x4e\x02\x47\x1c\x81\x0c\xcc\xf6\xd9\x12\x0e\x2c\xb4\x84\x65\xdf\x9b\x3e\x28\xdf\x34\x28\xc2\xee\xd3\xfd\x7b\x6b\xdc\x12\x2e\x7a\xb3\xda\xf3\x7e\xec\x18\x26\xbf\x2c\x96\x77\xc3\xa1\xee\xbb\x39\x8d\xa4\x23\xc8\x0a\xec\xc2\x5b\x42\x0a\x79\x2f\xe8\xfc\xfa\x32\xcf\xc6\x8e\x58\xbc\xb4\xb5\x41\x9e\x83\xe1\xf7\xef\xb5\x46\xf1\x03\xb8\xb5\x17\xd5\x88\x55\x91\x8c\xa1\x20\xab\x47\x64\x65\xad\x22\x85\x3d\xf8\xe0\xf4\x57\x81\x0b\x2c\x44\xa3\x96\x4c\x08\xfb\x9f\x37\xce\xa3\xad\xb8\x1f\x91\x20\x33\xb0\x03\x2b\x0d\xbb\x2e\x87\x8a\x56\x44\x11\xd3\x21\x58\x6f\xce\xb7\xe3\x24\xb7\xb2\x77\xa4\x1d\x7b\xb4\xba\xce\xf9\x36\x3f\xf9\x59\x4b\x65\x12\x72\xd8\xf9\x41\x0f\x4b\x86\x25\x8e\x12\x09\xd9\x02\x47\xe3\x98\x97\xb3\xf7\xe7\x17\xfe\xc6\x4a\x78\x9b\x62\x63\x67\x93\x04\xc8\x87\xd6\x7b\x13\xaa\x07\xb3\x46\x18\x8f\x59\x0f\xa8\x3a\x55\xcc\x01\xce\x4b\xf1\x4b\x77\xb7\xff\x0e\x37\x4d\x78\x0a\x8c\x4b\xfb\x60\xd2\x75\xc2\xfd\x36\xb3\x33\x3f\xce\xa8\xf4\xa0\xef\x70\x35\xa4\xa0\xd6\x7d\x6d\xd0\x79\xa3\x8e\xfe\x56\xc1\x13\xd5\x2f\x79\x52\x3b\xd8\x01\x1f\x79\x4e\x9a\xfb\xf2\x81\xa0\x55\x4c\x39\x92\x21\xec\x6e\x09\xea\x66\x76\x41\x5f\xc7\x88\x30\x59\xaf\x22\x32\x39\x0a\xad\xb2\x25\xf4\x1d\xc2\xfe\x9b\x5d\x82\x17\xcf\xd6\x7f\xb2\xf2\x89\x76\x0a\x60\x62\x88\xa0\x49\xc3\x89\xec\x55\x1b\xf0\x4d\x1c\x53\x71\xef\x07\x15\x6c\xdd\x54\x10\x85\xfd\x92\xd6\xf9\xd5\x34\xc1\x65\x07\x3b\x14\x90\xfb\xec\x06\x32\x0a\xab\x65\x18\xeb\x54\xcc\xbe\xf5\x57\x1c\xc1\xb4\x63\x3f\x8a\x8b\x2a\x45\xe4\x21\x6a\x4c\xed\x25\xef\x4f\x7a\x9f\x3b\x02\xd0\xec\x2a\x38\x4b\x39\x29\x6d\x04\xbd\x3e\x88\x5c\x59\xc1\xbd\x24\xff\x1d\x02\xec\x24\xb0\xcb\xec\x0d\x07\x74\x19\xe6\x2f\xaa\xec\xc6\xfa\x16\x1c\xa8\x4d\xf5\x41\x3c\xa2\x43\xf3\xe3\x59\x4b\xdc\xf8\x85\x53\xcd\xfb\x93\x8d\x5c\x01\x81\xab\x5f\xe7\xd2\xc9\x3f\xfa\x65\x75\x82\x0b\x3c\x89\x70\x8b\x5c\x53\x1e\x68\x1c\x10\xea\x48\x82\xb7\xcb\xab\x5d\xe7\xbc\x98\x19\x43\xae\xc1\xbb\xac\x72\x2a\xca\xe9\xa0\xbb\xf2\x18\xd9\xf1\xab\x6b\xbd\x05\x69\xa5\xa2\x4b\x7e\xd3\x8e\x5d\xb3\xad\x40\xc4\x6a\xb5\x37\xf5\xd2\xf6\x4e\xc2\x84\xb1\x2f\x0e\x38\xcd\x2a\x48\xfc\x53\x18\x89\x05\xc3\x3b\x8e\x1d\x5d\x51\xcd\x61\x3c\xe0\x91\xbe\xb0\x97\xa7\x57\xdc\x85\x48\xdb\x60\xf3\xad\x0d\x2c\x83\xe4\xbd\xf9\x57\xde\x4a\x61\x05\xc6\xbb\x5b\x1e\x23\xec\x96\x6e\x5b\x92\x68\x9c\xd2\x08\x54\x51\x75\x44\x3d\xe2\xd8\x8f\xec\x05\xc5\xa2\xe8\x48\x5a\xf8\xd8\x0d\x7c\x9a\xd3\xdc\x58\xdf\x83\x31\x3d\x76\x4e\x84\xb1\x9b\x40\x55\xaf\x99\x1c\x17\x1b\x6f\x83\x92\x5b\xa7\x60\x1d\x65\xc0\x1a\x3b\x3a\x29\x1e\xfd\xf9\xfc\xfd\xbb\x23\xed\xea\xe7\xe3\x6f\x8e\xff\xe5\x9f\xfe\xe9\x78\xbf\xdf\x1f\x9f\x12\xdf\x78\x7c\x4d\xa4\xed\xb8\xab\x69\x86\x91\x9f\xe9\x30\x08\xdc\x6c\x9f\x9a\xf2\xf6\xbb\x27\xf4\x77\xfa\x78\x48\xc6\x25\xee\xb6\x58\x89\x05\x81\xed\xff\x71\x6a\xae\xbb\x88\xd5\xba\xfd\xf8\x48\x21\x9f\x88\x25\x95\xd7\x05\x1a\x64\x48\xfc\xa9\x04\x6c\xc9\xb2\x36\x78\xb2\xb0\x36\x79\x80\x14\x0d\x71\x28\x1b\xef\xd4\xbc\x17\x27\xaa\x07\x96\x53\x3b\xdc\x91\xd7\x4b\x8d\x5f\xdf\x87\x10\x33\xd4\x1f\xd9\x02\xd5\xeb\x9c\xe1\x98\x51\xf5\xcc\xf9\x95\x5b\xa4\xe8\x74\xdd\xeb\xf9\x60\x25\x61\x4b\x27\x69\xca\xea\x7c\xb5\x82\x80\xc7\x84\xed\xfb\x7e\xb5\xec\x96\xa2\x2a\x8b\x1b\x1b\x82\x18\x2e\xe5\x08\xa5\x64\x5d\x91\x6b\xd5\x94\x0c\x3f\xed\x97\xe7\x10\x6e\x06\xb4\x9a\x4d\xf9\x66\xaf\x37\x62\x19\x60\x85\x3c\x60\x61\xf0\xcc\x58\x58\xca\x41\x2d\xe2\xda\x9c\x2f\xc4\x08\x91\x93\x4d\xce\x4f\xb7\xf6\xb0\x9f\xda\x48\x20\x45\x94\x1c\x16\x13\xc3\x8a\xe7\xb5\xf9\xed\x3f\xcd\x60\xc6\xf4\xca\x56\x26\x8e\x0d\x05\x8f\xd4\x69\x45\x60\x6e\x30\x9c\x8f\xc0\x88\x87\x6d\xf7\x3e\xc8\xc7\x5d\x80\xd2\xc6\x59\x68\x86\x26\xe6\xdf\x47\x89\x58\xb0\x20\x54\xa6\x4d\x01\xad\xc3\x5f\xfb\x02\x85\x48\x6f\xe9\x7f\xcb\x75\xbc\xde\x10\xda\x4f\xb6\xdf\xc0\xa7\xde\x35\xb1\x2b\xa5\x5b\x93\x0d\x26\x04\xeb\xc5\x9e\x45\x46\x97\xd9\x9d\x09\x7c\x32\x3b\x15\xd2\x98\x9a\x54\x62\x42\x72\xa4\x37\x73\xd9\x4f\xb6\x96\x54\x44\xb4\x6e\x3b\x76\x97\xed\x08\x4f\xaa\x07\x6a\x84\x9c\xe9\x25\x91\xe1\x6b\x66\x86\xf6\x8e\x53\x0c\x90\x54\x8e\xdc\x95\x49\x35\xae\x5c\x9f\x05\x66\x32\xd9\x73\x9b\xbb\xf7\xec\xf0\x90\x6f\x56\x2a\x6c\x59\x67\x35\x20\xd1\xcf\x01\x58\x54\x7d\xc0\x35\x8d\xca\xb9\x2a\xb2\xf5\xb9\xf2\x51\xde\x50\x1e\xc9\x58\x66\x06\x21\x4a\x3e\xa8\xfb\x59\xc7\x56\xf5\xd9\x78\xff\xc0\x29\x89\xfb\xca\x4f\x6e\x99\x46\xf8\x43\x23\xf6\x9e\x6c\xfd\x1c\x95\x62\x1a\x5c\xe3\xe6\x79\xc5\x26\xf6\xb8\x1d\xb2\x4e\xa2\xac\xf4\x60\x9d\x46\x8f\xea\x67\xa5\x21\xf1\xcc\x79\x8e\xdf\xe2\x11\xb3\x0f\x40\xe2\x78\x9a\x5b\x08\x44\x90\xc9\x07\x20\xb8\x84\x2c\x4d\xa1\x30\x44\xdd\x61\xc0\x13\x4c\xe6\xae\xa8\x6e\xc4\x6b\x76\x10\x56\xdb\x07\x1a\x09\x47\xef\x81\xf1\xbc\x53\x47\x21\x89\xb6\xc4\x58\xcd\xca\x99\x5a\x1f\xd8\x12\xdb\x33\x87\x89\xa4\x95\x6f\x99\x49\x04\xa3\xd0\xd8\x90\xe4\xc9\x5f\xc2\x00\x48\xce\x38\x4e\xf5\xbd\x91\x3b\x6e\xb6\xed\x0b\x7d\x7b\x5a\x37\xbb\xc1\x74\xb2\x7f\x22\x3f\xd2\x8f\x1a\xc8\xc7\xbe\x9e\x89\xc7\x70\x40\x55\x10\x9a\x88\x8d\x8d\xb2\xe7\x6c\xda\x81\xc4\x1e\xb1\x4f\xa3\xa6\x1c\x1f\xd5\x73\x8b\x1d\x96\xf5\xbe\xb1\x7b\x65\xb7\x12\xf4\xed\x90\x5b\xec\x68\xe9\x46\xdc\x5e\xc7\x83\x0e\x3c\x5f\x7b\x59\x25\x74\x7c\x3d\xbe\xb0\x03\x3d\xc8\x57\xa1\xc3\x57\x39\xbf\xee\xf5\xcf\xd9\x47\x45\xe6\x50\x23\xfe\x60\x03\xe1\x22\x0a\x16\x75\x58\x80\x1b\xeb\x9b\x17\x7b\xa2\x5e\xdc\xf5\x38\x62\x92\xe5\x97\x97\xd3\x45\x5d\xed\x1b\xb8\x93\xee\xea\xa5\x99\x3d\x2b\x52\xe9\x14\x25\x97\x02\x20\x0e\x28\x66\x78\x88\x4b\x08\xbb\x92\x87\x6b\x9c\x23\xe6\x3e\x33\xf9\x23\x49\x6c\xce\x1c\xc7\xa7\x3f\xa5\x74\xaf\xbb\x1f\x1a\x24\x73\x39\x8e\xf0\x8d\x5f\xec\x14\x1b\x31\x80\x88\xdd\xe1\x92\xe7\xf8\x0e\x80\xd8\x29\x26\x3b\x62\x9a\xfd\x25\xbf\x02\x9b\x7b\x7c\xcb\x3c\x8e\x38\x64\x0a\x20\xbb\x12\x81\x32\x33\x81\x7d\x09\x65\xe9\x02\xcf\x49\x6b\x96\x2a\x23\x68\x34\xa1\x04\x52\xd9\x0e\xb6\x2e\x55\x83\xf2\xc0\xef\xa3\x67\x4b\xb6\x01\xc7\xa2\x24\x32\x77\x36\x7a\x0f\x32\x0f\x68\xbc\xfa\xfa\x41\x16\xe9\x11\x83\xea\x74\x29\x88\x34\x3e\x7b\xfd\x4e\x3e\xd8\x37\x53\xe4\x27\x49\x24\xcc\x6b\xa3\xeb\xa2\xf1\x74\x76\xec\x71\x82\x76\x1b\xfb\xc1\x40\x4e\xe2\x13\xa1\x23\x4e\xf1\x58\x5a\xdc\x7e\x3b\x97\x53\x52\x03\x1c\x53\x6d\xd3\xf2\x46\x6d\xe9\xcf\xa1\x4d\x16\xdf\x08\x7b\x53\x8b\x8f\x11\x76\x4a\xe5\x6a\x41\x79\x14\x50\x28\xeb\xfe\xc2\xbe\xc5\x42\xa5\x13\xeb\x65\x6b\xea\xbc\x6d\x7d\xd0\x1f\x2e\x47\x5c\xa3\xf1\x6f\xef\x30\x93\x3f\x1d\x48\x56\xa7\x97\x7c\x4d\xbb\x34\xbb\xd6\xa5\xee\xe0\xbe\x5a\xca\xfd\x44\xdb\xa2\xa8\x76\x70\x90\x2d\xb7\x91\x0e\x88\x26\x0b\x68\x47\x78\xb3\x40\xb0\x27\x9b\xcc\x86\xa1\xce\xe6\xc5\xa6\xa6\x10\xaa\x83\x55\xf7\xeb\x16\xb9\x94\x4a\x39\xb0\x26\x9c\x89\x64\x6a\x01\xdf\x6f\x94\xb7\x8f\x44\x09\x7e\x46\x15\xe0\x47\x34\x5e\x6f\x72\x2a\xce\xc7\xc4\x1b\xa2\x4c\x8c\x7a\xbc\xcb\x5b\x71\xcf\x3d\x8d\xfa\x1c\x94\x64\x1f\xc1\x46\x38\xa7\x82\x2f\x4f\x65\x05\x8a\x6a\xc5\xfe\x65\xc3\x80\x5f\x72\xad\xb6\xaa\xf3\xab\x9d\xf2\xc5\x4e\x83\xba\x20\x76\x84\xe3\xbd\x58\xa2\x23\x8d\xb9\x56\x89\xdd\x15\x91\xf6\x22\x5d\xb1\x50\xe2\x33\x58\xa0\x42\x70\xb6\x08\xd8\xc6\x32\xb6\xb1\x85\xbc\x7f\x3a\xca\x65\x0e\x7a\x29\xfc\x76\xe8\xfe\xae\xe5\xb0\xe3\x57\x62\x40\xb0\x8c\xc7\x1d\x1e\x5d\x36\xad\x77\x5c\xd9\x64\x31\x37\x53\xb3\xc6\x10\x51\x78\xd7\x03\x4b\x38\x94\x90\xcb\x81\x68\x07\xa9\xe3\x0d\x5c\xa5\x41\x27\x3c\xc4\xad\x81\xa7\x7c\x9a\xb0\xf4\xb8\xb7\xe0\x01\xb8\xe5\x6d\x41\x85\x88\x62\x50\x81\x2e\x81\xe9\xbd\x97\xad\x14\x32\x08\x70\xcd\xf4\x4f\x83\xd1\xec\xea\x2a\xeb\xf8\xb9\x49\x46\x33\x6b\x44\x43\xea\xc7\xdd\x7f\xb6\xe8\x7a\x80\x89\x23\xe6\x5d\xb7\x57\x30\x91\x1e\x2b\x61\xb2\x19\x6d\x25\x67\xb4\x19\xa1\x98\xdd\x54\xb6\xaa\xc1\x36\x51\x1e\xd6\xc2\x9d\x86\x83\x0a\x19\xd9\x08\x1e\x07\xed\x87\xaf\x00\xf2\x6a\x9c\x6c\xb4\x5e\x1f\xe7\xa6\x1f\xa8\x00\x92\x09\xf0\x48\xe4\x56\xbe\xfe\x1c\x1e\x9b\x83\xe6\xfc\xed\x95\x5b\x95\xf0\x58\xec\x6f\x83\xd8\xb0\x13\xac\x43\xd3\x37\x30\x89\xf8\x98\x41\x79\x35\x98\xc7\x76\x12\xff\x3d\xfc\xb0\xa6\x95\xe0\xb7\x1e\xde\x3e\x12\xa4\x33\xdc\xfe\x9a\x4c\x7e\xa1\x51\x7c\xf2\xd1\x5e\xf5\x66\x23\x88\x87\xc7\x1b\x14\xf9\x2e\x86\x9b\x05\x8a\x43\xb9\x85\x37\x0c\x41\x7d\x7d\xe7\xe3\x55\x5c\xb3\x75\x3e\xce\xaf\x05\xcd\xb6\xaa\xd9\xad\x88\x75\x71\x89\xb8\x94\x4a\xbf\xc3\xfb\x0b\xf7\x64\x8d\x1d\x50\x5a\xd3\xd5\x97\x46\x7e\x4d\x76\x24\xd7\xd2\xee\x7e\x0b\x4f\xd0\x25\xe2\x89\xc2\xe3\x5d\x43\x67\x0f\x2c\x82\x5e\x9b\x2d\xfb\x32\xcc\x5b\x96\xe1\xe1\x18\xd2\xa4\xdb\x86\x63\xd4\x36\x13\x76\xdc\xa6\x57\x29\xcd\xac\x80\xfe\x55\xd3\x0e\x87\x75\x0c\xfc\x92\xa1\x2a\x75\xa4\x82\x9f\xbe\xa3\x98\x8f\xa1\xff\x6b\x17\x2c\x97\x5b\xe7\x89\xe6\xa4\x3b\x20\xbd\x57\x6e\x17\x00\xc4\x23\x89\xba\x0f\xe4\xa6\xe5\xa1\xa2\x3a\x75\xc8\xcb\xe0\x19\x33\xae\xc7\x5d\x33\x8e\xb6\xb0\x8d\x12\x5b\x2d\xd8\x1a\x10\xbd\xff\x7b\x81\x8c\xbc\xd9\xb2\x6a\x10\xfa\x1e\x38\x4b\xa7\x63\x1a\x9e\x9d\x6e\xab\xce\x17\x84\xb2\xc5\xd9\x6d\x7e\x3f\x1a\x81\xb2\x87\x5f\xff\x90\x0b\xe3\x7e\x34\xe2\x2f\xbb\x30\x1e\x35\x53\xfd\xb2\x15\xf3\xc1\xe0\x85\xa1\xfe\x3b\x8a\x62\xe8\x32\x06\xe1\x0c\xbf\xd2\x72\x76\xa8\x9e\x8d\xe1\x1d\x89\x09\x27\xe1\x77\x5f\x90\xab\x39\x2e\x21\xe7\x9d\xd6\xb8\x0b\x63\xbd\xd8\xcb\xe3\x34\x1c\x8f\x6c\x57\x23\xaf\x53\xc5\x1e\xd7\xf4\x6f\x19\x87\xba\x8f\x5e\x84\xbd\xb0\xeb\x92\x75\x7c\xd7\x08\x7c\xac\xb9\x3b\x0c\x50\x42\x1a\xd4\xd7\x8f\x0c\x23\x50\x88\x81\xce\x1d\x45\xc2\x19\x91\xf7\x9a\x7a\x51\x06\x8f\x1b\xae\xf3\xde\xae\x23\xba\x1f\xfb\x38\x0c\x48\x11\x9b\x97\xf4\xc2\x51\x1c\x30\x11\xf8\x42\x5c\x8a\x7e\x97\x41\x69\xd4\x4a\x2a\x0c\x8b\x8b\x41\x36\xf9\xe8\x20\x1d\x6d\x3a\xed\x4d\xc7\x97\x42\x55\x1c\x39\x15\xef\x50\x82\x0c\x6e\x7c\x5e\xb0\x16\xbf\x77\x53\xcc\x77\xa7\xe2\x1c\x25\xd0\xca\x46\xee\x83\xfd\x44\x59\x46\x32\xec\x5b\xa0\x45\xde\x38\x2b\x47\x84\xf1\x11\xda\x3d\xd5\xbf\xeb\x7c\x37\x3f\x14\xa4\x22\x0a\x6e\xfc\xad\x2b\x29\x6c\x8e\x0b\xea\xda\x4b\xb7\x04\x73\x2b\xde\xb4\x72\x12\xf1\x1c\x00\x82\x56\xe0\x79\xf5\x58\x6a\x54\xae\xea\xd7\x2d\x7f\xe7\x78\x24\x3b\xfb\x50\x49\xe8\x08\xea\x9d\xef\x54\xcf\xad\x45\x5c\x6e\xf6\x26\xcf\x5c\x92\xd8\x3a\x44\x36\x1b\x36\x8b\xd8\x00\xc9\xc1\xfd\x8b\x4b\xd5\x03\x52\x2e\x89\xf1\xbe\x92\xf9\x67\xb6\x1d\xa0\xe5\x52\xc9\xe4\xdb\x3e\x78\x89\x60\xc3\x5d\x78\x8e\xca\x41\x3a\x85\xe7\x0c\x74\x48\x97\x44\x53\x5d\xd3\x2d\xb7\x2d\x89\xe0\x7a\xac\x2b\x5a\x84\x51\x50\xdd\xc5\x30\xd7\xb9\x8d\xb7\x47\x8c\xbc\x6a\x70\x31\xc0\x99\x54\xf4\x5d\xa7\x2f\xcc\x46\x1e\xe9\x8b\x41\x81\x04\xd3\x98\x6a\xe5\x91\x1b\x5c\xfb\x66\x29\x6e\x3f\x04\xf9\x6f\x77\x80\xd5\xdb\xce\xb7\xb4\x0d\x94\xa8\x77\x8f\xd2\x1e\x3f\x7d\xb1\x5d\x7a\xe6\xa2\x9a\xc4\x9d\x0a\x81\xbe\xd4\x29\x6e\xf3\xff\x92\x67\xbe\xe3\x4d\x27\x62\x7d\x51\xf6\x8d\x8a\x58\xe1\xe7\x5f\x1c\xdb\x1e\x5a\xa7\xe6\xae\x41\xb1\x8e\x5e\x0d\x7c\x9c\x0b\xf8\xf8\x71\x2b\x79\x8c\xcf\xcd\x80\xb1\x78\xe1\x2c\x43\xef\x8c\x52\xf5\x15\x34\xc3\x57\x61\x81\x7d\xa0\x18\xd5\xa9\x06\x86\x7e\xfa\x0c\x3e\x3a\xbe\xa4\xa3\x96\x17\x04\x87\x96\x08\x43\x28\x19\x5f\x79\x80\x0b\xb0\xf5\xd6\x0c\xfe\xb0\x77\xfe\x20\xcd\x2d\x6e\xc6\x20\xd6\x96\xc7\x86\xcb\xe2\xa6\xf3\xcc\xb3\x93\x83\x4a\x95\xe4\x73\x27\x43\x49\x68\x08\x18\x2f\x60\x10\xbf\x34\x0c\x41\x74\x6a\x64\xa8\x51\x28\x7f\x7b\xb1\x12\x2e\xc4\x60\x01\xb8\x04\x3f\x23\xd1\xae\x14\x7c\x6f\x36\x22\x35\x0d\xbb\x16\xba\xf4\xbf\x65\x4c\x15\x9c\x1e\x33\x15\x99\x86\x44\xa2\x8f\x45\x3d\xfc\xb4\x08\x00\x12\xe3\xd7\xdc\x5a\x5a\x7f\xab\x43\xd5\x77\x99\xd1\x60\x0a\xbe\xf3\x33\xe5\x28\xf1\xf8\xca\x56\x95\xb8\xfc\x83\x0d\xf7\xe8\xc6\x01\xa2\xf1\x95\x5d\x71\x44\xe5\x1f\x9d\x86\x43\xbd\x49\x22\x43\xb2\x20\xda\xaa\x5f\xa6\x40\x7a\x02\x96\x46\x12\x94\x25\x17\x6c\x65\xc7\x32\x5d\x68\x65\x17\x18\x92\xf2\x8b\x26\x56\xaa\xf4\x36\x8c\xbf\x32\x0a\x37\x4d\x2f\x00\x42\xb8\x77\xd4\x22\x90\x9f\x7d\x78\xe7\x46\xbe\xd6\x92\xd6\x1b\xd2\x38\x2e\xcb\xec\xdb\x10\xd6\x6c\xac\xc4\x78\x41\x6d\xbf\x34\xaa\x41\x1b\xd3\xcb\x28\xe2\xc6\xb7\xe2\x05\x27\x70\x5a\xa0\x91\xf0\x79\xe9\x3e\x4d\xb2\xb4\x59\x2f\xaa\xb4\xce\x66\xa7\xf6\xd7\x04\x97\xf7\x4d\x70\x73\x3f\x11\xc2\x74\xab\xf1\xeb\x89\x73\xae\x7d\xb8\xfa\x68\x6e\x3f\x84\xf3\x0a\x7f\xb1\xf0\xf3\xa7\x32\x08\xfc\xc6\xea\x17\xc4\x56\x70\x99\xec\x9b\x83\xfe\x74\x7c\x15\x37\x51\x83\xe0\xd9\x39\x1e\xbb\x19\x96\x5f\x37\x15\xa2\xe5\x09\xe9\xde\x56\x25\xaa\xc6\x95\xbf\x3c\xbb\x9b\x04\x6f\x8f\x5f\xb0\x55\x8e\xc4\xbe\xe4\x04\x0d\xb4\x33\x21\x3a\x91\x16\xb3\x0b\xfa\x37\x2d\xbe\x4d\x1e\x64\x13\x3f\x64\x56\x8c\xc3\x19\x34\xec\xb4\xe4\x17\xbb\xc0\xf5\x00\x6a\xf1\x8e\x51\x3f\xb3\x36\xd5\x11\x80\xbc\xcb\x63\xa5\x7e\xc7\x91\x7a\xe8\x4f\xa2\xfd\xd7\xfe\x8e\xb5\x27\x4f\x88\xd9\x6e\x10\x37\x0a\xec\xc1\x47\x37\xcb\x82\xb5\xb4\x8b\xa7\x81\xae\xf3\x28\x48\x0d\xce\x88\x38\x9d\x79\xba\xda\xc7\xb6\x0d\x33\xc3\x35\x0a\xd3\xaf\x25\xd8\x50\x98\x04\x6b\x22\x0e\x68\xe7\x93\xc4\x76\x29\x4c\x09\x7c\x4d\xc5\xa0\xf2\x46\x2f\x6e\x7a\x58\xbc\x17\x7f\x33\xae\x62\xa4\x4f\xf2\x02\x28\xee\x81\x8f\x70\x11\x26\x17\x15\xe1\x0a\xdf\xed\x94\x71\xad\x2a\x01\xf4\xaa\x75\x7e\x0f\x82\x1a\xd8\x9f\x59\x98\x22\x92\x03\x36\x6f\x98\xca\x7b\x35\x4c\xf0\x22\xae\x19\x42\x53\x26\xbb\x2d\x98\x8e\xe1\x96\x08\xf7\x0e\xbf\x44\xb8\x1f\x83\x6b\xf6\x39\xe2\xc0\xb0\x6a\x46\x23\xe0\x8f\x81\xd5\x5d\x39\xfb\x68\x7d\xa1\x04\x10\xb0\x99\x80\x7b\x15\x8e\x4b\x5a\x71\x2c\xa5\xe7\x48\x4a\x28\x89\xd6\x21\x4b\xde\xd3\x16\x5d\x37\x77\x96\x70\xa7\x24\xbb\x13\xe5\x02\x08\x17\x85\x17\x39\xde\x3c\x3a\x3c\x27\x7d\x65\x7a\xd6\xe6\x25\x1b\x35\xa4\x5e\xb4\x0c\x7d\x31\xeb\xd3\x04\xc6\x99\xeb\x20\xc6\xeb\xd7\x54\x13\xf7\x4d\x01\x7c\x7c\xbc\x1a\x7b\x5b\xf8\xa3\xaf\xe9\x27\x1f\x04\x38\x12\xa8\x8e\x66\x60\xbe\x3a\xe4\x3c\x18\x54\x6e\xaf\xee\xac\x2a\xee\xe5\x78\x15\x5f\xd5\x41\x3e\x72\xcb\x95\x1c\x3e\xfd\x29\x8c\xea\xbd\x15\x8b\x44\x68\x93\xf9\x62\xeb\x0b\x75\xdd\xd1\xc3\x7e\x4d\x07\x7a\xb8\xca\xdb\xf9\x6a\xa9\x3d\x7b\x99\xd6\x0b\x3c\xf3\x86\xf5\xb9\xb1\x5e\xa7\x06\xc8\x19\x16\xf1\xac\xd8\xa0\x68\x70\xd5\x4b\xb5\xf0\x65\x78\xdc\x74\x6d\xf8\x49\x3a\x1c\xdf\x36\xcd\x9a\xad\x0b\x5e\x11\x39\x51\x11\xeb\xe1\x94\x12\x9f\x88\x23\x73\x98\x0b\xb1\xf9\xc1\xc3\xe4\xd1\x1b\xbc\x14\xdc\x7d\x3b\x12\x1d\xbc\xb4\x21\xd2\x98\x58\xb3\xa0\xa5\x8c\xa8\x7d\x4b\x05\xbd\x65\x79\xef\xf1\x9d\x7d\x88\xa7\xb4\x1f\x4f\x5b\xeb\x5d\x4b\x3f\xc5\xc2\x76\xb4\xb6\xc0\x3c\x27\x1a\x56\x7f\xc9\xc5\x3d\x40\xf2\x48\xec\xc4\xd4\x48\x63\x19\x1c\xb5\xf6\xc6\xb7\x11\x0d\xa1\x11\xe5\xa7\x6a\xb8\x0e\x0c\x25\x6c\xfc\x20\x8a\x68\xcb\x77\x8f\x07\xe1\x09\x7b\xe8\xfb\x15\xa8\xa6\x01\x9b\x92\xdc\xc5\x35\x8c\x31\x68\xac\xde\xdf\x83\xca\x3d\x85\x9f\x6d\x6e\x65\x6c\x83\xb7\xa2\x16\x0e\xcf\x73\xf6\x19\x46\x33\xd3\xe6\x5b\x84\x3f\xc1\x9f\x44\x12\x43\x2a\xda\xe1\x44\x25\xf4\xae\xea\xaa\x23\x69\xcd\xcc\x5e\xe1\x31\xf4\x0a\x61\x95\x35\xa5\x19\x01\xe7\xfb\x88\x9b\x79\xc7\x7e\x4d\x6c\x89\x15\xf1\xd0\x5d\x10\x2f\x3b\x28\xc7\x8c\x8e\x2d\x05\x2d\xf5\x92\xef\x25\x84\xf3\x09\xbc\x38\xbb\x3a\x82\xb2\x5a\xaa\x5a\xb4\x29\xbb\xa5\x78\xd9\x6b\xa6\x0d\x60\x77\x15\xbf\xad\x9f\x17\xb4\xd2\xdd\x6e\x8e\x31\x37\xf0\xfb\xcc\x77\x83\x75\xf2\x86\x93\x93\x8d\x89\xe6\xa0\xd7\x2d\x2d\xe5\x9a\xa1\xde\xe9\xd5\xe2\x78\xb9\xcb\xda\x0c\xca\xb0\xfd\x56\xd3\x2f\x60\x67\x6f\x6d\xd2\x5d\x6f\xee\x5e\x51\xd2\xc8\xbc\x31\x64\x7f\x02\x00\x7b\xec\x26\xfb\x1a\x11\xaf\x4d\x3c\x65\x61\xb1\x3c\x2b\x0c\x17\x49\xde\x72\x82\x3d\xc1\x2e\x0f\xc1\xb3\xf1\xd1\xec\x55\x55\xed\xfc\x8a\xbe\x1e\x5b\xd4\xb0\x94\x5e\xa4\x0d\x3a\xc7\xb1\xb8\x57\xbd\xa3\x87\x0b\x56\x0b\xf8\xf3\x69\xa4\x80\x7c\x44\x40\x8b\xaa\x22\x1e\xb9\x26\x48\xa2\x06\x6c\xb5\xcb\x91\x1c\x6c\x2a\x6c\x53\x96\x9b\x91\x5e\x09\x74\x7f\xce\x08\x7a\xc7\x3e\xd7\xef\x98\xb5\x2d\x22\x28\x52\x6b\x75\xb7\x84\x71\x77\xa3\x4d\xbe\x3d\x47\xdc\x45\x97\x3c\x36\x13\x83\x92\xae\xdd\x41\xe1\xd1\x86\x97\xe9\x72\x6d\x46\x5a\x7e\x8e\xf4\x2f\x34\x3d\x28\xeb\xdb\x1e\x14\x1f\x6b\x9c\xe4\x34\xa2\x31\xa0\x4a\x8b\x0e\xef\x26\xf1\xf0\x7f\x3d\x67\x3b\x0e\x5f\xd5\x19\x03\x09\xbf\x42\xc2\x03\x82\xd5\x11\x54\xcb\xe6\xae\x63\x95\xd2\x69\x49\xa7\x61\xca\x16\x49\x7e\xe3\x3e\x27\x14\x44\x62\x96\x8e\x16\xaa\x88\x5f\x83\xd7\x16\x96\x5a\x74\x37\x82\x67\x74\x15\x9c\xc8\xbb\xf1\x46\x45\x30\xdd\x98\xb9\x98\x74\x0d\xaa\x83\xb7\x6f\x39\xb6\x97\x37\x4b\x7e\x1a\xad\x4f\xa2\xa9\x1f\x9a\x16\x40\xb3\x70\x46\xd0\x4c\x2d\xcf\xd9\xd6\xe4\x9a\x9d\x87\x03\x5c\xa5\x79\x28\xb3\x5a\xe2\x28\x06\x84\xcd\x96\x53\x7a\xf6\x75\x25\x76\x30\xeb\xf9\xaa\x22\xb6\x6f\x52\xc2\x46\x69\xbd\xb3\x88\xf6\xa8\x99\x45\x50\x50\x45\xb3\x00\x2d\xcf\xe3\x34\xae\x3f\x61\x28\x87\x25\x71\xe6\x2b\x36\x7e\xbf\x80\xe2\xf6\xd6\x5e\xb4\xc8\x05\xae\x8d\xd7\xed\x14\x07\x0a\x68\x03\x6e\xeb\xb7\x65\x82\x41\xb2\x9d\xb1\xb0\xcd\x0b\x9c\x19\x49\x8a\x9c\xb5\x2c\xa4\x6b\x8a\xba\xef\x0f\xfc\xf6\x6b\x06\x5b\xb1\xd3\x72\x43\x09\x21\xef\xf1\x2f\x6f\xf4\x35\x13\x7f\x88\xf0\x25\x06\x1e\x02\x56\xdb\xab\x50\xef\x06\xa5\x0e\x86\x17\x59\x3b\xba\xe1\xb9\xb8\x4c\xae\xfd\xa9\x96\x89\xbd\x42\xeb\x88\x58\x02\x11\x4b\xbe\x93\x40\xbb\x60\xd8\x9a\x4f\x60\x38\x2c\xe9\xec\x0d\x07\x22\x0d\x8b\xb1\x68\x28\xa2\x56\x54\xf4\x98\x33\x4a\x3f\xa5\xb0\x8a\x82\x52\xd2\xea\xb7\xd9\x04\x9f\x1f\xcd\xc0\x2b\x43\xe9\xd8\x24\xd6\xb1\x17\xf9\x15\xb3\x37\xba\xe2\xc2\x22\xc9\x76\xf7\x6e\xfe\x78\x67\x9b\x22\x56\x26\x86\x57\xa2\x7e\xc4\xc1\x75\x1b\x5b\x68\xdb\x10\xf5\x02\xb1\x4d\x3f\x6b\xcc\x4d\x1b\xe6\xf7\x2d\x82\xfa\x76\xdb\x63\x1b\xcb\x97\x9f\xb9\x28\xca\xc4\x31\xd9\xa1\x74\x39\x50\x8b\x68\xed\x1e\xfd\x85\x99\xe0\xe4\xf8\x1b\x7d\x9a\xb6\x2a\xaa\x05\xc4\x74\xad\xbb\xf5\x0f\x64\xcb\xc7\x5a\x15\x42\x6e\x39\x0c\x0c\xc3\xcc\x33\x3f\xd9\x47\x48\x9a\x97\x75\xbe\xa0\x41\xf2\x94\x4b\xb4\xc8\xa0\x80\xcd\xb6\x41\x45\x56\x0e\x6f\xd1\x0c\x23\x73\xd8\x84\xe8\x4b\xbc\xf3\x0a\x55\x25\xda\x35\xc7\x35\x3d\x5e\x1d\x31\xc3\x6a\xef\x50\xa5\xe4\xc2\x9a\x27\xb1\xe2\x7d\x8b\x37\x72\xce\x03\xa1\x75\x65\xe9\x67\xd0\x3d\x19\x8b\x6a\x96\xc8\xb8\x12\x04\x37\xea\xd6\x36\x5d\x8d\x46\xd3\xf5\xa1\x74\x47\x91\xc5\x05\xf3\xdf\x29\xb2\x78\x1d\xbe\x80\xf7\xae\x63\xc3\x26\x43\x95\xbb\xee\xde\x36\x27\x8e\xbd\xda\x97\xaa\x3d\x8c\x57\x06\x76\xd6\x20\xef\x44\x7f\x8d\x7d\x44\x6e\xe3\xa9\x47\x26\xba\x1f\xc7\x82\x46\xe6\x56\x91\x18\xda\xf8\x56\x97\x81\xc3\x92\x69\xd4\x0b\x38\xb9\x81\x25\x4d\xb4\x04\x41\x17\xc2\x6b\x50\x79\x62\xe7\x55\x5c\x47\xec\x8c\x0e\xa6\xe1\x20\x2b\x72\xd5\xcf\x21\x84\xcb\x61\x1f\xa6\xe1\x44\x85\x76\x50\xaf\x4c\x34\xfa\xc8\x44\x98\xda\x92\xd7\xd2\x11\x9d\x0e\x6c\x03\x3c\xa5\x66\x50\x4f\x7f\xf9\x33\x34\xde\xe1\x04\x7b\x5f\xf3\x86\xaf\x6a\x44\x39\xca\x64\x37\x6e\x20\xd0\x93\x0a\x02\x23\xd9\x14\x0a\xdf\xbb\x6d\x95\x44\xdf\xb2\x7c\xc7\xd7\xbd\x92\x26\x51\xc4\x7d\x10\x71\x49\x45\x60\xb8\x86\x43\x04\xd7\x6a\xb4\x64\x9d\x69\xf9\x10\xb4\xac\xac\x55\x4a\x19\xf5\x34\xa6\x95\xd2\xd9\x44\x7b\x2b\x65\x02\x87\xb7\x20\xc3\xc1\x73\x6c\xcd\x77\x1d\x97\x6f\x1f\xb0\x46\xbe\x0d\xfb\xf2\xca\x66\xaf\x4b\x36\x1b\x84\x62\x2b\xd3\x2c\x6b\x5b\xf5\xcc\x07\x55\x09\xfa\xc9\x15\x45\xfd\x6b\x7d\xad\x0c\x31\xa4\xf6\xa5\xef\x47\x63\x48\x56\xc8\xdb\x1b\xec\xc0\xb6\x5a\x56\xc5\xec\x5c\x53\x92\x33\x4d\x51\x48\x7d\xd5\x71\x2a\xef\x39\x24\x6d\x5d\x35\x2d\x31\xf0\x8d\xed\x11\x36\xf7\xec\x8c\xa8\x87\x4d\x60\x9d\x59\x56\x52\xdf\xf9\xe5\xde\xe9\xbb\x30\xdd\x9e\x31\x9c\x2b\xaf\x74\xe5\x51\xec\x08\x8c\x3d\x87\xde\xef\x56\xc0\xec\x6f\xd9\xd1\x92\x2f\xa2\x6f\x85\xbc\x6b\x54\x96\xf7\xf1\x76\x83\xd5\xc1\x1c\xb7\x16\x5e\x4b\xc4\x0f\x2c\x5f\x96\x3a\x52\x25\xa6\xfe\x44\x20\x57\xec\x43\x4b\x9e\x7a\xd8\xb9\x07\xf7\xc2\xbe\xf0\x3f\xd2\xaf\xe4\x9c\xaf\x47\x92\x67\x30\x62\x0e\x00\x68\x80\x9c\xed\x86\x97\xb6\x6d\x9d\x2f\xba\xd6\x1c\x7a\x02\x98\x28\x44\xd7\x1e\x2c\x11\xdd\xbf\x44\xc7\x2f\x87\x6f\x66\x1d\xef\x35\x02\xa3\xda\xdb\x3e\x58\x6a\x75\x45\x2e\xfe\x58\xbc\xf3\x30\x4c\x44\xec\x38\x6c\x3a\x68\x53\x0d\xab\xaa\xfa\x0b\x7d\x6b\x3a\x19\xcc\x09\x26\xe9\x4b\xc0\x84\x2e\xc5\xec\xc5\x31\xfe\x1c\x86\x6a\x20\x06\x62\xa5\xa1\xbb\xdb\x40\x88\x4b\x7c\x9e\x7d\x37\xc6\xf8\x71\xfa\x4e\xe2\x3f\x7e\xb6\x75\x88\xf3\xd4\x60\x62\x25\xc1\xb6\xc0\x97\x72\x0a\xe3\x2f\xdd\x22\x98\x2d\x4e\xd4\x79\x93\x92\xf0\x94\x9c\x64\xc9\xf9\x89\xdd\x14\xdb\x76\x27\x61\xf6\xcf\xdf\x5e\x9c\x1d\xa7\x07\x76\x17\xc0\x78\x07\x00\x2a\x59\xfb\x6d\x80\x0c\xde\x0a\x9c\xb1\x0b\xf6\x83\x75\x45\x21\x9b\xa9\x91\x80\x74\x05\x07\x41\x90\x87\x52\x8e\x60\xf4\x20\x23\x3e\x8c\xfd\xf3\x2a\x32\x30\x2e\xcb\x53\x25\xa9\x41\xac\x1e\x76\x72\x43\xc9\x0f\x69\x59\x96\xb1\xd5\x5b\xcb\x40\xb6\xfb\x41\xd9\x0d\x22\x97\x27\x8f\x1e\x1e\x3d\x7c\x2c\x26\xcb\xf0\x7f\xee\x8d\x79\x42\xf2\x34\x6f\x8b\x86\xdf\xfe\x81\x9f\x49\x2e\xde\x9c\x1f\x9b\x72\x59\xdf\xc0\x54\xcf\x8e\x7c\x93\xef\x00\x35\x87\xca\x99\x78\x65\xc0\xf0\x4f\xe5\x94\x71\x3c\x8a\x69\xb2\x12\x0c\x5c\x39\x9b\xfa\x1a\x6e\x5a\x19\xb3\xce\x4e\xde\x26\x9a\x10\x50\x29\x6d\x9e\x9d\xb6\x5b\x76\xdc\x77\x24\x70\x2d\x6f\x42\x36\xdc\x92\xda\x7c\x47\x13\x4d\xff\xd8\xca\xc0\x53\xff\xe4\x3b\x15\x58\xbc\x79\x9b\x68\x5d\x04\xcf\xd6\xf1\xb9\xdd\xe1\xb0\xe2\x13\x91\xa8\xc6\xba\xca\x4c\x9f\xc5\x73\x87\x41\xff\x5d\x53\x84\x43\xc1\xb3\xa6\xf0\x51\x57\x48\xee\xbd\xce\x2e\x2a\xf8\x95\xc6\x79\x61\x4d\xbd\xc3\x2b\x1f\x37\x91\x50\x1a\x6f\x03\x15\xdf\xf6\x7a\xcc\x7a\xa9\x88\xc5\x0a\x0b\xcc\xe5\x24\x62\xf3\x87\xb8\xbf\x9e\xcd\x18\x29\xe0\x0d\xde\xe2\xd9\xb9\x0d\x7d\x57\x5b\x1b\x26\x36\x74\x4b\xae\xb8\xca\xcc\xa8\xfd\x82\x22\x1d\x73\x58\xb9\xbe\x65\x13\x86\x3a\xba\x75\x65\x99\x03\x40\x08\x29\x98\x25\x8b\x9b\x04\x96\xc8\x09\x73\x4a\xce\x1b\xab\x86\xb8\xf2\xbe\xfe\x10\xad\xb0\x51\x28\xf0\xe2\x69\xc9\x7a\x03\x25\xbd\x1c\xdb\x9a\xaf\x5e\xa7\xe1\xd0\x42\x96\xeb\x24\xee\xc4\x17\x02\x70\xeb\x65\xb0\x55\xa7\xea\xd5\xf0\x39\x7f\x85\x5a\x6b\x0b\x97\xee\x76\x7a\xb4\xef\x76\x45\x70\xae\x07\xd9\xd7\xd8\x25\x2e\x57\xdf\x36\x04\xf9\x78\x73\xee\xf3\xd9\xa3\xa9\xe6\xc6\x87\xbd\x26\x56\x97\x97\x84\x37\x06\x11\x87\xd8\x1d\x2d\x3e\x8e\xe9\xa3\x6b\x5c\x31\xda\x1c\xd8\xa8\x50\xe8\xb2\x72\x74\x35\xfb\xc0\x3f\x21\x5f\x46\x0e\x16\x6c\x89\xba\xe3\x65\xab\xfd\x5d\x5d\xe8\xe7\x32\x84\xe2\x56\x15\x2a\x89\x5a\x65\xce\xb2\xae\x2a\xdc\x79\xb7\xeb\xc8\x5f\xd5\x82\x7d\x00\xef\xd2\xcc\xcd\x2e\x2e\x9f\x97\xfc\x16\x2a\x28\x22\x17\xdf\xcb\x75\xf0\x08\x6c\x58\x94\x86\xd0\x2f\xf7\x86\x23\x67\xc8\xc3\xad\x61\x53\x1c\xac\x5b\x18\xb4\x73\xfe\x2d\xbe\x03\x5c\xaf\xb1\x20\xba\x15\x78\x0a\xde\x6f\x57\x66\xe3\xe2\x1d\x3a\x9a\xe9\x67\xc3\xd5\xdc\xac\x1d\x7e\x9c\xbf\x3a\x1e\xc3\x0e\x80\x8c\xf2\x94\x41\x3e\xc7\x4a\x9e\xab\x23\xd8\xb9\xe0\x1d\x03\x2f\xaa\x6e\x9f\x59\x1d\xbe\x86\x54\x2e\xc3\x92\xa3\xe8\x81\x8c\x80\x01\x0c\x52\x0b\x36\xe2\x90\xcc\x37\x1d\x53\x6f\xc8\xd8\xbb\x3e\x5c\xb0\x86\xf4\xeb\x38\x9c\x4b\xca\xc5\x4b\x48\xf6\x02\xc3\x10\x67\x69\x26\x72\x2a\x25\x1f\x23\xb9\xe9\xc1\xae\xd0\xa2\x83\x4c\xa1\x54\xbf\x61\x07\x15\x0f\x09\xe0\x58\x3e\x1e\x3e\x0e\x0b\x11\xc3\x00\x35\x82\x3c\x4b\xcd\x6f\x8d\x04\x4f\x71\x91\x53\x38\x68\x2d\x41\x40\xa8\x45\xa3\x84\xc5\xab\xd6\xdc\x55\x01\x1c\x41\x0f\x0a\x34\x6e\x19\xb3\x85\x5d\xc5\x53\x35\x7f\x18\x5b\x49\x82\xf2\xc2\x82\x4f\xf3\xac\xb7\x4f\xf3\x42\x86\x4f\x63\xcc\x7a\xd9\xdf\x50\x94\xd1\x34\x85\xec\xa9\xf3\xf3\x37\xf1\x7e\x0a\x32\x2d\xdb\xf1\x28\x15\x2f\x10\x3c\xe3\xf7\x11\x13\x0e\xae\xac\xef\x3f\x0e\x8a\xd8\xb9\xee\x25\xb9\x1a\xa4\x68\xf3\xd7\x22\x6f\xcd\x9f\xee\xc3\x5a\xe9\x7e\x9b\x67\x0b\xaa\x23\xa4\x7c\x39\xbf\xaf\x73\xa4\x8f\x3e\xc7\xe6\xc4\xa9\xe4\x0c\xb8\x4b\xe7\xb4\x54\x98\x4d\xeb\x67\x12\xe7\xb9\x72\x03\x7c\x62\xf5\x69\x94\xe5\x23\x3e\x04\x8a\x3b\xbe\x4e\x1d\xec\x15\xbc\x33\xf5\x7c\x05\x51\x78\xf5\x40\xff\x41\xab\x00\x17\x55\x12\x42\xfb\xb7\x9b\xae\x9f\x12\xea\xce\x86\xbe\xe3\xe7\x6a\xaf\x4b\xa2\x24\x7a\x35\x60\xe0\x43\x52\x1e\x06\xaa\xd1\x57\x5e\xde\xe6\xbe\x02\x1e\x9e\xea\x1d\x65\x74\x81\xde\x71\x40\x76\x0f\x20\x2e\xf6\x9a\xc7\xbf\x51\x32\xac\x0c\xd6\x32\xdd\x91\xec\x9c\xce\x9e\x9f\x9c\x5d\x3c\x7f\x75\x02\x76\xa3\x0f\xa9\xae\x1e\xf0\xf4\x71\x5e\xb0\x55\xc0\x89\x9a\x29\x3c\x07\x3f\x54\xc4\xc3\x6f\x4c\xeb\x45\xb8\xa0\xcc\x07\xe4\x84\xf2\x5b\x50\xd8\x96\xb6\x8e\x70\x14\x1d\xac\x4b\x85\x31\x7c\xf8\x6b\x67\x3a\xaa\x1a\xe3\x23\xa2\x2c\xc3\xc4\x96\xb7\x9e\x9f\xdc\x44\x89\xcb\x05\xd6\x58\xd3\xb9\xc4\xfe\xb9\xd9\xdf\x82\xdc\x63\xe3\xf1\xc9\x95\x5f\xf6\x21\x2f\x9b\x2c\x89\x2f\xe0\xe9\x27\x2e\x7c\xe9\xa6\xd7\x31\xb5\xe1\xb2\xf9\x33\xfc\x2d\x7f\x69\xbf\xc3\x6e\x2b\xd8\x5d\x74\x5a\x41\xec\x0a\xd3\x66\xaa\x9c\xab\xe6\x57\x2f\xde\xbc\x67\xe7\xa2\x31\xec\x80\x0a\x68\xfa\x80\x62\x68\xfa\x38\x85\x60\xd5\x37\x93\x5b\x96\xe3\xe0\xf5\xcb\xfa\xec\xa2\xe1\xde\xb2\x2b\x4a\x0b\xeb\xc0\xe6\x97\x1c\x0e\x99\x1d\x60\x19\xb1\x86\xb1\x2a\x35\xc0\xb0\x28\xc8\x4a\x2c\x17\xd6\x24\x6f\x8a\x8e\x03\x1c\x5c\x0f\x2b\x83\xef\x26\x71\x37\xc6\xdb\x5c\xd5\x56\xa1\xf3\x74\x54\x33\x75\xb3\x2e\xb6\x39\x3a\xe9\x6c\x95\x33\x7a\x34\x0a\xd8\xe8\xa4\x5b\x10\xb9\xea\xb2\xd6\x79\xf8\x18\xad\x49\xc0\xd2\x8c\x76\x0d\x4d\xa1\xc0\xe9\x57\x0c\xc2\x77\xc5\xd7\x69\xa1\x30\xf6\x73\xd0\x5c\xe9\x1b\x2b\xd9\xd4\x23\xa0\x8d\x62\x5a\xea\x68\x23\x42\xa8\x8d\x1e\xfc\x0a\xb8\xab\xab\xeb\x3c\xe3\x58\xd8\x00\xb5\x9f\x16\xcc\x7e\xdb\x0a\xcf\xf4\x5b\xb7\x97\xeb\x19\xed\xb8\x5c\x45\xb3\xe7\xfc\x3b\x09\x99\x4c\x25\x1b\xd8\xe5\x02\x49\xad\xb5\x89\x02\x8e\x10\x8f\xd5\xd2\x4d\x85\xdc\x63\xbd\x7c\x9e\xd8\x84\x04\x09\xfd\x51\x14\xf9\xa5\xd1\x9b\x32\x1e\x46\x92\x75\x9d\x1b\xc3\xba\x6d\x77\x4d\xe4\xa4\xe8\xd5\xc5\xc5\xd9\x79\xaf\xef\xbe\x0a\xed\x17\xaa\x80\xf8\x7c\xc9\x9b\xdd\x4d\x48\xce\x57\x97\x76\x3e\x7e\xa8\x10\x8e\x7c\x64\x7e\x2d\x9c\x1e\x56\x02\xa8\x1f\x7d\x7a\xbc\xaa\xe5\x4d\xd5\xec\xa5\xfe\xb8\x8b\xf6\x5e\x9a\x0c\xb6\x6b\x88\x0d\x2b\x85\xd4\xbd\xff\x0f\x36\x3d\x39\xe1\x74\xcf\x3f\x40\xaf\xaf\xdd\x85\x7a\x3e\xb0\x22\xad\xca\x10\xc6\x76\x87\x3d\x2f\xac\xf3\xd5\x9a\x7d\xfe\x23\x12\x1f\x37\x20\x0e\x18\x6e\xca\x36\xfd\x9c\xbc\xb2\xb9\x61\x79\x5c\x95\x70\x59\x30\xfc\x0d\x6e\x5b\xa4\xcc\x1b\x7c\x26\x8f\x2e\x71\xdb\x82\x57\xf3\xab\x42\x3c\x0b\x3c\x3e\x58\x18\x7e\x5f\x6a\x3a\x41\xa0\x1c\x76\xd5\x3c\x77\x69\xbd\xba\x50\x62\xbc\x2e\x71\x65\xe0\x6a\xf8\x81\x4d\x57\x1e\xd1\x42\x2c\x8c\x38\x33\x88\x8a\x11\xd6\xa5\xf5\x8a\x6f\x28\x4f\xea\x15\x07\xf5\x69\xa2\x6a\x73\x58\x51\x18\x77\x2a\xbc\xe5\x6f\x88\x6c\x17\x92\x12\x03\x73\xc8\x0f\x0f\xcb\x7e\xd9\x3f\xb2\xa8\x3d\x06\xbf\x84\xd5\xba\x03\x7f\x8e\x2f\x44\x7d\x3f\xdc\x00\x3b\x90\xb2\xf0\xec\x3b\xea\x4e\x70\xbd\x7f\x05\x30\x8d\x6f\x08\x1a\x4a\x2f\x8a\x2c\x24\xb5\x8c\x61\x36\x20\x98\x21\xa4\x7c\x15\xeb\xac\xb5\xf1\x74\x59\x13\xbb\xf3\x9c\xfe\x39\x6e\x25\x52\x98\xa6\xfb\xb3\xc6\xa6\x40\x8a\xca\xba\xc2\xcc\xce\x8a\xb4\x84\xa5\xa1\x87\x8d\x82\x62\xdb\xd4\x7e\x04\x6d\x9b\x6e\x3e\x9b\x65\xe7\x6c\x64\x4e\x52\x42\xcf\x82\xb8\x18\xf0\x5a\xde\xe6\x2d\xa8\xa5\x12\xc7\x28\xf2\x90\x4f\x42\x52\x21\x25\xe8\xeb\xf0\x45\xaf\xeb\x33\x24\x1c\x08\x81\x75\xcb\x34\x61\xac\x0f\x56\xf4\x14\xa2\xa1\x46\xda\xd6\xf2\x59\x03\x0d\x41\xce\x39\x64\xb7\x6d\x4b\xb0\xc7\x0f\xf1\xee\x30\x57\x8f\x0f\xcf\xf8\x8d\x92\x73\x89\xa9\x4e\xb3\x5c\x09\x70\x5c\xb0\xbd\x66\x3e\xcb\x27\x4b\x78\x7c\x98\x2f\x30\xf5\x6b\x12\x8d\x97\x5f\x07\x8d\x65\x66\x00\x65\x93\x22\xb8\xbc\x14\x59\x54\xb2\x38\x4e\x90\x51\x5b\xc3\x6a\xbb\xe9\x55\xc9\x0a\x1c\xad\x24\xf3\x80\xa1\x72\xa8\x07\x8c\xd6\x7b\xa6\x99\x3a\xd8\x00\xd6\x0b\x39\x61\xca\xfc\x1b\x89\xda\xac\x26\xff\xe1\xc8\x7a\x31\xf0\x6c\x4e\xb5\xa3\x12\xd3\x41\x7f\x55\x27\xc3\xab\xb3\x4d\x34\x37\x59\xa7\x1c\xf1\xf1\x80\x52\x86\x5f\x08\xf0\x7c\x7c\xb2\x2f\xcc\xf9\x26\xb1\xf7\xa6\xc1\x7a\x26\x17\x87\x84\xde\xf5\x96\xc4\x5c\x9f\xd0\x84\xb8\xe8\x16\xf2\x3b\x0b\x7d\x8c\x5f\xd6\x08\xff\xad\x51\x54\xbf\xf1\x51\x54\x89\x9a\x05\x01\x66\x7b\x21\xeb\x5d\x00\x70\xaa\x93\x1f\x84\x88\xae\x4f\x43\xb2\xc6\x71\x69\x9b\x7a\x39\x88\x79\x1f\xf7\xd5\x86\x19\xff\x67\x5b\xbb\x8c\x55\xe2\xa6\xff\xaa\x71\xab\x25\x38\x4c\x3c\xc6\x27\x72\x83\xf6\x44\x46\xfb\x87\x20\x50\x79\x18\xeb\xfd\x57\x71\x76\xa7\x35\x7c\x55\xf1\x28\xba\xfb\xaf\xd6\x49\xde\xef\xa9\x41\xc7\x10\xf9\xed\xfb\x55\x0d\x3d\xe2\xc8\xb0\x61\x75\x1a\xc3\xf7\xc0\x70\x7a\x95\xc9\xa8\x7e\x77\x5d\x3a\xb6\xb8\x32\x37\xc4\xdf\xdf\xb5\x28\xca\xfd\xaf\xfa\xd4\x00\x32\xdf\xef\x98\xad\x91\x48\xa5\xbf\x6a\x40\xd5\xdf\xdd\x21\xe7\xa3\x7d\xb0\x57\x88\x44\xa8\xdb\xd1\x28\x76\x70\x2f\xa0\xf0\xc8\x16\x62\x37\x85\x6d\xba\x9a\x51\x87\xba\xbd\xc6\x5b\x8f\x3a\xc3\x48\xee\x42\xd8\x33\x8a\x8f\xec\x05\xce\x0f\xf6\x90\x0d\x69\xcd\xd1\x87\xd9\x1b\xd5\xb5\x0d\x2c\x9d\xdb\xc0\x90\x7c\xef\xff\xc0\x45\x46\x26\x92\xd0\x56\x55\xf1\x69\x92\xae\xaa\x19\xee\x22\xf9\x09\x0e\xed\x61\x7e\x8d\x4b\xd2\x4e\x7a\x99\x94\xdd\x04\x1f\xf4\xe7\x9b\x66\xf6\x8d\x75\x33\x8c\x20\x6e\xdf\x6c\xe9\x1b\xf1\xbd\x3a\x0e\x8e\xf7\xcd\x9a\x3e\xc1\x8e\xe2\x77\x46\xbf\xb3\x74\xc5\xbf\xf7\xf4\x7b\x6f\xcc\x46\xca\x10\x3d\xfe\x06\x2f\x98\xca\x8c\xbf\x6f\xe8\xeb\x0a\x83\x7b\x00\x07\x09\xa8\x9b\x63\x9d\x3b\x6f\xc6\x94\x2c\x21\xc4\x38\x59\x7e\x72\xea\xba\xea\x6a\x4e\xd3\x26\xb3\xf4\x46\xa2\xa4\xf3\x8d\x29\x82\xf5\x51\x93\x9c\xb2\xc7\x33\x01\xae\x88\x84\xdc\xb5\xd4\x93\xa6\xb6\xf6\x1b\x93\x4a\x3d\x57\xfc\x4c\x94\x52\xea\x74\x3f\xb7\x5d\xb1\xfd\xe0\x44\xdb\x11\xed\x05\xcd\x5e\x56\x57\x3b\x84\x02\xfa\x34\xb1\xd1\x0b\x6d\xd8\xc2\x53\xb8\xd3\xf1\x0a\x58\x78\x11\x86\x9d\x03\x82\x60\xa9\x8e\xa4\xdb\xc1\x63\x0a\xae\xa5\x6c\x7c\xd2\xbc\xdc\x75\xaa\x63\xd5\xb7\xfe\x2b\xe7\x9c\xa8\x8c\x5e\x4f\x42\x5f\xef\xcb\xb3\x22\x17\xae\xb1\x16\xc4\x10\xa9\xef\xad\x66\x05\x05\x24\x35\xf3\xe8\x6f\x7f\x63\x0e\x33\xbf\x35\x7f\xff\x7b\xf2\xf6\xd9\x63\x11\xf1\xf9\xac\xc9\x24\x1c\x0f\x2c\x8e\xa0\xd7\x0b\x8a\x50\xda\x0f\x51\x29\x78\x7d\xe1\x17\x6e\x6c\xda\xe2\x0f\x40\xed\xdc\x64\xf2\xbf\x03\x00\x00\xff\xff\xde\xe6\x87\x63\xd4\xdd\x00\x00") - -func confLocaleLocale_nlNlIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_nlNlIni, - "conf/locale/locale_nl-NL.ini", - ) -} - -func confLocaleLocale_nlNlIni() (*asset, error) { - bytes, err := confLocaleLocale_nlNlIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_nl-NL.ini", size: 56788, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_plPlIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\xbd\xdb\x92\x1b\xc7\xb5\x36\x78\x8f\xa7\x28\x72\x07\x43\x52\x44\x0b\x0a\xd9\xff\x1c\x42\x23\xc8\x43\x91\xb2\x24\x8b\xa7\x51\x93\xc1\x19\x2a\x18\x50\xa2\x2a\x1b\x5d\x0d\xa0\x0a\xae\x03\xa1\xc2\x8e\x1d\x31\xa3\x30\xc3\x37\xf3\x00\xa3\xed\x1b\xbf\x83\xaf\xc6\xbf\xaf\x6c\xf6\x8b\xfc\x4f\x32\xeb\x5b\x6b\x65\x56\x66\x55\xa1\x49\x7a\xef\xf9\x75\xa1\x26\x2a\xcf\x99\x2b\x57\xae\xf3\x32\xfb\xfd\x32\xb3\x75\xba\xf8\xd2\x1e\x57\xe5\xd6\xd6\x85\x49\xda\xfa\xfa\xe7\x76\x6d\x92\xaf\xf3\x26\xa1\x9f\x87\xeb\x9f\x4d\x5d\x74\xbb\xa4\xb6\xd5\xc1\x56\x47\x3b\x9b\x5d\x96\x3b\xbb\x38\x6f\xaa\x92\x8a\xd7\xd7\x3f\xff\xe3\x2f\x87\xc2\xcc\x32\x53\x5f\xae\x4a\x53\x65\x8b\x27\xed\x76\x9f\x37\x33\xfb\xd3\x7e\x5b\x56\x76\xf1\x38\xdb\x54\xdd\xc1\x5c\xcd\x2e\xed\x76\xbf\x78\x52\xee\xca\x74\x56\xe7\xeb\x62\x99\x17\x8b\x17\x66\x5b\xae\xdb\xab\xa4\xce\xdf\xfc\x22\x1f\xcb\xb6\x59\x3c\xef\xf8\xab\x7c\x68\xf7\x54\xab\xb2\x57\xb6\x6e\x2a\x57\xb3\xb2\xeb\xbc\x6e\x6c\x35\x2e\x39\xd8\x55\x9d\x37\x6e\x76\xb3\x57\xb6\xaa\xf3\xb2\x58\x3c\xa7\xbf\x57\x66\xb6\x37\x6b\x5f\xd4\xd8\xdd\x7e\x6b\x50\xf5\x68\x56\xdb\xb2\x98\x6d\x4d\xb1\x6e\x51\xe1\x77\x6f\x7e\x39\x76\x9b\x59\x5a\x59\x2a\x5e\x16\xf6\xb0\x78\xd6\x1c\xfe\xf1\x97\xea\x38\x9f\xcf\x67\x2d\x6d\xc3\x72\x5f\x95\x17\xf9\xd6\x2e\x4d\x91\x2d\x77\x58\xe3\x13\xfe\x90\xb4\xd7\x7f\xeb\x9a\x4d\x79\x28\xf2\x8d\x49\xf2\xe4\x40\x33\x4a\xad\xac\xc3\x66\xb4\xde\xa5\xa9\x65\xc9\xe5\xc1\x14\x5d\x72\x65\x36\xe5\x8c\x7b\x2c\x0c\xed\xe8\x23\x73\x3c\x98\xa8\x8f\x99\xdd\x99\x7c\xbb\xf8\xea\x63\xfc\xa1\xd9\xd7\xf5\xa1\xa4\x0d\xfe\xc6\xd0\x11\x95\xb4\x0b\xcb\xa6\xdb\xdb\xc5\xf3\x7d\x5e\x1f\x93\x7d\x59\xa0\x91\x9d\xa5\x66\xdf\xa4\x97\x66\x71\x4f\xfe\xce\xa8\xde\xbe\xa4\x4d\x29\xab\x6e\xf1\x3d\xfd\xf3\xd8\xd1\x3f\xf3\x76\x37\x2b\xab\xb5\x29\xf2\xa3\x69\xb0\x43\x8f\xf5\x47\x4a\xdb\xb4\xcb\xab\xaa\xac\x16\xdf\x95\xfb\xdc\x24\xdb\x96\xb6\xf7\x68\x68\xc7\x68\x27\x96\xe8\x6b\xf1\xa8\x3c\xd8\xa4\x0a\xbb\x42\xd1\x2e\x5f\x57\xd8\x4f\x2a\x35\x09\xff\x40\x5f\x52\xc2\xfd\x71\xc1\x66\xa2\xd3\x8b\xb2\xda\x2c\x7e\x4b\xff\xa3\x53\x1c\x75\x4b\xb3\x94\x96\x65\x38\x43\x6a\xba\xb6\x5c\x46\x20\x70\x7c\xf3\x3a\x3b\x9a\xab\xb0\xc6\x2e\x9f\x99\x6c\x47\x3b\xbe\x37\x85\xdd\x2e\x9e\xe0\xff\x09\x7f\x31\x33\x93\xa6\x65\x5b\x34\xcb\xda\x36\x4d\x5e\xac\xeb\xc5\xb3\xba\x31\x87\xdc\x16\x39\xa6\x57\x34\x66\x36\x51\x32\xeb\xca\xd6\x1f\xfc\xe2\x29\xc1\xc3\x55\x22\xbf\xa4\xc4\x37\x79\x7a\x28\xaf\x2c\x5d\x22\xdf\x90\xc6\x6b\xf2\x57\x79\x93\xdb\x7a\x71\x77\xd3\x74\x87\xa2\xbc\xfe\x53\x9a\xcf\xf6\xed\x76\x4b\xfb\xf9\xfb\x96\xe0\xb7\x5e\x3c\x4e\x8f\x96\xd6\xff\xe6\x75\x6a\x93\xe3\x2e\x27\xf0\x98\xe5\x75\x4d\x65\x80\xad\xd5\xd6\xee\xba\x19\x9d\x6c\x91\xd2\x62\xee\x16\xed\x96\x6e\xc7\xec\x87\xbc\xa0\x51\xb6\xdb\x97\x33\xfd\xc7\xe2\x5b\xfe\xcb\x3b\xd4\xe4\x0d\xcd\xf3\xbb\xaa\xdc\xe4\x49\xae\x9f\xbb\xab\xc2\x26\xd9\xd6\x24\xfb\x9c\xee\x72\x7d\xb4\xeb\x32\x69\xab\x36\xa5\xfb\x2c\x53\xcd\xca\x74\x43\xe0\x8d\x8b\x4a\x97\xeb\x77\xf6\xfa\x4f\xdb\x9c\x01\xf2\x60\x08\xc2\xbe\x2e\xd7\x75\x72\xb0\x87\xe2\xcd\x6b\x3a\xbc\xe4\x3e\x57\x36\x67\xd8\x86\xfa\xf8\xe6\x17\xfa\x7b\xb4\x29\x9d\x1d\x9d\xc4\xe7\x26\x69\x4c\xb5\xb6\xcd\xe2\xf6\x72\x45\x17\x6b\x73\x3b\xb9\xac\xec\xc5\xe2\xf6\x9d\xfa\xf6\x17\x87\xae\xe9\xd2\x63\x61\x3f\xff\xc4\x7c\x71\x96\x10\x14\xe4\x3b\x2c\x99\x66\x40\x83\xa4\xb4\x39\x40\x3b\x8d\xa5\x1b\x8d\x9b\x9a\xdb\x5b\x33\xec\x12\xdd\xea\x65\xb6\x12\x6c\x25\x33\xe9\x76\x86\xd0\xd4\xc3\xee\xfc\x7f\x7b\x70\x96\x3c\x29\xeb\x66\x5d\x59\xfe\x37\xfd\x8f\x6a\xff\x9a\xa0\x6c\x95\x3c\xcd\xef\x7f\x39\x9f\x51\x43\xd9\x90\xe0\xa8\x57\xe6\xd8\x25\x19\x6d\x74\x7a\xc9\xe5\xb8\x4a\x4f\xbb\x7d\xf4\xfd\x92\x7a\x5d\x7c\x43\xff\xe3\x5b\xba\x78\xd6\xdf\xcd\xd1\x6d\xa4\x2e\x82\x5b\x3c\xe8\x5c\x77\xf4\x89\xee\x14\xb6\xf4\xcd\x1f\x09\x63\x6d\x19\x53\x7c\xfb\xe8\xd1\xe3\xfb\x5f\x26\x47\x82\xbe\x0c\x98\x21\xb7\xbb\xa4\x6d\x2e\xfe\xe7\xe5\xda\x16\xb4\xc3\xdb\x65\x9a\xf3\xb1\xf1\x52\xe7\xb3\xba\xde\x12\xd6\xc9\x68\xb6\x55\xb7\x4a\xce\xcf\x1f\xd0\x5c\x9a\xcb\xc5\xf5\xbf\xa7\xb9\xbd\xfe\x1b\x61\x8d\xfa\xf7\x5b\xec\x96\x0e\xea\xbf\x27\x59\x99\xec\xb7\xf9\xa6\x0d\x67\x37\xde\xac\xe4\xf3\x55\xf5\xc5\x60\xa6\x00\x58\xf4\x91\x27\x2b\x7b\x3c\x1c\xd7\xdb\x37\xbf\x64\x05\x9d\xd0\xbe\xcc\xd2\xa3\xa9\x05\x8a\x0c\xc0\x36\x77\x0f\x48\x3e\x9f\xd9\xaa\x5a\x12\x96\x6d\x3a\x1c\x5c\x3c\x47\xcc\xe5\xa6\x59\x24\xb4\x09\xc9\xae\xbc\xfe\x9b\x4d\x56\x98\xc0\x1e\x17\x4a\x7a\xcc\x8b\x57\x66\x9b\x67\x74\xa0\x27\xb7\x7c\xd8\xc5\x11\x67\x5e\x19\xea\xe7\x58\x98\x0d\xbd\x57\xc9\xed\xf9\x6d\x42\xd0\xb7\x3f\xbe\x3d\x9f\x15\xe5\x52\x50\x05\xb0\x79\x96\xd7\xf4\x1a\xd8\xa5\xbc\x30\x95\xe0\xc6\xef\xe5\x8d\xa1\x7b\x95\xfb\x4e\xf1\x32\x76\xd7\x3f\xd3\x7d\x3d\x62\x7e\xb4\x2d\x49\x43\xe0\x70\xec\xb1\x88\xa2\x9b\x70\x1b\x1c\x4a\x8a\x20\x47\xeb\x4d\xad\xd8\xce\x67\x33\x07\x03\x23\xf8\x2d\xd7\xff\xf8\xcb\x96\x2e\x34\x2e\xc3\x0c\x0f\x79\xb0\x17\x06\xe7\x8c\xf9\xfa\x02\x07\x0d\xcf\xe8\xa2\x5d\xff\x89\xfa\x6f\x5a\x5c\x54\xea\x6b\xbb\x79\xf3\x9a\xf6\x82\x1e\x72\xba\x7a\x74\xb7\xe9\xf6\x1d\x0f\x74\xf4\x35\x10\x59\x88\x54\xf3\x5b\xfc\x94\xc8\x49\x7e\x67\x1a\x3c\x64\x01\xbe\xa6\x6d\xed\xcb\xdd\x70\xcf\x93\x86\x48\x87\x8d\x54\x6e\x93\x23\x5d\x25\x83\x31\x8e\x86\x1e\x2d\x42\xca\x09\xa1\xa1\xae\x6e\x36\x79\xf8\xa0\x30\xed\x31\x9f\x55\x2d\xbd\xfe\x83\x6b\x17\xe2\xab\xf2\xd0\xf9\x3a\x7e\x79\x41\xd5\x5d\x5b\xe7\xf4\x10\x59\x5a\x6c\x46\xe3\xbe\xf9\x65\x0f\xa8\xf3\x73\x89\x66\x4e\x1b\x10\xc1\x30\x36\x95\xd0\x46\x49\x0f\x6f\xb1\xb8\x4f\xf4\x0e\x28\x1c\xfe\xe5\x46\x7a\x5a\x26\x87\xfd\xf5\xcf\x1d\x8e\x8d\x4e\xef\xd9\xf7\x0f\x2c\x77\xbf\xc5\x3b\xcc\x7d\xec\x4b\x60\xc4\x23\xdd\xd0\x6f\x70\x69\x2f\x97\xfb\xb2\x6a\x88\x00\xaa\x1a\x7c\xf2\x5f\x5c\x87\x8f\xda\x9d\xad\x12\x7c\x69\xcf\x80\x0b\x1a\x22\x39\x80\xa1\x37\x04\x55\xb4\x45\x86\xbe\x09\x09\x86\xd6\xff\x0b\x55\xe4\xcd\x3c\x08\xa0\x9c\x25\x66\xd5\x45\x10\x79\xd1\x16\x9b\xf4\x8a\xce\x91\x87\xbf\x6c\x9a\x7d\x30\xfe\x37\x4f\x9f\x3e\xe9\xbf\x4d\xcc\x00\x4b\xe2\x19\xd0\xe9\x39\x60\x32\x09\xae\x81\xdb\x4b\x40\x36\x80\xab\xad\xe8\x45\xca\x2a\x5b\x63\x0b\x06\x80\x47\x65\x27\xb6\xcb\xa0\x45\x17\xee\x16\xa6\xf4\x09\xfe\x77\x0e\xca\x89\x00\xd3\xd0\x7e\xf3\x4b\x69\xe8\x42\x5b\x26\x81\xe6\x33\x3a\xb9\x65\x55\x96\xcd\x08\x9d\x10\x7a\xdc\xe2\x46\x1c\xe2\x2a\x6e\x78\x07\xae\x74\x42\x0c\x7a\xad\xd6\xa6\x0b\x56\xee\x71\xc9\x27\x6f\xd8\x3e\xbd\x42\x49\x61\x85\x10\x1b\xd7\x90\x03\x31\x3a\xbd\x59\xbd\xa3\x1d\xe5\x37\xe3\x5c\x4f\xea\x21\xed\x33\x7f\xbd\xa8\xca\x1d\x91\xc2\xfd\x0f\x37\x33\xd9\x3b\x3a\xc6\x72\xdb\x26\xb7\x1f\x67\xb7\xe9\xf0\xd7\x65\x86\x7d\x3a\x26\xdf\xff\xf6\x5e\xf2\x3f\xfc\xfa\x57\xbf\x9a\x27\x0f\x7b\xcc\xd0\x10\x1a\x2f\xf9\xd5\xa5\x73\xe2\x8d\x4c\x78\x7a\x67\xc9\x8a\x08\xa1\xeb\xbf\xfe\xfd\xcf\x46\xfb\x24\xc2\x6a\x67\x68\x8b\x92\xdb\x8c\x16\x6e\x27\x9f\x73\xc5\xff\xd5\xfe\x64\x88\xf8\xb5\xf3\xb4\xdc\x7d\x31\x9f\xe1\x13\xdd\x20\xbe\x6a\x42\x6a\xd2\x09\x65\xe6\x90\x76\xae\x68\x88\xb1\x5c\xb1\xa3\xc3\x97\x69\x59\x5c\xe4\xd5\x6e\xf1\x5c\xe0\x8f\xe6\xd7\x00\xe3\x66\x82\x0e\xab\x1e\x7f\x72\x8f\xcb\xa2\x6c\xf2\x8b\x2e\xa8\x2d\xa7\x2d\x7b\xea\xf6\xd2\x56\x44\xbd\x2f\xf1\x27\x4f\xed\xe9\xad\x07\x79\xc3\x38\x5f\x9e\x9d\x59\x79\x71\xb1\xcd\x0b\x2b\x2f\xa4\x1b\xa1\xc1\x4b\xa9\x25\x51\x0d\x82\xff\x3d\x71\x18\xcf\xf5\xe2\x24\xf7\xee\x3f\x3a\xa3\xe5\x1d\x6c\x43\xdb\x87\x56\xb4\x79\xb4\xd3\x59\xbb\x01\xf5\xd4\xed\xce\x02\x84\x05\x50\xcf\x09\x9c\xea\x72\x05\x0c\xb2\xa2\x37\x91\x30\x1b\x3d\x89\xe6\x00\xcc\xb6\x2d\x37\x04\x3a\x39\xe1\x70\xf7\xa8\x10\x49\xfc\x8a\xe0\xb0\xea\x87\x93\x39\xd3\x25\xfd\x5a\x8b\x46\x75\x87\x13\x74\x15\x13\x7e\x8a\x80\x4d\x33\xe2\xb9\x40\x90\x5f\xff\x95\xe6\x49\xcc\x1a\xa1\x82\x03\x6a\x74\x40\x80\x44\x1a\xeb\x73\x42\xa8\xa8\xa6\x4e\x30\x33\x41\x4b\x01\xa3\xc1\x17\xe1\xc2\x66\x16\x04\x7c\xb6\xd4\x91\xb7\x65\xb9\xa1\xa1\xbf\x2a\x30\xa1\xe4\xb7\xae\x38\xb9\xcb\xc5\x75\xf2\x80\xcb\x4f\xb5\xd3\x89\x6b\x6b\x5f\x29\x31\xda\x5a\x6a\x01\x98\x09\xf0\x82\xf2\x72\x6f\x8b\xa4\x26\x92\x9a\x08\x61\x3d\x7c\x7a\xda\x6b\x94\x14\xc9\x36\x5f\xe9\xfa\xfb\x5d\x8d\x9e\x6a\xbf\x4f\xb5\xa1\xe3\x3d\xd2\xeb\x86\xd7\xa6\x07\x40\x62\x11\xa7\xda\x0d\x77\xf9\x64\xeb\x88\x3d\x3b\xa3\xc7\x6d\xbb\xd1\x07\x5c\xfa\x2a\x2b\x86\x83\x23\xde\xf2\x7f\xfc\x85\xde\x54\xa1\x0a\x70\x02\x4c\x14\x10\x35\xc0\x1b\xb2\x74\x5c\x9a\x83\x50\xc7\xad\xc5\xc5\x7e\x5e\x20\x75\xe9\xb5\x06\xe1\xc3\x64\x88\x96\xe3\x28\xbb\x60\xb6\xf6\x2a\xbc\x6c\xd1\x64\xe7\x42\x45\x13\xd3\xa8\xcc\xf7\xf2\x55\x4e\xac\xad\x1b\x9f\xa8\x69\x9a\x2f\x41\xb3\x72\xa7\xb9\x90\x8b\x04\x29\x44\xec\xbd\xce\xf8\x03\xd3\xe3\x93\xdd\xe8\x3c\x9f\xf2\x76\xf4\x7d\x04\x13\x48\x3b\x77\x41\x76\xe5\x9a\xb8\x8a\xbe\x67\x10\xc2\xe8\xb8\x3b\x4b\xd6\x8c\xef\x09\xf1\x95\x2b\x93\x02\x74\x65\x7f\xb9\x98\xf6\xde\x4f\x6d\xae\xcc\x9d\x32\x5d\xc2\x14\x3c\xc2\x9e\xd3\x93\x5f\x1f\x07\x7b\x1e\x9f\x0f\x58\x8b\xca\x1c\xcf\xc2\xcd\x21\x4c\xfb\xed\xfd\x64\x91\x7c\x9a\xd0\xdd\x66\xe2\x54\xc8\x85\x41\x43\xd3\x36\x44\x02\x30\xf3\x82\x6b\x2d\x73\x18\x21\xa6\xa9\x31\xb5\x6e\x40\xa1\x3d\x0b\xd9\xfc\x49\xba\x70\xa6\x48\xb5\xff\xfe\x44\xb1\xea\xf5\x5f\x93\x4b\xa9\x22\x0d\x43\x29\xc1\x70\x60\x65\x0d\x97\x6b\x22\x68\x88\x57\x96\x9f\xc4\x67\x33\xd5\xd8\x10\xa4\x2c\xd7\x79\xb3\xbc\x00\x9e\xcf\x78\x0b\xdb\xcc\x00\xc5\x43\x9a\xc2\x87\x84\x3a\xb4\xeb\x40\x21\xe5\xd6\xa6\xbc\xc4\xdb\xd4\xe6\xf6\x67\xc9\x9d\x57\xca\x6a\xfc\x1a\x18\x1d\xd7\x3f\xdf\x02\x7a\x95\x07\x3e\x74\x00\x1b\xcb\x84\x6d\xb9\x62\x4c\xd7\xd2\x67\x25\xf5\x03\xbe\xb1\x5c\x31\x6d\x4e\xcc\x34\x11\x19\x20\x69\x5d\xcb\x63\x72\xa7\x26\x74\x96\x3c\xfa\xf6\x2b\x62\x3c\xab\x1a\x17\xf0\x48\x50\xb2\x6a\xf3\x6d\x36\x9f\x39\x4e\x80\xf8\x00\x85\x84\x13\xfc\x1d\x4f\xa1\x66\xe4\xbc\xaf\xcc\xa1\xb0\x3c\x77\xd7\xbc\x27\x6a\x7b\x7a\x22\x26\x0e\xd1\x9c\x69\x1f\x6d\x6f\xb8\xbd\xa7\x3d\xb1\x78\x82\x8b\xf4\x32\x22\x3f\x3d\x29\xd4\x37\x37\x9b\xa6\xa5\x05\x12\x4d\x15\x00\x1f\x71\x7b\xd4\x5d\x9d\x7c\xfc\x05\xfd\x7f\x56\x9b\x57\x56\x9e\xd3\xf5\xa9\x53\x11\xda\x59\xa0\x9b\xaa\xb5\x7c\xd7\xa3\x15\x45\xb7\x03\xed\x31\xeb\x9c\x1e\x07\xbc\x13\xed\x24\xa8\x1a\xed\x40\xa0\xa5\x6e\xd3\xd4\xd6\xf5\xe2\xde\x91\x99\x85\x5b\xc9\x3d\x7a\x6b\x8e\xdd\xae\xe3\x19\x9c\x25\xa0\x45\x0e\x78\x1c\x2b\x9a\x16\x55\x61\x70\x22\xfa\x83\xc8\x51\x9e\x62\x46\x47\x7a\xb4\xfd\x09\xbd\x9d\x6c\x93\x0d\xa2\x9d\x8a\xb6\x78\xf6\x03\x64\x8d\x2f\x67\xad\xb0\x30\xe5\x36\x03\x99\x3a\x92\x93\x31\xdb\x68\x63\x29\x99\xab\xad\x97\xa9\x3e\xe4\x74\x40\x4b\x2f\xa5\xc4\x1e\x37\xf6\x27\xa2\x87\x69\xa2\x8a\x03\xb1\x1d\x76\x83\x63\x66\x09\x66\x3b\xdb\x75\x0c\x1c\xf5\xe2\x21\xe0\x39\x60\x50\x66\xf5\x65\x79\x60\xd1\x9f\x56\x78\x42\x8f\xfd\xf5\xdf\x9c\xc4\x2f\x06\x1f\x88\x0d\xd3\x72\x4b\x57\xa3\xc4\x6b\xf3\xca\xb5\x79\x5e\xef\x85\x83\x0b\x3b\xa6\x21\x89\xe3\xd2\x11\x7b\xde\xcb\xa2\x40\xe4\x68\x5a\x06\x41\x9a\xf5\x82\x34\x3b\x63\x34\xcc\x92\xd9\x17\x8c\x3d\x01\x4c\x2a\x42\x9a\x13\x30\xb0\x90\x4a\xc7\x4d\xe8\x7e\xe6\x74\x2b\x82\x71\xd3\x4b\xda\x6b\x95\xd8\xbe\x14\x89\x61\x20\x2c\x34\x2c\xfe\xa8\x03\xf0\x26\xe2\xaf\xb6\xa6\x22\x90\x7f\xde\xd5\xc7\x76\x93\xb3\xd8\x82\xfa\x20\x1c\x79\xf9\x32\x90\x9d\x2e\x55\xda\x46\xb8\x07\x92\x62\xda\xa3\x02\x40\x88\xad\x2e\x7b\xfa\xf1\xd2\xee\x41\x67\xee\xea\xf5\xe2\x21\x44\x4d\x57\x74\xba\x52\xe7\x37\x49\x28\x23\x16\xdc\x7d\x6b\x56\x97\xc4\x16\x6c\x97\xef\xd4\xfe\x09\x51\x97\x6f\x5e\xd3\x6f\xda\x34\x6d\x1e\x93\x00\x22\xd0\x25\x06\x9d\x61\x81\xa0\xaf\x3e\x1a\x82\xf4\xfe\x21\x35\xc2\xb7\x12\xf1\xe4\x39\x2c\x62\x0b\xe6\x09\x84\x24\x39\xd5\x2c\xe5\x22\x6d\x1a\x42\x4e\x11\xfa\xb5\x22\x35\x27\x76\x63\x48\xae\x60\xb2\x40\xda\xe1\x88\x67\xa7\xc9\x66\x37\x81\x2e\x98\x80\xa3\xe3\x62\x84\x8f\x67\x7e\x67\x77\x2b\x0c\x40\xa0\x60\xf6\xc4\xd1\xbe\xf9\x05\xac\xfe\x0e\x07\x44\x1c\xc1\x9a\xaf\xa1\x3e\x29\x54\xa1\xa4\x02\xdc\xe2\x9d\x3c\x2a\x86\xeb\xd8\xe9\x3a\x74\xd3\xa5\xd2\x6f\x9c\x70\x9e\x90\xdf\x01\x0f\x13\x4d\x65\x45\xd8\xbd\x96\x5b\x64\x70\x6c\xb1\x68\x5e\xf6\x7e\xee\x5e\x35\x21\xbb\x98\x1b\xa8\x6d\xd1\xb8\x13\x60\x49\xaf\xe7\xfd\x08\xc7\xc9\xad\x4e\x62\x96\x82\xe6\x1a\x9c\x08\xe6\x53\x30\xb9\xf2\xf9\xea\x8b\x3b\xf5\xe7\x9f\xac\xbe\xe8\x1f\x97\x1a\xd8\x84\x88\x23\x50\x19\xf4\x2a\xd1\x1b\x50\x6f\x88\x36\x28\x36\x54\x56\x66\xab\xbc\xac\x98\xd0\x38\x24\x29\x01\xc9\x1a\x7c\xef\xd5\x6a\x9b\x5f\xff\x8d\xb0\x1d\xdd\x90\x35\xe8\xaa\x22\xb9\x93\x31\x7b\x9d\x95\x9b\xf2\xfa\x0f\xc2\x5e\x53\xff\x84\x21\xc3\x33\x9a\x8b\xa0\xd7\xca\x55\x73\x60\xcf\x12\x5f\x6c\xc1\x41\x2e\x2d\xc0\x9e\xda\x5e\xe6\x2b\x7a\x76\x09\xb0\xf3\x62\xf1\x40\xc9\x1a\xc8\xa9\x56\x90\x78\xd2\xd9\x0e\xea\x04\x14\x0e\xf8\x40\xda\x65\x7d\x09\x84\x24\x7a\xf3\xc7\xbf\xff\x19\x32\x53\x01\xc4\xf2\x8c\xd6\x28\x00\xe9\xf6\x7e\x02\x2e\x99\xe4\x02\xb4\xf0\xf6\x6f\xf3\x5d\xde\x1f\x02\x18\x0b\xdb\x10\x40\x1e\x57\x5d\x93\xd0\x06\xfd\x42\x34\x00\x76\x1a\x0c\x04\x0d\xae\x87\x62\xb0\x36\x16\x2b\x77\x72\x19\x8e\xbc\xa9\x90\x64\xe3\x79\xfa\x75\x42\x43\xb6\x0d\x0d\x42\x30\xb3\x6c\x0b\x3d\x79\x62\x14\x18\xf4\x9f\xe7\x04\x95\x67\xfc\xc2\xef\xd0\x29\xe3\x7e\x3d\x63\x9a\x9a\xe3\x6c\x65\xa8\x0f\xfd\xd1\x7e\x34\x4f\x54\x30\xcd\x74\x05\x01\x1e\x11\xc7\x02\x9a\x81\xcc\xe0\x24\xdc\xe0\xa5\xd8\x87\xe0\x2a\xf0\x43\xd3\x25\x40\x7e\xf3\xfa\x2c\xd9\xd0\xab\x5d\xe4\x57\x10\x52\xec\xe9\x2c\x18\x12\x98\xcc\x4e\xf3\x7a\xa3\xfb\xa5\x2b\xf8\x4e\xab\xb2\x28\xcd\x49\x60\xb4\xb7\xf1\x16\xa9\x0c\x81\x29\xa5\x9a\x11\x58\x43\x94\x12\x31\x3b\xd1\x42\x3d\xad\x40\x47\x78\x65\x2a\xde\x89\x23\xbd\xb7\x26\x03\xd9\xc0\x2f\xd4\x6e\x3e\xe3\x39\x60\x2a\xcd\xc9\x99\x7c\xe8\x14\x42\x1f\x8d\x26\x75\x64\x8d\x40\x45\x3c\x2d\x14\x25\x09\xf7\xa3\x34\xbf\xa2\x00\xe9\xda\x63\x80\xef\x7d\x0d\xeb\x6a\xb8\x97\x3d\x05\x9b\xdd\x03\x8c\x28\x46\x36\x65\xd6\xef\xbb\x81\x52\x03\x3b\xb3\x46\x4b\x3e\x00\xff\xd6\x7b\xb2\x44\x21\xb1\x1f\xd3\x0b\x6e\xc6\x2b\x3b\xba\x09\xd3\x8a\x94\x0e\xf6\xad\x9a\xb2\x5c\xd2\xdb\x5c\x35\x8b\xfb\xa0\x37\x05\x87\xc8\x94\x87\x02\x56\xe0\xc3\x2b\x42\xbc\x09\x0e\x39\xf9\x1f\x9d\x68\x18\x02\xe1\x82\x6e\x5d\x4a\xef\x8b\xbb\xc4\xb8\x78\xc2\xce\x5b\xa5\x99\xa4\xaf\x35\x24\x99\x22\xb6\x90\x61\x88\x92\x50\xac\x2c\x02\xc4\xd9\x0f\xd8\xf0\x97\x82\x19\xf0\x22\xba\x1e\xdd\xd3\xc1\xf0\x21\x4b\x09\x31\x84\xaf\x2f\xa4\x7d\x40\xf8\xd7\xbc\xc1\x21\xc8\x0c\x0f\xeb\x05\x24\xbc\x7f\xd0\xee\x2e\x9d\xaa\x50\x1f\x1d\x47\xd8\xbd\x10\xf4\x89\x5b\x73\x74\x88\x9a\x95\x92\x67\x74\x8b\x1a\x7a\x8c\xfa\x26\x4e\x58\xc3\x9f\xe5\x5a\x6c\x68\x3b\xc1\x70\x62\x7d\x65\x66\x68\x81\x9d\xad\x17\x4f\xcd\x86\xf6\x0e\x9b\x35\xa3\xaf\x68\x23\x53\xa1\x5a\x10\x44\xbd\x9c\x3d\xa3\xc7\xf0\xd1\x09\x4d\x27\x88\x8d\xa0\x2c\x52\x03\x7e\xc5\x9b\x70\x37\x5c\xf3\x93\x01\xaf\xf4\xbd\x9d\x50\x85\xba\xd5\x9f\x9f\x7f\xf3\x94\xb9\x34\xe9\x7b\xb3\x6d\x53\x3a\x76\xc8\x60\xbf\x69\x9a\x7d\xfd\xac\xda\x2e\x44\xf0\xf8\xec\xfb\x07\xd4\x73\xb7\x2d\x4d\x86\x8f\x10\x68\x66\xc0\x7b\x87\x12\x4f\x0c\x91\x41\x4f\xad\xd9\x05\xb3\x3c\xda\x7a\x4f\x45\xed\xec\x2e\x51\x3d\xc1\x77\x30\x8a\x55\xc7\x32\xf3\xd9\x5d\x20\xde\xaf\x6e\xe0\xd0\x66\x8f\xec\xe1\xcb\xca\x14\x69\xd8\x03\x88\xa4\xab\x64\x4d\x47\xf4\xe6\x97\x63\x3e\xbb\x57\xee\x08\x3f\x9f\xb7\xbb\x9d\xa9\xba\x85\xfc\x4a\x6a\xf9\xa9\x85\x0f\xe9\x58\xa1\xbd\xd6\xc2\x9d\xfc\xd4\xc2\x7b\x97\x44\xf0\xf9\xb2\x94\x7f\xcd\x9e\x56\xd6\xf2\x90\x3d\x3d\xce\xea\x21\x6a\x43\x58\x86\x80\x54\xff\xce\x3c\xcb\x6f\x59\x8f\xfb\xe3\xb4\xaa\xe2\xc7\x99\xd9\xee\x2f\x0d\x93\xd8\xbe\x26\xcb\xe0\xf9\x09\xaa\x19\x68\x58\x07\x93\x04\xf7\x9e\x1e\x59\xa7\x93\x31\xdb\x0b\x53\x40\x04\x0d\x06\x9b\x0a\xe8\x5d\xe8\x08\xd1\x8b\x7c\x8a\x68\x61\x83\x93\xcd\x36\x15\xb0\x3f\x81\x55\x3c\x60\x46\x68\xf5\x3f\x7d\xd0\xb3\x68\x40\x99\xc2\xa6\x2a\xf7\x76\x43\x83\xd7\xf9\xd1\xc6\x43\xf2\x66\xb0\x46\x45\xde\xa0\x3b\x35\x55\x63\x4e\x6c\x54\xb5\xd7\x48\xa5\x10\xa7\x5e\x11\x59\xf7\x37\x3a\x70\x62\x03\x1d\x1a\xa2\x96\xe6\xa7\x7f\xb2\xa5\xbc\x34\xe1\x69\x85\xdc\x2b\x44\xfa\xb8\x4b\xf4\x1a\xaa\x58\xfd\xc7\x19\x24\xf5\xef\x50\x9f\x6e\x04\x55\xce\x8b\x74\xdb\x66\x7e\x5e\x83\x69\x09\x0b\xf5\xc1\x9d\xfa\x03\xf4\x5b\x6c\x70\x17\xb5\x2a\xa1\x06\x9a\x24\xbd\x68\x2b\x10\xb1\xd9\x67\xce\x56\x61\x49\x3d\x96\x55\x65\xd3\x66\xf1\x1d\x3d\x1d\x4e\xb8\xc5\x24\xd1\x9a\x30\x8d\xe1\xd3\x9c\xf7\x68\xbe\xe7\xb8\x55\x22\x9d\xc7\xef\x7c\xd0\x94\x49\x3e\x6e\xed\x2d\x2d\x96\x2b\x6b\x8b\x25\xd1\x47\xb6\x98\x62\x26\x79\xed\xcc\x41\xa0\xf5\x2f\x0d\xd3\xd4\xfb\x72\x39\xdd\x34\xc4\x54\x53\x4d\x89\x98\x3e\xd1\x32\xd0\xac\x4d\x35\x6c\x08\xd7\x9c\x68\xe9\xf0\xce\x54\x33\x39\x7b\x6e\x42\xeb\xcd\x22\xb4\x19\xd5\x0f\xb1\xfe\xbc\xdf\x1b\xbf\xc7\xfd\x99\x9c\x60\xb8\x2f\x55\x19\xe0\xc1\xa5\x17\x32\x40\xcc\x49\x6f\x47\xc5\x56\x2f\x81\x94\x85\x05\x60\xcf\xf6\xf6\x80\x27\x3d\x10\x25\xec\x31\x0d\x90\x7d\x86\xb5\x8f\x53\xbb\xea\xe4\x02\x13\x5d\xd3\x9c\xf0\x4e\x4d\xf7\x2d\xfd\xc1\x8a\x09\x77\x92\x10\xdd\xf6\x3d\x7b\xef\xc5\x6f\x4e\x27\x7e\xc3\xfc\x4b\xb7\x2b\x61\xaf\x56\xcd\x86\x00\xb5\xf6\x27\xc2\xfc\xf4\xa0\x43\x30\x15\x89\x20\xb1\x8d\x54\x04\xa2\x84\xea\x6f\x4d\xdd\x40\x10\x20\x6b\x5b\x3c\xab\xdb\xc3\xb0\x01\x8f\x80\x67\xbc\x81\x01\x45\x7a\xa4\x51\x0b\x08\x93\x12\xbb\xc9\xf7\x5d\xb4\xe2\x7c\x9e\x3c\xf4\x08\x0a\xea\x92\xa8\x94\x6e\x86\x5b\x2b\x74\x92\x1b\xdb\x05\x04\x9d\x3b\x5d\xc2\x81\x90\xfe\x34\xc2\xa7\x1c\x08\x5f\x5e\xe4\x1b\x21\x5c\x58\xda\x07\x45\xa5\x7f\x57\x21\xcf\x82\xcc\x06\xfc\xee\x2b\x5b\x11\x29\xe0\x7b\x66\xd3\x8d\x40\x33\xff\x96\x9e\x88\xe2\xdb\x82\x2f\x12\x3c\x0e\x1e\x19\xad\x22\xec\x34\xe4\xf5\x88\x48\x22\x66\xa5\x97\x89\xb3\xa8\x96\xde\x67\x27\x4e\x7b\x06\x34\x41\xa7\x8f\x22\x2f\x9f\x84\x0a\x0a\xda\x13\x11\xb1\x89\xec\xa9\x6e\xf2\xed\x16\x07\x20\x56\x4f\x4f\x7b\xfa\x2c\x21\x9a\x87\xad\x1f\x6a\xe2\x38\x44\x08\x4f\x98\x98\x09\x4a\x9a\x5b\x46\x50\x10\x42\xd8\x99\xea\x72\x9d\x74\xba\xad\xdb\xe2\xcd\x6b\x5a\x2e\xf3\x22\x15\xb8\xa5\x23\xad\x7e\xae\x03\x82\x59\x82\x61\xd3\xe9\xf1\xf4\xac\xe9\xec\x0f\x25\x34\x87\xc3\xe1\x63\xad\xbd\x0e\x0f\xc9\xbb\x8c\x4f\x75\xd9\x00\x28\x29\xf7\x2d\x60\x00\x43\x03\xd4\x86\xeb\x8d\x4c\xae\x74\x0a\xbc\xf3\x21\xf0\x10\xbc\xbd\xcb\x5a\xff\xfe\x67\xa7\x9b\x0c\x17\x3c\x13\x23\xa1\xe5\x8a\xc9\x9f\xe0\x7e\x7c\x0d\xc2\xe7\x35\x9d\x64\x46\x5c\xf6\x16\x32\x81\xf8\x7a\xcc\x7e\xc0\x85\x7a\x39\xa3\x57\xa2\x58\x5b\x55\x3c\xf5\x94\x2f\x93\xc8\xac\x04\x9b\x5d\x95\xf4\xfe\x96\xd0\xe1\xab\x6a\xfc\xfa\xe7\xde\x20\x0e\x26\x59\xa1\x94\x4b\x2d\xb5\xba\xc5\x93\x76\xb5\xcd\x89\x20\x30\x42\xa0\x17\xcc\x47\xcc\x2e\xca\x2d\xcd\x05\x82\xb0\xc7\x2b\xc8\x75\xd8\x5c\xab\xa3\x63\x33\x40\x18\x74\xa9\xe9\x40\x89\x79\x87\xcd\x8f\x54\x85\xf4\x55\xaa\x32\xf3\xa4\x5f\x7d\x6b\xba\x22\xfa\x05\x62\x20\x10\xe4\x7f\x80\xa0\x5c\xaa\xd3\x78\x90\xc4\xec\xe6\x8c\x95\xf1\xfc\x56\xaf\x20\x0c\x1e\xe3\x62\x18\x55\xc9\xc1\x00\xa9\x1f\x75\x34\x42\x65\x7d\xf3\xbd\x69\x08\xab\x15\xc2\x7c\xf2\x22\xb2\xc5\xf3\x23\xcc\x55\x52\x46\x90\xdd\xa9\x1e\x69\xbf\xb3\xf2\x78\x28\xb7\x2c\x2c\x98\xfd\xe0\xcc\xdc\x5e\xce\x9c\x29\x9c\x98\x3e\x8e\xcc\xa1\xf4\x48\x44\x57\x38\xd3\xdb\x5f\x13\x3b\x47\x37\xdb\x8a\xfd\x03\xcb\xf0\xe8\xc1\x07\x3f\xc5\xef\x99\xa5\x1d\x67\xca\x89\xe6\x07\xfb\x01\x3a\x02\x16\x13\xd5\x8b\xbb\x2a\x4b\xb7\x33\x16\x8e\x3e\x0e\xe4\xa2\x19\xc1\x60\x03\x05\x4c\x4b\xbb\x27\xdc\x53\x9b\xd3\x2d\xff\xf6\xfe\x6c\xb6\xe7\x63\x5c\xc6\x53\x4d\xf6\x7a\xb8\x9d\x5b\x83\x48\x57\x9e\x8e\x38\x2b\xc5\x33\xae\x3a\x11\x19\x4e\xb7\x27\x36\x71\xf4\x09\x02\x6c\xa7\x11\x26\xaa\xb2\xd7\x64\xd3\x64\x8e\x90\x3b\x1e\x45\x01\xa1\xc2\xe5\x5d\x22\x96\x5c\x10\x16\x67\xb8\xa6\xc4\xe2\xf2\xfb\x7f\xe8\xa8\xdc\xb0\x49\x15\xb3\x8f\xcd\x9b\x5f\xfe\xfe\x67\xd5\x7b\x05\x74\x8f\x7f\xa5\x55\x9a\x98\x05\xac\xe9\x40\xdb\x36\xc5\xa1\xaa\x49\xcf\xf8\xc4\x09\x56\x60\x8d\xc8\x4f\xe8\xb7\x10\x18\x42\xbd\x4c\xb5\xf2\x7a\x53\x0e\x6d\x6a\xc1\x1a\xb3\xae\xf5\x01\x86\x55\x83\xcc\x76\x9f\x81\x5d\x75\x3b\xfd\x42\x34\x1d\xf9\xb1\xf5\x56\x92\x71\x0d\xcf\x88\x86\x96\x94\x4e\xa8\x47\xdb\xa8\x44\x38\xa3\x7e\xe9\x49\xe9\x14\xbd\xf1\xde\x68\xf6\x85\x98\x02\x15\xa5\x33\x5b\x8a\xb8\xca\x41\x6d\x27\xe0\x22\xd4\xc6\x36\x96\x26\xb2\x49\x21\x18\xac\xff\xf1\x97\x15\x61\xd4\x2b\xb3\xc9\x13\xc1\x17\x84\x04\x09\x9f\xb3\x1e\x5d\x35\x1b\xfd\x2b\x25\x0a\x5d\x28\x12\xf2\xa2\xb5\x0c\xc9\x5d\xd1\xd2\xbd\x1e\x18\x6a\xaa\x42\x5c\xd5\xe3\xab\x4e\x64\x36\xa2\x3e\x57\x6d\x3a\x3d\xcd\x09\x33\xb6\xa7\xb4\xf0\x43\xf5\xbb\xd3\xbe\x3b\x7d\x31\xb1\x60\xe5\xce\x21\x42\xa7\xd4\x1d\x58\x08\xa8\x5d\x00\xed\x4a\x59\xd6\x2a\x9d\x77\x06\x09\xd0\xe5\x1c\xc1\x76\x76\xaa\xa1\x77\x07\xe6\x70\x6b\x70\xa2\x81\x06\x49\xba\x34\x7a\x0b\x69\x1a\x84\x09\x8b\xc6\x35\x92\x4b\x59\xae\x6c\x4a\x57\xe5\xae\xeb\x16\xec\x75\xbf\x3e\x46\x49\xcb\x7c\x07\xde\x15\x3a\x02\x93\x89\x71\x34\x6e\x7c\x4f\x5b\x42\x45\x78\x84\xe4\x2b\x9a\x95\x87\xa2\x67\xc3\x19\x81\xb5\xf3\x32\xf3\x53\xe0\x84\x87\x44\x21\x64\x28\x3d\x51\xc9\x41\xb9\x0d\xe8\xbf\xbb\xa2\xbd\xf3\x62\x05\xec\x9f\x2f\x64\x9b\x68\x2f\x6d\x81\x30\x62\x19\x95\x3f\x29\x0f\x78\x18\x8f\xa2\xfe\x18\x8a\xad\x7a\x5a\xfb\x4b\x70\xe2\x6c\x05\x7c\x23\x79\x3d\x98\xb6\xdf\x08\x65\x87\x74\xe9\xa5\xde\x7d\x56\x16\xf8\x4d\x50\x63\x22\xe8\xc9\x21\x92\x0f\xa4\xc8\x4e\xaa\x8c\xca\x65\x0a\x53\x40\x1a\x6c\xad\x34\xad\x09\xf0\x90\x0e\xff\x4f\x63\x21\xe0\x4a\x11\x97\xd1\x11\x30\xc7\x52\x0b\xa3\xd2\x39\x01\x8f\x5a\x78\x6b\x59\x60\xe4\xcd\x08\x1a\x62\x4b\xad\x28\xfc\x4e\x80\xc1\x89\x65\x07\x34\x30\x24\x87\xc8\x7c\x8c\xbb\xcb\x18\x5f\x7b\x4b\x22\xaa\x06\x40\xbc\xfe\x03\xad\xb8\xca\x59\xe4\xf2\xc4\x77\xea\x3e\xa9\x68\x8e\x21\x8f\x2d\xf9\x83\x81\xdd\x75\x70\x55\xe8\x16\xf8\x79\x52\x01\x90\x27\x7d\x2c\xa0\x2c\xa4\x09\x8d\xc5\xd6\x83\xca\xb2\xba\xa0\x45\x83\x43\xe1\xc5\xb5\x6e\x75\x84\xbc\x0e\x65\xd6\xb2\xe9\xb9\xaf\xa7\xeb\xc9\x0b\x31\x04\x83\x1e\x29\x7a\x93\xa0\x07\xf4\x42\xe5\xe4\xde\xb1\x4b\xd2\xcb\xd4\xe9\x70\x08\x95\x31\x50\xfc\x66\x38\x1b\x07\x6b\x2a\xce\x72\x48\x5b\xc7\x6d\xc2\xfb\x76\x6b\x66\xb2\x8c\x2f\x82\x6c\xc5\x7d\xe2\x7b\xae\x04\xcb\xe8\x4a\x51\x1e\x96\x0d\x3f\x2f\x23\x7d\x11\x74\x15\xff\x41\x1d\x11\x04\x13\xff\xbc\x7a\xe8\x4e\xa6\x3a\xa1\xb3\x53\x1a\xa1\x5e\xee\xad\x86\x2a\x6e\x21\xf1\x8b\x17\xec\x81\xdf\xc1\x4c\xb8\xc2\xe0\xa6\xce\xdc\x3d\xf0\x04\x54\x70\x13\x84\x4b\xa2\x9b\x00\x6a\x0a\xe3\x80\xbf\x92\x5d\xe4\x22\xa6\xba\xe4\x62\x28\x3f\xba\xcd\x61\x47\xca\x85\x1d\x5a\x31\xfc\x9f\x84\x07\x25\xa9\x98\x62\xf3\x74\x3d\x2e\x74\x55\x1e\x89\x66\x26\x36\x82\x40\x45\x2c\x5b\x55\x58\xff\x39\x53\x2c\xeb\x2f\x22\x7d\x20\xe3\x92\xee\x37\x9f\x7f\xa2\x85\xc9\xb9\x63\xd3\x0a\xa8\x7d\x40\xef\x1c\x60\xef\xb8\x81\xd7\x40\xef\x25\xc0\x76\xcf\xaa\x95\xe8\x67\x0c\x9f\x01\xe6\x9b\x68\x0e\x3c\xf5\x4e\xb4\x12\x51\x53\xc2\xbe\x22\xe4\xdb\x8b\xeb\x04\x3f\x06\xae\xf5\xdc\x83\xe4\x60\xbb\xbc\x51\x2e\x7d\x0f\xe4\x27\xac\xf3\x2e\x55\xa3\x2c\x7c\xa9\xa3\x08\x71\x0b\xf9\xda\x33\xe1\x76\xa4\x97\xa7\x6a\xf8\x1a\xcf\x7d\x3f\x4c\x75\x70\x3f\x4c\xf9\x06\xc4\x64\x29\x2e\x0e\x54\x2e\x04\x19\xd0\x3c\xc6\xe8\x99\x1c\xd7\x3e\x12\x5b\xf3\xd7\x54\x05\xb4\x4f\x2b\x36\xcf\x70\x87\xef\x41\xec\x49\xff\xe0\x31\x4c\x95\x02\x6e\x7e\x99\x7c\x09\x6e\x39\x2c\x85\x7d\x10\x1c\xe5\x66\x3d\x85\xa5\x02\xa9\xf9\xb0\xda\x34\x7e\xea\x1b\x78\xd4\x5b\x6f\xda\x46\x59\xfd\x1e\x4b\xed\x86\x04\xb4\x07\x48\x35\xc3\xc2\xf1\x8d\xc8\xae\xd3\xd8\x6a\x34\x3b\xb7\x2b\xdf\xf9\xe5\xbf\x1d\x65\x31\xc7\x88\x9d\x13\x49\x0c\x9f\xe0\x63\x91\xb5\x94\xf2\xc2\x95\xec\x38\xe0\x18\xc6\x2f\x2b\xb3\xe9\x79\xc5\x34\xe7\x63\x42\x7d\xc7\x5c\xd8\x42\xb7\xdf\x8f\x8d\x4e\xba\x1e\xb3\xa8\x24\x87\x96\xfd\x3f\x25\x74\x1b\x66\x4d\xb9\x21\x10\x1c\x74\xc1\x1f\xdf\xb9\x0b\x8f\x3c\x84\xd3\x0a\x50\x47\xbf\xcd\x84\x3e\x78\x43\xe9\xef\x90\x07\xa3\x32\x67\x68\x31\x81\x45\xa2\x93\x42\x17\xe3\xf6\xe9\xa5\x43\x22\xbe\x72\x6e\x14\x93\x38\xab\xac\x18\x97\xb4\xc5\x2a\x2f\xb2\xc5\xb0\x91\xd5\x82\xfe\x28\x59\x2a\x32\x62\x1a\x7b\xba\xa7\xcc\xf6\x38\xd8\x00\x83\x1a\x6e\xb9\xe4\x1d\x8c\x9c\xc6\xea\x72\x45\x0b\xc2\x46\x70\x19\x76\x42\x01\xaf\x55\xe7\x0b\xb5\x64\x91\xa6\xcf\x3b\xfe\xd8\x2a\x0a\xe7\x8f\x72\x58\xb5\xdb\x26\xfa\x77\xe7\x11\xe6\xa1\x73\x98\x8c\xd5\x6d\x67\x4a\x0e\xb1\x28\x8e\x0f\x90\xdd\x06\xdc\x88\xf8\xf7\xdd\x27\xdf\xaa\xfa\xd0\x8f\x2a\x3d\xff\x8e\x60\x8c\x1e\x31\xa2\xd9\x72\x20\x64\xf0\x90\x9d\x03\x09\xc3\x42\x49\x3a\x16\xa2\xa9\xe8\x77\xe0\xf0\x30\x60\x57\xa4\xbf\x00\xaf\xc8\xaa\xfb\xa5\x0e\x97\x29\x2b\x8c\x8b\xe5\x20\x6c\x8d\xb7\xd8\x4d\xc1\x2f\xc1\x81\x67\xbf\xf2\xe8\x51\xbb\x95\x8c\x85\xb4\x42\x88\xd2\x24\x6b\x98\x35\xb9\xbd\x9a\x27\xa0\x2b\x15\x79\xd0\x3d\x57\x8b\xda\x75\xa9\x06\xa2\xfc\xea\xaa\xae\xcf\x63\x33\x99\xbe\xe0\xb3\xf0\xcc\x23\xa4\x26\x8f\x86\x1e\x3d\x36\x47\x36\xa1\x3f\xf8\xc9\x96\xd3\x78\x4e\x9b\x06\x9d\xb9\xcd\x9f\xa4\xc9\xde\x0d\xd9\x79\xe3\xc1\x1b\x10\x5d\xb8\x60\x7f\x33\x1e\x2b\x38\x9f\x3a\x94\x49\x94\xc7\xfb\x7c\x14\x33\x9f\xab\x04\xcc\x53\x01\x36\x24\xe2\x96\x7a\xc2\xbd\x9f\xdb\xcc\xcd\xc1\xa9\xb5\xe5\xe2\x86\x9a\x6c\xad\xd0\x33\xde\x2a\xf2\x20\xb8\xab\x0e\x90\xed\xf2\x84\x6c\x12\x4a\x3b\xf3\xc4\x11\x12\x30\xfc\x7c\xf8\xf8\xfa\xbf\x7e\xd5\x53\x0f\xbc\x10\xd6\x7e\x5d\xf0\x42\xcc\x2d\x6f\x28\x3b\x98\x4c\xa0\x35\xef\xf7\x7f\x30\x63\x6f\xbe\xdb\xbf\x73\xec\x01\x3a\xa8\xe5\xf0\x9f\xcc\xcf\x73\x12\xba\x97\x2c\x3d\xa0\xe7\xbf\x06\x9d\x34\x79\x54\xb3\x1f\x20\x73\x7c\x39\x13\x69\xfe\xf3\x40\x7e\xda\xab\x96\xa6\x34\xdf\xbd\xde\x49\x29\xac\xfb\xc4\x08\x5b\x15\xe0\x44\x5a\x0c\x58\xb7\x6e\xe8\xe4\xe0\x99\x70\x96\x1c\xf6\x26\x33\xe2\x4c\x7a\x48\xc4\x04\x0c\x92\x7f\xbf\xaf\x2d\xa4\x23\x5b\xb8\x60\xea\x87\xf9\xec\x55\x5e\xe7\xab\x7c\x8b\xc7\xec\x79\x9e\x95\x82\x55\x89\xb6\xe0\xef\xf8\x1c\x78\xf2\x8c\xf5\x27\x9f\xd7\x7b\x53\x24\x29\x3d\x96\xf5\xe2\x76\x0b\x9b\x92\x2c\x81\x79\xe5\xed\x2f\xf6\x70\xfe\x6e\x78\x28\xaa\xf2\xc5\xa8\x3f\x78\xff\xa6\xac\xa7\x0a\x8d\xe8\x6b\xba\x23\x76\xd7\xaa\x93\x27\x23\x09\x58\xd7\x78\xdf\x8b\x22\x76\x41\x36\x84\x4f\xc1\xe9\x9f\x9e\xc6\x93\x93\xd3\x80\xf7\xb1\x5b\xdb\x87\x2f\x44\x2c\x04\xd2\xcc\x53\x73\x91\x90\xa8\x9f\x02\xda\xe5\x1f\xcd\xd2\x2d\x71\xd7\xde\xc1\x73\x4c\xf8\x42\xf4\xe7\xbc\x9c\xec\xee\x37\xc9\xe3\x8c\x80\x12\x30\x79\xa3\x8f\x2c\xbb\xc9\x83\x5c\xbd\x35\xe3\xf9\xb1\x44\xfe\x1c\xff\x64\xc1\x85\x7c\x64\x9f\x22\xf5\x9b\x3e\xca\xa7\xd1\x69\xa1\x38\xd4\xb7\x0c\x65\x81\x07\x7f\xd6\x44\xb4\x30\xb8\x31\xac\x3f\xde\xe7\xb5\xfc\x84\x5b\xbc\x73\x89\xe7\x0f\xeb\xbc\xc9\xd7\x05\x4c\x5f\x75\x88\x73\xba\x2b\x69\x93\xcc\x7d\x41\xe2\x7c\xeb\xeb\x19\x11\xbb\xf4\x30\xda\xc5\x03\xfc\x85\xa0\x50\x3f\x78\xff\x40\x15\x3c\xb1\xb4\x67\x2b\x95\x30\x0f\x93\xd1\x85\xf8\x9e\xff\xe8\xaf\x61\x8b\x5a\xdc\xf6\x13\x29\x85\x86\xa7\x5c\x12\x00\x35\x6c\xe4\x9e\xa7\x57\xfc\x72\xc5\x90\x2a\x9c\x3f\xae\x05\x8c\x97\x2b\xc1\xbb\x18\x59\x1c\x00\xb5\xc7\xd6\x59\xaf\xf2\x9e\xab\xeb\x7f\x7c\x2d\x33\x7b\x61\xda\xad\xd3\x5b\xc0\x3f\x90\x31\xa9\x11\x83\x8d\xd7\xd7\x7f\x55\x17\x7a\x42\x7b\x6d\x61\x69\xca\xd0\x3b\xe0\x32\x85\x9f\xfd\x6b\x42\x18\xb3\x87\x2a\x98\x1a\x64\x6c\xdd\x59\x66\xce\xec\x24\xe4\xbd\x94\x3d\x60\x9e\xf4\x98\x89\x31\x79\x34\x37\x1d\x22\x87\x1a\xf3\x15\x51\x7d\xf7\xc4\x7a\xaf\xd9\xe6\x07\xe1\x96\xf5\x85\x45\xbf\x1f\x0a\x2f\xdb\x7d\xe4\x5a\x11\xe9\x5b\xe1\x15\x11\xa5\x31\x6a\xe6\xbd\x89\xf1\xd5\xa0\x96\x2c\xe0\x89\xb7\xe2\x67\x3b\x0b\xb9\xb0\x2c\x6f\xba\xfe\x13\x98\xf4\x54\x8c\x59\x23\xfd\xc2\x41\x84\x17\x60\x70\xb5\x4b\xa6\xb2\xeb\xae\x00\x26\x78\x40\xff\x4e\xce\xf9\xdf\xb3\x03\x94\xfc\x93\x1a\x97\xb5\x39\xe2\xbb\x28\x5d\xd8\x7b\x1d\x17\xa0\x66\x80\xcf\x55\x75\x42\xe7\x98\x5e\xaa\x6d\x63\x79\xb1\xe4\x73\x65\x2f\xa1\x00\x01\xd3\xc3\x0d\xea\xb9\xa0\x63\xfb\x39\xe1\xaa\xc9\xce\x6c\x6a\x5a\x06\xbb\xd3\xe4\x5b\xc1\x01\xb1\x43\xc0\x9d\x6c\x7e\x5a\x39\x13\xc1\xdc\x7f\x8a\x72\xe6\x44\x8f\x03\xe5\x4c\x61\x21\x55\x6d\x9b\x4b\xf5\x17\x8a\xcc\x90\x34\x3a\x43\xef\xe6\xae\x11\x1a\xe2\x92\x53\x38\xde\xbd\x78\x11\x7e\x05\x62\x4d\x56\xdb\xd6\xde\xfe\x02\x90\x42\x20\xe9\x40\xe5\xcd\x6b\x87\x66\x5d\xe7\x7c\x97\x9e\xb0\x7b\x34\x6c\xce\x06\x10\xcb\x75\xe6\x82\x49\x1d\x08\x9e\x03\x6b\xb6\x2a\xef\x9b\xae\xe3\x9f\xe5\xc0\x16\x49\x44\x7e\xbd\x33\xe9\x27\x5f\x7f\xfb\x94\x05\x06\xce\x85\xdd\xa8\xa0\xd2\x7b\x10\xce\x7d\xe7\xb4\xf2\x5d\x5e\xd7\x42\xe9\x61\x73\x23\x8b\xdb\x7c\x07\xcf\x58\xa1\x84\xa4\x8b\x2e\xb2\xa1\x67\xdb\x41\xd7\x55\xef\xf8\x00\x3b\xc2\x81\xd7\xc3\xd0\xd5\x41\xe8\x5c\xc7\xf8\xf3\x6c\xbd\xd4\x57\xdd\x95\x73\xc8\xbe\x5d\xe7\xaa\xc8\x7e\xa8\x31\x36\x22\x05\xb6\x09\x14\xd8\x7a\xb7\xf8\x99\x18\xc6\xdd\xc0\x65\x21\x70\xe1\xb2\xda\x3d\x50\x9d\x7b\x46\xd8\x41\xb5\xb6\xdb\x8b\x68\x07\xf4\xf9\x71\x8f\x07\x51\xba\x12\x1c\x06\xff\x0a\x4f\x14\x14\xd9\xbe\xa3\x7b\x57\x6c\x38\x88\x08\x34\x22\xee\x83\x27\x54\xcf\x1d\x1e\xb2\x41\x75\x67\x27\x64\xd2\xfc\xfa\x4f\xa0\x45\x37\x5b\x73\xc8\x89\xae\x4a\xfe\xdb\xff\xfd\xff\x7c\x7c\x8f\x90\xf4\xbd\xa6\xda\x7e\x7c\x4f\xa4\x6f\x8e\x59\x20\xc4\x9a\xc2\x1b\x22\xeb\x3b\x2d\x89\x63\x64\xdc\x71\x42\xb5\x2a\x65\x81\x22\xb6\xee\xf5\x15\x6b\x42\x5b\xc7\x6c\x83\x88\x34\xf8\xc8\x18\x66\x16\xc4\x28\x99\x81\xf3\x97\xa8\x39\xe0\xfa\x4b\xb8\x13\xcf\x7e\xdf\xe6\xe9\x66\xb9\x6e\xf3\xcc\xd2\x2c\x88\x10\x4b\x61\xcc\xd2\xdb\xd9\x2a\x9d\xd0\x5c\xe6\xb5\x5c\x86\xef\x04\xbc\xa3\x9b\x10\xb8\x4d\xf0\x53\x9b\x96\x3b\xe2\x5e\x33\xff\x08\x15\xc3\xc0\x2b\x44\x5c\x80\xc4\xad\x59\x64\x0f\xef\x2c\x62\x7a\xf6\x2d\xec\xef\xa0\x46\xef\x6f\x1d\xec\xa5\xaf\xfa\xb7\x23\x7d\x7b\x2f\x3c\x3e\xcd\x95\x03\x17\x4c\xd3\x7c\xea\x78\xee\x44\xa9\x07\x2c\x1a\x82\x54\xe2\x61\xae\xff\x8a\x81\x6e\xcd\x66\x6c\x1e\xfc\x5d\x99\xcd\xf4\xa9\x74\x8a\xfd\x59\x53\x59\xbb\xb8\xcf\xb2\xbf\xd9\x45\xbe\x85\xa1\xa9\x5a\x01\x20\x0c\x43\x63\xd6\x8b\xdf\xd2\x57\xf0\x9f\xee\x4d\xe5\x7b\x41\x05\xda\x15\x31\x9f\x5f\xab\x79\xa4\x9d\xd1\x67\xd8\x9f\xae\xf3\x51\xd0\x14\x44\x59\x99\x8c\xae\xb2\x35\x2b\x4b\x25\x5f\x35\x1d\x3d\xbb\x4d\x47\x97\x65\x0b\x4f\xb7\x82\x1a\x7f\x67\x98\x4a\x22\xc0\xcf\x81\x8d\x67\x29\x9b\x4d\xd6\x6a\x3e\x09\xd3\xd8\xad\x35\x35\x55\x7c\xce\x7e\x6a\x66\xc6\x1a\x4d\xba\xca\xf4\xd8\xd2\x33\xde\xc9\x6f\x3a\x69\x8e\xb9\xf3\x0d\xff\x75\xb5\xd8\x4d\x07\x55\xd5\x4b\x27\x0d\x5a\x00\xff\x18\xbe\x35\x5f\xda\x23\xde\x4f\x22\x5f\x8b\x9c\x15\x90\xb8\x0d\x1b\xa9\x05\x13\xe7\x2d\x08\x47\x96\x08\x31\xe1\x24\xef\x0b\x6c\xf5\x33\xbc\xb3\x72\x3b\x70\x3d\x3b\xbc\xc1\x96\xde\x7e\x58\x13\xd8\x0c\x36\x0f\x73\x8e\xb8\x03\x25\xed\x23\x7b\x48\xf0\x0f\x57\x20\x9a\x39\x29\x7b\xc6\xff\x8e\x8a\xf1\x47\x0a\xbf\xa2\x7f\x45\x45\xfb\xca\xf2\xba\x44\x2d\x84\xdd\xe7\xdf\xc9\x3d\xf9\xed\xaa\xa5\xa6\x60\x13\x0f\x74\x04\x23\x6b\x3c\x20\xdc\x23\x6d\x2d\x17\x25\x28\x22\x28\x2f\x3e\xe6\xb7\x85\x8b\xa2\xe1\xf9\xfa\xf4\x73\xc0\xcf\x68\x22\x3b\x02\xc9\xe5\xca\x2e\xa9\x73\xe3\xa8\xb3\xff\xa3\x6c\x61\x8d\x42\x4f\x95\x85\x0b\x31\xb1\x0a\xfc\x1d\xd4\x21\x3d\xf4\x70\xb2\x02\x08\xef\xcb\xda\x26\x3a\x7f\x14\x8d\xba\x66\xbc\xb8\xb2\x17\x20\x7c\xf1\x69\xf1\x50\x2c\x5c\xea\x1e\x2b\x0e\xe9\x4d\x88\xb6\x33\x5a\x53\x97\x82\x5e\x63\xd1\x80\x18\xd8\x6a\x97\x8e\x81\xf7\x8b\xba\xcf\x1f\x4e\x2c\xeb\x12\x9e\x81\x87\x2a\x6f\x9c\x2c\xab\x5f\x19\x8a\x12\x2e\x4a\xa4\xe8\xbd\x17\x27\x56\x10\x3c\x1d\x87\xa0\xe9\xfe\x59\x16\x14\x43\x53\x97\x40\x20\x9e\x48\x8d\x2c\xd1\x2a\xb0\x19\xe8\x6e\x79\xb8\x02\x2d\xc3\xbe\x2f\x02\x5d\xf4\x33\xc1\x4f\x1e\x08\x3e\x70\xc1\x58\x9e\xa5\x05\x66\xa1\xd7\x3c\xc9\x72\x68\x3f\xe9\xba\x9c\x25\x57\x58\x11\x88\x91\x84\x4e\x98\x90\x01\x2d\x00\x2b\xfa\x64\x9e\x30\x16\xda\x95\xb4\x56\x13\x36\x60\x19\x0c\xad\x89\x28\x00\xbb\xce\x8b\x22\x2f\xd6\x49\x79\xc1\x1f\x2e\x88\xc0\xcb\x82\x4e\xe8\xca\x6d\x88\x30\x49\xad\x9f\x0d\xbd\x36\x65\x15\x00\x68\x6a\xb7\x4b\x36\xf2\x59\xc8\x0f\x5f\xc4\x77\xdf\x43\xb8\x5a\x52\x0f\x00\x1c\x92\xe3\x86\x58\x1f\xa2\x9f\x33\x6c\xdd\x27\x9f\xbb\xc5\x7e\xf1\x41\x50\xc7\x15\x7f\xd0\xdf\x3c\x28\xb5\xe9\xd2\xe1\x4f\x54\xa2\xd6\x2d\x0a\x18\x61\x89\x4e\x48\xed\xbc\xe5\x3d\x42\xbf\x44\x9f\xb9\x88\x16\x09\x5d\x22\x5b\x64\x74\x60\x28\xad\x72\xfe\x1c\x9c\x84\x76\x21\x5b\xb9\xed\x08\xb3\x08\x2c\xea\xc5\xd1\x35\xba\x62\xb7\xc9\x2a\x43\x70\x54\xa0\x54\xfe\x18\x8b\xbc\xcd\x2e\x3a\x4e\x50\x23\x05\xfd\x60\xfd\xdb\xe6\xfa\xe7\x2f\x74\x96\x4e\x2a\x41\x65\xda\xaa\xef\x85\x6e\x97\x80\xab\x4c\x96\xcf\x12\xcf\x32\xfd\x0b\x6e\x9a\xdb\x44\x23\x68\xcd\x43\xf4\xe6\xec\xc9\xd8\x52\x86\x3d\xa7\x7c\xcf\x09\x3e\x86\x7b\x20\xa6\x1a\xf7\xa2\xc3\xf6\x20\xaa\x18\x6b\x65\xf5\x1d\xfc\xad\x16\x24\x52\x00\x94\xc2\x05\xbe\x3b\xf7\x86\x6d\xc1\x96\x76\xf2\x0c\xd7\x0b\x31\xef\x97\xcb\xa4\x45\x89\x14\x11\x85\x20\xcb\xeb\x83\xb4\xf9\xbe\x3c\x88\xe3\x1d\x36\x8a\xf6\x8a\xa6\xea\xa4\x23\x6e\x49\x84\x9f\x81\xc5\x45\x02\x12\x93\x1e\x78\xda\x15\xd4\x4b\x30\xb9\xe0\x92\xdc\x34\x8c\x5f\x2c\x8f\xe2\x9b\x2c\x9e\xf2\xfd\xd1\xf5\xca\x88\x35\xa0\x8b\x27\x8e\x3b\xf6\xce\xbd\x33\xbe\x84\x9f\x3e\xd1\x4d\x44\xf5\xac\xe9\xad\xd7\x8d\x71\x63\x48\xff\x84\x2d\x12\x5a\x4d\xa2\xd5\x69\x11\x89\x54\x8f\x36\xcb\x9e\x1c\x46\x2e\x67\xb6\x3c\x5c\x06\x83\x0a\x1e\x53\x8d\x59\x8f\xca\xb4\x2e\x51\xcb\x74\xf0\x3c\x32\x43\x15\xe3\x6b\x6e\x37\xbf\x59\x40\x73\x6f\x4b\xf4\x5e\x42\xac\x29\x87\x31\x63\x8b\x53\x4b\x38\xf8\xd2\x28\x36\x8e\x06\x21\x18\x76\x30\x2e\x78\xc8\x01\xf3\xda\xe4\x45\x0f\xeb\xd4\x09\x21\xb7\x4a\x10\x79\x73\x19\x20\xed\x78\x9d\x03\xe8\xba\x2b\x5b\x78\xc8\x1b\x81\xee\xf7\x85\x33\x3a\x15\x1d\x06\x18\x00\x9e\xcd\x38\x17\x3a\x07\x9c\x05\x9d\x41\xf0\x70\xa0\xb0\x9f\x0b\x87\xc4\x29\x97\x6a\x92\xc3\xf0\xf9\x5b\x66\x4d\x38\xaa\x07\x7f\xfd\x44\xae\x7d\x70\xc8\x3c\x4d\x26\xf3\x99\x49\x09\x30\x67\xdd\xae\x08\xa4\x18\x89\xc9\x3f\x05\xba\x82\xcb\xaa\x26\xc5\x3c\xa6\xa7\x55\xea\x68\x50\x4f\xb6\xf0\x7c\x6f\x18\x31\xec\x01\x3d\x62\xe8\x67\x13\xcd\x67\x8e\xfc\x9b\x0f\xc9\x40\xf7\x5d\x1d\xa1\x99\xd1\x38\xb6\x1b\x73\xa5\xc7\xdb\xd7\xb8\x80\x52\xeb\x9c\xcb\xfc\x37\x30\xea\xf4\xf8\xdc\x05\x8f\xee\x3f\x2a\x36\x5f\x3c\xef\xad\x1b\x7c\x19\x3f\x11\xf7\x89\x1d\xf4\x5f\xc4\xc1\xfd\x1c\xe1\x54\x8e\x9e\x4a\x05\x02\xb4\x1c\x6c\x11\x1f\x9d\x07\x38\xa2\x58\xb2\xae\x46\x55\xe2\xc1\xf7\xf9\x90\x12\x0e\x8a\x70\x61\x51\x2a\x9c\x8e\x9d\xa8\x91\x12\x29\x5c\x2d\xb5\x0b\x2f\xe8\x9a\xac\xea\x29\x6c\x21\xb0\x89\xd3\x62\xfa\x7a\x38\x60\x5f\x8d\x07\xdd\x18\x8d\x0b\x24\xc4\xf8\xba\x1c\x8f\xde\xb7\xe8\x27\xb0\x39\x39\x04\x02\xcc\x04\x4d\x1e\x2b\x6f\xb5\x19\x10\xfd\xd1\x28\x74\x15\xb3\xa0\xcd\x0b\xb3\xdb\xa8\xe4\xff\x86\x66\xf4\x3c\x22\xf0\x27\xec\x4e\x8f\x1d\x87\x3b\x9b\xd8\x39\x5f\x49\x75\x9e\xae\x6a\x6e\x07\xdb\xe2\x2b\xf2\xae\xf4\xf5\x8c\xab\x27\x37\xcd\xf3\x8a\xe3\x83\xd6\xa3\x64\xf3\x19\x3d\x1f\x33\x2a\x5e\xee\xb7\x44\x1e\x69\xec\x04\x05\x09\x83\x2b\x18\x8d\xa2\x5d\xb9\xb1\xb4\x37\xe2\x98\xb5\x96\x74\xe5\xc5\xc0\x73\xd1\xb2\x3c\xc0\xe5\x82\xb9\xbc\xcd\x2c\x5d\x09\x60\x5f\xdb\x80\x54\x13\xf0\x39\xd5\x18\xe6\x4b\x3d\x46\x2a\xfe\xdb\xff\xf9\x0b\xc8\x80\x4e\x5b\x25\x9d\x6d\xe6\x09\x48\xe1\x94\x45\x53\x40\xcb\xa5\xbc\x13\xb7\xf1\xec\x3f\x40\xad\xdb\xc9\xaa\x6d\x1a\x50\xff\x2b\x90\x8f\x74\xb5\x15\x2f\xb1\xa0\xb5\xe2\x10\x44\xa3\x89\xad\x60\x79\x3e\x3f\x35\xab\x58\xf8\x6d\x64\x36\x68\x77\xaa\x01\x8d\xc1\xc6\x24\x57\xc4\x09\x14\x09\x0b\x25\x0e\x6e\xe7\x4e\xb5\x71\x28\xb6\x67\xcc\x7a\x5c\xc7\xa8\x4a\x46\x75\x0d\x7a\x34\x2b\xd1\x3c\xa4\x53\x06\xf8\xc6\xac\x00\xea\x78\xe2\x92\x3b\x99\x3f\x4d\x40\x36\x97\x05\x20\xdd\x17\x2b\x63\x2e\x87\xfd\xd5\x00\x64\xc2\x42\xbc\xec\x35\xef\x04\x0b\x8c\x44\xba\x5e\x8e\xb0\x80\x36\x79\x1b\x22\x18\x56\x3b\xd1\xfb\x49\xcc\xa0\xed\x6f\xb8\x7f\x7d\x0d\x62\x18\xec\xa9\x01\x26\x2e\x99\x36\x74\x52\xd4\x89\xcf\x73\xc4\x4f\x51\x29\xc4\xf3\x3e\x56\x98\x93\x47\x4c\x35\xa8\x35\x40\x30\x1d\x34\x11\x22\xfd\x74\xd9\x32\xe0\x5e\x6e\x57\x3d\x32\x08\xdb\x09\x08\x67\x30\x28\x46\xb3\x67\x1c\xf5\xa8\x8f\x0b\x71\xba\xe1\x8e\x28\x21\xe2\x04\x40\x91\xa1\xe1\xf3\x7a\x5f\x22\x02\x8c\x88\x47\x26\x9b\xd5\xf0\xa8\x3e\x47\x60\xc0\xab\x89\x92\x39\x03\x2b\xfc\xc4\xae\x0a\x79\x76\x26\xea\x00\xa3\x48\x9d\x5a\x1f\xac\x89\x4a\x15\x02\x0c\x35\xca\x0e\x79\x7b\x9b\xc8\x66\x77\x72\x7c\x6b\x6a\xd7\x8a\x06\xc8\xcc\x81\x7d\x61\xde\xda\x6e\x57\xd6\x0d\x9e\x4d\xb6\x2a\x34\x57\x08\x74\xc0\x62\x62\x78\xb0\xe3\xe3\xcd\x03\x06\x2d\xc5\xf7\x66\xa2\x11\xee\x1e\x1f\xd1\xa2\xf4\xc7\x73\xe7\x87\x4f\x5f\xd6\x7a\x48\xbd\xdd\xda\x0f\xbf\x7a\x49\x64\xe5\x9d\x1f\x7e\xfd\xb2\x06\x45\x39\xea\x60\x79\x41\xfc\xfc\x89\x5e\xb8\xb1\x6b\xc1\xc2\x98\xb2\x85\x6a\x84\x05\x10\x45\xde\x23\xf9\x9f\x30\x5b\x09\xdf\xd8\xc5\xe8\x81\x11\xb4\x20\x88\x2e\xc2\x0e\x99\x96\x79\x04\xd1\x3f\x62\xed\x6e\xa9\x7b\x50\x2f\xee\x64\xba\x7c\x43\xd0\xeb\x3b\x90\x52\xa8\x25\x9a\xc5\x8f\xb5\xdf\x9f\xeb\x9f\xfb\x85\xff\x0b\xa8\xe9\x3b\xbc\xe6\x1f\x5d\x3b\x67\x4d\x2e\xcd\x7d\x74\x41\x58\x42\xc0\xff\xdc\x1e\x98\x2a\x65\x3d\xbb\x77\xa6\x02\x52\xf5\x33\xf8\x8d\x9f\x63\xe9\x8d\xe5\x58\x92\xcd\xc2\xf7\x23\x5c\x50\x1a\xd8\xce\xc1\x54\x2f\x42\x85\xfc\x43\xd7\x7a\x15\x17\xb9\xd9\x48\x95\x73\x19\xab\xbd\x4a\xe0\xfb\x1a\x55\xaf\x2c\x6f\xa9\xd4\x73\xe4\x85\x0f\xcf\x1d\x57\x8a\x3b\x1d\x56\x86\xb7\x88\x18\x28\xba\x85\x0d\x9e\x61\x07\x82\xdf\xe9\x64\x06\x27\x87\x5d\x47\x64\x99\x8d\xc1\x7e\xe7\x19\xc0\x8c\xa0\xe6\xb6\xdf\x7a\xfe\xf5\x05\x83\x4f\x74\x00\x32\x3b\xed\x41\xcc\x28\x4c\x3f\xab\xf7\xeb\x4b\xa5\x0c\x54\x8b\x7b\x3b\x28\xb6\xe1\x03\x53\xb4\x08\x13\x36\xd4\x4a\xdf\xbb\x73\x62\x66\x10\x07\x5e\xa8\x68\x3f\xa0\x8b\xb5\x44\xf4\x35\x07\x59\xba\xfe\x79\x5f\x99\x54\xe2\x36\x3b\xa8\x1f\x5b\x62\x68\x89\x8b\x6b\xe7\x9c\xde\x59\x80\x10\xd9\x97\x46\x21\x89\x24\x8a\xb5\x18\x03\xf7\xd1\x57\x33\x31\xef\xac\xca\xe3\x8e\x83\x5b\x68\xdf\x2c\x38\xfc\x2a\xeb\xc2\xa3\x8a\x7c\x45\xdc\x1c\x88\x85\x44\xdc\x9d\xbc\x3e\x0e\x48\x83\x20\x8e\xc1\xf0\x75\x95\x1a\xb4\x7a\x8e\xdd\x4e\xff\x3f\x59\x03\xd6\x31\x8e\xdc\x0f\x9e\x7b\x29\xee\x81\xb7\xf6\x14\x83\x7b\xbe\x46\x95\x27\x16\x24\x05\xa1\x5b\x56\x5c\xa2\xb1\x21\x1e\x96\x19\x1c\x3f\x59\x81\x35\x3d\xcf\x29\x2b\xd4\x9b\x6b\x4e\x18\x68\x5d\xf9\x26\x43\x73\x2c\x9b\xb2\x8e\xed\x8a\x48\xb1\x93\x46\x59\xbd\x01\xb1\xd8\x61\x0d\xb1\x4f\x6c\xe5\x33\x3d\x27\x6f\x2e\xaf\xf4\x53\x6f\x96\xee\xec\x87\x4c\x64\x7e\x1a\x60\xd7\x3d\x6d\x3e\xc1\xe6\xde\x28\x86\x85\x25\x36\x74\x38\x30\x58\x70\xf5\x4c\xd3\x98\xf4\x12\xd7\xbf\x27\xf4\x7e\xd4\xa8\x29\x1a\x2f\xc5\x1b\xcb\xb1\xea\xf8\xa0\xc1\x25\x36\xc4\xb5\xe6\xf6\xc7\x89\x7e\x32\xba\x1c\xa0\x2e\x07\xfd\xb8\x38\x7d\xe8\xe5\xc7\x99\x68\x56\x02\xc6\x32\x10\xc6\x69\x19\xdd\x69\x48\xa7\x7a\xb5\x40\xc9\xa6\x65\x84\xcf\x54\x07\x33\x59\x4d\xcd\x0a\x7c\x5d\xd8\xcb\xf8\x48\x18\x40\x89\xad\xc3\x92\xc1\x88\xec\x55\xc7\xbd\xce\x07\xbd\x22\x76\xe8\x62\x65\x8e\x66\x38\x9a\xfc\x5d\xec\xdd\x40\x5a\x1e\x29\xa3\xbc\x12\x4a\x7e\xba\x35\x97\x50\xf9\xb7\x5b\x3a\x14\x36\x9c\x2b\xcc\xd6\x1e\xd9\x07\xed\xd0\xb9\x68\xaa\xae\x66\x73\x09\x32\xab\x29\xfd\x78\xfa\x0c\x15\x79\x2a\x0e\x28\x32\x3a\x1b\xc6\x22\xde\x90\x3d\x20\x8e\x5c\xbf\x5c\x8e\x62\x98\x27\x97\x96\x88\x7d\xd8\x78\xe5\x19\x9d\x10\x87\xcf\x77\x63\xc0\x5f\x38\xcc\x25\xb0\xf8\xf1\x5b\xa7\x49\x66\x83\xf2\xd1\x36\x35\x6c\x6e\x48\x7b\x48\x7f\x08\xf5\xd0\xf8\x9f\x85\x74\x08\x61\xda\x4f\xb8\xe7\x4f\x40\x8c\x64\x8a\x75\xff\x85\x7f\x08\xee\xd5\x8d\x8c\xf9\xcd\x27\x18\xe6\xfb\xe8\xfc\x19\x59\xc9\x71\xe2\xbe\x24\x75\x6a\xa0\x89\x62\xd2\x25\x73\x42\x92\x4f\xc4\x3a\xff\x73\x68\x0a\x1d\x82\xe7\x7f\x73\x40\x2f\xfd\xfa\x6b\xff\x55\xbb\xde\xd9\x6a\xed\x48\x13\x19\x01\x9d\x9b\xff\x50\xd7\xd4\xf8\xbf\x10\x19\xa5\x73\x37\x2b\x50\x0e\x48\x20\x22\x36\x23\xf7\xbb\x7a\xd3\x72\x12\x91\xa0\x3c\x16\x08\xf5\x25\x22\x97\x7a\x22\x01\x82\x77\x82\xe9\x84\x2e\x94\x3a\xfa\xfa\x13\x58\xf0\x42\xbc\x11\x4d\xe9\x23\x97\xfa\xc7\x36\x3a\x3e\x09\x31\x05\x57\x51\xc4\xcb\x14\x4b\x4a\x78\xb1\xd0\xda\x2d\xbb\x9b\x84\xbb\xb3\x38\xa7\xcf\xa5\x1f\x13\x70\xa2\x05\xac\x38\x0c\xfb\x9d\x70\xbc\xac\xb9\x71\x77\x4b\x5b\x13\x6d\x0d\x8d\x1a\x1b\xd7\xde\x67\xfb\x9e\x89\xf6\x1d\xa1\xb4\xe3\xa6\x14\xfb\x25\x17\xfe\x3c\xf2\x47\xf2\x8e\x48\xd0\x9a\xf9\xf9\xe6\x35\x5d\x7e\x9b\x6e\x20\xae\x15\xef\x10\xb6\xfa\xe6\x00\x97\xb4\x87\x8d\xc6\x87\x54\xba\xed\x10\xe4\x9c\x28\x33\xd6\x70\x6a\x3e\x05\x8d\x13\x7b\x24\x96\x90\x09\x22\x8f\x0b\x4c\xb1\x64\x03\x31\x5e\xbf\x22\x98\x70\xfe\xa1\x01\x49\x18\xe4\xd5\xed\x42\xd0\x11\x5b\xe9\xdc\xd4\xd7\x20\x38\xce\x64\x7f\xec\xab\x84\xc7\x28\x5c\xe2\xe9\x41\x06\xe9\x23\xdc\x3d\xaa\x68\x57\xd1\xab\xa0\x67\xe7\x11\xe3\x22\x83\xa2\xd7\x2e\x82\x88\x18\x4d\x00\x3a\xa6\x6e\x2d\x43\x66\x5b\xe8\x0d\xe3\x26\x2a\x68\xfe\xf1\x51\x9f\xfc\x60\x0a\x52\x3d\xfa\x8a\x1c\x59\x92\x75\xd9\xe0\x81\xa0\x3b\xe7\xe0\x34\x06\x9e\x0f\xff\xe5\x4e\xf6\x51\x72\x14\x05\x29\x1c\x62\x06\xe6\x24\x28\x82\x79\x3e\x15\xe1\x8f\x07\x22\x62\xff\xe7\x3f\xce\x02\xc5\x7d\xff\x18\x0d\xa4\x7f\x41\x95\x29\x61\x48\x50\x7c\x4a\x20\x32\xac\x92\xf5\xe5\x25\x82\x5d\x84\x93\x28\x97\x59\x4b\x80\xc1\xcc\x68\x2e\xf1\x56\x61\x5f\x03\x23\x77\x04\xc4\x1b\xce\xc6\x51\xfd\xa3\x31\x3c\x1b\x12\xaf\x10\x72\x72\x3c\x07\x08\x0b\x32\x2d\xbb\x74\xe6\xb2\x47\x8d\xdf\xa0\xe1\x7b\x95\x86\x9b\x47\x03\x0d\x84\x86\x6d\xb1\x69\x98\xaa\xa9\xca\x6d\x11\x6d\x9c\x50\x9e\x4f\x89\xd2\xbb\xfe\x39\xfc\xde\x9b\x8b\x86\x1f\xdd\x06\x3c\xe5\x35\xc3\x48\x73\xab\x91\x6e\x3e\xf4\x51\xf5\x73\xfb\x51\xbc\x66\xcb\x9e\xc8\xbd\xad\xa4\x2f\xf2\x81\x7e\xb5\xdb\x25\x43\x40\x03\x7b\x1c\xfa\x93\xd0\xa7\x2e\x1c\x62\x22\xbc\xdc\x59\x10\xa1\xe9\x76\x45\xff\x7d\xbc\xdb\x7d\x9c\x65\xb7\x27\x36\xa3\x77\x32\x89\x80\x48\x88\x27\x6f\x46\xaf\x7c\x78\xec\x39\x14\xf4\x15\x10\xc6\x37\x40\x23\x1b\x35\x04\xe7\xc9\xe2\xc1\xad\xdd\x4b\x6e\x1e\xb6\x2c\x3a\x4b\x1a\xb8\x16\xad\xc4\x97\xd6\x45\x9a\x61\x53\x4b\x0d\xa3\x34\x8a\xe4\x1e\x2e\x29\xe2\x2e\x82\x82\x98\x0a\x7f\x97\x49\x6a\xe0\x38\x31\x90\x1e\xc9\xde\x44\xd5\xe2\x49\xdb\xc8\xe5\x9a\x85\x59\xe6\x56\x0c\x35\x43\x67\x8c\xb1\x34\x6f\xa2\xfa\x09\x4f\xb3\xd1\x64\xa6\x48\x7d\xb8\x8d\xfc\x67\x51\xfa\x53\x53\x3b\x01\x36\x37\xfb\x9a\xcd\x0e\x44\x22\x2c\x9e\xd3\xff\xf8\x5f\xf3\x83\xdd\xa6\x88\xe1\xab\xd1\xf6\x0e\x09\x8a\x6e\x45\x65\xb2\x07\xf8\xce\x56\x1e\x08\x62\x98\xd2\x95\x5f\xb3\x81\xa6\x93\x8a\x64\xe5\xa6\x55\x61\x0b\x9b\xeb\x69\x90\x85\x2b\x4b\xd7\xfb\x20\x71\x87\x39\xbe\x36\x3c\x84\x77\xb9\x43\x18\x30\xa2\x17\xf0\x23\x2c\xc1\x63\xea\x95\xb8\xc8\xab\x1a\x21\x06\x39\x7d\x9a\xa2\x0a\xc9\x21\x05\x8f\x59\x79\x76\xa5\x41\x98\x62\x8d\x3f\x28\x3d\xcd\xdf\x1d\x35\x1d\xb5\x10\x37\xf9\xb5\x0d\xad\xdc\x86\xbd\x3a\x83\xeb\xd8\xe8\x81\xd1\x0e\x62\x65\xbc\x16\xd2\x9f\x9e\xc6\x08\xbb\xe8\x1a\x38\xa4\xf6\x5e\xe2\x0b\x70\x83\xa8\x6b\xb6\x3c\xd6\x7e\x59\xd3\x70\xa7\x86\xc9\x4e\x03\xe0\x69\xf0\xd8\x2a\x51\x41\x48\x9e\xeb\xf3\x6d\x40\x6f\x4b\x51\x29\x38\xee\x37\x5a\x8b\x2b\x63\x5d\x4b\x1d\xec\x86\x73\x87\x09\xea\xa8\xcf\x4c\xbc\xdc\xbe\x16\xc2\x2f\xa6\x76\xf9\xa9\x4b\xb8\x27\x29\x74\x02\xef\x13\xa3\xa4\x2c\xf0\x93\x52\xb2\xf3\xe4\x4b\x8e\xb6\x03\x8f\xc0\x0a\xef\xb5\x3b\x4e\xee\x71\xa0\x3e\xd6\x7e\x19\xa0\xde\xee\x94\xea\xbb\xd1\x86\x5d\xb0\x8b\x22\x81\xf5\x8e\x92\xc6\x0b\x60\x99\xc9\x47\x3c\xea\xa9\xc4\x6a\xee\xdb\x5c\xcc\x56\x6a\x3a\x55\xc4\x75\xf1\x9f\x83\xd0\xd9\x30\xdd\xee\xe5\x39\xe6\x44\x9d\x39\x07\x58\x8c\x1d\x4a\x4e\x55\x65\x5d\xbb\xc0\xc5\xa9\x2a\xd8\xac\xc5\xe3\x0c\x99\xcd\x4e\x55\x69\x0b\xd5\x1b\x71\x84\x3b\xfe\x37\x5b\xa1\x76\x7d\x83\xcb\xb2\xdc\xd4\x8b\xe7\x76\x85\x7f\xe4\xfd\xf7\x75\xde\x48\xd1\x37\xf8\x8e\xc4\x47\x7d\x19\xb1\xae\x79\x3a\x99\xa6\xce\x87\x1a\x08\xf6\x49\xad\x7d\x7d\xf5\x87\xfc\x3b\x39\xd7\xdf\x7d\x45\x98\xd9\xbb\x9c\x7c\x30\xb3\xbf\x44\xcc\x61\xc4\xf5\x60\x2f\xbc\x71\x87\xa8\x8e\xf4\x04\x55\xb9\x66\xcb\x6c\xed\x18\xdf\x61\xa5\x91\xb3\x71\x81\x2b\x25\xd2\x9c\x8d\x23\xe9\x3d\xbe\xa0\xdf\x84\x58\x09\x56\x50\x81\x76\xab\x85\x9e\x8c\x63\x02\xdb\x79\x30\x1d\x9c\xc0\x63\x8d\xfd\x6f\x12\xc5\x1d\xbe\x58\xad\x0b\xfc\xb2\xee\x4e\xc5\x21\x09\x0e\x46\x22\x53\x80\x7e\x0c\x23\xbe\xe8\xb3\x35\x61\x4e\x1f\x3a\xf7\xc0\xf6\x12\x22\x57\x3c\xb5\xeb\x32\x98\xa3\xc9\x5e\xe1\x21\xcd\x26\x0f\xe3\x68\x90\xf0\xa5\x16\xfe\xce\x37\xc1\xb5\x50\x54\xed\x92\x8a\xb0\x4f\x53\x82\x82\x60\x79\x10\x3a\xc3\x57\x03\x19\x88\xf8\x31\x10\x22\xe0\xb0\x6a\x39\x10\x0a\x5b\x59\x8f\x5a\xc0\xb0\x6b\xd8\xe2\x88\xcc\x7c\xbf\x34\x95\xf8\xa5\x3f\x8f\xda\x44\xf5\x07\x29\x9b\xde\xab\x9d\x7a\x07\xb1\x0f\x93\x8b\xec\xeb\x93\x7a\x71\x68\xaf\x5c\xbd\xf6\xd9\x8b\x51\x42\x54\x60\x94\x7d\xa9\x91\x95\xf1\x6e\xb7\x2e\xa2\xdb\x26\x0f\x36\x59\x04\x51\x32\x82\xa6\x8d\xe1\x4f\x09\xe2\x6b\x6f\x6c\x75\x62\xd3\xb8\xce\x52\xeb\xd0\xb9\x10\xdf\xd5\xd2\x3b\x93\x23\x5b\xcc\xfa\xb2\x39\x58\xfc\xff\xa6\x9e\xfc\x22\x07\x3d\x4d\xec\xaa\x73\x4b\x3b\xae\x39\x10\xb6\xa4\xf9\xf2\x94\x43\xdf\xad\xf6\xc1\x3b\x36\xa0\x55\xb7\x26\xdc\x96\xc9\xee\xc7\xfd\xc8\xcc\xea\xa6\xdb\xe2\x71\xed\xb6\x0c\xc8\xef\x35\xb7\xcf\x6e\xec\x74\xce\x21\x50\xf3\x54\x52\x80\x71\x28\xd4\x9b\xeb\x73\xe4\x55\xd7\xe8\x6e\x18\x43\xd5\xde\xb4\x0b\x72\xb8\xe7\xdd\x0e\xc9\x66\x91\x3a\x09\xaa\x28\x70\xf5\xf2\x84\xfd\x2b\x02\x35\xfd\x5b\xf2\xaf\xb8\xa0\xf4\x27\x27\xb4\xfa\xd3\xbf\x39\xe9\xcc\x84\xdf\xf4\xd6\x4c\xc4\xb2\x3a\x9b\xba\xe5\x79\xc2\x13\x6c\xdd\x8e\xb4\x01\xdc\x31\xdb\x1b\x5f\x55\x4d\x57\x02\xb7\xa6\x80\x53\x15\x3e\xdb\x6c\x52\xbb\x77\x29\x51\x7c\x38\x87\x03\xc3\x73\xdf\x69\x66\xd8\xce\x0d\x92\x10\x3c\x94\x44\xbf\x00\xa9\xac\xec\x91\xe8\x26\x5a\xf0\xf5\x1f\x6a\xe2\x3f\xfb\xea\x9c\xe9\x94\xc3\x58\x42\x4c\x53\x8b\x57\x91\xa4\x5a\x8d\x83\x35\xaa\x4c\x4f\x23\x01\x46\x6b\x1c\x3f\xde\xf3\xf0\xc1\x82\x2c\x0b\x9a\xa2\x82\x33\xa9\x18\xf6\x24\x0f\x9b\x57\x76\xdd\x6e\x4d\x55\xd8\x51\x23\xd9\x1b\x17\x34\x88\x6f\x39\xf7\xa2\x9b\x00\x45\x8e\xbc\x15\xa7\xfb\x9c\x27\x4f\x11\xb7\xb0\x2b\xc4\xab\x74\x28\x24\x29\xb3\x83\xba\x4c\x8c\xa7\xac\x14\x50\x4d\x24\xd0\xc7\x49\xe8\x40\x1c\x4c\x04\xc4\x9a\x4e\xa1\x19\x89\x0f\xfe\x7f\x99\x94\xd3\x49\x06\x4e\xc6\x1b\xdd\x5a\x38\x8e\x0c\xab\x8b\xbf\x7c\xc6\x9e\x57\xb1\x6c\x43\xd9\x83\xa3\xd1\x48\x4d\x9d\xcc\xd7\x4d\x31\xba\x4d\x45\x7d\xc1\x62\x20\x76\xa3\xaa\x85\xe5\x17\x17\x1c\xf1\xdf\x1c\xd5\x75\x2e\x7a\xce\xef\x6a\x68\xa1\x4e\x38\x9a\x38\x00\xce\x03\x3b\x8c\xee\x1a\x46\xa7\x15\xde\x82\xa3\xf4\xb7\xec\xb2\xa4\xa1\xb6\x06\x99\x27\xc6\xc3\x87\x47\x77\x0e\x74\x00\xf2\xdb\xb9\xc7\x5f\x69\x18\xff\x31\x88\x83\x7f\xa7\xcb\xdf\x11\xf7\x3e\x99\x2f\xe7\xa6\xa1\x7e\x45\x43\xbd\x30\xe9\x65\xc9\x39\x6b\x27\xc6\xda\x0d\xe3\x57\x4a\x80\xb1\x3e\xd4\xa5\x0b\xdd\x70\xe5\x02\x9f\x0a\xc7\x74\xfd\x73\xdc\x6e\x6a\x12\xc0\x72\xaa\xa3\x73\xc2\xba\xc3\x5e\xd2\xda\x22\xda\x0d\xbb\xe2\x23\x33\x12\xe4\xee\xed\x20\xdd\x87\x8b\x05\xf8\xd9\x88\x86\x60\x4d\xda\x77\xa6\xd6\x08\xfc\x9a\xd3\x28\x7e\xa9\x83\xaa\x23\x26\x39\x73\xf1\x7d\x50\xc9\x4b\x47\x00\xde\x44\x44\x6f\x71\x0f\xc6\xec\xc2\x64\xc7\xd1\x4d\x2c\x9d\xeb\x7e\xde\xe7\x9d\x94\x11\x80\x97\xef\xd4\x53\x5d\x84\x7c\x32\x4b\x91\xb9\x7e\x20\x3d\x56\x87\xfa\x60\xfc\x28\xbe\xe3\x00\x7e\x87\xb5\x9c\xea\xa8\x97\x39\xb7\x03\x54\x20\xca\x17\x2c\xbd\x6c\xda\xf9\x64\x24\x8a\xb5\xe3\xf9\x47\x93\x38\x89\x89\xde\x27\x5c\xc1\xe9\x5e\x7f\x35\xe8\x35\x0e\x90\xa0\x82\x8b\xd2\x09\x4a\xe3\xa8\xab\x07\xce\xb3\x8a\x40\x44\x60\x21\xce\xbc\xb0\xef\xac\x37\x1d\x10\x6b\x02\x0d\x0b\xc2\x61\x2b\x63\xcd\x38\x8b\x8e\x4e\xcd\x8d\xbd\x5f\x3e\x0d\x0c\x9a\xd8\xfb\x3d\x51\xc2\x8f\xc3\xc6\xd1\x24\x8f\x34\x5f\x02\x1f\x88\x82\x83\x23\x18\xf6\x1a\x02\xc1\xf7\x13\xb8\xb0\x0c\xa5\x47\x1e\x24\x6e\x9d\x64\x09\xfa\xd8\x17\x60\x1c\x27\xd1\xeb\x8d\x31\x00\xc7\xd7\x58\x8c\x03\x46\x6f\x6f\xc0\x1a\x99\x0d\x13\x8a\x11\x42\xbe\xfe\xd3\x44\x57\x0e\xf1\x3f\x77\x68\x1a\x72\xfb\x89\x19\xca\x73\xc6\x68\xbd\x2c\x4c\x14\x03\x2c\x7c\x4c\x82\x38\x17\x27\xe2\x5b\x04\x3c\x0b\xb2\x73\x04\xa6\x10\x3e\xf8\x1a\xf3\x14\x83\xd3\x37\xa7\x1b\x0e\x93\x46\xb8\x38\x65\x82\xb8\x07\xfd\x8c\x41\x28\x9a\x83\xc6\x99\x1a\xb3\xd1\x65\x35\x1d\x1b\xef\xf4\x34\x27\xdb\xf6\xa1\x92\x86\xb1\xb5\x7d\x5a\xc6\x5c\x96\xa0\x71\x51\x46\x03\xe0\x4d\x0c\x0f\xe8\xa6\x48\x53\x6e\x2a\xe2\x95\x34\xbd\x69\x43\x03\x94\xb1\x40\x30\xe4\x85\xd9\x94\x5c\xb2\xca\x85\x86\xb8\x62\x3b\x1e\x87\x6c\x9d\x07\xed\x38\xc8\x7c\xef\x3e\x0e\xc5\xe2\x6a\xb0\xf3\x8f\x83\xf7\xbc\xe8\xf5\x38\x99\xb8\xed\x73\x00\xc3\xd1\x5e\xcc\x23\x46\x09\x1c\x00\xc7\x24\x97\xfc\x52\x51\xb2\x3b\x7e\x54\x82\x18\xe4\xe3\xf8\xd3\xdd\x90\xbc\x52\x28\x9a\x1c\x79\x1e\x43\xe3\x41\xc4\x26\x0a\xc1\xfa\xcb\x0c\x84\x2b\x4a\xc1\xdb\x15\x0b\x52\x34\x86\x23\x3b\xde\x99\x0d\x46\x91\x8c\xb9\x36\x48\xe7\xc1\x6e\xe2\xc9\x93\xc7\xe7\x4f\x7d\x4e\xa1\xb4\xdc\x94\x5b\xba\x55\x1b\x04\x57\xe0\xdc\x9a\x40\x6d\x07\xcd\x6f\x07\x7f\x4a\x36\x83\x09\x33\xd6\x5a\xc9\x11\x02\x0b\x01\x8e\x95\x89\xe3\x9d\xd3\xeb\x2c\x99\xe0\x02\x95\xa7\xee\x38\x9b\x0b\x5c\xff\x95\x05\xf8\x37\xba\x98\xf4\x91\xf1\x5a\xb7\x66\xc2\xd1\x12\xc3\xae\x7f\x5b\xa5\x20\xba\x3c\x08\x28\x31\xda\xa3\x61\xc5\x69\x51\xfa\x81\xb7\xcf\x4c\x87\x2e\x8a\x04\xe6\xc1\xc2\x72\x26\x72\xa0\xa4\x3d\x24\xe2\xf5\x9a\xdf\x14\xb7\xe8\xf4\x94\xfc\x9d\x91\x82\x29\xb5\xb4\xbf\x35\xb7\x46\xfd\xcc\x39\x9d\x25\x75\x96\x13\xc9\xdd\x11\x12\xa8\xa1\x7c\xc9\x38\x4b\x76\x48\x93\x4f\x56\x57\xe8\xe9\xc4\x53\xfa\x82\x46\xa5\xa7\x0e\x11\xc5\x00\x06\x56\x14\xf1\xf5\xa5\xd8\xc1\x44\x59\x31\xbd\x10\xca\x9e\xde\xf4\xc1\x50\x3e\x12\x24\x77\xd2\xb9\x76\xc3\x38\x90\xc8\x26\x4e\x6c\xf2\xd5\x26\xd7\x45\x74\xec\x02\xe9\x52\xda\x5f\xb1\xd9\xe3\x26\xdf\xe2\xb8\xec\xa6\x2d\xb2\xb3\x04\x5c\xff\x4e\x12\x44\x5f\xd1\xac\x8c\x03\x5f\x77\x2a\xbe\xa3\xf1\x14\x9d\x5a\xf8\xfa\xbf\x4a\xba\x57\x3b\x55\x85\xc0\x02\xd1\x5c\x1e\x67\x00\x05\x44\xb1\x19\x57\x12\x55\x56\xbd\x78\x64\xd6\x48\xf8\x77\x88\x88\x54\xad\xb3\x97\x1c\x3b\x8b\x17\x2e\x64\xe2\x9b\x3f\x8e\x2b\xad\xca\xac\xf3\x11\x0e\x47\xf2\x52\x39\x2f\x2f\x34\x65\xdb\x18\xe5\xda\x73\x4e\xbf\xbc\x0a\x5c\xa8\x4b\x97\x94\x29\x6f\xe6\x89\x58\x65\x04\x75\x01\xcd\x7a\xb9\x58\x2f\x2f\x49\xbf\xe8\xee\x6e\x39\x90\x56\x20\x77\x80\x5e\x80\x89\x86\xb3\xde\x12\xa3\x63\x28\x18\x44\x5a\x56\x1a\x2e\x7c\xbc\x75\xe2\xe2\xfd\x2c\xe1\xdc\x04\xe5\xf0\xd1\x3b\xa2\x5c\x42\x08\x22\xf3\x9a\xd9\x23\x5c\x88\x98\x13\x07\x52\x7f\xd8\xa4\x6f\x34\x4a\xb2\xd8\xb0\xbe\xf9\x23\xad\x49\x93\xc1\xe7\x0e\x52\x07\x01\x8c\x3c\x7d\x0e\x5e\x9d\x77\x77\x3c\xb1\x20\x06\xd5\x00\x8a\x5d\x8d\x41\xd8\xc9\x61\x35\x25\xcb\xb4\x76\x14\x31\x1a\x1f\x26\x51\x7a\x70\xed\x80\x57\x11\xfa\x58\x52\xbf\x8a\x40\x08\xb8\xd9\xc9\x7f\xf6\x9c\x54\xcc\x65\x64\x93\x38\x1f\x44\xd4\xb2\x55\xc8\x1a\xaf\x07\x22\xf7\xc9\x75\xbd\xfe\x43\x1f\xe3\xd8\x47\x33\xfb\xfb\x9f\x59\x13\x9f\x23\x19\xc1\x85\x53\x1c\x0b\x63\x64\xf6\x5d\x23\x01\x71\x7e\x77\xfe\xf8\xd1\x59\xf2\xd3\xc7\x87\xc3\xe1\x63\x54\xfa\xb8\xad\xb6\xb6\xc0\x04\xe8\x76\xfd\xef\x0f\x1f\x9c\x25\x79\xb3\x9f\x7f\xf4\xdf\x0f\xbf\xeb\x55\x61\x99\xed\x38\x1f\x55\x48\x1a\xe2\x68\xfa\xf0\x2e\x41\x34\xd2\x90\xbc\x48\x2b\x8b\xe4\xf4\x1b\xfa\x13\x7c\x26\x4a\x63\xd3\x87\x54\x0f\xde\xf5\x61\x9d\x9c\xc6\x19\x88\x8f\x73\xdc\x81\x61\xbd\xc0\x08\x35\x10\x26\xbf\xb2\x2e\x94\xda\xef\x0c\x78\x08\x87\x5b\x0d\xf1\x64\x1c\xd1\x88\x17\xd6\x79\xa1\x92\x6e\xca\x6f\x86\x5d\x70\x84\x8b\xb2\xd8\x76\x2e\xe1\xb4\xef\x47\xa0\x06\xe5\x4e\x13\x36\x6c\xcb\x99\xf3\x2c\xd0\x30\x5b\xe6\xf5\x11\xbb\x08\x4f\x3a\x36\xce\x47\x63\x5a\x97\x41\x80\xb4\x41\x47\x12\x44\x9d\xda\x1f\x0f\xff\xf8\xcb\x96\xc8\x4a\xa1\x01\xde\xfc\xf1\x2c\x49\x59\x7b\xbf\xef\x7b\x1e\x37\x8e\xcc\x2e\xa6\x4b\xf5\x81\x56\x43\x83\x72\x1c\x07\x63\xb4\x2b\x81\x71\x4f\x64\xd7\x73\x43\xc5\x09\xfb\x25\xb1\xfc\xa6\x55\xb0\x9d\xcb\x59\xe2\x6c\xc1\xcf\xd8\x33\x16\x7f\x9d\xc3\xca\x59\xd2\x16\xfd\xbf\xc5\x15\x49\x75\x80\xee\x27\x1b\x75\xe0\xa7\x2a\x8c\x44\xd7\x64\xb3\xd1\x8e\xe0\xcc\x08\x0f\xec\xd3\xcb\x11\x23\x13\x1c\xba\x62\x8b\xbe\x56\xf2\x21\xbe\x7f\x34\x24\xda\x63\x3d\x9a\xe4\xe5\x94\x54\x9c\x21\xac\x6a\xbe\x4e\x1f\x5a\x0f\x8e\x29\xa9\x64\x39\xf6\x48\xa5\xeb\xa1\x0b\x3a\xf6\x2e\x04\xcc\x1e\x2b\xbb\x2b\xd9\x0d\x08\x57\x46\x71\xee\xb9\x7f\x74\xfa\xad\x9f\x8f\xb0\xa8\x23\x79\x43\x2c\xaa\xdf\x46\x75\xa3\x51\x86\xb4\xd3\x30\x81\xc2\x90\x3d\x73\x03\x45\x74\x63\xc8\xda\xa4\x72\x6b\x99\x76\x41\xc2\x14\xd5\xee\xda\x49\x3c\xc4\x53\xf1\x48\x68\xf0\x40\xb0\x93\x2f\xe3\x87\x1e\xf5\x33\x49\xff\xf7\x3f\x43\x9b\xb3\x56\x6b\xc6\xe3\x20\x9c\xf3\x39\x9a\x10\x53\xc1\x8e\xd6\x41\x40\xd3\x88\x4b\x1b\x62\x20\x09\x03\xca\xb1\x58\x87\x45\x44\xb7\x9b\x1c\xf1\x7d\x77\x36\x54\x34\x2a\xe6\xba\x34\x45\x61\xb7\x8b\xef\xe8\xd5\xbd\xfe\x39\xdc\xad\xfd\xb6\xec\xa2\x24\x26\x87\x0c\xc2\x32\x08\x6d\x0f\x03\xb6\xbb\xaf\x1c\x05\x98\xf6\x0d\xcc\x54\xbf\xb2\x1f\xc3\xbe\x21\x0a\xa0\x27\x79\xcb\x08\xb2\x8f\x50\xaa\x99\xf1\xb3\x92\xf3\xad\x76\x90\x65\x3d\x95\x5c\x01\x9a\xfb\x08\x12\xc7\x8d\x4f\xb6\x22\x49\x47\x38\xd3\x4a\x1f\xa7\x34\xd8\x33\x0e\x68\xd4\x2f\xf0\x91\x06\x8e\x96\x04\x91\x9c\x7c\x34\x88\xe8\xdc\xcf\x2d\x94\x9d\x84\xe6\x61\x53\xab\x1b\xc6\xac\xf6\x75\xde\x1a\x6e\xfb\x70\xec\x37\xe3\x54\xb8\xed\xb0\xb3\x61\xcc\xed\x43\xd8\xfc\x6d\xf6\x0d\xd1\x39\x86\x31\xb5\x1f\xf5\x11\xb4\x83\x0e\x43\xab\xa7\x90\x4d\x91\x6b\x7d\xeb\xc4\x39\x3b\x56\xcd\x99\xef\xbd\x1b\x74\xbc\x43\xb0\xed\x60\x66\x37\x73\x70\x41\x98\xda\x56\x9c\x55\x86\x17\xea\x1d\xf8\xb7\xa9\xd9\xc5\xc1\xb6\x83\xf9\xdc\xcc\xcb\xcd\xb2\xfc\xe2\x62\xbe\xaa\xca\x43\x8d\x78\xd5\x6d\x95\xb2\xdb\xa6\x5d\x6f\x41\x10\x5e\x25\xd7\x7f\x25\x3a\x0e\xe1\xcd\xa4\xa2\x04\xbd\x58\x54\x08\x5f\x98\xca\x27\x31\xe1\x59\xc8\x1f\xf9\xc4\x36\xcb\x2c\x16\x79\x65\xf2\x2d\x14\xca\x8b\x6f\x1d\xb9\x66\x93\x82\x78\x01\xf1\x43\xe0\x7b\x03\x06\x42\x77\x04\x42\x41\xee\x80\xb3\xbc\xe3\x5f\x1c\x87\xdb\x67\x79\xc7\x0f\x44\x6d\x62\xe3\x6e\xea\x20\xa8\x5c\xef\xb7\x44\xde\x23\xf8\x11\x47\x51\xdd\x00\x5c\x91\x85\x0c\x34\x52\x5f\x8b\x96\x7d\x41\xec\x93\xd4\x7b\xc1\xbf\x36\x12\x7f\x0d\xe1\x38\x37\x5a\x13\x43\xaa\xf7\x91\x12\x21\x77\x32\x9f\xd0\x23\x08\x5d\x19\x08\x9b\x93\xa0\x26\x5f\xe0\x3f\xf4\x85\x79\x58\xa8\x5b\xff\xe6\x8f\xbe\x5c\x4f\x80\x10\xe3\x97\xdf\x3e\x92\x1f\x1c\xd3\x89\xbd\x8e\x9f\xbb\x40\x52\x3c\xa6\x94\x6a\x1a\x9f\x3d\x47\xb4\x40\xfa\x2b\x44\xa2\x42\x89\x0b\x77\x28\xc1\xa8\xa4\x32\x82\x56\xed\x68\x81\x6a\x19\x4f\x08\x46\x63\x5a\xee\x99\x1b\x63\xb1\x6c\x90\xe2\x5c\x06\x83\x15\xb9\x37\x94\x46\x67\x41\x3c\xc6\x89\x7d\x98\xb9\xc0\x5c\xf3\x51\x80\x2e\x57\x20\x91\xd5\xf8\xdf\x92\xb1\xe5\xd0\x09\xaf\xeb\x2a\x64\x95\xb9\x20\x02\xf9\xb8\x21\xb0\x72\xdf\x68\x81\xae\xcd\x73\x51\x9d\x1e\x04\x4c\xfa\x7e\x69\xe6\x2b\x56\xcd\x9b\x55\x0e\xbb\x59\xf7\x9d\xad\x40\xc5\x9a\xcc\x7f\x33\xe0\x90\x83\x23\xed\x4f\x48\x60\x57\xe4\x28\x77\x6a\xc2\xec\x2a\x93\x19\x2c\x42\xae\xc7\xd2\x85\x56\xf3\x77\x03\x66\x9b\xe1\x42\x7b\xbb\xd2\xa7\x82\x67\xb4\xa3\xde\x5a\xfc\x4a\xed\x82\xb3\x76\xd3\xcc\xa3\x49\x07\x8d\xcf\x3d\x2d\xc4\x56\xdc\x04\xcd\x05\x8b\x31\x01\xf9\x2a\x8c\xa0\x3b\xfd\x8f\xbf\xa4\xa1\x78\xb2\xdc\x25\x47\x1a\xa2\xa5\x53\x62\x8a\x38\x48\x49\xd3\xb2\x81\x61\x89\x4b\xe6\x46\x24\x6a\x36\x8a\x48\x6e\xd6\x6d\x50\xc6\xfc\xd3\x3d\x0e\x95\xdc\x57\x1f\x44\x83\xed\x43\xdb\x75\x68\x7e\x96\xb8\x74\x73\x6d\x6f\x54\x08\xb1\x1d\x3d\x96\xa6\x16\xb5\xbd\x86\xb0\xf6\x9d\x86\x0f\x98\xfb\x38\x7c\xb4\xdc\x77\x31\x1b\x7b\x24\x0e\x7a\x01\x9c\xf0\x85\x7e\x52\x66\x8c\xb6\x7c\x01\x18\x38\xf0\x1a\xd7\xff\x97\x24\x37\xca\x39\x00\xd1\x18\xbc\xe2\x30\xfb\x87\x13\xb0\x16\xd4\xd7\x4d\x78\x4c\x2c\x27\x21\xdb\xc6\x81\x8a\x55\xa1\xaa\x28\xa3\x5d\x0f\x6f\x5e\xf7\x63\xc6\x66\xc1\xbe\x67\x6c\x0b\x91\xe1\x9c\xfd\x6e\xc3\x04\xa7\xa8\xb3\x3d\xe4\xc1\x92\x52\xae\x88\x33\xa5\x8c\x6e\x0a\x43\x8e\xbb\x2b\x6a\xfc\x3c\xba\x61\x42\x76\xba\x5a\x5e\xaf\x37\x59\x2f\xb2\x10\x1e\xde\x83\xb7\x48\x32\x15\xd8\x27\xdf\xc1\x52\x05\x58\x9c\x2c\x81\xe0\x05\x77\x8e\x85\x43\x27\x1f\xbd\xd1\xa0\x9e\xde\xd6\x2d\x7f\x8b\xf2\x6a\x08\xea\xb1\x15\xa6\x43\x2c\x42\x9f\x28\x65\x82\x6b\xc0\xe4\x09\x91\xc7\x9e\x3e\x19\xf5\xa3\xb6\xf1\xc1\xd5\x19\xc7\x17\xed\x67\xaf\x9e\x7d\xce\x37\x89\x3d\xd0\x20\xb9\xa6\x6d\x9d\xfd\x50\x56\xeb\x97\x7d\xbe\x5a\x55\x3d\x8c\x72\xd5\x72\x0d\x9f\x2e\xce\x55\x7b\x62\xaf\x7f\xf6\xd9\x5b\x87\xb5\xc3\x08\xe6\xd7\xff\x0e\xdc\x5e\xb8\x20\xe6\xa1\x99\x41\x18\xc3\x3c\x41\x02\x36\xd3\x1c\x58\xba\x7e\x34\x12\xc3\xbc\x91\x9c\x3a\xca\x1f\x23\x49\xa6\x23\xa1\xfa\x6e\x18\x5c\xf7\xa5\x37\x46\x7d\x11\xf2\x3f\xe5\x6c\x4f\xdc\x2c\x42\x91\xb4\x9c\xbf\x9c\x36\x0f\xf1\xf4\x6a\x62\x05\x24\xae\x0b\x21\x43\xa2\x78\x37\x25\x32\xc7\x73\x06\xde\x7a\xf1\x42\x92\xed\x76\x33\x0e\x0b\xa7\xca\x8f\x7a\xe1\x92\x70\xd2\x6a\xb4\x24\x4a\x2b\x19\xc4\x26\x0f\xc3\x7a\xa2\xcb\xd0\xd0\xb9\xe3\x5c\xbe\x40\xae\xbc\x51\xbd\x33\x85\xcf\xfe\x3b\x4c\x35\xce\x05\x13\xf5\xdc\xfe\x7e\xe9\xd3\x25\x48\xb8\x6b\x22\xb9\x1a\x9f\xf3\xcf\x4b\x8f\x3a\x09\x00\xcd\x37\xc5\x67\x13\x3e\x24\x99\x3a\xb9\x21\x6e\x9b\x1f\xc8\xf5\x4c\x77\x63\x07\xb9\xf3\x0e\x97\x89\x05\xcb\x1a\xc8\x84\xe7\xff\x1b\x69\x10\xc5\xd0\x55\x49\x0f\x58\x98\x9c\x5e\x04\x67\x3b\xa2\xb9\x3d\x60\x45\x92\xf0\x03\x31\xe8\xe8\x74\x68\xe5\x10\x5a\xfe\x53\x22\x2b\x4f\x77\x38\x08\xac\x3c\x61\xf4\xf9\x56\xab\xe5\x1b\xf2\x29\x86\x92\xee\x30\xb1\xa2\xff\x3e\x99\x61\xf1\x9f\x35\x88\x8d\xab\x4f\x65\xcc\x0b\xf7\xe0\xbd\xf4\xe5\x6a\x6b\x4b\xed\x6f\x4e\xae\x78\xc6\xea\x37\x97\x4f\x11\x8a\x58\x08\xeb\x91\x56\x31\x77\x39\xe7\xc0\xc8\xf6\xd3\x18\x8b\x43\x06\xf9\xfe\xee\x72\x92\xbf\xa9\x99\xdf\x94\x3b\x72\xda\xa6\x24\x42\x1d\x43\xe9\x48\x9c\xd8\x02\x9e\x06\x37\x56\xd7\x2d\x78\x1c\xe4\xcd\xf5\x32\xa2\xd0\x9c\x03\xa8\xec\x2c\x41\xee\x95\x9b\x6c\x47\x58\xe7\xe0\x0c\x47\x42\x03\x88\xf7\x4a\x78\x31\x9c\x23\xf0\xcc\x28\xeb\x45\x88\xb1\xa7\x1a\x08\x65\x12\x67\x04\xbe\x61\x65\xe9\x5b\x79\xc7\x40\x89\x13\x69\x75\xf3\xb3\xa4\xad\x5a\x82\x2c\x80\x90\x98\x78\x0e\xc5\xb2\xc3\xa8\xdb\xfd\x86\x1d\x18\xd5\x45\x80\x34\x53\x7c\x3d\xd7\xbf\x97\xf9\x7e\x79\x22\xd5\x45\x98\x57\xd9\x7c\xe6\x1b\x8a\x8d\xa7\x4f\x09\x6c\x07\x05\x0e\x3b\xd6\x92\xe8\xa2\x3b\xc2\xcf\xca\xd5\xa8\xf2\x57\x90\xf3\xba\xe4\x13\xc3\x02\xd7\xb6\x75\x76\xa4\xf9\xd5\x60\xbe\xcb\xaa\xa4\x83\xfa\xbe\xdc\x06\x13\x9a\x08\x5d\x11\x37\x22\x4c\x8d\x85\xd8\x8d\xff\x2e\x06\x0a\x6a\x7d\xe1\x3e\x12\x49\xf0\x0a\x3e\x34\xad\xb8\xdb\xe9\x57\x7d\x12\x83\x93\x51\x8b\x11\xdd\x1d\x36\x90\xb8\x53\x7f\x36\x6c\x40\xb5\xfc\xfb\x29\x8e\x04\xf2\x7e\xce\x91\x81\xd9\xa7\x5f\xd6\x6f\xf1\xd0\xf2\x0d\xe4\x90\x8b\x6c\x7b\xbf\x4f\x5f\xa4\xf2\xad\x71\x25\x1f\xab\x3e\x78\x3b\x7a\x2b\x0f\x49\x15\xe4\x59\x49\xc3\xe9\x4f\x34\xce\xb9\x0b\x60\x1e\x26\x10\x99\xeb\x00\x51\x80\xdd\x60\x1a\xec\xc5\xd6\x4e\x54\x7a\x97\x69\xc8\x1a\x44\xb1\x01\x3d\x41\xdd\xd1\xe1\x49\x94\x10\xcd\xa9\x33\x08\x23\x2f\xc3\xb0\x7d\xa5\x9b\xcb\xb3\xa1\xe1\xa5\x99\xa8\xf5\x6e\x7b\xe2\x86\xc7\xc3\x0c\xf6\x69\x72\x43\x20\xb2\x37\x47\x96\x22\x1c\x74\xae\x4c\x2d\x4f\x9a\x8d\xc9\x4c\x5c\x58\xf4\x68\x74\x67\x72\x17\x6c\xdf\xd4\x7b\x2a\x25\x0c\xda\xf5\x88\x88\x08\x61\xdd\xaa\xb2\x08\x89\xae\x58\x49\xee\x8f\xe8\xdd\xf1\x44\xae\x7d\xf4\x41\x39\x69\x8d\x03\x73\xd6\x10\xab\x44\x18\x45\x66\xea\xc8\xc0\x7b\x3d\x19\x18\xd3\x68\xef\xfa\x50\x4b\x5d\x17\x0a\x9a\xc9\x43\x79\x6b\x82\x4d\xf4\x27\x9d\x71\x0d\x67\x80\x23\xd7\xd3\xdf\xcb\xc1\xf0\x41\x97\x3d\xbe\x17\x4e\xea\x86\x9a\xe3\x03\x1c\x39\x9c\x75\x82\xdf\x6f\xf4\x90\x4c\x7e\x17\xa0\x0c\xde\x1c\x51\xa3\xb7\x6c\x04\x0c\x15\x6c\x70\x70\x2e\xee\xd6\xf4\x2d\x08\x67\xe7\x2d\xd1\xa2\xc9\x9d\xf0\xae\x9c\x87\x38\x63\x08\x52\xd1\x12\x69\x1b\xed\x14\x24\x29\xee\xf1\xa0\xf0\xd9\xc4\x8a\x4e\xa2\x98\x30\x3b\x91\xdb\xf0\x18\xcb\xfc\x53\x73\x12\x44\xf4\x3e\x53\x8a\xf0\x4d\x9c\xc7\x64\x38\x2f\xc1\x25\xef\x3e\x2f\x7f\x81\xf8\x32\xbe\xf3\xa4\xce\x22\x24\xe4\x51\xcc\x04\x6a\x79\xfb\x94\x4f\x25\xf3\x1f\x02\xb9\x9a\xd6\x31\x6f\x18\x9a\xd6\x05\x61\x5b\x23\xf9\xf7\x7c\x3e\xbc\x75\x7d\xe8\x5c\xbd\x79\xb1\x1d\x67\x3c\x9c\x9a\x04\x4a\x0e\x21\x7e\x76\xfb\xde\x0a\x7a\x9b\xc1\xf5\x43\xb1\xc6\x15\xbe\x8f\x6c\x79\x9d\x64\x94\x38\x61\xcd\x24\x25\x46\x7a\x67\x61\x02\x20\x4e\xf2\x05\x17\xdc\x04\x92\x0d\x61\x28\x91\xa0\x9f\x4f\xf0\xe5\x2c\x33\xf5\xe5\xaa\x34\x48\x3c\xdd\x6e\xf7\x79\x33\x83\x76\xbf\x0e\x54\xfb\x69\x37\x73\x58\x4d\xf9\x97\x20\xa7\xfe\xa9\x3d\x45\x96\xa5\x4b\x04\x0f\x54\xfe\xe4\x19\xc8\x4d\x2a\xb3\x5b\x79\x98\x24\x13\xdb\x1a\x4e\x26\xf4\xa7\x65\x33\xe6\x99\x9a\x10\x23\x03\xb6\xb7\x99\x33\xea\xad\x04\xcd\xd9\xae\x2c\x30\xd4\xe2\xa1\xfc\x15\x01\xd9\x2c\xf0\x38\x7e\x22\x9e\xc6\x46\x52\x71\xf2\x27\xe7\x61\x3a\x6b\xca\xc6\x6c\x17\x8f\x59\x3c\x69\x77\x9f\x21\x54\x43\xbf\x76\x16\xa1\x23\x58\x75\x0a\xc9\xac\x8a\xec\x83\x62\xb6\xd2\x71\xdc\x9b\x18\xec\x84\x8d\x79\x86\x2c\xf9\x6f\xe1\xec\xca\xd2\x4e\x9e\xa2\xf1\x8e\x5a\x13\x43\x89\x13\xf1\x97\x06\xf2\x6f\x31\x2f\x81\xed\x20\xd4\x55\x1c\x44\xed\xf3\x15\x8b\x7c\x57\x5f\x0c\xbc\xf6\xcf\x82\x92\xc8\x78\xb2\xff\xac\x59\x70\xbd\xcf\x51\x7a\x19\x96\x46\xb7\x24\xea\x2d\xc8\x9c\x14\x37\xd9\x73\xee\xa4\x72\xd8\x93\xd9\x0c\x06\x66\x5d\xea\xa0\xd7\xde\xb3\x2c\x9a\x22\xeb\x54\x1b\x82\x89\xf8\xeb\x74\x76\xd0\xf1\x2c\x87\x4b\x16\x9f\x9e\xc1\x20\x90\xec\x5d\xff\x21\xfc\x82\x04\x39\x45\x22\x72\xf1\x3a\xaa\xea\xcd\x6a\xa2\xf9\x88\xaf\x8d\x7a\xe8\xc7\xf3\x90\xa0\xb2\xe1\x97\xa3\xc1\x70\xc9\x44\x3f\x7a\xe5\x87\x5f\xa5\x7e\xe0\xfb\x9c\xc7\xc5\x42\x09\x3b\xd2\x69\x02\x1c\x43\xb9\x8f\xf3\x0a\x99\xac\x57\x1f\x72\x97\xe2\x46\xc9\xeb\xa9\x5a\x55\x4b\x37\x15\x3c\x55\xb9\x0b\xca\x61\x99\x81\x38\x2f\x9c\x57\xb5\xe4\xb4\x51\x42\x78\xb0\xe0\xd0\xa9\x09\xd9\xb2\xb3\x4b\x1e\xdf\xa5\xf2\x1b\x1b\x07\xf6\xce\x3e\x47\xdf\xa9\x8e\x26\xa5\x0c\x81\xef\x47\x3f\x8e\xbe\xfd\x44\xec\xc2\x54\xc3\xf4\xbc\x6e\x3d\x4a\x9c\xe6\x8d\xe7\x7c\x0a\xc7\x77\xe8\x65\x7a\xd6\x51\x3f\x13\xde\x29\x11\x8d\x31\x1a\x86\x5f\x18\xbc\x35\xf9\x2b\x3b\x9e\x26\x17\x44\x49\xc2\xa0\xb9\xba\xb9\x93\xa9\xbc\xce\x6e\x32\xe5\xdb\xfa\x9e\x98\x21\x3f\xee\xc5\x5a\x1e\xb4\xd1\x0c\x2b\xbb\x29\xab\xac\x1b\x22\x14\x7d\x95\x84\x80\xe3\xb3\x63\x09\x32\x0c\x6d\x6e\x1e\x60\x62\x8f\xdf\x7b\x88\xb3\x77\x07\x99\x75\xde\x2c\xd7\x69\xb4\xb6\xeb\x3f\xed\x10\x02\x24\x39\x9e\xdc\xf5\xb0\xd1\xe4\x7c\x03\xb2\xc2\x68\xca\x77\x4c\x06\xe1\xa7\xd0\xb7\x98\x66\x4e\x42\x45\x65\xd9\x81\x1e\x51\x81\xeb\xfa\x92\xcd\x2b\xe4\xbe\x9a\xac\xbd\x72\x26\x1a\x3e\xa3\x38\xd2\x75\x42\xf7\x92\x7c\x30\xa7\xda\x9f\x48\x90\x78\x18\x4c\xb1\x61\xc6\x07\xc9\x87\x44\xc1\xaf\xcd\x67\xbe\x5d\x49\xcf\x8c\xbc\x2f\xce\x09\xdb\x6f\xca\x47\x37\x4e\xa2\x87\x29\x9d\x8c\x3a\x97\x8d\x1f\x99\x70\xc5\xa5\x48\xeb\xea\x76\x43\x6d\xe1\x02\x37\x39\x44\x60\x96\x24\xfd\xb3\xaa\x48\x0e\x53\xca\xc4\xe8\x35\x26\xec\x3e\xec\x53\x07\xc2\xf0\x9e\x65\x88\x9c\x10\x51\xd2\xa6\x89\xb2\x82\xf7\x66\xd3\x93\x17\xf9\x89\x55\x86\x53\x98\x38\xd0\xb7\xcd\x65\x0a\xda\xf6\xb2\x10\x16\x81\x86\x63\x22\xe9\xe4\xe0\x4a\x3d\xf1\xf1\x5b\x0b\x0e\x6b\x20\xd6\x5b\x53\xe0\xe4\x81\xbe\xbe\xf1\x5e\x4d\x8d\x72\x33\x9c\xde\xd4\x71\x74\x9b\x74\xa6\x47\xc9\x9a\xa9\x6e\xcd\x01\x24\x87\x34\x0e\x44\xf1\x15\xed\x6d\x93\xc3\x4c\x94\xff\xb8\x2c\x7a\xe1\xe3\xd0\x56\xb0\xce\x58\xae\x89\x98\x6b\x89\xf5\xb5\x8b\x2f\x71\x82\x1c\x5d\xfa\x6b\xf7\xad\x9e\x68\x40\x6c\x2d\xb2\x9d\xb4\x1c\xdb\xa5\x6f\x03\x42\x89\x8d\x57\x58\x07\x94\x86\x4f\x21\x93\x7f\xae\x1d\x24\xfc\x29\xeb\x7c\xee\xd1\xda\xc0\x7b\x34\xec\x55\xd5\xa9\x05\x86\xf1\x99\x70\x83\x1e\xb4\x6d\xb9\x6a\x0c\x07\xf0\x78\xe2\x92\xe5\xb6\xb4\xa9\x1b\x64\xca\xeb\xeb\xee\x4b\x0e\x3a\xb0\xdc\x12\xc0\xb4\xfb\x25\x96\x0f\x01\x80\xa9\x93\x72\x03\x05\xf1\x96\x75\x2a\x07\x6a\x86\xfc\x67\x9b\x18\xc5\x0c\x26\x19\xb6\x36\x48\x27\x08\x19\xf6\xc4\x0a\xb5\xd9\x45\x65\xa3\x26\x30\x09\x2b\x72\xf1\xf1\x1f\x37\x72\x1b\x7a\x69\xcd\xfe\xe4\x76\xd6\x4d\x59\x87\x14\x2c\x57\x3e\xb9\x1d\x08\xb3\x4b\xdc\xf5\xc4\xae\x84\xed\xf2\x0c\x9e\xaf\x83\x36\x2b\x7b\x64\x27\xeb\x93\x8d\xd8\xf4\x8b\x79\x93\xf0\x98\x6f\x9c\xa0\x2a\x34\xc7\x13\x84\xd6\x06\x76\x21\xa3\xc1\xca\xd5\x95\x4d\x89\x6e\xf8\x76\x2b\xc2\x5e\x48\xbe\x24\xb2\x20\x52\x41\x52\x63\x4e\x0e\xed\xdb\xac\xca\xb2\xc1\xd5\xd9\x83\x01\x60\xeb\x68\x0e\x51\x14\xee\x5d\xe2\xeb\xc4\x7c\x00\xd5\xbe\x61\x1b\xd1\x70\x62\x17\x77\xc8\x97\xb9\x44\xb6\xc0\xb4\x69\x09\x91\x8d\x06\xac\x5a\x22\x28\xab\xe4\xe1\xf9\x1e\x06\x47\xa7\xdb\xf9\x31\x9f\xc9\x20\x7d\xdb\x6e\xdc\x38\x35\xe9\xa5\x7d\x97\x51\xef\xa1\xe2\x8d\x2d\x6f\x1c\x77\xd8\x9c\xb8\x87\x8b\x7c\x0b\x54\xb6\x6a\xd3\x8d\x45\x72\xb3\xfa\x72\xc9\x46\x34\xa3\x8e\xa0\xd4\xc6\x63\x64\x90\xbc\xe7\xc8\x7c\x0c\x07\xb6\xb8\x00\xf5\xce\x9a\xeb\xe0\x1d\x4f\x69\xeb\x1b\xc3\x86\x5f\xbe\x1f\x77\xe2\xba\xeb\x1c\xfd\xd4\x05\xfd\x62\xaf\x90\x7b\x21\xd9\x4c\x0c\x2e\x62\xde\x30\xef\xa7\x97\x15\x44\x74\xdf\x5b\x41\x4b\x6b\xdd\x1a\xf5\xea\xda\x80\x9f\xed\xfb\x42\xbc\x75\x21\x2b\x88\xf3\xe2\xb0\xcd\x6a\x5e\xd6\x9b\xce\xda\x78\x74\xe6\x70\xa9\x05\x23\x58\xc1\x2c\x19\xbc\xb2\xd9\xe0\x76\x1d\x9a\xfe\xc7\xed\x04\x0f\xba\x86\xe7\xed\xce\x48\x10\x8f\x84\xcd\x5d\x0e\x48\xfa\x49\x8f\xab\x44\x04\x19\x2d\xd9\x37\xde\x1b\xdc\xc3\xf7\x6c\xed\xa6\x2c\x8d\x7b\xe3\x60\xdf\xca\x4e\xb5\xd2\xa9\xf6\xd7\x51\x57\x46\xd4\x1a\xd5\x13\x69\x85\xf8\x1c\x52\x17\x08\x5a\x45\x80\x6b\xb7\x74\x8f\xe8\xff\xd0\xf7\x1e\xdf\xbc\xce\x24\xc4\x09\x88\x74\x1b\x05\x08\x30\xda\x1c\xfa\x76\xa7\x1a\x7b\x61\xc0\xa7\x5d\xff\x4d\x52\x68\x4a\x6a\x7a\xad\xe5\x79\x2d\xfd\xe0\x98\x84\x4c\x0c\xc6\x25\x8e\x93\x16\xf5\x81\xa5\xf4\x8b\xbc\xf7\xa1\x88\x44\xbe\x6b\x6e\x06\x6f\xbe\xef\x7a\x60\xf7\x83\xca\xae\x21\xfd\x91\x98\x05\x17\xdd\xe2\xb9\x08\xc3\xae\x06\x6e\x85\x90\x7c\x41\x1d\xcd\x74\x0e\xa8\x9f\x13\x6b\x0c\x2c\x54\x5d\x06\xfd\xd0\x2c\x35\xb6\x48\x71\xf9\x03\xe6\xda\x41\x18\xc0\x5b\x17\xc9\xdc\x9c\x98\x60\x5e\xff\xbf\x6a\x5a\x96\xb4\x81\xa8\x87\x2f\x9d\x54\xe6\xfc\xb6\xa2\xa7\x2e\x6c\xd8\x01\xb3\xe4\x21\x23\x4b\x1f\x34\xeb\x74\x3b\x94\x1a\x49\xb3\xbd\xa9\x6b\x9a\x5c\xd6\xe7\x52\x17\x9f\x26\x97\x67\x54\x42\x59\xb3\xe0\x5c\x1c\xae\x9c\x09\xa0\x5f\x8b\x12\x7d\x82\x1b\x6c\x40\xe1\xe2\x77\xcc\xcd\xdd\xa4\x26\xee\x37\xc6\x83\x8f\x0b\xe4\x18\xc0\xcd\xce\xfc\xa4\x49\x5a\x5d\x56\xe9\x87\x2e\x6d\x34\x02\x49\xa5\xc7\xd5\x90\xc9\x3b\xd1\x4e\x64\xac\x1f\xb2\x2e\x24\xf9\xf8\x53\x59\x68\x2b\x11\x6d\xd7\xdb\x72\x85\x9d\xa5\xab\xcf\xa9\xa9\xdb\x8f\xb4\x17\xe4\x6a\xf3\x70\xfa\xb4\xd4\x63\x67\xe3\x05\xe5\x5e\xdd\xae\x56\xe5\x65\xbe\xa2\xa5\xf0\x81\x44\xe9\x7c\x99\x94\x3f\x1a\x39\x18\x6c\x29\xeb\xa3\xc3\x35\x62\x14\x06\x79\x3f\xc2\xce\xdc\x10\x01\xc4\x9d\x3f\x2c\x2d\xe0\x06\xc6\xe4\x77\xdf\xd6\x05\xad\x09\x3b\x80\xe9\x31\x20\x92\x7f\x38\x27\xbc\xaf\x9d\xbc\x52\xbb\x92\xcc\xcb\x92\x4b\xf9\xe4\x54\x10\xca\x84\xeb\xb5\xa7\xb2\x33\x4f\x42\x49\xe4\x60\xb1\x0f\x20\x45\x6b\x4f\xdb\x01\xc4\xdb\x54\x37\x39\xb1\x1c\x74\x2f\x45\x9a\xcb\xfe\x09\xe1\x89\x64\x66\x0b\x77\xbc\x38\xea\x48\x1c\xbf\x61\x27\xc9\x44\xd5\x4a\x8d\x3d\x3b\xe1\xe6\xc3\x21\x6e\x0c\xa2\x7d\xce\xa3\xb1\x10\x24\x08\xe6\x4f\xe1\x50\x32\x8a\xdb\xe4\x40\x97\x5d\xc6\x1a\xac\x7e\x30\x58\x33\x40\x05\xcb\x59\x7b\xbd\xc1\xa4\x8e\x3f\x0f\x37\x20\xb2\xec\xe6\xd1\xde\x62\xee\x06\xe1\xb2\xb8\xa5\xbf\x0d\x7f\x07\xf6\x14\xaf\xa5\x55\x80\x91\xf9\xf7\xc0\x0c\x8b\xbf\x4d\xa8\xdf\x66\x22\xb6\x66\x94\xfc\xd6\x51\xa3\x28\x22\xd2\x6e\x42\xad\x2e\x05\xc1\x7c\xe4\xc3\x48\xad\x2f\x9f\x25\x57\x7d\x9c\xaa\x3e\xbd\xd4\x42\x4e\x7a\x13\x66\xab\x97\xcf\xc3\x74\xc5\x2c\x61\x57\x14\xfa\xb6\x35\x0c\x50\xb2\xdd\x69\x63\x44\x41\xee\x35\xf7\xbd\x79\xb0\x2b\xee\x97\x23\x1f\x7c\x32\x23\xf9\x69\x39\xf4\x5a\xe6\x62\x61\x11\x83\xa8\x05\x27\x2c\xea\x82\x19\x7b\xc7\x9f\xd1\x6b\x11\x54\x0a\xde\x84\x13\xd5\x6a\x4b\x0c\x4c\xde\x74\xb8\xa3\x4d\x99\x96\x5b\xec\x4f\x03\xdc\xc0\xfe\x4c\x41\x10\x2d\x6d\x10\x7b\xf4\xc8\x37\xf8\xe1\x2f\xbe\xa1\xff\xe9\x6f\xa0\x06\x64\x15\x70\xbf\x59\x74\x99\x15\xc4\x18\x15\x59\x72\xff\x51\xf8\xd5\xbd\x44\x8b\x6f\x4c\x0d\x10\x47\x95\xa9\x72\x6f\x7f\x0b\x5a\xc7\xb2\x9f\x83\xfd\x0c\x7e\x38\x97\xd2\x4e\xb2\x64\xc3\xda\xec\xb2\x3c\x74\xec\x95\x7c\xc0\x05\x25\x16\x21\x27\x46\x05\x7e\xbc\xc0\xec\x8d\xdd\xd4\x70\xe0\x79\xc4\x41\x08\x11\x41\xa5\x53\xdb\x3d\xa6\x8b\xea\x72\x83\xc4\x86\xb4\x4f\x07\xc2\x57\x57\x2e\x28\x20\x23\xa9\xb9\x3b\x1a\x50\x4a\x9c\xe9\x80\x15\x0f\xd4\xe8\xd8\x6e\xf2\x43\xb0\xa7\x5c\x83\x96\x7b\xff\x51\x4c\x46\xe8\xc1\x34\x4d\x95\xaf\xda\xc6\xf6\x5e\xa0\x77\x9b\xaa\xa3\x2f\x13\x01\xd6\x4e\xb6\x89\xf4\x6a\x2f\x82\xc7\x3b\x7c\xd2\x7a\xaf\x64\xe7\xc9\xe3\xac\xb2\x3d\x85\x30\x1f\x8d\x10\xcd\x28\x17\x15\xd2\xa8\x52\xdd\x8e\x67\x9e\xd7\x13\xf3\x25\x60\xd9\xfa\x5a\xf6\x63\xfc\x1c\xd6\xa9\xc1\x95\xe2\xb0\x09\x64\xc4\xc2\xdc\x48\x7d\xc4\xe4\x65\x92\x73\xc3\x82\xa9\x24\x06\x1f\x09\x76\x2b\x71\x6e\x27\xf7\x8c\xf5\xab\x51\xad\xc1\x13\x2a\xf5\x76\x78\x78\x97\xb5\x59\x3c\xac\x93\xbb\x59\x72\x7e\xd7\xdd\x8c\x5d\xb3\x5f\xb2\xac\x7e\x78\xcb\xf8\x0d\x3c\x7f\xf8\xf4\x49\x50\x93\xaf\xc0\x39\xcb\x67\x86\x45\xfe\x36\x84\x05\x2e\x7a\x88\x5c\x27\x98\xbf\x88\x0d\x24\xf4\xbd\x74\xb3\xba\xe9\x6a\xd3\xf4\x9a\x8f\x58\x5d\xae\x61\x5e\x9c\x1e\x45\xff\x4c\xdd\xc0\x77\x1a\x66\x1c\xfc\x43\x0c\x41\x8b\xd2\x45\x5c\x53\x51\x8d\xf0\x0c\x69\x5e\x40\x55\x93\x7c\x70\xf6\xc1\x3c\x42\x4e\xcb\x06\xc9\x26\x5d\x58\xcd\x63\x77\xa1\x5a\xc3\xe4\xe9\x83\x73\xb7\xc8\x4d\xbe\x47\xb5\x25\xbc\x16\x89\xc6\x7e\x42\x54\x35\xfb\x37\x56\x9a\x75\x06\xb1\xfd\x18\xab\xb0\xe9\x6b\xdf\x70\x0f\x33\x03\x5b\xbd\x42\xd0\xdd\x10\x55\x49\xb8\x80\xe4\xc9\xdd\x87\xf1\x54\x38\x4c\xbf\xa3\xe8\xfd\xa4\x82\xa8\xff\xf4\xca\xf6\x74\xfc\x9b\x5f\x1c\xd2\xcd\xf7\x90\xdc\xd1\xe3\x2e\x31\x12\xb4\xcf\x20\x6a\x78\x6f\x23\x72\x12\x9d\x86\x14\xe0\x00\x18\x02\x83\x74\xe3\xd8\x18\xdb\x3f\x10\x53\x2a\x05\xf6\x59\x2b\xe5\xd1\x18\xbe\x2d\xcc\x51\xcc\xa3\x87\x60\xca\x94\x74\x04\x91\x5e\xd0\x18\x1b\x91\x46\x12\xc6\xb0\xd3\x69\x23\x99\x53\x1b\x30\x8c\x0d\x36\xdc\x83\xa8\xda\x52\x9e\xa8\xa1\xe5\xe3\x88\x1b\x19\xb7\x71\x6e\x19\xd3\x5b\x1c\x51\x3e\x37\x98\x3e\x2a\x5c\x32\xfd\x96\xab\xb7\x23\x2c\x2b\xe0\xc4\x46\x6f\x35\x15\x23\xb3\xcb\xa6\x8f\x60\x7f\x20\xba\xec\x35\xb1\xac\x08\x33\x51\x41\xc4\xdb\xb1\x8b\x98\x70\xd3\x85\x7a\x50\x81\xca\x1d\xc4\x7f\x4f\x64\x3f\x3c\xfd\xe8\x42\x24\x8e\x34\xce\x2e\x86\x85\xeb\x7c\x9b\x73\x3c\x70\x24\x5f\x1f\x23\xe3\x11\x1d\xf8\xec\x24\xc0\x4d\x29\xca\x6e\xcd\xd4\x38\xc0\x49\x91\x27\x4c\x05\xbc\x2c\x59\x6b\x9a\xfd\x3e\xbc\x82\x66\xaf\x4e\x3b\x61\xf9\x2b\x5c\x3a\x71\x9e\x98\x2c\x8f\x83\x15\x8c\xaa\xc4\x94\x83\x7e\x2c\x2f\x2e\xb6\x79\x61\x91\xa9\x8a\xc8\x19\x42\xfb\x89\x7e\xf1\xad\xf2\x9a\xef\x3e\x64\xd9\x2c\x0f\x5e\xc3\x43\x4e\x6e\xbe\x77\x90\x92\x42\xdf\x69\xd5\xf2\x99\xc7\x61\x93\x5a\x51\xcb\x32\x1f\x7b\xe8\xc2\xaa\xfd\xd8\xce\x1c\x36\x30\xb0\x10\x1a\xb7\x2a\x4b\x98\x43\xd0\x63\x70\xfd\xef\xa2\x23\x19\x72\x9c\x6e\xc7\x61\x9b\x90\xb2\xeb\xdd\x64\x23\xf5\x9f\x13\xbf\x46\x51\xfa\xb8\xa6\xb4\xb4\xb7\xb7\x73\x4b\xf6\xd3\x93\x64\xf3\x3d\x39\x58\x6f\xaa\x6e\xdf\xb4\xfd\xec\x91\x56\x47\x2f\xd7\x68\x4f\x32\xf5\xc3\x2f\x3d\xac\x4b\xb8\x3e\x7e\x14\xca\x9f\xba\x1e\x90\xea\xcb\x49\x28\x3a\x3f\xff\x26\xac\xe2\xe8\xd9\xbb\xca\x17\x07\x45\x9c\xf2\x7b\xa9\xe1\x82\x97\x02\x98\x4e\x55\xae\xc0\xe8\x03\x31\x77\x61\xc3\x49\xb0\x41\x41\x4f\x65\x06\x1f\xb7\x6c\xeb\xd3\x97\x21\x14\x24\xbd\x26\xe9\x65\x1b\xd6\x9a\xda\xe1\x8d\x69\x38\xd5\x5c\x22\xb1\x74\x40\xf8\x85\x4d\xe0\x79\xcb\xa1\x85\x86\xcd\xc4\x1b\x58\x82\x14\x8d\xdb\xac\x31\x99\xb8\x05\x7d\xb2\x42\x81\x24\x1f\x7e\x40\xd5\x3e\x96\x6a\x1f\x7c\x14\x36\x05\xa1\xb2\x6b\x77\xe2\x16\x9d\x1f\xad\x24\xed\x89\x32\xf6\x70\x15\x48\x2c\xae\x92\x0c\x0f\xa6\x50\x7a\x32\x9f\x9b\xba\x42\x54\x71\x6d\xc9\x49\xf3\x72\x53\xa9\xb7\x75\x7f\xde\xd9\x6a\xf2\xb8\x39\x43\x96\x08\x74\x83\x9a\x9e\xa9\xe9\x3f\xf5\x1c\x41\xff\x2d\x60\x86\xfa\x8f\x43\x90\x0c\x8a\xea\x7a\x1b\x5c\xcd\xf3\xf3\x07\x13\x65\x8e\x20\xfa\x50\x7d\xf4\xb7\x26\xb9\x0d\xaa\x1f\xf1\xd1\x6f\x7f\x14\x34\x88\xcf\x60\x50\xe0\x7b\xe1\xf6\xf5\xef\xb7\x79\x63\x7f\x7d\x3b\xc9\x93\xdb\x4d\x9e\xad\xa8\x9f\x10\x9f\xe6\xec\x0f\x3a\xde\x1b\xa5\x5a\xfa\x8b\xa7\x82\x47\x0b\x9a\xd7\xc7\xb0\x7d\xce\x8a\xd7\xab\x41\x3c\x52\x25\x8c\x87\x28\xcf\x53\x3a\x0e\xe1\x45\xc4\x8d\x9b\x13\xbc\x9c\xa5\xaa\x1a\xa1\x68\xb2\x03\x78\x50\x8b\xa4\xe5\xd8\xa5\x44\x9c\x87\x22\xce\x7e\x96\x92\x78\xd1\x25\x62\x14\x6f\x6a\x9d\xe3\x8a\x9a\x19\x2f\xb5\x2a\xba\x9d\x6b\xc5\x2b\x52\x81\x6a\x6c\x6a\x36\xbd\x90\x01\x10\xfb\xe5\xd4\x53\xd0\x0c\xe7\x78\x81\xca\x76\x00\xcc\x4a\x05\xa6\x66\x4f\xcc\xbf\xf1\xf4\xdf\x3d\xf9\xed\x5f\x22\x89\x34\x02\x97\xdd\xe5\x96\xed\x42\x9e\x9b\xeb\xbf\xa9\xdb\xc1\xa6\xcc\x80\x45\x99\x4c\x33\x69\x77\x15\x42\x32\xfc\x9f\x9a\x9e\xe1\x0c\x3a\x60\xed\x00\xeb\x69\x20\x03\xcf\x10\xe8\x94\xaa\xaa\x88\x95\x19\x50\xe3\x41\xc4\x05\x5b\x9a\x02\x11\x1f\xb4\x4c\xeb\xfe\xbe\xb5\x2d\x8d\x61\x8b\x35\x01\xe7\x7d\xbd\xc3\x3c\x4b\x0e\x45\xe6\xb7\x51\x02\x82\xb0\x14\x9f\x1e\xba\xc5\x03\x88\x27\x59\x61\xd0\xf6\x11\x53\x3c\x38\xbc\x3f\x31\x1e\x1e\xeb\x09\x6a\x61\x5f\xa6\xc7\xa6\x1b\x54\x3c\x81\xed\xb5\xd4\x1d\x3e\xdd\xad\xb2\x3f\xf2\x6f\xbe\x7a\xf0\x78\x50\x71\x8c\x17\xb4\x60\x84\x44\xf4\xfb\x29\x9c\xc1\x02\x7f\xc6\xd1\xcc\x75\xba\x00\x73\x7c\x01\x15\x41\xfb\x25\xf8\x6a\xcb\x0b\xce\xf2\x0d\x69\x6d\xcb\x31\x5d\x89\xa1\x57\x75\x91\x00\xb6\xa0\x55\xe9\x24\x2b\xfb\x8c\xdf\xa3\x8e\x6a\xf6\x5e\x96\x60\x75\x7d\x5b\x84\x32\xe3\xb6\x3e\xf8\xa8\x0e\x60\x5c\x6f\x73\x7f\x00\x62\xdd\x35\xb5\xff\x62\x14\x16\x55\x1b\xee\xbe\x2b\x15\x6d\xe1\x54\x27\x5c\x12\x57\x33\x19\x5d\x1e\x24\x75\x95\xbf\x53\x55\x58\x0f\xff\xca\x6c\x17\xdf\xe2\x1f\xec\xe4\xe8\xd5\xc6\xfb\x32\x93\xc4\x68\xf6\x6a\x34\x3c\x10\x90\x1c\xba\x50\xac\xbe\x15\x1c\x0a\x5c\xbb\x37\xaf\x03\xdc\x2a\x66\xd0\xd3\xc4\x6a\xdd\xe3\x2c\x57\x91\xa0\xf8\x55\x9e\xb9\x68\x42\x87\x74\x50\xcd\x15\x4f\x76\x28\xb1\xf9\x52\x0f\x0e\x29\xdc\xa1\x22\x26\x94\xee\x3a\xe1\xde\xf4\xb8\x19\xa2\x1f\x20\x09\xa9\xee\x31\xd0\xb8\xee\x3a\xf5\xfb\x26\x7a\xc2\x7e\xf3\x02\x3b\x26\x33\x5c\xd2\x36\xbf\xb0\x81\x42\x52\x51\x4e\xb4\xac\xcb\xa6\xd9\xd7\x61\x44\x2e\x04\xd6\x3c\x1f\xac\x63\xba\x9f\x60\x9a\x7e\x93\x72\x56\x29\xbb\x3d\x0a\x3d\x15\x57\x15\xf3\xcb\xc3\x9a\xfa\x04\xb2\xac\x23\xaf\x47\xd5\xdc\xad\x5f\x57\xe2\x46\xd8\xdf\xfc\xaf\xf5\xcb\x70\x3f\x2f\x6c\x06\x72\x08\x09\x90\xa5\x85\xe6\xa3\xf8\xad\xfb\x9e\xdc\xe5\xef\xb5\x9f\x34\xd4\x1d\x53\x87\x0a\x5d\x46\x50\xc5\x4d\x85\x83\x8a\x5c\xe6\xeb\x4b\xce\x51\xb1\xb8\x2f\x9f\x93\xfb\x08\x9f\x71\xde\x15\x8d\xf9\x29\xf9\xc6\x95\x86\xed\xa1\x3d\xe2\xb6\x60\x47\x88\x68\xa2\x7a\xdc\xe6\x01\x7e\x26\x1f\x5e\x94\x55\x82\xa0\x8f\xc5\x9a\x3a\x03\xdd\xfe\xd1\xc9\xc6\x88\x74\x44\x53\x6c\x20\x45\xf7\xdd\xdc\xf3\xdf\x06\x7d\xa1\xc5\x74\x5f\x12\xd0\xc3\xf7\xf0\x5b\xfc\x4c\x3e\x24\x66\x7c\x65\x13\x90\x01\x45\xd4\x8c\x60\xd0\x54\xeb\x7a\xf1\xf5\xbd\xe4\x6e\xb5\xe6\x14\x55\x75\xd4\x6d\xbe\xae\x9c\x75\xcc\xf0\x59\xe1\xb2\x80\x4e\x90\xfa\x9c\xa3\xc6\x55\xd7\xd4\x34\xcf\xc4\xb0\xeb\xa9\x7c\x8d\x8e\x08\xc2\x25\x5f\xfd\x1e\x8b\x9a\x1e\x3b\x4b\xd9\xa9\x06\x1c\x2c\xcd\xd5\xe7\x38\x69\x37\x56\x57\xbd\x36\x2a\xd3\x12\xc7\x55\x43\xbe\x6a\x12\x07\x0c\x59\x29\x54\xec\x09\xce\xbe\xd8\x99\xcd\xcf\xd3\x8a\xc8\xaa\x17\x46\x82\x1d\xe0\x87\x2f\x09\xde\x30\xf7\xa9\x26\x3c\x98\xb5\x5b\xbb\xf8\xc6\x54\xf4\x0d\xb2\xb9\x5d\x5f\x3f\x4a\x0f\xcf\x9b\xee\xcb\xc6\x49\xe5\xe3\x72\xfb\x93\x4d\xdb\xd8\xaa\x49\xf2\x94\x02\xa1\xf4\x9d\x94\x4e\x21\x4b\x7f\x3b\xff\x3d\x48\x21\xe8\xe6\x09\xc6\x4c\xba\x21\xba\x0b\x0f\x3d\x90\xb4\x99\x1c\x6e\x38\x9a\x73\x38\x70\x06\xfc\x9a\x40\x0b\x4c\xd8\xa4\x0f\x42\xeb\x1b\x70\xbc\x9b\xcc\x36\x78\x38\x35\xf8\x89\x8b\xf8\x13\xc4\x83\x0b\x95\xf4\xde\xbb\x81\x29\x3c\x38\x12\xdc\xd3\x74\x12\x69\xde\xcf\xc3\x6e\x6d\xca\x0e\xe8\x3e\x5c\x89\x0b\xe6\xee\xeb\xd0\x16\xf4\xb5\x1e\x67\x12\xd0\x63\x54\x2b\x2f\x84\x71\x96\xba\xd0\x39\x3f\xe6\x1c\x15\xac\x27\x58\xfd\xe3\x2f\x55\xd0\x1f\x8b\xaf\xa4\x22\xec\x10\xc4\xc8\x57\xa2\x14\x0f\x6b\x61\xcc\xa1\x15\xf0\xf4\x2a\x3d\x57\x15\x7e\x58\x7e\x1a\x39\xb0\x84\x6b\xd2\x63\x75\x5f\xca\x3d\xfd\x9e\x8f\x26\xe9\x45\x91\x93\x0e\x22\x6f\x33\xfd\x9d\xfd\x20\x7b\xff\xd2\xc5\x59\x60\x25\xac\xa4\x27\x8d\x5d\x74\xa2\xa8\x72\x77\x38\x91\xfc\xac\xb2\x85\x4f\xb6\x72\xd4\xa1\xa1\x38\x20\x8a\x34\x6e\xab\xe9\x82\x3f\xed\xd3\x05\x17\x26\x4c\x9b\xfc\x2b\x49\x50\xff\x6b\x49\x50\x3f\xf3\x59\xef\xa9\xdf\x43\xb7\x27\x92\x9e\x69\xab\x41\x9e\xe5\xba\x4a\x3f\x19\x36\x95\xb0\xa1\x41\x2d\x94\xfd\x17\xd7\xad\x2c\x91\xd5\x86\x8b\x1f\x5d\xaa\x1f\x9f\x47\x3f\x58\xe1\x27\xa2\x5a\xfc\x44\xd6\xfa\x2f\x41\xea\x7c\xc9\x71\xea\xba\xd0\x34\xa6\x6c\x79\xa7\xb9\x71\xde\xad\x1b\xcd\x61\xac\xfd\x88\x21\xa9\x45\x5e\x58\xce\x2b\xfe\x9e\x9d\xe9\xba\xe2\x3c\xd6\x7a\x86\x51\xb2\xd8\xb0\x37\xcd\x52\x7d\x62\x81\x71\x5f\xd1\x3a\xdf\xb7\x43\x5d\x6a\xdc\xe3\x78\xc5\xef\x3d\x4f\x82\x11\x98\x69\xea\x16\x4a\xa6\x06\x04\xd7\x78\xaf\xe3\x9c\x48\xed\xfb\xa3\x24\xc3\x7e\xef\x09\xf9\xac\x05\x0c\xb6\x9c\x90\xa0\xac\xf3\xc9\x8b\x10\xa5\xd2\x9e\xb8\x57\x1c\xae\xb3\x31\xeb\x05\x22\xd2\x5c\x45\x11\x1d\x05\xea\xeb\xdb\x5f\xf8\x91\x27\x41\x3e\xb8\x49\x2e\x61\x3b\x67\xdb\x7e\xc1\xe9\xec\x83\xcc\xe9\x56\x32\x9a\xdf\xc9\xfa\x00\x5a\x84\x14\x9a\xb2\xdc\xbe\x9c\x99\x35\xa1\x02\xe0\xf8\x8b\xaa\xdc\xb1\x8f\x3a\x47\xd5\x82\x7b\x3a\x7e\xc8\xbf\x3e\xad\x17\x9f\x6a\x08\x6d\x49\xf4\xf8\xe9\x8e\x3e\x70\xa2\x3a\xfd\x7d\x49\xbf\xd7\x88\xe4\xa6\x99\x20\x3f\xcd\xe8\x03\x1e\x63\xc2\x99\xf8\x79\xa0\x9f\x4d\x17\x7c\xa0\x87\x8a\xbb\xb0\x35\xb1\x16\x29\x7f\xea\xe8\x43\x55\x6e\x24\x33\x0a\xbd\xee\x19\xa7\xf4\x97\x61\x25\x85\x30\x12\xe3\xf1\x47\xfe\x27\xbe\x5d\x96\x6d\xc5\x5f\x64\x70\x7c\xca\x4c\xc7\x5f\xf0\x04\x23\x27\xa5\xb5\x1b\xfe\xdd\x74\xeb\x52\xbf\xd1\xe0\xcd\xa5\x76\x84\x09\xfc\x92\x76\xf8\xdc\x59\x23\x9d\x6d\x0d\x77\x5e\x99\xc3\xd2\xcd\x44\xa6\xc1\x9f\xdc\x3c\xf8\x2f\x6d\x64\x56\x95\x7b\x58\x8c\xbd\x9c\xb9\x2c\x9c\x2e\xfd\xe6\x33\xf1\xdf\x57\xc3\xf2\xa6\x6d\xcc\x15\x6b\x1d\x24\xd1\xdb\xd5\x99\x8f\x96\x5e\xb3\xab\xe7\x7c\xe6\xf2\xf8\xe6\xc5\xbe\x55\xf1\xf0\xa3\x3e\x15\x41\x5f\xd3\x4b\x96\x39\x3e\x0d\xd5\x6b\xe7\x33\x96\x42\x23\x8c\xdc\x8a\x68\xa6\xef\x45\x18\xa3\xfe\x00\x1f\xfe\xeb\xbf\x32\x15\x9a\x1f\xed\xbf\xfd\x5b\xf2\xf0\xcb\x8f\x44\xef\x41\x14\x15\xa1\x46\x95\xdb\x24\x3b\x67\x9d\xd5\xa1\x3e\x91\xaf\xbf\x8d\x9a\x20\x46\x12\x7b\x6c\xb2\x51\x90\xbc\x86\x1c\xeb\x6e\xf6\xff\x05\x00\x00\xff\xff\xac\xc8\xeb\xdf\x24\xe3\x00\x00") - -func confLocaleLocale_plPlIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_plPlIni, - "conf/locale/locale_pl-PL.ini", - ) -} - -func confLocaleLocale_plPlIni() (*asset, error) { - bytes, err := confLocaleLocale_plPlIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_pl-PL.ini", size: 58148, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_ptBrIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\xbd\xcb\x8e\x1c\x47\x96\x28\xb8\x8f\xaf\x70\xb1\x41\x88\x04\x32\x43\x50\x55\xcf\x03\x82\x82\x9a\x54\x92\x92\x58\x10\xc9\x2c\x66\x4a\x0d\x8c\x40\x84\x2c\xc2\x2d\x23\x5d\xf4\x70\x8f\x72\x73\x4f\x32\x59\xa8\xc5\x60\x56\x03\xcc\x07\x0c\x66\xd5\x42\x2d\x1a\x2a\x40\xab\xc2\xdd\xd4\xf2\xe6\x9f\xdc\x2f\xb9\xe7\x69\x2f\x77\x4f\x52\xd5\x40\x37\xba\xc4\x0c\xf3\x63\xef\x63\xc7\xce\xdb\xcc\xe1\xb0\x2e\xad\xdb\xae\xbe\xdb\x17\xce\x76\xd7\xd5\xed\x7f\xb4\x45\x69\x8b\xaf\xab\xbe\xb8\x6a\xdd\xc1\x96\xb7\x3f\x5f\xdb\xba\xb0\x85\xd9\x57\x3b\xf9\xdb\x6d\xbb\xaa\x6f\x0b\xbb\x2f\xbe\x6e\x17\x8b\xab\x76\x6f\x57\x67\xb7\x3f\xef\xaa\xc6\x14\x55\x53\x6d\x2b\x53\x2f\x4a\xe3\xae\x36\xad\xe9\xca\xd5\x99\xa9\x1a\x5b\x2f\xec\xdb\x43\xdd\x76\x76\xf5\x84\xfe\x35\xdd\xe2\xca\xd6\x87\xd5\xc9\x4f\x43\x69\x16\xae\xda\x35\xeb\xaa\x59\x3d\x69\x7a\xfc\x42\x3f\xdb\xa1\x5f\x9d\x9b\x4a\x7e\x0d\x87\xd5\xa9\x81\x36\xe9\x7b\x67\x77\x95\xeb\x6d\xb7\x7a\x49\x7f\x60\xd1\x1b\xbb\x71\x55\x6f\x57\xe7\xf0\x9f\xc5\xb5\xed\x5c\xd5\x36\xab\xef\xe1\xdf\xdb\xbf\xb6\x8b\x83\xd9\xf9\x01\x2e\x7a\xbb\x3f\xd4\x06\x40\x2f\xe4\x8f\x45\x6d\x9a\xdd\x80\x20\x4f\xcb\xaa\xdd\x9b\xc5\xb6\xb3\x50\xbc\x6e\xec\x9b\xd5\x69\x57\x99\x6e\xb9\x5c\x2e\x06\x58\x9b\xf5\xa1\x6b\x2f\xab\xda\xae\x4d\x53\xae\xf7\x38\x97\x33\xdb\x41\x41\x51\xb6\xc5\xe0\x86\xdb\x9f\xbb\x0a\xd6\xa4\xd8\xb6\xcd\x65\xb5\x1b\x3a\x73\xfb\x1f\xb7\xff\xcd\x3a\x1a\xbf\x2d\x61\x7a\x6b\xe3\x56\xdf\xb6\x3b\x03\xe0\xdb\x76\x0f\x0b\x87\x8d\x36\x06\x16\xef\x3b\xa9\xbd\xb0\x7b\x53\xd5\xab\x27\xc7\xf8\x0f\x0c\xdb\xb9\x37\x2d\xac\xe0\xb9\x6d\xae\x0c\xcc\x7a\xdd\xdf\x1c\xec\xea\x71\xb5\x83\x49\x16\x4d\x7b\x0d\x55\x1b\x18\xff\xd6\x1c\xfa\xed\x95\x81\x05\xa2\x7f\x17\x00\x79\x68\x61\x35\xda\xee\x06\x56\x88\xfe\xbc\xfd\x3b\xb6\xde\x76\x3b\xd3\x54\xef\x4c\x8f\x8b\xf3\x42\x7e\xc0\x28\x61\x89\xf6\x55\xd7\xb5\xdd\xea\x09\x6c\x78\x7d\xd5\x2e\x60\xee\x6b\x6c\x65\xf5\xbc\xbd\x6e\x8b\x2e\x6e\x04\x3f\x01\x26\x74\xb8\x84\xf0\xd5\x14\xf4\x83\x5b\xe1\x6f\xd4\x12\x55\xe4\xbf\xa9\xf8\xb2\xed\x5e\x73\x21\xfe\x85\x18\x36\x6a\x15\x86\xc7\x2d\xb6\xe9\xd0\x4c\x03\x9b\x43\x5f\xbf\xb6\x9d\x6d\x00\xbd\xba\x18\x04\xd7\xd8\x94\x7b\x58\xdf\x83\x01\x44\x13\x7c\xc3\x4d\xa1\x52\x42\x90\x12\x46\x61\xb6\xdb\x76\x68\xfa\xb5\xb3\x7d\x5f\x35\x3b\xb7\x3a\x4d\x37\xaa\x28\x0d\xee\x5d\x0f\xe8\x38\x03\xb1\xb8\x69\x07\x8f\x05\xb0\x2b\x43\x71\x20\x04\xe0\x72\x5f\xeb\x7c\x30\x6e\x84\x05\xd0\x7d\x5f\x5d\x57\x7d\x65\xdd\xea\x04\xff\x2a\x0d\x1c\xbb\xc5\x61\xa8\x6b\x58\xe9\x3f\x0d\xd6\xf5\x6e\x75\x06\xbf\x0a\xfd\xb5\xa8\x9c\x83\x3f\x56\x67\x5d\xbb\xa9\x01\x31\xa0\x8d\xad\x69\xb6\x30\xc3\x53\xfa\x07\xb0\x7e\xf1\x43\xd5\xb8\xde\xd4\xf5\xab\x85\xfc\xb1\x7a\x4a\xff\xca\xd2\xf5\x55\x0f\x03\x7d\xd2\x1b\x40\x25\x5c\xf2\x2a\xfa\x58\x1c\x4c\x67\x8a\x43\x57\xed\x6d\x05\x7f\xd8\xb7\x76\x3b\x70\xad\xb2\xdd\xbe\x06\x6c\xc7\xf3\x09\x67\xec\xdc\x16\xd7\xed\xf6\xf6\x6f\x70\xea\xfb\xdb\x9f\x8b\xae\x2d\x01\xfd\xdb\xa2\x85\xa3\xbf\xc3\x46\xe1\xc8\xb6\xb8\xd8\x8f\xa9\xd6\x51\x71\x68\xbb\xe2\xd2\x5c\xc3\x7f\x6b\x5b\xc1\x5e\xba\xe2\x73\x53\xf4\xa6\xdb\xd9\x7e\x75\x6f\xbd\x81\xc3\xf6\xfa\x5e\x71\xd5\xd9\xcb\xd5\xbd\xfb\xee\xde\xa3\xaf\x87\xca\xb8\xcf\x3f\x31\x8f\x8a\xed\x80\x6b\xd2\x3a\xc6\xea\xc2\xc0\x7f\x68\xd0\x7b\xa0\x10\x5d\xf1\xa7\xc1\xd4\xb0\x2e\x1d\x2c\x6c\xe5\x4c\xd1\xc0\x68\x60\xf4\x7c\xa6\x3f\x5a\xe0\x9a\xc1\xa1\x58\x97\x1b\x26\x66\x34\x36\x5a\xc8\xae\x78\x76\x73\xfe\xc7\x6f\x8f\x8a\xb3\xd6\xf5\xbb\xce\xd2\xdf\xf0\x1f\x80\xfe\x7d\xd1\x0e\xc5\x45\xf5\xf8\xcb\xe5\x02\xea\xf1\x5a\x8d\x70\xc2\x16\x1b\x58\x6d\x22\x89\x34\x3a\x02\xc5\x63\x78\x51\x1d\xda\x89\xcf\x40\x33\xfb\xd5\x37\xf0\x1f\x3a\xdd\xe1\x64\x67\x87\x19\x5a\xa1\x93\xff\x1c\x68\x27\xae\xde\xb8\x13\x59\xfe\x33\x5d\xce\x23\xa0\x31\x16\x96\x7d\x6f\x01\x0b\x2a\xb7\x6f\x8b\xa7\xcf\x9f\xbf\x78\xfc\x25\xd2\x92\x02\x29\x4a\xf3\x13\x60\x37\xb5\xb1\x85\x9d\xdd\x02\x7d\x84\xf1\x0f\xfd\xe5\xff\xbe\xde\xd9\xc6\x76\xa6\x5e\x6f\x2b\xde\x74\x5a\x91\xe5\xc2\xb9\x1a\xc8\x58\x69\x57\xcf\x5a\x18\xc1\xf9\xf9\xb7\x30\xc8\xfe\x0a\xb0\x0b\x4e\x0d\xd0\x00\xf7\xa7\x1a\x97\x54\xc6\xf1\x02\x5a\xa5\x72\x3a\x58\x1d\x2c\xf7\xf5\xc4\xf4\x47\x2b\x5b\x7c\xbe\xe9\x1e\xf9\x39\xc8\x14\xb4\x25\xb3\x71\x6d\x3d\xc0\x98\x61\x73\x11\xa7\x18\xcf\xf8\x06\xe9\x88\x46\xfa\x2b\x69\xb9\xb0\x5d\xb7\x06\x8a\xdd\xdf\xe0\x26\xd3\x40\x5f\x14\xa7\x61\x48\x77\x8f\xa3\x68\x08\xe3\x61\xb2\xd8\x62\x71\x6d\xde\x55\xd2\x64\xd5\x5c\x9b\xba\x2a\x61\xfb\xef\xde\x92\xb8\x19\xdb\xed\x91\x02\x43\x61\xb4\xd2\xf7\x96\xf7\x80\xf8\xdf\x3b\xbe\xb7\x5c\x34\xed\x9a\x09\x12\x5e\x14\x25\xa0\x2b\x9c\xdf\x75\x27\x77\x15\x11\xdf\xef\x69\xa6\x61\x50\x80\xb4\x66\x53\xc1\x7a\x23\x69\x2b\x04\x14\x67\xbf\x2f\xb6\x78\x05\x15\xc3\x5e\x88\x13\x0e\x28\xa1\x6b\xf1\xca\x28\x19\x14\x54\x3b\x81\x06\x00\xd9\x46\x55\x26\x56\xc3\x2c\x17\x0b\x45\x93\xe9\x93\xb0\x83\x6f\x95\xc3\x85\xc1\xc3\xb5\x40\xbe\x21\x59\x2e\x73\xa8\xab\x2d\xcc\xee\xba\xf5\xdf\x14\x77\x4e\xdb\xba\x85\xa3\x08\x33\x6b\x08\xd8\x14\x6e\xc8\xa8\x7c\x61\x00\xa3\x3e\xa2\x9b\x6b\x1d\x63\x61\x01\xfd\xff\xfa\x0e\xdb\x4f\xae\x0b\x0f\xa7\x5d\x5c\xb4\xb8\x47\xad\x4b\xc0\xf0\xd7\xbe\xed\x5b\x1e\x35\x30\x34\x30\x5b\xec\xcb\x99\xfa\x1a\x0a\x91\x86\xc0\x68\xaa\xce\x32\xf8\x72\xd1\x0d\xc0\x69\xc4\xc7\x16\xc7\x1a\x51\x46\xfd\x1e\x0e\x85\xbf\xf7\x4b\x7b\x6d\x0b\xc0\x84\xc2\x6c\xad\x73\x30\x9f\x80\xe6\xb0\x6e\xa3\x19\x00\xaa\x50\xbb\xbc\xe1\xb4\xa2\x25\xf0\x1e\xc0\x03\x3d\x6e\xf7\xb7\xbf\x36\x55\x2b\xbf\xb5\xab\xa7\x0e\xce\x89\xb9\xb4\x80\x01\xdf\xbd\xfc\xd6\xf1\x41\x86\x3e\xea\xb6\x01\x02\x0d\x84\xf6\xfc\xfc\x1b\x3c\xd2\x57\x6b\x20\xc0\x3d\x92\x8d\x9e\xca\x7c\x91\x36\xf4\xfc\xf6\x1f\x7b\xdb\xd1\xcc\x0e\x04\x84\x3b\xe3\xe0\x2e\xa3\xa3\x86\xd8\x01\xb5\x84\xd8\x0f\x0e\xcf\xe5\x11\x4c\xae\x7a\x6b\xf9\xd4\x70\xc7\x88\xaf\xb0\xd5\x82\xad\xdb\xa1\x73\x2d\x0f\xe0\xaa\xef\x0f\xf1\x08\xbe\xb9\xb8\x38\x0b\x85\xb3\x63\x00\x3c\xc7\x61\x18\xc1\x22\x46\x89\xaa\x83\x21\xe8\x2a\x2d\x09\xab\x86\xae\x5e\xc1\xf4\x27\xf0\x0d\xbe\x4c\x2c\x15\x2d\x16\x91\x44\xbf\x4e\x38\xa2\x4f\xf0\x3f\x0e\xf6\xa0\x37\xfb\xcd\xed\x2f\x48\x3f\x2d\xf1\x5c\xcb\x45\xdd\xee\xd6\x5d\xdb\xf6\x29\x16\x42\x7f\xf0\x21\xfd\xe8\x29\xb4\xc1\xab\x08\xd1\x4f\xc8\x22\xdd\x1a\x00\x0a\x47\xaa\x3d\xe0\x71\x9f\x3d\x53\xed\x61\x8b\x9f\x2b\xc7\x8c\xdf\xdc\x1d\xd4\x26\x9c\x39\x8f\x74\xe1\xf6\xb0\xa8\xfe\xb6\x29\xce\x9f\xc1\x42\x53\xd9\x65\xd7\xee\x57\x8f\x6d\xf8\x11\xb0\xd5\x36\x25\xd0\x2a\x6d\x07\x9b\x61\xbc\x05\x5e\x0e\xbf\xc0\x72\x59\x60\x00\xb7\xd5\xa5\xdf\x83\x97\x5f\x9d\x16\xff\xcb\xef\x7f\xf7\xbb\x65\xf1\x02\x19\xb7\xbd\xe9\x05\xd5\x91\x70\x0c\x7b\x69\x04\xa8\x6c\x71\x0f\x09\xc1\xbd\xe2\x73\x2a\xf9\x3f\xec\x5b\x03\xdc\xb5\x5d\x02\x11\x7f\xb4\x5c\x60\x11\x9c\x1a\x3a\x5a\xcc\xdc\xf2\x79\xd8\xdb\x9e\x38\x58\xf9\x9e\xde\x91\x29\x88\xf2\xfc\x6b\x62\xac\xba\xfd\xea\x1b\x4f\x30\xa5\x44\x46\x4c\x9c\x25\xd3\x4f\x6a\x77\xdd\xb4\x7d\x75\x79\x13\xc1\x53\x81\x9f\x61\xb4\xa2\xb0\xc8\x16\xf9\x38\x58\xeb\xad\x9d\x67\x08\xfc\x41\x01\x8a\x36\x40\x37\xce\x6f\x8f\x5b\xb4\x97\x97\x35\xb0\x9f\x7c\xaf\x9e\xf0\x11\xd9\xe3\xf5\x0a\x1f\x8e\xf1\x4b\x02\x01\x87\xe2\x00\x92\xcd\x63\x3e\x4d\x48\x20\x4f\x1f\x3f\x87\x1b\x1e\x6f\x77\x38\x12\x54\x11\x3a\x04\x8e\xb3\x64\x0a\x74\x54\xf4\x81\xd0\xd1\xb1\x73\x4a\xd4\xe0\x9e\x39\xb4\x4d\x85\x93\x7c\x47\x17\x56\xdd\x6e\x4d\x4d\xbc\x14\xf0\x37\x72\x09\x01\xa7\x7e\x6d\x60\x0d\xb4\x4b\x18\x9d\x47\xad\xaf\xe5\xdb\x08\x38\x1a\x65\xb8\xa3\x14\x1a\x16\xe1\xb2\x25\x56\x0d\x50\xcc\x21\xae\x63\xf7\xc6\x45\x23\x65\x40\x80\x40\x61\x0c\x70\x10\x4e\x21\x7e\x39\x10\x3f\xc0\xe4\xd3\x21\x0a\x1d\x4c\x89\x33\x59\x2e\x2e\x2d\x20\x23\xe0\x64\xb9\x96\x01\xd4\x6d\xfb\x1a\x46\x10\xb6\xd0\x14\x9b\xc1\x6d\x4d\x21\x90\x30\x11\xba\xe4\xa4\xa3\xb9\x06\x64\x22\x1f\xda\x0c\x7c\x06\x02\x88\x93\xf5\x6b\xe4\x01\x99\xcf\xba\xfd\x7b\x59\xed\x90\x8f\xb1\x5d\x8f\x0c\x83\xb3\x28\xdc\x35\x40\x2c\xaa\x8d\xac\x4f\x58\xfb\x84\x01\x08\xeb\x6f\x80\x01\x3a\xf6\x18\x3b\x05\x9c\x62\x09\x0d\x28\xa9\x84\x43\xd1\x85\x3c\x62\xfa\x4c\x34\xbd\x65\x46\x3a\x93\x83\x60\xdd\x1d\x30\xd0\xcc\x56\x10\x4b\xe1\x80\x85\x68\xa8\x57\x95\x24\xa3\xb3\x25\x32\x65\x0a\x20\x23\x7a\xb1\xe9\xaa\x9d\x41\x06\x02\x38\x28\x95\x2a\x5a\x5f\x89\x87\x32\x3b\x54\xe8\x96\xd8\x76\x90\x6b\x45\xfe\x5f\x5f\x57\x20\x73\x6b\xab\x40\x41\xab\x46\xda\x00\xca\x0d\x2c\x43\xed\xb9\x05\x3c\x14\xcc\xfb\xbb\xc9\x46\x64\x80\xe7\xb2\x04\x01\xcd\x60\x34\x50\x02\x87\x9f\x31\xb0\x84\x53\x06\x67\x1e\x71\x15\x24\x24\xf8\x7f\x6d\xf5\x08\x7b\x84\x15\x20\xcc\xd6\x95\x64\x78\x4b\x4a\x0a\x44\x58\x87\xac\xb6\x28\x25\x96\x22\x83\x8a\x14\xc8\x62\x48\xcc\xe6\xc1\x79\xad\xfc\xba\xcf\xb3\x73\x85\xd9\xb5\x9d\x39\x42\x24\x82\x8e\x0c\x72\xf4\xad\x4a\x69\x91\x9a\xe1\xc1\xd3\xc7\xab\x4f\x1f\xd2\xe2\x02\x4d\x86\xf9\xf0\x08\x81\x40\xc2\x9d\x29\x2c\xc8\x98\x53\xe4\x21\xce\x10\xb6\xb9\x11\x49\xad\x88\xd9\x0b\x0b\xba\xc8\x38\x4e\x16\x6e\x84\x20\x87\xe2\x53\xa1\xd0\x1d\x33\xa4\x52\x2b\x56\x76\x8c\xc5\x75\x11\x68\xd7\x3b\xe0\x8d\x54\xaa\xed\x98\x53\x82\x3d\xe9\xd7\xbb\xaa\x5f\x5f\xe2\xbd\x51\xae\xbe\x32\x35\x60\x1b\x70\x5c\xf8\x81\xce\x07\x5c\x3b\x24\x51\x7c\x0c\x50\x1f\x7f\x56\xdc\xbf\x16\x69\xe6\xf7\x78\x1b\x20\x51\xa8\x6a\xc4\x67\x14\xd5\x71\xff\x89\x30\xd1\x36\xb9\x81\x19\x12\x91\x1f\x62\x71\xf6\x12\x56\x0a\x59\xae\xb2\x7d\xd3\xd4\xad\x29\x71\xc5\xb4\xee\xa6\x6a\x70\x3d\xe0\xf3\x25\xa9\xbf\x90\x7a\xdf\x07\x24\x7a\x7e\xfb\x7f\xbf\x88\xe1\x76\xed\x66\xa8\xea\x72\xb9\x50\xb1\x03\x84\x0e\xc1\x98\x64\x43\xfe\x3a\x25\xd3\xd0\x00\x99\x31\xdb\xb6\x1d\x70\xad\x86\x66\xa6\x4d\x05\xde\xf9\x64\x9a\xe5\xbc\xfd\x05\x64\xab\xeb\xdb\x9f\xf1\xb0\x52\x4d\xcf\xce\xe2\xa2\x00\x1a\x6d\xaf\x12\x8e\x36\x66\x7d\xb9\x73\x68\x21\xc2\x41\xd3\xc3\x91\x84\x86\x5c\x71\xfc\x08\xfe\xbb\x70\xe6\xda\xf2\xf5\xbc\x1b\xed\x0c\xb2\xdc\x44\x70\xb7\xc9\x2c\x93\x09\x24\x07\x68\xb4\x1c\xb3\x07\x86\x57\x24\x9d\x99\x22\x8f\x1b\xb6\x78\x16\x56\x5f\xda\xfd\xf1\x75\x05\x18\xf1\x51\xf1\x04\xbe\xec\x5b\x52\xd0\x10\x67\xe1\x88\x58\xaa\x8a\x63\xdb\xd6\x57\xc0\x0b\x33\x4b\x0e\x8c\x6f\x75\x5d\x01\x3a\x1c\xc3\x49\xc7\xc3\x85\x5c\x89\xa8\x29\xc2\x16\xa6\x1c\x23\x73\x83\x5e\x6a\x81\x8f\xe3\x75\x5f\xfc\x80\x2a\xd3\x57\x8b\x81\x85\xa4\xb6\x2e\x91\x27\xce\x8e\x16\x12\x18\x9b\x2a\x02\x15\x94\x4f\x99\x7b\x53\xc1\x8e\xad\xbd\xa2\x75\x4d\x33\x7a\xdb\xaf\x2e\x3a\xb8\xf9\x99\xb6\xc3\x4f\xc2\xa4\x83\xe8\xc4\x48\x3b\x09\x74\xb8\x06\x9e\xeb\x86\x30\xc6\xad\x9e\xd9\x21\x13\x9b\x16\xee\xaa\x7d\x43\x1a\x4e\x05\x69\x89\xc6\x15\x7b\x94\x00\x13\x50\xd4\x8d\xc2\x9a\xc1\x69\x6a\xe9\x5e\xd4\x1a\x2f\x13\x31\x0c\x20\x14\x00\x5a\x87\x9e\x41\xf6\x83\x56\x81\xb5\x06\x92\x9b\xa9\xf2\xe0\x2b\xab\x0d\x65\x64\xf2\x63\x41\x64\x9d\x54\xcd\xdf\x03\xc1\x06\x74\x13\xfd\xd8\x12\x70\x86\xf4\x6f\xdc\xf1\x13\x54\x63\x8f\x26\xb4\xf8\x41\xd4\xcf\xaf\x16\x13\xe3\x23\x55\x8d\xf3\x42\x1f\xcc\xdf\x9a\x0e\x0e\xc3\x99\x75\x70\xb5\x38\x52\xb4\x01\xa5\xbd\x7a\x15\xa9\x86\xd7\xa2\x4e\x64\x15\x31\x69\x63\x45\x7b\xe8\x39\xd5\x2b\x7b\x40\xae\x76\xef\x76\xab\x3f\x00\x86\xf6\x40\x13\x3c\xdd\xff\xa2\x40\x5d\xb7\x65\x6a\xff\xd1\xc2\xb5\x48\x35\xd6\x1f\x58\xf5\x0f\xd0\xaf\x45\x9c\x94\xda\x29\xd3\xc0\x8a\xea\xfd\xa1\x47\x8e\x61\x3b\x00\xeb\x8f\xb7\xc9\x35\xb1\x8c\x7c\x0b\x3b\x3a\x33\x74\x8d\x2a\x4b\x07\xf4\x65\x59\x04\x3d\x8d\xa5\xc1\xa1\xf6\x01\x7b\xec\x5b\x51\x32\xa5\x07\x0f\xe5\x92\x2a\xe6\x2e\x7d\xff\x44\xd8\x43\xef\x66\x9e\x45\x27\xfa\xca\x68\x0e\x7c\x64\x15\x8f\xc8\x20\x7f\xb0\xb7\xfb\x0d\x36\x68\x57\xdf\xc2\x5f\x88\x83\xa8\x11\xac\xf6\x0b\x10\x46\x76\x74\xe6\xe4\x8a\x79\x02\x5b\x05\x37\x2c\xf4\xc5\x57\x0c\x7e\xb7\xa3\xef\x70\xb4\x05\xe0\x0b\xb5\x2b\x00\xf1\x7b\xb3\x3a\x93\xdb\x19\xcf\x5f\x58\x67\xb1\x38\x84\xa5\x5e\xea\xd5\xc6\x7c\x19\x89\x17\xd0\x5a\xaf\x0b\xfe\xdd\x9e\x56\x5a\x27\x54\xda\x6c\xe2\x38\x43\xe1\x7f\x99\xb1\xf9\x7c\xf3\xe8\xbe\xfb\xfc\x93\xcd\xa3\xe8\xa2\x39\xc2\xdb\x02\x04\x14\xe2\xe1\xe0\x7e\xda\x9a\xea\x2d\x8d\x8c\x18\x0f\xa0\x83\x0d\xf2\x29\xdd\xed\xdf\xdf\x56\x7b\xf8\xeb\x7e\x59\x5c\xc1\xd0\x44\x23\x00\xfb\x04\x98\xd3\xd3\x4d\x3b\xf8\x55\x5e\xb2\xf6\xd9\xf2\x41\x51\xcc\x15\xf1\x84\xfa\x20\xcc\x85\x59\x5c\x81\x00\xd1\xaf\x89\xf5\x42\x5b\x05\x32\x60\x5d\x0b\x65\x65\x9b\x7d\x65\x06\xe7\x5c\xeb\xd2\xd4\x04\x94\x07\x0b\xf2\xf7\xa0\x5c\x5c\x7c\x8d\x32\x46\x8d\xd9\x52\x8f\x4d\xc0\x79\xe3\x92\xd6\xd5\xbe\xea\xc7\x98\x1c\xeb\xa2\x69\x29\xf1\x9a\x47\x41\xd4\x2f\x39\x31\xc9\xbc\xde\x88\xb5\xfb\xa1\xc2\xe1\x21\x97\x78\xfb\x37\x34\x1e\x44\x78\x0e\xa8\xb9\x83\x41\x42\xa5\xdf\x03\x52\x35\xc0\x4c\x01\x53\x0a\x34\x69\x3d\x34\xb2\x71\x20\x42\x10\x32\xbf\xa8\xe8\x3e\xe7\xde\x91\x83\x1e\x2a\xea\x35\x11\xa8\x79\x08\x0d\xf7\xcc\xfb\x0e\x83\x7b\xe0\x37\xf9\xe1\xb2\xf0\xda\x74\x82\x02\xac\xb3\x1b\xd8\xa7\x64\xfc\x29\xca\xa0\x5c\x24\xc8\xd9\x59\x9a\x30\xc9\xdd\x88\x66\x47\xc5\xb6\x26\x2c\x01\x5e\x71\xd3\xd2\x81\x36\x1b\x40\x96\x56\xd6\x50\x86\x7e\xca\x40\xa8\x60\x63\x1c\xf1\xed\x20\x8a\x4c\xad\x9b\x68\x23\x88\x55\x72\x44\x9a\x7a\x0b\x07\xa8\xb7\xf3\xf3\x85\x3b\x4e\x40\x61\xc6\xb7\xff\x5e\x34\x70\xc6\xfc\x49\x5a\x2e\x68\x34\x38\xa8\x7e\x66\x4c\x0f\x3a\xfb\x70\x72\x54\x1d\x48\x5c\x97\x80\x26\x9e\x0b\x70\x62\x0c\x73\xf1\xe9\x7e\x29\x50\x8c\xcd\x0c\xa2\xf7\xf3\x16\x45\xf1\x80\x40\xd8\xbc\x0a\x6e\xa3\xd5\x86\x5b\x02\xd8\xec\x01\x57\x5d\xa7\xc5\x17\xb7\xac\x69\xe8\xd2\xeb\x36\xc7\xab\x3b\x1e\x8a\xaf\xd4\xb7\xed\x1a\x2e\xd7\xae\x47\x7d\x3a\x60\x36\xf2\xf5\xa4\xb4\x17\xc8\x4c\x33\x0b\x1f\xdb\x8e\xf8\x93\xff\x15\xb5\xca\xcd\x9a\x64\x7a\x7f\x80\x9f\xcb\x10\x11\x1f\x6f\x7f\x45\xcb\x2c\xdb\x4a\x4c\xd0\xfb\xb2\x80\xc7\x7a\x50\xa4\x11\xb6\x66\xd6\x66\x09\x57\x1a\x2e\xf1\x2b\xa6\x0c\x78\xa9\x69\xab\xf1\xe9\x20\xad\x44\x20\x10\x1e\x96\x59\xf7\xef\x03\x9d\xc2\x3d\x1b\xe3\xc6\x78\x9b\x1c\xd3\xa6\x21\xec\xa3\x5c\x19\xca\xa9\xa9\x49\x97\x8d\xa4\x00\x49\xb2\xcc\xb2\xf8\x12\x25\x35\xe4\xe0\x42\x15\x51\xec\x78\xde\x0e\xc5\x79\xe8\xa5\xc5\xa9\x81\x3c\x07\x73\xbb\xb1\x6e\x75\x0e\x97\x45\xd3\xd2\x5a\x2d\xa0\x18\x6b\x9c\xd4\x50\x9d\x6e\x75\x54\x69\xbd\x5a\x7c\x07\x6b\xfd\x7c\x52\xbc\x41\x36\xe1\x79\xac\xe5\x4e\xb4\xd0\x4f\x58\x80\x99\x98\xf7\x59\x2a\x10\xbd\xb4\x64\x32\x02\x2c\x65\xdb\xad\xce\xfe\xfc\xfc\x9b\x0b\x12\xc6\x9e\x8b\x5e\x1c\xa4\x66\x58\x70\x54\xdb\x7e\xd3\xf7\x07\xf7\x9d\xa8\x3b\x51\x5d\x79\x0e\x8d\xde\xa0\xdc\xa1\x85\x6c\xe8\xd9\x99\xc5\x85\x35\xfb\x68\x90\xc0\xb6\x03\x32\x1e\xec\xe2\x04\x58\x96\x64\x5a\x28\x2d\x76\xde\xae\x7a\x82\xe4\xf7\xc9\x9d\x32\xd8\xe2\xb9\x7d\xf3\x65\x07\x52\x88\xb6\x73\xad\x2a\x7c\xa0\x38\x54\xbe\x38\x6d\xf7\x40\xa7\xcf\x87\x3d\x48\x77\x68\x6e\x76\xc3\xbe\x25\x65\xe8\x96\x3e\x38\x01\x78\x06\xbb\x88\x26\xf6\x67\xb6\xc1\x7f\xf7\x05\xef\x2f\x7c\x11\x80\xd3\xab\xb6\xda\x22\x95\x41\x0e\x5c\x50\x97\x3e\x5f\x00\xb9\xa2\xde\x4f\x47\xf6\x27\xa8\x4a\x3c\xfc\x8a\xfe\xbd\xfd\x07\x6e\xbd\x6a\x03\x2c\x59\xa1\x7f\x8c\x0e\x14\xcb\x86\x6c\xfa\xf9\x71\x61\xea\xc3\x95\x21\xe6\xd9\x83\xa2\x5e\x93\x9c\x20\x62\xb3\x8e\xa9\x2f\x4d\x33\xec\x6f\x7f\xe9\xaa\x6d\x0b\x37\xc0\xd5\xed\xaf\x97\xb6\x29\x1e\x1c\x3f\x24\x0d\xc0\xb0\xa9\x91\x8b\x45\x32\xbf\x7e\x98\x36\x5b\x02\xf9\xfc\x0d\x4d\x63\x73\xef\x69\xdc\x55\xef\xfc\xc4\xbc\x12\x16\xbe\x82\x40\x63\x70\x65\xee\x3b\x00\x22\x19\x2a\x02\x64\x75\x2d\x09\x03\x1d\x9f\x7f\xa4\x2a\x0e\xc5\xb6\x30\x16\xac\x67\xde\xce\xd7\x83\x1b\x66\x7f\xfb\x33\x30\x1c\xed\xa8\x1e\xdf\x15\xc9\x72\x03\x49\x9a\xb9\x1b\x95\x98\xfe\xb8\x40\x7d\xbd\x54\x0a\x75\x58\x5d\x2f\xa2\x12\x00\x55\xcd\xb6\x1e\xca\xe9\x21\x7d\x7c\xdf\x7d\x8c\xed\x34\xaf\x81\x81\x6b\x04\xe4\x49\x47\x3a\x26\x40\xa2\xe6\x0a\x2e\xcd\xb2\xfd\x4c\xbd\x23\xd6\xd0\x16\x0a\xcd\x5b\x22\xbd\xa2\xa0\x92\xab\x1a\x8a\x51\x77\x5a\xda\x61\x19\x48\x75\x90\x89\x59\x1b\x9d\x5f\x15\x29\xc9\x26\xe9\x1e\x08\x2c\xea\x6e\x51\xa1\xe6\x7d\x3b\xd6\x1b\xb8\x6d\xd7\xbd\x79\x6d\x1b\xe8\xb8\xc9\x85\xbc\x9f\xc8\xc4\x81\xf4\x6c\xc9\x46\xad\xbc\xce\x14\xe1\x49\x6a\x01\x9f\x3b\x53\x29\x37\xb1\x61\x2d\x64\xd3\x50\x65\x84\x17\x5a\x0f\x74\x63\xb6\x2a\xd3\x90\xa4\x27\xde\x69\x82\x85\xd9\x95\x53\x84\xcf\xf7\x31\x38\xea\xc2\xaf\x82\x5f\xd6\xb0\x0d\xdf\x45\x82\x2e\xaf\xa4\x7c\x23\x2e\x0c\x45\x73\xf8\xbb\x5c\x27\xea\x0d\x52\x42\x05\x31\x65\x6b\xbb\x9e\x6f\x20\x64\xd1\xf1\x22\xaa\x1a\x24\xe9\x78\x83\x7b\x42\x95\xac\x9c\x28\x4e\x44\x2d\x3e\xea\x04\x30\x09\x2f\x96\xa4\x97\x84\x1f\xb7\x51\xc3\xc0\x9b\xc2\x05\x6e\x7b\x71\xfc\x89\x14\x33\xed\x44\xd3\xfe\x12\x9c\x6b\x58\xf1\x29\xa8\x23\xe8\xb6\x40\x35\x40\xac\xf3\x11\x5f\x24\x44\x4f\xda\x98\x58\x65\xc3\xb3\x27\x1d\x34\x73\x33\xbc\x71\x35\x48\x31\x28\x72\xf3\xf4\xe2\x0a\x86\x48\x08\x72\x07\x68\xd1\x60\xfd\xce\xed\x3f\xea\x1e\x0f\x3a\x8a\x5e\x70\x9a\x1a\x8f\x0b\x6c\x89\x08\x53\x06\x89\xf1\xf6\xff\x29\x5a\x52\xd7\xca\xf2\x66\x34\x06\xa8\x40\x52\x03\xce\x85\x2e\x07\x9a\x25\x5f\xdb\x9b\x58\x46\x15\xbe\xd9\xd9\xdd\x50\xa1\x86\x86\x57\x67\xcb\x0c\xcd\x10\x5d\x8e\xa8\x73\x42\xe5\x09\xca\x9c\x04\x74\xe3\x9b\x23\xc7\x8f\x40\xf3\x43\x13\x49\x03\x47\xc5\x9e\xd4\xbd\x70\x59\x51\x4f\xb8\xe4\x9e\xd5\x33\x33\xb2\x98\xd6\x3f\x20\x43\xe2\x2d\x2b\xa8\x17\x50\x6d\xd7\x49\x50\x2f\x8b\xbc\x67\xea\xab\x76\x60\x9d\x8f\xeb\xab\xba\xc6\x1d\x60\xc7\xaa\x20\x39\x19\xe0\x5d\x0c\x89\xf8\xb2\x56\xe8\x19\x94\x23\xae\x8a\x1e\xbd\x58\x4a\xed\x5b\xa0\x8c\x15\x69\xa1\xe1\xae\x6e\xdc\xa5\xed\x6e\x7f\x3d\xae\xbd\x43\x0f\x2c\x35\x77\x88\xd2\x0c\xba\x4e\xe5\xfd\x5d\x9a\x77\xc8\xaf\xf6\x63\x3a\xa1\x5d\xf1\x0d\x63\xb8\x13\xea\x2f\xef\x01\x51\x2a\x9b\x16\x6a\xd7\x72\xcb\xbe\x9f\x9f\xf9\x90\x19\x52\xb7\x1f\x30\xbd\x05\xfb\x14\xad\x99\x0f\x49\xce\x03\x17\x15\xec\x57\xd1\x57\x4d\x76\x1c\x16\x3f\xe0\x09\x7a\xb5\x80\xed\x6c\x76\x56\x4c\x44\xab\x67\x43\xc9\x7c\xac\x58\xc1\x7e\x6a\xe1\x22\x6d\x1b\x54\x3d\x6f\x3b\x18\xd3\x40\x4a\xc0\x7d\x70\xae\x43\x4f\xae\x54\x8d\x24\x2e\x5e\x37\xc1\xc1\xab\x38\xdc\xfe\x63\x83\x76\xea\xc5\x65\x5b\xd7\xed\x1b\x54\x33\x9d\x23\x7e\x03\x77\x85\xae\x81\xd0\x11\xd0\x88\x4c\x5b\x46\x98\x07\x3d\x38\xa9\x84\xda\x50\xaa\x84\xdc\x2f\x17\xf1\xef\x0e\x0e\x81\xfc\x7e\x6c\xab\xb7\xac\x1c\x71\xfc\x05\x15\x20\xfb\x25\xd1\x5e\x64\xc2\xbb\x6b\xe8\x66\xe2\xfe\xc1\x5b\x34\x13\x3a\x84\x74\x87\xfa\x07\xd3\xc3\xb9\x6e\x58\x1e\xa4\x59\x94\x41\xf4\x20\x5f\x98\x8a\x3c\x20\x49\xf3\x2e\x46\x3c\x6e\x58\x9c\x14\xf2\x5e\x71\x0b\xd4\x5b\xee\xd5\x42\xfd\xe9\xd8\x99\x32\x77\x94\x92\xdd\x39\xe1\x4d\x91\x63\xee\x56\xa7\x78\x14\x1d\x3b\x38\x90\xee\x8c\x78\x40\x83\xb6\x1a\xf8\x55\x91\x7f\x0a\xfb\x07\x00\x41\x59\x9d\x78\x5f\x01\xb7\x20\xd5\xe3\x8b\x54\xe7\x58\xda\xda\xf6\x28\x24\xb2\xea\x84\x85\x1d\xd8\xa4\xd5\x77\x55\xb9\x58\x1c\x90\x0f\xdb\xae\xd3\x71\xea\xce\xb6\x3a\x7e\x51\x88\xe4\x82\x90\xb0\xd6\xb8\x54\xd4\x0c\x7a\x7e\x38\xb2\xd2\xd0\x3a\xab\xb9\x4e\x9c\xdb\x52\xd3\x74\x67\x6b\x43\x0e\x02\x70\x7e\x40\xa6\xa6\x61\x1d\x15\x36\x80\xb7\xb0\xfc\x02\x0b\x64\xfa\x8d\xdd\x14\x97\x16\xb5\x1d\x06\x0e\xcd\xf5\xed\x2f\x2e\x28\x55\xfc\xfd\xeb\x6f\x64\x51\xda\x95\x41\xed\xe9\xbd\x65\x08\x1f\x88\x20\xe1\xee\x3a\xe7\xbd\x05\x49\xbc\x24\x46\x76\x98\xd8\xd4\x4b\xf4\x65\x0c\x66\xa2\x53\x56\x45\xb5\xa9\x6f\x2e\x4a\xb0\x64\x01\xfd\x16\x45\x59\x2f\x8c\x0c\x87\x12\xe5\x4a\x5d\xe3\x93\x9e\xad\x7d\x84\x51\x8c\x17\x29\x84\x97\x17\x5f\xd0\x60\x18\x86\x38\x0f\x23\x55\x33\x01\x52\x4f\xbb\xf7\xb9\x1d\xe9\xdb\x0d\x49\x85\x70\xc4\x32\x48\xd5\x41\x3d\x41\xb3\x29\x03\x09\x61\x43\x17\x13\xdc\x49\x34\xb6\x57\xcd\x6b\xa7\xc6\x4a\x2f\x30\x93\xbe\x10\xd0\x7c\x20\x73\x1b\xfe\x01\x38\x3c\x72\xe2\x14\xe3\xb4\x98\xaa\x37\x37\xac\x22\xf9\x92\x2c\xd3\xde\x1c\x1d\x29\x4a\x67\xed\xe3\x79\x95\x60\xad\xf6\xf6\xdb\xc1\x01\xf7\xa7\x24\x2f\x32\x84\x73\x05\xfe\x4c\x8b\x07\xab\xd0\xb6\x4e\x54\xdd\x0c\xae\xb2\x99\xa8\x9f\x94\x50\xca\xc6\xe8\x41\xf5\x3b\xb7\xcd\x0c\x38\x3a\x2c\x39\x6d\x30\x16\xa0\x7d\x4d\xef\x5b\x57\x92\xaf\x83\xa1\x8d\x84\xd6\x51\xe6\x0d\x53\x25\x22\xb4\xae\xf6\x28\x4c\xbe\xf0\x8e\x88\xaa\x54\x8d\x45\x09\x82\xd9\x2f\xd3\xf1\x79\xbc\x91\xfb\x70\x72\x84\x29\x1e\x99\x14\x8f\x14\x3d\x3c\x9d\x82\x8b\xc3\x34\x68\x1a\x24\xfa\x89\x34\xab\xad\xcb\xdc\x97\x85\x96\x85\xbc\x9c\xfd\x07\x72\x75\x56\x2d\x08\xea\x07\xd6\xc9\xe7\xdc\xcd\x1b\xf0\xaa\x09\x35\x26\xf8\x69\xf5\xf6\xa3\x81\x4f\x18\x0b\x97\xf9\xc8\xfd\x5a\x68\x4d\x06\x97\x73\x90\x4e\xbb\xf8\x5e\x34\x9f\xa5\xa8\xc2\xd5\x0c\x8e\x40\x5e\x12\x82\xf1\x45\xa4\x46\xba\xfb\xa7\x09\x4d\x50\x13\xc1\xaa\x93\xf0\xe1\x82\xcc\xe1\x22\x6d\x8b\x78\x88\x0b\x48\x70\x12\xb7\x53\xc0\x2c\xc5\x4c\x13\x6b\x11\x62\x80\xc9\x80\x06\x0e\xb0\x8a\x23\x4a\x1d\x11\x68\x34\x9a\xb3\x07\x10\x1a\xb1\x84\x12\x43\x21\xac\x00\x30\x29\xa8\x0d\x39\xd3\x76\xb4\x44\xf4\x66\x8f\x45\x41\x48\x1e\xae\xbe\x33\x3d\x17\x0a\x43\x77\x91\x1f\x2e\xfc\x42\xaa\x49\xa7\xc4\x89\x7d\xd8\x26\x13\x62\x08\x9e\xd9\x49\x5b\xe8\x79\xb2\x73\x7a\x5b\x9e\x9b\xe7\xfd\x45\x76\x90\x89\x45\x57\x8f\xd3\x3d\xf6\x54\x4d\x90\x01\x7a\xb2\x3f\x71\x19\x51\xb6\x2f\xf2\xa1\x04\x1a\xfd\x24\x58\x78\x84\x93\x4c\xc9\xf3\x47\x0b\x53\x96\x84\xff\x3c\xfb\x93\xb2\xa2\xde\x3b\xb1\xa7\x4c\xa8\xd8\xb0\x42\x0e\x9c\x7f\x5a\x27\xe6\x1a\x34\x2b\xfc\x76\x13\x0d\xe9\x19\x8a\x69\xa1\x0d\x56\xe4\x54\xad\x33\x4f\xc4\x3a\xa3\x1e\xf1\x93\x46\x9a\x23\xb5\xd2\x34\x4a\xec\xe0\x72\xf1\xde\x1a\xc9\x48\x96\xd1\x34\x3c\xd1\xa2\x7b\x77\x7a\x41\x98\x68\xc9\x52\xe4\x97\x9f\x1e\x11\xcf\x3f\x85\x43\x12\x71\x52\xd8\x21\x0a\x51\x61\x41\x49\xe2\x21\xae\x8b\xd0\x8a\xb8\x7b\x21\xaf\x75\xe5\xd8\x1a\xbf\xf5\x0d\x78\x13\xc0\x14\xce\x9c\x22\xb2\xa3\x16\xd0\x69\x0d\xf1\xa3\x66\x81\xc6\xf3\x34\x83\xb8\x82\x3a\x74\x16\xdf\xb3\xd1\x7d\x1f\xbc\x6a\xdd\x84\x79\xf7\x88\xcc\x0f\xb5\x88\xf5\x40\xf8\xc9\x87\x03\xff\x0c\xb2\x34\x90\x48\xd4\x09\x21\x9d\x06\xd4\x76\xec\x2a\x2b\x3a\xfc\xcf\xd1\x46\xd6\xec\x1e\x45\x56\x40\x83\x71\x49\x5f\x7c\xfe\x89\x7c\x29\xd8\x83\x05\xcf\x3f\x0e\x03\x38\x6c\xf1\x6e\xfa\xdc\x44\xb1\x0c\xe8\x22\xdd\x45\xeb\x41\x61\x0d\xa8\xdd\x68\xeb\x41\x16\x34\x81\x3f\x68\x64\x07\xae\xd6\xd0\xf0\xa2\x49\xbd\xa5\x3f\x11\xe9\x8e\x9c\x7a\x0d\xb1\xec\x65\xa4\x90\xf9\x6e\xef\x65\x54\x11\x3b\xa8\x45\x58\x39\x2b\x4e\x85\x5b\x55\x94\xb2\x62\x87\xad\x68\x7b\x58\xe9\x76\xe9\xdb\x23\x9e\xc7\xb7\x47\xf4\x2d\x6f\x35\x68\x85\xf2\x0e\x90\x2b\x5c\x2e\xb4\x19\xaf\x4d\xa2\x51\x53\xf1\x76\xa4\xb2\x15\xac\x8b\x6e\x23\x36\xa6\xa7\x5d\x92\x3c\x91\xa0\xb8\x49\x09\x88\x50\x4f\xd6\x29\x30\xed\xd4\x19\x4d\x51\x4f\xed\xa0\x4c\x17\x73\x44\x46\x6d\x20\xa3\x69\x95\x9c\x7e\x06\x77\x47\x1a\x90\x30\x83\x1f\x40\x34\x47\x5d\x87\x85\x48\xfa\x8b\x89\xa7\x19\x13\x4f\x98\xde\x49\x38\xfd\x20\xa8\x92\xd6\x87\xf6\xf1\xf6\xff\x47\x8d\x0e\x7a\x21\xbd\x93\xbb\xcc\xee\x29\x48\x41\xe5\xd5\xe7\x62\xad\x33\x5e\x6e\x45\xcb\x24\xba\xdd\xd2\xc6\xa0\xbd\x56\x82\x04\x1d\xae\xbb\x89\x75\x3c\xff\x5b\x51\x56\xc6\x2d\xfa\xf6\x35\xa0\x61\x04\x4a\xf6\x42\x2a\x25\x8a\x21\xdd\x4e\xd4\xf4\xb4\x89\xe5\xb8\x40\x99\xb6\x89\x44\x17\x11\x17\x75\x97\xb8\x83\x26\x25\x55\x97\xc5\x4b\xdc\xa5\x48\xce\xaa\xab\x9d\xd0\xfb\x40\x21\xd4\x22\x2b\x64\x02\x18\xc7\x66\x03\x22\x37\x6a\xa8\xae\xe1\x8a\x1e\x90\x57\xe7\xa2\x78\x87\x48\xa5\xc2\xe3\x51\x07\x06\x81\x46\x07\x06\x9d\x9b\x21\xf8\x35\x2d\x47\x34\x43\xfa\x4d\xcc\x89\xd0\x37\xd1\x2d\x49\x28\x86\x78\x9a\xf8\x5a\x7a\x1d\x52\x01\xaf\xb8\xe3\x45\xb8\xe0\x86\x76\x24\xc0\xb0\x6b\x2d\x4f\x0a\xa7\xc7\x6e\x8b\x5e\xb4\x57\x31\x05\x7b\x24\xdd\xda\xc9\xd9\x53\x0d\xeb\x58\x2e\x7c\x87\xdc\xf0\x19\x39\x83\x60\x7c\x4e\x2f\xce\xc7\xb2\xa7\x89\xa7\xa1\x78\x1d\x90\xe5\x37\x12\x7e\xb8\x9d\x24\x4a\x84\x87\xee\xa7\x17\x4f\x6d\xea\x13\xaf\xb4\x75\x6c\x7a\xe2\x9e\xc3\x6a\xf1\x74\x93\xa3\x50\x9c\x26\x2a\x61\x42\x85\x83\x5a\x95\x9b\xa9\x46\x64\xc9\xc5\xc1\xa3\xc8\x22\x73\x70\x92\xd7\xb7\x7f\x3b\xae\xdb\xc0\x89\x7b\x5a\xc3\xa3\x17\x46\x6b\x11\xef\xf1\x0c\xc3\x36\xd3\xf7\x74\xd5\x69\x4e\x6e\x6e\xf8\xef\xa3\x46\x49\xc4\xc4\x3c\x31\x8a\x67\x16\xf1\x6f\x17\x33\xbd\x22\xc6\xfb\x3e\x93\x7d\x20\x05\x11\x6a\xcc\xd0\xef\x46\xa4\x23\xe3\x65\x43\xba\xc3\xc3\x78\x9c\x06\x62\xc0\x89\x91\x11\xa8\x35\x5a\x75\x32\xc1\x08\x2d\x00\x22\x95\x9f\xc4\x4a\x90\x92\x81\x61\x21\x3c\x38\x71\x19\xa6\xc1\x7d\xa3\xcd\x43\xfd\x89\xde\xf7\xe4\x9d\x79\xf6\xe2\xf1\x93\x97\xb7\xff\x57\xb8\xea\xc9\xa8\x66\x1d\x69\x52\x3e\xf2\xbe\xac\xd9\xb0\x82\x47\xab\xd5\x0d\xce\x46\x2e\x6e\xb6\xe9\x95\x13\x4f\x40\xe1\x02\x15\x13\x62\x62\x39\xee\x45\x29\xfd\x68\x02\xfe\x64\x77\xf1\xce\x2d\x7e\x40\x9e\xe8\xd5\x82\x75\xfc\x8f\xdb\xa6\x0d\x06\xa5\x69\xf3\x75\xb0\x37\x69\x58\x0e\x40\xb9\x3c\x34\xd7\x15\x9b\xb6\x11\xdf\xfd\x03\x46\x54\x36\xc8\x70\xed\x61\xd3\xbb\xea\x1d\xc6\x83\x57\x28\x06\xdd\xfe\xa3\x41\x23\xe6\x72\x81\x6e\xd3\xa4\x55\xb8\x59\x7d\x2f\x7f\xe2\x85\xc2\xe5\x58\xac\x9d\xd1\xfd\xc0\x96\xc2\xc4\x42\xf3\xb9\x3b\x98\xa6\xd8\xc2\xed\xe5\x56\xf7\x06\x44\xaf\xb2\x40\x3f\xc6\x7b\x8f\x50\x54\xba\x86\x03\x0f\x5b\x05\x20\x8f\x46\x4d\x62\x8c\xf1\x96\xd4\x9c\x64\xc5\x56\xc7\x22\x28\x05\x46\x79\x08\x47\x42\x9d\xe1\xe2\x39\xf2\x65\x6d\x51\xb9\x35\x3f\x00\xe9\xdf\x8d\x07\x80\x31\xcd\x3a\xb1\x07\x27\x89\x96\xa8\x24\xee\xe8\xda\xd4\x30\x14\x8a\x68\x62\xb5\x51\x18\x0e\xd6\x75\x0f\x17\x14\xa1\xe4\x63\x8a\x32\x4e\x54\x83\x3c\x11\xe6\x8b\x02\x17\x96\x14\x02\x77\x46\xd6\x52\x68\x3d\xb2\x92\x1f\x2d\x68\x78\xa4\x9f\xff\x8a\x82\xaf\x33\x44\xa0\xcf\x14\x36\xc4\x9f\x2d\x97\x8c\xb6\x6c\xec\x6f\xc2\x13\xed\xd8\x41\xdf\x6f\x36\xbb\xd1\xa5\xdb\x8a\x2d\x8a\x89\x93\x10\xfe\x31\x25\x11\x90\xb0\x3a\x2c\xc5\x28\xfc\xd5\xb7\x15\x87\xe2\xb3\x9a\x1d\x7d\xbc\xab\x5d\x83\x7e\xa8\x3e\x18\xb9\xb6\xc2\x08\x6b\x1c\x3f\x21\xec\xd2\x43\x2e\x80\xa6\xc0\x55\x68\xa1\x29\xf8\x17\x08\x8f\x16\xe4\x4d\xd0\x10\xa3\x40\xd6\x5a\xe1\x3b\x0b\xe8\x83\xfe\x86\x95\x39\xde\x5b\xf9\x39\x59\x1b\x43\x78\x6a\xae\x2c\xc0\xe8\x61\xb1\x06\xd9\xbe\x5f\x3d\xe5\x3c\x08\x44\xed\x88\x70\x67\x66\xc8\x7d\x11\x07\x8c\x39\x9d\x17\xe2\x84\x95\x86\xd5\xdb\x94\x36\x8e\xdd\x4c\x93\x6d\x2b\xed\xa5\x19\x6a\xb5\x80\xac\xd8\x51\x43\x15\xf0\x12\xd1\x0f\x64\x72\x68\xec\xea\x7b\xb4\x33\x74\x49\x19\x6f\x43\x60\x8c\x2a\x47\x14\x05\xd0\x07\xe8\x0f\x39\xca\xb1\x5d\x2c\x32\x9d\xec\xd9\x01\xb8\x69\x59\x81\x63\xb5\xbd\x0a\x6d\x9d\x80\xe1\x30\x69\xfe\xa3\x65\x2f\x4d\xfc\x58\x3c\x40\xc1\xf7\xa1\x82\x02\xa7\xda\xe1\x95\x12\xd9\x8e\x7d\x9a\x80\x14\x24\xf0\x1f\x22\x77\x93\x33\x80\x41\xc1\x70\x8b\x3e\x56\x0d\x73\x85\x71\xee\x85\xc6\xe2\xe5\x23\x3a\xa6\x26\x92\x92\x97\xda\x36\xf1\xc4\xee\xa6\xd9\x46\x5c\xb1\x83\x86\x81\xf2\x7b\x55\xf4\x1b\x34\xfa\xa3\xa1\xe6\xc5\x06\xed\x26\x26\x98\x6a\x76\xe6\x5d\xe2\x27\xcc\x96\x38\xf4\x10\x05\xde\xd0\x90\x4f\xea\x6b\x47\x67\xc8\x89\xfd\x05\x36\x70\x7b\x25\xae\x8c\xed\xe5\x9a\x36\x94\x92\x2f\x64\xc6\x63\x83\xb6\x90\x0a\xad\xd6\x04\x6b\xbd\xb7\x05\x32\x30\xb0\xf3\x91\xdf\x6c\x4c\xb5\xa0\xe0\x7e\xb9\xbc\xdb\xd4\x93\xe0\xdd\x7f\xa9\xb9\x27\xee\x19\x2e\xf6\xc6\xa2\x16\x77\x40\x1f\xf9\x88\xba\x25\x2e\x49\x92\x57\x22\x0d\xb0\x8f\xf2\x4b\xc4\xdf\x93\x7b\x24\x99\xa4\x28\xed\x32\x4a\x8e\x24\xbc\xd8\xd4\x83\xbd\xf7\x88\x91\x41\xa9\xb8\x36\x4a\xc7\xec\x19\xfe\xc8\xce\x99\x00\x2c\x99\x42\x4f\x60\xb0\x84\x97\x4e\x03\x32\x1e\x53\x4c\x6a\x58\xf3\xbd\x0f\x4c\xf5\xe1\xa8\xe7\x9f\x7c\xfd\xf4\x02\xb5\x05\x30\x70\x1f\x6a\x1f\x87\x27\x73\x40\xdf\xd2\xf7\x22\x3a\x53\xe6\x14\x9b\x0a\x76\x29\x8f\x2a\x17\x45\x48\x97\x61\x0d\xb6\x03\x42\x91\x6f\x28\x04\x32\xa0\x73\x61\x12\xf7\x4a\x45\x3e\x7a\xa1\x3d\x8a\xa9\x41\xec\x24\x09\x63\x8e\xe3\xa8\xb5\x65\xb1\x8b\x3f\xf3\x3b\x98\x58\xc4\xe5\x4c\xd2\xc5\x23\xc4\x42\xae\x1e\x40\x14\x2a\xbd\x8c\xaf\x23\x0a\x65\x05\x42\x79\x39\x9a\x27\xc7\x54\x69\x5e\x91\xfc\xe6\xc1\x43\x8a\x0a\x0b\x18\x26\xb0\x9d\xc8\xd1\x1d\x6e\xd6\x68\xaf\x01\x26\x0e\x45\x83\x50\xe0\x19\x5e\xfa\x50\xb6\x11\xac\xf8\x17\x9d\xe1\x8e\x12\xf9\xff\x1f\xff\xef\xff\x77\x7c\x8a\x4b\x70\xda\x77\x35\xfc\x25\x7a\x3d\x6d\x10\xb7\x43\x5a\x89\xf9\x62\x10\x20\x89\xbc\x44\xf6\xda\x96\xa9\x4c\xc7\x74\x47\x89\x0e\x8a\x9a\x48\x72\x98\x40\xdb\xce\x1b\x85\x89\x10\xad\xbe\xd2\x5f\x94\x56\x05\x29\xce\x02\x05\x7a\x42\x35\x15\xe6\xcb\xe8\x86\x85\x6b\x66\xfb\x7a\x8d\x76\x67\xbb\xc2\x8c\x1b\x05\x9c\x90\x03\x3a\x75\x33\xaa\xf6\x57\x95\x93\x6b\xa6\x66\x45\x6a\x7e\xa8\xe2\xc8\x07\xba\x9a\xd1\x3b\xcf\x80\x74\x7c\xda\x45\x1e\xc9\xe9\xc2\x37\x28\x90\x7b\x3f\x54\x0a\xc8\x5a\x1c\x06\x74\xb8\x43\xfc\xe1\xfe\xce\xe0\xf7\x68\xc7\x18\xbf\x50\x7f\x37\xd5\x04\x75\x0f\xe3\xa5\x94\x07\x13\xc7\x9f\xb5\x5a\xe4\xe7\x17\xfb\x9d\x5f\xb7\x35\xd2\x55\xbc\x33\x7a\x74\xf9\xfe\x68\xb1\x20\xcf\xe0\x53\xf6\x05\x5e\x24\xb7\xe8\x02\x68\x3a\x50\x20\xf8\xcf\xe2\xb2\x42\x1e\x47\xdd\x0c\x30\xa3\x43\x6f\x76\xab\xaf\xa0\x14\x09\x85\xb8\x1a\x20\x7b\x69\x76\xd2\x06\x88\xab\x5f\xca\x1f\x0b\x28\x75\xab\x0b\xf8\x8f\x66\x73\x79\x4a\xff\x50\xde\x17\xc9\xf7\xf2\x52\xf3\xbd\xd4\x66\x63\xd1\xc4\xd1\xa3\xf4\xda\x1b\x07\x07\xa4\x86\x0f\xb0\x41\x18\x2b\xa3\x7f\x2e\xc4\xb1\x72\x75\x2a\x0e\x96\x70\xfb\x58\xe3\x00\x86\xd2\x1d\xa1\x39\x9b\x0c\xa4\x9d\x79\xb3\x7a\x69\xde\xf0\x0f\xd8\x5f\x4a\x07\xf4\x0d\xfc\x8b\xab\xb4\x6d\xb9\x9c\x82\x6a\x10\x12\x63\x6a\x3a\x85\x26\x89\x83\x4e\x08\xf0\x63\xaf\x23\x01\x84\x3f\xa3\x13\x73\x8d\x6c\x27\x2f\xbe\xf2\x50\x70\xbe\xd0\xd7\x1e\xc4\x72\x98\x3c\xba\x3e\x08\x4b\x8d\xdb\x49\x01\x04\x0b\x5b\xa2\xdf\xc4\x92\xd2\x01\x55\xb5\xf8\x93\xaa\x2f\xa7\x7c\x64\x7b\x1f\x7f\x7f\xc2\x0e\xe1\x19\x04\xfe\x23\xdf\x4b\x36\x5e\xa6\xdf\x0f\x9d\xa5\x69\xb1\xf9\xc9\xa1\x18\xa2\x62\xa7\xe7\xcb\x71\x95\x04\x7c\x6b\x1a\xf2\x1d\xc1\x56\xd1\xc5\x1a\xef\x09\x6a\x1e\xf6\x6a\x1f\x38\x5d\x9b\xf4\x15\xb1\x46\x5e\xb6\xc7\xeb\x8a\x03\xae\x80\x2f\x6d\xd2\xe1\xd2\x01\x8b\xc7\x6c\xa3\x95\x53\xc8\xfd\x00\xa7\x62\x63\xd7\x30\x08\xa3\x4c\xdd\xf7\x91\x4f\x0c\xf9\xaf\x52\x24\x90\xa2\x9d\xa4\xf0\x69\x11\xcb\xf7\x62\x86\xd4\xbc\x16\x59\xe3\x44\x42\x37\xf6\x12\x99\x69\x2c\x8a\x5b\xbe\x44\xbe\x46\xe9\xe7\xe8\x3c\xf9\x44\x3c\xb2\x04\xa3\x2d\x53\x9d\x41\x98\x63\xac\xb0\x98\x9a\x24\xaa\x35\xd7\x6f\xba\xaa\x57\xcd\x58\x3c\x1a\xf6\x21\xf3\xf6\x40\xf2\xdc\xc5\x7c\x63\xa2\x71\xe7\xc1\x52\x58\xc4\x07\xcd\x9b\x5d\x33\x68\x84\x5e\x6d\x27\x18\x4b\x4c\x0b\xeb\x0c\x72\x73\x94\xa2\x2a\x32\x44\x14\x34\x23\x08\xbb\xb7\x95\x78\x09\x71\x1b\x18\xff\x16\xf5\xe4\xa5\xe9\xd5\x19\xe9\xd8\xbc\xda\x1e\x09\xf2\x01\x43\x03\x8f\x0a\x73\xb0\x18\xc1\x23\xae\xe0\xc2\x2e\xa1\x6b\x9d\x5e\x2d\x9f\x2c\x8b\x33\x8e\x24\x60\xd2\x1f\xd5\x85\x7b\xd8\x67\xfe\x80\x6a\xc2\x3f\x03\xbb\x70\x68\x93\x26\x36\x66\xfb\x1a\xb8\x9b\xad\xf5\xa3\x83\xcb\xab\x1d\x22\x9c\xdf\xda\x7a\x4d\x0e\x49\xab\xad\x3a\x22\xe8\x47\xa2\x2b\xfe\xf8\x3c\x01\x71\x95\xd3\x18\xe8\x42\x2b\x20\x6a\x9d\x7b\x10\xc2\x22\xeb\x04\xac\xe8\x27\x9f\xeb\x42\x3c\xfa\x38\x82\x4c\x81\x3e\x0e\xc7\x1d\x8d\xf3\x91\xd7\x40\xfc\x51\xdc\x72\x14\x9d\xe2\x4f\x32\xc8\x3d\xbb\x95\x8b\xaa\x8c\x7b\xe0\x10\xae\xe8\xf6\x23\x3c\x6c\x4a\x0c\x4c\x92\x84\x1b\x75\xb4\x6d\xd2\x12\xb2\x2f\xdb\xbe\xbe\x01\xea\xc6\x98\x2c\x07\x90\xa7\x2f\x7c\x98\x18\x98\x1a\xf5\x7e\x57\x4d\x92\xf2\x98\x5c\x7a\x8c\x93\xbf\x47\x31\x3f\xa2\x53\x0a\x9d\x85\x5b\x54\xda\x87\xfb\xd3\x32\xaf\xca\xa0\x74\x8d\xf2\xb7\xa0\x92\xa2\x2d\xb7\x62\x6e\x81\xd1\x16\xc4\xf3\x50\xbd\x43\x94\x32\x6c\x19\x53\x58\xf5\x8b\x23\x5f\x1f\xe2\x0b\x62\xef\x7d\x10\x57\x62\xdc\xcd\x7d\x52\x72\x94\x16\x22\xb9\xb1\x72\xeb\xfa\xa4\x3f\x72\x92\xa6\xd3\x2b\x71\x23\x7a\x73\xd6\x28\x49\xdf\xf0\xe5\xaf\x37\x24\x1f\xc1\xc8\x9c\xd4\x8c\xe8\x8f\x6f\x87\x77\x08\x6e\x31\xbc\xfc\x8d\xde\x10\x6c\x74\x65\xb9\x26\xa4\xdc\x39\x98\x4a\xd8\x52\xef\x21\xc2\x63\xf4\x67\xe9\xae\x9e\xfc\xb4\xa9\x23\xdf\x6f\xe4\x6f\x42\xfd\x89\xd1\x81\x9b\x8b\x78\x96\xbb\x1b\x26\xea\x8b\x19\x02\x80\x5f\x03\x66\x6b\x07\xbc\x85\x2c\x49\xd6\x7c\x1c\x96\x4c\x76\x3a\x24\xbf\x4d\xea\xdb\x2b\x02\xf9\x7b\x7a\xe4\xa3\x5c\xae\xdf\x5c\x45\xfd\x53\x04\x92\x5a\x03\xa3\xad\x84\x63\x0e\xc4\x15\x30\xa6\x8c\xcd\xa7\x42\x6d\x30\x7c\x92\xaf\x81\xe5\xdd\xca\xa7\x28\x2c\x8a\xac\xa0\x84\xc1\x48\xcc\x98\x1f\xe7\x4e\xe0\xff\x15\xed\x03\xe9\xb2\x4a\x6f\xbc\xbe\x3d\x3b\x07\xae\xdd\x74\x96\x7d\x32\x3b\x32\x3d\xba\x40\x9a\xd2\x79\x67\x28\xf7\x5d\xc0\x06\xa4\xf5\x74\x14\x7e\x03\xfe\xc1\x7e\x09\x4d\x44\x1a\x81\x21\xd2\xc1\x6e\x16\x7b\x85\x15\xfb\x56\x32\x42\xe8\x58\x28\xb5\x4f\xbb\x16\x47\x24\x42\xdc\x6f\xda\x01\xaf\x74\x0c\x57\xc0\x4c\x51\xc4\x44\xe3\xea\x7a\x3a\x18\xa3\x02\x89\x4b\x11\xd1\x75\xc3\x06\x90\x32\xa2\xa8\x98\xb7\x60\x13\x09\x60\xe1\x60\x8b\x97\x34\xf5\xee\x19\x2b\x97\x75\xcf\x57\x2a\x03\x90\x50\xae\x4c\x8e\x77\x80\x88\x47\x10\x37\x84\x0d\xe3\x50\x52\x4e\x2d\xaa\xb8\x50\x76\x75\x99\xb3\xad\x5a\x9e\xc7\x5a\xfb\xc0\x21\x05\xb8\x44\x23\x1c\xb9\xb6\x75\xbe\x0c\xd5\x08\x70\xa3\x9d\xa0\xf6\xc0\x17\xee\xb3\x18\x23\xff\x81\xae\x98\xc7\xa6\x37\xbe\x84\xe3\xe8\x9f\xe1\xe1\x39\x69\x7a\x64\xff\xf5\x0b\x90\x4e\xfd\xa2\x36\x50\x0d\x34\xc7\x84\xa0\x44\x44\xe9\x77\x54\xba\x1c\x71\xee\xd1\x37\x3c\xe6\xf8\x79\x75\x8e\xb9\x43\x04\x22\x06\xd8\x02\xfb\xde\xad\xa5\x89\x6f\x41\x66\x47\x2e\x6f\xaa\x25\x2f\x0e\x04\x69\x20\xeb\x28\x40\x60\x67\xfb\x29\x28\xee\x2d\x00\x4a\x87\x93\xb0\x2d\x70\x2a\xeb\x89\x5e\x25\xe1\x8d\x4b\xdb\x6d\x1d\x06\xcb\x4e\x40\x5f\xda\xed\x15\x65\x35\x8c\xc0\xe1\xba\xc4\xb4\xa8\x18\x13\x87\xa1\x37\x8e\x12\xcb\x8e\xc7\xe9\xc1\x64\x98\xdd\x0c\x34\x1a\xb3\x15\x94\x74\x55\xa6\xef\xaa\x0d\xd9\x4f\x14\x8c\xaf\x5e\x91\x57\xf3\x1d\x94\x2d\x22\x97\xbc\x89\x3d\xe2\xcf\x6b\xe0\xeb\xb7\x36\x49\xd7\x10\xa0\xf1\xcc\x25\x3d\x49\x93\xdc\x5f\xde\x26\xb7\xe7\x55\xd8\x4b\x49\xc9\x82\x5a\xda\xdd\x40\xf7\x7a\x9c\xcf\xd1\x63\x03\x7a\x14\xfd\x72\xcc\xf1\xa5\x65\x40\x8e\xbc\x35\x74\xe5\xe2\x65\x50\xbd\x6d\x68\x81\xbc\xf1\x13\x77\xbe\x6d\x4d\x01\x12\x00\x75\x2f\x99\xff\xbd\xc2\x6c\xab\xbd\x70\xdd\x21\x6d\x0d\x6a\xa8\x1c\x8b\xfc\x7e\x8c\xf1\xb0\x42\x10\xf2\xcc\xe8\xa6\x34\xe9\x93\xb3\x9d\x6b\x60\x70\x98\x31\x57\x85\xa8\xdf\x54\x55\x49\x71\x90\x31\x33\x42\x4c\x3b\x10\x91\xdf\xd2\x7a\x43\x43\x20\x84\xd2\x38\x1d\x8f\xde\x6c\x56\xf7\x4b\x39\x11\x1e\x03\xf0\x30\xe8\x27\x41\x7f\xfd\x26\xfa\x04\xc6\x8e\x27\x19\x5e\xc4\x1f\x91\x41\x20\xbb\x40\xef\xef\x19\x9d\x5f\x64\x2f\xc8\xab\xde\x41\x24\x72\x88\x51\x07\x81\x0a\xc4\x06\x89\xac\xba\x3f\x67\x27\x7a\xc4\x26\x20\x76\x15\x40\x44\xed\x23\x39\xe2\x23\x29\x0a\xa9\xb4\x86\xd7\xf7\x4e\x94\x2f\x31\x8f\x8b\x28\x4f\x7c\x96\x47\xfe\x3d\x09\xed\x24\xdf\x32\xec\x32\x08\x6e\xd1\x28\x31\x9f\x17\x31\x33\x53\xd5\xf8\xcc\x96\xe8\x7d\x8d\xb5\xf0\xd4\x96\x6d\xf0\xa3\x98\xaa\x82\xbc\x09\xac\x10\xb2\x72\x58\xe5\x19\x5a\x24\x60\xc1\x7c\x22\xd3\xac\x8e\xa3\xa8\xef\xae\x04\xce\x72\x6a\x09\xf0\xf3\x92\x90\xb4\x4f\x6e\x9f\x7c\x92\x04\x87\x24\x48\xe1\x0c\xdd\x5f\x93\x60\xdc\x84\x88\x58\x71\xa3\xe2\x50\xec\x3d\xe5\x27\x6b\xa3\x56\xc9\x57\x26\x87\x9d\xdf\x52\x1b\x99\x20\xbc\x53\xd1\xd7\x8b\xba\xde\x52\x12\xad\x3b\x3b\xf3\xf0\xd4\xdb\xb8\x02\x1e\x38\xda\xa3\xd5\xfd\x1f\x3e\x7d\xe5\xd8\x1d\x8c\x73\xaf\xe1\x4e\x05\xdf\xba\x1f\x7e\xf7\x0a\x78\xd0\xfb\x3f\xfc\xfe\x15\xa5\x16\x1e\xd5\x5f\x5f\x9a\xd7\x76\xba\x11\xaa\xab\x15\x48\x95\xd4\x0e\x6e\x75\x82\x86\xad\x0a\xb3\x52\xe9\x9d\xf0\xb6\x5f\x9d\xb1\x7b\x67\x9b\xd2\x03\xa2\xe4\x27\x63\x72\x50\xca\xa7\xaf\x52\x72\xd0\x0c\xfb\xb5\xcc\xdb\x21\xb5\xe0\x59\x4b\x1e\x1a\xad\xcf\xdf\xd1\x7c\xd2\xaf\x7e\xf4\xeb\x12\x26\xfc\x2f\xc8\x72\xdf\xa7\xb9\xfe\xa8\x95\xd4\xcb\x9e\xeb\xfa\xb4\x89\x17\x98\xd4\x05\x06\x67\xdf\x71\xa4\xa1\xb8\x80\x88\xe7\x84\x17\x32\x75\x0c\x5f\xf8\x71\xb6\xde\x75\xef\x84\x02\xba\x48\x0a\xb9\x22\xf7\x72\x91\x22\x96\x29\xf9\xa3\x1f\x3c\xdd\x2e\xfd\xa2\x63\x62\x88\x53\x9e\x0f\x65\x12\x4c\x80\x3b\x4b\x2b\xca\x50\x2f\xad\xd9\x74\x55\xfe\x6d\xb6\xa5\x2e\x05\x97\x2b\x59\x11\x4c\x01\xb3\x0d\xc2\xd5\x15\x6a\x8d\xd7\x21\x2c\x6f\x55\x22\x36\x01\x9a\xdc\xf3\x2b\x4d\xbf\x1e\x11\x9a\x24\xeb\xcd\x23\x92\x56\xb0\x7b\x42\xa9\xdf\xdc\x8c\xa8\x23\x00\x8a\x37\x5b\x03\x40\x29\xf6\x92\xbc\x45\x45\x05\x28\x9a\x80\xdf\xd6\x3a\x88\x35\x98\x37\x9f\xf9\x66\xdf\xa3\xa6\x6f\x6a\x29\x55\x2f\xfd\x5d\x86\xef\xec\x50\x72\x16\xdb\x2b\xf5\x93\xa6\xdc\xd3\xa0\x7b\xd2\x33\x24\x2e\xae\x5f\x51\xd2\x34\x4a\x02\x13\xe4\x40\x8c\x3b\xac\xd0\xe7\x9d\x1c\x6d\xd8\xf1\x05\x33\xa4\xa9\xe3\xb3\xb4\x4e\x6a\x4a\xd6\x97\xfa\xb1\x66\x7a\x0a\x1d\x87\xb9\x06\x96\x97\x52\x8c\x65\x37\x7f\x92\x5d\x61\x9a\x0b\x83\xf9\xd3\xc4\xbb\xbb\x40\xd0\xe7\x07\x4e\xe7\x0c\x83\x11\xf0\x94\xce\x70\xf0\xeb\xcd\x18\x65\x86\x9e\x98\x17\x7f\x48\xf5\x5d\xe9\xb7\x24\x75\x45\xc8\x5c\x3a\x39\xdc\x29\xe7\xb3\xf7\xc1\x8a\x1b\x92\xa8\xda\x12\x66\x03\x35\x91\x7d\xd5\x91\x5f\x15\xf2\x43\x7a\x09\x87\x69\x92\x1d\xbc\x26\x15\x55\x85\x52\xf9\x1e\x44\x3a\xbc\x08\x97\xc5\x1f\x07\x4a\x63\xa2\xbe\xc7\xe2\xab\x34\x3d\x82\xe0\x55\xe9\xbb\xbe\xc3\xe7\x35\xa2\x9f\x1e\x9f\x84\x86\x46\xbf\xc3\xfd\x69\xfa\xde\x6c\xaf\xf0\xdc\x07\xc6\xed\x47\x51\x53\x78\xed\x04\xe2\x6c\x21\xc9\xb6\xc8\x0b\x19\x78\xd9\x1f\x27\x5a\xd0\x1c\x80\x69\x0b\xc8\xf7\x1a\x6e\xe4\xc7\x05\x9b\x78\x82\xd0\x18\xdb\x7a\xe4\x1b\xba\x4d\x9a\xce\x7a\x55\xeb\x29\xfd\x4e\x54\xad\x93\x80\xbc\x57\x1e\x9a\xbc\xfb\xe0\x86\x55\xeb\x53\xa1\x16\xd1\x58\x37\xc8\x0e\xf9\x89\xaa\x24\x6d\x1b\xb3\x97\xae\xf0\x3f\x79\x9f\xfc\xef\x6a\x2b\xdd\xc9\xe7\xc4\x2c\x96\x99\xc3\x74\xea\x2d\xfa\x23\x0c\x35\x6c\xca\x73\x54\xd2\xd9\x86\x92\xcf\x91\xbb\x81\x42\xf4\x57\xc8\x3f\xf5\xad\xef\xe6\xb9\x5e\x2b\xe4\xe1\xed\x73\x5a\xd1\x44\xe1\x7e\xe6\x34\xe2\xa2\x7d\xc5\xd1\x62\x08\x4e\x71\x65\x4d\xa9\x39\xcd\xaa\xdd\x40\xd6\x6d\xee\x01\xc3\x9f\xe3\x37\x16\x56\x3f\xfe\xc1\x2b\x7b\x52\xe5\xa9\xd3\xa4\x67\xa4\x51\xa2\x05\xa5\x34\xe1\x9f\xc5\x7c\x05\x90\xd5\x4f\xa8\xe1\x4f\x90\xb9\x28\x85\xc4\xfe\x0b\xfd\x60\x42\x2b\x8b\x17\x0b\x9b\x13\x3b\x4f\x74\x89\xb7\xf1\x4f\x72\x42\xb6\x98\xde\x12\x7b\x28\x55\x03\x82\x87\xed\x73\xb4\x51\x2a\x21\xa7\xbf\xe9\x4a\x91\xd2\xdf\xfb\x52\x69\x77\x6f\xbb\x9d\x72\x1a\xdc\x3c\xb5\x0c\x57\xc8\x3f\xdd\x32\xd4\xfc\xd7\x57\x8a\x88\x70\x68\xd6\x4a\xac\x89\xc2\x9c\xc6\x94\x3b\x01\x4a\xb5\x3d\xe1\x0b\x2b\xa0\x4e\x54\x53\xa4\x51\x97\x0a\x22\x17\x3b\x60\x04\xcd\x25\x4a\xf6\x40\x57\xba\xa8\xc1\xe3\x25\x15\xed\xb8\x66\x53\x37\xa9\x43\x68\x41\xcd\x2c\x93\xf5\x01\x06\x13\xfe\xc1\x06\x99\x81\x8d\x70\x45\x00\x5e\x70\x35\x31\x87\x25\xbd\x11\xbf\x48\x9e\xab\xb9\xcd\x88\x5b\x01\x7e\x19\xad\x77\xe4\x1a\xfc\x98\xfc\xb9\x26\x1b\xe9\x0c\xc5\xb9\x6c\x3a\x01\xe1\xfc\x0b\xff\x4e\x46\x1f\x3f\xf6\x10\x93\xc5\x36\x46\x76\xa2\xe3\x7e\x2a\x07\xe4\xc0\x6e\x5f\xa3\x2a\xf7\xc4\x27\x3a\xf0\xa0\xc8\xef\xd5\x68\x8d\xe5\xf0\x7b\x1f\xea\x01\x44\x7b\x87\xba\xd6\xc4\x36\x0e\x8c\xbd\xaa\x1e\xfc\xa3\x1a\x08\x4c\x69\x34\x91\x88\x7a\x62\x61\x9a\x35\xf9\xb8\xd1\xf2\x30\x86\x4d\xac\xd5\x99\xee\x8c\x5a\x04\xfc\x82\x65\x09\x6b\xa3\x76\xc9\xdd\xe8\xfd\x4d\xeb\x0a\xa6\x16\x87\xb9\xf6\x01\x02\xce\xb1\x70\xa9\xb4\x1e\x6e\xbe\xcb\xf1\x8b\x1b\xd8\x2c\x53\x1c\x1e\xc7\xde\xc0\xfd\x55\x4b\xcb\x6c\xa2\x73\x6d\x4d\x6a\x6d\x37\xee\x81\x5b\x4d\xa8\xcf\x79\x0b\xe3\x84\x8b\x3f\xc5\x4e\xfc\x63\x82\x48\xd0\x41\x18\x1a\x39\xd3\xd4\x8e\x68\xb2\x7f\xcc\x3d\x60\x66\xb1\x5f\xf8\x60\x25\x9d\x91\xa6\x1b\x58\xc8\xf8\xb9\x19\x95\x81\x1e\xfc\xcb\xfd\xf2\x21\x39\xe5\xd1\xa5\x3d\xf2\x5a\xf4\x39\x6e\xb2\x80\x41\x3f\x17\xab\xb8\xe6\x70\x20\x28\x0d\x4b\xc8\x07\x1e\xc3\x1f\x17\x91\x53\x43\xb8\x1b\x83\xf6\x31\xfa\x3a\x56\xaf\xc4\x1e\x11\x93\x3a\x96\x31\x40\xa9\xf2\x16\xa6\x0c\x89\xbb\x6e\xd7\xe5\x00\x58\x86\x54\xfa\x9c\x8e\x85\x79\xd7\xe6\xbd\x7b\xa1\x23\x6f\x55\xa5\x9a\x74\x2e\xa8\x97\xc7\x9b\x08\xb3\xc2\xa1\x75\x0e\xb9\x20\xd5\x85\xef\x7c\xcc\x07\xb9\xbe\x7b\xd6\x69\x99\xb4\x1d\xdf\x1a\x93\x6b\xc2\xfc\xec\xc5\xed\xaf\xfd\x50\x27\xc3\x1d\xf9\xd4\xc6\xdf\x74\xa2\x67\x38\xc9\xe2\x81\x1a\x41\x1f\xa6\xf3\xb2\xa6\x13\x35\x6b\x5c\xee\x13\x15\x4b\x23\x6b\x7e\x05\x00\x7d\x8e\xe8\x31\x00\xef\x1b\x86\x2f\x04\xb0\x97\x33\x25\x2c\xa6\x38\x1c\x49\x51\x65\xea\x1d\x3f\x79\x55\x7c\x6c\xe0\xff\x8e\xf7\xfb\xe3\xb2\xfc\x78\x62\xea\x51\xc4\x01\x2d\x5e\x88\xfa\xf2\xa1\xda\x39\xd1\x8d\xda\x88\xf8\xea\xe9\xd5\x23\x57\x8c\xb0\x49\x8f\xd9\x8a\x04\x7c\x9b\xcf\x4d\xd2\xf2\x53\x0e\xa1\xfa\x11\x86\x1d\x55\x84\xf6\x1c\xf3\x20\x41\xcb\x94\x54\x46\x13\x3d\x0e\x2e\xdf\xc8\x4c\x4c\x89\x3e\x09\x1f\xff\x0c\xff\x21\xbd\xeb\x5d\x23\xf5\x8b\xe1\xf5\x72\x21\x0c\x4e\xee\xcd\xd9\xd5\x98\x16\x02\x26\x7b\x9b\x96\x01\x88\xe6\x86\x9e\x2b\x1f\x5f\x22\xf9\xd2\x29\xc6\x22\xb9\xa1\x30\x5c\x93\x84\x03\xa3\x1a\x3a\xf5\x90\x25\xa9\xc0\x27\x88\x54\xf5\xf3\x9f\x26\x85\x83\xa9\x81\xe9\x52\x04\xa3\xc2\x4c\x18\xf1\xe2\x4d\xf5\xba\x5a\xfd\x1b\xfc\x87\xfe\x5a\xbe\xb1\x35\x6a\x33\xe2\x24\x81\x6d\x81\x5f\x3e\x4a\xbe\xf3\xcc\xb1\x1a\xe7\x40\xaa\x07\x54\x02\x63\x4a\x30\xb1\x7f\xee\x10\x33\x30\xc1\x37\x25\xae\xd9\x0e\xa2\x68\x68\x39\xfb\x44\xd7\xfe\x64\x59\xd8\xf7\xda\x68\x94\x93\xba\xe6\xf6\xe7\x63\xa2\x7d\xf5\x15\xa6\x5f\xa7\x1e\x05\xd3\x2f\xab\xce\x61\x66\xc4\x9d\x9e\xf7\xe8\x2d\x2e\xb9\x81\x19\x3e\x79\xbc\x8e\x4a\x84\xf5\xa6\x0f\xca\x78\x27\x55\x38\x8f\x80\x6f\x99\x04\x99\x04\x40\x3d\xc7\x53\x2f\x0a\x4c\xf0\xc0\x56\x55\x56\x2f\xa8\x0e\x88\x2d\xae\x1c\x01\xa9\x5a\x3f\xde\xf0\x40\x4a\x64\x72\x94\x02\x9c\xba\x66\x69\x3c\xed\x96\xbc\xaf\xa5\x4f\xb2\x51\xdc\x77\x64\x4d\x66\x0d\x47\xe0\x3c\x80\x54\x13\x3c\x9d\x02\x6c\x6d\xbd\x19\xfa\x1e\x51\x99\x85\xe6\x64\x92\xfa\xed\xf9\xc4\x2c\x39\x50\x28\x6e\x40\x70\x7b\x16\x0e\xe3\xfb\xb7\x76\xfd\x29\x3b\xec\x72\xbc\x06\x7c\xe0\xfd\x91\xe1\x31\x8f\x8c\x52\x9e\xb0\xc8\x49\x78\x78\x92\x93\x6c\x19\xf6\x30\xb7\x46\x27\x57\x71\x68\x1c\xf0\x0b\xab\x48\xc0\x47\x1c\x54\xeb\x5b\x72\x8a\x0e\x2e\x5a\x56\x56\xd4\x06\xaf\xf6\x74\xa3\x30\x5d\xf6\xec\xab\x76\xfa\x61\xc9\xaf\xd5\x00\xc1\x39\xe4\x5f\xa2\x14\xdf\xc4\xf4\xf3\x0f\xbe\x69\xa6\x81\x96\x14\x83\xb3\x3a\x49\xf2\x49\xce\x80\x92\x27\x18\x61\x5f\x15\xbd\xbe\x97\x01\xe1\xe2\x61\x50\x46\x0f\x03\x9f\x83\x19\x1a\x32\x42\xc1\x32\x3c\x6d\xd4\x1c\x15\x60\xaf\xda\xf6\xb5\x5b\xfd\x9b\xdd\xd0\x1f\xa1\x7c\x57\xf5\xfc\xe9\x1b\xfc\xaf\xbc\x15\x15\x3e\x83\x94\x59\x6d\xe7\x5f\x0d\xdc\xdc\xfe\x0c\xdf\x4d\xd4\x9e\xf8\x35\xfb\x1a\xba\x9c\x21\x28\x22\xc0\x62\x2c\x82\x3e\x99\x78\xee\x03\x11\xe4\x15\x88\x71\x93\x08\x8d\xef\x2d\x08\x13\x8f\x99\x3b\xd2\xe8\x85\x10\x4e\x11\x58\x7e\x60\xc2\x88\x1b\x4e\x58\x7e\xc1\x8f\x8c\xe1\x37\xd0\x32\x66\x2c\x28\x85\x7d\x26\x9b\x10\xe6\x45\x5e\x46\x43\xd6\x5c\x3e\xfa\xd8\x41\xf8\x24\x1e\x0e\x7e\xe6\xd3\xc9\x60\x52\xcc\xe2\x24\x21\xc8\x67\xa6\xc9\x76\x7a\xe3\x75\x15\x49\xdc\x54\x9a\x6c\x67\xc2\x5d\xc3\x37\x6d\xca\x6b\xbc\x80\xcb\xf9\xbd\x33\xd7\xd4\x7e\x19\xef\x1e\x1e\x29\xbe\x0e\x42\x7a\x1c\x47\xea\x02\x7f\x38\xa3\x09\xa3\x9e\x1b\x6d\x03\xf8\xc6\x13\x5d\x3d\x64\x98\xa4\x13\xdc\x50\x42\xe5\x14\xd6\xbe\x9d\x86\x95\xf2\x00\x9c\x00\xfa\x67\xaf\xa4\x14\x15\x95\xe9\x38\x46\xe0\x22\x3f\xb9\xe4\x19\x13\x7e\x28\xa8\xb3\xe4\xd1\xa4\xd1\x46\x92\xb3\x08\x9b\x47\x03\x28\x1b\x83\x1b\xd2\x7c\x45\x6b\xc9\xd7\x79\xbe\x2e\x54\x8a\x19\xda\xf0\xe9\xc7\x99\x55\x21\x98\xb5\xc0\xf0\x94\xdb\xb4\x22\xaf\x54\x3b\xb3\x52\x13\xf5\xd3\xda\x0c\x19\x55\x97\x0f\xb4\x0c\x19\xb7\x0a\x1b\x28\xcf\x87\x7d\x60\x1b\xdc\xbb\xeb\x6f\x6a\xf2\x76\xae\x38\xb4\x49\x23\x5c\x26\x1b\xf9\xec\xce\x56\x50\x61\x09\xb2\xfa\x76\xf5\x5c\x33\xbf\xde\x0d\x4e\x09\x65\xb5\xce\x49\x9c\x31\xf6\xae\x09\xc7\xcf\xcf\x90\x80\x28\xe1\x3a\x20\x94\x19\x74\x1a\xe5\x38\x21\xb2\x21\xd1\x0d\xf6\x67\x4c\x76\xf5\x97\xe2\xcf\x78\x92\xe0\x1f\x60\x94\xec\xdb\xbf\xa8\x02\x28\x09\xeb\x69\xa3\xa7\x86\x6e\x7f\x6d\x4a\xb8\x2d\xfd\x8a\x20\x31\x21\x61\x52\x08\xd1\xcc\xb9\x24\xe9\x36\x47\xa5\xc4\x15\xde\x47\xa8\xeb\xfb\x5e\xde\x74\x8c\xa7\x56\x73\x42\x44\x87\xb6\x34\xe4\x48\xf7\x0e\xed\xde\xff\x67\xcb\xd7\x28\x88\x9f\xe8\xd8\xe3\x61\xe8\x89\x59\xca\xef\x89\x8a\x1e\xc7\xe1\x52\x87\x96\x42\xa5\xd0\xd2\xdf\x36\x9c\x15\x83\x1f\x5b\x98\x88\xd7\x8b\x6f\xe3\xf8\xc6\xb7\x92\x17\x8b\x1e\x03\x93\xcb\x3a\xba\xa0\x50\x41\xd6\x8b\xa2\x8c\x7c\x9b\x59\x71\x10\xb5\x8e\xb7\x23\xbb\x72\xd5\xa3\x8a\xa3\x9d\xdc\xfa\x86\x38\xb3\x0f\xbf\xd8\x5b\x4c\x0c\x3a\x6a\x76\x49\xcf\x9e\x14\x26\x7a\xcb\xc5\xeb\x4e\x88\xe5\xeb\x31\xe1\xee\xb8\x73\x66\x87\x1c\xf0\x43\xc7\xdc\x42\xa4\x5d\xb8\x36\x55\x3e\x98\x2c\x0e\xe3\x3f\x3b\x32\x8d\xc2\x9e\x18\x98\x9a\x33\x43\x1c\xb6\xa8\x25\x33\x8e\x84\xa1\x39\x8b\x40\x9a\x67\xd1\x8f\x4f\x80\x2a\x4d\xf8\x13\x0d\x2e\x4d\xa2\x13\x9f\x37\x4a\x49\xb9\xba\x90\x3f\x80\xa3\x3c\x0b\x99\x2d\xc7\x80\x92\xa4\x21\x40\x8f\x57\x8b\x0f\x19\x61\x50\xfc\x02\x0c\x15\x93\xdb\x4d\x92\x53\x33\x92\x4c\x10\x5d\x91\xa0\x57\x3d\x07\x04\x66\x4f\x3e\x8d\xc7\x12\xef\x29\xe3\x15\x5d\xaf\xb0\xb1\x25\xf9\x67\x4a\x88\xbf\xa4\xba\xd5\x93\x71\xd9\x92\x58\x10\xa5\x9a\xc5\xb7\x71\xca\x01\x23\xd2\xe6\xfb\xf8\x5d\xda\x87\x97\xf2\x30\xad\x4f\x39\xd7\x95\xf8\xd5\xa6\x33\xd6\xe9\x4a\xb0\x59\xeb\x24\x3f\xad\x9b\xea\x1e\x89\xa0\xd8\xfe\x9e\x92\x80\xca\xd9\x75\x31\x85\x66\x9f\x69\x55\x35\x1f\x93\x60\x91\x3c\x4d\xea\xb1\xfc\xb3\x11\x63\x40\x26\xba\x13\x96\x09\xf8\x5d\x26\x98\xc8\xbf\x25\xb7\x71\x04\xa9\x6f\xab\x73\xf2\x95\xe0\x4f\x8b\x42\xc5\x40\x4f\xc8\x4a\x1b\x7c\xa3\x1f\x05\xb3\x3a\xc6\x2b\x99\xbb\x24\x8b\xc9\xee\xe2\xcd\x7d\x8a\x6b\x5b\xf9\x64\x02\x88\x76\x45\xfc\x70\x27\x71\x1e\x34\xff\xfb\x63\xfe\x27\x13\xbc\x55\x93\xcd\x95\xf2\xac\xca\xac\xce\xd6\x48\x0a\x37\x73\x6c\xb2\x2c\x9b\xe3\x18\xb3\x0c\x72\x6e\xed\x3a\x8e\x59\xce\x88\xca\x51\xc8\x26\x37\x5e\x3a\x79\xba\x89\xfd\x1e\x46\x43\x8a\x57\x2d\xa7\x72\x1f\x9e\x2b\x62\xbe\xd9\xdf\x4d\x50\xcf\x58\xb4\xcc\x32\x3c\xc0\xd6\xf4\x03\xbd\xfc\x98\xaf\x90\x04\x41\x93\x1e\x23\xa0\x0e\xc9\x2b\x47\x05\x47\x96\x1d\x25\x1e\x24\x85\x8d\x12\x80\x84\x77\x98\x28\xa4\x79\x7e\xbc\x14\x2b\x04\x6b\x71\x91\xa4\x28\xc0\x63\x8a\x3a\x0d\xd6\x7b\x21\x8b\x70\xc0\x00\x6b\x62\x2d\xcd\xe1\xf6\xef\xe8\x5f\xe5\x93\x61\xe4\x8d\xc7\xb8\x94\x52\xe1\x69\x3d\xce\x9c\x48\x11\x8c\xc4\x98\x73\x2f\x3c\x90\x3a\x81\x8e\x21\x81\xe3\x1c\x42\x7a\x7a\xc1\x2e\x0e\xcf\x95\x02\x45\x72\x97\x79\x4d\xbc\x27\x93\xfb\xaf\xc8\x4f\xda\x27\x24\xa6\x20\xf9\x89\xd6\xf4\xb6\x39\xa1\x44\x09\xe3\x1c\xe4\x94\x83\x5d\xef\x82\x3c\x53\x5b\x7c\x77\x45\x89\x47\x26\x13\x8e\x44\x92\x0e\x3e\x73\x12\xb9\x71\x9c\x44\x81\x47\x4c\x59\xa3\xad\x9f\xaf\x17\xa9\x1c\xf3\x4a\x59\x7a\xb9\x31\xf2\x24\xfd\xab\x0b\xc3\x84\x9c\xde\x76\x33\xfe\x09\x93\x23\x9c\xac\x17\x25\x98\x0a\xb1\xff\x7c\xf8\xf1\x54\x51\x4c\x84\x89\xb2\xea\x45\xda\x8a\x09\x07\xff\x09\xe4\x8d\xf5\x93\x71\xa6\x2e\x1d\x15\xab\x41\xe7\x96\x2e\x5f\x35\x4d\x90\x13\xcb\xd0\xe4\xf4\xce\x8f\xef\xc5\x5e\xc5\xc1\x0b\xde\xa7\xd5\x5d\x46\xd5\x28\xd7\x7f\x08\xcb\x47\x2b\xe9\x26\x5b\xf9\x17\xc9\xad\x39\x9b\x60\x93\xd4\xf2\x49\x26\xb5\x96\xb5\x7e\x7e\xe8\xcb\x44\x1e\x43\xa1\x84\x52\xc8\xf3\x83\x5c\x71\x0e\x79\xbe\x91\x25\x5b\xfc\xe8\xd1\x01\x1f\x27\x19\x6c\x75\x49\x8e\xc2\x3b\xba\x45\xec\x7c\xc3\xda\x9a\x08\xa1\x45\x7f\x93\xa9\x75\x44\x9c\x60\x05\x0e\xa7\x42\x06\xee\x49\x75\x3d\x21\xd5\xa0\x7f\xa9\x57\xa5\x35\x27\x59\x5f\x34\xb1\x67\x49\xb1\x9d\x64\xb7\xda\x92\xcd\xa9\x00\xf6\xb8\xe9\x29\x93\x12\x3a\xba\x6d\x09\x96\x93\x65\x15\x7f\x64\xc0\xf0\x25\x02\x0f\x2f\x29\x97\x98\x30\x87\x1f\x37\xb2\x7b\xca\x8a\x8f\x41\x2c\xb1\x21\xf0\xec\xc5\xf9\x85\x70\x22\xb8\x1b\x14\xbf\x06\x54\x8b\x1e\xfa\x0e\xf7\x1e\x90\x35\xcc\x70\xd1\x2d\x8b\x73\x53\x6d\x8c\x4f\xc6\xc1\x39\x09\xef\x0c\xc7\x29\x28\xe8\x1b\x36\x40\x57\x84\x53\x0c\x86\x4b\x9f\x8b\xc3\xc9\xd4\x4b\x7a\xb4\xda\x39\xa4\x66\x73\x89\xee\x74\xa9\x43\x02\x82\x1a\x0c\xc6\xb6\x02\x4e\x26\x06\xbc\x8e\x0f\x49\x26\x27\x25\xf4\xc1\xd8\xc1\xe5\xfd\x78\x9c\x27\x6f\x76\x08\x7a\xf4\xb4\xe3\xe9\x90\xce\xbc\xfe\x92\x9e\x11\x05\x58\x34\x4e\xdc\x50\x28\x19\xf4\xcc\x1e\xdf\x30\x8d\xf7\xc0\x0b\x0d\xd2\x07\xb9\x8c\x8e\x9c\x26\x71\x6d\xc5\x21\x9d\xc2\xdb\x2f\x4d\xed\x54\xb6\xe0\x20\x5e\x58\x0d\x97\xab\xc4\x88\xb9\x9a\x59\xed\xac\xeb\x40\x6a\xc2\x8c\x79\xd0\x79\x12\x50\x51\xee\x5c\x56\xb5\x49\x56\xf7\xac\xa5\x2c\x3d\xfb\x96\x92\xf7\xd4\x3b\x4c\x3e\x89\xfc\x71\x43\xd6\x1b\x0d\xf8\x8d\x82\xb7\x11\xcf\xa6\x77\x6a\x3c\xd8\x49\x63\xf7\x14\x18\xc5\x72\x48\x08\x88\x8b\x35\xbf\x0a\xc2\x86\x3a\xb7\x3a\x35\x1b\xcc\x21\x06\xd2\x9a\x1b\x03\x1d\xf8\x59\xa4\x95\x3c\x8f\x34\x06\xd8\xb4\xe5\x0d\xfa\xf7\x1d\xda\xb1\xce\x37\xa1\x1b\xc4\x48\x71\x40\x77\x0b\x77\x33\xf3\xb2\x64\xbd\xc6\x4c\xae\x07\x24\x76\xc4\x69\x5d\x07\x69\x3c\x0f\x0b\x87\x22\xa6\x38\xf2\x90\x2c\xbd\xdb\xaa\x89\x09\x39\x30\x42\x36\xe5\xc0\x9a\xb6\x28\x71\x70\xf6\x82\xf6\x72\x34\x5a\x0e\x52\x97\xd4\xc5\x78\x74\x70\xeb\x35\xd1\x33\x9b\xd8\x50\x91\x76\x54\xc4\x89\x3e\xd9\x3b\x60\x7f\xa8\x35\x31\x8a\x39\xf0\x0b\x7b\x64\x88\x93\x3c\x14\x71\x05\x2b\xe1\xe5\xc2\xa3\x06\x89\x81\x12\x59\xd1\x8a\x8e\x47\x96\x64\x19\xfb\x26\xc1\x61\x05\x19\x65\xfe\x1c\x83\x0a\xb3\x27\x35\x22\xf5\x71\x0a\x16\x5d\x0c\xf1\x31\x9c\x21\xae\xac\xe1\x42\x12\x9b\x29\xb4\x48\xe5\xc9\x5b\x82\x84\xa2\x04\x9a\x51\x5f\x31\xe6\x87\x7c\x48\x4a\xce\xab\x86\xcc\x13\xf8\xe8\x49\xa4\x8c\x91\xb4\x75\x11\xb1\xef\x28\xc9\x64\xf4\x56\xbe\x70\xe9\x63\x33\x22\x3f\xfe\xd7\x15\x0f\xfe\x70\xfe\xe2\xf9\x91\x0c\xf3\xed\xf1\x9b\x37\x6f\x8e\xb1\xf6\xf1\xd0\xd5\xe8\x31\x57\xda\x52\xc6\x7d\x84\x8f\xeb\x3f\xb2\xfd\xf6\xf3\x4f\xe0\xdf\x87\xcb\x82\xfc\xea\x53\x69\x56\x2f\x59\xef\x6b\x67\xc4\x05\x79\xfe\x6e\xf0\x97\xe4\xd7\x98\x1e\x24\xbb\x18\xe4\x70\x79\x0d\x34\xd2\xb4\xfc\x9c\xc9\xc6\xa6\x59\x7b\x3c\x3e\xc5\x4c\xcf\xb6\xb3\x18\x0b\x82\xff\xc4\xe5\xc0\x00\xbd\x9e\x4f\xcc\x9f\x03\x02\xfd\x69\xc2\x78\x80\xff\xf8\x75\x8b\xf6\xec\x0c\xca\x7b\xf5\x46\x4a\x72\xdc\x4a\x46\x98\x3f\xe2\xfe\xfa\xbd\x1d\xef\x8d\x11\x66\xc3\x30\xd2\x0b\xb2\x7d\x91\xb7\x45\xd9\x4c\xda\xa6\xbe\x59\x9d\x70\x50\x7f\xab\xb4\x9f\x77\x13\xbf\xab\x8d\x30\xaf\x4b\x4f\x22\xa2\xea\xed\x86\x7c\x20\x25\x29\x12\xad\x9d\xca\x9c\x28\x05\x46\x31\xe4\x59\x03\x9c\xa0\x9f\x32\xc9\xd8\xe3\xbd\xd5\xc7\x8b\x35\xc4\xd6\xea\xc3\x91\xed\xb8\x66\xe4\x67\x32\xfd\x8d\x57\xe9\x4b\x9f\xdc\xe4\xc2\xec\xc8\xa7\x34\xde\x4e\x5d\x82\xc8\xbd\x29\x71\x62\xba\x03\x50\x72\x7b\x8d\xdd\x8f\x8e\xd4\x93\xe7\xa8\x50\x17\xfa\xa3\x10\xcb\x07\x7f\x13\x35\x0a\x3f\x7b\x4a\x8c\xe1\x1d\x95\x43\xca\x7e\x18\x73\x8d\xbe\x2c\xfc\x27\xde\x8a\xc1\x50\x56\x8e\x57\x04\x37\x8a\x72\xd1\x4c\xee\x30\x8d\x16\xaf\x06\xfc\xa5\xd4\x63\x5a\x73\xc1\xef\xac\xd2\x03\x30\xa3\x52\x9f\xb1\x2a\x50\xab\x40\x73\x3c\xe6\x08\xf3\x49\xb7\x39\x11\x78\xd4\xbc\x99\xb1\xd8\x85\x44\x90\x28\xa0\x72\x03\xcf\x29\xad\x21\x1f\x65\xe6\x25\x54\x10\xf6\xfc\x40\x7c\xa7\x08\xad\xf5\x0c\xb6\xa7\xb5\x23\x96\x4f\x20\x93\xce\x94\xf1\x08\x51\x40\x63\x89\x50\x9b\x56\xa3\xfb\xa8\x61\x8e\x27\x52\xbe\x06\xdf\xd3\x11\x26\xcc\x01\x12\x49\xf4\x53\xc2\xe6\xa7\x24\x66\x7c\x29\xf0\xd1\x0f\xf7\x42\x90\x1a\x92\xa0\x84\x73\x04\xa3\x70\x04\xf2\xb1\xec\xad\x4f\x4f\x25\x7b\xcb\x6f\xe7\x4e\x1a\x2f\xb8\x0b\xce\xfc\x4a\x59\x51\xf3\x4f\x65\x0b\x7c\x39\x30\xd0\xed\xfe\xf6\xd7\x66\x4c\xbd\xd0\xde\xd9\xb0\x6f\x50\xac\xed\x2f\x2d\x5c\xd0\x37\xc9\xdb\x36\x30\xb6\xc7\x54\x9a\xce\x31\x40\xb2\xcb\x83\xa4\x68\x1f\x37\x24\x5e\xe2\x9a\x42\x9a\xdb\x02\xee\xe6\xef\xfc\x16\x93\xa8\x5e\x5b\x56\x39\xd5\x6c\x58\x5f\x16\x9a\xe9\x0d\xdd\xa8\xeb\x22\x24\x6b\xc7\x0c\xd4\x9a\x58\x59\xd3\xbf\x46\xcb\x42\xc9\xa7\xc2\x14\xf8\x8a\x34\x21\x50\x48\x70\x10\x53\x86\xe9\xcb\xb0\xe9\xc0\x62\xb5\x4c\xe2\xe4\x36\x35\xb3\x09\x56\x62\xb4\x10\x73\xa9\xd1\xc3\x52\xfc\x96\xdc\xe8\x71\xab\x69\x82\xf4\xbc\xd5\xa9\xdc\xe8\xf4\x0e\x71\xe4\xca\x91\x6c\xe8\x6c\xee\xf3\xd0\xe6\x7b\x93\x9f\x4f\x6f\xff\xa4\x96\x25\x6d\xfa\xce\x9a\x23\x7f\xb0\xf1\xc8\x44\xbe\x63\xfb\x01\x69\x18\x44\x94\xd1\x84\xfd\x13\x16\xfa\x99\xa0\x90\x3b\x47\xe2\x33\xb3\x65\xfd\xcf\x04\x87\x2c\xca\xea\xf2\x72\xb9\xe9\xda\x37\x0e\x13\x8b\x0f\xdd\x96\x9f\x8d\xd7\x87\x7f\x2f\x71\xaf\x19\x08\xa3\x0e\x00\x95\x0e\xa6\xe2\xdf\xec\x9f\xb4\x92\xd7\x47\xa9\x88\x5c\xba\x49\xef\x02\x22\x6d\x8d\x09\x15\x82\x3e\xfc\x31\x00\x30\x8a\x97\x15\xca\x33\x98\x2d\x0a\xc3\x0f\xa8\x22\xbd\xa3\x8f\x7f\x51\x62\xf4\xf0\x8e\x3e\x2e\x65\x7f\xfb\xab\x43\x3f\x65\xa2\xfd\xd8\x4a\x54\xc5\x81\x70\xd0\x53\x72\x2e\xcc\x5e\xc5\x8d\x5f\x57\x98\xc1\x26\x02\x1a\x1a\x60\x38\x6d\x99\x80\x51\x19\xea\x10\x04\x0e\x7b\x95\xa8\x2c\x55\x59\xa3\x37\xed\xc8\xf9\x3e\x68\xb4\x71\x19\x15\x16\x41\x4b\xb1\xba\x06\x08\x1b\x7f\x17\x9d\x59\x0c\x20\x6b\x0f\x34\xf0\xcb\xa7\xcf\xf9\x07\xe5\xe3\xa2\x70\x6b\xdc\x04\xcd\xd0\x44\x9f\xe4\x31\xa7\x03\x25\x00\xb1\xf8\xec\xcd\x25\xba\xca\x52\x42\xa7\x28\x2b\x09\x40\x74\xd5\xbe\xa2\x57\x35\xda\x4e\x74\x36\x9c\x6e\x0c\x15\x39\x8d\x33\x8e\xdb\xc3\xe4\x64\x7b\xd3\xdc\x68\x9c\x01\xcb\xb6\x7e\xc6\xec\xbc\x49\xd7\x22\xa7\xe9\x90\x74\xe9\x9c\x94\x84\x6c\x68\x1e\x96\x1e\xa1\x01\xc0\x86\xce\x30\xb6\xbe\xd0\x64\x6b\xcb\x71\xd2\x35\xfd\xc2\x19\xf2\xe8\x6f\x26\xd0\x6a\x95\x54\x80\xb2\x33\x97\xfd\xea\xa5\x71\xdb\xa1\xb9\x0a\xc5\xb0\x00\x5a\xed\x7b\xae\x41\x61\xf5\xc0\x2a\x78\x10\xd8\xce\x0d\xfb\x21\x70\x02\x04\x2d\x27\xc7\x57\x96\x44\x7d\x99\x41\xd9\x79\x15\x76\x2a\xd9\x61\x8a\x01\x11\xcb\x0f\x20\x31\x39\xc9\x73\x24\x5e\x3e\x58\x3e\x3b\xeb\x38\x53\x9e\x1c\x9e\x78\xbe\xc1\xa7\xf6\x8c\x1e\x39\x03\x14\xbf\x96\x75\xe1\x6e\x2a\x4e\x13\x4c\xcf\x9d\x94\xe4\x4e\x14\x8f\x3d\xaa\xff\xdd\xbe\x60\x8f\xa0\xba\xdd\x09\x77\x44\x6e\xfd\x94\x04\x19\xc5\x3b\x9f\x7b\x95\x34\x2e\x9c\xe1\x75\x2f\x2c\x2f\x52\x48\xf6\xb5\x34\x65\xd4\x45\x6f\x76\xe9\x6b\x14\x98\xaa\x2f\x7c\x24\xb9\xe8\xb1\xa5\x87\x02\x93\x3a\x3e\xc1\xa8\x3e\x7b\x45\x35\x43\xa6\x9f\x23\x64\x2d\x25\x0f\x93\x84\x8b\xd1\xf7\xbd\x3c\xf5\x86\x29\x60\x7c\x7b\xc9\x9d\xa6\xa5\xe3\xc7\x30\xf4\x4b\x70\x89\x43\x11\x21\x46\x12\x3d\xee\xc2\xae\xf9\x4f\x28\x93\xa1\x1c\xc1\x49\x24\x28\xfa\x6e\xb9\x9c\xc0\xae\xf1\xab\x09\xd7\x33\xe8\x16\xd5\x91\xa5\xf8\x1e\x1f\x33\x81\x7e\xd9\xf9\x55\x7c\x7b\x43\x03\xc8\x36\xa0\x41\x48\x68\x10\xab\x77\x59\xf9\xdb\x31\xdf\x20\xf9\xea\xca\x41\x22\x3d\xfd\x42\x64\x0e\xd3\x7e\x08\xb8\x90\xc4\x9a\xc7\x68\x15\xe3\x27\x3a\x9c\xf2\x89\x12\x8f\xd3\x2e\x3f\x58\x84\x61\x7a\xb4\xc4\x3d\x7c\x74\x26\x99\x63\xf5\x50\xf1\x95\x37\x09\x3b\xba\x57\xe7\xa0\x26\xee\x50\x5d\xae\x58\x3f\xca\xa8\x03\x98\xbe\xab\xfa\x22\x7a\x91\x18\x63\x64\x66\x93\xf5\x8f\xfa\x0a\x6c\x84\xf6\x11\xd9\x1f\xb2\x2b\x32\x3f\x1d\xa9\x7f\xea\xea\x0f\xa9\x7b\xaa\xb6\xe7\x59\x1a\x75\x81\x82\xea\xe3\x93\xa6\x8f\xde\x7a\x59\x1e\x27\x37\xf1\xa0\xbe\x0c\x5f\x82\x29\x1d\x30\xcd\xf2\xd7\x62\xf1\x43\xdb\xed\x5e\x85\xc7\x8d\xb3\xac\x2b\x89\x8d\x81\xa0\xfc\xe3\x83\x09\xa8\x7f\x98\x62\xb2\xce\x64\xee\x7b\xce\x5e\xe9\x62\x70\x24\x63\x3c\xfb\x81\x2d\x02\x9c\xfe\x9e\x93\xdf\x2f\x35\x35\x2a\xbe\xb2\xca\x0e\xd7\x69\x4f\x94\xaf\x54\xdd\x73\x4f\xbc\xbc\xb4\x38\xd8\xf6\x40\xcf\x49\x52\x58\x01\x3e\x8c\x8b\xf9\x10\x91\x21\x47\x2f\x26\xf4\x17\xaa\x4a\xd1\xce\xde\xfe\xb2\xa7\xd7\x9a\x41\x40\xa2\xa7\x78\xdd\x82\x52\xf7\x89\x31\xc6\xad\xc4\x15\x42\x4a\x93\x17\x4a\x93\xd4\xbf\x71\x16\x57\x6c\x2f\x76\x10\x97\x47\xe3\x71\x5d\x46\xc1\x24\xfe\xa5\xe8\xfc\x89\x79\xfa\x30\x0f\x1e\xe8\x06\x22\x30\xfa\xa0\x31\x67\x2d\xe8\xc3\x4f\xbd\x49\xde\x0c\x39\x1c\xf2\xd6\x30\xbb\xd2\x53\x68\xa1\x5b\x86\x6e\xb4\xc1\xc7\x4c\xf0\xe1\xfe\xee\x49\x45\xa3\xf5\xbe\x60\xd0\x24\x35\x32\xa9\x7b\xd0\x08\x45\x79\x3c\xd9\x31\x4c\x6d\x61\x71\x97\x9a\x7c\xf2\x8b\xf7\xbc\x9d\x9a\xda\xb7\xfe\x4b\x33\x6a\x27\x5d\x2f\xff\x73\x2e\xdd\xd9\x6b\x9d\x7a\x52\x12\xf5\x79\x78\xb6\xd3\x97\xce\xbc\xdf\xf9\x01\x2e\xc0\xb3\x63\x4c\xab\x44\x49\x98\xd3\xd7\x19\x47\xef\x0a\xcf\x3c\xd0\x98\xbb\x16\x43\xad\x79\xcf\x62\xa4\xc1\x73\x8e\xc5\x26\x5f\xef\x7c\xc4\xd9\x93\x92\x27\xc5\xec\x83\x92\xa3\xc1\xdf\xf5\x52\x69\xee\x30\xe3\x5f\xc6\x4c\xc8\x4a\xae\x6d\xd1\x97\x49\x92\xab\xe6\xee\x2a\x53\x4f\xa8\xa4\xfe\x42\xe3\xd7\x9c\xff\x93\xcf\xa9\xcc\xb8\x37\xdc\xf9\xae\x4a\x3e\x6c\x24\x51\x13\x8f\xab\xdc\x3d\x57\x4f\xd7\x9e\x8c\xe7\xf4\x4f\xbe\xb8\x32\x65\x81\x1e\xd9\xa9\xd9\x80\x2b\xae\xd7\x26\xf5\xba\xf6\x7a\x5e\xf5\xb3\x49\x88\x75\x58\xc2\x92\x28\x5c\x7e\xf8\x85\xf8\x2f\xe5\xdf\xab\xea\xb0\x9e\x79\x7c\x05\x57\x47\x82\xaf\xc4\xa9\x4d\xeb\x32\xa3\xba\x3a\xd3\xb7\x8c\xd3\x72\xa5\xb6\xec\xf5\xa3\xcf\xaf\x04\x20\xfc\x4d\x61\x85\x93\xe5\x79\xed\xbc\x0f\xfe\x77\xdd\xb5\x94\xf9\xac\xb7\xbb\x56\x94\xef\x7c\x9b\x85\x41\x46\x2f\xda\xa4\x75\x57\xcf\x08\xd2\x97\x32\x33\xa5\x29\xd3\x7d\x31\x70\x19\x94\x1e\xa4\x0a\x45\x72\xd9\x66\x5b\x46\x3e\x2f\xe2\xc8\x00\x17\xd0\x7d\xf7\x59\x5e\xa1\x69\xdf\x44\x37\x33\xc5\x68\xf0\xc5\xbc\xc4\xe7\xc2\x57\x7f\x18\x90\x31\x3e\x76\x56\x0a\xb9\x67\xb6\xb1\x49\x11\xf2\x58\x9a\xf4\xf8\xc4\xfb\xa8\x88\xfa\x6d\x0c\x13\xbd\x72\xe0\x2f\x2a\xff\x2e\x15\xda\x79\xe8\xe9\x01\xa6\x5e\xf9\xdb\x10\xb5\x59\x4a\x83\x49\xaa\xe5\xd0\xab\xe4\x55\x9e\x00\x1a\x77\xab\xef\x12\x6d\xcd\xc1\xbc\xe3\x21\x53\xa7\x53\xaf\x31\x6e\xe8\xf6\xde\x6b\x62\xc9\xa0\x35\x87\xa3\xe8\x74\x4c\xe4\xa7\x9a\x8f\xa9\x4d\xdd\x57\x27\x40\xa7\x16\x24\x1b\x59\xe8\x95\x72\x35\x14\xfc\x60\xf5\xfc\x28\x7d\x96\xe6\x63\x52\xc5\x93\x13\xee\xc8\x57\x8e\x47\xa2\x39\xf6\xe3\xde\xbd\x8f\x4d\x99\xb1\x40\x68\xf1\x9a\xb9\x9f\xf9\x33\x21\xb6\x1b\x71\x2b\x88\xe9\x2e\x56\xd2\xf6\x6d\x8f\xba\xd8\x8c\x5e\xcc\x10\x8b\x60\x94\x54\xf0\x59\xef\xe0\x2c\xb1\xea\x88\xc4\xf0\x28\x95\xc9\xe4\xc3\xe6\x32\xee\xef\xb7\x04\xfd\x30\xbc\xa6\x0b\x47\xfe\x33\xb9\xac\x92\x56\x29\xb9\x34\xf2\x72\x72\xd4\xc3\x29\x95\x03\xda\x64\x15\xa2\x66\xa7\x6e\x87\x59\xd8\xe0\x4b\x96\x60\x93\xbf\x0d\x66\xa8\x7f\xe1\x97\xc3\x8e\x8e\x26\x5f\x93\xe8\x4d\xed\xb5\xa0\xe2\x63\x91\xec\xd9\x72\x62\x34\x51\x0e\x1c\xe1\x4a\x91\xbf\x99\x4d\x83\xb3\x8c\x29\x46\x8e\x47\x4f\x02\x5f\x8c\x03\xdf\xda\xa0\x96\x4d\xae\x1f\x09\xaa\xf3\xd8\xf0\x99\xba\x56\xcb\xcb\x81\xef\xa1\x33\xda\x47\x4a\x6c\xc6\x83\xe9\x3f\x68\x30\x42\x93\xa2\xc1\x3c\x4b\x06\x53\xd3\x60\x72\xc2\xf2\xfe\x51\x31\x0d\xf9\x0d\xa3\x8a\xec\xb0\x27\x93\x87\x66\x62\x64\x47\xf1\xc0\x6c\x94\xfe\x7d\x8a\xa6\x7c\xe8\xc8\x13\x71\xee\xe5\x34\xac\xa7\x37\xe4\x56\x48\x12\xe7\xb4\x5b\x61\xa2\x88\x5f\x2e\xf3\xc3\xe6\xfb\x8a\x9f\x9c\x4d\x9c\x25\xf3\x2e\xc5\x15\x92\x22\x69\xf4\xe2\x0d\x8d\x36\x20\xca\x8a\xba\x4c\x83\x6d\x46\x6f\xb3\xc4\x39\xae\x11\x90\x5d\xea\xc2\xa5\x1c\xf2\x98\x46\xf1\x8b\x47\xa4\x78\x3b\x6e\x35\x68\x1a\x19\xa2\x1f\x68\x8f\x5f\x2d\x4a\xe3\xae\x36\xad\xe9\xd0\x25\xa8\x6a\xac\x3e\xf2\xdc\x23\xa7\xb1\x40\x37\x83\xe8\x09\xa7\x85\x92\x3c\x11\x93\x12\xa1\x7f\x31\xbf\xf4\xf8\xd2\xd7\x15\xaa\xba\x44\x1a\x3a\x19\x7a\xfe\x25\x35\x99\xf4\x65\x32\xcc\x42\x1c\xac\x41\xa4\xf2\xf1\x84\xe9\x83\xe2\x8b\x7d\xdb\x60\x7f\xab\x67\xfc\x2f\xc7\x6d\x2e\xa2\x60\xf1\x33\x09\x12\xe7\xe7\x5d\xa9\x48\x42\x7e\x17\x74\x4d\xac\x2e\xf0\xbf\x9f\x15\xf7\xcb\x45\x58\x08\x32\x04\x54\x68\x6e\x20\x8c\x57\xd3\x43\x04\x40\x12\x80\x8a\x8a\xe1\x8d\x8c\xa8\x85\x1b\x1c\x32\xd9\x31\x06\x98\x00\xfd\x43\xc1\xa6\x3c\x50\x72\x17\xe3\x59\x4d\x75\xcb\xe1\xde\x2f\x8a\x0d\xf9\x15\x79\xa7\x18\x79\x75\x94\x76\x87\x6e\xac\x0d\x69\xaa\x37\x8f\x82\x9e\xf7\x28\x2a\x4c\x55\x32\xf1\x17\x7d\x51\x5a\x23\xc3\xe2\x6f\xd9\xb5\x1f\x35\x17\xbd\xef\x15\x97\x5b\x7e\xd1\x2b\x29\x9b\xe8\x53\x1c\xeb\xe3\x22\x0e\x7e\xcb\xc7\x16\xf9\xe3\xa7\xe5\xf1\x1b\xb5\xf1\x17\x8a\x54\x99\x18\x16\xc5\x2b\x25\x65\xaa\x65\x8f\xcb\x60\x99\xaa\x9d\x3c\x2b\x4b\x89\xf7\xe2\x8f\xde\x43\x16\xc4\x93\xb8\x3c\x24\x5d\x88\x4b\x39\x29\x75\x5c\x02\xec\xad\xbd\x34\xec\x66\x90\x0c\x8e\xf5\x52\x53\xa0\xa5\x4d\x83\xd1\x93\x35\x04\xf2\x80\x17\xe1\x04\x22\xa6\xfa\xa6\x20\xa1\x4e\xc2\xba\x37\x15\x3e\x9e\x74\xd1\xb5\x98\x25\x7c\x0a\xa2\x1b\x50\x61\xcb\x59\x72\x22\x00\x4c\x7b\x82\x49\x76\xe8\x59\xdf\x96\x5e\x27\x93\x54\xd3\x2f\x4e\xf0\x84\x8b\xc5\xc8\x6c\x5b\xa0\xa7\x98\x60\xe6\xae\xaa\xfe\xf6\xe6\xc0\x09\x6d\x21\x7a\x12\x98\x63\x29\xcc\x3e\x84\x3d\x64\xb1\x09\xa1\x79\xe1\x0a\xaa\x86\x9c\x47\x4c\x90\x91\x9d\xe7\x9a\x30\x0b\x07\x25\xdb\x10\x54\xaa\x38\xe4\xd8\x7d\x50\x2b\xf1\x60\x27\x5b\xc9\x46\x9a\x47\x51\x8c\xfa\xa0\x5b\x07\xef\x9f\xea\xda\x26\x63\x94\x87\x68\xbd\x8b\x64\x7e\xe5\xbd\xa7\xa9\x6c\x55\xef\x6c\xea\xb7\xae\x2e\x31\x03\xcd\x8e\xef\x3d\xef\xc5\x3c\x2d\x8f\xf3\x5b\xca\xc4\xd7\x99\x7d\x3c\x06\xd4\xd9\xbf\xa7\xe9\xf1\x1c\x3a\xbb\x43\x8e\xa2\x9d\x78\x6f\xf5\xae\x7e\xee\x0e\xb5\x0a\x83\x00\xd0\xf5\x6e\x2b\xf3\xe2\xb8\x15\x60\x3e\x2c\xbf\x8e\x5d\xa3\xcb\x63\x73\xc7\x36\xc4\xb5\xfd\xd0\x9f\x68\x76\x97\x8c\xa0\x9a\xbc\x65\xb6\x39\x4c\xea\xe6\x42\x17\x40\xdc\x30\x99\x01\x26\x77\x76\xee\x8a\x9c\x46\x5e\x5a\xff\xac\x43\x30\xfc\x7e\xbc\x84\xcf\x9f\x70\xbe\xff\xea\x9d\x25\x77\x09\xf7\x71\xf1\x00\x50\xb9\x61\x65\x86\x12\xff\xf0\x22\x93\xfd\x09\x97\x48\xee\x16\x17\x18\x72\x34\x1f\x3f\xbc\x73\x0c\x13\x87\x22\xbb\x59\x64\x03\x3a\x2b\x8c\xea\xec\x0e\x44\x8d\x47\x0e\x54\xc9\x2c\x3d\x9e\x79\xa7\xad\x34\x6b\xc7\x18\xbd\x1f\x44\x4f\x5c\xaa\xa7\x58\x1b\x3f\x17\x98\x69\x20\xb7\x03\x10\xf5\x3d\xeb\x18\x6f\x7f\xf1\xf6\xfe\x99\x45\x88\xc7\x19\x9c\xcc\xe7\x87\x67\xe7\x4e\x4a\xba\x46\xf3\x58\x0a\x72\x69\x83\xf9\x67\x92\x53\xf8\x12\x0b\xfd\xdb\xa9\xfd\x7b\x0f\x4c\x7a\x5e\x52\xf2\x40\x99\x3c\xee\xee\x6f\xea\x68\x7e\xd0\x69\xfc\xda\x9f\xc6\x2e\x1a\xf1\xe8\x4c\xc6\xec\x10\x9a\x12\x3a\x58\x66\x60\xd7\xec\xea\x3b\xfa\x07\x5b\x3a\xc7\xa0\x14\x54\x77\x44\x97\xcb\xd0\xa1\x5b\xca\x7a\xd7\x76\x20\x3b\x00\x17\xbb\xfa\x5a\xff\x72\x05\x4a\xd8\x95\x9b\x80\x26\xb3\xd4\xcd\x7a\xa0\x6c\x3e\xdf\x39\xc9\x30\xb7\xc7\x99\x88\x77\x64\x54\x89\xd8\x45\xad\x82\x66\x89\x2d\x59\xa8\x88\x7f\x4c\x2b\xe2\xa7\x32\xe6\xeb\xa4\x52\xbb\xe9\x0d\x65\x5b\x79\xa6\xa0\x50\x52\x25\x90\x87\x96\x12\x41\xac\x6b\x40\xa1\xe1\xb0\xc6\x19\xbb\xd5\xf3\xff\xfe\x0f\xc1\x55\xcc\x0e\x8a\xe7\x0c\x18\x7b\x00\xab\xba\x84\x0a\x65\x43\x4b\x2b\xd3\xa0\xe2\xdc\x73\x3c\x82\x71\xf5\x4b\x40\xc3\xb4\x6a\x5d\x6d\x6c\x77\x77\x5d\x5d\xd0\x2b\x6b\x0e\xd1\x72\xd2\x12\x22\x3b\x82\xe5\x11\x38\x81\xcd\x2e\x0a\xc6\x04\x00\xc0\x78\x71\xe2\x6a\x55\x59\xdb\xa8\x8a\x91\x2a\x20\x04\xb9\xd9\x2a\xe4\xdb\x36\xae\xc4\x4e\x6b\x33\x95\xc4\xe8\x5a\x8e\xab\xf1\xb2\x8c\x07\xd8\x6e\x7e\xb2\x5b\x7c\x9e\x68\x83\x49\xae\x28\x9c\x21\x9b\xfe\xa6\x6d\x7b\x94\x8e\x0f\x28\x1e\x90\x2b\x77\x84\x7f\x87\x0a\x9d\x27\x3c\x48\x2a\x1d\x00\xf0\x5d\xcb\xc6\x75\x47\xeb\xb6\xc7\x87\x5b\xa1\xaf\x6e\xd8\xf6\x03\xd0\xaf\xb4\x43\x64\xdf\x07\x54\x68\xd0\xe6\x3e\x3b\x07\xd8\xbb\xea\xfa\x8e\x9f\x8c\xeb\x49\xd7\x09\x52\x6e\xcd\xf6\xca\x7e\x68\xe7\xa7\x08\x7c\x67\xed\xb9\xee\xa9\xe6\x44\xff\x87\xae\xbd\xac\x6a\xa4\x5e\x9b\x61\xfb\xda\xe2\x5b\x7a\xee\x6a\x4d\x8e\x41\xa1\xad\x33\xdb\x01\x10\xd7\x26\x91\xfd\x4b\x82\x2d\xbe\x01\xd8\xe2\x02\x61\xe3\xcb\x7e\x0b\x7b\x00\xcc\x04\x3a\xb9\x45\xbb\x80\x25\x2a\xa3\x9d\x4a\x53\xf1\x40\x5a\xe0\x6d\x31\x23\x11\x89\x85\x72\x46\x91\xd1\xf6\x4d\xbc\x18\xfa\xce\xf8\x73\xca\xf7\x85\x26\xd2\x19\x6d\x29\x26\xd4\x67\x96\x63\x7b\xb3\x45\xab\x38\xe7\xd6\xc7\x44\x19\xdb\x6a\x5b\xe3\x73\x3e\x3c\x92\xa8\x0e\x49\xc0\x50\x87\xa8\xe9\x63\x7a\xb0\x0a\x83\xe7\x38\xff\x15\x86\x8c\xe7\x15\x98\xe2\x69\x8d\x33\x03\x3b\x27\xba\xd5\x59\xc8\x83\xc1\x23\x76\x17\xa8\x8e\x82\x21\x35\xfd\xd6\x81\x6a\xe4\xb0\xd2\xb5\xa7\x44\x94\xb6\x33\x04\x31\x03\x2c\xeb\x27\x38\xe2\x72\x6f\x1a\xcc\x1b\x06\x78\x68\xeb\x48\x95\xa1\xa9\x24\xf7\x1c\x64\x16\xf2\x45\x48\x5d\x34\xee\x7b\x73\x5a\xb0\xef\x13\x77\xaf\x20\x2a\x5a\xc9\x6f\x15\x0e\x4a\x72\x5c\x47\x5b\x8e\x94\x4f\xe4\xf0\xe2\x2f\x7a\x55\xc7\xfc\x23\x7f\x91\x97\x34\xe4\x09\x0d\x29\xa4\x60\x07\xbe\xc1\x25\x3b\xc4\xe5\x8d\x06\xcf\x45\x1a\x10\xcd\x59\xca\x37\xbd\x68\xa5\x27\x27\x18\x39\xbd\xcb\xd4\xa2\x5c\x91\xd8\x73\xc6\x78\x72\xcd\x38\xf3\xba\xcc\x90\xc4\x36\x76\x10\xfd\x0a\xef\x20\xb2\x95\x45\xca\x9c\xbf\x6a\xaf\xf4\x14\x32\x5b\xbd\xe3\xba\x24\x61\xaf\x93\xc0\x15\x2a\x9a\x6d\xe7\x60\x9c\x7b\xd3\x76\xa5\x77\x65\xc0\xf8\x8d\x28\xe8\x8a\x26\x4d\x7c\x2c\xf9\x1f\xea\xd0\x85\x37\xe3\xe3\x1f\x27\xca\x3c\xf0\x59\x2f\x75\x19\xee\xb2\x2c\x87\x55\x08\xe6\xe2\xd2\xe7\xd8\x51\xec\xd8\x9b\xb7\xf2\xc6\xaf\x3e\x57\xfe\xed\x6f\x78\x94\x7c\xae\x11\x56\xb8\x3e\xf8\xce\xd9\xe2\xde\xf1\xa7\xf7\x24\xb3\x49\x5f\x31\x9b\xe7\x1f\x3e\x17\xf7\x87\x87\xd2\x0c\xbe\xc0\xe7\x91\xf3\x89\xbc\x15\xd0\x6b\x3e\x63\x12\x54\x4b\x1d\x37\xac\xcd\x55\xb5\x81\xb9\xd1\x06\x8c\xa1\xe1\x3b\xc6\x32\x72\x24\xe4\xa5\xed\x31\x0f\x09\x81\x46\x7d\x11\xc2\x47\x35\xe3\xd8\x69\xf5\x6c\x9e\x38\x0e\xe4\xd5\x81\x71\x6b\x6b\x8e\x78\x98\x6f\x20\x7a\x4d\xe9\x2a\x4e\x37\x17\xb7\xc3\xef\x76\xf3\x7b\xdc\xef\x6d\xeb\xce\x47\xbe\x27\x91\x27\xb2\xd0\x64\xc8\x23\xe0\x77\x79\x14\xc4\x70\x98\x0f\xab\xc6\xe4\x09\xac\xdb\x3d\x1f\x74\xa0\xec\xf8\x8f\xde\x2d\xd1\xab\x11\x26\x4f\x84\x70\x14\x65\xb0\x21\x5f\x42\xf5\x73\x18\x42\x7a\x84\xe3\x3a\x56\xf1\xc6\xdd\x62\x12\x27\x74\xb9\xca\x7b\xbd\x34\xef\xe8\x01\x80\xb1\x9f\x98\xf6\xc7\x79\x69\x0d\xf7\x24\xaa\x82\xe3\xda\x8c\xfa\x19\x3b\x9f\x33\x32\xcd\xb8\x9c\x43\x5f\x1c\xa1\xff\x61\x74\x7b\xc2\x21\x2d\x26\xcc\xf4\x33\xf5\xf9\xa2\xa2\xcc\x1a\xb7\x60\x1d\x35\xd1\xe3\x0f\xbe\x30\x92\xd0\x25\xae\x1f\xd9\xd8\xb9\x20\x8c\x84\x7f\xe7\xc6\x7e\x2e\xa5\x37\xcb\xad\xd3\x57\xcb\x49\x67\x29\x9f\x30\x98\xce\xf9\x87\xca\xb5\x34\x7d\x05\x9b\xb4\xe8\x42\x48\x3f\x74\xd5\x32\xa2\xca\x2d\x60\x26\xe9\xc4\x8e\x6f\xc4\x4b\x59\x3e\xfb\xc9\xf0\xef\xf0\xde\x14\xff\xb6\xf4\x4a\x62\xe9\xd3\x91\x95\xfa\x61\xc2\x6d\x2f\x1a\x72\x12\x8d\x34\x39\x2e\x02\x4b\x14\x99\x93\x60\x0e\xd8\x00\x58\xa5\x1b\x3c\xa1\x7d\xbb\x6d\x6b\x7c\x6e\x85\xfe\x60\xae\xc9\xa2\x44\x8f\xfe\x4a\x02\x9f\xc7\x18\x71\xe9\x55\xeb\xfa\xd5\x37\xf0\x1f\xf9\x8d\x74\x01\xb3\x99\xf7\x5a\x8d\x34\x95\x65\xb3\xfa\x9e\xb5\x91\x5d\xf1\xf8\x79\xfc\x45\x6f\xa6\xf0\xdd\x61\xda\x9c\x29\x10\xbd\xbc\x4e\x82\x16\x86\xe8\x14\x55\x20\x4d\x43\xb7\x37\xef\x6c\x23\xf1\xa7\xd1\xb3\xd8\x12\x61\x04\x27\x8c\xfc\x4a\xf9\xe4\x52\x7c\x0c\x7b\xdf\x23\x9e\x55\xf5\xed\x2f\x3b\x32\x90\xca\x2e\x20\x37\x44\xef\x53\x7c\x89\x2f\x3e\x90\x0b\x1f\x1b\xb4\x12\xf6\x27\x02\x86\x49\xaa\x89\x87\xc2\x2b\x74\x9e\xa6\xa7\xe0\xc1\xde\x86\x70\x53\x7e\x20\xac\x0f\x4e\x76\x59\x7b\xe3\x2a\x89\x69\x8d\xaf\x6f\x7a\xf1\x56\xae\x34\x76\xe3\x93\x54\xd8\xfa\x38\x33\xba\x25\xb4\xdd\x7e\xa8\x65\x4c\x1c\x3f\x6f\x4a\xb1\x01\xa5\x3d\x2f\x47\x5d\xa7\x23\x55\x42\x45\x15\x47\xb0\x6e\xc8\x26\x46\xe9\x7b\x27\x41\x01\x8b\xea\x00\x67\x8f\xf1\x77\x0e\xe4\x50\xce\xdc\x84\x37\x38\x49\xc3\x22\x55\x28\xfd\x04\x39\xb1\xbf\xe5\x58\xe7\x2f\x01\x2e\xac\x36\x27\x2a\xe6\x1c\xc5\xed\xd4\xd2\x92\x4d\x76\x04\x95\x5e\xb0\x0c\xba\xc7\xbb\x79\xed\xcc\xea\x99\x2b\x4e\xca\xe2\xfc\x44\x4f\xce\xbe\x3f\xac\x49\x6d\x3f\x7d\x0e\x8b\xf3\x67\x17\x67\x11\xac\x3f\x23\xf9\x87\x70\x58\xe2\x2f\x9a\x68\x85\x0f\x9c\xf3\x27\xce\xd1\x43\x03\x9d\x3c\x7f\x36\x09\x7b\x27\x7f\x27\x5e\x9f\x1c\x2c\x4e\x9e\x05\xa5\xb4\x8c\x28\x73\xa5\xe3\x5b\x16\xdf\x4b\xb4\x43\xe9\x3b\xc6\xdb\x8b\xf2\x98\xc0\xff\xb0\x2d\x09\x60\x29\xae\x6f\x7f\xed\x76\x70\x6a\x8b\x8f\x8f\x3e\x5e\x26\x74\x6d\xdd\xd7\x2e\xca\xb4\x08\x8c\xf9\xa1\x6f\x77\x9d\xb9\x84\x2b\xf9\xe2\xdb\x73\x5d\x84\xd7\xd5\x01\x21\xd7\xf4\x94\xc4\xcd\xea\xe9\xae\xa1\xec\x10\xd9\xcb\x12\x36\xaa\x72\x40\x87\x05\xd4\x5d\x6d\x6d\xca\x01\x9f\x4b\x96\x95\xe2\xec\xe4\x59\x3a\x14\x7a\x6e\x41\x05\x81\x68\x50\x2f\x95\xe7\xc7\xa7\xa9\x80\xcf\xec\xd1\x53\x4c\x88\x75\x75\x80\x85\xa7\x7c\x8f\xd2\x54\x94\xe7\xdd\x4c\xf9\x5c\x4e\x52\xe2\x94\x8b\xcc\xb0\x84\x99\x66\x66\x26\xfd\x8d\x92\x0a\x19\x59\x8d\xf7\x84\xe4\x2d\x93\x0b\xe4\x0e\x17\xd1\x99\xa1\x4c\xbb\xb6\xc6\x6d\x46\x5c\xdc\x78\x11\x66\xee\x99\xcc\xa1\xd4\x8e\x57\x22\x01\x5c\xf3\x2d\x37\x76\xa6\x79\x6f\x9d\xe0\x5c\x91\xcd\x8e\xf3\x7c\x77\xe8\x03\xee\x0a\x23\x19\x46\xbc\xa7\xcd\x38\xc4\x41\x70\x93\x38\xbe\x4a\x62\x39\xa7\xda\xf5\x1c\x27\x3a\x5f\x1b\x3a\x10\xe2\x72\xe3\x2d\xc9\x51\x42\x38\x4d\x21\x87\xf1\x3b\x9c\xfd\xd1\xc8\xbb\x3f\x21\xbe\x28\x4a\xc8\xd8\x0b\x69\x61\xc1\x2e\xb0\x89\xd1\xbc\x93\xe8\x8b\x6c\xca\x33\xfc\x22\xef\x99\x2a\x85\x27\x1d\x06\x90\x18\x38\x55\x0e\x0b\xbc\x39\x1c\xd2\x6c\x1b\x9c\x49\x84\x02\xce\x23\x90\x6b\x74\xbb\x97\xa0\x8d\x59\xa0\x28\x8b\xc2\x18\x20\x67\x32\xa4\xb8\xbd\xbc\xac\x81\x39\xc3\x07\xc9\x2c\x3e\x63\xd0\x16\x2f\xb8\xc4\xd7\x83\x7b\x19\x8f\x3a\xaa\xab\x49\xf3\xbb\x43\xe5\x8c\x3f\xe9\x6d\xf1\x6d\x4b\x91\x2e\xfc\x5d\x6b\x75\x03\xed\x6e\x17\xdd\xdb\x41\x3f\xf2\xd7\x36\x06\x0b\x3d\x4f\x83\x20\x2b\xdc\xb5\x2d\x7a\x47\xc0\xbd\x70\x2a\xc6\x91\xce\x54\xef\x46\xcc\xaf\xee\x01\xfa\x29\x6c\x29\x64\x70\xae\x26\xeb\x22\xf4\x31\x79\x94\x27\x89\x44\x49\x03\x30\xc9\x0f\xaf\xcd\x98\xe4\xfb\xde\x22\x3d\x4e\x79\x49\x2e\x0b\x13\x42\x33\xbf\x9c\xac\xd1\x1a\x65\x07\x81\x81\x4d\x40\x2f\x77\x35\x87\x5b\x16\x83\xba\x63\xb8\x09\x36\x38\xfa\x8a\x0c\x7d\xbf\xde\x0c\x70\x4f\xc3\x49\x64\xb4\x5d\x3d\x25\xc3\x47\xe7\xb1\x14\x2e\x3a\x60\x0c\xaa\xb4\xe6\x0c\x26\xe1\xa7\x88\x47\x8d\x4a\x6b\x72\x19\x8a\x3e\x8a\xb7\xea\x90\x82\x8d\x17\x1b\x0e\x19\xae\x77\x0c\x84\x61\xc4\x94\x3e\x29\x07\xf4\xa1\xcc\x9c\xee\x29\xad\xb2\xc3\xee\x93\x0a\x6d\xc1\xc5\xc5\x83\x8f\x01\xe6\x98\x7f\x7c\xfc\x30\xae\x87\x6c\xcb\x7e\xd8\x73\x44\x77\xf5\xce\xf2\x03\x4d\x78\x0c\x25\x35\x4c\x6f\x40\xca\x81\xc6\x68\x1d\xf6\x51\xd4\xfa\x1d\x8d\xb8\xd5\x05\xd7\x72\x5a\xcd\x85\x7a\xfe\xcc\x6d\xe6\x09\x48\xea\x73\x13\xd5\x08\x52\x50\x28\x0b\x32\x44\x28\x0b\xd2\x53\x28\x4b\xd0\x30\x2a\x77\xae\x8e\xce\xe7\xf9\xf9\xb7\x13\xdf\x94\x33\x7a\x60\x38\x69\x0a\x1d\x8e\x7b\x98\x02\x0a\x93\xda\xdf\x7b\x18\x55\x89\xb7\x20\x2b\xf6\xad\x70\x75\xf7\x27\xc0\x58\xfb\xfb\x7b\x85\x2d\xee\x01\xfe\x6d\xa0\x99\x98\xc2\x56\x14\xc4\x7a\x17\x89\x05\x76\x25\x1c\x38\x51\x54\x5a\x64\x88\x7d\xae\x61\x4a\x6c\xd2\xd9\xce\xa7\x8b\x0d\xcf\x30\x32\xe7\x9c\x13\x40\x65\x73\x62\xf2\xa7\xca\x4d\x3f\x38\x0c\xe5\x96\x42\xd6\x93\xc9\x53\x15\x1a\x2b\xbe\x69\xfb\x44\x2f\x1a\x8d\x92\x1f\xdd\xd4\x47\x38\x29\x30\xd4\x8f\x91\xc4\x8b\x4e\x53\xd5\xc9\x0b\x87\x21\x6a\x54\xda\xa0\xf9\x89\x3a\xf6\x79\xae\x87\x9d\x9e\x55\x86\xdc\x8f\x7d\x7a\xa8\x11\xa3\xf8\x3e\x6c\x17\x96\x70\x6b\x0e\x3d\x94\x47\xcc\x20\x0a\x4d\x54\xe6\xef\x2a\xce\x9f\x82\x51\xc8\xeb\x9a\xdc\x4b\x4e\xb8\xcf\x53\x8c\xb9\xfa\x16\x4b\xc2\xaa\x38\xdb\x07\x39\x35\xaa\xf2\xd2\xf2\x93\x10\x22\xd6\xe2\x08\xa3\xea\x5a\x5f\xf3\x4a\xcd\xd2\xcc\x6f\x28\xdf\x1a\x39\x50\x69\x1d\x58\xf2\x01\x7a\xb1\xcd\x0e\xe5\x10\x99\x75\xc9\x69\xd7\xfc\xf2\x71\x92\x13\xd2\xff\xc3\xc5\x07\x84\xb3\x47\x8d\x49\x1d\xe7\x52\xf3\x38\x91\xb1\xe2\x67\x24\x8c\x4f\x32\xe2\xf1\x46\xce\x73\x11\x96\xd2\x0f\x4e\x6c\xaa\x54\x9b\x27\xfc\x02\xa0\x9b\x0f\x67\xae\x4d\xd0\xf9\x9b\x27\xdf\xbe\xc8\x60\x47\xe4\x42\xca\x47\xa4\x45\xca\x27\x49\x09\x19\x0c\x88\x6c\x93\x8c\x2a\xa6\x02\x3a\x8f\x23\x92\xed\xc1\xd6\xf8\xbc\x3b\x3e\xf9\x85\x51\xe3\x68\x38\xe0\xa4\x8b\x98\x95\x29\xa9\xc8\xa7\xc1\x3f\xe7\x3e\x6a\x06\xb3\xa3\xad\x5e\xe4\x95\xc8\x09\x1b\x1b\xd4\xbc\x7a\xd8\xc0\xd2\xef\x00\x7b\x80\xcd\xd2\x18\x72\x06\x4b\x61\x27\x56\x5d\x01\xd8\x4c\x38\xbb\x9b\xf4\x39\x85\x05\xae\xf7\x40\x4f\xfb\xe2\xbf\x94\x7a\x74\x1a\xae\x12\xbc\x4b\x11\x70\x02\x10\x7e\xd0\xf3\x8e\xf6\x6d\xd2\x69\xd8\x20\x76\xa3\x9e\x19\x23\xb2\xf6\x14\x62\x99\xc3\x1f\x3a\x8c\x45\xe6\x07\x85\xaf\x6d\xc9\xaf\xee\x66\xb0\x0a\x33\xbf\x9a\x07\xa9\xec\x87\x0c\x87\xb2\xb2\x29\x5f\xcc\x65\x19\xb1\x41\xe2\xc0\x1f\x22\x7a\x33\x68\xa2\xd8\xb8\xc2\x6e\xeb\xd7\x8a\xed\x85\x17\x56\x14\x39\xd1\xca\x91\xcd\x2e\x9b\x61\x5d\x5d\xda\xac\x06\x45\x5f\x8f\xe7\x79\xd5\xf7\x07\x97\xe4\x0f\xfb\xe6\xe2\xe2\xec\x3c\x9b\xd4\x6c\x7b\x7e\x8a\x7e\xdd\x2a\x32\x2a\xcf\xef\x49\xb5\x47\x43\x6a\x0e\x2e\xf7\xe3\xca\x4b\xed\x98\x15\x09\x21\x1b\x97\x13\xff\x5d\xc7\x01\x8d\x11\xd9\xff\x5a\x8a\xb2\x85\xbe\xb4\xe8\x31\x43\x6f\x96\x73\x8d\xb0\xdc\x5c\x00\xc2\x96\xc0\xa0\x43\x8d\x9f\x03\xda\x50\x66\xb7\x1d\x0d\x25\x11\x9c\x8e\x8a\x32\xac\x5c\x55\xbb\xab\x1a\xfe\xd7\x47\x3d\xa1\x17\x1a\xbf\x4f\xe1\x9f\xbd\xc5\x1b\x91\x52\x79\x44\xed\xa0\xad\x8a\xda\x40\x31\xc6\xad\x9e\x05\x33\x17\x14\x5c\xe1\x8b\x87\x9c\x2a\x24\xd4\x2e\x1e\x48\x62\xfe\xe2\xf6\x1f\x0d\x26\xc4\x14\xde\xfe\xe1\x6c\xb3\x98\xf8\xa9\x83\x7b\x8c\x74\xf7\x91\x1d\x4d\x0a\xad\x8b\xf2\x91\xe4\x9d\x18\xee\xc5\xf0\x70\xa6\xfb\xe0\x74\x27\x51\xcb\x21\xc9\x8b\x66\x4b\xc9\xdb\x8f\xdb\x01\x6c\x37\x1d\x06\xef\x74\x3b\x7a\xdb\x4c\x0d\xff\x49\x5f\xd5\xae\x53\x3f\x1c\xbc\xc2\x2e\xf8\x5f\x5a\xde\x4a\x53\x68\xa5\x15\xe8\xd5\xa2\x1c\x9e\x13\x10\xe7\xef\x16\xf9\xb7\x91\x62\x44\xa8\x81\xfe\x4c\xd7\x4f\x9f\xb9\x24\xc0\xb8\x26\x65\x9b\xfb\x80\x8a\x08\x97\xad\xc3\x64\xad\x20\x66\xaa\xa1\x3e\x92\xfc\x66\xe9\x74\x24\xe6\x21\x5c\x24\xb8\xb6\xf4\x4d\xdd\xfd\x97\xb8\x14\xc0\x39\xb0\xc3\x34\xfe\xf0\x5f\xc2\x6d\xaa\x25\x0e\xc8\x70\x39\x60\xd0\x24\xc0\xa1\x1e\x6f\x6f\x02\xb4\x7d\xdb\x07\xdf\x89\x6b\xfb\xce\x7f\xa1\xcc\x21\xed\xe0\xbc\x87\x42\xfc\x91\x9f\x0f\xb5\xb3\xce\x09\x51\x2b\x2d\xa9\x38\xce\xf8\x5f\xcc\x85\xb0\x8f\x45\x70\x85\x1b\x3f\x47\xa9\x83\x47\x21\x12\xb8\x80\x8e\xf8\xaf\xaa\xb9\xfd\x75\x5b\xb5\x93\xe3\x08\xd4\x2e\x6a\x5f\x23\x28\x34\x1c\x41\x9e\x6b\x43\x79\xf1\x8e\xa0\x0a\xad\x44\x69\x88\x30\xa9\x0c\xdc\xf1\x92\x6f\xe6\x7b\x8a\x4e\xa6\x24\x7c\xa4\x05\x69\xe0\xa4\xe1\x88\xb4\x0a\x72\x9e\x18\x14\x71\x92\x35\xe5\x6c\x6d\xb7\x14\xcd\x0f\x64\xb3\xb6\x62\x78\xc2\x84\x8d\x1e\x04\x95\x59\x1e\xe8\x31\xbe\x99\xda\x6d\x73\x98\xaa\x61\xd1\x9e\x21\xd1\xd4\x8e\xad\x49\x24\x36\xa7\x3f\x88\xda\x23\xfd\x1a\x83\xa2\x4d\x8a\x1f\x0f\x70\x5a\x21\x07\xc4\x6e\xc7\x5e\xd8\x20\x03\xb4\x61\x1a\x41\x04\x8c\x4b\xd6\x9f\x26\x9e\x1d\xf1\x8c\xd2\x5d\xd5\x0f\xed\x61\xf5\xe2\xb0\x1c\x8d\x54\xf5\x61\xd4\x27\x09\x5a\xb2\x45\x77\x7b\x69\x2f\x7e\xe0\x55\x7f\xa5\xe9\x2a\xc8\xba\x9c\xbe\xc7\x43\xce\x25\x69\x56\xbf\xe2\x3e\x65\xb5\x5e\x74\xb6\xf1\x6f\xfb\xb0\xdd\xa3\x1d\x8a\x36\xcb\xd8\xe8\x1f\xba\xfe\x34\x3c\x74\xcd\x71\x68\xe1\xb1\xef\xdf\xbd\x72\xf7\xf4\x29\x6c\x68\x57\x1e\x2e\xa4\x76\x31\xc0\xcb\x96\xa3\x1a\xf8\x3c\xb8\xeb\xb6\x9f\xe4\x75\x25\x07\x6b\x04\x86\x1f\xff\x55\x1b\xe6\x59\x92\x69\x74\xf5\xa3\x7f\x40\x89\xd2\x5f\xc6\xcd\xbb\x4f\xd8\x7a\xfa\x09\xce\xf6\x3e\xbe\x3a\xfe\x3b\x6e\xe1\xc7\x05\x3f\x86\x9b\xb7\xc0\xb9\x34\x3f\xb0\x09\x79\x78\x3b\x6f\x43\xd2\x70\x7e\xe8\x38\x78\x2a\xe9\x8b\xeb\xb0\x59\xb4\x03\xc9\x73\xf4\x71\x73\xf2\xa2\xfa\xcc\xac\xd2\xc6\x70\x4e\xff\x5c\x6b\x32\xc1\xb4\x39\x7e\x1f\xf9\x9f\x1b\x1d\xe0\x03\xfa\x88\xca\x8a\x71\x98\x0f\x26\x48\xa2\xd7\x32\xa3\x97\xb0\x3e\x68\xe5\x26\x1e\x8b\xfe\x51\xdf\x6e\xff\x27\x06\xe7\x1f\xa3\x18\x9f\x9d\xf8\xe9\x89\xd2\xbf\x03\x3f\x77\x0a\xa8\x65\x42\x53\x4a\x85\xda\x9b\xdd\xea\x2b\x10\x84\x30\x9d\x43\xcb\x71\x8e\x0d\xe7\x2e\x8a\x47\x45\x67\xc0\xdd\x7b\xe4\x07\x34\x75\x52\xb2\xb3\x85\x79\xf8\xfc\xb3\xf1\x94\xab\x8f\x9f\xfd\x17\x25\x7a\xf4\x36\xff\x7d\xff\x8e\x3d\x90\x8a\xbe\x6d\xeb\x57\x0b\xb3\x6b\x57\xa6\xef\x6e\x7f\x76\x8b\xcb\xae\xdd\x53\x9c\x3e\xa5\x9b\x42\x1b\x1b\x32\x43\x14\xaa\x4f\xa5\xf4\xd7\xa7\x6e\xf5\xa9\x26\x3c\xc7\xd7\x6f\x3e\xdd\xc3\x6f\x7e\xe9\x90\x7e\x5e\xc1\x4f\x4c\x23\x46\x3f\x4a\xf8\x51\x56\xfc\xf7\x1b\xaa\x87\xbe\x0a\x5c\x0d\x28\x36\x54\xbc\xfd\x9b\xa3\x9f\x37\xf0\xc3\x34\x2d\xbf\xa7\x03\x17\x7f\xe9\xf0\x71\x6a\x9f\x58\x9d\x9e\xa0\x6e\xd0\xa6\x8a\xc5\xdc\x1d\x95\x02\x46\x77\x54\x86\x7d\x52\x49\x69\x6e\xa8\x00\xfa\xa5\xdf\x6f\xac\x7d\x2d\x8d\x61\xe7\xdc\x56\xdb\xf4\x57\xdc\x94\xa5\x75\x71\x8b\x1b\x6b\xb8\x21\xd3\x70\xcb\x9d\x79\xb3\xd6\xa1\xe8\x38\xa8\x50\x07\x22\xa3\x80\x95\x2c\xbb\xf6\x80\x0f\xa8\xbd\x5a\xe8\xf3\xb0\xfa\x2e\xec\x49\x07\xa3\xc2\x00\x69\xcc\xac\xdd\xc7\xac\x25\xfc\xcb\x59\xd0\xf8\x9d\x74\x79\x5a\x82\xef\x43\x7a\xfb\xd6\x2d\x17\xfa\x82\x74\xd5\x1c\x06\xd1\x73\x8f\x9e\x2f\x67\x39\x3d\xca\xa2\x8e\xdd\xa1\xd9\x65\xb9\x20\xb5\x3a\x66\xf5\xdb\x00\x8b\xf5\xc2\x2b\x95\xa2\xdc\x80\x0f\xfe\xfc\x67\xe2\x7e\xab\x77\xf6\x2f\x7f\x29\x9e\x7d\xf9\x10\x6f\x16\x8c\xe4\xf5\x4e\x65\xea\xb8\x06\x90\xc0\x30\x7f\x95\x00\x63\x1e\x2a\x0a\x61\x25\xd7\x28\x0d\x61\x5d\xfc\xcf\x00\x00\x00\xff\xff\x7d\xe4\xe4\xc1\x18\xe7\x00\x00") - -func confLocaleLocale_ptBrIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_ptBrIni, - "conf/locale/locale_pt-BR.ini", - ) -} - -func confLocaleLocale_ptBrIni() (*asset, error) { - bytes, err := confLocaleLocale_ptBrIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_pt-BR.ini", size: 59160, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_ruRuIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\xbd\x6b\x8f\x1b\xd7\x99\x30\xf8\x9d\xbf\xa2\xac\x81\x60\x1b\x68\xd1\x70\xf2\xee\x05\x86\xdb\xde\xc4\xce\xd8\x59\x38\x8e\xdf\x48\xc1\x60\x61\x08\x74\x35\x59\xdd\x5d\x23\x36\xc9\xb0\x48\xc9\xf2\x60\x00\x5d\x62\xcb\x59\x39\x52\xac\x38\x1b\xaf\x63\x5b\x91\x3d\x97\x17\x18\x04\x4b\xb5\xba\x25\xf6\x8d\x02\xf2\x0b\x8a\x7f\x61\x7e\xc9\x9e\xe7\x76\xce\x73\x4e\x9d\x22\xd9\x76\xe6\xc5\x60\x62\x35\xeb\xdc\xcf\x73\x9e\xfb\x25\x1d\x0c\x5a\x9d\xac\x68\xaf\x97\xdf\x96\x7b\xe5\xac\x7c\x58\x9e\x94\x93\xf9\xdd\x64\x7e\xbd\x3c\x9a\xdf\x2c\x1f\x9b\x1f\x26\x89\xf9\x72\x44\xbf\x99\x06\xf3\xeb\xf3\x1b\xe5\x6e\xb9\x6f\x1a\x9e\x98\xbf\x1f\x95\xb3\xe4\x8d\x7c\x74\x6e\x7e\xcd\xfc\xf4\xd4\xfc\xf0\xa4\x9c\x9a\x06\x33\xf3\xf7\x74\x7e\xb7\xd1\xd8\xee\xef\x64\xeb\xe5\xef\xcb\xa3\x72\x62\x7a\xe1\xe0\x8d\x4e\x5a\x6c\x6f\xf4\xd3\x61\x67\xbd\xbc\x6f\x7e\x3e\x31\x3d\x8f\xe6\x9f\x24\x66\xbe\xa7\xa6\x1b\xb4\x3b\xc2\xf1\x61\x80\xec\xfd\x41\xb7\x3f\x34\x43\x7c\x6d\x96\xf2\x04\xc6\x6d\x6c\x67\xdd\x01\xf4\x9c\x95\xc7\xe6\xef\xdf\xcc\x3f\x69\x14\xf9\x56\xaf\x95\xf7\xd6\xcb\x7b\xe6\xc7\x03\x33\xfd\x94\x7e\xea\x8f\x47\xe6\xb7\xf9\xed\xf9\x87\xe6\xf7\x3d\xfa\x6d\x6c\xfa\xfe\xd9\x0c\xff\xc8\x0c\x6f\xb6\x02\x13\xce\x3f\xc2\xa9\x86\xd9\x56\x5e\x8c\xb2\x61\xdd\xf7\x2b\xd9\x46\x91\x8f\x32\x98\x65\xbf\x7c\x78\xce\x1c\xc7\x04\x26\x6b\x5c\xce\x86\x45\xde\xc7\xd9\xf7\xe7\xd7\xcc\xcf\xd0\x78\x90\x6e\x99\x96\x0f\x68\x00\xdc\xcb\x47\xe5\xa4\x31\xca\x76\x06\xdd\x14\xc6\xf8\x1f\xe6\xd7\x87\x66\x9f\xb3\xf2\xa4\xd1\x4d\x7b\x5b\x63\x6c\xff\xff\x95\x4f\xe6\xb7\xcb\xc3\x46\x7b\x98\x99\x56\xad\x5e\x76\xc5\x8c\x81\x87\xba\x67\x96\x71\x63\xfe\x49\xb3\xd9\x6c\x8c\x8b\x6c\xd8\x1a\x0c\xfb\x9b\x79\x37\x6b\xa5\xbd\x4e\x6b\x07\x0f\xe8\xbe\x99\x69\x36\xff\x75\x39\xc5\xc3\xc4\xbb\x30\xff\x80\x33\x33\x07\x6a\x3a\xe3\x29\xdf\x4d\xca\x69\x82\xc7\x3c\x9b\xdf\x32\xbf\xec\xe3\xa1\x64\x1d\x73\x7a\xad\xb4\xc0\xc3\x4a\x4c\xf3\xd9\xfc\x63\xb3\x36\xd3\xf2\xd0\x2c\xf3\xb0\x81\x53\xf6\x52\xb8\xc9\xcf\xcb\x63\x18\xa4\x66\xf4\x46\xb6\x93\xe6\xdd\xf5\xf2\x2f\xe5\x51\x13\x1b\xcd\x6f\x99\x4f\x13\x73\x1a\x45\x71\xa5\xcf\x17\x0e\x93\x43\x67\x73\xe0\xad\xd1\xd5\x01\x1e\x28\x00\xd4\x1e\x42\xce\x3e\x0d\xbe\xcb\x40\x64\x60\xac\xd1\x4e\x07\xa3\xf6\x76\xba\x5e\x7e\x61\x56\xf3\xd4\xac\x7b\xd2\x30\x7d\x07\x7d\x73\x1b\xfd\xe1\x55\xba\xae\x00\xf4\xca\x83\x46\x7f\xb8\x95\xf6\xf2\x0f\xd2\x11\xde\xcd\xef\xcd\xcd\x18\xf8\x32\xff\x37\x69\xec\xe4\xc3\x61\xdf\x5c\xf3\x1f\xe1\xbe\x70\x8b\xe6\x1e\x1a\xe6\xb0\x5b\x30\xea\x7a\xf9\x15\xce\x7f\xbb\x3c\x48\x62\x50\x6d\x86\x86\xa6\x3b\xf9\xd6\x10\x6f\xf2\x2b\x3e\x02\x73\x2a\x5f\x9a\xaf\x8f\x14\xc4\x50\x3b\x9a\x8c\x9a\xcd\x60\x7f\x4f\x2a\xf3\x6e\xf6\x87\x97\xbc\x26\x33\x7a\x64\xf8\xbf\xfc\x18\xcc\xcf\x35\x8f\x0c\x46\x30\xbb\xf5\x96\x02\xdf\x1e\x11\xe4\x99\xd6\xb2\xa0\x9d\xb4\x67\xe0\x8c\x1a\x7f\x1b\xbe\x36\x9a\x37\xd2\xcd\xbc\xb3\x69\x23\xed\xec\x18\x18\x19\xa4\xbd\xac\xeb\x3f\x5b\xf3\xcf\x3d\x68\x81\x40\x2e\x2f\x86\x16\x37\x69\xa4\xed\x76\x7f\xdc\x1b\xb5\x8a\x6c\x34\xca\x7b\x5b\x05\xac\x71\xc2\xad\xcc\x53\x35\x87\x30\x85\x01\x0e\xe1\x34\xcc\xfd\x9c\x20\xb4\x2c\x68\xdc\xb8\xda\x1f\x5b\xe0\x07\xc0\x99\xcc\x3f\x16\x78\x66\xd0\xa7\x26\x6e\x0c\x6c\x03\xd3\x9c\x54\x06\x33\xcb\x1b\xe5\x97\xf3\x51\x9e\x99\x76\xbf\x2b\x0f\x01\x73\x20\x96\x9a\x61\xc3\x4f\x1a\x83\x71\xb7\x6b\x80\xe2\x57\xe3\xac\x18\x15\x00\x30\x13\x9e\xeb\x3a\xbc\x13\x33\x20\x22\x4a\x3c\x23\x3c\xc0\x46\x5e\x14\xe3\x8c\x5b\xc2\x93\xbd\x05\xb3\xb4\xd3\x5e\x1b\x4e\xed\x6b\x33\xfe\x31\x9e\xb5\x01\xe0\x77\xf3\x5e\x31\x4a\xbb\xdd\x8b\x0d\xfe\x87\xb9\x11\xc4\xad\x13\xc4\xab\xbb\x70\x22\x8d\x51\x3e\x82\x6d\xfa\x1f\xe0\xe5\x9e\x18\xf0\x34\xf0\xf0\xb1\xf9\xf1\x11\xec\x8d\x30\xb4\x81\x0d\x80\xac\x5d\xc6\xcb\x70\x83\x66\xbd\x37\xcd\x1a\x61\xb0\x4e\xbf\x7d\xc9\x60\x0e\x40\x9f\x80\xe4\xfe\x40\x4b\x4f\x00\xd4\x83\xa6\x08\x78\xfb\xc9\x1b\xfd\xad\x02\xb0\xc1\x89\xf9\x1d\x8e\x6d\x9a\xbc\x8e\x43\xac\xd1\x13\x7d\x0c\x00\x6c\x2e\xed\x80\x56\x67\xd1\x0a\x9c\x22\xf6\x7f\x39\x4d\x46\xe9\x70\x2b\x1b\xad\x9f\x69\x6d\x18\x24\x77\xe9\x4c\xb2\x3d\xcc\x36\xd7\xcf\x9c\x2d\xce\xbc\x32\xff\x2d\xb4\x23\xa2\x82\x90\x3e\xbf\xfd\xf2\x0b\xe9\x2b\x38\x9f\x39\xca\x63\x8b\x54\x3e\x81\x6d\xcb\xd6\x0c\x96\x48\xf0\xf7\x63\xc6\x4d\x09\xce\x37\x3b\x07\x5b\x31\x08\xd5\x34\x04\xc0\x3d\x66\xfa\x71\x03\xe0\x13\xaf\x09\x66\x9b\xc1\x8b\xbe\xee\xa1\xe4\xfd\x67\x1a\x70\xbd\x06\xad\xb7\x3a\x1b\x44\x09\x71\xd7\xd8\xc8\x60\x79\xb3\x3d\xb3\xb4\xe4\x67\x57\xcf\xff\xf7\xb7\xd6\x92\x77\xfa\xc5\x68\x6b\x98\xe1\xbf\xcd\xff\x98\x5e\x3f\x84\xf9\xe0\x14\x2f\xe4\xaf\xff\xb8\xd9\x30\x63\xf0\x95\x45\xc0\xdc\x90\x52\x40\xef\x70\x59\x30\xfd\x09\xd0\x25\xec\x81\x38\xf0\x1b\x33\xd0\xd3\x9a\x46\xdb\x66\xde\xf5\xf2\x5f\x09\x2c\x11\x19\x13\xfd\xab\x62\xe0\x4f\x6a\x50\xad\x99\xc6\xc3\xdf\x75\x6b\x11\xe0\xf8\x0c\xe1\x09\xb7\x9d\xc0\xb3\x76\x08\x1f\x2f\x1c\x6e\x17\x1f\xcb\xd3\x04\x01\xf3\x21\x3e\x82\x8f\x92\x9f\xf6\x7a\xfd\xd7\x7f\x6c\x0e\x19\x6e\x67\x86\x18\xfd\x1a\x03\x33\x1c\xfe\x78\xb4\xf9\xbf\xb7\xb6\xb2\x5e\x36\x4c\xbb\xad\x76\xde\x6c\x14\x45\xd7\x50\xaf\x4e\x46\x38\xfc\x31\xdc\x7b\x72\xfe\xfc\x5b\x66\x13\xa3\x6d\xa0\x68\x37\xf1\x15\x16\xbf\xea\xc2\x05\xc9\xda\xf8\xe7\x04\x2e\xff\xd7\x40\x83\x01\x0a\xe3\x5b\x8a\xde\x52\xf2\xf2\xc6\xf0\x15\x83\xfe\x00\x7e\x1e\x0b\xcd\x99\x00\x67\x83\x7b\xbc\x63\x7e\x38\x41\xec\x8f\x0f\x02\x67\x7a\x8a\xd0\xef\x3d\x12\xd3\x67\x17\x61\x10\xe8\xa8\x30\x45\x8a\x6f\x9a\xdf\x6e\x36\xb2\xe1\xb0\x65\x28\xfe\xe8\x2a\x00\x97\xb7\x27\x58\x3c\xad\x18\x06\x5a\xb2\x62\x00\x61\xd3\xea\x18\xdf\x1c\x80\x23\x8c\x2e\x0b\xbb\x89\x60\x76\xbb\x3c\xa6\xe9\xf2\xde\xe5\xb4\x9b\x77\x0c\x18\xae\x72\xe5\xf1\xe1\xf1\x20\xf6\xf0\xbd\x3d\x26\xb6\x03\x7e\x82\x37\xb9\x8b\x27\x74\x3b\x39\xd3\x3c\x03\x8c\xc4\x99\x73\x67\x9a\x8d\x5e\xbf\x45\xb4\x01\x58\x91\x4e\x5e\xa4\x1b\x86\x2d\x21\x5e\x6a\xc8\xc4\xf7\x1e\x61\x4b\x3d\x89\x10\xb9\x43\x3c\xf1\x5b\xfc\x56\xf1\xd1\x85\x9c\xd7\x1d\x58\xf2\x8c\x56\xf5\x84\x57\x3f\x05\x7e\xf4\x26\x1e\xfd\x0d\x44\x8b\x07\x7c\x3b\x08\xac\xd3\x85\x44\x49\xdf\x8b\x50\xb5\xc8\x9b\x59\x38\xc6\xaa\x57\xd2\x10\x68\x67\xb4\x60\xb8\xd8\xf9\x6f\x88\xd4\x3e\xc5\xa9\x26\x80\xab\x60\x6c\x73\x44\x80\x79\x1a\xc0\x91\xfb\xac\x16\x32\x1d\x47\x34\x13\x73\xc5\xd2\xc8\xbe\x89\x00\x9a\x9f\xe0\xf5\x5d\x67\xec\x67\xfe\xdc\x65\x9a\x0e\x50\x8b\xf4\x70\x1f\xe1\x1b\xae\xc0\x4c\x7d\x17\x78\x59\x73\x0d\xbf\xa1\x9f\x23\x4c\x40\x39\x7d\x06\x59\xae\x0a\x14\x13\x93\x06\xb7\x11\xe7\x4d\x6c\x27\xbb\xd4\x7b\x66\x32\x7c\x28\x08\x05\xc8\x68\xc5\x39\x1b\x73\x8d\x46\xb2\x48\x10\x09\xef\xc1\x84\x08\x02\xf3\x0f\x19\x7d\xef\x03\x08\xc3\x23\xb4\xb8\x9d\xf1\xcd\x3e\x12\x72\x1e\xa2\xd9\x18\x8e\x0d\xd3\xbf\x10\x65\x4a\x0b\x77\x9a\x0b\xd8\x67\x90\x92\x8e\xe8\x2a\xd4\xa5\xef\x31\xcb\x70\x13\x70\xf8\x21\x63\x0e\x64\xa0\xdd\x19\xdd\xa9\x39\xa3\x84\xdb\x29\xec\x62\xf0\x19\x00\x83\x21\x28\x7d\xc3\x50\xf7\x00\x1f\xcf\x88\xa8\xf1\x2f\xee\x34\x99\xfd\x40\x18\x04\x4a\xf7\xcb\x5f\xbc\x75\x0e\x20\x17\xe6\x82\x6b\xb5\xbc\xc1\x21\x49\x1b\x16\x25\xcb\x33\x82\x05\x19\xa4\xfb\x26\x60\xe3\xed\xd6\xa0\x3f\x1c\xad\x9b\xbf\x08\x38\xae\x19\x72\x23\xbf\xda\x29\xbf\xa2\xb5\xcc\xaf\xd9\x36\xe5\x64\x8d\xb6\x89\x7b\x22\xdc\x19\x12\x0d\x58\x20\x8c\x8b\x17\x7f\x0d\x49\xfe\x35\x23\x23\x7c\xcd\xac\xcd\xee\xfc\x13\x66\xfe\xdd\xf3\x59\x63\xe2\x0e\xc7\x1c\xc3\x16\xb8\xe8\xed\xd1\x68\x40\xab\x86\xfb\x85\xd5\x24\x6f\x5e\xb8\xf0\x8e\xfb\xfd\x94\xeb\xae\x3c\x37\x58\x14\x82\xa0\xe0\x46\x83\xe0\x81\xf1\x42\x71\x0c\x5f\xe2\x78\xd8\x5d\x37\xc7\x5e\xff\x54\x4d\x03\xbb\x8a\xbf\xe0\x64\x37\x2a\xef\x3f\x41\x46\x3c\xbc\xca\xd5\x6e\x0f\x36\xfc\x02\xfc\xcf\xf9\x84\x19\xdd\xc4\x07\x01\x78\x24\xc8\xe6\x1f\x32\x4b\x72\x22\x48\x53\x64\xb4\xfd\x66\xa3\xdb\xdf\x6a\x0d\xfb\xfd\x51\x84\x52\x3d\x36\xff\xbe\x86\xa8\xc4\x6c\xde\x6f\x68\x37\xf6\x05\xbe\x12\x94\x69\xca\x47\x76\xdd\x1a\x29\x0b\xb5\x86\x0d\x78\x63\x02\x4e\x6e\xf4\x07\x40\x2c\x1c\xaa\xfc\x33\x72\x50\x1f\xf3\x93\x3e\x61\x96\x37\xc2\xc5\xa3\xcc\x59\xcf\x77\x69\x92\xbc\xec\x18\xe6\xb7\x1b\xc5\x8e\x81\x1b\x62\xb8\xbe\x05\xea\x5c\x1e\x25\xe7\x7f\x66\xe0\x09\x7f\xdf\x1c\xf6\x77\x00\x31\x3f\x71\x7f\x3a\xb6\x44\xa4\xdd\x84\xee\x57\x5d\xc0\x5a\xf2\x8b\xbf\x7f\x2d\xf9\x5f\x7e\xf8\x83\x1f\x18\x88\x47\x00\x88\x92\x0e\xdc\x88\xea\x28\x3c\x80\x39\x37\x40\x15\xc8\x12\x27\x67\x88\x2e\x9c\x49\x5e\xc6\xe6\xff\x47\xf6\x7e\xba\x33\xe8\x66\xcd\x76\x7f\xe7\x95\x66\x03\x7e\x32\x88\x8c\xf0\xdd\x5f\x2a\x7b\x9d\x30\xc4\xa8\x85\x5a\x29\x70\x6a\x85\x78\x1e\xa4\x86\x2a\xc6\xfb\x88\xf2\xa4\xd5\xee\xf7\x36\xf3\xe1\x0e\x60\x26\xff\xb5\x22\x36\xd8\x63\xb9\x16\x38\x8b\x3d\x5f\xae\x0d\xc8\xbe\xb9\x58\xbc\xd7\x5e\x7f\x94\x6f\xa2\x90\x0f\xec\x0b\x9c\xcb\xc7\x6a\x40\x46\x10\x4c\x44\x6e\xb2\x1e\x01\xde\xb9\x53\x21\x99\xb3\xb8\x9c\x81\x44\x38\xbc\x9c\xb7\x33\x01\x94\x07\x0e\x0d\xe1\xa3\xd9\x43\x05\xc1\x23\x7a\xef\x15\x20\x53\x50\xd4\xe8\x6f\x6e\x76\xf3\x5e\xc6\x8c\xab\xdb\xa6\x12\xa2\x7f\x8d\xfa\xae\x03\x43\x22\x70\x6b\x8f\x49\xa0\xf1\x7a\x1a\xdc\x34\x00\x5d\xd4\xd7\x15\xb4\xf6\xda\xeb\x6f\x13\x93\xf6\x98\x99\x4c\x94\xab\x90\x16\xef\xe2\x11\xfa\x1a\xb8\x63\x3d\xc7\xfe\x1a\xc8\x73\x48\x60\x85\x35\xbe\x9d\x10\x34\xc1\x73\x23\x69\xcb\x23\xa9\xd7\x90\x3f\xd8\xc3\xeb\x44\x9c\x66\x5a\x1a\x20\x81\x47\x8a\x1a\x0a\x92\xbf\x0c\x25\x62\xce\x6e\x6b\x98\x5e\x4e\x8d\x58\x17\x5b\xb9\x7a\x6a\x86\x80\x71\xc3\x4a\xcf\xfa\x9d\x4b\x17\x52\x52\xc5\xa9\x35\x32\xdf\x78\xcc\x08\x2e\x24\x0d\x9b\x1f\xcc\x8f\x76\xef\xb2\x19\x00\x5b\x20\x1d\x66\xa8\x73\x66\x5d\xc7\x38\xe2\x2d\xc6\x9d\x77\x08\x39\x3d\xc2\x7b\x7f\x8c\xfc\xcf\x0d\xda\x7b\x0d\xed\x07\x5e\xb0\xd9\xd8\xcc\x3a\x19\x28\x7e\x3a\x2d\xde\x4d\xb7\xdf\xbf\x04\xdb\x89\xc2\x3b\x20\xbe\x43\x92\x69\x01\x70\x61\xde\x0f\x93\xf2\x77\x6e\x79\x30\x45\xdd\x98\x7c\x50\x3f\xe9\xc1\xf1\x25\xb6\x51\x42\x8d\x8a\x84\x5a\x25\xa3\x7e\x62\xde\xbb\xfa\xde\x1f\x64\xbd\xa4\xe8\x8f\x87\xed\x2c\x61\xa8\x4f\x36\xd2\x02\xbe\xf4\x92\x6e\xbe\xc1\xa7\xec\xee\xd4\xe7\xd6\xa3\xf7\x3a\x41\x65\x2b\x1d\xf8\x5d\x27\x99\x1b\x18\xba\x53\xc3\xb5\x47\x47\x97\xbb\x17\x4d\xca\x3e\x29\x0b\x16\x28\x2c\x01\xbe\xbf\xcb\xf4\x6b\x09\x62\x06\x68\x76\x08\xf8\xb6\x96\x99\xaf\x48\x3e\xde\x6b\x08\xb4\x53\x28\xd5\xe1\x7d\xb4\xac\x56\xb2\x72\xf1\x87\xa4\xa6\x34\x94\xd2\x6f\x1a\x6e\x1e\xf5\x52\x6e\x22\xdb\x4d\xe4\xcd\x38\x5a\xac\x3d\xa9\x26\xa9\x32\x86\x59\x8b\xf5\xe1\xad\xcb\x39\x28\x90\xab\x98\x53\xb4\x1b\xd2\x9f\xb6\xb9\x6b\xb9\xe6\x27\x5a\xf2\x3a\x12\x21\xc4\x9c\x3f\xde\x02\xae\x25\x50\xa4\x44\xa7\x96\xfd\x7e\xe3\xdf\x83\x9e\x47\xb3\x33\x4c\xe0\xa3\xbb\x83\x6d\xc3\x35\x3d\x42\xa4\xa5\x96\x33\x21\xcd\x94\xdd\x87\xbf\xac\xf9\x6d\xd2\x55\xb1\xb4\x31\xb5\x83\xd1\x56\x78\x38\xa4\x1b\x53\x62\xf0\xf0\x74\xd4\x7a\x61\xc0\xeb\x66\x61\x47\xc8\x94\x0b\x6b\x15\x3d\xaa\x5d\xa2\x26\x46\x40\xb9\x59\x59\x46\x93\xf5\xa7\xac\x96\x64\x9b\x8b\x93\x8b\x45\xaa\x00\x91\xc6\x01\x21\x2d\xc7\x8a\xb9\x08\xed\x8e\xa3\x5a\x2a\xa2\x3e\x05\xd1\x0e\xf6\x89\x4c\x77\x79\x00\xa8\x6f\x7e\x7d\xad\x16\xb5\x82\xde\xe6\xa7\xaf\x27\xeb\xc9\x8b\xd2\xe4\x26\x01\xb5\x2f\xdf\x00\x63\x22\x0c\x00\xbc\xcb\xc5\xd2\xb6\x3d\x2e\x56\xe9\x4d\x49\x5f\x02\xf8\x5a\x0e\xa5\x9e\x75\x33\xf3\xcf\x3f\x3d\xbd\x84\xcf\xe3\xae\x64\xb1\x58\xa0\x01\x68\x30\x2f\xe3\x7d\xd5\x3c\xcc\x9e\xc3\x5d\xae\x13\x0d\xe8\x0c\x21\x4b\x58\xb0\x45\xdb\x60\xcd\x70\x6b\xab\x0f\x8a\x6c\x5f\x0b\xcc\x14\x13\x54\x06\xa3\xac\x18\xb5\xb6\xf2\x51\x6b\x13\x18\xb7\x0e\x9c\x24\x32\x43\x7b\xc4\x8d\x13\xa4\x3c\xe5\x97\xb6\x8f\x42\x27\xf4\x7d\xd6\x74\x79\x96\x14\x75\xc7\x38\xac\xe1\x08\x5e\x4a\xce\x5e\x66\x7d\xdb\x0f\x81\xf5\x02\x82\x94\x77\x01\x89\x89\x22\x1d\xa4\x09\x67\xe7\x62\xf0\x45\xd6\xce\xaa\x8c\xf0\x35\x92\xc0\x47\xca\xac\x1a\x85\x31\x29\x9b\x91\x20\x1f\x88\x46\xe8\xd7\xa8\x96\x9d\x0a\xe7\x41\x20\xff\x10\xcf\x67\x82\x52\xf4\x4d\x7a\x6a\xb2\x82\x3b\xc4\x6d\x9f\x2d\xcc\x1c\xa2\x95\xd1\x5f\xb7\xfa\x1b\xe3\xbc\xdb\x69\x36\x44\x31\xd6\xd9\x90\x47\xb8\xb2\x92\x56\x36\x29\x4c\x2f\x2f\xcd\x60\x2b\x3c\x2e\x19\x59\xe9\x47\xbe\x62\x36\x94\x85\x59\x60\xcd\x02\x8d\xe2\x0a\x7a\x01\x1c\xdc\xea\x26\xe0\x32\x76\x52\x43\x46\x00\x9f\x02\x48\xdd\x44\x45\xd2\x41\xfd\x6b\xc6\x55\x1b\x04\xb0\x8b\x64\x74\x7f\x21\x77\x43\x1a\x75\x2d\xb3\x89\x2d\xc0\xac\xa2\x48\xce\xbd\x62\xfe\xb7\x51\xa4\x97\x33\xe2\xef\xb7\x16\x81\x9a\xa7\xa5\xb1\x24\xd1\x40\x3f\x5a\x68\x1e\xa1\xd8\xc7\x48\xd3\x3b\x3f\x0f\x43\x8a\x4a\x0b\xd6\x72\x82\x5b\xa9\x39\xd0\x40\x8a\xfe\xae\x4a\x41\x5e\x09\xbd\xb7\x62\xdc\x6e\x67\x45\x41\x6a\x97\x87\x00\x1e\x0a\x80\x1d\xd1\x7c\x26\x29\xbf\x24\xf6\x1a\x44\xb6\xdb\xa2\xae\x60\x8b\x0a\xc8\x24\x0f\xf1\x1b\x10\x1c\x54\xe7\x24\x68\x22\xbe\x4e\x34\x08\x0e\x9e\x9e\x26\x82\xdd\xbe\xa5\xf6\x37\x58\x3d\x66\x7a\xdf\x75\x70\x1b\x48\xe7\xcb\x21\x8c\x2f\xf3\x88\x8c\x41\xe5\x2e\xee\xb0\xf1\x2e\x18\xe4\x2f\x36\xc6\xa4\x3d\xec\x77\x3b\x20\x28\x2e\x44\x91\x9f\x88\x18\xfa\x93\x73\x80\xd3\xac\x81\xc1\xf6\xd6\x18\xb3\xb8\x92\x1b\x10\x6d\x59\x0b\x3f\x80\xcb\x28\x7b\x1f\x95\x33\xb4\xc3\x0a\xaf\x34\x43\xab\x1f\x40\xf4\x75\x56\x8b\x90\x69\x11\xf1\x7f\xc4\x23\x60\xe7\x2a\xbe\x34\x73\x3b\x5f\x02\x83\x5d\xa3\x3a\x6c\x14\xdb\xfd\x2b\x68\x19\x97\xd6\xf7\x59\xa2\x79\x22\x1c\xcf\x43\x5a\x33\x28\x43\xe3\x83\xec\x97\xbb\x60\x6f\x6f\xf7\xbb\x06\x03\xf6\x81\x81\xbd\x6c\x47\x7b\x80\x67\x74\xcc\xaa\xff\x93\x05\x4a\x4c\x58\x70\x7f\xb8\x65\xd7\x1b\x57\xaf\x42\x2b\x32\x15\xbb\x86\xda\x4e\x3c\x69\x20\x47\x45\xee\x14\xe1\x56\xcc\xdb\x64\xcb\x63\xd3\xbc\x20\xb4\x7f\xf2\x32\xef\x89\xbe\x17\xe4\x8e\x38\x9a\x99\x7f\x68\xa0\x82\xdd\x2c\x2e\x36\xb8\x5f\xcc\xa4\x3e\x45\xcb\x53\x51\xa3\x47\x85\x23\xcf\xd2\x21\xe0\xa7\xfb\x22\xf8\x98\x81\xd3\xf1\x68\xfb\xa2\xf2\x67\x68\xb1\x45\x38\xf0\x6b\x48\x88\xaa\x11\x08\x7b\x1c\xb7\xd3\x2c\x6c\x67\x03\x50\x4b\xec\x14\x88\x1c\x50\x38\xde\x27\x3b\x6d\xd0\xe5\x55\x94\xb0\x1c\x8b\x26\x26\x2b\x78\x6d\xcf\x34\x8a\x7e\x3b\x4f\xbb\xad\x55\x86\x55\xc8\x64\xe2\x29\xb3\xe6\x9f\x98\x39\x1e\x98\x39\xee\x3a\x9d\xfb\x3e\x3e\x5b\xc2\x7e\x1f\x11\xc3\x69\x80\xeb\xce\x33\x81\x1c\x44\xbe\x1b\x3b\x83\x11\xea\x91\x90\x9c\x9c\xd0\x10\x6b\x09\xba\x5e\xa0\xf9\x12\x70\x8d\x35\x43\xd7\x0a\x02\x5a\x25\x8a\x66\x65\x83\x61\xee\x57\x09\xed\x1a\x2c\x4a\xad\x95\xb1\xf4\x22\x7c\x38\x13\xb1\x0b\x0e\x6e\x12\x4a\x8a\x70\x5c\xc8\xde\x7c\x41\xcc\x2a\xe1\xc5\x7d\x11\xab\x4f\xab\xe8\x21\x25\xa6\x53\x45\x56\x37\x36\x03\xd9\x66\x27\xdb\xd9\x80\x99\x33\x96\xa0\x90\x6f\xb1\x14\x06\xb5\xe3\x06\x3d\x6c\x9a\xb7\x86\x58\x52\x58\xb6\x3f\xa2\x6d\xef\x36\xc9\x10\x9a\x51\x83\x96\xd9\x2a\x2d\x5f\x15\xcf\x21\x43\x84\x8d\x3c\xf5\x15\xea\x0b\x50\xff\x1f\x82\xdd\x1f\xb1\x93\xde\xe2\x14\xd5\x0b\x16\xfc\x9a\xc2\x53\x92\x34\x8c\x1a\xae\x22\xeb\x8d\x2c\x4c\x28\x1f\x10\x86\x34\x64\xe0\x9d\x81\x3f\x7a\xb4\x68\xdf\xc3\x95\xcf\xc8\xe2\xe3\xa3\x4d\xfa\x31\x79\x79\xe3\x95\xb3\xc5\xcb\x2f\x6c\xbc\x12\xe7\xc7\xd6\x3c\x26\x51\xf4\xf1\xbb\xec\x62\xe1\xe9\xda\x0e\x0c\x5f\x81\xec\xc7\x21\xea\x96\x61\x73\x4e\xff\x75\xb6\x93\x90\xa4\x41\xba\x26\xc5\x54\xd0\xc0\x1f\xdb\x35\xc7\xc1\xa1\x49\x6e\x19\x19\x21\x32\x8b\x2f\x9c\x7f\x86\x3a\x53\x84\x6c\xa2\xf4\x3e\xd6\x30\xe7\xb9\x9d\x6f\x18\x9e\xd8\xd0\x4d\xf4\x0c\x23\x1f\x30\x61\x6e\x40\x1a\xfe\x0d\xda\x53\xfc\x86\x56\x30\xe3\xd6\xbc\x78\x67\x33\x5b\xc8\x5f\xe0\x15\x54\xa6\xa8\x3b\xed\xef\xfd\x28\x87\x19\x82\x4e\x37\xdf\xc9\x47\xf5\x48\x05\xb9\x11\x02\x59\xb7\xb4\x19\x1a\x74\x8f\xd8\xfb\x86\xcf\xd5\x4a\xb2\xf0\x1c\x97\x1a\x0c\x84\x29\x23\xbf\xbe\x59\x1d\xea\x61\xd9\x60\x86\xc0\x4a\xa8\xf2\x87\x09\x6d\x10\x39\x95\xdb\xc4\xb8\x3f\x61\x3a\x72\xec\xbb\x7f\x29\x8f\xb0\xa7\xa0\x25\x07\xbe\xb7\xd9\xd8\x4e\x8b\xd6\xb8\xc7\x2f\x29\xeb\x30\x32\xfa\x23\xea\xcd\x41\xda\x44\x05\xa9\x80\xc8\x9a\x21\x8f\x86\x53\xfb\x96\x6e\xf1\xba\x22\x1a\x27\x4c\xe4\xaa\x0f\xea\x44\x08\x91\x68\xe2\x97\xda\x0d\x92\xe7\xec\xeb\x7a\xde\x1c\x85\x73\xae\x01\xde\x54\x09\x10\x53\x82\x2c\x32\x13\xf9\x6f\x1c\xe5\xea\x3a\xd4\x09\x83\xf0\x85\x9d\xe0\x65\x9e\x30\xa3\x89\x13\x69\x1a\x5a\x41\x1e\x6b\x84\x12\x1e\xc3\xa1\xcb\xc5\x4d\x80\xf3\x82\xe6\x4f\x45\xaf\x31\x05\x00\x61\x98\x92\x13\xfd\xca\xef\x66\xad\xca\xbe\x61\x4e\x3c\x73\x02\xc3\x00\x93\x65\x0d\x5b\xf6\xe4\xfc\x05\xb2\x05\x07\xc5\xcd\x02\xc9\x33\xf8\xd5\x59\x43\xd9\x69\x6e\x81\x64\x1e\x7a\x58\x56\x74\x98\xe2\xd1\xc2\xa9\x53\xfb\xda\x37\x0c\xf4\xba\xd9\xc0\x03\x80\x73\x18\x45\x8f\xc1\x34\xbb\x03\x60\x5f\xb5\x4e\x06\x9b\x8f\xe0\x6f\xb3\xb2\x87\xfc\xfa\x26\x9a\xc4\xdc\x6d\xd0\x7c\x8e\x16\x3d\x90\x86\x7e\x33\x91\x06\xda\x68\x7b\x88\xbc\x75\xc2\xd6\x87\x84\xbd\x16\x50\x0b\x52\x9e\xef\x03\x02\x17\xb0\x8a\x4a\x8b\x55\x19\xe3\xb8\x19\x2c\x56\x19\x58\x57\x00\x17\x75\x04\x56\xb9\xbc\x2b\xd7\xe8\x88\xb3\x1d\x7c\xd4\xef\xb7\x0c\x2f\x0f\xf6\xdd\xcf\xd0\xc9\xeb\x24\x38\x3a\xeb\x8a\xb1\x8f\x0f\x7a\x3f\xf9\x5f\x3d\x6f\x15\x78\x12\xe0\xa4\xd2\x33\x08\xbe\x6d\xf8\x3e\x4b\x4f\xbe\x42\xae\x55\x59\x39\x48\xfd\x18\xa8\x7b\x95\xa3\x07\xeb\x1e\x2b\xfe\x65\x6a\xd9\x09\x02\x16\x3c\x86\x27\x6c\xc0\x6f\xbc\x0b\x30\x74\x91\x48\x1a\xf0\xc0\x76\xfe\x08\xb6\xd4\x0f\x66\x15\x22\x67\x07\x65\x6d\x53\x44\x3b\x45\x5b\xb2\x0f\x88\x06\x42\x42\xb6\xd4\x12\x1a\x82\xe4\x3d\xe4\x47\x03\x1d\x94\xc7\x22\x68\xd7\x5e\xe6\x13\xad\x28\x1d\xf5\xa9\x4e\xf0\xfc\x41\x02\x74\x0c\xec\x12\x99\xdb\x0d\x2d\x96\xc1\xc5\x1d\x18\xdb\x3d\x64\x6f\x06\x73\x1f\xfd\x4e\x6a\x2e\xe4\x6a\x86\xf2\xfd\xc4\x80\x06\xc2\x82\xf9\x66\xbe\xe0\x80\x9f\xfb\x37\x6c\xfa\x18\x56\x71\xe7\x62\xe3\x97\x46\xfc\x79\x3b\x15\x01\x2c\xe6\x49\xf2\x0b\x23\x3d\xbd\xad\xb4\x8e\x71\x89\xab\xf1\x13\xba\xae\xdf\x79\x88\xad\xa9\xcf\xfe\x9d\xa8\x3e\xf2\x17\x59\x8d\xbf\xb4\x32\xcf\x22\xd3\xc1\x66\xbd\xc6\xf9\xf3\x6f\x5e\x20\xe5\x2a\xad\x07\x1d\x3b\x84\xb1\x9e\x34\xde\x1c\x8d\x06\xc5\x2f\xd9\x7b\x01\xfd\x07\xcc\xc4\x57\xbb\xfd\xb4\x23\x3f\xf2\xd1\x4e\xf0\xfc\x6e\x80\xd8\x8e\xae\xa4\x17\xb2\x74\x87\xf6\xf9\x55\x19\xb8\x17\x69\x75\xe2\xed\xc6\x8f\x8c\xf8\xa7\x0f\x24\xa6\x3b\x37\x92\xe3\x8f\x40\xf5\xf3\x93\xbf\x85\xca\xb4\xf1\x76\x76\xe5\xc7\xc3\xb4\xd7\xde\x96\xf5\x59\x97\x68\xf2\xa7\x86\xe5\xbf\xd6\xdf\x31\x2c\xd3\xf9\xf1\xce\x4e\x3a\xbc\xba\x4e\x7f\x25\x05\xfd\xc9\x1f\x7f\x66\x80\x16\x5d\xf2\x81\xa5\x07\xbd\xd5\x21\x22\xac\x6b\x0a\xb0\x90\xc1\x9d\xa1\x43\x17\x13\x69\xee\xfb\xda\x76\x3f\x6f\x67\x32\x6e\x1b\xff\x6a\x5c\x18\x66\x19\x03\x4f\xcc\x7f\xd1\x74\xed\x8d\x32\x91\x8b\x9d\x26\x15\x10\xcf\x7e\xc3\x9a\x57\x32\x74\x26\x7f\x6f\x45\xf7\xb3\xf7\x1a\x69\x77\xb0\x9d\xa2\x3a\x86\xbb\xfe\xf5\x3f\xea\x3d\x98\x42\x44\xef\x7b\xfd\x11\x86\x44\xa7\x1c\xe4\x77\x8f\x58\x16\xb0\x8c\x09\xcc\xf2\xdc\xb9\xd6\xf3\x80\xf9\x4f\xc8\x2f\x52\x78\x97\xe6\x5f\x8f\xf4\x52\x3a\x86\xd2\xff\xcf\x5b\x8e\x47\x0d\xd0\x60\x81\x84\xd2\x3e\x03\x78\xa7\x64\x47\x06\xe6\xd2\xac\xb4\xc8\x3f\x50\x27\x1d\x5d\x1f\xbd\x2f\x76\x27\x3a\x5b\x98\x93\x46\xdd\xa5\xeb\x18\x6c\x2c\xe2\x52\x49\x42\xef\x21\x8e\x74\x80\xa4\xeb\x20\xa1\x01\x41\x86\x2a\xaa\x44\xcc\xac\x6c\x27\x7d\xbf\x55\xbf\xba\xd8\x24\xc7\x48\x52\x70\x28\xb0\x80\x47\x07\x7e\x8f\x19\x30\xbb\xf2\x38\x2b\xe0\x1c\x5a\x50\x10\x59\x46\x3f\x60\xbd\xe0\xf8\xe4\x81\xec\x4a\x0c\x46\xe8\xc3\x36\x43\x50\xce\x7b\xed\xee\xb8\xb3\xfa\xd6\x9f\x3d\x5b\x3c\x6b\xba\x8d\x7b\x97\x8c\xd4\xde\xe3\x6e\x48\xf5\xc9\x93\x82\x35\x77\x25\x87\x4b\x7c\x8c\xfe\xe3\xa0\xf0\x96\x78\x93\x96\x99\xb1\x3f\x1c\x66\xed\x91\x8a\x3c\x51\xac\x3c\xd8\x0c\xf6\x98\x6c\x39\x7e\x45\xe9\xe9\x2d\xea\xb6\xec\x15\x39\xbb\x3f\x2d\x29\x38\xe0\xce\xfc\x46\xd3\xc5\xd6\xb4\x36\xb2\xac\xd7\x1a\xa5\x97\xb2\xde\x32\xa3\x15\xb1\xac\x27\x68\x09\x47\xd5\xc8\xa0\xdf\xaa\x19\x22\x4e\x81\x82\x01\xfa\xc3\xad\x6a\xff\x0a\x66\x8f\xea\x2d\x83\x91\x46\x86\x30\xac\x30\x94\x47\x24\x82\x21\x08\x16\xb1\xbb\x39\x9a\x4e\x48\x26\x17\xf3\xff\x22\xe7\x46\xbc\x0f\x01\xdc\x9a\xee\xb4\xed\x85\xa9\x5b\x5e\x76\xea\xd3\x8a\x6a\xa8\xd6\x34\x74\x00\x7e\x02\x86\x4b\x19\x62\x6c\x95\x32\x10\xf5\x2c\x03\x51\x55\x08\xdc\x04\x3b\x80\xd0\x75\xcd\x39\xb3\x71\x99\xc1\x6d\x56\x99\x90\x44\xaa\xe9\x82\x1b\x8f\x2c\xc7\xbc\x0a\xe0\xa2\x70\x3d\xdf\xae\x36\xb3\x37\x11\xaa\x97\x26\xf8\x05\xd4\xe8\x1f\x59\xd3\x20\x35\x8b\xcc\xe8\x78\xc9\x55\xe7\xd3\x46\x1e\x3e\xf0\x5d\xe6\xb0\x4f\x38\x12\x0e\x1e\x5c\xf6\x7e\x5e\xa0\x80\x30\xd1\x9d\x16\x99\xc5\xae\xa3\xfd\x6c\xdf\xaa\x0a\xf6\xe1\x2d\x76\xd3\x62\x04\xba\x7a\x3a\x1a\x8a\x89\x9c\xe8\xf0\x28\x72\x25\x38\xc2\xf5\x9d\x20\x43\x3b\x5b\x08\x2e\x4f\x2a\xa0\x1e\x9e\xd9\x3e\xa8\xc8\x60\xa8\x40\xf3\x6b\xfd\x16\x0e\x79\x74\x14\xd3\xd1\xbd\xc9\xcc\xba\x47\x7e\xbd\x31\xc2\xf4\x21\x32\x6a\xa4\x0f\x4c\x58\xd5\x70\xe2\xcd\x6b\xf6\xfa\x11\xfa\x95\x19\xfa\x87\x46\x90\x3a\x97\x6f\x83\x9c\xe4\xe6\xc0\x09\xf8\x52\x76\x35\xae\xf1\x35\x6b\x3d\x56\xb2\x37\xca\x4a\xfc\x52\x2a\x46\x67\x16\x16\x0c\x23\x7a\x4e\x28\x30\x58\x18\xc1\x20\x05\xfa\xe5\xcb\xd9\xd0\xb0\xe0\x76\x3a\x8a\x40\x0a\x79\x9d\x95\x46\x45\xad\xc7\x8c\x57\x66\x89\x0c\x45\x37\x39\xd7\x62\x38\xa1\x93\x04\xcf\xe5\x80\xfd\xea\xa6\xd6\x22\x7a\x52\xab\x4e\xbf\x29\x0e\x11\xa5\xa7\x2d\x15\xf3\x67\x8d\xb7\x12\xdc\xaa\x4c\xcb\xab\xac\x9f\xba\x01\x96\x13\x6b\x66\xfd\xda\xd1\xa7\x04\xc4\x3f\x6c\x08\x76\xb3\x29\x31\xa7\x72\x65\x64\xe4\x2b\x46\x79\xb7\x0b\x40\x6c\x03\x1a\x27\x4e\x87\x79\x1c\x06\xdc\xed\x5b\xb7\x39\x92\x1d\x78\xe9\x13\x47\xa3\x29\xd2\x4a\x78\x6e\xe6\x24\x2c\x6c\x45\xcd\x5e\x07\xa8\xdf\x3c\x61\xf3\xfe\x11\x2f\x00\x55\x61\x56\x7d\x65\xed\xc6\x7c\x89\x16\xbd\x72\xa4\x97\xf0\x30\xf8\xce\x9a\xbc\x2b\xd0\xfd\x61\xfc\x22\x3b\xcf\x4c\x44\xa1\xe6\xec\xa9\xbb\x35\xf0\x8c\x4b\x92\x10\xb9\x09\x18\x63\x45\x37\x87\x6c\xbc\x28\xe6\x8e\xe5\x51\x1f\x5a\x25\xe5\x27\x64\xde\x11\x7f\x5c\x6f\xdd\x44\x3e\xc3\x23\x67\x54\x54\xd6\x07\x63\x06\xa7\x5e\xe5\x8c\xaa\xa8\xe2\xb8\xd6\x4e\xb9\x16\xdf\xc6\x92\x13\x16\xf3\xa5\x7c\x05\x57\x87\xdd\x44\xdd\x9a\x41\xe2\x0d\x0a\xe1\x6b\x6d\xa0\x50\xa5\xb1\xed\xbf\x31\xac\x86\xe2\x55\x3d\x86\x35\x92\x34\xa0\xec\x8b\x0d\xc3\x5d\xf5\xb6\xb2\x96\x78\x92\x7e\x1e\xaa\x54\x94\xff\x66\xe3\x1f\xfb\x86\xb3\x06\xbf\xc4\xfb\xf8\xdc\xaf\xa3\xfe\x62\x8f\x41\xf1\x08\x8e\xca\x05\x03\x63\x20\x67\xdc\x76\xc9\xa1\x9e\x57\xe3\x81\x9e\x9b\xfd\x6e\xb7\x7f\xc5\x5a\x37\xf7\x58\x79\x47\xf2\xee\xd4\x80\x5e\x0a\x84\x8c\x56\xfa\x90\x5d\x1b\x90\xca\x71\x4f\xf4\x58\x50\x3d\xa1\x01\x7f\x0a\x7e\x17\x17\x5b\x83\xf1\xe4\x3b\x38\x5c\x86\x5f\xc1\x3a\xb5\xd3\x44\x4e\x05\xf4\x30\xc3\xcb\x34\xfb\x42\xfe\x04\x38\x5e\xd2\xa4\xa3\x06\x8a\x01\x5d\xbb\xd8\x99\x57\xe4\xc6\x1d\xa4\x23\x43\x9f\x7b\xa4\x77\xc5\xed\x2f\x9f\xe2\xaf\xff\x71\xb6\xf8\xeb\x91\x72\x5a\xf3\x62\x46\x89\xc5\x6a\xbc\x2b\xc1\xb7\x17\x1b\x36\x52\xd7\x8b\x4e\xaf\x09\x52\x14\x70\x50\xee\xb1\x0d\xa6\x04\xc5\xba\xa7\xba\x98\xb2\x15\x17\x9c\xa2\xc4\x39\xee\xb6\xb5\x6f\x88\x39\x66\xd7\x37\xc6\x82\xa5\x3b\x1d\x0c\xba\x79\x1b\x8d\x6f\x05\x43\x54\x10\xaf\x41\xa6\xfa\xaf\xa3\x36\xfa\x4e\xd6\xcd\x46\x99\xe3\x0b\xa6\x11\xe3\x73\x63\x9c\x77\xd6\x7f\xf9\xd3\xd7\x1b\x8d\xc1\x78\xc3\xcc\xe5\x82\x95\xd1\xaf\x16\x1c\x92\x51\x3a\x3f\x08\xc3\x96\x25\xa2\x9f\x2c\x50\x8e\xe9\xd5\xc6\xa7\xe5\xfc\x6f\xd5\xdd\x07\xb9\xca\x23\xf4\xbb\x3b\x61\xf9\x58\x07\xb4\xf8\xac\xb2\x40\x8a\x73\x1f\x01\x1e\x01\x9d\xa0\x62\xde\xf5\x8c\xe6\xad\xb6\x9d\xfd\xa5\xc8\x8c\xa5\x69\xcc\x0c\x48\x2e\xb8\x7c\xdd\xc0\x0f\x8f\x09\x7c\x82\x19\x7c\x5a\xc8\x63\xcf\x3c\xab\x21\x8f\xef\xb4\xac\x62\x0f\x53\x12\x98\x65\xf1\xd9\x68\xdd\xa9\xd5\xf5\xd6\xba\x9a\x2e\xd3\xf9\x92\x1e\x75\xfe\x29\xb3\xc2\xe6\x55\x41\xa0\x38\xb1\xd2\xff\x62\xde\xd0\xd7\xb5\xc9\x22\x40\x09\x4d\x6e\xd6\x5f\x32\x6e\x9c\xd1\x32\x4a\x15\x70\xd4\x18\x0f\x3a\xa0\xd6\x75\xa0\x83\x89\x39\x66\xca\xb6\xe0\x81\x8e\xdf\xdc\xe9\x5c\x63\xe1\xf1\x62\xa5\xc4\x77\xfb\x94\xbd\xd2\x91\x0f\x92\x29\x98\xff\x60\x1c\xbd\x6a\xea\x07\x7d\x48\x28\xa4\x84\x03\x58\x0b\x25\x07\xc0\xf8\xcd\xa7\x21\x8f\x27\x4b\x31\x80\xfd\x09\xbe\x6b\xce\x3f\x42\x10\x5f\xed\x6c\xfd\x74\x67\xc0\xaa\xcc\xc8\xba\x43\x46\x86\x52\x85\x91\xcb\x63\x7a\x44\xbe\xc8\x5e\xe2\x01\x34\xce\x1b\xc4\x35\xce\x88\x7e\xc3\x41\xec\xc7\xa3\xf7\xd9\x41\x9f\xdd\xf5\x37\xae\x2a\x4b\x11\xe6\x1f\xf1\x7c\xfc\x59\xd5\x63\x15\x1a\xe0\x1f\x1c\x2a\x7c\x6b\xc3\x0a\xd4\x90\x2a\x8a\x00\xce\x40\xa3\x49\x71\x34\x1f\x17\xa3\xfe\x8e\xa5\xab\xa1\x67\x7a\x35\x83\x8b\xd8\x39\xdd\x48\xed\xed\x7e\xbf\x60\x57\x1d\x19\x46\x3c\xd9\x22\x9e\x3a\xae\x23\x03\xa1\x8d\x0e\x09\x41\x36\x88\xa9\x01\x71\x46\x75\x87\xfc\x04\x88\x5d\xcd\x1e\x0c\xa9\xed\x8d\xec\x40\x3e\xb2\x25\xa3\x95\x73\x7e\xf4\x57\x00\xaa\x6b\x77\x84\x48\xd8\x5a\xf9\x8e\xe8\x71\x5d\xac\x07\xf0\x3e\xe4\xc6\xc0\x0a\xd8\x3a\xed\xd4\x14\xc1\x9c\x28\xfe\x63\xa5\xcf\xf4\x77\xeb\x5e\x5c\xe8\x51\x3a\xa9\x40\x9c\xda\x71\xe5\xd1\x01\x90\x7b\xcf\xd2\x10\x53\x7e\x45\xda\x32\x58\x67\x7d\x6a\xf4\xbb\x5a\xc6\xae\xb8\x89\xba\x86\x70\xbb\xae\xa1\xcb\x77\x12\xd8\x70\xc0\xda\xd0\xf2\xdb\xfa\x26\x26\xed\xdb\x53\x8a\xf5\x99\x85\x62\x67\xb4\x8c\xa9\x5a\xea\x17\xb7\x48\xa5\x12\x1c\x86\x3b\x77\x1d\xa1\x86\x22\x28\xa3\x86\xf0\x3c\x13\x9c\xf8\x29\x89\x6c\xec\xa8\xe9\xc5\xa4\xa3\x9d\x6d\x7e\x83\x6d\xc6\x27\x4e\xa9\x6c\x57\x48\xf7\x6f\x97\xc0\x4b\xfa\xaf\xa6\x35\xc1\x21\x19\xc0\x40\x3d\x59\xa1\x38\x05\x4c\x73\xb1\xcc\xa8\xc7\x19\x60\xa4\x73\x34\x09\x8c\x8a\x5c\x44\xf7\xfe\xe5\xa3\x92\xce\x8e\x7d\x67\x88\xe8\xcc\x50\xfc\x9b\x11\x97\x7d\x5a\x67\x8a\x95\xf9\x93\x38\x53\xe2\x07\xf4\x01\x67\x31\x63\x99\x87\x38\x39\x03\x49\x83\x61\x8e\xc6\x1f\x08\x40\xd6\xeb\x94\x0f\x62\x52\x8d\x39\xdd\x8b\x3c\x1c\x6c\x51\x10\x98\xf4\xd4\x78\xcb\x9e\x90\x69\x81\xd4\xbf\xa2\x5a\x9a\x9c\xea\x1a\xfd\xe1\x54\x0a\x2f\x3d\x26\x07\xc6\x3f\xf2\x88\xcf\x2a\xc3\xaf\x49\x28\x33\x6b\xe2\xe0\x1a\x0e\x9d\x30\x29\x8e\x7e\x3e\xe7\x57\x52\x7a\x15\xeb\x70\x5a\x55\x34\x10\x13\x38\x45\x47\x70\x09\x68\x25\x45\x53\x82\xd2\xfc\x5c\xa2\xf9\x66\xac\xc6\xb2\x06\x4e\x5c\xa7\xe8\xbb\xf0\x40\x5f\x0d\x8f\xc0\xa2\x82\xd3\xa9\x8b\x3d\x26\x48\xef\x10\x82\x53\x3a\x88\xfc\xf8\x3e\xd1\xcc\xac\xfd\x3b\x3c\x3a\xb8\xf2\x9c\x38\x6c\xcd\x90\xd5\xce\x14\xee\x20\x9d\x6f\xba\xce\x2d\xcf\x8f\xb0\xc8\x7a\xa1\xef\x60\x2d\x9a\x5e\xd1\xb9\xcb\xba\x13\x6a\xcf\x16\x71\x27\x04\x49\xf3\x14\x4e\x84\x1a\x85\xad\xec\x46\x28\x8a\x56\x38\x02\x68\x64\x9e\xb1\xe7\x59\xe8\xfb\xdf\x68\xf7\x42\x8f\x47\xfe\x08\x39\xae\x7a\xd7\x2a\xe0\xde\xdd\xa9\x2a\x42\xfe\x5d\x2e\xb7\xc2\x55\xef\xd9\x1b\x66\xa0\x12\x04\x6c\xe5\xda\x28\x0a\xf6\xed\xf4\x9c\x7f\xab\x43\x1a\xd8\x0a\x1c\x72\x3b\x14\x95\x09\x11\x10\x87\x8d\x2b\x21\x85\xc9\x61\xa2\xdc\x69\x0f\x24\x0f\x43\x4c\x6c\x5b\xc1\xd3\x11\xbd\xa4\x12\xc1\x36\x66\x0c\x0e\xde\x61\x41\x4e\x3c\x03\x3d\x2b\x1b\xfd\xcc\x1a\x40\xcb\x94\x52\xca\x09\x76\x1f\x7a\xb9\x18\x0d\xfb\xbd\xad\x57\xd8\xbf\x96\xdd\x7c\x6c\x92\xbf\x57\x5f\x7e\x81\x1b\x24\x86\xb7\x44\x0b\x33\xe9\xd6\x3d\xd5\x2b\xb1\x99\x8c\x7d\x9e\xb2\x9e\x74\xd7\x29\x08\x25\xd2\x05\x1e\xc1\xcb\xa9\x4e\x47\xe5\x67\x97\xb9\xe3\xe9\x92\xe1\x3c\x28\x39\x95\x55\xa0\xe9\x60\x48\xf6\x0b\xa3\x08\x4b\xf1\xb0\xf2\x47\xbf\xc5\x7c\x21\x8a\xb9\xf4\x40\x1e\xd2\x5a\xea\x04\x68\x33\x3f\x4c\xe9\xd0\x50\xf4\xf2\x35\xa0\x88\xae\x44\xdb\xce\x3e\x5d\x4a\x47\x43\xfd\xc0\x81\x1d\xaf\x69\x07\x44\xf1\x8d\x06\xbc\x5f\xdb\x1c\x9d\xdf\x49\xbc\xc7\xd3\x7f\xcc\x96\x22\x66\xc5\x8e\xc5\x36\x17\x37\xbd\xc8\x34\x56\xcc\x74\x5e\x2a\xf0\xa9\xbd\xc8\x3b\x82\x9f\x86\x7b\xbc\x9f\x46\x25\xdc\xe0\x2d\x7a\x08\x5c\xf6\x00\xe7\x49\x3a\xae\x67\x84\x9c\xe3\xb9\xfb\xc4\x5c\xce\x65\x01\x39\xb7\xcb\x87\x21\x2b\x1d\x02\x82\x2d\xd8\x7f\x4e\x1e\x8f\xfa\x52\x3d\x15\xae\x8d\xed\x0f\x20\x86\x22\x0f\x48\x37\xef\xc5\x6a\x92\xed\x63\x75\x17\x66\x21\xc4\xcb\xa9\x6f\x65\x47\x72\xf8\xde\xe2\xe3\xba\x06\x4d\x66\x9f\xc1\xdb\xeb\xf7\x34\x68\x33\x95\x21\x73\x1c\x83\x9d\x67\x78\x9b\x52\x6a\xc6\x09\xd8\xd7\x62\x60\x4d\x5a\x61\x48\x4c\x65\x95\xbe\x7f\x20\xd3\x86\xf3\xc3\x95\x80\x01\x6e\x8c\xf0\x33\x02\x91\x4e\xa1\x50\xe4\x7b\x64\x2b\xb5\x13\x91\x76\x22\xb0\x0d\x02\x10\xfc\x6f\x09\x9b\x09\x0f\x1a\xa3\xfe\x25\xf3\x26\x63\x13\x20\x09\x3b\x24\x80\xfc\x5e\x53\x58\xca\x22\x9a\xd1\x18\x6b\xcf\x6c\x9d\x07\x3c\xc7\x1c\x69\x6b\xf5\xa8\xc7\x36\xd7\x19\xa2\xfb\xbb\xf4\x43\x44\x9b\xca\xa1\x34\xf5\x44\x27\x32\x1d\x6a\x12\xdd\x64\x80\x0f\x1d\x00\xa2\x0f\x4c\x75\xa2\xef\x45\x6d\xf4\x1a\x30\xe8\x78\xdc\xdb\xc8\x7b\x1d\x52\xe8\xf0\xd2\xf0\x55\xd3\xef\x0e\x8b\x3c\x40\xee\xc1\x86\xa2\x92\xa3\x50\x7d\x44\x10\x71\x4a\x6e\xaf\x13\x47\xec\x53\x1c\xb1\x85\x40\x50\x73\x31\xdf\x08\x14\xb0\xcc\x45\xf1\x72\x78\x8e\x27\x76\x05\xcc\xcb\x7f\xe6\x1e\xb8\x41\x8f\x94\x61\x8c\xa3\xab\x78\x8a\xda\xd8\x2a\xfc\x4e\xd0\x58\xf0\xbd\x3d\x50\x84\x4f\x9f\x1c\x40\x85\x85\x4d\x91\x93\x45\x46\xad\x02\xea\xdc\xa6\x0e\x61\x84\xb3\xa7\x57\x09\xf2\x03\x1a\x73\x7f\xf4\xce\x4f\x9b\x0d\xbb\x52\x5e\x02\xc7\xb3\x29\xe3\x28\x68\x5b\xf6\x88\x43\x54\xef\x43\x4b\x85\x1c\xf1\x29\x89\x23\x84\x18\x85\x89\xb8\x56\x43\x7b\xfc\x3e\x3d\x02\x74\x8c\xd2\xf6\x21\x89\x8d\xee\x94\xf9\x84\x7f\x4f\x64\x0d\xa9\xbf\x76\x0a\xd4\xdd\x82\x4e\x04\x59\x19\x45\x72\x6b\x74\xa8\x58\x0f\x7d\x57\x7a\xe7\xde\x61\x3e\x13\x35\x4b\xc3\x38\x64\xdf\xb7\xe1\xd4\x87\x28\xf7\x72\x72\x02\xa5\x85\xd2\x9a\x1a\x37\x0b\x61\x98\x5a\xa8\xf3\x96\xc0\x84\xa2\x54\x26\x7f\x51\xa1\x04\xd9\x14\x78\x4e\x2b\x2a\x4f\x2c\x61\xb5\xcf\x41\x93\x56\xfd\x54\x16\xd1\x57\xe6\x40\xa2\x9b\xf0\x56\x1a\x1f\x71\x05\x89\xb9\xfe\x28\x16\xcc\xb6\x9a\xe0\x4c\x64\x1c\xf9\xbc\x0a\x72\x14\xe4\x10\x79\x40\x91\xfc\x62\x77\x56\xa7\xd8\xfa\xd4\xb5\xe2\xac\xb2\xcb\xc5\xc0\xb7\x90\x98\x27\x18\x0f\x8e\xfb\xa1\x14\x43\x1c\x44\x16\xcb\xc9\x1a\x46\xde\x7b\x10\x1a\xc9\xa4\x66\xd0\x29\x6f\xc1\xba\xd0\x07\xfc\x53\x8d\x97\x3c\xf7\xd2\xe6\x07\xe6\x93\xb4\xb5\x09\xc5\x02\x0e\x95\xb2\xa3\x5a\xd9\x15\xb4\x1d\x8b\xf2\x70\xc0\xe1\x79\xce\x39\xd3\xc4\xc9\x33\xe5\x1f\x20\x58\xf4\x4b\x23\xb6\xfc\x3f\xe5\x1f\x0c\xa6\xff\x83\x12\x65\xf6\x6d\xc2\x02\x71\x35\x78\xc6\xa6\x9d\x08\xb7\x1b\x77\xef\xf7\xa1\xcb\xb0\xc3\x7e\x37\xc9\xae\x11\x51\x38\xf9\x59\x97\x83\x6e\x8e\xa8\x4f\x16\x53\x3d\x95\x1b\x4f\xaf\x64\xc2\x97\x8c\xe8\xec\x3a\x2a\x4d\x57\x06\xd5\xc6\xbb\x60\xd1\xbf\xd8\x60\x37\xac\x7b\xbe\xef\x52\x43\xf9\xd1\x2d\x74\xb3\x77\x7e\x91\x12\xa1\xf2\x27\xcc\x28\xf2\xb1\xe8\xab\x95\x57\x62\xcd\x28\xe5\x3e\x65\x79\xc5\xf0\x3b\x74\x6f\x00\xe7\x61\xda\xff\x8c\x1d\x62\xd8\x9a\xa0\xef\x1c\x0e\x95\xdc\x72\xe4\x49\xd9\x2b\x6f\x36\x2e\xe7\x45\xbe\x91\x77\x91\x2d\xbd\x87\x98\x72\x2a\xfe\x42\x06\x01\xe2\x57\xf8\xe8\xe4\xe2\x41\xda\x4b\xda\x86\x19\x2e\xd6\xcf\x8c\xf3\x64\x98\x75\x12\x08\xa9\x3f\xf3\x4a\xf9\x27\x27\x86\x99\xf1\x4d\xb3\x57\xea\x32\x96\x87\xa3\x42\xc6\xf1\x36\x30\xd6\x94\x8d\xd3\x52\x9d\xda\x4c\x9c\x62\x1a\xb1\x59\xb2\x56\x5a\x96\x39\x20\x59\x18\xd9\xc0\x1e\x33\x81\x62\x3c\xb8\x28\x6f\x8c\x8b\x74\x54\xab\x87\x44\xe9\x72\x30\xcf\x29\xbf\x91\x18\x02\xf7\xbc\xd0\x19\x6c\xad\xe6\x66\xdf\x49\x53\x65\x24\xd9\xfa\xfc\xee\xf3\x8d\x76\xb7\xdf\x73\xa0\x13\xd7\x4a\x70\x12\xe0\x48\x6e\xc6\x72\xfa\x6a\xc2\x62\x8b\x4d\x3d\x14\xa6\x05\xba\xb9\x38\x45\xb6\x9b\x08\x8e\x31\x7d\xe5\x99\x06\x6e\x9f\x1c\x8c\xbe\x56\x8b\x56\xc9\x73\xab\x57\x8f\x7d\x28\x71\xe1\xd7\xd5\x8d\xf2\xfe\xa9\x55\x05\xf6\x22\x3d\x30\xe5\x1c\x58\x30\x63\x6f\xee\x0e\x31\xe3\xe4\x75\x7b\x57\x4e\x6a\x9f\x9c\x7b\x29\xa0\x9e\x75\x83\xe6\x27\x74\xdb\xf3\xc0\xbf\x9c\xd2\x9b\x25\xdc\xf3\xb5\x73\xa5\x41\xbc\x86\x9f\xa0\x56\x82\xab\x93\x80\x3f\x6d\xe5\xa3\x7c\xab\x07\x99\x1e\x5c\x8a\xd9\xdb\x9c\x51\x83\x8f\x1d\xf2\xa4\x73\xb5\x05\xf3\x50\x9b\xb6\x47\xa3\x9b\xb7\x0d\x27\x6c\x10\x09\xc0\xec\x47\xb8\xc1\x27\x88\x3b\xf8\x43\xfd\x90\xd6\x70\x78\xa4\x7b\xe2\x0e\xd2\x8e\x41\x4d\xbf\xc0\xff\xf0\x5f\x2b\xad\xcc\xda\x34\x24\x4d\xe6\x24\xa1\xde\xe0\x0a\xd8\x6f\xe5\xbd\x1c\x5d\x94\x29\x71\xf9\x94\x48\x54\xf9\x24\xe0\x3f\xad\x12\x21\x0e\x0d\x3a\x2d\x89\x92\xfe\xec\x8c\x24\x7b\x4c\xbd\x75\xc1\x1d\x4a\x06\x07\x82\x3d\x5f\xbc\xa8\x81\xbb\x4e\xb6\x99\x8e\xbb\xe2\x38\x46\xd5\x31\xd8\x3f\xec\x29\xf1\x0d\x41\x3e\x3e\xae\xcb\x60\x08\xf5\xb8\x87\xee\x32\xb7\x08\x2b\x30\x67\xa8\xbf\x12\x84\xfc\x22\xdb\xe9\x5f\xce\x92\xb4\x77\xd5\x1c\xd4\x4e\x7f\x94\x9d\x1b\x0d\xd3\xf6\xa5\xbc\xb7\x65\xfe\xde\xcc\x86\x59\xcf\xf0\x38\xc9\x68\x3b\x1d\x25\xbd\x7e\x62\x5e\xf3\x56\x36\x4c\xd0\x79\x0d\x12\xe1\x8d\xb6\x33\xee\x26\x43\xe7\xe0\xaf\x7c\x19\x64\xe7\xcf\xc9\x31\x92\x1c\x05\x29\xa4\xdb\xa5\xe2\x08\x53\xb0\x3e\x47\xda\xbd\xe7\x65\x98\xb4\xd3\x19\x06\x96\x88\x20\x95\x87\xdf\xd0\xf2\xa2\x5e\x0a\xe7\x8a\x3b\x1f\xa7\xb8\xf4\xfd\x9d\x7c\xb1\x4d\xe9\xaa\x9b\x32\x09\x2a\x51\x8a\xab\xbd\x76\x45\x8d\x62\xde\xe4\x5d\x0a\x06\x39\xc1\x74\x3d\x88\xc2\x9c\x7f\x62\xe3\x0a\x44\x31\xa0\x4b\xdc\x57\x04\x0c\x14\xf7\x3a\xb7\xe9\x3e\x00\x73\xa5\x1f\x60\x8b\x3f\xe2\x9b\x7e\x82\xac\x22\x2e\x10\x5c\x1a\x0c\x4a\x29\xa2\x48\xc7\xfa\xb7\x19\xa0\x6a\x6f\x73\x00\x7b\x7f\xb3\x85\x40\x46\xfc\x7e\xd4\xbb\x5c\x9c\x6e\xa7\x06\xc1\x9f\x90\x24\xaa\xe2\x5b\x3c\xfe\x95\x02\xf0\xa9\x3b\x9c\x0c\x98\x0e\xbc\xe4\x7e\x44\xb4\x6b\xb2\xa2\x00\xd9\x6f\x2e\x70\xc1\x8b\x33\x1c\x09\x79\xe0\x7d\x5f\x17\xbc\xff\xa1\x51\x82\x28\x50\xe3\x79\x6e\xac\xd3\xdf\x42\x7f\xbc\x5e\x06\x3e\x11\x63\x48\x1b\xf4\xcd\x5c\x95\x35\x90\xb0\x9e\x6a\x36\xbb\xbb\x0d\x2e\x6f\xe2\x17\x27\x00\x52\x6d\xeb\x9b\x40\xce\x1a\xd5\xa8\x92\xe0\xb8\x0e\x01\x39\x7e\xd1\x63\x21\x80\x77\x48\x36\xba\xe3\xcc\xd0\x3d\xaf\x40\x4a\x79\xcc\x2c\x84\x9d\x8e\x90\x90\x24\x14\x42\x37\x9f\x3a\x16\x90\xbb\x34\x89\x96\xdb\x97\xf9\xc0\x8a\xc6\x9e\xec\x6e\x5f\x4f\xbc\x9f\xa7\xe8\x8a\x05\xdf\xb9\x3c\xcc\x2f\xbc\xf1\xd3\x0b\xda\x72\x24\x86\x83\xd0\x31\x40\x27\x6c\xe2\x72\x22\x36\x2d\x2d\x78\xdf\xca\x3a\xcc\xc9\xee\xe4\x45\x41\x92\x6b\x2f\x07\x30\x71\x09\x0d\x4e\x9c\x5b\xfc\x84\xfd\x77\x09\x70\x9e\x52\xd0\x6b\x65\xda\x85\x50\x2f\x53\xba\xc4\x53\x10\x36\xbd\x24\xeb\x54\xfd\xbe\x30\xe9\x95\x17\xda\xc0\x3e\xf7\x75\x4e\xc2\xd6\xcb\xba\xe2\x8c\xc3\xa9\xe6\x80\xf7\xc6\x7a\x12\x6e\xad\xe2\x26\x1f\x14\xe0\xe1\x49\x44\x2c\x01\x91\xf3\x13\xf2\x90\x67\xe4\x48\x6c\x91\x07\x6e\x28\xac\x22\xee\x32\x8f\x86\xbe\x57\xf9\xc3\x99\x62\x9a\x30\x09\x74\x91\x75\x37\x17\xd6\x39\x58\x85\x55\x5b\x63\xfb\x89\x75\x30\xb8\xa7\x22\x9a\x58\x30\x0e\xe2\x38\x40\x58\x1c\x5c\x35\x18\xb4\x77\xa9\x06\xaa\x5d\x03\xad\xd9\x0c\x1a\xc2\x96\xd4\x50\x2e\x58\x4e\x07\xf4\xff\xe7\x27\x9f\x9f\x7b\x4d\x6e\xe7\xb5\xd1\xb0\x0b\x7f\xd9\xf4\xe4\xe1\x78\xf0\xfa\xcc\x80\x04\xaa\xa1\xbe\x2b\x32\x7d\x63\xdc\xbb\x22\x61\x73\xfb\xf4\x6a\xd0\x4f\x4a\xf2\x0a\x97\x1c\x2e\x64\x76\xc4\xed\x1e\x78\x3f\x8e\x21\x77\xdb\x10\x23\x8b\xe6\xd6\x55\x0d\x23\x70\xa6\x81\xcf\xb6\x39\xc7\x06\xb5\xbd\x57\xfd\xb8\xdf\xa0\x5a\x4c\x15\xf6\xba\x01\xf6\x04\x42\x00\x5f\x11\x98\xce\x34\x7f\x6a\x76\xfb\xab\x71\xde\xbe\xd4\xda\x1a\xe7\x90\x9a\xe1\x0b\x96\x65\x60\xa7\x20\x54\x99\x6b\x3c\x64\xad\x9b\x24\x70\x9e\xb1\x84\x31\xda\xce\x0b\xc6\x69\x5f\x84\x92\xc4\x22\x06\x4b\x25\xd5\x42\x3e\xb8\xdd\xdf\xd9\x49\x7b\x9d\x05\xda\xdf\x3a\x94\x1c\x06\x2a\x95\xe2\xcc\xc1\xe2\x12\xb8\xc0\x0f\xc6\x10\x43\x0c\xcc\x93\x12\x40\xfc\x8c\x17\xe1\x6b\x26\xbb\xfd\xf7\x9c\x17\xb7\x66\x0e\x08\xeb\x75\x2c\xa7\x2e\x8c\x99\x6a\x9d\x13\x28\xcc\x6a\x17\x6f\xe7\x37\xa2\x29\x25\x45\x06\x8d\xf6\x18\x6a\x02\x35\x28\xbf\xc6\x17\x70\x5b\x8d\x0a\x03\xdb\x18\x0d\x33\x74\x11\x25\x02\x04\x37\xb9\x99\x77\x21\x25\x01\x07\x49\x40\x25\x94\x51\xba\x05\xbe\xc0\xe8\xbe\x36\xbf\x61\x9d\x40\x25\x4a\xc2\x05\x93\x00\x3b\xf5\x68\x7e\x93\xa7\xc9\x0a\x37\xd1\xb4\x61\x06\x29\xc8\x53\x98\xfe\x96\xf2\x52\x5f\xa3\x17\xe7\x4d\xed\xc5\x80\xb5\xaa\x56\xaa\x51\xd5\x4d\x37\xb2\xae\x37\xec\x8e\xc1\x9e\xc5\xc8\xc0\x62\xc1\x1a\x1f\xb0\x1c\x36\xda\x18\xbf\x5e\xd0\x31\x1c\x13\x1a\xc0\xb4\x10\xdd\x2c\x2d\x24\xd0\x02\x65\x10\x60\xf6\xc0\xf1\x78\x98\x5e\x31\x1c\x92\x99\x98\x98\x56\x54\x81\xd0\x17\x03\xe2\x54\xab\xed\x73\x0e\x8b\x22\xf2\x8c\xdf\x30\xb1\x1d\x76\xbd\xef\x99\xd5\xf7\x25\x2a\x25\x32\x1e\xd0\xc3\x94\xb0\xde\x7d\x17\x6a\x55\x4a\xc4\x8d\x75\x06\x86\xdb\xc2\x0e\x90\x46\xa4\x0b\x92\xb6\x02\x21\x11\xe1\xf8\x7c\x3e\x26\x50\xd4\x89\x01\x67\x80\x94\x91\x8c\x92\x5e\x01\x04\x5f\x47\xbd\xa2\xf1\xf7\x58\x4c\x42\x7b\x8c\x36\x1a\x59\x07\x62\x53\x9a\x58\xe8\x2d\xef\x66\x5e\x81\x39\x5e\x83\xb4\x21\x17\x56\x6e\xe6\x5c\x56\x9f\xc8\x0b\x0b\x9a\xc3\x7f\xb8\xf1\x9f\x4b\x4a\xc6\x84\xb1\x2d\x3e\xfa\x08\x3a\x0d\x86\x19\x1e\x39\x79\x2e\x16\x12\x9b\x61\x0f\xbe\xea\x5d\x7d\x20\x5d\xdb\x69\x0f\x03\x80\x60\x5a\x48\xa9\x02\x4c\x1b\xce\x5f\xac\x57\xa8\x3c\xf3\xdf\xd1\x15\xe9\x0c\xcb\x73\x9b\xfc\xd1\xe9\xa0\x6c\xee\x7a\x6f\xa3\x88\x28\x6d\x2c\x45\x38\xbe\xcb\x96\xf2\xdb\xe0\x82\x65\x90\x9d\xb1\x41\x5e\x1b\x59\xcb\x2c\x3c\x15\xb1\xf4\xff\xea\x8f\x13\xf8\x3d\xd9\xc8\x40\x28\x4c\x13\xfa\x1d\x92\xaa\xef\xa4\x97\xcc\x6f\xc3\x64\x30\xec\x0f\xfa\x45\x96\xf0\x79\xc1\x27\x58\x49\x02\x2b\x91\xa1\x91\x13\xd8\xc8\x36\x41\x0b\x01\x3f\x69\xb3\x1a\x1b\x63\xf8\xe5\xd7\xa9\x4e\xee\xaa\xc0\xb7\x9a\xb3\x2b\x25\x13\x94\x93\xd7\x65\x7e\x51\xee\xbb\x13\x0a\x74\xe3\xb1\xa3\xd8\x86\x7c\xae\x57\x86\xf9\x48\x2c\x94\xeb\x0b\x43\xe2\x94\xc9\xcd\xb3\xb2\x9d\x70\xfe\x2e\x51\x09\xfb\x8e\x59\x1c\x65\x55\x06\x11\x68\xbc\x43\x60\x66\x1e\xd9\x84\x08\x4c\x4d\x30\xf5\xb3\x53\xe4\x55\x77\xcb\x71\x32\xb8\x65\x61\x6a\xfe\xde\xfc\x46\xc2\xd0\x76\x5a\x24\xe0\x02\x93\x50\x8b\x4e\xc2\x4d\x20\x46\xe3\xea\x33\xf6\x35\x82\xfc\x85\x19\xe6\xe4\x4d\x4e\xd8\x94\xa9\xf5\xfe\xea\x89\x42\x2a\x50\x35\xbf\xd5\x2b\xaf\x5f\xe8\x27\x46\x40\x48\x3a\x39\x78\x36\x1b\x24\xb7\x96\xfc\x23\x00\x14\x08\x45\x49\x3e\x4a\x0c\x31\x30\x20\x64\xe6\x4f\x5e\x68\x26\xa6\xed\x90\xb5\x16\xba\xc3\x56\x9f\xa0\x2a\x33\x0b\xdf\xca\x7b\x3d\x50\x61\xf4\x37\xf1\x87\xcd\x3c\xeb\x76\xd4\x20\x1b\x69\xfb\x92\x11\x87\xda\x99\x5d\x0d\x70\x6a\x78\xac\xea\x95\xb6\xb3\x6e\x0b\x03\xda\x88\x7b\x95\xb8\x05\x69\x80\x98\xdd\x21\x00\x20\x53\x87\x18\x7e\xc6\x6c\x73\x2d\x02\x00\x67\x8d\xd1\xce\x20\xe2\xbb\x68\x8e\xfe\x85\x97\xe5\x60\x5e\x79\x56\x75\x88\xb6\x7d\xd6\x61\xbc\x0e\xa6\xfb\x0a\xe3\x05\x74\x9b\x78\xdc\x95\x6e\xc1\x3b\xda\xa1\xac\x2d\xc4\xa7\xfd\xa8\x03\xe7\x96\x48\x5d\x99\xc4\xe0\xaa\xac\xd7\x31\xf0\x00\x5f\x87\x39\xfe\xac\x2e\x95\x87\xa0\x5b\xe9\x5e\x35\x14\x83\x9e\x13\x23\x0a\xce\xe6\x22\x9f\xe5\xbe\x58\xe3\x2f\x52\x2c\x35\x3e\x07\x67\x70\x06\xd3\xc1\x89\xa1\x87\x3e\xb8\xc9\x1c\xef\x26\xe3\xe3\x2f\x06\x2c\xc4\x86\x60\xbe\x71\x2f\x37\x8a\xc1\x2f\x84\x7b\x68\xb1\x08\x16\xc0\xca\x9a\x7f\x25\x40\xff\x13\xae\x55\xd9\xd4\x34\x47\x22\x37\x31\x24\x8a\x19\x58\xeb\x28\x1a\x29\x0f\xc6\x5c\x81\x3e\x9a\x48\x08\x4c\xf8\x14\x98\x34\x6c\x64\xc2\xa9\xb1\xa6\xc4\x29\x33\xeb\x69\xa6\x5f\xc5\x8e\x06\x16\x56\xaa\x0b\x3a\xd0\xab\xc4\x79\x16\x5a\x8b\xc8\xa1\x88\x0b\xbc\xca\x54\x71\xb0\x9a\xc8\xd9\xa9\x9d\xce\x3e\x46\xe0\x35\x53\xc2\x09\x3f\xe9\x8d\x86\x57\x09\xa7\xe4\xa4\x2f\x1c\xa4\x10\x9a\x92\x80\x30\x9c\x98\x5b\x48\x91\x06\x24\x66\xdf\xfa\x39\x53\x63\xf3\xd9\xd5\xa8\xad\x62\x0e\x9c\xc5\x76\x59\xbf\x80\x2f\x9d\xbe\xf1\x8c\x05\x00\x2f\x6e\x1b\xb0\xc1\xca\xa3\x23\xf9\x81\x12\x03\x46\x5c\x21\x95\xa7\x9c\x9d\xcc\x41\xe3\x1b\xd4\x97\x98\xdd\x24\xdc\x3c\xd4\x90\x16\xb2\xe5\xba\x69\x08\x79\x74\x5a\x57\xb6\xd5\xa4\x84\x85\xd9\x59\xcf\x21\x62\x6e\x9b\x14\xb9\x81\x23\x9c\x19\x81\xd6\xfc\xc2\xfd\x9a\x8b\x0d\x21\xaf\x75\x8d\x64\x95\x6c\x67\xc3\x0c\xbd\x30\xcd\xd3\x2b\xb2\x2c\xb9\x02\x8a\x5d\xa0\x61\xfe\x24\xe6\x89\xc8\x13\x22\x8c\x29\x6f\x65\x2b\xcd\x7b\xee\x29\x99\x41\x0c\x1a\x1e\x22\xf9\x33\x1b\x55\x04\xde\xdf\x67\x08\x80\xff\x62\x99\x46\xdf\xbb\xf1\x6f\x0b\x8e\xe6\xf2\x78\x35\x80\x87\x20\x97\xb5\x15\x3b\x2b\xb8\xd9\xad\x17\xeb\x60\xf5\x5b\x1c\x9b\x24\x74\xad\x5a\x0b\x60\xe6\xe3\xda\x17\xe6\x41\xc5\x09\x61\x8c\x25\xda\xd7\x4c\x79\x8e\x3c\xd0\x5c\x9e\x1c\x4a\x35\xa0\xc8\x42\x31\xde\x30\x40\xaa\x90\xbd\xad\xe8\x86\x4c\xc4\x61\xa9\xca\x83\x29\xdc\xc2\x89\x1f\x70\xd9\x96\xf7\x2d\xe2\xeb\x7e\x52\xcb\x10\x53\x25\xc0\x95\xd7\xab\xa7\x82\xa9\x71\xe1\xf5\xec\xb6\x19\x1d\x89\x8d\x88\x44\xcd\x1a\xd1\x48\x3e\x57\x12\x61\x8b\x94\x4b\xaa\x14\x28\xf9\x23\x4d\x37\xd1\x15\xcd\x06\xf9\xd9\xdf\x41\x5d\x0b\x84\xdd\x26\xb2\xb6\x5f\x76\x24\x33\x19\x70\x98\x7e\xfa\x31\x69\x42\x14\xf5\x33\x3a\x71\xfb\x2b\xa7\x6b\x87\x72\x30\x27\x94\xf6\xdc\x7e\x32\x64\x42\x2a\xe4\x81\x1e\x7f\xdf\xa6\x13\xc7\x0a\xe4\x2a\x87\xda\x93\x52\xea\x1a\x4f\x54\x93\x66\x55\xa4\x54\x1f\x01\x11\xc1\x77\x0b\xc1\xc8\x46\x82\x78\xaf\x5b\xb5\x8d\x54\x39\x6c\xc9\x40\xc0\xdf\x7b\xe6\x1f\xe9\x15\x8c\x6d\x25\x57\x2b\xb8\x06\x33\xab\x06\x34\x3b\xbe\xc0\x09\x7a\x06\x55\x66\x57\x8d\x03\xeb\x93\xed\xa6\x3b\x41\x9d\x25\xbf\x8f\x0b\xf0\x8e\xf7\x68\x77\x0d\x9e\xe9\xe8\x3e\x7f\x2c\xfd\xb4\xc8\xec\xcd\xfb\x5b\x2b\x85\xab\xde\x86\xc3\x80\x62\xed\x99\xd2\x4e\x85\xb1\x9c\xd5\x3d\xb9\x4e\x9e\x66\x6c\x16\x1b\x81\x95\x63\xfe\x09\xba\x01\x44\xef\xb5\xbc\x2b\xb1\x37\x91\x58\x05\x0b\x3f\xf3\x9b\x6a\x1a\x07\x1f\x16\xd0\x8e\xad\xb2\x25\x6c\xd6\x1a\x74\x0d\xf7\x1b\x94\x2e\x38\xd6\x5c\x8b\xb7\x08\x19\xbb\xb2\x94\x63\x91\xc7\xa4\x3d\x8d\x2e\x25\xfa\x8b\x26\x3b\xce\x54\xd1\x02\x32\x4d\x98\x50\xd2\x09\x32\x33\x6d\x70\x9a\x7f\xea\xdc\xb9\x2a\xc0\x1e\x4e\x93\xf7\x36\xfb\x40\x9b\x0d\x2d\x06\xee\xe2\x3f\xaf\xfd\xbf\x23\x34\x69\xd2\x53\x48\xae\x66\xa3\x66\x02\x52\x6a\x1b\x6d\x25\x40\x08\xd9\x78\x79\xe6\x6d\xc3\x21\xbe\x05\xad\xce\x24\x1b\xe3\xd1\x08\xc4\xd7\x0d\x10\x2d\x0c\x69\xa3\xbd\x9b\x96\x28\xc1\x42\x79\xb0\x14\xe4\x87\x4e\x66\xf0\x0d\x10\xe2\x0c\x04\x5e\x23\x20\x34\xeb\x56\x55\x67\xb0\x5e\x7e\x6c\x63\x30\xa7\x7f\x1e\x77\x10\x85\x78\x9f\x6b\x80\x4f\xeb\x8f\x43\x88\x98\xd3\x83\xfc\x3d\x2a\xf7\x61\x57\xf0\x1b\x9d\x4b\x22\x1d\x1c\x47\x43\x15\x3c\x68\x50\x7c\x99\xa3\x74\x63\xfd\x6c\x87\x93\xc9\xd3\xb3\x2c\x67\xcf\xcd\x6f\x3f\x6f\x01\x04\x5e\xa3\x6d\xf6\x04\xc5\xed\x48\x33\xd6\xed\x31\x1c\x7d\x19\x02\xa6\xfe\x0c\x4c\x57\x61\x84\x95\xf6\xc8\xbe\x16\xcf\xde\x8e\x02\x65\x15\x93\xf1\x10\xf5\xc8\x2c\x6c\xa0\xe7\xe1\xa6\x52\xfb\xc6\x4d\x17\x74\xd6\xef\x78\xe2\x39\xc7\xcc\xaa\x2d\x8d\x10\x9a\x79\xb3\xd4\x62\x9c\xa5\xf3\x2a\x0b\x62\xe4\x4b\x13\xea\xad\x88\x5a\x93\x9d\x91\x1c\x91\x09\x4f\x88\x7a\xd0\x46\x20\x35\x30\x08\xf0\x91\xfd\xb0\x07\x73\xac\x33\x3d\x8c\x0e\x84\xec\x63\xdf\x7a\xef\xe7\x58\xef\x1d\xc3\xd6\x1a\xa9\x11\xd8\x6b\xec\xcd\x06\x1a\x74\x73\x01\xf5\x23\x65\x34\x0f\x7a\x16\x98\xbc\xf8\x01\xd9\xe2\x02\xe3\x4c\xb5\x65\x13\x9f\xc1\xc8\x11\xe3\x03\xf2\x57\x8b\x35\x05\x1c\x08\x4d\x1f\xcc\x6f\xb0\xc5\x79\x41\x63\x23\x3f\x98\xd5\x8b\xb8\xfd\x55\xa9\x72\xb7\x57\x03\xd1\xf1\x28\xa2\xab\xcb\xd2\xc2\x0e\xf2\xd9\x77\x18\x60\xa7\x5f\x8c\x80\xed\xc0\x68\x9e\x4f\xad\xa6\x95\xcd\x5b\xc2\x26\x51\x72\xab\x89\x58\x25\x6b\x57\x62\x47\xfa\x92\x5c\x8a\xb0\x98\xcb\xb2\x51\x00\x3b\x20\x08\xac\x9f\x7d\xf7\xc5\x8b\x85\x8f\x21\x26\x2a\x72\xeb\xdd\x1f\x5c\x34\xd2\xc7\xd9\x77\x7f\x78\xb1\x00\xc1\xa3\xd2\xbf\xb5\x99\x5e\xca\xe2\x83\x60\x5f\xe9\x80\x1a\xd7\xfe\x98\x55\xad\xfb\xe8\xd9\xbe\x87\x02\x02\x2b\xab\x95\x53\x98\xa6\x78\xef\x8f\xac\x95\x8b\xad\x29\x8b\xda\x13\xd2\xe3\x3a\xe3\x1a\xe7\x79\xf8\xae\xd3\x52\x74\xad\xd2\xa4\x37\xde\x69\xf1\x99\x9a\xd5\xd6\x9c\xa3\xc1\xb4\x1d\x3b\x26\x35\x06\x07\x83\xd1\xfa\x7b\xf6\x2f\x77\x88\x7f\x07\x02\xdc\x59\x3c\xbf\xf7\xa4\x93\x64\x7a\xa0\xd6\xaa\x64\x2c\x3d\x27\x9b\xe1\x4f\xd5\x54\xf2\xbc\x46\x83\xb4\x56\x56\xe1\x1b\x5d\xf0\xc1\xab\x76\x73\x7d\x17\x47\x26\x21\x07\x6c\x3c\xf7\xf2\x87\x4e\x39\x85\xdd\xac\xe9\x53\x0a\xfc\xc3\x3b\x38\xf7\x82\xa9\x85\xec\x88\x5b\xde\x67\x2b\x96\x5e\x54\xe0\x72\x30\xf5\x08\x8f\x1b\x6f\x98\xe1\x75\xf2\x40\x01\x67\x69\x7d\xe9\x83\xd6\xdf\x69\xfa\xd9\x92\xb1\x99\x8d\xb2\x2f\xed\x8b\xfa\xf1\x02\x40\x03\x88\x70\xbb\x33\xf2\xa4\x01\x8a\xbc\x03\xef\xca\x3c\x98\x33\x16\x3e\xf0\xaf\x57\xf0\xc1\x78\x50\x42\x9b\x92\x71\xec\x32\xc9\x60\xc3\x8b\x3c\xe5\x90\xac\xe3\x33\xad\x70\x50\x1f\x75\xc3\xc0\xbf\x05\xa5\xb6\xc7\xa6\xb2\x87\xa7\x93\xde\xf6\x4f\x39\xe7\xa0\x0f\xd9\xca\xb5\x24\x67\x17\x23\x75\xa5\x40\xd0\x03\x42\x34\x09\x9b\xd4\x38\x40\xf3\x57\xa9\xb5\x29\xc9\xa1\x51\xb9\xe7\xc5\x9d\xa2\x51\xe6\x40\x5c\xc5\x61\x59\x41\xe9\x86\x79\x25\xa5\x9a\x8b\xe3\x39\xa4\xec\xdf\xbe\x9d\xf1\x8e\x7d\x13\x64\xe6\x08\x73\xa5\xcb\xde\x22\x1a\x43\x59\x75\x7a\x99\x84\x57\xbf\x46\x5c\xc0\x0f\xea\xac\xe5\x55\x86\x89\x1a\x99\x03\x84\x93\xfb\x37\x62\x4c\x16\x34\x03\xef\x79\x60\xf1\x6a\x78\x71\xf7\xd2\x8a\x90\x61\x74\x01\x6a\x08\x0e\x7e\x3f\x3a\x81\x5a\xc3\x9b\xdf\x38\xaa\xc3\xf6\x9b\x54\xf3\xcf\xab\xcc\x48\xd1\xad\x2d\x08\x90\x59\xd2\xa3\x2e\x00\xc6\xf2\xe7\xb6\x28\x4b\xd5\x61\x3a\x12\x7e\xaa\x79\x36\xc8\x9a\x39\x8f\x78\xf5\xc7\xd7\x61\x9d\x52\xbe\x74\xfe\xa1\x94\x7b\x60\x12\x06\x14\xf8\x91\x27\xcf\x68\x9a\x35\x48\x87\xa3\xbc\x9d\x0f\x52\xa0\x5b\xe0\xeb\x77\x53\x42\xae\xc9\x6a\x8c\x3a\x17\x6e\x9f\x8e\x46\x69\x7b\x1b\x90\x99\x93\x13\xde\xf3\x7d\x5d\xfc\x8a\x15\x7e\x40\x13\x3c\x2c\x4e\x93\x38\x93\x80\x13\xcc\x26\x8e\x27\x70\x58\xee\xbf\x17\x99\xa8\x63\x5e\x32\x48\x2f\x8b\x27\xb2\xf5\x30\xed\x44\xef\x35\xc8\xae\xaf\x14\x31\xc4\x74\xab\x42\x3e\x51\x23\x3f\xf5\x32\xf8\x0e\x54\xd6\xce\xd2\xf3\x80\x4d\x6c\x27\xce\x1e\xe7\xc1\x9a\xf8\x11\x84\x3d\x25\x56\x30\xec\xbe\x07\x6f\x4f\x19\x0d\x12\xaa\xad\xeb\xf9\x9f\x2c\x59\xaa\xf5\x21\x8a\x28\x36\xfd\xb5\x40\x0d\xeb\x75\x86\x2c\x9b\xd6\x8b\x0f\xcd\xcb\xef\x1f\x6c\x81\xfe\xbb\x6e\xa0\xc1\x5b\x3d\x37\xf3\x5c\x37\x16\xba\x6c\xc8\x55\xf4\xc1\x1f\x74\xdc\x1d\xb1\x0b\x04\xe4\x97\xc6\x1e\x14\xbc\xc0\x09\x7d\x49\x4b\x20\x19\xc2\x67\x4d\xdb\x79\xb4\x0d\xe2\xc3\xa8\x6f\xd7\x85\x92\xe2\xad\x52\xe2\xe4\xdc\x22\x05\x91\xac\x25\xf5\x9b\x9e\xea\x8c\x58\x61\x1e\x4e\xce\xd0\x5a\x52\xa6\x04\xb4\xad\xcb\x3a\x20\x8d\x2a\xfc\xab\xc5\x16\x23\x03\x98\xdf\x2e\xd0\x5c\x2f\xbd\x43\xb8\x38\x08\xd9\xbc\x89\x30\x01\xce\xdd\xc0\xa9\x7e\x54\xda\xca\xe9\x2f\x69\xbe\xda\x90\xca\x17\x70\x1d\x2f\x00\x73\xdd\x61\xb2\xf9\x77\xf8\x07\x11\x4f\xbe\x42\xd6\x23\x3d\x38\x15\x44\x71\x67\xa4\x21\x04\xb8\xc8\x3d\xde\x12\x4e\xef\x98\xe3\xa7\x18\x33\x25\xb0\x9e\x8e\x47\xe4\x9f\x83\xe3\x7a\x9e\x1c\x94\x5e\x06\x5f\x20\xa1\xeb\xf8\x6f\x78\xfd\xf2\xeb\x0f\xed\xaf\x3c\xeb\x4e\x36\xdc\x12\x26\x9b\x27\xbf\xce\xc1\x64\xb3\xbf\xd1\x4c\x66\x98\xff\x66\x84\x0b\xde\x65\xba\x01\x5c\xed\xe5\x6c\x58\x48\xfd\xf6\x90\x68\xbb\x13\xc1\xb6\x51\xd5\xb5\x6b\xc0\xfa\x77\x9f\x08\x9d\x84\x7e\x19\xd4\x9e\xf9\x4e\x03\xcc\xb8\xed\x78\x51\x1b\xc5\xad\x09\x69\x2d\x67\xa1\xaf\x86\x7f\xa7\xb6\x5a\x92\xbd\x55\x70\x64\xd6\x07\x4c\x82\x11\x9e\xaa\x82\x68\xff\x9b\x00\xa7\x1f\x14\xe4\x0a\xa0\x55\x62\x19\xcb\xb0\x48\x9d\x21\x32\x34\xb8\x91\x77\xc1\x65\xc4\x45\x57\x07\x39\x28\x16\xcc\xe1\x15\xe6\x03\x3d\xa2\x8c\x4d\xe4\x94\xa4\x3b\x1b\x85\x18\x06\x8b\xde\x8d\x26\x4c\xaa\x89\x59\x92\x23\xca\x0b\x83\xb7\x33\x8c\x84\x58\x0f\x68\xb1\xca\xea\xac\xd3\x68\x1f\x52\x45\x30\x2a\xd2\x7b\x84\xee\x00\x88\xca\x6a\x2a\x37\xfb\x16\xa4\x58\x60\x13\x72\x0c\x2a\x7b\xb9\xe4\x54\x7e\x42\x65\xc6\xf8\x79\xa7\xbd\x16\xc6\xb6\xe0\xbd\x85\x99\x17\x56\xc0\x39\x11\xf7\x2b\xf3\xcf\xff\x5b\xb8\x59\xd0\xc3\x2e\xac\x3f\x6e\x97\x81\x0e\xf8\xdf\x7d\x25\xf5\xde\x60\x7f\x93\xe5\x88\x32\x36\x9e\x8c\x5c\xe7\x48\xb5\xbe\x2b\xde\xf2\x76\x11\xec\x6e\x49\xe4\xaa\xa4\x4e\x43\x21\xfb\x11\x50\xaf\x4a\x4c\x4b\x0c\x16\xbc\x07\xe8\x13\x0f\x79\x8c\x6c\xcc\x37\x7f\x1c\x9d\x9b\x53\xb5\x5f\x4e\xca\xc0\x7d\x11\x5d\x8c\x7b\x8c\x24\x71\x0c\x36\xac\xbe\x57\xe3\x3d\x1d\xc1\x1e\x74\xb8\xd1\x0c\xf9\x0b\xcd\xaf\xcb\xae\xf1\xb9\xbf\x3b\xdb\x61\x54\xec\x1e\xf3\xe3\x9a\x98\x48\xc4\x4f\xd4\xee\xc0\x26\xbb\x09\x1f\x2a\xe6\xb3\x98\xf9\xf3\x4c\x49\xea\x46\xdc\x41\x55\x40\xd8\x49\xd6\xc7\x76\xc9\x7b\x0d\xe5\x97\x59\x31\xc4\x71\xdd\xe4\x39\xe7\x03\x2c\xd9\xef\x91\xeb\xd8\x60\x8c\x91\xed\x5b\xa7\x0d\x87\x74\x80\xae\x55\xad\x36\x3c\xd2\xac\xe3\x69\x41\x20\x7f\xbf\x5e\x6a\xbf\xd5\x19\x9b\x37\x44\x94\x9b\x74\x10\xd6\x13\xdf\xd6\xf4\x0e\x17\x18\x28\x39\x2a\x53\x86\x7a\x17\xff\x6c\xc0\xfa\xbc\x9d\xa5\x68\x12\x72\x2a\xdd\x5d\xeb\x7d\xe7\x0c\x6a\x96\xdd\xac\x29\x67\xe2\xca\x25\x3b\x99\xa6\xe9\xad\x26\xce\x93\x54\x2e\x04\xdf\xda\xdc\x16\x16\xd2\x43\x68\xcb\x52\xc9\x55\x78\x50\x2c\x55\x6d\xe2\x31\x90\xba\x81\x3d\x63\x36\xf4\x26\xa5\x2b\xa6\x66\x63\xd3\xd0\x30\x25\xa5\x17\x6d\x1a\x83\xe7\xfd\xe3\xcd\x30\x61\x6b\x25\xde\xce\xb6\xb0\xb5\xf3\x79\x4a\x08\xc3\xdd\x49\xb9\x86\x1e\x06\x47\xd3\x63\x9f\xdb\x08\xf1\xbd\xda\x25\xb1\x74\x18\xa4\xf6\x4c\xd4\xc3\xb9\x91\x9c\x4b\x9e\x35\x07\x83\xff\x77\x0e\x78\x94\x73\x66\xbc\xbd\x67\x23\xb7\xe0\xa4\xc7\x2f\x96\xbc\x07\x72\x7a\x09\x73\x17\xe8\xa4\x5f\x93\x67\xf4\xf8\x51\xed\xc6\xe9\x6e\x19\x7d\x56\x15\x5c\x7a\x36\x31\xeb\xad\x0a\xc8\x1c\x63\xd2\x31\x13\xc0\xcc\xbf\xef\xd8\x3b\x9f\x71\x76\x06\xdc\x17\x95\xb2\xe2\x6c\xca\x0f\x91\x07\x9f\x28\xa2\x84\xf3\x9d\x70\x70\x1c\x47\xb9\x5f\x27\x29\x43\x4a\xca\x62\x6a\x17\x2f\x57\x26\xc5\xf9\xed\x53\x7c\x8d\x3b\xf0\x88\x46\x47\x7d\xae\xa9\x9d\xf7\x9d\x4e\x8c\xaf\xf4\xf3\x50\x34\x5d\x7e\x1a\xb5\xb7\x6c\x75\x4d\xa8\x55\x7e\xc6\x7f\x68\x0b\x92\x78\x2d\x9e\x2e\x36\xcc\xf2\xcc\x22\xce\x03\xe1\x3b\xa7\xd9\x8c\xf3\x84\xbb\xc2\x53\xd6\xa5\x16\x51\xde\x1b\x98\x54\x69\xc5\x74\x0c\xb1\x5d\xae\xfe\xf0\x16\xe4\x0b\x81\x37\xd7\xb8\x92\x5f\xca\x29\x11\x02\x9c\x28\xfc\xd5\xbc\x92\x75\xdb\x58\xe8\x7e\x59\x69\xc7\xdd\x44\x3a\x3e\xe3\xf5\xb4\xa9\x68\xa7\xca\x99\x98\x74\x62\x08\xf9\xe6\xd5\x40\x9e\x8e\xfd\x58\x06\x60\xd8\xfc\x21\x46\x27\x47\x35\xe6\x74\x42\x88\xec\xe0\xc4\x65\xc8\x7d\xd6\x7c\x70\x06\x9e\xb9\x4a\x7d\xe3\x5e\x78\x93\x16\xc9\xb8\x6b\x33\x1f\x16\x50\x5f\x73\xab\x4a\x4c\xb8\x48\x09\x3d\x95\x80\xb5\xa6\x31\xb8\x5b\x60\x09\xc2\x4f\xac\xd0\xa0\x16\x5a\x9d\x11\x8c\x74\x9b\x9a\x53\x7e\xe7\xc8\x22\x28\x6e\xa8\x7e\x09\x12\xe0\xed\xfb\xde\x92\x39\x56\x95\xb3\x20\xb0\xb3\x6e\x03\x09\xe5\x12\x12\x58\x3e\xae\x9a\x0e\x01\x96\xeb\xe8\x16\x9f\x20\xe8\x90\xdd\xa2\x7d\x45\x72\xcd\x6a\x31\x0e\x9a\x97\x8a\x2e\x17\x50\x09\x2f\xee\x66\x6f\xed\x00\x15\xa9\xc6\x30\x3a\x38\x18\x22\x2a\x98\xbf\x45\x8e\x17\x8b\xb4\xc0\xde\x21\xdb\xf6\x8e\x95\xab\x98\xf3\xf8\x70\x29\x69\x8d\xee\x13\xa6\xbb\x89\x5f\x8a\xeb\x07\x05\x52\xdb\x59\xeb\x45\x4e\x03\xe9\x2a\xba\x33\x45\x98\xdb\xcc\xf8\x06\x25\x26\x12\xd7\xba\x1a\x4a\xf2\x21\x89\x95\x14\xe4\x7f\xc7\x5a\x8a\xa6\x03\xd4\x88\x17\x2f\x3e\xcc\x73\xe1\xde\xc3\x1c\x92\x2b\xa7\x8f\xb4\x53\x15\xc1\xa3\x10\x28\xa7\x5c\x82\x68\xb7\xae\xa4\x13\x64\xca\x1b\x42\x21\x54\x61\x6c\x34\xa4\x96\x49\x35\xb7\xfb\xd4\x7e\x6b\x92\x8f\x39\x06\x66\x3d\xe5\xd8\x68\xfb\xcd\x99\x79\x90\xc8\x3c\xa0\x20\x1b\x3c\xd2\x13\x11\xff\xe6\x14\x0f\x18\xef\xd3\x4c\xa1\x3a\x2a\xa6\x13\x88\x27\x4b\xa9\xeb\x87\xbe\xad\x1c\x11\x46\xa1\x19\x75\x2d\xe1\x76\x2a\x71\x40\x75\x8d\xc7\x3d\x76\x23\x22\x27\xcd\xd2\x73\x7d\x62\x87\x12\xdb\x75\xbb\xdf\xbf\x54\x58\xe3\x57\x45\xe8\x9d\xd5\x1c\xbd\x1b\x60\x2b\x1f\xd1\x18\x6f\xe4\x23\x43\xac\x50\x84\x50\xa7\xbb\x91\x16\x79\xbb\xe5\x2e\x49\xa5\xf3\x96\xbc\xeb\x98\x6b\x9f\x63\x57\x8c\xf4\xe0\xfa\x72\x10\xf0\x82\x1b\x4e\xcc\xe1\xe9\xc4\x0d\xb6\x2b\x24\x54\x68\x51\x7f\xb8\xd2\x30\x85\x82\x8f\x01\x2a\x13\x42\xe7\xbc\x07\x19\xa9\xb6\x28\x1e\x1d\xbc\xac\x24\x8d\x9d\x0b\x78\xae\xcf\xcd\x10\xac\xab\x36\xda\xb1\xa2\xa6\xa9\xc1\x6b\xaa\xa0\x4a\xe9\x4a\xf3\xdf\x6c\xaa\x0d\x23\x28\x7d\x0d\x55\x44\x74\x52\x44\xe2\xdd\xa5\xb8\x89\x6d\xcd\x1e\xc8\xea\x5a\x96\x54\x83\xf0\x1e\x0c\x65\xd4\x07\xc7\xf3\x15\xeb\x86\x48\xb1\x90\x29\x1d\x1e\x87\x24\x49\x0d\x10\x97\x93\x77\xee\xd5\x08\x39\x4c\x54\x54\x5f\x54\xc4\xbf\xa3\x0e\x20\xed\x5c\x06\x0e\xb8\xa3\x36\xf5\x67\xdc\xc3\xc7\x78\xdb\x4e\x49\xba\x68\x6b\x80\x8a\x2c\x6f\x52\xa9\xcd\x21\x35\xd9\x61\x3d\xff\x60\x5a\xaa\xf3\x04\xef\x03\xc8\x4e\xd2\x4b\xbb\x2d\x62\x98\xea\x3c\xec\x80\x01\xe4\xc9\x69\x4d\x40\xc0\xaf\x54\x46\x83\x60\x98\x95\x46\x2b\xb9\xe6\x88\x59\xea\x9d\x60\x55\xde\x18\xad\x31\x95\x8c\x56\x85\x5b\x75\xc5\x12\xd4\x84\x08\x93\x57\x3f\x82\x4b\x08\xa9\xf3\x26\x51\xcc\x18\x65\x94\xbb\x49\xd5\x61\x24\xf7\xc3\xc4\x4f\xa6\x29\x21\xaf\xfe\x42\xd6\x88\x95\xe7\xd4\x6c\xf8\x96\x28\x6b\x13\x2c\xe7\x44\x86\x9c\x05\x76\x3c\x75\xf9\x64\xd0\x5b\xed\xe6\x10\x79\x12\x71\x79\x4c\x36\x1c\x91\x5e\xc4\x19\x1d\x24\xfd\xf8\xd5\xe2\x3c\x2d\xcc\x62\x53\x91\x18\x97\xdd\x31\xce\xf8\x88\xa3\xcc\x01\xbb\xb2\xa4\xf5\xbd\x57\x67\x2f\x69\xe5\xd5\x79\x30\xf3\xfd\x16\xc0\xb3\x21\x6c\x88\xd6\xe1\x5e\xa9\xeb\xe0\x78\x9a\x03\x15\xf8\x3b\xf5\x67\xbe\xbd\xda\xcc\xcd\xea\xd4\xb4\xed\x62\x74\xb5\x4b\x1c\x77\xc9\x75\x94\x3e\x67\x34\xe4\xe9\x4d\xef\xf9\x10\xff\xc0\x5f\x81\x54\x2b\x9b\x24\x48\x95\x51\x16\x7b\x69\xe1\x8c\x60\xdd\xce\x86\x79\x1b\xdc\x1c\xa6\xf3\x5f\x33\x5d\x81\x6a\x13\x0b\x7b\x61\xb1\x6d\xdb\xf5\x53\xa4\x9a\xd6\x53\x1b\x69\xc8\xc2\xa1\xdc\x69\x0b\xcc\x57\xc4\xa4\x9a\x14\xb0\x7e\x46\x2b\x62\x0b\xff\x09\x4a\x40\xfd\x73\xf2\x4f\x80\xd1\xcd\x7f\x72\xc3\x3f\xbc\xff\xcf\xd6\xc2\x65\xad\xbf\x92\xe8\xa6\x3a\x2c\x59\x11\xd7\x6a\x03\x67\xa7\x24\xac\x90\x5d\x6f\xe2\x3b\x23\xb8\xcd\xa1\x06\xba\xe6\x0d\x57\xd2\xa0\xef\x7b\xea\xe2\x9a\x48\x7a\x3b\x74\x27\xc5\x40\xab\x0f\x28\x0c\x00\x79\x8e\xeb\xa5\x4d\x96\x88\x22\x8c\x6b\x0c\xb2\x00\xd5\xde\x05\x93\x55\x41\xf9\x85\x20\xa3\xc2\xb7\x41\x0d\x9d\x6a\x06\x24\x9b\x0c\x84\x92\x05\x26\x4e\xf2\xc1\x75\xfd\x86\x12\x81\x6b\x0e\x3a\x88\xef\x83\x00\x3b\xc5\xd6\x81\xd9\x70\x24\x5e\x89\x12\xb5\xfe\x24\x90\xb0\xd1\x39\xc1\xa6\x7b\x8f\xdd\x81\x06\x21\x1e\xd4\xcf\x95\x13\x64\x58\x51\xa9\x60\x9e\x7e\xef\xa9\x9b\x56\x72\x59\x18\x93\xaf\x2a\x93\x55\x8f\x80\x45\xa5\xc2\xc8\x4a\xe7\x12\x4e\x7a\x59\x7a\x35\x63\xc4\x60\xa6\xd6\xca\x66\x05\x51\x2e\x04\x7b\x5c\x71\xf5\x6b\x6c\x0d\x38\x59\x18\x20\xe9\x6f\x60\x12\xd9\x80\xf5\xa1\x8c\x27\x09\x8d\x9f\x73\x08\xc6\x32\x18\x25\x2a\xee\xc4\x4b\x69\x1e\xd4\x55\x90\xab\x99\xa2\x7a\x14\x3e\x8e\xed\x15\x9b\x64\xdb\x0a\xaa\xbe\x0a\x5d\x9f\x44\xca\x96\x49\x1e\xb0\xea\x40\x96\x81\xf0\x47\x8b\x1f\xbe\x53\x7c\x72\x6a\x87\x38\xe6\xb9\x63\xc3\xd6\x6b\x6c\x06\xa4\x4b\x42\x5f\x41\xca\xc8\x24\xef\x53\x6d\xa2\x5c\x90\xeb\x32\x72\x20\x3e\x44\x56\xd1\xef\x53\x84\x09\x30\xfa\xdd\x9d\x87\x21\xf9\x6b\xb8\x80\xf2\x48\xf0\x22\xbb\x0c\x85\x25\xa0\xab\x09\x96\x60\xc8\x3d\xa7\x13\xe0\x42\x19\x91\xb2\x55\x3e\x1e\xa9\xac\xf9\x07\xb2\x66\x4f\xf5\x3a\xb5\xfa\xb5\x45\x0b\x3d\xae\x29\x7c\x2b\x65\x98\x38\x04\x29\x52\x50\x77\x2d\xde\x13\x0d\x14\xa2\xed\x3e\xe0\x1c\xbf\x6a\xeb\x78\x59\x9f\xc4\xb6\x03\x14\x50\x3c\x11\xef\xb1\x46\xc4\x1a\x58\x67\x9c\xe0\x4a\xe5\xba\x21\x36\xac\xa2\x9a\x75\x26\xd7\xb2\xb6\x06\x4d\x80\x6d\xca\xe9\x4b\x15\xa1\x81\xdc\x07\x1f\xd0\xad\xbb\x44\x0c\xca\x07\xaf\xc2\x5e\xab\x9e\xfc\x2e\x56\x52\x04\x7d\x01\xe4\xc3\x4f\xd2\x11\xcb\x8c\x6c\xd5\xab\xff\x79\xed\x33\x29\xb6\x32\x15\x8a\x63\x6e\x81\xf1\x99\xcd\xf7\xd6\x8c\x2f\x4c\x01\xba\x20\xf2\x9a\x94\xc2\x33\xe7\xaf\xec\x88\xb7\x5b\x06\x1f\xf2\xd9\x22\x36\x8f\xa7\xb3\xfe\x2c\x72\x6a\x55\xab\x01\xbf\xaf\x1b\xf3\xdb\x6a\xe5\xf1\x54\x04\x4b\xb2\x6e\x86\xdd\xff\x0b\x2e\xa3\x06\xc1\x9d\xfe\x6a\xaa\xb7\x52\x4b\x10\xfd\x0c\xd7\x36\xbf\xb5\xca\x6e\xbd\x02\x01\x0b\xe6\xfb\xc1\x22\x02\x1c\x66\xd9\xae\xd4\x46\xa1\x8a\xac\x4f\x3c\x6b\x4b\x94\x67\x5c\x63\x59\x8f\x6a\xb4\xb0\xc5\xd2\xc2\xc4\x1b\xf9\xa8\x5a\x96\xa7\xf4\x8a\xac\x28\x16\x73\x2d\x1e\x77\x40\x76\x7e\x45\x00\x82\x7c\xee\xd6\xc7\xc9\xd3\x07\x92\xfc\x56\x7f\x3e\x98\x68\x86\x69\x82\x4a\x5e\x7c\x14\xba\x02\x59\x84\x49\xd2\x2d\x9c\x3b\x39\x37\x4d\x29\x59\xa6\x94\xf9\xb0\x25\x45\x2a\x8e\x47\xe1\x1a\xbc\x17\x74\x1a\xc6\x40\x06\x06\xf7\x97\x67\x6a\x75\x44\xf5\x35\x34\x6b\x53\x5f\x86\x8a\xc3\x4a\xfd\xad\x18\x52\x67\x97\xfa\xaf\x6a\xe9\xa2\x52\xd7\xa5\x97\x50\xdc\x65\x0e\x45\x29\xe9\xac\xd4\xa0\xd8\x0c\x08\x69\xad\x4e\x67\x59\x29\xe7\xc3\xcf\x06\xc1\x78\x02\xc6\x63\xe7\x2f\x56\xe1\xaf\xdc\x64\x55\x2e\x56\x25\x8c\x8f\xf2\x80\x98\x7c\xd9\xb7\x49\x6a\xdd\x56\xa7\xe5\x47\x23\xc4\x8b\xdd\xc9\x93\x02\xea\xe7\xd2\x86\x4e\xea\x07\x0a\x4b\x32\x95\x0b\x6a\x30\xf9\xa3\x56\x5f\x80\xbf\xc0\xa0\x20\x53\x55\x53\xdd\x1f\x2e\xf0\x8e\xaf\xdf\x41\x74\x80\xd0\x1f\x2c\xce\x26\x7e\xa2\x33\x87\xed\x87\x28\xb6\x2e\x7f\x92\x8f\x0a\x94\x45\x91\x8d\xcd\xd7\x4a\x8a\x35\xbe\x41\x29\x0e\x96\x24\x90\x58\xf8\xa0\x57\x2f\xee\x24\xa7\x41\xb9\x8a\x6a\xae\xd4\x8b\x58\x71\x6f\xbf\x54\x25\x14\x9d\xfa\x18\x33\x22\x60\x2d\x68\x3f\x7e\x5b\xa5\x48\xa8\x11\xfb\x21\xa2\xdb\x19\x5a\x86\x5b\x3a\x59\x2e\x78\x9e\x6e\x84\xa0\x11\xad\xdd\x5e\xad\xb3\x6a\x69\x53\x00\x93\x70\xce\x94\x7f\xd3\x87\x12\x8f\x0d\xc0\x8d\xe4\x45\x0b\xd6\xb3\x93\xed\x6c\xc8\x56\x62\x50\x51\xe1\xb3\x0d\xd1\x60\x86\x06\xcd\x9f\xb1\xe5\xae\x25\xb6\x15\xad\xc7\x63\x61\x4f\xb3\x15\x8c\x5e\x9a\x28\x33\x53\x15\xfa\x9b\xfe\x03\xbe\x92\x6d\x80\xc5\xa5\x8a\x04\xfe\x81\x3e\x04\xc6\x1d\x7a\x1c\xfc\xad\x10\x2f\xcf\x5d\x3c\x0c\x2c\x17\xe0\x17\xae\x3e\x46\x25\x0a\x2a\x32\x60\x6c\x2b\x62\xdc\xb4\x71\x0f\xb1\x9a\xae\x22\x7e\x4f\x25\x83\x23\x91\x4a\xc2\x4a\x62\x34\x2e\xab\x96\x28\x29\xa7\xc7\x02\xe8\x0d\x22\x53\x20\x6c\x43\x35\x22\xf6\x45\x5a\x38\xa8\xf6\x59\xab\x19\x4e\x94\x8b\xaa\x66\xf1\xb1\xef\x6d\xf8\xce\xcf\xcf\x5f\x60\xab\x84\xae\x6d\x24\x5c\x44\x69\x63\xa9\xa5\xf2\xd2\x2f\x7f\xf1\x16\x16\xbd\xa2\xb0\xe6\x1b\x15\xdc\xa2\x34\x28\xbb\x52\xf3\x10\x88\xc7\xe2\x7a\x02\x7f\x8e\x64\x21\xe5\x8a\xa0\x72\x7f\x54\x73\xd0\x31\xd0\xf4\x73\x04\x95\x4e\x45\xd7\x8b\xe5\xed\xd1\x2e\x57\xdf\x6d\x85\x72\x3b\x7a\xa0\xd3\xd5\xd1\xc1\xc4\xb9\xf1\x52\xb4\x08\x70\xf1\x9a\xb3\x55\x0e\x70\xaa\x52\x53\x42\x5d\x9d\x7f\x5d\x1d\x4f\x56\xf6\xab\x4a\xf0\xbb\x6d\x2d\xae\x83\x17\x0e\xd6\x84\x30\x70\x18\x31\xbf\x9c\x41\xe6\xcc\xfb\x73\xe7\xae\x3d\xf5\xc8\x08\xc2\xdc\xa1\x66\x3f\xa2\x43\x48\x59\x85\x79\x98\xb7\x15\x52\xbb\x5a\x22\x74\x83\x11\x45\xc5\x23\x38\x5a\xb2\x47\xdd\x19\x44\x58\x2d\x59\x80\x3d\x95\x6f\x68\x92\xea\xad\x4b\xe4\x57\x95\x51\x00\x25\x92\x35\x53\xee\x55\x76\x8f\x61\x67\xd5\xcc\xdc\x08\x10\xa2\x22\xa9\xba\xa4\x23\xf8\x1c\x62\xb5\x96\xbd\x35\xd1\x60\x3d\x26\x6d\xce\x2d\xe2\xc6\x30\xdb\xa7\x4e\xea\x49\x59\x40\x50\x5f\xb2\xeb\x01\x0d\x89\xa0\xfe\x9a\xaa\x27\x62\x5d\xa6\x55\xa2\xd6\x58\xab\x62\xd0\xc7\xc2\x14\x36\xf1\x42\xb5\x11\x39\x16\x16\xa1\x23\xa9\xaf\x02\xe0\xb6\x83\xf4\x2a\xc6\x9f\x45\x83\x17\xfc\x88\x85\x6a\xe7\x8d\x7e\xe7\x2a\x95\x6c\xb7\x15\x81\x29\xf6\x60\x52\xb5\xd3\x13\x94\x19\x09\x4a\x6e\x55\x65\x7b\x74\x67\xa3\x2b\xc9\xa0\x61\x9f\x6b\x8d\x4b\x6d\x56\xbc\x98\x87\x10\x1f\x17\xf1\xd0\xb2\x16\x60\xa9\x2a\xa2\x92\x40\x51\xb2\x29\xb7\x41\x2f\xd3\xbf\x05\x54\x96\x12\xa5\x56\x21\x07\x82\x4f\xc9\xc1\x44\x27\xaf\xd4\x76\xf9\xc0\xb8\x45\xa6\xe7\x40\x6d\xd3\xac\x1c\x08\x25\x4b\xa5\xa7\xf7\x07\x56\x76\x31\x3a\x20\x3a\xce\x3e\x43\x44\x72\xd6\x3c\x8e\xf1\xa9\xc5\xd3\xea\x21\xd8\xea\x95\xe8\xd1\x55\xb9\xcd\x47\x58\xe5\xfe\x3e\x27\x68\xe7\xdb\x55\x85\x70\xa8\x50\x84\x65\x23\x79\x7b\xfb\x51\x84\xeb\xe9\x5a\xac\xef\x0f\x3f\xd6\xc8\x56\xa9\x26\xd3\x57\xbe\xc9\x21\x79\xd3\x7c\x7a\x36\xad\xb6\x56\xb1\xf8\xa4\xd1\xfa\x90\xd9\x26\x6b\x56\x75\x7b\xab\xa8\xaa\x59\x7a\xe4\xb1\xaa\x0e\x06\x6f\x7a\x8c\x8a\x62\x6b\xf8\x2a\xbe\x5c\x4a\xb3\xc9\x76\x05\x94\xdb\x9a\xaa\x28\x08\xd5\xe7\x07\x88\x9f\x20\xd0\x31\x54\x9b\xf3\xc2\xd5\x07\x02\x58\xce\x81\x0b\x5b\x7e\x69\x29\x39\x9b\x6d\x1e\x7b\x8e\xf2\x02\xe0\xd6\xc4\xb9\x26\x01\xe9\x96\x21\xe4\xba\x65\x14\x42\x4a\xcc\x3d\x5b\xcc\x1d\x67\x35\xad\xaa\x0b\x9f\xfb\x3f\xcf\xff\xfc\xed\x35\xde\xe6\xfb\xe7\xae\x5c\xb9\x72\x0e\x14\x9e\xe7\xc6\xc3\x6e\xd6\x83\x1f\x3b\xbc\x6f\xd3\x26\xdb\x79\x05\x23\x0d\x9b\xe5\x5e\xf3\xe5\x17\xcc\x5f\xcf\x37\xb1\x0c\xa5\x96\x87\xad\xd6\xaa\x5e\x0b\xaa\xb8\x96\x93\x92\x33\x9e\x61\x88\xdb\xf7\xe4\x5a\x02\xa6\x85\x71\x9d\x78\x24\x24\x16\x75\x93\x1c\x75\x0b\xb9\x3c\x4f\xe6\x43\x40\xf4\x6a\x5d\xc4\x5f\x96\x16\x68\xda\x43\xb3\xde\xf3\xf8\x1f\xf5\xb3\x91\x6d\x2e\xa1\x98\xe3\xd5\x92\xac\x11\x6d\xc2\x7e\xb9\x59\x89\x5b\x35\xe9\x82\x4e\x7c\x7c\x4e\x0d\xfd\xc8\x77\xe5\x4f\x71\x39\xb3\xa5\xdb\xbe\x12\x6e\xf3\xd0\x89\xbc\x16\xf4\x9c\xc6\x92\x9f\x45\x62\x79\x1b\x40\x32\x1c\x85\xfa\x10\xe1\xef\xb6\x98\xe4\x5e\x0d\x27\xc2\x9c\xf0\xfd\x5e\xf7\xaa\xf5\x1d\x43\x02\xcc\x30\x05\x5f\xe5\xe9\x78\x2c\xb3\xf6\xac\xa0\x81\x8a\xac\xd7\x69\x65\xc0\x23\x60\x74\x2c\x04\x83\x53\x08\x2d\x17\xdd\x9a\x39\x5d\x23\xb2\x7c\xaa\x9a\x5a\x30\x52\xdb\x6c\xa6\x60\x15\x88\x48\x21\xac\x61\x3d\x2e\xfd\x4c\x45\x73\x49\x45\x6d\x93\x8c\xb8\xf9\xaa\xe3\xc6\xa2\x3e\xe2\x8d\xac\x89\xd9\xc6\xe1\x4a\xa6\xf7\xf9\x6f\xcb\x47\x5e\xd0\x81\xf6\x46\x93\x23\xd5\x61\x55\xcb\x93\xb9\x2f\xe8\x4e\xeb\x78\x47\xa5\x85\x4d\x28\xa1\xc6\x5a\x42\x41\x3c\x6b\x89\xa4\xd8\x58\xc3\x44\x9c\xf0\x5f\x49\xae\xb4\x96\x8c\x7b\xee\xdf\x94\x73\x8b\xdd\x27\xe5\x4f\x8c\x1b\x81\x3f\xfb\xc3\x04\x5c\xda\xb6\xcd\x8d\xe4\x1f\x64\x9d\xca\xd9\x01\x20\x98\x75\x14\xdb\x51\xf8\xe1\x55\x02\x0b\xba\xbb\x54\x7f\x8e\x05\x9d\x33\xf0\x27\x54\x44\x33\xfc\xec\xc5\xcb\xed\x21\x8e\x7c\xe8\x6c\x86\x21\x1e\x26\x51\xc0\x00\x05\xd1\xac\x5d\x96\xa4\xaa\x4f\x40\x84\x16\xa6\x7f\x6b\x1a\x61\x7b\xce\x49\x55\x6e\x87\x84\xf1\x40\xce\x46\x6a\x74\x0a\x05\x99\x70\x63\x15\x22\x68\x05\xf6\xaf\x23\x3e\xac\x15\xa1\x9d\x3b\x79\xb3\xff\x83\x20\x81\x40\xa3\x5a\xd5\xc2\xd9\xb9\x02\x39\xb0\x2e\xaa\x71\xb9\x83\x27\xe5\xa5\x12\x21\x21\xe7\xdc\x9f\xa5\x24\xa7\x62\x5d\xe9\x44\x7b\xf6\xf8\x1a\x08\xbf\x46\xd1\x53\x9f\x99\xa8\x62\x7b\xcc\x55\x8a\x58\x54\xb1\x03\x15\x7d\xe7\x94\x2a\x80\xa9\x6a\x32\xe0\xc9\xe4\x57\xf5\x3f\x0f\xa3\x60\x46\x5a\x20\xc9\x18\x38\x56\xe7\xa3\x10\x22\x70\xaa\x7d\x7b\x01\xab\x31\x07\x9f\x3a\xfd\x9d\x34\xe7\x7a\xe8\xc7\x3e\x78\x33\xf2\xdf\x4e\x7b\x3d\x08\xc5\xf9\x02\x61\xd2\x5c\x82\xbe\xa5\x41\xb7\x7f\x15\x2a\xb3\x63\x68\x06\x5b\xc9\xb8\x58\x3a\x09\x8f\x1a\x9c\x35\x09\x82\x73\x71\xdd\x23\x47\x62\x2b\xd2\xaf\x30\x98\x1b\x88\x0f\xb8\xba\x96\xf9\xa7\x61\x77\x5f\x2f\x8a\xea\x7c\xcf\xec\xc5\x12\xea\x2d\xbc\x18\x51\x69\x2a\xdf\x0f\xfa\x17\x39\x89\xa3\x38\x31\xb3\xec\x3c\xd8\x62\xce\x9f\x7f\xf3\x9c\xb3\x1c\x56\x0a\xa0\xaa\x3b\xc2\x4a\x2f\xea\x20\x5d\x64\xaa\x7a\x9e\x50\x3a\x9e\xfd\x08\x97\x9e\xb2\x36\x44\xd4\xc5\xfe\xc5\xce\xce\xb2\xc8\x11\xa9\xcd\x75\x80\x96\x90\x02\x99\x6b\xe5\x47\x25\x3c\xab\xe9\x58\xb0\x4a\xeb\x5e\x34\x0d\x22\xd5\x6c\x29\x31\x6f\x4a\x74\xce\xa5\x29\xbf\x58\x0a\x1a\xa1\x5f\xd2\x93\x40\x64\x9d\x2d\xf3\xf0\xf7\xe0\x14\xab\xf5\x3b\x7b\x91\x35\xe5\x2c\x07\xd1\x68\x84\x58\x88\x75\x9f\xa9\x01\xe4\x1a\x1d\xd8\x77\x7e\x18\x0b\x95\x63\xab\x5d\xd9\x7f\x65\xbd\xe9\xa8\xd9\xed\x14\x15\xa7\x17\x6e\x5a\x05\x90\x2d\x87\x9d\x45\x7a\xb3\x46\x27\xdf\xdc\x6c\x6e\x0c\xfb\x57\x8a\xac\x55\xf4\xc7\xc3\x76\x16\x2b\x69\xa2\xaa\xc8\xcc\x5c\xae\xc1\x3d\x28\x7c\x0c\xfd\x29\xb3\x3b\x18\x36\xbd\x44\x2b\xf4\x91\xc2\x86\xcc\xcb\xc2\xff\xd2\x6f\x98\x11\x02\x4d\x11\x97\xd3\xbc\x0b\x39\xac\x7d\xbf\x82\xd7\x4d\x23\xb2\xbb\x06\x48\xad\x49\xfd\x21\xa7\x77\x0b\xfe\xd5\x2a\x46\xe9\xa8\xb0\x19\xe9\x9c\xd0\xc7\xf5\xaf\x58\xc5\x34\xc5\xe0\x29\x18\x55\xf5\x2f\x06\xdd\x7c\x84\x05\x74\x28\xaf\xf3\x93\xd2\xcb\x3f\x4b\x1a\xe5\x69\xb9\xa7\xba\x8c\x7b\xf9\x66\x9e\x75\xb8\xd3\x1f\x4a\xca\x4c\x50\x69\x0a\x6b\xe2\x84\x62\x62\xcd\x87\xb0\xf0\x69\x98\x15\x04\x80\x4a\x52\xfc\x9b\x67\xe8\x6c\xff\x40\x2c\xf9\xdf\xd0\x31\x78\x61\xe5\x4c\x79\x09\x4c\x75\x4b\xdf\xe3\xc3\xb6\xe2\x5b\x36\x84\xf1\xc7\x3f\x7d\x9b\xfe\xc0\x22\x36\x94\xe4\x3c\xb8\x6e\x36\xb3\xd9\xa2\x27\xd8\x1c\xb3\xb9\x17\xe3\x01\x26\x85\x27\xe7\x36\x4a\x1b\x4a\x91\x47\x2a\x83\x4d\x58\x0e\xf5\x44\x62\x0c\x9c\xe0\x3f\x51\x49\xc6\xe7\x54\x29\x84\x83\xfd\x74\xf1\x20\xf6\x3f\x98\xd0\xa1\xa1\xa1\x11\x97\x02\xc5\x88\x76\xd2\xde\x55\x95\xeb\xdc\x49\xf4\x41\xa6\x15\x6b\x47\xbc\xed\x64\x7a\xbb\x0e\xac\x3a\x6d\x93\x9d\x87\x53\x93\xaa\xb3\xd4\x31\x46\x93\xe5\x57\xd8\x90\x0a\x4f\xcd\x78\xa5\x27\xf9\x4a\x75\xc7\xf0\xdf\x5e\x45\xa3\x6b\xd2\xd6\xb6\xec\x0c\xd3\x4d\xf3\x7a\xfe\x1d\x8f\x80\x95\x34\x58\xbc\x97\x3e\x9b\x0b\xb1\xe3\xa0\x27\xea\xb9\xc8\x18\x06\x20\x37\xc4\xff\x1a\xb8\x72\x15\x3b\x6e\xdb\x2c\xcb\xc7\x26\xed\x52\x50\x9c\xae\x3b\x98\x53\xa0\x18\xa4\x69\x4f\xce\x16\x09\x2b\xcf\x30\x8f\x12\xd3\xb1\xc0\xbb\x84\xea\xf0\x4e\xdc\x5a\x11\x09\xb5\xa8\x86\x98\x2a\x87\x25\x34\x0a\x8a\x8a\xe9\x53\x54\x31\xe2\xf7\xc5\x0d\x19\xb5\xd2\x07\xce\xb5\x87\x4f\xdf\xb9\x4b\xb3\x1f\x98\x35\x6f\x32\x06\x06\xd9\x84\xb8\x19\x7d\x2a\xde\x14\x5a\x28\xa2\x25\x3d\xc6\x5c\x20\xc8\x4a\x46\xd2\x70\x79\x0a\x75\x29\x49\x7d\x4b\x2a\xa6\x45\xd4\x1a\xa2\x56\x64\x9d\xa9\x13\xaf\x9d\x67\x83\x8a\x7a\x47\x69\x5b\x16\x3b\x4a\xb7\xfc\xca\xee\xc8\x83\xab\xb3\x65\x3d\x51\xf9\x6f\x8c\x9f\x75\xc7\xda\x22\xcb\xb5\x75\xe9\x70\xf4\x35\x2b\xa0\x3b\xc9\x9c\x63\xf3\xad\xf0\xa5\x56\x58\xc7\xbf\x49\x83\x85\x3c\x9b\x34\x8a\x84\xe6\xa9\xe7\x40\xb8\x99\x73\xc5\xe2\xc9\x5e\xf3\x34\x6c\xb6\xc0\xad\x8e\xd6\x93\xfe\xa0\xfa\x42\x1d\x8a\x4e\x5c\x0e\xfa\xda\x66\x33\xf2\xe4\x7c\x3f\xed\xa7\x0b\xa7\x8c\x3c\x4b\x35\x90\x2e\x19\x6e\x9d\x48\xc5\x5c\x40\xe1\xbf\x68\x8c\x93\x84\xae\x9e\xcb\x1c\x8e\xca\xa8\xee\x11\x9b\x5b\x76\x51\x05\x1d\x89\x33\xb0\x5c\x8d\xe3\x3b\xe0\xb9\x13\x30\xed\xbb\x5d\x56\x53\x16\x4c\x3d\x3c\x30\x18\x6f\x74\xf3\x62\x9b\xa2\x36\xed\xbb\x2b\x83\xc2\x8b\x01\x1e\x82\xc8\x63\x46\x68\x91\xd0\xe3\x5b\x35\x38\x0e\x1f\xa1\xc5\x72\x0b\x6a\xb5\x45\xb0\x27\x09\xde\xb6\xf3\x22\xcf\xc3\x48\xcf\xb8\xff\x4b\x0c\x6d\x9d\x22\x83\x81\xea\xee\x3b\xe1\xe1\x13\x0a\x0a\x04\x28\xe7\x58\x30\xf5\xb8\x50\xf0\xd5\x39\xc9\xca\x12\x3d\x47\x34\x06\x9e\x85\xce\x67\xc4\x2b\x86\x68\xc6\x0f\x4c\xd6\xa3\x09\x9a\xaf\x84\x21\xbb\xc4\x9a\x8b\xe5\x95\xca\x54\x9c\x44\x25\xc4\x6c\x75\x75\x6e\xab\x65\x76\x8f\xdd\xa0\x92\x4e\xb2\x08\x5f\xf9\xb4\xd1\x78\xb7\x3f\xdc\xba\xd8\x40\x47\x19\x2c\x51\xc6\x8e\x36\xa1\x55\x26\xee\x77\x82\xfd\xa0\x50\x9a\xdf\xf9\x3e\xab\xf9\xe3\x25\xa3\xea\x47\xb2\x45\xd2\x60\x90\x3f\x31\xca\x9f\x56\x06\xa9\x4b\xc7\x43\xd4\x12\xf1\x9c\xcd\x2e\x49\x36\x1a\xa4\x42\x94\xda\x10\xad\x7b\x4d\xa9\x86\x6a\x66\xad\x24\x32\x88\x38\x04\xcd\xef\x50\x61\x51\x1b\x11\x1e\xaa\xce\x66\x8d\x41\xd6\x1f\x00\xa6\xff\x13\xa6\x43\x99\x36\xcc\xfd\x41\xa5\xbc\xa2\xbf\x93\x61\x98\x0f\x7a\x8e\x98\x71\xb1\xae\x70\xa9\xb2\x9d\x98\x17\x72\x0e\xe7\x22\x9d\xe0\x27\x8d\x51\x96\xee\xd8\x84\x7b\x58\xe8\xd4\xb0\x51\x58\x9d\x8d\x7d\x87\x8a\x75\x8c\x0c\xd3\xf9\x4a\xa7\xdc\xc0\x96\x5f\xca\xb3\x1a\xb7\xcb\xa9\x2e\x04\x0b\x53\x55\xf6\x4f\xcc\x19\x9a\x65\xf4\x1a\x6e\xe2\x15\xc5\xf3\x0c\xc1\x38\x35\xe6\xbc\xf2\xd0\xdb\x07\xb6\x5c\x32\x88\xa6\xcc\xca\xc0\xb9\x30\x8c\x8c\xa3\x6a\xa6\x64\x40\x91\x94\x65\xde\xcd\x9f\x28\x4b\x86\x70\x56\x76\x61\x36\xec\xc4\x4f\x85\x38\x6d\xba\x15\xdb\x65\xfd\xbb\xa2\x48\x09\xf1\xd2\xba\x2a\xed\xe4\x55\xea\xe3\x15\xe1\x26\xa5\x16\x65\xd6\x3c\xa0\x64\x6a\xec\x36\x44\x68\x1c\x02\x84\xae\x21\x1a\xb2\x6c\x94\xb6\xb0\x58\x9f\x2d\x90\x37\xe2\x3b\x78\xb5\x11\xad\x40\x0f\xf7\x31\x0d\x43\x0f\x6b\x9f\x21\xd7\xa4\x2f\x17\x95\xa4\x3f\x75\x51\xfa\x85\x33\x2d\x2c\x45\xbf\x20\xd6\x7e\xb5\x6c\x0a\x16\x37\x05\x48\x09\xe1\xc4\xf3\x5c\xa0\x88\xf5\x07\x65\x10\x9a\x0e\xe5\xcc\x89\x28\x7e\xc9\x28\x5b\xac\x98\x33\xba\x9a\xa8\x9d\xf9\xbb\x45\xb2\xfb\x9d\x17\x79\x38\xd7\x39\x2d\x8a\xd8\x17\x2a\xac\x2a\x9e\xcf\xcd\x4a\xfc\xbc\x79\xdc\x2b\x86\xcf\xaf\x9e\xe6\x19\x8c\xdb\xb1\xcb\x67\x1f\x2c\xa7\xa1\xaf\x1a\x29\xd2\xcb\xa9\xe1\xdd\xdd\x19\xfc\x8e\x25\x86\x09\x68\x67\xe2\x00\xb5\x64\xd3\x4b\xa3\x32\x6a\x10\x7f\x68\xd2\x48\xdb\x94\x21\x3c\xec\xfd\x17\xcc\x95\xb0\xe2\x20\xc1\x29\x63\xfe\x2c\x95\xd5\x13\x73\x73\x3d\x29\x75\xf5\xe9\x1b\x3e\x7f\x32\xe5\x50\x42\x0a\x91\x8e\x4c\x59\x09\x7f\x68\x26\x75\x1e\xe0\x6e\x4b\xa7\xf5\x04\xe7\xfe\x40\x18\x58\xd0\xa9\xa8\x25\xa3\x90\x1a\x1d\xc1\x89\x16\x93\x9a\x90\xad\xda\x50\x9f\x49\x64\xb7\xbe\x43\x1e\x46\x7b\x9c\x9b\x4b\xb2\xe4\xd9\x32\x1d\xa4\x72\x4e\xaa\x96\xa8\x3b\xad\xf5\x6a\x2d\xf1\xf4\x35\x07\x9e\xd7\x0e\xda\x12\x9d\xd5\x9c\x78\x3a\x22\x60\xbe\x15\x1b\x14\x2f\x5a\xc5\x8a\x2c\x8f\x52\x46\xa0\xfb\x8f\xa2\x0e\xbf\x47\x36\xef\x29\xfe\x6e\x24\xd2\x06\x33\x0f\x4d\xfe\xef\x76\x3e\x68\x5d\xce\x8b\x7c\x23\xef\xe6\x50\x80\x13\x02\x9b\xb8\x78\xaf\x84\x0b\x87\x59\xd1\x27\x01\xc9\x79\xc9\x8e\x89\xb2\x51\x5b\x29\x24\x24\x78\x33\x68\x61\x69\xe8\x83\xd2\x4b\x7d\x75\x9f\xd5\xd2\x08\xe7\xc0\xbc\xba\x7e\xc3\xfc\x32\x9a\xd2\xc3\x26\x07\x61\x93\xfa\xb1\xfd\x35\x1d\x07\x27\xd1\x1a\xf6\xa9\x22\xf6\x8c\xfc\xaf\x2b\xbb\x76\xdb\xac\x29\xb0\xe0\x8f\x57\xe1\xce\xec\x77\xf2\x8f\x0f\xa3\x11\xe4\xab\xe1\xd5\x2f\x67\xa2\xd8\x95\xa4\x2a\xee\x33\x33\x94\x35\x06\x48\x2f\xe0\x22\x72\x6f\xa0\x9b\x7a\x29\x1c\xab\xd7\xbf\x12\x61\x4c\x09\x97\x03\x42\xc2\x51\x1a\xc4\x90\x36\xff\xb1\x9f\x73\xb6\x68\x9b\xa1\x96\x37\x40\xdf\x79\xf9\xa0\x4d\xa1\xda\x84\xf4\x33\x08\x4c\xb6\x5e\xf4\x67\x65\x50\x08\xda\x59\xe7\x98\x01\xf4\x3a\xd8\x1b\x65\xa4\xe0\x71\x59\x75\xc1\x12\x84\x34\xad\xef\x90\x0e\xad\x25\xfd\x07\x51\x2f\x9b\x2e\x3d\x91\xec\x1e\x98\xe8\xc3\x13\xaf\xcb\xfd\xba\xc8\x1b\xe6\x0b\x8b\xa6\x5f\x0f\xbb\xb2\xbf\x52\x15\xba\x8e\xf4\x58\x7d\x83\xbb\x14\xfa\xe5\x2a\xd7\x3b\x2d\x1e\xf9\x6b\x2d\x5f\xb2\xc1\x42\x13\xcf\x09\xe1\x29\x39\x8a\xb8\x97\x52\xc9\xee\x2f\xbb\xc4\x94\x52\xf1\x5d\x2e\x88\x53\x8e\x74\xfe\x5b\xde\x68\xd5\xdb\x12\x1c\x44\x30\x51\x3c\x72\xf3\xfb\x0b\x02\xfa\xe6\x1f\x56\x4e\xc3\xb3\xd5\xb2\xff\x9b\xca\x73\x19\x8f\xbc\x4b\xd8\x2f\x13\xe2\xc1\xe5\xb0\xd0\x1c\xac\x48\xd9\x23\x8b\x87\x25\x66\x9f\xf8\x71\x0a\x4d\xd6\x42\x90\x61\x49\x69\x88\x45\x7c\x2f\xb5\x40\x4c\x54\x54\x65\x8c\x7b\x7e\x48\x33\x69\xfc\xe1\x24\xef\xd8\x48\x24\xd1\x08\x7a\x55\xd9\x0f\x2b\x4e\x53\x35\x41\x43\xa0\xaf\xf5\x8c\x31\x6a\x7c\x3b\xc0\x6a\x71\xec\x6a\x98\x28\x47\x27\x07\x6a\xa5\xde\x7f\x77\x71\x2a\xf6\x50\x41\x23\x24\xe2\x13\xbb\xec\xa9\x63\xfa\x2e\xfc\x38\xf5\x94\x12\xf9\x28\x21\x57\x95\x68\xc0\x77\xb9\x35\xdc\x5c\xb4\x06\x2c\x82\x0e\x02\xa1\x90\x87\xcf\x02\xe3\xd6\x94\xfc\xc7\x2d\x2b\xb3\xe2\xde\xd4\x0a\x43\xee\x8b\xf7\xb6\xe2\x02\xf5\x40\x1e\xe4\xd6\xbe\x4e\x9f\xf9\x5a\x59\x31\x97\xa8\x1b\x74\x7c\x8a\xde\xae\x0e\x53\x5a\x94\xb3\xc0\xbe\x3b\xcd\x57\xd5\x03\x6c\x33\xb2\xd3\x30\xbc\xbb\xb4\x89\xb2\xbd\x2d\xaf\x50\x5a\xa6\xa9\x29\x57\xe5\x45\xc6\xcf\x32\xea\xe3\x4e\x28\x61\x2f\x24\x22\xf6\x59\xfd\xbb\x23\x96\xf6\xed\xbc\xe4\x45\x7e\xe9\xe3\xfb\x0e\x04\x2f\x4e\x38\x02\xae\xcf\x27\x7d\xff\x95\xfb\x55\xf6\x8e\x15\xf6\x5b\xfa\x71\x61\xe8\x2b\x1c\x25\x11\x11\xd5\xcf\x62\x22\x4f\x14\x6c\xc5\x9d\xee\x91\x06\xc3\xed\x22\x8e\x01\xe1\x3a\x10\x11\x2b\x2c\xa8\x4e\xe2\xa5\x2a\x17\x37\xd5\xdb\xd5\x44\x7f\x8d\x62\xf6\x3f\xb6\xce\x68\x31\x62\x16\x44\xf1\x09\xed\xaa\x63\x17\xf4\xab\x59\x41\xa9\xb8\x32\xd2\xe2\xc8\x4e\xd4\xa6\xd6\x44\x76\xc6\x97\x03\xf6\xa8\x00\x9f\xba\x5a\xf3\x55\x86\x38\x7a\xa1\x07\x2b\x2f\x93\x23\x59\x39\xd1\x92\xc7\xae\xbb\x45\xf4\xfa\x3d\x34\x04\x80\x3f\x22\xb5\xbc\x47\x26\x57\xed\xf4\xc5\x8a\xcb\x5d\xce\x27\x16\x26\x01\x21\xc3\x62\x5d\xae\x9f\x58\x31\x0d\x4e\x15\x75\x0b\x97\x34\xb1\x6c\x4e\x60\x8c\x34\xf2\xde\xbb\x08\xb6\x17\x1b\x9d\xb4\xd8\xde\xe8\xa7\x43\x4c\x64\x4a\x49\xad\x49\xce\xf1\x73\xe1\x21\xfb\x01\xae\xe8\x45\x4d\x6c\x2a\x29\xe9\xd3\x5e\xfe\x41\xca\x0a\xb7\xdf\xbb\xc3\x6c\xac\xa2\x79\x86\x2a\xe5\x50\x12\x55\x54\x6a\xb6\xc6\x9d\x16\xf2\x1b\xa8\x9c\xd8\x8a\xb1\x3e\x9c\xd5\x60\x5d\xe7\x49\x13\x55\x53\x34\x0a\xb4\xb1\xd3\xef\xe5\x18\xe5\xfb\x25\x63\x3b\x99\xee\xa4\x7c\xd4\xd0\x19\x95\x29\xa8\x04\x8d\xb7\x0d\x4c\xfe\x2a\x3f\xeb\xcc\xaf\xe0\x5b\x3c\xea\x8f\xd2\x2e\xd7\x9e\x85\x93\xc7\xea\x96\xee\x8c\xd1\x15\xc6\xc0\x44\xde\x96\x3a\xab\xca\x23\x07\x1c\x3a\x6c\xc3\xbe\xc1\x27\xa9\xd3\x5c\x6a\xf3\xbc\x1e\xee\xaa\x81\xaf\x1d\x74\xfa\x19\x17\x76\x48\xa0\x3f\x5e\xbe\xba\xd2\xba\x29\x1d\x7b\x1b\x9d\xc4\x56\x46\x09\x8d\xcb\x7b\x09\x82\xe9\x13\x62\x7e\x9d\x8b\x17\x84\xba\x2a\xc1\x05\xbf\x18\xe6\x70\x03\x5d\x1f\x36\x5e\xa9\x4f\xf2\x63\x20\x56\xb5\x8a\x5a\x68\xbc\x16\x41\x12\x35\xf0\x2e\x73\xd1\x43\x5e\xd3\xe8\x03\xd9\x87\x7a\x33\xc1\xb2\xf6\x78\xcd\x5c\x43\x62\x52\x2b\x0a\xa9\x7e\xa1\xaf\x11\xe2\x89\x5d\xce\x91\x3f\x77\xa5\x98\xf7\x83\x5e\x5a\x65\x77\x10\x8e\x68\x5d\xb8\x66\xc1\x2a\x6d\x26\x10\xef\xd7\x9a\xd2\xa9\xde\x19\x80\x00\xe2\xe5\x52\x05\xa9\xe4\x26\xa7\x08\x54\x29\xdb\xe9\x04\xc2\xeb\x88\x9e\xce\x8a\x57\xa9\x72\x95\x55\x6e\x85\xec\xba\xe1\x2e\x25\xce\xf1\x96\x16\x95\x76\xd9\xb3\x65\xe2\x35\x0d\xa3\x42\xbd\x19\x24\xf7\x7d\x38\xbe\x2d\xcd\x18\x3f\xdb\x24\x3e\x9c\x26\xd5\x35\x1d\x31\x4e\xa8\xaa\xc3\x9b\xdf\x09\x20\x37\x2c\x84\x19\x77\x8e\x6a\xc6\xde\xbb\x32\x94\x45\x0d\x33\xf5\xc8\xc0\x0d\x51\x5c\xc9\x47\x50\x7e\x4e\x12\x97\x79\xe9\x09\xa3\x3d\x86\xe3\x9e\x04\x88\xa0\x9d\x45\x35\x82\xc8\x0c\x28\xb3\xb3\x91\xf7\x3a\xad\x3e\x20\xe9\x8a\x24\x71\xa2\x42\xfe\x02\x25\xff\xcf\x7f\xf4\xcb\xd1\xf6\xc2\xd1\xb4\x25\x63\xc1\x30\xa6\x65\xe0\x65\x5d\xc9\xd0\xe2\xf1\xe1\xe8\x1b\x69\xa7\x65\xd6\x3e\xef\x61\x50\x47\xea\xb4\xda\x45\x35\x08\x9d\x52\xe1\xc0\xa5\xb9\x68\x4a\xcf\xc2\xc5\x24\xc5\xbd\x2d\x1b\xf5\x8a\xd7\x3e\x5d\x69\x5e\x15\xd5\xfd\xbd\x27\x0c\x36\x5e\x11\x40\x2a\xeb\x41\x06\x0b\x58\xad\xfc\x72\x56\x44\xd4\xf2\xa2\x51\x06\x5c\x63\x9e\xe5\x14\x95\x2c\x35\x7c\x30\xd4\xc2\x5e\x3c\x41\x65\xab\x76\x54\x62\xb3\xa2\x63\xd6\x9a\xab\x96\x5e\x32\xb2\xe1\xbd\x2d\x62\x00\x17\x6d\xce\x43\x87\x49\x8d\x36\x08\x5d\xb9\xea\xd9\x33\xf0\xe9\x0c\x5c\x3c\xdf\x00\xaf\xde\x85\x8b\x0a\x0f\xe4\x3b\xce\x8b\xb1\xce\xfe\xdc\x2b\x9f\xd5\x56\x3e\x6a\x6d\xb5\xe5\x8c\xaa\xd9\x88\xcc\x30\x0f\x71\x21\x58\x65\xe1\x18\xc7\x45\x96\xa1\x9e\x70\x82\xde\xac\x66\x06\x9d\xe7\x85\x87\x45\x2f\xd9\x70\xd8\xb8\x29\x43\x8d\x5f\x31\xe3\x29\x19\x8e\xd5\x0d\x6a\x09\xc3\x0c\xb3\xa3\xa7\xdd\x6e\xab\x28\xb6\x29\xfc\x42\x70\xa2\x2e\x2a\x21\x87\x98\xfc\xf5\x3f\x9a\xa6\xe1\x0b\x80\x96\x0c\xab\xfa\x41\x86\xc1\x01\xc5\x5f\x8f\xa0\x84\xc4\xdc\x95\xb9\x41\x45\xe3\x4b\x84\xf7\x88\x1f\x52\x91\x20\x2e\x78\x0b\x33\xa5\xa1\x86\x02\x4e\xff\xf9\x85\x0b\x0b\x62\xb7\x22\x06\xcb\xa7\xfe\xc2\x39\x21\x8b\xcb\xdb\x65\x0b\x6c\x69\x77\xff\x69\xcd\x71\xa8\xb8\x2d\x75\x26\x8a\xab\xf3\x70\x21\xfc\x4a\x1c\xcd\x0d\x17\x88\xbf\x34\x2d\x9a\x39\x34\xb8\x13\x70\x9b\x20\xca\x8e\xd6\x23\x3f\x7d\xb6\xa7\x53\xe6\xe4\x72\xac\xcc\xc1\x6c\xfb\xe6\xff\x0f\x45\xc5\x00\x31\xc0\x53\x14\x70\x85\xfa\x1d\xd4\x9c\xa9\xde\x9d\x36\x12\x47\x76\xb1\x10\xe2\x10\x0f\xd5\xdd\x83\xc7\x02\xfb\x8f\x6b\x98\xe5\x3d\x28\x62\xe2\x23\x22\x90\x7a\x48\xce\x67\x3e\xad\xac\x64\xf7\xb7\xd6\xf2\x5a\x84\xa0\x61\x8a\xec\x55\x51\x44\xb0\x64\x31\xab\x23\xa0\x15\xe7\xab\x20\x9e\x6b\x8b\x37\x4b\x27\xa6\xc5\x0f\x70\x48\x19\x9a\x9b\x1b\xe5\x3b\x68\x27\xba\x86\x6a\xf3\xbb\x5c\x79\x0a\xfe\x44\x2d\x1e\x9a\x67\xc3\x54\x56\x78\x85\xd7\xd8\x2e\xad\x85\x9a\xf6\x78\x08\x91\x18\xad\xad\xfe\xb0\x3f\x1e\xe5\xbd\x8c\x12\x4f\x50\x81\x5b\xe0\xe4\xdf\x90\x0f\x45\xa4\xd7\x8e\x11\xf3\x87\x57\x5b\x63\xaa\x44\xe3\x3a\xee\xd7\xf8\x1a\x09\x81\x01\xb8\x3d\x06\xc5\x8a\x77\x0f\x28\x1a\xca\x98\xe0\x0a\xd3\x26\x67\x31\x2b\x2b\x7a\x1d\x09\xb3\xe9\x2a\x18\x6e\x24\x1e\xa3\xbf\x31\x4a\xa9\x72\xc6\x7d\xdd\x2f\xbe\x30\xdd\x7f\xd0\xc7\x1c\xf1\xad\xae\x79\x1f\xe3\x41\x0b\x4e\xbc\xf0\xc2\x83\x89\xd8\xab\xb4\x01\x25\x45\x98\x57\x96\x20\xdb\x90\x31\xee\x79\x6b\x46\x51\x29\x7e\x18\xdc\x7f\x73\x98\xd9\xbe\x5f\x73\xe8\xc3\x43\x44\xb0\x7b\xcb\x46\x90\x4b\xda\xce\xd2\xc1\xe9\xaf\xe8\x90\x12\x19\xa8\xf1\x70\x9c\xc8\xc9\x8a\xda\x90\x73\x86\x4a\x0d\xe4\x63\xcf\xb0\x5f\xbb\x4a\x3d\x6a\xde\xe9\x66\xcc\xe4\xd6\xc4\xc4\x7d\xbf\xe1\x31\x64\x6f\xbd\xfc\x82\xb6\x16\x42\x93\x7a\x31\xe5\x7e\xcd\x10\xec\x11\xda\x89\x5f\xc6\x77\xdc\x7d\x7f\xe3\x1f\xb3\xf6\xa8\x70\xc6\x61\xae\x00\x7a\xea\xd1\x36\xfa\xfd\x51\x31\x1a\x9a\x21\x8b\x11\x25\x46\xc0\x4b\x8f\x54\x0e\x10\xab\x09\xa9\x3f\xa4\xfa\xbc\x78\xb6\xda\x28\x5e\x4f\xf9\x61\x06\xac\x7f\x57\xa8\x45\xb5\xe9\x7f\xc8\x16\xc0\x0e\x15\x3c\x87\x86\xed\x62\x60\x44\x1c\xb3\xd2\x71\x7b\x34\x36\x54\x69\xb5\x85\xe2\xda\x0e\x51\x79\x73\x2d\xf9\xd9\x79\x33\xc4\xa2\x21\xeb\x21\x74\xf9\x58\xed\xb4\xbd\x9d\x7d\xcf\xf5\xbd\x06\x63\x2c\x1c\xf4\x34\x2b\x0c\x47\x1b\x0c\xfb\x9b\x79\x17\xa8\xd5\xc6\xb8\x7d\x29\x1b\x41\x6e\xfb\xed\x16\x06\xed\xa8\x71\xff\x15\xa8\xcd\xb9\x39\x85\xf0\x80\xf8\xf6\x91\x56\xf3\x33\xc4\x72\x9e\x37\x42\x6c\xc0\x3f\x04\xe5\x69\x3d\x08\x33\xec\xea\x4e\x36\x4a\x31\x1a\xaf\x66\xfd\x64\x56\xc0\x74\x45\xa5\x4e\x80\x22\xfc\x32\xd2\x95\x90\xb9\xd5\x22\xf7\x68\x1b\x12\x79\x92\xde\x8e\xd1\x27\x08\xe0\x8b\x50\x8e\x6f\x67\xf6\x74\x9b\x20\xc6\xec\xae\x8a\x74\x7b\xd9\xfb\xcc\x92\xb7\xaf\xb6\x31\xfe\x89\x74\x97\x2c\x54\x4c\xc8\x73\x5a\x0a\x77\x1e\x92\x36\x79\xa5\x5d\xa1\x4e\xd4\x8c\x4c\xc4\x9b\x02\xe8\x3e\xa6\xe8\x9c\xeb\x2a\x8b\x64\x49\x05\xb2\x58\x23\xfd\x50\x38\xff\xf8\x98\x44\x2f\xed\xa0\x9f\x0b\xb7\x49\xf1\x71\x58\x87\x98\x59\x84\x37\x5e\x8b\x75\x1b\xa4\x88\x0e\x75\x3f\x2e\xa1\x30\xb1\x91\x34\xb0\x25\xaf\xb7\x6c\x84\x3b\x7b\x0a\x5e\x73\x9e\x77\xa9\x04\xd4\x4d\x09\xd5\x5b\xe9\x70\x78\x0b\xec\xb4\xed\x87\xd0\xa9\x83\x40\xb5\x9b\x1e\x81\xd4\xed\x94\x1d\x72\x27\xed\x41\xe9\x33\xf3\x92\x21\x06\x65\x99\xa2\x7e\x41\x30\x95\x01\x08\x1a\x16\x1c\xbc\xad\x67\x5f\xb4\x58\x1f\xba\x01\x78\x1a\x17\xe9\xea\x62\xaa\xf8\x17\xd1\x6e\x74\x74\x32\x0d\xf5\xce\xa4\xd9\xb2\xda\x63\xd4\x4c\xf1\xcb\x55\x2b\x01\x35\x21\x2f\xf5\x8e\xae\xcf\x0b\x3c\x0e\x7d\xc4\x04\x30\xc3\x6c\x0b\x8c\x2f\x94\x47\x1e\x8a\x89\x56\x53\xd5\xd5\x9c\xd2\x9d\xa8\xb9\x00\xc5\x2c\xe2\x6b\x1f\xa9\x75\x7f\xa4\x16\x45\xe1\x77\x3a\x90\x9c\x82\xfc\xac\xe2\xc6\x01\x20\xdb\x2d\x57\x28\x24\xdb\xe4\xc1\x97\xc5\x23\xf2\x09\xa3\x42\x8d\xe3\x96\x3f\xf7\xd5\xac\xa0\x77\xb9\x49\x36\x62\xec\xfd\x6b\x02\x5b\x6f\x0b\x80\x8f\x0c\x80\xfd\xa9\xa4\xb8\x50\x17\x16\xa9\x86\xef\xf6\xb7\x72\x51\x53\xfe\x09\xdf\xd6\x14\x64\x37\x8e\x25\x9c\x54\xad\x36\x76\xf4\x41\x5a\x14\x57\xfa\xc3\x8e\x0a\xef\x62\x7b\xaf\xf8\x4e\x72\x90\x0a\xc8\x19\x6b\x5e\xf2\x34\x67\x19\xe6\xbb\x43\x1f\xd8\x48\x80\xa1\x9c\x17\xcb\x80\x44\x4a\x54\x6d\xdf\xfb\x8e\x12\x88\x3b\x1f\xdd\xcd\x4c\x72\x68\x8a\x52\x2d\xd4\xf3\x56\xd4\x6a\xee\x62\xdc\x4b\xfa\xbc\xe2\x11\xbd\x60\x0a\x1e\x61\x27\x7d\x9f\x14\x66\x08\xd5\x68\xfb\xfa\x9a\x72\x85\xe0\x13\x51\xb9\xd6\x8e\xf1\xea\x31\xe7\x76\x69\xeb\x58\xd6\x87\xe7\x2a\x48\xf2\x52\xd7\xd5\xa9\xf1\x6a\x96\x43\x06\xed\xe7\xca\x6f\x6d\xdd\x04\xe7\x21\x73\xee\x45\x15\x45\x1a\x0f\xae\x73\xe9\xc3\x11\xc3\x5c\xe3\xa3\xc0\x55\x3f\x42\x4d\xf8\xc3\x70\x33\x5e\x92\x39\x57\x2d\x85\x1d\x37\x9f\xe7\x85\xe6\x45\x4b\x21\x1e\xb2\xb7\x2f\x7a\x6c\x35\xea\xd5\x89\x40\xe7\xb0\xbf\x9d\x6f\x98\xcb\x44\x00\x07\x61\xe6\x43\x66\xf1\x74\x8d\xd1\x83\xc5\x30\x23\x49\xdf\xf6\x51\x08\x39\x51\x2b\x25\xdc\xf7\xad\x73\x6d\x59\x38\xce\x29\x8b\x7e\xc8\xfb\x84\x08\x0b\xc8\x63\xd7\xa2\xbc\x3a\x75\x59\x84\xb5\x8f\x99\x4c\xa0\x11\x0f\x4e\x8d\xf1\x75\xd1\x0c\x38\xde\x6c\xf9\xce\xa0\x3f\x84\x43\x43\xcc\x71\xba\x19\xf1\xd7\xa7\x48\x44\x2b\xb5\x71\x8f\x02\x1c\x54\xa7\xa5\x88\xbe\xf7\x88\x2b\xd7\xd3\x55\x1f\x3e\x0f\xb8\xd8\xa1\x5f\x8a\x1f\x3a\xa5\x3c\x86\x44\x69\x87\x4e\x26\x46\xa3\xbc\xdb\x85\x44\xf1\xec\x04\x80\x99\xd4\xa8\x2e\x3c\x46\x00\xfa\x89\x63\xf6\xad\xce\x0d\x01\xc8\xe1\x3d\x2b\x21\x52\x36\x69\x81\x03\x60\x18\x28\xb1\x28\x0a\x53\xb5\xbe\x02\xa1\x5b\x00\xa6\x06\xd6\x29\xd1\x74\xe8\x00\x5d\x17\x27\x08\x08\x0a\xe9\x20\xf7\xd6\xf4\xf6\x06\x85\xa7\x30\x52\x6e\x85\x17\xe8\x6d\x6e\x49\x2e\xeb\xfa\x9d\xf2\x9d\xc5\xdd\x02\x21\x97\xe0\x91\xe0\x8c\x99\x8e\x93\x2a\xa9\x56\x03\x25\x3d\x00\x17\x6a\x26\x3a\x1c\xb0\x1d\xd4\xc0\x58\x14\x3e\xd1\xd4\x30\xe2\x85\x90\x7e\x5b\xbf\xf9\x65\xb5\xab\xcd\x19\x52\x4e\x72\x9f\xd9\xfb\x36\xe4\xef\x30\xac\xd9\x79\x8d\x22\x4f\x87\x7d\x35\x5f\x86\x3f\x44\x63\x05\xf1\xcb\x82\x50\x41\xf2\xd5\x40\x26\xec\xb4\x6c\x67\x0d\x61\x39\xe6\x21\x6b\xfc\xe3\xe9\xa3\x5e\x3c\xfd\xb2\xc0\xb7\x9f\x1a\x5c\x49\x47\x46\x6e\x2c\x9c\x1c\x63\x04\x1e\xfe\x64\x04\x7a\xd8\xdd\xbd\xaa\x9d\x5e\x16\x43\x55\x18\xd7\x5d\xe9\x3c\xd8\x3a\xf0\x37\xcc\xe5\x9c\x96\xe3\x26\xde\xea\x24\xc6\x5d\x31\xdf\x4d\x83\xf7\x20\x1a\x3f\xee\xa0\x4f\x1c\x77\x60\x1c\x97\x6e\xea\x78\xe8\x17\x95\xa8\x8c\x7f\xc9\x7a\x20\x21\x77\x74\x41\x3a\x52\x1d\xd2\xe7\x05\xe1\xa9\x6a\xdf\x5e\xfe\xb3\x45\x0c\xa3\xea\xe3\xa5\xa7\x5c\xde\xa7\xc8\xda\xe3\x61\x3e\xba\x0a\xc8\x7a\xd4\x6f\xf7\xbb\xc2\x95\xa1\xcd\x1e\xde\xab\x84\x38\xcd\x4a\xa9\x7e\x27\x35\xba\x68\x84\x6a\x5a\x33\xfa\x7d\xbb\x0f\x81\xd7\xff\x4a\xad\xf9\x37\xa0\x4e\x24\xc9\x5d\xb3\xbf\xa1\xf5\xb9\xd3\xb3\xa0\x45\xd6\x66\xbc\x8a\xd7\xdf\xd6\x6d\x84\x63\x8d\xb5\x2c\xa9\x1a\x30\xd2\xbb\x58\x1f\x17\xa8\x4a\xf8\x4b\xd4\x29\x2f\x25\xba\xf8\x83\x1d\xc2\xaf\x6f\x25\x69\xaa\xe1\x5f\x95\xb3\xa0\xba\x56\x10\x90\xb3\xdf\x4c\xe2\x1a\xc5\x03\x21\x26\xb7\xc9\xa3\x03\xc2\x88\x25\xbb\xd3\xb4\x3c\x62\x29\x46\xdb\x98\xb1\xbe\x67\x3d\x39\x6b\x0a\x14\x81\x38\xba\x81\xc9\x03\x3e\x25\xf5\xb0\x57\x90\xca\x66\x40\xae\xcb\x52\xaa\x46\x31\x17\xf0\xfa\xdb\xcb\x5a\xa6\xa3\xd1\x30\xdf\x18\x8f\x32\x95\x08\xf5\x77\xec\xb2\xfa\x10\xcd\x6c\xf2\x7b\x6d\x07\xdf\x95\x70\x75\x99\xa3\x2e\x9c\xb8\x9c\x2e\x4c\xc4\x6a\x03\x8c\xa3\xb2\x62\xb3\xb2\xcc\xe0\xf5\xdc\xd0\x9b\x33\x9c\x5d\xd8\xbc\x18\xf3\x29\xfc\x0b\xe1\x7e\xa4\x58\x2b\xf5\x34\x6f\xc6\x3c\xb5\xbf\xe0\xed\x1f\xda\x20\xcd\x13\xab\xce\xc4\xbd\x4f\x56\x18\xa9\x00\x65\x33\xc0\x3a\xc9\x3b\x54\x31\x48\x89\x29\x13\xaf\x3b\x79\xf7\x58\x88\x4d\x7e\x6c\x3a\xba\x67\x66\xb8\xb5\x11\x5c\xcb\xbf\x10\x63\x36\xc7\x04\x5b\x4b\x40\x02\x1d\x6e\xa3\x1d\x17\xb1\xc8\xd4\x79\x07\x58\xf1\x56\x91\xae\xff\xac\x48\x7e\xd4\x49\xce\xff\x48\x90\xd2\xce\x68\xd0\x22\xef\x96\xe5\xc8\x2f\x39\xff\xb3\x0b\xef\xa8\x8e\x84\x77\xa0\xc2\x82\x59\x67\xf8\x11\x11\x10\xfc\x76\x4e\x58\x5d\xd9\x07\xd7\x1d\x21\x6c\x56\x70\x12\xa9\xb9\x0b\xf4\x66\x4f\x8f\x3d\xc1\x72\x86\x7a\x47\x7b\xae\x24\x4f\x7b\xa0\x7d\x42\xb1\x88\x5a\xc8\x54\x1e\xe0\x6a\x42\xc2\x2f\x73\x3f\xd3\xbd\x6b\x20\x8a\x7c\xe2\xb1\x4e\x38\x73\xb4\xf8\xd8\xda\x1c\x62\xa2\x39\x25\xe9\xe8\x2e\x2d\xc8\x1c\xe3\xb3\x6b\xcf\x36\x3d\xe2\xd5\x1a\x75\x8b\x90\x7e\xa1\x10\x0d\xee\xcb\xbf\x9e\xfb\x55\x04\x2e\xbc\x75\x5e\x8e\xf9\x52\x3e\x80\xae\x2d\x48\xfa\xb9\x69\xeb\x1b\xd8\x94\x17\x4a\x02\x60\x2b\x21\xb8\x35\xb8\xfe\x03\xf0\xf8\xcf\x86\x97\xf3\xb6\xff\x1c\xe7\xb6\xba\x88\x59\xfd\x3b\x3f\xfa\x99\xbf\x56\xf3\x47\xdf\xea\x99\x22\x65\x60\x6b\x02\x41\x09\xd3\x46\x90\xc3\xfc\x8e\x90\xf6\x7c\xc0\x25\x71\x28\xf3\x89\x5c\x3b\xe9\x80\x9c\x8a\x61\xaa\xe9\x90\xaa\x4a\x4f\xbc\xf3\x89\x30\xfb\x2b\x50\xf1\x50\x8c\xae\xef\x43\x3a\x9e\xb8\x1c\x6d\x39\x9c\x9a\x7c\x8a\xbc\xa6\xc5\x4f\x6b\x99\x4a\xac\xe9\xb1\x33\x0b\xe3\xe0\x57\x3d\x85\xd8\x74\x9a\x12\x83\xad\x5a\x4f\x1a\x93\x2e\xab\x77\xb0\xfc\xd8\x97\xd4\xff\x5b\xf1\xc4\xbc\xc1\x5a\xc4\xc4\xd5\x84\x5b\x9f\x12\x2c\xf4\x90\x41\xd5\xaa\x15\x2f\xb3\x26\x2a\x48\x62\x82\x6e\xf2\x6b\x64\xb7\x35\x4e\xe6\xb4\x3c\x85\x0f\xbf\x7a\x14\x3f\x73\x49\x55\xca\x90\xeb\xbd\x72\xe1\x44\xf6\xd0\x01\x41\x15\x7b\x25\x17\x13\x34\xa7\x7c\x48\xc4\xef\xda\x02\xb3\x6c\x25\x96\x68\x41\x65\x69\xf8\xb8\x56\x29\x6f\x29\xf2\xf4\x3c\xac\xfa\x7b\x60\xa5\x4d\xbb\x94\xb8\xcf\x2d\xd2\x50\x57\x62\x16\x13\x8e\x21\x9d\xb2\x8e\xb3\x1c\x07\xaa\x0a\xa4\x37\xf5\x45\x06\x89\x32\x57\xba\xbf\xc5\xc9\x32\xc9\x17\x5f\x7c\x37\xc4\x33\x1f\xc4\xcd\x8a\xaf\x0e\x21\x53\xed\xa5\xc1\x9d\xd3\xc1\xc0\xe7\x80\x88\x4b\x55\x19\x34\xac\xd3\x3f\xb6\xbd\x4c\xa8\x16\xbc\x41\xae\x97\xd3\x15\x3a\xd8\x14\xf8\x0b\xda\x55\xe5\x09\xfe\xd0\xdf\xdc\xec\xe6\x3d\xc3\x3a\x61\xfa\x3d\x8e\x48\x20\x16\x5c\xe7\x31\xc3\x9c\x6c\x76\xb0\xbc\x40\xf2\x00\x9e\x25\xe8\x65\xb1\x45\xc6\x87\x90\xa6\xe9\x4c\x79\x94\x33\x12\x94\xa3\x1f\xc3\x0d\xe3\xd5\x3e\x51\xbc\x0b\x0f\x3d\x1c\x23\xb0\x0f\x3d\x5f\xdd\x05\x75\x75\x75\x3f\xda\xc2\x9f\x65\xb5\x55\xd7\x39\x75\x1e\x28\xfc\x0f\xfb\x7d\x08\x74\x00\x8e\xe8\xbe\xe7\x97\x45\x69\x94\x4e\x6a\x04\x7e\x37\x0a\x86\x14\xb4\x31\x2f\xa5\x1e\xcc\x05\x3e\xdc\x72\xe9\xe7\xd4\xf8\xce\xb3\x48\x06\x32\x47\x58\x19\xe5\x7e\x8d\xab\x18\x68\x6b\x8f\x50\x8f\x4c\x9a\x11\x59\x4b\x7b\x98\x0f\xc2\xaa\x0c\x58\xd4\xf7\x84\x1c\xea\xf5\xe6\x0d\x8c\x15\x8c\xf6\xdc\x69\x7b\x09\xfa\xb8\x32\x87\xca\xe4\xb5\x44\x18\x88\xdb\x45\xc8\xeb\x91\x27\x4c\x8c\x38\xfc\xfe\x55\xf7\xaa\x8a\xed\xa5\x4f\xea\xfc\xf9\x37\x75\xf3\x5a\x05\x80\x6a\x03\x9a\x91\x51\x6b\x63\x6c\xb8\x67\x83\x39\xe9\xe9\x2a\x70\x72\xdc\xd2\xae\xa5\xa6\xc2\x8a\x1e\x78\x4f\x58\x0f\x5a\xfb\x7e\xe0\xa3\x2f\x80\xab\x0f\x5d\x8c\x8e\x92\xef\xec\x7a\x74\x44\xb1\x6a\xce\x60\x41\xf6\xec\x4a\x67\x05\x0a\x5f\x10\x3c\x82\x09\x83\x14\x83\x0c\x4e\xba\x39\xa4\x0b\xc6\xfa\x51\x01\xf4\x1c\xba\x22\x55\x74\xb5\x58\xba\x9b\x4f\x6f\x7e\x33\x18\x62\x0b\x96\x1b\x0e\x60\x20\x03\xa1\xc0\x09\x1b\x6a\x08\xc4\xdc\xcf\x3d\x6b\xfa\x9f\xa3\xfe\xcf\x3e\xaf\xc7\x34\x82\x4c\xbe\x33\xde\xa1\x1c\xd4\xf9\x07\x59\xab\xbd\x9d\xb5\x2f\x41\x40\xd2\xd4\x2a\x0d\xbc\x9c\x89\x36\xfd\xab\x4e\xe9\x1c\xd0\xbc\xe9\xa2\x19\x8a\xf8\xe0\xfb\xde\xe0\xc4\x42\xf2\xf0\x16\x22\x3b\x1b\x4b\x01\x92\x62\x86\x28\xce\xcd\xc6\x0c\xa9\xfe\x5a\x69\xe5\x7e\xf5\xd5\x36\xee\x77\xad\xf4\x72\xbf\xd2\x93\xac\x31\x34\xa8\x76\x45\xd1\xad\x20\xbd\xf3\xe7\xdf\x8a\xb4\x10\xf9\xe9\xb9\x79\x24\x45\xfc\x5f\xff\x63\x60\x96\xb7\x35\xcc\x8a\xbf\x1e\x3d\xaf\x3a\x7b\x70\x10\xfc\x6e\x07\xe4\x31\xce\x9c\xff\xef\x6f\xe5\xa3\xec\x87\x67\x20\xfc\xf2\xcc\x85\xfc\xf5\x1f\x9f\x79\xde\x23\x9f\x39\xa6\x78\xa5\xb3\x7d\x60\xb3\x6a\x5d\x2f\x55\xdc\x71\xe4\xb8\x1d\xc6\x62\x5b\x77\x06\x22\xbe\x2b\xdf\xff\x0d\xe2\xe7\x87\x9a\x93\xa1\x2a\x50\x95\xa2\xe1\x52\x03\x67\xfe\xdb\x8a\x76\x60\x26\x0f\x10\x93\x71\x54\x88\x9c\x15\x7f\x34\x89\x53\x51\x96\x55\x19\x47\xb6\x0d\x09\xa4\xa9\x3b\x07\xa1\x6c\x8c\x47\x23\x30\x7e\x86\xc9\xab\x4b\x2a\xa3\xf8\x14\x85\xb6\x1a\x0b\xbc\x3d\x89\x5f\x8d\xf3\xa1\x91\x0a\xf2\xad\x1e\x70\x86\x94\xfc\x54\x1b\x04\xe6\x2e\xb1\x33\x25\x5c\x28\x7d\x07\xe5\x49\x14\x55\xbb\xb3\xc6\x13\x16\x9f\x82\xfb\x7c\x2c\x24\xe3\xd4\xc6\x19\x06\x67\x16\x3e\xf6\xea\xc9\x55\x44\x55\xa4\x13\xce\x14\xb2\x0a\x56\x90\x59\x59\x58\x6d\xa7\x83\x51\x7b\x3b\x8d\x88\xa9\x87\x88\xfb\x15\xb2\xe3\xc2\x27\x90\x72\xb8\xd5\xa5\x08\x11\xe5\x8f\xfb\x18\x4f\xe5\x44\xbc\xb2\xf7\x94\x02\xd0\xc9\x85\x95\x6b\x29\xb2\x91\x53\x8c\xae\x3e\x32\x78\xc7\xf0\xad\x4d\xb4\xb6\xf4\xae\x7d\x3d\x52\x89\xab\x2e\x2e\x74\xb2\x28\x21\xd3\xa3\x78\x38\xd7\xdd\x6a\x2a\x25\xbb\x95\x5f\x8d\xb3\xb1\x59\x7c\xd6\xdb\x82\xe7\xff\x19\xcb\x15\x13\xaf\xa0\xa0\x6b\xcd\x85\x48\xd0\x01\xc8\xb0\x83\x62\x6e\x70\xde\x47\x65\x50\xe4\xcf\xbe\x8e\x55\x34\x1a\x17\xde\x3a\x5f\x91\x77\x1a\x1a\x50\x15\x57\x1e\x11\x8f\xf9\x51\xcf\x6f\x07\x5d\x96\xb1\x11\xdc\x4c\xc0\xd9\xe0\xba\x7e\x0c\x88\xdf\xfc\xc9\x5b\x3f\x0f\xba\x44\x10\x3a\x7f\x21\x12\xf0\xa0\xca\x5e\xf0\xf7\x95\x90\x3e\x3a\xfe\x20\x95\x27\x55\x67\xd5\xe5\x27\x20\xf6\x88\xf5\x50\xbd\x0d\x48\x41\x86\xb1\x23\xb4\x36\x61\xf2\x0e\x39\xed\x5a\xd9\x67\x46\xa6\xcc\xd9\xe9\x06\x37\x74\xe4\xac\xa1\x20\x2f\x25\x67\x2f\x57\xe7\x29\x30\xc7\xf3\x37\x8b\xba\xdb\x7c\xd7\xde\xc4\x6c\xc0\xe1\xc1\x9b\xf6\xf2\x29\xb2\x6e\x19\xb5\xc6\xa8\x3a\xbf\x4b\xed\xdd\x4b\x33\x72\xf4\x5c\x00\x55\x87\x28\x2d\x4e\xfc\xf6\x69\xc7\xa0\x1f\xb8\xc1\xdf\xe1\x21\x3e\xc5\xa3\x02\x6c\x65\x04\xdf\x4a\x63\xf4\x4e\xbf\x0c\xde\x04\x9f\x93\x51\x1c\x61\x02\x65\x55\x6a\x1f\x94\x13\xad\x2c\x8d\x69\xc8\x5e\x55\xe4\x92\xf9\x1c\xc4\x50\xca\x86\x95\x64\xd7\xeb\xe8\x79\x33\x0d\xfb\x1a\xb6\xfd\x72\xce\x09\xd7\x65\x5d\x07\xf4\xc8\xa3\xfd\xa4\xfd\x72\x66\xea\x69\x38\x9e\x3a\x29\x83\xf3\xf2\x40\x59\x69\xe5\xa6\x84\xbe\x06\x14\x00\x50\x30\x7d\xa8\x12\x01\x46\x2b\xe2\xdb\x03\x24\x87\x9a\x16\x32\xc8\x56\xdb\xde\x8b\x78\x64\x06\x97\x33\x0f\x42\x32\x16\x38\x47\x06\x27\xd8\xcd\x37\xb3\x56\x25\xf0\xc3\x91\x83\xd8\x29\x6e\x8f\x46\x83\x82\xeb\xc5\x7d\xa3\xb8\xb6\x37\x2f\x5c\x78\xe7\x7c\x70\x4a\x4b\xc7\xaf\x9c\x9c\xbd\xab\x1c\xdd\x99\x17\x51\x17\x0a\x70\x26\x85\x4e\x45\xb1\x20\xfd\x99\xc7\xf3\x98\xbb\x68\xd7\xf2\x20\xe4\x16\xb6\x86\x94\xed\x32\x86\x62\xdf\xe0\x6f\xc1\x4d\x6f\x66\x1d\x08\xec\xcd\x3a\x2d\xe9\x5a\x21\xfa\x41\xe5\x51\x95\x40\xd3\x90\x03\x7b\xe7\xf9\x68\x29\x90\xbe\xf1\xd3\x0b\xba\xb9\xac\x1a\x8b\x91\x6c\xe7\x5b\xdb\x5d\xf3\xff\xa3\x38\x8f\x83\xac\xe8\x75\xd2\x71\x13\x6f\x77\xbd\xa4\x52\x59\xec\xe5\x86\x54\x1f\xab\x94\xa8\x19\xc0\x3d\x0d\x47\x07\xc5\x0c\x4a\x33\x31\x9f\xb8\xfd\x98\x47\x9c\xf8\x9e\xa3\x04\x8f\x35\x55\x9e\x43\xda\x2d\xf7\xff\x7c\xed\x3c\x50\x27\x6b\x68\xf8\x22\xf4\x99\x38\xe5\x8c\xd8\x6e\x57\xb4\x07\x32\xef\xae\x5a\x4b\xb9\x1f\x9f\x99\x2b\x7a\x9c\x6a\x3e\x18\xfe\x9c\x8e\x32\x37\x73\x89\x13\xbc\xe5\xab\xfd\xf9\xcc\xd3\x4e\x87\x90\xfe\xea\x77\xe0\xeb\x02\x6e\x36\xa4\x0d\x34\xcf\xf8\x8d\xd7\xbc\x85\xe5\x5b\x43\x89\xf6\x41\x6e\xe6\x1b\x9c\xe6\xf8\x1c\xe9\x10\x89\x41\x7d\x54\xe5\xca\xa9\xef\x70\xd8\x57\x8c\x90\x7a\x88\x5f\xe3\x53\xdc\xb3\x76\x9d\x6a\xe9\x39\xf8\xf1\x8f\x2e\xcd\x80\xc3\x20\x08\xa1\xdd\x7e\x2f\x5b\x75\x60\x2f\x78\x1e\x52\x58\x07\x89\x8e\xfc\xe7\x0b\xc3\x63\x15\xc4\xef\x36\x7a\xc5\x38\xea\x8f\xcc\x8e\xe1\xa7\x1f\xd7\x05\xd1\x9a\x3f\xbe\xd4\x2e\xe3\x4a\x61\xb6\x94\xba\x78\xea\x47\xdd\xb3\xa2\x29\xd4\x2d\xc3\x93\x92\x24\x2a\xcd\xf6\xb0\xdf\xf3\xdc\x69\x12\xf8\xc5\x7e\xd6\xac\x9f\xfc\x56\x18\x7a\xdd\x19\x53\x7a\xcd\xc9\xfc\x7a\xe9\x67\xfc\xb6\x3d\xb3\xf7\xe1\x80\x12\xf1\xc4\xf7\x53\xe3\x18\x70\xb6\x2d\xb1\xda\x45\x7f\x5c\xd8\x72\x17\x10\x19\x61\x63\xfd\x82\xc6\xd9\xfb\x59\x7b\xec\x42\xd7\x62\xbe\xf9\x55\x15\x29\xe4\x15\xb5\x93\xf5\x49\x95\x2e\xba\xb3\xdf\x68\x9b\x2d\xc9\x9a\x1f\x11\xdd\x32\x28\x55\x7a\xc5\x93\x9b\xdb\x03\x01\xe5\x1c\xa5\xa3\xe1\x37\x28\x15\x63\xe8\x92\x62\x6b\xf7\x60\x27\xa6\xd3\x95\xc4\x38\x92\x2d\x86\xfe\x44\xed\x9b\x9f\x2b\x67\x12\x77\x7c\x3f\xb0\x03\x60\x91\xa4\x4e\x36\x02\x96\x35\x5a\x01\xc6\x5a\x57\x6a\x04\x61\x19\x08\x24\x4c\x4c\x6d\xf3\x59\xa9\xf2\xa4\xa8\x06\x45\xd6\xcd\xda\x98\x31\x9c\x2b\xb0\x90\x72\x4d\xf4\x92\x9f\xda\x86\xe6\x3c\x55\xd3\x6f\xfd\x86\x7e\x5c\x0c\x95\xad\x4d\x6c\x1e\xe0\x99\x1d\x24\xef\x91\xc6\x97\x86\x42\x07\x6c\xc3\xdc\x90\x1c\x22\x56\x86\x60\x34\xb5\x56\xb6\x92\x51\x67\x60\x9d\x2b\x09\x25\x6e\x3b\x0f\x34\x80\x8e\xb0\x27\x2f\x3d\x92\x85\x62\xc9\x31\x6a\x6d\x9a\xfe\xad\xf5\x62\x3c\x7a\xe2\x40\x1f\x5b\x04\x0c\xe5\x6b\x7f\xb0\xfe\xf3\x41\xb3\xb2\x41\x17\xc3\xef\x67\x16\x8a\xaf\x93\x5c\xdf\x6b\x3d\x1e\x67\x98\x83\x0a\x4f\xfb\xa2\x14\x1d\x40\x0f\x59\x65\xeb\x3d\x7a\xae\x9c\x3c\x5f\x97\xac\xcb\xab\x9e\x99\x9c\x2d\xa0\x76\x66\x63\x98\x71\x82\x7b\x70\xb5\x15\xe7\x55\x3f\x8f\xca\xc2\x41\x81\x25\xe3\x8a\xc3\x67\xdf\x7d\xf1\x62\xe1\x55\xeb\x76\x33\xbe\xfb\x83\x8b\x66\xd2\xb3\xef\xfe\xf0\x22\x4d\x4b\x35\xdd\x78\xda\x27\x8c\x0f\x40\x8b\x4d\x93\xa9\x8e\x66\xcc\x17\x8a\x61\xfb\x85\x70\x08\xae\x5c\xad\x9a\xc1\xc7\xff\x26\xe3\xd3\xf9\xa0\xcf\xe2\xfa\x7b\x2e\xdc\x9f\xc7\x77\x19\x6a\x0c\x13\xa5\xce\xe5\x05\x72\x72\x7c\x01\x4e\xe8\x6c\xf1\x77\x38\x27\x8c\xf7\x5e\x03\x6b\xf6\xda\xf1\x9e\x20\x83\xf1\x7d\xc6\xa3\xda\xbf\x76\x40\xca\xc9\xea\x14\x2b\xd3\xef\xbe\x50\xda\xb9\x57\xc9\xf8\x3d\x0d\x22\x7e\x9d\xf5\xb2\x5a\xd5\xd8\x9b\x07\xc6\xa9\x3f\x0f\x7f\x16\x7d\x2c\x7f\x9b\x59\xf8\x94\x82\x69\xd4\x6d\x26\xec\xdf\xb7\x6b\x93\x03\x7f\xdf\x7d\x19\xc0\x84\x28\x69\xb9\x98\xa7\xcc\x70\xea\x7c\x52\x8e\xa2\xf3\x25\xed\xa2\xa2\x89\x26\x5e\xe9\x92\x76\xb2\xe1\x56\xe4\x8e\x40\x35\x76\x44\x89\xbc\x8e\xe8\xc1\x1d\x22\x4e\xbd\x0e\xf9\x0f\x57\x58\xfc\x68\x98\xf6\x8a\x4d\xae\x5b\xe2\x9e\x33\x08\x2e\xd7\x6b\xb1\x02\xbd\x5d\xf7\x70\x77\x7d\x44\xc1\x78\x02\x8b\x45\x8f\xd2\xad\xd8\x6b\x2d\x6d\x4d\x21\x6f\x95\xf8\x6a\xf1\x55\xfe\x60\xd1\x93\x55\x28\x01\xca\x40\xb6\x08\x35\x14\xd5\x2a\x92\xf3\xeb\xac\xc3\x51\xc5\x13\xd8\x71\x50\x9c\x01\xa0\xd6\x61\x50\x44\xce\x20\xcd\x51\xbf\xdf\xbd\xd8\x48\xb7\xcc\x91\x50\xe1\x1b\xf3\xa4\x1a\x9b\xc3\xfe\x0e\x66\xec\xf6\x4b\xca\x61\xc2\x37\x9b\x38\xac\x41\x0d\x4a\x97\xbd\xfb\xc5\x62\xfd\x45\xca\xe7\x0d\x25\xe2\xb0\x90\x8b\x41\xa5\x8d\x17\x77\xcc\xcf\xa4\x6e\x26\x0f\x40\xfc\x71\x1b\xda\x62\x3f\xfc\xb3\xb3\xfe\x22\x25\x3a\x83\x22\x25\xf0\xc3\x15\xf8\x81\x8a\x54\x92\xed\x13\x47\x32\xd4\xf4\x45\x3a\xd3\xeb\xf3\xbb\xf3\x8f\xf0\xc7\xab\xf0\x13\x18\x54\xf7\xe0\xcf\x22\x33\xcc\x67\xa7\x58\xd7\xeb\x48\xf0\x98\x5f\x4a\xe0\x5c\x3b\x8d\x9d\xbc\x07\x6e\x87\xeb\x6e\x49\xfe\xf7\xed\xfe\xd8\x08\x66\x50\xf0\x11\x97\x57\x52\xb5\xbd\x46\x27\x85\x8c\x2f\x14\x74\x7a\xe0\xf7\xb8\x92\x65\x90\xf9\xc4\xad\xf6\x93\x60\xc6\x7e\x6f\xb4\x8d\x13\xf2\xba\xc1\xba\xe8\x37\xb9\x9a\xa1\x8f\xf9\x11\x7a\xb7\x78\x5f\x86\xe9\x95\x56\x6c\x53\xf8\xa1\xba\x17\x73\xa7\x9d\x61\x7f\xf0\x81\x11\x63\x2e\x36\x3a\xd9\x66\x3a\xee\x42\xf2\x89\xa2\x50\xb9\x07\x31\xe2\x18\x18\x59\x72\x17\x91\x84\x35\x66\x6d\x77\x28\x67\x9a\x78\x98\x1c\x96\x54\x78\xec\x44\x3c\x4f\x58\x37\xaf\x02\xe0\x4b\xac\xa9\xc1\x25\xa4\x5a\x79\x6f\x30\x16\xc3\xb8\xab\x4d\x6c\xab\xf4\x49\xaa\x29\xea\xfb\xb8\xf4\x33\xe6\xb8\x54\xbd\x18\xd4\x8b\x1e\x29\x10\xb3\x88\xd6\x7a\xa8\x4c\xb9\x01\x22\xc8\x9f\x95\x81\x42\xe9\x5a\x9e\xfb\xa7\x7f\x42\x09\x37\xff\x20\xfb\xe7\x7f\x36\x82\x4c\xf9\xe9\xf3\xba\xee\x24\xa6\x3d\xe6\x2a\x59\x15\x01\xb8\x6a\xf9\x30\xa3\x19\xc1\xf9\xef\x83\x01\xa1\xcc\x15\x26\xeb\xa4\xa8\xa0\xc0\xd3\x4a\x6a\x7a\x36\xfe\xff\x00\x00\x00\xff\xff\x0c\x8c\xf9\x03\xbb\x4c\x01\x00") - -func confLocaleLocale_ruRuIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_ruRuIni, - "conf/locale/locale_ru-RU.ini", - ) -} - -func confLocaleLocale_ruRuIni() (*asset, error) { - bytes, err := confLocaleLocale_ruRuIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_ru-RU.ini", size: 85179, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_srSpIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\xbd\xeb\x8e\x1c\xc7\x99\x28\xf8\xbf\x9e\x22\xc5\x01\x21\x0a\x68\x96\x20\xfb\xec\x05\x82\x5a\x5e\x59\x9e\xb1\xbd\xc7\xb2\xb5\xa6\x8c\x59\x40\x20\x4a\xd9\x55\xd9\xdd\x69\x56\x57\x96\x2b\xab\x48\xb5\x06\x03\xb0\xd9\x96\x48\x60\xf7\x87\xcc\xf1\xac\x29\x52\x24\x2d\x6b\x67\xcf\xfc\x2c\x92\x5d\x64\xa1\xaf\xaf\x50\xf5\x0a\xe7\x49\x36\xbe\x5b\xc4\x17\x91\x91\xd9\xd5\x94\x0f\xce\x19\x8b\x5d\x19\xf7\xf8\xe2\xbb\x5f\xd2\xe1\xb0\xd3\xcb\xca\xee\xfa\xe2\xde\x62\xb6\x38\x58\x9c\x2c\x4e\x97\x7b\xcb\x3b\x8b\xe9\xe2\xb9\xf9\xbf\x93\xe4\xe7\xf9\x38\x59\xee\x2d\x66\xcb\xdb\xe6\x87\xf9\x72\xaf\xd5\xda\x2e\x76\xb2\xf5\xc5\x53\xd3\xee\xae\xf9\xf9\x8e\xe9\x31\x6d\xf5\xd2\x72\x7b\xa3\x48\x47\xbd\xf5\xc5\xc3\xc5\xe9\xe2\x64\x79\xc7\xb4\x3f\x5d\x1c\x99\x8f\xf3\x64\x71\x06\x23\x99\xd1\x8f\x5a\xd9\xe7\xc3\x7e\x31\x82\xee\xe6\xfb\x6c\xf1\xc2\xb4\x30\x93\xb6\xb6\xb3\xfe\x10\x87\x5c\x1c\x9b\x61\x1f\xb5\xca\x7c\x6b\xd0\xc9\x07\xd4\x6c\xbe\x7c\x80\xab\x99\x9b\xb9\x66\xc9\xe2\xbb\xc5\x8c\xbe\x17\x93\xf1\xfa\xe2\xc9\xe2\x80\x3f\x4f\xe9\xd7\x89\x19\xe8\xaf\x38\xf4\x1c\xf6\x61\xfa\x4f\x97\x5f\xd1\x18\xad\x51\xb6\x95\x97\xe3\x6c\x54\xdf\xe2\x56\xb6\x51\xe6\x63\xb3\xbe\xfb\xa6\xc1\xb3\xab\xf2\x1d\xb6\x61\xda\x4c\x5b\x37\xb3\x51\x99\x17\x03\xfc\x6e\x3e\xbc\xe2\x6e\xc3\x74\xcb\xf4\xf9\x2e\x68\x3c\xce\x76\x86\xfd\x14\x46\xfb\x4f\xf3\xeb\x33\xb3\x57\x73\x32\xad\x7e\x3a\xd8\x9a\x60\x7b\x38\x70\x33\xc2\xe2\xb0\xd5\x1d\x65\xa6\x5d\x67\x90\xdd\x32\xe7\x87\x27\x33\xc7\x65\x3d\x68\xb7\xdb\xad\x49\x99\x8d\x3a\xc3\x51\xb1\x99\xf7\xb3\x4e\x3a\xe8\x75\x76\xec\x09\x9e\x2e\xff\x68\xfa\x1f\x25\x8b\x43\xf3\x4f\x38\xa9\x3d\x98\xdc\xfc\x35\x4d\xe0\xdc\xe5\x26\xcd\xc4\x78\x38\x59\xcf\x1c\x6a\x27\x2d\xbd\x73\x5d\x7e\x63\xa6\x83\x6b\xc2\xc6\x33\x18\x6b\x6a\xda\xe3\xb4\x83\x14\xae\xfa\xa1\x1e\xdc\x5c\xba\x99\xcc\x0c\x6f\xae\x6a\xd6\xca\x76\xd2\xbc\xbf\xfe\x8f\x57\xcd\x15\x9f\x2e\xef\xc1\x64\xe6\x2c\xca\xf2\x56\x01\x90\xf0\xc8\xec\x17\xf6\x77\x02\x43\x9a\xc3\xef\x8c\x77\x87\x66\xb8\xef\x01\x16\xcc\x60\x7c\x9f\x67\x70\x2a\xe6\xff\x9e\x9b\x49\xbb\xe9\x70\xdc\xdd\x4e\xd7\x3f\xa4\xff\xb6\x4c\xa7\x61\x61\x2e\xa4\x18\xed\x9a\xe3\x5d\x9c\xe1\xd1\x1c\x9b\x9e\x30\xd5\xac\x55\x8c\xb6\xd2\x41\xfe\x45\x3a\xc6\x2b\x79\x62\xbe\xbe\xa0\xe3\x37\xd3\xba\x3b\xdd\xc9\x47\xa3\x62\x04\xa0\xc2\xe0\xc6\x27\x62\x4e\xbb\x03\xe3\xaf\x2f\x1e\xd3\xf4\x00\xe7\xe1\x14\xd0\x68\x27\xdf\x1a\xe1\x35\x52\x3b\x73\xb6\xe6\xfb\xe2\x85\x07\x38\xd4\x8e\x26\x92\xe1\xcc\x7f\xaa\x33\x6e\x16\xa3\x1b\x6a\xa4\x17\x0c\x31\xd3\xea\xe4\x34\xa8\xd9\xa3\x6a\x7e\x5a\xb7\xc7\x74\x60\x40\x8a\x1a\x7f\x8f\xe3\xd0\xcd\x4e\x97\x0f\xe1\x8c\x6b\xba\x99\xa9\xa6\xad\xb4\xb7\x63\x80\x62\x98\x0e\xb2\xfe\xfa\xe2\x6b\xb3\x56\xd8\xdc\x89\x7a\xb4\xd0\xa6\xdb\x2d\x26\x83\x71\xa7\xcc\xc6\xe3\x7c\xb0\x55\xd2\x5b\x3d\x30\xd7\x78\x8f\xde\x9e\x99\xc6\xac\xee\x84\xf6\x09\x53\xb5\x1a\x9b\xb6\x76\x8b\x89\x85\x69\x78\x4c\xd3\xe5\xbd\x04\x97\xcd\x10\x4d\x0d\xdc\x18\xd8\x02\xa6\x38\x8b\x0c\x66\x96\x37\xce\x6f\xe6\xe3\x3c\x2b\x61\x07\x87\xe6\xec\xe6\xe6\xa3\x60\xb2\x79\x6b\x38\xe9\xf7\xcd\x55\xff\x61\x92\x95\x63\xd3\xe4\x2f\xa6\xdf\x97\x70\xbb\x80\x54\x12\x38\x10\x3c\x7c\x78\x6f\x74\x60\xad\xbc\x2c\x27\x30\xd8\x9f\x11\xea\x0f\x97\xfb\x08\xae\x0f\xcc\x17\x03\xa2\x83\x2e\x9c\xd4\x13\x33\x00\xbc\x94\x97\x66\xfc\xd6\xa7\xf9\xa0\x1c\xa7\xfd\xfe\xf5\x16\xff\x63\x7d\xf1\xc0\x20\x41\x79\x7d\xee\x9e\xc6\xf9\x18\x36\x5c\xf9\x88\x6f\x60\x26\xef\x78\x6a\xfe\x3b\xa3\x85\xe1\xa1\x3c\x87\x33\xa5\xbd\x1f\x02\x88\x40\x4f\xdc\x79\xaf\xe8\xde\x30\xc8\x01\xd0\x27\x60\xb5\xaf\xe9\x69\xba\x76\x8f\xb0\xed\x2c\xf9\x79\xb1\x55\x26\xcb\x7d\x33\xeb\x3e\xf6\xbd\x9d\xfc\x0c\x7b\xae\x01\x28\x03\x9a\x86\xd7\x7c\x2a\x37\x70\x17\x9f\xa6\x39\x0d\xec\xfb\x5e\x9a\x8c\xd3\xd1\x56\x36\x5e\xbf\xd4\xd9\x30\xc8\xeb\xc6\xa5\x64\x7b\x94\x6d\xae\x5f\xba\x5c\x5e\x7a\x1f\xe1\x72\x06\xc7\x07\xd7\x81\x93\xbd\xf7\x76\xfa\x3e\x41\xcf\x4b\x03\x80\x73\x7a\x09\x08\xd9\x09\xc2\xd3\x0b\x78\x68\x00\xdf\xa7\x16\xe3\x3c\x83\x2b\x97\x9f\x79\xcf\x40\x0a\x10\x2f\xc1\xea\x10\xb4\x12\x7a\x56\xcb\x07\x49\x80\x96\xe7\x6f\xb4\xe0\x72\x0d\xde\xee\xf4\x36\x88\x98\xc1\x86\xaf\x2e\xf7\x13\xb8\x33\x3c\x10\xec\x60\x50\x3a\x40\x45\xf2\xd1\xee\xb5\xff\xe3\x57\x6b\xc9\xc7\x45\x39\xde\x1a\x65\xf8\x6f\xf3\x3f\xa6\xff\x8f\x13\x9e\xef\x93\xfc\x67\x3f\x6d\xb7\xcc\x68\x7c\x61\x51\x70\x7f\x66\xfe\x78\x65\x60\x02\x9a\x21\x66\xfb\x9b\xe9\x7d\x66\x7f\x17\x60\x9d\xe2\x45\x03\x0a\xdc\x36\x13\xae\x2f\xfe\x83\xe0\x12\x11\x6c\x80\x5c\x0d\x29\xa8\x43\x9f\x66\x12\xc2\xc6\x0f\xe0\x60\x1a\x26\x31\x0d\x05\x1e\x0c\xa0\xd3\x5e\x15\x81\x80\x07\x81\xa7\x8e\xaf\xe4\x2c\xc1\x7e\xcf\xe8\x9d\x27\xbf\x1c\x0c\x8a\x9f\xfd\x14\xaf\x13\xbb\x98\x81\x89\x10\x3d\x04\xbc\x94\x4c\xc6\x9b\xff\x6b\x67\x2b\x1b\x64\xa3\xb4\xdf\xe9\xe6\xed\x56\x59\xf6\x0d\x35\xea\x65\x44\x50\x5f\x02\x18\x25\xd7\xae\xfd\xca\x6c\x62\xbc\x0d\x44\xc6\x40\x5b\xab\xfc\x43\x1f\x6e\x46\xd6\x84\x3f\x26\xbc\xe2\x53\x7c\x85\x0e\xd8\x71\x53\xe6\xda\xc2\x4d\x25\x06\x99\xdd\x66\x68\x89\xdd\x54\xf2\xde\xc6\xe8\xfd\x90\xb0\x4c\x0d\x1c\xed\x01\x74\x23\xd0\x13\x23\x42\x93\xc3\xbb\x3d\x10\x6c\x82\x2f\x05\x7b\x3a\xea\xe7\x71\x3c\xed\x56\x36\x1a\x75\x0c\x2d\x1f\xef\x02\x7c\xa9\xbd\x25\xb4\x36\xba\x8a\x79\x75\xd5\x91\xa5\x26\xf4\xce\xe1\xd5\xbd\x64\xd0\x87\x8b\x48\x18\x67\xbf\x02\xf8\xa4\x09\xf3\xc1\xcd\xb4\x9f\xf7\x0c\x04\xae\x7a\xf5\xb1\x09\xf0\x65\x1e\x98\xb1\x5f\x62\x3b\xa0\xf2\xf8\xd8\x9f\xe1\xb3\x9f\x25\x97\xda\x97\x80\x55\xb8\x74\xf5\x52\xbb\x35\x28\x3a\x44\x0c\x80\xc9\xe8\xe5\x65\xba\x61\x18\x0e\xe2\x99\x46\x4c\x63\xef\xd3\x5b\x74\x13\xd0\xa1\x21\xf6\xc2\x9f\x5e\x98\x73\x79\xc4\x7b\x62\x16\x2f\xe0\xb2\xe0\x7a\x0f\xe4\xf1\xc3\x5b\xba\x5d\x21\x1f\x09\xde\x0f\xd2\x21\xd5\xfb\x0e\xe1\x46\x7d\x1d\x42\xbb\xa2\x4f\xa6\x71\x94\x15\xee\xc1\xcc\xd4\x12\x60\x67\x34\xf0\xc4\x7c\x16\x1c\x15\xc3\x08\x06\xe4\x10\x99\x1e\x5a\x94\x3f\x6b\x01\x83\xed\x5d\x5f\x53\x23\xfb\x4c\x02\x58\x06\xcc\x77\x00\xff\x98\xd3\x18\xcf\x91\x1e\x9a\xeb\xfd\x23\x60\x41\xc4\xd6\xf4\xb2\xef\xd2\xbe\xe2\x04\x7f\xf6\x06\x32\x54\x3e\x08\xc3\x5d\x30\x7a\x98\xd5\x31\x22\xb6\x97\x5d\xdf\x77\xcc\x08\x61\xc3\x97\xd8\x8f\x25\x85\xa0\x6f\x02\x44\xc8\x9d\x2f\xc0\xe3\xf2\xae\x21\x45\xcf\x85\xed\xd9\x67\xbc\x6e\x50\x07\xa3\x9b\x19\x92\x70\xc2\x57\x06\x5c\xcc\x24\xfb\xed\xd6\x68\x62\x78\xfb\x28\xc6\x94\x2f\x76\x6d\x41\x03\xbc\x65\xba\x73\x38\xbd\xa9\xbb\x67\x82\x8a\x7d\xc0\xd9\x88\x19\x60\x2d\xcd\x27\x91\x08\xc3\x50\x21\xc6\x44\x64\x0d\xcd\x28\x0c\x4b\x3c\x00\xd6\x81\x29\x18\xff\xe2\x6e\x96\xef\x69\x46\x44\xed\x77\xbf\xfd\x55\xc2\x4f\x14\xee\x1b\x31\x10\x0a\x0a\x84\x79\xe9\x3a\x69\x15\x40\xdc\xaf\x5d\xfb\x05\xa0\xdd\xed\xce\xb0\x18\x8d\xd7\xcd\x5f\x44\xdd\x6e\x03\xa2\xe5\x5f\xed\x4c\x7f\x42\x6a\xfe\xc0\xb6\x60\xa4\x6e\x00\x61\x1e\x10\x04\x18\xd6\xe1\x3c\xf3\xbf\xed\xc4\x30\x38\x22\x06\x0a\xa3\xee\x30\x54\x42\xe8\xf3\x19\xf7\x8f\x61\x00\xc4\x78\xb8\xda\xed\xf1\x78\x48\xcb\x45\xa1\xd1\x2c\x24\xf9\xc5\x27\x9f\x7c\xec\x7e\x6f\x5c\xb0\xdb\x3a\xaf\x1d\x19\x80\x47\xf1\x87\x84\x57\x06\xf8\xfe\x1e\x5d\x73\x1b\x1f\xd6\x64\xd4\x5f\x0f\x8e\xb9\xe1\xad\x9a\xd6\x76\x41\x4f\x08\xca\xcf\x94\x4c\x7c\x88\x30\x1b\xb9\xc3\x57\x74\xbc\xea\xee\x88\xf7\x76\x1b\x80\x5d\xbf\x0d\xff\x73\x4d\x38\xad\x3b\x00\x44\x88\x89\x09\xb2\x4e\x18\x6b\xc9\x2a\x01\x5c\x93\xc5\xcc\x89\x57\xb3\x76\xab\x5f\x6c\x75\x46\x45\x31\x8e\xbc\xe2\x97\xe6\xdf\xb7\x19\x8d\x4e\xfd\x86\x76\x4b\x7f\x8e\x3f\x31\x23\x89\x20\x82\xa9\xbc\xd6\x13\x7a\x34\x04\x87\x15\xaa\xed\xcd\x68\xf0\x65\x31\x04\x3a\xe1\x10\xe6\x63\xa4\xc2\xb7\x59\xb3\x50\xc3\xbf\xa3\x10\xd9\xc4\x69\x69\x6a\x1c\x1e\x48\xab\xdc\x31\x60\x84\x9c\xd5\xb5\x8f\x3e\xf9\xd8\x83\x62\xfa\xb6\x39\x2a\x76\x50\x51\xe0\xfe\x54\x1c\xb3\x82\x08\x3d\x6c\x62\x5f\xfe\x34\xf9\xed\x3f\x7d\x98\xfc\x4f\x3f\xfe\xd1\x8f\x12\x06\x82\x13\x3c\x87\xdb\xa6\xeb\xbe\x79\x27\x7f\x83\x93\xaf\xd2\x91\x69\xfd\xc8\xf4\x36\x0c\xea\x86\xf3\x47\x84\x64\x10\xcf\x25\x22\x0f\x97\x92\xf7\xf0\x38\xfe\xb7\xec\xf3\x74\x67\xd8\xcf\xda\xdd\x62\xe7\xfd\x76\x0b\x7e\x32\x18\x8e\x10\xa0\xb7\x68\x1c\xd7\x4c\xfa\x0d\xf0\x2d\xa8\x76\xe0\xb6\xb5\x54\xb1\xda\x43\xf4\x22\x9d\x6e\x31\xd8\xcc\x47\x3b\x40\x7e\x0e\x97\xdf\x98\xbb\xbd\xcb\x6c\x0d\x90\x6a\xda\x71\x0d\x55\x37\x17\x81\xb7\x38\x28\xc6\xf9\xe6\x6e\x64\x80\x7b\x74\x74\x20\x4e\x11\x2b\xff\x8c\x45\x06\x3c\x14\x84\x03\xb3\xb9\x9b\x19\x48\x7d\xa3\x9b\x79\x37\x5b\x09\x20\x66\x8c\xd7\x13\x38\x12\x03\xc7\xb0\xae\x2f\x13\x94\xd7\x8e\xf0\xcf\x69\xab\xd8\xdc\xec\xe7\x83\x8c\xf9\xd4\x27\x1a\x47\x25\x4c\xbd\x80\x6d\x65\x75\x97\xa5\x68\x33\xaf\xa3\xc1\x53\x43\xd0\x2c\x3d\x40\x71\x50\x36\xf6\xe1\xcf\x7e\x9d\x98\x7f\x4c\x81\xc6\xcc\x91\x92\x91\xe4\x02\x34\x17\x28\xda\xc1\xf2\x21\xd2\x35\x37\xcd\x72\x7f\x0d\x16\xff\x3c\xf6\x98\xe8\x4e\xe1\x41\xe1\xcd\xfa\x2f\x11\x49\x23\x9d\xf8\x7c\xf1\xcc\x6c\x4d\xa8\x83\xf9\x74\x84\x58\x64\x8a\xda\x36\xc3\x3c\x0a\xe7\xb6\x35\x4a\x6f\xa6\x46\x74\x0b\x57\xed\x4e\xc7\xac\xf8\xe7\xdc\xa8\xd2\x2b\xbe\x63\x69\x9e\x58\x12\x0a\x0f\x1f\x64\xba\xe5\x7d\xe2\xa2\x13\xd9\x3d\x7c\x74\x9b\xa5\xbb\x43\xd9\xb3\x82\x65\xe8\xa9\x99\x05\xbd\xb2\xb8\x06\x94\x57\x8b\x03\x2d\xe8\xcd\x22\x4a\xae\x76\x6b\x33\xeb\x65\xa0\x9b\xe9\x75\x78\xd5\xfd\xa2\xb8\x01\xcb\xf6\xef\xf9\x9f\xa4\x59\xf2\x01\x36\x2b\x93\x5f\x61\xbb\xba\xfe\xb2\xf9\x27\x01\x4f\x3b\x4b\x6c\x87\x24\xe5\x91\xa8\x87\xa3\x88\x4a\x8f\xa6\x28\xac\x3c\xf9\x19\xc2\x32\x31\xa2\xa4\xa4\x98\x7b\xe8\x8d\x30\x24\x6a\x41\xcd\xed\xf4\xf3\x0d\x3e\x70\x77\xad\x3e\x43\xee\x5f\x0f\x12\xe1\x57\x4c\xb4\xf7\x40\xdc\xaf\x65\xc2\xa3\xe3\xc9\xbe\xff\x02\x32\xa1\x03\xb0\xd5\x47\x0d\x2e\x09\x55\x1b\xe6\x46\xd7\xe8\x78\x98\xa4\x9d\x36\x71\xe6\xf3\x44\xce\x3c\x61\xd1\x6c\x2e\xc7\xa5\x15\x4c\x86\x10\x66\x03\x5c\xbf\xe8\x0c\x3d\x94\x23\x0a\x44\xbf\x8d\x6c\xef\x6f\xb8\xb5\x97\xae\x9d\x83\xe5\x39\xd2\xe3\xe3\x5a\x2c\x17\x85\x42\xd4\x3e\x8c\xb2\x0e\xab\xad\x3b\x37\x73\x50\xe4\xca\x7a\x1e\x31\xcf\x28\x3a\x27\xa5\xd8\x11\x15\xec\xbe\xfa\xcd\x6a\xc5\x43\x35\xc7\x34\x3a\x8f\xec\xe9\x3b\x39\xda\xb3\x88\x6a\xb7\x7a\x2b\xea\x94\x11\x70\xcd\xd5\x12\xfd\xf7\xe7\x9c\xad\x31\xf7\x83\x7c\xee\x1c\xe9\xc5\x9c\x9f\x2f\x02\x29\x8c\xf4\x8c\xfa\x5a\xfe\x9e\xd6\x71\x44\x14\x87\x99\x1a\x6f\xb7\x6d\x56\x3a\xb2\x7e\x8f\xed\x0f\x8f\x65\x50\xba\xee\x19\xaf\xcc\x07\x82\xd9\xaa\x62\x22\x4b\xbe\x08\x7b\xc1\x95\x91\x7e\xe3\x97\x3f\x4b\xd6\x93\x77\x78\x2f\xb5\x82\x81\xf0\x8a\x35\xf3\x20\x39\x43\xf2\xc1\x3a\x57\x1a\x49\x36\xd8\xa4\x3d\x52\xca\xd2\xc6\x8d\xf0\x50\xe7\xaa\xe2\x1b\x65\xe1\x16\x53\x76\xf5\xfd\xa9\xa3\xea\xc2\xe1\x1f\xb9\x2e\x06\x41\xd0\x80\xa4\xe1\x6f\x62\x94\x68\xed\x70\xb2\xd5\xb5\xb3\x3a\xb4\xb3\x55\x80\x16\xf7\x7b\x54\xb3\x3a\x5e\x7a\x8e\x32\x53\x6b\x9c\x95\xe3\xce\x56\x3e\xee\x6c\x02\xe7\xc2\x26\xa4\x63\x61\xb4\x92\x37\xcd\xa7\x37\x13\xdc\x30\x3c\x40\x24\x5f\x67\xa4\xb0\x7a\x37\xb9\x7c\x93\x15\x4c\x3f\x06\xd6\x03\xb0\x78\xde\x87\x27\xaf\x54\xc6\xcf\xb5\xa9\x86\xe5\x7e\x64\x43\x49\x2b\x82\x2c\x3e\x6b\x6a\x42\x7d\x28\x5c\xd6\x9e\xa6\x4f\xc7\x72\x54\xaf\x58\x80\x45\x89\x1b\x5e\xd1\x33\x3c\x37\x20\x6f\xf8\xa7\x9a\x94\x24\xdc\x83\xe4\x72\x69\x86\x97\x05\xf8\xdf\xb7\x8a\x8d\x49\xde\xef\xb5\x5b\xa2\xf4\xe9\x6d\xc8\xe3\x68\xd6\x3d\x56\x75\x40\xc0\x41\x10\xc6\x76\x10\x09\x8c\x01\x9d\x95\x8c\xff\x5a\x6a\x00\x5e\x7a\x75\xec\x53\x1c\xdb\xca\xe1\x70\x11\x3b\xa9\xc1\xab\x84\x69\x67\xac\x76\xae\x22\x22\xc2\x0e\x71\xbc\x5a\x27\x66\x9b\xa9\xca\xe4\xea\xfb\xe6\x7f\x5b\x65\x7a\x33\x23\x96\x75\xcb\x82\xce\x63\x19\xce\x11\xee\x99\xa7\x74\xa0\x47\x7e\x88\x46\xca\x3f\xa2\x19\x67\x5f\x13\x30\xef\x94\x3c\x2c\x15\xbb\x88\x93\xf3\xb4\x4c\xe7\xdd\x06\xbd\x8e\x72\xd2\xed\x66\x65\x49\x4a\x83\x67\xc8\x42\x1e\x20\x93\x6e\x00\xf1\x8d\x64\xf1\x2d\xe1\xd5\x63\x52\x9a\x91\x5e\x1f\xf9\x06\x5f\x8b\x8e\x9a\x1e\x26\xdb\x47\xfc\xb6\x1c\x44\x35\x88\x8d\xfa\xd6\x7d\x89\x8e\xf5\xe7\xe1\xfa\x0d\xe0\xe3\xfa\x5b\x9f\x82\x2d\xf8\x7a\x6b\x42\xaa\xab\xa2\xdf\xab\xa8\x5f\x3c\x1c\x25\xa2\x4f\xbd\x70\x64\xd5\xdf\x76\x34\x1f\x8d\x95\xb7\x72\x03\x57\x1d\x6b\x6e\x86\xeb\x1f\x67\x9f\x8f\xc5\xa0\xfc\x8c\x6f\x52\x18\x30\xd4\x8d\x81\xb0\xbb\x47\xda\x5a\xdf\x34\xcd\xba\x06\xb1\x73\xcd\x5b\x3b\xbb\xf8\x32\xcc\x4d\x7c\x8b\xba\x86\xa8\x32\xac\xdc\x2e\x6e\xa1\x0d\x56\xda\xa2\x31\x55\x8c\x41\x48\x4a\x49\x37\x57\xe9\x0a\xd6\xdc\x6e\xd1\x37\x08\xaa\x00\x7e\xeb\xa6\x1d\xe1\x2f\x68\x7b\x22\x21\x99\x8e\x2c\x3a\xb3\x59\x5e\x31\xda\xb2\xab\xab\xd7\xf3\x41\x4b\xb2\x46\xaa\xad\x04\xe6\xc8\x69\x0b\xd9\x07\xb6\xe6\x7b\x5b\x30\x6f\x8b\x4d\x60\x6d\x03\xff\x68\x8a\xe3\x85\x7e\x2f\xaa\x47\xa0\x79\x95\x15\x22\xed\x33\x50\xc1\x56\xfe\xeb\x2d\xee\x15\x5a\x6e\xa7\x68\xfb\x28\x43\x50\x31\x8b\x37\x32\x60\x3a\xea\x6e\xf3\x75\x32\x2b\xf2\x02\x07\x4d\x27\xe3\xed\xeb\xca\x52\xde\x61\xa3\xa4\x6f\x31\x67\x0e\xe1\x94\x4c\x7b\x96\xc6\x3a\x11\x77\x3b\x1b\x82\x74\xbc\x53\x6e\x91\x11\xff\x91\x23\xfe\x9a\xb7\xf8\x49\x12\xf1\x3d\x00\x36\xe8\x8d\x56\x59\x74\xf3\xb4\xdf\x79\x9d\x11\xc9\x5c\x06\x67\x6c\xc7\xd3\x0a\x22\x30\x57\x20\xcb\x4c\xb2\xdc\x4c\x49\xa3\x6f\x04\xfc\x3a\xb9\x04\xec\x0c\xc7\xa0\x56\x7e\x85\xef\xf2\x44\x46\x8d\xb3\xae\xf2\x98\x43\x4d\xdd\x0c\xa5\x46\xc0\x32\x21\xe1\x5b\x73\x4f\x68\x4a\x56\x55\x1c\xee\x81\x26\xfb\x35\x2a\xfa\xca\x62\x89\x8b\x08\x96\xba\xe6\xe9\x16\x88\x4d\xdc\xc7\x07\x7b\x9c\x28\x0e\xa3\x69\xdd\xe6\x62\x77\xb2\x9d\x0d\x98\x21\x23\xb9\x05\xde\xf3\x31\x61\x79\x60\x8b\x36\xcd\x8b\x41\xac\x27\x7c\x0f\xca\x36\x6c\x66\x15\x0e\x79\xea\xf1\x3e\x06\xdc\xa0\x57\x56\xdb\x4b\xc4\xb9\xbd\x08\xdb\xf4\x13\x71\x43\x31\x64\xf0\x16\x32\xb5\x17\x81\xae\xb6\x30\x6a\x24\x8e\xa1\x4a\xa5\xcc\x06\x63\x7b\xd9\x4f\xbd\xf3\x02\x16\xd5\x1e\xc6\x34\x79\x6f\xe3\xfd\xcb\xe5\x7b\x6f\x6f\xbc\xaf\xec\x9e\x7b\x68\x62\xbe\x83\x7c\x70\xd5\xd6\xcb\x7c\x08\x23\x4c\xb1\x2a\xb0\xfe\x75\x9f\x74\x7c\x64\xbb\xbd\xdc\x23\x32\xca\xca\x88\x69\x42\x12\xa1\x69\x76\xaf\x11\xee\x90\xdb\xef\x22\xb2\x43\x44\x62\x5f\xad\x33\xd4\x7b\x60\xf5\x9c\x7c\x01\xdc\xcb\x35\x3b\xdf\xce\x37\x0c\x77\x68\x28\x58\xe8\x12\xc4\xab\x40\x9a\x87\x36\x4a\x03\x12\x41\x07\x16\x2e\xbe\x47\xb2\xf5\x2a\x21\xde\xcc\x9f\x82\x4f\xab\x32\x52\x94\x1b\xfc\x01\x8f\x62\x94\xe1\x55\xf6\xf3\x9d\x7c\x5c\xf7\x7a\xd7\x88\x35\x7c\x64\x81\xeb\x84\x11\x36\xfa\x33\x24\x8c\x11\x5f\x3a\x42\x2a\x87\xa8\x44\x70\xf5\x88\x3c\xd5\x71\xfc\x8d\x13\x73\x84\x18\x48\xb6\xf1\x63\xf2\x70\x61\x6f\x81\x44\x4c\x9b\x87\xac\x58\xe7\xbd\x2a\xc7\x9d\x76\x6b\x3b\x2d\x3b\x93\x01\x03\x6f\xd6\xe3\xf7\xfe\x17\xa4\xf3\xb0\x78\x73\x98\x97\x4b\xc3\xcb\x3c\xd0\xaf\x61\xe6\x9e\x3f\xa9\x8f\x60\xf5\x96\x37\x80\x3f\x3c\x49\xe3\x8a\x85\xef\xb7\xcc\x5e\xd8\xd9\x01\xd8\xf0\x63\x25\x1d\x90\xb6\xe5\x05\xfa\x13\x98\xbe\x73\xcb\x38\x89\xea\x53\x5e\x0f\x1a\x9c\xf8\x18\xab\x52\x27\x29\x49\xa7\x80\x1f\x14\x4d\x61\xd3\x34\xbd\x0d\xd0\xe5\xb1\xb4\x78\xc7\xd2\x30\x79\xe7\x2c\x10\xa2\x6e\x13\x25\xcc\x03\x54\x47\x1e\xc3\x13\x47\x38\x90\x23\x7a\xc8\x4a\x87\x93\x8a\xa9\xcf\x5a\xa8\x4f\xc4\x9f\xa8\xb2\x28\xbb\x3f\xd6\xa1\xa3\x08\x54\x22\x81\x1a\x67\xd6\x7c\xd1\xa0\x8a\xb6\xdc\xf7\x19\x93\xa6\x57\x6c\x96\x13\xc5\x14\x51\x0d\x62\x4c\xe8\x9c\x45\x6a\x35\xe7\xd7\x6e\xe1\x46\x60\x3f\xe3\x95\xb6\x73\x45\xef\xe7\xad\xe8\x86\xec\xe1\x92\x29\x1e\xef\xf8\x99\xc8\xe5\x81\x53\x88\x2f\xaf\xd2\x32\x1c\xca\xfe\x2b\x19\xd4\x80\xf1\xd3\xc8\x7d\x66\x59\xe2\x2e\x6a\x84\x63\x0f\x10\xf1\x03\xfa\x3f\x38\x31\x44\xab\xc0\xf1\xc8\xd8\xf6\xc5\x1e\x03\xce\x51\x85\x4f\xf4\x39\xb1\xe1\xf8\x78\x4f\xda\xc1\xea\x94\xad\xb2\xe9\xbc\xf8\xda\x80\x11\xda\x87\x51\x15\x8a\x84\x03\xf2\xf7\x6f\xc7\x1e\x17\x45\xc7\x30\xa9\x60\x70\x0b\x54\xff\x42\x41\x7d\x53\xc5\x21\x42\xea\x23\x62\x11\x0f\x92\xff\x19\x4f\x1e\xdf\xed\x21\xc2\x2f\x22\xaf\x81\x21\x47\xfd\xa2\x6b\x18\x1f\x8b\xc1\x1f\x23\xd7\xec\x74\xcf\x8a\xe1\x7a\xe5\xf9\x09\x38\x35\x93\x77\x89\x11\xea\xa9\xb9\x21\x92\x5f\x5a\x9f\x02\x60\x5d\x27\x1a\x02\xac\x9f\x9d\xbe\x8a\xcc\x34\x3e\x6c\x26\x2a\x76\x34\x56\x6f\x44\x94\x21\xf6\x94\x6b\x11\xd2\xea\x10\x67\xd9\x20\x2b\xe9\xd5\x38\xa0\x5a\xed\x86\x79\x16\x27\xac\x37\xad\x88\x84\x6e\x38\xb1\xb6\x58\xb9\x31\x51\xad\xcc\xc9\x15\xbd\xd4\x1c\xdd\x2e\xb9\xb2\x4d\xcd\x1d\xe2\xa5\xb5\xcc\xef\xd8\xed\xa9\xbe\x0d\xd3\xde\x70\x3d\x3b\xd7\x5b\xbf\x33\xbc\xf9\xaf\xcf\xd3\x36\xfd\xd6\x70\xf6\xbf\x56\x5e\x0d\x11\x69\xe5\x1f\x63\x9a\xa3\xc5\x51\x5b\xb1\x76\xad\x8f\x6b\xd4\x55\xbf\xcd\xc8\xa3\xea\xa9\x45\x17\x51\x15\xd5\xb5\x6b\xbf\xf8\x44\x3c\xea\x60\x15\x68\x0f\x17\x2d\xf0\xb4\xf5\x8b\xf1\x78\x58\xfe\x6e\xd4\x5f\x27\xa3\x6b\x68\x03\x36\xb3\xef\xf6\x8b\xb4\xf7\xbb\xa8\x7d\x98\xdd\x02\x8f\xd8\x25\xf0\x93\x2c\xdd\xf1\x36\x2c\xe2\xce\x07\x46\x2e\xa1\x0f\x5f\x23\xbd\xc4\x23\x73\xc2\x18\x6a\x08\xed\xb1\x7d\x00\x1a\x85\xe8\xc1\x44\x54\x6a\x71\x75\x60\xeb\xd7\xd9\xad\x9f\x8e\xd2\x41\x77\x5b\x2f\x87\x4f\x69\xe6\x3c\x4a\x67\xad\x0f\x8b\x1d\xc3\x69\x5c\x9b\xec\xec\xa4\xe0\x3f\xfb\x84\xc8\x05\xef\xec\x36\xb9\x3f\x8a\x0a\x8a\x1b\x7f\x64\x80\x13\x7d\x93\xff\x6a\x3f\x23\x21\xb0\x42\x34\xb7\xfb\x70\xbb\xc8\xbb\x8c\x3c\x91\x2d\x0e\x06\x84\x03\x1b\x65\x19\xad\x50\xeb\x1a\x02\xa3\x97\x19\xce\xc8\xef\xf0\x9a\xbf\x5b\x38\x3f\xa5\x07\x2d\xab\xea\xce\xd0\xa5\xf6\xb3\x95\xdc\xa6\x3e\x6b\xa5\xfd\xe1\x76\x8a\xda\x01\xd7\xf1\xd8\xe9\x83\x59\x13\xb4\x87\x2b\x78\xe0\x1c\xa2\x8e\x08\xc2\xd8\x52\x81\x0f\x09\xa9\x1e\xff\x26\xb8\x1d\xc6\xbd\x72\xb5\xf3\x56\x0c\x3f\x7a\x73\xf7\x0c\x19\xfe\x3b\xce\xbf\xd6\x34\xf3\x9a\xb5\x27\xdf\x41\x3e\x0e\xcd\x17\x66\x39\x65\xfe\x45\x56\x5d\x84\x3b\xb8\xe7\xa4\xf2\x00\x6b\x09\x9e\xed\xe5\xd2\x74\x42\x75\x57\xbc\xa3\xb5\xdf\xd0\x25\x11\xae\x5f\x12\x3b\xf7\x10\xfb\xc7\x8f\x65\x27\xfd\xfc\xa2\x43\x8a\x02\xa5\x6e\x48\xe2\x75\x14\x64\x28\x8a\xfb\x12\xf9\xad\x26\xa6\xc7\x0c\x00\x2e\x1e\xd5\xee\x73\xc6\x61\xc4\x6b\x57\x3c\x73\x60\xe6\x7c\xd0\xed\x4f\x7a\x2b\xed\x45\xe9\x9d\xde\xbc\x5c\xbe\x09\xb3\x0e\x6e\x18\x91\x70\xc0\x9d\x91\x7a\x9e\x21\x36\x3b\x21\x01\x8d\x9e\x2e\x60\x7e\xb3\xe9\x77\xc5\x17\xbe\x63\xe6\x2c\x46\xa3\xac\x3b\x5e\xb7\xc6\x2a\xc7\xb5\x21\xa8\x00\xba\x37\x2c\xb8\xa5\xff\x4a\xff\xaa\xb1\xaa\xe8\x1b\xac\x02\xfc\x10\x65\x22\xf4\x7b\x06\x29\xcd\x7a\xfc\x77\x36\xb2\x6c\xd0\x19\xa7\x37\xb2\x41\xa3\x36\xcf\x8a\x4d\xa8\x1a\x07\xe6\x04\xe5\xf1\x61\xd1\xa9\x8c\x12\x27\x12\x69\x22\x17\x87\x5a\x93\x60\x24\x23\x82\xd7\x0d\x54\xa7\xf7\x6a\x1c\x6f\x6c\x30\x78\xed\x80\x33\xb4\xe3\x9c\x9d\x33\x04\x41\x1e\x76\x37\x87\xd5\x6b\xc2\xe1\x74\xd6\x3c\x8c\x67\x0a\x6e\xbb\x83\xb6\x57\xe6\x2e\x79\x15\xf5\xe9\x51\xc8\xd5\xc5\x21\x18\x4c\xa4\x86\x4b\x18\x61\xd8\x87\xd2\xfb\x93\x29\x29\xaa\xef\x89\x28\x05\x0e\xac\xe6\x68\x5e\x43\xe9\x05\xf5\xa0\x80\xba\x0f\xf0\x05\xcf\x97\xd4\x33\x95\x15\x98\x17\x00\x8c\x4b\xcd\x12\xea\x57\xb0\x27\xff\x16\x4e\x87\x66\xa2\x03\xb1\x5e\x91\x40\xad\x95\x61\xb6\x32\xbb\xe3\xd5\xfe\x6e\x73\x7b\x1c\x09\x47\xeb\xc0\x0b\xcc\x3e\xcf\xcb\x31\xcb\x60\xa0\x67\x8e\x58\x3e\x66\xce\xb5\x0c\xbd\xf2\xda\xad\x7e\x5a\x8e\x41\xc7\x4b\xc7\x44\x1e\x71\xe8\xf4\xc4\xbe\x64\xac\xd0\x99\xa1\x6b\xc9\x0c\x4c\xa0\xb1\xc8\x1f\xd0\x73\xdc\x11\xda\x15\x1c\x8a\x02\x97\x03\x5c\xf9\x73\x3c\x08\x56\x78\xa0\x90\x71\x5b\x11\xad\x7d\x24\x14\x87\x8a\x70\x80\x8a\xfd\xb6\x48\x85\xe8\x32\xe3\xcd\x90\xc0\xff\x8f\x3f\x4f\xb3\x3f\x2b\x7b\x81\xb3\xe2\x8d\x6c\x97\x3c\xc4\x5e\x12\x5f\x0e\x07\xb1\x46\xeb\x23\xa1\x9d\x84\x07\x3a\xe6\xf0\x6e\xe6\xc2\xd5\x1b\x9e\xef\xaa\xf0\x7c\x60\x1c\x02\x6b\x04\xa8\x1e\x6f\x66\x23\xc3\xe4\xda\x89\x30\x04\x22\xe0\x22\x94\x48\xc2\x03\xc7\x06\x05\xab\x9d\x5b\x03\x60\x02\x65\xc3\x44\x2f\xaa\x63\xd4\x15\x1d\x90\x00\x75\x22\x84\x68\x6e\x38\xdd\xef\x3d\x68\x22\x9c\xe0\x1e\x14\x4f\xa0\x29\x17\xb8\x2c\x1a\x86\xd2\xda\xb3\xfe\xcd\x91\x84\x84\xcc\xec\xa8\x7a\xc2\xf1\x60\x05\x64\x87\x29\xc7\x79\xbf\x0f\x30\x63\x03\x9a\xa6\x56\x9b\xe7\x49\xed\x20\xc2\x90\xfe\x0e\x64\x6e\x1b\x21\x26\x66\x1e\x4d\xd0\xad\xdc\x1f\x8b\x8b\x6a\x93\x02\xf3\x39\xbd\x05\xe7\xf5\xa8\xfc\xdb\xc8\xb0\x4d\xfd\x94\x2f\x73\x9b\x17\x0b\x0a\x23\x0c\x57\xba\x07\x28\x53\xde\x98\xc1\x22\x47\x04\x54\x27\xe2\x62\x58\x83\xea\xd7\x6c\x68\x8c\xaf\xbe\xb1\x5b\x41\x35\x98\x84\x3b\xcc\x2d\x97\xe4\xaf\x76\x4e\x64\x26\x3c\x3f\x56\x9c\xd4\x84\x4d\x05\x84\x3e\x24\x6a\x7a\x65\xe0\x8d\x86\x9d\x9f\x21\x10\xdc\x13\x11\x7e\xae\x00\x0a\x70\x97\x8b\xcb\x30\x6f\x84\xc2\x6d\x3a\x1b\xc8\xe4\x57\x70\x89\x8e\x19\x8b\xe2\x90\xd6\xa7\x80\x83\xae\xb7\x0c\xab\x30\xd8\xca\x3a\xe2\x04\xf6\xb4\x2a\x7a\x2b\xa7\xac\xd6\xef\x0b\xc3\xfb\x81\x47\x91\x2f\x99\xb2\x9b\x99\x0b\xc4\xc3\x20\xab\xaa\x41\x87\x43\xb0\x76\xe3\x01\x58\x9b\x45\xbf\x5f\xdc\x42\x93\xcf\xd3\xa5\x38\x3f\x9d\x92\xc1\xc7\x2c\x6e\x04\x90\xfe\x84\x39\xa1\xbb\xac\xc6\xa5\x3e\x64\x78\xb5\x7d\x8e\xf9\x67\xf5\x9b\x79\xef\xfa\xb7\x99\x75\xd2\x9c\xab\x07\x8e\x2d\x97\xf7\x5a\xa0\xd8\xdf\x69\x23\xed\x05\xe1\x7d\x74\x93\xdd\x0d\xea\x28\x2e\xb0\x6e\x04\x52\xb8\xdf\x57\xd6\x51\x8b\x6e\xc0\x10\x38\x37\xe0\x30\x1d\x1b\x6a\x33\x20\x25\x1c\xee\xb7\x79\x6c\xe5\x6d\x84\xd3\x44\x10\x33\x9b\x27\x4e\xe1\x52\x25\x18\xee\x7a\xcb\xc6\xcd\xa9\x10\xd0\xda\xb8\x21\xb9\xfe\xaf\xd5\x5d\x33\x4e\x2c\xc9\x7f\xfc\x21\xcb\xcb\x28\x6f\xb0\x75\x8b\xf0\xb2\xd2\xe4\x4c\xd9\xc3\x12\xaf\xfb\x39\x2b\xe1\x8e\x9d\x81\x8a\x63\x09\x87\xc3\x7e\xde\x45\xdb\x05\x86\xe2\x55\x3d\xac\xc9\x7e\x19\x0f\xd5\x9c\xb5\x7a\x59\x3f\x1b\x63\x88\x68\x80\x52\x9c\xe6\x66\x92\xf7\xd6\x7f\x97\xf7\x5a\xad\xe1\x64\xc3\xcc\xe5\x82\x08\xef\x31\xdb\x33\xf7\x03\x09\x25\x70\x96\xcc\x00\xd6\x29\xa4\x5e\x27\x2a\x7c\xa4\x88\x01\xda\x6b\xe1\x9e\xb8\x13\xcc\xac\x7e\xe0\x39\x29\xed\xc4\x9b\x75\xcf\x49\x57\xa4\x4a\x9d\xb1\xea\xd9\x53\x9c\xae\x25\x56\x6b\xe8\x3c\x57\x71\x9c\x33\xf6\x0e\xfc\x4a\x29\x66\x31\x20\xef\xa1\xb8\x57\x1e\xe2\x3b\x7e\xc5\xea\x31\xcb\x41\x5a\x9e\x92\x4d\x6f\xbd\xa8\x7e\x2e\xe2\x07\x76\x8e\x96\x6e\x46\x9b\x3c\xf5\x9c\x34\x2a\xc0\x6c\xde\x01\xc4\x58\x7a\x71\x2e\x16\xbf\xbd\x62\xe5\x87\x1f\x5c\x5d\x75\x6f\x03\xf5\x22\x79\x35\x3e\xa2\x55\xdb\xb0\xc9\xc9\xb0\x07\xca\x3a\x7b\xd7\x5f\xb3\x9b\x02\x2b\xf9\xfc\x1b\xf7\x1b\x3b\x95\x5b\x35\xca\x34\xf1\x1c\x8a\x50\xe5\x86\xbe\x89\x6a\x70\x50\xdd\x32\x22\x5d\x25\x20\x3a\x51\x72\x19\xe2\x75\x31\x4a\x05\x63\x58\xf3\x8f\x44\x18\xa8\x13\x9f\x7a\x1c\xca\xa9\x06\xab\x03\x67\xb8\x93\xdb\x11\x3f\x3b\xa7\x42\xf0\xa1\x8f\xf4\xd7\xa1\x02\x14\xed\x8c\x06\x9d\x4c\xc8\x47\xdf\x79\x64\xc5\xe3\x5b\xd9\x2b\x96\x7d\x64\x37\x76\x59\xd9\x6f\xfd\x28\x2b\xe4\x04\xe1\x56\xbf\xb2\x79\xa0\x3a\xad\x73\xdc\x0d\x3d\x75\x2d\xd3\xb5\x14\x4f\x00\x71\xe9\x9c\x94\xe3\x62\xc7\x52\x37\xcf\xdf\x9c\x77\xab\xc9\x5b\x77\xbb\x28\x4a\xf6\x1b\x10\xaf\x68\xb2\xf8\x69\x6e\xdf\x3a\x0e\xe8\xae\x0c\x4f\x0e\x91\x7a\xb0\xe7\xec\x16\x2e\x42\x24\xf0\x77\x9e\x32\x5e\x33\x6b\x36\xa4\x6e\x30\xb6\x43\x3d\xb1\x6c\x81\x84\x64\x2e\x03\x77\x29\x7f\x1d\xa0\xac\x74\x27\x86\x74\xa6\x93\xef\xa0\xbe\xee\x7b\x89\xda\x65\x5c\xed\xa9\xd9\xa6\xda\x3e\x26\x28\xb9\xed\x6f\xcc\xbd\x93\xa7\x8d\x7b\x21\x97\xa6\xa6\x37\x73\x82\x4c\x08\x03\xbc\xf2\x37\xac\xf2\x1f\xbe\x32\xb7\xe8\x6b\xf9\xcc\xf7\x1c\xab\x18\xe8\xe1\x22\x5d\x63\x1b\x1f\xef\x37\x1a\xa1\x16\xb9\xe3\xb7\xf5\x2d\xe8\x4e\x6f\xea\x6b\xec\x63\x92\x79\xf3\x92\x9c\xaf\x94\x15\x87\xa7\xed\xf0\x18\xdc\x29\x3f\xaa\xf6\x0d\x0f\x35\xc4\x22\x53\xb6\xe0\x4a\xd8\xa5\x73\x1f\xd1\x8e\x04\x73\x4b\x70\x6c\x58\x9d\x5e\x27\x9a\xed\xec\x72\x78\x79\xff\x43\x69\x86\x77\xb0\x06\x32\x50\x89\x52\x9e\x63\x18\xe0\x84\x06\xd2\x36\x92\xd3\xa0\x31\x4c\x8a\x35\x35\x01\xd1\x7f\x81\xc2\x05\x93\x75\xcd\x01\x28\xb2\x1e\x06\x4a\x4b\xbc\x5f\x24\x60\xa5\x12\x77\x52\xa1\xdf\x06\x00\x86\xa3\x9c\xd4\xef\xff\x66\x27\x3f\x95\x1f\xb5\xf5\xc9\xf9\xc4\x0a\x6b\x60\x57\x0b\xce\xfa\x84\x40\xb8\xbd\x62\x8f\xec\x46\xcd\x77\x24\x9d\x81\xc6\xc0\x8b\x2c\x8c\x9e\x10\x75\xe4\xa3\x0a\x7a\xf3\xd3\xd0\x83\xb0\x35\xbb\x4a\x97\x58\xb2\x42\xff\x54\x3a\x9d\xc0\x35\xd5\xdc\xef\x9f\xe9\xd5\x98\x1e\x2f\x59\xfd\xec\x2c\xee\x27\x9a\x0c\xc1\xef\x3f\x09\x97\x68\xdf\x8e\x86\x9c\xe8\xcb\x71\x12\xd7\x1e\x61\xc4\x37\x5a\x69\xaf\x87\x88\x80\x8f\xf0\xcf\xbc\xb6\x07\x1e\xd2\xaf\x33\xf4\x41\xe7\x6a\x47\xd5\xde\xb5\xe8\x78\x0e\x3c\x25\xda\x36\x9e\x8a\x1f\x8e\x11\x6c\x05\x4b\x30\xc2\x3a\x0b\xb1\xd1\x14\x85\x81\x06\x47\xe4\x55\x7c\x76\xbc\x54\x0f\xce\x73\x67\x5a\x8d\xdb\x54\x4e\x3c\x2c\x92\x12\x2c\x82\x67\xd1\x02\x03\x9b\xf4\x0a\x67\x6d\xb5\x51\x7b\x1d\x16\xfb\x9e\xc7\x54\x07\xb7\x74\x20\xf0\x91\x1a\xac\xc0\x0f\xde\x8a\x26\x91\x27\xef\x59\xf7\x40\x5a\x99\xe2\x6a\x50\x8d\xa4\xae\x85\x5b\xa0\x94\x43\x50\xfd\x84\x14\x15\x4c\xff\xce\x18\x2c\x0e\x23\x03\x86\x8e\x10\xe2\x38\x12\xd7\xa5\xa0\x82\xc7\x97\x54\x44\x22\x38\x09\xb4\xfb\x33\x7f\xa2\x19\x05\xf1\xb2\x17\xc0\x7b\xe5\x78\x54\x0c\xb6\xde\x27\xda\xb4\x24\x47\xd6\x13\xe7\xdd\xe2\x5c\x34\x30\xe6\xe2\x27\xef\xbd\xcd\x1d\xc8\xa5\xd0\x7a\x75\x3a\x73\x37\x65\x6e\xb8\x4b\xb8\xeb\xbd\x54\x65\xec\xf0\xc3\xee\x0d\xa4\x57\x0f\x81\x32\x78\x38\x78\xa8\x4c\xc0\x3a\x29\x42\x82\xde\xe8\x2c\x16\xdd\xb5\x1a\x8d\x2f\x05\x68\x9f\xe1\x18\xc7\x8b\x29\xbb\x60\xa1\x58\x40\xa7\x6b\x56\x00\x53\xb6\xed\x1b\x0d\x6e\x54\xaf\x50\x64\x57\xad\x84\x57\x92\x9f\x68\xd4\x7c\x97\xf2\x7b\xe4\x21\xd7\xb6\x9d\x91\x05\xaf\xef\xbc\x47\x3a\xed\x39\x79\x08\x11\x4d\x3b\xa5\x18\x41\x54\xe7\x07\x0a\x17\x19\xd1\x4a\x3e\xce\x02\x0d\x9f\xba\x71\x13\x27\x83\x6e\xf8\x8c\xe6\xde\x76\x49\x33\xf0\xfb\xa6\xc7\xf3\x86\x10\x07\x3c\x35\x4d\x1a\x64\xb7\x75\xc4\x21\xb0\x96\x87\xcd\xeb\x49\x02\xf8\xcc\xe9\xce\x29\x53\x85\x9a\x34\x10\x7b\x0b\x49\x60\xb3\xf4\x62\xee\xe3\x92\xc9\x85\xa9\x44\x65\xdd\x72\xa2\xab\x1d\x64\x40\x2b\x88\x52\x14\x03\x07\x80\xe6\x9e\x49\x2f\x4f\x00\xf3\x17\xbc\xc5\x87\x16\xbe\x00\x79\x8a\x3b\x2a\xa6\xd0\xb0\x9a\x30\xf6\xfd\xf4\x7d\xf8\xf0\x49\x4c\x23\x3a\x32\x84\x85\x31\x30\xe4\x0e\x69\x69\x7c\x16\x87\xe9\x84\x63\xc7\x70\x49\x30\xf6\xff\x92\x90\x5a\x1e\x92\x0d\x15\x37\xcc\x1b\xd1\x63\xfe\x0d\x39\xbb\x99\x25\x43\x17\x18\xcc\x22\x68\xd6\x0f\x45\x38\x32\x8a\xa1\x73\xa8\x84\x37\xbb\x82\xde\x88\x5d\xaa\x9b\xb1\x75\x80\x9a\xe3\x63\xc3\x8f\x76\xec\x8b\xe0\x67\x23\x0e\x0d\x36\xf2\x01\x2a\x22\x9f\x2d\xd8\x4b\x9b\x7f\x53\x01\x1a\xc1\x7c\x2a\x05\x86\xf3\xaf\x96\xee\xc4\xb3\xdb\x93\x4b\x71\x8c\x0e\xde\x4a\xec\xfc\x96\x77\xe4\x76\x44\x8e\x07\xae\xe1\x94\x48\x81\x84\x98\xd9\xe7\x63\x78\x0e\x4a\x4e\xc2\xde\xf0\x3c\xec\xbf\xb1\xb6\x9d\xc5\x4a\xc7\xdd\xb8\xd1\x09\x2e\x4a\x3a\xed\x4f\xdc\x9c\xcc\x00\xbb\xe8\xcb\x1a\x4e\x38\x78\xc5\x70\x08\x1f\x7c\xfc\x4b\xfa\x48\x4a\x29\xbb\x1e\xbe\x51\x4c\x16\x02\x06\x56\x6c\xe8\x56\x12\x0b\xbe\xdb\xc7\xdc\x63\xfe\x14\x35\xd4\x97\x01\x7c\xe0\x7b\xe5\xc8\x7e\xa6\xee\x7c\x6a\xce\x46\x1d\x89\xdf\x94\xee\x3b\xb3\x11\x6b\x16\x57\xa8\x58\x44\xb2\x51\x84\x67\xfb\x46\xcc\xc7\xd6\xa1\x2e\x17\x45\xb3\xb4\x11\x2a\x67\x0b\x1b\x23\x46\x68\x52\xef\x61\x8d\x64\x2d\x25\x9f\xd8\xa8\x4b\x8e\xd8\x5c\xda\xc0\xd8\x43\xfc\x5f\xb4\xd8\x58\x9a\x60\x81\xcd\x51\x05\x0d\x86\x8a\x34\x70\x13\x80\xc4\x10\x1a\x09\x1b\x93\x81\xb7\x82\xc6\x29\x3b\x5c\x75\x44\xeb\x77\xed\x0f\x1b\xdd\xe5\x79\xe4\x63\x0a\x41\xb3\xde\xac\x17\xa7\x12\xfa\x40\xb4\x14\x4e\xfb\x9a\x7b\x50\xd9\x2c\x52\xdc\xe3\x8b\x7e\x2c\xfc\xb3\x8a\x0b\x50\x6b\xf0\xd4\x88\xa2\x20\x0b\x14\xe2\xe8\x76\xc1\x2b\xb3\x7e\x8d\x15\xe5\x77\xc5\x7b\x91\x7b\x38\x1d\x62\x20\x75\x32\xbc\x90\xdf\xd8\x83\x08\x99\xd3\xf6\x53\x37\xee\x9a\x8b\x28\x33\xdd\x2d\x53\xfa\x78\xf1\xef\x56\x23\xa9\x38\x4f\xc2\xc6\xcf\xad\x71\xe5\x0e\xe4\x61\x93\x30\xd3\x70\x4f\x11\xff\xca\x67\x9a\xaf\x08\x0e\x41\x02\x67\x03\xde\x43\xe7\x17\x0c\x3a\x04\x34\x53\xf9\xf6\xfb\x09\x4d\xea\xcf\xc4\xf0\x87\x17\x06\xaa\xd6\xa7\x60\x17\xbb\xde\x62\x6b\xfd\x7d\x6d\x08\x6f\x29\x5f\x8b\x5a\x1f\x49\xe7\x2d\x23\x0e\xc1\x8f\x71\x79\xcf\xd0\xf6\x33\x75\xec\xa7\x84\x12\x1e\xf2\x79\x73\x8a\x4f\x36\xd2\xce\x39\x9f\xe0\x73\xa1\x39\x37\xf3\x32\xdf\xc8\xfb\xc8\x86\xdc\x07\x44\x21\xa9\xf8\xd0\x87\x0f\xbf\xc2\x47\x27\x80\x0c\xd3\x41\xd2\x35\x5c\x4e\xb9\x7e\x69\x92\x27\xa3\xac\x97\x40\x58\xdd\xa5\xf7\x39\x32\x8c\x14\x80\xe6\xd0\x0c\x00\x98\xa6\xef\xc7\x52\x65\x86\xa3\x42\xaa\xcb\x2e\x70\x4c\x9c\x2b\x4a\x64\xde\x98\x03\x09\xec\xad\x61\x11\x67\xde\x22\xa6\xb2\x08\x52\x32\x03\x97\x06\x39\x7f\xbe\x62\x19\xbe\x3e\x00\xc3\xad\x10\xb2\x70\xca\xe6\xaf\x78\xaa\xc9\xa9\xd5\x7a\x3c\x5f\x4a\xde\x1a\x66\xd1\xf8\x59\x51\xf2\x9f\xaf\x16\x2e\x27\x81\xe5\x2a\xac\xef\xe5\x5b\xad\x6e\xbf\x18\xa8\xac\x77\x9e\x60\x37\xb5\x61\x0b\x56\xa6\x8b\xa4\x0e\x5a\x1c\x53\xc8\xd8\x92\x83\xef\x99\x7f\xd1\x46\x13\x38\xb5\xc6\xf4\x8c\x36\xa5\x2e\x08\x58\x6f\xb4\x70\xdb\x64\xe2\xf6\xd2\xcc\x62\x6c\x20\x0f\x3b\xa5\x00\xf9\x10\x52\xb1\xab\xa4\xd2\xd1\x6d\xe1\xfc\xe9\x6b\x05\xac\x20\x1a\x97\xec\xe0\xcf\x43\x18\x5c\xcc\x1b\x5d\x3a\x3d\xe3\x89\xd5\xc0\x35\x2f\x91\x7d\xcf\x04\x13\x20\xe3\x48\x3f\x41\xca\x5d\x9d\x6e\x17\x7f\xdc\xca\xc7\xf9\xd6\x00\xc2\x38\x65\xb5\x55\x83\x00\x86\xfa\x72\xe2\x5e\xf3\x67\xdb\xf6\x69\xf5\xf3\xae\xe1\xa1\x32\xa2\x20\x5f\xa1\x5a\x18\x4d\x58\xf4\x73\xc3\x90\x92\xc9\x90\xfc\xf7\x5d\x5f\x70\x12\x4f\x7b\x06\x59\xfc\x16\xff\xc3\x7f\xad\xb8\xb6\x6a\x32\x19\xea\x0e\xbe\x24\x45\x27\x1f\xe4\x18\x68\x24\x09\x39\x28\x2e\xe1\x95\xbe\xfc\x78\xf6\x5b\x56\x7e\xa0\x18\xe4\xf2\x81\x50\xa2\x36\xcf\xbe\xc0\x5e\xb2\xfe\x79\x99\x3b\x94\x70\xcd\x73\xd3\xec\xf6\xb2\xcd\x74\xd2\x17\x9f\x07\xad\x2c\xd5\xfe\x0e\x9c\xca\xd7\x10\xbe\xc9\x00\xc2\x5b\xd0\xe6\x41\xd2\x93\xfe\xe2\xb3\x1e\x21\xeb\x8f\xca\x8b\x3f\xe2\x41\xf2\xc9\x33\x7c\x91\x53\x0c\x6b\xc9\xc5\x6d\xe0\x91\xf0\x2d\x87\xa2\xce\x16\xef\xd4\x45\xc5\xf7\x62\xc6\xc8\x60\x5f\xfc\x6b\x88\x61\x92\xb5\xe5\xe0\x8c\x76\x33\xe5\xdc\xb0\x77\xd8\x95\x60\x0a\xe9\x9b\xb5\x8a\x05\x74\x2a\x57\x88\x48\xbf\x25\x5d\x8d\x48\x3a\xaa\x68\x3e\x17\x61\x3c\xaf\xdf\xd8\x9e\x82\x4e\x24\x68\xe3\xc7\xd8\x78\x38\x65\x96\x96\xa8\xf2\x9c\x0e\xc8\x8f\x79\x68\xcb\xb8\x28\x03\x97\xbb\x83\xae\x2f\x05\xc3\xd8\x66\x3f\x5f\xe2\xab\x25\x83\x3e\xe2\x79\x94\x87\x6f\x81\x1b\x2a\xf9\x7d\x20\x22\xa3\x6c\x57\xb7\xd1\x3e\x42\xbe\x1f\x5b\xe9\x17\x51\xbf\x10\xc0\x28\xa5\xc2\x35\xf8\x23\x79\x5b\x18\x98\xea\x6e\x73\x18\x5d\xb1\xd9\x41\x18\xe3\xec\x94\x9e\x23\x1a\x4b\x51\xc7\xb8\x4b\x4c\x7b\x49\x99\xce\xd8\xc1\x9a\x15\xa3\x15\x2c\x12\x73\x11\xa9\x23\xe0\x3f\xdc\x41\xa4\x76\x64\x24\x6e\xe1\x83\x5a\xc5\x53\x64\x90\x81\x8d\x70\x82\x51\xfe\x21\xd9\x99\xc6\x42\x14\x10\x74\xb6\x48\xfc\xd1\x79\x6c\xc3\x2c\xd7\x33\xaf\x99\x97\x24\x2f\x8e\x3d\x3c\xd6\xcb\x23\xef\x40\xd7\x93\x8d\xfe\x24\xc3\x14\xc2\x5e\x96\x6c\x26\xee\x76\x2e\xc2\x1d\xdf\xf2\x5a\xb4\xd5\x35\x82\x47\xb8\x53\x9b\xa8\x6f\xfc\xd9\xc4\x13\xf5\xc5\xbb\x7a\x2a\x89\x2a\xad\xaa\x46\x8d\xb8\x3c\xb5\x2e\xdb\xdf\xdb\x3f\xff\xe5\x27\xca\xe5\x0b\x83\x21\xac\xfd\xd0\x26\xee\xa2\x80\x7a\x9b\xd6\x8c\x1e\x1e\x2d\xc9\x1c\xf3\x4e\x5e\x96\x24\x55\x0d\x72\xb1\xd3\xd9\x48\x4a\x91\x2a\xa7\x16\x01\x3d\x67\x58\xb4\x66\x56\x3b\x4d\xcc\x99\xcf\x4e\xe4\x92\x45\x40\xa0\x17\x65\x8a\x78\x4c\x4a\x61\xd4\xf7\x3e\x0a\xd3\x8d\xc9\x86\xac\x65\xf2\x20\xee\x95\x56\x0d\x8f\xab\x49\xf5\xe9\xd6\x22\x1e\x90\xdf\x06\x50\x38\x6d\x48\x05\x23\xa8\x8a\xf8\x94\x00\xb0\x1c\xa7\x62\xde\x07\xb5\x80\x47\x70\x10\xe1\x64\x30\x47\x60\x99\xf5\x37\x6b\x33\xde\xc6\x53\x13\x9d\xc7\xa2\x20\xc2\x55\x29\x3b\x38\xd4\x17\x5d\x79\x01\x6b\x06\xbe\xb4\x20\x4f\x0d\x77\x0d\xa6\x1b\xdc\xa0\xa4\x38\x67\x02\xff\xee\x83\x93\x65\x39\xd4\x48\x1a\x91\x1e\xc0\xb5\xe3\xb0\x83\x30\xe0\xf0\xbf\xff\xdf\x0f\xae\x7e\x28\xd7\xf3\xe1\x78\xd4\x87\xbf\x68\x77\x6a\x42\x78\x5b\x66\x28\x04\xbd\x40\x27\x32\xaf\x4e\xdb\x9a\x0c\x6e\x51\xfc\x41\xc5\x23\xef\x4c\xcb\x8b\x2d\xd5\x4a\x7c\xf9\x4a\x76\xe7\x38\xa2\x30\x6b\xd2\x3a\x11\x38\x1f\x2c\xf7\x5b\xf4\xf9\xbe\xe8\x58\x5a\x94\x4e\xbf\x89\x99\x6d\x81\x52\xd6\x66\x98\x62\xc5\x9a\xa8\x15\x5b\x7f\x98\xe4\xdd\x1b\x9d\xad\x49\x0e\xa1\xa0\x0f\x79\x1d\x08\x0c\xd6\x88\xc2\xac\xfc\x78\x3b\x2f\x85\x77\xf6\x90\xc7\x83\x18\x22\x52\x79\x2a\x90\xdb\xec\x16\x3b\x3b\xe9\xa0\xe7\x32\x62\x2a\x75\xc1\xc9\x79\x0c\x18\x5a\xed\x17\x94\x0f\x49\xf9\xfc\x10\x4e\x1e\x4e\x20\xda\x09\x1c\x44\x69\x75\x1f\x9b\xbf\x03\xbe\x64\xf9\x28\x7b\xcd\xc1\x71\xed\x66\xdf\x98\x6e\x19\xf1\x60\x11\x1b\xe9\xf7\x99\x8a\xc4\x2a\xea\xe2\xe6\xb5\xae\xc0\x99\xdb\x19\xda\x29\x3d\x71\x8b\x62\x72\x1f\xe2\x53\xb4\xcc\xa0\xe5\xff\xc6\xa3\x2c\x43\x25\x2c\x9c\x57\x6b\x33\xef\x43\x10\x24\xfb\xc9\x42\xd2\xea\x71\xba\xe5\x79\x45\x3a\x17\x56\xce\x2a\xeb\x98\x49\x87\x92\x44\x09\x0c\x0c\x06\x8d\x05\x9a\x3f\x99\x74\xd6\x32\x83\x96\xd6\x3d\x95\x02\x88\x6b\xcb\x03\x40\xa5\x81\x95\x2a\x0c\xf4\xd3\x8d\xac\x8f\x0a\x28\xc9\xbe\x0e\x14\xa8\x9f\x95\x63\x03\x6b\xe6\xf7\xff\x77\x41\xb9\xe5\xbb\x18\x6e\x57\x4a\x4e\x2c\x7a\x36\xa3\xac\x9f\xa5\x25\x34\x7b\x40\x08\x0c\xd3\x67\xa2\xb7\xdb\x28\xbd\x85\xb1\x9e\x9a\x3b\xa7\x2f\x06\x7c\xa9\x8e\xc6\x03\x06\x0c\x76\x1b\xa1\xaf\x98\x0b\x06\x3b\x53\x22\x1d\x65\xf2\xe3\x9c\x6e\xec\xe9\xe1\x06\x36\xaf\x11\xbb\x02\x75\x4a\x09\x47\x3d\x45\xfa\x75\xcc\x12\x86\x61\xa4\xa9\x05\x04\x24\xf7\x41\x48\xb5\xfe\x6e\xa1\x7f\x92\x73\x9b\x9b\x39\x06\x1b\x5e\x3d\xc7\x2c\xa8\xe4\x8a\xca\xd2\x80\x67\x44\xbc\x6f\x2b\xeb\x81\x77\x72\x1b\x4b\x6c\xe4\x7d\x5d\xac\x23\x98\x4b\x5a\x92\x3b\x15\x37\x06\x6f\x37\x0b\xd4\xd5\x7d\x72\x17\xf8\x4f\xa7\xc6\x03\xb1\xa6\xcb\x70\x94\xe1\xd1\x92\xa3\x4d\x19\x1c\x6f\xe0\xf8\x27\x9d\xba\xe9\x00\xbd\xbe\x61\x3a\x88\xbb\x06\x6e\x09\xe7\x2d\x5d\x96\x3c\x47\x8a\x48\x52\x76\x99\x39\x3c\x39\x10\x45\xa4\x07\xa2\x46\xb5\xd6\x47\x45\x43\x6d\x9c\x9a\x21\xbf\x53\x72\x52\xf0\xf6\x8b\x78\xaf\x66\xd3\x9c\x12\xa1\x66\xef\x3b\x13\x83\x93\x36\xb2\x8e\xd9\x41\x6a\x25\xbb\x6f\x95\xaf\xbe\x93\xf9\x3d\x39\x6f\xae\xee\x3b\x16\xf6\xef\x39\xcf\x1f\x20\x2e\x7e\xa9\x7f\x54\xce\x91\xa8\x11\x0f\x4f\x05\x04\x53\x5e\x22\x52\xfb\x8d\x6c\x13\xd4\x00\xf0\x53\xb0\xbe\x4a\x02\x4a\x9f\xc0\xab\x65\xaa\x48\x95\x50\xf1\x5b\x0f\x4f\xa2\x93\x76\x27\xac\x64\xd6\x95\x4e\x77\x1b\x52\xa0\xdd\x1a\xe5\x63\x31\x2f\x05\x1b\x08\xf2\x1a\x2a\x26\x51\x28\x20\x49\xb7\x07\x2e\x56\xc3\x1e\xa8\xe3\x2d\xd5\x81\x4a\x09\x0e\xbd\x2a\xc4\x9c\x72\xa0\xe4\x6b\x8d\xfb\x52\x69\xcd\xfc\xd7\xae\x84\xa6\xf3\x1d\x77\xe4\x61\x83\x04\x85\x19\x64\xe8\xa4\x1e\xd0\x9a\x20\x2f\x42\xe5\x88\x20\xcf\x96\x5a\x8f\xd5\xaf\xae\x93\x7e\xf7\x19\xbb\x2c\x31\x63\x38\x8f\x31\xa3\xfb\xe8\xa4\x2d\xe8\xfd\x2b\xd3\x70\xae\x83\xe0\xc8\x4d\xcb\xe7\xa4\xde\x66\xfd\x71\x35\x20\xa6\x86\xd7\x5d\xa3\xed\x1f\x6b\xed\xd0\x31\x7a\x66\x1c\x52\x14\x96\x64\xcc\xe6\x42\x5b\xd6\x1d\xe7\x1b\xf6\x3d\x8b\x25\x1f\x59\x4a\x2d\x00\x18\x61\x23\xed\xde\x30\xd2\x54\x37\xb3\xe7\x01\x2c\x20\x3e\x15\x85\x6b\xba\x59\xbf\x83\xe1\x19\xeb\x78\x84\xe2\xf5\x2b\x0d\x90\x02\x39\x04\x86\xf9\x32\xc8\x63\x48\x98\x87\x39\x48\x34\x51\x4c\x06\xb6\xf4\xf1\xce\xd0\xf3\x9b\x32\xb7\xff\xf6\x7b\x72\x2f\xef\xbf\xa9\x9a\x06\xad\xde\x74\xa8\xba\x87\xf9\x4c\x42\xfc\xa3\xdb\x44\x42\x07\xbc\xef\xbc\x8d\x1d\x0a\x70\x67\x86\xd0\x4e\xb7\xb4\x01\x7e\x07\xac\x64\x46\xa8\x20\x57\xce\x6f\xc8\xda\xc7\x4c\xa3\x02\x2e\x1e\xb3\x97\x83\x7f\x68\x7f\xd7\xd0\x39\x7a\xcb\x82\xeb\xea\x8e\x4a\xc3\x03\x82\x3d\x26\x6f\x22\xcb\x8a\x48\xc8\x34\xc6\x55\x38\xa3\x4b\x98\xf5\xc6\x1a\x5e\x44\x21\xb2\xef\xd6\xe1\x98\x4d\x99\xda\xe7\x88\xad\x2d\xc7\x66\xb1\xb1\x83\xa8\x81\x5f\x89\xf2\x5b\xe2\x15\x65\xbd\x73\xf1\xe5\x3b\x11\x5f\xee\x4a\x3a\x5b\x9f\xbd\x69\x6b\x72\x2c\x71\x4c\x18\x9c\x80\xc7\x5e\x9b\xb2\x40\x9f\x6d\xc4\x0f\x3d\x7c\xd3\x4c\x27\x37\x32\xe1\x4f\x79\xe0\x4a\x9a\xfa\x78\xde\x13\x9d\x3b\x40\xc6\x16\x66\xb2\x0f\x0a\xd4\x5d\xe2\xab\x15\x37\xc8\xb8\x2b\xea\x08\xa4\x0e\x30\x2e\x65\x0b\xa4\x22\xb8\x18\x56\x0c\x18\xeb\x94\xd0\x99\xc3\x88\xb1\xa1\x39\xa4\xbd\xe2\xd4\x2d\xa2\x76\x0d\x7e\x01\x4d\x5e\xb8\x0e\x05\x35\xf6\x18\x71\x19\x76\x55\x7a\x2d\xe1\x22\xa2\xa8\x72\xd5\xb9\x90\xc0\x42\xba\x5f\x23\x8f\x19\x89\x6a\xcb\xb0\xee\x72\xbc\x51\x02\xd1\xa0\x69\x9d\xaf\x32\x1d\x61\xac\x5e\xe7\xd6\xb6\x9a\x3c\xf0\xc2\x8a\x30\x4c\xb1\x00\x0e\x4a\x8c\xa3\x50\x31\x57\x81\x00\xe1\xf6\x3e\x5b\xa6\x1e\x82\xbf\x49\xb3\x35\xa6\x2e\xd9\x0f\x39\xdc\xa9\x3c\xcc\xa2\xe1\x47\x9d\x41\x4d\x48\x89\xf0\x41\xf6\x6d\x93\xf3\xf1\x9d\xe0\xad\x2e\xad\xa3\x01\x3e\x66\xf5\xdc\x15\xcd\x0f\xa2\x13\x3d\x9a\xef\x1f\x6a\xf8\x30\xc2\x9b\x23\x99\x52\x3b\xcd\x35\x3c\x18\x5d\xfb\xa5\xe1\x36\x0d\xbc\x30\xf5\x01\x0c\x0b\xe9\x37\x3d\xdf\x2a\x12\x04\x0e\x11\x5c\xbe\x0c\xe8\x90\x5b\x3c\x96\x98\x28\x3a\x1c\xf3\xa0\xe2\xe7\x9c\xdd\x8f\x98\x45\x5f\xc3\xaa\x54\x4c\xe2\x0b\xea\xb2\x34\x98\xbe\xa8\x76\x52\xc4\xae\x9c\x6c\x98\x97\xe4\xf9\xa3\xd2\x75\xd4\xbc\x9b\xc5\x5c\xe1\x3c\x8e\x5c\xc6\x65\x5a\xe1\xa4\x54\xc1\x1d\x96\x59\xf3\x40\xf6\x02\x2b\x3e\x09\xd7\xac\x27\x82\x89\x71\xf1\xa0\x36\xa6\xb4\x5c\x11\x89\xc2\x62\xc1\x96\x08\xa7\xed\xa8\x90\x2a\x1f\x63\x19\x3d\x5f\x7a\x04\xd1\x89\xb9\x06\xc6\x06\xbd\x4a\x53\xfb\x15\x94\xda\xc0\xc0\xd8\x44\x3b\xf6\xcb\x8e\xe4\xad\x79\x6a\xbd\xa0\xa7\xf6\x23\x31\x0f\x08\xa9\x70\xe4\xf6\x77\xce\x30\xfb\xdd\x92\x42\x5b\x48\x82\x97\x8f\x86\x72\x91\x05\x93\x92\x0f\x61\xed\x3f\xce\x89\x8a\x65\x3a\xc5\x5b\x93\xfc\xe5\x44\x6d\xa4\x9a\xb4\xb5\x88\xff\x9c\x45\x7c\xf5\x19\xb0\x20\xb4\x50\xb0\x7c\xa4\x94\x01\xaa\x65\xd7\x48\xfb\xa3\x8e\x0c\xe7\x89\x08\x35\x3d\xac\x26\x41\x14\x09\xd3\x60\x66\xd5\x40\x66\xc7\x52\x52\xaf\x62\x33\xab\xc6\x7a\x72\xea\x60\x04\x12\xd5\xa1\x18\x66\x03\xdd\x1e\xa8\x37\xd5\x82\xe0\xb8\x90\xe8\x24\x45\x09\x19\x03\x5d\xaf\xbf\xe0\x71\x9e\xd7\xcf\xb0\x49\x50\xd3\x14\x95\x0a\x07\xa4\x3f\xc5\x1e\xe0\xe4\x54\xd9\x83\x6b\x1c\x88\x58\x7e\x4f\x30\xd7\xf9\x27\xe5\x3a\x2a\xed\x61\x30\xdd\xf2\x4b\xe9\x44\x9c\x98\xf7\xfc\xeb\xe0\xc3\xdd\xbe\x8d\x5d\xb2\x85\xf8\x2a\xcd\x3a\xc3\xbe\xe1\xe2\x25\x27\xf2\x03\x89\x1f\xb6\x97\x0f\x48\xc4\x5b\x82\x8c\x1e\x68\x46\x6d\x17\x77\x6d\x34\xbe\xd4\xaa\x2d\xdb\x92\xb3\x1e\xdf\xa0\xce\x79\x8e\x49\x2f\x6c\x39\x1f\x62\x8f\xff\x28\xae\x16\x2c\xb8\x93\xbc\x04\xc6\xa3\xc8\x6e\xc2\x99\xf2\xc1\x66\xa1\xe0\x0f\x4a\x3b\xdd\xf3\x77\xe5\xc7\x3b\x39\x89\x8b\x7c\x30\x6c\x5c\x32\x67\x56\x4c\x2e\x35\x6c\xf7\x52\xbd\x17\xde\x5c\x84\x40\xf3\xf9\xa1\x76\x7a\x74\xc1\x87\x5f\x32\x49\x3d\x6d\xde\x76\xbb\x6e\xab\x0d\x66\xfc\x8b\x9c\xd8\xa4\xd4\xd1\xa7\xa2\x92\x78\x2e\x5a\xba\xd5\x07\x12\x72\xa8\x54\x60\x8f\x17\x91\xcc\xe9\x2a\xf5\xfd\x2c\xaa\xca\x40\x4a\x40\xc9\xcc\x69\x26\xc4\x00\xe3\x74\x63\xfd\x72\x2f\x21\xa7\x2f\xfb\x8c\x4f\x2d\x88\xc2\x8b\xb7\x8d\x5e\x05\xaf\xdd\x36\x63\xfd\x2e\x43\xf2\xa3\xea\xae\x74\x03\xe0\x2a\x4b\x23\x03\x76\xc7\x6a\x2b\x3a\x25\xfa\x49\xcd\x1b\xe3\x41\xea\x51\x66\xd8\x40\xcf\xc4\x4d\x75\x0e\x1e\x7f\xca\x60\x90\x15\x70\x96\x6b\xb9\x95\x9b\x96\xfe\xbe\x6a\x30\x90\x42\x5b\xdc\x5d\x19\x72\x23\x5f\xda\x90\x75\x5e\xb4\xd8\xdf\xf9\x74\xec\xab\xca\x52\xa8\x47\xc9\x15\xa4\x0d\xd4\xec\x16\x13\xf2\x00\x10\x0d\xac\x8b\x55\xa9\xec\x18\x3b\x13\x4e\xea\x41\xe4\x30\xf6\xf5\xfc\x68\xd9\x32\xc7\x76\x82\x58\xf7\x9d\x6c\x00\x06\x7e\x90\x1d\xb0\xfb\x53\xe1\x84\x29\x2b\x66\xbc\x67\x89\x09\x30\xbf\x5b\x50\x25\x39\xb1\x9b\x55\xdb\xb4\xf1\x45\x8c\xc5\xf3\xee\x44\x11\xfc\x48\x63\xc0\xc0\xb6\x31\x27\x4f\xb9\x5d\xdf\xdc\xc8\x54\x66\xed\xa2\xbf\x78\xbc\xd0\xb9\x7c\x17\x41\xa0\x79\x05\xf0\x69\x75\x59\x5a\xda\x01\xfe\x1c\xe9\x5c\xdf\x75\xa7\x28\xc7\xc0\xce\x64\x03\xbb\x3b\x2b\x52\x1d\x0a\xe3\xbb\x94\x18\xe5\xba\xb9\x83\x11\x24\x3d\x4c\xfd\x08\x80\x01\xf0\xae\xd7\xc3\xf7\x9f\x5c\xfe\xf4\x9d\xeb\x25\xdd\xb6\x0b\x1b\xfa\xf4\x47\xd7\x8d\x70\x74\xf9\xd3\x1f\x5f\x2f\x41\x10\xaa\x0c\xd3\xd9\x4c\x6f\x64\x8d\x63\xe1\x10\xd2\x0f\x35\xee\xc5\xa4\x74\x6c\xa4\x20\x6f\x45\x56\x3f\x47\xd0\x20\x13\x07\x26\xe8\xf5\xd1\x17\x57\xfb\x6c\xc0\x5e\x3d\x69\x14\xf2\x2a\xb6\xd9\x60\xb2\xd3\xe1\xb3\x2b\x11\xcf\xd5\x1e\x18\xb7\x02\xaf\x8d\xf1\xfa\x67\x5e\xbb\xb9\x80\x87\x3b\xaf\x7f\x00\x51\xf2\x32\x1e\xd5\x67\x32\x82\xc4\x97\xd3\x40\xae\x8c\x5b\x93\x3b\x6b\x24\x2b\x4d\xa0\xfb\xb1\x4b\xfd\x89\xdd\x53\xe1\xa2\x99\x28\x6f\x0f\xab\x56\xa6\x81\x7d\x01\x24\x2f\x0f\xd9\xe3\x1f\xfe\x69\xcd\xfd\x16\xb2\x78\x6a\xf9\x5f\x83\x43\xc0\x65\xcd\x7d\x62\x61\x07\x18\x65\x78\x6d\x3c\x87\xcb\x19\x7a\xaa\x29\x50\xd8\x7a\xb5\xf9\x74\xfe\xe5\x22\xb2\x74\x62\xb6\xec\x1b\x79\x58\x1d\x26\x00\x1b\xbc\xe2\x0a\xc9\x83\xeb\xcd\x7b\xf0\x18\x0c\x50\x5f\xb2\x37\x8d\x7f\xbd\x8f\xe0\xed\xdd\x37\x6d\x41\x46\x3b\x8b\x6f\x38\x32\xb0\x3f\x2e\xbd\x9b\x4b\xde\xc8\xac\xd2\x34\xed\xdc\xd8\xac\x68\x27\x3c\xfd\x3c\xc2\xd5\x26\x1c\x2e\xc2\xfa\xc2\x8b\xed\x65\x58\x40\x2a\x5b\x2d\xd4\xd9\xa5\x48\xa5\x0c\xf2\x5b\x38\x75\xde\x4b\xf6\xb5\xc6\xfc\xae\xf9\x9b\x14\xc9\x92\x4c\xa2\xa8\x7a\xf4\x82\x15\x6b\x72\xf0\x3b\x6d\x8c\x67\x6c\x94\xb0\x26\x5f\x6b\x41\x1a\x44\x4b\x8b\x41\x6b\xc1\xf3\x93\x39\xe9\x7b\xb6\xa9\x38\x88\x89\xe8\x35\x65\xc5\xe9\xcd\x0c\xf5\x53\xb6\x56\xcd\x83\x80\x7f\xd3\xb9\x6e\x63\xb2\x1f\x35\x33\x07\x07\x27\xf6\xa7\x05\xd7\xfd\x68\x68\x08\xce\xf9\x80\x9b\x6a\x59\x46\xf7\xb0\xca\x08\x47\x87\x0a\x17\x0f\x14\xc2\xfe\x35\xa7\x40\x1f\x23\x3a\x7b\xbf\x41\x2c\x51\x71\xd3\x86\x6a\xc3\xe0\xcf\xed\x51\x17\xec\x68\x8d\xfe\xe7\x3a\x7f\xbb\x0c\x3d\xee\x40\x0e\x51\x86\xb9\x60\x50\x41\x7c\x7d\x2a\x64\xc5\xd5\x6b\x5f\xd5\x86\xa6\x48\xd2\x30\x1d\x8d\xf3\x6e\x3e\x4c\x99\x2c\x11\x50\x2f\x6d\x7e\x40\x69\x9b\x8e\xc7\x69\x77\x1b\xb0\x9a\x63\xe9\x3f\xab\x68\x30\xe1\x1d\xc5\x34\x97\xfb\x5e\xfe\x09\x52\xc9\xbd\xa2\x07\xf2\x59\x64\x86\x9e\x79\xc8\x20\x8a\x44\x66\x50\x6a\x4a\x96\x46\x67\x76\xe6\xcf\x5a\xe4\x70\x51\xd5\xc8\x34\x19\x27\xb8\x8f\xc1\x74\xe6\x2c\x32\x67\xd8\xfa\x9e\x42\xe8\x09\x50\x03\x25\x68\xbc\x8f\x75\xb1\x55\x1d\x65\xd1\xbe\x61\xa3\x6a\x43\x59\x4a\xf8\x7d\xb3\x1d\xc5\x9f\x77\x23\x35\x02\xe0\xf2\x36\x7b\x26\x81\x8d\xef\x1b\xed\x1e\x1d\x2c\x92\xfe\xbb\x8e\x51\x5a\x76\x7d\xdc\xc8\xf3\x9d\x01\x39\x06\xbd\x65\xc8\xec\xe8\xfb\xc9\xc8\x11\x17\xe0\x0e\x3b\xe9\x8f\x4b\x25\xb2\xa3\xcb\xab\x19\xff\x08\xf9\x04\xf4\x9e\x95\xd6\xe3\x6d\x60\xd7\xc7\x85\x5d\x86\xeb\xc5\xae\x70\x16\xc3\xfa\x0b\x5c\xd3\xc7\x46\x41\x2f\x9c\xad\x40\x06\x87\xd4\x81\xf0\x2f\x44\xed\xc0\x8d\x7f\x26\x75\x77\xaa\xf6\x98\xa6\xd3\xa5\xa7\x02\x00\x75\x5f\x70\x7a\xe4\xea\xde\xd5\xac\xaa\xa1\x61\x6f\xe3\x22\xde\x06\x7e\xb5\xc7\xf4\xec\x1f\xf0\x0f\xa2\x6a\x7c\x07\xac\x07\x7a\x7a\x21\xb3\x19\x77\x46\x34\xcf\xb0\xc5\x18\xc3\x9e\xd6\x19\xef\x0d\x96\xd2\x53\x44\xf7\xca\x62\xf6\x16\xee\x27\x79\x0f\x5c\xa8\x84\xce\xe2\xbf\xe1\x39\xca\xaf\x3f\xb6\xbf\xf2\x64\x3b\xd9\x68\x4b\xb8\x59\x9a\xd3\xcd\x72\x05\x90\xcc\x5b\x7f\x87\xb9\xcc\x10\xff\xc5\x70\xe8\xbc\xbd\x74\x03\xb8\xc8\x9b\xd9\xa8\x64\xbf\xed\xd0\x8f\x6a\xea\xb5\x8c\xe8\x96\xdd\x67\xd6\x90\x3f\x0d\xac\x23\x55\x2d\x39\xf7\x61\xe6\xcf\xc0\x25\x6e\x3c\x9e\x07\x36\x5a\x79\xc3\xde\x63\xc8\x2c\x47\x2e\x15\x11\xfa\x99\xff\x86\xe9\xa0\x31\x77\x22\xd9\xd3\x50\x58\x70\x10\xad\xbf\x3b\x10\x8d\x62\x78\x97\xb4\x03\x07\x79\x83\x47\x31\x32\x22\xf8\xd9\x14\x9c\xd7\xf8\x44\x55\x98\xb6\xae\xb3\xa7\x1e\xc8\x11\x9e\x56\xc9\xa4\x55\x58\x27\x27\xf4\xc5\xed\x51\x58\xa0\x32\x88\x87\xae\x30\x36\x3e\x2d\x24\x3e\x73\xd9\x7e\x5e\x1a\xac\x99\x75\x6f\xd8\x84\x8e\x92\xc7\xc4\x6a\xfe\x6c\xae\x59\xb0\xed\x61\x34\x26\x56\x58\x89\xe5\x41\x39\x90\xe8\x68\xbf\x9a\x56\x10\x1a\xe5\x3b\x17\x5a\x5c\x9a\x0e\x3a\x18\x16\x83\x07\x1e\x06\x0e\x9e\x8b\x32\xaa\x66\x64\xce\x0c\x44\x1e\xf8\xd6\xc5\x9e\x43\x1d\xb0\x3e\xa8\x9a\x1a\x7d\xff\x5f\x7f\xf6\x9a\x90\xa9\xf3\x97\x00\xc3\x3d\x5b\x60\x40\xe4\x1e\x9a\x47\xb0\x4b\xfd\xc2\x44\x61\x19\xcd\x12\x2d\xb9\x90\x2c\xcf\xec\x41\xec\x6d\x64\x29\x58\x57\x3a\xf5\x6a\x22\x13\xbb\xcc\xd6\x28\x5b\x44\x4b\x96\xe3\x3f\x15\x1f\xc5\x63\x54\x3e\xe5\x47\x8a\xe2\x4c\x7c\xd5\x93\x01\x63\x33\xec\xca\x26\xca\xcf\x98\xf0\x28\x3d\x72\x8d\xc0\xc4\x21\xa2\x9c\x02\xb9\xd6\xc4\xdf\x78\x43\x57\xfe\xe1\x72\x8f\x91\x23\x93\x2d\x3a\xf3\x48\xc8\x23\x0a\xe1\x5c\xaf\x08\x13\x8d\x44\x1e\x2c\xab\xfb\x2a\x8f\x76\x9e\x48\xc9\xa6\x90\x63\xf8\xac\xa5\xfc\x48\x35\x63\x64\x2d\x3c\x53\xdd\xa0\x51\x5d\xab\xda\x9d\xa7\xb2\x0d\x9b\xf6\x22\x9a\x11\x48\xce\xac\xd7\x56\x74\x7a\x13\xf3\x04\x90\x50\xfe\x15\xde\xbb\x42\x46\x27\x6c\x34\xc3\x84\xc7\xe1\x82\xb5\x6a\x66\x5e\x99\x3a\xd4\x32\xf8\xc7\x01\x16\xda\xed\x2c\xa5\x4a\x95\xda\x5a\x40\x00\x4a\x36\x2d\xc7\x78\xea\x82\xde\x7e\x3a\x60\x0a\x72\x3a\xb2\x81\xd4\x3e\xe7\x3f\xa5\x64\x67\x7a\x6d\xcc\x12\xf8\x26\x0a\x6b\x44\x53\x2d\x59\xcc\xc3\xbc\x8c\x28\x17\x3d\xd7\x5f\xfd\xf8\x46\xfd\xc1\x1e\xa6\x35\x75\x7a\xa4\x82\xdd\x16\xae\x80\xa3\x00\xc6\x01\xe2\x23\x78\xcb\x3f\xbf\x8c\x93\x29\x5a\x79\x4c\x7d\xb5\xc5\x69\x79\x22\x88\xa2\xdd\x49\x59\x2f\x6d\x6d\x2a\x1c\x17\xa2\x60\xf9\x0e\x13\x63\xb4\x77\x4f\x23\x6b\xe2\x6c\xd2\x5e\x41\xd9\x37\xcd\x51\xe3\xff\xbb\x6a\x3a\x1d\x5f\x05\x0b\xfa\x9b\x91\xf3\x74\x72\x91\xa8\xe2\xc9\x7d\x65\xbf\x21\x71\x03\x48\x44\x6a\x20\x12\x51\x43\xdf\xb2\xd8\xc5\xa0\x3f\xac\x82\x9f\x27\x3a\x6b\xdb\xa9\x94\x57\x39\x14\x5c\xe1\xbc\x43\x6d\x92\xb8\x84\x23\xbb\x2d\x2a\xdc\x47\x09\xe3\x08\x68\x84\xde\x5b\x44\x49\xa0\x3e\x8b\x58\x7c\x81\x35\x4b\x6e\xc7\xa5\xef\xcd\xc9\xa7\x15\x49\xe9\xb8\x54\x35\x73\xa1\xf1\x1b\x3e\x0c\x06\x69\x23\x7c\x83\x70\xa4\xa5\xf5\xfc\x7a\xe5\x07\xfe\x5b\xcb\xae\xc8\xd7\x9e\xef\xe4\x3c\x8a\x16\x91\x59\x07\x79\x1b\x1c\x51\xc9\x11\xe8\x39\xe1\x50\x65\xc3\x80\xe6\x17\x97\xbd\x63\x2b\xaf\x40\xd8\xaa\x52\x77\xeb\x56\x7e\x23\xa7\xf8\xfb\x43\x08\x76\x31\x7f\xb5\x6f\x65\xfd\x2e\x56\x5c\x8d\x95\x6c\x62\x83\x26\x77\x78\xc3\xeb\x61\x73\x19\xe2\xb7\x44\x4c\x75\x14\x5c\x83\xd9\x02\x0f\xe2\x41\x4a\xaf\x16\x53\x95\xca\x1d\x7d\x1c\x0f\x19\xec\x4e\xa4\xae\x98\x64\xc5\x7d\x40\x34\x85\x7c\xfe\x6c\x69\x18\xca\xe4\xce\x80\x0b\xb9\x63\x71\x5d\xfc\xfe\x36\xf3\x51\x09\x35\xb0\xb6\x2a\xa8\x8d\xb2\xa0\xe3\xfd\xf8\x8c\x19\xf5\xa7\x2e\xdf\x05\x39\x80\xf1\x13\x0b\xa7\xd4\x42\x8b\xa6\x61\x75\x7a\x6a\x4e\xf9\x3d\xb7\x94\xcf\x7f\x25\xb5\x30\xb6\x93\x20\x63\xdf\x15\x94\x43\x72\x16\x2e\x0d\xab\x68\x8a\xc0\x63\x86\x60\xcd\xa9\x32\x7c\xe7\x6e\xa0\xc5\x21\x3e\xe5\xe3\xc1\xe2\xd4\xbc\x47\xad\xd1\xab\x39\x0d\x0c\xae\xe5\x85\xa1\x5d\xfc\x72\x29\x0e\x66\x8f\xc8\xc1\x8c\x97\x11\x39\x4f\xa0\xab\x38\x08\xbe\x75\x98\xb3\xb3\x31\x19\x8f\xf1\x79\x5a\xb1\xdf\x3b\x29\xfb\xfd\xbc\x03\xa3\x3c\x23\xde\x88\xfa\xc1\x47\xb7\xa2\x7b\x41\x81\xb2\x6e\xd6\x79\x07\x34\x6b\xfb\x4a\x3d\xc4\xb9\x97\xac\x1e\x71\xad\xb2\x02\x96\x22\x41\xcd\x63\x45\x4b\x2f\x9e\xb4\xfa\xe2\xda\x0e\xb0\x2a\x7e\x6a\x01\x9c\xd9\xc8\xf6\xe7\x2b\x67\x79\xb3\x63\x57\x46\x9b\xa9\x2b\x24\x4b\x5d\xcf\xe5\x7c\x9c\x49\xb2\xb0\x8a\xb5\x0f\xcb\x2c\x4b\x56\xf7\x68\x99\x77\xfb\xd5\x70\x3d\x9c\x53\xfd\x09\xc1\x1a\xda\x1b\xed\x57\x55\x53\x1a\xae\xe8\x3b\x32\x2f\xe1\xc4\xd3\x9a\x56\x6d\xac\x6d\x8e\xac\x52\x63\xd2\x8c\xba\xee\x18\x73\xc0\xdd\x55\x24\x41\x5d\x73\xb8\x8c\xf5\xc5\x7f\x73\x5e\x6c\x75\x0d\x27\x03\xf3\x4a\xf3\x81\x57\xca\xbd\xea\x71\x71\xea\xba\x6f\x17\xc5\x8d\x72\xfd\x9f\xb3\x0d\xfc\x87\xfb\x7d\x2b\x1f\xd3\xa7\x9f\xe7\xe3\xc4\xb0\xec\xfb\x88\x83\xed\xe7\x8d\xb4\xcc\xbb\x1d\x77\xfa\x4f\x50\x50\x3c\x5d\x70\xca\x81\xb3\xa6\xcb\xe0\x20\xd3\xc6\xab\xab\x46\xe7\xdb\xee\x10\x42\xcf\xd5\xb9\x7d\x17\xf1\x48\x24\xbd\xa3\x78\x64\x5f\x8b\x2d\x03\x86\xcb\x07\x90\x0d\x68\x8b\xa2\x9d\xbf\xab\x1b\xc6\xd1\xae\xbf\x8f\x80\x8d\x34\x90\xd2\x84\x9d\xb6\xd5\x06\x19\x34\x9e\x73\xd3\xbb\xe2\x23\x83\x5c\xb6\x6b\xc7\xbe\x98\xea\x1c\xd1\xd2\xc2\xb1\x3e\xa1\x06\xd6\x01\x0c\xe5\x2c\x86\xd0\xc4\xf3\x53\xa9\xd7\x6a\xed\xc5\xa1\x07\x76\xab\x53\xa8\x4f\xad\x52\xbf\xe2\xbf\x6d\x57\x90\xf6\x6e\x02\x83\xd6\x53\x4b\x7f\xec\x3c\xa3\x56\x80\x20\xc0\x17\x56\xf6\x57\x09\xaf\x10\x04\xb8\xac\xe8\x31\xa9\xd4\x3d\xa8\x9d\x80\x25\x15\xd2\x48\x0c\xd2\x7e\x87\xb8\x0b\xdf\x1b\x08\xb8\x4c\x7c\xbe\xf7\x49\x13\x10\x1d\x21\xfb\xbc\x69\x84\x3d\x0e\x31\xc1\x2b\xb8\x1f\xf6\xf7\xfa\x76\x26\xb1\xca\x89\x6a\x04\x4c\x17\x76\xfe\x18\x7c\x14\x2a\xd7\xcd\x02\x93\x40\x84\x18\x9f\xad\x00\x36\x66\x86\xe0\x24\x58\x80\xcd\x86\x06\x79\x51\x44\x73\xa5\x3c\xc7\xf8\xfa\xb1\xb0\x1c\x81\x05\x18\xed\xec\xe2\xc8\x38\xb1\xc2\xe5\xe8\xfc\x20\xca\xc7\x96\x6c\x60\xf1\x1b\xc3\xb1\x3b\xe3\x51\xda\xbd\x41\xb5\x5f\x1b\xae\xee\x75\x27\xb3\x87\xdb\x3c\x99\xbe\xe5\xd7\x99\x8a\xc7\xc5\xdb\x13\x31\xf0\x3b\x3d\xa6\x27\xfe\x71\x3a\x02\x6f\xa6\xc5\x54\xe5\x13\x54\x89\x56\xce\x99\x90\xb6\x55\x8e\x77\xfb\xc4\x3d\x02\x77\xa8\xe9\xb7\xc5\xbf\x27\x21\x28\x1e\x7b\xd3\x2f\xf7\xdf\x6d\x1c\x1c\x8c\x65\xd9\x28\x87\xa8\x71\xe2\x96\xf1\xf4\xee\xfa\xc4\x27\xd6\x0f\xeb\x40\xda\xce\x5f\x1b\xde\x15\x24\x9c\x93\xf3\x07\x71\x47\xc9\xd0\xf7\x6d\x85\x97\x0f\x53\x32\x06\x59\x80\x88\x65\xfa\x17\x28\x32\xf1\xaf\xc9\xbf\x00\x82\x34\xff\xc9\x0d\x45\xfd\xfc\x5f\x85\x87\x92\xec\x17\x75\x05\x2c\xd6\xa2\x59\x0b\x42\x37\x67\xe0\xb5\xec\xfa\x51\x01\xb7\xc2\x83\x51\xaa\x33\xb9\xfb\x50\xbd\x59\x51\xb9\x28\xf7\x43\xd2\x16\x4a\x5d\x16\xca\xfe\x89\xac\xf7\x6d\xc4\xde\xa7\x18\xce\x6f\x17\xd5\x4b\x31\xc0\xe4\x0b\xf2\x42\xc6\x59\xf6\xe8\xe1\xbf\x42\xaa\xa8\x9a\x02\x53\x4c\x55\xe9\x40\x0d\x5f\x52\xe2\x17\x97\xaf\x68\x5e\x29\x70\xc6\xfc\xe1\x5c\xfc\x5e\xc2\x68\x78\x32\xa0\x29\xd5\xde\x09\x0a\x8e\x73\x92\x21\xa2\x65\xd8\xad\xdf\xa0\x8e\x05\x14\xad\x81\x2b\xb2\xa2\x98\x26\xb0\x9f\x8c\xad\x8f\x93\xaf\xc1\xdc\x27\x15\xed\x5c\x6a\xf2\x55\xd3\x13\x84\x03\xc5\x20\xee\x2c\x32\xf4\x22\xcc\xa9\x71\xfe\x5c\xb6\x7c\x1a\x81\x52\x25\x45\x7e\xa0\xd4\x16\x8b\xe0\xe1\x42\x0a\xd0\xcf\xab\xfb\x66\xb9\xa2\x04\xc1\x42\x6a\x75\xc5\x93\x20\x46\x77\x41\x34\xe1\x75\xb6\x22\xf4\xa4\xba\x64\x1b\x3a\x49\xba\xd1\xd8\xa2\xad\x5b\x56\x24\x1b\x22\x25\xbb\x20\x8b\x88\x94\xe4\xad\x0c\x40\x69\x49\x7b\xd5\xfa\x5b\x35\x76\x22\x7f\xef\xa4\x83\xf5\x76\x89\xa9\xb8\x6d\x3e\xb2\xea\xcb\x6f\x7b\x58\x6a\x50\x6e\x62\x2e\x3b\x1e\x8b\x89\xad\x7a\x1c\x9c\x18\xf7\xb4\xda\x4b\x28\xbc\xd7\x35\xf6\x74\x2c\xcc\xc3\xbb\x09\x6a\x1b\x92\x7d\x89\x72\x36\x2c\xa3\x05\x06\xc5\x11\x09\x2d\x4a\x0f\x5c\xf8\xf3\xac\x41\xc6\x41\x16\x76\xaa\xe2\xa3\x23\x9b\x56\xf0\x76\x35\x41\x9e\xdd\xa0\x38\x3c\xc4\x47\xfa\xb5\xa8\x94\xb5\x9c\xe7\x45\x25\xfb\xaf\xe2\x11\xb1\x03\x62\xfe\x46\xd8\x44\xd3\xcc\x3f\x82\x99\xff\x62\x7d\xec\x7e\xd8\xcc\x75\x85\xed\xa8\xa9\x33\xd7\x48\x35\x3e\xce\x50\x13\x3d\x1a\x20\x59\xe2\x99\x14\x24\x1b\xbb\x4d\x7a\x14\x12\x04\x96\x77\xd8\x11\x22\x62\xe7\x98\x45\xcb\xec\x57\xde\xf4\xec\xdd\x0a\x0b\x4d\x0e\x44\xaa\x90\x8e\xe5\x37\x75\xfd\x89\x43\x8d\xf2\x54\x4f\xeb\xf5\xe3\x74\x13\x58\xf6\xe0\x25\xa7\x2a\x9c\xbf\x01\x11\x01\x53\x32\xbe\x57\xc2\xba\xe3\x13\x25\xff\xfd\xf6\x9f\xa9\x0c\xcc\x23\x97\xa1\xe1\x94\x0a\x13\x51\x80\x1a\xaa\x71\x54\x1a\x9c\x76\x7c\x6d\x1e\xcc\xd5\x63\x39\xeb\x75\x1e\x64\x77\x9d\xd7\x25\xd4\x75\xeb\x86\x33\xbf\x5c\xc6\x66\xf7\xf4\x9e\x95\x7d\x7e\x75\x6e\xb0\x6b\x54\xa5\x1c\x33\x0e\x3b\x82\x1d\x89\xdf\xae\x1d\x3e\xec\xe6\xf2\xfb\x44\x0e\xbd\x72\xde\x75\x34\x9b\xf4\x35\x7e\x66\xda\x69\x94\x5c\x63\x95\x6e\xa5\xcf\xda\xc3\x1c\x55\xa0\xdd\x89\x6d\x6a\xc5\x9b\xd4\x09\x77\x17\xff\x17\x24\xdd\xfd\xd6\x34\xfe\x6f\x8b\x07\x2a\x66\xd3\xe6\xb1\xd5\x04\x72\x5a\x3f\xe3\x8f\x9a\x61\x67\x95\x34\xc1\xec\xde\x46\x26\x4d\x9b\xbd\xb9\x42\x2a\xd6\x70\x4d\xe4\x24\x09\x4a\x65\x66\x01\xab\xcf\xe3\xe7\xf9\x78\x4d\xb1\x93\xb0\x98\xb5\xaa\x73\xf4\x4c\x25\x38\x10\xd4\x86\x4b\x42\xc5\xd6\x42\x52\x59\x1e\x37\x6d\x1e\x93\x7b\xe0\x99\x7f\x27\x26\x1a\x95\x4c\x50\xf8\x83\x85\xd4\x40\x95\x9c\xa4\x64\x9f\x12\xb2\xa3\x21\x23\x28\x71\x33\x0b\xa7\xf6\x5e\xcd\x8a\x34\x3a\x7c\x13\xa7\x6f\xd4\x2a\x48\xbc\x12\x5d\x15\x85\x53\xd4\xc6\x7c\x4e\xa9\xae\xf0\x11\x5a\xa4\xce\x8e\xb5\x71\x0e\x58\xa9\xa0\xd2\x1b\x28\x62\x32\x67\xe0\xe5\x3b\x38\x13\x96\x63\xb9\x17\x99\xc0\xb2\x32\xf7\xab\xec\x43\x74\x2b\x31\xd6\x06\x47\xb7\xa5\xa6\x35\xbb\xa4\x92\x50\xaf\x90\x7c\x5a\x29\x76\x7a\x1d\xdf\xed\xb8\x52\x27\x88\xa1\x5f\x01\xa2\x2f\xa7\x86\x43\xe8\x2c\x28\xfc\x0c\x02\xe2\x1c\x8e\x56\x05\x68\x7f\x49\x5e\x89\x8f\xaa\x16\xb5\x18\xd5\xba\xc1\x36\xad\x3b\x3a\x40\xa5\x14\xc5\xa2\x5a\xc3\x3a\x92\xc3\xdf\xe3\x47\xa8\x9a\x55\x38\x75\x53\xe0\xb7\xa7\xc0\x09\xaa\x4a\x91\x49\xef\x02\x16\x3d\xbb\xc1\x51\xb6\x53\xdc\xcc\x6a\xee\xe6\xbb\x60\x75\xfc\x54\x17\x36\x79\x3d\x56\x8f\xb1\x0a\x4e\x0c\x69\xc6\x62\x8e\x7e\x60\xa6\x0e\x5c\x7e\x51\x11\xb4\x51\x6e\x6e\xab\x71\xb0\xc2\xbd\x4b\x06\x0a\x5e\x69\x1b\xe1\x6d\x2b\xe7\x15\x16\x34\x5c\x96\x92\x5a\x46\x78\x5a\x77\xec\x6d\x4f\x59\x04\x8a\x0b\xac\x36\xbe\x93\xed\x6c\x78\x4a\x22\xef\x18\x6c\x4d\xe6\xba\xaa\xfb\x82\x25\xef\x10\xdb\x1e\xcf\xb6\x61\x97\xbd\xc2\xda\xe0\x11\xdd\x22\x95\xbe\x7e\x82\xac\xe5\x0f\x94\xff\x04\xa4\x62\x01\x48\x90\x90\x08\xc7\x43\xe8\x91\xf5\xe7\x9c\x3a\xc7\x00\xd9\x43\x94\xcb\x11\xa7\x1c\xa1\xb8\xc1\x8e\x36\xd6\xd7\x98\xb3\xfc\x44\x8b\xbe\x1d\x0a\x43\xb8\xc7\x1e\x59\x22\x14\x9e\xb2\x0e\xf2\x3e\x8b\x5a\xb8\xe5\x17\xb8\x7a\x56\x3a\x63\x79\x8c\x04\x53\x50\x50\xce\x39\x5b\xb0\x89\xc2\xb2\x74\x68\x41\x73\x2a\x09\x9b\x9d\x90\x4b\xb6\xc8\xd9\x94\x54\x49\xc9\xb1\x74\xf4\x73\xb5\xd0\x03\xd2\xb6\xca\x81\x86\xcd\x9b\x6b\x00\x71\xf7\x0b\xd4\x84\x03\x66\x42\x1e\xb8\x75\xef\x21\xb9\x2e\x62\xe6\x6f\xe0\x29\xe6\x3a\x89\x1d\x56\xe2\xba\x68\xd5\xa0\xda\x2d\x0b\x52\xb0\xbb\x3b\xaf\x60\x50\x38\x54\x1b\xe2\x09\x61\xbc\xdc\x48\xed\xbb\xbe\xb7\x23\x2d\x7d\x61\x8b\xb5\x69\x31\x3f\xda\x5d\xe9\xc6\x25\x25\xc3\x10\x33\x3c\xa2\xfe\xec\x8e\x9c\x37\xf2\x70\x0f\xc5\xb9\x2d\xe4\x0d\x6e\xd5\xdc\x73\x30\x95\x45\x87\x7f\xa3\x61\xa5\x5f\xe2\x92\x0d\x33\x01\xdb\xb7\xbe\x07\xec\x9f\xbd\x50\xe5\xe7\xd8\x9d\x07\x54\xf8\x33\x50\x6d\x05\xf5\xf6\x17\xa7\x96\xe5\x9c\x49\x9d\xf7\x53\xd6\xcf\x53\xed\x09\x74\x50\x38\x71\x6e\xf8\xdc\xec\x05\x26\x44\xc6\xb7\x66\x79\x37\xad\x72\x49\x9c\xaf\xb8\x64\x37\x0c\x8f\xdb\xe3\xd9\xe4\x10\xac\x8f\xa1\x4a\xdb\x18\x6b\x55\x0e\x0b\x4c\xf9\xee\x85\xee\x56\x1b\x92\x77\x50\xe9\x39\x70\x69\x52\x2d\xed\x86\xe9\x2e\xc6\x3c\x84\x19\x69\x3c\x3d\x69\xb5\xdb\x46\xd1\xdb\xc5\x1b\x82\x91\xab\xf6\x4e\x82\x17\x30\x7a\xfe\x82\xd0\xe1\x19\xee\xfc\x25\xa3\x41\xb4\x86\x52\xc9\xcc\x39\xa7\x98\x86\x03\x37\x58\x3a\x0c\xb6\x3f\x2f\x8d\xdd\x42\x12\x88\x9e\x31\xe2\x7b\xb9\x90\xf4\xf0\x84\x88\xf9\x2b\x77\x47\x3e\x81\x25\x87\xc5\x5c\x94\x2e\x15\x09\xbf\x5d\xd9\x11\xa5\x41\xc4\x5d\x7d\x80\x10\x22\xef\x72\x61\x9d\x05\x5d\x39\x2d\xb3\x82\x35\x85\xc1\x49\x20\x0b\x73\x1f\xc6\xac\x4a\xe6\x33\x23\x08\x72\xa2\x35\xa7\xf1\x35\xa9\xc5\x4f\x7d\xcc\xe1\xa5\x8d\x5a\x0b\x50\xa0\x72\xc8\xf5\x25\x6f\x9f\x7f\x90\x9d\xe9\xe2\x20\x70\x5b\x57\xf5\x7d\x4b\xa3\x78\xf9\xb8\x6a\x7b\x16\x16\xb8\x5b\xd5\x39\xec\x17\x1e\x02\x50\x14\xd6\xb3\xbe\x1d\x91\x29\x86\x64\x5d\xed\xec\x4a\xb6\x85\x8f\x7f\x73\xed\x13\x6b\x4a\xb0\x49\x73\x34\x26\xf7\xad\x71\x6c\xb8\x3e\xc7\xbb\x95\x09\x25\x98\xbe\x00\x2b\x88\xef\xd6\xdf\x88\x0b\x04\x7a\x1a\x73\x6c\x62\x72\xeb\xa4\x70\x6d\x72\x72\x11\x89\x33\xf6\xc1\x7b\xc9\xca\x28\x97\xeb\xe1\x80\x15\xa1\xe8\x50\xe6\x0b\xa9\x57\xfe\xf7\x6b\xbf\xf9\xf5\x5a\xf2\xf9\xd5\x5b\xb7\x6e\x5d\x05\x0d\xd7\xd5\xc9\xa8\x9f\x0d\x60\xe3\xbd\xb5\xe4\xff\xfc\xe8\x57\x98\x1c\xf0\xce\xe2\xa0\xfd\x16\x92\x1e\x97\x37\xae\x5e\xc3\x25\x85\xb5\x84\x6f\x98\x92\x8d\xe4\xbc\x12\x1e\xdf\x53\x86\x6d\xae\xef\x72\xda\x48\xed\x19\xa5\xc4\xed\xb2\x62\x71\x39\xaa\x7a\x60\x20\x84\x79\xc9\xdf\x97\x41\x38\xaf\x66\x7e\xbb\xa3\x0c\xaa\x21\xb3\xd2\x40\x7f\x32\xbc\xf0\x8d\x95\xea\xa4\x87\x7d\x72\xb3\x86\x9a\x55\xcf\x59\x37\x4e\x9e\x36\x41\x3f\x3f\xd4\x51\x99\x98\x6f\x66\xb6\x28\x10\x2a\xf0\xd8\xac\x24\xc9\xf0\x81\xff\x14\xe2\xa6\x98\x39\x87\x48\xf0\xd5\xfc\x24\x1c\x10\x73\x2d\x17\x83\xfe\x2e\xbd\xc6\x63\x91\x44\xe7\xfc\x3c\xe0\xbb\x7d\x1e\x1e\x50\x7b\x36\x66\x1a\xac\xcc\x06\xbd\x4e\x06\x84\x17\x63\xa5\x0c\x67\x66\x55\x40\xe2\xd1\xe8\x65\xeb\xaa\x3e\x91\x70\x44\x2a\x72\x6e\xb3\x8c\xe0\xc3\x7f\x04\x10\xc7\x66\xbc\x63\xeb\x38\x28\x44\x98\x0b\x8d\x56\x47\x8a\x39\x2b\xc7\x1b\x49\x8d\x37\xcf\xce\xa0\xb2\xb9\x4e\x9d\xd2\xde\x46\x53\x56\x6e\xca\xf7\xf5\x57\x74\x38\x1a\x26\xd5\xd0\x99\x57\x73\xce\x08\x81\xab\x7b\xb1\x16\x71\x69\x5f\x13\x86\x67\x26\xb5\x15\xd6\xa4\x92\xa3\xfa\x15\xba\xaa\xe0\xd9\xaa\x7a\x65\x1a\x36\xa8\xb8\xad\xad\x25\x36\x14\xa2\xe2\xb8\x63\x2b\x69\x54\x6e\x08\x40\x0d\x73\x7d\x47\x61\xd4\x32\x01\xc8\x2b\xc6\x6c\x3b\x5a\xeb\x01\x15\x2b\x31\xbd\xa6\xaa\x4a\x19\x7e\xb6\x11\x21\x7f\xf6\x82\x80\x2a\x60\x6e\x39\x34\xe5\x56\xba\x8f\x31\x1f\xa7\xe2\x61\x83\xd6\x36\x45\x35\xe7\xe2\xc3\xea\x5c\xfb\x1c\xcf\xc6\x95\x24\x4f\x03\xe9\x10\x09\xd7\xb9\xaa\x15\xe1\x99\x2a\x54\xd2\x0a\x97\x21\x95\xac\x48\x44\xdc\xc1\x9b\xef\x9f\x3d\xb6\x38\xb8\xf1\xaa\xfa\xc6\x4e\xd6\x28\x7a\x51\xaa\x10\x61\xc6\x73\xce\xf5\x6c\xf3\x85\xcc\x2a\x9c\xac\x2f\x06\x7b\xd8\xbb\xc2\x1c\x60\x6a\x3a\xc4\x98\x8a\xe2\xf3\xa9\xb1\x94\xc0\x84\x0b\xde\x8c\x57\xf4\xc3\x2f\xf0\x7b\x0d\x06\xc1\x08\xf9\x28\x50\xb5\x43\x04\xcd\x05\x08\x6d\xe1\xd1\xf0\x7b\xaf\xd8\x49\x73\x2e\xb6\x7a\x1c\x6b\x00\xde\x5e\x03\xcc\x64\x45\xaf\x65\x71\xa4\xcf\x77\xd8\x2f\x76\xb9\x5e\xf4\x43\x55\xc2\x98\xcd\x13\xb8\x8d\x3d\x09\x2e\x55\x99\x1a\x03\x95\x9f\x1b\x27\x56\x48\x7a\xf5\xb1\xdc\x38\x42\x7a\x2e\xb2\x26\x51\xa2\x59\x6f\x3f\x47\x5e\xfc\x9a\xb9\x3a\x1b\x20\xb2\x49\xa7\x3a\xff\x10\x3f\x26\x51\x4a\xcc\xab\x05\x9e\xb5\xc6\x17\x6b\x23\xa8\x53\x7c\xbc\xb0\xa5\xc1\xbd\x0c\xc9\x3c\x3e\xfe\x70\xb2\xf2\xd1\x68\xd5\x72\x35\xa8\x25\x76\x6e\x35\xc5\x92\x6d\xd3\xa0\xf4\x73\x20\x3a\xd9\x62\xc6\x7e\x2e\xd5\xb9\x75\x53\x9c\xbb\x5a\xbd\x6d\x7f\x50\x55\x12\xfa\xa1\x14\xdc\xad\xbf\xaa\xa5\x2e\x11\x7d\xa2\xe4\xbc\x06\x07\x62\x0f\xe4\xa2\x95\x9f\x5d\xa9\xdf\xfa\x99\x55\x76\x56\x2d\x8f\x6b\x15\xc5\x1b\x35\x10\x19\xd3\x00\x9d\x3b\x65\xda\x38\x58\xb3\x7e\x48\xdd\xc7\x79\xb0\xdf\xac\x42\x9a\x2f\x0e\x16\xba\xc8\xb0\x5f\x7d\xb6\x41\x95\xfc\x03\xf4\x42\xb1\xdd\xda\x1b\x7b\xb8\x1a\xfc\xc7\x4d\x3e\xa7\xbe\xfa\xa8\xd5\xcb\x37\x37\xdb\x1b\xa3\xe2\x56\x09\xe5\x95\x27\xa3\x6e\x56\x29\x13\x00\xbc\x80\xcd\x14\x46\x92\x0d\xf8\x02\x63\x4f\x88\xae\x37\x2f\x66\xe9\xa5\x05\xa0\x4f\x14\x50\xb0\xee\x42\xb7\xe9\x67\x0c\x14\x46\xc5\xf3\xcd\x34\xef\x43\xce\x51\x31\x29\x91\x6d\xf7\x67\xa6\x51\xc2\x9e\x12\xfb\x14\x9f\x22\x61\xc1\x68\x2f\xc2\x41\x20\x0f\x6b\x07\xfe\x85\x15\xa6\xd9\x28\xc5\xc1\x4a\x89\x33\xa9\xb1\x17\x14\x38\x6f\xc0\xb0\xaa\x6f\x39\xec\x1b\xc1\x1e\xaa\x23\x38\x83\x16\x07\xb0\xaa\xa2\xf3\xaa\xc3\x64\x90\x6f\xe6\x59\x8f\xbb\xdc\x73\xd8\xa8\xda\x1c\x56\xc4\x19\x5f\x84\x83\x86\xb8\x45\x89\xf7\xa7\x20\x71\xb0\xc6\x83\x73\x9e\xb9\x24\x7a\xbc\x53\xc7\x6f\xe3\x03\x97\xbe\xd0\xd5\x69\xdd\x4f\x15\x57\x3e\xd7\x6d\x7c\x7b\x81\x6a\xc7\x37\x6c\xe8\xdc\x4f\x7f\xf9\x6b\xfa\x03\x8b\x42\xb8\x2c\xb4\x7e\xc1\x8d\x45\x98\xf2\x1f\xbb\x60\xfe\xdd\x72\x32\x1c\x82\x97\x37\xe0\xa9\xbf\xa2\x1a\x82\x0b\xca\x06\xc9\x0c\x22\x59\x5b\x75\x98\xb7\xcb\xdc\xa6\x03\x83\x11\xc4\x04\x71\xf2\xc0\xee\x0f\x89\x07\xa2\xd5\x40\x4d\x8f\x9d\x74\xb0\xab\xea\x52\x50\xeb\xe8\xcc\x08\x47\xc1\xcc\xe4\xf5\x41\x73\xfb\x13\xb2\x3e\xd0\x05\x20\xf9\xb9\xe5\xa5\xfe\x49\x3b\x5e\x07\x45\xbe\x52\xed\x1d\xfc\xb7\xab\x3d\xb8\x98\xdb\x96\x33\xdb\xb2\x37\x4a\x37\x39\xc1\xd9\x57\xe0\x14\x6c\x3f\x98\xa3\xb6\x23\xd0\x35\x1d\x5c\xd5\x4e\x5a\x6a\x36\x03\x72\x1b\xe2\x92\x0a\xdc\x3e\x07\x32\xda\xef\x18\x65\x48\x11\x3d\x18\x8f\x23\xbf\xa7\xa0\x2e\x5c\x77\x50\xa4\x80\xcb\x25\xc8\x65\x77\xd6\xcb\xa5\xcd\x41\x0d\x72\x0d\x26\xcd\xb3\xb8\x76\x1e\x39\x02\xc2\x26\x1d\x2a\xaa\xf3\x20\x82\x43\xbc\xc3\xd2\x91\x8d\x06\x45\x3d\x60\x6d\x98\xc7\xa0\xd8\x39\xd8\x01\x84\xd0\x8d\xe7\xce\x47\x97\xc5\x18\x0b\x9a\xb7\xbd\x43\xd0\xd3\x38\x59\x02\x97\xf4\x92\x5d\x28\xb0\x26\xa2\xef\xc7\xef\x94\xc8\xb6\x64\x2a\x6f\x42\x69\x18\xd8\x23\x40\x24\xfa\xe5\x97\x0b\x2a\x19\xcb\xbd\x30\x82\x0d\xb5\xe8\x68\x8a\xf0\x73\xd4\xd8\xad\x81\xa4\x2e\xeb\x1d\xa7\x5b\x9e\x92\x4e\x89\xb0\x33\xd5\x08\x75\x37\x8b\xff\xcf\xac\xe0\x1b\xaf\x6b\x43\x15\x50\xe2\x0d\xd8\xa6\x41\x66\x1f\x1e\x19\x63\x32\x58\x62\xd6\xf5\x47\xc4\x02\xed\xad\xaf\xca\x54\xc9\xa7\x1a\x46\x4a\x3e\x73\xfc\x8e\x0a\x7d\xd3\x40\xcf\x48\x59\x23\x26\xfb\x19\x14\x4c\xa4\xae\x10\x3e\xd4\x72\x7b\xed\x76\xe4\xe5\x54\xab\xfa\x8b\xc6\xf5\x6a\xf4\x31\xaa\x9e\xba\x7a\xee\x9e\xe8\x2a\x1c\x9b\x7c\x87\xf5\x68\x80\x78\xa5\x3c\x51\x12\x79\xe7\x2a\x37\xb6\x63\x10\x6c\x5d\x59\x0c\xfb\xbb\x8d\x8e\x12\x5a\x2d\xa2\x8f\x39\x16\x8e\x6b\x97\x3b\xd9\xe8\xe7\x46\x14\x77\x4f\x46\x62\xd3\xc2\x8d\x61\x44\x20\xa3\x1a\x3f\x24\x10\xf9\x10\x1f\xf3\xe0\x4b\xb1\xb8\xc7\x86\xf1\xd5\xe0\x2f\x92\x33\x5d\xf3\xaa\x0f\x55\x7d\xbf\x58\xba\xac\x18\x2e\x59\x91\xe5\xd3\x28\x42\x5c\x03\x2a\xbe\x69\x2e\x7f\xe9\x94\x60\x9b\x5f\x01\x68\x2c\xf4\x4b\xb8\x38\xfb\x56\x59\xad\x2b\x8f\xa7\x00\x62\x55\x4f\x9c\x10\x0f\xf8\x61\x85\xc1\x98\x5a\x24\xf0\xe2\x09\x75\x16\xb1\x1a\xd9\xa0\x32\x11\xc7\xda\xc7\x10\x8f\x2f\xec\x59\xbf\x55\x14\x69\xec\xf6\x39\xa1\x56\xa9\x13\x39\xd3\xbb\x81\x3b\x6d\x7d\x5a\x8c\xb6\xae\xb7\xd0\xff\x00\x8b\xe3\xf8\x89\xa5\x6b\xec\xfc\xd8\x7e\x13\x94\x6d\x5e\xa7\xa7\x60\xac\x53\x4e\xee\xcd\xfd\x57\x2b\x76\x5e\xeb\xd7\xb0\x72\x15\xf4\xb4\x2d\x35\xf8\xcc\xac\x5a\x3d\x69\x20\xe9\x49\x6c\x70\xc3\x66\x61\xb5\x3b\x1b\xc1\xf9\x75\x25\x3d\xeb\x30\x2b\x86\x94\x18\x74\x0f\xc9\xc9\xac\x65\xae\x09\x6a\x2f\x95\xc5\x4e\x86\x91\x06\x4f\xf1\xa2\x58\x9a\x13\xd3\x26\x94\xab\x1f\x67\xe9\x4e\x49\xea\x99\x63\x36\x08\x62\xc9\x1d\x76\xbd\x28\xd7\xc5\xcb\xc2\xfb\x08\x0b\x2a\x21\x4f\x3f\xa8\x83\xaa\x5e\x51\xba\xca\x20\x4c\x50\x89\xc0\xb6\x2e\x46\x08\x96\x78\xfe\x7e\xfa\x08\xe8\xe5\xd7\xa8\xbf\x43\x60\x42\x5f\x6a\x1a\xdb\xfb\xbb\xcf\x6e\x74\x4b\xf1\x61\x5f\xea\xe8\x14\x71\xb4\x67\x67\x8a\x33\x66\x67\x1e\xea\x0c\x4a\xc8\x78\xde\x91\x58\x8a\x7d\xaa\x2f\xe2\xe5\x82\x22\x4d\xb7\x5d\x8e\x9d\xfb\x3f\x97\xb6\x38\x06\x5e\xe0\x37\xd5\x01\x7f\x42\xdd\xbc\xf2\xa9\x64\x11\xe0\x0c\x0d\x27\x0b\xae\x4f\x1e\xe4\x3e\x52\x86\x02\xcf\xb5\xc9\xe6\xda\xc6\x09\x7e\xd2\x6a\xa8\x15\x5c\xeb\x2c\xf3\x83\x2b\x06\xff\xe7\x42\xd5\xfd\x76\x4f\x66\x85\xca\xc0\x8d\x11\xab\xab\x06\x1b\x5b\x04\xc0\x2f\x3f\x62\xd3\xb9\x95\x6d\x50\x0c\x28\xf0\x1e\x73\x1d\xf2\x09\x85\x65\x89\xe2\x3c\x22\x69\xd1\x56\x20\xae\x8f\x0a\xad\x54\x9d\x6b\x0c\xad\xf4\xbb\x37\xbb\x4c\xd6\xde\xd1\x4a\x8e\x93\xda\xfe\xc2\x31\xa9\xe6\x81\xfd\x80\x90\xd4\xa5\xcd\x63\xc1\xce\x10\xf4\xe7\xc2\x96\x69\x39\xae\x5f\xf3\xbc\xaa\xe3\x36\xc2\xbd\x61\x4d\xdd\x09\x7c\xcd\xdc\xf0\x14\xb2\x1b\xd5\xee\x3c\x46\x19\xcf\xd3\x70\x87\x1c\x47\x0d\x7a\x0d\xf5\xe2\x69\x97\x12\x90\x46\xab\xde\xad\x3a\x48\x70\xd4\xb5\x74\x83\xed\xf3\xa7\x82\x92\x02\x23\x0c\xfb\xcb\x37\xf9\x64\x93\x3f\xf6\xff\xb3\xf8\xf7\x88\x3f\xb6\x8e\xfe\x61\x96\x94\x5d\xc4\xd1\xfc\x7f\xc2\xd4\x7e\xfe\x46\x9d\x97\xaa\x3b\x0c\xcf\x5b\xb5\xd6\x53\x95\x7b\x01\x46\x67\x21\x20\x64\xc8\xe2\x07\x11\x1d\x41\x79\x79\x9e\x7f\x82\x75\xd9\x17\xc8\x84\xc6\x39\xdc\x5e\xdf\x4d\x53\x39\xb1\x84\xe5\xd9\xaa\x69\xcd\x42\xd8\x84\xad\xaf\xb9\x5a\xfd\xb4\xe4\xe7\xc4\xb1\xd3\xb2\x5f\xa9\x4b\xc5\xf7\x16\x73\x9c\x56\x17\x7c\xa6\xa4\x6c\xac\x78\x59\xf7\xfa\x5a\x4c\xc8\xdb\xfc\xdf\xed\x7c\xd8\xb9\x99\x97\xf9\x46\xde\xcf\xa1\x34\x19\x68\x05\x0f\x58\x9a\x46\x60\x78\xd7\xf6\x40\x11\xa2\x0b\x1a\x2d\xe6\xe3\x82\x2f\x42\xf2\x50\x95\x4a\x11\x4c\x2e\xf0\x87\x1f\x35\x3a\xde\xb8\x7e\xa3\xfc\x26\xe5\x9f\xf4\x9a\x9c\x86\x0d\x6a\x46\xb6\x51\x96\xa7\xc1\xae\x3a\xa3\x82\xc2\x7c\x8e\x88\xad\xa9\x64\x8f\x75\x9b\x8a\xa6\x66\xf6\x47\x83\x84\x10\x54\x6f\x54\x7e\x27\x1f\xdd\x20\x01\x15\x7f\x33\x8c\xed\x4d\xb1\x6d\x83\x8e\xd5\x7e\x60\x1e\x4c\x81\x8c\x84\x15\x5a\x7e\x40\x78\x2b\x50\xa1\xbc\x1b\x76\x1c\x14\xb7\x3c\xc6\x6d\xc9\x21\x1d\x94\x6e\x81\x38\xb7\xf6\xef\x0b\xb0\x52\xd1\x71\x1e\xb0\x47\x15\x55\xa3\xe5\x06\xde\xf2\x1e\x99\xe5\xd1\xcf\x20\x2e\xd8\xd2\x9c\x4f\x9b\x6d\x39\xd5\x2e\x5e\x8d\x7d\xc7\x78\x30\x60\x5b\x2d\x88\x4b\xbd\x4b\xce\x91\x7e\x71\xfb\xdb\xb1\x88\x17\x66\xa9\xca\xb6\x5f\x3c\x34\xb2\x42\x2f\xbd\x47\xb5\xcf\x6b\x2c\xd1\x2a\x1a\x63\x6f\x6f\x2d\x11\xec\xc2\x91\x04\xd8\x85\x5c\x1e\x11\xb1\x3e\x14\xe7\x07\x5a\x0b\xe6\x31\xb1\xeb\xff\xba\x31\xca\x2f\x74\x4e\x8f\x0c\xb1\xe2\x76\x62\xeb\xc3\xc4\xb0\x8a\x92\x37\xee\x50\x72\x5e\x6a\xae\x7f\xea\x6c\x6e\xf4\x62\xe7\xb2\x49\x5b\xc1\x3c\x58\xd5\xe2\x64\x51\xa9\x68\x4e\x3d\x9a\x59\x3d\x6a\x83\x4f\xb4\xac\xb2\xc7\x3a\x24\xe3\x2b\xda\xad\xd8\x25\xc1\x17\x09\x35\xee\x1e\x9c\x84\x6e\x2b\xd5\x4d\xe3\x08\x9e\xde\x5c\x0d\x6a\x89\xac\x2a\x51\xdb\x90\x92\x46\x0d\x13\xc1\xc6\xee\xd0\x44\xb2\x12\x2c\xe3\xc9\x42\xf6\x10\x2e\x96\x84\x84\xfa\x48\xdd\x5e\x14\xb9\x2a\xca\x16\x77\x3f\x16\xbe\x7a\xd8\xd6\xba\xd9\x3b\x1b\xb3\x8b\xb0\xc4\x0e\x86\xbf\xa9\xcc\xe0\x62\x2b\x55\xe2\x25\x3d\xbc\x6e\x1b\xc4\x6b\x9c\xb1\x1e\xfe\x15\x33\x9d\x0e\xc9\x4b\x46\x61\x4f\xea\xb4\x39\x90\x5f\x20\x86\x3b\xb3\x24\x14\x95\xaf\xa4\x87\x9e\xdb\xe0\xd7\x98\x31\x6e\x86\xc6\xba\x3a\x00\xb8\xb8\x3a\xa7\xba\x43\xcb\xce\x86\x0f\x74\x05\x95\x4e\x5b\x63\xd8\x0a\xd8\x87\x6f\x0b\x6f\xa8\xc6\xe4\x68\x41\x56\xa5\x34\xb2\x70\xf9\x6e\xe5\x58\xc5\xf5\x6f\xa1\x32\xa5\x53\xd8\x04\xa7\x75\x50\xf8\xfa\x5c\x5c\xfd\xf7\x59\xf8\x53\x87\xd5\x5f\x6b\xe1\x9c\xc0\x91\x31\x73\xc5\x8f\xb7\x26\x8b\x4e\x80\xb6\x57\xde\x8a\x5d\x76\x3d\x5e\x30\x80\xa7\xf9\x36\xbd\xf5\x15\xf7\xb5\x76\xee\xae\xd6\x12\x15\xc9\xb2\x50\xa1\x25\x7e\x58\xd5\xcc\x01\x9a\xd2\xdf\x90\xf2\x87\x3d\x9f\x23\xca\x1c\x41\xdc\x18\x5b\x84\xaa\xa8\xda\xd8\xa2\x97\xd1\x20\x56\xd0\xbf\x07\x18\xc7\x2e\xc0\xf3\x6c\x61\x64\xb3\x27\x0e\xf7\xa1\x67\x98\x2c\x1e\x03\xa6\x28\x17\x86\xe6\xc8\xdc\x1c\x83\x62\x80\x9a\x50\x70\x5c\xa2\x76\x78\x81\x8b\xc3\x45\x4d\x58\xf0\xa2\x5a\xca\x55\x67\xa0\xb2\xd9\x30\x30\x75\xa0\xcd\x20\xfc\x62\x11\x2b\xdc\x66\x78\xee\x4f\x11\x8c\xae\xb7\x7a\x69\xb9\xbd\x51\xa4\xa3\x1e\xa5\x09\x3f\xc1\x63\x3a\xe5\x4c\xa4\x18\xd1\x0d\xa8\xe9\xa8\x05\xae\xa9\x65\xe8\x97\x0a\x05\xaf\x8c\x14\x94\x0e\xf2\x2f\x52\x51\x7c\xd4\x28\x30\xfd\xfb\x0c\x23\x3c\xa7\x2d\x28\x50\x09\xb5\xaa\x44\xc9\x01\xa7\x01\xb4\xf4\x9e\xe4\xd3\x69\xa1\xd4\xb7\x15\xa7\xca\x1c\xb7\x8a\x09\xbc\x6c\x9a\x1a\xeb\x28\x5f\x89\x44\x6a\xed\x14\x83\x1c\x63\xc4\x30\x79\xaa\x64\xd0\x69\xe9\x8c\x8c\x4f\x49\xb7\xd4\xc2\xdc\x74\x43\x5b\x21\xd3\x25\xa6\x33\xb7\x59\x8c\xd3\x3e\x5e\x30\x1b\xf8\x4f\xdf\x4d\x2e\xf7\x5a\xee\x4c\xd1\x9a\x6e\x2e\x39\xef\x4a\xad\x4c\x65\xd6\x07\x27\x04\xdb\xb0\x30\xef\x39\x75\xba\x23\xff\xed\xe8\x01\x77\x0d\xc8\xec\xa0\xdf\xc0\xa4\xb4\x83\x02\xf2\xf6\x53\xf4\xec\x91\xfa\x94\x00\x84\xe8\x16\x25\xa5\x8b\xac\x8d\xb2\x26\x2e\xbe\x4f\xf0\xa0\x5e\xf9\x71\xc7\x94\xa1\x1c\xa2\xaf\x12\x31\xc5\xe1\x09\xbc\xe4\x48\x2d\xc2\x31\x1b\x68\x7e\xdd\x78\x3f\x12\xb6\xb7\xa6\xbf\xd6\xe8\x4e\x74\x1b\x3f\x4f\x8d\x76\xbe\xf2\x86\x8a\x31\x87\xee\xeb\xad\x74\xdc\xdd\xce\x4a\xaf\xc3\x1f\x71\x5c\x49\x65\xe2\xaf\x0b\x4c\x26\x91\xb5\x78\xfe\x1b\x7e\x8f\x20\xa9\xcf\x5a\x70\x06\x5e\x44\xb6\xff\x15\x65\x20\x0e\xd8\xb5\xbe\x14\xb7\xd9\xaa\x75\x12\x34\xe6\x18\x10\x92\xce\xf5\x41\xfa\x29\xf2\xbc\x6f\xca\x8e\x54\xf9\x9d\x0e\x00\xed\x7e\x47\xa4\x73\xf1\x8e\x8d\x7d\xe3\x2b\xe7\x16\xb4\xd3\x6e\xb9\xfa\x77\x72\x0a\x6f\x38\x1a\x66\x67\x4e\xc3\xdb\x0c\xfb\xb0\xfc\x84\x65\x85\x17\x12\x7b\x7e\x00\x16\xe6\xca\xe9\xcc\x45\xa2\x6e\xc7\x9e\x53\x68\x83\xae\x7f\x59\xae\x4b\x79\x2b\x1f\xdb\xb2\xbb\xf0\x26\x10\xcf\xc5\x5a\x8e\x26\x03\x76\xde\x59\x72\x4a\x35\xd5\x0c\x32\x42\x43\x62\xf5\x8d\x7c\xd0\xeb\x14\x80\xdf\x02\x8e\x17\x10\xeb\x19\x9d\x85\x75\xeb\xf8\xcd\x07\xa6\x5d\xe3\x20\xda\xf7\x4d\xfa\xcf\xfc\xfe\x74\x70\x47\x28\x97\xcf\x57\xce\x27\xe1\x26\x65\xa6\x31\x1f\xa0\xff\x72\xea\x54\x6c\x65\x98\xc4\x94\x78\x5e\xd8\xc8\x54\x79\x40\xcf\xdc\x02\x5e\x78\x67\x5c\x3f\xb0\x8e\x27\xb6\x16\x20\x3d\xe6\xfc\xef\xb4\x29\xe4\x0e\x80\x4f\xc8\x6f\x8a\xf7\x8b\x4b\x80\x22\x1b\x82\xfc\x76\x5f\xe2\xc4\xb3\x18\xbb\xd1\x3c\xa8\xbf\x95\xca\x68\x2b\xac\x7b\x16\x59\x37\x32\x7b\x83\x2d\x62\x4b\xea\xd6\xed\x47\xe2\x48\x10\x08\x4b\x1d\x6c\xcd\x00\x5e\x01\x8d\xc5\xca\xdb\x48\xdc\x3f\xce\x99\xb6\x72\x49\x3a\xab\x89\xcc\x76\xde\x5c\xa8\xeb\x3d\xae\x4b\xb1\xd0\x78\x85\x5b\xf9\xb8\xb3\xd5\xd5\x47\x20\x29\x13\xba\x64\xf4\x36\x37\xf5\x8d\xb3\x29\x1f\x2f\xb8\xfa\x7f\x8c\x9f\x06\xd7\xb0\xe8\xc0\xfe\x26\x57\x4f\x0e\xa1\xf4\x1a\x28\xa5\x35\x2d\x49\x6f\x6a\x94\x61\x1a\x52\x28\x2b\x5a\x96\xdb\xe4\x4a\x4c\x98\x87\xbd\x4b\x92\x37\xdb\xe6\xc3\xdb\x54\xc1\x3b\xff\x22\x43\x0f\xd8\xf2\x4d\xce\x9e\x8c\x86\xb0\x77\x89\x3b\x44\x2a\x8d\x34\x67\x8f\x7d\x8b\x2a\x79\x20\x2b\xd0\xf0\x56\xe3\x52\xc2\x1b\x77\xc4\x39\xf0\x8b\x8e\x9f\xc9\x99\xdd\x47\xe4\x36\xd5\x6c\x2a\x52\xa0\xb2\x7b\x56\x35\x6f\x93\x5f\x3e\x13\x86\x8a\xea\x3a\x76\x4d\x57\xc2\x58\x1d\x0e\x40\x4f\x28\x2c\x8c\x33\x87\x61\x7e\x5c\xca\x40\x13\xd8\x72\x9c\x02\x83\xdc\x12\x6b\x8e\x4a\x2f\x3e\x04\x9e\xd7\x58\x75\xed\x41\xea\x22\x3d\x01\x04\xe5\x03\x48\xca\xed\x63\x08\xaf\x96\xe3\x99\x8e\xc5\xfc\xc1\xe8\x42\x9e\xf0\x39\x6b\x58\x09\x5d\xac\x3e\x5b\xcd\xc9\xd4\x6c\x53\x06\x6c\x7b\xec\x38\xd8\x99\x47\xe6\xc6\xc6\x39\x70\x05\xf7\xf9\xe8\x99\x84\xd1\x4d\x90\xcb\x34\x25\x60\x65\xd1\x94\x62\xdc\x50\x1e\x98\x05\x4c\x74\x77\x32\x02\x17\xe2\xce\x56\x31\x2a\x26\xe3\x1c\x1c\x19\xfe\x46\xbc\x00\x5a\x5c\x4e\x32\xf3\x28\xf9\x4b\xa4\xd7\x8e\x91\x13\x47\xbb\x9d\x09\x25\x53\xf7\x3a\x12\x8f\xa6\x01\x18\x3d\xf9\x30\xbc\x14\x41\xc8\xe7\x5e\x50\x14\x91\xf1\xc0\xde\xdd\x25\x4f\x0c\x25\x9b\x54\xba\x53\x76\x41\x4c\x17\x2b\x16\x74\x35\x22\x8f\x55\x6c\x8c\x53\x4a\x2a\xfd\x30\x08\x03\xa8\xac\x47\x9f\xcb\xb0\xc0\xd4\xad\x9d\xbe\x79\x00\x93\x61\x07\xce\xbb\xf4\x62\xcb\x16\x53\x1d\x84\x4e\x86\x96\xbb\xde\x10\xc1\x66\x64\x8c\xaf\xf5\x9a\xc9\x16\x5d\x7f\x2c\x3c\xc6\xe6\x28\xb3\xfd\x9f\xb0\xbf\xdf\x33\x0a\x8f\x3d\x6f\x04\xb9\xaa\xed\x2c\x1d\xae\x7e\x51\x9c\x97\x0e\x9f\xf5\x5d\xf2\x3c\xaa\x9f\x02\x87\xae\x1c\xf7\x77\xb2\xca\x85\x2d\x3f\xf0\x9a\x63\xe6\xbd\x3e\xd7\x90\x73\x0c\xd5\x0f\x1a\x0f\x43\x48\xb0\xf6\x98\x37\x40\x15\x20\x92\x8a\x6f\xa0\xc7\x21\xeb\x41\xd9\xfd\xaa\x57\xb9\xa0\xd7\xdd\x7c\xb1\xf1\xfb\xac\x3b\x2e\xc5\xbb\x70\x46\x5b\xbf\xe0\x48\x1b\x45\x31\x2e\xc7\x23\x33\x9c\x91\x96\x31\x40\x97\xaa\x35\xe8\xa7\xc0\x88\x9c\x50\x55\xd3\x60\x34\xc4\xb9\x17\xbd\xca\x50\x3b\xe5\xd0\x88\x05\x66\x65\x93\xee\x78\x62\x68\x91\x2c\xec\xfb\x00\x10\x49\xd1\x87\xd9\x32\xee\x90\x07\x75\xf2\xd1\x35\xd3\xb5\x69\x28\xb7\x32\x2c\xb4\x41\x73\xdb\x95\x9d\x37\x5a\x37\x35\x82\xf7\x6b\xac\x2c\x4d\x3e\xfa\x10\xba\x36\x8e\xb5\xfa\xd2\x22\xc3\x0d\x47\xc5\x66\xde\x07\xea\xb4\x31\xe9\xde\xc8\xc6\x90\xb3\x76\xbb\x83\xbe\xe7\x6a\xe0\xff\x00\xd2\x72\x75\x79\x87\x3d\x85\x66\x8c\xa7\x58\x69\xf3\x82\x5f\x3d\x3b\xc0\x7e\x2c\x43\x26\x3f\xc5\x21\x35\x4b\xd9\x35\x37\x3d\x4e\x31\x5e\xa4\x6e\xd9\xa8\xe1\xa0\xaa\x9c\xd3\x8a\xca\x25\xe0\x1f\x49\x59\xca\xfc\xa3\x16\x46\xc7\xdb\x90\x13\x8c\xd4\x42\x8c\x2b\x41\x34\xad\x3f\x2a\x9b\x28\x74\x5a\x55\x19\x35\xe2\x74\xa8\xfd\x4d\x6c\x72\x77\xb7\x8b\x0e\xfb\x0b\x57\x06\x9c\x4a\x5a\xa2\x20\x81\x79\x6b\xc0\x69\x7a\xd5\x3d\xa0\x8a\xcd\x0c\x1c\x50\xe5\x85\x24\x9b\x97\x60\xd8\x7b\x24\x52\xae\x3a\x2c\xd1\x44\x3b\xae\x47\x0a\x9f\x5b\xd2\x7f\xd1\xc1\x86\xe9\xa4\xfc\xc1\xa3\xc9\x8e\x79\x30\x4a\x4e\xfa\x90\x60\x6d\x8a\x1e\xa7\x88\x3b\x57\x1c\x8d\xb7\x58\x86\x67\xd7\xd8\x9d\x34\xba\x94\xcb\x6a\x27\x1d\x40\xe5\x0f\xf3\x94\x29\x5c\xb4\x5e\x0f\x1c\x51\xf0\xf1\x40\xe0\x49\x69\x3d\x71\x6a\x9c\x29\x9d\x5a\x40\x3a\x39\xed\x0c\xff\x22\x9a\x81\x9e\x0e\xaa\x66\xfe\x44\x9a\x50\xfd\x8d\x5a\x83\x35\x37\x63\x3e\xb8\xaa\x6a\xa6\xcf\xe4\x00\xda\xf3\xd6\x8a\x2c\x10\x7d\xc6\x14\x03\xa3\x6c\x0b\x54\xf4\x94\x4a\x16\xab\x29\x2f\x5c\x2e\xa1\xf0\x24\x24\x3d\xb0\xaf\x6b\x9e\x61\xc1\x25\x8a\x06\x70\xeb\x64\xdf\x17\x75\x74\xd5\x88\x46\x7b\x56\xda\xef\xb1\xa9\x38\x57\x9b\x87\x0b\x0b\x47\xf3\xa9\xa1\xee\x88\x63\xe4\x6c\x40\x8b\xb8\x06\x71\xdd\x75\xe5\x57\x28\x17\x02\x18\xa5\x6f\x9d\x0e\x39\x34\x47\x0d\xd9\x2f\xb6\x72\x51\xb3\xd5\x67\xad\x50\x09\xeb\xe7\xd5\xf0\x18\x1e\x6f\x98\x96\xe5\xad\x62\xd4\x73\x9e\x04\x0d\x09\x64\x5c\xa5\x0d\x6c\x72\xa2\xb9\x78\x2d\x2a\x9d\xca\xb1\xb0\x9c\x46\x64\x20\x0b\x0a\x7b\xa1\x14\x78\xa4\xf5\x56\xf1\x62\x55\x5c\x58\x08\xf9\x12\x7d\xde\xca\x23\x6f\x69\x03\x0e\x42\x68\xdf\x49\x3f\x27\x55\x11\xc2\x1e\x9a\x39\xbe\xc5\x27\xba\x47\xea\x17\x79\x6d\x58\xdc\x0a\xeb\x1d\xd5\xc0\x6e\x65\x20\xb2\x01\x5e\x21\x0b\x85\x77\x64\x57\xdf\xa9\x4f\x80\x2f\x27\x77\x80\x5a\xea\x03\x4a\x27\xf6\x82\xd9\x11\x5c\x0d\x67\xb9\x5e\x70\x0d\x2c\xe8\xf1\x16\xaf\x21\x2f\x3b\xea\xad\x3e\x51\xf1\x18\x0c\xb5\x61\x82\x21\xff\x11\x9b\x6b\xd8\xce\x37\xcc\xc1\x21\xfc\x90\x63\xd4\x14\xac\xed\x7b\x2e\x2c\xf5\x45\xe4\x3e\x54\x7e\x0e\xbe\x5f\xb5\x1e\x42\x0c\x91\xb5\x88\x33\xe8\xea\xa9\xac\x05\xc4\xc1\x75\x18\x32\x03\x75\x28\x0f\xc1\xe3\xca\x90\xd2\x43\x00\x12\x9f\x24\x3c\x6e\xd4\xb3\x83\x30\x4b\xe5\x75\xf4\x78\xf9\xce\xb0\x18\xc1\xd6\xf1\x69\x9d\x3b\x26\xbb\x06\x42\x19\x08\x6c\x28\xef\x30\x6a\x0b\x8d\x01\x7b\xcc\x13\xb8\x06\xea\xb9\xff\x79\x7e\xa6\xc1\x01\x0b\xd2\x1c\xe7\xfd\x3e\x64\x40\xb5\x65\x00\xa6\xb6\xc4\xa3\x64\xf3\x3f\x12\xfb\x31\x67\xc5\xfa\x86\x5c\x2e\x29\xea\x55\xcc\xdf\xcb\x07\x8b\xe3\x85\x0b\x38\xb1\x9c\x71\x24\x43\xbe\xd8\x3b\xa3\xd9\x59\xec\xf9\x05\xf9\xa7\xe7\x2a\x97\xd1\x0b\xe7\x25\xac\xaa\x14\xb7\xbd\x2d\x41\x79\x03\x0c\x86\x88\xc3\xb9\x5f\x83\xd7\xcf\xfc\x58\xb3\x9b\x7a\x37\xf7\x76\x42\xb5\xa1\xb4\x4f\x87\x79\x45\x6b\x62\xc7\xdd\x57\x4f\x98\x37\x52\xdd\x60\xb3\x2b\x70\x5b\xdf\xb2\x17\xea\xf3\xd8\x7f\xbe\xe7\x26\xf0\x03\xf3\x2f\x65\xe3\xf4\x79\x88\xef\x05\x86\xad\xf6\xd3\x7a\xc6\x90\xea\x08\xfb\x69\xf2\x8f\x3f\x44\x62\x3d\xf0\xf7\xb8\x43\x52\x8b\xac\xca\x48\xe9\xcf\xe1\x61\xa6\x8a\x87\x89\xbf\x1b\x1a\x2a\xea\x7b\x49\x9f\xf4\x62\xe9\x97\x5a\x5f\x51\xfa\xcc\x46\xc8\xf5\x7f\xa6\xff\xf2\xaf\x46\x0a\x1c\x71\x45\x44\x55\x58\x81\x3f\x52\x09\x1d\x66\x08\xd9\xf0\x84\xa6\x71\x26\xb6\x17\xda\x64\x03\x69\xa7\x21\xb1\xc4\x6d\x25\x4d\xef\x5c\x59\x0a\xa5\xa1\xda\x3a\xfd\xa2\x52\xa6\xf0\x2f\xd9\x00\x24\xa9\x9e\x5f\xc8\x84\x10\x34\x35\x68\x88\x0e\x52\x3b\xa4\x81\xef\x53\x65\x05\x17\x01\x40\x9a\xb7\x59\xb0\x27\x2a\x37\x41\xef\x41\x0f\xe2\x19\xfd\x2e\x38\x40\x99\x75\x27\xa3\x7c\xbc\x0b\xb8\x73\x5c\x74\x8b\xbe\x70\x08\x58\xf6\x0b\x4e\x9a\xaa\x1c\xbe\xc2\xff\x3d\xa8\xf4\xaf\xa6\x65\xa1\xdf\xb7\x0b\x08\x7b\xfb\x0f\x6a\xcd\xbf\x01\x15\x20\xa6\xf2\xb6\xfd\x0d\x2d\x7d\xbd\xc1\xfa\x4f\xcd\x7f\x93\x9f\xfd\x5a\xff\x2a\xfc\x11\x7d\x13\x5b\x98\x59\xc1\x61\x1a\x6b\x66\xd9\x28\x94\xbd\x17\x5c\x33\x10\x1e\xe3\xbb\x36\xb3\xb9\x1a\xc3\x72\x3c\x7e\xf9\xd2\xa9\xad\x7b\x71\x24\x5c\x2e\x26\x6e\x35\x87\xf7\x47\x3e\x59\x7a\x90\xc7\x09\xe9\x2d\x96\x5f\x71\xfa\x88\xc7\xb1\xc8\x26\x4e\xd9\xba\x47\x87\x79\xd5\x7a\x62\xcf\x51\x96\x7c\x21\xe3\x49\xa6\x53\xc4\x45\x6d\x81\x20\x90\x55\x36\x30\x4e\xf3\x4f\x64\x33\xb5\x85\x3a\x96\xec\xdb\xb3\xb0\x01\xd7\x55\x39\x45\x0d\x62\xce\xf7\x67\xbf\xae\x6f\x93\x8e\xc7\xa3\x7c\x63\x32\xce\x54\x46\xb6\xaf\x71\x92\x39\x84\x26\x2c\xef\x24\xf2\x7b\x6d\x07\xdf\x03\x69\x05\x46\xf6\xd9\xc2\xa6\x8f\xf1\xce\x8c\xc3\x99\xcf\xe1\xac\xe3\x12\x06\x60\xfa\x70\x81\xde\xdb\x98\xea\x4d\x45\xb6\x5f\x4e\x46\x12\xaf\x44\x11\x57\xf3\xd5\xfa\x99\x27\x60\xde\xcd\xbf\x5f\x45\xae\x16\x59\x0c\x95\x98\x2e\x6c\x5d\x82\x46\x11\x20\xd7\xf4\x00\x66\x98\x6f\xf3\xd0\xc5\xc5\x07\xd3\x55\x20\xd2\x7f\x2b\x54\x03\xd5\x2f\x7f\x5a\x7f\xd5\xe8\x4d\x17\xed\xd2\x54\xdb\x91\x3a\xef\x00\xcf\xd9\x29\xd3\xf5\x8f\xca\xe4\x83\x5e\x72\xed\x03\xc1\x21\x3b\xe3\x61\x87\x2c\xfe\x94\x55\xea\xda\x47\x9f\x7c\x7c\x3e\x3e\x86\x6e\x88\x26\xb0\xf9\xf2\x4b\x0f\x57\xc0\x47\xc4\x17\x34\xd6\x99\x87\x34\x24\x0d\x36\x21\x1f\x4e\xeb\xa5\x63\xd8\xd8\xf7\x8e\x7d\x73\xe3\xbd\x2e\x22\x76\x11\x03\x63\x33\xd5\x01\x48\x3a\xaf\x3e\x3d\x55\x1b\x8b\x66\x50\x8d\x6f\xf7\x33\x65\x25\x58\xde\x76\x1d\xa6\x36\xe8\x87\x62\x9c\x39\x9f\x06\x2d\xfd\x15\x0a\x28\x02\x7f\xd3\xe4\xcd\xb5\x37\xdb\x1e\xd9\xe9\x8c\xfb\x65\x58\x42\xeb\x93\x5f\x5d\x4b\x7c\x34\x85\xa2\x26\x9f\xe6\x8d\x7c\x08\x9d\x3a\x90\x30\x6c\x73\x57\x7c\x04\x29\xd9\xd1\x5d\xee\xad\x49\xc7\x72\x5f\x70\x36\x78\xd2\x66\xa3\x9b\x50\x9c\x95\xde\xc6\x63\x31\x61\x24\x1f\x7f\xf0\x91\x33\x15\xcd\x15\xac\xf3\x2a\xcd\x1f\x85\x55\x2a\x84\xeb\x5d\x54\x82\x74\x40\x61\x53\xf3\xae\x85\x0c\xe7\x43\x4a\xc1\x8e\x8b\x74\x44\x88\x54\x00\x4f\x97\xce\x01\xdb\x25\x4f\xa8\xc6\xf2\x1d\x2e\x38\x3f\xd8\x2a\x4c\x43\x4c\xe8\xb3\x03\x34\x74\xaf\xc8\x83\x53\x4b\x1a\xe3\xfa\x8f\x95\x06\x5d\x59\x35\xa2\x79\x90\x73\x42\x1b\x57\x3b\x8e\x95\x23\x1d\xf5\xcc\xab\x85\x64\x9e\x7f\x09\xb5\x25\x5f\x56\xbe\x0e\x6f\xa0\x0e\xb1\x5e\xd1\x68\xb8\x0b\x01\x87\x1e\xae\x52\x00\x61\x15\x18\x69\x8c\x94\xbb\xb8\x13\x3c\x3f\x76\x94\xe1\x72\xc9\x7c\x76\x61\xb0\xf5\xc5\xbb\xbd\x0a\x89\x26\x25\xb5\xaa\xf1\x3a\xb3\x0e\xfd\xe8\xc3\x58\x75\x89\xac\x95\x48\xcf\x96\xca\xe7\xcc\x06\x15\x84\x23\x50\xba\x7b\xd6\xe3\xeb\x3a\x64\xf5\xfb\x68\xeb\x1b\xf2\x13\x72\xad\x74\x0a\xe7\x0a\x82\xe4\x9e\x2b\x26\x76\x71\xd6\x7d\x58\xe3\x62\x51\x31\xa9\x73\xf7\x74\x38\x0c\x38\x14\x33\xeb\x51\x00\x6b\xaa\xed\x4d\x92\xd6\x54\x5a\xa1\x73\xbb\xc4\x73\xe5\x36\x74\xaa\x72\xf4\xfc\xa1\xd8\xdc\xec\xe7\x03\xc3\xed\x60\x92\xa0\xbf\x2e\xb0\xde\x2f\xbb\x62\x83\xe8\x7f\x8c\x97\xf9\x52\x8d\x94\x97\x48\x07\xc0\x23\x00\x8d\xe3\xa8\x51\x08\x2a\x4d\xf9\xc9\x7c\xd0\x59\xf4\x8e\x7f\x48\xa3\x09\x82\xf2\x48\xf9\x1e\xa2\xe0\x59\xd5\x49\xeb\x1e\x95\x55\x3a\x8f\x25\xe7\x48\x2d\xed\x41\xa2\x1e\x15\x05\x78\x3e\x8f\xd1\x15\x12\x1d\x66\x0e\xc8\x87\xc6\xa5\xaa\x8d\x25\x56\x60\x38\x00\xef\xe2\x2e\xa6\xb8\xaa\x19\x48\x25\x3a\xbb\x1b\xcd\x7f\x25\x43\x99\x63\x6a\x1a\x47\x1f\x97\x9a\xbf\x3b\xca\x87\xe3\x8a\x38\x89\x64\x15\x58\xc9\x33\xbd\xd8\x11\xe4\x12\x2e\x19\x6f\xd1\xc9\x36\xa9\xb2\x29\x6f\xf1\x82\x92\xd1\xa1\x41\xb0\xe1\xe9\x19\x5a\x6d\xd7\x54\x6e\xcb\xc3\xa0\xcc\x92\x75\x8f\x43\x77\x68\x90\xab\x55\x2b\xd0\x2a\x8c\x3b\x1b\x13\xc3\xc7\x1a\x3c\x47\x8f\x30\x70\x4d\x0d\xca\xe4\x72\x0c\xa6\x3c\x41\x3d\x58\x2d\xc0\xc3\x47\x5f\x66\x55\x1f\xfa\x18\xcd\xe0\x7f\x77\x99\xb3\xc1\xe5\x99\x39\x30\xd5\x47\xdd\xa8\x2e\x23\x3e\x67\x17\x2d\xdd\x14\xb2\x09\x62\xcd\x85\x08\x44\x4a\x9d\x8b\xa0\xfd\x16\x2c\xa7\xd2\xfa\x05\x2b\xfa\x2c\x3b\x1f\x78\x99\x27\x57\xde\x34\xfd\xaf\x52\xff\x37\xdf\xd2\x63\x1a\x51\x21\xdf\x99\xec\x50\x0a\xca\xfc\x8b\xac\xd3\xdd\xce\xba\x37\x40\x8b\x8f\x52\x82\xd5\xe1\x4f\xc3\xcc\x6f\x81\x1e\x63\xaa\xf2\x3b\x36\x8d\x5f\xae\x36\xb4\xb7\x7c\x0b\x6d\xbd\x8d\x15\xb0\x30\xbb\xfc\xcf\x2a\x2e\xff\x6a\x14\xad\xeb\x71\xbf\xfa\xfa\x0c\xf7\xbb\xd6\x15\xb9\x5f\x23\x8f\xca\x61\x27\xf3\xbd\x2c\xfb\x15\x04\x75\xed\xda\xaf\x22\x2d\x44\x4a\xb9\xb2\xb4\x89\x5e\x01\xc6\x86\x66\x39\x50\xc4\xfd\x2d\xd5\x45\xdd\x7d\xf0\xab\x1d\x04\xfb\x5e\x2a\xff\xd0\xcf\xc7\xd9\x8f\x2f\x81\x52\xfa\xd2\x38\xef\x6d\x5c\x7a\xcb\x23\x68\x39\x66\x82\xab\x0d\x3f\x09\x79\x7e\x8b\x55\xd8\x7a\x98\x81\x38\x1c\xd4\x30\x15\x85\x45\xa5\x72\xe3\x19\xa3\x11\x83\xa0\x67\x57\xf1\xe3\x3d\x92\x0a\x2a\x44\xc4\xca\x11\x0f\x10\xab\x11\x0c\xcc\x45\x8d\x37\xab\xb3\x3a\xba\x07\x08\x99\x21\x69\x14\xf6\x67\x37\xd2\xf8\xb8\xb0\xc1\xda\x92\x91\x12\xd6\x65\xc6\x39\x57\xd7\xe0\xf6\xfd\x87\x49\x3e\x32\x5c\x76\xbe\x35\x00\xae\xcb\xa5\x44\x53\x63\x2a\xdb\x4c\xc5\x32\x68\x47\xc2\x73\x13\xdb\xeb\x93\x58\x45\x21\xf1\xd9\x3b\xf5\x4e\xab\x42\x70\xc3\x07\x1b\x21\xba\x9e\xac\x97\x88\x8c\xea\x3f\x3e\xcc\x63\xe0\x3f\xbf\x79\xe4\x29\xb3\xb4\xd7\x4d\x87\xe3\xee\x76\x1a\xca\x79\x1f\xd2\xcf\x96\x25\xa1\x1c\xe1\x90\x68\xb0\xd3\x27\xa7\xf4\x3f\x53\x8c\x3c\xad\x81\x94\x5a\xa7\xa4\x0c\xf5\x3c\xe2\x99\xb7\x5c\x50\xea\x57\x05\x76\x65\x36\x76\x4a\xc0\x95\x06\x66\x3e\x88\xd9\x88\x60\x60\xbe\x21\xa5\x2a\x54\x34\x4d\x2a\x61\x34\x3d\x0f\x49\xd8\xcd\x5d\xfe\x30\xc9\x26\x66\x49\xd9\x60\x0b\x9e\xa7\x5e\x13\x5b\x1a\x1d\xf2\xa1\x8c\xde\xe8\xdd\x60\x58\x26\xcf\x63\xf3\x80\x2a\x8c\xdc\xf1\x3c\x08\xd9\xa7\xf6\xc8\xe7\x66\x5e\x47\xd8\xd7\x20\xa8\xf8\xd9\xa8\xc0\x58\x01\x3b\xee\x74\x3e\xe9\xe6\x86\x02\xa6\x06\x2b\x15\x31\xe0\xfc\xc5\x3f\xfe\xea\x37\x41\x97\x08\x9a\xe5\x2f\x51\xc4\xcc\xdf\x1a\xd1\x30\xba\x3c\x20\x89\x25\xf5\x9d\x76\x76\x58\x72\xb9\xa4\xc4\xab\xbf\xc4\x1d\x6d\x9f\xce\x26\x4c\xd3\x73\x55\x90\xd8\xf7\x1b\xb0\x74\x90\x64\xe9\xcc\x0e\x8e\x07\xf2\x6e\x72\xf9\x66\x75\xb8\x12\xd3\x30\x46\x06\x73\x63\xd0\x65\xdf\xe1\x09\xda\xf6\xde\x28\x56\xa6\xe9\xda\x28\xd4\xc6\x6b\x6e\x2f\xec\x7b\x45\x53\xe1\xba\xa4\x19\x79\xa4\x35\x02\xc3\x21\xfd\xe0\xf7\x48\x7b\xe6\xd1\xd3\xd1\x9b\xaf\xa4\x5a\x9c\x22\x0f\xaa\x58\x2f\x6a\x8a\x7e\xb3\x37\xd3\xbe\x6d\xcb\xa9\xe5\x91\xbe\x40\x0e\xf7\x70\x29\x03\xdb\xd2\x72\x07\xaf\xc0\x6c\x64\x6f\x95\xa2\x84\xcf\xa5\x5f\x7b\x01\x75\xe0\x7e\xc3\x51\x71\x33\xef\x49\xec\xfd\x33\x6b\xd3\xbb\xab\x7b\xd9\xed\x4a\xeb\x55\x58\x8f\x93\x85\xad\x24\x63\x07\x75\x40\xd5\x35\x18\x23\x0f\xd4\xd5\x61\x82\x5c\x6a\x13\xa0\x5d\xc0\x7e\xf4\x41\xdf\xe3\xdc\x77\x82\x07\xdd\x9a\xdf\x7b\xab\x6b\x8f\x9e\x1d\xc6\x1e\xf8\x07\x5f\x89\xe8\x98\x6a\x77\xaa\xe0\xd4\xfa\xf9\x66\xc6\xc3\xd4\x23\x5d\x3c\x3f\x70\x15\x70\xa7\xbe\x3d\x1e\x0f\xcb\xa0\x4e\xca\x2f\x3e\xf9\xe4\xe3\x6b\xc1\xb1\xac\x32\x7e\xdd\x71\xd9\xbb\xca\xd1\xad\xb2\x01\x32\x18\x99\xce\x35\x43\x28\xbd\x98\x2f\x02\x87\x17\x5b\x0a\x50\x15\xca\x99\x6b\x09\x4e\xf0\xdb\xd6\x88\x32\x6b\xc5\x70\xdc\xcf\xf9\x5b\x70\x9b\x9b\x59\x0f\xa2\xed\xb2\x5e\xc7\x75\xd5\xdd\xfe\x49\xbe\x27\x1f\xe0\xf7\xd2\x6e\x0f\x9c\x36\x78\x6b\x18\x52\x70\xae\xb4\x05\x1d\x64\xa5\x98\x9d\x7b\x3b\xdf\xda\xee\x9b\xff\x1b\x47\x19\x86\x67\xa4\xa1\x96\x63\xa2\x67\x4a\xde\x3c\x33\x57\xea\x50\x65\xa7\xe6\xc2\xde\x2e\xf3\xf4\x4c\xcf\x0c\x3e\x3d\x38\x2b\xa8\x14\xca\xaa\x67\x10\x6a\x14\xac\x67\x90\x1d\x86\xb3\xe0\x70\x10\xe9\xcc\xd2\xec\x2b\x41\x2a\x6b\xd8\xec\x5b\xb5\xf3\x41\xad\x88\x91\xe1\x44\xd0\xc6\x7e\xf1\x99\x51\xda\xbd\xcd\xdc\x09\x09\x38\x57\x44\x79\x6d\x98\xc7\xf8\xbc\x9c\xfd\xba\x71\xb6\x45\x35\xed\x78\x18\x1a\x02\x61\x3e\x96\xb5\x7c\xc5\xd6\x88\x2f\xbd\x29\xcd\xd3\x4e\x47\x98\x0f\x0f\xdc\x21\x20\xe5\xad\x88\xe9\x84\x84\x9a\x42\xb5\xbc\xa5\xe7\x5b\x23\x89\x44\x38\x87\x1d\xb1\x91\x09\x73\xbf\x24\x88\x3f\xdc\x68\x54\x9c\xc3\xdc\xc8\x58\xb3\x58\x89\x1b\x57\xbc\x7f\x11\xc4\x03\x7b\x6f\xa0\x5f\x0c\x56\x5a\xf3\x5c\x13\x31\x9d\x06\x09\x0e\xff\x58\x0f\x89\x65\x83\x2e\x34\x22\x25\xf8\x09\xe3\x6f\xe7\xc1\x2d\x5d\x68\xc8\xc6\x5b\xd3\xba\x23\x46\x02\xff\xb5\x9e\x12\x45\x35\x48\xd0\xb5\xa2\x33\xd3\x2d\x4f\xad\xd6\x4c\xf2\x09\xb4\xbb\x23\x23\x3e\x7d\x68\xfe\xc7\x45\x34\x83\x0b\x87\x7c\xd6\x4c\x9b\xfc\x56\x1a\x32\xde\x9b\xf4\x71\x1a\x55\x0b\x61\x71\xe0\x7a\x65\x9f\x8f\x7d\x67\x6b\xab\x1f\x91\x26\x98\x78\xba\x98\x94\x2e\xd7\xc5\x97\x0b\x8a\x27\xa8\x34\xcd\x3e\xcf\xba\x13\x17\x4e\xf3\x27\xfd\xd2\x42\x6d\xa0\x1b\xbe\x70\xf6\x12\x56\x28\x51\x1a\x46\x71\x24\xfb\x8a\x58\x01\xdb\xc3\x4f\x7f\x6a\xf7\x0a\x5a\x2a\x62\x2c\xef\xb2\xb0\xa1\xbd\xa7\xa3\x6b\xf4\x80\x41\x07\x59\xda\xc3\xe7\xe4\x0f\x92\x1b\x81\xfe\x44\x75\xd4\x0a\xf9\x20\x2a\x39\x24\xa8\xbe\x40\x2f\x1b\x03\x03\x5a\xcd\xb6\x3e\x8f\x27\x94\x90\xce\x20\xcd\x61\x12\x87\xaf\x5d\x46\x01\xb7\xc0\xac\x9f\x75\x31\x1d\x69\x90\xd8\x9c\x23\xf2\x6c\x43\x73\x7a\xaa\xe9\xf7\x55\x5b\x01\x26\xff\x5f\xde\xe6\xbc\x97\xcb\x2f\x6d\xcf\x7c\x40\x9a\x4c\xea\xcf\x99\x34\x9e\x11\xc8\x52\xbd\xca\x23\xf2\xd1\x60\xd2\xe7\x66\x44\xc3\x0d\x75\xa3\x54\xac\x3a\xc0\x98\xd0\x0d\xf9\x5d\x02\x25\x0c\xfb\x85\xeb\x94\xa8\xcd\xc6\xb3\xd2\x7a\x25\xfd\x5b\xe7\x9d\x48\x09\x78\x7d\x36\x0a\xb2\xe4\xd7\x62\xb8\xfe\x9b\xc5\x59\xbb\xb2\x1f\x17\x81\xb8\x2a\x1c\xac\x16\x97\x3c\xc5\x14\x2a\x78\xc2\xd7\x25\x97\x30\xf9\x3c\x2a\xbb\x63\x2c\x8d\x8b\x57\x12\xea\x32\x56\x21\x6c\x8d\x32\xce\x83\x0b\xfd\xa9\x83\xa4\xd1\x7a\xb5\x7c\x10\x0b\x13\x9d\x91\xc9\x89\x4a\xe7\x5d\xfe\xf4\x9d\xeb\xa5\x57\x5a\xd2\x4d\xf2\xe9\x8f\xae\xc3\x3c\x9f\xfe\xf8\x3a\x4d\x45\x65\x4d\x78\x2a\xfb\x9a\x20\x9b\xbe\x4d\xdd\x13\x0c\x60\xc6\x7e\xbb\x1c\x75\xdf\x0e\x87\xe2\xf2\x8b\xaa\x19\x7c\xfc\x2f\x32\x0f\x1d\x09\xfa\xb3\xad\x7f\x46\x1a\x2e\xe2\x11\x82\x5c\x0f\xfa\x40\xde\x26\xf7\xb7\xb7\xe9\x68\xfe\x01\x67\x84\xd1\x3e\x6b\x19\x1a\x56\xba\xd1\xa4\xe0\xdc\xeb\x8f\x37\xca\x8a\x61\x36\xb0\x03\x7a\x41\xa4\x3f\x78\xad\xb4\x75\xaf\x2e\xdf\x67\x22\xeb\xfa\x95\x41\x17\x91\xfa\x7a\x7a\x0e\x18\xa3\xfe\x38\xfc\x19\x22\xa7\xf2\x83\xe7\xe1\x63\x0a\x26\x6a\x3c\xad\x1f\xbe\x37\x03\xa1\x10\x70\x29\x77\x13\x26\x53\x61\x5f\x92\x93\xca\xed\x78\xf0\xd8\x70\x3f\x3b\xd9\x68\xab\x72\x78\xa4\x7e\xa4\xaa\x17\x8f\xf8\x39\xfc\x5d\xb6\x33\x1e\xa5\x83\x72\x93\x13\x92\xaf\x5b\x3f\x63\x50\x5c\xc4\x12\x51\xc9\x93\xae\x7b\xcf\x0e\x69\x60\xb1\xc2\x71\xba\x55\xf3\x8c\xc5\x8f\x5e\x72\xdf\x73\x5d\x74\xbb\x5e\x7c\xd2\xf8\x64\x79\xa9\xb1\x87\x1f\x60\x0e\x28\x97\xd4\x21\x0c\x52\xb2\x89\x87\x62\x21\x5c\x21\x03\xe0\xd0\xa1\xe6\x8f\x2a\xc0\x62\x10\xe5\xb8\x28\xfa\xd7\x5b\xe9\x96\x1c\x40\x6b\x73\x54\xec\x50\xf6\x50\xb2\x9c\xd3\x3d\xb6\xe0\x17\xfb\xc7\x3b\xe5\xfa\xe5\x32\x79\x87\xa8\x16\x97\xb5\x6e\xbd\xb3\x43\x3f\x92\x6a\x16\x19\x9b\x77\xb6\xb9\xdd\x5d\xe0\x9f\x5a\xef\xf4\xb8\x05\x56\x38\x6a\xbd\x73\x8b\xff\x3c\x61\xee\xe9\x1b\x18\xda\x30\x1a\x76\x1c\x52\x7c\x7e\xd5\x7a\x67\x97\x7f\xe2\xba\xf3\x0b\x2a\xd0\x6a\xb8\xc1\x9e\x59\x09\x1c\x53\x02\x87\xd2\xf3\x16\x04\x2c\x4f\x3e\x00\x27\x36\xaf\x89\x5b\x9e\x19\x63\xbb\x98\x8c\x82\x11\x70\xa9\x18\xc3\xb5\x1b\x74\x3c\x20\xf2\xd2\xba\x95\x65\x37\x82\x4f\x7a\x07\x66\x03\xe3\xed\xca\x9c\xbc\x15\xb3\xa8\xdd\x2c\x0d\xe6\xf4\xb6\x35\x4a\x6f\x75\x64\x6b\xc1\x76\xe0\x93\x6c\xc9\xdb\x46\xeb\xd3\xde\xa8\x18\x7e\x61\x84\x89\xeb\xad\x5e\xb6\x99\x4e\xfa\x10\xc0\x5e\x96\x36\x5b\xd6\x0c\x54\xf7\xc8\x59\xdc\xa9\x28\x6b\xa4\x3c\xff\x81\xf2\x75\x38\x64\x31\xd8\xf2\x35\xca\xa1\x53\x17\x5d\x98\xb5\x5b\x5c\xd3\xa1\x93\x0f\x86\x13\x31\xea\x3e\x5e\xcc\x6c\x6d\x9b\x85\x2d\xf8\x47\x5d\x67\xcb\x6a\xd5\x6d\x59\x82\x4d\x73\x7f\x06\x54\x1c\x0d\xcb\x50\x91\x69\x03\x54\x20\xf7\x43\xd3\x5a\xa8\x42\xb9\xf2\x2f\xff\x82\x72\x6b\xfe\x45\xf6\xaf\xff\x9a\x7c\xf4\xd3\xb7\x6c\xb9\x3c\x8b\x97\xa8\xda\x3a\x4a\xb3\x7e\x64\x4f\xc4\x74\x67\x86\x33\xf2\xf0\x3f\x79\x23\x42\x29\x0a\x4c\x1f\x47\x91\x1b\x9e\x8b\x4f\x58\xdd\xaa\xf5\xff\x07\x00\x00\xff\xff\xa7\x98\x39\x00\x84\x34\x01\x00") - -func confLocaleLocale_srSpIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_srSpIni, - "conf/locale/locale_sr-SP.ini", - ) -} - -func confLocaleLocale_srSpIni() (*asset, error) { - bytes, err := confLocaleLocale_srSpIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_sr-SP.ini", size: 78980, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_svSeIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\xbd\xdb\xb2\x1b\xc7\xb1\x26\x7c\x8f\xa7\x68\xd1\xc1\x20\x15\xb1\x16\x18\xb2\xf7\x7f\x08\x85\x20\xfd\x3c\x93\xe6\xf1\xe7\x5a\x92\x67\x42\xc1\x01\x1b\xe8\x02\xd0\x44\xa3\x1b\xee\x03\x48\xd8\xe1\x3b\xef\xbb\xb9\xde\x31\x0f\x20\xbe\x82\x5e\x60\xbd\xc9\x3c\xc9\xe4\x97\x99\x75\xea\x6e\x2c\x92\xde\x33\x61\x8b\x0b\x5d\x95\x75\xce\xca\xca\xcc\xca\xcc\x4a\xf7\xfb\x79\x66\x9a\xe5\xec\x61\x99\x34\xbb\x3c\xcb\xd7\xc9\xe3\xbc\x3d\x6f\xdf\x5f\xfd\x56\x36\x6d\x92\x75\xc9\xf6\xea\xf7\x3a\x69\xe8\xbb\x38\x24\xcd\xb6\xce\x0f\xa6\x4c\xf2\xe4\x71\x35\x99\x6c\xaa\x9d\x99\x5d\xb4\x69\xdd\x36\x79\x96\x4e\xb2\xb4\xd9\x2c\xaa\xb4\xce\x66\x4f\xa9\x68\xdd\xed\x4c\xd9\xee\xd3\xd2\x14\x13\xf3\x71\x5f\x54\xb5\x99\xfd\xdc\xae\xaa\xba\xd9\xa6\x93\x8d\x29\xf6\xb3\x27\xa8\x73\x3f\x69\xf2\x75\x39\xcf\xcb\xd9\xf3\x6a\xbd\x4e\x93\xbc\x94\x84\xaa\x6b\x35\xa5\x6b\x25\xa5\xdb\xcf\xde\x98\x75\x4e\x35\x9b\x3a\x4d\xa8\xa3\x93\x9a\x3f\x4d\xdd\x4f\xff\x60\x16\x4d\xde\x9a\xd9\x5f\xcc\x62\xb1\x2f\xd2\xb6\x99\x1c\x4c\xdd\xe4\x55\x39\xfb\x45\xfe\x4e\xf6\xe9\x9a\x7a\x8e\x4e\xb7\x66\x07\x10\x33\x7b\x91\x16\xc5\xa4\x48\xcb\x75\xc7\x79\xfb\xfa\xea\xd3\x76\xb2\xac\x0d\xe5\xcd\x4b\xf3\x61\x76\xb1\x4d\xf7\xe9\x74\x3a\x9d\x74\x8d\xa9\xe7\xfb\xba\x5a\xe5\x85\x99\xa7\x65\x36\xdf\x61\x68\x77\xcb\x03\xcd\x58\x96\xd6\x92\x93\xec\x4c\x46\xff\xd5\x29\xf7\xdd\x64\x34\xc0\x79\xda\xd0\xc4\x14\x18\x53\x96\x34\xd5\x6e\xc2\x35\x95\xe9\x2e\x28\x4c\x5f\xe5\xc4\xec\xd2\xbc\x98\x3d\x3c\xdf\x57\x4d\x4b\x3d\x6d\x9a\x0f\x15\xcd\xe9\xf3\xab\xdf\x1b\x53\xd2\x2f\x1a\xf6\xbc\x3d\xee\x51\x6a\x6d\x92\x7c\x6d\xca\xc9\x32\xdd\xb7\xcb\x4d\x3a\xbb\x2f\x7f\x27\x04\x42\x85\xf3\xb6\xaa\x8f\x34\xe7\x07\xb3\xdc\x16\x79\xb9\xa6\x89\x6f\x53\x6a\x7f\x52\xd5\xeb\xb4\xcc\xff\x96\xb6\x98\x92\x57\xfc\xd1\xf0\xc7\x64\x97\xd7\x75\x55\xd3\xe8\xcd\x9a\x96\x8d\x86\x3d\x47\x4d\xb3\x97\x47\x5a\x85\x41\x35\xc8\xde\xe5\xeb\x1a\xb3\x47\x10\xf8\x69\x6a\x02\xd0\x0c\xae\x89\xd2\x51\x59\x61\x93\x69\xfd\xb7\x94\xd8\xb6\xc9\x3a\x5d\xad\x68\xe2\x13\x34\xc0\x59\xd4\x2b\x80\x57\x51\x7f\xd2\x92\x56\x83\xb3\x9e\xa4\x65\x8b\x05\x0e\xf3\x4d\x3d\x49\xb3\x1d\x4d\x2d\xa3\xd9\xec\x2e\x7e\x9f\x0b\xca\xa5\xcb\x65\xd5\x95\xed\xbc\x31\x6d\x8b\x4e\xcf\x9e\x55\x65\x5b\xe5\x84\x98\x84\x74\x45\x49\x49\x69\x3d\x71\x99\xbd\xf4\x63\xd5\xb9\x25\x9e\x3d\xc8\xcb\x44\x7e\x4b\xba\x2b\x44\x19\xc0\xd7\xa8\x24\xb5\xdb\xe6\x87\xbc\xcd\x4d\x33\xbb\xbb\xe5\x9f\x86\xba\x3d\xd9\x77\x45\x41\x73\xf9\xd7\xce\x34\x6d\x33\x7b\x4d\x5f\xc9\x8a\xf6\xd5\x8a\xb0\x6c\xad\x45\xf3\xa6\xa1\xdc\xd9\xeb\xba\x5a\x14\x86\xb0\x63\x99\x96\x4b\x0c\xea\xb0\xa8\x8f\xed\x64\xf2\x2b\x5a\x22\x1c\x7d\x3b\xd1\x1f\xbc\xcb\xe8\xaf\xcc\x54\x9b\xb7\x05\x36\xa3\x59\x73\xc5\x49\x4a\x53\xac\x80\x98\x35\x4e\xc3\x3f\x94\x92\xac\xaf\x3e\x95\x40\x9b\xac\x5a\x6e\x09\x97\xb1\x19\x69\x13\xbd\xda\xb9\xdd\xfe\xb8\x5a\x37\x54\xba\x6b\xf3\xe4\x01\xc3\x9c\x25\x40\xd0\x02\xc8\x96\x14\x57\xbf\x35\xc9\x0f\x69\x42\xfb\x7e\x6d\xda\xd9\x8d\xf9\x82\x76\xcd\xf6\x46\xb2\xa9\xcd\x6a\x76\xe3\x66\x73\xe3\xc7\x37\xf9\xb6\xa5\x41\xbd\x07\x76\xff\x70\x27\xfd\x31\x29\x2b\xc2\x92\x12\x1d\x2a\xd3\x12\xad\x00\xdb\xeb\xb4\x4e\x4a\x1a\x3e\xad\x0b\x4d\x40\xb2\xbf\xfa\x94\x64\x86\x00\x12\x10\x93\x6f\x26\x98\x2c\x9a\xbc\x79\xb6\x10\xfa\xc4\x7d\xda\xd6\x57\xbf\xd1\x5e\x4e\x5e\x1c\x2f\xfe\xff\xe7\x67\xc9\x6b\xda\x21\x84\x74\xfc\x9b\xfe\x21\xf0\x3f\x25\x06\x03\x4e\x2e\xf3\x07\xf7\xa6\x13\x2a\x2b\xf3\xf2\x80\x50\x76\x91\x36\xbd\xc5\x42\x36\x36\x92\xe6\xd2\x6f\x22\x69\x4d\x3b\xbb\x30\x35\x35\xc2\xdb\xd3\x6f\x4d\x33\xb6\x15\xa9\x06\xde\xc0\x5a\x83\x29\x9b\x84\xb7\x30\xa5\xeb\xac\x5e\x98\xa4\xcd\x69\xb5\x79\x3d\xa4\xdf\x49\xaa\x75\x26\x4f\x5f\xbe\x7c\xf5\xe0\x1e\xd3\x8a\x96\x76\x97\x29\xbb\xfd\xbe\xb9\xfa\xad\xc5\xec\x61\xaa\xbb\x76\xf5\xff\xce\xe9\x07\xad\x60\x31\x5f\xe6\xd3\x49\xd3\x14\x44\x6e\x32\x5a\xe8\x8b\xe7\xe7\xb4\x10\x6b\xf4\xaa\xdd\xcc\x1e\xe5\x05\x55\xb9\x9e\x34\x7f\x2d\x30\x67\xb6\xed\xab\xdf\xb7\x48\xa6\x9a\x78\xfd\x87\x53\x94\x64\xd2\xf1\x69\xf2\xc3\xa2\xfe\xf1\x17\xb7\xc6\xda\x43\x2c\x48\x92\x2e\x9a\xaa\xe8\x08\x6d\x1a\x5f\x5d\x79\xf5\x5b\xed\xcf\x86\x6a\x97\x50\x9a\x1e\x19\xd3\x89\xa9\xeb\x39\x51\xd5\xf6\x88\xb5\xe3\xee\x9d\x6e\xb8\x09\xbb\xf8\xa9\x26\x0c\x69\x4d\x72\x48\x09\x63\xdb\x6a\x27\x55\xe5\xe5\x21\x2d\xf2\x8c\x56\xd2\xce\x76\x58\x01\xa6\x9b\x67\xf8\xea\x13\xed\x33\x29\x8f\xb9\x2c\xa9\xc6\x1b\xd3\x1b\x49\xb5\xdc\x24\x37\xce\x6f\x4c\x27\x65\x35\x17\x5a\x01\x92\x9d\x11\x01\xa1\x5d\x36\x97\x13\xa4\x16\x4a\xf8\x80\xc6\x43\xe8\xc9\x55\xd0\xd6\xc6\xee\xc5\xd6\xa9\xed\xe1\x02\x2c\xa5\x79\x28\x79\x2d\x1b\x1c\x07\x09\x91\x82\x84\x6b\x95\x5a\xb0\xbf\xb6\xa0\x33\xe1\x24\x58\x0a\xa5\xc8\x73\x37\x06\x2f\x2c\x2e\x99\x56\x66\xc0\xbc\x77\xe3\xa7\xb9\x9c\xd8\xd5\x17\x3c\xbe\x5b\x14\x3b\x9a\xe5\x01\xdd\x91\xf5\xc5\x16\x99\xe0\x40\x97\x43\x65\xbf\x2f\xf2\x2d\x0f\x8d\x67\xc9\xe5\x38\xf4\xc0\x61\x4e\x07\x26\x8d\x21\x24\xaa\x32\xa5\x1b\xac\x70\x43\x27\x48\xcb\x53\xd8\x1e\x33\xc2\x8c\xf6\x1b\x3e\x59\x64\x51\xdf\x54\xad\x5d\x3d\x69\x7e\xe4\x88\x70\xd0\xb6\x4d\x1a\x00\x11\x23\xc2\x94\xba\x06\x9f\xc1\xd4\x9f\xb6\x75\xb5\xa3\xb3\x32\x59\x14\x79\xd2\xec\x69\xf0\x99\x6e\x1a\xa1\x07\x3b\xea\xb8\x29\xa7\x93\xba\x23\x26\x00\x7b\xf2\xe1\x47\xb3\xc5\xd2\x94\x04\x17\xec\x4f\x9b\x6f\xdb\x7a\xc0\xa5\x53\x07\x50\x26\xbb\xab\x4f\xc4\x2f\x24\x9b\x54\xaa\x67\x3a\x28\x3f\x9f\x74\x87\x2e\x6b\x7a\xfb\xe5\x0d\x77\x0e\xc3\x07\x9e\xa7\x3c\xbf\x44\x54\x2a\x3a\x9f\x09\x5b\x2a\xac\x84\x7e\xf9\x26\x5b\xda\x28\x44\xca\xa8\x7b\x5b\x5a\x96\x8b\x8b\x27\xc9\xb6\xa8\xb0\x48\x4d\x42\x6c\xc9\x22\xcd\x6a\xd3\x50\x1f\xb1\x95\x37\xf3\x3d\x4d\x2f\x6d\xe5\x27\xe7\xf8\xe1\x52\x6c\x65\xaf\xe9\x77\xd9\xed\x6a\xc2\x0c\x6c\xb1\x8c\xce\x21\xc0\x36\x4c\x9d\x92\x45\xdd\x51\x0b\x67\x20\xc7\xbb\x52\xd0\x25\xa4\xfc\x0e\x7d\x51\x64\xd5\x95\x5b\x2c\x6d\x5a\xf0\x71\x44\x73\xb9\x69\xdb\xbd\x34\xff\xe4\xf2\xf2\x75\x82\xa6\x7c\xda\x48\x07\x0e\x79\xb1\xa5\x3f\xa9\xc7\x29\x9a\x24\x5d\xb6\xe2\xd8\x10\xce\xd4\x18\xf6\x94\x91\xac\xab\x8b\x08\xfb\x74\xd0\xa5\xcd\x3c\x35\x5b\xe8\xca\x1d\xfc\x73\xe1\x26\xcd\x16\xe5\x55\xc0\x11\xc1\xfc\x1c\x36\x7a\x62\x98\x41\x9a\x4e\x08\xcf\xe6\x75\x55\xb5\x82\x95\xe0\x19\xed\x3a\xc6\x59\xb6\xd5\x67\x82\x9b\xb2\xee\x3c\x2e\x3a\xd3\xa8\x14\x0e\xfb\x5a\x38\x5c\x5a\xe5\x49\xb5\x97\x19\xd3\x9d\x77\xf5\x1f\x87\x3a\x5f\x0f\xce\x7b\xe6\xd5\x14\x44\x38\x36\x4b\x07\x71\x16\xf4\xd9\x8d\x1d\x4d\xb0\x9c\x30\x2f\x2e\x5f\xeb\x42\x4a\xea\xaa\xae\x76\xb3\x47\xc4\x0d\x94\xfe\xdb\x76\xf8\x21\xaa\x4d\x33\x9e\x09\xa5\x3d\xf9\x72\x4b\xc4\x07\x6d\x27\x39\x78\x88\xf2\x8c\x28\x30\x36\x68\xf2\xe6\xd1\xfd\xe4\xff\xfa\xd3\x1f\xff\x38\x4d\x1e\x60\x85\x88\x5a\x31\x35\xf1\x8c\x3b\x71\x60\x3b\xe2\xd8\xda\xe4\x16\x97\xff\xff\xcc\xc7\x94\x38\x60\x33\x5d\x56\xbb\x5b\x49\x5a\xb4\x38\xb4\x09\x75\x28\xff\xc6\x4b\x22\x04\x37\x92\x1f\x06\x70\x3f\xde\x9a\x4e\x90\x46\x5b\x4d\xce\xc8\x43\xa3\x5b\xac\xd1\x55\xb1\xd9\x9e\xea\x05\x20\x45\xc0\xc9\x0a\x03\x3f\x5f\x56\xe5\x2a\xaf\x77\xc2\x32\xf5\x89\x6e\xb3\x30\x38\xf7\x57\xad\x29\x1a\xc3\x35\xcf\xcb\xaa\xcd\x57\x47\x0f\x2e\xad\xa6\x87\xbc\x11\x0e\x54\xa6\x76\x8e\x3f\xf9\xd2\xe8\xfa\xc8\xb1\x5e\xca\x8e\x4e\xc1\x80\x24\x97\xba\x56\xf5\x60\xad\x2a\xe2\x4e\xf3\xd2\xc8\x69\xeb\xda\x79\x69\xb2\x6d\xb5\x07\x0e\x26\xcf\xf9\xf4\x0d\xc1\x68\xef\xec\x49\x48\x79\xea\xf7\xde\xfd\x07\x2f\x13\x30\x2c\x98\x77\x62\x21\xb3\x8e\x77\x61\xc3\x07\xf7\x59\x02\xde\x8d\x06\xda\x74\x75\x23\xb8\xa7\xfb\x09\x4b\x9c\x61\xf4\xf9\xa2\x83\x4c\x43\x33\x56\x6d\x69\x65\x88\xf4\xe8\xb1\x45\xdc\xd4\x81\xb0\xb8\x0e\xdb\x7a\xac\x69\xe7\x0e\xff\x06\xe0\xc3\x0e\xda\x42\x3c\x25\xe6\x23\x2f\x3e\x11\x3b\x9a\x86\xaa\xd6\x0e\x0a\x00\x75\x0b\x07\x42\x87\xb1\x67\x19\x08\x74\x7a\x88\x48\x6b\x88\x39\xb4\x12\x48\xcd\xa6\x93\x95\xc9\x0c\xe4\x83\x6c\xae\x3d\x28\xaa\x6a\x4b\x5d\x70\x13\x0a\x8a\x65\x4a\x12\x88\xc0\xf9\x14\x29\xf3\xc2\x5c\xb5\xb6\x7a\xaa\x06\x1d\x8a\x52\xff\xa4\xc8\x17\x76\x24\x87\x3c\xfb\x6c\xad\x7e\x26\x23\x06\xe0\x82\x10\x40\x00\x45\xdc\x0d\x91\x70\xb4\x84\xf6\xe2\xba\x72\xf1\x3c\x61\x9b\x92\x98\xdc\x67\x1a\x74\xa7\x0a\x4f\xc1\x0c\x04\x91\x68\x1a\x00\xda\xb3\xb2\x9d\x9b\x32\x2b\xe4\xc5\xf9\xda\x95\x67\x60\x90\x13\x4d\xd3\xf3\xc0\xb6\x1e\x76\x6b\x2a\xfc\x35\x89\x92\x2a\x7e\xcf\x0f\x39\x09\xb9\x52\x3c\x67\x29\x95\x27\xcd\x9d\x28\xb4\xb5\x98\x33\xaf\xea\xd1\x92\xda\xfc\x3d\xd0\x9a\x5c\x85\x5c\x13\x0c\x9c\xc7\xb7\x30\xa0\xcc\x5a\x4d\x99\x9e\xd9\x04\x64\x0b\xea\x9b\x72\x91\x12\xc7\xb1\xed\x58\x0e\x30\x5a\x15\x68\xc0\x9d\x88\x22\x70\x0d\x53\x15\xfe\x54\x20\x13\x31\x81\x98\xb8\x85\xd9\x5c\xfd\x7e\xb0\xcc\xe0\xf5\x8c\x5a\xf2\xbe\xa3\xd5\x28\xbb\x33\x99\x76\x39\x69\x37\x84\x46\x4f\x1f\x24\xb3\xe4\x3b\xb7\x25\x3b\x3a\x5f\x69\xc9\x9b\x6d\xcb\xb3\x01\x4e\x25\xae\xce\x76\x46\xf9\x34\x96\x44\xa5\x85\x1e\x61\x11\xb0\x11\xb1\xbf\xc7\x27\x7a\x21\x43\x89\xa3\xcf\xba\xa7\xf4\x30\x0d\x48\xa9\x94\x16\xd5\x41\x8f\xc5\x4c\xf8\x00\xb1\x62\xe3\x7c\x4d\x5c\x8c\x95\x1d\x8d\x72\x35\x93\x96\xe4\xd2\xf9\x3a\x6f\xe7\x2b\x10\xee\x6c\xf6\x82\xa4\xd1\xe2\x48\xa7\x0c\x4d\x2a\x8f\x18\x00\x69\x72\x8b\x40\x6e\xf1\xa4\xd0\x0e\xaf\xbe\x4f\x6e\x1e\x54\xe4\xf8\x13\x48\x32\xb6\x68\x5e\x00\x2b\x59\x68\xae\x4d\x61\x48\x26\x22\x72\x70\xf5\x7b\xf6\xde\x30\x6b\xab\x92\x00\xb1\x2d\x20\x23\x81\x54\x49\x5c\x2e\x4b\x1b\x44\x50\xf3\x65\x6e\x40\x79\x16\x39\xc4\x0c\x4a\x3b\xe4\x69\x72\xb3\x39\x93\xf5\x5c\x57\x8b\x2e\x2f\x32\x1c\x6b\x39\x54\x02\xb4\x53\xac\x84\x40\xf2\x81\xe2\x82\x15\xc8\xa2\xc9\xa7\x9a\x40\xc3\xf2\x72\x5b\xd1\x5e\xd8\xb6\xdc\x7d\x5b\xd6\xf3\xb5\x43\x85\x09\x8e\xf2\x3a\xe0\x76\x51\x4b\xb5\xce\x8b\x36\x5f\x73\x1d\x8e\xf1\xc4\x1c\x10\x9a\x2c\x37\xb3\x67\x60\x18\x03\xf2\x28\x0d\x53\xf7\x89\xf4\x76\x06\xf2\xa0\xcb\xa4\x2a\x9a\xe4\xfc\x47\xfa\x77\xd2\xa4\x07\x23\x67\xe1\xda\x2e\xc4\x33\xfe\xea\x84\xde\x34\xe0\x8e\x75\x28\xbb\x60\x85\xa2\x91\x44\x9b\x82\x17\xda\x63\x5f\x69\x69\xc2\xc8\x56\x68\xb9\x93\x2b\x53\xe0\x74\x58\xa7\x5a\xa7\xe0\x4c\xd3\x2d\x97\xc4\x7d\xcc\x48\x42\x2c\x78\x4b\x94\xdf\x24\xbf\xe4\x5c\x60\x4d\x2b\x99\xca\x99\xd5\x61\x3d\x0b\xac\x34\x70\xea\x0c\x7c\xf6\xb6\x2b\x44\x7e\x48\xe9\x8b\x08\x35\xf3\xb1\x6b\xbf\x64\x31\xf3\xf6\x4a\x26\x35\x9a\x6c\xee\xaf\xe3\xcf\xb8\x57\x93\x5f\xa1\x79\x7c\x3b\xe9\x44\x9a\xa9\x8a\x2c\x14\xd4\x59\x7c\x11\x49\xd3\xc4\x3a\x34\x0b\xea\xb7\x56\xf3\x21\xa7\xd5\x9a\x3b\xcd\x25\x26\xbf\xa5\x73\x10\x03\xfd\x48\x28\xf8\x0b\x51\xbd\x2c\xe9\xab\x33\x77\x47\x46\x97\x86\x76\x49\x99\x8e\x88\x3d\x60\xea\x36\xd5\x07\x56\x0c\x2a\x24\x2a\x4a\x56\xe8\x13\xc6\x43\x1c\x5b\x06\x55\xe2\xb2\x22\x3c\x5f\x54\x58\xdc\x83\x85\x7c\x16\xa4\xa5\xc9\x08\x32\xd6\x68\x9f\x04\x36\x6d\xbe\xa7\x0f\xa3\x3c\x51\xbd\x69\x76\x03\xed\x1b\x91\x1d\x26\xd2\xac\xb0\xe5\xae\x10\xb2\xa9\xc2\x69\x4a\xc8\xc2\x7a\x2d\x69\xfe\x29\xe4\x8c\x13\x83\x9a\xfc\xaa\x8a\xdc\xb7\xa2\x60\x1c\xdb\x2a\xa2\x36\x69\x42\xbd\x49\x63\xd2\x9a\xb6\x04\xb4\x11\x54\x05\x91\xd2\xcd\xdb\x40\xb1\x3a\x57\x4d\x9d\x28\x58\x93\x12\xba\x41\xc6\x47\xcf\x1d\x6e\xcc\x1e\xcc\xe4\xae\x81\x16\x90\xf5\x0e\xb5\xc9\xe8\x3c\x31\x16\xf4\xa7\xc4\x2a\x8f\x89\x94\x7f\x33\x69\xaa\x65\x9e\x16\xf3\xaf\x29\x7f\x97\xb8\xb2\x8e\x50\xd8\xb4\x5c\x43\x7c\xd8\x8b\xbe\x97\x84\xf9\xd9\xe5\xf1\xc0\xa2\x2b\x10\x7f\xf4\x5c\x05\xab\xe7\xd8\xab\x6c\x9a\x78\x95\x0a\x1a\xa2\x8c\x94\xe5\xb8\xfe\xd9\x31\x68\x8f\xe9\xb8\x6d\xad\x21\xb9\x07\x2d\x9e\x60\x8a\x99\xe8\x77\x2d\x4b\x05\x41\xeb\x2d\xce\xf8\x9d\xd9\x2d\x50\x9d\x21\xbc\xda\x25\xf9\xe6\xea\xd3\x1a\x8a\xda\x09\x49\x01\x6b\xde\x75\x7a\xa4\x3c\xa6\x93\x84\x04\x48\x7f\x9e\x00\xc0\x5c\x03\x60\xda\x9f\xac\x5a\x9e\xc8\xde\x07\x3a\x93\xf4\xd0\xa5\xd9\x0d\xe6\x35\xd6\xcc\xd3\xdc\x4e\xed\x71\x26\x0c\x14\x73\xf3\x54\x63\x6b\x67\xf8\x21\x95\x65\x1c\x08\x99\x7e\x16\x74\x36\x44\xce\x45\xf2\x69\x1b\x11\xde\x7e\x58\xfc\x78\xb3\xf9\xe1\xce\xe2\xc7\x50\x3d\xb9\xc5\xfe\xe1\x49\x66\x42\xbf\xa6\x3f\x20\x3a\xf4\x9f\x1e\x5b\x26\xb9\x99\x51\x79\xfa\xed\xc9\x21\x84\x2a\x9a\xc2\x15\x8b\xf9\xd1\x34\x53\xb7\x96\x2c\x81\x4e\x45\xb5\x6b\x64\xb3\x58\xa4\x75\x5c\x19\xab\x51\x04\x6f\xa9\xc8\x26\x5f\xd0\x59\x4a\xfb\x21\x2f\x55\xe7\xef\xb8\xa9\x4d\x0e\xc9\x23\xeb\x41\x29\xf3\xe2\x2a\x11\x5a\xec\xc0\x49\xb4\x87\x94\xc7\x1d\x2d\x14\xd5\x47\x91\xeb\x83\xbd\xf2\xe8\x33\x98\x40\x06\x9e\xe7\x22\xdf\xe5\x6d\x0f\x9f\xcf\xb0\x6a\xe0\x7a\xca\xa3\xd4\xb7\x30\x6b\x4a\x6f\x85\x6d\x92\x21\x62\x32\xb0\x0e\x61\xb3\x98\x75\x6a\xf4\x4f\x84\x52\x65\x07\xf5\x1b\x48\x3d\x6b\x99\x69\xaf\x13\xff\x86\x4d\x06\xc0\xe9\x84\x16\x6f\xde\x95\xba\xf4\xc4\xcc\x33\x7e\x3f\x21\x86\x00\xe7\xba\x36\x8e\xd3\xdf\xae\x3a\x51\x5d\x13\x8a\xbd\xb7\xdd\x5a\x7f\x3b\x4d\x44\x53\xcd\xc7\xe9\x86\x75\x5f\x9f\x5a\xe9\xea\x00\x67\xe4\x18\x70\x0c\xa1\x51\xe4\x22\x6e\xaf\x60\x11\x1a\x1a\x85\x6d\xc9\xfa\x25\xe2\x40\xa8\xbb\x3a\x4d\xda\xc1\x67\x02\xb5\xb1\x8b\x11\x4a\xdf\xbc\xe0\xe1\xdc\x98\xf7\x85\xdc\xc6\x18\x2b\xa2\xce\x69\xf3\x80\x14\xb5\x46\x75\x51\x2a\xa6\xca\x90\x1c\x4b\xb0\xc5\xdc\xb5\x82\xd2\xac\x10\x57\x1c\x98\x4e\xb8\x27\xe8\x50\xfb\xf9\xfe\x48\xdd\xac\x4b\x76\x9b\xb4\x61\xa5\xa8\x67\x00\x92\xdb\xe8\xe0\xb7\x13\xa9\xd2\xed\xed\xab\x7f\x77\x50\x32\x2c\x4f\x06\xec\x39\xbd\x84\x18\xec\xb1\x25\x2f\xa3\xb9\xde\x56\x19\xaf\x44\xca\xaa\x7c\x28\xae\xf7\x7b\x9a\xf2\x5a\x98\xe5\x35\x2a\x4e\x75\x2d\x02\xde\x69\xda\xeb\x87\x53\xd0\x8c\x8d\x32\x18\x49\xda\xef\xa4\xab\xa0\xad\xaa\x39\x9d\xbc\x75\xeb\x8f\xf8\xbe\x5a\x95\x48\x02\x44\x40\xdc\x40\x24\xff\xb7\x6a\xdd\xa1\x1c\x2e\x69\x1f\x2e\xe9\xd0\xb0\x1b\xfb\x29\x65\x9c\xb3\xdc\x6d\x25\xb2\x40\x41\x2d\xd7\x17\xbe\x07\x09\x8d\x99\x08\x8c\xe8\x07\x27\xbf\x62\xad\xde\x0a\xb9\xc0\x21\x67\xab\x0c\xd4\xeb\x23\x54\xc3\x81\x0b\x0f\xff\x0b\x61\xd5\x2a\x17\x98\x32\xda\x0b\x5f\xb1\x7a\xee\x38\xb1\xfc\xdb\x9b\xf8\xa8\xb2\x34\x2f\x63\x02\xaa\x9c\x9d\x2f\xa5\x5a\x16\xcf\xf4\x11\xfb\xb6\x40\xbd\x34\xc4\x2a\x4b\x69\x8c\x47\xd3\xcc\xfe\x9c\xd2\xf4\xcd\x5e\x9a\xf7\x13\x4a\x04\xfc\xd5\x3f\x31\x3b\x04\x04\x55\xd3\xdb\xc9\xcf\xc4\x0f\xbc\x1c\x8a\x3b\x50\xae\x72\xf2\x38\xbf\xcd\x30\x0f\x83\x9b\x50\xd9\x35\x93\xd7\x43\xf9\xe8\x8d\xe1\x5b\x1c\x51\x67\xe7\x65\x78\x46\xc9\x86\xbc\xb8\x78\x72\x29\x1a\xa0\x8b\x27\xe7\x25\xf1\xcc\xa6\xe0\xea\x9f\xb4\xed\xbe\xf9\xb9\x2e\x58\x07\x7a\x71\xfe\xf3\x9b\xe7\x54\xfd\xb1\xa8\xd2\x0c\x89\xfa\x93\x93\x2f\x4d\xba\xe3\xce\x3e\xae\x09\xb5\xb9\xf0\x5d\xe2\x63\x64\x58\xdd\xb6\xad\x6a\xd5\x3c\x89\xa6\x9d\x05\xb0\x87\xd7\xc8\x62\x93\x97\xe6\xc3\x3d\x12\x10\x96\x52\x85\x5c\x88\xd6\xa0\x11\x54\xfa\x3e\xcd\x75\xde\x5e\x74\x38\xa1\x8e\xb3\x8b\x14\xa7\xd6\x2a\x95\x4b\x21\xa8\x13\x72\x2a\x86\x1b\x0e\x68\x25\x04\xf6\x05\xcd\x0c\x6e\xad\x9f\xfa\x1c\xa2\x47\x59\x46\xbc\x3c\x9d\x77\x0a\x74\x7f\x53\xe5\xcb\x18\x86\xf6\xf6\xe4\xb2\x36\x86\x3b\xf1\x28\x2f\x9c\xe2\xf4\x3e\xd8\x60\xec\x82\xb2\x24\xda\xf9\xa9\x28\x26\x4e\xea\x37\x7c\xaf\x3b\xbc\xac\x69\x27\x69\xb1\xdf\xa4\xcc\x4b\x2b\xd0\x3b\xd9\x32\x0b\x51\x0a\x68\x4d\x24\xd7\x55\x5b\xa0\xeb\x01\xd7\x8a\x65\xc7\xf2\x35\xce\x0d\x12\xf7\xe8\x10\x24\xe4\x24\x2e\xe6\xf6\xf9\xfc\xdb\xe9\xbb\xb0\xc6\x8c\xc8\xe9\x57\xd6\x7a\x36\xa8\x52\xb4\xc8\x50\x86\xbf\x23\xe6\xe5\x6f\xc6\xd5\xa8\x17\x03\x3c\x16\xa8\x71\x68\x41\x0b\x03\xc5\xf0\xcd\xe6\xdd\x84\xc5\xa9\x11\xe8\xa0\xf1\x1d\x04\x25\xc8\x71\x4a\x50\xa8\x50\xfa\x31\x2e\xe4\x67\x2c\x2c\xc7\x14\xb1\x8c\x4a\xca\xf1\x61\x8b\xb9\x53\x82\x3a\x03\xb2\x49\x04\x24\xa2\x06\x54\x00\x1a\x75\x01\x7f\xc0\x40\x07\x3a\x69\x08\x69\xcf\x9d\xee\xdc\xd5\xc1\xb4\x9c\x68\xfa\xb2\xe8\xb2\xeb\x86\x03\x11\x88\xca\xdd\xba\xd9\xdc\x42\xfd\xe5\x96\x38\xbc\x52\xe1\x5f\x6d\x71\xe8\x43\x4e\xfc\xde\xda\x1d\xcc\xa9\x46\x88\xd4\xcb\xd6\x5a\x20\x40\xe6\xff\x8d\x57\x56\xe8\x25\x4e\x5f\xda\xd5\x53\x4f\xaa\xbd\xa8\xfc\x98\x3b\xec\x69\xe9\x78\x51\x3e\xd8\xb0\x3e\xa0\x2d\x53\x6f\x3b\x31\x5f\x18\x53\xce\x89\xf9\x31\x65\x4c\x60\x40\xf8\x69\x48\x8d\xf0\xfa\x53\xb9\x8a\xea\x97\x78\x29\x80\x60\x03\x46\x24\x9e\x92\x0f\x35\x91\x15\x94\xdb\xa7\x21\x10\x4f\x39\xa8\xe7\x55\xff\xfe\x8c\x2a\x1d\x2b\xdb\x12\x1d\x19\x14\x06\x71\x61\x7a\xa7\x4c\xbe\x2f\x82\xcb\x54\xc6\x06\x86\xa6\x21\x67\x11\x31\x1c\xe9\x60\xdb\x4c\xfd\xd4\xb8\xc9\xf6\xeb\xd3\x9f\x22\x39\x94\x43\x8a\xe9\xd9\x12\xd1\x92\x40\x11\x49\x87\x41\xcd\x36\x2c\x81\xae\x84\x35\x58\xe1\xed\xf6\xe8\x04\xf2\xc5\x55\x47\x9d\x5b\xd3\xb6\xe2\xe1\xe1\x7a\x7b\xa4\x4e\x42\x30\x9c\x38\x29\x4b\x2a\x65\x5b\x57\xa2\x9c\xe2\xa3\xff\xb7\xb5\xeb\xef\x17\xd7\xe7\x8e\xc7\xb0\x8b\x99\xf6\xc8\x23\x9b\xd4\x65\xda\x36\xac\xcc\xe9\x72\xcc\x47\xa2\xdc\xb0\xb3\xe1\xbb\x93\x40\x9b\xd9\xa4\xc4\x35\xd2\x54\x17\x69\xd3\x42\x16\x97\xee\xcf\xee\x42\x51\x06\x52\x54\x6b\x5b\x39\x94\x66\xa1\x1e\x28\x97\xd1\x98\x73\x60\x42\x38\xdb\xf6\x0a\x9b\x0a\xb2\x21\x44\x6b\xb7\x25\x90\x98\x24\x1f\xa1\x30\x71\x2f\x7a\x95\xd1\xae\xb0\xa3\xc7\x55\xe2\xd6\x1c\x3d\xc7\xf6\x40\x2f\x0f\xe5\xf4\x63\x95\x93\xbb\xeb\x3e\x58\x56\xa3\x81\x46\x05\x62\x28\xa7\x1c\x5d\x2d\x62\x7a\x31\x00\x77\x37\x92\x52\xe9\x59\x02\x0e\x81\x61\x89\x0f\x4c\x6b\x37\xe3\xac\x25\x62\x8e\xaf\x0d\x05\xb5\xac\x5b\x2c\x4c\xe1\xc5\x35\x5f\x13\x89\x5a\x74\xb8\x5a\x0d\x18\x1d\xb4\xb4\xba\x7a\xbe\x0e\xd5\x5e\x93\x06\x53\x87\x05\x10\x5b\xa5\x40\x86\x62\xe1\x80\xd6\x62\x95\xca\x5d\x31\x66\x0b\x07\xc2\x36\xdd\x0b\x5d\xf1\xb3\x3a\x44\xde\x33\xbb\x00\x84\x22\x76\x4d\x95\x85\x45\x51\x11\x15\x33\xb3\x53\xab\x9a\xa9\xf6\x03\x82\x0e\xcc\x95\xae\xe9\x06\x51\x32\x92\xd9\xb9\x17\x39\x0b\x3d\x01\xf1\x60\x61\x48\x1b\xd6\x9b\x5d\x4c\xa1\x34\xec\x50\x0b\x1a\x9a\xa0\x16\xdb\x03\x20\x62\x7f\x36\x58\xee\x08\x5b\xf8\x82\x59\x71\x0d\xae\x78\x0f\x8e\xe9\x82\xc2\x7e\x7e\xd1\xec\x4c\xc4\x5c\x68\xbe\x60\xae\x27\xd8\x5d\x2f\xe8\xc8\x01\xeb\x83\x4b\x77\xa6\xd7\x40\x32\x70\xd1\xd8\x85\x6f\x27\x74\x98\xd0\xfe\xd4\xcb\x9f\xd9\xbd\x63\x2b\xfa\x13\xfe\x9c\xbc\xaf\xe8\x68\xae\x4a\x3a\x42\xe8\x80\xa7\x09\xf1\x76\x6f\xb0\xbf\x1a\xd5\x4e\xa9\x7d\xd6\x71\xf6\x6a\xb5\x22\xb4\xc2\x71\xea\xec\xb4\x26\x2b\x42\xc6\xea\x03\xd4\x57\x8f\xae\x7e\x2f\xde\xb3\xf2\xaa\x85\x82\x87\xc8\x08\xae\xd5\xea\x72\x47\xff\x90\x9c\xad\x90\x50\xb0\x32\x24\x2e\xaa\x38\x45\x3e\x69\x1f\xe9\xe7\x05\x5b\xce\xac\xb8\xb6\x09\x94\x2a\xbb\x29\x93\x66\xf0\xf0\xf5\x01\xd8\xdd\x23\xc8\x30\xa0\xd2\x73\x40\x2e\x31\x53\x5c\xa3\xb9\x72\x7b\xda\x54\x44\xdd\x45\xba\xe4\xce\x0e\xab\xc0\xb1\x3d\x42\x58\x30\xa7\xd6\x76\xed\xed\xc4\x5a\xb7\xbd\x16\xcb\xb6\x91\x6b\x07\x9d\xf2\xbb\x32\xd5\x4a\x0b\x1a\xc7\x43\x43\xa9\x28\x8a\xb6\xd9\x05\xff\xb1\x72\xd2\x84\x8d\x04\x96\x72\x16\x86\x76\x00\x34\x49\xac\xb6\x7c\x15\x6b\x2c\x89\x4b\x35\x24\x21\xbf\x49\x71\xd1\xa7\xc2\x50\x97\x67\xb3\x9f\x89\x55\x99\xec\xbb\x05\xd5\xe5\x6c\xf1\xfc\xa2\xa9\x45\x9e\xb5\xc3\x54\xf5\x49\x2c\x29\x89\xb0\xe9\x8a\xb0\x21\x87\xbf\x62\xb5\x84\xb4\x51\x21\xb3\xb0\x23\xa8\x0d\x0c\x42\xd9\x0a\x85\x25\xa0\x9c\x29\x8f\x5e\x92\x32\x18\x5b\x72\x34\x02\x42\x73\x0b\x5d\x09\x75\x3e\x59\xbf\xa7\x79\x13\xa5\x02\x6c\xd8\xca\x80\xdd\x71\x67\xb2\x6a\xfa\xb2\x48\xc0\x0c\x68\x7a\x7f\xdd\x4a\x7b\x06\xb2\xc4\xd9\xe4\x41\xc7\x79\xbd\x09\x39\x60\x5a\xc8\x07\xe7\x23\xfa\x05\xee\xa9\xcc\x60\x09\xc0\xb2\xc4\xd0\x14\x16\x62\x2e\xdf\x76\xbe\xe6\xcf\x6e\x9f\x41\xe8\xb4\x13\xfc\xf3\x9e\xbf\xa9\x29\x9d\xe0\x38\xdf\x09\x92\xde\x28\x92\xe9\x49\x67\x8b\x81\xff\xd0\x2d\x3b\x6e\xdd\xaa\x23\x69\xfb\x50\x56\x23\x25\x04\x8b\x81\x40\xee\x83\xf5\xb2\x76\x22\xc9\xa6\x03\xc7\xf2\x5b\xb9\x65\xde\x67\x65\xa0\x5d\xac\xd5\x60\xc8\x51\x5d\xd6\x33\x12\xae\x77\x34\x2d\x44\x9c\xd8\xaa\xae\x6f\x52\xa9\x57\xc9\x7a\xb1\xbc\x38\xaa\x56\x8a\xc8\x6e\x6b\xef\xbd\x89\xf8\x89\x81\x45\xa4\xbb\x39\x79\xaf\xfd\xe8\xda\x8b\x67\x77\x65\xdb\x91\x80\xb1\xb3\x34\xcd\xa9\x10\x1f\xe2\x54\xd4\xed\xb6\xdc\x54\x55\xa3\xfa\x71\x01\x83\x14\xfe\x3e\x29\x8f\xb6\x2e\x5d\x18\xcd\xf5\xeb\x26\x15\xf4\x2d\x1d\x79\x8f\x51\xc3\x44\xcb\xca\xd6\x16\xba\x4c\xd7\x42\xb9\xdd\xa5\x94\xad\x1a\x82\xaf\x1f\x1c\x13\x9b\x79\xbe\x83\x88\xf9\x40\xb4\x3b\xd6\x0a\x00\x48\x51\x46\x42\xca\x22\x2f\x88\x62\x45\xbd\x0b\xb1\xc6\x4e\x6c\xcf\x7e\x6d\x80\x44\x16\x3f\xbc\x9a\xe3\x9f\xb1\xce\x65\x52\x15\x01\x97\xf7\xb2\x3b\xe8\x71\xe6\x01\x30\x79\x1e\xe0\xd8\xd3\x8c\x40\x67\x30\x8f\x40\x02\x7b\xb8\xf2\x18\x4a\x24\xac\x44\x18\x61\xa6\x47\x1a\x8d\xee\xd0\xda\x69\x7f\x14\x6e\x26\x9e\x47\x1c\x37\x6b\x84\x4d\x33\x4d\xd4\x04\xb1\xec\x9c\x96\x97\xe5\x9e\x61\x9f\x02\xd2\xa2\x4d\xfc\x67\x09\x4b\x19\xd5\x2e\x72\x47\x13\x8b\x1b\xb5\xb5\xc7\xd6\x4c\x6b\x92\x6d\x62\x20\x11\x59\x1c\x45\xde\xd7\x39\x4e\xcd\x9e\xf6\xf3\x34\x21\x1e\xa1\xb9\xdc\x45\x4f\x68\x69\xf0\x54\x27\x94\x23\xaf\xa5\x6e\xfb\xad\xba\xb3\x0b\x51\x86\xe5\xc2\xec\x6b\xfb\x76\x0f\x08\x88\x9c\x36\xae\xab\x94\x03\x92\x78\x8f\x36\x43\xab\xbb\xf6\xee\x21\x09\x0d\xaf\x7a\xa0\x32\xbc\x10\x9e\x76\xb9\x98\x2b\x46\x27\x50\x30\x4c\xcb\x26\xb9\xe3\x85\x3a\x28\xc6\x58\x54\xdf\x34\xf9\x85\xe9\x57\xc7\xac\x19\x53\xab\xf4\xa7\x7e\x9b\x16\x79\xc2\x7e\xa9\x0c\x48\xbd\xc8\xdb\x86\x1b\xf8\x66\x42\x59\x8c\xd9\x32\x54\x18\x2a\xa9\xb5\x1b\x51\x8f\x88\x8c\x01\x30\x00\x52\xb3\x48\xbd\x35\x75\x99\xf3\xe8\xc6\x06\x97\x08\xd7\xde\xd2\xd4\xbd\x5b\x1a\xb0\x23\x62\x5e\x61\x85\xba\x40\x06\xe0\x6b\x9a\x45\xf5\xd1\xdf\xd2\xe0\xce\x7f\x07\xb1\xe9\x33\xb7\x34\x61\xcb\xb8\x9c\x71\xbd\x0d\x8f\x28\xec\x99\x68\x3d\xd0\x3d\xa2\xcb\xda\x37\xc2\x73\xc5\x68\xc7\xde\x58\x9c\x0e\xd9\x1c\xd4\x0d\x39\x28\x9a\x49\x08\x2a\xcc\x15\x09\xa2\xb3\x29\x23\xf6\x18\xac\x09\x59\xec\x13\x5e\x3a\xa8\x47\x6c\x4b\x30\x92\xfe\x59\x95\x5c\x2a\x6e\x30\x77\x11\x82\xdb\x7b\x0e\x28\x5d\x60\x22\x21\xb7\x29\x68\x56\x95\xe5\x3f\x34\x34\xad\xe5\xfa\xc7\x5f\x4c\xeb\x2f\x45\xba\xfa\xa7\x1f\xee\x68\x46\xc2\x17\xca\xd8\x0c\x8f\xf3\x76\xd3\x2d\x6e\x35\xc9\x9a\xd8\x2b\xe3\xe7\xf4\x87\x34\xb0\xdd\x17\x73\x19\xd6\x39\x63\x81\x82\xee\xb3\x25\xbf\xd7\x17\xa4\x71\xb9\x43\x8a\x25\x65\xb6\x01\xee\x0b\x0c\x8c\x01\x80\x9c\xe1\x30\x6c\x89\x29\x02\x29\xa3\x0a\xa7\x0e\x41\x7b\x93\xea\x25\x40\xcb\x6e\x06\x8a\x0f\xa7\x8a\x84\x2d\x1d\xb8\xc2\xad\x2e\x82\xde\x3c\x58\xed\x87\x2d\xc9\x4c\x05\x97\xf4\x4c\xa3\x16\x40\x3f\x1a\xa8\x55\x45\xeb\xe2\x75\x28\x2c\x91\xc8\xd5\xa9\xad\x82\x0e\x0e\xa7\x2f\x46\xda\x72\xa0\x19\x55\xec\x70\x78\x07\x97\x17\x37\x10\xe1\xe7\x63\xac\xfb\xc6\x92\x22\x96\xd0\x65\xe5\x5d\xb7\x1d\x2d\x0a\xea\xc0\xe1\x20\x66\x8d\x3d\xa0\x6b\xa8\x50\x50\x7c\x84\x06\x11\x9e\x05\x74\x88\x28\x2b\xc1\x34\x6a\x3f\x1c\xe2\xe5\x18\x51\x1a\x74\xc2\x0e\x3c\xd0\xae\x8f\xd3\x24\x1a\xd5\x25\x55\x98\xae\x33\x51\x9c\xf0\xea\x28\x77\x68\x9a\x84\xf6\x31\xa5\xb2\xa1\xbe\x15\xd2\x9e\xf2\x35\x05\xdf\x4a\xca\xa5\x09\x8b\x69\x3c\xdb\x2d\xf8\x0b\xdd\x7b\x18\xf0\x08\x32\x78\xa2\x22\x55\x9b\xe4\xff\x49\xb2\x94\x95\x49\x93\xb6\xda\x12\x66\x0d\x6a\xe1\xe4\xa0\x92\xec\xda\x4a\x1c\xf5\x10\x39\xc8\xd2\x0e\x61\x4e\x69\x8b\x35\xb1\x60\xa4\x76\x09\xd7\x13\x8c\x13\x85\x7b\x34\x82\xa1\x94\x77\x3a\x4d\x27\xba\x12\x1a\x70\x8b\x63\xbe\x90\x66\xf8\x95\xe3\xa6\xc2\xab\x67\xae\x0c\xf0\x24\x9a\x6b\x97\x5a\x4f\x2d\x53\x2e\x36\xe7\xc9\x72\xa3\x26\x6a\xd4\x54\x42\x04\x2c\x42\x9d\x33\x44\xa3\x4e\x0c\x6a\xef\x21\xa5\x1e\x23\x89\x4d\x6a\x89\x44\x5f\x0a\x98\x40\xcb\xfc\x48\x92\x1d\x1b\x16\x64\xad\x25\x5a\xa6\x29\x3d\xa6\xc1\xa1\x30\x6d\x00\x56\x41\xdd\x7d\xfd\x14\x8c\x82\x6b\x50\x6a\xfd\x25\xad\xdf\x9b\x60\x91\x21\x3b\xf1\x9e\x0c\x5c\x01\x42\x19\x42\x8a\x8a\xd3\x09\x7e\x32\x19\x70\xa3\xe9\x8d\x84\x21\x7a\xb9\x32\xc5\x46\x4e\xa3\x78\x5a\xe2\x41\x35\xdf\x24\xa1\xa6\x72\x5b\xed\x45\xc5\x06\xf4\xef\xce\x12\xb3\xc2\x25\x5f\xb8\xd0\x7e\x53\x3b\x6b\x49\x00\xf3\xb1\x0a\x4c\xad\x8d\xa3\x33\xd2\x4f\x65\x79\xc2\xb5\x3b\xc9\xf9\xbc\xb6\x6b\x99\x5c\xfd\xbb\xf4\x99\xe1\xc7\x0b\x5f\x43\x85\x46\x70\x42\xc6\xfe\x95\x34\x29\xf4\x3b\xa8\xc7\xc9\x52\x38\x56\x87\xd8\xc1\x38\xa2\xe6\xfb\xe4\x29\x61\xf3\x16\x99\x59\xe9\x0c\x14\xda\x4e\xa6\x62\x95\x93\xef\x02\x31\xa5\xdb\x06\xce\x0e\xb6\x51\x7b\xc3\xab\x3a\x8c\xe0\x56\x57\x01\x54\xb8\xa5\xc9\x14\x16\x36\x98\x80\x40\xab\xe7\x34\x86\x34\x6d\xb4\xd3\xe8\x98\x39\x13\xa5\x05\xe1\xbb\x3d\xe7\x9f\xbe\xbc\x7c\xe8\xcf\x76\x60\x6d\x9d\x36\xdf\x38\x1b\xd1\x5e\x87\xbc\xa5\xa8\x2e\x0f\x73\x4b\xbd\x6e\xab\xcd\x2a\x3b\x48\x2e\xfc\x2a\xf6\xa1\x02\xb2\x25\xbd\x8c\xd6\x50\x26\x32\xec\xf9\x61\x64\x91\x26\xbf\x42\x43\xf7\x76\x22\xea\xf2\xab\x7f\xae\xd9\x6f\xc7\x5d\x27\x5c\x73\x15\xec\xaf\x6f\xac\x57\x04\xb8\xcf\x51\xed\xa4\x38\x30\x2d\x0c\x78\x8e\x3a\x11\xc6\xa4\x3d\xe4\x0d\xd0\x92\xaf\xff\xcf\xa0\xf7\x2d\x4d\x03\xdd\x78\x96\xf2\x14\x77\x25\xad\xad\x9e\x21\x2c\x00\x11\x7c\x4e\xa2\x2c\x0e\xa1\x8b\xa3\xb8\x56\x00\x13\x25\x1d\xc9\xb1\x97\xd1\xb0\x17\x4c\x46\x7f\x68\xf6\xb4\x76\x4b\x3a\xed\x9a\xd9\x8d\x2e\x07\x9b\xc1\x97\x6b\x37\x7e\x24\xc9\x85\xe4\x60\x5a\x49\x02\xf8\x71\x50\x2b\xfc\x64\x97\xa6\xef\x2c\x66\x11\xf7\x00\xba\xef\x98\xc5\x71\x05\xad\x18\x6d\xe3\x3e\xf3\x73\x7d\x48\x87\x9d\x80\x97\xae\x1d\xdf\x6d\x16\xbc\xdd\xae\xc6\xf2\xf3\xbc\x99\x51\xdd\x0c\xf7\x09\xc5\x9b\x6f\x27\xcb\x82\x76\xab\xad\x26\xb4\x0f\xdb\xb0\xe3\x37\xb3\x61\xea\xe7\xf3\x53\xf2\x98\xf8\x43\x31\xea\xba\xce\xb3\x54\x5c\xc6\xc1\x5c\x7e\x33\xe1\x4e\xb2\x92\xfb\x51\x85\xa6\x61\x50\x20\x89\xe2\x4c\xc3\x89\xe2\x52\xc3\xa9\xc3\x95\x0b\xfc\xfd\x54\x0c\x76\xca\xc2\x0d\xdc\xa4\x58\x93\x87\xbb\x21\x94\x57\x57\x65\xbd\x48\x14\x92\x67\xd8\xad\x86\x37\x0b\xa7\xc2\x7d\xdc\xba\x8e\x73\x02\x51\x98\x7c\x5d\xc2\x0c\x54\xdb\x14\x2d\xce\xd4\xa5\x9f\xef\x30\x63\xf5\xa4\xc8\x97\x84\xea\x66\xf6\x9c\xff\xda\xcf\xb8\x14\x33\x0a\x48\x87\x5e\xae\x36\x69\x46\x3b\xe6\x0d\xff\xd1\xaf\x01\xb8\x24\x73\x1b\xb8\x52\xa9\xe6\x84\x4c\x60\x5d\xe1\x9f\xcc\x87\x0b\x56\x13\x1d\xd5\xdb\xd5\x82\x76\x83\xb8\xa2\x60\x4f\x70\x31\x35\xd4\xe4\x79\x16\x0b\xcd\x11\x37\xbf\xcc\xac\xd2\xae\xb0\xca\x7d\x84\x04\x60\xff\x0f\xa8\xf5\xd5\xa5\x9c\x28\x60\x57\xa2\xbb\x65\x93\x46\x49\x7a\xda\x5b\x4d\x94\xb8\x06\x36\x34\xf1\xa2\x58\x11\xfd\x5e\x09\x8f\x2f\x9c\x7e\x11\x5b\x22\xd7\x05\x58\x23\x29\xe5\x1b\x03\x58\x7d\x80\x66\x5a\x7d\xcf\x1b\x9b\x52\x24\xb7\x45\xa8\xfc\xd6\xc2\xaa\x64\xe8\x41\xad\xc0\x1f\xe7\x2b\xff\xe0\x24\xd7\xbc\xdc\xe2\x12\x9d\x66\xb1\xbc\xfa\x3d\x3b\x88\xd2\x35\x50\xb8\xd0\xe1\xb1\xce\x57\xec\x92\x9a\xd8\xdb\xda\xa9\xad\x93\xb9\xdf\xe6\x58\x62\x8b\x5f\x30\x57\x99\xd0\x17\x71\x7d\x93\x0f\xb8\x12\xc7\x05\xc4\xab\x85\xaa\xff\xf5\x0e\x62\x9d\xfe\x0d\xc9\xe1\x35\x04\xb2\x78\xab\x31\xae\x37\x7a\xbd\x40\xeb\xb5\xdc\xa8\x95\x5f\xb5\x9a\xf3\xfa\xe1\x84\x17\x62\x2b\x14\xa4\x64\x8b\xb9\x5d\xfa\x71\x5d\xc3\x57\x08\xb7\x8a\x07\xc8\xdb\x2c\xfc\xf1\xac\xef\xe1\x81\x32\x72\x5d\xf1\x32\xb8\x62\x38\x79\x6b\x1e\x5d\x5f\xb4\x9f\xbb\xbe\xc0\xbe\xfd\xec\xcd\x45\x69\xa0\x8e\xec\xda\x0d\x4b\x10\xa0\xec\x65\x96\xb0\xb7\x0a\x16\x6a\x2d\x0c\x17\xac\x80\x5e\xd8\x28\x04\xec\xce\x1d\x66\xc5\x5e\x87\x8c\xf5\x01\x05\x63\x52\x69\xca\x98\x5a\x82\x4c\x26\x8b\xa2\x33\x24\x17\x2b\x7a\x58\x62\x69\x6b\xe6\x8d\x21\x8d\x0a\x09\x6a\x6d\xd6\x54\xe8\x9f\xc5\xaf\x67\xce\xa3\xd1\xa2\xd7\x08\x54\x74\xc8\x5a\xdf\x3d\xea\x95\xf7\x8c\xbc\xf3\xf8\xe9\x25\x4c\x92\xac\x85\x7b\x29\xce\x61\xce\x39\x5b\x6e\x1f\xc4\xd3\x6d\xea\x1a\xc1\xb1\x9c\x37\x8d\x30\x6b\x65\x4e\xb3\x4e\xc4\x2f\xb0\x48\xd9\xc1\xed\x93\x45\x17\xd1\x1b\x2a\x02\xd8\xe2\xde\x5a\x1f\x26\x72\x91\xa9\x7e\xdc\xfa\x19\xf3\xa0\xfe\x1e\x2f\x30\xfa\xb3\xfa\x61\x45\x13\x5f\xb9\xf3\x38\xd1\x85\x1b\xb9\xe2\xd5\x6d\xc3\x74\xdd\x2e\x04\xa1\x2c\x63\x3f\xe1\x05\xa7\x33\x8d\xce\xc4\x4e\xd6\x1f\x03\xf3\xc6\x14\xab\x88\xd2\x33\x1c\x53\x75\x46\x01\xe5\xa9\x45\xfe\x87\x5f\x5e\x0d\x66\x6a\x7f\xa4\x1d\x54\x6e\x89\x27\x62\x36\xdc\xa7\x38\xce\x52\x73\xb2\x00\x5a\x0d\x64\x2e\x6b\xea\x3b\x2f\xc3\xff\xfc\xef\xff\xe3\xfc\xbe\x4e\xc1\xfd\xb6\x2e\xe8\xc3\x29\x5d\xb6\xbe\xe6\x9c\xdd\x3c\xa4\x3a\x93\xbc\x7a\x46\xd2\x19\x93\x01\x38\x4d\xf2\xf5\xe1\xc2\x1c\x52\x91\xdb\x24\xfd\x1e\xbe\x53\x02\x6b\x44\x8b\x2f\xa4\xb3\x09\x48\x03\x03\x73\x6e\x48\x30\x78\x5a\x98\x58\x4c\x20\x65\x33\xae\x89\x84\xbd\x08\x4e\xb2\xbf\x76\xf9\x72\x3b\x67\x1d\xd1\xec\xa2\x4c\x17\x0b\xfe\xa9\xa7\x79\xbb\xc9\x1b\xc1\x79\xe0\x73\x78\x84\x84\x26\xfd\x7c\xf6\x2d\xc5\xdc\x5a\x4f\x0d\x6b\x7a\x2b\xb3\xce\x76\xb7\xea\x45\x84\x51\x97\x93\x7d\x07\xb3\x31\xe8\x5f\xb4\xfa\xb2\x5b\xad\xa4\x98\xd5\xca\x94\x4a\x99\xd4\x16\x3a\x2e\xcf\x4d\x52\xdf\xd8\xe7\x3e\xdc\xe3\xc0\x3d\x98\xa7\xc5\x36\xe2\x3b\xa6\x2e\x8b\x14\xde\x68\x2a\x2c\x4d\xd8\xc6\xf5\x59\x95\x4d\xf4\x18\x7b\x8c\x13\xa5\xad\x0d\xc9\x7e\x44\x68\xb2\x09\x9d\x8c\xb0\x8a\xd4\x1b\x6c\x84\x11\x20\x4e\x19\x66\x73\x62\xdf\x8e\xd3\xce\x5d\xd4\xaf\xd7\x5a\x0b\x89\x7e\xa8\x87\x8e\x78\x4a\x6c\x70\xd0\x05\xb1\x3e\xae\xfe\x49\x59\x32\x7a\x22\x6a\x1c\x16\xe4\xbc\x1f\x16\xa4\x48\x17\x06\x8a\xf8\x36\xdf\x1a\x10\x4f\xda\x0c\x05\xb1\xb6\xb4\x18\xf0\xf0\x28\xe0\xe8\x89\xfb\x22\x36\xf1\x6b\x42\xeb\xbe\x14\x9e\x7a\xec\x81\x45\xc7\x06\x9d\x99\xfb\xfd\x84\xaf\xf0\xea\xf4\xc3\xec\xcd\xd5\x27\xf9\xa0\xe5\xe4\x28\x31\x4f\xf8\x6f\xbe\x95\x54\x76\x16\x01\x1c\xfb\x8a\x10\xcb\x78\xf5\x49\x34\xd5\x92\xcd\x4c\x3e\xef\x8f\xd7\xfc\x0b\xea\x01\xc9\x81\x01\x6e\x01\xee\x4d\xd9\x62\xdc\x0f\x3a\x33\x5e\xb4\x10\x3b\x14\xd2\x99\x65\x32\x5c\xd7\x4f\x39\x36\x0c\x2e\x20\x5f\x1e\x51\xc8\x26\xcb\x4d\x94\xe4\x3c\x67\x8f\x31\x3a\x57\x43\x00\xfc\x91\xec\x37\xf4\x73\xcd\x2e\xa5\x3e\x77\x5f\x1b\x1e\x8a\x5c\x91\xf0\xad\x7e\x0d\x37\xa4\x06\xe1\x48\xe8\xc0\x72\xf7\x8c\xb8\x9b\x93\x22\xcb\xb4\x64\xdb\x04\xd4\x0b\xab\x60\x1c\x01\xdc\x00\x2d\x81\xb8\x6e\x22\x45\xfd\x75\x53\xb0\x58\xd2\x6c\x13\xf5\x88\xb7\x49\xdc\xad\xcc\x4e\x88\x05\xdc\x75\x84\xeb\x0b\x33\xa7\x46\x52\xcb\x39\x3d\xe8\x22\x53\x44\xe6\x3f\x4b\xc1\x2c\x37\x71\x6c\x6b\x2c\x3a\x70\xb5\xd2\x80\x68\xd0\x14\xec\x24\x62\x87\x43\x8b\x36\x68\x90\x89\xe2\xc2\xac\xc0\x8e\x22\x29\x68\x0d\x55\xa0\x15\xbb\xa1\xad\x93\x92\x8f\xd8\x12\x8e\x55\x6e\xfd\x6c\xb5\x56\xf0\x76\x43\x76\xcc\xdc\xf8\x90\x37\x70\x72\xfb\x50\xe7\xad\xd5\x23\x05\xfd\xd8\xa8\xa7\x3a\x1b\x62\x09\x17\x5e\xff\xef\x18\xb9\x98\x08\x70\x3f\x2d\x01\x7f\xc4\x37\x97\xcc\x71\x0c\x94\x95\x16\x29\xc1\xb2\xb0\xbb\x87\xa0\x26\x31\x29\x6b\xc3\xca\x00\xfa\x86\xff\x56\x50\xbd\x13\x4d\x19\xc9\xc4\x51\x23\xbc\x53\x71\x07\xdf\x99\x8c\x90\x3a\xd9\x88\x68\x2b\xfe\x71\x7c\x68\xdc\x99\x26\xae\xb4\xb3\xaa\x09\x4a\xae\xad\x90\xb4\x20\xa8\xf7\x29\xb3\x6d\x2b\x62\xf6\x61\x36\xe6\x6b\x01\xd6\x2c\xd2\xe5\x96\x26\x74\xed\xfa\x48\x07\x13\xcf\x59\x80\xe7\x4b\x53\xcc\xd9\xdc\x65\x96\xca\x85\xb8\xcd\x62\x5a\xe2\x36\xcd\x7d\x10\x14\xbe\x40\x18\xee\x16\x68\x75\xdb\xdd\x3e\xba\x64\xa2\x29\xbd\xf3\x83\x9d\x92\x1f\x6f\x05\xa0\x3d\xa8\x5b\x7e\x97\x43\xcf\x12\xdc\x61\x87\x99\x6a\x1e\xe2\x90\x2a\xcc\xd3\x9e\xee\xc4\xfc\x59\x0e\xb4\xa0\x0d\x78\xa8\xa4\xc5\xaa\xce\x89\x4d\x85\x9f\x71\x16\x9e\x73\xc1\xfa\x69\x35\x59\x8e\x5b\xdd\xe2\x48\x54\x4c\xb0\x59\x37\xa5\x9f\x00\x40\x6c\xd5\x53\x43\x6d\x96\x54\x2f\x63\x39\x46\x29\x72\x8e\xa1\xdf\x60\x87\x15\xd5\xd4\xf8\xb6\xfc\x29\x69\xa5\x25\x39\x1f\xbd\x8a\xa7\x3c\x72\xe5\x5e\xcb\x23\x6a\x79\x23\x61\x5f\x1c\x7d\xb7\x21\x31\x04\x17\x50\xc1\x06\x96\x0b\xa5\x38\x87\x41\xcf\x04\x0b\x94\x80\xbe\x5a\xd3\x2b\x36\x43\xc1\x54\x45\x66\xe7\xe1\x7c\x44\x66\x12\x7d\x24\x57\x0a\xb9\x30\x7a\xd6\xd2\x46\xb2\xf6\xb6\x43\xa3\x70\x57\xa7\x3d\x35\x0b\xc8\xa4\x47\x39\xe9\xe5\x68\xb4\xbb\x30\xb0\xd6\x45\x98\x0a\xa5\x40\xc6\x57\x21\xeb\x43\xa7\x15\xce\xf9\x54\xf6\xe4\xb3\x8a\x58\x57\xe8\x9b\x6c\x2d\x52\x92\xf6\x04\x89\xf3\x41\x3c\x17\x55\xb4\x53\x99\xb3\x3e\x27\xca\x04\x23\x24\x7a\xc3\x7d\xcd\xed\xb9\xe6\x79\xc4\xd0\x72\x05\x02\x8b\x29\x23\x36\xe5\x8b\xaa\x66\x22\x0c\xc7\x75\xe2\xc5\x88\x99\x22\xca\x6a\xa7\x25\xa0\x4d\x9e\x3f\x65\xd2\x5b\x87\xcc\x35\x08\x0c\x9b\x81\x8e\x4c\x16\x37\x20\x5b\x38\x9b\x7f\xd8\x04\xcd\xa1\x76\xaa\x83\x2f\xaf\xd4\x4c\x59\x6d\x72\x1a\x75\xd9\xa2\xf6\x04\xa9\x98\xe1\x92\x86\xa7\xd7\x2b\x66\x02\x9f\x1d\xbe\xfa\xf3\x17\xb6\x40\x06\x8e\x77\xe7\x5b\x11\xe2\x6d\xd1\x5d\x88\xd6\xd2\x6d\x32\x70\x68\x3d\xdc\x17\x37\x27\x68\xab\xf4\x92\x04\xc4\x33\x3c\xbd\xe3\x61\xf7\x90\xec\x21\xaf\x3b\xab\x38\x42\x39\xf3\xb3\xf8\x46\xcb\xa2\x34\x10\x14\x01\x1e\xbd\xe0\x2b\xdd\x02\xac\xc3\x0e\x38\x96\xc6\xf7\x84\x03\xc3\x54\x73\xb5\x84\x89\xac\xab\xd8\xfb\xe6\x0e\x4b\xdb\x25\x2c\x40\x40\xc6\xfd\x92\x87\xf2\x0f\xf7\x7a\x05\x12\xc8\x92\x50\x40\x76\x9b\x6e\x41\x18\x19\x92\xbb\x8e\xea\xaa\xad\x78\xe5\x77\xb3\xda\xf4\x72\x57\x1c\x37\xd5\xa0\x2f\x30\xe2\xb1\xfa\xfa\xaf\x6a\x3f\xac\x08\x15\x73\x47\x42\xf6\xcc\xd4\x01\x95\xb7\xcc\xe9\x74\x9c\x49\xb5\xb9\x81\x9b\x70\x02\xfc\xca\x42\x62\x17\xc0\xad\x70\xa5\xc5\xce\xc4\x36\x05\x7a\x81\x8a\x6d\xa0\x36\xd5\xa1\xa1\x9d\xe9\x72\xf4\x64\x98\xbd\xf0\xce\x30\x36\x8b\x8f\x9c\x07\x69\xdb\xed\x5c\x92\x78\x87\x5f\xfd\x93\x68\x87\x87\x23\xca\x69\x10\xc7\x10\xda\x16\xeb\x32\x8d\x78\x90\x4c\x3c\x95\x81\x0f\xd2\xa7\x03\x7e\x3d\xc8\xc3\x46\x47\xb6\x4a\x5d\x0a\x13\x42\x2c\x89\x61\xaf\xe7\x5a\x07\x6b\xcb\x48\x04\x1a\xa9\xc9\x09\x01\x56\x06\xe8\x35\xe3\xf3\xa5\xa9\x11\x28\x69\xca\x03\x4a\x6b\x3b\x27\x52\x04\xa0\xd5\xde\x94\x01\xe4\xd5\x7f\xc0\x07\x2a\x79\x31\x06\x4a\x62\x62\x03\xff\x4e\x07\x2c\xc1\x51\xb2\x13\xe0\x74\x68\x22\x3e\xa6\x61\xae\x09\x7a\xe5\x03\xe6\x79\xd0\x4b\x07\x26\x9d\x5c\x9d\x00\xc6\xd5\xb1\x85\x94\x71\x8f\x41\xca\x11\xac\xe7\xee\x70\x05\x75\x89\x48\x10\x31\x83\xf5\x91\xbc\x39\xed\x9c\xa5\xd1\x60\x02\xba\x88\xf6\x08\x8d\xda\xd0\xaa\xa4\xa5\xde\x6a\x4b\x4d\x36\xfc\x68\x33\x95\x4b\x18\xd9\x45\xda\xf1\xcc\x10\xae\xb3\x5a\x20\x09\x03\x03\x0e\x31\xa2\x5f\x17\x0c\x8b\xfa\xb4\xca\x15\x02\xd5\x72\x96\x66\x23\x7e\xb0\x37\xfc\xc8\x6f\x24\xd5\x21\x2d\x43\x1a\x2c\xac\xca\x99\x92\x70\x17\xc8\xf0\x33\x1d\x56\xd7\xda\x13\xbd\x55\xbd\xdc\x8b\xb4\xde\x1a\x51\x77\x7d\xdd\x68\xbb\xc6\xd9\x98\x5a\x13\x2c\x29\x12\x56\x73\xaa\xb0\x25\xd3\xb1\x9c\x69\xa9\xa2\x56\x04\x4d\xf8\x18\x75\x94\x18\x19\x52\x31\xef\x91\x36\x5d\xcc\x6e\x66\x89\x6c\x10\x87\x0b\xd8\x12\x36\xcb\x6e\x07\x9b\xa9\x4a\x05\x41\x94\x1e\x8a\x84\x79\x60\x12\x1a\xa2\xc3\xcb\x56\x31\x5b\xbb\xc6\x5a\xfb\x5e\x81\x93\xc4\xa1\x9f\x3f\xa8\x54\x77\xff\x58\xa5\xd7\xee\x54\x0f\xb3\xce\x09\x66\x50\x6f\xb8\x0d\xc7\x2a\x67\xd5\xed\xe5\x71\x3f\x92\x3c\x45\xfc\x11\xd5\x97\x70\xf4\x40\x8e\x09\x93\x0d\x06\x25\xb0\x8d\x86\xdb\xa5\x15\x25\xc1\x8d\x95\xc5\x20\xfc\x19\xc7\x05\x1e\x29\x20\xfb\x34\x83\xf1\x2f\xe0\x2f\x54\x01\x8e\xab\xae\xf1\x02\x88\x02\x92\xb3\x26\x97\x0b\xbc\x84\x8f\x06\x18\x92\x01\x74\xc3\xb1\xfd\x44\xad\x3a\x92\x35\x65\xf4\x6b\x71\xb0\xd0\x8c\x8f\x01\x80\xbc\x10\x00\x8e\xa3\xa6\x1d\xad\x82\xf8\x51\xea\x8d\x4a\x4f\x2f\xd5\x75\xdf\xdd\x5a\x67\xa3\xb5\x42\x21\x64\x8b\x48\xd5\x41\x89\xb1\x02\xbb\xaa\x69\x97\xec\xfd\xdb\xd2\x31\xda\xb4\xa2\x34\x2f\x3f\xd3\x82\x2b\xc1\x0e\x36\x63\x45\xb0\x5f\x78\xe2\x67\x57\xbf\x63\xb7\x20\x2e\xc3\xaf\xdf\xbd\xe5\x5b\x5a\x6f\x59\xf6\xeb\x1f\xdf\x12\x77\x79\xf3\xd7\x3f\xbd\x6d\xc0\x57\x0e\x0a\xcf\x57\xe9\xd6\x8c\xd4\xc0\x05\x2d\x34\xab\x81\xaa\x4e\xf4\x3f\x24\x19\x7d\x8a\x29\xfe\xc7\x16\xcb\x18\xcc\xb1\x6c\x65\x0d\xfb\x07\x9a\x18\xed\xe4\xcc\x86\x93\x93\x9d\xec\xea\xe9\x76\x73\x1d\x75\x83\x8d\xae\x63\xe6\x20\x66\xb6\xb8\x4e\x43\x36\x4f\xdb\xd9\xbb\x60\x52\xfc\x80\xff\x00\x66\xfa\x26\x8f\xf5\x9d\x2d\x66\x8d\xb7\x05\xde\xc5\xca\xa3\x93\x0b\x9c\x3a\x51\x38\x22\x9b\x4c\xc1\x6d\x10\x1e\x70\x5e\xa1\x1b\x1a\x7b\xd2\xfb\xfe\x94\x3f\xb9\x3e\x57\xce\x9e\x2d\x3a\x2d\x4c\xeb\xbd\x41\xf9\xb8\x88\x49\x19\x7f\xe8\xf8\xe3\x1c\xdb\x47\x81\x78\xe6\x46\xc8\xb2\x6a\x13\x15\xa8\x0d\x4f\xb3\x40\xb2\x0f\xbb\xac\x62\x2f\xff\xda\x1a\x39\x28\x40\x5c\x4c\x0f\x5e\x8b\x7f\xbe\x40\x6f\x0d\xb1\x02\xd2\x21\x42\x1b\x9a\xfe\x3c\x03\xb6\x11\xf6\xdc\x70\x2b\xc1\x5f\x3f\x32\x26\x45\xeb\x21\x3d\xd3\x3a\x82\x2e\x68\x45\xab\x2f\xae\x48\xf5\x0e\x04\xc5\x55\x59\x5f\x06\x1f\xfd\x54\x4d\xc4\x80\xae\xaa\xf4\xe6\x9b\x47\xaf\x02\xf8\xba\x8e\xc3\x10\x96\xe3\xbe\x12\x91\x0b\xd8\x21\x17\x70\x88\x3d\x88\x8b\x36\x5d\x07\xb9\x91\xa5\x86\xa6\xd9\xc0\x6f\xd6\x25\x9c\x95\x09\x91\x35\xa8\x0d\xc7\x13\xcb\x82\x19\x2a\x77\xfa\xb9\x6d\x55\x22\x2c\xbb\x98\x3f\xdb\xaa\x59\x2f\x69\x75\xa6\xae\x87\x91\x3e\xc2\x76\x22\x3d\x20\x4c\x7b\xea\xc1\xf4\x68\x97\x58\x9c\x72\x3a\x8a\x3b\x7e\x94\x4f\xc3\xad\x1c\xd7\xd6\xac\x68\x7a\xd7\x7d\x00\x58\xce\xd0\x0e\x3e\xc1\x78\x78\xb4\xe5\x7d\x2e\x6b\x3f\x38\x95\x04\x76\x74\x38\x92\x15\xb9\x3d\xc5\x59\x1a\x47\xc1\xf6\xd1\x4a\x99\x23\xe5\x71\xb1\x6b\xc1\x42\xd3\x9d\x51\xc8\xeb\x6c\xd6\x95\x99\x18\x31\xcb\x0a\x8c\xd4\x6d\x10\x1a\x89\x5b\xe9\x9c\xa4\xec\xd0\xc7\xed\xb2\xc6\xbb\xe2\x4c\xd9\x75\x8e\x47\x2c\x46\x03\xba\x4a\xab\xdc\xe6\xcb\x9c\xa4\x65\xa1\xad\x03\x2c\xa5\x0e\xa7\xcb\x0d\x76\xba\xe7\xc3\xde\xa9\x4e\x22\x54\x45\xb0\x35\x2e\x3b\x5d\x96\xc7\x64\x55\xe4\xdb\x77\x23\x35\x64\x84\xf3\x60\x07\x87\x35\x6c\xc4\x35\x08\xb5\xbc\x9b\xc8\xa5\x8d\xca\x82\x09\xdf\xdd\x3c\xb2\x77\x37\xa9\x5e\xe9\x60\x8b\x63\xaf\x39\x65\xea\x9f\xa9\x06\x31\x58\xfc\xa7\xd3\xa5\x8e\x42\xca\x62\x39\xf0\xf6\x40\xf4\x9d\x35\xf4\x62\x9b\x61\x39\xf1\x04\x85\x57\xbe\x59\xd5\x8f\x78\xc5\x44\x99\x4e\x7b\x0d\xc0\x73\x6d\x46\xff\xf4\xdb\x95\xbf\xb3\xf7\xda\xa4\x66\x47\x97\x5e\xf1\x65\x97\x9d\x80\x0a\xe6\x01\x5d\xc1\x82\xfd\x5a\x22\x9a\xd2\xf2\xd0\x6c\xe5\x34\xa7\x70\x6b\x71\x80\xed\x06\x7c\x53\x5b\xb9\xc6\xfa\xa7\x0e\x26\xd9\x76\x20\xf5\x46\x8f\x88\xe4\x87\x51\x6f\x10\xa5\x59\x67\x01\x67\x1a\x0c\xf2\x6c\xed\x70\xbc\x0d\xa3\xec\xcf\xde\x3d\x88\x43\x00\x8c\xcd\xd6\x0e\x81\x06\x4b\xa5\xb4\x3c\xc7\x3b\x3a\xf3\xbe\x0f\x19\x10\xa2\xa5\x77\xb8\x85\x3b\xe0\x42\x32\xa5\xab\x7f\x70\x2c\xc9\x7f\xb3\xf3\x18\x4a\x95\xaf\xe3\x76\x14\x84\x49\x93\x2c\x2c\x9f\xd1\x8d\x84\xf6\xa8\x68\xd2\xd0\x4e\x4f\xe1\xa1\xbb\xed\x07\x5c\x4b\xfe\xd8\x08\x31\xe7\xdf\xac\x24\xd3\x74\xed\x06\xff\xd6\x56\x68\x03\xaf\x2d\x93\x22\x8d\xf9\x76\x94\x45\xba\xae\xa5\x9b\x5f\xd0\x12\x55\xf2\x6f\x6f\x2d\x02\xd1\x5e\x03\x17\xe1\x68\x39\x0c\x09\xdd\x47\x04\x33\xa6\xfd\xf1\xf9\xa2\x96\x12\x37\x2f\xf5\x2c\xb3\xd9\xca\x0b\x10\xe2\xf0\xe0\x02\x33\x1c\xa5\xbe\x42\xc5\xe2\xfb\x53\x8d\x3d\xe5\x77\xaf\xf5\x1c\x71\xd3\x21\x91\x14\xa7\xd1\xbc\xd9\x78\x2b\x34\x59\x6d\x80\x59\x9a\x29\xb7\x9a\xfb\x7e\x3b\xa0\x5d\x8b\x02\xd6\xe9\xc1\x9a\x66\xdf\x68\x79\x44\xaa\xa7\x0d\xc4\x46\xb8\x88\x4b\x19\xea\xf3\x47\xab\x5a\xb3\x79\x4e\x73\xf5\x3b\x14\x7a\xcc\xd9\xad\xeb\x8e\x84\x5b\x22\xd7\x8b\x98\x7a\xe3\x4a\xef\x3c\x74\x23\xd2\x26\xf3\x66\xce\x93\x0c\x75\x2f\x22\x48\xd2\x46\x69\xad\x07\x8e\x5c\xc8\x06\x0e\xe0\xd4\xc0\x9a\xff\x0f\x2a\x1e\x5e\x93\x7b\x03\x58\x76\x67\x45\xf0\x46\xc3\x27\xc3\xda\xd1\x94\xb4\x9c\xb3\x61\x19\xcf\x4f\x68\x48\x3f\x18\x18\x07\xb8\x75\x93\xd3\x84\x21\x55\x83\xda\xd8\x30\xe8\xcb\x2b\x94\x08\xaf\xe3\xb5\x06\x36\xd3\x8e\x10\x6c\x75\x2e\xd8\x87\xec\x44\x9b\xde\x88\x4e\xa7\x21\xd8\xa6\xf4\x17\x8e\x92\x41\xa4\x75\x71\x85\x19\xd6\x2b\x75\x45\x04\xc9\x63\xd6\x00\x53\xb5\x10\x63\x79\x57\xea\x0e\xe6\xc2\xaa\xc3\x7e\x17\x9a\xb0\x58\x44\xf6\xbc\x27\xee\x7c\xa8\x70\x6d\x23\xb3\x8f\x0c\xdd\xd1\x40\x14\x50\x52\x18\xcd\xe7\xed\x3f\xdc\xcc\xbe\x55\x52\x20\xde\x31\xce\x32\x50\x3e\xa3\x7d\xd3\x84\x7c\x01\x5a\x92\x58\x70\x82\xae\x11\xe4\xf4\xdd\x24\xb0\x59\xb0\xe7\x25\x6b\x1a\x2a\x9a\xe9\x30\x6f\x44\x87\x12\xe4\x8e\xeb\x51\xfa\x00\x99\x0a\x26\x08\xc7\x13\xb5\x5b\xcd\xb3\x8e\x30\x0a\x44\xfa\x29\x1f\x36\x3c\x78\x58\xa1\x65\xac\x05\xee\xf5\x63\x76\xa2\x03\x56\xee\x89\x87\x04\x75\xfc\xc6\x80\x97\xd3\x13\xc0\x8e\x2f\x0d\xee\xaf\x35\x0c\x83\x5a\x94\x7b\x9e\x71\x1a\x35\x12\x9e\x23\x2f\xc6\x66\x49\x38\xdc\xcb\xbc\x45\x28\x52\x9f\x3c\x30\x49\x0d\xf3\xec\xc8\x1f\x45\x63\x4e\x6e\xcb\xfd\x68\xdb\x7e\x1b\x8f\xd3\xa4\xb5\xb3\xd5\x74\xc9\x2e\xcc\xae\x56\x36\x17\x04\x10\x25\xba\x0b\x2b\x1f\x04\x78\x3b\x8b\x8c\x19\x6e\x5c\x7d\x92\xff\x9d\xef\x76\xe7\x59\x76\x63\x64\xd4\x8e\x2d\x74\xe3\xf6\xfe\x53\xcc\xf1\xb4\xcd\x37\x61\xa9\x88\xbd\x1e\x47\x29\x36\xc7\xf0\x8b\x73\x37\xd0\x58\x2e\xc0\xa1\xd6\x26\xbc\x14\x96\xb5\x0a\xd6\x0e\xa1\x37\x57\x55\xb1\x55\xd7\x80\x22\x97\xe5\x3c\xe4\x35\x0e\xa9\x78\x08\x91\x94\x12\x64\x44\x61\xd1\xae\xed\xa5\x0c\xde\xb3\x86\x20\xf1\x0e\xbe\x0c\xe6\x02\x62\x4f\x6f\x2e\x9c\x3c\x60\xe7\x2e\x12\x08\x46\x00\xaf\x11\x07\xa4\xcd\xbd\xf9\x3f\x21\x0f\x8c\xf5\x64\xb8\xec\x03\x69\x60\xf2\x21\xdf\xe6\xb3\xbf\xd0\x3f\xfc\x6b\xfa\xc1\x14\x4b\x8e\x66\xeb\x83\xd3\xb1\xd0\x0c\x88\x6f\x22\x10\x19\x27\xd2\x19\x37\xa1\x10\xe1\x48\x08\x49\xa6\x8f\xd8\x1c\x5c\x78\xa0\x6a\xdb\x59\xf5\xc2\xbe\xae\xde\x9b\xad\x8d\xcb\x28\x04\x4d\x98\xd0\xb5\xc6\x36\x69\x2d\x02\x4d\xa5\x39\x45\xe1\x55\x5e\x37\x88\xce\xb7\xb6\x7b\x38\x53\x1e\x04\x2e\x5e\x7c\x8e\x0a\xb8\x7f\x82\x8c\x3f\x95\xcf\xe6\x54\xc7\x65\x37\x2e\x5b\x1c\xd5\x5d\x9d\x24\xbd\xf8\x3c\x6b\x7d\x1d\x5b\x43\x88\x3b\x7b\x2a\x21\x83\x5a\x67\x33\xb0\xf3\x1a\xa1\x2e\xbc\x8d\x0c\x48\x81\x8e\x87\x83\x51\x4b\x9b\xfb\xb4\x8e\xfa\xce\xf6\xcb\xda\x1c\xdf\x35\xdc\x6c\xdc\x45\x71\x66\x82\x67\x9c\x40\x83\xb9\x04\x23\x38\x2a\x9b\x2f\xba\x96\x56\xdf\x0b\xc5\xd1\xf0\x6c\x2e\x7c\x28\x83\xf1\x89\x0f\x4d\x90\xef\xac\x41\x9a\x51\x28\xb8\x90\x2f\xcd\xfc\x3b\x9e\x5f\xcb\xd8\x62\xf7\x58\xfe\x55\xf1\xda\xba\xad\x4c\x23\xdf\x2b\x7e\x9f\xaa\x56\xc5\xda\xd4\xaf\x56\xff\x5e\x19\x28\x75\xce\xa3\xec\x39\x94\x46\x71\xc7\x5c\xf1\x06\xbd\xa9\xea\x60\x06\x45\x0d\xeb\x4c\xc0\xbd\x1e\x96\xc3\x33\xbb\x77\xc6\x9e\x8e\x3f\x5a\x36\x95\x17\x4a\xa0\x15\xb7\x4f\x2f\xf8\xbc\x20\xb2\x34\x7c\x49\xd3\x5d\x5a\x2f\x68\x7a\x4e\x00\x4c\x39\x5a\xac\x78\x9b\x48\xb4\xde\x53\x80\x6c\xb7\xa5\xa8\x75\x0a\x06\x93\x84\x7b\xe9\xe6\x24\x04\x6e\xaa\x69\x92\xe0\x9b\xeb\xaf\x8c\x3c\xf0\xa6\xaa\xb6\x0d\x87\x2c\xc1\xaf\x70\xc8\x44\x10\x24\xf3\xb1\xfc\x08\xf3\xf0\xbe\xd7\xd2\xbf\xce\x76\x6f\xf0\xdc\x97\x83\x54\x73\xe2\x13\x13\xac\xc6\x8a\xf6\xd5\x3a\x57\x0a\xf6\xfa\xf6\x59\xbb\x8b\x63\xb9\xad\x2b\x3d\xcb\xcb\x6e\x58\x35\x60\x11\xcd\xbf\xae\xd6\xce\xbb\x80\xd9\xa6\xc6\x97\xcc\xe5\xd5\x33\x62\xbc\xe3\xf7\xd5\xf8\x0a\x10\xfe\xa6\x96\xe9\x5e\xe6\x6c\xb2\x5c\x4a\x98\xdd\x69\xd0\x25\x2c\xc6\x2b\x1b\x31\xdf\x07\xff\xf5\x10\x6a\x7d\xe0\x86\xea\x6d\xac\x4e\x4d\x8e\x86\x93\xa8\xc5\x2a\xff\x5f\x8f\xcb\x22\xc7\x41\x1d\xaa\x32\xc5\x7f\xc6\xb5\x94\x66\x07\x1c\x99\x99\xef\xdd\x5d\x49\x61\x22\x72\x0a\xeb\xb1\x7d\x84\xa4\xbb\xc0\x29\x48\x6a\x8e\xc4\x68\xec\x82\x81\x43\x4f\x5d\xf2\xc6\x28\xe6\x7c\x76\xd8\x2b\xc2\xbc\x5c\x1c\xd7\xeb\x8c\x4b\xc5\xf0\xfa\x00\x4a\x0f\x5e\x52\x7b\xe0\x11\x28\x3f\x78\xf4\x50\xc0\x98\x28\x20\x64\xe8\x69\x50\xe7\x3c\x14\xbf\x7d\x61\xdf\x95\xa8\x76\x59\x5e\x5b\x52\x1a\x3c\x83\x05\xa3\x7f\x79\x77\x0d\x6e\xf5\xac\x99\x12\x6e\x1b\x92\x07\x47\x05\xb0\x2d\x8a\x4a\xab\x37\x49\x7a\x2a\x6f\xd8\x5b\x37\x42\xec\x68\xaa\xb8\xec\xbc\xad\x53\x3c\xfb\xe7\xe7\xa0\x84\x6f\xb5\x9d\xb9\xeb\xab\x72\xe3\x3d\x51\x95\xcc\x53\x54\x87\x44\x89\xd7\x3a\xb4\x00\xcf\x94\x72\x98\x88\x66\xf9\x88\x7f\x8a\x7d\xa4\xce\xb5\xde\xdd\x5f\x53\x87\x74\xa1\x69\x8f\xd6\x7c\x53\xd8\xbc\x06\x51\xd2\x92\x4d\xd5\xf0\x31\x6e\xdf\xbd\xe9\x0f\x4b\x50\xca\xb4\xdf\x5f\x5b\x2f\x14\x94\x04\xbe\x9c\xbd\xe4\xbf\xcd\xf6\x7a\x68\x0e\x69\x6a\x8b\xdc\x2d\x56\xfa\x7b\xac\x98\x9f\x00\xf7\xb4\x49\xe8\xf9\x2c\x5c\x8c\x44\xec\x84\x81\xb0\x9c\x72\x7f\x47\x40\xa5\x7f\x24\x7f\xc7\x5e\xa3\x3f\x08\x80\xfa\xf1\x1f\xf6\xd8\x8b\xdf\x83\xc1\x59\x75\x96\xe8\x46\x2f\xc5\xd5\xd4\xf2\x6e\x1c\x40\x35\x40\x29\x96\x4f\x7b\x18\x15\x29\xd3\x42\xda\xa9\xec\xa2\xd9\x55\xad\x86\x6a\xc0\x63\x1e\xc4\xfc\x06\x98\x92\xa5\x6c\xf0\xf6\x37\xdc\x52\x3f\xb9\xfa\x7d\x8d\x29\x20\x31\x92\x4d\xb0\x3c\x14\xbf\x0b\xca\x91\x21\xa1\x84\x69\xc4\x15\x49\xc2\xda\xb1\xe7\xa3\xc4\x3f\x8c\x42\x38\x58\x17\x03\x8e\x9b\x63\x5a\x35\xf9\xea\x45\x2d\x87\x7b\x1c\x47\x9e\xa1\x63\x33\x91\x30\x5a\xc1\x51\x05\xf5\x55\xab\x6a\x2c\xa6\x95\xb8\x46\x4e\x7e\x49\xf5\x85\x2d\x38\x3b\xf4\xa1\xa3\x15\xda\xfa\x92\xca\x0a\x59\x9f\x15\x31\x4b\xe5\x5b\x7b\xef\x53\xca\x86\x81\x89\x77\xfa\x11\x87\x44\xf1\xec\x1d\xf6\x4b\x99\x9b\x86\xb8\x9b\xf3\x44\xc3\xfb\x59\xc9\x3f\x68\xd9\x2a\x98\x6c\x03\x4d\xa3\x27\xd0\xe9\x3e\x38\x5f\xe3\xcf\x74\xc0\x5e\x40\x7a\xe7\x62\x37\x55\x11\x31\xb0\xf0\xe2\x02\x9f\xb1\xec\x29\x26\x76\xbc\x5e\xbe\xaf\x36\x52\xcc\xe8\xc4\x44\xfb\xa2\x6c\x56\xb8\x8d\xfa\x0f\x0d\x31\x98\xf0\xbd\x14\x24\xc3\x21\x94\xac\x88\x07\x0d\x9c\x1d\xad\x71\x70\xca\xc6\xed\xd1\xeb\x4c\x85\x33\x5d\xeb\x05\x66\x74\xd2\x02\xc7\x86\x88\x83\x3a\x87\xd6\xea\x23\xfd\x8d\x57\xac\xe3\xa1\x15\x15\x96\xc8\x39\xb9\x2b\x5b\x1e\xa2\xb4\xb5\x2a\x2d\x9b\x2d\x9e\xbb\xf1\xbd\xbc\xae\x85\x3f\x4a\x0b\xf6\x3d\x45\x23\x76\xb8\x2e\xbe\xc1\xe9\x66\xe2\x18\x94\x40\x04\xb1\x3b\xd5\x6c\x0e\xb6\xaa\xb7\x09\xc3\xd6\x41\xa4\xec\xc3\x47\xb0\x90\x97\x70\x87\x50\x2d\x46\xc2\xa2\x25\x0d\x2e\xc6\xbf\x0f\xe9\x54\x7e\x3f\x38\xe0\x63\xab\x6f\x24\x42\x8f\x3a\x0a\xa6\xd6\xcc\x56\x9c\xa3\xed\x2d\xb2\x63\x5c\xd4\xf2\xe5\x1c\x16\x5c\x5e\x03\x82\xfe\x4c\xa6\xf5\x5a\x09\x60\xb4\xcd\x78\x1b\xf2\xfd\x01\xb4\xc0\xf6\xc1\xcc\xf4\x60\x83\xbc\xd7\xdc\x03\x1d\xff\xcd\x66\xac\xb6\x50\x06\xf6\xbb\xa4\x71\x5d\xef\x8b\xc3\x41\x97\xdc\x44\xb1\x87\xbf\xf6\x24\x26\x51\x63\x93\xe4\x2a\x54\x27\x03\xe7\x0e\x07\x7e\xe2\xe4\x34\x21\x22\x4c\x5a\x87\x26\x07\xb0\xed\xa5\xea\xd6\xfc\x8a\x49\xbf\xc5\x21\xa5\xb2\x0b\xfe\xf9\x90\x06\xa7\x6b\xfb\xe3\x48\x6d\x82\xef\x2e\xf8\x80\x53\x56\x6c\x8c\x3a\x33\xb6\x30\xfb\x5e\x8a\xc7\x6e\x9b\xd0\xb8\xcf\x19\x25\xce\xdc\x81\x77\x16\x1a\x6c\x9c\x59\xeb\x82\x30\x2c\x8e\xbd\x73\x3c\xdd\x33\x76\xb0\xc1\x60\xe5\x95\x53\xf5\xa9\x91\x83\x31\x78\xe2\xb4\x5a\x98\xba\xe2\x3b\x7d\x56\xd3\x86\x3a\xfd\x7e\xdd\x21\x62\xb0\x73\xe9\x50\x31\x72\x8a\xd5\x8f\xca\x9d\x7f\x2e\xdc\xde\x70\x53\xcb\xc5\x3f\x09\xe2\x7a\xf7\xef\x45\x9c\x74\xcb\x5c\x5d\x8f\x16\x8f\x54\x61\x09\x3f\xf7\x80\xe9\x07\x48\xb5\x92\x7f\xbd\x2f\x71\xe1\x62\xdb\xf8\xa4\x09\xa2\x59\x9c\x8a\x62\x11\x08\x12\x78\xa0\x22\xb0\x62\x78\x0e\x82\x2c\xa7\x36\x0d\xc0\xbf\xa8\x14\x75\xb3\x5f\x2a\x0c\xe0\xb4\x0d\x8b\x84\xdd\x6d\x25\x7e\xd1\x10\x07\xa2\xf6\x2d\xd9\x1a\x93\x7f\xab\x7a\x3c\xea\x0a\x2b\xdf\xec\xb5\xf6\xf5\xe5\xc2\x6b\x91\xf0\x89\x3d\x41\x31\x7b\xbc\x20\xa6\x9f\xc7\x61\xa6\x6d\x81\x91\xfb\x78\x68\x27\xdb\x6c\x4d\xbc\xdb\xc1\x8c\x4f\x8f\xbb\x7c\xbf\x86\x2a\x89\x2d\xb7\x3c\x8a\x16\x1a\xcb\xb2\x71\x77\x70\x94\x4d\x83\x32\x1c\x57\xdd\xfb\x85\xe3\xb6\x6f\xd1\x9b\xd7\x28\x72\x6c\x70\x03\x24\x9e\x56\xca\x45\xe8\x73\xd4\x63\xfb\x95\xfb\x93\x73\x80\xe6\xb9\xbc\x8c\x04\x65\x6b\xfc\x4a\x5b\xef\x30\x6c\x24\xce\xb2\x8f\x3e\xc0\x0f\x19\xd2\x2e\x56\x4c\x10\x07\x8d\x91\xb6\x80\x5e\x24\x90\x43\x4b\xa1\x46\xfa\x8c\x8f\x56\xab\xd1\xd3\x76\xa8\x92\xd2\xa9\x3c\x40\x5c\x39\x48\x49\x9d\xec\x10\x94\x84\x59\x04\x1b\x63\x4d\x9e\xec\x7d\x75\x71\x79\xbe\xe1\xd0\x59\xb4\x1b\xba\x96\x2f\xa2\xa8\x07\x09\x93\x78\x7d\x47\x86\x7a\x8c\x9d\xb3\x62\xb7\x38\x79\x94\x4d\xb1\xe4\x90\xf3\x49\xa7\xaf\x44\xf0\xb5\x77\x86\x39\x0e\x43\xb6\x23\xd4\x0e\xf4\x38\x78\xa6\x00\x76\x3b\xd7\x7a\x80\xd8\xbe\x27\x8f\xe1\x2e\x8c\x9b\xf1\xf0\xe0\x94\x89\xf0\x98\x6f\xcf\xab\xe1\x74\xf4\x41\xaf\x51\x53\x7f\xb0\x4d\x9e\x88\x26\xc4\x2e\x76\x21\x0b\xa2\x01\x7c\x93\xc2\xf0\xf3\xd1\xcd\x46\xbd\x5e\xa7\xc9\xf5\xc6\x74\xa3\x7b\x64\xd0\x51\xbb\x41\xdc\x4c\x9c\xa6\xd5\x5a\x76\xca\xcf\x2e\x52\x05\x60\x14\x8e\xb3\x4b\x7e\x63\xf1\xb9\x76\xee\x33\xd0\x32\x2f\x17\xfa\xf8\x0f\xb1\x17\x69\xd1\x6c\x13\xb8\x51\x3b\xa4\x08\xa4\x31\xae\x99\x2f\x9d\xec\xa4\x9d\x9f\x52\x00\x8d\xb7\x66\x07\x87\x3e\x7e\x08\x07\xe8\xe3\xda\xb9\x69\xdd\x5e\xfd\x5e\xb2\x40\xc3\x9b\xa5\x4d\x19\x1b\x41\x90\xcc\x96\x7d\x54\xac\x57\x29\x64\x31\x78\x01\x13\x6a\xf5\x57\x24\xd2\x67\xd8\x1e\xd9\x8b\xd4\x7b\xea\xdd\x36\x06\xd1\x90\x34\x8b\x4b\xba\xc3\xd8\x90\xe4\x12\xa8\x99\xf1\x6b\xdf\x66\xa4\xfc\x5e\xde\x7c\x61\xe7\x8e\x0a\x3a\xda\x21\xc8\xa2\xca\x8e\x41\xf4\xbf\x81\x6a\x52\xd6\xe5\x31\x71\x18\xdb\x9a\x77\xb2\x12\x15\x9a\x49\x0e\x4e\x06\x1b\x01\x7e\x25\x36\xf0\xf5\xb4\x17\xba\x69\x89\xa8\xae\xd0\xfb\xf8\xcb\x5c\x71\x33\x0e\x5c\xc0\xc4\x32\xa2\x74\x66\x04\x89\xb6\x83\x7d\xcb\x4f\x6d\xf2\x7c\x22\xa2\x9c\x7b\xd3\xaa\xdf\x49\x71\x6f\xe6\x8e\xbe\xda\x71\x79\x17\xc4\x97\xb9\x56\x5d\x16\xf3\xd1\xec\xf6\xa6\x70\xa6\xa0\xd3\x24\x78\x3a\x58\x8d\xf8\xa8\xac\xbe\x7e\xa4\x2e\xaf\xbb\x32\x78\x96\x05\xd7\x27\xec\x05\x38\xe8\x81\xbc\xf4\x40\xa5\xd9\x42\x6f\x90\x6d\xcd\x52\x01\x91\x0f\x27\x5b\x79\x1d\x85\x0e\xb4\x9a\xe8\xcf\x28\x0d\xd6\x65\xe1\x97\x0c\x84\x5a\xe8\xbb\x59\xa2\x36\x01\x35\x55\x2d\xc9\x79\x5a\xd6\xd5\x5e\x30\x3a\x78\xb2\xbd\x74\x44\xf1\x2c\xba\x12\x82\x9e\x21\xa2\x31\x88\xf1\xa9\x1b\xb0\xb4\xc7\x86\x10\xe1\xcc\x38\xbf\x0b\x89\x20\xc6\xf5\xd9\x37\xc8\x61\x3c\x4d\x6c\x37\xb1\xa5\x52\x99\xa7\x3e\x04\xc8\x8a\x3f\x5d\xa8\xb6\xce\xf9\xb4\xbb\xfd\xe7\x8b\x57\x2f\xcf\x92\x8f\xe7\x1f\x3e\x7c\x38\x47\x99\xf3\xae\x2e\x4c\x89\x41\x64\x67\xc9\x7f\x79\xf1\x9c\xd8\xfa\xe9\x72\xfa\xed\x34\x79\xc1\x7b\x2e\x10\xc5\xc4\xe4\x8a\x44\xa5\x4f\xf5\x67\xa9\x3a\x63\xf5\x28\x55\xd7\xdd\x22\xef\xbd\x4b\x7c\x55\x9e\xb5\x91\x05\xd3\xf5\x74\x86\xfe\xf2\x8e\xd1\x00\xac\x31\xcb\x9a\x3a\xf2\xc4\xec\x24\x06\x53\x90\x43\x5c\xc4\xf6\x44\x4c\xf1\x3e\x54\x4e\xad\x71\xa7\xa0\x32\xe5\x5d\x92\x6f\xab\x01\x94\x18\x82\x3e\x62\x03\x50\xaf\xac\x3d\x18\x1b\xea\x8c\xcf\x51\x04\x09\xd0\x39\x00\xc3\x81\x5d\xda\xfc\xd4\x07\xe7\xd8\x15\x55\x59\x1c\x6d\x88\x00\xc1\x29\x24\x5b\x9c\x62\x40\x13\x6e\x04\x29\xca\x2f\xbc\x81\xf6\x1d\xd9\x36\x6e\xf6\x67\x70\x8e\x36\x54\x96\x15\x90\xe8\xc8\x6a\x03\x4f\xe2\x5e\x15\x12\x2a\x9c\x78\x8c\x4f\x2d\x9e\x76\x14\xf5\x56\x3a\x04\x0b\xec\x0a\xc6\xf3\xf4\xa4\x65\x4b\xbf\x20\x90\x85\x46\x05\x1a\x0e\x3a\x30\x6d\x79\x32\xf0\x3c\xbe\x0e\x5c\x1a\x1a\x96\x51\x6b\x2e\x42\x5e\xb5\xcc\x3e\x0b\x2d\xbc\xb3\x33\x7f\xc7\x28\x5b\x90\x3d\x3b\x48\x56\x0b\x7e\x5b\x43\x56\x7f\x97\xe6\xd3\x10\x47\x0a\xef\x0a\xf2\xc8\x82\x7b\x98\x34\x1b\x4c\x16\x96\x6e\xf6\x9a\xfe\x19\x4c\x15\xaf\x35\xf7\x3f\x74\xa0\x74\xea\x2b\xcb\x61\x07\x34\x88\x5f\x8d\x14\xad\x69\x3f\x35\x08\x49\x94\xf2\xbb\xb9\x5b\xbe\x5c\xe9\xd1\x0f\xd9\xef\x4a\xe8\x7d\xe8\x40\x25\x21\x7c\x72\x9a\x58\x62\x06\xdd\x63\xa2\x17\x88\x34\x20\x65\x4c\xad\xfb\x21\x90\xfb\x44\xd5\x32\xad\x9e\xa8\xea\x06\x18\x40\x46\x4d\xfc\x25\xac\x7f\x5c\xb6\x54\x51\xc9\x36\xe0\x95\x3b\x5a\x34\x94\x3f\x96\xb2\x0f\x99\xfb\xc8\x39\x74\xc7\x6f\x90\x1e\x1d\xa3\x60\xea\x98\x83\x16\xca\x82\xe3\x02\x71\x9f\xa2\x99\x90\xed\xee\x0f\x81\xc0\x65\x36\x32\x5a\xbf\x00\x1c\x48\xdc\x39\x18\xfd\xb5\xaa\x54\x7d\x4c\xd0\x11\x95\xa4\x54\x2d\xf1\x35\x5f\x23\xba\x75\x3b\x20\x59\x59\xb5\x4b\xf3\x72\xf6\xa0\xda\xd1\xaa\x0e\x68\xd0\x26\x25\x22\x58\xcc\x9e\xa5\x65\x5a\x84\x13\xb5\x2f\xaa\xa3\x04\xa4\x7e\x50\xe7\xab\xd6\xb9\xb1\x35\xee\xe9\x8d\x70\x84\x1e\x3e\x1c\x5c\x36\x2c\x69\x46\x1b\x51\x79\x72\xb4\x21\x7d\x99\x93\xc9\x1a\x9d\xee\xb1\xae\x93\x78\x3c\x1f\xdb\x89\x2a\x11\x33\x31\xc4\x5c\xf7\x71\x3f\x11\x15\x58\x42\xd8\x4a\x85\xc1\xec\x71\x0c\xa2\x60\xa4\xa2\x96\x12\x89\x8e\x10\xd4\xbf\x88\x09\x76\x63\xb4\x77\xa1\xe2\x22\xb0\x8a\x1a\x1b\xe3\x30\x70\xb3\x83\x8a\x03\x4d\x8f\xcc\x83\x29\xd8\x42\xd9\x7a\xc4\xf4\x02\x4e\x87\xd5\xf8\xa8\xd3\x0f\xcb\xf1\x05\xb8\xd6\x58\x20\x5a\xd5\x30\xa8\xb4\xbd\xf0\x18\xad\x32\x08\x63\x12\x46\x99\x1e\x5f\x69\x2f\x80\x69\xd4\x51\x3a\x57\xf2\x45\xa7\xaf\x17\x5e\x87\x23\xd7\xca\x63\x2d\xcb\x17\x52\x97\xbc\x82\xf6\xb5\xc1\xa7\xed\x45\xb1\x18\xa7\xb0\xd2\xee\x33\x5a\x8a\xb1\xde\xf9\xe8\xef\x83\xbe\x8c\xf8\x18\x4c\xb2\x7c\xb5\x9a\x2e\xea\xea\x43\x83\x28\xce\x5d\xbd\x34\xb3\x7b\x84\xe6\x59\xc6\x02\xef\x16\xf2\xd1\xb6\xca\x04\x0c\x16\xeb\x84\x40\x36\xbe\x04\x9e\xae\x41\xb2\xd8\xc1\xcc\xc2\x57\x19\x39\x9d\xcd\x7e\xfb\xaf\xe2\xaf\x56\xe7\x3e\x32\xe0\x53\x60\xfa\x25\x6b\xe7\xe9\xb4\x2b\xf0\x22\x2a\x97\xe4\xc7\xc3\xf1\x8b\xe3\x53\xeb\xe3\xe1\x28\x9b\x5c\xb4\xb0\x6d\xa5\xf3\x2c\x00\x6c\xf6\x05\x31\xf3\x88\x73\x04\xd5\x0c\xcd\xe8\x2f\xc7\x20\xb7\x2b\xf1\x98\x42\x26\xf9\x3f\x97\xf2\x72\x57\x00\x83\x06\xd4\x81\xc7\x6a\x60\x61\x7c\xf9\x5b\x68\x85\xed\x95\xb3\xc0\x5d\x0b\xc7\xf1\xf9\x0b\x56\xbd\x78\x00\x48\xd8\x01\x40\xa0\xda\x4c\x7d\x35\x3a\xeb\x44\x15\xef\x3d\x7d\x29\x1f\x1c\xa6\x89\xdd\x6f\xe5\xa5\xf4\xbc\x90\x74\x7d\x74\x66\xbf\x67\x1e\x3c\xe3\x47\x2a\xb7\xd4\x2a\xbc\xad\x64\x3d\x79\x4b\x2a\xce\x73\x3c\xaf\xc0\xf6\xb5\x8c\x83\x4f\x49\x95\x88\x51\x45\x9c\xfb\x51\x0d\xce\xa9\xbd\xc6\x46\xbd\x84\xd8\x83\xa0\x07\x12\x21\xc4\xd6\x23\x36\x81\xd0\x4b\x5b\xb8\x30\x66\xc6\xc4\x46\xd9\x9a\xf6\xa3\x6d\xd9\x74\x89\x88\xc6\xbf\x25\x6a\x40\x2f\x9f\xaa\x59\xb5\xb3\x9f\xdb\x2d\xe4\x4d\x9b\x48\x03\xb6\x65\x20\x26\x36\x71\x11\x5a\xb6\x05\xbb\x20\xa6\x0b\x8e\x05\x2a\xa9\x6c\x0e\x69\x79\x24\x97\x9a\x42\xea\x9d\xf9\x45\x09\x54\xed\x3e\x7c\x05\xae\x6a\x6f\xba\xf8\x1f\xbc\x9b\xfb\x4d\xf2\xee\x90\x87\x80\x9f\xd9\x7d\x11\x0e\xd1\x1b\x59\xbe\xe6\x47\x9b\xd8\x80\x8d\xeb\xf0\x7a\x08\xa2\xce\xb5\x5a\xd7\x65\xdd\xb6\x95\x67\xa9\x7d\xe7\x83\x3a\x2c\x4b\x94\x66\xae\x9b\x0d\xde\x44\x61\xe9\x49\x02\xc8\xa6\xe1\x55\x36\x57\x2f\x66\x76\x7a\x2d\xb1\xd1\xeb\x68\xb1\xd2\x63\x4e\xc4\xb6\x45\x28\xa9\x41\xbd\x89\xbf\xd5\xf0\xc2\x36\x87\x25\x21\x3c\x4a\x16\x41\xf7\x23\xab\x2e\x60\xb6\xc4\x6f\x0a\x80\x45\xb6\x17\x87\xce\x2b\xa7\x3c\x0a\xeb\x0c\x45\xd2\xde\xce\x46\xd0\x7e\x70\x56\xd9\xb4\xe1\xf9\x64\x73\x02\x9b\xab\x10\x3d\x78\x47\xf7\x23\x9a\x39\x00\x08\x66\x10\x28\x38\xa0\x40\x0d\x45\xeb\x10\xb3\x06\x91\xe8\xed\x14\xc6\x2b\x1f\x14\xb0\xd3\x90\xf7\x0c\x80\xf6\x66\x9b\xaa\x8b\x9f\x47\x1d\x1b\x59\xb7\xb6\xcb\x0d\x52\x4c\xe8\x59\xf9\xbe\xc4\x36\xb3\xae\x41\xcc\x18\x33\xe0\x16\x8f\x7a\x3b\x86\x4d\x13\x65\xdb\x88\x6d\x62\x6f\xf3\x30\x2e\xd9\xed\xe3\xec\x83\xfb\xdb\x4e\xb8\x51\x0b\x16\xdf\xa0\x8d\xc1\xb2\x25\x1d\xa7\x87\x96\xb5\x7d\x90\x6b\xce\x47\x9d\x96\x91\x23\x91\xb6\x5f\x63\xdf\x12\x82\xea\x08\xc8\x33\x7e\xf8\x0d\x9a\x73\x31\xfc\xb9\x72\x33\x72\x43\xd4\xc7\xfa\xd8\x8e\x91\x03\x69\x6b\xcf\xc4\x66\x82\xdf\x41\x00\xf6\xf6\xde\x4f\xed\xd5\xa2\xe6\xe0\x61\x00\x8c\xd8\xfc\xbb\xf5\x85\xac\x4b\x1d\x49\x22\xa6\xb6\x52\x13\x71\xb1\x93\x5f\xab\x7a\xfd\xd6\x3f\xa9\xaa\xd7\x04\x83\xe7\x54\x19\xc2\x3d\x74\x36\x06\x86\x40\xe1\xe1\xfb\x67\x69\xf2\xd2\x96\x0b\xa3\x86\xdf\xab\x7b\xaf\x21\x8a\x6b\x74\xdd\x8a\x43\x71\xc1\xdc\x2d\x6d\xbf\x35\x16\x09\xb7\xdd\x2a\x1a\xe3\x49\x47\x31\xbd\x0d\x4b\x4b\xd4\x49\x6b\xc6\xf9\xb3\xf7\xa3\xdf\x9b\x6a\x8f\xc7\xf5\x98\x0d\x86\x03\x69\x89\x97\x2b\x88\xc3\xd8\x19\x18\xbc\xdc\x7b\xdf\x65\x74\xfa\x27\x2f\xa1\xa5\x2f\xf9\x55\xd8\x46\x9e\x96\x26\x58\x0e\xc9\xa6\xd7\x13\xcd\x4c\xae\x1f\x76\xa9\x4d\x8f\x5e\x38\x1c\x0b\xfc\x1d\xc6\xe1\x44\xc5\xde\x62\x78\x8d\x06\x78\x46\x06\xae\x02\xee\x5d\xda\xe0\x81\x6b\x4e\x3b\x0d\xd9\x8b\xa2\xed\xac\x92\x04\xd5\x85\xb5\xb5\x64\xbf\x74\x2f\x59\x96\xa9\x74\x03\xcc\x55\xe0\x26\x86\x5b\x76\xd7\x9e\xa3\x32\x4c\xc4\xcb\xac\x70\xc6\x2c\x52\xb4\xda\xfd\x24\xc0\x51\x54\x5b\x44\x67\xce\x0b\x58\x1a\x41\x7d\x52\xdb\xe0\x81\x90\x19\xc3\xc2\x1b\x44\xa1\x1f\x09\x6c\x3c\xf6\x82\xef\xf0\x2d\xc6\xcf\x06\x33\x1e\xab\xe6\x74\x54\xe3\x13\x16\xa8\x5f\x66\xe2\x7b\xed\xbb\x7f\xa1\xda\xba\xf7\x00\xa0\xcb\xea\xbd\x04\xf8\x9f\xb0\x19\x8d\x4b\x38\x92\x14\x4d\x46\x5c\xb6\x4c\xaf\xd1\x13\xa8\x09\x2a\x61\xea\xd0\x02\x55\xb8\xef\x7f\xcd\x0a\xb5\x8a\xe8\xc5\x50\xf3\xd1\x7b\xad\xae\x4f\x5e\x24\xfb\xcb\xaf\xd2\xfb\x36\x2c\x11\xe5\xe8\x2b\x45\xec\x8b\x0d\xbd\xe0\x99\xd7\x96\xd1\x89\xe9\xdf\x8a\xc6\xb6\xed\xfd\xc7\x24\x20\x61\xad\x59\xef\x3b\x6a\x7e\xc1\x6f\xc2\xb1\x09\x86\xec\xe4\x6f\x4e\xdd\xca\x8f\xbc\x31\x11\x1e\x8b\xfd\xbe\x82\xec\x08\xdb\x13\x76\xd7\x16\x31\xc3\xc1\x39\x3a\x35\xf2\x84\xed\xbf\xf0\xf2\xc4\xd8\x75\x6b\xa0\x2b\xb1\x2a\x28\xbd\x47\xb1\x2a\x76\xa6\x60\x81\x1a\xd6\xdb\xd3\xf9\x19\x93\x2b\xad\xe1\x72\xe1\xb9\x1c\x21\xe2\x53\xfd\xbb\xc9\xf7\xf3\xc1\xbb\x12\x1b\xf5\x44\x0b\x1e\xf4\xfd\xde\x15\x14\xde\x51\x18\xa1\x6d\x2f\xd5\x92\x49\xd8\xde\xe0\x91\x3b\xc2\x4e\x0f\xc1\x9f\x78\xdd\x75\x2c\x39\x2e\x19\xd7\x2d\x7f\xe7\x75\x55\x70\xd4\x34\xf4\x08\x4e\xa3\xbe\x4b\x51\x40\x88\xb8\x94\x16\x70\xa9\x62\x45\xe0\x9e\xb8\xb2\xc9\xc4\x12\x1c\xa0\xaf\xc6\x99\xe0\x12\xf5\x84\x1c\x09\xe1\x49\x27\x97\xde\xc1\xe7\x24\xa2\x7c\xdf\x2f\x51\x56\x1f\xe4\x3c\xcd\xcb\x89\x9c\xa4\x53\x3c\x0b\x3c\x7b\x2c\x0f\x8e\x69\x92\xb4\x89\xb4\xae\xd6\x24\xf0\x40\x36\x02\x2d\x6e\xb9\xad\x22\x62\x98\x1d\x47\x8e\x47\xf6\xf0\xf9\x1d\x88\x8e\x62\x40\xa9\x71\xb1\x9b\xc6\x46\x51\x97\xfa\xa2\x88\xb7\xcc\xcc\xf7\x1a\x0c\x01\xbe\xa4\x45\x68\xe3\x52\xeb\x7c\xe5\x99\x02\xe8\x96\x5a\xbe\x07\x4e\xad\x4a\xa5\x41\x58\x42\x69\x84\x2d\x17\x6d\x2f\xd8\xdf\xa3\xd7\x8b\x10\xe0\x4b\x7a\xc1\x0d\xb1\x83\xbc\x36\xc7\x2f\x49\x86\x1d\x3a\x93\x1e\x85\xd1\x70\x9d\xbd\xc4\x48\x0f\x6d\x60\xf2\xa0\x51\xd1\x0a\xf6\xe3\x94\x0b\xf8\xa9\x23\x54\x72\x19\x59\x9b\x01\xa3\x20\xd8\x7b\xf2\x05\xa8\xcf\x6c\x78\x8e\x44\x90\x06\x74\xe1\xb4\x35\x68\x2f\x8e\x65\xff\x00\x92\x4e\x5a\x56\xef\x92\xbe\x3c\xbb\x27\x79\x5f\x7c\x16\x0b\xb8\x8d\xc5\x0c\xbe\xcf\x69\xf8\xdc\x44\xba\x25\xce\x18\xc2\x9a\xc0\x04\xdb\xad\x75\x5d\x18\x56\xa8\xe4\xbb\x27\xd9\x04\xf5\x86\xb0\x3c\xcd\x0f\x03\x2f\x64\xbb\x96\x8e\x5e\x6f\x39\xfc\x82\x8e\x96\xb6\xb6\x3e\x88\x1f\x59\x2f\xf5\xd6\x85\xf7\x98\xb7\x98\x1e\x13\x8f\x86\x3d\xf1\x86\x0b\x5c\x7f\x8b\x1b\x60\xb1\x56\x0a\xf6\x79\x1f\x41\x5e\x84\x4f\xb4\x07\xbd\x5f\x07\xb7\x72\x7d\x6d\xb8\x5b\xeb\xef\x83\x71\xf1\x23\x0e\x31\x69\x90\x81\x36\xc1\x75\x42\xb8\xff\xff\x95\x9e\x0c\x42\x66\x9f\xec\x8a\xd0\x0c\x71\xdb\x64\x79\xc7\x05\xed\x74\xcb\x3f\xd6\x35\x21\x0a\xff\x4a\xd7\xbe\x64\x6f\x5c\xd3\xc9\xb3\x7e\x0f\x55\x48\x3b\x45\x49\x4e\x0d\x20\x92\x9a\x80\x09\xee\x9e\xce\x52\x11\xb6\x57\x63\x71\x6e\x60\xaf\xe6\x2a\x9b\x4e\xfb\x3b\xc8\xd5\x7b\xec\xef\xa2\x5e\x03\x6a\x50\xc7\xce\x0b\xf6\x3c\xf4\x75\x95\x44\x0e\x38\x7a\x70\xa9\xaf\x1f\x04\xa6\xf2\x99\x18\x8c\xb3\xb3\x50\x34\x74\x1f\x08\x38\xf4\x1e\xd3\xf7\x3b\x4d\xeb\x5f\xde\xff\x95\x17\xe1\xed\x24\x4b\x9b\xcd\xa2\x4a\xeb\x8c\x69\x65\xcd\xae\xae\x7b\x62\x99\x8a\x09\xae\xd5\x1b\x7f\xa7\x6e\x26\x42\xa8\xfe\xa6\x6f\xb8\xf7\x1e\x6c\xff\x82\x47\xf6\xbb\x76\x83\x38\x79\x2a\x5f\xdc\xed\x30\x32\x75\x79\xe3\x48\xae\xc4\x48\x4a\x60\x8a\x7c\xdd\xc9\x3d\xdb\x44\x8d\x68\x89\x2b\x82\xd7\x4d\x7a\xf0\xe0\xbb\xaa\x44\x6b\x62\x6a\x6a\x5f\xc2\x08\xdc\x6c\x1f\x89\x73\xad\xbc\x29\xa9\x6e\xb5\xf8\x6e\x2b\xea\xcf\xec\x12\xff\x22\x7a\x6d\x36\xf1\x33\xc0\x7a\x6f\x28\xd2\x97\xb3\x40\xa5\xee\x72\x9d\xf5\x0d\x8d\xdd\x1b\xe2\x84\xc5\xb9\x93\xac\x9e\xef\x6c\x97\xe5\x63\xac\x0d\xf1\x91\x85\xed\x09\x5b\x1d\x23\x00\x4f\x19\xd8\xc8\xd0\x6e\x59\xb0\x5e\x76\xf1\x63\xe4\x8c\xe0\x53\xa3\x73\xa3\x0e\x73\xac\x7b\x0d\x6e\x38\xd2\x28\xc7\x22\x60\x98\x06\x9b\xf4\xb8\xbc\x3e\x1a\x52\x45\x89\x2c\x74\xf3\xdc\x87\xa9\x96\x51\x88\x2b\xf0\xf6\xd3\x3e\x2d\xb2\xa4\x0e\xda\x8a\x1e\xb4\xec\xf5\xb5\x78\x6f\xad\x00\xa2\x22\xea\x38\x13\xf7\x44\xb4\x55\x61\x4a\x5e\x42\x37\xcc\x57\x62\x7c\x67\x13\x8f\xc7\x33\xf7\x61\xaa\xf7\xf2\x0f\x53\x5d\xd0\xaf\x68\x40\x35\x5e\x77\xd7\x6b\x9b\x30\x03\x5b\x38\xfc\x0e\x5c\xaa\x9b\xd1\x02\xc4\xfa\xa7\xeb\xaa\x9e\x8e\x21\x9b\x08\xf3\x0e\xe1\x44\xf1\x35\x06\xd7\x7c\xc8\xf9\x19\x98\xa3\x5c\x9a\x8d\xc2\xd4\x5d\x39\x7b\x06\x7b\x67\x9f\x89\xb0\x0e\x08\x2f\xc2\x4f\x7f\x56\xfc\x98\x92\x84\xd3\xad\x16\x24\xc3\xd0\xc9\xf4\x8a\x36\xea\xe6\xdc\x59\x70\x5c\x57\xd2\x1d\xab\x6c\xea\x3e\x5e\x81\xd7\x44\x06\x55\xe9\xd1\x4c\x4c\x22\x2c\x20\x52\x2f\x47\x36\xb3\xe8\x81\x53\xb5\x44\x73\x6f\xa7\x7e\x49\x0d\x61\xa7\x12\x9f\x9f\xd8\xfc\x04\x4f\x4f\x24\xb8\xe9\x4d\xa4\x92\x2c\xd1\x12\xe0\x02\x8f\xd3\x61\x23\x7c\x20\xe0\x68\xc8\x0f\x86\x2d\x9f\x0d\xaa\xe3\xfb\xcb\x80\xe3\xb6\x00\x9f\x29\x1f\x75\x6f\xb4\x82\xaf\xef\x20\x1f\xc8\xe5\x5a\x0e\xa2\xd1\x0e\x1e\xe9\xe7\xb2\xaa\xb3\x26\x69\x37\x29\xb1\xe1\x55\xd3\xb2\x11\x22\xdf\x7e\x7d\xa6\xc2\xf1\x1e\x5f\x5b\xe3\x57\x0c\x81\x10\x63\xbe\x5e\xda\xae\x57\x09\xed\xf2\x05\x51\xef\x04\x26\xdf\x66\x29\xc6\x74\x65\x34\x51\x27\x0a\x9f\x9e\x58\xee\x4c\x46\x44\x73\xac\xf2\x53\xfd\xaa\x0d\xbb\x6f\x23\xee\x6c\xd3\x6c\xd8\x34\xe1\x8d\x61\xee\x2c\xb9\x35\xa5\x94\x3b\x12\x6f\x3c\xff\x9b\xe1\x3b\x7a\x0e\x25\x5f\x98\xe4\xf6\x32\xe5\xdb\xe6\xef\x13\x3a\xce\xcf\xc5\xd2\x90\x72\x93\x0f\xfc\x60\x87\xe1\x79\xfa\xf6\xda\x66\xa2\x71\x88\x90\x2f\x55\xf8\x39\xad\xb9\x23\x88\x97\xf7\x05\xbd\x0f\xcc\x74\xfc\x10\x80\x1c\x92\x91\xb0\x0d\x6f\xb5\x8a\xa7\xec\x36\x9e\x5a\xa3\x55\xfb\x40\x27\x78\xb2\xec\x88\x44\xee\x12\x39\xb0\x13\x3c\xfc\x95\xe4\x4d\xa2\xcf\x0a\x9c\x18\x4c\xd8\xea\xc9\x95\xb9\x15\xf5\xe1\xeb\xc6\x87\x47\x0c\x7b\x88\xff\x86\x13\xe9\x74\xa1\x45\xf9\xd7\xd0\x7f\xac\xda\xff\x1c\xfa\xd7\x41\x9f\xfa\x9b\x20\xe4\x12\x58\xb3\x4c\xb3\xd6\xe6\x44\xfd\x2f\xe4\xe5\xb6\x06\x27\x49\x9b\x67\x21\x0d\xee\xf0\xc2\x21\x21\x7d\x55\x57\x84\x67\xa5\x99\xdd\x97\x94\xe4\xb1\x4d\x69\x46\xc0\x49\xc6\xc3\x8b\x19\x1d\x87\x04\xb1\x25\x5e\x70\x62\xf2\x33\x12\x83\x32\xcc\x30\xd9\x12\xd0\x68\x2f\xf9\x5e\x83\x39\x28\x5b\xe6\xae\x4d\x0e\xca\x69\x89\x6a\xd1\xa6\x1c\xd4\x41\x41\x5f\xe9\x77\x00\xb9\xaf\xd8\xd1\x7c\x5e\x54\x38\x50\xe7\x18\x72\x33\x7b\x2d\x89\xc9\x73\x4e\x4c\x2e\x91\x38\xac\xdd\xf6\x47\x0b\xf5\xba\x73\xaa\xd4\xaa\x36\xbd\x12\x8f\x28\x65\x00\x6d\x67\x6b\x63\xd2\x7d\x6f\xae\x9e\x50\xd2\x60\xa6\x18\xae\x3f\x6c\x86\x3c\x3d\xf6\xb0\x4c\x4e\xf2\x4e\x04\xff\x94\x12\x4e\xc1\xb2\x5d\x52\x0c\x5d\x52\x8f\x4e\xc1\xeb\x9d\x5b\xdc\x9f\x37\x9a\xd8\x2f\x53\x2d\xde\x13\x35\x6c\x04\xf6\x95\x7c\x04\x30\x8b\xaa\x6a\x21\xbc\xed\xc1\xea\xb2\xfd\x2d\xa6\xe6\x9e\x4d\x85\x3d\xca\x72\x3b\x98\x1d\x81\xed\x4f\x8f\xc0\x9e\x9e\x9f\x1d\x1e\x56\x9c\x43\x30\x59\xb6\x1d\xd1\x13\x6d\xec\xc5\x05\x1e\x64\xbc\x70\xc9\x83\xd6\x06\xe5\x3c\x1e\xf6\x8b\x8e\xb5\xba\x4c\x97\x1b\x33\xd2\xec\x7d\xa4\x5f\xdb\xee\xa0\xa4\x6f\x78\x50\x78\x6c\x2f\xd4\xd5\x0a\x2f\xb1\xac\xe7\x8b\x0e\x1e\x3e\x70\x71\xdf\xcc\xd9\xb0\xc3\xd7\xf4\xda\x02\x25\xf7\x18\x28\x79\x42\x40\xc9\x25\x80\xc6\xea\xa4\x13\x91\xe4\xdf\x94\x4d\x8f\x5c\x1d\x8f\xef\xd3\xac\x4b\xe2\x58\x99\x8a\x64\x35\x44\x2c\x61\x89\x46\x77\x19\x38\x48\x57\xfe\x15\x00\x12\x11\x72\xec\x86\xc3\xf9\x39\x52\x17\x82\x69\xcb\xb1\xbc\x3c\x2e\x11\x73\x01\x0f\x68\x52\xfb\x6f\xe4\x3b\x80\x64\x61\x8d\x20\x99\xea\x5d\xe6\xd9\xbe\x2b\xb7\xaa\x08\xb7\xef\xec\x37\xb8\x57\xd8\x37\xe9\x8e\xe3\xb0\xf4\xc9\x94\x2b\xcb\xd4\x89\x68\xa5\x14\xde\xa7\x10\x66\x93\x43\x9e\x7d\xbe\x3c\xc3\xfe\x0b\x15\xd8\xbe\x4b\xf9\x0b\xed\x2e\xbe\xae\x2d\xa6\x3d\x66\xed\xaf\x07\x20\x01\x11\xa6\x64\x22\x83\x8b\x87\x9a\xbe\xb2\xcf\xb2\xf9\xec\x35\xfe\x95\xae\xb9\xc8\x14\x50\xbc\x79\x49\x51\x8b\xe2\xc2\xd7\xde\xc9\xd8\x3b\x5f\xf7\x0e\xb9\x82\x40\xc0\xe0\x7b\x71\xf9\xb6\x1c\x72\xe6\x82\x3a\x64\x36\xc7\x07\x04\x72\xda\x1b\xcd\x92\x13\x77\x54\xee\x17\x00\x8d\xa9\xaf\xc1\xf4\x35\x91\x0d\xdd\x6b\xb3\xe6\x37\x92\xd8\x63\x76\x75\xb4\xde\x4b\x92\xac\xcf\xb6\x72\x96\x7d\x68\x5d\x3c\xb2\xc7\x46\xea\x2d\x9b\xdd\xab\xe9\xce\x08\x52\x43\xc5\x4d\x15\x3c\x0e\xc2\xac\xe3\x63\x19\x46\x0c\xfe\x22\xf5\x84\xc8\x8f\x16\x8c\x1f\x3c\x9d\x3d\xc7\x1b\xa7\x61\x41\x1a\x6d\xae\xe2\x5a\xe4\x88\xa0\x37\xde\x61\x7d\x5a\x0c\x7e\x3d\x1f\x88\x69\xb0\x2a\xf5\xe7\xf6\x46\x5c\x1c\x64\xc2\x78\x92\x9f\x5a\x49\x67\xdf\xfd\xca\xdd\x77\xe2\xee\x59\x71\x44\x18\x2c\xa1\x1f\x26\x78\x91\x94\x26\x41\x13\xcb\xe1\xb5\xa4\x9f\x0b\xff\x5c\xbd\xb5\x8c\x09\x71\x64\x97\x7e\xd4\xf7\x3b\xed\xcb\xc1\x8f\xf9\x91\x60\x1b\x3c\x04\x9b\xc5\xbe\x13\xec\x94\x5c\x27\x8a\x8a\x9e\xf0\xf6\x05\xbb\xe3\xf2\x5a\x9e\x7f\xe7\x87\x1a\x98\x0c\x94\xc9\xba\xa8\x16\x50\x0e\x34\xee\xed\x68\x79\x99\xf8\x5b\xad\x1b\x4f\x70\x39\x6c\x0d\x5f\xa1\xc7\xc5\x3a\x8b\x8a\xad\x9d\xea\xba\xda\xe4\x0b\x1a\x26\xaf\xd2\x00\x16\xcd\x6f\x72\x9e\x50\x1b\xbf\x0e\xd3\xae\x01\xcb\x83\xd6\x78\x07\x84\xa5\x3f\x13\xf9\xc1\x22\x08\x2c\x01\xe0\x99\xc4\x1c\xf0\xa0\x02\x7b\xfd\x0f\xf7\x3c\xff\xa4\x8a\x77\x17\x8b\x6a\x91\x77\x79\xe5\xd9\xdd\xcf\xd6\xd4\x7b\xc4\xb7\xbf\x38\x31\xd6\x84\x2e\x53\x1e\x6f\x14\xf4\xf4\x95\xb4\xeb\x81\xdd\xd5\xe8\x04\x5c\xc5\x6d\x58\x96\x70\xae\xa1\x07\x0e\xe3\xcc\x52\x67\x39\xbe\x18\xc4\xb1\xd0\x57\xe2\x0c\x3a\x4e\x8d\x14\xe9\x5e\x3d\x94\x77\x83\xad\x73\xb8\xc6\xab\x60\xf7\xf1\xd2\x3a\xbe\x35\x7a\x1b\xd0\xb8\x9d\x21\xdd\x41\xa8\x18\xd8\xeb\xf4\x27\x2c\xec\xcb\x2e\xd4\x5d\x47\x1d\xeb\xc7\xc2\xf0\x7d\x53\xe7\x36\xeb\x19\x33\xbc\xd4\x77\x5e\x79\xbe\x47\x03\x33\x2d\xde\xa5\x23\x46\x5a\x50\xb9\x8a\x0f\xf4\x17\x51\xff\xc8\x2e\x80\x8b\x7a\xda\xce\x9f\x62\x53\x04\x55\xb7\x7c\xdb\x4b\xa6\x17\xee\x82\x49\xf4\xb8\x4c\xce\xbf\xac\x4d\x87\x50\x52\x30\xba\x08\x96\x24\xdf\x07\xf9\xee\x5d\x43\x4b\xa2\x3c\x71\xde\xcc\x7e\x61\x65\xa4\x26\xe2\xad\x62\xf7\xba\x79\x65\x53\xfb\xcf\xe4\xb2\x62\x59\x69\xf0\x97\x1d\x92\x11\x29\x96\xd2\x08\x40\x1b\x28\xeb\xcb\x63\xa2\x24\x5f\xb3\xdd\x18\xe4\xdb\x3d\x4d\x23\x9f\x86\x5f\x53\xd3\x03\x53\xd3\x46\x0c\xc0\x82\x8e\x72\x05\xf1\x19\xd3\xba\xea\x18\x42\x0e\x92\x08\xa2\xf4\x1d\x68\x0c\x49\x27\x79\x7b\xc4\xd6\x6d\xab\x65\x55\xcc\x2e\xd8\x4b\x99\x88\x4e\xc3\x49\x08\x56\xa0\xb0\xb1\xb3\x89\xa4\x6d\x48\x40\x85\xe1\x6a\x6d\x7b\x05\x32\x41\x42\x57\xdd\xea\x37\x6b\xf5\xb2\x72\x76\x8f\xfe\x26\x0f\x5e\x86\xa9\xf6\xd8\x92\xbc\xd7\xfa\x35\x06\x61\x0f\xb6\xbf\xd0\x49\x48\x03\xf8\x3e\xb9\xdc\xe4\x4d\x62\x73\xa1\x35\x80\x05\x36\xfb\x4a\x22\x70\x15\x2e\xf7\x88\x37\x9c\x26\x0f\xaa\x84\x4e\xfc\xa4\x03\x11\x4b\x36\x44\x4a\xd9\x94\x81\x28\xd4\x9a\x60\x95\x02\x4d\xed\x3c\x83\x39\xe2\xf0\xf5\x3f\x83\x45\xbb\xe0\x4b\x9b\xe4\x1e\x25\x84\x00\x34\x12\xce\x76\x23\x21\xe2\xc8\x9e\x00\xc6\xbb\x0f\xfe\xac\x3f\x12\x97\x77\x12\x36\xba\x0f\x7a\x0e\x33\x82\x84\xdf\xbd\xa4\x73\x9b\x7b\x8d\xc7\x30\xce\x11\xde\xa5\xaa\x77\xc9\x2a\x37\x45\x86\x07\x8e\x3a\x7e\x68\x3c\x61\x56\x12\xb5\x4c\x07\xf5\x8b\xe5\x16\x6e\x31\x92\xcf\xf4\xa4\xe9\xa4\xd3\x17\xdd\xe7\xfa\x4c\x8b\x5f\xcc\x1e\xe2\xdf\xd3\x40\x0d\x04\x4a\x2c\xdd\xec\x91\x69\xe1\x0f\xef\x32\xb0\x34\x8a\x03\x09\x5b\x23\x7f\xb4\x18\x22\xc1\x49\x65\x5a\x1f\xf1\x6f\x5b\x2b\x5f\x0c\x6a\x36\x73\x8b\x71\xfe\x0e\xe7\xe8\xbc\x49\x67\x2f\x9a\xe4\x6e\x96\x5c\xdc\xb5\x38\xbd\x6b\xf7\xf2\x9c\xff\xc5\x8b\xcb\xd7\xc9\xdd\xe8\xbe\x28\xa1\xdd\x66\x02\x40\x46\x60\x86\x7b\x42\xbf\x82\x0c\x46\x64\xce\x08\xb0\xd9\x86\x8f\x90\xad\xc0\xba\x1b\x7c\x13\xa2\xf1\xf7\x38\x94\x63\xcb\x78\x7d\xf3\xd6\x2f\x31\x90\x93\x04\x38\x9a\xa3\x25\x38\x96\x63\xa2\x25\xa6\xc9\x8b\xae\x68\xf3\x7d\x61\x6c\x4a\xd2\x6c\xaa\xae\xc0\x1b\xb3\x24\xc1\x70\x80\x5e\x6a\x75\x71\x4c\xf8\x1d\xf4\xe4\xd6\xd9\xad\x69\x44\x42\xe6\x2d\x5e\x09\xe4\x9f\xc9\xe5\xf3\x8b\xe4\x61\xb9\xac\x8f\x6c\xee\x67\x47\xb8\xcd\xf7\x00\x9a\xc3\x03\x4e\x98\xe5\x3d\x43\xfe\xc2\xdf\x76\x33\xe3\x8a\xdb\xd4\x07\xc4\x3b\x65\x2c\x79\x7d\xf7\x45\x72\x21\x09\x30\x81\x35\x71\xa3\x1c\xe7\xdc\xb2\xe1\xb6\x79\x9a\xfe\x8a\x44\xb4\xb5\xf0\x35\xbe\x07\x34\x3c\x3a\x42\xe8\x1f\x5b\x07\x18\xe9\x87\xf4\x4f\x7f\xc1\x2e\xc4\x3c\xc1\xce\xad\xe3\xd3\x98\x06\xc4\x97\x81\xa0\x04\x0e\xc0\x53\x64\xcf\xcf\x9b\x0f\xfd\x12\xca\xd7\x37\xa2\x56\x4b\xb3\x6c\xa0\x4e\x0b\xc9\xb0\x57\xda\xc5\xb5\xa8\x09\x85\xaf\x48\xa9\xf6\x35\x55\x11\x41\x67\x1d\xe5\xb5\xa3\x55\x2b\x3f\x55\xbd\xf3\x88\x63\xf8\x08\x6e\x2e\x47\x82\xc4\xca\x8a\xab\x7d\xa0\xac\xc2\x08\x3c\xb3\xd1\x27\x26\x73\x5d\xb1\x03\x6a\x05\xbc\x53\x8d\x3b\x31\x2d\x55\x72\xac\xba\xe4\x43\x8a\x58\x48\x15\xef\xe6\xbc\xec\xcc\x4f\x16\xb5\x98\x4f\xca\xd5\xe1\xed\x44\xc5\x8d\x3c\x2a\xda\x08\x16\xc3\x74\x99\xc9\x59\x73\x46\xf4\x1b\xba\x24\x6d\x8d\x58\x91\x44\x23\xbd\x25\x54\x45\xa3\x50\x68\x36\x2d\x59\xb7\x90\x30\x23\x9e\xe0\x1c\x4c\xf8\xda\x76\x1a\x0e\x31\x64\x8e\x7a\x33\xe2\x96\x6a\xec\x26\x81\x1f\xec\x87\x5a\xda\x6a\x50\xf5\x56\x59\x34\xa8\xc9\xfd\xe8\x72\x59\x21\xd3\xfd\x5e\x0f\xdb\xfd\xbe\xb0\xad\xf0\x26\x09\x00\x0e\x20\x65\x41\x3e\x6d\xb7\xa6\x57\x07\x3b\xbc\x07\x20\x88\xf7\xa9\xd9\xfe\x04\xa6\x3f\x36\xb1\x5a\xad\x48\x52\x36\x78\xd8\x87\xe3\xb5\xe2\x23\x79\x51\x65\xae\xdd\x8c\x58\x39\x6c\x4f\x28\x72\x59\x3d\xba\x86\x03\x1b\x6f\xce\x37\x9c\x94\x3c\xaf\xd6\x16\xb8\xee\x78\xe1\xea\xd9\x9b\x8e\xf5\x80\x75\x98\xc1\x4d\x20\x23\xac\x9e\x79\xbc\xba\xaa\x70\x3d\x8e\x5b\xbf\xaa\xb5\x4f\x23\x0b\xcf\x34\xb4\x23\x77\x73\x8b\x3b\xec\x25\xbb\x4a\x05\x15\xf0\x9d\xf9\x12\xa4\x1e\xfd\x23\x0a\xf9\x9a\x52\x6d\x11\x2a\xdd\x87\xa7\xce\x9f\x00\x6e\x96\x75\xbe\xd7\xb0\x00\x17\xfc\x5b\xa8\xbf\xeb\x38\x4c\xc4\x75\x17\xc8\x98\x25\xa5\xbf\x27\x79\x1a\x5c\xa5\xcd\xc6\x61\xc3\xc5\x93\x71\x54\x00\x8c\xe5\xe5\x84\x0c\x66\x61\x16\xf8\xd1\x76\xbe\xe8\xe0\xc8\x50\xce\x05\xc3\x30\x6c\x42\xf2\x7b\x92\x98\x08\xa2\x85\x85\x62\xee\x2b\xc8\xf0\x1c\x57\x90\x58\xb0\xc1\x87\xe4\x3d\x3f\x36\x0d\xdf\x5e\xef\x7b\x40\xa3\x8b\x16\x02\xc0\xf9\x91\x23\xb5\x30\x10\xa2\xb3\xc4\x4b\xab\x1e\x9d\x71\x89\x35\xda\xe5\x85\x1c\x81\xa5\x4c\xc3\xe1\x96\x92\xdb\xb7\x08\xfe\x5c\xe0\x6f\x7d\x1b\xd6\x01\x21\x78\xd7\xed\xc4\x45\x35\xff\x9b\x91\xd7\x46\x58\xb8\xe1\x27\x46\x38\x6e\x7d\x89\x98\x33\x2a\xa5\x96\xa9\xd6\x0e\x2e\xb0\x30\xdb\xeb\x2a\x6b\xe4\xd5\xc0\xd3\x65\xdd\xae\x59\xd8\x65\x7e\x20\x66\x15\xdb\xb1\x95\x26\x28\xc7\xc3\xfb\xa4\x80\x2b\xf6\x89\x9e\xf7\xf7\x69\x8c\x75\x81\x69\x8c\xcf\x69\x9a\x42\xb6\xdb\xc5\xc5\xf3\x73\x58\xe6\x8c\x65\x5a\xce\xe2\xb6\xfa\x50\xf3\x44\xdf\xc0\x4b\x6c\x08\x0c\x7d\xe3\xdb\xa0\x48\xb4\x22\xbd\x74\x57\x8d\x94\x6f\xfe\x5a\xe4\xad\xf9\xd3\x0d\xb6\x87\xba\xd1\xe6\xd9\x82\x6a\x0a\xe9\x61\xce\xae\x7a\x3c\x37\x97\xef\xa1\x49\x69\x47\xe7\xc6\x29\xe4\x0c\x98\x46\x17\xd9\xf3\x59\x7d\xf5\xdb\xc1\xc5\x69\x64\x0d\xc3\x21\x27\xc9\xf7\x1c\xfd\x1e\xd0\x2c\xcb\x4d\xdc\x75\x21\x0f\x23\x8d\x9e\xeb\x16\xdc\x51\xeb\x80\xcb\xb0\xc1\xdc\xd9\xe3\x33\xd2\x01\xf2\x53\xb4\xbe\x8f\xf2\xca\x9c\x7d\x75\x8e\xfd\xde\xa4\x87\x81\xd9\xc7\xe1\x68\xe1\x79\x24\xaa\x60\x7c\xc8\x3d\x76\xc6\x44\xfd\xae\xf7\xd0\x37\x18\xc0\xf6\xab\x31\x59\x19\xac\x65\xba\x27\xae\x3a\xf5\x51\x72\xef\x4b\x82\x3b\x3e\x24\xf0\x03\xdc\x28\xe7\x05\x5b\x15\x38\x48\xfa\x6c\x9c\x1a\x7a\x5b\x65\x01\x61\xa7\x63\xb5\xf5\xa2\x56\x50\xf8\xf9\xa0\x8c\xfc\xe4\xb8\x19\xde\x40\x14\xc3\x40\x80\x30\x53\x42\x7c\xb3\xd5\xda\xd0\x38\x8a\x28\x36\x82\xc3\xf8\x36\xfa\x6b\x67\x3a\x6a\xd5\x94\x6b\xc2\xd2\x67\x57\xbf\x17\xf2\xfa\xa5\x9d\x51\x89\xd4\xc0\x0a\x6e\x3a\xb0\xa0\xd1\x6f\x56\x75\x6e\x11\xde\x46\x6d\x70\xb8\x30\xc2\xdb\xee\xd3\x84\xbf\xac\xee\x97\xba\x4c\xdc\xee\x24\x5c\x56\x7f\xca\x47\xb6\x63\xd2\x86\x60\x67\xd7\x72\x5c\x9f\x5e\xa9\x48\x6a\x67\x01\x3d\xce\xb7\x08\x41\xbb\xac\x0a\xd1\xe0\xc9\xc3\xe7\xaf\x7a\xa0\x03\x1a\xa1\xe9\x22\xa5\x44\x67\x82\xe6\x9c\xa0\x20\xac\x11\x67\xd2\xcd\x62\x9b\xea\xc2\x91\xb0\x0b\x5f\x2b\x67\x58\x07\x36\xc7\x7b\xc5\xb8\x61\x0a\xdf\x68\x6f\xc6\x8a\xfa\x07\xd8\xf9\x95\xe2\x41\x45\x0d\x9c\x4d\x2f\xe3\x22\xa2\x3c\x47\x65\x36\xa4\x17\xca\x4f\xdd\x1a\x88\xe9\x8f\x2e\x81\x18\xfb\x8c\xe2\x8a\xc0\x0d\x27\xdd\xe6\xcb\xcd\x99\xd6\xf3\x82\xdf\x60\x2b\xd2\xb5\x6c\xfd\xb1\xfa\x04\x3e\xcd\x68\x2b\xb1\x97\x41\x58\x40\x53\x63\x50\xbe\x50\x26\x31\xbc\x07\x6b\x93\x8b\x41\x47\xca\x7e\xad\x65\x53\x74\xf2\x70\xb4\x5f\x2f\xb1\x7d\x75\x7c\x26\x7f\x8e\x77\xd8\xc2\xee\xeb\xea\x90\xb3\x21\xa9\x42\xeb\x46\xe0\xeb\x14\x85\xb5\x30\xb6\xe2\xe7\x1e\xe4\xc4\x6c\xd0\x9e\xcd\x55\xda\xbb\xcf\xbf\xcf\xcb\x00\x1f\x95\x10\x81\x62\x08\xa4\xa7\x30\xfe\x51\x6d\xda\x5c\xdb\x74\xeb\xa8\xd2\x7a\xe9\xa6\xcc\xdd\xc8\xf9\xd9\xd2\x6b\xb9\xe8\x5a\xab\x37\xd0\x22\x5f\xc9\x3d\x7b\x4c\x91\x34\xdb\x42\x6f\xda\x76\xdf\x44\x91\x92\x10\xca\xf0\xa2\x37\xb0\x13\x75\x71\x7f\xdd\xa4\xe5\x7c\xb1\x6a\xe7\xec\x5e\x5e\x64\xa3\x73\x65\xe1\xf4\x4c\x64\xc0\x56\x0e\xc4\xfe\x61\xb0\xae\xc5\xc1\xcb\x71\xde\x8f\x35\xa1\x37\xb1\x2b\xc3\x41\x64\xf1\xfe\xab\xc0\xab\x14\xfd\xc8\xa6\x27\x77\x39\xbd\x71\x9d\xc5\x65\x80\x76\x14\x86\x22\xa3\xfc\x28\x60\x6c\x4f\x38\xf4\x03\x74\x61\x70\x0f\x6a\x5d\x7f\x24\x02\xc4\xb1\x6c\xd3\x8f\xc9\x13\x9b\x1b\x96\xc7\xfd\x0b\x97\x85\x7c\x41\x5c\x14\xc1\x71\x99\xe7\xf8\x4c\x6e\x43\x21\xc5\x76\xf5\xeb\x42\x02\x3b\x7c\x7b\xb2\x30\x02\xd3\xd4\x74\x54\xb1\xc6\xd8\x56\x73\xdf\xa5\xf5\xea\x42\x89\xf1\xba\x24\xc4\x82\xab\xe1\x11\x9b\xc8\xdc\x16\x61\x15\xfc\x40\x19\x15\x23\x2c\x4c\xeb\x75\x83\x0b\xeb\xbb\xf5\x9a\xed\x93\x9b\xa8\xda\x1c\x41\x79\x8c\x3b\x64\x5e\xe4\x36\x48\xcf\xa5\xa4\xc4\xc0\xfc\x12\x87\x87\xc5\x67\xa2\x12\xfd\x08\xfc\xb2\xc0\x83\xe8\x16\xfc\x3e\xbe\x12\x67\x8b\x39\x56\x80\x23\x5a\x59\x78\x3c\xe8\x76\x3d\xb8\xde\xfe\x02\x98\xc6\x37\x04\x0d\xc5\x27\x4b\x09\x48\x6c\x1a\x45\x16\xc0\x30\xe7\xf9\xdc\xb2\x3f\xc2\x7e\x5a\x53\xe9\xe9\xb2\x26\xbe\xea\x3e\xfd\x73\xfe\xbe\x5a\x2c\x5c\xb2\x3f\xbb\x6c\x4a\x43\xf4\x2f\xeb\x10\x4a\x82\x7e\xec\x52\xb6\x2f\x97\x07\xa3\x6c\x11\xff\x3c\x36\x9f\x08\x2b\xb0\x14\xc6\x65\x8f\x3e\xad\x3d\x06\x68\x3e\x9a\x65\xe7\xac\x77\x1e\xca\x97\xda\xe1\xf8\xca\x2a\x89\x58\xdc\x95\x4c\xa4\x5e\xcb\x77\x00\x31\x7c\xe3\xcc\x8e\x03\xa2\x99\x08\x68\x30\x9b\x1a\x6b\x55\x1b\xb5\x73\x3e\xb1\x16\xe7\xd6\x98\x5b\x1f\x0d\x82\x58\xa6\x16\xdd\xc9\x4b\x81\x70\x90\x1c\xa5\x24\x33\x2d\xce\x4f\x8d\x53\xf1\x0b\x25\x29\x1c\x42\x07\x50\x8e\x83\x4e\x97\xea\xbc\x2b\x7f\x7d\x7b\xfc\x32\x3e\x4c\x2d\xe8\x58\xc0\x4f\x18\x55\xb8\x5c\x1a\xa2\xcf\x7f\xa0\x1f\x11\x44\x5e\x8a\x50\x2c\x59\xb8\xa1\x7d\x2a\x29\xc9\x85\x4d\x09\x6a\x63\x2d\x92\x80\xf2\xcd\x29\xeb\x6c\x2e\xf4\xbb\x0f\x27\x6d\x32\x08\x6c\xde\xfa\xe3\x77\x72\x54\x98\x30\xff\x8e\x03\x3c\x8b\x6d\x5c\x38\x8c\x78\xa5\x6c\x46\xb5\x9f\xbd\xda\x4f\x07\x1d\xb4\x51\x0c\x64\xe2\x35\xf7\xb3\xc6\xa4\x93\x5f\x65\x92\xdf\x5a\xaf\x77\xbe\x86\xb4\xd7\xd3\x43\xb5\x46\x1c\xf0\x2b\x91\x87\xd6\x27\x78\x50\xd6\xbe\x2c\x21\xbf\xb3\xd0\xdc\x6f\x55\x57\x3b\xf7\x08\xea\x77\xfe\x11\x54\x22\x63\xa7\x1f\xaa\x77\x6f\x7b\x53\x9d\xf0\x91\xa3\x2a\x63\x78\xbc\x2b\xdb\xd4\xcb\x3b\xfd\x92\x49\xda\xf6\xc0\x90\xf9\x6f\xb6\x5a\x19\xa6\xbc\x86\xfe\x4e\xde\x21\x4f\xf8\x2b\x1c\xda\x1d\xb9\x38\xbb\x23\x8f\xc9\xff\x21\x78\x09\x3c\x7c\xc0\xfd\x9d\xbc\x97\xf8\x35\xc5\xa3\x47\xdb\xdf\xd9\x87\xd0\xbf\xaa\x03\x32\x80\xf8\xa5\x5e\xb5\x18\xe1\x17\x45\x12\x4d\x8d\xaa\xd3\x07\x78\x4f\x0c\xa7\x57\x99\x8c\xea\xab\xeb\xd2\xb1\xc5\x95\xb9\x21\x7e\x7d\xd7\xa2\x87\xeb\xdf\xb9\xb7\xff\x13\xd6\xae\x7e\xf1\x7c\x8d\xbc\x23\xfa\x4e\xde\x07\xfd\xfa\x2e\xb9\xc0\xec\x8c\x95\xf6\x2b\x46\x76\xc5\xf3\x71\x24\xe7\x1a\x19\x0f\x39\x0c\x62\x9b\xae\x1d\x6e\xa7\xd1\xde\x12\xcc\x0e\x1f\xa1\x1f\x62\x7f\x6f\xb7\xd8\x47\xa8\xf9\x8d\x60\xa6\xaa\x92\x98\x37\x15\x5f\xae\xa9\x72\xf9\x66\x96\x28\x10\x6d\xfe\xb6\xaa\x8a\xb7\x93\x74\x4d\x5b\x1e\x41\x4a\x26\xd8\xa9\xec\x10\xec\x3d\xdc\xb0\x97\xcb\x6e\x82\x44\xfa\xf3\x5d\x33\xfb\x4e\xc3\x10\xe3\x29\x86\xef\x76\xf4\xc9\x8f\x6a\xf1\xd7\x86\xbe\xe8\xa4\xd8\x19\xfe\xca\xe8\x2b\xa3\x61\xe1\xf7\x07\xfa\x0d\x5a\x92\x4a\x29\x22\xb9\xdf\x71\x44\x28\x79\xaa\xed\xbb\x23\x7d\xc2\xa5\x9e\x5f\x77\xa0\x33\x3a\xe3\x57\xca\x5d\xb8\x63\x7e\x88\xb4\xc4\x15\x1b\x92\xe5\x27\xa7\x6e\xaa\xae\xe6\x34\xb4\x9a\x72\x52\x96\x1e\x39\x25\x83\x57\x1b\x3f\x9f\x67\xcc\x96\x53\xd0\x7e\x25\x95\x55\x65\xbb\x91\xba\xb8\x0f\x52\xd9\xd1\xa4\x52\x99\xf6\xa4\x4e\x3f\xcc\x6d\x6f\x6c\x57\x38\xd1\xf6\x45\x3b\x42\xf3\x98\xd5\xd5\x1e\x2f\xf1\xbc\x9d\xd8\xb7\x04\xed\x23\x82\x0f\x10\x0a\x57\x2d\x9b\x09\x55\x58\xd9\x8f\xa7\xa7\xf8\xf6\x73\x8f\x90\x2e\xd3\x89\x7d\x17\x34\x2f\xf7\x9d\xaa\x72\xff\x6b\xd5\x25\xcb\xb4\xbc\xd5\x2a\x90\x56\x51\xad\x68\x15\xf3\x86\xaf\x02\xa6\x13\x56\x12\x23\x1a\xd7\x82\x78\x1d\x56\x0f\x43\x17\x93\xdc\xfe\xfb\xdf\x19\x9a\x7e\xff\xe3\x1f\xc9\x8b\x7b\xdf\x26\xe6\x23\x9e\x11\x68\x12\x62\x2b\xa1\x28\x74\x60\xf4\xfd\x28\x82\x44\xc0\x19\xf6\xb3\x63\x13\x97\x37\xfc\x9b\x9b\x9e\x4c\xfe\x57\x00\x00\x00\xff\xff\xd1\xb0\x5d\x2d\xe8\xde\x00\x00") - -func confLocaleLocale_svSeIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_svSeIni, - "conf/locale/locale_sv-SE.ini", - ) -} - -func confLocaleLocale_svSeIni() (*asset, error) { - bytes, err := confLocaleLocale_svSeIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_sv-SE.ini", size: 57064, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_trTrIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\xbd\x4b\x8f\x1c\xd7\xb1\x2e\x3a\xaf\x5f\x91\xa2\x41\x34\x09\x34\x4b\x90\xbd\xef\x03\x82\x4a\xbe\x4d\x36\x45\xfa\x92\x14\x79\xd5\x94\xf7\xa5\x05\xa2\x94\x55\x99\x5d\x95\xce\x57\x39\x1f\x4d\x55\x1b\x06\xce\xcc\x93\x33\x36\xce\x01\x0c\x73\xa8\xa9\x34\xd1\x48\xb3\x6e\xfd\x91\xfd\x4b\x4e\x7c\x11\xb1\x5e\x99\x59\x4d\x52\xc7\x1b\xdb\x62\x57\xae\x58\xef\xb5\xe2\xbd\x22\xe2\xdd\x6e\x99\xa4\xed\x7a\xf1\x24\xad\x92\x2c\x6a\xfb\xaa\x5f\xd3\xff\x2e\x93\x38\x5a\xc5\xcd\xf5\x8f\x55\x72\xfd\x63\x13\xaf\xb2\x22\x5d\xa7\xd7\x6f\xb3\x2a\xbb\x8c\x2e\xe3\x6d\x99\x76\x2d\xfd\xb5\xca\x9a\xe8\x51\xd6\x45\x6d\xda\x5c\x64\x6d\x36\x9b\x6d\xeb\x32\x5d\x9c\x54\x71\x74\x16\xef\xcf\xe3\x59\x12\xb7\xdb\x55\x1d\x37\xc9\xe2\x45\x5c\xd5\xb3\xf4\xbb\x5d\x51\x37\x29\x75\xf5\xcb\xdb\xf3\xb4\x9b\x6d\xd3\x62\xb7\x78\x45\xc5\xd7\x3f\x96\xb3\x36\xdb\x54\xcb\xac\x5a\x3c\xca\x9a\xec\x97\xb7\xd1\xab\x78\x27\x9f\xea\xbe\x5b\x5c\xfd\xfd\xfa\xc7\xfc\xfa\x47\xff\x73\xbf\x5b\x3c\x89\xf7\x49\x5d\xcc\x9a\x74\x93\xb5\x5d\xda\x2c\xae\xfe\xb9\x4f\xa3\xe7\xc5\xec\x4d\xba\x6a\xb3\x2e\x5d\xfc\x67\xba\x8a\xf0\x07\x0d\xec\x22\x6d\xda\xac\xae\x16\x67\x57\x3f\x37\x57\x3f\x97\xb3\x5d\xbc\x49\x17\x32\xc6\x2e\x2d\x77\x45\x4c\xe0\xbf\xfc\x2b\x5e\x15\x75\x35\x2b\xe2\x6a\xd3\xa3\xfc\x34\x2b\x66\xeb\x26\xa5\xb2\x65\x95\xbe\x59\x3c\x2f\xfa\x5f\xde\x76\x7d\x33\x9f\xcf\x67\x3d\xcd\x78\xb9\x6b\xea\x73\x5a\x97\x65\x5c\x25\xcb\x92\xe7\xd5\x17\x54\xf9\xfa\xc7\xf5\xf5\x8f\x91\x14\x66\xd1\x45\x1a\x25\xf1\x36\x8e\xce\xe3\xcb\x22\x6e\xaf\x7f\xe4\xd1\xa7\x09\xcd\x74\x19\xb7\x66\xb2\xfb\x78\x17\x57\x9f\xce\xb8\xd9\x2a\x2e\xc3\x96\x4e\x68\x79\x66\x69\x19\x67\xc5\xe2\xe1\xbd\x17\x75\xdb\xc5\x34\xfc\xb6\x7d\x53\xf3\xb2\x36\x75\x11\xd3\x12\x2c\xbb\xfd\x2e\x5d\xbc\x4c\xf3\x26\xc6\x96\x34\x59\x35\x5b\xc7\xbb\x6e\xbd\x8d\x17\x0f\xe4\xdf\x19\x41\xed\x6a\x5a\x8f\xba\xd9\x2f\x4e\xe9\xcf\x59\xdd\x6c\x62\xda\xcf\xb8\xc3\xca\x3c\xd7\x1f\xed\x9e\x96\xa0\xcc\x9a\xa6\x6e\x68\x6b\x2a\x1a\x71\x19\xcf\x68\xfa\x4b\xd4\x5e\xbc\x4a\xab\x2c\xe2\xca\xf8\x54\x66\x9b\x06\x2b\xc7\x5f\x1f\x5d\xfd\x74\xf5\xbd\x7e\x96\xda\xf8\x1a\x34\x71\x5e\x37\xb9\x7c\xbe\xfa\x7b\xdc\xc5\x85\x6b\x89\x86\x22\x05\xe1\x30\xe2\x8a\xf6\x81\x0b\xfd\xef\x05\xce\x65\xf4\xea\xea\xa7\x8a\xce\x50\x9c\x94\xb4\x94\xb4\x7c\x69\xb1\x90\x4f\x59\x19\xbd\xc0\xcf\x6c\x16\xaf\xd7\x75\x5f\x75\xcb\x36\xed\xba\xac\xda\xb4\x8b\xc7\x69\x1b\xef\xa2\x93\x7d\xdc\x70\x1b\x33\x5b\xa0\x9f\x66\xfb\xba\xb7\xfb\xba\x78\x21\x5b\x48\xdd\xca\xf7\x21\x34\x5d\x8e\xeb\x1f\x2f\x67\xd4\x4d\x97\x5d\x64\x5d\x96\x52\x49\xce\x7f\xa6\x45\xda\xcc\x76\xb4\x87\xb4\x6a\x7f\xe9\xd3\xb6\x6b\x69\xc5\xe9\xf6\xfc\xf2\x36\xcb\x8b\x2c\x8f\xae\x7f\xa0\x03\x4b\xbf\x67\x59\xdb\x52\xf1\xe2\xac\x6e\x7a\x4c\x6b\x46\x9b\x56\xad\x69\x26\xd7\x3f\xec\x68\x7d\x66\xb3\x6f\xb2\x8a\xf6\xbb\x28\x5e\xcf\xf4\x0f\x3a\x19\x4d\x5f\xf4\xe5\xac\xcb\x3a\x1a\xe2\xf5\x0f\x45\x1e\x3d\x49\x2f\xb1\xa0\x05\x2e\x48\x47\xb7\xb5\x8c\xa9\x83\xab\xef\xb3\x2a\x52\x60\x3e\x42\xa5\x4c\x39\xa9\xd7\x39\x9d\x5d\x5c\x3d\xba\x32\x8f\xea\x4d\x7b\xd4\x47\xa7\xfc\x31\xca\x50\x29\x49\xa3\x5c\x4f\xdf\xbe\x6e\x5a\xfc\x4b\x17\xbd\x8f\x5a\xdc\x16\xc2\x0a\xdb\xb4\xd9\xd2\x0d\xc9\xf8\xf2\x27\xfe\xac\xe8\x14\x97\x04\x51\x45\xb4\x0d\xeb\x34\x2a\xae\x7e\xee\xce\xd3\x2a\xfa\x2c\x8e\xba\xb8\xd9\xa4\xdd\xe2\xd6\x72\x45\xed\xe6\xb7\xa2\x6d\x93\x9e\x2f\x6e\xdd\x6e\x6f\x7d\x4e\xb7\xba\x88\x2f\xfa\xcb\xfe\xb3\x8f\xe3\xcf\xa3\x24\xcb\xf3\xb8\x2b\x32\xaa\x5d\xe7\xfd\x1e\x78\xe8\xa3\x19\x96\x90\x96\x74\x99\xac\x04\x51\x61\xcc\xd1\xb3\xfd\xd9\xff\xf7\xf4\x38\xc2\x75\xd8\x34\x29\xff\x4d\xff\x21\xb0\xdf\xd1\x8d\xdb\xc7\xd1\xcb\xec\xf4\x7e\xb4\x49\x9b\x94\x36\xa4\xc9\x9a\xf9\x8c\x6a\xcb\x92\xfd\x31\x6d\xb2\x2e\x5e\x61\x5e\xde\x49\x40\x31\x6e\x90\x5f\xfa\x92\x91\x05\xe1\xb4\xb6\x5b\x9c\x31\x5e\xe4\x0b\xea\x5f\xce\xd1\x4d\xa4\x76\xf8\x02\x07\xbd\x24\xd2\x81\xae\xf9\x53\x5d\x17\x9e\x82\xac\x79\xf4\x87\x2f\xbf\x7c\x4e\x03\x2e\xeb\x0e\x27\xa1\x8f\xfa\xee\xfc\xff\x5e\x6e\xd2\x2a\x6d\xe2\x62\xb9\xce\xa2\x3c\x6e\xe2\x9c\x70\x1c\x61\xda\x2e\xdb\x17\x6e\x8b\xaa\xf9\xac\x6d\x0b\x42\x3f\x09\xe1\xb3\xb3\xa7\xd1\x7d\xb4\x57\x66\x34\xae\x6e\xbb\x78\x45\xd8\xb1\xfd\x4b\x81\xc5\xd3\xbe\xc7\x6b\x74\xe1\x06\x8a\xff\x8f\x92\xba\xa5\xa2\x7d\x5d\xf4\xf3\xe8\xb3\x55\xf3\xb9\x19\xad\xa0\xf8\x88\xe6\x48\x23\x21\xd2\xf0\xcb\x5b\x42\x9a\x74\xd8\x72\x2a\x2b\xfb\xae\xa0\x8f\xa8\xe4\x0f\x2c\x6d\x9a\x25\x21\xd7\x6e\x8f\xad\xe3\x01\xdd\xd8\xbd\xd4\x5f\xd5\x84\x0f\xa9\x97\x32\xbe\x94\x16\xb2\xea\x22\x2e\xb2\x84\x76\xcf\xac\xed\xa8\x62\x9c\x80\x4e\xc5\xd1\xad\xf9\x2d\xe0\xdb\x5b\xf7\x6e\xd9\x05\xa3\x8b\x98\x55\x69\x94\x5d\xd2\x22\xa3\x4a\x51\xa6\xd4\x6e\x55\x2f\x05\x6f\x00\x75\x27\x59\x4b\x88\x3f\x5d\x0a\x1d\x69\x04\x1d\xde\xa7\xc3\xbd\x17\x74\x42\xcb\xbf\x25\xbc\xb1\xa2\x8e\x6a\x25\x01\x72\xcc\x73\x0f\x49\xe7\x44\x8b\x78\x05\xe9\x4a\x5c\x34\x84\xf3\x71\x19\xe9\xd7\x0a\xd4\x33\xc7\x6c\x5a\x41\x17\xfe\xb2\x18\xdc\xa5\x47\xe8\x95\xed\x6f\xc7\x87\xa9\x45\x7d\x7f\x39\x66\xe6\x44\xc8\x49\x7e\x44\xbf\x8a\xe8\xeb\xfd\xa6\x47\xb9\x77\x98\x41\xd3\x79\xa5\x5c\x59\xe2\x7d\x36\x87\xe1\x7e\xdf\xc4\xb4\x0f\xb5\x87\x5a\x71\xe3\xfa\x2a\xda\xc6\x4d\x96\xc7\x51\xd6\xd2\xf8\xe8\xf0\xd5\x74\x13\x3f\x62\xf2\x21\xdb\x08\xb4\x1d\x3d\xb9\xfa\x29\x8f\x4e\xb1\xb0\x99\x2b\x32\x4d\xd3\xd5\x29\xa3\xfe\x92\x0e\x05\xd8\x83\x84\x8a\x05\x69\x13\x1e\x49\x50\x25\xe5\x05\x4b\x13\x66\x2b\x70\x45\xe7\x33\x3a\xf7\x4b\xbe\x5e\x3e\x2a\x8b\x81\xc3\xdc\x6d\x33\x30\xa6\x1b\xaf\x4c\x0e\x2f\x75\x44\x73\x88\x72\x8c\x8d\x3b\x42\x57\x74\x24\x14\xcf\x5d\x7d\xef\x63\x49\x9a\x7b\x0a\xf2\x4b\x04\x23\xbb\xa4\x79\xd6\x45\x89\x62\x30\x3c\x84\x2f\x6a\xa2\xb8\xd5\xe2\x84\xda\xd7\x0b\xcc\x1f\xdc\xda\x11\xc2\x39\x7b\x1c\xe5\xc4\x31\xd0\x6d\xb8\xa6\xdb\x50\x75\xc0\x65\x42\x15\xa2\xb4\xcb\x69\x6e\x0d\x6e\xe7\x76\xb9\xab\x1b\xc2\x20\x04\xfd\x82\xfe\xe8\xed\x27\x7b\x29\xa9\xc4\xf2\x5d\x34\x7a\x94\xb9\x8b\x54\x30\x1e\x3e\x96\x93\x20\xc7\x09\x53\xa5\xc1\xd3\x89\x47\xd5\xab\x9f\x2e\xd3\xa2\xc8\x98\x39\x9b\x3c\x7d\x7c\x19\xb7\x5d\xb7\x93\x81\x3c\x7e\xf9\xf2\x85\x8e\xc4\x7e\x34\x43\x31\x07\x46\x56\x33\xab\x8a\x74\x2f\x7c\x1f\x0f\x6a\xce\x47\xa8\x6f\x0a\x77\xb0\xee\xdb\xa9\xb7\x7a\xc2\xa8\xd8\x5f\x24\xf4\xf6\x31\xfe\x73\x76\x70\xad\x68\x7f\xd2\x7b\x3b\x30\x36\x49\x9c\x13\x5d\x89\x2f\x71\xa1\xb8\x45\x21\x5a\x6e\x35\x8b\x7a\xb3\x6c\xea\xba\x93\x73\xf8\xe8\xea\xe7\x8a\xa8\x0c\x1d\x43\x20\x2d\x65\x0b\xe8\x8e\x86\x60\x96\xd6\x19\xe8\xc4\x42\x57\xb2\x92\x97\x18\xcc\x9a\x06\x86\xeb\x8b\x53\x43\x57\xad\xde\x01\x0f\xd8\xbb\xa6\x14\x3b\x95\x09\x3b\xd2\x21\x8c\x99\x02\x29\x7b\x16\x9d\x09\x3b\xec\x33\x1a\x25\x2d\xb4\x10\x92\x67\xb4\xfa\x42\x4d\xda\x5e\xbe\x9f\x37\x75\xb9\x78\x92\x95\x49\x5a\xb9\x0f\x66\xd4\x5f\x7d\xf1\x20\xfa\x3f\x7e\xf7\xdb\xdf\x46\xd4\x30\xe1\x38\xf0\xca\xc4\x5e\xf7\xb4\xfe\x38\x28\xe8\xed\x56\xce\x55\x6f\x11\x1a\x6c\x88\xd7\xa5\xab\x3c\x8f\xee\x83\x5e\x27\xb4\x75\x4c\xa5\x75\x75\x15\x40\xb0\xef\x2d\x9a\x51\x56\xde\x8a\x3e\xa3\x81\x96\xff\x0f\x2d\x47\x15\x27\xd9\x7c\x5d\x97\x9f\x53\x15\xa6\x21\xe0\x04\x50\x9b\x6b\x01\x07\x91\x10\x80\x8b\x8a\x09\xd3\x15\xe4\xbb\x4a\x4c\x1f\x81\x35\x44\x03\x1e\x4a\x1f\xa6\xd4\x22\x35\x07\xf1\xc2\x20\x35\xcb\xb1\x2f\xd7\x75\x75\x9e\x35\x25\x38\xf9\xeb\x1f\xbb\xe8\x79\x85\x7f\x71\x24\x1e\xd2\x86\xd3\xe1\xa3\x9b\x9a\x35\xdc\xe4\xb2\xaa\xbb\xec\x7c\x6f\x97\xf8\x7e\x56\x24\x44\xd8\x4b\xc6\xef\x59\x08\x0f\x52\x95\x82\x5d\xa3\x5d\x58\xa7\xba\x37\xb2\xe4\x38\x6b\xa7\x74\x55\x88\x92\xca\x26\x79\x7b\x54\x9f\x9f\x13\xb3\x97\x0a\x2d\xbd\xfa\x3b\x5d\x24\x42\x0c\xa7\x7a\x93\x9e\xd5\x49\x1f\xf6\xe2\x83\xd3\x1d\xda\x91\x40\xf2\xe0\xf4\xcb\xa3\xec\x38\x22\xb6\x81\xb9\x50\x2a\xe9\x41\x96\x20\x3c\x4d\x5e\xcc\xe3\xa8\x03\x9e\x24\x54\x58\xc5\xfe\xb1\x8c\xf6\xb4\x60\x85\xa1\xb5\x40\x0d\x38\x9e\x79\x27\x88\x49\xc9\x15\xb1\xde\x17\xc4\x44\xd3\x1e\xe8\x1f\xe6\xd8\x31\x87\x8e\xce\xcc\xd8\xef\x73\x67\xa3\x8a\x3a\x68\x5b\x9d\x96\x86\x51\x89\x8e\x47\x46\x32\x35\xec\x79\xc4\xe8\x5d\xaa\x11\x98\x4f\x08\xf1\x93\xbe\xc6\xe7\x4c\x91\xe9\x72\xd1\x85\x2b\x88\xb1\x6f\xe4\xd4\x5d\xc4\xc4\x51\xee\x01\x46\x48\x1a\xc8\x96\x26\x74\x9e\xd2\xf9\x20\x31\x22\x59\xea\xb8\x8a\x9a\x98\xbf\xdd\xe2\x61\x85\xe1\x46\x5f\x98\xe2\xe8\x84\x8b\xdb\xe8\x29\x97\x1f\xaa\xa7\xd3\xd2\xda\x16\x48\x87\xdb\x46\x02\x15\x75\x75\x44\x27\xd8\x2b\xaf\x77\xe0\x72\x88\xcf\xa7\x4b\xa3\x47\x87\x50\x51\x8b\x92\x2a\x2a\xb2\x95\x2e\x93\xdb\x80\x80\x5f\x10\xe9\x99\xff\x4b\x14\x47\x24\xd3\x12\x33\xbd\x79\x2f\xfc\x36\x74\xe0\x43\x9a\x96\x73\xcb\xb9\xb6\x9c\x6b\xcb\xed\x61\x66\xe3\x98\x30\x5a\x01\x56\x63\x1d\x7b\x2c\xcc\x1e\xd2\x15\xf8\x98\x1d\xb6\xc8\x30\x32\xe6\x4e\xa7\xbc\x5a\xcb\x81\xc8\x78\xb4\x1f\x5e\xc5\x10\xee\x43\x47\xac\xcc\xae\xd6\xa6\x03\x7f\xfd\xb6\x61\x32\x82\x32\x66\xd6\x5b\xe0\x5e\x66\xf8\x49\xa4\x55\x8d\xc0\xf2\x22\x23\xe9\x9b\x85\x75\x39\x93\x84\x52\x88\x2f\xaf\xe8\xee\x80\x3c\xad\xc0\xd3\xe5\x46\xe2\x71\xda\x03\x59\xfd\x67\xe9\x7a\xd5\x37\xd1\x13\x3a\x72\x93\xed\xea\x14\x5e\xd9\x15\xdb\x58\x89\xbc\x64\x85\xc3\xe0\x6c\xb7\x6e\x18\x9b\xe1\x30\x32\xa2\xd2\x97\x19\xe1\x93\xb4\xa3\xb1\x10\x66\xf2\x36\xc2\x35\xfb\xb1\x2c\x88\xd7\x52\x35\xdd\xd8\x5c\x65\x5b\x15\x3b\x45\xf8\xf9\xe5\x5f\x7d\x44\x77\x47\x16\xf2\x26\x06\x35\x8f\x2e\x21\x4a\x10\xfa\x61\x19\xad\x60\xc2\x70\x1c\x65\x24\x2f\xfa\x7c\x2b\x09\x1c\x25\x9d\xbe\xdc\x20\x1b\xff\xc0\x08\xd1\xc5\x1e\xb6\xf1\x36\xdb\x01\xc4\x62\x21\x19\x9a\xa0\x56\xc7\xb7\x3e\xd6\x61\x78\xac\x28\xc3\x4d\xeb\x34\x06\xec\xaf\x4a\x50\x4a\x13\x86\xdf\xf9\x2a\xe9\x81\xd1\x9a\xa2\x13\x71\xbd\x2b\x6d\x00\x85\x51\x69\x79\xb9\x21\xbe\xcf\x08\xb9\x24\x0c\xcf\x3a\x92\xc5\x97\x9b\xac\x5b\x9e\x83\x4c\x25\x8b\x23\xfa\xfb\x88\x18\x5c\x92\x60\x22\x94\x65\x2c\xd9\x60\xe4\xd4\xca\xe5\xa7\xd1\xed\x0b\x15\xa0\x7e\x07\x02\x04\x44\x93\x15\xb8\x01\x74\x60\x40\xa9\xa2\x56\xf4\x49\xb4\x73\x57\x3f\x5f\x1a\x09\xf4\xe8\xea\x67\x5a\x74\x22\x70\x84\xf9\xca\x8c\x99\x37\x23\x0b\xdf\x6e\x8f\x88\x54\x47\x44\x50\xcb\xcc\x55\x8e\xee\x6c\xea\x55\x4f\x14\x2d\x68\x2f\x3a\x7d\x78\xfd\xaf\xeb\x1f\x9e\xde\x8d\x88\x14\x43\xa3\x33\x9f\x19\x59\x88\x24\x21\x3d\x15\x81\xa0\x19\x9b\x65\xa7\xcb\x74\xf5\x3d\x54\x5e\x32\x05\x53\x6d\xc0\xc1\x7b\x5c\xf2\xa0\x82\xe5\xb3\x31\x69\x3a\x1f\xeb\xed\x62\xa0\x60\xf0\xce\x50\x6b\xfb\x2b\xb2\xe0\x6c\xc9\xc1\xa3\x06\xdb\xe8\xde\xe7\xf4\xdf\x59\x1b\x5f\xa4\x42\xf3\x37\x66\x03\xe8\xa2\x32\x35\x48\xb4\x59\x23\x15\x94\xf4\xdf\x60\xec\xc1\x5d\xf0\x36\x9d\x51\xda\x0d\x33\x97\x73\xd0\xf6\xeb\x75\xda\xb6\x8b\x67\x50\x5e\xac\xe2\x8f\x8c\x40\x40\x4c\xc8\x3a\xdb\x46\x68\x55\x95\x9b\x72\xb3\xae\xbe\xaf\x73\x16\x6b\xfb\x7d\x4f\xb7\x26\x4f\xf7\xe7\x58\xa5\xab\xef\xaf\x7f\xcc\xf9\xca\x7e\x64\x07\x76\x80\x25\x3d\xbc\xb8\xb3\x6f\xa0\x25\x7d\x3d\xeb\x45\x16\xab\x8b\x24\x94\x64\xf8\x72\x08\xb9\x1c\xea\xfb\x0c\xb4\x5e\x95\xf6\x4d\x46\x5b\xb3\xb4\x5a\x56\xac\x6d\x97\x7e\xd7\xb1\xb6\x95\xaa\x3f\xa2\x7e\x8d\x2e\xb5\xdc\xf3\xf6\xb7\xbc\xf5\xbc\x54\xe5\xac\xdd\xd6\x6f\x58\x73\x69\x8a\xac\xa2\x92\x25\x29\x20\x25\xb0\x69\x50\x78\xae\x6b\x1a\xdf\xaa\x06\xa5\xba\x30\xe0\x4f\xe2\x8e\xb8\x74\xea\xe7\x84\xd7\x25\xd2\x96\xd1\x15\xc9\x94\xed\x58\x67\x57\xa2\x48\xb4\x83\xad\x2a\x17\xf5\x3b\xa3\x62\x56\x1e\xd3\x61\xf1\xf1\xfb\x4c\x55\x64\x73\xda\x7c\x56\xc2\x0d\x26\x01\xf4\x9a\xc4\xb4\xa6\xaa\x5b\x7e\x3d\x0b\x00\x58\x61\xd3\xfa\xab\x8b\x8f\x6d\x1a\x37\x74\xa4\x4f\x1a\x54\x8c\xfb\x6e\xfb\xda\xd3\xf3\x2e\x55\x6b\x28\xfa\x48\xd1\x18\x1a\xd5\xaf\xe3\x5c\xb7\xe9\x0e\x6c\x6e\xd9\x6e\x58\x55\xa0\xf8\x97\x75\x65\xc4\xe3\x44\x44\x3b\x7e\x1f\xfd\xf2\x2f\x62\xcc\x33\x0f\xf5\xf3\xb9\x69\xeb\x75\x16\x17\xcb\xa9\x96\xfe\x44\x43\xa8\x98\xe7\xbe\xa9\x3d\x95\xa0\xb8\xb1\x90\x8f\x10\x9d\x74\xb9\xeb\x16\x57\xff\xbc\xdc\x08\x52\x3a\xb6\x04\xf8\x80\x6c\x58\xd0\x87\x79\x64\xd5\x3c\x84\xc0\x1c\x11\x68\x59\xd7\x94\x35\x5d\xb6\x22\xde\x87\xcf\x31\xd0\xd0\xa8\x57\x46\xc4\x83\x3e\xc1\xd0\x3b\x0a\x6f\x64\x90\xf6\x00\xd3\xa2\xe3\xa0\x05\x2e\xd3\x72\x85\x26\xd3\xc5\x7d\xde\x00\xd6\x32\xd1\x61\x3f\xa7\x33\xc5\xb7\x2c\x20\x0b\xb4\x30\xd1\xd7\x55\xdf\x75\x7d\xc9\x10\xe9\x08\x02\x6b\x48\x40\x00\xec\x19\x90\x84\xec\xdf\x1b\x1b\x02\x21\xb8\x37\x6e\x03\x63\x86\xca\xb6\x1d\x11\xf1\xb5\x5b\x7d\xbb\xf2\xb2\x92\x7d\x35\x37\x44\x4a\xf8\x36\x96\x4f\xda\xb4\xea\xcc\xea\x7f\xb6\xfa\xfc\x76\xfb\xd9\xc7\xab\xcf\x9d\x48\x96\x0a\x03\xc6\x3a\xd3\xc9\x45\xd9\x88\x9c\x04\xb1\xc6\xdb\x32\x10\xa3\xd2\x71\x09\x1d\xfd\x28\x51\x33\x57\x3c\x65\xe9\x0a\x91\x8e\x38\xee\xac\x06\x37\x94\xf8\xa8\x7f\x68\x71\xaa\x8e\xd6\x23\x22\xc4\x4a\x13\x60\x9d\x75\x2a\x57\xca\x1c\xf8\xc7\xee\xd0\x01\x0b\xe5\x24\x70\x29\xdf\x97\x55\x33\x9a\xda\x36\x5b\x11\xe5\x24\x7c\x97\x55\x8b\xe7\x74\x1b\x7a\x92\x01\x70\xf3\x95\xb9\xdb\xc7\x2d\x71\xb6\x21\x9c\x30\x2d\x5e\xc3\x84\x5a\x6a\x5b\xb5\x14\xe5\x32\x57\xa4\x8d\x62\x86\xcb\xd1\xca\xe1\x51\x8c\x20\x46\xd1\xff\x3a\x56\xd9\xa4\xf6\x34\xd2\x0c\xb1\xf6\x05\x89\xac\xdd\xd4\xf9\xbf\xb4\xb7\x6a\x7a\xe5\x89\x40\xa4\x3b\x26\x01\x2c\x3a\x9b\x9b\xf0\xbb\x08\xda\x88\x9c\xc4\x37\xd0\xf1\x3d\xf1\x3f\x9d\x58\x57\x88\x80\xd3\x4f\xa8\x54\xe2\x76\xd9\x57\x7a\x14\x48\x0c\xe1\x5b\xa0\x14\x86\xc8\xdd\xb1\xed\xaf\x2a\x63\x61\x26\xc7\xc2\x78\xc5\xd7\xfb\x8e\x3d\x31\x77\x49\x76\x3f\x38\xd2\x98\x56\x9a\x6e\xc9\xbe\x35\xeb\x06\x15\x10\xce\x55\xcb\x3a\xce\xe1\xb9\x6d\x63\xbb\x96\x38\x47\x50\x6f\xb0\x82\x25\xb9\xfa\xf9\xfa\x6d\x49\x6c\x66\x44\x57\x2b\x67\xd6\xca\x2c\xa3\x4e\xe2\x74\xaa\x7b\x3e\x80\xb2\x04\x18\x88\x39\x82\x2b\xd1\x22\xba\xa6\x54\x25\xc2\xfc\x52\xcb\xd8\xae\xa3\xbb\xdc\x0f\xb5\x10\x5b\xaa\xbe\x72\x37\x6f\xa5\x7a\x15\x61\x1a\xe6\x33\x1e\x0c\xc6\xd4\xc9\x90\xe4\x32\x47\x34\x8e\x73\xc6\x07\xa3\xa1\xdd\xc1\x42\xd0\xde\xdc\x35\x57\x09\x52\xc1\xa1\x21\x4a\xc3\xd3\x98\xe2\xcc\x74\xc1\x90\x86\xcc\xaf\x59\x2b\xe0\x1d\x2b\x6f\x8b\x72\x08\xfa\xfd\xa5\xa3\xf3\x42\xbd\xc1\xcc\x61\xa6\xb8\xca\x44\x3f\xe6\x83\x5e\x8d\x86\x27\xe8\xdc\x9b\xdf\xe1\xd1\xdb\x16\xba\xba\x5e\x12\x11\x6f\x3a\xb3\x3c\xd0\x1f\x16\xfd\xf5\xdb\x3e\xfa\x3f\xad\x0a\x1c\x0c\x67\x7c\x69\x95\xc8\x15\x61\xac\xa2\x5e\x13\x09\x72\x84\x4e\xb4\x0d\xd0\x88\x56\x56\x46\x04\x7b\x4b\x17\xed\xbc\x49\x55\xc7\xc2\x76\x17\x6a\x73\xcd\x3a\x49\x9c\xa6\x7d\x11\x1b\x0b\x10\x21\x09\xc2\xdc\x97\xa2\x7e\x22\xaa\x8a\x3d\x7b\x2d\x58\x06\x74\xd5\x74\x65\x2e\xd7\x36\x40\x35\x71\x88\x6a\x6c\x2d\x63\xf4\x1c\xe1\x32\xb3\xf6\xef\xdc\xcb\x36\xd8\x4b\x4b\xaf\x0c\x3b\xa8\x7a\x27\xc3\xf3\xd3\xb4\x8e\xa3\x6d\xfd\xcb\xdb\x4d\x4a\x68\x18\x76\x3f\x5b\x43\xd5\x4f\x8f\xfd\x42\x9a\x65\x9d\xc4\x34\xcd\x7d\xda\x2e\x1e\x5e\xa4\x1d\xad\xed\xe2\x31\x9a\x24\x1e\xa8\x4e\x00\x7f\x4a\x47\x25\xad\xc0\xc6\x7c\x43\xd4\xa9\x7c\x3d\xfb\x9a\xf8\x91\x2f\x27\xa5\xa1\xaf\x88\x63\xe1\x12\xe6\xcd\x71\xcf\x67\x0f\x27\xe6\x3f\x7b\x31\x90\x97\xbe\x4a\xd9\x70\xe5\xa4\x24\xbd\x07\xa2\xd7\xac\x66\x67\x67\x8f\x5f\x8a\x06\xec\xec\x31\x89\x8e\xf1\xb6\xb3\x9a\x4f\xee\xe4\x71\xd7\xed\xda\xaf\x9b\x62\x21\x4a\xda\x50\xa1\xfb\x22\xde\x17\x75\x9c\xa0\xf8\x15\xb8\xda\xb0\xf4\x65\x1a\x97\x3c\xe4\x97\x20\xe0\x25\xdb\x0b\x66\x27\xc4\x4f\xf1\xc7\x57\x22\x40\x42\x76\x21\x6c\xcd\x7d\x9d\x80\x89\x7f\x38\x10\xdb\xdc\x35\x9e\xcd\xbe\x4c\xdf\xdc\x6f\xe2\x6a\x2d\x2d\xd0\xaf\x68\xc5\x3f\x23\xf0\xca\xb3\x07\x75\x49\x38\xfe\xac\x2f\xcb\xb8\xd9\x2f\xe4\x57\xd4\xca\x4f\x2d\x7c\x46\xdb\x0a\xdb\xbd\x16\x96\xf2\x53\x0b\x1f\x6c\xeb\x6c\x6d\xcb\xd6\xfc\x6b\xf6\xb2\x49\x53\x59\x77\x6b\xf9\x22\x70\xe2\xa3\xe9\xb8\xea\xbf\x33\xab\x3a\x48\xd9\xb2\xfd\x6d\x60\x96\xf9\x76\x16\x17\xbb\x6d\xcc\x6c\xb8\x05\x50\xed\xab\xb9\x83\xc7\x11\x5b\x81\x04\x2f\xd0\xad\xbe\xdc\x64\x77\xee\x2d\xef\xe2\x86\x03\x51\x11\x82\x21\x79\x3f\x68\x28\x21\xf4\x79\x73\x63\xc7\x7e\x43\xdc\x70\x55\xe7\x74\x4e\x06\x6d\x12\x3a\x72\xe3\x16\xfc\x90\x47\x74\x3c\x84\xcf\xbf\xdd\x06\x66\x8f\x6f\x67\x2c\x65\xf9\x55\x04\x7b\x10\x9c\xb5\x41\x0e\x3a\x28\xe3\xef\x46\x35\x6c\xe3\x87\x2a\x09\x8d\x90\x1a\x47\x4e\x7c\x9c\xd0\x56\x2b\x41\x38\x9a\xc1\xb0\x60\xba\x08\x2a\x38\x93\x82\x01\xfe\x96\xd0\xf6\xba\xe8\x13\x37\xa6\x23\x92\xbc\x87\x63\xe8\xab\x9c\xd8\xbf\x4a\x61\xee\xc3\xd4\x0f\xaa\x08\xf3\x57\x17\x7f\x6a\xfc\x27\x96\xd4\x54\xdd\x34\xe9\xba\x33\x6a\xb1\x88\x30\x15\xb0\x15\x64\xd4\xb9\x43\xc6\x4e\x56\x56\x64\x7c\x91\xaa\x21\xcf\xa7\x15\xf1\xbe\xf2\xa8\x9c\xf5\xf8\x58\xae\xd2\xb4\x5a\x76\x71\x9e\x56\xa0\x95\xbe\x18\x8d\x9b\xa3\x4c\x0c\xf6\x49\xd8\xa4\xb9\xd8\xdc\x26\xaa\x26\x06\x7d\x4c\xd4\x21\x06\x79\xaa\x8a\x6f\x01\x3c\x54\xb5\xa3\xbb\x3e\x55\xb7\x93\xab\x7f\xa0\x96\x6c\x33\xd7\xa0\x99\x26\x13\x6c\x80\xd4\x31\xf3\x2d\x93\x78\xee\xd6\xc4\x2e\xad\xdb\x82\x27\xc3\x85\xe1\x83\xaf\xcb\x8c\x7d\x2b\x20\x45\xd0\x9d\xa5\x4d\x65\x2f\x1b\x4f\xf3\xc1\x5a\x28\x43\x81\x48\x2a\x4b\x8c\xcc\xcf\x4b\x26\xc6\xce\x4a\xf7\x8a\x6e\x45\x02\x3a\xca\x4a\xec\x94\x4a\x22\x61\xfc\x47\x2d\xd3\x01\x02\x79\xb8\xb1\x69\xa8\xcf\x56\xd9\xaf\xed\xc1\x52\xb6\xa9\xf6\x77\x86\xda\xbd\xab\x59\xab\xce\x49\xbf\x23\x8a\x46\xb2\x55\x01\xb1\xae\x48\x43\x33\xf6\xaa\x2f\xa0\x96\x88\x59\x16\x2b\xe2\xb6\x83\x24\x2f\x73\x64\x31\x49\x77\x9b\x2f\x12\xb8\x4e\x98\x88\xcc\x19\x60\x7d\x98\xcc\x14\x43\x52\xc4\x81\x0b\x9a\x83\x63\x97\xb6\x3d\x0b\xab\x65\xad\x60\x0f\xcd\xd3\x7d\xc0\x5d\x0d\x89\x15\x88\xb9\xa5\xfa\x32\xc0\x1c\x9a\x25\x68\x51\x20\x8a\xc2\xb6\x7f\xbe\xb7\x4d\x81\x57\x79\x67\x23\x6c\x58\x9d\x47\x5f\x10\x32\xed\x86\x70\xa3\xe5\xec\xc1\x36\xff\xf2\x96\xc7\x47\xd5\x7a\x4f\x52\x50\xa6\x78\x20\x60\x11\x19\x34\x4a\xae\x27\x59\x09\xff\x98\x50\xdf\xed\x2b\x1a\xb9\x17\x51\x0e\xb5\xb4\x29\x05\x56\x5c\x1c\xae\x3c\xd1\xc9\xf1\xc8\xe2\x79\x43\x07\x8b\x98\xfc\x79\x74\xf5\x0f\xb8\x0c\x65\x24\xa4\xb0\x79\x9d\xbe\xef\x7b\x12\x9e\x8a\x32\xc5\x01\x11\x21\x01\x9d\x41\x94\xc9\x58\x9d\xdb\x11\x4d\x6d\xcf\x09\x29\xa7\x9d\x00\xb1\xee\x1d\x9a\xca\xb9\xf6\x0f\xd1\x06\x6e\x57\x5e\xf7\xc4\x0c\xb2\xea\x19\x9d\x87\x2e\x03\x11\xad\x08\x5d\xe5\xe1\x48\x7c\x20\xf6\x0a\x82\x92\xa8\xf4\x45\x17\xd4\x53\xc3\x35\x31\x75\x76\xc8\xde\x68\x70\xfa\x06\x2b\x32\xc4\x57\x5b\x12\x8f\xd5\x66\x6c\xfd\x0c\xec\x41\x4c\x20\x6a\xe2\x2e\x0c\x06\xa7\x3e\x64\xbf\x7a\x95\x66\xe2\xd1\xb4\x14\xee\xc4\xbb\x57\x8f\xd3\x24\x3d\xa7\xb6\x0a\x62\x3d\x2e\xd6\x7d\xe7\x30\xfd\x37\xb8\x81\xaf\x67\x6b\x38\x4f\xa5\x6a\xb2\x52\x17\x33\xd1\x07\x57\x99\xc7\x4c\xcf\xfe\x5c\x13\x21\xae\x2b\x28\xfc\x2b\xe8\x45\x3b\xd1\x90\xb0\xc7\x99\x75\xe4\x83\xcb\x99\xd1\x74\xa9\x17\xda\x5e\xdd\x42\x8c\x27\xda\xec\xbc\x2e\x8a\xfa\x0d\xb4\x60\xc4\xa5\x65\x3b\xb1\x4c\xd0\x36\xc7\x40\x32\x8b\x57\xd2\xec\xa5\x11\xbf\xad\x12\x4f\xaa\x41\xd7\xca\xd5\xa2\x87\xd0\xca\x56\xa8\x2a\x25\xe6\x73\x47\x37\xd0\xfb\x42\x6b\xae\x26\x2e\xa8\x63\xca\x39\xe3\x71\x70\xe8\xcd\x05\x2e\xc2\x10\x7b\x33\x59\x0e\x97\x3d\xde\x83\x13\x57\xfa\xe1\xda\xd8\xc5\x1d\xe1\xc5\x4a\xc4\x4a\x9e\xd1\xb8\x39\x58\x3b\xb8\x45\xd8\x64\x8b\x09\xbf\x9f\xd9\x37\xc6\x87\xef\xf5\x2c\xf4\xf2\x1b\x39\x72\xe9\x06\x89\xcd\x71\xa6\x78\xa5\x65\x26\xfa\x44\x50\x85\x5a\xf6\x59\x9d\xb7\x38\x63\xe3\x6d\xf4\x2c\x4d\xe8\x28\x3d\xb6\x22\x14\x3c\x22\x8a\x6c\xcd\x7a\xa2\xd6\x7a\x4d\x60\x7d\xa7\x34\xa4\x33\x1a\x75\x4a\xc2\xb2\x31\xa3\x9c\xd1\xb8\xfa\x2c\x81\x5b\x27\x1d\x92\x3f\x9c\xce\x66\xbb\x7e\x45\xcd\x59\x0f\xc5\xc7\x69\x93\xd3\xda\x1a\x05\xac\x99\x8a\xfa\xa5\xb2\xee\x65\x24\x3d\xc1\x81\x8f\x2b\xb1\xee\x86\xcd\x39\xe0\x54\xb6\x81\x8e\x26\x2b\x36\x19\x73\x57\xf8\x57\x59\xf8\x02\xa2\x24\x40\xdf\xa4\xab\x88\x4d\x0e\xc0\x45\x35\x89\xb0\x66\xfc\x89\xb3\x0b\x78\xa6\x22\x4b\xc5\x2d\x5d\x57\xfd\x61\x32\x90\x3c\x07\xa6\x36\x35\x23\x06\x7b\x6c\x35\x61\xa1\xd8\xc9\xbe\x21\xe7\xf0\xb7\x64\x42\x7c\x92\x44\x67\xf5\x3e\x4e\x02\x4f\xe0\x33\xf1\x04\x86\xe8\x2b\x16\x5b\x42\x5d\xe5\xac\xdf\x25\x90\x34\x07\x2e\x9f\x11\xd4\xf8\x84\x2d\x48\x70\x0b\x01\xac\xe4\xe8\x7c\x43\x2d\x22\x87\x34\xbc\x31\xf5\x2a\xb0\x86\x7a\xd7\x0f\x7a\xf5\x32\x2a\x3c\xb5\x33\x81\xee\x6f\x58\xc7\x28\xb4\x98\xb1\x73\xbe\x96\xc7\xa3\xfd\xa2\x92\x1c\x23\x67\xd2\x3b\x70\xb2\x51\xff\x99\xbd\xf5\xb5\x82\x9d\x20\xab\x7a\xc8\x9a\x17\x24\x95\xd0\x25\x1e\xf8\x9d\xaa\x29\x5d\x0d\xeb\xab\xbd\xe8\x60\xc4\xf0\xae\x76\xf8\x68\xb5\x8f\xf0\xf5\xa0\xfd\x7e\x68\xb8\x37\x76\x7b\x63\x43\xee\xdb\xae\x2e\x0d\x22\xbc\xfa\x07\x3c\x0f\x04\x70\x68\x74\x26\x41\xad\x6e\x55\x37\x2f\xd0\xac\x9a\x3f\x31\x5e\x0f\x57\xdf\x9b\x5d\x0a\x2e\x6d\xe4\xbb\xe9\x7a\x3b\x2a\x97\x8c\xfa\x27\x04\x58\x75\xa6\x8e\x96\xbb\x21\xf0\xe5\xdb\x41\xfa\x75\x33\x63\xe4\xb3\xcc\x4a\x48\x98\xaf\xc4\xb3\x21\x35\x2e\x93\xa0\x8b\xb8\x62\xa5\xfc\x6e\x3d\x2e\x3f\x18\x9d\x3d\x42\x3a\xca\xd8\x77\x26\xbe\xe1\x30\x99\x93\x31\x65\x17\x75\x64\x83\x18\x09\x07\xf1\x4c\x48\x90\x62\x34\xac\x9f\xf3\x35\xc4\x0a\x5a\xef\x71\x68\x10\x96\xe3\xf2\x9d\xed\x41\x59\x1c\x55\x29\x4c\xf0\xe5\x66\xf9\x86\x9c\xf8\x60\xd0\xee\xfe\x58\x2d\x4d\x30\xe5\x24\xb8\x0c\xf3\xc8\x1b\x86\xf2\x6f\x82\x0f\xd8\x56\xed\x0c\x2b\xe2\xc6\xa0\xca\x27\xdb\x97\xf6\xfd\x21\xd8\x46\xba\xba\x09\xcb\x88\x48\xd3\x5a\x47\xa4\x13\xe0\x55\x68\xc8\x8c\xb7\xfa\xa1\x72\x38\xc3\x8b\xcb\xba\x08\x45\x8c\x9d\xef\x83\xe6\xad\x09\xb9\x8f\x14\xf6\x23\xdc\xcb\x2f\x09\xc4\x75\x29\x83\xfc\x09\xd7\x27\xd5\x10\x4e\x21\xdd\x26\x63\x25\x89\xe9\xc0\x7c\x50\x9d\x9a\xed\x97\x16\xcf\x5c\x08\x29\xc1\xb1\x37\x03\x84\xae\x9d\x30\xa5\x75\x6b\x03\x15\x1d\x14\xea\x34\x86\x62\x5d\xc5\xec\x1c\x31\x1d\xa9\x50\x1c\x8f\x89\x55\x54\x55\x89\xef\x93\xce\xb2\x51\x61\x09\xb5\x88\x6e\x2b\x9e\x8a\x04\x3d\x81\xff\xca\x49\x7a\xea\xc0\x7b\x45\x65\xdf\x8a\x09\x67\x30\x10\x73\xb2\x42\x82\x17\x9c\x2e\x6e\x3c\xc9\x3e\x9a\xc5\x49\xc2\xc7\x5d\x3d\x08\x70\xc8\x06\x62\x29\x74\xfe\x0c\x16\xea\x20\xc3\xcf\xcb\xc0\x0c\x04\x2b\xc4\x82\xd9\x0f\x5d\x83\x0f\xb1\xf9\xcc\x23\x4f\xe7\xfe\x6b\xad\x3e\x9b\x54\xe4\x39\xb6\x71\xf5\x43\x81\xc4\x8e\xda\xac\xd4\xc4\xbc\x87\xf4\x0c\xf3\x15\xec\xa3\xa7\xfb\x20\x23\x54\xf9\x4f\x32\x12\x16\xc2\xb4\x38\x7a\x88\x45\x43\x45\x3d\x2b\xc7\x13\x07\x82\x6f\x7c\x89\xeb\xec\x09\x6d\x85\x2f\x8f\x15\x50\xc4\x42\x71\x03\xe7\x46\x1f\x40\x8f\x7f\x19\x8b\xcb\x4a\xab\x34\x50\xd8\x1c\x4f\x26\xe0\xce\xd8\xe1\xd7\x38\xeb\x24\x82\xdd\x5a\x99\x2b\x89\x2c\x2c\xa8\xe2\x34\xd2\x9a\xcb\xfb\x07\x46\x17\x8c\xa6\xda\x1a\xfe\xc5\x0d\x14\x71\x98\x66\x29\x5a\x24\x9e\x97\x2a\xf2\x3f\x6b\x69\xb9\xab\xcd\xe7\x5f\x62\x73\x0b\x31\xf8\x1a\xbf\xd2\x8a\xc5\xb6\xa2\x0c\x8e\xf0\x67\x1f\x6b\x0d\x78\x49\x3f\xee\x57\x47\x98\xe7\x67\xb1\xff\x3c\x82\xb1\xd2\x94\x1c\xeb\x3c\x7d\xf8\xe5\x84\x7d\x47\x41\x82\x6a\x06\x4c\x0c\x13\x95\x28\x47\xd8\x4d\x59\x31\x04\xbb\xeb\xe7\x71\x03\xcb\x6b\x81\x7d\x0e\x1e\x76\x05\x5d\x6f\x58\x8c\x20\xf6\x63\x25\xb8\x26\xe3\x7e\xae\xbe\xbf\xfa\xe9\x92\x70\xfd\xdc\xde\x21\xec\xb4\x77\x18\x40\xbc\xcd\x7e\x53\x91\xa7\xfb\x11\xb9\x44\xe7\xa1\x2a\x04\x78\x16\x07\xba\x1f\x53\x8d\x79\x9f\x71\xb5\x63\xd5\x9f\xc1\x69\xd5\x7b\x05\xc1\x55\x4d\x35\x7b\xee\xae\x7f\x80\x3e\x1a\x9f\xd7\xaa\xcf\x85\x93\x18\xf5\x9a\x9b\x23\x1a\x5e\x85\x60\x99\x9d\x68\x32\xb8\x0b\x1f\x19\x7c\xc9\x13\x27\x6c\x69\x86\x6c\xf1\x65\xb8\x1a\x82\x35\x87\x40\x16\x6f\x0e\xf7\xf6\x3d\xf1\xa6\x3a\xae\x83\x06\xe0\xc1\x4e\x0c\x21\xae\xf1\x29\xc0\xcd\xb8\x73\x34\x1c\xb3\x10\xe1\x1a\x1c\x44\x9e\xa0\x0a\xb2\x1c\xd8\x41\x02\xce\xb6\xa2\x2e\xe2\x2d\x3b\xab\x3d\x8d\x1e\x3f\xb6\x30\xb2\x29\xaf\x73\xac\xa2\x69\xb4\xaf\x73\xde\x1e\xc2\x3f\x5d\x6a\x57\xc4\x9c\x10\x5c\xb8\xff\x8b\x99\xa0\xd1\xc3\x24\xcc\x76\xd6\xd5\x74\x98\x07\x75\x8d\x3f\xbf\x9b\xc2\xbb\x5a\xb1\x88\x4d\xe4\x38\x35\x70\x88\x2c\xac\x42\x9d\x13\xe7\x0c\x86\x53\x1f\x0e\x8b\xcf\x56\x7e\xad\x56\x6a\xf9\x76\x34\x90\x00\xc6\x5f\x2d\x23\x8d\xe8\x25\xaf\x0c\x44\x56\xc5\x0d\x97\x1e\xcb\xbe\xe7\xe7\x24\xba\xa1\xd0\xdc\x55\x2b\x1a\xf6\xe2\x7e\x00\xf0\xa4\xde\xc1\xbb\x85\x8b\xdc\xe6\xb9\x9e\x57\xdc\xad\x6f\xad\x21\x72\xb0\x63\x23\x17\xeb\xf6\xcc\xb4\x63\xae\xb9\xe4\xb5\x5c\x3c\xc1\xe2\xb5\x74\xdb\x1e\xea\x32\x1e\x40\xf0\xf2\x0c\x45\xdd\x65\xa4\x2a\x6f\xec\xa0\x1a\x55\xb8\xfa\x27\x31\x97\xb2\x53\xad\x2c\x17\x7f\xb1\xde\x56\x83\xfd\xe2\x8e\x8e\xc5\xd2\x78\xf2\xe2\x0f\x47\xea\x7e\xa8\x50\xfe\xd6\x19\xc7\x55\x3b\x02\xe3\x69\xd0\x88\x0d\x61\x78\x0e\x58\x43\x1a\xdc\xa7\x2e\xb6\xb7\xc8\x27\x1c\x96\x83\x92\x56\x19\xa1\x8c\xe7\x25\xa8\xc5\xae\x83\xac\xc1\xa1\xe9\x87\x60\xb2\x5b\xb0\x18\x4e\x8c\x31\xa4\xbe\xe2\x48\xce\x64\x91\xe8\xe3\x47\xe2\x19\x00\x1f\x2d\x78\x8b\xa6\xa5\x79\x9b\xe1\xdc\xd6\xb6\xf4\x91\xad\xb6\xec\x27\x84\x27\x4c\x44\xb0\xb0\xf1\x70\x2c\xf7\x4e\x5b\xa0\x1b\xb6\x08\x4d\x66\x01\x94\xe6\x9f\x0a\x87\xd7\x0e\x1d\x0f\x39\x1b\x82\xe7\x26\x6b\xda\xeb\x99\x9b\x16\xa6\xf6\xc7\xc7\x7c\xbd\x7b\x87\xf2\xef\x46\x7d\xfe\x64\x9d\x21\xf8\xe0\xc0\x82\x0d\x71\x9d\xd1\x3f\x1f\x45\xde\x6b\x99\x4b\x66\xe7\x54\x5e\xa3\x9d\x81\x2e\x8f\xfd\x8d\xd8\x0d\x99\xd6\xd8\xf4\x3b\xed\x6c\x73\x06\xe4\x6a\x40\x9c\xc8\x2f\x8c\xfe\xc0\x5a\xce\x7e\xf3\xec\xbb\xab\xef\x03\xec\x23\x2a\x88\x08\x86\x09\x79\xf4\xf0\xab\xeb\x1f\xa2\x93\xa7\x7f\xf8\xf2\xe4\xd9\xc9\x9f\x2c\xa7\xf1\x91\xf5\xaf\x1d\x8c\x87\xb7\x8f\x86\x8d\x37\x18\x78\xc7\x18\x94\xaa\xa3\xaf\x38\xc3\xc9\x46\x0f\x00\xcc\x0e\x8b\x3b\xe6\xc4\x10\xdf\x97\xab\x9f\x7d\x03\xed\xe6\xeb\x99\xd8\x1c\xce\x58\x8d\xeb\x6c\x5d\x62\x1c\x97\xdb\xe7\x0c\x60\xca\x7f\x5d\xff\xb0\xcf\x9c\x6e\x1c\xd6\x96\x88\x99\x18\x51\xfa\xe2\x41\x51\x4c\xfc\x03\xbb\x9a\xc5\x6e\x88\xb4\x66\xab\xb4\xba\x14\xbf\x8d\x3c\x2d\x32\xd5\x74\x55\xc2\x62\xf5\x84\x0a\xf0\xaa\x02\xf8\x06\xca\x55\xf1\x4d\xa4\x9b\x09\x2f\x4f\x29\x41\x81\x7b\xf2\x24\xbd\x7f\xd6\xee\xe8\x8e\xad\x89\x26\xb6\x8b\x5b\x7d\x16\x35\x69\x12\xc1\x35\xf3\xd6\xe7\xac\xe9\xa0\xfd\xa0\xf2\xcf\x47\xf5\xf1\x44\x7a\x0d\x0a\x3a\xf4\x7d\xe2\x93\xaf\xbc\x6c\xec\x5d\x81\xec\x3d\x7b\x32\x3b\x21\xda\x06\x7e\xfb\x76\x59\x37\x8c\x14\xbc\x41\xe0\x81\xb6\x99\xc9\x1d\x55\x39\x01\x05\x1b\x41\xb8\x4c\xcd\x50\xae\xbe\x87\x84\x5f\x18\x31\x65\xa0\x61\xba\x3b\x5b\x17\x75\x65\x37\xe6\x49\x01\xf5\x20\x3b\xca\x54\xd8\x67\x78\x2d\xc9\xab\xff\x83\x1e\x77\x37\x3e\x1a\xd6\x90\x01\xcc\x90\x06\x34\x0e\x58\x44\x3d\xf0\x59\xea\xf9\x68\xc6\x33\x62\xbb\xc1\xa9\x18\x46\xe4\xe5\xb9\xf8\x13\xe6\xf2\xf4\x0a\xef\x20\xd9\x40\x11\x14\x8d\xb6\xd6\x14\x57\xce\x97\xcb\xbc\x37\xdc\xf8\xa7\xe2\x5a\x8c\x44\xd3\x9e\x31\x7c\x68\xf9\xb2\x88\xce\x16\xcb\x22\x1f\x11\x76\x80\x43\x0e\xf0\xaf\x4d\xd6\x65\x9b\x0a\xae\xb9\xe6\x91\x20\x9d\xca\x75\x17\xcd\x6d\x41\x64\x02\x17\xb4\x33\x3c\x98\xae\xda\x74\xf1\x34\x6b\xe3\xca\xfe\xb4\x47\x52\x98\x0f\x2a\x71\x9a\xa9\x96\x7d\xe7\xa8\xab\x38\x51\x47\xcb\x3a\xef\xf5\xa7\x5f\x6f\x25\x25\x11\x24\x05\xda\xc4\xde\x54\x8c\xfb\xae\x5e\xd2\x8c\x3a\x73\xe0\xf7\x5a\x54\x58\x7d\x18\xdd\x2b\xad\x55\xe0\xc8\x59\x81\xc5\xb8\xda\xda\x4d\x71\xde\xb5\x49\x7a\x1e\xf7\x85\xb1\xaa\x2c\xfe\xe8\x3d\x16\x3a\x8d\x0b\x8d\x4a\x40\xe8\xb1\xaf\xe0\x50\x96\xc4\xc1\x17\x59\xd5\xaf\x2f\x63\xf8\x40\x18\x25\xcf\x8a\x24\x65\xb0\x7e\x3d\x7f\xae\xee\x65\x97\xc0\xce\x74\x47\xce\x53\x58\x77\x0a\x8f\xf4\x98\xc6\x32\xd8\x5f\x2f\x88\x15\x14\x07\xe5\xe8\xa4\x89\xd5\xdd\x29\xba\x03\x69\xfb\xae\x01\x24\x3e\xb8\x61\xd9\x41\xe1\xc4\x3d\x27\x2c\x94\x41\x59\xc3\x2d\x0c\x48\x70\x92\x17\x7b\xa0\xa7\xfb\x10\xf1\xbb\x4b\xc5\x48\x0a\xab\x15\x31\x7e\xda\x14\xf3\xd5\xed\xbe\x02\x5e\x78\x4a\x7f\x47\x67\xfc\xf7\xec\x0d\x7c\x0d\x60\xd7\xb9\xfe\xe1\x12\x57\xaf\x32\x76\x9d\x4d\x0c\x6c\xe6\x99\x76\x68\x25\xc4\xa4\xd3\xe4\xad\x3d\xc6\x62\x86\x10\x0b\x0b\xed\xc8\x7a\xab\x1e\x94\xf5\xf9\x92\x77\x88\x25\x19\xbc\xfb\x38\x8e\xca\x38\x27\x79\xab\x2f\xa1\x70\x60\xec\xe6\x84\xcf\x88\x2b\x81\x49\xeb\x21\x4f\x96\xe6\x89\xc0\x7c\xca\xfc\x73\x6a\xf1\xb2\x67\xf7\x69\xf9\x41\xe3\x07\x58\x7d\x6c\x2b\xe0\xe5\x0f\x9a\x7b\xd4\x4e\x57\xa5\xd0\xde\xf6\x78\x0c\x1f\xb8\x23\x3d\x92\xad\x48\xf0\xbc\x50\xa2\x58\xc8\xfb\x7f\x8e\x62\x61\x5e\xfe\xfb\x25\x43\x04\x8f\xeb\x1f\xa0\x5e\xe0\xdc\x68\x55\xf4\xe9\xad\xcf\xf7\x7c\x22\x3c\xcc\xab\x9c\x89\x6d\xd0\x47\x48\xd2\xe3\xc3\xae\x73\x43\x99\x0b\xf6\x34\x07\x0c\xe8\xd3\x1d\xaf\x09\x08\x4b\x7d\x3d\x4f\x18\xf7\xee\xf6\xe3\x47\x7f\x78\x29\x9a\x00\x79\x56\x88\x91\xcb\x73\x63\x79\x71\xef\xbd\xec\xd4\xc6\x69\x9e\x65\xd6\xb6\xc2\xb9\x55\x99\x55\x9d\xba\x77\xdc\x22\xbd\x43\x92\x8b\x71\x08\xf0\x7c\x9a\xcd\xa8\x75\xee\x5a\x71\x0f\x24\xe0\x6c\x28\xaf\x23\xac\x83\xa4\x0c\x85\xdf\x47\x10\x5f\x7b\xf5\x13\xfc\xcc\x99\x61\xad\x0b\xb4\x62\x0c\xb2\xc0\xb1\xbc\xa9\x46\x95\x6e\x1a\x57\xcb\xba\x2c\xde\xe8\xcd\x8e\xb9\x3a\x8c\xde\x7f\x81\xf5\x1e\xee\x70\x12\x89\x04\x7e\x66\xb8\x09\x74\x2e\x6c\xb1\x98\xa7\x7d\xf4\xee\xc8\xc3\x92\xd8\xc2\x73\x65\x44\x9c\x37\xc0\xa5\xc5\xff\xfb\xde\x56\xdd\x7b\xef\xfc\xc1\x68\xed\xf6\x74\xa7\xaa\x7c\xf1\x44\x18\x70\xf7\xc5\xf1\x9d\x52\x82\xe7\x2f\x5e\x05\xf5\x48\xd2\x42\xa7\xf7\xfb\xaf\xff\xfe\x3f\xee\x3d\x90\xad\x7c\xd0\x35\x05\xfd\xdd\xf5\x88\xc3\xd0\xf0\x15\x5a\xf1\x55\x42\x2b\xd8\x31\x5b\x99\x84\xcd\x32\x2e\x49\x54\x64\x7c\x21\xc8\x82\x39\x3d\xb5\xd3\x7a\x9f\x09\xa8\x65\xf3\x8a\x62\x0e\xc8\x99\xc2\xf1\xce\x82\xef\x4a\x22\x2d\x2a\x99\x41\xc6\x1f\x10\xb5\xe8\x15\x09\xf7\x7f\xe9\xb3\x75\xbe\xdc\xf4\x59\x42\xcc\x23\x2a\xe2\x05\x24\x87\x8e\xa8\x36\xd7\x3f\xd2\xce\x3d\x31\x6a\x2b\x65\x18\xba\x6d\xd6\x5a\x33\xbf\xae\x6e\xce\x24\xc4\x7f\xa1\xc1\x14\x72\x5d\x97\xc4\x79\x63\xa2\x78\xbc\xd5\xf2\x33\x01\x31\x01\x3b\xad\xab\x8f\xab\x66\xbb\x1e\xfe\x79\xb0\xd2\x4b\x0f\x7f\xe4\x77\x90\xea\xd1\x60\xfa\x1a\x35\xa6\x3a\x5a\xa1\xca\x34\x38\x8e\xdc\xe0\xb0\x40\x4d\xf8\xca\x3a\x82\xb0\x6c\xd6\xd6\x15\x71\x68\x6a\x30\xd9\x00\x2f\x11\xf3\xcf\xde\xc3\x4f\xea\x64\xa6\xa4\x0d\xe4\xac\x6b\xd2\x74\x71\x72\xfd\x36\xbe\xfa\x7e\x76\x9e\x15\xf0\x32\x55\x77\x02\x44\xa5\xe8\xe2\x0d\xa0\x64\xb7\xe5\x45\x76\x94\xb1\x93\x00\x60\xe1\x94\xab\x6d\xc1\x05\x00\x9b\xd0\xcc\xa8\x4a\xbb\x90\x00\x20\xc4\x22\x33\x77\x38\x0a\x30\x83\xa0\x34\x53\xc1\x68\x72\x86\x26\x4c\x90\xc2\x76\xd1\x65\x79\xda\x81\x9c\x94\x74\xcb\xda\x8e\x76\x06\x22\x52\x51\x97\x29\xf5\x4c\x07\x4a\x0f\xdd\x6c\xcd\x9e\x94\xa0\x40\x2c\xa8\x70\xd8\x1b\x0c\x2d\x6e\xd1\xa7\xbc\x65\x63\x97\x01\x98\x4e\x9b\xf8\xcd\xe2\x31\x9d\x44\xfe\x41\xfb\xcc\x81\x88\x80\x11\x20\xdf\xca\x57\x7e\x06\xa4\x70\x91\x65\xb5\xb5\x0a\xb0\x52\x2c\xf7\xc9\xf0\xee\x4e\x27\x22\x20\xf0\x87\x2e\xc0\x36\xf2\x06\x31\x1b\x42\xa4\x87\xcd\x28\xce\x1b\x9c\xdf\x76\x11\x63\x80\xa7\xc9\xb3\x19\xb1\x89\x34\x90\x39\x87\x27\x82\x05\x18\x3e\xa7\xf8\xc3\x14\x88\x09\x50\xca\xbe\xe6\xbf\x83\x62\xfc\x23\x85\xe2\x3e\x9a\x18\x87\x5f\x2d\xdf\x35\x29\x4f\x4a\x6c\x51\xb0\x1b\xf3\xef\xe8\x81\xfc\x36\x60\xeb\xb8\x62\x1f\x12\xb4\x06\x07\x6d\x10\x13\x6e\x16\x4f\xd6\x3a\xe0\x3f\x7d\x2d\x63\x1e\x89\xdb\x8e\x2a\x30\x97\xc1\x68\xf8\x0e\xf1\x90\x1e\xd2\xcf\x08\x3f\x83\x21\x93\xa8\x45\x2c\x56\xba\xa4\x6e\x62\xc3\x6a\xbd\xaa\x7b\x88\x60\x44\xc0\x52\x3c\x77\x8e\x8d\xdb\x6d\x57\x83\xf8\xd3\xb7\x06\x9a\xe0\x5d\xdd\xa6\x91\xce\x04\x45\xa3\xa6\x19\x69\xae\xd2\x73\xf0\xad\xf8\xe4\xda\x45\x89\xc0\xbb\x28\x54\x91\x40\x82\x53\x87\x4f\x06\x15\xa7\x41\x6b\x46\x52\xb7\xf3\x39\xe5\x0f\x07\x66\xb4\xc5\xe3\xc2\x37\x4d\xd6\x19\xa5\x96\xeb\x1c\x45\x11\x17\x45\x52\xf4\xc1\xf3\x12\x77\x0a\x1e\x8e\x41\xdd\x5f\xe0\x39\x0a\xb3\x1f\xdb\xb8\x8d\xa0\xe6\x8e\x04\x22\x89\x14\x04\x0e\x09\xfb\x8f\xec\x09\x03\x3f\xc3\xef\x6d\xe4\x9c\xd1\xcf\x08\x3f\xb9\x23\x3c\xb1\xf3\xfa\xb2\x52\xed\xe2\x25\x7c\x39\x89\xeb\xca\x60\x65\xa5\x35\x3b\x8e\xfe\x8c\x19\x81\x23\x89\x32\x78\xad\x25\x34\x01\xcc\xe8\xe3\x79\x44\xb0\x24\x6a\xd4\x34\xd7\xd8\xaf\xb0\xa9\x65\x4e\x90\x73\x37\x59\x55\x61\xa9\xeb\x73\x5d\xed\xb4\x48\xbc\x46\x56\xf1\x3a\x27\xa6\x65\x9d\xda\xd1\x10\x19\xaa\x1b\xef\x94\xae\xd3\x62\xc9\xee\x44\x8b\x8c\x3d\x05\x4c\x09\x23\x02\x7b\xca\xd5\xc3\x7a\x70\xc8\xa1\x38\xee\x48\x66\x59\x9c\xd0\x8c\x68\xe5\x3e\xfe\xcc\xcc\xf5\xf3\x23\x0f\xc6\x14\x1f\xb9\x2b\x08\xf3\x39\xdd\x3e\xfc\x13\x94\xa8\xbf\x8c\x9e\x0b\xbf\x44\x07\xa4\xfe\xdf\x4a\x9c\x12\xcc\x35\x32\x91\x3d\x22\xba\x63\xc4\x0e\xa6\xe0\x69\xdb\x75\x93\xf1\x67\x6f\x23\xb4\x09\x59\xc9\x62\x4f\xc8\x45\x8e\xa2\x5e\x19\x9d\xa3\x29\x36\x6b\xac\xfa\x17\xc3\x15\x0a\xf0\x3d\x4c\xf2\x16\x3f\xf1\x31\x16\x1f\x29\x70\x9d\x39\xea\x66\xda\xe7\x2f\xb4\x95\x46\xa3\x53\x59\x6f\x78\xd7\x0a\xdd\x1f\x39\xad\x32\x58\xde\x4a\x90\x6a\xfa\x2b\x02\xaa\x8f\x34\xfe\xd8\xdc\xc7\x73\xc6\x69\x8d\x5d\x71\xb0\x30\x03\x3f\x7b\x7f\x0d\x02\xb7\x90\xe1\x09\x55\xac\xb5\x4a\x95\x2a\x7e\xa1\x05\x91\x14\x00\x99\x70\x81\x6d\xce\xd0\xb7\x02\x92\xe6\x5e\x88\x31\x91\x2c\xe9\x5a\x4c\xa7\x52\x14\x49\x51\x04\x9d\x5f\x88\x34\x6c\x5b\xf6\x84\x83\x2a\xc7\x8a\xf0\xaa\x8e\xd0\x8a\xf8\x7a\x57\xbc\x1d\xbb\x18\x4e\x1e\x11\xb8\x4f\x92\x19\x68\x55\x00\x17\x61\x70\xde\x1d\xb9\xa9\x1b\x3b\x59\xee\xc5\x56\x59\xbc\x54\x64\xc5\xf3\x95\x1e\x5b\x9c\x2e\x1e\x38\xae\xd8\x7b\xb7\xbe\x54\xfc\x47\x88\x9f\xae\x16\x5d\x98\xc6\x2c\x8c\xe9\x43\xda\x27\x64\x11\xc5\x1e\xba\xac\xea\x48\xc0\x83\xc5\x4a\x0f\x76\x23\x97\x33\x59\xbe\xd9\x7a\x9d\x0a\x1a\x53\xfb\x98\xc3\x64\x0a\x4b\x72\x31\x22\xb9\xa1\x67\x3e\x55\xf4\x45\xeb\xcd\x6f\xd6\xd0\x3c\x28\x88\xf1\x83\x09\x36\x65\x25\x0d\xdd\x8d\x36\x25\x14\xbc\x8d\x15\x19\x07\x9d\xd4\x8d\x3d\xe3\x82\x86\xcc\x61\xde\xc4\x59\xe5\xce\x3a\x35\x42\xb8\xad\x11\x3c\xde\x6d\x3d\x9c\x1d\xce\x73\x70\xba\x4e\x64\x09\xdf\x64\x9d\x9c\xee\x0f\x3d\x67\xb4\x2b\xda\x0d\x30\x00\x9e\x4c\x63\x5f\x68\x1f\xb0\x17\xb4\x07\x1e\xdd\x40\xa1\x1b\x0b\xc7\x05\xaa\x97\xea\xfc\xc3\xe7\xf3\x0b\x96\x5a\x38\xf6\x08\x7f\xfd\x58\xae\xbd\xb7\xc9\x3c\x4c\x66\xff\x59\x90\xf1\x30\x67\xdb\xaf\xe8\x48\x31\x12\x93\x3f\xe5\x74\x79\x97\x55\x5d\xa1\xb9\x4f\xcb\xb4\xb4\x41\xa7\x96\x7f\xe1\xf1\xde\xd0\xa3\xdf\x02\x5a\x44\xd7\x5f\x4f\x54\x9f\x19\x1e\x70\x3e\xc5\x0b\x9a\x32\x7d\x70\x6d\x8a\xa0\x53\x29\x63\x5b\x7a\xce\xe6\xad\xbe\xb0\x1f\x20\xaf\x73\xf8\xc9\xcb\xd8\xb5\xa1\xa8\x9c\xf8\xa1\x36\xfe\xb3\xfd\xca\x94\xe1\x25\xdb\x1f\xcd\x27\x79\x22\xcf\x6f\xd9\x1f\xb6\x79\x66\xbf\x13\xea\x33\xdf\x21\x21\xd8\x97\xe5\x88\xed\x29\xf6\x5f\x30\xc9\xde\xd7\xf9\x88\x1d\xf6\xca\x70\x59\x51\xac\xa5\x2c\xee\x78\xc5\x6b\x62\x82\x9b\xe5\xb0\x81\x0c\x4a\x3b\xe8\xa0\x7c\x50\xcb\x63\x0f\x58\x6c\x84\xb1\x08\xfa\x3b\x0c\x38\xdd\xfb\x21\x78\xab\xf5\x7a\x39\x1e\x0c\xa2\xe0\xbc\xbb\x22\x89\x79\x61\x77\x74\x19\x13\xbf\x1a\xe2\x99\x8a\x9a\x74\x4a\x6c\xf0\xaa\x12\x91\x44\x3c\x54\x12\x84\xba\xb8\x8a\xab\xf1\x24\x7c\x00\x09\xe9\x32\x31\x6a\x98\x98\xc3\x86\x22\xb6\xe8\xf8\xeb\x22\x57\x4d\x24\x21\xa7\x72\x74\x8d\xe8\x76\x8a\x21\x93\x37\x6c\x54\xb8\xdc\x15\xc4\x1b\x69\x0c\x06\xdd\x77\x7e\x2a\x41\x77\x30\xe8\x25\x3c\x1a\xc3\xce\xa4\x2d\xab\xbe\x9d\x8b\x71\xe5\x29\xee\x56\x0c\x46\x2c\x49\xe9\x46\x00\xf9\x52\x5d\x62\xd4\xe4\x10\x1d\xaa\x9c\x55\xe7\xb5\x43\x48\xd5\x7f\xfd\xb7\xff\x09\x2e\x60\xaf\xb5\x60\xd9\x9c\x47\x60\x84\xd7\xac\xa9\x02\x56\xae\x85\x4c\xdc\x02\xd5\x7f\x0a\xa8\x5b\xd1\xaa\xef\x3a\xb0\xfd\x2b\x30\x8f\x74\xb3\x15\x2d\xd1\x56\x02\x39\x23\x4e\xd2\x68\x60\x54\x0f\xc8\xee\xc0\xa8\x42\xa5\x75\x2c\xa3\x41\xbd\x43\x15\xa8\x8f\xc5\xd7\xad\xf2\xf6\xef\x84\x36\xb8\xd5\x89\x66\x0e\xc9\x31\x8e\x92\x16\x4c\x05\x87\x5f\x25\x28\x88\x34\xca\x47\xbd\x8b\x57\x8b\xdb\x89\xfa\x42\xdb\x4d\xc4\x79\x36\x45\xb9\x3d\xcb\xa6\x58\x85\x75\x7f\x8f\xa7\x8a\x40\xcf\x5b\x5e\x80\xc5\x19\xab\xc6\xb3\x28\x95\x03\xb1\x77\xa7\x52\x2b\x4c\xdd\xb8\x2e\xc0\x01\x43\xc0\x89\xd6\xf3\x41\xd5\x89\x7e\x0e\x5c\x37\x57\x4a\x02\x42\x3a\xd5\x76\x2c\xb7\x6a\xdc\xa2\xc4\x1d\x26\x51\x7f\xe2\xfb\x1c\xa1\x57\x54\x03\xc1\x21\xc3\xac\x1a\x62\x0a\xb6\xd5\xc8\xc8\xb4\xaf\xc4\x70\x2c\xce\x10\x34\x21\x9e\x1a\x26\x83\xcb\x11\x4d\xe0\x9b\xac\xd0\x59\x65\x75\x3d\x49\x9f\xbb\xf8\xbc\x13\x95\x4b\x62\x76\x88\xd9\x07\xd3\xa5\x95\x61\xef\x5b\xc5\xdb\x96\x83\xcf\x0c\x3b\x6c\x39\x7e\x23\xd4\x65\x45\x3c\x51\x34\xe7\x43\xd9\x11\xf7\x29\x84\x65\x02\x02\x28\x43\x20\x52\x90\xa4\x09\x08\x38\x96\x55\x9d\x8a\x3a\xaf\x24\xc6\xe3\x25\x6c\xcb\x89\xef\x08\xcc\xaa\x92\xa9\x11\xa4\x71\x3b\xa8\x6c\x4c\x20\xef\xdf\x48\x59\xb7\x1d\x88\x25\x3c\xa5\x1e\xaa\x9e\x04\x4f\x9d\x4a\xe3\xca\x36\xb5\x2e\xd2\xb5\x57\x2d\xbe\x3c\x50\x09\xf7\x8d\x37\x6c\xe1\xfc\xcc\xbe\xf9\xed\x6b\xe2\x16\x6f\x7f\xf3\xbb\xd7\xad\x30\x8a\x5e\xe8\xb8\xdb\xdf\x7c\xf2\xba\x8d\x72\xc6\x6c\x1c\x66\x22\x71\xb7\xc1\xb6\xb5\x3c\x27\x31\x7e\xc1\xed\xbc\x77\x65\xd6\xc9\xd4\x7d\xbb\xe0\x27\x41\x6e\x3b\x2a\x84\xce\x39\x83\xfa\xce\x7d\x13\x24\xc1\x08\xfa\x64\x8c\x23\x12\x2d\x02\xbd\x2b\x3c\xc2\xd6\x97\x4b\x5d\x91\x16\x28\x84\xd7\xc3\x56\x94\x02\x98\x25\xba\xc5\xb7\x76\x29\x7e\x03\xb6\xf9\xb6\xac\x82\x89\xc5\x85\x6a\xa2\x1c\xfe\xd6\xd4\x36\xce\xeb\xd2\x88\x0d\xa0\x78\xbf\x17\x68\x7d\xf8\xc5\x76\xf5\xd4\x3c\x12\xc4\xd9\x66\x6f\x8f\x92\xa3\x03\x5e\xfe\xde\x8e\xb3\xb6\x9e\x71\x8f\x53\x8e\x60\x05\x55\xa8\xe8\xf6\x73\x51\xe6\x07\x18\x91\x7f\xf0\x64\xbb\xb0\xc0\x0c\x47\x00\x5e\x99\xed\x87\x0d\x30\xf7\xa1\x9b\x94\xd7\x53\xc1\xf4\x9d\x7a\xec\x98\x09\x2d\xbf\xa1\xb9\xfd\xb8\x92\x92\x5c\x73\x04\x2d\xf8\x60\xa7\x74\xb5\xb3\x04\xc7\x8e\x0e\xc7\x2d\xbb\xf0\xfc\xeb\x73\x3e\x43\xe2\x4b\x89\x21\x77\xde\xa2\xcb\xb0\x3e\xa8\x0d\x6f\x9c\x7e\x4b\xaa\x53\xa0\x4a\x1f\xd0\x96\x78\x81\xa4\xf6\xb9\x65\x2b\x31\xa2\x33\x18\x3d\x60\xe8\xee\xba\xcc\x76\x00\x67\x5e\xc4\x94\xe0\x7f\x5c\xaf\x26\x78\x13\xac\x0a\x1c\xb5\x69\xed\xdd\x25\xdf\xd3\x42\xbf\x99\x10\x79\xe6\xdd\x3b\xab\x09\x02\xf7\xd0\x33\x82\x88\x20\x9e\x89\x78\x87\xe7\x6a\x46\x13\x51\x21\xda\x3e\x1b\x10\xed\xf9\x61\x65\xa0\x0d\x86\x60\x86\x15\x28\x17\x4c\xcf\x24\x1e\x72\x64\xff\x11\xf5\x97\x10\xab\x8e\xeb\x0a\x8b\x69\x8e\xb5\x65\xca\x88\x11\xda\x64\xc3\x72\x78\xb9\xd0\x65\x4c\x03\x82\x2d\x85\xee\x54\xb6\x8e\x1b\x90\x75\x0e\x01\x27\xe7\x21\x45\xaa\x8b\x82\xfb\x54\xf0\x5d\x23\x41\xe8\xc8\x4c\xdd\x72\xaa\x36\x3b\xdb\x0b\x9c\x38\xd9\x4c\x82\x38\x67\x47\x06\xf5\x3d\xed\x8f\x71\x3c\xe4\x73\x3a\xf4\xab\x6e\x95\xf6\x72\x08\x98\xc0\xf7\xfe\x03\xfd\xee\xa7\x07\x65\xdd\xef\x65\xfc\x93\x9e\xa3\x1e\x7a\xdc\xc5\x0d\x3c\x5b\x88\xb5\x12\x14\xf9\x84\x1f\x38\x5e\xff\x58\x7a\x07\x93\x2e\x61\xbc\xde\xe2\x52\x3b\x5e\xed\x5b\xd1\x2c\xa8\x42\x01\x27\x11\xb2\x7b\x1c\x41\x39\x46\xe5\xdf\x4e\xd4\x4d\xe8\x80\x83\x29\xf4\xea\x9a\x4f\xdc\xc0\xb7\x33\xb1\x8a\x38\x41\x70\x3a\x56\xbf\x00\xd1\x0d\x86\x4e\xc9\xaa\x3a\x7d\x58\x96\xf0\x9e\x38\xef\x6a\xb6\xf9\x4e\x56\x93\x3d\xbc\xfe\x01\xd1\x78\x40\x39\x7c\x9f\x6c\xf3\x22\x2f\x09\x5b\x56\xeb\x45\x10\x71\x3f\x93\xa1\x09\x5e\xe0\x67\xde\x61\x6f\x88\x5f\xba\xe8\x20\x8c\x0f\x87\x21\xff\x2e\xf2\xc9\xc1\x06\xd6\x28\xb6\x42\x59\x9b\x93\xae\x54\x0d\xa3\x7e\x5f\x74\xb0\x2c\x55\x3d\x4c\xb0\xfe\xc3\x71\x03\x44\xf8\x80\x38\xac\xae\xb6\xdd\x0d\xd6\x46\x9d\xf6\x6c\x28\xa0\x5f\xde\xa6\x7b\x90\x1d\x44\xb6\x20\x6e\x25\xbf\xfa\x39\xe2\xc1\x63\x35\x88\x0f\xe4\x67\xb5\xec\xff\x6d\xba\xc0\x33\x65\x3f\xcd\xc2\xe2\x5b\x38\xcd\xe5\x88\x0a\x88\x67\xb8\xb2\x62\x5e\xfc\xa7\x89\xb5\x83\xbb\xd1\xa7\x9e\xe7\x3b\x90\xef\xc7\xdc\xfa\xc7\x60\x4b\x12\x45\xc4\xbf\xe1\x1f\xc0\x76\xdf\x9a\xa5\x14\x79\x72\xf2\xac\x38\x91\x4f\x60\x19\x77\x29\x12\x85\x29\xd0\x70\x3c\xfc\xb7\xf1\x4b\xa6\x61\x9b\xc2\xdf\x7a\x85\x56\x9b\x02\xdb\x1f\x86\x97\x70\x20\x2c\x9a\x8f\xbe\x8f\xf3\x2e\xa9\x76\x57\xa6\xcd\xc6\xf0\x26\x07\x7b\xbd\xfd\xcd\x7f\x10\x87\xf4\xbf\xd9\x77\x62\xae\x05\xdd\xbd\xa5\x8f\xf9\xe9\x5c\x6c\x57\x84\x66\xfd\xd2\xb1\x7e\xc8\x95\x8a\xaa\xca\x7f\x0b\x69\x1c\x89\xac\xd5\xd2\x70\x07\x74\x9e\x78\x82\x70\x50\xb2\x4b\xa0\x63\x95\x68\x8b\x0d\x71\x30\xb9\xbf\x3a\xc1\xab\x99\x55\x3f\x7d\x89\x32\x1b\xdd\x0a\xe8\xdf\xde\x25\x59\x4c\xaf\x33\x7e\xa6\xe9\xce\x9f\x29\x9f\x6e\x35\x40\x84\xab\xa0\x8d\x8f\xb4\x11\x62\xda\x61\x87\xab\x6d\xfc\x8e\xa9\xb1\x89\x5b\x4b\x8b\xe8\xd2\xd6\xf3\xce\x77\x20\xaa\x04\xcb\xb2\x83\x1e\x71\x2a\x84\xc5\xd8\xa3\xa2\xbe\xec\x35\xf6\x94\xf4\x95\xb5\x84\x81\xd2\x75\x0e\xcd\xef\xd5\xdf\x63\xce\xa9\x23\x7e\x79\x78\x29\x44\xf7\x4d\x02\x90\x72\x5c\x04\x63\xd5\xa6\x51\xe7\xb4\x24\x26\x1c\x9a\xf1\xa2\xe7\xf8\xb5\x26\xde\x50\x21\x11\xd1\xf4\x66\xc4\xd5\x92\x1d\xc4\x78\x69\x2c\xb9\x9a\x5c\x9e\x61\xfc\x59\x7f\x89\x4c\x18\x5c\xdb\x2a\x7b\x01\x0d\x1a\x76\xb3\x60\xda\x56\x99\x47\x3d\x87\xb6\xf9\xe6\x1e\xf9\x95\xf8\xa1\xfe\x9c\x1f\xa0\xeb\x11\x4e\xde\x78\x12\x33\x3e\x66\x10\xb5\xfc\xc6\xc3\x03\x15\xa2\xad\x49\x24\x42\x07\xd2\x1d\x3a\xad\xcb\x17\xa0\xaf\xf4\x82\x73\x1b\xaa\xe6\xfe\xd6\x63\xa7\xe1\x91\x73\xe0\x3a\x38\x57\xc4\xe8\xea\xef\x8a\x63\x35\x6c\x8b\x06\xa6\xd9\xd5\xb4\x8a\xe6\x9d\x8d\x8f\x65\xe4\xb8\x49\x48\x48\xe5\x90\x3c\xf7\x89\x69\xcc\x1a\xdd\xf9\xcd\xed\xe4\x2e\xfb\xd8\x06\x2d\xc1\xf7\x0a\x87\xec\xdb\x99\xe7\x62\xe0\x08\xf0\x48\x11\xea\x01\xf9\x6a\x1b\x15\xc9\xbc\xd2\x40\x75\x63\xc4\xb2\x61\x79\x62\x04\x36\x04\x10\xf1\xfb\xaf\x97\x49\x4f\xe7\x8a\x03\xd6\x65\x88\x33\x28\x4f\x5b\x32\xd6\x7b\x0c\xc6\x00\x79\x70\xd4\xb2\x0a\x47\xe1\x9c\xa0\xba\xdf\xa6\x31\x94\x86\x46\x01\xe2\x9e\x71\x49\x04\x80\xd4\x30\x5b\xf2\x9e\x73\xa8\xc8\x31\x7a\x0d\xf1\x0a\x74\x5d\x0a\x09\x1a\x69\x83\x2d\xf5\xf1\x60\x85\x7d\x66\xe7\x9b\xc1\x92\x0d\xbd\x51\xfd\xa2\xc1\x6a\xbc\x94\xd5\xb8\x93\x69\x32\x04\x0d\x48\x72\x37\x5c\x87\x34\x6e\x16\x46\x49\xeb\x15\xd8\xe0\xc5\xda\x28\xbc\x8d\xe9\x26\x0e\x56\x5a\x3e\xfa\x81\x7c\xe7\xd1\xd1\x9e\xfe\xef\x5e\x59\xde\x4b\x92\x23\x30\x09\x79\xc1\x18\x48\x03\x57\x4d\x2c\x89\xe7\xd7\x3f\x58\xc9\xd1\xab\x2e\xbb\xb4\x45\xd2\x7f\xe4\xb7\xc4\xac\xfe\x70\x69\x71\x27\x2c\xfb\x3f\x00\xf6\xb6\x39\xec\xd6\xba\xcc\x65\xea\x22\x94\xed\x33\xbd\x41\xea\x86\xe9\xb2\xe6\xd0\xde\x13\x43\xdb\xc6\x7a\x48\x88\x2f\x34\xe1\xc6\x39\xee\x30\xb0\x4e\xcb\xc4\xc9\x9f\x73\x20\x47\x79\x05\x2a\x7a\x7c\xe0\x24\x64\xe5\x78\xa1\x86\x07\x51\x93\xac\x0c\x38\xde\xf0\x85\x84\x04\x70\x06\x79\x0b\xce\x98\x7d\x43\x32\x38\xab\x22\xe8\x4c\x80\x7a\x8f\x46\x46\x83\xf0\x9f\x8a\x0c\xc4\x1c\x96\x6c\x02\x59\xe7\x57\x8a\x39\x53\x43\x3a\x78\xac\x26\xc5\x9d\xd9\x1b\x62\x45\x17\xff\x49\xff\xe1\xbf\xe6\x6f\xd2\x62\x8d\x10\xc7\xf8\x72\xb4\x4f\x23\x3f\x98\xe0\x47\x01\x88\xcc\x1d\x70\xc7\xf0\x4f\xf9\x73\xca\x01\x72\x48\xde\xe2\x17\xbe\xb0\xfd\x05\xef\x36\x4d\x8e\xb9\x4c\xdf\x3f\x6c\xe3\x02\x8f\x81\xbb\x21\xdc\x3e\x6d\xf8\xcd\x2a\x77\xa5\x37\xe5\x3c\x6b\x5a\x44\x4f\xdc\x68\x32\x31\x4b\xd6\xad\xdf\x1c\x43\x7b\x09\xf3\xf8\xb7\x8a\x08\xee\xb3\x13\x11\xb8\x5c\x82\x09\x6c\x34\x37\x9c\x40\x3c\x0f\x5a\x34\xce\xde\xa1\xa7\x06\x36\xdc\x7b\x47\x63\x42\x60\xd2\xa4\x60\xb3\x97\xf8\x03\x63\xfc\xa3\x53\xe2\xf8\xe2\x6e\x48\xfc\x4e\x4e\x34\x09\x5c\xcc\x8e\xd4\xda\x1d\x9b\x4d\x6e\xb7\x36\xb1\x19\x60\x8d\x4b\x55\x92\x81\x2e\x70\x15\xbe\x12\x68\x71\x29\x26\x12\x27\xfb\x07\xb3\x34\xa5\x6e\xb2\x66\x8e\xf2\xa0\xc7\x03\xb1\x23\x83\xa2\x60\x04\x84\x30\x93\xeb\x74\xf9\x89\xf7\xf8\x47\xf8\x72\x08\xaa\x86\x2d\xe7\x01\xb7\xee\x22\x98\xe3\x6c\x18\x36\x2f\xea\x97\xdd\xbb\x91\x55\xdc\x3e\xa3\xd5\x2c\x2f\x38\x6c\xb6\x65\x65\x09\x10\x5e\xca\x35\xd1\xda\x1c\x0c\xde\x72\x8a\xce\x59\x9e\x7c\xfa\xfb\x46\x0b\x38\xce\xae\x67\x3e\xcc\xc5\x05\xa7\x25\x2a\x81\xf0\xeb\xec\xb7\x6e\x8a\xbc\x40\xe3\xb4\x5a\x10\x16\x98\x75\x80\x2a\xf3\x00\xd0\x9c\x43\xc3\xbb\x80\x92\x87\xc0\xd8\x71\x00\x46\xe5\x43\x00\x58\xa0\xc5\xf3\xbc\x3f\x54\xde\x57\x6a\x00\x93\xe8\x69\x44\x9a\x1c\xe4\xb6\xae\xf3\x96\xe3\xcc\x78\xee\x94\xb6\x74\x93\x75\x02\x80\x6c\x58\x53\x00\x24\xa8\x67\x6b\x97\x60\xf0\x25\x4b\xbd\xa3\x65\x53\xaf\x66\x0b\xf6\x8c\x7f\x47\x67\xfa\xdb\x01\xe2\xb5\x80\x49\xc3\x88\xd7\x02\xd1\x97\xf5\x9b\x71\x33\x00\x42\x02\x86\xa6\xde\xb0\x9f\xb9\x36\x87\xef\xf0\x2f\xc9\xd8\x2d\xc2\x94\x12\x22\x62\xbf\x4e\xbc\x9d\xa0\xdf\xdb\x08\x47\x82\x75\x2f\xab\xba\x87\x89\x8f\xf6\xa0\xef\xd2\xb9\x37\x08\x2c\xf7\x57\x9c\xe9\xc0\x8b\xbf\x63\x8b\xd5\x2f\x62\x9c\x54\xd1\x0b\xd5\xe2\x36\x42\x42\x79\xc0\x3d\xe3\xc6\xa8\x38\xc3\xec\x52\xe2\xd7\xcb\x64\x1e\x59\x33\xe4\x1d\x21\x87\xa7\x18\x86\xc4\xb1\x5d\xc5\xc9\x05\xe8\x69\xe2\x46\xf6\x28\x45\x3d\xa6\x2e\xa3\x2d\xc1\x4d\x10\x6c\xfd\x47\xbe\x40\xd7\x3f\xb6\x9d\xf0\xdd\x69\x98\x92\xc8\xcc\x1a\x6a\x74\xbc\x30\x41\x6a\x29\xa6\x0f\xb0\x7a\x22\xf9\x03\xbc\x3c\xf1\x21\x84\x85\x8f\x9a\x83\x7d\x4c\x3c\xd2\x3a\x93\xbb\x2a\x2c\x83\x83\x0e\x20\x39\x49\x97\x0f\x1d\x3c\x93\xba\xa1\x92\xcc\xe5\x4f\x7e\x16\x93\xe3\xa8\x4d\x73\x2f\x5c\x74\xc2\xff\x55\xf7\x68\xef\xd9\xb2\x64\x9b\x11\xfa\xe4\xb0\x92\xeb\x4b\x34\x73\x1a\x95\x4a\xb2\xf3\xf0\x27\x04\x5a\x43\xfa\xc9\x03\x8b\xc4\x30\x4b\x85\x09\x56\xab\xc8\x36\xdb\xee\x4d\x8a\xff\xde\xd4\x92\x9d\x63\xd8\x92\xae\x0e\xb3\x0a\x88\x60\xc8\xa1\xd1\xda\xf1\xba\x2a\x3c\x2f\x8e\x72\xac\x5a\x55\x5c\x09\x5e\xba\xaa\xce\x1d\x39\xfa\x42\xd9\xd8\x71\x3b\x32\x8a\xb6\xdb\xe3\x41\xa5\x34\xf4\x18\xc1\xf5\xe5\x15\x8f\xbc\xf6\x3b\x49\x5c\x4a\x8c\xb3\x8e\x8e\xed\xa7\x37\xb6\x03\x8d\x2a\xa1\x93\x35\x10\x34\x5e\x39\x16\x37\x43\x73\x94\x59\x53\xe5\xa4\x38\xd7\xbf\xf3\x9b\xe6\xac\x39\x82\x07\x01\xd7\x8e\xbd\xa7\x96\x88\x21\x86\x79\xb0\x3a\x09\xd1\xda\x99\x72\x0b\xf5\xfa\xab\x17\x6c\xe7\x6f\xd1\x5f\x51\x89\xfe\x11\xc8\xbf\x19\xb2\xd6\xf5\x1d\x27\x45\xab\x4c\xf8\xd3\x20\xaa\x8f\x1d\x1b\x0b\xc2\xf6\xb5\xb7\x17\xc9\x0c\x41\xf2\x72\x13\xf1\x2a\x8f\x57\x7d\x11\x08\x55\x23\x11\x35\x57\xbd\x96\x7f\x51\x33\x6f\xe3\x93\x98\x7d\xf1\x2e\x61\x95\x7f\x99\x6e\xa9\x5a\x1a\x9d\xf0\x2c\x1c\x0c\xe7\xae\xe5\x08\xa0\x50\x05\xb5\xf2\xda\xc9\xe4\xc9\x95\x18\x84\x95\x17\xb2\x02\xb4\xd6\x06\xbb\xe3\xb5\x6b\x7b\x09\xe2\x68\x68\xf7\x79\xdc\xe4\x26\xc4\x23\x6a\xe8\x83\xbb\xb9\x4f\x93\xa0\x65\xb3\x56\x08\x49\xc7\x4b\x97\xef\x94\x2e\x1f\x22\x54\x76\xb0\xc5\x0f\xa1\x2d\x33\x2d\xaf\x60\x3c\x6e\xc7\xbd\x94\x60\xef\x75\xd7\x46\xea\xad\x7e\xe4\xd8\x91\x0d\xbf\xfb\x41\x88\x57\x09\x27\x3e\xea\x49\x58\x98\x96\x78\x98\x7b\xae\xda\xb1\x09\x4d\xe9\x3f\xc3\xa9\xfc\x51\x70\x97\xc1\x00\xe8\xff\x71\xa8\xde\xd9\xa1\xb1\x81\x8a\xc6\xd1\xbe\x60\x1e\xc1\xc9\xbb\x7b\x7d\x3f\x16\x04\x9d\xba\x69\x0c\x05\x95\xce\x83\x9b\xc1\x41\x21\xe5\x69\x1c\xb3\x25\x08\xb5\xe8\x93\x04\x03\xe2\x29\xbe\xf8\x6d\x89\xb7\xf3\xde\x75\xe0\x97\x92\xfb\xf8\x1d\x89\x97\xdc\xab\x23\xd7\x88\x1f\x05\x33\x96\xa7\x58\x2c\x19\x8e\x07\xe2\x6f\x89\x3d\x99\xbb\x63\xb4\x92\xee\x5b\x7d\x12\xe6\x07\xda\xcb\xda\x34\x48\x8d\x59\x71\xee\x8b\x55\x8a\x30\xd4\xf9\xf0\x42\x8e\xba\xf9\xed\xb8\x9b\x30\x64\x27\x9a\xbf\x80\x30\x26\x21\x9f\x78\x25\x31\xdf\x44\xb4\x8d\xd9\x5e\x24\xbb\x70\x04\x9c\xc2\xa2\xe9\xf7\xb0\x18\xd8\x5c\xaa\xe3\x41\x00\x5d\xd9\x9c\x8d\x46\x09\x46\x75\x6b\x3e\x15\xe3\x18\x4a\x41\x66\x04\xab\x50\xe5\xd8\x62\xd5\xa7\x23\x3a\xcf\x26\x3e\x26\xa8\x7f\x94\x00\xb8\x19\xf3\xf1\x53\x60\x4e\x86\x53\xd5\xad\x3e\x4a\xca\xd3\x4b\x70\xed\x36\x82\x6f\x87\x70\x28\x4d\xa2\x07\x5d\xa4\x36\xa7\xa4\x9b\xe0\xe9\x27\x3b\x9b\xbc\x75\x08\xc0\x2d\xb3\x15\x91\x33\x33\xe2\x82\x98\x97\x26\xf2\xd4\xda\xe8\x17\x13\x9d\xf8\x02\xf0\xa9\x3e\x7c\xf6\xa6\x37\x25\x03\x7b\xed\xe8\xda\xd1\xd8\xf4\xdd\x63\xb0\x6e\xfe\x92\xdd\x77\xcf\xb1\xfe\xbd\xeb\x75\xe3\x52\x6d\xe4\x2d\xbd\xf8\x1a\x8f\xc2\x26\x1c\x6e\xe5\xb7\x93\x68\x8e\x4f\xd3\x36\x15\x93\x56\x16\xdd\x01\xdf\x6f\x4e\xc1\xb1\x55\x4f\x80\x80\xaa\x93\x47\x23\x91\x08\x72\x63\x9c\xf7\x9f\xf8\x57\xd9\xdd\x1b\x82\x3e\x1c\x1e\x1a\xbf\xc6\xf9\x44\x22\x3b\x58\x85\x70\xc2\x59\x0e\xf1\x44\xcd\xbc\x8d\x36\x06\x05\x09\xa4\x4e\xb8\x99\x23\x12\xab\x0e\xa1\x18\x77\x30\x3c\x07\xd3\xca\x8f\x43\x7c\x7e\x58\x15\xd4\x2d\xad\xd2\xb1\x1e\x29\x8c\x7d\x38\xbe\xe6\xe2\xb4\xa0\xf2\x36\xe1\x0f\x4f\xba\x89\x73\x66\xf2\x04\x4d\xbf\x34\x41\x7c\x1f\x76\x13\xad\xf8\x24\xe1\x58\xde\x0d\x2a\xd1\x4e\x83\xd1\xb8\x50\xc0\xac\xda\x0a\x89\x90\x17\x4d\x63\x18\x45\xc3\x13\x2a\x90\x41\xc4\xf3\xc2\x10\x35\xb7\xdd\x6d\x09\x99\x75\x08\x3a\x0c\x53\xe5\x9d\x91\x7c\xb8\x3e\xd6\x3d\xc8\xeb\x2a\xb8\x68\x41\xb3\x4e\x2b\x67\x9b\xd4\x68\x55\x37\x82\x8f\x78\xc1\x63\xf1\x3a\x9a\x3a\x63\xbd\x61\x2d\x24\x24\xf8\x21\x9a\xf2\x6e\x75\x9c\x1d\x92\x3c\x71\x9a\x5e\x1f\x37\x8f\x31\x02\x12\x1f\x74\x49\x6b\xe7\xfb\xf1\x06\x3c\x6d\x13\xc3\x97\xd7\xe9\x29\x10\x2f\xdf\x3d\x3d\x87\xe9\x71\x35\x58\x5d\x3f\x84\xaf\x90\x3a\xb7\x3f\x7a\x57\x79\x9b\xc4\xb4\xe4\x0b\x26\x60\xca\x39\xbc\xba\x64\xbc\x0a\x06\x12\x90\x4b\x09\xaf\x6d\xb8\x00\x63\x23\x78\x9f\x5e\x70\x90\xde\xa4\x2b\xe8\x1e\x9c\x6e\x02\x2c\x4b\x78\xde\x58\x37\xa1\xf4\x8a\xa0\x2c\x73\x2c\xd9\x9b\xa3\x17\xcf\xcf\x5e\xa2\x97\x7d\xd4\xc1\xb7\x44\xa4\x14\xa5\x92\x2b\x3c\xa1\x47\x60\x4c\xc9\xa8\xd7\xc1\x13\x43\x5c\x0e\x23\x6b\xd1\xaf\x0b\x04\x5e\x11\x93\xfc\x8a\xe3\xce\xdb\xf8\x4f\xf2\x0e\x9d\x63\x9a\xac\x34\xa3\xaf\x89\xe7\xc9\x74\x8a\xe3\x77\xc7\x82\x87\x80\xde\xbd\x0c\x75\x4c\xab\xe9\xaa\xdd\xf8\x0e\x25\x54\xc8\xb8\xe7\xc6\x30\xe4\x1f\xb1\xfc\xda\x17\xd3\x62\x86\x2e\x9b\xbb\x23\xfe\xfa\x8d\xc8\xfe\x00\xd8\xb2\x7e\x6f\x74\x39\xa5\x8e\xa7\xb5\x5e\xf5\x95\x8b\xe7\xce\x77\x23\x74\xc9\x61\x95\x2e\xb0\x71\x87\x78\xfb\x1b\x7d\x25\x9b\x7d\xa0\x0e\xfb\xf0\x00\xcd\x8d\xf9\x4f\x37\xc0\x77\xe0\x71\x6d\x62\xce\x29\x34\x11\x6f\x81\xe8\xd9\x9e\x04\xa3\xb6\xa3\x5d\x31\x23\xf5\x65\xa3\xc9\x0a\xe1\x29\x43\xaf\x41\xfc\x5b\x0e\x35\xdb\x76\x81\xe0\x46\x18\xb9\xd3\x4c\xd4\x88\x38\x9d\xcb\x51\x34\xb1\x33\xab\x77\x75\x68\x66\xca\x23\xf5\xf6\xe3\xd8\x5f\xe0\xbc\xdf\x37\xcc\x62\xbb\x90\x97\x44\xd5\xc1\xe1\x4c\xed\x02\xc7\xda\x94\xd7\xc9\x6c\x70\x37\x16\xf2\x96\xee\xec\x3e\x95\xbc\x4f\x6a\xbb\x1e\x0d\xce\x98\x7c\xed\xa9\x9c\x02\x69\x89\xbb\x6a\xd3\xc5\x03\xda\xdb\x5d\xa8\x6e\x52\x10\xb1\x33\xb5\xd6\x9e\x37\x09\xb4\x93\xe4\x3d\x1a\xa9\x78\x02\x60\x55\x27\x1c\xd1\xe8\x22\x49\xc7\xba\x4a\xd9\x29\x30\x2e\x1e\x3e\xa0\x9f\x47\x99\x66\xf8\x6d\xb3\xc0\xe3\x96\x28\xf6\xd5\xf7\x46\xfb\xa3\x21\xcb\x10\x75\x1f\x71\x9d\x6d\xc0\xda\xc3\xde\x19\x01\x1f\x2e\xb1\x3e\xe1\x95\x62\xf2\xa8\x22\xce\xb2\x13\xda\xc3\x14\xee\x56\x71\xbf\x4f\x27\xaf\xb2\xce\x48\x5e\x57\xab\xe3\x15\x9a\x92\xbc\x53\x26\x3f\x2e\xc2\x7a\x36\x95\x8c\x87\xfd\x5f\xc3\xbc\xdb\x91\xc6\x8e\xe4\x8b\xe2\x52\xf1\x97\xc8\xb7\x6c\x8e\xf2\x14\x4b\x2d\x6f\x56\x08\xbf\xc7\x2b\x11\x71\x94\x65\x1d\x31\x6f\x66\x94\x1c\xe6\x4a\x07\x28\x81\xae\x46\x20\x2e\x9c\xa5\x42\x99\x91\x8d\xb8\x2e\xad\xb1\xb0\x88\x7f\x42\xb7\xea\x11\x09\xdd\x73\x4e\x9e\x41\x7c\x4c\x02\xa7\x2b\x09\x2a\xcb\x77\xce\xf8\xfe\x64\x39\x2e\x64\x88\xc9\x03\x45\x20\x07\x47\x61\xad\x0e\x68\x87\x75\x27\xd2\x31\xe8\xd5\xb5\x28\xec\x04\xb1\x5f\xd6\xb1\xa1\x2e\x76\xab\xa3\x3b\xff\xef\xd9\xf3\x2f\x8f\xa3\xef\xee\xbd\x79\xf3\xe6\x1e\x04\xbb\x7b\x3d\xd1\x9a\x0a\xad\x25\xc7\xd1\xff\xff\xec\xe9\x71\x74\xb1\xba\x1b\x61\xf7\x59\x5a\x5e\x71\x08\xb4\xc6\x33\x22\xcb\x20\x03\x55\xc6\xbf\x93\x84\x78\xb3\x2e\x39\xac\xde\x61\x7a\xa2\x97\x91\x15\xb3\x13\xa9\xb4\x7c\x86\x12\x7b\x2b\xef\x2a\x4c\xbc\x52\x13\x90\xc6\x63\x66\xd6\x0d\x0d\xf7\x51\x76\x59\x78\x9b\xde\xd2\x71\xcd\x0f\x87\x9b\x1f\x02\x66\xd4\x17\x8f\xe7\x2c\x2b\x37\xe9\xa1\x01\x09\xac\xb8\xd7\x7e\x95\x56\x9e\x96\x30\xbd\x48\xbd\xc8\x6f\xb2\x65\x96\xfa\xdb\xcd\xa4\x5d\xfe\xfd\xb0\x0e\x87\xe2\xa8\xab\x62\xef\x25\xde\x96\xf3\x22\x28\xde\x9c\x18\x9c\xba\xf9\xb0\x32\x67\x06\x4c\x81\xdb\xd9\xbf\xd0\x86\xdd\x7d\xac\xe2\x56\xea\x9e\x8c\xda\xc0\x62\xa5\xd8\xb2\x06\x2d\x49\x60\xf9\xc5\x97\xd0\x6d\x7b\xa0\x2e\xe5\x0b\xc4\x93\xf0\x96\x6a\x45\x71\xbc\xb0\x06\xcd\xc9\x62\x59\x99\x89\x18\x1e\x81\xcf\xc1\x78\x69\x3c\xbf\xa0\x17\x78\xc2\xfd\x95\xfc\xb8\x09\x50\xba\x7a\xe1\x3d\xf8\x8e\xc4\x63\xfd\x38\x12\x87\x97\xe3\xc8\xf8\xb0\x1f\xf3\x0b\x5e\xfc\x6b\x1e\xdc\x1c\x47\x44\xf6\xec\xdf\xf2\x72\x4a\xcd\x7a\xe6\x27\xfb\x74\xe0\xa7\x9a\x87\xb6\xb4\xbc\xd9\x65\x9a\x8c\x16\x06\x1b\x4b\xe3\x68\xb7\x93\x3b\x1e\x8a\xf7\x48\x8a\xde\x45\xbb\x00\x58\xd2\x92\x2e\x38\xf7\xe8\xf0\xab\x17\x81\xc9\x60\x12\xc3\x8f\x2a\x82\xf2\x22\x45\x26\x69\x07\x09\x0c\xf1\x32\x5d\x98\xed\x29\x63\x0f\x72\x2a\xd7\x79\x28\x61\x79\x5c\xc2\x84\x8c\xa5\xa8\x75\x8a\xaf\x86\xef\xb0\x31\x10\x0f\xe1\x83\x6e\x7c\x06\xe8\x80\xa8\xab\xa2\xdc\x81\x6e\x02\xf6\x53\xde\x0e\x19\x96\x27\xe3\x78\x2f\x95\xc7\x95\x05\xdc\x01\x8f\x43\xb1\x0b\x5f\xd9\x21\x6e\xe1\xc7\xc6\x7c\xe9\x1d\x49\x10\x7d\xcf\x65\x1c\x86\x88\x3e\x03\x14\xe3\x41\x3c\x68\xd9\x34\x9a\x0f\xa8\x8f\x24\x63\xaa\xaf\x7b\x91\x06\x0f\xc4\x49\x1d\x82\x25\x75\x19\x67\xd5\x02\xca\xf6\x49\xc4\x05\x6b\x60\x95\x16\x24\xee\x55\x71\xa0\x44\xda\x15\xf5\x5e\xc2\x93\xbb\xc9\x0f\xd2\xb5\xf8\xb3\x74\x15\x26\xe0\x47\x52\xb9\x83\x36\x37\xdb\x56\x19\xc4\x2b\xaf\xbc\xc4\xff\x75\xde\x6b\x80\x2c\xa0\x20\xce\x7c\x15\xd9\x68\xa3\x7e\x8c\xe0\x61\xdc\x73\x70\xe1\x7e\xb2\xb8\x42\x9d\x37\x9c\xed\xa1\x5e\xfa\x33\x7e\x8c\xc4\xb3\xd5\x46\xf5\xf9\xa3\xb1\xa9\xba\x00\x39\xeb\x06\xea\xdb\xd0\x31\x6c\x6a\xba\xa3\xf0\xd9\x16\x28\x8c\xf0\x3d\x5e\x11\x5d\x8e\x43\xc1\xbe\xfd\x66\x5c\xc4\xef\x91\x6f\xc2\xe4\x6c\x3c\x17\x85\x60\x53\x47\x61\xbd\x27\x6b\x1f\x8e\xee\x3d\xbd\xdf\x2a\x04\x4e\x1d\x13\x0d\x7e\x7b\x63\x45\x67\x0b\x98\x5e\xa2\x50\x34\x34\xf8\xf1\xdf\x1b\xf2\xfb\xa6\xe1\x59\xa5\xdc\xd4\x5a\x4d\x3b\x37\x25\xd9\xf9\xf9\x7c\xd5\xd4\x6f\x5a\x04\xcf\xee\x9b\x35\x3f\xdb\xa9\xa8\x81\x18\xa1\x9b\x68\x7b\x04\x44\x22\x70\x2c\xd2\x15\x11\x82\x7d\x25\xdf\xc4\x09\x67\xa1\xfe\xe5\xf2\x8d\xdd\xa0\x59\xd9\x72\x11\x67\x05\xcc\xc3\x8b\x2f\xc4\x18\xc6\x42\x9f\xe8\xdb\xf1\xa0\x7b\x2e\xf0\x9c\xbc\x1e\x7f\x71\x08\xf0\x36\x00\x3e\x95\xb4\x5f\x1c\x5c\x8f\x1f\x42\xb9\x1a\xed\xae\x20\x29\x00\x31\x98\x5c\x2c\xd7\xf2\xea\x67\xc4\xa0\x2b\x3c\xb0\xbe\xca\xce\xb3\x34\x11\x40\x75\xc3\x25\x3e\xcc\x8b\x49\x25\xb0\xe8\x5a\x5d\xec\x0d\xd3\xc1\x41\x12\x9d\x1f\x3b\xfb\x0d\xb0\xbc\xe2\xf1\x25\x85\x0b\xd4\x8b\x27\x49\x7c\x31\x5d\xf1\x45\x50\xca\xba\x35\x5b\xa8\xeb\x4e\xe8\xf1\xfe\x1f\xbe\x94\x1f\x1c\x60\xca\xc5\xa0\xda\xb3\x0b\x85\x97\x42\x9f\x81\x34\x7b\xd1\x8e\x23\x6c\xe0\xae\x72\xb8\x2a\x98\x1b\xd9\x85\xd9\x85\xc4\x0a\x12\x08\x66\xdb\x32\x2e\x54\xeb\x29\xed\x20\xc4\x16\xf1\x77\x7b\xf5\xd8\xa7\x23\x8d\x36\xac\x57\x38\xb7\x24\xdc\xb5\xc4\xdf\xf2\xcc\xae\xec\x7d\x1d\x28\xb1\x34\x6d\x9b\x89\x69\xb5\x91\xdd\xd2\xe8\x8d\x33\x13\x4a\x6c\x3e\x15\x52\xcc\x94\x49\x3c\x38\xfe\x5b\xd5\xc1\x02\x63\x01\x12\x12\x51\xbb\xc5\xcb\x98\x48\x47\x6e\x3f\xd2\x2a\x98\x4a\x57\xff\xa8\x46\x75\x68\x5b\x57\xfc\xac\xb3\x21\x64\x4c\x54\xc3\x7c\x67\x9f\x50\x1b\xe2\xcb\x7c\x8d\x21\x8d\xc3\x99\x0c\xb1\xe6\xc5\x81\xbe\x64\x53\x96\x6f\x52\xb8\x9d\x78\xdb\xaf\xe7\xde\x76\xc7\xd7\x47\x52\x4c\xf3\x1d\xca\xa3\x27\x75\xd2\x07\x73\x74\xce\xa5\x57\xff\x94\x23\x18\x11\x85\x4d\xd1\x8e\x55\x94\xd8\xd5\xc9\x22\x3e\x06\x55\x11\xcf\x83\xb1\x7b\xad\x9c\x32\x83\xe4\x72\xdc\x88\x5d\x1c\xbc\x48\x21\xea\x02\xa4\xa1\x0f\x52\xe4\x00\x91\x73\xe6\x73\x56\xc7\xd9\x67\x0c\xc2\x8f\xc4\x95\xe6\x35\xac\x6c\x6c\x5f\xd1\x4d\x22\x7e\xb2\x19\x42\x17\x4b\xfa\x51\x13\xa4\x0e\xbc\x30\xbf\xe4\x73\x00\x2c\x85\x71\x12\xbd\xa0\x96\xb2\x7e\x41\xc8\x3e\x8f\xa1\x16\x23\xb9\x1a\x52\x79\xe6\x2e\x31\x7a\x16\x78\x4f\xdb\x46\x43\xaa\x67\x3e\x8f\x28\x9d\x29\x70\xce\x63\xde\x11\x62\xe4\x40\xe7\x87\x3d\x9d\xcd\x77\x48\x79\x10\x4b\x34\x3f\x14\xbb\xb9\xcf\xe7\x13\x27\xcf\x45\xed\xa4\xc9\x10\x8b\x6a\x8f\x0e\x0c\xf8\x13\xe0\x8e\xfd\x55\x40\x36\xde\x70\x88\xf8\x12\xbe\x17\x97\x78\x37\x56\x17\x7e\x5a\x01\xf7\x46\x34\x11\x2f\xd0\x4b\x37\x90\xd0\x6b\xd8\xf6\x87\x04\x73\xc4\xc3\x9f\x99\x2e\xa2\x57\x7a\x92\xdc\x69\x85\x97\xa5\x77\xab\x38\x34\xae\xfa\x59\x06\x87\xcd\xdc\x30\x07\x75\x3a\xbc\x3a\xca\xe4\x1a\x48\xe4\xc3\xb0\x1d\x9f\x65\x45\x08\xc7\xcf\x8a\xa4\x58\xed\x14\xc3\x62\xbb\xa4\x76\x85\x46\x3a\xd7\x7e\x6f\x74\xad\x50\x6d\xd9\x33\xc4\x97\xe6\xc3\x94\xab\xa3\xce\x6d\x1a\x06\x1d\xe3\x24\xdd\x1c\xde\x85\xd0\x31\x53\x8e\x43\x70\x39\xf8\xe1\x90\xb3\xfa\xeb\xcc\x7c\xf6\x67\xd4\xa4\x7a\xda\xfb\x8f\x65\x5d\xc6\x64\x13\x49\xd5\x0e\x5f\xdf\x42\xe2\x65\x96\x4d\x36\x35\x9b\x7d\x53\x37\x9b\xd7\x2e\x61\xb0\x1a\x4b\x7c\x6b\x87\xb0\xe6\x80\xb0\x99\xf7\x26\xc1\x5e\xd2\x12\x5a\xd0\x51\xbc\x76\x22\x54\x84\x74\x3a\x93\xdb\x4f\xc2\xb4\xf3\x83\x3f\x3f\x50\x3b\x72\xd6\x89\x50\x8d\xac\xa4\x41\xf3\x56\x08\xe7\x08\x9d\xc6\x1f\xf5\x91\x27\x54\xcd\x76\x24\xfb\xb2\x3f\x80\x3a\xd6\x23\xf3\x2c\xe2\x04\xb6\x75\x99\xc2\xbb\xe7\x3e\x3b\xac\xb1\x33\xd0\x29\x1d\xee\x0e\xc6\x42\xe4\x3b\x6e\x17\x0f\x73\x76\x4d\x98\x71\xc8\x3b\x35\xd4\xb4\x0b\xce\x5b\x6a\xbf\x06\xd9\x38\x35\x44\xae\x1f\xad\x14\x2d\x69\x58\x19\x64\xcc\xb4\xe3\xc5\x72\x0c\xdf\x5e\xd8\x2c\xcb\xdc\xb3\x2c\x1b\x7f\x3b\x08\x68\xe3\x83\xb3\xf7\x8b\xe4\x68\xb4\x29\x79\x93\x58\xa3\x5a\x78\xea\xf4\x55\x2f\xfe\x5a\xea\x63\xe5\x7b\x53\xd8\x9e\x3c\x5c\xa3\x19\x7f\x2b\x60\x98\x3c\x67\xcc\xfa\x7b\x01\x0c\xa2\x04\xcb\xb5\x13\xe0\x63\x40\xc3\x34\x24\x5e\x4c\x08\xcc\xd1\x12\xae\xdc\x4b\x4e\x2c\x76\xf7\xa0\xdb\xf5\xfb\xc9\x0c\xa1\xcf\x47\xa9\xa8\x87\x29\x42\xdb\x0f\x4c\x12\x3a\x6e\x51\xc2\x45\x4b\xc3\xee\x95\xc9\xfb\xf8\x2b\x9f\x39\x73\xb5\x2b\x74\x79\x27\x71\xd2\x49\xa8\xce\xca\x40\xd5\x3e\xcc\x40\x69\xcb\x6c\x2a\xca\xa7\x75\xce\xc3\xfb\x95\xce\xb1\x21\xb0\x45\x43\xe1\xc4\x6d\x03\xef\x61\x65\x57\x6f\x5b\x3a\xa0\x37\x3a\xdb\xd6\x41\xf6\x52\x9b\x83\xd2\x33\x01\x8c\x12\x51\xd2\x7d\x3e\xe8\x78\x3b\x9d\x25\xf1\x79\x98\x6a\x38\x1e\x24\x4d\xbc\x29\x7b\xe0\xc8\xf9\x24\x68\x6b\xd2\x01\xc5\x64\xc3\xa0\xb9\xbe\x1b\x58\xd7\x25\x58\xe7\xa1\x9f\xc6\x58\x4c\xe3\xc7\x70\xef\xe9\x76\xf2\xd1\x21\x47\x83\xe9\xb4\x1d\x9c\xb1\xac\x2f\x47\x03\x05\xa6\x11\x86\x27\x18\xeb\xc0\xd6\xef\x01\x9b\xfb\x5c\xdf\x34\xb5\x5f\x63\x87\xf4\x2c\x4b\x83\xe6\x9d\x35\xd4\xac\x86\x9f\xf2\x82\xa3\xa9\x9b\x38\x80\x46\xe9\x07\x03\x31\x30\x8c\xaf\xae\x33\xbc\x1e\x32\x1c\x09\xb6\x9e\xeb\xbf\x84\x75\x96\x5e\x22\x8f\xab\x7f\x22\xf7\xb4\x27\xd1\x99\xd4\x0d\x9f\xda\x8a\x92\x6c\x77\x90\x64\x77\x50\x6a\x1f\x85\xfe\x04\x3b\x17\xa2\x8e\xd8\xf2\x26\xbb\x80\x92\x98\x2d\x60\xc3\xaf\xa6\x5a\x98\x8b\x37\xa8\x2f\xff\x2e\x9b\x9a\xb6\x0d\x83\x8d\xbe\xc2\x03\x5d\x37\xba\x20\x6c\x47\x58\x89\xe1\xed\x37\x71\x98\x58\x98\x48\xde\xe6\x33\x51\x7f\x68\x5a\x19\x91\xda\x8f\x4a\x18\x75\x83\x9a\x78\xef\x45\xd3\x06\xd5\x63\x51\x35\xba\xdd\x7e\x3a\xac\x51\xd5\x6f\x16\xbf\xfc\x8b\xf3\x0e\x59\x12\x2a\x34\x74\x8e\xd0\x20\x0b\x89\xef\xa0\x5f\x82\xae\xe5\x13\x78\x20\x13\xb7\xf7\x39\xab\xcc\x54\x4b\x98\x8d\x01\x46\xd4\xe9\x38\x0a\xcf\x4a\xc5\xc9\x78\x9c\x04\xbc\x4f\x57\xce\xef\x4d\xc2\x89\xef\x8d\x8b\x01\xe3\x20\xe9\x22\x0c\x1e\x1c\x5f\x8e\x07\xe1\x43\x8c\x69\xe4\x78\x10\x75\xde\xdb\x8e\x98\xa7\x61\xcd\x96\x89\xc8\x04\xd5\x37\x22\x5c\x8d\x47\xc2\x2f\x5a\xec\x48\xac\x67\xe8\x60\x34\x3e\xd4\x3b\x47\x13\x8f\xfb\xd7\x6c\xa2\xd6\x93\x84\xdd\x30\x30\x28\x8e\x7f\xe0\xfb\x61\x78\x43\x33\x91\xde\x03\x75\xa3\x76\xe9\xde\x34\xb6\x1a\x7d\x4c\xea\x8c\x08\xab\x7c\xe6\x13\xdc\x8e\xf8\x88\x33\xeb\x0f\x3a\x89\x0a\x3c\x35\x0a\x52\x78\x99\xd4\x5d\x17\xe9\x00\x9d\x98\xba\x03\xc7\xda\x36\xf3\xf4\x2c\xaa\x90\xd5\xf1\x18\xf6\x8e\x59\x2f\xc6\x0f\x78\xa3\x23\x65\xef\x43\x90\x05\xd2\x44\xad\x06\xd7\x47\xbb\xf1\x90\x73\xa2\x83\x7c\x98\x4d\x4b\xb8\xcc\x78\xfd\xd8\xce\x5a\xf5\xca\x19\xb5\xa2\xa8\xfb\xa5\xac\xb1\x20\xed\x31\x50\xc8\x82\x85\x1a\x45\xe5\x57\xc3\x2c\xf9\xa1\x4b\x96\xb2\xbf\xea\x91\xc5\x16\x4c\xf6\xea\xb9\x11\xad\x8f\x47\x61\xa8\xf6\x1f\x53\x89\xe0\x60\x0e\x46\x32\xad\x46\x9c\xfb\x97\xfb\x20\x3f\xc9\x0a\x75\xeb\x14\x0d\xcd\x8a\xd9\x5b\xc6\x14\x9e\x5e\xe5\xb2\xca\x3e\xb5\xb3\x1d\x61\x00\x49\x90\xe5\xda\x0c\xae\xaa\x87\x16\x86\x18\xe1\x57\x0c\x8c\xb1\xc7\xa1\x81\x19\xac\x70\x78\x3c\x8a\x1b\x6c\x66\xe3\x10\x2f\xfc\x9a\xf1\x98\x4b\xf0\xee\x31\x1d\x0f\xfa\x3e\x3c\xc6\x7d\xe0\x8d\x08\x05\x1e\xdb\x7d\xd2\x60\xc8\x81\x74\xc4\x87\xfd\xd4\x34\x61\xb1\x03\x3b\xe6\xb1\xf8\xe6\x3b\xe6\xb1\x83\xa8\x7a\xe4\x0d\xee\x8e\x0b\xd3\xeb\x9a\x6c\x7b\xff\xfe\xa8\x97\x20\x3f\xc6\x30\x94\xcf\x35\x52\x91\xd4\x07\x71\x1b\x56\x33\x06\x79\xc8\x1a\xd8\x3d\xf4\x97\xe0\x72\x38\x3c\x0d\xeb\x50\x2e\xe5\xd5\x42\x29\x99\xb4\x55\x76\xb6\x5e\xc6\xb4\xaa\xeb\x34\xd0\x2f\xcd\xbe\xe1\x3d\x7a\x3d\x4b\xe2\x76\xbb\xaa\x09\xc1\x2c\xfc\x84\x17\x33\x18\xe7\x5b\xdf\x32\x0f\x74\x68\x10\x97\x08\x19\xcf\x03\xb6\x5a\xe4\x5a\xbb\x82\xba\x78\x48\xc0\xb4\x45\x10\xc3\xb5\x79\x27\x79\x99\x55\x12\x71\x97\xd8\xc4\x0d\x51\x2f\x89\xbd\x27\x6f\x88\x66\xea\x11\x4c\xdc\x22\x5e\xa7\x45\xf7\xd5\xd5\x8e\x33\x3c\xd4\x15\xda\x36\x79\x41\x66\x83\xf7\xc0\x92\xd5\x53\xde\xd4\x92\x80\xd2\xd5\x5d\x5c\x2c\x5e\x92\x38\x1d\x97\x9f\x46\xb7\x93\x99\x9b\x27\xeb\xc2\x81\x22\xc4\xbd\x46\xfe\xce\xbd\xf2\x7a\x97\x36\x3a\x45\xf5\xcc\x47\xff\x5e\xfd\x3d\x06\xc7\xda\xfc\xde\x0e\x55\x87\xa5\x1a\xfd\xa9\xde\xe4\x29\x2f\xa7\x8c\x84\xf1\x93\xc8\x29\x3f\xa4\x27\xfa\xf6\xd9\x8a\xb5\xae\xab\xcf\x7d\x45\xe6\xb1\xf7\xb9\x0e\x7c\x37\xdd\xf7\x4d\x98\x72\xd6\x15\x24\xec\x27\xec\x7e\x4b\x3a\x29\xff\xcb\x5e\x53\xa4\xf8\xdf\xb6\x71\x93\xe6\x69\xe7\x7f\x52\xac\xeb\x7f\x62\xa7\xf0\xa0\x29\xf0\xf2\x21\x84\x4b\x2c\xea\x7f\xe7\xc7\x6b\x41\x4d\x7e\x63\x13\x54\x15\xad\x51\x30\x49\xc9\x9e\x9e\x8b\xcd\x26\x04\x0f\xdc\xe4\xbc\x65\x1c\x3c\x7b\x0f\x66\xc4\xba\xa6\x60\x71\xd8\xba\xcc\xa9\x2a\x2f\xb2\xc1\x78\x99\x69\xf3\xc6\x12\xc4\xa6\xd4\x3a\x41\xeb\xb9\xa8\xba\x26\x4e\x93\x71\x98\x12\x79\x8a\x35\x26\x53\x50\xed\x9b\x0c\x79\x6e\x90\x6f\x64\xb2\x9c\x16\x1f\x91\x5d\xcc\xe5\xf7\x0f\x26\xbc\x1f\x10\x75\x85\x73\xad\xd6\x9c\x4c\xca\xa4\x89\x8d\x25\xc8\xf1\xf3\x13\xfa\x78\x24\xfc\x80\x89\x7c\x71\x53\x7d\x4b\x27\x07\xed\x30\x9f\x63\x1b\x9b\xa6\x98\xae\x5d\x25\xbc\x59\xc5\xfe\x11\xb1\x93\x0a\x11\x85\x2d\xcf\x5c\x08\x50\x6e\xd6\xd9\x9a\x39\xdb\xd9\xfb\x34\xe3\x65\xeb\x6f\xb3\x73\xcf\x4d\xd5\xb4\xf5\x9e\x23\x64\xd4\x0e\x24\x9f\x5d\x98\x48\xb0\x89\x20\x77\xba\x04\x17\xca\x7a\x4c\x0e\x2a\xa8\xe9\x5c\x39\x27\x5a\x78\xcf\xa1\x30\xe1\xac\x36\x42\x41\xd8\xbb\x31\x74\x25\x64\x06\xa8\x73\x91\x24\xb8\x97\x1c\x2a\xf0\x2e\x48\x16\x77\x73\xc3\x76\xa4\x1f\xde\xc1\xbb\xe6\xb1\xc9\xba\xe5\x66\xad\xe3\x57\x6a\x40\xb8\x0e\x41\x88\x76\x51\xc7\x88\xf9\x70\xf4\x9f\x03\xed\x8c\x17\xf6\x86\x46\x43\x05\x52\xd0\xbc\x68\x5d\x5c\x1f\x4d\xca\x6f\xcc\x11\x05\xb8\x6d\xb7\xec\xa5\x70\x34\xa7\xbf\x3e\x96\x00\xef\xf0\x20\x62\xdf\x85\x23\x9b\x98\xb0\xd2\x78\x52\xe0\x5d\xf6\xf1\x65\x74\x27\xc9\x72\xe2\x30\x3e\x15\xef\xf2\xde\x1d\x69\xe7\x29\x11\xe8\x21\xee\xde\xd8\x7b\x38\xcf\x00\xcb\x0f\x0f\xb3\x37\x08\x93\x32\x79\xb2\x65\xcf\xb9\x27\x5c\x3e\x30\x4b\x8a\xd6\x2c\x3a\x35\x2f\x4e\x83\x19\x5a\xcd\x81\x47\xb0\x25\x31\x9b\x55\x67\x69\x88\x3f\x4e\x1f\x78\x70\x8e\xfe\x48\x26\x37\xf4\xe0\x88\x3e\x64\xe2\xc8\xf9\xf8\xab\x2e\x91\x1c\x6e\xd3\xba\x0d\x2e\x72\x73\xdb\x1f\x78\x8f\x0e\x6d\xa2\xef\x6f\x37\x0f\x58\x16\x28\x9d\x1b\x5a\x3a\x98\xd0\x16\x67\xfc\x18\x01\x5a\x46\x92\xee\x90\x45\x92\x18\x47\x3c\xc0\x86\x8d\xad\xcd\x7c\x84\xde\x37\xf0\x69\x58\x6e\xea\xa6\xee\x49\x1e\x4c\x8d\xb9\x81\x8e\xa9\x7e\x39\x0a\x79\x1b\x53\x83\x84\x3e\x64\x2c\xe9\x39\xd4\x89\xa9\x74\x1f\x94\x2f\x8f\x0c\x53\x58\x06\x14\x8c\x39\x2e\x53\x0f\x3a\xed\x35\xdb\x37\xa4\x4e\x97\x8a\xf3\x2c\x10\xb3\x30\x65\xd1\xab\xa0\x5f\xad\x57\xaf\xba\x98\x03\x57\x3c\x24\xce\x3a\x7a\xc8\x31\xae\xb5\x5b\x0f\x78\x57\xf3\xa3\xfb\x65\x41\x47\xa8\xdf\x2d\xb1\x26\xc2\xaa\xb1\x09\x91\x73\x36\x44\x7f\x82\xee\x40\xb8\xf7\x51\x2f\x66\x74\x5a\xd3\x0e\x91\x86\x44\xc3\x94\x83\x7d\x53\xfd\xf3\x26\x9d\xac\x7b\xbf\xa6\x21\x14\xdd\xa1\xda\x66\x6d\xb7\x69\xbc\x1b\xac\xec\x2b\xe5\xe2\x0f\xac\x2d\xd7\xb8\x69\x89\x6c\x7d\x1e\x0f\x1c\xac\xa7\x2b\x67\x09\x8c\xc9\x34\x4c\xb0\x62\xef\x5f\x8b\xdd\xa6\xac\x30\x50\x26\x1f\x52\x59\xcd\x77\xc9\xe2\x2c\x6d\x56\x70\xf8\x94\x74\x7e\xc6\x2a\xf2\xee\x76\xea\xd5\x9f\xd3\x75\xc7\x69\x42\x05\xf0\xcb\xb4\xad\x44\xe5\xe1\x20\x57\x75\xdd\x91\xc0\x48\xe0\xc4\x6f\xb3\x6f\xb1\x0d\x14\xf4\x8e\xb5\x15\xf8\x5f\xbb\xb8\x25\x52\x67\x52\x9f\x4d\xbf\xa6\x7b\x4b\xa4\x5f\x3a\x0e\x97\xea\xd9\x19\xd2\x6f\xaa\xa8\x33\x38\x51\xc3\xfa\x93\x23\xb8\xa9\x81\x75\xbc\xde\xa6\x87\x47\x80\x1b\xf7\xec\x01\x60\xde\xb7\xfe\xf4\x08\x6e\x68\x62\xd7\xd4\xe7\x20\x6d\x9b\xe5\xaa\x5f\x13\x6f\x8d\x10\x03\xdb\x25\x7b\xa6\x1c\xb8\xd0\x0c\x16\x3d\x26\xb0\xe8\x25\x32\xef\x92\x48\xfc\x82\x1b\x11\x2f\x2b\x47\xfb\xd7\xb4\x31\x5d\xcc\x1e\x57\x93\x2d\x3d\x7a\x10\x3d\x53\x00\x9f\x59\x26\x91\x13\x61\x63\x58\x4c\xd3\xcb\x0e\xd6\x79\xb2\x89\x53\x51\x2e\xaa\x18\xa7\xd7\x7f\x38\x45\x44\x5c\x17\x2e\x64\xbd\x27\x2e\xd9\x04\x5f\x47\xff\x08\x67\x40\xd4\x8a\x04\x17\x0f\x9e\x85\x51\x82\x17\x74\x5d\xf3\x40\xff\x24\x09\xd8\xd9\x5d\xe9\x7e\x78\x7a\x05\x77\x1a\x78\x45\x90\x68\x1b\x99\x6b\xdb\x09\x34\x4b\xa0\xbb\x18\x77\xf2\x46\x58\x33\x0a\x01\xd5\x61\x4c\xc0\x69\xc7\x44\xbd\x1e\xf8\x98\x4b\x74\x00\xf2\x02\x90\x3e\x22\x38\x13\x1d\x43\xb8\xb3\x7a\xfe\xfa\xaa\xb0\x29\xa3\x17\x28\xca\xb4\x0e\xcc\xc9\xc6\xf2\xc3\x16\x65\xc9\xc8\x6e\x4d\xca\x0a\xa5\x2f\x48\xb2\x52\x3f\x18\xc6\x3e\x11\xc7\x6a\xcb\xad\x71\x22\x00\x05\x19\xc4\x50\x92\xaf\x01\x97\xa9\xdf\x34\xf1\x82\x75\x7e\x67\x27\x76\x29\x62\xcf\xfc\x26\xdd\x60\xcf\x25\x1c\x00\xa2\xcf\x05\xb1\x0e\xe0\x27\x02\x1e\xce\xea\x20\xf0\x24\x45\x32\x6c\xba\x29\x06\xee\x9b\x92\x51\xfe\xc6\xb8\x7d\x73\xad\x1b\x46\xe7\xd6\x89\xb1\xb8\x25\xfe\x89\x61\x0a\xe0\x27\x46\xf2\x55\x48\xce\x53\x2b\x99\x6e\xfd\xba\x45\xbd\xc9\x54\xc8\x0c\xea\xef\xd3\xe8\x91\x88\xd0\xf2\x4a\x47\xaa\xec\xe2\xb6\x7d\x53\x37\x89\xd1\xc7\xbb\x88\xb6\x65\xea\xdb\xe0\x1b\x79\x16\xe4\x1e\x12\x71\xe8\x06\x3d\x19\xc2\xc9\xc9\xfd\x77\xb1\x0c\x65\xaf\x15\x2b\xdc\x60\xc6\x75\x6b\x61\xcf\x0a\xaa\xae\x7c\xff\x1b\x81\x29\xe3\xef\x34\x97\xaa\x49\xf8\xfc\xcc\x64\x7a\x0e\x12\x73\xd3\x76\x3d\xe5\x34\xcf\x87\xea\x89\x1e\xf2\xce\x23\xe6\xa8\x2f\xbc\xb4\xdd\x92\x1d\x5a\xf5\x2f\x2e\xf8\xc2\xbd\x4f\x34\x94\xdb\x5d\x6d\x11\xc9\xd5\xec\x21\xbd\xdf\xeb\xa6\xe3\x7d\xd6\x85\x1f\x75\x57\xd7\xb8\xa9\x61\xf4\xea\x64\x6b\x1c\x78\x8d\xe3\x50\x4a\x00\x54\x3a\x6a\x69\xb5\x71\xe9\x2e\x5c\x37\x7c\xd0\x4d\x9d\x63\x2f\xee\x46\x26\x2a\x34\xdf\x47\xc1\x9c\x03\xb8\x12\xe0\x2d\x15\x73\xd7\x5e\xe5\xe0\x75\x9c\x97\x15\xdb\xcc\x93\x39\xf6\xd4\x29\x65\xb5\xe5\xa0\xd9\xac\xdc\xd5\x4d\x27\x59\x92\xfd\x71\xdd\x98\x71\xf9\xfd\x3a\x08\x0f\x92\x1e\xa0\x17\x4a\x56\xfc\xb7\x60\x02\x3e\xb6\x81\x9b\x73\x03\xf3\x85\x5e\xf1\x8e\xa8\x09\x5e\xdf\xdb\x2c\xbd\xb2\xf6\x29\x27\xfe\xf0\x73\xe2\xcb\x43\x7a\x79\xc1\x0b\x67\x52\xbc\x05\x44\x77\xb0\xdd\x46\xb5\x4d\x1a\x0f\x73\x46\x91\x99\x7c\xcf\xce\xcd\xa3\x4a\xbd\x57\xf7\x1d\x60\xf4\x45\x95\x3f\x0e\x04\xdd\x81\x43\x90\x0e\x63\x05\x6e\xc2\x8d\xc4\x57\xef\x41\x9a\x85\xaa\x3b\xd3\xc0\xb4\x83\xd1\x84\xa0\x95\xf1\x2f\xe1\x18\xb1\x32\xb4\x10\xc6\x0e\x3c\x18\xd4\xc8\x13\x4c\x56\x7c\xda\x7f\x9a\x9a\x93\x07\xe6\x01\x0d\x08\x0c\xf4\x43\x22\xc0\x55\x3c\xec\xce\xbf\x43\x47\x25\xfe\x64\xfd\x94\xc4\x86\x35\x13\x15\x32\x63\xf3\xb0\x37\xbe\xe5\xc3\x5e\x04\x38\x30\x2f\xcb\x27\xaf\x67\xf9\x10\x9a\xb8\xe5\x9b\x64\xa5\x6f\x8d\x3e\xb9\xd0\xd4\xc9\xd8\xb1\x38\x48\x4a\x6f\xbe\x0f\x33\x14\xb3\x6a\x5b\x71\x6f\x30\xd8\x10\x7b\x0f\x47\x2d\xb5\x5c\x04\x61\x71\xa3\x65\x8b\x80\x16\xb9\xd1\xcb\x07\x97\xb9\x48\x7e\xa7\x1c\x93\x6c\x92\x46\x0a\xc0\xa4\x6f\x99\x37\x5a\x6e\x90\x47\x69\xde\xd4\x78\x85\x8e\x80\x28\xbd\x90\xb2\x36\x25\xf1\x25\xeb\xf6\xb8\xa4\x5d\xbd\xae\x0b\xb4\x7e\x81\x68\x44\x39\x6e\x6a\x57\xe7\xb0\xfa\x2b\xf0\xe8\x5d\x8c\x7c\xde\xd6\x6d\xa7\xc2\xab\x7e\x01\x46\x59\xbc\xa0\xff\xe8\x6f\xd6\x3c\x26\x95\xaa\x1b\x09\x9d\x9f\x7e\x79\x94\xf9\x65\x86\x6c\x39\x88\x17\x71\x43\x98\xa7\xb5\x9d\x04\x60\x86\xba\x7d\xbd\xc7\xb9\xfe\x14\x01\x50\x76\x0c\x7f\x1c\x6d\x89\x6d\xda\xc6\x85\xbe\xdc\x28\x25\x79\xb1\x6a\x77\x14\x89\xb5\x1a\x3f\x3c\x57\xff\x33\x79\xbc\x00\x7f\xd9\x16\x14\x12\x68\x58\xe3\x98\xf2\xf5\x31\xc4\x63\xcf\x24\x52\xb7\x02\xcc\x13\x67\x37\x08\x1e\x39\x36\x92\xef\x9c\x2d\x00\x3e\x24\x4d\xdd\x87\xf3\x66\x1f\x77\x5d\x93\xad\xfa\x2e\x9d\x7e\x36\xc9\xca\x19\x09\x3e\x79\x08\xfe\x70\x30\x89\xc4\x46\xfd\x55\x5d\xfb\x3e\xde\xd1\xf8\xe0\xae\x16\xc5\x0c\x36\x22\x8c\x43\x86\x60\xd8\x29\x0f\xf0\x24\xb9\x69\x5c\x6d\x2f\xd3\x38\xab\xf7\xf1\x8d\x80\x74\x96\x8a\xc5\xc3\x7b\xc8\x18\x13\xdf\x00\xd7\x42\x4e\x5d\x71\x8a\x46\x75\xd0\x39\xfd\x32\x72\x56\x96\x3c\x33\x75\x85\x08\x42\x1d\xa8\x4d\x48\x8c\xd8\x60\x4d\xbe\xe0\x20\xb1\xad\xed\x84\xed\x99\x0a\xe7\xfc\x1c\x06\x50\x25\xa8\xf6\xb2\x8d\x17\xcf\x5a\x3a\xf6\xd1\xd9\x89\xb9\x3b\x65\xb7\x5b\xb2\x3a\xfe\xec\xd9\xcb\x17\x51\x88\x1f\x82\x1b\x08\x48\xb9\x25\x00\x94\xab\xd2\xf6\x5e\x21\x5f\x18\x2e\xc4\xad\x31\x25\x26\xec\x87\xdc\xbb\x56\xac\x6c\x91\xb1\x6d\xeb\x35\x14\xa6\x7e\xb2\x82\xb9\x26\x78\x99\x8a\x0d\xe7\x23\x51\xa9\x93\x2b\x2b\x7c\xbd\x9d\x9f\x66\x09\xa3\xab\xbf\xd7\x79\xd1\x9b\xea\x1a\x28\x28\x83\xcf\x2c\xe2\xcb\x1f\x1d\x1f\xf9\xb4\x4a\xbc\x19\x7c\x74\xb6\xec\x8a\x76\xf1\xf2\xe9\x59\xf4\xcb\xbf\xb2\xf3\x26\xd5\xd4\xff\x3e\x8a\x33\xab\x40\x04\x04\xc0\x4b\x18\xd1\x88\x6d\x47\x9d\xd3\xfa\xfa\x2d\x31\xd8\xb1\x8d\xd6\x76\x42\x43\x36\x28\x06\xd6\xfe\xb4\xb9\x40\xb8\x5a\x3e\x6f\x2f\x4e\x9e\x45\x67\xf8\xd0\xfa\xb8\x49\x47\xc1\x51\xf4\x8d\x64\xb0\x78\x6e\x42\xf0\x1b\x69\x00\x13\x9f\x18\x53\x97\xed\xb0\xe8\xbb\xfe\xea\x7b\x7f\x95\x25\xb3\x78\xb0\xdb\x27\x5e\x10\x09\xc7\xe5\xea\xa6\xf8\x8c\xe5\x3e\xa8\xc6\x01\x00\x1c\xe9\x08\x05\x8f\x10\xf4\xd0\x83\xb1\x79\x40\x1c\xbc\x16\x82\x7e\xde\xc3\xfb\xd2\x6f\xe6\xa6\xd9\x39\xae\x4d\x89\x82\x0d\xac\x15\x8a\x27\xe2\x74\xe2\xc3\x2c\x85\x4a\xb1\x37\x49\xd8\x81\x38\x95\x8c\x61\x6d\xd4\xc0\x00\xda\x2a\xdc\xdf\xe1\x1e\xa2\x07\x8b\x39\xb5\x4c\x9f\x08\x8e\x1a\x23\x5a\x11\xab\x63\x4a\xf8\xdc\x24\x08\x2e\x61\x8a\xc4\xc5\x71\x60\x80\x17\x26\x6e\xa5\x21\xb5\x64\x78\x21\x43\xe9\x4b\x06\x1c\xe5\x4f\xf9\x7c\x42\x56\x17\x92\x9a\xc1\x9b\xbb\xcf\xc0\x85\xcb\x34\xcd\xc8\x89\xc9\xdd\xe8\x92\xd5\x00\x2f\x38\x26\x0a\xed\xf0\xa0\xa6\x0a\x1d\xef\x76\x72\x6d\xbe\xde\x6f\xf8\x86\xc9\xa5\xf1\x4a\x2f\x98\xbe\x6a\xa1\x7d\x15\xe1\x43\xe0\xe9\xbe\x85\x08\x5f\xef\x2b\xd4\x88\x61\xd0\xef\xf5\xf9\x39\xb6\x10\xb9\xa9\x88\x7b\xfb\x7b\x7a\x81\xb8\x3b\xa7\x1a\xb7\xe2\x19\x9e\x1e\x99\x06\xb2\x96\xef\x2f\xb4\xda\xac\x19\xde\x30\x9a\x56\x1f\x5f\x42\xd5\x4f\xeb\xcd\x91\xbb\x78\x1c\xff\xc2\xb4\x23\x0a\x49\xd3\x12\x71\x77\x4c\x32\x03\x23\x2b\x8d\xdb\xa3\x0e\xde\xc0\x01\xad\x83\x0b\xa0\xfd\xb1\x31\x3b\xdb\xd4\x35\xdc\x13\x88\x06\x30\x2f\xfb\xe4\xea\xa7\x3c\x7a\x45\x82\x98\xdd\x15\xb8\x09\xac\xf9\xb1\x9a\x07\x7b\x16\x93\xf8\x18\xc9\x13\xb8\x51\x15\x9a\xe4\x10\x9e\x66\x29\xd0\x60\x62\xc6\x7d\x70\xf2\x78\x61\xff\xee\xc3\x0e\x6e\x88\x8f\x1d\x28\xd2\xe2\xe8\x95\xe2\x35\x78\x09\x97\xf3\x2a\x1d\x90\xac\xc1\x52\xd8\xe6\xdb\xad\x3d\x55\x67\x8f\x0f\x1f\x29\xc0\x05\x3c\xac\x5f\xc0\xe9\xbb\x97\x1a\x39\x77\x29\x67\x75\xf1\x58\xde\x0c\xc9\x59\x25\x61\x4c\x3c\x55\x3a\xbf\xde\xa1\x13\x84\x32\xc7\x65\x7a\x1f\x39\x74\x4b\xe5\xca\x8e\xfa\xe8\x14\x72\xb5\x0f\xe3\x16\xd6\xac\xa5\x5f\x8a\x87\xa9\x1c\xc2\x87\x21\xf4\x99\x6d\xc4\xe1\x7b\x82\x55\x17\xd0\x0d\x3a\xe3\xa6\xf8\xef\xe8\xce\x11\x15\xdc\x93\x82\xa3\xbb\xa3\x1a\x30\x8a\x96\x7d\x29\xaf\x84\xb3\xcb\x54\xd2\xe1\x2c\x9e\xc9\x67\xf3\xa8\x37\xfa\xfa\x92\xb0\x09\x3f\x54\x7c\x62\x52\xe3\xdc\xd4\x4a\x7b\xa0\x81\x5c\x35\x7e\xe6\x36\xad\xcc\x46\xfe\xd1\x79\xaa\x1c\xde\x50\x02\xb7\x32\x8a\xeb\x9f\xbe\xfa\x0c\xbf\xfb\xea\x09\x38\xee\x23\x1f\x37\xef\x60\x79\x45\x6d\x5b\xc8\x1d\x3b\x3b\x7b\x1a\xc9\x8b\xbc\x6c\xa2\xd8\x30\x31\x77\xda\x18\x8f\xc8\xa2\x5b\x60\x18\x11\x12\xfc\x96\x70\x2e\x77\xbd\x3a\xbc\x11\xde\x76\xea\x27\xdb\xc4\xad\xf6\x2f\x45\xd6\xa5\xbf\xbb\x05\xa7\xb2\x5b\x5d\x96\xac\x6c\x23\x3e\x1a\xcd\xf8\x31\xa4\x9c\x78\xe1\x28\x0e\xae\x91\xd5\x36\xa6\x60\x67\x6d\x2c\x58\xc3\xd6\xc2\x2d\x1e\x34\x13\x6a\x92\x22\x1b\x61\x35\xc3\x90\x58\xad\xe4\xe3\xec\xb2\x44\x96\x3e\x41\x61\x76\x4c\x78\x11\x2c\xc0\xea\x2d\xa2\xc1\xfc\x6d\xbd\x97\xfd\x2f\x6f\xfd\xf7\xc6\x76\x74\x92\x3e\xd1\xa4\x53\xe4\x07\x83\xcf\x85\x18\x9d\x30\x31\xf2\xdf\x20\xe3\x4d\x27\xc7\x64\x30\xd5\x79\x4a\xaa\x46\x35\x33\xb2\x7a\xd3\xe1\x64\x3e\xfc\x44\xa3\xbf\x9b\x50\xb6\xf2\x6e\xeb\x78\x47\x22\x7d\xbc\x78\x20\xff\x1e\x8d\x98\x35\x43\x92\x24\x4a\x07\x5e\xb1\x2e\x0b\xf6\xf4\x78\x52\x27\xb4\x73\x44\x33\x4b\x97\x39\x7c\xa2\x22\x1e\xff\x74\x4e\xb6\x3c\xdc\x80\x13\x4a\xf9\xde\x70\xde\x29\x7b\x70\x4c\x08\x23\x3d\x38\x83\xb0\x3d\x07\x0f\xd0\x5f\xfa\xb4\xa7\xee\xd2\x6a\x03\x1c\x82\x30\x60\xb9\x5b\x2b\xbb\xc6\x12\x59\x83\xd5\xf9\x44\x09\xfd\x67\xf2\xac\xd8\x8f\x4e\xb0\x7c\xa5\x77\x62\xde\x9b\x9b\xf6\xf7\xda\xb1\x0f\xcf\xf8\xd7\xe1\x51\x2b\xf4\x24\xba\xd7\x32\x73\x2e\xe8\xee\xd5\x8b\xc7\x0f\x9f\x3e\x3f\xda\xf7\x37\x6e\xb7\xd6\x1b\xa3\x11\x2d\x98\xc0\x3a\x5a\x72\x08\xc9\xb0\x3d\x80\x51\x39\xcb\x9a\x8c\xc2\x1f\xde\x43\x6e\x52\x26\xa4\x46\xf1\xaf\xd0\x16\x70\x79\xce\xc9\xbc\x25\x05\x4d\x9c\x34\xf2\x6e\x4c\xe2\xc2\xc9\x2d\x68\xc5\xc1\x9f\xa3\xba\x78\x1e\x29\x08\x5c\xca\x19\xbe\x47\x2d\xb6\x78\xd4\xfb\x7e\xed\xb1\x0f\x8b\x65\x94\x98\x66\xeb\xa6\xb0\x63\xd6\xe1\x3d\x11\xd8\x70\x4b\x4c\x99\x58\x03\xb5\x9d\xab\x7f\x54\x2b\x31\xf9\x1f\x6c\x4b\xe0\xe3\x84\xae\x1c\x58\x26\x5b\xe1\x6b\x96\x04\xf6\x43\x76\x49\xc0\xd9\x7a\x7f\x11\x17\x1e\xfc\x49\x03\xf6\xe9\xfa\xed\x10\x94\x7e\x54\x1e\x58\xc8\x3c\xba\xed\x13\x27\x63\x33\x7d\xc1\x5b\x87\xf9\x0f\x05\xdf\x35\xf5\x45\xc6\xaf\x40\xa5\xc2\x19\x37\xbe\x0f\x4e\x86\x81\xb1\x68\xde\x83\xb9\x61\x55\xe8\x7e\x67\x2a\x6e\x12\xd7\xda\xa4\x97\x01\x4f\xa2\xf8\x0a\xc8\x44\x20\x15\x88\x11\xc0\x14\xe2\xd9\xac\xed\x9a\x89\x89\xf0\xd1\x03\x5d\xb1\xdc\x98\x15\x87\x93\x2b\xb2\x73\xf1\x51\x70\xcb\x01\xf4\x34\x04\xdf\x76\xdd\xae\x0d\x22\x5c\x71\x28\xcd\xb3\xc1\x4c\x5c\x6b\x3a\x9d\x41\x6b\x76\xb9\x32\x36\x22\x9b\xd5\xfa\x2a\x45\x64\xf8\x83\xcb\x64\xa0\x95\x94\x2a\xb8\x50\xd2\x11\xd9\xd8\x34\xf2\xa4\x6e\xf1\x48\xff\x38\x40\x03\x75\x71\xcf\xd3\x04\x1e\x93\xc8\x85\x2c\xd5\x34\x93\xc3\x17\xe6\x7b\x74\xc2\xdf\x5b\x3b\x76\x98\x4d\x74\xdc\x30\x97\x3c\xe0\x3f\x7b\xa1\xa3\x3e\x8c\x19\x10\x87\xf4\xd8\x66\x9b\x2d\xa7\x77\x58\x9c\xca\x67\x62\x22\xcf\xcf\xa3\xb3\x7d\xd5\xc5\xdf\xd1\x08\xb5\xd4\xaf\x0f\xa3\x14\xd7\x85\x64\x43\x0c\x19\xc1\x71\x9d\xa7\xf8\x19\xdd\x39\x27\xc9\x14\x52\x5b\xb5\xa1\xc6\xc0\xde\xdf\x3d\x58\x19\xf1\x85\x1a\xa2\x66\x50\xa1\xdb\x66\x1e\xd8\x6f\x83\xb6\x50\x63\xba\x2d\x89\x90\x61\x5b\xf8\x02\x3f\xa3\x3b\x5d\x1d\xad\x48\x86\x26\x96\xa2\x0a\xaa\xd1\x61\x8c\x9b\x4d\x2b\x67\x70\xd3\x73\xf2\xf0\xa0\xd9\x6c\xd3\x18\xe7\x1a\xd0\xa0\x67\xfc\x3b\xc3\x03\x6b\xf9\x12\x02\x73\x8a\x17\x07\xcb\x99\x5d\xbe\x66\xe5\xc2\x14\xfc\xba\xa8\x2b\xd7\xf4\x03\xfc\x8a\x9e\x1b\xdf\xd8\xa9\x0a\x1c\x7d\xcc\xc0\x73\xe0\xb1\x1b\xc1\xd5\x14\x0e\x60\x9a\xdf\x18\xd4\x97\xbd\xf4\xb0\x40\xe6\x3a\x78\xc4\x01\xc7\xbc\x2b\xa0\x58\x28\x34\x8e\xec\xf3\x75\x43\x8c\xd9\x83\x06\x56\x79\x76\x23\x66\x8f\x16\x53\xe8\x11\x37\xf3\xa9\x25\x7c\x98\xf4\x45\xba\x78\x81\x4c\x37\xb1\x2b\xf0\xd3\xc1\xcb\x8d\xb4\x45\xc3\x0c\xf2\x83\xe2\xf4\xbb\x74\xdd\x5b\x3f\xa8\x81\x08\xeb\x79\x02\xb8\xe6\x6a\xd6\x36\x18\xc8\x58\x22\x92\xa4\x88\xa7\x69\x3d\xf4\xc7\x79\xfa\xcc\x04\x20\xda\x05\xaf\x0c\x2c\xfe\x98\x1a\xd0\xe4\x78\x80\x6b\xf4\x91\x80\xf1\xc3\xd7\x54\x54\x90\xe7\x26\xde\x0d\x64\x16\x9c\xa3\xcf\x20\xdc\x1a\x91\x59\x8d\x2d\x62\xe0\x22\x0e\x32\x62\xd4\x56\x5e\x44\x1a\x53\x17\x2c\xe3\xe0\x3d\x80\x1d\x45\x5a\xa4\x6b\x7e\xc5\xcd\x4e\x8c\xc2\xad\xe2\xfd\xb5\x85\xa0\xf5\x38\x04\xc3\xea\x2f\xe5\x6e\x0c\x78\x56\x89\x14\x2e\x95\x38\x96\x44\xca\x32\x4f\x64\xa4\x71\x28\x42\xb2\xc6\x6b\x9f\x15\x61\x02\xcf\x8e\x56\x9c\x0f\x87\x6d\xc4\xac\x5b\x1b\x00\x9a\x61\x04\xcb\x14\x00\x8a\x34\x97\xed\x82\x0f\xcb\x4f\x58\x75\xe1\x4f\x2b\xd8\x66\xf3\xbd\xde\x99\x65\x1a\x8d\xd0\xc4\x9d\x90\x5d\x5a\xf9\xdd\x4f\x7a\x13\xcf\xbe\x91\x85\x7f\x6d\xc2\x14\xb0\x2d\x97\x3d\x91\x83\xf8\x6e\xb7\x25\xff\x7c\x10\xae\xb0\x49\x2b\x9b\xe5\xc4\xa4\x0c\xfe\xc4\xa5\x0c\x66\x1f\x71\x71\xcd\x56\x5d\xb7\x97\x5a\xf9\xb7\x92\xd7\xfe\x77\x9a\xd7\x9e\xe3\x71\x88\x0a\x2e\x01\x5d\xd2\xd4\xf8\x68\x38\x48\xc7\x8c\x3a\xff\xa1\x75\x2e\xad\xb7\xcf\x30\x67\x73\xdb\xac\x3f\x9e\xe8\x82\xdf\xb0\x9a\x17\x4d\x48\xc8\xa3\x53\x66\xb3\x23\x67\xe0\x37\xf3\xfd\x58\x2c\x91\x1f\xcb\xcc\x7f\xe3\xf2\xef\x4b\xbe\x7d\x92\xee\x4c\x32\x7f\x49\x32\xfa\x6b\x5a\xc8\x91\x1e\x94\xdb\xd0\x64\xc6\xbf\xa6\x11\x97\xa6\x58\x46\x23\x13\x0a\xf3\x60\xfb\x0d\x6a\x36\xeb\x61\x7b\x07\x92\x20\x9b\xdd\x4e\x7a\x33\xd1\x7f\x57\xcb\xa3\xc9\xff\xbb\x1a\x1e\x2e\x08\x9d\x24\x38\x84\x7e\xf8\xda\xc6\xf2\xe8\x06\xce\x29\x09\x5a\x9a\x48\xd5\xfb\x21\xc3\x2c\xbd\x31\xfa\x39\xb3\xbf\x9d\xd9\x0c\x04\xde\xcd\x93\xcb\x64\x6f\xd2\xc4\x4d\x3c\xb2\x69\x5e\x60\x43\x9f\x71\x4c\xcd\x2e\xde\x2c\xe4\xed\x8d\x5f\x43\x6e\x43\x7b\xeb\x73\x37\xa8\xf1\x9d\xd2\x4b\x42\xad\x66\x9d\xe4\x95\x9c\x79\xf9\xe1\x39\x59\xf7\xfd\x1e\xe1\xcc\x5c\x1e\x70\x1b\x7c\x3e\xc8\xe3\x6e\x32\x21\xfb\x2f\x2e\x09\xc9\x74\x75\x5d\xbc\x9e\xc5\x9b\x7a\xc1\x6a\xfa\xd9\x79\x53\x97\xf2\x50\xfc\x2d\xdd\x25\xe8\xf5\x67\xf2\x0b\xcf\xc6\x67\x9f\xb4\x8b\x4f\x4c\x04\xed\xdb\xed\xec\x93\x92\x7e\x6a\xca\x69\xfc\xdc\x72\x69\xdc\xf1\x8f\x84\x7e\xc0\x7a\xc2\x3f\xde\xd0\x8f\x6d\x7c\xde\x09\x1c\x91\x3c\xfa\x1d\xef\xf9\xc7\x9e\xfe\x84\x27\x12\x7e\xb4\x29\xf1\x0e\x49\x8b\xbc\xc0\xae\x17\x49\x5a\xc7\x1f\x5d\x5f\xdb\xba\x6f\x14\x4e\xfa\x4b\xe2\x3d\xff\x36\x5d\xbe\x49\xd3\x9c\x3f\xd8\x6e\xa9\xd7\x6e\xcb\x9f\xa4\xe7\x7d\x1a\x4b\x13\xa6\xf7\x26\x7e\xb3\x34\x23\x90\xee\xd9\x33\x82\xbe\x9a\x21\x48\xff\xec\x01\xf1\x4d\xd2\xd4\x3b\xe4\x9d\x7a\x3d\x33\x59\x32\x4d\x7a\xcc\x53\xeb\x04\x1f\xed\x39\xc0\xd4\x30\xfc\x97\x44\xde\x94\x50\x58\x92\xaf\x4d\xec\xe6\x26\xfb\x6e\x56\xed\x7a\xa3\xab\xee\xd9\x16\x22\x71\xb6\x87\xed\xee\x5d\x52\x95\x19\x6b\xc3\x11\xf8\x6d\x45\x7c\x19\x8f\x40\x62\xb5\xc3\x5e\xbd\xef\xbb\xfe\xd3\x3b\x7f\xfd\x2b\x33\xbb\xd9\x65\xfa\xb7\xbf\x45\xcf\xee\xdf\x8d\xee\xa3\x20\x12\x45\x87\xaa\x7e\xf8\xc9\x18\x5b\x6f\xac\x97\x19\x57\x47\x6d\xe2\x99\xbf\x08\x1a\x40\x7c\x22\x7e\xc1\xe9\xe2\xda\x45\xe6\x1d\xe7\xec\x7f\x05\x00\x00\xff\xff\x8a\x02\xef\x9f\xb4\xe4\x00\x00") - -func confLocaleLocale_trTrIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_trTrIni, - "conf/locale/locale_tr-TR.ini", - ) -} - -func confLocaleLocale_trTrIni() (*asset, error) { - bytes, err := confLocaleLocale_trTrIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_tr-TR.ini", size: 58548, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_zhCnIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\xbd\x69\x73\x1b\xd7\xb5\x28\xfa\x1d\xbf\x02\xa5\x94\xca\x5f\x9e\xe5\x72\x72\xde\x50\xaf\x0c\xbf\x97\x38\x27\x71\x6e\xd9\x8e\x6f\xe4\xd4\xf9\xe0\x52\xc1\x20\xd0\x24\xfb\x08\x44\x23\x68\x40\xb2\x9c\x4a\x15\x29\x89\x24\x28\x8e\x1a\x29\x89\x94\x28\xca\x92\x48\x4b\xe2\x20\x5b\x03\x49\x70\xf8\x2f\x37\xe8\x06\xf0\xc9\x7f\xe1\xae\x69\xef\xde\xbb\xbb\x41\x59\xb9\xe7\xa6\x2a\x16\xd1\x7b\xed\x79\xef\xb5\xd7\xbc\x0a\xd5\x6a\xbe\xe4\xf8\xc5\x5c\xb0\xb2\xd7\xde\x9b\xcb\xfe\xd1\xcb\x76\xb7\x36\xba\xeb\xa3\x9d\xbb\x97\xbb\x93\x4f\x83\x2b\x3f\x64\xff\xe8\xd6\xb3\xe1\xf2\x6c\x70\x65\x35\x93\x19\xf6\x46\x9c\x5c\xef\xc9\xad\xde\xea\xab\x4c\xa9\xe0\x0f\x0f\x78\x85\x5a\x29\x17\xce\xad\x05\xcd\xd7\xbd\x7b\x0f\xc3\x7b\x47\x19\xe7\xdb\x6a\xd9\xab\x39\xf0\xf1\x61\xe7\xe5\xc3\xcc\xb0\x53\xae\xe6\x82\x9d\x4d\x68\x29\xe3\xbb\x43\x95\xbc\x5b\xc9\x75\xee\xb4\x82\x83\x9b\xfc\xd3\x6b\xd4\x73\xbd\xd1\xd1\x60\x72\x8f\x7f\x37\xaa\xb9\xf0\xa7\xf5\x60\x62\x26\x53\x73\x86\x5c\xbf\xee\xd4\xd4\xef\xf3\xce\x80\xef\xd6\x9d\x5c\xb0\x79\x3b\xbc\xb5\xdb\x39\xb8\xda\x79\x76\x27\x73\xce\xa9\xf9\xae\x57\xc9\x05\x07\xd7\x83\xa9\xd9\xce\x54\x33\x5c\x7e\x9e\xa9\x16\x86\x60\x94\xab\xaf\x60\x44\x99\xba\x33\x52\x2d\x17\xa0\x5a\xb8\xbe\x8a\xc3\x2b\x17\x2a\x43\x0d\x2c\xe7\x69\xf6\x46\xa7\x7a\xab\xbb\x99\x62\xcd\x01\x98\x7c\xc5\x39\x9f\x0b\x9a\x4b\x41\x6b\xef\xd4\xa9\x53\x99\x86\xef\xd4\xf2\xd5\x9a\x37\xe8\x96\x9d\x7c\xa1\x52\xca\x8f\xe0\xbc\x3a\x37\xd6\xc3\xe6\x9b\xf6\xd1\x6a\x38\xb6\x15\xcc\x5f\x09\x97\x5e\x06\x8f\xee\xd2\xd8\x9d\x12\x4c\x2e\x5f\xf0\x73\xc1\x9b\x1f\x79\x8a\x0c\x9b\xa1\x96\x2a\x85\x11\x55\x39\x58\x98\xcd\x38\x23\x05\xb7\x9c\xeb\x5d\xdc\xec\x6c\xbe\x80\x01\xfb\xfe\x79\x0f\x56\x32\xd8\x9a\xe8\x3c\x18\x83\xa9\xe7\xeb\x17\xaa\x00\xbe\xba\xd9\xdd\x7c\x24\x1f\x8b\x85\x6a\xbd\x38\x5c\xc8\xf5\x9e\xce\x74\xb7\xc6\xf0\x0b\xc0\x55\x3d\x58\x13\xaf\x76\x21\xd7\x6e\x5d\x0f\xf6\xae\x67\xbc\xda\x50\xa1\xe2\x7e\x57\xa8\xe3\xa2\x74\x5a\x97\x3b\xad\xc9\xcc\x88\x5b\xab\x79\xb5\x5c\xef\xe6\x72\x70\x69\x3e\x03\x73\xcc\x63\x3d\x99\x68\x78\x6b\x1b\xb6\x5a\x6a\x63\xd9\x88\x3b\x54\xc3\xf5\xea\x1e\x8d\x75\xd6\x5a\xc1\xa3\x5b\xbd\x4b\xeb\x56\x31\x35\x66\x56\x36\x1a\x1e\xf4\x6a\x67\xad\xb2\xf0\xe5\x61\xe7\xc6\x8a\x51\x1f\x06\x68\x01\xa8\x31\x16\x2a\xb0\x29\x54\xda\xd9\x5c\xed\x2c\x4c\x84\xcd\xab\x51\x69\xa1\x34\x02\x2b\x5b\x2d\x54\x9c\xb2\x14\xcb\x61\x2b\x14\x8b\x5e\xa3\x52\xcf\xfb\x4e\xbd\xee\x56\x86\x60\xe9\x77\x16\x60\x81\xbb\x9b\x87\x9d\x83\xcd\x4c\xfa\xd7\x0b\x5e\x43\x6f\x6b\xae\xbd\xf3\xb4\xbd\xb7\xc7\xbb\xc9\x25\xba\x12\xef\x95\x54\x82\x9e\xea\xee\x39\xb7\xee\x3a\x7e\x2e\x5c\x1e\xed\x1e\x5d\x0d\x5f\xb6\x82\x2b\xeb\x99\x6a\xa3\x5c\x86\xf5\xfc\x5b\xc3\xf1\xeb\xd0\xd1\x42\x33\xd8\x7d\xdd\xdd\x7a\x13\xbe\xb8\x98\x71\x7d\x1f\xbe\xc2\x69\x78\x1c\xcc\xde\xe4\x61\x67\x60\x17\x2b\x45\x98\x45\x30\x7f\x2b\x7c\xdd\xcc\x64\xbe\x76\x2b\x7e\xbd\x50\x2e\x9f\xc9\xc8\x1f\x70\xbc\xa7\xba\xdf\x8f\xab\xd3\xeb\xd6\xcb\x74\xe1\xc2\xe7\xab\xdd\xa3\x85\xee\xea\x0c\x17\x77\xd6\xa7\x83\xbd\xf9\x4c\xc9\x2b\x9e\x85\x33\x8a\x77\x0c\xee\x49\xf0\xe4\x62\x78\x7f\x39\xbc\xb8\x1e\x6e\x7c\x1f\x2c\xaf\xb7\x0f\x8e\x60\x0a\xd9\xdf\x13\x4c\x36\xd8\xdc\x0d\xee\xac\x73\x1b\x70\xcb\x87\xfc\x9f\xf7\xe1\x18\xbd\x81\x5b\x1d\x1c\x8d\x07\xe3\xcd\x76\xeb\x46\xa7\x35\xd1\xbb\x3d\xde\xdd\x6a\x65\x3f\x2a\x64\xeb\x85\xda\x90\x53\xcf\x9d\xc8\x0f\xc0\x8d\x39\x7b\x22\x3b\x5c\x73\x06\x73\x27\x4e\xfa\x27\x3e\xe6\xfb\x17\xde\x9a\x0c\x57\xbf\xff\xe8\x83\xc2\xc7\xd9\x60\x61\x2e\x98\x98\x0d\xb6\x76\xe1\xee\xf1\xb8\xbb\x47\x4b\x38\xd4\xd5\x67\xc1\xc4\x9d\x7f\x8e\x5e\xcc\xe0\xfa\xc0\xd5\xcd\x97\x06\x18\xd9\x60\xff\xd9\xee\x93\x31\x58\x25\x9e\x4f\xf6\xf3\x0b\xa7\xff\xfb\x67\xff\x1c\x1d\xfb\xd2\xf3\xeb\x43\x35\x87\x7f\xc0\x7f\xa1\xd6\x6f\xb2\x61\xf3\x56\xf6\x2b\xf7\xf7\xbf\xc3\xa6\xa0\x09\x5e\x94\xf0\xe6\x76\x38\xbb\x09\xc7\x4a\x76\x08\x0b\xf0\xce\xe8\xef\x9d\x17\xad\xe0\xfe\x34\xa0\x2c\xbf\x1e\x7d\x6c\xef\xb4\xc2\xe5\x3d\xba\x90\x06\x24\x5f\x53\x7d\x0b\x63\x05\x72\xff\xa0\x03\xba\xc3\xba\x14\xae\x71\x67\x6d\x1b\xbf\xc7\x37\x40\x96\x9e\x26\xc5\xeb\x2c\x5f\xfe\xf4\xc5\x17\x7f\xfe\xfd\xef\xb2\xc1\xfe\xcd\xf0\xfa\x5c\xbb\xf5\x18\x10\x48\xb6\x51\x1f\xfc\x7f\xf2\x43\x4e\xc5\xa9\x15\xca\xf9\xa2\x9b\x0d\x36\x16\x3b\xcf\x9f\xf4\x96\x26\x70\xba\xbe\x5f\x06\xb4\x53\x72\x72\xa7\x4f\x7f\x96\x05\x14\x16\xec\xcf\xc3\x38\xeb\xc3\xd1\x28\x60\x23\xda\xad\xd7\xdd\x37\x5b\xc1\xe1\xe5\x8c\xff\xb7\x32\xae\xb3\x8c\x27\xbe\x7e\xd9\xd4\x4a\xd0\xcd\x47\x03\xb5\x8f\xdb\x07\xcb\xed\x9d\x3d\x46\xf4\xc1\xc2\x16\x9c\xed\x70\xf1\xb5\x39\xf8\x4e\xeb\x1e\xec\xb1\xae\x93\x71\x6a\xb5\x3c\x20\xd7\xfa\x05\xdc\x56\x1a\x53\xa2\x3f\x44\x00\x7a\x9b\xa8\x62\x7b\x67\xb6\x7b\xe9\x00\x3a\xea\xfc\xb0\xa7\x1a\x71\x2b\xe7\x0a\x65\xb7\x04\xfb\xaa\x96\xd8\x1e\x2c\xaf\x33\xd4\x0c\xc6\xc7\xba\x9b\x3b\xc1\xcc\x78\xb0\xf0\x8c\x57\x29\x7b\xe2\xd4\x09\xea\xee\xc4\xfb\x27\xb2\xd8\x5e\xc5\xcb\x33\xb2\x40\x7c\x5d\x72\xfd\xc2\x00\xe0\x6e\x7e\x49\x6a\x8c\x14\x71\x7b\x68\x10\xc1\xa3\x15\xb8\x25\xe1\xf2\x53\x46\x47\x7c\x41\x83\xab\xb7\x79\xd3\x71\xe8\x97\xc6\x83\x89\x57\xed\x9d\xe9\x0e\x9c\xd4\x8d\x87\xfc\x0c\xd9\x33\x57\x88\x49\x0e\x8e\x6e\x83\x8f\x4c\x7c\xb2\x19\xb5\xcb\x7c\x82\x83\xbd\x1b\xd0\x17\x3c\xbc\x70\x6f\xe4\x10\xe3\x73\x4c\x2b\x20\x65\x7c\xc2\xd4\x57\x7d\xce\x8e\x9e\xe1\x7e\x4c\x5f\x0c\xa7\x0f\x7a\xe3\x6f\x3a\x17\x9f\x69\x54\xc9\x35\x7a\x8b\x4f\x3b\xf7\xe7\x00\x85\xb6\x5b\xcf\x7f\xde\x1f\xa3\x77\x82\xb7\x88\x31\x71\xf8\x60\xb7\xb3\xb4\x89\x6f\xb0\x2e\x51\x6d\x87\x53\xa3\xe1\xf2\x14\x3d\xfa\xdd\xa3\x65\xc0\x33\x5c\xa3\x07\xeb\xb5\x3d\xd1\x7d\x08\xeb\x7e\x3b\xbc\x71\x08\xa4\x42\x77\xeb\x31\xb7\x41\x17\xbc\x01\x2f\x37\xde\x29\x46\x30\x9d\x9f\x5a\x9d\xd6\x8a\x5c\x2b\x55\xa6\x7a\xc0\x8a\x7c\xaf\x8e\x00\xcd\xb5\x82\xf1\x37\xd0\x21\x9c\xac\xd8\xd0\x82\x6b\x33\x06\xb6\xa2\xa3\x74\x7d\x16\x0e\x69\x78\xef\x52\xef\xce\x02\xa1\x02\x0f\xde\x50\x78\xfa\x57\x56\xf0\x41\xe5\x5f\x46\x27\xbc\xa4\xc1\xc1\x8b\xe0\xfa\x6c\xf6\xf4\xe9\x4f\xb3\xc1\xf8\x74\xef\xee\x44\xb0\xbc\x1d\xdc\x1b\xe5\xbb\x35\x9c\xaf\x7a\xb5\x7a\x0e\x0b\x3b\xcf\xe0\x35\xff\x3e\x98\x7f\xa3\x3f\xeb\x5b\x04\xa5\x72\x2d\xee\xac\xe3\x42\x2f\x5d\x0d\x16\x9e\x6b\x78\xb8\x22\x9d\x9b\x77\x60\x87\xbb\xab\xeb\x9d\x47\x7b\x70\x56\xf0\xa2\x53\x7f\x57\x56\x60\xfb\xb1\xa7\xe1\x7a\xbd\xca\x5d\x7d\xfa\xd5\x57\x5f\x1a\x7d\xe9\x02\xbd\xb5\xb4\xef\xd2\x05\xf4\xa5\x21\xf1\x0c\x34\x6a\x65\x01\xc8\xfe\xf5\x2f\x9f\xa9\x4f\xfd\xa6\x8c\x5d\x7d\x80\xff\x39\x6d\xcd\x1c\xd6\xb5\xbd\x33\xda\xde\x5b\x62\xda\xa3\xbd\xb3\x81\x4f\xf8\xf5\xc3\x70\xee\x31\x0e\xb5\xec\x0d\xe5\x6b\x9e\x57\xe7\xe3\x12\x2e\x3e\x0e\x8e\x16\x05\xb9\x58\x45\x7a\xc0\x74\x1e\x18\x8e\xb1\x0a\x2d\x11\x1d\xae\x8c\x57\xc5\x2b\x17\x1d\xf8\xf9\x2d\xa0\xb7\xe4\xa8\x13\x01\x24\x05\x30\x14\xa8\xc8\x8b\xac\xde\xee\x11\x58\x19\xc2\xdd\xa7\x3f\x87\x25\x13\xbc\x4d\x5f\x07\x6b\xde\x88\xaa\x72\xef\x31\x50\xa9\xd1\x67\x35\x2a\xb3\x94\xa7\x0d\xdb\xd4\x1b\x7b\x15\x1c\x3e\xcd\xfe\xe5\x0f\x9f\x64\xff\xcf\xdf\xfc\xfa\xd7\xd9\xf0\xc1\x64\x30\x89\x58\x16\xc6\x05\xb8\x38\xbc\xbd\x85\x0b\xb3\xf3\x14\x5f\xeb\xbd\x2d\x5c\x15\x5a\x21\xae\x0f\x48\x46\x70\xf8\x89\x2f\xe0\x2a\x9e\xc8\x7e\x44\x13\xf8\xff\x9d\x6f\x0b\x40\x60\x3a\xa7\x8a\xde\xc8\xc7\x74\x48\x1f\xec\x03\x8e\xc6\x95\xc4\x62\x38\xf5\x74\x2d\x82\xf9\xab\xbd\xd1\x31\xa1\xf6\xa4\x20\x22\xfa\x8c\x42\x4d\x00\x32\xed\x9b\x2f\x7a\x95\x41\xb7\x36\x02\x84\xc5\x16\x5e\x1a\x42\x41\x0c\xc9\xb4\x21\x35\x96\xaf\x78\x75\x77\xf0\x82\x00\xf1\xdc\x7b\xa3\x77\x3b\x2b\x8f\xc3\xf9\x85\xde\xc4\x35\x20\x84\x6a\x40\x28\xe7\xf1\x1f\xb7\xe8\xa8\x07\x54\x9d\x69\x38\x11\xc1\xf8\xeb\x60\xf3\x92\xb5\x01\xde\xe0\x60\xd9\xad\x38\xfc\xfa\x70\xcb\x9d\x27\xad\xce\xde\x91\xbc\x42\x66\x39\x1c\xe1\x2a\x10\xee\x80\x4e\x81\x58\xec\x1c\xfc\xc8\x20\x80\x39\xdb\xbb\x2b\x7c\x21\xda\xad\xb9\xec\x27\xbf\xff\x22\xdb\x9d\x7b\x83\xa4\x0f\x1d\x14\xd8\x12\xc0\x36\xb0\xf2\xc8\x6b\xbc\xba\x1c\xee\x2d\x30\x96\x01\x58\xc0\x88\xb0\xec\x7a\x84\x5c\x8b\xee\xbc\xa0\x74\xa0\x51\xcf\x15\x80\x46\xc9\xc9\x7d\xfb\xa3\xfc\x56\x9c\x4a\x1c\x4e\x46\x18\x87\x46\x24\x03\x27\x64\xf3\x6e\x7b\x77\x0a\xfa\x87\x11\xb5\x5b\xe3\xf2\xdc\xdd\x78\x21\xa4\xfe\xce\x95\xf6\xfe\x03\xdc\xda\xe6\xad\x5e\xeb\x36\x2c\x3a\xfc\x1d\x3c\x7a\x09\x34\x2f\x8e\x68\xd0\x29\x39\x48\x30\x97\xf2\xd2\x53\xd9\xf3\xce\xe2\x62\xd0\x92\x65\xff\xa0\x8a\xb3\xbf\xa5\x62\x3f\x1b\xc2\xb6\x4c\x1d\xf6\xab\xa7\x96\xf2\xf8\xda\xb0\x68\x3c\xca\x60\x7f\x14\xc6\x0d\x03\xca\x7e\xe6\x0e\xd8\x6b\x60\x2e\x97\xf5\x02\xf2\x73\x26\xe4\xed\xe4\x53\xbc\x5a\xcc\x61\xa5\x41\x47\x0b\x67\xd6\x01\xb4\xcc\x75\x18\xc7\xc1\xba\x05\xf3\x4f\x01\x8d\x47\x0f\x20\x5f\xa9\x37\x40\x23\x3f\x00\xea\x1b\x30\x18\x3d\x9c\x15\x6a\x5f\x71\x32\x72\x5e\x15\x3f\x23\x5b\x67\x03\x49\xff\x42\x2c\x2e\xaf\xf3\x10\xb8\x73\x20\x50\xba\x87\xd7\x83\xf1\xc7\xbd\x87\x97\x23\xae\x88\x88\x4d\xe0\xa0\x84\xdb\xcc\x9f\x73\x91\xab\xe3\x03\x4c\x5c\x59\x77\xf3\xa8\xb7\xb8\x09\x8f\x08\x30\xad\xa9\xd0\x6a\x0f\x68\x4a\x11\x33\x07\x78\x8d\x3b\x9f\x12\xf2\x41\x1a\x22\x92\x17\x97\x60\xe1\x49\xd0\xbc\x03\x07\x18\x2a\x02\x40\x67\x79\x3a\x68\x6e\x73\x5d\x38\x3a\x72\x77\x09\x18\xd7\x82\x49\x07\xe1\x36\x84\x07\xb7\x09\x11\x5e\x37\xe0\x27\x80\x8e\x00\xe4\xc4\xcf\x25\x8c\x02\xbb\x5a\x7a\x00\x64\x45\xf6\x4f\xbf\xcf\x7d\x98\xd5\xe3\xc2\x07\x1a\x59\x76\xba\x2e\x87\x8b\xba\x9d\xe8\xc5\xe4\x3e\xf9\xfa\xc7\xba\x51\x04\x08\x41\x30\xaf\x6a\x13\x44\xf8\xc6\x1e\x4f\xee\x64\x04\x59\x19\x00\x26\xff\xca\x95\x99\xef\xd5\x35\x05\x25\x0a\xf3\x93\x1f\xf2\x90\xf1\x7a\x36\x1d\xcc\xfe\xc4\x8c\x01\xf0\xef\x7e\x3d\x3f\xe4\xd6\xf3\x83\x88\x35\x81\x36\x5f\x7c\x10\xfe\x74\xb3\xbb\x35\x11\x34\x9f\x65\xdf\x83\x82\xf7\xb2\xc1\xd5\x83\x76\xeb\xd1\xcf\xfb\x77\x4f\x9e\x13\x02\xf8\x37\x88\x11\xf1\x5e\xb9\x65\x3c\x4b\x48\xf3\x21\xa6\xe1\x7b\x0d\x97\x77\xfe\x2a\x12\x29\x53\x4d\x5c\xd8\x1b\x5b\xe1\xcc\x58\x56\x48\x57\xa1\x77\x01\x59\x9d\xf4\xe1\xcd\x99\xee\x1e\x1c\x08\xbb\x73\xff\x32\x6e\xcd\x54\x13\x21\x46\x67\x78\x47\xb2\x43\xde\x40\xc3\x2d\x97\xb2\x2c\x77\xc0\x15\x56\xb4\x2c\x50\xb2\xb2\xb5\x71\x46\x05\xab\x6e\x7c\x0f\x2b\xc3\x03\x56\x15\xfa\x92\x68\xa9\xb5\x34\x4d\x85\xf3\x1c\x29\xc0\x45\x49\xa1\xbc\x7a\xf7\xee\x8b\x58\x84\x7e\x62\x4d\x3f\xfb\xfe\xc7\x30\xb5\x8c\x5f\x38\xe7\xf0\xdb\x32\xa4\x16\x96\x09\x8b\xde\xf8\x2c\xf6\x76\x74\x0f\xde\xf5\xe0\xd1\x8b\xee\xcb\xc7\xf6\x30\xad\x53\x6b\x9d\x21\xcd\x2b\x27\x26\xc8\x5b\xeb\x37\x8a\x45\xc7\xf7\x71\x2f\x82\xc7\x80\x31\xc6\x98\x3c\x0d\x0e\x9b\xbd\x67\xb7\x83\xf1\x97\xf0\x1d\x88\x83\x70\xfa\x07\x79\x66\x85\x47\xed\x3c\xbe\xa7\x19\xaa\xf0\xf2\x14\x90\xbe\x84\xa4\xbf\x47\xf2\x1a\xde\x89\x8d\x47\x70\x20\xb2\xbf\xfb\xeb\x1f\x91\xcc\x55\x83\x8c\xd3\x30\x0f\xc2\x9b\x4d\xc4\xdf\x06\x31\xc3\x63\xcb\x7c\x8d\x02\xad\x33\x99\x06\x53\xd7\x5e\x19\xb0\x6d\x24\xa3\x41\x7c\x6f\xcb\x67\x14\x88\x9c\x68\xff\xbc\x0b\x2b\x9f\xd7\x82\x30\x5c\xd1\xba\xf3\x6d\x1d\x2e\xf2\x64\x38\xfb\xd0\x14\x8b\x09\x2d\x3c\x72\x81\x36\x1a\x56\x81\xc4\x1b\x22\x17\xf1\x87\xbd\xf3\x24\x5c\x52\x85\xb7\x0f\x81\x92\x64\xc9\x12\x83\xa0\x38\xaa\xe8\x95\xe1\x34\x7b\x88\x96\xcf\x29\xc8\x60\xfe\x62\x7b\x67\x2e\x98\x9d\x07\xc2\x38\x6a\x0f\x7a\xf1\x6a\x43\xaa\x13\x25\x61\xb9\x20\xb2\x1b\xf5\x5d\xc4\x36\x84\xf0\x48\xae\xc7\xe8\x0c\x8f\x87\x88\x2e\x4e\xc1\x56\x93\x4c\x44\x3a\x7b\x71\x5f\xe8\x7e\x7e\x17\xa9\x33\x68\x08\x96\x51\x84\x7e\x67\x58\x22\xa5\x84\x51\x78\x42\x95\x1c\x05\x68\x90\x42\x0d\x8e\x69\xb8\xb0\x8c\x62\xc1\xcc\xd7\x85\x46\x7d\xf8\x8c\x21\x78\xcb\x8b\x2c\x47\xb0\x20\x9f\xa8\x88\x10\x1a\x76\xaa\x48\x34\x8d\xf8\x43\x24\x5e\x6b\xcd\x33\x3e\xfd\x79\x7f\x85\xd1\x05\xe3\x59\x3c\x05\xbe\x57\x74\x0b\xe5\xfc\x2f\xaf\xd9\xba\x0a\x04\x00\xd6\xb4\xdf\x3f\x16\xfe\x01\x9b\x97\x43\xe6\x04\x58\xb9\x57\x48\xeb\x9b\xcf\x1e\x34\x87\x1c\xd1\xf8\x4f\xbd\xc5\x0d\xb8\xfc\x80\x39\xba\x63\x37\xf0\x06\x92\x6c\x52\x5f\x8e\xe4\x43\x8c\xc3\x41\x34\x98\x6c\xd8\xa4\xed\x52\x3b\x81\x15\x19\x71\x46\x06\xb0\x05\xdc\xb1\xed\xf6\xc1\xbc\x88\x53\x07\x61\xcf\xe9\xcc\x2b\xb2\xf2\x08\x68\x95\x6d\x39\xaa\x58\xe8\xf4\x29\x84\x95\x50\xb2\x57\xc0\x27\xe7\x01\x93\xdc\x0e\x7f\x5c\xe5\x0d\x80\xb2\xde\x0f\xcf\x81\x04\x8a\xb8\x5f\xc1\xf2\x4c\x1d\x10\xf9\xe9\x3b\x95\xba\x5a\x2b\x20\xa1\x83\xed\x31\x91\xed\xd1\x34\x98\x1e\xe5\xa5\xc7\x99\x10\xb5\xdb\x9d\xfc\x29\xfb\xd1\xc0\xc7\x27\xfd\x8f\x3e\x18\xf8\x98\xb1\x6e\xf8\xfd\x28\x12\x37\x17\x11\x43\x87\x37\x5e\x23\x27\x01\xf4\xf0\xee\x6b\x78\xf4\xb3\x27\x4b\xd9\x60\x7b\x1e\xde\xfb\x60\x62\x3c\xd8\x9c\x09\x9b\x0b\xdc\xb6\xd0\x01\xc4\x18\xd2\x03\x57\xa4\xcb\x41\x87\x56\x9d\xa7\xf0\x68\x34\x7c\xd9\xe2\x76\xe5\x54\xc1\x58\x87\xdd\x01\x78\x54\x00\x53\xb8\x9a\x20\xe2\x65\xb4\xcb\xf8\x61\x36\x2b\xc3\x14\x4c\x78\x1e\x7b\xdf\x7d\xaf\x39\xb4\x38\x65\x77\xc4\xad\xa7\x1e\xa7\x8b\xeb\x2c\x2d\xe4\x65\xe1\xb1\xf2\x8a\x75\x8f\x26\xe1\xba\xf5\x1e\x5e\xed\xec\x8e\x71\x2f\x9d\x8d\xa9\xe0\x70\x3c\xfb\x9b\x6c\xd0\x9c\xe8\x5d\x5b\x61\xb9\x5b\x77\x8b\x4e\xfd\x70\xc1\xcf\x37\x2a\xb2\x37\x40\x54\xd2\xf9\x02\x7c\xaf\xd0\xad\xbc\x0c\xb8\xc8\xaf\x90\x2e\xc1\x27\x71\x79\x8a\x77\x2b\x65\x4b\xb2\xed\x83\x89\x70\xf9\x29\x4e\x96\x16\x9a\xb9\x21\x18\x15\xb2\x4b\x5a\xce\xb8\xfc\x14\x36\x0a\x1b\x33\x86\x8d\x93\x02\xc4\xb9\x3c\x0a\x24\x5b\x6f\x72\x16\x4e\x02\x37\x2f\xf2\xc6\xd9\x9b\xc1\x64\x0b\x5e\x56\x14\xe1\xc3\x3e\xcf\x4c\xf5\xae\x6d\xea\x85\x92\x61\x33\x10\xe0\xf6\xe0\xd1\x65\xb3\x09\xf3\x3c\x09\xff\x48\xef\xbc\x4f\x57\xbe\x4e\xef\x3c\x13\x84\x71\xe6\x8d\x66\x02\x77\x08\xf6\x09\x86\xdb\x6e\xb5\xda\x07\x37\x99\xee\x21\x8c\x81\x3d\xe3\x00\xea\xc9\xfe\x7f\xde\x6f\xf2\x10\x7e\xde\x9f\x92\x3d\xe2\xc3\x40\x57\x07\x8a\xe0\xc5\x93\x11\x71\x0b\xfa\x8a\x71\x99\xdc\x3f\xf5\x34\x15\x89\x9b\xb2\x0f\x80\xbe\x29\xfc\xac\xe1\x85\x3f\x9a\x0c\x97\x57\x60\x19\xe1\x6f\x78\x85\xe1\xf9\x52\x4b\x14\xb5\xaf\x19\x70\x7b\xb1\xa2\x2e\x35\x60\xdd\xf3\xf2\xf0\xc4\xd4\xea\xf2\x6e\xf5\x6e\x1e\x05\x7b\x4f\x44\x08\xb6\x7d\x15\xd5\x3e\xff\x17\xec\xf7\x2c\x2e\x45\x05\xee\x74\xd9\x2b\x02\xfe\x54\xd7\x07\xa8\x08\xe6\xc6\x58\x9e\xaa\xef\x01\x13\x62\xc0\x66\xc2\x60\x59\x44\xd3\x3e\xda\x0c\x6f\xec\x72\x1f\x24\xee\xfa\x1a\x57\xf3\x0c\x5f\x4a\xc4\xf2\xaa\x49\x3c\xf1\xc9\x4b\xa9\xc1\x98\x44\x04\x20\xa6\xe9\x19\xc8\xdc\xce\xf4\x95\x36\xf7\x25\x7a\x37\x34\xd9\xc1\x98\xa2\xb9\x00\x58\x15\x97\xfd\xf9\xc3\xee\xd1\x1c\x93\x15\x11\xb0\xf0\xd1\x56\x21\xcc\xc2\x2b\x15\x60\x1a\x17\x1c\x5f\x08\x5a\xc6\x37\xb0\x56\x22\xc6\x97\xdf\x00\x87\xb5\x65\x2f\x69\x31\xa0\x36\x60\xde\x91\x33\x99\xbf\xc2\x53\xf8\x85\xad\x01\xfa\x0b\x3c\x95\xf4\x89\x5f\x4b\x91\xf5\xfd\xbb\xa1\x17\x92\xd9\x7e\x19\xd3\x0e\xfd\xc5\x49\x2a\x87\x4e\x9f\xfe\xf4\x2b\x22\xeb\x49\xf0\xb4\x05\xe8\xe1\xb1\x34\xf8\x69\xbd\x5e\xf5\xff\x5a\x2b\xe7\x58\x14\xf4\xd7\xbf\x7c\x96\xd5\xed\x5e\x28\x7b\x85\x12\x96\x85\x73\x40\x7c\x8d\xc9\xf7\xaf\x9c\xc2\x08\x0d\x2c\x58\x7a\xd8\xbb\xbd\x22\xed\xfc\x16\xde\x6b\xfa\x0a\x9d\xc2\xae\xa8\xaf\x48\x0f\xfe\x7b\x2a\x4d\x9f\xf9\xc2\x39\xff\xbb\x5a\xa1\x52\xe4\x6a\xfc\x24\x00\xe6\x02\x8a\x5b\x2a\x7f\xe2\x8d\x00\x5a\x3c\xdd\x18\x19\x29\xd4\x60\xd5\xe7\x17\xda\x7b\x8f\x00\xcd\x77\x5a\xd7\xa5\xe8\x73\xd8\x39\xd4\xd5\x71\x11\xae\xf4\xd8\x96\x14\x7d\x32\xec\xb9\x45\x55\xc2\x84\x63\xe6\xab\x9a\xe3\x48\x5f\x86\x4c\xfc\x13\x24\xca\x90\xae\xc0\xa7\x63\x37\xa3\x39\x3e\x87\x14\x59\x71\x19\x6d\xa1\x5c\x05\xa6\x13\x49\x3a\x01\x60\xb6\x0b\x00\xba\xd3\x2f\xa0\xdd\x60\x63\x31\xdc\x9a\xfd\xe7\xe8\x58\xef\xf6\x51\x38\x3d\xd5\xde\xdf\x02\xfa\x1e\x3f\x02\x87\xb7\xfe\xb4\xb3\x77\x04\x08\xe3\xfd\x3c\x20\x8b\x58\x63\x25\x40\x54\xef\xd4\x20\x7c\xb1\x1b\x84\x1e\x3a\x17\x77\x49\x70\xe9\x7e\xa7\x86\xcf\x77\x59\x37\x09\xc4\x1b\x89\x9e\x90\x46\x8f\x03\x85\xcb\x80\xeb\xe7\x19\x28\x8b\x62\x2e\x92\xa0\xb3\xa4\xea\xdb\x74\xf0\x47\x6b\x69\xe0\x8c\x79\xf5\xf2\x69\xb9\x19\xbc\x27\x4c\x68\x9b\xa7\x17\x2b\xa0\x90\xf2\x18\x70\x3c\x93\xcc\x3b\x15\xcb\x8d\x92\x63\x2d\x93\x12\xf6\x2f\x70\xf7\xed\x9d\x1f\xb3\xef\x9d\xf4\xdf\xa3\x56\x2b\x67\x81\x5a\xa9\x08\x38\xa0\xf8\xce\xca\xe3\xde\x8d\x3b\xdd\xad\x2d\x20\xee\x95\xb6\x14\x58\xfa\xa2\x57\xab\x39\xc5\x7a\xce\x90\x33\x3c\x0d\x66\x76\x81\xd3\xc1\x56\x34\x96\x8c\x38\x29\x25\xbc\x9f\x33\x6f\x98\x55\x49\x2b\x74\xf3\x03\x8e\x03\x0c\x75\xe1\xac\x53\x89\x6e\x76\x44\xea\xcc\x3e\x80\x8f\x8c\xba\x81\xbb\x8b\x57\x30\xef\x7d\x4a\x1d\xa0\xd8\x12\x55\x4c\x21\x7f\x4a\x95\x3a\xdc\xdc\x44\x1d\xf3\x16\xa7\xd4\xe1\xdd\x24\x78\x98\x55\xc9\x42\x3d\x1a\x9c\x71\x21\xad\xba\x9a\xb9\x5e\xb8\x68\x85\x4d\xce\x49\x6b\x40\x98\x17\x64\xe9\x0f\xe0\xd8\x1a\x69\xc9\x0d\x9e\x97\x64\x0d\x26\xf9\xa7\x5f\x70\x73\x7d\xe0\xd4\x1c\xd3\x10\x1c\x03\xc4\xde\x7d\x5b\x02\xdc\xc3\x7a\x8d\xee\xe8\x78\x34\xc8\xdb\x80\x87\x9e\x1c\xd3\xaa\x7e\x5f\x52\xdb\x94\x63\x11\x6b\x44\x33\xe5\xce\xb7\xf0\xa4\xe4\x60\xe9\xf8\x71\xd0\x42\x1a\x54\x63\x01\x6b\xbd\xbc\x8e\xaf\x6d\xb9\xe0\xd7\x91\x55\xe3\x09\x20\x74\x67\xad\xd5\xbb\xf3\x48\x81\xee\xe1\x25\x5c\x98\xc3\xfb\x72\x30\x6b\xd2\x95\x38\x22\x92\xad\x71\x91\x90\xdb\x9a\x1b\x07\xaa\x90\x34\xb0\xdc\x1a\x3e\x7a\x57\x6f\xf3\x38\xb0\x57\x4d\x8c\xa0\xa6\xe3\xac\x73\x21\x07\x3c\x78\x78\xe5\x45\xb8\x31\x45\xb4\x1b\x72\xe5\xf2\xb8\xab\xf7\x57\x4f\x3a\x1b\x3d\x2f\x24\x4e\x40\xce\x19\xd9\x9a\x73\x4e\x0d\x9e\x3e\xdd\x20\x91\x03\xbf\xa8\x8d\x19\xa4\x33\x59\x10\x30\x36\xd9\xdd\x3c\xec\x5d\xfc\x1e\xb7\x5a\xa1\x06\x0d\x86\x13\x86\x36\x48\xf2\x08\x4b\x8d\x02\x8a\xf1\xd7\x0c\x16\x8e\xae\xe1\xac\x90\x9f\xd4\x42\xa2\xb9\x26\x0a\xbd\xa8\x6b\x53\x8a\x91\xf1\xeb\x6e\xb9\x8c\xab\xcd\x26\x10\x26\xfd\xd1\x6e\xcd\x76\x2e\xbf\xc6\xce\x57\xe0\x49\x59\xd2\xdc\x6d\x38\xfd\x98\x0f\x0e\x13\x6b\x4a\x69\xd5\xec\x1e\x3c\x87\xe5\xc5\x93\xde\x7c\x00\x8b\x1c\x6c\x5e\xc2\x75\x23\xd1\x60\x38\xb5\x86\xea\x6f\xfe\xce\xc4\x92\x5e\x7c\x1e\x01\x52\xeb\x68\xeb\x10\x1b\x40\xb8\xb8\xa6\x07\xc0\x57\x9d\xc4\xce\xb8\x7d\xb1\xde\x3b\x4f\x5a\x28\xfa\x55\xbd\x33\xb0\xc2\x1a\xb1\x59\x22\xc7\x4e\xe5\xff\x9b\xa6\xc8\x8d\x1b\xe7\x8b\x6d\x07\xf2\x03\xf4\xf8\x1b\xb7\xa1\xb3\xb4\x89\x3a\x17\x22\x01\xf4\x3d\x60\x4a\x11\xef\xcd\x99\x0c\x20\xec\xca\x90\x23\x02\xf1\x9c\xd0\x93\x24\x69\xcf\xfc\xa7\x07\x6f\x1a\x1a\xfa\x5c\x79\x00\xc7\x08\x68\xd6\xc8\xf8\x05\x6d\x32\x04\x57\x34\x17\xbb\xab\xeb\xca\x56\x03\x0e\xf6\xf8\x73\x5c\x25\xb6\xd4\x18\xf4\xca\x65\xef\x3c\x4a\x24\x80\x11\x00\x72\x10\xe6\x0b\xbb\x51\xc0\x2b\x4f\x82\x81\x8b\xbb\xdd\x57\xf7\x05\x0a\x85\x5b\x0c\xd5\xde\xd9\x90\x6f\xf2\x01\x8e\xbc\xfa\x4d\xc4\x9f\x7c\x45\x0e\x7b\xe4\x14\x61\x46\xa4\x4e\x6b\xe7\xa0\x55\x8d\x6a\xe8\xcd\xca\xc2\xc2\x23\x2a\x3d\xba\x87\xfa\xc2\xbb\xa4\x43\x8f\x2a\x55\x0b\x75\x40\x3f\x15\x66\x68\x68\xa0\x46\x7d\xad\xfb\xe6\x86\x2c\x35\x53\xe6\x6b\x65\xb1\x72\x26\x93\x6a\xd5\xa2\xd1\x98\x49\x9f\x67\x64\x8d\x79\x75\x95\xce\x8d\xaf\xaf\x2f\xa4\x9c\x71\x51\x45\xa8\x92\xeb\x3c\x3a\x44\x1a\x8d\x38\x27\x96\x9b\xa0\x16\xb2\xec\x16\x49\x1a\xa0\x2a\xf2\xf5\x63\x81\x62\x86\x24\x51\xfc\x5d\x24\x51\x25\xa7\xec\xa0\x1d\x97\x71\x3f\x32\x0d\x57\x4d\x37\xfb\xa7\xdf\x67\x32\xd5\xc6\x00\x34\xaa\xad\x74\x78\x1f\xd5\x7c\xc4\x22\xcb\xe0\xcc\xad\x37\x6b\x7b\xa2\xbd\x7f\x97\xd8\x3d\xac\x84\xc2\xf2\xdd\xd7\x88\x59\x6f\xac\xc3\xa9\x09\xe7\x1e\x23\xcb\x4a\x9d\xe2\x32\xd2\xab\xc0\x5a\xb2\xe0\xda\x0c\x2b\xcd\x2c\xb2\x40\xbf\x77\x22\xc1\x29\xa5\x30\x44\xa2\x16\x51\x82\x01\x5e\x67\xbd\x79\xb4\xcf\x68\x25\xc4\xef\x93\x52\x37\x09\x0d\xac\xac\xda\x78\xcb\xc4\xaa\x0d\x39\x30\x36\x56\x98\x1a\x85\x2b\x82\x13\x9b\xd9\xcb\x34\xaa\x25\x64\x8f\xd4\xa2\x84\x4b\x2f\x01\xef\xcb\xa2\xd8\x65\xa6\xb0\x15\x1f\x52\xe3\x38\x70\x2d\xc5\x07\x8d\xa9\x2b\x97\xb4\x50\x63\x75\xbf\xb0\x31\x31\x28\x25\xc9\x00\xcc\xc2\xd7\x9e\x17\x9d\x15\xcf\x28\x0f\xa0\x65\x05\x0a\x0a\xb1\x09\x23\xc0\xe5\x29\xb8\x28\x5a\xd3\x8c\x42\x24\x38\xb3\x0d\xe8\xaf\xb5\xd6\x69\x6d\x08\x07\x65\x19\x47\xc9\xb7\x8c\xe8\xc5\x44\x4b\x36\x70\x81\x79\x74\x66\x3c\xcd\x8d\x67\x25\xa1\xa0\x8b\x7e\x5a\xb9\xb8\x42\x4d\x69\xe3\x94\xd2\xa9\xe1\xd7\xbd\x11\x85\x80\xd8\x0c\x26\xda\x31\x6e\xba\x38\xec\x79\xbe\x88\x2c\x19\x8e\xd9\x0f\x61\x70\x18\x48\xf6\x43\x00\x78\xd1\xad\xbb\xc6\x97\x00\x3a\x04\xfc\x53\xa9\xeb\x1e\xf9\x4e\x90\xd4\x5e\xb7\x84\x4c\x5a\x34\x11\x42\x10\x79\x77\x04\xf9\xa2\x48\x35\x49\x0c\x8f\xa6\xae\x83\xfd\x07\xc1\xd2\x61\x67\x6a\x12\x77\xd8\x1a\x4a\xec\x64\x98\x43\x8a\x9f\x0c\xb5\xe9\xe9\xf8\xc3\x2b\x1b\x04\x92\x0c\x98\x4b\x70\x61\x22\x53\x2a\x5e\x14\xc5\x94\x23\xe3\x9a\xb7\x00\x58\xb8\xc2\xc4\x81\x05\x9c\x42\x5f\x9a\xdd\x18\x5a\x86\xb1\xf8\x48\xf5\x24\x05\x94\xc6\xad\x27\x86\x33\x9f\xdb\xc6\x6b\x45\x3a\x4a\x51\x2d\x18\x5d\xb3\x60\xcf\xc2\x02\xd2\xc1\xbb\xe2\x00\x43\x16\x42\x64\xb6\x6f\x33\xf6\x62\xf4\x28\x45\x62\xd8\x68\x02\x30\x6d\x6e\x20\xba\xf6\x4e\x0b\xc5\x6a\x36\xba\xd3\xc8\xcd\xd4\xf9\x47\x4a\x7d\x2d\x1c\xad\xd6\x5c\x62\xb4\xb9\x11\xf5\x53\x89\x5b\x36\x0f\x81\xde\x94\x22\x39\x9c\x5c\xc2\x67\x52\x8f\x05\x4a\x10\x33\xc9\x18\xa8\x4c\x6e\xaa\x0d\xa1\x54\x9a\x08\x00\x78\x22\x89\xa2\x85\x38\x25\x54\xd1\x59\xda\x61\xf4\xc0\x48\x0a\x46\xcb\x84\x35\x63\x87\xff\x2f\xde\xb4\xda\x5f\x6b\x10\xfa\xe0\x16\x4a\x25\x3a\x63\x3c\x7c\xa6\x93\xc5\x52\xd5\x5c\x5c\x04\x33\x41\x44\x6c\xa1\x3f\xe7\x2d\x41\x37\x8a\x71\x45\xb8\x1d\x1c\x8e\x6b\xa1\x68\xe7\xc6\x2b\x60\x4e\xb5\x88\x9b\x25\x84\x80\x01\xe9\xa1\x16\x91\x67\x4c\x7e\x9d\x2a\xe7\xe6\x67\xca\x14\x6d\x03\x76\xeb\xac\x4f\xb3\xd6\x56\x8d\x48\x5f\xde\xc4\x6c\x64\x96\xd1\xe5\x95\xb3\x75\xcc\x93\x8e\xcd\x12\xf5\xff\xf0\x3e\x12\x55\xf2\xce\xa3\xa8\x02\x37\x0e\x6f\xc6\xce\x34\xa1\x13\x03\x8b\xc3\x73\x44\x42\xd4\x04\x19\xaf\x65\xc2\xb0\x02\x70\xbb\x60\x4b\x7b\x77\x66\x3a\x37\x56\x62\x34\xbc\xa8\x76\x15\x39\x49\x04\xb1\xaf\x6d\x89\x3e\xf2\xeb\x35\xaf\x32\xf4\x31\x0b\x8f\xd9\x68\xfc\xe7\xfd\x95\x8f\x3e\x90\xef\x59\xe4\x02\x56\x1e\x77\x96\xa7\xf9\x39\x41\x3b\x55\xc3\x2e\xf5\xc9\xc5\x36\x9a\x5c\xaf\xc0\x2a\x18\x83\x23\x13\x55\x34\x11\xb4\x81\x77\x76\xba\x6b\x63\x04\x86\x2a\xfc\x87\xb7\xd9\x92\x75\xab\x05\x8f\x41\x67\xe3\x46\xb8\xda\x54\x2b\x8f\x27\x29\x5a\x26\x8b\x26\xe2\xb5\x35\x78\x67\x26\x39\x44\xfc\x66\xf3\xce\x6a\xaa\x58\x81\x9e\x50\xaa\x20\x2a\x69\x38\xfd\x0b\x33\x4c\x10\xe0\x82\x25\x5a\x89\x38\x46\x55\x3d\x67\xc9\xf8\xf0\x6b\x51\x89\xb9\xb8\x80\x85\x5d\xb2\xc7\xb1\x83\x63\x4c\x42\x28\xd3\xd8\xe9\x91\xfb\x4f\xd3\xe6\xdb\xaf\x86\xae\xef\x3f\x7f\x17\xbb\xba\xe7\xd0\x92\x20\x81\x38\x60\x0c\x0d\x18\x15\xd0\x50\x82\x6f\x6e\x82\x5a\xd0\xe8\x80\x55\x92\xda\x80\xc1\x46\x0a\x89\xae\xd4\x2c\x8d\x3e\x52\x50\x03\x0e\x9e\xf6\x12\x99\x08\xe2\xc0\x79\x2b\x76\xae\x84\xcf\x57\xc5\xaa\x66\x79\x9d\x2c\x49\x15\x1f\x11\xfe\xb8\x8a\x64\xa2\x69\xf7\x4d\xab\x5a\xc7\x87\x95\x26\x08\x53\x93\x85\x87\xdb\xfe\x7f\x67\x83\x47\x3f\xc0\x0e\xe8\xcd\x87\xbb\x9c\xa9\x7b\x67\xe1\x98\xd8\x55\xda\xad\x47\x9d\xa9\x99\xbe\x55\xf4\x25\x16\xe2\x9b\xf9\x7b\xbe\x80\x8a\x10\x27\xd5\x2a\x6b\x3c\x7f\xd9\xbd\x35\x49\xf8\xb7\x5c\x5c\xaa\x62\x5e\xdc\xee\xda\xf7\xc4\xef\x29\x85\x69\xa3\x32\xe0\x56\x4a\x39\xf3\xb3\x7c\xd3\x7b\x61\x76\x67\xc2\x25\x51\x55\x81\x2a\xe4\x69\x9d\x64\xae\x4c\xb8\xf2\xc9\xe2\xb5\x12\x13\x5a\x51\x19\x0b\x2c\x5d\x79\xe5\xc8\x40\x50\x54\xe0\xeb\x97\xd3\x7c\xe9\xbb\x47\x77\x80\xf7\xc5\x7b\x45\xd5\x74\x9d\xf0\x9e\x1c\x61\x56\x66\xfc\xf6\xcb\x3f\x91\x3d\xb1\xea\x85\xdb\x42\x93\x8c\xa9\x59\x14\xcc\x6c\x3c\x24\x3b\x04\x54\x24\x71\x7d\xb4\x5d\xdb\xda\x35\x19\x7a\x66\xab\x11\xa7\xdf\x7c\x99\x62\xbe\xca\xcd\x56\x58\x03\x40\xe7\x80\x2f\xb3\x9e\xa1\x39\xbb\xf8\xec\xe5\x34\xe1\x22\x3b\xea\x5a\x9b\xeb\x24\x6b\x62\xd0\x3c\x62\x3e\xc4\x08\xf8\x11\x50\xe9\xa8\xb8\x13\x83\xc7\x4d\xc0\xa6\x34\xee\xe5\xed\xf0\xd6\xae\xb6\x2f\x8a\x4e\xe8\xfc\x53\x78\xb0\xd9\x2c\x01\xaa\xc0\x3d\x31\xb0\x04\x0f\x93\x6f\x9a\x0c\xd3\xdc\xca\x38\xca\x48\xee\xa9\x60\x8e\xd4\x4a\x31\xf4\x91\xac\x1c\xc3\x22\x1a\x73\x88\x21\x2d\xf9\x49\xbc\x0d\x91\x98\x13\xd1\x07\x37\xa5\x2b\x1b\x99\xe0\x63\xc4\x2c\xd8\xce\x9c\x5e\x29\xcd\xe7\xf0\x70\x78\x14\x44\x00\x4a\x27\x91\x95\x83\x41\xe9\xf3\x35\x16\x08\xa5\x25\x36\x48\x2b\x5c\xfc\xed\x9d\xf6\xee\x78\xb8\x33\x8e\x1f\x4d\xa9\x11\x11\x4c\x4c\x3e\xb4\x77\x6e\x64\xd5\x1b\x8a\x22\x83\xf9\xad\x70\xec\x21\xec\xb5\x7e\x40\x89\x56\x16\x23\xad\xd8\x78\x44\xd6\x6d\xf2\xe4\x36\x84\xb2\xe1\xa5\x32\x8b\xee\x8b\xc1\x69\x7c\xc8\x90\x44\x9f\xca\xe8\x47\xd7\xb8\xa2\xe8\x3d\x57\x37\x01\x11\xc0\x4b\x6f\xf2\x80\xc1\xc2\x22\xda\x23\x64\xbe\x46\xf1\xce\x99\x0c\x0b\x46\xb5\x80\x2a\x12\xa4\xdb\x5a\xb3\x48\xbe\x2e\xa4\x44\x7b\x7f\x25\x78\xb4\x16\x13\x22\xc3\xd1\xed\x36\x9f\xc3\x45\xed\x1e\x5e\xea\xac\x6c\xfc\x73\x74\x0c\x36\x0d\x37\xf9\x0d\xd0\x90\xad\xd8\x02\x76\xa6\x9f\xe3\x51\x5f\x84\x67\x62\x26\xa2\x40\x44\x6e\x73\xce\xf5\xdd\x01\xb7\x4c\x32\xa6\xf9\x2d\xa0\x24\x60\x6a\xfc\x11\xbf\x19\x16\xd9\xdc\x3d\x6a\x51\x3e\xf2\xab\x85\x4a\xb6\x08\x0f\x8e\x9f\x3b\xd1\x70\xb3\x35\xe0\x41\xd1\x58\xe8\xc4\xc7\x1d\xa8\x0e\x27\xf7\xee\x65\xe8\x06\x60\x3e\x4e\x34\x84\x6e\x55\x45\x94\x07\xd9\xf6\x05\x48\x6f\xee\xef\xc1\x45\x66\xe3\x48\x91\x65\x00\x9f\xd9\xda\x93\x59\x6b\xb5\xd0\xbf\xd4\x39\x3a\x73\xa9\xa9\xfc\xbc\xdf\x64\x96\x06\x37\x76\x74\x3f\x95\xdf\x37\x7d\xbd\x7e\xde\x9f\xca\x14\xcb\x5e\x25\xda\x90\x9d\x59\xd4\xcf\x8c\x5d\x67\x32\x4d\x49\x0b\xc5\x86\xf2\x78\x8f\x23\x56\x6e\x33\x21\x47\xe4\x9f\x22\x0d\xc9\xae\xe5\xac\xc8\x72\x4d\x4f\x33\xfa\x4c\x76\xe2\xfc\x19\x8d\xc4\xe9\x5b\x62\x8f\xcc\x6a\x2c\xb1\x16\xd6\x4d\x6f\x2b\x9d\x2d\x79\x5b\x09\x6a\x7e\xbe\x7b\x24\x47\x0e\xbd\x09\xe5\x33\xfb\x13\xf2\xe7\x21\xb7\xee\x0e\x55\xd0\xa0\x4b\xd9\xa3\x93\x84\x20\x7b\x4a\x17\x64\x95\x3b\xa2\x5b\x84\x87\xca\x11\x89\x35\x7a\xb7\xcc\x6f\xa9\x8f\xd1\x31\x7a\x23\x12\x06\x03\x88\x39\x7e\xe8\xae\x50\x62\xa9\x12\x8c\x89\x7d\xb2\xe4\x5b\xa2\xb6\x09\x23\xbd\x17\x1a\x75\x0f\xf8\x6b\xb7\x2e\x84\x28\x00\xc2\x8d\xd4\xf2\x04\xe0\x21\x19\x30\x68\xde\x0b\xd6\xa6\x83\x99\x5b\xb2\xbc\x62\xb5\x65\xb8\x11\x4a\x41\xc9\x19\x2c\x34\xca\x4a\xf4\x9b\x63\x73\x69\x16\xf8\x8a\x1b\x22\xa0\xb7\x46\xc5\x41\x59\x42\x30\xf5\xd4\xfa\x26\xa8\xfe\xe0\x3a\xfb\x9d\x74\x8f\x0e\xba\x3b\x4f\x11\xcf\xed\xa3\x1f\x25\x0a\xf4\x18\xe9\x2c\xbe\x66\xd6\xbb\xbd\xbb\x02\x54\x73\xb8\x21\x44\x9e\x6a\xcb\x45\x35\xce\x39\x20\x97\xd8\xbe\x4d\x40\xae\xae\x87\xcb\x80\xb4\x9b\xcc\x85\xe1\xe9\x14\x70\xa0\x08\x6b\xc4\x4a\x32\xb4\x30\xe6\x56\x99\xc2\x68\xc8\xc9\x99\x60\xed\x9d\x8d\x60\xe2\x4e\x30\xfe\x18\xee\x19\x62\x31\x6d\x87\x3b\xb9\x11\xce\x6e\x6a\x4e\x56\xb5\x46\xa4\xa6\x7f\xa1\x52\xd4\xc4\x26\x8f\x0d\xc6\xd3\x5b\x7c\x89\x3a\xcb\xf3\xa8\x7e\x4c\x0a\xa8\x87\x0a\xdf\x91\x1d\xdd\xda\x76\xf7\xd5\x7d\xfc\x88\x27\xd9\xb7\x0f\x3c\x4b\x92\x61\x5b\x8a\xc3\x62\x6c\xe4\x0d\xe6\x69\x9b\xf0\xe5\x8d\x5c\x6e\x98\x29\x39\x3c\x84\x4b\x2b\xde\x54\xb4\x7d\xc8\xa0\xe2\x83\xa7\x35\x02\xa2\xfc\xbd\x22\xb4\x4a\x8a\x70\xdb\x44\xac\xff\xa2\x7c\xdb\xc6\xcd\xc7\x88\xb8\x2b\x0e\xca\xbf\x1a\x75\x38\x51\xc4\x1a\x9a\xfa\x9d\x8c\x38\xac\xb2\xf7\x1f\x7b\xad\x8a\xeb\x9f\x59\x92\xc0\xc9\x80\xc2\xb4\x2a\xda\xc6\x8f\x88\x18\xb3\x03\xe5\x86\x73\xe2\x63\xde\x6e\x85\x1a\x55\x7b\xac\x55\xa1\x9e\x94\xc5\x25\x97\x9c\x62\x94\xa7\xce\x94\xe9\x76\x93\x0e\x12\x3d\x96\x2c\x18\x51\x8e\x28\x86\xf3\xce\x07\x7f\xfc\xd3\x57\x64\xb5\x81\x16\x06\x31\xb7\x08\xed\x8b\xa7\x1a\x87\x19\x8e\xb8\xbe\xcf\x84\x53\xc5\x45\x55\xd8\xc5\x75\xe6\x5e\xd8\x28\x3c\xd8\xda\x47\x41\x1b\x5f\x20\xbd\xdb\x9a\x26\x55\xed\x44\x96\xb4\x68\x0a\x14\x33\xa3\xa5\xca\xca\x8c\x76\x46\x2b\x72\xd0\x43\xc6\x50\xef\xb3\xf5\x32\xe2\x68\xd5\xa8\x28\xe7\x94\x63\xb1\xa1\x96\x93\x1b\xc2\x8e\x3d\xb4\xe4\xda\x6f\x87\x0e\x3b\xec\x7e\x1a\x32\x27\x8f\x1f\xdf\x29\x0f\x8a\x55\x38\x17\x8b\x91\x27\x91\x0c\x9a\x00\x60\xca\xa7\x7a\x01\x2e\x47\xe5\x6c\x8e\xe9\x5f\x2d\x8a\x96\xcf\x91\xd8\x90\x8a\x0d\x19\xb9\x86\x60\x5b\x03\xa4\xfc\x66\x80\x61\x9d\xce\xfe\x8f\x99\xdb\xef\x7f\x42\xd2\x85\x4f\xea\xb5\x32\xfc\xc9\x55\xb1\x06\x2e\xbe\xd9\x10\x30\x46\xe7\xd9\xbc\xc0\x54\x1b\xc9\x27\xa5\x59\xf2\x49\x08\x4c\x00\xa2\x8f\xa2\x2f\x5a\x37\x55\x3b\x2b\x6b\x90\x41\xfe\x94\xd9\x9b\xbb\x17\x71\xf6\xfc\x28\xfd\xad\xe1\x16\xcf\xe6\x87\x1a\x2e\x5a\x99\x1d\x3d\xeb\x8d\xae\x88\xeb\x3d\x9f\xba\xfa\xb0\xeb\x0b\xd6\xe6\xa3\x49\xe4\xa7\x8d\xd4\x95\x7f\x78\xbe\xe8\x8d\x00\x67\x86\xb7\x74\x8e\x2d\xec\x49\xe1\x47\xc8\x9e\xed\x37\x4c\xcf\xf1\x6a\x03\x0d\x66\x50\xcb\xc7\xed\x9b\x95\xc4\xb8\x88\x25\x19\xec\xe2\xa0\xeb\x51\x4f\x30\x28\x72\xa7\x34\x09\xa6\x59\xb6\xfc\x10\x53\x3d\x92\x66\x08\x27\xba\x3e\x2b\x86\x8f\xa4\xe2\x66\xfa\x81\xe5\xd5\x68\x5b\xc7\x36\x74\x19\x79\x80\xe4\xe9\xa9\xd7\x1c\x27\xc7\x07\x32\x7c\x70\x35\x33\xe8\x96\xd1\xda\x4b\xf4\x93\xe8\x29\x5a\x2f\x0c\xe5\xd0\xe8\xae\x25\x8f\x15\xde\xb5\x07\x93\x9d\x8d\x43\x69\x08\xdd\xb8\xd9\x72\x89\x35\x8c\x00\x0f\x08\x98\x20\xe4\x4b\x9a\xb3\x37\xfa\x86\xc7\x7c\xc2\xcb\x85\x01\xa7\xac\xaa\x0a\xd8\x08\x5c\x0b\xbf\x0e\xfb\x03\xaf\xd0\xe4\x0c\x3c\x7d\x9d\x87\x57\x33\x45\xb2\x72\xf2\x95\x55\xd4\xdc\x44\x30\xff\x23\xac\x56\xd9\x29\xf8\x68\x87\x46\x0e\x07\xc0\xb2\x07\x3b\x97\x32\xa4\xf1\xa9\x15\xce\xe7\x82\xb9\x15\x78\xa6\x85\x32\xa0\xaf\xb0\xdf\x14\x1d\x40\xde\x73\x6e\x85\x4a\xc8\xec\x1b\x2b\x09\x45\x95\xa8\x8a\xa8\xa4\x40\xb7\x85\x89\x77\xb9\x2d\x54\x86\x16\x85\x65\x24\xd7\x94\xa5\xd5\xd1\x24\x3c\x17\x80\x5b\xba\x93\x2f\xe5\x2a\x12\xaf\x98\xc9\x38\x25\xd4\xd0\x9e\xa2\xd8\x00\xa4\xb4\x62\x4e\x95\xfb\x91\x42\xd6\x70\xe4\x45\x73\x89\x1a\x0d\xbb\x1c\xff\xe1\xd2\xce\xfe\xad\xee\xe1\x55\xbb\xb4\x5a\x73\x68\x2e\x2c\xa2\x87\x25\x7c\x78\xb9\xbb\xd6\x0c\xe6\x6f\x03\x73\xa6\x60\x8a\x85\x0a\x69\xa1\xb1\x21\xb4\x70\x44\x0c\x4f\x2d\xfa\x82\x39\xb8\x61\x94\xea\x03\x79\xb4\xfc\x3c\xa5\x7f\xba\x3a\xe6\x20\x36\x1e\xd9\x50\x23\x0d\x38\xfb\x03\x4e\x1e\x9a\x2f\x28\xfa\x27\x52\xa6\x03\x7a\x5c\x59\x40\x56\x5b\x94\xdf\x57\xc4\x89\x68\x6b\x57\x37\xc4\xe7\x59\x94\x15\x22\x51\xe7\xa6\x09\xd9\x0d\x38\x83\x48\x50\xe2\xa7\xa8\x5d\x46\x06\xd0\x84\x90\xa6\xef\xd0\xa8\x62\x7a\xf5\xbc\x84\xbc\x4a\x9d\xd7\x30\xfa\x8b\x9c\xaf\xb9\x75\x25\xa6\x31\xa6\xc6\xfe\xbb\xf3\x5b\x40\x0b\xf1\x43\xf2\x4e\x53\x63\x4d\x2e\x0d\x25\x12\x52\x62\x1d\xa6\x03\xe2\x02\x3c\x75\x9e\x90\xa4\x20\x2b\x6f\x1e\xfa\xd5\x03\x34\xe8\xa1\x7a\xe8\x2a\x61\x34\xae\x99\xc2\x1c\xeb\x98\xc4\x0e\x6a\x61\x4e\x30\xf8\x07\xd9\xde\x8d\x4d\x14\x89\x00\x49\x4d\x52\x50\xf5\x6e\xa1\x15\x33\x0a\x17\xc6\xa7\xf0\xb2\xae\xb5\xba\x93\x3f\x89\x96\x6a\x75\x02\xc9\xa3\x37\x4f\xda\x87\x6b\xdc\x48\x6f\x74\x14\x88\x15\x68\x47\xac\x77\xb4\x5b\xb4\x8c\x03\xcd\xd3\x9a\xb7\x8c\xc3\x58\x74\xca\x79\xb2\x45\x50\x71\x20\x54\x11\x5d\x7a\x7d\x94\xe5\xee\x5b\x47\x19\x25\x98\xf5\x91\xaa\x52\x5a\xe0\x2a\x7d\xf0\x91\x5c\xef\x85\xd9\x8f\xdf\x33\xe0\x0c\x90\xf7\xa2\xbb\x56\x22\x43\x69\x12\x5c\x58\x25\x96\x56\xde\x2a\x91\x51\x8d\xb0\x31\xa6\xbc\x3a\xda\xfa\x08\xce\x34\xb9\xf5\x92\xcc\xe3\x87\xe0\xc5\x4d\x7e\x8a\x8c\x6d\x90\xfa\x25\x17\x95\x78\xe5\x0b\x80\x3d\xf8\xd4\xc9\x25\xe9\xc0\x58\xe6\x1e\xf3\x5c\xc9\x06\x9d\x79\x6d\x45\x8d\x31\xd4\xfb\xb8\x8f\x27\xc8\x38\x5d\xb1\xe2\x7c\x95\x8c\x65\x36\x1e\x30\x69\x9a\x04\x75\x8f\x64\x19\x8d\xa7\x4b\x33\xf9\xa6\x51\xaa\xd1\xf2\xee\x6b\x74\x11\x7b\xf5\xc6\x44\xdd\x46\x47\x51\x0f\x2c\x73\xe0\x15\x49\xd8\xb7\x9a\x4b\x60\x45\xfd\x88\x1f\x4f\x41\x4f\x03\x8e\x3c\x83\x7a\x3b\x13\xd1\x12\xb8\xa2\x7a\xb8\xca\xc8\xe9\x5d\xe0\x67\x17\x4e\x8b\xc2\x02\x28\x17\x20\x8a\x8c\x5a\xd8\xd3\x04\x75\x62\xc1\x78\x47\xe0\x7d\xc0\x17\xb8\xc0\x57\x89\xe9\x3a\x5d\xa7\xd3\x7c\xad\x02\x37\x6c\xf0\x8b\x9c\xec\x26\xe2\x17\xd9\xd8\x21\x3e\x3d\x6a\x5c\xf7\x15\xcd\x4e\x73\x0d\xba\x49\xec\xc4\x68\x55\x02\x01\x24\x5a\x25\x24\x88\x5e\x93\x40\x03\x01\x5d\x33\x04\x6f\xb9\x5a\x83\x8b\xeb\x8c\x9e\xf5\x98\x04\x8d\x10\xf1\xa1\x49\x55\x34\x04\x31\xfa\x8c\x37\xcf\xf7\xaf\x94\x3f\x3f\x6c\x74\xa6\xc6\x4d\xa4\x08\xe2\xf3\x8b\xeb\x62\x64\xc7\xef\xc1\xa2\xb8\xb8\xa0\x1c\x1d\x88\xd0\xf9\xdb\xc1\x15\x14\xfc\x1d\x1f\x4a\xc5\xb0\xdd\x37\xc5\x1b\x54\x99\x24\xf0\x6f\xda\x40\xa2\x29\xea\x07\x90\x08\xb0\x7f\xfa\xf0\x02\x0d\x04\x4c\x24\x9f\x6e\x43\x47\xf6\x64\xa2\xb3\x74\x8b\x75\x91\x22\xc7\x57\x63\xb1\x26\x79\xcc\xe9\xd1\x1a\xa7\xd8\x01\xe2\x15\x30\x2f\x82\xa7\x70\x15\x5e\x6a\x74\x63\x13\x55\x89\x62\x64\x90\x08\xe0\x11\x00\xc6\x31\x47\x40\xbe\xff\x5e\x5e\x6c\x13\x0c\x7b\x96\x0f\x54\x70\xa0\x68\xf3\x70\x69\x69\x2e\xda\xba\x17\x78\x06\x03\x1d\xfa\x8d\x01\x38\x5d\x82\x92\x82\x8d\x05\x3e\x36\xc6\xed\x13\x23\x45\xea\x4f\x93\x1a\xbe\x45\x6b\x20\xe2\x79\x6b\x67\x66\x6d\x6c\x0d\x7b\x4d\x6b\x24\xa3\xa8\xb7\x53\x9a\x8a\x7b\xbe\xca\x84\x29\xef\x96\x2e\xb7\x9c\xe2\x2c\x52\x4f\x41\x0c\xa2\x82\x45\x8c\x54\xd4\x37\xe4\x84\xd1\x98\xfa\x60\x19\xa5\x01\xea\xab\xe0\x67\x60\x3a\x26\x91\x99\x50\x9f\x19\xdf\xb3\x01\xfd\x22\xf0\x44\x2b\xba\x84\x7d\x19\x71\xd9\x17\x51\x52\x1a\x1b\x1a\x20\x39\x47\x59\xae\x44\xa5\xca\x33\x30\x8a\x94\xc5\x14\xaf\xf1\xfd\x94\x45\xe3\x9a\x05\x78\x5d\xb1\x0c\x8d\xb5\x45\xa2\x95\x80\x29\x02\x85\x5b\xcb\xab\x26\x48\xdc\x0d\xa0\x70\x49\x93\xa0\x9a\x6e\x36\xc8\x66\xbb\xb7\x08\x42\xf7\x98\x0a\xca\x9d\x46\xd0\x8c\xa7\xb9\xdf\xd4\x0a\x5e\xd5\xa9\x98\xf0\xfb\xa3\xc1\xc2\x96\x84\xd2\x48\xef\xc0\xf3\xd1\x29\x2b\xaa\x01\xf7\x93\x5c\xfa\xfa\xd5\x80\xb7\x0f\x43\x8a\xc1\xc8\x67\x26\x81\xca\x63\x23\xd0\xe4\x98\x35\x98\xd8\x4c\xf5\x01\x46\x65\xa6\x6e\x70\xf9\x69\x1a\x18\xbf\x9e\xfd\x36\x55\x36\x4e\x2e\x67\x7c\x2b\xb8\x34\x5f\x2d\x17\x8a\x8e\xb8\xc8\x0a\x73\xa4\x1f\x42\xab\x97\x63\x5a\xe3\x96\x54\xd4\x36\xff\x94\x68\x1d\xae\x3c\xe8\x1e\x1c\x00\x69\xcf\x96\x58\x24\x1d\xc2\x5a\x22\xc7\xec\x53\xd7\xad\x0c\x7a\x11\x62\x43\xb7\x46\x15\xec\x87\xd9\x4a\x6e\x43\x8c\x5e\x09\x63\xb1\x55\x19\x92\xe7\xe4\x9e\x96\x3d\x61\x0e\xf1\x44\x36\xc9\xfe\xca\x30\x80\x54\xa4\x11\x42\x51\xa7\x75\x39\x39\x4e\x72\x6f\x48\x1f\xa4\x25\x21\xfe\x25\xb3\x6a\xf8\x6a\x3d\x7e\x09\xb4\xc2\xb4\x11\x8b\x95\xac\xfb\x56\x64\x2b\x6d\xd3\xa9\xaf\x17\x06\x72\x2c\x2d\xd4\xa7\x5e\x6f\x2e\x9e\x72\x13\x40\x1d\x72\x05\x20\x8c\xb7\x20\x01\xe6\x81\x37\x96\x60\xea\x69\x00\xf8\xba\xfb\x40\x94\x16\xeb\xc8\xa4\x31\x9c\x7d\x56\x04\x3a\x05\x0f\xa4\xb6\xaa\xe1\xd2\x5a\x4e\x5c\x42\xa9\x14\xbb\x87\x68\xa3\x99\xd6\x36\x80\x0d\xb9\x00\x96\x3a\x68\x55\x33\x56\x87\xbd\xb8\xd8\x80\x2c\xad\x4d\x2c\x3f\x85\xae\xf3\x22\x5b\x10\x95\xa2\x75\x35\x2d\x50\x5f\xa2\x10\xc2\x76\x03\x6f\x24\x23\xee\xb4\xee\xb0\xbe\x30\xad\x0a\x5f\xc7\x12\x5a\x55\x62\x8d\xce\x8d\x17\x78\x15\x94\x8c\x26\xad\xc6\x88\x53\x41\x91\x32\x52\x5f\xd4\xc7\xfc\x02\x06\x41\x4c\xeb\xc0\x47\x8f\xc3\x70\xee\x1a\x06\xaa\x4b\x96\x9c\xa2\xe3\x59\xc7\x60\x7a\xa8\xb2\xa2\x2e\xd3\xc0\x10\x9b\x08\xd8\xe2\x0f\xfd\xc1\x80\xb8\x84\x81\x29\xee\x86\x0d\x35\xe8\xe9\x4a\xed\xda\x29\xf8\x06\x6c\xb0\x7d\x0c\xec\x88\xe7\xd7\xf1\x49\x44\xd3\x1a\x92\x8a\xdf\xed\x6e\x5d\xee\x6e\xa6\x0e\x82\xda\x35\x81\xb7\xaf\xda\xc0\x78\x81\x68\xb5\x71\xa5\x0d\x83\xa4\xaf\x7f\x7d\x06\xa8\xc1\x93\x5f\xff\xe6\x8c\x4f\x64\x60\x7b\x67\x2e\x7b\xf2\xeb\x0f\xcf\xf8\xf6\x84\x75\xf5\xfc\x60\xe1\xac\x43\x6d\x50\xd5\x2c\xba\x70\xa6\xc0\x93\x68\xc4\x6b\x30\xa5\xb3\x33\x8a\x41\x3b\x35\xce\xfe\x16\xad\xd9\xa6\xed\xaf\x7c\xbf\x19\xe1\xa6\xde\xed\x92\x2a\x8d\x5f\xec\x4a\x63\x24\x2f\x13\xf7\xf1\xf2\x87\xf7\x56\xed\x99\x4b\x21\x8a\xf1\xeb\xb9\x6f\xb8\x0c\x47\xad\xd7\xe0\x57\x48\x0f\x9f\xa4\xe9\x7f\xa3\x2a\x29\x1b\x59\xae\xab\x63\x21\x99\xaa\x63\x6d\x19\xa0\x7b\x14\x05\xb2\x1a\x98\xa7\x0d\xa3\xd0\xf0\x83\x74\xfa\xe8\xee\x32\x79\x8d\xcc\x37\x46\xdb\xbb\xcd\xde\xa5\x03\x20\x5a\x3b\x37\xa1\x74\xda\xc0\xd3\x8c\xcc\xe8\x47\xce\x9e\x2c\x97\xa8\x51\x31\x84\xf4\x0d\x8c\xa3\x05\x5a\x73\x68\x4d\x19\x46\x5c\x99\x69\x65\x63\x00\x7d\x1a\x4b\xab\x21\x2f\xa8\x3a\x66\xb1\x65\xe6\x5d\xc2\x35\x96\xd5\x75\x4b\x78\xbe\xe0\x68\x9c\xd0\x0b\x4d\xbf\x3e\xa6\x93\xc3\x56\x6f\x34\xe4\x6f\xec\x21\xbd\x73\x2b\xe6\x58\xbf\x31\xb7\xdd\x45\x91\xf0\x20\xb5\x86\xac\x97\x41\x06\xff\xc2\x96\x91\x2b\x24\x1d\x60\x7b\x6f\x02\x55\x25\x84\x00\x75\x17\x55\x8f\x82\xc4\xb2\x2c\x14\xe9\x61\xdd\xb5\x0a\x97\x81\xce\x84\x14\x21\xc3\x28\x15\xbb\x02\xe5\x14\xa6\x3e\xab\x28\x40\xca\x47\x94\x38\x7b\xcb\x70\xb0\x73\xa7\xd5\xbb\x33\xc1\xeb\x86\x62\x02\x8a\xbf\xd1\xdc\xc6\xc8\x88\x5b\xf7\x84\x97\x94\xc6\x48\x54\xc7\xdc\xa1\x1e\x94\x25\x07\x50\x9d\x16\xce\xa1\x42\x14\x43\xae\xc4\x5e\x71\x8e\xd3\x65\x50\x52\x76\x39\x4c\xd1\x53\x94\x56\xef\xe1\x72\x77\xea\xc7\x78\x39\x5a\x76\xf0\x5b\x9c\x46\x65\x45\x67\xd3\xb7\x9e\x74\xe4\xd8\xac\x57\x86\xc1\x53\xe6\xc3\x05\x96\xe8\xc8\x2e\x12\x9f\x68\x11\xfd\xa5\x8c\x21\x66\x1d\x24\x64\x09\xcb\x08\x53\x01\x63\x16\x41\xb2\x3a\x09\x8b\x62\x9e\x00\x92\xe4\xc7\x9a\x16\x1b\xa8\x22\xd6\x8d\x96\x46\x8a\x94\xdf\x96\x43\x1a\x78\xaf\x5a\xa8\xd5\xdd\xa2\x5b\x2d\x08\xee\x43\xdf\x09\x3a\x16\xc6\xb9\x2a\xd4\xeb\x85\xe2\x30\x5e\xd8\x88\x88\xc2\xdb\x60\x12\x91\x80\x88\x91\xcd\x21\x09\x00\xd1\x62\xdf\xa4\xd4\x2e\xc1\xc1\x45\x52\x2e\xf7\x4d\xe7\xe2\x2e\x47\x52\x00\x62\x4e\xc0\x59\xe1\x60\xf2\x66\xa6\xea\x81\x0b\xe1\x46\xc2\x80\x1d\x2d\x63\x44\x31\xed\xd6\x0d\x91\x6d\xcc\xdf\x0e\x66\x6e\xa5\x03\xca\xb2\x13\x74\x7b\xe7\x91\x16\x65\xf7\x16\x5f\x46\xf2\x1f\xaa\xaf\xa5\x67\x22\x1d\x8c\xc9\xd0\xec\xd6\x07\x0a\x48\xcd\xae\xec\x05\x93\x13\xa2\xab\x89\xf5\xce\xff\x4a\xc7\x16\x88\xa5\xc5\xb1\xb4\x37\x6a\x1d\x3c\xd4\x56\x37\xca\xc8\x7f\x03\xcf\x33\x85\x4a\xef\x4e\xeb\x7a\x78\x7f\x59\x03\xd4\x87\x91\x90\xa9\x7b\x51\x3f\x3c\x94\x6b\x33\x66\x87\x3a\x2e\x03\x0a\x46\x48\x67\x8f\x3c\xc3\xe2\x03\x54\x46\x73\xa4\x5b\x02\x8e\x66\x87\xee\x7d\x66\x60\x60\xd8\x6b\x43\xaa\x62\xba\xc1\xe1\x55\x33\x16\x08\xc8\x6d\x83\x2a\x00\x3c\xf8\x01\x35\xf8\x01\x92\x06\x25\xc1\x89\xbf\xa2\x1f\xfc\x50\xca\x62\x59\xac\x5b\x72\xcf\x09\x8f\x68\x2b\x06\x0c\x36\xb2\x3d\x41\xf4\x02\x3c\xd4\xb6\x60\x02\x23\x5f\x7d\x84\x7a\x34\x85\x7e\xe9\xef\xac\xb4\x89\xc2\x59\x29\xfc\x8d\x2e\x94\x3e\x46\x9c\xda\x90\xa2\x0f\xc4\x5a\x86\x88\x92\x7f\x03\xf2\xe4\x1d\xbb\x3b\xae\xb7\xac\x9a\x52\x61\x00\x1f\x76\x0c\xff\xcd\x26\x0e\x8c\x80\xc5\xec\xd9\x84\x61\x01\x8c\x25\x7d\x89\x8a\x45\x07\xa4\x4f\xaf\x04\x74\xd6\xef\x32\x9c\x0c\x9a\x18\x59\xd1\x18\x0f\x9c\xb9\xc8\xe1\xbd\xc7\x6c\xb7\xcf\x1f\x0d\x7f\x0b\x63\x61\x88\x64\xa2\x72\xe3\x88\x48\x11\xbe\x69\x46\x7b\xa2\xbf\x26\x54\xc3\xdf\x11\xe1\x70\x2d\x20\x59\x51\xb9\x44\x16\x97\xb1\x6a\x1d\x15\x6b\x17\xc8\x42\x94\x6f\x1a\xd6\x21\x24\x4a\x45\x2c\xc8\x28\x50\x9b\xd2\x74\x47\x67\xd0\x77\xe4\xc1\xcb\xe0\xde\x7c\x34\x60\xd7\x87\x3b\xef\x14\xcf\xa2\xcc\x33\xd6\x07\x07\x96\x96\x33\x3f\xf1\x63\xe7\xe9\x18\x3b\x33\xc4\x34\xb3\x41\xf3\x0d\xac\x54\x14\xea\x4e\x4e\x69\xa1\x92\x27\x83\x23\x9a\x76\x64\xf9\x60\x4e\x9d\x98\x70\x51\xec\x52\x28\xbb\xf4\x35\x15\x81\xf9\xdb\x5a\x63\x19\x26\x8d\x93\x2f\x2c\x46\x8e\xfb\x17\x1a\x8f\x2c\xa9\xc2\xa9\x69\x0c\x8c\x3c\x3d\x05\x2f\xb8\x60\x05\x12\x6d\xe2\xa8\xd7\xbe\x0f\x26\x7e\xe2\xde\x62\xbb\x6f\xe3\x82\x94\x0b\x4a\x67\xad\x51\x91\x3b\x44\xd0\x22\x96\xfd\x86\x77\xd3\x44\x1f\x1c\xd5\x94\x7d\x06\x44\x64\x0b\xe8\x8a\x1a\xe5\xfd\x25\x1b\x8d\xa7\x36\x5a\x69\xfe\xea\x64\xe9\xe7\xfd\x29\x96\x75\x88\x8a\x96\x5c\x78\xcd\x53\xad\x57\xe2\x9b\x8c\xa1\x94\xa6\xf7\x44\x3c\x4e\x34\x93\x6c\x14\x9b\x52\x81\x88\x6d\x30\x00\x2c\xb1\x40\xc4\x3a\xc4\x21\x4a\x8c\x31\xfc\x64\x31\x9a\x3a\x34\x60\x8f\x89\x5f\x63\x73\x87\xe6\x53\x8c\xc8\xcc\xf2\xcc\xd8\x58\x84\x77\x49\xb4\x9f\x4b\x69\xd8\x39\x8f\xd2\xe3\x61\xa7\x40\x51\xdd\x08\x7f\xea\x39\xa2\x41\xf8\xd2\xcb\xe0\xf1\x01\xba\x79\xb1\x8b\x33\xdb\xdd\x12\x65\xc1\xd6\x32\x51\x0f\x26\x0a\x4e\x5d\x26\x4d\xcc\xf5\x1e\xde\x36\xbf\xb3\xf2\x88\xcd\x37\xcc\xcf\x7a\xc2\xc6\x54\xd1\x80\x8d\x94\x6d\x6c\xc0\x66\xcc\xcf\x41\x2f\x43\x92\x96\x9a\xdf\x75\x34\x42\x69\x0c\x4d\x3a\x47\x80\x10\x37\xdb\xd4\x96\x56\x4a\xe0\x33\x23\xaa\xe5\xdb\x5b\xd9\xf7\x2e\xc0\xff\xde\x1f\x19\x79\xbf\x54\x62\x0d\xd2\xc1\x43\x15\xdc\x36\x3e\xf5\xc8\x27\x4b\x4d\x5e\x29\x70\x49\x80\xa6\x09\x27\xa3\xa2\x41\x4f\xa6\xae\x18\xe9\xdd\xa3\xed\x11\x47\x3d\xd8\x92\x2b\x0f\x60\xaa\xe1\x1d\x16\x4b\xe3\xc2\x21\x0a\x26\x3b\x17\x74\x73\x6d\x3d\x8f\xb6\x6d\x61\x02\x7d\x0e\xb4\x54\x08\x88\xc0\x83\x65\x31\xc8\x36\x67\x60\x51\xe5\x46\x81\x45\xbd\x1e\x37\xc6\xd4\xa9\x13\xcd\x49\xb6\xa4\xac\x33\xa2\x3b\x8c\xea\xfa\x9b\xcd\xd8\x4a\xc4\x88\xe0\xe8\x08\x4a\x60\xa1\x24\x64\xdc\xbb\x4e\xd5\xf8\x5f\x22\x84\xd3\xfa\x49\xcc\x2d\x4e\x09\x67\xce\xbb\x67\xdd\xdc\x7f\xc0\x7f\xe8\xaf\x53\xe7\x9d\x72\x11\xa3\x09\x9a\x41\x94\xb2\x58\x8c\xc0\x26\x04\x4f\x01\x4b\x50\x07\xc8\x1e\x8c\xc1\xf8\x0b\xf4\x84\x22\x6e\x8d\x2d\x55\x4d\xaf\x84\x68\xd7\xa9\x88\x5f\x0b\xde\xf8\x60\xfc\x75\xbb\x75\x4b\x6c\xb9\x31\x3e\x00\x6e\xbc\x38\x87\xaf\x62\x24\x4d\xdc\x72\xea\x5d\x8e\xeb\xa0\x5b\xf3\x31\x84\xd4\x90\xba\xb4\x9d\xe7\xcf\x99\x60\x95\xd4\x0b\x04\x6c\x66\x12\xa1\x0f\x42\x74\xd2\x77\x26\x39\xcd\x52\xf6\x6c\xd5\x4d\x0a\xd2\x34\x00\x94\x7d\xac\xad\x52\x47\xcc\xc4\x2a\x49\xa4\x8f\xd8\x7b\xfc\xee\xe5\xee\xd6\xcb\xf0\xf6\x9c\x79\xe5\xf5\x1c\x28\x7c\x27\x75\xc4\x6c\xa3\xd9\x05\x99\x99\x4a\xfb\x24\x00\x3f\x29\xf2\x21\x15\xa0\x0b\xd6\x06\x7a\x32\xab\xd0\x21\xc6\xe6\xf2\x03\x8d\x3a\xec\xbf\x1c\x78\x7b\x4e\xaa\x2c\x6d\x52\xec\xb7\x60\x00\xc9\x39\xee\x03\x84\x61\xb6\x8a\x4e\xfe\x43\x94\xcd\x6b\xff\x71\xb3\x8a\x10\x7e\xc8\x70\x0b\xdd\x27\x81\x59\x77\xa6\xc2\xd1\x7b\x40\xb6\x00\x9d\x01\x6f\x97\x5e\x0f\x6a\x35\xa6\xd0\x8c\x39\xd5\xd1\x11\xcc\x72\xf3\xe6\x6b\x6a\xb5\xa1\x64\xac\x89\xf5\x64\x61\x61\x29\xc7\xf1\x58\xc4\xed\x83\x16\x35\x13\x65\x19\x11\x35\x83\x9d\x7b\xe4\x14\xc7\x40\xf7\x73\x56\x9c\x7f\x5d\x6a\x04\xf5\xf4\x94\xd7\x53\x24\xac\x48\x07\x3b\x45\x41\x58\x55\xac\x05\x32\xb9\xe9\x07\x49\x26\x3b\x39\xd3\x38\xa7\x1f\x24\xae\x1d\xf9\x32\x6c\xb5\x8e\x07\x6c\x54\xe0\x10\xbb\x15\x5a\x0c\x71\x8c\x8f\x40\x87\x3d\xef\xac\xf6\x35\xfd\x0f\x67\x20\xdb\xbb\xf6\x43\xb0\x61\xb4\x35\xe4\xd6\x2d\x18\xcc\x33\x10\x87\x01\x9e\xd0\x2d\x1a\x29\x5d\x52\x17\x4e\x4c\x46\x35\x94\x98\x8d\xc6\xa0\xd0\xdc\x5a\xa5\xac\x11\xd7\x27\xe2\xdf\x92\xed\x20\x20\xc6\x36\xae\x79\x43\xa6\x3d\x38\x41\x9b\x74\xb9\xc2\xdf\x06\xc1\x1b\xa3\x76\xa3\xce\x13\xd9\x8a\x74\x91\xe8\xbd\xf5\xe8\xe5\x44\xa5\x1e\x20\xf1\x3d\x47\x4b\xc9\x77\x8a\xbd\xa0\x8d\x29\xe3\xb1\x17\x74\xcb\x85\xd2\x39\x7c\xf9\x4a\xc6\x2a\x3e\xbb\xdd\xd9\x5b\x8b\x8f\x00\xef\x81\x3c\x38\x1c\x96\x9c\xee\x12\x07\x94\x34\xe6\x84\xe2\x52\x34\xbe\xc7\x80\xff\xf4\x28\x88\x33\xe5\xc4\x38\xb4\xd6\xbf\x8e\xf3\x6d\x4a\x1d\x4a\x3b\x44\x75\x22\x60\x0b\x90\x93\x21\x44\x60\xd9\xf8\xe4\x12\xd0\x91\x7f\x01\x99\x8c\xc2\xfd\x62\xf3\x0b\x0c\xa6\xb9\xfa\x4a\x04\x4f\x94\xf2\x44\x87\x10\x01\xe2\x18\x4e\x78\xb0\x00\x8f\xde\x36\xbe\xb2\x3a\x4b\x82\xee\x85\x25\x34\xe6\xe2\x98\x16\xa0\xc7\x2e\x11\x55\xcd\xd7\x6b\x05\xcc\xcf\x63\xad\x15\x22\xff\x83\x56\x6f\x72\x1e\xf6\xe2\x6d\xcd\xe9\x69\xa6\x36\x47\xeb\xa3\x69\xd6\xf4\x56\xa4\x0a\x2d\x91\xd0\x87\x5c\x2f\x59\x49\x82\xb5\x65\x99\x60\x4c\x36\xc1\x63\xf0\xeb\x17\x50\x47\xd0\xa7\x0d\xb6\xd5\xeb\x7d\x3f\x07\x8d\xa0\xd3\xc3\x71\x8d\xa0\x7c\xcd\xa9\xb9\xc5\x5c\x67\x4f\xa2\xe2\x31\x05\x7a\x7c\x25\x8a\xba\xa7\x6a\x9a\x41\xf6\xb8\x09\xa0\xe5\x91\x37\xea\xd3\x50\xb4\x0a\xa9\xde\xa3\xf2\x32\xfd\x1d\x23\xa1\xfc\x23\xfb\x77\xbc\x94\xf0\x8f\x0b\x38\xf1\xdb\x7f\x68\x69\x49\x13\x83\x93\x73\x3e\x1d\x23\x0a\xcc\x98\x76\x77\x40\x7e\x8d\xd7\xe5\xe5\x43\x94\x6c\xc3\xfe\xcc\x3e\xc0\x08\x5f\x1c\x5f\x4f\x8f\x89\x98\x43\xeb\x6c\x19\x3c\x1d\xda\xd7\xcc\x3d\x0e\xe6\x17\x3b\x8f\x0e\x83\x99\xbd\xee\xcb\xd5\xce\x8c\x71\x67\x4b\x05\xb2\x8b\xfa\x8e\x8c\x0d\x66\x5f\xf4\xee\xfc\x20\xd8\x62\x66\x2f\x02\xa2\x84\x5c\x14\x3b\x0d\xc5\x11\x3e\xfb\x77\xa0\x2f\x95\x61\xda\xad\x7d\xef\x6c\xc3\x20\x7c\x59\x23\xd3\x7a\xe3\xad\x40\x99\x0c\x60\xa7\x83\xe7\xe1\xec\x43\xb4\xbf\xbb\xb3\xd9\x1b\xbd\xab\x02\x5d\xc7\xc0\x62\x4b\x8c\xbe\x82\x70\xcb\x08\xf3\x0a\x2e\x4c\x6b\x86\x9c\x0e\x6e\x68\xda\x81\x3d\x1d\x7b\xa3\x13\xd6\xda\xa9\x1e\x98\xd6\xf0\x81\xd8\x78\x3f\xab\x51\x26\xe2\xcb\x77\xea\xeb\x17\x74\xa4\xb4\x53\x12\xbd\x81\x1a\x4b\x42\xb1\xc7\x6e\x29\x7d\x7d\x58\x17\x1c\x91\xd6\xe6\xe1\xac\xf8\x83\x28\x82\xa0\x88\x5c\xca\xd8\x97\x9c\xee\xee\x5d\x4a\xc2\x25\xd7\x55\x4f\x91\x2d\x59\x51\x08\xc0\x0e\x12\x76\x92\x80\xc8\x77\xb9\x79\x2b\x8a\x29\x96\x6c\xdf\x5c\xd5\xc8\x83\xdc\xee\xa6\xd3\x12\x7d\x9b\x0a\x3f\x3f\x23\x30\xfb\x77\xdb\x3b\x0f\x31\xac\x6d\xcc\x21\xba\x7f\x37\xbf\x3e\xbe\x1b\x9c\xcd\xed\xad\x28\xc2\x9f\x8a\x79\xae\xc3\xeb\x9a\x3d\xa9\xb8\x46\xe8\xa5\x94\xde\x2b\x5e\x7f\xd1\xbd\x60\x68\x67\x32\xfa\x65\xb7\x7a\xe6\x9c\x30\x63\x09\xc7\x81\x35\x1a\xff\x7f\x13\xcf\x25\xe9\x44\x98\x27\xe7\x17\x8a\xc5\x73\xa9\x70\xb2\x61\x09\xe0\xd8\xc1\x83\x19\xf7\x25\x84\x53\x9b\x35\xf7\xc9\x24\xb6\xd1\xa1\x98\x3a\x03\x74\xa2\x12\xb4\xe0\x92\x22\x97\xa0\x88\xe5\xb4\x16\x4d\x8e\x50\x6a\x98\xa3\x65\xef\xe4\xe4\xf9\xb5\x14\x44\x40\xcc\xc5\xd1\x81\xb9\x08\xca\x91\x9c\x8e\xf8\xbf\x30\xfd\xe3\x66\x1e\xf3\x8e\x86\x8d\x34\xec\x26\x1f\x3e\x0b\x96\xee\x87\xad\xbb\xc7\xb5\xf6\xeb\xd8\x3a\xb2\x6b\x44\xe4\x9e\xae\x70\x46\x30\x33\x1e\x4e\x3f\xe7\xd4\x99\xb4\x34\x80\xfe\xb3\x4a\x70\x34\x96\x15\x05\xef\xb5\x19\x4d\xea\xa7\xc4\x07\xe8\x37\x06\xf2\x06\xa0\x8b\x27\x61\x54\x58\xf6\x3c\x27\x0e\xf0\x76\xce\x45\xc9\xdb\xa5\xb0\x4d\x67\xfa\x39\x90\xc1\x1a\xb7\x27\xbb\x49\x6e\x70\x9c\xdf\xef\x47\xc3\xc6\xaa\xa5\xc7\x94\x4a\x5e\x36\x51\xc4\x02\x90\xf6\xf1\x8e\x68\xf3\xc2\x59\xa2\x68\x18\xf7\x69\xc4\x1a\xb9\xdd\x25\x9b\x53\xf8\x35\x86\x22\x55\x24\xc3\xc4\x38\x6c\x6f\x78\xcb\x0b\x3e\xde\x07\x9a\x9a\xda\x4a\x65\x8a\x22\x22\x76\xdf\x49\x9e\x2d\x0e\x1f\x69\x14\x69\x18\x66\x5c\x22\x5d\x3b\xe5\xd6\xc4\xfa\x94\x70\x2c\x49\xde\xcc\xab\xc5\x75\xa9\xc7\xf2\x91\x06\xb8\x20\x9f\x8d\x47\x3a\x86\x95\xd4\x07\xde\x06\x50\x05\x5c\x95\x89\x59\x79\x2d\x74\x74\x05\x96\xd0\xa4\x85\x53\xa0\x6c\x02\xaa\xbf\x9a\x33\xe2\x9d\x73\xd2\x97\xc1\x8c\x8d\xaa\x87\xaa\xa3\xe6\x60\x94\x3e\xb8\x8e\xd4\x83\xb5\x2a\x6c\x32\xcb\xd9\x4f\x2c\x83\x43\xb2\xa1\xe5\x29\xa0\xc1\x61\xc4\x80\x63\x1c\xdd\xc8\xeb\x14\x75\x3a\x03\xb1\x55\x95\xf0\x98\xca\x05\x15\xbb\x17\xff\x06\xe5\x49\x9f\xba\x41\x34\x06\x97\x22\x79\xe6\x39\x29\x43\x4a\xc0\x57\x94\x6d\xb1\xf4\x58\xc5\xf1\x0c\x96\x1e\x70\xde\x12\x14\xc2\xab\x7e\xd2\x7b\xc0\x33\x74\xde\x19\x40\x96\x59\x79\x73\xa4\x71\xd5\xc4\x52\x8b\x3c\x4d\x17\xf3\x5c\xd0\x4c\x7d\xf3\x10\xb9\x98\xe5\x75\x09\xd3\xbe\x73\x85\x2d\xfc\xc2\x99\x49\xe4\xdf\xf7\xa6\x31\x55\xda\xe2\x6b\x54\x62\xd2\x17\x8e\x11\x4e\x91\xac\xb2\x5f\xfe\xf9\xf4\x57\x59\x1d\x16\x51\x94\xd3\xc7\xda\xb4\xff\x07\x0f\xd7\xcf\x1a\x19\x42\x25\xeb\x17\x27\x34\xd1\x7e\xd1\xd1\xfb\xc2\x55\x12\xc1\x85\xd2\xa6\x1a\x87\x8d\xc7\x17\x32\xe6\xcf\x7c\xb1\x04\x1d\x99\xe3\x78\xb1\xa6\x04\x14\xdd\xdb\xd9\x35\x91\x4c\xae\x8f\x3b\xc7\x89\x5e\xd5\x21\x36\xba\xeb\x87\x27\xa5\xee\x29\xca\x64\x04\x0d\xb8\x40\x08\x5e\xc8\x85\xaf\xa6\xbb\x5b\x37\xb9\xff\xb7\xc0\x4a\xe8\x19\x8a\xe8\x82\xfa\x2a\xaa\x23\x46\xa8\xeb\xab\xe1\x34\xb1\x65\x5f\x36\xfc\xe1\x2c\xef\xe5\xdb\x9a\xd3\x78\xc8\x18\x82\x10\xf7\x14\x5c\x15\x98\x5d\x0c\x18\xdd\x5c\x94\xdc\x16\xa3\x0b\xc1\xd1\x25\xce\x3d\x01\x8f\x59\x67\xed\x9a\x56\xf1\x71\x5d\x4c\x24\xc2\xfe\x4e\x89\x8e\x95\xce\x4b\x24\x28\xac\x9d\x4d\x81\xf2\xab\x1e\x46\x41\x40\x09\xc6\xde\x8d\x7e\x60\xac\x07\x40\xf7\xdc\x97\x12\xf5\x32\x01\x52\xe5\x90\xf6\x2a\x9e\x7d\x9f\x86\x06\xbc\xd2\x05\xe9\xab\x7d\x70\x3d\x29\x9c\x92\x24\xb5\x5a\x34\x45\xe2\xe9\x17\x92\x08\xfb\x79\x77\xef\x19\xea\x91\x0f\x97\x10\x6f\xa9\xf4\x67\x42\x1f\xee\xec\xf1\x1d\xc3\x87\x87\x12\x4b\xa1\xd4\x45\x8e\x07\xba\x89\x5a\x8b\x24\xdd\xb1\x5b\x22\x1f\x63\xa2\x71\xa5\x53\x54\xe1\x61\xfc\x49\xc4\x18\xcd\x3b\x3a\xfe\x4e\xf8\xe0\x4d\xfb\x70\x5a\x05\x7c\x44\xfb\x71\x9e\x66\x94\x98\xe3\xd2\x4f\xda\x30\x8e\x9d\x0e\xb9\x41\x6e\x87\x55\xe0\x9d\x1f\xf6\x3a\x77\x0e\xd8\xd9\x91\x9d\xdf\x52\x47\x46\x81\x56\x64\xfc\x6c\x7f\x94\x00\x51\xd6\x75\x32\x68\x6a\x31\x41\x23\x08\xb0\x88\xb9\x18\x34\x2e\x64\x32\x50\x9d\x3c\x48\x14\x16\x1a\xe6\x2d\x39\x26\x98\xf3\x46\x84\xa4\x18\x6d\x6d\xcc\xd0\xdd\x7c\xd8\xbb\x3d\xce\xa7\x5f\x65\xe6\x96\x94\x26\xc1\xc2\x55\x13\xab\xa9\x98\xf4\x9a\x37\xd2\x39\xab\x80\xa5\xd5\x2a\x74\x8e\x12\x1b\xde\xda\x0d\xf6\xe7\x7f\xde\x6f\xfe\xb7\xd3\x7f\xfe\x82\x43\xc8\x51\xbf\xdf\xbe\x7f\xfe\xfc\xf9\xf7\x91\x4b\x78\xbf\x51\x2b\x3b\x15\xfc\x58\xd2\x72\x6a\x94\xd2\x4b\xa0\x3a\x18\xd3\x7f\x11\xae\xcc\x1a\x42\x01\x3e\xe2\x24\xff\xb2\xd2\x36\x98\x34\x0d\x6e\x89\x99\x0e\x39\x2e\xb0\xf1\x9d\x62\xcd\x51\xb1\xe2\xe2\x9b\xe6\xc3\xab\x7a\x36\x8a\x08\xab\x52\x02\xdb\xfb\xcf\x40\x2e\xf4\xc5\x92\xb8\xa5\xc3\xf0\xc1\x24\xa5\x25\x8d\x81\xb0\x91\x1a\x9b\xa7\x89\x73\x76\x24\xa3\x3b\xe7\x44\x01\x83\x24\x7d\x18\x05\x2d\x9b\x09\x97\x97\xba\x6b\x4f\x60\x17\x0d\x84\x8e\x88\x9b\xb6\xd8\x12\x1b\x71\x1b\xe4\x7f\xee\x55\xca\x17\x28\x6b\x1f\x2d\x8b\xec\x16\x96\xa8\x03\xc3\xd5\xad\xa3\xce\xd5\x29\x03\x8c\x83\xd8\x91\x2c\x82\x08\x5f\x5d\xb9\x62\xb0\x0b\xa3\x41\x73\x32\xe2\x15\x80\xaa\x46\xb6\xb3\x79\x35\xde\x0e\xc7\x86\x95\x04\x5b\xc1\xd5\x03\x4c\xca\x36\xf9\x34\x78\xf3\xa2\xbd\xd3\x0a\x36\xb7\x13\xe0\xa6\xd6\x38\xbd\xd0\xcc\x0c\x18\xf7\x4d\x4f\xac\x41\x3f\x2b\x83\x63\x00\xa5\x7d\x52\x99\x03\x6b\xa2\xf2\x4c\x8d\x99\x76\x01\xf0\x93\xd5\xb4\x98\x93\x82\x8c\xca\x11\xd2\x70\x38\xc1\xef\x4c\xe9\x8b\xb7\xc3\x98\xb0\x82\xda\x3b\x82\xa3\xb0\x1c\x3b\x26\x7f\x38\x17\x7f\x0e\x8d\xbd\xd5\x28\x59\x28\xfb\x18\x24\x27\x7e\xca\x49\x38\x7e\x4a\x2e\x13\x2f\xd4\x09\x73\x0e\xae\x9b\x94\x8f\xd0\x42\x8b\xaf\x25\x0c\x3d\xcb\x7e\xe9\xec\x01\x95\x66\x1c\x3f\xeb\xd8\x20\xb6\x22\x54\x95\x24\x04\xe2\xc1\x14\xe3\xc8\x50\xd3\x73\xec\x83\x9b\x46\xe4\x08\x64\xbf\x0e\xfa\x31\x55\xc2\x30\xa8\x0e\x8e\xa1\xa2\xd8\x5c\x5e\x91\x04\x46\x52\x7b\xe3\x41\xb7\xc9\x4b\xc6\x26\x72\x11\x39\xbc\x8a\xb5\x18\x7c\xd9\x23\xec\x8d\xa2\x2d\x0e\x59\xcb\x04\x34\x47\xcf\xb4\x4c\x69\x4f\x63\x15\xb6\x1d\x5e\x9a\x80\xe9\xd8\xca\x13\x6a\x8f\x63\xcb\x49\x54\xb9\x58\x99\x9d\xfe\x39\x8e\x75\x86\x0b\x95\x8a\x53\x06\xbc\x73\xb5\x37\x66\x49\x1a\xaa\x65\xef\x82\x19\x12\x95\x33\xd6\xaa\x90\x9e\xe6\x94\x22\x58\x15\x21\x36\x15\x34\x02\xe3\x99\x9b\x50\xed\xd6\xb8\xf2\x8f\x7f\xaa\x35\x6b\xf8\x10\x6f\x5e\x42\x29\x2a\x51\x0f\x48\x8f\x63\x4e\xe6\x48\x54\x16\x8b\x01\x4a\xa1\x27\x9f\x77\x5f\xae\x07\x33\x80\x02\x9e\x59\xcb\x44\x51\x40\xa2\x29\x91\x53\xea\x6d\x09\x57\xc9\xac\x05\x79\x3a\x99\x63\xb2\x85\x5e\xa6\x55\x4a\xda\x94\xec\xb0\xa2\xf1\xa7\xc2\x0e\x7f\x6a\xf6\x92\x16\xfe\xd4\xac\xf5\x96\x18\xa8\xc9\xa6\xa2\x18\xa8\xd6\x26\x25\xa3\x9b\x9a\x55\xd3\xc3\x9b\xa6\x6f\x9d\x6d\x82\xf1\xf6\xad\x4e\x37\xc4\x30\x37\x5f\x1b\x62\x28\x89\x97\xa4\x3b\x56\x5c\x74\x4c\xe2\xd3\x97\xfb\x48\xeb\x56\xc7\xaa\x49\x0c\xd7\x30\xcd\x28\xb9\x83\x83\xa7\x06\x6a\xde\x79\x1f\x83\x88\x36\x6a\x98\x30\xe9\xd5\x7c\x77\xad\x29\x0f\x31\x95\xa3\xdd\x2b\x06\x00\x6c\xbe\xee\x5e\xb9\xd8\xb9\xb8\xcb\x5f\xd9\x82\x40\x42\x6e\x8b\xdd\x24\x15\x90\x09\x62\x2c\xbd\x2a\xd9\x64\x01\x3d\x85\xc7\x97\x85\x9c\x04\x4a\x79\x2d\xf1\x2f\x0a\x7b\xaa\xf3\x5a\x72\x96\xf0\xd6\x4a\x77\x73\xd5\x80\xf3\xab\x65\x20\x83\x39\x59\x2f\x2a\x50\x16\xbb\x6b\x13\x40\x55\x18\x10\x8d\x8a\x3b\xe8\x02\x03\x2f\x09\x7d\xe9\x2d\x31\x61\xb0\x0f\xd9\x8e\xf1\x17\x98\xc4\x5e\x3d\xdf\x12\xdd\x4a\x9c\x74\x81\x43\x07\x04\x7a\x63\xd7\x88\x8a\xa8\xe4\x75\xaa\xc2\x49\xb2\x54\x0d\xe7\xaf\x01\x37\x64\x84\x05\xb8\x36\x13\x83\xe0\xc5\xd7\x10\xb2\xde\x80\x94\xda\x7b\x33\xdd\xa3\x25\x8c\x04\x44\x9f\x28\x40\x09\x3b\x39\x73\xf8\x62\x8e\xb0\x41\x65\x12\xaf\xbf\x5a\x45\xb5\x33\x6a\xd5\xd9\x18\xf5\xcd\x66\xb0\x2f\x0c\x13\x45\x57\xb9\xdb\x1d\x9d\xb1\x42\xab\x50\x65\x0c\xc4\x32\x52\xa8\x5c\x10\x43\x56\x54\xb8\x01\x8d\xc0\x2d\x50\x08\x4f\xfe\x1b\x36\xa5\x37\x39\x9f\xde\x8e\x0a\x2a\x73\x2a\x3d\xb8\x8c\x2a\xe5\xb0\x40\xf4\xb7\xf8\x5a\xe0\x6d\x9b\x6a\x6a\x80\x52\xad\x30\x08\x8c\xde\xec\x54\x67\xfd\x48\x7f\x84\x49\xa9\x4a\xe8\x14\x49\x79\x77\x75\x21\x6c\x18\x9e\x9e\xce\xfa\x4f\x18\x37\x56\x7d\x35\xbd\x0c\xd4\xb7\xc2\x30\x59\x27\x2c\xaf\x63\x20\x33\x63\x74\xed\xdd\x69\x14\x52\xbd\xf9\xd1\xdc\xed\x93\xa5\x68\xcb\x62\xf6\xc6\x18\x98\xfb\xa4\x2f\x91\x23\xa2\x71\xd0\xcd\xe0\xd4\x7c\xe1\xde\x82\xdc\x0d\x73\xe2\x86\x8d\x20\xf5\x2b\x63\xd8\xda\x6d\xef\xad\x05\xd7\xc7\xc4\xa6\xf4\x68\x03\xaa\x72\xb6\xa7\x68\x2a\x46\xdd\xee\x16\x5c\xee\x09\xed\x0e\xcf\xe9\x68\x4d\x23\x26\x11\x18\x29\xeb\x35\x36\x62\xe2\x2e\x82\x31\x20\x57\x26\x82\xeb\xf0\x48\x2c\x61\x14\xc6\xa3\x25\xb3\xa3\x7a\x81\x53\x45\xd9\xbe\x22\x51\x29\xf1\x1f\xa6\xd9\xb9\x55\xd3\xf6\x40\xc5\x6c\x2f\x91\x97\xab\x65\xb7\xae\x3c\x15\xa2\xda\xe6\xeb\xa1\x3e\x16\xed\x7c\x6b\xea\xb3\x98\xa2\xd0\xc7\xd8\xf6\x4a\x08\x9f\x1c\x26\xf3\x01\xf6\x97\x02\xf8\xe8\x42\x64\x76\x90\x24\x67\xdb\x63\x76\x5e\x45\xf9\x5e\xf2\x88\x09\x23\x71\x74\x47\xc7\x20\xd3\x67\x8e\x37\x2c\xad\x8e\x0a\x03\xa9\x98\xcd\xe0\xea\x95\xce\xca\xe3\x28\x57\x53\x6b\xaf\xbb\xb9\x89\x92\xfe\xe5\xe7\x78\xe1\xf9\xe4\x5f\xb9\x89\xa9\x8c\x6e\xac\xc0\xde\x74\xe6\xb6\x82\x87\x97\xa2\xfc\x58\x7a\x15\x2c\x9b\x42\xdd\x31\xe6\x35\xf1\x87\xad\x63\x14\x9d\x43\xb4\xea\xe2\x6b\xc4\x66\x5d\xb1\xcb\x44\xc7\x49\x5d\x27\x5e\x42\xb9\x06\x2c\x0d\xd1\x37\x91\xc9\x40\x7d\x5b\x75\x5c\x1f\x35\x7e\x1b\x32\x7a\xf4\xcc\xab\x25\xa6\x87\x71\xc8\xd8\x73\x67\xd6\x30\x4d\x0f\xf1\x89\xdb\xa3\x28\xf1\x24\x34\x51\x3e\xd0\xf1\x17\x2e\xd1\xba\x8e\x1a\x6d\xb6\x1b\x13\xac\xc5\x0f\xbd\x6d\xf8\x95\x33\x4f\xac\x49\x5a\xf0\x20\xc4\x76\x9d\x97\xff\xee\xe5\x28\x71\x77\xa2\x55\xb1\x9d\xb5\xae\x14\xc7\xb7\x8b\xb2\x53\xd1\x47\xb3\xb6\x72\xcf\x41\x97\x4b\x74\xcc\xe9\xdd\xb9\x8c\x88\x3e\xf3\xb5\x57\x1b\x3a\x13\x65\x74\x53\x99\xa6\x8d\x6c\x6e\x54\xa8\xd3\xc4\xc4\x20\xc6\x31\x12\x87\x51\x3d\x16\xe3\x96\xa1\xd0\x8f\x91\x32\xba\x62\xf0\xbd\xcd\xd1\xce\xca\x06\x2a\xc8\xb6\xae\x87\x97\xe7\x39\xc0\x2d\x8f\x98\x52\x0b\x5e\x54\xd1\xde\x30\x09\x95\xd8\x3f\x72\x72\x1e\x0a\xc8\xd6\xc7\xdc\x2d\x53\x75\xbc\x2a\x62\x6c\x43\x9e\x8d\xc9\xc4\x30\x2c\x94\xef\x8d\x38\xe4\x82\x7d\x71\x94\x32\xa8\xa3\x2d\x26\x8b\x13\x29\x2b\x9d\xaf\xa6\x42\xc9\xe8\x32\x14\xfc\x48\x64\xe6\x18\x21\x6d\x56\x1a\xe3\xef\x76\x66\x27\x15\x96\xd2\x0c\x50\x87\x4d\x5a\x46\x96\xd2\x2e\x2e\x11\x4b\x4b\x79\x88\x6c\x56\xad\xd3\xe2\xd9\x19\x2d\xe9\x33\x9f\x67\xfa\x1c\x87\xd6\xb8\x21\x16\x40\x7c\x4b\x82\x48\x85\xf7\x1e\xb3\x64\x9c\x13\x6c\xc1\x2e\xb5\x81\xb5\xa4\x89\xe8\x64\x7c\xd8\x7c\x14\x02\x77\x34\x98\x07\xe0\x7b\xdc\x11\xfb\xa3\x4a\xd7\x70\x31\x00\xc3\x93\x3f\xaa\x84\xce\xa4\xea\x56\x3c\x47\x96\x92\x48\x30\x57\x18\x04\xd7\xc4\xd0\xee\x6f\x44\xf1\xc7\x3a\xfc\x8d\xa9\xce\xde\x1a\xca\x48\x52\x73\x52\x19\x67\xee\x5f\x4d\x4b\x65\x34\x71\x6c\xd8\x4e\x6d\x56\xc6\x35\xde\xcd\x32\x32\x4a\x99\x64\x5d\x02\x53\x98\x7b\x8c\x81\x5d\x7a\x06\xa5\xb7\xd8\xdf\xa5\x0f\xd3\x86\x8d\x50\x94\x01\xdc\x97\x23\x17\xdb\x3d\x38\x96\xef\x6a\xba\x27\x07\xb8\x9f\xe9\x5e\x7a\x52\x1f\x59\x29\x4a\xea\xf3\x16\x29\x41\xce\xcc\xdd\x96\x10\x21\xa4\x45\x29\xef\x03\xfa\xf6\x70\xe5\x7a\x36\x5a\xf3\xf2\x0e\xe1\xca\xfb\x68\x6a\x53\xe3\x96\xf7\x19\x21\x22\x05\xa6\x54\x64\x7d\xcc\xe0\xe5\x69\xc0\xca\x99\x48\xc0\xff\xb5\x08\xe6\x69\xca\x39\xf4\xde\xa1\x60\x4f\x12\x6a\x0e\x2d\x2d\xe2\xfa\x2a\x8a\x18\xcf\xf6\x86\x4a\x2d\x89\x0a\xfb\x28\x64\x19\x1f\x12\x42\x89\x7a\xa5\xe8\xba\x09\x3a\x3d\x25\xff\x0e\xbb\xd5\xbc\x11\xa7\x9c\x11\x93\x0e\x6b\x8d\xf8\x41\x55\xe0\x6c\x6b\x2a\x5b\x1e\x63\x62\xbb\x4c\xbb\x40\x51\x96\x20\x8e\x19\x1e\x81\xd4\x28\x6f\x73\x8e\x3f\xc7\xeb\x73\xa1\xdd\x00\xf7\x14\x1b\x70\xbe\xe6\x21\x31\x49\xd5\xbb\x6b\xd7\xba\x53\x3f\x9a\x63\x64\x3b\x01\x6d\xae\x14\xab\x9b\x63\x33\xaa\x58\xdf\xac\x7d\xce\x99\x59\x30\x75\x19\xbc\xd7\x58\x44\x69\x14\xe5\xdc\xa8\x22\x79\xd1\x58\x98\x43\xcf\x99\xe4\xd7\x64\x5b\x3e\x7a\xd4\x80\x8d\x30\x47\x27\x55\x30\x7b\x3e\x9b\x19\x73\xbd\x0c\xbf\x7d\xa7\x30\x79\xa1\x64\x2e\x94\x87\x8a\xbf\x9b\x83\xb0\x0a\x90\xa0\x51\x91\x16\xbb\x5b\x2d\xa4\x22\xd9\x28\x3b\x51\xac\x17\xd6\x78\x4d\x90\x5c\x25\x7d\xbd\x84\x13\xc3\x54\x50\x18\xee\x15\x71\xe1\x8b\xfb\x29\x61\x7f\xb9\x55\x2b\xbe\x23\x47\xb6\xb6\x7a\x35\xcb\x7f\x41\xb7\x24\x4d\xa6\x28\xb3\x4a\xcf\xfa\x96\xfe\xc9\xac\x5d\xf5\x6f\x59\xb7\x27\xcb\xdf\xa5\x7f\x14\x47\xb3\xa2\x04\x06\xc2\x41\xc2\xc8\x5b\xc4\x24\x63\xd0\x85\x9f\x1a\x49\x19\x97\x8a\xb4\x1b\xbd\xb9\x66\xc8\x5d\x86\xd1\x2f\x09\x43\xc8\x1b\xc2\x65\x74\x74\xfd\xc4\x5b\x1e\xc5\xf1\xe7\xd1\x6f\xed\x1e\x7f\xc7\xb3\xfc\xce\x9b\x42\x23\xb6\x4e\x84\x9a\xea\x89\x7c\x63\x32\xc2\x31\xdb\x3e\x0b\x59\xf0\xc8\x34\x01\xc6\xd3\xe2\x1b\xc2\x45\xe9\x2f\x64\xca\xec\x54\x1c\x51\xa6\xc8\x8c\xa4\x16\xe6\x79\xa6\xa8\x95\x48\xd0\xa8\xeb\xca\xdb\x90\xec\xd6\x68\x4d\xc5\x1a\xe1\xd5\x31\x71\x76\x12\xd4\xe0\x4a\xd2\x33\x66\xd0\x3b\xaa\x37\xd0\x7c\x88\x8e\x47\xe3\xe6\x10\x11\x77\x5e\x3a\x40\x1c\xfd\xe8\x45\x30\xd7\x42\x7b\x89\x58\x1e\xd5\x78\x86\x97\xc4\x38\xb5\xa4\x92\x14\x10\xd6\xd4\xf4\x43\x6d\x5c\xf1\x24\xf9\xa7\x4e\x20\xa7\x96\x81\x11\xd8\x57\x4a\xef\x3d\x23\x0d\x43\x10\xa2\x25\xcf\xf6\x84\xb4\xbb\x6d\x0c\x55\xa0\xba\x9f\x45\xd6\xda\x3b\xd6\x44\x02\xff\x75\x03\x33\x85\x6a\x8c\x73\xac\x64\x1b\xe9\x38\xe2\x2d\xdd\x23\xa1\x4d\x69\x0c\x62\x57\xe1\x97\x2d\x07\x0d\x30\x89\x3c\x50\x4a\x33\x7f\x45\xe3\x0f\x4a\x86\x6b\x99\x06\x45\x83\xb4\xf8\x17\xee\x41\x58\x18\x85\x2c\xc8\x84\x89\x58\xad\xa4\x09\x13\x83\xa2\x88\x23\x76\x77\x74\xb3\x17\xac\xfb\x63\x35\x2d\x06\x57\x64\xc5\xcd\xef\x9e\x55\x4c\x09\xcd\x80\x4d\x43\x4e\x19\x15\x40\x2a\x0b\x72\xb0\x7d\x0f\x4d\x41\xb8\x55\x03\x15\x46\xd1\xb8\x45\xfa\x4e\x09\xed\xc6\x9b\x66\xd2\x07\x92\x34\x7f\x4d\x1b\x73\x26\x83\xb9\xee\x07\xbc\x02\x66\x7e\x9c\x5b\xc3\x18\xeb\xf7\x1e\x62\x70\x32\x54\x26\xfb\x92\x5b\x54\xa2\x5e\x03\xa1\x55\xa8\xb8\xdf\xa9\xc4\xb1\x4c\x20\x72\x51\x4a\x66\x5f\x29\xc1\xc8\x87\x18\x80\x4a\x11\xf7\x92\x10\xe3\x11\x26\x76\x67\x08\x22\x13\x81\xa7\x25\x32\xaa\x37\x3e\x8b\xee\x14\x5c\x22\xf6\x93\x39\x76\x43\x08\xe7\x17\x30\x36\xa5\x44\xe0\xf6\x2a\x2e\x59\xd7\x71\xd2\xa0\xa5\xab\x30\x78\x19\xb9\xe1\x27\xd8\x7b\x72\x0b\x83\x25\x91\x43\x18\x7d\x08\x97\x9f\xe1\x87\xba\x57\x2f\x94\x73\xe1\x68\xab\xbb\xb9\x8a\xf1\xd2\x4a\x99\x68\x19\x48\x2a\x0d\x8b\x8d\xe4\x15\x37\x4e\x72\x6f\x25\x25\xd7\x60\x5e\xd5\xa9\x59\x39\x74\x75\xc6\x6e\xb3\xad\x0b\xb0\x6b\x23\x24\x4c\x6f\xa8\x79\xc0\x60\xbb\x6b\x13\x9d\x2b\xaf\xc3\xd1\xb1\xb4\x6e\xd9\x07\x90\x8d\x52\xa8\x53\x5c\x4c\x1a\x03\xc6\x9a\x18\x20\x69\xe9\xc0\xc7\x59\xf4\x3e\x50\x66\xda\xc6\xd7\x9d\xa7\xda\x92\xda\xfa\xca\xd9\xd5\xe2\x5f\xb5\xf9\x6b\xca\x57\x0e\x71\x1f\x2f\xeb\xbe\xba\x6f\x7d\x0a\x9f\xaf\x62\xa0\xe8\x9d\x3d\xfb\xeb\xbd\x55\xbe\xb0\xac\x98\xb4\xca\x30\xd5\x29\xd9\xd5\x26\xda\x21\x1b\xdb\xc4\x74\xec\xec\x67\x76\x19\xd3\x77\xa9\x03\x65\x47\x81\x44\x0d\x43\x4c\x95\x28\xa3\x2c\xa2\xe1\xde\x42\xbc\xc0\x20\xf9\x13\xbd\x28\x27\xdb\x78\x81\x8e\x54\x68\x83\x53\x23\xed\x16\xdc\xda\xd5\xc4\x0e\xd1\x15\x4e\xb4\x23\x7e\x66\x69\x35\x58\x56\x85\x58\x2c\xe5\x58\x8a\x78\x59\x5e\x46\x12\x9f\xa4\x41\xf9\xe7\x5d\xca\x67\xb0\x8f\xf9\xe6\x52\x21\x6a\x0d\xe4\xc9\x31\xf2\x80\x51\x8c\xfe\xeb\x18\x00\x81\x32\xc7\x79\x94\xe8\x03\xde\x6d\xa4\xff\x96\x9f\x72\xba\x38\x73\xdf\x8e\xad\x18\x3d\xb1\x6c\xfb\x6b\x37\x90\x6e\xa7\x1e\xb5\x27\x6f\xb5\x5b\x21\x93\x81\x42\xc4\x67\x2a\x45\x9b\x6e\x95\x6d\x0c\x54\xa6\xac\x5f\xd0\x40\x72\x60\xba\x09\x98\xd3\x5b\x87\x44\x8f\x05\x3e\x1b\xee\x39\xc7\x1e\x8c\xdc\xaf\x8d\xdb\x98\xfb\xe7\xf8\x7a\xb1\x31\x98\x35\xdf\x3a\x00\x7a\x70\x2b\x43\xfc\x0a\xd9\x03\x20\x6f\x0e\x96\xf4\xb2\x6e\x4f\x3d\x1c\x62\x48\x70\x7c\x5b\xf1\x41\xbd\xa5\xb5\x38\xb9\x14\x35\x3e\xe4\xd6\xf3\x43\x45\x35\xc0\xad\x5d\x15\xf6\x93\x24\xbe\xf7\x2f\x05\xcb\x87\x68\x51\x7c\xe3\x75\x9f\x2a\xe9\x8b\x63\xd4\x4b\xeb\xb3\xe6\x90\xe7\x28\x46\x69\xf4\xfd\x61\xd2\xc1\xb3\xe5\x8c\xe4\x21\x7d\xef\x14\x7c\xfe\x80\x03\xf6\xba\xdf\x39\xa4\xaf\x46\x99\x1b\xcd\xec\xe7\xfd\x66\x77\xe3\x49\x70\xf5\xca\xcf\xe8\x12\x83\xa2\x65\xb6\x1e\xec\xa8\xa4\xa9\xed\xdd\x15\xc9\x65\x2e\x42\x87\xa9\x63\xbb\x8e\xcd\x80\x91\xb4\x39\x9c\xb7\xcc\xc0\x30\x3b\xb1\xa7\x61\xae\x08\xf9\x00\x12\xa0\x46\x62\x4d\x76\xde\xd7\x89\xb2\xf9\xd9\xd5\xea\x56\xf6\x26\xef\x3b\x78\xb3\xd7\xd4\x3d\x48\xf4\xf8\xf6\x29\x61\x4e\xab\xd8\x89\x15\x83\x26\x95\xc9\xea\x6d\x87\xed\x2d\xcd\xfd\xe2\x43\x1b\xef\xd6\x50\xce\x47\x8f\x35\x8a\x66\x6b\xb0\x10\x75\x57\xdb\xdb\xa1\xe5\x18\x50\xe5\x94\x1b\xca\x44\x78\x92\x2f\x7c\xc8\xab\x79\x0d\xe0\xcc\x1c\xd1\xd0\xc3\xc1\x91\x0f\xf4\xce\xf7\x26\xe7\x53\x2a\x01\xf3\x85\xc1\xde\x1b\x1c\x73\x80\xb9\xb4\x89\x71\xb8\xff\x92\xfd\xcb\xaa\x44\x54\x8d\xaa\x82\xa2\xdf\x22\xab\x04\xd8\xcb\x0a\x8f\xe4\x04\xee\x33\x9b\x9f\x6e\xdc\x36\x6a\x4a\x1d\x6f\xa0\x5e\x20\x3f\x71\x06\x08\x66\x1f\x24\xfa\xa8\x7a\xe4\x0d\x2b\xc9\xd9\xf3\x38\x7d\xe2\x8d\x7a\xd7\x9a\x1c\xf2\x1a\xb5\xf0\x37\xb7\x93\x6d\xab\xf1\x48\x15\xe9\x81\x46\xd4\xaf\xca\x60\xcd\xb1\xc1\x7b\x93\x57\xc2\x1b\xc9\x1e\xd4\x62\x0d\x3b\x85\xaa\xb5\x54\xd9\x4f\xe1\x4b\xb6\xff\x82\x51\x85\xf8\xdc\x8d\x3a\x69\x0b\x60\xd6\x71\x4b\xc0\xed\x1a\xf0\x9d\x1f\xf6\x7a\x8b\x3f\x1e\x03\x4f\x56\x37\xa2\x17\x15\x4d\x17\xdc\x14\xa3\x85\x3e\x15\x45\x59\x55\xca\x91\x87\x33\x2e\xc2\x5b\xea\x79\x03\xff\xe9\x14\xe1\x09\x64\x90\xad\xdd\xee\x8b\xd5\xc4\x19\x1b\xf0\xbc\x3a\x70\x57\x00\x0d\xa4\x27\x99\x8f\xd2\xca\x91\x05\x73\xf6\x34\x7e\xca\xa6\x2d\x1a\x03\xc7\x57\xcd\x3c\x5e\x52\x39\x79\xca\x30\x27\x17\x74\x56\x6b\x14\xeb\x0d\x40\x27\xd2\xe3\xe7\xa7\x31\x93\x17\x85\x79\xbb\xdc\x7f\xaf\x12\x95\xd3\xbb\x4e\x36\x66\xb6\x51\x2c\x14\x87\x9d\x94\x11\x7c\x82\xdf\xdf\x3e\x84\x44\xf5\x3e\x63\x48\x36\x67\xde\xa0\x9a\x37\xe8\x96\x11\x2d\x0d\x34\x8a\x67\x1d\xcc\xd4\xe2\x0f\xe7\xc9\xb0\x22\xbd\xbd\x60\xea\x56\x78\x7f\x21\xb8\xde\x0c\x76\x66\xba\xab\xeb\x89\x06\xe1\x35\x1c\x71\xea\x05\xb2\xf2\x49\x1f\xd0\x1f\x3f\xc9\x06\xe3\x97\x84\x99\x88\x57\xf7\x80\x3f\xc3\x68\x0a\xc4\xa8\xc8\x2d\x45\xb2\x2f\x42\x06\xc4\x3a\x9b\x0d\x8a\x5b\x78\xbc\x25\x0c\x51\xcb\x6f\x73\xf1\x42\x91\x32\x03\x4d\xc3\x5d\xa5\xde\xf9\x3a\xd1\x9b\x6c\xaf\x29\xb1\x66\x50\x87\xf0\x68\xf7\xcd\xbd\xce\x93\x16\x67\xda\xc3\x6a\x09\x5c\xca\x18\x4e\x81\x23\x04\xd1\xa5\x0c\x07\xec\x5c\x1a\x3e\x04\xe8\x6a\x01\xaf\x1d\x82\xdf\xbd\x18\x8c\x2d\xf7\x01\x57\x43\x61\x68\x63\x14\x46\x25\x7b\xd9\x19\x37\x45\xc3\x60\xc4\xc4\xac\x33\xbb\x1a\x49\xa2\x64\x38\x93\x4e\xd9\x62\xa6\x4d\x2e\x9b\x0c\x56\x22\xfd\x8d\xa1\x22\x65\x5a\x55\x80\x48\xb1\xa6\x9c\xd3\xe5\xa3\xa2\x59\x29\x5a\x9d\x18\xd1\x4a\x89\x11\x71\x04\x85\x75\xfc\x95\x1f\x56\x31\x6d\x83\xb1\xf2\x57\x89\x29\xad\xfa\xe6\x99\x72\x11\x99\x59\xd7\x9c\x21\x94\x3e\xb0\x77\xef\xe0\x05\xc0\x11\x57\x65\x20\x64\xb3\x0f\xcc\x57\x30\x31\xc3\x8a\x55\xce\xab\x6f\xcc\xcb\xb6\xf4\xe3\x6a\xe9\x71\xa6\xb8\x8e\x69\x4c\x24\x33\x21\x1e\x81\x6d\xe1\x58\x70\x00\x2c\x9a\x94\x51\xb6\xbb\x1c\xe7\xb7\x33\xc1\xcb\xde\x90\x2b\x1c\x90\xc8\x1a\x88\xb7\x13\x3e\x88\x01\xab\x05\xdf\x3f\xef\xd5\x4a\xda\xca\x78\x7b\x22\x18\xdd\x47\x95\xea\x0f\x7b\x70\xfd\x51\xe2\x7c\x74\x2f\x9c\x19\x23\x45\x17\xe9\x87\x65\x63\x99\xfa\xe1\x7b\x1c\x45\xd1\xd2\x19\x1b\x59\x4e\x19\x57\xe6\x45\xb3\x8b\x14\x61\x9c\xf7\xc4\xa8\x24\x50\x23\x85\x6f\x25\xa1\x9b\x4a\x07\xc9\xd9\x1d\xcd\xfc\x8f\x7a\x0f\xf1\x10\xf7\xa9\xc6\xa2\x36\xa4\x59\xc5\x65\x62\x2f\xfb\xfe\x87\x59\xc0\x21\x98\x14\x9a\xc3\x4d\x8c\xaf\x07\x2f\x46\x25\xe9\xe7\xe8\x3e\x52\x7c\xdc\x16\x66\x80\xd1\x67\xcb\x4c\x46\x89\x8a\x35\xf3\x9c\xc1\x32\x0c\xbb\x03\x30\x2b\x5a\xf2\x28\x8b\x30\x86\x29\x7c\x32\x16\x6e\x3c\xe4\x95\x37\x9a\xa5\x83\x19\x35\xc9\xaa\x70\x5b\xf0\xad\xb6\x12\xd5\xd7\xe8\x8a\x42\xa4\x66\xbc\x8e\xe4\xc1\x8c\x9c\x7e\xb4\xf0\xd1\xaa\xee\x8e\x54\xbd\x5a\x9d\xf3\x22\x26\x9a\xe8\x9f\x5b\x31\x75\xb3\x95\xd6\x39\xb9\x65\xa9\x5a\x58\xdd\x9b\xba\x4c\x75\x17\xa8\x67\xef\x7c\x45\xf2\x51\xaa\xb5\x6a\xb7\x66\x3b\x97\x5f\xa3\x9d\x4a\x4c\x3a\xad\x1c\x6c\xc5\x13\x5f\xb2\x77\x35\x95\x6f\xec\x2d\xe5\x4f\x7c\x09\x43\xa8\x51\x0e\x2f\xc6\x44\x66\x52\x68\x95\xb7\x77\xcc\x1a\x04\x46\x8f\x40\x4b\x12\x73\x0c\xe1\xe2\x9a\x1e\x83\x56\xff\x6a\x1f\x48\x73\x00\x7c\x3d\x58\x0b\xa6\x87\x11\x45\x1f\x30\x96\xc4\x32\x11\xe2\x95\x8f\x47\x23\x83\x61\xb0\xcb\xa7\x8d\x2c\x0d\xf1\xa2\x20\x4b\x02\x34\xed\x0b\xb4\x19\x8e\x7f\x8a\x2d\x56\x44\x36\x7c\x53\x3e\x2a\x65\x09\xcf\x81\x70\x33\x21\x40\x42\x83\x76\x77\xa6\xcc\xb2\x73\x73\x06\x63\x49\x31\x68\x3c\xec\x34\x7f\x4d\xcf\x67\x1d\x57\xac\xaa\x74\x89\xfe\x29\xce\x13\xab\xd2\xc4\xe2\x48\xf8\x3b\xe6\x8a\xf4\x25\x59\x64\xf4\xd5\xca\x4c\x48\xc3\x46\xa4\x26\xa8\xcd\x1a\xb6\x29\x48\x95\x55\x62\x50\x8a\x00\x69\xf8\x2b\x23\xca\x94\x92\x08\x29\xca\xd0\xf9\x3b\x27\x63\xe5\xf6\xd8\x5b\x80\xbf\x3b\x94\x8a\x47\xc2\xa1\xa2\xbd\xb0\x7c\x4f\xb3\x38\x92\xa7\xc3\x18\x6d\xbf\x56\xa9\xb0\xdf\x50\x7c\x07\x48\x7a\xcc\xf8\x0c\xd7\xae\xee\x15\xbd\x72\x8e\xf3\xdd\x07\xb3\xf3\xdd\xcd\x4d\x01\xb2\x9d\x09\xf8\xdb\xb0\xe7\x63\x90\xfc\x56\xb8\xbc\x27\x2e\x56\xfc\x1d\x31\x80\x7c\xef\x3c\xdb\x0a\xe6\xbf\x97\xef\x24\x84\x2a\xc1\x33\x49\x02\xa7\xec\xef\xbf\x30\xbf\xab\xf7\x41\x4a\x81\xbf\x47\x23\xd3\x14\x00\xad\xd9\x54\x92\x01\xbc\x54\x04\x2d\xb1\x33\x30\xaf\xd2\x1c\x70\x99\x3a\x1e\x23\x1b\x0b\xa2\x6d\x81\x12\xf0\x72\x1c\x72\x0a\x94\x30\xdb\x7d\x32\x26\x91\x13\xe9\xfe\xf7\x9e\xc5\x43\x7d\xe0\xb5\x91\x4d\x40\x22\x83\x22\x32\x8b\x25\x2a\xe9\x23\x38\x24\xb2\x09\x02\x73\xfc\x2b\xfc\x1b\xcd\xb0\x50\xaf\xd7\xdc\x81\x46\xdd\x89\xbc\xc6\x34\x6d\x11\xbc\xb8\x8f\x59\xb4\xfb\x01\x5a\x0a\x10\x7e\x2e\xcd\x27\x45\xa8\x1c\x96\xa5\x2e\xbe\x46\x03\x7a\xc5\xe9\x44\xd4\x4b\xbc\x6d\x36\xf5\x22\x53\xb7\x3e\xbd\xfb\x0d\x1e\x65\xb0\x76\x3d\xdc\x9e\xef\x03\x04\x27\xa2\x9c\x03\x12\xa4\xb3\xf9\x22\x1d\xc2\x47\x1e\x0c\x37\x0f\xd3\x9d\x66\x7f\x07\x7f\xc0\x92\x60\xb8\x7a\x0e\x10\xcb\x95\x04\xb1\x73\x55\x0e\x1f\x28\x8b\xc3\xf1\x03\xbb\x6b\x97\x83\xe6\x1d\xd5\x34\xa9\xb7\x14\x94\x7a\xc6\x52\x00\x47\xf0\xe9\xcb\xfb\x85\xdc\xe7\x7e\xf6\xb7\xa5\xec\xe9\xdf\xaa\xc3\x3e\x52\xaf\x72\xa6\xe4\xd3\x9f\x7f\xf5\x65\x36\xe5\xae\x20\x04\x9d\x6c\x02\x48\x39\xde\x08\x40\x47\xdc\x00\xb0\xce\xb9\x72\xa4\xe7\x3b\xe3\xcb\xa5\xe9\xdc\xc1\xb8\x4e\x18\x34\x3e\x15\x2a\x8d\x2e\x92\x8d\x06\x8a\x68\x6b\x97\x1b\x21\x23\x38\x72\x58\xb9\xb3\x10\x34\x51\x18\x8d\x5e\x90\x3b\x4f\xb9\xb4\xbd\x3b\x0d\x08\x81\x53\x40\xab\x84\xe5\x8b\xc1\x3c\x50\x80\xff\x07\x12\x80\x13\xbd\xbb\x14\x83\xdb\xc4\x34\xf9\x3a\x65\x60\xa5\xa8\x65\x5f\x7d\x76\x3a\x8b\xfa\xad\x2d\x75\x98\xfd\xb3\x6e\x15\x01\xf2\xe8\x03\x85\x94\xe8\xd1\x41\xe7\xe6\x63\x82\x93\xdc\xd2\x72\xe1\x51\x73\xeb\xd4\xce\x61\xd0\x42\x3a\x36\x5f\xfe\xf6\xf3\xac\xe5\x16\x69\x75\x49\x91\x83\x15\x95\x9b\x13\x37\x7c\xd2\x54\xc9\xbe\x53\xf0\x61\xa6\x73\x15\xba\x74\xab\x30\x4c\x32\x02\x67\xc5\x94\x6a\x31\xa2\x5f\x79\x2b\x45\xf5\x2e\x4b\x6c\xd2\x54\xa6\x2e\x4c\x85\x2a\x37\x10\x6c\x92\x7a\xe6\x0a\x80\xca\xb3\xe8\x8d\x95\x70\x92\x31\xf1\x72\x44\x96\x1a\x83\x88\xd3\xa4\x66\x05\x21\x6d\x52\xc6\x6c\x59\x9f\xc1\xb0\x19\xc4\x2a\xcc\x33\xae\x67\xed\x3f\xc3\x31\xa1\xce\xfa\xb0\x24\xa8\xd2\x01\xcb\xe4\xc9\x5e\x8b\x2b\xa6\xd8\x1c\xcb\xd6\x13\xdd\xe2\x8a\xe3\x52\xb8\x21\x5d\x30\xdd\xd2\xde\x99\x43\x33\x5a\xa0\x5b\x18\x0d\xb2\xf1\xc0\xd8\x0d\x43\xfd\xc9\x54\x07\xa6\xe3\xc3\xee\x8e\xee\x68\x60\x1d\x6a\x85\x19\x5d\xc6\x5c\x7c\x01\xa3\xb3\x99\x4c\x32\xa0\xf6\x22\x41\xcf\xb0\x3e\x53\x89\x08\x45\xbb\xa9\x33\x80\xb3\xa4\x55\x01\x15\xaa\x55\xc1\x7d\x6c\x44\xc6\x67\xd3\x28\x3c\xe7\x68\x1d\x27\x9b\x9e\x1b\x65\xe4\xc5\x4b\x65\xe4\xc5\x2b\x25\xea\x5d\xe4\x06\xf9\x75\x94\x22\x6f\x70\xb0\x0c\x2c\x3d\xa6\x78\x20\x1b\xa6\xce\xde\x51\xb8\xbe\x8a\x6e\xc6\xaa\xae\xeb\xd3\x7d\x40\xc1\x24\x09\xf9\x86\x24\x04\x73\xf7\x0d\xfa\xd3\xb3\xff\x83\x02\xae\x35\x68\x2f\xd0\xa2\x07\x05\x9f\x42\xe9\x1a\x85\xd4\x8d\x48\x45\xad\x6e\x88\xfc\xaa\x79\x5e\x9d\xf3\x94\x0b\x2b\xf3\x60\x97\xd3\x00\xea\x05\x44\x85\x68\x31\xcf\xb9\x92\x35\x70\xef\xde\x9d\x10\x58\x4e\x76\x92\x89\x57\x81\x01\xc7\xe1\x79\xcc\x7d\xe0\xfd\x62\xcd\xad\x8a\xdb\x75\xf7\xf2\x5d\x58\x5f\x41\xbc\x7a\xa0\x18\xae\x5e\xce\x2c\xcd\x35\x98\x9f\x05\xee\x17\x1d\x4e\x16\x26\xe4\x22\xe8\xc6\xfc\x61\xb5\xdb\xa7\x4f\x7f\x9a\xb5\x37\x1a\x0b\x35\x25\x45\xb7\x9c\x4f\x84\x59\x8e\xc4\x60\x3d\x3f\xd0\x80\xb7\x04\x8e\x39\x9f\x1f\x15\x46\x8e\xa2\x0c\x26\xab\xd8\x44\x90\x51\x40\xcf\x81\xbc\x01\xc6\xe7\x32\x59\x11\x48\xe9\xd2\xd5\x60\xe1\x79\x12\xc6\x58\xbb\xc4\x7a\x41\x31\xfa\xb4\x51\x74\x0a\x02\x11\x07\x36\x8a\x4b\xc1\x69\x47\x63\xb0\x43\xd8\x5d\x04\x29\x31\x31\xee\xac\x03\x57\xfa\x1e\x80\xbc\xcf\x20\xef\x01\xe7\x99\xac\x0e\x2f\xab\x3b\xd2\x18\x61\x8f\x41\xf7\x3b\x87\xa3\xdc\xab\x3e\x31\x5b\xd3\x7c\xef\xe6\x51\xb0\xf7\x84\x63\xda\x1f\x57\xd5\x4f\xa9\xc5\x2f\x96\xde\xbf\xd2\x80\xbe\xac\x8a\x2a\xb3\xf7\x10\x00\x0c\x07\x7d\x1d\xfd\xcd\x28\x4e\xd2\x9f\x51\x19\xab\x63\x55\x55\xfb\xa6\x43\xb1\xdc\xa4\xfb\xe1\xdc\x63\xfb\x26\x41\x99\xef\x97\xf9\x32\x9d\x3e\xfd\x59\x36\x76\x63\xa3\x52\xf5\x5e\xc3\xca\xb6\x5b\xe3\x30\xb9\xec\x09\xcc\xb4\x83\xc1\x51\x4f\x64\x95\x4f\xe7\x94\x51\x91\xf7\x58\x8d\xc8\x5e\x7e\x29\x36\xda\x64\x8d\x51\xf6\x84\xff\xb7\xb2\x5b\x77\x7e\x73\x82\xec\x80\x4e\xd4\xdd\xd2\xc0\x09\x6c\xd6\x44\x7b\x2e\xf9\x66\x19\x78\xcf\x5e\x47\x2d\x4e\x72\x90\x5e\x8b\x92\x44\xb1\x18\x89\x04\x48\x6c\x23\x9c\x40\x4b\xd1\x0b\x8d\x48\x89\x2b\xb0\x4b\xae\xee\x1e\xdd\x0e\x19\x4e\xd4\xd7\x2a\x08\x32\x7b\x32\x52\x95\x70\x66\xaa\x77\xcd\x18\x0e\x67\x0e\x52\x99\x84\xd8\x59\x71\x7f\x0f\xce\x86\x50\xb1\xe4\x80\xa9\xc0\x69\xcc\x22\x08\xe3\xc1\xb2\xe4\x0b\xa8\x80\xde\xc4\xb5\xf8\x90\x63\x47\x97\x23\xb7\xbd\xed\x00\x0b\x55\x52\x2c\x54\x81\x6b\x2c\x08\x0a\x60\xfa\x06\x1d\xe3\x2c\x2c\x20\x9e\xf2\xe8\x0a\x97\x2f\x93\xa6\x99\xc5\x33\x7c\x88\xd8\x08\x9d\xdd\x5f\x38\x91\xa8\x4c\xd9\x77\xea\x11\xff\x62\x54\xee\x4d\xe2\x4e\x31\xf7\x12\xaf\xac\x6a\xab\x98\x1f\xb2\xc5\x91\x71\x84\xbd\xcd\x7f\x6b\x38\x0d\x68\xd6\xa9\x0c\x21\xda\xa6\xf0\x34\x3c\x59\xbd\x46\xec\xcb\x4e\x62\x54\x78\x70\x24\x96\x40\xf7\xf5\x38\xb0\x0d\x7a\x3f\xdf\x4a\xf0\x99\xfb\x12\xbd\xb7\xb2\x33\xd6\x80\x04\xe2\x38\x34\x2c\x20\x6a\xf7\xe0\xf4\x7b\xb2\x67\xd9\x4f\xff\xfd\xb3\x3f\x67\x85\xa0\xb1\xa1\xf9\x01\xe7\xf0\x25\x40\x5d\x58\x37\x5b\x40\x08\x31\xf0\x98\xd2\xd0\x83\x40\xc9\x0b\xa3\x1a\x62\xd3\x09\x7d\xaf\x2a\x25\xc6\xbb\xc4\xe4\x88\xe4\x95\xf0\xae\xc8\x5c\x05\x50\xc3\xe4\x31\x91\x24\xce\x33\x01\x6a\xa5\xce\x7d\xf4\xa2\xfb\xf2\x31\x27\x8d\x4c\xb4\xe0\x53\x5a\x3c\xa3\xa6\x4e\x98\xcc\xa1\x5a\xa8\x15\xb2\x64\x57\x14\x06\xbd\x94\xb2\x07\xa6\x05\x88\xbd\x13\x0c\x96\xba\x11\x0a\x84\x75\x2d\xd2\x12\x2b\x54\xec\x36\x18\xa0\x50\x82\x4b\x02\xab\x26\x10\xa3\x17\x01\x08\x5e\x17\x1b\x88\x54\x96\xe7\x0a\x65\x81\x0a\xae\xae\x1b\x77\x41\x77\x54\x91\x62\x46\xc2\x18\x76\xf6\xf9\x93\xf6\xce\x8f\x06\x66\x63\xfb\x45\xf5\xc6\xf3\xcf\xf8\x3b\x2f\x40\xd5\x9a\x77\xce\x45\x06\x59\x81\x71\x00\x22\xce\xfe\x4b\x90\x0a\x42\x63\x4a\x05\x10\x9b\x26\xdc\x34\x57\x98\x98\x4f\xe8\xef\xac\x7d\xc2\x04\x59\xe0\x85\x66\x58\x59\x4f\xa6\xe1\xb3\x5c\x47\x01\x0f\x15\xf5\x62\x68\x1d\x8a\xbd\x1c\x6a\x02\x65\x77\x90\x95\xaf\x7a\x06\x98\x23\xfb\xea\x81\x0d\x3d\x5c\xaf\x57\x7d\x8e\xe2\x22\x6f\xce\xa7\x5f\x7d\xf5\xe5\xe9\xd8\xe0\xa3\xb6\x64\x06\x56\x53\x7a\x41\x5c\xd2\xaa\xa9\xf5\x08\x96\x0e\x3b\x53\x93\xf6\x62\x28\x10\x79\x64\x04\xc6\xbe\xc2\xea\xee\x0e\xd5\xd8\xd5\x46\xdd\xdf\x3f\xca\xef\x2c\x3b\xdb\xc4\x96\x6f\xd0\x29\xa1\xbd\x13\xe6\xd0\xe3\x5a\xc2\x81\xfe\x41\x7d\xcf\xfe\x96\xbe\xfb\x7a\xb8\x28\x96\x96\xa1\x92\x08\xda\x1a\xe8\x10\x65\xcf\xe7\x81\x90\x3b\xfd\xb0\x3b\x34\x5c\x86\xff\xd7\xd5\x13\xc0\xde\xe2\x94\x85\xaa\xbb\x05\x4f\xd9\xcd\xde\xb3\xdb\xed\x3d\xab\x01\x94\xe7\x53\x65\x24\xda\x51\x1c\x18\x55\xd1\x79\xba\x59\x31\x80\x14\xf6\xcd\x6d\x4c\x3c\x80\x79\x23\x9e\x2a\x5b\x95\xa9\xbe\xad\x61\xb4\x8d\x1a\x3c\x1d\x64\x4a\xde\xbf\x5d\xbe\x04\xba\x69\xe8\xa6\x5f\xa3\xec\xcd\x7e\x4c\x53\xda\xad\xdd\xac\x0e\xc7\xb1\x50\x1b\x22\x15\x5a\x30\x7f\x31\x56\x38\xe2\x0e\xd5\x94\xc1\x00\x3e\x0f\xdd\xa3\x31\x94\x7a\x13\x06\xb6\x1f\x09\x86\xa6\xa8\xf0\x0a\x98\xad\xff\x84\xe1\xed\x53\xa5\x58\xc6\xcc\xb2\xaa\x86\x38\x5c\xf4\x81\xa5\x00\x3c\xfa\xa1\x22\x61\x51\x3f\x50\x51\x0c\x22\x20\xaa\x06\x4d\x28\x93\x4f\x51\xd7\x9e\xf8\x13\xfb\xf4\x60\x31\xd1\x7b\xc2\xbc\x30\xc5\xa7\x6c\x5e\x4f\x15\x6b\x40\xcf\x7c\x02\xff\xc9\xb2\x59\xa0\x2e\x10\xa9\x74\x2b\x92\x72\xa8\x12\x1f\x10\x5b\xa9\x51\xd6\xa5\x9b\x53\xe1\xdc\xb5\xa8\x9e\xe4\x16\x45\x05\xa6\xa1\x50\xd5\xe5\x66\x56\xd2\x7e\x30\xce\xb7\x4e\xb1\xa1\xcd\x3b\x2c\x85\x68\xd4\x8c\xc7\x22\x09\x62\x09\xdb\x3b\x1b\xdd\xa3\xa5\xce\xfa\xb4\x2e\x17\x67\x70\xfc\xa6\xb2\xeb\xa8\xe1\x23\x67\x44\x36\x8a\x6b\xd3\xc7\xf4\x4b\x4a\x50\x73\x70\xca\x82\x58\xd9\xe1\x4a\x1a\x0b\xe4\x82\xd2\x8c\x8a\x15\x34\x05\x7f\x28\x39\x75\x7c\x02\x25\x12\x80\x44\x81\x20\xe8\xee\xd6\x93\xf0\xd2\xb8\x86\x46\x0a\x0c\xad\x80\x85\x36\xd0\x5d\x52\x4e\x61\xd4\xa8\xe7\x38\x2d\x79\x30\xbe\xde\xbb\xb4\xae\xcb\x61\xb6\x11\x84\x84\x66\xe2\x54\x16\x04\xad\xe1\xdc\x0a\xf3\xa0\x0c\x4d\xae\xdf\xc4\x83\xc6\xc0\x44\xba\xc2\x50\xa4\xcb\x7d\xa0\x13\xb1\xf7\x56\x77\xe3\x70\xd4\xa9\x69\x1f\xc9\x32\x2c\x05\xc5\x7c\x0e\xaf\x0d\x33\x39\x66\x49\xfe\x43\xe1\xd9\xcd\xc9\xe8\x94\x48\xea\x9b\x57\x8d\x2f\x89\x1a\xa3\xd2\x07\x19\x3b\x90\x90\xa2\x7c\xcd\xcb\x7a\x46\xf9\x10\x93\xc6\x4c\x54\x9f\x7b\x12\x4e\xda\x0e\x4e\xc4\xa9\x68\x33\x35\xa7\xa2\xa3\xa2\x63\x36\x00\x0a\x5e\xaf\xe0\x25\x3b\xdd\x87\x51\x76\x3a\x54\x8a\xf6\x4d\xeb\x9b\xd1\xd9\x50\xd1\xe8\x9e\x9d\x0a\xf6\x26\xb2\xb1\x84\x7f\x7e\xad\xf8\x41\x22\x21\xb0\x4e\x16\x28\x49\xc7\x9a\xdb\xb1\x6a\x08\xfc\x6f\xaa\x1b\x9e\x23\xe7\x92\xfd\x46\xcf\x92\x15\x40\xe6\x2c\x3f\x60\xd5\xd0\x07\x3c\xdf\x5f\xe9\x8c\xab\xdf\x64\xcc\xe4\xb7\xdf\x30\x7f\xf4\x8e\x2d\x58\x99\x6f\xbf\x31\xa3\x89\xbd\xeb\x50\x78\x36\xb1\x74\x8a\x7a\x52\x46\x48\x31\xab\x3d\xc9\x9b\xd8\x67\x66\xb1\xd6\xf4\x04\xdf\xb5\x35\x99\xa5\xdd\x5c\x7c\xb2\xef\x3c\x44\x2b\x19\xb0\x4e\x96\xfc\x4e\xab\x96\x92\x77\xee\x1b\xc9\x11\xf7\x2f\x8c\x48\x87\x57\xe6\x7b\xb3\x3d\x61\xdf\x00\x7d\xfc\x75\x7c\xf9\xd4\xbb\x44\x71\xdc\xea\x85\xa1\xe8\xec\xb3\x59\xbb\x35\x04\x3a\xfe\x76\x7a\xe2\xd4\xc3\x6e\xdc\x29\x95\x28\x94\x12\x3d\x32\xb9\x90\x3d\x99\xc8\x35\x09\x48\xa0\xee\x79\xe5\x33\x99\xc2\x90\x97\xc3\xc0\x31\x53\xb3\x99\xc1\x9a\x37\x42\x4e\x9b\x1c\x48\x26\x43\xfe\x9b\x73\xdb\xc1\xf2\x7a\xe6\x43\x3f\xf7\x61\xb6\xb3\x76\xed\xa4\x9f\xf9\x70\x04\xfe\x44\xf5\xc2\xb5\x15\xfc\x35\x8c\xbf\xb6\xe7\xe1\x51\xc0\x5f\x25\xfc\xf5\xe8\x07\xfc\xf3\x3c\xfe\x79\x75\x9d\x6a\x00\x62\xfd\x30\x1b\x2e\x37\xf1\xc7\x05\xfc\xbe\xfb\x12\xfe\xf4\x1d\x78\x93\x4b\x94\x25\x96\x9b\x1e\x71\x2b\xa8\x47\xa2\xc4\x78\xaa\x83\x61\xaf\x51\xe3\x2f\xaa\x93\x52\xe1\x02\x7f\xa0\x7e\xce\x3b\xce\x59\xfe\x49\x7d\x41\x57\xf5\x61\x4e\xba\x4d\xdd\x5d\x70\x0a\x52\x9d\xba\xac\x15\xce\xe7\x55\xb7\xd0\x27\xfd\x56\xbd\x72\x97\xb0\x30\xa5\x9a\x57\xc5\x4c\x11\x67\x32\x2a\x41\x95\xca\x4c\x15\x4e\xdf\x0a\x97\x7e\x92\x88\x42\xcd\x6d\xf1\x5e\x6e\xde\xe2\xd4\x29\x98\x57\x7c\xff\x41\x46\xa5\x99\x73\x2b\xd5\x86\x0a\x3b\x79\x71\x1d\x75\x8f\x14\xdd\x0c\x40\xd0\x76\x81\x13\xdd\xab\x5c\xb1\x19\x92\xac\x62\xfc\xa2\x01\xa4\x5b\x38\x9c\xe9\xc1\xf5\xce\xda\x16\x50\x87\x7f\xff\x3b\x51\x80\xee\x77\xce\x3f\xfe\x91\xfd\xfc\x77\x28\xce\x7b\x3d\xde\x3d\x9a\xc4\x23\x63\xd8\xae\x18\xf0\x40\x3a\xfe\x21\x56\x25\x23\xbe\x50\x64\x6a\x21\x3e\xc0\xdc\x75\xe6\x7f\x06\x00\x00\xff\xff\x12\x67\x48\x8f\xf6\xd0\x00\x00") - -func confLocaleLocale_zhCnIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_zhCnIni, - "conf/locale/locale_zh-CN.ini", - ) -} - -func confLocaleLocale_zhCnIni() (*asset, error) { - bytes, err := confLocaleLocale_zhCnIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_zh-CN.ini", size: 53494, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_zhHkIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\xbd\x7b\x73\x14\xd7\xb5\x28\xfe\xff\x7c\x8a\x3e\xa4\x28\x27\x55\x41\x2e\x27\xe7\xf7\xa8\x53\x1e\xe7\x3a\x38\x8e\x73\xcb\x76\x7c\x0d\xae\xd4\x29\x17\x35\x1e\xcd\xb4\xa4\x3e\x8c\xa6\x95\xe9\x1e\x64\x25\x95\xaa\x11\x20\x34\x42\x12\x12\x0f\x09\x04\x02\x81\x00\x21\x04\x12\xe2\x2d\xf4\xe2\xbb\x9c\x4c\xf7\xcc\xfc\xe5\xaf\x70\xd7\x6b\xef\xde\xdd\xd3\x23\x70\xea\x5e\xff\x61\x34\xbd\xd7\x7e\xaf\xbd\xf6\x7a\xed\xb5\xf2\x43\x43\xb9\xa2\xed\x15\xb2\xc1\xd2\x76\x38\xbf\x6b\xfd\xd1\xb5\x5a\x6b\xb7\x5a\xab\xb5\xe6\xf5\xb3\xad\xf1\xb5\xe0\xfc\x43\xeb\x8f\x8e\x6f\x85\x8b\xd3\xc1\xe4\x42\x26\x33\xe0\x0e\xda\xd9\xf6\xca\x7c\xfb\xf6\x68\xa6\x98\xf7\x06\x7a\xdd\x7c\xa5\x98\x0d\x2f\x3c\x08\xea\xaf\xda\x37\x97\x9b\x13\xf5\x8c\xfd\xe3\x50\xc9\xad\xd8\xf0\x71\xb9\xf9\x62\x39\x33\x60\x97\x86\xb2\xad\xb5\xb5\xf0\xda\x85\x8c\xe7\xf4\x97\x73\x4e\x39\xdb\x5c\xd8\x09\xc6\xee\xf3\x4f\xb7\xea\xd3\xef\xf1\x6d\xfe\x5d\x05\xe8\xd5\x9d\xe0\xdc\xf9\x4c\xc5\xee\x77\x3c\xdf\xae\xa8\xdf\xc3\x76\xaf\xe7\xf8\x76\xb6\xf9\xea\x59\xf3\xd1\x42\xe6\x94\x5d\xf1\x1c\x17\x1a\x9b\xa8\x87\x8b\x8f\x33\x43\xf9\x7e\x18\xd9\xed\x51\x18\x45\xc6\xb7\x07\x87\x4a\x79\x00\x0d\x57\xef\x86\x37\xdf\x66\x4a\xf9\x72\x7f\x15\xcb\x79\x6a\x99\x42\xc5\x86\xd2\x5c\xd9\x1e\xce\x06\x13\x2f\x83\x9d\xed\x9e\x9e\x9e\x4c\xd5\xb3\x2b\xb9\xa1\x8a\xdb\xe7\x94\xec\x5c\xbe\x5c\xcc\x0d\xe2\x2c\x9a\x57\x56\xc3\xfa\xab\xc6\xdb\x3b\xe1\xe8\x93\x60\xe6\x7c\x78\xe3\x45\x70\xef\x3a\x8d\xd4\x2e\xc2\x54\x72\x79\x2f\x1b\xbc\x7e\x06\x13\x68\x4f\x9d\x65\xd8\x0c\xb5\x54\xce\x0f\xaa\xca\xc1\xec\x74\x73\xf5\x69\xc6\x1e\xcc\x3b\xa5\x6c\xfb\xc6\x4e\xb0\x3e\xdb\x3e\xf3\xb2\xb1\xf3\x0a\xc6\xec\x79\xc3\x2e\x2c\x60\xf0\xe4\x5c\x73\x79\x17\x66\x9c\xf3\x47\x86\xa0\xde\xf2\x76\x6b\x6d\x5a\x3e\x16\xf2\x43\x7e\x61\x20\x9f\x6d\x3f\xbc\xda\x5a\x9f\xc0\x2f\x00\x37\xe4\xc2\x52\xb8\x95\x91\x6c\x70\xf6\x59\xb0\x7e\x2d\xd8\x7e\x94\x71\x2b\xfd\xf9\xb2\xf3\xb7\xbc\x4f\x8b\xf2\xf2\x6c\xf3\xcd\x95\xcc\xa0\x53\xa9\xb8\x95\x6c\x7b\xe6\x4e\x70\x66\x26\x03\xf3\xcd\x61\xd5\x6c\x38\xbf\x19\x2c\xdf\x8a\xaa\x62\xc1\xa0\xd3\x5f\xc1\x25\x6b\x8f\xbe\x6e\x3e\xd8\x09\xee\xcd\xb7\xcf\xac\x06\xb5\x89\xa8\x98\x5a\x82\x9a\x46\x63\x7d\x6e\xe5\xa4\x34\xd6\x5c\x9d\x0c\x76\x67\x00\x3a\xa8\x9f\x0b\xaf\x3c\xa1\x62\x18\x91\x2a\x95\xe1\xe4\xcb\xb0\x0b\xf4\xbd\xb9\x71\xa7\x39\x7b\x4e\xbe\xe7\x8b\x83\xb0\x94\x43\xf9\xb2\x5d\x92\x02\xd8\x45\xdc\xb8\x7c\xa1\xe0\x56\xcb\x7e\xce\xb3\x7d\xdf\x29\xf7\xc3\x5a\x6f\x3d\x6f\x2d\x2c\xb5\x56\xd7\x83\x0d\xd8\x05\xf5\x55\x7e\x8f\xb8\x55\xbd\x83\xd9\xa0\x36\xd9\xd8\xde\x6e\x3d\x1f\x0f\xe7\x17\xb8\x44\x83\xf3\xb6\x48\x25\xe8\xc3\x77\x4e\x39\xbe\x63\x7b\xd9\xf0\xc5\x4e\x30\x39\x97\x19\xaa\x96\x4a\xb0\x50\x7f\xad\xda\x9e\x0f\x5d\xce\xd6\x1b\x7b\x2f\x5b\x8f\x26\xc3\xa7\xa7\x33\x8e\xe7\xc1\xd7\x6c\x30\x37\xd3\xbe\x33\x95\x81\xbd\x29\x17\x60\xcc\xc1\xcc\x7c\xf8\xaa\x9e\xc9\x7c\xef\x94\x3d\x3f\x5f\x2a\x9d\xc8\xc8\x1f\xd9\x60\x63\xa2\x75\xf7\xa6\x42\x4b\xc7\x2f\xd1\xe9\x09\x1f\xdf\xe1\x82\x70\xfd\x7e\xfb\xe1\x52\xa6\xe8\x16\x4e\x02\xf2\xe1\x51\x01\x74\x0f\x56\x4e\x87\xb7\x16\xc3\xd3\xab\xe1\xfa\xdd\x60\x71\xb5\xb1\xf7\x16\x06\x6c\x7d\x46\x30\x56\xb0\xf1\x26\x58\x58\x6d\x8f\x4e\xb6\xee\x4c\xc1\x61\xed\xf7\x7e\xda\x9d\x82\xb1\xc1\xe1\x0c\xde\x8e\x05\x63\xf5\xc6\xce\x95\xe6\x8b\xcd\xf6\xfc\xd3\xd6\x46\xcd\xfa\x38\x6f\xf9\xf9\x4a\xbf\xed\x67\x0f\xe5\x7a\xe1\x10\x9c\x3c\x64\x0d\x54\xec\xbe\xec\xa1\xc3\xde\xa1\x4f\x82\x8d\x6b\xe1\xfc\x9b\x70\x7e\x3c\x5c\xbb\xf2\xf1\x87\xf9\x4f\xac\x60\x7f\x2a\x38\x37\x1d\x6c\x4e\xc3\x71\xe2\x11\xb7\x6b\xcf\xa0\x9b\xe0\xce\xa3\xe0\xc9\xa3\x7f\xd6\x4e\x67\x70\x4d\xe0\x04\xe6\x8a\xbd\x4c\x33\xb0\x7f\xab\xb5\x32\x0a\x2b\xc3\xf3\xb1\xbe\x1a\x39\xf6\xbf\xbe\xfc\x67\x6d\xf4\x1b\xd7\xf3\xfb\x2b\x36\xff\x80\xff\x43\xad\xdf\x5a\x61\x7d\xde\x3a\xee\x7c\xf6\x7b\x6c\x0a\x9a\xe0\xe5\x08\xe7\xb6\xc2\xcb\xd7\x01\x71\x60\x3f\x9a\x7b\x1b\x54\x80\x67\x80\x77\x0e\xbe\xb7\xef\xdc\x0a\x6e\x4d\x02\xe5\xf1\xfc\x6c\x63\x6b\x27\x84\xf5\xc2\x03\x26\xa8\xd0\x71\x86\xa0\x3e\x9d\x3d\x5d\x5f\x8e\x1f\x7c\x4f\xae\xaf\xac\x2c\x8d\x99\x97\x51\xbe\xfc\xe9\xeb\xaf\xff\xfc\xd9\xef\xad\x60\x77\x2e\xbc\x7c\xa1\xb1\x73\x1f\x0e\xbe\x55\xf5\xfb\xfe\xff\x5c\xbf\x5d\xb6\x2b\xf9\x52\xae\xe0\x58\xc1\xfa\xd5\xe6\xe3\x95\xf6\x8d\x73\x38\x1b\xcf\x2b\x01\xb9\x28\xda\xd9\x63\xc7\xbe\xb4\xc2\xd5\x3b\x70\x14\x60\x60\xfe\x40\x34\x3b\x58\x67\x38\xf1\xad\xd7\x4f\x82\xfd\x8b\x19\xef\xaf\x25\x5c\x46\x19\x4f\x72\x79\x2c\x3d\x74\xd8\x99\xf0\x4e\x9d\x2b\x41\x37\x1f\xf7\x56\x3e\x69\xec\x2d\x36\x4f\x6f\xc3\x98\x98\x22\x07\x4b\xaf\x61\x87\xc2\x85\xd3\xe6\xf8\x9b\x2f\xe7\x60\x17\x75\xb5\x8c\x5d\xa9\xe4\x80\x22\xfa\x23\xb8\x71\x34\xac\x8e\x2e\x81\xda\x47\x1b\x41\x15\x1b\x5b\xd3\xad\x33\x7b\xd0\x57\xf3\xe1\xb6\x6a\xc4\x29\x9f\xca\x97\x9c\x22\xec\x9c\x5a\x65\xaa\xac\x6b\xf2\x52\x43\xcd\x60\x6c\xb4\xb5\xfa\x34\x98\x1a\x0b\x66\x1f\xf1\x42\x59\x87\x7a\x0e\x51\x77\x87\x8e\x1c\xb2\xb0\xbd\xb2\x9b\xe3\x63\x8f\xa4\xb6\xe8\x78\xf9\x5e\x20\xbb\x4c\xf2\x2b\x4c\xc3\x70\x87\x68\x10\xc1\xbd\xdb\x70\x0e\xc2\xc5\x35\x26\xd6\x4c\x21\x82\xcb\x77\xf8\x1c\xe3\xd0\xcf\x8c\x85\xcf\x47\x1b\x5b\x93\x4d\xc0\xc5\xf5\x65\xbe\x2f\xe2\x33\x57\x24\x46\x90\x45\xb7\xc1\x58\x93\x9c\x6c\x46\x6d\xb4\xe0\xe8\xf8\x04\xf4\x85\x37\xe4\xe2\x63\x41\x53\xbc\x37\x69\x05\xa4\x8c\x91\x4c\x7d\x55\x5b\x0b\x2d\xc2\x2c\x60\x84\x4c\xe8\x80\x4e\x00\x59\x6a\x2f\xbd\x6d\x6c\x6f\xb4\x6a\x53\xc1\x4c\x3d\x18\x9d\x08\xee\x3d\x00\x00\x69\x00\xc9\x33\x6f\x91\xa6\xce\x38\xbf\xdb\x6f\x9a\x37\x36\xe0\x86\x89\xca\x55\x0f\xe1\x44\x2d\x5c\x9c\x80\x2b\xba\x3d\x7a\xbb\xf9\xe8\x89\xae\x15\x6c\x8e\x87\x8b\x67\xe4\xe7\xe2\x6a\xbb\xb6\x00\x3d\x73\x23\x8d\x37\x93\xb0\x54\x74\x9e\xab\x70\xdf\xd2\x59\x22\x34\x62\xec\x69\xd5\xc6\x74\x81\xea\xa5\xf5\xf0\x99\xdc\x65\x6f\xc7\xda\xb7\xeb\xc1\xd8\x6b\xe8\x14\x70\x4c\x77\xa7\x47\x18\x5c\x9a\xe2\xc6\x88\x38\x11\x5e\x5d\x9e\x06\xa4\x0d\x1f\x9f\x6f\x2f\xcc\xd2\xc9\x77\xe1\x22\x2c\x43\x97\x4b\x30\x67\xf9\x65\xf4\xc3\xeb\x1b\xec\x3d\x85\x65\xb2\x8e\x1d\xfb\xc2\x6a\xdd\x1b\x6f\xdd\xdd\x0b\x16\x37\x83\x9b\x35\x3e\x6b\x03\xb9\x21\xb7\xe2\x67\xb1\x30\x58\xba\xad\x3f\xe8\x25\xa1\x15\xa7\xba\x7c\x48\x4c\x3a\x1a\xae\xdf\x83\x3a\x40\x38\xf0\xc0\x4c\xde\x07\xe2\x05\x38\x03\xdf\xa9\xb1\xf3\x4b\x80\x05\x78\x8c\xde\xde\x0c\xa7\x46\xc3\xc7\x67\x1b\x7b\xd3\x80\x11\xcd\x85\x3d\xec\x78\xc0\xf7\x87\xb8\xe7\x2f\x8e\x1f\xff\xc6\xc2\xd5\x9e\xb9\x8b\x24\x48\x17\xe8\x11\x10\x4e\x34\x6f\xdc\x6d\x8d\xee\xe1\xe6\x6b\x48\xc4\x8f\x6a\xa5\xa4\x00\xe8\xce\x04\x76\x06\x66\xa6\x8a\xba\xad\x04\x76\xf9\x21\xfe\xef\x58\x6c\x41\x60\xb9\x1b\x5b\xb5\xc6\xf6\x0d\xe0\x28\x9a\x1b\x70\xf4\xd6\xa1\xbf\x76\xed\x6e\xf3\x25\xad\x75\xc9\xed\xcf\x55\x5c\xd7\x67\x94\x0a\xaf\xde\x6f\xad\x4d\x09\x0d\x8a\x15\x69\xd2\xf8\xe4\x11\x30\x66\x0c\x07\xc4\x47\x90\x2e\xe3\x0e\xe1\x81\xd4\xc7\x21\x98\x79\xd2\x1e\xdd\x92\x83\x40\x6c\x8d\x14\x98\xcc\x0d\x2f\xbd\xba\xa9\x07\x61\x85\x88\x82\x1f\xfb\x0a\x96\x4e\xc8\x38\x7d\xed\xab\xb8\x83\xd0\xef\x59\xa4\x8e\x80\x79\xfa\x9b\x1a\x12\xb7\xd6\xd8\x3f\x87\xdc\x28\xcd\x19\x76\xae\x3d\xfa\x32\xd8\x5f\xb3\xbe\xfd\xfc\xa8\xf5\xff\xfc\xf6\x37\xbf\x01\x92\xbb\x10\x8c\x23\x25\x86\xa1\x21\x6d\xbc\xf6\x04\x56\x05\x10\x3e\x98\xdf\x68\xbe\xb8\x82\x4b\x42\xcb\xc3\xf5\x81\x0a\x09\x9d\x3f\x84\x67\xf5\x90\xf5\x31\xcd\xe1\x7f\xd8\x3f\xe6\x81\x6d\xb4\x7b\x0a\xee\xe0\x27\x84\xb8\xb7\x77\x61\x7b\x70\x19\xb1\x18\x0e\x03\x1f\x15\x35\x54\xeb\x0f\x47\xf0\xbb\x2a\x8c\x48\xcb\xc2\x6e\xbb\x36\x2a\x1d\x2a\xbe\x8e\x39\xd9\x5c\xc1\x2d\xf7\x39\x15\x98\xef\xdc\x12\x9e\x34\xa2\x53\x0c\xc9\x2c\x1f\x35\x96\x2b\xbb\xbe\xd3\x37\x22\x40\x3c\xff\x76\xed\x7a\x73\xe9\x7e\x38\x33\xdb\x3e\x77\x09\xf8\x9e\x0a\x30\xbf\x39\xfc\xc7\x29\xd8\xb2\xf6\x8d\xdd\x6d\x5c\xf2\x85\x55\x3c\x81\x63\xaf\x1a\x3b\xf3\x7a\x07\x70\x9b\xdc\xbe\xbe\x92\x53\xb6\xf9\x96\x0a\xe6\x2e\x63\xcb\x37\x96\x9b\xaf\xaf\xcb\x6d\x65\x96\x03\x2e\x0f\x01\x1b\x8e\x64\xe3\xcc\x6a\x73\xef\x19\x83\x00\xcd\x68\xbc\x59\xe2\xd3\x12\xec\xdf\xb2\x8e\x7e\xf6\xb5\xd5\x9c\x7e\x86\xbc\x0f\xdd\x6d\xb0\x2d\x4c\x8c\x50\x72\x80\x1b\x6c\x7b\x16\x68\x10\x00\x02\xcd\x84\x75\xd7\xc3\xe3\x2a\x44\x08\x84\xe8\x03\xdf\x79\x2a\x0f\x7c\x4a\x96\xdb\xb6\xfe\x28\xbf\x95\xd0\x91\x84\x93\xe1\x25\xa1\x61\xde\x88\x22\x1b\xd7\x9b\xfb\x0f\xa1\x73\x18\x4e\x70\x66\x4c\x2e\xc4\x2b\x4f\x85\x8f\xdf\x3a\x1f\x9c\x7e\x0e\x08\xd0\xde\xb9\x06\xcb\x8d\x88\x71\x7b\x1d\xb8\x59\x1c\x4e\x9f\x5d\xb4\x91\x03\x2e\xe6\xa4\x9b\x92\xeb\x9e\x84\x7e\xfe\x50\xc6\xde\xad\xcf\x55\xb1\xf5\x29\x15\x7b\xd6\x97\x54\xde\xad\x9e\x8c\x52\x6a\x6b\x20\x2b\x2f\xb5\x19\xca\xf2\x5d\x0b\xd0\xca\x28\x77\x87\xec\xb2\xe5\x01\xbf\x5a\xb0\x2d\xd9\x61\xab\x37\xef\x61\x49\xd9\x2a\x39\xbd\x32\xdd\x9e\x4c\xea\x9d\xc9\x17\xa0\x30\xb8\xe3\x6b\x70\xd0\x44\x78\x4a\x83\x8e\x16\x32\xb5\x0e\x93\x43\x5c\xc7\x99\x35\xdc\x56\x7d\x65\xf2\x19\x7b\xbd\x13\x9c\xbf\xcd\x4c\x18\x5d\xb5\x34\xd1\x9c\x92\x56\x04\x79\x95\xcc\x22\x5b\x19\x07\x92\xfe\x85\x81\x5c\x5c\x55\x7c\x39\x76\x0e\x2c\x4d\x6b\x77\x0b\x88\x51\x24\xf6\x10\xf7\x09\x22\x92\x48\x91\xb9\x53\x0e\xca\x6f\x84\xca\x2c\x7f\xb5\x56\xd7\x90\x31\x5f\x98\x05\x61\x34\x15\x5a\x21\x36\xcd\x27\x12\xdb\xae\x8b\xe4\x16\x4e\x08\xb7\x21\x0d\x11\x0f\x8c\xf3\x9f\x5d\x09\x26\xc6\x11\x9b\x67\xd6\x90\x4d\x58\x9c\x0c\xea\x9b\x5c\x17\x50\x49\x4e\x31\x01\xe3\x42\x30\xa7\x21\xc2\x86\xc8\xd6\x71\xbe\x85\x17\xad\xb1\xb5\x02\x6c\x07\x90\x2a\xbe\x53\x61\x14\xd8\xd5\x8d\xdb\xc0\x33\x58\x7f\xfa\x2c\xfb\x91\xa5\xc7\x05\x3d\x23\x66\x4f\xce\xe1\xd9\xd9\xbf\xaa\xdb\x89\xee\x54\xee\x93\x09\x41\xa2\x1b\xc5\xaf\x10\x04\x4b\xa5\x71\xfe\x09\x6f\xe1\x83\xb9\xa3\x8c\x90\x2d\x03\xc0\x14\x50\xb9\x32\x8b\xb7\xba\x26\x53\x35\x25\x07\xe5\xfa\x5d\x94\xbb\x40\x4e\x99\x7e\xce\x92\x02\xc8\xe8\x9e\x9f\xeb\x77\xfc\x5c\x1f\xd2\x4f\x68\xf2\xec\x9d\xf0\xf9\x5c\x0b\xb8\x89\xfa\x7d\xeb\x03\x28\xf8\xc0\x0a\x2e\xee\x35\x76\xee\xfd\xb4\x7b\xfd\xf0\x29\x61\x99\x7f\x8b\xb4\x11\xcf\x99\x53\x42\x44\xc2\xab\x1e\x68\x8e\x1c\x72\x58\xae\x85\x5d\xe0\x3c\x58\x21\x80\x6b\x7b\xe5\x09\x5c\xe3\x96\x30\xbb\x22\x28\x01\xe5\x3a\xec\xc1\x0d\x34\xd9\xda\x9d\x10\x11\xe8\xc1\x24\xee\xce\x44\x1d\x21\x6a\x53\xbc\x29\x56\xbf\xdb\x5b\x75\x4a\x45\x8b\x5b\xc3\x45\x56\xdc\x2f\xf0\xbe\xb2\xbb\x49\xe1\x05\xab\xae\xdf\x85\xc5\xe1\x31\xab\x0a\x06\x53\x47\x02\xb5\x66\x96\x52\x6b\x69\xde\x0b\xa7\x3a\x98\x87\x83\x22\xec\x59\xf3\xf9\x4e\xf3\xa5\x10\xb2\xf6\xcd\x5b\xcd\xb9\x57\xc1\xc4\x34\xff\xc4\x9a\x9e\x75\xe4\x13\x98\x5a\xc6\xcb\x9f\xb2\xf9\xa2\xe9\x57\x6b\xcb\xec\x46\x7b\x6c\x1a\x7b\x7b\x7b\x13\x59\xb6\x7b\x4f\xc3\xb9\xab\xf1\x61\xc6\x10\x37\x86\x46\x2c\x2d\xa7\x4d\x90\x77\xd7\xab\x16\x0a\xb6\xe7\xe1\x76\x04\xf7\x81\x62\x8c\x86\xf5\x8b\x41\xed\x62\xb0\x5f\x6f\x3f\xba\xd6\xaa\xd7\xe1\x3b\x30\x0c\xe1\xe5\x71\xb9\x77\x45\x6e\x6d\xde\xbf\xa9\xa5\xb0\xf0\xec\x44\xf0\xf6\x11\x7c\x6c\xec\x40\xfb\xbb\x78\x6f\xac\xdf\x03\x9c\xb0\x7e\xff\xdd\x1f\xa1\x41\x3d\xc8\x34\x8e\x46\xaf\x27\xe2\xd0\x5c\xfd\x3f\x2c\x18\x5a\xe6\x7b\x54\x55\x9d\xc8\x54\x99\x1d\x77\x4b\x45\x64\xc7\x15\xc2\xe3\x0d\xc0\x08\xaa\x50\x5a\x81\x08\x4e\x7b\xc3\x0e\x2c\x7c\x4e\xab\xb8\x70\x41\x7d\xfb\x47\x3f\x1b\xd4\xc7\xc3\x99\x1b\xa6\xc2\x4b\xb4\x3e\x83\x23\xb4\xcf\xb0\x08\xf5\x8b\xc8\xcf\xb3\xea\xc4\x1b\x70\x87\x49\x91\x24\x85\xc7\xe0\xb7\x85\xbf\x2d\xad\xc3\x71\x6c\x0f\xd5\x4f\x05\xb7\x04\x38\xed\x22\x65\x3e\xa5\xa0\x83\x99\x33\xad\xfa\x78\x30\x7d\x05\xa5\x3e\xdd\x26\xf4\xe4\x56\xfa\x55\x47\x4a\xb5\x32\x22\x2a\x1a\xf5\x5d\xd4\x34\x44\xf6\x48\x6b\xc7\x44\x0d\x31\x44\xb4\x18\x3d\xb0\xdb\xa4\x18\x91\xce\x9e\x3e\x0e\xe7\x77\x23\x4e\x9f\x3a\x83\x86\x60\x29\x45\xa5\x77\x22\x23\x33\x24\xcd\x9e\x8c\x06\x51\x55\xa9\x54\x80\x33\xc9\x57\x00\x5f\xc3\xd9\x45\x54\xfd\x65\xbe\xcf\x57\xfd\x81\x13\x86\xba\x2d\x27\x0a\x1d\xa1\x88\x8c\x5a\x11\x7b\x34\x60\x0f\x21\x2b\x35\xe8\xf5\x93\x52\xed\xd5\x65\xa6\xad\x3f\xed\x2e\x31\xe9\x60\x9a\x8b\xe8\xe0\xb9\x05\x27\x5f\xca\xbd\x7f\xcd\x57\xa3\xc0\x19\x60\xcd\xf8\x45\xc8\x2a\x3f\x90\x10\xb3\x20\xcd\xa0\x14\xf8\xf2\x35\x52\x01\xe3\xfe\x83\xe6\x5a\xcb\x8f\xda\x57\x17\xdb\xf3\x13\x40\x05\x80\x84\xb4\x46\x9f\xe0\x51\x24\x2d\xa4\x3e\x25\x26\x43\xa3\x9b\x26\x92\xd8\xd9\xb0\xc9\xf1\xa5\x76\x02\x2b\x32\x68\x0f\xf6\x62\x0b\xb8\x6f\xd7\x1a\x7b\x33\x3c\xf5\x4c\x1f\xec\x3c\x21\xbf\x52\x7a\xbc\xbd\x06\xe5\x82\xb4\x58\x68\x77\x29\x84\x95\x50\xfa\x55\x20\x2c\xc3\xd9\xf6\xe9\xb3\xe1\xb3\x4b\xbc\x01\x50\xd6\x5e\x01\x82\x79\x3e\x12\x9c\x85\xe2\x33\x9b\x40\x4c\xa9\x67\x97\x7d\xb5\x56\xc8\x5c\x6f\x8e\x86\xf3\x9b\x88\x7f\x34\x0d\xe6\x52\x65\xe9\x97\x1f\x31\x0f\xdc\x1a\x7f\x6e\x7d\xdc\xfb\xc9\x61\xef\xe3\x0f\x7b\x3f\x61\xf2\x1b\xae\x2d\x87\xc0\xc7\x92\x84\x16\x5e\x01\x2e\xf5\x15\x49\x2d\x2b\x70\xfb\x5b\x87\x8b\x56\xb0\x39\x03\x17\x7f\x30\xf6\x20\xd8\x98\x0a\xeb\xb3\xdc\xb6\x30\x04\x24\x46\xd2\x65\x57\xa0\x23\x42\xa8\xab\xf0\x29\x7c\x5b\x0b\x5f\xec\x70\xbb\x82\x55\x30\xd6\x01\xa7\x17\x2e\x18\x20\x19\x20\x6f\x7e\x89\xff\xb7\xbe\x91\x8f\x76\x31\x51\xce\x17\xf5\x7f\x42\x9b\x96\xb4\x69\x39\x9e\x35\xa4\xc1\x91\x51\x23\xc0\x5f\x5b\x80\x69\xc0\x8f\x59\x48\x11\x60\x28\x16\xea\xa4\x2d\xa2\x9d\x3d\xb0\x6f\xb4\x4c\x25\x67\xd0\xf1\xd3\x10\x0b\x06\xc8\x8a\x44\x5e\x20\x1e\xb5\x70\xf8\xa3\x17\xe0\xf8\xb5\x6f\xef\x34\xdf\x8c\xf2\x5a\x35\xd7\x27\x82\xfd\x31\xeb\xb7\x56\x50\x3f\xd7\x9e\xbd\xc6\xea\xb9\xd6\xc3\x15\xc4\xe2\x81\xbc\x97\xab\x96\x65\x97\x80\xf5\x24\x4c\x83\x2b\x40\x51\x60\xec\x09\x78\x1c\xde\x28\xbd\x1b\xbf\x8c\xb6\xe3\x57\x56\x63\xef\x5c\xb8\xb8\x86\x9b\x45\xab\xcc\x42\x12\x0c\x04\xa5\x28\xad\x81\x5c\x5c\x83\x5d\x02\x6e\xc7\x1c\x29\xb6\x0e\xf4\x73\xb1\x06\x8c\x5b\x7b\x7c\x1a\xd1\x80\x3a\x90\x0b\x76\x7e\x23\xbc\x7c\x1e\xee\x57\xb8\x59\x71\x93\xa7\x26\xda\xf5\x39\xc6\x69\x58\x1b\x19\x29\x03\x01\x85\x6f\x2d\xcc\x99\x4d\x98\xc8\x24\x92\x25\x5d\xf8\x1e\x9d\x77\x9f\x2e\x7c\x66\x0b\x93\x32\x1d\xcd\x04\x0e\x10\x1c\x4e\x18\x6e\x63\x67\xa7\xb1\x37\xc7\x0c\x10\x91\x0b\xec\x19\x07\xe0\x77\xf6\xff\xd3\x6e\x9d\x87\xf0\xd3\xee\x84\x6c\x0b\xa3\x11\x9d\x1b\x28\x82\x7b\x4f\x46\xc4\x2d\xe8\xf3\xc5\x65\x72\xf8\xd4\x05\x55\x20\x01\x2b\xbe\xe7\xfa\x98\xc8\xe5\xf6\xfa\x19\xee\xf6\xe2\x12\x2c\x23\xfc\x4d\x77\x71\x5d\x2d\x51\xd4\xbe\x16\xca\xe3\x8b\x15\x75\xa9\x01\x7d\xd7\xcd\xc1\x4d\x53\xf1\xe5\xfa\x6a\xcf\xbd\x0e\xb6\x57\x44\x79\xb6\x79\x11\xed\x3a\xff\x2f\xec\xf7\x34\x2e\x45\x19\x0e\x74\xc9\x2d\x00\xf1\x54\x67\xe7\x6b\xb7\x7c\x84\xbe\x28\xcc\xf7\xac\x42\xbe\x0c\xeb\x6e\x01\x8f\x5e\xee\xb7\x2d\xd5\x8f\x67\xf9\x03\x15\xb7\xda\x3f\x40\x17\x78\x0f\xd0\x77\x5c\xcc\x13\x7c\x20\x91\xc2\xab\x16\x11\xc7\x3b\x0f\xa4\x06\x63\x56\x11\x80\x98\xb7\x67\x20\x73\x37\x0f\x5c\x68\x4d\x5d\x15\xd7\x21\xf4\xa1\x3e\x0b\xb4\x14\xd7\x7b\xfd\x4e\xeb\xed\x05\xe6\x2a\x22\x60\x91\xa9\x63\x85\x30\x7e\xb7\x98\x87\x09\x8c\xd8\x9e\xb0\xb4\x4c\x65\x60\x91\x44\xa7\x2f\xbf\x01\x0e\x6b\xcb\x26\xbe\xdd\x08\xaf\xbc\x81\xda\x40\x6f\x07\x4f\x64\xbe\x83\x0b\xf0\xeb\x98\xb5\x27\xf3\x2d\x5c\x93\xf4\x29\x52\xc7\xb1\x7a\xef\x0f\x6c\x03\x32\xa7\xfa\x4d\x42\x7f\xfd\xad\xdd\x69\x02\x3a\x76\xec\x8b\xe3\xc4\xdb\x93\x96\xea\xc9\xb9\xf6\xc5\x4d\x69\xf0\x0b\xdf\x1f\xf2\xbe\xab\x94\xb2\xac\x1a\xfa\xee\xdb\x2f\x2d\xdd\xee\x48\xc9\xcd\x17\xb1\x2c\xbc\xb0\x0a\x58\x2d\xdf\x8f\xdb\xf9\x41\x1e\xdb\xe2\xb5\xf6\xf5\xf3\xd2\xce\xa7\x70\x51\xd3\x57\xa4\xb7\x40\x77\xe4\x2b\x52\xb5\x3f\xa4\x32\xf6\x99\xaf\xed\xe1\xdf\x57\xf2\xe5\x02\x57\x83\x5f\x56\x2f\xfd\xb4\x90\xe1\xca\x1c\x75\x07\x81\x04\x1e\xab\x0e\x0e\xe6\x2b\x23\x59\xfe\x65\x79\xfc\x53\x0a\xbf\x82\xbd\x43\x9b\x9c\x14\x0e\xf2\x4f\x29\x3c\x3a\xe0\x82\xe0\xab\xca\x0a\xf4\x2b\x73\xbc\x62\xdb\xd4\xdb\xe7\xc0\xd5\x5a\xc8\x00\x02\x34\xb0\x65\x80\x71\xf2\x6f\x46\x8b\x7d\x36\x99\xab\x92\x7a\xdd\x7c\x69\x08\xc4\x4e\xe4\xea\x04\x40\x64\xaf\xd3\xdb\xad\xc9\xa7\xe1\xfc\x78\xb0\x7e\x35\x7c\x32\xfd\xcf\xda\x68\xfb\xda\xdb\x70\x72\xa2\xb1\xfb\x04\x38\x7c\xfc\x58\x9f\x0f\x1f\x3e\x6a\xbe\x06\x0e\xa2\x7e\x24\x07\x84\x22\xd1\x58\x11\x88\xd4\xcf\x6a\x10\xbe\xc4\x1b\x24\x9d\xc4\x2d\xd2\x6f\x3a\x7f\x53\xc3\xe7\x73\xac\x9b\x04\xde\x8d\xb4\x51\xc8\xa5\x27\x81\xc2\x45\xa0\xf4\x33\x0c\x64\xa1\xe6\x8b\xb4\xee\xac\xbc\xfa\x31\x1d\xfc\xde\x83\x34\x70\xa6\xba\x7a\xf9\xb4\x2a\x0d\x6e\x13\xa0\x52\x89\x83\x8a\x15\x50\x69\x79\x00\x38\xe2\x24\x4b\x4f\x85\x52\xb5\x68\xc7\x96\x49\x19\x08\x66\xb9\xfb\xc6\xd6\x33\xeb\x83\xc3\xde\x07\xd4\x6a\xf9\x24\xb0\x29\x65\x01\x07\xf2\xde\x5c\xba\xdf\x9e\x7a\xd2\x5a\x43\x79\x50\xd9\x44\x41\xae\x2f\xb8\x95\x8a\x5d\xf0\xb3\x86\xa6\x61\x2d\x98\x7a\x03\xb2\x0e\xb6\xa2\x29\xa4\x21\x4b\xd1\x91\x02\xb6\xda\x3c\x61\xb1\x4a\xda\x7e\x9b\xeb\xb5\x6d\x90\xaa\xf3\x27\xed\x72\x74\xb8\x35\x8f\xd3\xd8\xbb\x02\x1f\x99\x6c\x83\x7c\x97\xac\xc0\xec\x31\x1f\xa4\x94\x3a\xc0\xaa\x75\x54\x11\x23\x41\xb7\x2a\x3e\x9c\xdc\xce\x6e\x8c\x53\x9c\x52\x87\x77\x93\xe0\x61\x56\xc5\x18\xe9\x31\xc0\xdf\x0a\xb8\x9e\xb9\x5e\xb8\x68\x85\x4d\xe1\x49\x5b\x4d\x58\x1a\x64\xfd\x0f\x90\xd9\x0a\x19\xc5\x0d\xa9\x97\x4d\x71\x06\xdf\xa7\x6f\x6f\x73\x7d\x00\x6b\x0e\x68\x08\xd0\x00\x09\x78\xd7\x96\xe0\xea\x66\xc5\x63\xab\x36\x16\x0d\xf2\xda\x93\x60\x76\xe5\x80\x56\xf5\xe5\x92\x3e\x3a\x46\x8b\x44\x23\x5a\x2c\xb7\x7f\x84\x5b\x25\x0b\x4b\xc7\xf7\x83\xd6\xd4\xa0\xe9\x8b\xec\x2d\x78\xd3\x96\xf2\x9e\x8f\x92\x1a\x4f\x00\xa1\x9b\x0f\x76\xda\x0b\xf7\xc4\x6c\x75\x7a\x1b\x0f\xe1\x3e\xe9\xef\xf7\xa6\x4d\x41\x02\x47\x44\xda\x35\x2e\x12\x3e\x5b\xcb\xe3\xe7\xa6\xd9\x2e\xcb\xad\xe1\xbd\x77\xf9\x0e\x8f\x03\x7b\xd5\x8c\x08\x9a\x45\x4e\xda\x23\x59\x90\xc2\xc3\xf3\x4f\xc3\xf5\x09\xe2\xdb\x50\x2e\x67\x55\x8b\xbe\x7c\xf5\xa4\xad\xe8\x7a\x21\x85\x02\x0a\xcf\x28\xcf\x9c\xb2\x2b\x70\xfb\xe9\x06\xd9\xb0\xf3\x3e\x6d\x4c\x21\x8f\xc9\xaa\x80\xd1\xf1\xd6\xea\x7a\xfb\xf4\x5d\xdc\x6a\x45\x1a\x34\x18\x4e\x18\xda\x18\x5f\xc3\x59\x2d\x6f\xa3\x8a\x62\xec\x15\x83\x85\xb5\x07\x38\x2b\x14\x24\xb5\x36\xe3\x42\x1d\x35\x5f\xd4\xb5\xa9\xc7\xc8\x78\xbe\x53\x2a\xe1\x6a\x8b\x97\x83\xc1\x7c\x34\x76\xa6\x9b\x67\x5f\x61\xe7\x4b\xb3\x8d\xed\x1b\x5a\xb8\x0d\x2f\x8f\x32\xe2\x30\xa3\xa6\xcc\x5b\xf5\xd6\xde\x04\x2c\x2f\x62\x7a\x7d\x0d\x16\x39\xd8\x38\x03\x93\x10\xfd\x20\x29\x63\xe4\x3b\x35\x1e\x2d\x3e\x8f\x00\x99\x73\xf2\x7d\x88\x0f\xa0\x55\x3f\xaf\x07\xc0\x47\x1d\x07\x40\xdb\x97\xe8\xbd\x7d\x63\xb9\x3d\x3f\xa9\x7b\x67\x60\x45\x35\x12\xb3\x44\x81\x9d\xca\xff\x2f\x4d\x91\x1b\x37\xf0\x8b\x3d\x0a\x72\x7c\xdb\x1b\xa7\xa1\x79\x63\x03\xcd\x30\xe4\xfe\xa1\xcf\x01\x70\x49\x78\x68\x4e\x64\x98\x95\x14\x15\x79\xf6\x28\x33\x96\x23\x24\x6e\xd1\xa7\xcc\x7f\xb9\x70\xad\xb9\x40\xd0\xce\xdf\x46\x13\xd4\xfc\x6e\xc6\xd4\x90\x28\x72\x5a\xbf\xda\xba\xb3\xaa\x5c\x36\x00\xb7\xc7\x1e\xe3\x42\xb1\xdb\x46\x9f\x5b\x2a\xb9\xc3\xa8\x8d\x40\x39\x60\x75\x87\xcc\x49\xd0\x34\x9c\x7a\x54\x0a\xb4\x36\xae\x83\x68\x24\x50\xa8\xe1\x62\xa8\xc6\xd6\xba\x7c\xc3\x0f\xe1\xf3\x55\xc0\x7a\xf9\xcd\x2c\xa0\x7c\x45\xe9\x7a\xb0\x87\x88\x23\x72\xa7\x95\x53\xa8\xb3\x54\xd4\x86\xae\x2d\x0b\xd6\x1e\xa9\xe9\xdb\x9b\xcd\xb9\x05\x58\x78\x32\x2a\xe8\x4a\xc0\xae\x00\x05\x2a\xb3\x3c\x43\x03\x35\xea\x6b\x93\x39\x37\x14\x33\x3e\x65\xbe\x57\x8e\x2b\x27\x32\x71\xe7\x16\xf6\x4a\x8a\x3c\x20\x98\x31\x55\x5a\x59\x5e\x69\x36\x56\x64\xe4\xec\x7a\xc2\xc7\x19\xa7\x54\x54\x29\xd9\xe6\xbd\xfd\xc6\xf6\x3d\x16\x99\x58\x5b\x82\x26\xc9\x92\x53\x20\x1d\x80\xaa\xc8\x67\x8f\xf5\x89\x19\xd2\x42\xc5\x1c\x79\x8a\x76\xc9\x06\x29\xcd\x3c\x1c\x99\xaa\xa3\x26\x6a\xfd\xe9\xb3\x4c\x66\xa8\xda\x0b\x8d\x46\x6e\x3a\xb4\x83\x6a\x26\xe2\x7d\x45\xb2\x78\xa7\x58\xc0\x36\x6d\x58\x62\xae\x84\xf4\x65\x6b\x05\xc9\x2a\xb4\x3e\xbf\x1b\x5e\xb8\x8f\xb2\x2a\x75\x8a\x0b\x48\x57\x02\x5b\xcc\x82\x4b\x53\x6c\x40\x8b\xf1\x04\xfa\xb2\x13\xbd\x4d\x31\xab\xb7\xa1\x7d\x53\xcc\x56\xec\x7c\xa2\x0d\xe3\xe1\x8d\x17\xb0\xc2\x8d\x9d\x79\xa4\xa2\xd7\xcf\xea\xef\xb0\x85\xb4\xdb\xe8\x38\xc4\x17\x95\xb2\x44\x09\x27\xad\x7c\xd7\x78\xe3\xc4\x83\x0d\x85\x2e\xf6\x74\x98\xa8\xc1\x59\xc1\x49\x4e\xd7\x32\xd5\xa1\x22\x0a\x49\x6a\x81\xb0\xcb\xf9\x4d\x59\xa0\x78\x99\xa9\x77\xa5\x1b\x35\x42\x0a\xae\xa5\x64\xa2\x51\x75\xfc\x3a\x3d\xd3\xd0\xb6\x80\x38\x4b\x22\x4d\x02\x4a\x69\x30\x80\xc4\xf0\xf9\x17\xa7\x02\xb2\x48\xa3\x52\x80\x6f\xdd\xfa\x38\x92\x15\xa6\x84\x8b\x13\x70\x5c\x48\xfb\x58\x87\xfd\x40\x35\x12\x60\x6e\x15\xfa\x7b\xb3\xdb\xdc\x9e\x12\x69\x2a\xe6\x35\x25\xdf\x32\x62\x35\x13\x1b\x5a\xef\x08\x0b\xea\x6c\x63\x13\x93\x9b\xd5\x3b\x62\x91\xc9\xb5\x9b\xa9\x2e\x69\xa3\x53\x26\x3a\x65\x76\xaa\x7a\xbe\x3b\xa8\x68\x50\x30\xb7\x04\x54\x43\x6f\x14\x1b\x02\x61\x09\x5c\xd7\x13\x5d\x25\xc3\xb1\xe6\x9a\x2f\x61\x01\x92\x6d\x10\x00\x5e\x6b\x2e\x52\x4e\x4c\x74\x0e\xa0\x43\x20\x3e\x65\x5f\xf7\xc8\x04\x95\xf4\xf6\xba\x25\x14\xd2\xa2\x89\x10\x75\xc8\x39\x83\x28\x18\xb1\xb1\x92\x18\x1c\xb4\xaf\x46\xdc\xf5\xee\xcb\x60\x71\xbe\x39\x31\x8e\x1b\x1b\x1b\x4a\x02\x21\xcc\x21\x25\x11\x42\xed\x75\x3a\xf1\x70\x4b\x06\x83\xc4\x03\x96\x12\x5c\x18\x5d\xc2\x8b\xa2\xe5\x72\x14\x5c\x73\x31\x00\x56\xac\x30\x73\x10\x03\x4e\xe3\x2f\x8d\x6e\x0c\x3b\xc3\x68\x72\xa4\x7a\x92\x02\x4a\xe3\xd6\x13\xc3\x99\xcf\xec\xe3\x69\x22\x2b\xa5\x18\x17\x8c\xae\x59\x91\x1a\x23\x04\xd2\xc1\xfb\x93\x01\xbc\x49\x89\x12\x00\x9b\xc2\xad\x12\xa1\x26\x66\xdb\x8b\x79\x41\x88\xd0\x2d\x8e\x8f\x02\x20\x2e\x8e\x9d\x60\xcc\xad\x1b\xd4\x0f\x6d\xb1\x2b\xa3\xed\xd3\x1b\x06\x0d\x3c\xc7\x14\xaf\xb1\x7d\xc1\x74\x0a\x60\xab\x3f\x5c\xe2\x91\x9e\x74\xa8\xe2\x90\xf4\xcd\x8d\xa8\x9f\x4a\xfb\xb2\xb1\xdf\xd8\xda\x96\x22\x41\x57\x2e\x61\x2c\xd5\x63\x81\x12\x24\x51\xfc\x55\x84\xff\x78\x99\xd8\x38\x09\x00\x48\x45\x27\xc5\x16\x46\x95\x9d\x03\x6e\x6c\x31\x85\x60\x3a\x05\xe3\x64\x26\x9b\x09\xc4\xef\x92\x4d\x6b\x84\xa6\xfd\x35\x07\x41\x5c\x61\xb1\x48\xf8\xc6\x03\x67\x9e\x59\x0e\x6a\xe7\xe2\x22\xb0\x09\x18\xf3\xc4\xd5\x85\xb9\x98\xe6\x1b\xb5\xb9\xa2\xed\x0e\xf6\xc7\x22\x45\xa9\xd9\x3a\x9a\x91\x51\x6b\x08\x04\x91\x6e\x6f\x51\x83\x2e\xae\x9a\xfa\xec\x54\xbd\x37\x5f\x60\xa6\xaa\xbb\x3d\x7a\xa1\xb9\x3a\xc9\x16\x5d\x35\x20\xbd\x04\x3c\x31\x03\x17\x64\xc2\xb4\x34\x84\x80\x82\x66\x07\x5c\xf6\xd8\x2c\x09\x05\xcb\xb7\x90\xd1\x12\x0e\x00\x35\x18\xb8\x87\x78\x60\xb6\x26\x91\x8d\x31\x69\xfa\x44\x8d\xf5\xaa\x1d\xdc\xbd\x56\x13\xc3\x02\xc0\xa1\x43\xe2\xbf\x30\xd5\xbc\xb2\x94\x60\xed\xc5\xec\xab\xb8\x4c\xe2\x93\x3d\xed\x72\xf4\xb1\xe7\x57\xdc\x72\xff\x27\xac\x4f\x0e\xde\x3c\x0a\xce\x3f\x0c\xae\x5e\xf8\xdd\xc7\x1f\x4a\x81\x85\xd2\xc1\xd2\xfd\xe6\xe2\x24\xdf\x2e\xe8\xd5\x1a\x79\xb1\x5a\x30\x88\xc6\xde\x1c\xf4\x0a\xeb\x60\x0c\x8f\x3c\x5a\x49\xff\x3c\x1e\x4c\xa3\xfe\x26\x51\x0d\x21\x89\x39\xdf\x6a\xad\x4c\xb2\x3b\xaf\xaa\xd2\x9c\xbf\xd8\xbe\x71\x37\xbc\x70\xa9\xf5\xe0\xae\xda\x0a\xc4\xb2\x68\xdd\x62\xec\x13\x2f\xb6\x21\x63\x03\x77\x12\x8c\x3d\x15\x35\x5d\x5c\xc6\xd6\xd0\x74\xbd\x12\xb4\x18\xaf\x6f\x6c\x05\xb3\x53\xcc\x2c\xe0\xb0\x3a\x9a\x88\xc4\x4a\x55\x3d\x1b\x53\x04\xe2\xd7\x82\x28\xc3\xa4\x00\xad\x28\x6f\xd4\x8e\x27\xd0\xc8\x98\x81\xf0\xae\x06\x2e\x91\x99\x8c\x49\x02\xcd\x99\x09\x82\x1a\x7a\x82\x24\x70\x4b\xc0\x90\x19\x6b\xd1\x85\x32\x18\xa0\xe8\x4c\x41\x9f\x3b\x79\x08\x4d\x21\xd8\x60\xa9\x9d\x1c\xe2\x74\xa2\xa3\x2b\x35\x3f\xa3\x0f\xee\x40\x4f\x09\x57\x02\x87\x4d\x5b\x88\x02\x06\x09\xe8\xbc\x09\x5b\xe7\xc3\xc7\x77\x78\x2b\x50\x6a\x41\xe7\x54\x25\x63\x84\xcf\x2e\x21\x23\x09\xe8\xf9\xf6\xa2\x48\x1a\xb4\x9e\x3e\xde\xbb\x34\x41\x98\x9a\x2c\xf9\xe2\xaa\xf5\xff\x59\xc1\xbd\x87\xb0\xf6\x7a\xcf\xe1\x4c\x67\x7c\xf7\x24\x60\x87\x51\x25\x5c\xbf\x47\xdf\xd0\xc7\x6a\xf4\x42\x70\x01\xc4\x90\x33\x5c\x2f\xbc\xb1\x6f\x62\x0c\xd6\xd6\xe7\x5a\x38\x75\xbe\x3e\xf8\x4c\x2a\xae\x9d\xac\xaf\x6c\x14\x7d\xbf\xa3\x6c\xf2\xfb\x07\x9f\x65\xae\x62\x9e\x65\x38\x18\xc8\xc8\x68\x9b\x6a\xb5\xdc\xeb\x94\x8b\x59\xf3\xb3\x7c\xd3\xdb\x62\x76\x67\xc2\x19\x1c\x89\xcc\x32\x4f\x15\x72\xb4\x3c\x4a\xed\x4c\x9c\x2d\xdf\x6c\x8d\x9d\x7b\xcd\x89\x29\x71\xd0\x15\xab\xb2\xc0\x12\x0d\x60\xfc\x16\x28\x2a\xf0\xf4\x8d\x0a\xf3\x6f\x5e\x59\xe6\x59\xf1\xf2\x13\xf7\x8b\xb7\xe9\xfe\x39\x3c\x61\x33\xf3\xa4\xdc\xf8\xf4\x9b\x3f\x79\x19\xdd\x30\x57\x07\xf1\x16\xdd\x2d\x4e\x6f\x87\xeb\xcb\xe4\xa6\x80\x16\x26\xee\xa6\x8d\x56\x96\x69\x53\xda\x67\x99\x1b\x29\xfb\xdc\x8b\x14\x17\x58\x6e\x96\x0e\x31\xb7\x20\x87\x58\x4f\xca\x9c\x50\x72\xc2\x82\x4b\xb8\xae\xb6\x3a\xce\xe6\xd2\xc8\x32\x18\x0c\x91\x28\x90\x79\xeb\xd8\x79\xb4\xbe\x29\x0e\x92\x1b\x13\xc1\x18\x8d\x7b\x71\x33\x9c\x7f\xa3\x3d\x90\x00\xa5\x65\x64\xe8\x2b\x75\xa6\x7d\x07\x30\x0d\xb8\x85\x1a\x9c\x12\x83\x3a\xf0\x30\x83\xfa\x6d\xd8\x4e\x19\xa6\xb9\x7b\x49\x52\x21\xc2\x0f\x39\xa8\x82\x74\x40\x30\xe9\x15\x4c\xc2\x01\x47\xc5\x80\x17\x11\x84\x49\x4a\x7d\x9c\x89\x45\xcc\x9d\xd6\xf0\x7f\xc5\x2d\x3f\xf3\x1c\x7d\x7c\x89\x6a\xe0\xb5\x12\x1b\x7a\x92\x5f\x36\xba\x79\xfd\xcc\x64\x39\xc4\xf0\xbf\x7a\x2d\xd8\xbf\x2a\x9c\x34\x5f\xe5\x46\xc7\x74\x03\x4b\xeb\xda\xcd\xc1\xe0\xf8\xe5\x90\x0a\x84\x32\x0e\xf3\x14\x19\x3f\x16\xcf\x84\x9b\x5b\x8d\x37\x63\xe1\xd6\x18\x7e\x34\xb5\x47\xc4\x2c\x31\xbf\xd0\xd8\xba\x62\xa9\x4b\x13\x39\xd5\x99\x27\xe1\xe8\x72\xb0\xff\x50\x5f\x98\xc4\x33\x8b\xc7\x56\x62\x3c\xa2\xf3\x36\xc5\xf3\x38\x84\xf2\xf0\xa5\x32\x73\x70\x49\x38\x4d\xf8\x18\x92\xce\x91\x8c\xbe\xf6\x80\x2b\x8a\xed\x73\x79\x1b\x8e\xb9\xde\x03\x11\x24\xaf\x5e\x40\x87\x84\xcc\xf7\xa8\xe3\x39\x91\x61\x05\xa9\x56\x54\x45\x0a\xf5\x98\x16\xdd\xd0\xb3\x2b\xcb\xa8\xf6\x9e\x37\xc0\x00\x4b\x5b\xf5\xc7\x70\x26\x5b\xbb\x67\x9a\x4b\xeb\xff\xac\x8d\x02\x6a\x22\xf9\x78\xfd\x34\xa8\xef\x24\x16\xb0\x39\xbd\x0a\xf0\xcd\xb3\x77\x1a\xdb\x53\x11\xc7\x21\xca\x9b\x53\x8e\xe7\xf4\x3a\x25\x52\x34\xcd\x3c\x41\x3e\x61\x7b\x85\x3f\xe2\x37\xc3\x53\x5b\x74\x6d\xa7\xb7\xa1\xdd\xa1\x7c\xd9\x2a\xc0\xcd\xe2\x65\x0f\x55\x1d\xab\x82\x9e\x03\xf6\x8f\xfe\xa1\x4f\x9a\x0f\x46\xd9\x37\x16\xba\x01\x98\x4f\x3a\x1a\xc2\xd7\x54\x05\x54\x0a\xc5\x1d\x4b\xd0\x40\xbc\xfb\x3a\xa8\xbf\x62\x37\x49\x51\x6b\xcc\x6f\xa2\xfb\x0c\xcf\x5a\x9b\x87\xfe\xa5\xce\xf1\x0d\x97\x9a\xca\x4f\xbb\x75\x16\xa7\x68\x4e\xbb\xa9\xe2\x7e\xf8\x62\x1f\x28\x0c\x77\xfd\xd3\xee\x44\xa6\x50\x72\xcb\x7a\x43\x00\x1f\xd1\x4e\x33\x7a\x99\xb9\x32\xa5\x35\x5c\x12\xdf\xa3\xce\xf7\x48\x26\x23\xb7\xb5\x01\xac\x5f\x6b\xed\x71\x78\xed\x02\xb1\x62\x88\xc7\x34\x3a\xd6\xe6\x1a\xfd\xf2\x67\xf2\x1c\xe7\xcf\x20\xc5\xf3\xb7\x8e\xdd\x31\xab\xb1\xce\x5a\x04\x5d\xda\x50\xc0\x55\x6d\xc0\x61\x92\xc3\x0e\x7a\x33\x33\xad\xb7\x9b\xfc\x19\xdf\x0e\xca\x67\x79\x3d\x48\x9f\xfb\x1d\xdf\xe9\x2f\xa3\x63\x97\x7a\xc5\x03\xe7\xa3\xe0\x5b\x3d\xba\xc0\x52\xaf\x10\xbd\x4c\xc9\x29\xc0\x35\x64\x8b\xe6\x1a\x5f\xc6\xcc\x3c\x51\x1f\x35\x1a\x3d\x9a\x14\x4d\x83\x01\xc4\x92\x3f\xf4\x98\x2f\xc2\x61\xf8\x96\xfe\x91\x5f\x1d\xf5\xf8\x73\xb8\x7a\x87\x1e\xce\x55\x7d\x17\x64\x6b\xc7\xcf\x2a\x36\x62\x0b\xd5\x1c\x4a\x97\x00\xd2\x22\x03\x06\xf5\x9b\xc1\x83\xc9\x60\x6a\x5e\x16\x56\x5c\xb5\x68\xc5\xc5\x47\x8b\x0b\x8a\x76\x5f\xbe\x5a\x52\x6a\xdf\x2c\xfb\x4f\xcb\x5b\x3f\x76\x3c\x03\x92\x56\x2d\xdb\xd9\x6f\xf0\xff\xb1\x4f\xbc\xb2\xdf\xda\x83\xee\x29\xdb\xca\x97\x47\x00\x2f\x07\x5d\xdf\x3e\xe2\x57\xf2\x85\x93\x4e\xb9\x1f\x7e\xf7\xd9\x15\xbb\x0c\x94\xd8\xf2\x07\xf2\xbe\x55\x46\x57\x1b\x90\xc8\x2b\x16\x69\x96\xd1\xf1\xd9\x1f\xb0\xa5\x9a\x6a\xda\x41\x83\xce\x29\x60\x87\xd8\xd1\x0d\xb8\xe7\x70\xfd\x7e\x70\x71\x35\x5c\x84\x5b\xaf\xce\x82\x17\xe2\xa7\x80\x03\xf3\x57\x41\x4a\x2f\xd0\x22\x96\xc7\xca\x84\xa6\x91\xec\xd6\xd8\x9b\x06\x80\xc6\xd6\x7a\x30\x35\x16\x4e\x3e\x86\x33\x86\x14\xcc\xd0\xf8\x85\xe7\x2e\x86\x97\xaf\xb3\x39\x96\x1a\x21\x66\xd2\x1b\x29\xe3\x11\xfe\x12\xfe\xb6\x8e\xd1\xdf\x99\x61\xb4\x3a\x8a\x52\x3a\x7c\xbe\xaa\x94\xd2\xfd\xf9\xbf\x91\xdf\xdc\xea\xd3\x16\x50\x47\xf8\x88\xe8\xeb\xc5\xb1\x9c\xb5\xc7\xb0\x23\x85\x01\x71\x29\x72\xfb\x72\xb4\x43\xa4\x34\x54\xe4\x92\xdc\x49\xae\xc0\x01\x8d\x5e\xe3\xb0\x75\x97\x4c\x63\xc0\xee\x02\x77\x0b\x8c\x87\x75\xb8\x18\xd7\x48\x6b\x35\xb6\x49\x3d\xff\x45\x4d\x76\x9c\x00\x1f\xa0\xcc\x2e\xdb\xa8\xec\xaa\xfa\x80\x42\x24\xf0\x99\xc6\x9c\x8c\xbc\x41\xe5\x07\x80\xfc\x10\x55\x5e\xff\x99\x25\x1d\x84\x17\xe9\x94\xb2\x3b\xc7\x89\x20\x52\x3f\xab\xb7\x54\xb5\x0f\x7d\xc2\x1b\xaf\xe8\x9f\x6a\x8f\x10\x5d\x9e\xbc\x8a\x77\x25\x97\xf4\x30\x5d\x53\x68\x63\xbe\xb9\x49\x07\x89\x6e\x44\xd6\x7c\xa8\x87\x28\xc6\xcb\x9d\x0f\xff\xf8\xa7\xe3\xe4\xa2\x81\xee\x04\xa4\x57\x92\x47\x7c\x0b\xab\xd1\x63\x3d\xd5\x38\xcc\x70\xd0\xf1\x3c\x66\x86\xca\x0e\xda\xbd\xf0\x3d\xdc\x0a\x8b\x23\xc1\xe6\x05\x54\xa9\x51\x23\x91\xa5\x47\x33\x98\xaa\x91\xc8\x6b\x16\x1d\x7e\xc8\x65\x96\x7d\x64\x11\x9a\x2a\x73\xc7\xc8\xdc\x3f\x7c\xa6\x1f\xfe\xb1\xb0\x89\xef\x64\x0c\x8b\x3e\xbb\xd8\x22\x51\x56\xad\x8b\x3d\x4e\xbd\x18\x36\x2c\x71\x72\x26\x88\x42\xb7\xe7\x16\x61\xe1\xc3\x9b\xf7\x15\x91\x06\x04\x48\x23\xdd\xf4\xe8\xc7\xb3\x4b\x7d\xe2\x0a\x2e\x47\x81\xa4\x5f\xc6\x75\x7d\xd1\x33\x87\x33\x34\x02\xa7\xa2\x7c\x52\xf6\x86\x99\xbe\xe8\x73\xe4\x1e\x44\xc5\x86\x2a\x5c\x43\xb0\x6f\x01\xaa\x17\xa6\x26\x40\x58\xb2\xfe\x7b\xea\xda\x91\xa3\xf4\x48\xf1\xa8\x5f\x29\xc1\x9f\x5c\x15\x6b\xe0\xfa\x9b\x0d\x81\x78\x33\xcc\xee\x04\xa6\x8d\x88\x3f\xb1\x5d\x09\x20\x3c\x52\xfa\x12\x80\x18\x9f\xe8\x8b\x36\x44\x55\x68\xec\xc0\x94\x64\x50\xe0\x64\x21\xe5\x3a\xdd\x52\x7c\xff\xfc\xb5\xea\x14\x4e\xe6\xfa\xab\x0e\x7a\x94\xbd\x7d\xd4\xae\x2d\xb1\x7a\x44\xee\x5c\x7f\xc0\xf1\xc4\x06\x48\x23\x13\x36\x33\x46\xc8\xd5\x93\xef\x5c\xc1\x1d\x04\xf9\x0a\x0e\xea\xfe\x2d\x76\xab\x47\x03\x1f\x11\x78\xf1\xd7\x60\x15\x29\x57\x1e\xaa\xa2\x83\x0c\xd2\x5e\xb9\x09\x8c\x4a\xe2\x4c\xc4\x4a\x09\x7e\xd7\xa0\xeb\x51\x4f\x30\x28\x7a\x72\x99\xa5\x37\x87\xf8\x1d\x31\x8a\x3c\x3d\xc4\x2d\x8f\x14\x13\x22\x4f\xae\x4e\x8b\x5f\x23\x71\x08\xac\x99\x46\x0f\x3a\xf6\x94\xcb\xc8\x75\x23\x17\x8d\x5f\xb1\xed\x2c\xe3\x61\xb8\xfa\x26\xd3\xe7\x94\xd0\xb5\x4b\x2c\x91\xf8\x8e\xd4\xcf\xf7\x67\xd1\xb5\xee\xed\x3e\xd7\xc0\x83\xb6\xba\xd0\x7c\x7a\x4f\x1a\x42\x43\x22\x15\x88\x21\x11\xe0\x81\xe6\x12\x84\x7c\x89\x3d\xf0\x66\x26\x8c\xde\x83\x27\xde\x81\x97\xf2\xbd\x76\x49\x55\x05\x74\x2f\xd9\x9e\x0f\x7b\x02\x54\x7e\x7c\x0a\xc4\x81\xe6\xf2\xc5\x4c\x81\x7c\x97\x00\x66\x66\x16\x24\xdf\x70\xfd\x75\x30\xf3\x0c\x56\x88\x9c\x47\x3d\x89\x5a\x00\xc2\x76\x63\xaf\x9e\x21\x63\x4e\x25\x3f\x9c\x0d\x2e\x2c\xc1\x75\x2c\xb7\x3e\x7d\x85\x3d\xa6\x77\xfe\xfc\x4d\x5a\xa1\x12\xf2\xec\xc6\x4a\xac\x1c\xeb\xac\x8a\x14\x24\x4f\x27\x84\x19\x73\x39\x21\x54\x86\x1e\x83\x25\x64\xc5\xb2\xc7\xa1\x07\x0b\xbf\xa1\xbf\x2b\x7c\xb6\xe8\x33\xba\xbb\xf6\xda\x16\xba\xaf\x97\x33\x19\xbb\x88\x66\xd8\x1e\x7a\xf2\x8f\x36\x29\xf4\xf6\xc2\x3f\x54\x01\x5b\x31\xb8\xec\x3b\xfa\x3b\x56\x8c\xff\x70\xe1\x1f\xe0\xaf\x58\xd1\x50\xc5\xa6\x79\xb0\x0a\xde\x03\xee\x81\x7e\x5b\x6c\x20\xf6\x14\x18\xfb\x23\xe6\xa8\x21\x74\x60\x44\xba\x4e\x2d\x7a\xd9\xa3\xec\xaa\x88\x45\xc0\x38\x94\x8f\x10\xc9\xa7\xa2\x58\xf7\x74\x58\xa2\x31\xf8\x6a\xd6\x0a\x68\xb0\x0a\xc8\xde\x6b\xe7\xa0\xf1\xbc\x62\x72\xfe\xd3\xad\x5a\xf8\x1d\x57\x02\x78\x90\xbc\xf2\x70\x83\xb5\x19\xcc\x9f\x84\x6f\x15\x74\x10\x1e\x72\xd1\x19\x98\xc7\x8b\x45\x1d\x4d\x13\x75\xeb\xb5\xfb\x90\x59\xc4\x4f\x51\xbb\x58\xc2\xf0\x51\x44\x07\x8b\x21\x69\x42\xc8\x1c\x21\xe7\x63\xb6\xa6\xe4\x57\x3d\x9f\xcf\xe8\x43\x97\x19\x0d\xe0\x63\x90\xe1\x8a\xe3\x2b\xbd\x4a\xd4\x39\x16\x59\x54\x64\x71\xd1\xcf\x9e\x17\x9b\x6a\x69\x38\x8a\xd8\x92\x67\x1e\x5d\xfb\x03\x79\xcf\x42\x9d\xa8\xc5\x10\x45\x4b\x40\xd0\x46\x3a\xf2\x6f\x1a\xa5\x90\xa1\x20\x4f\x6e\x46\x2c\xf8\xc9\x5e\x01\xf8\x13\x9f\x45\x18\x7d\x69\xc9\x2f\x7b\xdc\xb5\xe0\xd6\xb5\x8a\x0e\x1a\x8e\x60\xcd\x7e\x6d\xfd\x17\xce\x08\x99\x03\x0b\x36\x17\x28\x01\x4c\x00\x67\xf4\x61\x8f\x05\xb0\x15\x61\x3d\xcd\x0a\xfd\x2e\xcf\xc9\x86\x41\xf6\x3b\xe5\x32\x2e\xb5\xdb\x27\xab\x6d\x97\x8a\x46\x23\xbd\xc0\xa6\x02\xd7\x50\xb0\xf5\x68\xe0\xd6\x70\x2b\x06\x6e\x16\xec\x52\x8e\x5c\x0f\xb2\xfc\x43\x17\x11\x09\xd0\xc8\x2d\xde\x8c\x09\xdc\x46\xb5\xa4\x0f\x92\x42\xf6\x53\x98\x12\x2c\xdd\x87\x1f\xab\xc9\x7e\xf2\x81\x01\xa3\x8a\x3f\x88\x0e\x1d\x5a\xfe\xe0\xbc\xe1\x3f\xb1\x12\xb1\xc2\x0b\x62\x98\x25\x32\x20\xf1\xb5\xe4\x2b\x07\xdb\x05\x8e\x49\xbd\xf1\x05\x9e\xdb\xb7\xcb\x45\xd8\x30\x2c\xad\x38\xf4\xd9\xd8\x09\x69\x82\x97\xb2\x34\x02\x94\x84\x71\x51\xce\x8c\xcc\x51\x15\xab\x45\x16\x79\x5b\xf1\x65\x0c\x7c\x84\x9e\xdf\x92\x43\xba\x92\xbc\xb9\x20\xea\x2c\xba\xc5\x54\xfb\xf4\x05\xf6\x52\x49\xf0\x65\xed\x79\x1a\xb5\x02\x07\x88\xd1\x95\x07\x4b\x7b\x89\x57\x2f\xfc\x65\x21\x31\xb7\x24\xb8\x47\x8f\x49\xd9\x94\x43\x0b\x79\x04\xe0\xc2\x24\x7c\x5a\xcd\x35\x60\x03\xf6\xd1\xd8\x66\x6b\x14\x15\x62\xd5\x6b\xcb\x3d\xf8\xb9\x14\x28\xaf\x6a\xa0\x26\x54\xa0\x9b\x53\x17\x58\x09\x45\xb8\x11\xbe\x78\xbd\x2c\x7b\xd7\xf2\x61\x92\x22\x96\x87\x3c\xcb\x29\x27\xa9\x86\x6e\x4b\xa3\x38\xde\xc3\x79\xa1\x78\x65\x1f\xe8\x0a\x35\xe4\xb0\x28\x35\x94\x47\xbb\x34\xb9\xd0\x22\xd9\xcf\xf3\x05\x80\x83\x33\x0e\xc9\x41\xdd\xe8\xc9\x52\x2f\xba\x0a\xdc\x26\x4c\xad\x68\xbe\xdc\xa3\x87\xd8\x45\x03\xc7\x33\xf6\xde\xad\xe7\x84\x00\x02\xbd\xcf\xb1\x34\xa8\x16\x46\xf5\xc1\xed\x03\xb5\xb0\xf2\x06\xbd\x4c\x08\x8f\x9e\x9a\x72\xb7\x6e\xf8\x70\x16\x73\xc3\x03\x46\xa7\x4c\xc7\xc4\x9e\x12\x91\x32\x81\xb5\x3c\x07\x36\x9e\x7a\x26\xac\x82\x2f\x52\xaf\xe7\xe0\x90\x2b\x47\x41\xe6\x3f\x69\x81\x34\x68\x93\x82\x03\xce\x86\x67\x03\x0d\x46\x99\x97\xa8\x71\xac\x13\xc0\x61\x85\xe3\x4c\x87\x14\x32\xf7\xe7\x9d\x72\x84\xeb\xd0\x08\x10\xb7\x0a\x13\x72\x7f\xc0\x20\xda\xf1\x79\x26\xb0\xeb\x53\x5e\xc2\x61\xc7\x67\xec\xfe\xb9\x78\x06\xbb\x22\xdd\x20\x05\x40\x3e\x01\xf7\x05\xf6\x01\xf7\x02\xf6\xc0\xb8\x38\xb0\x30\x1a\x0b\x45\x0b\x70\x73\xe2\xb7\x40\xf8\xf9\x39\xc9\x11\xf4\x14\x9a\xbe\x7e\xc8\xc7\xde\xd8\x64\x1a\x26\xb1\xeb\xf4\xb8\xcf\xa0\x9c\x5e\xb5\x17\x50\x8a\x88\x18\xff\xc9\xd8\x65\x1c\x56\x71\x62\xa4\x3e\x35\x9b\xe2\xc5\x3a\xd5\x1c\x0b\x8d\xf7\x80\x1e\xcd\x16\xb0\x45\xec\xfa\xbb\x94\xea\x19\xc5\xfd\xf5\x68\x2e\xf0\xf1\x1d\x66\x69\x99\x1d\xd4\xe5\xb1\x17\x73\x31\x56\x51\x41\xf4\xa1\x69\x05\x8d\xc7\x13\xfb\xfa\x1b\x0a\xd0\xe8\x70\xbd\xb7\x88\xaa\x03\xf5\x55\xc8\x7a\x36\x38\xbd\x80\x02\x88\xfa\x4c\xd7\x84\x34\x7d\x15\x64\xc6\x25\x5d\xc2\x4f\x1e\xc3\x1b\x2f\x5a\xf5\xf3\x28\x11\xc6\x87\x06\x44\xd1\x56\xde\x2d\x51\xa9\x7a\x3c\x18\x05\xcf\x92\x60\x48\xd1\xf7\x9e\x38\x77\x6c\x14\xe0\x59\xc6\x32\x74\xe8\x16\x6d\x57\x07\x4c\x01\x38\xe4\x4a\x4e\x35\x41\xaa\x70\xd2\x70\x6c\xa1\x24\xd5\x01\xad\x59\x6f\x83\xf3\x8e\x77\x18\x41\xe8\x4e\x53\x41\xb9\x5f\x03\x3a\xde\x75\x6a\x1d\x7c\xac\x6f\x54\x69\xcf\x4f\x06\x73\x4b\x12\x84\x23\xbd\x0f\x38\x9f\x45\xa3\x06\x36\x4f\xaf\xfe\xba\xd5\x80\xeb\x12\x63\x8d\xc1\x70\xa6\xc6\x41\x22\x66\x77\xd1\xce\x61\x6b\x30\x71\xaa\xea\x02\x8c\x76\x4d\xdd\xe0\xe2\x5a\x1a\x18\x9f\xbd\x6e\x5b\x2b\xdb\xc7\xa5\x1d\xbb\xc1\xa5\xb9\xa1\x12\x30\x4b\xf2\x9e\x56\x84\x2b\x52\x0c\xe1\xa1\x8c\xf5\x72\x40\x6b\xdc\x92\x56\xa1\xf6\xb0\x5d\xe2\x4b\x3c\x69\x79\xe4\xcb\x8a\x36\x9c\x0b\x24\xc5\xb6\x8f\x7c\x1b\xa3\x4b\xb7\xca\x4e\xb9\xcf\x8d\xc8\x53\xf9\xbf\x6b\x0b\x3e\x29\x22\xb9\x96\x35\x62\xfb\x3d\x16\xf2\xc5\x05\xd2\x1c\x21\x8d\x16\x95\xe3\x21\xe4\x01\xbe\x44\xa8\x43\x56\x6f\xd5\xf7\x51\x0a\xe8\x45\x5e\x12\xce\xb9\x10\x29\xd8\x45\x24\xd5\x18\xc4\xa1\x63\x60\x50\x0f\x49\x5f\x97\x51\xc5\x15\xc7\x79\x1e\x0d\xd6\xeb\x56\x01\xfa\xc8\x7e\xe7\x09\xab\xff\x4e\x68\x45\x69\x23\xd1\x2c\x22\x79\x44\xb1\xb8\x05\x55\x21\xa2\xb6\x44\xf0\xa4\x51\x42\x70\x3f\xdf\x9b\x45\x67\x96\xda\x24\x21\xf8\x65\x74\x99\x55\xfb\x88\x08\x6d\x00\x68\x7c\x56\x00\x22\xa3\xcb\xa9\xa7\x2d\x6e\x3e\x79\x08\x47\x2a\x0d\x00\xef\x7a\x8f\x96\x03\x75\x40\x0c\x17\x47\x0b\x81\x4e\x39\xf5\xa9\xad\x6a\xb8\xb4\x96\x3b\xce\x9b\x54\x4a\x1c\x39\x34\x59\xa6\xb5\x0d\x60\x20\x38\xd8\xa9\x4d\xeb\x9a\x89\x3a\xac\xd8\x24\x95\x66\x6a\x9b\x58\xde\x83\x2f\xea\x45\x0d\xc1\x26\x97\xf8\x29\x8c\x81\x7a\x12\x89\x10\xf6\x19\xd8\x11\x19\x71\xf3\xe5\x0a\x1b\x0f\xd3\xaa\x30\xda\x16\xd1\xc3\x12\x6b\x34\xaf\x3c\x45\x0b\xb1\x52\xe4\xa4\xd5\x18\x04\x1e\x08\x64\x00\xe4\xc5\xa8\x8f\x99\x59\x0c\x84\x98\xd6\x81\x87\x4f\x10\xc3\x0b\x97\x82\xed\x99\x94\x92\x1e\xc2\x4b\x00\x58\xac\xa1\x5e\x9a\xba\x4c\x03\x43\xc2\x21\x60\x57\x1f\x76\x07\x83\x9b\x1e\x06\x26\x52\x90\xb8\x67\xd0\x5d\x95\xda\xb5\x9d\xf7\x0c\x58\x7c\x14\xd9\x15\x76\xd0\xf5\x7c\xbc\x03\xd1\x95\x86\x34\xe9\xd7\x5b\x0f\xe7\x5a\x8f\xe6\xbb\xb6\x6b\x02\x6f\x5e\x8c\x03\xe3\x01\xa2\xd5\xc6\x95\x36\x7c\x90\xbe\xff\xcd\x09\x60\x08\x0f\x7f\xff\xdb\x13\x1e\xf1\x82\xad\xfa\xb8\x75\xf8\xfb\x8f\x4e\x78\xf1\x09\xeb\xea\xb9\x3e\x90\xcc\xa9\x0d\xaa\x6a\xe1\x9b\xce\x14\x78\xd2\xa7\xb8\x55\x0f\x3d\x5a\x1a\x5b\x35\x0c\xd3\xa9\xc9\xf3\x8f\xe8\xca\x36\x19\xff\xca\xe7\x9b\x83\x37\xa9\xcb\x2b\x76\xb6\x8b\xca\x22\x9c\x3c\xd8\xe5\xea\x60\x4e\x26\xee\xe1\xe1\x0f\x97\x6f\xc6\x67\x2e\x85\xa8\xee\xf7\xb3\x3f\xe8\x5f\xd1\x1a\xfc\x02\x59\xe2\xc3\x34\xfd\x1f\x54\x25\xe5\x38\xcb\xd0\x3a\x5e\xd2\xa7\x15\x61\xb7\xab\xf2\xc7\x70\x1e\xf8\x72\x20\x64\x45\x43\xf9\x21\x95\x7e\xa7\x47\xe8\x46\x1e\x51\x9b\xd7\xf1\xba\x5b\x9c\x30\x35\x90\x71\x1a\x46\x3f\xb2\xf1\x39\x72\x89\x1a\x8c\x09\x01\x27\x20\x3e\xdb\x8a\x4d\x4b\x29\x30\xe4\xf6\xca\x0b\x9a\x00\x48\x34\x66\x00\x76\x34\x29\x77\xa4\xc2\xae\x44\x21\x6f\x0e\x2e\x2d\xa2\x02\x2c\xaa\x53\x44\xb4\x02\x8c\x38\xa4\xd7\x97\x7e\x7d\x42\x08\x43\x48\xc6\x63\xff\x21\x3e\xa4\x9f\xdf\x8a\x31\xe8\x1f\xcc\xdd\x76\x50\x5d\xdc\x47\xad\xa1\x09\xcd\x60\x77\xdf\xb3\x65\xb4\xb7\xed\xce\x91\x73\xeb\x39\xb4\xa4\x10\xdd\xd3\x5d\x80\x0c\x82\xd1\x60\x59\x67\x8a\x7c\xaf\xee\x5a\x45\xce\xc0\x87\x85\xd3\x57\x82\xd9\x29\xa3\x54\x7c\x0b\xd4\x03\x31\xf5\x59\x85\x05\x52\xef\x45\x49\xe2\x8f\xb9\x08\x1e\x03\x08\x0b\x25\x2d\x96\xd4\xf0\x7d\x8a\xc2\xb3\x32\xc6\x9e\x25\x2b\x9c\xbe\xdc\x49\xb1\xd7\x7c\xbd\xda\xda\x7d\xa2\xc7\x15\x0b\x0e\xaa\xfa\x05\x39\x2f\xcb\x31\x58\x12\x17\x37\x47\x1a\x34\xd8\xa5\x78\x39\xcc\xd2\x55\xec\x54\xfb\xce\x4c\x6b\xe2\x59\xb2\x1c\x1d\x3c\xf8\x16\x4e\x63\xa5\x22\xf4\xf4\x62\x97\x39\x6a\xef\x63\xf7\x0b\x83\xa7\xcc\x87\x0b\x62\x4f\x3c\xe2\x45\xf2\x4a\x5a\x3c\xb2\x53\xc6\x90\xf0\x07\x3a\x08\x24\xe1\x3a\x28\xeb\xd2\xe1\x4e\xcc\x43\x47\x8e\x3b\xf2\x1a\x3c\xdf\xe9\x57\x8c\xce\x26\xe9\xdd\x68\x0f\x20\x31\x02\x44\x2e\x83\xff\x66\x52\xba\x21\x10\xf3\x9d\x82\x33\x94\x17\x6a\xc7\x91\x59\x0c\x7c\xca\xfb\x7e\xbe\x30\x80\x07\x35\xe2\x99\x7e\x60\x79\x5f\xc4\x7c\x44\x2a\x94\xa8\xf3\x16\xaa\xac\xa0\xfc\x87\x94\xba\x45\x40\x57\x64\xce\x8c\xba\xea\x13\x35\xf0\x43\x86\xad\x11\xa6\xf8\x65\xda\x25\xb8\x10\x0e\x23\x6a\x78\xb4\xe2\x11\xbd\xd3\x9e\x5c\x91\x10\xa4\x1b\xe7\x83\xa9\xf9\x74\x40\x59\x74\x82\x0e\xc6\x1e\x22\x3f\x47\xd6\x92\xf6\xfc\x65\xed\x3a\xc0\xf5\x81\x58\x61\xb0\xa5\x97\xaf\xc5\x8d\xcc\x18\x03\xb9\x9e\xc7\x5a\xc7\xf0\x65\x14\x5f\x7a\x7b\x5e\x0c\x39\x89\xde\xf9\xdf\xee\xc3\x8c\x19\x7a\x62\x06\x1e\xb5\x1a\x2e\x5a\xb3\xab\x25\x14\xb4\x81\xce\x4f\xec\x63\x80\xae\x97\xb3\xe1\xad\x45\x0d\x00\x47\x17\x18\x18\xdf\x8d\x7a\xe3\x01\x5d\x9a\x92\xf9\xf2\xc3\x35\x15\xa0\x01\xad\x5b\xe4\x52\x80\x71\x8a\xce\xde\x69\x2f\xd6\x24\x18\x2e\x01\x47\x73\xc4\xb7\x7e\x66\xbc\x60\x20\x7d\x86\xbf\xae\xf9\x26\x8e\x82\x7c\x46\xcb\xf4\xd3\xee\x75\x83\x1b\x00\x42\xf8\x21\x35\xf8\x21\xb2\x04\x45\x21\x8a\xbf\xa0\x1f\x7c\x41\xca\x92\xc5\xa4\xb3\xce\x9d\x27\x2a\xa2\x1d\x19\x30\xac\xda\x26\xf3\x15\x70\x41\xc7\x35\x10\x18\x08\xeb\x63\x34\xb5\x29\xfa\x4b\x7f\x5b\xd2\x26\x46\x6e\x91\xc2\xdf\xea\x42\xe9\x63\xd0\xae\xf4\x2b\xbe\x40\xac\x96\xc4\x8c\xfc\x3b\xb0\x25\x3f\xb3\xbb\xf7\xe8\x0d\x0e\x4a\xce\xa4\xb8\x88\x25\xad\x87\x4f\xe5\x0a\x37\x61\x58\xd1\x12\xd3\xb2\x44\xc5\xac\xf4\x89\x70\x4b\xc2\x3c\xeb\x7b\x19\x10\x83\xe6\x45\xfe\x34\xe6\xad\x6c\xac\x31\x3a\x89\x92\xb3\x3e\x7f\x34\x5e\x5a\x18\xeb\x82\x9c\x12\x97\x1b\x18\x22\x45\x78\xa7\x19\xed\x89\x6d\x9b\xfd\x0c\xe9\x3b\xda\x3f\xb9\x16\x70\xaa\x68\x87\x22\x07\xcb\x44\x35\x1d\xab\x17\x79\xf7\xf9\xdd\x98\x87\xd3\xf5\xb3\x4c\x08\xd9\x61\x10\x9f\xca\x31\x05\xad\x4d\xa1\x9f\xeb\xed\x17\xc1\xdd\x5b\xd1\x80\x1d\x0f\x0e\xbe\x4d\x3e\x38\xc9\x3e\x38\x64\x2a\xa3\x7c\xeb\xce\xcd\xe6\xda\x28\xbf\x60\x48\x58\x6d\x83\xfa\x6b\x7a\xfa\xa4\x62\xdf\x09\x92\xe6\xcb\x39\x72\x40\xa2\x69\x33\x8a\x70\x00\xda\x70\x72\x42\xa6\x4e\xee\x11\x1c\xd5\x8e\xfb\x8d\x55\x27\xd7\x92\x44\x0b\x3c\x5b\x3e\x57\x3c\x24\xf2\x87\xc4\xf7\xaa\x66\x3b\xd0\x11\x9b\xa8\x3b\xa8\x51\x47\xb3\x91\x07\x55\x38\x31\xa9\x1b\xc0\x50\xa3\x0f\xee\x86\x4f\xb7\xb9\x93\xc4\xfe\xc6\x0f\x7b\xca\x09\x24\x6c\xaa\x96\xe5\x90\x10\xb4\xa8\x5c\x7f\x90\x19\x18\xf4\x81\xc3\x9a\x8a\xf3\x3f\xfb\xb2\x00\x3d\xe2\x61\xd0\x0e\x92\x9f\xc6\x5a\x9c\x6e\xd4\x7f\x71\xb8\xf8\xd3\xee\x84\xb8\x57\x92\xaf\x04\x3f\xd8\x35\xf1\x56\x23\xe7\x0f\x19\xc3\x3c\x4d\xd7\x86\x3c\x24\xd1\xd2\xaf\x51\x6c\x8a\xfb\x91\x3c\x60\x00\xc4\xe5\x7d\x2d\x13\x24\x21\x8a\x4c\x12\xbc\xce\x62\x74\x74\xa8\xc2\x8e\x92\x20\xc6\xce\x0e\xf5\xb5\x70\x7d\x59\x34\x93\x89\xb1\x88\x50\xd2\xd1\x7e\x36\xa5\x61\x7b\x18\x95\xc1\x03\x76\x9e\xc2\xb8\x11\x81\xd4\x73\x84\x75\xc6\xc8\xfd\xf7\xd1\x83\x47\x5e\x4b\xef\xdd\x8e\x38\x1f\xb3\x79\x93\xc0\xa6\xae\x91\x66\xd4\x12\x35\x99\x12\xb2\xe7\x86\xf9\x59\xcf\xd6\x98\x27\x7a\xa8\x51\x10\x5d\xf6\x50\x33\x26\x67\xe3\x83\x42\xd2\x3c\x9a\xdf\x75\xe8\x41\x69\x0c\xbd\x36\x07\x81\xcf\x36\xdb\xd4\x7e\x56\x2a\x4c\xc6\x14\x7b\x86\xa2\x0f\xd2\x07\x23\xf0\xdf\x91\xc1\xc1\x23\xc5\x22\x39\x64\x05\x7b\xcb\x2a\xb4\x6d\x72\xea\x9a\x23\xd2\x93\x67\x85\xb8\x28\xe9\xb4\x1b\x8d\x51\xd1\xe0\x15\x53\x57\x8c\x0c\xf0\xd1\xde\xc8\x9b\x3c\xd8\x8f\xf3\xb7\x61\xaa\xe1\x02\x6b\x97\x71\xe1\x90\xc2\x92\x8b\x4b\x63\x7b\x1b\x5f\xa3\xeb\x3d\x9b\xc5\x33\x19\xe9\x7a\xd0\x11\x6f\x51\x62\x56\x98\x33\x88\x71\xdc\x46\x41\x8c\x33\x3d\x68\x8c\xa9\x53\xa7\xd7\x6a\xe4\x34\x4a\x97\x0e\x1f\x60\x74\xb3\x9f\xab\x27\x56\x22\xf9\x5c\x2e\xad\xa7\x6e\xcf\xe6\x14\xec\x3b\x99\xdc\xd4\x97\x73\xc8\xe1\xa6\x75\xd2\x31\xa5\xe4\xab\x98\xcc\xb0\x73\xd2\xc9\xfe\x05\xfe\x47\x7f\xf5\x0c\xdb\xa5\x02\x86\x0b\x34\x23\x25\x59\x58\x8c\xc0\x26\x04\x8f\x1f\x4b\xd0\x5d\x90\xdf\x60\xe3\xa3\x25\xa0\x64\x14\xb0\x90\x33\x0b\x98\x4f\x0b\xa2\xcd\xa6\x22\xbe\x03\xe4\xc5\x17\x45\x2c\x16\x2f\xed\xb1\xfb\x28\xff\x01\x0d\x96\x57\xac\x63\xc0\x46\xe1\x4e\x53\xef\x82\xa5\x7d\x4e\xc5\xc3\x08\x51\xfd\xea\xac\x36\x1f\x3f\x66\x5e\x54\x92\x2d\x10\xb0\x99\x14\x84\x3e\x08\x27\xc9\xdf\x89\x8f\x34\x4b\xf9\xed\xaa\x6e\x52\xbd\xf9\x8d\x00\x94\x17\x6c\xdc\x8e\x4e\xae\x9d\x70\x11\xaf\xdf\x43\xa6\x87\x30\x05\x05\x11\xca\x79\x62\x9e\x74\x3d\x07\x0a\xd1\x49\x1d\xb1\x24\x68\x76\x41\x7e\xa4\xd2\x3e\xe9\xad\x0f\x8b\xb2\xc7\xb3\xb8\x69\x58\x1b\x7c\x12\x61\x54\x21\xdc\xc5\xe6\x72\xac\xa3\x16\x3c\x8f\xcf\x49\x95\xa5\x4d\x8a\x5f\x24\x18\x40\x82\xbe\x5d\x80\x30\x96\x56\xc1\xce\x7d\x44\x97\xba\x7a\xc8\xc5\xc0\xc2\xc7\xa1\xa8\x22\x6c\x1c\x3f\x9d\x68\x6c\x4d\x84\xb5\x9b\x18\xf3\x7e\x1f\xf8\x89\x29\xbd\x12\xd4\x5e\xc2\x34\x99\x78\x0b\x47\xc8\x67\x71\xf3\xe6\xdd\x19\x6b\x43\xa9\x4a\x3b\x56\x92\x75\x7e\xc5\x2c\xc7\x5a\x91\xb7\x1b\xb4\x9c\x99\x28\x7f\x88\xb8\x77\xf3\xdb\x6d\xf5\xb5\x87\x3d\x22\xbc\x6c\x2c\xee\xbf\x2e\x35\xe2\x75\xba\xfa\x9d\x12\x21\x3e\xb9\xf8\xa6\x82\xf5\x50\x98\xc0\x2c\x85\xd5\xea\x06\x42\x86\xdc\xec\x5f\xf0\xff\xdd\x40\x70\xb5\xc8\x19\xbc\x1b\x40\xb5\x2c\x56\x88\xec\x77\xea\xaf\x08\x74\xc0\x75\x4f\xea\xa7\xa1\x7f\xb1\x7b\xad\xf6\xc4\xbd\x60\x7d\x36\x02\xe8\x77\xfc\x18\x0c\xe6\xff\x49\xc2\x80\x48\xe7\x14\x8c\xb4\x2c\xa9\x4b\x24\x5e\xa0\x1a\xea\x2b\xfa\x6d\x1d\x93\xdf\x11\x20\xba\x4d\xab\x0c\x33\xe8\x36\x6d\x7d\xed\x0e\x77\x36\x83\x40\x18\xa5\xb8\xe2\xf6\x93\x4f\xae\x34\x87\xdf\xd1\xf0\xef\x90\xbd\x5a\x95\xea\x30\x8d\x20\x60\xc1\xef\x01\x0b\xb1\x84\xc4\xef\x5e\xb7\x8a\xd6\x16\xd8\x82\xaa\x6f\xf7\x18\x83\xa0\xf8\x0c\x14\x11\x58\xe2\x33\xe8\x22\x31\x56\xeb\x89\x30\x1a\xa5\x63\x8d\x3c\x26\x47\x93\xf9\xcf\x8a\xa1\xa0\xbd\x99\x93\x31\x14\x74\xcb\xf9\xe2\x29\xbc\xdf\x8a\xd1\x38\xda\x8f\xae\x35\x5f\x5c\x4f\x8e\x00\x91\x9f\x89\xb3\x04\x1f\xc7\x0f\xb0\x4c\x9e\x6f\x0f\x1a\x73\x42\x9d\x27\xfa\xd0\x63\x5c\x7f\xba\x03\xd0\xb4\x84\x31\x8f\xa1\x9c\xaa\xc4\x61\xd1\x2d\x28\x82\x95\xa7\x92\x94\x25\x28\x01\x1c\x03\xa4\x6c\x07\x02\xc6\xe7\x98\x9d\x10\xbb\x43\x0b\xb3\x3f\xf7\x0a\xa3\x5e\xde\x1e\xc5\x97\x99\xe8\x9d\x5b\x6b\x6c\x4d\x52\x00\xd5\xb5\x60\x63\x99\xd7\x90\xd9\x5d\xf4\x84\xae\x6f\xaa\x28\x63\xba\x5d\x56\xad\xc4\x96\x81\x3e\x59\xf4\xea\xc0\xae\x74\x59\x08\x82\xc9\x09\x4c\x6c\x45\x4a\x4e\xff\x80\x3f\x6c\xe3\xff\x0f\x6a\x49\xcf\x27\xde\x92\xb9\x5e\x9a\xef\x94\xd0\x29\x14\xd6\x39\x6a\x45\xaa\xd0\x5a\x08\x9b\x27\xd9\x98\x3a\x2a\x49\x78\x35\x8b\xf9\xbe\xce\x26\x78\x0c\x9e\x3f\x82\x4e\x40\x32\x30\xeb\x4f\x34\xf8\xe3\x0c\x62\x7d\x9d\x1f\xc4\xc3\x73\x0c\x61\xfe\xe3\xc0\x16\x50\x0f\x66\x57\x9c\x42\xf6\x6b\xfe\xf7\x60\x60\x0a\x8e\xa7\x6a\x7c\x6a\xfc\x38\x68\xa2\xfa\xa1\xa6\x19\xbc\x41\xae\x94\xbf\x63\x54\x92\x7f\x58\x7f\xc7\x83\x05\xff\x38\x40\xd8\x7e\xfc\x87\xd6\x5a\xd4\xcf\x05\xf5\xfb\x9c\x1b\x47\x87\x36\xf9\x67\x6d\x54\x3f\x4b\x40\xb1\x8a\x97\xef\xc5\x32\xaa\x98\x61\x0b\xa6\x6f\x63\xd8\x2d\x0e\x7a\xa7\xc7\x44\x32\x9c\x70\x66\x14\xc1\x3e\x26\xff\xef\xdc\x87\x03\x19\xcc\x5c\x6d\xde\xdb\x0f\xa6\x6b\xad\x67\xcb\xcd\xe9\x9d\xa8\x6e\x31\x4f\x5e\x4a\x7f\x23\xbb\xfe\xf4\xd3\xf6\xf5\x35\x39\xf1\xd3\xb5\x08\x88\xf2\x62\x51\x40\x33\xd4\x0b\x78\xfc\x0e\x83\x53\x72\x69\x3f\x6a\xf3\x65\x87\xbe\xee\xf8\x4a\x8c\xfc\xdf\x0d\xd2\x8f\xca\x11\xa0\x30\x7b\x13\xe1\xcc\x0d\x7a\xa0\x7a\xb7\xb5\x32\xa3\x02\x50\x27\xc0\x12\x4b\x8c\x27\x09\x98\x09\x7a\x1b\x81\x0d\xd4\x67\xcd\xda\xc8\x63\xae\xdf\x43\xc9\x78\xf4\x3a\x3f\x35\x6c\xd7\xce\xc5\xd6\x4b\xb5\xca\x2c\x81\x07\x3c\xc1\x11\x8b\x3c\x8a\x41\x7a\xe3\xcb\x08\xa8\x43\xa9\x24\x3a\x73\xbf\xc3\xd9\x95\x69\x3b\xd0\x65\xdf\x05\x9a\x5c\xb1\xfb\xab\xa5\x7c\xc5\x04\x40\xd7\xbd\xc8\x6f\x0e\x2e\x36\x58\xdd\x9e\xce\xfe\x95\xa1\xe8\x28\xff\x6b\x1d\x65\x8d\x11\xf4\xdf\x09\xcb\x4f\x67\xf1\x06\xd5\xbd\x44\x1e\x5e\x0c\xc3\x56\x72\x35\x1c\xf2\x2b\x35\xdd\x57\x7b\x62\x48\x5c\xf6\xfa\x50\x8b\x40\xe1\xb4\x64\x03\xf9\xa5\xdc\xe3\xf3\x9d\x70\x9d\xeb\x2f\xd7\x08\x55\x6f\x8d\x3f\xc7\x37\xab\xfc\xda\x21\x1e\xe6\x3f\x7a\x5b\x5c\x9f\x8f\x02\x82\x75\xb6\x6f\xee\x84\x7e\xd4\x9d\xe8\xa6\xf9\x72\x45\xde\xe2\x4a\xf4\xf8\x29\x86\x01\xa2\xda\xd8\x5a\xc2\x97\x1c\x89\x07\xcb\xdd\xbb\xf9\xcd\xc1\xdd\xe0\x6c\xae\x3d\x89\xc2\xf3\xa9\x78\xe5\x3a\x2e\xae\xd9\x93\x8a\x45\x84\xaf\x8e\xd2\x7b\x45\x32\x21\x96\x12\x7c\x8f\x4b\x71\x65\xf8\xa5\x3b\x0b\x45\xf0\xb7\xc4\x71\x35\x1a\xff\x8f\x8e\xab\xd1\xb0\x60\xf0\xad\x24\x69\xe2\xd2\xe0\x78\xc3\xfe\xac\x1c\xfe\x00\xab\x3d\xb9\x51\x51\x45\x87\x5e\x22\x15\x72\x9d\x2f\xbb\x56\xbf\x8b\xa4\x14\xdd\x85\x7b\xac\x6f\x98\xfb\x00\x9c\x2d\x00\x3e\xe5\x31\x38\x74\x6a\xeb\xb1\xed\x52\xbc\x34\x52\xab\x51\x94\x6f\x91\xeb\x47\x22\x1f\xbf\x61\xa3\xfa\xa6\x84\x67\xa0\x73\x34\xbc\xc8\xad\x90\x06\x5e\xec\x86\xc6\xb1\x35\xc1\x97\x41\x09\xea\x61\xae\x85\x7a\xcc\xcd\xa4\x8a\x1e\x9e\x2b\xda\x00\xfb\x2e\x89\xc8\x3a\xf9\xfd\x64\x5b\xe6\xcc\x51\x74\xa2\x96\x12\x2f\x9b\x61\x3f\x8d\x38\x20\xcb\x8f\x82\x1b\xb7\xc2\x9d\xfd\x83\x5a\xfb\x8d\xd9\x1a\xa2\x34\x3d\x7d\xd0\x52\xb6\xa2\x9f\x53\xfc\xae\x8f\x73\x5b\x92\x32\x15\x6e\x0b\x8b\xaf\x08\xfc\x8b\x8d\xad\xb8\x0f\x8a\xa5\x4f\x79\xc6\xdf\x6d\x0c\xe4\xf0\x8f\xd3\xfa\x14\x28\x1f\xbd\xeb\x63\x22\xd8\x6b\xa3\xdc\x6c\xe1\xd5\x35\x84\x2e\xd6\x65\xe0\x43\xfb\xe0\x56\xb6\xd4\x5e\x26\x37\xc4\xdc\x5e\x15\x00\x2f\x2e\xbd\x77\x63\x51\x13\xd5\xd2\x63\x40\x75\x9e\x2f\x31\x96\x02\x90\x7e\x8b\x1d\xb1\xe1\xf9\x93\xc4\xcf\x30\xb9\x93\xd0\xec\x06\xd1\x4b\x69\x4e\x51\xda\x04\x55\x54\x91\x07\x3b\xc6\x11\x7f\xb5\x1e\x7f\xad\x9e\xe8\x03\x7d\x3f\xe3\x86\x5f\x09\xeb\x41\xd7\x68\xa7\x1c\x96\x84\x4f\x44\x16\x32\x63\x07\xe9\xda\xb1\xb1\x69\xcf\x04\xb3\x4f\x89\x8c\xd2\x29\x85\xb9\x95\xc8\xd8\x79\xd4\xf8\x6a\x7d\x26\x5f\xdf\x51\x89\x4f\x1a\xdd\xa4\xc8\xf7\x30\xfe\x44\xae\xcd\x74\xac\x63\x32\x9f\xf1\x86\x23\x79\xc7\x26\x70\xcc\xfa\xcc\x8d\xb9\x50\xa8\x18\x6d\xbf\x8b\x86\xc4\x0f\x26\xd2\xd7\xcb\x0c\x7a\xaa\x57\x4a\x87\xb9\xc1\x08\x7c\x70\x46\xe9\x88\xc4\x96\x8f\xfd\x5c\x39\xb1\x49\xcc\x3f\x90\x1c\x5f\xf9\x1e\x42\xff\xc0\x48\xfa\xc6\x00\xb9\xd1\x0b\x53\x34\xd0\xf4\x26\x96\xff\xcf\x46\xc6\x53\x26\xc1\x70\xa0\x18\x5c\xde\x2f\xc1\xae\x63\xca\x25\xf4\x70\x37\x6b\xf6\xc4\x78\x76\x64\x5c\x29\x4e\x2b\xe7\x5c\x48\x09\xeb\x8a\xfa\x2d\x0e\x83\xa9\xa2\x75\x06\x37\x6e\x73\x7e\x12\x7c\xa8\x48\xb8\x03\x8c\x57\x3a\xe2\x20\xe6\x0d\xdb\xbd\x28\x52\x4b\xe4\xa9\x54\xa9\x9b\x44\x6e\xd1\xa9\xe9\x62\x7e\x47\x8b\xb1\x51\x29\x8f\x1a\xc6\x97\xa1\x00\x25\x20\x15\x61\x9c\x96\x2b\x4b\x18\xde\x68\xe3\x7a\x63\x7b\x12\x1f\x87\x2d\x9c\x46\xeb\x24\x7d\x21\xb1\x80\xe3\x52\x59\xdf\xfc\xf9\xd8\x71\x4b\xc7\x3f\xe4\xd7\x62\x07\xfb\xa9\xff\x85\x87\x8b\x8a\x27\x9d\x1d\x54\x52\x7d\x51\xfe\x5b\xad\x81\x34\xee\x24\xae\xd2\x11\x1d\x28\x6d\xaa\x49\xd8\x64\x98\x20\x63\xfe\xf1\x68\x1f\x1c\x15\xd6\x8c\x1f\x86\x0f\xd9\xc9\xda\xc3\x4e\xd3\x29\x4a\xd1\xee\xbd\x2a\x8c\x36\xba\xeb\x46\x5d\xa5\x6e\x0f\x25\x2d\x82\x06\x1c\x60\x12\x47\xb2\xe1\xd6\xe3\xd6\xc3\x15\xee\xff\x1d\xb0\xca\x84\x45\x01\x5d\xb6\xa4\x8e\xbc\xbc\x5c\xbd\x13\x5e\x7e\x8c\xb7\xfc\x37\x55\x6f\xc0\xe2\xbd\x7c\x57\x73\x9a\x7a\x19\x43\x10\x69\x81\xe2\xa7\x82\x48\x8c\x61\xa1\xeb\x57\xf9\x3a\x6e\xd5\x66\x83\xb7\x67\x38\xa1\x04\x5c\x77\xcd\x07\x97\xb4\xf1\x4e\x8c\x65\xab\xd7\x24\x2a\x5e\x47\xc7\xca\xd6\x25\x86\x3b\xb6\xbb\xa6\x40\x79\x43\x2e\xc6\x38\x68\x2f\xbd\x0d\xc7\x27\xba\x81\xb1\x09\xc0\x53\xe6\x93\x8e\xf2\x21\x8e\x5a\xaf\x42\xd6\x77\x69\xa5\xd7\x2d\x8e\x74\xe9\x48\x29\xaf\x24\x41\xad\x56\x5d\x91\x8a\xfa\xa9\xe4\xb2\x7e\xdc\xc2\x18\x0f\xb3\x8d\xfd\x1b\x48\xc4\x54\x9a\x33\x66\x24\x31\x90\x06\x9d\x31\xbc\xae\x28\x81\x14\xaa\x62\x04\x3d\xf0\x89\x68\x6c\x91\xa4\x3b\x7e\x99\xc8\x68\x4c\xcc\xb0\x74\xba\xb8\xc6\x51\x26\x91\x62\x4c\x8c\xeb\x40\x3a\xe1\xea\xdd\xc6\xfe\xa4\x0a\xeb\xb8\x4e\x01\xbf\x70\x1a\x51\xea\x0d\x8a\x5a\x23\xe8\xb8\x34\x8b\x5a\x6d\x6a\x50\xda\x21\xe3\x36\x27\xa6\xc4\x13\x0a\xec\xda\xf4\x73\xe0\x96\x52\x47\x46\x61\x54\x64\xfc\xec\x56\xd4\x01\xa2\xbc\xe4\x64\xd0\xd4\x62\x07\x67\x21\xc0\x2a\xda\x25\x81\x26\x35\x4f\x06\xa9\x13\x39\x87\x82\x3f\xe3\xbc\x6b\xd7\xdb\xa3\x17\x44\x94\x47\x82\xa4\x24\x77\xed\xa5\xd0\x5a\x3d\xdd\x9e\x7f\xca\xd8\x2f\xb6\x4f\x95\xb6\x24\x98\xbd\x68\x50\x35\x1d\x79\x5e\x0b\x51\x3a\x37\x15\xc8\xc8\xda\x38\xce\xe1\x60\xc3\xf9\x37\xc1\xee\xcc\x4f\xbb\xf5\xff\x79\xec\xcf\x5f\xd3\xd3\x6e\x1e\xc2\x8f\x47\x86\x87\x87\x8f\xa0\x38\x71\xa4\x5a\x29\xd9\x65\xfc\x58\x94\x31\xb1\xa6\x5e\xc2\xce\xc1\x98\xde\x97\x56\x52\xa4\x39\xa4\x95\xc6\xf5\x22\xf8\xcc\x49\x3f\xcd\x34\x0c\x26\xcf\x83\x8b\xcf\xae\xc1\x32\xf4\x84\x3a\xc7\xb3\x0b\x15\x5b\x85\x75\x4b\x6e\x8f\x07\x97\xe9\xc9\x28\xb0\xab\x44\x14\x48\xec\x34\x03\x39\xd0\x17\x2b\xe4\x16\xf1\x25\x05\xae\x66\x12\x84\xbd\xcc\xd8\xbf\x4c\x9e\x60\x47\xaa\xba\x53\xb6\x0e\xfc\x83\xc1\x90\x88\xa5\xc4\xd0\x62\x53\xe1\xe2\x8d\xd6\x83\x2d\xd8\x2f\x83\x74\x23\x89\xa6\xcd\xc4\x78\xfd\x89\x36\xe8\x7d\xb9\x5b\x2e\x8d\x50\x2a\x3e\x5a\x16\xd9\x17\x2c\x51\xa8\xc1\xd5\x63\x48\xcd\xd5\x29\x9b\x8b\x8d\x74\x90\x9c\x7a\xb2\xaa\x05\x11\x14\x98\xcf\x8c\xe4\x86\x24\x45\xe5\x46\x38\xd0\x6b\xb6\xb5\x71\x19\x90\x54\xde\xa2\x70\xe2\x2c\x8a\x4b\xd1\x01\x6e\xda\x85\xd3\x0b\xcd\x5c\x7f\xc9\xe7\xe7\x1d\x0b\x60\x38\x11\x7c\x83\x2f\x12\xbf\xe5\x1f\x07\x01\x72\xfb\xdf\x18\xef\x17\x2d\xf6\xdf\xfc\xb5\xc5\x46\xf7\x5f\x5b\xca\xa3\xf3\xd7\xf4\x20\x0d\xff\x55\x1e\xe2\xbf\xb6\xaa\xe5\xe8\x6f\x76\xfd\x17\xdb\x88\xfa\x49\xc6\x67\xfc\x29\x4a\xf5\x01\x58\x3e\xe7\x6f\x76\xb1\x27\x6d\xfb\xb2\xc9\x6b\xcf\xd8\x59\x4d\x7a\x85\xef\x4f\x40\x72\xfe\xa6\xac\x04\xd7\xa7\x3c\x31\xc9\x42\x9d\x3f\x79\xee\x95\xc9\xe1\x08\xcf\xb3\x70\x5a\x82\xca\x73\x3c\x68\xc2\x3c\xe0\xc6\x0c\xe4\x8b\x21\x0d\x52\x25\x22\x49\x9d\x17\x7e\x32\xea\x61\x92\xe8\x69\xbe\x8d\x88\x5e\x2a\x33\x23\x90\xdd\x3a\xe8\x26\x72\x89\x38\xa1\x3a\x38\x80\x5b\x62\x3f\x77\x75\xf5\x53\x9a\x7a\x76\x76\x37\x2e\xee\x38\x1b\x29\xcf\x0c\xa8\x1d\x89\x9f\x12\x5b\x0c\x3e\xea\x11\x95\xd6\x59\xaa\x45\xc6\xe4\x18\x97\x71\x67\x58\xac\xc2\xde\xbf\x37\xce\xc1\x74\x62\x0b\xcc\xed\x71\x30\x38\x09\x03\x97\x28\x8b\xe7\x7c\x4e\xd2\x9c\x81\x7c\x19\x33\xff\xb7\x6f\xef\xb4\x47\x2f\x9b\x4b\x34\x54\x72\x47\xcc\x48\xa6\x9c\x8e\x56\x05\xde\x34\xa7\x14\xc1\xaa\xe8\xae\xa9\xa0\x11\x98\x78\x25\x19\x50\xc1\x99\x31\xce\x6b\xdd\xbe\xbe\xd3\xda\xa8\x29\x19\x66\x0a\x03\xe3\x2f\xae\x32\x97\x80\x21\x99\x2f\x4d\x99\xba\x33\x0e\xd6\x89\x6e\x2a\x4c\x9d\x31\x52\xe4\xe3\xd6\xf3\xb5\x60\xba\x16\xd4\xef\xc7\x96\x89\x62\x7c\x44\x53\xc2\xa4\x88\x94\x84\x0d\xeb\x70\xba\x07\x72\x4e\x37\xc7\x14\xd7\x82\x99\x8e\x27\x69\x53\x8a\xc7\xff\x4c\x5e\x14\xf1\x20\xa5\xb1\x99\xc7\x83\x94\xc6\xf0\xf4\x3d\x82\x95\x76\x36\x15\x05\x2b\x8d\x6d\x52\x67\x18\x52\xb3\x6a\x7a\x1c\xd2\xf4\xad\x4b\x04\x25\x7e\xe7\x56\x77\x09\x54\x1c\xd5\x8b\x3c\x2e\x94\xee\x2b\x11\xae\x38\xa1\xfb\xe9\x2a\x65\xa4\x75\xab\x75\x31\x1d\xc3\x35\xdc\x30\x8a\x4e\x5f\x5f\x4f\x6f\xc5\x1d\xf6\x30\xd0\x27\xa6\xff\xcd\x36\x6b\x33\xad\x95\x3d\xb9\x86\xa9\x9c\xdf\x6d\x67\x9b\x80\x77\x4f\x6a\xed\x9d\x5b\xfc\x95\xbd\x05\x24\x80\xb6\x78\x3e\x52\x01\x39\x11\x26\x32\xa6\x92\xcf\x15\xf0\x4d\x88\xbe\xc4\x6d\x30\x28\x25\xaa\xc4\xbf\x28\x4a\xa9\x97\x15\x46\x95\x58\xd4\xe6\xcb\xa7\xad\xd5\xba\x01\xe7\x0d\x95\x80\xdd\xe5\xfc\xbb\xf5\x73\xc1\xc4\xb3\x70\x6d\xb9\xb5\x32\x6f\x40\x54\xcb\x4e\x9f\x03\x52\x3b\xc1\x40\x7d\x0c\xca\xb7\x32\x0f\x7c\x87\xc0\x60\x1f\xb2\x1d\x63\x4f\x61\x9d\xf5\xe5\x6d\x89\x07\x3b\x3b\x6a\x82\x24\x4e\x71\xb6\x8d\xd8\x86\x4a\x73\xa7\x2a\x1c\x26\x57\xd3\x70\xe6\x12\x48\x3d\xd1\x9d\x0f\xa7\x34\x01\xc1\x51\x2a\x35\x84\xac\x37\x10\xa5\xc6\xf6\x54\xbb\xf6\x0c\x53\x06\xd3\x27\x0a\x47\xc2\x91\xf7\x39\xe8\x30\x47\x54\xa1\x32\x09\xba\x3f\x44\xef\xb1\xe1\x38\xd0\x2b\x71\x2c\xb1\xa2\x8f\xa8\xe5\xcb\xe3\x6b\x40\xc7\x8f\x45\x54\xe1\x16\x30\xee\xca\x60\xbe\x3c\x22\xfe\xa8\xc7\x50\x1f\xc8\x2f\x87\x87\xed\x0a\xbf\xc0\xa7\x98\x2b\xba\x15\xac\x8f\x15\x04\x4a\x3d\x0e\x57\x6f\x11\xb0\xd1\x8c\x8a\x2a\xd3\x93\x1e\x5d\x46\x95\x72\x2c\x20\xfa\x5b\x1e\x51\xe0\x21\x24\x48\x0d\x53\xac\xe4\xfb\x40\xd4\x9b\x9e\x68\xae\xbe\xd5\x1f\x61\x66\xaa\x5e\xfb\xf6\x2c\x57\x4d\xd4\x83\x0d\x45\xec\x6a\x3e\x7c\x88\xb1\x5f\xd5\x57\xf3\x11\x81\xfa\x96\x47\x11\x10\x73\x8b\x63\xe2\x12\x63\x98\x8d\x37\x93\xe8\x53\xfa\xfa\x99\x89\x0d\x87\x8b\xd1\x96\x26\x1d\x8a\xeb\x9b\x94\xbb\x8a\xdd\xc0\xf5\x38\xe8\xe4\x70\x12\xbe\x70\x7b\x56\xce\x8e\xb9\x02\x91\x1f\x1a\xf4\x1b\x6c\x9d\xe1\x31\x04\x9b\xd3\xcd\x2b\xcb\xc1\xe5\x51\x71\x79\x7d\xbb\x0e\x55\x39\x34\x60\x34\x15\xa3\x6e\xeb\xe1\xf3\xe6\x0b\xa4\x60\xad\x8d\xf3\x88\xa2\x94\x87\xd6\x74\x68\x12\xc5\x91\x72\x60\x63\x87\x26\xee\x02\x8d\x69\xdb\xe7\x82\xcb\x6b\x8d\xed\x1b\xe8\x8e\x56\x7b\x66\x76\xe4\xe7\x39\x31\x54\xfc\x29\x48\x54\x4a\x72\x88\xe9\x57\x1e\xab\xa9\x92\xe6\x0b\x3f\x3b\x6f\x86\x78\x42\xc7\x64\xf6\x4a\x07\x72\xc6\x6c\xa9\xae\x6a\x5e\x2d\xea\xa3\xbe\x4e\x58\xc4\x56\x9f\xd9\x41\x85\x3f\x26\xf6\x56\xa2\xf9\x64\x31\x6f\x0f\xc8\xc0\xb7\x67\x81\x7c\xe9\x42\x94\x83\x88\x5b\x27\xd7\x62\x20\xf2\xad\xdd\x09\xd4\xf8\x75\x62\x99\xf6\x18\xd6\xb1\xc7\xba\xa1\x9d\x51\x47\xc5\x7b\x54\x12\x67\x70\xf1\x7c\x13\x0e\xb0\x4e\xcb\xb4\xb3\xdd\x5a\xdf\x24\x8e\x51\x10\x2e\x3c\x3f\x87\x29\x8b\xae\x2c\x61\x48\xe0\x4b\x9b\xc1\xf2\x99\x28\x0f\x96\x5e\x82\x98\x43\xa1\xee\x15\x53\x98\x00\x0b\x9c\x7e\x12\xd0\xb7\x8b\x8f\x11\xc7\xe3\x4b\x1c\x26\x42\x24\x7d\x0c\x69\xfd\xe4\x00\x70\x8a\x0f\x7d\x12\x99\x41\x54\x90\x3a\x16\x2e\x1c\x03\x46\xdc\x38\x64\x74\x1d\xea\x43\x05\x30\x12\xbb\x35\x09\x99\xb8\x08\xcd\x1a\xa6\xf7\x21\x5c\x7e\x18\xe0\xf6\xfa\x59\x56\x9b\x10\xca\xa4\xdc\x7d\x1d\xad\xeb\x98\xcf\x66\xbb\x09\xd5\x5a\x12\xdd\xe3\x4e\x60\xd9\x98\x93\xb4\xc1\x74\xc8\x0b\x62\x4a\xf5\xad\xd7\x3e\xed\xf8\xa8\x3c\x5f\xd9\xe3\xf9\x7e\x0e\x70\x21\x0a\x62\xfa\x1a\x61\x9d\x7a\x5d\x83\x2f\x26\x31\x25\x78\x7b\xe1\x2c\x92\xfb\xcc\xf7\x6e\xa5\xff\x44\x94\xa5\x4d\x25\x90\x36\x32\xb4\x51\xa1\xce\xf8\x92\x80\x18\x5b\x45\x46\x37\xaa\x9e\x88\x57\xcb\x50\xed\x33\x7b\x92\xa3\xb5\x36\xd9\xdc\xbc\xd3\x5c\x5a\x47\x83\xd9\x93\xcb\xe1\xd9\x19\x0e\x56\x4b\x4f\x46\xa6\x29\x5d\xe0\x69\x15\xd1\x0d\x13\x4b\x89\xc7\x23\xe7\xdc\xa1\xa0\x6b\x5d\xdc\xdc\x32\x43\x20\x10\x22\x5d\x36\xb4\xd7\x98\x20\x0c\xe3\x41\x79\x70\xf7\xd0\x0b\xea\xd3\x35\x34\xd8\x91\xf7\x25\x2b\x0f\x29\xd3\x9c\xa7\xa6\x42\x09\xe6\x32\x14\xde\x48\x34\xe4\x18\x0b\x6d\x5a\x1a\xe3\xef\x89\x54\x4d\x93\x9d\x41\xe8\xb0\xc9\x98\x5b\xa5\xb4\x8b\x4b\xc4\x42\x08\x0f\x91\xfd\xa7\x75\xaa\xbb\x78\x96\x4a\xfa\xcc\xb8\x4b\x9f\x93\xd0\x9a\x08\xc4\x3d\x48\xe8\x6d\x03\x45\xa6\xdc\x3f\x27\x39\x33\xae\xbc\x81\xfe\x60\x97\xda\x8f\x64\x55\x74\x82\x3d\x6c\x3e\x0a\x67\x5b\x0b\x66\xee\xb7\x1e\x3e\xe5\x8e\xf8\x0d\x83\x74\x0d\x87\x00\xe8\xf8\x4e\xad\xbd\xbd\x2b\x11\x32\xa9\x7a\x2c\x6c\x23\x6b\x4a\x98\x18\x53\x64\x48\xaa\x39\x51\x63\x39\x43\x47\x6c\x6c\xae\x4f\x34\x5f\x5c\x47\x3d\x49\x6a\x92\x29\x03\xe7\xfe\xd5\x3c\x53\x46\x13\x07\x46\xe7\xd4\x9e\x65\x5c\xe3\xe7\x79\x44\x46\xd9\x8f\x62\x87\xc0\xd4\xde\x1e\xe0\x63\x97\x9e\x0c\xe9\x1d\x2e\x78\xe9\xc3\x8c\xc3\x46\xe4\xc8\x00\xee\x2a\x97\x8b\xfb\x1e\xa0\xe5\xcf\xf5\xde\x13\x04\xee\xe6\xbd\x97\x9e\xa8\x47\x08\x01\x25\xea\x79\x87\xae\x20\x6b\xe6\x63\xeb\x50\x24\xa4\x45\x1c\xef\x02\xfa\xee\xd0\xe3\x7a\x36\xda\xce\xf2\x33\x42\x8f\x77\xb1\xe6\xa6\xc6\x20\xef\x32\x42\x24\x0a\xcc\x92\x08\x26\x99\x81\xc8\xd3\x80\x55\xec\x55\x01\xff\xd7\xa2\x91\xa7\x99\xe2\x30\x0c\x2a\x25\x5e\x16\x23\x1f\xba\x23\x27\xac\x53\x1c\x03\x1e\x90\x21\xca\xc4\xb7\x35\x89\x80\x71\x7d\x24\x93\x44\xbd\x52\x9c\xaf\x85\xc9\x69\x8f\xfc\x3b\xe0\x0c\xe5\x8c\x98\xe3\x4c\x98\x74\xa0\x6a\xa4\x0f\xaa\x02\x27\x51\x53\xe9\xef\x98\x12\xc7\xcb\xf4\xe3\x26\x40\xf7\xd3\xdb\x1c\xff\x3b\x02\xa9\x50\x22\xe6\x2c\x7f\x4e\xd6\xe7\xc2\x78\x03\xdc\x53\x62\xc0\xb9\x8a\x8b\x5c\x23\x55\x6f\x3d\xb8\xd4\x9a\x78\x66\x8e\x91\x7d\x09\xb4\x17\x53\xa2\x6e\x36\x5c\xd8\x00\x5a\x9c\xe8\x9b\x0d\xcf\x59\x33\xb3\xa5\x2e\x83\xfb\x1a\x8a\x38\x35\xa2\xe0\x8d\x2a\x92\x1b\x8d\xd9\x46\xba\xce\x24\x67\x26\xbb\x02\xd2\xa5\x06\xc2\x82\x39\x3a\xa9\x82\xa9\xf0\x39\x31\x02\xd7\xcb\xf0\xdd\xd7\x83\xaf\xbd\x25\x15\xa1\x5c\x54\xfc\xdd\x1c\x44\xac\x00\x99\x17\x15\x62\xb1\xb5\x51\x43\x8e\x91\x68\x7b\x67\xb1\xe6\xd1\x8d\xdb\x04\x31\x89\x3c\x2e\x24\x96\xe7\xa5\x29\x09\x36\x0b\xb4\xf0\xe9\xe3\x94\x00\xbf\xdc\x6a\x2c\xb0\x63\xf0\xe4\x11\x86\x04\x36\x7b\x35\xcb\xdf\xa3\xdb\x7f\xd6\x46\x25\xce\xb1\xb6\xaa\x1e\xdc\x3f\xb9\xb3\xab\xfe\x25\x41\xa0\xd9\xbf\x59\xfe\x73\xfa\xc7\xec\xc8\x6c\x2c\x81\x81\xd0\xc1\xe3\xf7\x21\x26\x1b\x83\xf1\xae\xa9\x91\x94\x71\xa9\x68\xba\xd1\x9d\x6b\x86\xd5\x65\x18\x7d\x93\x30\x84\xdc\x21\x5c\x46\xa8\xeb\x75\xdc\xe5\x51\x4c\x7e\x19\xfd\xf4\xc1\x67\xdc\xe2\x7b\xde\x54\x1d\x11\x1d\xbd\x82\xd2\xa6\x5c\x91\xaf\x4d\x71\x37\xe1\xf2\x17\x23\x16\x3c\x32\xcd\x80\xf1\xb4\xf8\x84\x70\x51\x17\x27\xf5\xce\xd9\xa9\x08\xa2\xc4\x91\x99\x09\x2a\x4c\x7c\xa6\xa8\x94\xc8\xd0\xa8\xe3\xca\xdb\xd0\xd9\xad\xd1\x9a\x0a\x15\xc2\xab\x63\xd2\xec\x4e\x50\x33\xc1\x47\x6a\xf6\x0b\xba\x47\xf5\x06\x9a\x17\xd1\xc1\x64\xdc\x1c\x22\xd2\x4e\xe4\xb1\xcf\x04\xf7\x9e\x06\x17\x76\xd0\x3b\x22\x99\x1b\x35\x91\x98\xa5\x63\x9c\x5a\x5f\x49\x66\x88\xd8\xd4\xf4\x45\x6d\x1c\xf1\x0e\xf6\x4f\x63\x20\x67\x84\x81\x11\xc4\x8f\x94\xde\x7b\x26\x1a\xa6\xba\x43\xe9\x9f\xe3\x13\x02\xae\x96\x75\x14\x09\x52\x81\xc6\xfd\x99\x35\x54\x5c\xeb\x67\xc9\x26\x11\xf8\x3f\x37\x30\x53\xb5\xc6\x34\x27\x96\x38\x23\x9d\x46\xbc\xa3\x7b\x64\xb4\x29\x3d\x41\xe2\x28\xbc\xd7\x72\xf0\x00\x3b\x89\x07\xea\x62\x66\xce\x6b\xfa\x41\x09\x6e\xc9\xbe\xa1\xdc\x74\xa2\x41\xc6\xe5\x17\xde\x64\x16\x61\x14\xb1\x20\xef\x25\x12\xb5\x3a\xbd\x97\x18\x14\x75\x19\x89\xb3\x13\x39\x61\xc5\xce\x4f\xac\x69\xf1\xb5\x22\x27\x70\xbe\xf7\x62\xc5\x94\x7c\x0c\xc4\x34\x94\x8a\xd1\x0c\xa4\x32\x1b\x07\xd7\xae\xa2\xe3\x07\xb7\x6a\x90\xc2\x28\xe2\xb6\xe8\xe0\x29\x19\xdd\x58\xdd\x4c\xe6\x40\xfa\xe6\xef\x69\x63\x4e\x64\x30\x7f\x7d\xaf\x9b\xc7\x6c\x8e\x17\x80\x55\x7a\xd5\xbe\xb9\x0c\x52\x35\xa5\xba\xf6\x24\x4d\xa8\x84\xc1\x76\x0d\x77\x2b\xc5\xb9\x4a\x51\x4a\xaa\x5e\x29\xc1\x48\x85\x18\x3f\x4a\x31\xf7\x9c\xdc\x62\x6d\x1a\x93\xb5\x33\x04\xb1\x89\xfd\x59\x66\xa3\xda\x63\xd3\x40\xa8\xa4\x44\xfc\x29\xb3\xfc\xd8\x21\x9c\x99\x6d\xde\xdb\x96\xa2\x41\xb7\x8c\xdd\x49\xad\x26\xa6\x6b\x7b\x20\x23\x37\x5e\x06\xb6\x57\xe6\x31\xd6\x11\x3d\x04\xa3\x0f\xe1\xe2\x23\xfc\xe0\xbb\x3e\xe6\xd1\xda\xda\x6b\xad\xd6\x31\x62\x7d\x31\x13\x2d\x03\xe9\xa6\x31\x58\x69\x41\x35\x4e\xda\x6f\xa5\x2b\xd7\x60\xda\xc1\xdd\x8b\xee\x05\x95\x2a\x27\x6a\x8b\x1e\xdd\x90\x4a\xbd\xaa\xe6\x01\x83\x6d\xad\xcc\x37\x27\x6b\xe1\xd8\x64\x5a\xb7\xfc\xea\x8f\x5d\x50\xa8\x53\x5c\x4c\x1a\x03\x86\x8c\xe8\x25\x9d\x68\xef\x27\x16\x3e\x5e\x50\xde\xdb\xd1\x57\xd4\x24\x28\x07\xeb\xd8\x57\x4e\x89\xd6\xf1\x55\xb9\xc3\xa6\x7c\xe5\x30\xf6\xc9\xb2\xd6\x8b\xf3\xb1\x4f\xe1\xe3\x3b\x98\xb4\xfb\xf4\x76\xfc\xeb\xf2\x4d\x3e\xb0\x6c\x9e\xec\xe8\x80\xfc\x6c\x3b\xda\x21\x9f\xdb\x8e\xe9\xc4\xf3\x94\xc5\xcb\x68\x01\xd2\x07\xca\x6f\x1a\x3a\x6a\x18\x1a\xe7\x8e\x32\xca\x0c\x1a\x6e\xcf\x26\x0b\x0c\x96\xbf\xa3\x17\xf5\xac\x36\x59\xc0\x8a\xaa\x0e\x70\x6a\xa4\xb1\xb3\x13\x4c\x2e\x74\x2c\x0a\x1d\xe1\x8e\x76\x38\xfd\x6f\x6a\x0d\xd6\x55\x21\x15\x4b\x41\x4b\x51\x22\xf3\xcd\xc8\xea\x93\x34\x28\x6f\xd8\xa1\x9c\x05\xf3\x93\xb0\x8c\xa9\x10\x95\x2a\x1a\x6e\x31\xbe\x80\x51\x8c\xbe\x02\x18\xe6\x80\x72\xbc\xb9\x94\xcf\x03\xee\x6d\xe4\xff\x16\xd7\x38\xb1\x9b\xb9\x6f\x07\x56\x8c\xae\x58\xf6\x0f\x8e\x37\x20\x1e\x31\xcc\x13\x44\xd9\x09\x75\x7b\x72\x57\x3b\x65\x72\x1c\xc8\x47\x72\xa6\x32\xb7\xe9\x56\xd9\xd3\x40\x65\xbd\x7a\x8f\x06\x3a\x07\xa6\x9b\x80\x39\xbd\x73\x48\x74\x59\xe0\xb5\xe1\x9c\xb2\xe3\x83\x91\x6b\x68\xfd\x5a\xb8\x76\xe5\x1d\xf5\x12\x63\x30\x6b\xbe\x73\x00\x74\xe1\x96\xfb\xf9\x16\x8a\x0d\x80\x1f\x79\xb0\x56\x97\x2d\x7c\xea\xe2\x10\x77\x82\x83\xdb\x4a\xcd\xca\xfa\x7e\x2d\xc7\x07\xda\xef\xf8\xb9\xfe\x82\x1a\xe0\xa6\xbc\x6e\x92\x40\x3b\xb7\xce\x04\x8b\xfb\xe8\x4c\x7c\xe5\x55\x97\x2a\xa9\x8b\x83\x1d\x1a\x55\xa3\x44\x6e\x14\xb9\x25\xde\x7f\xc5\xa6\x47\xa5\x18\x70\xd1\xf3\x06\xc8\x2a\xcf\x8f\x0a\x25\x9d\xe8\x07\x3d\xf0\xf9\x43\x0e\xb6\x8b\x9e\x30\x64\xb8\xff\x40\x66\xf6\xd3\x6e\xbd\xb5\xbe\x12\x5c\x84\x23\x7b\x9d\xf3\xa4\xb0\xdf\xa0\xce\x7e\xda\x78\xb3\x24\xe9\xca\x45\x01\x31\x71\x60\xd7\xc9\xd9\x10\xc1\x36\x87\x93\xb6\xd5\x46\x33\x86\x23\x4a\x7c\x1a\x89\xd5\xb1\x24\x62\x7c\xbb\x7e\x81\x08\x5a\x9d\x9f\xee\xeb\x2c\xe0\x68\xd4\xd2\x49\xb1\xe9\x3a\x56\xf3\xed\x32\x7e\xb3\xe3\xc8\xd6\xad\xd6\xfd\x67\x8c\x24\x3e\x31\xcc\x5e\x95\xc0\xe1\x6f\xe9\xa3\x93\x2f\xc1\x66\xa0\xa7\xb7\xe9\xe5\x5e\xb1\x0b\x6e\xa5\x28\x19\xa4\x4a\xae\xe7\x13\x12\x72\x22\x88\x83\x9b\xd5\x63\xfe\xf4\xbd\x5b\x34\xde\xd5\x54\x8c\x31\x25\x9f\xd7\x98\xd7\x3b\x2a\x73\x2b\xb0\x56\xbe\x13\x79\xe9\x11\x55\x0d\x17\x4e\xb7\xe7\x2f\x9b\x24\x52\xb2\x86\xf7\xbb\x15\xb7\x0a\xb2\x9c\x2d\x96\x7d\x40\x2f\xf9\x40\x9c\x41\x7b\x7c\x26\xa5\x12\x88\x6b\x18\xfc\xbd\x4a\x71\x09\x44\xae\x1b\x7b\x00\x14\x43\xf2\x80\xc5\x2a\x11\x1f\xa4\xaa\xa0\xb2\xb8\xc0\x46\x04\xd6\x6a\x22\xe2\x9e\x43\x0c\x60\xf7\xd4\xf5\x6b\x46\x4d\xa9\xe3\xf6\xe2\xd3\x26\xca\x79\xcb\x7d\x5c\xe9\xe8\x63\xc8\xa5\xc7\xb5\x92\xa2\x3d\x87\xd3\x27\x69\xaa\x3d\x7e\x93\x83\x5a\xa3\xf5\x7e\x6e\xab\xb3\x6d\x35\x1e\xa9\xc2\x3d\xf0\x88\xba\x55\xe9\xab\xd8\x71\xf0\xf6\xf8\x64\x78\xa5\xb3\x07\xb5\x58\x03\x76\x7e\x28\xb6\x54\xd6\x17\xf0\xc5\xea\xbe\x60\x54\x21\x39\xf7\x58\x9d\xce\x05\x30\xeb\x38\x45\x90\x8f\x0d\xf8\xe6\xc3\xed\xf6\xfc\xa5\x03\xe0\xc9\x5b\x47\x4c\xa6\x62\x07\x83\x73\x63\xb4\xd0\xa5\xa2\x98\xb7\x8a\xf8\x98\x81\x17\xe1\x1d\xf5\xdc\xde\xff\xb2\x0b\x70\x69\x32\xc8\xe6\x74\xeb\xe9\x9d\x0e\x1c\xeb\x75\x5d\x1f\xe4\x31\x80\x06\x66\x95\x9c\x4e\x29\x56\x06\x79\x38\x5b\xc7\xf0\x93\x95\xb6\x68\x0c\x9c\x5c\x35\x13\xbd\xa4\x72\x27\x96\x61\xb2\x2e\xe8\xac\x52\x2d\xf8\x55\xa0\x38\xd2\xe3\x57\xc7\x30\xc5\x17\xc6\x77\x7b\x30\xd9\x7d\xaf\x3a\x2a\xa7\x77\xdd\xd9\x98\xd9\x46\x21\x5f\x18\xb0\x53\x46\x70\x14\xbf\xbf\x7b\x08\x1d\xd5\xbb\x8c\xa1\xb3\x39\xf3\x04\x55\x5c\x20\x3a\x48\xae\x7a\xab\x85\x93\x36\x26\x75\xf1\x06\x72\xe4\x70\x91\xde\x5e\x30\x31\x1f\xde\x02\xf9\xb8\x1e\x6c\x4d\xb5\xee\xac\x76\x34\x08\xf7\xe7\xa0\xed\xe7\xc9\x3b\x28\xbd\x01\xba\x40\xe1\xf6\x6c\xdf\x38\x17\x8c\x9d\x11\x31\x24\xd9\x8c\x8b\x6f\x1f\x73\x22\xe2\xc8\x69\x45\x86\xd1\x20\x0a\x28\x74\x9b\x0d\xb3\x04\xd4\xd1\x12\xc6\xa6\xe5\x5b\xbd\x30\x02\x0c\x22\x9a\x62\xd1\x63\x27\x36\x0a\x3a\xfd\x74\xa5\xc7\xd7\x98\x84\x3b\xa8\x4b\x74\xb5\xf5\xfa\x66\xfb\xc6\x32\x67\x73\x36\xab\x77\xd0\x58\xa6\x7c\xaa\x5a\xac\x27\x83\x28\x83\x84\x98\x46\x30\xa1\xda\x10\x3a\xe7\xc4\xea\x85\xd7\x1f\x05\xa3\x8b\x5d\xea\xa9\x41\x72\xb5\x94\xf1\x19\x95\xe3\x1b\x25\xd4\xac\x73\x80\x4c\xd3\x58\x4e\xe7\x57\x4c\x92\x3f\x19\xd0\xd9\x2e\xc5\x24\x77\x53\xa4\x27\x1f\x18\x6d\x2c\x32\xed\xb1\xcc\x18\x0b\x10\x59\xf1\xd4\x43\x7a\xf9\xa8\x18\x64\x0a\x71\x27\x7e\xbb\x52\x42\x61\x4d\x22\x55\x3f\x7f\x15\xb6\x8e\xbd\xe9\x60\xac\xfc\x55\xe2\x4f\xab\xbe\x79\xca\x5c\x44\x7e\xdd\x15\xbb\x1f\x55\x1d\xfc\xc2\xb8\x6f\x24\x1b\xcc\x5e\x94\xb9\xf0\x73\x80\xd5\x9d\xe0\xdc\x79\xb6\xe2\x4a\xee\xfe\x68\x5e\xa6\x73\x21\xd5\x49\x0f\x5d\xc5\x15\x4c\xe7\x24\x99\x06\x49\x23\xec\x7b\xc7\x2a\x0a\x10\x06\xa5\x8c\x32\xe8\x65\x39\x67\x9e\x09\x5e\x72\xfb\x1d\x91\xb5\x44\xab\x41\x52\xa4\x48\x5c\x0c\x38\x94\xf7\xbc\x61\x60\x25\x22\xaf\xe6\x05\x20\xfc\x40\x30\x50\xab\xfd\xf6\x66\x38\x35\x8a\x61\xec\x36\xce\xa3\x24\x27\xfb\xc9\x2c\x15\x9f\xfc\x28\x24\x17\x5a\x98\xd8\xa1\x85\x74\xa1\x49\x83\x61\x34\xaf\xc8\xd8\xc6\x0e\x26\x46\x25\x81\x1a\xcc\xff\x28\x89\xe1\x74\x3e\x49\x4a\x1a\x19\xe5\x90\xa4\xd4\x91\xf8\x2a\x5b\x63\x45\x47\x1d\xd6\xe5\xfd\x92\x1f\xa7\x59\x47\x3e\x12\xf2\x8f\x86\xdf\xa5\x25\x74\xff\x59\x5d\xe7\x06\x7e\x25\x2d\x60\xb6\x18\x8d\x45\x7a\x36\x80\x4e\x68\xaf\x33\x31\x0a\x66\x3e\xe0\xf4\xc2\x44\x68\x7d\xf9\x21\xa4\xcc\x09\x1d\x39\x54\xb1\x8a\x66\x0f\x30\x46\x0f\x84\x8d\x51\xeb\x6c\x6c\x8f\xab\xd6\xd5\x16\xa2\x81\x1c\x9f\xb6\x10\xf7\x6a\xe4\x33\xa6\x3a\x8c\x37\x46\xfc\x1b\xad\xde\x8c\x55\x77\x06\x87\xdc\x8a\xcf\x39\x16\x93\xdd\x1e\x90\xa7\x31\x75\xab\x95\x5d\xbb\x73\xc3\x52\xed\xbc\xba\x37\x75\x82\x7c\x07\x18\x72\x77\xb8\x2c\x79\x01\xd5\x7c\x1a\x3b\xd3\xcd\xb3\xf8\x8c\xb1\x43\xff\x2d\xcf\x7c\x25\x04\x00\x05\x8c\x0b\xc6\xea\xea\x85\xee\xbc\x3c\xbe\x45\xd5\xe9\xc5\x70\x02\x63\x2d\x32\xf9\x31\x53\x48\xab\x2c\xbf\xa3\xb1\x41\x60\x78\x0b\xf4\x55\x31\xc7\xd0\xaa\x9f\xd7\x63\xd0\x06\x66\xfd\xa6\xd2\x1c\x00\x1f\x0e\xb6\xb3\xe9\x61\x44\x61\x0f\x8c\x25\x89\x39\x1c\xf1\xca\x27\x23\x9c\xc1\x30\xf8\x3d\x69\x9c\x42\x1a\x0a\x4c\xa1\x90\x04\x68\x7a\x30\x68\x47\x1f\xaf\x87\x7d\x62\x44\xfb\x0c\xd4\x8c\x3e\x2a\x73\x0c\xcf\x81\x08\x32\x51\x3d\xa2\x7d\xf1\xee\x4c\xad\x68\x73\x6e\x0a\xa3\x54\x31\x68\x32\x40\x35\x7f\x4d\xcf\x7e\x9d\x34\xdd\xaa\xa4\x8b\x5e\x0f\xa7\x99\xf5\x24\xf9\x24\x8e\x84\xbf\x63\x82\x22\x4f\x52\x4e\x46\x5f\x63\x59\x0e\x69\xd8\x48\xcc\x84\xa4\xc5\x86\x6d\xaa\x6a\x61\xcc\x92\x5b\x78\x40\x22\x49\xaa\x57\xd3\x11\xb5\x94\xc2\x88\x1e\xca\xe8\xf9\x3b\x3d\x4c\xe0\xef\xf2\x30\x81\xbf\xdb\x14\xa1\x87\x63\xa7\x52\xd8\x15\xf9\x9e\xea\xd6\xc4\x57\x86\x31\xe0\x6e\xad\x52\x61\xb7\xa1\x78\x36\x48\x01\x98\x28\x1a\x4e\x9e\xef\x16\xdc\x52\xf6\x98\x7c\xb1\xbe\x91\x2f\x02\x19\x7f\xbc\xc0\xdf\x06\x40\x1c\x84\x7b\x7c\x27\x7c\xb8\x24\x0f\xba\xf8\x3b\x52\x02\xf9\xde\x7c\xf4\x24\x98\xb9\x2b\xdf\x49\xdd\x55\x84\x3b\x92\x54\x5b\x9f\x7d\x6d\x7e\x56\xd7\x83\x14\x06\x4f\xce\xa1\xcf\x6a\x0a\x80\x36\xc9\x2b\xb5\x03\x9e\x2d\x82\x96\xd8\x1d\x98\x70\xf6\x02\x48\xeb\x3a\xc2\x23\x87\x97\x43\x27\x06\xa5\x49\x6e\x6c\xad\xab\x88\x6c\xd3\xad\x95\x51\x89\xc5\x48\x64\xa0\xfd\xe8\x5a\x22\xd4\x08\x9e\x1e\xd9\x08\x64\x30\x28\x8e\xb3\x38\xb6\xb2\xe1\x83\x42\x28\x9b\x20\x30\xc5\xef\xf0\xbd\xba\x9e\x61\xde\xf7\x2b\x4e\x6f\xd5\xb7\xa3\x27\x6a\x9a\xaf\x08\x9e\x3e\x0e\x6b\x0f\xba\x02\xc6\x2c\x2d\x7c\x67\x02\x37\xdb\xbc\xb7\x2d\x82\x90\x70\x05\xa4\xb4\x5d\xc0\xc4\xe8\x5a\x40\x8a\x38\x97\x64\xdb\x7c\xac\xd0\xa7\x6e\xb6\x4b\xef\x5e\x95\x47\x19\x3c\xb8\x1c\x6e\xce\x74\x01\x02\x84\x28\x65\xdb\x37\x76\xf0\x81\xcd\x99\x97\xcd\x8d\xa7\xe9\x70\x1e\x0a\x70\xb8\x85\xd9\xcf\x6d\x38\x9e\x56\x54\x80\x0e\xdc\xbf\x87\x02\x58\x28\x4e\x33\xf6\xa3\x2f\x95\x39\x42\x61\x56\x27\x9a\xe6\x3c\x21\xc1\x82\x3a\x12\x6c\x4f\x13\x28\x3e\x97\x29\x50\x83\x78\x0d\xe6\xbc\x7c\xf6\x2b\xcf\xfa\xb4\x68\x1d\xfb\x54\x61\xfd\xa0\x3f\xc4\xe9\x97\x8f\x7d\x75\xfc\x1b\x8b\xf3\x2e\xc7\x0e\x0d\x42\x10\x76\x13\x40\x0a\x8a\x23\x00\xa1\xb9\x01\x10\xc3\x75\xf5\x62\x9f\xcf\x8d\x27\x07\xa7\xb9\xb0\x87\xeb\x3e\xbf\x91\x0e\x15\xe7\x8d\x64\x9f\xb7\xa6\x51\x29\x48\xd5\xc9\xd9\x8e\x9e\xc7\x10\x43\x81\x2f\x65\xef\x5d\x47\xad\x39\x95\x36\xde\x4c\x02\x4d\xe0\x97\x7b\x22\x88\xd5\xae\xb6\x16\x96\xac\x0f\x7e\xfd\x01\xba\x88\xb7\xaf\xd3\xb5\x61\x12\x9b\x9c\x8f\x39\x5d\x89\xd8\x58\xc7\xbf\x3c\x66\xa1\x1d\xed\xc9\x39\x35\xc7\x93\xce\x10\x02\xe4\xf0\xc5\x15\x32\xa1\x6f\xf7\x9a\x73\xf7\x09\x4e\x52\x55\xcb\x71\x47\x0b\xb1\x5d\x39\x85\xe1\x10\x09\x6b\xbe\xf9\xf4\x2b\x2b\xf6\x04\x33\xd6\x25\xc5\x1e\x56\x0c\x6e\x56\x1e\xf7\x93\x45\x8c\x31\x96\xe3\x18\x33\x8b\xab\x28\xa6\x33\x04\xc3\x24\x97\x72\x36\x80\xa9\x16\x23\xee\x95\x89\x9b\x98\xf8\x65\x71\x4d\x26\xcb\xb4\xb9\x89\x5f\xad\x49\x63\x93\x8c\x33\x46\xae\x14\x6a\xce\x31\xeb\x93\x4f\x72\x4c\xd2\x1c\xb1\xa6\xc6\x20\x92\x7c\xa9\x59\x41\x18\x9c\x94\x31\xc7\xbc\xdc\x30\x1b\x35\x81\xc4\x0a\x73\x4c\xee\xd9\xcb\x80\xe1\x78\xa8\x6c\x77\xeb\x04\x55\xb6\x66\x99\x3c\xf9\x85\x71\xc5\x14\x3f\x66\xd9\x7a\xe2\x5e\x1c\x79\x26\xc5\x8c\x67\xcc\x86\x89\xfc\x27\x01\x61\x64\x8e\xa2\xd5\x3b\x62\xa1\x27\x2d\x85\xe9\x88\xa2\x0e\x4a\x5e\x12\xb7\x62\x44\xbe\xb2\x3d\x81\x42\x9e\x35\x5f\x26\xf1\x99\x79\x57\x8e\x30\x45\x86\xcb\x1e\x73\x16\x26\x6f\xa3\x37\xa5\x83\xbd\x61\x03\xaa\xd2\x30\x2a\x73\xaa\xca\x2c\xce\x2a\x5c\x05\x94\x1f\x1a\x12\xc3\x10\x7b\xad\x31\x92\x1a\x85\xa7\x6c\x6d\x54\x65\xbf\x76\xa3\x8c\x1e\x31\x53\x19\x3d\x1d\x96\x12\xb9\x1e\xa5\x41\xbe\x24\xa5\xc8\xed\xeb\x2b\x39\x65\x1b\x13\x43\x90\xd3\x54\xf3\xf5\xf5\x70\xf5\x0e\xbe\x6d\x56\x75\x1d\x8f\x0e\x06\xea\x35\x49\x47\xd8\x2f\x91\x9d\x5b\xaf\xf1\xb9\x7e\x78\xf5\x7e\xf0\xf6\xaa\x02\xae\x54\x69\x53\x2a\x62\x8d\x12\xc6\xd7\x28\xa4\x6e\x44\x3c\x8e\x75\x43\xdc\x58\xc5\x75\x7d\x4e\x81\x2e\x22\xe9\xed\x37\x9c\x4a\x5a\x2f\x20\x5a\x60\x0b\x39\x4e\xc6\xac\x81\xdb\x37\x17\xc3\x31\x79\x05\xd4\x51\x05\x06\x9c\x84\xe7\x31\x77\x81\xe7\x84\xaa\xc2\xb0\x8c\x3d\x87\xf5\x15\xda\xab\x07\x8a\x51\xcb\x04\x79\x79\xae\x33\xd3\x20\x01\xe3\x3b\x16\xa0\xf3\x7c\x22\x74\x63\xde\x80\xda\xed\x63\xc7\xbe\xb0\xe2\x1b\x8d\x85\x9d\x5c\x95\x51\x48\x99\x2b\x73\x12\xdd\x30\xc7\xc8\x23\xba\x3c\x54\xb6\xec\x6c\x37\x76\xb7\x11\x89\x16\x62\xb5\x64\xb3\x3f\xa3\x7f\xcc\x02\xba\x11\x82\xa5\xdb\xe6\xb7\x12\xf9\x2c\x70\x11\x5a\xbd\x47\xf7\x12\x00\xc6\xaa\xdd\x7e\xc3\xd9\xe7\xcd\x62\x7c\x44\x47\x61\x2f\x78\x23\xc6\x2f\xe2\x8b\x39\x0a\x78\x91\x0a\xdb\x8f\x7d\x45\x90\xf8\xac\xe3\xca\x92\xf5\xcb\x0f\x2c\x28\x3f\xc2\xe5\xd6\x07\xbf\xb2\x3a\xeb\xc2\x85\xea\x0c\x56\x07\xf9\x7d\xa2\xf3\x37\x9b\xa3\xe2\xab\x0e\x31\xa9\xd3\x0c\x4a\xc6\x9b\x33\x1c\x03\xff\xa0\xaa\x5e\x4a\x2d\xbd\x61\xc5\x5e\x7d\x3a\x15\x3b\x16\xdf\x34\x00\x30\xc2\x00\x60\x71\x0c\x3b\xa0\xb8\x93\xef\x8c\xca\xf8\x5c\xab\xaa\xf1\xa3\x0d\xc5\x84\x4e\x91\x47\x41\xec\xf4\x40\xb1\xe7\x95\xf8\x00\x1d\x3b\xf6\xa5\x95\x38\xa5\x51\xa9\xba\xa6\x31\xac\xf1\x99\x31\xb8\x8b\xad\x43\x98\x96\x07\x43\xae\x1e\xb2\xd4\xf3\xd1\x09\xa3\x22\xef\xae\xea\x35\xbe\xf6\x52\x6c\xb4\xc9\xa6\x28\xeb\x90\xf7\xd7\x12\x08\xf7\xbf\x3d\x44\xce\x46\x87\x7c\xa7\xd8\x7b\x08\x9b\x35\x49\x9d\x43\xcf\xbc\x0c\x5a\x17\x5f\x4a\xad\x46\xb2\x91\x57\xd3\xf1\x01\x45\x7d\xa4\x38\x37\x34\x50\x92\x3b\x72\x07\x41\x52\x97\xb4\x90\x23\xaa\xc6\x6f\x80\xf5\x20\xf0\x9d\x23\xc3\x89\xa5\x5c\x82\x27\xf3\xd3\x49\xae\x12\x4e\x4d\xb4\xeb\x73\xd1\xa0\x38\xd9\x90\x4a\x3e\xc4\x2f\x28\x77\x5f\x07\x8a\x8f\xe5\x17\x9f\x0a\x9c\x46\x2e\x6a\x30\x1e\xac\xbc\x5e\x98\x99\x6d\x9f\xbb\x94\x1c\x72\x02\x7b\x9b\x2b\xa3\x48\x8f\xe5\x75\x2b\x62\x63\x7b\xee\x75\xb0\xbd\x12\xc7\x61\x61\x4c\x0a\xf9\x21\xe0\x4f\xf3\xc2\x0f\x31\x8b\x83\x2f\xed\x68\x61\xf5\x15\xc0\x4f\xf3\xf1\x6d\x5d\xae\x44\x46\x6d\x56\xd9\x88\x17\x06\x05\x76\x45\x3b\xf9\x5c\x9d\x73\x8c\xca\x94\x3d\xdb\x8f\x24\x18\xa3\x72\x7b\x1c\xf7\x8b\xe5\x97\x64\x65\x55\x5b\x05\x13\x91\x8d\x8e\xfc\x30\xe2\x9b\xfd\xd7\xaa\x5d\x85\x66\xed\x72\x3f\x9e\x7e\x8a\x7b\xc3\x93\xd5\x6b\xc4\x8f\xe7\x49\x9b\x0a\x57\x8d\x04\x2f\x68\xbd\x1a\x03\xc1\x41\xef\xe7\x3b\x79\x3e\x73\x5f\xa2\x9b\x56\x76\x26\x36\x20\x81\xd0\x04\x98\x96\x35\xbe\x9a\x02\xa2\x76\x0f\xce\x80\x2b\x7b\x66\x7d\xf1\x87\x2f\xff\x6c\x09\x4f\x13\x87\x66\xf9\x89\x15\xa1\xb5\xb1\xf8\x11\x17\x10\xa2\x10\x3c\xa6\x34\x3a\x21\x50\x44\x0c\xa2\x86\xd8\x4b\x43\x9f\xae\x72\x91\xe9\x2e\x89\x39\x0c\xc5\x74\x57\x34\xae\x02\xa8\x61\x72\x7d\x94\x59\x32\x2b\xc9\x28\x66\x55\xdc\xfc\x8e\x9a\x94\x5a\xb2\xa3\xb6\x47\xc9\xf3\x18\xcc\x38\x99\xc8\xab\x52\x0b\xf8\xd4\x13\x1b\x24\x9f\x79\xc5\x5a\xd0\x15\x29\x5b\x60\xfa\x9a\xc4\x37\x82\xc1\x52\xf7\x41\x81\xb0\x8d\x46\x5a\x62\x43\x4c\xbc\x0d\x06\xc8\x17\xe1\x8c\xc0\xa2\x09\xc4\x28\xda\xc6\x8d\xcb\x91\x81\xc8\xd4\x79\x2a\x5f\x12\xa8\xe0\xe2\xaa\x71\x14\x74\x47\x65\xd5\x48\xed\x2e\xc6\x93\x5d\xbf\xda\x7c\xbc\xd2\xd8\x7a\x66\x90\x37\xf6\x94\x54\x97\x3b\xff\x4c\x5e\xf0\x02\x34\x54\x71\x4f\x39\x45\xca\x23\xca\x60\x1c\xd8\x88\xf3\x02\x13\xa4\x82\xd0\xe4\x52\x01\x24\xa6\x09\x07\xcd\x11\x31\xe6\x28\xfd\x6d\xc5\x11\x4c\x68\x05\x9e\x67\x86\x95\xf5\x64\x2e\xde\xe2\x3a\x0a\xb8\xbf\xa0\x17\x23\xc5\xc6\x12\x5b\x17\x35\x93\x92\xd3\xc7\xd6\x5b\x3d\x15\xcc\x6b\x73\x71\x2f\x0e\x3d\xe0\xfb\x43\x9e\x04\x8f\xe1\x1b\xe8\x8b\xe3\xc7\xbf\x39\x96\x98\x45\xd4\x96\x4c\x25\xd6\x94\x5e\x19\x87\xcc\x72\x6a\x61\x82\xc5\xf9\xe6\xc4\x78\x7c\x55\x14\x88\x5c\x39\x02\x13\x3f\xca\xea\x0c\xf7\x57\xf8\x75\x8f\x3a\xc7\x7f\x94\xdf\x16\xbf\xef\x49\xac\x63\x9f\x5d\x44\x17\x2b\x4c\xbf\xc7\xb5\x24\x4c\xf5\xe7\xea\xbb\xf5\x29\x7d\xf7\xf4\x70\x51\x4f\x2d\x43\x45\x9d\x34\xc5\xba\xed\xaf\xf2\xe5\x63\xc2\xa8\xf1\xd0\x73\xfe\x01\xa7\x7f\x80\x62\x57\x67\x3f\xe3\xcf\xd6\x67\xf8\x60\xfd\xd8\x48\xd9\xcf\xff\x68\x7d\xa1\x4a\xcd\xfa\xa8\xe7\xa7\xba\xc8\xbc\x7b\xd9\xaf\x00\x8e\xea\x7c\x49\xae\x07\xbf\xc4\xec\xfa\x79\xcc\x81\xde\x5f\xe2\xc7\xeb\xbf\xea\x5a\x19\x63\x7b\x54\xe0\xde\x40\x1d\xa9\x6e\xe6\xa8\xfe\x96\x68\x0b\x6b\xa4\xb7\xc5\xaf\xe5\x75\x0b\x9f\x93\x0f\xc6\x2f\x39\xc6\x1f\xbd\x97\x8f\x55\x03\xdc\xcb\x57\xfa\xbd\xec\x1f\x8f\x5a\x9f\x56\xfa\xab\x94\xa2\x32\xd6\xac\xd3\x5f\x51\x8e\x05\x78\x1b\x7c\x45\xbf\x11\xe1\x8e\xf3\x97\x38\x30\x45\x9f\x8f\x60\x29\x60\xb1\x78\xae\xa4\xc0\x17\x4a\x98\x6e\x56\x81\x1f\xc5\x5f\xd6\x9f\x75\x30\xe4\x94\x0a\x14\xe2\x47\xc1\x53\x74\x9f\x03\xc1\xc5\x26\x88\xc0\x30\xbf\x4e\x50\x53\x34\x51\x07\x9e\x5e\xa7\xc7\xf1\x1a\x8b\x89\xdd\xe3\x42\x61\xf8\x94\x5f\x6d\x4f\xa1\x82\x81\x2b\xe1\x7f\x16\xbb\x1e\xea\x02\x22\x0f\xfc\x4d\xa8\x83\x2a\xf1\x80\xa4\x15\xab\x25\x5d\xba\x31\x11\x5e\xb8\x14\xd5\x93\xf4\xa3\x68\xf8\x34\xdd\x5e\x54\xb9\x99\xb8\xb4\x1b\x8c\xfd\xa3\x5d\xa8\x46\x0e\x21\xa6\x1d\x34\x6a\xc6\x65\xf7\x23\x2a\x6c\x6c\xad\xb7\x6b\xcf\x9a\xab\x93\xba\x5c\x5e\x96\xe3\x37\x95\xaa\x47\x0d\x1f\xe5\x21\xca\x37\xf4\x60\xf2\x80\x7e\x49\x98\x32\x07\xa7\xbc\x94\x95\xaf\xaf\x24\xc7\x40\xd9\x27\xcd\x71\x59\x41\x53\x98\x89\xa2\xed\xe3\xfd\x27\x31\x05\x24\xde\x04\x41\xb7\x1e\x3e\x0f\xcf\x8c\x69\x68\x64\xbd\xd0\xd3\x58\x98\x02\xdd\x25\xa5\x1d\x46\xdb\x7b\x96\x93\x94\xe3\x8b\xd6\x33\xab\xba\x1c\x66\x1b\x41\x48\x66\x70\x4e\x93\x41\xd0\x1a\xce\x29\xb3\xd8\xc9\xd0\xf4\x94\x9c\xc4\xce\x04\x98\x68\x56\x18\x0a\xaf\x53\x8e\x67\xc2\xe9\xd1\x6f\x8f\x25\xe1\xa8\x53\xd3\x07\x93\xf5\x57\x0a\x8a\x25\x1d\xfa\x26\x62\x8e\x59\x92\xfb\x48\xc4\x74\x73\x32\x3a\xbf\x92\xfa\xe6\x0e\x25\x97\x44\x8d\x51\x59\x84\x8c\x1d\xe8\x50\x9c\x7c\xcf\xcb\x7a\x42\xbd\x53\x26\x9b\x99\x44\x4c\xd8\x3e\xa7\x2d\xa1\xf1\x48\x48\x9c\xb0\x36\x53\xb1\xcb\x3a\x76\xbb\x24\x22\xb8\xb8\xa7\x03\xb4\xeb\x74\x76\x1f\x45\x99\xf5\x30\xb0\x60\xd7\xfc\xbf\x19\x9d\x3f\x15\xdd\xfb\xf9\xf9\xc2\xf6\x39\x2b\x91\x21\xd0\xab\x14\x3e\xec\xc8\x1c\xac\xb3\x0b\x4a\xee\x42\x60\x96\xe2\xd5\x10\xf8\xdf\x55\x37\x3c\x53\xce\x3e\xfb\x43\x34\x57\x32\x04\x99\x13\xfd\x90\x4d\x44\x1f\xf2\x94\x7f\xa1\x73\xb4\xfe\x90\x31\xd3\xe5\xfe\xc0\x81\xc7\x24\x21\xc2\x7b\x55\x8f\x25\xca\xfd\x41\x05\x2c\xfb\x39\x2d\xc8\x1c\x12\x59\x17\xf5\x54\x8c\x80\xfd\xb1\xf6\x24\xbd\x62\x97\xf9\xc4\x5b\x93\x69\x0d\x99\xb1\xd6\xde\xa7\x2d\x99\x5c\xbc\x31\x3d\xc7\x9f\xdd\x5c\x3c\x59\xf0\x0f\xec\x20\xff\x33\xb7\x2b\x25\x6b\xdd\x0f\x92\x61\xee\x5f\x58\x2c\x1d\xda\x99\xcf\xca\xe6\xb8\x71\x4a\x18\xe5\x35\xbe\xeb\x88\xf6\xa9\xe7\x87\x02\xc5\xf9\xf9\xfe\x08\xd9\xd9\x63\x3e\x36\x0a\xc2\xf7\x58\x86\xe0\x74\xec\x36\x0e\x91\x4a\x28\x4a\xb9\x20\x25\xd6\xad\x0a\x11\x44\x51\x33\x55\xac\x4d\x4c\xf9\xb9\x39\x0d\x44\xc0\x77\xdd\xd2\x89\x4c\xbe\xdf\xcd\x62\x08\x9a\x89\xe9\x4c\x5f\xc5\x1d\xa4\x87\xa1\x1c\x92\x26\x43\x6f\x44\x67\xf6\x83\xc5\xd5\xcc\x47\x5e\xf6\x23\xab\xf9\xe0\xd2\x61\x2f\xf3\xd1\x20\xfc\x89\xa6\x85\xd9\x6b\xf8\x6b\x00\x7f\x6d\xce\xc0\xa5\x80\xbf\x8a\xf8\xeb\xde\x43\xfc\x73\x18\xff\xbc\xb8\x4a\x35\x80\xb0\x7e\x64\x85\x8b\x75\xfc\x31\x82\xdf\xdf\xbc\x38\x8c\x69\x70\xe0\x4e\x2e\x52\x5a\x59\x6e\x9a\x53\xd3\x70\x9e\x59\xd5\xc1\x80\x5b\xad\xf0\x17\xd5\x49\x31\x3f\xc2\x1f\xa8\x9f\x61\xdb\x3e\xc9\x3f\xa9\x2f\xe8\xca\x1f\xe0\xbc\xdc\xd4\xdd\x88\x9d\x97\xea\xd4\x65\x25\x3f\x9c\x53\xdd\x42\x9f\xf4\x5b\xf5\xca\x5d\xc2\xc2\x14\x2b\xee\x10\x26\xb3\x38\x91\x51\x69\xaf\x54\xbe\xab\x70\x72\x3e\xbc\xf1\x9c\x75\x9c\xf8\x0a\x9e\x5f\x48\xd7\xe7\x83\xf9\x8d\xf0\xf2\x79\x0c\x92\x76\xfa\x79\x46\xe5\xac\x73\xca\x43\x55\x15\xde\xf2\xf4\x2a\x27\x6c\x64\x10\x8c\xc1\xc5\xb9\xf0\x55\x72\xd9\x0c\x29\x53\x31\x48\x52\x2f\xf2\x2d\xdc\x01\x29\xd1\x7e\xda\xad\xff\xfd\xef\xc4\x06\x3a\x7f\xb3\xff\xf1\x0f\xeb\xab\xdf\xff\xb4\x3b\x01\x02\x7c\x7b\xf4\x02\xe2\x0e\xfb\xae\x90\x41\xc5\x80\x07\xfe\xf1\xf3\x44\x95\x8c\xbc\xb7\x22\x67\x0b\x79\x67\xcc\x5d\x67\xfe\x77\x00\x00\x00\xff\xff\x16\xb6\x52\xbe\x0b\xd1\x00\x00") - -func confLocaleLocale_zhHkIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_zhHkIni, - "conf/locale/locale_zh-HK.ini", - ) -} - -func confLocaleLocale_zhHkIni() (*asset, error) { - bytes, err := confLocaleLocale_zhHkIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_zh-HK.ini", size: 53515, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confLocaleLocale_zhTwIni = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\xbd\x69\x6f\x1b\x57\xb6\x28\xfa\x9d\xbf\xa2\xae\x0f\x82\xf4\x01\x3a\x0a\xd2\x7d\xdf\x80\x8b\x30\xf7\xa5\x93\xee\x4e\x3f\x24\xe9\xbc\xb6\x1b\x07\x17\x81\xc1\x50\x64\x49\xaa\x63\x8a\xa5\x66\x91\x76\xd4\x07\x07\xa0\x6c\xcb\xa2\x26\x4b\x1e\x24\x5b\x96\x6c\xd9\xf2\x24\xcb\x96\x2c\xcf\xb2\x26\xff\x97\xd3\xac\x22\xf9\x29\x7f\xe1\xad\x69\xef\xda\xbb\x58\x54\x9c\xc6\x7b\xf9\x10\x8b\xb5\xd7\x9e\xf7\x5e\x7b\xcd\x2b\x3f\x32\x92\x2b\xba\x41\x21\x1b\xae\xee\x46\x8b\xfb\xce\x1f\x7d\xa7\xbd\x71\xab\xbd\x5e\x6f\xdd\x38\xdf\x9e\xd8\x08\xa7\x1e\x39\x7f\xf4\xaa\x4e\xb4\x32\x1b\x4e\x2f\x65\x32\x43\xfe\xb0\x9b\xed\x3c\x58\xec\xdc\x1e\xcb\x14\xf3\xc1\x50\xbf\x9f\xaf\x14\xb3\xd1\xc5\x87\x61\xe3\x75\xe7\xe6\x5a\x6b\xb2\x91\x71\x7f\x1c\x29\xf9\x15\x17\x3e\xae\xb5\x5e\xae\x65\x86\xdc\xd2\x48\xb6\xbd\xb1\x11\x5d\xbf\x98\x09\xbc\xc1\x72\xce\x2b\x67\x5b\x4b\x7b\xe1\xf8\x7d\xfe\xe9\xd7\xaa\xf4\x7b\x62\x97\x7f\xd7\x00\x7a\x7d\x2f\xbc\x30\x95\xa9\xb8\x83\x5e\x50\x75\x2b\xea\xf7\x19\xb7\x3f\xf0\xaa\x6e\xb6\xf5\xfa\x79\xeb\xf1\x52\xe6\xb4\x5b\x09\x3c\x1f\x1a\x9b\x6c\x44\x2b\x4f\x32\x23\xf9\x41\x18\xd9\xed\x31\x18\x45\xa6\xea\x0e\x8f\x94\xf2\x00\x1a\xad\xdf\x8d\x6e\xbe\xcb\x94\xf2\xe5\xc1\x1a\x96\xf3\xd4\x32\x85\x8a\x0b\xa5\xb9\xb2\x7b\x26\x1b\x4e\xbe\x0a\xf7\x76\xfb\xfa\xfa\x32\xb5\xc0\xad\xe4\x46\x2a\xfe\x80\x57\x72\x73\xf9\x72\x31\x37\x8c\xb3\x68\x5d\x5d\x8f\x1a\xaf\x9b\xef\xee\x44\x63\x4f\xc3\xb9\xa9\x68\xf9\x65\x78\xef\x06\x8d\xd4\x2d\xc2\x54\x72\xf9\x20\x1b\xbe\x79\xce\x13\x62\xd8\x0c\xb5\x54\xce\x0f\xab\xca\xe1\xfc\x6c\x6b\xfd\x59\xc6\x1d\xce\x7b\xa5\x6c\x67\x79\x2f\xdc\x9c\xef\x9c\x7b\xd5\xdc\x7b\x0d\x63\x0e\x82\x33\x3e\x2c\x60\xf8\xf4\x42\x6b\x6d\x1f\x66\x9c\xab\x8e\x8e\x40\xbd\xb5\xdd\xf6\xc6\xac\x7c\x2c\xe4\x47\xaa\x85\xa1\x7c\xb6\xf3\xe8\x5a\x7b\x73\x12\xbf\x00\xdc\x88\x0f\x4b\xe1\x57\x46\xb3\xe1\xf9\xe7\xe1\xe6\xf5\x70\xf7\x71\xc6\xaf\x0c\xe6\xcb\xde\xdf\xf3\x55\x5a\x94\x57\xe7\x5b\x6f\xaf\x66\x86\xbd\x4a\xc5\xaf\x64\x3b\x73\x77\xc2\x73\x73\x19\x98\x6f\x0e\xab\x66\xa3\xc5\xed\x70\xed\x56\x5c\x15\x0b\x86\xbd\xc1\x0a\x2e\x59\x67\xec\x4d\xeb\xe1\x5e\x78\x6f\xb1\x73\x6e\x3d\xac\x4f\xc6\xc5\xd4\x12\xd4\x34\x1a\x1b\xf0\x2b\xa7\xa4\xb1\xd6\xfa\x74\xb8\x3f\x07\xd0\x61\xe3\x42\x74\xf5\x29\x15\xc3\x88\x54\xa9\x0c\x27\x5f\x86\x5d\xa0\xef\xad\xad\x3b\xad\xf9\x0b\xf2\x3d\x5f\x1c\x86\xa5\x1c\xc9\x97\xdd\x92\x14\xc0\x2e\xe2\xc6\xe5\x0b\x05\xbf\x56\xae\xe6\x02\xb7\x5a\xf5\xca\x83\xb0\xd6\x3b\x2f\xda\x4b\xab\xed\xf5\xcd\x70\x0b\x76\x41\x7d\x95\xdf\xa3\x7e\x4d\xef\x60\x36\xac\x4f\x37\x77\x77\xdb\x2f\x26\xa2\xc5\x25\x2e\xd1\xe0\xbc\x2d\x52\x09\xfa\xa8\x7a\xa7\xbd\xaa\xe7\x06\xd9\xe8\xe5\x5e\x38\xbd\x90\x19\xa9\x95\x4a\xb0\x50\x7f\xab\xb9\x41\x15\xba\x9c\x6f\x34\x0f\x5e\xb5\x1f\x4f\x47\xcf\xce\x66\xbc\x20\x80\xaf\xd9\x70\x61\xae\x73\x67\x26\x03\x7b\x53\x2e\xc0\x98\xc3\xb9\xc5\xe8\x75\x23\x93\xf9\xde\x2b\x07\xd5\x7c\xa9\x74\x32\x23\x7f\x64\xc3\xad\xc9\xf6\xdd\x9b\xea\x58\x7a\xd5\x12\xdd\x9e\xe8\xc9\x1d\x2e\x88\x36\xef\x77\x1e\xad\x66\x8a\x7e\xe1\x14\x1c\x3e\xbc\x2a\x70\xdc\xc3\x07\x67\xa3\x5b\x2b\xd1\xd9\xf5\x68\xf3\x6e\xb8\xb2\xde\x3c\x78\x07\x03\x76\xbe\x24\x18\x27\xdc\x7a\x1b\x2e\xad\x77\xc6\xa6\xdb\x77\x66\xe0\xb2\x0e\x06\x3f\xed\xcf\xc0\xd8\xe0\x72\x86\xef\xc6\xc3\xf1\x46\x73\xef\x6a\xeb\xe5\x76\x67\xf1\x59\x7b\xab\xee\x7c\x9a\x77\xaa\xf9\xca\xa0\x5b\xcd\x1e\xcb\xf5\xc3\x25\x38\x75\xcc\x19\xaa\xb8\x03\xd9\x63\x1f\x04\xc7\x3e\x0b\xb7\xae\x47\x8b\x6f\xa3\xc5\x89\x68\xe3\xea\xa7\x1f\xe7\x3f\x73\xc2\xc3\x99\xf0\xc2\x6c\xb8\x3d\x0b\xd7\x89\x47\xdc\xa9\x3f\x87\x6e\xc2\x3b\x8f\xc3\xa7\x8f\xff\x51\x3f\x9b\xc1\x35\x81\x1b\x98\x2b\xf6\x33\xce\xc0\xfe\x9d\xf6\x83\x31\x58\x19\x9e\x8f\xf3\xcd\xe8\xf1\xff\xe7\xeb\x7f\xd4\xc7\xbe\xf3\x83\xea\x60\xc5\xe5\x1f\xf0\x7f\xa8\xf5\x5b\x27\x6a\x2c\x3a\x27\xbc\x2f\x7f\x87\x4d\x41\x13\xbc\x1c\xd1\xc2\x4e\x74\xe5\x06\x1c\x1c\xd8\x8f\xd6\xc1\x16\x15\xe0\x1d\xe0\x9d\x83\xef\x9d\x3b\xb7\xc2\x5b\xd3\x80\x79\x82\x6a\xb6\xb9\xb3\x17\xc1\x7a\xe1\x05\x93\xa3\xd0\x75\x87\xa0\x3e\xdd\x3d\x5d\x5f\xae\x1f\x7c\x4f\xae\xaf\xac\x2c\x8d\x99\x97\x51\xbe\xfc\xe9\xdb\x6f\xff\xfc\xe5\xef\x9c\x70\x7f\x21\xba\x72\xb1\xb9\x77\x1f\x2e\xbe\x53\xab\x0e\xfc\x9f\xb9\x41\xb7\xec\x56\xf2\xa5\x5c\xc1\x73\xc2\xcd\x6b\xad\x27\x0f\x3a\xcb\x17\x70\x36\x41\x50\x02\x74\x51\x74\xb3\xc7\x8f\x7f\xed\x44\xeb\x77\xe0\x2a\xc0\xc0\xaa\x43\xf1\xec\x60\x9d\xe1\xc6\xb7\xdf\x3c\x0d\x0f\x2f\x65\x82\xbf\x95\x70\x19\x65\x3c\xc9\xe5\x71\xf4\xd0\x61\x67\xa2\x3b\x0d\xae\x04\xdd\x7c\xda\x5f\xf9\xac\x79\xb0\xd2\x3a\xbb\x0b\x63\x62\x8c\x1c\xae\xbe\x81\x1d\x8a\x96\xce\x9a\xe3\x6f\xbd\x5a\x80\x5d\xd4\xd5\x32\x6e\xa5\x92\x03\x8c\x58\x1d\xc5\x8d\xa3\x61\x75\x75\x09\xd8\x3e\xde\x08\xaa\xd8\xdc\x99\x6d\x9f\x3b\x80\xbe\x5a\x8f\x76\x55\x23\x5e\xf9\x74\xbe\xe4\x15\x61\xe7\xd4\x2a\x53\x65\x5d\x93\x97\x1a\x6a\x86\xe3\x63\xed\xf5\x67\xe1\xcc\x78\x38\xff\x98\x17\xca\x39\xd6\x77\x8c\xba\x3b\xf6\xd1\x31\x07\xdb\x2b\xfb\x39\xbe\xf6\x88\x6a\x8b\x5e\x90\xef\x07\xb4\xcb\x28\xbf\xc2\x38\x0c\x77\x88\x06\x11\xde\xbb\x0d\xf7\x20\x5a\xd9\x60\x64\xcd\x18\x22\xbc\x72\x87\xef\x31\x0e\xfd\xdc\x78\xf4\x62\xac\xb9\x33\xdd\x82\xb3\xb8\xb9\xc6\xef\x85\x3d\x73\x85\x62\xe4\xb0\xe8\x36\xf8\xd4\x24\x27\x9b\x51\x1b\x2d\x67\x74\x62\x12\xfa\xc2\x17\x72\xe5\x89\x1c\x53\x7c\x37\x69\x05\xa4\x8c\x0f\x99\xfa\xaa\xb6\x16\x5a\x84\x59\xc0\x08\x19\xd1\x01\x9e\x00\xb4\xd4\x59\x7d\xd7\xdc\xdd\x6a\xd7\x67\xc2\xb9\x46\x38\x36\x19\xde\x7b\x08\x00\xd2\x00\xa2\x67\xde\x22\x8d\x9d\x71\x7e\xb7\xdf\xb6\x96\xb7\x3a\x33\xe7\xe3\x72\xd5\x43\x34\x59\x8f\x56\x26\xe1\x89\xee\x8c\xdd\x6e\x3d\x7e\xaa\x6b\x85\xdb\x13\xd1\xca\x39\xf9\xb9\xb2\xde\xa9\x2f\x41\xcf\xdc\x48\xf3\xed\x34\x2c\x15\xdd\xe7\x1a\xbc\xb7\x74\x97\xe8\x18\xf1\xe9\x69\xd7\xc7\x75\x81\xea\xa5\xfd\xe8\xb9\xbc\x65\xef\xc6\x3b\xb7\x1b\xe1\xf8\x1b\xe8\x14\xce\x98\xee\x4e\x8f\x30\xbc\x3c\xc3\x8d\x11\x72\xa2\x73\x75\x65\x16\x0e\x6d\xf4\x64\xaa\xb3\x34\x4f\x37\xdf\x87\x87\xb0\x0c\x5d\xae\xc2\x9c\xe5\x97\xd1\x0f\xaf\x6f\x78\xf0\x0c\x96\xc9\x39\x7e\xfc\x2b\xa7\x7d\x6f\xa2\x7d\xf7\x20\x5c\xd9\x0e\x6f\xd6\xf9\xae\x0d\xe5\x46\xfc\x4a\x35\x8b\x85\xe1\xea\x6d\xfd\x41\x2f\x09\xad\x38\xd5\xe5\x4b\x62\xe2\xd1\x68\xf3\x1e\xd4\x01\xc4\x81\x17\x66\xfa\x3e\x20\x2f\x38\x33\xf0\x9d\x1a\x9b\x5a\x85\x53\x80\xd7\xe8\xdd\xcd\x68\x66\x2c\x7a\x72\xbe\x79\x30\x0b\x27\xa2\xb5\x74\x80\x1d\x0f\x55\xab\x23\xdc\xf3\x57\x27\x4e\x7c\xe7\xe0\x6a\xcf\xdd\x45\x14\xa4\x0b\xf4\x08\xe8\x4c\xb4\x96\xef\xb6\xc7\x0e\x70\xf3\x35\x24\x9e\x8f\x5a\xa5\xa4\x00\xe8\xcd\x04\x72\x06\x66\xa6\x8a\x7a\xad\x04\x76\xf9\x31\xfe\xef\xb8\xb5\x20\xb0\xdc\xcd\x9d\x7a\x73\x77\x19\x28\x8a\xd6\x16\x5c\xbd\x4d\xe8\xaf\x53\xbf\xdb\x7a\x45\x6b\x5d\xf2\x07\x73\x15\xdf\xaf\xf2\x91\x8a\xae\xdd\x6f\x6f\xcc\x08\x0e\xb2\x8a\x34\x6a\x7c\xfa\x18\xe8\x18\x86\x03\xe4\x23\x87\x2e\xe3\x8f\xe0\x85\xd4\xd7\x21\x9c\x7b\xda\x19\xdb\x91\x8b\x40\x64\x8d\x14\x98\xc4\x0d\x2f\xbd\x7a\xa9\x87\x61\x85\x08\x83\x1f\xff\x06\x96\x4e\xd0\x38\x7d\x1d\xa8\xf8\xc3\xd0\xef\x79\xc4\x8e\x70\xf2\xf4\x37\x35\x24\x6e\xad\x79\x78\x01\xa9\x51\x9a\x33\xec\x5c\x67\xec\x55\x78\xb8\xe1\xfc\xe5\x0f\x5f\x38\xff\xdb\x6f\x7f\xf3\x1b\x40\xb9\x4b\xe1\x04\x62\x62\x18\x1a\xe2\xc6\xeb\x4f\x61\x55\xe0\xc0\x87\x8b\x5b\xad\x97\x57\x71\x49\x68\x79\xb8\x3e\x60\x21\xc1\xf3\xc7\xf0\xae\x1e\x73\x3e\xa5\x39\xfc\x5f\xee\x8f\x79\x20\x1b\xdd\xbe\x82\x3f\xfc\x19\x1d\xdc\xdb\xfb\xb0\x3d\xb8\x8c\x58\x0c\x97\x81\xaf\x8a\x1a\xaa\xf3\xfb\x8f\xf0\xbb\x2a\x8c\x51\xcb\xd2\x7e\xa7\x3e\x26\x1d\x2a\xba\x8e\x29\xd9\x5c\xc1\x2f\x0f\x78\x15\x98\xef\xc2\x2a\xde\x34\xc2\x53\x0c\xc9\x24\x1f\x35\x96\x2b\xfb\x55\x6f\x60\x54\x80\x78\xfe\x9d\xfa\x8d\xd6\xea\xfd\x68\x6e\xbe\x73\xe1\x32\xd0\x3d\x15\x20\x7e\x73\xf8\x8f\x57\x70\x65\xed\x9b\xfb\xbb\xb8\xe4\x4b\xeb\x78\x03\xc7\x5f\x37\xf7\x16\xf5\x0e\xe0\x36\xf9\x03\x03\x25\xaf\xec\xf2\x2b\x15\x2e\x5c\xc1\x96\x97\xd7\x5a\x6f\x6e\xc8\x6b\x65\x96\xc3\x59\x1e\x01\x32\x1c\xd1\xc6\xb9\xf5\xd6\xc1\x73\x06\x01\x9c\xd1\x7c\xbb\xca\xb7\x25\x3c\xbc\xe5\x7c\xf1\xe5\xb7\x4e\x6b\xf6\x39\xd2\x3e\xf4\xb6\xc1\xb6\x30\x32\x42\xce\x01\x5e\xb0\xdd\x79\xc0\x41\x00\x08\x38\x13\xd6\x5d\x0f\x8f\xab\x10\x22\x10\xa4\x0f\x74\xe7\xe9\x3c\xd0\x29\x59\x6e\xdb\xf9\xa3\xfc\x56\x4c\x47\x12\x4e\x86\x97\x84\x86\x79\xe3\x11\xd9\xba\xd1\x3a\x7c\x04\x9d\xc3\x70\xc2\x73\xe3\xf2\x20\x5e\x7d\x26\x74\xfc\xce\x54\x78\xf6\x05\x1c\x80\xce\xde\x75\x58\x6e\x3c\x18\xb7\x37\x81\x9a\xc5\xe1\x0c\xb8\x45\x17\x29\xe0\x62\x4e\xba\x29\xf9\xfe\x29\xe8\xe7\xf7\x65\xec\xdd\xf9\x83\x2a\x76\x3e\xa7\xe2\xc0\xf9\x9a\xca\x7b\xd5\x93\x51\x4a\x6d\x0d\xe4\xe4\xa5\x36\x43\x39\x55\xdf\x81\x63\x65\x94\xfb\x23\x6e\xd9\x09\x80\x5e\x2d\xb8\x8e\xec\xb0\xd3\x9f\x0f\xb0\xa4\xec\x94\xbc\x7e\x99\x6e\x5f\x26\xf5\xcd\xe4\x07\x50\x08\xdc\x89\x0d\xb8\x68\xc2\x3c\xa5\x41\xc7\x0b\x99\x5a\x87\xd1\x21\xae\xe3\xdc\x06\x6e\xab\x7e\x32\xf9\x8e\xbd\xd9\x0b\xa7\x6e\x33\x11\x46\x4f\x2d\x4d\x34\xa7\xb8\x15\x39\xbc\x8a\x67\x91\xad\xb4\x81\xa4\x7f\x21\x20\x57\xd6\x15\x5d\x8e\x9d\x03\x49\xd3\xde\xdf\x01\x64\x14\xb3\x3d\x44\x7d\x02\x8b\x24\x5c\x64\xee\xb4\x87\xfc\x1b\x1d\x65\xe0\xbf\x00\x51\xb5\xd7\x37\x90\x30\x5f\x9a\x07\x66\x34\x15\x5a\x1d\x6c\x9a\x0f\xb3\x6d\x50\x0d\x31\x34\xf5\x1c\x4d\x0a\xb5\x21\x0d\x11\x0d\x8c\xf3\x9f\x7f\x10\x4e\x4e\xe0\x69\x9e\xdb\x40\x32\x61\x65\x3a\x6c\x6c\x73\x5d\x38\x4a\x72\x8b\x09\x18\x17\x82\x29\x0d\x61\x36\x84\xb7\xb6\xe9\x16\x5e\xb4\xe6\xce\x03\x20\x3b\x00\x55\xf1\x9b\x0a\xa3\xc0\xae\x96\x6f\x03\xcd\xe0\xfc\xe9\xcb\xec\x27\x8e\x1e\x17\xf4\x8c\x27\x7b\x7a\x01\xef\xce\xe1\x35\xdd\x4e\xfc\xa6\x72\x9f\x8c\x08\x12\xdd\x28\x7a\x85\x20\x98\x2b\xb5\xe9\x27\x7c\x85\x8f\xa6\x8e\x32\x82\xb6\x0c\x00\x93\x41\xe5\xca\xcc\xde\xea\x9a\x8c\xd5\x14\x1f\x94\x1b\xf4\x91\xef\x02\x3e\x65\xf6\x05\x73\x0a\xc0\xa3\x07\xd5\xdc\xa0\x57\xcd\x0d\x20\xfe\x84\x26\xcf\xdf\x89\x5e\x2c\xb4\x81\x9a\x68\xdc\x77\x3e\x84\x82\x0f\x9d\xf0\xd2\x41\x73\xef\xde\x4f\xfb\x37\x3e\x38\x2d\x24\xf3\x6f\x11\x37\xe2\x3d\xf3\x4a\x78\x90\xf0\xa9\x07\x9c\x23\x97\x1c\x96\x6b\x69\x1f\x28\x0f\x16\x08\xe0\xda\x5e\x7d\x0a\xcf\xb8\x23\xc4\xae\x30\x4a\x80\xb9\x3e\x08\xe0\x05\x9a\x6e\xef\x4f\x0a\x0b\xf4\x70\x1a\x77\x67\xb2\x81\x10\xf5\x19\xde\x14\x67\xd0\xef\xaf\x79\xa5\xa2\xc3\xad\xe1\x22\x2b\xea\x17\x68\x5f\xd9\xdd\x24\xf3\x82\x55\x37\xef\xc2\xe2\xf0\x98\x55\x05\x83\xa8\x23\x86\x5a\x13\x4b\xa9\xb5\x34\xed\x85\x53\x1d\xce\xc3\x45\x11\xf2\xac\xf5\x62\xaf\xf5\x4a\x10\x59\xe7\xe6\xad\xd6\xc2\xeb\x70\x72\x96\x7f\x62\xcd\xc0\xf9\xe8\x33\x98\x5a\x26\xc8\x9f\x76\xf9\xa1\x19\x54\x6b\xcb\xe4\x46\x67\x7c\x16\x7b\x7b\x77\x13\x49\xb6\x7b\xcf\xa2\x85\x6b\xf6\x30\xad\x83\x6b\x1d\x23\xe6\x96\xd3\x26\xc8\xbb\x1b\xd4\x0a\x05\x37\x08\x70\x3b\xc2\xfb\x80\x31\xc6\xa2\xc6\xa5\xb0\x7e\x29\x3c\x6c\x74\x1e\x5f\x6f\x37\x1a\xf0\x1d\x08\x86\xe8\xca\x84\xbc\xbb\xc2\xb7\xb6\xee\xdf\xd4\x5c\x58\x74\x7e\x32\x7c\xf7\x18\x3e\x36\xf7\xa0\xfd\x7d\x7c\x37\x36\xef\xc1\x99\x70\x7e\xf7\xd7\x3f\x42\x83\x7a\x90\x69\x14\x8d\x5e\x4f\x3c\x43\x0b\x8d\xff\xe1\xc0\xd0\x32\xdf\xa3\xa8\xea\x64\xa6\xc6\xe4\xb8\x5f\x2a\x22\x39\xae\x0e\x3c\xbe\x00\x7c\x40\xd5\x91\x56\x20\x72\xa6\x83\x33\x1e\x2c\x7c\x4e\x8b\xb8\x70\x41\xab\xee\x8f\xd5\x6c\xd8\x98\x88\xe6\x96\x4d\x81\x97\x48\x7d\x86\x47\x69\x9f\x61\x11\x1a\x97\x90\x9e\x67\xd1\x49\x30\xe4\x9f\x21\x41\x92\x14\x76\xee\x3c\x6d\xdd\xdb\x65\x29\x12\x83\xa0\xe8\xa9\xe0\x97\xe0\x3c\xfb\x88\x95\x4f\x2b\xc8\x70\xee\x5c\xbb\x31\x11\xce\x5e\x45\x8e\x4f\xb7\x07\xbd\xf8\x95\x41\xd5\x89\x12\xab\x8c\x8a\x78\x46\x7d\x17\x11\x0d\xa1\x3c\x92\xd8\x31\x42\xc3\xd3\x21\x12\x8c\x3e\xd8\x69\x12\x8a\x48\x67\xcf\x9e\x44\x8b\xfb\x31\x95\x4f\x9d\x41\x43\xb0\x8c\x22\xce\x3b\x99\x91\xd9\x91\x54\x4f\x46\x83\xc7\x54\x89\x53\x80\x2a\xc9\x57\xe0\xac\x46\xf3\x2b\x28\xf6\xcb\x7c\x9f\xaf\x55\x87\x4e\x1a\xa2\xb6\x9c\x08\x73\x04\x1b\xf2\xb1\x8a\x49\xa3\x21\x77\x04\xc9\xa8\xe1\x60\x90\x04\x6a\xaf\xaf\x30\x5e\xfd\x69\x7f\x95\xd1\x06\xe3\x5b\x3c\x0a\x81\x5f\xf0\xf2\xa5\xdc\xfb\xd7\x7c\x3d\x06\x54\x01\xd6\xb4\x1f\x41\x16\xf7\x01\x77\x98\x05\x4e\x06\x39\xc0\x57\x6f\x10\x03\x18\x6f\x1f\x34\xd7\x5e\x7b\xdc\xb9\xb6\xd2\x59\x9c\x04\x0c\x00\xe8\xa3\x3d\xf6\x14\xaf\x21\x49\x20\xf5\x0d\x31\x89\x19\xdd\x34\xa1\xc3\xee\x86\x4d\x6a\x2f\xb5\x13\x58\x91\x61\x77\xb8\x1f\x5b\xc0\x7d\xbb\xde\x3c\x98\xe3\xa9\x67\x06\x60\xe7\xe9\xe0\x2b\x81\xc7\xbb\xeb\x50\x2e\x07\x16\x0b\xdd\x1e\x85\xb0\x12\x4a\xb6\x0a\x48\xe5\x4c\xb6\x73\xf6\x7c\xf4\xfc\x32\x6f\x00\x94\x75\x1e\x00\xb2\x9c\x8a\x99\x66\xc1\xf6\x4c\x22\x10\x41\x1a\xb8\xe5\xaa\x5a\x2b\x24\xac\xb7\xc7\xa2\xc5\x6d\x3c\x7f\x34\x0d\xa6\x50\x65\xe9\xd7\x1e\x33\xfd\xdb\x9e\x78\xe1\x7c\xda\xff\xd9\x07\xc1\xa7\x1f\xf7\x7f\xc6\xa8\x37\xda\x58\x8b\x80\x86\x25\xee\x2c\xba\x0a\x14\xea\x6b\xe2\x58\x1e\xc0\xcb\xef\x7c\x50\x74\xc2\xed\x39\x78\xf4\xc3\xf1\x87\xe1\xd6\x4c\xd4\x98\xe7\xb6\x85\x18\x20\x16\x92\x1e\xba\x02\x5d\x11\x3a\xba\xea\x3c\x45\xef\xea\xd1\xcb\x3d\x6e\x57\x4e\x15\x8c\x75\xc8\xeb\x87\xc7\x05\xd0\x85\xa7\xa9\x22\x5e\x46\xbb\x8c\x1f\xe8\xff\x05\xed\x39\xd2\x9e\xe3\x05\x8e\x82\x01\xaa\x0b\x08\x34\x02\xfc\xb5\x03\xa7\x0c\xe8\x30\x07\x31\x01\x0c\xc3\x41\x59\xb4\x43\x38\xb3\x0f\xf6\x8c\x96\xa8\xe4\x0d\x7b\xd5\xb4\x43\x05\x83\x63\x01\x22\x2f\x0e\x8f\x58\x28\xfb\xb1\x8b\x70\xf5\x3a\xb7\xf7\x5a\x6f\xc7\x78\x9d\x5a\x9b\x93\xe1\xe1\xb8\xf3\x5b\x27\x6c\x5c\xe8\xcc\x5f\x67\xb1\x5c\xfb\xd1\x03\x3c\xc1\x43\xf9\x20\x57\x2b\xcb\x0e\x01\xc9\x49\xa7\x0c\x50\xbf\xc2\xbc\xd8\x13\xd0\x36\xbc\x49\x7a\x27\x7e\x15\x6f\xc5\xbf\x3a\xcd\x83\x0b\xd1\xca\x06\x6e\x14\xad\x30\x33\x47\x30\x10\xe4\x9e\xb4\xe4\x71\x65\x03\x76\x08\xa8\x1c\x73\xa4\xd8\x3a\xe0\xcd\x95\x3a\x10\x6c\x9d\x89\x59\x3c\x02\xd4\x81\x3c\xac\x8b\x5b\xd1\x95\x29\x78\x57\xe1\x45\xc5\x0d\x9e\x99\xec\x34\x16\xf8\x3c\xc3\xda\xc8\x48\x19\x08\x30\x7b\x7b\x69\xc1\x6c\xc2\x3c\x48\xc2\x51\xd2\x43\x1f\xd0\x5d\xaf\xd2\x43\xcf\xe4\x60\x92\x97\xa3\x99\xc0\xe5\x81\x8b\x09\xc3\x6d\xee\xed\x35\x0f\x16\x98\xf0\x21\x54\x81\x3d\xe3\x00\xaa\xdd\xfd\xff\xb4\xdf\xe0\x21\xfc\xb4\x3f\x29\xdb\xc2\x47\x88\xee\x0c\x14\xc1\x7b\x27\x23\xe2\x16\xf4\xdd\xe2\x32\xb9\x78\xea\x61\x2a\x10\x63\x65\xef\xb9\xbe\x22\xf2\xa8\xbd\x79\x8e\xbb\xbd\xb2\x0a\xcb\x08\x7f\xd3\x1b\xdc\x50\x4b\x14\xb7\xaf\x99\x71\x7b\xb1\xe2\x2e\x35\x60\xd5\xf7\x73\xf0\xc2\x54\xaa\xf2\x6c\x75\x16\xde\x84\xbb\x0f\x44\x68\xb6\x7d\x09\xf5\x39\xff\x3b\xec\xf7\x2c\x2e\x45\x19\x2e\x73\xc9\x2f\x00\xe2\x54\xf7\x06\x68\x08\xe6\xcd\xf8\xd2\x30\x01\x06\x8c\x26\x8c\x91\x85\x37\xcd\x77\x5b\xd1\xd5\xb7\xdc\x34\x49\xc5\xbe\xc7\x45\x3c\xc9\x97\x10\xb1\xba\x6a\x09\xcf\x76\xf7\x25\xd4\x60\x4c\x1a\x02\x10\xd3\xf2\x0c\x64\xee\xe2\x91\x0b\xac\x31\xaa\xa2\x32\x04\x27\x34\xe6\x01\x7f\xe2\x3a\x6f\xde\x69\xbf\xbb\xc8\x54\x44\x0c\x2c\x3c\xb4\x55\x08\xe3\xf7\x8b\x79\x98\xc0\xa8\x1b\x08\x09\xcb\x98\x05\x16\x47\x64\xf8\xf2\x1b\xe0\xb0\xb6\x6c\x1e\x2d\x03\xd4\x06\x1c\x3b\x7c\x32\xf3\x57\x78\xf4\xbe\xb5\xb4\x3b\x99\xbf\xc0\xd3\x48\x9f\x62\xf1\x1b\x8b\xf3\x7e\xcf\x3a\x1f\x73\xaa\xdf\x25\xe4\xd5\x7f\x71\xbb\x55\x3e\xc7\x8f\x7f\x75\x82\x68\x79\x92\x4a\x3d\xbd\xd0\xb9\xb4\x2d\x0d\x7e\x55\xad\x8e\x04\x7f\xad\x94\xb2\x2c\x0a\xfa\xeb\x5f\xbe\x76\x74\xbb\xa3\x25\x3f\x5f\xc4\xb2\xe8\xe2\x3a\x9c\x66\xf9\x7e\xc2\xcd\x0f\xf3\xd8\x56\xae\x77\x6e\x4c\x49\x3b\x9f\xc3\xe3\x4c\x5f\x11\xc7\x02\xbe\x91\xaf\x88\xcd\x7e\x9f\x4a\xc8\x67\xbe\x75\xcf\xfc\xae\x92\x2f\x17\xb8\x1a\xe3\x7f\xd6\xf5\x48\xe5\x2f\xfc\x61\xc0\x7e\xc7\x6b\xc3\xc3\xf9\xca\x68\x96\x7f\x39\x01\xff\x94\xc2\x6f\x60\xfb\x50\x0d\x17\xcd\xcd\x37\x77\xef\xb5\xd7\xa7\xa2\xb1\xa7\x52\xf4\xc5\x90\x0f\x9c\xae\xaa\x56\xa0\x5f\x99\x13\x15\xd7\xe5\xee\x0c\x41\x38\x54\x00\x52\x0c\xe9\x08\x7c\x2a\xde\x66\x34\xa7\xe7\x92\x86\x2a\x29\xca\xcd\x97\x46\x80\xd3\x44\x42\x4e\x00\x84\xdd\x3a\xbb\xdb\x9e\x7e\x16\x2d\x4e\x84\x9b\xd7\xa2\xa7\xb3\xff\xa8\x8f\x75\xae\xbf\x8b\xa6\x27\x9b\xfb\x4f\x81\xa8\xc7\x8f\x8d\xc5\xe8\xd1\xe3\xd6\x1b\x20\x1c\x1a\x1f\xe5\x00\x47\x24\x1a\x2b\x02\x7e\xfa\x45\x0d\xc2\x17\xbb\x41\x12\x43\xdc\x22\x91\xa6\xf7\x77\x35\x7c\xbe\xc2\xba\x49\x20\xd9\x48\x00\x85\x84\x79\x12\x28\x5a\x01\x24\x3f\xc7\x40\x0e\x0a\xbb\x48\xd0\xce\xf2\xaa\x1f\xd3\xc1\xef\x3d\x4c\x03\x67\x84\xab\x97\x4f\x4b\xcf\xe0\x21\x01\x04\x95\xb8\xab\x58\x01\xe5\x94\x47\x80\xe3\xb1\x64\x86\xa9\x50\xaa\x15\x5d\x6b\x99\x94\x4e\x60\x9e\xbb\x6f\xee\x3c\x77\x3e\xfc\x20\xf8\x90\x5a\x2d\x9f\x02\xea\xa4\x2c\xe0\x80\xd9\x5b\xab\xf7\x3b\x33\x4f\xdb\x1b\xc8\x02\x2a\x35\x28\xb0\xf2\x05\xbf\x52\x71\x0b\xd5\xac\x21\x5c\xd8\x08\x67\xde\x02\x7b\x83\xad\x68\xe4\x68\xb0\x4f\x74\xab\x80\x9a\x36\x2f\x99\x55\x49\xab\x6c\x73\xfd\xae\x0b\x8c\x74\xfe\x94\x5b\x8e\xef\xb7\x26\x6d\x9a\x07\x57\xe1\x23\x63\x6c\x60\xe9\x92\x15\x98\x2a\xe6\xeb\x90\x52\x07\x28\xb4\xae\x2a\xa2\x17\xe8\x55\xa5\x0a\x97\xb7\xbb\x1b\xe3\x22\xa7\xd4\xe1\xdd\x24\x78\x98\x55\xd1\xc2\x3e\x06\xf8\x3b\x01\xd7\x33\xd7\x0b\x17\xaf\xb0\xc9\x2f\x69\x45\x09\x33\x80\x2c\xf2\x01\x4c\x5b\x21\x3d\xb8\xc1\xe8\xb2\xf6\xcd\x20\xf7\xf4\xc3\x6d\xae\x0f\x9c\x9a\x23\x1a\x82\x63\x80\x38\xbc\x67\x4b\x80\x7e\x58\xd6\xd8\xae\x8f\xc7\x83\xbc\x0e\xa8\xe8\xc1\x11\xad\xea\xf7\x25\x7d\x74\x7c\x2c\x12\x8d\x68\x4e\xdc\xfd\x11\x1e\x96\x2c\x2c\x1d\x3f\x11\x5a\x38\x83\xda\x2e\x52\xb1\xe0\x23\x5b\xca\x07\x55\x64\xd0\x78\x02\x08\xdd\x7a\xb8\xd7\x59\xba\x27\x9a\xaa\xb3\xbb\x78\x09\x0f\x49\x64\x7f\x30\x6b\xf2\x0f\x38\x22\x12\xa8\x71\x91\x90\xd7\x9a\x05\xbf\x30\xcb\xaa\x58\x6e\x0d\x9f\xbe\x2b\x77\x78\x1c\xd8\xab\xa6\x41\x50\x13\x72\xca\x1d\xcd\x02\xe3\x1d\x4d\x3d\x8b\x36\x27\x89\x64\x43\x56\x5c\x1e\x77\xf5\xfe\xea\x49\x3b\xf1\x0b\x43\x32\x04\xe4\x97\x91\x8d\x39\xed\x56\xe0\x01\xd4\x0d\xb2\x2e\xe7\x7d\xda\x98\x41\xf2\x92\xb9\xff\xb1\x89\xf6\xfa\x66\xe7\xec\x5d\xdc\x6a\x85\x1a\x34\x18\x4e\x18\xda\x98\xd8\xc0\x59\xad\xed\xa2\x54\x62\xfc\x35\x83\x45\xf5\x87\x38\x2b\xe4\x1f\xb5\x00\xe3\x62\x03\x85\x5d\xd4\xb5\x29\xba\xc8\x04\x55\xaf\x54\xc2\xd5\x16\xc3\x06\x83\xfe\x68\xee\xcd\xb6\xce\xbf\xc6\xce\x57\xe1\xb5\x59\xd6\x3c\x6d\x74\x65\x8c\x0f\x0e\xd3\x68\x4a\xa3\xd5\x68\x1f\x4c\xc2\xf2\xe2\x49\x6f\x6c\xc0\x22\x87\x5b\xe7\x60\x12\x22\x12\x24\xf9\x8b\x7c\xa7\xc6\xe3\xc5\xe7\x11\x20\x5d\x4e\xe6\x0e\xf6\x00\xda\x8d\x29\x3d\x00\xbe\xea\x38\x00\xda\xbe\x44\xef\x9d\xe5\xb5\xce\xe2\xb4\xee\x9d\x81\x15\xd6\x48\xcc\x12\xf9\x74\x2a\xff\xff\x69\x8a\xdc\xb8\x71\xbe\xd8\x88\x20\xd7\x4f\xef\xbf\x71\x1b\x5a\xcb\x5b\xa8\x79\x21\x2a\x40\xdf\x03\x20\x94\xf0\xd2\x00\xeb\x3f\x94\x2f\x0f\xba\x22\x15\xcf\x46\xcb\x2f\x81\x8a\x62\x71\x7b\xe6\xdf\x7d\x78\xd0\x7c\x40\x65\x53\xb7\x51\xdf\xb4\xb8\x1f\x9b\xb4\xa0\x1d\x86\x20\x8a\xc6\xb5\xf6\x9d\x75\x65\x9f\x01\xa7\x7a\xfc\x09\x2e\x11\xdb\x68\x0c\xf8\xa5\x92\x7f\x06\xc5\x0f\x48\xfc\xaf\xef\x91\xee\x08\xfa\x81\xfb\x8e\x52\x80\xf6\xd6\x0d\xe0\x87\x04\x0a\xc5\x59\x0c\xd5\xdc\xd9\x94\x6f\xf8\x21\x7a\xb1\x0e\xe7\x5d\x7e\x33\xfd\x27\x5f\x91\x9d\x1e\xee\x23\xb4\x88\xa4\x69\xe5\x34\x0a\x28\x15\x9e\xa1\x07\xcb\x81\x55\x47\x3c\xfa\xee\x66\x6b\x61\x09\x96\x9c\x34\x08\xba\xd2\x48\xbe\x0a\xb8\xa7\xcc\x4c\x0c\x0d\xd4\xa8\xaf\xf5\xe3\xdc\x90\xa5\x69\xca\x7c\xaf\xac\x54\x4e\x66\x6c\x4b\x16\x36\x41\x8a\xcd\x1d\x4c\xe2\x3c\x23\x6b\xcc\x9a\x89\x8c\xdc\xda\x40\x88\x38\xe3\x7e\x8a\xec\x24\xdb\xba\x77\x08\x04\x18\xf3\x49\x2c\x1e\x41\xfd\x63\xc9\x2b\x10\xd3\xaf\x2a\xf2\xad\x63\xe1\x61\x86\xc4\x4e\x96\xd5\x4e\xd1\x2d\xb9\xc0\x9a\x99\xd7\x22\x53\xf3\xd4\x44\x9d\x3f\x7d\x99\xc9\x8c\xd4\xfa\xa1\xd1\xd8\x26\x87\x76\x50\xcd\x44\x4c\xad\x88\x01\xef\xe6\x09\x58\x81\x0d\x4b\xcc\x95\x10\xb3\xec\x3c\x40\x84\x0a\xad\x2f\xee\x47\x17\xef\x23\x83\xca\x8c\x0b\x2c\x20\x3d\x06\xac\x1e\x0b\x2f\xcf\xb0\xb6\xcc\xa2\x06\xf4\x33\x27\x82\x9a\x62\x56\x6f\x83\xe6\x83\xd8\xd2\x44\x6b\xc1\xf9\xc4\x36\xf7\x16\x11\x7f\xde\x38\xaf\xbf\xc3\x16\xd2\x6e\xa3\x95\x10\x3f\x51\x4a\xed\x24\x94\xb0\x32\x54\xe3\x8d\x13\x73\x35\xe4\xbd\xd8\xac\x61\xb2\x0e\xb7\x04\x27\x39\x5b\xcf\xd4\x46\x8a\xc8\x21\xa9\x05\xc2\x2e\x17\xb7\x65\x81\xec\x32\x53\xc8\x4a\x6f\x69\x7c\x28\xb8\x96\x62\x88\xc6\xd4\xc5\xeb\x36\x43\x43\x45\x02\x9e\x59\xe2\x67\x12\x50\x4a\x6c\x01\xc8\x85\x6f\xbe\x58\x10\x90\xfa\x19\x25\x01\xfc\xde\x36\x26\x10\xa1\x30\x0e\x5c\x99\x84\xeb\x42\xe2\xc6\x06\xec\x07\xca\x8d\xe0\xe4\xd6\xa0\xbf\xb7\xfb\xad\xdd\x19\x61\xa5\x2c\x13\x29\xf9\x96\x11\x15\x99\x28\xcc\xfa\x47\x99\x3b\x67\x85\x9a\xe8\xd7\x9c\xfe\x51\x87\xf4\xab\xbd\xf4\x72\x49\x85\x9c\xd2\xc7\x29\x1d\x53\x2d\xa8\xfa\xc3\x0a\xfb\x84\x0b\xab\x80\x35\xf4\x46\x09\x1a\x02\x36\xc3\x0f\x44\x38\xc9\x70\x2c\xa6\xe6\xe7\x57\x80\x64\x1b\x0c\x34\xb6\xb8\xcd\x45\xca\x62\x89\xee\x01\x74\x08\xc8\xa7\x5c\xd5\x3d\x32\x2a\x25\x21\xbd\x6e\x09\x39\xb4\x78\x22\x84\x1d\x72\xde\x30\xb2\x44\xac\x99\x24\xd2\x06\x95\xa9\x31\x5d\xbd\xff\x2a\x5c\x59\x6c\x4d\x4e\xe0\xc6\x5a\x43\x49\x1c\x08\x73\x48\xc9\x03\xa1\xf6\x3a\x1d\x79\xf8\x25\x83\x34\xe2\x01\x4b\x09\x2e\x8c\x2e\x11\x96\x4f\x31\xe5\xc8\xb5\xe6\x2c\x00\x96\xa6\x30\x59\x60\x01\xa7\x51\x96\x46\x37\x86\x52\x61\x2c\x39\x52\x3d\x49\x01\xa5\x71\xeb\x89\xe1\xcc\xe7\x0e\xf1\x36\x91\x4a\x52\x34\x09\x46\xd7\x2c\xf2\xb3\x10\x81\x74\xf0\xfe\x68\x00\xdf\x50\xc2\x04\x40\xa0\x18\xb2\x10\x22\xb3\x03\xcb\xe4\x41\x38\x6e\xb1\x72\x14\x00\xb1\x67\xec\x06\x63\x3a\xdd\xc0\x7e\xa8\x78\x7d\x30\xd6\x39\xbb\x65\xe0\xc0\x0b\x8c\xf1\x9a\xbb\x17\x4d\x0b\x00\x56\xf1\xc3\xf3\x1d\x0b\x46\x47\x2a\x1e\xf1\xdd\xdc\x88\xfa\xa9\x44\x2f\x5b\x87\xcd\x9d\x5d\x29\x92\xe3\xca\x25\x7c\x4a\xf5\x58\xa0\x04\x51\x14\x7f\x15\xce\xdf\x2e\x13\x85\x26\x01\x00\xaa\xe8\xc6\xd8\x42\xa2\xb2\x25\xc0\xf2\x0e\x63\x08\xc6\x53\x30\x4e\x26\xaf\x19\x41\xfc\xcf\x64\xd3\xfa\x40\xd3\xfe\x9a\x83\x20\x7a\xb0\x58\xa4\xf3\xc6\x03\x67\x6a\x59\x2e\x6a\xf7\xe2\x22\xb0\x09\x68\x99\xdd\xea\xc2\x9c\x25\xea\x46\x11\xae\x88\xb7\xc3\xc3\xf1\x58\x3a\x6a\xb6\x8e\x3a\x63\x14\x15\x02\x42\xa4\xd7\x5b\x64\x9f\x2b\xeb\xa6\x00\x3b\x55\xd0\xcd\x0f\x98\x29\xdb\xee\x8c\x5d\x6c\xad\x4f\xb3\xfa\x56\x0d\x48\x2f\x01\x4f\xcc\x38\x0b\x32\x61\x5a\x1a\x3a\x80\x72\xcc\x8e\x78\xec\xb1\x59\x62\x07\xd6\x6e\x21\xa1\x25\x14\x00\xca\x2e\x70\x0f\xf1\xc2\xec\x4c\x23\x19\x63\xe2\xf4\xc9\x3a\x0b\x53\xbb\xe8\x7a\x2d\x1b\x86\x05\x80\x4b\x87\xc8\x7f\x69\xa6\x75\x75\x35\x41\xd4\x8b\x8e\x57\xd1\x97\x44\x21\x07\xda\xbe\xe8\xd3\xa0\x5a\xf1\xcb\x83\x9f\xb1\x10\x39\x7c\xfb\x38\x9c\x7a\x14\x5e\xbb\xf8\x3f\x3f\xfd\x58\x0a\x1c\xe4\x0b\x56\xef\xb7\x56\xa6\xf9\x75\x41\x13\xd6\xd8\x64\xd5\x81\x41\x34\x0f\x16\xa0\x57\x58\x07\x63\x78\x64\xbe\x4a\x42\xe7\x89\x70\x16\x25\x37\x89\x6a\x08\x49\x64\xf9\x4e\xfb\xc1\x34\xdb\xee\xaa\x2a\xad\xc5\x4b\x9d\xe5\xbb\xd1\xc5\xcb\xed\x87\x77\xd5\x56\xe0\x29\x8b\xd7\xcd\x22\x9f\x78\xb1\x0d\xee\x1a\xa8\x93\x70\xfc\x99\xc8\xe8\x6c\xee\x5a\x43\xd3\xf3\x4a\xd0\xa2\xa9\x5e\xde\x09\xe7\x67\x98\x58\xc0\x61\x75\x35\x11\x33\x94\xaa\x7a\xd6\x92\x02\xe2\xd7\x82\x92\x82\x71\x01\xcb\xc2\x64\xc7\x13\xc7\xc8\x98\x81\xd0\xae\xc6\x59\x22\xbd\x18\xa3\x04\x9a\x33\x23\x04\x35\xf4\x04\x4a\xe0\x96\x80\x20\x33\xd6\xa2\x07\x66\x30\x40\xd1\x72\x82\x3e\x77\xd3\x10\x1a\x43\xb0\x86\x52\x5b\x34\xd8\x78\xa2\xab\x2b\x35\x3f\xa3\x0f\xee\x40\x4f\x09\x57\x02\x87\x4d\x5b\x88\x0c\x06\xb1\xe6\xbc\x09\x3b\x53\xd1\x93\x3b\xbc\x15\xc8\xaf\xa0\x25\xaa\xe2\x31\xa2\xe7\x97\x91\x90\x84\xe3\xf9\xee\x92\x70\x1a\xb4\x9e\x55\x7c\x77\x69\x82\x30\x35\x59\xf2\x95\x75\xe7\xff\x70\xc2\x7b\x8f\x60\xed\xf5\x9e\xc3\x9d\xce\x54\xfd\x53\x70\x3a\x8c\x2a\xd1\xe6\x3d\xfa\x86\x06\x55\x63\x17\xc3\x8b\xc0\x86\x9c\xe3\x7a\xd1\xf2\xa1\x79\x62\xb0\xb6\xbe\xd7\x42\xa9\xf3\xf3\xc1\x77\x52\x51\xed\xa4\x6e\x65\x2d\xe8\xfb\x5d\x65\x93\xde\x3f\xfa\x2e\x73\x15\xf3\x2e\xc3\xc5\x40\x42\x46\x2b\x51\x6b\xe5\x7e\xaf\x5c\xcc\x9a\x9f\xe5\x9b\xde\x16\xb3\x3b\x13\xce\xa0\x48\x64\x96\x79\xaa\x90\xa3\xe5\x51\x32\x67\xa2\x6c\xf9\x65\x6b\xee\xdd\x6b\x4d\xce\x88\x35\xae\xa8\x91\x05\x96\x70\x00\x9f\x6f\x81\xa2\x82\x40\xbf\xa8\x30\xff\xd6\xd5\x35\x9e\x15\x2f\x3f\x51\xbf\xf8\x9a\x1e\x5e\xc0\x1b\x36\xb7\x48\x62\x8d\xcf\xbf\xfb\x53\x90\xd1\x0d\x73\x75\x60\x6c\xd1\xb6\xe2\xec\x6e\xb4\xb9\x46\x36\x09\xa8\x56\xe2\x6e\x3a\xa8\x5a\x99\x35\xf9\x7c\xe6\xb6\x11\xb3\x2f\xbc\x4c\xb1\x77\xe5\x66\xe9\x12\x73\x0b\x72\x89\xf5\xa4\xcc\x09\x25\x27\x2c\x67\x09\xd7\xd5\x55\xd7\xd9\x5c\x1a\x59\x06\x83\x20\x12\xd1\x31\x6f\x1d\x5b\x8a\x36\xb6\xc5\x1a\x72\x6b\x32\x1c\xa7\x71\xaf\x6c\x47\x8b\x6f\xb5\xb9\x11\x1c\x69\x19\x19\x1a\x46\x9d\x63\x1b\x05\xa8\x02\xb7\xc4\xc0\x0e\x3c\xcc\xb0\x71\x1b\xb6\x53\x86\x69\xee\x5e\x12\x55\x08\xf3\x43\xd6\xa8\xc0\x1d\x10\x4c\x7a\x05\x13\x71\xc0\x55\x31\xe0\x85\x05\x61\x94\xd2\x98\x60\x64\x61\xd9\xce\x1a\xc6\xae\xb8\xe5\xe7\x5e\xa0\x41\x2f\x61\x0d\x7c\x56\xac\xa1\x27\xe9\x65\xa3\x9b\x37\xcf\x4d\x92\x43\x34\xfd\xeb\xd7\xc3\xc3\x6b\x42\x49\xf3\x53\x6e\x74\x4c\x2f\xb0\xb4\xae\xed\x1a\x0c\x8a\x5f\x2e\xa9\x40\x28\x8d\x30\x4f\x91\xcf\xc7\xca\xb9\x68\x7b\xa7\xf9\x76\x3c\xda\x19\xc7\x8f\xa6\xdc\x88\x88\x25\xa6\x17\x9a\x3b\x57\x1d\xf5\x68\x22\xa5\x3a\xf7\x34\x1a\x5b\x0b\x0f\x1f\xe9\x07\x93\x68\x66\x31\xcf\x4a\x8c\x47\xa4\xdd\x26\x7b\x6e\x43\x28\x73\x5e\x2a\x33\x07\x97\x84\xd3\x88\x8f\x21\xe9\x1e\xc9\xe8\xeb\x0f\xb9\xa2\x28\x3c\xd7\x76\xe1\x9a\xeb\x3d\x10\x46\xf2\xda\x45\xb4\x40\xc8\x7c\x8f\x32\x9e\x93\x19\x16\x8d\x6a\x11\x55\x2c\x4a\xb7\xe4\xe7\x86\x84\x5d\xa9\x43\xb5\xa9\xbc\x01\x06\xa7\xb4\xdd\x78\x02\x77\xb2\xbd\x7f\xae\xb5\xba\xf9\x8f\xfa\x18\x1c\x4d\x44\x1f\x6f\x9e\x85\x8d\xbd\xc4\x02\xb6\x66\xd7\x01\xbe\x75\xfe\x4e\x73\x77\x26\xa6\x38\x44\x78\x73\xda\x0b\xbc\x7e\xaf\x44\x82\xa6\xb9\xa7\x48\x27\xec\x3e\xe0\x8f\xf8\xcd\x30\xcb\x16\x29\xdb\xd9\x5d\x68\x77\x24\x5f\x76\x0a\xf0\xb2\x04\xd9\x63\x35\xcf\xa9\xa0\xb9\x80\xfb\x63\xf5\xd8\x67\xad\x87\x63\x6c\x08\x0b\xdd\x00\xcc\x67\x5d\x0d\xa1\xeb\x54\x01\x85\x42\xb6\x25\x09\x6a\x85\xf7\xdf\x84\x8d\xd7\x6c\x13\x29\x62\x8d\xc5\x6d\xb4\x97\xe1\x59\x6b\xc5\xd0\x3f\xd5\x39\x3a\x6c\xa9\xa9\xfc\xb4\xdf\x60\x76\x8a\xe6\xb4\x9f\xca\xee\x47\x2f\x0f\x01\xc3\x70\xd7\x3f\xed\x4f\x66\x0a\x25\xbf\xac\x37\x04\xce\x23\x6a\x68\xc6\xae\x30\x55\xa6\xe4\x85\xab\x62\x6c\xd4\xed\x7c\x64\x12\x72\x3b\x5b\x40\xfa\xb5\x37\x9e\x44\xd7\x2f\x12\x29\x86\xe7\x98\x46\xc7\x72\x5c\xa3\x5f\xfe\x4c\x66\xe2\xfc\x19\xb8\x78\xfe\xd6\xb5\x3b\x66\x35\x96\x56\x0b\xa3\x4b\x1b\x0a\x67\x55\xab\x6e\x18\xe5\xb0\x35\xde\xdc\x5c\xfb\xdd\x36\x7f\x46\x47\x41\xf9\x2c\xae\x82\xf4\x79\xd0\xab\x7a\x83\x65\xb4\xe2\x52\x2e\x3b\x70\x3f\x0a\x55\xa7\x4f\x17\x38\xca\xe5\x30\xc8\x94\xbc\x02\x3c\x43\xae\xc8\xac\xd1\x0d\x66\xee\xa9\xfa\xa8\x8f\xd1\xe3\x69\x91\x34\x18\x40\xcc\xf9\x43\x8f\xf9\x22\x5c\x86\xbf\xd0\x3f\xf2\xab\xab\x1e\x7f\x8e\xd6\xef\x90\x97\x5c\xad\xea\x03\x6f\xed\x55\xb3\x8a\x8c\xd8\x41\x31\x87\x92\x25\x00\xb7\xc8\x80\x61\xe3\x66\xf8\x70\x3a\x9c\x59\x94\x85\x15\xdb\x2c\x5a\x71\x31\xca\xe2\x82\xa2\x3b\x90\xaf\x95\x94\xc0\x37\xcb\xc6\xd2\xe2\xd8\xc7\x96\x66\x80\xd2\x6a\x65\x37\xdb\xbe\x3b\x16\xed\x2c\x5b\xdf\xe4\x01\x5d\x78\x8d\x0e\x29\xeb\xd3\xed\x77\x07\xed\xb7\xf7\xf0\xd6\xee\x2f\x20\x3f\xbd\xf6\x58\x10\xcd\xd2\x59\x31\x0c\x7f\xbb\x8a\xe7\x6e\x7e\x26\xda\xbc\x2f\xc4\xa7\x34\xe7\xa1\xfe\xe6\x34\xd0\x40\x6c\xce\x26\x20\x97\xd6\xa3\x15\x78\xea\x1a\xcc\x6d\xe1\xa1\x14\x70\xa0\xf8\x2a\x88\xde\x05\x5a\x78\x71\xab\x4c\x10\x19\x31\x6c\xcd\x83\x59\x00\x68\xee\x6c\x86\x33\xe3\xd1\xf4\x13\xb8\x58\x88\xb6\x0c\x31\x5f\x74\xe1\x52\x74\xe5\x06\x6b\x5f\xa9\x11\xa2\x20\x83\xd1\x32\xde\xdb\xaf\xe1\x6f\xe7\x38\xfd\x9d\x39\x83\x4a\x46\x91\x44\x47\x2f\xd6\x95\x24\x7a\x30\xff\x77\xb2\x8e\x5b\x7f\xd6\x06\x94\x08\x1f\xf1\xcc\x06\xf6\xd1\x66\x91\x31\x6c\x43\x61\x48\x8c\x87\xfc\x81\x1c\x6d\x0b\x49\x0a\x15\x8e\x24\xc3\x91\xab\x70\x2b\x63\x7f\x1b\x56\xe6\x92\x26\x0c\x68\x5c\x20\x69\x81\xda\x70\x3e\x28\xda\x62\x68\x2d\xbb\x36\x51\xe6\x3f\x29\xbe\xb6\xb1\xee\x11\x12\xec\xb2\x8b\x12\xae\x5a\x15\xce\x0d\x71\x79\xa6\xee\x26\x23\x5e\xa6\xec\xe2\xc7\xae\xa6\xe2\xdf\x67\x96\x74\x61\x5b\x44\x4e\x4a\xcd\x6c\x63\x3e\x44\x79\x4e\x7f\xa9\xe6\x1e\xfb\x8c\x37\x5e\x21\x3d\xd5\x1e\x9d\x6e\x71\x6a\x15\x1b\x4a\x2e\xe9\x63\x64\xa6\x8e\x8d\xe9\x55\x93\x0e\x12\x3f\x83\x2c\xee\x50\xae\x26\x86\x6f\xce\xc7\x7f\xfc\xd3\x09\x32\xca\x40\xeb\x01\x3a\xde\xe2\xa6\xb7\xb4\x1e\xbb\xe3\xa9\xc6\x61\x86\xc3\x5e\x10\x30\x05\x54\xf6\x50\xcd\x85\x1e\x6f\x0f\x98\x07\x09\xb7\x2f\xa2\x1c\x8d\x0d\x74\xb4\x62\x47\x53\x95\xaa\x91\xd8\x2e\x16\x4d\x7b\xc8\x28\x96\xad\x60\x11\x9a\x2a\x73\xc7\x48\xd1\x3f\x7a\xae\x5d\xfb\x98\xc3\x44\x4f\x18\x43\x81\xcf\x46\xb4\x88\x89\x55\xeb\xa2\x7e\x53\x3e\xc1\x86\xe2\x4d\xee\x04\xa1\xe5\xce\xc2\x0a\x2c\x7c\x74\xf3\xbe\xc2\xcc\x70\x00\xd2\xf0\x35\xb9\xf5\x04\x6e\x69\x40\x8c\xbd\xe5\x2a\x10\xcb\xcb\x67\x5d\xbf\xee\x4c\xd6\x8c\x8c\xc2\xad\x28\x9f\x92\xbd\x61\x4a\x2f\xfe\x1c\x1b\x04\x51\xb1\x21\xff\xd6\x10\x6c\x4a\x80\x32\x85\x99\x49\xe0\x90\x9c\xff\x9a\xb9\xfe\xd1\x17\xe4\x86\xf8\x45\xb5\x52\x82\x3f\xb9\x2a\xd6\xc0\xf5\x37\x1b\x02\x9e\xe6\x0c\x5b\x0f\x98\x8a\x21\xfe\xc4\xca\x24\x80\x08\x48\xd2\x4b\x00\xa2\x71\xa2\x2f\x5a\xfb\x54\xa1\xb1\x03\x25\x92\x41\x2e\x93\x39\x93\x1b\xf4\x34\xf1\xa3\xf3\xb7\x9a\x57\x38\x95\x1b\xac\x79\x68\x3b\xf6\xee\x71\xa7\xbe\xca\x32\x11\x79\x68\xab\x43\x5e\x20\x2a\x3f\x1a\x99\xd0\x96\x16\xf6\x56\x4e\xdd\xb9\x82\x3f\x0c\x4c\x15\x5c\xd4\xc3\x5b\x6c\x38\x8f\xfa\x3c\xc2\xea\x62\x9e\xc1\x72\x51\xae\x3c\x52\x43\x7b\x18\x54\xe2\x09\xfa\x37\x2a\x89\xf9\x10\x4b\x22\xd8\x73\x41\xd7\xa3\x9e\x60\x50\xe4\x54\x99\x25\xaf\x42\xfc\x8e\x27\x8a\x0c\x3b\xc4\x00\x8f\xa4\x11\xc2\x44\xae\xcf\x8a\x05\x23\x91\x05\x2c\x8e\x46\x5b\x39\xb6\x89\xcb\xc8\x1b\x23\xaf\x4b\xb5\xe2\xba\x59\x3e\x87\xd1\xfa\xdb\xcc\x80\x57\x42\x63\x2e\x51\x3c\xa2\xa7\x68\x35\x3f\x98\x45\x23\xba\x77\x87\x5c\x03\x2f\xda\xfa\x52\xeb\xd9\x3d\x69\x08\xb5\x87\x6c\x95\xc4\xda\x43\x80\x07\x9c\x4b\x10\xf2\xc5\x72\xe1\x66\xca\x8b\x3c\xbe\x13\x9e\xde\xa5\x7c\xbf\x5b\x52\x55\xe1\xb8\x97\xdc\xa0\x0a\x7b\x02\x58\x7e\x62\x06\xde\xb5\xd6\xda\xa5\x4c\x81\x8c\x95\x02\x31\x67\x8a\x36\xdf\x84\x73\xcf\x61\x85\xc8\x4c\x34\x90\xb8\x04\xc0\x61\x37\x0f\x1a\x19\xd2\xe0\x54\xf2\x67\xb2\xe1\xc5\x55\x78\x83\xe5\xa9\xa7\xaf\xb0\xc7\xe4\xc9\xcf\xdf\xa4\x15\x2a\x21\xfb\x6d\xac\xc4\x12\xb1\xee\xaa\x88\x41\xf2\x74\x43\x98\x1a\x97\x1b\x42\x65\x68\x1b\x58\x42\xfa\x2b\x7b\x02\x7a\x70\xf0\x1b\x5a\xb6\xc2\x67\x87\x3e\xa3\x61\x6b\xbf\xeb\xa0\x81\x7a\x39\x93\x71\x8b\xa8\x7b\xed\x23\xa7\x7e\x54\x44\xa1\xa2\x15\xf8\x1e\x32\xbb\x52\x85\xac\xbe\xe0\x72\x71\xa4\xb2\xca\xf1\x1f\x2e\x6d\xbd\x59\x6f\xef\x2b\x7a\x46\x4a\x47\x2a\x2e\xcd\x87\xe5\xef\x41\xf6\x3b\xfe\xed\x7c\xc1\xbf\x15\x58\x21\x5f\x26\xfd\x32\xb6\x85\x26\x8b\x88\xdf\xa9\xd1\x40\x59\x76\x51\xdb\x28\xac\x67\x53\xab\x8d\xab\x56\xff\x74\x65\xcc\x41\x6c\xde\xb3\xc7\x31\x5c\x83\x33\xdf\xef\xe6\xa0\xed\xbc\x22\x70\xfe\x97\x5f\x73\xf0\x3b\x2e\x88\x5f\x76\xf2\x0e\x7f\xc7\x25\x1a\xce\x9f\x82\x6f\x15\xb4\x08\x1e\xf1\xd1\xfa\x97\x87\x8b\x45\x55\xb5\xae\xaa\x69\x42\x72\xfd\xee\x00\x12\x8a\xf8\x29\x6e\x17\x4b\x18\x3e\x0e\xdd\xe0\x30\xa4\x83\x90\x5e\x79\x10\x8a\x5d\xab\x35\xc5\xbb\xea\x09\x69\x0e\x39\x65\x42\x43\xe8\xf4\x71\xa6\xe2\x55\x95\x48\x25\xee\x1b\x8b\x1c\x2a\x72\xb8\xe8\x17\x4f\x8b\xb5\xb4\x34\x1a\x85\x72\xff\x80\xc7\x89\x1e\xff\xa1\x7c\xe0\xa0\x38\xd4\x61\x88\xa2\x23\x20\xa8\x1e\x1d\xfd\x6f\xfa\x60\x21\x59\x41\x56\xdb\x34\x15\x34\xea\x73\xf0\x27\x75\x84\x2e\x10\x46\x5f\x9a\xe9\xcb\x9e\xf0\x1d\x78\x7b\x9d\xa2\x87\x3a\x23\x58\xb2\x5f\x3b\xff\x8e\x33\x42\x12\xc1\xf1\xaa\x0e\xe0\x03\x98\x00\xce\xe8\xe3\x3e\x07\x60\x2b\xee\xb0\x0f\x73\xcd\x9b\x15\x06\x7d\x9e\x93\x0b\x83\x1c\xf4\xca\x65\x5c\x69\x7f\x40\x16\xdb\x2d\x15\x8d\x46\xfa\xf3\x85\x53\x40\x3b\x14\x5c\x3d\x1a\x34\x43\x6b\x2c\x1a\x47\xb3\xe0\x96\x72\x64\x76\xa0\x42\x3e\xa8\x22\xc2\x04\xfa\x6c\x8b\x15\x63\xe2\x68\xa3\x48\xb2\x0a\x5c\x42\xf6\x73\x98\x13\xac\xdd\xc7\x9f\xaa\xd9\x7e\xf6\xa1\x01\x23\x21\x33\x68\x75\xe3\xab\x57\x24\x2b\x68\x92\x46\x58\x25\x96\x12\xde\x2a\x91\x31\x0d\xb3\xcd\x25\x3f\x3e\xd8\x33\xd0\x4e\xca\x9f\xd7\x81\xcb\xe5\x96\x8b\xb0\x69\x58\x5a\xf1\xe8\xb3\xb1\x1b\xd2\x04\x2f\x67\x69\x14\x70\x0a\x1f\x47\xb9\x36\x32\x4d\x55\xac\x16\x5a\xd8\x6d\x45\xa1\x31\xf0\x47\xe4\x6a\x4b\x46\xe8\x8a\xf1\xe6\x82\xb8\xb3\xf8\x3d\x53\xed\xd3\x17\xd8\x4f\xc5\xc0\x43\x99\xd4\x8a\x5b\x81\x3b\xc4\x47\x96\x07\x4b\xfb\x89\x8f\x30\xfc\xe5\x20\x5a\x77\x24\x90\x47\x9f\x89\xe3\x94\x25\x0b\x19\x04\xd0\xab\xdc\x65\xcf\x6a\x2e\x83\x15\xe5\x23\x79\x52\x05\x63\xf5\xbb\xf2\x28\xfe\x41\x0a\x1c\x2e\x40\x9c\x42\x05\xba\x39\xf5\x9a\x95\x90\x89\x1b\xe5\x57\x38\xc8\xb2\x71\x2d\xdf\x29\x29\x72\xb8\xc8\xf1\xca\x49\xdc\xa1\xdb\xd2\x27\x1d\x1f\xe5\x3c\x5f\xae\xdf\x97\xab\x80\x5d\xa8\x21\xaa\xe9\x3a\x23\x79\xd4\x4c\x3b\x48\x1d\xe2\x1b\x90\xe7\xd7\x00\x07\x67\xdc\x95\xa3\xba\xd1\x93\xa5\x5e\x74\x15\x78\x5a\x18\x67\xd1\x7c\xb9\xc7\x00\x0f\x18\x0d\x1c\xaf\xda\x7b\xb7\x9e\x13\x34\x08\x48\x1f\x6e\x18\x5c\x9b\x8a\x5a\x18\xd5\x07\xb7\x0f\x48\xc3\xc9\x1b\x58\xb3\x8c\xee\x19\x08\x6e\x2d\x96\xdb\xb3\x1b\xbe\xa2\xc5\xdc\x99\x21\xa3\x53\x46\x67\xa2\x51\x89\x31\x9a\xc0\x3a\x81\x07\xfb\x4f\x3d\xd3\xc1\x82\x2f\x52\xaf\xef\xe8\x08\x2b\x5f\x00\xd7\x7f\xca\x01\xd6\xd0\x25\x11\x07\x5c\x8f\xc0\x05\x54\x3c\x94\x17\xa4\x6c\x75\x02\xc7\x58\x1d\x73\x46\x47\xea\x3c\x0f\xe6\xbd\x72\x7c\xdc\xa1\x11\xc0\x71\x15\xc6\xe7\xd5\x21\x03\x77\xdb\xf3\x4c\x9c\xae\xcf\x79\x09\xcf\x78\x70\x02\xe2\xcd\x7a\xff\x73\x06\xbb\x22\xdd\x20\x12\x40\xa2\x41\x54\x25\xcc\x05\xb1\xc8\x18\xd5\x38\x5b\x18\x22\x89\xac\x2f\x65\x30\x14\x1d\xc0\xcf\x89\xe9\x02\x1d\xd0\x3f\x10\x57\x41\xae\xcf\xf4\xf5\x63\xbe\xfa\xc6\x2e\xd3\x38\x89\x78\x27\x67\x3e\x03\x81\x06\xb5\x7e\x38\x53\x2a\x82\xd1\xe6\x3c\xd3\x8a\xc6\x65\x15\x03\x46\xea\x52\xd3\x2b\x81\xd5\x27\x7e\xa6\xce\xe8\xbd\x3b\xa2\x43\xb3\x05\x6c\x11\x7b\xfe\x6b\x4a\xf5\x8c\x22\x05\xfb\x34\x49\xf8\xe4\x0e\xd3\xb7\x4c\x1b\xea\x72\xcb\x49\xce\xa2\x1b\x15\xc4\x00\x2a\x57\x50\x7d\x3c\x79\xa8\xbf\x21\x37\x8d\xc6\xd6\x07\x2b\x28\x47\x50\x5f\x05\xb3\x67\xc3\xb3\x4b\xc8\x8d\xa8\xcf\xfc\x52\x70\xd3\xd7\x80\x81\x5c\xd5\x25\xec\xe1\x08\xfb\xd3\x6e\x4c\x21\x7b\x68\x0f\x0d\xf0\xa2\xab\xec\x5b\xe2\x52\xe5\x2f\x18\xc7\xca\x92\xd8\x47\xf1\xf7\x3e\x9b\x54\x36\x0a\xf0\x2e\x63\x19\x1a\x73\x8b\xbc\xab\x0b\xa6\x00\xe4\x72\x25\xa7\x9a\x20\x61\x38\x89\x3b\x76\x10\xdd\x76\x41\x6b\x3a\xdc\x20\xc3\xed\x0e\x63\x08\xdd\x69\x2a\x28\xf7\x6b\x40\xdb\x5d\xa7\xd6\x41\xdf\x7c\xa3\x0a\x10\xc9\xe1\xc2\xaa\xc4\xdc\x48\xef\x03\xee\x67\xd1\xa8\x81\xcd\x93\xa3\x5f\xaf\x1a\xf0\x62\x62\x68\x31\x18\xce\xcc\x04\xb0\xc7\x6c\x2a\xda\x3d\x6c\x0d\x26\x66\x55\x3d\x80\x51\xb3\xa9\x1b\x5c\xd9\x48\x03\xe3\xab\xd7\x6b\x6b\x65\xfb\xb8\xb4\x6b\x37\xb8\x34\x37\x52\x02\x9a\x49\xdc\x67\x85\xd3\xd2\x2f\xa8\xd5\xcb\x11\xad\x71\x4b\x5a\x88\xda\xc7\x9a\x89\xaf\xf1\xa6\xe5\x91\x3c\x2b\xba\x70\x2f\x10\x15\xbb\x55\x24\xdf\xf8\xb8\xf4\xaa\xec\x95\x07\x7c\x7c\x36\xe0\x99\xc0\x87\xef\xbf\xea\x4b\x48\x16\x8c\x4a\x2d\x67\xd4\xad\xf6\x39\x48\x1e\x17\x48\x8c\x84\x38\xda\xe7\x47\xe3\xd8\xb7\x40\x60\x7c\x8d\x50\xc7\x9c\xfe\x5a\xb5\x8a\xbc\x40\x3f\x92\x94\x70\xcf\x05\x47\xc1\x2e\x22\xaa\xc6\x98\x0d\x5d\x03\x83\x7a\xfe\x99\xbe\x5e\xa3\xb2\x45\xc7\x79\x1e\x0d\xd6\xeb\x55\x01\xfa\xc8\xfe\x35\x70\x19\x27\xff\x2c\xb4\x42\xb4\x31\x8f\x16\xa3\x3c\xc2\x58\xdc\x82\xaa\x10\x23\x5b\x42\x78\xd2\x28\x1d\xf0\x6a\xbe\x3f\x8b\xe6\x2c\xf5\x69\x3a\xe0\x57\xd0\x68\x56\xed\x23\x1e\x68\x03\x40\x9f\x67\x05\x20\x0c\xbb\xdc\x7a\xda\xe2\xd6\xd3\x47\x70\xa5\xd2\x00\xf0\xad\x0f\x68\x39\x50\x20\xc4\x70\xf6\xb1\x10\xe8\x94\x5b\x9f\xda\xaa\x86\x4b\x6b\xb9\xeb\xbe\x49\xa5\xc4\x95\x43\xa5\x65\x5a\xdb\x00\x06\xfc\x83\x9b\xda\xb4\xae\x99\xa8\xc3\x52\x4e\x92\x6f\xa6\xb6\x89\xe5\x7d\xe8\x40\x2f\x32\x09\x56\xba\xd8\xb7\xd0\x02\x0d\x24\xf0\x20\xec\x33\x90\x23\x32\xe2\xd6\xab\x07\xac\x3e\x4c\xab\xc2\xc7\xb6\x88\x36\x96\x58\xa3\x75\xf5\x19\xea\x88\x95\x54\x27\xad\xc6\x30\xd0\x40\xc0\x06\x20\x2d\x46\x7d\xcc\xcd\x63\xdc\xc3\xb4\x0e\x02\xf4\x3c\x8c\x2e\x5e\x0e\x77\xe7\x52\x4a\xfa\xe8\x5c\x02\xc0\x4a\x1d\x5f\x6b\xea\x32\x0d\x0c\x11\x87\x80\x5d\x7b\xd4\x1b\x0c\xe8\x48\x18\x98\x62\x84\xd8\x40\x83\xde\xaa\xd4\xae\xdd\x7c\x60\xc0\xa2\x2f\x64\x4f\xd8\x61\x3f\xa8\xe2\x1b\x88\xc6\x34\x24\x56\xbf\xd1\x7e\xb4\xd0\x7e\xbc\xd8\xb3\x5d\x13\x78\xfb\x92\x0d\x8c\x17\x88\x56\x1b\x57\xda\xb0\x42\xfa\xfe\x37\x27\x81\x20\xfc\xe0\xfb\xdf\x9e\x0c\x88\x16\x6c\x37\x26\x9c\x0f\xbe\xff\xe4\x64\x60\x4f\x58\x57\xcf\x0d\x00\x83\x4e\x6d\x50\x55\x07\x5d\x39\x53\xe0\x49\xa8\xe2\xd7\x50\x36\x32\xd5\xdc\xa9\x63\x54\x4e\x8d\x9e\x7f\x44\x63\xb6\x69\xfb\x2b\xdf\x6f\x8e\xd5\xa4\x1e\x2f\xeb\x6e\x17\x95\x4e\x38\x79\xb1\xcb\xb5\xe1\x9c\x4c\x3c\xc0\xcb\x1f\xad\xdd\xb4\x67\x2e\x85\x28\xfb\xaf\x66\x7f\xd0\xbf\xe2\x35\xf8\x17\x24\x89\x3f\xa0\xe9\xff\xa0\x2a\x29\xd3\x59\x86\xd6\xe1\x91\x4c\x4d\xb2\x36\x28\xd2\x3d\x8a\x3e\x59\x0d\xcc\x8f\x4d\xa1\xb6\x6f\xe0\x2b\xb7\x32\x69\x4a\x21\x6d\xd4\x45\x3f\xb2\xf6\xd4\xb8\x44\x8d\xc1\x84\x80\x83\x6f\x4f\xb2\xe2\xd2\x0a\x0a\x0c\xd9\xbb\xf2\x3a\x26\x00\x12\x8d\x19\x80\x5d\x4d\xca\xd3\xa8\x0e\x55\xa2\x90\xf7\x04\x57\x14\x4f\x00\xac\xa5\x57\xc4\xd3\x04\x07\xe1\x98\x5e\x56\xfa\xf5\x19\x9d\x13\x3a\x5b\x3c\xf6\x1f\xec\x21\xfd\xf2\x56\x8c\x41\xff\x60\x6e\xb2\x87\x22\xe3\x01\x6a\x0d\xd5\x68\x06\x95\xfb\x9e\x2d\xa3\xce\x8d\x94\x81\xcd\xdd\x0b\xa8\x4d\x21\x74\xa7\xbb\x00\xd6\x03\x63\xbe\xb2\xdc\x14\xc9\x5d\xdd\xb5\x8a\x91\x81\xbe\x84\xb3\x57\xc3\xf9\x19\xa3\x54\x8c\x0a\x94\x4f\x98\xfa\xac\x82\xff\x28\x17\x51\xe2\xf5\x2d\xdb\xc0\xe3\x00\xe1\x20\x83\xc5\x0c\x1a\x3a\xa6\x28\x71\x42\x19\x23\xcc\x92\x26\x4e\xbf\xe9\x24\xd5\x63\xc1\xa2\x1e\x97\x25\x1c\x50\xfd\x02\x7b\x97\xe5\x48\x2b\x89\xf7\x9a\xe3\x09\x1a\x54\x92\x5d\x0e\xb3\xf4\x15\x15\xd5\xb9\x33\xd7\x9e\x7c\x9e\x2c\x47\xcb\x0e\x7e\x7c\xd3\x28\xa8\xf8\x78\x06\xd6\x1b\x8e\xc2\x0d\xeb\x59\x61\xf0\x94\xf9\x70\x81\x25\x56\xb2\x8b\xc4\x37\x5a\x4c\xb1\x53\xc6\x90\x30\x04\x3a\x0a\x24\x61\x33\x28\xeb\xd2\x65\x47\xcc\x43\x47\x42\x3b\x36\x17\x9c\xea\x36\x28\x36\xb0\x42\xa2\x1b\x6d\xfa\x23\x8a\x80\xd8\x56\xf0\xbf\x99\x08\x6e\x04\xb8\x7b\xaf\xe0\x8d\xe4\x05\xc9\x71\x0c\x16\xe3\x3c\xe5\xab\xd5\x7c\x61\x08\x2f\x6a\x4c\x2a\xe1\x2d\x10\x96\x89\xb7\xed\xf6\x18\x8c\x94\x45\xf6\x44\x60\xfd\x90\x52\xbb\x08\x07\x16\xa9\xb2\xec\x0f\x9d\xbd\x5b\x1c\x37\xa1\xbd\x3f\x29\xe0\xac\x8e\x30\x59\x2e\x53\x31\xc1\x85\x70\x13\x51\xaa\xa3\x45\x8e\x68\x93\xf6\xf4\xaa\x44\x19\xdd\x9a\x0a\x67\x16\xd3\x01\x65\xc5\x09\x3a\x1c\x7f\x84\x34\x1c\x09\xbd\x3a\x8b\x57\xb4\xc1\x00\xd7\x07\x4c\x85\xf1\x94\x5e\xbd\x11\xe3\x31\x63\x0c\x64\x70\x6e\xb5\x8e\x11\xca\x28\x84\xf4\xee\xa2\x68\x72\x12\xbd\xf3\xbf\xbd\x87\x69\x69\x7a\x2c\x0d\x8f\x5a\x0d\x1f\xd5\xd9\xb5\x12\x32\xd7\x80\xe4\x27\x0f\x31\x06\xd7\xab\xf9\xe8\xd6\x8a\x06\x80\x7b\x0b\x44\x4b\xd5\x8f\x7b\xe3\x01\x5d\x9e\x91\xf9\xb2\xa3\x9a\x8a\xc5\x80\xea\x2d\xb2\x29\xc0\x50\x44\xe7\xef\x74\x56\xea\x12\xef\x96\x80\xe3\x39\xa2\x6f\x9f\x19\x12\x18\x76\xdc\xb0\xd2\x35\x7d\xe0\x28\x8e\x67\xbc\x4c\x3f\xed\xdf\x30\x28\x00\xc0\x82\x1f\x53\x83\x1f\x23\x19\x50\x14\x8c\xf8\x2f\xf4\x83\x1f\x45\x59\x32\x8b\x23\xeb\xde\x79\x42\x21\xda\x92\x01\x23\xa7\x6d\x33\x2d\x01\x8f\xb2\x2d\x75\xc0\x58\x57\x9f\xa2\xae\x4d\x21\x5f\xfa\xdb\x91\x36\x31\x40\x8b\x14\xfe\x56\x17\x4a\x1f\xc3\x6e\x65\x50\xd1\x02\x4a\x40\x8a\x04\xc8\x7f\x07\x52\xe4\x17\x76\xf7\x1e\xbd\xc1\x2d\xca\x99\xe8\x16\x4f\x49\xfb\xd1\x33\x79\xbf\x4d\x18\x16\xae\x58\x92\x95\xb8\x98\x05\x3d\xf1\xd9\x92\x48\xce\xfa\x51\x86\x83\x41\xf3\x22\x2b\x1a\xf3\x49\x36\xd6\x18\x4d\x43\xc9\x44\x9f\x3f\x1a\xfe\x15\xc6\xba\x20\x75\xc4\xe5\xc6\x09\x91\x22\x7c\xd0\x8c\xf6\x44\xb9\xcd\xd6\x85\xf4\x1d\x15\xa0\x5c\x0b\xa8\x53\xd4\x40\x91\x59\x65\xa2\x9a\x0e\xc7\x8b\xf4\xfa\xe2\xbe\x65\xd7\x74\xe3\x3c\x63\x41\x36\x13\xd4\x06\x35\xed\xfa\x0c\x5a\xb7\xde\x7e\x19\xde\xbd\x15\x0f\xd8\x0b\xe0\xe2\xbb\x85\x53\x28\xe4\x4c\xf4\xc1\x51\x51\xf9\xc8\xb7\xef\xdc\x6c\x6d\x8c\xb1\xdf\x42\x42\x6d\x1b\x36\xde\x90\xc3\x93\x0a\x6f\x27\x87\x34\x5f\xce\x91\xd9\x11\x4d\x9b\x8f\x08\xc7\x98\x8d\xa6\x27\x65\xea\x24\x19\xe4\xc0\x75\xdc\xaf\x55\x9d\x6c\x4b\x12\x2d\xf0\x6c\xf9\x5e\xf1\x90\xc8\x0a\x12\xd5\x7e\x66\x3b\xd0\x11\xeb\xa8\xbb\xb0\x51\x57\xb3\xb1\xdd\x54\x34\x39\xad\x1b\xc0\x68\xa2\x0f\xef\x46\xcf\x76\xb9\x93\xc4\xfe\xda\x97\x3d\xe5\x06\xd2\x69\xaa\x95\xe5\x92\x10\xb4\x88\x59\x7f\x90\x19\x18\xf8\x81\x23\x97\x8a\xc9\x3f\x1b\xb3\x00\x3e\xe2\x61\xd0\x0e\x92\xa1\xc6\x86\x8d\x37\x1a\xff\xf2\x41\xf1\xa7\xfd\x49\x31\xaa\x24\x63\x09\x76\xd0\x35\xcf\xad\x3e\x9c\x3f\x64\x0c\xfd\x34\x3d\x1b\xe2\x3e\xa2\x39\x5e\xa3\xd8\x64\xf1\x63\x1e\xc0\x00\xb0\x79\x7c\xcd\x07\x24\x21\x8a\x8c\x12\x82\xee\x62\xb4\x74\xa8\xc1\x8e\x12\xf3\xc5\xd6\x0e\x8d\x8d\x68\x73\x4d\xa4\x91\x89\xb1\x08\x23\xd2\xd5\x7e\x36\xa5\x61\xf7\x0c\xca\x7f\x87\xdc\x3c\x45\x6a\x23\x04\xa9\xe7\x08\xeb\x8c\x61\xd5\xee\xa3\x09\x8f\x78\x47\x1f\xdc\x8e\xc9\x1e\xb3\x79\x13\xc1\xa6\xae\x91\xa6\xd2\x12\x35\x19\x13\xb2\xe9\x86\xf9\x59\xcf\xd6\x98\x27\x9a\xa8\x51\x9c\x5c\x36\x51\x33\x26\xe7\xa2\x1b\x21\x49\x1b\xcd\xef\x3a\xba\xa0\x34\x86\xb6\x9a\xc3\x40\x64\x9b\x6d\x6a\x43\x2b\x15\x16\x63\x86\xed\x41\xd1\x08\xe9\xc3\x51\xf8\xef\xa3\xe1\xe1\x8f\x8a\x45\xb2\xc8\x0a\x0f\xd6\x54\xf4\xda\xe4\xd4\x35\x39\xa4\x27\xcf\x42\x70\x11\xcc\x69\x3b\x1a\xa3\xa2\x41\x28\xa6\xae\x18\xe9\xde\xe3\xbd\x11\x4f\x3c\xd8\x8f\xa9\xdb\x30\xd5\x68\x89\x25\xca\xb8\x70\x88\x61\xc9\xc6\xa5\xb9\xbb\x8b\xde\xe7\x7a\xcf\xe6\xf1\x4e\xc6\xf2\x1d\xb4\xc4\x5b\x91\x18\x15\xe6\x0c\x2c\x72\xdb\x28\xb0\xc8\xd2\xa3\xc6\x98\x3a\x75\xf2\x51\x23\x53\x51\x7a\x74\xf8\x02\xa3\x71\xfd\x42\x23\xb1\x12\x49\x27\xb9\xb4\x9e\x7a\x39\xcb\x29\xd8\x9f\xa5\x70\x53\xfd\xe5\x90\xbc\x4d\xeb\xa4\x6b\x4a\x49\x5f\x98\xcc\x19\xef\x94\x97\xfd\x37\xf8\x1f\xfd\xd5\x77\xc6\x2d\x15\x30\x2a\xa0\x19\x1c\xc9\xc1\x62\x04\x36\x21\x78\xfc\x58\x82\xf6\x82\xec\x79\x8d\xae\x4a\x80\xc9\x28\x2e\x21\x27\x0f\x30\x1d\x0a\xe2\xcd\xa6\x22\x7e\x03\xc4\xcf\x8b\x82\x12\x8b\x6d\xf6\xf8\x7d\x64\xfe\x00\x07\x8b\xef\xea\x38\x90\x51\xb8\xd3\xd4\xbb\x9c\xd2\x01\xaf\x12\x60\x50\xa8\x41\x75\x57\x5b\x4f\x9e\x30\x2d\x2a\xf9\x14\x08\xd8\xcc\xfb\x41\x1f\x84\x92\xe4\xef\x44\x47\x9a\xa5\xec\xb1\xaa\x9b\x54\x9e\xbe\x31\x80\xb2\x7d\xb5\xd5\xe7\x64\xdb\x09\x0f\xf1\xe6\x3d\x24\x7a\xe8\xa4\x20\x17\x42\x69\x4d\xcc\x9b\xae\xe7\x40\x51\x38\xa9\x23\x66\x03\xcd\x2e\xc8\x90\x54\xda\x27\x59\xf5\x07\x22\xe0\x51\x21\xb7\x60\x6d\xd0\x11\xc2\xa8\x42\x67\x17\x9b\xcb\xb1\x5c\x5a\xce\xb9\x3d\x27\x55\x96\x36\x29\xf6\x43\x30\x80\xe4\xf8\xf6\x00\xc2\xf0\x59\x05\x37\xf7\x09\x3d\xea\xca\x7d\x8b\x81\x85\x8e\x43\xee\x59\xc8\x38\x76\x98\x68\xee\x4c\x46\xf5\x9b\x18\xd6\xfe\x10\xe8\x89\x19\xbd\x12\xd4\x5e\x42\x1d\x99\xf0\x80\xa3\xc3\xe7\x70\xf3\xe6\xdb\x69\xb5\xa1\xc4\xa3\x5d\x2b\xc9\x72\xbe\x62\x96\x63\xab\x88\xc7\x06\x2d\x67\x26\x4e\x11\x22\x46\xdd\xec\xb1\xad\xbe\xf6\xb1\x21\x44\x90\xb5\x42\xfb\xeb\x52\x23\x2c\xa7\xaf\xbd\x93\xe8\xe0\x93\x8d\x6f\x2a\x58\x1f\x45\x04\x54\x01\x14\xc8\x5c\xb3\x17\x24\xe9\x70\xd1\xd9\x20\x7c\xfa\xf8\x68\x48\x5c\x3b\xf2\x4a\xd8\xaa\x1f\x0d\x58\x2b\x8b\x3e\x02\x79\x24\x76\x75\x8f\x41\x87\x7c\xff\x94\x76\x13\xfd\x37\xb7\xdf\xe9\x4c\xde\x0b\x37\x8d\xb6\x06\xbd\xaa\x05\x83\x89\x7f\x92\x30\xc0\xe8\x79\x05\x23\x1f\x4b\xea\xc2\x89\x71\xa8\x86\x62\xcb\xdc\x44\xd6\x96\x3e\x34\xa5\x56\x79\x65\xd0\x94\xda\xf9\xd6\x3f\xd3\xdd\x06\x02\x61\x6c\xe2\x8a\x3f\x48\x76\xba\xdf\xd0\x77\x07\xbf\xa3\xfe\xdf\x23\xb5\xb5\x2a\xd5\x41\x1a\x81\xe7\x82\xdf\x43\x0e\x1e\x1c\x04\x80\x25\xaa\xa1\xd2\x05\xf6\xa6\x56\x75\xfb\x8c\x41\xd0\x1e\x50\x1c\x60\x09\xd4\xa0\x8b\x44\x65\xad\x67\xc1\x27\x2b\xfd\x20\x89\x57\x39\x6a\xce\x7f\x51\x30\x05\x6d\xe1\x9c\x0c\xa6\xa0\x5b\xce\x17\x4f\xe3\x93\x57\x34\x56\xf3\xf1\xf5\xd6\xcb\x1b\xc9\x11\xe0\x7d\x90\xf7\x86\x42\x62\xf3\x9d\xe2\x98\xc1\xc6\x9c\x50\x06\x8a\x76\xf5\x18\xcd\x9f\x9e\x05\xd4\x30\x61\xa4\x63\x28\x77\xf0\x83\x0d\x8b\x06\x42\x31\xac\xf8\x4c\x52\x6e\xa0\x04\xb0\x05\x48\x39\x0e\x04\x8c\xaf\x36\x1b\x26\xf6\x86\xd6\x5e\x03\x18\xf3\x12\x05\x28\x53\x64\xb1\x5b\x6f\xee\x4c\x53\xe8\x54\x38\xcc\x6b\xbc\x86\x4c\x01\xa3\x75\x74\x63\x5b\x05\x1a\xd3\xed\xb2\xa0\x85\x1b\x93\xc8\xeb\xf4\xc9\xa9\x56\xf2\x98\x3e\xa7\xc7\x42\x10\x4c\x4e\x60\xac\x15\x29\x79\x83\x43\xd5\x33\x2e\xfe\xff\xa8\x96\xf4\x7c\xec\x96\xcc\xf5\xd2\xa4\xa8\xc4\x50\x49\x6c\x8c\x54\xa1\xb5\x10\xca\x4f\x72\x30\x75\x55\x92\x08\x6b\x0e\x93\x82\xdd\x4d\xf0\x18\x82\xea\x28\xca\xf1\xb9\x8d\xf1\x27\x98\x09\xc1\x68\x23\xbc\x74\x00\xd8\xb7\xb3\xb6\x0e\x8d\x60\x74\xb5\xa3\x1a\x41\xd1\x98\x5b\xf1\x0a\xd9\x6f\xf9\xdf\xa3\x81\x29\x44\x9e\xaa\xf1\xb9\xf1\xe3\xa8\xb9\x6a\xa7\x4d\x33\x90\x83\x3c\x34\xff\x81\x11\x4a\xfe\xd3\xf9\x0f\xbc\x5b\xf0\x8f\x07\x28\xee\xc7\xff\xd4\xb2\x8c\xc6\x85\xb0\x71\x9f\x93\xe2\xe8\x30\x27\xff\xa8\x8f\x69\x6f\x05\x64\xb6\x78\x05\x5f\xae\xa1\xd4\x19\x76\x61\xf6\x36\x06\xdf\xe2\xd0\x77\x7a\x4c\xc4\xd9\xa9\xfb\xb3\x4a\x19\x5d\x0c\xa9\xc0\xde\x7d\xb8\x93\xe1\xdc\xb5\xd6\xbd\xc3\x70\xb6\xde\x7e\xbe\xd6\x9a\xdd\x8b\xeb\x16\xf3\x64\xaf\xf4\x77\xd2\xf0\xcf\x3e\xeb\xdc\xd8\x90\x4b\x3f\x5b\x8f\x81\x28\x21\x16\x85\x35\x43\x69\x41\xc0\xee\x19\x9c\x8b\x4b\x9b\x57\x9b\x0e\x1f\xfa\x11\xe4\x87\x32\x36\x8b\x37\x50\x3f\x8a\x4c\x00\xc9\x1c\x4c\x46\x73\xcb\xe4\xac\x7a\xb7\xfd\x60\x4e\x45\x9e\x4e\x80\x25\x96\x18\x2f\x13\x90\x18\x8c\x98\xa1\x81\xc6\xbc\x59\x1b\x29\xcf\xcd\x7b\xc8\x2f\x8f\xdd\x60\xb7\xc3\x4e\xfd\x82\xb5\x5e\xaa\x55\x26\x14\x02\xa6\x14\x80\x8e\x33\xd1\x5d\x34\x35\xa5\x1d\x56\xe2\x9e\xe6\x96\xd1\xcf\x95\xfc\xf6\x70\xe2\x0a\x00\xb3\x7a\x18\x2d\x48\x10\x53\x22\xf3\x53\x3b\x56\xba\x22\x89\x13\x4c\x0d\x77\x43\xb1\xe7\x6c\xd1\x08\xcc\xa9\x7c\x3d\xf5\xaa\x89\x0b\x21\x69\x69\xad\x9e\xe0\x98\x96\x83\x01\x94\x1e\x50\xd8\x2c\xd9\x22\xf6\x8b\x7b\x32\xd5\x0d\xd7\xbd\xc2\xf2\x56\x50\xf5\xf6\xc4\x0b\xf4\x50\x65\x37\x07\x3b\x82\x7f\xec\x49\xdc\x58\x8c\x03\x7f\x75\xb7\x1f\xaf\xf5\x47\x8e\x76\xe1\x4e\x74\xd3\x7a\xf5\x40\x3c\x6f\x25\x30\xfc\x0c\xc3\xc0\x76\x34\x77\x56\xd1\x85\x23\xe1\x9e\xdc\xbb\x9b\xdf\x1c\xdd\x0d\xce\xe6\xfa\xd3\x38\x0c\x9f\x0a\x47\xae\x43\xdf\x9a\x3d\xa9\xc8\x43\xe8\x6e\x94\xde\x2b\x22\x02\x51\x8f\xa0\xf7\x2d\x45\x91\x61\xbf\x76\x66\x86\xe0\x6f\x09\xd9\x6a\x34\xfe\x3f\xba\xde\x3f\xd3\x1a\x96\x9e\x1e\xc9\x00\x97\x06\x17\x0b\x51\x5f\xac\x47\xe7\xe7\x48\xd6\x54\x8f\xae\x3d\x60\xe6\x9c\x1e\x38\xa9\xde\x3c\x7c\x27\x2e\x2b\xe4\x7d\x6b\xcd\xc0\x6c\xd0\xda\x21\x45\x36\x23\x0a\x1a\x43\x56\x16\x09\x7c\x44\xde\xf6\xcb\x19\xd7\x37\x99\x39\x7d\x60\xcd\x61\xe8\xc3\xcb\x23\xb4\x86\x61\x4d\x1d\x3d\x7f\x12\x68\xc0\x9c\xb2\xf2\xd0\x66\x9c\x23\xd7\x8d\x2f\x39\x6c\xaf\xa4\x12\xeb\x26\xe7\x93\x6d\x99\xb3\x45\xce\x88\x5a\x4a\xb8\x2b\xc3\xb6\x19\xc1\x3d\xd6\x1e\x87\xcb\xb7\xa2\xbd\xc3\xa3\x5a\xfb\x8d\xd9\x1a\x9e\x5c\x72\x6d\xd0\x4c\xb4\x42\x84\x33\xec\xb7\xc7\xd9\x29\x49\x56\x0a\x68\xdf\x61\x5c\x8f\x7f\x89\xae\xf8\xf2\x8c\xa6\xd8\x53\x7c\xf3\x7b\x8d\x81\x2c\xf9\x69\x13\x79\xa5\x0e\xe3\xd4\x36\xa6\x2c\x56\xd0\x5c\x63\x1e\x5f\x9f\xd9\x75\x74\xba\x4f\x5b\x75\x6b\x5f\x25\xb4\x9d\xcd\xa1\xf7\xa2\x39\x13\xd5\xd2\xa3\x3b\x75\xdf\x25\xd1\x86\x02\x90\xf6\xb2\x8e\xe9\xea\xfc\x29\x22\x50\x18\xb5\x69\xec\x19\xbb\xc7\x75\x37\xa7\x91\xa8\x8d\x01\x55\x34\xc1\xae\x71\xd8\xfe\xe8\xb6\x1f\x7a\xa2\x0f\x34\xe9\xb4\x35\xbb\x12\xb0\x83\x1e\xc5\x6e\x5e\x2b\x09\x9f\x88\x19\x64\x46\x05\xd2\xb5\xad\xb1\x69\x8b\x03\xb3\x4f\x89\x79\xd2\xcd\x53\xf9\x15\x43\x9b\xa9\x74\xce\xef\x05\x6e\x5d\x34\x38\x3e\x9b\xf7\xe2\xf8\x71\xdb\x13\x78\x37\x2e\xcc\xa2\xdc\x47\x35\x2a\x68\x92\xc2\x52\xe0\xd3\xab\xae\x3f\x9c\xd2\xe6\xc1\xed\x44\x60\x03\x0a\xe8\xaf\xba\x67\xaf\x87\xf4\x55\x31\xc3\x95\xea\xf5\xd0\x61\x6a\x30\x82\x1e\x5c\x47\xea\xd9\x5a\x24\xb6\x52\xe5\x2c\x24\x96\x75\x1f\x99\xad\xf2\xcb\x82\xd6\x7d\x31\x1f\x8d\xa1\x6d\x63\x67\x51\x54\xb5\xf4\x27\x16\x59\x64\xb2\xca\x73\x14\x51\xc1\x14\x06\x9f\xd0\x2b\x60\xdd\x47\xea\xda\xa3\x98\x9a\x39\x4e\x87\x90\x12\x7a\x15\x65\x52\x1c\xaa\x52\x45\xd4\x0c\x97\x6f\x73\xda\x10\x44\xd5\x74\x16\xb8\x87\x94\x83\x80\x27\xe9\x8c\xdb\x8f\x0c\xaf\xc4\x88\x4a\xe5\x89\x89\x21\x16\x39\x98\x2e\xe6\x29\x60\xfc\x52\x62\x69\x31\x12\x0c\x07\x4c\xdf\x41\x95\x29\x8a\x0d\x67\x26\xe0\x7b\x73\x77\x1a\x3d\xba\x96\xce\xa2\x46\x91\xbe\x10\xdd\xce\x11\xa4\x9c\xef\xfe\x7c\xfc\x84\xa3\x23\x15\x8a\xbe\xf8\x48\x7b\xf2\x7f\xe3\xe1\xa2\xb0\x48\x27\xed\x94\x0c\x5c\x94\x50\x44\x4b\x0d\x8d\xc7\x85\xab\x74\xc5\xf1\x49\x9b\x6a\x12\x36\x19\xd0\xc7\x98\xbf\x1d\x97\x83\x23\xb7\x9a\x91\xbe\xd0\xe5\x9c\x34\x34\x6c\xdc\x9c\x22\xc8\xec\xdd\xab\x3a\xbb\x46\x77\xbd\xb0\xa5\xd4\xed\xa3\x5c\x42\xd0\x80\x07\x34\xdf\x68\x36\xda\x79\xd2\x7e\xf4\x80\xfb\xff\x19\x58\xa5\x76\xa2\xd0\x2b\x3b\x52\x47\xdc\x25\xd7\xef\x44\x57\x90\x42\x75\xbe\xab\x05\x43\x0e\xef\xe5\xcf\x35\xa7\xb1\x91\x31\x04\xa1\xe5\x29\xd2\x29\xf0\xac\x18\xba\xb9\x71\x8d\xdf\xd8\x76\x7d\x3e\x7c\x77\x8e\xf3\x3d\xc0\x1b\xd6\x7a\x78\x59\x2b\xdc\x44\xc1\xb5\x7e\x5d\xe2\xd7\x75\x75\xac\xf4\x53\xa2\x6c\x63\x5d\x69\x0a\x54\x30\xe2\x63\x34\x82\xce\xea\xbb\x68\x62\xb2\x17\x18\x8b\xed\x03\xa5\xf2\xe8\x2a\x1f\xe1\xe0\xf2\x2a\xb2\x7c\x8f\x56\xfa\xfd\xe2\x68\x8f\x8e\x94\x68\x49\xf2\xc6\x6a\xc1\x12\x89\x95\x9f\x49\x8a\xe9\x27\x6d\x8c\xc6\x30\xdf\x3c\x5c\x46\x74\xa5\xb2\x8f\x31\x11\x88\x21\x2f\xe8\x8e\xe1\xf3\x43\x79\x9d\x50\x56\x22\xc7\x03\xfd\x3a\xad\x45\x92\xee\xd8\x8d\x90\x8f\x31\x11\xb2\xd2\xe9\xca\x06\xc7\x83\x44\x8c\x31\x39\xa1\x43\xde\x44\xeb\x77\x9b\x87\xd3\x2a\x00\xe3\x26\x85\xe6\xc2\x69\xc4\x99\x31\x08\x0d\xcb\x71\x5c\x9d\x47\x49\x34\x35\x28\xed\x90\x42\x9a\xf3\x45\xe2\x0d\x05\x1a\x6c\xf6\x05\x90\x40\xa9\x23\xa3\x80\x27\x32\x7e\xb6\x03\xea\x02\x51\x66\x6d\x32\x68\x6a\xb1\x8b\x52\x10\x60\x15\x97\x92\x40\x93\xa2\x21\x03\xd5\x09\x8f\x42\x01\x9a\x71\xde\x9c\xed\x81\x19\x6d\x44\x48\x8a\xaf\xd6\x96\x05\xed\xf5\xb3\x9d\xc5\x67\x7c\xfa\x45\x5f\xa9\xb2\x8a\x84\xf3\x97\x0c\xac\xa6\xa3\xc3\x6b\x06\x48\xa7\x8c\x02\xfc\xae\x15\xda\x1c\xb8\x35\x5a\x7c\x1b\xee\x03\xc1\xdd\xf8\xbf\x8f\xff\xf9\x5b\xf2\xc7\xe6\x21\xfc\xf8\xd1\x99\x33\x67\x3e\x42\x56\xe0\xa3\x5a\xa5\xe4\x96\xf1\x63\x51\xc6\xc4\xd2\x75\x09\x10\x07\x63\x7a\x5f\x5c\x49\x31\xe1\x10\x57\x1a\xef\x95\x9c\x67\xce\xc5\x69\x66\x4b\x30\x69\x18\x5c\x7c\x36\xe1\x95\xa1\x27\xe4\x2d\x81\x5b\xa8\xb8\x2a\x00\x5b\x72\x7b\x02\x78\x36\x4f\xc5\x21\x58\x25\x0c\x40\x62\xa7\x19\xc8\x83\xbe\x58\x62\xb6\x82\x1e\x0f\xb8\x9a\x49\x10\x36\x0b\x63\x83\x30\xf1\x9b\x8e\x65\x69\xa7\x5d\x1d\xa2\x07\xc3\x16\x11\x89\x88\x41\xc0\x66\xa2\x95\xe5\xf6\xc3\x1d\xd8\x2f\x03\x75\x23\x8a\xa6\xcd\xb4\xa4\x3e\xdc\x06\x39\x85\xfb\xe5\xd2\x28\x65\xc8\xa3\x65\x91\x7d\xc1\x12\x75\x34\xb8\xba\x75\xa8\xb9\x3a\x25\x5b\x71\x11\x0f\x92\x21\x4e\x56\xb5\x20\xd4\x3f\xd3\x8d\x31\x33\x90\xc4\xa8\xdc\x08\x87\x64\xcd\xb6\xb7\xae\xc0\x21\x15\x9f\x11\xce\x69\x45\xc1\x24\xba\xc0\x4d\x5d\x6e\x7a\xa1\x99\x82\x2f\xe9\x33\xde\xb5\x00\xbd\x14\xff\x47\x00\x72\xfb\xdf\x19\xae\x86\x0e\x1b\x5c\xfe\xda\x61\x45\xf9\xaf\x1d\x65\x82\xf9\x6b\x72\x1c\xc3\x7f\x95\x25\xf7\xaf\x9d\x5a\x39\xfe\x9b\x4d\xf4\x45\x9f\xa1\x7e\x92\xc2\x18\x7f\x8a\xd4\x7b\x08\x96\xcf\xfb\xbb\x5b\xec\x4b\xdb\xbe\x6c\xf2\xd9\x33\x76\x56\xa3\x5e\xa1\xe3\x13\x90\x9c\x5a\x29\x2b\x01\xf0\x29\x9d\x4b\xb2\x50\xa7\x35\x5e\x78\x6d\x52\x38\x42\xf3\x2c\x9d\x95\xc0\xef\x1c\xb9\x99\x4e\x1e\x50\x63\xc6\xe1\xb3\x0e\x0d\x62\x25\x42\x49\xdd\x0f\x7e\x32\x3e\x61\x12\xe9\x69\xba\x8d\xfd\x61\xd3\x88\x19\x81\xec\xd5\x41\x2f\x16\x4a\xd8\x03\xd5\xc1\x11\xd4\x12\xdb\xa3\xab\xa7\x9f\xb2\xc7\xb3\x51\xba\xf1\x70\xdb\x64\xa4\xb8\x03\x50\x3b\x12\xf4\xc4\x5a\x0c\xbe\xea\x31\x96\xd6\xc9\xa3\x85\x67\xe4\x68\x94\xb6\xf5\x2a\x56\x61\x73\xdd\xe5\x0b\x30\x1d\x6b\x81\xb9\x3d\x0e\xdb\x26\x01\xdb\x12\x65\x76\x2a\xe6\x24\xce\x19\xca\x97\x31\x21\x7f\xe7\xf6\x5e\x67\xec\x8a\xb9\x44\x23\x25\x7f\xd4\x8c\x39\xca\x59\x62\x55\x88\x4c\x73\x4a\x31\xac\x8a\xc3\x9a\x0a\x1a\x83\x89\x25\x91\x01\x15\x9e\x1b\xe7\x74\xd3\x9d\x1b\x7b\x5a\xff\x85\x0f\xee\xd6\x39\x14\x8e\x12\x95\x80\xd1\x08\x80\xd1\x37\xe4\x5e\x1c\x56\x13\x4d\x4b\x18\x3b\x63\x4c\xc7\x27\xed\x17\x1b\xe1\x6c\x3d\x6c\xdc\xb7\x96\x89\x02\x73\xc4\x53\xc2\x5c\x85\x94\x1f\x0d\xeb\x70\x4a\x06\xb2\x26\x37\xc7\x64\x4b\xb0\x4c\x63\x91\xb4\x29\xd9\x91\x3a\x93\x0f\x85\x1d\x4e\xd4\x9a\xb9\x1d\x4e\xd4\x3a\xa7\xef\x11\x56\xb4\xbb\xa9\x38\xac\xa8\xb5\x49\xdd\x01\x43\xcd\xaa\xe9\x11\x43\xd3\xb7\x2e\x11\x3e\xf8\x67\xb7\xba\x47\x48\xe1\xb8\x5e\x6c\x25\xa1\x04\x5a\x89\xc0\xc2\x09\x81\x4e\x4f\x2e\x23\xad\x5b\x2d\x5b\xe9\x1a\xae\x61\x3a\x51\xf4\x06\x06\xfa\xfa\x2b\xfe\x99\x00\x43\x72\x62\x56\xde\x6c\xab\x3e\xd7\x7e\x70\x20\xcf\x30\x95\xb3\x7f\x75\xb6\x05\xe7\xee\x69\xbd\xb3\x77\x8b\xbf\xb2\x86\x5f\x42\x5d\x8b\xb5\x22\x15\x90\xe1\x5f\x22\x91\x29\xd9\x49\x01\xdd\x84\xc7\x97\xa8\x0d\x06\xa5\xfc\x91\xf8\x17\xc5\x13\xd5\xf9\x23\x89\x44\x6d\xbd\x7a\xd6\x5e\x6f\x18\x70\xc1\x48\x09\xc8\x5d\x4e\x8b\xdb\xb8\x10\x4e\x3e\x8f\x36\xd6\xda\x0f\x16\x0d\x88\x5a\xd9\x1b\xf0\x80\x3f\x27\x18\xa8\x8f\xb2\xef\x07\x8b\x40\x77\x08\x0c\xf6\x21\xdb\x31\xfe\x0c\xd6\x59\x3f\xde\x8e\x98\x9c\xb3\x71\x25\x70\xe2\x14\x11\xdb\x88\x42\xa8\xc4\x71\xaa\xc2\x07\x64\x1e\x1a\xcd\x5d\x06\xae\x27\x7e\xf3\xe1\x96\x26\x20\x38\x9e\xa4\x86\x90\xf5\x06\xa4\xd4\xdc\x9d\xe9\xd4\x9f\x63\x26\x5f\xfa\x44\xb1\x43\x38\x46\x3e\x87\x07\xe6\x18\x18\x54\x26\xe1\xf1\x47\xc8\x6f\x1a\xae\x03\x79\x73\x63\x89\x13\x7f\x74\xfa\xdd\x42\x1e\xbd\xf6\xbc\xaa\x15\x06\x85\x5b\xc0\x60\x29\xc3\xf9\xf2\xa8\xd8\x90\xa2\xca\x0c\x28\x05\x8e\x9e\xb6\x7c\x5b\x22\xb3\x2c\xec\x74\x26\xe6\x30\x80\xeb\xbd\x1b\xed\xfa\x8c\x64\x43\xa1\xfd\xc8\xa8\xa8\x2f\x7d\xe9\xd1\x5f\x54\x29\xc7\xea\xa1\xbf\xc5\xc1\x01\xef\x1b\x41\x6a\x98\x62\x25\x3f\x00\x5c\xdd\xec\x64\x6b\xfd\x9d\xfe\x08\x93\x50\xf5\x3a\xb7\xe7\xb9\x6a\xa2\x1e\xec\x1d\x1e\xa4\xd6\xa3\x47\xa8\x64\x57\x5f\x4d\x03\x7f\xf5\x2d\x3f\x44\xe6\x04\x2b\xeb\x98\x47\xc4\x18\x66\xf3\xed\x34\x9a\x7c\xbe\x79\x6e\x6e\xfc\x07\xc5\x78\xf7\x92\xf6\xbe\x8d\x6d\x4a\x25\xc5\x56\xda\x7a\x1c\x74\x49\x38\x1d\x5e\xb4\x3b\x2f\xd7\xc4\x5c\x81\xd8\x4c\x0c\xfa\x0d\x77\xce\xf1\x18\xc2\xed\xd9\xd6\xd5\xb5\xf0\xca\x98\x58\xa4\xbe\xdb\x84\xaa\x1c\xaf\x2f\x9e\x8a\x51\xb7\xfd\xe8\x45\xeb\xe5\xb6\x76\x39\xe7\x4c\xb0\xa6\xbd\x91\xc8\x88\x94\x7d\x19\xdb\x1b\x71\x17\xa8\xd5\xda\xbd\x10\x5e\xd9\x68\xee\x2e\xa3\xb5\x58\xfd\xb9\xd9\x51\x35\xcf\x79\x9a\x6c\x37\x8d\xb8\x94\x58\x0e\xd3\xec\xdb\xaa\xa9\xd2\xd6\x0b\xe9\xba\x68\x86\x60\x42\xbb\x61\x36\x1a\x57\xce\x02\x71\x55\xf3\x15\x51\x1f\x0b\x76\xa6\x33\xf5\x59\x0c\x47\xe8\x63\x62\x6f\x25\xca\x4e\x16\xd3\xe8\x00\xbb\x7b\x7b\x1e\x30\x95\x2e\x44\x96\x87\x08\x73\xb2\xfc\x05\x7c\xde\xde\x9f\x44\x31\x5e\xf7\x29\xd3\x06\xbd\x3a\x36\x58\xaf\x63\x67\xd4\x51\x41\x18\x15\x73\x19\x5e\x9a\x6a\xc1\x5d\xd5\x59\x92\xf6\x76\xdb\x9b\xdb\x44\x1c\xca\x81\x8b\xa6\x16\x30\x83\xd0\xd5\x55\x8c\xd3\x7b\x79\x3b\x5c\x3b\x17\xa7\xa5\xd2\x4b\x60\xd9\xfb\xe9\x5e\x31\xaf\x08\x50\xbb\xe9\x37\x01\x4d\xaf\xf8\x1a\xb1\x18\x35\x71\x99\xe8\x20\xe9\x6b\x48\xeb\x27\x17\x80\xf3\x6e\xe8\x9b\xc8\xb4\xa0\x82\x8c\xc3\xef\x3c\xb9\xc3\x07\xd7\x86\x8c\x5f\x3e\x7d\xa9\x00\x46\x02\xaa\x26\x21\x13\x6f\x9e\x59\xc3\x34\x0e\x84\x77\x0e\xa3\xce\xde\x38\xcf\x12\x12\x3a\x32\x29\xcf\x5c\x57\xeb\x3a\x10\xb3\xd9\x6e\x42\x8a\x96\x3c\xee\xb6\x8d\x56\xd6\xb2\x61\x36\xe8\x0b\x71\xea\xa5\x64\xdb\x7a\xed\xd3\xae\x8f\x4a\xbb\x95\x3d\x91\x1f\xe4\x98\x13\x80\x77\x31\xe6\x08\x7d\x8d\x4f\x9d\x72\x85\x41\x27\x46\x74\x82\xe9\x2c\x9d\x47\xcc\x9e\xf9\xde\xaf\x0c\x9e\x8c\x93\xa6\xa9\x14\xce\x46\xc2\x34\x2a\xd4\x69\x58\x12\x10\xe3\xeb\x48\xd3\xc6\xd5\x13\x41\x64\x19\xaa\x73\xee\x40\xb2\xa5\xd6\xa7\x5b\xdb\x77\x5a\xab\x9b\xa8\xf0\x7a\x7a\x25\x3a\x3f\xc7\x11\x64\xc9\xa3\x63\x96\xb2\xf7\x9d\x55\x11\xd7\x30\xcf\x93\x18\x24\x72\x22\x1c\x0a\x8a\xd6\xc3\x0a\x2d\x33\x02\xbc\x1f\xe2\x65\x43\x50\x8d\xf9\xba\x30\x52\x53\xe0\x0f\xbb\xe4\xd4\x7c\xb6\x8e\x0a\x37\x32\x8e\x64\x39\x21\x25\x7e\x0b\xd4\x54\x28\xdf\x5b\x86\xe2\x0e\x89\x30\x1c\x63\x95\xcd\x4a\x63\xfc\x3d\x91\x3f\x69\xba\x3b\x48\x1c\x36\x69\x59\x3d\x4a\xbb\xb8\x44\xcc\x6f\xf0\x10\xd9\xbc\x59\x67\x9e\xb3\xf3\x46\xd2\x67\x3e\xbb\xf4\x39\x09\xad\x91\x80\x6d\xca\x41\xae\x07\x14\x39\xf2\xf0\x82\x24\xb2\xb8\xfa\x16\xfa\x83\x5d\xea\x3c\x96\x55\xd1\xf9\xee\xb0\xf9\x38\xc6\x6c\x3d\x9c\xbb\xdf\x7e\xf4\x8c\x3b\x62\x17\x03\xe9\x1a\x2e\x01\xe0\xf1\xbd\x7a\x67\x77\x5f\x22\x58\x52\x75\x2b\xac\x22\x0b\x45\x18\x19\x53\xe4\x46\xaa\x39\x59\x67\x96\x42\x47\x54\x6c\x6d\x4e\xb6\x5e\xde\x40\x91\x48\x6a\xe6\x27\xe3\xcc\xfd\xb3\xc9\x9f\x8c\x26\x8e\x8c\x9e\xa9\xad\xbc\xb8\xc6\x2f\x33\x58\x8c\x53\x12\x59\x97\xc0\x14\xd4\x1e\x61\xef\x96\x9e\xa1\xe8\x67\xcc\xe1\xd2\x87\x69\xc3\xc6\xe8\xc8\x00\xee\xc9\x82\x8b\x29\x1d\x1c\xcb\x5f\x6a\x49\x27\x07\xb8\x97\x25\x5d\x7a\xf6\x1c\x41\x04\x94\x3d\xe7\x67\xc4\x02\x59\x33\x3d\x5a\x97\xcc\x20\x2d\x0c\x78\x0f\xd0\x9f\x8f\x07\xae\x67\xa3\x55\x2a\xbf\x20\x1e\x78\x0f\x45\x6c\x6a\x60\xf0\x1e\x23\x44\xa4\xc0\x24\x89\x9c\x24\x33\x3a\x78\x1a\xb0\x8a\x8d\x2a\xe0\xff\x5c\x88\xf0\x34\xad\x1b\x7a\x57\x52\x0a\x64\xd1\xe7\xa1\xb5\x70\x42\x11\xc5\x81\xd9\xe1\x30\xc4\x89\xf1\x76\xa6\x11\xd0\x16\x3d\x32\x4a\xd4\x2b\xc5\x49\x54\x18\x9d\xf6\xc9\xbf\x43\xde\x48\xce\x08\x04\xce\x88\x49\x47\x8f\x46\xfc\xa0\x2a\x70\x66\x33\x95\x93\x8e\x31\xb1\x5d\xa6\x7d\x8f\xe0\xb8\x9f\xdd\xe5\xa0\xdc\x31\x48\x85\x52\x23\x67\xf9\x73\xb2\x3e\x17\xda\x0d\x70\x4f\x89\x01\xe7\x2a\x3e\x52\x8d\x54\xbd\xfd\xf0\x72\x7b\xf2\xb9\x39\x46\x36\x03\xd0\xc6\x46\x89\xba\xd9\x68\x69\x0b\x70\x71\xa2\x6f\xd6\x26\x67\xcd\x44\x93\xba\x0c\xde\x6b\x28\xe2\x4c\x85\x72\x6e\x54\x91\xbc\x68\x4c\x36\xd2\x73\x26\x29\x2c\xd9\x26\x8f\x1e\x35\x60\x16\xcc\xd1\x49\x15\x4c\x48\xcf\xd9\x0a\xb8\x5e\x86\xdf\xbe\x3e\xf4\xc4\x96\xfc\x80\xf2\x50\xf1\x77\x73\x10\x56\x01\x12\x2f\x2a\xf8\x61\x7b\xab\x8e\x14\x23\xdb\x4a\x77\x15\x6b\x1a\xdd\x78\x4d\xf0\x24\x91\xb1\x84\xc4\xda\xbc\x3c\x23\xc1\x60\x01\x17\x3e\x7b\x92\x12\x80\x97\x5b\xb5\x42\x2e\x86\x4f\x1f\x63\xc8\x5e\xb3\x57\xb3\xfc\x3d\xba\xfd\x47\x7d\x4c\xe2\x10\x6b\x05\xea\xd1\xfd\x93\xb5\xb9\xea\xdf\x32\x3a\xef\x2e\xff\x25\xfd\x63\xb2\x62\xd6\x8b\xc0\x40\xe8\xe2\xb1\xfb\x86\x49\xc6\x60\x3c\x6a\x6a\x24\x65\x5c\x2a\xda\x6d\xfc\xe6\x9a\x61\x6f\x19\x46\xbf\x24\x0c\x21\x6f\x08\x97\xd1\xd1\x0d\xba\xde\xf2\x38\x50\xbe\x8c\x7e\xf6\xe8\x3b\xee\xf0\x3b\x6f\x4a\x89\x08\x8f\x5e\x45\x6e\x53\x9e\xc8\x37\x26\xbb\x9b\xb0\xcc\xb3\x90\x05\x8f\x4c\x13\x60\x3c\x2d\xbe\x21\x5c\xd4\xc3\x60\xbc\x7b\x76\x2a\xb4\x27\x51\x64\x66\xd6\x08\xf3\x3c\x53\xb8\x48\x24\x68\xd4\x75\xe5\x6d\xe8\xee\xd6\x68\x4d\x45\xef\xe0\xd5\x31\x71\x76\x37\xa8\x99\x75\x23\x35\x25\x05\xbd\xa3\x7a\x03\xcd\x87\xe8\x68\x34\x6e\x0e\x11\x71\x27\xd2\xd8\xe7\xc2\x7b\xcf\xc2\x8b\x7b\x68\x08\x91\x4c\x55\x9a\xc8\x96\xd2\x35\x4e\x2d\x9a\x24\x8d\x83\x35\x35\xfd\x50\x1b\x57\xbc\x8b\xfc\xd3\x27\x90\xd3\xb4\xc0\x08\xec\x2b\xa5\xf7\x9e\x91\x86\x29\xee\x50\xa2\x66\x7b\x42\x18\xef\x8e\x64\x14\x09\x54\x81\x7a\xfc\xb9\x0d\x94\x51\x6b\xaf\x61\x13\x09\xfc\x7f\x37\x30\x53\x8a\xc6\x38\xc7\xca\x66\x91\x8e\x23\x7e\xa6\x7b\x24\xb4\x29\x67\x40\xe2\x2a\xbc\xd7\x72\xf0\x00\xbb\x91\x07\xca\x62\xe6\xa6\x34\xfe\xa0\x7c\xb3\xa4\xca\x50\x16\x39\xf1\x20\x6d\xfe\x85\x37\x99\x59\x18\x85\x2c\xc8\x24\x89\x58\xad\x6e\x93\x24\x06\x45\x59\x46\xe2\xee\xc4\xa1\x0c\xad\xfb\x63\x35\x2d\x06\x54\x64\x8d\xcd\xef\x9e\x55\x4c\x19\xc1\x80\x4d\x43\xae\x18\x35\x3e\x2a\xd1\x70\x78\xfd\x1a\xda\x78\x70\xab\x06\x2a\x8c\x23\x62\x8b\xb8\x9d\x32\xc4\x8d\x37\xcc\x0c\x0b\x24\x5a\xfe\x9e\x36\xe6\x64\x06\xd3\xc9\xf7\xfb\x79\x4c\xb1\x78\x11\x48\xa5\xd7\x9d\x9b\x6b\xc0\x55\x53\xe6\xe9\x40\x72\x77\x4a\x98\x6a\x20\xb4\xf2\x65\xef\xef\x2a\x49\x2b\x13\x88\x5c\x94\x92\x3f\x57\x4a\x30\x78\x20\x86\x74\x52\xc4\x3d\x67\x9c\xa0\xb4\xff\x02\x41\x64\xe2\x60\x96\xc9\xa8\xce\xf8\x2c\x20\x2a\x29\x11\x7b\xc8\x2c\x3b\x0d\x44\x73\xf3\x18\xe5\x91\x8b\x86\xfd\x32\x76\x27\xb5\x5a\x98\x43\xed\xa1\x8c\xdc\x70\xdc\xeb\x3c\x58\xc4\xf0\x43\xe4\xa7\x45\x1f\xa2\x95\xc7\xf8\xa1\xea\x57\x31\xb9\xd5\xce\x41\x7b\xbd\x81\x11\xe5\x8b\x99\x78\x19\x48\x0c\x8d\xf1\x43\x0b\xaa\x71\x12\x74\x2b\xb1\xb8\x06\xf3\x47\xdc\x8a\x95\xaf\x56\x27\xc5\x36\xdb\x1a\x85\x5d\x1b\x26\xe9\x79\x4d\xcd\x03\x06\xdb\x7e\xb0\xd8\x9a\xae\x47\xe3\xd3\x69\xdd\xb2\x53\x1e\x5b\x9b\x50\xa7\xb8\x98\x34\x06\x8c\xe8\xd0\x4f\x32\xd1\xfe\xcf\x1c\xf4\x22\x50\x46\xd6\xf1\x57\x94\x24\x28\x3b\x68\xeb\x2b\xe7\x29\xeb\xfa\xaa\xcc\x59\x53\xbe\x72\x98\xf9\x64\x59\xfb\xe5\x94\xf5\x29\x7a\x72\x07\x73\x68\x9f\xdd\xb5\xbf\xae\xdd\xe4\x0b\xcb\x9a\xc8\xae\x0e\xc8\x4e\xb6\xab\x1d\xb2\x99\xed\x9a\x8e\x9d\x3c\xcc\x2e\xa3\x05\x48\x1f\x28\x9b\xfc\x77\xd5\x30\x24\xce\x5d\x65\x94\xae\x33\xda\x9d\x4f\x16\x18\x24\x7f\x57\x2f\xca\xeb\x35\x59\xc0\x82\xaa\x2e\x70\x6a\xa4\xb9\xb7\x17\x4e\x2f\x75\x2d\x0a\x5d\xe1\xae\x76\x38\x27\x6f\x6a\x0d\x96\x55\x21\x16\x4b\x39\x96\x22\x44\xe6\x97\x91\xc5\x27\x69\x50\xc1\x19\x8f\x72\x0a\x2c\x4e\xc3\x32\xa6\x42\x54\x6a\xa8\xa3\x45\xf7\x7f\xa3\x18\xcd\x02\x30\x0a\x01\x25\x5e\xf3\x29\xdf\x06\xbc\xdb\x48\xff\xad\x6c\x70\xb6\x35\x73\xdf\x8e\xac\x18\x3f\xb1\x6c\xda\x6b\x37\x20\xc6\x2f\x4c\x13\xc4\x29\x03\x75\x7b\xf2\x56\x7b\x65\xb2\x11\xc8\xc7\x7c\xa6\xd2\xac\xe9\x56\xd9\xa8\x40\xa5\xa2\x7a\x8f\x06\xba\x07\xa6\x9b\x80\x39\xfd\xec\x90\xe8\xb1\xc0\x67\xc3\x3b\xed\xda\x83\x91\x67\x68\xf3\x3a\x86\x8f\x3f\xba\x5e\x62\x0c\x66\xcd\x9f\x1d\x00\x3d\xb8\xe5\x41\x7e\x85\xac\x01\xb0\x2f\x06\x4b\x75\x59\x99\xa7\x1e\x0e\xb1\x1c\x38\xba\xad\xd4\x54\xa9\xef\xd7\xb2\x3d\xd0\x41\xaf\x9a\x1b\x2c\xa8\x01\x6e\x8b\x9b\x91\xc4\xc1\xb9\x75\x2e\x5c\x39\x44\x0b\xe1\xab\xaf\x7b\x54\x49\x5d\x1c\xec\xd0\xa8\x1a\x67\x57\xa3\xc0\x2a\x76\xff\x15\x97\x1c\x3c\x31\x06\x62\x10\x0c\x91\x02\x9e\x1d\xfc\x24\xc7\xe7\x87\x7d\xf0\xf9\x63\x8e\x7f\x8b\x46\x2f\xa4\xa3\xff\x50\x66\xf6\xd3\x7e\xa3\xbd\xf9\x20\xbc\x04\x57\xf6\x06\xe7\x31\x61\x13\x41\x9d\x92\x94\x73\x0b\xe9\x10\x29\x18\x89\xe1\xa8\xae\x93\xb3\x21\x84\x6d\x0e\x27\x6d\xab\x8d\x66\x0c\x9b\x13\x7b\x1a\x89\xd5\x71\xfe\x4a\x80\x4e\xa7\x71\x91\x10\x5a\x83\x3d\xeb\x75\x6a\x6e\x54\x6a\xe9\x4c\xd5\xf4\x1c\xab\xf9\xf6\x18\xbf\xd9\x71\xac\xd6\x56\xeb\xfe\x0b\x46\x62\x4f\x0c\x53\x4a\x25\xce\xb0\x78\x5f\xaa\x44\x52\xe2\x91\x3d\xb6\xab\x8f\x1c\x65\x84\x30\xfd\xba\xba\xce\x73\x5a\xbb\x89\x95\x3f\xb2\xc1\xc4\xbc\xf4\x58\x38\x25\x5f\xfc\x9a\xa3\xec\xb6\x02\x4b\x53\xf5\x62\xfb\x3b\x42\xa2\xd1\xd2\xd9\xce\xe2\x15\x13\x23\x4a\xe6\xee\x41\xbf\xe2\xd7\x80\x75\x73\x45\x67\x0f\xa7\x49\x3e\x10\x21\xd0\x99\x98\x4b\xa9\x04\xdc\x19\x86\x5f\xaf\x51\x94\x00\x61\xe3\xc6\x1f\xc2\x50\x25\x17\x97\x55\x89\xc8\x1e\x55\x05\x65\xc3\x05\xd6\x19\xb0\x10\x13\xcf\xe9\x05\xdc\x70\x36\x3c\xdd\xbc\x6e\xd4\x94\x3a\x7e\x7f\x35\x4f\xfe\xdd\xaa\x8f\xab\x5d\x7d\x8c\xf8\xe4\xd7\x2a\x69\xd2\x73\x38\x7d\x62\x9e\x3a\x13\x37\x39\xac\x34\xea\xe5\x17\x76\xba\xdb\x56\xe3\x91\x2a\xdc\x03\x8f\xa8\x57\x95\x81\x8a\x6b\x83\x77\x26\xa6\xa3\xab\xdd\x3d\xa8\xc5\x1a\x72\xf3\x23\xd6\x52\x39\x5f\xc1\x17\xa7\xf7\x82\x51\x85\xe4\xdc\xad\x3a\xdd\x0b\x60\xd6\xf1\x8a\xc0\x0e\x1b\xf0\xad\x47\xbb\x9d\xc5\xcb\x47\xc0\x93\x1d\x8e\x68\x48\x45\xed\x05\xd7\xc4\x68\xa1\x47\x45\xd1\x66\x15\xd1\x4d\x81\x17\xe1\x67\xea\xf9\xfd\xff\xee\x16\xe0\x8d\x64\x90\xed\xd9\xf6\xb3\x3b\x5d\x67\xac\xdf\xf7\xab\xc0\x7e\x01\x34\xd0\xa6\x64\x4e\x4a\x91\x2b\xc8\x76\xd9\x39\x8e\x9f\x9c\xb4\x45\x63\xe0\xe4\xaa\x99\xc7\x4b\x2a\x77\x9f\x32\xcc\x9d\x05\x9d\x55\x6a\x85\x6a\x0d\x10\x8c\xf4\xf8\xcd\x71\xcc\xb8\x85\xd1\xd6\xe0\xa6\xf5\xdc\xab\xae\xca\xe9\x5d\x77\x37\x66\xb6\x51\xc8\x17\x86\xdc\x94\x11\x7c\x81\xdf\x7f\x7e\x08\x5d\xd5\x7b\x8c\xa1\xbb\x39\xf3\x06\x55\xfc\x01\xaf\x84\xc8\xa9\xbf\x56\x38\xe5\x62\x76\x95\x60\x28\x47\xf6\x15\xe9\xed\x85\x93\x8b\xd1\x2d\x60\x87\x1b\xe1\xce\x4c\xfb\xce\x7a\x57\x83\xf0\x5c\x0e\xbb\xd5\x3c\xd9\xfd\xa4\x37\x40\xef\x25\x3c\x96\x9d\xe5\x0b\xe1\xf8\x39\xe1\x3a\x92\xcd\xf8\xc0\xc8\x61\x44\x04\xe2\x68\xe4\xb6\x22\x7d\x68\x20\x05\xe4\xb1\xcd\x86\xc5\xdb\x3b\xd9\x12\x46\x87\xe5\x47\xbc\x30\x5a\xa0\x74\x3e\xd3\x68\x8b\x63\x8d\x82\x6e\x3f\xbd\xe0\xf6\x1a\x13\x2f\x07\x75\x09\xaf\xb6\xdf\xdc\xec\x2c\xaf\x71\x46\x65\xb3\x7a\x17\x8e\x65\xcc\xa7\xaa\x59\x3d\x19\x48\x19\x18\xc2\x34\x84\x09\xd5\x46\xd0\x78\xc7\xaa\x17\xdd\x78\x1c\x8e\xad\xf4\xa8\xa7\x06\xc9\xd5\x52\xc6\x67\x54\xb6\x37\x4a\xb0\x59\xf7\x00\x19\xa7\x31\x5b\xce\xfe\x49\x92\xc3\x18\x8e\xb3\x5b\xb2\x18\x75\x93\x83\x27\x93\x17\xad\x1b\x32\xd5\xaf\x4c\x07\x0b\x10\x29\xed\x94\x03\xbb\x7c\x54\xf4\x30\x05\x9c\x13\x8b\x5c\x29\x31\x82\x8c\xa0\x20\x90\xbf\x0a\x15\xc7\x76\x72\x30\x56\xfe\x2a\x11\xa0\x55\xdf\x3c\x65\x2e\x22\x8b\xed\x8a\x3b\x88\x92\x0d\xf6\xfb\x1d\x18\xcd\x86\xf3\x97\x64\x2e\x6c\xe8\xbf\xbe\x17\x5e\x98\x62\xa5\xad\xe4\xcf\x8f\xe7\x65\x9a\x0d\x52\x9d\xf4\x40\x52\x5c\xc1\xb4\x45\x92\x69\x10\xf3\xc1\x56\x75\x2c\x91\x00\xde\x4f\xca\x28\xa1\x5d\x96\x53\xd8\x99\xe0\x25\x7f\xd0\x13\xd6\x4a\x84\x18\xc4\x34\x0a\x83\xc5\x80\x23\xf9\x20\x38\xe3\x57\x8a\xb1\xbd\xf2\x12\x20\x7e\x40\x18\x28\xc4\x7e\x77\x33\x9a\x19\x43\xf7\xf2\xad\x29\x24\x19\x64\x3f\x99\x82\xe2\x9b\x1f\x07\xc8\x42\x85\x12\xdb\xaf\x90\xe8\x33\xa9\x1f\x8c\xe7\x15\xeb\xd6\xd8\x9e\xc4\xa8\x24\x50\xc3\xf9\x1f\x25\x4f\x9b\x4e\xef\x48\x39\x1c\xe3\x94\x8e\x94\xd2\x02\x9d\x00\xf5\xa9\xe8\xaa\xc3\xa2\xbb\x5f\xb1\xdb\x99\xf3\xd1\x27\x82\xfe\x51\xcf\xbb\xba\x8a\xd6\x3e\xeb\x9b\xdc\xc0\xbf\x4a\x0b\x98\xaf\x45\x9f\x22\x3d\x1b\x38\x4e\xa8\x9e\x33\x4f\x14\xcc\x7c\xc8\xeb\x87\x89\xd0\xfa\x72\xce\x30\x99\x13\xda\x6d\xa8\x62\x15\x4f\x1e\x60\x8c\x1e\xe8\x34\xc6\xad\xb3\x6e\xdd\x96\xa4\xab\x2d\x44\x7d\x38\x3a\xad\x10\xb1\x6a\xe4\x14\xa6\x3a\x7c\x6e\x8c\xb8\x33\x5a\x9a\x69\x55\xf7\x86\x47\xfc\x4a\x95\x53\x1e\x26\xbb\x3d\x22\x6d\x62\xea\x56\x2b\x35\x76\xf7\x86\xa5\xaa\x75\x75\x6f\xea\x06\x55\x3d\xa0\xbf\xfd\x33\x65\x49\xd3\xa7\xe6\xd3\xdc\x9b\x6d\x9d\x47\x07\xc5\x2e\x71\xb7\x38\xe4\x8a\x63\x3e\x85\x6f\x0b\xc7\x1b\xca\x97\x76\x51\x3c\x46\x51\x52\x7a\x29\x9a\xa4\x18\x08\x84\x7e\xcc\x34\xce\x2a\xd3\xee\x98\x35\x08\x0c\x2b\x81\xa6\x29\xe6\x18\xda\x8d\x29\x3d\x06\xad\x4f\xd6\xde\x92\xe6\x00\xf8\x72\xb0\x5a\x4d\x0f\x23\x0e\x46\x60\x2c\x89\x65\x5f\xc4\x2b\x9f\x8c\x37\x06\xc3\x60\x9f\x50\x1b\x43\x1a\xf2\x4a\xc1\x90\x04\x68\x1a\x2c\x68\xbb\x9e\xa0\x8f\x4d\x60\x44\xd8\x0c\xd8\x8c\x3e\x2a\xed\x0b\xcf\x81\x10\x32\x61\x3d\xc2\x7d\x76\x77\xa6\x10\xb4\xb5\x30\x83\x31\xa3\x18\x34\x19\x2b\x9a\xbf\xa6\x67\xa0\x4e\x6a\x6a\x55\x0e\xc4\xa0\x8f\xb3\xbe\x06\x92\x0b\x12\x47\xc2\xdf\x31\x45\x50\x20\x19\x20\xe3\xaf\x56\xd2\x41\x1a\x36\x22\x33\x41\x69\xd6\xb0\x4d\xc9\x2c\x8c\x59\xf2\xfb\x0e\x49\x5c\x47\xe5\xdf\x1c\x63\x4b\x29\x8c\xf1\xa1\x8c\x9e\xbf\x93\xcb\x01\x7f\x17\x97\x03\xfe\xee\x52\x70\x1c\x8e\x64\x4a\xe1\x4e\xe4\x7b\xaa\x15\x13\x3f\x19\xc6\x80\x7b\xb5\x4a\x85\xbd\x86\x12\xb8\xc0\x05\x60\xb2\x66\xb8\x79\x55\xbf\xe0\xc3\x0e\x51\x3e\x7a\x74\x00\xde\xba\x21\x40\xb6\x47\x02\x7f\x1b\xf2\x03\x0c\x65\xbf\x17\x3d\x5a\x15\x2f\x2d\xfe\x8e\x48\x40\xbe\xb7\x1e\x3f\x0d\xe7\xee\xca\x77\x12\x6c\x15\xe1\x79\x24\x21\xd6\x97\xdf\x9a\x9f\xd5\xcb\x20\x85\xe1\xd3\x0b\x68\x9d\x9a\x02\xa0\x95\xef\x4a\xc0\x80\xd7\x8a\xa0\x25\x98\x06\xa6\x7e\xbd\x08\x7c\xb9\x0e\xb5\xc8\x71\xde\xd0\x5c\x41\xc9\x8c\x9b\x3b\x9b\x2a\x34\xda\x6c\xfb\xc1\x98\x04\x45\x24\x0c\xd0\x79\x7c\x3d\x11\xfb\x03\x2f\x8e\xec\x01\xd2\x16\x14\x50\x59\x4c\x58\x59\xc5\x41\xb1\x8c\x4d\x10\x98\xe2\x5f\xe1\x5f\x47\xcf\x30\x5f\xad\x56\xbc\xfe\x5a\xd5\x8d\xfd\xce\x34\x49\x11\x3e\x7b\x12\xd5\x1f\xf6\x04\xb4\x74\x2a\xfc\x5c\x02\x21\xdb\xba\xb7\x2b\x3c\x90\x10\x04\x24\x9e\x5d\xc2\xbc\xe4\x9a\x37\x8a\x89\x96\x64\xdb\x7c\xa3\xd0\x7a\x6e\xbe\x47\xef\x41\x8d\x47\x19\x3e\xbc\x12\x6d\xcf\xf5\x00\x82\x03\x51\xca\x76\x96\xf7\xd0\x6b\xe6\xdc\xab\xd6\xd6\xb3\x74\xb8\x00\x79\x37\xdc\x42\xcc\x65\xea\xfc\x0e\xfe\x80\x85\xc1\x58\xf3\xec\x21\xcd\x95\x04\xc1\x73\x55\x0e\x14\x98\xd5\x7e\xf9\x9c\xa2\x23\x5c\x52\x77\x81\xf5\x66\x02\xc5\x17\x32\x05\x6a\x18\xdf\xbf\x5c\x90\xcf\x7e\x13\x38\x9f\x17\x9d\xe3\x9f\xab\xe3\x3e\x5c\x1d\xe1\x34\xc8\xc7\xbf\x39\xf1\x9d\xc3\xf9\x8f\xad\xdb\x82\x10\x74\xb6\x09\x20\xe5\x80\x23\x00\x1d\x72\x03\xc0\x3a\xe9\xca\xdd\x9e\x6f\x4d\x20\xd7\xa6\xb5\x84\xb1\x9d\xc2\xc5\xad\x74\x28\x9b\x28\x92\x5d\xde\x99\x45\xe1\x1f\x55\x27\xa3\x3a\xf2\x78\x21\x4a\x02\x9d\x5f\xef\xdd\x40\xe9\x38\x95\x36\xdf\x4e\x03\x32\x60\x67\x3c\xe1\xc0\xea\xd7\xda\x4b\xab\xce\x87\xbf\xfe\x10\x4d\xc1\x3b\x37\xe8\xbd\x30\xb1\x4c\xae\x8a\xb9\x55\x09\xcb\x38\x27\xbe\x3e\xee\xa0\xbe\xec\xe9\x05\x35\xc7\x53\xde\x08\x02\xe4\xd0\x89\x0a\xa9\xcf\x77\x07\xad\x85\xfb\x04\x27\x29\xa3\xe5\xb2\xa3\x26\xd8\xad\x9c\xc6\xa8\x84\x74\x66\xbe\xfb\xfc\x1b\xc7\xf2\xaa\xb4\xba\xa4\x10\xc0\x8a\xb2\xcd\x8a\xbf\x3e\x69\xbe\xf8\xbc\x72\x38\x61\xa6\x6d\x15\xaa\xf4\x46\x60\x98\x64\x3a\xce\x8a\x2e\xd5\x62\x4c\xb6\x32\x56\x13\x55\xbe\x2c\xae\x49\x5d\x99\xba\x35\xb1\x9f\x35\x91\x6b\x92\x62\xc6\x00\x92\x82\xc6\x1d\x74\xe7\xea\xf2\xb2\x31\x71\x72\x4c\x93\x1a\x83\x48\x12\xa4\x66\x05\xa1\x6c\x52\xc6\x6c\x59\xb3\x61\x56\x68\x02\xb1\x0a\x73\x8c\xe7\xd9\x9a\x80\xe1\x78\xa8\xac\x5f\xeb\x06\x55\x3a\x65\x99\x3c\xd9\x7f\x71\xc5\x14\x7b\x65\xd9\x7a\x22\x5b\x3c\xf1\x7c\xc2\x60\x6f\xbb\xcb\xfa\x32\x32\x01\x25\x28\x73\xf3\x1e\x9f\x05\xe5\x36\xac\x34\xaa\x42\x77\x2c\x72\x2c\xa7\x4e\x7d\xc9\x6c\x01\x75\xb2\xc4\x0f\x03\xda\x02\x92\x30\x0e\xf0\x64\x0c\xde\xa4\x65\xf4\x5e\x74\x91\x33\xac\x1f\x55\x12\x45\xa5\x2d\x55\x89\xbd\x59\x42\xab\x80\xf2\x23\x23\xa2\xf7\x61\xa3\x34\x3e\x9b\x46\xe1\x69\x57\xeb\x4c\xd9\x6c\xdd\x28\x23\x77\x64\x2a\x23\x27\x60\x29\x91\x37\x51\x1a\xe4\x97\x51\x8a\xfc\x81\x81\x12\x70\xfe\x98\x93\x81\x6c\xa2\x5a\x6f\x6e\x44\xeb\x77\xd0\x4b\x59\xd5\xf5\x02\xba\x0f\x28\xc7\x24\x99\xe0\xa0\xc4\x55\x6e\xbf\x41\xc7\xfb\xe8\xda\xfd\xf0\xdd\x35\x05\x5c\xa9\xd1\x5e\x54\x44\xd9\x24\x84\xae\x51\x48\xdd\x08\x3b\x6c\x75\x43\xd4\x57\xc5\xf7\xab\x9c\x81\x5c\x58\xd0\xdb\x6f\x39\x3b\x9f\x5e\x40\x54\xb0\x16\x72\x9c\x0b\x59\x03\x77\x6e\xae\x44\xe3\xe2\xcf\xd3\x55\x05\x06\x9c\x84\xe7\x31\xf7\x80\xe7\x2c\xa6\x42\xa0\x8c\xbf\x80\xf5\x15\x94\xab\x07\x8a\x51\xe6\xe5\xcc\xf2\x5c\xe7\x66\x81\xe3\x45\x37\x15\x40\xef\x7c\x11\x74\x63\xc1\x90\xda\xed\xe3\xc7\xbf\x72\xec\x8d\xc6\xc2\x6e\x2a\xca\x28\xa4\x5c\x91\x39\x09\x24\x98\xe3\xc3\x23\xb2\x3b\x14\xae\xec\xed\x36\xf7\x77\xf1\x10\x2d\x59\xb5\x6c\x02\xc8\x28\xa0\x87\x20\x5c\xbd\x6d\x7e\x2b\x91\x49\x02\x17\xa1\x52\x7b\xec\x20\x01\x60\xac\xda\xed\xb7\x9c\xfc\xdd\x2c\x46\x77\x38\x0a\x60\xc1\x1b\x31\x71\x09\x7d\xdf\x28\x74\x45\x2a\xec\x20\xf6\x15\x43\xa2\xd7\xc6\xd5\x55\xe7\x57\x1f\x3a\x50\xfe\x11\x97\x3b\x1f\xfe\xab\xd3\x5d\x17\xde\x51\x6f\xb8\x36\xcc\x9e\x86\xde\xdf\x5d\x8e\x49\xaf\x3a\xc4\x34\x4a\x73\xc8\x09\x6f\xcf\x71\x04\xfa\xa3\xaa\x06\x29\xb5\xf4\x86\x15\xfb\xf5\xed\x54\x34\x98\xbd\x69\x00\x60\x38\xf4\x63\xb1\x75\x3a\xa0\xb8\x9b\xd8\x8c\xcb\xf8\x5e\xab\xaa\xf6\xd5\x86\x62\x3a\x4e\xb1\xc1\x80\x75\x7b\xa0\x38\x08\x4a\x7c\x81\x8e\x1f\xff\xda\x49\xdc\xd2\xb8\x54\xbd\xce\x18\x54\xf8\xdc\x38\x3c\xc1\xce\x31\xcc\x88\x83\xd1\x4d\x8f\x39\xca\x11\x74\xd2\xa8\xc8\xbb\xab\x7a\xb5\xd7\x5e\x8a\x8d\x36\x59\xd3\xe4\x1c\x0b\xfe\x56\x02\x66\xfe\xb7\xc7\xc8\x96\xe8\x58\xd5\x2b\xf6\x1f\xc3\x66\x4d\x54\xe7\x91\x17\x97\x81\xeb\xec\xa5\xd4\x62\x23\x17\x09\x34\x1d\x8e\x4f\xc4\x45\x8a\x5c\x43\xfd\x23\x59\x1b\x77\x21\x24\xf5\x36\x0b\x3a\xa2\x6a\xec\xcd\xab\x07\x81\x1e\x8b\x0c\x27\x8a\x70\x09\x5d\xcc\x4e\x77\x5c\x25\x9a\x99\xec\x34\x16\xe2\x41\x71\x9e\x1f\x95\xf7\x87\x7d\x21\xf7\xdf\x84\x8a\x78\x65\xdf\x4d\x05\x4e\x23\x17\xb1\x17\x0f\x56\x9c\x13\xe6\xe6\x3b\x17\x2e\x27\x87\x9c\x38\xbd\xad\x07\x63\x88\x8f\xc5\x4f\x15\x4f\x63\x67\xe1\x4d\xb8\xfb\xc0\x3e\xc3\x42\x8f\x14\xf2\x23\xc0\x2e\xe6\x85\x0c\xe2\xd7\x0c\x1d\xe9\x68\x61\xf5\x13\xc0\x4e\xf6\xe8\x3a\x97\x2b\x91\xce\x9a\x45\x34\x62\x64\x41\x31\x54\x51\x0d\xbe\xd0\xe0\xac\x9e\x32\xe5\xc0\xad\xc6\x6c\x8b\x51\xb9\x33\x81\xfb\xc5\x4c\x4b\xb2\xb2\xaa\xad\xc2\x82\xc8\x46\xc7\x66\x16\xf6\x66\xff\xad\xe6\xd6\xa0\x59\xb7\x3c\x88\xb7\x9f\x22\xd8\xf0\x64\xf5\x1a\xb1\x1b\x3c\x49\x4f\xe1\xa9\x91\x30\x04\xed\xd7\xe3\xc0\x2d\xe8\xfd\xfc\x59\x52\xcf\xdc\x97\xf8\xa5\x95\x9d\xb1\x06\x24\x10\x1a\x01\xd3\xb2\xda\xab\x29\x20\x6a\xf7\xe0\x0e\xf8\xb2\x67\xce\x57\xbf\xff\xfa\xcf\x8e\x90\x32\x36\x34\x33\x4d\x2c\xf8\x04\x12\xc2\xba\xe2\x02\x42\x18\x82\xc7\x94\x86\x27\x04\x8a\x90\x41\xdc\x10\x1b\x61\xe8\xdb\x55\x2e\x32\xde\x25\xde\x86\xa1\x18\xef\x8a\x84\x55\x00\x35\x4c\x6e\x80\x72\x39\x66\x25\x15\xc4\xbc\x8a\x5a\xdf\x55\x93\x92\x39\x76\xd5\x0e\x28\x5d\x1d\x83\x19\x37\x13\x49\x54\x6a\x01\x3d\x39\xb1\x41\x52\xa1\x2a\xd2\x82\x9e\x48\xd9\x02\xd3\x94\xc4\xde\x08\x06\x4b\xdd\x07\x05\xc2\x3a\x19\x69\x89\x15\x2f\x76\x1b\x0c\x90\x2f\xc2\x1d\x81\x45\x13\x88\x31\x54\x7d\x1b\x8f\x23\x03\x91\x6a\xf3\x74\xbe\x24\x50\xe1\xa5\x75\xe3\x2a\xe8\x8e\xca\xaa\x91\xfa\x5d\x8c\xdb\xba\x79\xad\xf5\xe4\x41\x73\xe7\xb9\x81\xde\xd8\x10\x52\x3d\xee\xfc\x33\xf9\xc0\x0b\xd0\x48\xc5\x3f\xed\x15\x29\x73\x27\x83\x71\x88\x22\xce\xc4\x4b\x90\x0a\x42\xa3\x4b\x05\x90\x98\x26\x5c\x34\x4f\xb8\x97\x2f\xe8\x6f\xc7\x3e\x60\x82\x2b\xf0\x3e\x33\xac\xac\x27\x13\xef\x0e\xd7\x51\xc0\x83\x05\xbd\x18\x29\x3a\x15\x6b\x5d\xd4\x4c\x4a\xde\x00\x6b\x6b\xf5\x54\x30\x92\xe1\xa5\x03\x1b\x7a\xa8\x5a\x1d\x09\x24\x0c\x0c\xbf\x40\x5f\x9d\x38\xf1\xdd\xf1\xc4\x2c\xe2\xb6\x64\x2a\x56\x53\x7a\x65\x3c\x52\xc3\xa9\x85\x09\x57\x16\x5b\x93\x13\xf6\xaa\x28\x10\x79\x72\x04\xc6\xbe\xca\xea\x0e\x0f\x56\xd8\x79\x47\xdd\xe3\x3f\xca\x6f\x87\xdd\x77\x12\xeb\x38\xe0\x16\xd1\x82\x0a\x33\xdf\x71\x2d\x89\x08\xfd\x07\xf5\xdd\xf9\x9c\xbe\x07\x7a\xb8\x28\x97\x96\xa1\xa2\x0c\xfa\x0b\xfa\xb3\xc6\x8f\x8f\x09\xa3\xc6\x43\x8e\xf9\x43\xde\xe0\x10\x85\x89\xce\x7e\xc9\x9f\x9d\x2f\xd1\xf5\xfc\xf8\x68\xb9\x9a\xff\xd1\xf9\x4a\x95\x9a\xf5\x51\xae\x4f\x75\x91\x78\x0f\xb2\xdf\x00\x1c\xd5\xf9\x9a\x4c\x0d\x7e\x85\x29\xed\xf3\x98\x75\x7c\xb0\xc4\x79\x5a\xff\xb5\x67\x65\x8c\xd2\x51\x81\x77\x03\x65\xa2\xba\x99\x2f\xf4\xb7\x44\x5b\x58\x23\xbd\x2d\xf6\x7b\xd7\x2d\xfc\x81\xb2\x5b\xff\xaa\xea\x63\xf6\x7a\x7c\x87\xcb\x56\x35\x38\x7b\xf9\xca\x60\x90\xfd\xe3\x17\xce\xe7\x95\xc1\x1a\x25\x85\xb4\x9a\xf5\x06\x2b\xca\x90\x00\x5f\x83\x6f\xe8\x37\x1e\xb8\x13\xfc\xc5\x06\xa6\x40\xef\x31\x2c\xc5\x77\x17\xc3\x94\x14\xf8\x42\x09\x13\xbc\x2a\xf0\x2f\xf0\x97\xf3\x67\x65\x2b\x97\x56\x81\x82\xf5\x28\x78\x8a\xd3\x73\x24\xb8\xe8\x00\x11\x18\xe6\xd7\x0d\x6a\xb2\x26\xea\xc2\x93\xf3\xb9\x7d\xae\xb1\x98\xc8\x3d\x2e\x14\x82\x4f\x99\xcd\xf6\x15\x2a\x40\xc8\x7c\x01\xff\x73\xd8\xb2\x50\x17\x10\x7a\xe0\x6f\x82\x1d\x54\x49\x00\x28\xad\x58\x2b\xe9\xd2\xad\xc9\xe8\xe2\xe5\xb8\x9e\x24\xfc\x44\x45\xa7\x69\xe6\xa2\xca\xcd\x54\xa1\xbd\x60\xdc\x1f\xdd\x42\x2d\x36\x00\x31\xf5\x9e\x71\x33\x3e\x5b\x17\x51\x61\x73\x67\xb3\x53\x7f\xde\x5a\x9f\xd6\xe5\xe2\x38\x8e\xdf\x54\xa2\x1c\x35\x7c\xe4\x87\x28\xdb\xcf\xc3\xe9\x23\xfa\x25\x66\xca\x1c\x9c\x32\x42\x56\xa6\xbc\x92\x9a\x02\x79\x9f\x34\xbb\x64\x05\x4d\x01\x23\x8a\x6e\x15\xdf\x3f\x09\x19\x20\x91\x23\x08\xba\xfd\xe8\x45\x74\x6e\x5c\x43\x23\xe9\x85\x86\xc4\x42\x14\xe8\x2e\x29\xd1\x2f\xea\xda\xb3\x9c\x16\x1c\x1d\x56\xcf\xad\xeb\x72\x98\x6d\x0c\x21\xb9\xb8\xc5\x82\x09\xa1\x35\x9c\x57\x66\xb6\x93\xa1\xc9\x53\x9c\xd8\xce\x04\x98\x08\x54\x18\x0a\x9f\x53\x8e\x4c\xc2\x09\xc9\x6f\x8f\x27\xe1\xa8\x53\xd3\xc4\x92\xc5\x56\x0a\x8a\x39\x1d\xfa\x26\x6c\x8e\x59\x92\xfb\x44\xd8\x74\x73\x32\x3a\xbb\x91\xfa\xe6\x8f\x24\x97\x44\x8d\x51\x69\x80\x8c\x1d\xe8\x12\x9c\x7c\xcf\xcb\x7a\x52\xb9\x21\x93\x8e\x4c\x02\x22\xec\x5e\x88\x43\x1c\x5b\x31\x8d\x38\x45\x6c\xa6\xe2\x96\x75\x8c\x74\xb1\xf4\xa2\x98\xf5\x3c\x68\x9d\x4c\xee\x93\x38\xaf\x1d\x86\x08\xec\x99\x71\x37\xa3\x53\x97\xa2\xf5\x3e\x7b\x27\xec\x5e\x70\x12\xf9\xf9\x82\x4a\xe1\xe3\xae\x5c\xbd\x3a\xb7\x9f\x64\x0e\x04\x62\xc9\xae\x86\xc0\xff\x5d\x75\xc3\x33\xe5\xc4\xaf\x3f\xc4\x73\x25\xc5\x8f\x39\xd1\x8f\x59\x25\xf4\x31\x4f\xf9\x5f\x74\x7a\xd4\x1f\x32\x66\xa6\xda\x1f\x74\x02\xae\x5f\xd2\x82\x95\xa6\x96\x9a\x30\xd3\xdd\xfd\x92\xa1\xf0\x6c\x12\xd9\x0f\xf5\xa4\x8c\x08\x69\x56\x7b\x92\xe6\xb0\xc7\xcc\xba\x72\x29\xca\x04\x7f\x69\x6b\x32\xcb\xee\xe6\x7a\xe4\xf6\x7b\xbf\x21\x5a\x99\x7b\x7f\x60\x8b\xf8\x5f\xb8\x81\x29\x59\xe4\x7e\x90\x8c\x6f\xff\xc4\xa2\xe9\x30\xcc\x7c\x7b\xb6\x27\x8c\x7b\xc3\x97\x40\xdf\x00\x1d\x69\x3e\xf5\x46\x51\x10\xb8\x6a\x7e\x30\x3e\xfe\x6c\x22\x6f\x8d\x82\x6e\x80\x95\xae\x37\xfd\xbc\x1b\xd7\x4a\x25\xf8\xa4\xdc\x8c\x12\xc7\x56\x85\xff\xa1\x88\x98\x2a\x8e\x26\xa6\xe0\xdc\x9e\x05\xb4\x50\xf5\xfd\xd2\xc9\x4c\x7e\xd0\xcf\x62\xcc\x99\xc9\xd9\xcc\x40\xc5\x1f\x26\x4f\x50\x8e\x41\x93\x21\xa7\xd0\xb9\xc3\x70\x65\x3d\xf3\x49\x90\xfd\xc4\x69\x3d\xbc\xfc\x41\x90\xf9\x64\x18\xfe\x44\x1d\xc3\xfc\x75\xfc\x35\x84\xbf\xb6\xe7\xe0\x99\xc0\x5f\x45\xfc\x75\xef\x11\xfe\x79\x06\xff\xbc\xb4\x4e\x35\x00\xd5\x7e\xe2\x44\x2b\x0d\xfc\x31\x8a\xdf\xdf\xbe\x84\x3f\x03\x17\x5e\xe9\x22\xe5\x78\xe5\xa6\x39\x2f\x0c\x27\x7d\x55\x1d\x0c\xf9\xb5\x0a\x7f\x51\x9d\x14\xf3\xa3\xfc\x81\xfa\x39\xe3\xba\xa7\xf8\x27\xf5\x05\x5d\x55\x87\x38\x37\x36\x75\x37\xea\xe6\xa5\x3a\x75\x59\xc9\x9f\xc9\xa9\x6e\xa1\x4f\xfa\xad\x7a\xe5\x2e\x61\x61\x8a\x15\x7f\x04\xd3\x48\x9c\xcc\xa8\x34\x54\x2a\xff\x54\x34\xbd\x18\x2d\xbf\x90\x90\x44\x8d\x6d\x71\x89\x6e\x2c\x86\x8b\x5b\x94\x3e\x76\x2a\x3c\xfb\x22\xa3\x72\xc8\x79\xe5\x91\x9a\x0a\x5d\x79\x76\x9d\x53\x29\x30\x08\xc6\xd7\xe2\x7c\xf4\x2a\xd9\x6b\x86\xc4\xab\x18\x00\xa9\x1f\x29\x19\xee\x80\xc4\x6a\x3f\xed\x37\xfe\xe3\x3f\x88\x30\xf4\xfe\xee\xfe\xe7\x7f\x3a\xdf\xfc\xee\xa7\xfd\x49\x60\xe9\x3b\x63\x17\xf1\xec\xb0\xf5\x0a\x69\x56\x0c\x78\xa0\x28\xff\x90\xa8\x92\x11\x07\x2b\x32\xb7\x10\xc7\x62\xee\x3a\xf3\xff\x06\x00\x00\xff\xff\x29\x2b\x8c\x05\x7e\xd0\x00\x00") - -func confLocaleLocale_zhTwIniBytes() ([]byte, error) { - return bindataRead( - _confLocaleLocale_zhTwIni, - "conf/locale/locale_zh-TW.ini", - ) -} - -func confLocaleLocale_zhTwIni() (*asset, error) { - bytes, err := confLocaleLocale_zhTwIniBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/locale/locale_zh-TW.ini", size: 53374, mode: os.FileMode(438), modTime: time.Unix(1479609057, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _confReadmeDefault = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x52\x56\xa8\xf6\x4b\xcc\x4d\xad\xe5\xe2\xaa\x76\x49\x2d\x4e\x2e\xca\x2c\x28\xc9\xcc\xcf\xab\x05\x04\x00\x00\xff\xff\x92\x34\x40\x88\x17\x00\x00\x00") - -func confReadmeDefaultBytes() ([]byte, error) { - return bindataRead( - _confReadmeDefault, - "conf/readme/Default", - ) -} - -func confReadmeDefault() (*asset, error) { - bytes, err := confReadmeDefaultBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "conf/readme/Default", size: 23, mode: os.FileMode(420), modTime: time.Unix(1444419364, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if (err != nil) { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "conf/app.ini": confAppIni, - "conf/gitignore/Actionscript": confGitignoreActionscript, - "conf/gitignore/Ada": confGitignoreAda, - "conf/gitignore/Agda": confGitignoreAgda, - "conf/gitignore/Android": confGitignoreAndroid, - "conf/gitignore/Anjuta": confGitignoreAnjuta, - "conf/gitignore/AppEngine": confGitignoreAppengine, - "conf/gitignore/AppceleratorTitanium": confGitignoreAppceleratortitanium, - "conf/gitignore/ArchLinuxPackages": confGitignoreArchlinuxpackages, - "conf/gitignore/Archives": confGitignoreArchives, - "conf/gitignore/Autotools": confGitignoreAutotools, - "conf/gitignore/BricxCC": confGitignoreBricxcc, - "conf/gitignore/C": confGitignoreC, - "conf/gitignore/C Sharp": confGitignoreCSharp, - "conf/gitignore/C++": confGitignoreC2, - "conf/gitignore/CFWheels": confGitignoreCfwheels, - "conf/gitignore/CMake": confGitignoreCmake, - "conf/gitignore/CUDA": confGitignoreCuda, - "conf/gitignore/CVS": confGitignoreCvs, - "conf/gitignore/CakePHP": confGitignoreCakephp, - "conf/gitignore/ChefCookbook": confGitignoreChefcookbook, - "conf/gitignore/Cloud9": confGitignoreCloud9, - "conf/gitignore/CodeIgniter": confGitignoreCodeigniter, - "conf/gitignore/CodeKit": confGitignoreCodekit, - "conf/gitignore/CommonLisp": confGitignoreCommonlisp, - "conf/gitignore/Composer": confGitignoreComposer, - "conf/gitignore/Concrete5": confGitignoreConcrete5, - "conf/gitignore/Coq": confGitignoreCoq, - "conf/gitignore/CraftCMS": confGitignoreCraftcms, - "conf/gitignore/DM": confGitignoreDm, - "conf/gitignore/Dart": confGitignoreDart, - "conf/gitignore/DartEditor": confGitignoreDarteditor, - "conf/gitignore/Delphi": confGitignoreDelphi, - "conf/gitignore/Dreamweaver": confGitignoreDreamweaver, - "conf/gitignore/Drupal": confGitignoreDrupal, - "conf/gitignore/EPiServer": confGitignoreEpiserver, - "conf/gitignore/Eagle": confGitignoreEagle, - "conf/gitignore/Eclipse": confGitignoreEclipse, - "conf/gitignore/EiffelStudio": confGitignoreEiffelstudio, - "conf/gitignore/Elisp": confGitignoreElisp, - "conf/gitignore/Elixir": confGitignoreElixir, - "conf/gitignore/Emacs": confGitignoreEmacs, - "conf/gitignore/Ensime": confGitignoreEnsime, - "conf/gitignore/Erlang": confGitignoreErlang, - "conf/gitignore/Espresso": confGitignoreEspresso, - "conf/gitignore/ExpressionEngine": confGitignoreExpressionengine, - "conf/gitignore/ExtJs": confGitignoreExtjs, - "conf/gitignore/Fancy": confGitignoreFancy, - "conf/gitignore/Finale": confGitignoreFinale, - "conf/gitignore/FlexBuilder": confGitignoreFlexbuilder, - "conf/gitignore/ForceDotCom": confGitignoreForcedotcom, - "conf/gitignore/FuelPHP": confGitignoreFuelphp, - "conf/gitignore/GWT": confGitignoreGwt, - "conf/gitignore/Gcov": confGitignoreGcov, - "conf/gitignore/GitBook": confGitignoreGitbook, - "conf/gitignore/Go": confGitignoreGo, - "conf/gitignore/Gradle": confGitignoreGradle, - "conf/gitignore/Grails": confGitignoreGrails, - "conf/gitignore/Haskell": confGitignoreHaskell, - "conf/gitignore/IGORPro": confGitignoreIgorpro, - "conf/gitignore/IPythonNotebook": confGitignoreIpythonnotebook, - "conf/gitignore/Idris": confGitignoreIdris, - "conf/gitignore/JDeveloper": confGitignoreJdeveloper, - "conf/gitignore/Java": confGitignoreJava, - "conf/gitignore/Jboss": confGitignoreJboss, - "conf/gitignore/Jekyll": confGitignoreJekyll, - "conf/gitignore/JetBrains": confGitignoreJetbrains, - "conf/gitignore/Joomla": confGitignoreJoomla, - "conf/gitignore/KDevelop4": confGitignoreKdevelop4, - "conf/gitignore/Kate": confGitignoreKate, - "conf/gitignore/KiCAD": confGitignoreKicad, - "conf/gitignore/Kohana": confGitignoreKohana, - "conf/gitignore/LabVIEW": confGitignoreLabview, - "conf/gitignore/Laravel": confGitignoreLaravel, - "conf/gitignore/Lazarus": confGitignoreLazarus, - "conf/gitignore/Leiningen": confGitignoreLeiningen, - "conf/gitignore/LemonStand": confGitignoreLemonstand, - "conf/gitignore/LibreOffice": confGitignoreLibreoffice, - "conf/gitignore/Lilypond": confGitignoreLilypond, - "conf/gitignore/Linux": confGitignoreLinux, - "conf/gitignore/Lithium": confGitignoreLithium, - "conf/gitignore/Lua": confGitignoreLua, - "conf/gitignore/LyX": confGitignoreLyx, - "conf/gitignore/Magento": confGitignoreMagento, - "conf/gitignore/Matlab": confGitignoreMatlab, - "conf/gitignore/Maven": confGitignoreMaven, - "conf/gitignore/Mercurial": confGitignoreMercurial, - "conf/gitignore/Mercury": confGitignoreMercury, - "conf/gitignore/MetaProgrammingSystem": confGitignoreMetaprogrammingsystem, - "conf/gitignore/MicrosoftOffice": confGitignoreMicrosoftoffice, - "conf/gitignore/ModelSim": confGitignoreModelsim, - "conf/gitignore/Momentics": confGitignoreMomentics, - "conf/gitignore/MonoDevelop": confGitignoreMonodevelop, - "conf/gitignore/Nanoc": confGitignoreNanoc, - "conf/gitignore/NetBeans": confGitignoreNetbeans, - "conf/gitignore/Nim": confGitignoreNim, - "conf/gitignore/Ninja": confGitignoreNinja, - "conf/gitignore/Node": confGitignoreNode, - "conf/gitignore/NotepadPP": confGitignoreNotepadpp, - "conf/gitignore/OCaml": confGitignoreOcaml, - "conf/gitignore/OSX": confGitignoreOsx, - "conf/gitignore/Objective-C": confGitignoreObjectiveC, - "conf/gitignore/Opa": confGitignoreOpa, - "conf/gitignore/OpenCart": confGitignoreOpencart, - "conf/gitignore/OracleForms": confGitignoreOracleforms, - "conf/gitignore/Packer": confGitignorePacker, - "conf/gitignore/Perl": confGitignorePerl, - "conf/gitignore/Phalcon": confGitignorePhalcon, - "conf/gitignore/PlayFramework": confGitignorePlayframework, - "conf/gitignore/Plone": confGitignorePlone, - "conf/gitignore/Prestashop": confGitignorePrestashop, - "conf/gitignore/Processing": confGitignoreProcessing, - "conf/gitignore/Python": confGitignorePython, - "conf/gitignore/Qooxdoo": confGitignoreQooxdoo, - "conf/gitignore/Qt": confGitignoreQt, - "conf/gitignore/R": confGitignoreR, - "conf/gitignore/ROS": confGitignoreRos, - "conf/gitignore/Rails": confGitignoreRails, - "conf/gitignore/Redcar": confGitignoreRedcar, - "conf/gitignore/Redis": confGitignoreRedis, - "conf/gitignore/RhodesRhomobile": confGitignoreRhodesrhomobile, - "conf/gitignore/Ruby": confGitignoreRuby, - "conf/gitignore/Rust": confGitignoreRust, - "conf/gitignore/SBT": confGitignoreSbt, - "conf/gitignore/SCons": confGitignoreScons, - "conf/gitignore/SVN": confGitignoreSvn, - "conf/gitignore/Sass": confGitignoreSass, - "conf/gitignore/Scala": confGitignoreScala, - "conf/gitignore/Scrivener": confGitignoreScrivener, - "conf/gitignore/Sdcc": confGitignoreSdcc, - "conf/gitignore/SeamGen": confGitignoreSeamgen, - "conf/gitignore/SketchUp": confGitignoreSketchup, - "conf/gitignore/SlickEdit": confGitignoreSlickedit, - "conf/gitignore/Stella": confGitignoreStella, - "conf/gitignore/SublimeText": confGitignoreSublimetext, - "conf/gitignore/SugarCRM": confGitignoreSugarcrm, - "conf/gitignore/Swift": confGitignoreSwift, - "conf/gitignore/Symfony": confGitignoreSymfony, - "conf/gitignore/SymphonyCMS": confGitignoreSymphonycms, - "conf/gitignore/SynopsysVCS": confGitignoreSynopsysvcs, - "conf/gitignore/Tags": confGitignoreTags, - "conf/gitignore/TeX": confGitignoreTex, - "conf/gitignore/TextMate": confGitignoreTextmate, - "conf/gitignore/Textpattern": confGitignoreTextpattern, - "conf/gitignore/TortoiseGit": confGitignoreTortoisegit, - "conf/gitignore/TurboGears2": confGitignoreTurbogears2, - "conf/gitignore/Typo3": confGitignoreTypo3, - "conf/gitignore/Umbraco": confGitignoreUmbraco, - "conf/gitignore/Unity": confGitignoreUnity, - "conf/gitignore/VVVV": confGitignoreVvvv, - "conf/gitignore/Vagrant": confGitignoreVagrant, - "conf/gitignore/Vim": confGitignoreVim, - "conf/gitignore/VirtualEnv": confGitignoreVirtualenv, - "conf/gitignore/VisualStudio": confGitignoreVisualstudio, - "conf/gitignore/VisualStudioCode": confGitignoreVisualstudiocode, - "conf/gitignore/Waf": confGitignoreWaf, - "conf/gitignore/WebMethods": confGitignoreWebmethods, - "conf/gitignore/Windows": confGitignoreWindows, - "conf/gitignore/WordPress": confGitignoreWordpress, - "conf/gitignore/Xcode": confGitignoreXcode, - "conf/gitignore/XilinxISE": confGitignoreXilinxise, - "conf/gitignore/Xojo": confGitignoreXojo, - "conf/gitignore/Yeoman": confGitignoreYeoman, - "conf/gitignore/Yii": confGitignoreYii, - "conf/gitignore/ZendFramework": confGitignoreZendframework, - "conf/gitignore/Zephir": confGitignoreZephir, - "conf/label/Default": confLabelDefault, - "conf/license/Abstyles License": confLicenseAbstylesLicense, - "conf/license/Academic Free License v1.1": confLicenseAcademicFreeLicenseV11, - "conf/license/Academic Free License v1.2": confLicenseAcademicFreeLicenseV12, - "conf/license/Academic Free License v2.0": confLicenseAcademicFreeLicenseV20, - "conf/license/Academic Free License v2.1": confLicenseAcademicFreeLicenseV21, - "conf/license/Academic Free License v3.0": confLicenseAcademicFreeLicenseV30, - "conf/license/Affero General Public License v1.0": confLicenseAfferoGeneralPublicLicenseV10, - "conf/license/Apache License 1.0": confLicenseApacheLicense10, - "conf/license/Apache License 1.1": confLicenseApacheLicense11, - "conf/license/Apache License 2.0": confLicenseApacheLicense20, - "conf/license/Artistic License 1.0": confLicenseArtisticLicense10, - "conf/license/Artistic License 2.0": confLicenseArtisticLicense20, - "conf/license/BSD 2-clause License": confLicenseBsd2ClauseLicense, - "conf/license/BSD 3-clause License": confLicenseBsd3ClauseLicense, - "conf/license/BSD 4-clause License": confLicenseBsd4ClauseLicense, - "conf/license/Creative Commons CC0 1.0 Universal": confLicenseCreativeCommonsCc010Universal, - "conf/license/Eclipse Public License 1.0": confLicenseEclipsePublicLicense10, - "conf/license/Educational Community License v1.0": confLicenseEducationalCommunityLicenseV10, - "conf/license/Educational Community License v2.0": confLicenseEducationalCommunityLicenseV20, - "conf/license/GNU Affero General Public License v3.0": confLicenseGnuAfferoGeneralPublicLicenseV30, - "conf/license/GNU Free Documentation License v1.1": confLicenseGnuFreeDocumentationLicenseV11, - "conf/license/GNU Free Documentation License v1.2": confLicenseGnuFreeDocumentationLicenseV12, - "conf/license/GNU Free Documentation License v1.3": confLicenseGnuFreeDocumentationLicenseV13, - "conf/license/GNU General Public License v1.0": confLicenseGnuGeneralPublicLicenseV10, - "conf/license/GNU General Public License v2.0": confLicenseGnuGeneralPublicLicenseV20, - "conf/license/GNU General Public License v3.0": confLicenseGnuGeneralPublicLicenseV30, - "conf/license/GNU Lesser General Public License v2.1": confLicenseGnuLesserGeneralPublicLicenseV21, - "conf/license/GNU Lesser General Public License v3.0": confLicenseGnuLesserGeneralPublicLicenseV30, - "conf/license/GNU Library General Public License v2.0": confLicenseGnuLibraryGeneralPublicLicenseV20, - "conf/license/ISC license": confLicenseIscLicense, - "conf/license/MIT License": confLicenseMitLicense, - "conf/license/Mozilla Public License 1.0": confLicenseMozillaPublicLicense10, - "conf/license/Mozilla Public License 1.1": confLicenseMozillaPublicLicense11, - "conf/license/Mozilla Public License 2.0": confLicenseMozillaPublicLicense20, - "conf/locale/locale_bg-BG.ini": confLocaleLocale_bgBgIni, - "conf/locale/locale_cs-CZ.ini": confLocaleLocale_csCzIni, - "conf/locale/locale_de-DE.ini": confLocaleLocale_deDeIni, - "conf/locale/locale_en-US.ini": confLocaleLocale_enUsIni, - "conf/locale/locale_es-ES.ini": confLocaleLocale_esEsIni, - "conf/locale/locale_fi-FI.ini": confLocaleLocale_fiFiIni, - "conf/locale/locale_fr-FR.ini": confLocaleLocale_frFrIni, - "conf/locale/locale_it-IT.ini": confLocaleLocale_itItIni, - "conf/locale/locale_ja-JP.ini": confLocaleLocale_jaJpIni, - "conf/locale/locale_lv-LV.ini": confLocaleLocale_lvLvIni, - "conf/locale/locale_nl-NL.ini": confLocaleLocale_nlNlIni, - "conf/locale/locale_pl-PL.ini": confLocaleLocale_plPlIni, - "conf/locale/locale_pt-BR.ini": confLocaleLocale_ptBrIni, - "conf/locale/locale_ru-RU.ini": confLocaleLocale_ruRuIni, - "conf/locale/locale_sr-SP.ini": confLocaleLocale_srSpIni, - "conf/locale/locale_sv-SE.ini": confLocaleLocale_svSeIni, - "conf/locale/locale_tr-TR.ini": confLocaleLocale_trTrIni, - "conf/locale/locale_zh-CN.ini": confLocaleLocale_zhCnIni, - "conf/locale/locale_zh-HK.ini": confLocaleLocale_zhHkIni, - "conf/locale/locale_zh-TW.ini": confLocaleLocale_zhTwIni, - "conf/readme/Default": confReadmeDefault, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} -var _bintree = &bintree{nil, map[string]*bintree{ - "conf": &bintree{nil, map[string]*bintree{ - "app.ini": &bintree{confAppIni, map[string]*bintree{ - }}, - "gitignore": &bintree{nil, map[string]*bintree{ - "Actionscript": &bintree{confGitignoreActionscript, map[string]*bintree{ - }}, - "Ada": &bintree{confGitignoreAda, map[string]*bintree{ - }}, - "Agda": &bintree{confGitignoreAgda, map[string]*bintree{ - }}, - "Android": &bintree{confGitignoreAndroid, map[string]*bintree{ - }}, - "Anjuta": &bintree{confGitignoreAnjuta, map[string]*bintree{ - }}, - "AppEngine": &bintree{confGitignoreAppengine, map[string]*bintree{ - }}, - "AppceleratorTitanium": &bintree{confGitignoreAppceleratortitanium, map[string]*bintree{ - }}, - "ArchLinuxPackages": &bintree{confGitignoreArchlinuxpackages, map[string]*bintree{ - }}, - "Archives": &bintree{confGitignoreArchives, map[string]*bintree{ - }}, - "Autotools": &bintree{confGitignoreAutotools, map[string]*bintree{ - }}, - "BricxCC": &bintree{confGitignoreBricxcc, map[string]*bintree{ - }}, - "C": &bintree{confGitignoreC, map[string]*bintree{ - }}, - "C Sharp": &bintree{confGitignoreCSharp, map[string]*bintree{ - }}, - "C++": &bintree{confGitignoreC2, map[string]*bintree{ - }}, - "CFWheels": &bintree{confGitignoreCfwheels, map[string]*bintree{ - }}, - "CMake": &bintree{confGitignoreCmake, map[string]*bintree{ - }}, - "CUDA": &bintree{confGitignoreCuda, map[string]*bintree{ - }}, - "CVS": &bintree{confGitignoreCvs, map[string]*bintree{ - }}, - "CakePHP": &bintree{confGitignoreCakephp, map[string]*bintree{ - }}, - "ChefCookbook": &bintree{confGitignoreChefcookbook, map[string]*bintree{ - }}, - "Cloud9": &bintree{confGitignoreCloud9, map[string]*bintree{ - }}, - "CodeIgniter": &bintree{confGitignoreCodeigniter, map[string]*bintree{ - }}, - "CodeKit": &bintree{confGitignoreCodekit, map[string]*bintree{ - }}, - "CommonLisp": &bintree{confGitignoreCommonlisp, map[string]*bintree{ - }}, - "Composer": &bintree{confGitignoreComposer, map[string]*bintree{ - }}, - "Concrete5": &bintree{confGitignoreConcrete5, map[string]*bintree{ - }}, - "Coq": &bintree{confGitignoreCoq, map[string]*bintree{ - }}, - "CraftCMS": &bintree{confGitignoreCraftcms, map[string]*bintree{ - }}, - "DM": &bintree{confGitignoreDm, map[string]*bintree{ - }}, - "Dart": &bintree{confGitignoreDart, map[string]*bintree{ - }}, - "DartEditor": &bintree{confGitignoreDarteditor, map[string]*bintree{ - }}, - "Delphi": &bintree{confGitignoreDelphi, map[string]*bintree{ - }}, - "Dreamweaver": &bintree{confGitignoreDreamweaver, map[string]*bintree{ - }}, - "Drupal": &bintree{confGitignoreDrupal, map[string]*bintree{ - }}, - "EPiServer": &bintree{confGitignoreEpiserver, map[string]*bintree{ - }}, - "Eagle": &bintree{confGitignoreEagle, map[string]*bintree{ - }}, - "Eclipse": &bintree{confGitignoreEclipse, map[string]*bintree{ - }}, - "EiffelStudio": &bintree{confGitignoreEiffelstudio, map[string]*bintree{ - }}, - "Elisp": &bintree{confGitignoreElisp, map[string]*bintree{ - }}, - "Elixir": &bintree{confGitignoreElixir, map[string]*bintree{ - }}, - "Emacs": &bintree{confGitignoreEmacs, map[string]*bintree{ - }}, - "Ensime": &bintree{confGitignoreEnsime, map[string]*bintree{ - }}, - "Erlang": &bintree{confGitignoreErlang, map[string]*bintree{ - }}, - "Espresso": &bintree{confGitignoreEspresso, map[string]*bintree{ - }}, - "ExpressionEngine": &bintree{confGitignoreExpressionengine, map[string]*bintree{ - }}, - "ExtJs": &bintree{confGitignoreExtjs, map[string]*bintree{ - }}, - "Fancy": &bintree{confGitignoreFancy, map[string]*bintree{ - }}, - "Finale": &bintree{confGitignoreFinale, map[string]*bintree{ - }}, - "FlexBuilder": &bintree{confGitignoreFlexbuilder, map[string]*bintree{ - }}, - "ForceDotCom": &bintree{confGitignoreForcedotcom, map[string]*bintree{ - }}, - "FuelPHP": &bintree{confGitignoreFuelphp, map[string]*bintree{ - }}, - "GWT": &bintree{confGitignoreGwt, map[string]*bintree{ - }}, - "Gcov": &bintree{confGitignoreGcov, map[string]*bintree{ - }}, - "GitBook": &bintree{confGitignoreGitbook, map[string]*bintree{ - }}, - "Go": &bintree{confGitignoreGo, map[string]*bintree{ - }}, - "Gradle": &bintree{confGitignoreGradle, map[string]*bintree{ - }}, - "Grails": &bintree{confGitignoreGrails, map[string]*bintree{ - }}, - "Haskell": &bintree{confGitignoreHaskell, map[string]*bintree{ - }}, - "IGORPro": &bintree{confGitignoreIgorpro, map[string]*bintree{ - }}, - "IPythonNotebook": &bintree{confGitignoreIpythonnotebook, map[string]*bintree{ - }}, - "Idris": &bintree{confGitignoreIdris, map[string]*bintree{ - }}, - "JDeveloper": &bintree{confGitignoreJdeveloper, map[string]*bintree{ - }}, - "Java": &bintree{confGitignoreJava, map[string]*bintree{ - }}, - "Jboss": &bintree{confGitignoreJboss, map[string]*bintree{ - }}, - "Jekyll": &bintree{confGitignoreJekyll, map[string]*bintree{ - }}, - "JetBrains": &bintree{confGitignoreJetbrains, map[string]*bintree{ - }}, - "Joomla": &bintree{confGitignoreJoomla, map[string]*bintree{ - }}, - "KDevelop4": &bintree{confGitignoreKdevelop4, map[string]*bintree{ - }}, - "Kate": &bintree{confGitignoreKate, map[string]*bintree{ - }}, - "KiCAD": &bintree{confGitignoreKicad, map[string]*bintree{ - }}, - "Kohana": &bintree{confGitignoreKohana, map[string]*bintree{ - }}, - "LabVIEW": &bintree{confGitignoreLabview, map[string]*bintree{ - }}, - "Laravel": &bintree{confGitignoreLaravel, map[string]*bintree{ - }}, - "Lazarus": &bintree{confGitignoreLazarus, map[string]*bintree{ - }}, - "Leiningen": &bintree{confGitignoreLeiningen, map[string]*bintree{ - }}, - "LemonStand": &bintree{confGitignoreLemonstand, map[string]*bintree{ - }}, - "LibreOffice": &bintree{confGitignoreLibreoffice, map[string]*bintree{ - }}, - "Lilypond": &bintree{confGitignoreLilypond, map[string]*bintree{ - }}, - "Linux": &bintree{confGitignoreLinux, map[string]*bintree{ - }}, - "Lithium": &bintree{confGitignoreLithium, map[string]*bintree{ - }}, - "Lua": &bintree{confGitignoreLua, map[string]*bintree{ - }}, - "LyX": &bintree{confGitignoreLyx, map[string]*bintree{ - }}, - "Magento": &bintree{confGitignoreMagento, map[string]*bintree{ - }}, - "Matlab": &bintree{confGitignoreMatlab, map[string]*bintree{ - }}, - "Maven": &bintree{confGitignoreMaven, map[string]*bintree{ - }}, - "Mercurial": &bintree{confGitignoreMercurial, map[string]*bintree{ - }}, - "Mercury": &bintree{confGitignoreMercury, map[string]*bintree{ - }}, - "MetaProgrammingSystem": &bintree{confGitignoreMetaprogrammingsystem, map[string]*bintree{ - }}, - "MicrosoftOffice": &bintree{confGitignoreMicrosoftoffice, map[string]*bintree{ - }}, - "ModelSim": &bintree{confGitignoreModelsim, map[string]*bintree{ - }}, - "Momentics": &bintree{confGitignoreMomentics, map[string]*bintree{ - }}, - "MonoDevelop": &bintree{confGitignoreMonodevelop, map[string]*bintree{ - }}, - "Nanoc": &bintree{confGitignoreNanoc, map[string]*bintree{ - }}, - "NetBeans": &bintree{confGitignoreNetbeans, map[string]*bintree{ - }}, - "Nim": &bintree{confGitignoreNim, map[string]*bintree{ - }}, - "Ninja": &bintree{confGitignoreNinja, map[string]*bintree{ - }}, - "Node": &bintree{confGitignoreNode, map[string]*bintree{ - }}, - "NotepadPP": &bintree{confGitignoreNotepadpp, map[string]*bintree{ - }}, - "OCaml": &bintree{confGitignoreOcaml, map[string]*bintree{ - }}, - "OSX": &bintree{confGitignoreOsx, map[string]*bintree{ - }}, - "Objective-C": &bintree{confGitignoreObjectiveC, map[string]*bintree{ - }}, - "Opa": &bintree{confGitignoreOpa, map[string]*bintree{ - }}, - "OpenCart": &bintree{confGitignoreOpencart, map[string]*bintree{ - }}, - "OracleForms": &bintree{confGitignoreOracleforms, map[string]*bintree{ - }}, - "Packer": &bintree{confGitignorePacker, map[string]*bintree{ - }}, - "Perl": &bintree{confGitignorePerl, map[string]*bintree{ - }}, - "Phalcon": &bintree{confGitignorePhalcon, map[string]*bintree{ - }}, - "PlayFramework": &bintree{confGitignorePlayframework, map[string]*bintree{ - }}, - "Plone": &bintree{confGitignorePlone, map[string]*bintree{ - }}, - "Prestashop": &bintree{confGitignorePrestashop, map[string]*bintree{ - }}, - "Processing": &bintree{confGitignoreProcessing, map[string]*bintree{ - }}, - "Python": &bintree{confGitignorePython, map[string]*bintree{ - }}, - "Qooxdoo": &bintree{confGitignoreQooxdoo, map[string]*bintree{ - }}, - "Qt": &bintree{confGitignoreQt, map[string]*bintree{ - }}, - "R": &bintree{confGitignoreR, map[string]*bintree{ - }}, - "ROS": &bintree{confGitignoreRos, map[string]*bintree{ - }}, - "Rails": &bintree{confGitignoreRails, map[string]*bintree{ - }}, - "Redcar": &bintree{confGitignoreRedcar, map[string]*bintree{ - }}, - "Redis": &bintree{confGitignoreRedis, map[string]*bintree{ - }}, - "RhodesRhomobile": &bintree{confGitignoreRhodesrhomobile, map[string]*bintree{ - }}, - "Ruby": &bintree{confGitignoreRuby, map[string]*bintree{ - }}, - "Rust": &bintree{confGitignoreRust, map[string]*bintree{ - }}, - "SBT": &bintree{confGitignoreSbt, map[string]*bintree{ - }}, - "SCons": &bintree{confGitignoreScons, map[string]*bintree{ - }}, - "SVN": &bintree{confGitignoreSvn, map[string]*bintree{ - }}, - "Sass": &bintree{confGitignoreSass, map[string]*bintree{ - }}, - "Scala": &bintree{confGitignoreScala, map[string]*bintree{ - }}, - "Scrivener": &bintree{confGitignoreScrivener, map[string]*bintree{ - }}, - "Sdcc": &bintree{confGitignoreSdcc, map[string]*bintree{ - }}, - "SeamGen": &bintree{confGitignoreSeamgen, map[string]*bintree{ - }}, - "SketchUp": &bintree{confGitignoreSketchup, map[string]*bintree{ - }}, - "SlickEdit": &bintree{confGitignoreSlickedit, map[string]*bintree{ - }}, - "Stella": &bintree{confGitignoreStella, map[string]*bintree{ - }}, - "SublimeText": &bintree{confGitignoreSublimetext, map[string]*bintree{ - }}, - "SugarCRM": &bintree{confGitignoreSugarcrm, map[string]*bintree{ - }}, - "Swift": &bintree{confGitignoreSwift, map[string]*bintree{ - }}, - "Symfony": &bintree{confGitignoreSymfony, map[string]*bintree{ - }}, - "SymphonyCMS": &bintree{confGitignoreSymphonycms, map[string]*bintree{ - }}, - "SynopsysVCS": &bintree{confGitignoreSynopsysvcs, map[string]*bintree{ - }}, - "Tags": &bintree{confGitignoreTags, map[string]*bintree{ - }}, - "TeX": &bintree{confGitignoreTex, map[string]*bintree{ - }}, - "TextMate": &bintree{confGitignoreTextmate, map[string]*bintree{ - }}, - "Textpattern": &bintree{confGitignoreTextpattern, map[string]*bintree{ - }}, - "TortoiseGit": &bintree{confGitignoreTortoisegit, map[string]*bintree{ - }}, - "TurboGears2": &bintree{confGitignoreTurbogears2, map[string]*bintree{ - }}, - "Typo3": &bintree{confGitignoreTypo3, map[string]*bintree{ - }}, - "Umbraco": &bintree{confGitignoreUmbraco, map[string]*bintree{ - }}, - "Unity": &bintree{confGitignoreUnity, map[string]*bintree{ - }}, - "VVVV": &bintree{confGitignoreVvvv, map[string]*bintree{ - }}, - "Vagrant": &bintree{confGitignoreVagrant, map[string]*bintree{ - }}, - "Vim": &bintree{confGitignoreVim, map[string]*bintree{ - }}, - "VirtualEnv": &bintree{confGitignoreVirtualenv, map[string]*bintree{ - }}, - "VisualStudio": &bintree{confGitignoreVisualstudio, map[string]*bintree{ - }}, - "VisualStudioCode": &bintree{confGitignoreVisualstudiocode, map[string]*bintree{ - }}, - "Waf": &bintree{confGitignoreWaf, map[string]*bintree{ - }}, - "WebMethods": &bintree{confGitignoreWebmethods, map[string]*bintree{ - }}, - "Windows": &bintree{confGitignoreWindows, map[string]*bintree{ - }}, - "WordPress": &bintree{confGitignoreWordpress, map[string]*bintree{ - }}, - "Xcode": &bintree{confGitignoreXcode, map[string]*bintree{ - }}, - "XilinxISE": &bintree{confGitignoreXilinxise, map[string]*bintree{ - }}, - "Xojo": &bintree{confGitignoreXojo, map[string]*bintree{ - }}, - "Yeoman": &bintree{confGitignoreYeoman, map[string]*bintree{ - }}, - "Yii": &bintree{confGitignoreYii, map[string]*bintree{ - }}, - "ZendFramework": &bintree{confGitignoreZendframework, map[string]*bintree{ - }}, - "Zephir": &bintree{confGitignoreZephir, map[string]*bintree{ - }}, - }}, - "label": &bintree{nil, map[string]*bintree{ - "Default": &bintree{confLabelDefault, map[string]*bintree{ - }}, - }}, - "license": &bintree{nil, map[string]*bintree{ - "Abstyles License": &bintree{confLicenseAbstylesLicense, map[string]*bintree{ - }}, - "Academic Free License v1.1": &bintree{confLicenseAcademicFreeLicenseV11, map[string]*bintree{ - }}, - "Academic Free License v1.2": &bintree{confLicenseAcademicFreeLicenseV12, map[string]*bintree{ - }}, - "Academic Free License v2.0": &bintree{confLicenseAcademicFreeLicenseV20, map[string]*bintree{ - }}, - "Academic Free License v2.1": &bintree{confLicenseAcademicFreeLicenseV21, map[string]*bintree{ - }}, - "Academic Free License v3.0": &bintree{confLicenseAcademicFreeLicenseV30, map[string]*bintree{ - }}, - "Affero General Public License v1.0": &bintree{confLicenseAfferoGeneralPublicLicenseV10, map[string]*bintree{ - }}, - "Apache License 1.0": &bintree{confLicenseApacheLicense10, map[string]*bintree{ - }}, - "Apache License 1.1": &bintree{confLicenseApacheLicense11, map[string]*bintree{ - }}, - "Apache License 2.0": &bintree{confLicenseApacheLicense20, map[string]*bintree{ - }}, - "Artistic License 1.0": &bintree{confLicenseArtisticLicense10, map[string]*bintree{ - }}, - "Artistic License 2.0": &bintree{confLicenseArtisticLicense20, map[string]*bintree{ - }}, - "BSD 2-clause License": &bintree{confLicenseBsd2ClauseLicense, map[string]*bintree{ - }}, - "BSD 3-clause License": &bintree{confLicenseBsd3ClauseLicense, map[string]*bintree{ - }}, - "BSD 4-clause License": &bintree{confLicenseBsd4ClauseLicense, map[string]*bintree{ - }}, - "Creative Commons CC0 1.0 Universal": &bintree{confLicenseCreativeCommonsCc010Universal, map[string]*bintree{ - }}, - "Eclipse Public License 1.0": &bintree{confLicenseEclipsePublicLicense10, map[string]*bintree{ - }}, - "Educational Community License v1.0": &bintree{confLicenseEducationalCommunityLicenseV10, map[string]*bintree{ - }}, - "Educational Community License v2.0": &bintree{confLicenseEducationalCommunityLicenseV20, map[string]*bintree{ - }}, - "GNU Affero General Public License v3.0": &bintree{confLicenseGnuAfferoGeneralPublicLicenseV30, map[string]*bintree{ - }}, - "GNU Free Documentation License v1.1": &bintree{confLicenseGnuFreeDocumentationLicenseV11, map[string]*bintree{ - }}, - "GNU Free Documentation License v1.2": &bintree{confLicenseGnuFreeDocumentationLicenseV12, map[string]*bintree{ - }}, - "GNU Free Documentation License v1.3": &bintree{confLicenseGnuFreeDocumentationLicenseV13, map[string]*bintree{ - }}, - "GNU General Public License v1.0": &bintree{confLicenseGnuGeneralPublicLicenseV10, map[string]*bintree{ - }}, - "GNU General Public License v2.0": &bintree{confLicenseGnuGeneralPublicLicenseV20, map[string]*bintree{ - }}, - "GNU General Public License v3.0": &bintree{confLicenseGnuGeneralPublicLicenseV30, map[string]*bintree{ - }}, - "GNU Lesser General Public License v2.1": &bintree{confLicenseGnuLesserGeneralPublicLicenseV21, map[string]*bintree{ - }}, - "GNU Lesser General Public License v3.0": &bintree{confLicenseGnuLesserGeneralPublicLicenseV30, map[string]*bintree{ - }}, - "GNU Library General Public License v2.0": &bintree{confLicenseGnuLibraryGeneralPublicLicenseV20, map[string]*bintree{ - }}, - "ISC license": &bintree{confLicenseIscLicense, map[string]*bintree{ - }}, - "MIT License": &bintree{confLicenseMitLicense, map[string]*bintree{ - }}, - "Mozilla Public License 1.0": &bintree{confLicenseMozillaPublicLicense10, map[string]*bintree{ - }}, - "Mozilla Public License 1.1": &bintree{confLicenseMozillaPublicLicense11, map[string]*bintree{ - }}, - "Mozilla Public License 2.0": &bintree{confLicenseMozillaPublicLicense20, map[string]*bintree{ - }}, - }}, - "locale": &bintree{nil, map[string]*bintree{ - "locale_bg-BG.ini": &bintree{confLocaleLocale_bgBgIni, map[string]*bintree{ - }}, - "locale_cs-CZ.ini": &bintree{confLocaleLocale_csCzIni, map[string]*bintree{ - }}, - "locale_de-DE.ini": &bintree{confLocaleLocale_deDeIni, map[string]*bintree{ - }}, - "locale_en-US.ini": &bintree{confLocaleLocale_enUsIni, map[string]*bintree{ - }}, - "locale_es-ES.ini": &bintree{confLocaleLocale_esEsIni, map[string]*bintree{ - }}, - "locale_fi-FI.ini": &bintree{confLocaleLocale_fiFiIni, map[string]*bintree{ - }}, - "locale_fr-FR.ini": &bintree{confLocaleLocale_frFrIni, map[string]*bintree{ - }}, - "locale_it-IT.ini": &bintree{confLocaleLocale_itItIni, map[string]*bintree{ - }}, - "locale_ja-JP.ini": &bintree{confLocaleLocale_jaJpIni, map[string]*bintree{ - }}, - "locale_lv-LV.ini": &bintree{confLocaleLocale_lvLvIni, map[string]*bintree{ - }}, - "locale_nl-NL.ini": &bintree{confLocaleLocale_nlNlIni, map[string]*bintree{ - }}, - "locale_pl-PL.ini": &bintree{confLocaleLocale_plPlIni, map[string]*bintree{ - }}, - "locale_pt-BR.ini": &bintree{confLocaleLocale_ptBrIni, map[string]*bintree{ - }}, - "locale_ru-RU.ini": &bintree{confLocaleLocale_ruRuIni, map[string]*bintree{ - }}, - "locale_sr-SP.ini": &bintree{confLocaleLocale_srSpIni, map[string]*bintree{ - }}, - "locale_sv-SE.ini": &bintree{confLocaleLocale_svSeIni, map[string]*bintree{ - }}, - "locale_tr-TR.ini": &bintree{confLocaleLocale_trTrIni, map[string]*bintree{ - }}, - "locale_zh-CN.ini": &bintree{confLocaleLocale_zhCnIni, map[string]*bintree{ - }}, - "locale_zh-HK.ini": &bintree{confLocaleLocale_zhHkIni, map[string]*bintree{ - }}, - "locale_zh-TW.ini": &bintree{confLocaleLocale_zhTwIni, map[string]*bintree{ - }}, - }}, - "readme": &bintree{nil, map[string]*bintree{ - "Default": &bintree{confReadmeDefault, map[string]*bintree{ - }}, - }}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} - diff --git a/modules/context/api.go b/modules/context/api.go deleted file mode 100644 index 770daa3ad3f..00000000000 --- a/modules/context/api.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2016 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 context - -import ( - "fmt" - "strings" - - "github.com/Unknwon/paginater" - "gopkg.in/macaron.v1" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -type APIContext struct { - *Context - Org *APIOrganization -} - -// 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{}) { - var message string - if err, ok := obj.(error); ok { - message = err.Error() - } else { - message = obj.(string) - } - - if status == 500 { - log.Error(4, "%s: %s", title, message) - } - - ctx.JSON(status, map[string]string{ - "message": message, - "url": base.DOC_URL, - }) -} - -// SetLinkHeader sets pagination link header by given totol 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) - if page.HasNext() { - links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"next\"", setting.AppUrl, ctx.Req.URL.Path[1:], page.Next())) - } - if !page.IsLast() { - links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"last\"", setting.AppUrl, ctx.Req.URL.Path[1:], page.TotalPages())) - } - if !page.IsFirst() { - links = append(links, fmt.Sprintf("<%s%s?page=1>; rel=\"first\"", setting.AppUrl, ctx.Req.URL.Path[1:])) - } - if page.HasPrevious() { - links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"prev\"", setting.AppUrl, ctx.Req.URL.Path[1:], page.Previous())) - } - - if len(links) > 0 { - ctx.Header().Set("Link", strings.Join(links, ",")) - } -} - -func APIContexter() macaron.Handler { - return func(c *Context) { - ctx := &APIContext{ - Context: c, - } - c.Map(ctx) - } -} diff --git a/modules/context/api_org.go b/modules/context/api_org.go deleted file mode 100644 index ecf60a19052..00000000000 --- a/modules/context/api_org.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2016 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 context - -import ( - "github.com/gogits/gogs/models" -) - -type APIOrganization struct { - Organization *models.User - Team *models.Team -} diff --git a/modules/context/auth.go b/modules/context/auth.go deleted file mode 100644 index 746771791e8..00000000000 --- a/modules/context/auth.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2014 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 context - -import ( - "net/url" - - "github.com/go-macaron/csrf" - "gopkg.in/macaron.v1" - - "github.com/gogits/gogs/modules/auth" - "github.com/gogits/gogs/modules/setting" -) - -type ToggleOptions struct { - SignInRequired bool - SignOutRequired bool - AdminRequired bool - DisableCSRF bool -} - -func Toggle(options *ToggleOptions) macaron.Handler { - return func(ctx *Context) { - // Cannot view any page before installation. - if !setting.InstallLock { - ctx.Redirect(setting.AppSubUrl + "/install") - return - } - - // Check prohibit login users. - if ctx.IsSigned && ctx.User.ProhibitLogin { - ctx.Data["Title"] = ctx.Tr("auth.prohibit_login") - ctx.HTML(200, "user/auth/prohibit_login") - return - } - - // Check non-logged users landing page. - if !ctx.IsSigned && ctx.Req.RequestURI == "/" && setting.LandingPageURL != setting.LANDING_PAGE_HOME { - ctx.Redirect(setting.AppSubUrl + string(setting.LandingPageURL)) - return - } - - // Redirect to dashboard if user tries to visit any non-login page. - if options.SignOutRequired && ctx.IsSigned && ctx.Req.RequestURI != "/" { - ctx.Redirect(setting.AppSubUrl + "/") - return - } - - if !options.SignOutRequired && !options.DisableCSRF && ctx.Req.Method == "POST" && !auth.IsAPIPath(ctx.Req.URL.Path) { - csrf.Validate(ctx.Context, ctx.csrf) - if ctx.Written() { - return - } - } - - if options.SignInRequired { - if !ctx.IsSigned { - // Restrict API calls with error message. - if auth.IsAPIPath(ctx.Req.URL.Path) { - ctx.JSON(403, map[string]string{ - "message": "Only signed in user is allowed to call APIs.", - }) - return - } - - ctx.SetCookie("redirect_to", url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) - ctx.Redirect(setting.AppSubUrl + "/user/login") - return - } else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { - ctx.Data["Title"] = ctx.Tr("auth.active_your_account") - ctx.HTML(200, "user/auth/activate") - return - } - } - - // Redirect to log in page if auto-signin info is provided and has not signed in. - if !options.SignOutRequired && !ctx.IsSigned && !auth.IsAPIPath(ctx.Req.URL.Path) && - len(ctx.GetCookie(setting.CookieUserName)) > 0 { - ctx.SetCookie("redirect_to", url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) - ctx.Redirect(setting.AppSubUrl + "/user/login") - return - } - - if options.AdminRequired { - if !ctx.User.IsAdmin { - ctx.Error(403) - return - } - ctx.Data["PageIsAdmin"] = true - } - } -} diff --git a/modules/context/context.go b/modules/context/context.go deleted file mode 100644 index ac46bb38fb6..00000000000 --- a/modules/context/context.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2014 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 context - -import ( - "fmt" - "html/template" - "io" - "net/http" - "strings" - "time" - - "github.com/go-macaron/cache" - "github.com/go-macaron/csrf" - "github.com/go-macaron/i18n" - "github.com/go-macaron/session" - "gopkg.in/macaron.v1" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/auth" - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -// Context represents context of a request. -type Context struct { - *macaron.Context - Cache cache.Cache - csrf csrf.CSRF - Flash *session.Flash - Session session.Store - - User *models.User - IsSigned bool - IsBasicAuth bool - - Repo *Repository - Org *Organization -} - -// HasError returns true if error occurs in form validation. -func (ctx *Context) HasApiError() bool { - hasErr, ok := ctx.Data["HasError"] - if !ok { - return false - } - return hasErr.(bool) -} - -func (ctx *Context) GetErrMsg() string { - return ctx.Data["ErrorMsg"].(string) -} - -// HasError returns true if error occurs in form validation. -func (ctx *Context) HasError() bool { - hasErr, ok := ctx.Data["HasError"] - if !ok { - return false - } - ctx.Flash.ErrorMsg = ctx.Data["ErrorMsg"].(string) - ctx.Data["Flash"] = ctx.Flash - return hasErr.(bool) -} - -// HasValue returns true if value of given name exists. -func (ctx *Context) HasValue(name string) bool { - _, ok := ctx.Data[name] - return ok -} - -// HTML calls Context.HTML and converts template name to string. -func (ctx *Context) HTML(status int, name base.TplName) { - log.Debug("Template: %s", name) - ctx.Context.HTML(status, string(name)) -} - -// RenderWithErr used for page has form validation but need to prompt error to users. -func (ctx *Context) RenderWithErr(msg string, tpl base.TplName, form interface{}) { - if form != nil { - auth.AssignForm(form, ctx.Data) - } - ctx.Flash.ErrorMsg = msg - ctx.Data["Flash"] = ctx.Flash - ctx.HTML(200, tpl) -} - -// Handle handles and logs error by given status. -func (ctx *Context) Handle(status int, title string, err error) { - if err != nil { - log.Error(4, "%s: %v", title, err) - if macaron.Env != macaron.PROD { - ctx.Data["ErrorMsg"] = err - } - } - - switch status { - case 404: - ctx.Data["Title"] = "Page Not Found" - case 500: - ctx.Data["Title"] = "Internal Server Error" - } - ctx.HTML(status, base.TplName(fmt.Sprintf("status/%d", status))) -} - -// NotFoundOrServerError use error check function to determine if the error -// is about not found. It responses with 404 status code for not found error, -// or error context description for logging purpose of 500 server error. -func (ctx *Context) NotFoundOrServerError(title string, errck func(error) bool, err error) { - if errck(err) { - ctx.Handle(404, title, err) - return - } - - ctx.Handle(500, title, err) -} - -func (ctx *Context) HandleText(status int, title string) { - if (status/100 == 4) || (status/100 == 5) { - log.Error(4, "%s", title) - } - ctx.PlainText(status, []byte(title)) -} - -func (ctx *Context) ServeContent(name string, r io.ReadSeeker, params ...interface{}) { - modtime := time.Now() - for _, p := range params { - switch v := p.(type) { - case time.Time: - modtime = v - } - } - ctx.Resp.Header().Set("Content-Description", "File Transfer") - ctx.Resp.Header().Set("Content-Type", "application/octet-stream") - ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+name) - ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary") - ctx.Resp.Header().Set("Expires", "0") - ctx.Resp.Header().Set("Cache-Control", "must-revalidate") - ctx.Resp.Header().Set("Pragma", "public") - http.ServeContent(ctx.Resp, ctx.Req.Request, name, modtime, r) -} - -// Contexter initializes a classic context for a request. -func Contexter() macaron.Handler { - return func(c *macaron.Context, l i18n.Locale, cache cache.Cache, sess session.Store, f *session.Flash, x csrf.CSRF) { - ctx := &Context{ - Context: c, - Cache: cache, - csrf: x, - Flash: f, - Session: sess, - 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, "/") - - ctx.Data["PageStartTime"] = time.Now() - - // Get user from session if logined. - ctx.User, ctx.IsBasicAuth = auth.SignedInUser(ctx.Context, ctx.Session) - - if ctx.User != nil { - ctx.IsSigned = true - ctx.Data["IsSigned"] = ctx.IsSigned - ctx.Data["SignedUser"] = ctx.User - ctx.Data["SignedUserID"] = ctx.User.ID - ctx.Data["SignedUserName"] = ctx.User.Name - ctx.Data["IsAdmin"] = ctx.User.IsAdmin - } else { - ctx.Data["SignedUserID"] = 0 - ctx.Data["SignedUserName"] = "" - } - - // If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid. - if ctx.Req.Method == "POST" && strings.Contains(ctx.Req.Header.Get("Content-Type"), "multipart/form-data") { - if err := ctx.Req.ParseMultipartForm(setting.AttachmentMaxSize << 20); err != nil && !strings.Contains(err.Error(), "EOF") { // 32MB max size - ctx.Handle(500, "ParseMultipartForm", err) - return - } - } - - ctx.Data["CsrfToken"] = x.GetToken() - ctx.Data["CsrfTokenHtml"] = template.HTML(``) - log.Debug("Session ID: %s", sess.ID()) - log.Debug("CSRF Token: %v", ctx.Data["CsrfToken"]) - - ctx.Data["ShowRegistrationButton"] = setting.Service.ShowRegistrationButton - ctx.Data["ShowFooterBranding"] = setting.ShowFooterBranding - ctx.Data["ShowFooterVersion"] = setting.ShowFooterVersion - - c.Map(ctx) - } -} diff --git a/modules/context/org.go b/modules/context/org.go deleted file mode 100644 index 24ef5ef6a8b..00000000000 --- a/modules/context/org.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2014 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 context - -import ( - "strings" - - "gopkg.in/macaron.v1" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/setting" -) - -type Organization struct { - IsOwner bool - IsMember bool - IsTeamMember bool // Is member of team. - IsTeamAdmin bool // In owner team or team that has admin permission level. - Organization *models.User - OrgLink string - - Team *models.Team -} - -func HandleOrgAssignment(ctx *Context, args ...bool) { - var ( - requireMember bool - requireOwner bool - requireTeamMember bool - requireTeamAdmin bool - ) - if len(args) >= 1 { - requireMember = args[0] - } - if len(args) >= 2 { - requireOwner = args[1] - } - if len(args) >= 3 { - requireTeamMember = args[2] - } - if len(args) >= 4 { - requireTeamAdmin = args[3] - } - - orgName := ctx.Params(":org") - - var err error - ctx.Org.Organization, err = models.GetUserByName(orgName) - if err != nil { - if models.IsErrUserNotExist(err) { - ctx.Handle(404, "GetUserByName", err) - } else { - ctx.Handle(500, "GetUserByName", err) - } - return - } - org := ctx.Org.Organization - ctx.Data["Org"] = org - - // Force redirection when username is actually a user. - if !org.IsOrganization() { - ctx.Redirect("/" + org.Name) - return - } - - // Admin has super access. - if ctx.IsSigned && ctx.User.IsAdmin { - ctx.Org.IsOwner = true - ctx.Org.IsMember = true - ctx.Org.IsTeamMember = true - ctx.Org.IsTeamAdmin = true - } else if ctx.IsSigned { - ctx.Org.IsOwner = org.IsOwnedBy(ctx.User.ID) - if ctx.Org.IsOwner { - ctx.Org.IsMember = true - ctx.Org.IsTeamMember = true - ctx.Org.IsTeamAdmin = true - } else { - if org.IsOrgMember(ctx.User.ID) { - ctx.Org.IsMember = true - } - } - } else { - // Fake data. - ctx.Data["SignedUser"] = &models.User{} - } - if (requireMember && !ctx.Org.IsMember) || - (requireOwner && !ctx.Org.IsOwner) { - ctx.Handle(404, "OrgAssignment", err) - return - } - ctx.Data["IsOrganizationOwner"] = ctx.Org.IsOwner - ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember - - ctx.Org.OrgLink = setting.AppSubUrl + "/org/" + org.Name - ctx.Data["OrgLink"] = ctx.Org.OrgLink - - // Team. - if ctx.Org.IsMember { - if ctx.Org.IsOwner { - if err := org.GetTeams(); err != nil { - ctx.Handle(500, "GetTeams", err) - return - } - } else { - org.Teams, err = org.GetUserTeams(ctx.User.ID) - if err != nil { - ctx.Handle(500, "GetUserTeams", err) - return - } - } - } - - teamName := ctx.Params(":team") - if len(teamName) > 0 { - teamExists := false - for _, team := range org.Teams { - if team.LowerName == strings.ToLower(teamName) { - teamExists = true - ctx.Org.Team = team - ctx.Org.IsTeamMember = true - ctx.Data["Team"] = ctx.Org.Team - break - } - } - - if !teamExists { - ctx.Handle(404, "OrgAssignment", err) - return - } - - ctx.Data["IsTeamMember"] = ctx.Org.IsTeamMember - if requireTeamMember && !ctx.Org.IsTeamMember { - ctx.Handle(404, "OrgAssignment", err) - return - } - - ctx.Org.IsTeamAdmin = ctx.Org.Team.IsOwnerTeam() || ctx.Org.Team.Authorize >= models.ACCESS_MODE_ADMIN - ctx.Data["IsTeamAdmin"] = ctx.Org.IsTeamAdmin - if requireTeamAdmin && !ctx.Org.IsTeamAdmin { - ctx.Handle(404, "OrgAssignment", err) - return - } - } -} - -func OrgAssignment(args ...bool) macaron.Handler { - return func(ctx *Context) { - HandleOrgAssignment(ctx, args...) - } -} diff --git a/modules/context/repo.go b/modules/context/repo.go deleted file mode 100644 index f078523e758..00000000000 --- a/modules/context/repo.go +++ /dev/null @@ -1,480 +0,0 @@ -// Copyright 2014 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 context - -import ( - "fmt" - "io/ioutil" - "path" - "strings" - - "github.com/Unknwon/com" - "gopkg.in/editorconfig/editorconfig-core-go.v1" - "gopkg.in/macaron.v1" - - "github.com/gogits/git-module" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -type PullRequest struct { - BaseRepo *models.Repository - Allowed bool - SameRepo bool - HeadInfo string // [:] -} - -type Repository struct { - AccessMode models.AccessMode - IsWatching bool - IsViewBranch bool - IsViewTag bool - IsViewCommit bool - Repository *models.Repository - Owner *models.User - Commit *git.Commit - Tag *git.Tag - GitRepo *git.Repository - BranchName string - TagName string - TreePath string - CommitID string - RepoLink string - CloneLink models.CloneLink - CommitsCount int64 - Mirror *models.Mirror - - PullRequest *PullRequest -} - -// IsOwner returns true if current user is the owner of repository. -func (r *Repository) IsOwner() bool { - return r.AccessMode >= models.ACCESS_MODE_OWNER -} - -// IsAdmin returns true if current user has admin or higher access of repository. -func (r *Repository) IsAdmin() bool { - return r.AccessMode >= models.ACCESS_MODE_ADMIN -} - -// IsWriter returns true if current user has write or higher access of repository. -func (r *Repository) IsWriter() bool { - return r.AccessMode >= models.ACCESS_MODE_WRITE -} - -// HasAccess returns true if the current user has at least read access for this repository -func (r *Repository) HasAccess() bool { - return r.AccessMode >= models.ACCESS_MODE_READ -} - -// CanEnableEditor returns true if repository is editable and user has proper access level. -func (r *Repository) CanEnableEditor() bool { - return r.Repository.CanEnableEditor() && r.IsViewBranch && r.IsWriter() -} - -// GetEditorconfig returns the .editorconfig definition if found in the -// HEAD of the default repo branch. -func (r *Repository) GetEditorconfig() (*editorconfig.Editorconfig, error) { - commit, err := r.GitRepo.GetBranchCommit(r.Repository.DefaultBranch) - if err != nil { - return nil, err - } - treeEntry, err := commit.GetTreeEntryByPath(".editorconfig") - if err != nil { - return nil, err - } - reader, err := treeEntry.Blob().Data() - if err != nil { - return nil, err - } - data, err := ioutil.ReadAll(reader) - if err != nil { - return nil, err - } - return editorconfig.ParseBytes(data) -} - -func RetrieveBaseRepo(ctx *Context, repo *models.Repository) { - // Non-fork repository will not return error in this method. - if err := repo.GetBaseRepo(); err != nil { - if models.IsErrRepoNotExist(err) { - repo.IsFork = false - repo.ForkID = 0 - return - } - ctx.Handle(500, "GetBaseRepo", err) - return - } else if err = repo.BaseRepo.GetOwner(); err != nil { - ctx.Handle(500, "BaseRepo.GetOwner", err) - return - } -} - -// 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 -// 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) { - 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")), - }))) -} - -func RepoAssignment(args ...bool) macaron.Handler { - return func(ctx *Context) { - var ( - displayBare bool // To display bare page if it is a bare repo. - ) - if len(args) >= 1 { - displayBare = args[0] - } - - var ( - owner *models.User - err error - ) - - userName := ctx.Params(":username") - repoName := ctx.Params(":reponame") - refName := ctx.Params(":branchname") - if len(refName) == 0 { - refName = ctx.Params(":path") - } - - // Check if the user is the same as the repository owner - if ctx.IsSigned && ctx.User.LowerName == strings.ToLower(userName) { - owner = ctx.User - } else { - owner, err = models.GetUserByName(userName) - if err != nil { - if models.IsErrUserNotExist(err) { - if ctx.Query("go-get") == "1" { - earlyResponseForGoGetMeta(ctx) - return - } - ctx.Handle(404, "GetUserByName", err) - } else { - ctx.Handle(500, "GetUserByName", err) - } - return - } - } - ctx.Repo.Owner = owner - ctx.Data["Username"] = ctx.Repo.Owner.Name - - // Get repository. - repo, err := models.GetRepositoryByName(owner.ID, repoName) - if err != nil { - if models.IsErrRepoNotExist(err) { - if ctx.Query("go-get") == "1" { - earlyResponseForGoGetMeta(ctx) - return - } - ctx.Handle(404, "GetRepositoryByName", err) - } else { - ctx.Handle(500, "GetRepositoryByName", err) - } - return - } else 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.ACCESS_MODE_OWNER - } else { - mode, err := models.AccessLevel(ctx.User, repo) - if err != nil { - ctx.Handle(500, "AccessLevel", err) - return - } - ctx.Repo.AccessMode = mode - } - - // Check access. - if ctx.Repo.AccessMode == models.ACCESS_MODE_NONE { - 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 - - gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName)) - if err != nil { - ctx.Handle(500, "RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err) - return - } - ctx.Repo.GitRepo = gitRepo - ctx.Repo.RepoLink = repo.Link() - ctx.Data["RepoLink"] = ctx.Repo.RepoLink - ctx.Data["RepoRelPath"] = ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name - - tags, err := ctx.Repo.GitRepo.GetTags() - if err != nil { - ctx.Handle(500, "GetTags", err) - return - } - ctx.Data["Tags"] = tags - ctx.Repo.Repository.NumTags = len(tags) - - ctx.Data["Title"] = owner.Name + "/" + repo.Name - ctx.Data["Repository"] = repo - ctx.Data["Owner"] = ctx.Repo.Repository.Owner - ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner() - ctx.Data["IsRepositoryAdmin"] = ctx.Repo.IsAdmin() - ctx.Data["IsRepositoryWriter"] = ctx.Repo.IsWriter() - - ctx.Data["DisableSSH"] = setting.SSH.Disabled - ctx.Data["CloneLink"] = repo.CloneLink() - ctx.Data["WikiCloneLink"] = repo.WikiCloneLink() - - if ctx.IsSigned { - ctx.Data["IsWatchingRepo"] = models.IsWatching(ctx.User.ID, repo.ID) - ctx.Data["IsStaringRepo"] = models.IsStaring(ctx.User.ID, repo.ID) - } - - // 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") - } - return - } - - ctx.Data["TagName"] = ctx.Repo.TagName - brs, err := ctx.Repo.GitRepo.GetBranches() - if err != nil { - ctx.Handle(500, "GetBranches", err) - return - } - ctx.Data["Branches"] = brs - ctx.Data["BrancheCount"] = len(brs) - - // If not branch selected, try default one. - // If default branch doesn't exists, fall back to some other branch. - if len(ctx.Repo.BranchName) == 0 { - if len(ctx.Repo.Repository.DefaultBranch) > 0 && gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) { - ctx.Repo.BranchName = ctx.Repo.Repository.DefaultBranch - } else if len(brs) > 0 { - ctx.Repo.BranchName = brs[0] - } - } - ctx.Data["BranchName"] = ctx.Repo.BranchName - ctx.Data["CommitID"] = ctx.Repo.CommitID - - if repo.IsFork { - RetrieveBaseRepo(ctx, repo) - if ctx.Written() { - return - } - } - - // People who have push access or have fored 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 - } - } else { - // Or, this is repository accepts pull requests between branches. - if repo.AllowsPulls() { - ctx.Data["BaseRepo"] = repo - ctx.Repo.PullRequest.BaseRepo = repo - ctx.Repo.PullRequest.Allowed = true - ctx.Repo.PullRequest.SameRepo = true - ctx.Repo.PullRequest.HeadInfo = ctx.Repo.BranchName - } - } - } - ctx.Data["PullRequestCtx"] = ctx.Repo.PullRequest - - if ctx.Query("go-get") == "1" { - 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}" - } - } -} - -// RepoRef handles repository reference name including those contain `/`. -func RepoRef() macaron.Handler { - return func(ctx *Context) { - // Empty repository does not have reference information. - if ctx.Repo.Repository.IsBare { - return - } - - var ( - refName string - err error - ) - - // For API calls. - if ctx.Repo.GitRepo == nil { - repoPath := models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) - ctx.Repo.GitRepo, err = git.OpenRepository(repoPath) - if err != nil { - ctx.Handle(500, "RepoRef Invalid repo "+repoPath, err) - return - } - } - - // Get default branch. - if len(ctx.Params("*")) == 0 { - refName = ctx.Repo.Repository.DefaultBranch - if !ctx.Repo.GitRepo.IsBranchExist(refName) { - brs, err := ctx.Repo.GitRepo.GetBranches() - if err != nil { - ctx.Handle(500, "GetBranches", err) - return - } - refName = brs[0] - } - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName) - if err != nil { - ctx.Handle(500, "GetBranchCommit", err) - return - } - ctx.Repo.CommitID = ctx.Repo.Commit.ID.String() - ctx.Repo.IsViewBranch = true - - } else { - hasMatched := false - parts := strings.Split(ctx.Params("*"), "/") - for i, part := range parts { - refName = strings.TrimPrefix(refName+"/"+part, "/") - - if ctx.Repo.GitRepo.IsBranchExist(refName) || - ctx.Repo.GitRepo.IsTagExist(refName) { - if i < len(parts)-1 { - ctx.Repo.TreePath = strings.Join(parts[i+1:], "/") - } - hasMatched = true - break - } - } - if !hasMatched && len(parts[0]) == 40 { - refName = parts[0] - ctx.Repo.TreePath = strings.Join(parts[1:], "/") - } - - if ctx.Repo.GitRepo.IsBranchExist(refName) { - ctx.Repo.IsViewBranch = true - - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName) - if err != nil { - ctx.Handle(500, "GetBranchCommit", err) - return - } - ctx.Repo.CommitID = ctx.Repo.Commit.ID.String() - - } else if ctx.Repo.GitRepo.IsTagExist(refName) { - ctx.Repo.IsViewTag = true - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetTagCommit(refName) - if err != nil { - ctx.Handle(500, "GetTagCommit", err) - return - } - ctx.Repo.CommitID = ctx.Repo.Commit.ID.String() - } else if len(refName) == 40 { - ctx.Repo.IsViewCommit = true - ctx.Repo.CommitID = refName - - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName) - if err != nil { - ctx.Handle(404, "GetCommit", nil) - return - } - } else { - ctx.Handle(404, "RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName)) - return - } - } - - ctx.Repo.BranchName = refName - ctx.Data["BranchName"] = ctx.Repo.BranchName - ctx.Data["CommitID"] = ctx.Repo.CommitID - ctx.Data["TreePath"] = ctx.Repo.TreePath - ctx.Data["IsViewBranch"] = ctx.Repo.IsViewBranch - ctx.Data["IsViewTag"] = ctx.Repo.IsViewTag - ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit - - ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount() - if err != nil { - ctx.Handle(500, "CommitsCount", err) - return - } - ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount - } -} - -func RequireRepoAdmin() macaron.Handler { - return func(ctx *Context) { - if !ctx.IsSigned || (!ctx.Repo.IsAdmin() && !ctx.User.IsAdmin) { - ctx.Handle(404, ctx.Req.RequestURI, nil) - return - } - } -} - -func RequireRepoWriter() macaron.Handler { - return func(ctx *Context) { - if !ctx.IsSigned || (!ctx.Repo.IsWriter() && !ctx.User.IsAdmin) { - ctx.Handle(404, ctx.Req.RequestURI, nil) - return - } - } -} - -// GitHookService checks if repository Git hooks service has been enabled. -func GitHookService() macaron.Handler { - return func(ctx *Context) { - if !ctx.User.CanEditGitHook() { - ctx.Handle(404, "GitHookService", nil) - return - } - } -} diff --git a/modules/cron/cron.go b/modules/cron/cron.go deleted file mode 100644 index 7695b974bbf..00000000000 --- a/modules/cron/cron.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2014 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 cron - -import ( - "time" - - "github.com/gogits/cron" - - "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -var c = cron.New() - -func NewContext() { - var ( - entry *cron.Entry - err error - ) - if setting.Cron.UpdateMirror.Enabled { - entry, err = c.AddFunc("Update mirrors", setting.Cron.UpdateMirror.Schedule, models.MirrorUpdate) - if err != nil { - log.Fatal(4, "Cron[Update mirrors]: %v", err) - } - if setting.Cron.UpdateMirror.RunAtStart { - entry.Prev = time.Now() - entry.ExecTimes++ - go models.MirrorUpdate() - } - } - if setting.Cron.RepoHealthCheck.Enabled { - entry, err = c.AddFunc("Repository health check", setting.Cron.RepoHealthCheck.Schedule, models.GitFsck) - if err != nil { - log.Fatal(4, "Cron[Repository health check]: %v", err) - } - if setting.Cron.RepoHealthCheck.RunAtStart { - entry.Prev = time.Now() - entry.ExecTimes++ - go models.GitFsck() - } - } - if setting.Cron.CheckRepoStats.Enabled { - entry, err = c.AddFunc("Check repository statistics", setting.Cron.CheckRepoStats.Schedule, models.CheckRepoStats) - if err != nil { - log.Fatal(4, "Cron[Check repository statistics]: %v", err) - } - if setting.Cron.CheckRepoStats.RunAtStart { - entry.Prev = time.Now() - entry.ExecTimes++ - go models.CheckRepoStats() - } - } - c.Start() -} - -// ListTasks returns all running cron tasks. -func ListTasks() []*cron.Entry { - return c.Entries() -} diff --git a/modules/log/conn.go b/modules/log/conn.go deleted file mode 100644 index c104a16c93b..00000000000 --- a/modules/log/conn.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2014 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 log - -import ( - "encoding/json" - "io" - "log" - "net" -) - -// ConnWriter implements LoggerInterface. -// it writes messages in keep-live tcp connection. -type ConnWriter struct { - lg *log.Logger - innerWriter io.WriteCloser - ReconnectOnMsg bool `json:"reconnectOnMsg"` - Reconnect bool `json:"reconnect"` - Net string `json:"net"` - Addr string `json:"addr"` - Level int `json:"level"` -} - -// create new ConnWrite returning as LoggerInterface. -func NewConn() LoggerInterface { - conn := new(ConnWriter) - conn.Level = TRACE - return conn -} - -// init connection writer with json config. -// json config only need key "level". -func (cw *ConnWriter) Init(jsonconfig string) error { - return json.Unmarshal([]byte(jsonconfig), cw) -} - -// write message in connection. -// if connection is down, try to re-connect. -func (cw *ConnWriter) WriteMsg(msg string, skip, level int) error { - if cw.Level > level { - return nil - } - if cw.neddedConnectOnMsg() { - if err := cw.connect(); err != nil { - return err - } - } - - if cw.ReconnectOnMsg { - defer cw.innerWriter.Close() - } - cw.lg.Println(msg) - return nil -} - -func (_ *ConnWriter) Flush() { -} - -// destroy connection writer and close tcp listener. -func (cw *ConnWriter) Destroy() { - if cw.innerWriter == nil { - return - } - cw.innerWriter.Close() -} - -func (cw *ConnWriter) connect() error { - if cw.innerWriter != nil { - cw.innerWriter.Close() - cw.innerWriter = nil - } - - conn, err := net.Dial(cw.Net, cw.Addr) - if err != nil { - return err - } - - if tcpConn, ok := conn.(*net.TCPConn); ok { - tcpConn.SetKeepAlive(true) - } - - cw.innerWriter = conn - cw.lg = log.New(conn, "", log.Ldate|log.Ltime) - return nil -} - -func (cw *ConnWriter) neddedConnectOnMsg() bool { - if cw.Reconnect { - cw.Reconnect = false - return true - } - - if cw.innerWriter == nil { - return true - } - - return cw.ReconnectOnMsg -} - -func init() { - Register("conn", NewConn) -} diff --git a/modules/log/console.go b/modules/log/console.go deleted file mode 100644 index f5a8b96fd76..00000000000 --- a/modules/log/console.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2014 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 log - -import ( - "encoding/json" - "log" - "os" - "runtime" -) - -type Brush func(string) string - -func NewBrush(color string) Brush { - pre := "\033[" - reset := "\033[0m" - return func(text string) string { - return pre + color + "m" + text + reset - } -} - -var colors = []Brush{ - NewBrush("1;36"), // Trace cyan - NewBrush("1;34"), // Debug blue - NewBrush("1;32"), // Info green - NewBrush("1;33"), // Warn yellow - NewBrush("1;31"), // Error red - NewBrush("1;35"), // Critical purple - NewBrush("1;31"), // Fatal red -} - -// ConsoleWriter implements LoggerInterface and writes messages to terminal. -type ConsoleWriter struct { - lg *log.Logger - Level int `json:"level"` -} - -// create ConsoleWriter returning as LoggerInterface. -func NewConsole() LoggerInterface { - return &ConsoleWriter{ - lg: log.New(os.Stdout, "", log.Ldate|log.Ltime), - Level: TRACE, - } -} - -func (cw *ConsoleWriter) Init(config string) error { - return json.Unmarshal([]byte(config), cw) -} - -func (cw *ConsoleWriter) WriteMsg(msg string, skip, level int) error { - if cw.Level > level { - return nil - } - if runtime.GOOS == "windows" { - cw.lg.Println(msg) - } else { - cw.lg.Println(colors[level](msg)) - } - return nil -} - -func (_ *ConsoleWriter) Flush() { - -} - -func (_ *ConsoleWriter) Destroy() { -} - -func init() { - Register("console", NewConsole) -} diff --git a/modules/log/file.go b/modules/log/file.go deleted file mode 100644 index e9402815f0b..00000000000 --- a/modules/log/file.go +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright 2014 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 log - -import ( - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "log" - "os" - "path/filepath" - "strings" - "sync" - "time" -) - -// FileLogWriter implements LoggerInterface. -// It writes messages by lines limit, file size limit, or time frequency. -type FileLogWriter struct { - *log.Logger - mw *MuxWriter - // The opened file - Filename string `json:"filename"` - - Maxlines int `json:"maxlines"` - maxlines_curlines int - - // Rotate at size - Maxsize int `json:"maxsize"` - maxsize_cursize int - - // Rotate daily - Daily bool `json:"daily"` - Maxdays int64 `json:"maxdays"` - daily_opendate int - - Rotate bool `json:"rotate"` - - startLock sync.Mutex // Only one log can write to the file - - Level int `json:"level"` -} - -// an *os.File writer with locker. -type MuxWriter struct { - sync.Mutex - fd *os.File -} - -// write to os.File. -func (l *MuxWriter) Write(b []byte) (int, error) { - l.Lock() - defer l.Unlock() - return l.fd.Write(b) -} - -// set os.File in writer. -func (l *MuxWriter) SetFd(fd *os.File) { - if l.fd != nil { - l.fd.Close() - } - l.fd = fd -} - -// create a FileLogWriter returning as LoggerInterface. -func NewFileWriter() LoggerInterface { - w := &FileLogWriter{ - Filename: "", - Maxlines: 1000000, - Maxsize: 1 << 28, //256 MB - Daily: true, - Maxdays: 7, - Rotate: true, - Level: TRACE, - } - // use MuxWriter instead direct use os.File for lock write when rotate - w.mw = new(MuxWriter) - // set MuxWriter as Logger's io.Writer - w.Logger = log.New(w.mw, "", log.Ldate|log.Ltime) - return w -} - -// Init file logger with json config. -// config like: -// { -// "filename":"log/gogs.log", -// "maxlines":10000, -// "maxsize":1<<30, -// "daily":true, -// "maxdays":15, -// "rotate":true -// } -func (w *FileLogWriter) Init(config string) error { - if err := json.Unmarshal([]byte(config), w); err != nil { - return err - } - if len(w.Filename) == 0 { - return errors.New("config must have filename") - } - return w.StartLogger() -} - -// start file logger. create log file and set to locker-inside file writer. -func (w *FileLogWriter) StartLogger() error { - fd, err := w.createLogFile() - if err != nil { - return err - } - w.mw.SetFd(fd) - if err = w.initFd(); err != nil { - return err - } - return nil -} - -func (w *FileLogWriter) docheck(size int) { - w.startLock.Lock() - defer w.startLock.Unlock() - if w.Rotate && ((w.Maxlines > 0 && w.maxlines_curlines >= w.Maxlines) || - (w.Maxsize > 0 && w.maxsize_cursize >= w.Maxsize) || - (w.Daily && time.Now().Day() != w.daily_opendate)) { - if err := w.DoRotate(); err != nil { - fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) - return - } - } - w.maxlines_curlines++ - w.maxsize_cursize += size -} - -// write logger message into file. -func (w *FileLogWriter) WriteMsg(msg string, skip, level int) error { - if level < w.Level { - return nil - } - n := 24 + len(msg) // 24 stand for the length "2013/06/23 21:00:22 [T] " - w.docheck(n) - w.Logger.Println(msg) - return nil -} - -func (w *FileLogWriter) createLogFile() (*os.File, error) { - // Open the log file - return os.OpenFile(w.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0660) -} - -func (w *FileLogWriter) initFd() error { - fd := w.mw.fd - finfo, err := fd.Stat() - if err != nil { - return fmt.Errorf("get stat: %s\n", err) - } - w.maxsize_cursize = int(finfo.Size()) - w.daily_opendate = time.Now().Day() - if finfo.Size() > 0 { - content, err := ioutil.ReadFile(w.Filename) - if err != nil { - return err - } - w.maxlines_curlines = len(strings.Split(string(content), "\n")) - } else { - w.maxlines_curlines = 0 - } - return nil -} - -// DoRotate means it need to write file in new file. -// new file name like xx.log.2013-01-01.2 -func (w *FileLogWriter) DoRotate() error { - _, err := os.Lstat(w.Filename) - if err == nil { // file exists - // Find the next available number - num := 1 - fname := "" - for ; err == nil && num <= 999; num++ { - fname = w.Filename + fmt.Sprintf(".%s.%03d", time.Now().Format("2006-01-02"), num) - _, err = os.Lstat(fname) - } - // return error if the last file checked still existed - if err == nil { - return fmt.Errorf("rotate: cannot find free log number to rename %s\n", w.Filename) - } - - // block Logger's io.Writer - w.mw.Lock() - defer w.mw.Unlock() - - fd := w.mw.fd - fd.Close() - - // close fd before rename - // Rename the file to its newfound home - if err = os.Rename(w.Filename, fname); err != nil { - return fmt.Errorf("Rotate: %s\n", err) - } - - // re-start logger - if err = w.StartLogger(); err != nil { - return fmt.Errorf("Rotate StartLogger: %s\n", err) - } - - go w.deleteOldLog() - } - - return nil -} - -func (w *FileLogWriter) deleteOldLog() { - dir := filepath.Dir(w.Filename) - filepath.Walk(dir, func(path string, info os.FileInfo, err error) (returnErr error) { - defer func() { - if r := recover(); r != nil { - returnErr = fmt.Errorf("Unable to delete old log '%s', error: %+v", path, r) - } - }() - - if !info.IsDir() && info.ModTime().Unix() < (time.Now().Unix()-60*60*24*w.Maxdays) { - if strings.HasPrefix(filepath.Base(path), filepath.Base(w.Filename)) { - os.Remove(path) - } - } - return returnErr - }) -} - -// destroy file logger, close file writer. -func (w *FileLogWriter) Destroy() { - w.mw.fd.Close() -} - -// flush file logger. -// there are no buffering messages in file logger in memory. -// flush file means sync file from disk. -func (w *FileLogWriter) Flush() { - w.mw.fd.Sync() -} - -func init() { - Register("file", NewFileWriter) -} diff --git a/modules/log/log.go b/modules/log/log.go deleted file mode 100644 index 41be4140512..00000000000 --- a/modules/log/log.go +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright 2014 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 log - -import ( - "fmt" - "os" - "path" - "path/filepath" - "runtime" - "strings" - "sync" -) - -var ( - loggers []*Logger - GitLogger *Logger -) - -func NewLogger(bufLen int64, mode, config string) { - logger := newLogger(bufLen) - - isExist := false - for i, l := range loggers { - if l.adapter == mode { - isExist = true - loggers[i] = logger - } - } - if !isExist { - loggers = append(loggers, logger) - } - if err := logger.SetLogger(mode, config); err != nil { - Fatal(2, "Fail to set logger (%s): %v", mode, err) - } -} - -// FIXME: use same log level as other loggers. -func NewGitLogger(logPath string) { - os.MkdirAll(path.Dir(logPath), os.ModePerm) - GitLogger = newLogger(0) - GitLogger.SetLogger("file", fmt.Sprintf(`{"level":0,"filename":"%s","rotate":false}`, logPath)) -} - -func Trace(format string, v ...interface{}) { - for _, logger := range loggers { - logger.Trace(format, v...) - } -} - -func Debug(format string, v ...interface{}) { - for _, logger := range loggers { - logger.Debug(format, v...) - } -} - -func Info(format string, v ...interface{}) { - for _, logger := range loggers { - logger.Info(format, v...) - } -} - -func Warn(format string, v ...interface{}) { - for _, logger := range loggers { - logger.Warn(format, v...) - } -} - -func Error(skip int, format string, v ...interface{}) { - for _, logger := range loggers { - logger.Error(skip, format, v...) - } -} - -func Critical(skip int, format string, v ...interface{}) { - for _, logger := range loggers { - logger.Critical(skip, format, v...) - } -} - -func Fatal(skip int, format string, v ...interface{}) { - Error(skip, format, v...) - for _, l := range loggers { - l.Close() - } - os.Exit(1) -} - -func Close() { - for _, l := range loggers { - l.Close() - } -} - -// .___ __ _____ -// | | _____/ |_ ____________/ ____\____ ____ ____ -// | |/ \ __\/ __ \_ __ \ __\\__ \ _/ ___\/ __ \ -// | | | \ | \ ___/| | \/| | / __ \\ \__\ ___/ -// |___|___| /__| \___ >__| |__| (____ /\___ >___ > -// \/ \/ \/ \/ \/ - -type LogLevel int - -const ( - TRACE = iota - DEBUG - INFO - WARN - ERROR - CRITICAL - FATAL -) - -// LoggerInterface represents behaviors of a logger provider. -type LoggerInterface interface { - Init(config string) error - WriteMsg(msg string, skip, level int) error - Destroy() - Flush() -} - -type loggerType func() LoggerInterface - -var adapters = make(map[string]loggerType) - -// Register registers given logger provider to adapters. -func Register(name string, log loggerType) { - if log == nil { - panic("log: register provider is nil") - } - if _, dup := adapters[name]; dup { - panic("log: register called twice for provider \"" + name + "\"") - } - adapters[name] = log -} - -type logMsg struct { - skip, level int - msg string -} - -// Logger is default logger in beego application. -// 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 - 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), - } - go l.StartLogger() - return l -} - -// 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.adapter = adapter - } else { - panic("log: unknown adapter \"" + adapter + "\" (forgotten register?)") - } - return nil -} - -// 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) - } else { - panic("log: unknown adapter \"" + adapter + "\" (forgotten register?)") - } - return nil -} - -func (l *Logger) writerMsg(skip, level int, msg string) error { - if l.level > level { - return nil - } - lm := &logMsg{ - skip: skip, - level: level, - } - - // Only error information needs locate position for debugging. - if lm.level >= ERROR { - pc, file, line, ok := runtime.Caller(skip) - if ok { - // Get caller function name. - fn := runtime.FuncForPC(pc) - var fnName string - if fn == nil { - fnName = "?()" - } else { - fnName = strings.TrimLeft(filepath.Ext(fn.Name()), ".") + "()" - } - - fileName := file - if len(fileName) > 20 { - fileName = "..." + fileName[len(fileName)-20:] - } - lm.msg = fmt.Sprintf("[%s:%d %s] %s", fileName, line, fnName, msg) - } else { - lm.msg = msg - } - } else { - lm.msg = msg - } - l.msg <- lm - return nil -} - -// StartLogger starts logger chan reading. -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 { - fmt.Println("ERROR, unable to WriteMsg:", err) - } - } - case <-l.quit: - return - } - } -} - -// Flush flushs all chan data. -func (l *Logger) Flush() { - for _, l := range l.outputs { - l.Flush() - } -} - -// Close closes logger, flush all chan data and destroy all adapter instances. -func (l *Logger) Close() { - l.quit <- true - 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 { - fmt.Println("ERROR, unable to WriteMsg:", err) - } - } - } else { - break - } - } - for _, l := range l.outputs { - l.Flush() - l.Destroy() - } -} - -func (l *Logger) Trace(format string, v ...interface{}) { - msg := fmt.Sprintf("[T] "+format, v...) - l.writerMsg(0, TRACE, msg) -} - -func (l *Logger) Debug(format string, v ...interface{}) { - msg := fmt.Sprintf("[D] "+format, v...) - l.writerMsg(0, DEBUG, msg) -} - -func (l *Logger) Info(format string, v ...interface{}) { - msg := fmt.Sprintf("[I] "+format, v...) - l.writerMsg(0, INFO, msg) -} - -func (l *Logger) Warn(format string, v ...interface{}) { - msg := fmt.Sprintf("[W] "+format, v...) - l.writerMsg(0, WARN, msg) -} - -func (l *Logger) Error(skip int, format string, v ...interface{}) { - msg := fmt.Sprintf("[E] "+format, v...) - l.writerMsg(skip, ERROR, msg) -} - -func (l *Logger) Critical(skip int, format string, v ...interface{}) { - msg := fmt.Sprintf("[C] "+format, v...) - l.writerMsg(skip, CRITICAL, msg) -} - -func (l *Logger) Fatal(skip int, format string, v ...interface{}) { - msg := fmt.Sprintf("[F] "+format, v...) - l.writerMsg(skip, FATAL, msg) - l.Close() - os.Exit(1) -} diff --git a/modules/log/smtp.go b/modules/log/smtp.go deleted file mode 100644 index 0a10e56a633..00000000000 --- a/modules/log/smtp.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2014 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 log - -import ( - "encoding/json" - "fmt" - "net/smtp" - "strings" - "time" -) - -const ( - subjectPhrase = "Diagnostic message from server" -) - -// smtpWriter implements LoggerInterface and is used to send emails via given SMTP-server. -type SmtpWriter struct { - Username string `json:"Username"` - Password string `json:"password"` - Host string `json:"Host"` - Subject string `json:"subject"` - RecipientAddresses []string `json:"sendTos"` - Level int `json:"level"` -} - -// create smtp writer. -func NewSmtpWriter() LoggerInterface { - return &SmtpWriter{Level: TRACE} -} - -// init smtp writer with json config. -// config like: -// { -// "Username":"example@gmail.com", -// "password:"password", -// "host":"smtp.gmail.com:465", -// "subject":"email title", -// "sendTos":["email1","email2"], -// "level":LevelError -// } -func (sw *SmtpWriter) Init(jsonconfig string) error { - return json.Unmarshal([]byte(jsonconfig), sw) -} - -// write message in smtp writer. -// it will send an email with subject and only this message. -func (s *SmtpWriter) WriteMsg(msg string, skip, level int) error { - if level < s.Level { - return nil - } - - hp := strings.Split(s.Host, ":") - - // Set up authentication information. - auth := smtp.PlainAuth( - "", - s.Username, - s.Password, - hp[0], - ) - // Connect to the server, authenticate, set the sender and recipient, - // and send the email all in one step. - content_type := "Content-Type: text/plain" + "; charset=UTF-8" - mailmsg := []byte("To: " + strings.Join(s.RecipientAddresses, ";") + "\r\nFrom: " + s.Username + "<" + s.Username + - ">\r\nSubject: " + s.Subject + "\r\n" + content_type + "\r\n\r\n" + fmt.Sprintf(".%s", time.Now().Format("2006-01-02 15:04:05")) + msg) - - return smtp.SendMail( - s.Host, - auth, - s.Username, - s.RecipientAddresses, - mailmsg, - ) -} - -func (_ *SmtpWriter) Flush() { -} - -func (_ *SmtpWriter) Destroy() { -} - -func init() { - Register("smtp", NewSmtpWriter) -} diff --git a/modules/mailer/mailer.go b/modules/mailer/mailer.go deleted file mode 100644 index 32f25f5b57f..00000000000 --- a/modules/mailer/mailer.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2014 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 mailer - -import ( - "crypto/tls" - "fmt" - "io" - "net" - "net/smtp" - "os" - "strings" - "time" - - "github.com/jaytaylor/html2text" - "gopkg.in/gomail.v2" - - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/setting" -) - -type Message struct { - Info string // Message information for log purpose. - *gomail.Message -} - -// 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) - - msg := gomail.NewMessage() - msg.SetHeader("From", from) - msg.SetHeader("To", to...) - 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) - } - } - - return &Message{ - Message: msg, - } -} - -// NewMessage creates new mail message object with default From header. -func NewMessage(to []string, subject, body string) *Message { - return NewMessageFrom(to, setting.MailService.From, subject, body) -} - -type loginAuth struct { - username, password string -} - -// SMTP AUTH LOGIN Auth Handler -func LoginAuth(username, password string) smtp.Auth { - return &loginAuth{username, password} -} - -func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) { - return "LOGIN", []byte{}, nil -} - -func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) { - if more { - switch string(fromServer) { - case "Username:": - return []byte(a.username), nil - case "Password:": - return []byte(a.password), nil - default: - return nil, fmt.Errorf("unknwon fromServer: %s", string(fromServer)) - } - } - return nil, nil -} - -type Sender struct { -} - -func (s *Sender) Send(from string, to []string, msg io.WriterTo) error { - opts := setting.MailService - - host, port, err := net.SplitHostPort(opts.Host) - if err != nil { - return err - } - - tlsconfig := &tls.Config{ - InsecureSkipVerify: opts.SkipVerify, - ServerName: host, - } - - if opts.UseCertificate { - cert, err := tls.LoadX509KeyPair(opts.CertFile, opts.KeyFile) - if err != nil { - return err - } - tlsconfig.Certificates = []tls.Certificate{cert} - } - - conn, err := net.Dial("tcp", net.JoinHostPort(host, port)) - if err != nil { - return err - } - defer conn.Close() - - isSecureConn := false - // Start TLS directly if the port ends with 465 (SMTPS protocol) - if strings.HasSuffix(port, "465") { - conn = tls.Client(conn, tlsconfig) - isSecureConn = true - } - - client, err := smtp.NewClient(conn, host) - if err != nil { - return fmt.Errorf("NewClient: %v", err) - } - - if !opts.DisableHelo { - hostname := opts.HeloHostname - if len(hostname) == 0 { - hostname, err = os.Hostname() - if err != nil { - return err - } - } - - if err = client.Hello(hostname); err != nil { - return fmt.Errorf("Hello: %v", err) - } - } - - // If not using SMTPS, alway use STARTTLS if available - hasStartTLS, _ := client.Extension("STARTTLS") - if !isSecureConn && hasStartTLS { - if err = client.StartTLS(tlsconfig); err != nil { - return fmt.Errorf("StartTLS: %v", err) - } - } - - canAuth, options := client.Extension("AUTH") - if canAuth && len(opts.User) > 0 { - var auth smtp.Auth - - if strings.Contains(options, "CRAM-MD5") { - auth = smtp.CRAMMD5Auth(opts.User, opts.Passwd) - } else if strings.Contains(options, "PLAIN") { - auth = smtp.PlainAuth("", opts.User, opts.Passwd, host) - } else if strings.Contains(options, "LOGIN") { - // Patch for AUTH LOGIN - auth = LoginAuth(opts.User, opts.Passwd) - } - - if auth != nil { - if err = client.Auth(auth); err != nil { - return fmt.Errorf("Auth: %v", err) - } - } - } - - if err = client.Mail(from); err != nil { - return fmt.Errorf("Mail: %v", err) - } - - for _, rec := range to { - if err = client.Rcpt(rec); err != nil { - return fmt.Errorf("Rcpt: %v", err) - } - } - - w, err := client.Data() - if err != nil { - return fmt.Errorf("Data: %v", err) - } else if _, err = msg.WriteTo(w); err != nil { - return fmt.Errorf("WriteTo: %v", err) - } else if err = w.Close(); err != nil { - return fmt.Errorf("Close: %v", err) - } - - return client.Quit() -} - -func processMailQueue() { - sender := &Sender{} - - for { - select { - case msg := <-mailQueue: - log.Trace("New e-mail sending request %s: %s", msg.GetHeader("To"), msg.Info) - if err := gomail.Send(sender, msg.Message); err != nil { - log.Error(3, "Fail to send emails %s: %s - %v", msg.GetHeader("To"), msg.Info, err) - } else { - log.Trace("E-mails sent %s: %s", msg.GetHeader("To"), msg.Info) - } - } - } -} - -var mailQueue chan *Message - -func NewContext() { - // Need to check if mailQueue is nil because in during reinstall (user had installed - // before but swithed install lock off), this function will be called again - // while mail queue is already processing tasks, and produces a race condition. - if setting.MailService == nil || mailQueue != nil { - return - } - - mailQueue = make(chan *Message, setting.MailService.QueueLength) - go processMailQueue() -} - -func SendAsync(msg *Message) { - go func() { - mailQueue <- msg - }() -} diff --git a/modules/markdown/markdown.go b/modules/markdown/markdown.go deleted file mode 100644 index 6724b248ad0..00000000000 --- a/modules/markdown/markdown.go +++ /dev/null @@ -1,405 +0,0 @@ -// Copyright 2014 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 markdown - -import ( - "bytes" - "fmt" - "io" - "path" - "path/filepath" - "regexp" - "strings" - - "github.com/Unknwon/com" - "github.com/microcosm-cc/bluemonday" - "github.com/russross/blackfriday" - "golang.org/x/net/html" - - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/setting" -) - -const ( - ISSUE_NAME_STYLE_NUMERIC = "numeric" - ISSUE_NAME_STYLE_ALPHANUMERIC = "alphanumeric" -) - -var Sanitizer = bluemonday.UGCPolicy() - -// BuildSanitizer initializes sanitizer with allowed attributes based on settings. -// This function should only be called once during entire application lifecycle. -func BuildSanitizer() { - // Normal markdown-stuff - Sanitizer.AllowAttrs("class").Matching(regexp.MustCompile(`[\p{L}\p{N}\s\-_',:\[\]!\./\\\(\)&]*`)).OnElements("code") - - // Checkboxes - Sanitizer.AllowAttrs("type").Matching(regexp.MustCompile(`^checkbox$`)).OnElements("input") - Sanitizer.AllowAttrs("checked", "disabled").OnElements("input") - - // Custom URL-Schemes - Sanitizer.AllowURLSchemes(setting.Markdown.CustomURLSchemes...) -} - -var validLinksPattern = regexp.MustCompile(`^[a-z][\w-]+://`) - -// isLink reports whether link fits valid format. -func isLink(link []byte) bool { - return validLinksPattern.Match(link) -} - -// IsMarkdownFile reports whether name looks like a Markdown file -// based on its extension. -func IsMarkdownFile(name string) bool { - extension := strings.ToLower(filepath.Ext(name)) - for _, ext := range setting.Markdown.FileExtensions { - if strings.ToLower(ext) == extension { - return true - } - } - return false -} - -// IsReadmeFile reports whether name looks like a README file -// based on its extension. -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 ( - // MentionPattern matches string that mentions someone, e.g. @Unknwon - MentionPattern = regexp.MustCompile(`(\s|^|\W)@[0-9a-zA-Z-_\.]+`) - - // CommitPattern matches link to certain commit with or without trailing hash, - // e.g. https://try.gogs.io/gogs/gogs/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2 - CommitPattern = regexp.MustCompile(`(\s|^)https?.*commit/[0-9a-zA-Z]+(#+[0-9a-zA-Z-]*)?`) - - // IssueFullPattern matches link to an issue with or without trailing hash, - // e.g. https://try.gogs.io/gogs/gogs/issues/4#issue-685 - IssueFullPattern = regexp.MustCompile(`(\s|^)https?.*issues/[0-9]+(#+[0-9a-zA-Z-]*)?`) - // IssueNumericPattern matches string that references to a numeric issue, e.g. #1287 - IssueNumericPattern = regexp.MustCompile(`( |^|\()#[0-9]+\b`) - // IssueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234 - IssueAlphanumericPattern = regexp.MustCompile(`( |^|\()[A-Z]{1,10}-[1-9][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(`\b[0-9a-f]{40}\b`) -) - -// FindAllMentions matches mention patterns in given content -// and returns a list of found user names without @ prefix. -func FindAllMentions(content string) []string { - mentions := MentionPattern.FindAllString(content, -1) - for i := range mentions { - mentions[i] = mentions[i][strings.Index(mentions[i], "@")+1:] // Strip @ character - } - return mentions -} - -// Renderer is a extended version of underlying render object. -type Renderer struct { - blackfriday.Renderer - urlPrefix string -} - -// Link defines how formal links should be processed to produce corresponding HTML elements. -func (r *Renderer) Link(out *bytes.Buffer, link []byte, title []byte, content []byte) { - if len(link) > 0 && !isLink(link) { - if link[0] != '#' { - link = []byte(path.Join(r.urlPrefix, string(link))) - } - } - - r.Renderer.Link(out, link, title, content) -} - -// AutoLink defines how auto-detected links should be processed to produce corresponding HTML elements. -// Reference for kind: https://github.com/russross/blackfriday/blob/master/markdown.go#L69-L76 -func (r *Renderer) AutoLink(out *bytes.Buffer, link []byte, kind int) { - if kind != blackfriday.LINK_TYPE_NORMAL { - r.Renderer.AutoLink(out, link, kind) - return - } - - // Since this method could only possibly serve one link at a time, - // we do not need to find all. - if bytes.HasPrefix(link, []byte(setting.AppUrl)) { - m := CommitPattern.Find(link) - if m != nil { - m = bytes.TrimSpace(m) - i := strings.Index(string(m), "commit/") - j := strings.Index(string(m), "#") - if j == -1 { - j = len(m) - } - out.WriteString(fmt.Sprintf(` %s`, m, base.ShortSha(string(m[i+7:j])))) - return - } - - m = IssueFullPattern.Find(link) - if m != nil { - m = bytes.TrimSpace(m) - i := strings.Index(string(m), "issues/") - j := strings.Index(string(m), "#") - if j == -1 { - j = len(m) - } - out.WriteString(fmt.Sprintf(`#%s`, m, base.ShortSha(string(m[i+7:j])))) - return - } - } - - r.Renderer.AutoLink(out, link, kind) -} - -// ListItem defines how list items should be processed to produce corresponding HTML elements. -func (options *Renderer) ListItem(out *bytes.Buffer, text []byte, flags int) { - // Detect procedures to draw checkboxes. - switch { - case bytes.HasPrefix(text, []byte("[ ] ")): - text = append([]byte(``), text[3:]...) - case bytes.HasPrefix(text, []byte("[x] ")): - text = append([]byte(``), text[3:]...) - } - options.Renderer.ListItem(out, text, flags) -} - -// Note: this section is for purpose of increase performance and -// reduce memory allocation at runtime since they are constant literals. -var ( - svgSuffix = []byte(".svg") - svgSuffixWithMark = []byte(".svg?") - spaceBytes = []byte(" ") - spaceEncodedBytes = []byte("%20") - space = " " - spaceEncoded = "%20" -) - -// Image defines how images should be processed to produce corresponding HTML elements. -func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { - prefix := strings.Replace(r.urlPrefix, "/src/", "/raw/", 1) - if len(link) > 0 { - if isLink(link) { - // External link with .svg suffix usually means CI status. - // TODO: define a keyword to allow non-svg images render as external link. - if bytes.HasSuffix(link, svgSuffix) || bytes.Contains(link, svgSuffixWithMark) { - r.Renderer.Image(out, link, title, alt) - return - } - } else { - if link[0] != '/' { - prefix += "/" - } - link = bytes.Replace([]byte((prefix + string(link))), spaceBytes, spaceEncodedBytes, -1) - fmt.Println(333, string(link)) - } - } - - out.WriteString(``) - r.Renderer.Image(out, link, title, alt) - out.WriteString("") -} - -// cutoutVerbosePrefix cutouts URL prefix including sub-path to -// return a clean unified string of request URL path. -func cutoutVerbosePrefix(prefix string) string { - if len(prefix) == 0 || prefix[0] != '/' { - return prefix - } - count := 0 - for i := 0; i < len(prefix); i++ { - if prefix[i] == '/' { - count++ - } - if count >= 3+setting.AppSubUrlDepth { - return prefix[:i] - } - } - return prefix -} - -// RenderIssueIndexPattern renders issue indexes to corresponding links. -func RenderIssueIndexPattern(rawBytes []byte, urlPrefix string, metas map[string]string) []byte { - urlPrefix = cutoutVerbosePrefix(urlPrefix) - - pattern := IssueNumericPattern - if metas["style"] == ISSUE_NAME_STYLE_ALPHANUMERIC { - pattern = IssueAlphanumericPattern - } - - ms := pattern.FindAll(rawBytes, -1) - for _, m := range ms { - if m[0] == ' ' || m[0] == '(' { - m = m[1:] // ignore leading space or opening parentheses - } - var link string - if metas == nil { - link = fmt.Sprintf(`%s`, urlPrefix, m[1:], m) - } else { - // Support for external issue tracker - if metas["style"] == ISSUE_NAME_STYLE_ALPHANUMERIC { - metas["index"] = string(m) - } else { - metas["index"] = string(m[1:]) - } - link = fmt.Sprintf(`%s`, com.Expand(metas["format"], metas), m) - } - rawBytes = bytes.Replace(rawBytes, m, []byte(link), 1) - } - return rawBytes -} - -// RenderSha1CurrentPattern renders SHA1 strings to corresponding links that assumes in the same repository. -func RenderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte { - return []byte(Sha1CurrentPattern.ReplaceAllStringFunc(string(rawBytes[:]), func(m string) string { - if com.StrTo(m).MustInt() > 0 { - return m - } - return fmt.Sprintf(`%s`, urlPrefix, m, base.ShortSha(string(m))) - })) -} - -// RenderSpecialLink renders mentions, indexes and SHA1 strings to corresponding links. -func RenderSpecialLink(rawBytes []byte, urlPrefix string, metas map[string]string) []byte { - ms := MentionPattern.FindAll(rawBytes, -1) - for _, m := range ms { - m = m[bytes.Index(m, []byte("@")):] - rawBytes = bytes.Replace(rawBytes, m, - []byte(fmt.Sprintf(`%s`, setting.AppSubUrl, m[1:], m)), -1) - } - - rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas) - rawBytes = RenderSha1CurrentPattern(rawBytes, urlPrefix) - return rawBytes -} - -// RenderRaw renders Markdown to HTML without handling special links. -func RenderRaw(body []byte, urlPrefix string) []byte { - htmlFlags := 0 - htmlFlags |= blackfriday.HTML_SKIP_STYLE - htmlFlags |= blackfriday.HTML_OMIT_CONTENTS - renderer := &Renderer{ - Renderer: blackfriday.HtmlRenderer(htmlFlags, "", ""), - urlPrefix: urlPrefix, - } - - // set up the parser - extensions := 0 - extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS - extensions |= blackfriday.EXTENSION_TABLES - extensions |= blackfriday.EXTENSION_FENCED_CODE - extensions |= blackfriday.EXTENSION_AUTOLINK - extensions |= blackfriday.EXTENSION_STRIKETHROUGH - extensions |= blackfriday.EXTENSION_SPACE_HEADERS - extensions |= blackfriday.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK - - if setting.Markdown.EnableHardLineBreak { - extensions |= blackfriday.EXTENSION_HARD_LINE_BREAK - } - - body = blackfriday.Markdown(body, renderer, extensions) - return body -} - -var ( - leftAngleBracket = []byte("") -) - -var noEndTags = []string{"img", "input", "br", "hr"} - -// PostProcess treats different types of HTML differently, -// and only renders special links for plain text blocks. -func PostProcess(rawHtml []byte, urlPrefix string, metas map[string]string) []byte { - startTags := make([]string, 0, 5) - var buf bytes.Buffer - tokenizer := html.NewTokenizer(bytes.NewReader(rawHtml)) - -OUTER_LOOP: - for html.ErrorToken != tokenizer.Next() { - token := tokenizer.Token() - switch token.Type { - case html.TextToken: - buf.Write(RenderSpecialLink([]byte(token.String()), urlPrefix, metas)) - - case html.StartTagToken: - buf.WriteString(token.String()) - tagName := token.Data - // If this is an excluded tag, we skip processing all output until a close tag is encountered. - if strings.EqualFold("a", tagName) || strings.EqualFold("code", tagName) || strings.EqualFold("pre", tagName) { - stackNum := 1 - for html.ErrorToken != tokenizer.Next() { - token = tokenizer.Token() - - // Copy the token to the output verbatim - buf.WriteString(token.String()) - - if token.Type == html.StartTagToken { - stackNum++ - } - - // If this is the close tag to the outer-most, we are done - if token.Type == html.EndTagToken { - stackNum-- - - if stackNum <= 0 && strings.EqualFold(tagName, token.Data) { - break - } - } - } - continue OUTER_LOOP - } - - if !com.IsSliceContainsStr(noEndTags, token.Data) { - startTags = append(startTags, token.Data) - } - - case html.EndTagToken: - if len(startTags) == 0 { - buf.WriteString(token.String()) - break - } - - buf.Write(leftAngleBracket) - buf.WriteString(startTags[len(startTags)-1]) - buf.Write(rightAngleBracket) - startTags = startTags[:len(startTags)-1] - default: - buf.WriteString(token.String()) - } - } - - if io.EOF == tokenizer.Err() { - return buf.Bytes() - } - - // If we are not at the end of the input, then some other parsing error has occurred, - // so return the input verbatim. - return rawHtml -} - -// Render renders Markdown to HTML with special links. -func Render(rawBytes []byte, urlPrefix string, metas map[string]string) []byte { - urlPrefix = strings.Replace(urlPrefix, space, spaceEncoded, -1) - result := RenderRaw(rawBytes, urlPrefix) - result = PostProcess(result, urlPrefix, metas) - result = Sanitizer.SanitizeBytes(result) - return result -} - -// RenderString renders Markdown to HTML with special links and returns string type. -func RenderString(raw, urlPrefix string, metas map[string]string) string { - return string(Render([]byte(raw), urlPrefix, metas)) -} diff --git a/modules/markdown/markdown_test.go b/modules/markdown/markdown_test.go deleted file mode 100644 index d4071ba3562..00000000000 --- a/modules/markdown/markdown_test.go +++ /dev/null @@ -1,308 +0,0 @@ -package markdown_test - -import ( - . "github.com/gogits/gogs/modules/markdown" - . "github.com/smartystreets/goconvey/convey" - "testing" - - "bytes" - "github.com/gogits/gogs/modules/setting" - "github.com/russross/blackfriday" -) - -func TestMarkdown(t *testing.T) { - Convey("Rendering an issue mention", t, func() { - var ( - urlPrefix = "/prefix" - metas map[string]string = nil - ) - setting.AppSubUrlDepth = 0 - - Convey("To the internal issue tracker", func() { - Convey("It should not render anything when there are no mentions", func() { - testCases := []string{ - "", - "this is a test", - "test 123 123 1234", - "#", - "# # #", - "# 123", - "#abcd", - "##1234", - "test#1234", - "#1234test", - " test #1234test", - } - - for i := 0; i < len(testCases); i++ { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i]) - } - }) - Convey("It should render freestanding mentions", func() { - testCases := []string{ - "#1234 test", "#1234 test", - "test #1234 issue", "test #1234 issue", - "test issue #1234", "test issue #1234", - "#5 test", "#5 test", - "test #5 issue", "test #5 issue", - "test issue #5", "test issue #5", - } - - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1]) - } - }) - Convey("It should not render issue mention without leading space", func() { - input := []byte("test#54321 issue") - expected := "test#54321 issue" - So(string(RenderIssueIndexPattern(input, urlPrefix, metas)), ShouldEqual, expected) - }) - Convey("It should not render issue mention without trailing space", func() { - input := []byte("test #54321issue") - expected := "test #54321issue" - So(string(RenderIssueIndexPattern(input, urlPrefix, metas)), ShouldEqual, expected) - }) - Convey("It should render issue mention in parentheses", func() { - testCases := []string{ - "(#54321 issue)", "(#54321 issue)", - "test (#54321) issue", "test (#54321) issue", - "test (#54321 extra) issue", "test (#54321 extra) issue", - "test (#54321 issue)", "test (#54321 issue)", - "test (#54321)", "test (#54321)", - } - - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1]) - } - }) - Convey("It should render multiple issue mentions in the same line", func() { - testCases := []string{ - "#54321 #1243", "#54321 #1243", - "test #54321 #1243", "test #54321 #1243", - "(#54321 #1243)", "(#54321 #1243)", - "(#54321)(#1243)", "(#54321)(#1243)", - "text #54321 test #1243 issue", "text #54321 test #1243 issue", - "#1 (#4321) test", "#1 (#4321) test", - } - - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1]) - } - }) - }) - Convey("To an external issue tracker with numeric style", func() { - metas = make(map[string]string) - metas["format"] = "https://someurl.com/{user}/{repo}/{index}" - metas["user"] = "someuser" - metas["repo"] = "somerepo" - metas["style"] = ISSUE_NAME_STYLE_NUMERIC - - Convey("should not render anything when there are no mentions", func() { - testCases := []string{ - "this is a test", - "test 123 123 1234", - "#", - "# # #", - "# 123", - "#abcd", - } - - for i := 0; i < len(testCases); i++ { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i]) - } - }) - Convey("It should render freestanding issue mentions", func() { - testCases := []string{ - "#1234 test", "#1234 test", - "test #1234 issue", "test #1234 issue", - "test issue #1234", "test issue #1234", - "#5 test", "#5 test", - "test #5 issue", "test #5 issue", - "test issue #5", "test issue #5", - } - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1]) - } - }) - Convey("It should not render issue mention without leading space", func() { - input := []byte("test#54321 issue") - expected := "test#54321 issue" - So(string(RenderIssueIndexPattern(input, urlPrefix, metas)), ShouldEqual, expected) - }) - Convey("It should not render issue mention without trailing space", func() { - input := []byte("test #54321issue") - expected := "test #54321issue" - So(string(RenderIssueIndexPattern(input, urlPrefix, metas)), ShouldEqual, expected) - }) - Convey("It should render issue mention in parentheses", func() { - testCases := []string{ - "(#54321 issue)", "(#54321 issue)", - "test (#54321) issue", "test (#54321) issue", - "test (#54321 extra) issue", "test (#54321 extra) issue", - "test (#54321 issue)", "test (#54321 issue)", - "test (#54321)", "test (#54321)", - } - - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1]) - } - }) - Convey("It should render multiple issue mentions in the same line", func() { - testCases := []string{ - "#54321 #1243", "#54321 #1243", - "test #54321 #1243", "test #54321 #1243", - "(#54321 #1243)", "(#54321 #1243)", - "(#54321)(#1243)", "(#54321)(#1243)", - "text #54321 test #1243 issue", "text #54321 test #1243 issue", - "#1 (#4321) test", "#1 (#4321) test", - } - - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1]) - } - }) - }) - Convey("To an external issue tracker with alphanumeric style", func() { - metas = make(map[string]string) - metas["format"] = "https://someurl.com/{user}/{repo}/?b={index}" - metas["user"] = "someuser" - metas["repo"] = "somerepo" - metas["style"] = ISSUE_NAME_STYLE_ALPHANUMERIC - Convey("It should not render anything when there are no mentions", func() { - testCases := []string{ - "", - "this is a test", - "test 123 123 1234", - "#", - "##1234", - "# 123", - "#abcd", - "test #123", - "abc-1234", // issue prefix must be capital - "ABc-1234", // issue prefix must be _all_ capital - "ABCDEFGHIJK-1234", // the limit is 10 characters in the prefix - "ABC1234", // dash is required - "test ABC- test", // number is required - "test -1234 test", // prefix is required - "testABC-123 test", // leading space is required - "test ABC-123test", // trailing space is required - "ABC-0123", // no leading zero - } - - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i]) - } - }) - Convey("It should render freestanding issue mention", func() { - testCases := []string{ - "OTT-1234 test", "OTT-1234 test", - "test T-12 issue", "test T-12 issue", - "test issue ABCDEFGHIJ-1234567890", "test issue ABCDEFGHIJ-1234567890", - "A-1 test", "A-1 test", - "test ZED-1 issue", "test ZED-1 issue", - "test issue DEED-7154", "test issue DEED-7154", - } - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1]) - } - }) - Convey("It should render issue mention in parentheses", func() { - testCases := []string{ - "(ABG-124 issue)", "(ABG-124 issue)", - "test (ABG-124) issue", "test (ABG-124) issue", - "test (ABG-124 extra) issue", "test (ABG-124 extra) issue", - "test (ABG-124 issue)", "test (ABG-124 issue)", - "test (ABG-124)", "test (ABG-124)", - } - - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1]) - } - }) - Convey("It should render multiple issue mentions in the same line", func() { - testCases := []string{ - "ABG-124 OTT-4321", "ABG-124 OTT-4321", - "test ABG-124 OTT-4321", "test ABG-124 OTT-4321", - "(ABG-124 OTT-4321)", "(ABG-124 OTT-4321)", - "(ABG-124)(OTT-4321)", "(ABG-124)(OTT-4321)", - "text ABG-124 test OTT-4321 issue", "text ABG-124 test OTT-4321 issue", - "A-1 (RRE-345) test", "A-1 (RRE-345) test", - } - - for i := 0; i < len(testCases); i += 2 { - So(string(RenderIssueIndexPattern([]byte(testCases[i]), urlPrefix, metas)), ShouldEqual, testCases[i+1]) - } - }) - }) - }) - - Convey("Rendering an issue URL", t, func() { - setting.AppUrl = "http://localhost:3000/" - htmlFlags := 0 - htmlFlags |= blackfriday.HTML_SKIP_STYLE - htmlFlags |= blackfriday.HTML_OMIT_CONTENTS - renderer := &Renderer{ - Renderer: blackfriday.HtmlRenderer(htmlFlags, "", ""), - } - buffer := new(bytes.Buffer) - Convey("To the internal issue tracker", func() { - Convey("It should render valid issue URLs", func() { - testCases := []string{ - "http://localhost:3000/user/repo/issues/3333", "#3333", - } - - for i := 0; i < len(testCases); i += 2 { - renderer.AutoLink(buffer, []byte(testCases[i]), blackfriday.LINK_TYPE_NORMAL) - - line, _ := buffer.ReadString(0) - So(line, ShouldEqual, testCases[i+1]) - } - }) - Convey("It should render but not change non-issue URLs", func() { - testCases := []string{ - "http://1111/2222/ssss-issues/3333?param=blah&blahh=333", "http://1111/2222/ssss-issues/3333?param=blah&blahh=333", - "http://test.com/issues/33333", "http://test.com/issues/33333", - "http://test.com/issues/3", "http://test.com/issues/3", - "http://issues/333", "http://issues/333", - "https://issues/333", "https://issues/333", - "http://tissues/0", "http://tissues/0", - } - - for i := 0; i < len(testCases); i += 2 { - renderer.AutoLink(buffer, []byte(testCases[i]), blackfriday.LINK_TYPE_NORMAL) - - line, _ := buffer.ReadString(0) - So(line, ShouldEqual, testCases[i+1]) - } - }) - }) - }) - - Convey("Rendering a commit URL", t, func() { - setting.AppUrl = "http://localhost:3000/" - htmlFlags := 0 - htmlFlags |= blackfriday.HTML_SKIP_STYLE - htmlFlags |= blackfriday.HTML_OMIT_CONTENTS - renderer := &Renderer{ - Renderer: blackfriday.HtmlRenderer(htmlFlags, "", ""), - } - buffer := new(bytes.Buffer) - Convey("To the internal issue tracker", func() { - Convey("It should correctly convert URLs", func() { - testCases := []string{ - "http://localhost:3000/user/project/commit/d8a994ef243349f321568f9e36d5c3f444b99cae", " d8a994ef24", - "http://localhost:3000/user/project/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2", " d8a994ef24", - "https://external-link.gogs.io/gogs/gogs/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2", "https://external-link.gogs.io/gogs/gogs/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2", - "https://commit/d8a994ef243349f321568f9e36d5c3f444b99cae", "https://commit/d8a994ef243349f321568f9e36d5c3f444b99cae", - } - - for i := 0; i < len(testCases); i += 2 { - renderer.AutoLink(buffer, []byte(testCases[i]), blackfriday.LINK_TYPE_NORMAL) - - line, _ := buffer.ReadString(0) - So(line, ShouldEqual, testCases[i+1]) - } - }) - }) - }) -} diff --git a/modules/process/manager.go b/modules/process/manager.go deleted file mode 100644 index 1f98ca7cfb1..00000000000 --- a/modules/process/manager.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2014 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 process - -import ( - "bytes" - "errors" - "fmt" - "os/exec" - "time" - - "github.com/gogits/gogs/modules/log" -) - -var ( - ErrExecTimeout = errors.New("Process execution timeout") -) - -// Common timeout. -var ( - // NOTE: could be custom in config file for default. - DEFAULT = 60 * time.Second -) - -// Process represents a working process inherit from Gogs. -type Process struct { - Pid int64 // Process ID, not system one. - Description string - Start time.Time - Cmd *exec.Cmd -} - -// List of existing processes. -var ( - curPid int64 = 1 - Processes []*Process -) - -// Add adds a existing process and returns its PID. -func Add(desc string, cmd *exec.Cmd) int64 { - pid := curPid - Processes = append(Processes, &Process{ - Pid: pid, - Description: desc, - Start: time.Now(), - Cmd: cmd, - }) - curPid++ - return pid -} - -// Exec starts executing a command in given path, it records its process and timeout. -func ExecDir(timeout time.Duration, dir, desc, cmdName string, args ...string) (string, string, error) { - if timeout == -1 { - timeout = DEFAULT - } - - bufOut := new(bytes.Buffer) - bufErr := new(bytes.Buffer) - - cmd := exec.Command(cmdName, args...) - cmd.Dir = dir - cmd.Stdout = bufOut - cmd.Stderr = bufErr - if err := cmd.Start(); err != nil { - return "", err.Error(), err - } - - pid := Add(desc, cmd) - done := make(chan error) - go func() { - done <- cmd.Wait() - }() - - var err error - select { - case <-time.After(timeout): - if errKill := Kill(pid); errKill != nil { - log.Error(4, "Exec(%d:%s): %v", pid, desc, errKill) - } - <-done - return "", ErrExecTimeout.Error(), ErrExecTimeout - case err = <-done: - } - - Remove(pid) - return bufOut.String(), bufErr.String(), err -} - -// Exec starts executing a command, it records its process and timeout. -func ExecTimeout(timeout time.Duration, desc, cmdName string, args ...string) (string, string, error) { - return ExecDir(timeout, "", desc, cmdName, args...) -} - -// Exec starts executing a command, it records its process and has default timeout. -func Exec(desc, cmdName string, args ...string) (string, string, error) { - return ExecDir(-1, "", desc, cmdName, args...) -} - -// Remove removes a process from list. -func Remove(pid int64) { - for i, proc := range Processes { - if proc.Pid == pid { - Processes = append(Processes[:i], Processes[i+1:]...) - return - } - } -} - -// Kill kills and removes a process from list. -func Kill(pid int64) error { - for i, proc := range Processes { - if proc.Pid == pid { - if proc.Cmd != nil && proc.Cmd.Process != nil && - proc.Cmd.ProcessState != nil && !proc.Cmd.ProcessState.Exited() { - if err := proc.Cmd.Process.Kill(); err != nil { - return fmt.Errorf("fail to kill process(%d/%s): %v", proc.Pid, proc.Description, err) - } - } - Processes = append(Processes[:i], Processes[i+1:]...) - return nil - } - } - return nil -} diff --git a/modules/setting/miniwinsvc.go b/modules/setting/miniwinsvc.go deleted file mode 100644 index 02e8eb91fc2..00000000000 --- a/modules/setting/miniwinsvc.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build miniwinsvc - -// Copyright 2015 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 setting - -import ( - _ "github.com/kardianos/minwinsvc" -) - -func init() { - SupportMiniWinService = true -} diff --git a/modules/setting/setting.go b/modules/setting/setting.go deleted file mode 100644 index 6a149e81ba2..00000000000 --- a/modules/setting/setting.go +++ /dev/null @@ -1,796 +0,0 @@ -// Copyright 2014 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 setting - -import ( - "fmt" - "net/url" - "os" - "os/exec" - "path" - "path/filepath" - "runtime" - "strconv" - "strings" - "time" - - "github.com/Unknwon/com" - _ "github.com/go-macaron/cache/memcache" - _ "github.com/go-macaron/cache/redis" - "github.com/go-macaron/session" - _ "github.com/go-macaron/session/redis" - "gopkg.in/ini.v1" - - "github.com/gogits/go-libravatar" - - "github.com/gogits/gogs/modules/bindata" - "github.com/gogits/gogs/modules/log" - "github.com/gogits/gogs/modules/user" -) - -type Scheme string - -const ( - HTTP Scheme = "http" - HTTPS Scheme = "https" - FCGI Scheme = "fcgi" - UNIX_SOCKET Scheme = "unix" -) - -type LandingPage string - -const ( - LANDING_PAGE_HOME LandingPage = "/" - LANDING_PAGE_EXPLORE LandingPage = "/explore" -) - -var ( - // Build information should only be set by -ldflags. - BuildTime string - BuildGitHash string - - // App settings - AppVer string - AppName string - AppUrl string - AppSubUrl string - AppSubUrlDepth int // Number of slashes - AppPath string - AppDataPath string - - // Server settings - Protocol Scheme - Domain string - HTTPAddr, HTTPPort string - LocalURL string - OfflineMode bool - DisableRouterLog bool - CertFile, KeyFile string - StaticRootPath string - EnableGzip bool - LandingPageURL LandingPage - UnixSocketPermission uint32 - - SSH struct { - Disabled bool `ini:"DISABLE_SSH"` - StartBuiltinServer bool `ini:"START_SSH_SERVER"` - Domain string `ini:"SSH_DOMAIN"` - Port int `ini:"SSH_PORT"` - 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:"-"` - } - - // Security settings - InstallLock bool - SecretKey string - LogInRememberDays int - CookieUserName string - CookieRememberName string - ReverseProxyAuthUser string - - // Database settings - UseSQLite3 bool - UseMySQL bool - UsePostgreSQL bool - UseTiDB bool - - // Webhook settings - Webhook struct { - QueueLength int - DeliverTimeout int - SkipTLSVerify bool - Types []string - PagingNum int - } - - // Repository settings - Repository struct { - AnsiCharset string - ForcePrivate bool - MaxCreationLimit int - MirrorQueueLength int - PullRequestQueueLength int - PreferredLicenses []string - - // Repository editor settings - Editor struct { - LineWrapExtensions []string - PreviewableFileModes []string - } `ini:"-"` - - // Repository upload settings - Upload struct { - Enabled bool - TempPath string - AllowedTypes []string `delim:"|"` - FileMaxSize int64 - MaxFiles int - } `ini:"-"` - } - RepoRootPath string - ScriptType string - - // UI settings - UI struct { - ExplorePagingNum int - IssuePagingNum int - FeedMaxCommitNum int - ThemeColorMetaTag string - MaxDisplayFileSize int64 - - Admin struct { - UserPagingNum int - RepoPagingNum int - NoticePagingNum int - OrgPagingNum int - } `ini:"ui.admin"` - User struct { - RepoPagingNum int - } `ini:"ui.user"` - } - - // Markdown sttings - Markdown struct { - EnableHardLineBreak bool - CustomURLSchemes []string `ini:"CUSTOM_URL_SCHEMES"` - FileExtensions []string - } - - // Picture settings - AvatarUploadPath string - GravatarSource string - DisableGravatar bool - EnableFederatedAvatar bool - LibravatarService *libravatar.Libravatar - - // Log settings - LogRootPath string - LogModes []string - LogConfigs []string - - // Attachment settings - AttachmentPath string - AttachmentAllowedTypes string - AttachmentMaxSize int64 - AttachmentMaxFiles int - AttachmentEnabled bool - - // Time settings - TimeFormat string - - // Cache settings - CacheAdapter string - CacheInterval int - CacheConn string - - // Session settings - SessionConfig session.Options - CSRFCookieName = "_csrf" - - // Cron tasks - Cron struct { - UpdateMirror struct { - Enabled bool - RunAtStart bool - Schedule string - } `ini:"cron.update_mirrors"` - RepoHealthCheck struct { - Enabled bool - RunAtStart bool - Schedule string - Timeout time.Duration - Args []string `delim:" "` - } `ini:"cron.repo_health_check"` - CheckRepoStats struct { - Enabled bool - RunAtStart bool - Schedule string - } `ini:"cron.check_repo_stats"` - } - - // Git settings - Git struct { - DisableDiffHighlight bool - MaxGitDiffLines int - MaxGitDiffLineCharacters int - MaxGitDiffFiles int - GCArgs []string `delim:" "` - Timeout struct { - Migrate int - Mirror int - Clone int - Pull int - GC int `ini:"GC"` - } `ini:"git.timeout"` - } - - // Mirror settings - Mirror struct { - DefaultInterval int - } - - // API settings - API struct { - MaxResponseItems int - } - - // I18n settings - Langs, Names []string - dateLangs map[string]string - - // Highlight settings are loaded in modules/template/hightlight.go - - // Other settings - ShowFooterBranding bool - ShowFooterVersion bool - ShowFooterTemplateLoadTime bool - SupportMiniWinService bool - - // Global setting objects - Cfg *ini.File - CustomPath string // Custom directory path - CustomConf string - ProdMode bool - RunUser string - IsWindows bool - HasRobotsTxt bool -) - -// DateLang transforms standard language locale name to corresponding value in datetime plugin. -func DateLang(lang string) string { - name, ok := dateLangs[lang] - if ok { - return name - } - return "en" -} - -// execPath returns the executable path. -func execPath() (string, error) { - file, err := exec.LookPath(os.Args[0]) - if err != nil { - return "", err - } - return filepath.Abs(file) -} - -func init() { - IsWindows = runtime.GOOS == "windows" - log.NewLogger(0, "console", `{"level": 0}`) - - var err error - if AppPath, err = execPath(); err != nil { - log.Fatal(4, "fail to get app path: %v\n", err) - } - - // Note: we don't use path.Dir here because it does not handle case - // which path starts with two "/" in Windows: "//psf/Home/..." - AppPath = strings.Replace(AppPath, "\\", "/", -1) -} - -// WorkDir returns absolute path of work directory. -func WorkDir() (string, error) { - wd := os.Getenv("GOGS_WORK_DIR") - if len(wd) > 0 { - return wd, nil - } - - i := strings.LastIndex(AppPath, "/") - if i == -1 { - return AppPath, nil - } - return AppPath[:i], nil -} - -func forcePathSeparator(path string) { - if strings.Contains(path, "\\") { - log.Fatal(4, "Do not use '\\' or '\\\\' in paths, instead, please use '/' in all places") - } -} - -// IsRunUserMatchCurrentUser returns false if configured run user does not match -// actual user that runs the app. The first return value is the actual user name. -// This check is ignored under Windows since SSH remote login is not the main -// method to login on Windows. -func IsRunUserMatchCurrentUser(runUser string) (string, bool) { - if IsWindows { - return "", true - } - - currentUser := user.CurrentUsername() - return currentUser, runUser == currentUser -} - -// NewContext initializes configuration context. -// NOTE: do not print any log except error. -func NewContext() { - workDir, err := WorkDir() - if err != nil { - log.Fatal(4, "Fail to get work directory: %v", err) - } - - Cfg, err = ini.Load(bindata.MustAsset("conf/app.ini")) - if err != nil { - log.Fatal(4, "Fail to parse 'conf/app.ini': %v", err) - } - - CustomPath = os.Getenv("GOGS_CUSTOM") - if len(CustomPath) == 0 { - CustomPath = workDir + "/custom" - } - - if len(CustomConf) == 0 { - CustomConf = CustomPath + "/conf/app.ini" - } - - if com.IsFile(CustomConf) { - if err = Cfg.Append(CustomConf); err != nil { - log.Fatal(4, "Fail to load custom conf '%s': %v", CustomConf, err) - } - } else { - log.Warn("Custom config '%s' not found, ignore this if you're running first time", CustomConf) - } - Cfg.NameMapper = ini.AllCapsUnderscore - - homeDir, err := com.HomeDir() - if err != nil { - log.Fatal(4, "Fail to get home directory: %v", err) - } - homeDir = strings.Replace(homeDir, "\\", "/", -1) - - LogRootPath = Cfg.Section("log").Key("ROOT_PATH").MustString(path.Join(workDir, "log")) - forcePathSeparator(LogRootPath) - - sec := Cfg.Section("server") - AppName = Cfg.Section("").Key("APP_NAME").MustString("Gogs: Go Git Service") - AppUrl = sec.Key("ROOT_URL").MustString("http://localhost:3000/") - if AppUrl[len(AppUrl)-1] != '/' { - 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" { - Protocol = HTTPS - CertFile = sec.Key("CERT_FILE").String() - KeyFile = sec.Key("KEY_FILE").String() - } else if sec.Key("PROTOCOL").String() == "fcgi" { - Protocol = FCGI - } else if sec.Key("PROTOCOL").String() == "unix" { - Protocol = UNIX_SOCKET - UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666") - UnixSocketPermissionParsed, err := strconv.ParseUint(UnixSocketPermissionRaw, 8, 32) - if err != nil || UnixSocketPermissionParsed > 0777 { - log.Fatal(4, "Fail to parse unixSocketPermission: %s", UnixSocketPermissionRaw) - } - UnixSocketPermission = uint32(UnixSocketPermissionParsed) - } - 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 + "/") - OfflineMode = sec.Key("OFFLINE_MODE").MustBool() - DisableRouterLog = sec.Key("DISABLE_ROUTER_LOG").MustBool() - StaticRootPath = sec.Key("STATIC_ROOT_PATH").MustString(workDir) - AppDataPath = sec.Key("APP_DATA_PATH").MustString("data") - EnableGzip = sec.Key("ENABLE_GZIP").MustBool() - - switch sec.Key("LANDING_PAGE").MustString("home") { - case "explore": - LandingPageURL = LANDING_PAGE_EXPLORE - default: - LandingPageURL = LANDING_PAGE_HOME - } - - SSH.RootPath = path.Join(homeDir, ".ssh") - SSH.KeyTestPath = os.TempDir() - if err = Cfg.Section("server").MapTo(&SSH); err != nil { - log.Fatal(4, "Fail to map SSH settings: %v", err) - } - // When disable SSH, start builtin server value is ignored. - if SSH.Disabled { - SSH.StartBuiltinServer = false - } - - if !SSH.Disabled && !SSH.StartBuiltinServer { - if err := os.MkdirAll(SSH.RootPath, 0700); err != nil { - log.Fatal(4, "Fail to create '%s': %v", SSH.RootPath, err) - } else if err = os.MkdirAll(SSH.KeyTestPath, 0644); err != nil { - log.Fatal(4, "Fail to create '%s': %v", SSH.KeyTestPath, err) - } - } - - SSH.MinimumKeySizeCheck = sec.Key("MINIMUM_KEY_SIZE_CHECK").MustBool() - SSH.MinimumKeySizes = map[string]int{} - minimumKeySizes := Cfg.Section("ssh.minimum_key_sizes").Keys() - for _, key := range minimumKeySizes { - if key.MustInt() != -1 { - SSH.MinimumKeySizes[strings.ToLower(key.Name())] = key.MustInt() - } - } - - sec = Cfg.Section("security") - InstallLock = sec.Key("INSTALL_LOCK").MustBool() - SecretKey = sec.Key("SECRET_KEY").String() - LogInRememberDays = sec.Key("LOGIN_REMEMBER_DAYS").MustInt() - CookieUserName = sec.Key("COOKIE_USERNAME").String() - CookieRememberName = sec.Key("COOKIE_REMEMBER_NAME").String() - ReverseProxyAuthUser = sec.Key("REVERSE_PROXY_AUTHENTICATION_USER").MustString("X-WEBAUTH-USER") - - sec = Cfg.Section("attachment") - AttachmentPath = sec.Key("PATH").MustString(path.Join(AppDataPath, "attachments")) - if !filepath.IsAbs(AttachmentPath) { - AttachmentPath = path.Join(workDir, AttachmentPath) - } - AttachmentAllowedTypes = strings.Replace(sec.Key("ALLOWED_TYPES").MustString("image/jpeg,image/png"), "|", ",", -1) - AttachmentMaxSize = sec.Key("MAX_SIZE").MustInt64(4) - AttachmentMaxFiles = sec.Key("MAX_FILES").MustInt(5) - AttachmentEnabled = sec.Key("ENABLE").MustBool(true) - - TimeFormat = map[string]string{ - "ANSIC": time.ANSIC, - "UnixDate": time.UnixDate, - "RubyDate": time.RubyDate, - "RFC822": time.RFC822, - "RFC822Z": time.RFC822Z, - "RFC850": time.RFC850, - "RFC1123": time.RFC1123, - "RFC1123Z": time.RFC1123Z, - "RFC3339": time.RFC3339, - "RFC3339Nano": time.RFC3339Nano, - "Kitchen": time.Kitchen, - "Stamp": time.Stamp, - "StampMilli": time.StampMilli, - "StampMicro": time.StampMicro, - "StampNano": time.StampNano, - }[Cfg.Section("time").Key("FORMAT").MustString("RFC1123")] - - RunUser = Cfg.Section("").Key("RUN_USER").String() - // Does not check run user when the install lock is off. - if InstallLock { - currentUser, match := IsRunUserMatchCurrentUser(RunUser) - if !match { - log.Fatal(4, "Expect user '%s' but current user is: %s", RunUser, currentUser) - } - } - - // Determine and create root git repository path. - sec = Cfg.Section("repository") - RepoRootPath = sec.Key("ROOT").MustString(path.Join(homeDir, "gogs-repositories")) - forcePathSeparator(RepoRootPath) - if !filepath.IsAbs(RepoRootPath) { - RepoRootPath = path.Join(workDir, RepoRootPath) - } else { - RepoRootPath = path.Clean(RepoRootPath) - } - ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash") - if err = Cfg.Section("repository").MapTo(&Repository); err != nil { - log.Fatal(4, "Fail to map Repository settings: %v", err) - } else if err = Cfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil { - log.Fatal(4, "Fail to map Repository.Editor settings: %v", err) - } else if err = Cfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil { - log.Fatal(4, "Fail to map Repository.Upload settings: %v", err) - } - - if !filepath.IsAbs(Repository.Upload.TempPath) { - Repository.Upload.TempPath = path.Join(workDir, Repository.Upload.TempPath) - } - - sec = Cfg.Section("picture") - AvatarUploadPath = sec.Key("AVATAR_UPLOAD_PATH").MustString(path.Join(AppDataPath, "avatars")) - forcePathSeparator(AvatarUploadPath) - if !filepath.IsAbs(AvatarUploadPath) { - AvatarUploadPath = path.Join(workDir, AvatarUploadPath) - } - switch source := sec.Key("GRAVATAR_SOURCE").MustString("gravatar"); source { - case "duoshuo": - GravatarSource = "http://gravatar.duoshuo.com/avatar/" - case "gravatar": - GravatarSource = "https://secure.gravatar.com/avatar/" - default: - GravatarSource = source - } - DisableGravatar = sec.Key("DISABLE_GRAVATAR").MustBool() - EnableFederatedAvatar = sec.Key("ENABLE_FEDERATED_AVATAR").MustBool() - if OfflineMode { - DisableGravatar = true - EnableFederatedAvatar = false - } - if DisableGravatar { - EnableFederatedAvatar = false - } - - if EnableFederatedAvatar { - LibravatarService = libravatar.New() - parts := strings.Split(GravatarSource, "/") - if len(parts) >= 3 { - if parts[0] == "https:" { - LibravatarService.SetUseHTTPS(true) - LibravatarService.SetSecureFallbackHost(parts[2]) - } else { - LibravatarService.SetUseHTTPS(false) - LibravatarService.SetFallbackHost(parts[2]) - } - } - } - - if err = Cfg.Section("ui").MapTo(&UI); err != nil { - log.Fatal(4, "Fail to map UI settings: %v", err) - } else if err = Cfg.Section("markdown").MapTo(&Markdown); err != nil { - log.Fatal(4, "Fail to map Markdown settings: %v", err) - } else if err = Cfg.Section("cron").MapTo(&Cron); err != nil { - log.Fatal(4, "Fail to map Cron settings: %v", err) - } else if err = Cfg.Section("git").MapTo(&Git); err != nil { - log.Fatal(4, "Fail to map Git settings: %v", err) - } else if err = Cfg.Section("mirror").MapTo(&Mirror); err != nil { - log.Fatal(4, "Fail to map Mirror settings: %v", err) - } else if err = Cfg.Section("api").MapTo(&API); err != nil { - log.Fatal(4, "Fail to map API settings: %v", err) - } - - if Mirror.DefaultInterval <= 0 { - Mirror.DefaultInterval = 24 - } - - Langs = Cfg.Section("i18n").Key("LANGS").Strings(",") - Names = Cfg.Section("i18n").Key("NAMES").Strings(",") - dateLangs = Cfg.Section("i18n.datelang").KeysHash() - - ShowFooterBranding = Cfg.Section("other").Key("SHOW_FOOTER_BRANDING").MustBool() - ShowFooterVersion = Cfg.Section("other").Key("SHOW_FOOTER_VERSION").MustBool() - ShowFooterTemplateLoadTime = Cfg.Section("other").Key("SHOW_FOOTER_TEMPLATE_LOAD_TIME").MustBool() - - HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt")) -} - -var Service struct { - ActiveCodeLives int - ResetPwdCodeLives int - RegisterEmailConfirm bool - DisableRegistration bool - ShowRegistrationButton bool - RequireSignInView bool - EnableNotifyMail bool - EnableReverseProxyAuth bool - EnableReverseProxyAutoRegister bool - EnableCaptcha bool -} - -func newService() { - sec := Cfg.Section("service") - Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180) - Service.ResetPwdCodeLives = sec.Key("RESET_PASSWD_CODE_LIVE_MINUTES").MustInt(180) - Service.DisableRegistration = sec.Key("DISABLE_REGISTRATION").MustBool() - Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!Service.DisableRegistration) - Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool() - Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool() - Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool() - Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool() -} - -var logLevels = map[string]string{ - "Trace": "0", - "Debug": "1", - "Info": "2", - "Warn": "3", - "Error": "4", - "Critical": "5", -} - -func newLogService() { - log.Info("%s %s", AppName, AppVer) - - if len(BuildTime) > 0 { - log.Info("Build Time: %s", BuildTime) - log.Info("Build Git Hash: %s", BuildGitHash) - } - - // Get and check log mode. - LogModes = strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") - LogConfigs = make([]string, len(LogModes)) - for i, mode := range LogModes { - mode = strings.TrimSpace(mode) - sec, err := Cfg.GetSection("log." + mode) - if err != nil { - log.Fatal(4, "Unknown log mode: %s", mode) - } - - validLevels := []string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"} - // Log level. - levelName := Cfg.Section("log."+mode).Key("LEVEL").In( - Cfg.Section("log").Key("LEVEL").In("Trace", validLevels), - validLevels) - level, ok := logLevels[levelName] - if !ok { - log.Fatal(4, "Unknown log level: %s", levelName) - } - - // Generate log configuration. - switch mode { - case "console": - LogConfigs[i] = fmt.Sprintf(`{"level":%s}`, level) - case "file": - logPath := sec.Key("FILE_NAME").MustString(path.Join(LogRootPath, "gogs.log")) - if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil { - panic(err.Error()) - } - - LogConfigs[i] = fmt.Sprintf( - `{"level":%s,"filename":"%s","rotate":%v,"maxlines":%d,"maxsize":%d,"daily":%v,"maxdays":%d}`, level, - logPath, - sec.Key("LOG_ROTATE").MustBool(true), - sec.Key("MAX_LINES").MustInt(1000000), - 1< 0 { - return fmt.Sprintf("tab-size-%d", def.TabWidth) - } - } - return "tab-size-8" - }, - }} -} - -func Safe(raw string) template.HTML { - return template.HTML(raw) -} - -func Str2html(raw string) template.HTML { - return template.HTML(markdown.Sanitizer.Sanitize(raw)) -} - -func List(l *list.List) chan interface{} { - e := l.Front() - c := make(chan interface{}) - go func() { - for e != nil { - c <- e.Value - e = e.Next() - } - close(c) - }() - return c -} - -func Sha1(str string) string { - return base.EncodeSha1(str) -} - -func ToUTF8WithErr(content []byte) (error, string) { - charsetLabel, err := base.DetectEncoding(content) - if err != nil { - return err, "" - } else if charsetLabel == "UTF-8" { - return nil, string(content) - } - - encoding, _ := charset.Lookup(charsetLabel) - if encoding == nil { - return fmt.Errorf("Unknown encoding: %s", charsetLabel), string(content) - } - - // If there is an error, we concatenate the nicely decoded part and the - // original left over. This way we won't loose data. - result, n, err := transform.String(encoding.NewDecoder(), string(content)) - if err != nil { - result = result + string(content[n:]) - } - - return err, result -} - -func ToUTF8(content string) string { - _, res := ToUTF8WithErr([]byte(content)) - return res -} - -// Replaces all prefixes 'old' in 's' with 'new'. -func ReplaceLeft(s, old, new string) string { - old_len, new_len, i, n := len(old), len(new), 0, 0 - for ; i < len(s) && strings.HasPrefix(s[i:], old); n += 1 { - i += old_len - } - - // simple optimization - if n == 0 { - return s - } - - // allocating space for the new string - newLen := n*new_len + len(s[i:]) - replacement := make([]byte, newLen, newLen) - - j := 0 - for ; j < n*new_len; j += new_len { - copy(replacement[j:j+new_len], new) - } - - copy(replacement[j:], s[i:]) - return string(replacement) -} - -// RenderCommitMessage renders commit message with XSS-safe and special links. -func RenderCommitMessage(full bool, msg, urlPrefix string, metas map[string]string) template.HTML { - cleanMsg := template.HTMLEscapeString(msg) - fullMessage := string(markdown.RenderIssueIndexPattern([]byte(cleanMsg), urlPrefix, metas)) - msgLines := strings.Split(strings.TrimSpace(fullMessage), "\n") - numLines := len(msgLines) - if numLines == 0 { - return template.HTML("") - } else if !full { - return template.HTML(msgLines[0]) - } else if numLines == 1 || (numLines >= 2 && len(msgLines[1]) == 0) { - // First line is a header, standalone or followed by empty line - header := fmt.Sprintf("

    %s

    ", msgLines[0]) - if numLines >= 2 { - fullMessage = header + fmt.Sprintf("\n
    %s
    ", strings.Join(msgLines[2:], "\n")) - } else { - fullMessage = header - } - } else { - // Non-standard git message, there is no header line - fullMessage = fmt.Sprintf("

    %s

    ", strings.Join(msgLines, "
    ")) - } - return template.HTML(fullMessage) -} - -type Actioner interface { - GetOpType() int - GetActUserName() string - GetRepoUserName() string - GetRepoName() string - GetRepoPath() string - GetRepoLink() string - GetBranch() string - GetContent() string - GetCreate() time.Time - GetIssueInfos() []string -} - -// ActionIcon accepts a int that represents action operation type -// and returns a icon class name. -func ActionIcon(opType int) string { - switch opType { - case 1, 8: // Create and transfer repository - return "repo" - case 5, 9: // Commit repository - return "git-commit" - case 6: // Create issue - return "issue-opened" - case 7: // New pull request - return "git-pull-request" - case 10: // Comment issue - return "comment-discussion" - case 11: // Merge pull request - return "git-merge" - case 12, 14: // Close issue or pull request - return "issue-closed" - case 13, 15: // Reopen issue or pull request - return "issue-reopened" - default: - return "invalid type" - } -} - -func ActionContent2Commits(act Actioner) *models.PushCommits { - push := models.NewPushCommits() - if err := json.Unmarshal([]byte(act.GetContent()), push); err != nil { - log.Error(4, "json.Unmarshal:\n%s\nERROR: %v", act.GetContent(), err) - } - return push -} - -func DiffTypeToStr(diffType int) string { - diffTypes := map[int]string{ - 1: "add", 2: "modify", 3: "del", 4: "rename", - } - return diffTypes[diffType] -} - -func DiffLineTypeToStr(diffType int) string { - switch diffType { - case 2: - return "add" - case 3: - return "del" - case 4: - return "tag" - } - return "same" -} diff --git a/modules/user/user.go b/modules/user/user.go deleted file mode 100644 index 4415632ee93..00000000000 --- a/modules/user/user.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2014 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 user - -import ( - "os" -) - -func CurrentUsername() string { - curUserName := os.Getenv("USER") - if len(curUserName) > 0 { - return curUserName - } - - return os.Getenv("USERNAME") -} diff --git a/moon.yml b/moon.yml new file mode 100644 index 00000000000..2354b876cd1 --- /dev/null +++ b/moon.yml @@ -0,0 +1,146 @@ +$schema: "https://moonrepo.dev/schemas/project.json" + +language: "go" +stack: "backend" +id: "gogs" + +fileGroups: + sources: + - "cmd/**/*.go" + - "internal/**/*.go" + - "public/**/*.go" + - "templates/**/*.go" + - "conf/**/*.go" + tests: + - "**/*_test.go" + configs: + - "go.mod" + - "go.sum" + - ".golangci.yml" + assets: + - "conf/**/*" + - "public/**/*" + - "templates/**/*" + +tasks: + install: + script: | + go mod tidy + go generate ./... + inputs: + - "@group(sources)" + - "@group(configs)" + - "mockgen.go" + - "mockgen.yaml" + + format: + command: "golangci-lint fmt" + inputs: + - "@group(sources)" + - "@group(configs)" + deps: + - "install" + + lint: + command: "golangci-lint run" + inputs: + - "@group(sources)" + - "@group(configs)" + deps: + - "install" + - "format" + + test: + command: "go test -cover -race ./..." + inputs: + - "@group(sources)" + - "@group(tests)" + - "@group(configs)" + deps: + - "install" + + build: + script: | + go build -v -trimpath \ + -ldflags "-X 'gogs.io/gogs/internal/conf.BuildTime=$(date -u '+%Y-%m-%d %I:%M:%S %Z')' -X 'gogs.io/gogs/internal/conf.BuildCommit=$(git rev-parse HEAD)'" \ + -o .bin/gogs ./cmd/gogs + inputs: + - "@group(sources)" + - "@group(configs)" + - "@group(assets)" + outputs: + - ".bin/gogs" + deps: + - "install" + + build-prod: + script: | + go build -v -trimpath -tags prod \ + -ldflags "-X 'gogs.io/gogs/internal/conf.BuildTime=$(date -u '+%Y-%m-%d %I:%M:%S %Z')' -X 'gogs.io/gogs/internal/conf.BuildCommit=$(git rev-parse HEAD)'" \ + -o .bin/gogs ./cmd/gogs + inputs: + - "@group(sources)" + - "@group(configs)" + - "@group(assets)" + outputs: + - ".bin/gogs" + deps: + - "install" + - "web:build" + + portless: + script: | + portless alias gogs 3000 --force >/dev/null + portless proxy start >/dev/null 2>&1 || true + mkdir -p .bin/custom/conf + touch .bin/custom/conf/app.ini + awk ' + BEGIN { in_server=0; saw_server=0; set_domain=0; set_url=0 } + /^\[server\]/ { in_server=1; saw_server=1; print; next } + /^\[/ { + if (in_server) { + if (!set_domain) print "DOMAIN = gogs.localhost" + if (!set_url) print "EXTERNAL_URL = https://gogs.localhost/" + in_server=0 + } + print; next + } + in_server && /^[[:space:]]*DOMAIN[[:space:]]*=/ { + print "DOMAIN = gogs.localhost"; set_domain=1; next + } + in_server && /^[[:space:]]*EXTERNAL_URL[[:space:]]*=/ { + print "EXTERNAL_URL = https://gogs.localhost/"; set_url=1; next + } + { print } + END { + if (in_server) { + if (!set_domain) print "DOMAIN = gogs.localhost" + if (!set_url) print "EXTERNAL_URL = https://gogs.localhost/" + } else if (!saw_server) { + print "" + print "[server]" + print "DOMAIN = gogs.localhost" + print "EXTERNAL_URL = https://gogs.localhost/" + } + } + ' .bin/custom/conf/app.ini > .bin/custom/conf/app.ini.tmp \ + && mv .bin/custom/conf/app.ini.tmp .bin/custom/conf/app.ini + + dev: + command: ".bin/gogs web" + preset: "server" + env: + TTY_FORCE: "1" + deps: + - "build" + - "web:dev" + - "portless" + + prod: + command: ".bin/gogs web" + preset: "server" + env: + TTY_FORCE: "1" + deps: + - "build-prod" + - "portless" diff --git a/package.json b/package.json new file mode 100644 index 00000000000..958a6fa6b3a --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "name": "gogs", + "private": true, + "packageManager": "pnpm@11.1.3" +} diff --git a/packager/.godir b/packager/.godir deleted file mode 100644 index ba2906d0666..00000000000 --- a/packager/.godir +++ /dev/null @@ -1 +0,0 @@ -main diff --git a/packager/Procfile b/packager/Procfile deleted file mode 100644 index efa00d25a9d..00000000000 --- a/packager/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: ./gogs web diff --git a/packager/hooks/postinst b/packager/hooks/postinst deleted file mode 100755 index 561080effdb..00000000000 --- a/packager/hooks/postinst +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -set -e - -APP_NAME="gogs" -CLI="${APP_NAME}" -APP_USER=$(${CLI} config:get APP_USER) -APP_GROUP=$(${CLI} config:get APP_GROUP) -APP_CONFIG="/etc/${APP_NAME}/conf/app.ini" - -mkdir -p $(dirname ${APP_CONFIG}) -chown ${APP_USER}.${APP_GROUP} $(dirname ${APP_CONFIG}) -[ -f ${APP_CONFIG} ] || ${CLI} run cp conf/app.ini ${APP_CONFIG} -${CLI} config:set USER=${APP_USER} -sed -i "s|RUN_USER = git|RUN_USER = ${APP_USER}|" ${APP_CONFIG} -sed -i "s|RUN_MODE = dev|RUN_MODE = prod|" ${APP_CONFIG} - -${CLI} config:set GOGS_CUSTOM=/etc/${APP_NAME} - -# scale -${CLI} scale web=1 || true - -# restart the service -service gogs restart || true diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000000..a2dab2cd423 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4292 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} + + web: + dependencies: + '@fontsource-variable/geist': + specifier: ^5.2.9 + version: 5.2.9 + '@fontsource-variable/geist-mono': + specifier: ^5.2.8 + version: 5.2.8 + '@radix-ui/react-checkbox': + specifier: ^1.3.3 + version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-label': + specifier: ^2.1.8 + version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-popover': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-select': + specifier: ^2.2.6 + version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': + specifier: ^1.2.4 + version: 1.2.4(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-toggle-group': + specifier: ^1.1.11 + version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-router': + specifier: ^1.137.0 + version: 1.170.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + i18next: + specifier: ^26.2.0 + version: 26.2.0(typescript@6.0.3) + lucide-react: + specifier: ^1.16.0 + version: 1.16.0(react@19.2.6) + react: + specifier: ^19.2.6 + version: 19.2.6 + react-dom: + specifier: ^19.2.6 + version: 19.2.6(react@19.2.6) + react-i18next: + specifier: ^17.0.8 + version: 17.0.8(i18next@26.2.0(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) + tailwind-merge: + specifier: ^3.6.0 + version: 3.6.0 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + devDependencies: + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.4.0(jiti@2.7.0)) + '@tailwindcss/vite': + specifier: ^4.3.0 + version: 4.3.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)) + '@trivago/prettier-plugin-sort-imports': + specifier: ^6.0.2 + version: 6.0.2(prettier@3.8.3) + '@types/node': + specifier: ^25.8.0 + version: 25.9.0 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^6.0.2 + version: 6.0.2(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0)) + eslint: + specifier: ^10.3.0 + version: 10.4.0(jiti@2.7.0) + eslint-plugin-import: + specifier: ^2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0)) + eslint-plugin-react-hooks: + specifier: ^7.1.1 + version: 7.1.1(eslint@10.4.0(jiti@2.7.0)) + eslint-plugin-react-refresh: + specifier: ^0.5.2 + version: 0.5.2(eslint@10.4.0(jiti@2.7.0)) + prettier: + specifier: ^3.8.3 + version: 3.8.3 + tailwindcss: + specifier: ^4.3.0 + version: 4.3.0 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + typescript-eslint: + specifier: ^8.59.3 + version: 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + vite: + specifier: ^8.0.13 + version: 8.0.13(@types/node@25.9.0)(jiti@2.7.0) + +packages: + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@fontsource-variable/geist-mono@5.2.8': + resolution: {integrity: sha512-KI5bj+hkkRiHttYHmccotUZ80ZuZyai+RwI1d7UId0clkx/jXxlo8qYK8j54WzmpBjtMoEMPyllV7faDcj+6RA==} + + '@fontsource-variable/geist@5.2.9': + resolution: {integrity: sha512-TP+QSBG3wxKGPE33CbMy/L0Nu3qvJ6Fy81Yc4LnQ95xH+i+cfEp8fyU8/kfV14YwszxIFPhnoMTbjL71waVpyQ==} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.130.0': + resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.3.3': + resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.8': + resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.4': + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.6': + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-toggle-group@1.1.11': + resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.10': + resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rolldown/binding-android-arm64@1.0.1': + resolution: {integrity: sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.1': + resolution: {integrity: sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.1': + resolution: {integrity: sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.1': + resolution: {integrity: sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.1': + resolution: {integrity: sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.1': + resolution: {integrity: sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.1': + resolution: {integrity: sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.1': + resolution: {integrity: sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.1': + resolution: {integrity: sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.1': + resolution: {integrity: sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.1': + resolution: {integrity: sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.1': + resolution: {integrity: sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.1': + resolution: {integrity: sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.1': + resolution: {integrity: sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.1': + resolution: {integrity: sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@tanstack/history@1.162.0': + resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==} + engines: {node: '>=20.19'} + + '@tanstack/react-router@1.170.4': + resolution: {integrity: sha512-cusL4YCTuGGJhjfsXEBm6/SmOAs/G8wRVNadeyN3ofu4OZwX69KAybBEf217buxYzI+FohdJVoigEpJV+tGzIw==} + engines: {node: '>=20.19'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/router-core@1.171.2': + resolution: {integrity: sha512-sUd+BhGYkBF64LVhmOHnYsc1AutPNch/huohEXiXL4IUgmk17Gy+RkUazvjQhptVdYW5QT+qtATrUr2cQZNHFA==} + engines: {node: '>=20.19'} + + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + + '@trivago/prettier-plugin-sort-imports@6.0.2': + resolution: {integrity: sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA==} + engines: {node: '>= 20'} + peerDependencies: + '@vue/compiler-sfc': 3.x + prettier: 2.x - 3.x + prettier-plugin-ember-template-tag: '>= 2.0.0' + prettier-plugin-svelte: 3.x + svelte: 4.x || 5.x + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + prettier-plugin-ember-template-tag: + optional: true + prettier-plugin-svelte: + optional: true + svelte: + optional: true + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/node@25.9.0': + resolution: {integrity: sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@typescript-eslint/eslint-plugin@8.59.4': + resolution: {integrity: sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.59.4 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.59.4': + resolution: {integrity: sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.59.4': + resolution: {integrity: sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.59.4': + resolution: {integrity: sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.59.4': + resolution: {integrity: sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.59.4': + resolution: {integrity: sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.59.4': + resolution: {integrity: sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.59.4': + resolution: {integrity: sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.59.4': + resolution: {integrity: sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.59.4': + resolution: {integrity: sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@6.0.2': + resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.31: + resolution: {integrity: sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + + brace-expansion@2.1.0: + resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.358: + resolution: {integrity: sha512-EO7tKm3QxRqTs1lSuPXzl6yRAwznehp0AH9OoMOIC+4mQzTFday8FJCO5KU6J/TFSQXEOahNq4vTKpz1jmCVOA==} + + enhanced-resolve@5.21.4: + resolution: {integrity: sha512-wE4fDO8OjJhrPFH69HUQStq5oKvGRTNXEyW+k5C/pUQLASSsTu7obd2V3GvCDgPcY9AWjhJ4jz9Kh7iRvrxhJg==} + engines: {node: '>=10.13.0'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-import-resolver-node@0.3.10: + resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 + + eslint-plugin-react-refresh@0.5.2: + resolution: {integrity: sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==} + peerDependencies: + eslint: ^9 || ^10 + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.4.0: + resolution: {integrity: sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + + i18next@26.2.0: + resolution: {integrity: sha512-zwBHldHdTmwN7r6UNc7lC6GWNN+YYg3DrRSeHR5PRRBf5QnJZcYHrQc0uaU26qZeYxR7iFZD+Y315dPnKP47wA==} + peerDependencies: + typescript: ^5 || ^6 + peerDependenciesMeta: + typescript: + optional: true + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isbot@5.1.40: + resolution: {integrity: sha512-yNeeynhhtIVRBk12tBV4eHNxwB42HzR4Q3Ea7vCOiJhImGaAIdIMrbJtacQlBizGLjUPw+akkFI5Dn9T70XoVQ==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@1.16.0: + resolution: {integrity: sha512-dYwyPzb4MEKpGUmNYk3WKWPnMrHs3FKM+q94kAnJrcDIqqn1hq2xY8scaS2ovsOCM5D51ey2gaRG3PBb1vgoYQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + + node-releases@2.0.44: + resolution: {integrity: sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} + peerDependencies: + react: ^19.2.6 + + react-i18next@17.0.8: + resolution: {integrity: sha512-0ooKbGLU8JXhe1zwpQUWIeXSgLPOfwJmgheWRIUpcoA0CpyabpGhayjdG+/eA5esC1AQ8h2jWpXjJfzQzeDOCw==} + peerDependencies: + i18next: '>= 26.2.0' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + typescript: ^5 || ^6 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + typescript: + optional: true + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} + engines: {node: '>=0.10.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + engines: {node: '>= 0.4'} + hasBin: true + + rolldown@1.0.1: + resolution: {integrity: sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + engines: {node: '>=10'} + hasBin: true + + seroval-plugins@1.5.4: + resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.5.4: + resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} + engines: {node: '>=10'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.59.4: + resolution: {integrity: sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + vite@8.0.13: + resolution: {integrity: sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + +snapshots: + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.3': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.29.2': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.29.2': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.4.0(jiti@2.7.0))': + dependencies: + eslint: 10.4.0(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.4.0(jiti@2.7.0))': + optionalDependencies: + eslint: 10.4.0(jiti@2.7.0) + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.1': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + '@floating-ui/utils@0.2.11': {} + + '@fontsource-variable/geist-mono@5.2.8': {} + + '@fontsource-variable/geist@5.2.9': {} + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@oxc-project/types@0.130.0': {} + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.6) + aria-hidden: 1.2.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/rect': 1.1.1 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + aria-hidden: 1.2.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-slot@1.2.4(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.6) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.6)': + dependencies: + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.6) + react: 19.2.6 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/rect@1.1.1': {} + + '@rolldown/binding-android-arm64@1.0.1': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.1': + optional: true + + '@rolldown/binding-darwin-x64@1.0.1': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.1': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.1': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.1': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.1': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.1': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.1': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.1': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.1': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.1': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.1': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.1': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.1': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@rtsao/scc@1.1.0': {} + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.21.4 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/vite@4.3.0(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0) + + '@tanstack/history@1.162.0': {} + + '@tanstack/react-router@1.170.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/react-store': 0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.2 + isbot: 5.1.40 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + '@tanstack/react-store@0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@tanstack/store': 0.9.3 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + use-sync-external-store: 1.6.0(react@19.2.6) + + '@tanstack/router-core@1.171.2': + dependencies: + '@tanstack/history': 1.162.0 + cookie-es: 3.1.1 + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) + + '@tanstack/store@0.9.3': {} + + '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3)': + dependencies: + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.3 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + javascript-natural-sort: 0.7.1 + lodash-es: 4.18.1 + minimatch: 9.0.9 + parse-imports-exports: 0.2.4 + prettier: 3.8.3 + transitivePeerDependencies: + - supports-color + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/node@25.9.0': + dependencies: + undici-types: 7.24.6 + + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@typescript-eslint/eslint-plugin@8.59.4(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/type-utils': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.4 + eslint: 10.4.0(jiti@2.7.0) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.4 + debug: 4.4.3 + eslint: 10.4.0(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.59.4(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@6.0.3) + '@typescript-eslint/types': 8.59.4 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.59.4': + dependencies: + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/visitor-keys': 8.59.4 + + '@typescript-eslint/tsconfig-utils@8.59.4(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.4.0(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.59.4': {} + + '@typescript-eslint/typescript-estree@8.59.4(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.59.4(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@6.0.3) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/visitor-keys': 8.59.4 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.0 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) + eslint: 10.4.0(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.59.4': + dependencies: + '@typescript-eslint/types': 8.59.4 + eslint-visitor-keys: 5.0.1 + + '@vitejs/plugin-react@6.0.2(vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.0.13(@types/node@25.9.0)(jiti@2.7.0) + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.31: {} + + brace-expansion@1.1.14: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.0: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.31 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.358 + node-releases: 2.0.44 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caniuse-lite@1.0.30001793: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + clsx@2.1.1: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cookie-es@3.1.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.358: {} + + enhanced-resolve@5.21.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.3 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-import-resolver-node@0.3.10: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.2 + resolve: 2.0.0-next.7 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.4.0(jiti@2.7.0)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.0(jiti@2.7.0) + eslint-import-resolver-node: 0.3.10 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 10.4.0(jiti@2.7.0) + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.4.0(jiti@2.7.0)) + hasown: 2.0.3 + is-core-module: 2.16.2 + is-glob: 4.0.3 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-react-hooks@7.1.1(eslint@10.4.0(jiti@2.7.0)): + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.3 + eslint: 10.4.0(jiti@2.7.0) + hermes-parser: 0.25.1 + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-refresh@0.5.2(eslint@10.4.0(jiti@2.7.0)): + dependencies: + eslint: 10.4.0(jiti@2.7.0) + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.4.0(jiti@2.7.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.0(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.3 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-bigints@1.1.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + + i18next@26.2.0(typescript@6.0.3): + optionalDependencies: + typescript: 6.0.3 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + imurmurhash@0.1.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.3 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.3 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isbot@5.1.40: {} + + isexe@2.0.0: {} + + javascript-natural-sort@0.7.1: {} + + jiti@2.7.0: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.18.1: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@1.16.0(react@19.2.6): + dependencies: + react: 19.2.6 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.14 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.0 + + minimist@1.2.8: {} + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + natural-compare@1.4.0: {} + + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + + node-releases@2.0.44: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parse-imports-exports@0.2.4: + dependencies: + parse-statements: 1.0.11 + + parse-statements@1.0.11: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + possible-typed-array-names@1.1.0: {} + + postcss@8.5.14: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@3.8.3: {} + + punycode@2.3.1: {} + + react-dom@19.2.6(react@19.2.6): + dependencies: + react: 19.2.6 + scheduler: 0.27.0 + + react-i18next@17.0.8(i18next@26.2.0(typescript@6.0.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3): + dependencies: + '@babel/runtime': 7.29.2 + html-parse-stringify: 3.0.1 + i18next: 26.2.0(typescript@6.0.3) + react: 19.2.6 + use-sync-external-store: 1.6.0(react@19.2.6) + optionalDependencies: + react-dom: 19.2.6(react@19.2.6) + typescript: 6.0.3 + + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.6): + dependencies: + react: 19.2.6 + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.6) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.6): + dependencies: + react: 19.2.6 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.6) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.6) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.6) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + + react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.6): + dependencies: + get-nonce: 1.0.1 + react: 19.2.6 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react@19.2.6: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + resolve@2.0.0-next.7: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.0 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rolldown@1.0.1: + dependencies: + '@oxc-project/types': 0.130.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.1 + '@rolldown/binding-darwin-arm64': 1.0.1 + '@rolldown/binding-darwin-x64': 1.0.1 + '@rolldown/binding-freebsd-x64': 1.0.1 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.1 + '@rolldown/binding-linux-arm64-gnu': 1.0.1 + '@rolldown/binding-linux-arm64-musl': 1.0.1 + '@rolldown/binding-linux-ppc64-gnu': 1.0.1 + '@rolldown/binding-linux-s390x-gnu': 1.0.1 + '@rolldown/binding-linux-x64-gnu': 1.0.1 + '@rolldown/binding-linux-x64-musl': 1.0.1 + '@rolldown/binding-openharmony-arm64': 1.0.1 + '@rolldown/binding-wasm32-wasi': 1.0.1 + '@rolldown/binding-win32-arm64-msvc': 1.0.1 + '@rolldown/binding-win32-x64-msvc': 1.0.1 + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.8.0: {} + + seroval-plugins@1.5.4(seroval@1.5.4): + dependencies: + seroval: 1.5.4 + + seroval@1.5.4: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + source-map-js@1.2.1: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-bom@3.0.0: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@3.6.0: {} + + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + tw-animate-css@1.4.0: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.59.4(@typescript-eslint/parser@8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.4(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.0(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + typescript@6.0.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@7.24.6: {} + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.6): + dependencies: + react: 19.2.6 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.6): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.6 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + use-sync-external-store@1.6.0(react@19.2.6): + dependencies: + react: 19.2.6 + + vite@8.0.13(@types/node@25.9.0)(jiti@2.7.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.14 + rolldown: 1.0.1 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 25.9.0 + fsevents: 2.3.3 + jiti: 2.7.0 + + void-elements@3.1.0: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} + + zod-validation-error@4.0.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@4.4.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000000..aa2b002039b --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +packages: + - "web" + +onlyBuiltDependencies: + - esbuild diff --git a/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.svg b/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.svg index 8b66187fe06..6131ed169c5 100644 --- a/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.svg +++ b/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.svg @@ -1,685 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/librejs/librejs.html b/public/assets/librejs/librejs.html new file mode 100755 index 00000000000..be24c5eb803 --- /dev/null +++ b/public/assets/librejs/librejs.html @@ -0,0 +1,81 @@ + + + + + JavaScript license information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    jquery-3.4.1.min.jsExpatjquery-1.12.4.js
    jquery.are-you-sure.js + Expat +
    + GNU-GPL-2.0-or-later +
    jquery.are-you-sure.js
    semantic-2.4.2.min.jsExpatsemantic-UI-2.3.1.tar.gz
    gogs.jsExpatgogs.js
    clipboard-2.0.4.min.jsExpatclipboard-1.5.9.tar.gz
    emojify-1.1.0.min.jsExpatemojify-1.1.0.tar.gz
    dropzone.min.jsExpatdropzone.min.js
    highlight.pack.jsBSD 3 Clausehighlight.js-9.18.0.tar.gz
    jquery.datetimepicker.jsExpatjquery.datetimepicker.js
    jquery.minicolors.min.jsExpatjquery.minicolors-2.2.3.tar.gz
    simplemde.min.jsExpatsimplemde-markdown-editor-1.10.1.tar.gz
    marked.min.jsExpatmarked-0.3.6.tar.gz
    notebook.min.jsExpatnotebookjs-0.3.0.tar.gz
    + + + diff --git a/public/assets/octicons-4.3.0/octicons.svg b/public/assets/octicons-4.3.0/octicons.svg index 41cbd3f1fc9..697224d5cfe 100755 --- a/public/assets/octicons-4.3.0/octicons.svg +++ b/public/assets/octicons-4.3.0/octicons.svg @@ -1,429 +1 @@ - - - - -Created by FontForge 20150913 at Mon Jul 11 12:02:11 2016 - By Aaron Shekey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Created by FontForge 20150913 at Mon Jul 11 12:02:11 2016 By Aaron Shekey \ No newline at end of file diff --git a/public/config.codekit b/public/config.codekit deleted file mode 100644 index fa0fae58a79..00000000000 --- a/public/config.codekit +++ /dev/null @@ -1,1261 +0,0 @@ -{ -"CodeKitInfo": "This is a CodeKit 2.x project configuration file. It is designed to sync project settings across multiple machines. MODIFYING THE CONTENTS OF THIS FILE IS A POOR LIFE DECISION. If you do so, you will likely cause CodeKit to crash. This file is not useful unless accompanied by the project that created it in CodeKit 2. This file is not backwards-compatible with CodeKit 1.x. For more information, see: http:\/\/incident57.com\/codekit", -"creatorBuild": "19115", -"files": { - "\/css\/github.min.css": { - "fileType": 16, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/css\/github.min.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/css\/gogs.css": { - "fileType": 16, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/css\/gogs.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/css\/semantic-2.2.1.min.css": { - "fileType": 16, - "ignore": 0, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/css\/semantic-2.2.1.min.css", - "outputAbbreviatedPath": "No Output Path", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0 - }, - "\/css\/themes\/default\/assets\/images\/flags.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 28123, - "inputAbbreviatedPath": "\/css\/themes\/default\/assets\/images\/flags.png", - "outputAbbreviatedPath": "\/css\/themes\/default\/assets\/images\/flags.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/img\/404.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 9754, - "inputAbbreviatedPath": "\/img\/404.png", - "outputAbbreviatedPath": "\/img\/404.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 1 - }, - "\/img\/500.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 12066, - "inputAbbreviatedPath": "\/img\/500.png", - "outputAbbreviatedPath": "\/img\/500.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 1 - }, - "\/img\/avatar_default.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 4048, - "inputAbbreviatedPath": "\/img\/avatar_default.png", - "outputAbbreviatedPath": "\/img\/avatar_default.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 0 - }, - "\/img\/checkmark.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 169, - "inputAbbreviatedPath": "\/img\/checkmark.png", - "outputAbbreviatedPath": "\/img\/checkmark.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 1 - }, - "\/img\/favicon.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 10305, - "inputAbbreviatedPath": "\/img\/favicon.png", - "outputAbbreviatedPath": "\/img\/favicon.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 1 - }, - "\/img\/gogs-large-resize.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 78864, - "inputAbbreviatedPath": "\/img\/gogs-large-resize.png", - "outputAbbreviatedPath": "\/img\/gogs-large-resize.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 1 - }, - "\/img\/gogs-lg.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 97903, - "inputAbbreviatedPath": "\/img\/gogs-lg.png", - "outputAbbreviatedPath": "\/img\/gogs-lg.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 1 - }, - "\/img\/slack.png": { - "fileType": 32768, - "ignore": 0, - "ignoreWasSetByUser": 0, - "initialSize": 1633, - "inputAbbreviatedPath": "\/img\/slack.png", - "outputAbbreviatedPath": "\/img\/slack.png", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "processed": 1 - }, - "\/js\/gogs.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/js\/gogs.js", - "outputAbbreviatedPath": "\/js\/min\/gogs-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 0 - }, - "\/js\/jquery-1.11.3.min.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/js\/jquery-1.11.3.min.js", - "outputAbbreviatedPath": "\/js\/min\/jquery-1.11.3.min-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/js\/semantic-2.2.1.min.js": { - "fileType": 64, - "ignore": 1, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/js\/semantic-2.2.1.min.js", - "outputAbbreviatedPath": "\/js\/min\/semantic-2.2.1.min-min.js", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 1, - "syntaxCheckerStyle": 1 - }, - "\/less\/_admin.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_admin.less", - "outputAbbreviatedPath": "\/css\/_admin.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_base.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_base.less", - "outputAbbreviatedPath": "\/css\/_base.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_dashboard.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_dashboard.less", - "outputAbbreviatedPath": "\/css\/_dashboard.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_editor.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_editor.less", - "outputAbbreviatedPath": "\/css\/_editor.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_emojify.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_emojify.less", - "outputAbbreviatedPath": "\/css\/_emojify.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_explore.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_explore.less", - "outputAbbreviatedPath": "\/css\/_explore.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_form.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_form.less", - "outputAbbreviatedPath": "\/css\/_form.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_home.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_home.less", - "outputAbbreviatedPath": "\/css\/_home.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_install.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_install.less", - "outputAbbreviatedPath": "\/css\/_install.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_markdown.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_markdown.less", - "outputAbbreviatedPath": "\/css\/_markdown.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_organization.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_organization.less", - "outputAbbreviatedPath": "\/css\/_organization.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_repository.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_repository.less", - "outputAbbreviatedPath": "\/css\/_repository.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/_user.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 1, - "ignoreWasSetByUser": 0, - "inputAbbreviatedPath": "\/less\/_user.less", - "outputAbbreviatedPath": "\/css\/_user.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 0, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - }, - "\/less\/gogs.less": { - "allowInsecureImports": 0, - "createSourceMap": 0, - "disableJavascript": 0, - "fileType": 1, - "ieCompatibility": 1, - "ignore": 0, - "ignoreWasSetByUser": 1, - "inputAbbreviatedPath": "\/less\/gogs.less", - "outputAbbreviatedPath": "\/css\/gogs.css", - "outputPathIsOutsideProject": 0, - "outputPathIsSetByUser": 1, - "outputStyle": 0, - "relativeURLS": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "strictImports": 0, - "strictMath": 0, - "strictUnits": 0 - } - }, -"hooks": [ - ], -"lastSavedByUser": "Jiahua Chen", -"manualImportLinks": { - }, -"projectAttributes": { - "bowerAbbreviatedPath": "", - "displayValue": "Gogs", - "displayValueWasSetByUser": 1, - "iconImageName": "brackets_brown" - }, -"projectSettings": { - "alwaysUseExternalServer": 0, - "animateCSSInjections": 1, - "autoApplyPSLanguageSettingsStyle": 0, - "autoprefixerBrowserString": "> 1%, last 2 versions, Firefox ESR, Opera 12.1", - "autoSyncProjectSettingsFile": 1, - "browserRefreshDelay": 0, - "coffeeAutoOutputPathEnabled": 1, - "coffeeAutoOutputPathFilenamePattern": "*.js", - "coffeeAutoOutputPathRelativePath": "", - "coffeeAutoOutputPathReplace1": "", - "coffeeAutoOutputPathReplace2": "", - "coffeeAutoOutputPathStyle": 0, - "coffeeCreateSourceMap": 0, - "coffeeLintFlags2": { - "arrow_spacing": { - "active": 0, - "flagValue": -1 - }, - "camel_case_classes": { - "active": 1, - "flagValue": -1 - }, - "colon_assignment_spacing": { - "active": 0, - "flagValue": 1 - }, - "cyclomatic_complexity": { - "active": 0, - "flagValue": 10 - }, - "duplicate_key": { - "active": 1, - "flagValue": -1 - }, - "empty_constructor_needs_parens": { - "active": 0, - "flagValue": -1 - }, - "ensure_comprehensions": { - "active": 1, - "flagValue": -1 - }, - "indentation": { - "active": 1, - "flagValue": 2 - }, - "line_endings": { - "active": 0, - "flagValue": 0 - }, - "max_line_length": { - "active": 0, - "flagValue": 150 - }, - "missing_fat_arrows": { - "active": 0, - "flagValue": -1 - }, - "newlines_after_classes": { - "active": 0, - "flagValue": 3 - }, - "no_backticks": { - "active": 1, - "flagValue": -1 - }, - "no_debugger": { - "active": 1, - "flagValue": -1 - }, - "no_empty_functions": { - "active": 0, - "flagValue": -1 - }, - "no_empty_param_list": { - "active": 0, - "flagValue": -1 - }, - "no_implicit_braces": { - "active": 1, - "flagValue": -1 - }, - "no_implicit_parens": { - "active": 0, - "flagValue": -1 - }, - "no_interpolation_in_single_quotes": { - "active": 0, - "flagValue": -1 - }, - "no_nested_string_interpolation": { - "active": 1, - "flagValue": -1 - }, - "no_plusplus": { - "active": 0, - "flagValue": -1 - }, - "no_private_function_fat_arrows": { - "active": 1, - "flagValue": -1 - }, - "no_stand_alone_at": { - "active": 1, - "flagValue": -1 - }, - "no_tabs": { - "active": 1, - "flagValue": -1 - }, - "no_this": { - "active": 0, - "flagValue": -1 - }, - "no_throwing_strings": { - "active": 1, - "flagValue": -1 - }, - "no_trailing_semicolons": { - "active": 1, - "flagValue": -1 - }, - "no_trailing_whitespace": { - "active": 1, - "flagValue": -1 - }, - "no_unnecessary_double_quotes": { - "active": 0, - "flagValue": -1 - }, - "no_unnecessary_fat_arrows": { - "active": 1, - "flagValue": -1 - }, - "non_empty_constructor_needs_parens": { - "active": 0, - "flagValue": -1 - }, - "prefer_english_operator": { - "active": 0, - "flagValue": -1 - }, - "space_operators": { - "active": 0, - "flagValue": -1 - }, - "spacing_after_comma": { - "active": 1, - "flagValue": -1 - } - }, - "coffeeMinifyOutput": 1, - "coffeeOutputStyle": 0, - "coffeeSyntaxCheckerStyle": 1, - "externalServerAddress": "http:\/\/localhost:8888", - "externalServerPreviewPathAddition": "", - "genericWebpageFileExtensionsString": "html, htm, shtml, shtm, xhtml, php, jsp, asp, aspx, erb, ctp", - "hamlAutoOutputPathEnabled": 1, - "hamlAutoOutputPathFilenamePattern": "*.html", - "hamlAutoOutputPathRelativePath": "", - "hamlAutoOutputPathReplace1": "", - "hamlAutoOutputPathReplace2": "", - "hamlAutoOutputPathStyle": 0, - "hamlEscapeHTMLCharacters": 0, - "hamlNoEscapeInAttributes": 0, - "hamlOutputFormat": 2, - "hamlOutputStyle": 0, - "hamlUseCDATA": 0, - "hamlUseDoubleQuotes": 0, - "hamlUseUnixNewlines": 0, - "jadeAutoOutputPathEnabled": 1, - "jadeAutoOutputPathFilenamePattern": "*.html", - "jadeAutoOutputPathRelativePath": "", - "jadeAutoOutputPathReplace1": "", - "jadeAutoOutputPathReplace2": "", - "jadeAutoOutputPathStyle": 0, - "jadeCompileDebug": 1, - "jadeOutputStyle": 0, - "javascriptAutoOutputPathEnabled": 1, - "javascriptAutoOutputPathFilenamePattern": "*-min.js", - "javascriptAutoOutputPathRelativePath": "\/min", - "javascriptAutoOutputPathReplace1": "", - "javascriptAutoOutputPathReplace2": "", - "javascriptAutoOutputPathStyle": 2, - "javascriptCreateSourceMap": 1, - "javascriptOutputStyle": 1, - "javascriptSyntaxCheckerStyle": 1, - "jsCheckerReservedNamesString": "", - "jsHintFlags2": { - "asi": { - "active": 0, - "flagValue": -1 - }, - "bitwise": { - "active": 1, - "flagValue": -1 - }, - "boss": { - "active": 0, - "flagValue": -1 - }, - "browser": { - "active": 1, - "flagValue": -1 - }, - "browserify": { - "active": 0, - "flagValue": -1 - }, - "camelcase": { - "active": 0, - "flagValue": -1 - }, - "couch": { - "active": 0, - "flagValue": -1 - }, - "curly": { - "active": 1, - "flagValue": -1 - }, - "debug": { - "active": 0, - "flagValue": -1 - }, - "devel": { - "active": 0, - "flagValue": -1 - }, - "dojo": { - "active": 0, - "flagValue": -1 - }, - "elision": { - "active": 1, - "flagValue": -1 - }, - "eqeqeq": { - "active": 1, - "flagValue": -1 - }, - "eqnull": { - "active": 0, - "flagValue": -1 - }, - "es3": { - "active": 0, - "flagValue": -1 - }, - "esnext": { - "active": 0, - "flagValue": -1 - }, - "evil": { - "active": 0, - "flagValue": -1 - }, - "expr": { - "active": 0, - "flagValue": -1 - }, - "forin": { - "active": 0, - "flagValue": -1 - }, - "freeze": { - "active": 1, - "flagValue": -1 - }, - "funcscope": { - "active": 0, - "flagValue": -1 - }, - "futurehostile": { - "active": 0, - "flagValue": -1 - }, - "globalstrict": { - "active": 0, - "flagValue": -1 - }, - "immed": { - "active": 0, - "flagValue": -1 - }, - "indent": { - "active": 0, - "flagValue": 4 - }, - "iterator": { - "active": 0, - "flagValue": -1 - }, - "jasmine": { - "active": 0, - "flagValue": -1 - }, - "jquery": { - "active": 1, - "flagValue": -1 - }, - "lastsemic": { - "active": 0, - "flagValue": -1 - }, - "latedef": { - "active": 1, - "flagValue": -1 - }, - "laxbreak": { - "active": 0, - "flagValue": -1 - }, - "laxcomma": { - "active": 0, - "flagValue": -1 - }, - "loopfunc": { - "active": 0, - "flagValue": -1 - }, - "maxcomplexity": { - "active": 0, - "flagValue": 10 - }, - "maxdepth": { - "active": 0, - "flagValue": 3 - }, - "maxlen": { - "active": 0, - "flagValue": 150 - }, - "maxparams": { - "active": 0, - "flagValue": 3 - }, - "maxstatements": { - "active": 0, - "flagValue": 4 - }, - "mocha": { - "active": 0, - "flagValue": -1 - }, - "mootools": { - "active": 0, - "flagValue": -1 - }, - "moz": { - "active": 0, - "flagValue": -1 - }, - "multistr": { - "active": 0, - "flagValue": -1 - }, - "newcap": { - "active": 1, - "flagValue": -1 - }, - "noarg": { - "active": 1, - "flagValue": -1 - }, - "nocomma": { - "active": 0, - "flagValue": -1 - }, - "node": { - "active": 0, - "flagValue": -1 - }, - "noempty": { - "active": 0, - "flagValue": -1 - }, - "nonbsp": { - "active": 0, - "flagValue": -1 - }, - "nonew": { - "active": 1, - "flagValue": -1 - }, - "nonstandard": { - "active": 0, - "flagValue": -1 - }, - "notypeof": { - "active": 1, - "flagValue": -1 - }, - "noyield": { - "active": 0, - "flagValue": -1 - }, - "onecase": { - "active": 0, - "flagValue": -1 - }, - "phantom": { - "active": 0, - "flagValue": -1 - }, - "plusplus": { - "active": 0, - "flagValue": -1 - }, - "proto": { - "active": 0, - "flagValue": -1 - }, - "prototypejs": { - "active": 0, - "flagValue": -1 - }, - "qunit": { - "active": 0, - "flagValue": -1 - }, - "regexp": { - "active": 1, - "flagValue": -1 - }, - "rhino": { - "active": 0, - "flagValue": -1 - }, - "scripturl": { - "active": 0, - "flagValue": -1 - }, - "shadow": { - "active": 0, - "flagValue": -1 - }, - "shelljs": { - "active": 0, - "flagValue": -1 - }, - "singleGroups": { - "active": 0, - "flagValue": -1 - }, - "strict": { - "active": 0, - "flagValue": -1 - }, - "sub": { - "active": 0, - "flagValue": -1 - }, - "supernew": { - "active": 0, - "flagValue": -1 - }, - "typed": { - "active": 0, - "flagValue": -1 - }, - "undef": { - "active": 1, - "flagValue": -1 - }, - "unused": { - "active": 1, - "flagValue": -1 - }, - "varstmt": { - "active": 0, - "flagValue": -1 - }, - "withstmt": { - "active": 0, - "flagValue": -1 - }, - "worker": { - "active": 0, - "flagValue": -1 - }, - "wsh": { - "active": 0, - "flagValue": -1 - }, - "yui": { - "active": 0, - "flagValue": -1 - } - }, - "jsLintFlags2": { - "bitwise": { - "active": 0, - "flagValue": -1 - }, - "browser": { - "active": 1, - "flagValue": -1 - }, - "couch": { - "active": 0, - "flagValue": -1 - }, - "devel": { - "active": 0, - "flagValue": -1 - }, - "es6": { - "active": 0, - "flagValue": -1 - }, - "eval": { - "active": 0, - "flagValue": -1 - }, - "for": { - "active": 0, - "flagValue": -1 - }, - "maxlen": { - "active": 0, - "flagValue": 150 - }, - "node": { - "active": 0, - "flagValue": -1 - }, - "this": { - "active": 0, - "flagValue": -1 - }, - "white": { - "active": 0, - "flagValue": -1 - } - }, - "jsonAutoOutputPathEnabled": 0, - "jsonAutoOutputPathFilenamePattern": "*-min.json", - "jsonAutoOutputPathRelativePath": "", - "jsonAutoOutputPathReplace1": "", - "jsonAutoOutputPathReplace2": "", - "jsonAutoOutputPathStyle": 0, - "jsonOrderOutput": 0, - "jsonOutputStyle": 1, - "kitAutoOutputPathEnabled": 1, - "kitAutoOutputPathFilenamePattern": "*.html", - "kitAutoOutputPathRelativePath": "", - "kitAutoOutputPathReplace1": "", - "kitAutoOutputPathReplace2": "", - "kitAutoOutputPathStyle": 0, - "lessAllowInsecureImports": 0, - "lessAutoOutputPathEnabled": 1, - "lessAutoOutputPathFilenamePattern": "*.css", - "lessAutoOutputPathRelativePath": "..\/css", - "lessAutoOutputPathReplace1": "less", - "lessAutoOutputPathReplace2": "css", - "lessAutoOutputPathStyle": 2, - "lessCreateSourceMap": 0, - "lessDisableJavascript": 0, - "lessIeCompatibility": 1, - "lessOutputStyle": 0, - "lessRelativeURLS": 0, - "lessStrictImports": 0, - "lessStrictMath": 0, - "lessStrictUnits": 0, - "markdownAutoOutputPathEnabled": 1, - "markdownAutoOutputPathFilenamePattern": "*.html", - "markdownAutoOutputPathRelativePath": "", - "markdownAutoOutputPathReplace1": "", - "markdownAutoOutputPathReplace2": "", - "markdownAutoOutputPathStyle": 0, - "markdownCriticStyle": 0, - "markdownEnableFootnotes": 0, - "markdownEnableLabels": 1, - "markdownEnableSmartQuotes": 1, - "markdownEscapeLineBreaks": 0, - "markdownMaskEmailAddresses": 1, - "markdownOutputFormat": 0, - "markdownOutputStyle": 0, - "markdownParseMetadata": 1, - "markdownProcessHTML": 0, - "markdownRandomFootnoteNumbers": 0, - "markdownUseCompatibilityMode": 0, - "reloadFileURLs": 0, - "sassAutoOutputPathEnabled": 1, - "sassAutoOutputPathFilenamePattern": "*.css", - "sassAutoOutputPathRelativePath": "..\/css", - "sassAutoOutputPathReplace1": "sass", - "sassAutoOutputPathReplace2": "css", - "sassAutoOutputPathStyle": 2, - "sassCreateSourceMap": 0, - "sassDebugStyle": 0, - "sassDecimalPrecision": 10, - "sassOutputStyle": 0, - "sassUseLibsass": 0, - "shouldRunAutoprefixer": 0, - "shouldRunBless": 0, - "skippedItemsString": "node_modules, _logs, .hg, \/plugins, _cache, log, logs, cache, \/assets, \/js\/libs, .git, .svn, \/img\/emoji", - "slimAutoOutputPathEnabled": 1, - "slimAutoOutputPathFilenamePattern": "*.html", - "slimAutoOutputPathRelativePath": "", - "slimAutoOutputPathReplace1": "", - "slimAutoOutputPathReplace2": "", - "slimAutoOutputPathStyle": 0, - "slimCompileOnly": 0, - "slimLogicless": 0, - "slimOutputFormat": 0, - "slimOutputStyle": 1, - "slimRailsCompatible": 0, - "stylusAutoOutputPathEnabled": 1, - "stylusAutoOutputPathFilenamePattern": "*.css", - "stylusAutoOutputPathRelativePath": "..\/css", - "stylusAutoOutputPathReplace1": "stylus", - "stylusAutoOutputPathReplace2": "css", - "stylusAutoOutputPathStyle": 2, - "stylusCreateSourceMap": 0, - "stylusDebugStyle": 0, - "stylusImportCSS": 0, - "stylusOutputStyle": 0, - "stylusResolveRelativeURLS": 0, - "typescriptAutoOutputPathEnabled": 1, - "typescriptAutoOutputPathFilenamePattern": "*.js", - "typescriptAutoOutputPathRelativePath": "\/js", - "typescriptAutoOutputPathReplace1": "", - "typescriptAutoOutputPathReplace2": "", - "typescriptAutoOutputPathStyle": 2, - "typescriptCreateDeclarationFile": 0, - "typescriptCreateSourceMap": 0, - "typescriptJSXMode": 0, - "typescriptMinifyOutput": 0, - "typescriptModuleResolutionType": 0, - "typescriptModuleType": 0, - "typescriptNoImplicitAny": 0, - "typescriptPreserveConstEnums": 0, - "typescriptRemoveComments": 0, - "typescriptSuppressImplicitAnyIndexErrors": 0, - "typescriptTargetECMAVersion": 0, - "uglifyDefinesString": "", - "uglifyFlags2": { - "ascii-only": { - "active": 0, - "flagValue": -1 - }, - "bare-returns": { - "active": 0, - "flagValue": -1 - }, - "booleans": { - "active": 1, - "flagValue": -1 - }, - "bracketize": { - "active": 0, - "flagValue": -1 - }, - "cascade": { - "active": 1, - "flagValue": -1 - }, - "comments": { - "active": 1, - "flagValue": -1 - }, - "comparisons": { - "active": 1, - "flagValue": -1 - }, - "compress": { - "active": 1, - "flagValue": -1 - }, - "conditionals": { - "active": 1, - "flagValue": -1 - }, - "dead_code": { - "active": 0, - "flagValue": -1 - }, - "drop_console": { - "active": 0, - "flagValue": -1 - }, - "drop_debugger": { - "active": 1, - "flagValue": -1 - }, - "eval": { - "active": 0, - "flagValue": -1 - }, - "evaluate": { - "active": 1, - "flagValue": -1 - }, - "hoist_funs": { - "active": 1, - "flagValue": -1 - }, - "hoist_vars": { - "active": 0, - "flagValue": -1 - }, - "if_return": { - "active": 1, - "flagValue": -1 - }, - "indent-level": { - "active": 0, - "flagValue": 4 - }, - "indent-start": { - "active": 0, - "flagValue": 0 - }, - "inline-script": { - "active": 0, - "flagValue": -1 - }, - "join_vars": { - "active": 1, - "flagValue": -1 - }, - "keep_fargs": { - "active": 0, - "flagValue": -1 - }, - "keep_fnames": { - "active": 0, - "flagValue": -1 - }, - "loops": { - "active": 1, - "flagValue": -1 - }, - "mangle": { - "active": 1, - "flagValue": -1 - }, - "max-line-len": { - "active": 1, - "flagValue": 32000 - }, - "negate_iife": { - "active": 1, - "flagValue": -1 - }, - "properties": { - "active": 1, - "flagValue": -1 - }, - "pure_getters": { - "active": 0, - "flagValue": -1 - }, - "quote-keys": { - "active": 0, - "flagValue": -1 - }, - "screw-ie8": { - "active": 0, - "flagValue": -1 - }, - "semicolons": { - "active": 1, - "flagValue": -1 - }, - "sequences": { - "active": 1, - "flagValue": -1 - }, - "sort": { - "active": 0, - "flagValue": -1 - }, - "space-colon": { - "active": 1, - "flagValue": -1 - }, - "toplevel": { - "active": 0, - "flagValue": -1 - }, - "unsafe": { - "active": 0, - "flagValue": -1 - }, - "unused": { - "active": 0, - "flagValue": -1 - }, - "warnings": { - "active": 0, - "flagValue": -1 - }, - "width": { - "active": 1, - "flagValue": 80 - } - }, - "uglifyReservedNamesString": "$", - "websiteRelativeRoot": "" - }, -"settingsFileVersion": "2" -} \ 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 7b3600c93bf..00000000000 --- 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/gogs.css b/public/css/gogs.css deleted file mode 100644 index 3832c30f83c..00000000000 --- a/public/css/gogs.css +++ /dev/null @@ -1,2931 +0,0 @@ -.emoji { - width: 1.5em; - height: 1.5em; - display: inline-block; - background-size: contain; -} -body { - font-family: "Helvetica Neue", "Microsoft YaHei", Arial, Helvetica, sans-serif !important; - background-color: #fff; - overflow-y: scroll; -} -img { - border-radius: 3px; -} -pre, -code { - font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace; -} -pre.raw, -code.raw { - padding: 7px 12px; - margin: 10px 0; - background-color: #f8f8f8; - border: 1px solid #ddd; - border-radius: 3px; - font-size: 13px; - line-height: 1.5; - overflow: auto; -} -pre.wrap, -code.wrap { - white-space: pre-wrap; - /* CSS 3 */ - word-break: break-word; -} -.dont-break-out { - /* 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; -} -.full.height { - padding: 0; - margin: 0 0 -80px 0; - min-height: 100%; -} -.following.bar { - z-index: 900; - left: 0; - width: 100%; -} -.following.bar.light { - background-color: white; - border-bottom: 1px solid #DDDDDD; - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.04); -} -.following.bar .column .menu { - margin-top: 0; -} -.following.bar .top.menu a.item.brand { - padding-left: 0; -} -.following.bar .brand .ui.mini.image { - width: 30px; -} -.following.bar .top.menu a.item:hover, -.following.bar .top.menu .dropdown.item:hover, -.following.bar .top.menu .dropdown.item.active { - background-color: transparent; -} -.following.bar .top.menu a.item:hover { - color: rgba(0, 0, 0, 0.45); -} -.following.bar .top.menu .menu { - z-index: 900; -} -.following.bar .icon, -.following.bar .octicon { - margin-right: 5px !important; -} -.following.bar .head.link.item { - padding-right: 0 !important; -} -.following.bar .avatar > .ui.image { - margin-right: 0; -} -.following.bar .avatar .octicon-triangle-down { - margin-top: 6.5px; -} -.following.bar .searchbox { - background-color: #f4f4f4 !important; -} -.following.bar .searchbox:focus { - background-color: #e9e9e9 !important; -} -.following.bar .text .octicon { - width: 16px; - text-align: center; -} -.following.bar .right.menu .menu { - left: auto; - right: 0; -} -.following.bar .right.menu .dropdown .menu { - margin-top: 0; -} -.ui.left { - float: left; -} -.ui.right { - float: right; -} -.ui.container.fluid.padded { - padding: 0 10px 0 10px; -} -.ui.form .ui.button { - font-weight: normal; -} -.ui .text.red { - color: #d95c5c !important; -} -.ui .text.red a { - color: #d95c5c !important; -} -.ui .text.red a:hover { - color: #E67777 !important; -} -.ui .text.blue { - color: #428bca !important; -} -.ui .text.blue a { - color: #15c !important; -} -.ui .text.blue a:hover { - color: #428bca !important; -} -.ui .text.black { - color: #444; -} -.ui .text.black:hover { - color: #000; -} -.ui .text.grey { - color: #767676 !important; -} -.ui .text.grey a { - color: #444 !important; -} -.ui .text.grey a:hover { - color: #000 !important; -} -.ui .text.light.grey { - color: #888 !important; -} -.ui .text.green { - color: #6cc644 !important; -} -.ui .text.purple { - color: #6e5494 !important; -} -.ui .text.yellow { - color: #FBBD08 !important; -} -.ui .text.gold { - color: #a1882b !important; -} -.ui .text.left { - text-align: left !important; -} -.ui .text.right { - text-align: right !important; -} -.ui .text.small { - font-size: 0.75em; -} -.ui .text.normal { - font-weight: normal; -} -.ui .text.bold { - font-weight: bold; -} -.ui .text.italic { - font-style: italic; -} -.ui .text.truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - display: inline-block; -} -.ui .text.thin { - font-weight: normal; -} -.ui .text.middle { - vertical-align: middle; -} -.ui .message { - text-align: center; -} -.ui .header > i + .content { - padding-left: 0.75rem; - vertical-align: middle; -} -.ui .warning.header { - background-color: #F9EDBE !important; - border-color: #F0C36D; -} -.ui .warning.segment { - border-color: #F0C36D; -} -.ui .info.segment { - border: 1px solid #c5d5dd; -} -.ui .info.segment.top { - background-color: #e6f1f6 !important; -} -.ui .info.segment.top h3, -.ui .info.segment.top h4 { - margin-top: 0; -} -.ui .info.segment.top h3:last-child { - margin-top: 4px; -} -.ui .info.segment.top > :last-child { - margin-bottom: 0; -} -.ui .normal.header { - font-weight: normal; -} -.ui .avatar.image { - border-radius: 3px; -} -.ui .form .fake { - display: none !important; -} -.ui .form .sub.field { - margin-left: 25px; -} -.ui .sha.label { - font-family: Consolas, Menlo, Monaco, "Lucida Console", monospace; - font-size: 13px; - padding: 6px 10px 4px 10px; - font-weight: normal; - margin: 0 6px; -} -.ui.status.buttons .octicon { - margin-right: 4px; -} -.ui.inline.delete-button { - padding: 8px 15px; - font-weight: normal; -} -.overflow.menu .items { - max-height: 300px; - overflow-y: auto; -} -.overflow.menu .items .item { - position: relative; - cursor: pointer; - display: block; - border: none; - height: auto; - border-top: none; - line-height: 1em; - color: rgba(0, 0, 0, 0.8); - padding: .71428571em 1.14285714em !important; - font-size: 1rem; - text-transform: none; - font-weight: 400; - box-shadow: none; - -webkit-touch-callout: none; -} -.overflow.menu .items .item.active { - font-weight: 700; -} -.overflow.menu .items .item:hover { - background: rgba(0, 0, 0, 0.05); - color: rgba(0, 0, 0, 0.8); - z-index: 13; -} -.scrolling.menu .item.selected { - font-weight: 700 !important; -} -footer { - margin-top: 54px !important; - height: 40px; - background-color: white; - border-top: 1px solid #d6d6d6; - clear: both; - width: 100%; - color: #888888; -} -footer .container { - padding-top: 10px; -} -footer .container .fa { - width: 16px; - text-align: center; - color: #428bca; -} -footer .container .links > * { - border-left: 1px solid #d6d6d6; - padding-left: 8px; - margin-left: 5px; -} -footer .container .links > *:first-child { - border-left: none; -} -footer .ui.language .menu { - max-height: 500px; - overflow-y: auto; - margin-bottom: 7px; -} -.hide { - display: none; -} -.center { - text-align: center; -} -.img-1 { - width: 2px !important; - height: 2px !important; -} -.img-2 { - width: 4px !important; - height: 4px !important; -} -.img-3 { - width: 6px !important; - height: 6px !important; -} -.img-4 { - width: 8px !important; - height: 8px !important; -} -.img-5 { - width: 10px !important; - height: 10px !important; -} -.img-6 { - width: 12px !important; - height: 12px !important; -} -.img-7 { - width: 14px !important; - height: 14px !important; -} -.img-8 { - width: 16px !important; - height: 16px !important; -} -.img-9 { - width: 18px !important; - height: 18px !important; -} -.img-10 { - width: 20px !important; - height: 20px !important; -} -.img-11 { - width: 22px !important; - height: 22px !important; -} -.img-12 { - width: 24px !important; - height: 24px !important; -} -.img-13 { - width: 26px !important; - height: 26px !important; -} -.img-14 { - width: 28px !important; - height: 28px !important; -} -.img-15 { - width: 30px !important; - height: 30px !important; -} -.img-16 { - width: 32px !important; - height: 32px !important; -} -.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; -} -@media only screen and (max-width: 991px) and (min-width: 768px) { - .ui.container { - width: 95%; - } -} -/* Overrides some styles of the Highlight.js plugin */ -.hljs { - background: inherit !important; - padding: 0 !important; -} -.markdown:not(code) { - overflow: hidden; - font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif; - font-size: 16px; - line-height: 1.6 !important; - word-wrap: break-word; -} -.markdown:not(code).file-view { - padding: 2em 2em 2em !important; -} -.markdown:not(code) > *:first-child { - margin-top: 0 !important; -} -.markdown:not(code) > *:last-child { - margin-bottom: 0 !important; -} -.markdown:not(code) a:not([href]) { - color: inherit; - text-decoration: none; -} -.markdown:not(code) .absent { - color: #c00; -} -.markdown:not(code) .anchor { - position: absolute; - top: 0; - left: 0; - display: block; - padding-right: 6px; - padding-left: 30px; - margin-left: -30px; -} -.markdown:not(code) .anchor:focus { - outline: none; -} -.markdown:not(code) h1, -.markdown:not(code) h2, -.markdown:not(code) h3, -.markdown:not(code) h4, -.markdown:not(code) h5, -.markdown:not(code) h6 { - position: relative; - margin-top: 1em; - margin-bottom: 16px; - font-weight: bold; - line-height: 1.4; -} -.markdown:not(code) h1:first-of-type, -.markdown:not(code) h2:first-of-type, -.markdown:not(code) h3:first-of-type, -.markdown:not(code) h4:first-of-type, -.markdown:not(code) h5:first-of-type, -.markdown:not(code) h6:first-of-type { - margin-top: 0 !important; -} -.markdown:not(code) h1 .octicon-link, -.markdown:not(code) h2 .octicon-link, -.markdown:not(code) h3 .octicon-link, -.markdown:not(code) h4 .octicon-link, -.markdown:not(code) h5 .octicon-link, -.markdown:not(code) h6 .octicon-link { - display: none; - color: #000; - vertical-align: middle; -} -.markdown:not(code) h1:hover .anchor, -.markdown:not(code) h2:hover .anchor, -.markdown:not(code) h3:hover .anchor, -.markdown:not(code) h4:hover .anchor, -.markdown:not(code) h5:hover .anchor, -.markdown:not(code) h6:hover .anchor { - padding-left: 8px; - margin-left: -30px; - text-decoration: none; -} -.markdown:not(code) h1:hover .anchor .octicon-link, -.markdown:not(code) h2:hover .anchor .octicon-link, -.markdown:not(code) h3:hover .anchor .octicon-link, -.markdown:not(code) h4:hover .anchor .octicon-link, -.markdown:not(code) h5:hover .anchor .octicon-link, -.markdown:not(code) h6:hover .anchor .octicon-link { - display: inline-block; -} -.markdown:not(code) h1 tt, -.markdown:not(code) h1 code, -.markdown:not(code) h2 tt, -.markdown:not(code) h2 code, -.markdown:not(code) h3 tt, -.markdown:not(code) h3 code, -.markdown:not(code) h4 tt, -.markdown:not(code) h4 code, -.markdown:not(code) h5 tt, -.markdown:not(code) h5 code, -.markdown:not(code) h6 tt, -.markdown:not(code) h6 code { - font-size: inherit; -} -.markdown:not(code) h1 { - padding-bottom: 0.3em; - font-size: 2.25em; - line-height: 1.2; - border-bottom: 1px solid #eee; -} -.markdown:not(code) h1 .anchor { - line-height: 1; -} -.markdown:not(code) h2 { - padding-bottom: 0.3em; - font-size: 1.75em; - line-height: 1.225; - border-bottom: 1px solid #eee; -} -.markdown:not(code) h2 .anchor { - line-height: 1; -} -.markdown:not(code) h3 { - font-size: 1.5em; - line-height: 1.43; -} -.markdown:not(code) h3 .anchor { - line-height: 1.2; -} -.markdown:not(code) h4 { - font-size: 1.25em; -} -.markdown:not(code) h4 .anchor { - line-height: 1.2; -} -.markdown:not(code) h5 { - font-size: 1em; -} -.markdown:not(code) h5 .anchor { - line-height: 1.1; -} -.markdown:not(code) h6 { - font-size: 1em; - color: #777; -} -.markdown:not(code) h6 .anchor { - line-height: 1.1; -} -.markdown:not(code) p, -.markdown:not(code) blockquote, -.markdown:not(code) ul, -.markdown:not(code) ol, -.markdown:not(code) dl, -.markdown:not(code) table, -.markdown:not(code) pre { - margin-top: 0; - margin-bottom: 16px; -} -.markdown:not(code) blockquote { - margin-left: 0; -} -.markdown:not(code) hr { - height: 4px; - padding: 0; - margin: 16px 0; - background-color: #e7e7e7; - border: 0 none; -} -.markdown:not(code) ul, -.markdown:not(code) ol { - padding-left: 2em; -} -.markdown:not(code) ul.no-list, -.markdown:not(code) ol.no-list { - padding: 0; - list-style-type: none; -} -.markdown:not(code) ul ul, -.markdown:not(code) ul ol, -.markdown:not(code) ol ol, -.markdown:not(code) ol ul { - margin-top: 0; - margin-bottom: 0; -} -.markdown:not(code) ol ol, -.markdown:not(code) ul ol { - list-style-type: lower-roman; -} -.markdown:not(code) li > p { - margin-top: 16px; -} -.markdown:not(code) dl { - padding: 0; -} -.markdown:not(code) dl dt { - padding: 0; - margin-top: 16px; - font-size: 1em; - font-style: italic; - font-weight: bold; -} -.markdown:not(code) dl dd { - padding: 0 16px; - margin-bottom: 16px; -} -.markdown:not(code) blockquote { - padding: 0 15px; - color: #777; - border-left: 4px solid #ddd; -} -.markdown:not(code) blockquote > :first-child { - margin-top: 0; -} -.markdown:not(code) blockquote > :last-child { - margin-bottom: 0; -} -.markdown:not(code) table { - display: block; - width: 100%; - overflow: auto; - word-break: normal; - word-break: keep-all; -} -.markdown:not(code) table th { - font-weight: bold; -} -.markdown:not(code) table th, -.markdown:not(code) table td { - padding: 6px 13px !important; - border: 1px solid #ddd !important; -} -.markdown:not(code) table tr { - background-color: #fff; - border-top: 1px solid #ccc; -} -.markdown:not(code) table tr:nth-child(2n) { - background-color: #f8f8f8; -} -.markdown:not(code) img { - max-width: 100%; - box-sizing: border-box; -} -.markdown:not(code) .emoji { - max-width: none; -} -.markdown:not(code) span.frame { - display: block; - overflow: hidden; -} -.markdown:not(code) span.frame > span { - display: block; - float: left; - width: auto; - padding: 7px; - margin: 13px 0 0; - overflow: hidden; - border: 1px solid #ddd; -} -.markdown:not(code) span.frame span img { - display: block; - float: left; -} -.markdown:not(code) span.frame span span { - display: block; - padding: 5px 0 0; - clear: both; - color: #333; -} -.markdown:not(code) span.align-center { - display: block; - overflow: hidden; - clear: both; -} -.markdown:not(code) span.align-center > span { - display: block; - margin: 13px auto 0; - overflow: hidden; - text-align: center; -} -.markdown:not(code) span.align-center span img { - margin: 0 auto; - text-align: center; -} -.markdown:not(code) span.align-right { - display: block; - overflow: hidden; - clear: both; -} -.markdown:not(code) span.align-right > span { - display: block; - margin: 13px 0 0; - overflow: hidden; - text-align: right; -} -.markdown:not(code) span.align-right span img { - margin: 0; - text-align: right; -} -.markdown:not(code) span.float-left { - display: block; - float: left; - margin-right: 13px; - overflow: hidden; -} -.markdown:not(code) span.float-left span { - margin: 13px 0 0; -} -.markdown:not(code) span.float-right { - display: block; - float: right; - margin-left: 13px; - overflow: hidden; -} -.markdown:not(code) span.float-right > span { - display: block; - margin: 13px auto 0; - overflow: hidden; - text-align: right; -} -.markdown:not(code) code, -.markdown:not(code) tt { - padding: 0; - padding-top: 0.2em; - padding-bottom: 0.2em; - margin: 0; - font-size: 85%; - background-color: rgba(0, 0, 0, 0.04); - border-radius: 3px; -} -.markdown:not(code) code:before, -.markdown:not(code) code:after, -.markdown:not(code) tt:before, -.markdown:not(code) tt:after { - letter-spacing: -0.2em; - content: "\00a0"; -} -.markdown:not(code) code br, -.markdown:not(code) tt br { - display: none; -} -.markdown:not(code) del code { - text-decoration: inherit; -} -.markdown:not(code) pre > code { - padding: 0; - margin: 0; - font-size: 100%; - word-break: normal; - white-space: pre; - background: transparent; - border: 0; -} -.markdown:not(code) .highlight { - margin-bottom: 16px; -} -.markdown:not(code) .highlight pre, -.markdown:not(code) pre { - padding: 16px; - overflow: auto; - font-size: 85%; - line-height: 1.45; - background-color: #f7f7f7; - border-radius: 3px; -} -.markdown:not(code) .highlight pre { - margin-bottom: 0; - word-break: normal; -} -.markdown:not(code) pre { - word-wrap: normal; -} -.markdown:not(code) pre code, -.markdown:not(code) pre tt { - display: inline; - max-width: initial; - padding: 0; - margin: 0; - overflow: initial; - line-height: inherit; - word-wrap: normal; - background-color: transparent; - border: 0; -} -.markdown:not(code) pre code:before, -.markdown:not(code) pre code:after, -.markdown:not(code) pre tt:before, -.markdown:not(code) pre tt:after { - content: normal; -} -.markdown:not(code) kbd { - display: inline-block; - padding: 3px 5px; - font-size: 11px; - line-height: 10px; - color: #555; - vertical-align: middle; - background-color: #fcfcfc; - border: solid 1px #ccc; - border-bottom-color: #bbb; - border-radius: 3px; - box-shadow: inset 0 -1px 0 #bbb; -} -.markdown:not(code) input[type="checkbox"] { - vertical-align: middle !important; -} -.markdown:not(code) .csv-data td, -.markdown:not(code) .csv-data th { - padding: 5px; - overflow: hidden; - font-size: 12px; - line-height: 1; - text-align: left; - white-space: nowrap; -} -.markdown:not(code) .csv-data .blob-num { - padding: 10px 8px 9px; - text-align: right; - background: #fff; - border: 0; -} -.markdown:not(code) .csv-data tr { - border-top: 0; -} -.markdown:not(code) .csv-data th { - font-weight: bold; - background: #f8f8f8; - border-top: 0; -} -.home { - padding-bottom: 80px; -} -.home .logo { - max-width: 220px; -} -.home .hero h1, -.home .hero h2 { - font-family: 'PT Sans Narrow', sans-serif, 'Microsoft YaHei'; -} -.home .hero h1 { - font-size: 5.5em; -} -.home .hero h2 { - font-size: 3em; -} -.home .hero .octicon { - color: #d9453d; - font-size: 40px; - width: 50px; -} -.home .hero.header { - font-size: 20px; -} -.home p.large { - font-size: 16px; -} -.home .stackable { - padding-top: 30px; -} -.home a { - color: #d9453d; -} -.signup { - padding-top: 15px; - padding-bottom: 80px; -} -.install { - padding-top: 45px; - padding-bottom: 80px; -} -.install form label { - text-align: right; - width: 320px !important; -} -.install form input { - width: 35% !important; -} -.install form .field { - text-align: left; -} -.install form .field .help { - margin-left: 335px !important; -} -.install form .field.optional .title { - margin-left: 38%; -} -.install .ui .checkbox { - margin-left: 40% !important; -} -.install .ui .checkbox label { - width: auto !important; -} -.form .help { - color: #999999; - padding-top: .6em; - padding-bottom: .6em; - display: inline-block; -} -.ui.attached.header { - background: #f0f0f0; -} -.ui.attached.header .right { - margin-top: -5px; -} -.ui.attached.header .right .button { - padding: 8px 10px; - font-weight: normal; -} -#create-page-form form { - margin: auto; - width: 800px!important; -} -#create-page-form form .ui.message { - text-align: center; -} -#create-page-form form .header { - padding-left: 280px !important; -} -#create-page-form form .inline.field > label { - text-align: right; - width: 250px !important; - word-wrap: break-word; -} -#create-page-form form .help { - margin-left: 265px !important; -} -#create-page-form form .optional .title { - margin-left: 250px !important; -} -#create-page-form form input, -#create-page-form form textarea { - width: 50%!important; -} -.user.activate form, -.user.forgot.password form, -.user.reset.password form, -.user.signin form, -.user.signup form { - margin: auto; - width: 800px!important; -} -.user.activate form .ui.message, -.user.forgot.password form .ui.message, -.user.reset.password form .ui.message, -.user.signin form .ui.message, -.user.signup form .ui.message { - text-align: center; -} -.user.activate form .header, -.user.forgot.password form .header, -.user.reset.password form .header, -.user.signin form .header, -.user.signup form .header { - padding-left: 280px !important; -} -.user.activate form .inline.field > label, -.user.forgot.password form .inline.field > label, -.user.reset.password form .inline.field > label, -.user.signin form .inline.field > label, -.user.signup form .inline.field > label { - text-align: right; - width: 250px !important; - word-wrap: break-word; -} -.user.activate form .help, -.user.forgot.password form .help, -.user.reset.password form .help, -.user.signin form .help, -.user.signup form .help { - margin-left: 265px !important; -} -.user.activate form .optional .title, -.user.forgot.password form .optional .title, -.user.reset.password form .optional .title, -.user.signin form .optional .title, -.user.signup form .optional .title { - margin-left: 250px !important; -} -.user.activate form input, -.user.forgot.password form input, -.user.reset.password form input, -.user.signin form input, -.user.signup form input, -.user.activate form textarea, -.user.forgot.password form textarea, -.user.reset.password form textarea, -.user.signin form textarea, -.user.signup form textarea { - width: 50%!important; -} -.user.activate form, -.user.forgot.password form, -.user.reset.password form, -.user.signin form, -.user.signup form { - width: 700px!important; -} -.user.activate form .header, -.user.forgot.password form .header, -.user.reset.password form .header, -.user.signin form .header, -.user.signup form .header { - padding-left: 230px !important; -} -.user.activate form .inline.field > label, -.user.forgot.password form .inline.field > label, -.user.reset.password form .inline.field > label, -.user.signin form .inline.field > label, -.user.signup form .inline.field > label { - width: 200px !important; -} -.repository.new.repo form, -.repository.new.migrate form, -.repository.new.fork form { - margin: auto; - width: 800px!important; -} -.repository.new.repo form .ui.message, -.repository.new.migrate form .ui.message, -.repository.new.fork form .ui.message { - text-align: center; -} -.repository.new.repo form .header, -.repository.new.migrate form .header, -.repository.new.fork form .header { - padding-left: 280px !important; -} -.repository.new.repo form .inline.field > label, -.repository.new.migrate form .inline.field > label, -.repository.new.fork form .inline.field > label { - text-align: right; - width: 250px !important; - word-wrap: break-word; -} -.repository.new.repo form .help, -.repository.new.migrate form .help, -.repository.new.fork form .help { - margin-left: 265px !important; -} -.repository.new.repo form .optional .title, -.repository.new.migrate form .optional .title, -.repository.new.fork form .optional .title { - margin-left: 250px !important; -} -.repository.new.repo form input, -.repository.new.migrate form input, -.repository.new.fork form input, -.repository.new.repo form textarea, -.repository.new.migrate form textarea, -.repository.new.fork form textarea { - width: 50%!important; -} -.repository.new.repo form .dropdown .dropdown.icon, -.repository.new.migrate form .dropdown .dropdown.icon, -.repository.new.fork form .dropdown .dropdown.icon { - margin-top: -7px !important; -} -.repository.new.repo form .dropdown .text, -.repository.new.migrate form .dropdown .text, -.repository.new.fork form .dropdown .text { - margin-right: 0!important; -} -.repository.new.repo form .dropdown .text i, -.repository.new.migrate form .dropdown .text i, -.repository.new.fork form .dropdown .text i { - margin-right: 0!important; -} -.repository.new.repo .ui.form .selection.dropdown:not(.owner) { - width: 50%!important; -} -.repository.new.repo .ui.form #auto-init { - margin-left: 265px !important; -} -.new.webhook form .help { - margin-left: 25px; -} -.new.webhook .events.fields .column { - padding-left: 40px; -} -.repository { - padding-top: 15px; - padding-bottom: 80px; -} -.repository .head .column { - padding-top: 5px !important; - padding-bottom: 5px !important; -} -.repository .head .ui.compact.menu { - margin-left: 1rem; -} -.repository .head .ui.header { - margin-top: 0; -} -.repository .head .mega-octicon { - width: 30px; - font-size: 30px; -} -.repository .head .ui.huge.breadcrumb { - font-weight: 400; - font-size: 1.7rem; -} -.repository .head .fork-flag { - margin-left: 38px; - margin-top: 3px; - display: block; - font-size: 12px; - white-space: nowrap; -} -.repository .head .octicon.octicon-repo-forked { - margin-top: -1px; - font-size: 15px; -} -.repository .navbar .ui.label { - margin-top: -2px; - margin-left: 7px; - padding: 3px 5px; -} -.repository .owner.dropdown { - min-width: 40% !important; -} -.repository .metas .menu { - max-height: 300px; - overflow-x: auto; -} -.repository .metas .ui.list .hide { - display: none!important; -} -.repository .metas .ui.list .item { - padding: 0px; -} -.repository .metas .ui.list .label.color { - padding: 0 8px; - margin-right: 5px; -} -.repository .metas .ui.list a { - margin: 2px 0; -} -.repository .metas .ui.list a .text { - color: #444; -} -.repository .metas .ui.list a .text:hover { - color: #000; -} -.repository .header-wrapper { - background-color: #FAFAFA; - margin-top: -15px; - padding-top: 15px; -} -.repository .header-wrapper .ui.tabs.divider { - border-bottom: none; -} -.repository .header-wrapper .ui.tabular .octicon { - margin-right: 5px; -} -.repository .filter.menu .label.color { - border-radius: 3px; - margin-left: 15px; - padding: 0 8px; -} -.repository .filter.menu .octicon { - float: left; - margin-left: -5px; - margin-right: -7px; -} -.repository .filter.menu .menu { - max-height: 300px; - overflow-x: auto; - right: 0!important; - left: auto!important; -} -.repository .filter.menu .dropdown.item { - margin: 1px; - padding-right: 0; -} -.repository .ui.tabs.container { - margin-top: 14px; - margin-bottom: 0px; -} -.repository .ui.tabs.container .ui.menu { - border-bottom: none; -} -.repository .ui.tabs.divider { - margin-top: 0; - margin-bottom: 20px; -} -.repository #clone-panel { - margin-top: -8px; - margin-left: 5px; - width: 350px; -} -.repository #clone-panel input { - border-radius: 0; - padding: 5px 10px; -} -.repository #clone-panel .clone.button { - font-size: 13px; - padding: 0 5px; -} -.repository #clone-panel .clone.button:first-child { - border-radius: .28571429rem 0 0 .28571429rem; -} -.repository #clone-panel .icon.button { - padding: 0 10px; -} -.repository #clone-panel .dropdown .menu { - right: 0!important; - left: auto!important; -} -.repository.file.list #repo-desc { - font-size: 1.2em; -} -.repository.file.list .choose.reference .header .icon { - font-size: 1.4em; -} -.repository.file.list #file-buttons { - font-weight: normal; - margin-top: -3px; -} -.repository.file.list #file-buttons .ui.button { - padding: 8px 10px; - font-weight: normal; -} -.repository.file.list #repo-files-table thead th { - padding-top: 8px; - padding-bottom: 5px; - font-weight: normal; -} -.repository.file.list #repo-files-table thead th:first-child { - display: block; - position: relative; - width: 325%; -} -.repository.file.list #repo-files-table thead .ui.avatar { - margin-bottom: 5px; -} -.repository.file.list #repo-files-table tbody .octicon { - margin-left: 3px; - margin-right: 5px; - color: #777; -} -.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply { - margin-right: 10px; -} -.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory, -.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule { - color: #1e70bf; -} -.repository.file.list #repo-files-table td { - padding-top: 8px; - padding-bottom: 8px; -} -.repository.file.list #repo-files-table tr:hover { - background-color: #ffffEE; -} -.repository.file.list #file-content .header .icon { - font-size: 1em; - margin-top: -2px; -} -.repository.file.list #file-content .header .file-actions { - padding-left: 20px; -} -.repository.file.list #file-content .header .file-actions .btn-octicon { - display: inline-block; - padding: 5px; - margin-left: 5px; - line-height: 1; - color: #767676; - vertical-align: middle; - background: transparent; - border: 0; - outline: none; -} -.repository.file.list #file-content .header .file-actions .btn-octicon:hover { - color: #4078c0; -} -.repository.file.list #file-content .header .file-actions .btn-octicon-danger:hover { - color: #bd2c00; -} -.repository.file.list #file-content .header .file-actions .btn-octicon.disabled { - color: #bbb; - cursor: default; -} -.repository.file.list #file-content .header .file-actions #delete-file-form { - display: inline-block; -} -.repository.file.list #file-content .view-raw { - padding: 5px; -} -.repository.file.list #file-content .view-raw * { - max-width: 100%; -} -.repository.file.list #file-content .view-raw img { - padding: 5px 5px 0 5px; -} -.repository.file.list #file-content .code-view * { - font-size: 12px; - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; - line-height: 20px; -} -.repository.file.list #file-content .code-view table { - width: 100%; -} -.repository.file.list #file-content .code-view .lines-num { - vertical-align: top; - text-align: right; - color: #999; - background: #f5f5f5; - width: 1%; -} -.repository.file.list #file-content .code-view .lines-num span { - line-height: 20px; - padding: 0 10px; - cursor: pointer; - display: block; -} -.repository.file.list #file-content .code-view .lines-num, -.repository.file.list #file-content .code-view .lines-code { - padding: 0; -} -.repository.file.list #file-content .code-view .lines-num pre, -.repository.file.list #file-content .code-view .lines-code pre, -.repository.file.list #file-content .code-view .lines-num ol, -.repository.file.list #file-content .code-view .lines-code ol, -.repository.file.list #file-content .code-view .lines-num .hljs, -.repository.file.list #file-content .code-view .lines-code .hljs { - background-color: white; - margin: 0; - padding: 0 !important; -} -.repository.file.list #file-content .code-view .lines-num pre li, -.repository.file.list #file-content .code-view .lines-code pre li, -.repository.file.list #file-content .code-view .lines-num ol li, -.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; - width: 100%; -} -.repository.file.list #file-content .code-view .lines-num pre li.active, -.repository.file.list #file-content .code-view .lines-code pre li.active, -.repository.file.list #file-content .code-view .lines-num ol li.active, -.repository.file.list #file-content .code-view .lines-code ol li.active, -.repository.file.list #file-content .code-view .lines-num .hljs li.active, -.repository.file.list #file-content .code-view .lines-code .hljs li.active { - background: #ffffdd; -} -.repository.file.list #file-content .code-view .lines-num pre li:before, -.repository.file.list #file-content .code-view .lines-code pre li:before, -.repository.file.list #file-content .code-view .lines-num ol li:before, -.repository.file.list #file-content .code-view .lines-code ol li:before, -.repository.file.list #file-content .code-view .lines-num .hljs li:before, -.repository.file.list #file-content .code-view .lines-code .hljs li:before { - content: ' '; -} -.repository.file.list .sidebar { - padding-left: 0; -} -.repository.file.list .sidebar .octicon { - width: 16px; -} -.repository.file.editor .treepath { - width: 100%; -} -.repository.file.editor .treepath input { - vertical-align: middle; - box-shadow: rgba(0, 0, 0, 0.0745098) 0px 1px 2px inset; - width: inherit; - padding: 7px 8px; - margin-right: 5px; -} -.repository.file.editor .tabular.menu .octicon { - margin-right: 5px; -} -.repository.file.editor .commit-form-wrapper { - padding-left: 64px; -} -.repository.file.editor .commit-form-wrapper .commit-avatar { - float: left; - margin-left: -64px; - width: 3em; - height: auto; -} -.repository.file.editor .commit-form-wrapper .commit-form { - position: relative; - padding: 15px; - margin-bottom: 10px; - border: 1px solid #ddd; - border-radius: 3px; -} -.repository.file.editor .commit-form-wrapper .commit-form:before, -.repository.file.editor .commit-form-wrapper .commit-form:after { - right: 100%; - top: 20px; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; -} -.repository.file.editor .commit-form-wrapper .commit-form:before { - border-right-color: #D4D4D5; - border-width: 9px; - margin-top: -9px; -} -.repository.file.editor .commit-form-wrapper .commit-form:after { - border-right-color: #f7f7f7; - border-width: 8px; - margin-top: -8px; -} -.repository.file.editor .commit-form-wrapper .commit-form:after { - border-right-color: #fff; -} -.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name { - display: inline-block; - padding: 3px 6px; - font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace; - color: rgba(0, 0, 0, 0.65); - background-color: rgba(209, 227, 237, 0.45); - border-radius: 3px; -} -.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input { - position: relative; - margin-left: 25px; -} -.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input { - width: 240px !important; - padding-left: 26px !important; -} -.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch { - position: absolute; - top: 9px; - left: 10px; - color: #b0c4ce; -} -.repository.options #interval { - width: 100px!important; - min-width: 100px; -} -.repository.options .danger .item { - padding: 20px 15px; -} -.repository.options .danger .ui.divider { - margin: 0; -} -.repository.new.issue .comment.form .comment .avatar { - width: 3em; -} -.repository.new.issue .comment.form .content { - margin-left: 4em; -} -.repository.new.issue .comment.form .content:before, -.repository.new.issue .comment.form .content:after { - right: 100%; - top: 20px; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; -} -.repository.new.issue .comment.form .content:before { - border-right-color: #D4D4D5; - border-width: 9px; - margin-top: -9px; -} -.repository.new.issue .comment.form .content:after { - border-right-color: #f7f7f7; - border-width: 8px; - margin-top: -8px; -} -.repository.new.issue .comment.form .content:after { - border-right-color: #fff; -} -.repository.new.issue .comment.form .content .markdown { - font-size: 14px; -} -.repository.new.issue .comment.form .metas { - min-width: 220px; -} -.repository.new.issue .comment.form .metas .filter.menu { - max-height: 300px; - overflow-x: auto; -} -.repository.view.issue .title { - padding-bottom: 0!important; -} -.repository.view.issue .title h1 { - font-weight: 300; - font-size: 2.3rem; - margin-bottom: 5px; -} -.repository.view.issue .title h1 .ui.input { - font-size: 0.5em; - vertical-align: top; - width: 50%; - min-width: 600px; -} -.repository.view.issue .title h1 .ui.input input { - font-size: 1.5em; - padding: 6px 10px; -} -.repository.view.issue .title .index { - font-weight: 300; - color: #aaa; - letter-spacing: -1px; -} -.repository.view.issue .title .label { - margin-right: 10px; -} -.repository.view.issue .title .edit-zone { - margin-top: 10px; -} -.repository.view.issue .pull-desc code { - color: #0166E6; -} -.repository.view.issue .pull.tabular.menu { - margin-bottom: 10px; -} -.repository.view.issue .pull.tabular.menu .octicon { - margin-right: 5px; -} -.repository.view.issue .pull.tab.segment { - border: none; - padding: 0; - padding-top: 10px; - box-shadow: none; - background-color: inherit; -} -.repository.view.issue .pull .merge.box .avatar { - margin-left: 10px; - margin-top: 10px; -} -.repository.view.issue .comment-list:before { - display: block; - content: ""; - position: absolute; - margin-top: 12px; - margin-bottom: 14px; - top: 0; - bottom: 0; - left: 96px; - width: 2px; - background-color: #f3f3f3; - z-index: -1; -} -.repository.view.issue .comment-list .comment .avatar { - width: 3em; -} -.repository.view.issue .comment-list .comment .tag { - color: #767676; - margin-top: 3px; - padding: 2px 5px; - font-size: 12px; - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 3px; -} -.repository.view.issue .comment-list .comment .actions .item { - float: left; -} -.repository.view.issue .comment-list .comment .actions .item.tag { - margin-right: 5px; -} -.repository.view.issue .comment-list .comment .actions .item.action { - margin-top: 6px; - margin-left: 10px; -} -.repository.view.issue .comment-list .comment .content { - margin-left: 4em; -} -.repository.view.issue .comment-list .comment .content .header { - font-weight: normal; - padding: auto 15px; - position: relative; - color: #767676; - background-color: #f7f7f7; - border-bottom: 1px solid #eee; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.repository.view.issue .comment-list .comment .content .header:before, -.repository.view.issue .comment-list .comment .content .header:after { - right: 100%; - top: 20px; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; -} -.repository.view.issue .comment-list .comment .content .header:before { - border-right-color: #D4D4D5; - border-width: 9px; - margin-top: -9px; -} -.repository.view.issue .comment-list .comment .content .header:after { - border-right-color: #f7f7f7; - border-width: 8px; - margin-top: -8px; -} -.repository.view.issue .comment-list .comment .content .header .text { - max-width: 78%; - padding-top: 10px; - padding-bottom: 10px; -} -.repository.view.issue .comment-list .comment .content .markdown { - font-size: 14px; -} -.repository.view.issue .comment-list .comment .content .no-content { - color: #767676; - font-style: italic; -} -.repository.view.issue .comment-list .comment .content > .bottom.segment { - background: #f3f4f5; -} -.repository.view.issue .comment-list .comment .content > .bottom.segment .ui.images::after { - clear: both; - content: ' '; - display: block; -} -.repository.view.issue .comment-list .comment .content > .bottom.segment a { - display: block; - float: left; - margin: 5px; - padding: 5px; - height: 150px; - border: solid 1px #eee; - border-radius: 3px; - max-width: 150px; - background-color: #fff; -} -.repository.view.issue .comment-list .comment .content > .bottom.segment a:before { - content: ' '; - display: inline-block; - height: 100%; - vertical-align: middle; -} -.repository.view.issue .comment-list .comment .content > .bottom.segment .ui.image { - max-height: 100%; - width: auto; - margin: 0; - vertical-align: middle; -} -.repository.view.issue .comment-list .comment .content > .bottom.segment span.ui.image { - font-size: 8vw; - color: #000000; -} -.repository.view.issue .comment-list .comment .content > .bottom.segment span.ui.image:hover { - color: #000000; -} -.repository.view.issue .comment-list .comment .ui.form .field:first-child { - clear: none; -} -.repository.view.issue .comment-list .comment .ui.form .tab.segment { - border: none; - padding: 0; - padding-top: 10px; -} -.repository.view.issue .comment-list .comment .ui.form textarea { - height: 200px; - font-family: "Consolas", monospace; -} -.repository.view.issue .comment-list .comment .edit.buttons { - margin-top: 10px; -} -.repository.view.issue .comment-list .event { - position: relative; - margin: 15px 0 15px 79px; - padding-left: 25px; -} -.repository.view.issue .comment-list .event .octicon { - width: 30px; - float: left; - text-align: center; -} -.repository.view.issue .comment-list .event .octicon.octicon-circle-slash { - margin-top: 5px; - margin-left: -34.5px; - font-size: 20px; - color: #bd2c00; -} -.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot { - margin-left: -28.5px; - margin-right: -1px; - font-size: 30px; - color: #6cc644; -} -.repository.view.issue .comment-list .event .octicon.octicon-bookmark { - margin-top: 3px; - margin-left: -31px; - margin-right: -1px; - font-size: 25px; -} -.repository.view.issue .comment-list .event .detail { - font-size: 0.9rem; - margin-top: 5px; - margin-left: 35px; -} -.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit { - margin-top: 2px; -} -.repository.view.issue .ui.segment.metas { - margin-top: -3px; -} -.repository.view.issue .ui.participants img { - margin-top: 5px; - margin-right: 5px; -} -.repository .comment.form .ui.comments { - margin-top: -12px; - max-width: 100%; -} -.repository .comment.form .content .field:first-child { - clear: none; -} -.repository .comment.form .content .form:before, -.repository .comment.form .content .form:after { - right: 100%; - top: 20px; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; -} -.repository .comment.form .content .form:before { - border-right-color: #D4D4D5; - border-width: 9px; - margin-top: -9px; -} -.repository .comment.form .content .form:after { - border-right-color: #f7f7f7; - border-width: 8px; - margin-top: -8px; -} -.repository .comment.form .content .form:after { - border-right-color: #fff; -} -.repository .comment.form .content .tab.segment { - border: none; - padding: 0; - padding-top: 10px; -} -.repository .comment.form .content textarea { - height: 200px; - font-family: "Consolas", monospace; -} -.repository .label.list { - list-style: none; - padding-top: 15px; -} -.repository .label.list .item { - padding-top: 10px; - padding-bottom: 10px; - border-bottom: 1px dashed #AAA; -} -.repository .label.list .item a { - font-size: 15px; - padding-top: 5px; - padding-right: 10px; - color: #666; -} -.repository .label.list .item a:hover { - color: #000; -} -.repository .label.list .item a.open-issues { - margin-right: 30px; -} -.repository .label.list .item .ui.label { - font-size: 1em; -} -.repository .milestone.list { - list-style: none; - padding-top: 15px; -} -.repository .milestone.list > .item { - padding-top: 10px; - padding-bottom: 10px; - border-bottom: 1px dashed #AAA; -} -.repository .milestone.list > .item > a { - padding-top: 5px; - padding-right: 10px; - color: #000; -} -.repository .milestone.list > .item > a:hover { - color: #4078c0; -} -.repository .milestone.list > .item .ui.progress { - width: 40%; - padding: 0; - border: 0; - margin: 0; -} -.repository .milestone.list > .item .ui.progress .bar { - height: 20px; -} -.repository .milestone.list > .item .meta { - color: #999; - padding-top: 5px; -} -.repository .milestone.list > .item .meta .issue-stats .octicon { - padding-left: 5px; -} -.repository .milestone.list > .item .meta .overdue { - color: red; -} -.repository .milestone.list > .item .operate { - margin-top: -15px; -} -.repository .milestone.list > .item .operate > a { - font-size: 15px; - padding-top: 5px; - padding-right: 10px; - color: #666; -} -.repository .milestone.list > .item .operate > a:hover { - color: #000; -} -.repository .milestone.list > .item .content { - padding-top: 10px; -} -.repository.new.milestone textarea { - height: 200px; -} -.repository.new.milestone #deadline { - width: 150px; -} -.repository.compare.pull .choose.branch .octicon { - padding-right: 10px; -} -.repository.compare.pull .comment.form .content:before, -.repository.compare.pull .comment.form .content:after { - right: 100%; - top: 20px; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; -} -.repository.compare.pull .comment.form .content:before { - border-right-color: #D4D4D5; - border-width: 9px; - margin-top: -9px; -} -.repository.compare.pull .comment.form .content:after { - border-right-color: #f7f7f7; - border-width: 8px; - margin-top: -8px; -} -.repository.compare.pull .comment.form .content:after { - border-right-color: #fff; -} -.repository .filter.dropdown .menu { - margin-top: 1px!important; -} -.repository.commits .header .ui.right .search input { - font-weight: normal; - padding: 5px 10px; -} -.repository #commits-table thead th:first-of-type { - padding-left: 15px; -} -.repository #commits-table thead .sha { - font-size: 13px; - padding: 6px 40px 4px 35px; -} -.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n) { - background-color: rgba(0, 0, 0, 0.02) !important; -} -.repository .diff-detail-box { - margin: 15px 0; - line-height: 30px; -} -.repository .diff-detail-box ol { - clear: both; - padding-left: 0; - margin-top: 5px; - margin-bottom: 28px; -} -.repository .diff-detail-box ol li { - list-style: none; - padding-bottom: 4px; - margin-bottom: 4px; - border-bottom: 1px dashed #DDD; - padding-left: 6px; -} -.repository .diff-detail-box span.status { - display: inline-block; - width: 12px; - height: 12px; - margin-right: 8px; - vertical-align: middle; -} -.repository .diff-detail-box span.status.modify { - background-color: #f0db88; -} -.repository .diff-detail-box span.status.add { - background-color: #b4e2b4; -} -.repository .diff-detail-box span.status.del { - background-color: #e9aeae; -} -.repository .diff-detail-box span.status.rename { - background-color: #dad8ff; -} -.repository .diff-box .count { - margin-right: 12px; - font-size: 13px; -} -.repository .diff-box .count .bar { - background-color: #bd2c00; - height: 12px; - width: 40px; - display: inline-block; - margin: 2px 4px 0 4px; - vertical-align: text-top; -} -.repository .diff-box .count .bar .add { - background-color: #55a532; - height: 12px; -} -.repository .diff-box .file { - color: #888; -} -.repository .diff-file-box .header { - background-color: #f7f7f7; -} -.repository .diff-file-box .file-body.file-code .lines-num { - text-align: right; - color: #A7A7A7; - background: #fafafa; - width: 1%; -} -.repository .diff-file-box .file-body.file-code .lines-num span.fold { - display: block; - text-align: center; -} -.repository .diff-file-box .file-body.file-code .lines-num-old { - border-right: 1px solid #DDD; -} -.repository .diff-file-box .code-diff { - font-size: 12px; -} -.repository .diff-file-box .code-diff td { - padding: 0; - padding-left: 10px; - border-top: none; -} -.repository .diff-file-box .code-diff pre { - margin: 0; -} -.repository .diff-file-box .code-diff .lines-num { - border-right: 1px solid #d4d4d5; - padding: 0 5px; -} -.repository .diff-file-box .code-diff tbody tr.tag-code td, -.repository .diff-file-box .code-diff tbody tr.tag-code pre { - background-color: #F0F0F0 !important; - border-color: #D2CECE!important; - padding-top: 4px; - padding-bottom: 4px; -} -.repository .diff-file-box .code-diff tbody tr.tag-code td.halfwidth { - width: 50%; -} -.repository .diff-file-box .code-diff tbody tr.del-code td.add-code { - background-color: #eaffea !important; - border-color: #c1e9c1 !important; -} -.repository .diff-file-box .code-diff tbody tr.del-code td.add-code pre { - background-color: #eaffea !important; - border-color: #c1e9c1 !important; -} -.repository .diff-file-box .code-diff tbody tr.del-code td, -.repository .diff-file-box .code-diff tbody tr.del-code pre { - background-color: #ffecec !important; - border-color: #f1c0c0 !important; -} -.repository .diff-file-box .code-diff tbody tr.del-code td.halfwidth { - width: 50%; -} -.repository .diff-file-box .code-diff tbody tr.add-code td, -.repository .diff-file-box .code-diff tbody tr.add-code pre { - background-color: #eaffea !important; - border-color: #c1e9c1 !important; -} -.repository .diff-file-box .code-diff tbody tr.add-code td.halfwidth { - width: 50%; -} -.repository .diff-file-box .code-diff tbody tr .removed-code { - background-color: #ff9999; -} -.repository .diff-file-box .code-diff tbody tr .added-code { - background-color: #99ff99; -} -.repository .diff-file-box.file-content img { - max-width: 100%; - padding: 5px 5px 0 5px; -} -.repository .code-view { - overflow: auto; - overflow-x: auto; - overflow-y: hidden; -} -.repository.quickstart .guide .item { - padding: 1em; -} -.repository.quickstart .guide .item small { - font-weight: normal; -} -.repository.quickstart .guide .clone.button:first-child { - border-radius: .28571429rem 0 0 .28571429rem; -} -.repository.quickstart .guide .ui.action.small.input { - width: 100%; -} -.repository.quickstart .guide #repo-clone-url { - border-radius: 0; - padding: 5px 10px; - font-size: 1.2em; -} -.repository.release #release-list { - border-top: 1px solid #DDD; - margin-top: 20px; - padding-top: 15px; -} -.repository.release #release-list > li { - list-style: none; -} -.repository.release #release-list > li .meta, -.repository.release #release-list > li .detail { - padding-top: 30px; - padding-bottom: 40px; -} -.repository.release #release-list > li .meta { - text-align: right; - position: relative; -} -.repository.release #release-list > li .meta .tag:not(.icon) { - display: block; - margin-top: 15px; -} -.repository.release #release-list > li .meta .commit { - display: block; - margin-top: 10px; -} -.repository.release #release-list > li .detail { - border-left: 1px solid #DDD; -} -.repository.release #release-list > li .detail .author img { - margin-bottom: -3px; -} -.repository.release #release-list > li .detail .download { - margin-top: 20px; -} -.repository.release #release-list > li .detail .download > a .octicon { - margin-left: 5px; - margin-right: 5px; -} -.repository.release #release-list > li .detail .download .list { - padding-left: 0; - border-top: 1px solid #eee; -} -.repository.release #release-list > li .detail .download .list li { - list-style: none; - display: block; - padding-top: 8px; - padding-bottom: 8px; - border-bottom: 1px solid #eee; -} -.repository.release #release-list > li .detail .dot { - width: 9px; - height: 9px; - background-color: #ccc; - z-index: 999; - position: absolute; - display: block; - left: -5px; - top: 40px; - border-radius: 6px; - border: 1px solid #FFF; -} -.repository.new.release .target { - min-width: 500px; -} -.repository.new.release .target #tag-name { - margin-top: -4px; -} -.repository.new.release .target .at { - margin-left: -5px; - margin-right: 5px; -} -.repository.new.release .target .dropdown.icon { - margin: 0; - padding-top: 3px; -} -.repository.new.release .target .selection.dropdown { - padding-top: 10px; - padding-bottom: 10px; -} -.repository.new.release .prerelease.field { - margin-bottom: 0; -} -.repository.forks .list { - margin-top: 0; -} -.repository.forks .list .item { - padding-top: 10px; - padding-bottom: 10px; - border-bottom: 1px solid #DDD; -} -.repository.forks .list .item .ui.avatar { - float: left; - margin-right: 5px; -} -.repository.forks .list .item .link { - padding-top: 5px; -} -.repository.wiki.start .ui.segment { - padding-top: 70px; - padding-bottom: 100px; -} -.repository.wiki.start .ui.segment .mega-octicon { - font-size: 48px; -} -.repository.wiki.new .CodeMirror .CodeMirror-code { - font-family: "Consolas", monospace; -} -.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment { - background: inherit; -} -.repository.wiki.new .editor-preview { - background-color: white; -} -.repository.wiki.view .choose.page { - margin-top: -5px; -} -.repository.wiki.view .ui.sub.header { - text-transform: none; -} -.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 { - margin-top: 0; -} -.repository.settings.collaboration .collaborator.list { - padding: 0; -} -.repository.settings.collaboration .collaborator.list > .item { - margin: 0; - line-height: 2em; -} -.repository.settings.collaboration .collaborator.list > .item:not(:last-child) { - border-bottom: 1px solid #DDD; -} -.repository.settings.collaboration #repo-collab-form #search-user-box .results { - left: 7px; -} -.repository.settings.collaboration #repo-collab-form .ui.button { - margin-left: 5px; - margin-top: -3px; -} -.repository.settings.webhook .events .column { - padding-bottom: 0; -} -.repository.settings.webhook .events .help { - font-size: 13px; - margin-left: 26px; - padding-top: 0; -} -.user-cards .list { - padding: 0; -} -.user-cards .list .item { - list-style: none; - width: 32%; - margin: 10px 10px 10px 0; - padding-bottom: 14px; - float: left; -} -.user-cards .list .item .avatar { - width: 48px; - height: 48px; - float: left; - display: block; - margin-right: 10px; -} -.user-cards .list .item .name { - margin-top: 0; - margin-bottom: 0; - font-weight: normal; -} -.user-cards .list .item .meta { - margin-top: 5px; -} -#search-repo-box .results, -#search-user-box .results { - padding: 0; - position: absolute; -} -#search-repo-box .results .item, -#search-user-box .results .item { - padding: 10px 15px; - border-bottom: 1px solid #DDD; - cursor: pointer; -} -#search-repo-box .results .item:hover, -#search-user-box .results .item:hover { - background: rgba(0, 0, 0, 0.05) !important; - color: rgba(0, 0, 0, 0.95) !important; -} -#search-repo-box .results .item img, -#search-user-box .results .item img { - margin-right: 8px; -} -.issue.list { - list-style: none; - padding-top: 15px; -} -.issue.list > .item { - padding-top: 15px; - padding-bottom: 10px; - border-bottom: 1px dashed #AAA; -} -.issue.list > .item .title { - color: #444; - font-size: 15px; - font-weight: bold; - margin: 0 6px; -} -.issue.list > .item .title:hover { - color: #000; -} -.issue.list > .item .comment { - padding-right: 10px; - color: #666; -} -.issue.list > .item .desc { - padding-top: 5px; - color: #999; -} -.issue.list > .item .desc a.milestone { - padding-left: 5px; - color: #999!important; -} -.issue.list > .item .desc a.milestone:hover { - color: #000!important; -} -.issue.list > .item .desc .assignee { - margin-top: -5px; - margin-right: 5px; -} -.page.buttons { - padding-top: 15px; -} -.ui.form .dropzone { - width: 100%; - margin-bottom: 10px; - border: 2px dashed #0087F7; - box-shadow: none!important; -} -.ui.form .dropzone .dz-error-message { - top: 140px; -} -.settings .content { - margin-top: 2px; -} -.settings .content > .header, -.settings .content .segment { - box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15); -} -.settings .key.list .item:not(:first-child) { - border-top: 1px solid #eaeaea; -} -.settings .key.list .ssh-key-state-indicator { - float: left; - color: gray; - padding-left: 10px; - padding-top: 10px; -} -.settings .key.list .ssh-key-state-indicator.active { - color: #6cc644; -} -.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 { - margin-top: 10px; -} -.settings .hook.history.list .item .info .tabular.menu .item { - font-weight: 500; -} -.settings .hook.history.list .item .info .tab.segment { - border: none; - padding: 0; - padding-top: 10px; - box-shadow: none; -} -.settings .hook.history.list .item .info .tab.segment > * { - color: #666; -} -.settings .hook.history.list .item .info .tab.segment pre { - word-wrap: break-word; -} -.settings .hook.history.list .item .info .tab.segment pre .hljs { - padding: 0; - background-color: inherit; -} -.ui.vertical.menu .header.item { - font-size: 1.1em; - background: #f0f0f0; -} -.edit-label.modal .form .column, -.new-label.segment .form .column { - padding-right: 0; -} -.edit-label.modal .form .buttons, -.new-label.segment .form .buttons { - margin-left: auto; - padding-top: 15px; -} -.edit-label.modal .form .color.picker.column, -.new-label.segment .form .color.picker.column { - width: auto; -} -.edit-label.modal .form .color.picker.column .color-picker, -.new-label.segment .form .color.picker.column .color-picker { - height: 35px; - width: auto; - padding-left: 30px; -} -.edit-label.modal .form .minicolors-swatch.minicolors-sprite, -.new-label.segment .form .minicolors-swatch.minicolors-sprite { - top: 10px; - left: 10px; - width: 15px; - height: 15px; -} -.edit-label.modal .form .precolors, -.new-label.segment .form .precolors { - padding-left: 0; - padding-right: 0; - margin: 3px 10px auto 10px; - width: 120px; -} -.edit-label.modal .form .precolors .color, -.new-label.segment .form .precolors .color { - float: left; - width: 15px; - height: 15px; -} -#avatar-arrow:before, -#avatar-arrow:after { - right: 100%; - top: 20px; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; -} -#avatar-arrow:before { - border-right-color: #D4D4D5; - border-width: 9px; - margin-top: -9px; -} -#avatar-arrow:after { - border-right-color: #f7f7f7; - border-width: 8px; - margin-top: -8px; -} -#transfer-repo-modal .ui.message, -#delete-repo-modal .ui.message { - width: 100%!important; -} -.tab-size-1 { - tab-size: 1 !important; - -moz-tab-size: 1 !important; -} -.tab-size-2 { - tab-size: 2 !important; - -moz-tab-size: 2 !important; -} -.tab-size-3 { - tab-size: 3 !important; - -moz-tab-size: 3 !important; -} -.tab-size-4 { - tab-size: 4 !important; - -moz-tab-size: 4 !important; -} -.tab-size-5 { - tab-size: 5 !important; - -moz-tab-size: 5 !important; -} -.tab-size-6 { - tab-size: 6 !important; - -moz-tab-size: 6 !important; -} -.tab-size-7 { - tab-size: 7 !important; - -moz-tab-size: 7 !important; -} -.tab-size-8 { - tab-size: 8 !important; - -moz-tab-size: 8 !important; -} -.tab-size-9 { - tab-size: 9 !important; - -moz-tab-size: 9 !important; -} -.tab-size-10 { - tab-size: 10 !important; - -moz-tab-size: 10 !important; -} -.tab-size-11 { - tab-size: 11 !important; - -moz-tab-size: 11 !important; -} -.tab-size-12 { - tab-size: 12 !important; - -moz-tab-size: 12 !important; -} -.tab-size-13 { - tab-size: 13 !important; - -moz-tab-size: 13 !important; -} -.tab-size-14 { - tab-size: 14 !important; - -moz-tab-size: 14 !important; -} -.tab-size-15 { - tab-size: 15 !important; - -moz-tab-size: 15 !important; -} -.tab-size-16 { - tab-size: 16 !important; - -moz-tab-size: 16 !important; -} -.CodeMirror { - font: 14px Consolas, "Liberation Mono", Menlo, Courier, monospace; -} -.CodeMirror.cm-s-default { - border-radius: 3px; - padding: 0 !important; -} -.CodeMirror .cm-comment { - background: inherit !important; -} -.organization { - padding-top: 15px; - padding-bottom: 80px; -} -.organization .head .ui.header .text { - vertical-align: middle; - font-size: 1.6rem; - margin-left: 15px; -} -.organization .head .ui.header .ui.right { - margin-top: 5px; -} -.organization.new.org form { - margin: auto; - width: 800px!important; -} -.organization.new.org form .ui.message { - text-align: center; -} -.organization.new.org form .header { - padding-left: 280px !important; -} -.organization.new.org form .inline.field > label { - text-align: right; - width: 250px !important; - word-wrap: break-word; -} -.organization.new.org form .help { - margin-left: 265px !important; -} -.organization.new.org form .optional .title { - margin-left: 250px !important; -} -.organization.new.org form input, -.organization.new.org form textarea { - width: 50%!important; -} -.organization.options input { - min-width: 300px; -} -.organization.profile #org-avatar { - width: 100px; - height: 100px; - margin-right: 15px; -} -.organization.profile #org-info .ui.header { - font-size: 36px; - margin-bottom: 0; -} -.organization.profile #org-info .desc { - font-size: 16px; - margin-bottom: 10px; -} -.organization.profile #org-info .meta .item { - display: inline-block; - margin-right: 10px; -} -.organization.profile #org-info .meta .item .icon { - margin-right: 5px; -} -.organization.profile .ui.top.header .ui.right { - margin-top: 0; -} -.organization.profile .teams .item { - padding: 10px 15px; -} -.organization.teams .members .ui.avatar, -.organization.profile .members .ui.avatar { - width: 48px; - height: 48px; - margin-right: 5px; -} -.organization.invite #invite-box { - margin: auto; - margin-top: 50px; - width: 500px !important; -} -.organization.invite #invite-box #search-user-box input { - margin-left: 0; - width: 300px; -} -.organization.invite #invite-box .ui.button { - margin-left: 5px; - margin-top: -3px; -} -.organization.members .list .item { - margin-left: 0; - margin-right: 0; - border-bottom: 1px solid #eee; -} -.organization.members .list .item .ui.avatar { - width: 48px; - height: 48px; -} -.organization.members .list .item .meta { - line-height: 24px; -} -.organization.teams .detail .item { - padding: 10px 15px; -} -.organization.teams .detail .item:not(:last-child) { - border-bottom: 1px solid #eee; -} -.organization.teams .repositories .item, -.organization.teams .members .item { - padding: 10px 20px; - line-height: 32px; -} -.organization.teams .repositories .item:not(:last-child), -.organization.teams .members .item:not(:last-child) { - border-bottom: 1px solid #DDD; -} -.organization.teams .repositories .item .button, -.organization.teams .members .item .button { - padding: 9px 10px; -} -.organization.teams #add-repo-form input, -.organization.teams #add-member-form input { - margin-left: 0; -} -.organization.teams #add-repo-form .ui.button, -.organization.teams #add-member-form .ui.button { - margin-left: 5px; - margin-top: -3px; -} -.user:not(.icon) { - 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; -} -.user.profile .ui.card .extra.content { - padding: 0; -} -.user.profile .ui.card .extra.content ul { - margin: 0; - padding: 0; -} -.user.profile .ui.card .extra.content ul li { - padding: 10px; - list-style: none; -} -.user.profile .ui.card .extra.content ul li:not(:last-child) { - border-bottom: 1px solid #eaeaea; -} -.user.profile .ui.card .extra.content ul li .octicon { - margin-left: 1px; - margin-right: 5px; -} -.user.profile .ui.card .extra.content ul li.follow .ui.button { - width: 100%; -} -.user.profile .ui.repository.list { - margin-top: 25px; -} -.user.followers .header.name { - font-size: 20px; - line-height: 24px; - vertical-align: middle; -} -.user.followers .follow .ui.button { - padding: 8px 15px; -} -.dashboard { - padding-top: 15px; - padding-bottom: 80px; -} -.dashboard.feeds .context.user.menu, -.dashboard.issues .context.user.menu { - z-index: 101; - min-width: 200px; -} -.dashboard.feeds .context.user.menu .ui.header, -.dashboard.issues .context.user.menu .ui.header { - font-size: 1rem; - text-transform: none; -} -.dashboard.feeds .filter.menu .item, -.dashboard.issues .filter.menu .item { - text-align: left; -} -.dashboard.feeds .filter.menu .item .text, -.dashboard.issues .filter.menu .item .text { - height: 16px; - vertical-align: middle; -} -.dashboard.feeds .filter.menu .item .text.truncate, -.dashboard.issues .filter.menu .item .text.truncate { - width: 85%; -} -.dashboard.feeds .filter.menu .item .floating.label, -.dashboard.issues .filter.menu .item .floating.label { - top: 7px; - left: 90%; - width: 15%; -} -.dashboard.feeds .filter.menu .jump.item, -.dashboard.issues .filter.menu .jump.item { - margin: 1px; - padding-right: 0; -} -.dashboard.feeds .filter.menu .menu, -.dashboard.issues .filter.menu .menu { - max-height: 300px; - overflow-x: auto; - right: 0!important; - left: auto!important; -} -.dashboard.feeds .ui.right .head.menu, -.dashboard.issues .ui.right .head.menu { - margin-top: -5px; -} -.dashboard.feeds .ui.right .head.menu .item.active, -.dashboard.issues .ui.right .head.menu .item.active { - color: #d9453d; -} -.feeds .news > .ui.grid { - margin-left: auto; - margin-right: auto; -} -.feeds .news .ui.avatar { - margin-top: 13px; -} -.feeds .news p { - line-height: 1em; -} -.feeds .news .time-since { - font-size: 13px; -} -.feeds .news .issue.title { - line-height: 1.1em; - width: 80%; -} -.feeds .news .push.news .content ul { - font-size: 13px; - list-style: none; - padding-left: 10px; -} -.feeds .news .push.news .content ul img { - margin-bottom: -2px; -} -.feeds .news .push.news .content ul .text.truncate { - width: 80%; - margin-bottom: -5px; -} -.feeds .news .commit-id { - font-family: Consolas, monospace; -} -.feeds .news code { - padding: 1px; - font-size: 85%; - background-color: rgba(0, 0, 0, 0.04); - border-radius: 3px; - word-break: break-all; -} -.feeds .list .header .ui.label { - margin-top: -4px; - padding: 4px 5px; - font-weight: normal; -} -.feeds .list .header .plus.icon { - margin-top: 5px; -} -.feeds .list ul { - list-style: none; - margin: 0; - padding-left: 0; -} -.feeds .list ul li:not(:last-child) { - border-bottom: 1px solid #EAEAEA; -} -.feeds .list ul li.private { - background-color: #fcf8e9; -} -.feeds .list ul li a { - padding: 6px 1.2em; - display: block; -} -.feeds .list ul li a .octicon { - color: #888; -} -.feeds .list ul li a .octicon.rear { - font-size: 15px; -} -.feeds .list ul li a .star-num { - font-size: 12px; -} -.feeds .list .repo-owner-name-list .item-name { - max-width: 70%; - margin-bottom: -4px; -} -.feeds .list #collaborative-repo-list .owner-and-repo { - max-width: 80%; - margin-bottom: -5px; -} -.feeds .list #collaborative-repo-list .owner-name { - max-width: 120px; - margin-bottom: -5px; -} -.admin { - padding-top: 15px; - padding-bottom: 80px; -} -.admin .table.segment { - padding: 0; - font-size: 13px; -} -.admin .table.segment:not(.striped) { - padding-top: 5px; -} -.admin .table.segment:not(.striped) thead th:last-child { - padding-right: 5px !important; -} -.admin .table.segment th { - padding-top: 5px; - padding-bottom: 5px; -} -.admin .table.segment:not(.select) th:first-of-type, -.admin .table.segment:not(.select) td:first-of-type { - padding-left: 15px !important; -} -.admin .ui.header, -.admin .ui.segment { - box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15); -} -.admin.user .email { - max-width: 200px; -} -.admin dl.admin-dl-horizontal { - padding: 20px; - margin: 0; -} -.admin dl.admin-dl-horizontal dd { - margin-left: 240px; -} -.admin dl.admin-dl-horizontal dt { - font-weight: bolder; - float: left; - width: 250px; - clear: left; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.admin.config #test-mail-btn { - margin-left: 5px; -} -.explore { - padding-top: 15px; - padding-bottom: 80px; -} -.explore .navbar .octicon { - width: 16px; - text-align: center; -} -.ui.repository.list .item { - padding-bottom: 25px; -} -.ui.repository.list .item:not(:first-child) { - border-top: 1px solid #eee; - padding-top: 25px; -} -.ui.repository.list .item .ui.header { - font-size: 1.5rem; - padding-bottom: 10px; -} -.ui.repository.list .item .ui.header .name { - word-break: break-all; -} -.ui.repository.list .item .ui.header .metas { - color: #888; - font-size: 14px; - font-weight: normal; -} -.ui.repository.list .item .ui.header .metas span:not(:last-child) { - margin-right: 5px; -} -.ui.repository.list .item .time { - font-size: 12px; - color: #808080; -} -.ui.user.list .item { - padding-bottom: 25px; -} -.ui.user.list .item:not(:first-child) { - border-top: 1px solid #eee; - padding-top: 25px; -} -.ui.user.list .item .ui.avatar.image { - width: 40px; - height: 40px; -} -.ui.user.list .item .description { - margin-top: 5px; -} -.ui.user.list .item .description .octicon:not(:first-child) { - margin-left: 5px; -} -.ui.user.list .item .description a { - color: #333; -} -.ui.user.list .item .description a:hover { - text-decoration: underline; -} diff --git a/public/css/gogs.min.css b/public/css/gogs.min.css new file mode 100644 index 00000000000..98b069107b9 --- /dev/null +++ b/public/css/gogs.min.css @@ -0,0 +1 @@ +.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body:not(.full-width){font-family:"Helvetica Neue","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;overflow-x:auto;min-width:1020px}.ui.container:not(.fluid){width:980px!important}.ui.button:not(.label),.ui.header,.ui.input input,.ui.menu,h1,h2,h3,h4,h5{font-family:"Helvetica Neue","Microsoft YaHei",Arial,Helvetica,sans-serif!important}img{border-radius:3px}code,pre{font-family:Consolas,Liberation Mono,Menlo,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;word-break:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -80px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%}.following.bar.light{background-color:#fff;border-bottom:1px solid #ddd;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0;padding-right:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .icon,.following.bar .octicon{margin-right:5px!important}.following.bar .head.link.item{padding-right:0!important}.following.bar .avatar>.ui.image{margin-right:0}.following.bar .avatar .octicon-triangle-down{margin-top:6.5px}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}.following.bar .right.menu .menu{left:auto;right:0}.following.bar .right.menu .dropdown .menu{margin-top:0}.ui.left{float:left}.ui.right{float:right}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.form .box.field{padding-left:27px}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#e67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#fbbd08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#f9edbe!important;border-color:#f0c36d}.ui .warning.segment{border-color:#f0c36d}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Liberation Mono,Menlo,monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{margin-top:54px!important;height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.display.inline{display:inline}.center{text-align:center}.no-padding-left{padding-left:0!important}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}.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}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.image,.ui.dropdown>.text>img{vertical-align:middle;margin-top:0;margin-bottom:0}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:16px}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) img[align=left]{margin-right:10px}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.home{padding-bottom:80px}.home .logo{margin-bottom:20px}.home .hero h1{font-size:4.5em}.home .hero h2{margin-top:0;font-size:2em}.home .hero .octicon{color:#d9453d;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#d9453d}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:300px!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:320px!important}.install .ui.checkbox{margin-left:335px!important}.install .ui.checkbox label{width:auto!important}.install .inline.checkbox{margin-top:-1em;margin-bottom:2em}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block;word-break:break-word}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto;width:800px!important}#create-page-form form .ui.message{text-align:center}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto;width:800px!important}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:230px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.user.signin.two-factor form{width:300px!important}.user.signin.two-factor form .header{padding-left:inherit!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto;width:800px!important}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}.repository.new.repo .ui.form #auto-init{margin-left:265px!important}.new.webhook form .text.desc{margin-top:5px}.new.webhook form .help{margin-left:25px}.new.webhook form .events .column{padding-bottom:0}.new.webhook form .events .help{font-size:13px;margin-left:26px;padding-top:0}.new.webhook .events.fields .column{padding-left:40px}.repository{padding-top:15px;padding-bottom:80px}.repository .head .column{padding-top:5px!important;padding-bottom:5px!important}.repository .head .ui.compact.menu{margin-left:1rem}.repository .head .ui.header{margin-top:0}.repository .head .mega-octicon{width:30px;font-size:30px}.repository .head .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .head .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .head .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .header-wrapper{background-color:#fafafa;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 10px}.repository .filter.menu .octicon{float:left;margin-left:-5px;margin-right:-7px;width:16px}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{margin-top:-8px;margin-left:5px;width:auto}.repository #clone-panel input{border-radius:0;padding:5px 10px;max-width:190px;width:190px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.branches:not(.settings) .ui.list{padding:0}.repository.branches:not(.settings) .ui.list>.item{margin:0;line-height:31px}.repository.branches:not(.settings) .ui.list>.item:not(:last-child){border-bottom:1px solid #ddd}.repository.branches:not(.settings) .ui.list>.item .column{padding:5px 15px}.repository.branches:not(.settings) .ui.list>.item .column .octicon{vertical-align:text-bottom}.repository.branches:not(.settings) .ui.list>.item .column code{padding:4px 0;font-size:12px}.repository.branches:not(.settings) .ui.list>.item .column .ui.text:not(i){font-size:12px}.repository.branches:not(.settings) .ui.list>.item .column .ui.button{font-size:12px;padding:8px 10px}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #git-stats{padding:10px;line-height:0}.repository.file.list #git-stats .list{width:100%}.repository.file.list #git-stats .list .item{margin-left:0;width:33.33%}.repository.file.list #git-stats .list .item .text b{font-size:15px}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table tr:hover{background-color:#ffe}.repository.file.list #file-content .header .octicon{padding-right:5px}.repository.file.list #file-content .header .icon{font-size:1em;margin-top:-2px}.repository.file.list #file-content .header .file-actions{padding-left:20px}.repository.file.list #file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list #file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list #file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list #file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list #file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list #file-content .view-raw{padding:5px}.repository.file.list #file-content .view-raw *{max-width:100%}.repository.file.list #file-content .view-raw img{margin-bottom:-5px}.repository.file.list #file-content #ipython-notebook{margin-left:95px;padding-top:1px}.repository.file.list #file-content #ipython-notebook .nb-notebook{line-height:1.5}.repository.file.list #file-content #ipython-notebook .nb-stderr,.repository.file.list #file-content #ipython-notebook .nb-stdout{white-space:pre-wrap;margin:1em 0;padding:.1em .5em}.repository.file.list #file-content #ipython-notebook .nb-stderr{background-color:#faa}.repository.file.list #file-content #ipython-notebook .nb-cell+.nb-cell{margin-top:.5em}.repository.file.list #file-content #ipython-notebook .nb-cell{position:relative}.repository.file.list #file-content #ipython-notebook .nb-cell.nb-heading-cell{margin-top:.5em}.repository.file.list #file-content #ipython-notebook .nb-cell img{max-width:100%}.repository.file.list #file-content #ipython-notebook .nb-raw-cell{white-space:pre-wrap;background-color:#f5f2f0;font-family:Consolas,Liberation Mono,Menlo,monospace;padding:1em;margin:.5em 0}.repository.file.list #file-content #ipython-notebook .nb-input:before,.repository.file.list #file-content #ipython-notebook .nb-output:before{position:absolute;font-family:monospace;color:#999;left:-7.5em;width:7em;text-align:right}.repository.file.list #file-content #ipython-notebook .nb-input:before{content:"In [" attr(data-prompt-number) "]:"}.repository.file.list #file-content #ipython-notebook .nb-input pre{background-color:#f7f7f7;margin-right:10px;padding:5px 10px}.repository.file.list #file-content #ipython-notebook .nb-input pre code{min-height:18px;line-height:18px;font-size:14px}.repository.file.list #file-content #ipython-notebook .nb-output:before{content:"Out [" attr(data-prompt-number) "]:"}.repository.file.list #file-content #ipython-notebook .nb-output pre{padding:5px 10px;font-size:14px}.repository.file.list #file-content #ipython-notebook .nb-output img{max-width:100%}.repository.file.list #file-content #ipython-notebook .nb-output table{border:1px solid #000;border-collapse:collapse}.repository.file.list #file-content #ipython-notebook .nb-output th{font-weight:700}.repository.file.list #file-content #ipython-notebook .nb-output td,.repository.file.list #file-content #ipython-notebook .nb-output th{border:1px solid #000;padding:.25em;text-align:left;vertical-align:middle;border-collapse:collapse}.repository.file.list #file-content #ipython-notebook .nb-markdown-cell{margin-top:10px;margin-right:10px;padding:10px}.repository.file.list #file-content #ipython-notebook div[style="max-height:1000px;max-width:1500px;overflow:auto;"]{max-height:none!important}.repository.file.list #file-content .plain-text{font-size:14px;padding:15px 15px 10px 15px;font-family:Consolas}.repository.file.list #file-content .code-view *{font-size:12px;font-family:Consolas,Liberation Mono,Menlo,monospace;line-height:20px}.repository.file.list #file-content .code-view table{width:100%}.repository.file.list #file-content .code-view table tbody tr{padding:0!important}.repository.file.list #file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:42px}.repository.file.list #file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list #file-content .code-view .lines-code,.repository.file.list #file-content .code-view .lines-num{display:table-cell!important;padding:0!important}.repository.file.list #file-content .code-view .lines-code .hljs,.repository.file.list #file-content .code-view .lines-code ol,.repository.file.list #file-content .code-view .lines-code pre,.repository.file.list #file-content .code-view .lines-num .hljs,.repository.file.list #file-content .code-view .lines-num ol,.repository.file.list #file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list #file-content .code-view .lines-code .hljs li,.repository.file.list #file-content .code-view .lines-code ol li,.repository.file.list #file-content .code-view .lines-code pre li,.repository.file.list #file-content .code-view .lines-num .hljs li,.repository.file.list #file-content .code-view .lines-num ol li,.repository.file.list #file-content .code-view .lines-num pre li{display:inline-block;width:100%;padding-left:5px}.repository.file.list #file-content .code-view .lines-code .hljs li.active,.repository.file.list #file-content .code-view .lines-code ol li.active,.repository.file.list #file-content .code-view .lines-code pre li.active,.repository.file.list #file-content .code-view .lines-num .hljs li.active,.repository.file.list #file-content .code-view .lines-num ol li.active,.repository.file.list #file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#d4d4d5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,Liberation Mono,Menlo,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#d4d4d5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166e6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .pull .merge.box #commit_description{height:auto}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content .header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content .header:after,.repository.view.issue .comment-list .comment .content .header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content .header:before{border-right-color:#d4d4d5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content .header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content .header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:" ";display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:" ";display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:8vw;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,Liberation Mono,Menlo,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#d4d4d5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,Liberation Mono,Menlo,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #aaa}.repository .label.list>.item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list>.item a:hover{color:#000}.repository .label.list>.item a.open-issues{margin-right:30px}.repository .label.list>.item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #aaa}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#d4d4d5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.diff .commit-message pre{white-space:pre-wrap}.repository.commits .header .ui.right .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{font-size:13px;padding:6px 40px 4px 35px}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #ddd;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-box .count{margin-right:12px;font-size:13px}.repository .diff-box .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .file{color:#888}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#a7a7a7;background:#fafafa;width:1%}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #ddd}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-right:1px solid #d4d4d5;padding:0 5px;user-select:none}.repository .diff-file-box .code-diff .lines-num::before{content:attr(data-line-number);font:Consolas,Liberation Mono,Menlo,monospace}.repository .diff-file-box .code-diff .lines-num.lines-num-new,.repository .diff-file-box .code-diff .lines-num.lines-num-old{cursor:pointer}.repository .diff-file-box .code-diff .lines-num.lines-num-new:hover,.repository .diff-file-box .code-diff .lines-num.lines-num-old:hover{color:#383636}.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#f0f0f0!important;border-color:#d2cece!important;padding-top:4px;padding-bottom:4px}.repository .diff-file-box .code-diff tbody tr.tag-code td.halfwidth{width:50%}.repository .diff-file-box .code-diff tbody tr.same-code td.active{background-color:#ffd!important}.repository .diff-file-box .code-diff tbody tr.del-code td.add-code{background-color:#eaffea!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff tbody tr.del-code td.add-code pre{background-color:#eaffea!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff tbody tr.del-code td{background-color:#ffecec!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff tbody tr.del-code td.active{background-color:#ffd!important}.repository .diff-file-box .code-diff tbody tr.del-code td.halfwidth{width:50%}.repository .diff-file-box .code-diff tbody tr.add-code td{background-color:#eaffea!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff tbody tr.add-code td.halfwidth{width:50%}.repository .diff-file-box .code-diff tbody tr.add-code td.active{background-color:#ffd!important}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .code-view table{width:100%;border-spacing:0}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #ddd;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:6px}.repository.release #release-list>li .meta .commit{display:block;margin-top:6px}.repository.release #release-list>li .detail{border-left:1px solid #ddd}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #fff}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #ddd}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,Liberation Mono,Menlo,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view .markdown{padding-left:25px;margin-left:-25px}.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{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #ddd}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhooks .types .menu .item{padding:10px!important}.repository.settings.webhooks .logo.item img{margin-top:-4px}.webhook .hook.history.list .right.menu .redelivery.button{font-size:12px;margin-top:6px;height:30px}.webhook .hook.history.list .right.menu .redelivery.button .octicon{font:normal normal normal 13px/1 Octicons;width:12px}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results,#search-user-box .results{padding:0;position:absolute}#search-repo-box .results .item,#search-user-box .results .item{padding:10px 15px;border-bottom:1px solid #ddd;cursor:pointer}#search-repo-box .results .item:hover,#search-user-box .results .item:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}#search-repo-box .results .item img,#search-user-box .results .item img{margin-right:8px}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #aaa}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087f7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .key.list .item:not(:first-child){border-top:1px solid #eaeaea}.settings .key.list .ssh-key-state-indicator{float:left;color:gray;padding-left:10px;padding-top:10px}.settings .key.list .ssh-key-state-indicator.active{color:#6cc644}.settings .key.list .meta{padding-top:5px}.settings .key.list .print{color:#767676}.settings .key.list .activity{color:#666}.settings .hook.list>.item:not(:last-child){border-bottom:1px solid #eaeaea}.settings .hook.list .item{padding:10px 0}.settings .hook.list .item .fa,.settings .hook.list .item .octicon{width:20px;text-align:center}.settings .hook.list .item a{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.settings .hook.history.list .item{padding:10px 20px}.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{margin-top:10px}.settings .hook.history.list .item .info .tabular.menu .item{font-weight:500}.settings .hook.history.list .item .info .tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none}.settings .hook.history.list .item .info .tab.segment>*{color:#666}.settings .hook.history.list .item .info .tab.segment pre{word-wrap:break-word}.settings .hook.history.list .item .info .tab.segment pre .hljs{padding:0;background-color:inherit}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#d4d4d5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto;width:800px!important}.organization.new.org form .ui.message{text-align:center}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){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.settings .email.list .item .ui.primary.label{margin-top:-5px}.user.settings.applications .right.floated.button,.user.settings.sshkeys .right.floated.button{padding-top:1rem;padding-bottom:1rem}.user.settings.security .two-factor .toggle.button{margin-top:-5px}.user.settings.repositories .repos{padding:0}.user.settings.repositories .repos .item{padding:15px;height:46px}.user.settings.repositories .repos .item .button{margin-top:-5px}.user.settings.organizations .orgs.non-empty{padding:0}.user.settings.organizations .orgs .item{padding:10px}.user.settings.organizations .orgs .item .button{margin-top:5px;margin-right:8px}.user.profile .ui.card .profile-avatar{height:287px}.user.profile .ui.card .header{word-break:break-all}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .ui.right .head.menu,.dashboard.issues .ui.right .head.menu{margin-top:-5px}.dashboard.feeds .ui.right .head.menu .item.active,.dashboard.issues .ui.right .head.menu .item.active{color:#d9453d}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em;overflow-wrap:break-word}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{line-height:1.1em;width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:0}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:60%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:3px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin code{color:#db2828}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:10px 15px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:240px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:250px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.admin.config table tbody tr td:first-child{font-weight:700}.admin.config pre{background-color:#f7f7f7;padding:5px}.admin.config .log-config table tbody tr td:first-child{width:100px}.admin.config .log-config table tbody tr td:last-child pre{width:600px;overflow-y:auto}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar .octicon{width:16px;text-align:center}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline}/*# sourceMappingURL=gogs.min.css.map */ \ No newline at end of file diff --git a/public/css/gogs.min.css.map b/public/css/gogs.min.css.map new file mode 100644 index 00000000000..d12cb2faa27 --- /dev/null +++ b/public/css/gogs.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../less/_emojify.less","../less/_base.less","../less/_form.less","../less/_markdown.less","../less/_home.less","../less/_install.less","../less/_repository.less","../less/_editor.less","../less/_organization.less","../less/_user.less","../less/_dashboard.less","../less/_admin.less","../less/_explore.less"],"names":[],"mappings":"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"} \ 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 89a49ec56da..00000000000 --- 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,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) 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/semantic-2.4.2.min.css b/public/css/semantic-2.4.2.min.css new file mode 100644 index 00000000000..f0eb312382f --- /dev/null +++ b/public/css/semantic-2.4.2.min.css @@ -0,0 +1,372 @@ + /* + * # Semantic UI - 2.4.2 + * 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 + * + */ +/*! + * # Semantic UI 2.4.2 - Reset + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}html{-webkit-box-sizing:border-box;box-sizing:border-box}input[type=email],input[type=password],input[type=search],input[type=text]{-webkit-appearance:none;-moz-appearance:none}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}/*! + * # Semantic UI 2.4.2 - Site + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */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.28571429em;margin:calc(2rem - .14285714em) 0 1rem;font-weight:700;padding:0}h1{min-height:1rem;font-size:2rem}h2{font-size:1.71428571rem}h3{font-size:1.28571429rem}h4{font-size:1.07142857rem}h5{font-size:1rem}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child{margin-bottom:0}p{margin:0 0 1em;line-height:1.4285em}p:first-child{margin-top:0}p:last-child{margin-bottom:0}a{color:#4183c4;text-decoration:none}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)}body ::-webkit-scrollbar{-webkit-appearance:none;width:10px;height:10px}body ::-webkit-scrollbar-track{background:rgba(0,0,0,.1);border-radius:0}body ::-webkit-scrollbar-thumb{cursor:pointer;border-radius:5px;background:rgba(0,0,0,.25);-webkit-transition:color .2s ease;transition:color .2s ease}body ::-webkit-scrollbar-thumb:window-inactive{background:rgba(0,0,0,.15)}body ::-webkit-scrollbar-thumb:hover{background:rgba(128,135,139,.8)}body .ui.inverted::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}body .ui.inverted::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}body .ui.inverted::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}body .ui.inverted::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}/*! + * # Semantic UI 2.4.2 - Button + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.button{cursor:pointer;display:inline-block;min-height:1em;outline:0;border:none;vertical-align:baseline;background:#e0e1e2 none;color:rgba(0,0,0,.6);font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0 .25em 0 0;padding:.78571429em 1.5em .78571429em;text-transform:none;text-shadow:none;font-weight:700;line-height:1em;font-style:normal;text-align:center;text-decoration:none;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;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,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;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,-webkit-box-shadow .1s ease;will-change:'';-webkit-tap-highlight-color:transparent}.ui.button:hover{background-color:#cacbcd;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;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;-webkit-box-shadow:''!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);-webkit-box-shadow:0 0 0 1px transparent inset,none;box-shadow:0 0 0 1px transparent inset,none}.ui.active.button{background-color:#c0c1c2;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset;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;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.labeled.icon.loading.button .icon{background-color:transparent;-webkit-box-shadow:none;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;-webkit-box-shadow: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}.ui.animated.button .hidden.content{position:absolute;width:100%}.ui.animated.button .hidden.content,.ui.animated.button .visible.content{-webkit-transition:right .3s ease 0s;transition:right .3s ease 0s}.ui.animated.button .visible.content{left:auto;right:0}.ui.animated.button .hidden.content{top:50%;left:auto;right:-100%;margin-top:-.5em}.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{-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important;background:transparent none;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 0}.ui.inverted.vertical.buttons .button:first-child{margin-top:0}.ui.inverted.button:hover{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important;color:rgba(0,0,0,.8)}.ui.inverted.button.active,.ui.inverted.button:focus{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important;color:rgba(0,0,0,.8)}.ui.inverted.button.active:focus{background:#dcddde;-webkit-box-shadow:0 0 0 2px #dcddde inset!important;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:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background:0 0!important;padding:0!important;border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.labeled.button>.button{margin:0}.ui.labeled.button>.label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align: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{border-top-left-radius:0;border-bottom-left-radius:0}.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;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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:#55acee;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.twitter.button:hover{background-color:#35a2f4;color:#fff;text-shadow:none}.ui.twitter.button:active{background-color:#2795e9;color:#fff;text-shadow:none}.ui.google.plus.button{background-color:#dd4b39;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.google.plus.button:hover{background-color:#e0321c;color:#fff;text-shadow:none}.ui.google.plus.button:active{background-color:#c23321;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:red;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.youtube.button:hover{background-color:#e60000;color:#fff;text-shadow:none}.ui.youtube.button:active{background-color:#c00;color:#fff;text-shadow:none}.ui.instagram.button{background-color:#49769c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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:#bd081c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pinterest.button:hover{background-color:#ac0013;color:#fff;text-shadow:none}.ui.pinterest.button:active{background-color:#8c0615;color:#fff;text-shadow:none}.ui.vk.button{background-color:#4d7198;color:#fff;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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):not(.dropdown){margin:0 .42857143em 0 -.21428571em}.ui.button:not(.icon)>.right.icon:not(.button):not(.dropdown){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 .58928571em}.ui.compact.icon.button,.ui.compact.icon.buttons .button{padding:.58928571em .58928571em .58928571em}.ui.compact.labeled.icon.button,.ui.compact.labeled.icon.buttons .button{padding:.58928571em 3.69642857em .58928571em}.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 .78571429em .78571429em}.ui.icon.button>.icon,.ui.icon.buttons .button>.icon{opacity:.9;margin:0!important;vertical-align:top}.ui.basic.button,.ui.basic.buttons .button{background:transparent none!important;color:rgba(0,0,0,.6)!important;font-weight:400;border-radius:.28571429rem;text-transform:none;text-shadow:none!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.basic.buttons{-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem}.ui.basic.buttons .button{border-radius:0}.ui.basic.button:hover,.ui.basic.buttons .button:hover{background:#fff!important;color:rgba(0,0,0,.8)!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;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:focus,.ui.basic.buttons .button:focus{background:#fff!important;color:rgba(0,0,0,.8)!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;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;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset;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;-webkit-box-shadow:''!important;box-shadow:''!important;color:rgba(0,0,0,.95)!important}.ui.basic.active.button:hover,.ui.basic.buttons .active.button:hover{background-color:rgba(0,0,0,.05)}.ui.basic.buttons .button:hover{-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset;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{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset;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{-webkit-box-shadow:''!important;box-shadow:''!important}.ui.basic.inverted.button,.ui.basic.inverted.buttons .button{background-color:transparent!important;color:#f9fafb!important;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important}.ui.basic.inverted.button:hover,.ui.basic.inverted.buttons .button:hover{color:#fff!important;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important}.ui.basic.inverted.button:focus,.ui.basic.inverted.buttons .button:focus{color:#fff!important;-webkit-box-shadow:0 0 0 2px #fff inset!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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.9) inset!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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.7) inset;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);-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important}.ui.basic.buttons .button{border-left:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.vertical.buttons .button{border-left:none}.ui.basic.vertical.buttons .button{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:'';-webkit-box-shadow:-1px 0 0 0 transparent inset;box-shadow:-1px 0 0 0 transparent inset}.ui.labeled.icon.button>.icon,.ui.labeled.icon.buttons>.button>.icon{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;-webkit-box-shadow:1px 0 0 0 transparent inset;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:0;border-top-left-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:last-child>.icon{border-radius:0;border-bottom-left-radius:.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;-webkit-box-shadow:none!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;-webkit-box-shadow:0 0 0 1px transparent inset;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;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15)!important;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:-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{border-radius:0}.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 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 0}.ui[class*="left attached"].buttons{display:-webkit-inline-box;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 0}.ui[class*="right attached"].buttons{display:-webkit-inline-box;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 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:-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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #1b1c1d inset!important;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;-webkit-box-shadow:0 0 0 1px #27292a inset!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;-webkit-box-shadow:0 0 0 1px #2f3032 inset!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;-webkit-box-shadow:0 0 0 1px #0f0f10 inset!important;box-shadow:0 0 0 1px #0f0f10 inset!important;color:#343637!important}.ui.basic.black.button:active,.ui.basic.black.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset!important;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;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset!important;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{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button:hover{background-color:#000}.ui.inverted.black.button:focus,.ui.inverted.black.buttons .button:focus{background-color:#000}.ui.inverted.black.active.button,.ui.inverted.black.buttons .active.button{background-color:#000}.ui.inverted.black.button:active,.ui.inverted.black.buttons .button:active{background-color:#000}.ui.inverted.black.basic.button,.ui.inverted.black.basic.buttons .button,.ui.inverted.black.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #000 inset!important;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{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#545454!important}.ui.inverted.black.basic.active.button,.ui.inverted.black.basic.buttons .active.button,.ui.inverted.black.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#fff!important}.ui.inverted.black.basic.button:active,.ui.inverted.black.basic.buttons .button:active,.ui.inverted.black.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #000 inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #767676 inset!important;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;-webkit-box-shadow:0 0 0 1px #838383 inset!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;-webkit-box-shadow:0 0 0 1px #8a8a8a inset!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;-webkit-box-shadow:0 0 0 1px #696969 inset!important;box-shadow:0 0 0 1px #696969 inset!important;color:#909090!important}.ui.basic.grey.button:active,.ui.basic.grey.buttons .button:active{-webkit-box-shadow:0 0 0 1px #909090 inset!important;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;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #cfd0d2 inset!important;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{-webkit-box-shadow:0 0 0 2px #c7c9cb inset!important;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{-webkit-box-shadow:0 0 0 2px #cfd0d2 inset!important;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{-webkit-box-shadow:0 0 0 2px #c2c4c5 inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #a5673f inset!important;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;-webkit-box-shadow:0 0 0 1px #975b33 inset!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;-webkit-box-shadow:0 0 0 1px #90532b inset!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;-webkit-box-shadow:0 0 0 1px #995a31 inset!important;box-shadow:0 0 0 1px #995a31 inset!important;color:#805031!important}.ui.basic.brown.button:active,.ui.basic.brown.buttons .button:active{-webkit-box-shadow:0 0 0 1px #805031 inset!important;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;-webkit-box-shadow:0 0 0 2px #d67c1c inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #c86f11 inset!important;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{-webkit-box-shadow:0 0 0 2px #c16808 inset!important;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{-webkit-box-shadow:0 0 0 2px #cc6f0d inset!important;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{-webkit-box-shadow:0 0 0 2px #a96216 inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #2185d0 inset!important;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;-webkit-box-shadow:0 0 0 1px #1678c2 inset!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;-webkit-box-shadow:0 0 0 1px #0d71bb inset!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;-webkit-box-shadow:0 0 0 1px #1279c6 inset!important;box-shadow:0 0 0 1px #1279c6 inset!important;color:#1a69a4!important}.ui.basic.blue.button:active,.ui.basic.blue.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset!important;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;-webkit-box-shadow:0 0 0 2px #54c8ff inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;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{-webkit-box-shadow:0 0 0 2px #2bbbff inset!important;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{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;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{-webkit-box-shadow:0 0 0 2px #21b8ff inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #21ba45 inset!important;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;-webkit-box-shadow:0 0 0 1px #16ab39 inset!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;-webkit-box-shadow:0 0 0 1px #0ea432 inset!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;-webkit-box-shadow:0 0 0 1px #13ae38 inset!important;box-shadow:0 0 0 1px #13ae38 inset!important;color:#198f35!important}.ui.basic.green.button:active,.ui.basic.green.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset!important;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;-webkit-box-shadow:0 0 0 2px #2ecc40 inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #22be34 inset!important;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{-webkit-box-shadow:0 0 0 2px #19b82b inset!important;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{-webkit-box-shadow:0 0 0 2px #1fc231 inset!important;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{-webkit-box-shadow:0 0 0 2px #25a233 inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #f2711c inset!important;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;-webkit-box-shadow:0 0 0 1px #f26202 inset!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;-webkit-box-shadow:0 0 0 1px #e55b00 inset!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;-webkit-box-shadow:0 0 0 1px #f56100 inset!important;box-shadow:0 0 0 1px #f56100 inset!important;color:#cf590c!important}.ui.basic.orange.button:active,.ui.basic.orange.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cf590c inset!important;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;-webkit-box-shadow:0 0 0 2px #ff851b inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #ff7701 inset!important;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{-webkit-box-shadow:0 0 0 2px #f17000 inset!important;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{-webkit-box-shadow:0 0 0 2px #ff7701 inset!important;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{-webkit-box-shadow:0 0 0 2px #e76b00 inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #e03997 inset!important;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;-webkit-box-shadow:0 0 0 1px #e61a8d inset!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;-webkit-box-shadow:0 0 0 1px #e10f85 inset!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;-webkit-box-shadow:0 0 0 1px #ea158d inset!important;box-shadow:0 0 0 1px #ea158d inset!important;color:#c71f7e!important}.ui.basic.pink.button:active,.ui.basic.pink.buttons .button:active{-webkit-box-shadow:0 0 0 1px #c71f7e inset!important;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;-webkit-box-shadow:0 0 0 2px #ff8edf inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #ff74d8 inset!important;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{-webkit-box-shadow:0 0 0 2px #ff65d3 inset!important;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{-webkit-box-shadow:0 0 0 2px #ff74d8 inset!important;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{-webkit-box-shadow:0 0 0 2px #ff5bd1 inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #6435c9 inset!important;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;-webkit-box-shadow:0 0 0 1px #5829bb inset!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;-webkit-box-shadow:0 0 0 1px #4f20b5 inset!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;-webkit-box-shadow:0 0 0 1px #5626bf inset!important;box-shadow:0 0 0 1px #5626bf inset!important;color:#502aa1!important}.ui.basic.violet.button:active,.ui.basic.violet.buttons .button:active{-webkit-box-shadow:0 0 0 1px #502aa1 inset!important;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;-webkit-box-shadow:0 0 0 2px #a291fb inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #8a73ff inset!important;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{-webkit-box-shadow:0 0 0 2px #7d64ff inset!important;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{-webkit-box-shadow:0 0 0 2px #8a73ff inset!important;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{-webkit-box-shadow:0 0 0 2px #7860f9 inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #a333c8 inset!important;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;-webkit-box-shadow:0 0 0 1px #9627ba inset!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;-webkit-box-shadow:0 0 0 1px #8f1eb4 inset!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;-webkit-box-shadow:0 0 0 1px #9724be inset!important;box-shadow:0 0 0 1px #9724be inset!important;color:#82299f!important}.ui.basic.purple.button:active,.ui.basic.purple.buttons .button:active{-webkit-box-shadow:0 0 0 1px #82299f inset!important;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;-webkit-box-shadow:0 0 0 2px #dc73ff inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #d65aff inset!important;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{-webkit-box-shadow:0 0 0 2px #d24aff inset!important;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{-webkit-box-shadow:0 0 0 2px #d65aff inset!important;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{-webkit-box-shadow:0 0 0 2px #cf40ff inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #db2828 inset!important;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;-webkit-box-shadow:0 0 0 1px #d01919 inset!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;-webkit-box-shadow:0 0 0 1px #ca1010 inset!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;-webkit-box-shadow:0 0 0 1px #d41515 inset!important;box-shadow:0 0 0 1px #d41515 inset!important;color:#b21e1e!important}.ui.basic.red.button:active,.ui.basic.red.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset!important;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;-webkit-box-shadow:0 0 0 2px #ff695e inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #ff5144 inset!important;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{-webkit-box-shadow:0 0 0 2px #ff4335 inset!important;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{-webkit-box-shadow:0 0 0 2px #ff5144 inset!important;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{-webkit-box-shadow:0 0 0 2px #ff392b inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #00b5ad inset!important;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;-webkit-box-shadow:0 0 0 1px #009c95 inset!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;-webkit-box-shadow:0 0 0 1px #008c86 inset!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;-webkit-box-shadow:0 0 0 1px #009c95 inset!important;box-shadow:0 0 0 1px #009c95 inset!important;color:#00827c!important}.ui.basic.teal.button:active,.ui.basic.teal.buttons .button:active{-webkit-box-shadow:0 0 0 1px #00827c inset!important;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;-webkit-box-shadow:0 0 0 2px #6dffff inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #54ffff inset!important;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{-webkit-box-shadow:0 0 0 2px #4ff inset!important;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{-webkit-box-shadow:0 0 0 2px #54ffff inset!important;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{-webkit-box-shadow:0 0 0 2px #3affff inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #b5cc18 inset!important;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;-webkit-box-shadow:0 0 0 1px #a7bd0d inset!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;-webkit-box-shadow:0 0 0 1px #a0b605 inset!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;-webkit-box-shadow:0 0 0 1px #aac109 inset!important;box-shadow:0 0 0 1px #aac109 inset!important;color:#8d9e13!important}.ui.basic.olive.button:active,.ui.basic.olive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #8d9e13 inset!important;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;-webkit-box-shadow:0 0 0 2px #d9e778 inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #d8ea5c inset!important;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{-webkit-box-shadow:0 0 0 2px #daef47 inset!important;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{-webkit-box-shadow:0 0 0 2px #daed59 inset!important;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{-webkit-box-shadow:0 0 0 2px #cddf4d inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #fbbd08 inset!important;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;-webkit-box-shadow:0 0 0 1px #eaae00 inset!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;-webkit-box-shadow:0 0 0 1px #daa300 inset!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;-webkit-box-shadow:0 0 0 1px #eaae00 inset!important;box-shadow:0 0 0 1px #eaae00 inset!important;color:#cd9903!important}.ui.basic.yellow.button:active,.ui.basic.yellow.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cd9903 inset!important;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;-webkit-box-shadow:0 0 0 2px #ffe21f inset!important;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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;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{-webkit-box-shadow:0 0 0 2px #ffdf05 inset!important;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{-webkit-box-shadow:0 0 0 2px #f5d500 inset!important;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{-webkit-box-shadow:0 0 0 2px #ffdf05 inset!important;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{-webkit-box-shadow:0 0 0 2px #ebcd00 inset!important;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{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #2185d0 inset!important;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;-webkit-box-shadow:0 0 0 1px #1678c2 inset!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;-webkit-box-shadow:0 0 0 1px #0d71bb inset!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;-webkit-box-shadow:0 0 0 1px #1279c6 inset!important;box-shadow:0 0 0 1px #1279c6 inset!important;color:#1a69a4!important}.ui.basic.primary.button:active,.ui.basic.primary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset!important;box-shadow:0 0 0 1px #1a69a4 inset!important;color:#1a69a4!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.inverted.primary.button,.ui.inverted.primary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #54c8ff inset!important;box-shadow:0 0 0 2px #54c8ff inset!important;color:#54c8ff}.ui.inverted.primary.button.active,.ui.inverted.primary.button:active,.ui.inverted.primary.button:focus,.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button.active,.ui.inverted.primary.buttons .button:active,.ui.inverted.primary.buttons .button:focus,.ui.inverted.primary.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button:hover{background-color:#3ac0ff}.ui.inverted.primary.button:focus,.ui.inverted.primary.buttons .button:focus{background-color:#2bbbff}.ui.inverted.primary.active.button,.ui.inverted.primary.buttons .active.button{background-color:#3ac0ff}.ui.inverted.primary.button:active,.ui.inverted.primary.buttons .button:active{background-color:#21b8ff}.ui.inverted.primary.basic.button,.ui.inverted.primary.basic.buttons .button,.ui.inverted.primary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.primary.basic.button:hover,.ui.inverted.primary.basic.buttons .button:hover,.ui.inverted.primary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.primary.basic.button:focus,.ui.inverted.primary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #2bbbff inset!important;box-shadow:0 0 0 2px #2bbbff inset!important;color:#54c8ff!important}.ui.inverted.primary.basic.active.button,.ui.inverted.primary.basic.buttons .active.button,.ui.inverted.primary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.primary.basic.button:active,.ui.inverted.primary.basic.buttons .button:active,.ui.inverted.primary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #21b8ff inset!important;box-shadow:0 0 0 2px #21b8ff inset!important;color:#54c8ff!important}.ui.secondary.button,.ui.secondary.buttons .button{background-color:#1b1c1d;color:#fff;text-shadow:none;background-image:none}.ui.secondary.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #1b1c1d inset!important;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;-webkit-box-shadow:0 0 0 1px #27292a inset!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;-webkit-box-shadow:0 0 0 1px #2e3032 inset!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;-webkit-box-shadow:0 0 0 1px #27292a inset!important;box-shadow:0 0 0 1px #27292a inset!important;color:#343637!important}.ui.basic.secondary.button:active,.ui.basic.secondary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset!important;box-shadow:0 0 0 1px #343637 inset!important;color:#343637!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.inverted.secondary.button,.ui.inverted.secondary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #545454 inset!important;box-shadow:0 0 0 2px #545454 inset!important;color:#545454}.ui.inverted.secondary.button.active,.ui.inverted.secondary.button:active,.ui.inverted.secondary.button:focus,.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button.active,.ui.inverted.secondary.buttons .button:active,.ui.inverted.secondary.buttons .button:focus,.ui.inverted.secondary.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button:hover{background-color:#616161}.ui.inverted.secondary.button:focus,.ui.inverted.secondary.buttons .button:focus{background-color:#686868}.ui.inverted.secondary.active.button,.ui.inverted.secondary.buttons .active.button{background-color:#616161}.ui.inverted.secondary.button:active,.ui.inverted.secondary.buttons .button:active{background-color:#6e6e6e}.ui.inverted.secondary.basic.button,.ui.inverted.secondary.basic.buttons .button,.ui.inverted.secondary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.secondary.basic.button:hover,.ui.inverted.secondary.basic.buttons .button:hover,.ui.inverted.secondary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #616161 inset!important;box-shadow:0 0 0 2px #616161 inset!important;color:#545454!important}.ui.inverted.secondary.basic.button:focus,.ui.inverted.secondary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #686868 inset!important;box-shadow:0 0 0 2px #686868 inset!important;color:#545454!important}.ui.inverted.secondary.basic.active.button,.ui.inverted.secondary.basic.buttons .active.button,.ui.inverted.secondary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #616161 inset!important;box-shadow:0 0 0 2px #616161 inset!important;color:#545454!important}.ui.inverted.secondary.basic.button:active,.ui.inverted.secondary.basic.buttons .button:active,.ui.inverted.secondary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #6e6e6e inset!important;box-shadow:0 0 0 2px #6e6e6e inset!important;color:#545454!important}.ui.positive.button,.ui.positive.buttons .button{background-color:#21ba45;color:#fff;text-shadow:none;background-image:none}.ui.positive.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #21ba45 inset!important;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;-webkit-box-shadow:0 0 0 1px #16ab39 inset!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;-webkit-box-shadow:0 0 0 1px #0ea432 inset!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;-webkit-box-shadow:0 0 0 1px #13ae38 inset!important;box-shadow:0 0 0 1px #13ae38 inset!important;color:#198f35!important}.ui.basic.positive.button:active,.ui.basic.positive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset!important;box-shadow:0 0 0 1px #198f35 inset!important;color:#198f35!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.negative.button,.ui.negative.buttons .button{background-color:#db2828;color:#fff;text-shadow:none;background-image:none}.ui.negative.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;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{-webkit-box-shadow:0 0 0 1px #db2828 inset!important;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;-webkit-box-shadow:0 0 0 1px #d01919 inset!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;-webkit-box-shadow:0 0 0 1px #ca1010 inset!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;-webkit-box-shadow:0 0 0 1px #d41515 inset!important;box-shadow:0 0 0 1px #d41515 inset!important;color:#b21e1e!important}.ui.basic.negative.button:active,.ui.basic.negative.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset!important;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:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;font-size:0;vertical-align:baseline;margin:0 .25em 0 0}.ui.buttons:not(.basic):not(.inverted){-webkit-box-shadow:none;box-shadow:none}.ui.buttons:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ui.buttons .button{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;margin:0;border-radius:0;margin:0}.ui.buttons:not(.basic):not(.inverted)>.button,.ui.buttons>.ui.button:not(.basic):not(.inverted){-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;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:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.vertical.buttons .button{display:block;float:none;width:100%;margin:0;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.ui.vertical.buttons .button:first-child{border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.vertical.buttons .button:last-child{margin-bottom:0;border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons .button:only-child{border-radius:.28571429rem}/*! + * # Semantic UI 2.4.2 - Container + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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{width:auto!important}.ui.relaxed.grid.container{width:auto!important}.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}.ui.text.container{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}/*! + * # Semantic UI 2.4.2 - Divider + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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}.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}.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{position:static;left:0;border-left:none;border-right:none;content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.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}.ui.divider{font-size:1rem}.ui.horizontal.divider:after,.ui.horizontal.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}@media only screen and (max-width:767px){.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{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}}/*! + * # Semantic UI 2.4.2 - Flag + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */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) no-repeat -108px -1976px;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.england:before,i.flag.gb.eng:before{background-position:0 -1690px}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.uk: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:-73px -1821px}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}/*! + * # Semantic UI 2.4.2 - Header + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.header{border:none;margin:calc(2rem - .14285714em) 0 1rem;padding:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;line-height:1.28571429em;text-transform:none;color:rgba(0,0,0,.87)}.ui.header:first-child{margin-top:-.14285714em}.ui.header:last-child{margin-bottom:0}.ui.header .sub.header{display:block;font-weight:400;padding:0;margin:0;font-size:1rem;line-height:1.2em;color:rgba(0,0,0,.6)}.ui.header>.icon{display:table-cell;opacity:1;font-size:1.5em;padding-top:0;vertical-align:middle}.ui.header .icon:only-child{display:inline-block;padding:0;margin-right:.75rem}.ui.header>.image:not(.icon),.ui.header>img{display:inline-block;margin-top:.14285714em;width:2.5em;height:auto;vertical-align:middle}.ui.header>.image:not(.icon):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.71428571rem}h3.ui.header{font-size:1.28571429rem}h4.ui.header{font-size:1.07142857rem}h5.ui.header{font-size:1rem}h1.ui.header .sub.header{font-size:1.14285714rem}h2.ui.header .sub.header{font-size:1.14285714rem}h3.ui.header .sub.header{font-size:1rem}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.71428571em}.ui.medium.header{font-size:1.28571429em}.ui.small.header{font-size:1.07142857em}.ui.tiny.header{font-size:1em}.ui.huge.header .sub.header{font-size:1.14285714rem}.ui.large.header .sub.header{font-size:1.14285714rem}.ui.header .sub.header{font-size:1rem}.ui.small.header .sub.header{font-size:1rem}.ui.tiny.header .sub.header{font-size:.92857143rem}.ui.sub.header{padding:0;margin-bottom:.14285714rem;font-weight:700;font-size:.85714286em;text-transform:uppercase;color:''}.ui.small.sub.header{font-size:.78571429em}.ui.sub.header{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{font-size:2em}.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:#545454 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#545454 linear-gradient(transparent,rgba(0,0,0,.05));-webkit-box-shadow:none;box-shadow:none;border-color:transparent}.ui.inverted.block.header{background:#545454 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#545454 linear-gradient(transparent,rgba(0,0,0,.05));-webkit-box-shadow:none;box-shadow:none}.ui.inverted.block.header{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;-webkit-box-shadow:none;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;-webkit-box-shadow:none;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.28571429em}/*! + * # Semantic UI 2.4.2 - Icon + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */@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.icon.hover{opacity:1!important}i.icon.active{opacity:1!important}i.emphasized.icon{opacity:1!important}i.disabled.icon{opacity:.45!important}i.fitted.icon{width:auto;margin:0!important}i.link.icon,i.link.icons{cursor:pointer;opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}i.link.icon:hover,i.link.icons:hover{opacity:1!important}i.circular.icon{border-radius:500em!important;line-height:1!important;padding:.5em 0!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;width:2em!important;height:2em!important}i.circular.inverted.icon{border:none;-webkit-box-shadow: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 0!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset}i.bordered.inverted.icon{border:none;-webkit-box-shadow: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;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 .top.right.corner.icon{top:0;left:auto;right:0;bottom:auto}i.icons .top.left.corner.icon{top:0;left:0;right:auto;bottom:auto}i.icons .bottom.left.corner.icon{top:auto;left:0;right:auto;bottom:0}i.icons .bottom.right.corner.icon{top:auto;left:auto;right:0;bottom:0}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.linkedin.in:before{content:"\f0e1"}i.icon.zoom.in:before{content:"\f00e"}i.icon.zoom.out:before{content:"\f010"}i.icon.sign.in:before{content:"\f2f6"}i.icon.in.cart:before{content:"\f218"}i.icon.log.out:before{content:"\f2f5"}i.icon.sign.out:before{content:"\f2f5"}i.icon.\35 00px:before{content:"\f26e"}i.icon.accessible.icon:before{content:"\f368"}i.icon.accusoft:before{content:"\f369"}i.icon.address.book:before{content:"\f2b9"}i.icon.address.card:before{content:"\f2bb"}i.icon.adjust:before{content:"\f042"}i.icon.adn:before{content:"\f170"}i.icon.adversal:before{content:"\f36a"}i.icon.affiliatetheme:before{content:"\f36b"}i.icon.algolia:before{content:"\f36c"}i.icon.align.center:before{content:"\f037"}i.icon.align.justify:before{content:"\f039"}i.icon.align.left:before{content:"\f036"}i.icon.align.right:before{content:"\f038"}i.icon.amazon:before{content:"\f270"}i.icon.amazon.pay:before{content:"\f42c"}i.icon.ambulance:before{content:"\f0f9"}i.icon.american.sign.language.interpreting:before{content:"\f2a3"}i.icon.amilia:before{content:"\f36d"}i.icon.anchor:before{content:"\f13d"}i.icon.android:before{content:"\f17b"}i.icon.angellist:before{content:"\f209"}i.icon.angle.double.down:before{content:"\f103"}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.down:before{content:"\f107"}i.icon.angle.left:before{content:"\f104"}i.icon.angle.right:before{content:"\f105"}i.icon.angle.up:before{content:"\f106"}i.icon.angrycreative:before{content:"\f36e"}i.icon.angular:before{content:"\f420"}i.icon.app.store:before{content:"\f36f"}i.icon.app.store.ios:before{content:"\f370"}i.icon.apper:before{content:"\f371"}i.icon.apple:before{content:"\f179"}i.icon.apple.pay:before{content:"\f415"}i.icon.archive:before{content:"\f187"}i.icon.arrow.alternate.circle.down:before{content:"\f358"}i.icon.arrow.alternate.circle.left:before{content:"\f359"}i.icon.arrow.alternate.circle.right:before{content:"\f35a"}i.icon.arrow.alternate.circle.up:before{content:"\f35b"}i.icon.arrow.circle.down:before{content:"\f0ab"}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.down:before{content:"\f063"}i.icon.arrow.left:before{content:"\f060"}i.icon.arrow.right:before{content:"\f061"}i.icon.arrow.up:before{content:"\f062"}i.icon.arrows.alternate:before{content:"\f0b2"}i.icon.arrows.alternate.horizontal:before{content:"\f337"}i.icon.arrows.alternate.vertical:before{content:"\f338"}i.icon.assistive.listening.systems:before{content:"\f2a2"}i.icon.asterisk:before{content:"\f069"}i.icon.asymmetrik:before{content:"\f372"}i.icon.at:before{content:"\f1fa"}i.icon.audible:before{content:"\f373"}i.icon.audio.description:before{content:"\f29e"}i.icon.autoprefixer:before{content:"\f41c"}i.icon.avianex:before{content:"\f374"}i.icon.aviato:before{content:"\f421"}i.icon.aws:before{content:"\f375"}i.icon.backward:before{content:"\f04a"}i.icon.balance.scale:before{content:"\f24e"}i.icon.ban:before{content:"\f05e"}i.icon.band.aid:before{content:"\f462"}i.icon.bandcamp:before{content:"\f2d5"}i.icon.barcode:before{content:"\f02a"}i.icon.bars:before{content:"\f0c9"}i.icon.baseball.ball:before{content:"\f433"}i.icon.basketball.ball:before{content:"\f434"}i.icon.bath:before{content:"\f2cd"}i.icon.battery.empty:before{content:"\f244"}i.icon.battery.full:before{content:"\f240"}i.icon.battery.half:before{content:"\f242"}i.icon.battery.quarter:before{content:"\f243"}i.icon.battery.three.quarters:before{content:"\f241"}i.icon.bed:before{content:"\f236"}i.icon.beer:before{content:"\f0fc"}i.icon.behance:before{content:"\f1b4"}i.icon.behance.square:before{content:"\f1b5"}i.icon.bell:before{content:"\f0f3"}i.icon.bell.slash:before{content:"\f1f6"}i.icon.bicycle:before{content:"\f206"}i.icon.bimobject:before{content:"\f378"}i.icon.binoculars:before{content:"\f1e5"}i.icon.birthday.cake:before{content:"\f1fd"}i.icon.bitbucket:before{content:"\f171"}i.icon.bitcoin:before{content:"\f379"}i.icon.bity:before{content:"\f37a"}i.icon.black.tie:before{content:"\f27e"}i.icon.blackberry:before{content:"\f37b"}i.icon.blind:before{content:"\f29d"}i.icon.blogger:before{content:"\f37c"}i.icon.blogger.b:before{content:"\f37d"}i.icon.bluetooth:before{content:"\f293"}i.icon.bluetooth.b:before{content:"\f294"}i.icon.bold:before{content:"\f032"}i.icon.bolt:before{content:"\f0e7"}i.icon.bomb:before{content:"\f1e2"}i.icon.book:before{content:"\f02d"}i.icon.bookmark:before{content:"\f02e"}i.icon.bowling.ball:before{content:"\f436"}i.icon.box:before{content:"\f466"}i.icon.boxes:before{content:"\f468"}i.icon.braille:before{content:"\f2a1"}i.icon.briefcase:before{content:"\f0b1"}i.icon.btc:before{content:"\f15a"}i.icon.bug:before{content:"\f188"}i.icon.building:before{content:"\f1ad"}i.icon.bullhorn:before{content:"\f0a1"}i.icon.bullseye:before{content:"\f140"}i.icon.buromobelexperte:before{content:"\f37f"}i.icon.bus:before{content:"\f207"}i.icon.buysellads:before{content:"\f20d"}i.icon.calculator:before{content:"\f1ec"}i.icon.calendar:before{content:"\f133"}i.icon.calendar.alternate:before{content:"\f073"}i.icon.calendar.check:before{content:"\f274"}i.icon.calendar.minus:before{content:"\f272"}i.icon.calendar.plus:before{content:"\f271"}i.icon.calendar.times:before{content:"\f273"}i.icon.camera:before{content:"\f030"}i.icon.camera.retro:before{content:"\f083"}i.icon.car:before{content:"\f1b9"}i.icon.caret.down:before{content:"\f0d7"}i.icon.caret.left:before{content:"\f0d9"}i.icon.caret.right:before{content:"\f0da"}i.icon.caret.square.down:before{content:"\f150"}i.icon.caret.square.left:before{content:"\f191"}i.icon.caret.square.right:before{content:"\f152"}i.icon.caret.square.up:before{content:"\f151"}i.icon.caret.up:before{content:"\f0d8"}i.icon.cart.arrow.down:before{content:"\f218"}i.icon.cart.plus:before{content:"\f217"}i.icon.cc.amazon.pay:before{content:"\f42d"}i.icon.cc.amex:before{content:"\f1f3"}i.icon.cc.apple.pay:before{content:"\f416"}i.icon.cc.diners.club:before{content:"\f24c"}i.icon.cc.discover:before{content:"\f1f2"}i.icon.cc.jcb:before{content:"\f24b"}i.icon.cc.mastercard:before{content:"\f1f1"}i.icon.cc.paypal:before{content:"\f1f4"}i.icon.cc.stripe:before{content:"\f1f5"}i.icon.cc.visa:before{content:"\f1f0"}i.icon.centercode:before{content:"\f380"}i.icon.certificate:before{content:"\f0a3"}i.icon.chart.area:before{content:"\f1fe"}i.icon.chart.bar:before{content:"\f080"}i.icon.chart.line:before{content:"\f201"}i.icon.chart.pie:before{content:"\f200"}i.icon.check:before{content:"\f00c"}i.icon.check.circle:before{content:"\f058"}i.icon.check.square:before{content:"\f14a"}i.icon.chess:before{content:"\f439"}i.icon.chess.bishop:before{content:"\f43a"}i.icon.chess.board:before{content:"\f43c"}i.icon.chess.king:before{content:"\f43f"}i.icon.chess.knight:before{content:"\f441"}i.icon.chess.pawn:before{content:"\f443"}i.icon.chess.queen:before{content:"\f445"}i.icon.chess.rook:before{content:"\f447"}i.icon.chevron.circle.down:before{content:"\f13a"}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.down:before{content:"\f078"}i.icon.chevron.left:before{content:"\f053"}i.icon.chevron.right:before{content:"\f054"}i.icon.chevron.up:before{content:"\f077"}i.icon.child:before{content:"\f1ae"}i.icon.chrome:before{content:"\f268"}i.icon.circle:before{content:"\f111"}i.icon.circle.notch:before{content:"\f1ce"}i.icon.clipboard:before{content:"\f328"}i.icon.clipboard.check:before{content:"\f46c"}i.icon.clipboard.list:before{content:"\f46d"}i.icon.clock:before{content:"\f017"}i.icon.clone:before{content:"\f24d"}i.icon.closed.captioning:before{content:"\f20a"}i.icon.cloud:before{content:"\f0c2"}i.icon.cloudscale:before{content:"\f383"}i.icon.cloudsmith:before{content:"\f384"}i.icon.cloudversify:before{content:"\f385"}i.icon.code:before{content:"\f121"}i.icon.code.branch:before{content:"\f126"}i.icon.codepen:before{content:"\f1cb"}i.icon.codiepie:before{content:"\f284"}i.icon.coffee:before{content:"\f0f4"}i.icon.cog:before{content:"\f013"}i.icon.cogs:before{content:"\f085"}i.icon.columns:before{content:"\f0db"}i.icon.comment:before{content:"\f075"}i.icon.comment.alternate:before{content:"\f27a"}i.icon.comments:before{content:"\f086"}i.icon.compass:before{content:"\f14e"}i.icon.compress:before{content:"\f066"}i.icon.connectdevelop:before{content:"\f20e"}i.icon.contao:before{content:"\f26d"}i.icon.copy:before{content:"\f0c5"}i.icon.copyright:before{content:"\f1f9"}i.icon.cpanel:before{content:"\f388"}i.icon.creative.commons:before{content:"\f25e"}i.icon.credit.card:before{content:"\f09d"}i.icon.crop:before{content:"\f125"}i.icon.crosshairs:before{content:"\f05b"}i.icon.css3:before{content:"\f13c"}i.icon.css3.alternate:before{content:"\f38b"}i.icon.cube:before{content:"\f1b2"}i.icon.cubes:before{content:"\f1b3"}i.icon.cut:before{content:"\f0c4"}i.icon.cuttlefish:before{content:"\f38c"}i.icon.d.and.d:before{content:"\f38d"}i.icon.dashcube:before{content:"\f210"}i.icon.database:before{content:"\f1c0"}i.icon.deaf:before{content:"\f2a4"}i.icon.delicious:before{content:"\f1a5"}i.icon.deploydog:before{content:"\f38e"}i.icon.deskpro:before{content:"\f38f"}i.icon.desktop:before{content:"\f108"}i.icon.deviantart:before{content:"\f1bd"}i.icon.digg:before{content:"\f1a6"}i.icon.digital.ocean:before{content:"\f391"}i.icon.discord:before{content:"\f392"}i.icon.discourse:before{content:"\f393"}i.icon.dna:before{content:"\f471"}i.icon.dochub:before{content:"\f394"}i.icon.docker:before{content:"\f395"}i.icon.dollar.sign:before{content:"\f155"}i.icon.dolly:before{content:"\f472"}i.icon.dolly.flatbed:before{content:"\f474"}i.icon.dot.circle:before{content:"\f192"}i.icon.download:before{content:"\f019"}i.icon.draft2digital:before{content:"\f396"}i.icon.dribbble:before{content:"\f17d"}i.icon.dribbble.square:before{content:"\f397"}i.icon.dropbox:before{content:"\f16b"}i.icon.drupal:before{content:"\f1a9"}i.icon.dyalog:before{content:"\f399"}i.icon.earlybirds:before{content:"\f39a"}i.icon.edge:before{content:"\f282"}i.icon.edit:before{content:"\f044"}i.icon.eject:before{content:"\f052"}i.icon.elementor:before{content:"\f430"}i.icon.ellipsis.horizontal:before{content:"\f141"}i.icon.ellipsis.vertical:before{content:"\f142"}i.icon.ember:before{content:"\f423"}i.icon.empire:before{content:"\f1d1"}i.icon.envelope:before{content:"\f0e0"}i.icon.envelope.open:before{content:"\f2b6"}i.icon.envelope.square:before{content:"\f199"}i.icon.envira:before{content:"\f299"}i.icon.eraser:before{content:"\f12d"}i.icon.erlang:before{content:"\f39d"}i.icon.ethereum:before{content:"\f42e"}i.icon.etsy:before{content:"\f2d7"}i.icon.euro.sign:before{content:"\f153"}i.icon.exchange.alternate:before{content:"\f362"}i.icon.exclamation:before{content:"\f12a"}i.icon.exclamation.circle:before{content:"\f06a"}i.icon.exclamation.triangle:before{content:"\f071"}i.icon.expand:before{content:"\f065"}i.icon.expand.arrows.alternate:before{content:"\f31e"}i.icon.expeditedssl:before{content:"\f23e"}i.icon.external.alternate:before{content:"\f35d"}i.icon.external.square.alternate:before{content:"\f360"}i.icon.eye:before{content:"\f06e"}i.icon.eye.dropper:before{content:"\f1fb"}i.icon.eye.slash:before{content:"\f070"}i.icon.facebook:before{content:"\f09a"}i.icon.facebook.f:before{content:"\f39e"}i.icon.facebook.messenger:before{content:"\f39f"}i.icon.facebook.square:before{content:"\f082"}i.icon.fast.backward:before{content:"\f049"}i.icon.fast.forward:before{content:"\f050"}i.icon.fax:before{content:"\f1ac"}i.icon.female:before{content:"\f182"}i.icon.fighter.jet:before{content:"\f0fb"}i.icon.file:before{content:"\f15b"}i.icon.file.alternate:before{content:"\f15c"}i.icon.file.archive:before{content:"\f1c6"}i.icon.file.audio:before{content:"\f1c7"}i.icon.file.code:before{content:"\f1c9"}i.icon.file.excel:before{content:"\f1c3"}i.icon.file.image:before{content:"\f1c5"}i.icon.file.pdf:before{content:"\f1c1"}i.icon.file.powerpoint:before{content:"\f1c4"}i.icon.file.video:before{content:"\f1c8"}i.icon.file.word:before{content:"\f1c2"}i.icon.film:before{content:"\f008"}i.icon.filter:before{content:"\f0b0"}i.icon.fire:before{content:"\f06d"}i.icon.fire.extinguisher:before{content:"\f134"}i.icon.firefox:before{content:"\f269"}i.icon.first.aid:before{content:"\f479"}i.icon.first.order:before{content:"\f2b0"}i.icon.firstdraft:before{content:"\f3a1"}i.icon.flag:before{content:"\f024"}i.icon.flag.checkered:before{content:"\f11e"}i.icon.flask:before{content:"\f0c3"}i.icon.flickr:before{content:"\f16e"}i.icon.flipboard:before{content:"\f44d"}i.icon.fly:before{content:"\f417"}i.icon.folder:before{content:"\f07b"}i.icon.folder.open:before{content:"\f07c"}i.icon.font:before{content:"\f031"}i.icon.font.awesome:before{content:"\f2b4"}i.icon.font.awesome.alternate:before{content:"\f35c"}i.icon.font.awesome.flag:before{content:"\f425"}i.icon.fonticons:before{content:"\f280"}i.icon.fonticons.fi:before{content:"\f3a2"}i.icon.football.ball:before{content:"\f44e"}i.icon.fort.awesome:before{content:"\f286"}i.icon.fort.awesome.alternate:before{content:"\f3a3"}i.icon.forumbee:before{content:"\f211"}i.icon.forward:before{content:"\f04e"}i.icon.foursquare:before{content:"\f180"}i.icon.free.code.camp:before{content:"\f2c5"}i.icon.freebsd:before{content:"\f3a4"}i.icon.frown:before{content:"\f119"}i.icon.futbol:before{content:"\f1e3"}i.icon.gamepad:before{content:"\f11b"}i.icon.gavel:before{content:"\f0e3"}i.icon.gem:before{content:"\f3a5"}i.icon.genderless:before{content:"\f22d"}i.icon.get.pocket:before{content:"\f265"}i.icon.gg:before{content:"\f260"}i.icon.gg.circle:before{content:"\f261"}i.icon.gift:before{content:"\f06b"}i.icon.git:before{content:"\f1d3"}i.icon.git.square:before{content:"\f1d2"}i.icon.github:before{content:"\f09b"}i.icon.github.alternate:before{content:"\f113"}i.icon.github.square:before{content:"\f092"}i.icon.gitkraken:before{content:"\f3a6"}i.icon.gitlab:before{content:"\f296"}i.icon.gitter:before{content:"\f426"}i.icon.glass.martini:before{content:"\f000"}i.icon.glide:before{content:"\f2a5"}i.icon.glide.g:before{content:"\f2a6"}i.icon.globe:before{content:"\f0ac"}i.icon.gofore:before{content:"\f3a7"}i.icon.golf.ball:before{content:"\f450"}i.icon.goodreads:before{content:"\f3a8"}i.icon.goodreads.g:before{content:"\f3a9"}i.icon.google:before{content:"\f1a0"}i.icon.google.drive:before{content:"\f3aa"}i.icon.google.play:before{content:"\f3ab"}i.icon.google.plus:before{content:"\f2b3"}i.icon.google.plus.g:before{content:"\f0d5"}i.icon.google.plus.square:before{content:"\f0d4"}i.icon.google.wallet:before{content:"\f1ee"}i.icon.graduation.cap:before{content:"\f19d"}i.icon.gratipay:before{content:"\f184"}i.icon.grav:before{content:"\f2d6"}i.icon.gripfire:before{content:"\f3ac"}i.icon.grunt:before{content:"\f3ad"}i.icon.gulp:before{content:"\f3ae"}i.icon.h.square:before{content:"\f0fd"}i.icon.hacker.news:before{content:"\f1d4"}i.icon.hacker.news.square:before{content:"\f3af"}i.icon.hand.lizard:before{content:"\f258"}i.icon.hand.paper:before{content:"\f256"}i.icon.hand.peace:before{content:"\f25b"}i.icon.hand.point.down:before{content:"\f0a7"}i.icon.hand.point.left:before{content:"\f0a5"}i.icon.hand.point.right:before{content:"\f0a4"}i.icon.hand.point.up:before{content:"\f0a6"}i.icon.hand.pointer:before{content:"\f25a"}i.icon.hand.rock:before{content:"\f255"}i.icon.hand.scissors:before{content:"\f257"}i.icon.hand.spock:before{content:"\f259"}i.icon.handshake:before{content:"\f2b5"}i.icon.hashtag:before{content:"\f292"}i.icon.hdd:before{content:"\f0a0"}i.icon.heading:before{content:"\f1dc"}i.icon.headphones:before{content:"\f025"}i.icon.heart:before{content:"\f004"}i.icon.heartbeat:before{content:"\f21e"}i.icon.hips:before{content:"\f452"}i.icon.hire.a.helper:before{content:"\f3b0"}i.icon.history:before{content:"\f1da"}i.icon.hockey.puck:before{content:"\f453"}i.icon.home:before{content:"\f015"}i.icon.hooli:before{content:"\f427"}i.icon.hospital:before{content:"\f0f8"}i.icon.hospital.symbol:before{content:"\f47e"}i.icon.hotjar:before{content:"\f3b1"}i.icon.hourglass:before{content:"\f254"}i.icon.hourglass.end:before{content:"\f253"}i.icon.hourglass.half:before{content:"\f252"}i.icon.hourglass.start:before{content:"\f251"}i.icon.houzz:before{content:"\f27c"}i.icon.html5:before{content:"\f13b"}i.icon.hubspot:before{content:"\f3b2"}i.icon.i.cursor:before{content:"\f246"}i.icon.id.badge:before{content:"\f2c1"}i.icon.id.card:before{content:"\f2c2"}i.icon.image:before{content:"\f03e"}i.icon.images:before{content:"\f302"}i.icon.imdb:before{content:"\f2d8"}i.icon.inbox:before{content:"\f01c"}i.icon.indent:before{content:"\f03c"}i.icon.industry:before{content:"\f275"}i.icon.info:before{content:"\f129"}i.icon.info.circle:before{content:"\f05a"}i.icon.instagram:before{content:"\f16d"}i.icon.internet.explorer:before{content:"\f26b"}i.icon.ioxhost:before{content:"\f208"}i.icon.italic:before{content:"\f033"}i.icon.itunes:before{content:"\f3b4"}i.icon.itunes.note:before{content:"\f3b5"}i.icon.jenkins:before{content:"\f3b6"}i.icon.joget:before{content:"\f3b7"}i.icon.joomla:before{content:"\f1aa"}i.icon.js:before{content:"\f3b8"}i.icon.js.square:before{content:"\f3b9"}i.icon.jsfiddle:before{content:"\f1cc"}i.icon.key:before{content:"\f084"}i.icon.keyboard:before{content:"\f11c"}i.icon.keycdn:before{content:"\f3ba"}i.icon.kickstarter:before{content:"\f3bb"}i.icon.kickstarter.k:before{content:"\f3bc"}i.icon.korvue:before{content:"\f42f"}i.icon.language:before{content:"\f1ab"}i.icon.laptop:before{content:"\f109"}i.icon.laravel:before{content:"\f3bd"}i.icon.lastfm:before{content:"\f202"}i.icon.lastfm.square:before{content:"\f203"}i.icon.leaf:before{content:"\f06c"}i.icon.leanpub:before{content:"\f212"}i.icon.lemon:before{content:"\f094"}i.icon.less:before{content:"\f41d"}i.icon.level.down.alternate:before{content:"\f3be"}i.icon.level.up.alternate:before{content:"\f3bf"}i.icon.life.ring:before{content:"\f1cd"}i.icon.lightbulb:before{content:"\f0eb"}i.icon.linechat:before{content:"\f3c0"}i.icon.linkify:before{content:"\f0c1"}i.icon.linkedin:before{content:"\f08c"}i.icon.linkedin.alt:before{content:"\f0e1"}i.icon.linode:before{content:"\f2b8"}i.icon.linux:before{content:"\f17c"}i.icon.lira.sign:before{content:"\f195"}i.icon.list:before{content:"\f03a"}i.icon.list.alternate:before{content:"\f022"}i.icon.list.ol:before{content:"\f0cb"}i.icon.list.ul:before{content:"\f0ca"}i.icon.location.arrow:before{content:"\f124"}i.icon.lock:before{content:"\f023"}i.icon.lock.open:before{content:"\f3c1"}i.icon.long.arrow.alternate.down:before{content:"\f309"}i.icon.long.arrow.alternate.left:before{content:"\f30a"}i.icon.long.arrow.alternate.right:before{content:"\f30b"}i.icon.long.arrow.alternate.up:before{content:"\f30c"}i.icon.low.vision:before{content:"\f2a8"}i.icon.lyft:before{content:"\f3c3"}i.icon.magento:before{content:"\f3c4"}i.icon.magic:before{content:"\f0d0"}i.icon.magnet:before{content:"\f076"}i.icon.male:before{content:"\f183"}i.icon.map:before{content:"\f279"}i.icon.map.marker:before{content:"\f041"}i.icon.map.marker.alternate:before{content:"\f3c5"}i.icon.map.pin:before{content:"\f276"}i.icon.map.signs:before{content:"\f277"}i.icon.mars:before{content:"\f222"}i.icon.mars.double:before{content:"\f227"}i.icon.mars.stroke:before{content:"\f229"}i.icon.mars.stroke.horizontal:before{content:"\f22b"}i.icon.mars.stroke.vertical:before{content:"\f22a"}i.icon.maxcdn:before{content:"\f136"}i.icon.medapps:before{content:"\f3c6"}i.icon.medium:before{content:"\f23a"}i.icon.medium.m:before{content:"\f3c7"}i.icon.medkit:before{content:"\f0fa"}i.icon.medrt:before{content:"\f3c8"}i.icon.meetup:before{content:"\f2e0"}i.icon.meh:before{content:"\f11a"}i.icon.mercury:before{content:"\f223"}i.icon.microchip:before{content:"\f2db"}i.icon.microphone:before{content:"\f130"}i.icon.microphone.slash:before{content:"\f131"}i.icon.microsoft:before{content:"\f3ca"}i.icon.minus:before{content:"\f068"}i.icon.minus.circle:before{content:"\f056"}i.icon.minus.square:before{content:"\f146"}i.icon.mix:before{content:"\f3cb"}i.icon.mixcloud:before{content:"\f289"}i.icon.mizuni:before{content:"\f3cc"}i.icon.mobile:before{content:"\f10b"}i.icon.mobile.alternate:before{content:"\f3cd"}i.icon.modx:before{content:"\f285"}i.icon.monero:before{content:"\f3d0"}i.icon.money.bill.alternate:before{content:"\f3d1"}i.icon.moon:before{content:"\f186"}i.icon.motorcycle:before{content:"\f21c"}i.icon.mouse.pointer:before{content:"\f245"}i.icon.music:before{content:"\f001"}i.icon.napster:before{content:"\f3d2"}i.icon.neuter:before{content:"\f22c"}i.icon.newspaper:before{content:"\f1ea"}i.icon.nintendo.switch:before{content:"\f418"}i.icon.node:before{content:"\f419"}i.icon.node.js:before{content:"\f3d3"}i.icon.npm:before{content:"\f3d4"}i.icon.ns8:before{content:"\f3d5"}i.icon.nutritionix:before{content:"\f3d6"}i.icon.object.group:before{content:"\f247"}i.icon.object.ungroup:before{content:"\f248"}i.icon.odnoklassniki:before{content:"\f263"}i.icon.odnoklassniki.square:before{content:"\f264"}i.icon.opencart:before{content:"\f23d"}i.icon.openid:before{content:"\f19b"}i.icon.opera:before{content:"\f26a"}i.icon.optin.monster:before{content:"\f23c"}i.icon.osi:before{content:"\f41a"}i.icon.outdent:before{content:"\f03b"}i.icon.page4:before{content:"\f3d7"}i.icon.pagelines:before{content:"\f18c"}i.icon.paint.brush:before{content:"\f1fc"}i.icon.palfed:before{content:"\f3d8"}i.icon.pallet:before{content:"\f482"}i.icon.paper.plane:before{content:"\f1d8"}i.icon.paperclip:before{content:"\f0c6"}i.icon.paragraph:before{content:"\f1dd"}i.icon.paste:before{content:"\f0ea"}i.icon.patreon:before{content:"\f3d9"}i.icon.pause:before{content:"\f04c"}i.icon.pause.circle:before{content:"\f28b"}i.icon.paw:before{content:"\f1b0"}i.icon.paypal:before{content:"\f1ed"}i.icon.pen.square:before{content:"\f14b"}i.icon.pencil.alternate:before{content:"\f303"}i.icon.percent:before{content:"\f295"}i.icon.periscope:before{content:"\f3da"}i.icon.phabricator:before{content:"\f3db"}i.icon.phoenix.framework:before{content:"\f3dc"}i.icon.phone:before{content:"\f095"}i.icon.phone.square:before{content:"\f098"}i.icon.phone.volume:before{content:"\f2a0"}i.icon.php:before{content:"\f457"}i.icon.pied.piper:before{content:"\f2ae"}i.icon.pied.piper.alternate:before{content:"\f1a8"}i.icon.pied.piper.pp:before{content:"\f1a7"}i.icon.pills:before{content:"\f484"}i.icon.pinterest:before{content:"\f0d2"}i.icon.pinterest.p:before{content:"\f231"}i.icon.pinterest.square:before{content:"\f0d3"}i.icon.plane:before{content:"\f072"}i.icon.play:before{content:"\f04b"}i.icon.play.circle:before{content:"\f144"}i.icon.playstation:before{content:"\f3df"}i.icon.plug:before{content:"\f1e6"}i.icon.plus:before{content:"\f067"}i.icon.plus.circle:before{content:"\f055"}i.icon.plus.square:before{content:"\f0fe"}i.icon.podcast:before{content:"\f2ce"}i.icon.pound.sign:before{content:"\f154"}i.icon.power.off:before{content:"\f011"}i.icon.print:before{content:"\f02f"}i.icon.product.hunt:before{content:"\f288"}i.icon.pushed:before{content:"\f3e1"}i.icon.puzzle.piece:before{content:"\f12e"}i.icon.python:before{content:"\f3e2"}i.icon.qq:before{content:"\f1d6"}i.icon.qrcode:before{content:"\f029"}i.icon.question:before{content:"\f128"}i.icon.question.circle:before{content:"\f059"}i.icon.quidditch:before{content:"\f458"}i.icon.quinscape:before{content:"\f459"}i.icon.quora:before{content:"\f2c4"}i.icon.quote.left:before{content:"\f10d"}i.icon.quote.right:before{content:"\f10e"}i.icon.random:before{content:"\f074"}i.icon.ravelry:before{content:"\f2d9"}i.icon.react:before{content:"\f41b"}i.icon.rebel:before{content:"\f1d0"}i.icon.recycle:before{content:"\f1b8"}i.icon.redriver:before{content:"\f3e3"}i.icon.reddit:before{content:"\f1a1"}i.icon.reddit.alien:before{content:"\f281"}i.icon.reddit.square:before{content:"\f1a2"}i.icon.redo:before{content:"\f01e"}i.icon.redo.alternate:before{content:"\f2f9"}i.icon.registered:before{content:"\f25d"}i.icon.rendact:before{content:"\f3e4"}i.icon.renren:before{content:"\f18b"}i.icon.reply:before{content:"\f3e5"}i.icon.reply.all:before{content:"\f122"}i.icon.replyd:before{content:"\f3e6"}i.icon.resolving:before{content:"\f3e7"}i.icon.retweet:before{content:"\f079"}i.icon.road:before{content:"\f018"}i.icon.rocket:before{content:"\f135"}i.icon.rocketchat:before{content:"\f3e8"}i.icon.rockrms:before{content:"\f3e9"}i.icon.rss:before{content:"\f09e"}i.icon.rss.square:before{content:"\f143"}i.icon.ruble.sign:before{content:"\f158"}i.icon.rupee.sign:before{content:"\f156"}i.icon.safari:before{content:"\f267"}i.icon.sass:before{content:"\f41e"}i.icon.save:before{content:"\f0c7"}i.icon.schlix:before{content:"\f3ea"}i.icon.scribd:before{content:"\f28a"}i.icon.search:before{content:"\f002"}i.icon.search.minus:before{content:"\f010"}i.icon.search.plus:before{content:"\f00e"}i.icon.searchengin:before{content:"\f3eb"}i.icon.sellcast:before{content:"\f2da"}i.icon.sellsy:before{content:"\f213"}i.icon.server:before{content:"\f233"}i.icon.servicestack:before{content:"\f3ec"}i.icon.share:before{content:"\f064"}i.icon.share.alternate:before{content:"\f1e0"}i.icon.share.alternate.square:before{content:"\f1e1"}i.icon.share.square:before{content:"\f14d"}i.icon.shekel.sign:before{content:"\f20b"}i.icon.shield.alternate:before{content:"\f3ed"}i.icon.ship:before{content:"\f21a"}i.icon.shipping.fast:before{content:"\f48b"}i.icon.shirtsinbulk:before{content:"\f214"}i.icon.shopping.bag:before{content:"\f290"}i.icon.shopping.basket:before{content:"\f291"}i.icon.shopping.cart:before{content:"\f07a"}i.icon.shower:before{content:"\f2cc"}i.icon.sign.language:before{content:"\f2a7"}i.icon.signal:before{content:"\f012"}i.icon.simplybuilt:before{content:"\f215"}i.icon.sistrix:before{content:"\f3ee"}i.icon.sitemap:before{content:"\f0e8"}i.icon.skyatlas:before{content:"\f216"}i.icon.skype:before{content:"\f17e"}i.icon.slack:before{content:"\f198"}i.icon.slack.hash:before{content:"\f3ef"}i.icon.sliders.horizontal:before{content:"\f1de"}i.icon.slideshare:before{content:"\f1e7"}i.icon.smile:before{content:"\f118"}i.icon.snapchat:before{content:"\f2ab"}i.icon.snapchat.ghost:before{content:"\f2ac"}i.icon.snapchat.square:before{content:"\f2ad"}i.icon.snowflake:before{content:"\f2dc"}i.icon.sort:before{content:"\f0dc"}i.icon.sort.alphabet.down:before{content:"\f15d"}i.icon.sort.alphabet.up:before{content:"\f15e"}i.icon.sort.amount.down:before{content:"\f160"}i.icon.sort.amount.up:before{content:"\f161"}i.icon.sort.down:before{content:"\f0dd"}i.icon.sort.numeric.down:before{content:"\f162"}i.icon.sort.numeric.up:before{content:"\f163"}i.icon.sort.up:before{content:"\f0de"}i.icon.soundcloud:before{content:"\f1be"}i.icon.space.shuttle:before{content:"\f197"}i.icon.speakap:before{content:"\f3f3"}i.icon.spinner:before{content:"\f110"}i.icon.spotify:before{content:"\f1bc"}i.icon.square:before{content:"\f0c8"}i.icon.square.full:before{content:"\f45c"}i.icon.stack.exchange:before{content:"\f18d"}i.icon.stack.overflow:before{content:"\f16c"}i.icon.star:before{content:"\f005"}i.icon.star.half:before{content:"\f089"}i.icon.staylinked:before{content:"\f3f5"}i.icon.steam:before{content:"\f1b6"}i.icon.steam.square:before{content:"\f1b7"}i.icon.steam.symbol:before{content:"\f3f6"}i.icon.step.backward:before{content:"\f048"}i.icon.step.forward:before{content:"\f051"}i.icon.stethoscope:before{content:"\f0f1"}i.icon.sticker.mule:before{content:"\f3f7"}i.icon.sticky.note:before{content:"\f249"}i.icon.stop:before{content:"\f04d"}i.icon.stop.circle:before{content:"\f28d"}i.icon.stopwatch:before{content:"\f2f2"}i.icon.strava:before{content:"\f428"}i.icon.street.view:before{content:"\f21d"}i.icon.strikethrough:before{content:"\f0cc"}i.icon.stripe:before{content:"\f429"}i.icon.stripe.s:before{content:"\f42a"}i.icon.studiovinari:before{content:"\f3f8"}i.icon.stumbleupon:before{content:"\f1a4"}i.icon.stumbleupon.circle:before{content:"\f1a3"}i.icon.subscript:before{content:"\f12c"}i.icon.subway:before{content:"\f239"}i.icon.suitcase:before{content:"\f0f2"}i.icon.sun:before{content:"\f185"}i.icon.superpowers:before{content:"\f2dd"}i.icon.superscript:before{content:"\f12b"}i.icon.supple:before{content:"\f3f9"}i.icon.sync:before{content:"\f021"}i.icon.sync.alternate:before{content:"\f2f1"}i.icon.syringe:before{content:"\f48e"}i.icon.table:before{content:"\f0ce"}i.icon.table.tennis:before{content:"\f45d"}i.icon.tablet:before{content:"\f10a"}i.icon.tablet.alternate:before{content:"\f3fa"}i.icon.tachometer.alternate:before{content:"\f3fd"}i.icon.tag:before{content:"\f02b"}i.icon.tags:before{content:"\f02c"}i.icon.tasks:before{content:"\f0ae"}i.icon.taxi:before{content:"\f1ba"}i.icon.telegram:before{content:"\f2c6"}i.icon.telegram.plane:before{content:"\f3fe"}i.icon.tencent.weibo:before{content:"\f1d5"}i.icon.terminal:before{content:"\f120"}i.icon.text.height:before{content:"\f034"}i.icon.text.width:before{content:"\f035"}i.icon.th:before{content:"\f00a"}i.icon.th.large:before{content:"\f009"}i.icon.th.list:before{content:"\f00b"}i.icon.themeisle:before{content:"\f2b2"}i.icon.thermometer:before{content:"\f491"}i.icon.thermometer.empty:before{content:"\f2cb"}i.icon.thermometer.full:before{content:"\f2c7"}i.icon.thermometer.half:before{content:"\f2c9"}i.icon.thermometer.quarter:before{content:"\f2ca"}i.icon.thermometer.three.quarters:before{content:"\f2c8"}i.icon.thumbs.down:before{content:"\f165"}i.icon.thumbs.up:before{content:"\f164"}i.icon.thumbtack:before{content:"\f08d"}i.icon.ticket.alternate:before{content:"\f3ff"}i.icon.times:before{content:"\f00d"}i.icon.times.circle:before{content:"\f057"}i.icon.tint:before{content:"\f043"}i.icon.toggle.off:before{content:"\f204"}i.icon.toggle.on:before{content:"\f205"}i.icon.trademark:before{content:"\f25c"}i.icon.train:before{content:"\f238"}i.icon.transgender:before{content:"\f224"}i.icon.transgender.alternate:before{content:"\f225"}i.icon.trash:before{content:"\f1f8"}i.icon.trash.alternate:before{content:"\f2ed"}i.icon.tree:before{content:"\f1bb"}i.icon.trello:before{content:"\f181"}i.icon.tripadvisor:before{content:"\f262"}i.icon.trophy:before{content:"\f091"}i.icon.truck:before{content:"\f0d1"}i.icon.tty:before{content:"\f1e4"}i.icon.tumblr:before{content:"\f173"}i.icon.tumblr.square:before{content:"\f174"}i.icon.tv:before{content:"\f26c"}i.icon.twitch:before{content:"\f1e8"}i.icon.twitter:before{content:"\f099"}i.icon.twitter.square:before{content:"\f081"}i.icon.typo3:before{content:"\f42b"}i.icon.uber:before{content:"\f402"}i.icon.uikit:before{content:"\f403"}i.icon.umbrella:before{content:"\f0e9"}i.icon.underline:before{content:"\f0cd"}i.icon.undo:before{content:"\f0e2"}i.icon.undo.alternate:before{content:"\f2ea"}i.icon.uniregistry:before{content:"\f404"}i.icon.universal.access:before{content:"\f29a"}i.icon.university:before{content:"\f19c"}i.icon.unlink:before{content:"\f127"}i.icon.unlock:before{content:"\f09c"}i.icon.unlock.alternate:before{content:"\f13e"}i.icon.untappd:before{content:"\f405"}i.icon.upload:before{content:"\f093"}i.icon.usb:before{content:"\f287"}i.icon.user:before{content:"\f007"}i.icon.user.circle:before{content:"\f2bd"}i.icon.user.md:before{content:"\f0f0"}i.icon.user.plus:before{content:"\f234"}i.icon.user.secret:before{content:"\f21b"}i.icon.user.times:before{content:"\f235"}i.icon.users:before{content:"\f0c0"}i.icon.ussunnah:before{content:"\f407"}i.icon.utensil.spoon:before{content:"\f2e5"}i.icon.utensils:before{content:"\f2e7"}i.icon.vaadin:before{content:"\f408"}i.icon.venus:before{content:"\f221"}i.icon.venus.double:before{content:"\f226"}i.icon.venus.mars:before{content:"\f228"}i.icon.viacoin:before{content:"\f237"}i.icon.viadeo:before{content:"\f2a9"}i.icon.viadeo.square:before{content:"\f2aa"}i.icon.viber:before{content:"\f409"}i.icon.video:before{content:"\f03d"}i.icon.vimeo:before{content:"\f40a"}i.icon.vimeo.square:before{content:"\f194"}i.icon.vimeo.v:before{content:"\f27d"}i.icon.vine:before{content:"\f1ca"}i.icon.vk:before{content:"\f189"}i.icon.vnv:before{content:"\f40b"}i.icon.volleyball.ball:before{content:"\f45f"}i.icon.volume.down:before{content:"\f027"}i.icon.volume.off:before{content:"\f026"}i.icon.volume.up:before{content:"\f028"}i.icon.vuejs:before{content:"\f41f"}i.icon.warehouse:before{content:"\f494"}i.icon.weibo:before{content:"\f18a"}i.icon.weight:before{content:"\f496"}i.icon.weixin:before{content:"\f1d7"}i.icon.whatsapp:before{content:"\f232"}i.icon.whatsapp.square:before{content:"\f40c"}i.icon.wheelchair:before{content:"\f193"}i.icon.whmcs:before{content:"\f40d"}i.icon.wifi:before{content:"\f1eb"}i.icon.wikipedia.w:before{content:"\f266"}i.icon.window.close:before{content:"\f410"}i.icon.window.maximize:before{content:"\f2d0"}i.icon.window.minimize:before{content:"\f2d1"}i.icon.window.restore:before{content:"\f2d2"}i.icon.windows:before{content:"\f17a"}i.icon.won.sign:before{content:"\f159"}i.icon.wordpress:before{content:"\f19a"}i.icon.wordpress.simple:before{content:"\f411"}i.icon.wpbeginner:before{content:"\f297"}i.icon.wpexplorer:before{content:"\f2de"}i.icon.wpforms:before{content:"\f298"}i.icon.wrench:before{content:"\f0ad"}i.icon.xbox:before{content:"\f412"}i.icon.xing:before{content:"\f168"}i.icon.xing.square:before{content:"\f169"}i.icon.y.combinator:before{content:"\f23b"}i.icon.yahoo:before{content:"\f19e"}i.icon.yandex:before{content:"\f413"}i.icon.yandex.international:before{content:"\f414"}i.icon.yelp:before{content:"\f1e9"}i.icon.yen.sign:before{content:"\f157"}i.icon.yoast:before{content:"\f2b1"}i.icon.youtube:before{content:"\f167"}i.icon.youtube.square:before{content:"\f431"}i.icon.chess.rock:before{content:"\f447"}i.icon.ordered.list:before{content:"\f0cb"}i.icon.unordered.list:before{content:"\f0ca"}i.icon.user.doctor:before{content:"\f0f0"}i.icon.shield:before{content:"\f3ed"}i.icon.puzzle:before{content:"\f12e"}i.icon.credit.card.amazon.pay:before{content:"\f42d"}i.icon.credit.card.american.express:before{content:"\f1f3"}i.icon.credit.card.diners.club:before{content:"\f24c"}i.icon.credit.card.discover:before{content:"\f1f2"}i.icon.credit.card.jcb:before{content:"\f24b"}i.icon.credit.card.mastercard:before{content:"\f1f1"}i.icon.credit.card.paypal:before{content:"\f1f4"}i.icon.credit.card.stripe:before{content:"\f1f5"}i.icon.credit.card.visa:before{content:"\f1f0"}i.icon.add.circle:before{content:"\f055"}i.icon.add.square:before{content:"\f0fe"}i.icon.add.to.calendar:before{content:"\f271"}i.icon.add.to.cart:before{content:"\f217"}i.icon.add.user:before{content:"\f234"}i.icon.add:before{content:"\f067"}i.icon.alarm.mute:before{content:"\f1f6"}i.icon.alarm:before{content:"\f0f3"}i.icon.ald:before{content:"\f2a2"}i.icon.als:before{content:"\f2a2"}i.icon.american.express.card:before{content:"\f1f3"}i.icon.american.express:before{content:"\f1f3"}i.icon.amex:before{content:"\f1f3"}i.icon.announcement:before{content:"\f0a1"}i.icon.area.chart:before{content:"\f1fe"}i.icon.area.graph:before{content:"\f1fe"}i.icon.arrow.down.cart:before{content:"\f218"}i.icon.asexual:before{content:"\f22d"}i.icon.asl.interpreting:before{content:"\f2a3"}i.icon.asl:before{content:"\f2a3"}i.icon.assistive.listening.devices:before{content:"\f2a2"}i.icon.attach:before{content:"\f0c6"}i.icon.attention:before{content:"\f06a"}i.icon.balance:before{content:"\f24e"}i.icon.bar:before{content:"\f0fc"}i.icon.bathtub:before{content:"\f2cd"}i.icon.battery.four:before{content:"\f240"}i.icon.battery.high:before{content:"\f241"}i.icon.battery.low:before{content:"\f243"}i.icon.battery.medium:before{content:"\f242"}i.icon.battery.one:before{content:"\f243"}i.icon.battery.three:before{content:"\f241"}i.icon.battery.two:before{content:"\f242"}i.icon.battery.zero:before{content:"\f244"}i.icon.birthday:before{content:"\f1fd"}i.icon.block.layout:before{content:"\f009"}i.icon.bluetooth.alternative:before{content:"\f294"}i.icon.broken.chain:before{content:"\f127"}i.icon.browser:before{content:"\f022"}i.icon.call.square:before{content:"\f098"}i.icon.call:before{content:"\f095"}i.icon.cancel:before{content:"\f00d"}i.icon.cart:before{content:"\f07a"}i.icon.cc:before{content:"\f20a"}i.icon.chain:before{content:"\f0c1"}i.icon.chat:before{content:"\f075"}i.icon.checked.calendar:before{content:"\f274"}i.icon.checkmark:before{content:"\f00c"}i.icon.circle.notched:before{content:"\f1ce"}i.icon.close:before{content:"\f00d"}i.icon.cny:before{content:"\f157"}i.icon.cocktail:before{content:"\f000"}i.icon.commenting:before{content:"\f27a"}i.icon.computer:before{content:"\f108"}i.icon.configure:before{content:"\f0ad"}i.icon.content:before{content:"\f0c9"}i.icon.deafness:before{content:"\f2a4"}i.icon.delete.calendar:before{content:"\f273"}i.icon.delete:before{content:"\f00d"}i.icon.detective:before{content:"\f21b"}i.icon.diners.club.card:before{content:"\f24c"}i.icon.diners.club:before{content:"\f24c"}i.icon.discover.card:before{content:"\f1f2"}i.icon.discover:before{content:"\f1f2"}i.icon.discussions:before{content:"\f086"}i.icon.doctor:before{content:"\f0f0"}i.icon.dollar:before{content:"\f155"}i.icon.dont:before{content:"\f05e"}i.icon.dribble:before{content:"\f17d"}i.icon.drivers.license:before{content:"\f2c2"}i.icon.dropdown:before{content:"\f0d7"}i.icon.eercast:before{content:"\f2da"}i.icon.emergency:before{content:"\f0f9"}i.icon.envira.gallery:before{content:"\f299"}i.icon.erase:before{content:"\f12d"}i.icon.eur:before{content:"\f153"}i.icon.euro:before{content:"\f153"}i.icon.eyedropper:before{content:"\f1fb"}i.icon.fa:before{content:"\f2b4"}i.icon.factory:before{content:"\f275"}i.icon.favorite:before{content:"\f005"}i.icon.feed:before{content:"\f09e"}i.icon.female.homosexual:before{content:"\f226"}i.icon.file.text:before{content:"\f15c"}i.icon.find:before{content:"\f1e5"}i.icon.first.aid:before{content:"\f0fa"}i.icon.five.hundred.pixels:before{content:"\f26e"}i.icon.fork:before{content:"\f126"}i.icon.game:before{content:"\f11b"}i.icon.gay:before{content:"\f227"}i.icon.gbp:before{content:"\f154"}i.icon.gittip:before{content:"\f184"}i.icon.google.plus.circle:before{content:"\f2b3"}i.icon.google.plus.official:before{content:"\f2b3"}i.icon.grab:before{content:"\f255"}i.icon.graduation:before{content:"\f19d"}i.icon.grid.layout:before{content:"\f00a"}i.icon.group:before{content:"\f0c0"}i.icon.h:before{content:"\f0fd"}i.icon.hand.victory:before{content:"\f25b"}i.icon.handicap:before{content:"\f193"}i.icon.hard.of.hearing:before{content:"\f2a4"}i.icon.header:before{content:"\f1dc"}i.icon.help.circle:before{content:"\f059"}i.icon.help:before{content:"\f128"}i.icon.heterosexual:before{content:"\f228"}i.icon.hide:before{content:"\f070"}i.icon.hotel:before{content:"\f236"}i.icon.hourglass.four:before{content:"\f254"}i.icon.hourglass.full:before{content:"\f254"}i.icon.hourglass.one:before{content:"\f251"}i.icon.hourglass.three:before{content:"\f253"}i.icon.hourglass.two:before{content:"\f252"}i.icon.idea:before{content:"\f0eb"}i.icon.ils:before{content:"\f20b"}i.icon.in-cart:before{content:"\f218"}i.icon.inr:before{content:"\f156"}i.icon.intergender:before{content:"\f224"}i.icon.intersex:before{content:"\f224"}i.icon.japan.credit.bureau.card:before{content:"\f24b"}i.icon.japan.credit.bureau:before{content:"\f24b"}i.icon.jcb:before{content:"\f24b"}i.icon.jpy:before{content:"\f157"}i.icon.krw:before{content:"\f159"}i.icon.lab:before{content:"\f0c3"}i.icon.law:before{content:"\f24e"}i.icon.legal:before{content:"\f0e3"}i.icon.lesbian:before{content:"\f226"}i.icon.lightning:before{content:"\f0e7"}i.icon.like:before{content:"\f004"}i.icon.line.graph:before{content:"\f201"}i.icon.linkedin.square:before{content:"\f08c"}i.icon.linkify:before{content:"\f0c1"}i.icon.lira:before{content:"\f195"}i.icon.list.layout:before{content:"\f00b"}i.icon.magnify:before{content:"\f00e"}i.icon.mail.forward:before{content:"\f064"}i.icon.mail.square:before{content:"\f199"}i.icon.mail:before{content:"\f0e0"}i.icon.male.homosexual:before{content:"\f227"}i.icon.man:before{content:"\f222"}i.icon.marker:before{content:"\f041"}i.icon.mars.alternate:before{content:"\f229"}i.icon.mars.horizontal:before{content:"\f22b"}i.icon.mars.vertical:before{content:"\f22a"}i.icon.mastercard.card:before{content:"\f1f1"}i.icon.mastercard:before{content:"\f1f1"}i.icon.microsoft.edge:before{content:"\f282"}i.icon.military:before{content:"\f0fb"}i.icon.ms.edge:before{content:"\f282"}i.icon.mute:before{content:"\f131"}i.icon.new.pied.piper:before{content:"\f2ae"}i.icon.non.binary.transgender:before{content:"\f223"}i.icon.numbered.list:before{content:"\f0cb"}i.icon.optinmonster:before{content:"\f23c"}i.icon.options:before{content:"\f1de"}i.icon.other.gender.horizontal:before{content:"\f22b"}i.icon.other.gender.vertical:before{content:"\f22a"}i.icon.other.gender:before{content:"\f229"}i.icon.payment:before{content:"\f09d"}i.icon.paypal.card:before{content:"\f1f4"}i.icon.pencil.square:before{content:"\f14b"}i.icon.photo:before{content:"\f030"}i.icon.picture:before{content:"\f03e"}i.icon.pie.chart:before{content:"\f200"}i.icon.pie.graph:before{content:"\f200"}i.icon.pied.piper.hat:before{content:"\f2ae"}i.icon.pin:before{content:"\f08d"}i.icon.plus.cart:before{content:"\f217"}i.icon.pocket:before{content:"\f265"}i.icon.point:before{content:"\f041"}i.icon.pointing.down:before{content:"\f0a7"}i.icon.pointing.left:before{content:"\f0a5"}i.icon.pointing.right:before{content:"\f0a4"}i.icon.pointing.up:before{content:"\f0a6"}i.icon.pound:before{content:"\f154"}i.icon.power.cord:before{content:"\f1e6"}i.icon.power:before{content:"\f011"}i.icon.privacy:before{content:"\f084"}i.icon.r.circle:before{content:"\f25d"}i.icon.rain:before{content:"\f0e9"}i.icon.record:before{content:"\f03d"}i.icon.refresh:before{content:"\f021"}i.icon.remove.circle:before{content:"\f057"}i.icon.remove.from.calendar:before{content:"\f272"}i.icon.remove.user:before{content:"\f235"}i.icon.remove:before{content:"\f00d"}i.icon.repeat:before{content:"\f01e"}i.icon.rmb:before{content:"\f157"}i.icon.rouble:before{content:"\f158"}i.icon.rub:before{content:"\f158"}i.icon.ruble:before{content:"\f158"}i.icon.rupee:before{content:"\f156"}i.icon.s15:before{content:"\f2cd"}i.icon.selected.radio:before{content:"\f192"}i.icon.send:before{content:"\f1d8"}i.icon.setting:before{content:"\f013"}i.icon.settings:before{content:"\f085"}i.icon.shekel:before{content:"\f20b"}i.icon.sheqel:before{content:"\f20b"}i.icon.shipping:before{content:"\f0d1"}i.icon.shop:before{content:"\f07a"}i.icon.shuffle:before{content:"\f074"}i.icon.shutdown:before{content:"\f011"}i.icon.sidebar:before{content:"\f0c9"}i.icon.signing:before{content:"\f2a7"}i.icon.signup:before{content:"\f044"}i.icon.sliders:before{content:"\f1de"}i.icon.soccer:before{content:"\f1e3"}i.icon.sort.alphabet.ascending:before{content:"\f15d"}i.icon.sort.alphabet.descending:before{content:"\f15e"}i.icon.sort.ascending:before{content:"\f0de"}i.icon.sort.content.ascending:before{content:"\f160"}i.icon.sort.content.descending:before{content:"\f161"}i.icon.sort.descending:before{content:"\f0dd"}i.icon.sort.numeric.ascending:before{content:"\f162"}i.icon.sort.numeric.descending:before{content:"\f163"}i.icon.sound:before{content:"\f025"}i.icon.spy:before{content:"\f21b"}i.icon.stripe.card:before{content:"\f1f5"}i.icon.student:before{content:"\f19d"}i.icon.talk:before{content:"\f27a"}i.icon.target:before{content:"\f140"}i.icon.teletype:before{content:"\f1e4"}i.icon.television:before{content:"\f26c"}i.icon.text.cursor:before{content:"\f246"}i.icon.text.telephone:before{content:"\f1e4"}i.icon.theme.isle:before{content:"\f2b2"}i.icon.theme:before{content:"\f043"}i.icon.thermometer:before{content:"\f2c7"}i.icon.thumb.tack:before{content:"\f08d"}i.icon.time:before{content:"\f017"}i.icon.tm:before{content:"\f25c"}i.icon.toggle.down:before{content:"\f150"}i.icon.toggle.left:before{content:"\f191"}i.icon.toggle.right:before{content:"\f152"}i.icon.toggle.up:before{content:"\f151"}i.icon.translate:before{content:"\f1ab"}i.icon.travel:before{content:"\f0b1"}i.icon.treatment:before{content:"\f0f1"}i.icon.triangle.down:before{content:"\f0d7"}i.icon.triangle.left:before{content:"\f0d9"}i.icon.triangle.right:before{content:"\f0da"}i.icon.triangle.up:before{content:"\f0d8"}i.icon.try:before{content:"\f195"}i.icon.unhide:before{content:"\f06e"}i.icon.unlinkify:before{content:"\f127"}i.icon.unmute:before{content:"\f130"}i.icon.usd:before{content:"\f155"}i.icon.user.cancel:before{content:"\f235"}i.icon.user.close:before{content:"\f235"}i.icon.user.delete:before{content:"\f235"}i.icon.user.x:before{content:"\f235"}i.icon.vcard:before{content:"\f2bb"}i.icon.video.camera:before{content:"\f03d"}i.icon.video.play:before{content:"\f144"}i.icon.visa.card:before{content:"\f1f0"}i.icon.visa:before{content:"\f1f0"}i.icon.volume.control.phone:before{content:"\f2a0"}i.icon.wait:before{content:"\f017"}i.icon.warning.circle:before{content:"\f06a"}i.icon.warning.sign:before{content:"\f071"}i.icon.warning:before{content:"\f12a"}i.icon.wechat:before{content:"\f1d7"}i.icon.wi-fi:before{content:"\f1eb"}i.icon.wikipedia:before{content:"\f266"}i.icon.winner:before{content:"\f091"}i.icon.wizard:before{content:"\f0d0"}i.icon.woman:before{content:"\f221"}i.icon.won:before{content:"\f159"}i.icon.wordpress.beginner:before{content:"\f297"}i.icon.wordpress.forms:before{content:"\f298"}i.icon.world:before{content:"\f0ac"}i.icon.write.square:before{content:"\f14b"}i.icon.x:before{content:"\f00d"}i.icon.yc:before{content:"\f23b"}i.icon.ycombinator:before{content:"\f23b"}i.icon.yen:before{content:"\f157"}i.icon.zip:before{content:"\f187"}i.icon.zoom-in:before{content:"\f00e"}i.icon.zoom-out:before{content:"\f010"}i.icon.zoom:before{content:"\f00e"}i.icon.bitbucket.square:before{content:"\f171"}i.icon.checkmark.box:before{content:"\f14a"}i.icon.circle.thin:before{content:"\f111"}i.icon.cloud.download:before{content:"\f381"}i.icon.cloud.upload:before{content:"\f382"}i.icon.compose:before{content:"\f303"}i.icon.conversation:before{content:"\f086"}i.icon.credit.card.alternative:before{content:"\f09d"}i.icon.currency:before{content:"\f3d1"}i.icon.dashboard:before{content:"\f3fd"}i.icon.diamond:before{content:"\f3a5"}i.icon.disk:before{content:"\f0a0"}i.icon.exchange:before{content:"\f362"}i.icon.external.share:before{content:"\f14d"}i.icon.external.square:before{content:"\f360"}i.icon.external:before{content:"\f35d"}i.icon.facebook.official:before{content:"\f082"}i.icon.food:before{content:"\f2e7"}i.icon.hourglass.zero:before{content:"\f253"}i.icon.level.down:before{content:"\f3be"}i.icon.level.up:before{content:"\f3bf"}i.icon.logout:before{content:"\f2f5"}i.icon.meanpath:before{content:"\f0c8"}i.icon.money:before{content:"\f3d1"}i.icon.move:before{content:"\f0b2"}i.icon.pencil:before{content:"\f303"}i.icon.protect:before{content:"\f023"}i.icon.radio:before{content:"\f192"}i.icon.remove.bookmark:before{content:"\f02e"}i.icon.resize.horizontal:before{content:"\f337"}i.icon.resize.vertical:before{content:"\f338"}i.icon.sign-in:before{content:"\f2f6"}i.icon.sign-out:before{content:"\f2f5"}i.icon.spoon:before{content:"\f2e5"}i.icon.star.half.empty:before{content:"\f089"}i.icon.star.half.full:before{content:"\f089"}i.icon.ticket:before{content:"\f3ff"}i.icon.times.rectangle:before{content:"\f410"}i.icon.write:before{content:"\f303"}i.icon.youtube.play:before{content:"\f167"}@font-face{font-family:outline-icons;src:url(themes/default/assets/fonts/outline-icons.eot);src:url(themes/default/assets/fonts/outline-icons.eot?#iefix) format('embedded-opentype'),url(themes/default/assets/fonts/outline-icons.woff2) format('woff2'),url(themes/default/assets/fonts/outline-icons.woff) format('woff'),url(themes/default/assets/fonts/outline-icons.ttf) format('truetype'),url(themes/default/assets/fonts/outline-icons.svg#icons) format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon.outline{font-family:outline-icons}i.icon.address.book.outline:before{content:"\f2b9"}i.icon.address.card.outline:before{content:"\f2bb"}i.icon.arrow.alternate.circle.down.outline:before{content:"\f358"}i.icon.arrow.alternate.circle.left.outline:before{content:"\f359"}i.icon.arrow.alternate.circle.right.outline:before{content:"\f35a"}i.icon.arrow.alternate.circle.up.outline:before{content:"\f35b"}i.icon.bell.outline:before{content:"\f0f3"}i.icon.bell.slash.outline:before{content:"\f1f6"}i.icon.bookmark.outline:before{content:"\f02e"}i.icon.building.outline:before{content:"\f1ad"}i.icon.calendar.outline:before{content:"\f133"}i.icon.calendar.alternate.outline:before{content:"\f073"}i.icon.calendar.check.outline:before{content:"\f274"}i.icon.calendar.minus.outline:before{content:"\f272"}i.icon.calendar.plus.outline:before{content:"\f271"}i.icon.calendar.times.outline:before{content:"\f273"}i.icon.caret.square.down.outline:before{content:"\f150"}i.icon.caret.square.left.outline:before{content:"\f191"}i.icon.caret.square.right.outline:before{content:"\f152"}i.icon.caret.square.up.outline:before{content:"\f151"}i.icon.chart.bar.outline:before{content:"\f080"}i.icon.check.circle.outline:before{content:"\f058"}i.icon.check.square.outline:before{content:"\f14a"}i.icon.circle.outline:before{content:"\f111"}i.icon.clipboard.outline:before{content:"\f328"}i.icon.clock.outline:before{content:"\f017"}i.icon.clone.outline:before{content:"\f24d"}i.icon.closed.captioning.outline:before{content:"\f20a"}i.icon.comment.outline:before{content:"\f075"}i.icon.comment.alternate.outline:before{content:"\f27a"}i.icon.comments.outline:before{content:"\f086"}i.icon.compass.outline:before{content:"\f14e"}i.icon.copy.outline:before{content:"\f0c5"}i.icon.copyright.outline:before{content:"\f1f9"}i.icon.credit.card.outline:before{content:"\f09d"}i.icon.dot.circle.outline:before{content:"\f192"}i.icon.edit.outline:before{content:"\f044"}i.icon.envelope.outline:before{content:"\f0e0"}i.icon.envelope.open.outline:before{content:"\f2b6"}i.icon.eye.slash.outline:before{content:"\f070"}i.icon.file.outline:before{content:"\f15b"}i.icon.file.alternate.outline:before{content:"\f15c"}i.icon.file.archive.outline:before{content:"\f1c6"}i.icon.file.audio.outline:before{content:"\f1c7"}i.icon.file.code.outline:before{content:"\f1c9"}i.icon.file.excel.outline:before{content:"\f1c3"}i.icon.file.image.outline:before{content:"\f1c5"}i.icon.file.pdf.outline:before{content:"\f1c1"}i.icon.file.powerpoint.outline:before{content:"\f1c4"}i.icon.file.video.outline:before{content:"\f1c8"}i.icon.file.word.outline:before{content:"\f1c2"}i.icon.flag.outline:before{content:"\f024"}i.icon.folder.outline:before{content:"\f07b"}i.icon.folder.open.outline:before{content:"\f07c"}i.icon.frown.outline:before{content:"\f119"}i.icon.futbol.outline:before{content:"\f1e3"}i.icon.gem.outline:before{content:"\f3a5"}i.icon.hand.lizard.outline:before{content:"\f258"}i.icon.hand.paper.outline:before{content:"\f256"}i.icon.hand.peace.outline:before{content:"\f25b"}i.icon.hand.point.down.outline:before{content:"\f0a7"}i.icon.hand.point.left.outline:before{content:"\f0a5"}i.icon.hand.point.right.outline:before{content:"\f0a4"}i.icon.hand.point.up.outline:before{content:"\f0a6"}i.icon.hand.pointer.outline:before{content:"\f25a"}i.icon.hand.rock.outline:before{content:"\f255"}i.icon.hand.scissors.outline:before{content:"\f257"}i.icon.hand.spock.outline:before{content:"\f259"}i.icon.handshake.outline:before{content:"\f2b5"}i.icon.hdd.outline:before{content:"\f0a0"}i.icon.heart.outline:before{content:"\f004"}i.icon.hospital.outline:before{content:"\f0f8"}i.icon.hourglass.outline:before{content:"\f254"}i.icon.id.badge.outline:before{content:"\f2c1"}i.icon.id.card.outline:before{content:"\f2c2"}i.icon.image.outline:before{content:"\f03e"}i.icon.images.outline:before{content:"\f302"}i.icon.keyboard.outline:before{content:"\f11c"}i.icon.lemon.outline:before{content:"\f094"}i.icon.life.ring.outline:before{content:"\f1cd"}i.icon.lightbulb.outline:before{content:"\f0eb"}i.icon.list.alternate.outline:before{content:"\f022"}i.icon.map.outline:before{content:"\f279"}i.icon.meh.outline:before{content:"\f11a"}i.icon.minus.square.outline:before{content:"\f146"}i.icon.money.bill.alternate.outline:before{content:"\f3d1"}i.icon.moon.outline:before{content:"\f186"}i.icon.newspaper.outline:before{content:"\f1ea"}i.icon.object.group.outline:before{content:"\f247"}i.icon.object.ungroup.outline:before{content:"\f248"}i.icon.paper.plane.outline:before{content:"\f1d8"}i.icon.pause.circle.outline:before{content:"\f28b"}i.icon.play.circle.outline:before{content:"\f144"}i.icon.plus.square.outline:before{content:"\f0fe"}i.icon.question.circle.outline:before{content:"\f059"}i.icon.registered.outline:before{content:"\f25d"}i.icon.save.outline:before{content:"\f0c7"}i.icon.share.square.outline:before{content:"\f14d"}i.icon.smile.outline:before{content:"\f118"}i.icon.snowflake.outline:before{content:"\f2dc"}i.icon.square.outline:before{content:"\f0c8"}i.icon.star.outline:before{content:"\f005"}i.icon.star.half.outline:before{content:"\f089"}i.icon.sticky.note.outline:before{content:"\f249"}i.icon.stop.circle.outline:before{content:"\f28d"}i.icon.sun.outline:before{content:"\f185"}i.icon.thumbs.down.outline:before{content:"\f165"}i.icon.thumbs.up.outline:before{content:"\f164"}i.icon.times.circle.outline:before{content:"\f057"}i.icon.trash.alternate.outline:before{content:"\f2ed"}i.icon.user.outline:before{content:"\f007"}i.icon.user.circle.outline:before{content:"\f2bd"}i.icon.window.close.outline:before{content:"\f410"}i.icon.window.maximize.outline:before{content:"\f2d0"}i.icon.window.minimize.outline:before{content:"\f2d1"}i.icon.window.restore.outline:before{content:"\f2d2"}i.icon.disk.outline:before{content:"\f0a0"}i.icon.heart.empty,i.icon.star.empty{font-family:outline-icons}i.icon.heart.empty:before{content:"\f004"}i.icon.star.empty:before{content:"\f089"}@font-face{font-family:brand-icons;src:url(themes/default/assets/fonts/brand-icons.eot);src:url(themes/default/assets/fonts/brand-icons.eot?#iefix) format('embedded-opentype'),url(themes/default/assets/fonts/brand-icons.woff2) format('woff2'),url(themes/default/assets/fonts/brand-icons.woff) format('woff'),url(themes/default/assets/fonts/brand-icons.ttf) format('truetype'),url(themes/default/assets/fonts/brand-icons.svg#icons) format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon.\35 00px,i.icon.accessible.icon,i.icon.accusoft,i.icon.adn,i.icon.adversal,i.icon.affiliatetheme,i.icon.algolia,i.icon.amazon,i.icon.amazon.pay,i.icon.amilia,i.icon.android,i.icon.angellist,i.icon.angrycreative,i.icon.angular,i.icon.app.store,i.icon.app.store.ios,i.icon.apper,i.icon.apple,i.icon.apple.pay,i.icon.asymmetrik,i.icon.audible,i.icon.autoprefixer,i.icon.avianex,i.icon.aviato,i.icon.aws,i.icon.bandcamp,i.icon.behance,i.icon.behance.square,i.icon.bimobject,i.icon.bitbucket,i.icon.bitcoin,i.icon.bity,i.icon.black.tie,i.icon.blackberry,i.icon.blogger,i.icon.blogger.b,i.icon.bluetooth,i.icon.bluetooth.b,i.icon.btc,i.icon.buromobelexperte,i.icon.buysellads,i.icon.cc.amazon.pay,i.icon.cc.amex,i.icon.cc.apple.pay,i.icon.cc.diners.club,i.icon.cc.discover,i.icon.cc.jcb,i.icon.cc.mastercard,i.icon.cc.paypal,i.icon.cc.stripe,i.icon.cc.visa,i.icon.centercode,i.icon.chrome,i.icon.cloudscale,i.icon.cloudsmith,i.icon.cloudversify,i.icon.codepen,i.icon.codiepie,i.icon.connectdevelop,i.icon.contao,i.icon.cpanel,i.icon.creative.commons,i.icon.css3,i.icon.css3.alternate,i.icon.cuttlefish,i.icon.d.and.d,i.icon.dashcube,i.icon.delicious,i.icon.deploydog,i.icon.deskpro,i.icon.deviantart,i.icon.digg,i.icon.digital.ocean,i.icon.discord,i.icon.discourse,i.icon.dochub,i.icon.docker,i.icon.draft2digital,i.icon.dribbble,i.icon.dribbble.square,i.icon.dropbox,i.icon.drupal,i.icon.dyalog,i.icon.earlybirds,i.icon.edge,i.icon.elementor,i.icon.ember,i.icon.empire,i.icon.envira,i.icon.erlang,i.icon.ethereum,i.icon.etsy,i.icon.expeditedssl,i.icon.facebook,i.icon.facebook.f,i.icon.facebook.messenger,i.icon.facebook.square,i.icon.firefox,i.icon.first.order,i.icon.firstdraft,i.icon.flickr,i.icon.flipboard,i.icon.fly,i.icon.font.awesome,i.icon.font.awesome.alternate,i.icon.font.awesome.flag,i.icon.fonticons,i.icon.fonticons.fi,i.icon.fort.awesome,i.icon.fort.awesome.alternate,i.icon.forumbee,i.icon.foursquare,i.icon.free.code.camp,i.icon.freebsd,i.icon.get.pocket,i.icon.gg,i.icon.gg.circle,i.icon.git,i.icon.git.square,i.icon.github,i.icon.github.alternate,i.icon.github.square,i.icon.gitkraken,i.icon.gitlab,i.icon.gitter,i.icon.glide,i.icon.glide.g,i.icon.gofore,i.icon.goodreads,i.icon.goodreads.g,i.icon.google,i.icon.google.drive,i.icon.google.play,i.icon.google.plus,i.icon.google.plus.g,i.icon.google.plus.square,i.icon.google.wallet,i.icon.gratipay,i.icon.grav,i.icon.gripfire,i.icon.grunt,i.icon.gulp,i.icon.hacker.news,i.icon.hacker.news.square,i.icon.hips,i.icon.hire.a.helper,i.icon.hooli,i.icon.hotjar,i.icon.houzz,i.icon.html5,i.icon.hubspot,i.icon.imdb,i.icon.instagram,i.icon.internet.explorer,i.icon.ioxhost,i.icon.itunes,i.icon.itunes.note,i.icon.jenkins,i.icon.joget,i.icon.joomla,i.icon.js,i.icon.js.square,i.icon.jsfiddle,i.icon.keycdn,i.icon.kickstarter,i.icon.kickstarter.k,i.icon.korvue,i.icon.laravel,i.icon.lastfm,i.icon.lastfm.square,i.icon.leanpub,i.icon.less,i.icon.linechat,i.icon.linkedin,i.icon.linkedin.alternate,i.icon.linkedin.in,i.icon.linode,i.icon.linux,i.icon.lyft,i.icon.magento,i.icon.maxcdn,i.icon.medapps,i.icon.medium,i.icon.medium.m,i.icon.medrt,i.icon.meetup,i.icon.microsoft,i.icon.mix,i.icon.mixcloud,i.icon.mizuni,i.icon.modx,i.icon.monero,i.icon.napster,i.icon.nintendo.switch,i.icon.node,i.icon.node.js,i.icon.npm,i.icon.ns8,i.icon.nutritionix,i.icon.odnoklassniki,i.icon.odnoklassniki.square,i.icon.opencart,i.icon.openid,i.icon.opera,i.icon.optin.monster,i.icon.osi,i.icon.page4,i.icon.pagelines,i.icon.palfed,i.icon.patreon,i.icon.paypal,i.icon.periscope,i.icon.phabricator,i.icon.phoenix.framework,i.icon.php,i.icon.pied.piper,i.icon.pied.piper.alternate,i.icon.pied.piper.pp,i.icon.pinterest,i.icon.pinterest.p,i.icon.pinterest.square,i.icon.playstation,i.icon.product.hunt,i.icon.pushed,i.icon.python,i.icon.qq,i.icon.quinscape,i.icon.quora,i.icon.ravelry,i.icon.react,i.icon.rebel,i.icon.reddit,i.icon.reddit.alien,i.icon.reddit.square,i.icon.redriver,i.icon.rendact,i.icon.renren,i.icon.replyd,i.icon.resolving,i.icon.rocketchat,i.icon.rockrms,i.icon.safari,i.icon.sass,i.icon.schlix,i.icon.scribd,i.icon.searchengin,i.icon.sellcast,i.icon.sellsy,i.icon.servicestack,i.icon.shirtsinbulk,i.icon.simplybuilt,i.icon.sistrix,i.icon.skyatlas,i.icon.skype,i.icon.slack,i.icon.slack.hash,i.icon.slideshare,i.icon.snapchat,i.icon.snapchat.ghost,i.icon.snapchat.square,i.icon.soundcloud,i.icon.speakap,i.icon.spotify,i.icon.stack.exchange,i.icon.stack.overflow,i.icon.staylinked,i.icon.steam,i.icon.steam.square,i.icon.steam.symbol,i.icon.sticker.mule,i.icon.strava,i.icon.stripe,i.icon.stripe.s,i.icon.studiovinari,i.icon.stumbleupon,i.icon.stumbleupon.circle,i.icon.superpowers,i.icon.supple,i.icon.telegram,i.icon.telegram.plane,i.icon.tencent.weibo,i.icon.themeisle,i.icon.trello,i.icon.tripadvisor,i.icon.tumblr,i.icon.tumblr.square,i.icon.twitch,i.icon.twitter,i.icon.twitter.square,i.icon.typo3,i.icon.uber,i.icon.uikit,i.icon.uniregistry,i.icon.untappd,i.icon.usb,i.icon.ussunnah,i.icon.vaadin,i.icon.viacoin,i.icon.viadeo,i.icon.viadeo.square,i.icon.viber,i.icon.vimeo,i.icon.vimeo.square,i.icon.vimeo.v,i.icon.vine,i.icon.vk,i.icon.vnv,i.icon.vuejs,i.icon.wechat,i.icon.weibo,i.icon.weixin,i.icon.whatsapp,i.icon.whatsapp.square,i.icon.whmcs,i.icon.wikipedia.w,i.icon.windows,i.icon.wordpress,i.icon.wordpress.simple,i.icon.wpbeginner,i.icon.wpexplorer,i.icon.wpforms,i.icon.xbox,i.icon.xing,i.icon.xing.square,i.icon.y.combinator,i.icon.yahoo,i.icon.yandex,i.icon.yandex.international,i.icon.yelp,i.icon.yoast,i.icon.youtube,i.icon.youtube.square{font-family:brand-icons}/*! + * # Semantic UI 2.4.2 - Image + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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.images>.hidden.transition{display:inline-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 0}.ui.images .image,.ui.images>img,.ui.images>svg{display:inline-block;margin:0 .25rem .5rem}/*! + * # Semantic UI 2.4.2 - Input + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.input{position:relative;font-weight:400;font-style:normal;display:-webkit-inline-box;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;-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.21428571em;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;padding:.67857143em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,border-color .1s ease;transition:box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;-webkit-box-shadow:none;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:not(.disabled) input[disabled]{opacity:.45}.ui.disabled.input>input,.ui.input:not(.disabled) input[disabled]{pointer-events:none}.ui.input.down input,.ui.input>input:active{border-color:rgba(0,0,0,.3);background:#fafafa;color:rgba(0,0,0,.87);-webkit-box-shadow:none;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;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.input.focus>input,.ui.input>input:focus{border-color:#85b7d9;background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:none;box-shadow:none}.ui.input.focus>input::-webkit-input-placeholder,.ui.input>input:focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input::-moz-placeholder,.ui.input>input:focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input:-ms-input-placeholder,.ui.input>input:focus:-ms-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.error>input{background-color:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-box-shadow:none;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;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:0!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;-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:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-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:-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}/*! + * # Semantic UI 2.4.2 - Label + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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;-webkit-box-shadow:none;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;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);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}.ui.corner.label{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)}.ui[class*="right ribbon"].label{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 0}.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 0}.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:not(.dropdown),.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:none #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:none #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:none #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:none #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:none #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:none #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:none #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:none #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:none #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:none #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:none #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:none #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:none #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:none #fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}a.ui.basic.label:hover{text-decoration:none;background:none #fff;color:#1e70bf;-webkit-box-shadow:1px solid rgba(34,36,38,.15);box-shadow:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.pointing.label:before{border-color:inherit}.ui.fluid.labels>.label,.ui.label.fluid{width:100%;-webkit-box-sizing:border-box;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;background-image:inherit;border-width:none;border-style:solid;border-color:inherit}.ui.pointing.label:before{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;top:auto;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}/*! + * # Semantic UI 2.4.2 - List + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.list,ol.ui.list,ul.ui.list{list-style-type:none;margin:1em 0;padding:0 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:0;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;width:100%;padding:0 0 0 .5em;vertical-align:top}.ui.list .list>.item>img.image+.content,.ui.list>.item>img.image+.content{display:inline-block;width:auto}.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.list .item a:not(.ui):hover,.ui.link.list.list a.item:hover{color:rgba(0,0,0,.8)}.ui.link.list.list .item a:not(.ui):active,.ui.link.list.list a.item:active{color:rgba(0,0,0,.9)}.ui.link.list.list .active.item,.ui.link.list.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.list .item a:not(.ui):hover,.ui.inverted.link.list.list a.item:hover{color:#fff}.ui.inverted.link.list.list .item a:not(.ui):active,.ui.inverted.link.list.list a.item:active{color:#fff}.ui.inverted.link.list.list .active.item a:not(.ui),.ui.inverted.link.list.list a.active.item{color:#fff}.ui.selection.list .list>.item,.ui.selection.list>.item{cursor:pointer;background:0 0;padding:.5em .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{background:rgba(255,255,255,.08);color:#fff}.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 .list>.item{border-top:none}.ui.divided.list .item .list>.item{border-top:none}.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.list>.item,.ui.celled.inverted.list>.list{border-color:1px solid rgba(255,255,255,.1)}.ui.celled.inverted.horizontal.list .list>.item,.ui.celled.inverted.horizontal.list>.item{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}/*! + * # Semantic UI 2.4.2 - Loader + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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%;width:100%;height:100%;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loader:after{position:absolute;content:'';top:0;left:50%;width:100%;height:100%;-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;-webkit-box-shadow:0 0 0 1px transparent;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{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}/*! + * # Semantic UI 2.4.2 - Loader + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.placeholder{position:static;overflow:hidden;-webkit-animation:placeholderShimmer 2s linear;animation:placeholderShimmer 2s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;background-color:#fff;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.08)),color-stop(15%,rgba(0,0,0,.15)),color-stop(30%,rgba(0,0,0,.08)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-image:linear-gradient(to right,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-size:1200px 100%;max-width:30rem}@-webkit-keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}@keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}.ui.placeholder+.ui.placeholder{margin-top:2rem}.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.15s;animation-delay:.15s}.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.3s;animation-delay:.3s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.45s;animation-delay:.45s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.6s;animation-delay:.6s}.ui.placeholder,.ui.placeholder .image.header:after,.ui.placeholder .line,.ui.placeholder .line:after,.ui.placeholder>:before{background-color:#fff}.ui.placeholder .image:not(.header):not(.ui){height:100px}.ui.placeholder .square.image:not(.header){height:0;overflow:hidden;padding-top:100%}.ui.placeholder .rectangular.image:not(.header){height:0;overflow:hidden;padding-top:75%}.ui.placeholder .line{position:relative;height:.85714286em}.ui.placeholder .line:after,.ui.placeholder .line:before{top:100%;position:absolute;content:'';background-color:inherit}.ui.placeholder .line:before{left:0}.ui.placeholder .line:after{right:0}.ui.placeholder .line{margin-bottom:.5em}.ui.placeholder .line:after,.ui.placeholder .line:before{height:.5em}.ui.placeholder .line:not(:first-child){margin-top:.5em}.ui.placeholder .header{position:relative;overflow:hidden}.ui.placeholder .line:nth-child(1):after{width:0%}.ui.placeholder .line:nth-child(2):after{width:50%}.ui.placeholder .line:nth-child(3):after{width:10%}.ui.placeholder .line:nth-child(4):after{width:35%}.ui.placeholder .line:nth-child(5):after{width:65%}.ui.placeholder .header .line{margin-bottom:.64285714em}.ui.placeholder .header .line:after,.ui.placeholder .header .line:before{height:.64285714em}.ui.placeholder .header .line:not(:first-child){margin-top:.64285714em}.ui.placeholder .header .line:after{width:20%}.ui.placeholder .header .line:nth-child(2):after{width:60%}.ui.placeholder .image.header .line{margin-left:3em}.ui.placeholder .image.header .line:before{width:.71428571rem}.ui.placeholder .image.header:after{display:block;height:.85714286em;content:'';margin-left:3em}.ui.placeholder .header .line:first-child,.ui.placeholder .image .line:first-child,.ui.placeholder .paragraph .line:first-child{height:.01px}.ui.placeholder .header:not(:first-child):before,.ui.placeholder .image:not(:first-child):before,.ui.placeholder .paragraph:not(:first-child):before{height:1.42857143em;content:'';display:block}.ui.inverted.placeholder{background-image:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,.08)),color-stop(15%,rgba(255,255,255,.14)),color-stop(30%,rgba(255,255,255,.08)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%);background-image:linear-gradient(to right,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%)}.ui.inverted.placeholder,.ui.inverted.placeholder .image.header:after,.ui.inverted.placeholder .line,.ui.inverted.placeholder .line:after,.ui.inverted.placeholder>:before{background-color:#1b1c1d}.ui.placeholder .full.line.line.line:after{width:0%}.ui.placeholder .very.long.line.line.line:after{width:10%}.ui.placeholder .long.line.line.line:after{width:35%}.ui.placeholder .medium.line.line.line:after{width:50%}.ui.placeholder .short.line.line.line:after{width:65%}.ui.placeholder .very.short.line.line.line:after{width:80%}.ui.fluid.placeholder{max-width:none}/*! + * # Semantic UI 2.4.2 - Rail + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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}/*! + * # Semantic UI 2.4.2 - Reveal + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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%;white-space:normal;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{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.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;white-space:normal;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.reveal>.ui.ribbon.label{z-index:5}.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}/*! + * # Semantic UI 2.4.2 - Segment + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.segment{position:relative;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;padding:1em 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 transparent;border-radius:0;-webkit-box-shadow:none;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);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui[class*="very basic"].table.segment{padding:1em 1em}.ui.placeholder.segment{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;max-width:initial;-webkit-animation:none;animation:none;overflow:visible;padding:1em 1em;min-height:18rem;background:#f9fafb;border-color:rgba(34,36,38,.15);-webkit-box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset;box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset}.ui.placeholder.segment .button,.ui.placeholder.segment textarea{display:block}.ui.placeholder.segment .button,.ui.placeholder.segment .field,.ui.placeholder.segment textarea,.ui.placeholder.segment>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment .column .button,.ui.placeholder.segment .column .field,.ui.placeholder.segment .column textarea,.ui.placeholder.segment .column>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment>.inline{-ms-flex-item-align:center;align-self:center}.ui.placeholder.segment>.inline>.button{display:inline-block;width:auto;margin:0 .35714286rem 0 0}.ui.placeholder.segment>.inline>.button:last-child{margin-right:0}.ui.piled.segment,.ui.piled.segments{margin:3em 0;-webkit-box-shadow:'';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);-webkit-box-shadow:'';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.padded.segment.vertical.segment,.ui[class*="very padded"].vertical.segment{padding-left:0;padding-right:0}.ui.compact.segment{display:table}.ui.compact.segments{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.ui.compact.segments .segment,.ui.segments .compact.segment{display:block;-webkit-box-flex:0;-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{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);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;-ms-flex-direction:column;flex-direction:column;position:relative;margin:1rem 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 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;-webkit-box-shadow:none;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;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;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 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:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background-color:transparent;border-radius:0;padding:0;background-color:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);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;-webkit-box-shadow:none;box-shadow:none;border-top:1px solid rgba(34,36,38,.15)}.ui.horizontal.segments>.segment{-webkit-box-flex:1;flex:1 1 auto;-ms-flex:1 1 0px;margin:0;min-width:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow: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;pointer-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) rgba(0,0,0,.1);border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;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 transparent;-webkit-box-shadow: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!important}.ui.inverted.red.segment{background-color:#db2828!important;color:#fff!important}.ui.orange.segment:not(.inverted){border-top:2px solid #f2711c!important}.ui.inverted.orange.segment{background-color:#f2711c!important;color:#fff!important}.ui.yellow.segment:not(.inverted){border-top:2px solid #fbbd08!important}.ui.inverted.yellow.segment{background-color:#fbbd08!important;color:#fff!important}.ui.olive.segment:not(.inverted){border-top:2px solid #b5cc18!important}.ui.inverted.olive.segment{background-color:#b5cc18!important;color:#fff!important}.ui.green.segment:not(.inverted){border-top:2px solid #21ba45!important}.ui.inverted.green.segment{background-color:#21ba45!important;color:#fff!important}.ui.teal.segment:not(.inverted){border-top:2px solid #00b5ad!important}.ui.inverted.teal.segment{background-color:#00b5ad!important;color:#fff!important}.ui.blue.segment:not(.inverted){border-top:2px solid #2185d0!important}.ui.inverted.blue.segment{background-color:#2185d0!important;color:#fff!important}.ui.violet.segment:not(.inverted){border-top:2px solid #6435c9!important}.ui.inverted.violet.segment{background-color:#6435c9!important;color:#fff!important}.ui.purple.segment:not(.inverted){border-top:2px solid #a333c8!important}.ui.inverted.purple.segment{background-color:#a333c8!important;color:#fff!important}.ui.pink.segment:not(.inverted){border-top:2px solid #e03997!important}.ui.inverted.pink.segment{background-color:#e03997!important;color:#fff!important}.ui.brown.segment:not(.inverted){border-top:2px solid #a5673f!important}.ui.inverted.brown.segment{background-color:#a5673f!important;color:#fff!important}.ui.grey.segment:not(.inverted){border-top:2px solid #767676!important}.ui.inverted.grey.segment{background-color:#767676!important;color:#fff!important}.ui.black.segment:not(.inverted){border-top:2px solid #1b1c1d!important}.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;-webkit-box-shadow: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:#4c4f52 -webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,.2)),to(rgba(255,255,255,.2)));background:#4c4f52 -webkit-linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);background:#4c4f52 linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);color:rgba(255,255,255,.8)}.ui.tertiary.segment{background:#dcddde;color:rgba(0,0,0,.6)}.ui.tertiary.inverted.segment{background:#717579 -webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,.35)),to(rgba(255,255,255,.35)));background:#717579 -webkit-linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);background:#717579 linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);color:rgba(255,255,255,.8)}.ui.attached.segment{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% - (-1px * 2));max-width:calc(100% - (-1px * 2));-webkit-box-shadow:none;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;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;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}/*! + * # Semantic UI 2.4.2 - Step + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;margin:1em 0;background:'';-webkit-box-shadow:none;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:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;vertical-align:middle;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0 0;padding:1.14285714em 2em;background:#fff;color:rgba(0,0,0,.87);-webkit-box-shadow:none;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,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;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-box-shadow .1s ease}.ui.steps .step:after{display:none;position:absolute;z-index:2;content:'';top:50%;right:0;border:medium none;background-color:#fff;width:1.14285714em;height:1.14285714em;border-style:solid;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,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;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-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}.ui.steps .step:last-child{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;-ms-flex:0 1 auto;flex:0 1 auto;-ms-flex-item-align:middle;align-self:middle}.ui.steps .step>.icon~.content{-webkit-box-flex: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, ".");-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;-ms-flex-item-align:middle;align-self:middle}.ui.vertical.steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:visible}.ui.vertical.steps .step{-webkit-box-pack: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{display:none}.ui.vertical.steps .step:after{top:50%;right:0;border-width:0 1px 1px 0}.ui.vertical.steps .step:after{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:not(.unstackable){display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.steps:not(.unstackable) .step{width:100%!important;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em}.ui.steps:not(.unstackable) .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.steps:not(.unstackable) .step:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.steps:not(.unstackable) .step:after{display:none!important}.ui.steps:not(.unstackable) .step .content{text-align:center}.ui.ordered.steps:not(.unstackable) .step:before,.ui.steps:not(.unstackable) .step>.icon{margin:0 0 1rem 0}}.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 .step:after{display:block}.ui.steps .active.step:after{display:block}.ui.steps .step:last-child:after{display:none}.ui.steps .active.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}.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:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui[class*="tablet stackable"].steps .step{-webkit-box-orient:vertical;-webkit-box-direction:normal;-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 0}}.ui.fluid.steps{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.ui.attached.steps{width:calc(100% + (--1px * 2))!important;margin:0 -1px 0;max-width:calc(100% + (--1px * 2));border-radius:.28571429rem .28571429rem 0 0}.ui.attached.steps .step:first-child{border-radius:.28571429rem 0 0 0}.ui.attached.steps .step:last-child{border-radius:0 .28571429rem 0 0}.ui.bottom.attached.steps{margin:0 -1px 0;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 0}.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{-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.ordered.steps .step.completed:before,.ui.steps .step.completed>.icon:before{font-family:Step;content:'\e800'}/*! + * # Semantic UI 2.4.2 - Breadcrumb + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.breadcrumb{line-height:1;display:inline-block;margin:0 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 0;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}/*! + * # Semantic UI 2.4.2 - Form + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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 0;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url],.ui.form textarea{width:100%;vertical-align:top}.ui.form ::-webkit-datetime-edit,.ui.form ::-webkit-inner-spin-button{height:1.21428571em}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url]{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.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;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;-webkit-box-shadow:0 0 0 0 transparent inset;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;-webkit-box-shadow:0 0 0 0 transparent inset;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;-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{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#e5dfa1!important}.ui.form .field.field input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#d5c315!important}.ui.form .error.error input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #fffaf0 inset!important;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)!important}.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)!important}.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=date]:focus,.ui.form input[type=datetime-local]:focus,.ui.form input[type=email]:focus,.ui.form input[type=file]:focus,.ui.form input[type=number]:focus,.ui.form input[type=password]:focus,.ui.form input[type=search]:focus,.ui.form input[type=tel]:focus,.ui.form input[type=text]:focus,.ui.form input[type=time]:focus,.ui.form input[type=url]:focus{color:rgba(0,0,0,.95);border-color:#85b7d9;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;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;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;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:-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:-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:-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=date],.ui.form .field.error input[type=datetime-local],.ui.form .field.error input[type=email],.ui.form .field.error input[type=file],.ui.form .field.error input[type=number],.ui.form .field.error input[type=password],.ui.form .field.error input[type=search],.ui.form .field.error input[type=tel],.ui.form .field.error input[type=text],.ui.form .field.error input[type=time],.ui.form .field.error input[type=url],.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=date],.ui.form .fields.error .field input[type=datetime-local],.ui.form .fields.error .field input[type=email],.ui.form .fields.error .field input[type=file],.ui.form .fields.error .field input[type=number],.ui.form .fields.error .field input[type=password],.ui.form .fields.error .field input[type=search],.ui.form .fields.error .field input[type=tel],.ui.form .fields.error .field input[type=text],.ui.form .fields.error .field input[type=time],.ui.form .fields.error .field input[type=url],.ui.form .fields.error .field select,.ui.form .fields.error .field textarea{background:#fff6f6;border-color:#e0b4b4;color:#9f3a38;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.error input:not([type]):focus,.ui.form .field.error input[type=date]:focus,.ui.form .field.error input[type=datetime-local]:focus,.ui.form .field.error input[type=email]:focus,.ui.form .field.error input[type=file]:focus,.ui.form .field.error input[type=number]:focus,.ui.form .field.error input[type=password]:focus,.ui.form .field.error input[type=search]:focus,.ui.form .field.error input[type=tel]:focus,.ui.form .field.error input[type=text]:focus,.ui.form .field.error input[type=time]:focus,.ui.form .field.error input[type=url]:focus,.ui.form .field.error select:focus,.ui.form .field.error textarea:focus{background:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-appearance:none;-webkit-box-shadow: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 .fields.error .field .ui.dropdown{border-color:#e0b4b4!important}.ui.form .field.error .ui.dropdown:hover,.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 .fields.error .field .ui.dropdown .menu .item:hover{background-color:#fbe7e7}.ui.form .field.error .ui.dropdown .menu .selected.item,.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,.ui.form .fields.disabled>label{opacity:.45}.ui.form .field.disabled :disabled{opacity:1}.ui.loading.form{position:relative;cursor:default;pointer-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) rgba(0,0,0,.1);border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;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=date],.ui.inverted.form input[type=datetime-local],.ui.inverted.form input[type=email],.ui.inverted.form input[type=file],.ui.inverted.form input[type=number],.ui.inverted.form input[type=password],.ui.inverted.form input[type=search],.ui.inverted.form input[type=tel],.ui.inverted.form input[type=text],.ui.inverted.form input[type=time],.ui.inverted.form input[type=url]{background:#fff;border-color:rgba(255,255,255,.1);color:rgba(0,0,0,.87);-webkit-box-shadow:none;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 0;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:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;margin:0 -.5em 1em}.ui.form .fields>.field{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;padding-left:.5em;padding-right:.5em}.ui.form .fields>.field:first-child{border-left:none;-webkit-box-shadow: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{-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) [class*="equal width"].fields:not(.unstackable)>.field,.ui[class*="equal width"].form:not(.unstackable) .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:not(.unstackable) .fields:not(.unstackable)>.eight.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.eleven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fifteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.five.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.four.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fourteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.nine.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.seven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.six.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.sixteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.ten.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.thirteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.three.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.twelve.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.two.wide.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.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;-ms-flex:1 1 auto;flex:1 1 auto}.ui.form .inline.fields{margin:0 0 1em;-webkit-box-align:center;-ms-flex-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:-ms-flexbox;display:flex;-webkit-box-align: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}/*! + * # Semantic UI 2.4.2 - Grid + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;padding:0}.ui.grid{margin-top:-1rem;margin-bottom:-1rem;margin-left:-1rem;margin-right:-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:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:inherit;-ms-flex-pack:inherit;justify-content:inherit;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%!important;padding:0;padding-top:1rem;padding-bottom:1rem}.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;-ms-flex-positive:1;flex-grow:1;margin:1rem 1rem}.ui.grid .column+.ui.vertical.divider{height:calc(50% - (2rem / 2))}.ui.grid>.column:last-child>.horizontal.segment,.ui.grid>.row>.column:last-child>.horizontal.segment{-webkit-box-shadow:none;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{width:100%}.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{-webkit-box-shadow:none;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;-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{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);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}.ui.divided.grid:not([class*="vertically divided"])>.column:first-child,.ui.divided.grid:not([class*="vertically divided"])>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*="vertically divided"].grid>.row:first-child>.column{margin-top:0}.ui.grid>.divided.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui.grid>.divided.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*="vertically divided"].grid>.row{position:relative}.ui[class*="vertically divided"].grid>.row:before{position:absolute;content:"";top:0;left:0;width:calc(100% - 2rem);height:1px;margin:0 1rem;-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);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{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.divided.grid:not([class*="vertically divided"])>.column:not(.row),.ui.inverted.divided.grid:not([class*="vertically divided"])>.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(255,255,255,.1);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{-webkit-box-shadow:none;box-shadow:none}.ui.inverted[class*="vertically divided"].grid>.row:before{-webkit-box-shadow:0 -1px 0 0 rgba(255,255,255,.1);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:2.5rem;margin-right:2.5rem;width:calc(100% - 5rem)}.ui.celled.grid{width:100%;margin:1em 0;-webkit-box-shadow:0 0 0 1px #d4d4d5;box-shadow:0 0 0 1px #d4d4d5}.ui.celled.grid>.row{width:100%!important;margin:0;padding:0;-webkit-box-shadow:0 -1px 0 0 #d4d4d5;box-shadow:0 -1px 0 0 #d4d4d5}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui.celled.grid>.column:first-child,.ui.celled.grid>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{padding:1em}.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{-webkit-box-shadow:none;box-shadow:none;margin:0}.ui[class*="internally celled"].grid>.row:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*="internally celled"].grid>.row>.column:first-child{-webkit-box-shadow:none;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;-ms-flex-direction:column;flex-direction:column;vertical-align:top;-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;-ms-flex-direction:column;flex-direction:column;vertical-align:middle;-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;-ms-flex-direction:column;flex-direction:column;vertical-align:bottom;-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:-ms-inline-flexbox!important;display:inline-flex!important;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-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;-ms-flex-positive:1;flex-grow:1}.ui.grid>.row>[class*="left aligned"].column.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;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.row>[class*="center aligned"].column.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;-ms-flex-item-align:inherit;align-self:inherit}.ui[class*="center aligned"].grid{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.grid>.row>[class*="right aligned"].column.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;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.justified.column.column,.ui.grid>.justified.row>.column,.ui.grid>.row>.justified.column.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;-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;-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;-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;-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{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);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{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*="vertically divided"][class*="mobile vertically reversed"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="mobile vertically reversed"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*="mobile reversed"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*="mobile reversed"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;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;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*="tablet vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction: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{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);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{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*="vertically divided"][class*="tablet vertically reversed"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="tablet vertically reversed"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*="tablet reversed"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*="tablet reversed"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;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;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*="computer vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction: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{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);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{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*="vertically divided"][class*="computer vertically reversed"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="computer vertically reversed"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*="computer reversed"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*="computer reversed"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;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;-webkit-box-shadow:none!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[class*="three column"].doubling.grid>.column:not(.row),.ui[class*="three column"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*="four column"].doubling.row.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[class*="five column"].doubling.grid>.column:not(.row),.ui[class*="five column"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="six column"].doubling.row.row>.column,.ui[class*="six column"].doubling.grid>.column:not(.row),.ui[class*="six column"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="seven column"].doubling.row.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[class*="eight column"].doubling.grid>.column:not(.row),.ui[class*="eight column"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*="nine column"].doubling.row.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[class*="ten column"].doubling.grid>.column:not(.row),.ui[class*="ten column"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*="eleven column"].doubling.row.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[class*="twelve column"].doubling.grid>.column:not(.row),.ui[class*="twelve column"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*="thirteen column"].doubling.row.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[class*="fourteen column"].doubling.grid>.column:not(.row),.ui[class*="fourteen column"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*="fifteen column"].doubling.row.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}}@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;-webkit-box-shadow:none!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[class*="three column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="three column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="four column"].doubling:not(.stackable).row.row>.column,.ui[class*="four column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="four column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="five column"].doubling:not(.stackable).row.row>.column,.ui[class*="five column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="five column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="six column"].doubling:not(.stackable).row.row>.column,.ui[class*="six column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="six column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="seven column"].doubling:not(.stackable).row.row>.column,.ui[class*="seven column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="seven column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="eight column"].doubling:not(.stackable).row.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[class*="nine column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="nine column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="ten column"].doubling:not(.stackable).row.row>.column,.ui[class*="ten column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="ten column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="eleven column"].doubling:not(.stackable).row.row>.column,.ui[class*="eleven column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="eleven column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="twelve column"].doubling:not(.stackable).row.row>.column,.ui[class*="twelve column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="twelve column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="thirteen column"].doubling:not(.stackable).row.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[class*="fourteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="fourteen column"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*="fifteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="fifteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="fifteen column"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*="sixteen column"].doubling:not(.stackable).row.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}}@media only screen and (max-width:767px){.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 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;padding:1rem 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);-webkit-box-shadow:none!important;box-shadow:none!important;padding-top:2rem!important;padding-bottom:2rem!important}.ui.stackable.celled.grid>.row{-webkit-box-shadow:none!important;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}}@media only screen and (max-width:767px){.ui.grid.grid.grid>.row>[class*="tablet 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[class*="tablet only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="computer only"].column:not(.mobile),.ui.grid.grid.grid>[class*="computer only"].column:not(.mobile),.ui.grid.grid.grid>[class*="computer only"].row:not(.mobile),.ui[class*="computer only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="large screen only"].column: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[class*="large screen only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.tablet),.ui.grid.grid.grid>[class*="mobile only"].column:not(.tablet),.ui.grid.grid.grid>[class*="mobile only"].row:not(.tablet),.ui[class*="mobile only"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*="computer 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[class*="computer only"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*="large screen only"].column: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[class*="large screen only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row: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*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="tablet 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[class*="tablet only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="large screen only"].column: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[class*="large screen only"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="tablet 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[class*="tablet only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1920px){.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*="tablet 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[class*="tablet only"].grid.grid.grid:not(.computer){display:none!important}}.ui.menu{display:-webkit-box;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);-webkit-box-shadow:0 1px 2px 0 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:-ms-flexbox;display:flex}.ui.menu:not(.vertical) .item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align: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;-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,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease,-webkit-box-shadow .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:-ms-flexbox;display:flex;-webkit-box-align:inherit;-ms-flex-align:inherit;align-items:inherit;-webkit-box-orient:inherit;-webkit-box-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:'';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 .item>i.dropdown.icon{padding:0;float:right;margin:0 0 0 1em}.ui.menu .dropdown.item .menu{min-width:calc(100% - 1px);border-radius:0 0 .28571429rem .28571429rem;background:#fff;margin:0 0 0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);-webkit-box-orient:vertical!important;-webkit-box-direction:normal!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;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important}.ui.menu .ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.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!important}.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{left:100%;min-width:0;margin:0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);border-radius:0 .28571429rem .28571429rem .28571429rem}.ui.vertical.menu .dropdown.item.upward .menu{bottom:0}.ui.vertical.menu .dropdown.item:not(.upward) .menu{top:0}.ui.vertical.menu .active.dropdown.item{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.menu .dropdown.active.item{-webkit-box-shadow:none;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}.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.menu .list .item:before{background:0 0!important}.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;-webkit-box-shadow:none;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!important;background-color:transparent!important;color:rgba(40,40,40,.3)!important}.ui.menu:not(.vertical) .left.item,.ui.menu:not(.vertical) :not(.dropdown)>.left.menu{display:-webkit-box;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:-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;-ms-flex-direction:column;flex-direction:column;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);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>.label{float:right;text-align:center}.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;-webkit-box-shadow:none;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;-webkit-box-shadow:none!important;box-shadow:none!important;border:none;background:none transparent;border-bottom:1px solid #d4d4d5}.ui.tabular.fluid.menu{width:calc(100% + (1px * 2))!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:none #fff;color:rgba(0,0,0,.95);border-top-width:1px;border-color:#d4d4d5;font-weight:700;margin-bottom:-1px;-webkit-box-shadow:none;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% + (1px * 2));left:-1px}.ui.bottom.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;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:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:-1px 0 0 0;border-radius:0 0 .28571429rem .28571429rem!important}.ui.vertical.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;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:none #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 transparent;border-radius:0;-webkit-box-shadow:none!important;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:none #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:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.ui.pagination.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.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);-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu{background:0 0;margin-left:-.35714286em;margin-right:-.35714286em;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu .item{-ms-flex-item-align:center;align-self:center;-webkit-box-shadow:none;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 transparent}.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{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);border-radius:.28571429rem}.ui.secondary.menu .active.item:hover{-webkit-box-shadow:none;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{-webkit-box-shadow:none;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.vertical.secondary.menu .item>.menu .item{background-color:transparent}.ui.secondary.inverted.menu{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;-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{-webkit-box-shadow:none!important;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;-webkit-box-shadow:none;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-color:rgba(255,255,255,.1)}.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 transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;margin:1em -.5em}.ui.text.menu .item{border-radius:0;-webkit-box-shadow:none;box-shadow:none;-ms-flex-item-align:center;align-self:center;margin:0 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.menu .item>img:not(.ui){margin:0}.ui.text.item.menu .item{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;-webkit-box-shadow:none;box-shadow:none;font-weight:400;color:rgba(0,0,0,.95)}.ui.text.menu .active.item:hover{background-color:transparent}.ui.text.pointing.menu .active.item:after{-webkit-box-shadow:none;box-shadow:none}.ui.text.attached.menu{-webkit-box-shadow:none;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;-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;-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.stackable.menu .left.menu,.ui.stackable.menu .right.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.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;-webkit-box-shadow:none;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{background:rgba(255,255,255,.08)}.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;-webkit-box-shadow:none;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;-webkit-box-shadow:none!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:-ms-inline-flexbox;display:inline-flex;margin:0;vertical-align:middle}.ui.compact.vertical.menu{display:inline-block}.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{width:auto!important}.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;-ms-flex-pack:center;justify-content:center}.ui.attached.item.menu{margin:0 -1px!important}.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:hover:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item: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% - (-1px * 2));max-width:calc(100% - (-1px * 2));-webkit-box-shadow:none;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;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;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 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.21428571rem}.ui.huge.vertical.menu{width:22rem}.ui.big.menu{font-size:1.14285714rem}.ui.big.vertical.menu{width:20rem}.ui.massive.menu{font-size:1.28571429rem}.ui.massive.vertical.menu{width:25rem}/*! + * # Semantic UI 2.4.2 - Message + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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,-webkit-box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;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,-webkit-box-shadow .1s ease;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent;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:-.14285714em 0 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:-ms-flexbox;display:flex}.ui.hidden.hidden.hidden.hidden.message{display:none}.ui.compact.message{display:inline-block}.ui.compact.icon.message{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.ui.attached.message{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;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;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15);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:-ms-flexbox;display:flex;width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.icon.message>.icon:not(.close){display:block;-webkit-box-flex:0;-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;-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{-webkit-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);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.black.message{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.positive.message{background-color:#fcfff5;color:#2c662d}.ui.attached.positive.message,.ui.positive.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent;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{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent;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{-webkit-box-shadow:0 0 0 1px #a9d5de inset,0 0 0 0 transparent;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{-webkit-box-shadow:0 0 0 1px #c9ba9b inset,0 0 0 0 transparent;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{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent;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{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #db2828 inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #f2711c inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #b58105 inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #8abc1e inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #1ebc30 inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #10a3a3 inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #2185d0 inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #6435c9 inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #a333c8 inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #e03997 inset,0 0 0 0 transparent;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;-webkit-box-shadow:0 0 0 1px #a5673f inset,0 0 0 0 transparent;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}/*! + * # Semantic UI 2.4.2 - Table + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.table{width:100%;background:#fff;margin:1em 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;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{-webkit-box-shadow:none;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 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{-webkit-box-shadow:none;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 .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 0}.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 tbody+tbody tr:first-child td{border-top:1px solid rgba(34,36,38,.1)}.ui.table td{padding:.78571429em .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%}.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){padding:0}.ui.table:not(.unstackable) thead{display:block}.ui.table:not(.unstackable) tfoot{display:block}.ui.table:not(.unstackable) tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important;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;-webkit-box-shadow:none!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{-webkit-box-shadow:none!important;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);-webkit-box-shadow:-1px -1px 0 1px #fff;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;-webkit-box-shadow:1px 1px 0 1px #fff;box-shadow:1px 1px 0 1px #fff}.ui.celled.definition.table thead:not(.full-width) th:first-child{-webkit-box-shadow:0 -1px 0 1px #fff;box-shadow:0 -1px 0 1px #fff}.ui.celled.definition.table tfoot:not(.full-width) th:first-child{-webkit-box-shadow:0 1px 0 1px #fff;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:'';-webkit-box-shadow:'';box-shadow:'';text-align:'';font-size:1em;padding-left:'';padding-right:''}.ui.definition.table thead:not(.full-width) th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table tfoot:not(.full-width) th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table td:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.table td.positive,.ui.table tr.positive{-webkit-box-shadow:0 0 0 #a3c293 inset;box-shadow:0 0 0 #a3c293 inset}.ui.table td.positive,.ui.table tr.positive{background:#fcfff5!important;color:#2c662d!important}.ui.table td.negative,.ui.table tr.negative{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset}.ui.table td.negative,.ui.table tr.negative{background:#fff6f6!important;color:#9f3a38!important}.ui.table td.error,.ui.table tr.error{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset}.ui.table td.error,.ui.table tr.error{background:#fff6f6!important;color:#9f3a38!important}.ui.table td.warning,.ui.table tr.warning{-webkit-box-shadow:0 0 0 #c9ba9b inset;box-shadow:0 0 0 #c9ba9b inset}.ui.table td.warning,.ui.table tr.warning{background:#fffaf3!important;color:#573a08!important}.ui.table td.active,.ui.table tr.active{-webkit-box-shadow:0 0 0 rgba(0,0,0,.87) inset;box-shadow:0 0 0 rgba(0,0,0,.87) inset}.ui.table td.active,.ui.table tr.active{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 thead{display:block}.ui[class*="tablet stackable"].table tfoot{display:block}.ui[class*="tablet stackable"].table tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important;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;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.definition[class*="tablet stackable"].table thead th:first-child{-webkit-box-shadow:none!important;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 .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% - (-1px * 2));max-width:calc(100% - (-1px * 2));-webkit-box-shadow:none;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;-webkit-box-shadow:none,none;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.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{width:6.25%}.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:rgba(255,255,255,.15) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.15) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.15) linear-gradient(transparent,rgba(0,0,0,.05));color:#fff}.ui.inverted.sortable.table thead th:hover{background:rgba(255,255,255,.08) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.08) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.08) linear-gradient(transparent,rgba(0,0,0,.05));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)!important}.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);-webkit-box-shadow:none;box-shadow:none}.ui.basic.table tfoot,.ui.basic.table thead{-webkit-box-shadow:none;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 1em}.ui[class*="very padded"].table th{padding-left:1.5em;padding-right:1.5em}.ui[class*="very padded"].table td{padding:1.5em 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}/*! + * # Semantic UI 2.4.2 - Ad + * http://github.com/semantic-org/semantic-ui/ + * + * + * Copyright 2013 Contributors + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.ad{display:block;overflow:hidden;margin:1em 0}.ui.ad:first-child{margin:0}.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)}/*! + * # Semantic UI 2.4.2 - Item + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.card,.ui.cards>.card{max-width:100%;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:290px;min-height:0;background:#fff;padding:0;border:none;border-radius:.28571429rem;-webkit-box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;-webkit-transition:-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:-webkit-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-box-shadow .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:-ms-flexbox;display:flex;margin:-.875em -.5em;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.cards>.card{display:-webkit-box;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;-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;-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 1em;-webkit-box-shadow:none;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.28571429em}.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;-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 0;padding:.75em 1em;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;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.raised.card,.ui.raised.cards>.card{-webkit-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);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.link.cards .raised.card:hover,.ui.link.raised.card:hover,.ui.raised.cards a.card:hover,a.ui.raised.card:hover{-webkit-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);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{-webkit-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);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;-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;-webkit-box-shadow:0 1px 3px 0 #bcbdbd,0 0 0 1px #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #db2828,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #d01919,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f2711c,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f26202,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #fbbd08,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #eaae00,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #b5cc18,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a7bd0d,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #21ba45,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #16ab39,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #00b5ad,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #009c95,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #2185d0,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1678c2,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #6435c9,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #5829bb,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a333c8,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #9627ba,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e03997,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e61a8d,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a5673f,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #975b33,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #767676,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #838383,0 1px 3px 0 #bcbdbd;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1b1c1d,0 1px 3px 0 #d4d4d5;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{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #27292a,0 1px 3px 0 #bcbdbd;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:-1em;margin-right:-1em}.ui.eight.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 1em;padding:0!important;width:calc(100% - 2em)!important}}.ui.cards>.card{font-size:1em}/*! + * # Semantic UI 2.4.2 - Comment + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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;-webkit-box-shadow:-1px 0 0 rgba(34,36,38,.15);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.mini.comments{font-size:.78571429rem}.ui.tiny.comments{font-size:.85714286rem}.ui.small.comments{font-size:.92857143rem}.ui.comments{font-size:1rem}.ui.large.comments{font-size:1.14285714rem}.ui.big.comments{font-size:1.28571429rem}.ui.huge.comments{font-size:1.42857143rem}.ui.massive.comments{font-size:1.71428571rem}/*! + * # Semantic UI 2.4.2 - Feed + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-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;-ms-flex:0 0 auto;flex:0 0 auto;width:2.5em;height:auto;-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;-ms-flex:1 1 auto;flex:1 1 auto;-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;-webkit-box-shadow:none;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}/*! + * # Semantic UI 2.4.2 - Item + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.items>.item{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1em 0;width:100%;min-height:0;background:0 0;padding:0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:-webkit-box-shadow .1s ease;transition:-webkit-box-shadow .1s ease;transition:box-shadow .1s ease;transition:box-shadow .1s ease,-webkit-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;-ms-flex:0 0 auto;flex:0 0 auto;display:block;float:none;margin:0;padding:0;max-height:'';-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;-ms-flex:1 1 auto;flex:1 1 auto;background:0 0;margin:0;padding:0;-webkit-box-shadow:none;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;-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{-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 .5em;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 0 0;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;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:not(.unstackable)>.item{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:2em 0}.ui.items:not(.unstackable)>.item>.image{display:block;margin-left:auto;margin-right:auto}.ui.items:not(.unstackable)>.item>.image,.ui.items:not(.unstackable)>.item>.image>img{max-width:100%!important;width:auto!important;max-height:250px!important}.ui.items:not(.unstackable)>.item>.image+.content{display:block;padding:1.5em 0 0}}.ui.items>.item>.image+[class*="top aligned"].content{-ms-flex-item-align:start;align-self:flex-start}.ui.items>.item>.image+[class*="middle aligned"].content{-ms-flex-item-align:center;align-self:center}.ui.items>.item>.image+[class*="bottom aligned"].content{-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}@media only screen and (max-width:767px){.ui.unstackable.items>.item>.image,.ui.unstackable.items>.item>.image>img{width:125px!important}}/*! + * # Semantic UI 2.4.2 - Statistic + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.statistic{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-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{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.statistics>.statistic{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0 1.5em 1em;max-width:auto}.ui.statistics{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1em -1.5em -1em}.ui.statistics:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.statistics:first-child{margin-top:0}.ui.statistic>.value,.ui.statistics .statistic>.value{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:4rem;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.statistics .statistic>.label~.value{margin-top:0}.ui.statistic>.value~.label,.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 -1em}.ui.ten.statistics .statistic{min-width:10%;margin:0 0 1em}.ui.nine.statistics{margin:0 0 -1em}.ui.nine.statistics .statistic{min-width:11.11111111%;margin:0 0 1em}.ui.eight.statistics{margin:0 0 -1em}.ui.eight.statistics .statistic{min-width:12.5%;margin:0 0 1em}.ui.seven.statistics{margin:0 0 -1em}.ui.seven.statistics .statistic{min-width:14.28571429%;margin:0 0 1em}.ui.six.statistics{margin:0 0 -1em}.ui.six.statistics .statistic{min-width:16.66666667%;margin:0 0 1em}.ui.five.statistics{margin:0 0 -1em}.ui.five.statistics .statistic{min-width:20%;margin:0 0 1em}.ui.four.statistics{margin:0 0 -1em}.ui.four.statistics .statistic{min-width:25%;margin:0 0 1em}.ui.three.statistics{margin:0 0 -1em}.ui.three.statistics .statistic{min-width:33.33333333%;margin:0 0 1em}.ui.two.statistics{margin:0 0 -1em}.ui.two.statistics .statistic{min-width:50%;margin:0 0 1em}.ui.one.statistics{margin:0 0 -1em}.ui.one.statistics .statistic{min-width:100%;margin:0 0 1em}.ui.horizontal.statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.horizontal.statistics{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0;max-width:none}.ui.horizontal.statistics .statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-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>.value,.ui.horizontal.statistics .statistic>.value{display:inline-block;vertical-align:middle}.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.statistic>.value,.ui.mini.statistics .statistic>.value{font-size:1.5rem!important}.ui.mini.horizontal.statistic>.value,.ui.mini.horizontal.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.statistic>.value,.ui.tiny.statistics .statistic>.value{font-size:2rem!important}.ui.tiny.horizontal.statistic>.value,.ui.tiny.horizontal.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{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}/*! + * # Semantic UI 2.4.2 - Accordion + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.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;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15);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:0;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 .accordion .title:hover{background:0 0;color:rgba(0,0,0,.87)}.ui.styled.accordion .active.title{background:0 0;color:rgba(0,0,0,.95)}.ui.styled.accordion .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'}/*! + * # Semantic UI 2.4.2 - Checkbox + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .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,-webkit-box-shadow .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,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .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,-webkit-box-shadow .1s ease}.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 label:active::after{color:rgba(0,0,0,.95)}.ui.checkbox input:active~label{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:after{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~label{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;width:15px;height:15px;line-height:15px}.ui.radio.checkbox .box:after,.ui.radio.checkbox label:after{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:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;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);-webkit-box-shadow:none;box-shadow:none;width:3.5rem;height:1.5rem;border-radius:500rem}.ui.toggle.checkbox .box:after,.ui.toggle.checkbox label:after{background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;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;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.ui.toggle.checkbox input:focus~.box:before,.ui.toggle.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox .box:hover::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;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.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.toggle.checkbox{width:3.5rem}.ui.fitted.slider.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 .box:after,.ui.checkbox label:after{font-family:Checkbox}.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'}/*! + * # Semantic UI 2.4.2 - Dimmer + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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;padding:1em;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-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:opacity;z-index:1000}.ui.dimmer>.content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;color:#fff}.ui.segment>.ui.dimmer{border-radius:inherit!important}.ui.dimmer:not(.inverted)::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}.animating.dimmable:not(body),.dimmed.dimmable:not(body){overflow:hidden}.dimmed.dimmable>.ui.animating.dimmer,.dimmed.dimmable>.ui.visible.dimmer,.ui.active.dimmer{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.ui.disabled.dimmer{width:0!important;height:0!important}.dimmed.dimmable>.ui.animating.legacy.dimmer,.dimmed.dimmable>.ui.visible.legacy.dimmer,.ui.active.legacy.dimmer{display:block}.ui[class*="top aligned"].dimmer{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.ui[class*="bottom aligned"].dimmer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.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 -webkit-filter ease;transition:.8s -webkit-filter ease;transition:.8s filter ease;transition:.8s filter ease,.8s -webkit-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)}/*! + * # Semantic UI 2.4.2 - Dropdown + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.dropdown{cursor:pointer;position:relative;display:inline-block;outline:0;text-align:left;-webkit-transition:width .1s ease,-webkit-box-shadow .1s ease;transition:width .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease,-webkit-box-shadow .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 0;background:#fff;font-size:1em;text-shadow:none;text-align:left;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);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;width:auto;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;-webkit-box-shadow:none;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.dropdown .menu>.input{width:auto;display:-webkit-box;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%;right:auto;margin:0 0 0 -.5em!important;border-radius:.28571429rem!important;z-index:21!important}.ui.dropdown .menu .menu:after{display:none}.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-top:0}.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{margin-top:0}.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-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:top;width:auto;margin-top:-.5em;margin-bottom:-.5em;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.71428571em;background:#fff;display:inline-block;padding:.78571429em 2.1em .78571429em 1em;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:width .1s ease,-webkit-box-shadow .1s ease;transition:width .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease,-webkit-box-shadow .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.21428571em;top:.78571429em;right:1em;z-index:3;margin:-.78571429em;padding:.91666667em;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;width:auto;outline:0;margin:0 -1px;min-width:calc(100% + 2px);width:calc(100% + 2px);border-radius:0 0 .28571429rem .28571429rem;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);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);-webkit-box-shadow:none;box-shadow:none}.ui.selection.active.dropdown{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.active.dropdown .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.dropdown:focus{border-color:#96c8da;-webkit-box-shadow:none;box-shadow:none}.ui.selection.dropdown:focus .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);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{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.active.dropdown:hover .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.active.selection.dropdown>.dropdown.icon,.ui.visible.selection.dropdown>.dropdown.icon{opacity:'';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;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.active.empty.selection.dropdown .menu{border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.search.dropdown{min-width:''}.ui.search.dropdown>input.search{background:none transparent!important;border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;cursor:text;top:0;left:1px;width:100%;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);padding:inherit}.ui.search.dropdown>input.search{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.21428571em;padding:.67857143em 2.1em .67857143em 1em}.ui.search.selection.dropdown>span.sizer{line-height:1.21428571em;padding:.67857143em 2.1em .67857143em 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:.22619048em 2.1em .22619048em .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;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;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:.45238095em 0 .45238095em .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:.45238095em 0 .45238095em .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:.45238095em 0 .45238095em .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 .21428571em 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);-webkit-box-shadow:none;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}.ui.loading.selection.dropdown>i.icon{padding:1.5em 1.28571429em!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%;-webkit-box-shadow:0 0 0 1px transparent;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>.loading.menu{left:0!important;right:auto!important}.ui.dropdown>.menu .loading.menu{left:100%!important;right:auto!important}.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.selection.dropdown.error:hover{border-color:#e0b4b4}.ui.dropdown.error>.menu,.ui.dropdown.error>.menu .menu{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.dropdown>.clear.dropdown.icon{opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.dropdown>.clear.dropdown.icon:hover{opacity:1}.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>.left.menu{left:auto!important;right:0!important}.ui.dropdown .menu .left.menu,.ui.dropdown>.left.menu .menu{left:auto;right:100%;margin:0 -.5em 0 0!important;border-radius:.28571429rem!important}.ui.dropdown .item .left.dropdown.icon,.ui.dropdown .left.menu .item .dropdown.icon{width:auto;float:left;margin:0}.ui.dropdown .item .left.dropdown.icon,.ui.dropdown .left.menu .item .dropdown.icon{width:auto;float:left;margin:0}.ui.dropdown .item .left.dropdown.icon+.text,.ui.dropdown .left.menu .item .dropdown.icon+.text{margin-left:1em;margin-right:0}.ui.upward.dropdown>.menu{top:auto;bottom:100%;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.08);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;-webkit-box-shadow:0 -2px 3px 0 rgba(0,0,0,.08);box-shadow:0 -2px 3px 0 rgba(0,0,0,.08)}.ui.upward.selection.dropdown:hover{-webkit-box-shadow:0 0 2px 0 rgba(0,0,0,.05);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{-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.08);box-shadow:0 0 3px 0 rgba(0,0,0,.08);border-radius:0 0 .28571429rem .28571429rem!important}.ui.upward.active.selection.dropdown:hover{-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.05);box-shadow:0 0 3px 0 rgba(0,0,0,.05)}.ui.upward.active.selection.dropdown:hover .menu{-webkit-box-shadow:0 -2px 3px 0 rgba(0,0,0,.08);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;-webkit-box-shadow:none!important;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}.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}}@media only screen and (min-width:768px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:15.42857143rem}}@media only screen and (min-width:992px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}}@media only screen and (min-width:1920px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}}.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;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)!important;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;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);background:#fff;z-index:2}.ui.pointing.dropdown>.menu:after{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{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.pointing.dropdown>.left.menu:after,.ui.top.right.pointing.dropdown>.menu:after{top:-.25em;left:auto!important;right:1em!important;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.left:not(.top):not(.bottom).pointing.dropdown>.left.menu{left:auto!important;right:100%!important;margin:0 1em 0 0}.ui.left:not(.top):not(.bottom).pointing.dropdown>.left.menu:after{top:1em;left:auto;right:-.25em;margin:0;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.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.pointing.upward.dropdown .menu,.ui.top.pointing.upward.dropdown .menu{top:auto!important;bottom:100%!important;margin:0 0 .78571429rem;border-radius:.28571429rem}.ui.pointing.upward.dropdown .menu:after,.ui.top.pointing.upward.dropdown .menu:after{top:100%!important;bottom:auto!important;-webkit-box-shadow:1px 1px 0 0 rgba(34,36,38,.15);box-shadow:1px 1px 0 0 rgba(34,36,38,.15);margin:-.25em 0 0}.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu{top:auto!important;bottom:0!important;margin:0 1em 0 0}.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after{top:auto!important;bottom:0!important;margin:0 0 1em 0;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15)}.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu{top:auto!important;bottom:0!important;margin:0 0 0 1em}.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after{top:auto!important;bottom:0!important;margin:0 0 1em 0;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15)}@font-face{font-family:Dropdown;src:url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAVgAA8AAAAACFAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABWAAAABwAAAAchGgaq0dERUYAAAF0AAAAHAAAAB4AJwAPT1MvMgAAAZAAAABDAAAAVnW4TJdjbWFwAAAB1AAAAEsAAAFS8CcaqmN2dCAAAAIgAAAABAAAAAQAEQFEZ2FzcAAAAiQAAAAIAAAACP//AANnbHlmAAACLAAAAQoAAAGkrRHP9WhlYWQAAAM4AAAAMAAAADYPK8YyaGhlYQAAA2gAAAAdAAAAJANCAb1obXR4AAADiAAAACIAAAAiCBkAOGxvY2EAAAOsAAAAFAAAABQBnAIybWF4cAAAA8AAAAAfAAAAIAEVAF5uYW1lAAAD4AAAATAAAAKMFGlj5HBvc3QAAAUQAAAARgAAAHJoedjqd2ViZgAABVgAAAAGAAAABrO7W5UAAAABAAAAANXulPUAAAAA1r4hgAAAAADXu2Q1eNpjYGRgYOABYjEgZmJgBEIOIGYB8xgAA/YAN3jaY2BktGOcwMDKwMI4jTGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHFT/fLjFeOD/AQY9xjMMbkBhRpAcAN48DQYAeNpjYGBgZoBgGQZGBhDwAfIYwXwWBgMgzQGETAwMqn8+8H649f8/lHX9//9b7Pzf+fWgusCAkY0BzmUE6gHpQwGMDMMeAACbxg7SAAARAUQAAAAB//8AAnjadZBPSsNAGMXfS+yMqYgOhpSuSlKadmUhiVEhEMQzFF22m17BbbvzCh5BXCUn6EG8gjeQ4DepwYo4i+/ffL95j4EDA+CFC7jQuKyIeVHrI3wkleq9F7XrSInKteOeHdda8bOoaeepSc00NWPz/LRec9G8GabyGtEdF7h19z033GAMTK7zbM42xNEZpzYof0RtQ5CUHAQJ73OtVyutc+3b7Ou//b8XNlsPx3jgjUifABdhEohKJJL5iM5p39uqc7X1+sRQSqmGrUVhlsJ4lpmEUVwyT8SUYtg0P9DyNzPADDs+tjrGV6KRCRfsui3eHcL4/p8ZXvfMlcnEU+CLv7hDykOP+AKTPTxbAAB42mNgZGBgAGKuf5KP4vltvjLIMzGAwLV9ig0g+vruFFMQzdjACOJzMIClARh0CTJ42mNgZGBgPPD/AJD8wgAEjA0MjAyogAMAbOQEAQAAAAC7ABEAAAAAAKoAAAH0AAABgAAAAUAACAFAAAgAwAAXAAAAAAAAACoAKgAqADIAbACGAKAAugDSeNpjYGRgYOBkUGFgYgABEMkFhAwM/xn0QAIADdUBdAB42qWQvUoDQRSFv3GjaISUQaymSmGxJoGAsRC0iPYLsU50Y6IxrvlRtPCJJKUPIBb+PIHv4EN4djKuKAqCDHfmu+feOdwZoMCUAJNbAlYUMzaUlM14jjxbngOq7HnOia89z1Pk1vMCa9x7ztPkzfMyJbPj+ZGi6Xp+omxuPD+zaD7meaFg7mb8GrBqHmhwxoAxlm0uiRkpP9X5m26pKRoMxTGR1D49Dv/Yb/91o6l8qL6eu5n2hZQzn68utR9m3FU2cB4t9cdSLG2utI+44Eh/P9bqKO+oJ/WxmXssj77YkrjasZQD6SFddythk3Wtzrf+UF2p076Udla1VNzsERP3kkjVRKel7mp1udXYcHtZSlV7RfmJe1GiFWveluaeKD5/MuJcSk8Tpm/vvwPIbmJleNpjYGKAAFYG7ICTgYGRiZGZkYWRlZGNkZ2Rg5GTLT2nsiDDEEIZsZfmZRqZujmDaDcDAxcI7WIOpS2gtCWUdgQAZkcSmQAAAAFblbO6AAA=) format('woff');font-weight:400;font-style:normal}.ui.dropdown>.dropdown.icon{font-family:Dropdown;line-height:1;height:1em;width:1.23em;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.dropdown>.dropdown.icon{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.dropdown>.clear.icon:before{content:"\f00d"}/*! + * # Semantic UI 2.4.2 - Video + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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%;z-index:4;-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%}/*! + * # Semantic UI 2.4.2 - Modal + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.modal{position:absolute;display:none;z-index:1001;text-align:left;background:#fff;border:none;-webkit-box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);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%;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;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 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;-webkit-box-shadow:none;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.28571429em;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:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.ui.modal>.content>.image{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:'';-ms-flex-item-align:top;align-self:top}.ui.modal>[class*="top aligned"]{-ms-flex-item-align:top;align-self:top}.ui.modal>[class*="middle aligned"]{-ms-flex-item-align:middle;align-self:middle}.ui.modal>[class*=stretched]{-ms-flex-item-align:stretch;align-self:stretch}.ui.modal>.content>.description{display:block;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-width:0;-ms-flex-item-align:top;align-self:top}.ui.modal>.content>.icon+.description,.ui.modal>.content>.image+.description{-webkit-box-flex:0;-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 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}}@media only screen and (min-width:768px){.ui.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.modal{width:850px;margin:0}}@media only screen and (min-width:1200px){.ui.modal{width:900px;margin:0}}@media only screen and (min-width:1920px){.ui.modal{width:950px;margin:0}}@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 1rem!important;padding-right:2.25rem!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;-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;-webkit-box-shadow:none;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{-webkit-box-shadow:1px 3px 10px 2px rgba(0,0,0,.2);box-shadow:1px 3px 10px 2px rgba(0,0,0,.2)}.ui.basic.modal{background-color:transparent;border:none;border-radius:0;-webkit-box-shadow:none!important;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.legacy.modal,.ui.legacy.page.dimmer>.ui.modal{top:50%;left:50%}.ui.legacy.page.dimmer>.ui.scrolling.modal,.ui.page.dimmer>.ui.scrolling.legacy.modal,.ui.top.aligned.dimmer>.ui.legacy.modal,.ui.top.aligned.legacy.page.dimmer>.ui.modal{top:auto}@media only screen and (max-width:991px){.ui.basic.modal>.close{color:#fff}}.ui.loading.modal{display:block;visibility:hidden;z-index:-1}.ui.active.modal{display:block}.modals.dimmer[class*="top aligned"] .modal{margin:5vh auto}@media only screen and (max-width:767px){.modals.dimmer[class*="top aligned"] .modal{margin:1rem auto}}.legacy.modals.dimmer[class*="top aligned"]{padding-top:5vh}@media only screen and (max-width:767px){.legacy.modals.dimmer[class*="top aligned"]{padding-top:1rem}}.scrolling.dimmable.dimmed{overflow:hidden}.scrolling.dimmable>.dimmer{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.scrolling.dimmable.dimmed>.dimmer{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.dimmable>.dimmer{position:fixed}.modals.dimmer .ui.scrolling.modal{margin:1rem auto}.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:1rem!important}.ui.modal .scrolling.content{max-height:calc(80vh - 10em);overflow:auto}.ui.fullscreen.modal{width:95%!important;margin:1em auto}.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.mini.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.mini.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.mini.modal{width:35.2%;margin:0}}@media only screen and (min-width:992px){.ui.mini.modal{width:340px;margin:0}}@media only screen and (min-width:1200px){.ui.mini.modal{width:360px;margin:0}}@media only screen and (min-width:1920px){.ui.mini.modal{width:380px;margin:0}}.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.tiny.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.tiny.modal{width:52.8%;margin:0}}@media only screen and (min-width:992px){.ui.tiny.modal{width:510px;margin:0}}@media only screen and (min-width:1200px){.ui.tiny.modal{width:540px;margin:0}}@media only screen and (min-width:1920px){.ui.tiny.modal{width:570px;margin:0}}.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.small.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.small.modal{width:70.4%;margin:0}}@media only screen and (min-width:992px){.ui.small.modal{width:680px;margin:0}}@media only screen and (min-width:1200px){.ui.small.modal{width:720px;margin:0}}@media only screen and (min-width:1920px){.ui.small.modal{width:760px;margin:0}}.ui.large.modal>.header{font-size:1.6em}@media only screen and (max-width:767px){.ui.large.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.large.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.large.modal{width:1020px;margin:0}}@media only screen and (min-width:1200px){.ui.large.modal{width:1080px;margin:0}}@media only screen and (min-width:1920px){.ui.large.modal{width:1140px;margin:0}}/*! + * # Semantic UI 2.4.2 - Nag + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.2);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}/*! + * # Semantic UI 2.4.2 - Popup + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);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;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]{position:relative}[data-tooltip]:before{pointer-events:none;position:absolute;content:'';font-size:1rem;width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:2;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]:after{pointer-events:none;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;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);z-index:1}[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{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{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="bottom center"]:after,[data-tooltip][data-position="top 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="bottom left"]:after,[data-tooltip][data-position="bottom right"]:after,[data-tooltip][data-position="top left"]:after,[data-tooltip][data-position="top right"]:after{-webkit-transform:scale(0)!important;transform:scale(0)!important}[data-tooltip][data-position="bottom left"]:hover:after,[data-tooltip][data-position="bottom right"]:hover:after,[data-tooltip][data-position="top left"]:hover:after,[data-tooltip][data-position="top right"]:hover:after{-webkit-transform:scale(1)!important;transform:scale(1)!important}[data-tooltip][data-inverted]:before{-webkit-box-shadow:none!important;box-shadow:none!important}[data-tooltip][data-inverted]:before{background:#1b1c1d}[data-tooltip][data-inverted]:after{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow: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="left center"][data-tooltip]:before{right:100%;top:50%;margin-top:-.14285714rem;margin-right:-.07142857rem}[data-position="right center"][data-tooltip]:after{left:100%;top:50%;margin-left:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position="right center"][data-tooltip]:before{left:100%;top:50%;margin-top:-.07142857rem;margin-left:.14285714rem}[data-position~=bottom][data-tooltip]:before{background:#fff;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-position="left center"][data-tooltip]:before{background:#fff;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-position="right center"][data-tooltip]:before{background:#fff;-webkit-box-shadow:-1px 1px 0 0 #bababc;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;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-inverted][data-position="left center"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-inverted][data-position="right center"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}[data-inverted][data-position~=top][data-tooltip]:before{background:#1b1c1d}[data-position~=bottom][data-tooltip]:before{-webkit-transform-origin:center bottom;transform-origin:center bottom}[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{-webkit-transform-origin:right center;transform-origin:right center}[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}.ui.bottom.center.popup:before{margin-left:-.30714286em;top:-.30714286em;left:50%;right:auto;bottom:auto;-webkit-box-shadow:-1px -1px 0 0 #bababc;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;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.right.popup{margin-right:0}.ui.bottom.right.popup:before{top:-.30714286em;right:1em;bottom:auto;left:auto;margin-left:0;-webkit-box-shadow:-1px -1px 0 0 #bababc;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;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}.ui.right.center.popup:before{top:50%;left:-.30714286em;bottom:auto;right:auto;margin-top:-.30714286em;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}.ui.bottom.popup:before{background:#fff}.ui.left.center.popup:before,.ui.right.center.popup:before{background:#fff}.ui.top.popup:before{background:#fff}.ui.inverted.bottom.popup:before{background:#1b1c1d}.ui.inverted.left.center.popup:before,.ui.inverted.right.center.popup:before{background:#1b1c1d}.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;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.popup .header{background-color:none;color:#fff}.ui.inverted.popup:before{background-color:#1b1c1d;-webkit-box-shadow:none!important;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}/*! + * # Semantic UI 2.4.2 - Progress Bar + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.progress{position:relative;display:block;max-width:100%;border:none;margin:1em 0 2.5em;-webkit-box-shadow:none;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^="100"] .bar,.ui.indicating.progress[data-percent^="9"] .bar{background-color:#66da81}.ui.indicating.progress[data-percent^="1"] .label,.ui.indicating.progress[data-percent^="2"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="3"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="4"] .label,.ui.indicating.progress[data-percent^="5"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="6"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="7"] .label,.ui.indicating.progress[data-percent^="8"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="100"] .label,.ui.indicating.progress[data-percent^="9"] .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}/*! + * # Semantic UI 2.4.2 - Rating + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.ui.rating{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;white-space:nowrap;vertical-align:baseline}.ui.rating:last-child{margin-right:0}.ui.rating .icon{padding:0;margin:0;text-align:center;font-weight:400;font-style:normal;-webkit-box-flex:1;-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}.ui.rating .icon{background:0 0;color:rgba(0,0,0,.15)}.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.selected .active.icon{opacity:1}.ui.rating .icon.selected,.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{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,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) 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 .icon{font-family:Rating;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.rating .icon:before{content:'\f005'}.ui.rating .active.icon:before{content:'\f005'}.ui.star.rating .icon:before{content:'\f005'}.ui.star.rating .active.icon:before{content:'\f005'}.ui.star.rating .partial.icon:before{content:'\f006'}.ui.star.rating .partial.icon{content:'\f005'}.ui.heart.rating .icon:before{content:'\f004'}.ui.heart.rating .active.icon:before{content:'\f004'}/*! + * # Semantic UI 2.4.2 - Search + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;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,-webkit-box-shadow .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;text-align:left;text-transform:none;background:#fff;margin-top:.5em;width:18em;border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);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:-.14285714em 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 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;-webkit-box-shadow:0 0 0 1px transparent;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;-webkit-box-shadow:none;box-shadow:none}.ui.search>.results .result.active .title{color:rgba(0,0,0,.85)}.ui.search>.results .result.active .description{color:rgba(0,0,0,.85)}.ui.disabled.search{cursor:default;pointer-events:none;opacity:.45}.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.animating,.ui.category.search .results.visible{display:table}.ui.category.search>.results .category{display:table-row;background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none;-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:last-child .result:last-child{border-radius:0 0 .28571429rem 0}.ui.category.search>.results .category>.name{display:table-cell;text-overflow:ellipsis;width:100px;white-space:nowrap;background:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;padding:.4em 1em;font-weight:700;color:rgba(0,0,0,.4);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .results{display:table-cell;background:#fff;border-left:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .result{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[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}@media only screen and (max-width:767px){.ui.search .results{max-width:calc(100vw - 2rem)}}/*! + * # Semantic UI 2.4.2 - Shape + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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}.ui.shape .side{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);-webkit-box-shadow:0 0 2px rgba(0,0,0,.3);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}.ui.shape.animating .sides{-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}/*! + * # Semantic UI 2.4.2 - Sidebar + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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}.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}body.pushable>.pusher{background:#fff}.pushable>.pusher{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.left.visible.sidebar,.ui.right.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.bottom.visible.sidebar,.ui.top.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);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)}.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.left.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.right.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.top.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.bottom.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)}/*! + * # Semantic UI 2.4.2 - Sticky + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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}/*! + * # Semantic UI 2.4.2 - Tab + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}/*! + * # Semantic UI 2.4.2 - Transition + * http://github.com/semantic-org/semantic-ui/ + * + * + * Released under the MIT license + * http://opensource.org/licenses/MIT + * + */.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}}.transition.zoom.in{-webkit-animation-name:zoomIn;animation-name:zoomIn}.transition.zoom.out{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}}@keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(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}.transition.glow{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:cubic-bezier(.19,1,.22,1);animation-timing-function:cubic-bezier(.19,1,.22,1)}.transition.glow{-webkit-animation-name:glow;animation-name:glow}@-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%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes jiggle{0%{-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)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes jiggle{0%{-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)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}}@keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}} 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 25066de069a..00000000000 Binary files a/public/css/themes/basic/assets/fonts/icons.eot and /dev/null differ diff --git a/public/css/themes/basic/assets/fonts/icons.svg b/public/css/themes/basic/assets/fonts/icons.svg deleted file mode 100755 index b9c54d022b2..00000000000 --- a/public/css/themes/basic/assets/fonts/icons.svg +++ /dev/null @@ -1,450 +0,0 @@ - - - - -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 318a2643d3a..00000000000 Binary files a/public/css/themes/basic/assets/fonts/icons.ttf and /dev/null differ diff --git a/public/css/themes/basic/assets/fonts/icons.woff b/public/css/themes/basic/assets/fonts/icons.woff deleted file mode 100755 index baba1b5ebee..00000000000 Binary files a/public/css/themes/basic/assets/fonts/icons.woff and /dev/null differ diff --git a/public/css/themes/default/assets/fonts/brand-icons.eot b/public/css/themes/default/assets/fonts/brand-icons.eot new file mode 100755 index 00000000000..0a1ef3f7ec1 Binary files /dev/null and b/public/css/themes/default/assets/fonts/brand-icons.eot differ diff --git a/public/css/themes/default/assets/fonts/brand-icons.svg b/public/css/themes/default/assets/fonts/brand-icons.svg new file mode 100755 index 00000000000..ed5d1294bf6 --- /dev/null +++ b/public/css/themes/default/assets/fonts/brand-icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/css/themes/default/assets/fonts/brand-icons.ttf b/public/css/themes/default/assets/fonts/brand-icons.ttf new file mode 100755 index 00000000000..f99085132dc Binary files /dev/null and b/public/css/themes/default/assets/fonts/brand-icons.ttf differ diff --git a/public/css/themes/default/assets/fonts/brand-icons.woff b/public/css/themes/default/assets/fonts/brand-icons.woff new file mode 100755 index 00000000000..2e874012a93 Binary files /dev/null and b/public/css/themes/default/assets/fonts/brand-icons.woff differ diff --git a/public/css/themes/default/assets/fonts/brand-icons.woff2 b/public/css/themes/default/assets/fonts/brand-icons.woff2 new file mode 100755 index 00000000000..0d575fd51ac Binary files /dev/null and b/public/css/themes/default/assets/fonts/brand-icons.woff2 differ diff --git a/public/css/themes/default/assets/fonts/icons.eot b/public/css/themes/default/assets/fonts/icons.eot index c7b00d2ba88..ef75106be9b 100755 Binary files a/public/css/themes/default/assets/fonts/icons.eot and b/public/css/themes/default/assets/fonts/icons.eot differ diff --git a/public/css/themes/default/assets/fonts/icons.svg b/public/css/themes/default/assets/fonts/icons.svg index 8b66187fe06..d9d967fe1ef 100755 --- a/public/css/themes/default/assets/fonts/icons.svg +++ b/public/css/themes/default/assets/fonts/icons.svg @@ -1,685 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ 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 index f221e50a2ef..17bb6747a59 100755 Binary files a/public/css/themes/default/assets/fonts/icons.ttf and b/public/css/themes/default/assets/fonts/icons.ttf differ diff --git a/public/css/themes/default/assets/fonts/icons.woff b/public/css/themes/default/assets/fonts/icons.woff index 6e7483cf61b..4cf2a4fee4b 100755 Binary files a/public/css/themes/default/assets/fonts/icons.woff and b/public/css/themes/default/assets/fonts/icons.woff differ diff --git a/public/css/themes/default/assets/fonts/icons.woff2 b/public/css/themes/default/assets/fonts/icons.woff2 index 7eb74fd127e..eea9aa22813 100755 Binary files a/public/css/themes/default/assets/fonts/icons.woff2 and b/public/css/themes/default/assets/fonts/icons.woff2 differ diff --git a/public/css/themes/default/assets/fonts/outline-icons.eot b/public/css/themes/default/assets/fonts/outline-icons.eot new file mode 100755 index 00000000000..cda0a84cfb1 Binary files /dev/null and b/public/css/themes/default/assets/fonts/outline-icons.eot differ diff --git a/public/css/themes/default/assets/fonts/outline-icons.svg b/public/css/themes/default/assets/fonts/outline-icons.svg new file mode 100755 index 00000000000..69ea3f7ba05 --- /dev/null +++ b/public/css/themes/default/assets/fonts/outline-icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/css/themes/default/assets/fonts/outline-icons.ttf b/public/css/themes/default/assets/fonts/outline-icons.ttf new file mode 100755 index 00000000000..ee13f848ecc Binary files /dev/null and b/public/css/themes/default/assets/fonts/outline-icons.ttf differ diff --git a/public/css/themes/default/assets/fonts/outline-icons.woff b/public/css/themes/default/assets/fonts/outline-icons.woff new file mode 100755 index 00000000000..bcd834354ef Binary files /dev/null and b/public/css/themes/default/assets/fonts/outline-icons.woff differ diff --git a/public/css/themes/default/assets/fonts/outline-icons.woff2 b/public/css/themes/default/assets/fonts/outline-icons.woff2 new file mode 100755 index 00000000000..35cc7b3b7ac Binary files /dev/null and b/public/css/themes/default/assets/fonts/outline-icons.woff2 differ diff --git a/public/css/themes/github/assets/fonts/octicons-local.ttf b/public/css/themes/github/assets/fonts/octicons-local.ttf deleted file mode 100755 index d5f4e2ecaa3..00000000000 Binary files a/public/css/themes/github/assets/fonts/octicons-local.ttf and /dev/null differ diff --git a/public/css/themes/github/assets/fonts/octicons.svg b/public/css/themes/github/assets/fonts/octicons.svg deleted file mode 100755 index d3116a69b20..00000000000 --- a/public/css/themes/github/assets/fonts/octicons.svg +++ /dev/null @@ -1,200 +0,0 @@ - - - - -(c) 2012-2015 GitHub - -When using the GitHub logos, be sure to follow the GitHub logo guidelines (https://github.com/logos) - -Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL) -Applies to all font files - -Code License: MIT (http://choosealicense.com/licenses/mit/) -Applies to all other files - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/css/themes/github/assets/fonts/octicons.ttf b/public/css/themes/github/assets/fonts/octicons.ttf deleted file mode 100755 index 9e091053052..00000000000 Binary files a/public/css/themes/github/assets/fonts/octicons.ttf and /dev/null differ diff --git a/public/css/themes/github/assets/fonts/octicons.woff b/public/css/themes/github/assets/fonts/octicons.woff deleted file mode 100755 index cc3c19f0df5..00000000000 Binary files a/public/css/themes/github/assets/fonts/octicons.woff and /dev/null differ diff --git a/public/embed.go b/public/embed.go new file mode 100644 index 00000000000..c45ce376ba1 --- /dev/null +++ b/public/embed.go @@ -0,0 +1,8 @@ +package public + +import ( + "embed" +) + +//go:embed assets/* css/* img/* js/* plugins/* +var Files embed.FS diff --git a/public/img/404.png b/public/img/404.png index c4a068df78b..9a5541a5bfe 100644 Binary files a/public/img/404.png and b/public/img/404.png differ diff --git a/public/img/500.png b/public/img/500.png index 8813da109cb..a20930e710d 100644 Binary files a/public/img/500.png and b/public/img/500.png differ diff --git a/public/img/avatar_default.png b/public/img/avatar_default.png index fed568a12bf..6f0542ec727 100644 Binary files a/public/img/avatar_default.png and b/public/img/avatar_default.png differ diff --git a/public/img/dingtalk.png b/public/img/dingtalk.png new file mode 100644 index 00000000000..506d9383a85 Binary files /dev/null and b/public/img/dingtalk.png differ diff --git a/public/img/discord.png b/public/img/discord.png new file mode 100644 index 00000000000..db0e70d5d42 Binary files /dev/null and b/public/img/discord.png differ diff --git a/public/img/emoji/back.png b/public/img/emoji/back.png index 5851ddca4e5..dbb84798cb9 100644 Binary files a/public/img/emoji/back.png and b/public/img/emoji/back.png differ diff --git a/public/img/emoji/black_circle.png b/public/img/emoji/black_circle.png index e46f9df615f..e274de2de78 100644 Binary files a/public/img/emoji/black_circle.png and b/public/img/emoji/black_circle.png differ diff --git a/public/img/emoji/envelope.png b/public/img/emoji/envelope.png index 3631861bbfd..6c0f717a3ee 100644 Binary files a/public/img/emoji/envelope.png and b/public/img/emoji/envelope.png differ diff --git a/public/img/emoji/page_facing_up.png b/public/img/emoji/page_facing_up.png index 804c0d739fa..8712f88e38f 100644 Binary files a/public/img/emoji/page_facing_up.png and b/public/img/emoji/page_facing_up.png differ diff --git a/public/img/favicon.png b/public/img/favicon.png index edcf5746e7a..56941febf99 100644 Binary files a/public/img/favicon.png and b/public/img/favicon.png differ diff --git a/public/img/gogs-hero.png b/public/img/gogs-hero.png new file mode 100644 index 00000000000..4fbccac3aae Binary files /dev/null and b/public/img/gogs-hero.png differ diff --git a/public/img/gogs-large-resize.png b/public/img/gogs-large-resize.png deleted file mode 100644 index dc66c1ab32a..00000000000 Binary files a/public/img/gogs-large-resize.png and /dev/null differ diff --git a/public/img/gogs-lg.png b/public/img/gogs-lg.png deleted file mode 100644 index 9fa0a9da35f..00000000000 Binary files a/public/img/gogs-lg.png and /dev/null differ diff --git a/public/img/slack.png b/public/img/slack.png index eddb4801a8e..20cdfad9435 100644 Binary files a/public/img/slack.png and b/public/img/slack.png differ diff --git a/public/js/gogs.js b/public/js/gogs.js index d7fca174230..ab1cd8cdb87 100644 --- a/public/js/gogs.js +++ b/public/js/gogs.js @@ -1,1453 +1,1790 @@ -'use strict'; +"use strict"; var csrf; var suburl; function initCommentPreviewTab($form) { - var $tabMenu = $form.find('.tabular.menu'); - $tabMenu.find('.item').tab(); - $tabMenu.find('.item[data-tab="' + $tabMenu.data('preview') + '"]').click(function () { - var $this = $(this); - $.post($this.data('url'), { - "_csrf": csrf, - "mode": "gfm", - "context": $this.data('context'), - "text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val() - }, - function (data) { - var $previewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('preview') + '"]'); - $previewPanel.html(data); - emojify.run($previewPanel[0]); - $('pre code', $previewPanel[0]).each(function (i, block) { - hljs.highlightBlock(block); - }); - } - ); + var $tabMenu = $form.find(".tabular.menu"); + $tabMenu.find(".item").tab(); + $tabMenu + .find('.item[data-tab="' + $tabMenu.data("preview") + '"]') + .click(function() { + var $this = $(this); + $.post( + $this.data("url"), + { + _csrf: csrf, + mode: "gfm", + context: $this.data("context"), + text: $form + .find( + '.tab.segment[data-tab="' + $tabMenu.data("write") + '"] textarea' + ) + .val() + }, + function(data) { + var $previewPanel = $form.find( + '.tab.segment[data-tab="' + $tabMenu.data("preview") + '"]' + ); + $previewPanel.html(data); + emojify.run($previewPanel[0]); + $("pre code", $previewPanel[0]).each(function(i, block) { + hljs.highlightBlock(block); + }); + } + ); }); - buttonsClickOnEnter(); + buttonsClickOnEnter(); } var previewFileModes; function initEditPreviewTab($form) { - var $tabMenu = $form.find('.tabular.menu'); - $tabMenu.find('.item').tab(); - var $previewTab = $tabMenu.find('.item[data-tab="' + $tabMenu.data('preview') + '"]'); - if ($previewTab.length) { - previewFileModes = $previewTab.data('preview-file-modes').split(','); - $previewTab.click(function () { - var $this = $(this); - $.post($this.data('url'), { - "_csrf": csrf, - "mode": "gfm", - "context": $this.data('context'), - "text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val() - }, - function (data) { - var $previewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('preview') + '"]'); - $previewPanel.html(data); - emojify.run($previewPanel[0]); - $('pre code', $previewPanel[0]).each(function (i, block) { - hljs.highlightBlock(block); - }); - } - ); - }); - } + var $tabMenu = $form.find(".tabular.menu"); + $tabMenu.find(".item").tab(); + var $previewTab = $tabMenu.find( + '.item[data-tab="' + $tabMenu.data("preview") + '"]' + ); + if ($previewTab.length) { + previewFileModes = $previewTab.data("preview-file-modes").split(","); + $previewTab.click(function() { + var $this = $(this); + $.post( + $this.data("url"), + { + _csrf: csrf, + context: $this.data("context"), + text: $form + .find( + '.tab.segment[data-tab="' + $tabMenu.data("write") + '"] textarea' + ) + .val() + }, + function(data) { + var $previewPanel = $form.find( + '.tab.segment[data-tab="' + $tabMenu.data("preview") + '"]' + ); + $previewPanel.html(data); + emojify.run($previewPanel[0]); + $("pre code", $previewPanel[0]).each(function(i, block) { + hljs.highlightBlock(block); + }); + } + ); + }); + } } function initEditDiffTab($form) { - var $tabMenu = $form.find('.tabular.menu'); - $tabMenu.find('.item').tab(); - $tabMenu.find('.item[data-tab="' + $tabMenu.data('diff') + '"]').click(function () { - var $this = $(this); - $.post($this.data('url'), { - "_csrf": csrf, - "context": $this.data('context'), - "content": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val() - }, - function (data) { - var $diffPreviewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('diff') + '"]'); - $diffPreviewPanel.html(data); - emojify.run($diffPreviewPanel[0]); - } - ); + var $tabMenu = $form.find(".tabular.menu"); + $tabMenu.find(".item").tab(); + $tabMenu + .find('.item[data-tab="' + $tabMenu.data("diff") + '"]') + .click(function() { + var $this = $(this); + $.post( + $this.data("url"), + { + _csrf: csrf, + content: $form + .find( + '.tab.segment[data-tab="' + $tabMenu.data("write") + '"] textarea' + ) + .val() + }, + function(data) { + var $diffPreviewPanel = $form.find( + '.tab.segment[data-tab="' + $tabMenu.data("diff") + '"]' + ); + $diffPreviewPanel.html(data); + emojify.run($diffPreviewPanel[0]); + } + ); }); } - function initEditForm() { - if ($('.edit.form').length == 0) { - return; - } + if ($(".edit.form").length == 0) { + return; + } - initEditPreviewTab($('.edit.form')); - initEditDiffTab($('.edit.form')); + initEditPreviewTab($(".edit.form")); + initEditDiffTab($(".edit.form")); } - function initCommentForm() { - if ($('.comment.form').length == 0) { - return - } - - initCommentPreviewTab($('.comment.form')); - - // Labels - var $list = $('.ui.labels.list'); - var $noSelect = $list.find('.no-select'); - var $labelMenu = $('.select-label .menu'); - var hasLabelUpdateAction = $labelMenu.data('action') == 'update'; - - function updateIssueMeta(url, action, id) { - $.post(url, { - "_csrf": csrf, - "action": action, - "id": id - }); + if ($(".comment.form").length == 0) { + return; + } + + initCommentPreviewTab($(".comment.form")); + + // Labels + var $list = $(".ui.labels.list"); + var $noSelect = $list.find(".no-select"); + var $labelMenu = $(".select-label .menu"); + var hasLabelUpdateAction = $labelMenu.data("action") == "update"; + + function updateIssueMeta(url, action, id) { + $.post(url, { + _csrf: csrf, + action: action, + id: id + }); + } + + // Add   to each unselected label to keep UI looks good. + // This should be added directly to HTML but somehow just get empty on this page. + $labelMenu + .find(".item:not(.no-select) .octicon:not(.octicon-check)") + .each(function() { + $(this).html(" "); + }); + $labelMenu.find(".item:not(.no-select)").click(function() { + if ($(this).hasClass("checked")) { + $(this).removeClass("checked"); + $(this) + .find(".octicon") + .removeClass("octicon-check") + .html(" "); + if (hasLabelUpdateAction) { + updateIssueMeta( + $labelMenu.data("update-url"), + "detach", + $(this).data("id") + ); + } + } else { + $(this).addClass("checked"); + $(this) + .find(".octicon") + .addClass("octicon-check") + .html(""); + if (hasLabelUpdateAction) { + updateIssueMeta( + $labelMenu.data("update-url"), + "attach", + $(this).data("id") + ); + } } - $labelMenu.find('.item:not(.no-select)').click(function () { - if ($(this).hasClass('checked')) { - $(this).removeClass('checked'); - $(this).find('.octicon').removeClass('octicon-check'); - if (hasLabelUpdateAction) { - updateIssueMeta($labelMenu.data('update-url'), "detach", $(this).data('id')); - } + var labelIds = ""; + $(this) + .parent() + .find(".item") + .each(function() { + if ($(this).hasClass("checked")) { + labelIds += $(this).data("id") + ","; + $($(this).data("id-selector")).removeClass("hide"); } else { - $(this).addClass('checked'); - $(this).find('.octicon').addClass('octicon-check'); - if (hasLabelUpdateAction) { - updateIssueMeta($labelMenu.data('update-url'), "attach", $(this).data('id')); - } + $($(this).data("id-selector")).addClass("hide"); } + }); + if (labelIds.length == 0) { + $noSelect.removeClass("hide"); + } else { + $noSelect.addClass("hide"); + } + $( + $(this) + .parent() + .data("id") + ).val(labelIds); + return false; + }); + $labelMenu.find(".no-select.item").click(function() { + if (hasLabelUpdateAction) { + updateIssueMeta($labelMenu.data("update-url"), "clear", ""); + } - var labelIds = ""; - $(this).parent().find('.item').each(function () { - if ($(this).hasClass('checked')) { - labelIds += $(this).data('id') + ","; - $($(this).data('id-selector')).removeClass('hide'); - } else { - $($(this).data('id-selector')).addClass('hide'); - } - }); - if (labelIds.length == 0) { - $noSelect.removeClass('hide'); - } else { - $noSelect.addClass('hide'); - } - $($(this).parent().data('id')).val(labelIds); - return false; + $(this) + .parent() + .find(".item") + .each(function() { + $(this).removeClass("checked"); + $(this) + .find(".octicon") + .removeClass("octicon-check") + .html(" "); + }); + + $list.find(".item").each(function() { + $(this).addClass("hide"); }); - $labelMenu.find('.no-select.item').click(function () { - if (hasLabelUpdateAction) { - updateIssueMeta($labelMenu.data('update-url'), "clear", ''); - } - - $(this).parent().find('.item').each(function () { - $(this).removeClass('checked'); - $(this).find('.octicon').removeClass('octicon-check'); + $noSelect.removeClass("hide"); + $( + $(this) + .parent() + .data("id") + ).val(""); + }); + + function selectItem(select_id, input_id) { + var $menu = $(select_id + " .menu"); + var $list = $(".ui" + select_id + ".list"); + var hasUpdateAction = $menu.data("action") == "update"; + + $menu.find(".item:not(.no-select)").click(function() { + $(this) + .parent() + .find(".item") + .each(function() { + $(this).removeClass("selected active"); }); - $list.find('.item').each(function () { - $(this).addClass('hide'); - }); - $noSelect.removeClass('hide'); - $($(this).parent().data('id')).val(''); + $(this).addClass("selected active"); + if (hasUpdateAction) { + updateIssueMeta($menu.data("update-url"), "", $(this).data("id")); + } + switch (input_id) { + case "#milestone_id": + var $milestoneAnchor = $(''); + $milestoneAnchor.attr("href", $(this).data("href")); + $milestoneAnchor.text($(this).text()); + $list.find(".selected").empty().append($milestoneAnchor); + break; + case "#assignee_id": + var $assigneeAnchor = $(''); + $assigneeAnchor.attr("href", $(this).data("href")); + $assigneeAnchor.append( + $('').attr("src", $(this).data("avatar")) + ); + $assigneeAnchor.append($("").text($(this).text())); + $list.find(".selected").empty().append($assigneeAnchor); + } + $(".ui" + select_id + ".list .no-select").addClass("hide"); + $(input_id).val($(this).data("id")); }); - - function selectItem(select_id, input_id) { - var $menu = $(select_id + ' .menu'); - var $list = $('.ui' + select_id + '.list'); - var hasUpdateAction = $menu.data('action') == 'update'; - - $menu.find('.item:not(.no-select)').click(function () { - $(this).parent().find('.item').each(function () { - $(this).removeClass('selected active') - }); - - $(this).addClass('selected active'); - if (hasUpdateAction) { - updateIssueMeta($menu.data('update-url'), '', $(this).data('id')); - } - switch (input_id) { - case '#milestone_id': - $list.find('.selected').html('' + - $(this).text() + ''); - break; - case '#assignee_id': - $list.find('.selected').html('' + - '' + - $(this).text() + ''); - } - $('.ui' + select_id + '.list .no-select').addClass('hide'); - $(input_id).val($(this).data('id')); + $menu.find(".no-select.item").click(function() { + $(this) + .parent() + .find(".item:not(.no-select)") + .each(function() { + $(this).removeClass("selected active"); }); - $menu.find('.no-select.item').click(function () { - $(this).parent().find('.item:not(.no-select)').each(function () { - $(this).removeClass('selected active') - }); - if (hasUpdateAction) { - updateIssueMeta($menu.data('update-url'), '', ''); - } + if (hasUpdateAction) { + updateIssueMeta($menu.data("update-url"), "", ""); + } - $list.find('.selected').html(''); - $list.find('.no-select').removeClass('hide'); - $(input_id).val(''); - }); - } + $list.find(".selected").html(""); + $list.find(".no-select").removeClass("hide"); + $(input_id).val(""); + }); + } - // Milestone and assignee - selectItem('.select-milestone', '#milestone_id'); - selectItem('.select-assignee', '#assignee_id'); + // Milestone and assignee + selectItem(".select-milestone", "#milestone_id"); + selectItem(".select-assignee", "#assignee_id"); } -function initInstall() { - if ($('.install').length == 0) { - return; - } - - // Database type change detection. - $("#db_type").change(function () { - var sqliteDefault = 'data/gogs.db'; - var tidbDefault = 'data/gogs_tidb'; - - var dbType = $(this).val(); - if (dbType === "SQLite3" || dbType === "TiDB") { - $('#sql_settings').hide(); - $('#pgsql_settings').hide(); - $('#sqlite_settings').show(); - - if (dbType === "SQLite3" && $('#db_path').val() == tidbDefault) { - $('#db_path').val(sqliteDefault); - } else if (dbType === "TiDB" && $('#db_path').val() == sqliteDefault) { - $('#db_path').val(tidbDefault); - } - return; - } - - var mysqlDefault = '127.0.0.1:3306'; - var postgresDefault = '127.0.0.1:5432'; - - $('#sqlite_settings').hide(); - $('#sql_settings').show(); - if (dbType === "PostgreSQL") { - $('#pgsql_settings').show(); - if ($('#db_host').val() == mysqlDefault) { - $('#db_host').val(postgresDefault); - } - } else { - $('#pgsql_settings').hide(); - if ($('#db_host').val() == postgresDefault) { - $('#db_host').val(mysqlDefault); - } - } +function initRepository() { + if ($(".repository").length == 0) { + return; + } + + function initFilterSearchDropdown(selector) { + var $dropdown = $(selector); + $dropdown.dropdown({ + fullTextSearch: true, + onChange: function(text, value, $choice) { + window.location.href = $choice.data("url"); + console.log($choice.data("url")); + }, + message: { noResults: $dropdown.data("no-results") } }); - - // TODO: better handling of exclusive relations. - $('#offline-mode input').change(function () { - if ($(this).is(':checked')) { - $('#disable-gravatar').checkbox('check'); - $('#federated-avatar-lookup').checkbox('uncheck'); - } + } + + // File list and commits + if ( + $(".repository.file.list").length > 0 || + ".repository.commits".length > 0 + ) { + initFilterSearchDropdown(".choose.reference .dropdown"); + + $(".reference.column").click(function() { + $(".choose.reference .scrolling.menu").css("display", "none"); + $(".choose.reference .text").removeClass("black"); + $($(this).data("target")).css("display", "block"); + $(this) + .find(".text") + .addClass("black"); + return false; }); - $('#disable-gravatar input').change(function () { - if ($(this).is(':checked')) { - $('#federated-avatar-lookup').checkbox('uncheck'); - } else { - $('#offline-mode').checkbox('uncheck'); - } + } + + // Wiki + if ($(".repository.wiki.view").length > 0) { + initFilterSearchDropdown(".choose.page .dropdown"); + } + + // Options + if ($(".repository.settings.options").length > 0) { + $("#repo_name").keyup(function() { + var $prompt = $("#repo-name-change-prompt"); + if ( + $(this) + .val() + .toString() + .toLowerCase() != + $(this) + .data("repo-name") + .toString() + .toLowerCase() + ) { + $prompt.show(); + } else { + $prompt.hide(); + } }); - $('#federated-avatar-lookup input').change(function () { - if ($(this).is(':checked')) { - $('#disable-gravatar').checkbox('uncheck'); - $('#offline-mode').checkbox('uncheck'); - } + } + + // Branches + if ($(".repository.settings.branches").length > 0) { + initFilterSearchDropdown(".protected-branches .dropdown"); + $(".enable-protection, .enable-whitelist").change(function() { + if (this.checked) { + $($(this).data("target")).removeClass("disabled"); + } else { + $($(this).data("target")).addClass("disabled"); + } }); - $('#disable-registration input').change(function () { - if ($(this).is(':checked')) { - $('#enable-captcha').checkbox('uncheck'); - } + } + + // Labels + if ($(".repository.labels").length > 0) { + // Create label + var $newLabelPanel = $(".new-label.segment"); + $(".new-label.button").click(function() { + $newLabelPanel.show(); }); - $('#enable-captcha input').change(function () { - if ($(this).is(':checked')) { - $('#disable-registration').checkbox('uncheck'); - } + $(".new-label.segment .cancel").click(function() { + $newLabelPanel.hide(); }); -} - -function initRepository() { - if ($('.repository').length == 0) { - return; - } - - function initFilterSearchDropdown(selector) { - var $dropdown = $(selector); - $dropdown.dropdown({ - fullTextSearch: true, - onChange: function (text, value, $choice) { - window.location.href = $choice.data('url'); - console.log($choice.data('url')) - }, - message: {noResults: $dropdown.data('no-results')} - }); - } - // File list and commits - if ($('.repository.file.list').length > 0 || - ('.repository.commits').length > 0) { - initFilterSearchDropdown('.choose.reference .dropdown'); - - $('.reference.column').click(function () { - $('.choose.reference .scrolling.menu').css('display', 'none'); - $('.choose.reference .text').removeClass('black'); - $($(this).data('target')).css('display', 'block'); - $(this).find('.text').addClass('black'); - return false; - }); - } - - // Wiki - if ($('.repository.wiki.view').length > 0) { - initFilterSearchDropdown('.choose.page .dropdown'); - } - - // Options - if ($('.repository.settings.options').length > 0) { - $('#repo_name').keyup(function () { - var $prompt = $('#repo-name-change-prompt'); - if ($(this).val().toString().toLowerCase() != $(this).data('repo-name').toString().toLowerCase()) { - $prompt.show(); - } else { - $prompt.hide(); - } - }); - - // Enable or select internal/external wiki system and issue tracker. - $('.enable-system').change(function () { - if (this.checked) { - $($(this).data('target')).removeClass('disabled'); - } else { - $($(this).data('target')).addClass('disabled'); - } - }); - $('.enable-system-radio').change(function () { - if (this.value == 'false') { - $($(this).data('target')).addClass('disabled'); - } else if (this.value == 'true') { - $($(this).data('target')).removeClass('disabled'); - } - }); - } - - // Labels - if ($('.repository.labels').length > 0) { - // Create label - var $newLabelPanel = $('.new-label.segment'); - $('.new-label.button').click(function () { - $newLabelPanel.show(); - }); - $('.new-label.segment .cancel').click(function () { - $newLabelPanel.hide(); - }); - - $('.color-picker').each(function () { - $(this).minicolors(); - }); - $('.precolors .color').click(function () { - var color_hex = $(this).data('color-hex'); - $('.color-picker').val(color_hex); - $('.minicolors-swatch-color').css("background-color", color_hex); - }); - $('.edit-label-button').click(function () { - $('#label-modal-id').val($(this).data('id')); - $('.edit-label .new-label-input').val($(this).data('title')); - $('.edit-label .color-picker').val($(this).data('color')); - $('.minicolors-swatch-color').css("background-color", $(this).data('color')); - $('.edit-label.modal').modal({ - onApprove: function () { - $('.edit-label.form').submit(); - } - }).modal('show'); - return false; - }); - } - - // Milestones - if ($('.repository.milestones').length > 0) { - - } - if ($('.repository.new.milestone').length > 0) { - var $datepicker = $('.milestone.datepicker'); - $datepicker.datetimepicker({ - lang: $datepicker.data('lang'), - inline: true, - timepicker: false, - startDate: $datepicker.data('start-date'), - formatDate: 'Y-m-d', - onSelectDate: function (ct) { - $('#deadline').val(ct.dateFormat('Y-m-d')); - } - }); - $('#clear-date').click(function () { - $('#deadline').val(''); - return false; - }); - } - - // Issues - if ($('.repository.view.issue').length > 0) { - // Edit issue title - var $issueTitle = $('#issue-title'); - var $editInput = $('#edit-title-input input'); - var editTitleToggle = function () { - $issueTitle.toggle(); - $('.not-in-edit').toggle(); - $('#edit-title-input').toggle(); - $('.in-edit').toggle(); - $editInput.focus(); - return false; - }; - $('#edit-title').click(editTitleToggle); - $('#cancel-edit-title').click(editTitleToggle); - $('#save-edit-title').click(editTitleToggle).click(function () { - if ($editInput.val().length == 0 || - $editInput.val() == $issueTitle.text()) { - $editInput.val($issueTitle.text()); - return false; - } - - $.post($(this).data('update-url'), { - "_csrf": csrf, - "title": $editInput.val() - }, - function (data) { - $editInput.val(data.title); - $issueTitle.text(data.title); - }); - return false; - }); - - // Edit issue or comment content - $('.edit-content').click(function () { - var $segment = $(this).parent().parent().parent().next(); - var $editContentZone = $segment.find('.edit-content-zone'); - var $renderContent = $segment.find('.render-content'); - var $rawContent = $segment.find('.raw-content'); - var $textarea; - - // Setup new form - if ($editContentZone.html().length == 0) { - $editContentZone.html($('#edit-content-form').html()); - $textarea = $segment.find('textarea'); - - // Give new write/preview data-tab name to distinguish from others - var $editContentForm = $editContentZone.find('.ui.comment.form'); - var $tabMenu = $editContentForm.find('.tabular.menu'); - $tabMenu.attr('data-write', $editContentZone.data('write')); - $tabMenu.attr('data-preview', $editContentZone.data('preview')); - $tabMenu.find('.write.item').attr('data-tab', $editContentZone.data('write')); - $tabMenu.find('.preview.item').attr('data-tab', $editContentZone.data('preview')); - $editContentForm.find('.write.segment').attr('data-tab', $editContentZone.data('write')); - $editContentForm.find('.preview.segment').attr('data-tab', $editContentZone.data('preview')); - - initCommentPreviewTab($editContentForm); - - $editContentZone.find('.cancel.button').click(function () { - $renderContent.show(); - $editContentZone.hide(); - }); - $editContentZone.find('.save.button').click(function () { - $renderContent.show(); - $editContentZone.hide(); - - $.post($editContentZone.data('update-url'), { - "_csrf": csrf, - "content": $textarea.val(), - "context": $editContentZone.data('context') - }, - function (data) { - if (data.length == 0) { - $renderContent.html($('#no-content').html()); - } else { - $renderContent.html(data.content); - emojify.run($renderContent[0]); - $('pre code', $renderContent[0]).each(function (i, block) { - hljs.highlightBlock(block); - }); - } - }); - }); - } else { - $textarea = $segment.find('textarea'); - } + $(".color-picker").each(function() { + $(this).minicolors(); + }); + $(".precolors .color").click(function() { + var color_hex = $(this).data("color-hex"); + $(".color-picker").val(color_hex); + $(".minicolors-swatch-color").css("background-color", color_hex); + }); + $(".edit-label-button").click(function() { + $("#label-modal-id").val($(this).data("id")); + $(".edit-label .new-label-input").val($(this).data("title")); + $(".edit-label .color-picker").val($(this).data("color")); + $(".minicolors-swatch-color").css( + "background-color", + $(this).data("color") + ); + $(".edit-label.modal") + .modal({ + onApprove: function() { + $(".edit-label.form").submit(); + } + }) + .modal("show"); + return false; + }); + } + + // Milestones + if ($(".repository.milestones").length > 0) { + } + if ($(".repository.new.milestone").length > 0) { + var $datepicker = $(".milestone.datepicker"); + $datepicker.datetimepicker({ + lang: $datepicker.data("lang"), + inline: true, + timepicker: false, + startDate: $datepicker.data("start-date"), + formatDate: "Y-m-d", + onSelectDate: function(ct) { + $("#deadline").val(ct.dateFormat("Y-m-d")); + } + }); + $("#clear-date").click(function() { + $("#deadline").val(""); + return false; + }); + } + + // Issues + if ($(".repository.view.issue").length > 0) { + // Edit issue title + var $issueTitle = $("#issue-title"); + var $editInput = $("#edit-title-input").find("input"); + var editTitleToggle = function() { + $issueTitle.toggle(); + $(".not-in-edit").toggle(); + $("#edit-title-input").toggle(); + $(".in-edit").toggle(); + $editInput.focus(); + return false; + }; + $("#edit-title").click(editTitleToggle); + $("#cancel-edit-title").click(editTitleToggle); + $("#save-edit-title") + .click(editTitleToggle) + .click(function() { + if ( + $editInput.val().length == 0 || + $editInput.val() == $issueTitle.text() + ) { + $editInput.val($issueTitle.text()); + return false; + } - // Show write/preview tab and copy raw content as needed - $editContentZone.show(); - $renderContent.hide(); - if ($textarea.val().length == 0) { - $textarea.val($rawContent.text()); - } - $textarea.focus(); - return false; + $.post( + $(this).data("update-url"), + { + _csrf: csrf, + title: $editInput.val() + }, + function(data) { + $editInput.val(data.title); + $issueTitle.text(data.title); + } + ); + return false; + }); + + // Edit issue or comment content + $(".edit-content").click(function() { + var $segment = $(this) + .parent() + .parent() + .parent() + .next(); + var $editContentZone = $segment.find(".edit-content-zone"); + var $renderContent = $segment.find(".render-content"); + var $rawContent = $segment.find(".raw-content"); + var $textarea; + + // Setup new form + if ($editContentZone.html().length == 0) { + $editContentZone.html($("#edit-content-form").html()); + $textarea = $segment.find("textarea"); + + // Give new write/preview data-tab name to distinguish from others + var $editContentForm = $editContentZone.find(".ui.comment.form"); + var $tabMenu = $editContentForm.find(".tabular.menu"); + $tabMenu.attr("data-write", $editContentZone.data("write")); + $tabMenu.attr("data-preview", $editContentZone.data("preview")); + $tabMenu + .find(".write.item") + .attr("data-tab", $editContentZone.data("write")); + $tabMenu + .find(".preview.item") + .attr("data-tab", $editContentZone.data("preview")); + $editContentForm + .find(".write.segment") + .attr("data-tab", $editContentZone.data("write")); + $editContentForm + .find(".preview.segment") + .attr("data-tab", $editContentZone.data("preview")); + + initCommentPreviewTab($editContentForm); + + $editContentZone.find(".cancel.button").click(function() { + $renderContent.show(); + $editContentZone.hide(); }); - - // Delete comment - $('.delete-comment').click(function () { - var $this = $(this); - if (confirm($this.data('locale'))) { - $.post($this.data('url'), { - "_csrf": csrf - }).success(function () { - $('#' + $this.data('comment-id')).remove(); + $editContentZone.find(".save.button").click(function() { + $renderContent.show(); + $editContentZone.hide(); + + $.post( + $editContentZone.data("update-url"), + { + _csrf: csrf, + content: $textarea.val(), + context: $editContentZone.data("context") + }, + function(data) { + if (data.length == 0) { + $renderContent.html($("#no-content").html()); + } else { + $renderContent.html(data.content); + emojify.run($renderContent[0]); + $("pre code", $renderContent[0]).each(function(i, block) { + hljs.highlightBlock(block); }); + } } - return false; + ); }); + } else { + $textarea = $segment.find("textarea"); + } + + // Show write/preview tab and copy raw content as needed + $editContentZone.show(); + $renderContent.hide(); + if ($textarea.val().length == 0) { + $textarea.val($rawContent.text()); + } + $textarea.focus(); + return false; + }); - // Change status - var $statusButton = $('#status-button'); - $('#comment-form .edit_area').keyup(function () { - if ($(this).val().length == 0) { - $statusButton.text($statusButton.data('status')) - } else { - $statusButton.text($statusButton.data('status-and-comment')) - } - }); - $statusButton.click(function () { - $('#status').val($statusButton.data('status-val')); - $('#comment-form').submit(); + // Delete comment + $(".delete-comment").click(function() { + var $this = $(this); + if (confirm($this.data("locale"))) { + $.post($this.data("url"), { + _csrf: csrf + }).done(function() { + $("#" + $this.data("comment-id")).remove(); }); - } - - // Diff - if ($('.repository.diff').length > 0) { - var $counter = $('.diff-counter'); - if ($counter.length >= 1) { - $counter.each(function (i, item) { - var $item = $(item); - var addLine = $item.find('span[data-line].add').data("line"); - var delLine = $item.find('span[data-line].del').data("line"); - var addPercent = parseFloat(addLine) / (parseFloat(addLine) + parseFloat(delLine)) * 100; - $item.find(".bar .add").css("width", addPercent + "%"); - }); - } - } - - // Quick start and repository home - $('#repo-clone-ssh').click(function () { - $('.clone-url').text($(this).data('link')); - $('#repo-clone-url').val($(this).data('link')); - $(this).addClass('blue'); - $('#repo-clone-https').removeClass('blue'); - localStorage.setItem('repo-clone-protocol', 'ssh'); + } + return false; }); - $('#repo-clone-https').click(function () { - $('.clone-url').text($(this).data('link')); - $('#repo-clone-url').val($(this).data('link')); - $(this).addClass('blue'); - $('#repo-clone-ssh').removeClass('blue'); - localStorage.setItem('repo-clone-protocol', 'https'); + + // Change status + var $statusButton = $("#status-button"); + $("#comment-form .edit_area").keyup(function() { + if ($(this).val().length == 0) { + $statusButton.text($statusButton.data("status")); + } else { + $statusButton.text($statusButton.data("status-and-comment")); + } }); - $('#repo-clone-url').click(function () { - $(this).select(); + $statusButton.click(function() { + $("#status").val($statusButton.data("status-val")); + $("#comment-form").submit(); }); - - // Pull request - if ($('.repository.compare.pull').length > 0) { - initFilterSearchDropdown('.choose.branch .dropdown'); + } + + // Diff + if ($(".repository.diff").length > 0) { + var $counter = $(".diff-counter"); + if ($counter.length >= 1) { + $counter.each(function(i, item) { + var $item = $(item); + var addLine = $item.find("span[data-line].add").data("line"); + var delLine = $item.find("span[data-line].del").data("line"); + var addPercent = + (parseFloat(addLine) / (parseFloat(addLine) + parseFloat(delLine))) * + 100; + $item.find(".bar .add").css("width", addPercent + "%"); + }); } -} -function initRepositoryCollaboration() { - console.log('initRepositoryCollaboration'); - - // Change collaborator access mode - $('.access-mode.menu .item').click(function () { - var $menu = $(this).parent(); - $.post($menu.data('url'), { - "_csrf": csrf, - "uid": $menu.data('uid'), - "mode": $(this).data('value') - }) + $(".diff-file-box .lines-num").click(function() { + if ($(this).attr("id")) { + window.location.href = "#" + $(this).attr("id"); + } + }); + + $(window) + .on("hashchange", function(e) { + $(".diff-file-box .lines-code.active").removeClass("active"); + var m = window.location.hash.match(/^#diff-.+$/); + if (m) { + $(m[0]) + .siblings(".lines-code") + .addClass("active"); + } + }) + .trigger("hashchange"); + } + + // Quick start and repository home + $("#repo-clone-ssh").click(function() { + $(".clone-url").text($(this).data("link")); + $("#repo-clone-url").val($(this).data("link")); + $(this).addClass("blue"); + $("#repo-clone-https").removeClass("blue"); + localStorage.setItem("repo-clone-protocol", "ssh"); + }); + $("#repo-clone-https").click(function() { + $(".clone-url").text($(this).data("link")); + $("#repo-clone-url").val($(this).data("link")); + $(this).addClass("blue"); + $("#repo-clone-ssh").removeClass("blue"); + localStorage.setItem("repo-clone-protocol", "https"); + }); + $("#repo-clone-url").click(function() { + $(this).select(); + }); + + // Pull request + if ($(".repository.compare.pull").length > 0) { + initFilterSearchDropdown(".choose.branch .dropdown"); + } + if ($(".repository.view.pull").length > 0) { + $(".comment.merge.box input[name=merge_style]").change(function() { + if ($(this).val() === "create_merge_commit") { + $(".commit.description.field").show(); + } else { + $(".commit.description.field").hide(); + } }); + } } function initWikiForm() { - var $editArea = $('.repository.wiki textarea#edit_area'); - if ($editArea.length > 0) { - new SimpleMDE({ - autoDownloadFontAwesome: false, - element: $editArea[0], - forceSync: true, - previewRender: function (plainText, preview) { // Async method - setTimeout(function () { - // FIXME: still send render request when return back to edit mode - $.post($editArea.data('url'), { - "_csrf": csrf, - "mode": "gfm", - "context": $editArea.data('context'), - "text": plainText - }, - function (data) { - preview.innerHTML = '
    ' + data + '
    '; - emojify.run($('.editor-preview')[0]); - } - ); - }, 0); - - return "Loading..."; + var $editArea = $(".repository.wiki textarea#edit_area"); + if ($editArea.length > 0) { + new SimpleMDE({ + autoDownloadFontAwesome: false, + element: $editArea[0], + forceSync: true, + previewRender: function(plainText, preview) { + // Async method + setTimeout(function() { + // FIXME: still send render request when return back to edit mode + $.post( + $editArea.data("url"), + { + _csrf: csrf, + mode: "gfm", + context: $editArea.data("context"), + text: plainText }, - renderingConfig: { - singleLineBreaks: false - }, - indentWithTabs: false, - tabSize: 4, - spellChecker: false, - toolbar: ["bold", "italic", "strikethrough", "|", - "heading-1", "heading-2", "heading-3", "heading-bigger", "heading-smaller", "|", - "code", "quote", "|", - "unordered-list", "ordered-list", "|", - "link", "image", "table", "horizontal-rule", "|", - "clean-block", "preview", "fullscreen"] - }) - } + function(data) { + preview.innerHTML = '
    ' + data + "
    "; + emojify.run($(".editor-preview")[0]); + } + ); + }, 0); + + return "Loading..."; + }, + renderingConfig: { + singleLineBreaks: false + }, + indentWithTabs: false, + tabSize: 4, + spellChecker: false, + toolbar: [ + "bold", + "italic", + "strikethrough", + "|", + "heading-1", + "heading-2", + "heading-3", + "heading-bigger", + "heading-smaller", + "|", + "code", + "quote", + "|", + "unordered-list", + "ordered-list", + "|", + "link", + "image", + "table", + "horizontal-rule", + "|", + "clean-block", + "preview", + "fullscreen" + ] + }); + } } var simpleMDEditor; var codeMirrorEditor; // For IE -String.prototype.endsWith = function (pattern) { - var d = this.length - pattern.length; - return d >= 0 && this.lastIndexOf(pattern) === d; +String.prototype.endsWith = function(pattern) { + var d = this.length - pattern.length; + return d >= 0 && this.lastIndexOf(pattern) === d; }; // Adding function to get the cursor position in a text field to jQuery object. -(function ($, undefined) { - $.fn.getCursorPosition = function () { - var el = $(this).get(0); - var pos = 0; - if ('selectionStart' in el) { - pos = el.selectionStart; - } else if ('selection' in document) { - el.focus(); - var Sel = document.selection.createRange(); - var SelLength = document.selection.createRange().text.length; - Sel.moveStart('character', -el.value.length); - pos = Sel.text.length - SelLength; - } - return pos; +(function($, undefined) { + $.fn.getCursorPosition = function() { + var el = $(this).get(0); + var pos = 0; + if ("selectionStart" in el) { + pos = el.selectionStart; + } else if ("selection" in document) { + el.focus(); + var Sel = document.selection.createRange(); + var SelLength = document.selection.createRange().text.length; + Sel.moveStart("character", -el.value.length); + pos = Sel.text.length - SelLength; } + return pos; + }; })(jQuery); - function setSimpleMDE($editArea) { - if (codeMirrorEditor) { - codeMirrorEditor.toTextArea(); - codeMirrorEditor = null; - } - - if (simpleMDEditor) { - return true; - } - - simpleMDEditor = new SimpleMDE({ - autoDownloadFontAwesome: false, - element: $editArea[0], - forceSync: true, - renderingConfig: { - singleLineBreaks: false - }, - indentWithTabs: false, - tabSize: 4, - spellChecker: false, - previewRender: function (plainText, preview) { // Async method - setTimeout(function () { - // FIXME: still send render request when return back to edit mode - $.post($editArea.data('url'), { - "_csrf": csrf, - "mode": "gfm", - "context": $editArea.data('context'), - "text": plainText - }, - function (data) { - preview.innerHTML = '
    ' + data + '
    '; - emojify.run($('.editor-preview')[0]); - } - ); - }, 0); - - return "Loading..."; - }, - toolbar: ["bold", "italic", "strikethrough", "|", - "heading-1", "heading-2", "heading-3", "heading-bigger", "heading-smaller", "|", - "code", "quote", "|", - "unordered-list", "ordered-list", "|", - "link", "image", "table", "horizontal-rule", "|", - "clean-block", "preview", "fullscreen", "side-by-side"] - }); + if (codeMirrorEditor) { + codeMirrorEditor.toTextArea(); + codeMirrorEditor = null; + } + if (simpleMDEditor) { return true; + } + + simpleMDEditor = new SimpleMDE({ + autoDownloadFontAwesome: false, + element: $editArea[0], + forceSync: true, + renderingConfig: { + singleLineBreaks: false + }, + indentWithTabs: false, + tabSize: 4, + spellChecker: false, + previewRender: function(plainText, preview) { + // Async method + setTimeout(function() { + // FIXME: still send render request when return back to edit mode + $.post( + $editArea.data("url"), + { + _csrf: csrf, + mode: "gfm", + context: $editArea.data("context"), + text: plainText + }, + function(data) { + preview.innerHTML = '
    ' + data + "
    "; + emojify.run($(".editor-preview")[0]); + } + ); + }, 0); + + return "Loading..."; + }, + toolbar: [ + "bold", + "italic", + "strikethrough", + "|", + "heading-1", + "heading-2", + "heading-3", + "heading-bigger", + "heading-smaller", + "|", + "code", + "quote", + "|", + "unordered-list", + "ordered-list", + "|", + "link", + "image", + "table", + "horizontal-rule", + "|", + "clean-block" + ] + }); + + return true; } function setCodeMirror($editArea) { - if (simpleMDEditor) { - simpleMDEditor.toTextArea(); - simpleMDEditor = null; - } + if (simpleMDEditor) { + simpleMDEditor.toTextArea(); + simpleMDEditor = null; + } - if (codeMirrorEditor) { - return true; - } + if (codeMirrorEditor) { + return true; + } - codeMirrorEditor = CodeMirror.fromTextArea($editArea[0], { - lineNumbers: true - }); - codeMirrorEditor.on("change", function (cm, change) { - $editArea.val(cm.getValue()); - }); + codeMirrorEditor = CodeMirror.fromTextArea($editArea[0], { + lineNumbers: true + }); + codeMirrorEditor.on("change", function(cm, change) { + $editArea.val(cm.getValue()); + }); - return true; + return true; } function initEditor() { - $('.js-quick-pull-choice-option').change(function () { - if ($(this).val() == 'commit-to-new-branch') { - $('.quick-pull-branch-name').show(); - $('.quick-pull-branch-name input').prop('required',true); - } else { - $('.quick-pull-branch-name').hide(); - $('.quick-pull-branch-name input').prop('required',false); - } - }); - - var $editFilename = $("#file-name"); - $editFilename.keyup(function (e) { - var $section = $('.breadcrumb span.section'); - var $divider = $('.breadcrumb div.divider'); - if (e.keyCode == 8) { - if ($(this).getCursorPosition() == 0) { - if ($section.length > 0) { - var value = $section.last().find('a').text(); - $(this).val(value + $(this).val()); - $(this)[0].setSelectionRange(value.length, value.length); - $section.last().remove(); - $divider.last().remove(); - } - } - } - if (e.keyCode == 191) { - var parts = $(this).val().split('/'); - for (var i = 0; i < parts.length; ++i) { - var value = parts[i]; - if (i < parts.length - 1) { - if (value.length) { - $('' + value + '').insertBefore($(this)); - $('
    /
    ').insertBefore($(this)); - } - } - else { - $(this).val(value); - } - $(this)[0].setSelectionRange(0, 0); - } + $(".js-quick-pull-choice-option").change(function() { + if ($(this).val() == "commit-to-new-branch") { + $(".quick-pull-branch-name").show(); + $(".quick-pull-branch-name input").prop("required", true); + } else { + $(".quick-pull-branch-name").hide(); + $(".quick-pull-branch-name input").prop("required", false); + } + }); + + var $editFilename = $("#file-name"); + $editFilename + .keyup(function(e) { + var $section = $(".breadcrumb span.section"); + var $divider = $(".breadcrumb div.divider"); + if (e.keyCode == 8) { + if ($(this).getCursorPosition() == 0) { + if ($section.length > 0) { + var value = $section + .last() + .find("a") + .text(); + $(this).val(value + $(this).val()); + $(this)[0].setSelectionRange(value.length, value.length); + $section.last().remove(); + $divider.last().remove(); + } } - var parts = []; - $('.breadcrumb span.section').each(function (i, element) { - element = $(element); - if (element.find('a').length) { - parts.push(element.find('a').text()); - } else { - parts.push(element.text()); + } + if (e.keyCode == 191) { + var parts = $(this) + .val() + .split("/"); + for (var i = 0; i < parts.length; ++i) { + var value = parts[i]; + if (i < parts.length - 1) { + if (value.length) { + $( + '' + value + "" + ).insertBefore($(this)); + $('
    /
    ').insertBefore($(this)); } - }); - if ($(this).val()) - parts.push($(this).val()); - $('#tree_path').val(parts.join('/')); - }).trigger('keyup'); - - var $editArea = $('.repository.editor textarea#edit_area'); - if (!$editArea.length) - return; - - var markdownFileExts = $editArea.data("markdown-file-exts").split(","); - var lineWrapExtensions = $editArea.data("line-wrap-extensions").split(","); - - $editFilename.on("keyup", function (e) { - var val = $editFilename.val(), m, mode, spec, extension, extWithDot, previewLink, dataUrl, apiCall; - extension = extWithDot = ""; - if (m = /.+\.([^.]+)$/.exec(val)) { - extension = m[1]; - extWithDot = "." + extension; - } - - var info = CodeMirror.findModeByExtension(extension); - previewLink = $('a[data-tab=preview]'); - if (info) { - mode = info.mode; - spec = info.mime; - apiCall = mode; - } - else { - apiCall = extension + } else { + $(this).val(value); + } + $(this)[0].setSelectionRange(0, 0); } - - if (previewLink.length && apiCall && previewFileModes && previewFileModes.length && previewFileModes.indexOf(apiCall) >= 0) { - dataUrl = previewLink.data('url'); - previewLink.data('url', dataUrl.replace(/(.*)\/.*/i, '$1/' + mode)); - previewLink.show(); + } + var parts = []; + $(".breadcrumb span.section").each(function(i, element) { + element = $(element); + if (element.find("a").length) { + parts.push(element.find("a").text()); + } else { + parts.push(element.text()); } - else { - previewLink.hide(); + }); + if ($(this).val()) { + parts.push($(this).val()); + } + + var tree_path = parts.join("/"); + $("#tree_path").val(tree_path); + $("#preview-tab").data( + "context", + $("#preview-tab").data("root-context") + + tree_path.substring(0, tree_path.lastIndexOf("/") + 1) + ); + }) + .trigger("keyup"); + + var $editArea = $(".repository.editor textarea#edit_area"); + if (!$editArea.length) return; + + var markdownFileExts = $editArea.data("markdown-file-exts").split(","); + var lineWrapExtensions = $editArea.data("line-wrap-extensions").split(","); + + $editFilename + .on("keyup", function(e) { + var val = $editFilename.val(), + m, + mode, + spec, + extension, + extWithDot, + previewLink, + dataUrl, + apiCall; + extension = extWithDot = ""; + if ((m = /.+\.([^.]+)$/.exec(val))) { + extension = m[1].toLowerCase(); + extWithDot = "." + extension; + } + + var info = CodeMirror.findModeByExtension(extension); + previewLink = $("a[data-tab=preview]"); + if (info) { + mode = info.mode; + spec = info.mime; + apiCall = mode; + } else { + apiCall = extension; + } + + if ( + previewLink.length && + apiCall && + previewFileModes && + previewFileModes.length && + previewFileModes.indexOf(apiCall) >= 0 + ) { + dataUrl = previewLink.data("url"); + previewLink.data("url", dataUrl.replace(/(.*)\/.*/i, "$1/" + mode)); + previewLink.show(); + } else { + previewLink.hide(); + } + + // If this file is a Markdown extensions, we will load that editor and return + if (markdownFileExts.indexOf(extWithDot) >= 0) { + if (setSimpleMDE($editArea)) { + return; } + } - // If this file is a Markdown extensions, we will load that editor and return - if (markdownFileExts.indexOf(extWithDot) >= 0) { - if (setSimpleMDE($editArea)) { - return; + // Else we are going to use CodeMirror + if (!codeMirrorEditor && !setCodeMirror($editArea)) { + return; + } + + if (mode) { + codeMirrorEditor.setOption("mode", spec); + CodeMirror.autoLoadMode(codeMirrorEditor, mode); + } + + if (lineWrapExtensions.indexOf(extWithDot) >= 0) { + codeMirrorEditor.setOption("lineWrapping", true); + } else { + codeMirrorEditor.setOption("lineWrapping", false); + } + + // get the filename without any folder + var value = $editFilename.val(); + if (value.length === 0) { + return; + } + value = value.split("/"); + value = value[value.length - 1]; + + $.getJSON($editFilename.data("ec-url-prefix") + value, function( + editorconfig + ) { + if (editorconfig.indent_style === "tab") { + codeMirrorEditor.setOption("indentWithTabs", true); + codeMirrorEditor.setOption("extraKeys", {}); + } else { + codeMirrorEditor.setOption("indentWithTabs", false); + // required because CodeMirror doesn't seems to use spaces correctly for {"indentWithTabs": false}: + // - https://github.com/codemirror/CodeMirror/issues/988 + // - https://codemirror.net/doc/manual.html#keymaps + codeMirrorEditor.setOption("extraKeys", { + Tab: function(cm) { + var spaces = Array(parseInt(cm.getOption("indentUnit")) + 1).join( + " " + ); + cm.replaceSelection(spaces); } + }); } - - // Else we are going to use CodeMirror - if (!codeMirrorEditor && !setCodeMirror($editArea)) { - return; - } - - if (mode) { - codeMirrorEditor.setOption("mode", spec); - CodeMirror.autoLoadMode(codeMirrorEditor, mode); - } - - if (lineWrapExtensions.indexOf(extWithDot) >= 0) { - codeMirrorEditor.setOption("lineWrapping", true); - } - else { - codeMirrorEditor.setOption("lineWrapping", false); - } - - // get the filename without any folder - var value = $editFilename.val(); - if (value.length === 0) { - return; - } - value = value.split('/'); - value = value[value.length - 1]; - - $.getJSON($editFilename.data('ec-url-prefix')+value, function(editorconfig) { - if (editorconfig.indent_style === 'tab') { - codeMirrorEditor.setOption("indentWithTabs", true); - codeMirrorEditor.setOption('extraKeys', {}); - } else { - codeMirrorEditor.setOption("indentWithTabs", false); - // required because CodeMirror doesn't seems to use spaces correctly for {"indentWithTabs": false}: - // - https://github.com/codemirror/CodeMirror/issues/988 - // - https://codemirror.net/doc/manual.html#keymaps - codeMirrorEditor.setOption('extraKeys', { - Tab: function(cm) { - var spaces = Array(parseInt(cm.getOption("indentUnit")) + 1).join(" "); - cm.replaceSelection(spaces); - } - }); - } - codeMirrorEditor.setOption("indentUnit", editorconfig.indent_size || 4); - codeMirrorEditor.setOption("tabSize", editorconfig.tab_width || 4); - }); - }).trigger('keyup'); + codeMirrorEditor.setOption("indentUnit", editorconfig.indent_size || 4); + codeMirrorEditor.setOption("tabSize", editorconfig.tab_width || 4); + }); + }) + .trigger("keyup"); } function initOrganization() { - if ($('.organization').length == 0) { - return; - } - - // Options - if ($('.organization.settings.options').length > 0) { - $('#org_name').keyup(function () { - var $prompt = $('#org-name-change-prompt'); - if ($(this).val().toString().toLowerCase() != $(this).data('org-name').toString().toLowerCase()) { - $prompt.show(); - } else { - $prompt.hide(); - } - }); - } -} - -function initUserSettings() { - console.log('initUserSettings'); - - // Options - if ($('.user.settings.profile').length > 0) { - $('#username').keyup(function () { - var $prompt = $('#name-change-prompt'); - if ($(this).val().toString().toLowerCase() != $(this).data('name').toString().toLowerCase()) { - $prompt.show(); - } else { - $prompt.hide(); - } - }); - } -} - -function initWebhook() { - if ($('.new.webhook').length == 0) { - return; - } - - $('.events.checkbox input').change(function () { - if ($(this).is(':checked')) { - $('.events.fields').show(); - } - }); - $('.non-events.checkbox input').change(function () { - if ($(this).is(':checked')) { - $('.events.fields').hide(); - } - }); - - // Test delivery - $('#test-delivery').click(function () { - var $this = $(this); - $this.addClass('loading disabled'); - $.post($this.data('link'), { - "_csrf": csrf - }).done( - setTimeout(function () { - window.location.href = $this.data('redirect'); - }, 5000) - ) + if ($(".organization").length == 0) { + return; + } + + // Options + if ($(".organization.settings.options").length > 0) { + $("#org_name").keyup(function() { + var $prompt = $("#org-name-change-prompt"); + if ( + $(this) + .val() + .toString() + .toLowerCase() != + $(this) + .data("org-name") + .toString() + .toLowerCase() + ) { + $prompt.show(); + } else { + $prompt.hide(); + } }); + } } function initAdmin() { - if ($('.admin').length == 0) { - return; - } - - // New user - if ($('.admin.new.user').length > 0 || - $('.admin.edit.user').length > 0) { - $('#login_type').change(function () { - if ($(this).val().substring(0, 1) == '0') { - $('#login_name').removeAttr('required'); - $('.non-local').hide(); - $('.local').show(); - $('#user_name').focus(); - - if ($(this).data('password') == "required") { - $('#password').attr('required', 'required'); - } - - } else { - $('#login_name').attr('required', 'required'); - $('.non-local').show(); - $('.local').hide(); - $('#login_name').focus(); - - $('#password').removeAttr('required'); - } - }); - } - - function onSecurityProtocolChange() { - if ($('#security_protocol').val() > 0) { - $('.has-tls').show(); - } else { - $('.has-tls').hide(); + if ($(".admin").length == 0) { + return; + } + + // New user + if ($(".admin.new.user").length > 0 || $(".admin.edit.user").length > 0) { + $("#login_type").change(function() { + if ( + $(this) + .val() + .substring(0, 1) == "0" + ) { + $("#login_name").removeAttr("required"); + $(".non-local").hide(); + $(".local").show(); + $("#user_name").focus(); + + if ($(this).data("password") == "required") { + $("#password").attr("required", "required"); } - } - - // New authentication - if ($('.admin.new.authentication').length > 0) { - $('#auth_type').change(function () { - $('.ldap').hide(); - $('.dldap').hide(); - $('.smtp').hide(); - $('.pam').hide(); - $('.has-tls').hide(); - - var authType = $(this).val(); - switch (authType) { - case '2': // LDAP - $('.ldap').show(); - break; - case '3': // SMTP - $('.smtp').show(); - $('.has-tls').show(); - break; - case '4': // PAM - $('.pam').show(); - break; - case '5': // LDAP - $('.dldap').show(); - break; - } + } else { + $("#login_name").attr("required", "required"); + $(".non-local").show(); + $(".local").hide(); + $("#login_name").focus(); + + $("#password").removeAttr("required"); + } + }); + } - if (authType == '2' || authType == '5') { - onSecurityProtocolChange() - } - }); - $('#security_protocol').change(onSecurityProtocolChange) + function onSecurityProtocolChange() { + if ($("#security_protocol").val() > 0) { + $(".has-tls").show(); + } else { + $(".has-tls").hide(); } - // Edit authentication - if ($('.admin.edit.authentication').length > 0) { - var authType = $('#auth_type').val(); - if (authType == '2' || authType == '5') { - $('#security_protocol').change(onSecurityProtocolChange); - } + } + + // New authentication + if ($(".admin.new.authentication").length > 0) { + $("#auth_type").change(function() { + $(".ldap").hide(); + $(".dldap").hide(); + $(".smtp").hide(); + $(".pam").hide(); + $(".github").hide(); + $(".has-tls").hide(); + + var authType = $(this).val(); + switch (authType) { + case "2": // LDAP + $(".ldap").show(); + break; + case "3": // SMTP + $(".smtp").show(); + $(".has-tls").show(); + break; + case "4": // PAM + $(".pam").show(); + break; + case "5": // LDAP + $(".dldap").show(); + break; + case "6": //GITHUB + $(".github").show(); + $(".has-tls").show(); + break; + } + + if (authType == "2" || authType == "5") { + onSecurityProtocolChange(); + } + }); + $("#security_protocol").change(onSecurityProtocolChange); + } + // Edit authentication + if ($(".admin.edit.authentication").length > 0) { + var authType = $("#auth_type").val(); + if (authType == "2" || authType == "5") { + $("#security_protocol").change(onSecurityProtocolChange); } + } - // Notice - if ($('.admin.notice')) { - var $detailModal = $('#detail-modal'); + // Notice + if ($(".admin.notice")) { + var $detailModal = $("#detail-modal"); - // Attach view detail modals - $('.view-detail').click(function () { - $detailModal.find('.content p').text($(this).data('content')); - $detailModal.modal('show'); - return false; - }); + // Attach view detail modals + $(".view-detail").click(function() { + $detailModal.find(".content p").text($(this).data("content")); + $detailModal.modal("show"); + return false; + }); - // Select actions - var $checkboxes = $('.select.table .ui.checkbox'); - $('.select.action').click(function () { - switch ($(this).data('action')) { - case 'select-all': - $checkboxes.checkbox('check'); - break; - case 'deselect-all': - $checkboxes.checkbox('uncheck'); - break; - case 'inverse': - $checkboxes.checkbox('toggle'); - break; - } - }); - $('#delete-selection').click(function () { - var $this = $(this); - $this.addClass("loading disabled"); - var ids = []; - $checkboxes.each(function () { - if ($(this).checkbox('is checked')) { - ids.push($(this).data('id')); - } - }); - $.post($this.data('link'), { - "_csrf": csrf, - "ids": ids - }).done(function () { - window.location.href = $this.data('redirect'); - }); - }); - } + // Select actions + var $checkboxes = $(".select.table .ui.checkbox"); + $(".select.action").click(function() { + switch ($(this).data("action")) { + case "select-all": + $checkboxes.checkbox("check"); + break; + case "deselect-all": + $checkboxes.checkbox("uncheck"); + break; + case "inverse": + $checkboxes.checkbox("toggle"); + break; + } + }); + $("#delete-selection").click(function() { + var $this = $(this); + $this.addClass("loading disabled"); + var ids = []; + $checkboxes.each(function() { + if ($(this).checkbox("is checked")) { + ids.push($(this).data("id")); + } + }); + $.post($this.data("link"), { + _csrf: csrf, + ids: ids + }).done(function() { + window.location.href = $this.data("redirect"); + }); + }); + } } function buttonsClickOnEnter() { - $('.ui.button').keypress(function (e) { - if (e.keyCode == 13 || e.keyCode == 32) // enter key or space bar - $(this).click(); - }); + $(".ui.button").keypress(function(e) { + if (e.keyCode == 13 || e.keyCode == 32) + // enter key or space bar + $(this).click(); + }); } function hideWhenLostFocus(body, parent) { - $(document).click(function (e) { - var target = e.target; - if (!$(target).is(body) && !$(target).parents().is(parent)) { - $(body).hide(); - } - }); + $(document).click(function(e) { + var target = e.target; + if ( + !$(target).is(body) && + !$(target) + .parents() + .is(parent) + ) { + $(body).hide(); + } + }); } function searchUsers() { - if (!$('#search-user-box .results').length) { - return; + if (!$("#search-user-box .results").length) { + return; + } + + var $searchUserBox = $("#search-user-box"); + var $results = $searchUserBox.find(".results"); + $searchUserBox.keyup(function() { + var $this = $(this); + var keyword = $this.find("input").val(); + if (keyword.length < 2) { + $results.hide(); + return; } - var $searchUserBox = $('#search-user-box'); - var $results = $searchUserBox.find('.results'); - $searchUserBox.keyup(function () { - var $this = $(this); - var keyword = $this.find('input').val(); - if (keyword.length < 2) { - $results.hide(); - return; - } + $.ajax({ + url: suburl + "/api/v1/users/search?q=" + keyword, + dataType: "json", + success: function(response) { + var notEmpty = function(str) { + return str && str.length > 0; + }; - $.ajax({ - url: suburl + '/api/v1/users/search?q=' + keyword, - dataType: "json", - success: function (response) { - var notEmpty = function (str) { - return str && str.length > 0; - }; - - $results.html(''); - - if (response.ok && response.data.length) { - var html = ''; - $.each(response.data, function (i, item) { - html += '
    ' + item.username + ''; - if (notEmpty(item.full_name)) { - html += ' (' + item.full_name + ')'; - } - html += '
    '; - }); - $results.html(html); - $this.find('.results .item').click(function () { - $this.find('input').val($(this).find('.username').text()); - $results.hide(); - }); - $results.show(); - } else { - $results.hide(); - } + $results.html(""); + + if (response.ok && response.data.length) { + var html = ""; + $.each(response.data, function(i, item) { + html += + '
    ' + + item.username + + ""; + if (notEmpty(item.full_name)) { + html += " (" + item.full_name + ")"; } - }); - }); - $searchUserBox.find('input').focus(function () { - $searchUserBox.keyup(); + html += "
    "; + }); + $results.html(html); + $this.find(".results .item").click(function() { + $this.find("input").val( + $(this) + .find(".username") + .text() + ); + $results.hide(); + }); + $results.show(); + } else { + $results.hide(); + } + } }); - hideWhenLostFocus('#search-user-box .results', '#search-user-box'); + }); + $searchUserBox.find("input").focus(function() { + $searchUserBox.keyup(); + }); + hideWhenLostFocus("#search-user-box .results", "#search-user-box"); } // FIXME: merge common parts in two functions function searchRepositories() { - if (!$('#search-repo-box .results').length) { - return; + if (!$("#search-repo-box .results").length) { + return; + } + + var $searchRepoBox = $("#search-repo-box"); + var $results = $searchRepoBox.find(".results"); + $searchRepoBox.keyup(function() { + var $this = $(this); + var keyword = $this.find("input").val(); + if (keyword.length < 2) { + $results.hide(); + return; } - var $searchRepoBox = $('#search-repo-box'); - var $results = $searchRepoBox.find('.results'); - $searchRepoBox.keyup(function () { - var $this = $(this); - var keyword = $this.find('input').val(); - if (keyword.length < 2) { + $.ajax({ + url: + suburl + + "/api/v1/repos/search?q=" + + keyword + + "&uid=" + + $searchRepoBox.data("uid"), + dataType: "json", + success: function(response) { + var notEmpty = function(str) { + return str && str.length > 0; + }; + + $results.html(""); + + if (response.ok && response.data.length) { + var html = ""; + $.each(response.data, function(i, item) { + html += + '
    ' + + item.full_name + + "
    "; + }); + $results.html(html); + $this.find(".results .item").click(function() { + $this.find("input").val( + $(this) + .find(".fullname") + .text() + .split("/")[1] + ); $results.hide(); - return; + }); + $results.show(); + } else { + $results.hide(); } - - $.ajax({ - url: suburl + '/api/v1/repos/search?q=' + keyword + "&uid=" + $searchRepoBox.data('uid'), - dataType: "json", - success: function (response) { - var notEmpty = function (str) { - return str && str.length > 0; - }; - - $results.html(''); - - if (response.ok && response.data.length) { - var html = ''; - $.each(response.data, function (i, item) { - html += '
    ' + item.full_name + '
    '; - }); - $results.html(html); - $this.find('.results .item').click(function () { - $this.find('input').val($(this).find('.fullname').text().split("/")[1]); - $results.hide(); - }); - $results.show(); - } else { - $results.hide(); - } - } - }); + } }); - $searchRepoBox.find('input').focus(function () { - $searchRepoBox.keyup(); - }); - hideWhenLostFocus('#search-repo-box .results', '#search-repo-box'); + }); + $searchRepoBox.find("input").focus(function() { + $searchRepoBox.keyup(); + }); + hideWhenLostFocus("#search-repo-box .results", "#search-repo-box"); } function initCodeView() { - if ($('.code-view .linenums').length > 0) { - $(document).on('click', '.lines-num span', function (e) { - var $select = $(this); - var $list = $select.parent().siblings('.lines-code').find('ol.linenums > li'); - selectRange($list, $list.filter('[rel=' + $select.attr('id') + ']'), (e.shiftKey ? $list.filter('.active').eq(0) : null)); - deSelect(); - }); - - $(window).on('hashchange', function (e) { - var m = window.location.hash.match(/^#(L\d+)\-(L\d+)$/); - var $list = $('.code-view ol.linenums > li'); - var $first; - if (m) { - $first = $list.filter('.' + m[1]); - selectRange($list, $first, $list.filter('.' + m[2])); - $("html, body").scrollTop($first.offset().top - 200); - return; - } - m = window.location.hash.match(/^#(L\d+)$/); - if (m) { - $first = $list.filter('.' + m[1]); - selectRange($list, $first); - $("html, body").scrollTop($first.offset().top - 200); - } - }).trigger('hashchange'); - } -} - -$(document).ready(function () { - csrf = $('meta[name=_csrf]').attr("content"); - suburl = $('meta[name=_suburl]').attr("content"); - - // Show exact time - $('.time-since').each(function () { - $(this).addClass('poping up').attr('data-content', $(this).attr('title')).attr('data-variation', 'inverted tiny').attr('title', ''); + if ($(".code-view .linenums").length > 0) { + $(document).on("click", ".lines-num span", function(e) { + var $select = $(this); + var $list = $select + .parent() + .siblings(".lines-code") + .find("ol.linenums > li"); + selectRange( + $list, + $list.filter("[rel=" + $select.attr("id") + "]"), + e.shiftKey ? $list.filter(".active").eq(0) : null + ); + deSelect(); }); - // Semantic UI modules. - $('.dropdown').dropdown(); - $('.jump.dropdown').dropdown({ - action: 'hide', - onShow: function () { - $('.poping.up').popup('hide'); + $(window) + .on("hashchange", function(e) { + var m = window.location.hash.match(/^#(L\d+)\-(L\d+)$/); + var $list = $(".code-view ol.linenums > li"); + var $first; + if (m) { + $first = $list.filter("." + m[1]); + selectRange($list, $first, $list.filter("." + m[2])); + $("html, body").scrollTop($first.offset().top - 200); + return; } - }); - $('.slide.up.dropdown').dropdown({ - transition: 'slide up' - }); - $('.upward.dropdown').dropdown({ - direction: 'upward' - }); - $('.ui.accordion').accordion(); - $('.ui.checkbox').checkbox(); - $('.ui.progress').progress({ - showActivity: false - }); - $('.poping.up').popup(); - $('.top.menu .poping.up').popup({ - onShow: function () { - if ($('.top.menu .menu.transition').hasClass('visible')) { - return false; - } + m = window.location.hash.match(/^#(L\d+)$/); + if (m) { + $first = $list.filter("." + m[1]); + selectRange($list, $first); + $("html, body").scrollTop($first.offset().top - 200); } - }); - $('.tabular.menu .item').tab(); - $('.tabable.menu .item').tab(); + }) + .trigger("hashchange"); + } +} - $('.toggle.button').click(function () { - $($(this).data('target')).slideToggle(100); +function initUserSettings() { + console.log("initUserSettings"); + + // Options + if ($(".user.settings.profile").length > 0) { + $("#username").keyup(function() { + var $prompt = $("#name-change-prompt"); + if ( + $(this) + .val() + .toString() + .toLowerCase() != + $(this) + .data("name") + .toString() + .toLowerCase() + ) { + $prompt.show(); + } else { + $prompt.hide(); + } }); + } +} - // Highlight JS - if (typeof hljs != 'undefined') { - hljs.initHighlightingOnLoad(); - } +function initRepositoryCollaboration() { + console.log("initRepositoryCollaboration"); + + // Change collaborator access mode + $(".access-mode.menu .item").click(function() { + var $menu = $(this).parent(); + $.post($menu.data("url"), { + _csrf: csrf, + uid: $menu.data("uid"), + mode: $(this).data("value") + }); + }); +} - // Dropzone - var $dropzone = $('#dropzone'); - if ($dropzone.length > 0) { - // Disable auto discover for all elements: - Dropzone.autoDiscover = false; - - var filenameDict = {}; - $dropzone.dropzone({ - url: $dropzone.data('upload-url'), - headers: {"X-Csrf-Token": csrf}, - maxFiles: $dropzone.data('max-file'), - maxFilesize: $dropzone.data('max-size'), - acceptedFiles: ($dropzone.data('accepts') === '*/*') ? null : $dropzone.data('accepts'), - addRemoveLinks: true, - dictDefaultMessage: $dropzone.data('default-message'), - dictInvalidFileType: $dropzone.data('invalid-input-type'), - dictFileTooBig: $dropzone.data('file-too-big'), - dictRemoveFile: $dropzone.data('remove-file'), - init: function () { - this.on("success", function (file, data) { - filenameDict[file.name] = data.uuid; - var input = $('').val(data.uuid); - $('.files').append(input); - }); - this.on("removedfile", function (file) { - if (file.name in filenameDict) { - $('#' + filenameDict[file.name]).remove(); - } - if ($dropzone.data('remove-url') && $dropzone.data('csrf')) { - $.post($dropzone.data('remove-url'), { - file: filenameDict[file.name], - _csrf: $dropzone.data('csrf') - }); - } - }) - } - }); +function initWebhookSettings() { + $(".events.checkbox input").change(function() { + if ($(this).is(":checked")) { + $(".events.fields").show(); } - - // Emojify - emojify.setConfig({ - img_dir: suburl + '/img/emoji', - ignore_emoticons: true - }); - var hasEmoji = document.getElementsByClassName('has-emoji'); - for (var i = 0; i < hasEmoji.length; i++) { - emojify.run(hasEmoji[i]); + }); + $(".non-events.checkbox input").change(function() { + if ($(this).is(":checked")) { + $(".events.fields").hide(); } - - // Clipboard JS - var clipboard = new Clipboard('.clipboard'); - clipboard.on('success', function (e) { - e.clearSelection(); - - $('#' + e.trigger.getAttribute('id')).popup('destroy'); - e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-success')) - $('#' + e.trigger.getAttribute('id')).popup('show'); - e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original')) - }); - - clipboard.on('error', function (e) { - $('#' + e.trigger.getAttribute('id')).popup('destroy'); - e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-error')) - $('#' + e.trigger.getAttribute('id')).popup('show'); - e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original')) + }); + + // Highlight payload on first click + $(".hook.history.list .toggle.button").click(function() { + $($(this).data("target") + " .nohighlight").each(function() { + var $this = $(this); + $this.removeClass("nohighlight"); + setTimeout(function() { + hljs.highlightBlock($this[0]); + }, 500); }); + }); + + // Trigger delivery + $(".delivery.button, .redelivery.button").click(function() { + var $this = $(this); + $this.addClass("loading disabled"); + $.post($this.data("link"), { + _csrf: csrf + }).done( + setTimeout(function() { + window.location.href = $this.data("redirect"); + }, 5000) + ); + }); +} - // Helpers. - $('.delete-button').click(function () { - var $this = $(this); - $('.delete.modal').modal({ - closable: false, - onApprove: function () { - if ($this.data('type') == "form") { - $($this.data('form')).submit(); - return; - } - - $.post($this.data('url'), { - "_csrf": csrf, - "id": $this.data("id") - }).done(function (data) { - window.location.href = data.redirect; - }); - } - }).modal('show'); +$(document).ready(function() { + csrf = $("meta[name=_csrf]").attr("content"); + suburl = $("meta[name=_suburl]").attr("content"); + + // Set cursor to the end of autofocus input string + $("input[autofocus]").each(function() { + $(this).val($(this).val()); + }); + + // Show exact time + $(".time-since").each(function() { + $(this) + .addClass("poping up") + .attr("data-content", $(this).attr("title")) + .attr("data-variation", "inverted tiny") + .attr("title", ""); + }); + + // Semantic UI modules. + $(".ui.dropdown").dropdown({ + forceSelection: false + }); + $(".jump.dropdown").dropdown({ + action: "select", + onShow: function() { + $(".poping.up").popup("hide"); + } + }); + $(".slide.up.dropdown").dropdown({ + transition: "slide up" + }); + $(".upward.dropdown").dropdown({ + direction: "upward" + }); + $(".ui.accordion").accordion(); + $(".ui.checkbox").checkbox(); + $(".ui.progress").progress({ + showActivity: false + }); + $(".poping.up").popup(); + $(".top.menu .poping.up").popup({ + onShow: function() { + if ($(".top.menu .menu.transition").hasClass("visible")) { return false; - }); - $('.show-panel.button').click(function () { - $($(this).data('panel')).show(); - }); - $('.show-modal.button').click(function () { - $($(this).data('modal')).modal('show'); - }); - $('.delete-post.button').click(function () { - var $this = $(this); - $.post($this.data('request-url'), { - "_csrf": csrf - }).done(function () { - window.location.href = $this.data('done-url'); + } + } + }); + $(".tabular.menu .item").tab(); + $(".tabable.menu .item").tab(); + + $(".toggle.button").click(function() { + $($(this).data("target")).slideToggle(100); + }); + + // Dropzone + var $dropzone = $("#dropzone"); + if ($dropzone.length > 0) { + var filenameDict = {}; + $dropzone.dropzone({ + url: $dropzone.data("upload-url"), + headers: { "X-CSRF-Token": csrf }, + maxFiles: $dropzone.data("max-file"), + maxFilesize: $dropzone.data("max-size"), + timeout: 0, + acceptedFiles: + $dropzone.data("accepts") === "*/*" ? null : $dropzone.data("accepts"), + addRemoveLinks: true, + dictDefaultMessage: $dropzone.data("default-message"), + dictInvalidFileType: $dropzone.data("invalid-input-type"), + dictFileTooBig: $dropzone.data("file-too-big"), + dictRemoveFile: $dropzone.data("remove-file"), + init: function() { + this.on("success", function(file, data) { + filenameDict[file.name] = data.uuid; + var input = $( + '' + ).val(data.uuid); + $(".files").append(input); }); - }); - - // Set anchor. - $('.markdown').each(function () { - var headers = {}; - $(this).find('h1, h2, h3, h4, h5, h6').each(function () { - var node = $(this); - var val = encodeURIComponent(node.text().toLowerCase().replace(/[^\w\- ]/g, '').replace(/[ ]/g, '-')); - var name = val; - if (headers[val] > 0) { - name = val + '-' + headers[val]; - } - if (headers[val] == undefined) { - headers[val] = 1; - } else { - headers[val] += 1; - } - node = node.wrap('
    '); - node.append(''); + this.on("removedfile", function(file) { + if (file.name in filenameDict) { + $("#" + filenameDict[file.name]).remove(); + } + if ($dropzone.data("remove-url") && $dropzone.data("csrf")) { + $.post($dropzone.data("remove-url"), { + file: filenameDict[file.name], + _csrf: $dropzone.data("csrf") + }); + } }); + } }); - - buttonsClickOnEnter(); - searchUsers(); - searchRepositories(); - - initCommentForm(); - initInstall(); - initRepository(); - initWikiForm(); - initEditForm(); - initEditor(); - initOrganization(); - initWebhook(); - initAdmin(); - initCodeView(); - - // Repo clone url. - if ($('#repo-clone-url').length > 0) { - switch (localStorage.getItem('repo-clone-protocol')) { - case 'ssh': - if ($('#repo-clone-ssh').click().length === 0) { - $('#repo-clone-https').click(); - } - break; - default: - $('#repo-clone-https').click(); - break; + } + + // Emojify + emojify.setConfig({ + img_dir: suburl + "/img/emoji", + ignore_emoticons: true + }); + var hasEmoji = document.getElementsByClassName("has-emoji"); + for (var i = 0; i < hasEmoji.length; i++) { + emojify.run(hasEmoji[i]); + } + + // Clipboard JS + var clipboard = new ClipboardJS(".clipboard"); + clipboard.on("success", function(e) { + e.clearSelection(); + + $("#" + e.trigger.getAttribute("id")).popup("destroy"); + e.trigger.setAttribute( + "data-content", + e.trigger.getAttribute("data-success") + ); + $("#" + e.trigger.getAttribute("id")).popup("show"); + e.trigger.setAttribute( + "data-content", + e.trigger.getAttribute("data-original") + ); + }); + + clipboard.on("error", function(e) { + $("#" + e.trigger.getAttribute("id")).popup("destroy"); + e.trigger.setAttribute( + "data-content", + e.trigger.getAttribute("data-error") + ); + $("#" + e.trigger.getAttribute("id")).popup("show"); + e.trigger.setAttribute( + "data-content", + e.trigger.getAttribute("data-original") + ); + }); + + // Autosize + if ($("#description.autosize").length > 0) { + autosize($("#description")); + showMessageMaxLength(512, "description", "descLength"); + } + + // AJAX load buttons + $(".ajax-load-button").click(function() { + var $this = $(this); + $this.addClass("disabled"); + + $.ajax({ + url: $this.data("url"), + headers: { + "X-AJAX": "true" + } + }).done(function(data, status, request) { + $(data).insertBefore($this); + + // Update new URL or remove self if no more feeds + var url = request.getResponseHeader("X-AJAX-URL"); + if (url) { + $this.data("url", url); + $this.removeClass("disabled"); + } else { + $this.remove(); + } + }); + }); + + // Helpers + $(".delete-button").click(function() { + var $this = $(this); + $(".delete.modal") + .modal({ + closable: false, + onApprove: function() { + if ($this.data("type") == "form") { + $($this.data("form")).submit(); + return; + } + + $.post($this.data("url"), { + _csrf: csrf, + id: $this.data("id") + }).done(function(data) { + window.location.href = data.redirect; + }); } + }) + .modal("show"); + return false; + }); + $(".show-panel.button").click(function() { + $($(this).data("panel")).show(); + }); + $(".show-modal.button").click(function() { + $($(this).data("modal")).modal("show"); + }); + $(".delete-post.button").click(function() { + var $this = $(this); + $.post($this.data("request-url"), { + _csrf: csrf + }).done(function() { + window.location.href = $this.data("done-url"); + }); + }); + // To make arbitrary form element to behave like a submit button + $(".submit-button").click(function() { + $($(this).data("form")).submit(); + }); + + // Check or select on option to enable/disable target region + $(".enable-system").change(function() { + if (this.checked) { + $($(this).data("target")).removeClass("disabled"); + } else { + $($(this).data("target")).addClass("disabled"); + $($(this).data("uncheck")).prop("checked", false); } - - var routes = { - 'div.user.settings': initUserSettings, - 'div.repository.settings.collaboration': initRepositoryCollaboration - }; - - var selector; - for (selector in routes) { - if ($(selector).length > 0) { - routes[selector](); - break; + }); + $(".enable-system-radio").change(function() { + $($(this).data("enable")).removeClass("disabled"); + $($(this).data("disable")).addClass("disabled"); + $($(this).data("uncheck")).prop("checked", false); + }); + + // Set anchor. + $(".markdown").each(function() { + var headers = {}; + $(this) + .find("h1, h2, h3, h4, h5, h6") + .each(function() { + var node = $(this); + var val = encodeURIComponent( + node + .text() + .toLowerCase() + .replace(/[^\u00C0-\u1FFF\u2C00-\uD7FF\w\- ]/g, "") + .replace(/[ ]/g, "-") + ); + var name = val; + if (headers[val] > 0) { + name = val + "-" + headers[val]; + } + if (headers[val] == undefined) { + headers[val] = 1; + } else { + headers[val] += 1; } + node = node.wrap('
    '); + node.append( + '' + ); + }); + }); + + buttonsClickOnEnter(); + searchUsers(); + searchRepositories(); + + initCommentForm(); + initRepository(); + initWikiForm(); + initEditForm(); + initEditor(); + initOrganization(); + initAdmin(); + initCodeView(); + + // Repo clone url. + if ($("#repo-clone-url").length > 0) { + switch (localStorage.getItem("repo-clone-protocol")) { + case "ssh": + if ($("#repo-clone-ssh").click().length === 0) { + $("#repo-clone-https").click(); + } + break; + default: + $("#repo-clone-https").click(); + break; + } + } + + var routes = { + "div.user.settings": initUserSettings, + "div.repository.settings.collaboration": initRepositoryCollaboration, + "div.webhook.settings": initWebhookSettings + }; + + var selector; + for (selector in routes) { + if ($(selector).length > 0) { + routes[selector](); + break; } + } }); function changeHash(hash) { - if (history.pushState) { - history.pushState(null, null, hash); - } - else { - location.hash = hash; - } + if (history.pushState) { + history.pushState(null, null, hash); + } else { + location.hash = hash; + } } function deSelect() { - if (window.getSelection) { - window.getSelection().removeAllRanges(); - } else { - document.selection.empty(); - } + if (window.getSelection) { + window.getSelection().removeAllRanges(); + } else { + document.selection.empty(); + } } function selectRange($list, $select, $from) { - $list.removeClass('active'); - if ($from) { - var a = parseInt($select.attr('rel').substr(1)); - var b = parseInt($from.attr('rel').substr(1)); - var c; - if (a != b) { - if (a > b) { - c = a; - a = b; - b = c; - } - var classes = []; - for (var i = a; i <= b; i++) { - classes.push('.L' + i); - } - $list.filter(classes.join(',')).addClass('active'); - changeHash('#L' + a + '-' + 'L' + b); - return - } + $list.removeClass("active"); + if ($from) { + var a = parseInt($select.attr("rel").substr(1)); + var b = parseInt($from.attr("rel").substr(1)); + var c; + if (a != b) { + if (a > b) { + c = a; + a = b; + b = c; + } + var classes = []; + for (var i = a; i <= b; i++) { + classes.push(".L" + i); + } + $list.filter(classes.join(",")).addClass("active"); + changeHash("#L" + a + "-" + "L" + b); + return; } - $select.addClass('active'); - changeHash('#' + $select.attr('rel')); + } + $select.addClass("active"); + changeHash("#" + $select.attr("rel")); } -$(function () { - if ($('.user.signin').length > 0) return; - $('form').areYouSure(); +$(function() { + if ($(".user.signin").length > 0) return; + $("form").areYouSure(); }); + +// getByteLen counts bytes in a string's UTF-8 representation. +function getByteLen(normalVal) { + // Force string type + normalVal = String(normalVal); + + var byteLen = 0; + for (var i = 0; i < normalVal.length; i++) { + var c = normalVal.charCodeAt(i); + byteLen += + c < 1 << 7 + ? 1 + : c < 1 << 11 + ? 2 + : c < 1 << 16 + ? 3 + : c < 1 << 21 + ? 4 + : c < 1 << 26 + ? 5 + : c < 1 << 31 + ? 6 + : Number.NaN; + } + return byteLen; +} + +function showMessageMaxLength(maxLen, textElemId, counterId) { + var $msg = $("#" + textElemId); + $("#" + counterId).html(maxLen - getByteLen($msg.val())); + + var onMessageKey = function(e) { + var $msg = $(this); + var text = $msg.val(); + var len = getByteLen(text); + var remainder = maxLen - len; + + if (len >= maxLen) { + $msg.val($msg.val().substr(0, maxLen)); + remainder = 0; + } + + $("#" + counterId).html(remainder); + }; + + $msg.keyup(onMessageKey).keydown(onMessageKey); +} 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 0f60b7bd0d9..00000000000 --- 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/js/semantic-2.4.2.min.js b/public/js/semantic-2.4.2.min.js new file mode 100644 index 00000000000..0c1b392e09c --- /dev/null +++ b/public/js/semantic-2.4.2.min.js @@ -0,0 +1,11 @@ + /* + * # Semantic UI - 2.4.2 + * 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 + * + */ +!function(p,h,v,b){p.site=p.fn.site=function(e){var s,l,i=(new Date).getTime(),o=[],t=e,n="string"==typeof t,c=[].slice.call(arguments,1),u=p.isPlainObject(e)?p.extend(!0,{},p.site.settings,e):p.extend({},p.site.settings),a=u.namespace,d=u.error,r="module-"+a,f=p(v),m=this,g=f.data(r);return s={initialize:function(){s.instantiate()},instantiate:function(){s.verbose("Storing instance of site",s),g=s,f.data(r,s)},normalize:function(){s.fix.console(),s.fix.requestAnimationFrame()},fix:{console:function(){s.debug("Normalizing window.console"),console!==b&&console.log!==b||(s.verbose("Console not available, normalizing events"),s.disable.console()),void 0!==console.group&&void 0!==console.groupEnd&&void 0!==console.groupCollapsed||(s.verbose("Console group not available, normalizing events"),h.console.group=function(){},h.console.groupEnd=function(){},h.console.groupCollapsed=function(){}),void 0===console.markTimeline&&(s.verbose("Mark timeline not available, normalizing events"),h.console.markTimeline=function(){})},consoleClear:function(){s.debug("Disabling programmatic console clearing"),h.console.clear=function(){}},requestAnimationFrame:function(){s.debug("Normalizing requestAnimationFrame"),h.requestAnimationFrame===b&&(s.debug("RequestAnimationFrame not available, normalizing event"),h.requestAnimationFrame=h.requestAnimationFrame||h.mozRequestAnimationFrame||h.webkitRequestAnimationFrame||h.msRequestAnimationFrame||function(e){setTimeout(e,0)})}},moduleExists:function(e){return p.fn[e]!==b&&p.fn[e].settings!==b},enabled:{modules:function(e){var n=[];return e=e||u.modules,p.each(e,function(e,t){s.moduleExists(t)&&n.push(t)}),n}},disabled:{modules:function(e){var n=[];return e=e||u.modules,p.each(e,function(e,t){s.moduleExists(t)||n.push(t)}),n}},change:{setting:function(o,a,e,r){e="string"==typeof e?"all"===e?u.modules:[e]:e||u.modules,r=r===b||r,p.each(e,function(e,t){var n,i=!s.moduleExists(t)||(p.fn[t].settings.namespace||!1);s.moduleExists(t)&&(s.verbose("Changing default setting",o,a,t),p.fn[t].settings[o]=a,r&&i&&0<(n=p(":data(module-"+i+")")).length&&(s.verbose("Modifying existing settings",n),n[t]("setting",o,a)))})},settings:function(i,e,o){e="string"==typeof e?[e]:e||u.modules,o=o===b||o,p.each(e,function(e,t){var n;s.moduleExists(t)&&(s.verbose("Changing default setting",i,t),p.extend(!0,p.fn[t].settings,i),o&&a&&0<(n=p(":data(module-"+a+")")).length&&(s.verbose("Modifying existing settings",n),n[t]("setting",i)))})}},enable:{console:function(){s.console(!0)},debug:function(e,t){e=e||u.modules,s.debug("Enabling debug for modules",e),s.change.setting("debug",!0,e,t)},verbose:function(e,t){e=e||u.modules,s.debug("Enabling verbose debug for modules",e),s.change.setting("verbose",!0,e,t)}},disable:{console:function(){s.console(!1)},debug:function(e,t){e=e||u.modules,s.debug("Disabling debug for modules",e),s.change.setting("debug",!1,e,t)},verbose:function(e,t){e=e||u.modules,s.debug("Disabling verbose debug for modules",e),s.change.setting("verbose",!1,e,t)}},console:function(e){if(e){if(g.cache.console===b)return void s.error(d.console);s.debug("Restoring console function"),h.console=g.cache.console}else s.debug("Disabling console function"),g.cache.console=h.console,h.console={clear:function(){},error:function(){},group:function(){},groupCollapsed:function(){},groupEnd:function(){},info:function(){},log:function(){},markTimeline:function(){},warn:function(){}}},destroy:function(){s.verbose("Destroying previous site for",f),f.removeData(r)},cache:{},setting:function(e,t){if(p.isPlainObject(e))p.extend(!0,u,e);else{if(t===b)return u[e];u[e]=t}},internal:function(e,t){if(p.isPlainObject(e))p.extend(!0,s,e);else{if(t===b)return s[e];s[e]=t}},debug:function(){u.debug&&(u.performance?s.performance.log(arguments):(s.debug=Function.prototype.bind.call(console.info,console,u.name+":"),s.debug.apply(console,arguments)))},verbose:function(){u.verbose&&u.debug&&(u.performance?s.performance.log(arguments):(s.verbose=Function.prototype.bind.call(console.info,console,u.name+":"),s.verbose.apply(console,arguments)))},error:function(){s.error=Function.prototype.bind.call(console.error,console,u.name+":"),s.error.apply(console,arguments)},performance:{log:function(e){var t,n;u.performance&&(n=(t=(new Date).getTime())-(i||t),i=t,o.push({Element:m,Name:e[0],Arguments:[].slice.call(e,1)||"","Execution Time":n})),clearTimeout(s.performance.timer),s.performance.timer=setTimeout(s.performance.display,500)},display:function(){var e=u.name+":",n=0;i=!1,clearTimeout(s.performance.timer),p.each(o,function(e,t){n+=t["Execution Time"]}),e+=" "+n+"ms",(console.group!==b||console.table!==b)&&0")},fields:function(e){var n=F();return F.each(e,function(e,t){n=n.add(h.get.field(t))}),n},validation:function(n){var i,o;return!!c&&(F.each(c,function(e,t){o=t.identifier||e,h.get.field(o)[0]==n[0]&&(t.identifier=o,i=t)}),i||!1)},value:function(e){var t=[];return t.push(e),h.get.values.call(v,t)[e]},values:function(e){var t=F.isArray(e)?h.get.fields(e):n,c={};return t.each(function(e,t){var n=F(t),i=(n.prop("type"),n.prop("name")),o=n.val(),a=n.is(f.checkbox),r=n.is(f.radio),s=-1!==i.indexOf("[]"),l=!!a&&n.is(":checked");i&&(s?(i=i.replace("[]",""),c[i]||(c[i]=[]),a?l?c[i].push(o||!0):c[i].push(!1):c[i].push(o)):r?c[i]!==D&&0!=c[i]||(c[i]=!!l&&(o||!0)):c[i]=a?!!l&&(o||!0):o)}),c}},has:{field:function(e){return h.verbose("Checking for existence of a field with identifier",e),"string"!=typeof(e=h.escape.string(e))&&h.error(s.identifier,e),0"}),F(n+="")},prompt:function(e){return F("
    ").addClass("ui basic red pointing prompt label").html(e[0])}},rules:{empty:function(e){return!(e===D||""===e||F.isArray(e)&&0===e.length)},checked:function(){return 0=t},length:function(e,t){return e!==D&&e.length>=t},exactLength:function(e,t){return e!==D&&e.length==t},maxLength:function(e,t){return e!==D&&e.length<=t},match:function(e,t){var n;F(this);return 0=t)},exactCount:function(e,t){return 0==t?""===e:1==t?""!==e&&-1===e.search(","):e.split(",").length==t},maxCount:function(e,t){return 0!=t&&(1==t?-1===e.search(","):e.split(",").length<=t)}}}}(jQuery,window,document),function(S,k,e,T){"use strict";k=void 0!==k&&k.Math==Math?k:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),S.fn.accordion=function(a){var v,r=S(this),b=(new Date).getTime(),y=[],x=a,C="string"==typeof x,w=[].slice.call(arguments,1);k.requestAnimationFrame||k.mozRequestAnimationFrame||k.webkitRequestAnimationFrame||k.msRequestAnimationFrame;return r.each(function(){var e,c,u=S.isPlainObject(a)?S.extend(!0,{},S.fn.accordion.settings,a):S.extend({},S.fn.accordion.settings),d=u.className,t=u.namespace,f=u.selector,s=u.error,n="."+t,i="module-"+t,o=r.selector||"",m=S(this),g=m.find(f.title),p=m.find(f.content),l=this,h=m.data(i);c={initialize:function(){c.debug("Initializing",m),c.bind.events(),u.observeChanges&&c.observeChanges(),c.instantiate()},instantiate:function(){h=c,m.data(i,c)},destroy:function(){c.debug("Destroying previous instance",m),m.off(n).removeData(i)},refresh:function(){g=m.find(f.title),p=m.find(f.content)},observeChanges:function(){"MutationObserver"in k&&((e=new MutationObserver(function(e){c.debug("DOM tree modified, updating selector cache"),c.refresh()})).observe(l,{childList:!0,subtree:!0}),c.debug("Setting up mutation observer",e))},bind:{events:function(){c.debug("Binding delegated events"),m.on(u.on+n,f.trigger,c.event.click)}},event:{click:function(){c.toggle.call(this)}},toggle:function(e){var t=e!==T?"number"==typeof e?g.eq(e):S(e).closest(f.title):S(this).closest(f.title),n=t.next(p),i=n.hasClass(d.animating),o=n.hasClass(d.active),a=o&&!i,r=!o&&i;c.debug("Toggling visibility of content",t),a||r?u.collapsible?c.close.call(t):c.debug("Cannot close accordion content collapsing is disabled"):c.open.call(t)},open:function(e){var t=e!==T?"number"==typeof e?g.eq(e):S(e).closest(f.title):S(this).closest(f.title),n=t.next(p),i=n.hasClass(d.animating);n.hasClass(d.active)||i?c.debug("Accordion already open, skipping",n):(c.debug("Opening accordion content",t),u.onOpening.call(n),u.onChanging.call(n),u.exclusive&&c.closeOthers.call(t),t.addClass(d.active),n.stop(!0,!0).addClass(d.animating),u.animateChildren&&(S.fn.transition!==T&&m.transition("is supported")?n.children().transition({animation:"fade in",queue:!1,useFailSafe:!0,debug:u.debug,verbose:u.verbose,duration:u.duration}):n.children().stop(!0,!0).animate({opacity:1},u.duration,c.resetOpacity)),n.slideDown(u.duration,u.easing,function(){n.removeClass(d.animating).addClass(d.active),c.reset.display.call(this),u.onOpen.call(this),u.onChange.call(this)}))},close:function(e){var t=e!==T?"number"==typeof e?g.eq(e):S(e).closest(f.title):S(this).closest(f.title),n=t.next(p),i=n.hasClass(d.animating),o=n.hasClass(d.active);!o&&!(!o&&i)||o&&i||(c.debug("Closing accordion content",n),u.onClosing.call(n),u.onChanging.call(n),t.removeClass(d.active),n.stop(!0,!0).addClass(d.animating),u.animateChildren&&(S.fn.transition!==T&&m.transition("is supported")?n.children().transition({animation:"fade out",queue:!1,useFailSafe:!0,debug:u.debug,verbose:u.verbose,duration:u.duration}):n.children().stop(!0,!0).animate({opacity:0},u.duration,c.resetOpacity)),n.slideUp(u.duration,u.easing,function(){n.removeClass(d.animating).removeClass(d.active),c.reset.display.call(this),u.onClose.call(this),u.onChange.call(this)}))},closeOthers:function(e){var t,n,i,o=e!==T?g.eq(e):S(this).closest(f.title),a=o.parents(f.content).prev(f.title),r=o.closest(f.accordion),s=f.title+"."+d.active+":visible",l=f.content+"."+d.active+":visible";i=u.closeNested?(t=r.find(s).not(a)).next(p):(t=r.find(s).not(a),n=r.find(l).find(s).not(a),(t=t.not(n)).next(p)),0 adjusting invoked element"),c=c.closest(o.checkbox),s.refresh())}},setup:function(){s.set.initialLoad(),s.is.indeterminate()?(s.debug("Initial value is indeterminate"),s.indeterminate()):s.is.checked()?(s.debug("Initial value is checked"),s.check()):(s.debug("Initial value is unchecked"),s.uncheck()),s.remove.initialLoad()},refresh:function(){u=c.children(o.label),d=c.children(o.input),f=d[0]},hide:{input:function(){s.verbose("Modifying z-index to be unselectable"),d.addClass(t.hidden)}},show:{input:function(){s.verbose("Modifying z-index to be selectable"),d.removeClass(t.hidden)}},observeChanges:function(){"MutationObserver"in A&&((e=new MutationObserver(function(e){s.debug("DOM tree modified, updating selector cache"),s.refresh()})).observe(h,{childList:!0,subtree:!0}),s.debug("Setting up mutation observer",e))},attachEvents:function(e,t){var n=T(e);t=T.isFunction(s[t])?s[t]:s.toggle,0").insertAfter(d),s.debug("Creating label",u))}},has:{label:function(){return 0 .ui.dimmer",content:".ui.dimmer > .content, .ui.dimmer > .content > .center"},template:{dimmer:function(){return S("
    ").attr("class","ui dimmer")}}}}(jQuery,window,document),function(Y,Z,K,J){"use strict";Z=void 0!==Z&&Z.Math==Math?Z:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),Y.fn.dropdown=function(M){var L,V=Y(this),N=Y(K),H=V.selector||"",U="ontouchstart"in K.documentElement,W=(new Date).getTime(),B=[],Q=M,X="string"==typeof Q,$=[].slice.call(arguments,1);return V.each(function(n){var e,t,i,o,a,r,s,g,p=Y.isPlainObject(M)?Y.extend(!0,{},Y.fn.dropdown.settings,M):Y.extend({},Y.fn.dropdown.settings),h=p.className,c=p.message,l=p.fields,v=p.keys,b=p.metadata,u=p.namespace,d=p.regExp,y=p.selector,f=p.error,m=p.templates,x="."+u,C="module-"+u,w=Y(this),S=Y(p.context),k=w.find(y.text),T=w.find(y.search),A=w.find(y.sizer),R=w.find(y.input),P=w.find(y.icon),E=0").html(o).attr("data-"+b.value,t).attr("data-"+b.text,t).addClass(h.addition).addClass(h.item),p.hideAdditions&&i.addClass(h.hidden),n=n===J?i:n.add(i),g.verbose("Creating user choices for value",t,i))}),n)},userLabels:function(e){var t=g.get.userValues();t&&(g.debug("Adding user labels",t),Y.each(t,function(e,t){g.verbose("Adding custom user value"),g.add.label(t,t)}))},menu:function(){F=Y("
    ").addClass(h.menu).appendTo(w)},sizer:function(){A=Y("").addClass(h.sizer).insertAfter(T)}},search:function(e){e=e!==J?e:g.get.query(),g.verbose("Searching for query",e),g.has.minCharacters(e)?g.filter(e):g.hide()},select:{firstUnfiltered:function(){g.verbose("Selecting first non-filtered element"),g.remove.selectedItem(),O.not(y.unselectable).not(y.addition+y.hidden).eq(0).addClass(h.selected)},nextAvailable:function(e){var t=(e=e.eq(0)).nextAll(y.item).not(y.unselectable).eq(0),n=e.prevAll(y.item).not(y.unselectable).eq(0);0").addClass(h.search).prop("autocomplete","off").insertBefore(k)),g.is.multiple()&&g.is.searchSelection()&&!g.has.sizer()&&g.create.sizer(),p.allowTab&&g.set.tabbable()},select:function(){var e=g.get.selectValues();g.debug("Dropdown initialized on a select",e),w.is("select")&&(R=w),0").attr("class",R.attr("class")).addClass(h.selection).addClass(h.dropdown).html(m.dropdown(e)).insertBefore(R),R.hasClass(h.multiple)&&!1===R.prop("multiple")&&(g.error(f.missingMultiple),R.prop("multiple",!0)),R.is("[multiple]")&&g.set.multiple(),R.prop("disabled")&&(g.debug("Disabling dropdown"),w.addClass(h.disabled)),R.removeAttr("class").detach().prependTo(w)),g.refresh()},menu:function(e){F.html(m.menu(e,l)),O=F.find(y.item)},reference:function(){g.debug("Dropdown behavior was called on select, replacing with closest dropdown"),w=w.parent(y.dropdown),I=w.data(C),z=w.get(0),g.refresh(),g.setup.returnedObject()},returnedObject:function(){var e=V.slice(0,n),t=V.slice(n+1);V=e.add(w).add(t)}},refresh:function(){g.refreshSelectors(),g.refreshData()},refreshItems:function(){O=F.find(y.item)},refreshSelectors:function(){g.verbose("Refreshing selector cache"),k=w.find(y.text),T=w.find(y.search),R=w.find(y.input),P=w.find(y.icon),E=0 modified, recreating menu");var n=!1;Y.each(e,function(e,t){if(Y(t.target).is("select")||Y(t.addedNodes).is("select"))return n=!0}),n&&(g.disconnect.selectObserver(),g.refresh(),g.setup.select(),g.set.selected(),g.observe.select())}},menu:{mutation:function(e){var t=e[0],n=t.addedNodes?Y(t.addedNodes[0]):Y(!1),i=t.removedNodes?Y(t.removedNodes[0]):Y(!1),o=n.add(i),a=o.is(y.addition)||0t.name?1:-1}),g.debug("Retrieved and sorted values from select",o)):g.debug("Retrieved values from select",o),o},activeItem:function(){return O.filter("."+h.active)},selectedItem:function(){var e=O.not(y.unselectable).filter("."+h.selected);return 0=p.maxSelections?(g.debug("Maximum selection count reached"),p.useLabels&&(O.addClass(h.filtered),g.add.message(c.maxSelections)),!0):(g.verbose("No longer at maximum selection count"),g.remove.message(),g.remove.filteredItem(),g.is.searchSelection()&&g.filterItems(),!1))}},restore:{defaults:function(){g.clear(),g.restore.defaultText(),g.restore.defaultValue()},defaultText:function(){var e=g.get.defaultText();e===g.get.placeholderText?(g.debug("Restoring default placeholder text",e),g.set.placeholderText(e)):(g.debug("Restoring default text",e),g.set.text(e))},placeholderText:function(){g.set.placeholderText()},defaultValue:function(){var e=g.get.defaultValue();e!==J&&(g.debug("Restoring default value",e),""!==e?(g.set.value(e),g.set.selected()):(g.remove.activeItem(),g.remove.selectedItem()))},labels:function(){p.allowAdditions&&(p.useLabels||(g.error(f.labels),p.useLabels=!0),g.debug("Restoring selected values"),g.create.userLabels()),g.check.maxSelections()},selected:function(){g.restore.values(),g.is.multiple()?(g.debug("Restoring previously selected values and labels"),g.restore.labels()):g.debug("Restoring previously selected values")},values:function(){g.set.initialLoad(),p.apiSettings&&p.saveRemoteData&&g.get.remoteValues()?g.restore.remoteValues():g.set.selected(),g.remove.initialLoad()},remoteValues:function(){var e=g.get.remoteValues();g.debug("Recreating selected from session data",e),e&&(g.is.single()?Y.each(e,function(e,t){g.set.text(t)}):Y.each(e,function(e,t){g.add.label(e,t)}))}},read:{remoteData:function(e){var t;if(Z.Storage!==J)return(t=sessionStorage.getItem(e))!==J&&t;g.error(f.noStorage)}},save:{defaults:function(){g.save.defaultText(),g.save.placeholderText(),g.save.defaultValue()},defaultValue:function(){var e=g.get.value();g.verbose("Saving default value as",e),w.data(b.defaultValue,e)},defaultText:function(){var e=g.get.text();g.verbose("Saving default text as",e),w.data(b.defaultText,e)},placeholderText:function(){var e;!1!==p.placeholder&&k.hasClass(h.placeholder)&&(e=g.get.text(),g.verbose("Saving placeholder text as",e),w.data(b.placeholderText,e))},remoteData:function(e,t){Z.Storage!==J?(g.verbose("Saving remote data to session storage",t,e),sessionStorage.setItem(t,e)):g.error(f.noStorage)}},clear:function(){g.is.multiple()&&p.useLabels?g.remove.labels():(g.remove.activeItem(),g.remove.selectedItem()),g.set.placeholderText(),g.clearValue()},clearValue:function(){g.set.value("")},scrollPage:function(e,t){var n,i,o=t||g.get.selectedItem(),a=o.closest(y.menu),r=a.outerHeight(),s=a.scrollTop(),l=O.eq(0).outerHeight(),c=Math.floor(r/l),u=(a.prop("scrollHeight"),"up"==e?s-l*c:s+l*c),d=O.not(y.unselectable);i="up"==e?d.index(o)-c:d.index(o)+c,0<(n=("up"==e?0<=i:i").addClass(h.label).attr("data-"+b.value,a).html(m.label(a,t)),i=p.onLabelCreate.call(i,a,t),g.has.label(e)?g.debug("User selection already exists, skipping",a):(p.label.variation&&i.addClass(p.label.variation),!0===n?(g.debug("Animating in label",i),i.addClass(h.hidden).insertBefore(o).transition(p.label.transition,p.label.duration)):(g.debug("Adding selection label",i),i.insertBefore(o)))},message:function(e){var t=F.children(y.message),n=p.templates.message(g.add.variables(e));0").html(n).addClass(h.message).appendTo(F)},optionValue:function(e){var t=g.escape.value(e);0").prop("value",t).addClass(h.addition).html(e).appendTo(R),g.verbose("Adding user addition as an
    \n\n"+e+"\n"+(t=t&&""+t+"")+"
    \n"},t.tablerow=function(e){return"\n"+e+"\n"},t.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"\n"},t.strong=function(e){return""+e+""},t.em=function(e){return""+e+""},t.codespan=function(e){return""+e+""},t.br=function(){return this.options.xhtml?"
    ":"
    "},t.del=function(e){return""+e+""},t.link=function(e,t,n){if(null===(e=F(this.options.sanitize,this.options.baseUrl,e)))return n;var r='"},t.image=function(e,t,n){if(null===(e=F(this.options.sanitize,this.options.baseUrl,e)))return n;var r=''+n+'":">"},t.text=function(e){return e},e}(),G=function(){function e(){this.seen={}}return e.prototype.slug=function(e){var t=e.toLowerCase().trim().replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t))for(var n=t;this.seen[n]++,t=n+"-"+this.seen[n],this.seen.hasOwnProperty(t););return this.seen[t]=0,t},e}(),M=s.defaults,V=D.inline,H=A,J=y,K=function(){function u(e,t){if(this.options=t||M,this.links=e,this.rules=V.normal,this.options.renderer=this.options.renderer||new X,this.renderer=this.options.renderer,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.pedantic?this.rules=V.pedantic:this.options.gfm&&(this.options.breaks?this.rules=V.breaks:this.rules=V.gfm)}u.output=function(e,t,n){return new u(t,n).output(e)};var e=u.prototype;return e.output=function(e){for(var t,n,r,s,i,l,a="";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),a+=J(i[1]);else if(i=this.rules.tag.exec(e))!this.inLink&&/^/i.test(i[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(i[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(i[0])&&(this.inRawBlock=!1),e=e.substring(i[0].length),a+=this.renderer.html(this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):J(i[0]):i[0]);else if(i=this.rules.link.exec(e)){var o=H(i[2],"()");if(-1$/,"$1"),a+=this.outputLink(i,{href:u.escapes(r),title:u.escapes(s)}),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.href){a+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,a+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),a+=this.renderer.strong(this.output(i[4]||i[3]||i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),a+=this.renderer.em(this.output(i[6]||i[5]||i[4]||i[3]||i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),a+=this.renderer.codespan(J(i[2].trim(),!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),a+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),a+=this.renderer.del(this.output(i[1]));else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),r="@"===i[2]?"mailto:"+(n=J(this.mangle(i[1]))):n=J(i[1]),a+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.inRawBlock?a+=this.renderer.text(this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):J(i[0]):i[0]):a+=this.renderer.text(J(this.smartypants(i[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else{if("@"===i[2])r="mailto:"+(n=J(i[0]));else{for(;l=i[0],i[0]=this.rules._backpedal.exec(i[0])[0],l!==i[0];);n=J(i[0]),r="www."===i[1]?"http://"+n:n}e=e.substring(i[0].length),a+=this.renderer.link(r,null,n)}return a},u.escapes=function(e){return e?e.replace(u.rules._escapes,"$1"):e},e.outputLink=function(e,t){var n=t.href,r=t.title?J(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,J(e[1]))},e.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},e.mangle=function(e){if(!this.options.mangle)return e;for(var t,n=e.length,r="",s=0;sAn error occurred:

    "+se(e.message+"",!0)+"
    ";throw e}}return oe.options=oe.setOptions=function(e){return ne(oe.defaults,e),le(oe.defaults),oe},oe.getDefaults=ie,oe.defaults=ae,oe.Parser=te,oe.parser=te.parse,oe.Renderer=X,oe.TextRenderer=Q,oe.Lexer=B,oe.lexer=B.lex,oe.InlineLexer=K,oe.inlineLexer=K.output,oe.Slugger=G,oe.parse=oe}); \ No newline at end of file diff --git a/public/plugins/mermaid-11.12.1/mermaid.min.js b/public/plugins/mermaid-11.12.1/mermaid.min.js new file mode 100644 index 00000000000..78af1f438be --- /dev/null +++ b/public/plugins/mermaid-11.12.1/mermaid.min.js @@ -0,0 +1,2811 @@ +"use strict";var __esbuild_esm_mermaid_nm;(__esbuild_esm_mermaid_nm||={}).mermaid=(()=>{var V3e=Object.create;var _y=Object.defineProperty;var U3e=Object.getOwnPropertyDescriptor;var H3e=Object.getOwnPropertyNames;var q3e=Object.getPrototypeOf,W3e=Object.prototype.hasOwnProperty;var o=(t,e)=>_y(t,"name",{value:e,configurable:!0});var N=(t,e)=>()=>(t&&(e=t(t=0)),e);var Da=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),dr=(t,e)=>{for(var r in e)_y(t,r,{get:e[r],enumerable:!0})},q4=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of H3e(e))!W3e.call(t,i)&&i!==r&&_y(t,i,{get:()=>e[i],enumerable:!(n=U3e(e,i))||n.enumerable});return t},Lr=(t,e,r)=>(q4(t,e,"default"),r&&q4(r,e,"default")),ja=(t,e,r)=>(r=t!=null?V3e(q3e(t)):{},q4(e||!t||!t.__esModule?_y(r,"default",{value:t,enumerable:!0}):r,t)),Y3e=t=>q4(_y({},"__esModule",{value:!0}),t);var X3e,y0,t7,Uz,W4=N(()=>{"use strict";X3e=Object.freeze({left:0,top:0,width:16,height:16}),y0=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),t7=Object.freeze({...X3e,...y0}),Uz=Object.freeze({...t7,body:"",hidden:!1})});var j3e,Hz,qz=N(()=>{"use strict";W4();j3e=Object.freeze({width:null,height:null}),Hz=Object.freeze({...j3e,...y0})});var r7,Y4,Wz=N(()=>{"use strict";r7=o((t,e,r,n="")=>{let i=t.split(":");if(t.slice(0,1)==="@"){if(i.length<2||i.length>3)return null;n=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){let l=i.pop(),u=i.pop(),h={provider:i.length>0?i[0]:n,prefix:u,name:l};return e&&!Y4(h)?null:h}let a=i[0],s=a.split("-");if(s.length>1){let l={provider:n,prefix:s.shift(),name:s.join("-")};return e&&!Y4(l)?null:l}if(r&&n===""){let l={provider:n,prefix:"",name:a};return e&&!Y4(l,r)?null:l}return null},"stringToIcon"),Y4=o((t,e)=>t?!!((e&&t.prefix===""||t.prefix)&&t.name):!1,"validateIconName")});function Yz(t,e){let r={};!t.hFlip!=!e.hFlip&&(r.hFlip=!0),!t.vFlip!=!e.vFlip&&(r.vFlip=!0);let n=((t.rotate||0)+(e.rotate||0))%4;return n&&(r.rotate=n),r}var Xz=N(()=>{"use strict";o(Yz,"mergeIconTransformations")});function n7(t,e){let r=Yz(t,e);for(let n in Uz)n in y0?n in t&&!(n in r)&&(r[n]=y0[n]):n in e?r[n]=e[n]:n in t&&(r[n]=t[n]);return r}var jz=N(()=>{"use strict";W4();Xz();o(n7,"mergeIconData")});function Kz(t,e){let r=t.icons,n=t.aliases||Object.create(null),i=Object.create(null);function a(s){if(r[s])return i[s]=[];if(!(s in i)){i[s]=null;let l=n[s]&&n[s].parent,u=l&&a(l);u&&(i[s]=[l].concat(u))}return i[s]}return o(a,"resolve"),(e||Object.keys(r).concat(Object.keys(n))).forEach(a),i}var Qz=N(()=>{"use strict";o(Kz,"getIconsTree")});function Zz(t,e,r){let n=t.icons,i=t.aliases||Object.create(null),a={};function s(l){a=n7(n[l]||i[l],a)}return o(s,"parse"),s(e),r.forEach(s),n7(t,a)}function i7(t,e){if(t.icons[e])return Zz(t,e,[]);let r=Kz(t,[e])[e];return r?Zz(t,e,r):null}var Jz=N(()=>{"use strict";jz();Qz();o(Zz,"internalGetIconData");o(i7,"getIconData")});function a7(t,e,r){if(e===1)return t;if(r=r||100,typeof t=="number")return Math.ceil(t*e*r)/r;if(typeof t!="string")return t;let n=t.split(K3e);if(n===null||!n.length)return t;let i=[],a=n.shift(),s=Q3e.test(a);for(;;){if(s){let l=parseFloat(a);isNaN(l)?i.push(a):i.push(Math.ceil(l*e*r)/r)}else i.push(a);if(a=n.shift(),a===void 0)return i.join("");s=!s}}var K3e,Q3e,eG=N(()=>{"use strict";K3e=/(-?[0-9.]*[0-9]+[0-9.]*)/g,Q3e=/^-?[0-9.]*[0-9]+[0-9.]*$/g;o(a7,"calculateSize")});function Z3e(t,e="defs"){let r="",n=t.indexOf("<"+e);for(;n>=0;){let i=t.indexOf(">",n),a=t.indexOf("",a);if(s===-1)break;r+=t.slice(i+1,a).trim(),t=t.slice(0,n).trim()+t.slice(s+1)}return{defs:r,content:t}}function J3e(t,e){return t?""+t+""+e:e}function tG(t,e,r){let n=Z3e(t);return J3e(n.defs,e+n.content+r)}var rG=N(()=>{"use strict";o(Z3e,"splitSVGDefs");o(J3e,"mergeDefsAndContent");o(tG,"wrapSVGContent")});function s7(t,e){let r={...t7,...t},n={...Hz,...e},i={left:r.left,top:r.top,width:r.width,height:r.height},a=r.body;[r,n].forEach(y=>{let v=[],x=y.hFlip,b=y.vFlip,T=y.rotate;x?b?T+=2:(v.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),v.push("scale(-1 1)"),i.top=i.left=0):b&&(v.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),v.push("scale(1 -1)"),i.top=i.left=0);let S;switch(T<0&&(T-=Math.floor(T/4)*4),T=T%4,T){case 1:S=i.height/2+i.top,v.unshift("rotate(90 "+S.toString()+" "+S.toString()+")");break;case 2:v.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:S=i.width/2+i.left,v.unshift("rotate(-90 "+S.toString()+" "+S.toString()+")");break}T%2===1&&(i.left!==i.top&&(S=i.left,i.left=i.top,i.top=S),i.width!==i.height&&(S=i.width,i.width=i.height,i.height=S)),v.length&&(a=tG(a,'',""))});let s=n.width,l=n.height,u=i.width,h=i.height,f,d;s===null?(d=l===null?"1em":l==="auto"?h:l,f=a7(d,u/h)):(f=s==="auto"?u:s,d=l===null?a7(f,h/u):l==="auto"?h:l);let p={},m=o((y,v)=>{e5e(v)||(p[y]=v.toString())},"setAttr");m("width",f),m("height",d);let g=[i.left,i.top,u,h];return p.viewBox=g.join(" "),{attributes:p,viewBox:g,body:a}}var e5e,nG=N(()=>{"use strict";W4();qz();eG();rG();e5e=o(t=>t==="unset"||t==="undefined"||t==="none","isUnsetKeyword");o(s7,"iconToSVG")});function o7(t,e=r5e){let r=[],n;for(;n=t5e.exec(t);)r.push(n[1]);if(!r.length)return t;let i="suffix"+(Math.random()*16777216|Date.now()).toString(16);return r.forEach(a=>{let s=typeof e=="function"?e(a):e+(n5e++).toString(),l=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+s+i+"$3")}),t=t.replace(new RegExp(i,"g"),""),t}var t5e,r5e,n5e,iG=N(()=>{"use strict";t5e=/\sid="(\S+)"/g,r5e="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16),n5e=0;o(o7,"replaceIDs")});function l7(t,e){let r=t.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let n in e)r+=" "+n+'="'+e[n]+'"';return'"+t+""}var aG=N(()=>{"use strict";o(l7,"iconToHTML")});var sG=N(()=>{"use strict";Wz();Jz();nG();iG();aG()});var c7,Rn,v0=N(()=>{"use strict";c7=o((t,e,{depth:r=2,clobber:n=!1}={})=>{let i={depth:r,clobber:n};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(a=>c7(t,a,i)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(a=>{t.includes(a)||t.push(a)}),t):t===void 0||r<=0?t!=null&&typeof t=="object"&&typeof e=="object"?Object.assign(t,e):e:(e!==void 0&&typeof t=="object"&&typeof e=="object"&&Object.keys(e).forEach(a=>{typeof e[a]=="object"&&(t[a]===void 0||typeof t[a]=="object")?(t[a]===void 0&&(t[a]=Array.isArray(e[a])?[]:{}),t[a]=c7(t[a],e[a],{depth:r-1,clobber:n})):(n||typeof t[a]!="object"&&typeof e[a]!="object")&&(t[a]=e[a])}),t)},"assignWithDepth"),Rn=c7});var X4=Da((u7,h7)=>{"use strict";(function(t,e){typeof u7=="object"&&typeof h7<"u"?h7.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(u7,(function(){"use strict";var t=1e3,e=6e4,r=36e5,n="millisecond",i="second",a="minute",s="hour",l="day",u="week",h="month",f="quarter",d="year",p="date",m="Invalid Date",g=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:o(function(E){var D=["th","st","nd","rd"],_=E%100;return"["+E+(D[(_-20)%10]||D[_]||D[0])+"]"},"ordinal")},x=o(function(E,D,_){var O=String(E);return!O||O.length>=D?E:""+Array(D+1-O.length).join(_)+E},"m"),b={s:x,z:o(function(E){var D=-E.utcOffset(),_=Math.abs(D),O=Math.floor(_/60),M=_%60;return(D<=0?"+":"-")+x(O,2,"0")+":"+x(M,2,"0")},"z"),m:o(function E(D,_){if(D.date()<_.date())return-E(_,D);var O=12*(_.year()-D.year())+(_.month()-D.month()),M=D.clone().add(O,h),P=_-M<0,B=D.clone().add(O+(P?-1:1),h);return+(-(O+(_-M)/(P?M-B:B-M))||0)},"t"),a:o(function(E){return E<0?Math.ceil(E)||0:Math.floor(E)},"a"),p:o(function(E){return{M:h,y:d,w:u,d:l,D:p,h:s,m:a,s:i,ms:n,Q:f}[E]||String(E||"").toLowerCase().replace(/s$/,"")},"p"),u:o(function(E){return E===void 0},"u")},T="en",S={};S[T]=v;var w="$isDayjsObject",k=o(function(E){return E instanceof I||!(!E||!E[w])},"S"),A=o(function E(D,_,O){var M;if(!D)return T;if(typeof D=="string"){var P=D.toLowerCase();S[P]&&(M=P),_&&(S[P]=_,M=P);var B=D.split("-");if(!M&&B.length>1)return E(B[0])}else{var F=D.name;S[F]=D,M=F}return!O&&M&&(T=M),M||!O&&T},"t"),C=o(function(E,D){if(k(E))return E.clone();var _=typeof D=="object"?D:{};return _.date=E,_.args=arguments,new I(_)},"O"),R=b;R.l=A,R.i=k,R.w=function(E,D){return C(E,{locale:D.$L,utc:D.$u,x:D.$x,$offset:D.$offset})};var I=(function(){function E(_){this.$L=A(_.locale,null,!0),this.parse(_),this.$x=this.$x||_.x||{},this[w]=!0}o(E,"M");var D=E.prototype;return D.parse=function(_){this.$d=(function(O){var M=O.date,P=O.utc;if(M===null)return new Date(NaN);if(R.u(M))return new Date;if(M instanceof Date)return new Date(M);if(typeof M=="string"&&!/Z$/i.test(M)){var B=M.match(g);if(B){var F=B[2]-1||0,G=(B[7]||"0").substring(0,3);return P?new Date(Date.UTC(B[1],F,B[3]||1,B[4]||0,B[5]||0,B[6]||0,G)):new Date(B[1],F,B[3]||1,B[4]||0,B[5]||0,B[6]||0,G)}}return new Date(M)})(_),this.init()},D.init=function(){var _=this.$d;this.$y=_.getFullYear(),this.$M=_.getMonth(),this.$D=_.getDate(),this.$W=_.getDay(),this.$H=_.getHours(),this.$m=_.getMinutes(),this.$s=_.getSeconds(),this.$ms=_.getMilliseconds()},D.$utils=function(){return R},D.isValid=function(){return this.$d.toString()!==m},D.isSame=function(_,O){var M=C(_);return this.startOf(O)<=M&&M<=this.endOf(O)},D.isAfter=function(_,O){return C(_){"use strict";oG=ja(X4(),1),au={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},X={trace:o((...t)=>{},"trace"),debug:o((...t)=>{},"debug"),info:o((...t)=>{},"info"),warn:o((...t)=>{},"warn"),error:o((...t)=>{},"error"),fatal:o((...t)=>{},"fatal")},Dy=o(function(t="fatal"){let e=au.fatal;typeof t=="string"?t.toLowerCase()in au&&(e=au[t]):typeof t=="number"&&(e=t),X.trace=()=>{},X.debug=()=>{},X.info=()=>{},X.warn=()=>{},X.error=()=>{},X.fatal=()=>{},e<=au.fatal&&(X.fatal=console.error?console.error.bind(console,Eo("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",Eo("FATAL"))),e<=au.error&&(X.error=console.error?console.error.bind(console,Eo("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",Eo("ERROR"))),e<=au.warn&&(X.warn=console.warn?console.warn.bind(console,Eo("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",Eo("WARN"))),e<=au.info&&(X.info=console.info?console.info.bind(console,Eo("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",Eo("INFO"))),e<=au.debug&&(X.debug=console.debug?console.debug.bind(console,Eo("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Eo("DEBUG"))),e<=au.trace&&(X.trace=console.debug?console.debug.bind(console,Eo("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Eo("TRACE")))},"setLogLevel"),Eo=o(t=>`%c${(0,oG.default)().format("ss.SSS")} : ${t} : `,"format")});var j4,lG,cG=N(()=>{"use strict";j4={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:o(t=>t>=255?255:t<0?0:t,"r"),g:o(t=>t>=255?255:t<0?0:t,"g"),b:o(t=>t>=255?255:t<0?0:t,"b"),h:o(t=>t%360,"h"),s:o(t=>t>=100?100:t<0?0:t,"s"),l:o(t=>t>=100?100:t<0?0:t,"l"),a:o(t=>t>=1?1:t<0?0:t,"a")},toLinear:o(t=>{let e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},"toLinear"),hue2rgb:o((t,e,r)=>(r<0&&(r+=1),r>1&&(r-=1),r<.16666666666666666?t+(e-t)*6*r:r<.5?e:r<.6666666666666666?t+(e-t)*(.6666666666666666-r)*6:t),"hue2rgb"),hsl2rgb:o(({h:t,s:e,l:r},n)=>{if(!e)return r*2.55;t/=360,e/=100,r/=100;let i=r<.5?r*(1+e):r+e-r*e,a=2*r-i;switch(n){case"r":return j4.hue2rgb(a,i,t+.3333333333333333)*255;case"g":return j4.hue2rgb(a,i,t)*255;case"b":return j4.hue2rgb(a,i,t-.3333333333333333)*255}},"hsl2rgb"),rgb2hsl:o(({r:t,g:e,b:r},n)=>{t/=255,e/=255,r/=255;let i=Math.max(t,e,r),a=Math.min(t,e,r),s=(i+a)/2;if(n==="l")return s*100;if(i===a)return 0;let l=i-a,u=s>.5?l/(2-i-a):l/(i+a);if(n==="s")return u*100;switch(i){case t:return((e-r)/l+(e{"use strict";i5e={clamp:o((t,e,r)=>e>r?Math.min(e,Math.max(r,t)):Math.min(r,Math.max(e,t)),"clamp"),round:o(t=>Math.round(t*1e10)/1e10,"round")},uG=i5e});var a5e,fG,dG=N(()=>{"use strict";a5e={dec2hex:o(t=>{let e=Math.round(t).toString(16);return e.length>1?e:`0${e}`},"dec2hex")},fG=a5e});var s5e,Kt,Xl=N(()=>{"use strict";cG();hG();dG();s5e={channel:lG,lang:uG,unit:fG},Kt=s5e});var su,Ni,Ly=N(()=>{"use strict";Xl();su={};for(let t=0;t<=255;t++)su[t]=Kt.unit.dec2hex(t);Ni={ALL:0,RGB:1,HSL:2}});var f7,pG,mG=N(()=>{"use strict";Ly();f7=class{static{o(this,"Type")}constructor(){this.type=Ni.ALL}get(){return this.type}set(e){if(this.type&&this.type!==e)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=e}reset(){this.type=Ni.ALL}is(e){return this.type===e}},pG=f7});var d7,gG,yG=N(()=>{"use strict";Xl();mG();Ly();d7=class{static{o(this,"Channels")}constructor(e,r){this.color=r,this.changed=!1,this.data=e,this.type=new pG}set(e,r){return this.color=r,this.changed=!1,this.data=e,this.type.type=Ni.ALL,this}_ensureHSL(){let e=this.data,{h:r,s:n,l:i}=e;r===void 0&&(e.h=Kt.channel.rgb2hsl(e,"h")),n===void 0&&(e.s=Kt.channel.rgb2hsl(e,"s")),i===void 0&&(e.l=Kt.channel.rgb2hsl(e,"l"))}_ensureRGB(){let e=this.data,{r,g:n,b:i}=e;r===void 0&&(e.r=Kt.channel.hsl2rgb(e,"r")),n===void 0&&(e.g=Kt.channel.hsl2rgb(e,"g")),i===void 0&&(e.b=Kt.channel.hsl2rgb(e,"b"))}get r(){let e=this.data,r=e.r;return!this.type.is(Ni.HSL)&&r!==void 0?r:(this._ensureHSL(),Kt.channel.hsl2rgb(e,"r"))}get g(){let e=this.data,r=e.g;return!this.type.is(Ni.HSL)&&r!==void 0?r:(this._ensureHSL(),Kt.channel.hsl2rgb(e,"g"))}get b(){let e=this.data,r=e.b;return!this.type.is(Ni.HSL)&&r!==void 0?r:(this._ensureHSL(),Kt.channel.hsl2rgb(e,"b"))}get h(){let e=this.data,r=e.h;return!this.type.is(Ni.RGB)&&r!==void 0?r:(this._ensureRGB(),Kt.channel.rgb2hsl(e,"h"))}get s(){let e=this.data,r=e.s;return!this.type.is(Ni.RGB)&&r!==void 0?r:(this._ensureRGB(),Kt.channel.rgb2hsl(e,"s"))}get l(){let e=this.data,r=e.l;return!this.type.is(Ni.RGB)&&r!==void 0?r:(this._ensureRGB(),Kt.channel.rgb2hsl(e,"l"))}get a(){return this.data.a}set r(e){this.type.set(Ni.RGB),this.changed=!0,this.data.r=e}set g(e){this.type.set(Ni.RGB),this.changed=!0,this.data.g=e}set b(e){this.type.set(Ni.RGB),this.changed=!0,this.data.b=e}set h(e){this.type.set(Ni.HSL),this.changed=!0,this.data.h=e}set s(e){this.type.set(Ni.HSL),this.changed=!0,this.data.s=e}set l(e){this.type.set(Ni.HSL),this.changed=!0,this.data.l=e}set a(e){this.changed=!0,this.data.a=e}},gG=d7});var o5e,fh,Ry=N(()=>{"use strict";yG();o5e=new gG({r:0,g:0,b:0,a:0},"transparent"),fh=o5e});var vG,od,p7=N(()=>{"use strict";Ry();Ly();vG={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:o(t=>{if(t.charCodeAt(0)!==35)return;let e=t.match(vG.re);if(!e)return;let r=e[1],n=parseInt(r,16),i=r.length,a=i%4===0,s=i>4,l=s?1:17,u=s?8:4,h=a?0:-1,f=s?255:15;return fh.set({r:(n>>u*(h+3)&f)*l,g:(n>>u*(h+2)&f)*l,b:(n>>u*(h+1)&f)*l,a:a?(n&f)*l/255:1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`#${su[Math.round(e)]}${su[Math.round(r)]}${su[Math.round(n)]}${su[Math.round(i*255)]}`:`#${su[Math.round(e)]}${su[Math.round(r)]}${su[Math.round(n)]}`},"stringify")},od=vG});var K4,Ny,xG=N(()=>{"use strict";Xl();Ry();K4={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:o(t=>{let e=t.match(K4.hueRe);if(e){let[,r,n]=e;switch(n){case"grad":return Kt.channel.clamp.h(parseFloat(r)*.9);case"rad":return Kt.channel.clamp.h(parseFloat(r)*180/Math.PI);case"turn":return Kt.channel.clamp.h(parseFloat(r)*360)}}return Kt.channel.clamp.h(parseFloat(t))},"_hue2deg"),parse:o(t=>{let e=t.charCodeAt(0);if(e!==104&&e!==72)return;let r=t.match(K4.re);if(!r)return;let[,n,i,a,s,l]=r;return fh.set({h:K4._hue2deg(n),s:Kt.channel.clamp.s(parseFloat(i)),l:Kt.channel.clamp.l(parseFloat(a)),a:s?Kt.channel.clamp.a(l?parseFloat(s)/100:parseFloat(s)):1},t)},"parse"),stringify:o(t=>{let{h:e,s:r,l:n,a:i}=t;return i<1?`hsla(${Kt.lang.round(e)}, ${Kt.lang.round(r)}%, ${Kt.lang.round(n)}%, ${i})`:`hsl(${Kt.lang.round(e)}, ${Kt.lang.round(r)}%, ${Kt.lang.round(n)}%)`},"stringify")},Ny=K4});var Q4,m7,bG=N(()=>{"use strict";p7();Q4={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:o(t=>{t=t.toLowerCase();let e=Q4.colors[t];if(e)return od.parse(e)},"parse"),stringify:o(t=>{let e=od.stringify(t);for(let r in Q4.colors)if(Q4.colors[r]===e)return r},"stringify")},m7=Q4});var TG,My,wG=N(()=>{"use strict";Xl();Ry();TG={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:o(t=>{let e=t.charCodeAt(0);if(e!==114&&e!==82)return;let r=t.match(TG.re);if(!r)return;let[,n,i,a,s,l,u,h,f]=r;return fh.set({r:Kt.channel.clamp.r(i?parseFloat(n)*2.55:parseFloat(n)),g:Kt.channel.clamp.g(s?parseFloat(a)*2.55:parseFloat(a)),b:Kt.channel.clamp.b(u?parseFloat(l)*2.55:parseFloat(l)),a:h?Kt.channel.clamp.a(f?parseFloat(h)/100:parseFloat(h)):1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`rgba(${Kt.lang.round(e)}, ${Kt.lang.round(r)}, ${Kt.lang.round(n)}, ${Kt.lang.round(i)})`:`rgb(${Kt.lang.round(e)}, ${Kt.lang.round(r)}, ${Kt.lang.round(n)})`},"stringify")},My=TG});var l5e,Mi,ou=N(()=>{"use strict";p7();xG();bG();wG();Ly();l5e={format:{keyword:m7,hex:od,rgb:My,rgba:My,hsl:Ny,hsla:Ny},parse:o(t=>{if(typeof t!="string")return t;let e=od.parse(t)||My.parse(t)||Ny.parse(t)||m7.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},"parse"),stringify:o(t=>!t.changed&&t.color?t.color:t.type.is(Ni.HSL)||t.data.r===void 0?Ny.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?My.stringify(t):od.stringify(t),"stringify")},Mi=l5e});var c5e,Z4,g7=N(()=>{"use strict";Xl();ou();c5e=o((t,e)=>{let r=Mi.parse(t);for(let n in e)r[n]=Kt.channel.clamp[n](e[n]);return Mi.stringify(r)},"change"),Z4=c5e});var u5e,Ka,y7=N(()=>{"use strict";Xl();Ry();ou();g7();u5e=o((t,e,r=0,n=1)=>{if(typeof t!="number")return Z4(t,{a:e});let i=fh.set({r:Kt.channel.clamp.r(t),g:Kt.channel.clamp.g(e),b:Kt.channel.clamp.b(r),a:Kt.channel.clamp.a(n)});return Mi.stringify(i)},"rgba"),Ka=u5e});var h5e,ld,kG=N(()=>{"use strict";Xl();ou();h5e=o((t,e)=>Kt.lang.round(Mi.parse(t)[e]),"channel"),ld=h5e});var f5e,EG,SG=N(()=>{"use strict";Xl();ou();f5e=o(t=>{let{r:e,g:r,b:n}=Mi.parse(t),i=.2126*Kt.channel.toLinear(e)+.7152*Kt.channel.toLinear(r)+.0722*Kt.channel.toLinear(n);return Kt.lang.round(i)},"luminance"),EG=f5e});var d5e,CG,AG=N(()=>{"use strict";SG();d5e=o(t=>EG(t)>=.5,"isLight"),CG=d5e});var p5e,sa,_G=N(()=>{"use strict";AG();p5e=o(t=>!CG(t),"isDark"),sa=p5e});var m5e,J4,v7=N(()=>{"use strict";Xl();ou();m5e=o((t,e,r)=>{let n=Mi.parse(t),i=n[e],a=Kt.channel.clamp[e](i+r);return i!==a&&(n[e]=a),Mi.stringify(n)},"adjustChannel"),J4=m5e});var g5e,Rt,DG=N(()=>{"use strict";v7();g5e=o((t,e)=>J4(t,"l",e),"lighten"),Rt=g5e});var y5e,Pt,LG=N(()=>{"use strict";v7();y5e=o((t,e)=>J4(t,"l",-e),"darken"),Pt=y5e});var v5e,Pe,RG=N(()=>{"use strict";ou();g7();v5e=o((t,e)=>{let r=Mi.parse(t),n={};for(let i in e)e[i]&&(n[i]=r[i]+e[i]);return Z4(t,n)},"adjust"),Pe=v5e});var x5e,NG,MG=N(()=>{"use strict";ou();y7();x5e=o((t,e,r=50)=>{let{r:n,g:i,b:a,a:s}=Mi.parse(t),{r:l,g:u,b:h,a:f}=Mi.parse(e),d=r/100,p=d*2-1,m=s-f,y=((p*m===-1?p:(p+m)/(1+p*m))+1)/2,v=1-y,x=n*y+l*v,b=i*y+u*v,T=a*y+h*v,S=s*d+f*(1-d);return Ka(x,b,T,S)},"mix"),NG=x5e});var b5e,Et,IG=N(()=>{"use strict";ou();MG();b5e=o((t,e=100)=>{let r=Mi.parse(t);return r.r=255-r.r,r.g=255-r.g,r.b=255-r.b,NG(r,t,e)},"invert"),Et=b5e});var OG=N(()=>{"use strict";y7();kG();_G();DG();LG();RG();IG()});var eo=N(()=>{"use strict";OG()});var dh,ph,Iy=N(()=>{"use strict";dh="#ffffff",ph="#f2f2f2"});var wi,x0=N(()=>{"use strict";eo();wi=o((t,e)=>e?Pe(t,{s:-40,l:10}):Pe(t,{s:-40,l:-10}),"mkBorder")});var b7,PG,BG=N(()=>{"use strict";eo();Iy();x0();b7=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||Pe(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||Pe(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||wi(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||wi(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||wi(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||Et(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||Et(this.tertiaryColor),this.lineColor=this.lineColor||Et(this.background),this.arrowheadColor=this.arrowheadColor||Et(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?Pt(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||Pt(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||Et(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||Rt(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.vertLineColor=this.vertLineColor||"navy",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.darkMode?(this.rowOdd=this.rowOdd||Pt(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Pt(this.mainBkg,10)):(this.rowOdd=this.rowOdd||Rt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||Rt(this.mainBkg,5)),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Pe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Pe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Pe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Pe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Pe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Pe(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||Pe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Pe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Pe(this.primaryColor,{h:330}),this.darkMode)for(let r=0;r{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},PG=o(t=>{let e=new b7;return e.calculate(t),e},"getThemeVariables")});var T7,FG,$G=N(()=>{"use strict";eo();x0();T7=class{static{o(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=Rt(this.primaryColor,16),this.tertiaryColor=Pe(this.primaryColor,{h:-160}),this.primaryBorderColor=Et(this.background),this.secondaryBorderColor=wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=wi(this.tertiaryColor,this.darkMode),this.primaryTextColor=Et(this.primaryColor),this.secondaryTextColor=Et(this.secondaryColor),this.tertiaryTextColor=Et(this.tertiaryColor),this.lineColor=Et(this.background),this.textColor=Et(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=Rt(Et("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=Ka(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=Pt("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=Pt(this.sectionBkgColor,10),this.taskBorderColor=Ka(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=Ka(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Rt(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Pt(this.mainBkg,10),this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=Rt(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=Rt(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=Rt(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=Pe(this.primaryColor,{h:64}),this.fillType3=Pe(this.secondaryColor,{h:64}),this.fillType4=Pe(this.primaryColor,{h:-64}),this.fillType5=Pe(this.secondaryColor,{h:-64}),this.fillType6=Pe(this.primaryColor,{h:128}),this.fillType7=Pe(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Pe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Pe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Pe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Pe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Pe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Pe(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Pe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Pe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Pe(this.primaryColor,{h:330});for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},FG=o(t=>{let e=new T7;return e.calculate(t),e},"getThemeVariables")});var w7,mh,Oy=N(()=>{"use strict";eo();x0();Iy();w7=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=Pe(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=Pe(this.primaryColor,{h:-160}),this.primaryBorderColor=wi(this.primaryColor,this.darkMode),this.secondaryBorderColor=wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=wi(this.tertiaryColor,this.darkMode),this.primaryTextColor=Et(this.primaryColor),this.secondaryTextColor=Et(this.secondaryColor),this.tertiaryTextColor=Et(this.tertiaryColor),this.lineColor=Et(this.background),this.textColor=Et(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.sectionBkgColor=Ka(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="navy",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd="calculated",this.rowEven="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Pe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Pe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Pe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Pe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Pe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Pe(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Pe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Pe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Pe(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Pt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Pt(this.tertiaryColor,40);for(let e=0;e{this[n]==="calculated"&&(this[n]=void 0)}),typeof e!="object"){this.updateColors();return}let r=Object.keys(e);r.forEach(n=>{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},mh=o(t=>{let e=new w7;return e.calculate(t),e},"getThemeVariables")});var k7,zG,GG=N(()=>{"use strict";eo();Iy();x0();k7=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=Rt("#cde498",10),this.primaryBorderColor=wi(this.primaryColor,this.darkMode),this.secondaryBorderColor=wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=wi(this.tertiaryColor,this.darkMode),this.primaryTextColor=Et(this.primaryColor),this.secondaryTextColor=Et(this.secondaryColor),this.tertiaryTextColor=Et(this.primaryColor),this.lineColor=Et(this.background),this.textColor=Et(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=Pt(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Pe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Pe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Pe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Pe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Pe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Pe(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Pe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Pe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Pe(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Pt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Pt(this.tertiaryColor,40);for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},zG=o(t=>{let e=new k7;return e.calculate(t),e},"getThemeVariables")});var E7,VG,UG=N(()=>{"use strict";eo();x0();Iy();E7=class{static{o(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=Rt(this.contrast,55),this.background="#ffffff",this.tertiaryColor=Pe(this.primaryColor,{h:-160}),this.primaryBorderColor=wi(this.primaryColor,this.darkMode),this.secondaryBorderColor=wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=wi(this.tertiaryColor,this.darkMode),this.primaryTextColor=Et(this.primaryColor),this.secondaryTextColor=Et(this.secondaryColor),this.tertiaryTextColor=Et(this.tertiaryColor),this.lineColor=Et(this.background),this.textColor=Et(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Rt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||"#f4f4f4",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=Rt(this.contrast,55),this.border2=this.contrast,this.actorBorder=Rt(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},VG=o(t=>{let e=new E7;return e.calculate(t),e},"getThemeVariables")});var So,e3=N(()=>{"use strict";BG();$G();Oy();GG();UG();So={base:{getThemeVariables:PG},dark:{getThemeVariables:FG},default:{getThemeVariables:mh},forest:{getThemeVariables:zG},neutral:{getThemeVariables:VG}}});var ul,HG=N(()=>{"use strict";ul={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200,inheritDir:!1},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,maxLabelWidth:360,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],titleColor:"",titleFontFamily:'"trebuchet ms", verdana, arial, sans-serif',titleFontSize:"4ex"},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,nodeSpacing:140,rankSpacing:80,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showDataLabel:!1,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200,layoutAlgorithm:"cose-bilkent"},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},radar:{useMaxWidth:!0,width:600,height:600,marginTop:50,marginRight:50,marginBottom:50,marginLeft:50,axisScaleFactor:1,axisLabelFactor:1.05,curveTension:.17},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1}});var qG,WG,YG,ur,La=N(()=>{"use strict";e3();HG();qG={...ul,deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF",forceNodeModelOrder:!1,considerModelOrder:"NODES_AND_EDGES"},themeCSS:void 0,themeVariables:So.default.getThemeVariables(),sequence:{...ul.sequence,messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:o(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:o(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")},class:{hideEmptyMembersBox:!1},gantt:{...ul.gantt,tickInterval:void 0,useWidth:void 0},c4:{...ul.c4,useWidth:void 0,personFont:o(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),flowchart:{...ul.flowchart,inheritDir:!1},external_personFont:o(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:o(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:o(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:o(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:o(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:o(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:o(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:o(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:o(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:o(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:o(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:o(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:o(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:o(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:o(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:o(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:o(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:o(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:o(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:o(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")},pie:{...ul.pie,useWidth:984},xyChart:{...ul.xyChart,useWidth:void 0},requirement:{...ul.requirement,useWidth:void 0},packet:{...ul.packet},radar:{...ul.radar},treemap:{useMaxWidth:!0,padding:10,diagramPadding:8,showValues:!0,nodeWidth:100,nodeHeight:40,borderWidth:1,valueFontSize:12,labelFontSize:14,valueFormat:","}},WG=o((t,e="")=>Object.keys(t).reduce((r,n)=>Array.isArray(t[n])?r:typeof t[n]=="object"&&t[n]!==null?[...r,e+n,...WG(t[n],"")]:[...r,e+n],[]),"keyify"),YG=new Set(WG(qG,"")),ur=qG});var b0,T5e,S7=N(()=>{"use strict";La();pt();b0=o(t=>{if(X.debug("sanitizeDirective called with",t),!(typeof t!="object"||t==null)){if(Array.isArray(t)){t.forEach(e=>b0(e));return}for(let e of Object.keys(t)){if(X.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!YG.has(e)||t[e]==null){X.debug("sanitize deleting key: ",e),delete t[e];continue}if(typeof t[e]=="object"){X.debug("sanitizing object",e),b0(t[e]);continue}let r=["themeCSS","fontFamily","altFontFamily"];for(let n of r)e.includes(n)&&(X.debug("sanitizing css option",e),t[e]=T5e(t[e]))}if(t.themeVariables)for(let e of Object.keys(t.themeVariables)){let r=t.themeVariables[e];r?.match&&!r.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}X.debug("After sanitization",t)}},"sanitizeDirective"),T5e=o(t=>{let e=0,r=0;for(let n of t){if(e{"use strict";v0();pt();e3();La();S7();gh=Object.freeze(ur),Es=Rn({},gh),cd=[],Py=Rn({},gh),r3=o((t,e)=>{let r=Rn({},t),n={};for(let i of e)QG(i),n=Rn(n,i);if(r=Rn(r,n),n.theme&&n.theme in So){let i=Rn({},t3),a=Rn(i.themeVariables||{},n.themeVariables);r.theme&&r.theme in So&&(r.themeVariables=So[r.theme].getThemeVariables(a))}return Py=r,JG(Py),Py},"updateCurrentConfig"),C7=o(t=>(Es=Rn({},gh),Es=Rn(Es,t),t.theme&&So[t.theme]&&(Es.themeVariables=So[t.theme].getThemeVariables(t.themeVariables)),r3(Es,cd),Es),"setSiteConfig"),jG=o(t=>{t3=Rn({},t)},"saveConfigFromInitialize"),KG=o(t=>(Es=Rn(Es,t),r3(Es,cd),Es),"updateSiteConfig"),A7=o(()=>Rn({},Es),"getSiteConfig"),n3=o(t=>(JG(t),Rn(Py,t),Qt()),"setConfig"),Qt=o(()=>Rn({},Py),"getConfig"),QG=o(t=>{t&&(["secure",...Es.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(X.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{typeof t[e]=="string"&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],typeof t[e]=="object"&&QG(t[e])}))},"sanitize"),ZG=o(t=>{b0(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables={...t.themeVariables,fontFamily:t.fontFamily}),cd.push(t),r3(Es,cd)},"addDirective"),By=o((t=Es)=>{cd=[],r3(t,cd)},"reset"),w5e={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead."},XG={},k5e=o(t=>{XG[t]||(X.warn(w5e[t]),XG[t]=!0)},"issueWarning"),JG=o(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&k5e("LAZY_LOAD_DEPRECATED")},"checkConfig"),eV=o(()=>{let t={};t3&&(t=Rn(t,t3));for(let e of cd)t=Rn(t,e);return t},"getUserDefinedConfig")});function Ja(t){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var r=arguments.length,n=new Array(r>1?r-1:0),i=1;i2&&arguments[2]!==void 0?arguments[2]:s3;tV&&tV(t,null);let n=e.length;for(;n--;){let i=e[n];if(typeof i=="string"){let a=r(i);a!==i&&(E5e(e)||(e[n]=a),i=a)}t[i]=!0}return t}function N5e(t){for(let e=0;e0&&arguments[0]!==void 0?arguments[0]:U5e(),e=o(Ct=>pV(Ct),"DOMPurify");if(e.version="3.2.6",e.removed=[],!t||!t.document||t.document.nodeType!==Vy.document||!t.Element)return e.isSupported=!1,e;let{document:r}=t,n=r,i=n.currentScript,{DocumentFragment:a,HTMLTemplateElement:s,Node:l,Element:u,NodeFilter:h,NamedNodeMap:f=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:d,DOMParser:p,trustedTypes:m}=t,g=u.prototype,y=Gy(g,"cloneNode"),v=Gy(g,"remove"),x=Gy(g,"nextSibling"),b=Gy(g,"childNodes"),T=Gy(g,"parentNode");if(typeof s=="function"){let Ct=r.createElement("template");Ct.content&&Ct.content.ownerDocument&&(r=Ct.content.ownerDocument)}let S,w="",{implementation:k,createNodeIterator:A,createDocumentFragment:C,getElementsByTagName:R}=r,{importNode:I}=n,L=cV();e.isSupported=typeof uV=="function"&&typeof T=="function"&&k&&k.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:E,ERB_EXPR:D,TMPLIT_EXPR:_,DATA_ATTR:O,ARIA_ATTR:M,IS_SCRIPT_OR_DATA:P,ATTR_WHITESPACE:B,CUSTOM_ELEMENT:F}=lV,{IS_ALLOWED_URI:G}=lV,$=null,U=Nr({},[...iV,...D7,...L7,...R7,...aV]),j=null,te=Nr({},[...sV,...N7,...oV,...a3]),Y=Object.seal(hV(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),oe=null,J=null,ue=!0,re=!0,ee=!1,Z=!0,K=!1,ae=!0,Q=!1,de=!1,ne=!1,Te=!1,q=!1,Ve=!1,pe=!0,Be=!1,Ye="user-content-",He=!0,Le=!1,Ie={},Ne=null,Ce=Nr({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Fe=null,fe=Nr({},["audio","video","img","source","image","track"]),xe=null,W=Nr({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),he="http://www.w3.org/1998/Math/MathML",z="http://www.w3.org/2000/svg",se="http://www.w3.org/1999/xhtml",le=se,ke=!1,ve=null,ye=Nr({},[he,z,se],_7),Re=Nr({},["mi","mo","mn","ms","mtext"]),_e=Nr({},["annotation-xml"]),ze=Nr({},["title","style","font","a","script"]),Ke=null,xt=["application/xhtml+xml","text/html"],We="text/html",Oe=null,et=null,Ue=r.createElement("form"),lt=o(function(Se){return Se instanceof RegExp||Se instanceof Function},"isRegexOrFunction"),Gt=o(function(){let Se=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(et&&et===Se)){if((!Se||typeof Se!="object")&&(Se={}),Se=lu(Se),Ke=xt.indexOf(Se.PARSER_MEDIA_TYPE)===-1?We:Se.PARSER_MEDIA_TYPE,Oe=Ke==="application/xhtml+xml"?_7:s3,$=hl(Se,"ALLOWED_TAGS")?Nr({},Se.ALLOWED_TAGS,Oe):U,j=hl(Se,"ALLOWED_ATTR")?Nr({},Se.ALLOWED_ATTR,Oe):te,ve=hl(Se,"ALLOWED_NAMESPACES")?Nr({},Se.ALLOWED_NAMESPACES,_7):ye,xe=hl(Se,"ADD_URI_SAFE_ATTR")?Nr(lu(W),Se.ADD_URI_SAFE_ATTR,Oe):W,Fe=hl(Se,"ADD_DATA_URI_TAGS")?Nr(lu(fe),Se.ADD_DATA_URI_TAGS,Oe):fe,Ne=hl(Se,"FORBID_CONTENTS")?Nr({},Se.FORBID_CONTENTS,Oe):Ce,oe=hl(Se,"FORBID_TAGS")?Nr({},Se.FORBID_TAGS,Oe):lu({}),J=hl(Se,"FORBID_ATTR")?Nr({},Se.FORBID_ATTR,Oe):lu({}),Ie=hl(Se,"USE_PROFILES")?Se.USE_PROFILES:!1,ue=Se.ALLOW_ARIA_ATTR!==!1,re=Se.ALLOW_DATA_ATTR!==!1,ee=Se.ALLOW_UNKNOWN_PROTOCOLS||!1,Z=Se.ALLOW_SELF_CLOSE_IN_ATTR!==!1,K=Se.SAFE_FOR_TEMPLATES||!1,ae=Se.SAFE_FOR_XML!==!1,Q=Se.WHOLE_DOCUMENT||!1,Te=Se.RETURN_DOM||!1,q=Se.RETURN_DOM_FRAGMENT||!1,Ve=Se.RETURN_TRUSTED_TYPE||!1,ne=Se.FORCE_BODY||!1,pe=Se.SANITIZE_DOM!==!1,Be=Se.SANITIZE_NAMED_PROPS||!1,He=Se.KEEP_CONTENT!==!1,Le=Se.IN_PLACE||!1,G=Se.ALLOWED_URI_REGEXP||fV,le=Se.NAMESPACE||se,Re=Se.MATHML_TEXT_INTEGRATION_POINTS||Re,_e=Se.HTML_INTEGRATION_POINTS||_e,Y=Se.CUSTOM_ELEMENT_HANDLING||{},Se.CUSTOM_ELEMENT_HANDLING&<(Se.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Y.tagNameCheck=Se.CUSTOM_ELEMENT_HANDLING.tagNameCheck),Se.CUSTOM_ELEMENT_HANDLING&<(Se.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Y.attributeNameCheck=Se.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),Se.CUSTOM_ELEMENT_HANDLING&&typeof Se.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(Y.allowCustomizedBuiltInElements=Se.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),K&&(re=!1),q&&(Te=!0),Ie&&($=Nr({},aV),j=[],Ie.html===!0&&(Nr($,iV),Nr(j,sV)),Ie.svg===!0&&(Nr($,D7),Nr(j,N7),Nr(j,a3)),Ie.svgFilters===!0&&(Nr($,L7),Nr(j,N7),Nr(j,a3)),Ie.mathMl===!0&&(Nr($,R7),Nr(j,oV),Nr(j,a3))),Se.ADD_TAGS&&($===U&&($=lu($)),Nr($,Se.ADD_TAGS,Oe)),Se.ADD_ATTR&&(j===te&&(j=lu(j)),Nr(j,Se.ADD_ATTR,Oe)),Se.ADD_URI_SAFE_ATTR&&Nr(xe,Se.ADD_URI_SAFE_ATTR,Oe),Se.FORBID_CONTENTS&&(Ne===Ce&&(Ne=lu(Ne)),Nr(Ne,Se.FORBID_CONTENTS,Oe)),He&&($["#text"]=!0),Q&&Nr($,["html","head","body"]),$.table&&(Nr($,["tbody"]),delete oe.tbody),Se.TRUSTED_TYPES_POLICY){if(typeof Se.TRUSTED_TYPES_POLICY.createHTML!="function")throw zy('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof Se.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw zy('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');S=Se.TRUSTED_TYPES_POLICY,w=S.createHTML("")}else S===void 0&&(S=H5e(m,i)),S!==null&&typeof w=="string"&&(w=S.createHTML(""));Za&&Za(Se),et=Se}},"_parseConfig"),vt=Nr({},[...D7,...L7,...M5e]),Lt=Nr({},[...R7,...I5e]),dt=o(function(Se){let at=T(Se);(!at||!at.tagName)&&(at={namespaceURI:le,tagName:"template"});let Nt=s3(Se.tagName),wr=s3(at.tagName);return ve[Se.namespaceURI]?Se.namespaceURI===z?at.namespaceURI===se?Nt==="svg":at.namespaceURI===he?Nt==="svg"&&(wr==="annotation-xml"||Re[wr]):!!vt[Nt]:Se.namespaceURI===he?at.namespaceURI===se?Nt==="math":at.namespaceURI===z?Nt==="math"&&_e[wr]:!!Lt[Nt]:Se.namespaceURI===se?at.namespaceURI===z&&!_e[wr]||at.namespaceURI===he&&!Re[wr]?!1:!Lt[Nt]&&(ze[Nt]||!vt[Nt]):!!(Ke==="application/xhtml+xml"&&ve[Se.namespaceURI]):!1},"_checkValidNamespace"),nt=o(function(Se){Fy(e.removed,{element:Se});try{T(Se).removeChild(Se)}catch{v(Se)}},"_forceRemove"),bt=o(function(Se,at){try{Fy(e.removed,{attribute:at.getAttributeNode(Se),from:at})}catch{Fy(e.removed,{attribute:null,from:at})}if(at.removeAttribute(Se),Se==="is")if(Te||q)try{nt(at)}catch{}else try{at.setAttribute(Se,"")}catch{}},"_removeAttribute"),wt=o(function(Se){let at=null,Nt=null;if(ne)Se=""+Se;else{let yn=nV(Se,/^[\r\n\t ]+/);Nt=yn&&yn[0]}Ke==="application/xhtml+xml"&&le===se&&(Se=''+Se+"");let wr=S?S.createHTML(Se):Se;if(le===se)try{at=new p().parseFromString(wr,Ke)}catch{}if(!at||!at.documentElement){at=k.createDocument(le,"template",null);try{at.documentElement.innerHTML=ke?w:wr}catch{}}let Tn=at.body||at.documentElement;return Se&&Nt&&Tn.insertBefore(r.createTextNode(Nt),Tn.childNodes[0]||null),le===se?R.call(at,Q?"html":"body")[0]:Q?at.documentElement:Tn},"_initDocument"),yt=o(function(Se){return A.call(Se.ownerDocument||Se,Se,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT|h.SHOW_PROCESSING_INSTRUCTION|h.SHOW_CDATA_SECTION,null)},"_createNodeIterator"),ft=o(function(Se){return Se instanceof d&&(typeof Se.nodeName!="string"||typeof Se.textContent!="string"||typeof Se.removeChild!="function"||!(Se.attributes instanceof f)||typeof Se.removeAttribute!="function"||typeof Se.setAttribute!="function"||typeof Se.namespaceURI!="string"||typeof Se.insertBefore!="function"||typeof Se.hasChildNodes!="function")},"_isClobbered"),Ur=o(function(Se){return typeof l=="function"&&Se instanceof l},"_isNode");function _t(Ct,Se,at){i3(Ct,Nt=>{Nt.call(e,Se,at,et)})}o(_t,"_executeHooks");let bn=o(function(Se){let at=null;if(_t(L.beforeSanitizeElements,Se,null),ft(Se))return nt(Se),!0;let Nt=Oe(Se.nodeName);if(_t(L.uponSanitizeElement,Se,{tagName:Nt,allowedTags:$}),ae&&Se.hasChildNodes()&&!Ur(Se.firstElementChild)&&Qa(/<[/\w!]/g,Se.innerHTML)&&Qa(/<[/\w!]/g,Se.textContent)||Se.nodeType===Vy.progressingInstruction||ae&&Se.nodeType===Vy.comment&&Qa(/<[/\w]/g,Se.data))return nt(Se),!0;if(!$[Nt]||oe[Nt]){if(!oe[Nt]&&cr(Nt)&&(Y.tagNameCheck instanceof RegExp&&Qa(Y.tagNameCheck,Nt)||Y.tagNameCheck instanceof Function&&Y.tagNameCheck(Nt)))return!1;if(He&&!Ne[Nt]){let wr=T(Se)||Se.parentNode,Tn=b(Se)||Se.childNodes;if(Tn&&wr){let yn=Tn.length;for(let sn=yn-1;sn>=0;--sn){let Hi=y(Tn[sn],!0);Hi.__removalCount=(Se.__removalCount||0)+1,wr.insertBefore(Hi,x(Se))}}}return nt(Se),!0}return Se instanceof u&&!dt(Se)||(Nt==="noscript"||Nt==="noembed"||Nt==="noframes")&&Qa(/<\/no(script|embed|frames)/i,Se.innerHTML)?(nt(Se),!0):(K&&Se.nodeType===Vy.text&&(at=Se.textContent,i3([E,D,_],wr=>{at=$y(at,wr," ")}),Se.textContent!==at&&(Fy(e.removed,{element:Se.cloneNode()}),Se.textContent=at)),_t(L.afterSanitizeElements,Se,null),!1)},"_sanitizeElements"),Br=o(function(Se,at,Nt){if(pe&&(at==="id"||at==="name")&&(Nt in r||Nt in Ue))return!1;if(!(re&&!J[at]&&Qa(O,at))){if(!(ue&&Qa(M,at))){if(!j[at]||J[at]){if(!(cr(Se)&&(Y.tagNameCheck instanceof RegExp&&Qa(Y.tagNameCheck,Se)||Y.tagNameCheck instanceof Function&&Y.tagNameCheck(Se))&&(Y.attributeNameCheck instanceof RegExp&&Qa(Y.attributeNameCheck,at)||Y.attributeNameCheck instanceof Function&&Y.attributeNameCheck(at))||at==="is"&&Y.allowCustomizedBuiltInElements&&(Y.tagNameCheck instanceof RegExp&&Qa(Y.tagNameCheck,Nt)||Y.tagNameCheck instanceof Function&&Y.tagNameCheck(Nt))))return!1}else if(!xe[at]){if(!Qa(G,$y(Nt,B,""))){if(!((at==="src"||at==="xlink:href"||at==="href")&&Se!=="script"&&D5e(Nt,"data:")===0&&Fe[Se])){if(!(ee&&!Qa(P,$y(Nt,B,"")))){if(Nt)return!1}}}}}}return!0},"_isValidAttribute"),cr=o(function(Se){return Se!=="annotation-xml"&&nV(Se,F)},"_isBasicCustomElement"),ar=o(function(Se){_t(L.beforeSanitizeAttributes,Se,null);let{attributes:at}=Se;if(!at||ft(Se))return;let Nt={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:j,forceKeepAttr:void 0},wr=at.length;for(;wr--;){let Tn=at[wr],{name:yn,namespaceURI:sn,value:Hi}=Tn,Zs=Oe(yn),_a=Hi,fr=yn==="value"?_a:L5e(_a);if(Nt.attrName=Zs,Nt.attrValue=fr,Nt.keepAttr=!0,Nt.forceKeepAttr=void 0,_t(L.uponSanitizeAttribute,Se,Nt),fr=Nt.attrValue,Be&&(Zs==="id"||Zs==="name")&&(bt(yn,Se),fr=Ye+fr),ae&&Qa(/((--!?|])>)|<\/(style|title)/i,fr)){bt(yn,Se);continue}if(Nt.forceKeepAttr)continue;if(!Nt.keepAttr){bt(yn,Se);continue}if(!Z&&Qa(/\/>/i,fr)){bt(yn,Se);continue}K&&i3([E,D,_],kt=>{fr=$y(fr,kt," ")});let it=Oe(Se.nodeName);if(!Br(it,Zs,fr)){bt(yn,Se);continue}if(S&&typeof m=="object"&&typeof m.getAttributeType=="function"&&!sn)switch(m.getAttributeType(it,Zs)){case"TrustedHTML":{fr=S.createHTML(fr);break}case"TrustedScriptURL":{fr=S.createScriptURL(fr);break}}if(fr!==_a)try{sn?Se.setAttributeNS(sn,yn,fr):Se.setAttribute(yn,fr),ft(Se)?nt(Se):rV(e.removed)}catch{bt(yn,Se)}}_t(L.afterSanitizeAttributes,Se,null)},"_sanitizeAttributes"),_r=o(function Ct(Se){let at=null,Nt=yt(Se);for(_t(L.beforeSanitizeShadowDOM,Se,null);at=Nt.nextNode();)_t(L.uponSanitizeShadowNode,at,null),bn(at),ar(at),at.content instanceof a&&Ct(at.content);_t(L.afterSanitizeShadowDOM,Se,null)},"_sanitizeShadowDOM");return e.sanitize=function(Ct){let Se=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},at=null,Nt=null,wr=null,Tn=null;if(ke=!Ct,ke&&(Ct=""),typeof Ct!="string"&&!Ur(Ct))if(typeof Ct.toString=="function"){if(Ct=Ct.toString(),typeof Ct!="string")throw zy("dirty is not a string, aborting")}else throw zy("toString is not a function");if(!e.isSupported)return Ct;if(de||Gt(Se),e.removed=[],typeof Ct=="string"&&(Le=!1),Le){if(Ct.nodeName){let Hi=Oe(Ct.nodeName);if(!$[Hi]||oe[Hi])throw zy("root node is forbidden and cannot be sanitized in-place")}}else if(Ct instanceof l)at=wt(""),Nt=at.ownerDocument.importNode(Ct,!0),Nt.nodeType===Vy.element&&Nt.nodeName==="BODY"||Nt.nodeName==="HTML"?at=Nt:at.appendChild(Nt);else{if(!Te&&!K&&!Q&&Ct.indexOf("<")===-1)return S&&Ve?S.createHTML(Ct):Ct;if(at=wt(Ct),!at)return Te?null:Ve?w:""}at&&ne&&nt(at.firstChild);let yn=yt(Le?Ct:at);for(;wr=yn.nextNode();)bn(wr),ar(wr),wr.content instanceof a&&_r(wr.content);if(Le)return Ct;if(Te){if(q)for(Tn=C.call(at.ownerDocument);at.firstChild;)Tn.appendChild(at.firstChild);else Tn=at;return(j.shadowroot||j.shadowrootmode)&&(Tn=I.call(n,Tn,!0)),Tn}let sn=Q?at.outerHTML:at.innerHTML;return Q&&$["!doctype"]&&at.ownerDocument&&at.ownerDocument.doctype&&at.ownerDocument.doctype.name&&Qa(dV,at.ownerDocument.doctype.name)&&(sn=" +`+sn),K&&i3([E,D,_],Hi=>{sn=$y(sn,Hi," ")}),S&&Ve?S.createHTML(sn):sn},e.setConfig=function(){let Ct=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Gt(Ct),de=!0},e.clearConfig=function(){et=null,de=!1},e.isValidAttribute=function(Ct,Se,at){et||Gt({});let Nt=Oe(Ct),wr=Oe(Se);return Br(Nt,wr,at)},e.addHook=function(Ct,Se){typeof Se=="function"&&Fy(L[Ct],Se)},e.removeHook=function(Ct,Se){if(Se!==void 0){let at=A5e(L[Ct],Se);return at===-1?void 0:_5e(L[Ct],at,1)[0]}return rV(L[Ct])},e.removeHooks=function(Ct){L[Ct]=[]},e.removeAllHooks=function(){L=cV()},e}var uV,tV,E5e,S5e,C5e,Za,Co,hV,M7,I7,i3,A5e,rV,Fy,_5e,s3,_7,nV,$y,D5e,L5e,hl,Qa,zy,iV,D7,L7,M5e,R7,I5e,aV,sV,N7,oV,a3,O5e,P5e,B5e,F5e,$5e,fV,z5e,G5e,dV,V5e,lV,Vy,U5e,H5e,cV,yh,O7=N(()=>{"use strict";({entries:uV,setPrototypeOf:tV,isFrozen:E5e,getPrototypeOf:S5e,getOwnPropertyDescriptor:C5e}=Object),{freeze:Za,seal:Co,create:hV}=Object,{apply:M7,construct:I7}=typeof Reflect<"u"&&Reflect;Za||(Za=o(function(e){return e},"freeze"));Co||(Co=o(function(e){return e},"seal"));M7||(M7=o(function(e,r,n){return e.apply(r,n)},"apply"));I7||(I7=o(function(e,r){return new e(...r)},"construct"));i3=Ja(Array.prototype.forEach),A5e=Ja(Array.prototype.lastIndexOf),rV=Ja(Array.prototype.pop),Fy=Ja(Array.prototype.push),_5e=Ja(Array.prototype.splice),s3=Ja(String.prototype.toLowerCase),_7=Ja(String.prototype.toString),nV=Ja(String.prototype.match),$y=Ja(String.prototype.replace),D5e=Ja(String.prototype.indexOf),L5e=Ja(String.prototype.trim),hl=Ja(Object.prototype.hasOwnProperty),Qa=Ja(RegExp.prototype.test),zy=R5e(TypeError);o(Ja,"unapply");o(R5e,"unconstruct");o(Nr,"addToSet");o(N5e,"cleanArray");o(lu,"clone");o(Gy,"lookupGetter");iV=Za(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),D7=Za(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),L7=Za(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),M5e=Za(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),R7=Za(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),I5e=Za(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),aV=Za(["#text"]),sV=Za(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),N7=Za(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),oV=Za(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),a3=Za(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),O5e=Co(/\{\{[\w\W]*|[\w\W]*\}\}/gm),P5e=Co(/<%[\w\W]*|[\w\W]*%>/gm),B5e=Co(/\$\{[\w\W]*/gm),F5e=Co(/^data-[\-\w.\u00B7-\uFFFF]+$/),$5e=Co(/^aria-[\-\w]+$/),fV=Co(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),z5e=Co(/^(?:\w+script|data):/i),G5e=Co(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),dV=Co(/^html$/i),V5e=Co(/^[a-z][.\w]*(-[.\w]+)+$/i),lV=Object.freeze({__proto__:null,ARIA_ATTR:$5e,ATTR_WHITESPACE:G5e,CUSTOM_ELEMENT:V5e,DATA_ATTR:F5e,DOCTYPE_NAME:dV,ERB_EXPR:P5e,IS_ALLOWED_URI:fV,IS_SCRIPT_OR_DATA:z5e,MUSTACHE_EXPR:O5e,TMPLIT_EXPR:B5e}),Vy={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},U5e=o(function(){return typeof window>"u"?null:window},"getGlobal"),H5e=o(function(e,r){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let n=null,i="data-tt-policy-suffix";r&&r.hasAttribute(i)&&(n=r.getAttribute(i));let a="dompurify"+(n?"#"+n:"");try{return e.createPolicy(a,{createHTML(s){return s},createScriptURL(s){return s}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},"_createTrustedTypesPolicy"),cV=o(function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},"_createHooksMap");o(pV,"createDOMPurify");yh=pV()});var WU={};dr(WU,{ParseError:()=>gt,SETTINGS_SCHEMA:()=>Wy,__defineFunction:()=>Mt,__defineMacro:()=>ce,__defineSymbol:()=>V,__domTree:()=>qU,__parse:()=>GU,__renderToDomTree:()=>M3,__renderToHTMLTree:()=>UU,__setFontMetrics:()=>XV,default:()=>Owe,render:()=>EA,renderToString:()=>zU,version:()=>HU});function Q5e(t){return String(t).replace(K5e,e=>j5e[e])}function tTe(t){if(t.default)return t.default;var e=t.type,r=Array.isArray(e)?e[0]:e;if(typeof r!="string")return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}function lTe(t){for(var e=0;e=i[0]&&t<=i[1])return r.name}return null}function YV(t){for(var e=0;e=v3[e]&&t<=v3[e+1])return!0;return!1}function XV(t,e){Ql[t]=e}function lA(t,e,r){if(!Ql[e])throw new Error("Font metrics not found for font: "+e+".");var n=t.charCodeAt(0),i=Ql[e][n];if(!i&&t[0]in gV&&(n=gV[t[0]].charCodeAt(0),i=Ql[e][n]),!i&&r==="text"&&YV(n)&&(i=Ql[e][77]),i)return{depth:i[0],height:i[1],italic:i[2],skew:i[3],width:i[4]}}function xTe(t){var e;if(t>=5?e=0:t>=3?e=1:e=2,!P7[e]){var r=P7[e]={cssEmPerMu:o3.quad[e]/18};for(var n in o3)o3.hasOwnProperty(n)&&(r[n]=o3[n][e])}return P7[e]}function xV(t){if(t instanceof Cs)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}function ETe(t){if(t instanceof fd)return t;throw new Error("Expected span but got "+String(t)+".")}function V(t,e,r,n,i,a){Nn[t][i]={font:e,group:r,replace:n},a&&n&&(Nn[t][n]=Nn[t][i])}function Mt(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs,argTypes:n.argTypes,allowedInArgument:!!n.allowedInArgument,allowedInText:!!n.allowedInText,allowedInMath:n.allowedInMath===void 0?!0:n.allowedInMath,numOptionalArgs:n.numOptionalArgs||0,infix:!!n.infix,primitive:!!n.primitive,handler:i},u=0;u0&&(a.push(p3(s,e)),s=[]),a.push(n[l]));s.length>0&&a.push(p3(s,e));var h;r?(h=p3(Ii(r,e,!0)),h.classes=["tag"],a.push(h)):i&&a.push(i);var f=du(["katex-html"],a);if(f.setAttribute("aria-hidden","true"),h){var d=h.children[0];d.style.height=St(f.height+f.depth),f.depth&&(d.style.verticalAlign=St(-f.depth))}return f}function sU(t){return new hd(t)}function $7(t){if(!t)return!1;if(t.type==="mi"&&t.children.length===1){var e=t.children[0];return e instanceof _o&&e.text==="."}else if(t.type==="mo"&&t.children.length===1&&t.getAttribute("separator")==="true"&&t.getAttribute("lspace")==="0em"&&t.getAttribute("rspace")==="0em"){var r=t.children[0];return r instanceof _o&&r.text===","}else return!1}function EV(t,e,r,n,i){var a=As(t,r),s;a.length===1&&a[0]instanceof es&&er.contains(["mrow","mtable"],a[0].type)?s=a[0]:s=new mt.MathNode("mrow",a);var l=new mt.MathNode("annotation",[new mt.TextNode(e)]);l.setAttribute("encoding","application/x-tex");var u=new mt.MathNode("semantics",[s,l]),h=new mt.MathNode("math",[u]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&h.setAttribute("display","block");var f=i?"katex":"katex-mathml";return $e.makeSpan([f],[h])}function Tr(t,e){if(!t||t.type!==e)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return t}function fA(t){var e=D3(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function D3(t){return t&&(t.type==="atom"||CTe.hasOwnProperty(t.type))?t:null}function uU(t,e){var r=Ii(t.body,e,!0);return rwe([t.mclass],r,e)}function hU(t,e){var r,n=As(t.body,e);return t.mclass==="minner"?r=new mt.MathNode("mpadded",n):t.mclass==="mord"?t.isCharacterBox?(r=n[0],r.type="mi"):r=new mt.MathNode("mi",n):(t.isCharacterBox?(r=n[0],r.type="mo"):r=new mt.MathNode("mo",n),t.mclass==="mbin"?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):t.mclass==="mpunct"?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):t.mclass==="mopen"||t.mclass==="mclose"?(r.attributes.lspace="0em",r.attributes.rspace="0em"):t.mclass==="minner"&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}function awe(t,e,r){var n=nwe[t];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var i=r.callFunction("\\\\cdleft",[e[0]],[]),a={type:"atom",text:n,mode:"math",family:"rel"},s=r.callFunction("\\Big",[a],[]),l=r.callFunction("\\\\cdright",[e[1]],[]),u={type:"ordgroup",mode:"math",body:[i,s,l]};return r.callFunction("\\\\cdparent",[u],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var h={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[h],[])}default:return{type:"textord",text:" ",mode:"math"}}}function swe(t){var e=[];for(t.gullet.beginGroup(),t.gullet.macros.set("\\cr","\\\\\\relax"),t.gullet.beginGroup();;){e.push(t.parseExpression(!1,"\\\\")),t.gullet.endGroup(),t.gullet.beginGroup();var r=t.fetch().text;if(r==="&"||r==="\\\\")t.consume();else if(r==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new gt("Expected \\\\ or \\cr or \\end",t.nextToken)}for(var n=[],i=[n],a=0;a-1))if("<>AV".indexOf(h)>-1)for(var d=0;d<2;d++){for(var p=!0,m=u+1;mAV=|." after @',s[u]);var g=awe(h,f,t),y={type:"styling",body:[g],mode:"math",style:"display"};n.push(y),l=SV()}a%2===0?n.push(l):n.shift(),n=[],i.push(n)}t.gullet.endGroup(),t.gullet.endGroup();var v=new Array(i[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:i,arraystretch:1,addJot:!0,rowGaps:[null],cols:v,colSeparationType:"CD",hLinesBeforeRow:new Array(i.length+1).fill([])}}function R3(t,e){var r=D3(t);if(r&&er.contains(xwe,r.text))return r;throw r?new gt("Invalid delimiter '"+r.text+"' after '"+e.funcName+"'",t):new gt("Invalid delimiter type '"+t.type+"'",t)}function _V(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}function Jl(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:i},u=0;u1||!f)&&y.pop(),x.length{"use strict";to=class t{static{o(this,"SourceLocation")}constructor(e,r,n){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=r,this.end=n}static range(e,r){return r?!e||!e.loc||!r.loc||e.loc.lexer!==r.loc.lexer?null:new t(e.loc.lexer,e.loc.start,r.loc.end):e&&e.loc}},Do=class t{static{o(this,"Token")}constructor(e,r){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=r}range(e,r){return new t(r,to.range(this,e))}},gt=class t{static{o(this,"ParseError")}constructor(e,r){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var n="KaTeX parse error: "+e,i,a,s=r&&r.loc;if(s&&s.start<=s.end){var l=s.lexer.input;i=s.start,a=s.end,i===l.length?n+=" at end of input: ":n+=" at position "+(i+1)+": ";var u=l.slice(i,a).replace(/[^]/g,"$&\u0332"),h;i>15?h="\u2026"+l.slice(i-15,i):h=l.slice(0,i);var f;a+15":">","<":"<",'"':""","'":"'"},K5e=/[&><"']/g;o(Q5e,"escape");WV=o(function t(e){return e.type==="ordgroup"||e.type==="color"?e.body.length===1?t(e.body[0]):e:e.type==="font"?t(e.body):e},"getBaseElem"),Z5e=o(function(e){var r=WV(e);return r.type==="mathord"||r.type==="textord"||r.type==="atom"},"isCharacterBox"),J5e=o(function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},"assert"),eTe=o(function(e){var r=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return r?r[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(r[1])?null:r[1].toLowerCase():"_relative"},"protocolFromUrl"),er={contains:q5e,deflt:W5e,escape:Q5e,hyphenate:X5e,getBaseElem:WV,isCharacterBox:Z5e,protocolFromUrl:eTe},Wy={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:o(t=>"#"+t,"cliProcessor")},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:o((t,e)=>(e.push(t),e),"cliProcessor")},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:o(t=>Math.max(0,t),"processor"),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:o(t=>Math.max(0,t),"processor"),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:o(t=>Math.max(0,t),"processor"),cli:"-e, --max-expand ",cliProcessor:o(t=>t==="Infinity"?1/0:parseInt(t),"cliProcessor")},globalGroup:{type:"boolean",cli:!1}};o(tTe,"getDefaultValue");Xy=class{static{o(this,"Settings")}constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(var r in Wy)if(Wy.hasOwnProperty(r)){var n=Wy[r];this[r]=e[r]!==void 0?n.processor?n.processor(e[r]):e[r]:tTe(n)}}reportNonstrict(e,r,n){var i=this.strict;if(typeof i=="function"&&(i=i(e,r,n)),!(!i||i==="ignore")){if(i===!0||i==="error")throw new gt("LaTeX-incompatible input and strict mode is set to 'error': "+(r+" ["+e+"]"),n);i==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]"))}}useStrictBehavior(e,r,n){var i=this.strict;if(typeof i=="function")try{i=i(e,r,n)}catch{i="error"}return!i||i==="ignore"?!1:i===!0||i==="error"?!0:i==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]")),!1)}isTrusted(e){if(e.url&&!e.protocol){var r=er.protocolFromUrl(e.url);if(r==null)return!1;e.protocol=r}var n=typeof this.trust=="function"?this.trust(e):this.trust;return!!n}},jl=class{static{o(this,"Style")}constructor(e,r,n){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=r,this.cramped=n}sup(){return Kl[rTe[this.id]]}sub(){return Kl[nTe[this.id]]}fracNum(){return Kl[iTe[this.id]]}fracDen(){return Kl[aTe[this.id]]}cramp(){return Kl[sTe[this.id]]}text(){return Kl[oTe[this.id]]}isTight(){return this.size>=2}},oA=0,x3=1,k0=2,hu=3,jy=4,Ao=5,E0=6,ts=7,Kl=[new jl(oA,0,!1),new jl(x3,0,!0),new jl(k0,1,!1),new jl(hu,1,!0),new jl(jy,2,!1),new jl(Ao,2,!0),new jl(E0,3,!1),new jl(ts,3,!0)],rTe=[jy,Ao,jy,Ao,E0,ts,E0,ts],nTe=[Ao,Ao,Ao,Ao,ts,ts,ts,ts],iTe=[k0,hu,jy,Ao,E0,ts,E0,ts],aTe=[hu,hu,Ao,Ao,ts,ts,ts,ts],sTe=[x3,x3,hu,hu,Ao,Ao,ts,ts],oTe=[oA,x3,k0,hu,k0,hu,k0,hu],nr={DISPLAY:Kl[oA],TEXT:Kl[k0],SCRIPT:Kl[jy],SCRIPTSCRIPT:Kl[E0]},j7=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];o(lTe,"scriptFromCodepoint");v3=[];j7.forEach(t=>t.blocks.forEach(e=>v3.push(...e)));o(YV,"supportedCodepoint");w0=80,cTe=o(function(e,r){return"M95,"+(622+e+r)+` +c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 +c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 +c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 +s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 +c69,-144,104.5,-217.7,106.5,-221 +l`+e/2.075+" -"+e+` +c5.3,-9.3,12,-14,20,-14 +H400000v`+(40+e)+`H845.2724 +s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 +c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z +M`+(834+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtMain"),uTe=o(function(e,r){return"M263,"+(601+e+r)+`c0.7,0,18,39.7,52,119 +c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 +c340,-704.7,510.7,-1060.3,512,-1067 +l`+e/2.084+" -"+e+` +c4.7,-7.3,11,-11,19,-11 +H40000v`+(40+e)+`H1012.3 +s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 +c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 +s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 +c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z +M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize1"),hTe=o(function(e,r){return"M983 "+(10+e+r)+` +l`+e/3.13+" -"+e+` +c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` +H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 +s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 +c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 +c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 +c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 +c53.7,-170.3,84.5,-266.8,92.5,-289.5z +M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize2"),fTe=o(function(e,r){return"M424,"+(2398+e+r)+` +c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 +c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 +s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 +s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 +l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 +v`+(40+e)+`H1014.6 +s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 +c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+r+` +h400000v`+(40+e)+"h-400000z"},"sqrtSize3"),dTe=o(function(e,r){return"M473,"+(2713+e+r)+` +c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` +c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 +s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 +c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 +s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, +606zM`+(1001+e)+" "+r+"h400000v"+(40+e)+"H1017.7z"},"sqrtSize4"),pTe=o(function(e){var r=e/2;return"M400000 "+e+" H0 L"+r+" 0 l65 45 L145 "+(e-80)+" H400000z"},"phasePath"),mTe=o(function(e,r,n){var i=n-54-r-e;return"M702 "+(e+r)+"H400000"+(40+e)+` +H742v`+i+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 +h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 +c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 +219 661 l218 661zM702 `+r+"H400000v"+(40+e)+"H742z"},"sqrtTall"),gTe=o(function(e,r,n){r=1e3*r;var i="";switch(e){case"sqrtMain":i=cTe(r,w0);break;case"sqrtSize1":i=uTe(r,w0);break;case"sqrtSize2":i=hTe(r,w0);break;case"sqrtSize3":i=fTe(r,w0);break;case"sqrtSize4":i=dTe(r,w0);break;case"sqrtTall":i=mTe(r,w0,n)}return i},"sqrtPath"),yTe=o(function(e,r){switch(e){case"\u239C":return"M291 0 H417 V"+r+" H291z M291 0 H417 V"+r+" H291z";case"\u2223":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z";case"\u2225":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z"+("M367 0 H410 V"+r+" H367z M367 0 H410 V"+r+" H367z");case"\u239F":return"M457 0 H583 V"+r+" H457z M457 0 H583 V"+r+" H457z";case"\u23A2":return"M319 0 H403 V"+r+" H319z M319 0 H403 V"+r+" H319z";case"\u23A5":return"M263 0 H347 V"+r+" H263z M263 0 H347 V"+r+" H263z";case"\u23AA":return"M384 0 H504 V"+r+" H384z M384 0 H504 V"+r+" H384z";case"\u23D0":return"M312 0 H355 V"+r+" H312z M312 0 H355 V"+r+" H312z";case"\u2016":return"M257 0 H300 V"+r+" H257z M257 0 H300 V"+r+" H257z"+("M478 0 H521 V"+r+" H478z M478 0 H521 V"+r+" H478z");default:return""}},"innerPath"),mV={doubleleftarrow:`M262 157 +l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 + 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 + 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 +c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 + 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 +-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 +-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z +m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l +-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 + 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 +-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 +-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 +-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 +c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 +-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 + 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 +-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 +c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 + 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 + 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 + l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 +-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 + 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 + 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 + 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 +-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 +H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 + 435 0h399565z`,leftgroupunder:`M400000 262 +H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 + 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 +-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 +-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 +-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 + 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 +-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 +-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z +m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 + 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 + 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 +-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 + 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 +-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 +v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 +-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 +-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 + 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z +M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z +M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 +-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 +c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 + 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z +M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 +c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 +-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 + 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 + 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 +c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 + 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 + 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 +-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 +-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z +m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 +60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 +-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z +m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 +c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 +-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z +m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 +85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 +-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z +m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 +c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 +-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 + 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 + 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 +-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 + 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l +-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 +s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 +c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 + 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 +-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 + 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 + 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 +-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 +-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 + 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 +-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 + 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z +m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 + 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 +-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 +-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 + 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 + 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 +-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z +m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 + 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 +-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 + 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z +M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 + 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 +-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 +-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 + 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 +-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 +-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 +-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 + 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 +c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 + 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 + 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 +-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 + 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 +-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 + 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 + 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 +-68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 +-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 + 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 +c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 + 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 +-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 + 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 + 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 + -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 +-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 + 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 + 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 + -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 +3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 +10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 +-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 +-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 +H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 +c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 +c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, +-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 +c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 +c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 +s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 +121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 +s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 +c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z +M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 +-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 +13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 +-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 +-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 +151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 +c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 +c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 +c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z +M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, +1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, +-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z +M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},vTe=o(function(e,r){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v1759 h347 v-84 +H403z M403 1759 V0 H319 V1759 v`+r+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v1759 H0 v84 H347z +M347 1759 V0 H263 V1759 v`+r+" v1759 h84z";case"vert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+" v585 h43z";case"doublevert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+` v585 h43z +M367 15 v585 v`+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+r+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+r+` v1715 h263 v84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+r+` v1799 H0 v-84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v602 h84z +M403 1759 V0 H319 V1759 v`+r+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v602 h84z +M347 1759 V0 h-84 V1759 v`+r+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 +c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, +-36,557 l0,`+(r+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, +949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 +c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, +-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 +l0,-`+(r+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, +-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, +63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 +c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(r+9)+` +c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 +c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 +c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 +c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 +l0,-`+(r+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, +-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},"tallDelim"),hd=class{static{o(this,"DocumentFragment")}constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return er.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),r=0;rr.toText(),"toText");return this.children.map(e).join("")}},Ql={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},o3={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},gV={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};o(XV,"setFontMetrics");o(lA,"getCharacterMetrics");P7={};o(xTe,"getGlobalMetrics");bTe=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],yV=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],vV=o(function(e,r){return r.size<2?e:bTe[e-1][r.size-1]},"sizeAtStyle"),b3=class t{static{o(this,"Options")}constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=yV[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);return new t(r)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:vV(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:yV[e-1]})}havingBaseStyle(e){e=e||this.style.text();var r=vV(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=xTe(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};b3.BASESIZE=6;K7={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},TTe={ex:!0,em:!0,mu:!0},jV=o(function(e){return typeof e!="string"&&(e=e.unit),e in K7||e in TTe||e==="ex"},"validUnit"),ii=o(function(e,r){var n;if(e.unit in K7)n=K7[e.unit]/r.fontMetrics().ptPerEm/r.sizeMultiplier;else if(e.unit==="mu")n=r.fontMetrics().cssEmPerMu;else{var i;if(r.style.isTight()?i=r.havingStyle(r.style.text()):i=r,e.unit==="ex")n=i.fontMetrics().xHeight;else if(e.unit==="em")n=i.fontMetrics().quad;else throw new gt("Invalid unit: '"+e.unit+"'");i!==r&&(n*=i.sizeMultiplier/r.sizeMultiplier)}return Math.min(e.number*n,r.maxSize)},"calculateSize"),St=o(function(e){return+e.toFixed(4)+"em"},"makeEm"),bh=o(function(e){return e.filter(r=>r).join(" ")},"createClass"),KV=o(function(e,r,n){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=n||{},r){r.style.isTight()&&this.classes.push("mtight");var i=r.getColor();i&&(this.style.color=i)}},"initNode"),QV=o(function(e){var r=document.createElement(e);r.className=bh(this.classes);for(var n in this.style)this.style.hasOwnProperty(n)&&(r.style[n]=this.style[n]);for(var i in this.attributes)this.attributes.hasOwnProperty(i)&&r.setAttribute(i,this.attributes[i]);for(var a=0;a/=\x00-\x1f]/,ZV=o(function(e){var r="<"+e;this.classes.length&&(r+=' class="'+er.escape(bh(this.classes))+'"');var n="";for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=er.hyphenate(i)+":"+this.style[i]+";");n&&(r+=' style="'+er.escape(n)+'"');for(var a in this.attributes)if(this.attributes.hasOwnProperty(a)){if(wTe.test(a))throw new gt("Invalid attribute name '"+a+"'");r+=" "+a+'="'+er.escape(this.attributes[a])+'"'}r+=">";for(var s=0;s",r},"toMarkup"),fd=class{static{o(this,"Span")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,KV.call(this,e,n,i),this.children=r||[]}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return er.contains(this.classes,e)}toNode(){return QV.call(this,"span")}toMarkup(){return ZV.call(this,"span")}},Ky=class{static{o(this,"Anchor")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,KV.call(this,r,i),this.children=n||[],this.setAttribute("href",e)}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return er.contains(this.classes,e)}toNode(){return QV.call(this,"a")}toMarkup(){return ZV.call(this,"a")}},Q7=class{static{o(this,"Img")}constructor(e,r,n){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=r,this.src=e,this.classes=["mord"],this.style=n}hasClass(e){return er.contains(this.classes,e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var r in this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);return e}toMarkup(){var e=''+er.escape(this.alt)+'0&&(r=document.createElement("span"),r.style.marginRight=St(this.italic)),this.classes.length>0&&(r=r||document.createElement("span"),r.className=bh(this.classes));for(var n in this.style)this.style.hasOwnProperty(n)&&(r=r||document.createElement("span"),r.style[n]=this.style[n]);return r?(r.appendChild(e),r):e}toMarkup(){var e=!1,r="0&&(n+="margin-right:"+this.italic+"em;");for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=er.hyphenate(i)+":"+this.style[i]+";");n&&(e=!0,r+=' style="'+er.escape(n)+'"');var a=er.escape(this.text);return e?(r+=">",r+=a,r+="
    ",r):a}},dl=class{static{o(this,"SvgNode")}constructor(e,r){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=r||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);for(var i=0;i':''}},Qy=class{static{o(this,"LineNode")}constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"line");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);return r}toMarkup(){var e="","\\gt",!0);V(H,ie,Ee,"\u2208","\\in",!0);V(H,ie,Ee,"\uE020","\\@not");V(H,ie,Ee,"\u2282","\\subset",!0);V(H,ie,Ee,"\u2283","\\supset",!0);V(H,ie,Ee,"\u2286","\\subseteq",!0);V(H,ie,Ee,"\u2287","\\supseteq",!0);V(H,we,Ee,"\u2288","\\nsubseteq",!0);V(H,we,Ee,"\u2289","\\nsupseteq",!0);V(H,ie,Ee,"\u22A8","\\models");V(H,ie,Ee,"\u2190","\\leftarrow",!0);V(H,ie,Ee,"\u2264","\\le");V(H,ie,Ee,"\u2264","\\leq",!0);V(H,ie,Ee,"<","\\lt",!0);V(H,ie,Ee,"\u2192","\\rightarrow",!0);V(H,ie,Ee,"\u2192","\\to");V(H,we,Ee,"\u2271","\\ngeq",!0);V(H,we,Ee,"\u2270","\\nleq",!0);V(H,ie,mu,"\xA0","\\ ");V(H,ie,mu,"\xA0","\\space");V(H,ie,mu,"\xA0","\\nobreakspace");V(ct,ie,mu,"\xA0","\\ ");V(ct,ie,mu,"\xA0"," ");V(ct,ie,mu,"\xA0","\\space");V(ct,ie,mu,"\xA0","\\nobreakspace");V(H,ie,mu,null,"\\nobreak");V(H,ie,mu,null,"\\allowbreak");V(H,ie,A3,",",",");V(H,ie,A3,";",";");V(H,we,Ot,"\u22BC","\\barwedge",!0);V(H,we,Ot,"\u22BB","\\veebar",!0);V(H,ie,Ot,"\u2299","\\odot",!0);V(H,ie,Ot,"\u2295","\\oplus",!0);V(H,ie,Ot,"\u2297","\\otimes",!0);V(H,ie,De,"\u2202","\\partial",!0);V(H,ie,Ot,"\u2298","\\oslash",!0);V(H,we,Ot,"\u229A","\\circledcirc",!0);V(H,we,Ot,"\u22A1","\\boxdot",!0);V(H,ie,Ot,"\u25B3","\\bigtriangleup");V(H,ie,Ot,"\u25BD","\\bigtriangledown");V(H,ie,Ot,"\u2020","\\dagger");V(H,ie,Ot,"\u22C4","\\diamond");V(H,ie,Ot,"\u22C6","\\star");V(H,ie,Ot,"\u25C3","\\triangleleft");V(H,ie,Ot,"\u25B9","\\triangleright");V(H,ie,ro,"{","\\{");V(ct,ie,De,"{","\\{");V(ct,ie,De,"{","\\textbraceleft");V(H,ie,rs,"}","\\}");V(ct,ie,De,"}","\\}");V(ct,ie,De,"}","\\textbraceright");V(H,ie,ro,"{","\\lbrace");V(H,ie,rs,"}","\\rbrace");V(H,ie,ro,"[","\\lbrack",!0);V(ct,ie,De,"[","\\lbrack",!0);V(H,ie,rs,"]","\\rbrack",!0);V(ct,ie,De,"]","\\rbrack",!0);V(H,ie,ro,"(","\\lparen",!0);V(H,ie,rs,")","\\rparen",!0);V(ct,ie,De,"<","\\textless",!0);V(ct,ie,De,">","\\textgreater",!0);V(H,ie,ro,"\u230A","\\lfloor",!0);V(H,ie,rs,"\u230B","\\rfloor",!0);V(H,ie,ro,"\u2308","\\lceil",!0);V(H,ie,rs,"\u2309","\\rceil",!0);V(H,ie,De,"\\","\\backslash");V(H,ie,De,"\u2223","|");V(H,ie,De,"\u2223","\\vert");V(ct,ie,De,"|","\\textbar",!0);V(H,ie,De,"\u2225","\\|");V(H,ie,De,"\u2225","\\Vert");V(ct,ie,De,"\u2225","\\textbardbl");V(ct,ie,De,"~","\\textasciitilde");V(ct,ie,De,"\\","\\textbackslash");V(ct,ie,De,"^","\\textasciicircum");V(H,ie,Ee,"\u2191","\\uparrow",!0);V(H,ie,Ee,"\u21D1","\\Uparrow",!0);V(H,ie,Ee,"\u2193","\\downarrow",!0);V(H,ie,Ee,"\u21D3","\\Downarrow",!0);V(H,ie,Ee,"\u2195","\\updownarrow",!0);V(H,ie,Ee,"\u21D5","\\Updownarrow",!0);V(H,ie,ki,"\u2210","\\coprod");V(H,ie,ki,"\u22C1","\\bigvee");V(H,ie,ki,"\u22C0","\\bigwedge");V(H,ie,ki,"\u2A04","\\biguplus");V(H,ie,ki,"\u22C2","\\bigcap");V(H,ie,ki,"\u22C3","\\bigcup");V(H,ie,ki,"\u222B","\\int");V(H,ie,ki,"\u222B","\\intop");V(H,ie,ki,"\u222C","\\iint");V(H,ie,ki,"\u222D","\\iiint");V(H,ie,ki,"\u220F","\\prod");V(H,ie,ki,"\u2211","\\sum");V(H,ie,ki,"\u2A02","\\bigotimes");V(H,ie,ki,"\u2A01","\\bigoplus");V(H,ie,ki,"\u2A00","\\bigodot");V(H,ie,ki,"\u222E","\\oint");V(H,ie,ki,"\u222F","\\oiint");V(H,ie,ki,"\u2230","\\oiiint");V(H,ie,ki,"\u2A06","\\bigsqcup");V(H,ie,ki,"\u222B","\\smallint");V(ct,ie,S0,"\u2026","\\textellipsis");V(H,ie,S0,"\u2026","\\mathellipsis");V(ct,ie,S0,"\u2026","\\ldots",!0);V(H,ie,S0,"\u2026","\\ldots",!0);V(H,ie,S0,"\u22EF","\\@cdots",!0);V(H,ie,S0,"\u22F1","\\ddots",!0);V(H,ie,De,"\u22EE","\\varvdots");V(ct,ie,De,"\u22EE","\\varvdots");V(H,ie,Wn,"\u02CA","\\acute");V(H,ie,Wn,"\u02CB","\\grave");V(H,ie,Wn,"\xA8","\\ddot");V(H,ie,Wn,"~","\\tilde");V(H,ie,Wn,"\u02C9","\\bar");V(H,ie,Wn,"\u02D8","\\breve");V(H,ie,Wn,"\u02C7","\\check");V(H,ie,Wn,"^","\\hat");V(H,ie,Wn,"\u20D7","\\vec");V(H,ie,Wn,"\u02D9","\\dot");V(H,ie,Wn,"\u02DA","\\mathring");V(H,ie,rr,"\uE131","\\@imath");V(H,ie,rr,"\uE237","\\@jmath");V(H,ie,De,"\u0131","\u0131");V(H,ie,De,"\u0237","\u0237");V(ct,ie,De,"\u0131","\\i",!0);V(ct,ie,De,"\u0237","\\j",!0);V(ct,ie,De,"\xDF","\\ss",!0);V(ct,ie,De,"\xE6","\\ae",!0);V(ct,ie,De,"\u0153","\\oe",!0);V(ct,ie,De,"\xF8","\\o",!0);V(ct,ie,De,"\xC6","\\AE",!0);V(ct,ie,De,"\u0152","\\OE",!0);V(ct,ie,De,"\xD8","\\O",!0);V(ct,ie,Wn,"\u02CA","\\'");V(ct,ie,Wn,"\u02CB","\\`");V(ct,ie,Wn,"\u02C6","\\^");V(ct,ie,Wn,"\u02DC","\\~");V(ct,ie,Wn,"\u02C9","\\=");V(ct,ie,Wn,"\u02D8","\\u");V(ct,ie,Wn,"\u02D9","\\.");V(ct,ie,Wn,"\xB8","\\c");V(ct,ie,Wn,"\u02DA","\\r");V(ct,ie,Wn,"\u02C7","\\v");V(ct,ie,Wn,"\xA8",'\\"');V(ct,ie,Wn,"\u02DD","\\H");V(ct,ie,Wn,"\u25EF","\\textcircled");JV={"--":!0,"---":!0,"``":!0,"''":!0};V(ct,ie,De,"\u2013","--",!0);V(ct,ie,De,"\u2013","\\textendash");V(ct,ie,De,"\u2014","---",!0);V(ct,ie,De,"\u2014","\\textemdash");V(ct,ie,De,"\u2018","`",!0);V(ct,ie,De,"\u2018","\\textquoteleft");V(ct,ie,De,"\u2019","'",!0);V(ct,ie,De,"\u2019","\\textquoteright");V(ct,ie,De,"\u201C","``",!0);V(ct,ie,De,"\u201C","\\textquotedblleft");V(ct,ie,De,"\u201D","''",!0);V(ct,ie,De,"\u201D","\\textquotedblright");V(H,ie,De,"\xB0","\\degree",!0);V(ct,ie,De,"\xB0","\\degree");V(ct,ie,De,"\xB0","\\textdegree",!0);V(H,ie,De,"\xA3","\\pounds");V(H,ie,De,"\xA3","\\mathsterling",!0);V(ct,ie,De,"\xA3","\\pounds");V(ct,ie,De,"\xA3","\\textsterling",!0);V(H,we,De,"\u2720","\\maltese");V(ct,we,De,"\u2720","\\maltese");bV='0123456789/@."';for(l3=0;l30)return fl(a,h,i,r,s.concat(f));if(u){var d,p;if(u==="boldsymbol"){var m=DTe(a,i,r,s,n);d=m.fontName,p=[m.fontClass]}else l?(d=rU[u].fontName,p=[u]):(d=d3(u,r.fontWeight,r.fontShape),p=[u,r.fontWeight,r.fontShape]);if(_3(a,d,i).metrics)return fl(a,d,i,r,s.concat(p));if(JV.hasOwnProperty(a)&&d.slice(0,10)==="Typewriter"){for(var g=[],y=0;y{if(bh(t.classes)!==bh(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;if(t.classes.length===1){var r=t.classes[0];if(r==="mbin"||r==="mord")return!1}for(var n in t.style)if(t.style.hasOwnProperty(n)&&t.style[n]!==e.style[n])return!1;for(var i in e.style)if(e.style.hasOwnProperty(i)&&t.style[i]!==e.style[i])return!1;return!0},"canCombine"),NTe=o(t=>{for(var e=0;er&&(r=s.height),s.depth>n&&(n=s.depth),s.maxFontSize>i&&(i=s.maxFontSize)}e.height=r,e.depth=n,e.maxFontSize=i},"sizeElementFromChildren"),Ss=o(function(e,r,n,i){var a=new fd(e,r,n,i);return cA(a),a},"makeSpan"),eU=o((t,e,r,n)=>new fd(t,e,r,n),"makeSvgSpan"),MTe=o(function(e,r,n){var i=Ss([e],[],r);return i.height=Math.max(n||r.fontMetrics().defaultRuleThickness,r.minRuleThickness),i.style.borderBottomWidth=St(i.height),i.maxFontSize=1,i},"makeLineSpan"),ITe=o(function(e,r,n,i){var a=new Ky(e,r,n,i);return cA(a),a},"makeAnchor"),tU=o(function(e){var r=new hd(e);return cA(r),r},"makeFragment"),OTe=o(function(e,r){return e instanceof hd?Ss([],[e],r):e},"wrapFragment"),PTe=o(function(e){if(e.positionType==="individualShift"){for(var r=e.children,n=[r[0]],i=-r[0].shift-r[0].elem.depth,a=i,s=1;s{var r=Ss(["mspace"],[],e),n=ii(t,e);return r.style.marginRight=St(n),r},"makeGlue"),d3=o(function(e,r,n){var i="";switch(e){case"amsrm":i="AMS";break;case"textrm":i="Main";break;case"textsf":i="SansSerif";break;case"texttt":i="Typewriter";break;default:i=e}var a;return r==="textbf"&&n==="textit"?a="BoldItalic":r==="textbf"?a="Bold":r==="textit"?a="Italic":a="Regular",i+"-"+a},"retrieveTextFontName"),rU={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},nU={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},$Te=o(function(e,r){var[n,i,a]=nU[e],s=new Zl(n),l=new dl([s],{width:St(i),height:St(a),style:"width:"+St(i),viewBox:"0 0 "+1e3*i+" "+1e3*a,preserveAspectRatio:"xMinYMin"}),u=eU(["overlay"],[l],r);return u.height=a,u.style.height=St(a),u.style.width=St(i),u},"staticSvg"),$e={fontMap:rU,makeSymbol:fl,mathsym:_Te,makeSpan:Ss,makeSvgSpan:eU,makeLineSpan:MTe,makeAnchor:ITe,makeFragment:tU,wrapFragment:OTe,makeVList:BTe,makeOrd:LTe,makeGlue:FTe,staticSvg:$Te,svgData:nU,tryCombineChars:NTe},ni={number:3,unit:"mu"},ud={number:4,unit:"mu"},uu={number:5,unit:"mu"},zTe={mord:{mop:ni,mbin:ud,mrel:uu,minner:ni},mop:{mord:ni,mop:ni,mrel:uu,minner:ni},mbin:{mord:ud,mop:ud,mopen:ud,minner:ud},mrel:{mord:uu,mop:uu,mopen:uu,minner:uu},mopen:{},mclose:{mop:ni,mbin:ud,mrel:uu,minner:ni},mpunct:{mord:ni,mop:ni,mrel:uu,mopen:ni,mclose:ni,mpunct:ni,minner:ni},minner:{mord:ni,mop:ni,mbin:ud,mrel:uu,mopen:ni,mpunct:ni,minner:ni}},GTe={mord:{mop:ni},mop:{mord:ni,mop:ni},mbin:{},mrel:{},mopen:{},mclose:{mop:ni},mpunct:{},minner:{mop:ni}},iU={},w3={},k3={};o(Mt,"defineFunction");o(dd,"defineFunctionBuilders");E3=o(function(e){return e.type==="ordgroup"&&e.body.length===1?e.body[0]:e},"normalizeArgument"),gi=o(function(e){return e.type==="ordgroup"?e.body:[e]},"ordargument"),du=$e.makeSpan,VTe=["leftmost","mbin","mopen","mrel","mop","mpunct"],UTe=["rightmost","mrel","mclose","mpunct"],HTe={display:nr.DISPLAY,text:nr.TEXT,script:nr.SCRIPT,scriptscript:nr.SCRIPTSCRIPT},qTe={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},Ii=o(function(e,r,n,i){i===void 0&&(i=[null,null]);for(var a=[],s=0;s{var v=y.classes[0],x=g.classes[0];v==="mbin"&&er.contains(UTe,x)?y.classes[0]="mord":x==="mbin"&&er.contains(VTe,v)&&(g.classes[0]="mord")},{node:d},p,m),kV(a,(g,y)=>{var v=J7(y),x=J7(g),b=v&&x?g.hasClass("mtight")?GTe[v][x]:zTe[v][x]:null;if(b)return $e.makeGlue(b,h)},{node:d},p,m),a},"buildExpression"),kV=o(function t(e,r,n,i,a){i&&e.push(i);for(var s=0;sp=>{e.splice(d+1,0,p),s++})(s)}i&&e.pop()},"traverseNonSpaceNodes"),aU=o(function(e){return e instanceof hd||e instanceof Ky||e instanceof fd&&e.hasClass("enclosing")?e:null},"checkPartialGroup"),WTe=o(function t(e,r){var n=aU(e);if(n){var i=n.children;if(i.length){if(r==="right")return t(i[i.length-1],"right");if(r==="left")return t(i[0],"left")}}return e},"getOutermostNode"),J7=o(function(e,r){return e?(r&&(e=WTe(e,r)),qTe[e.classes[0]]||null):null},"getTypeOfDomTree"),Zy=o(function(e,r){var n=["nulldelimiter"].concat(e.baseSizingClasses());return du(r.concat(n))},"makeNullDelimiter"),Hr=o(function(e,r,n){if(!e)return du();if(w3[e.type]){var i=w3[e.type](e,r);if(n&&r.size!==n.size){i=du(r.sizingClasses(n),[i],r);var a=r.sizeMultiplier/n.sizeMultiplier;i.height*=a,i.depth*=a}return i}else throw new gt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(p3,"buildHTMLUnbreakable");o(eA,"buildHTML");o(sU,"newDocumentFragment");es=class{static{o(this,"MathNode")}constructor(e,r,n){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=r||[],this.classes=n||[]}setAttribute(e,r){this.attributes[e]=r}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var r in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,r)&&e.setAttribute(r,this.attributes[r]);this.classes.length>0&&(e.className=bh(this.classes));for(var n=0;n0&&(e+=' class ="'+er.escape(bh(this.classes))+'"'),e+=">";for(var n=0;n",e}toText(){return this.children.map(e=>e.toText()).join("")}},_o=class{static{o(this,"TextNode")}constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return er.escape(this.toText())}toText(){return this.text}},tA=class{static{o(this,"SpaceNode")}constructor(e){this.width=void 0,this.character=void 0,this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",St(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},mt={MathNode:es,TextNode:_o,SpaceNode:tA,newDocumentFragment:sU},Lo=o(function(e,r,n){return Nn[r][e]&&Nn[r][e].replace&&e.charCodeAt(0)!==55349&&!(JV.hasOwnProperty(e)&&n&&(n.fontFamily&&n.fontFamily.slice(4,6)==="tt"||n.font&&n.font.slice(4,6)==="tt"))&&(e=Nn[r][e].replace),new mt.TextNode(e)},"makeText"),uA=o(function(e){return e.length===1?e[0]:new mt.MathNode("mrow",e)},"makeRow"),hA=o(function(e,r){if(r.fontFamily==="texttt")return"monospace";if(r.fontFamily==="textsf")return r.fontShape==="textit"&&r.fontWeight==="textbf"?"sans-serif-bold-italic":r.fontShape==="textit"?"sans-serif-italic":r.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(r.fontShape==="textit"&&r.fontWeight==="textbf")return"bold-italic";if(r.fontShape==="textit")return"italic";if(r.fontWeight==="textbf")return"bold";var n=r.font;if(!n||n==="mathnormal")return null;var i=e.mode;if(n==="mathit")return"italic";if(n==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(n==="mathbf")return"bold";if(n==="mathbb")return"double-struck";if(n==="mathsfit")return"sans-serif-italic";if(n==="mathfrak")return"fraktur";if(n==="mathscr"||n==="mathcal")return"script";if(n==="mathsf")return"sans-serif";if(n==="mathtt")return"monospace";var a=e.text;if(er.contains(["\\imath","\\jmath"],a))return null;Nn[i][a]&&Nn[i][a].replace&&(a=Nn[i][a].replace);var s=$e.fontMap[n].fontName;return lA(a,s,i)?$e.fontMap[n].variant:null},"getVariant");o($7,"isNumberPunctuation");As=o(function(e,r,n){if(e.length===1){var i=wn(e[0],r);return n&&i instanceof es&&i.type==="mo"&&(i.setAttribute("lspace","0em"),i.setAttribute("rspace","0em")),[i]}for(var a=[],s,l=0;l=1&&(s.type==="mn"||$7(s))){var h=u.children[0];h instanceof es&&h.type==="mn"&&(h.children=[...s.children,...h.children],a.pop())}else if(s.type==="mi"&&s.children.length===1){var f=s.children[0];if(f instanceof _o&&f.text==="\u0338"&&(u.type==="mo"||u.type==="mi"||u.type==="mn")){var d=u.children[0];d instanceof _o&&d.text.length>0&&(d.text=d.text.slice(0,1)+"\u0338"+d.text.slice(1),a.pop())}}}a.push(u),s=u}return a},"buildExpression"),Th=o(function(e,r,n){return uA(As(e,r,n))},"buildExpressionRow"),wn=o(function(e,r){if(!e)return new mt.MathNode("mrow");if(k3[e.type]){var n=k3[e.type](e,r);return n}else throw new gt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(EV,"buildMathML");oU=o(function(e){return new b3({style:e.displayMode?nr.DISPLAY:nr.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},"optionsFromSettings"),lU=o(function(e,r){if(r.displayMode){var n=["katex-display"];r.leqno&&n.push("leqno"),r.fleqn&&n.push("fleqn"),e=$e.makeSpan(n,[e])}return e},"displayWrap"),YTe=o(function(e,r,n){var i=oU(n),a;if(n.output==="mathml")return EV(e,r,i,n.displayMode,!0);if(n.output==="html"){var s=eA(e,i);a=$e.makeSpan(["katex"],[s])}else{var l=EV(e,r,i,n.displayMode,!1),u=eA(e,i);a=$e.makeSpan(["katex"],[l,u])}return lU(a,n)},"buildTree"),XTe=o(function(e,r,n){var i=oU(n),a=eA(e,i),s=$e.makeSpan(["katex"],[a]);return lU(s,n)},"buildHTMLTree"),jTe={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},KTe=o(function(e){var r=new mt.MathNode("mo",[new mt.TextNode(jTe[e.replace(/^\\/,"")])]);return r.setAttribute("stretchy","true"),r},"mathMLnode"),QTe={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},ZTe=o(function(e){return e.type==="ordgroup"?e.body.length:1},"groupLength"),JTe=o(function(e,r){function n(){var l=4e5,u=e.label.slice(1);if(er.contains(["widehat","widecheck","widetilde","utilde"],u)){var h=e,f=ZTe(h.base),d,p,m;if(f>5)u==="widehat"||u==="widecheck"?(d=420,l=2364,m=.42,p=u+"4"):(d=312,l=2340,m=.34,p="tilde4");else{var g=[1,1,2,2,3,3][f];u==="widehat"||u==="widecheck"?(l=[0,1062,2364,2364,2364][g],d=[0,239,300,360,420][g],m=[0,.24,.3,.3,.36,.42][g],p=u+g):(l=[0,600,1033,2339,2340][g],d=[0,260,286,306,312][g],m=[0,.26,.286,.3,.306,.34][g],p="tilde"+g)}var y=new Zl(p),v=new dl([y],{width:"100%",height:St(m),viewBox:"0 0 "+l+" "+d,preserveAspectRatio:"none"});return{span:$e.makeSvgSpan([],[v],r),minWidth:0,height:m}}else{var x=[],b=QTe[u],[T,S,w]=b,k=w/1e3,A=T.length,C,R;if(A===1){var I=b[3];C=["hide-tail"],R=[I]}else if(A===2)C=["halfarrow-left","halfarrow-right"],R=["xMinYMin","xMaxYMin"];else if(A===3)C=["brace-left","brace-center","brace-right"],R=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support + `+A+" children.");for(var L=0;L0&&(i.style.minWidth=St(a)),i},"svgSpan"),ewe=o(function(e,r,n,i,a){var s,l=e.height+e.depth+n+i;if(/fbox|color|angl/.test(r)){if(s=$e.makeSpan(["stretchy",r],[],a),r==="fbox"){var u=a.color&&a.getColor();u&&(s.style.borderColor=u)}}else{var h=[];/^[bx]cancel$/.test(r)&&h.push(new Qy({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(r)&&h.push(new Qy({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var f=new dl(h,{width:"100%",height:St(l)});s=$e.makeSvgSpan([],[f],a)}return s.height=l,s.style.height=St(l),s},"encloseSpan"),pu={encloseSpan:ewe,mathMLnode:KTe,svgSpan:JTe};o(Tr,"assertNodeType");o(fA,"assertSymbolNodeType");o(D3,"checkSymbolNodeType");dA=o((t,e)=>{var r,n,i;t&&t.type==="supsub"?(n=Tr(t.base,"accent"),r=n.base,t.base=r,i=ETe(Hr(t,e)),t.base=n):(n=Tr(t,"accent"),r=n.base);var a=Hr(r,e.havingCrampedStyle()),s=n.isShifty&&er.isCharacterBox(r),l=0;if(s){var u=er.getBaseElem(r),h=Hr(u,e.havingCrampedStyle());l=xV(h).skew}var f=n.label==="\\c",d=f?a.height+a.depth:Math.min(a.height,e.fontMetrics().xHeight),p;if(n.isStretchy)p=pu.svgSpan(n,e),p=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"elem",elem:p,wrapperClasses:["svg-align"],wrapperStyle:l>0?{width:"calc(100% - "+St(2*l)+")",marginLeft:St(2*l)}:void 0}]},e);else{var m,g;n.label==="\\vec"?(m=$e.staticSvg("vec",e),g=$e.svgData.vec[1]):(m=$e.makeOrd({mode:n.mode,text:n.label},e,"textord"),m=xV(m),m.italic=0,g=m.width,f&&(d+=m.depth)),p=$e.makeSpan(["accent-body"],[m]);var y=n.label==="\\textcircled";y&&(p.classes.push("accent-full"),d=a.height);var v=l;y||(v-=g/2),p.style.left=St(v),n.label==="\\textcircled"&&(p.style.top=".2em"),p=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:-d},{type:"elem",elem:p}]},e)}var x=$e.makeSpan(["mord","accent"],[p],e);return i?(i.children[0]=x,i.height=Math.max(x.height,i.height),i.classes[0]="mord",i):x},"htmlBuilder$a"),cU=o((t,e)=>{var r=t.isStretchy?pu.mathMLnode(t.label):new mt.MathNode("mo",[Lo(t.label,t.mode)]),n=new mt.MathNode("mover",[wn(t.base,e),r]);return n.setAttribute("accent","true"),n},"mathmlBuilder$9"),twe=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(t=>"\\"+t).join("|"));Mt({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:o((t,e)=>{var r=E3(e[0]),n=!twe.test(t.funcName),i=!n||t.funcName==="\\widehat"||t.funcName==="\\widetilde"||t.funcName==="\\widecheck";return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:n,isShifty:i,base:r}},"handler"),htmlBuilder:dA,mathmlBuilder:cU});Mt({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:o((t,e)=>{var r=e[0],n=t.parser.mode;return n==="math"&&(t.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+t.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},"handler"),htmlBuilder:dA,mathmlBuilder:cU});Mt({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"accentUnder",mode:r.mode,label:n,base:i}},"handler"),htmlBuilder:o((t,e)=>{var r=Hr(t.base,e),n=pu.svgSpan(t,e),i=t.label==="\\utilde"?.12:0,a=$e.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:i},{type:"elem",elem:r}]},e);return $e.makeSpan(["mord","accentunder"],[a],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=pu.mathMLnode(t.label),n=new mt.MathNode("munder",[wn(t.base,e),r]);return n.setAttribute("accentunder","true"),n},"mathmlBuilder")});m3=o(t=>{var e=new mt.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e},"paddedNode");Mt({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n,funcName:i}=t;return{type:"xArrow",mode:n.mode,label:i,body:e[0],below:r[0]}},htmlBuilder(t,e){var r=e.style,n=e.havingStyle(r.sup()),i=$e.wrapFragment(Hr(t.body,n,e),e),a=t.label.slice(0,2)==="\\x"?"x":"cd";i.classes.push(a+"-arrow-pad");var s;t.below&&(n=e.havingStyle(r.sub()),s=$e.wrapFragment(Hr(t.below,n,e),e),s.classes.push(a+"-arrow-pad"));var l=pu.svgSpan(t,e),u=-e.fontMetrics().axisHeight+.5*l.height,h=-e.fontMetrics().axisHeight-.5*l.height-.111;(i.depth>.25||t.label==="\\xleftequilibrium")&&(h-=i.depth);var f;if(s){var d=-e.fontMetrics().axisHeight+s.height+.5*l.height+.111;f=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u},{type:"elem",elem:s,shift:d}]},e)}else f=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u}]},e);return f.children[0].children[0].children[1].classes.push("svg-align"),$e.makeSpan(["mrel","x-arrow"],[f],e)},mathmlBuilder(t,e){var r=pu.mathMLnode(t.label);r.setAttribute("minsize",t.label.charAt(0)==="x"?"1.75em":"3.0em");var n;if(t.body){var i=m3(wn(t.body,e));if(t.below){var a=m3(wn(t.below,e));n=new mt.MathNode("munderover",[r,a,i])}else n=new mt.MathNode("mover",[r,i])}else if(t.below){var s=m3(wn(t.below,e));n=new mt.MathNode("munder",[r,s])}else n=m3(),n=new mt.MathNode("mover",[r,n]);return n}});rwe=$e.makeSpan;o(uU,"htmlBuilder$9");o(hU,"mathmlBuilder$8");Mt({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:gi(i),isCharacterBox:er.isCharacterBox(i)}},htmlBuilder:uU,mathmlBuilder:hU});L3=o(t=>{var e=t.type==="ordgroup"&&t.body.length?t.body[0]:t;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"},"binrelClass");Mt({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(t,e){var{parser:r}=t;return{type:"mclass",mode:r.mode,mclass:L3(e[0]),body:gi(e[1]),isCharacterBox:er.isCharacterBox(e[1])}}});Mt({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(t,e){var{parser:r,funcName:n}=t,i=e[1],a=e[0],s;n!=="\\stackrel"?s=L3(i):s="mrel";var l={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:n!=="\\stackrel",body:gi(i)},u={type:"supsub",mode:a.mode,base:l,sup:n==="\\underset"?null:a,sub:n==="\\underset"?a:null};return{type:"mclass",mode:r.mode,mclass:s,body:[u],isCharacterBox:er.isCharacterBox(u)}},htmlBuilder:uU,mathmlBuilder:hU});Mt({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"pmb",mode:r.mode,mclass:L3(e[0]),body:gi(e[0])}},htmlBuilder(t,e){var r=Ii(t.body,e,!0),n=$e.makeSpan([t.mclass],r,e);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(t,e){var r=As(t.body,e),n=new mt.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});nwe={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},SV=o(()=>({type:"styling",body:[],mode:"math",style:"display"}),"newCell"),CV=o(t=>t.type==="textord"&&t.text==="@","isStartOfArrow"),iwe=o((t,e)=>(t.type==="mathord"||t.type==="atom")&&t.text===e,"isLabelEnd");o(awe,"cdArrow");o(swe,"parseCD");Mt({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:e[0]}},htmlBuilder(t,e){var r=e.havingStyle(e.style.sup()),n=$e.wrapFragment(Hr(t.label,r,e),e);return n.classes.push("cd-label-"+t.side),n.style.bottom=St(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(t,e){var r=new mt.MathNode("mrow",[wn(t.label,e)]);return r=new mt.MathNode("mpadded",[r]),r.setAttribute("width","0"),t.side==="left"&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new mt.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}});Mt({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(t,e){var{parser:r}=t;return{type:"cdlabelparent",mode:r.mode,fragment:e[0]}},htmlBuilder(t,e){var r=$e.wrapFragment(Hr(t.fragment,e),e);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(t,e){return new mt.MathNode("mrow",[wn(t.fragment,e)])}});Mt({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(t,e){for(var{parser:r}=t,n=Tr(e[0],"ordgroup"),i=n.body,a="",s=0;s=1114111)throw new gt("\\@char with invalid code point "+a);return u<=65535?h=String.fromCharCode(u):(u-=65536,h=String.fromCharCode((u>>10)+55296,(u&1023)+56320)),{type:"textord",mode:r.mode,text:h}}});fU=o((t,e)=>{var r=Ii(t.body,e.withColor(t.color),!1);return $e.makeFragment(r)},"htmlBuilder$8"),dU=o((t,e)=>{var r=As(t.body,e.withColor(t.color)),n=new mt.MathNode("mstyle",r);return n.setAttribute("mathcolor",t.color),n},"mathmlBuilder$7");Mt({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(t,e){var{parser:r}=t,n=Tr(e[0],"color-token").color,i=e[1];return{type:"color",mode:r.mode,color:n,body:gi(i)}},htmlBuilder:fU,mathmlBuilder:dU});Mt({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(t,e){var{parser:r,breakOnTokenText:n}=t,i=Tr(e[0],"color-token").color;r.gullet.macros.set("\\current@color",i);var a=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:i,body:a}},htmlBuilder:fU,mathmlBuilder:dU});Mt({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(t,e,r){var{parser:n}=t,i=n.gullet.future().text==="["?n.parseSizeGroup(!0):null,a=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:a,size:i&&Tr(i,"size").value}},htmlBuilder(t,e){var r=$e.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=St(ii(t.size,e)))),r},mathmlBuilder(t,e){var r=new mt.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",St(ii(t.size,e)))),r}});rA={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},pU=o(t=>{var e=t.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new gt("Expected a control sequence",t);return e},"checkControlSequence"),owe=o(t=>{var e=t.gullet.popToken();return e.text==="="&&(e=t.gullet.popToken(),e.text===" "&&(e=t.gullet.popToken())),e},"getRHS"),mU=o((t,e,r,n)=>{var i=t.gullet.macros.get(r.text);i==null&&(r.noexpand=!0,i={tokens:[r],numArgs:0,unexpandable:!t.gullet.isExpandable(r.text)}),t.gullet.macros.set(e,i,n)},"letCommand");Mt({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e,funcName:r}=t;e.consumeSpaces();var n=e.fetch();if(rA[n.text])return(r==="\\global"||r==="\\\\globallong")&&(n.text=rA[n.text]),Tr(e.parseFunction(),"internal");throw new gt("Invalid token after macro prefix",n)}});Mt({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=e.gullet.popToken(),i=n.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new gt("Expected a control sequence",n);for(var a=0,s,l=[[]];e.gullet.future().text!=="{";)if(n=e.gullet.popToken(),n.text==="#"){if(e.gullet.future().text==="{"){s=e.gullet.future(),l[a].push("{");break}if(n=e.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new gt('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==a+1)throw new gt('Argument number "'+n.text+'" out of order');a++,l.push([])}else{if(n.text==="EOF")throw new gt("Expected a macro definition");l[a].push(n.text)}var{tokens:u}=e.gullet.consumeArg();return s&&u.unshift(s),(r==="\\edef"||r==="\\xdef")&&(u=e.gullet.expandTokens(u),u.reverse()),e.gullet.macros.set(i,{tokens:u,numArgs:a,delimiters:l},r===rA[r]),{type:"internal",mode:e.mode}}});Mt({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=pU(e.gullet.popToken());e.gullet.consumeSpaces();var i=owe(e);return mU(e,n,i,r==="\\\\globallet"),{type:"internal",mode:e.mode}}});Mt({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=pU(e.gullet.popToken()),i=e.gullet.popToken(),a=e.gullet.popToken();return mU(e,n,a,r==="\\\\globalfuture"),e.gullet.pushToken(a),e.gullet.pushToken(i),{type:"internal",mode:e.mode}}});qy=o(function(e,r,n){var i=Nn.math[e]&&Nn.math[e].replace,a=lA(i||e,r,n);if(!a)throw new Error("Unsupported symbol "+e+" and font size "+r+".");return a},"getMetrics"),pA=o(function(e,r,n,i){var a=n.havingBaseStyle(r),s=$e.makeSpan(i.concat(a.sizingClasses(n)),[e],n),l=a.sizeMultiplier/n.sizeMultiplier;return s.height*=l,s.depth*=l,s.maxFontSize=a.sizeMultiplier,s},"styleWrap"),gU=o(function(e,r,n){var i=r.havingBaseStyle(n),a=(1-r.sizeMultiplier/i.sizeMultiplier)*r.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=St(a),e.height-=a,e.depth+=a},"centerSpan"),lwe=o(function(e,r,n,i,a,s){var l=$e.makeSymbol(e,"Main-Regular",a,i),u=pA(l,r,i,s);return n&&gU(u,i,r),u},"makeSmallDelim"),cwe=o(function(e,r,n,i){return $e.makeSymbol(e,"Size"+r+"-Regular",n,i)},"mathrmSize"),yU=o(function(e,r,n,i,a,s){var l=cwe(e,r,a,i),u=pA($e.makeSpan(["delimsizing","size"+r],[l],i),nr.TEXT,i,s);return n&&gU(u,i,nr.TEXT),u},"makeLargeDelim"),z7=o(function(e,r,n){var i;r==="Size1-Regular"?i="delim-size1":i="delim-size4";var a=$e.makeSpan(["delimsizinginner",i],[$e.makeSpan([],[$e.makeSymbol(e,r,n)])]);return{type:"elem",elem:a}},"makeGlyphSpan"),G7=o(function(e,r,n){var i=Ql["Size4-Regular"][e.charCodeAt(0)]?Ql["Size4-Regular"][e.charCodeAt(0)][4]:Ql["Size1-Regular"][e.charCodeAt(0)][4],a=new Zl("inner",yTe(e,Math.round(1e3*r))),s=new dl([a],{width:St(i),height:St(r),style:"width:"+St(i),viewBox:"0 0 "+1e3*i+" "+Math.round(1e3*r),preserveAspectRatio:"xMinYMin"}),l=$e.makeSvgSpan([],[s],n);return l.height=r,l.style.height=St(r),l.style.width=St(i),{type:"elem",elem:l}},"makeInner"),nA=.008,g3={type:"kern",size:-1*nA},uwe=["|","\\lvert","\\rvert","\\vert"],hwe=["\\|","\\lVert","\\rVert","\\Vert"],vU=o(function(e,r,n,i,a,s){var l,u,h,f,d="",p=0;l=h=f=e,u=null;var m="Size1-Regular";e==="\\uparrow"?h=f="\u23D0":e==="\\Uparrow"?h=f="\u2016":e==="\\downarrow"?l=h="\u23D0":e==="\\Downarrow"?l=h="\u2016":e==="\\updownarrow"?(l="\\uparrow",h="\u23D0",f="\\downarrow"):e==="\\Updownarrow"?(l="\\Uparrow",h="\u2016",f="\\Downarrow"):er.contains(uwe,e)?(h="\u2223",d="vert",p=333):er.contains(hwe,e)?(h="\u2225",d="doublevert",p=556):e==="["||e==="\\lbrack"?(l="\u23A1",h="\u23A2",f="\u23A3",m="Size4-Regular",d="lbrack",p=667):e==="]"||e==="\\rbrack"?(l="\u23A4",h="\u23A5",f="\u23A6",m="Size4-Regular",d="rbrack",p=667):e==="\\lfloor"||e==="\u230A"?(h=l="\u23A2",f="\u23A3",m="Size4-Regular",d="lfloor",p=667):e==="\\lceil"||e==="\u2308"?(l="\u23A1",h=f="\u23A2",m="Size4-Regular",d="lceil",p=667):e==="\\rfloor"||e==="\u230B"?(h=l="\u23A5",f="\u23A6",m="Size4-Regular",d="rfloor",p=667):e==="\\rceil"||e==="\u2309"?(l="\u23A4",h=f="\u23A5",m="Size4-Regular",d="rceil",p=667):e==="("||e==="\\lparen"?(l="\u239B",h="\u239C",f="\u239D",m="Size4-Regular",d="lparen",p=875):e===")"||e==="\\rparen"?(l="\u239E",h="\u239F",f="\u23A0",m="Size4-Regular",d="rparen",p=875):e==="\\{"||e==="\\lbrace"?(l="\u23A7",u="\u23A8",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(l="\u23AB",u="\u23AC",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(l="\u23A7",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(l="\u23AB",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(l="\u23A7",f="\u23AD",h="\u23AA",m="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(l="\u23AB",f="\u23A9",h="\u23AA",m="Size4-Regular");var g=qy(l,m,a),y=g.height+g.depth,v=qy(h,m,a),x=v.height+v.depth,b=qy(f,m,a),T=b.height+b.depth,S=0,w=1;if(u!==null){var k=qy(u,m,a);S=k.height+k.depth,w=2}var A=y+T+S,C=Math.max(0,Math.ceil((r-A)/(w*x))),R=A+C*w*x,I=i.fontMetrics().axisHeight;n&&(I*=i.sizeMultiplier);var L=R/2-I,E=[];if(d.length>0){var D=R-y-T,_=Math.round(R*1e3),O=vTe(d,Math.round(D*1e3)),M=new Zl(d,O),P=(p/1e3).toFixed(3)+"em",B=(_/1e3).toFixed(3)+"em",F=new dl([M],{width:P,height:B,viewBox:"0 0 "+p+" "+_}),G=$e.makeSvgSpan([],[F],i);G.height=_/1e3,G.style.width=P,G.style.height=B,E.push({type:"elem",elem:G})}else{if(E.push(z7(f,m,a)),E.push(g3),u===null){var $=R-y-T+2*nA;E.push(G7(h,$,i))}else{var U=(R-y-T-S)/2+2*nA;E.push(G7(h,U,i)),E.push(g3),E.push(z7(u,m,a)),E.push(g3),E.push(G7(h,U,i))}E.push(g3),E.push(z7(l,m,a))}var j=i.havingBaseStyle(nr.TEXT),te=$e.makeVList({positionType:"bottom",positionData:L,children:E},j);return pA($e.makeSpan(["delimsizing","mult"],[te],j),nr.TEXT,i,s)},"makeStackedDelim"),V7=80,U7=.08,H7=o(function(e,r,n,i,a){var s=gTe(e,i,n),l=new Zl(e,s),u=new dl([l],{width:"400em",height:St(r),viewBox:"0 0 400000 "+n,preserveAspectRatio:"xMinYMin slice"});return $e.makeSvgSpan(["hide-tail"],[u],a)},"sqrtSvg"),fwe=o(function(e,r){var n=r.havingBaseSizing(),i=wU("\\surd",e*n.sizeMultiplier,TU,n),a=n.sizeMultiplier,s=Math.max(0,r.minRuleThickness-r.fontMetrics().sqrtRuleThickness),l,u=0,h=0,f=0,d;return i.type==="small"?(f=1e3+1e3*s+V7,e<1?a=1:e<1.4&&(a=.7),u=(1+s+U7)/a,h=(1+s)/a,l=H7("sqrtMain",u,f,s,r),l.style.minWidth="0.853em",d=.833/a):i.type==="large"?(f=(1e3+V7)*Yy[i.size],h=(Yy[i.size]+s)/a,u=(Yy[i.size]+s+U7)/a,l=H7("sqrtSize"+i.size,u,f,s,r),l.style.minWidth="1.02em",d=1/a):(u=e+s+U7,h=e+s,f=Math.floor(1e3*e+s)+V7,l=H7("sqrtTall",u,f,s,r),l.style.minWidth="0.742em",d=1.056),l.height=h,l.style.height=St(u),{span:l,advanceWidth:d,ruleWidth:(r.fontMetrics().sqrtRuleThickness+s)*a}},"makeSqrtImage"),xU=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],dwe=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"],bU=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],Yy=[0,1.2,1.8,2.4,3],pwe=o(function(e,r,n,i,a){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),er.contains(xU,e)||er.contains(bU,e))return yU(e,r,!1,n,i,a);if(er.contains(dwe,e))return vU(e,Yy[r],!1,n,i,a);throw new gt("Illegal delimiter: '"+e+"'")},"makeSizedDelim"),mwe=[{type:"small",style:nr.SCRIPTSCRIPT},{type:"small",style:nr.SCRIPT},{type:"small",style:nr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],gwe=[{type:"small",style:nr.SCRIPTSCRIPT},{type:"small",style:nr.SCRIPT},{type:"small",style:nr.TEXT},{type:"stack"}],TU=[{type:"small",style:nr.SCRIPTSCRIPT},{type:"small",style:nr.SCRIPT},{type:"small",style:nr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],ywe=o(function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},"delimTypeToFont"),wU=o(function(e,r,n,i){for(var a=Math.min(2,3-i.style.size),s=a;sr)return n[s]}return n[n.length-1]},"traverseSequence"),kU=o(function(e,r,n,i,a,s){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var l;er.contains(bU,e)?l=mwe:er.contains(xU,e)?l=TU:l=gwe;var u=wU(e,r,l,i);return u.type==="small"?lwe(e,u.style,n,i,a,s):u.type==="large"?yU(e,u.size,n,i,a,s):vU(e,r,n,i,a,s)},"makeCustomSizedDelim"),vwe=o(function(e,r,n,i,a,s){var l=i.fontMetrics().axisHeight*i.sizeMultiplier,u=901,h=5/i.fontMetrics().ptPerEm,f=Math.max(r-l,n+l),d=Math.max(f/500*u,2*f-h);return kU(e,d,!0,i,a,s)},"makeLeftRightDelim"),fu={sqrtImage:fwe,sizedDelim:pwe,sizeToMaxHeight:Yy,customSizedDelim:kU,leftRightDelim:vwe},AV={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},xwe=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];o(R3,"checkDelimiter");Mt({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:o((t,e)=>{var r=R3(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:AV[t.funcName].size,mclass:AV[t.funcName].mclass,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>t.delim==="."?$e.makeSpan([t.mclass]):fu.sizedDelim(t.delim,t.size,e,t.mode,[t.mclass]),"htmlBuilder"),mathmlBuilder:o(t=>{var e=[];t.delim!=="."&&e.push(Lo(t.delim,t.mode));var r=new mt.MathNode("mo",e);t.mclass==="mopen"||t.mclass==="mclose"?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=St(fu.sizeToMaxHeight[t.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r},"mathmlBuilder")});o(_V,"assertParsed");Mt({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=t.parser.gullet.macros.get("\\current@color");if(r&&typeof r!="string")throw new gt("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:R3(e[0],t).text,color:r}},"handler")});Mt({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=R3(e[0],t),n=t.parser;++n.leftrightDepth;var i=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var a=Tr(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:i,left:r.text,right:a.delim,rightColor:a.color}},"handler"),htmlBuilder:o((t,e)=>{_V(t);for(var r=Ii(t.body,e,!0,["mopen","mclose"]),n=0,i=0,a=!1,s=0;s{_V(t);var r=As(t.body,e);if(t.left!=="."){var n=new mt.MathNode("mo",[Lo(t.left,t.mode)]);n.setAttribute("fence","true"),r.unshift(n)}if(t.right!=="."){var i=new mt.MathNode("mo",[Lo(t.right,t.mode)]);i.setAttribute("fence","true"),t.rightColor&&i.setAttribute("mathcolor",t.rightColor),r.push(i)}return uA(r)},"mathmlBuilder")});Mt({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=R3(e[0],t);if(!t.parser.leftrightDepth)throw new gt("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>{var r;if(t.delim===".")r=Zy(e,[]);else{r=fu.sizedDelim(t.delim,1,e,t.mode,[]);var n={delim:t.delim,options:e};r.isMiddle=n}return r},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=t.delim==="\\vert"||t.delim==="|"?Lo("|","text"):Lo(t.delim,t.mode),n=new mt.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n},"mathmlBuilder")});mA=o((t,e)=>{var r=$e.wrapFragment(Hr(t.body,e),e),n=t.label.slice(1),i=e.sizeMultiplier,a,s=0,l=er.isCharacterBox(t.body);if(n==="sout")a=$e.makeSpan(["stretchy","sout"]),a.height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else if(n==="phase"){var u=ii({number:.6,unit:"pt"},e),h=ii({number:.35,unit:"ex"},e),f=e.havingBaseSizing();i=i/f.sizeMultiplier;var d=r.height+r.depth+u+h;r.style.paddingLeft=St(d/2+u);var p=Math.floor(1e3*d*i),m=pTe(p),g=new dl([new Zl("phase",m)],{width:"400em",height:St(p/1e3),viewBox:"0 0 400000 "+p,preserveAspectRatio:"xMinYMin slice"});a=$e.makeSvgSpan(["hide-tail"],[g],e),a.style.height=St(d),s=r.depth+u+h}else{/cancel/.test(n)?l||r.classes.push("cancel-pad"):n==="angl"?r.classes.push("anglpad"):r.classes.push("boxpad");var y=0,v=0,x=0;/box/.test(n)?(x=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),y=e.fontMetrics().fboxsep+(n==="colorbox"?0:x),v=y):n==="angl"?(x=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),y=4*x,v=Math.max(0,.25-r.depth)):(y=l?.2:0,v=y),a=pu.encloseSpan(r,n,y,v,e),/fbox|boxed|fcolorbox/.test(n)?(a.style.borderStyle="solid",a.style.borderWidth=St(x)):n==="angl"&&x!==.049&&(a.style.borderTopWidth=St(x),a.style.borderRightWidth=St(x)),s=r.depth+v,t.backgroundColor&&(a.style.backgroundColor=t.backgroundColor,t.borderColor&&(a.style.borderColor=t.borderColor))}var b;if(t.backgroundColor)b=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:s},{type:"elem",elem:r,shift:0}]},e);else{var T=/cancel|phase/.test(n)?["svg-align"]:[];b=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:a,shift:s,wrapperClasses:T}]},e)}return/cancel/.test(n)&&(b.height=r.height,b.depth=r.depth),/cancel/.test(n)&&!l?$e.makeSpan(["mord","cancel-lap"],[b],e):$e.makeSpan(["mord"],[b],e)},"htmlBuilder$7"),gA=o((t,e)=>{var r=0,n=new mt.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[wn(t.body,e)]);switch(t.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),t.label==="\\fcolorbox"){var i=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);n.setAttribute("style","border: "+i+"em solid "+String(t.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return t.backgroundColor&&n.setAttribute("mathbackground",t.backgroundColor),n},"mathmlBuilder$6");Mt({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=Tr(e[0],"color-token").color,s=e[1];return{type:"enclose",mode:n.mode,label:i,backgroundColor:a,body:s}},htmlBuilder:mA,mathmlBuilder:gA});Mt({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=Tr(e[0],"color-token").color,s=Tr(e[1],"color-token").color,l=e[2];return{type:"enclose",mode:n.mode,label:i,backgroundColor:s,borderColor:a,body:l}},htmlBuilder:mA,mathmlBuilder:gA});Mt({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\fbox",body:e[0]}}});Mt({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"enclose",mode:r.mode,label:n,body:i}},htmlBuilder:mA,mathmlBuilder:gA});Mt({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\angl",body:e[0]}}});EU={};o(Jl,"defineEnvironment");SU={};o(ce,"defineMacro");o(DV,"getHLines");N3=o(t=>{var e=t.parser.settings;if(!e.displayMode)throw new gt("{"+t.envName+"} can be used only in display mode.")},"validateAmsEnvironmentContext");o(yA,"getAutoTag");o(wh,"parseArray");o(vA,"dCellStyle");ec=o(function(e,r){var n,i,a=e.body.length,s=e.hLinesBeforeRow,l=0,u=new Array(a),h=[],f=Math.max(r.fontMetrics().arrayRuleWidth,r.minRuleThickness),d=1/r.fontMetrics().ptPerEm,p=5*d;if(e.colSeparationType&&e.colSeparationType==="small"){var m=r.havingStyle(nr.SCRIPT).sizeMultiplier;p=.2778*(m/r.sizeMultiplier)}var g=e.colSeparationType==="CD"?ii({number:3,unit:"ex"},r):12*d,y=3*d,v=e.arraystretch*g,x=.7*v,b=.3*v,T=0;function S(q){for(var Ve=0;Ve0&&(T+=.25),h.push({pos:T,isDashed:q[Ve]})}for(o(S,"setHLinePos"),S(s[0]),n=0;n0&&(L+=b,Aq))for(n=0;n=l)){var J=void 0;(i>0||e.hskipBeforeAndAfter)&&(J=er.deflt(U.pregap,p),J!==0&&(O=$e.makeSpan(["arraycolsep"],[]),O.style.width=St(J),_.push(O)));var ue=[];for(n=0;n0){for(var K=$e.makeLineSpan("hline",r,f),ae=$e.makeLineSpan("hdashline",r,f),Q=[{type:"elem",elem:u,shift:0}];h.length>0;){var de=h.pop(),ne=de.pos-E;de.isDashed?Q.push({type:"elem",elem:ae,shift:ne}):Q.push({type:"elem",elem:K,shift:ne})}u=$e.makeVList({positionType:"individualShift",children:Q},r)}if(P.length===0)return $e.makeSpan(["mord"],[u],r);var Te=$e.makeVList({positionType:"individualShift",children:P},r);return Te=$e.makeSpan(["tag"],[Te],r),$e.makeFragment([u,Te])},"htmlBuilder"),bwe={c:"center ",l:"left ",r:"right "},tc=o(function(e,r){for(var n=[],i=new mt.MathNode("mtd",[],["mtr-glue"]),a=new mt.MathNode("mtd",[],["mml-eqn-num"]),s=0;s0){var g=e.cols,y="",v=!1,x=0,b=g.length;g[0].type==="separator"&&(p+="top ",x=1),g[g.length-1].type==="separator"&&(p+="bottom ",b-=1);for(var T=x;T0?"left ":"",p+=C[C.length-1].length>0?"right ":"";for(var R=1;R-1?"alignat":"align",a=e.envName==="split",s=wh(e.parser,{cols:n,addJot:!0,autoTag:a?void 0:yA(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:a?2:void 0,leqno:e.parser.settings.leqno},"display"),l,u=0,h={type:"ordgroup",mode:e.mode,body:[]};if(r[0]&&r[0].type==="ordgroup"){for(var f="",d=0;d0&&m&&(v=1),n[g]={type:"align",align:y,pregap:v,postgap:0}}return s.colSeparationType=m?"align":"alignat",s},"alignedHandler");Jl({type:"array",names:["array","darray"],props:{numArgs:1},handler(t,e){var r=D3(e[0]),n=r?[e[0]]:Tr(e[0],"ordgroup").body,i=n.map(function(s){var l=fA(s),u=l.text;if("lcr".indexOf(u)!==-1)return{type:"align",align:u};if(u==="|")return{type:"separator",separator:"|"};if(u===":")return{type:"separator",separator:":"};throw new gt("Unknown column alignment: "+u,s)}),a={cols:i,hskipBeforeAndAfter:!0,maxNumCols:i.length};return wh(t.parser,a,vA(t.envName))},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName.replace("*","")],r="c",n={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if(t.envName.charAt(t.envName.length-1)==="*"){var i=t.parser;if(i.consumeSpaces(),i.fetch().text==="["){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,"lcr".indexOf(r)===-1)throw new gt("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),n.cols=[{type:"align",align:r}]}}var a=wh(t.parser,n,vA(t.envName)),s=Math.max(0,...a.body.map(l=>l.length));return a.cols=new Array(s).fill({type:"align",align:r}),e?{type:"leftright",mode:t.mode,body:[a],left:e[0],right:e[1],rightColor:void 0}:a},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(t){var e={arraystretch:.5},r=wh(t.parser,e,"script");return r.colSeparationType="small",r},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["subarray"],props:{numArgs:1},handler(t,e){var r=D3(e[0]),n=r?[e[0]]:Tr(e[0],"ordgroup").body,i=n.map(function(s){var l=fA(s),u=l.text;if("lc".indexOf(u)!==-1)return{type:"align",align:u};throw new gt("Unknown column alignment: "+u,s)});if(i.length>1)throw new gt("{subarray} can contain only one column");var a={cols:i,hskipBeforeAndAfter:!1,arraystretch:.5};if(a=wh(t.parser,a,"script"),a.body.length>0&&a.body[0].length>1)throw new gt("{subarray} can contain only one column");return a},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(t){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},r=wh(t.parser,e,vA(t.envName));return{type:"leftright",mode:t.mode,body:[r],left:t.envName.indexOf("r")>-1?".":"\\{",right:t.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:CU,htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(t){er.contains(["gather","gather*"],t.envName)&&N3(t);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:yA(t.envName),emptySingleRow:!0,leqno:t.parser.settings.leqno};return wh(t.parser,e,"display")},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:CU,htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(t){N3(t);var e={autoTag:yA(t.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:t.parser.settings.leqno};return wh(t.parser,e,"display")},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["CD"],props:{numArgs:0},handler(t){return N3(t),swe(t.parser)},htmlBuilder:ec,mathmlBuilder:tc});ce("\\nonumber","\\gdef\\@eqnsw{0}");ce("\\notag","\\nonumber");Mt({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(t,e){throw new gt(t.funcName+" valid only within array environment")}});LV=EU;Mt({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];if(i.type!=="ordgroup")throw new gt("Invalid environment name",i);for(var a="",s=0;s{var r=t.font,n=e.withFont(r);return Hr(t.body,n)},"htmlBuilder$5"),_U=o((t,e)=>{var r=t.font,n=e.withFont(r);return wn(t.body,n)},"mathmlBuilder$4"),RV={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};Mt({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=E3(e[0]),a=n;return a in RV&&(a=RV[a]),{type:"font",mode:r.mode,font:a.slice(1),body:i}},"handler"),htmlBuilder:AU,mathmlBuilder:_U});Mt({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r}=t,n=e[0],i=er.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:L3(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:i}},"handler")});Mt({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n,breakOnTokenText:i}=t,{mode:a}=r,s=r.parseExpression(!0,i),l="math"+n.slice(1);return{type:"font",mode:a,font:l,body:{type:"ordgroup",mode:r.mode,body:s}}},"handler"),htmlBuilder:AU,mathmlBuilder:_U});DU=o((t,e)=>{var r=e;return t==="display"?r=r.id>=nr.SCRIPT.id?r.text():nr.DISPLAY:t==="text"&&r.size===nr.DISPLAY.size?r=nr.TEXT:t==="script"?r=nr.SCRIPT:t==="scriptscript"&&(r=nr.SCRIPTSCRIPT),r},"adjustStyle"),xA=o((t,e)=>{var r=DU(t.size,e.style),n=r.fracNum(),i=r.fracDen(),a;a=e.havingStyle(n);var s=Hr(t.numer,a,e);if(t.continued){var l=8.5/e.fontMetrics().ptPerEm,u=3.5/e.fontMetrics().ptPerEm;s.height=s.height0?g=3*p:g=7*p,y=e.fontMetrics().denom1):(d>0?(m=e.fontMetrics().num2,g=p):(m=e.fontMetrics().num3,g=3*p),y=e.fontMetrics().denom2);var v;if(f){var b=e.fontMetrics().axisHeight;m-s.depth-(b+.5*d){var r=new mt.MathNode("mfrac",[wn(t.numer,e),wn(t.denom,e)]);if(!t.hasBarLine)r.setAttribute("linethickness","0px");else if(t.barSize){var n=ii(t.barSize,e);r.setAttribute("linethickness",St(n))}var i=DU(t.size,e.style);if(i.size!==e.style.size){r=new mt.MathNode("mstyle",[r]);var a=i.size===nr.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",a),r.setAttribute("scriptlevel","0")}if(t.leftDelim!=null||t.rightDelim!=null){var s=[];if(t.leftDelim!=null){var l=new mt.MathNode("mo",[new mt.TextNode(t.leftDelim.replace("\\",""))]);l.setAttribute("fence","true"),s.push(l)}if(s.push(r),t.rightDelim!=null){var u=new mt.MathNode("mo",[new mt.TextNode(t.rightDelim.replace("\\",""))]);u.setAttribute("fence","true"),s.push(u)}return uA(s)}return r},"mathmlBuilder$3");Mt({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1],s,l=null,u=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":s=!0;break;case"\\\\atopfrac":s=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":s=!1,l="(",u=")";break;case"\\\\bracefrac":s=!1,l="\\{",u="\\}";break;case"\\\\brackfrac":s=!1,l="[",u="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text";break}return{type:"genfrac",mode:r.mode,continued:!1,numer:i,denom:a,hasBarLine:s,leftDelim:l,rightDelim:u,size:h,barSize:null}},"handler"),htmlBuilder:xA,mathmlBuilder:bA});Mt({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:i,denom:a,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}},"handler")});Mt({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(t){var{parser:e,funcName:r,token:n}=t,i;switch(r){case"\\over":i="\\frac";break;case"\\choose":i="\\binom";break;case"\\atop":i="\\\\atopfrac";break;case"\\brace":i="\\\\bracefrac";break;case"\\brack":i="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:i,token:n}}});NV=["display","text","script","scriptscript"],MV=o(function(e){var r=null;return e.length>0&&(r=e,r=r==="."?null:r),r},"delimFromValue");Mt({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(t,e){var{parser:r}=t,n=e[4],i=e[5],a=E3(e[0]),s=a.type==="atom"&&a.family==="open"?MV(a.text):null,l=E3(e[1]),u=l.type==="atom"&&l.family==="close"?MV(l.text):null,h=Tr(e[2],"size"),f,d=null;h.isBlank?f=!0:(d=h.value,f=d.number>0);var p="auto",m=e[3];if(m.type==="ordgroup"){if(m.body.length>0){var g=Tr(m.body[0],"textord");p=NV[Number(g.text)]}}else m=Tr(m,"textord"),p=NV[Number(m.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:f,barSize:d,leftDelim:s,rightDelim:u,size:p}},htmlBuilder:xA,mathmlBuilder:bA});Mt({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(t,e){var{parser:r,funcName:n,token:i}=t;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Tr(e[0],"size").value,token:i}}});Mt({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=J5e(Tr(e[1],"infix").size),s=e[2],l=a.number>0;return{type:"genfrac",mode:r.mode,numer:i,denom:s,continued:!1,hasBarLine:l,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},"handler"),htmlBuilder:xA,mathmlBuilder:bA});LU=o((t,e)=>{var r=e.style,n,i;t.type==="supsub"?(n=t.sup?Hr(t.sup,e.havingStyle(r.sup()),e):Hr(t.sub,e.havingStyle(r.sub()),e),i=Tr(t.base,"horizBrace")):i=Tr(t,"horizBrace");var a=Hr(i.base,e.havingBaseStyle(nr.DISPLAY)),s=pu.svgSpan(i,e),l;if(i.isOver?(l=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:s}]},e),l.children[0].children[0].children[1].classes.push("svg-align")):(l=$e.makeVList({positionType:"bottom",positionData:a.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:a}]},e),l.children[0].children[0].children[0].classes.push("svg-align")),n){var u=$e.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e);i.isOver?l=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:u},{type:"kern",size:.2},{type:"elem",elem:n}]},e):l=$e.makeVList({positionType:"bottom",positionData:u.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:u}]},e)}return $e.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e)},"htmlBuilder$3"),Twe=o((t,e)=>{var r=pu.mathMLnode(t.label);return new mt.MathNode(t.isOver?"mover":"munder",[wn(t.base,e),r])},"mathmlBuilder$2");Mt({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:e[0]}},htmlBuilder:LU,mathmlBuilder:Twe});Mt({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[1],i=Tr(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:i})?{type:"href",mode:r.mode,href:i,body:gi(n)}:r.formatUnsupportedCmd("\\href")},"handler"),htmlBuilder:o((t,e)=>{var r=Ii(t.body,e,!1);return $e.makeAnchor(t.href,[],r,e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=Th(t.body,e);return r instanceof es||(r=new es("mrow",[r])),r.setAttribute("href",t.href),r},"mathmlBuilder")});Mt({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=Tr(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var i=[],a=0;a{var{parser:r,funcName:n,token:i}=t,a=Tr(e[0],"raw").string,s=e[1];r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var l,u={};switch(n){case"\\htmlClass":u.class=a,l={command:"\\htmlClass",class:a};break;case"\\htmlId":u.id=a,l={command:"\\htmlId",id:a};break;case"\\htmlStyle":u.style=a,l={command:"\\htmlStyle",style:a};break;case"\\htmlData":{for(var h=a.split(","),f=0;f{var r=Ii(t.body,e,!1),n=["enclosing"];t.attributes.class&&n.push(...t.attributes.class.trim().split(/\s+/));var i=$e.makeSpan(n,r,e);for(var a in t.attributes)a!=="class"&&t.attributes.hasOwnProperty(a)&&i.setAttribute(a,t.attributes[a]);return i},"htmlBuilder"),mathmlBuilder:o((t,e)=>Th(t.body,e),"mathmlBuilder")});Mt({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"htmlmathml",mode:r.mode,html:gi(e[0]),mathml:gi(e[1])}},"handler"),htmlBuilder:o((t,e)=>{var r=Ii(t.html,e,!1);return $e.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>Th(t.mathml,e),"mathmlBuilder")});q7=o(function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!r)throw new gt("Invalid size: '"+e+"' in \\includegraphics");var n={number:+(r[1]+r[2]),unit:r[3]};if(!jV(n))throw new gt("Invalid unit: '"+n.unit+"' in \\includegraphics.");return n},"sizeData");Mt({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:o((t,e,r)=>{var{parser:n}=t,i={number:0,unit:"em"},a={number:.9,unit:"em"},s={number:0,unit:"em"},l="";if(r[0])for(var u=Tr(r[0],"raw").string,h=u.split(","),f=0;f{var r=ii(t.height,e),n=0;t.totalheight.number>0&&(n=ii(t.totalheight,e)-r);var i=0;t.width.number>0&&(i=ii(t.width,e));var a={height:St(r+n)};i>0&&(a.width=St(i)),n>0&&(a.verticalAlign=St(-n));var s=new Q7(t.src,t.alt,a);return s.height=r,s.depth=n,s},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new mt.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var n=ii(t.height,e),i=0;if(t.totalheight.number>0&&(i=ii(t.totalheight,e)-n,r.setAttribute("valign",St(-i))),r.setAttribute("height",St(n+i)),t.width.number>0){var a=ii(t.width,e);r.setAttribute("width",St(a))}return r.setAttribute("src",t.src),r},"mathmlBuilder")});Mt({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=Tr(e[0],"size");if(r.settings.strict){var a=n[1]==="m",s=i.value.unit==="mu";a?(s||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, "+("not "+i.value.unit+" units")),r.mode!=="math"&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):s&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:i.value}},htmlBuilder(t,e){return $e.makeGlue(t.dimension,e)},mathmlBuilder(t,e){var r=ii(t.dimension,e);return new mt.SpaceNode(r)}});Mt({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:i}},"handler"),htmlBuilder:o((t,e)=>{var r;t.alignment==="clap"?(r=$e.makeSpan([],[Hr(t.body,e)]),r=$e.makeSpan(["inner"],[r],e)):r=$e.makeSpan(["inner"],[Hr(t.body,e)]);var n=$e.makeSpan(["fix"],[]),i=$e.makeSpan([t.alignment],[r,n],e),a=$e.makeSpan(["strut"]);return a.style.height=St(i.height+i.depth),i.depth&&(a.style.verticalAlign=St(-i.depth)),i.children.unshift(a),i=$e.makeSpan(["thinbox"],[i],e),$e.makeSpan(["mord","vbox"],[i],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new mt.MathNode("mpadded",[wn(t.body,e)]);if(t.alignment!=="rlap"){var n=t.alignment==="llap"?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r},"mathmlBuilder")});Mt({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){var{funcName:r,parser:n}=t,i=n.mode;n.switchMode("math");var a=r==="\\("?"\\)":"$",s=n.parseExpression(!1,a);return n.expect(a),n.switchMode(i),{type:"styling",mode:n.mode,style:"text",body:s}}});Mt({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){throw new gt("Mismatched "+t.funcName)}});IV=o((t,e)=>{switch(e.style.size){case nr.DISPLAY.size:return t.display;case nr.TEXT.size:return t.text;case nr.SCRIPT.size:return t.script;case nr.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}},"chooseMathStyle");Mt({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"mathchoice",mode:r.mode,display:gi(e[0]),text:gi(e[1]),script:gi(e[2]),scriptscript:gi(e[3])}},"handler"),htmlBuilder:o((t,e)=>{var r=IV(t,e),n=Ii(r,e,!1);return $e.makeFragment(n)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=IV(t,e);return Th(r,e)},"mathmlBuilder")});RU=o((t,e,r,n,i,a,s)=>{t=$e.makeSpan([],[t]);var l=r&&er.isCharacterBox(r),u,h;if(e){var f=Hr(e,n.havingStyle(i.sup()),n);h={elem:f,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-f.depth)}}if(r){var d=Hr(r,n.havingStyle(i.sub()),n);u={elem:d,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-d.height)}}var p;if(h&&u){var m=n.fontMetrics().bigOpSpacing5+u.elem.height+u.elem.depth+u.kern+t.depth+s;p=$e.makeVList({positionType:"bottom",positionData:m,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:St(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:St(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(u){var g=t.height-s;p=$e.makeVList({positionType:"top",positionData:g,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:St(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t}]},n)}else if(h){var y=t.depth+s;p=$e.makeVList({positionType:"bottom",positionData:y,children:[{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:St(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else return t;var v=[p];if(u&&a!==0&&!l){var x=$e.makeSpan(["mspace"],[],n);x.style.marginRight=St(a),v.unshift(x)}return $e.makeSpan(["mop","op-limits"],v,n)},"assembleSupSub"),NU=["\\smallint"],C0=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=Tr(t.base,"op"),i=!0):a=Tr(t,"op");var s=e.style,l=!1;s.size===nr.DISPLAY.size&&a.symbol&&!er.contains(NU,a.name)&&(l=!0);var u;if(a.symbol){var h=l?"Size2-Regular":"Size1-Regular",f="";if((a.name==="\\oiint"||a.name==="\\oiiint")&&(f=a.name.slice(1),a.name=f==="oiint"?"\\iint":"\\iiint"),u=$e.makeSymbol(a.name,h,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),f.length>0){var d=u.italic,p=$e.staticSvg(f+"Size"+(l?"2":"1"),e);u=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:u,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),a.name="\\"+f,u.classes.unshift("mop"),u.italic=d}}else if(a.body){var m=Ii(a.body,e,!0);m.length===1&&m[0]instanceof Cs?(u=m[0],u.classes[0]="mop"):u=$e.makeSpan(["mop"],m,e)}else{for(var g=[],y=1;y{var r;if(t.symbol)r=new es("mo",[Lo(t.name,t.mode)]),er.contains(NU,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new es("mo",As(t.body,e));else{r=new es("mi",[new _o(t.name.slice(1))]);var n=new es("mo",[Lo("\u2061","text")]);t.parentIsSupSub?r=new es("mrow",[r,n]):r=sU([r,n])}return r},"mathmlBuilder$1"),wwe={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};Mt({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=n;return i.length===1&&(i=wwe[i]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:i}},"handler"),htmlBuilder:C0,mathmlBuilder:Jy});Mt({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:gi(n)}},"handler"),htmlBuilder:C0,mathmlBuilder:Jy});kwe={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};Mt({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:C0,mathmlBuilder:Jy});Mt({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:C0,mathmlBuilder:Jy});Mt({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t,n=r;return n.length===1&&(n=kwe[n]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:C0,mathmlBuilder:Jy});MU=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=Tr(t.base,"operatorname"),i=!0):a=Tr(t,"operatorname");var s;if(a.body.length>0){for(var l=a.body.map(d=>{var p=d.text;return typeof p=="string"?{type:"textord",mode:d.mode,text:p}:d}),u=Ii(l,e.withFont("mathrm"),!0),h=0;h{for(var r=As(t.body,e.withFont("mathrm")),n=!0,i=0;if.toText()).join("");r=[new mt.TextNode(l)]}var u=new mt.MathNode("mi",r);u.setAttribute("mathvariant","normal");var h=new mt.MathNode("mo",[Lo("\u2061","text")]);return t.parentIsSupSub?new mt.MathNode("mrow",[u,h]):mt.newDocumentFragment([u,h])},"mathmlBuilder");Mt({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"operatorname",mode:r.mode,body:gi(i),alwaysHandleSupSub:n==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},"handler"),htmlBuilder:MU,mathmlBuilder:Ewe});ce("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");dd({type:"ordgroup",htmlBuilder(t,e){return t.semisimple?$e.makeFragment(Ii(t.body,e,!1)):$e.makeSpan(["mord"],Ii(t.body,e,!0),e)},mathmlBuilder(t,e){return Th(t.body,e,!0)}});Mt({type:"overline",names:["\\overline"],props:{numArgs:1},handler(t,e){var{parser:r}=t,n=e[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(t,e){var r=Hr(t.body,e.havingCrampedStyle()),n=$e.makeLineSpan("overline-line",e),i=e.fontMetrics().defaultRuleThickness,a=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*i},{type:"elem",elem:n},{type:"kern",size:i}]},e);return $e.makeSpan(["mord","overline"],[a],e)},mathmlBuilder(t,e){var r=new mt.MathNode("mo",[new mt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new mt.MathNode("mover",[wn(t.body,e),r]);return n.setAttribute("accent","true"),n}});Mt({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"phantom",mode:r.mode,body:gi(n)}},"handler"),htmlBuilder:o((t,e)=>{var r=Ii(t.body,e.withPhantom(),!1);return $e.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=As(t.body,e);return new mt.MathNode("mphantom",r)},"mathmlBuilder")});Mt({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"hphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=$e.makeSpan([],[Hr(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var n=0;n{var r=As(gi(t.body),e),n=new mt.MathNode("mphantom",r),i=new mt.MathNode("mpadded",[n]);return i.setAttribute("height","0px"),i.setAttribute("depth","0px"),i},"mathmlBuilder")});Mt({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"vphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=$e.makeSpan(["inner"],[Hr(t.body,e.withPhantom())]),n=$e.makeSpan(["fix"],[]);return $e.makeSpan(["mord","rlap"],[r,n],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=As(gi(t.body),e),n=new mt.MathNode("mphantom",r),i=new mt.MathNode("mpadded",[n]);return i.setAttribute("width","0px"),i},"mathmlBuilder")});Mt({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t,n=Tr(e[0],"size").value,i=e[1];return{type:"raisebox",mode:r.mode,dy:n,body:i}},htmlBuilder(t,e){var r=Hr(t.body,e),n=ii(t.dy,e);return $e.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){var r=new mt.MathNode("mpadded",[wn(t.body,e)]),n=t.dy.number+t.dy.unit;return r.setAttribute("voffset",n),r}});Mt({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(t){var{parser:e}=t;return{type:"internal",mode:e.mode}}});Mt({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(t,e,r){var{parser:n}=t,i=r[0],a=Tr(e[0],"size"),s=Tr(e[1],"size");return{type:"rule",mode:n.mode,shift:i&&Tr(i,"size").value,width:a.value,height:s.value}},htmlBuilder(t,e){var r=$e.makeSpan(["mord","rule"],[],e),n=ii(t.width,e),i=ii(t.height,e),a=t.shift?ii(t.shift,e):0;return r.style.borderRightWidth=St(n),r.style.borderTopWidth=St(i),r.style.bottom=St(a),r.width=n,r.height=i+a,r.depth=-a,r.maxFontSize=i*1.125*e.sizeMultiplier,r},mathmlBuilder(t,e){var r=ii(t.width,e),n=ii(t.height,e),i=t.shift?ii(t.shift,e):0,a=e.color&&e.getColor()||"black",s=new mt.MathNode("mspace");s.setAttribute("mathbackground",a),s.setAttribute("width",St(r)),s.setAttribute("height",St(n));var l=new mt.MathNode("mpadded",[s]);return i>=0?l.setAttribute("height",St(i)):(l.setAttribute("height",St(i)),l.setAttribute("depth",St(-i))),l.setAttribute("voffset",St(i)),l}});o(IU,"sizingGroup");OV=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],Swe=o((t,e)=>{var r=e.havingSize(t.size);return IU(t.body,r,e)},"htmlBuilder");Mt({type:"sizing",names:OV,props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!1,r);return{type:"sizing",mode:i.mode,size:OV.indexOf(n)+1,body:a}},"handler"),htmlBuilder:Swe,mathmlBuilder:o((t,e)=>{var r=e.havingSize(t.size),n=As(t.body,r),i=new mt.MathNode("mstyle",n);return i.setAttribute("mathsize",St(r.sizeMultiplier)),i},"mathmlBuilder")});Mt({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:o((t,e,r)=>{var{parser:n}=t,i=!1,a=!1,s=r[0]&&Tr(r[0],"ordgroup");if(s)for(var l="",u=0;u{var r=$e.makeSpan([],[Hr(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var n=0;n{var r=new mt.MathNode("mpadded",[wn(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r},"mathmlBuilder")});Mt({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n}=t,i=r[0],a=e[0];return{type:"sqrt",mode:n.mode,body:a,index:i}},htmlBuilder(t,e){var r=Hr(t.body,e.havingCrampedStyle());r.height===0&&(r.height=e.fontMetrics().xHeight),r=$e.wrapFragment(r,e);var n=e.fontMetrics(),i=n.defaultRuleThickness,a=i;e.style.idr.height+r.depth+s&&(s=(s+d-r.height-r.depth)/2);var p=u.height-r.height-s-h;r.style.paddingLeft=St(f);var m=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+p)},{type:"elem",elem:u},{type:"kern",size:h}]},e);if(t.index){var g=e.havingStyle(nr.SCRIPTSCRIPT),y=Hr(t.index,g,e),v=.6*(m.height-m.depth),x=$e.makeVList({positionType:"shift",positionData:-v,children:[{type:"elem",elem:y}]},e),b=$e.makeSpan(["root"],[x]);return $e.makeSpan(["mord","sqrt"],[b,m],e)}else return $e.makeSpan(["mord","sqrt"],[m],e)},mathmlBuilder(t,e){var{body:r,index:n}=t;return n?new mt.MathNode("mroot",[wn(r,e),wn(n,e)]):new mt.MathNode("msqrt",[wn(r,e)])}});PV={display:nr.DISPLAY,text:nr.TEXT,script:nr.SCRIPT,scriptscript:nr.SCRIPTSCRIPT};Mt({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t,e){var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!0,r),s=n.slice(1,n.length-5);return{type:"styling",mode:i.mode,style:s,body:a}},htmlBuilder(t,e){var r=PV[t.style],n=e.havingStyle(r).withFont("");return IU(t.body,n,e)},mathmlBuilder(t,e){var r=PV[t.style],n=e.havingStyle(r),i=As(t.body,n),a=new mt.MathNode("mstyle",i),s={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},l=s[t.style];return a.setAttribute("scriptlevel",l[0]),a.setAttribute("displaystyle",l[1]),a}});Cwe=o(function(e,r){var n=e.base;if(n)if(n.type==="op"){var i=n.limits&&(r.style.size===nr.DISPLAY.size||n.alwaysHandleSupSub);return i?C0:null}else if(n.type==="operatorname"){var a=n.alwaysHandleSupSub&&(r.style.size===nr.DISPLAY.size||n.limits);return a?MU:null}else{if(n.type==="accent")return er.isCharacterBox(n.base)?dA:null;if(n.type==="horizBrace"){var s=!e.sub;return s===n.isOver?LU:null}else return null}else return null},"htmlBuilderDelegate");dd({type:"supsub",htmlBuilder(t,e){var r=Cwe(t,e);if(r)return r(t,e);var{base:n,sup:i,sub:a}=t,s=Hr(n,e),l,u,h=e.fontMetrics(),f=0,d=0,p=n&&er.isCharacterBox(n);if(i){var m=e.havingStyle(e.style.sup());l=Hr(i,m,e),p||(f=s.height-m.fontMetrics().supDrop*m.sizeMultiplier/e.sizeMultiplier)}if(a){var g=e.havingStyle(e.style.sub());u=Hr(a,g,e),p||(d=s.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}var y;e.style===nr.DISPLAY?y=h.sup1:e.style.cramped?y=h.sup3:y=h.sup2;var v=e.sizeMultiplier,x=St(.5/h.ptPerEm/v),b=null;if(u){var T=t.base&&t.base.type==="op"&&t.base.name&&(t.base.name==="\\oiint"||t.base.name==="\\oiiint");(s instanceof Cs||T)&&(b=St(-s.italic))}var S;if(l&&u){f=Math.max(f,y,l.depth+.25*h.xHeight),d=Math.max(d,h.sub2);var w=h.defaultRuleThickness,k=4*w;if(f-l.depth-(u.height-d)0&&(f+=A,d-=A)}var C=[{type:"elem",elem:u,shift:d,marginRight:x,marginLeft:b},{type:"elem",elem:l,shift:-f,marginRight:x}];S=$e.makeVList({positionType:"individualShift",children:C},e)}else if(u){d=Math.max(d,h.sub1,u.height-.8*h.xHeight);var R=[{type:"elem",elem:u,marginLeft:b,marginRight:x}];S=$e.makeVList({positionType:"shift",positionData:d,children:R},e)}else if(l)f=Math.max(f,y,l.depth+.25*h.xHeight),S=$e.makeVList({positionType:"shift",positionData:-f,children:[{type:"elem",elem:l,marginRight:x}]},e);else throw new Error("supsub must have either sup or sub.");var I=J7(s,"right")||"mord";return $e.makeSpan([I],[s,$e.makeSpan(["msupsub"],[S])],e)},mathmlBuilder(t,e){var r=!1,n,i;t.base&&t.base.type==="horizBrace"&&(i=!!t.sup,i===t.base.isOver&&(r=!0,n=t.base.isOver)),t.base&&(t.base.type==="op"||t.base.type==="operatorname")&&(t.base.parentIsSupSub=!0);var a=[wn(t.base,e)];t.sub&&a.push(wn(t.sub,e)),t.sup&&a.push(wn(t.sup,e));var s;if(r)s=n?"mover":"munder";else if(t.sub)if(t.sup){var h=t.base;h&&h.type==="op"&&h.limits&&e.style===nr.DISPLAY||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(e.style===nr.DISPLAY||h.limits)?s="munderover":s="msubsup"}else{var u=t.base;u&&u.type==="op"&&u.limits&&(e.style===nr.DISPLAY||u.alwaysHandleSupSub)||u&&u.type==="operatorname"&&u.alwaysHandleSupSub&&(u.limits||e.style===nr.DISPLAY)?s="munder":s="msub"}else{var l=t.base;l&&l.type==="op"&&l.limits&&(e.style===nr.DISPLAY||l.alwaysHandleSupSub)||l&&l.type==="operatorname"&&l.alwaysHandleSupSub&&(l.limits||e.style===nr.DISPLAY)?s="mover":s="msup"}return new mt.MathNode(s,a)}});dd({type:"atom",htmlBuilder(t,e){return $e.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder(t,e){var r=new mt.MathNode("mo",[Lo(t.text,t.mode)]);if(t.family==="bin"){var n=hA(t,e);n==="bold-italic"&&r.setAttribute("mathvariant",n)}else t.family==="punct"?r.setAttribute("separator","true"):(t.family==="open"||t.family==="close")&&r.setAttribute("stretchy","false");return r}});OU={mi:"italic",mn:"normal",mtext:"normal"};dd({type:"mathord",htmlBuilder(t,e){return $e.makeOrd(t,e,"mathord")},mathmlBuilder(t,e){var r=new mt.MathNode("mi",[Lo(t.text,t.mode,e)]),n=hA(t,e)||"italic";return n!==OU[r.type]&&r.setAttribute("mathvariant",n),r}});dd({type:"textord",htmlBuilder(t,e){return $e.makeOrd(t,e,"textord")},mathmlBuilder(t,e){var r=Lo(t.text,t.mode,e),n=hA(t,e)||"normal",i;return t.mode==="text"?i=new mt.MathNode("mtext",[r]):/[0-9]/.test(t.text)?i=new mt.MathNode("mn",[r]):t.text==="\\prime"?i=new mt.MathNode("mo",[r]):i=new mt.MathNode("mi",[r]),n!==OU[i.type]&&i.setAttribute("mathvariant",n),i}});W7={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Y7={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};dd({type:"spacing",htmlBuilder(t,e){if(Y7.hasOwnProperty(t.text)){var r=Y7[t.text].className||"";if(t.mode==="text"){var n=$e.makeOrd(t,e,"textord");return n.classes.push(r),n}else return $e.makeSpan(["mspace",r],[$e.mathsym(t.text,t.mode,e)],e)}else{if(W7.hasOwnProperty(t.text))return $e.makeSpan(["mspace",W7[t.text]],[],e);throw new gt('Unknown type of space "'+t.text+'"')}},mathmlBuilder(t,e){var r;if(Y7.hasOwnProperty(t.text))r=new mt.MathNode("mtext",[new mt.TextNode("\xA0")]);else{if(W7.hasOwnProperty(t.text))return new mt.MathNode("mspace");throw new gt('Unknown type of space "'+t.text+'"')}return r}});BV=o(()=>{var t=new mt.MathNode("mtd",[]);return t.setAttribute("width","50%"),t},"pad");dd({type:"tag",mathmlBuilder(t,e){var r=new mt.MathNode("mtable",[new mt.MathNode("mtr",[BV(),new mt.MathNode("mtd",[Th(t.body,e)]),BV(),new mt.MathNode("mtd",[Th(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});FV={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},$V={"\\textbf":"textbf","\\textmd":"textmd"},Awe={"\\textit":"textit","\\textup":"textup"},zV=o((t,e)=>{var r=t.font;if(r){if(FV[r])return e.withTextFontFamily(FV[r]);if($V[r])return e.withTextFontWeight($V[r]);if(r==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(Awe[r])},"optionsWithFont");Mt({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"text",mode:r.mode,body:gi(i),font:n}},htmlBuilder(t,e){var r=zV(t,e),n=Ii(t.body,r,!0);return $e.makeSpan(["mord","text"],n,r)},mathmlBuilder(t,e){var r=zV(t,e);return Th(t.body,r)}});Mt({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"underline",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Hr(t.body,e),n=$e.makeLineSpan("underline-line",e),i=e.fontMetrics().defaultRuleThickness,a=$e.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:i},{type:"elem",elem:n},{type:"kern",size:3*i},{type:"elem",elem:r}]},e);return $e.makeSpan(["mord","underline"],[a],e)},mathmlBuilder(t,e){var r=new mt.MathNode("mo",[new mt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new mt.MathNode("munder",[wn(t.body,e),r]);return n.setAttribute("accentunder","true"),n}});Mt({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"vcenter",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Hr(t.body,e),n=e.fontMetrics().axisHeight,i=.5*(r.height-n-(r.depth+n));return $e.makeVList({positionType:"shift",positionData:i,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){return new mt.MathNode("mpadded",[wn(t.body,e)],["vcenter"])}});Mt({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(t,e,r){throw new gt("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(t,e){for(var r=GV(t),n=[],i=e.havingStyle(e.style.text()),a=0;at.body.replace(/ /g,t.star?"\u2423":"\xA0"),"makeVerb"),xh=iU,PU=`[ \r + ]`,_we="\\\\[a-zA-Z@]+",Dwe="\\\\[^\uD800-\uDFFF]",Lwe="("+_we+")"+PU+"*",Rwe=`\\\\( +|[ \r ]+ +?)[ \r ]*`,iA="[\u0300-\u036F]",Nwe=new RegExp(iA+"+$"),Mwe="("+PU+"+)|"+(Rwe+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(iA+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(iA+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+Lwe)+("|"+Dwe+")"),S3=class{static{o(this,"Lexer")}constructor(e,r){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=r,this.tokenRegex=new RegExp(Mwe,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,r){this.catcodes[e]=r}lex(){var e=this.input,r=this.tokenRegex.lastIndex;if(r===e.length)return new Do("EOF",new to(this,r,r));var n=this.tokenRegex.exec(e);if(n===null||n.index!==r)throw new gt("Unexpected character: '"+e[r]+"'",new Do(e[r],new to(this,r,r+1)));var i=n[6]||n[3]||(n[2]?"\\ ":" ");if(this.catcodes[i]===14){var a=e.indexOf(` +`,this.tokenRegex.lastIndex);return a===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=a+1,this.lex()}return new Do(i,new to(this,r,this.tokenRegex.lastIndex))}},aA=class{static{o(this,"Namespace")}constructor(e,r){e===void 0&&(e={}),r===void 0&&(r={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=r,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new gt("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var r in e)e.hasOwnProperty(r)&&(e[r]==null?delete this.current[r]:this.current[r]=e[r])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,r,n){if(n===void 0&&(n=!1),n){for(var i=0;i0&&(this.undefStack[this.undefStack.length-1][e]=r)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}r==null?delete this.current[e]:this.current[e]=r}},Iwe=SU;ce("\\noexpand",function(t){var e=t.popToken();return t.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});ce("\\expandafter",function(t){var e=t.popToken();return t.expandOnce(!0),{tokens:[e],numArgs:0}});ce("\\@firstoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[0],numArgs:0}});ce("\\@secondoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[1],numArgs:0}});ce("\\@ifnextchar",function(t){var e=t.consumeArgs(3);t.consumeSpaces();var r=t.future();return e[0].length===1&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});ce("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");ce("\\TextOrMath",function(t){var e=t.consumeArgs(2);return t.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});VV={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};ce("\\char",function(t){var e=t.popToken(),r,n="";if(e.text==="'")r=8,e=t.popToken();else if(e.text==='"')r=16,e=t.popToken();else if(e.text==="`")if(e=t.popToken(),e.text[0]==="\\")n=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new gt("\\char` missing argument");n=e.text.charCodeAt(0)}else r=10;if(r){if(n=VV[e.text],n==null||n>=r)throw new gt("Invalid base-"+r+" digit "+e.text);for(var i;(i=VV[t.future().text])!=null&&i{var i=t.consumeArg().tokens;if(i.length!==1)throw new gt("\\newcommand's first argument must be a macro name");var a=i[0].text,s=t.isDefined(a);if(s&&!e)throw new gt("\\newcommand{"+a+"} attempting to redefine "+(a+"; use \\renewcommand"));if(!s&&!r)throw new gt("\\renewcommand{"+a+"} when command "+a+" does not yet exist; use \\newcommand");var l=0;if(i=t.consumeArg().tokens,i.length===1&&i[0].text==="["){for(var u="",h=t.expandNextToken();h.text!=="]"&&h.text!=="EOF";)u+=h.text,h=t.expandNextToken();if(!u.match(/^\s*[0-9]+\s*$/))throw new gt("Invalid number of arguments: "+u);l=parseInt(u),i=t.consumeArg().tokens}return s&&n||t.macros.set(a,{tokens:i,numArgs:l}),""},"newcommand");ce("\\newcommand",t=>TA(t,!1,!0,!1));ce("\\renewcommand",t=>TA(t,!0,!1,!1));ce("\\providecommand",t=>TA(t,!0,!0,!0));ce("\\message",t=>{var e=t.consumeArgs(1)[0];return console.log(e.reverse().map(r=>r.text).join("")),""});ce("\\errmessage",t=>{var e=t.consumeArgs(1)[0];return console.error(e.reverse().map(r=>r.text).join("")),""});ce("\\show",t=>{var e=t.popToken(),r=e.text;return console.log(e,t.macros.get(r),xh[r],Nn.math[r],Nn.text[r]),""});ce("\\bgroup","{");ce("\\egroup","}");ce("~","\\nobreakspace");ce("\\lq","`");ce("\\rq","'");ce("\\aa","\\r a");ce("\\AA","\\r A");ce("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");ce("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");ce("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");ce("\u212C","\\mathscr{B}");ce("\u2130","\\mathscr{E}");ce("\u2131","\\mathscr{F}");ce("\u210B","\\mathscr{H}");ce("\u2110","\\mathscr{I}");ce("\u2112","\\mathscr{L}");ce("\u2133","\\mathscr{M}");ce("\u211B","\\mathscr{R}");ce("\u212D","\\mathfrak{C}");ce("\u210C","\\mathfrak{H}");ce("\u2128","\\mathfrak{Z}");ce("\\Bbbk","\\Bbb{k}");ce("\xB7","\\cdotp");ce("\\llap","\\mathllap{\\textrm{#1}}");ce("\\rlap","\\mathrlap{\\textrm{#1}}");ce("\\clap","\\mathclap{\\textrm{#1}}");ce("\\mathstrut","\\vphantom{(}");ce("\\underbar","\\underline{\\text{#1}}");ce("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');ce("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");ce("\\ne","\\neq");ce("\u2260","\\neq");ce("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");ce("\u2209","\\notin");ce("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");ce("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");ce("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");ce("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");ce("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");ce("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");ce("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");ce("\u27C2","\\perp");ce("\u203C","\\mathclose{!\\mkern-0.8mu!}");ce("\u220C","\\notni");ce("\u231C","\\ulcorner");ce("\u231D","\\urcorner");ce("\u231E","\\llcorner");ce("\u231F","\\lrcorner");ce("\xA9","\\copyright");ce("\xAE","\\textregistered");ce("\uFE0F","\\textregistered");ce("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');ce("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');ce("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');ce("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');ce("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");ce("\u22EE","\\vdots");ce("\\varGamma","\\mathit{\\Gamma}");ce("\\varDelta","\\mathit{\\Delta}");ce("\\varTheta","\\mathit{\\Theta}");ce("\\varLambda","\\mathit{\\Lambda}");ce("\\varXi","\\mathit{\\Xi}");ce("\\varPi","\\mathit{\\Pi}");ce("\\varSigma","\\mathit{\\Sigma}");ce("\\varUpsilon","\\mathit{\\Upsilon}");ce("\\varPhi","\\mathit{\\Phi}");ce("\\varPsi","\\mathit{\\Psi}");ce("\\varOmega","\\mathit{\\Omega}");ce("\\substack","\\begin{subarray}{c}#1\\end{subarray}");ce("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");ce("\\boxed","\\fbox{$\\displaystyle{#1}$}");ce("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");ce("\\implies","\\DOTSB\\;\\Longrightarrow\\;");ce("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");ce("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");ce("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");UV={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};ce("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in UV?e=UV[r]:(r.slice(0,4)==="\\not"||r in Nn.math&&er.contains(["bin","rel"],Nn.math[r].group))&&(e="\\dotsb"),e});wA={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};ce("\\dotso",function(t){var e=t.future().text;return e in wA?"\\ldots\\,":"\\ldots"});ce("\\dotsc",function(t){var e=t.future().text;return e in wA&&e!==","?"\\ldots\\,":"\\ldots"});ce("\\cdots",function(t){var e=t.future().text;return e in wA?"\\@cdots\\,":"\\@cdots"});ce("\\dotsb","\\cdots");ce("\\dotsm","\\cdots");ce("\\dotsi","\\!\\cdots");ce("\\dotsx","\\ldots\\,");ce("\\DOTSI","\\relax");ce("\\DOTSB","\\relax");ce("\\DOTSX","\\relax");ce("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");ce("\\,","\\tmspace+{3mu}{.1667em}");ce("\\thinspace","\\,");ce("\\>","\\mskip{4mu}");ce("\\:","\\tmspace+{4mu}{.2222em}");ce("\\medspace","\\:");ce("\\;","\\tmspace+{5mu}{.2777em}");ce("\\thickspace","\\;");ce("\\!","\\tmspace-{3mu}{.1667em}");ce("\\negthinspace","\\!");ce("\\negmedspace","\\tmspace-{4mu}{.2222em}");ce("\\negthickspace","\\tmspace-{5mu}{.277em}");ce("\\enspace","\\kern.5em ");ce("\\enskip","\\hskip.5em\\relax");ce("\\quad","\\hskip1em\\relax");ce("\\qquad","\\hskip2em\\relax");ce("\\tag","\\@ifstar\\tag@literal\\tag@paren");ce("\\tag@paren","\\tag@literal{({#1})}");ce("\\tag@literal",t=>{if(t.macros.get("\\df@tag"))throw new gt("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});ce("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");ce("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");ce("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");ce("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");ce("\\newline","\\\\\\relax");ce("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");BU=St(Ql["Main-Regular"][84][1]-.7*Ql["Main-Regular"][65][1]);ce("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+BU+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");ce("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+BU+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");ce("\\hspace","\\@ifstar\\@hspacer\\@hspace");ce("\\@hspace","\\hskip #1\\relax");ce("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");ce("\\ordinarycolon",":");ce("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");ce("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');ce("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');ce("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');ce("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');ce("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');ce("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');ce("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');ce("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');ce("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');ce("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');ce("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');ce("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');ce("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');ce("\u2237","\\dblcolon");ce("\u2239","\\eqcolon");ce("\u2254","\\coloneqq");ce("\u2255","\\eqqcolon");ce("\u2A74","\\Coloneqq");ce("\\ratio","\\vcentcolon");ce("\\coloncolon","\\dblcolon");ce("\\colonequals","\\coloneqq");ce("\\coloncolonequals","\\Coloneqq");ce("\\equalscolon","\\eqqcolon");ce("\\equalscoloncolon","\\Eqqcolon");ce("\\colonminus","\\coloneq");ce("\\coloncolonminus","\\Coloneq");ce("\\minuscolon","\\eqcolon");ce("\\minuscoloncolon","\\Eqcolon");ce("\\coloncolonapprox","\\Colonapprox");ce("\\coloncolonsim","\\Colonsim");ce("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");ce("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");ce("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");ce("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");ce("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");ce("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");ce("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");ce("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");ce("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");ce("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");ce("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");ce("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");ce("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");ce("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");ce("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");ce("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");ce("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");ce("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");ce("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");ce("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");ce("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");ce("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");ce("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");ce("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");ce("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");ce("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");ce("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");ce("\\imath","\\html@mathml{\\@imath}{\u0131}");ce("\\jmath","\\html@mathml{\\@jmath}{\u0237}");ce("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");ce("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");ce("\u27E6","\\llbracket");ce("\u27E7","\\rrbracket");ce("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");ce("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");ce("\u2983","\\lBrace");ce("\u2984","\\rBrace");ce("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");ce("\u29B5","\\minuso");ce("\\darr","\\downarrow");ce("\\dArr","\\Downarrow");ce("\\Darr","\\Downarrow");ce("\\lang","\\langle");ce("\\rang","\\rangle");ce("\\uarr","\\uparrow");ce("\\uArr","\\Uparrow");ce("\\Uarr","\\Uparrow");ce("\\N","\\mathbb{N}");ce("\\R","\\mathbb{R}");ce("\\Z","\\mathbb{Z}");ce("\\alef","\\aleph");ce("\\alefsym","\\aleph");ce("\\Alpha","\\mathrm{A}");ce("\\Beta","\\mathrm{B}");ce("\\bull","\\bullet");ce("\\Chi","\\mathrm{X}");ce("\\clubs","\\clubsuit");ce("\\cnums","\\mathbb{C}");ce("\\Complex","\\mathbb{C}");ce("\\Dagger","\\ddagger");ce("\\diamonds","\\diamondsuit");ce("\\empty","\\emptyset");ce("\\Epsilon","\\mathrm{E}");ce("\\Eta","\\mathrm{H}");ce("\\exist","\\exists");ce("\\harr","\\leftrightarrow");ce("\\hArr","\\Leftrightarrow");ce("\\Harr","\\Leftrightarrow");ce("\\hearts","\\heartsuit");ce("\\image","\\Im");ce("\\infin","\\infty");ce("\\Iota","\\mathrm{I}");ce("\\isin","\\in");ce("\\Kappa","\\mathrm{K}");ce("\\larr","\\leftarrow");ce("\\lArr","\\Leftarrow");ce("\\Larr","\\Leftarrow");ce("\\lrarr","\\leftrightarrow");ce("\\lrArr","\\Leftrightarrow");ce("\\Lrarr","\\Leftrightarrow");ce("\\Mu","\\mathrm{M}");ce("\\natnums","\\mathbb{N}");ce("\\Nu","\\mathrm{N}");ce("\\Omicron","\\mathrm{O}");ce("\\plusmn","\\pm");ce("\\rarr","\\rightarrow");ce("\\rArr","\\Rightarrow");ce("\\Rarr","\\Rightarrow");ce("\\real","\\Re");ce("\\reals","\\mathbb{R}");ce("\\Reals","\\mathbb{R}");ce("\\Rho","\\mathrm{P}");ce("\\sdot","\\cdot");ce("\\sect","\\S");ce("\\spades","\\spadesuit");ce("\\sub","\\subset");ce("\\sube","\\subseteq");ce("\\supe","\\supseteq");ce("\\Tau","\\mathrm{T}");ce("\\thetasym","\\vartheta");ce("\\weierp","\\wp");ce("\\Zeta","\\mathrm{Z}");ce("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");ce("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");ce("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");ce("\\bra","\\mathinner{\\langle{#1}|}");ce("\\ket","\\mathinner{|{#1}\\rangle}");ce("\\braket","\\mathinner{\\langle{#1}\\rangle}");ce("\\Bra","\\left\\langle#1\\right|");ce("\\Ket","\\left|#1\\right\\rangle");FU=o(t=>e=>{var r=e.consumeArg().tokens,n=e.consumeArg().tokens,i=e.consumeArg().tokens,a=e.consumeArg().tokens,s=e.macros.get("|"),l=e.macros.get("\\|");e.macros.beginGroup();var u=o(d=>p=>{t&&(p.macros.set("|",s),i.length&&p.macros.set("\\|",l));var m=d;if(!d&&i.length){var g=p.future();g.text==="|"&&(p.popToken(),m=!0)}return{tokens:m?i:n,numArgs:0}},"midMacro");e.macros.set("|",u(!1)),i.length&&e.macros.set("\\|",u(!0));var h=e.consumeArg().tokens,f=e.expandTokens([...a,...h,...r]);return e.macros.endGroup(),{tokens:f.reverse(),numArgs:0}},"braketHelper");ce("\\bra@ket",FU(!1));ce("\\bra@set",FU(!0));ce("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");ce("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");ce("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");ce("\\angln","{\\angl n}");ce("\\blue","\\textcolor{##6495ed}{#1}");ce("\\orange","\\textcolor{##ffa500}{#1}");ce("\\pink","\\textcolor{##ff00af}{#1}");ce("\\red","\\textcolor{##df0030}{#1}");ce("\\green","\\textcolor{##28ae7b}{#1}");ce("\\gray","\\textcolor{gray}{#1}");ce("\\purple","\\textcolor{##9d38bd}{#1}");ce("\\blueA","\\textcolor{##ccfaff}{#1}");ce("\\blueB","\\textcolor{##80f6ff}{#1}");ce("\\blueC","\\textcolor{##63d9ea}{#1}");ce("\\blueD","\\textcolor{##11accd}{#1}");ce("\\blueE","\\textcolor{##0c7f99}{#1}");ce("\\tealA","\\textcolor{##94fff5}{#1}");ce("\\tealB","\\textcolor{##26edd5}{#1}");ce("\\tealC","\\textcolor{##01d1c1}{#1}");ce("\\tealD","\\textcolor{##01a995}{#1}");ce("\\tealE","\\textcolor{##208170}{#1}");ce("\\greenA","\\textcolor{##b6ffb0}{#1}");ce("\\greenB","\\textcolor{##8af281}{#1}");ce("\\greenC","\\textcolor{##74cf70}{#1}");ce("\\greenD","\\textcolor{##1fab54}{#1}");ce("\\greenE","\\textcolor{##0d923f}{#1}");ce("\\goldA","\\textcolor{##ffd0a9}{#1}");ce("\\goldB","\\textcolor{##ffbb71}{#1}");ce("\\goldC","\\textcolor{##ff9c39}{#1}");ce("\\goldD","\\textcolor{##e07d10}{#1}");ce("\\goldE","\\textcolor{##a75a05}{#1}");ce("\\redA","\\textcolor{##fca9a9}{#1}");ce("\\redB","\\textcolor{##ff8482}{#1}");ce("\\redC","\\textcolor{##f9685d}{#1}");ce("\\redD","\\textcolor{##e84d39}{#1}");ce("\\redE","\\textcolor{##bc2612}{#1}");ce("\\maroonA","\\textcolor{##ffbde0}{#1}");ce("\\maroonB","\\textcolor{##ff92c6}{#1}");ce("\\maroonC","\\textcolor{##ed5fa6}{#1}");ce("\\maroonD","\\textcolor{##ca337c}{#1}");ce("\\maroonE","\\textcolor{##9e034e}{#1}");ce("\\purpleA","\\textcolor{##ddd7ff}{#1}");ce("\\purpleB","\\textcolor{##c6b9fc}{#1}");ce("\\purpleC","\\textcolor{##aa87ff}{#1}");ce("\\purpleD","\\textcolor{##7854ab}{#1}");ce("\\purpleE","\\textcolor{##543b78}{#1}");ce("\\mintA","\\textcolor{##f5f9e8}{#1}");ce("\\mintB","\\textcolor{##edf2df}{#1}");ce("\\mintC","\\textcolor{##e0e5cc}{#1}");ce("\\grayA","\\textcolor{##f6f7f7}{#1}");ce("\\grayB","\\textcolor{##f0f1f2}{#1}");ce("\\grayC","\\textcolor{##e3e5e6}{#1}");ce("\\grayD","\\textcolor{##d6d8da}{#1}");ce("\\grayE","\\textcolor{##babec2}{#1}");ce("\\grayF","\\textcolor{##888d93}{#1}");ce("\\grayG","\\textcolor{##626569}{#1}");ce("\\grayH","\\textcolor{##3b3e40}{#1}");ce("\\grayI","\\textcolor{##21242c}{#1}");ce("\\kaBlue","\\textcolor{##314453}{#1}");ce("\\kaGreen","\\textcolor{##71B307}{#1}");$U={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},sA=class{static{o(this,"MacroExpander")}constructor(e,r,n){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=r,this.expansionCount=0,this.feed(e),this.macros=new aA(Iwe,r.macros),this.mode=n,this.stack=[]}feed(e){this.lexer=new S3(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var r,n,i;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;r=this.popToken(),{tokens:i,end:n}=this.consumeArg(["]"])}else({tokens:i,start:r,end:n}=this.consumeArg());return this.pushToken(new Do("EOF",n.loc)),this.pushTokens(i),r.range(n,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var r=[],n=e&&e.length>0;n||this.consumeSpaces();var i=this.future(),a,s=0,l=0;do{if(a=this.popToken(),r.push(a),a.text==="{")++s;else if(a.text==="}"){if(--s,s===-1)throw new gt("Extra }",a)}else if(a.text==="EOF")throw new gt("Unexpected end of input in a macro argument, expected '"+(e&&n?e[l]:"}")+"'",a);if(e&&n)if((s===0||s===1&&e[l]==="{")&&a.text===e[l]){if(++l,l===e.length){r.splice(-l,l);break}}else l=0}while(s!==0||n);return i.text==="{"&&r[r.length-1].text==="}"&&(r.pop(),r.shift()),r.reverse(),{tokens:r,start:i,end:a}}consumeArgs(e,r){if(r){if(r.length!==e+1)throw new gt("The length of delimiters doesn't match the number of args!");for(var n=r[0],i=0;ithis.settings.maxExpand)throw new gt("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var r=this.popToken(),n=r.text,i=r.noexpand?null:this._getExpansion(n);if(i==null||e&&i.unexpandable){if(e&&i==null&&n[0]==="\\"&&!this.isDefined(n))throw new gt("Undefined control sequence: "+n);return this.pushToken(r),!1}this.countExpansion(1);var a=i.tokens,s=this.consumeArgs(i.numArgs,i.delimiters);if(i.numArgs){a=a.slice();for(var l=a.length-1;l>=0;--l){var u=a[l];if(u.text==="#"){if(l===0)throw new gt("Incomplete placeholder at end of macro body",u);if(u=a[--l],u.text==="#")a.splice(l+1,1);else if(/^[1-9]$/.test(u.text))a.splice(l,2,...s[+u.text-1]);else throw new gt("Not a valid argument number",u)}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new Do(e)]):void 0}expandTokens(e){var r=[],n=this.stack.length;for(this.pushTokens(e);this.stack.length>n;)if(this.expandOnce(!0)===!1){var i=this.stack.pop();i.treatAsRelax&&(i.noexpand=!1,i.treatAsRelax=!1),r.push(i)}return this.countExpansion(r.length),r}expandMacroAsText(e){var r=this.expandMacro(e);return r&&r.map(n=>n.text).join("")}_getExpansion(e){var r=this.macros.get(e);if(r==null)return r;if(e.length===1){var n=this.lexer.catcodes[e];if(n!=null&&n!==13)return}var i=typeof r=="function"?r(this):r;if(typeof i=="string"){var a=0;if(i.indexOf("#")!==-1)for(var s=i.replace(/##/g,"");s.indexOf("#"+(a+1))!==-1;)++a;for(var l=new S3(i,this.settings),u=[],h=l.lex();h.text!=="EOF";)u.push(h),h=l.lex();u.reverse();var f={tokens:u,numArgs:a};return f}return i}isDefined(e){return this.macros.has(e)||xh.hasOwnProperty(e)||Nn.math.hasOwnProperty(e)||Nn.text.hasOwnProperty(e)||$U.hasOwnProperty(e)}isExpandable(e){var r=this.macros.get(e);return r!=null?typeof r=="string"||typeof r=="function"||!r.unexpandable:xh.hasOwnProperty(e)&&!xh[e].primitive}},HV=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,y3=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),X7={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},qV={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},C3=class t{static{o(this,"Parser")}constructor(e,r){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new sA(e,r,this.mode),this.settings=r,this.leftrightDepth=0}expect(e,r){if(r===void 0&&(r=!0),this.fetch().text!==e)throw new gt("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());r&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var r=this.nextToken;this.consume(),this.gullet.pushToken(new Do("}")),this.gullet.pushTokens(e);var n=this.parseExpression(!1);return this.expect("}"),this.nextToken=r,n}parseExpression(e,r){for(var n=[];;){this.mode==="math"&&this.consumeSpaces();var i=this.fetch();if(t.endOfExpression.indexOf(i.text)!==-1||r&&i.text===r||e&&xh[i.text]&&xh[i.text].infix)break;var a=this.parseAtom(r);if(a){if(a.type==="internal")continue}else break;n.push(a)}return this.mode==="text"&&this.formLigatures(n),this.handleInfixNodes(n)}handleInfixNodes(e){for(var r=-1,n,i=0;i=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+r[0]+'" used in math mode',e);var l=Nn[this.mode][r].group,u=to.range(e),h;if(STe.hasOwnProperty(l)){var f=l;h={type:"atom",mode:this.mode,family:f,loc:u,text:r}}else h={type:l,mode:this.mode,loc:u,text:r};s=h}else if(r.charCodeAt(0)>=128)this.settings.strict&&(YV(r.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+r[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+r[0]+'"'+(" ("+r.charCodeAt(0)+")"),e)),s={type:"textord",mode:"text",loc:to.range(e),text:r};else return null;if(this.consume(),a)for(var d=0;d{e.tagName==="A"&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),yh.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener"))})}var pd,Pwe,Bwe,KU,XU,sr,$we,zwe,Gwe,Vwe,QU,md,vr,Uwe,Hwe,rc,SA,qwe,Wwe,jU,I3,kn,gd,Ywe,kh,tt,gr=N(()=>{"use strict";O7();pd=//gi,Pwe=o(t=>t?QU(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),Bwe=(()=>{let t=!1;return()=>{t||(Fwe(),t=!0)}})();o(Fwe,"setupDompurifyHooks");KU=o(t=>(Bwe(),yh.sanitize(t)),"removeScript"),XU=o((t,e)=>{if(e.flowchart?.htmlLabels!==!1){let r=e.securityLevel;r==="antiscript"||r==="strict"?t=KU(t):r!=="loose"&&(t=QU(t),t=t.replace(//g,">"),t=t.replace(/=/g,"="),t=Vwe(t))}return t},"sanitizeMore"),sr=o((t,e)=>t&&(e.dompurifyConfig?t=yh.sanitize(XU(t,e),e.dompurifyConfig).toString():t=yh.sanitize(XU(t,e),{FORBID_TAGS:["style"]}).toString(),t),"sanitizeText"),$we=o((t,e)=>typeof t=="string"?sr(t,e):t.flat().map(r=>sr(r,e)),"sanitizeTextOrArray"),zwe=o(t=>pd.test(t),"hasBreaks"),Gwe=o(t=>t.split(pd),"splitBreaks"),Vwe=o(t=>t.replace(/#br#/g,"
    "),"placeholderToBreak"),QU=o(t=>t.replace(pd,"#br#"),"breakToPlaceholder"),md=o(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=CSS.escape(e)),e},"getUrl"),vr=o(t=>!(t===!1||["false","null","0"].includes(String(t).trim().toLowerCase())),"evaluate"),Uwe=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.max(...e)},"getMax"),Hwe=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.min(...e)},"getMin"),rc=o(function(t){let e=t.split(/(,)/),r=[];for(let n=0;n0&&n+1Math.max(0,t.split(e).length-1),"countOccurrence"),qwe=o((t,e)=>{let r=SA(t,"~"),n=SA(e,"~");return r===1&&n===1},"shouldCombineSets"),Wwe=o(t=>{let e=SA(t,"~"),r=!1;if(e<=1)return t;e%2!==0&&t.startsWith("~")&&(t=t.substring(1),r=!0);let n=[...t],i=n.indexOf("~"),a=n.lastIndexOf("~");for(;i!==-1&&a!==-1&&i!==a;)n[i]="<",n[a]=">",i=n.indexOf("~"),a=n.lastIndexOf("~");return r&&n.unshift("~"),n.join("")},"processSet"),jU=o(()=>window.MathMLElement!==void 0,"isMathMLSupported"),I3=/\$\$(.*)\$\$/g,kn=o(t=>(t.match(I3)?.length??0)>0,"hasKatex"),gd=o(async(t,e)=>{let r=document.createElement("div");r.innerHTML=await kh(t,e),r.id="katex-temp",r.style.visibility="hidden",r.style.position="absolute",r.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",r);let i={width:r.clientWidth,height:r.clientHeight};return r.remove(),i},"calculateMathMLDimensions"),Ywe=o(async(t,e)=>{if(!kn(t))return t;if(!(jU()||e.legacyMathML||e.forceLegacyMathML))return t.replace(I3,"MathML is unsupported in this environment.");{let{default:r}=await Promise.resolve().then(()=>(YU(),WU)),n=e.forceLegacyMathML||!jU()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(pd).map(i=>kn(i)?`
    ${i}
    `:`
    ${i}
    `).join("").replace(I3,(i,a)=>r.renderToString(a,{throwOnError:!0,displayMode:!0,output:n}).replace(/\n/g," ").replace(//g,""))}return t.replace(I3,"Katex is not supported in @mermaid-js/tiny. Please use the full mermaid library.")},"renderKatexUnsanitized"),kh=o(async(t,e)=>sr(await Ywe(t,e),e),"renderKatexSanitized"),tt={getRows:Pwe,sanitizeText:sr,sanitizeTextOrArray:$we,hasBreaks:zwe,splitBreaks:Gwe,lineBreakRegex:pd,removeScript:KU,getUrl:md,evaluate:vr,getMax:Uwe,getMin:Hwe}});var AA,CA,ZU,O3,JU,eH,_s,nc=N(()=>{"use strict";sG();qn();gr();pt();AA={body:'?',height:80,width:80},CA=new Map,ZU=new Map,O3=o(t=>{for(let e of t){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(X.debug("Registering icon pack:",e.name),"loader"in e)ZU.set(e.name,e.loader);else if("icons"in e)CA.set(e.name,e.icons);else throw X.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.')}},"registerIconPacks"),JU=o(async(t,e)=>{let r=r7(t,!0,e!==void 0);if(!r)throw new Error(`Invalid icon name: ${t}`);let n=r.prefix||e;if(!n)throw new Error(`Icon name must contain a prefix: ${t}`);let i=CA.get(n);if(!i){let s=ZU.get(n);if(!s)throw new Error(`Icon set not found: ${r.prefix}`);try{i={...await s(),prefix:n},CA.set(n,i)}catch(l){throw X.error(l),new Error(`Failed to load icon set: ${r.prefix}`)}}let a=i7(i,r.name);if(!a)throw new Error(`Icon not found: ${t}`);return a},"getRegisteredIconData"),eH=o(async t=>{try{return await JU(t),!0}catch{return!1}},"isIconAvailable"),_s=o(async(t,e,r)=>{let n;try{n=await JU(t,e?.fallbackPrefix)}catch(s){X.error(s),n=AA}let i=s7(n,e),a=l7(o7(i.body),{...i.attributes,...r});return sr(a,Qt())},"getIconSVG")});function P3(t){for(var e=[],r=1;r{"use strict";o(P3,"dedent")});var B3,yd,tH,F3=N(()=>{"use strict";B3=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,yd=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,tH=/\s*%%.*\n/gm});var A0,DA=N(()=>{"use strict";A0=class extends Error{static{o(this,"UnknownDiagramError")}constructor(e){super(e),this.name="UnknownDiagramError"}}});var gu,_0,ev,LA,rH,vd=N(()=>{"use strict";pt();F3();DA();gu={},_0=o(function(t,e){t=t.replace(B3,"").replace(yd,"").replace(tH,` +`);for(let[r,{detector:n}]of Object.entries(gu))if(n(t,e))return r;throw new A0(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),ev=o((...t)=>{for(let{id:e,detector:r,loader:n}of t)LA(e,r,n)},"registerLazyLoadedDiagrams"),LA=o((t,e,r)=>{gu[t]&&X.warn(`Detector with key ${t} already exists. Overwriting.`),gu[t]={detector:e,loader:r},X.debug(`Detector with key ${t} added${r?" with loader":""}`)},"addDetector"),rH=o(t=>gu[t].loader,"getDiagramLoader")});var tv,nH,RA=N(()=>{"use strict";tv=(function(){var t=o(function(He,Le,Ie,Ne){for(Ie=Ie||{},Ne=He.length;Ne--;Ie[He[Ne]]=Le);return Ie},"o"),e=[1,24],r=[1,25],n=[1,26],i=[1,27],a=[1,28],s=[1,63],l=[1,64],u=[1,65],h=[1,66],f=[1,67],d=[1,68],p=[1,69],m=[1,29],g=[1,30],y=[1,31],v=[1,32],x=[1,33],b=[1,34],T=[1,35],S=[1,36],w=[1,37],k=[1,38],A=[1,39],C=[1,40],R=[1,41],I=[1,42],L=[1,43],E=[1,44],D=[1,45],_=[1,46],O=[1,47],M=[1,48],P=[1,50],B=[1,51],F=[1,52],G=[1,53],$=[1,54],U=[1,55],j=[1,56],te=[1,57],Y=[1,58],oe=[1,59],J=[1,60],ue=[14,42],re=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],ee=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Z=[1,82],K=[1,83],ae=[1,84],Q=[1,85],de=[12,14,42],ne=[12,14,33,42],Te=[12,14,33,42,76,77,79,80],q=[12,33],Ve=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],pe={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:o(function(Le,Ie,Ne,Ce,Fe,fe,xe){var W=fe.length-1;switch(Fe){case 3:Ce.setDirection("TB");break;case 4:Ce.setDirection("BT");break;case 5:Ce.setDirection("RL");break;case 6:Ce.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:Ce.setC4Type(fe[W-3]);break;case 19:Ce.setTitle(fe[W].substring(6)),this.$=fe[W].substring(6);break;case 20:Ce.setAccDescription(fe[W].substring(15)),this.$=fe[W].substring(15);break;case 21:this.$=fe[W].trim(),Ce.setTitle(this.$);break;case 22:case 23:this.$=fe[W].trim(),Ce.setAccDescription(this.$);break;case 28:fe[W].splice(2,0,"ENTERPRISE"),Ce.addPersonOrSystemBoundary(...fe[W]),this.$=fe[W];break;case 29:fe[W].splice(2,0,"SYSTEM"),Ce.addPersonOrSystemBoundary(...fe[W]),this.$=fe[W];break;case 30:Ce.addPersonOrSystemBoundary(...fe[W]),this.$=fe[W];break;case 31:fe[W].splice(2,0,"CONTAINER"),Ce.addContainerBoundary(...fe[W]),this.$=fe[W];break;case 32:Ce.addDeploymentNode("node",...fe[W]),this.$=fe[W];break;case 33:Ce.addDeploymentNode("nodeL",...fe[W]),this.$=fe[W];break;case 34:Ce.addDeploymentNode("nodeR",...fe[W]),this.$=fe[W];break;case 35:Ce.popBoundaryParseStack();break;case 39:Ce.addPersonOrSystem("person",...fe[W]),this.$=fe[W];break;case 40:Ce.addPersonOrSystem("external_person",...fe[W]),this.$=fe[W];break;case 41:Ce.addPersonOrSystem("system",...fe[W]),this.$=fe[W];break;case 42:Ce.addPersonOrSystem("system_db",...fe[W]),this.$=fe[W];break;case 43:Ce.addPersonOrSystem("system_queue",...fe[W]),this.$=fe[W];break;case 44:Ce.addPersonOrSystem("external_system",...fe[W]),this.$=fe[W];break;case 45:Ce.addPersonOrSystem("external_system_db",...fe[W]),this.$=fe[W];break;case 46:Ce.addPersonOrSystem("external_system_queue",...fe[W]),this.$=fe[W];break;case 47:Ce.addContainer("container",...fe[W]),this.$=fe[W];break;case 48:Ce.addContainer("container_db",...fe[W]),this.$=fe[W];break;case 49:Ce.addContainer("container_queue",...fe[W]),this.$=fe[W];break;case 50:Ce.addContainer("external_container",...fe[W]),this.$=fe[W];break;case 51:Ce.addContainer("external_container_db",...fe[W]),this.$=fe[W];break;case 52:Ce.addContainer("external_container_queue",...fe[W]),this.$=fe[W];break;case 53:Ce.addComponent("component",...fe[W]),this.$=fe[W];break;case 54:Ce.addComponent("component_db",...fe[W]),this.$=fe[W];break;case 55:Ce.addComponent("component_queue",...fe[W]),this.$=fe[W];break;case 56:Ce.addComponent("external_component",...fe[W]),this.$=fe[W];break;case 57:Ce.addComponent("external_component_db",...fe[W]),this.$=fe[W];break;case 58:Ce.addComponent("external_component_queue",...fe[W]),this.$=fe[W];break;case 60:Ce.addRel("rel",...fe[W]),this.$=fe[W];break;case 61:Ce.addRel("birel",...fe[W]),this.$=fe[W];break;case 62:Ce.addRel("rel_u",...fe[W]),this.$=fe[W];break;case 63:Ce.addRel("rel_d",...fe[W]),this.$=fe[W];break;case 64:Ce.addRel("rel_l",...fe[W]),this.$=fe[W];break;case 65:Ce.addRel("rel_r",...fe[W]),this.$=fe[W];break;case 66:Ce.addRel("rel_b",...fe[W]),this.$=fe[W];break;case 67:fe[W].splice(0,1),Ce.addRel("rel",...fe[W]),this.$=fe[W];break;case 68:Ce.updateElStyle("update_el_style",...fe[W]),this.$=fe[W];break;case 69:Ce.updateRelStyle("update_rel_style",...fe[W]),this.$=fe[W];break;case 70:Ce.updateLayoutConfig("update_layout_config",...fe[W]),this.$=fe[W];break;case 71:this.$=[fe[W]];break;case 72:fe[W].unshift(fe[W-1]),this.$=fe[W];break;case 73:case 75:this.$=fe[W].trim();break;case 74:let he={};he[fe[W-1].trim()]=fe[W].trim(),this.$=he;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{13:70,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{13:71,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{13:72,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{13:73,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{14:[1,74]},t(ue,[2,13],{43:23,29:49,30:61,32:62,20:75,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J}),t(ue,[2,14]),t(re,[2,16],{12:[1,76]}),t(ue,[2,36],{12:[1,77]}),t(ee,[2,19]),t(ee,[2,20]),{25:[1,78]},{27:[1,79]},t(ee,[2,23]),{35:80,75:81,76:Z,77:K,79:ae,80:Q},{35:86,75:81,76:Z,77:K,79:ae,80:Q},{35:87,75:81,76:Z,77:K,79:ae,80:Q},{35:88,75:81,76:Z,77:K,79:ae,80:Q},{35:89,75:81,76:Z,77:K,79:ae,80:Q},{35:90,75:81,76:Z,77:K,79:ae,80:Q},{35:91,75:81,76:Z,77:K,79:ae,80:Q},{35:92,75:81,76:Z,77:K,79:ae,80:Q},{35:93,75:81,76:Z,77:K,79:ae,80:Q},{35:94,75:81,76:Z,77:K,79:ae,80:Q},{35:95,75:81,76:Z,77:K,79:ae,80:Q},{35:96,75:81,76:Z,77:K,79:ae,80:Q},{35:97,75:81,76:Z,77:K,79:ae,80:Q},{35:98,75:81,76:Z,77:K,79:ae,80:Q},{35:99,75:81,76:Z,77:K,79:ae,80:Q},{35:100,75:81,76:Z,77:K,79:ae,80:Q},{35:101,75:81,76:Z,77:K,79:ae,80:Q},{35:102,75:81,76:Z,77:K,79:ae,80:Q},{35:103,75:81,76:Z,77:K,79:ae,80:Q},{35:104,75:81,76:Z,77:K,79:ae,80:Q},t(de,[2,59]),{35:105,75:81,76:Z,77:K,79:ae,80:Q},{35:106,75:81,76:Z,77:K,79:ae,80:Q},{35:107,75:81,76:Z,77:K,79:ae,80:Q},{35:108,75:81,76:Z,77:K,79:ae,80:Q},{35:109,75:81,76:Z,77:K,79:ae,80:Q},{35:110,75:81,76:Z,77:K,79:ae,80:Q},{35:111,75:81,76:Z,77:K,79:ae,80:Q},{35:112,75:81,76:Z,77:K,79:ae,80:Q},{35:113,75:81,76:Z,77:K,79:ae,80:Q},{35:114,75:81,76:Z,77:K,79:ae,80:Q},{35:115,75:81,76:Z,77:K,79:ae,80:Q},{20:116,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{12:[1,118],33:[1,117]},{35:119,75:81,76:Z,77:K,79:ae,80:Q},{35:120,75:81,76:Z,77:K,79:ae,80:Q},{35:121,75:81,76:Z,77:K,79:ae,80:Q},{35:122,75:81,76:Z,77:K,79:ae,80:Q},{35:123,75:81,76:Z,77:K,79:ae,80:Q},{35:124,75:81,76:Z,77:K,79:ae,80:Q},{35:125,75:81,76:Z,77:K,79:ae,80:Q},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},t(ue,[2,15]),t(re,[2,17],{21:22,19:130,22:e,23:r,24:n,26:i,28:a}),t(ue,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:e,23:r,24:n,26:i,28:a,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J}),t(ee,[2,21]),t(ee,[2,22]),t(de,[2,39]),t(ne,[2,71],{75:81,35:132,76:Z,77:K,79:ae,80:Q}),t(Te,[2,73]),{78:[1,133]},t(Te,[2,75]),t(Te,[2,76]),t(de,[2,40]),t(de,[2,41]),t(de,[2,42]),t(de,[2,43]),t(de,[2,44]),t(de,[2,45]),t(de,[2,46]),t(de,[2,47]),t(de,[2,48]),t(de,[2,49]),t(de,[2,50]),t(de,[2,51]),t(de,[2,52]),t(de,[2,53]),t(de,[2,54]),t(de,[2,55]),t(de,[2,56]),t(de,[2,57]),t(de,[2,58]),t(de,[2,60]),t(de,[2,61]),t(de,[2,62]),t(de,[2,63]),t(de,[2,64]),t(de,[2,65]),t(de,[2,66]),t(de,[2,67]),t(de,[2,68]),t(de,[2,69]),t(de,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},t(q,[2,28]),t(q,[2,29]),t(q,[2,30]),t(q,[2,31]),t(q,[2,32]),t(q,[2,33]),t(q,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},t(re,[2,18]),t(ue,[2,38]),t(ne,[2,72]),t(Te,[2,74]),t(de,[2,24]),t(de,[2,35]),t(Ve,[2,25]),t(Ve,[2,26],{12:[1,138]}),t(Ve,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:o(function(Le,Ie){if(Ie.recoverable)this.trace(Le);else{var Ne=new Error(Le);throw Ne.hash=Ie,Ne}},"parseError"),parse:o(function(Le){var Ie=this,Ne=[0],Ce=[],Fe=[null],fe=[],xe=this.table,W="",he=0,z=0,se=0,le=2,ke=1,ve=fe.slice.call(arguments,1),ye=Object.create(this.lexer),Re={yy:{}};for(var _e in this.yy)Object.prototype.hasOwnProperty.call(this.yy,_e)&&(Re.yy[_e]=this.yy[_e]);ye.setInput(Le,Re.yy),Re.yy.lexer=ye,Re.yy.parser=this,typeof ye.yylloc>"u"&&(ye.yylloc={});var ze=ye.yylloc;fe.push(ze);var Ke=ye.options&&ye.options.ranges;typeof Re.yy.parseError=="function"?this.parseError=Re.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xt(ft){Ne.length=Ne.length-2*ft,Fe.length=Fe.length-ft,fe.length=fe.length-ft}o(xt,"popStack");function We(){var ft;return ft=Ce.pop()||ye.lex()||ke,typeof ft!="number"&&(ft instanceof Array&&(Ce=ft,ft=Ce.pop()),ft=Ie.symbols_[ft]||ft),ft}o(We,"lex");for(var Oe,et,Ue,lt,Gt,vt,Lt={},dt,nt,bt,wt;;){if(Ue=Ne[Ne.length-1],this.defaultActions[Ue]?lt=this.defaultActions[Ue]:((Oe===null||typeof Oe>"u")&&(Oe=We()),lt=xe[Ue]&&xe[Ue][Oe]),typeof lt>"u"||!lt.length||!lt[0]){var yt="";wt=[];for(dt in xe[Ue])this.terminals_[dt]&&dt>le&&wt.push("'"+this.terminals_[dt]+"'");ye.showPosition?yt="Parse error on line "+(he+1)+`: +`+ye.showPosition()+` +Expecting `+wt.join(", ")+", got '"+(this.terminals_[Oe]||Oe)+"'":yt="Parse error on line "+(he+1)+": Unexpected "+(Oe==ke?"end of input":"'"+(this.terminals_[Oe]||Oe)+"'"),this.parseError(yt,{text:ye.match,token:this.terminals_[Oe]||Oe,line:ye.yylineno,loc:ze,expected:wt})}if(lt[0]instanceof Array&<.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ue+", token: "+Oe);switch(lt[0]){case 1:Ne.push(Oe),Fe.push(ye.yytext),fe.push(ye.yylloc),Ne.push(lt[1]),Oe=null,et?(Oe=et,et=null):(z=ye.yyleng,W=ye.yytext,he=ye.yylineno,ze=ye.yylloc,se>0&&se--);break;case 2:if(nt=this.productions_[lt[1]][1],Lt.$=Fe[Fe.length-nt],Lt._$={first_line:fe[fe.length-(nt||1)].first_line,last_line:fe[fe.length-1].last_line,first_column:fe[fe.length-(nt||1)].first_column,last_column:fe[fe.length-1].last_column},Ke&&(Lt._$.range=[fe[fe.length-(nt||1)].range[0],fe[fe.length-1].range[1]]),vt=this.performAction.apply(Lt,[W,z,he,Re.yy,lt[1],Fe,fe].concat(ve)),typeof vt<"u")return vt;nt&&(Ne=Ne.slice(0,-1*nt*2),Fe=Fe.slice(0,-1*nt),fe=fe.slice(0,-1*nt)),Ne.push(this.productions_[lt[1]][0]),Fe.push(Lt.$),fe.push(Lt._$),bt=xe[Ne[Ne.length-2]][Ne[Ne.length-1]],Ne.push(bt);break;case 3:return!0}}return!0},"parse")},Be=(function(){var He={EOF:1,parseError:o(function(Ie,Ne){if(this.yy.parser)this.yy.parser.parseError(Ie,Ne);else throw new Error(Ie)},"parseError"),setInput:o(function(Le,Ie){return this.yy=Ie||this.yy||{},this._input=Le,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Le=this._input[0];this.yytext+=Le,this.yyleng++,this.offset++,this.match+=Le,this.matched+=Le;var Ie=Le.match(/(?:\r\n?|\n).*/g);return Ie?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Le},"input"),unput:o(function(Le){var Ie=Le.length,Ne=Le.split(/(?:\r\n?|\n)/g);this._input=Le+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ie),this.offset-=Ie;var Ce=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Ne.length-1&&(this.yylineno-=Ne.length-1);var Fe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Ne?(Ne.length===Ce.length?this.yylloc.first_column:0)+Ce[Ce.length-Ne.length].length-Ne[0].length:this.yylloc.first_column-Ie},this.options.ranges&&(this.yylloc.range=[Fe[0],Fe[0]+this.yyleng-Ie]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Le){this.unput(this.match.slice(Le))},"less"),pastInput:o(function(){var Le=this.matched.substr(0,this.matched.length-this.match.length);return(Le.length>20?"...":"")+Le.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Le=this.match;return Le.length<20&&(Le+=this._input.substr(0,20-Le.length)),(Le.substr(0,20)+(Le.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Le=this.pastInput(),Ie=new Array(Le.length+1).join("-");return Le+this.upcomingInput()+` +`+Ie+"^"},"showPosition"),test_match:o(function(Le,Ie){var Ne,Ce,Fe;if(this.options.backtrack_lexer&&(Fe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Fe.yylloc.range=this.yylloc.range.slice(0))),Ce=Le[0].match(/(?:\r\n?|\n).*/g),Ce&&(this.yylineno+=Ce.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Ce?Ce[Ce.length-1].length-Ce[Ce.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Le[0].length},this.yytext+=Le[0],this.match+=Le[0],this.matches=Le,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Le[0].length),this.matched+=Le[0],Ne=this.performAction.call(this,this.yy,this,Ie,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Ne)return Ne;if(this._backtrack){for(var fe in Fe)this[fe]=Fe[fe];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Le,Ie,Ne,Ce;this._more||(this.yytext="",this.match="");for(var Fe=this._currentRules(),fe=0;feIe[0].length)){if(Ie=Ne,Ce=fe,this.options.backtrack_lexer){if(Le=this.test_match(Ne,Fe[fe]),Le!==!1)return Le;if(this._backtrack){Ie=!1;continue}else return!1}else if(!this.options.flex)break}return Ie?(Le=this.test_match(Ie,Fe[Ce]),Le!==!1?Le:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ie=this.next();return Ie||this.lex()},"lex"),begin:o(function(Ie){this.conditionStack.push(Ie)},"begin"),popState:o(function(){var Ie=this.conditionStack.length-1;return Ie>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ie){return Ie=this.conditionStack.length-1-Math.abs(Ie||0),Ie>=0?this.conditionStack[Ie]:"INITIAL"},"topState"),pushState:o(function(Ie){this.begin(Ie)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Ie,Ne,Ce,Fe){var fe=Fe;switch(Ce){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return He})();pe.lexer=Be;function Ye(){this.yy={}}return o(Ye,"Parser"),Ye.prototype=pe,pe.Parser=Ye,new Ye})();tv.parser=tv;nH=tv});var Xwe,jwe,mn,ic,Ei=N(()=>{"use strict";pt();Xwe=o(function(t,e){for(let r of e)t.attr(r[0],r[1])},"d3Attrs"),jwe=o(function(t,e,r){let n=new Map;return r?(n.set("width","100%"),n.set("style",`max-width: ${e}px;`)):(n.set("height",t),n.set("width",e)),n},"calculateSvgSizeAttrs"),mn=o(function(t,e,r,n){let i=jwe(e,r,n);Xwe(t,i)},"configureSvgSize"),ic=o(function(t,e,r,n){let i=e.node().getBBox(),a=i.width,s=i.height;X.info(`SVG bounds: ${a}x${s}`,i);let l=0,u=0;X.info(`Graph bounds: ${l}x${u}`,t),l=a+r*2,u=s+r*2,X.info(`Calculated bounds: ${l}x${u}`),mn(e,u,l,n);let h=`${i.x-r} ${i.y-r} ${i.width+2*r} ${i.height+2*r}`;e.attr("viewBox",h)},"setupGraphViewbox")});var $3,Kwe,iH,aH,NA=N(()=>{"use strict";pt();$3={},Kwe=o((t,e,r)=>{let n="";return t in $3&&$3[t]?n=$3[t](r):X.warn(`No theme found for ${t}`),` & { + font-family: ${r.fontFamily}; + font-size: ${r.fontSize}; + fill: ${r.textColor} + } + @keyframes edge-animation-frame { + from { + stroke-dashoffset: 0; + } + } + @keyframes dash { + to { + stroke-dashoffset: 0; + } + } + & .edge-animation-slow { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 50s linear infinite; + stroke-linecap: round; + } + & .edge-animation-fast { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 20s linear infinite; + stroke-linecap: round; + } + /* Classes common for multiple diagrams */ + + & .error-icon { + fill: ${r.errorBkgColor}; + } + & .error-text { + fill: ${r.errorTextColor}; + stroke: ${r.errorTextColor}; + } + + & .edge-thickness-normal { + stroke-width: 1px; + } + & .edge-thickness-thick { + stroke-width: 3.5px + } + & .edge-pattern-solid { + stroke-dasharray: 0; + } + & .edge-thickness-invisible { + stroke-width: 0; + fill: none; + } + & .edge-pattern-dashed{ + stroke-dasharray: 3; + } + .edge-pattern-dotted { + stroke-dasharray: 2; + } + + & .marker { + fill: ${r.lineColor}; + stroke: ${r.lineColor}; + } + & .marker.cross { + stroke: ${r.lineColor}; + } + + & svg { + font-family: ${r.fontFamily}; + font-size: ${r.fontSize}; + } + & p { + margin: 0 + } + + ${n} + + ${e} +`},"getStyles"),iH=o((t,e)=>{e!==void 0&&($3[t]=e)},"addStylesForDiagram"),aH=Kwe});var rv={};dr(rv,{clear:()=>Sr,getAccDescription:()=>Or,getAccTitle:()=>Mr,getDiagramTitle:()=>Pr,setAccDescription:()=>Ir,setAccTitle:()=>Rr,setDiagramTitle:()=>$r});var MA,IA,OA,PA,Sr,Rr,Mr,Ir,Or,$r,Pr,ci=N(()=>{"use strict";gr();qn();MA="",IA="",OA="",PA=o(t=>sr(t,Qt()),"sanitizeText"),Sr=o(()=>{MA="",OA="",IA=""},"clear"),Rr=o(t=>{MA=PA(t).replace(/^\s+/g,"")},"setAccTitle"),Mr=o(()=>MA,"getAccTitle"),Ir=o(t=>{OA=PA(t).replace(/\n\s+/g,` +`)},"setAccDescription"),Or=o(()=>OA,"getAccDescription"),$r=o(t=>{IA=PA(t)},"setDiagramTitle"),Pr=o(()=>IA,"getDiagramTitle")});var sH,Qwe,ge,nv,G3,iv,FA,Zwe,z3,xd,av,BA,Xt=N(()=>{"use strict";vd();pt();qn();gr();Ei();NA();ci();sH=X,Qwe=Dy,ge=Qt,nv=n3,G3=gh,iv=o(t=>sr(t,ge()),"sanitizeText"),FA=ic,Zwe=o(()=>rv,"getCommonDb"),z3={},xd=o((t,e,r)=>{z3[t]&&sH.warn(`Diagram with id ${t} already registered. Overwriting.`),z3[t]=e,r&&LA(t,r),iH(t,e.styles),e.injectUtils?.(sH,Qwe,ge,iv,FA,Zwe(),()=>{})},"registerDiagram"),av=o(t=>{if(t in z3)return z3[t];throw new BA(t)},"getDiagram"),BA=class extends Error{static{o(this,"DiagramNotFoundError")}constructor(e){super(`Diagram ${e} not found.`)}}});var ml,Eh,ns,pl,ac,sv,$A,zA,V3,U3,oH,Jwe,eke,tke,rke,nke,ike,ake,ske,oke,lke,cke,uke,hke,fke,dke,pke,mke,lH,gke,yke,cH,vke,xke,bke,Tke,Sh,wke,kke,Eke,Ske,Cke,ov,GA=N(()=>{"use strict";Xt();gr();ci();ml=[],Eh=[""],ns="global",pl="",ac=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],sv=[],$A="",zA=!1,V3=4,U3=2,Jwe=o(function(){return oH},"getC4Type"),eke=o(function(t){oH=sr(t,ge())},"setC4Type"),tke=o(function(t,e,r,n,i,a,s,l,u){if(t==null||e===void 0||e===null||r===void 0||r===null||n===void 0||n===null)return;let h={},f=sv.find(d=>d.from===e&&d.to===r);if(f?h=f:sv.push(h),h.type=t,h.from=e,h.to=r,h.label={text:n},i==null)h.techn={text:""};else if(typeof i=="object"){let[d,p]=Object.entries(i)[0];h[d]={text:p}}else h.techn={text:i};if(a==null)h.descr={text:""};else if(typeof a=="object"){let[d,p]=Object.entries(a)[0];h[d]={text:p}}else h.descr={text:a};if(typeof s=="object"){let[d,p]=Object.entries(s)[0];h[d]=p}else h.sprite=s;if(typeof l=="object"){let[d,p]=Object.entries(l)[0];h[d]=p}else h.tags=l;if(typeof u=="object"){let[d,p]=Object.entries(u)[0];h[d]=p}else h.link=u;h.wrap=Sh()},"addRel"),rke=o(function(t,e,r,n,i,a,s){if(e===null||r===null)return;let l={},u=ml.find(h=>h.alias===e);if(u&&e===u.alias?l=u:(l.alias=e,ml.push(l)),r==null?l.label={text:""}:l.label={text:r},n==null)l.descr={text:""};else if(typeof n=="object"){let[h,f]=Object.entries(n)[0];l[h]={text:f}}else l.descr={text:n};if(typeof i=="object"){let[h,f]=Object.entries(i)[0];l[h]=f}else l.sprite=i;if(typeof a=="object"){let[h,f]=Object.entries(a)[0];l[h]=f}else l.tags=a;if(typeof s=="object"){let[h,f]=Object.entries(s)[0];l[h]=f}else l.link=s;l.typeC4Shape={text:t},l.parentBoundary=ns,l.wrap=Sh()},"addPersonOrSystem"),nke=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ml.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ml.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=Sh(),u.typeC4Shape={text:t},u.parentBoundary=ns},"addContainer"),ike=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ml.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ml.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=Sh(),u.typeC4Shape={text:t},u.parentBoundary=ns},"addComponent"),ake=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=ac.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,ac.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"system"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=ns,a.wrap=Sh(),pl=ns,ns=t,Eh.push(pl)},"addPersonOrSystemBoundary"),ske=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=ac.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,ac.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"container"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=ns,a.wrap=Sh(),pl=ns,ns=t,Eh.push(pl)},"addContainerBoundary"),oke=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ac.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ac.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.type={text:"node"};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.type={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.nodeType=t,u.parentBoundary=ns,u.wrap=Sh(),pl=ns,ns=e,Eh.push(pl)},"addDeploymentNode"),lke=o(function(){ns=pl,Eh.pop(),pl=Eh.pop(),Eh.push(pl)},"popBoundaryParseStack"),cke=o(function(t,e,r,n,i,a,s,l,u,h,f){let d=ml.find(p=>p.alias===e);if(!(d===void 0&&(d=ac.find(p=>p.alias===e),d===void 0))){if(r!=null)if(typeof r=="object"){let[p,m]=Object.entries(r)[0];d[p]=m}else d.bgColor=r;if(n!=null)if(typeof n=="object"){let[p,m]=Object.entries(n)[0];d[p]=m}else d.fontColor=n;if(i!=null)if(typeof i=="object"){let[p,m]=Object.entries(i)[0];d[p]=m}else d.borderColor=i;if(a!=null)if(typeof a=="object"){let[p,m]=Object.entries(a)[0];d[p]=m}else d.shadowing=a;if(s!=null)if(typeof s=="object"){let[p,m]=Object.entries(s)[0];d[p]=m}else d.shape=s;if(l!=null)if(typeof l=="object"){let[p,m]=Object.entries(l)[0];d[p]=m}else d.sprite=l;if(u!=null)if(typeof u=="object"){let[p,m]=Object.entries(u)[0];d[p]=m}else d.techn=u;if(h!=null)if(typeof h=="object"){let[p,m]=Object.entries(h)[0];d[p]=m}else d.legendText=h;if(f!=null)if(typeof f=="object"){let[p,m]=Object.entries(f)[0];d[p]=m}else d.legendSprite=f}},"updateElStyle"),uke=o(function(t,e,r,n,i,a,s){let l=sv.find(u=>u.from===e&&u.to===r);if(l!==void 0){if(n!=null)if(typeof n=="object"){let[u,h]=Object.entries(n)[0];l[u]=h}else l.textColor=n;if(i!=null)if(typeof i=="object"){let[u,h]=Object.entries(i)[0];l[u]=h}else l.lineColor=i;if(a!=null)if(typeof a=="object"){let[u,h]=Object.entries(a)[0];l[u]=parseInt(h)}else l.offsetX=parseInt(a);if(s!=null)if(typeof s=="object"){let[u,h]=Object.entries(s)[0];l[u]=parseInt(h)}else l.offsetY=parseInt(s)}},"updateRelStyle"),hke=o(function(t,e,r){let n=V3,i=U3;if(typeof e=="object"){let a=Object.values(e)[0];n=parseInt(a)}else n=parseInt(e);if(typeof r=="object"){let a=Object.values(r)[0];i=parseInt(a)}else i=parseInt(r);n>=1&&(V3=n),i>=1&&(U3=i)},"updateLayoutConfig"),fke=o(function(){return V3},"getC4ShapeInRow"),dke=o(function(){return U3},"getC4BoundaryInRow"),pke=o(function(){return ns},"getCurrentBoundaryParse"),mke=o(function(){return pl},"getParentBoundaryParse"),lH=o(function(t){return t==null?ml:ml.filter(e=>e.parentBoundary===t)},"getC4ShapeArray"),gke=o(function(t){return ml.find(e=>e.alias===t)},"getC4Shape"),yke=o(function(t){return Object.keys(lH(t))},"getC4ShapeKeys"),cH=o(function(t){return t==null?ac:ac.filter(e=>e.parentBoundary===t)},"getBoundaries"),vke=cH,xke=o(function(){return sv},"getRels"),bke=o(function(){return $A},"getTitle"),Tke=o(function(t){zA=t},"setWrap"),Sh=o(function(){return zA},"autoWrap"),wke=o(function(){ml=[],ac=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],pl="",ns="global",Eh=[""],sv=[],Eh=[""],$A="",zA=!1,V3=4,U3=2},"clear"),kke={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},Eke={FILLED:0,OPEN:1},Ske={LEFTOF:0,RIGHTOF:1,OVER:2},Cke=o(function(t){$A=sr(t,ge())},"setTitle"),ov={addPersonOrSystem:rke,addPersonOrSystemBoundary:ake,addContainer:nke,addContainerBoundary:ske,addComponent:ike,addDeploymentNode:oke,popBoundaryParseStack:lke,addRel:tke,updateElStyle:cke,updateRelStyle:uke,updateLayoutConfig:hke,autoWrap:Sh,setWrap:Tke,getC4ShapeArray:lH,getC4Shape:gke,getC4ShapeKeys:yke,getBoundaries:cH,getBoundarys:vke,getCurrentBoundaryParse:pke,getParentBoundaryParse:mke,getRels:xke,getTitle:bke,getC4Type:Jwe,getC4ShapeInRow:fke,getC4BoundaryInRow:dke,setAccTitle:Rr,getAccTitle:Mr,getAccDescription:Or,setAccDescription:Ir,getConfig:o(()=>ge().c4,"getConfig"),clear:wke,LINETYPE:kke,ARROWTYPE:Eke,PLACEMENT:Ske,setTitle:Cke,setC4Type:eke}});function bd(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}var VA=N(()=>{"use strict";o(bd,"ascending")});function UA(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}var uH=N(()=>{"use strict";o(UA,"descending")});function Td(t){let e,r,n;t.length!==2?(e=bd,r=o((l,u)=>bd(t(l),u),"compare2"),n=o((l,u)=>t(l)-u,"delta")):(e=t===bd||t===UA?t:Ake,r=t,n=t);function i(l,u,h=0,f=l.length){if(h>>1;r(l[d],u)<0?h=d+1:f=d}while(h>>1;r(l[d],u)<=0?h=d+1:f=d}while(hh&&n(l[d-1],u)>-n(l[d],u)?d-1:d}return o(s,"center"),{left:i,center:s,right:a}}function Ake(){return 0}var HA=N(()=>{"use strict";VA();uH();o(Td,"bisector");o(Ake,"zero")});function qA(t){return t===null?NaN:+t}var hH=N(()=>{"use strict";o(qA,"number")});var fH,dH,_ke,Dke,WA,pH=N(()=>{"use strict";VA();HA();hH();fH=Td(bd),dH=fH.right,_ke=fH.left,Dke=Td(qA).center,WA=dH});function mH({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):r}function Lke({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):(t.set(n,r),r)}function Rke({_intern:t,_key:e},r){let n=e(r);return t.has(n)&&(r=t.get(n),t.delete(n)),r}function Nke(t){return t!==null&&typeof t=="object"?t.valueOf():t}var D0,gH=N(()=>{"use strict";D0=class extends Map{static{o(this,"InternMap")}constructor(e,r=Nke){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),e!=null)for(let[n,i]of e)this.set(n,i)}get(e){return super.get(mH(this,e))}has(e){return super.has(mH(this,e))}set(e,r){return super.set(Lke(this,e),r)}delete(e){return super.delete(Rke(this,e))}};o(mH,"intern_get");o(Lke,"intern_set");o(Rke,"intern_delete");o(Nke,"keyof")});function H3(t,e,r){let n=(e-t)/Math.max(0,r),i=Math.floor(Math.log10(n)),a=n/Math.pow(10,i),s=a>=Mke?10:a>=Ike?5:a>=Oke?2:1,l,u,h;return i<0?(h=Math.pow(10,-i)/s,l=Math.round(t*h),u=Math.round(e*h),l/he&&--u,h=-h):(h=Math.pow(10,i)*s,l=Math.round(t/h),u=Math.round(e/h),l*he&&--u),u0))return[];if(t===e)return[t];let n=e=i))return[];let l=a-i+1,u=new Array(l);if(n)if(s<0)for(let h=0;h{"use strict";Mke=Math.sqrt(50),Ike=Math.sqrt(10),Oke=Math.sqrt(2);o(H3,"tickSpec");o(q3,"ticks");o(lv,"tickIncrement");o(L0,"tickStep")});function W3(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var vH=N(()=>{"use strict";o(W3,"max")});function Y3(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var xH=N(()=>{"use strict";o(Y3,"min")});function X3(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((e-t)/r))|0,a=new Array(i);++n{"use strict";o(X3,"range")});var Ch=N(()=>{"use strict";pH();HA();vH();xH();bH();yH();gH()});function YA(t){return t}var TH=N(()=>{"use strict";o(YA,"default")});function Pke(t){return"translate("+t+",0)"}function Bke(t){return"translate(0,"+t+")"}function Fke(t){return e=>+t(e)}function $ke(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),r=>+t(r)+e}function zke(){return!this.__axis}function kH(t,e){var r=[],n=null,i=null,a=6,s=6,l=3,u=typeof window<"u"&&window.devicePixelRatio>1?0:.5,h=t===K3||t===j3?-1:1,f=t===j3||t===XA?"x":"y",d=t===K3||t===jA?Pke:Bke;function p(m){var g=n??(e.ticks?e.ticks.apply(e,r):e.domain()),y=i??(e.tickFormat?e.tickFormat.apply(e,r):YA),v=Math.max(a,0)+l,x=e.range(),b=+x[0]+u,T=+x[x.length-1]+u,S=(e.bandwidth?$ke:Fke)(e.copy(),u),w=m.selection?m.selection():m,k=w.selectAll(".domain").data([null]),A=w.selectAll(".tick").data(g,e).order(),C=A.exit(),R=A.enter().append("g").attr("class","tick"),I=A.select("line"),L=A.select("text");k=k.merge(k.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),A=A.merge(R),I=I.merge(R.append("line").attr("stroke","currentColor").attr(f+"2",h*a)),L=L.merge(R.append("text").attr("fill","currentColor").attr(f,h*v).attr("dy",t===K3?"0em":t===jA?"0.71em":"0.32em")),m!==w&&(k=k.transition(m),A=A.transition(m),I=I.transition(m),L=L.transition(m),C=C.transition(m).attr("opacity",wH).attr("transform",function(E){return isFinite(E=S(E))?d(E+u):this.getAttribute("transform")}),R.attr("opacity",wH).attr("transform",function(E){var D=this.parentNode.__axis;return d((D&&isFinite(D=D(E))?D:S(E))+u)})),C.remove(),k.attr("d",t===j3||t===XA?s?"M"+h*s+","+b+"H"+u+"V"+T+"H"+h*s:"M"+u+","+b+"V"+T:s?"M"+b+","+h*s+"V"+u+"H"+T+"V"+h*s:"M"+b+","+u+"H"+T),A.attr("opacity",1).attr("transform",function(E){return d(S(E)+u)}),I.attr(f+"2",h*a),L.attr(f,h*v).text(y),w.filter(zke).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===XA?"start":t===j3?"end":"middle"),w.each(function(){this.__axis=S})}return o(p,"axis"),p.scale=function(m){return arguments.length?(e=m,p):e},p.ticks=function(){return r=Array.from(arguments),p},p.tickArguments=function(m){return arguments.length?(r=m==null?[]:Array.from(m),p):r.slice()},p.tickValues=function(m){return arguments.length?(n=m==null?null:Array.from(m),p):n&&n.slice()},p.tickFormat=function(m){return arguments.length?(i=m,p):i},p.tickSize=function(m){return arguments.length?(a=s=+m,p):a},p.tickSizeInner=function(m){return arguments.length?(a=+m,p):a},p.tickSizeOuter=function(m){return arguments.length?(s=+m,p):s},p.tickPadding=function(m){return arguments.length?(l=+m,p):l},p.offset=function(m){return arguments.length?(u=+m,p):u},p}function KA(t){return kH(K3,t)}function QA(t){return kH(jA,t)}var K3,XA,jA,j3,wH,EH=N(()=>{"use strict";TH();K3=1,XA=2,jA=3,j3=4,wH=1e-6;o(Pke,"translateX");o(Bke,"translateY");o(Fke,"number");o($ke,"center");o(zke,"entering");o(kH,"axis");o(KA,"axisTop");o(QA,"axisBottom")});var SH=N(()=>{"use strict";EH()});function AH(){for(var t=0,e=arguments.length,r={},n;t=0&&(n=r.slice(i+1),r=r.slice(0,i)),r&&!e.hasOwnProperty(r))throw new Error("unknown type: "+r);return{type:r,name:n}})}function Uke(t,e){for(var r=0,n=t.length,i;r{"use strict";Gke={value:o(()=>{},"value")};o(AH,"dispatch");o(Q3,"Dispatch");o(Vke,"parseTypenames");Q3.prototype=AH.prototype={constructor:Q3,on:o(function(t,e){var r=this._,n=Vke(t+"",r),i,a=-1,s=n.length;if(arguments.length<2){for(;++a0)for(var r=new Array(i),n=0,i,a;n{"use strict";_H()});var Z3,e8,t8=N(()=>{"use strict";Z3="http://www.w3.org/1999/xhtml",e8={svg:"http://www.w3.org/2000/svg",xhtml:Z3,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}});function sc(t){var e=t+="",r=e.indexOf(":");return r>=0&&(e=t.slice(0,r))!=="xmlns"&&(t=t.slice(r+1)),e8.hasOwnProperty(e)?{space:e8[e],local:t}:t}var J3=N(()=>{"use strict";t8();o(sc,"default")});function Hke(t){return function(){var e=this.ownerDocument,r=this.namespaceURI;return r===Z3&&e.documentElement.namespaceURI===Z3?e.createElement(t):e.createElementNS(r,t)}}function qke(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function cv(t){var e=sc(t);return(e.local?qke:Hke)(e)}var r8=N(()=>{"use strict";J3();t8();o(Hke,"creatorInherit");o(qke,"creatorFixed");o(cv,"default")});function Wke(){}function Ah(t){return t==null?Wke:function(){return this.querySelector(t)}}var e5=N(()=>{"use strict";o(Wke,"none");o(Ah,"default")});function n8(t){typeof t!="function"&&(t=Ah(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";gl();e5();o(n8,"default")});function i8(t){return t==null?[]:Array.isArray(t)?t:Array.from(t)}var LH=N(()=>{"use strict";o(i8,"array")});function Yke(){return[]}function R0(t){return t==null?Yke:function(){return this.querySelectorAll(t)}}var a8=N(()=>{"use strict";o(Yke,"empty");o(R0,"default")});function Xke(t){return function(){return i8(t.apply(this,arguments))}}function s8(t){typeof t=="function"?t=Xke(t):t=R0(t);for(var e=this._groups,r=e.length,n=[],i=[],a=0;a{"use strict";gl();LH();a8();o(Xke,"arrayAll");o(s8,"default")});function N0(t){return function(){return this.matches(t)}}function t5(t){return function(e){return e.matches(t)}}var uv=N(()=>{"use strict";o(N0,"default");o(t5,"childMatcher")});function Kke(t){return function(){return jke.call(this.children,t)}}function Qke(){return this.firstElementChild}function o8(t){return this.select(t==null?Qke:Kke(typeof t=="function"?t:t5(t)))}var jke,NH=N(()=>{"use strict";uv();jke=Array.prototype.find;o(Kke,"childFind");o(Qke,"childFirst");o(o8,"default")});function Jke(){return Array.from(this.children)}function eEe(t){return function(){return Zke.call(this.children,t)}}function l8(t){return this.selectAll(t==null?Jke:eEe(typeof t=="function"?t:t5(t)))}var Zke,MH=N(()=>{"use strict";uv();Zke=Array.prototype.filter;o(Jke,"children");o(eEe,"childrenFilter");o(l8,"default")});function c8(t){typeof t!="function"&&(t=N0(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";gl();uv();o(c8,"default")});function hv(t){return new Array(t.length)}var u8=N(()=>{"use strict";o(hv,"default")});function h8(){return new ui(this._enter||this._groups.map(hv),this._parents)}function fv(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}var f8=N(()=>{"use strict";u8();gl();o(h8,"default");o(fv,"EnterNode");fv.prototype={constructor:fv,appendChild:o(function(t){return this._parent.insertBefore(t,this._next)},"appendChild"),insertBefore:o(function(t,e){return this._parent.insertBefore(t,e)},"insertBefore"),querySelector:o(function(t){return this._parent.querySelector(t)},"querySelector"),querySelectorAll:o(function(t){return this._parent.querySelectorAll(t)},"querySelectorAll")}});function d8(t){return function(){return t}}var OH=N(()=>{"use strict";o(d8,"default")});function tEe(t,e,r,n,i,a){for(var s=0,l,u=e.length,h=a.length;s=T&&(T=b+1);!(w=v[T])&&++T{"use strict";gl();f8();OH();o(tEe,"bindIndex");o(rEe,"bindKey");o(nEe,"datum");o(p8,"default");o(iEe,"arraylike")});function m8(){return new ui(this._exit||this._groups.map(hv),this._parents)}var BH=N(()=>{"use strict";u8();gl();o(m8,"default")});function g8(t,e,r){var n=this.enter(),i=this,a=this.exit();return typeof t=="function"?(n=t(n),n&&(n=n.selection())):n=n.append(t+""),e!=null&&(i=e(i),i&&(i=i.selection())),r==null?a.remove():r(a),n&&i?n.merge(i).order():i}var FH=N(()=>{"use strict";o(g8,"default")});function y8(t){for(var e=t.selection?t.selection():t,r=this._groups,n=e._groups,i=r.length,a=n.length,s=Math.min(i,a),l=new Array(i),u=0;u{"use strict";gl();o(y8,"default")});function v8(){for(var t=this._groups,e=-1,r=t.length;++e=0;)(s=n[i])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}var zH=N(()=>{"use strict";o(v8,"default")});function x8(t){t||(t=aEe);function e(d,p){return d&&p?t(d.__data__,p.__data__):!d-!p}o(e,"compareNode");for(var r=this._groups,n=r.length,i=new Array(n),a=0;ae?1:t>=e?0:NaN}var GH=N(()=>{"use strict";gl();o(x8,"default");o(aEe,"ascending")});function b8(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}var VH=N(()=>{"use strict";o(b8,"default")});function T8(){return Array.from(this)}var UH=N(()=>{"use strict";o(T8,"default")});function w8(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(w8,"default")});function k8(){let t=0;for(let e of this)++t;return t}var qH=N(()=>{"use strict";o(k8,"default")});function E8(){return!this.node()}var WH=N(()=>{"use strict";o(E8,"default")});function S8(t){for(var e=this._groups,r=0,n=e.length;r{"use strict";o(S8,"default")});function sEe(t){return function(){this.removeAttribute(t)}}function oEe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function lEe(t,e){return function(){this.setAttribute(t,e)}}function cEe(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function uEe(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttribute(t):this.setAttribute(t,r)}}function hEe(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}}function C8(t,e){var r=sc(t);if(arguments.length<2){var n=this.node();return r.local?n.getAttributeNS(r.space,r.local):n.getAttribute(r)}return this.each((e==null?r.local?oEe:sEe:typeof e=="function"?r.local?hEe:uEe:r.local?cEe:lEe)(r,e))}var XH=N(()=>{"use strict";J3();o(sEe,"attrRemove");o(oEe,"attrRemoveNS");o(lEe,"attrConstant");o(cEe,"attrConstantNS");o(uEe,"attrFunction");o(hEe,"attrFunctionNS");o(C8,"default")});function dv(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}var A8=N(()=>{"use strict";o(dv,"default")});function fEe(t){return function(){this.style.removeProperty(t)}}function dEe(t,e,r){return function(){this.style.setProperty(t,e,r)}}function pEe(t,e,r){return function(){var n=e.apply(this,arguments);n==null?this.style.removeProperty(t):this.style.setProperty(t,n,r)}}function _8(t,e,r){return arguments.length>1?this.each((e==null?fEe:typeof e=="function"?pEe:dEe)(t,e,r??"")):_h(this.node(),t)}function _h(t,e){return t.style.getPropertyValue(e)||dv(t).getComputedStyle(t,null).getPropertyValue(e)}var D8=N(()=>{"use strict";A8();o(fEe,"styleRemove");o(dEe,"styleConstant");o(pEe,"styleFunction");o(_8,"default");o(_h,"styleValue")});function mEe(t){return function(){delete this[t]}}function gEe(t,e){return function(){this[t]=e}}function yEe(t,e){return function(){var r=e.apply(this,arguments);r==null?delete this[t]:this[t]=r}}function L8(t,e){return arguments.length>1?this.each((e==null?mEe:typeof e=="function"?yEe:gEe)(t,e)):this.node()[t]}var jH=N(()=>{"use strict";o(mEe,"propertyRemove");o(gEe,"propertyConstant");o(yEe,"propertyFunction");o(L8,"default")});function KH(t){return t.trim().split(/^|\s+/)}function R8(t){return t.classList||new QH(t)}function QH(t){this._node=t,this._names=KH(t.getAttribute("class")||"")}function ZH(t,e){for(var r=R8(t),n=-1,i=e.length;++n{"use strict";o(KH,"classArray");o(R8,"classList");o(QH,"ClassList");QH.prototype={add:o(function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},"add"),remove:o(function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},"remove"),contains:o(function(t){return this._names.indexOf(t)>=0},"contains")};o(ZH,"classedAdd");o(JH,"classedRemove");o(vEe,"classedTrue");o(xEe,"classedFalse");o(bEe,"classedFunction");o(N8,"default")});function TEe(){this.textContent=""}function wEe(t){return function(){this.textContent=t}}function kEe(t){return function(){var e=t.apply(this,arguments);this.textContent=e??""}}function M8(t){return arguments.length?this.each(t==null?TEe:(typeof t=="function"?kEe:wEe)(t)):this.node().textContent}var tq=N(()=>{"use strict";o(TEe,"textRemove");o(wEe,"textConstant");o(kEe,"textFunction");o(M8,"default")});function EEe(){this.innerHTML=""}function SEe(t){return function(){this.innerHTML=t}}function CEe(t){return function(){var e=t.apply(this,arguments);this.innerHTML=e??""}}function I8(t){return arguments.length?this.each(t==null?EEe:(typeof t=="function"?CEe:SEe)(t)):this.node().innerHTML}var rq=N(()=>{"use strict";o(EEe,"htmlRemove");o(SEe,"htmlConstant");o(CEe,"htmlFunction");o(I8,"default")});function AEe(){this.nextSibling&&this.parentNode.appendChild(this)}function O8(){return this.each(AEe)}var nq=N(()=>{"use strict";o(AEe,"raise");o(O8,"default")});function _Ee(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function P8(){return this.each(_Ee)}var iq=N(()=>{"use strict";o(_Ee,"lower");o(P8,"default")});function B8(t){var e=typeof t=="function"?t:cv(t);return this.select(function(){return this.appendChild(e.apply(this,arguments))})}var aq=N(()=>{"use strict";r8();o(B8,"default")});function DEe(){return null}function F8(t,e){var r=typeof t=="function"?t:cv(t),n=e==null?DEe:typeof e=="function"?e:Ah(e);return this.select(function(){return this.insertBefore(r.apply(this,arguments),n.apply(this,arguments)||null)})}var sq=N(()=>{"use strict";r8();e5();o(DEe,"constantNull");o(F8,"default")});function LEe(){var t=this.parentNode;t&&t.removeChild(this)}function $8(){return this.each(LEe)}var oq=N(()=>{"use strict";o(LEe,"remove");o($8,"default")});function REe(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function NEe(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function z8(t){return this.select(t?NEe:REe)}var lq=N(()=>{"use strict";o(REe,"selection_cloneShallow");o(NEe,"selection_cloneDeep");o(z8,"default")});function G8(t){return arguments.length?this.property("__data__",t):this.node().__data__}var cq=N(()=>{"use strict";o(G8,"default")});function MEe(t){return function(e){t.call(this,e,this.__data__)}}function IEe(t){return t.trim().split(/^|\s+/).map(function(e){var r="",n=e.indexOf(".");return n>=0&&(r=e.slice(n+1),e=e.slice(0,n)),{type:e,name:r}})}function OEe(t){return function(){var e=this.__on;if(e){for(var r=0,n=-1,i=e.length,a;r{"use strict";o(MEe,"contextListener");o(IEe,"parseTypenames");o(OEe,"onRemove");o(PEe,"onAdd");o(V8,"default")});function hq(t,e,r){var n=dv(t),i=n.CustomEvent;typeof i=="function"?i=new i(e,r):(i=n.document.createEvent("Event"),r?(i.initEvent(e,r.bubbles,r.cancelable),i.detail=r.detail):i.initEvent(e,!1,!1)),t.dispatchEvent(i)}function BEe(t,e){return function(){return hq(this,t,e)}}function FEe(t,e){return function(){return hq(this,t,e.apply(this,arguments))}}function U8(t,e){return this.each((typeof e=="function"?FEe:BEe)(t,e))}var fq=N(()=>{"use strict";A8();o(hq,"dispatchEvent");o(BEe,"dispatchConstant");o(FEe,"dispatchFunction");o(U8,"default")});function*H8(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(H8,"default")});function ui(t,e){this._groups=t,this._parents=e}function pq(){return new ui([[document.documentElement]],q8)}function $Ee(){return this}var q8,yu,gl=N(()=>{"use strict";DH();RH();NH();MH();IH();PH();f8();BH();FH();$H();zH();GH();VH();UH();HH();qH();WH();YH();XH();D8();jH();eq();tq();rq();nq();iq();aq();sq();oq();lq();cq();uq();fq();dq();q8=[null];o(ui,"Selection");o(pq,"selection");o($Ee,"selection_selection");ui.prototype=pq.prototype={constructor:ui,select:n8,selectAll:s8,selectChild:o8,selectChildren:l8,filter:c8,data:p8,enter:h8,exit:m8,join:g8,merge:y8,selection:$Ee,order:v8,sort:x8,call:b8,nodes:T8,node:w8,size:k8,empty:E8,each:S8,attr:C8,style:_8,property:L8,classed:N8,text:M8,html:I8,raise:O8,lower:P8,append:B8,insert:F8,remove:$8,clone:z8,datum:G8,on:V8,dispatch:U8,[Symbol.iterator]:H8};yu=pq});function qe(t){return typeof t=="string"?new ui([[document.querySelector(t)]],[document.documentElement]):new ui([[t]],q8)}var mq=N(()=>{"use strict";gl();o(qe,"default")});var yl=N(()=>{"use strict";uv();J3();mq();gl();e5();a8();D8()});var gq=N(()=>{"use strict"});function Dh(t,e,r){t.prototype=e.prototype=r,r.constructor=t}function M0(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}var W8=N(()=>{"use strict";o(Dh,"default");o(M0,"extend")});function Lh(){}function vq(){return this.rgb().formatHex()}function YEe(){return this.rgb().formatHex8()}function XEe(){return Sq(this).formatHsl()}function xq(){return this.rgb().formatRgb()}function xl(t){var e,r;return t=(t+"").trim().toLowerCase(),(e=zEe.exec(t))?(r=e[1].length,e=parseInt(e[1],16),r===6?bq(e):r===3?new oa(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):r===8?r5(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):r===4?r5(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=GEe.exec(t))?new oa(e[1],e[2],e[3],1):(e=VEe.exec(t))?new oa(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=UEe.exec(t))?r5(e[1],e[2],e[3],e[4]):(e=HEe.exec(t))?r5(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=qEe.exec(t))?kq(e[1],e[2]/100,e[3]/100,1):(e=WEe.exec(t))?kq(e[1],e[2]/100,e[3]/100,e[4]):yq.hasOwnProperty(t)?bq(yq[t]):t==="transparent"?new oa(NaN,NaN,NaN,0):null}function bq(t){return new oa(t>>16&255,t>>8&255,t&255,1)}function r5(t,e,r,n){return n<=0&&(t=e=r=NaN),new oa(t,e,r,n)}function X8(t){return t instanceof Lh||(t=xl(t)),t?(t=t.rgb(),new oa(t.r,t.g,t.b,t.opacity)):new oa}function O0(t,e,r,n){return arguments.length===1?X8(t):new oa(t,e,r,n??1)}function oa(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function Tq(){return`#${wd(this.r)}${wd(this.g)}${wd(this.b)}`}function jEe(){return`#${wd(this.r)}${wd(this.g)}${wd(this.b)}${wd((isNaN(this.opacity)?1:this.opacity)*255)}`}function wq(){let t=a5(this.opacity);return`${t===1?"rgb(":"rgba("}${kd(this.r)}, ${kd(this.g)}, ${kd(this.b)}${t===1?")":`, ${t})`}`}function a5(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function kd(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function wd(t){return t=kd(t),(t<16?"0":"")+t.toString(16)}function kq(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new vl(t,e,r,n)}function Sq(t){if(t instanceof vl)return new vl(t.h,t.s,t.l,t.opacity);if(t instanceof Lh||(t=xl(t)),!t)return new vl;if(t instanceof vl)return t;t=t.rgb();var e=t.r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),a=Math.max(e,r,n),s=NaN,l=a-i,u=(a+i)/2;return l?(e===a?s=(r-n)/l+(r0&&u<1?0:s,new vl(s,l,u,t.opacity)}function Cq(t,e,r,n){return arguments.length===1?Sq(t):new vl(t,e,r,n??1)}function vl(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function Eq(t){return t=(t||0)%360,t<0?t+360:t}function n5(t){return Math.max(0,Math.min(1,t||0))}function Y8(t,e,r){return(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)*255}var pv,i5,I0,mv,oc,zEe,GEe,VEe,UEe,HEe,qEe,WEe,yq,j8=N(()=>{"use strict";W8();o(Lh,"Color");pv=.7,i5=1/pv,I0="\\s*([+-]?\\d+)\\s*",mv="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",oc="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",zEe=/^#([0-9a-f]{3,8})$/,GEe=new RegExp(`^rgb\\(${I0},${I0},${I0}\\)$`),VEe=new RegExp(`^rgb\\(${oc},${oc},${oc}\\)$`),UEe=new RegExp(`^rgba\\(${I0},${I0},${I0},${mv}\\)$`),HEe=new RegExp(`^rgba\\(${oc},${oc},${oc},${mv}\\)$`),qEe=new RegExp(`^hsl\\(${mv},${oc},${oc}\\)$`),WEe=new RegExp(`^hsla\\(${mv},${oc},${oc},${mv}\\)$`),yq={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Dh(Lh,xl,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:vq,formatHex:vq,formatHex8:YEe,formatHsl:XEe,formatRgb:xq,toString:xq});o(vq,"color_formatHex");o(YEe,"color_formatHex8");o(XEe,"color_formatHsl");o(xq,"color_formatRgb");o(xl,"color");o(bq,"rgbn");o(r5,"rgba");o(X8,"rgbConvert");o(O0,"rgb");o(oa,"Rgb");Dh(oa,O0,M0(Lh,{brighter(t){return t=t==null?i5:Math.pow(i5,t),new oa(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?pv:Math.pow(pv,t),new oa(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new oa(kd(this.r),kd(this.g),kd(this.b),a5(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Tq,formatHex:Tq,formatHex8:jEe,formatRgb:wq,toString:wq}));o(Tq,"rgb_formatHex");o(jEe,"rgb_formatHex8");o(wq,"rgb_formatRgb");o(a5,"clampa");o(kd,"clampi");o(wd,"hex");o(kq,"hsla");o(Sq,"hslConvert");o(Cq,"hsl");o(vl,"Hsl");Dh(vl,Cq,M0(Lh,{brighter(t){return t=t==null?i5:Math.pow(i5,t),new vl(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?pv:Math.pow(pv,t),new vl(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new oa(Y8(t>=240?t-240:t+120,i,n),Y8(t,i,n),Y8(t<120?t+240:t-120,i,n),this.opacity)},clamp(){return new vl(Eq(this.h),n5(this.s),n5(this.l),a5(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=a5(this.opacity);return`${t===1?"hsl(":"hsla("}${Eq(this.h)}, ${n5(this.s)*100}%, ${n5(this.l)*100}%${t===1?")":`, ${t})`}`}}));o(Eq,"clamph");o(n5,"clampt");o(Y8,"hsl2rgb")});var Aq,_q,Dq=N(()=>{"use strict";Aq=Math.PI/180,_q=180/Math.PI});function Oq(t){if(t instanceof lc)return new lc(t.l,t.a,t.b,t.opacity);if(t instanceof vu)return Pq(t);t instanceof oa||(t=X8(t));var e=J8(t.r),r=J8(t.g),n=J8(t.b),i=K8((.2225045*e+.7168786*r+.0606169*n)/Rq),a,s;return e===r&&r===n?a=s=i:(a=K8((.4360747*e+.3850649*r+.1430804*n)/Lq),s=K8((.0139322*e+.0971045*r+.7141733*n)/Nq)),new lc(116*i-16,500*(a-i),200*(i-s),t.opacity)}function e_(t,e,r,n){return arguments.length===1?Oq(t):new lc(t,e,r,n??1)}function lc(t,e,r,n){this.l=+t,this.a=+e,this.b=+r,this.opacity=+n}function K8(t){return t>KEe?Math.pow(t,1/3):t/Iq+Mq}function Q8(t){return t>P0?t*t*t:Iq*(t-Mq)}function Z8(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function J8(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function QEe(t){if(t instanceof vu)return new vu(t.h,t.c,t.l,t.opacity);if(t instanceof lc||(t=Oq(t)),t.a===0&&t.b===0)return new vu(NaN,0{"use strict";W8();j8();Dq();s5=18,Lq=.96422,Rq=1,Nq=.82521,Mq=4/29,P0=6/29,Iq=3*P0*P0,KEe=P0*P0*P0;o(Oq,"labConvert");o(e_,"lab");o(lc,"Lab");Dh(lc,e_,M0(Lh,{brighter(t){return new lc(this.l+s5*(t??1),this.a,this.b,this.opacity)},darker(t){return new lc(this.l-s5*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,r=isNaN(this.b)?t:t-this.b/200;return e=Lq*Q8(e),t=Rq*Q8(t),r=Nq*Q8(r),new oa(Z8(3.1338561*e-1.6168667*t-.4906146*r),Z8(-.9787684*e+1.9161415*t+.033454*r),Z8(.0719453*e-.2289914*t+1.4052427*r),this.opacity)}}));o(K8,"xyz2lab");o(Q8,"lab2xyz");o(Z8,"lrgb2rgb");o(J8,"rgb2lrgb");o(QEe,"hclConvert");o(gv,"hcl");o(vu,"Hcl");o(Pq,"hcl2lab");Dh(vu,gv,M0(Lh,{brighter(t){return new vu(this.h,this.c,this.l+s5*(t??1),this.opacity)},darker(t){return new vu(this.h,this.c,this.l-s5*(t??1),this.opacity)},rgb(){return Pq(this).rgb()}}))});var B0=N(()=>{"use strict";j8();Bq()});function t_(t,e,r,n,i){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*r+(1+3*t+3*a-3*s)*n+s*i)/6}function r_(t){var e=t.length-1;return function(r){var n=r<=0?r=0:r>=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],s=n>0?t[n-1]:2*i-a,l=n{"use strict";o(t_,"basis");o(r_,"default")});function i_(t){var e=t.length;return function(r){var n=Math.floor(((r%=1)<0?++r:r)*e),i=t[(n+e-1)%e],a=t[n%e],s=t[(n+1)%e],l=t[(n+2)%e];return t_((r-n/e)*e,i,a,s,l)}}var Fq=N(()=>{"use strict";n_();o(i_,"default")});var F0,a_=N(()=>{"use strict";F0=o(t=>()=>t,"default")});function $q(t,e){return function(r){return t+r*e}}function ZEe(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}function zq(t,e){var r=e-t;return r?$q(t,r>180||r<-180?r-360*Math.round(r/360):r):F0(isNaN(t)?e:t)}function Gq(t){return(t=+t)==1?xu:function(e,r){return r-e?ZEe(e,r,t):F0(isNaN(e)?r:e)}}function xu(t,e){var r=e-t;return r?$q(t,r):F0(isNaN(t)?e:t)}var s_=N(()=>{"use strict";a_();o($q,"linear");o(ZEe,"exponential");o(zq,"hue");o(Gq,"gamma");o(xu,"nogamma")});function Vq(t){return function(e){var r=e.length,n=new Array(r),i=new Array(r),a=new Array(r),s,l;for(s=0;s{"use strict";B0();n_();Fq();s_();Ed=o((function t(e){var r=Gq(e);function n(i,a){var s=r((i=O0(i)).r,(a=O0(a)).r),l=r(i.g,a.g),u=r(i.b,a.b),h=xu(i.opacity,a.opacity);return function(f){return i.r=s(f),i.g=l(f),i.b=u(f),i.opacity=h(f),i+""}}return o(n,"rgb"),n.gamma=t,n}),"rgbGamma")(1);o(Vq,"rgbSpline");JEe=Vq(r_),eSe=Vq(i_)});function l_(t,e){e||(e=[]);var r=t?Math.min(e.length,t.length):0,n=e.slice(),i;return function(a){for(i=0;i{"use strict";o(l_,"default");o(Uq,"isNumberArray")});function qq(t,e){var r=e?e.length:0,n=t?Math.min(r,t.length):0,i=new Array(n),a=new Array(r),s;for(s=0;s{"use strict";o5();o(qq,"genericArray")});function c_(t,e){var r=new Date;return t=+t,e=+e,function(n){return r.setTime(t*(1-n)+e*n),r}}var Yq=N(()=>{"use strict";o(c_,"default")});function Wi(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}var yv=N(()=>{"use strict";o(Wi,"default")});function u_(t,e){var r={},n={},i;(t===null||typeof t!="object")&&(t={}),(e===null||typeof e!="object")&&(e={});for(i in e)i in t?r[i]=Rh(t[i],e[i]):n[i]=e[i];return function(a){for(i in r)n[i]=r[i](a);return n}}var Xq=N(()=>{"use strict";o5();o(u_,"default")});function tSe(t){return function(){return t}}function rSe(t){return function(e){return t(e)+""}}function $0(t,e){var r=f_.lastIndex=h_.lastIndex=0,n,i,a,s=-1,l=[],u=[];for(t=t+"",e=e+"";(n=f_.exec(t))&&(i=h_.exec(e));)(a=i.index)>r&&(a=e.slice(r,a),l[s]?l[s]+=a:l[++s]=a),(n=n[0])===(i=i[0])?l[s]?l[s]+=i:l[++s]=i:(l[++s]=null,u.push({i:s,x:Wi(n,i)})),r=h_.lastIndex;return r{"use strict";yv();f_=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,h_=new RegExp(f_.source,"g");o(tSe,"zero");o(rSe,"one");o($0,"default")});function Rh(t,e){var r=typeof e,n;return e==null||r==="boolean"?F0(e):(r==="number"?Wi:r==="string"?(n=xl(e))?(e=n,Ed):$0:e instanceof xl?Ed:e instanceof Date?c_:Uq(e)?l_:Array.isArray(e)?qq:typeof e.valueOf!="function"&&typeof e.toString!="function"||isNaN(e)?u_:Wi)(t,e)}var o5=N(()=>{"use strict";B0();o_();Wq();Yq();yv();Xq();d_();a_();Hq();o(Rh,"default")});function l5(t,e){return t=+t,e=+e,function(r){return Math.round(t*(1-r)+e*r)}}var jq=N(()=>{"use strict";o(l5,"default")});function u5(t,e,r,n,i,a){var s,l,u;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(u=t*r+e*n)&&(r-=t*u,n-=e*u),(l=Math.sqrt(r*r+n*n))&&(r/=l,n/=l,u/=l),t*n{"use strict";Kq=180/Math.PI,c5={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};o(u5,"default")});function Zq(t){let e=new(typeof DOMMatrix=="function"?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?c5:u5(e.a,e.b,e.c,e.d,e.e,e.f)}function Jq(t){return t==null?c5:(h5||(h5=document.createElementNS("http://www.w3.org/2000/svg","g")),h5.setAttribute("transform",t),(t=h5.transform.baseVal.consolidate())?(t=t.matrix,u5(t.a,t.b,t.c,t.d,t.e,t.f)):c5)}var h5,eW=N(()=>{"use strict";Qq();o(Zq,"parseCss");o(Jq,"parseSvg")});function tW(t,e,r,n){function i(h){return h.length?h.pop()+" ":""}o(i,"pop");function a(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push("translate(",null,e,null,r);g.push({i:y-4,x:Wi(h,d)},{i:y-2,x:Wi(f,p)})}else(d||p)&&m.push("translate("+d+e+p+r)}o(a,"translate");function s(h,f,d,p){h!==f?(h-f>180?f+=360:f-h>180&&(h+=360),p.push({i:d.push(i(d)+"rotate(",null,n)-2,x:Wi(h,f)})):f&&d.push(i(d)+"rotate("+f+n)}o(s,"rotate");function l(h,f,d,p){h!==f?p.push({i:d.push(i(d)+"skewX(",null,n)-2,x:Wi(h,f)}):f&&d.push(i(d)+"skewX("+f+n)}o(l,"skewX");function u(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push(i(m)+"scale(",null,",",null,")");g.push({i:y-4,x:Wi(h,d)},{i:y-2,x:Wi(f,p)})}else(d!==1||p!==1)&&m.push(i(m)+"scale("+d+","+p+")")}return o(u,"scale"),function(h,f){var d=[],p=[];return h=t(h),f=t(f),a(h.translateX,h.translateY,f.translateX,f.translateY,d,p),s(h.rotate,f.rotate,d,p),l(h.skewX,f.skewX,d,p),u(h.scaleX,h.scaleY,f.scaleX,f.scaleY,d,p),h=f=null,function(m){for(var g=-1,y=p.length,v;++g{"use strict";yv();eW();o(tW,"interpolateTransform");p_=tW(Zq,"px, ","px)","deg)"),m_=tW(Jq,", ",")",")")});function nW(t){return function(e,r){var n=t((e=gv(e)).h,(r=gv(r)).h),i=xu(e.c,r.c),a=xu(e.l,r.l),s=xu(e.opacity,r.opacity);return function(l){return e.h=n(l),e.c=i(l),e.l=a(l),e.opacity=s(l),e+""}}}var g_,nSe,iW=N(()=>{"use strict";B0();s_();o(nW,"hcl");g_=nW(zq),nSe=nW(xu)});var z0=N(()=>{"use strict";o5();yv();jq();d_();rW();o_();iW()});function kv(){return Sd||(oW(iSe),Sd=Tv.now()+p5)}function iSe(){Sd=0}function wv(){this._call=this._time=this._next=null}function m5(t,e,r){var n=new wv;return n.restart(t,e,r),n}function lW(){kv(),++G0;for(var t=f5,e;t;)(e=Sd-t._time)>=0&&t._call.call(void 0,e),t=t._next;--G0}function aW(){Sd=(d5=Tv.now())+p5,G0=xv=0;try{lW()}finally{G0=0,sSe(),Sd=0}}function aSe(){var t=Tv.now(),e=t-d5;e>sW&&(p5-=e,d5=t)}function sSe(){for(var t,e=f5,r,n=1/0;e;)e._call?(n>e._time&&(n=e._time),t=e,e=e._next):(r=e._next,e._next=null,e=t?t._next=r:f5=r);bv=t,y_(n)}function y_(t){if(!G0){xv&&(xv=clearTimeout(xv));var e=t-Sd;e>24?(t<1/0&&(xv=setTimeout(aW,t-Tv.now()-p5)),vv&&(vv=clearInterval(vv))):(vv||(d5=Tv.now(),vv=setInterval(aSe,sW)),G0=1,oW(aW))}}var G0,xv,vv,sW,f5,bv,d5,Sd,p5,Tv,oW,v_=N(()=>{"use strict";G0=0,xv=0,vv=0,sW=1e3,d5=0,Sd=0,p5=0,Tv=typeof performance=="object"&&performance.now?performance:Date,oW=typeof window=="object"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};o(kv,"now");o(iSe,"clearNow");o(wv,"Timer");wv.prototype=m5.prototype={constructor:wv,restart:o(function(t,e,r){if(typeof t!="function")throw new TypeError("callback is not a function");r=(r==null?kv():+r)+(e==null?0:+e),!this._next&&bv!==this&&(bv?bv._next=this:f5=this,bv=this),this._call=t,this._time=r,y_()},"restart"),stop:o(function(){this._call&&(this._call=null,this._time=1/0,y_())},"stop")};o(m5,"timer");o(lW,"timerFlush");o(aW,"wake");o(aSe,"poke");o(sSe,"nap");o(y_,"sleep")});function Ev(t,e,r){var n=new wv;return e=e==null?0:+e,n.restart(i=>{n.stop(),t(i+e)},e,r),n}var cW=N(()=>{"use strict";v_();o(Ev,"default")});var g5=N(()=>{"use strict";v_();cW()});function bu(t,e,r,n,i,a){var s=t.__transition;if(!s)t.__transition={};else if(r in s)return;cSe(t,r,{name:e,index:n,group:i,on:oSe,tween:lSe,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:fW})}function Cv(t,e){var r=Oi(t,e);if(r.state>fW)throw new Error("too late; already scheduled");return r}function la(t,e){var r=Oi(t,e);if(r.state>y5)throw new Error("too late; already running");return r}function Oi(t,e){var r=t.__transition;if(!r||!(r=r[e]))throw new Error("transition not found");return r}function cSe(t,e,r){var n=t.__transition,i;n[e]=r,r.timer=m5(a,0,r.time);function a(h){r.state=uW,r.timer.restart(s,r.delay,r.time),r.delay<=h&&s(h-r.delay)}o(a,"schedule");function s(h){var f,d,p,m;if(r.state!==uW)return u();for(f in n)if(m=n[f],m.name===r.name){if(m.state===y5)return Ev(s);m.state===hW?(m.state=Sv,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete n[f]):+f{"use strict";JA();g5();oSe=ZA("start","end","cancel","interrupt"),lSe=[],fW=0,uW=1,v5=2,y5=3,hW=4,x5=5,Sv=6;o(bu,"default");o(Cv,"init");o(la,"set");o(Oi,"get");o(cSe,"create")});function Av(t,e){var r=t.__transition,n,i,a=!0,s;if(r){e=e==null?null:e+"";for(s in r){if((n=r[s]).name!==e){a=!1;continue}i=n.state>v5&&n.state{"use strict";Ds();o(Av,"default")});function x_(t){return this.each(function(){Av(this,t)})}var pW=N(()=>{"use strict";dW();o(x_,"default")});function uSe(t,e){var r,n;return function(){var i=la(this,t),a=i.tween;if(a!==r){n=r=a;for(var s=0,l=n.length;s{"use strict";Ds();o(uSe,"tweenRemove");o(hSe,"tweenFunction");o(b_,"default");o(V0,"tweenValue")});function Dv(t,e){var r;return(typeof e=="number"?Wi:e instanceof xl?Ed:(r=xl(e))?(e=r,Ed):$0)(t,e)}var T_=N(()=>{"use strict";B0();z0();o(Dv,"default")});function fSe(t){return function(){this.removeAttribute(t)}}function dSe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function pSe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttribute(t);return s===i?null:s===n?a:a=e(n=s,r)}}function mSe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttributeNS(t.space,t.local);return s===i?null:s===n?a:a=e(n=s,r)}}function gSe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttribute(t):(s=this.getAttribute(t),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function ySe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttributeNS(t.space,t.local):(s=this.getAttributeNS(t.space,t.local),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function w_(t,e){var r=sc(t),n=r==="transform"?m_:Dv;return this.attrTween(t,typeof e=="function"?(r.local?ySe:gSe)(r,n,V0(this,"attr."+t,e)):e==null?(r.local?dSe:fSe)(r):(r.local?mSe:pSe)(r,n,e))}var mW=N(()=>{"use strict";z0();yl();_v();T_();o(fSe,"attrRemove");o(dSe,"attrRemoveNS");o(pSe,"attrConstant");o(mSe,"attrConstantNS");o(gSe,"attrFunction");o(ySe,"attrFunctionNS");o(w_,"default")});function vSe(t,e){return function(r){this.setAttribute(t,e.call(this,r))}}function xSe(t,e){return function(r){this.setAttributeNS(t.space,t.local,e.call(this,r))}}function bSe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&xSe(t,a)),r}return o(i,"tween"),i._value=e,i}function TSe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&vSe(t,a)),r}return o(i,"tween"),i._value=e,i}function k_(t,e){var r="attr."+t;if(arguments.length<2)return(r=this.tween(r))&&r._value;if(e==null)return this.tween(r,null);if(typeof e!="function")throw new Error;var n=sc(t);return this.tween(r,(n.local?bSe:TSe)(n,e))}var gW=N(()=>{"use strict";yl();o(vSe,"attrInterpolate");o(xSe,"attrInterpolateNS");o(bSe,"attrTweenNS");o(TSe,"attrTween");o(k_,"default")});function wSe(t,e){return function(){Cv(this,t).delay=+e.apply(this,arguments)}}function kSe(t,e){return e=+e,function(){Cv(this,t).delay=e}}function E_(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?wSe:kSe)(e,t)):Oi(this.node(),e).delay}var yW=N(()=>{"use strict";Ds();o(wSe,"delayFunction");o(kSe,"delayConstant");o(E_,"default")});function ESe(t,e){return function(){la(this,t).duration=+e.apply(this,arguments)}}function SSe(t,e){return e=+e,function(){la(this,t).duration=e}}function S_(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?ESe:SSe)(e,t)):Oi(this.node(),e).duration}var vW=N(()=>{"use strict";Ds();o(ESe,"durationFunction");o(SSe,"durationConstant");o(S_,"default")});function CSe(t,e){if(typeof e!="function")throw new Error;return function(){la(this,t).ease=e}}function C_(t){var e=this._id;return arguments.length?this.each(CSe(e,t)):Oi(this.node(),e).ease}var xW=N(()=>{"use strict";Ds();o(CSe,"easeConstant");o(C_,"default")});function ASe(t,e){return function(){var r=e.apply(this,arguments);if(typeof r!="function")throw new Error;la(this,t).ease=r}}function A_(t){if(typeof t!="function")throw new Error;return this.each(ASe(this._id,t))}var bW=N(()=>{"use strict";Ds();o(ASe,"easeVarying");o(A_,"default")});function __(t){typeof t!="function"&&(t=N0(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";yl();Cd();o(__,"default")});function D_(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,r=t._groups,n=e.length,i=r.length,a=Math.min(n,i),s=new Array(n),l=0;l{"use strict";Cd();o(D_,"default")});function _Se(t){return(t+"").trim().split(/^|\s+/).every(function(e){var r=e.indexOf(".");return r>=0&&(e=e.slice(0,r)),!e||e==="start"})}function DSe(t,e,r){var n,i,a=_Se(e)?Cv:la;return function(){var s=a(this,t),l=s.on;l!==n&&(i=(n=l).copy()).on(e,r),s.on=i}}function L_(t,e){var r=this._id;return arguments.length<2?Oi(this.node(),r).on.on(t):this.each(DSe(r,t,e))}var kW=N(()=>{"use strict";Ds();o(_Se,"start");o(DSe,"onFunction");o(L_,"default")});function LSe(t){return function(){var e=this.parentNode;for(var r in this.__transition)if(+r!==t)return;e&&e.removeChild(this)}}function R_(){return this.on("end.remove",LSe(this._id))}var EW=N(()=>{"use strict";o(LSe,"removeFunction");o(R_,"default")});function N_(t){var e=this._name,r=this._id;typeof t!="function"&&(t=Ah(t));for(var n=this._groups,i=n.length,a=new Array(i),s=0;s{"use strict";yl();Cd();Ds();o(N_,"default")});function M_(t){var e=this._name,r=this._id;typeof t!="function"&&(t=R0(t));for(var n=this._groups,i=n.length,a=[],s=[],l=0;l{"use strict";yl();Cd();Ds();o(M_,"default")});function I_(){return new RSe(this._groups,this._parents)}var RSe,AW=N(()=>{"use strict";yl();RSe=yu.prototype.constructor;o(I_,"default")});function NSe(t,e){var r,n,i;return function(){var a=_h(this,t),s=(this.style.removeProperty(t),_h(this,t));return a===s?null:a===r&&s===n?i:i=e(r=a,n=s)}}function _W(t){return function(){this.style.removeProperty(t)}}function MSe(t,e,r){var n,i=r+"",a;return function(){var s=_h(this,t);return s===i?null:s===n?a:a=e(n=s,r)}}function ISe(t,e,r){var n,i,a;return function(){var s=_h(this,t),l=r(this),u=l+"";return l==null&&(u=l=(this.style.removeProperty(t),_h(this,t))),s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l))}}function OSe(t,e){var r,n,i,a="style."+e,s="end."+a,l;return function(){var u=la(this,t),h=u.on,f=u.value[a]==null?l||(l=_W(e)):void 0;(h!==r||i!==f)&&(n=(r=h).copy()).on(s,i=f),u.on=n}}function O_(t,e,r){var n=(t+="")=="transform"?p_:Dv;return e==null?this.styleTween(t,NSe(t,n)).on("end.style."+t,_W(t)):typeof e=="function"?this.styleTween(t,ISe(t,n,V0(this,"style."+t,e))).each(OSe(this._id,t)):this.styleTween(t,MSe(t,n,e),r).on("end.style."+t,null)}var DW=N(()=>{"use strict";z0();yl();Ds();_v();T_();o(NSe,"styleNull");o(_W,"styleRemove");o(MSe,"styleConstant");o(ISe,"styleFunction");o(OSe,"styleMaybeRemove");o(O_,"default")});function PSe(t,e,r){return function(n){this.style.setProperty(t,e.call(this,n),r)}}function BSe(t,e,r){var n,i;function a(){var s=e.apply(this,arguments);return s!==i&&(n=(i=s)&&PSe(t,s,r)),n}return o(a,"tween"),a._value=e,a}function P_(t,e,r){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(e==null)return this.tween(n,null);if(typeof e!="function")throw new Error;return this.tween(n,BSe(t,e,r??""))}var LW=N(()=>{"use strict";o(PSe,"styleInterpolate");o(BSe,"styleTween");o(P_,"default")});function FSe(t){return function(){this.textContent=t}}function $Se(t){return function(){var e=t(this);this.textContent=e??""}}function B_(t){return this.tween("text",typeof t=="function"?$Se(V0(this,"text",t)):FSe(t==null?"":t+""))}var RW=N(()=>{"use strict";_v();o(FSe,"textConstant");o($Se,"textFunction");o(B_,"default")});function zSe(t){return function(e){this.textContent=t.call(this,e)}}function GSe(t){var e,r;function n(){var i=t.apply(this,arguments);return i!==r&&(e=(r=i)&&zSe(i)),e}return o(n,"tween"),n._value=t,n}function F_(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(t==null)return this.tween(e,null);if(typeof t!="function")throw new Error;return this.tween(e,GSe(t))}var NW=N(()=>{"use strict";o(zSe,"textInterpolate");o(GSe,"textTween");o(F_,"default")});function $_(){for(var t=this._name,e=this._id,r=b5(),n=this._groups,i=n.length,a=0;a{"use strict";Cd();Ds();o($_,"default")});function z_(){var t,e,r=this,n=r._id,i=r.size();return new Promise(function(a,s){var l={value:s},u={value:o(function(){--i===0&&a()},"value")};r.each(function(){var h=la(this,n),f=h.on;f!==t&&(e=(t=f).copy(),e._.cancel.push(l),e._.interrupt.push(l),e._.end.push(u)),h.on=e}),i===0&&a()})}var IW=N(()=>{"use strict";Ds();o(z_,"default")});function is(t,e,r,n){this._groups=t,this._parents=e,this._name=r,this._id=n}function OW(t){return yu().transition(t)}function b5(){return++VSe}var VSe,Tu,Cd=N(()=>{"use strict";yl();mW();gW();yW();vW();xW();bW();TW();wW();kW();EW();SW();CW();AW();DW();LW();RW();NW();MW();_v();IW();VSe=0;o(is,"Transition");o(OW,"transition");o(b5,"newId");Tu=yu.prototype;is.prototype=OW.prototype={constructor:is,select:N_,selectAll:M_,selectChild:Tu.selectChild,selectChildren:Tu.selectChildren,filter:__,merge:D_,selection:I_,transition:$_,call:Tu.call,nodes:Tu.nodes,node:Tu.node,size:Tu.size,empty:Tu.empty,each:Tu.each,on:L_,attr:w_,attrTween:k_,style:O_,styleTween:P_,text:B_,textTween:F_,remove:R_,tween:b_,delay:E_,duration:S_,ease:C_,easeVarying:A_,end:z_,[Symbol.iterator]:Tu[Symbol.iterator]}});function T5(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}var PW=N(()=>{"use strict";o(T5,"cubicInOut")});var G_=N(()=>{"use strict";PW()});function HSe(t,e){for(var r;!(r=t.__transition)||!(r=r[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return r}function V_(t){var e,r;t instanceof is?(e=t._id,t=t._name):(e=b5(),(r=USe).time=kv(),t=t==null?null:t+"");for(var n=this._groups,i=n.length,a=0;a{"use strict";Cd();Ds();G_();g5();USe={time:null,delay:0,duration:250,ease:T5};o(HSe,"inherit");o(V_,"default")});var FW=N(()=>{"use strict";yl();pW();BW();yu.prototype.interrupt=x_;yu.prototype.transition=V_});var w5=N(()=>{"use strict";FW()});var $W=N(()=>{"use strict"});var zW=N(()=>{"use strict"});var GW=N(()=>{"use strict"});function VW(t){return[+t[0],+t[1]]}function qSe(t){return[VW(t[0]),VW(t[1])]}function U_(t){return{type:t}}var c1t,u1t,h1t,f1t,d1t,p1t,UW=N(()=>{"use strict";w5();$W();zW();GW();({abs:c1t,max:u1t,min:h1t}=Math);o(VW,"number1");o(qSe,"number2");f1t={name:"x",handles:["w","e"].map(U_),input:o(function(t,e){return t==null?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},"input"),output:o(function(t){return t&&[t[0][0],t[1][0]]},"output")},d1t={name:"y",handles:["n","s"].map(U_),input:o(function(t,e){return t==null?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},"input"),output:o(function(t){return t&&[t[0][1],t[1][1]]},"output")},p1t={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(U_),input:o(function(t){return t==null?null:qSe(t)},"input"),output:o(function(t){return t},"output")};o(U_,"type")});var HW=N(()=>{"use strict";UW()});function qW(t){this._+=t[0];for(let e=1,r=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return qW;let r=10**e;return function(n){this._+=n[0];for(let i=1,a=n.length;i{"use strict";H_=Math.PI,q_=2*H_,Ad=1e-6,WSe=q_-Ad;o(qW,"append");o(YSe,"appendRound");_d=class{static{o(this,"Path")}constructor(e){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=e==null?qW:YSe(e)}moveTo(e,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(e,r){this._append`L${this._x1=+e},${this._y1=+r}`}quadraticCurveTo(e,r,n,i){this._append`Q${+e},${+r},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(e,r,n,i,a,s){this._append`C${+e},${+r},${+n},${+i},${this._x1=+a},${this._y1=+s}`}arcTo(e,r,n,i,a){if(e=+e,r=+r,n=+n,i=+i,a=+a,a<0)throw new Error(`negative radius: ${a}`);let s=this._x1,l=this._y1,u=n-e,h=i-r,f=s-e,d=l-r,p=f*f+d*d;if(this._x1===null)this._append`M${this._x1=e},${this._y1=r}`;else if(p>Ad)if(!(Math.abs(d*u-h*f)>Ad)||!a)this._append`L${this._x1=e},${this._y1=r}`;else{let m=n-s,g=i-l,y=u*u+h*h,v=m*m+g*g,x=Math.sqrt(y),b=Math.sqrt(p),T=a*Math.tan((H_-Math.acos((y+p-v)/(2*x*b)))/2),S=T/b,w=T/x;Math.abs(S-1)>Ad&&this._append`L${e+S*f},${r+S*d}`,this._append`A${a},${a},0,0,${+(d*m>f*g)},${this._x1=e+w*u},${this._y1=r+w*h}`}}arc(e,r,n,i,a,s){if(e=+e,r=+r,n=+n,s=!!s,n<0)throw new Error(`negative radius: ${n}`);let l=n*Math.cos(i),u=n*Math.sin(i),h=e+l,f=r+u,d=1^s,p=s?i-a:a-i;this._x1===null?this._append`M${h},${f}`:(Math.abs(this._x1-h)>Ad||Math.abs(this._y1-f)>Ad)&&this._append`L${h},${f}`,n&&(p<0&&(p=p%q_+q_),p>WSe?this._append`A${n},${n},0,1,${d},${e-l},${r-u}A${n},${n},0,1,${d},${this._x1=h},${this._y1=f}`:p>Ad&&this._append`A${n},${n},0,${+(p>=H_)},${d},${this._x1=e+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(e,r,n,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}};o(WW,"path");WW.prototype=_d.prototype});var W_=N(()=>{"use strict";YW()});var XW=N(()=>{"use strict"});var jW=N(()=>{"use strict"});var KW=N(()=>{"use strict"});var QW=N(()=>{"use strict"});var ZW=N(()=>{"use strict"});var JW=N(()=>{"use strict"});var eY=N(()=>{"use strict"});function Y_(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function Dd(t,e){if((r=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var r,n=t.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+t.slice(r+1)]}var Lv=N(()=>{"use strict";o(Y_,"default");o(Dd,"formatDecimalParts")});function bl(t){return t=Dd(Math.abs(t)),t?t[1]:NaN}var Rv=N(()=>{"use strict";Lv();o(bl,"default")});function X_(t,e){return function(r,n){for(var i=r.length,a=[],s=0,l=t[0],u=0;i>0&&l>0&&(u+l+1>n&&(l=Math.max(1,n-u)),a.push(r.substring(i-=l,i+l)),!((u+=l+1)>n));)l=t[s=(s+1)%t.length];return a.reverse().join(e)}}var tY=N(()=>{"use strict";o(X_,"default")});function j_(t){return function(e){return e.replace(/[0-9]/g,function(r){return t[+r]})}}var rY=N(()=>{"use strict";o(j_,"default")});function Nh(t){if(!(e=XSe.exec(t)))throw new Error("invalid format: "+t);var e;return new k5({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function k5(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}var XSe,K_=N(()=>{"use strict";XSe=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;o(Nh,"formatSpecifier");Nh.prototype=k5.prototype;o(k5,"FormatSpecifier");k5.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type}});function Q_(t){e:for(var e=t.length,r=1,n=-1,i;r0&&(n=0);break}return n>0?t.slice(0,n)+t.slice(i+1):t}var nY=N(()=>{"use strict";o(Q_,"default")});function J_(t,e){var r=Dd(t,e);if(!r)return t+"";var n=r[0],i=r[1],a=i-(Z_=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,s=n.length;return a===s?n:a>s?n+new Array(a-s+1).join("0"):a>0?n.slice(0,a)+"."+n.slice(a):"0."+new Array(1-a).join("0")+Dd(t,Math.max(0,e+a-1))[0]}var Z_,eD=N(()=>{"use strict";Lv();o(J_,"default")});function E5(t,e){var r=Dd(t,e);if(!r)return t+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}var iY=N(()=>{"use strict";Lv();o(E5,"default")});var tD,aY=N(()=>{"use strict";Lv();eD();iY();tD={"%":o((t,e)=>(t*100).toFixed(e),"%"),b:o(t=>Math.round(t).toString(2),"b"),c:o(t=>t+"","c"),d:Y_,e:o((t,e)=>t.toExponential(e),"e"),f:o((t,e)=>t.toFixed(e),"f"),g:o((t,e)=>t.toPrecision(e),"g"),o:o(t=>Math.round(t).toString(8),"o"),p:o((t,e)=>E5(t*100,e),"p"),r:E5,s:J_,X:o(t=>Math.round(t).toString(16).toUpperCase(),"X"),x:o(t=>Math.round(t).toString(16),"x")}});function S5(t){return t}var sY=N(()=>{"use strict";o(S5,"default")});function rD(t){var e=t.grouping===void 0||t.thousands===void 0?S5:X_(oY.call(t.grouping,Number),t.thousands+""),r=t.currency===void 0?"":t.currency[0]+"",n=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",a=t.numerals===void 0?S5:j_(oY.call(t.numerals,String)),s=t.percent===void 0?"%":t.percent+"",l=t.minus===void 0?"\u2212":t.minus+"",u=t.nan===void 0?"NaN":t.nan+"";function h(d){d=Nh(d);var p=d.fill,m=d.align,g=d.sign,y=d.symbol,v=d.zero,x=d.width,b=d.comma,T=d.precision,S=d.trim,w=d.type;w==="n"?(b=!0,w="g"):tD[w]||(T===void 0&&(T=12),S=!0,w="g"),(v||p==="0"&&m==="=")&&(v=!0,p="0",m="=");var k=y==="$"?r:y==="#"&&/[boxX]/.test(w)?"0"+w.toLowerCase():"",A=y==="$"?n:/[%p]/.test(w)?s:"",C=tD[w],R=/[defgprs%]/.test(w);T=T===void 0?6:/[gprs]/.test(w)?Math.max(1,Math.min(21,T)):Math.max(0,Math.min(20,T));function I(L){var E=k,D=A,_,O,M;if(w==="c")D=C(L)+D,L="";else{L=+L;var P=L<0||1/L<0;if(L=isNaN(L)?u:C(Math.abs(L),T),S&&(L=Q_(L)),P&&+L==0&&g!=="+"&&(P=!1),E=(P?g==="("?g:l:g==="-"||g==="("?"":g)+E,D=(w==="s"?lY[8+Z_/3]:"")+D+(P&&g==="("?")":""),R){for(_=-1,O=L.length;++_M||M>57){D=(M===46?i+L.slice(_+1):L.slice(_))+D,L=L.slice(0,_);break}}}b&&!v&&(L=e(L,1/0));var B=E.length+L.length+D.length,F=B>1)+E+L+D+F.slice(B);break;default:L=F+E+L+D;break}return a(L)}return o(I,"format"),I.toString=function(){return d+""},I}o(h,"newFormat");function f(d,p){var m=h((d=Nh(d),d.type="f",d)),g=Math.max(-8,Math.min(8,Math.floor(bl(p)/3)))*3,y=Math.pow(10,-g),v=lY[8+g/3];return function(x){return m(y*x)+v}}return o(f,"formatPrefix"),{format:h,formatPrefix:f}}var oY,lY,cY=N(()=>{"use strict";Rv();tY();rY();K_();nY();aY();eD();sY();oY=Array.prototype.map,lY=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];o(rD,"default")});function nD(t){return C5=rD(t),cc=C5.format,A5=C5.formatPrefix,C5}var C5,cc,A5,uY=N(()=>{"use strict";cY();nD({thousands:",",grouping:[3],currency:["$",""]});o(nD,"defaultLocale")});function _5(t){return Math.max(0,-bl(Math.abs(t)))}var hY=N(()=>{"use strict";Rv();o(_5,"default")});function D5(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(bl(e)/3)))*3-bl(Math.abs(t)))}var fY=N(()=>{"use strict";Rv();o(D5,"default")});function L5(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,bl(e)-bl(t))+1}var dY=N(()=>{"use strict";Rv();o(L5,"default")});var iD=N(()=>{"use strict";uY();K_();hY();fY();dY()});var pY=N(()=>{"use strict"});function jSe(t){var e=0,r=t.children,n=r&&r.length;if(!n)e=1;else for(;--n>=0;)e+=r[n].value;t.value=e}function aD(){return this.eachAfter(jSe)}var mY=N(()=>{"use strict";o(jSe,"count");o(aD,"default")});function sD(t,e){let r=-1;for(let n of this)t.call(e,n,++r,this);return this}var gY=N(()=>{"use strict";o(sD,"default")});function oD(t,e){for(var r=this,n=[r],i,a,s=-1;r=n.pop();)if(t.call(e,r,++s,this),i=r.children)for(a=i.length-1;a>=0;--a)n.push(i[a]);return this}var yY=N(()=>{"use strict";o(oD,"default")});function lD(t,e){for(var r=this,n=[r],i=[],a,s,l,u=-1;r=n.pop();)if(i.push(r),a=r.children)for(s=0,l=a.length;s{"use strict";o(lD,"default")});function cD(t,e){let r=-1;for(let n of this)if(t.call(e,n,++r,this))return n}var xY=N(()=>{"use strict";o(cD,"default")});function uD(t){return this.eachAfter(function(e){for(var r=+t(e.data)||0,n=e.children,i=n&&n.length;--i>=0;)r+=n[i].value;e.value=r})}var bY=N(()=>{"use strict";o(uD,"default")});function hD(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})}var TY=N(()=>{"use strict";o(hD,"default")});function fD(t){for(var e=this,r=KSe(e,t),n=[e];e!==r;)e=e.parent,n.push(e);for(var i=n.length;t!==r;)n.splice(i,0,t),t=t.parent;return n}function KSe(t,e){if(t===e)return t;var r=t.ancestors(),n=e.ancestors(),i=null;for(t=r.pop(),e=n.pop();t===e;)i=t,t=r.pop(),e=n.pop();return i}var wY=N(()=>{"use strict";o(fD,"default");o(KSe,"leastCommonAncestor")});function dD(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e}var kY=N(()=>{"use strict";o(dD,"default")});function pD(){return Array.from(this)}var EY=N(()=>{"use strict";o(pD,"default")});function mD(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t}var SY=N(()=>{"use strict";o(mD,"default")});function gD(){var t=this,e=[];return t.each(function(r){r!==t&&e.push({source:r.parent,target:r})}),e}var CY=N(()=>{"use strict";o(gD,"default")});function*yD(){var t=this,e,r=[t],n,i,a;do for(e=r.reverse(),r=[];t=e.pop();)if(yield t,n=t.children)for(i=0,a=n.length;i{"use strict";o(yD,"default")});function U0(t,e){t instanceof Map?(t=[void 0,t],e===void 0&&(e=JSe)):e===void 0&&(e=ZSe);for(var r=new Nv(t),n,i=[r],a,s,l,u;n=i.pop();)if((s=e(n.data))&&(u=(s=Array.from(s)).length))for(n.children=s,l=u-1;l>=0;--l)i.push(a=s[l]=new Nv(s[l])),a.parent=n,a.depth=n.depth+1;return r.eachBefore(t6e)}function QSe(){return U0(this).eachBefore(e6e)}function ZSe(t){return t.children}function JSe(t){return Array.isArray(t)?t[1]:null}function e6e(t){t.data.value!==void 0&&(t.value=t.data.value),t.data=t.data.data}function t6e(t){var e=0;do t.height=e;while((t=t.parent)&&t.height<++e)}function Nv(t){this.data=t,this.depth=this.height=0,this.parent=null}var _Y=N(()=>{"use strict";mY();gY();yY();vY();xY();bY();TY();wY();kY();EY();SY();CY();AY();o(U0,"hierarchy");o(QSe,"node_copy");o(ZSe,"objectChildren");o(JSe,"mapChildren");o(e6e,"copyData");o(t6e,"computeHeight");o(Nv,"Node");Nv.prototype=U0.prototype={constructor:Nv,count:aD,each:sD,eachAfter:lD,eachBefore:oD,find:cD,sum:uD,sort:hD,path:fD,ancestors:dD,descendants:pD,leaves:mD,links:gD,copy:QSe,[Symbol.iterator]:yD}});function DY(t){if(typeof t!="function")throw new Error;return t}var LY=N(()=>{"use strict";o(DY,"required")});function H0(){return 0}function Ld(t){return function(){return t}}var RY=N(()=>{"use strict";o(H0,"constantZero");o(Ld,"default")});function vD(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)}var NY=N(()=>{"use strict";o(vD,"default")});function xD(t,e,r,n,i){for(var a=t.children,s,l=-1,u=a.length,h=t.value&&(n-e)/t.value;++l{"use strict";o(xD,"default")});function bD(t,e,r,n,i){for(var a=t.children,s,l=-1,u=a.length,h=t.value&&(i-r)/t.value;++l{"use strict";o(bD,"default")});function n6e(t,e,r,n,i,a){for(var s=[],l=e.children,u,h,f=0,d=0,p=l.length,m,g,y=e.value,v,x,b,T,S,w,k;fb&&(b=h),k=v*v*w,T=Math.max(b/k,k/x),T>S){v-=h;break}S=T}s.push(u={value:v,dice:m{"use strict";MY();IY();r6e=(1+Math.sqrt(5))/2;o(n6e,"squarifyRatio");OY=o((function t(e){function r(n,i,a,s,l){n6e(e,n,i,a,s,l)}return o(r,"squarify"),r.ratio=function(n){return t((n=+n)>1?n:1)},r}),"custom")(r6e)});function R5(){var t=OY,e=!1,r=1,n=1,i=[0],a=H0,s=H0,l=H0,u=H0,h=H0;function f(p){return p.x0=p.y0=0,p.x1=r,p.y1=n,p.eachBefore(d),i=[0],e&&p.eachBefore(vD),p}o(f,"treemap");function d(p){var m=i[p.depth],g=p.x0+m,y=p.y0+m,v=p.x1-m,x=p.y1-m;v{"use strict";NY();PY();LY();RY();o(R5,"default")});var FY=N(()=>{"use strict";_Y();BY()});var $Y=N(()=>{"use strict"});var zY=N(()=>{"use strict"});function Mh(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}var Mv=N(()=>{"use strict";o(Mh,"initRange")});function no(){var t=new D0,e=[],r=[],n=TD;function i(a){let s=t.get(a);if(s===void 0){if(n!==TD)return n;t.set(a,s=e.push(a)-1)}return r[s%r.length]}return o(i,"scale"),i.domain=function(a){if(!arguments.length)return e.slice();e=[],t=new D0;for(let s of a)t.has(s)||t.set(s,e.push(s)-1);return i},i.range=function(a){return arguments.length?(r=Array.from(a),i):r.slice()},i.unknown=function(a){return arguments.length?(n=a,i):n},i.copy=function(){return no(e,r).unknown(n)},Mh.apply(i,arguments),i}var TD,wD=N(()=>{"use strict";Ch();Mv();TD=Symbol("implicit");o(no,"ordinal")});function q0(){var t=no().unknown(void 0),e=t.domain,r=t.range,n=0,i=1,a,s,l=!1,u=0,h=0,f=.5;delete t.unknown;function d(){var p=e().length,m=i{"use strict";Ch();Mv();wD();o(q0,"band")});function kD(t){return function(){return t}}var VY=N(()=>{"use strict";o(kD,"constants")});function ED(t){return+t}var UY=N(()=>{"use strict";o(ED,"number")});function W0(t){return t}function SD(t,e){return(e-=t=+t)?function(r){return(r-t)/e}:kD(isNaN(e)?NaN:.5)}function i6e(t,e){var r;return t>e&&(r=t,t=e,e=r),function(n){return Math.max(t,Math.min(e,n))}}function a6e(t,e,r){var n=t[0],i=t[1],a=e[0],s=e[1];return i2?s6e:a6e,u=h=null,d}o(f,"rescale");function d(p){return p==null||isNaN(p=+p)?a:(u||(u=l(t.map(n),e,r)))(n(s(p)))}return o(d,"scale"),d.invert=function(p){return s(i((h||(h=l(e,t.map(n),Wi)))(p)))},d.domain=function(p){return arguments.length?(t=Array.from(p,ED),f()):t.slice()},d.range=function(p){return arguments.length?(e=Array.from(p),f()):e.slice()},d.rangeRound=function(p){return e=Array.from(p),r=l5,f()},d.clamp=function(p){return arguments.length?(s=p?!0:W0,f()):s!==W0},d.interpolate=function(p){return arguments.length?(r=p,f()):r},d.unknown=function(p){return arguments.length?(a=p,d):a},function(p,m){return n=p,i=m,f()}}function Iv(){return o6e()(W0,W0)}var HY,CD=N(()=>{"use strict";Ch();z0();VY();UY();HY=[0,1];o(W0,"identity");o(SD,"normalize");o(i6e,"clamper");o(a6e,"bimap");o(s6e,"polymap");o(N5,"copy");o(o6e,"transformer");o(Iv,"continuous")});function AD(t,e,r,n){var i=L0(t,e,r),a;switch(n=Nh(n??",f"),n.type){case"s":{var s=Math.max(Math.abs(t),Math.abs(e));return n.precision==null&&!isNaN(a=D5(i,s))&&(n.precision=a),A5(n,s)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(a=L5(i,Math.max(Math.abs(t),Math.abs(e))))&&(n.precision=a-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(a=_5(i))&&(n.precision=a-(n.type==="%")*2);break}}return cc(n)}var qY=N(()=>{"use strict";Ch();iD();o(AD,"tickFormat")});function l6e(t){var e=t.domain;return t.ticks=function(r){var n=e();return q3(n[0],n[n.length-1],r??10)},t.tickFormat=function(r,n){var i=e();return AD(i[0],i[i.length-1],r??10,n)},t.nice=function(r){r==null&&(r=10);var n=e(),i=0,a=n.length-1,s=n[i],l=n[a],u,h,f=10;for(l0;){if(h=lv(s,l,r),h===u)return n[i]=s,n[a]=l,e(n);if(h>0)s=Math.floor(s/h)*h,l=Math.ceil(l/h)*h;else if(h<0)s=Math.ceil(s*h)/h,l=Math.floor(l*h)/h;else break;u=h}return t},t}function Tl(){var t=Iv();return t.copy=function(){return N5(t,Tl())},Mh.apply(t,arguments),l6e(t)}var WY=N(()=>{"use strict";Ch();CD();Mv();qY();o(l6e,"linearish");o(Tl,"linear")});function _D(t,e){t=t.slice();var r=0,n=t.length-1,i=t[r],a=t[n],s;return a{"use strict";o(_D,"nice")});function En(t,e,r,n){function i(a){return t(a=arguments.length===0?new Date:new Date(+a)),a}return o(i,"interval"),i.floor=a=>(t(a=new Date(+a)),a),i.ceil=a=>(t(a=new Date(a-1)),e(a,1),t(a),a),i.round=a=>{let s=i(a),l=i.ceil(a);return a-s(e(a=new Date(+a),s==null?1:Math.floor(s)),a),i.range=(a,s,l)=>{let u=[];if(a=i.ceil(a),l=l==null?1:Math.floor(l),!(a0))return u;let h;do u.push(h=new Date(+a)),e(a,l),t(a);while(hEn(s=>{if(s>=s)for(;t(s),!a(s);)s.setTime(s-1)},(s,l)=>{if(s>=s)if(l<0)for(;++l<=0;)for(;e(s,-1),!a(s););else for(;--l>=0;)for(;e(s,1),!a(s););}),r&&(i.count=(a,s)=>(DD.setTime(+a),LD.setTime(+s),t(DD),t(LD),Math.floor(r(DD,LD))),i.every=a=>(a=Math.floor(a),!isFinite(a)||!(a>0)?null:a>1?i.filter(n?s=>n(s)%a===0:s=>i.count(0,s)%a===0):i)),i}var DD,LD,wu=N(()=>{"use strict";DD=new Date,LD=new Date;o(En,"timeInterval")});var uc,XY,RD=N(()=>{"use strict";wu();uc=En(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);uc.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?En(e=>{e.setTime(Math.floor(e/t)*t)},(e,r)=>{e.setTime(+e+r*t)},(e,r)=>(r-e)/t):uc);XY=uc.range});var io,jY,ND=N(()=>{"use strict";wu();io=En(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),jY=io.range});var ku,c6e,M5,u6e,MD=N(()=>{"use strict";wu();ku=En(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),c6e=ku.range,M5=En(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),u6e=M5.range});var Eu,h6e,I5,f6e,ID=N(()=>{"use strict";wu();Eu=En(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),h6e=Eu.range,I5=En(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),f6e=I5.range});var Ro,d6e,Pv,p6e,O5,m6e,OD=N(()=>{"use strict";wu();Ro=En(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),d6e=Ro.range,Pv=En(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),p6e=Pv.range,O5=En(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),m6e=O5.range});function Md(t){return En(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,r)=>{e.setDate(e.getDate()+r*7)},(e,r)=>(r-e-(r.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}function Id(t){return En(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCDate(e.getUTCDate()+r*7)},(e,r)=>(r-e)/6048e5)}var wl,Ih,P5,B5,fc,F5,$5,QY,g6e,y6e,v6e,x6e,b6e,T6e,Od,Y0,ZY,JY,Oh,eX,tX,rX,w6e,k6e,E6e,S6e,C6e,A6e,PD=N(()=>{"use strict";wu();o(Md,"timeWeekday");wl=Md(0),Ih=Md(1),P5=Md(2),B5=Md(3),fc=Md(4),F5=Md(5),$5=Md(6),QY=wl.range,g6e=Ih.range,y6e=P5.range,v6e=B5.range,x6e=fc.range,b6e=F5.range,T6e=$5.range;o(Id,"utcWeekday");Od=Id(0),Y0=Id(1),ZY=Id(2),JY=Id(3),Oh=Id(4),eX=Id(5),tX=Id(6),rX=Od.range,w6e=Y0.range,k6e=ZY.range,E6e=JY.range,S6e=Oh.range,C6e=eX.range,A6e=tX.range});var Su,_6e,z5,D6e,BD=N(()=>{"use strict";wu();Su=En(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),_6e=Su.range,z5=En(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),D6e=z5.range});var ao,L6e,kl,R6e,FD=N(()=>{"use strict";wu();ao=En(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());ao.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:En(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,r)=>{e.setFullYear(e.getFullYear()+r*t)});L6e=ao.range,kl=En(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());kl.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:En(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCFullYear(e.getUTCFullYear()+r*t)});R6e=kl.range});function iX(t,e,r,n,i,a){let s=[[io,1,1e3],[io,5,5*1e3],[io,15,15*1e3],[io,30,30*1e3],[a,1,6e4],[a,5,5*6e4],[a,15,15*6e4],[a,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[n,1,864e5],[n,2,2*864e5],[r,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function l(h,f,d){let p=fv).right(s,p);if(m===s.length)return t.every(L0(h/31536e6,f/31536e6,d));if(m===0)return uc.every(Math.max(L0(h,f,d),1));let[g,y]=s[p/s[m-1][2]{"use strict";Ch();RD();ND();MD();ID();OD();PD();BD();FD();o(iX,"ticker");[M6e,I6e]=iX(kl,z5,Od,O5,I5,M5),[$D,zD]=iX(ao,Su,wl,Ro,Eu,ku)});var G5=N(()=>{"use strict";RD();ND();MD();ID();OD();PD();BD();FD();aX()});function GD(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function VD(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Bv(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function UD(t){var e=t.dateTime,r=t.date,n=t.time,i=t.periods,a=t.days,s=t.shortDays,l=t.months,u=t.shortMonths,h=Fv(i),f=$v(i),d=Fv(a),p=$v(a),m=Fv(s),g=$v(s),y=Fv(l),v=$v(l),x=Fv(u),b=$v(u),T={a:P,A:B,b:F,B:G,c:null,d:hX,e:hX,f:nCe,g:dCe,G:mCe,H:eCe,I:tCe,j:rCe,L:gX,m:iCe,M:aCe,p:$,q:U,Q:pX,s:mX,S:sCe,u:oCe,U:lCe,V:cCe,w:uCe,W:hCe,x:null,X:null,y:fCe,Y:pCe,Z:gCe,"%":dX},S={a:j,A:te,b:Y,B:oe,c:null,d:fX,e:fX,f:bCe,g:LCe,G:NCe,H:yCe,I:vCe,j:xCe,L:vX,m:TCe,M:wCe,p:J,q:ue,Q:pX,s:mX,S:kCe,u:ECe,U:SCe,V:CCe,w:ACe,W:_Ce,x:null,X:null,y:DCe,Y:RCe,Z:MCe,"%":dX},w={a:I,A:L,b:E,B:D,c:_,d:cX,e:cX,f:K6e,g:lX,G:oX,H:uX,I:uX,j:W6e,L:j6e,m:q6e,M:Y6e,p:R,q:H6e,Q:Z6e,s:J6e,S:X6e,u:$6e,U:z6e,V:G6e,w:F6e,W:V6e,x:O,X:M,y:lX,Y:oX,Z:U6e,"%":Q6e};T.x=k(r,T),T.X=k(n,T),T.c=k(e,T),S.x=k(r,S),S.X=k(n,S),S.c=k(e,S);function k(re,ee){return function(Z){var K=[],ae=-1,Q=0,de=re.length,ne,Te,q;for(Z instanceof Date||(Z=new Date(+Z));++ae53)return null;"w"in K||(K.w=1),"Z"in K?(Q=VD(Bv(K.y,0,1)),de=Q.getUTCDay(),Q=de>4||de===0?Y0.ceil(Q):Y0(Q),Q=Pv.offset(Q,(K.V-1)*7),K.y=Q.getUTCFullYear(),K.m=Q.getUTCMonth(),K.d=Q.getUTCDate()+(K.w+6)%7):(Q=GD(Bv(K.y,0,1)),de=Q.getDay(),Q=de>4||de===0?Ih.ceil(Q):Ih(Q),Q=Ro.offset(Q,(K.V-1)*7),K.y=Q.getFullYear(),K.m=Q.getMonth(),K.d=Q.getDate()+(K.w+6)%7)}else("W"in K||"U"in K)&&("w"in K||(K.w="u"in K?K.u%7:"W"in K?1:0),de="Z"in K?VD(Bv(K.y,0,1)).getUTCDay():GD(Bv(K.y,0,1)).getDay(),K.m=0,K.d="W"in K?(K.w+6)%7+K.W*7-(de+5)%7:K.w+K.U*7-(de+6)%7);return"Z"in K?(K.H+=K.Z/100|0,K.M+=K.Z%100,VD(K)):GD(K)}}o(A,"newParse");function C(re,ee,Z,K){for(var ae=0,Q=ee.length,de=Z.length,ne,Te;ae=de)return-1;if(ne=ee.charCodeAt(ae++),ne===37){if(ne=ee.charAt(ae++),Te=w[ne in sX?ee.charAt(ae++):ne],!Te||(K=Te(re,Z,K))<0)return-1}else if(ne!=Z.charCodeAt(K++))return-1}return K}o(C,"parseSpecifier");function R(re,ee,Z){var K=h.exec(ee.slice(Z));return K?(re.p=f.get(K[0].toLowerCase()),Z+K[0].length):-1}o(R,"parsePeriod");function I(re,ee,Z){var K=m.exec(ee.slice(Z));return K?(re.w=g.get(K[0].toLowerCase()),Z+K[0].length):-1}o(I,"parseShortWeekday");function L(re,ee,Z){var K=d.exec(ee.slice(Z));return K?(re.w=p.get(K[0].toLowerCase()),Z+K[0].length):-1}o(L,"parseWeekday");function E(re,ee,Z){var K=x.exec(ee.slice(Z));return K?(re.m=b.get(K[0].toLowerCase()),Z+K[0].length):-1}o(E,"parseShortMonth");function D(re,ee,Z){var K=y.exec(ee.slice(Z));return K?(re.m=v.get(K[0].toLowerCase()),Z+K[0].length):-1}o(D,"parseMonth");function _(re,ee,Z){return C(re,e,ee,Z)}o(_,"parseLocaleDateTime");function O(re,ee,Z){return C(re,r,ee,Z)}o(O,"parseLocaleDate");function M(re,ee,Z){return C(re,n,ee,Z)}o(M,"parseLocaleTime");function P(re){return s[re.getDay()]}o(P,"formatShortWeekday");function B(re){return a[re.getDay()]}o(B,"formatWeekday");function F(re){return u[re.getMonth()]}o(F,"formatShortMonth");function G(re){return l[re.getMonth()]}o(G,"formatMonth");function $(re){return i[+(re.getHours()>=12)]}o($,"formatPeriod");function U(re){return 1+~~(re.getMonth()/3)}o(U,"formatQuarter");function j(re){return s[re.getUTCDay()]}o(j,"formatUTCShortWeekday");function te(re){return a[re.getUTCDay()]}o(te,"formatUTCWeekday");function Y(re){return u[re.getUTCMonth()]}o(Y,"formatUTCShortMonth");function oe(re){return l[re.getUTCMonth()]}o(oe,"formatUTCMonth");function J(re){return i[+(re.getUTCHours()>=12)]}o(J,"formatUTCPeriod");function ue(re){return 1+~~(re.getUTCMonth()/3)}return o(ue,"formatUTCQuarter"),{format:o(function(re){var ee=k(re+="",T);return ee.toString=function(){return re},ee},"format"),parse:o(function(re){var ee=A(re+="",!1);return ee.toString=function(){return re},ee},"parse"),utcFormat:o(function(re){var ee=k(re+="",S);return ee.toString=function(){return re},ee},"utcFormat"),utcParse:o(function(re){var ee=A(re+="",!0);return ee.toString=function(){return re},ee},"utcParse")}}function Kr(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",a=i.length;return n+(a[e.toLowerCase(),r]))}function F6e(t,e,r){var n=Yi.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function $6e(t,e,r){var n=Yi.exec(e.slice(r,r+1));return n?(t.u=+n[0],r+n[0].length):-1}function z6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.U=+n[0],r+n[0].length):-1}function G6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.V=+n[0],r+n[0].length):-1}function V6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.W=+n[0],r+n[0].length):-1}function oX(t,e,r){var n=Yi.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function lX(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function U6e(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function H6e(t,e,r){var n=Yi.exec(e.slice(r,r+1));return n?(t.q=n[0]*3-3,r+n[0].length):-1}function q6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function cX(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function W6e(t,e,r){var n=Yi.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function uX(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function Y6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function X6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function j6e(t,e,r){var n=Yi.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function K6e(t,e,r){var n=Yi.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function Q6e(t,e,r){var n=O6e.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function Z6e(t,e,r){var n=Yi.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function J6e(t,e,r){var n=Yi.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function hX(t,e){return Kr(t.getDate(),e,2)}function eCe(t,e){return Kr(t.getHours(),e,2)}function tCe(t,e){return Kr(t.getHours()%12||12,e,2)}function rCe(t,e){return Kr(1+Ro.count(ao(t),t),e,3)}function gX(t,e){return Kr(t.getMilliseconds(),e,3)}function nCe(t,e){return gX(t,e)+"000"}function iCe(t,e){return Kr(t.getMonth()+1,e,2)}function aCe(t,e){return Kr(t.getMinutes(),e,2)}function sCe(t,e){return Kr(t.getSeconds(),e,2)}function oCe(t){var e=t.getDay();return e===0?7:e}function lCe(t,e){return Kr(wl.count(ao(t)-1,t),e,2)}function yX(t){var e=t.getDay();return e>=4||e===0?fc(t):fc.ceil(t)}function cCe(t,e){return t=yX(t),Kr(fc.count(ao(t),t)+(ao(t).getDay()===4),e,2)}function uCe(t){return t.getDay()}function hCe(t,e){return Kr(Ih.count(ao(t)-1,t),e,2)}function fCe(t,e){return Kr(t.getFullYear()%100,e,2)}function dCe(t,e){return t=yX(t),Kr(t.getFullYear()%100,e,2)}function pCe(t,e){return Kr(t.getFullYear()%1e4,e,4)}function mCe(t,e){var r=t.getDay();return t=r>=4||r===0?fc(t):fc.ceil(t),Kr(t.getFullYear()%1e4,e,4)}function gCe(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Kr(e/60|0,"0",2)+Kr(e%60,"0",2)}function fX(t,e){return Kr(t.getUTCDate(),e,2)}function yCe(t,e){return Kr(t.getUTCHours(),e,2)}function vCe(t,e){return Kr(t.getUTCHours()%12||12,e,2)}function xCe(t,e){return Kr(1+Pv.count(kl(t),t),e,3)}function vX(t,e){return Kr(t.getUTCMilliseconds(),e,3)}function bCe(t,e){return vX(t,e)+"000"}function TCe(t,e){return Kr(t.getUTCMonth()+1,e,2)}function wCe(t,e){return Kr(t.getUTCMinutes(),e,2)}function kCe(t,e){return Kr(t.getUTCSeconds(),e,2)}function ECe(t){var e=t.getUTCDay();return e===0?7:e}function SCe(t,e){return Kr(Od.count(kl(t)-1,t),e,2)}function xX(t){var e=t.getUTCDay();return e>=4||e===0?Oh(t):Oh.ceil(t)}function CCe(t,e){return t=xX(t),Kr(Oh.count(kl(t),t)+(kl(t).getUTCDay()===4),e,2)}function ACe(t){return t.getUTCDay()}function _Ce(t,e){return Kr(Y0.count(kl(t)-1,t),e,2)}function DCe(t,e){return Kr(t.getUTCFullYear()%100,e,2)}function LCe(t,e){return t=xX(t),Kr(t.getUTCFullYear()%100,e,2)}function RCe(t,e){return Kr(t.getUTCFullYear()%1e4,e,4)}function NCe(t,e){var r=t.getUTCDay();return t=r>=4||r===0?Oh(t):Oh.ceil(t),Kr(t.getUTCFullYear()%1e4,e,4)}function MCe(){return"+0000"}function dX(){return"%"}function pX(t){return+t}function mX(t){return Math.floor(+t/1e3)}var sX,Yi,O6e,P6e,bX=N(()=>{"use strict";G5();o(GD,"localDate");o(VD,"utcDate");o(Bv,"newDate");o(UD,"formatLocale");sX={"-":"",_:" ",0:"0"},Yi=/^\s*\d+/,O6e=/^%/,P6e=/[\\^$*+?|[\]().{}]/g;o(Kr,"pad");o(B6e,"requote");o(Fv,"formatRe");o($v,"formatLookup");o(F6e,"parseWeekdayNumberSunday");o($6e,"parseWeekdayNumberMonday");o(z6e,"parseWeekNumberSunday");o(G6e,"parseWeekNumberISO");o(V6e,"parseWeekNumberMonday");o(oX,"parseFullYear");o(lX,"parseYear");o(U6e,"parseZone");o(H6e,"parseQuarter");o(q6e,"parseMonthNumber");o(cX,"parseDayOfMonth");o(W6e,"parseDayOfYear");o(uX,"parseHour24");o(Y6e,"parseMinutes");o(X6e,"parseSeconds");o(j6e,"parseMilliseconds");o(K6e,"parseMicroseconds");o(Q6e,"parseLiteralPercent");o(Z6e,"parseUnixTimestamp");o(J6e,"parseUnixTimestampSeconds");o(hX,"formatDayOfMonth");o(eCe,"formatHour24");o(tCe,"formatHour12");o(rCe,"formatDayOfYear");o(gX,"formatMilliseconds");o(nCe,"formatMicroseconds");o(iCe,"formatMonthNumber");o(aCe,"formatMinutes");o(sCe,"formatSeconds");o(oCe,"formatWeekdayNumberMonday");o(lCe,"formatWeekNumberSunday");o(yX,"dISO");o(cCe,"formatWeekNumberISO");o(uCe,"formatWeekdayNumberSunday");o(hCe,"formatWeekNumberMonday");o(fCe,"formatYear");o(dCe,"formatYearISO");o(pCe,"formatFullYear");o(mCe,"formatFullYearISO");o(gCe,"formatZone");o(fX,"formatUTCDayOfMonth");o(yCe,"formatUTCHour24");o(vCe,"formatUTCHour12");o(xCe,"formatUTCDayOfYear");o(vX,"formatUTCMilliseconds");o(bCe,"formatUTCMicroseconds");o(TCe,"formatUTCMonthNumber");o(wCe,"formatUTCMinutes");o(kCe,"formatUTCSeconds");o(ECe,"formatUTCWeekdayNumberMonday");o(SCe,"formatUTCWeekNumberSunday");o(xX,"UTCdISO");o(CCe,"formatUTCWeekNumberISO");o(ACe,"formatUTCWeekdayNumberSunday");o(_Ce,"formatUTCWeekNumberMonday");o(DCe,"formatUTCYear");o(LCe,"formatUTCYearISO");o(RCe,"formatUTCFullYear");o(NCe,"formatUTCFullYearISO");o(MCe,"formatUTCZone");o(dX,"formatLiteralPercent");o(pX,"formatUnixTimestamp");o(mX,"formatUnixTimestampSeconds")});function HD(t){return X0=UD(t),Pd=X0.format,TX=X0.parse,wX=X0.utcFormat,kX=X0.utcParse,X0}var X0,Pd,TX,wX,kX,EX=N(()=>{"use strict";bX();HD({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});o(HD,"defaultLocale")});var qD=N(()=>{"use strict";EX()});function ICe(t){return new Date(t)}function OCe(t){return t instanceof Date?+t:+new Date(+t)}function SX(t,e,r,n,i,a,s,l,u,h){var f=Iv(),d=f.invert,p=f.domain,m=h(".%L"),g=h(":%S"),y=h("%I:%M"),v=h("%I %p"),x=h("%a %d"),b=h("%b %d"),T=h("%B"),S=h("%Y");function w(k){return(u(k){"use strict";G5();qD();CD();Mv();YY();o(ICe,"date");o(OCe,"number");o(SX,"calendar");o(V5,"time")});var AX=N(()=>{"use strict";GY();WY();wD();CX()});function WD(t){for(var e=t.length/6|0,r=new Array(e),n=0;n{"use strict";o(WD,"default")});var YD,DX=N(()=>{"use strict";_X();YD=WD("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab")});var LX=N(()=>{"use strict";DX()});function zn(t){return o(function(){return t},"constant")}var U5=N(()=>{"use strict";o(zn,"default")});function NX(t){return t>1?0:t<-1?j0:Math.acos(t)}function jD(t){return t>=1?zv:t<=-1?-zv:Math.asin(t)}var XD,ca,Ph,RX,H5,El,Bd,Xi,j0,zv,K0,q5=N(()=>{"use strict";XD=Math.abs,ca=Math.atan2,Ph=Math.cos,RX=Math.max,H5=Math.min,El=Math.sin,Bd=Math.sqrt,Xi=1e-12,j0=Math.PI,zv=j0/2,K0=2*j0;o(NX,"acos");o(jD,"asin")});function W5(t){let e=3;return t.digits=function(r){if(!arguments.length)return e;if(r==null)e=null;else{let n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);e=n}return t},()=>new _d(e)}var KD=N(()=>{"use strict";W_();o(W5,"withPath")});function PCe(t){return t.innerRadius}function BCe(t){return t.outerRadius}function FCe(t){return t.startAngle}function $Ce(t){return t.endAngle}function zCe(t){return t&&t.padAngle}function GCe(t,e,r,n,i,a,s,l){var u=r-t,h=n-e,f=s-i,d=l-a,p=d*u-f*h;if(!(p*p_*_+O*O&&(C=I,R=L),{cx:C,cy:R,x01:-f,y01:-d,x11:C*(i/w-1),y11:R*(i/w-1)}}function Sl(){var t=PCe,e=BCe,r=zn(0),n=null,i=FCe,a=$Ce,s=zCe,l=null,u=W5(h);function h(){var f,d,p=+t.apply(this,arguments),m=+e.apply(this,arguments),g=i.apply(this,arguments)-zv,y=a.apply(this,arguments)-zv,v=XD(y-g),x=y>g;if(l||(l=f=u()),mXi))l.moveTo(0,0);else if(v>K0-Xi)l.moveTo(m*Ph(g),m*El(g)),l.arc(0,0,m,g,y,!x),p>Xi&&(l.moveTo(p*Ph(y),p*El(y)),l.arc(0,0,p,y,g,x));else{var b=g,T=y,S=g,w=y,k=v,A=v,C=s.apply(this,arguments)/2,R=C>Xi&&(n?+n.apply(this,arguments):Bd(p*p+m*m)),I=H5(XD(m-p)/2,+r.apply(this,arguments)),L=I,E=I,D,_;if(R>Xi){var O=jD(R/p*El(C)),M=jD(R/m*El(C));(k-=O*2)>Xi?(O*=x?1:-1,S+=O,w-=O):(k=0,S=w=(g+y)/2),(A-=M*2)>Xi?(M*=x?1:-1,b+=M,T-=M):(A=0,b=T=(g+y)/2)}var P=m*Ph(b),B=m*El(b),F=p*Ph(w),G=p*El(w);if(I>Xi){var $=m*Ph(T),U=m*El(T),j=p*Ph(S),te=p*El(S),Y;if(vXi?E>Xi?(D=Y5(j,te,P,B,m,E,x),_=Y5($,U,F,G,m,E,x),l.moveTo(D.cx+D.x01,D.cy+D.y01),EXi)||!(k>Xi)?l.lineTo(F,G):L>Xi?(D=Y5(F,G,$,U,p,-L,x),_=Y5(P,B,j,te,p,-L,x),l.lineTo(D.cx+D.x01,D.cy+D.y01),L{"use strict";U5();q5();KD();o(PCe,"arcInnerRadius");o(BCe,"arcOuterRadius");o(FCe,"arcStartAngle");o($Ce,"arcEndAngle");o(zCe,"arcPadAngle");o(GCe,"intersect");o(Y5,"cornerTangents");o(Sl,"default")});function Gv(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}var Zxt,QD=N(()=>{"use strict";Zxt=Array.prototype.slice;o(Gv,"default")});function IX(t){this._context=t}function Cu(t){return new IX(t)}var ZD=N(()=>{"use strict";o(IX,"Linear");IX.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e);break}},"point")};o(Cu,"default")});function OX(t){return t[0]}function PX(t){return t[1]}var BX=N(()=>{"use strict";o(OX,"x");o(PX,"y")});function Cl(t,e){var r=zn(!0),n=null,i=Cu,a=null,s=W5(l);t=typeof t=="function"?t:t===void 0?OX:zn(t),e=typeof e=="function"?e:e===void 0?PX:zn(e);function l(u){var h,f=(u=Gv(u)).length,d,p=!1,m;for(n==null&&(a=i(m=s())),h=0;h<=f;++h)!(h{"use strict";QD();U5();ZD();KD();BX();o(Cl,"default")});function JD(t,e){return et?1:e>=t?0:NaN}var $X=N(()=>{"use strict";o(JD,"default")});function eL(t){return t}var zX=N(()=>{"use strict";o(eL,"default")});function X5(){var t=eL,e=JD,r=null,n=zn(0),i=zn(K0),a=zn(0);function s(l){var u,h=(l=Gv(l)).length,f,d,p=0,m=new Array(h),g=new Array(h),y=+n.apply(this,arguments),v=Math.min(K0,Math.max(-K0,i.apply(this,arguments)-y)),x,b=Math.min(Math.abs(v)/h,a.apply(this,arguments)),T=b*(v<0?-1:1),S;for(u=0;u0&&(p+=S);for(e!=null?m.sort(function(w,k){return e(g[w],g[k])}):r!=null&&m.sort(function(w,k){return r(l[w],l[k])}),u=0,d=p?(v-h*T)/p:0;u0?S*d:0)+T,g[f]={data:l[f],index:u,value:S,startAngle:y,endAngle:x,padAngle:b};return g}return o(s,"pie"),s.value=function(l){return arguments.length?(t=typeof l=="function"?l:zn(+l),s):t},s.sortValues=function(l){return arguments.length?(e=l,r=null,s):e},s.sort=function(l){return arguments.length?(r=l,e=null,s):r},s.startAngle=function(l){return arguments.length?(n=typeof l=="function"?l:zn(+l),s):n},s.endAngle=function(l){return arguments.length?(i=typeof l=="function"?l:zn(+l),s):i},s.padAngle=function(l){return arguments.length?(a=typeof l=="function"?l:zn(+l),s):a},s}var GX=N(()=>{"use strict";QD();U5();$X();zX();q5();o(X5,"default")});function Vv(t){return new j5(t,!0)}function Uv(t){return new j5(t,!1)}var j5,VX=N(()=>{"use strict";j5=class{static{o(this,"Bump")}constructor(e,r){this._context=e,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,r){switch(e=+e,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,r,e,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,e,this._y0,e,r);break}}this._x0=e,this._y0=r}};o(Vv,"bumpX");o(Uv,"bumpY")});function so(){}var Hv=N(()=>{"use strict";o(so,"default")});function Q0(t,e,r){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+r)/6)}function qv(t){this._context=t}function No(t){return new qv(t)}var Wv=N(()=>{"use strict";o(Q0,"point");o(qv,"Basis");qv.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 3:Q0(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Q0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(No,"default")});function UX(t){this._context=t}function K5(t){return new UX(t)}var HX=N(()=>{"use strict";Hv();Wv();o(UX,"BasisClosed");UX.prototype={areaStart:so,areaEnd:so,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Q0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(K5,"default")});function qX(t){this._context=t}function Q5(t){return new qX(t)}var WX=N(()=>{"use strict";Wv();o(qX,"BasisOpen");qX.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+t)/6,n=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Q0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(Q5,"default")});function YX(t,e){this._basis=new qv(t),this._beta=e}var tL,XX=N(()=>{"use strict";Wv();o(YX,"Bundle");YX.prototype={lineStart:o(function(){this._x=[],this._y=[],this._basis.lineStart()},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length-1;if(r>0)for(var n=t[0],i=e[0],a=t[r]-n,s=e[r]-i,l=-1,u;++l<=r;)u=l/r,this._basis.point(this._beta*t[l]+(1-this._beta)*(n+u*a),this._beta*e[l]+(1-this._beta)*(i+u*s));this._x=this._y=null,this._basis.lineEnd()},"lineEnd"),point:o(function(t,e){this._x.push(+t),this._y.push(+e)},"point")};tL=o((function t(e){function r(n){return e===1?new qv(n):new YX(n,e)}return o(r,"bundle"),r.beta=function(n){return t(+n)},r}),"custom")(.85)});function Z0(t,e,r){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-r),t._x2,t._y2)}function Z5(t,e){this._context=t,this._k=(1-e)/6}var Yv,Xv=N(()=>{"use strict";o(Z0,"point");o(Z5,"Cardinal");Z5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Z0(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Z0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};Yv=o((function t(e){function r(n){return new Z5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r}),"custom")(0)});function J5(t,e){this._context=t,this._k=(1-e)/6}var rL,nL=N(()=>{"use strict";Hv();Xv();o(J5,"CardinalClosed");J5.prototype={areaStart:so,areaEnd:so,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Z0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};rL=o((function t(e){function r(n){return new J5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r}),"custom")(0)});function eT(t,e){this._context=t,this._k=(1-e)/6}var iL,aL=N(()=>{"use strict";Xv();o(eT,"CardinalOpen");eT.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Z0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};iL=o((function t(e){function r(n){return new eT(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r}),"custom")(0)});function jv(t,e,r){var n=t._x1,i=t._y1,a=t._x2,s=t._y2;if(t._l01_a>Xi){var l=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,u=3*t._l01_a*(t._l01_a+t._l12_a);n=(n*l-t._x0*t._l12_2a+t._x2*t._l01_2a)/u,i=(i*l-t._y0*t._l12_2a+t._y2*t._l01_2a)/u}if(t._l23_a>Xi){var h=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*h+t._x1*t._l23_2a-e*t._l12_2a)/f,s=(s*h+t._y1*t._l23_2a-r*t._l12_2a)/f}t._context.bezierCurveTo(n,i,a,s,t._x2,t._y2)}function jX(t,e){this._context=t,this._alpha=e}var Kv,tT=N(()=>{"use strict";q5();Xv();o(jv,"point");o(jX,"CatmullRom");jX.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:jv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};Kv=o((function t(e){function r(n){return e?new jX(n,e):new Z5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r}),"custom")(.5)});function KX(t,e){this._context=t,this._alpha=e}var sL,QX=N(()=>{"use strict";nL();Hv();tT();o(KX,"CatmullRomClosed");KX.prototype={areaStart:so,areaEnd:so,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:jv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};sL=o((function t(e){function r(n){return e?new KX(n,e):new J5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r}),"custom")(.5)});function ZX(t,e){this._context=t,this._alpha=e}var oL,JX=N(()=>{"use strict";aL();tT();o(ZX,"CatmullRomOpen");ZX.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:jv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};oL=o((function t(e){function r(n){return e?new ZX(n,e):new eT(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r}),"custom")(.5)});function ej(t){this._context=t}function rT(t){return new ej(t)}var tj=N(()=>{"use strict";Hv();o(ej,"LinearClosed");ej.prototype={areaStart:so,areaEnd:so,lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){this._point&&this._context.closePath()},"lineEnd"),point:o(function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))},"point")};o(rT,"default")});function rj(t){return t<0?-1:1}function nj(t,e,r){var n=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(n||i<0&&-0),s=(r-t._y1)/(i||n<0&&-0),l=(a*i+s*n)/(n+i);return(rj(a)+rj(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(l))||0}function ij(t,e){var r=t._x1-t._x0;return r?(3*(t._y1-t._y0)/r-e)/2:e}function lL(t,e,r){var n=t._x0,i=t._y0,a=t._x1,s=t._y1,l=(a-n)/3;t._context.bezierCurveTo(n+l,i+l*e,a-l,s-l*r,a,s)}function nT(t){this._context=t}function aj(t){this._context=new sj(t)}function sj(t){this._context=t}function Qv(t){return new nT(t)}function Zv(t){return new aj(t)}var oj=N(()=>{"use strict";o(rj,"sign");o(nj,"slope3");o(ij,"slope2");o(lL,"point");o(nT,"MonotoneX");nT.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:lL(this,this._t0,ij(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){var r=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,lL(this,ij(this,r=nj(this,t,e)),r);break;default:lL(this,this._t0,r=nj(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=r}},"point")};o(aj,"MonotoneY");(aj.prototype=Object.create(nT.prototype)).point=function(t,e){nT.prototype.point.call(this,e,t)};o(sj,"ReflectContext");sj.prototype={moveTo:o(function(t,e){this._context.moveTo(e,t)},"moveTo"),closePath:o(function(){this._context.closePath()},"closePath"),lineTo:o(function(t,e){this._context.lineTo(e,t)},"lineTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._context.bezierCurveTo(e,t,n,r,a,i)},"bezierCurveTo")};o(Qv,"monotoneX");o(Zv,"monotoneY")});function cj(t){this._context=t}function lj(t){var e,r=t.length-1,n,i=new Array(r),a=new Array(r),s=new Array(r);for(i[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(s[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e{"use strict";o(cj,"Natural");cj.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=[],this._y=[]},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length;if(r)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),r===2)this._context.lineTo(t[1],e[1]);else for(var n=lj(t),i=lj(e),a=0,s=1;s{"use strict";o(iT,"Step");iT.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=this._y=NaN,this._point=0},"lineStart"),lineEnd:o(function(){0=0&&(this._t=1-this._t,this._line=1-this._line)},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var r=this._x*(1-this._t)+t*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,e)}break}}this._x=t,this._y=e},"point")};o(em,"default");o(Jv,"stepBefore");o(e2,"stepAfter")});var fj=N(()=>{"use strict";MX();FX();GX();HX();WX();Wv();VX();XX();nL();aL();Xv();QX();JX();tT();tj();ZD();oj();uj();hj()});var dj=N(()=>{"use strict"});var pj=N(()=>{"use strict"});function Bh(t,e,r){this.k=t,this.x=e,this.y=r}function uL(t){for(;!t.__zoom;)if(!(t=t.parentNode))return cL;return t.__zoom}var cL,hL=N(()=>{"use strict";o(Bh,"Transform");Bh.prototype={constructor:Bh,scale:o(function(t){return t===1?this:new Bh(this.k*t,this.x,this.y)},"scale"),translate:o(function(t,e){return t===0&e===0?this:new Bh(this.k,this.x+this.k*t,this.y+this.k*e)},"translate"),apply:o(function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},"apply"),applyX:o(function(t){return t*this.k+this.x},"applyX"),applyY:o(function(t){return t*this.k+this.y},"applyY"),invert:o(function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},"invert"),invertX:o(function(t){return(t-this.x)/this.k},"invertX"),invertY:o(function(t){return(t-this.y)/this.k},"invertY"),rescaleX:o(function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},"rescaleX"),rescaleY:o(function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},"rescaleY"),toString:o(function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"},"toString")};cL=new Bh(1,0,0);uL.prototype=Bh.prototype;o(uL,"transform")});var mj=N(()=>{"use strict"});var gj=N(()=>{"use strict";w5();dj();pj();hL();mj()});var yj=N(()=>{"use strict";gj();hL()});var yr=N(()=>{"use strict";Ch();SH();HW();XW();B0();jW();KW();JA();gq();QW();G_();ZW();eY();iD();pY();FY();z0();W_();$Y();JW();zY();AX();LX();yl();fj();G5();qD();g5();w5();yj()});var vj=Da(ji=>{"use strict";Object.defineProperty(ji,"__esModule",{value:!0});ji.BLANK_URL=ji.relativeFirstCharacters=ji.whitespaceEscapeCharsRegex=ji.urlSchemeRegex=ji.ctrlCharactersRegex=ji.htmlCtrlEntityRegex=ji.htmlEntitiesRegex=ji.invalidProtocolRegex=void 0;ji.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;ji.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;ji.htmlCtrlEntityRegex=/&(newline|tab);/gi;ji.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;ji.urlSchemeRegex=/^.+(:|:)/gim;ji.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;ji.relativeFirstCharacters=[".","/"];ji.BLANK_URL="about:blank"});var tm=Da(aT=>{"use strict";Object.defineProperty(aT,"__esModule",{value:!0});aT.sanitizeUrl=void 0;var Na=vj();function VCe(t){return Na.relativeFirstCharacters.indexOf(t[0])>-1}o(VCe,"isRelativeUrlWithoutProtocol");function UCe(t){var e=t.replace(Na.ctrlCharactersRegex,"");return e.replace(Na.htmlEntitiesRegex,function(r,n){return String.fromCharCode(n)})}o(UCe,"decodeHtmlCharacters");function HCe(t){return URL.canParse(t)}o(HCe,"isValidUrl");function xj(t){try{return decodeURIComponent(t)}catch{return t}}o(xj,"decodeURI");function qCe(t){if(!t)return Na.BLANK_URL;var e,r=xj(t.trim());do r=UCe(r).replace(Na.htmlCtrlEntityRegex,"").replace(Na.ctrlCharactersRegex,"").replace(Na.whitespaceEscapeCharsRegex,"").trim(),r=xj(r),e=r.match(Na.ctrlCharactersRegex)||r.match(Na.htmlEntitiesRegex)||r.match(Na.htmlCtrlEntityRegex)||r.match(Na.whitespaceEscapeCharsRegex);while(e&&e.length>0);var n=r;if(!n)return Na.BLANK_URL;if(VCe(n))return n;var i=n.trimStart(),a=i.match(Na.urlSchemeRegex);if(!a)return n;var s=a[0].toLowerCase().trim();if(Na.invalidProtocolRegex.test(s))return Na.BLANK_URL;var l=i.replace(/\\/g,"/");if(s==="mailto:"||s.includes("://"))return l;if(s==="http:"||s==="https:"){if(!HCe(l))return Na.BLANK_URL;var u=new URL(l);return u.protocol=u.protocol.toLowerCase(),u.hostname=u.hostname.toLowerCase(),u.toString()}return l}o(qCe,"sanitizeUrl");aT.sanitizeUrl=qCe});var fL,Fd,sT,bj,oT,lT,ua,t2,r2=N(()=>{"use strict";fL=ja(tm(),1);gr();Fd=o((t,e)=>{let r=t.append("rect");if(r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),e.name&&r.attr("name",e.name),e.rx&&r.attr("rx",e.rx),e.ry&&r.attr("ry",e.ry),e.attrs!==void 0)for(let n in e.attrs)r.attr(n,e.attrs[n]);return e.class&&r.attr("class",e.class),r},"drawRect"),sT=o((t,e)=>{let r={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};Fd(t,r).lower()},"drawBackgroundRect"),bj=o((t,e)=>{let r=e.text.replace(pd," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),oT=o((t,e,r,n)=>{let i=t.append("image");i.attr("x",e),i.attr("y",r);let a=(0,fL.sanitizeUrl)(n);i.attr("xlink:href",a)},"drawImage"),lT=o((t,e,r,n)=>{let i=t.append("use");i.attr("x",e),i.attr("y",r);let a=(0,fL.sanitizeUrl)(n);i.attr("xlink:href",`#${a}`)},"drawEmbeddedImage"),ua=o(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),t2=o(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj")});var Tj,dL,wj,WCe,YCe,XCe,jCe,KCe,QCe,ZCe,JCe,e7e,t7e,r7e,n7e,Au,Al,kj=N(()=>{"use strict";gr();r2();Tj=ja(tm(),1),dL=o(function(t,e){return Fd(t,e)},"drawRect"),wj=o(function(t,e,r,n,i,a){let s=t.append("image");s.attr("width",e),s.attr("height",r),s.attr("x",n),s.attr("y",i);let l=a.startsWith("data:image/png;base64")?a:(0,Tj.sanitizeUrl)(a);s.attr("xlink:href",l)},"drawImage"),WCe=o((t,e,r)=>{let n=t.append("g"),i=0;for(let a of e){let s=a.textColor?a.textColor:"#444444",l=a.lineColor?a.lineColor:"#444444",u=a.offsetX?parseInt(a.offsetX):0,h=a.offsetY?parseInt(a.offsetY):0,f="";if(i===0){let p=n.append("line");p.attr("x1",a.startPoint.x),p.attr("y1",a.startPoint.y),p.attr("x2",a.endPoint.x),p.attr("y2",a.endPoint.y),p.attr("stroke-width","1"),p.attr("stroke",l),p.style("fill","none"),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)"),i=-1}else{let p=n.append("path");p.attr("fill","none").attr("stroke-width","1").attr("stroke",l).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)")}let d=r.messageFont();Au(r)(a.label.text,n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+h,a.label.width,a.label.height,{fill:s},d),a.techn&&a.techn.text!==""&&(d=r.messageFont(),Au(r)("["+a.techn.text+"]",n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+r.messageFontSize+5+h,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:s,"font-style":"italic"},d))}},"drawRels"),YCe=o(function(t,e,r){let n=t.append("g"),i=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",l={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(l={"stroke-width":1});let u={x:e.x,y:e.y,fill:i,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:l};dL(n,u);let h=r.boundaryFont();h.fontWeight="bold",h.fontSize=h.fontSize+2,h.fontColor=s,Au(r)(e.label.text,n,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},h),e.type&&e.type.text!==""&&(h=r.boundaryFont(),h.fontColor=s,Au(r)(e.type.text,n,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},h)),e.descr&&e.descr.text!==""&&(h=r.boundaryFont(),h.fontSize=h.fontSize-2,h.fontColor=s,Au(r)(e.descr.text,n,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},h))},"drawBoundary"),XCe=o(function(t,e,r){let n=e.bgColor?e.bgColor:r[e.typeC4Shape.text+"_bg_color"],i=e.borderColor?e.borderColor:r[e.typeC4Shape.text+"_border_color"],a=e.fontColor?e.fontColor:"#FFFFFF",s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let l=t.append("g");l.attr("class","person-man");let u=ua();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":u.x=e.x,u.y=e.y,u.fill=n,u.width=e.width,u.height=e.height,u.stroke=i,u.rx=2.5,u.ry=2.5,u.attrs={"stroke-width":.5},dL(l,u);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2));break}let h=n7e(r,e.typeC4Shape.text);switch(l.append("text").attr("fill",a).attr("font-family",h.fontFamily).attr("font-size",h.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":wj(l,48,48,e.x+e.width/2-24,e.y+e.image.Y,s);break}let f=r[e.typeC4Shape.text+"Font"]();return f.fontWeight="bold",f.fontSize=f.fontSize+2,f.fontColor=a,Au(r)(e.label.text,l,e.x,e.y+e.label.Y,e.width,e.height,{fill:a},f),f=r[e.typeC4Shape.text+"Font"](),f.fontColor=a,e.techn&&e.techn?.text!==""?Au(r)(e.techn.text,l,e.x,e.y+e.techn.Y,e.width,e.height,{fill:a,"font-style":"italic"},f):e.type&&e.type.text!==""&&Au(r)(e.type.text,l,e.x,e.y+e.type.Y,e.width,e.height,{fill:a,"font-style":"italic"},f),e.descr&&e.descr.text!==""&&(f=r.personFont(),f.fontColor=a,Au(r)(e.descr.text,l,e.x,e.y+e.descr.Y,e.width,e.height,{fill:a},f)),e.height},"drawC4Shape"),jCe=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),KCe=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),QCe=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),ZCe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),JCe=o(function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),e7e=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),t7e=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),r7e=o(function(t){let r=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);r.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),r.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),n7e=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"getC4ShapeFont"),Au=(function(){function t(i,a,s,l,u,h,f){let d=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("text-anchor","middle").text(i);n(d,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d){let{fontSize:p,fontFamily:m,fontWeight:g}=d,y=i.split(tt.lineBreakRegex);for(let v=0;v{"use strict";i7e=typeof global=="object"&&global&&global.Object===Object&&global,uT=i7e});var a7e,s7e,hi,Mo=N(()=>{"use strict";pL();a7e=typeof self=="object"&&self&&self.Object===Object&&self,s7e=uT||a7e||Function("return this")(),hi=s7e});var o7e,Ki,$d=N(()=>{"use strict";Mo();o7e=hi.Symbol,Ki=o7e});function u7e(t){var e=l7e.call(t,n2),r=t[n2];try{t[n2]=void 0;var n=!0}catch{}var i=c7e.call(t);return n&&(e?t[n2]=r:delete t[n2]),i}var Ej,l7e,c7e,n2,Sj,Cj=N(()=>{"use strict";$d();Ej=Object.prototype,l7e=Ej.hasOwnProperty,c7e=Ej.toString,n2=Ki?Ki.toStringTag:void 0;o(u7e,"getRawTag");Sj=u7e});function d7e(t){return f7e.call(t)}var h7e,f7e,Aj,_j=N(()=>{"use strict";h7e=Object.prototype,f7e=h7e.toString;o(d7e,"objectToString");Aj=d7e});function g7e(t){return t==null?t===void 0?m7e:p7e:Dj&&Dj in Object(t)?Sj(t):Aj(t)}var p7e,m7e,Dj,ha,_u=N(()=>{"use strict";$d();Cj();_j();p7e="[object Null]",m7e="[object Undefined]",Dj=Ki?Ki.toStringTag:void 0;o(g7e,"baseGetTag");ha=g7e});function y7e(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var Sn,oo=N(()=>{"use strict";o(y7e,"isObject");Sn=y7e});function w7e(t){if(!Sn(t))return!1;var e=ha(t);return e==x7e||e==b7e||e==v7e||e==T7e}var v7e,x7e,b7e,T7e,Si,i2=N(()=>{"use strict";_u();oo();v7e="[object AsyncFunction]",x7e="[object Function]",b7e="[object GeneratorFunction]",T7e="[object Proxy]";o(w7e,"isFunction");Si=w7e});var k7e,hT,Lj=N(()=>{"use strict";Mo();k7e=hi["__core-js_shared__"],hT=k7e});function E7e(t){return!!Rj&&Rj in t}var Rj,Nj,Mj=N(()=>{"use strict";Lj();Rj=(function(){var t=/[^.]+$/.exec(hT&&hT.keys&&hT.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""})();o(E7e,"isMasked");Nj=E7e});function A7e(t){if(t!=null){try{return C7e.call(t)}catch{}try{return t+""}catch{}}return""}var S7e,C7e,Du,mL=N(()=>{"use strict";S7e=Function.prototype,C7e=S7e.toString;o(A7e,"toSource");Du=A7e});function O7e(t){if(!Sn(t)||Nj(t))return!1;var e=Si(t)?I7e:D7e;return e.test(Du(t))}var _7e,D7e,L7e,R7e,N7e,M7e,I7e,Ij,Oj=N(()=>{"use strict";i2();Mj();oo();mL();_7e=/[\\^$.*+?()[\]{}|]/g,D7e=/^\[object .+?Constructor\]$/,L7e=Function.prototype,R7e=Object.prototype,N7e=L7e.toString,M7e=R7e.hasOwnProperty,I7e=RegExp("^"+N7e.call(M7e).replace(_7e,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");o(O7e,"baseIsNative");Ij=O7e});function P7e(t,e){return t?.[e]}var Pj,Bj=N(()=>{"use strict";o(P7e,"getValue");Pj=P7e});function B7e(t,e){var r=Pj(t,e);return Ij(r)?r:void 0}var Ls,Fh=N(()=>{"use strict";Oj();Bj();o(B7e,"getNative");Ls=B7e});var F7e,Lu,a2=N(()=>{"use strict";Fh();F7e=Ls(Object,"create"),Lu=F7e});function $7e(){this.__data__=Lu?Lu(null):{},this.size=0}var Fj,$j=N(()=>{"use strict";a2();o($7e,"hashClear");Fj=$7e});function z7e(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}var zj,Gj=N(()=>{"use strict";o(z7e,"hashDelete");zj=z7e});function H7e(t){var e=this.__data__;if(Lu){var r=e[t];return r===G7e?void 0:r}return U7e.call(e,t)?e[t]:void 0}var G7e,V7e,U7e,Vj,Uj=N(()=>{"use strict";a2();G7e="__lodash_hash_undefined__",V7e=Object.prototype,U7e=V7e.hasOwnProperty;o(H7e,"hashGet");Vj=H7e});function Y7e(t){var e=this.__data__;return Lu?e[t]!==void 0:W7e.call(e,t)}var q7e,W7e,Hj,qj=N(()=>{"use strict";a2();q7e=Object.prototype,W7e=q7e.hasOwnProperty;o(Y7e,"hashHas");Hj=Y7e});function j7e(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Lu&&e===void 0?X7e:e,this}var X7e,Wj,Yj=N(()=>{"use strict";a2();X7e="__lodash_hash_undefined__";o(j7e,"hashSet");Wj=j7e});function rm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";$j();Gj();Uj();qj();Yj();o(rm,"Hash");rm.prototype.clear=Fj;rm.prototype.delete=zj;rm.prototype.get=Vj;rm.prototype.has=Hj;rm.prototype.set=Wj;gL=rm});function K7e(){this.__data__=[],this.size=0}var jj,Kj=N(()=>{"use strict";o(K7e,"listCacheClear");jj=K7e});function Q7e(t,e){return t===e||t!==t&&e!==e}var Io,zd=N(()=>{"use strict";o(Q7e,"eq");Io=Q7e});function Z7e(t,e){for(var r=t.length;r--;)if(Io(t[r][0],e))return r;return-1}var $h,s2=N(()=>{"use strict";zd();o(Z7e,"assocIndexOf");$h=Z7e});function tAe(t){var e=this.__data__,r=$h(e,t);if(r<0)return!1;var n=e.length-1;return r==n?e.pop():eAe.call(e,r,1),--this.size,!0}var J7e,eAe,Qj,Zj=N(()=>{"use strict";s2();J7e=Array.prototype,eAe=J7e.splice;o(tAe,"listCacheDelete");Qj=tAe});function rAe(t){var e=this.__data__,r=$h(e,t);return r<0?void 0:e[r][1]}var Jj,eK=N(()=>{"use strict";s2();o(rAe,"listCacheGet");Jj=rAe});function nAe(t){return $h(this.__data__,t)>-1}var tK,rK=N(()=>{"use strict";s2();o(nAe,"listCacheHas");tK=nAe});function iAe(t,e){var r=this.__data__,n=$h(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}var nK,iK=N(()=>{"use strict";s2();o(iAe,"listCacheSet");nK=iAe});function nm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";Kj();Zj();eK();rK();iK();o(nm,"ListCache");nm.prototype.clear=jj;nm.prototype.delete=Qj;nm.prototype.get=Jj;nm.prototype.has=tK;nm.prototype.set=nK;zh=nm});var aAe,Gh,fT=N(()=>{"use strict";Fh();Mo();aAe=Ls(hi,"Map"),Gh=aAe});function sAe(){this.size=0,this.__data__={hash:new gL,map:new(Gh||zh),string:new gL}}var aK,sK=N(()=>{"use strict";Xj();o2();fT();o(sAe,"mapCacheClear");aK=sAe});function oAe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var oK,lK=N(()=>{"use strict";o(oAe,"isKeyable");oK=oAe});function lAe(t,e){var r=t.__data__;return oK(e)?r[typeof e=="string"?"string":"hash"]:r.map}var Vh,l2=N(()=>{"use strict";lK();o(lAe,"getMapData");Vh=lAe});function cAe(t){var e=Vh(this,t).delete(t);return this.size-=e?1:0,e}var cK,uK=N(()=>{"use strict";l2();o(cAe,"mapCacheDelete");cK=cAe});function uAe(t){return Vh(this,t).get(t)}var hK,fK=N(()=>{"use strict";l2();o(uAe,"mapCacheGet");hK=uAe});function hAe(t){return Vh(this,t).has(t)}var dK,pK=N(()=>{"use strict";l2();o(hAe,"mapCacheHas");dK=hAe});function fAe(t,e){var r=Vh(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this}var mK,gK=N(()=>{"use strict";l2();o(fAe,"mapCacheSet");mK=fAe});function im(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";sK();uK();fK();pK();gK();o(im,"MapCache");im.prototype.clear=aK;im.prototype.delete=cK;im.prototype.get=hK;im.prototype.has=dK;im.prototype.set=mK;Gd=im});function yL(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(dAe);var r=o(function(){var n=arguments,i=e?e.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var s=t.apply(this,n);return r.cache=a.set(i,s)||a,s},"memoized");return r.cache=new(yL.Cache||Gd),r}var dAe,am,vL=N(()=>{"use strict";dT();dAe="Expected a function";o(yL,"memoize");yL.Cache=Gd;am=yL});function pAe(){this.__data__=new zh,this.size=0}var yK,vK=N(()=>{"use strict";o2();o(pAe,"stackClear");yK=pAe});function mAe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}var xK,bK=N(()=>{"use strict";o(mAe,"stackDelete");xK=mAe});function gAe(t){return this.__data__.get(t)}var TK,wK=N(()=>{"use strict";o(gAe,"stackGet");TK=gAe});function yAe(t){return this.__data__.has(t)}var kK,EK=N(()=>{"use strict";o(yAe,"stackHas");kK=yAe});function xAe(t,e){var r=this.__data__;if(r instanceof zh){var n=r.__data__;if(!Gh||n.length{"use strict";o2();fT();dT();vAe=200;o(xAe,"stackSet");SK=xAe});function sm(t){var e=this.__data__=new zh(t);this.size=e.size}var dc,c2=N(()=>{"use strict";o2();vK();bK();wK();EK();CK();o(sm,"Stack");sm.prototype.clear=yK;sm.prototype.delete=xK;sm.prototype.get=TK;sm.prototype.has=kK;sm.prototype.set=SK;dc=sm});var bAe,om,xL=N(()=>{"use strict";Fh();bAe=(function(){try{var t=Ls(Object,"defineProperty");return t({},"",{}),t}catch{}})(),om=bAe});function TAe(t,e,r){e=="__proto__"&&om?om(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var pc,lm=N(()=>{"use strict";xL();o(TAe,"baseAssignValue");pc=TAe});function wAe(t,e,r){(r!==void 0&&!Io(t[e],r)||r===void 0&&!(e in t))&&pc(t,e,r)}var u2,bL=N(()=>{"use strict";lm();zd();o(wAe,"assignMergeValue");u2=wAe});function kAe(t){return function(e,r,n){for(var i=-1,a=Object(e),s=n(e),l=s.length;l--;){var u=s[t?l:++i];if(r(a[u],u,a)===!1)break}return e}}var AK,_K=N(()=>{"use strict";o(kAe,"createBaseFor");AK=kAe});var EAe,cm,pT=N(()=>{"use strict";_K();EAe=AK(),cm=EAe});function CAe(t,e){if(e)return t.slice();var r=t.length,n=RK?RK(r):new t.constructor(r);return t.copy(n),n}var NK,DK,SAe,LK,RK,mT,TL=N(()=>{"use strict";Mo();NK=typeof exports=="object"&&exports&&!exports.nodeType&&exports,DK=NK&&typeof module=="object"&&module&&!module.nodeType&&module,SAe=DK&&DK.exports===NK,LK=SAe?hi.Buffer:void 0,RK=LK?LK.allocUnsafe:void 0;o(CAe,"cloneBuffer");mT=CAe});var AAe,um,wL=N(()=>{"use strict";Mo();AAe=hi.Uint8Array,um=AAe});function _Ae(t){var e=new t.constructor(t.byteLength);return new um(e).set(new um(t)),e}var hm,gT=N(()=>{"use strict";wL();o(_Ae,"cloneArrayBuffer");hm=_Ae});function DAe(t,e){var r=e?hm(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}var yT,kL=N(()=>{"use strict";gT();o(DAe,"cloneTypedArray");yT=DAe});function LAe(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r{"use strict";o(LAe,"copyArray");vT=LAe});var MK,RAe,IK,OK=N(()=>{"use strict";oo();MK=Object.create,RAe=(function(){function t(){}return o(t,"object"),function(e){if(!Sn(e))return{};if(MK)return MK(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}})(),IK=RAe});function NAe(t,e){return function(r){return t(e(r))}}var xT,SL=N(()=>{"use strict";o(NAe,"overArg");xT=NAe});var MAe,fm,bT=N(()=>{"use strict";SL();MAe=xT(Object.getPrototypeOf,Object),fm=MAe});function OAe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||IAe;return t===r}var IAe,mc,dm=N(()=>{"use strict";IAe=Object.prototype;o(OAe,"isPrototype");mc=OAe});function PAe(t){return typeof t.constructor=="function"&&!mc(t)?IK(fm(t)):{}}var TT,CL=N(()=>{"use strict";OK();bT();dm();o(PAe,"initCloneObject");TT=PAe});function BAe(t){return t!=null&&typeof t=="object"}var ai,Oo=N(()=>{"use strict";o(BAe,"isObjectLike");ai=BAe});function $Ae(t){return ai(t)&&ha(t)==FAe}var FAe,AL,PK=N(()=>{"use strict";_u();Oo();FAe="[object Arguments]";o($Ae,"baseIsArguments");AL=$Ae});var BK,zAe,GAe,VAe,_l,pm=N(()=>{"use strict";PK();Oo();BK=Object.prototype,zAe=BK.hasOwnProperty,GAe=BK.propertyIsEnumerable,VAe=AL((function(){return arguments})())?AL:function(t){return ai(t)&&zAe.call(t,"callee")&&!GAe.call(t,"callee")},_l=VAe});var UAe,Bt,Yn=N(()=>{"use strict";UAe=Array.isArray,Bt=UAe});function qAe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=HAe}var HAe,mm,wT=N(()=>{"use strict";HAe=9007199254740991;o(qAe,"isLength");mm=qAe});function WAe(t){return t!=null&&mm(t.length)&&!Si(t)}var fi,Po=N(()=>{"use strict";i2();wT();o(WAe,"isArrayLike");fi=WAe});function YAe(t){return ai(t)&&fi(t)}var Vd,kT=N(()=>{"use strict";Po();Oo();o(YAe,"isArrayLikeObject");Vd=YAe});function XAe(){return!1}var FK,$K=N(()=>{"use strict";o(XAe,"stubFalse");FK=XAe});var VK,zK,jAe,GK,KAe,QAe,Dl,gm=N(()=>{"use strict";Mo();$K();VK=typeof exports=="object"&&exports&&!exports.nodeType&&exports,zK=VK&&typeof module=="object"&&module&&!module.nodeType&&module,jAe=zK&&zK.exports===VK,GK=jAe?hi.Buffer:void 0,KAe=GK?GK.isBuffer:void 0,QAe=KAe||FK,Dl=QAe});function n8e(t){if(!ai(t)||ha(t)!=ZAe)return!1;var e=fm(t);if(e===null)return!0;var r=t8e.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&UK.call(r)==r8e}var ZAe,JAe,e8e,UK,t8e,r8e,HK,qK=N(()=>{"use strict";_u();bT();Oo();ZAe="[object Object]",JAe=Function.prototype,e8e=Object.prototype,UK=JAe.toString,t8e=e8e.hasOwnProperty,r8e=UK.call(Object);o(n8e,"isPlainObject");HK=n8e});function _8e(t){return ai(t)&&mm(t.length)&&!!Gn[ha(t)]}var i8e,a8e,s8e,o8e,l8e,c8e,u8e,h8e,f8e,d8e,p8e,m8e,g8e,y8e,v8e,x8e,b8e,T8e,w8e,k8e,E8e,S8e,C8e,A8e,Gn,WK,YK=N(()=>{"use strict";_u();wT();Oo();i8e="[object Arguments]",a8e="[object Array]",s8e="[object Boolean]",o8e="[object Date]",l8e="[object Error]",c8e="[object Function]",u8e="[object Map]",h8e="[object Number]",f8e="[object Object]",d8e="[object RegExp]",p8e="[object Set]",m8e="[object String]",g8e="[object WeakMap]",y8e="[object ArrayBuffer]",v8e="[object DataView]",x8e="[object Float32Array]",b8e="[object Float64Array]",T8e="[object Int8Array]",w8e="[object Int16Array]",k8e="[object Int32Array]",E8e="[object Uint8Array]",S8e="[object Uint8ClampedArray]",C8e="[object Uint16Array]",A8e="[object Uint32Array]",Gn={};Gn[x8e]=Gn[b8e]=Gn[T8e]=Gn[w8e]=Gn[k8e]=Gn[E8e]=Gn[S8e]=Gn[C8e]=Gn[A8e]=!0;Gn[i8e]=Gn[a8e]=Gn[y8e]=Gn[s8e]=Gn[v8e]=Gn[o8e]=Gn[l8e]=Gn[c8e]=Gn[u8e]=Gn[h8e]=Gn[f8e]=Gn[d8e]=Gn[p8e]=Gn[m8e]=Gn[g8e]=!1;o(_8e,"baseIsTypedArray");WK=_8e});function D8e(t){return function(e){return t(e)}}var Bo,Ud=N(()=>{"use strict";o(D8e,"baseUnary");Bo=D8e});var XK,h2,L8e,_L,R8e,Fo,f2=N(()=>{"use strict";pL();XK=typeof exports=="object"&&exports&&!exports.nodeType&&exports,h2=XK&&typeof module=="object"&&module&&!module.nodeType&&module,L8e=h2&&h2.exports===XK,_L=L8e&&uT.process,R8e=(function(){try{var t=h2&&h2.require&&h2.require("util").types;return t||_L&&_L.binding&&_L.binding("util")}catch{}})(),Fo=R8e});var jK,N8e,Uh,d2=N(()=>{"use strict";YK();Ud();f2();jK=Fo&&Fo.isTypedArray,N8e=jK?Bo(jK):WK,Uh=N8e});function M8e(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}var p2,DL=N(()=>{"use strict";o(M8e,"safeGet");p2=M8e});function P8e(t,e,r){var n=t[e];(!(O8e.call(t,e)&&Io(n,r))||r===void 0&&!(e in t))&&pc(t,e,r)}var I8e,O8e,gc,ym=N(()=>{"use strict";lm();zd();I8e=Object.prototype,O8e=I8e.hasOwnProperty;o(P8e,"assignValue");gc=P8e});function B8e(t,e,r,n){var i=!r;r||(r={});for(var a=-1,s=e.length;++a{"use strict";ym();lm();o(B8e,"copyObject");$o=B8e});function F8e(t,e){for(var r=-1,n=Array(t);++r{"use strict";o(F8e,"baseTimes");KK=F8e});function G8e(t,e){var r=typeof t;return e=e??$8e,!!e&&(r=="number"||r!="symbol"&&z8e.test(t))&&t>-1&&t%1==0&&t{"use strict";$8e=9007199254740991,z8e=/^(?:0|[1-9]\d*)$/;o(G8e,"isIndex");Hh=G8e});function H8e(t,e){var r=Bt(t),n=!r&&_l(t),i=!r&&!n&&Dl(t),a=!r&&!n&&!i&&Uh(t),s=r||n||i||a,l=s?KK(t.length,String):[],u=l.length;for(var h in t)(e||U8e.call(t,h))&&!(s&&(h=="length"||i&&(h=="offset"||h=="parent")||a&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||Hh(h,u)))&&l.push(h);return l}var V8e,U8e,ET,LL=N(()=>{"use strict";QK();pm();Yn();gm();m2();d2();V8e=Object.prototype,U8e=V8e.hasOwnProperty;o(H8e,"arrayLikeKeys");ET=H8e});function q8e(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}var ZK,JK=N(()=>{"use strict";o(q8e,"nativeKeysIn");ZK=q8e});function X8e(t){if(!Sn(t))return ZK(t);var e=mc(t),r=[];for(var n in t)n=="constructor"&&(e||!Y8e.call(t,n))||r.push(n);return r}var W8e,Y8e,eQ,tQ=N(()=>{"use strict";oo();dm();JK();W8e=Object.prototype,Y8e=W8e.hasOwnProperty;o(X8e,"baseKeysIn");eQ=X8e});function j8e(t){return fi(t)?ET(t,!0):eQ(t)}var Rs,qh=N(()=>{"use strict";LL();tQ();Po();o(j8e,"keysIn");Rs=j8e});function K8e(t){return $o(t,Rs(t))}var rQ,nQ=N(()=>{"use strict";Hd();qh();o(K8e,"toPlainObject");rQ=K8e});function Q8e(t,e,r,n,i,a,s){var l=p2(t,r),u=p2(e,r),h=s.get(u);if(h){u2(t,r,h);return}var f=a?a(l,u,r+"",t,e,s):void 0,d=f===void 0;if(d){var p=Bt(u),m=!p&&Dl(u),g=!p&&!m&&Uh(u);f=u,p||m||g?Bt(l)?f=l:Vd(l)?f=vT(l):m?(d=!1,f=mT(u,!0)):g?(d=!1,f=yT(u,!0)):f=[]:HK(u)||_l(u)?(f=l,_l(l)?f=rQ(l):(!Sn(l)||Si(l))&&(f=TT(u))):d=!1}d&&(s.set(u,f),i(f,u,n,a,s),s.delete(u)),u2(t,r,f)}var iQ,aQ=N(()=>{"use strict";bL();TL();kL();EL();CL();pm();Yn();kT();gm();i2();oo();qK();d2();DL();nQ();o(Q8e,"baseMergeDeep");iQ=Q8e});function sQ(t,e,r,n,i){t!==e&&cm(e,function(a,s){if(i||(i=new dc),Sn(a))iQ(t,e,s,r,sQ,n,i);else{var l=n?n(p2(t,s),a,s+"",t,e,i):void 0;l===void 0&&(l=a),u2(t,s,l)}},Rs)}var oQ,lQ=N(()=>{"use strict";c2();bL();pT();aQ();oo();qh();DL();o(sQ,"baseMerge");oQ=sQ});function Z8e(t){return t}var Qi,Ru=N(()=>{"use strict";o(Z8e,"identity");Qi=Z8e});function J8e(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}var cQ,uQ=N(()=>{"use strict";o(J8e,"apply");cQ=J8e});function e_e(t,e,r){return e=hQ(e===void 0?t.length-1:e,0),function(){for(var n=arguments,i=-1,a=hQ(n.length-e,0),s=Array(a);++i{"use strict";uQ();hQ=Math.max;o(e_e,"overRest");ST=e_e});function t_e(t){return function(){return t}}var Ns,NL=N(()=>{"use strict";o(t_e,"constant");Ns=t_e});var r_e,fQ,dQ=N(()=>{"use strict";NL();xL();Ru();r_e=om?function(t,e){return om(t,"toString",{configurable:!0,enumerable:!1,value:Ns(e),writable:!0})}:Qi,fQ=r_e});function s_e(t){var e=0,r=0;return function(){var n=a_e(),i=i_e-(n-r);if(r=n,i>0){if(++e>=n_e)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var n_e,i_e,a_e,pQ,mQ=N(()=>{"use strict";n_e=800,i_e=16,a_e=Date.now;o(s_e,"shortOut");pQ=s_e});var o_e,CT,ML=N(()=>{"use strict";dQ();mQ();o_e=pQ(fQ),CT=o_e});function l_e(t,e){return CT(ST(t,e,Qi),t+"")}var yc,vm=N(()=>{"use strict";Ru();RL();ML();o(l_e,"baseRest");yc=l_e});function c_e(t,e,r){if(!Sn(r))return!1;var n=typeof e;return(n=="number"?fi(r)&&Hh(e,r.length):n=="string"&&e in r)?Io(r[e],t):!1}var lo,qd=N(()=>{"use strict";zd();Po();m2();oo();o(c_e,"isIterateeCall");lo=c_e});function u_e(t){return yc(function(e,r){var n=-1,i=r.length,a=i>1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(a=t.length>3&&typeof a=="function"?(i--,a):void 0,s&&lo(r[0],r[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++n{"use strict";vm();qd();o(u_e,"createAssigner");AT=u_e});var h_e,Wh,OL=N(()=>{"use strict";lQ();IL();h_e=AT(function(t,e,r){oQ(t,e,r)}),Wh=h_e});function FL(t,e){if(!t)return e;let r=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return f_e[r]??e}function g_e(t,e){let r=t.trim();if(r)return e.securityLevel!=="loose"?(0,vQ.sanitizeUrl)(r):r}function TQ(t,e){return!t||!e?0:Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function v_e(t){let e,r=0;t.forEach(i=>{r+=TQ(i,e),e=i});let n=r/2;return $L(t,n)}function x_e(t){return t.length===1?t[0]:v_e(t)}function T_e(t,e,r){let n=structuredClone(r);X.info("our points",n),e!=="start_left"&&e!=="start_right"&&n.reverse();let i=25+t,a=$L(n,i),s=10+t*.5,l=Math.atan2(n[0].y-a.y,n[0].x-a.x),u={x:0,y:0};return e==="start_left"?(u.x=Math.sin(l+Math.PI)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l+Math.PI)*s+(n[0].y+a.y)/2):e==="end_right"?(u.x=Math.sin(l-Math.PI)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l-Math.PI)*s+(n[0].y+a.y)/2-5):e==="end_left"?(u.x=Math.sin(l)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2-5):(u.x=Math.sin(l)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2),u}function zL(t){let e="",r="";for(let n of t)n!==void 0&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":e=e+n+";");return{style:e,labelStyle:r}}function w_e(t){let e="",r="0123456789abcdef",n=r.length;for(let i=0;iMath.round(parseFloat(a)).toString());return i.includes(r.toString())||i.includes(n.toString())}var vQ,BL,f_e,d_e,p_e,xQ,bQ,m_e,y_e,gQ,$L,b_e,yQ,GL,VL,k_e,E_e,UL,S_e,HL,PL,_T,C_e,A_e,vc,qt,wQ,Ji,xc,tr=N(()=>{"use strict";vQ=ja(tm(),1);yr();gr();S7();pt();vd();v0();vL();OL();F3();BL="\u200B",f_e={curveBasis:No,curveBasisClosed:K5,curveBasisOpen:Q5,curveBumpX:Vv,curveBumpY:Uv,curveBundle:tL,curveCardinalClosed:rL,curveCardinalOpen:iL,curveCardinal:Yv,curveCatmullRomClosed:sL,curveCatmullRomOpen:oL,curveCatmullRom:Kv,curveLinear:Cu,curveLinearClosed:rT,curveMonotoneX:Qv,curveMonotoneY:Zv,curveNatural:J0,curveStep:em,curveStepAfter:e2,curveStepBefore:Jv},d_e=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,p_e=o(function(t,e){let r=xQ(t,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(r)){let s=r.map(l=>l.args);b0(s),n=Rn(n,[...s])}else n=r.args;if(!n)return;let i=_0(t,e),a="config";return n[a]!==void 0&&(i==="flowchart-v2"&&(i="flowchart"),n[i]=n[a],delete n[a]),n},"detectInit"),xQ=o(function(t,e=null){try{let r=new RegExp(`[%]{2}(?![{]${d_e.source})(?=[}][%]{2}).* +`,"ig");t=t.trim().replace(r,"").replace(/'/gm,'"'),X.debug(`Detecting diagram directive${e!==null?" type:"+e:""} based on the text:${t}`);let n,i=[];for(;(n=yd.exec(t))!==null;)if(n.index===yd.lastIndex&&yd.lastIndex++,n&&!e||e&&n[1]?.match(e)||e&&n[2]?.match(e)){let a=n[1]?n[1]:n[2],s=n[3]?n[3].trim():n[4]?JSON.parse(n[4].trim()):null;i.push({type:a,args:s})}return i.length===0?{type:t,args:null}:i.length===1?i[0]:i}catch(r){return X.error(`ERROR: ${r.message} - Unable to parse directive type: '${e}' based on the text: '${t}'`),{type:void 0,args:null}}},"detectDirective"),bQ=o(function(t){return t.replace(yd,"")},"removeDirectives"),m_e=o(function(t,e){for(let[r,n]of e.entries())if(n.match(t))return r;return-1},"isSubstringInArray");o(FL,"interpolateToCurve");o(g_e,"formatUrl");y_e=o((t,...e)=>{let r=t.split("."),n=r.length-1,i=r[n],a=window;for(let s=0;s{let r=Math.pow(10,e);return Math.round(t*r)/r},"roundNumber"),$L=o((t,e)=>{let r,n=e;for(let i of t){if(r){let a=TQ(i,r);if(a===0)return r;if(a=1)return{x:i.x,y:i.y};if(s>0&&s<1)return{x:gQ((1-s)*r.x+s*i.x,5),y:gQ((1-s)*r.y+s*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),b_e=o((t,e,r)=>{X.info(`our points ${JSON.stringify(e)}`),e[0]!==r&&(e=e.reverse());let i=$L(e,25),a=t?10:5,s=Math.atan2(e[0].y-i.y,e[0].x-i.x),l={x:0,y:0};return l.x=Math.sin(s)*a+(e[0].x+i.x)/2,l.y=-Math.cos(s)*a+(e[0].y+i.y)/2,l},"calcCardinalityPosition");o(T_e,"calcTerminalLabelPosition");o(zL,"getStylesFromArray");yQ=0,GL=o(()=>(yQ++,"id-"+Math.random().toString(36).substr(2,12)+"-"+yQ),"generateId");o(w_e,"makeRandomHex");VL=o(t=>w_e(t.length),"random"),k_e=o(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),E_e=o(function(t,e){let r=e.text.replace(tt.lineBreakRegex," "),[,n]=vc(e.fontSize),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.style("font-family",e.fontFamily),i.style("font-size",n),i.style("font-weight",e.fontWeight),i.attr("fill",e.fill),e.class!==void 0&&i.attr("class",e.class);let a=i.append("tspan");return a.attr("x",e.x+e.textMargin*2),a.attr("fill",e.fill),a.text(r),i},"drawSimpleText"),UL=am((t,e,r)=>{if(!t||(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
    "},r),tt.lineBreakRegex.test(t)))return t;let n=t.split(" ").filter(Boolean),i=[],a="";return n.forEach((s,l)=>{let u=Zi(`${s} `,r),h=Zi(a,r);if(u>e){let{hyphenatedStrings:p,remainingWord:m}=S_e(s,e,"-",r);i.push(a,...p),a=m}else h+u>=e?(i.push(a),a=s):a=[a,s].filter(Boolean).join(" ");l+1===n.length&&i.push(a)}),i.filter(s=>s!=="").join(r.joinWith)},(t,e,r)=>`${t}${e}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),S_e=am((t,e,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);let i=[...t],a=[],s="";return i.forEach((l,u)=>{let h=`${s}${l}`;if(Zi(h,n)>=e){let d=u+1,p=i.length===d,m=`${h}${r}`;a.push(p?h:m),s=""}else s=h}),{hyphenatedStrings:a,remainingWord:s}},(t,e,r="-",n)=>`${t}${e}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);o(DT,"calculateTextHeight");o(Zi,"calculateTextWidth");HL=am((t,e)=>{let{fontSize:r=12,fontFamily:n="Arial",fontWeight:i=400}=e;if(!t)return{width:0,height:0};let[,a]=vc(r),s=["sans-serif",n],l=t.split(tt.lineBreakRegex),u=[],h=qe("body");if(!h.remove)return{width:0,height:0,lineHeight:0};let f=h.append("svg");for(let p of s){let m=0,g={width:0,height:0,lineHeight:0};for(let y of l){let v=k_e();v.text=y||BL;let x=E_e(f,v).style("font-size",a).style("font-weight",i).style("font-family",p),b=(x._groups||x)[0][0].getBBox();if(b.width===0&&b.height===0)throw new Error("svg element not in render tree");g.width=Math.round(Math.max(g.width,b.width)),m=Math.round(b.height),g.height+=m,g.lineHeight=Math.round(Math.max(g.lineHeight,m))}u.push(g)}f.remove();let d=isNaN(u[1].height)||isNaN(u[1].width)||isNaN(u[1].lineHeight)||u[0].height>u[1].height&&u[0].width>u[1].width&&u[0].lineHeight>u[1].lineHeight?0:1;return u[d]},(t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`),PL=class{constructor(e=!1,r){this.count=0;this.count=r?r.length:0,this.next=e?()=>this.count++:()=>Date.now()}static{o(this,"InitIDGenerator")}},C_e=o(function(t){return _T=_T||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),_T.innerHTML=t,unescape(_T.textContent)},"entityDecode");o(qL,"isDetailedError");A_e=o((t,e,r,n)=>{if(!n)return;let i=t.node()?.getBBox();i&&t.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",e)},"insertTitle"),vc=o(t=>{if(typeof t=="number")return[t,t+"px"];let e=parseInt(t??"",10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},"parseFontSize");o(Vn,"cleanAndMerge");qt={assignWithDepth:Rn,wrapLabel:UL,calculateTextHeight:DT,calculateTextWidth:Zi,calculateTextDimensions:HL,cleanAndMerge:Vn,detectInit:p_e,detectDirective:xQ,isSubstringInArray:m_e,interpolateToCurve:FL,calcLabelPosition:x_e,calcCardinalityPosition:b_e,calcTerminalLabelPosition:T_e,formatUrl:g_e,getStylesFromArray:zL,generateId:GL,random:VL,runFunc:y_e,entityDecode:C_e,insertTitle:A_e,isLabelCoordinateInPath:__e,parseFontSize:vc,InitIDGenerator:PL},wQ=o(function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/classDef.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/#\w+;/g,function(r){let n=r.substring(1,r.length-1);return/^\+?\d+$/.test(n)?"\uFB02\xB0\xB0"+n+"\xB6\xDF":"\uFB02\xB0"+n+"\xB6\xDF"}),e},"encodeEntities"),Ji=o(function(t){return t.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},"decodeEntities"),xc=o((t,e,{counter:r=0,prefix:n,suffix:i},a)=>a||`${n?`${n}_`:""}${t}_${e}_${r}${i?`_${i}`:""}`,"getEdgeId");o(Cn,"handleUndefinedAttr");o(__e,"isLabelCoordinateInPath")});function Ll(t,e,r,n,i){if(!e[t].width)if(r)e[t].text=UL(e[t].text,i,n),e[t].textLines=e[t].text.split(tt.lineBreakRegex).length,e[t].width=i,e[t].height=DT(e[t].text,n);else{let a=e[t].text.split(tt.lineBreakRegex);e[t].textLines=a.length;let s=0;e[t].height=0,e[t].width=0;for(let l of a)e[t].width=Math.max(Zi(l,n),e[t].width),s=DT(l,n),e[t].height=e[t].height+s}}function AQ(t,e,r,n,i){let a=new MT(i);a.data.widthLimit=r.data.widthLimit/Math.min(WL,n.length);for(let[s,l]of n.entries()){let u=0;l.image={width:0,height:0,Y:0},l.sprite&&(l.image.width=48,l.image.height=48,l.image.Y=u,u=l.image.Y+l.image.height);let h=l.wrap&&Wt.wrap,f=LT(Wt);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Ll("label",l,h,f,a.data.widthLimit),l.label.Y=u+8,u=l.label.Y+l.label.height,l.type&&l.type.text!==""){l.type.text="["+l.type.text+"]";let g=LT(Wt);Ll("type",l,h,g,a.data.widthLimit),l.type.Y=u+5,u=l.type.Y+l.type.height}if(l.descr&&l.descr.text!==""){let g=LT(Wt);g.fontSize=g.fontSize-2,Ll("descr",l,h,g,a.data.widthLimit),l.descr.Y=u+20,u=l.descr.Y+l.descr.height}if(s==0||s%WL===0){let g=r.data.startx+Wt.diagramMarginX,y=r.data.stopy+Wt.diagramMarginY+u;a.setData(g,g,y,y)}else{let g=a.data.stopx!==a.data.startx?a.data.stopx+Wt.diagramMarginX:a.data.startx,y=a.data.starty;a.setData(g,g,y,y)}a.name=l.alias;let d=i.db.getC4ShapeArray(l.alias),p=i.db.getC4ShapeKeys(l.alias);p.length>0&&CQ(a,t,d,p),e=l.alias;let m=i.db.getBoundaries(e);m.length>0&&AQ(t,e,a,m,i),l.alias!=="global"&&SQ(t,l,a),r.data.stopy=Math.max(a.data.stopy+Wt.c4ShapeMargin,r.data.stopy),r.data.stopx=Math.max(a.data.stopx+Wt.c4ShapeMargin,r.data.stopx),RT=Math.max(RT,r.data.stopx),NT=Math.max(NT,r.data.stopy)}}var RT,NT,EQ,WL,Wt,MT,YL,g2,LT,D_e,SQ,CQ,Ms,kQ,L_e,R_e,N_e,XL,_Q=N(()=>{"use strict";yr();kj();pt();RA();gr();GA();Xt();v0();tr();Ei();RT=0,NT=0,EQ=4,WL=2;tv.yy=ov;Wt={},MT=class{static{o(this,"Bounds")}constructor(e){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,YL(e.db.getConfig())}setData(e,r,n,i){this.nextData.startx=this.data.startx=e,this.nextData.stopx=this.data.stopx=r,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(e,r,n,i){e[r]===void 0?e[r]=n:e[r]=i(n,e[r])}insert(e){this.nextData.cnt=this.nextData.cnt+1;let r=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+e.margin:this.nextData.stopx+e.margin*2,n=r+e.width,i=this.nextData.starty+e.margin*2,a=i+e.height;(r>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>EQ)&&(r=this.nextData.startx+e.margin+Wt.nextLinePaddingX,i=this.nextData.stopy+e.margin*2,this.nextData.stopx=n=r+e.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=a=i+e.height,this.nextData.cnt=1),e.x=r,e.y=i,this.updateVal(this.data,"startx",r,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",a,Math.max),this.updateVal(this.nextData,"startx",r,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",a,Math.max)}init(e){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},YL(e.db.getConfig())}bumpLastMargin(e){this.data.stopx+=e,this.data.stopy+=e}},YL=o(function(t){Rn(Wt,t),t.fontFamily&&(Wt.personFontFamily=Wt.systemFontFamily=Wt.messageFontFamily=t.fontFamily),t.fontSize&&(Wt.personFontSize=Wt.systemFontSize=Wt.messageFontSize=t.fontSize),t.fontWeight&&(Wt.personFontWeight=Wt.systemFontWeight=Wt.messageFontWeight=t.fontWeight)},"setConf"),g2=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"c4ShapeFont"),LT=o(t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight}),"boundaryFont"),D_e=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont");o(Ll,"calcC4ShapeTextWH");SQ=o(function(t,e,r){e.x=r.data.startx,e.y=r.data.starty,e.width=r.data.stopx-r.data.startx,e.height=r.data.stopy-r.data.starty,e.label.y=Wt.c4ShapeMargin-35;let n=e.wrap&&Wt.wrap,i=LT(Wt);i.fontSize=i.fontSize+2,i.fontWeight="bold";let a=Zi(e.label.text,i);Ll("label",e,n,i,a),Al.drawBoundary(t,e,Wt)},"drawBoundary"),CQ=o(function(t,e,r,n){let i=0;for(let a of n){i=0;let s=r[a],l=g2(Wt,s.typeC4Shape.text);switch(l.fontSize=l.fontSize-2,s.typeC4Shape.width=Zi("\xAB"+s.typeC4Shape.text+"\xBB",l),s.typeC4Shape.height=l.fontSize+2,s.typeC4Shape.Y=Wt.c4ShapePadding,i=s.typeC4Shape.Y+s.typeC4Shape.height-4,s.image={width:0,height:0,Y:0},s.typeC4Shape.text){case"person":case"external_person":s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height;break}s.sprite&&(s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height);let u=s.wrap&&Wt.wrap,h=Wt.width-Wt.c4ShapePadding*2,f=g2(Wt,s.typeC4Shape.text);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Ll("label",s,u,f,h),s.label.Y=i+8,i=s.label.Y+s.label.height,s.type&&s.type.text!==""){s.type.text="["+s.type.text+"]";let m=g2(Wt,s.typeC4Shape.text);Ll("type",s,u,m,h),s.type.Y=i+5,i=s.type.Y+s.type.height}else if(s.techn&&s.techn.text!==""){s.techn.text="["+s.techn.text+"]";let m=g2(Wt,s.techn.text);Ll("techn",s,u,m,h),s.techn.Y=i+5,i=s.techn.Y+s.techn.height}let d=i,p=s.label.width;if(s.descr&&s.descr.text!==""){let m=g2(Wt,s.typeC4Shape.text);Ll("descr",s,u,m,h),s.descr.Y=i+20,i=s.descr.Y+s.descr.height,p=Math.max(s.label.width,s.descr.width),d=i-s.descr.textLines*5}p=p+Wt.c4ShapePadding,s.width=Math.max(s.width||Wt.width,p,Wt.width),s.height=Math.max(s.height||Wt.height,d,Wt.height),s.margin=s.margin||Wt.c4ShapeMargin,t.insert(s),Al.drawC4Shape(e,s,Wt)}t.bumpLastMargin(Wt.c4ShapeMargin)},"drawC4ShapeArray"),Ms=class{static{o(this,"Point")}constructor(e,r){this.x=e,this.y=r}},kQ=o(function(t,e){let r=t.x,n=t.y,i=e.x,a=e.y,s=r+t.width/2,l=n+t.height/2,u=Math.abs(r-i),h=Math.abs(n-a),f=h/u,d=t.height/t.width,p=null;return n==a&&ri?p=new Ms(r,l):r==i&&na&&(p=new Ms(s,n)),r>i&&n=f?p=new Ms(r,l+f*t.width/2):p=new Ms(s-u/h*t.height/2,n+t.height):r=f?p=new Ms(r+t.width,l+f*t.width/2):p=new Ms(s+u/h*t.height/2,n+t.height):ra?d>=f?p=new Ms(r+t.width,l-f*t.width/2):p=new Ms(s+t.height/2*u/h,n):r>i&&n>a&&(d>=f?p=new Ms(r,l-t.width/2*f):p=new Ms(s-t.height/2*u/h,n)),p},"getIntersectPoint"),L_e=o(function(t,e){let r={x:0,y:0};r.x=e.x+e.width/2,r.y=e.y+e.height/2;let n=kQ(t,r);r.x=t.x+t.width/2,r.y=t.y+t.height/2;let i=kQ(e,r);return{startPoint:n,endPoint:i}},"getIntersectPoints"),R_e=o(function(t,e,r,n){let i=0;for(let a of e){i=i+1;let s=a.wrap&&Wt.wrap,l=D_e(Wt);n.db.getC4Type()==="C4Dynamic"&&(a.label.text=i+": "+a.label.text);let h=Zi(a.label.text,l);Ll("label",a,s,l,h),a.techn&&a.techn.text!==""&&(h=Zi(a.techn.text,l),Ll("techn",a,s,l,h)),a.descr&&a.descr.text!==""&&(h=Zi(a.descr.text,l),Ll("descr",a,s,l,h));let f=r(a.from),d=r(a.to),p=L_e(f,d);a.startPoint=p.startPoint,a.endPoint=p.endPoint}Al.drawRels(t,e,Wt)},"drawRels");o(AQ,"drawInsideBoundary");N_e=o(function(t,e,r,n){Wt=ge().c4;let i=ge().securityLevel,a;i==="sandbox"&&(a=qe("#i"+e));let s=i==="sandbox"?qe(a.nodes()[0].contentDocument.body):qe("body"),l=n.db;n.db.setWrap(Wt.wrap),EQ=l.getC4ShapeInRow(),WL=l.getC4BoundaryInRow(),X.debug(`C:${JSON.stringify(Wt,null,2)}`);let u=i==="sandbox"?s.select(`[id="${e}"]`):qe(`[id="${e}"]`);Al.insertComputerIcon(u),Al.insertDatabaseIcon(u),Al.insertClockIcon(u);let h=new MT(n);h.setData(Wt.diagramMarginX,Wt.diagramMarginX,Wt.diagramMarginY,Wt.diagramMarginY),h.data.widthLimit=screen.availWidth,RT=Wt.diagramMarginX,NT=Wt.diagramMarginY;let f=n.db.getTitle(),d=n.db.getBoundaries("");AQ(u,"",h,d,n),Al.insertArrowHead(u),Al.insertArrowEnd(u),Al.insertArrowCrossHead(u),Al.insertArrowFilledHead(u),R_e(u,n.db.getRels(),n.db.getC4Shape,n),h.data.stopx=RT,h.data.stopy=NT;let p=h.data,g=p.stopy-p.starty+2*Wt.diagramMarginY,v=p.stopx-p.startx+2*Wt.diagramMarginX;f&&u.append("text").text(f).attr("x",(p.stopx-p.startx)/2-4*Wt.diagramMarginX).attr("y",p.starty+Wt.diagramMarginY),mn(u,g,v,Wt.useMaxWidth);let x=f?60:0;u.attr("viewBox",p.startx-Wt.diagramMarginX+" -"+(Wt.diagramMarginY+x)+" "+v+" "+(g+x)),X.debug("models:",p)},"draw"),XL={drawPersonOrSystemArray:CQ,drawBoundary:SQ,setConf:YL,draw:N_e}});var M_e,DQ,LQ=N(()=>{"use strict";M_e=o(t=>`.person { + stroke: ${t.personBorder}; + fill: ${t.personBkg}; + } +`,"getStyles"),DQ=M_e});var RQ={};dr(RQ,{diagram:()=>I_e});var I_e,NQ=N(()=>{"use strict";RA();GA();_Q();LQ();I_e={parser:nH,db:ov,renderer:XL,styles:DQ,init:o(({c4:t,wrap:e})=>{XL.setConf(t),ov.setWrap(e)},"init")}});function jQ(t){return typeof t>"u"||t===null}function F_e(t){return typeof t=="object"&&t!==null}function $_e(t){return Array.isArray(t)?t:jQ(t)?[]:[t]}function z_e(t,e){var r,n,i,a;if(e)for(a=Object.keys(e),r=0,n=a.length;rl&&(a=" ... ",e=n-l+a.length),r-n>l&&(s=" ...",r=n+l-s.length),{str:a+t.slice(e,r).replace(/\t/g,"\u2192")+s,pos:n-e+a.length}}function KL(t,e){return Pi.repeat(" ",e-t.length)+t}function j_e(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),typeof e.indent!="number"&&(e.indent=1),typeof e.linesBefore!="number"&&(e.linesBefore=3),typeof e.linesAfter!="number"&&(e.linesAfter=2);for(var r=/\r?\n|\r|\0/g,n=[0],i=[],a,s=-1;a=r.exec(t.buffer);)i.push(a.index),n.push(a.index+a[0].length),t.position<=a.index&&s<0&&(s=n.length-2);s<0&&(s=n.length-1);var l="",u,h,f=Math.min(t.line+e.linesAfter,i.length).toString().length,d=e.maxLength-(e.indent+f+3);for(u=1;u<=e.linesBefore&&!(s-u<0);u++)h=jL(t.buffer,n[s-u],i[s-u],t.position-(n[s]-n[s-u]),d),l=Pi.repeat(" ",e.indent)+KL((t.line-u+1).toString(),f)+" | "+h.str+` +`+l;for(h=jL(t.buffer,n[s],i[s],t.position,d),l+=Pi.repeat(" ",e.indent)+KL((t.line+1).toString(),f)+" | "+h.str+` +`,l+=Pi.repeat("-",e.indent+f+3+h.pos)+`^ +`,u=1;u<=e.linesAfter&&!(s+u>=i.length);u++)h=jL(t.buffer,n[s+u],i[s+u],t.position-(n[s]-n[s+u]),d),l+=Pi.repeat(" ",e.indent)+KL((t.line+u+1).toString(),f)+" | "+h.str+` +`;return l.replace(/\n$/,"")}function J_e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(n){e[String(n)]=r})}),e}function eDe(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(Q_e.indexOf(r)===-1)throw new Is('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=J_e(e.styleAliases||null),Z_e.indexOf(this.kind)===-1)throw new Is('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}function IQ(t,e){var r=[];return t[e].forEach(function(n){var i=r.length;r.forEach(function(a,s){a.tag===n.tag&&a.kind===n.kind&&a.multi===n.multi&&(i=s)}),r[i]=n}),r}function tDe(){var t={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},e,r;function n(i){i.multi?(t.multi[i.kind].push(i),t.multi.fallback.push(i)):t[i.kind][i.tag]=t.fallback[i.tag]=i}for(o(n,"collectType"),e=0,r=arguments.length;e=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:r*parseFloat(e,10)}function CDe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Pi.isNegativeZero(t))return"-0.0";return r=t.toString(10),SDe.test(r)?r.replace("e",".e"):r}function ADe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||Pi.isNegativeZero(t))}function LDe(t){return t===null?!1:ZQ.exec(t)!==null||JQ.exec(t)!==null}function RDe(t){var e,r,n,i,a,s,l,u=0,h=null,f,d,p;if(e=ZQ.exec(t),e===null&&(e=JQ.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(r,n,i));if(a=+e[4],s=+e[5],l=+e[6],e[7]){for(u=e[7].slice(0,3);u.length<3;)u+="0";u=+u}return e[9]&&(f=+e[10],d=+(e[11]||0),h=(f*60+d)*6e4,e[9]==="-"&&(h=-h)),p=new Date(Date.UTC(r,n,i,a,s,l,u)),h&&p.setTime(p.getTime()-h),p}function NDe(t){return t.toISOString()}function IDe(t){return t==="<<"||t===null}function PDe(t){if(t===null)return!1;var e,r,n=0,i=t.length,a=n9;for(r=0;r64)){if(e<0)return!1;n+=6}return n%8===0}function BDe(t){var e,r,n=t.replace(/[\r\n=]/g,""),i=n.length,a=n9,s=0,l=[];for(e=0;e>16&255),l.push(s>>8&255),l.push(s&255)),s=s<<6|a.indexOf(n.charAt(e));return r=i%4*6,r===0?(l.push(s>>16&255),l.push(s>>8&255),l.push(s&255)):r===18?(l.push(s>>10&255),l.push(s>>2&255)):r===12&&l.push(s>>4&255),new Uint8Array(l)}function FDe(t){var e="",r=0,n,i,a=t.length,s=n9;for(n=0;n>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]),r=(r<<8)+t[n];return i=a%3,i===0?(e+=s[r>>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]):i===2?(e+=s[r>>10&63],e+=s[r>>4&63],e+=s[r<<2&63],e+=s[64]):i===1&&(e+=s[r>>2&63],e+=s[r<<4&63],e+=s[64],e+=s[64]),e}function $De(t){return Object.prototype.toString.call(t)==="[object Uint8Array]"}function UDe(t){if(t===null)return!0;var e=[],r,n,i,a,s,l=t;for(r=0,n=l.length;r>10)+55296,(t-65536&1023)+56320)}function lLe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||eZ,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function oZ(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=K_e(r),new Is(e,r)}function Zt(t,e){throw oZ(t,e)}function PT(t,e){t.onWarning&&t.onWarning.call(null,oZ(t,e))}function Yh(t,e,r,n){var i,a,s,l;if(e1&&(t.result+=Pi.repeat(` +`,e-1))}function cLe(t,e,r){var n,i,a,s,l,u,h,f,d=t.kind,p=t.result,m;if(m=t.input.charCodeAt(t.position),Os(m)||bm(m)||m===35||m===38||m===42||m===33||m===124||m===62||m===39||m===34||m===37||m===64||m===96||(m===63||m===45)&&(i=t.input.charCodeAt(t.position+1),Os(i)||r&&bm(i)))return!1;for(t.kind="scalar",t.result="",a=s=t.position,l=!1;m!==0;){if(m===58){if(i=t.input.charCodeAt(t.position+1),Os(i)||r&&bm(i))break}else if(m===35){if(n=t.input.charCodeAt(t.position-1),Os(n))break}else{if(t.position===t.lineStart&&$T(t)||r&&bm(m))break;if(bc(m))if(u=t.line,h=t.lineStart,f=t.lineIndent,Ci(t,!1,-1),t.lineIndent>=e){l=!0,m=t.input.charCodeAt(t.position);continue}else{t.position=s,t.line=u,t.lineStart=h,t.lineIndent=f;break}}l&&(Yh(t,a,s,!1),a9(t,t.line-u),a=s=t.position,l=!1),Yd(m)||(s=t.position+1),m=t.input.charCodeAt(++t.position)}return Yh(t,a,s,!1),t.result?!0:(t.kind=d,t.result=p,!1)}function uLe(t,e){var r,n,i;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(Yh(t,n,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)n=t.position,t.position++,i=t.position;else return!0;else bc(r)?(Yh(t,n,i,!0),a9(t,Ci(t,!1,e)),n=i=t.position):t.position===t.lineStart&&$T(t)?Zt(t,"unexpected end of the document within a single quoted scalar"):(t.position++,i=t.position);Zt(t,"unexpected end of the stream within a single quoted scalar")}function hLe(t,e){var r,n,i,a,s,l;if(l=t.input.charCodeAt(t.position),l!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=n=t.position;(l=t.input.charCodeAt(t.position))!==0;){if(l===34)return Yh(t,r,t.position,!0),t.position++,!0;if(l===92){if(Yh(t,r,t.position,!0),l=t.input.charCodeAt(++t.position),bc(l))Ci(t,!1,e);else if(l<256&&aZ[l])t.result+=sZ[l],t.position++;else if((s=aLe(l))>0){for(i=s,a=0;i>0;i--)l=t.input.charCodeAt(++t.position),(s=iLe(l))>=0?a=(a<<4)+s:Zt(t,"expected hexadecimal character");t.result+=oLe(a),t.position++}else Zt(t,"unknown escape sequence");r=n=t.position}else bc(l)?(Yh(t,r,n,!0),a9(t,Ci(t,!1,e)),r=n=t.position):t.position===t.lineStart&&$T(t)?Zt(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}Zt(t,"unexpected end of the stream within a double quoted scalar")}function fLe(t,e){var r=!0,n,i,a,s=t.tag,l,u=t.anchor,h,f,d,p,m,g=Object.create(null),y,v,x,b;if(b=t.input.charCodeAt(t.position),b===91)f=93,m=!1,l=[];else if(b===123)f=125,m=!0,l={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=l),b=t.input.charCodeAt(++t.position);b!==0;){if(Ci(t,!0,e),b=t.input.charCodeAt(t.position),b===f)return t.position++,t.tag=s,t.anchor=u,t.kind=m?"mapping":"sequence",t.result=l,!0;r?b===44&&Zt(t,"expected the node content, but found ','"):Zt(t,"missed comma between flow collection entries"),v=y=x=null,d=p=!1,b===63&&(h=t.input.charCodeAt(t.position+1),Os(h)&&(d=p=!0,t.position++,Ci(t,!0,e))),n=t.line,i=t.lineStart,a=t.position,wm(t,e,IT,!1,!0),v=t.tag,y=t.result,Ci(t,!0,e),b=t.input.charCodeAt(t.position),(p||t.line===n)&&b===58&&(d=!0,b=t.input.charCodeAt(++t.position),Ci(t,!0,e),wm(t,e,IT,!1,!0),x=t.result),m?Tm(t,l,g,v,y,x,n,i,a):d?l.push(Tm(t,null,g,v,y,x,n,i,a)):l.push(y),Ci(t,!0,e),b=t.input.charCodeAt(t.position),b===44?(r=!0,b=t.input.charCodeAt(++t.position)):r=!1}Zt(t,"unexpected end of the stream within a flow collection")}function dLe(t,e){var r,n,i=QL,a=!1,s=!1,l=e,u=0,h=!1,f,d;if(d=t.input.charCodeAt(t.position),d===124)n=!1;else if(d===62)n=!0;else return!1;for(t.kind="scalar",t.result="";d!==0;)if(d=t.input.charCodeAt(++t.position),d===43||d===45)QL===i?i=d===43?OQ:eLe:Zt(t,"repeat of a chomping mode identifier");else if((f=sLe(d))>=0)f===0?Zt(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?Zt(t,"repeat of an indentation width identifier"):(l=e+f-1,s=!0);else break;if(Yd(d)){do d=t.input.charCodeAt(++t.position);while(Yd(d));if(d===35)do d=t.input.charCodeAt(++t.position);while(!bc(d)&&d!==0)}for(;d!==0;){for(i9(t),t.lineIndent=0,d=t.input.charCodeAt(t.position);(!s||t.lineIndentl&&(l=t.lineIndent),bc(d)){u++;continue}if(t.lineIndente)&&u!==0)Zt(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(v&&(s=t.line,l=t.lineStart,u=t.position),wm(t,e,OT,!0,i)&&(v?g=t.result:y=t.result),v||(Tm(t,d,p,m,g,y,s,l,u),m=g=y=null),Ci(t,!0,-1),b=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&b!==0)Zt(t,"bad indentation of a mapping entry");else if(t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),d=0,p=t.implicitTypes.length;d"),t.result!==null&&g.kind!==t.kind&&Zt(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+g.kind+'", not "'+t.kind+'"'),g.resolve(t.result,t.tag)?(t.result=g.construct(t.result,t.tag),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Zt(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||f}function vLe(t){var e=t.position,r,n,i,a=!1,s;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);(s=t.input.charCodeAt(t.position))!==0&&(Ci(t,!0,-1),s=t.input.charCodeAt(t.position),!(t.lineIndent>0||s!==37));){for(a=!0,s=t.input.charCodeAt(++t.position),r=t.position;s!==0&&!Os(s);)s=t.input.charCodeAt(++t.position);for(n=t.input.slice(r,t.position),i=[],n.length<1&&Zt(t,"directive name must not be less than one character in length");s!==0;){for(;Yd(s);)s=t.input.charCodeAt(++t.position);if(s===35){do s=t.input.charCodeAt(++t.position);while(s!==0&&!bc(s));break}if(bc(s))break;for(r=t.position;s!==0&&!Os(s);)s=t.input.charCodeAt(++t.position);i.push(t.input.slice(r,t.position))}s!==0&&i9(t),Xh.call(FQ,n)?FQ[n](t,n,i):PT(t,'unknown document directive "'+n+'"')}if(Ci(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Ci(t,!0,-1)):a&&Zt(t,"directives end mark is expected"),wm(t,t.lineIndent-1,OT,!1,!0),Ci(t,!0,-1),t.checkLineBreaks&&rLe.test(t.input.slice(e,t.position))&&PT(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&$T(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Ci(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var n=lZ(t,r);if(typeof e!="function")return n;for(var i=0,a=n.length;i=55296&&r<=56319&&e+1=56320&&n<=57343)?(r-55296)*1024+n-56320+65536:r}function yZ(t){var e=/^\n* /;return e.test(t)}function XLe(t,e,r,n,i,a,s,l){var u,h=0,f=null,d=!1,p=!1,m=n!==-1,g=-1,y=WLe(y2(t,0))&&YLe(y2(t,t.length-1));if(e||s)for(u=0;u=65536?u+=2:u++){if(h=y2(t,u),!T2(h))return xm;y=y&&UQ(h,f,l),f=h}else{for(u=0;u=65536?u+=2:u++){if(h=y2(t,u),h===x2)d=!0,m&&(p=p||u-g-1>n&&t[g+1]!==" ",g=u);else if(!T2(h))return xm;y=y&&UQ(h,f,l),f=h}p=p||m&&u-g-1>n&&t[g+1]!==" "}return!d&&!p?y&&!s&&!i(t)?vZ:a===b2?xm:t9:r>9&&yZ(t)?xm:s?a===b2?xm:t9:p?bZ:xZ}function jLe(t,e,r,n,i){t.dump=(function(){if(e.length===0)return t.quotingType===b2?'""':"''";if(!t.noCompatMode&&($Le.indexOf(e)!==-1||zLe.test(e)))return t.quotingType===b2?'"'+e+'"':"'"+e+"'";var a=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),l=n||t.flowLevel>-1&&r>=t.flowLevel;function u(h){return qLe(t,h)}switch(o(u,"testAmbiguity"),XLe(e,l,t.indent,s,u,t.quotingType,t.forceQuotes&&!n,i)){case vZ:return e;case t9:return"'"+e.replace(/'/g,"''")+"'";case xZ:return"|"+HQ(e,t.indent)+qQ(GQ(e,a));case bZ:return">"+HQ(e,t.indent)+qQ(GQ(KLe(e,s),a));case xm:return'"'+QLe(e)+'"';default:throw new Is("impossible error: invalid scalar style")}})()}function HQ(t,e){var r=yZ(t)?String(e):"",n=t[t.length-1]===` +`,i=n&&(t[t.length-2]===` +`||t===` +`),a=i?"+":n?"":"-";return r+a+` +`}function qQ(t){return t[t.length-1]===` +`?t.slice(0,-1):t}function KLe(t,e){for(var r=/(\n+)([^\n]*)/g,n=(function(){var h=t.indexOf(` +`);return h=h!==-1?h:t.length,r.lastIndex=h,WQ(t.slice(0,h),e)})(),i=t[0]===` +`||t[0]===" ",a,s;s=r.exec(t);){var l=s[1],u=s[2];a=u[0]===" ",n+=l+(!i&&!a&&u!==""?` +`:"")+WQ(u,e),i=a}return n}function WQ(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,n,i=0,a,s=0,l=0,u="";n=r.exec(t);)l=n.index,l-i>e&&(a=s>i?s:l,u+=` +`+t.slice(i,a),i=a+1),s=l;return u+=` +`,t.length-i>e&&s>i?u+=t.slice(i,s)+` +`+t.slice(s+1):u+=t.slice(i),u.slice(1)}function QLe(t){for(var e="",r=0,n,i=0;i=65536?i+=2:i++)r=y2(t,i),n=Ia[r],!n&&T2(r)?(e+=t[i],r>=65536&&(e+=t[i+1])):e+=n||VLe(r);return e}function ZLe(t,e,r){var n="",i=t.tag,a,s,l;for(a=0,s=r.length;a"u"&&Nu(t,e,null,!1,!1))&&(n!==""&&(n+=","+(t.condenseFlow?"":" ")),n+=t.dump);t.tag=i,t.dump="["+n+"]"}function YQ(t,e,r,n){var i="",a=t.tag,s,l,u;for(s=0,l=r.length;s"u"&&Nu(t,e+1,null,!0,!0,!1,!0))&&((!n||i!=="")&&(i+=e9(t,e)),t.dump&&x2===t.dump.charCodeAt(0)?i+="-":i+="- ",i+=t.dump);t.tag=a,t.dump=i||"[]"}function JLe(t,e,r){var n="",i=t.tag,a=Object.keys(r),s,l,u,h,f;for(s=0,l=a.length;s1024&&(f+="? "),f+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Nu(t,e,h,!1,!1)&&(f+=t.dump,n+=f));t.tag=i,t.dump="{"+n+"}"}function e9e(t,e,r,n){var i="",a=t.tag,s=Object.keys(r),l,u,h,f,d,p;if(t.sortKeys===!0)s.sort();else if(typeof t.sortKeys=="function")s.sort(t.sortKeys);else if(t.sortKeys)throw new Is("sortKeys must be a boolean or a function");for(l=0,u=s.length;l1024,d&&(t.dump&&x2===t.dump.charCodeAt(0)?p+="?":p+="? "),p+=t.dump,d&&(p+=e9(t,e)),Nu(t,e+1,f,!0,d)&&(t.dump&&x2===t.dump.charCodeAt(0)?p+=":":p+=": ",p+=t.dump,i+=p));t.tag=a,t.dump=i||"{}"}function XQ(t,e,r){var n,i,a,s,l,u;for(i=r?t.explicitTypes:t.implicitTypes,a=0,s=i.length;a tag resolver accepts not "'+u+'" style');t.dump=n}return!0}return!1}function Nu(t,e,r,n,i,a,s){t.tag=null,t.dump=r,XQ(t,r,!1)||XQ(t,r,!0);var l=uZ.call(t.dump),u=n,h;n&&(n=t.flowLevel<0||t.flowLevel>e);var f=l==="[object Object]"||l==="[object Array]",d,p;if(f&&(d=t.duplicates.indexOf(r),p=d!==-1),(t.tag!==null&&t.tag!=="?"||p||t.indent!==2&&e>0)&&(i=!1),p&&t.usedDuplicates[d])t.dump="*ref_"+d;else{if(f&&p&&!t.usedDuplicates[d]&&(t.usedDuplicates[d]=!0),l==="[object Object]")n&&Object.keys(t.dump).length!==0?(e9e(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(JLe(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object Array]")n&&t.dump.length!==0?(t.noArrayIndent&&!s&&e>0?YQ(t,e-1,t.dump,i):YQ(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(ZLe(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object String]")t.tag!=="?"&&jLe(t,t.dump,e,a,u);else{if(l==="[object Undefined]")return!1;if(t.skipInvalid)return!1;throw new Is("unacceptable kind of an object to dump "+l)}t.tag!==null&&t.tag!=="?"&&(h=encodeURI(t.tag[0]==="!"?t.tag.slice(1):t.tag).replace(/!/g,"%21"),t.tag[0]==="!"?h="!"+h:h.slice(0,18)==="tag:yaml.org,2002:"?h="!!"+h.slice(18):h="!<"+h+">",t.dump=h+" "+t.dump)}return!0}function t9e(t,e){var r=[],n=[],i,a;for(r9(t,r,n),i=0,a=n.length;i{"use strict";o(jQ,"isNothing");o(F_e,"isObject");o($_e,"toArray");o(z_e,"extend");o(G_e,"repeat");o(V_e,"isNegativeZero");U_e=jQ,H_e=F_e,q_e=$_e,W_e=G_e,Y_e=V_e,X_e=z_e,Pi={isNothing:U_e,isObject:H_e,toArray:q_e,repeat:W_e,isNegativeZero:Y_e,extend:X_e};o(KQ,"formatError");o(v2,"YAMLException$1");v2.prototype=Object.create(Error.prototype);v2.prototype.constructor=v2;v2.prototype.toString=o(function(e){return this.name+": "+KQ(this,e)},"toString");Is=v2;o(jL,"getLine");o(KL,"padStart");o(j_e,"makeSnippet");K_e=j_e,Q_e=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],Z_e=["scalar","sequence","mapping"];o(J_e,"compileStyleAliases");o(eDe,"Type$1");Ma=eDe;o(IQ,"compileList");o(tDe,"compileMap");o(ZL,"Schema$1");ZL.prototype.extend=o(function(e){var r=[],n=[];if(e instanceof Ma)n.push(e);else if(Array.isArray(e))n=n.concat(e);else if(e&&(Array.isArray(e.implicit)||Array.isArray(e.explicit)))e.implicit&&(r=r.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit));else throw new Is("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(a){if(!(a instanceof Ma))throw new Is("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(a.loadKind&&a.loadKind!=="scalar")throw new Is("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(a.multi)throw new Is("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(a){if(!(a instanceof Ma))throw new Is("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var i=Object.create(ZL.prototype);return i.implicit=(this.implicit||[]).concat(r),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=IQ(i,"implicit"),i.compiledExplicit=IQ(i,"explicit"),i.compiledTypeMap=tDe(i.compiledImplicit,i.compiledExplicit),i},"extend");rDe=ZL,nDe=new Ma("tag:yaml.org,2002:str",{kind:"scalar",construct:o(function(t){return t!==null?t:""},"construct")}),iDe=new Ma("tag:yaml.org,2002:seq",{kind:"sequence",construct:o(function(t){return t!==null?t:[]},"construct")}),aDe=new Ma("tag:yaml.org,2002:map",{kind:"mapping",construct:o(function(t){return t!==null?t:{}},"construct")}),sDe=new rDe({explicit:[nDe,iDe,aDe]});o(oDe,"resolveYamlNull");o(lDe,"constructYamlNull");o(cDe,"isNull");uDe=new Ma("tag:yaml.org,2002:null",{kind:"scalar",resolve:oDe,construct:lDe,predicate:cDe,represent:{canonical:o(function(){return"~"},"canonical"),lowercase:o(function(){return"null"},"lowercase"),uppercase:o(function(){return"NULL"},"uppercase"),camelcase:o(function(){return"Null"},"camelcase"),empty:o(function(){return""},"empty")},defaultStyle:"lowercase"});o(hDe,"resolveYamlBoolean");o(fDe,"constructYamlBoolean");o(dDe,"isBoolean");pDe=new Ma("tag:yaml.org,2002:bool",{kind:"scalar",resolve:hDe,construct:fDe,predicate:dDe,represent:{lowercase:o(function(t){return t?"true":"false"},"lowercase"),uppercase:o(function(t){return t?"TRUE":"FALSE"},"uppercase"),camelcase:o(function(t){return t?"True":"False"},"camelcase")},defaultStyle:"lowercase"});o(mDe,"isHexCode");o(gDe,"isOctCode");o(yDe,"isDecCode");o(vDe,"resolveYamlInteger");o(xDe,"constructYamlInteger");o(bDe,"isInteger");TDe=new Ma("tag:yaml.org,2002:int",{kind:"scalar",resolve:vDe,construct:xDe,predicate:bDe,represent:{binary:o(function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},"binary"),octal:o(function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},"octal"),decimal:o(function(t){return t.toString(10)},"decimal"),hexadecimal:o(function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),wDe=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");o(kDe,"resolveYamlFloat");o(EDe,"constructYamlFloat");SDe=/^[-+]?[0-9]+e/;o(CDe,"representYamlFloat");o(ADe,"isFloat");_De=new Ma("tag:yaml.org,2002:float",{kind:"scalar",resolve:kDe,construct:EDe,predicate:ADe,represent:CDe,defaultStyle:"lowercase"}),QQ=sDe.extend({implicit:[uDe,pDe,TDe,_De]}),DDe=QQ,ZQ=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),JQ=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");o(LDe,"resolveYamlTimestamp");o(RDe,"constructYamlTimestamp");o(NDe,"representYamlTimestamp");MDe=new Ma("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:LDe,construct:RDe,instanceOf:Date,represent:NDe});o(IDe,"resolveYamlMerge");ODe=new Ma("tag:yaml.org,2002:merge",{kind:"scalar",resolve:IDe}),n9=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;o(PDe,"resolveYamlBinary");o(BDe,"constructYamlBinary");o(FDe,"representYamlBinary");o($De,"isBinary");zDe=new Ma("tag:yaml.org,2002:binary",{kind:"scalar",resolve:PDe,construct:BDe,predicate:$De,represent:FDe}),GDe=Object.prototype.hasOwnProperty,VDe=Object.prototype.toString;o(UDe,"resolveYamlOmap");o(HDe,"constructYamlOmap");qDe=new Ma("tag:yaml.org,2002:omap",{kind:"sequence",resolve:UDe,construct:HDe}),WDe=Object.prototype.toString;o(YDe,"resolveYamlPairs");o(XDe,"constructYamlPairs");jDe=new Ma("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:YDe,construct:XDe}),KDe=Object.prototype.hasOwnProperty;o(QDe,"resolveYamlSet");o(ZDe,"constructYamlSet");JDe=new Ma("tag:yaml.org,2002:set",{kind:"mapping",resolve:QDe,construct:ZDe}),eZ=DDe.extend({implicit:[MDe,ODe],explicit:[zDe,qDe,jDe,JDe]}),Xh=Object.prototype.hasOwnProperty,IT=1,tZ=2,rZ=3,OT=4,QL=1,eLe=2,OQ=3,tLe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,rLe=/[\x85\u2028\u2029]/,nLe=/[,\[\]\{\}]/,nZ=/^(?:!|!!|![a-z\-]+!)$/i,iZ=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;o(PQ,"_class");o(bc,"is_EOL");o(Yd,"is_WHITE_SPACE");o(Os,"is_WS_OR_EOL");o(bm,"is_FLOW_INDICATOR");o(iLe,"fromHexCode");o(aLe,"escapedHexLen");o(sLe,"fromDecimalCode");o(BQ,"simpleEscapeSequence");o(oLe,"charFromCodepoint");aZ=new Array(256),sZ=new Array(256);for(Wd=0;Wd<256;Wd++)aZ[Wd]=BQ(Wd)?1:0,sZ[Wd]=BQ(Wd);o(lLe,"State$1");o(oZ,"generateError");o(Zt,"throwError");o(PT,"throwWarning");FQ={YAML:o(function(e,r,n){var i,a,s;e.version!==null&&Zt(e,"duplication of %YAML directive"),n.length!==1&&Zt(e,"YAML directive accepts exactly one argument"),i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),i===null&&Zt(e,"ill-formed argument of the YAML directive"),a=parseInt(i[1],10),s=parseInt(i[2],10),a!==1&&Zt(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=s<2,s!==1&&s!==2&&PT(e,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:o(function(e,r,n){var i,a;n.length!==2&&Zt(e,"TAG directive accepts exactly two arguments"),i=n[0],a=n[1],nZ.test(i)||Zt(e,"ill-formed tag handle (first argument) of the TAG directive"),Xh.call(e.tagMap,i)&&Zt(e,'there is a previously declared suffix for "'+i+'" tag handle'),iZ.test(a)||Zt(e,"ill-formed tag prefix (second argument) of the TAG directive");try{a=decodeURIComponent(a)}catch{Zt(e,"tag prefix is malformed: "+a)}e.tagMap[i]=a},"handleTagDirective")};o(Yh,"captureSegment");o($Q,"mergeMappings");o(Tm,"storeMappingPair");o(i9,"readLineBreak");o(Ci,"skipSeparationSpace");o($T,"testDocumentSeparator");o(a9,"writeFoldedLines");o(cLe,"readPlainScalar");o(uLe,"readSingleQuotedScalar");o(hLe,"readDoubleQuotedScalar");o(fLe,"readFlowCollection");o(dLe,"readBlockScalar");o(zQ,"readBlockSequence");o(pLe,"readBlockMapping");o(mLe,"readTagProperty");o(gLe,"readAnchorProperty");o(yLe,"readAlias");o(wm,"composeNode");o(vLe,"readDocument");o(lZ,"loadDocuments");o(xLe,"loadAll$1");o(bLe,"load$1");TLe=xLe,wLe=bLe,cZ={loadAll:TLe,load:wLe},uZ=Object.prototype.toString,hZ=Object.prototype.hasOwnProperty,s9=65279,kLe=9,x2=10,ELe=13,SLe=32,CLe=33,ALe=34,JL=35,_Le=37,DLe=38,LLe=39,RLe=42,fZ=44,NLe=45,BT=58,MLe=61,ILe=62,OLe=63,PLe=64,dZ=91,pZ=93,BLe=96,mZ=123,FLe=124,gZ=125,Ia={};Ia[0]="\\0";Ia[7]="\\a";Ia[8]="\\b";Ia[9]="\\t";Ia[10]="\\n";Ia[11]="\\v";Ia[12]="\\f";Ia[13]="\\r";Ia[27]="\\e";Ia[34]='\\"';Ia[92]="\\\\";Ia[133]="\\N";Ia[160]="\\_";Ia[8232]="\\L";Ia[8233]="\\P";$Le=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],zLe=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;o(GLe,"compileStyleMap");o(VLe,"encodeHex");ULe=1,b2=2;o(HLe,"State");o(GQ,"indentString");o(e9,"generateNextLine");o(qLe,"testImplicitResolving");o(FT,"isWhitespace");o(T2,"isPrintable");o(VQ,"isNsCharOrWhitespace");o(UQ,"isPlainSafe");o(WLe,"isPlainSafeFirst");o(YLe,"isPlainSafeLast");o(y2,"codePointAt");o(yZ,"needIndentIndicator");vZ=1,t9=2,xZ=3,bZ=4,xm=5;o(XLe,"chooseScalarStyle");o(jLe,"writeScalar");o(HQ,"blockHeader");o(qQ,"dropEndingNewline");o(KLe,"foldString");o(WQ,"foldLine");o(QLe,"escapeString");o(ZLe,"writeFlowSequence");o(YQ,"writeBlockSequence");o(JLe,"writeFlowMapping");o(e9e,"writeBlockMapping");o(XQ,"detectType");o(Nu,"writeNode");o(t9e,"getDuplicateReferences");o(r9,"inspectNode");o(r9e,"dump$1");n9e=r9e,i9e={dump:n9e};o(o9,"renamed");jh=QQ,Kh=cZ.load,A6t=cZ.loadAll,_6t=i9e.dump,D6t=o9("safeLoad","load"),L6t=o9("safeLoadAll","loadAll"),R6t=o9("safeDump","dump")});function h9(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function CZ(t){jd=t}function on(t,e=""){let r=typeof t=="string"?t:t.source,n={replace:o((i,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace(as.caret,"$1"),r=r.replace(i,s),n},"replace"),getRegex:o(()=>new RegExp(r,e),"getRegex")};return n}function Tc(t,e){if(e){if(as.escapeTest.test(t))return t.replace(as.escapeReplace,wZ)}else if(as.escapeTestNoEncode.test(t))return t.replace(as.escapeReplaceNoEncode,wZ);return t}function kZ(t){try{t=encodeURI(t).replace(as.percentDecode,"%")}catch{return null}return t}function EZ(t,e){let r=t.replace(as.findPipe,(a,s,l)=>{let u=!1,h=s;for(;--h>=0&&l[h]==="\\";)u=!u;return u?"|":" |"}),n=r.split(as.splitPipe),i=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length0?-2:-1}function SZ(t,e,r,n,i){let a=e.href,s=e.title||null,l=t[1].replace(i.other.outputLinkReplace,"$1");n.state.inLink=!0;let u={type:t[0].charAt(0)==="!"?"image":"link",raw:r,href:a,title:s,text:l,tokens:n.inlineTokens(l)};return n.state.inLink=!1,u}function $9e(t,e,r){let n=t.match(r.other.indentCodeCompensation);if(n===null)return e;let i=n[1];return e.split(` +`).map(a=>{let s=a.match(r.other.beginningSpace);if(s===null)return a;let[l]=s;return l.length>=i.length?a.slice(i.length):a}).join(` +`)}function nn(t,e){return Xd.parse(t,e)}var jd,C2,as,a9e,s9e,o9e,A2,l9e,f9,AZ,_Z,c9e,d9,u9e,p9,h9e,f9e,qT,m9,d9e,DZ,p9e,g9,TZ,m9e,g9e,y9e,v9e,LZ,x9e,WT,y9,RZ,b9e,NZ,T9e,w9e,k9e,MZ,E9e,S9e,IZ,C9e,A9e,_9e,D9e,L9e,R9e,N9e,VT,M9e,OZ,PZ,I9e,v9,O9e,l9,P9e,GT,k2,B9e,wZ,UT,Mu,HT,x9,Iu,S2,z9e,Xd,M6t,I6t,O6t,P6t,B6t,F6t,$6t,BZ=N(()=>{"use strict";o(h9,"L");jd=h9();o(CZ,"G");C2={exec:o(()=>null,"exec")};o(on,"h");as={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^
    /i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:o(t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),"listItemRegex"),nextBulletRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),"nextBulletRegex"),hrRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),"hrRegex"),fencesBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),"fencesBeginRegex"),headingBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),"headingBeginRegex"),htmlBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),"htmlBeginRegex")},a9e=/^(?:[ \t]*(?:\n|$))+/,s9e=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,o9e=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,A2=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,l9e=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,f9=/(?:[*+-]|\d{1,9}[.)])/,AZ=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,_Z=on(AZ).replace(/bull/g,f9).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),c9e=on(AZ).replace(/bull/g,f9).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),d9=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,u9e=/^[^\n]+/,p9=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,h9e=on(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",p9).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),f9e=on(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,f9).getRegex(),qT="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",m9=/|$))/,d9e=on("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",m9).replace("tag",qT).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),DZ=on(d9).replace("hr",A2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",qT).getRegex(),p9e=on(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",DZ).getRegex(),g9={blockquote:p9e,code:s9e,def:h9e,fences:o9e,heading:l9e,hr:A2,html:d9e,lheading:_Z,list:f9e,newline:a9e,paragraph:DZ,table:C2,text:u9e},TZ=on("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",A2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",qT).getRegex(),m9e={...g9,lheading:c9e,table:TZ,paragraph:on(d9).replace("hr",A2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",TZ).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",qT).getRegex()},g9e={...g9,html:on(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",m9).replace(/tag/g,"(?!(?: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").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:C2,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:on(d9).replace("hr",A2).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",_Z).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},y9e=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,v9e=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,LZ=/^( {2,}|\\)\n(?!\s*$)/,x9e=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,MZ=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,E9e=on(MZ,"u").replace(/punct/g,WT).getRegex(),S9e=on(MZ,"u").replace(/punct/g,NZ).getRegex(),IZ="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",C9e=on(IZ,"gu").replace(/notPunctSpace/g,RZ).replace(/punctSpace/g,y9).replace(/punct/g,WT).getRegex(),A9e=on(IZ,"gu").replace(/notPunctSpace/g,w9e).replace(/punctSpace/g,T9e).replace(/punct/g,NZ).getRegex(),_9e=on("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,RZ).replace(/punctSpace/g,y9).replace(/punct/g,WT).getRegex(),D9e=on(/\\(punct)/,"gu").replace(/punct/g,WT).getRegex(),L9e=on(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),R9e=on(m9).replace("(?:-->|$)","-->").getRegex(),N9e=on("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",R9e).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),VT=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`[^`]*`|[^\[\]\\`])*?/,M9e=on(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",VT).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),OZ=on(/^!?\[(label)\]\[(ref)\]/).replace("label",VT).replace("ref",p9).getRegex(),PZ=on(/^!?\[(ref)\](?:\[\])?/).replace("ref",p9).getRegex(),I9e=on("reflink|nolink(?!\\()","g").replace("reflink",OZ).replace("nolink",PZ).getRegex(),v9={_backpedal:C2,anyPunctuation:D9e,autolink:L9e,blockSkip:k9e,br:LZ,code:v9e,del:C2,emStrongLDelim:E9e,emStrongRDelimAst:C9e,emStrongRDelimUnd:_9e,escape:y9e,link:M9e,nolink:PZ,punctuation:b9e,reflink:OZ,reflinkSearch:I9e,tag:N9e,text:x9e,url:C2},O9e={...v9,link:on(/^!?\[(label)\]\((.*?)\)/).replace("label",VT).getRegex(),reflink:on(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",VT).getRegex()},l9={...v9,emStrongRDelimAst:A9e,emStrongLDelim:S9e,url:on(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},wZ=o(t=>B9e[t],"ke");o(Tc,"w");o(kZ,"J");o(EZ,"V");o(E2,"z");o(F9e,"ge");o(SZ,"fe");o($9e,"Je");UT=class{static{o(this,"y")}options;rules;lexer;constructor(t){this.options=t||jd}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let r=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?r:E2(r,` +`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let r=e[0],n=$9e(r,e[3]||"",this.rules);return{type:"code",raw:r,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:n}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let r=e[2].trim();if(this.rules.other.endingHash.test(r)){let n=E2(r,"#");(this.options.pedantic||!n||this.rules.other.endingSpaceChar.test(n))&&(r=n.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:r,tokens:this.lexer.inline(r)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:E2(e[0],` +`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let r=E2(e[0],` +`).split(` +`),n="",i="",a=[];for(;r.length>0;){let s=!1,l=[],u;for(u=0;u1,i={type:"list",raw:"",ordered:n,start:n?+r.slice(0,-1):"",loose:!1,items:[]};r=n?`\\d{1,9}\\${r.slice(-1)}`:`\\${r}`,this.options.pedantic&&(r=n?r:"[*+-]");let a=this.rules.other.listItemRegex(r),s=!1;for(;t;){let u=!1,h="",f="";if(!(e=a.exec(t))||this.rules.block.hr.test(t))break;h=e[0],t=t.substring(h.length);let d=e[2].split(` +`,1)[0].replace(this.rules.other.listReplaceTabs,x=>" ".repeat(3*x.length)),p=t.split(` +`,1)[0],m=!d.trim(),g=0;if(this.options.pedantic?(g=2,f=d.trimStart()):m?g=e[1].length+1:(g=e[2].search(this.rules.other.nonSpaceChar),g=g>4?1:g,f=d.slice(g),g+=e[1].length),m&&this.rules.other.blankLine.test(p)&&(h+=p+` +`,t=t.substring(p.length+1),u=!0),!u){let x=this.rules.other.nextBulletRegex(g),b=this.rules.other.hrRegex(g),T=this.rules.other.fencesBeginRegex(g),S=this.rules.other.headingBeginRegex(g),w=this.rules.other.htmlBeginRegex(g);for(;t;){let k=t.split(` +`,1)[0],A;if(p=k,this.options.pedantic?(p=p.replace(this.rules.other.listReplaceNesting," "),A=p):A=p.replace(this.rules.other.tabCharGlobal," "),T.test(p)||S.test(p)||w.test(p)||x.test(p)||b.test(p))break;if(A.search(this.rules.other.nonSpaceChar)>=g||!p.trim())f+=` +`+A.slice(g);else{if(m||d.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||T.test(d)||S.test(d)||b.test(d))break;f+=` +`+p}!m&&!p.trim()&&(m=!0),h+=k+` +`,t=t.substring(k.length+1),d=A.slice(g)}}i.loose||(s?i.loose=!0:this.rules.other.doubleBlankLine.test(h)&&(s=!0));let y=null,v;this.options.gfm&&(y=this.rules.other.listIsTask.exec(f),y&&(v=y[0]!=="[ ] ",f=f.replace(this.rules.other.listReplaceTask,""))),i.items.push({type:"list_item",raw:h,task:!!y,checked:v,loose:!1,text:f,tokens:[]}),i.raw+=h}let l=i.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let u=0;ud.type==="space"),f=h.length>0&&h.some(d=>this.rules.other.anyLine.test(d.raw));i.loose=f}if(i.loose)for(let u=0;u({text:l,tokens:this.lexer.inline(l),header:!1,align:a.align[u]})));return a}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let r=e[1].charAt(e[1].length-1)===` +`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:r,tokens:this.lexer.inline(r)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let r=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(r)){if(!this.rules.other.endAngleBracket.test(r))return;let a=E2(r.slice(0,-1),"\\");if((r.length-a.length)%2===0)return}else{let a=F9e(e[2],"()");if(a===-2)return;if(a>-1){let s=(e[0].indexOf("!")===0?5:4)+e[1].length+a;e[2]=e[2].substring(0,a),e[0]=e[0].substring(0,s).trim(),e[3]=""}}let n=e[2],i="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(n);a&&(n=a[1],i=a[3])}else i=e[3]?e[3].slice(1,-1):"";return n=n.trim(),this.rules.other.startAngleBracket.test(n)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(r)?n=n.slice(1):n=n.slice(1,-1)),SZ(e,{href:n&&n.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let r;if((r=this.rules.inline.reflink.exec(t))||(r=this.rules.inline.nolink.exec(t))){let n=(r[2]||r[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=e[n.toLowerCase()];if(!i){let a=r[0].charAt(0);return{type:"text",raw:a,text:a}}return SZ(r,i,r[0],this.lexer,this.rules)}}emStrong(t,e,r=""){let n=this.rules.inline.emStrongLDelim.exec(t);if(!(!n||n[3]&&r.match(this.rules.other.unicodeAlphaNumeric))&&(!(n[1]||n[2])||!r||this.rules.inline.punctuation.exec(r))){let i=[...n[0]].length-1,a,s,l=i,u=0,h=n[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(h.lastIndex=0,e=e.slice(-1*t.length+i);(n=h.exec(e))!=null;){if(a=n[1]||n[2]||n[3]||n[4]||n[5]||n[6],!a)continue;if(s=[...a].length,n[3]||n[4]){l+=s;continue}else if((n[5]||n[6])&&i%3&&!((i+s)%3)){u+=s;continue}if(l-=s,l>0)continue;s=Math.min(s,s+l+u);let f=[...n[0]][0].length,d=t.slice(0,i+n.index+f+s);if(Math.min(i,s)%2){let m=d.slice(1,-1);return{type:"em",raw:d,text:m,tokens:this.lexer.inlineTokens(m)}}let p=d.slice(2,-2);return{type:"strong",raw:d,text:p,tokens:this.lexer.inlineTokens(p)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let r=e[2].replace(this.rules.other.newLineCharGlobal," "),n=this.rules.other.nonSpaceChar.test(r),i=this.rules.other.startingSpaceChar.test(r)&&this.rules.other.endingSpaceChar.test(r);return n&&i&&(r=r.substring(1,r.length-1)),{type:"codespan",raw:e[0],text:r}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t){let e=this.rules.inline.del.exec(t);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2])}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let r,n;return e[2]==="@"?(r=e[1],n="mailto:"+r):(r=e[1],n=r),{type:"link",raw:e[0],text:r,href:n,tokens:[{type:"text",raw:r,text:r}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let r,n;if(e[2]==="@")r=e[0],n="mailto:"+r;else{let i;do i=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(i!==e[0]);r=e[0],e[1]==="www."?n="http://"+e[0]:n=e[0]}return{type:"link",raw:e[0],text:r,href:n,tokens:[{type:"text",raw:r,text:r}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let r=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:r}}}},Mu=class c9{static{o(this,"l")}tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||jd,this.options.tokenizer=this.options.tokenizer||new UT,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let r={other:as,block:GT.normal,inline:k2.normal};this.options.pedantic?(r.block=GT.pedantic,r.inline=k2.pedantic):this.options.gfm&&(r.block=GT.gfm,this.options.breaks?r.inline=k2.breaks:r.inline=k2.gfm),this.tokenizer.rules=r}static get rules(){return{block:GT,inline:k2}}static lex(e,r){return new c9(r).lex(e)}static lexInline(e,r){return new c9(r).inlineTokens(e)}lex(e){e=e.replace(as.carriageReturn,` +`),this.blockTokens(e,this.tokens);for(let r=0;r(i=s.call({lexer:this},e,r))?(e=e.substring(i.raw.length),r.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let s=r.at(-1);i.raw.length===1&&s!==void 0?s.raw+=` +`:r.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+i.raw,s.text+=` +`+i.text,this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+i.raw,s.text+=` +`+i.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},r.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),r.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let s=1/0,l=e.slice(1),u;this.options.extensions.startBlock.forEach(h=>{u=h.call({lexer:this},l),typeof u=="number"&&u>=0&&(s=Math.min(s,u))}),s<1/0&&s>=0&&(a=e.substring(0,s+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let s=r.at(-1);n&&s?.type==="paragraph"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+i.raw,s.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i),n=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="text"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+i.raw,s.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(e){let s="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,r}inline(e,r=[]){return this.inlineQueue.push({src:e,tokens:r}),r}inlineTokens(e,r=[]){let n=e,i=null;if(this.tokens.links){let l=Object.keys(this.tokens.links);if(l.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)l.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,i.index)+"++"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(i=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let a=!1,s="";for(;e;){a||(s=""),a=!1;let l;if(this.options.extensions?.inline?.some(h=>(l=h.call({lexer:this},e,r))?(e=e.substring(l.raw.length),r.push(l),!0):!1))continue;if(l=this.tokenizer.escape(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.tag(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.link(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(l.raw.length);let h=r.at(-1);l.type==="text"&&h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(l=this.tokenizer.emStrong(e,n,s)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.codespan(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.br(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.del(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.autolink(e)){e=e.substring(l.raw.length),r.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(e))){e=e.substring(l.raw.length),r.push(l);continue}let u=e;if(this.options.extensions?.startInline){let h=1/0,f=e.slice(1),d;this.options.extensions.startInline.forEach(p=>{d=p.call({lexer:this},f),typeof d=="number"&&d>=0&&(h=Math.min(h,d))}),h<1/0&&h>=0&&(u=e.substring(0,h+1))}if(l=this.tokenizer.inlineText(u)){e=e.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(s=l.raw.slice(-1)),a=!0;let h=r.at(-1);h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return r}},HT=class{static{o(this,"P")}options;parser;constructor(t){this.options=t||jd}space(t){return""}code({text:t,lang:e,escaped:r}){let n=(e||"").match(as.notSpaceStart)?.[0],i=t.replace(as.endingNewline,"")+` +`;return n?'
    '+(r?i:Tc(i,!0))+`
    +`:"
    "+(r?i:Tc(i,!0))+`
    +`}blockquote({tokens:t}){return`
    +${this.parser.parse(t)}
    +`}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} +`}hr(t){return`
    +`}list(t){let e=t.ordered,r=t.start,n="";for(let s=0;s +`+n+" +`}listitem(t){let e="";if(t.task){let r=this.checkbox({checked:!!t.checked});t.loose?t.tokens[0]?.type==="paragraph"?(t.tokens[0].text=r+" "+t.tokens[0].text,t.tokens[0].tokens&&t.tokens[0].tokens.length>0&&t.tokens[0].tokens[0].type==="text"&&(t.tokens[0].tokens[0].text=r+" "+Tc(t.tokens[0].tokens[0].text),t.tokens[0].tokens[0].escaped=!0)):t.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):e+=r+" "}return e+=this.parser.parse(t.tokens,!!t.loose),`
  • ${e}
  • +`}checkbox({checked:t}){return"'}paragraph({tokens:t}){return`

    ${this.parser.parseInline(t)}

    +`}table(t){let e="",r="";for(let i=0;i${n}`),` + +`+e+` +`+n+`
    +`}tablerow({text:t}){return` +${t} +`}tablecell(t){let e=this.parser.parseInline(t.tokens),r=t.header?"th":"td";return(t.align?`<${r} align="${t.align}">`:`<${r}>`)+e+` +`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${Tc(t,!0)}`}br(t){return"
    "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:r}){let n=this.parser.parseInline(r),i=kZ(t);if(i===null)return n;t=i;let a='
    ",a}image({href:t,title:e,text:r,tokens:n}){n&&(r=this.parser.parseInline(n,this.parser.textRenderer));let i=kZ(t);if(i===null)return Tc(r);t=i;let a=`${r}{let s=i[a].flat(1/0);r=r.concat(this.walkTokens(s,e))}):i.tokens&&(r=r.concat(this.walkTokens(i.tokens,e)))}}return r}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(r=>{let n={...r};if(n.async=this.defaults.async||n.async||!1,r.extensions&&(r.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let a=e.renderers[i.name];a?e.renderers[i.name]=function(...s){let l=i.renderer.apply(this,s);return l===!1&&(l=a.apply(this,s)),l}:e.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=e[i.level];a?a.unshift(i.tokenizer):e[i.level]=[i.tokenizer],i.start&&(i.level==="block"?e.startBlock?e.startBlock.push(i.start):e.startBlock=[i.start]:i.level==="inline"&&(e.startInline?e.startInline.push(i.start):e.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(e.childTokens[i.name]=i.childTokens)}),n.extensions=e),r.renderer){let i=this.defaults.renderer||new HT(this.defaults);for(let a in r.renderer){if(!(a in i))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let s=a,l=r.renderer[s],u=i[s];i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f||""}}n.renderer=i}if(r.tokenizer){let i=this.defaults.tokenizer||new UT(this.defaults);for(let a in r.tokenizer){if(!(a in i))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let s=a,l=r.tokenizer[s],u=i[s];i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f}}n.tokenizer=i}if(r.hooks){let i=this.defaults.hooks||new S2;for(let a in r.hooks){if(!(a in i))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let s=a,l=r.hooks[s],u=i[s];S2.passThroughHooks.has(a)?i[s]=h=>{if(this.defaults.async&&S2.passThroughHooksRespectAsync.has(a))return Promise.resolve(l.call(i,h)).then(d=>u.call(i,d));let f=l.call(i,h);return u.call(i,f)}:i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f}}n.hooks=i}if(r.walkTokens){let i=this.defaults.walkTokens,a=r.walkTokens;n.walkTokens=function(s){let l=[];return l.push(a.call(this,s)),i&&(l=l.concat(i.call(this,s))),l}}this.defaults={...this.defaults,...n}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return Mu.lex(t,e??this.defaults)}parser(t,e){return Iu.parse(t,e??this.defaults)}parseMarkdown(t){return(e,r)=>{let n={...r},i={...this.defaults,...n},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&n.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));i.hooks&&(i.hooks.options=i,i.hooks.block=t);let s=i.hooks?i.hooks.provideLexer():t?Mu.lex:Mu.lexInline,l=i.hooks?i.hooks.provideParser():t?Iu.parse:Iu.parseInline;if(i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(e):e).then(u=>s(u,i)).then(u=>i.hooks?i.hooks.processAllTokens(u):u).then(u=>i.walkTokens?Promise.all(this.walkTokens(u,i.walkTokens)).then(()=>u):u).then(u=>l(u,i)).then(u=>i.hooks?i.hooks.postprocess(u):u).catch(a);try{i.hooks&&(e=i.hooks.preprocess(e));let u=s(e,i);i.hooks&&(u=i.hooks.processAllTokens(u)),i.walkTokens&&this.walkTokens(u,i.walkTokens);let h=l(u,i);return i.hooks&&(h=i.hooks.postprocess(h)),h}catch(u){return a(u)}}}onError(t,e){return r=>{if(r.message+=` +Please report this to https://github.com/markedjs/marked.`,t){let n="

    An error occurred:

    "+Tc(r.message+"",!0)+"
    ";return e?Promise.resolve(n):n}if(e)return Promise.reject(r);throw r}}},Xd=new z9e;o(nn,"d");nn.options=nn.setOptions=function(t){return Xd.setOptions(t),nn.defaults=Xd.defaults,CZ(nn.defaults),nn};nn.getDefaults=h9;nn.defaults=jd;nn.use=function(...t){return Xd.use(...t),nn.defaults=Xd.defaults,CZ(nn.defaults),nn};nn.walkTokens=function(t,e){return Xd.walkTokens(t,e)};nn.parseInline=Xd.parseInline;nn.Parser=Iu;nn.parser=Iu.parse;nn.Renderer=HT;nn.TextRenderer=x9;nn.Lexer=Mu;nn.lexer=Mu.lex;nn.Tokenizer=UT;nn.Hooks=S2;nn.parse=nn;M6t=nn.options,I6t=nn.setOptions,O6t=nn.use,P6t=nn.walkTokens,B6t=nn.parseInline,F6t=Iu.parse,$6t=Mu.lex});function G9e(t,{markdownAutoWrap:e}){let n=t.replace(//g,` +`).replace(/\n{2,}/g,` +`),i=P3(n);return e===!1?i.replace(/ /g," "):i}function FZ(t,e={}){let r=G9e(t,e),n=nn.lexer(r),i=[[]],a=0;function s(l,u="normal"){l.type==="text"?l.text.split(` +`).forEach((f,d)=>{d!==0&&(a++,i.push([])),f.split(" ").forEach(p=>{p=p.replace(/'/g,"'"),p&&i[a].push({content:p,type:u})})}):l.type==="strong"||l.type==="em"?l.tokens.forEach(h=>{s(h,l.type)}):l.type==="html"&&i[a].push({content:l.text,type:"normal"})}return o(s,"processNode"),n.forEach(l=>{l.type==="paragraph"?l.tokens?.forEach(u=>{s(u)}):l.type==="html"?i[a].push({content:l.text,type:"normal"}):i[a].push({content:l.raw,type:"normal"})}),i}function $Z(t,{markdownAutoWrap:e}={}){let r=nn.lexer(t);function n(i){return i.type==="text"?e===!1?i.text.replace(/\n */g,"
    ").replace(/ /g," "):i.text.replace(/\n */g,"
    "):i.type==="strong"?`${i.tokens?.map(n).join("")}`:i.type==="em"?`${i.tokens?.map(n).join("")}`:i.type==="paragraph"?`

    ${i.tokens?.map(n).join("")}

    `:i.type==="space"?"":i.type==="html"?`${i.text}`:i.type==="escape"?i.text:(X.warn(`Unsupported markdown: ${i.type}`),i.raw)}return o(n,"output"),r.map(n).join("")}var zZ=N(()=>{"use strict";BZ();_A();pt();o(G9e,"preprocessMarkdown");o(FZ,"markdownToLines");o($Z,"markdownToHTML")});function V9e(t){return Intl.Segmenter?[...new Intl.Segmenter().segment(t)].map(e=>e.segment):[...t]}function U9e(t,e){let r=V9e(e.content);return GZ(t,[],r,e.type)}function GZ(t,e,r,n){if(r.length===0)return[{content:e.join(""),type:n},{content:"",type:n}];let[i,...a]=r,s=[...e,i];return t([{content:s.join(""),type:n}])?GZ(t,s,a,n):(e.length===0&&i&&(e.push(i),r.shift()),[{content:e.join(""),type:n},{content:r.join(""),type:n}])}function VZ(t,e){if(t.some(({content:r})=>r.includes(` +`)))throw new Error("splitLineToFitWidth does not support newlines in the line");return b9(t,e)}function b9(t,e,r=[],n=[]){if(t.length===0)return n.length>0&&r.push(n),r.length>0?r:[];let i="";t[0].content===" "&&(i=" ",t.shift());let a=t.shift()??{content:" ",type:"normal"},s=[...n];if(i!==""&&s.push({content:i,type:"normal"}),s.push(a),e(s))return b9(t,e,r,s);if(n.length>0)r.push(n),t.unshift(a);else if(a.content){let[l,u]=U9e(e,a);r.push([l]),u.content&&t.unshift(u)}return b9(t,e,r)}var UZ=N(()=>{"use strict";o(V9e,"splitTextToChars");o(U9e,"splitWordToFitWidth");o(GZ,"splitWordToFitWidthRecursion");o(VZ,"splitLineToFitWidth");o(b9,"splitLineToFitWidthRecursion")});function HZ(t,e){e&&t.attr("style",e)}async function H9e(t,e,r,n,i=!1,a=Qt()){let s=t.append("foreignObject");s.attr("width",`${10*r}px`),s.attr("height",`${10*r}px`);let l=s.append("xhtml:div"),u=kn(e.label)?await kh(e.label.replace(tt.lineBreakRegex,` +`),a):sr(e.label,a),h=e.isNode?"nodeLabel":"edgeLabel",f=l.append("span");f.html(u),HZ(f,e.labelStyle),f.attr("class",`${h} ${n}`),HZ(l,e.labelStyle),l.style("display","table-cell"),l.style("white-space","nowrap"),l.style("line-height","1.5"),l.style("max-width",r+"px"),l.style("text-align","center"),l.attr("xmlns","http://www.w3.org/1999/xhtml"),i&&l.attr("class","labelBkg");let d=l.node().getBoundingClientRect();return d.width===r&&(l.style("display","table"),l.style("white-space","break-spaces"),l.style("width",r+"px"),d=l.node().getBoundingClientRect()),s.node()}function T9(t,e,r){return t.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em")}function q9e(t,e,r){let n=t.append("text"),i=T9(n,1,e);w9(i,r);let a=i.node().getComputedTextLength();return n.remove(),a}function qZ(t,e,r){let n=t.append("text"),i=T9(n,1,e);w9(i,[{content:r,type:"normal"}]);let a=i.node()?.getBoundingClientRect();return a&&n.remove(),a}function W9e(t,e,r,n=!1){let a=e.append("g"),s=a.insert("rect").attr("class","background").attr("style","stroke: none"),l=a.append("text").attr("y","-10.1"),u=0;for(let h of r){let f=o(p=>q9e(a,1.1,p)<=t,"checkWidth"),d=f(h)?[h]:VZ(h,f);for(let p of d){let m=T9(l,u,1.1);w9(m,p),u++}}if(n){let h=l.node().getBBox(),f=2;return s.attr("x",h.x-f).attr("y",h.y-f).attr("width",h.width+2*f).attr("height",h.height+2*f),a.node()}else return l.node()}function w9(t,e){t.text(""),e.forEach((r,n)=>{let i=t.append("tspan").attr("font-style",r.type==="em"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",r.type==="strong"?"bold":"normal");n===0?i.text(r.content):i.text(" "+r.content)})}async function k9(t,e={}){let r=[];t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,(i,a,s)=>(r.push((async()=>{let l=`${a}:${s}`;return await eH(l)?await _s(l,void 0,{class:"label-icon"}):``})()),i));let n=await Promise.all(r);return t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,()=>n.shift()??"")}var di,zo=N(()=>{"use strict";yr();gr();pt();zZ();tr();nc();UZ();qn();o(HZ,"applyStyle");o(H9e,"addHtmlSpan");o(T9,"createTspan");o(q9e,"computeWidthOfText");o(qZ,"computeDimensionOfText");o(W9e,"createFormattedText");o(w9,"updateTextContentAndStyles");o(k9,"replaceIconSubstring");di=o(async(t,e="",{style:r="",isTitle:n=!1,classes:i="",useHtmlLabels:a=!0,isNode:s=!0,width:l=200,addSvgBackground:u=!1}={},h)=>{if(X.debug("XYZ createText",e,r,n,i,a,s,"addSvgBackground: ",u),a){let f=$Z(e,h),d=await k9(Ji(f),h),p=e.replace(/\\\\/g,"\\"),m={isNode:s,label:kn(e)?p:d,labelStyle:r.replace("fill:","color:")};return await H9e(t,m,l,i,u,h)}else{let f=e.replace(//g,"
    "),d=FZ(f.replace("
    ","
    "),h),p=W9e(l,t,d,e?u:!1);if(s){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");qe(p).attr("style",m)}else{let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");qe(p).select("rect").attr("style",m.replace(/background:/g,"fill:"));let g=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");qe(p).select("text").attr("style",g)}return p}},"createText")});function Vt(t){let e=t.map((r,n)=>`${n===0?"M":"L"}${r.x},${r.y}`);return e.push("Z"),e.join(" ")}function Go(t,e,r,n,i,a){let s=[],u=r-t,h=n-e,f=u/a,d=2*Math.PI/f,p=e+h/2;for(let m=0;m<=50;m++){let g=m/50,y=t+g*u,v=p+i*Math.sin(d*(y-t));s.push({x:y,y:v})}return s}function Kd(t,e,r,n,i,a){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;d{"use strict";zo();Xt();yr();La();gr();tr();ut=o(async(t,e,r)=>{let n,i=e.useHtmlLabels||vr(ge()?.htmlLabels);r?n=r:n="node default";let a=t.insert("g").attr("class",n).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",Cn(e.labelStyle)),l;e.label===void 0?l="":l=typeof e.label=="string"?e.label:e.label[0];let u=await di(s,sr(Ji(l),ge()),{useHtmlLabels:i,width:e.width||ge().flowchart?.wrappingWidth,cssClasses:"markdown-node-label",style:e.labelStyle,addSvgBackground:!!e.icon||!!e.img}),h=u.getBBox(),f=(e?.padding??0)/2;if(i){let d=u.children[0],p=qe(u),m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=ge().fontSize?ge().fontSize:window.getComputedStyle(document.body).fontSize,T=5,[S=ur.fontSize]=vc(b),w=S*T+"px";y.style.minWidth=w,y.style.maxWidth=w}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}return i?s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"):s.attr("transform","translate(0, "+-h.height/2+")"),e.centerLabel&&s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"),s.insert("rect",":first-child"),{shapeSvg:a,bbox:h,halfPadding:f,label:s}},"labelHelper"),YT=o(async(t,e,r)=>{let n=r.useHtmlLabels||vr(ge()?.flowchart?.htmlLabels),i=t.insert("g").attr("class","label").attr("style",r.labelStyle||""),a=await di(i,sr(Ji(e),ge()),{useHtmlLabels:n,width:r.width||ge()?.flowchart?.wrappingWidth,style:r.labelStyle,addSvgBackground:!!r.icon||!!r.img}),s=a.getBBox(),l=r.padding/2;if(vr(ge()?.flowchart?.htmlLabels)){let u=a.children[0],h=qe(a);s=u.getBoundingClientRect(),h.attr("width",s.width),h.attr("height",s.height)}return n?i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"):i.attr("transform","translate(0, "+-s.height/2+")"),r.centerLabel&&i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.insert("rect",":first-child"),{shapeSvg:t,bbox:s,halfPadding:l,label:i}},"insertLabel"),Qe=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds"),st=o((t,e)=>(t.look==="handDrawn"?"rough-node":"node")+" "+t.cssClasses+" "+(e||""),"getNodeClasses");o(Vt,"createPathFromPoints");o(Go,"generateFullSineWavePoints");o(Kd,"generateCirclePoints")});function Y9e(t,e){return t.intersect(e)}var WZ,YZ=N(()=>{"use strict";o(Y9e,"intersectNode");WZ=Y9e});function X9e(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(X9e,"intersectEllipse");XT=X9e});function j9e(t,e,r){return XT(t,e,e,r)}var XZ,jZ=N(()=>{"use strict";E9();o(j9e,"intersectCircle");XZ=j9e});function K9e(t,e,r,n){{let i=e.y-t.y,a=t.x-e.x,s=e.x*t.y-t.x*e.y,l=i*r.x+a*r.y+s,u=i*n.x+a*n.y+s,h=1e-6;if(l!==0&&u!==0&&KZ(l,u))return;let f=n.y-r.y,d=r.x-n.x,p=n.x*r.y-r.x*n.y,m=f*t.x+d*t.y+p,g=f*e.x+d*e.y+p;if(Math.abs(m)0}var QZ,ZZ=N(()=>{"use strict";o(K9e,"intersectLine");o(KZ,"sameSign");QZ=K9e});function Q9e(t,e,r){let n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(f){s=Math.min(s,f.x),l=Math.min(l,f.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));let u=n-t.width/2-s,h=i-t.height/2-l;for(let f=0;f1&&a.sort(function(f,d){let p=f.x-r.x,m=f.y-r.y,g=Math.sqrt(p*p+m*m),y=d.x-r.x,v=d.y-r.y,x=Math.sqrt(y*y+v*v);return g{"use strict";ZZ();o(Q9e,"intersectPolygon");JZ=Q9e});var Z9e,Qh,S9=N(()=>{"use strict";Z9e=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),Qh=Z9e});var Xe,Ut=N(()=>{"use strict";YZ();jZ();E9();eJ();S9();Xe={node:WZ,circle:XZ,ellipse:XT,polygon:JZ,rect:Qh}});var tJ,wc,J9e,_2,je,Je,eRe,$t=N(()=>{"use strict";Xt();tJ=o(t=>{let{handDrawnSeed:e}=ge();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),wc=o(t=>{let e=J9e([...t.cssCompiledStyles||[],...t.cssStyles||[],...t.labelStyle||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),J9e=o(t=>{let e=new Map;return t.forEach(r=>{let[n,i]=r.split(":");e.set(n.trim(),i?.trim())}),e},"styles2Map"),_2=o(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),je=o(t=>{let{stylesArray:e}=wc(t),r=[],n=[],i=[],a=[];return e.forEach(s=>{let l=s[0];_2(l)?r.push(s.join(":")+" !important"):(n.push(s.join(":")+" !important"),l.includes("stroke")&&i.push(s.join(":")+" !important"),l==="fill"&&a.push(s.join(":")+" !important"))}),{labelStyles:r.join(";"),nodeStyles:n.join(";"),stylesArray:e,borderStyles:i,backgroundStyles:a}},"styles2String"),Je=o((t,e)=>{let{themeVariables:r,handDrawnSeed:n}=ge(),{nodeBorder:i,mainBkg:a}=r,{stylesMap:s}=wc(t);return Object.assign({roughness:.7,fill:s.get("fill")||a,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||i,seed:n,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0],strokeLineDash:eRe(s.get("stroke-dasharray"))},e)},"userNodeOverrides"),eRe=o(t=>{if(!t)return[0,0];let e=t.trim().split(/\s+/).map(Number);if(e.length===1){let i=isNaN(e[0])?0:e[0];return[i,i]}let r=isNaN(e[0])?0:e[0],n=isNaN(e[1])?0:e[1];return[r,n]},"getStrokeDashArray")});function C9(t,e,r){if(t&&t.length){let[n,i]=e,a=Math.PI/180*r,s=Math.cos(a),l=Math.sin(a);for(let u of t){let[h,f]=u;u[0]=(h-n)*s-(f-i)*l+n,u[1]=(h-n)*l+(f-i)*s+i}}}function tRe(t,e){return t[0]===e[0]&&t[1]===e[1]}function rRe(t,e,r,n=1){let i=r,a=Math.max(e,.1),s=t[0]&&t[0][0]&&typeof t[0][0]=="number"?[t]:t,l=[0,0];if(i)for(let h of s)C9(h,l,i);let u=(function(h,f,d){let p=[];for(let b of h){let T=[...b];tRe(T[0],T[T.length-1])||T.push([T[0][0],T[0][1]]),T.length>2&&p.push(T)}let m=[];f=Math.max(f,.1);let g=[];for(let b of p)for(let T=0;Tb.yminT.ymin?1:b.xT.x?1:b.ymax===T.ymax?0:(b.ymax-T.ymax)/Math.abs(b.ymax-T.ymax))),!g.length)return m;let y=[],v=g[0].ymin,x=0;for(;y.length||g.length;){if(g.length){let b=-1;for(let T=0;Tv);T++)b=T;g.splice(0,b+1).forEach((T=>{y.push({s:v,edge:T})}))}if(y=y.filter((b=>!(b.edge.ymax<=v))),y.sort(((b,T)=>b.edge.x===T.edge.x?0:(b.edge.x-T.edge.x)/Math.abs(b.edge.x-T.edge.x))),(d!==1||x%f==0)&&y.length>1)for(let b=0;b=y.length)break;let S=y[b].edge,w=y[T].edge;m.push([[Math.round(S.x),v],[Math.round(w.x),v]])}v+=d,y.forEach((b=>{b.edge.x=b.edge.x+d*b.edge.islope})),x++}return m})(s,a,n);if(i){for(let h of s)C9(h,l,-i);(function(h,f,d){let p=[];h.forEach((m=>p.push(...m))),C9(p,f,d)})(u,l,-i)}return u}function N2(t,e){var r;let n=e.hachureAngle+90,i=e.hachureGap;i<0&&(i=4*e.strokeWidth),i=Math.round(Math.max(i,.1));let a=1;return e.roughness>=1&&(((r=e.randomizer)===null||r===void 0?void 0:r.next())||Math.random())>.7&&(a=i),rRe(t,i,n,a||1)}function nw(t){let e=t[0],r=t[1];return Math.sqrt(Math.pow(e[0]-r[0],2)+Math.pow(e[1]-r[1],2))}function _9(t,e){return t.type===e}function V9(t){let e=[],r=(function(s){let l=new Array;for(;s!=="";)if(s.match(/^([ \t\r\n,]+)/))s=s.substr(RegExp.$1.length);else if(s.match(/^([aAcChHlLmMqQsStTvVzZ])/))l[l.length]={type:nRe,text:RegExp.$1},s=s.substr(RegExp.$1.length);else{if(!s.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/))return[];l[l.length]={type:A9,text:`${parseFloat(RegExp.$1)}`},s=s.substr(RegExp.$1.length)}return l[l.length]={type:rJ,text:""},l})(t),n="BOD",i=0,a=r[i];for(;!_9(a,rJ);){let s=0,l=[];if(n==="BOD"){if(a.text!=="M"&&a.text!=="m")return V9("M0,0"+t);i++,s=jT[a.text],n=a.text}else _9(a,A9)?s=jT[n]:(i++,s=jT[a.text],n=a.text);if(!(i+sf%2?h+r:h+e));a.push({key:"C",data:u}),e=u[4],r=u[5];break}case"Q":a.push({key:"Q",data:[...l]}),e=l[2],r=l[3];break;case"q":{let u=l.map(((h,f)=>f%2?h+r:h+e));a.push({key:"Q",data:u}),e=u[2],r=u[3];break}case"A":a.push({key:"A",data:[...l]}),e=l[5],r=l[6];break;case"a":e+=l[5],r+=l[6],a.push({key:"A",data:[l[0],l[1],l[2],l[3],l[4],e,r]});break;case"H":a.push({key:"H",data:[...l]}),e=l[0];break;case"h":e+=l[0],a.push({key:"H",data:[e]});break;case"V":a.push({key:"V",data:[...l]}),r=l[0];break;case"v":r+=l[0],a.push({key:"V",data:[r]});break;case"S":a.push({key:"S",data:[...l]}),e=l[2],r=l[3];break;case"s":{let u=l.map(((h,f)=>f%2?h+r:h+e));a.push({key:"S",data:u}),e=u[2],r=u[3];break}case"T":a.push({key:"T",data:[...l]}),e=l[0],r=l[1];break;case"t":e+=l[0],r+=l[1],a.push({key:"T",data:[e,r]});break;case"Z":case"z":a.push({key:"Z",data:[]}),e=n,r=i}return a}function hJ(t){let e=[],r="",n=0,i=0,a=0,s=0,l=0,u=0;for(let{key:h,data:f}of t){switch(h){case"M":e.push({key:"M",data:[...f]}),[n,i]=f,[a,s]=f;break;case"C":e.push({key:"C",data:[...f]}),n=f[4],i=f[5],l=f[2],u=f[3];break;case"L":e.push({key:"L",data:[...f]}),[n,i]=f;break;case"H":n=f[0],e.push({key:"L",data:[n,i]});break;case"V":i=f[0],e.push({key:"L",data:[n,i]});break;case"S":{let d=0,p=0;r==="C"||r==="S"?(d=n+(n-l),p=i+(i-u)):(d=n,p=i),e.push({key:"C",data:[d,p,...f]}),l=f[0],u=f[1],n=f[2],i=f[3];break}case"T":{let[d,p]=f,m=0,g=0;r==="Q"||r==="T"?(m=n+(n-l),g=i+(i-u)):(m=n,g=i);let y=n+2*(m-n)/3,v=i+2*(g-i)/3,x=d+2*(m-d)/3,b=p+2*(g-p)/3;e.push({key:"C",data:[y,v,x,b,d,p]}),l=m,u=g,n=d,i=p;break}case"Q":{let[d,p,m,g]=f,y=n+2*(d-n)/3,v=i+2*(p-i)/3,x=m+2*(d-m)/3,b=g+2*(p-g)/3;e.push({key:"C",data:[y,v,x,b,m,g]}),l=d,u=p,n=m,i=g;break}case"A":{let d=Math.abs(f[0]),p=Math.abs(f[1]),m=f[2],g=f[3],y=f[4],v=f[5],x=f[6];d===0||p===0?(e.push({key:"C",data:[n,i,v,x,v,x]}),n=v,i=x):(n!==v||i!==x)&&(fJ(n,i,v,x,d,p,m,g,y).forEach((function(b){e.push({key:"C",data:b})})),n=v,i=x);break}case"Z":e.push({key:"Z",data:[]}),n=a,i=s}r=h}return e}function D2(t,e,r){return[t*Math.cos(r)-e*Math.sin(r),t*Math.sin(r)+e*Math.cos(r)]}function fJ(t,e,r,n,i,a,s,l,u,h){let f=(d=s,Math.PI*d/180);var d;let p=[],m=0,g=0,y=0,v=0;if(h)[m,g,y,v]=h;else{[t,e]=D2(t,e,-f),[r,n]=D2(r,n,-f);let D=(t-r)/2,_=(e-n)/2,O=D*D/(i*i)+_*_/(a*a);O>1&&(O=Math.sqrt(O),i*=O,a*=O);let M=i*i,P=a*a,B=M*P-M*_*_-P*D*D,F=M*_*_+P*D*D,G=(l===u?-1:1)*Math.sqrt(Math.abs(B/F));y=G*i*_/a+(t+r)/2,v=G*-a*D/i+(e+n)/2,m=Math.asin(parseFloat(((e-v)/a).toFixed(9))),g=Math.asin(parseFloat(((n-v)/a).toFixed(9))),tg&&(m-=2*Math.PI),!u&&g>m&&(g-=2*Math.PI)}let x=g-m;if(Math.abs(x)>120*Math.PI/180){let D=g,_=r,O=n;g=u&&g>m?m+120*Math.PI/180*1:m+120*Math.PI/180*-1,p=fJ(r=y+i*Math.cos(g),n=v+a*Math.sin(g),_,O,i,a,s,0,u,[g,D,y,v])}x=g-m;let b=Math.cos(m),T=Math.sin(m),S=Math.cos(g),w=Math.sin(g),k=Math.tan(x/4),A=4/3*i*k,C=4/3*a*k,R=[t,e],I=[t+A*T,e-C*b],L=[r+A*w,n-C*S],E=[r,n];if(I[0]=2*R[0]-I[0],I[1]=2*R[1]-I[1],h)return[I,L,E].concat(p);{p=[I,L,E].concat(p);let D=[];for(let _=0;_2){let i=[];for(let a=0;a2*Math.PI&&(m=0,g=2*Math.PI);let y=2*Math.PI/u.curveStepCount,v=Math.min(y/2,(g-m)/2),x=lJ(v,h,f,d,p,m,g,1,u);if(!u.disableMultiStroke){let b=lJ(v,h,f,d,p,m,g,1.5,u);x.push(...b)}return s&&(l?x.push(...Zh(h,f,h+d*Math.cos(m),f+p*Math.sin(m),u),...Zh(h,f,h+d*Math.cos(g),f+p*Math.sin(g),u)):x.push({op:"lineTo",data:[h,f]},{op:"lineTo",data:[h+d*Math.cos(m),f+p*Math.sin(m)]})),{type:"path",ops:x}}function aJ(t,e){let r=hJ(uJ(V9(t))),n=[],i=[0,0],a=[0,0];for(let{key:s,data:l}of r)switch(s){case"M":a=[l[0],l[1]],i=[l[0],l[1]];break;case"L":n.push(...Zh(a[0],a[1],l[0],l[1],e)),a=[l[0],l[1]];break;case"C":{let[u,h,f,d,p,m]=l;n.push(...sRe(u,h,f,d,p,m,a,e)),a=[p,m];break}case"Z":n.push(...Zh(a[0],a[1],i[0],i[1],e)),a=[i[0],i[1]]}return{type:"path",ops:n}}function D9(t,e){let r=[];for(let n of t)if(n.length){let i=e.maxRandomnessOffset||0,a=n.length;if(a>2){r.push({op:"move",data:[n[0][0]+or(i,e),n[0][1]+or(i,e)]});for(let s=1;s500?.4:-.0016668*u+1.233334;let f=i.maxRandomnessOffset||0;f*f*100>l&&(f=u/10);let d=f/2,p=.2+.2*mJ(i),m=i.bowing*i.maxRandomnessOffset*(n-e)/200,g=i.bowing*i.maxRandomnessOffset*(t-r)/200;m=or(m,i,h),g=or(g,i,h);let y=[],v=o(()=>or(d,i,h),"M"),x=o(()=>or(f,i,h),"k"),b=i.preserveVertices;return a&&(s?y.push({op:"move",data:[t+(b?0:v()),e+(b?0:v())]}):y.push({op:"move",data:[t+(b?0:or(f,i,h)),e+(b?0:or(f,i,h))]})),s?y.push({op:"bcurveTo",data:[m+t+(r-t)*p+v(),g+e+(n-e)*p+v(),m+t+2*(r-t)*p+v(),g+e+2*(n-e)*p+v(),r+(b?0:v()),n+(b?0:v())]}):y.push({op:"bcurveTo",data:[m+t+(r-t)*p+x(),g+e+(n-e)*p+x(),m+t+2*(r-t)*p+x(),g+e+2*(n-e)*p+x(),r+(b?0:x()),n+(b?0:x())]}),y}function KT(t,e,r){if(!t.length)return[];let n=[];n.push([t[0][0]+or(e,r),t[0][1]+or(e,r)]),n.push([t[0][0]+or(e,r),t[0][1]+or(e,r)]);for(let i=1;i3){let a=[],s=1-r.curveTightness;i.push({op:"move",data:[t[1][0],t[1][1]]});for(let l=1;l+21&&i.push(l)):i.push(l),i.push(t[e+3])}else{let u=t[e+0],h=t[e+1],f=t[e+2],d=t[e+3],p=Qd(u,h,.5),m=Qd(h,f,.5),g=Qd(f,d,.5),y=Qd(p,m,.5),v=Qd(m,g,.5),x=Qd(y,v,.5);$9([u,p,y,x],0,r,i),$9([x,v,g,d],0,r,i)}var a,s;return i}function lRe(t,e){return rw(t,0,t.length,e)}function rw(t,e,r,n,i){let a=i||[],s=t[e],l=t[r-1],u=0,h=1;for(let f=e+1;fu&&(u=d,h=f)}return Math.sqrt(u)>n?(rw(t,e,h+1,n,a),rw(t,h,r,n,a)):(a.length||a.push(s),a.push(l)),a}function L9(t,e=.15,r){let n=[],i=(t.length-1)/3;for(let a=0;a0?rw(n,0,n.length,r):n}var R2,R9,N9,M9,I9,O9,Ps,P9,nRe,A9,rJ,jT,iRe,co,Em,z9,QT,G9,Ze,Ht=N(()=>{"use strict";o(C9,"t");o(tRe,"e");o(rRe,"s");o(N2,"n");R2=class{static{o(this,"o")}constructor(e){this.helper=e}fillPolygons(e,r){return this._fillPolygons(e,r)}_fillPolygons(e,r){let n=N2(e,r);return{type:"fillSketch",ops:this.renderLines(n,r)}}renderLines(e,r){let n=[];for(let i of e)n.push(...this.helper.doubleLineOps(i[0][0],i[0][1],i[1][0],i[1][1],r));return n}};o(nw,"a");R9=class extends R2{static{o(this,"h")}fillPolygons(e,r){let n=r.hachureGap;n<0&&(n=4*r.strokeWidth),n=Math.max(n,.1);let i=N2(e,Object.assign({},r,{hachureGap:n})),a=Math.PI/180*r.hachureAngle,s=[],l=.5*n*Math.cos(a),u=.5*n*Math.sin(a);for(let[h,f]of i)nw([h,f])&&s.push([[h[0]-l,h[1]+u],[...f]],[[h[0]+l,h[1]-u],[...f]]);return{type:"fillSketch",ops:this.renderLines(s,r)}}},N9=class extends R2{static{o(this,"r")}fillPolygons(e,r){let n=this._fillPolygons(e,r),i=Object.assign({},r,{hachureAngle:r.hachureAngle+90}),a=this._fillPolygons(e,i);return n.ops=n.ops.concat(a.ops),n}},M9=class{static{o(this,"i")}constructor(e){this.helper=e}fillPolygons(e,r){let n=N2(e,r=Object.assign({},r,{hachureAngle:0}));return this.dotsOnLines(n,r)}dotsOnLines(e,r){let n=[],i=r.hachureGap;i<0&&(i=4*r.strokeWidth),i=Math.max(i,.1);let a=r.fillWeight;a<0&&(a=r.strokeWidth/2);let s=i/4;for(let l of e){let u=nw(l),h=u/i,f=Math.ceil(h)-1,d=u-f*i,p=(l[0][0]+l[1][0])/2-i/4,m=Math.min(l[0][1],l[1][1]);for(let g=0;g{let l=nw(s),u=Math.floor(l/(n+i)),h=(l+i-u*(n+i))/2,f=s[0],d=s[1];f[0]>d[0]&&(f=s[1],d=s[0]);let p=Math.atan((d[1]-f[1])/(d[0]-f[0]));for(let m=0;m{let s=nw(a),l=Math.round(s/(2*r)),u=a[0],h=a[1];u[0]>h[0]&&(u=a[1],h=a[0]);let f=Math.atan((h[1]-u[1])/(h[0]-u[0]));for(let d=0;d2*Math.PI&&(A=0,C=2*Math.PI);let R=(C-A)/b.curveStepCount,I=[];for(let L=A;L<=C;L+=R)I.push([T+w*Math.cos(L),S+k*Math.sin(L)]);return I.push([T+w*Math.cos(C),S+k*Math.sin(C)]),I.push([T,S]),km([I],b)})(e,r,n,i,a,s,h));return h.stroke!==co&&f.push(d),this._d("arc",f,h)}curve(e,r){let n=this._o(r),i=[],a=nJ(e,n);if(n.fill&&n.fill!==co)if(n.fillStyle==="solid"){let s=nJ(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(s.ops)})}else{let s=[],l=e;if(l.length){let u=typeof l[0][0]=="number"?[l]:l;for(let h of u)h.length<3?s.push(...h):h.length===3?s.push(...L9(cJ([h[0],h[0],h[1],h[2]]),10,(1+n.roughness)/2)):s.push(...L9(cJ(h),10,(1+n.roughness)/2))}s.length&&i.push(km([s],n))}return n.stroke!==co&&i.push(a),this._d("curve",i,n)}polygon(e,r){let n=this._o(r),i=[],a=ZT(e,!0,n);return n.fill&&(n.fillStyle==="solid"?i.push(D9([e],n)):i.push(km([e],n))),n.stroke!==co&&i.push(a),this._d("polygon",i,n)}path(e,r){let n=this._o(r),i=[];if(!e)return this._d("path",i,n);e=(e||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");let a=n.fill&&n.fill!=="transparent"&&n.fill!==co,s=n.stroke!==co,l=!!(n.simplification&&n.simplification<1),u=(function(f,d,p){let m=hJ(uJ(V9(f))),g=[],y=[],v=[0,0],x=[],b=o(()=>{x.length>=4&&y.push(...L9(x,d)),x=[]},"i"),T=o(()=>{b(),y.length&&(g.push(y),y=[])},"c");for(let{key:w,data:k}of m)switch(w){case"M":T(),v=[k[0],k[1]],y.push(v);break;case"L":b(),y.push([k[0],k[1]]);break;case"C":if(!x.length){let A=y.length?y[y.length-1]:v;x.push([A[0],A[1]])}x.push([k[0],k[1]]),x.push([k[2],k[3]]),x.push([k[4],k[5]]);break;case"Z":b(),y.push([v[0],v[1]])}if(T(),!p)return g;let S=[];for(let w of g){let k=lRe(w,p);k.length&&S.push(k)}return S})(e,1,l?4-4*(n.simplification||1):(1+n.roughness)/2),h=aJ(e,n);if(a)if(n.fillStyle==="solid")if(u.length===1){let f=aJ(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(f.ops)})}else i.push(D9(u,n));else i.push(km(u,n));return s&&(l?u.forEach((f=>{i.push(ZT(f,!1,n))})):i.push(h)),this._d("path",i,n)}opsToPath(e,r){let n="";for(let i of e.ops){let a=typeof r=="number"&&r>=0?i.data.map((s=>+s.toFixed(r))):i.data;switch(i.op){case"move":n+=`M${a[0]} ${a[1]} `;break;case"bcurveTo":n+=`C${a[0]} ${a[1]}, ${a[2]} ${a[3]}, ${a[4]} ${a[5]} `;break;case"lineTo":n+=`L${a[0]} ${a[1]} `}}return n.trim()}toPaths(e){let r=e.sets||[],n=e.options||this.defaultOptions,i=[];for(let a of r){let s=null;switch(a.type){case"path":s={d:this.opsToPath(a),stroke:n.stroke,strokeWidth:n.strokeWidth,fill:co};break;case"fillPath":s={d:this.opsToPath(a),stroke:co,strokeWidth:0,fill:n.fill||co};break;case"fillSketch":s=this.fillSketch(a,n)}s&&i.push(s)}return i}fillSketch(e,r){let n=r.fillWeight;return n<0&&(n=r.strokeWidth/2),{d:this.opsToPath(e),stroke:r.fill||co,strokeWidth:n,fill:co}}_mergedShape(e){return e.filter(((r,n)=>n===0||r.op!=="move"))}},z9=class{static{o(this,"st")}constructor(e,r){this.canvas=e,this.ctx=this.canvas.getContext("2d"),this.gen=new Em(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.ctx,a=e.options.fixedDecimalPlaceDigits;for(let s of r)switch(s.type){case"path":i.save(),i.strokeStyle=n.stroke==="none"?"transparent":n.stroke,i.lineWidth=n.strokeWidth,n.strokeLineDash&&i.setLineDash(n.strokeLineDash),n.strokeLineDashOffset&&(i.lineDashOffset=n.strokeLineDashOffset),this._drawToContext(i,s,a),i.restore();break;case"fillPath":{i.save(),i.fillStyle=n.fill||"";let l=e.shape==="curve"||e.shape==="polygon"||e.shape==="path"?"evenodd":"nonzero";this._drawToContext(i,s,a,l),i.restore();break}case"fillSketch":this.fillSketch(i,s,n)}}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2),e.save(),n.fillLineDash&&e.setLineDash(n.fillLineDash),n.fillLineDashOffset&&(e.lineDashOffset=n.fillLineDashOffset),e.strokeStyle=n.fill||"",e.lineWidth=i,this._drawToContext(e,r,n.fixedDecimalPlaceDigits),e.restore()}_drawToContext(e,r,n,i="nonzero"){e.beginPath();for(let a of r.ops){let s=typeof n=="number"&&n>=0?a.data.map((l=>+l.toFixed(n))):a.data;switch(a.op){case"move":e.moveTo(s[0],s[1]);break;case"bcurveTo":e.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);break;case"lineTo":e.lineTo(s[0],s[1])}}r.type==="fillPath"?e.fill(i):e.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s),s}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s),s}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s),s}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a),a}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n),n}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n),n}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h),h}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n),n}path(e,r){let n=this.gen.path(e,r);return this.draw(n),n}},QT="http://www.w3.org/2000/svg",G9=class{static{o(this,"ot")}constructor(e,r){this.svg=e,this.gen=new Em(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.svg.ownerDocument||window.document,a=i.createElementNS(QT,"g"),s=e.options.fixedDecimalPlaceDigits;for(let l of r){let u=null;switch(l.type){case"path":u=i.createElementNS(QT,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke",n.stroke),u.setAttribute("stroke-width",n.strokeWidth+""),u.setAttribute("fill","none"),n.strokeLineDash&&u.setAttribute("stroke-dasharray",n.strokeLineDash.join(" ").trim()),n.strokeLineDashOffset&&u.setAttribute("stroke-dashoffset",`${n.strokeLineDashOffset}`);break;case"fillPath":u=i.createElementNS(QT,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke","none"),u.setAttribute("stroke-width","0"),u.setAttribute("fill",n.fill||""),e.shape!=="curve"&&e.shape!=="polygon"||u.setAttribute("fill-rule","evenodd");break;case"fillSketch":u=this.fillSketch(i,l,n)}u&&a.appendChild(u)}return a}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2);let a=e.createElementNS(QT,"path");return a.setAttribute("d",this.opsToPath(r,n.fixedDecimalPlaceDigits)),a.setAttribute("stroke",n.fill||""),a.setAttribute("stroke-width",i+""),a.setAttribute("fill","none"),n.fillLineDash&&a.setAttribute("stroke-dasharray",n.fillLineDash.join(" ").trim()),n.fillLineDashOffset&&a.setAttribute("stroke-dashoffset",`${n.fillLineDashOffset}`),a}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(e,r){return this.gen.opsToPath(e,r)}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s)}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s)}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s)}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a)}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n)}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n)}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h)}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n)}path(e,r){let n=this.gen.path(e,r);return this.draw(n)}},Ze={canvas:o((t,e)=>new z9(t,e),"canvas"),svg:o((t,e)=>new G9(t,e),"svg"),generator:o(t=>new Em(t),"generator"),newSeed:o(()=>Em.newSeed(),"newSeed")}});function gJ(t,e){let{labelStyles:r}=je(e);e.labelStyle=r;let n=st(e),i=n;n||(i="anchor");let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=1,{cssStyles:l}=e,u=Ze.svg(a),h=Je(e,{fill:"black",stroke:"none",fillStyle:"solid"});e.look!=="handDrawn"&&(h.roughness=0);let f=u.circle(0,0,s*2,h),d=a.insert(()=>f,":first-child");return d.attr("class","anchor").attr("style",Cn(l)),Qe(e,d),e.intersect=function(p){return X.info("Circle intersect",e,s,p),Xe.circle(e,s,p)},a}var yJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();tr();o(gJ,"anchor")});function vJ(t,e,r,n,i,a,s){let u=(t+r)/2,h=(e+n)/2,f=Math.atan2(n-e,r-t),d=(r-t)/2,p=(n-e)/2,m=d/i,g=p/a,y=Math.sqrt(m**2+g**2);if(y>1)throw new Error("The given radii are too small to create an arc between the points.");let v=Math.sqrt(1-y**2),x=u+v*a*Math.sin(f)*(s?-1:1),b=h-v*i*Math.cos(f)*(s?-1:1),T=Math.atan2((e-b)/a,(t-x)/i),w=Math.atan2((n-b)/a,(r-x)/i)-T;s&&w<0&&(w+=2*Math.PI),!s&&w>0&&(w-=2*Math.PI);let k=[];for(let A=0;A<20;A++){let C=A/19,R=T+C*w,I=x+i*Math.cos(R),L=b+a*Math.sin(R);k.push({x:I,y:L})}return k}async function xJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.width+e.padding+20,l=a.height+e.padding,u=l/2,h=u/(2.5+l/50),{cssStyles:f}=e,d=[{x:s/2,y:-l/2},{x:-s/2,y:-l/2},...vJ(-s/2,-l/2,-s/2,l/2,h,u,!1),{x:s/2,y:l/2},...vJ(s/2,l/2,s/2,-l/2,h,u,!0)],p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Vt(d),y=p.path(g,m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(${h/2}, 0)`),Qe(e,v),e.intersect=function(x){return Xe.polygon(e,d,x)},i}var bJ=N(()=>{"use strict";It();Ut();$t();Ht();o(vJ,"generateArcPoints");o(xJ,"bowTieRect")});function Bs(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var Jh=N(()=>{"use strict";o(Bs,"insertPolygonShape")});async function TJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.height+e.padding,l=12,u=a.width+e.padding+l,h=0,f=u,d=-s,p=0,m=[{x:h+l,y:d},{x:f,y:d},{x:f,y:p},{x:h,y:p},{x:h,y:d+l},{x:h+l,y:d}],g,{cssStyles:y}=e;if(e.look==="handDrawn"){let v=Ze.svg(i),x=Je(e,{}),b=Vt(m),T=v.path(b,x);g=i.insert(()=>T,":first-child").attr("transform",`translate(${-u/2}, ${s/2})`),y&&g.attr("style",y)}else g=Bs(i,u,s,m);return n&&g.attr("style",n),Qe(e,g),e.intersect=function(v){return Xe.polygon(e,m,v)},i}var wJ=N(()=>{"use strict";It();Ut();$t();Ht();Jh();It();o(TJ,"card")});function kJ(t,e){let{nodeStyles:r}=je(e);e.label="";let n=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),{cssStyles:i}=e,a=Math.max(28,e.width??0),s=[{x:0,y:a/2},{x:a/2,y:0},{x:0,y:-a/2},{x:-a/2,y:0}],l=Ze.svg(n),u=Je(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=Vt(s),f=l.path(h,u),d=n.insert(()=>f,":first-child");return i&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",i),r&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",r),e.width=28,e.height=28,e.intersect=function(p){return Xe.polygon(e,s,p)},n}var EJ=N(()=>{"use strict";Ut();Ht();$t();It();o(kJ,"choice")});async function iw(t,e,r){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n;let{shapeSvg:a,bbox:s,halfPadding:l}=await ut(t,e,st(e)),u=r?.padding??l,h=s.width/2+u,f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Ze.svg(a),m=Je(e,{}),g=p.circle(0,0,h*2,m);f=a.insert(()=>g,":first-child"),f.attr("class","basic label-container").attr("style",Cn(d))}else f=a.insert("circle",":first-child").attr("class","basic label-container").attr("style",i).attr("r",h).attr("cx",0).attr("cy",0);return Qe(e,f),e.calcIntersect=function(p,m){let g=p.width/2;return Xe.circle(p,g,m)},e.intersect=function(p){return X.info("Circle intersect",e,h,p),Xe.circle(e,h,p)},a}var U9=N(()=>{"use strict";Ht();pt();tr();Ut();$t();It();o(iw,"circle")});function cRe(t){let e=Math.cos(Math.PI/4),r=Math.sin(Math.PI/4),n=t*2,i={x:n/2*e,y:n/2*r},a={x:-(n/2)*e,y:n/2*r},s={x:-(n/2)*e,y:-(n/2)*r},l={x:n/2*e,y:-(n/2)*r};return`M ${a.x},${a.y} L ${l.x},${l.y} + M ${i.x},${i.y} L ${s.x},${s.y}`}function SJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r,e.label="";let i=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),a=Math.max(30,e?.width??0),{cssStyles:s}=e,l=Ze.svg(i),u=Je(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=l.circle(0,0,a*2,u),f=cRe(a),d=l.path(f,u),p=i.insert(()=>h,":first-child");return p.insert(()=>d),s&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",s),n&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",n),Qe(e,p),e.intersect=function(m){return X.info("crossedCircle intersect",e,{radius:a,point:m}),Xe.circle(e,a,m)},i}var CJ=N(()=>{"use strict";pt();It();$t();Ht();Ut();o(cRe,"createLine");o(SJ,"crossedCircle")});function ef(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dT,":first-child").attr("stroke-opacity",0),S.insert(()=>x,":first-child"),S.attr("class","text"),f&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${h}, 0)`),s.attr("transform",`translate(${-l/2+h-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Qe(e,S),e.intersect=function(w){return Xe.polygon(e,p,w)},i}var _J=N(()=>{"use strict";It();Ut();$t();Ht();o(ef,"generateCirclePoints");o(AJ,"curlyBraceLeft")});function tf(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dT,":first-child").attr("stroke-opacity",0),S.insert(()=>x,":first-child"),S.attr("class","text"),f&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${-h}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Qe(e,S),e.intersect=function(w){return Xe.polygon(e,p,w)},i}var LJ=N(()=>{"use strict";It();Ut();$t();Ht();o(tf,"generateCirclePoints");o(DJ,"curlyBraceRight")});function Oa(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dA,":first-child").attr("stroke-opacity",0),C.insert(()=>b,":first-child"),C.insert(()=>w,":first-child"),C.attr("class","text"),f&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(${h-h/4}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Qe(e,C),e.intersect=function(R){return Xe.polygon(e,m,R)},i}var NJ=N(()=>{"use strict";It();Ut();$t();Ht();o(Oa,"generateCirclePoints");o(RJ,"curlyBraces")});async function MJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=80,l=20,u=Math.max(s,(a.width+(e.padding??0)*2)*1.25,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=u,y=h,v=g-f,x=y/4,b=[{x:v,y:0},{x,y:0},{x:0,y:y/2},{x,y},{x:v,y},...Kd(-v,-y/2,f,50,270,90)],T=Vt(b),S=p.path(T,m),w=i.insert(()=>S,":first-child");return w.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&w.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&w.selectChildren("path").attr("style",n),w.attr("transform",`translate(${-u/2}, ${-h/2})`),Qe(e,w),e.intersect=function(k){return Xe.polygon(e,b,k)},i}var IJ=N(()=>{"use strict";It();Ut();$t();Ht();o(MJ,"curvedTrapezoid")});async function OJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+e.padding,e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+e.padding,e.height??0),d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Ze.svg(i),g=hRe(0,0,l,f,u,h),y=fRe(0,h,l,f,u,h),v=m.path(g,Je(e,{})),x=m.path(y,Je(e,{fill:"none"}));d=i.insert(()=>x,":first-child"),d=i.insert(()=>v,":first-child"),d.attr("class","basic label-container"),p&&d.attr("style",p)}else{let m=uRe(0,0,l,f,u,h);d=i.insert("path",":first-child").attr("d",m).attr("class","basic label-container").attr("style",Cn(p)).attr("style",n)}return d.attr("label-offset-y",h),d.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),Qe(e,d),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+(e.padding??0)/1.5-(a.y-(a.top??0))})`),e.intersect=function(m){let g=Xe.rect(e,m),y=g.x-(e.x??0);if(u!=0&&(Math.abs(y)<(e.width??0)/2||Math.abs(y)==(e.width??0)/2&&Math.abs(g.y-(e.y??0))>(e.height??0)/2-h)){let v=h*h*(1-y*y/(u*u));v>0&&(v=Math.sqrt(v)),v=h-v,m.y-(e.y??0)>0&&(v=-v),g.y+=v}return g},i}var uRe,hRe,fRe,PJ=N(()=>{"use strict";It();Ut();$t();Ht();tr();uRe=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createCylinderPathD"),hRe=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createOuterCylinderPathD"),fRe=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(OJ,"cylinder")});async function BJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=a.width+e.padding,u=a.height+e.padding,h=u*.2,f=-l/2,d=-u/2-h/2,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d+h},{x:-f,y:d+h},{x:-f,y:-d},{x:f,y:-d},{x:f,y:d},{x:-f,y:d},{x:-f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${f+(e.padding??0)/2-(a.x-(a.left??0))}, ${d+h+(e.padding??0)/2-(a.y-(a.top??0))})`),Qe(e,x),e.intersect=function(b){return Xe.rect(e,b)},i}var FJ=N(()=>{"use strict";It();Ut();$t();Ht();o(BJ,"dividedRectangle")});async function $J(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await ut(t,e,st(e)),u=a.width/2+s+5,h=a.width/2+s,f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Ze.svg(i),m=Je(e,{roughness:.2,strokeWidth:2.5}),g=Je(e,{roughness:.2,strokeWidth:1.5}),y=p.circle(0,0,u*2,m),v=p.circle(0,0,h*2,g);f=i.insert("g",":first-child"),f.attr("class",Cn(e.cssClasses)).attr("style",Cn(d)),f.node()?.appendChild(y),f.node()?.appendChild(v)}else{f=i.insert("g",":first-child");let p=f.insert("circle",":first-child"),m=f.insert("circle");f.attr("class","basic label-container").attr("style",n),p.attr("class","outer-circle").attr("style",n).attr("r",u).attr("cx",0).attr("cy",0),m.attr("class","inner-circle").attr("style",n).attr("r",h).attr("cx",0).attr("cy",0)}return Qe(e,f),e.intersect=function(p){return X.info("DoubleCircle intersect",e,u,p),Xe.circle(e,u,p)},i}var zJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();tr();o($J,"doublecircle")});function GJ(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=je(e);e.label="",e.labelStyle=n;let a=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),s=7,{cssStyles:l}=e,u=Ze.svg(a),{nodeBorder:h}=r,f=Je(e,{fillStyle:"solid"});e.look!=="handDrawn"&&(f.roughness=0);let d=u.circle(0,0,s*2,f),p=a.insert(()=>d,":first-child");return p.selectAll("path").attr("style",`fill: ${h} !important;`),l&&l.length>0&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",l),i&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",i),Qe(e,p),e.intersect=function(m){return X.info("filledCircle intersect",e,{radius:s,point:m}),Xe.circle(e,s,m)},a}var VJ=N(()=>{"use strict";Ht();pt();Ut();$t();It();o(GJ,"filledCircle")});async function UJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=a.width+(e.padding??0),u=l+a.height,h=l+a.height,f=[{x:0,y:-u},{x:h,y:-u},{x:h/2,y:0}],{cssStyles:d}=e,p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Vt(f),y=p.path(g,m),v=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`);return d&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),e.width=l,e.height=u,Qe(e,v),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${-u/2+(e.padding??0)/2+(a.y-(a.top??0))})`),e.intersect=function(x){return X.info("Triangle intersect",e,f,x),Xe.polygon(e,f,x)},i}var HJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();It();o(UJ,"flippedTriangle")});function qJ(t,e,{dir:r,config:{state:n,themeVariables:i}}){let{nodeStyles:a}=je(e);e.label="";let s=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),{cssStyles:l}=e,u=Math.max(70,e?.width??0),h=Math.max(10,e?.height??0);r==="LR"&&(u=Math.max(10,e?.width??0),h=Math.max(70,e?.height??0));let f=-1*u/2,d=-1*h/2,p=Ze.svg(s),m=Je(e,{stroke:i.lineColor,fill:i.lineColor});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=p.rectangle(f,d,u,h,m),y=s.insert(()=>g,":first-child");l&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",l),a&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",a),Qe(e,y);let v=n?.padding??0;return e.width&&e.height&&(e.width+=v/2||0,e.height+=v/2||0),e.intersect=function(x){return Xe.rect(e,x)},s}var WJ=N(()=>{"use strict";Ht();Ut();$t();It();o(qJ,"forkJoin")});async function YJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let i=80,a=50,{shapeSvg:s,bbox:l}=await ut(t,e,st(e)),u=Math.max(i,l.width+(e.padding??0)*2,e?.width??0),h=Math.max(a,l.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Ze.svg(s),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-u/2,y:-h/2},{x:u/2-f,y:-h/2},...Kd(-u/2+f,0,f,50,90,270),{x:u/2-f,y:h/2},{x:-u/2,y:h/2}],y=Vt(g),v=p.path(y,m),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),Qe(e,x),e.intersect=function(b){return X.info("Pill intersect",e,{radius:f,point:b}),Xe.polygon(e,g,b)},s}var XJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();o(YJ,"halfRoundedRectangle")});async function jJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.height+(e.padding??0),l=a.width+(e.padding??0)*2.5,{cssStyles:u}=e,h=Ze.svg(i),f=Je(e,{});e.look!=="handDrawn"&&(f.roughness=0,f.fillStyle="solid");let d=l/2,p=d/6;d=d+p;let m=s/2,g=m/2,y=d-g,v=[{x:-y,y:-m},{x:0,y:-m},{x:y,y:-m},{x:d,y:0},{x:y,y:m},{x:0,y:m},{x:-y,y:m},{x:-d,y:0}],x=Vt(v),b=h.path(x,f),T=i.insert(()=>b,":first-child");return T.attr("class","basic label-container"),u&&e.look!=="handDrawn"&&T.selectChildren("path").attr("style",u),n&&e.look!=="handDrawn"&&T.selectChildren("path").attr("style",n),e.width=l,e.height=s,Qe(e,T),e.intersect=function(S){return Xe.polygon(e,v,S)},i}var KJ=N(()=>{"use strict";It();Ut();$t();Ht();o(jJ,"hexagon")});async function QJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.label="",e.labelStyle=r;let{shapeSvg:i}=await ut(t,e,st(e)),a=Math.max(30,e?.width??0),s=Math.max(30,e?.height??0),{cssStyles:l}=e,u=Ze.svg(i),h=Je(e,{});e.look!=="handDrawn"&&(h.roughness=0,h.fillStyle="solid");let f=[{x:0,y:0},{x:a,y:0},{x:0,y:s},{x:a,y:s}],d=Vt(f),p=u.path(d,h),m=i.insert(()=>p,":first-child");return m.attr("class","basic label-container"),l&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",l),n&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",n),m.attr("transform",`translate(${-a/2}, ${-s/2})`),Qe(e,m),e.intersect=function(g){return X.info("Pill intersect",e,{points:f}),Xe.polygon(e,f,g)},i}var ZJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();o(QJ,"hourglass")});async function JJ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=je(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await ut(t,e,"icon-shape default"),p=e.pos==="t",m=l,g=l,{nodeBorder:y}=r,{stylesMap:v}=wc(e),x=-g/2,b=-m/2,T=e.label?8:0,S=Ze.svg(h),w=Je(e,{stroke:"none",fill:"none"});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let k=S.rectangle(x,b,g,m,w),A=Math.max(g,f.width),C=m+f.height+T,R=S.rectangle(-A/2,-C/2,A,C,{...w,fill:"transparent",stroke:"none"}),I=h.insert(()=>k,":first-child"),L=h.insert(()=>R);if(e.icon){let E=h.append("g");E.html(`${await _s(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let D=E.node().getBBox(),_=D.width,O=D.height,M=D.x,P=D.y;E.attr("transform",`translate(${-_/2-M},${p?f.height/2+T/2-O/2-P:-f.height/2-T/2-O/2-P})`),E.attr("style",`color: ${v.get("stroke")??y};`)}return d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${p?-C/2:C/2-f.height})`),I.attr("transform",`translate(0,${p?f.height/2+T/2:-f.height/2-T/2})`),Qe(e,L),e.intersect=function(E){if(X.info("iconSquare intersect",e,E),!e.label)return Xe.rect(e,E);let D=e.x??0,_=e.y??0,O=e.height??0,M=[];return p?M=[{x:D-f.width/2,y:_-O/2},{x:D+f.width/2,y:_-O/2},{x:D+f.width/2,y:_-O/2+f.height+T},{x:D+g/2,y:_-O/2+f.height+T},{x:D+g/2,y:_+O/2},{x:D-g/2,y:_+O/2},{x:D-g/2,y:_-O/2+f.height+T},{x:D-f.width/2,y:_-O/2+f.height+T}]:M=[{x:D-g/2,y:_-O/2},{x:D+g/2,y:_-O/2},{x:D+g/2,y:_-O/2+m},{x:D+f.width/2,y:_-O/2+m},{x:D+f.width/2/2,y:_+O/2},{x:D-f.width/2,y:_+O/2},{x:D-f.width/2,y:_-O/2+m},{x:D-g/2,y:_-O/2+m}],Xe.polygon(e,M,E)},h}var eee=N(()=>{"use strict";Ht();pt();nc();Ut();$t();It();o(JJ,"icon")});async function tee(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=je(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await ut(t,e,"icon-shape default"),p=20,m=e.label?8:0,g=e.pos==="t",{nodeBorder:y,mainBkg:v}=r,{stylesMap:x}=wc(e),b=Ze.svg(h),T=Je(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let S=x.get("fill");T.stroke=S??v;let w=h.append("g");e.icon&&w.html(`${await _s(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let k=w.node().getBBox(),A=k.width,C=k.height,R=k.x,I=k.y,L=Math.max(A,C)*Math.SQRT2+p*2,E=b.circle(0,0,L,T),D=Math.max(L,f.width),_=L+f.height+m,O=b.rectangle(-D/2,-_/2,D,_,{...T,fill:"transparent",stroke:"none"}),M=h.insert(()=>E,":first-child"),P=h.insert(()=>O);return w.attr("transform",`translate(${-A/2-R},${g?f.height/2+m/2-C/2-I:-f.height/2-m/2-C/2-I})`),w.attr("style",`color: ${x.get("stroke")??y};`),d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${g?-_/2:_/2-f.height})`),M.attr("transform",`translate(0,${g?f.height/2+m/2:-f.height/2-m/2})`),Qe(e,P),e.intersect=function(B){return X.info("iconSquare intersect",e,B),Xe.rect(e,B)},h}var ree=N(()=>{"use strict";Ht();pt();nc();Ut();$t();It();o(tee,"iconCircle")});var Fs,Zd=N(()=>{"use strict";Fs=o((t,e,r,n,i)=>["M",t+i,e,"H",t+r-i,"A",i,i,0,0,1,t+r,e+i,"V",e+n-i,"A",i,i,0,0,1,t+r-i,e+n,"H",t+i,"A",i,i,0,0,1,t,e+n-i,"V",e+i,"A",i,i,0,0,1,t+i,e,"Z"].join(" "),"createRoundedRectPathD")});async function nee(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=je(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await ut(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=wc(e),T=-y/2,S=-g/2,w=e.label?8:0,k=Ze.svg(h),A=Je(e,{});e.look!=="handDrawn"&&(A.roughness=0,A.fillStyle="solid");let C=b.get("fill");A.stroke=C??x;let R=k.path(Fs(T,S,y,g,5),A),I=Math.max(y,f.width),L=g+f.height+w,E=k.rectangle(-I/2,-L/2,I,L,{...A,fill:"transparent",stroke:"none"}),D=h.insert(()=>R,":first-child").attr("class","icon-shape2"),_=h.insert(()=>E);if(e.icon){let O=h.append("g");O.html(`${await _s(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let M=O.node().getBBox(),P=M.width,B=M.height,F=M.x,G=M.y;O.attr("transform",`translate(${-P/2-F},${m?f.height/2+w/2-B/2-G:-f.height/2-w/2-B/2-G})`),O.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-L/2:L/2-f.height})`),D.attr("transform",`translate(0,${m?f.height/2+w/2:-f.height/2-w/2})`),Qe(e,_),e.intersect=function(O){if(X.info("iconSquare intersect",e,O),!e.label)return Xe.rect(e,O);let M=e.x??0,P=e.y??0,B=e.height??0,F=[];return m?F=[{x:M-f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2+f.height+w},{x:M+y/2,y:P-B/2+f.height+w},{x:M+y/2,y:P+B/2},{x:M-y/2,y:P+B/2},{x:M-y/2,y:P-B/2+f.height+w},{x:M-f.width/2,y:P-B/2+f.height+w}]:F=[{x:M-y/2,y:P-B/2},{x:M+y/2,y:P-B/2},{x:M+y/2,y:P-B/2+g},{x:M+f.width/2,y:P-B/2+g},{x:M+f.width/2/2,y:P+B/2},{x:M-f.width/2,y:P+B/2},{x:M-f.width/2,y:P-B/2+g},{x:M-y/2,y:P-B/2+g}],Xe.polygon(e,F,O)},h}var iee=N(()=>{"use strict";Ht();pt();nc();Ut();$t();Zd();It();o(nee,"iconRounded")});async function aee(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=je(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await ut(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=wc(e),T=-y/2,S=-g/2,w=e.label?8:0,k=Ze.svg(h),A=Je(e,{});e.look!=="handDrawn"&&(A.roughness=0,A.fillStyle="solid");let C=b.get("fill");A.stroke=C??x;let R=k.path(Fs(T,S,y,g,.1),A),I=Math.max(y,f.width),L=g+f.height+w,E=k.rectangle(-I/2,-L/2,I,L,{...A,fill:"transparent",stroke:"none"}),D=h.insert(()=>R,":first-child"),_=h.insert(()=>E);if(e.icon){let O=h.append("g");O.html(`${await _s(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let M=O.node().getBBox(),P=M.width,B=M.height,F=M.x,G=M.y;O.attr("transform",`translate(${-P/2-F},${m?f.height/2+w/2-B/2-G:-f.height/2-w/2-B/2-G})`),O.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-L/2:L/2-f.height})`),D.attr("transform",`translate(0,${m?f.height/2+w/2:-f.height/2-w/2})`),Qe(e,_),e.intersect=function(O){if(X.info("iconSquare intersect",e,O),!e.label)return Xe.rect(e,O);let M=e.x??0,P=e.y??0,B=e.height??0,F=[];return m?F=[{x:M-f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2+f.height+w},{x:M+y/2,y:P-B/2+f.height+w},{x:M+y/2,y:P+B/2},{x:M-y/2,y:P+B/2},{x:M-y/2,y:P-B/2+f.height+w},{x:M-f.width/2,y:P-B/2+f.height+w}]:F=[{x:M-y/2,y:P-B/2},{x:M+y/2,y:P-B/2},{x:M+y/2,y:P-B/2+g},{x:M+f.width/2,y:P-B/2+g},{x:M+f.width/2/2,y:P+B/2},{x:M-f.width/2,y:P+B/2},{x:M-f.width/2,y:P-B/2+g},{x:M-y/2,y:P-B/2+g}],Xe.polygon(e,F,O)},h}var see=N(()=>{"use strict";Ht();pt();nc();Ut();Zd();$t();It();o(aee,"iconSquare")});async function oee(t,e,{config:{flowchart:r}}){let n=new Image;n.src=e?.img??"",await n.decode();let i=Number(n.naturalWidth.toString().replace("px","")),a=Number(n.naturalHeight.toString().replace("px",""));e.imageAspectRatio=i/a;let{labelStyles:s}=je(e);e.labelStyle=s;let l=r?.wrappingWidth;e.defaultWidth=r?.wrappingWidth;let u=Math.max(e.label?l??0:0,e?.assetWidth??i),h=e.constraint==="on"&&e?.assetHeight?e.assetHeight*e.imageAspectRatio:u,f=e.constraint==="on"?h/e.imageAspectRatio:e?.assetHeight??a;e.width=Math.max(h,l??0);let{shapeSvg:d,bbox:p,label:m}=await ut(t,e,"image-shape default"),g=e.pos==="t",y=-h/2,v=-f/2,x=e.label?8:0,b=Ze.svg(d),T=Je(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let S=b.rectangle(y,v,h,f,T),w=Math.max(h,p.width),k=f+p.height+x,A=b.rectangle(-w/2,-k/2,w,k,{...T,fill:"none",stroke:"none"}),C=d.insert(()=>S,":first-child"),R=d.insert(()=>A);if(e.img){let I=d.append("image");I.attr("href",e.img),I.attr("width",h),I.attr("height",f),I.attr("preserveAspectRatio","none"),I.attr("transform",`translate(${-h/2},${g?k/2-f:-k/2})`)}return m.attr("transform",`translate(${-p.width/2-(p.x-(p.left??0))},${g?-f/2-p.height/2-x/2:f/2-p.height/2+x/2})`),C.attr("transform",`translate(0,${g?p.height/2+x/2:-p.height/2-x/2})`),Qe(e,R),e.intersect=function(I){if(X.info("iconSquare intersect",e,I),!e.label)return Xe.rect(e,I);let L=e.x??0,E=e.y??0,D=e.height??0,_=[];return g?_=[{x:L-p.width/2,y:E-D/2},{x:L+p.width/2,y:E-D/2},{x:L+p.width/2,y:E-D/2+p.height+x},{x:L+h/2,y:E-D/2+p.height+x},{x:L+h/2,y:E+D/2},{x:L-h/2,y:E+D/2},{x:L-h/2,y:E-D/2+p.height+x},{x:L-p.width/2,y:E-D/2+p.height+x}]:_=[{x:L-h/2,y:E-D/2},{x:L+h/2,y:E-D/2},{x:L+h/2,y:E-D/2+f},{x:L+p.width/2,y:E-D/2+f},{x:L+p.width/2/2,y:E+D/2},{x:L-p.width/2,y:E+D/2},{x:L-p.width/2,y:E-D/2+f},{x:L-h/2,y:E-D/2+f}],Xe.polygon(e,_,I)},d}var lee=N(()=>{"use strict";Ht();pt();Ut();$t();It();o(oee,"imageSquare")});async function cee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=[{x:0,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:-3*l/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ze.svg(i),p=Je(e,{}),m=Vt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Bs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Qe(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var uee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();o(cee,"inv_trapezoid")});async function Jd(t,e,r){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n;let{shapeSvg:a,bbox:s}=await ut(t,e,st(e)),l=Math.max(s.width+r.labelPaddingX*2,e?.width||0),u=Math.max(s.height+r.labelPaddingY*2,e?.height||0),h=-l/2,f=-u/2,d,{rx:p,ry:m}=e,{cssStyles:g}=e;if(r?.rx&&r.ry&&(p=r.rx,m=r.ry),e.look==="handDrawn"){let y=Ze.svg(a),v=Je(e,{}),x=p||m?y.path(Fs(h,f,l,u,p||0),v):y.rectangle(h,f,l,u,v);d=a.insert(()=>x,":first-child"),d.attr("class","basic label-container").attr("style",Cn(g))}else d=a.insert("rect",":first-child"),d.attr("class","basic label-container").attr("style",i).attr("rx",Cn(p)).attr("ry",Cn(m)).attr("x",h).attr("y",f).attr("width",l).attr("height",u);return Qe(e,d),e.calcIntersect=function(y,v){return Xe.rect(y,v)},e.intersect=function(y){return Xe.rect(e,y)},a}var M2=N(()=>{"use strict";It();Ut();Zd();$t();Ht();tr();o(Jd,"drawRect")});async function hee(t,e){let{shapeSvg:r,bbox:n,label:i}=await ut(t,e,"label"),a=r.insert("rect",":first-child");return a.attr("width",.1).attr("height",.1),r.attr("class","label edgeLabel"),i.attr("transform",`translate(${-(n.width/2)-(n.x-(n.left??0))}, ${-(n.height/2)-(n.y-(n.top??0))})`),Qe(e,a),e.intersect=function(u){return Xe.rect(e,u)},r}var fee=N(()=>{"use strict";M2();It();Ut();o(hee,"labelRect")});async function dee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:0,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:-(3*l)/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ze.svg(i),p=Je(e,{}),m=Vt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Bs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Qe(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var pee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();o(dee,"lean_left")});async function mee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:-3*l/6,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ze.svg(i),p=Je(e,{}),m=Vt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Bs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Qe(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var gee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();o(mee,"lean_right")});function yee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.label="",e.labelStyle=r;let i=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),{cssStyles:a}=e,s=Math.max(35,e?.width??0),l=Math.max(35,e?.height??0),u=7,h=[{x:s,y:0},{x:0,y:l+u/2},{x:s-2*u,y:l+u/2},{x:0,y:2*l},{x:s,y:l-u/2},{x:2*u,y:l-u/2}],f=Ze.svg(i),d=Je(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=Vt(h),m=f.path(p,d),g=i.insert(()=>m,":first-child");return a&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",a),n&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",n),g.attr("transform",`translate(-${s/2},${-l})`),Qe(e,g),e.intersect=function(y){return X.info("lightningBolt intersect",e,y),Xe.polygon(e,h,y)},i}var vee=N(()=>{"use strict";pt();It();$t();Ht();Ut();It();o(yee,"lightningBolt")});async function xee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0),e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+(e.padding??0),e.height??0),d=f*.1,p,{cssStyles:m}=e;if(e.look==="handDrawn"){let g=Ze.svg(i),y=pRe(0,0,l,f,u,h,d),v=mRe(0,h,l,f,u,h),x=Je(e,{}),b=g.path(y,x),T=g.path(v,x);i.insert(()=>T,":first-child").attr("class","line"),p=i.insert(()=>b,":first-child"),p.attr("class","basic label-container"),m&&p.attr("style",m)}else{let g=dRe(0,0,l,f,u,h,d);p=i.insert("path",":first-child").attr("d",g).attr("class","basic label-container").attr("style",Cn(m)).attr("style",n)}return p.attr("label-offset-y",h),p.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),Qe(e,p),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),e.intersect=function(g){let y=Xe.rect(e,g),v=y.x-(e.x??0);if(u!=0&&(Math.abs(v)<(e.width??0)/2||Math.abs(v)==(e.width??0)/2&&Math.abs(y.y-(e.y??0))>(e.height??0)/2-h)){let x=h*h*(1-v*v/(u*u));x>0&&(x=Math.sqrt(x)),x=h-x,g.y-(e.y??0)>0&&(x=-x),y.y+=x}return y},i}var dRe,pRe,mRe,bee=N(()=>{"use strict";It();Ut();$t();Ht();tr();dRe=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createCylinderPathD"),pRe=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createOuterCylinderPathD"),mRe=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(xee,"linedCylinder")});async function Tee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,{cssStyles:d}=e,p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-l/2-l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:f/2},...Go(-l/2-l/2*.1,f/2,l/2+l/2*.1,f/2,h,.8),{x:l/2+l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:-f/2},{x:-l/2,y:-f/2},{x:-l/2,y:f/2*1.1},{x:-l/2,y:-f/2}],y=p.polygon(g.map(x=>[x.x,x.y]),m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)+l/2*.1/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),Qe(e,v),e.intersect=function(x){return Xe.polygon(e,g,x)},i}var wee=N(()=>{"use strict";It();Ut();Ht();$t();o(Tee,"linedWaveEdgedRect")});async function kee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{}),y=[{x:f-h,y:d+h},{x:f-h,y:d+u+h},{x:f+l-h,y:d+u+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d+u-h},{x:f+l+h,y:d+u-h},{x:f+l+h,y:d-h},{x:f+h,y:d-h},{x:f+h,y:d},{x:f,y:d},{x:f,y:d+h}],v=[{x:f,y:d+h},{x:f+l-h,y:d+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d},{x:f,y:d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Vt(y),b=m.path(x,g),T=Vt(v),S=m.path(T,{...g,fill:"none"}),w=i.insert(()=>S,":first-child");return w.insert(()=>b,":first-child"),w.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)-h-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),Qe(e,w),e.intersect=function(k){return Xe.polygon(e,y,k)},i}var Eee=N(()=>{"use strict";It();$t();Ht();Ut();o(kee,"multiRect")});async function See(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,d=-l/2,p=-f/2,m=5,{cssStyles:g}=e,y=Go(d-m,p+f+m,d+l-m,p+f+m,h,.8),v=y?.[y.length-1],x=[{x:d-m,y:p+m},{x:d-m,y:p+f+m},...y,{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:v.y-2*m},{x:d+l+m,y:v.y-2*m},{x:d+l+m,y:p-m},{x:d+m,y:p-m},{x:d+m,y:p},{x:d,y:p},{x:d,y:p+m}],b=[{x:d,y:p+m},{x:d+l-m,y:p+m},{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:p},{x:d,y:p}],T=Ze.svg(i),S=Je(e,{});e.look!=="handDrawn"&&(S.roughness=0,S.fillStyle="solid");let w=Vt(x),k=T.path(w,S),A=Vt(b),C=T.path(A,S),R=i.insert(()=>k,":first-child");return R.insert(()=>C),R.attr("class","basic label-container"),g&&e.look!=="handDrawn"&&R.selectAll("path").attr("style",g),n&&e.look!=="handDrawn"&&R.selectAll("path").attr("style",n),R.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-(a.width/2)-m-(a.x-(a.left??0))}, ${-(a.height/2)+m-h/2-(a.y-(a.top??0))})`),Qe(e,R),e.intersect=function(I){return Xe.polygon(e,x,I)},i}var Cee=N(()=>{"use strict";It();Ut();Ht();$t();o(See,"multiWaveEdgedRectangle")});async function Aee(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n,e.useHtmlLabels||Qt().flowchart?.htmlLabels!==!1||(e.centerLabel=!0);let{shapeSvg:s,bbox:l,label:u}=await ut(t,e,st(e)),h=Math.max(l.width+(e.padding??0)*2,e?.width??0),f=Math.max(l.height+(e.padding??0)*2,e?.height??0),d=-h/2,p=-f/2,{cssStyles:m}=e,g=Ze.svg(s),y=Je(e,{fill:r.noteBkgColor,stroke:r.noteBorderColor});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=g.rectangle(d,p,h,f,y),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",m),i&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",i),u.attr("transform",`translate(${-l.width/2-(l.x-(l.left??0))}, ${-(l.height/2)-(l.y-(l.top??0))})`),Qe(e,x),e.intersect=function(b){return Xe.rect(e,b)},s}var _ee=N(()=>{"use strict";Ht();Ut();$t();It();qn();o(Aee,"note")});async function Dee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.width+e.padding,l=a.height+e.padding,u=s+l,h=.5,f=[{x:u/2,y:0},{x:u,y:-u/2},{x:u/2,y:-u},{x:0,y:-u/2}],d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Ze.svg(i),g=Je(e,{}),y=gRe(0,0,u),v=m.path(y,g);d=i.insert(()=>v,":first-child").attr("transform",`translate(${-u/2+h}, ${u/2})`),p&&d.attr("style",p)}else d=Bs(i,u,u,f),d.attr("transform",`translate(${-u/2+h}, ${u/2})`);return n&&d.attr("style",n),Qe(e,d),e.calcIntersect=function(m,g){let y=m.width,v=[{x:y/2,y:0},{x:y,y:-y/2},{x:y/2,y:-y},{x:0,y:-y/2}],x=Xe.polygon(m,v,g);return{x:x.x-.5,y:x.y-.5}},e.intersect=function(m){return this.calcIntersect(e,m)},i}var gRe,Lee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();gRe=o((t,e,r)=>[`M${t+r/2},${e}`,`L${t+r},${e-r/2}`,`L${t+r/2},${e-r}`,`L${t},${e-r/2}`,"Z"].join(" "),"createDecisionBoxPathD");o(Dee,"question")});async function Ree(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0),e?.width??0),u=Math.max(a.height+(e.padding??0),e?.height??0),h=-l/2,f=-u/2,d=f/2,p=[{x:h+d,y:f},{x:h,y:0},{x:h+d,y:-f},{x:-h,y:-f},{x:-h,y:f}],{cssStyles:m}=e,g=Ze.svg(i),y=Je(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=Vt(p),x=g.path(v,y),b=i.insert(()=>x,":first-child");return b.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),b.attr("transform",`translate(${-d/2},0)`),s.attr("transform",`translate(${-d/2-a.width/2-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),Qe(e,b),e.intersect=function(T){return Xe.polygon(e,p,T)},i}var Nee=N(()=>{"use strict";It();Ut();$t();Ht();o(Ree,"rect_left_inv_arrow")});function yRe(t,e){e&&t.attr("style",e)}async function vRe(t){let e=qe(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),n=ge(),i=t.label;t.label&&kn(t.label)&&(i=await kh(t.label.replace(tt.lineBreakRegex,` +`),n));let s='"+i+"";return r.html(sr(s,n)),yRe(r,t.labelStyle),r.style("display","inline-block"),r.style("padding-right","1px"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}var xRe,kc,aw=N(()=>{"use strict";yr();Xt();gr();pt();tr();o(yRe,"applyStyle");o(vRe,"addHtmlLabel");xRe=o(async(t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),vr(ge().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),X.info("vertexText"+i);let a={isNode:n,label:Ji(i).replace(/fa[blrs]?:fa-[\w-]+/g,l=>``),labelStyle:e&&e.replace("fill:","color:")};return await vRe(a)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let l of s){let u=document.createElementNS("http://www.w3.org/2000/svg","tspan");u.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),u.setAttribute("dy","1em"),u.setAttribute("x","0"),r?u.setAttribute("class","title-row"):u.setAttribute("class","row"),u.textContent=l.trim(),a.appendChild(u)}return a}},"createLabel"),kc=xRe});async function Mee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let i;e.cssClasses?i="node "+e.cssClasses:i="node default";let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=a.insert("g"),l=a.insert("g").attr("class","label").attr("style",n),u=e.description,h=e.label,f=l.node().appendChild(await kc(h,e.labelStyle,!0,!0)),d={width:0,height:0};if(vr(ge()?.flowchart?.htmlLabels)){let C=f.children[0],R=qe(f);d=C.getBoundingClientRect(),R.attr("width",d.width),R.attr("height",d.height)}X.info("Text 2",u);let p=u||[],m=f.getBBox(),g=l.node().appendChild(await kc(p.join?p.join("
    "):p,e.labelStyle,!0,!0)),y=g.children[0],v=qe(g);d=y.getBoundingClientRect(),v.attr("width",d.width),v.attr("height",d.height);let x=(e.padding||0)/2;qe(g).attr("transform","translate( "+(d.width>m.width?0:(m.width-d.width)/2)+", "+(m.height+x+5)+")"),qe(f).attr("transform","translate( "+(d.width(X.debug("Rough node insert CXC",I),L),":first-child"),k=a.insert(()=>(X.debug("Rough node insert CXC",I),I),":first-child")}else k=s.insert("rect",":first-child"),A=s.insert("line"),k.attr("class","outer title-state").attr("style",n).attr("x",-d.width/2-x).attr("y",-d.height/2-x).attr("width",d.width+(e.padding||0)).attr("height",d.height+(e.padding||0)),A.attr("class","divider").attr("x1",-d.width/2-x).attr("x2",d.width/2+x).attr("y1",-d.height/2-x+m.height+x).attr("y2",-d.height/2-x+m.height+x);return Qe(e,k),e.intersect=function(C){return Xe.rect(e,C)},a}var Iee=N(()=>{"use strict";yr();gr();It();aw();Ut();$t();Ht();Xt();Zd();pt();o(Mee,"rectWithTitle")});function sw(t,e,r,n,i,a,s){let u=(t+r)/2,h=(e+n)/2,f=Math.atan2(n-e,r-t),d=(r-t)/2,p=(n-e)/2,m=d/i,g=p/a,y=Math.sqrt(m**2+g**2);if(y>1)throw new Error("The given radii are too small to create an arc between the points.");let v=Math.sqrt(1-y**2),x=u+v*a*Math.sin(f)*(s?-1:1),b=h-v*i*Math.cos(f)*(s?-1:1),T=Math.atan2((e-b)/a,(t-x)/i),w=Math.atan2((n-b)/a,(r-x)/i)-T;s&&w<0&&(w+=2*Math.PI),!s&&w>0&&(w-=2*Math.PI);let k=[];for(let A=0;A<20;A++){let C=A/19,R=T+C*w,I=x+i*Math.cos(R),L=b+a*Math.sin(R);k.push({x:I,y:L})}return k}async function Oee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=e?.padding??0,l=e?.padding??0,u=(e?.width?e?.width:a.width)+s*2,h=(e?.height?e?.height:a.height)+l*2,f=e.radius||5,d=e.taper||5,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{});e.stroke&&(g.stroke=e.stroke),e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:-u/2+d,y:-h/2},{x:u/2-d,y:-h/2},...sw(u/2-d,-h/2,u/2,-h/2+d,f,f,!0),{x:u/2,y:-h/2+d},{x:u/2,y:h/2-d},...sw(u/2,h/2-d,u/2-d,h/2,f,f,!0),{x:u/2-d,y:h/2},{x:-u/2+d,y:h/2},...sw(-u/2+d,h/2,-u/2,h/2-d,f,f,!0),{x:-u/2,y:h/2-d},{x:-u/2,y:-h/2+d},...sw(-u/2,-h/2+d,-u/2+d,-h/2,f,f,!0)],v=Vt(y),x=m.path(v,g),b=i.insert(()=>x,":first-child");return b.attr("class","basic label-container outer-path"),p&&e.look!=="handDrawn"&&b.selectChildren("path").attr("style",p),n&&e.look!=="handDrawn"&&b.selectChildren("path").attr("style",n),Qe(e,b),e.intersect=function(T){return Xe.polygon(e,y,T)},i}var Pee=N(()=>{"use strict";It();Ut();$t();Ht();o(sw,"generateArcPoints");o(Oee,"roundedRect")});async function Bee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=e?.padding??0,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=-a.width/2-l,d=-a.height/2-l,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d},{x:f+u+8,y:d},{x:f+u+8,y:d+h},{x:f-8,y:d+h},{x:f-8,y:d},{x:f,y:d},{x:f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container").attr("style",Cn(p)),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${-u/2+4+(e.padding??0)-(a.x-(a.left??0))},${-h/2+(e.padding??0)-(a.y-(a.top??0))})`),Qe(e,x),e.intersect=function(b){return Xe.rect(e,b)},i}var Fee=N(()=>{"use strict";It();Ut();$t();Ht();tr();o(Bee,"shadedProcess")});async function $ee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=-l/2,f=-u/2,{cssStyles:d}=e,p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:h,y:f},{x:h,y:f+u},{x:h+l,y:f+u},{x:h+l,y:f-u/2}],y=Vt(g),v=p.path(y,m),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),x.attr("transform",`translate(0, ${u/4})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))}, ${-u/4+(e.padding??0)-(a.y-(a.top??0))})`),Qe(e,x),e.intersect=function(b){return Xe.polygon(e,g,b)},i}var zee=N(()=>{"use strict";It();Ut();$t();Ht();o($ee,"slopedRect")});async function Gee(t,e){let r={rx:0,ry:0,classes:"",labelPaddingX:e.labelPaddingX??(e?.padding||0)*2,labelPaddingY:(e?.padding||0)*1};return Jd(t,e,r)}var Vee=N(()=>{"use strict";M2();o(Gee,"squareRect")});async function Uee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.height+e.padding,l=a.width+s/4+e.padding,u=s/2,{cssStyles:h}=e,f=Ze.svg(i),d=Je(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=[{x:-l/2+u,y:-s/2},{x:l/2-u,y:-s/2},...Kd(-l/2+u,0,u,50,90,270),{x:l/2-u,y:s/2},...Kd(l/2-u,0,u,50,270,450)],m=Vt(p),g=f.path(m,d),y=i.insert(()=>g,":first-child");return y.attr("class","basic label-container outer-path"),h&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",h),n&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",n),Qe(e,y),e.intersect=function(v){return Xe.polygon(e,p,v)},i}var Hee=N(()=>{"use strict";It();Ut();$t();Ht();o(Uee,"stadium")});async function qee(t,e){return Jd(t,e,{rx:5,ry:5,classes:"flowchart-node"})}var Wee=N(()=>{"use strict";M2();o(qee,"state")});function Yee(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n;let{cssStyles:a}=e,{lineColor:s,stateBorder:l,nodeBorder:u}=r,h=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),f=Ze.svg(h),d=Je(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=f.circle(0,0,14,{...d,stroke:s,strokeWidth:2}),m=l??u,g=f.circle(0,0,5,{...d,fill:m,stroke:m,strokeWidth:2,fillStyle:"solid"}),y=h.insert(()=>p,":first-child");return y.insert(()=>g),a&&y.selectAll("path").attr("style",a),i&&y.selectAll("path").attr("style",i),Qe(e,y),e.intersect=function(v){return Xe.circle(e,7,v)},h}var Xee=N(()=>{"use strict";Ht();Ut();$t();It();o(Yee,"stateEnd")});function jee(t,e,{config:{themeVariables:r}}){let{lineColor:n}=r,i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a;if(e.look==="handDrawn"){let l=Ze.svg(i).circle(0,0,14,tJ(n));a=i.insert(()=>l),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else a=i.insert("circle",":first-child"),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return Qe(e,a),e.intersect=function(s){return Xe.circle(e,7,s)},i}var Kee=N(()=>{"use strict";Ht();Ut();$t();It();o(jee,"stateStart")});async function Qee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=(e?.padding||0)/2,l=a.width+e.padding,u=a.height+e.padding,h=-a.width/2-s,f=-a.height/2-s,d=[{x:0,y:0},{x:l,y:0},{x:l,y:-u},{x:0,y:-u},{x:0,y:0},{x:-8,y:0},{x:l+8,y:0},{x:l+8,y:-u},{x:-8,y:-u},{x:-8,y:0}];if(e.look==="handDrawn"){let p=Ze.svg(i),m=Je(e,{}),g=p.rectangle(h-8,f,l+16,u,m),y=p.line(h,f,h,f+u,m),v=p.line(h+l,f,h+l,f+u,m);i.insert(()=>y,":first-child"),i.insert(()=>v,":first-child");let x=i.insert(()=>g,":first-child"),{cssStyles:b}=e;x.attr("class","basic label-container").attr("style",Cn(b)),Qe(e,x)}else{let p=Bs(i,l,u,d);n&&p.attr("style",n),Qe(e,p)}return e.intersect=function(p){return Xe.polygon(e,d,p)},i}var Zee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();tr();o(Qee,"subroutine")});async function Jee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=-s/2,h=-l/2,f=.2*l,d=.2*l,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{}),y=[{x:u-f/2,y:h},{x:u+s+f/2,y:h},{x:u+s+f/2,y:h+l},{x:u-f/2,y:h+l}],v=[{x:u+s-f/2,y:h+l},{x:u+s+f/2,y:h+l},{x:u+s+f/2,y:h+l-d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Vt(y),b=m.path(x,g),T=Vt(v),S=m.path(T,{...g,fillStyle:"solid"}),w=i.insert(()=>S,":first-child");return w.insert(()=>b,":first-child"),w.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),Qe(e,w),e.intersect=function(k){return Xe.polygon(e,y,k)},i}var ete=N(()=>{"use strict";It();$t();Ht();Ut();o(Jee,"taggedRect")});async function tte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=.2*l,d=.2*u,p=u+h,{cssStyles:m}=e,g=Ze.svg(i),y=Je(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=[{x:-l/2-l/2*.1,y:p/2},...Go(-l/2-l/2*.1,p/2,l/2+l/2*.1,p/2,h,.8),{x:l/2+l/2*.1,y:-p/2},{x:-l/2-l/2*.1,y:-p/2}],x=-l/2+l/2*.1,b=-p/2-d*.4,T=[{x:x+l-f,y:(b+u)*1.4},{x:x+l,y:b+u-d},{x:x+l,y:(b+u)*.9},...Go(x+l,(b+u)*1.3,x+l-f,(b+u)*1.5,-u*.03,.5)],S=Vt(v),w=g.path(S,y),k=Vt(T),A=g.path(k,{...y,fillStyle:"solid"}),C=i.insert(()=>A,":first-child");return C.insert(()=>w,":first-child"),C.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),Qe(e,C),e.intersect=function(R){return Xe.polygon(e,v,R)},i}var rte=N(()=>{"use strict";It();Ut();Ht();$t();o(tte,"taggedWaveEdgedRectangle")});async function nte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+e.padding,e?.width||0),l=Math.max(a.height+e.padding,e?.height||0),u=-s/2,h=-l/2,f=i.insert("rect",":first-child");return f.attr("class","text").attr("style",n).attr("rx",0).attr("ry",0).attr("x",u).attr("y",h).attr("width",s).attr("height",l),Qe(e,f),e.intersect=function(d){return Xe.rect(e,d)},i}var ite=N(()=>{"use strict";It();Ut();$t();o(nte,"text")});async function ate(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s,halfPadding:l}=await ut(t,e,st(e)),u=e.look==="neo"?l*2:l,h=a.height+u,f=h/2,d=f/(2.5+h/50),p=a.width+d+u,{cssStyles:m}=e,g;if(e.look==="handDrawn"){let y=Ze.svg(i),v=TRe(0,0,p,h,d,f),x=wRe(0,0,p,h,d,f),b=y.path(v,Je(e,{})),T=y.path(x,Je(e,{fill:"none"}));g=i.insert(()=>T,":first-child"),g=i.insert(()=>b,":first-child"),g.attr("class","basic label-container"),m&&g.attr("style",m)}else{let y=bRe(0,0,p,h,d,f);g=i.insert("path",":first-child").attr("d",y).attr("class","basic label-container").attr("style",Cn(m)).attr("style",n),g.attr("class","basic label-container"),m&&g.selectAll("path").attr("style",m),n&&g.selectAll("path").attr("style",n)}return g.attr("label-offset-x",d),g.attr("transform",`translate(${-p/2}, ${h/2} )`),s.attr("transform",`translate(${-(a.width/2)-d-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),Qe(e,g),e.intersect=function(y){let v=Xe.rect(e,y),x=v.y-(e.y??0);if(f!=0&&(Math.abs(x)<(e.height??0)/2||Math.abs(x)==(e.height??0)/2&&Math.abs(v.x-(e.x??0))>(e.width??0)/2-d)){let b=d*d*(1-x*x/(f*f));b!=0&&(b=Math.sqrt(Math.abs(b))),b=d-b,y.x-(e.x??0)>0&&(b=-b),v.x+=b}return v},i}var bRe,TRe,wRe,ste=N(()=>{"use strict";It();$t();Ht();Ut();tr();bRe=o((t,e,r,n,i,a)=>`M${t},${e} + a${i},${a} 0,0,1 0,${-n} + l${r},0 + a${i},${a} 0,0,1 0,${n} + M${r},${-n} + a${i},${a} 0,0,0 0,${n} + l${-r},0`,"createCylinderPathD"),TRe=o((t,e,r,n,i,a)=>[`M${t},${e}`,`M${t+r},${e}`,`a${i},${a} 0,0,0 0,${-n}`,`l${-r},0`,`a${i},${a} 0,0,0 0,${n}`,`l${r},0`].join(" "),"createOuterCylinderPathD"),wRe=o((t,e,r,n,i,a)=>[`M${t+r/2},${-n/2}`,`a${i},${a} 0,0,0 0,${n}`].join(" "),"createInnerCylinderPathD");o(ate,"tiltedCylinder")});async function ote(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.width+e.padding,l=a.height+e.padding,u=[{x:-3*l/6,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ze.svg(i),p=Je(e,{}),m=Vt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Bs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Qe(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var lte=N(()=>{"use strict";It();Ut();$t();Ht();Jh();o(ote,"trapezoid")});async function cte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=60,l=20,u=Math.max(s,a.width+(e.padding??0)*2,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),{cssStyles:f}=e,d=Ze.svg(i),p=Je(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let m=[{x:-u/2*.8,y:-h/2},{x:u/2*.8,y:-h/2},{x:u/2,y:-h/2*.6},{x:u/2,y:h/2},{x:-u/2,y:h/2},{x:-u/2,y:-h/2*.6}],g=Vt(m),y=d.path(g,p),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),Qe(e,v),e.intersect=function(x){return Xe.polygon(e,m,x)},i}var ute=N(()=>{"use strict";It();Ut();$t();Ht();o(cte,"trapezoidalPentagon")});async function hte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=vr(ge().flowchart?.htmlLabels),u=a.width+(e.padding??0),h=u+a.height,f=u+a.height,d=[{x:0,y:0},{x:f,y:0},{x:f/2,y:-h}],{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=Vt(d),v=m.path(y,g),x=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${h/2})`);return p&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),e.width=u,e.height=h,Qe(e,x),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${h/2-(a.height+(e.padding??0)/(l?2:1)-(a.y-(a.top??0)))})`),e.intersect=function(b){return X.info("Triangle intersect",e,d,b),Xe.polygon(e,d,b)},i}var fte=N(()=>{"use strict";pt();It();Ut();$t();Ht();It();gr();Xt();o(hte,"triangle")});async function dte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/8,f=u+h,{cssStyles:d}=e,m=70-l,g=m>0?m/2:0,y=Ze.svg(i),v=Je(e,{});e.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let x=[{x:-l/2-g,y:f/2},...Go(-l/2-g,f/2,l/2+g,f/2,h,.8),{x:l/2+g,y:-f/2},{x:-l/2-g,y:-f/2}],b=Vt(x),T=y.path(b,v),S=i.insert(()=>T,":first-child");return S.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h-(a.y-(a.top??0))})`),Qe(e,S),e.intersect=function(w){return Xe.polygon(e,x,w)},i}var pte=N(()=>{"use strict";It();Ut();Ht();$t();o(dte,"waveEdgedRectangle")});async function mte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=100,l=50,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=u/h,d=u,p=h;d>p*f?p=d/f:d=p*f,d=Math.max(d,s),p=Math.max(p,l);let m=Math.min(p*.2,p/4),g=p+m*2,{cssStyles:y}=e,v=Ze.svg(i),x=Je(e,{});e.look!=="handDrawn"&&(x.roughness=0,x.fillStyle="solid");let b=[{x:-d/2,y:g/2},...Go(-d/2,g/2,d/2,g/2,m,1),{x:d/2,y:-g/2},...Go(d/2,-g/2,-d/2,-g/2,m,-1)],T=Vt(b),S=v.path(T,x),w=i.insert(()=>S,":first-child");return w.attr("class","basic label-container"),y&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",y),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),Qe(e,w),e.intersect=function(k){return Xe.polygon(e,b,k)},i}var gte=N(()=>{"use strict";It();Ut();$t();Ht();o(mte,"waveRectangle")});async function yte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{}),y=[{x:f-h,y:d-h},{x:f-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d-h}],v=`M${f-h},${d-h} L${f+l},${d-h} L${f+l},${d+u} L${f-h},${d+u} L${f-h},${d-h} + M${f-h},${d} L${f+l},${d} + M${f},${d-h} L${f},${d+u}`;e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=m.path(v,g),b=i.insert(()=>x,":first-child");return b.attr("transform",`translate(${h/2}, ${h/2})`),b.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)+h/2-(a.x-(a.left??0))}, ${-(a.height/2)+h/2-(a.y-(a.top??0))})`),Qe(e,b),e.intersect=function(T){return Xe.polygon(e,y,T)},i}var vte=N(()=>{"use strict";It();$t();Ht();Ut();o(yte,"windowPane")});async function H9(t,e){let r=e;if(r.alias&&(e.label=r.alias),e.look==="handDrawn"){let{themeVariables:U}=Qt(),{background:j}=U,te={...e,id:e.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${j}`]};await H9(t,te)}let n=Qt();e.useHtmlLabels=n.htmlLabels;let i=n.er?.diagramPadding??10,a=n.er?.entityPadding??6,{cssStyles:s}=e,{labelStyles:l,nodeStyles:u}=je(e);if(r.attributes.length===0&&e.label){let U={rx:0,ry:0,labelPaddingX:i,labelPaddingY:i*1.5,classes:""};Zi(e.label,n)+U.labelPaddingX*20){let U=d.width+i*2-(y+v+x+b);y+=U/w,v+=U/w,x>0&&(x+=U/w),b>0&&(b+=U/w)}let A=y+v+x+b,C=Ze.svg(f),R=Je(e,{});e.look!=="handDrawn"&&(R.roughness=0,R.fillStyle="solid");let I=0;g.length>0&&(I=g.reduce((U,j)=>U+(j?.rowHeight??0),0));let L=Math.max(k.width+i*2,e?.width||0,A),E=Math.max((I??0)+d.height,e?.height||0),D=-L/2,_=-E/2;f.selectAll("g:not(:first-child)").each((U,j,te)=>{let Y=qe(te[j]),oe=Y.attr("transform"),J=0,ue=0;if(oe){let ee=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(oe);ee&&(J=parseFloat(ee[1]),ue=parseFloat(ee[2]),Y.attr("class").includes("attribute-name")?J+=y:Y.attr("class").includes("attribute-keys")?J+=y+v:Y.attr("class").includes("attribute-comment")&&(J+=y+v+x))}Y.attr("transform",`translate(${D+i/2+J}, ${ue+_+d.height+a/2})`)}),f.select(".name").attr("transform","translate("+-d.width/2+", "+(_+a/2)+")");let O=C.rectangle(D,_,L,E,R),M=f.insert(()=>O,":first-child").attr("style",s.join("")),{themeVariables:P}=Qt(),{rowEven:B,rowOdd:F,nodeBorder:G}=P;m.push(0);for(let[U,j]of g.entries()){let Y=(U+1)%2===0&&j.yOffset!==0,oe=C.rectangle(D,d.height+_+j?.yOffset,L,j?.rowHeight,{...R,fill:Y?B:F,stroke:G});f.insert(()=>oe,"g.label").attr("style",s.join("")).attr("class",`row-rect-${Y?"even":"odd"}`)}let $=C.line(D,d.height+_,L+D,d.height+_,R);f.insert(()=>$).attr("class","divider"),$=C.line(y+D,d.height+_,y+D,E+_,R),f.insert(()=>$).attr("class","divider"),T&&($=C.line(y+v+D,d.height+_,y+v+D,E+_,R),f.insert(()=>$).attr("class","divider")),S&&($=C.line(y+v+x+D,d.height+_,y+v+x+D,E+_,R),f.insert(()=>$).attr("class","divider"));for(let U of m)$=C.line(D,d.height+_+U,L+D,d.height+_+U,R),f.insert(()=>$).attr("class","divider");if(Qe(e,M),u&&e.look!=="handDrawn"){let j=u.split(";")?.filter(te=>te.includes("stroke"))?.map(te=>`${te}`).join("; ");f.selectAll("path").attr("style",j??""),f.selectAll(".row-rect-even path").attr("style",u)}return e.intersect=function(U){return Xe.rect(e,U)},f}async function I2(t,e,r,n=0,i=0,a=[],s=""){let l=t.insert("g").attr("class",`label ${a.join(" ")}`).attr("transform",`translate(${n}, ${i})`).attr("style",s);e!==rc(e)&&(e=rc(e),e=e.replaceAll("<","<").replaceAll(">",">"));let u=l.node().appendChild(await di(l,e,{width:Zi(e,r)+100,style:s,useHtmlLabels:r.htmlLabels},r));if(e.includes("<")||e.includes(">")){let f=u.children[0];for(f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">");f.childNodes[0];)f=f.childNodes[0],f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">")}let h=u.getBBox();if(vr(r.htmlLabels)){let f=u.children[0];f.style.textAlign="start";let d=qe(u);h=f.getBoundingClientRect(),d.attr("width",h.width),d.attr("height",h.height)}return h}var xte=N(()=>{"use strict";It();Ut();$t();Ht();M2();qn();zo();gr();yr();tr();o(H9,"erBox");o(I2,"addText")});async function bte(t,e,r,n,i=r.class.padding??12){let a=n?0:3,s=t.insert("g").attr("class",st(e)).attr("id",e.domId||e.id),l=null,u=null,h=null,f=null,d=0,p=0,m=0;if(l=s.insert("g").attr("class","annotation-group text"),e.annotations.length>0){let b=e.annotations[0];await ow(l,{text:`\xAB${b}\xBB`},0),d=l.node().getBBox().height}u=s.insert("g").attr("class","label-group text"),await ow(u,e,0,["font-weight: bolder"]);let g=u.node().getBBox();p=g.height,h=s.insert("g").attr("class","members-group text");let y=0;for(let b of e.members){let T=await ow(h,b,y,[b.parseClassifier()]);y+=T+a}m=h.node().getBBox().height,m<=0&&(m=i/2),f=s.insert("g").attr("class","methods-group text");let v=0;for(let b of e.methods){let T=await ow(f,b,v,[b.parseClassifier()]);v+=T+a}let x=s.node().getBBox();if(l!==null){let b=l.node().getBBox();l.attr("transform",`translate(${-b.width/2})`)}return u.attr("transform",`translate(${-g.width/2}, ${d})`),x=s.node().getBBox(),h.attr("transform",`translate(0, ${d+p+i*2})`),x=s.node().getBBox(),f.attr("transform",`translate(0, ${d+p+(m?m+i*4:i*2)})`),x=s.node().getBBox(),{shapeSvg:s,bbox:x}}async function ow(t,e,r,n=[]){let i=t.insert("g").attr("class","label").attr("style",n.join("; ")),a=Qt(),s="useHtmlLabels"in e?e.useHtmlLabels:vr(a.htmlLabels)??!0,l="";"text"in e?l=e.text:l=e.label,!s&&l.startsWith("\\")&&(l=l.substring(1)),kn(l)&&(s=!0);let u=await di(i,iv(Ji(l)),{width:Zi(l,a)+50,classes:"markdown-node-label",useHtmlLabels:s},a),h,f=1;if(s){let d=u.children[0],p=qe(u);f=d.innerHTML.split("
    ").length,d.innerHTML.includes("")&&(f+=d.innerHTML.split("").length-1);let m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=a.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,S=parseInt(b,10)*5+"px";y.style.minWidth=S,y.style.maxWidth=S}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}else{n.includes("font-weight: bolder")&&qe(u).selectAll("tspan").attr("font-weight",""),f=u.children.length;let d=u.children[0];(u.textContent===""||u.textContent.includes(">"))&&(d.textContent=l[0]+l.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),l[1]===" "&&(d.textContent=d.textContent[0]+" "+d.textContent.substring(1))),d.textContent==="undefined"&&(d.textContent=""),h=u.getBBox()}return i.attr("transform","translate(0,"+(-h.height/(2*f)+r)+")"),h.height}var Tte=N(()=>{"use strict";yr();qn();It();tr();Xt();zo();gr();o(bte,"textHelper");o(ow,"addText")});async function wte(t,e){let r=ge(),n=r.class.padding??12,i=n,a=e.useHtmlLabels??vr(r.htmlLabels)??!0,s=e;s.annotations=s.annotations??[],s.members=s.members??[],s.methods=s.methods??[];let{shapeSvg:l,bbox:u}=await bte(t,e,r,a,i),{labelStyles:h,nodeStyles:f}=je(e);e.labelStyle=h,e.cssStyles=s.styles||"";let d=s.styles?.join(";")||f||"";e.cssStyles||(e.cssStyles=d.replaceAll("!important","").split(";"));let p=s.members.length===0&&s.methods.length===0&&!r.class?.hideEmptyMembersBox,m=Ze.svg(l),g=Je(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=u.width,v=u.height;s.members.length===0&&s.methods.length===0?v+=i:s.members.length>0&&s.methods.length===0&&(v+=i*2);let x=-y/2,b=-v/2,T=m.rectangle(x-n,b-n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0),y+2*n,v+2*n+(p?n*2:s.members.length===0&&s.methods.length===0?-n:0),g),S=l.insert(()=>T,":first-child");S.attr("class","basic label-container");let w=S.node().getBBox();l.selectAll(".text").each((R,I,L)=>{let E=qe(L[I]),D=E.attr("transform"),_=0;if(D){let B=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(D);B&&(_=parseFloat(B[2]))}let O=_+b+n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0);a||(O-=4);let M=x;(E.attr("class").includes("label-group")||E.attr("class").includes("annotation-group"))&&(M=-E.node()?.getBBox().width/2||0,l.selectAll("text").each(function(P,B,F){window.getComputedStyle(F[B]).textAnchor==="middle"&&(M=0)})),E.attr("transform",`translate(${M}, ${O})`)});let k=l.select(".annotation-group").node().getBBox().height-(p?n/2:0)||0,A=l.select(".label-group").node().getBBox().height-(p?n/2:0)||0,C=l.select(".members-group").node().getBBox().height-(p?n/2:0)||0;if(s.members.length>0||s.methods.length>0||p){let R=m.line(w.x,k+A+b+n,w.x+w.width,k+A+b+n,g);l.insert(()=>R).attr("class","divider").attr("style",d)}if(p||s.members.length>0||s.methods.length>0){let R=m.line(w.x,k+A+C+b+i*2+n,w.x+w.width,k+A+C+b+n+i*2,g);l.insert(()=>R).attr("class","divider").attr("style",d)}if(s.look!=="handDrawn"&&l.selectAll("path").attr("style",d),S.select(":nth-child(2)").attr("style",d),l.selectAll(".divider").select("path").attr("style",d),e.labelStyle?l.selectAll("span").attr("style",e.labelStyle):l.selectAll("span").attr("style",d),!a){let R=RegExp(/color\s*:\s*([^;]*)/),I=R.exec(d);if(I){let L=I[0].replace("color","fill");l.selectAll("tspan").attr("style",L)}else if(h){let L=R.exec(h);if(L){let E=L[0].replace("color","fill");l.selectAll("tspan").attr("style",E)}}}return Qe(e,S),e.intersect=function(R){return Xe.rect(e,R)},l}var kte=N(()=>{"use strict";It();Xt();yr();Ht();$t();Ut();Tte();gr();o(wte,"classBox")});async function Ete(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let i=e,a=e,s=20,l=20,u="verifyMethod"in e,h=st(e),f=t.insert("g").attr("class",h).attr("id",e.domId??e.id),d;u?d=await Ou(f,`<<${i.type}>>`,0,e.labelStyle):d=await Ou(f,"<<Element>>",0,e.labelStyle);let p=d,m=await Ou(f,i.name,p,e.labelStyle+"; font-weight: bold;");if(p+=m+l,u){let k=await Ou(f,`${i.requirementId?`ID: ${i.requirementId}`:""}`,p,e.labelStyle);p+=k;let A=await Ou(f,`${i.text?`Text: ${i.text}`:""}`,p,e.labelStyle);p+=A;let C=await Ou(f,`${i.risk?`Risk: ${i.risk}`:""}`,p,e.labelStyle);p+=C,await Ou(f,`${i.verifyMethod?`Verification: ${i.verifyMethod}`:""}`,p,e.labelStyle)}else{let k=await Ou(f,`${a.type?`Type: ${a.type}`:""}`,p,e.labelStyle);p+=k,await Ou(f,`${a.docRef?`Doc Ref: ${a.docRef}`:""}`,p,e.labelStyle)}let g=(f.node()?.getBBox().width??200)+s,y=(f.node()?.getBBox().height??200)+s,v=-g/2,x=-y/2,b=Ze.svg(f),T=Je(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let S=b.rectangle(v,x,g,y,T),w=f.insert(()=>S,":first-child");if(w.attr("class","basic label-container").attr("style",n),f.selectAll(".label").each((k,A,C)=>{let R=qe(C[A]),I=R.attr("transform"),L=0,E=0;if(I){let M=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(I);M&&(L=parseFloat(M[1]),E=parseFloat(M[2]))}let D=E-y/2,_=v+s/2;(A===0||A===1)&&(_=L),R.attr("transform",`translate(${_}, ${D+s})`)}),p>d+m+l){let k=b.line(v,x+d+m+l,v+g,x+d+m+l,T);f.insert(()=>k).attr("style",n)}return Qe(e,w),e.intersect=function(k){return Xe.rect(e,k)},f}async function Ou(t,e,r,n=""){if(e==="")return 0;let i=t.insert("g").attr("class","label").attr("style",n),a=ge(),s=a.htmlLabels??!0,l=await di(i,iv(Ji(e)),{width:Zi(e,a)+50,classes:"markdown-node-label",useHtmlLabels:s,style:n},a),u;if(s){let h=l.children[0],f=qe(l);u=h.getBoundingClientRect(),f.attr("width",u.width),f.attr("height",u.height)}else{let h=l.children[0];for(let f of h.children)f.textContent=f.textContent.replaceAll(">",">").replaceAll("<","<"),n&&f.setAttribute("style",n);u=l.getBBox(),u.height+=6}return i.attr("transform",`translate(${-u.width/2},${-u.height/2+r})`),u.height}var Ste=N(()=>{"use strict";It();Ut();$t();Ht();tr();Xt();zo();yr();o(Ete,"requirementBox");o(Ou,"addText")});async function Cte(t,e,{config:r}){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n||"";let a=10,s=e.width;e.width=(e.width??200)-10;let{shapeSvg:l,bbox:u,label:h}=await ut(t,e,st(e)),f=e.padding||10,d="",p;"ticket"in e&&e.ticket&&r?.kanban?.ticketBaseUrl&&(d=r?.kanban?.ticketBaseUrl.replace("#TICKET#",e.ticket),p=l.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",d).attr("target","_blank"));let m={useHtmlLabels:e.useHtmlLabels,labelStyle:e.labelStyle||"",width:e.width,img:e.img,padding:e.padding||8,centerLabel:!1},g,y;p?{label:g,bbox:y}=await YT(p,"ticket"in e&&e.ticket||"",m):{label:g,bbox:y}=await YT(l,"ticket"in e&&e.ticket||"",m);let{label:v,bbox:x}=await YT(l,"assigned"in e&&e.assigned||"",m);e.width=s;let b=10,T=e?.width||0,S=Math.max(y.height,x.height)/2,w=Math.max(u.height+b*2,e?.height||0)+S,k=-T/2,A=-w/2;h.attr("transform","translate("+(f-T/2)+", "+(-S-u.height/2)+")"),g.attr("transform","translate("+(f-T/2)+", "+(-S+u.height/2)+")"),v.attr("transform","translate("+(f+T/2-x.width-2*a)+", "+(-S+u.height/2)+")");let C,{rx:R,ry:I}=e,{cssStyles:L}=e;if(e.look==="handDrawn"){let E=Ze.svg(l),D=Je(e,{}),_=R||I?E.path(Fs(k,A,T,w,R||0),D):E.rectangle(k,A,T,w,D);C=l.insert(()=>_,":first-child"),C.attr("class","basic label-container").attr("style",L||null)}else{C=l.insert("rect",":first-child"),C.attr("class","basic label-container __APA__").attr("style",i).attr("rx",R??5).attr("ry",I??5).attr("x",k).attr("y",A).attr("width",T).attr("height",w);let E="priority"in e&&e.priority;if(E){let D=l.append("line"),_=k+2,O=A+Math.floor((R??0)/2),M=A+w-Math.floor((R??0)/2);D.attr("x1",_).attr("y1",O).attr("x2",_).attr("y2",M).attr("stroke-width","4").attr("stroke",kRe(E))}}return Qe(e,C),e.height=w,e.intersect=function(E){return Xe.rect(e,E)},l}var kRe,Ate=N(()=>{"use strict";It();Ut();Zd();$t();Ht();kRe=o(t=>{switch(t){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");o(Cte,"kanbanItem")});async function _te(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s,label:l}=await ut(t,e,st(e)),u=a.width+10*s,h=a.height+8*s,f=.15*u,{cssStyles:d}=e,p=a.width+20,m=a.height+20,g=Math.max(u,p),y=Math.max(h,m);l.attr("transform",`translate(${-a.width/2}, ${-a.height/2})`);let v,x=`M0 0 + a${f},${f} 1 0,0 ${g*.25},${-1*y*.1} + a${f},${f} 1 0,0 ${g*.25},0 + a${f},${f} 1 0,0 ${g*.25},0 + a${f},${f} 1 0,0 ${g*.25},${y*.1} + + a${f},${f} 1 0,0 ${g*.15},${y*.33} + a${f*.8},${f*.8} 1 0,0 0,${y*.34} + a${f},${f} 1 0,0 ${-1*g*.15},${y*.33} + + a${f},${f} 1 0,0 ${-1*g*.25},${y*.15} + a${f},${f} 1 0,0 ${-1*g*.25},0 + a${f},${f} 1 0,0 ${-1*g*.25},0 + a${f},${f} 1 0,0 ${-1*g*.25},${-1*y*.15} + + a${f},${f} 1 0,0 ${-1*g*.1},${-1*y*.33} + a${f*.8},${f*.8} 1 0,0 0,${-1*y*.34} + a${f},${f} 1 0,0 ${g*.1},${-1*y*.33} + H0 V0 Z`;if(e.look==="handDrawn"){let b=Ze.svg(i),T=Je(e,{}),S=b.path(x,T);v=i.insert(()=>S,":first-child"),v.attr("class","basic label-container").attr("style",Cn(d))}else v=i.insert("path",":first-child").attr("class","basic label-container").attr("style",n).attr("d",x);return v.attr("transform",`translate(${-g/2}, ${-y/2})`),Qe(e,v),e.calcIntersect=function(b,T){return Xe.rect(b,T)},e.intersect=function(b){return X.info("Bang intersect",e,b),Xe.rect(e,b)},i}var Dte=N(()=>{"use strict";pt();It();Ut();$t();Ht();tr();o(_te,"bang")});async function Lte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s,label:l}=await ut(t,e,st(e)),u=a.width+2*s,h=a.height+2*s,f=.15*u,d=.25*u,p=.35*u,m=.2*u,{cssStyles:g}=e,y,v=`M0 0 + a${f},${f} 0 0,1 ${u*.25},${-1*u*.1} + a${p},${p} 1 0,1 ${u*.4},${-1*u*.1} + a${d},${d} 1 0,1 ${u*.35},${u*.2} + + a${f},${f} 1 0,1 ${u*.15},${h*.35} + a${m},${m} 1 0,1 ${-1*u*.15},${h*.65} + + a${d},${f} 1 0,1 ${-1*u*.25},${u*.15} + a${p},${p} 1 0,1 ${-1*u*.5},0 + a${f},${f} 1 0,1 ${-1*u*.25},${-1*u*.15} + + a${f},${f} 1 0,1 ${-1*u*.1},${-1*h*.35} + a${m},${m} 1 0,1 ${u*.1},${-1*h*.65} + H0 V0 Z`;if(e.look==="handDrawn"){let x=Ze.svg(i),b=Je(e,{}),T=x.path(v,b);y=i.insert(()=>T,":first-child"),y.attr("class","basic label-container").attr("style",Cn(g))}else y=i.insert("path",":first-child").attr("class","basic label-container").attr("style",n).attr("d",v);return l.attr("transform",`translate(${-a.width/2}, ${-a.height/2})`),y.attr("transform",`translate(${-u/2}, ${-h/2})`),Qe(e,y),e.calcIntersect=function(x,b){return Xe.rect(x,b)},e.intersect=function(x){return X.info("Cloud intersect",e,x),Xe.rect(e,x)},i}var Rte=N(()=>{"use strict";Ht();pt();tr();Ut();$t();It();o(Lte,"cloud")});async function Nte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s,label:l}=await ut(t,e,st(e)),u=a.width+8*s,h=a.height+2*s,f=5,d=` + M${-u/2} ${h/2-f} + v${-h+2*f} + q0,-${f} ${f},-${f} + h${u-2*f} + q${f},0 ${f},${f} + v${h-2*f} + q0,${f} -${f},${f} + h${-u+2*f} + q-${f},0 -${f},-${f} + Z + `,p=i.append("path").attr("id","node-"+e.id).attr("class","node-bkg node-"+e.type).attr("style",n).attr("d",d);return i.append("line").attr("class","node-line-").attr("x1",-u/2).attr("y1",h/2).attr("x2",u/2).attr("y2",h/2),l.attr("transform",`translate(${-a.width/2}, ${-a.height/2})`),i.append(()=>l.node()),Qe(e,p),e.calcIntersect=function(m,g){return Xe.rect(m,g)},e.intersect=function(m){return Xe.rect(e,m)},i}var Mte=N(()=>{"use strict";Ut();$t();It();o(Nte,"defaultMindmapNode")});async function Ite(t,e){let r={padding:e.padding??0};return iw(t,e,r)}var Ote=N(()=>{"use strict";U9();o(Ite,"mindmapCircle")});function Pte(t){return t in q9}var ERe,SRe,q9,W9=N(()=>{"use strict";yJ();bJ();wJ();EJ();U9();CJ();_J();LJ();NJ();IJ();PJ();FJ();zJ();VJ();HJ();WJ();XJ();KJ();ZJ();eee();ree();iee();see();lee();uee();fee();pee();gee();vee();bee();wee();Eee();Cee();_ee();Lee();Nee();Iee();Pee();Fee();zee();Vee();Hee();Wee();Xee();Kee();Zee();ete();rte();ite();ste();lte();ute();fte();pte();gte();vte();xte();kte();Ste();Ate();Dte();Rte();Mte();Ote();ERe=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:Gee},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:Oee},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:Uee},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:Qee},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:OJ},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:iw},{semanticName:"Bang",name:"Bang",shortName:"bang",description:"Bang",aliases:["bang"],handler:_te},{semanticName:"Cloud",name:"Cloud",shortName:"cloud",description:"cloud",aliases:["cloud"],handler:Lte},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:Dee},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:jJ},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:mee},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:dee},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:ote},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:cee},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:$J},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:nte},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:TJ},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:Bee},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:jee},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:Yee},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:qJ},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:QJ},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:AJ},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:DJ},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:RJ},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:yee},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:dte},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:YJ},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:ate},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:xee},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:MJ},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:BJ},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:hte},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:yte},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:GJ},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:cte},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:UJ},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:$ee},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:See},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:kee},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:xJ},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:SJ},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:tte},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:Jee},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:mte},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:Ree},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:Tee}],SRe=o(()=>{let e=[...Object.entries({state:qee,choice:kJ,note:Aee,rectWithTitle:Mee,labelRect:hee,iconSquare:aee,iconCircle:tee,icon:JJ,iconRounded:nee,imageSquare:oee,anchor:gJ,kanbanItem:Cte,mindmapCircle:Ite,defaultMindmapNode:Nte,classBox:wte,erBox:H9,requirementBox:Ete}),...ERe.flatMap(r=>[r.shortName,..."aliases"in r?r.aliases:[],..."internalAliases"in r?r.internalAliases:[]].map(i=>[i,r.handler]))];return Object.fromEntries(e)},"generateShapeMap"),q9=SRe();o(Pte,"isValidShape")});var CRe,lw,Bte=N(()=>{"use strict";yr();w2();Xt();pt();W9();tr();gr();ci();CRe="flowchart-",lw=class{constructor(){this.vertexCounter=0;this.config=ge();this.vertices=new Map;this.edges=[];this.classes=new Map;this.subGraphs=[];this.subGraphLookup=new Map;this.tooltips=new Map;this.subCount=0;this.firstGraphFlag=!0;this.secCount=-1;this.posCrossRef=[];this.funs=[];this.setAccTitle=Rr;this.setAccDescription=Ir;this.setDiagramTitle=$r;this.getAccTitle=Mr;this.getAccDescription=Or;this.getDiagramTitle=Pr;this.funs.push(this.setupToolTips.bind(this)),this.addVertex=this.addVertex.bind(this),this.firstGraph=this.firstGraph.bind(this),this.setDirection=this.setDirection.bind(this),this.addSubGraph=this.addSubGraph.bind(this),this.addLink=this.addLink.bind(this),this.setLink=this.setLink.bind(this),this.updateLink=this.updateLink.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.destructLink=this.destructLink.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setTooltip=this.setTooltip.bind(this),this.updateLinkInterpolate=this.updateLinkInterpolate.bind(this),this.setClickFun=this.setClickFun.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.lex={firstGraph:this.firstGraph.bind(this)},this.clear(),this.setGen("gen-2")}static{o(this,"FlowDB")}sanitizeText(e){return tt.sanitizeText(e,this.config)}lookUpDomId(e){for(let r of this.vertices.values())if(r.id===e)return r.domId;return e}addVertex(e,r,n,i,a,s,l={},u){if(!e||e.trim().length===0)return;let h;if(u!==void 0){let m;u.includes(` +`)?m=u+` +`:m=`{ +`+u+` +}`,h=Kh(m,{schema:jh})}let f=this.edges.find(m=>m.id===e);if(f){let m=h;m?.animate!==void 0&&(f.animate=m.animate),m?.animation!==void 0&&(f.animation=m.animation),m?.curve!==void 0&&(f.interpolate=m.curve);return}let d,p=this.vertices.get(e);if(p===void 0&&(p={id:e,labelType:"text",domId:CRe+e+"-"+this.vertexCounter,styles:[],classes:[]},this.vertices.set(e,p)),this.vertexCounter++,r!==void 0?(this.config=ge(),d=this.sanitizeText(r.text.trim()),p.labelType=r.type,d.startsWith('"')&&d.endsWith('"')&&(d=d.substring(1,d.length-1)),p.text=d):p.text===void 0&&(p.text=e),n!==void 0&&(p.type=n),i?.forEach(m=>{p.styles.push(m)}),a?.forEach(m=>{p.classes.push(m)}),s!==void 0&&(p.dir=s),p.props===void 0?p.props=l:l!==void 0&&Object.assign(p.props,l),h!==void 0){if(h.shape){if(h.shape!==h.shape.toLowerCase()||h.shape.includes("_"))throw new Error(`No such shape: ${h.shape}. Shape names should be lowercase.`);if(!Pte(h.shape))throw new Error(`No such shape: ${h.shape}.`);p.type=h?.shape}h?.label&&(p.text=h?.label),h?.icon&&(p.icon=h?.icon,!h.label?.trim()&&p.text===e&&(p.text="")),h?.form&&(p.form=h?.form),h?.pos&&(p.pos=h?.pos),h?.img&&(p.img=h?.img,!h.label?.trim()&&p.text===e&&(p.text="")),h?.constraint&&(p.constraint=h.constraint),h.w&&(p.assetWidth=Number(h.w)),h.h&&(p.assetHeight=Number(h.h))}}addSingleLink(e,r,n,i){let l={start:e,end:r,type:void 0,text:"",labelType:"text",classes:[],isUserDefinedId:!1,interpolate:this.edges.defaultInterpolate};X.info("abc78 Got edge...",l);let u=n.text;if(u!==void 0&&(l.text=this.sanitizeText(u.text.trim()),l.text.startsWith('"')&&l.text.endsWith('"')&&(l.text=l.text.substring(1,l.text.length-1)),l.labelType=u.type),n!==void 0&&(l.type=n.type,l.stroke=n.stroke,l.length=n.length>10?10:n.length),i&&!this.edges.some(h=>h.id===i))l.id=i,l.isUserDefinedId=!0;else{let h=this.edges.filter(f=>f.start===l.start&&f.end===l.end);h.length===0?l.id=xc(l.start,l.end,{counter:0,prefix:"L"}):l.id=xc(l.start,l.end,{counter:h.length+1,prefix:"L"})}if(this.edges.length<(this.config.maxEdges??500))X.info("Pushing edge..."),this.edges.push(l);else throw new Error(`Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}. + +Initialize mermaid with maxEdges set to a higher number to allow more edges. +You cannot set this config via configuration inside the diagram as it is a secure config. +You have to call mermaid.initialize.`)}isLinkData(e){return e!==null&&typeof e=="object"&&"id"in e&&typeof e.id=="string"}addLink(e,r,n){let i=this.isLinkData(n)?n.id.replace("@",""):void 0;X.info("addLink",e,r,i);for(let a of e)for(let s of r){let l=a===e[e.length-1],u=s===r[0];l&&u?this.addSingleLink(a,s,n,i):this.addSingleLink(a,s,n,void 0)}}updateLinkInterpolate(e,r){e.forEach(n=>{n==="default"?this.edges.defaultInterpolate=r:this.edges[n].interpolate=r})}updateLink(e,r){e.forEach(n=>{if(typeof n=="number"&&n>=this.edges.length)throw new Error(`The index ${n} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${this.edges.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);n==="default"?this.edges.defaultStyle=r:(this.edges[n].style=r,(this.edges[n]?.style?.length??0)>0&&!this.edges[n]?.style?.some(i=>i?.startsWith("fill"))&&this.edges[n]?.style?.push("fill:none"))})}addClass(e,r){let n=r.join().replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");e.split(",").forEach(i=>{let a=this.classes.get(i);a===void 0&&(a={id:i,styles:[],textStyles:[]},this.classes.set(i,a)),n?.forEach(s=>{if(/color/.exec(s)){let l=s.replace("fill","bgFill");a.textStyles.push(l)}a.styles.push(s)})})}setDirection(e){this.direction=e.trim(),/.*/.exec(this.direction)&&(this.direction="LR"),/.*v/.exec(this.direction)&&(this.direction="TB"),this.direction==="TD"&&(this.direction="TB")}setClass(e,r){for(let n of e.split(",")){let i=this.vertices.get(n);i&&i.classes.push(r);let a=this.edges.find(l=>l.id===n);a&&a.classes.push(r);let s=this.subGraphLookup.get(n);s&&s.classes.push(r)}}setTooltip(e,r){if(r!==void 0){r=this.sanitizeText(r);for(let n of e.split(","))this.tooltips.set(this.version==="gen-1"?this.lookUpDomId(n):n,r)}}setClickFun(e,r,n){let i=this.lookUpDomId(e);if(ge().securityLevel!=="loose"||r===void 0)return;let a=[];if(typeof n=="string"){a=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let l=0;l{let l=document.querySelector(`[id="${i}"]`);l!==null&&l.addEventListener("click",()=>{qt.runFunc(r,...a)},!1)}))}setLink(e,r,n){e.split(",").forEach(i=>{let a=this.vertices.get(i);a!==void 0&&(a.link=qt.formatUrl(r,this.config),a.linkTarget=n)}),this.setClass(e,"clickable")}getTooltip(e){return this.tooltips.get(e)}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFun(i,r,n)}),this.setClass(e,"clickable")}bindFunctions(e){this.funs.forEach(r=>{r(e)})}getDirection(){return this.direction?.trim()}getVertices(){return this.vertices}getEdges(){return this.edges}getClasses(){return this.classes}setupToolTips(e){let r=qe(".mermaidTooltip");(r._groups||r)[0][0]===null&&(r=qe("body").append("div").attr("class","mermaidTooltip").style("opacity",0)),qe(e).select("svg").selectAll("g.node").on("mouseover",a=>{let s=qe(a.currentTarget);if(s.attr("title")===null)return;let u=a.currentTarget?.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.text(s.attr("title")).style("left",window.scrollX+u.left+(u.right-u.left)/2+"px").style("top",window.scrollY+u.bottom+"px"),r.html(r.html().replace(/<br\/>/g,"
    ")),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),qe(a.currentTarget).classed("hover",!1)})}clear(e="gen-2"){this.vertices=new Map,this.classes=new Map,this.edges=[],this.funs=[this.setupToolTips.bind(this)],this.subGraphs=[],this.subGraphLookup=new Map,this.subCount=0,this.tooltips=new Map,this.firstGraphFlag=!0,this.version=e,this.config=ge(),Sr()}setGen(e){this.version=e||"gen-2"}defaultStyle(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"}addSubGraph(e,r,n){let i=e.text.trim(),a=n.text;e===n&&/\s/.exec(n.text)&&(i=void 0);let l=o(p=>{let m={boolean:{},number:{},string:{}},g=[],y;return{nodeList:p.filter(function(x){let b=typeof x;return x.stmt&&x.stmt==="dir"?(y=x.value,!1):x.trim()===""?!1:b in m?m[b].hasOwnProperty(x)?!1:m[b][x]=!0:g.includes(x)?!1:g.push(x)}),dir:y}},"uniq")(r.flat()),u=l.nodeList,h=l.dir,f=ge().flowchart??{};if(h=h??(f.inheritDir?this.getDirection()??ge().direction??void 0:void 0),this.version==="gen-1")for(let p=0;p2e3)return{result:!1,count:0};if(this.posCrossRef[this.secCount]=r,this.subGraphs[r].id===e)return{result:!0,count:0};let i=0,a=1;for(;i=0){let l=this.indexNodes2(e,s);if(l.result)return{result:!0,count:a+l.count};a=a+l.count}i=i+1}return{result:!1,count:a}}getDepthFirstPos(e){return this.posCrossRef[e]}indexNodes(){this.secCount=-1,this.subGraphs.length>0&&this.indexNodes2("none",this.subGraphs.length-1)}getSubGraphs(){return this.subGraphs}firstGraph(){return this.firstGraphFlag?(this.firstGraphFlag=!1,!0):!1}destructStartLink(e){let r=e.trim(),n="arrow_open";switch(r[0]){case"<":n="arrow_point",r=r.slice(1);break;case"x":n="arrow_cross",r=r.slice(1);break;case"o":n="arrow_circle",r=r.slice(1);break}let i="normal";return r.includes("=")&&(i="thick"),r.includes(".")&&(i="dotted"),{type:n,stroke:i}}countChar(e,r){let n=r.length,i=0;for(let a=0;a":i="arrow_point",r.startsWith("<")&&(i="double_"+i,n=n.slice(1));break;case"o":i="arrow_circle",r.startsWith("o")&&(i="double_"+i,n=n.slice(1));break}let a="normal",s=n.length-1;n.startsWith("=")&&(a="thick"),n.startsWith("~")&&(a="invisible");let l=this.countChar(".",n);return l&&(a="dotted",s=l),{type:i,stroke:a,length:s}}destructLink(e,r){let n=this.destructEndLink(e),i;if(r){if(i=this.destructStartLink(r),i.stroke!==n.stroke)return{type:"INVALID",stroke:"INVALID"};if(i.type==="arrow_open")i.type=n.type;else{if(i.type!==n.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return i.type==="double_arrow"&&(i.type="double_arrow_point"),i.length=n.length,i}return n}exists(e,r){for(let n of e)if(n.nodes.includes(r))return!0;return!1}makeUniq(e,r){let n=[];return e.nodes.forEach((i,a)=>{this.exists(r,i)||n.push(e.nodes[a])}),{nodes:n}}getTypeFromVertex(e){if(e.img)return"imageSquare";if(e.icon)return e.form==="circle"?"iconCircle":e.form==="square"?"iconSquare":e.form==="rounded"?"iconRounded":"icon";switch(e.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return e.type}}findNode(e,r){return e.find(n=>n.id===r)}destructEdgeType(e){let r="none",n="arrow_point";switch(e){case"arrow_point":case"arrow_circle":case"arrow_cross":n=e;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":r=e.replace("double_",""),n=r;break}return{arrowTypeStart:r,arrowTypeEnd:n}}addNodeFromVertex(e,r,n,i,a,s){let l=n.get(e.id),u=i.get(e.id)??!1,h=this.findNode(r,e.id);if(h)h.cssStyles=e.styles,h.cssCompiledStyles=this.getCompiledStyles(e.classes),h.cssClasses=e.classes.join(" ");else{let f={id:e.id,label:e.text,labelStyle:"",parentId:l,padding:a.flowchart?.padding||8,cssStyles:e.styles,cssCompiledStyles:this.getCompiledStyles(["default","node",...e.classes]),cssClasses:"default "+e.classes.join(" "),dir:e.dir,domId:e.domId,look:s,link:e.link,linkTarget:e.linkTarget,tooltip:this.getTooltip(e.id),icon:e.icon,pos:e.pos,img:e.img,assetWidth:e.assetWidth,assetHeight:e.assetHeight,constraint:e.constraint};u?r.push({...f,isGroup:!0,shape:"rect"}):r.push({...f,isGroup:!1,shape:this.getTypeFromVertex(e)})}}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}getData(){let e=ge(),r=[],n=[],i=this.getSubGraphs(),a=new Map,s=new Map;for(let h=i.length-1;h>=0;h--){let f=i[h];f.nodes.length>0&&s.set(f.id,!0);for(let d of f.nodes)a.set(d,f.id)}for(let h=i.length-1;h>=0;h--){let f=i[h];r.push({id:f.id,label:f.title,labelStyle:"",parentId:a.get(f.id),padding:8,cssCompiledStyles:this.getCompiledStyles(f.classes),cssClasses:f.classes.join(" "),shape:"rect",dir:f.dir,isGroup:!0,look:e.look})}this.getVertices().forEach(h=>{this.addNodeFromVertex(h,r,a,s,e,e.look||"classic")});let u=this.getEdges();return u.forEach((h,f)=>{let{arrowTypeStart:d,arrowTypeEnd:p}=this.destructEdgeType(h.type),m=[...u.defaultStyle??[]];h.style&&m.push(...h.style);let g={id:xc(h.start,h.end,{counter:f,prefix:"L"},h.id),isUserDefinedId:h.isUserDefinedId,start:h.start,end:h.end,type:h.type??"normal",label:h.text,labelpos:"c",thickness:h.stroke,minlen:h.length,classes:h?.stroke==="invisible"?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":d,arrowTypeEnd:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":p,arrowheadStyle:"fill: #333",cssCompiledStyles:this.getCompiledStyles(h.classes),labelStyle:m,style:m,pattern:h.stroke,look:e.look,animate:h.animate,animation:h.animation,curve:h.interpolate||this.edges.defaultInterpolate||e.flowchart?.curve};n.push(g)}),{nodes:r,edges:n,other:{},config:e}}defaultConfig(){return G3.flowchart}}});var Vo,ep=N(()=>{"use strict";yr();Vo=o((t,e)=>{let r;return e==="sandbox"&&(r=qe("#i"+t)),(e==="sandbox"?qe(r.nodes()[0].contentDocument.body):qe("body")).select(`[id="${t}"]`)},"getDiagramElement")});var Pu,O2=N(()=>{"use strict";Pu=o(({flowchart:t})=>{let e=t?.subGraphTitleMargin?.top??0,r=t?.subGraphTitleMargin?.bottom??0,n=e+r;return{subGraphTitleTopMargin:e,subGraphTitleBottomMargin:r,subGraphTitleTotalMargin:n}},"getSubGraphTitleMargins")});var Fte,ARe,_Re,DRe,LRe,RRe,NRe,$te,Sm,zte,cw=N(()=>{"use strict";Xt();gr();pt();O2();yr();Ht();zo();S9();aw();Zd();$t();Fte=o(async(t,e)=>{X.info("Creating subgraph rect for ",e.id,e);let r=ge(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=je(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=vr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await di(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0}),y=g.getBBox();if(vr(r.flowchart.htmlLabels)){let A=g.children[0],C=qe(g);y=A.getBoundingClientRect(),C.attr("width",y.width),C.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,T=e.y-x/2;X.trace("Data ",e,JSON.stringify(e));let S;if(e.look==="handDrawn"){let A=Ze.svg(d),C=Je(e,{roughness:.7,fill:a,stroke:s,fillWeight:3,seed:i}),R=A.path(Fs(b,T,v,x,0),C);S=d.insert(()=>(X.debug("Rough node insert CXC",R),R),":first-child"),S.select("path:nth-child(2)").attr("style",h.join(";")),S.select("path").attr("style",f.join(";").replace("fill","stroke"))}else S=d.insert("rect",":first-child"),S.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",T).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:w}=Pu(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+w})`),l){let A=m.select("span");A&&A.attr("style",l)}let k=S.node().getBBox();return e.offsetX=0,e.width=k.width,e.height=k.height,e.offsetY=y.height-e.padding/2,e.intersect=function(A){return Qh(e,A)},{cluster:d,labelBBox:y}},"rect"),ARe=o((t,e)=>{let r=t.insert("g").attr("class","note-cluster").attr("id",e.id),n=r.insert("rect",":first-child"),i=0*e.padding,a=i/2;n.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+i).attr("height",e.height+i).attr("fill","none");let s=n.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(l){return Qh(e,l)},{cluster:r,labelBBox:{width:0,height:0}}},"noteGroup"),_Re=o(async(t,e)=>{let r=ge(),{themeVariables:n,handDrawnSeed:i}=r,{altBackground:a,compositeBackground:s,compositeTitleBackground:l,nodeBorder:u}=n,h=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-id",e.id).attr("data-look",e.look),f=h.insert("g",":first-child"),d=h.insert("g").attr("class","cluster-label"),p=h.append("rect"),m=d.node().appendChild(await kc(e.label,e.labelStyle,void 0,!0)),g=m.getBBox();if(vr(r.flowchart.htmlLabels)){let R=m.children[0],I=qe(m);g=R.getBoundingClientRect(),I.attr("width",g.width),I.attr("height",g.height)}let y=0*e.padding,v=y/2,x=(e.width<=g.width+e.padding?g.width+e.padding:e.width)+y;e.width<=g.width+e.padding?e.diff=(x-e.width)/2-e.padding:e.diff=-e.padding;let b=e.height+y,T=e.height+y-g.height-6,S=e.x-x/2,w=e.y-b/2;e.width=x;let k=e.y-e.height/2-v+g.height+2,A;if(e.look==="handDrawn"){let R=e.cssClasses.includes("statediagram-cluster-alt"),I=Ze.svg(h),L=e.rx||e.ry?I.path(Fs(S,w,x,b,10),{roughness:.7,fill:l,fillStyle:"solid",stroke:u,seed:i}):I.rectangle(S,w,x,b,{seed:i});A=h.insert(()=>L,":first-child");let E=I.rectangle(S,k,x,T,{fill:R?a:s,fillStyle:R?"hachure":"solid",stroke:u,seed:i});A=h.insert(()=>L,":first-child"),p=h.insert(()=>E)}else A=f.insert("rect",":first-child"),A.attr("class","outer").attr("x",S).attr("y",w).attr("width",x).attr("height",b).attr("data-look",e.look),p.attr("class","inner").attr("x",S).attr("y",k).attr("width",x).attr("height",T);d.attr("transform",`translate(${e.x-g.width/2}, ${w+1-(vr(r.flowchart.htmlLabels)?0:3)})`);let C=A.node().getBBox();return e.height=C.height,e.offsetX=0,e.offsetY=g.height-e.padding/2,e.labelBBox=g,e.intersect=function(R){return Qh(e,R)},{cluster:h,labelBBox:g}},"roundedWithTitle"),DRe=o(async(t,e)=>{X.info("Creating subgraph rect for ",e.id,e);let r=ge(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=je(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=vr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await di(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0,width:e.width}),y=g.getBBox();if(vr(r.flowchart.htmlLabels)){let A=g.children[0],C=qe(g);y=A.getBoundingClientRect(),C.attr("width",y.width),C.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,T=e.y-x/2;X.trace("Data ",e,JSON.stringify(e));let S;if(e.look==="handDrawn"){let A=Ze.svg(d),C=Je(e,{roughness:.7,fill:a,stroke:s,fillWeight:4,seed:i}),R=A.path(Fs(b,T,v,x,e.rx),C);S=d.insert(()=>(X.debug("Rough node insert CXC",R),R),":first-child"),S.select("path:nth-child(2)").attr("style",h.join(";")),S.select("path").attr("style",f.join(";").replace("fill","stroke"))}else S=d.insert("rect",":first-child"),S.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",T).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:w}=Pu(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+w})`),l){let A=m.select("span");A&&A.attr("style",l)}let k=S.node().getBBox();return e.offsetX=0,e.width=k.width,e.height=k.height,e.offsetY=y.height-e.padding/2,e.intersect=function(A){return Qh(e,A)},{cluster:d,labelBBox:y}},"kanbanSection"),LRe=o((t,e)=>{let r=ge(),{themeVariables:n,handDrawnSeed:i}=r,{nodeBorder:a}=n,s=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-look",e.look),l=s.insert("g",":first-child"),u=0*e.padding,h=e.width+u;e.diff=-e.padding;let f=e.height+u,d=e.x-h/2,p=e.y-f/2;e.width=h;let m;if(e.look==="handDrawn"){let v=Ze.svg(s).rectangle(d,p,h,f,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:a,seed:i});m=s.insert(()=>v,":first-child")}else m=l.insert("rect",":first-child"),m.attr("class","divider").attr("x",d).attr("y",p).attr("width",h).attr("height",f).attr("data-look",e.look);let g=m.node().getBBox();return e.height=g.height,e.offsetX=0,e.offsetY=0,e.intersect=function(y){return Qh(e,y)},{cluster:s,labelBBox:{}}},"divider"),RRe=Fte,NRe={rect:Fte,squareRect:RRe,roundedWithTitle:_Re,noteGroup:ARe,divider:LRe,kanbanSection:DRe},$te=new Map,Sm=o(async(t,e)=>{let r=e.shape||"rect",n=await NRe[r](t,e);return $te.set(e.id,n),n},"insertCluster"),zte=o(()=>{$te=new Map},"clear")});function uw(t,e){if(t===void 0||e===void 0)return{angle:0,deltaX:0,deltaY:0};t=Xn(t),e=Xn(e);let[r,n]=[t.x,t.y],[i,a]=[e.x,e.y],s=i-r,l=a-n;return{angle:Math.atan(l/s),deltaX:s,deltaY:l}}var fa,Y9,Xn,hw,X9=N(()=>{"use strict";fa={aggregation:17.25,extension:17.25,composition:17.25,dependency:6,lollipop:13.5,arrow_point:4},Y9={arrow_point:9,arrow_cross:12.5,arrow_circle:12.5};o(uw,"calculateDeltaAndAngle");Xn=o(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),hw=o(t=>({x:o(function(e,r,n){let i=0,a=Xn(n[0]).x=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(fa,t.arrowTypeEnd)){let{angle:m,deltaX:g}=uw(n[n.length-1],n[n.length-2]);i=fa[t.arrowTypeEnd]*Math.cos(m)*(g>=0?1:-1)}let s=Math.abs(Xn(e).x-Xn(n[n.length-1]).x),l=Math.abs(Xn(e).y-Xn(n[n.length-1]).y),u=Math.abs(Xn(e).x-Xn(n[0]).x),h=Math.abs(Xn(e).y-Xn(n[0]).y),f=fa[t.arrowTypeStart],d=fa[t.arrowTypeEnd],p=1;if(s0&&l0&&h=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(fa,t.arrowTypeEnd)){let{angle:m,deltaY:g}=uw(n[n.length-1],n[n.length-2]);i=fa[t.arrowTypeEnd]*Math.abs(Math.sin(m))*(g>=0?1:-1)}let s=Math.abs(Xn(e).y-Xn(n[n.length-1]).y),l=Math.abs(Xn(e).x-Xn(n[n.length-1]).x),u=Math.abs(Xn(e).y-Xn(n[0]).y),h=Math.abs(Xn(e).x-Xn(n[0]).x),f=fa[t.arrowTypeStart],d=fa[t.arrowTypeEnd],p=1;if(s0&&l0&&h{"use strict";pt();Vte=o((t,e,r,n,i,a)=>{e.arrowTypeStart&&Gte(t,"start",e.arrowTypeStart,r,n,i,a),e.arrowTypeEnd&&Gte(t,"end",e.arrowTypeEnd,r,n,i,a)},"addEdgeMarkers"),MRe={arrow_cross:{type:"cross",fill:!1},arrow_point:{type:"point",fill:!0},arrow_barb:{type:"barb",fill:!0},arrow_circle:{type:"circle",fill:!1},aggregation:{type:"aggregation",fill:!1},extension:{type:"extension",fill:!1},composition:{type:"composition",fill:!0},dependency:{type:"dependency",fill:!0},lollipop:{type:"lollipop",fill:!1},only_one:{type:"onlyOne",fill:!1},zero_or_one:{type:"zeroOrOne",fill:!1},one_or_more:{type:"oneOrMore",fill:!1},zero_or_more:{type:"zeroOrMore",fill:!1},requirement_arrow:{type:"requirement_arrow",fill:!1},requirement_contains:{type:"requirement_contains",fill:!1}},Gte=o((t,e,r,n,i,a,s)=>{let l=MRe[r];if(!l){X.warn(`Unknown arrow type: ${r}`);return}let u=l.type,f=`${i}_${a}-${u}${e==="start"?"Start":"End"}`;if(s&&s.trim()!==""){let d=s.replace(/[^\dA-Za-z]/g,"_"),p=`${f}_${d}`;if(!document.getElementById(p)){let m=document.getElementById(f);if(m){let g=m.cloneNode(!0);g.id=p,g.querySelectorAll("path, circle, line").forEach(v=>{v.setAttribute("stroke",s),l.fill&&v.setAttribute("fill",s)}),m.parentNode?.appendChild(g)}}t.attr(`marker-${e}`,`url(${n}#${p})`)}else t.attr(`marker-${e}`,`url(${n}#${f})`)},"addEdgeMarker")});function dw(t,e){ge().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}function PRe(t){let e=[],r=[];for(let n=1;n5&&Math.abs(a.y-i.y)>5||i.y===a.y&&a.x===s.x&&Math.abs(a.x-i.x)>5&&Math.abs(a.y-s.y)>5)&&(e.push(a),r.push(n))}return{cornerPoints:e,cornerPointPositions:r}}function $Re(t,e){if(t.length<2)return"";let r="",n=t.length,i=1e-5;for(let a=0;a({...i}));if(t.length>=2&&fa[e.arrowTypeStart]){let i=fa[e.arrowTypeStart],a=t[0],s=t[1],{angle:l}=Wte(a,s),u=i*Math.cos(l),h=i*Math.sin(l);r[0].x=a.x+u,r[0].y=a.y+h}let n=t.length;if(n>=2&&fa[e.arrowTypeEnd]){let i=fa[e.arrowTypeEnd],a=t[n-1],s=t[n-2],{angle:l}=Wte(s,a),u=i*Math.cos(l),h=i*Math.sin(l);r[n-1].x=a.x-u,r[n-1].y=a.y-h}return r}var pw,da,Yte,fw,mw,gw,IRe,ORe,Hte,qte,BRe,FRe,yw,j9=N(()=>{"use strict";Xt();gr();pt();zo();tr();X9();O2();yr();Ht();aw();Ute();$t();pw=new Map,da=new Map,Yte=o(()=>{pw.clear(),da.clear()},"clear"),fw=o(t=>t?t.reduce((r,n)=>r+";"+n,""):"","getLabelStyles"),mw=o(async(t,e)=>{let r=vr(ge().flowchart.htmlLabels),{labelStyles:n}=je(e);e.labelStyle=n;let i=await di(t,e.label,{style:e.labelStyle,useHtmlLabels:r,addSvgBackground:!0,isNode:!1});X.info("abc82",e,e.labelType);let a=t.insert("g").attr("class","edgeLabel"),s=a.insert("g").attr("class","label").attr("data-id",e.id);s.node().appendChild(i);let l=i.getBBox();if(r){let h=i.children[0],f=qe(i);l=h.getBoundingClientRect(),f.attr("width",l.width),f.attr("height",l.height)}s.attr("transform","translate("+-l.width/2+", "+-l.height/2+")"),pw.set(e.id,a),e.width=l.width,e.height=l.height;let u;if(e.startLabelLeft){let h=await kc(e.startLabelLeft,fw(e.labelStyle)),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),da.get(e.id)||da.set(e.id,{}),da.get(e.id).startLeft=f,dw(u,e.startLabelLeft)}if(e.startLabelRight){let h=await kc(e.startLabelRight,fw(e.labelStyle)),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=f.node().appendChild(h),d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),da.get(e.id)||da.set(e.id,{}),da.get(e.id).startRight=f,dw(u,e.startLabelRight)}if(e.endLabelLeft){let h=await kc(e.endLabelLeft,fw(e.labelStyle)),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),da.get(e.id)||da.set(e.id,{}),da.get(e.id).endLeft=f,dw(u,e.endLabelLeft)}if(e.endLabelRight){let h=await kc(e.endLabelRight,fw(e.labelStyle)),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),da.get(e.id)||da.set(e.id,{}),da.get(e.id).endRight=f,dw(u,e.endLabelRight)}return i},"insertEdgeLabel");o(dw,"setTerminalWidth");gw=o((t,e)=>{X.debug("Moving label abc88 ",t.id,t.label,pw.get(t.id),e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=ge(),{subGraphTitleTotalMargin:i}=Pu(n);if(t.label){let a=pw.get(t.id),s=t.x,l=t.y;if(r){let u=qt.calcLabelPosition(r);X.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=da.get(t.id).startLeft,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=da.get(t.id).startRight,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=da.get(t.id).endLeft,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=da.get(t.id).endRight,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),IRe=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),ORe=o((t,e,r)=>{X.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(e)} + insidePoint : ${JSON.stringify(r)} + node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{X.warn("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(X.info("abc88 checking point",a,e),!IRe(e,a)&&!i){let s=ORe(e,n,a);X.debug("abc88 inside",a,n,s),X.debug("abc88 intersection",s,e);let l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)?X.warn("abc88 no intersect",s,r):r.push(s),i=!0}else X.warn("abc88 outside",a,n),n=a,i||r.push(a)}),X.debug("returning points",r),r},"cutPathAtIntersect");o(PRe,"extractCornerPoints");qte=o(function(t,e,r){let n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),s=r/a;return{x:e.x-s*n,y:e.y-s*i}},"findAdjacentPoint"),BRe=o(function(t){let{cornerPointPositions:e}=PRe(t),r=[];for(let n=0;n10&&Math.abs(a.y-i.y)>=10){X.debug("Corner point fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));let m=5;s.x===l.x?p={x:h<0?l.x-m+d:l.x+m-d,y:f<0?l.y-d:l.y+d}:p={x:h<0?l.x-d:l.x+d,y:f<0?l.y-m+d:l.y+m-d}}else X.debug("Corner point skipping fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));r.push(p,u)}else r.push(t[n]);return r},"fixCorners"),FRe=o((t,e,r)=>{let n=t-e-r,i=2,a=2,s=i+a,l=Math.floor(n/s),u=Array(l).fill(`${i} ${a}`).join(" ");return`0 ${e} ${u} ${r}`},"generateDashArray"),yw=o(function(t,e,r,n,i,a,s,l=!1){let{handDrawnSeed:u}=ge(),h=e.points,f=!1,d=i;var p=a;let m=[];for(let _ in e.cssCompiledStyles)_2(_)||m.push(e.cssCompiledStyles[_]);X.debug("UIO intersect check",e.points,p.x,d.x),p.intersect&&d.intersect&&!l&&(h=h.slice(1,e.points.length-1),h.unshift(d.intersect(h[0])),X.debug("Last point UIO",e.start,"-->",e.end,h[h.length-1],p,p.intersect(h[h.length-1])),h.push(p.intersect(h[h.length-1])));let g=btoa(JSON.stringify(h));e.toCluster&&(X.info("to cluster abc88",r.get(e.toCluster)),h=Hte(e.points,r.get(e.toCluster).node),f=!0),e.fromCluster&&(X.debug("from cluster abc88",r.get(e.fromCluster),JSON.stringify(h,null,2)),h=Hte(h.reverse(),r.get(e.fromCluster).node).reverse(),f=!0);let y=h.filter(_=>!Number.isNaN(_.y));y=BRe(y);let v=No;switch(v=Cu,e.curve){case"linear":v=Cu;break;case"basis":v=No;break;case"cardinal":v=Yv;break;case"bumpX":v=Vv;break;case"bumpY":v=Uv;break;case"catmullRom":v=Kv;break;case"monotoneX":v=Qv;break;case"monotoneY":v=Zv;break;case"natural":v=J0;break;case"step":v=em;break;case"stepAfter":v=e2;break;case"stepBefore":v=Jv;break;default:v=No}let{x,y:b}=hw(e),T=Cl().x(x).y(b).curve(v),S;switch(e.thickness){case"normal":S="edge-thickness-normal";break;case"thick":S="edge-thickness-thick";break;case"invisible":S="edge-thickness-invisible";break;default:S="edge-thickness-normal"}switch(e.pattern){case"solid":S+=" edge-pattern-solid";break;case"dotted":S+=" edge-pattern-dotted";break;case"dashed":S+=" edge-pattern-dashed";break;default:S+=" edge-pattern-solid"}let w,k=e.curve==="rounded"?$Re(zRe(y,e),5):T(y),A=Array.isArray(e.style)?e.style:[e.style],C=A.find(_=>_?.startsWith("stroke:")),R=!1;if(e.look==="handDrawn"){let _=Ze.svg(t);Object.assign([],y);let O=_.path(k,{roughness:.3,seed:u});S+=" transition",w=qe(O).select("path").attr("id",e.id).attr("class"," "+S+(e.classes?" "+e.classes:"")).attr("style",A?A.reduce((P,B)=>P+";"+B,""):"");let M=w.attr("d");w.attr("d",M),t.node().appendChild(w.node())}else{let _=m.join(";"),O=A?A.reduce((U,j)=>U+j+";",""):"",M="";e.animate&&(M=" edge-animation-fast"),e.animation&&(M=" edge-animation-"+e.animation);let P=(_?_+";"+O+";":O)+";"+(A?A.reduce((U,j)=>U+";"+j,""):"");w=t.append("path").attr("d",k).attr("id",e.id).attr("class"," "+S+(e.classes?" "+e.classes:"")+(M??"")).attr("style",P),C=P.match(/stroke:([^;]+)/)?.[1],R=e.animate===!0||!!e.animation||_.includes("animation");let B=w.node(),F=typeof B.getTotalLength=="function"?B.getTotalLength():0,G=Y9[e.arrowTypeStart]||0,$=Y9[e.arrowTypeEnd]||0;if(e.look==="neo"&&!R){let j=`stroke-dasharray: ${e.pattern==="dotted"||e.pattern==="dashed"?FRe(F,G,$):`0 ${G} ${F-G-$} ${$}`}; stroke-dashoffset: 0;`;w.attr("style",j+w.attr("style"))}}w.attr("data-edge",!0),w.attr("data-et","edge"),w.attr("data-id",e.id),w.attr("data-points",g),e.showPoints&&y.forEach(_=>{t.append("circle").style("stroke","red").style("fill","red").attr("r",1).attr("cx",_.x).attr("cy",_.y)});let I="";(ge().flowchart.arrowMarkerAbsolute||ge().state.arrowMarkerAbsolute)&&(I=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,I=I.replace(/\(/g,"\\(").replace(/\)/g,"\\)")),X.info("arrowTypeStart",e.arrowTypeStart),X.info("arrowTypeEnd",e.arrowTypeEnd),Vte(w,e,I,s,n,C);let L=Math.floor(h.length/2),E=h[L];qt.isLabelCoordinateInPath(E,w.attr("d"))||(f=!0);let D={};return f&&(D.updatedPath=h),D.originalPath=e.points,D},"insertEdge");o($Re,"generateRoundedPath");o(Wte,"calculateDeltaAndAngle");o(zRe,"applyMarkerOffsetsToPoints")});var GRe,VRe,URe,HRe,qRe,WRe,YRe,XRe,jRe,KRe,QRe,ZRe,JRe,eNe,tNe,rNe,nNe,vw,K9=N(()=>{"use strict";pt();GRe=o((t,e,r,n)=>{e.forEach(i=>{nNe[i](t,r,n)})},"insertMarkers"),VRe=o((t,e,r)=>{X.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),URe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),HRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),qRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),WRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),YRe=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),XRe=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),jRe=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),KRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),QRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneStart").attr("class","marker onlyOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneEnd").attr("class","marker onlyOne "+e).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M3,0 L3,18 M9,0 L9,18")},"only_one"),ZRe=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneStart").attr("class","marker zeroOrOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("d","M9,0 L9,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneEnd").attr("class","marker zeroOrOne "+e).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),i.append("path").attr("d","M21,0 L21,18")},"zero_or_one"),JRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreStart").attr("class","marker oneOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreEnd").attr("class","marker oneOrMore "+e).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18")},"one_or_more"),eNe=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreStart").attr("class","marker zeroOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreEnd").attr("class","marker zeroOrMore "+e).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),i.append("path").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"zero_or_more"),tNe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_arrowEnd").attr("refX",20).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("path").attr("d",`M0,0 + L20,10 + M20,10 + L0,20`)},"requirement_arrow"),rNe=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_containsStart").attr("refX",0).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("g");n.append("circle").attr("cx",10).attr("cy",10).attr("r",9).attr("fill","none"),n.append("line").attr("x1",1).attr("x2",19).attr("y1",10).attr("y2",10),n.append("line").attr("y1",1).attr("y2",19).attr("x1",10).attr("x2",10)},"requirement_contains"),nNe={extension:VRe,composition:URe,aggregation:HRe,dependency:qRe,lollipop:WRe,point:YRe,circle:XRe,cross:jRe,barb:KRe,only_one:QRe,zero_or_one:ZRe,one_or_more:JRe,zero_or_more:eNe,requirement_arrow:tNe,requirement_contains:rNe},vw=GRe});async function Cm(t,e,r){let n,i;e.shape==="rect"&&(e.rx&&e.ry?e.shape="roundedRect":e.shape="squareRect");let a=e.shape?q9[e.shape]:void 0;if(!a)throw new Error(`No such shape: ${e.shape}. Please check your syntax.`);if(e.link){let s;r.config.securityLevel==="sandbox"?s="_top":e.linkTarget&&(s=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",s??null),i=await a(n,e,r)}else i=await a(t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),xw.set(e.id,n),e.haveCallback&&n.attr("class",n.attr("class")+" clickable"),n}var xw,Xte,jte,P2,bw=N(()=>{"use strict";pt();W9();xw=new Map;o(Cm,"insertNode");Xte=o((t,e)=>{xw.set(e.id,t)},"setNodeElem"),jte=o(()=>{xw.clear()},"clear"),P2=o(t=>{let e=xw.get(t.id);X.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});var Kte,Qte=N(()=>{"use strict";qn();gr();pt();cw();j9();K9();bw();It();tr();Kte={common:tt,getConfig:Qt,insertCluster:Sm,insertEdge:yw,insertEdgeLabel:mw,insertMarkers:vw,insertNode:Cm,interpolateToCurve:FL,labelHelper:ut,log:X,positionEdgeLabel:gw}});function aNe(t){return typeof t=="symbol"||ai(t)&&ha(t)==iNe}var iNe,uo,tp=N(()=>{"use strict";_u();Oo();iNe="[object Symbol]";o(aNe,"isSymbol");uo=aNe});function sNe(t,e){for(var r=-1,n=t==null?0:t.length,i=Array(n);++r{"use strict";o(sNe,"arrayMap");$s=sNe});function ere(t){if(typeof t=="string")return t;if(Bt(t))return $s(t,ere)+"";if(uo(t))return Jte?Jte.call(t):"";var e=t+"";return e=="0"&&1/t==-oNe?"-0":e}var oNe,Zte,Jte,tre,rre=N(()=>{"use strict";$d();rp();Yn();tp();oNe=1/0,Zte=Ki?Ki.prototype:void 0,Jte=Zte?Zte.toString:void 0;o(ere,"baseToString");tre=ere});function cNe(t){for(var e=t.length;e--&&lNe.test(t.charAt(e)););return e}var lNe,nre,ire=N(()=>{"use strict";lNe=/\s/;o(cNe,"trimmedEndIndex");nre=cNe});function hNe(t){return t&&t.slice(0,nre(t)+1).replace(uNe,"")}var uNe,are,sre=N(()=>{"use strict";ire();uNe=/^\s+/;o(hNe,"baseTrim");are=hNe});function gNe(t){if(typeof t=="number")return t;if(uo(t))return ore;if(Sn(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Sn(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=are(t);var r=dNe.test(t);return r||pNe.test(t)?mNe(t.slice(2),r?2:8):fNe.test(t)?ore:+t}var ore,fNe,dNe,pNe,mNe,lre,cre=N(()=>{"use strict";sre();oo();tp();ore=NaN,fNe=/^[-+]0x[0-9a-f]+$/i,dNe=/^0b[01]+$/i,pNe=/^0o[0-7]+$/i,mNe=parseInt;o(gNe,"toNumber");lre=gNe});function vNe(t){if(!t)return t===0?t:0;if(t=lre(t),t===ure||t===-ure){var e=t<0?-1:1;return e*yNe}return t===t?t:0}var ure,yNe,Am,Q9=N(()=>{"use strict";cre();ure=1/0,yNe=17976931348623157e292;o(vNe,"toFinite");Am=vNe});function xNe(t){var e=Am(t),r=e%1;return e===e?r?e-r:e:0}var Ec,_m=N(()=>{"use strict";Q9();o(xNe,"toInteger");Ec=xNe});var bNe,Tw,hre=N(()=>{"use strict";Fh();Mo();bNe=Ls(hi,"WeakMap"),Tw=bNe});function TNe(){}var si,Z9=N(()=>{"use strict";o(TNe,"noop");si=TNe});function wNe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(wNe,"arrayEach");ww=wNe});function kNe(t,e,r,n){for(var i=t.length,a=r+(n?1:-1);n?a--:++a{"use strict";o(kNe,"baseFindIndex");kw=kNe});function ENe(t){return t!==t}var fre,dre=N(()=>{"use strict";o(ENe,"baseIsNaN");fre=ENe});function SNe(t,e,r){for(var n=r-1,i=t.length;++n{"use strict";o(SNe,"strictIndexOf");pre=SNe});function CNe(t,e,r){return e===e?pre(t,e,r):kw(t,fre,r)}var Dm,Ew=N(()=>{"use strict";eR();dre();mre();o(CNe,"baseIndexOf");Dm=CNe});function ANe(t,e){var r=t==null?0:t.length;return!!r&&Dm(t,e,0)>-1}var Sw,tR=N(()=>{"use strict";Ew();o(ANe,"arrayIncludes");Sw=ANe});var _Ne,gre,yre=N(()=>{"use strict";SL();_Ne=xT(Object.keys,Object),gre=_Ne});function RNe(t){if(!mc(t))return gre(t);var e=[];for(var r in Object(t))LNe.call(t,r)&&r!="constructor"&&e.push(r);return e}var DNe,LNe,Lm,Cw=N(()=>{"use strict";dm();yre();DNe=Object.prototype,LNe=DNe.hasOwnProperty;o(RNe,"baseKeys");Lm=RNe});function NNe(t){return fi(t)?ET(t):Lm(t)}var qr,Sc=N(()=>{"use strict";LL();Cw();Po();o(NNe,"keys");qr=NNe});var MNe,INe,ONe,pa,vre=N(()=>{"use strict";ym();Hd();IL();Po();dm();Sc();MNe=Object.prototype,INe=MNe.hasOwnProperty,ONe=AT(function(t,e){if(mc(e)||fi(e)){$o(e,qr(e),t);return}for(var r in e)INe.call(e,r)&&gc(t,r,e[r])}),pa=ONe});function FNe(t,e){if(Bt(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||uo(t)?!0:BNe.test(t)||!PNe.test(t)||e!=null&&t in Object(e)}var PNe,BNe,Rm,Aw=N(()=>{"use strict";Yn();tp();PNe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,BNe=/^\w*$/;o(FNe,"isKey");Rm=FNe});function zNe(t){var e=am(t,function(n){return r.size===$Ne&&r.clear(),n}),r=e.cache;return e}var $Ne,xre,bre=N(()=>{"use strict";vL();$Ne=500;o(zNe,"memoizeCapped");xre=zNe});var GNe,VNe,UNe,Tre,wre=N(()=>{"use strict";bre();GNe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,VNe=/\\(\\)?/g,UNe=xre(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(GNe,function(r,n,i,a){e.push(i?a.replace(VNe,"$1"):n||r)}),e}),Tre=UNe});function HNe(t){return t==null?"":tre(t)}var _w,rR=N(()=>{"use strict";rre();o(HNe,"toString");_w=HNe});function qNe(t,e){return Bt(t)?t:Rm(t,e)?[t]:Tre(_w(t))}var rf,B2=N(()=>{"use strict";Yn();Aw();wre();rR();o(qNe,"castPath");rf=qNe});function YNe(t){if(typeof t=="string"||uo(t))return t;var e=t+"";return e=="0"&&1/t==-WNe?"-0":e}var WNe,Cc,Nm=N(()=>{"use strict";tp();WNe=1/0;o(YNe,"toKey");Cc=YNe});function XNe(t,e){e=rf(e,t);for(var r=0,n=e.length;t!=null&&r{"use strict";B2();Nm();o(XNe,"baseGet");nf=XNe});function jNe(t,e,r){var n=t==null?void 0:nf(t,e);return n===void 0?r:n}var kre,Ere=N(()=>{"use strict";F2();o(jNe,"get");kre=jNe});function KNe(t,e){for(var r=-1,n=e.length,i=t.length;++r{"use strict";o(KNe,"arrayPush");Mm=KNe});function QNe(t){return Bt(t)||_l(t)||!!(Sre&&t&&t[Sre])}var Sre,Cre,Are=N(()=>{"use strict";$d();pm();Yn();Sre=Ki?Ki.isConcatSpreadable:void 0;o(QNe,"isFlattenable");Cre=QNe});function _re(t,e,r,n,i){var a=-1,s=t.length;for(r||(r=Cre),i||(i=[]);++a0&&r(l)?e>1?_re(l,e-1,r,n,i):Mm(i,l):n||(i[i.length]=l)}return i}var Ac,Im=N(()=>{"use strict";Dw();Are();o(_re,"baseFlatten");Ac=_re});function ZNe(t){var e=t==null?0:t.length;return e?Ac(t,1):[]}var Qr,Lw=N(()=>{"use strict";Im();o(ZNe,"flatten");Qr=ZNe});function JNe(t){return CT(ST(t,void 0,Qr),t+"")}var Dre,Lre=N(()=>{"use strict";Lw();RL();ML();o(JNe,"flatRest");Dre=JNe});function eMe(t,e,r){var n=-1,i=t.length;e<0&&(e=-e>i?0:i+e),r=r>i?i:r,r<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var a=Array(i);++n{"use strict";o(eMe,"baseSlice");Rw=eMe});function cMe(t){return lMe.test(t)}var tMe,rMe,nMe,iMe,aMe,sMe,oMe,lMe,Rre,Nre=N(()=>{"use strict";tMe="\\ud800-\\udfff",rMe="\\u0300-\\u036f",nMe="\\ufe20-\\ufe2f",iMe="\\u20d0-\\u20ff",aMe=rMe+nMe+iMe,sMe="\\ufe0e\\ufe0f",oMe="\\u200d",lMe=RegExp("["+oMe+tMe+aMe+sMe+"]");o(cMe,"hasUnicode");Rre=cMe});function uMe(t,e,r,n){var i=-1,a=t==null?0:t.length;for(n&&a&&(r=t[++i]);++i{"use strict";o(uMe,"arrayReduce");Mre=uMe});function hMe(t,e){return t&&$o(e,qr(e),t)}var Ore,Pre=N(()=>{"use strict";Hd();Sc();o(hMe,"baseAssign");Ore=hMe});function fMe(t,e){return t&&$o(e,Rs(e),t)}var Bre,Fre=N(()=>{"use strict";Hd();qh();o(fMe,"baseAssignIn");Bre=fMe});function dMe(t,e){for(var r=-1,n=t==null?0:t.length,i=0,a=[];++r{"use strict";o(dMe,"arrayFilter");Om=dMe});function pMe(){return[]}var Mw,iR=N(()=>{"use strict";o(pMe,"stubArray");Mw=pMe});var mMe,gMe,$re,yMe,Pm,Iw=N(()=>{"use strict";Nw();iR();mMe=Object.prototype,gMe=mMe.propertyIsEnumerable,$re=Object.getOwnPropertySymbols,yMe=$re?function(t){return t==null?[]:(t=Object(t),Om($re(t),function(e){return gMe.call(t,e)}))}:Mw,Pm=yMe});function vMe(t,e){return $o(t,Pm(t),e)}var zre,Gre=N(()=>{"use strict";Hd();Iw();o(vMe,"copySymbols");zre=vMe});var xMe,bMe,Ow,aR=N(()=>{"use strict";Dw();bT();Iw();iR();xMe=Object.getOwnPropertySymbols,bMe=xMe?function(t){for(var e=[];t;)Mm(e,Pm(t)),t=fm(t);return e}:Mw,Ow=bMe});function TMe(t,e){return $o(t,Ow(t),e)}var Vre,Ure=N(()=>{"use strict";Hd();aR();o(TMe,"copySymbolsIn");Vre=TMe});function wMe(t,e,r){var n=e(t);return Bt(t)?n:Mm(n,r(t))}var Pw,sR=N(()=>{"use strict";Dw();Yn();o(wMe,"baseGetAllKeys");Pw=wMe});function kMe(t){return Pw(t,qr,Pm)}var $2,oR=N(()=>{"use strict";sR();Iw();Sc();o(kMe,"getAllKeys");$2=kMe});function EMe(t){return Pw(t,Rs,Ow)}var Bw,lR=N(()=>{"use strict";sR();aR();qh();o(EMe,"getAllKeysIn");Bw=EMe});var SMe,Fw,Hre=N(()=>{"use strict";Fh();Mo();SMe=Ls(hi,"DataView"),Fw=SMe});var CMe,$w,qre=N(()=>{"use strict";Fh();Mo();CMe=Ls(hi,"Promise"),$w=CMe});var AMe,af,cR=N(()=>{"use strict";Fh();Mo();AMe=Ls(hi,"Set"),af=AMe});var Wre,_Me,Yre,Xre,jre,Kre,DMe,LMe,RMe,NMe,MMe,np,ho,ip=N(()=>{"use strict";Hre();fT();qre();cR();hre();_u();mL();Wre="[object Map]",_Me="[object Object]",Yre="[object Promise]",Xre="[object Set]",jre="[object WeakMap]",Kre="[object DataView]",DMe=Du(Fw),LMe=Du(Gh),RMe=Du($w),NMe=Du(af),MMe=Du(Tw),np=ha;(Fw&&np(new Fw(new ArrayBuffer(1)))!=Kre||Gh&&np(new Gh)!=Wre||$w&&np($w.resolve())!=Yre||af&&np(new af)!=Xre||Tw&&np(new Tw)!=jre)&&(np=o(function(t){var e=ha(t),r=e==_Me?t.constructor:void 0,n=r?Du(r):"";if(n)switch(n){case DMe:return Kre;case LMe:return Wre;case RMe:return Yre;case NMe:return Xre;case MMe:return jre}return e},"getTag"));ho=np});function PMe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&OMe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}var IMe,OMe,Qre,Zre=N(()=>{"use strict";IMe=Object.prototype,OMe=IMe.hasOwnProperty;o(PMe,"initCloneArray");Qre=PMe});function BMe(t,e){var r=e?hm(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}var Jre,ene=N(()=>{"use strict";gT();o(BMe,"cloneDataView");Jre=BMe});function $Me(t){var e=new t.constructor(t.source,FMe.exec(t));return e.lastIndex=t.lastIndex,e}var FMe,tne,rne=N(()=>{"use strict";FMe=/\w*$/;o($Me,"cloneRegExp");tne=$Me});function zMe(t){return ine?Object(ine.call(t)):{}}var nne,ine,ane,sne=N(()=>{"use strict";$d();nne=Ki?Ki.prototype:void 0,ine=nne?nne.valueOf:void 0;o(zMe,"cloneSymbol");ane=zMe});function sIe(t,e,r){var n=t.constructor;switch(e){case jMe:return hm(t);case GMe:case VMe:return new n(+t);case KMe:return Jre(t,r);case QMe:case ZMe:case JMe:case eIe:case tIe:case rIe:case nIe:case iIe:case aIe:return yT(t,r);case UMe:return new n;case HMe:case YMe:return new n(t);case qMe:return tne(t);case WMe:return new n;case XMe:return ane(t)}}var GMe,VMe,UMe,HMe,qMe,WMe,YMe,XMe,jMe,KMe,QMe,ZMe,JMe,eIe,tIe,rIe,nIe,iIe,aIe,one,lne=N(()=>{"use strict";gT();ene();rne();sne();kL();GMe="[object Boolean]",VMe="[object Date]",UMe="[object Map]",HMe="[object Number]",qMe="[object RegExp]",WMe="[object Set]",YMe="[object String]",XMe="[object Symbol]",jMe="[object ArrayBuffer]",KMe="[object DataView]",QMe="[object Float32Array]",ZMe="[object Float64Array]",JMe="[object Int8Array]",eIe="[object Int16Array]",tIe="[object Int32Array]",rIe="[object Uint8Array]",nIe="[object Uint8ClampedArray]",iIe="[object Uint16Array]",aIe="[object Uint32Array]";o(sIe,"initCloneByTag");one=sIe});function lIe(t){return ai(t)&&ho(t)==oIe}var oIe,cne,une=N(()=>{"use strict";ip();Oo();oIe="[object Map]";o(lIe,"baseIsMap");cne=lIe});var hne,cIe,fne,dne=N(()=>{"use strict";une();Ud();f2();hne=Fo&&Fo.isMap,cIe=hne?Bo(hne):cne,fne=cIe});function hIe(t){return ai(t)&&ho(t)==uIe}var uIe,pne,mne=N(()=>{"use strict";ip();Oo();uIe="[object Set]";o(hIe,"baseIsSet");pne=hIe});var gne,fIe,yne,vne=N(()=>{"use strict";mne();Ud();f2();gne=Fo&&Fo.isSet,fIe=gne?Bo(gne):pne,yne=fIe});function zw(t,e,r,n,i,a){var s,l=e&dIe,u=e&pIe,h=e&mIe;if(r&&(s=i?r(t,n,i,a):r(t)),s!==void 0)return s;if(!Sn(t))return t;var f=Bt(t);if(f){if(s=Qre(t),!l)return vT(t,s)}else{var d=ho(t),p=d==bne||d==bIe;if(Dl(t))return mT(t,l);if(d==Tne||d==xne||p&&!i){if(s=u||p?{}:TT(t),!l)return u?Vre(t,Bre(s,t)):zre(t,Ore(s,t))}else{if(!Mn[d])return i?t:{};s=one(t,d,l)}}a||(a=new dc);var m=a.get(t);if(m)return m;a.set(t,s),yne(t)?t.forEach(function(v){s.add(zw(v,e,r,v,t,a))}):fne(t)&&t.forEach(function(v,x){s.set(x,zw(v,e,r,x,t,a))});var g=h?u?Bw:$2:u?Rs:qr,y=f?void 0:g(t);return ww(y||t,function(v,x){y&&(x=v,v=t[x]),gc(s,x,zw(v,e,r,x,t,a))}),s}var dIe,pIe,mIe,xne,gIe,yIe,vIe,xIe,bne,bIe,TIe,wIe,Tne,kIe,EIe,SIe,CIe,AIe,_Ie,DIe,LIe,RIe,NIe,MIe,IIe,OIe,PIe,BIe,FIe,Mn,Gw,uR=N(()=>{"use strict";c2();J9();ym();Pre();Fre();TL();EL();Gre();Ure();oR();lR();ip();Zre();lne();CL();Yn();gm();dne();oo();vne();Sc();qh();dIe=1,pIe=2,mIe=4,xne="[object Arguments]",gIe="[object Array]",yIe="[object Boolean]",vIe="[object Date]",xIe="[object Error]",bne="[object Function]",bIe="[object GeneratorFunction]",TIe="[object Map]",wIe="[object Number]",Tne="[object Object]",kIe="[object RegExp]",EIe="[object Set]",SIe="[object String]",CIe="[object Symbol]",AIe="[object WeakMap]",_Ie="[object ArrayBuffer]",DIe="[object DataView]",LIe="[object Float32Array]",RIe="[object Float64Array]",NIe="[object Int8Array]",MIe="[object Int16Array]",IIe="[object Int32Array]",OIe="[object Uint8Array]",PIe="[object Uint8ClampedArray]",BIe="[object Uint16Array]",FIe="[object Uint32Array]",Mn={};Mn[xne]=Mn[gIe]=Mn[_Ie]=Mn[DIe]=Mn[yIe]=Mn[vIe]=Mn[LIe]=Mn[RIe]=Mn[NIe]=Mn[MIe]=Mn[IIe]=Mn[TIe]=Mn[wIe]=Mn[Tne]=Mn[kIe]=Mn[EIe]=Mn[SIe]=Mn[CIe]=Mn[OIe]=Mn[PIe]=Mn[BIe]=Mn[FIe]=!0;Mn[xIe]=Mn[bne]=Mn[AIe]=!1;o(zw,"baseClone");Gw=zw});function zIe(t){return Gw(t,$Ie)}var $Ie,ln,hR=N(()=>{"use strict";uR();$Ie=4;o(zIe,"clone");ln=zIe});function UIe(t){return Gw(t,GIe|VIe)}var GIe,VIe,fR,wne=N(()=>{"use strict";uR();GIe=1,VIe=4;o(UIe,"cloneDeep");fR=UIe});function HIe(t){for(var e=-1,r=t==null?0:t.length,n=0,i=[];++e{"use strict";o(HIe,"compact");_c=HIe});function WIe(t){return this.__data__.set(t,qIe),this}var qIe,Ene,Sne=N(()=>{"use strict";qIe="__lodash_hash_undefined__";o(WIe,"setCacheAdd");Ene=WIe});function YIe(t){return this.__data__.has(t)}var Cne,Ane=N(()=>{"use strict";o(YIe,"setCacheHas");Cne=YIe});function Vw(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new Gd;++e{"use strict";dT();Sne();Ane();o(Vw,"SetCache");Vw.prototype.add=Vw.prototype.push=Ene;Vw.prototype.has=Cne;Bm=Vw});function XIe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(XIe,"arraySome");Hw=XIe});function jIe(t,e){return t.has(e)}var Fm,qw=N(()=>{"use strict";o(jIe,"cacheHas");Fm=jIe});function ZIe(t,e,r,n,i,a){var s=r&KIe,l=t.length,u=e.length;if(l!=u&&!(s&&u>l))return!1;var h=a.get(t),f=a.get(e);if(h&&f)return h==e&&f==t;var d=-1,p=!0,m=r&QIe?new Bm:void 0;for(a.set(t,e),a.set(e,t);++d{"use strict";Uw();dR();qw();KIe=1,QIe=2;o(ZIe,"equalArrays");Ww=ZIe});function JIe(t){var e=-1,r=Array(t.size);return t.forEach(function(n,i){r[++e]=[i,n]}),r}var _ne,Dne=N(()=>{"use strict";o(JIe,"mapToArray");_ne=JIe});function eOe(t){var e=-1,r=Array(t.size);return t.forEach(function(n){r[++e]=n}),r}var $m,Yw=N(()=>{"use strict";o(eOe,"setToArray");$m=eOe});function pOe(t,e,r,n,i,a,s){switch(r){case dOe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case fOe:return!(t.byteLength!=e.byteLength||!a(new um(t),new um(e)));case nOe:case iOe:case oOe:return Io(+t,+e);case aOe:return t.name==e.name&&t.message==e.message;case lOe:case uOe:return t==e+"";case sOe:var l=_ne;case cOe:var u=n&tOe;if(l||(l=$m),t.size!=e.size&&!u)return!1;var h=s.get(t);if(h)return h==e;n|=rOe,s.set(t,e);var f=Ww(l(t),l(e),n,i,a,s);return s.delete(t),f;case hOe:if(mR)return mR.call(t)==mR.call(e)}return!1}var tOe,rOe,nOe,iOe,aOe,sOe,oOe,lOe,cOe,uOe,hOe,fOe,dOe,Lne,mR,Rne,Nne=N(()=>{"use strict";$d();wL();zd();pR();Dne();Yw();tOe=1,rOe=2,nOe="[object Boolean]",iOe="[object Date]",aOe="[object Error]",sOe="[object Map]",oOe="[object Number]",lOe="[object RegExp]",cOe="[object Set]",uOe="[object String]",hOe="[object Symbol]",fOe="[object ArrayBuffer]",dOe="[object DataView]",Lne=Ki?Ki.prototype:void 0,mR=Lne?Lne.valueOf:void 0;o(pOe,"equalByTag");Rne=pOe});function vOe(t,e,r,n,i,a){var s=r&mOe,l=$2(t),u=l.length,h=$2(e),f=h.length;if(u!=f&&!s)return!1;for(var d=u;d--;){var p=l[d];if(!(s?p in e:yOe.call(e,p)))return!1}var m=a.get(t),g=a.get(e);if(m&&g)return m==e&&g==t;var y=!0;a.set(t,e),a.set(e,t);for(var v=s;++d{"use strict";oR();mOe=1,gOe=Object.prototype,yOe=gOe.hasOwnProperty;o(vOe,"equalObjects");Mne=vOe});function TOe(t,e,r,n,i,a){var s=Bt(t),l=Bt(e),u=s?Pne:ho(t),h=l?Pne:ho(e);u=u==One?Xw:u,h=h==One?Xw:h;var f=u==Xw,d=h==Xw,p=u==h;if(p&&Dl(t)){if(!Dl(e))return!1;s=!0,f=!1}if(p&&!f)return a||(a=new dc),s||Uh(t)?Ww(t,e,r,n,i,a):Rne(t,e,u,r,n,i,a);if(!(r&xOe)){var m=f&&Bne.call(t,"__wrapped__"),g=d&&Bne.call(e,"__wrapped__");if(m||g){var y=m?t.value():t,v=g?e.value():e;return a||(a=new dc),i(y,v,r,n,a)}}return p?(a||(a=new dc),Mne(t,e,r,n,i,a)):!1}var xOe,One,Pne,Xw,bOe,Bne,Fne,$ne=N(()=>{"use strict";c2();pR();Nne();Ine();ip();Yn();gm();d2();xOe=1,One="[object Arguments]",Pne="[object Array]",Xw="[object Object]",bOe=Object.prototype,Bne=bOe.hasOwnProperty;o(TOe,"baseIsEqualDeep");Fne=TOe});function zne(t,e,r,n,i){return t===e?!0:t==null||e==null||!ai(t)&&!ai(e)?t!==t&&e!==e:Fne(t,e,r,n,zne,i)}var jw,gR=N(()=>{"use strict";$ne();Oo();o(zne,"baseIsEqual");jw=zne});function EOe(t,e,r,n){var i=r.length,a=i,s=!n;if(t==null)return!a;for(t=Object(t);i--;){var l=r[i];if(s&&l[2]?l[1]!==t[l[0]]:!(l[0]in t))return!1}for(;++i{"use strict";c2();gR();wOe=1,kOe=2;o(EOe,"baseIsMatch");Gne=EOe});function SOe(t){return t===t&&!Sn(t)}var Kw,yR=N(()=>{"use strict";oo();o(SOe,"isStrictComparable");Kw=SOe});function COe(t){for(var e=qr(t),r=e.length;r--;){var n=e[r],i=t[n];e[r]=[n,i,Kw(i)]}return e}var Une,Hne=N(()=>{"use strict";yR();Sc();o(COe,"getMatchData");Une=COe});function AOe(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}var Qw,vR=N(()=>{"use strict";o(AOe,"matchesStrictComparable");Qw=AOe});function _Oe(t){var e=Une(t);return e.length==1&&e[0][2]?Qw(e[0][0],e[0][1]):function(r){return r===t||Gne(r,t,e)}}var qne,Wne=N(()=>{"use strict";Vne();Hne();vR();o(_Oe,"baseMatches");qne=_Oe});function DOe(t,e){return t!=null&&e in Object(t)}var Yne,Xne=N(()=>{"use strict";o(DOe,"baseHasIn");Yne=DOe});function LOe(t,e,r){e=rf(e,t);for(var n=-1,i=e.length,a=!1;++n{"use strict";B2();pm();Yn();m2();wT();Nm();o(LOe,"hasPath");Zw=LOe});function ROe(t,e){return t!=null&&Zw(t,e,Yne)}var Jw,bR=N(()=>{"use strict";Xne();xR();o(ROe,"hasIn");Jw=ROe});function IOe(t,e){return Rm(t)&&Kw(e)?Qw(Cc(t),e):function(r){var n=kre(r,t);return n===void 0&&n===e?Jw(r,t):jw(e,n,NOe|MOe)}}var NOe,MOe,jne,Kne=N(()=>{"use strict";gR();Ere();bR();Aw();yR();vR();Nm();NOe=1,MOe=2;o(IOe,"baseMatchesProperty");jne=IOe});function OOe(t){return function(e){return e?.[t]}}var ek,TR=N(()=>{"use strict";o(OOe,"baseProperty");ek=OOe});function POe(t){return function(e){return nf(e,t)}}var Qne,Zne=N(()=>{"use strict";F2();o(POe,"basePropertyDeep");Qne=POe});function BOe(t){return Rm(t)?ek(Cc(t)):Qne(t)}var Jne,eie=N(()=>{"use strict";TR();Zne();Aw();Nm();o(BOe,"property");Jne=BOe});function FOe(t){return typeof t=="function"?t:t==null?Qi:typeof t=="object"?Bt(t)?jne(t[0],t[1]):qne(t):Jne(t)}var vn,ss=N(()=>{"use strict";Wne();Kne();Ru();Yn();eie();o(FOe,"baseIteratee");vn=FOe});function $Oe(t,e,r,n){for(var i=-1,a=t==null?0:t.length;++i{"use strict";o($Oe,"arrayAggregator");tie=$Oe});function zOe(t,e){return t&&cm(t,e,qr)}var zm,tk=N(()=>{"use strict";pT();Sc();o(zOe,"baseForOwn");zm=zOe});function GOe(t,e){return function(r,n){if(r==null)return r;if(!fi(r))return t(r,n);for(var i=r.length,a=e?i:-1,s=Object(r);(e?a--:++a{"use strict";Po();o(GOe,"createBaseEach");nie=GOe});var VOe,zs,sf=N(()=>{"use strict";tk();iie();VOe=nie(zm),zs=VOe});function UOe(t,e,r,n){return zs(t,function(i,a,s){e(n,i,r(i),s)}),n}var aie,sie=N(()=>{"use strict";sf();o(UOe,"baseAggregator");aie=UOe});function HOe(t,e){return function(r,n){var i=Bt(r)?tie:aie,a=e?e():{};return i(r,t,vn(n,2),a)}}var oie,lie=N(()=>{"use strict";rie();sie();ss();Yn();o(HOe,"createAggregator");oie=HOe});var qOe,rk,cie=N(()=>{"use strict";Mo();qOe=o(function(){return hi.Date.now()},"now"),rk=qOe});var uie,WOe,YOe,of,hie=N(()=>{"use strict";vm();zd();qd();qh();uie=Object.prototype,WOe=uie.hasOwnProperty,YOe=yc(function(t,e){t=Object(t);var r=-1,n=e.length,i=n>2?e[2]:void 0;for(i&&lo(e[0],e[1],i)&&(n=1);++r{"use strict";o(XOe,"arrayIncludesWith");nk=XOe});function KOe(t,e,r,n){var i=-1,a=Sw,s=!0,l=t.length,u=[],h=e.length;if(!l)return u;r&&(e=$s(e,Bo(r))),n?(a=nk,s=!1):e.length>=jOe&&(a=Fm,s=!1,e=new Bm(e));e:for(;++i{"use strict";Uw();tR();wR();rp();Ud();qw();jOe=200;o(KOe,"baseDifference");fie=KOe});var QOe,lf,pie=N(()=>{"use strict";die();Im();vm();kT();QOe=yc(function(t,e){return Vd(t)?fie(t,Ac(e,1,Vd,!0)):[]}),lf=QOe});function ZOe(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var ma,mie=N(()=>{"use strict";o(ZOe,"last");ma=ZOe});function JOe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:Ec(e),Rw(t,e<0?0:e,n)):[]}var yi,gie=N(()=>{"use strict";nR();_m();o(JOe,"drop");yi=JOe});function ePe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:Ec(e),e=n-e,Rw(t,0,e<0?0:e)):[]}var Bu,yie=N(()=>{"use strict";nR();_m();o(ePe,"dropRight");Bu=ePe});function tPe(t){return typeof t=="function"?t:Qi}var Gm,ik=N(()=>{"use strict";Ru();o(tPe,"castFunction");Gm=tPe});function rPe(t,e){var r=Bt(t)?ww:zs;return r(t,Gm(e))}var Ae,ak=N(()=>{"use strict";J9();sf();ik();Yn();o(rPe,"forEach");Ae=rPe});var vie=N(()=>{"use strict";ak()});function nPe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(nPe,"arrayEvery");xie=nPe});function iPe(t,e){var r=!0;return zs(t,function(n,i,a){return r=!!e(n,i,a),r}),r}var Tie,wie=N(()=>{"use strict";sf();o(iPe,"baseEvery");Tie=iPe});function aPe(t,e,r){var n=Bt(t)?xie:Tie;return r&&lo(t,e,r)&&(e=void 0),n(t,vn(e,3))}var Pa,kie=N(()=>{"use strict";bie();wie();ss();Yn();qd();o(aPe,"every");Pa=aPe});function sPe(t,e){var r=[];return zs(t,function(n,i,a){e(n,i,a)&&r.push(n)}),r}var sk,kR=N(()=>{"use strict";sf();o(sPe,"baseFilter");sk=sPe});function oPe(t,e){var r=Bt(t)?Om:sk;return r(t,vn(e,3))}var Zr,ER=N(()=>{"use strict";Nw();kR();ss();Yn();o(oPe,"filter");Zr=oPe});function lPe(t){return function(e,r,n){var i=Object(e);if(!fi(e)){var a=vn(r,3);e=qr(e),r=o(function(l){return a(i[l],l,i)},"predicate")}var s=t(e,r,n);return s>-1?i[a?e[s]:s]:void 0}}var Eie,Sie=N(()=>{"use strict";ss();Po();Sc();o(lPe,"createFind");Eie=lPe});function uPe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:Ec(r);return i<0&&(i=cPe(n+i,0)),kw(t,vn(e,3),i)}var cPe,Cie,Aie=N(()=>{"use strict";eR();ss();_m();cPe=Math.max;o(uPe,"findIndex");Cie=uPe});var hPe,os,_ie=N(()=>{"use strict";Sie();Aie();hPe=Eie(Cie),os=hPe});function fPe(t){return t&&t.length?t[0]:void 0}var ea,Die=N(()=>{"use strict";o(fPe,"head");ea=fPe});var Lie=N(()=>{"use strict";Die()});function dPe(t,e){var r=-1,n=fi(t)?Array(t.length):[];return zs(t,function(i,a,s){n[++r]=e(i,a,s)}),n}var ok,SR=N(()=>{"use strict";sf();Po();o(dPe,"baseMap");ok=dPe});function pPe(t,e){var r=Bt(t)?$s:ok;return r(t,vn(e,3))}var rt,Vm=N(()=>{"use strict";rp();ss();SR();Yn();o(pPe,"map");rt=pPe});function mPe(t,e){return Ac(rt(t,e),1)}var ga,CR=N(()=>{"use strict";Im();Vm();o(mPe,"flatMap");ga=mPe});function gPe(t,e){return t==null?t:cm(t,Gm(e),Rs)}var AR,Rie=N(()=>{"use strict";pT();ik();qh();o(gPe,"forIn");AR=gPe});function yPe(t,e){return t&&zm(t,Gm(e))}var _R,Nie=N(()=>{"use strict";tk();ik();o(yPe,"forOwn");_R=yPe});var vPe,xPe,bPe,DR,Mie=N(()=>{"use strict";lm();lie();vPe=Object.prototype,xPe=vPe.hasOwnProperty,bPe=oie(function(t,e,r){xPe.call(t,r)?t[r].push(e):pc(t,r,[e])}),DR=bPe});function TPe(t,e){return t>e}var Iie,Oie=N(()=>{"use strict";o(TPe,"baseGt");Iie=TPe});function EPe(t,e){return t!=null&&kPe.call(t,e)}var wPe,kPe,Pie,Bie=N(()=>{"use strict";wPe=Object.prototype,kPe=wPe.hasOwnProperty;o(EPe,"baseHas");Pie=EPe});function SPe(t,e){return t!=null&&Zw(t,e,Pie)}var Ft,Fie=N(()=>{"use strict";Bie();xR();o(SPe,"has");Ft=SPe});function APe(t){return typeof t=="string"||!Bt(t)&&ai(t)&&ha(t)==CPe}var CPe,xi,lk=N(()=>{"use strict";_u();Yn();Oo();CPe="[object String]";o(APe,"isString");xi=APe});function _Pe(t,e){return $s(e,function(r){return t[r]})}var $ie,zie=N(()=>{"use strict";rp();o(_Pe,"baseValues");$ie=_Pe});function DPe(t){return t==null?[]:$ie(t,qr(t))}var kr,LR=N(()=>{"use strict";zie();Sc();o(DPe,"values");kr=DPe});function RPe(t,e,r,n){t=fi(t)?t:kr(t),r=r&&!n?Ec(r):0;var i=t.length;return r<0&&(r=LPe(i+r,0)),xi(t)?r<=i&&t.indexOf(e,r)>-1:!!i&&Dm(t,e,r)>-1}var LPe,jn,Gie=N(()=>{"use strict";Ew();Po();lk();_m();LR();LPe=Math.max;o(RPe,"includes");jn=RPe});function MPe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:Ec(r);return i<0&&(i=NPe(n+i,0)),Dm(t,e,i)}var NPe,ck,Vie=N(()=>{"use strict";Ew();_m();NPe=Math.max;o(MPe,"indexOf");ck=MPe});function FPe(t){if(t==null)return!0;if(fi(t)&&(Bt(t)||typeof t=="string"||typeof t.splice=="function"||Dl(t)||Uh(t)||_l(t)))return!t.length;var e=ho(t);if(e==IPe||e==OPe)return!t.size;if(mc(t))return!Lm(t).length;for(var r in t)if(BPe.call(t,r))return!1;return!0}var IPe,OPe,PPe,BPe,mr,uk=N(()=>{"use strict";Cw();ip();pm();Yn();Po();gm();dm();d2();IPe="[object Map]",OPe="[object Set]",PPe=Object.prototype,BPe=PPe.hasOwnProperty;o(FPe,"isEmpty");mr=FPe});function zPe(t){return ai(t)&&ha(t)==$Pe}var $Pe,Uie,Hie=N(()=>{"use strict";_u();Oo();$Pe="[object RegExp]";o(zPe,"baseIsRegExp");Uie=zPe});var qie,GPe,Uo,Wie=N(()=>{"use strict";Hie();Ud();f2();qie=Fo&&Fo.isRegExp,GPe=qie?Bo(qie):Uie,Uo=GPe});function VPe(t){return t===void 0}var xr,Yie=N(()=>{"use strict";o(VPe,"isUndefined");xr=VPe});function UPe(t,e){return t{"use strict";o(UPe,"baseLt");hk=UPe});function HPe(t,e){var r={};return e=vn(e,3),zm(t,function(n,i,a){pc(r,i,e(n,i,a))}),r}var ap,Xie=N(()=>{"use strict";lm();tk();ss();o(HPe,"mapValues");ap=HPe});function qPe(t,e,r){for(var n=-1,i=t.length;++n{"use strict";tp();o(qPe,"baseExtremum");Um=qPe});function WPe(t){return t&&t.length?Um(t,Qi,Iie):void 0}var Gs,jie=N(()=>{"use strict";fk();Oie();Ru();o(WPe,"max");Gs=WPe});function YPe(t){return t&&t.length?Um(t,Qi,hk):void 0}var Rl,NR=N(()=>{"use strict";fk();RR();Ru();o(YPe,"min");Rl=YPe});function XPe(t,e){return t&&t.length?Um(t,vn(e,2),hk):void 0}var sp,Kie=N(()=>{"use strict";fk();ss();RR();o(XPe,"minBy");sp=XPe});function KPe(t){if(typeof t!="function")throw new TypeError(jPe);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}var jPe,Qie,Zie=N(()=>{"use strict";jPe="Expected a function";o(KPe,"negate");Qie=KPe});function QPe(t,e,r,n){if(!Sn(t))return t;e=rf(e,t);for(var i=-1,a=e.length,s=a-1,l=t;l!=null&&++i{"use strict";ym();B2();m2();oo();Nm();o(QPe,"baseSet");Jie=QPe});function ZPe(t,e,r){for(var n=-1,i=e.length,a={};++n{"use strict";F2();eae();B2();o(ZPe,"basePickBy");dk=ZPe});function JPe(t,e){if(t==null)return{};var r=$s(Bw(t),function(n){return[n]});return e=vn(e),dk(t,r,function(n,i){return e(n,i[0])})}var Vs,tae=N(()=>{"use strict";rp();ss();MR();lR();o(JPe,"pickBy");Vs=JPe});function eBe(t,e){var r=t.length;for(t.sort(e);r--;)t[r]=t[r].value;return t}var rae,nae=N(()=>{"use strict";o(eBe,"baseSortBy");rae=eBe});function tBe(t,e){if(t!==e){var r=t!==void 0,n=t===null,i=t===t,a=uo(t),s=e!==void 0,l=e===null,u=e===e,h=uo(e);if(!l&&!h&&!a&&t>e||a&&s&&u&&!l&&!h||n&&s&&u||!r&&u||!i)return 1;if(!n&&!a&&!h&&t{"use strict";tp();o(tBe,"compareAscending");iae=tBe});function rBe(t,e,r){for(var n=-1,i=t.criteria,a=e.criteria,s=i.length,l=r.length;++n=l)return u;var h=r[n];return u*(h=="desc"?-1:1)}}return t.index-e.index}var sae,oae=N(()=>{"use strict";aae();o(rBe,"compareMultiple");sae=rBe});function nBe(t,e,r){e.length?e=$s(e,function(a){return Bt(a)?function(s){return nf(s,a.length===1?a[0]:a)}:a}):e=[Qi];var n=-1;e=$s(e,Bo(vn));var i=ok(t,function(a,s,l){var u=$s(e,function(h){return h(a)});return{criteria:u,index:++n,value:a}});return rae(i,function(a,s){return sae(a,s,r)})}var lae,cae=N(()=>{"use strict";rp();F2();ss();SR();nae();Ud();oae();Ru();Yn();o(nBe,"baseOrderBy");lae=nBe});var iBe,uae,hae=N(()=>{"use strict";TR();iBe=ek("length"),uae=iBe});function gBe(t){for(var e=fae.lastIndex=0;fae.test(t);)++e;return e}var dae,aBe,sBe,oBe,lBe,cBe,uBe,IR,OR,hBe,pae,mae,gae,fBe,yae,vae,dBe,pBe,mBe,fae,xae,bae=N(()=>{"use strict";dae="\\ud800-\\udfff",aBe="\\u0300-\\u036f",sBe="\\ufe20-\\ufe2f",oBe="\\u20d0-\\u20ff",lBe=aBe+sBe+oBe,cBe="\\ufe0e\\ufe0f",uBe="["+dae+"]",IR="["+lBe+"]",OR="\\ud83c[\\udffb-\\udfff]",hBe="(?:"+IR+"|"+OR+")",pae="[^"+dae+"]",mae="(?:\\ud83c[\\udde6-\\uddff]){2}",gae="[\\ud800-\\udbff][\\udc00-\\udfff]",fBe="\\u200d",yae=hBe+"?",vae="["+cBe+"]?",dBe="(?:"+fBe+"(?:"+[pae,mae,gae].join("|")+")"+vae+yae+")*",pBe=vae+yae+dBe,mBe="(?:"+[pae+IR+"?",IR,mae,gae,uBe].join("|")+")",fae=RegExp(OR+"(?="+OR+")|"+mBe+pBe,"g");o(gBe,"unicodeSize");xae=gBe});function yBe(t){return Rre(t)?xae(t):uae(t)}var Tae,wae=N(()=>{"use strict";hae();Nre();bae();o(yBe,"stringSize");Tae=yBe});function vBe(t,e){return dk(t,e,function(r,n){return Jw(t,n)})}var kae,Eae=N(()=>{"use strict";MR();bR();o(vBe,"basePick");kae=vBe});var xBe,op,Sae=N(()=>{"use strict";Eae();Lre();xBe=Dre(function(t,e){return t==null?{}:kae(t,e)}),op=xBe});function wBe(t,e,r,n){for(var i=-1,a=TBe(bBe((e-t)/(r||1)),0),s=Array(a);a--;)s[n?a:++i]=t,t+=r;return s}var bBe,TBe,Cae,Aae=N(()=>{"use strict";bBe=Math.ceil,TBe=Math.max;o(wBe,"baseRange");Cae=wBe});function kBe(t){return function(e,r,n){return n&&typeof n!="number"&&lo(e,r,n)&&(r=n=void 0),e=Am(e),r===void 0?(r=e,e=0):r=Am(r),n=n===void 0?e{"use strict";Aae();qd();Q9();o(kBe,"createRange");_ae=kBe});var EBe,Ho,Lae=N(()=>{"use strict";Dae();EBe=_ae(),Ho=EBe});function SBe(t,e,r,n,i){return i(t,function(a,s,l){r=n?(n=!1,a):e(r,a,s,l)}),r}var Rae,Nae=N(()=>{"use strict";o(SBe,"baseReduce");Rae=SBe});function CBe(t,e,r){var n=Bt(t)?Mre:Rae,i=arguments.length<3;return n(t,vn(e,4),r,i,zs)}var Jr,PR=N(()=>{"use strict";Ire();sf();ss();Nae();Yn();o(CBe,"reduce");Jr=CBe});function ABe(t,e){var r=Bt(t)?Om:sk;return r(t,Qie(vn(e,3)))}var cf,Mae=N(()=>{"use strict";Nw();kR();ss();Yn();Zie();o(ABe,"reject");cf=ABe});function LBe(t){if(t==null)return 0;if(fi(t))return xi(t)?Tae(t):t.length;var e=ho(t);return e==_Be||e==DBe?t.size:Lm(t).length}var _Be,DBe,BR,Iae=N(()=>{"use strict";Cw();ip();Po();lk();wae();_Be="[object Map]",DBe="[object Set]";o(LBe,"size");BR=LBe});function RBe(t,e){var r;return zs(t,function(n,i,a){return r=e(n,i,a),!r}),!!r}var Oae,Pae=N(()=>{"use strict";sf();o(RBe,"baseSome");Oae=RBe});function NBe(t,e,r){var n=Bt(t)?Hw:Oae;return r&&lo(t,e,r)&&(e=void 0),n(t,vn(e,3))}var z2,Bae=N(()=>{"use strict";dR();ss();Pae();Yn();qd();o(NBe,"some");z2=NBe});var MBe,Dc,Fae=N(()=>{"use strict";Im();cae();vm();qd();MBe=yc(function(t,e){if(t==null)return[];var r=e.length;return r>1&&lo(t,e[0],e[1])?e=[]:r>2&&lo(e[0],e[1],e[2])&&(e=[e[0]]),lae(t,Ac(e,1),[])}),Dc=MBe});var IBe,OBe,$ae,zae=N(()=>{"use strict";cR();Z9();Yw();IBe=1/0,OBe=af&&1/$m(new af([,-0]))[1]==IBe?function(t){return new af(t)}:si,$ae=OBe});function BBe(t,e,r){var n=-1,i=Sw,a=t.length,s=!0,l=[],u=l;if(r)s=!1,i=nk;else if(a>=PBe){var h=e?null:$ae(t);if(h)return $m(h);s=!1,i=Fm,u=new Bm}else u=e?[]:l;e:for(;++n{"use strict";Uw();tR();wR();qw();zae();Yw();PBe=200;o(BBe,"baseUniq");Hm=BBe});var FBe,FR,Gae=N(()=>{"use strict";Im();vm();pk();kT();FBe=yc(function(t){return Hm(Ac(t,1,Vd,!0))}),FR=FBe});function $Be(t){return t&&t.length?Hm(t):[]}var qm,Vae=N(()=>{"use strict";pk();o($Be,"uniq");qm=$Be});function zBe(t,e){return t&&t.length?Hm(t,vn(e,2)):[]}var Uae,Hae=N(()=>{"use strict";ss();pk();o(zBe,"uniqBy");Uae=zBe});function VBe(t){var e=++GBe;return _w(t)+e}var GBe,lp,qae=N(()=>{"use strict";rR();GBe=0;o(VBe,"uniqueId");lp=VBe});function UBe(t,e,r){for(var n=-1,i=t.length,a=e.length,s={};++n{"use strict";o(UBe,"baseZipObject");Wae=UBe});function HBe(t,e){return Wae(t||[],e||[],gc)}var mk,Xae=N(()=>{"use strict";ym();Yae();o(HBe,"zipObject");mk=HBe});var Yt=N(()=>{"use strict";vre();hR();wne();kne();NL();hie();pie();gie();yie();vie();kie();ER();_ie();Lie();CR();Lw();ak();Rie();Nie();Mie();Fie();Ru();Gie();Vie();Yn();uk();i2();oo();Wie();lk();Yie();Sc();mie();Vm();Xie();jie();OL();NR();Kie();Z9();cie();Sae();tae();Lae();PR();Mae();Iae();Bae();Fae();Gae();Vae();qae();LR();Xae();});function Kae(t,e){t[e]?t[e]++:t[e]=1}function Qae(t,e){--t[e]||delete t[e]}function G2(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}return i+jae+a+jae+(xr(n)?qBe:n)}function WBe(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}var l={v:i,w:a};return n&&(l.name=n),l}function $R(t,e){return G2(t,e.v,e.w,e.name)}var qBe,cp,jae,cn,gk=N(()=>{"use strict";Yt();qBe="\0",cp="\0",jae="",cn=class{static{o(this,"Graph")}constructor(e={}){this._isDirected=Object.prototype.hasOwnProperty.call(e,"directed")?e.directed:!0,this._isMultigraph=Object.prototype.hasOwnProperty.call(e,"multigraph")?e.multigraph:!1,this._isCompound=Object.prototype.hasOwnProperty.call(e,"compound")?e.compound:!1,this._label=void 0,this._defaultNodeLabelFn=Ns(void 0),this._defaultEdgeLabelFn=Ns(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[cp]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return Si(e)||(e=Ns(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return qr(this._nodes)}sources(){var e=this;return Zr(this.nodes(),function(r){return mr(e._in[r])})}sinks(){var e=this;return Zr(this.nodes(),function(r){return mr(e._out[r])})}setNodes(e,r){var n=arguments,i=this;return Ae(e,function(a){n.length>1?i.setNode(a,r):i.setNode(a)}),this}setNode(e,r){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=r),this):(this._nodes[e]=arguments.length>1?r:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=cp,this._children[e]={},this._children[cp][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var r=o(n=>this.removeEdge(this._edgeObjs[n]),"removeEdge");delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],Ae(this.children(e),n=>{this.setParent(n)}),delete this._children[e]),Ae(qr(this._in[e]),r),delete this._in[e],delete this._preds[e],Ae(qr(this._out[e]),r),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,r){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(xr(r))r=cp;else{r+="";for(var n=r;!xr(n);n=this.parent(n))if(n===e)throw new Error("Setting "+r+" as parent of "+e+" would create a cycle");this.setNode(r)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=r,this._children[r][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var r=this._parent[e];if(r!==cp)return r}}children(e){if(xr(e)&&(e=cp),this._isCompound){var r=this._children[e];if(r)return qr(r)}else{if(e===cp)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var r=this._preds[e];if(r)return qr(r)}successors(e){var r=this._sucs[e];if(r)return qr(r)}neighbors(e){var r=this.predecessors(e);if(r)return FR(r,this.successors(e))}isLeaf(e){var r;return this.isDirected()?r=this.successors(e):r=this.neighbors(e),r.length===0}filterNodes(e){var r=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});r.setGraph(this.graph());var n=this;Ae(this._nodes,function(s,l){e(l)&&r.setNode(l,s)}),Ae(this._edgeObjs,function(s){r.hasNode(s.v)&&r.hasNode(s.w)&&r.setEdge(s,n.edge(s))});var i={};function a(s){var l=n.parent(s);return l===void 0||r.hasNode(l)?(i[s]=l,l):l in i?i[l]:a(l)}return o(a,"findParent"),this._isCompound&&Ae(r.nodes(),function(s){r.setParent(s,a(s))}),r}setDefaultEdgeLabel(e){return Si(e)||(e=Ns(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return kr(this._edgeObjs)}setPath(e,r){var n=this,i=arguments;return Jr(e,function(a,s){return i.length>1?n.setEdge(a,s,r):n.setEdge(a,s),s}),this}setEdge(){var e,r,n,i,a=!1,s=arguments[0];typeof s=="object"&&s!==null&&"v"in s?(e=s.v,r=s.w,n=s.name,arguments.length===2&&(i=arguments[1],a=!0)):(e=s,r=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],a=!0)),e=""+e,r=""+r,xr(n)||(n=""+n);var l=G2(this._isDirected,e,r,n);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,l))return a&&(this._edgeLabels[l]=i),this;if(!xr(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(r),this._edgeLabels[l]=a?i:this._defaultEdgeLabelFn(e,r,n);var u=WBe(this._isDirected,e,r,n);return e=u.v,r=u.w,Object.freeze(u),this._edgeObjs[l]=u,Kae(this._preds[r],e),Kae(this._sucs[e],r),this._in[r][l]=u,this._out[e][l]=u,this._edgeCount++,this}edge(e,r,n){var i=arguments.length===1?$R(this._isDirected,arguments[0]):G2(this._isDirected,e,r,n);return this._edgeLabels[i]}hasEdge(e,r,n){var i=arguments.length===1?$R(this._isDirected,arguments[0]):G2(this._isDirected,e,r,n);return Object.prototype.hasOwnProperty.call(this._edgeLabels,i)}removeEdge(e,r,n){var i=arguments.length===1?$R(this._isDirected,arguments[0]):G2(this._isDirected,e,r,n),a=this._edgeObjs[i];return a&&(e=a.v,r=a.w,delete this._edgeLabels[i],delete this._edgeObjs[i],Qae(this._preds[r],e),Qae(this._sucs[e],r),delete this._in[r][i],delete this._out[e][i],this._edgeCount--),this}inEdges(e,r){var n=this._in[e];if(n){var i=kr(n);return r?Zr(i,function(a){return a.v===r}):i}}outEdges(e,r){var n=this._out[e];if(n){var i=kr(n);return r?Zr(i,function(a){return a.w===r}):i}}nodeEdges(e,r){var n=this.inEdges(e,r);if(n)return n.concat(this.outEdges(e,r))}};cn.prototype._nodeCount=0;cn.prototype._edgeCount=0;o(Kae,"incrementOrInitEntry");o(Qae,"decrementOrRemoveEntry");o(G2,"edgeArgsToId");o(WBe,"edgeArgsToObj");o($R,"edgeObjToId")});var qo=N(()=>{"use strict";gk()});function Zae(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function YBe(t,e){if(t!=="_next"&&t!=="_prev")return e}var vk,Jae=N(()=>{"use strict";vk=class{static{o(this,"List")}constructor(){var e={};e._next=e._prev=e,this._sentinel=e}dequeue(){var e=this._sentinel,r=e._prev;if(r!==e)return Zae(r),r}enqueue(e){var r=this._sentinel;e._prev&&e._next&&Zae(e),e._next=r._next,r._next._prev=e,r._next=e,e._prev=r}toString(){for(var e=[],r=this._sentinel,n=r._prev;n!==r;)e.push(JSON.stringify(n,YBe)),n=n._prev;return"["+e.join(", ")+"]"}};o(Zae,"unlink");o(YBe,"filterOutLinks")});function ese(t,e){if(t.nodeCount()<=1)return[];var r=KBe(t,e||XBe),n=jBe(r.graph,r.buckets,r.zeroIdx);return Qr(rt(n,function(i){return t.outEdges(i.v,i.w)}))}function jBe(t,e,r){for(var n=[],i=e[e.length-1],a=e[0],s;t.nodeCount();){for(;s=a.dequeue();)zR(t,e,r,s);for(;s=i.dequeue();)zR(t,e,r,s);if(t.nodeCount()){for(var l=e.length-2;l>0;--l)if(s=e[l].dequeue(),s){n=n.concat(zR(t,e,r,s,!0));break}}}return n}function zR(t,e,r,n,i){var a=i?[]:void 0;return Ae(t.inEdges(n.v),function(s){var l=t.edge(s),u=t.node(s.v);i&&a.push({v:s.v,w:s.w}),u.out-=l,GR(e,r,u)}),Ae(t.outEdges(n.v),function(s){var l=t.edge(s),u=s.w,h=t.node(u);h.in-=l,GR(e,r,h)}),t.removeNode(n.v),a}function KBe(t,e){var r=new cn,n=0,i=0;Ae(t.nodes(),function(l){r.setNode(l,{v:l,in:0,out:0})}),Ae(t.edges(),function(l){var u=r.edge(l.v,l.w)||0,h=e(l),f=u+h;r.setEdge(l.v,l.w,f),i=Math.max(i,r.node(l.v).out+=h),n=Math.max(n,r.node(l.w).in+=h)});var a=Ho(i+n+3).map(function(){return new vk}),s=n+1;return Ae(r.nodes(),function(l){GR(a,s,r.node(l))}),{graph:r,buckets:a,zeroIdx:s}}function GR(t,e,r){r.out?r.in?t[r.out-r.in+e].enqueue(r):t[t.length-1].enqueue(r):t[0].enqueue(r)}var XBe,tse=N(()=>{"use strict";Yt();qo();Jae();XBe=Ns(1);o(ese,"greedyFAS");o(jBe,"doGreedyFAS");o(zR,"removeNode");o(KBe,"buildState");o(GR,"assignBucket")});function rse(t){var e=t.graph().acyclicer==="greedy"?ese(t,r(t)):QBe(t);Ae(e,function(n){var i=t.edge(n);t.removeEdge(n),i.forwardName=n.name,i.reversed=!0,t.setEdge(n.w,n.v,i,lp("rev"))});function r(n){return function(i){return n.edge(i).weight}}o(r,"weightFn")}function QBe(t){var e=[],r={},n={};function i(a){Object.prototype.hasOwnProperty.call(n,a)||(n[a]=!0,r[a]=!0,Ae(t.outEdges(a),function(s){Object.prototype.hasOwnProperty.call(r,s.w)?e.push(s):i(s.w)}),delete r[a])}return o(i,"dfs"),Ae(t.nodes(),i),e}function nse(t){Ae(t.edges(),function(e){var r=t.edge(e);if(r.reversed){t.removeEdge(e);var n=r.forwardName;delete r.reversed,delete r.forwardName,t.setEdge(e.w,e.v,r,n)}})}var VR=N(()=>{"use strict";Yt();tse();o(rse,"run");o(QBe,"dfsFAS");o(nse,"undo")});function Lc(t,e,r,n){var i;do i=lp(n);while(t.hasNode(i));return r.dummy=e,t.setNode(i,r),i}function ase(t){var e=new cn().setGraph(t.graph());return Ae(t.nodes(),function(r){e.setNode(r,t.node(r))}),Ae(t.edges(),function(r){var n=e.edge(r.v,r.w)||{weight:0,minlen:1},i=t.edge(r);e.setEdge(r.v,r.w,{weight:n.weight+i.weight,minlen:Math.max(n.minlen,i.minlen)})}),e}function xk(t){var e=new cn({multigraph:t.isMultigraph()}).setGraph(t.graph());return Ae(t.nodes(),function(r){t.children(r).length||e.setNode(r,t.node(r))}),Ae(t.edges(),function(r){e.setEdge(r,t.edge(r))}),e}function UR(t,e){var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2;if(!i&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=l*i/a,h=l):(i<0&&(s=-s),u=s,h=s*a/i),{x:r+u,y:n+h}}function uf(t){var e=rt(Ho(qR(t)+1),function(){return[]});return Ae(t.nodes(),function(r){var n=t.node(r),i=n.rank;xr(i)||(e[i][n.order]=r)}),e}function sse(t){var e=Rl(rt(t.nodes(),function(r){return t.node(r).rank}));Ae(t.nodes(),function(r){var n=t.node(r);Ft(n,"rank")&&(n.rank-=e)})}function ose(t){var e=Rl(rt(t.nodes(),function(a){return t.node(a).rank})),r=[];Ae(t.nodes(),function(a){var s=t.node(a).rank-e;r[s]||(r[s]=[]),r[s].push(a)});var n=0,i=t.graph().nodeRankFactor;Ae(r,function(a,s){xr(a)&&s%i!==0?--n:n&&Ae(a,function(l){t.node(l).rank+=n})})}function HR(t,e,r,n){var i={width:0,height:0};return arguments.length>=4&&(i.rank=r,i.order=n),Lc(t,"border",i,e)}function qR(t){return Gs(rt(t.nodes(),function(e){var r=t.node(e).rank;if(!xr(r))return r}))}function lse(t,e){var r={lhs:[],rhs:[]};return Ae(t,function(n){e(n)?r.lhs.push(n):r.rhs.push(n)}),r}function cse(t,e){var r=rk();try{return e()}finally{console.log(t+" time: "+(rk()-r)+"ms")}}function use(t,e){return e()}var Rc=N(()=>{"use strict";Yt();qo();o(Lc,"addDummyNode");o(ase,"simplify");o(xk,"asNonCompoundGraph");o(UR,"intersectRect");o(uf,"buildLayerMatrix");o(sse,"normalizeRanks");o(ose,"removeEmptyRanks");o(HR,"addBorderNode");o(qR,"maxRank");o(lse,"partition");o(cse,"time");o(use,"notime")});function fse(t){function e(r){var n=t.children(r),i=t.node(r);if(n.length&&Ae(n,e),Object.prototype.hasOwnProperty.call(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var a=i.minRank,s=i.maxRank+1;a{"use strict";Yt();Rc();o(fse,"addBorderSegments");o(hse,"addBorderNode")});function mse(t){var e=t.graph().rankdir.toLowerCase();(e==="lr"||e==="rl")&&yse(t)}function gse(t){var e=t.graph().rankdir.toLowerCase();(e==="bt"||e==="rl")&&ZBe(t),(e==="lr"||e==="rl")&&(JBe(t),yse(t))}function yse(t){Ae(t.nodes(),function(e){pse(t.node(e))}),Ae(t.edges(),function(e){pse(t.edge(e))})}function pse(t){var e=t.width;t.width=t.height,t.height=e}function ZBe(t){Ae(t.nodes(),function(e){WR(t.node(e))}),Ae(t.edges(),function(e){var r=t.edge(e);Ae(r.points,WR),Object.prototype.hasOwnProperty.call(r,"y")&&WR(r)})}function WR(t){t.y=-t.y}function JBe(t){Ae(t.nodes(),function(e){YR(t.node(e))}),Ae(t.edges(),function(e){var r=t.edge(e);Ae(r.points,YR),Object.prototype.hasOwnProperty.call(r,"x")&&YR(r)})}function YR(t){var e=t.x;t.x=t.y,t.y=e}var vse=N(()=>{"use strict";Yt();o(mse,"adjust");o(gse,"undo");o(yse,"swapWidthHeight");o(pse,"swapWidthHeightOne");o(ZBe,"reverseY");o(WR,"reverseYOne");o(JBe,"swapXY");o(YR,"swapXYOne")});function xse(t){t.graph().dummyChains=[],Ae(t.edges(),function(e){tFe(t,e)})}function tFe(t,e){var r=e.v,n=t.node(r).rank,i=e.w,a=t.node(i).rank,s=e.name,l=t.edge(e),u=l.labelRank;if(a!==n+1){t.removeEdge(e);var h=void 0,f,d;for(d=0,++n;n{"use strict";Yt();Rc();o(xse,"run");o(tFe,"normalizeEdge");o(bse,"undo")});function V2(t){var e={};function r(n){var i=t.node(n);if(Object.prototype.hasOwnProperty.call(e,n))return i.rank;e[n]=!0;var a=Rl(rt(t.outEdges(n),function(s){return r(s.w)-t.edge(s).minlen}));return(a===Number.POSITIVE_INFINITY||a===void 0||a===null)&&(a=0),i.rank=a}o(r,"dfs"),Ae(t.sources(),r)}function up(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}var bk=N(()=>{"use strict";Yt();o(V2,"longestPath");o(up,"slack")});function Tk(t){var e=new cn({directed:!1}),r=t.nodes()[0],n=t.nodeCount();e.setNode(r,{});for(var i,a;rFe(e,t){"use strict";Yt();qo();bk();o(Tk,"feasibleTree");o(rFe,"tightTree");o(nFe,"findMinSlackEdge");o(iFe,"shiftRanks")});var wse=N(()=>{"use strict"});var KR=N(()=>{"use strict"});var cjt,QR=N(()=>{"use strict";Yt();KR();cjt=Ns(1)});var kse=N(()=>{"use strict";QR()});var ZR=N(()=>{"use strict"});var Ese=N(()=>{"use strict";ZR()});var bjt,Sse=N(()=>{"use strict";Yt();bjt=Ns(1)});function JR(t){var e={},r={},n=[];function i(a){if(Object.prototype.hasOwnProperty.call(r,a))throw new U2;Object.prototype.hasOwnProperty.call(e,a)||(r[a]=!0,e[a]=!0,Ae(t.predecessors(a),i),delete r[a],n.push(a))}if(o(i,"visit"),Ae(t.sinks(),i),BR(e)!==t.nodeCount())throw new U2;return n}function U2(){}var eN=N(()=>{"use strict";Yt();JR.CycleException=U2;o(JR,"topsort");o(U2,"CycleException");U2.prototype=new Error});var Cse=N(()=>{"use strict";eN()});function wk(t,e,r){Bt(e)||(e=[e]);var n=(t.isDirected()?t.successors:t.neighbors).bind(t),i=[],a={};return Ae(e,function(s){if(!t.hasNode(s))throw new Error("Graph does not have node: "+s);Ase(t,s,r==="post",a,n,i)}),i}function Ase(t,e,r,n,i,a){Object.prototype.hasOwnProperty.call(n,e)||(n[e]=!0,r||a.push(e),Ae(i(e),function(s){Ase(t,s,r,n,i,a)}),r&&a.push(e))}var tN=N(()=>{"use strict";Yt();o(wk,"dfs");o(Ase,"doDfs")});function rN(t,e){return wk(t,e,"post")}var _se=N(()=>{"use strict";tN();o(rN,"postorder")});function nN(t,e){return wk(t,e,"pre")}var Dse=N(()=>{"use strict";tN();o(nN,"preorder")});var Lse=N(()=>{"use strict";KR();gk()});var Rse=N(()=>{"use strict";wse();QR();kse();Ese();Sse();Cse();_se();Dse();Lse();ZR();eN()});function ff(t){t=ase(t),V2(t);var e=Tk(t);aN(e),iN(e,t);for(var r,n;r=Ose(e);)n=Pse(e,t,r),Bse(e,t,r,n)}function iN(t,e){var r=rN(t,t.nodes());r=r.slice(0,r.length-1),Ae(r,function(n){cFe(t,e,n)})}function cFe(t,e,r){var n=t.node(r),i=n.parent;t.edge(r,i).cutvalue=Mse(t,e,r)}function Mse(t,e,r){var n=t.node(r),i=n.parent,a=!0,s=e.edge(r,i),l=0;return s||(a=!1,s=e.edge(i,r)),l=s.weight,Ae(e.nodeEdges(r),function(u){var h=u.v===r,f=h?u.w:u.v;if(f!==i){var d=h===a,p=e.edge(u).weight;if(l+=d?p:-p,hFe(t,r,f)){var m=t.edge(r,f).cutvalue;l+=d?-m:m}}}),l}function aN(t,e){arguments.length<2&&(e=t.nodes()[0]),Ise(t,{},1,e)}function Ise(t,e,r,n,i){var a=r,s=t.node(n);return e[n]=!0,Ae(t.neighbors(n),function(l){Object.prototype.hasOwnProperty.call(e,l)||(r=Ise(t,e,r,l,n))}),s.low=a,s.lim=r++,i?s.parent=i:delete s.parent,r}function Ose(t){return os(t.edges(),function(e){return t.edge(e).cutvalue<0})}function Pse(t,e,r){var n=r.v,i=r.w;e.hasEdge(n,i)||(n=r.w,i=r.v);var a=t.node(n),s=t.node(i),l=a,u=!1;a.lim>s.lim&&(l=s,u=!0);var h=Zr(e.edges(),function(f){return u===Nse(t,t.node(f.v),l)&&u!==Nse(t,t.node(f.w),l)});return sp(h,function(f){return up(e,f)})}function Bse(t,e,r,n){var i=r.v,a=r.w;t.removeEdge(i,a),t.setEdge(n.v,n.w,{}),aN(t),iN(t,e),uFe(t,e)}function uFe(t,e){var r=os(t.nodes(),function(i){return!e.node(i).parent}),n=nN(t,r);n=n.slice(1),Ae(n,function(i){var a=t.node(i).parent,s=e.edge(i,a),l=!1;s||(s=e.edge(a,i),l=!0),e.node(i).rank=e.node(a).rank+(l?s.minlen:-s.minlen)})}function hFe(t,e,r){return t.hasEdge(e,r)}function Nse(t,e,r){return r.low<=e.lim&&e.lim<=r.lim}var Fse=N(()=>{"use strict";Yt();Rse();Rc();jR();bk();ff.initLowLimValues=aN;ff.initCutValues=iN;ff.calcCutValue=Mse;ff.leaveEdge=Ose;ff.enterEdge=Pse;ff.exchangeEdges=Bse;o(ff,"networkSimplex");o(iN,"initCutValues");o(cFe,"assignCutValue");o(Mse,"calcCutValue");o(aN,"initLowLimValues");o(Ise,"dfsAssignLowLim");o(Ose,"leaveEdge");o(Pse,"enterEdge");o(Bse,"exchangeEdges");o(uFe,"updateRanks");o(hFe,"isTreeEdge");o(Nse,"isDescendant")});function sN(t){switch(t.graph().ranker){case"network-simplex":$se(t);break;case"tight-tree":dFe(t);break;case"longest-path":fFe(t);break;default:$se(t)}}function dFe(t){V2(t),Tk(t)}function $se(t){ff(t)}var fFe,oN=N(()=>{"use strict";jR();Fse();bk();o(sN,"rank");fFe=V2;o(dFe,"tightTreeRanker");o($se,"networkSimplexRanker")});function zse(t){var e=Lc(t,"root",{},"_root"),r=pFe(t),n=Gs(kr(r))-1,i=2*n+1;t.graph().nestingRoot=e,Ae(t.edges(),function(s){t.edge(s).minlen*=i});var a=mFe(t)+1;Ae(t.children(),function(s){Gse(t,e,i,a,n,r,s)}),t.graph().nodeRankFactor=i}function Gse(t,e,r,n,i,a,s){var l=t.children(s);if(!l.length){s!==e&&t.setEdge(e,s,{weight:0,minlen:r});return}var u=HR(t,"_bt"),h=HR(t,"_bb"),f=t.node(s);t.setParent(u,s),f.borderTop=u,t.setParent(h,s),f.borderBottom=h,Ae(l,function(d){Gse(t,e,r,n,i,a,d);var p=t.node(d),m=p.borderTop?p.borderTop:d,g=p.borderBottom?p.borderBottom:d,y=p.borderTop?n:2*n,v=m!==g?1:i-a[s]+1;t.setEdge(u,m,{weight:y,minlen:v,nestingEdge:!0}),t.setEdge(g,h,{weight:y,minlen:v,nestingEdge:!0})}),t.parent(s)||t.setEdge(e,u,{weight:0,minlen:i+a[s]})}function pFe(t){var e={};function r(n,i){var a=t.children(n);a&&a.length&&Ae(a,function(s){r(s,i+1)}),e[n]=i}return o(r,"dfs"),Ae(t.children(),function(n){r(n,1)}),e}function mFe(t){return Jr(t.edges(),function(e,r){return e+t.edge(r).weight},0)}function Vse(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,Ae(t.edges(),function(r){var n=t.edge(r);n.nestingEdge&&t.removeEdge(r)})}var Use=N(()=>{"use strict";Yt();Rc();o(zse,"run");o(Gse,"dfs");o(pFe,"treeDepths");o(mFe,"sumWeights");o(Vse,"cleanup")});function Hse(t,e,r){var n={},i;Ae(r,function(a){for(var s=t.parent(a),l,u;s;){if(l=t.parent(s),l?(u=n[l],n[l]=s):(u=i,i=s),u&&u!==s){e.setEdge(u,s);return}s=l}})}var qse=N(()=>{"use strict";Yt();o(Hse,"addSubgraphConstraints")});function Wse(t,e,r){var n=yFe(t),i=new cn({compound:!0}).setGraph({root:n}).setDefaultNodeLabel(function(a){return t.node(a)});return Ae(t.nodes(),function(a){var s=t.node(a),l=t.parent(a);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(i.setNode(a),i.setParent(a,l||n),Ae(t[r](a),function(u){var h=u.v===a?u.w:u.v,f=i.edge(h,a),d=xr(f)?0:f.weight;i.setEdge(h,a,{weight:t.edge(u).weight+d})}),Object.prototype.hasOwnProperty.call(s,"minRank")&&i.setNode(a,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))}),i}function yFe(t){for(var e;t.hasNode(e=lp("_root")););return e}var Yse=N(()=>{"use strict";Yt();qo();o(Wse,"buildLayerGraph");o(yFe,"createRootNode")});function Xse(t,e){for(var r=0,n=1;n0;)f%2&&(d+=l[f+1]),f=f-1>>1,l[f]+=h.weight;u+=h.weight*d})),u}var jse=N(()=>{"use strict";Yt();o(Xse,"crossCount");o(vFe,"twoLayerCrossCount")});function Kse(t){var e={},r=Zr(t.nodes(),function(l){return!t.children(l).length}),n=Gs(rt(r,function(l){return t.node(l).rank})),i=rt(Ho(n+1),function(){return[]});function a(l){if(!Ft(e,l)){e[l]=!0;var u=t.node(l);i[u.rank].push(l),Ae(t.successors(l),a)}}o(a,"dfs");var s=Dc(r,function(l){return t.node(l).rank});return Ae(s,a),i}var Qse=N(()=>{"use strict";Yt();o(Kse,"initOrder")});function Zse(t,e){return rt(e,function(r){var n=t.inEdges(r);if(n.length){var i=Jr(n,function(a,s){var l=t.edge(s),u=t.node(s.v);return{sum:a.sum+l.weight*u.order,weight:a.weight+l.weight}},{sum:0,weight:0});return{v:r,barycenter:i.sum/i.weight,weight:i.weight}}else return{v:r}})}var Jse=N(()=>{"use strict";Yt();o(Zse,"barycenter")});function eoe(t,e){var r={};Ae(t,function(i,a){var s=r[i.v]={indegree:0,in:[],out:[],vs:[i.v],i:a};xr(i.barycenter)||(s.barycenter=i.barycenter,s.weight=i.weight)}),Ae(e.edges(),function(i){var a=r[i.v],s=r[i.w];!xr(a)&&!xr(s)&&(s.indegree++,a.out.push(r[i.w]))});var n=Zr(r,function(i){return!i.indegree});return xFe(n)}function xFe(t){var e=[];function r(a){return function(s){s.merged||(xr(s.barycenter)||xr(a.barycenter)||s.barycenter>=a.barycenter)&&bFe(a,s)}}o(r,"handleIn");function n(a){return function(s){s.in.push(a),--s.indegree===0&&t.push(s)}}for(o(n,"handleOut");t.length;){var i=t.pop();e.push(i),Ae(i.in.reverse(),r(i)),Ae(i.out,n(i))}return rt(Zr(e,function(a){return!a.merged}),function(a){return op(a,["vs","i","barycenter","weight"])})}function bFe(t,e){var r=0,n=0;t.weight&&(r+=t.barycenter*t.weight,n+=t.weight),e.weight&&(r+=e.barycenter*e.weight,n+=e.weight),t.vs=e.vs.concat(t.vs),t.barycenter=r/n,t.weight=n,t.i=Math.min(e.i,t.i),e.merged=!0}var toe=N(()=>{"use strict";Yt();o(eoe,"resolveConflicts");o(xFe,"doResolveConflicts");o(bFe,"mergeEntries")});function noe(t,e){var r=lse(t,function(f){return Object.prototype.hasOwnProperty.call(f,"barycenter")}),n=r.lhs,i=Dc(r.rhs,function(f){return-f.i}),a=[],s=0,l=0,u=0;n.sort(TFe(!!e)),u=roe(a,i,u),Ae(n,function(f){u+=f.vs.length,a.push(f.vs),s+=f.barycenter*f.weight,l+=f.weight,u=roe(a,i,u)});var h={vs:Qr(a)};return l&&(h.barycenter=s/l,h.weight=l),h}function roe(t,e,r){for(var n;e.length&&(n=ma(e)).i<=r;)e.pop(),t.push(n.vs),r++;return r}function TFe(t){return function(e,r){return e.barycenterr.barycenter?1:t?r.i-e.i:e.i-r.i}}var ioe=N(()=>{"use strict";Yt();Rc();o(noe,"sort");o(roe,"consumeUnsortable");o(TFe,"compareWithBias")});function lN(t,e,r,n){var i=t.children(e),a=t.node(e),s=a?a.borderLeft:void 0,l=a?a.borderRight:void 0,u={};s&&(i=Zr(i,function(g){return g!==s&&g!==l}));var h=Zse(t,i);Ae(h,function(g){if(t.children(g.v).length){var y=lN(t,g.v,r,n);u[g.v]=y,Object.prototype.hasOwnProperty.call(y,"barycenter")&&kFe(g,y)}});var f=eoe(h,r);wFe(f,u);var d=noe(f,n);if(s&&(d.vs=Qr([s,d.vs,l]),t.predecessors(s).length)){var p=t.node(t.predecessors(s)[0]),m=t.node(t.predecessors(l)[0]);Object.prototype.hasOwnProperty.call(d,"barycenter")||(d.barycenter=0,d.weight=0),d.barycenter=(d.barycenter*d.weight+p.order+m.order)/(d.weight+2),d.weight+=2}return d}function wFe(t,e){Ae(t,function(r){r.vs=Qr(r.vs.map(function(n){return e[n]?e[n].vs:n}))})}function kFe(t,e){xr(t.barycenter)?(t.barycenter=e.barycenter,t.weight=e.weight):(t.barycenter=(t.barycenter*t.weight+e.barycenter*e.weight)/(t.weight+e.weight),t.weight+=e.weight)}var aoe=N(()=>{"use strict";Yt();Jse();toe();ioe();o(lN,"sortSubgraph");o(wFe,"expandSubgraphs");o(kFe,"mergeBarycenters")});function loe(t){var e=qR(t),r=soe(t,Ho(1,e+1),"inEdges"),n=soe(t,Ho(e-1,-1,-1),"outEdges"),i=Kse(t);ooe(t,i);for(var a=Number.POSITIVE_INFINITY,s,l=0,u=0;u<4;++l,++u){EFe(l%2?r:n,l%4>=2),i=uf(t);var h=Xse(t,i);h{"use strict";Yt();qo();Rc();qse();Yse();jse();Qse();aoe();o(loe,"order");o(soe,"buildLayerGraphs");o(EFe,"sweepLayerGraphs");o(ooe,"assignOrder")});function uoe(t){var e=CFe(t);Ae(t.graph().dummyChains,function(r){for(var n=t.node(r),i=n.edgeObj,a=SFe(t,e,i.v,i.w),s=a.path,l=a.lca,u=0,h=s[u],f=!0;r!==i.w;){if(n=t.node(r),f){for(;(h=s[u])!==l&&t.node(h).maxRanks||l>e[u].lim));for(h=u,u=n;(u=t.parent(u))!==h;)a.push(u);return{path:i.concat(a.reverse()),lca:h}}function CFe(t){var e={},r=0;function n(i){var a=r;Ae(t.children(i),n),e[i]={low:a,lim:r++}}return o(n,"dfs"),Ae(t.children(),n),e}var hoe=N(()=>{"use strict";Yt();o(uoe,"parentDummyChains");o(SFe,"findPath");o(CFe,"postorder")});function AFe(t,e){var r={};function n(i,a){var s=0,l=0,u=i.length,h=ma(a);return Ae(a,function(f,d){var p=DFe(t,f),m=p?t.node(p).order:u;(p||f===h)&&(Ae(a.slice(l,d+1),function(g){Ae(t.predecessors(g),function(y){var v=t.node(y),x=v.order;(xh)&&foe(r,p,f)})})}o(n,"scan");function i(a,s){var l=-1,u,h=0;return Ae(s,function(f,d){if(t.node(f).dummy==="border"){var p=t.predecessors(f);p.length&&(u=t.node(p[0]).order,n(s,h,d,l,u),h=d,l=u)}n(s,h,s.length,u,a.length)}),s}return o(i,"visitLayer"),Jr(e,i),r}function DFe(t,e){if(t.node(e).dummy)return os(t.predecessors(e),function(r){return t.node(r).dummy})}function foe(t,e,r){if(e>r){var n=e;e=r,r=n}Object.prototype.hasOwnProperty.call(t,e)||Object.defineProperty(t,e,{enumerable:!0,configurable:!0,value:{},writable:!0});var i=t[e];Object.defineProperty(i,r,{enumerable:!0,configurable:!0,value:!0,writable:!0})}function LFe(t,e,r){if(e>r){var n=e;e=r,r=n}return!!t[e]&&Object.prototype.hasOwnProperty.call(t[e],r)}function RFe(t,e,r,n){var i={},a={},s={};return Ae(e,function(l){Ae(l,function(u,h){i[u]=u,a[u]=u,s[u]=h})}),Ae(e,function(l){var u=-1;Ae(l,function(h){var f=n(h);if(f.length){f=Dc(f,function(y){return s[y]});for(var d=(f.length-1)/2,p=Math.floor(d),m=Math.ceil(d);p<=m;++p){var g=f[p];a[h]===h&&u{"use strict";Yt();qo();Rc();o(AFe,"findType1Conflicts");o(_Fe,"findType2Conflicts");o(DFe,"findOtherInnerSegmentNode");o(foe,"addConflict");o(LFe,"hasConflict");o(RFe,"verticalAlignment");o(NFe,"horizontalCompaction");o(MFe,"buildBlockGraph");o(IFe,"findSmallestWidthAlignment");o(OFe,"alignCoordinates");o(PFe,"balance");o(doe,"positionX");o(BFe,"sep");o(FFe,"width")});function moe(t){t=xk(t),$Fe(t),_R(doe(t),function(e,r){t.node(r).x=e})}function $Fe(t){var e=uf(t),r=t.graph().ranksep,n=0;Ae(e,function(i){var a=Gs(rt(i,function(s){return t.node(s).height}));Ae(i,function(s){t.node(s).y=n+a/2}),n+=a+r})}var goe=N(()=>{"use strict";Yt();Rc();poe();o(moe,"position");o($Fe,"positionY")});function H2(t,e){var r=e&&e.debugTiming?cse:use;r("layout",()=>{var n=r(" buildLayoutGraph",()=>KFe(t));r(" runLayout",()=>zFe(n,r)),r(" updateInputGraph",()=>GFe(t,n))})}function zFe(t,e){e(" makeSpaceForEdgeLabels",()=>QFe(t)),e(" removeSelfEdges",()=>s$e(t)),e(" acyclic",()=>rse(t)),e(" nestingGraph.run",()=>zse(t)),e(" rank",()=>sN(xk(t))),e(" injectEdgeLabelProxies",()=>ZFe(t)),e(" removeEmptyRanks",()=>ose(t)),e(" nestingGraph.cleanup",()=>Vse(t)),e(" normalizeRanks",()=>sse(t)),e(" assignRankMinMax",()=>JFe(t)),e(" removeEdgeLabelProxies",()=>e$e(t)),e(" normalize.run",()=>xse(t)),e(" parentDummyChains",()=>uoe(t)),e(" addBorderSegments",()=>fse(t)),e(" order",()=>loe(t)),e(" insertSelfEdges",()=>o$e(t)),e(" adjustCoordinateSystem",()=>mse(t)),e(" position",()=>moe(t)),e(" positionSelfEdges",()=>l$e(t)),e(" removeBorderNodes",()=>a$e(t)),e(" normalize.undo",()=>bse(t)),e(" fixupEdgeLabelCoords",()=>n$e(t)),e(" undoCoordinateSystem",()=>gse(t)),e(" translateGraph",()=>t$e(t)),e(" assignNodeIntersects",()=>r$e(t)),e(" reversePoints",()=>i$e(t)),e(" acyclic.undo",()=>nse(t))}function GFe(t,e){Ae(t.nodes(),function(r){var n=t.node(r),i=e.node(r);n&&(n.x=i.x,n.y=i.y,e.children(r).length&&(n.width=i.width,n.height=i.height))}),Ae(t.edges(),function(r){var n=t.edge(r),i=e.edge(r);n.points=i.points,Object.prototype.hasOwnProperty.call(i,"x")&&(n.x=i.x,n.y=i.y)}),t.graph().width=e.graph().width,t.graph().height=e.graph().height}function KFe(t){var e=new cn({multigraph:!0,compound:!0}),r=uN(t.graph());return e.setGraph(Wh({},UFe,cN(r,VFe),op(r,HFe))),Ae(t.nodes(),function(n){var i=uN(t.node(n));e.setNode(n,of(cN(i,qFe),WFe)),e.setParent(n,t.parent(n))}),Ae(t.edges(),function(n){var i=uN(t.edge(n));e.setEdge(n,Wh({},XFe,cN(i,YFe),op(i,jFe)))}),e}function QFe(t){var e=t.graph();e.ranksep/=2,Ae(t.edges(),function(r){var n=t.edge(r);n.minlen*=2,n.labelpos.toLowerCase()!=="c"&&(e.rankdir==="TB"||e.rankdir==="BT"?n.width+=n.labeloffset:n.height+=n.labeloffset)})}function ZFe(t){Ae(t.edges(),function(e){var r=t.edge(e);if(r.width&&r.height){var n=t.node(e.v),i=t.node(e.w),a={rank:(i.rank-n.rank)/2+n.rank,e};Lc(t,"edge-proxy",a,"_ep")}})}function JFe(t){var e=0;Ae(t.nodes(),function(r){var n=t.node(r);n.borderTop&&(n.minRank=t.node(n.borderTop).rank,n.maxRank=t.node(n.borderBottom).rank,e=Gs(e,n.maxRank))}),t.graph().maxRank=e}function e$e(t){Ae(t.nodes(),function(e){var r=t.node(e);r.dummy==="edge-proxy"&&(t.edge(r.e).labelRank=r.rank,t.removeNode(e))})}function t$e(t){var e=Number.POSITIVE_INFINITY,r=0,n=Number.POSITIVE_INFINITY,i=0,a=t.graph(),s=a.marginx||0,l=a.marginy||0;function u(h){var f=h.x,d=h.y,p=h.width,m=h.height;e=Math.min(e,f-p/2),r=Math.max(r,f+p/2),n=Math.min(n,d-m/2),i=Math.max(i,d+m/2)}o(u,"getExtremes"),Ae(t.nodes(),function(h){u(t.node(h))}),Ae(t.edges(),function(h){var f=t.edge(h);Object.prototype.hasOwnProperty.call(f,"x")&&u(f)}),e-=s,n-=l,Ae(t.nodes(),function(h){var f=t.node(h);f.x-=e,f.y-=n}),Ae(t.edges(),function(h){var f=t.edge(h);Ae(f.points,function(d){d.x-=e,d.y-=n}),Object.prototype.hasOwnProperty.call(f,"x")&&(f.x-=e),Object.prototype.hasOwnProperty.call(f,"y")&&(f.y-=n)}),a.width=r-e+s,a.height=i-n+l}function r$e(t){Ae(t.edges(),function(e){var r=t.edge(e),n=t.node(e.v),i=t.node(e.w),a,s;r.points?(a=r.points[0],s=r.points[r.points.length-1]):(r.points=[],a=i,s=n),r.points.unshift(UR(n,a)),r.points.push(UR(i,s))})}function n$e(t){Ae(t.edges(),function(e){var r=t.edge(e);if(Object.prototype.hasOwnProperty.call(r,"x"))switch((r.labelpos==="l"||r.labelpos==="r")&&(r.width-=r.labeloffset),r.labelpos){case"l":r.x-=r.width/2+r.labeloffset;break;case"r":r.x+=r.width/2+r.labeloffset;break}})}function i$e(t){Ae(t.edges(),function(e){var r=t.edge(e);r.reversed&&r.points.reverse()})}function a$e(t){Ae(t.nodes(),function(e){if(t.children(e).length){var r=t.node(e),n=t.node(r.borderTop),i=t.node(r.borderBottom),a=t.node(ma(r.borderLeft)),s=t.node(ma(r.borderRight));r.width=Math.abs(s.x-a.x),r.height=Math.abs(i.y-n.y),r.x=a.x+r.width/2,r.y=n.y+r.height/2}}),Ae(t.nodes(),function(e){t.node(e).dummy==="border"&&t.removeNode(e)})}function s$e(t){Ae(t.edges(),function(e){if(e.v===e.w){var r=t.node(e.v);r.selfEdges||(r.selfEdges=[]),r.selfEdges.push({e,label:t.edge(e)}),t.removeEdge(e)}})}function o$e(t){var e=uf(t);Ae(e,function(r){var n=0;Ae(r,function(i,a){var s=t.node(i);s.order=a+n,Ae(s.selfEdges,function(l){Lc(t,"selfedge",{width:l.label.width,height:l.label.height,rank:s.rank,order:a+ ++n,e:l.e,label:l.label},"_se")}),delete s.selfEdges})})}function l$e(t){Ae(t.nodes(),function(e){var r=t.node(e);if(r.dummy==="selfedge"){var n=t.node(r.e.v),i=n.x+n.width/2,a=n.y,s=r.x-i,l=n.height/2;t.setEdge(r.e,r.label),t.removeNode(e),r.label.points=[{x:i+2*s/3,y:a-l},{x:i+5*s/6,y:a-l},{x:i+s,y:a},{x:i+5*s/6,y:a+l},{x:i+2*s/3,y:a+l}],r.label.x=r.x,r.label.y=r.y}})}function cN(t,e){return ap(op(t,e),Number)}function uN(t){var e={};return Ae(t,function(r,n){e[n.toLowerCase()]=r}),e}var VFe,UFe,HFe,qFe,WFe,YFe,XFe,jFe,yoe=N(()=>{"use strict";Yt();qo();dse();vse();VR();XR();oN();Use();coe();hoe();goe();Rc();o(H2,"layout");o(zFe,"runLayout");o(GFe,"updateInputGraph");VFe=["nodesep","edgesep","ranksep","marginx","marginy"],UFe={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},HFe=["acyclicer","ranker","rankdir","align"],qFe=["width","height"],WFe={width:0,height:0},YFe=["minlen","weight","width","height","labeloffset"],XFe={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},jFe=["labelpos"];o(KFe,"buildLayoutGraph");o(QFe,"makeSpaceForEdgeLabels");o(ZFe,"injectEdgeLabelProxies");o(JFe,"assignRankMinMax");o(e$e,"removeEdgeLabelProxies");o(t$e,"translateGraph");o(r$e,"assignNodeIntersects");o(n$e,"fixupEdgeLabelCoords");o(i$e,"reversePointsForReversedEdges");o(a$e,"removeBorderNodes");o(s$e,"removeSelfEdges");o(o$e,"insertSelfEdges");o(l$e,"positionSelfEdges");o(cN,"selectNumberAttrs");o(uN,"canonicalize")});var hN=N(()=>{"use strict";VR();yoe();XR();oN()});function Wo(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:c$e(t),edges:u$e(t)};return xr(t.graph())||(e.value=ln(t.graph())),e}function c$e(t){return rt(t.nodes(),function(e){var r=t.node(e),n=t.parent(e),i={v:e};return xr(r)||(i.value=r),xr(n)||(i.parent=n),i})}function u$e(t){return rt(t.edges(),function(e){var r=t.edge(e),n={v:e.v,w:e.w};return xr(e.name)||(n.name=e.name),xr(r)||(n.value=r),n})}var fN=N(()=>{"use strict";Yt();gk();o(Wo,"write");o(c$e,"writeNodes");o(u$e,"writeEdges")});var Er,hp,boe,Toe,kk,h$e,woe,koe,f$e,Wm,xoe,Eoe,Soe,Coe,Aoe,_oe=N(()=>{"use strict";pt();qo();fN();Er=new Map,hp=new Map,boe=new Map,Toe=o(()=>{hp.clear(),boe.clear(),Er.clear()},"clear"),kk=o((t,e)=>{let r=hp.get(e)||[];return X.trace("In isDescendant",e," ",t," = ",r.includes(t)),r.includes(t)},"isDescendant"),h$e=o((t,e)=>{let r=hp.get(e)||[];return X.info("Descendants of ",e," is ",r),X.info("Edge is ",t),t.v===e||t.w===e?!1:r?r.includes(t.v)||kk(t.v,e)||kk(t.w,e)||r.includes(t.w):(X.debug("Tilt, ",e,",not in descendants"),!1)},"edgeInCluster"),woe=o((t,e,r,n)=>{X.warn("Copying children of ",t,"root",n,"data",e.node(t),n);let i=e.children(t)||[];t!==n&&i.push(t),X.warn("Copying (nodes) clusterId",t,"nodes",i),i.forEach(a=>{if(e.children(a).length>0)woe(a,e,r,n);else{let s=e.node(a);X.info("cp ",a," to ",n," with parent ",t),r.setNode(a,s),n!==e.parent(a)&&(X.warn("Setting parent",a,e.parent(a)),r.setParent(a,e.parent(a))),t!==n&&a!==t?(X.debug("Setting parent",a,t),r.setParent(a,t)):(X.info("In copy ",t,"root",n,"data",e.node(t),n),X.debug("Not Setting parent for node=",a,"cluster!==rootId",t!==n,"node!==clusterId",a!==t));let l=e.edges(a);X.debug("Copying Edges",l),l.forEach(u=>{X.info("Edge",u);let h=e.edge(u.v,u.w,u.name);X.info("Edge data",h,n);try{h$e(u,n)?(X.info("Copying as ",u.v,u.w,h,u.name),r.setEdge(u.v,u.w,h,u.name),X.info("newGraph edges ",r.edges(),r.edge(r.edges()[0]))):X.info("Skipping copy of edge ",u.v,"-->",u.w," rootId: ",n," clusterId:",t)}catch(f){X.error(f)}})}X.debug("Removing node",a),e.removeNode(a)})},"copy"),koe=o((t,e)=>{let r=e.children(t),n=[...r];for(let i of r)boe.set(i,t),n=[...n,...koe(i,e)];return n},"extractDescendants"),f$e=o((t,e,r)=>{let n=t.edges().filter(u=>u.v===e||u.w===e),i=t.edges().filter(u=>u.v===r||u.w===r),a=n.map(u=>({v:u.v===e?r:u.v,w:u.w===e?e:u.w})),s=i.map(u=>({v:u.v,w:u.w}));return a.filter(u=>s.some(h=>u.v===h.v&&u.w===h.w))},"findCommonEdges"),Wm=o((t,e,r)=>{let n=e.children(t);if(X.trace("Searching children of id ",t,n),n.length<1)return t;let i;for(let a of n){let s=Wm(a,e,r),l=f$e(e,r,s);if(s)if(l.length>0)i=s;else return s}return i},"findNonClusterChild"),xoe=o(t=>!Er.has(t)||!Er.get(t).externalConnections?t:Er.has(t)?Er.get(t).id:t,"getAnchorId"),Eoe=o((t,e)=>{if(!t||e>10){X.debug("Opting out, no graph ");return}else X.debug("Opting in, graph ");t.nodes().forEach(function(r){t.children(r).length>0&&(X.warn("Cluster identified",r," Replacement id in edges: ",Wm(r,t,r)),hp.set(r,koe(r,t)),Er.set(r,{id:Wm(r,t,r),clusterData:t.node(r)}))}),t.nodes().forEach(function(r){let n=t.children(r),i=t.edges();n.length>0?(X.debug("Cluster identified",r,hp),i.forEach(a=>{let s=kk(a.v,r),l=kk(a.w,r);s^l&&(X.warn("Edge: ",a," leaves cluster ",r),X.warn("Descendants of XXX ",r,": ",hp.get(r)),Er.get(r).externalConnections=!0)})):X.debug("Not a cluster ",r,hp)});for(let r of Er.keys()){let n=Er.get(r).id,i=t.parent(n);i!==r&&Er.has(i)&&!Er.get(i).externalConnections&&(Er.get(r).id=i)}t.edges().forEach(function(r){let n=t.edge(r);X.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(r)),X.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(t.edge(r)));let i=r.v,a=r.w;if(X.warn("Fix XXX",Er,"ids:",r.v,r.w,"Translating: ",Er.get(r.v)," --- ",Er.get(r.w)),Er.get(r.v)||Er.get(r.w)){if(X.warn("Fixing and trying - removing XXX",r.v,r.w,r.name),i=xoe(r.v),a=xoe(r.w),t.removeEdge(r.v,r.w,r.name),i!==r.v){let s=t.parent(i);Er.get(s).externalConnections=!0,n.fromCluster=r.v}if(a!==r.w){let s=t.parent(a);Er.get(s).externalConnections=!0,n.toCluster=r.w}X.warn("Fix Replacing with XXX",i,a,r.name),t.setEdge(i,a,n,r.name)}}),X.warn("Adjusted Graph",Wo(t)),Soe(t,0),X.trace(Er)},"adjustClustersAndEdges"),Soe=o((t,e)=>{if(X.warn("extractor - ",e,Wo(t),t.children("D")),e>10){X.error("Bailing out");return}let r=t.nodes(),n=!1;for(let i of r){let a=t.children(i);n=n||a.length>0}if(!n){X.debug("Done, no node has children",t.nodes());return}X.debug("Nodes = ",r,e);for(let i of r)if(X.debug("Extracting node",i,Er,Er.has(i)&&!Er.get(i).externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),!Er.has(i))X.debug("Not a cluster",i,e);else if(!Er.get(i).externalConnections&&t.children(i)&&t.children(i).length>0){X.warn("Cluster without external connections, without a parent and with children",i,e);let s=t.graph().rankdir==="TB"?"LR":"TB";Er.get(i)?.clusterData?.dir&&(s=Er.get(i).clusterData.dir,X.warn("Fixing dir",Er.get(i).clusterData.dir,s));let l=new cn({multigraph:!0,compound:!0}).setGraph({rankdir:s,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});X.warn("Old graph before copy",Wo(t)),woe(i,t,l,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:Er.get(i).clusterData,label:Er.get(i).label,graph:l}),X.warn("New graph after copy node: (",i,")",Wo(l)),X.debug("Old graph after copy",Wo(t))}else X.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!Er.get(i).externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),X.debug(Er);r=t.nodes(),X.warn("New list of nodes",r);for(let i of r){let a=t.node(i);X.warn(" Now next level",i,a),a?.clusterNode&&Soe(a.graph,e+1)}},"extractor"),Coe=o((t,e)=>{if(e.length===0)return[];let r=Object.assign([],e);return e.forEach(n=>{let i=t.children(n),a=Coe(t,i);r=[...r,...a]}),r},"sorter"),Aoe=o(t=>Coe(t,t.children()),"sortNodesByHierarchy")});var Loe={};dr(Loe,{render:()=>d$e});var Doe,d$e,Roe=N(()=>{"use strict";hN();fN();qo();K9();It();_oe();bw();cw();j9();pt();O2();Xt();Doe=o(async(t,e,r,n,i,a)=>{X.warn("Graph in recursive render:XAX",Wo(e),i);let s=e.graph().rankdir;X.trace("Dir in recursive render - dir:",s);let l=t.insert("g").attr("class","root");e.nodes()?X.info("Recursive render XXX",e.nodes()):X.info("No nodes found for",e),e.edges().length>0&&X.info("Recursive edges",e.edge(e.edges()[0]));let u=l.insert("g").attr("class","clusters"),h=l.insert("g").attr("class","edgePaths"),f=l.insert("g").attr("class","edgeLabels"),d=l.insert("g").attr("class","nodes");await Promise.all(e.nodes().map(async function(y){let v=e.node(y);if(i!==void 0){let x=JSON.parse(JSON.stringify(i.clusterData));X.trace(`Setting data for parent cluster XXX + Node.id = `,y,` + data=`,x.height,` +Parent cluster`,i.height),e.setNode(i.id,x),e.parent(y)||(X.trace("Setting parent",y,i.id),e.setParent(y,i.id,x))}if(X.info("(Insert) Node XXX"+y+": "+JSON.stringify(e.node(y))),v?.clusterNode){X.info("Cluster identified XBX",y,v.width,e.node(y));let{ranksep:x,nodesep:b}=e.graph();v.graph.setGraph({...v.graph.graph(),ranksep:x+25,nodesep:b});let T=await Doe(d,v.graph,r,n,e.node(y),a),S=T.elem;Qe(v,S),v.diff=T.diff||0,X.info("New compound node after recursive render XAX",y,"width",v.width,"height",v.height),Xte(S,v)}else e.children(y).length>0?(X.trace("Cluster - the non recursive path XBX",y,v.id,v,v.width,"Graph:",e),X.trace(Wm(v.id,e)),Er.set(v.id,{id:Wm(v.id,e),node:v})):(X.trace("Node - the non recursive path XAX",y,d,e.node(y),s),await Cm(d,e.node(y),{config:a,dir:s}))})),await o(async()=>{let y=e.edges().map(async function(v){let x=e.edge(v.v,v.w,v.name);X.info("Edge "+v.v+" -> "+v.w+": "+JSON.stringify(v)),X.info("Edge "+v.v+" -> "+v.w+": ",v," ",JSON.stringify(e.edge(v))),X.info("Fix",Er,"ids:",v.v,v.w,"Translating: ",Er.get(v.v),Er.get(v.w)),await mw(f,x)});await Promise.all(y)},"processEdges")(),X.info("Graph before layout:",JSON.stringify(Wo(e))),X.info("############################################# XXX"),X.info("### Layout ### XXX"),X.info("############################################# XXX"),H2(e),X.info("Graph after layout:",JSON.stringify(Wo(e)));let m=0,{subGraphTitleTotalMargin:g}=Pu(a);return await Promise.all(Aoe(e).map(async function(y){let v=e.node(y);if(X.info("Position XBX => "+y+": ("+v.x,","+v.y,") width: ",v.width," height: ",v.height),v?.clusterNode)v.y+=g,X.info("A tainted cluster node XBX1",y,v.id,v.width,v.height,v.x,v.y,e.parent(y)),Er.get(v.id).node=v,P2(v);else if(e.children(y).length>0){X.info("A pure cluster node XBX1",y,v.id,v.x,v.y,v.width,v.height,e.parent(y)),v.height+=g,e.node(v.parentId);let x=v?.padding/2||0,b=v?.labelBBox?.height||0,T=b-x||0;X.debug("OffsetY",T,"labelHeight",b,"halfPadding",x),await Sm(u,v),Er.get(v.id).node=v}else{let x=e.node(v.parentId);v.y+=g/2,X.info("A regular node XBX1 - using the padding",v.id,"parent",v.parentId,v.width,v.height,v.x,v.y,"offsetY",v.offsetY,"parent",x,x?.offsetY,v),P2(v)}})),e.edges().forEach(function(y){let v=e.edge(y);X.info("Edge "+y.v+" -> "+y.w+": "+JSON.stringify(v),v),v.points.forEach(S=>S.y+=g/2);let x=e.node(y.v);var b=e.node(y.w);let T=yw(h,v,Er,r,x,b,n);gw(v,T)}),e.nodes().forEach(function(y){let v=e.node(y);X.info(y,v.type,v.diff),v.isGroup&&(m=v.diff)}),X.warn("Returning from recursive render XAX",l,m),{elem:l,diff:m}},"recursiveRender"),d$e=o(async(t,e)=>{let r=new cn({multigraph:!0,compound:!0}).setGraph({rankdir:t.direction,nodesep:t.config?.nodeSpacing||t.config?.flowchart?.nodeSpacing||t.nodeSpacing,ranksep:t.config?.rankSpacing||t.config?.flowchart?.rankSpacing||t.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),n=e.select("g");vw(n,t.markers,t.type,t.diagramId),jte(),Yte(),zte(),Toe(),t.nodes.forEach(a=>{r.setNode(a.id,{...a}),a.parentId&&r.setParent(a.id,a.parentId)}),X.debug("Edges:",t.edges),t.edges.forEach(a=>{if(a.start===a.end){let s=a.start,l=s+"---"+s+"---1",u=s+"---"+s+"---2",h=r.node(s);r.setNode(l,{domId:l,id:l,parentId:h.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),r.setParent(l,h.parentId),r.setNode(u,{domId:u,id:u,parentId:h.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),r.setParent(u,h.parentId);let f=structuredClone(a),d=structuredClone(a),p=structuredClone(a);f.label="",f.arrowTypeEnd="none",f.id=s+"-cyclic-special-1",d.arrowTypeStart="none",d.arrowTypeEnd="none",d.id=s+"-cyclic-special-mid",p.label="",h.isGroup&&(f.fromCluster=s,p.toCluster=s),p.id=s+"-cyclic-special-2",p.arrowTypeStart="none",r.setEdge(s,l,f,s+"-cyclic-special-0"),r.setEdge(l,u,d,s+"-cyclic-special-1"),r.setEdge(u,s,p,s+"-cyct.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},"n"),e:o(function(u){throw u},"e"),f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a,s=!0,l=!1;return{s:o(function(){r=r.call(t)},"s"),n:o(function(){var u=r.next();return s=u.done,u},"n"),e:o(function(u){l=!0,a=u},"e"),f:o(function(){try{s||r.return==null||r.return()}finally{if(l)throw a}},"f")}}function sue(t,e,r){return(e=oue(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function y$e(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)}function v$e(t,e){var r=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator]||t["@@iterator"];if(r!=null){var n,i,a,s,l=[],u=!0,h=!1;try{if(a=(r=r.call(t)).next,e===0){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=a.call(r)).done)&&(l.push(n.value),l.length!==e);u=!0);}catch(f){h=!0,i=f}finally{try{if(!u&&r.return!=null&&(s=r.return(),Object(s)!==s))return}finally{if(h)throw i}}return l}}function x$e(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function b$e(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function _i(t,e){return p$e(t)||v$e(t,e)||cI(t,e)||x$e()}function Xk(t){return m$e(t)||y$e(t)||cI(t)||b$e()}function T$e(t,e){if(typeof t!="object"||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var n=r.call(t,e);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}function oue(t){var e=T$e(t,"string");return typeof e=="symbol"?e:e+""}function $i(t){"@babel/helpers - typeof";return $i=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},$i(t)}function cI(t,e){if(t){if(typeof t=="string")return UM(t,e);var r={}.toString.call(t).slice(8,-1);return r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set"?Array.from(t):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?UM(t,e):void 0}}function gx(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function yx(){if(Ioe)return dN;Ioe=1;function t(e){var r=typeof e;return e!=null&&(r=="object"||r=="function")}return o(t,"isObject"),dN=t,dN}function H$e(){if(Ooe)return pN;Ooe=1;var t=typeof Ek=="object"&&Ek&&Ek.Object===Object&&Ek;return pN=t,pN}function cE(){if(Poe)return mN;Poe=1;var t=H$e(),e=typeof self=="object"&&self&&self.Object===Object&&self,r=t||e||Function("return this")();return mN=r,mN}function q$e(){if(Boe)return gN;Boe=1;var t=cE(),e=o(function(){return t.Date.now()},"now");return gN=e,gN}function W$e(){if(Foe)return yN;Foe=1;var t=/\s/;function e(r){for(var n=r.length;n--&&t.test(r.charAt(n)););return n}return o(e,"trimmedEndIndex"),yN=e,yN}function Y$e(){if($oe)return vN;$oe=1;var t=W$e(),e=/^\s+/;function r(n){return n&&n.slice(0,t(n)+1).replace(e,"")}return o(r,"baseTrim"),vN=r,vN}function fI(){if(zoe)return xN;zoe=1;var t=cE(),e=t.Symbol;return xN=e,xN}function X$e(){if(Goe)return bN;Goe=1;var t=fI(),e=Object.prototype,r=e.hasOwnProperty,n=e.toString,i=t?t.toStringTag:void 0;function a(s){var l=r.call(s,i),u=s[i];try{s[i]=void 0;var h=!0}catch{}var f=n.call(s);return h&&(l?s[i]=u:delete s[i]),f}return o(a,"getRawTag"),bN=a,bN}function j$e(){if(Voe)return TN;Voe=1;var t=Object.prototype,e=t.toString;function r(n){return e.call(n)}return o(r,"objectToString"),TN=r,TN}function gue(){if(Uoe)return wN;Uoe=1;var t=fI(),e=X$e(),r=j$e(),n="[object Null]",i="[object Undefined]",a=t?t.toStringTag:void 0;function s(l){return l==null?l===void 0?i:n:a&&a in Object(l)?e(l):r(l)}return o(s,"baseGetTag"),wN=s,wN}function K$e(){if(Hoe)return kN;Hoe=1;function t(e){return e!=null&&typeof e=="object"}return o(t,"isObjectLike"),kN=t,kN}function vx(){if(qoe)return EN;qoe=1;var t=gue(),e=K$e(),r="[object Symbol]";function n(i){return typeof i=="symbol"||e(i)&&t(i)==r}return o(n,"isSymbol"),EN=n,EN}function Q$e(){if(Woe)return SN;Woe=1;var t=Y$e(),e=yx(),r=vx(),n=NaN,i=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,s=/^0o[0-7]+$/i,l=parseInt;function u(h){if(typeof h=="number")return h;if(r(h))return n;if(e(h)){var f=typeof h.valueOf=="function"?h.valueOf():h;h=e(f)?f+"":f}if(typeof h!="string")return h===0?h:+h;h=t(h);var d=a.test(h);return d||s.test(h)?l(h.slice(2),d?2:8):i.test(h)?n:+h}return o(u,"toNumber"),SN=u,SN}function Z$e(){if(Yoe)return CN;Yoe=1;var t=yx(),e=q$e(),r=Q$e(),n="Expected a function",i=Math.max,a=Math.min;function s(l,u,h){var f,d,p,m,g,y,v=0,x=!1,b=!1,T=!0;if(typeof l!="function")throw new TypeError(n);u=r(u)||0,t(h)&&(x=!!h.leading,b="maxWait"in h,p=b?i(r(h.maxWait)||0,u):p,T="trailing"in h?!!h.trailing:T);function S(D){var _=f,O=d;return f=d=void 0,v=D,m=l.apply(O,_),m}o(S,"invokeFunc");function w(D){return v=D,g=setTimeout(C,u),x?S(D):m}o(w,"leadingEdge");function k(D){var _=D-y,O=D-v,M=u-_;return b?a(M,p-O):M}o(k,"remainingWait");function A(D){var _=D-y,O=D-v;return y===void 0||_>=u||_<0||b&&O>=p}o(A,"shouldInvoke");function C(){var D=e();if(A(D))return R(D);g=setTimeout(C,k(D))}o(C,"timerExpired");function R(D){return g=void 0,T&&f?S(D):(f=d=void 0,m)}o(R,"trailingEdge");function I(){g!==void 0&&clearTimeout(g),v=0,f=y=d=g=void 0}o(I,"cancel");function L(){return g===void 0?m:R(e())}o(L,"flush");function E(){var D=e(),_=A(D);if(f=arguments,d=this,y=D,_){if(g===void 0)return w(y);if(b)return clearTimeout(g),g=setTimeout(C,u),S(y)}return g===void 0&&(g=setTimeout(C,u)),m}return o(E,"debounced"),E.cancel=I,E.flush=L,E}return o(s,"debounce"),CN=s,CN}function nze(t,e,r,n,i){var a=i*Math.PI/180,s=Math.cos(a)*(t-r)-Math.sin(a)*(e-n)+r,l=Math.sin(a)*(t-r)+Math.cos(a)*(e-n)+n;return{x:s,y:l}}function aze(t,e,r){if(r===0)return t;var n=(e.x1+e.x2)/2,i=(e.y1+e.y2)/2,a=e.w/e.h,s=1/a,l=nze(t.x,t.y,n,i,r),u=ize(l.x,l.y,n,i,a,s);return{x:u.x,y:u.y}}function gze(){return Zoe||(Zoe=1,(function(t,e){(function(){var r,n,i,a,s,l,u,h,f,d,p,m,g,y,v;i=Math.floor,d=Math.min,n=o(function(x,b){return xb?1:0},"defaultCmp"),f=o(function(x,b,T,S,w){var k;if(T==null&&(T=0),w==null&&(w=n),T<0)throw new Error("lo must be non-negative");for(S==null&&(S=x.length);TI;0<=I?R++:R--)C.push(R);return C}).apply(this).reverse(),A=[],S=0,w=k.length;SL;0<=L?++C:--C)E.push(s(x,T));return E},"nsmallest"),y=o(function(x,b,T,S){var w,k,A;for(S==null&&(S=n),w=x[T];T>b;){if(A=T-1>>1,k=x[A],S(w,k)<0){x[T]=k,T=A;continue}break}return x[T]=w},"_siftdown"),v=o(function(x,b,T){var S,w,k,A,C;for(T==null&&(T=n),w=x.length,C=b,k=x[b],S=2*b+1;S-1}return o(e,"listCacheHas"),tM=e,tM}function cVe(){if($le)return rM;$le=1;var t=mE();function e(r,n){var i=this.__data__,a=t(i,r);return a<0?(++this.size,i.push([r,n])):i[a][1]=n,this}return o(e,"listCacheSet"),rM=e,rM}function uVe(){if(zle)return nM;zle=1;var t=aVe(),e=sVe(),r=oVe(),n=lVe(),i=cVe();function a(s){var l=-1,u=s==null?0:s.length;for(this.clear();++l-1&&n%1==0&&n0;){var f=i.shift();e(f),a.add(f.id()),l&&n(i,a,f)}return t}function Yue(t,e,r){if(r.isParent())for(var n=r._private.children,i=0;i0&&arguments[0]!==void 0?arguments[0]:bUe,e=arguments.length>1?arguments[1]:void 0,r=0;r0?E=_:L=_;while(Math.abs(D)>s&&++O=a?b(I,O):M===0?O:S(I,L,L+h)}o(w,"getTForX");var k=!1;function A(){k=!0,(t!==e||r!==n)&&T()}o(A,"precompute");var C=o(function(L){return k||A(),t===e&&r===n?L:L===0?0:L===1?1:v(w(L),e,n)},"f");C.getControlPoints=function(){return[{x:t,y:e},{x:r,y:n}]};var R="generateBezier("+[t,e,r,n]+")";return C.toString=function(){return R},C}function Dce(t,e,r,n,i){if(n===1||e===r)return r;var a=i(e,r,n);return t==null||((t.roundValue||t.color)&&(a=Math.round(a)),t.min!==void 0&&(a=Math.max(a,t.min)),t.max!==void 0&&(a=Math.min(a,t.max))),a}function Lce(t,e){return t.pfValue!=null||t.value!=null?t.pfValue!=null&&(e==null||e.type.units!=="%")?t.pfValue:t.value:t}function jm(t,e,r,n,i){var a=i!=null?i.type:null;r<0?r=0:r>1&&(r=1);var s=Lce(t,i),l=Lce(e,i);if(At(s)&&At(l))return Dce(a,s,l,r,n);if(An(s)&&An(l)){for(var u=[],h=0;h0?(m==="spring"&&g.push(s.duration),s.easingImpl=Vk[m].apply(null,g)):s.easingImpl=Vk[m]}var y=s.easingImpl,v;if(s.duration===0?v=1:v=(r-u)/s.duration,s.applying&&(v=s.progress),v<0?v=0:v>1&&(v=1),s.delay==null){var x=s.startPosition,b=s.position;if(b&&i&&!t.locked()){var T={};X2(x.x,b.x)&&(T.x=jm(x.x,b.x,v,y)),X2(x.y,b.y)&&(T.y=jm(x.y,b.y,v,y)),t.position(T)}var S=s.startPan,w=s.pan,k=a.pan,A=w!=null&&n;A&&(X2(S.x,w.x)&&(k.x=jm(S.x,w.x,v,y)),X2(S.y,w.y)&&(k.y=jm(S.y,w.y,v,y)),t.emit("pan"));var C=s.startZoom,R=s.zoom,I=R!=null&&n;I&&(X2(C,R)&&(a.zoom=ox(a.minZoom,jm(C,R,v,y),a.maxZoom)),t.emit("zoom")),(A||I)&&t.emit("viewport");var L=s.style;if(L&&L.length>0&&i){for(var E=0;E=0;A--){var C=k[A];C()}k.splice(0,k.length)},"callbacks"),b=m.length-1;b>=0;b--){var T=m[b],S=T._private;if(S.stopped){m.splice(b,1),S.hooked=!1,S.playing=!1,S.started=!1,x(S.frames);continue}!S.playing&&!S.applying||(S.playing&&S.applying&&(S.applying=!1),S.started||IUe(f,T,t),MUe(f,T,t,d),S.applying&&(S.applying=!1),x(S.frames),S.step!=null&&S.step(t),T.completed()&&(m.splice(b,1),S.hooked=!1,S.playing=!1,S.started=!1,x(S.completes)),y=!0)}return!d&&m.length===0&&g.length===0&&n.push(f),y}o(i,"stepOne");for(var a=!1,s=0;s0?e.notify("draw",r):e.notify("draw")),r.unmerge(n),e.emit("step")}function hhe(t){this.options=ir({},VUe,UUe,t)}function fhe(t){this.options=ir({},HUe,t)}function dhe(t){this.options=ir({},qUe,t)}function kE(t){this.options=ir({},WUe,t),this.options.layout=this;var e=this.options.eles.nodes(),r=this.options.eles.edges(),n=r.filter(function(i){var a=i.source().data("id"),s=i.target().data("id"),l=e.some(function(h){return h.data("id")===a}),u=e.some(function(h){return h.data("id")===s});return!l||!u});this.options.eles=this.options.eles.not(n)}function yhe(t){this.options=ir({},oHe,t)}function _I(t){this.options=ir({},lHe,t)}function vhe(t){this.options=ir({},cHe,t)}function xhe(t){this.options=ir({},uHe,t)}function bhe(t){this.options=t,this.notifications=0}function khe(t,e){e.radius===0?t.lineTo(e.cx,e.cy):t.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}function LI(t,e,r,n){var i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return n===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(dHe(t,e,r,n,i),{cx:eI,cy:tI,radius:gp,startX:The,startY:whe,stopX:rI,stopY:nI,startAngle:Ic.ang+Math.PI/2*vp,endAngle:Yo.ang-Math.PI/2*vp,counterClockwise:qk})}function Ehe(t){var e=[];if(t!=null){for(var r=0;r5&&arguments[5]!==void 0?arguments[5]:5,s=Math.min(a,n/2,i/2);t.beginPath(),t.moveTo(e+s,r),t.lineTo(e+n-s,r),t.quadraticCurveTo(e+n,r,e+n,r+s),t.lineTo(e+n,r+i-s),t.quadraticCurveTo(e+n,r+i,e+n-s,r+i),t.lineTo(e+s,r+i),t.quadraticCurveTo(e,r+i,e,r+i-s),t.lineTo(e,r+s),t.quadraticCurveTo(e,r,e+s,r),t.closePath()}function Qce(t,e,r){var n=t.createShader(e);if(t.shaderSource(n,r),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new Error(t.getShaderInfoLog(n));return n}function rqe(t,e,r){var n=Qce(t,t.VERTEX_SHADER,e),i=Qce(t,t.FRAGMENT_SHADER,r),a=t.createProgram();if(t.attachShader(a,n),t.attachShader(a,i),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS))throw new Error("Could not initialize shaders");return a}function nqe(t,e,r){r===void 0&&(r=e);var n=t.makeOffscreenCanvas(e,r),i=n.context=n.getContext("2d");return n.clear=function(){return i.clearRect(0,0,n.width,n.height)},n.clear(),n}function MI(t){var e=t.pixelRatio,r=t.cy.zoom(),n=t.cy.pan();return{zoom:r*e,pan:{x:n.x*e,y:n.y*e}}}function iqe(t){var e=t.pixelRatio,r=t.cy.zoom();return r*e}function aqe(t,e,r,n,i){var a=n*r+e.x,s=i*r+e.y;return s=Math.round(t.canvasHeight-s),[a,s]}function sqe(t){return t.pstyle("background-fill").value!=="solid"||t.pstyle("background-image").strValue!=="none"?!1:t.pstyle("border-width").value===0||t.pstyle("border-opacity").value===0?!0:t.pstyle("border-style").value==="solid"}function oqe(t,e){if(t.length!==e.length)return!1;for(var r=0;r>0&255)/255,r[1]=(t>>8&255)/255,r[2]=(t>>16&255)/255,r[3]=(t>>24&255)/255,r}function lqe(t){return t[0]+(t[1]<<8)+(t[2]<<16)+(t[3]<<24)}function cqe(t,e){var r=t.createTexture();return r.buffer=function(n){t.bindTexture(t.TEXTURE_2D,r),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_NEAREST),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,n),t.generateMipmap(t.TEXTURE_2D),t.bindTexture(t.TEXTURE_2D,null)},r.deleteTexture=function(){t.deleteTexture(r)},r}function Bhe(t,e){switch(e){case"float":return[1,t.FLOAT,4];case"vec2":return[2,t.FLOAT,4];case"vec3":return[3,t.FLOAT,4];case"vec4":return[4,t.FLOAT,4];case"int":return[1,t.INT,4];case"ivec2":return[2,t.INT,4]}}function Fhe(t,e,r){switch(e){case t.FLOAT:return new Float32Array(r);case t.INT:return new Int32Array(r)}}function uqe(t,e,r,n,i,a){switch(e){case t.FLOAT:return new Float32Array(r.buffer,a*n,i);case t.INT:return new Int32Array(r.buffer,a*n,i)}}function hqe(t,e,r,n){var i=Bhe(t,e),a=_i(i,2),s=a[0],l=a[1],u=Fhe(t,l,n),h=t.createBuffer();return t.bindBuffer(t.ARRAY_BUFFER,h),t.bufferData(t.ARRAY_BUFFER,u,t.STATIC_DRAW),l===t.FLOAT?t.vertexAttribPointer(r,s,l,!1,0,0):l===t.INT&&t.vertexAttribIPointer(r,s,l,0,0),t.enableVertexAttribArray(r),t.bindBuffer(t.ARRAY_BUFFER,null),h}function Mc(t,e,r,n){var i=Bhe(t,r),a=_i(i,3),s=a[0],l=a[1],u=a[2],h=Fhe(t,l,e*s),f=s*u,d=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,d),t.bufferData(t.ARRAY_BUFFER,e*f,t.DYNAMIC_DRAW),t.enableVertexAttribArray(n),l===t.FLOAT?t.vertexAttribPointer(n,s,l,!1,f,0):l===t.INT&&t.vertexAttribIPointer(n,s,l,f,0),t.vertexAttribDivisor(n,1),t.bindBuffer(t.ARRAY_BUFFER,null);for(var p=new Array(e),m=0;mNhe?(_qe(t),e.call(t,a)):(Dqe(t),Vhe(t,a,nx.SCREEN)))}}{var r=t.matchCanvasSize;t.matchCanvasSize=function(a){r.call(t,a),t.pickingFrameBuffer.setFramebufferAttachmentSizes(t.canvasWidth,t.canvasHeight),t.pickingFrameBuffer.needsDraw=!0}}t.findNearestElements=function(a,s,l,u){return Oqe(t,a,s)};{var n=t.invalidateCachedZSortedEles;t.invalidateCachedZSortedEles=function(){n.call(t),t.pickingFrameBuffer.needsDraw=!0}}{var i=t.notify;t.notify=function(a,s){i.call(t,a,s),a==="viewport"||a==="bounds"?t.pickingFrameBuffer.needsDraw=!0:a==="background"&&t.drawing.invalidate(s,{type:"node-body"})}}}function _qe(t){var e=t.data.contexts[t.WEBGL];e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function Dqe(t){var e=o(function(n){n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,t.canvasWidth,t.canvasHeight),n.restore()},"clear");e(t.data.contexts[t.NODE]),e(t.data.contexts[t.DRAG])}function Lqe(t){var e=t.canvasWidth,r=t.canvasHeight,n=MI(t),i=n.pan,a=n.zoom,s=BM();Yk(s,s,[i.x,i.y]),aI(s,s,[a,a]);var l=BM();mqe(l,e,r);var u=BM();return pqe(u,l,s),u}function Ghe(t,e){var r=t.canvasWidth,n=t.canvasHeight,i=MI(t),a=i.pan,s=i.zoom;e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,r,n),e.translate(a.x,a.y),e.scale(s,s)}function Rqe(t,e){t.drawSelectionRectangle(e,function(r){return Ghe(t,r)})}function Nqe(t){var e=t.data.contexts[t.NODE];e.save(),Ghe(t,e),e.strokeStyle="rgba(0, 0, 0, 0.3)",e.beginPath(),e.moveTo(-1e3,0),e.lineTo(1e3,0),e.stroke(),e.beginPath(),e.moveTo(0,-1e3),e.lineTo(0,1e3),e.stroke(),e.restore()}function Mqe(t){var e=o(function(i,a,s){for(var l=i.atlasManager.getAtlasCollection(a),u=t.data.contexts[t.NODE],h=l.atlases,f=0;f=0&&S.add(A)}return S}function Oqe(t,e,r){var n=Iqe(t,e,r),i=t.getCachedZSortedEles(),a,s,l=qs(n),u;try{for(l.s();!(u=l.n()).done;){var h=u.value,f=i[h];if(!a&&f.isNode()&&(a=f),!s&&f.isEdge()&&(s=f),a&&s)break}}catch(d){l.e(d)}finally{l.f()}return[a,s].filter(Boolean)}function VM(t,e,r){var n=t.drawing;e+=1,r.isNode()?(n.drawNode(r,e,"node-underlay"),n.drawNode(r,e,"node-body"),n.drawTexture(r,e,"label"),n.drawNode(r,e,"node-overlay")):(n.drawEdgeLine(r,e),n.drawEdgeArrow(r,e,"source"),n.drawEdgeArrow(r,e,"target"),n.drawTexture(r,e,"label"),n.drawTexture(r,e,"edge-source-label"),n.drawTexture(r,e,"edge-target-label"))}function Vhe(t,e,r){var n;t.webglDebug&&(n=performance.now());var i=t.drawing,a=0;if(r.screen&&t.data.canvasNeedsRedraw[t.SELECT_BOX]&&Rqe(t,e),t.data.canvasNeedsRedraw[t.NODE]||r.picking){var s=t.data.contexts[t.WEBGL];r.screen?(s.clearColor(0,0,0,0),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE_MINUS_SRC_ALPHA)):s.disable(s.BLEND),s.clear(s.COLOR_BUFFER_BIT|s.DEPTH_BUFFER_BIT),s.viewport(0,0,s.canvas.width,s.canvas.height);var l=Lqe(t),u=t.getCachedZSortedEles();if(a=u.length,i.startFrame(l,r),r.screen){for(var h=0;h{"use strict";o(UM,"_arrayLikeToArray");o(p$e,"_arrayWithHoles");o(m$e,"_arrayWithoutHoles");o(Af,"_classCallCheck");o(g$e,"_defineProperties");o(_f,"_createClass");o(qs,"_createForOfIteratorHelper");o(sue,"_defineProperty$1");o(y$e,"_iterableToArray");o(v$e,"_iterableToArrayLimit");o(x$e,"_nonIterableRest");o(b$e,"_nonIterableSpread");o(_i,"_slicedToArray");o(Xk,"_toConsumableArray");o(T$e,"_toPrimitive");o(oue,"_toPropertyKey");o($i,"_typeof");o(cI,"_unsupportedIterableToArray");Bi=typeof window>"u"?null:window,Noe=Bi?Bi.navigator:null;Bi&&Bi.document;w$e=$i(""),lue=$i({}),k$e=$i(function(){}),E$e=typeof HTMLElement>"u"?"undefined":$i(HTMLElement),px=o(function(e){return e&&e.instanceString&&oi(e.instanceString)?e.instanceString():null},"instanceStr"),Jt=o(function(e){return e!=null&&$i(e)==w$e},"string"),oi=o(function(e){return e!=null&&$i(e)===k$e},"fn"),An=o(function(e){return!fo(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},"array"),Yr=o(function(e){return e!=null&&$i(e)===lue&&!An(e)&&e.constructor===Object},"plainObject"),S$e=o(function(e){return e!=null&&$i(e)===lue},"object"),At=o(function(e){return e!=null&&$i(e)===$i(1)&&!isNaN(e)},"number"),C$e=o(function(e){return At(e)&&Math.floor(e)===e},"integer"),jk=o(function(e){if(E$e!=="undefined")return e!=null&&e instanceof HTMLElement},"htmlElement"),fo=o(function(e){return mx(e)||cue(e)},"elementOrCollection"),mx=o(function(e){return px(e)==="collection"&&e._private.single},"element"),cue=o(function(e){return px(e)==="collection"&&!e._private.single},"collection"),uI=o(function(e){return px(e)==="core"},"core"),uue=o(function(e){return px(e)==="stylesheet"},"stylesheet"),A$e=o(function(e){return px(e)==="event"},"event"),Tf=o(function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},"emptyString"),_$e=o(function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},"domElement"),D$e=o(function(e){return Yr(e)&&At(e.x1)&&At(e.x2)&&At(e.y1)&&At(e.y2)},"boundingBox"),L$e=o(function(e){return S$e(e)&&oi(e.then)},"promise"),R$e=o(function(){return Noe&&Noe.userAgent.match(/msie|trident|edge/i)},"ms"),lg=o(function(e,r){r||(r=o(function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var a=[],s=0;sr?1:0},"ascending"),F$e=o(function(e,r){return-1*fue(e,r)},"descending"),ir=Object.assign!=null?Object.assign.bind(Object):function(t){for(var e=arguments,r=1;r1&&(v-=1),v<1/6?g+(y-g)*6*v:v<1/2?y:v<2/3?g+(y-g)*(2/3-v)*6:g}o(f,"hue2rgb");var d=new RegExp("^"+I$e+"$").exec(e);if(d){if(n=parseInt(d[1]),n<0?n=(360- -1*n%360)%360:n>360&&(n=n%360),n/=360,i=parseFloat(d[2]),i<0||i>100||(i=i/100,a=parseFloat(d[3]),a<0||a>100)||(a=a/100,s=d[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(i===0)l=u=h=Math.round(a*255);else{var p=a<.5?a*(1+i):a+i-a*i,m=2*a-p;l=Math.round(255*f(m,p,n+1/3)),u=Math.round(255*f(m,p,n)),h=Math.round(255*f(m,p,n-1/3))}r=[l,u,h,s]}return r},"hsl2tuple"),G$e=o(function(e){var r,n=new RegExp("^"+N$e+"$").exec(e);if(n){r=[];for(var i=[],a=1;a<=3;a++){var s=n[a];if(s[s.length-1]==="%"&&(i[a]=!0),s=parseFloat(s),i[a]&&(s=s/100*255),s<0||s>255)return;r.push(Math.floor(s))}var l=i[1]||i[2]||i[3],u=i[1]&&i[2]&&i[3];if(l&&!u)return;var h=n[4];if(h!==void 0){if(h=parseFloat(h),h<0||h>1)return;r.push(h)}}return r},"rgb2tuple"),V$e=o(function(e){return U$e[e.toLowerCase()]},"colorname2tuple"),due=o(function(e){return(An(e)?e:null)||V$e(e)||$$e(e)||G$e(e)||z$e(e)},"color2tuple"),U$e={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},pue=o(function(e){for(var r=e.map,n=e.keys,i=n.length,a=0;a1&&arguments[1]!==void 0?arguments[1]:yp,n=r,i;i=e.next(),!i.done;)n=n*vue+i.value|0;return n},"hashIterableInts"),ix=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:yp;return r*vue+e|0},"hashInt"),ax=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:eg;return(r<<5)+r+e|0},"hashIntAlt"),tze=o(function(e,r){return e*2097152+r},"combineHashes"),df=o(function(e){return e[0]*2097152+e[1]},"combineHashesArray"),Sk=o(function(e,r){return[ix(e[0],r[0]),ax(e[1],r[1])]},"hashArrays"),Xoe=o(function(e,r){var n={value:0,done:!1},i=0,a=e.length,s={next:o(function(){return i=0;i--)e[i]===r&&e.splice(i,1)},"removeFromArray"),mI=o(function(e){e.splice(0,e.length)},"clearArray"),hze=o(function(e,r){for(var n=0;n"u"?"undefined":$i(Set))!==dze?Set:pze,uE=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||r===void 0||!uI(e)){Kn("An element must have a core reference and parameters set");return}var i=r.group;if(i==null&&(r.data&&r.data.source!=null&&r.data.target!=null?i="edges":i="nodes"),i!=="nodes"&&i!=="edges"){Kn("An element must be of type `nodes` or `edges`; you specified `"+i+"`");return}this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:r.data||{},position:r.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:i,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!r.selected,selectable:r.selectable===void 0?!0:!!r.selectable,locked:!!r.locked,grabbed:!1,grabbable:r.grabbable===void 0?!0:!!r.grabbable,pannable:r.pannable===void 0?i==="edges":!!r.pannable,active:!1,classes:new hg,animation:{current:[],queue:[]},rscratch:{},scratch:r.scratch||{},edges:[],children:[],parent:r.parent&&r.parent.isNode()?r.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(a.position.x==null&&(a.position.x=0),a.position.y==null&&(a.position.y=0),r.renderedPosition){var s=r.renderedPosition,l=e.pan(),u=e.zoom();a.position={x:(s.x-l.x)/u,y:(s.y-l.y)/u}}var h=[];An(r.classes)?h=r.classes:Jt(r.classes)&&(h=r.classes.split(/\s+/));for(var f=0,d=h.length;f0;){var k=b.pop(),A=v(k),C=k.id();if(p[C]=A,A!==1/0)for(var R=k.neighborhood().intersect(g),I=0;I0)for(B.unshift(P);d[G];){var $=d[G];B.unshift($.edge),B.unshift($.node),F=$.node,G=F.id()}return l.spawn(B)},"pathTo")}},"dijkstra")},Tze={kruskal:o(function(e){e=e||function(T){return 1};for(var r=this.byGroup(),n=r.nodes,i=r.edges,a=n.length,s=new Array(a),l=n,u=o(function(S){for(var w=0;w0;){if(w(),A++,S===f){for(var C=[],R=a,I=f,L=x[I];C.unshift(R),L!=null&&C.unshift(L),R=v[I],R!=null;)I=R.id(),L=x[I];return{found:!0,distance:d[S],path:this.spawn(C),steps:A}}m[S]=!0;for(var E=T._private.edges,D=0;DL&&(g[I]=L,b[I]=R,T[I]=w),!a){var E=R*f+C;!a&&g[E]>L&&(g[E]=L,b[E]=C,T[E]=w)}}}for(var D=0;D1&&arguments[1]!==void 0?arguments[1]:s,pe=T(q),Be=[],Ye=pe;;){if(Ye==null)return r.spawn();var He=b(Ye),Le=He.edge,Ie=He.pred;if(Be.unshift(Ye[0]),Ye.same(Ve)&&Be.length>0)break;Le!=null&&Be.unshift(Le),Ye=Ie}return u.spawn(Be)},"pathTo"),k=0;k=0;f--){var d=h[f],p=d[1],m=d[2];(r[p]===l&&r[m]===u||r[p]===u&&r[m]===l)&&h.splice(f,1)}for(var g=0;gi;){var a=Math.floor(Math.random()*r.length);r=Dze(a,e,r),n--}return r},"contractUntil"),Lze={kargerStein:o(function(){var e=this,r=this.byGroup(),n=r.nodes,i=r.edges;i.unmergeBy(function(B){return B.isLoop()});var a=n.length,s=i.length,l=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),u=Math.floor(a/_ze);if(a<2){Kn("At least 2 nodes are required for Karger-Stein algorithm");return}for(var h=[],f=0;f1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=-1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=0,a=0,s=r;s1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;i?e=e.slice(r,n):(n0&&e.splice(0,r));for(var l=0,u=e.length-1;u>=0;u--){var h=e[u];s?isFinite(h)||(e[u]=-1/0,l++):e.splice(u,1)}a&&e.sort(function(p,m){return p-m});var f=e.length,d=Math.floor(f/2);return f%2!==0?e[d+1+l]:(e[d-1+l]+e[d+l])/2},"median"),Pze=o(function(e){return Math.PI*e/180},"deg2rad"),Ck=o(function(e,r){return Math.atan2(r,e)-Math.PI/2},"getAngleFromDisp"),gI=Math.log2||function(t){return Math.log(t)/Math.log(2)},yI=o(function(e){return e>0?1:e<0?-1:0},"signum"),Tp=o(function(e,r){return Math.sqrt(mp(e,r))},"dist"),mp=o(function(e,r){var n=r.x-e.x,i=r.y-e.y;return n*n+i*i},"sqdist"),Bze=o(function(e){for(var r=e.length,n=0,i=0;i=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},"makeBoundingBox"),$ze=o(function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},"copyBoundingBox"),zze=o(function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},"clearBoundingBox"),Gze=o(function(e,r){e.x1=Math.min(e.x1,r.x1),e.x2=Math.max(e.x2,r.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,r.y1),e.y2=Math.max(e.y2,r.y2),e.h=e.y2-e.y1},"updateBoundingBox"),Cue=o(function(e,r,n){e.x1=Math.min(e.x1,r),e.x2=Math.max(e.x2,r),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},"expandBoundingBoxByPoint"),Fk=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=r,e.x2+=r,e.y1-=r,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBox"),$k=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],n,i,a,s;if(r.length===1)n=i=a=s=r[0];else if(r.length===2)n=a=r[0],s=i=r[1];else if(r.length===4){var l=_i(r,4);n=l[0],i=l[1],a=l[2],s=l[3]}return e.x1-=s,e.x2+=i,e.y1-=n,e.y2+=a,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBoxSides"),ele=o(function(e,r){e.x1=r.x1,e.y1=r.y1,e.x2=r.x2,e.y2=r.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},"assignBoundingBox"),vI=o(function(e,r){return!(e.x1>r.x2||r.x1>e.x2||e.x2r.y2||r.y1>e.y2)},"boundingBoxesIntersect"),yf=o(function(e,r,n){return e.x1<=r&&r<=e.x2&&e.y1<=n&&n<=e.y2},"inBoundingBox"),tle=o(function(e,r){return yf(e,r.x,r.y)},"pointInBoundingBox"),Aue=o(function(e,r){return yf(e,r.x1,r.y1)&&yf(e,r.x2,r.y2)},"boundingBoxInBoundingBox"),Vze=(LN=Math.hypot)!==null&&LN!==void 0?LN:function(t,e){return Math.sqrt(t*t+e*e)};o(Uze,"inflatePolygon");o(Hze,"miterBox");_ue=o(function(e,r,n,i,a,s,l){var u=arguments.length>7&&arguments[7]!==void 0?arguments[7]:"auto",h=u==="auto"?kf(a,s):u,f=a/2,d=s/2;h=Math.min(h,f,d);var p=h!==f,m=h!==d,g;if(p){var y=n-f+h-l,v=i-d-l,x=n+f-h+l,b=v;if(g=vf(e,r,n,i,y,v,x,b,!1),g.length>0)return g}if(m){var T=n+f+l,S=i-d+h-l,w=T,k=i+d-h+l;if(g=vf(e,r,n,i,T,S,w,k,!1),g.length>0)return g}if(p){var A=n-f+h-l,C=i+d+l,R=n+f-h+l,I=C;if(g=vf(e,r,n,i,A,C,R,I,!1),g.length>0)return g}if(m){var L=n-f-l,E=i-d+h-l,D=L,_=i+d-h+l;if(g=vf(e,r,n,i,L,E,D,_,!1),g.length>0)return g}var O;{var M=n-f+h,P=i-d+h;if(O=Z2(e,r,n,i,M,P,h+l),O.length>0&&O[0]<=M&&O[1]<=P)return[O[0],O[1]]}{var B=n+f-h,F=i-d+h;if(O=Z2(e,r,n,i,B,F,h+l),O.length>0&&O[0]>=B&&O[1]<=F)return[O[0],O[1]]}{var G=n+f-h,$=i+d-h;if(O=Z2(e,r,n,i,G,$,h+l),O.length>0&&O[0]>=G&&O[1]>=$)return[O[0],O[1]]}{var U=n-f+h,j=i+d-h;if(O=Z2(e,r,n,i,U,j,h+l),O.length>0&&O[0]<=U&&O[1]>=j)return[O[0],O[1]]}return[]},"roundRectangleIntersectLine"),qze=o(function(e,r,n,i,a,s,l){var u=l,h=Math.min(n,a),f=Math.max(n,a),d=Math.min(i,s),p=Math.max(i,s);return h-u<=e&&e<=f+u&&d-u<=r&&r<=p+u},"inLineVicinity"),Wze=o(function(e,r,n,i,a,s,l,u,h){var f={x1:Math.min(n,l,a)-h,x2:Math.max(n,l,a)+h,y1:Math.min(i,u,s)-h,y2:Math.max(i,u,s)+h};return!(ef.x2||rf.y2)},"inBezierVicinity"),Yze=o(function(e,r,n,i){n-=i;var a=r*r-4*e*n;if(a<0)return[];var s=Math.sqrt(a),l=2*e,u=(-r+s)/l,h=(-r-s)/l;return[u,h]},"solveQuadratic"),Xze=o(function(e,r,n,i,a){var s=1e-5;e===0&&(e=s),r/=e,n/=e,i/=e;var l,u,h,f,d,p,m,g;if(u=(3*n-r*r)/9,h=-(27*i)+r*(9*n-2*(r*r)),h/=54,l=u*u*u+h*h,a[1]=0,m=r/3,l>0){d=h+Math.sqrt(l),d=d<0?-Math.pow(-d,1/3):Math.pow(d,1/3),p=h-Math.sqrt(l),p=p<0?-Math.pow(-p,1/3):Math.pow(p,1/3),a[0]=-m+d+p,m+=(d+p)/2,a[4]=a[2]=-m,m=Math.sqrt(3)*(-p+d)/2,a[3]=m,a[5]=-m;return}if(a[5]=a[3]=0,l===0){g=h<0?-Math.pow(-h,1/3):Math.pow(h,1/3),a[0]=-m+2*g,a[4]=a[2]=-(g+m);return}u=-u,f=u*u*u,f=Math.acos(h/Math.sqrt(f)),g=2*Math.sqrt(u),a[0]=-m+g*Math.cos(f/3),a[2]=-m+g*Math.cos((f+2*Math.PI)/3),a[4]=-m+g*Math.cos((f+4*Math.PI)/3)},"solveCubic"),jze=o(function(e,r,n,i,a,s,l,u){var h=1*n*n-4*n*a+2*n*l+4*a*a-4*a*l+l*l+i*i-4*i*s+2*i*u+4*s*s-4*s*u+u*u,f=9*n*a-3*n*n-3*n*l-6*a*a+3*a*l+9*i*s-3*i*i-3*i*u-6*s*s+3*s*u,d=3*n*n-6*n*a+n*l-n*e+2*a*a+2*a*e-l*e+3*i*i-6*i*s+i*u-i*r+2*s*s+2*s*r-u*r,p=1*n*a-n*n+n*e-a*e+i*s-i*i+i*r-s*r,m=[];Xze(h,f,d,p,m);for(var g=1e-7,y=[],v=0;v<6;v+=2)Math.abs(m[v+1])=0&&m[v]<=1&&y.push(m[v]);y.push(1),y.push(0);for(var x=-1,b,T,S,w=0;w=0?Sh?(e-a)*(e-a)+(r-s)*(r-s):f-p},"sqdistToFiniteLine"),Hs=o(function(e,r,n){for(var i,a,s,l,u,h=0,f=0;f=e&&e>=s||i<=e&&e<=s)u=(e-i)/(s-i)*(l-a)+a,u>r&&h++;else continue;return h%2!==0},"pointInsidePolygonPoints"),Vu=o(function(e,r,n,i,a,s,l,u,h){var f=new Array(n.length),d;u[0]!=null?(d=Math.atan(u[1]/u[0]),u[0]<0?d=d+Math.PI/2:d=-d-Math.PI/2):d=u;for(var p=Math.cos(-d),m=Math.sin(-d),g=0;g0){var v=Jk(f,-h);y=Zk(v)}else y=f;return Hs(e,r,y)},"pointInsidePolygon"),Qze=o(function(e,r,n,i,a,s,l,u){for(var h=new Array(n.length*2),f=0;f=0&&v<=1&&b.push(v),x>=0&&x<=1&&b.push(x),b.length===0)return[];var T=b[0]*u[0]+e,S=b[0]*u[1]+r;if(b.length>1){if(b[0]==b[1])return[T,S];var w=b[1]*u[0]+e,k=b[1]*u[1]+r;return[T,S,w,k]}else return[T,S]},"intersectLineCircle"),RN=o(function(e,r,n){return r<=e&&e<=n||n<=e&&e<=r?e:e<=r&&r<=n||n<=r&&r<=e?r:n},"midOfThree"),vf=o(function(e,r,n,i,a,s,l,u,h){var f=e-a,d=n-e,p=l-a,m=r-s,g=i-r,y=u-s,v=p*m-y*f,x=d*m-g*f,b=y*d-p*g;if(b!==0){var T=v/b,S=x/b,w=.001,k=0-w,A=1+w;return k<=T&&T<=A&&k<=S&&S<=A?[e+T*d,r+T*g]:h?[e+T*d,r+T*g]:[]}else return v===0||x===0?RN(e,n,l)===l?[l,u]:RN(e,n,a)===a?[a,s]:RN(a,l,n)===n?[n,i]:[]:[]},"finiteLinesIntersect"),Jze=o(function(e,r,n,i,a){var s=[],l=i/2,u=a/2,h=r,f=n;s.push({x:h+l*e[0],y:f+u*e[1]});for(var d=1;d0){var y=Jk(d,-u);m=Zk(y)}else m=d}else m=n;for(var v,x,b,T,S=0;S2){for(var g=[f[0],f[1]],y=Math.pow(g[0]-e,2)+Math.pow(g[1]-r,2),v=1;vf&&(f=S)},"set"),get:o(function(T){return h[T]},"get")},p=0;p0?O=_.edgesTo(D)[0]:O=D.edgesTo(_)[0];var M=i(O);D=D.id(),A[D]>A[L]+M&&(A[D]=A[L]+M,C.nodes.indexOf(D)<0?C.push(D):C.updateItem(D),k[D]=0,w[D]=[]),A[D]==A[L]+M&&(k[D]=k[D]+k[L],w[D].push(L))}else for(var P=0;P0;){for(var $=S.pop(),U=0;U0&&l.push(n[u]);l.length!==0&&a.push(i.collection(l))}return a},"assign"),pGe=o(function(e,r){for(var n=0;n5&&arguments[5]!==void 0?arguments[5]:yGe,l=i,u,h,f=0;f=2?q2(e,r,n,0,sle,vGe):q2(e,r,n,0,ale)},"euclidean"),squaredEuclidean:o(function(e,r,n){return q2(e,r,n,0,sle)},"squaredEuclidean"),manhattan:o(function(e,r,n){return q2(e,r,n,0,ale)},"manhattan"),max:o(function(e,r,n){return q2(e,r,n,-1/0,xGe)},"max")};cg["squared-euclidean"]=cg.squaredEuclidean;cg.squaredeuclidean=cg.squaredEuclidean;o(fE,"clusteringDistance");bGe=xa({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),bI=o(function(e){return bGe(e)},"setOptions"),eE=o(function(e,r,n,i,a){var s=a!=="kMedoids",l=s?function(d){return n[d]}:function(d){return i[d](n)},u=o(function(p){return i[p](r)},"getQ"),h=n,f=r;return fE(e,i.length,l,u,h,f)},"getDist"),MN=o(function(e,r,n){for(var i=n.length,a=new Array(i),s=new Array(i),l=new Array(r),u=null,h=0;hn)return!1}return!0},"haveMatricesConverged"),kGe=o(function(e,r,n){for(var i=0;il&&(l=r[h][f],u=f);a[u].push(e[h])}for(var d=0;d=a.threshold||a.mode==="dendrogram"&&e.length===1)return!1;var g=r[s],y=r[i[s]],v;a.mode==="dendrogram"?v={left:g,right:y,key:g.key}:v={value:g.value.concat(y.value),key:g.key},e[g.index]=v,e.splice(y.index,1),r[g.key]=v;for(var x=0;xn[y.key][b.key]&&(u=n[y.key][b.key])):a.linkage==="max"?(u=n[g.key][b.key],n[g.key][b.key]0&&i.push(a);return i},"findExemplars"),fle=o(function(e,r,n){for(var i=[],a=0;al&&(s=h,l=r[a*e+h])}s>0&&i.push(s)}for(var f=0;fh&&(u=f,h=d)}n[a]=s[u]}return i=fle(e,r,n),i},"assign"),dle=o(function(e){for(var r=this.cy(),n=this.nodes(),i=OGe(e),a={},s=0;s=L?(E=L,L=_,D=O):_>E&&(E=_);for(var M=0;M0?1:0;A[R%i.minIterations*l+U]=j,$+=j}if($>0&&(R>=i.minIterations-1||R==i.maxIterations-1)){for(var te=0,Y=0;Y1||k>1)&&(l=!0),d[T]=[],b.outgoers().forEach(function(C){C.isEdge()&&d[T].push(C.id())})}else p[T]=[void 0,b.target().id()]}):s.forEach(function(b){var T=b.id();if(b.isNode()){var S=b.degree(!0);S%2&&(u?h?l=!0:h=T:u=T),d[T]=[],b.connectedEdges().forEach(function(w){return d[T].push(w.id())})}else p[T]=[b.source().id(),b.target().id()]});var m={found:!1,trail:void 0};if(l)return m;if(h&&u)if(a){if(f&&h!=f)return m;f=h}else{if(f&&h!=f&&u!=f)return m;f||(f=h)}else f||(f=s[0].id());var g=o(function(T){for(var S=T,w=[T],k,A,C;d[S].length;)k=d[S].shift(),A=p[k][0],C=p[k][1],S!=C?(d[C]=d[C].filter(function(R){return R!=k}),S=C):!a&&S!=A&&(d[A]=d[A].filter(function(R){return R!=k}),S=A),w.unshift(k),w.unshift(S);return w},"walk"),y=[],v=[];for(v=g(f);v.length!=1;)d[v[0]].length==0?(y.unshift(s.getElementById(v.shift())),y.unshift(s.getElementById(v.shift()))):v=g(v.shift()).concat(v);y.unshift(s.getElementById(v.shift()));for(var x in d)if(d[x].length)return m;return m.found=!0,m.trail=this.spawn(y,!0),m},"hierholzer")},_k=o(function(){var e=this,r={},n=0,i=0,a=[],s=[],l={},u=o(function(p,m){for(var g=s.length-1,y=[],v=e.spawn();s[g].x!=p||s[g].y!=m;)y.push(s.pop().edge),g--;y.push(s.pop().edge),y.forEach(function(x){var b=x.connectedNodes().intersection(e);v.merge(x),b.forEach(function(T){var S=T.id(),w=T.connectedEdges().intersection(e);v.merge(T),r[S].cutVertex?v.merge(w.filter(function(k){return k.isLoop()})):v.merge(w)})}),a.push(v)},"buildComponent"),h=o(function(p,m,g){p===g&&(i+=1),r[m]={id:n,low:n++,cutVertex:!1};var y=e.getElementById(m).connectedEdges().intersection(e);if(y.size()===0)a.push(e.spawn(e.getElementById(m)));else{var v,x,b,T;y.forEach(function(S){v=S.source().id(),x=S.target().id(),b=v===m?x:v,b!==g&&(T=S.id(),l[T]||(l[T]=!0,s.push({x:m,y:b,edge:S})),b in r?r[m].low=Math.min(r[m].low,r[b].id):(h(p,b,m),r[m].low=Math.min(r[m].low,r[b].low),r[m].id<=r[b].low&&(r[m].cutVertex=!0,u(m,b))))})}},"biconnectedSearch");e.forEach(function(d){if(d.isNode()){var p=d.id();p in r||(i=0,h(p,p),r[p].cutVertex=i>1)}});var f=Object.keys(r).filter(function(d){return r[d].cutVertex}).map(function(d){return e.getElementById(d)});return{cut:e.spawn(f),components:a}},"hopcroftTarjanBiconnected"),UGe={hopcroftTarjanBiconnected:_k,htbc:_k,htb:_k,hopcroftTarjanBiconnectedComponents:_k},Dk=o(function(){var e=this,r={},n=0,i=[],a=[],s=e.spawn(e),l=o(function(h){a.push(h),r[h]={index:n,low:n++,explored:!1};var f=e.getElementById(h).connectedEdges().intersection(e);if(f.forEach(function(y){var v=y.target().id();v!==h&&(v in r||l(v),r[v].explored||(r[h].low=Math.min(r[h].low,r[v].low)))}),r[h].index===r[h].low){for(var d=e.spawn();;){var p=a.pop();if(d.merge(e.getElementById(p)),r[p].low=r[h].index,r[p].explored=!0,p===h)break}var m=d.edgesWith(d),g=d.merge(m);i.push(g),s=s.difference(g)}},"stronglyConnectedSearch");return e.forEach(function(u){if(u.isNode()){var h=u.id();h in r||l(h)}}),{cut:s,components:i}},"tarjanStronglyConnected"),HGe={tarjanStronglyConnected:Dk,tsc:Dk,tscc:Dk,tarjanStronglyConnectedComponents:Dk},Oue={};[sx,bze,Tze,kze,Sze,Aze,Lze,nGe,ag,sg,WM,gGe,DGe,MGe,zGe,VGe,UGe,HGe].forEach(function(t){ir(Oue,t)});Pue=0,Bue=1,Fue=2,Il=o(function(e){if(!(this instanceof Il))return new Il(e);this.id="Thenable/1.0.7",this.state=Pue,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))},"api");Il.prototype={fulfill:o(function(e){return ple(this,Bue,"fulfillValue",e)},"fulfill"),reject:o(function(e){return ple(this,Fue,"rejectReason",e)},"reject"),then:o(function(e,r){var n=this,i=new Il;return n.onFulfilled.push(gle(e,i,"fulfill")),n.onRejected.push(gle(r,i,"reject")),$ue(n),i.proxy},"then")};ple=o(function(e,r,n,i){return e.state===Pue&&(e.state=r,e[n]=i,$ue(e)),e},"deliver"),$ue=o(function(e){e.state===Bue?mle(e,"onFulfilled",e.fulfillValue):e.state===Fue&&mle(e,"onRejected",e.rejectReason)},"execute"),mle=o(function(e,r,n){if(e[r].length!==0){var i=e[r];e[r]=[];var a=o(function(){for(var l=0;l0},"animatedImpl")},"animated"),clearQueue:o(function(){return o(function(){var r=this,n=r.length!==void 0,i=n?r:[r],a=this._private.cy||this;if(!a.styleEnabled())return this;for(var s=0;s0&&this.spawn(i).updateStyle().emit("class"),r},"classes"),addClass:o(function(e){return this.toggleClass(e,!0)},"addClass"),hasClass:o(function(e){var r=this[0];return r!=null&&r._private.classes.has(e)},"hasClass"),toggleClass:o(function(e,r){An(e)||(e=e.match(/\S+/g)||[]);for(var n=this,i=r===void 0,a=[],s=0,l=n.length;s0&&this.spawn(a).updateStyle().emit("class"),n},"toggleClass"),removeClass:o(function(e){return this.toggleClass(e,!1)},"removeClass"),flashClass:o(function(e,r){var n=this;if(r==null)r=250;else if(r===0)return n;return n.addClass(e),setTimeout(function(){n.removeClass(e)},r),n},"flashClass")};zk.className=zk.classNames=zk.classes;Wr={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:Fi,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Wr.variable="(?:[\\w-.]|(?:\\\\"+Wr.metaChar+"))+";Wr.className="(?:[\\w-]|(?:\\\\"+Wr.metaChar+"))+";Wr.value=Wr.string+"|"+Wr.number;Wr.id=Wr.variable;(function(){var t,e,r;for(t=Wr.comparatorOp.split("|"),r=0;r=0)&&e!=="="&&(Wr.comparatorOp+="|\\!"+e)})();xn=o(function(){return{checks:[]}},"newQuery"),zt={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},KM=[{selector:":selected",matches:o(function(e){return e.selected()},"matches")},{selector:":unselected",matches:o(function(e){return!e.selected()},"matches")},{selector:":selectable",matches:o(function(e){return e.selectable()},"matches")},{selector:":unselectable",matches:o(function(e){return!e.selectable()},"matches")},{selector:":locked",matches:o(function(e){return e.locked()},"matches")},{selector:":unlocked",matches:o(function(e){return!e.locked()},"matches")},{selector:":visible",matches:o(function(e){return e.visible()},"matches")},{selector:":hidden",matches:o(function(e){return!e.visible()},"matches")},{selector:":transparent",matches:o(function(e){return e.transparent()},"matches")},{selector:":grabbed",matches:o(function(e){return e.grabbed()},"matches")},{selector:":free",matches:o(function(e){return!e.grabbed()},"matches")},{selector:":removed",matches:o(function(e){return e.removed()},"matches")},{selector:":inside",matches:o(function(e){return!e.removed()},"matches")},{selector:":grabbable",matches:o(function(e){return e.grabbable()},"matches")},{selector:":ungrabbable",matches:o(function(e){return!e.grabbable()},"matches")},{selector:":animated",matches:o(function(e){return e.animated()},"matches")},{selector:":unanimated",matches:o(function(e){return!e.animated()},"matches")},{selector:":parent",matches:o(function(e){return e.isParent()},"matches")},{selector:":childless",matches:o(function(e){return e.isChildless()},"matches")},{selector:":child",matches:o(function(e){return e.isChild()},"matches")},{selector:":orphan",matches:o(function(e){return e.isOrphan()},"matches")},{selector:":nonorphan",matches:o(function(e){return e.isChild()},"matches")},{selector:":compound",matches:o(function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()},"matches")},{selector:":loop",matches:o(function(e){return e.isLoop()},"matches")},{selector:":simple",matches:o(function(e){return e.isSimple()},"matches")},{selector:":active",matches:o(function(e){return e.active()},"matches")},{selector:":inactive",matches:o(function(e){return!e.active()},"matches")},{selector:":backgrounding",matches:o(function(e){return e.backgrounding()},"matches")},{selector:":nonbackgrounding",matches:o(function(e){return!e.backgrounding()},"matches")}].sort(function(t,e){return F$e(t.selector,e.selector)}),GVe=(function(){for(var t={},e,r=0;r0&&f.edgeCount>0)return hn("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(f.edgeCount>1)return hn("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;f.edgeCount===1&&hn("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},"parse"),YVe=o(function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=o(function(f){return f??""},"clean"),r=o(function(f){return Jt(f)?'"'+f+'"':e(f)},"cleanVal"),n=o(function(f){return" "+f+" "},"space"),i=o(function(f,d){var p=f.type,m=f.value;switch(p){case zt.GROUP:{var g=e(m);return g.substring(0,g.length-1)}case zt.DATA_COMPARE:{var y=f.field,v=f.operator;return"["+y+n(e(v))+r(m)+"]"}case zt.DATA_BOOL:{var x=f.operator,b=f.field;return"["+e(x)+b+"]"}case zt.DATA_EXIST:{var T=f.field;return"["+T+"]"}case zt.META_COMPARE:{var S=f.operator,w=f.field;return"[["+w+n(e(S))+r(m)+"]]"}case zt.STATE:return m;case zt.ID:return"#"+m;case zt.CLASS:return"."+m;case zt.PARENT:case zt.CHILD:return a(f.parent,d)+n(">")+a(f.child,d);case zt.ANCESTOR:case zt.DESCENDANT:return a(f.ancestor,d)+" "+a(f.descendant,d);case zt.COMPOUND_SPLIT:{var k=a(f.left,d),A=a(f.subject,d),C=a(f.right,d);return k+(k.length>0?" ":"")+A+C}case zt.TRUE:return""}},"checkToString"),a=o(function(f,d){return f.checks.reduce(function(p,m,g){return p+(d===f&&g===0?"$":"")+i(m,d)},"")},"queryToString"),s="",l=0;l1&&l=0&&(r=r.replace("!",""),d=!0),r.indexOf("@")>=0&&(r=r.replace("@",""),f=!0),(a||l||f)&&(u=!a&&!s?"":""+e,h=""+n),f&&(e=u=u.toLowerCase(),n=h=h.toLowerCase()),r){case"*=":i=u.indexOf(h)>=0;break;case"$=":i=u.indexOf(h,u.length-h.length)>=0;break;case"^=":i=u.indexOf(h)===0;break;case"=":i=e===n;break;case">":p=!0,i=e>n;break;case">=":p=!0,i=e>=n;break;case"<":p=!0,i=e1&&arguments[1]!==void 0?arguments[1]:!0;return EI(this,t,e,Yue)};o(Xue,"addParent");ug.forEachUp=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return EI(this,t,e,Xue)};o(tUe,"addParentAndChildren");ug.forEachUpAndDown=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return EI(this,t,e,tUe)};ug.ancestors=ug.parents;cx=jue={data:un.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:un.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:un.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:un.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:un.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:un.removeData({field:"rscratch",triggerEvent:!1}),id:o(function(){var e=this[0];if(e)return e._private.data.id},"id")};cx.attr=cx.data;cx.removeAttr=cx.removeData;rUe=jue,yE={};o(RM,"defineDegreeFunction");ir(yE,{degree:RM(function(t,e){return e.source().same(e.target())?2:1}),indegree:RM(function(t,e){return e.target().same(t)?1:0}),outdegree:RM(function(t,e){return e.source().same(t)?1:0})});o(Xm,"defineDegreeBoundsFunction");ir(yE,{minDegree:Xm("degree",function(t,e){return te}),minIndegree:Xm("indegree",function(t,e){return te}),minOutdegree:Xm("outdegree",function(t,e){return te})});ir(yE,{totalDegree:o(function(e){for(var r=0,n=this.nodes(),i=0;i0,p=d;d&&(f=f[0]);var m=p?f.position():{x:0,y:0};r!==void 0?h.position(e,r+m[e]):a!==void 0&&h.position({x:a.x+m.x,y:a.y+m.y})}else{var g=n.position(),y=l?n.parent():null,v=y&&y.length>0,x=v;v&&(y=y[0]);var b=x?y.position():{x:0,y:0};return a={x:g.x-b.x,y:g.y-b.y},e===void 0?a:a[e]}else if(!s)return;return this},"relativePosition")};Ml.modelPosition=Ml.point=Ml.position;Ml.modelPositions=Ml.points=Ml.positions;Ml.renderedPoint=Ml.renderedPosition;Ml.relativePoint=Ml.relativePosition;nUe=Kue;og=Df={};Df.renderedBoundingBox=function(t){var e=this.boundingBox(t),r=this.cy(),n=r.zoom(),i=r.pan(),a=e.x1*n+i.x,s=e.x2*n+i.x,l=e.y1*n+i.y,u=e.y2*n+i.y;return{x1:a,x2:s,y1:l,y2:u,w:s-a,h:u-l}};Df.dirtyCompoundBoundsCache=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(r){if(r.isParent()){var n=r._private;n.compoundBoundsClean=!1,n.bbCache=null,t||r.emitAndNotify("bounds")}}),this)};Df.updateCompoundBounds=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!t&&e.batching())return this;function r(s){if(!s.isParent())return;var l=s._private,u=s.children(),h=s.pstyle("compound-sizing-wrt-labels").value==="include",f={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},d=u.boundingBox({includeLabels:h,includeOverlays:!1,useCache:!1}),p=l.position;(d.w===0||d.h===0)&&(d={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},d.x1=p.x-d.w/2,d.x2=p.x+d.w/2,d.y1=p.y-d.h/2,d.y2=p.y+d.h/2);function m(R,I,L){var E=0,D=0,_=I+L;return R>0&&_>0&&(E=I/_*R,D=L/_*R),{biasDiff:E,biasComplementDiff:D}}o(m,"computeBiasValues");function g(R,I,L,E){if(L.units==="%")switch(E){case"width":return R>0?L.pfValue*R:0;case"height":return I>0?L.pfValue*I:0;case"average":return R>0&&I>0?L.pfValue*(R+I)/2:0;case"min":return R>0&&I>0?R>I?L.pfValue*I:L.pfValue*R:0;case"max":return R>0&&I>0?R>I?L.pfValue*R:L.pfValue*I:0;default:return 0}else return L.units==="px"?L.pfValue:0}o(g,"computePaddingValues");var y=f.width.left.value;f.width.left.units==="px"&&f.width.val>0&&(y=y*100/f.width.val);var v=f.width.right.value;f.width.right.units==="px"&&f.width.val>0&&(v=v*100/f.width.val);var x=f.height.top.value;f.height.top.units==="px"&&f.height.val>0&&(x=x*100/f.height.val);var b=f.height.bottom.value;f.height.bottom.units==="px"&&f.height.val>0&&(b=b*100/f.height.val);var T=m(f.width.val-d.w,y,v),S=T.biasDiff,w=T.biasComplementDiff,k=m(f.height.val-d.h,x,b),A=k.biasDiff,C=k.biasComplementDiff;l.autoPadding=g(d.w,d.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),l.autoWidth=Math.max(d.w,f.width.val),p.x=(-S+d.x1+d.x2+w)/2,l.autoHeight=Math.max(d.h,f.height.val),p.y=(-A+d.y1+d.y2+C)/2}o(r,"update");for(var n=0;ne.x2?i:e.x2,e.y1=ne.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},"updateBounds"),mf=o(function(e,r){return r==null?e:Nl(e,r.x1,r.y1,r.x2,r.y2)},"updateBoundsFromBox"),W2=o(function(e,r,n){return Us(e,r,n)},"prefixedProperty"),Lk=o(function(e,r,n){if(!r.cy().headless()){var i=r._private,a=i.rstyle,s=a.arrowWidth/2,l=r.pstyle(n+"-arrow-shape").value,u,h;if(l!=="none"){n==="source"?(u=a.srcX,h=a.srcY):n==="target"?(u=a.tgtX,h=a.tgtY):(u=a.midX,h=a.midY);var f=i.arrowBounds=i.arrowBounds||{},d=f[n]=f[n]||{};d.x1=u-s,d.y1=h-s,d.x2=u+s,d.y2=h+s,d.w=d.x2-d.x1,d.h=d.y2-d.y1,Fk(d,1),Nl(e,d.x1,d.y1,d.x2,d.y2)}}},"updateBoundsFromArrow"),NM=o(function(e,r,n){if(!r.cy().headless()){var i;n?i=n+"-":i="";var a=r._private,s=a.rstyle,l=r.pstyle(i+"label").strValue;if(l){var u=r.pstyle("text-halign"),h=r.pstyle("text-valign"),f=W2(s,"labelWidth",n),d=W2(s,"labelHeight",n),p=W2(s,"labelX",n),m=W2(s,"labelY",n),g=r.pstyle(i+"text-margin-x").pfValue,y=r.pstyle(i+"text-margin-y").pfValue,v=r.isEdge(),x=r.pstyle(i+"text-rotation"),b=r.pstyle("text-outline-width").pfValue,T=r.pstyle("text-border-width").pfValue,S=T/2,w=r.pstyle("text-background-padding").pfValue,k=2,A=d,C=f,R=C/2,I=A/2,L,E,D,_;if(v)L=p-R,E=p+R,D=m-I,_=m+I;else{switch(u.value){case"left":L=p-C,E=p;break;case"center":L=p-R,E=p+R;break;case"right":L=p,E=p+C;break}switch(h.value){case"top":D=m-A,_=m;break;case"center":D=m-I,_=m+I;break;case"bottom":D=m,_=m+A;break}}var O=g-Math.max(b,S)-w-k,M=g+Math.max(b,S)+w+k,P=y-Math.max(b,S)-w-k,B=y+Math.max(b,S)+w+k;L+=O,E+=M,D+=P,_+=B;var F=n||"main",G=a.labelBounds,$=G[F]=G[F]||{};$.x1=L,$.y1=D,$.x2=E,$.y2=_,$.w=E-L,$.h=_-D,$.leftPad=O,$.rightPad=M,$.topPad=P,$.botPad=B;var U=v&&x.strValue==="autorotate",j=x.pfValue!=null&&x.pfValue!==0;if(U||j){var te=U?W2(a.rstyle,"labelAngle",n):x.pfValue,Y=Math.cos(te),oe=Math.sin(te),J=(L+E)/2,ue=(D+_)/2;if(!v){switch(u.value){case"left":J=E;break;case"right":J=L;break}switch(h.value){case"top":ue=_;break;case"bottom":ue=D;break}}var re=o(function(Te,q){return Te=Te-J,q=q-ue,{x:Te*Y-q*oe+J,y:Te*oe+q*Y+ue}},"rotate"),ee=re(L,D),Z=re(L,_),K=re(E,D),ae=re(E,_);L=Math.min(ee.x,Z.x,K.x,ae.x),E=Math.max(ee.x,Z.x,K.x,ae.x),D=Math.min(ee.y,Z.y,K.y,ae.y),_=Math.max(ee.y,Z.y,K.y,ae.y)}var Q=F+"Rot",de=G[Q]=G[Q]||{};de.x1=L,de.y1=D,de.x2=E,de.y2=_,de.w=E-L,de.h=_-D,Nl(e,L,D,E,_),Nl(a.labelBounds.all,L,D,E,_)}return e}},"updateBoundsFromLabel"),mce=o(function(e,r){if(!r.cy().headless()){var n=r.pstyle("outline-opacity").value,i=r.pstyle("outline-width").value,a=r.pstyle("outline-offset").value,s=i+a;Zue(e,r,n,s,"outside",s/2)}},"updateBoundsFromOutline"),Zue=o(function(e,r,n,i,a,s){if(!(n===0||i<=0||a==="inside")){var l=r.cy(),u=r.pstyle("shape").value,h=l.renderer().nodeShapes[u],f=r.position(),d=f.x,p=f.y,m=r.width(),g=r.height();if(h.hasMiterBounds){a==="center"&&(i/=2);var y=h.miterBounds(d,p,m,g,i);mf(e,y)}else s!=null&&s>0&&$k(e,[s,s,s,s])}},"updateBoundsFromMiter"),iUe=o(function(e,r){if(!r.cy().headless()){var n=r.pstyle("border-opacity").value,i=r.pstyle("border-width").pfValue,a=r.pstyle("border-position").value;Zue(e,r,n,i,a)}},"updateBoundsFromMiterBorder"),aUe=o(function(e,r){var n=e._private.cy,i=n.styleEnabled(),a=n.headless(),s=cs(),l=e._private,u=e.isNode(),h=e.isEdge(),f,d,p,m,g,y,v=l.rstyle,x=u&&i?e.pstyle("bounds-expansion").pfValue:[0],b=o(function(ne){return ne.pstyle("display").value!=="none"},"isDisplayed"),T=!i||b(e)&&(!h||b(e.source())&&b(e.target()));if(T){var S=0,w=0;i&&r.includeOverlays&&(S=e.pstyle("overlay-opacity").value,S!==0&&(w=e.pstyle("overlay-padding").value));var k=0,A=0;i&&r.includeUnderlays&&(k=e.pstyle("underlay-opacity").value,k!==0&&(A=e.pstyle("underlay-padding").value));var C=Math.max(w,A),R=0,I=0;if(i&&(R=e.pstyle("width").pfValue,I=R/2),u&&r.includeNodes){var L=e.position();g=L.x,y=L.y;var E=e.outerWidth(),D=E/2,_=e.outerHeight(),O=_/2;f=g-D,d=g+D,p=y-O,m=y+O,Nl(s,f,p,d,m),i&&mce(s,e),i&&r.includeOutlines&&!a&&mce(s,e),i&&iUe(s,e)}else if(h&&r.includeEdges)if(i&&!a){var M=e.pstyle("curve-style").strValue;if(f=Math.min(v.srcX,v.midX,v.tgtX),d=Math.max(v.srcX,v.midX,v.tgtX),p=Math.min(v.srcY,v.midY,v.tgtY),m=Math.max(v.srcY,v.midY,v.tgtY),f-=I,d+=I,p-=I,m+=I,Nl(s,f,p,d,m),M==="haystack"){var P=v.haystackPts;if(P&&P.length===2){if(f=P[0].x,p=P[0].y,d=P[1].x,m=P[1].y,f>d){var B=f;f=d,d=B}if(p>m){var F=p;p=m,m=F}Nl(s,f-I,p-I,d+I,m+I)}}else if(M==="bezier"||M==="unbundled-bezier"||gf(M,"segments")||gf(M,"taxi")){var G;switch(M){case"bezier":case"unbundled-bezier":G=v.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":G=v.linePts;break}if(G!=null)for(var $=0;$d){var J=f;f=d,d=J}if(p>m){var ue=p;p=m,m=ue}f-=I,d+=I,p-=I,m+=I,Nl(s,f,p,d,m)}if(i&&r.includeEdges&&h&&(Lk(s,e,"mid-source"),Lk(s,e,"mid-target"),Lk(s,e,"source"),Lk(s,e,"target")),i){var re=e.pstyle("ghost").value==="yes";if(re){var ee=e.pstyle("ghost-offset-x").pfValue,Z=e.pstyle("ghost-offset-y").pfValue;Nl(s,s.x1+ee,s.y1+Z,s.x2+ee,s.y2+Z)}}var K=l.bodyBounds=l.bodyBounds||{};ele(K,s),$k(K,x),Fk(K,1),i&&(f=s.x1,d=s.x2,p=s.y1,m=s.y2,Nl(s,f-C,p-C,d+C,m+C));var ae=l.overlayBounds=l.overlayBounds||{};ele(ae,s),$k(ae,x),Fk(ae,1);var Q=l.labelBounds=l.labelBounds||{};Q.all!=null?zze(Q.all):Q.all=cs(),i&&r.includeLabels&&(r.includeMainLabels&&NM(s,e,null),h&&(r.includeSourceLabels&&NM(s,e,"source"),r.includeTargetLabels&&NM(s,e,"target")))}return s.x1=Xo(s.x1),s.y1=Xo(s.y1),s.x2=Xo(s.x2),s.y2=Xo(s.y2),s.w=Xo(s.x2-s.x1),s.h=Xo(s.y2-s.y1),s.w>0&&s.h>0&&T&&($k(s,x),Fk(s,1)),s},"boundingBoxImpl"),Jue=o(function(e){var r=0,n=o(function(s){return(s?1:0)<=0;l--)s(l);return this};Cf.removeAllListeners=function(){return this.removeListener("*")};Cf.emit=Cf.trigger=function(t,e,r){var n=this.listeners,i=n.length;return this.emitting++,An(e)||(e=[e]),TUe(this,function(a,s){r!=null&&(n=[{event:s.event,type:s.type,namespace:s.namespace,callback:r}],i=n.length);for(var l=o(function(){var f=n[u];if(f.type===s.type&&(!f.namespace||f.namespace===s.namespace||f.namespace===xUe)&&a.eventMatches(a.context,f,s)){var d=[s];e!=null&&hze(d,e),a.beforeEmit(a.context,f,s),f.conf&&f.conf.one&&(a.listeners=a.listeners.filter(function(g){return g!==f}));var p=a.callbackContext(a.context,f,s),m=f.callback.apply(p,d);a.afterEmit(a.context,f,s),m===!1&&(s.stopPropagation(),s.preventDefault())}},"_loop2"),u=0;u1&&!s){var l=this.length-1,u=this[l],h=u._private.data.id;this[l]=void 0,this[e]=u,a.set(h,{ele:u,index:e})}return this.length--,this},"unmergeAt"),unmergeOne:o(function(e){e=e[0];var r=this._private,n=e._private.data.id,i=r.map,a=i.get(n);if(!a)return this;var s=a.index;return this.unmergeAt(s),this},"unmergeOne"),unmerge:o(function(e){var r=this._private.cy;if(!e)return this;if(e&&Jt(e)){var n=e;e=r.mutableElements().filter(n)}for(var i=0;i=0;r--){var n=this[r];e(n)&&this.unmergeAt(r)}return this},"unmergeBy"),map:o(function(e,r){for(var n=[],i=this,a=0;an&&(n=u,i=l)}return{value:n,ele:i}},"max"),min:o(function(e,r){for(var n=1/0,i,a=this,s=0;s=0&&a"u"?"undefined":$i(Symbol))!=e&&$i(Symbol.iterator)!=e;r&&(tE[Symbol.iterator]=function(){var n=this,i={value:void 0,done:!1},a=0,s=this.length;return sue({next:o(function(){return a1&&arguments[1]!==void 0?arguments[1]:!0,n=this[0],i=n.cy();if(i.styleEnabled()&&n){n._private.styleDirty&&(n._private.styleDirty=!1,i.style().apply(n));var a=n._private.style[e];return a??(r?i.style().getDefaultProperty(e):null)}},"parsedStyle"),numericStyle:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r){var n=r.pstyle(e);return n.pfValue!==void 0?n.pfValue:n.value}},"numericStyle"),numericStyleUnits:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r)return r.pstyle(e).units},"numericStyleUnits"),renderedStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=this[0];if(n)return r.style().getRenderedStyle(n,e)},"renderedStyle"),style:o(function(e,r){var n=this.cy();if(!n.styleEnabled())return this;var i=!1,a=n.style();if(Yr(e)){var s=e;a.applyBypass(this,s,i),this.emitAndNotify("style")}else if(Jt(e))if(r===void 0){var l=this[0];return l?a.getStylePropertyValue(l,e):void 0}else a.applyBypass(this,e,r,i),this.emitAndNotify("style");else if(e===void 0){var u=this[0];return u?a.getRawStyle(u):void 0}return this},"style"),removeStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,i=r.style(),a=this;if(e===void 0)for(var s=0;s0&&e.push(f[0]),e.push(l[0])}return this.spawn(e,!0).filter(t)},"neighborhood"),closedNeighborhood:o(function(e){return this.neighborhood().add(this).filter(e)},"closedNeighborhood"),openNeighborhood:o(function(e){return this.neighborhood(e)},"openNeighborhood")});Ba.neighbourhood=Ba.neighborhood;Ba.closedNeighbourhood=Ba.closedNeighborhood;Ba.openNeighbourhood=Ba.openNeighborhood;ir(Ba,{source:jo(o(function(e){var r=this[0],n;return r&&(n=r._private.source||r.cy().collection()),n&&e?n.filter(e):n},"sourceImpl"),"source"),target:jo(o(function(e){var r=this[0],n;return r&&(n=r._private.target||r.cy().collection()),n&&e?n.filter(e):n},"targetImpl"),"target"),sources:Cce({attr:"source"}),targets:Cce({attr:"target"})});o(Cce,"defineSourceFunction");ir(Ba,{edgesWith:jo(Ace(),"edgesWith"),edgesTo:jo(Ace({thisIsSrc:!0}),"edgesTo")});o(Ace,"defineEdgesWithFunction");ir(Ba,{connectedEdges:jo(function(t){for(var e=[],r=this,n=0;n0);return s},"components"),component:o(function(){var e=this[0];return e.cy().mutableElements().components(e)[0]},"component")});Ba.componentsOf=Ba.components;va=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){Kn("A collection must have a reference to the core");return}var a=new zu,s=!1;if(!r)r=[];else if(r.length>0&&Yr(r[0])&&!mx(r[0])){s=!0;for(var l=[],u=new hg,h=0,f=r.length;h0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=r.cy(),i=n._private,a=[],s=[],l,u=0,h=r.length;u0){for(var F=l.length===r.length?r:new va(n,l),G=0;G0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=[],i={},a=r._private.cy;function s(_){for(var O=_._private.edges,M=0;M0&&(t?L.emitAndNotify("remove"):e&&L.emit("remove"));for(var E=0;Ef&&Math.abs(g.v)>f;);return p?function(y){return u[y*(u.length-1)|0]}:h},"springRK4Factory")})(),In=o(function(e,r,n,i){var a=RUe(e,r,n,i);return function(s,l,u){return s+(l-s)*a(u)}},"cubicBezier"),Vk={linear:o(function(e,r,n){return e+(r-e)*n},"linear"),ease:In(.25,.1,.25,1),"ease-in":In(.42,0,1,1),"ease-out":In(0,0,.58,1),"ease-in-out":In(.42,0,.58,1),"ease-in-sine":In(.47,0,.745,.715),"ease-out-sine":In(.39,.575,.565,1),"ease-in-out-sine":In(.445,.05,.55,.95),"ease-in-quad":In(.55,.085,.68,.53),"ease-out-quad":In(.25,.46,.45,.94),"ease-in-out-quad":In(.455,.03,.515,.955),"ease-in-cubic":In(.55,.055,.675,.19),"ease-out-cubic":In(.215,.61,.355,1),"ease-in-out-cubic":In(.645,.045,.355,1),"ease-in-quart":In(.895,.03,.685,.22),"ease-out-quart":In(.165,.84,.44,1),"ease-in-out-quart":In(.77,0,.175,1),"ease-in-quint":In(.755,.05,.855,.06),"ease-out-quint":In(.23,1,.32,1),"ease-in-out-quint":In(.86,0,.07,1),"ease-in-expo":In(.95,.05,.795,.035),"ease-out-expo":In(.19,1,.22,1),"ease-in-out-expo":In(1,0,0,1),"ease-in-circ":In(.6,.04,.98,.335),"ease-out-circ":In(.075,.82,.165,1),"ease-in-out-circ":In(.785,.135,.15,.86),spring:o(function(e,r,n){if(n===0)return Vk.linear;var i=NUe(e,r,n);return function(a,s,l){return a+(s-a)*i(l)}},"spring"),"cubic-bezier":In};o(Dce,"getEasedValue");o(Lce,"getValue");o(jm,"ease");o(MUe,"step$1");o(X2,"valid");o(IUe,"startAnimation");o(Rce,"stepAll");OUe={animate:un.animate(),animation:un.animation(),animated:un.animated(),clearQueue:un.clearQueue(),delay:un.delay(),delayAnimation:un.delayAnimation(),stop:un.stop(),addToAnimationPool:o(function(e){var r=this;r.styleEnabled()&&r._private.aniEles.merge(e)},"addToAnimationPool"),stopAnimationLoop:o(function(){this._private.animationsRunning=!1},"stopAnimationLoop"),startAnimationLoop:o(function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function r(){e._private.animationsRunning&&Kk(o(function(a){Rce(a,e),r()},"animationStep"))}o(r,"headlessStep");var n=e.renderer();n&&n.beforeRender?n.beforeRender(o(function(a,s){Rce(s,e)},"rendererAnimationStep"),n.beforeRenderPriorities.animations):r()},"startAnimationLoop")},PUe={qualifierCompare:o(function(e,r){return e==null||r==null?e==null&&r==null:e.sameText(r)},"qualifierCompare"),eventMatches:o(function(e,r,n){var i=r.qualifier;return i!=null?e!==n.target&&mx(n.target)&&i.matches(n.target):!0},"eventMatches"),addEventFields:o(function(e,r){r.cy=e,r.target=e},"addEventFields"),callbackContext:o(function(e,r,n){return r.qualifier!=null?n.target:e},"callbackContext")},Mk=o(function(e){return Jt(e)?new Ef(e):e},"argSelector"),uhe={createEmitter:o(function(){var e=this._private;return e.emitter||(e.emitter=new vE(PUe,this)),this},"createEmitter"),emitter:o(function(){return this._private.emitter},"emitter"),on:o(function(e,r,n){return this.emitter().on(e,Mk(r),n),this},"on"),removeListener:o(function(e,r,n){return this.emitter().removeListener(e,Mk(r),n),this},"removeListener"),removeAllListeners:o(function(){return this.emitter().removeAllListeners(),this},"removeAllListeners"),one:o(function(e,r,n){return this.emitter().one(e,Mk(r),n),this},"one"),once:o(function(e,r,n){return this.emitter().one(e,Mk(r),n),this},"once"),emit:o(function(e,r){return this.emitter().emit(e,r),this},"emit"),emitAndNotify:o(function(e,r){return this.emit(e),this.notify(e,r),this},"emitAndNotify")};un.eventAliasesOn(uhe);ZM={png:o(function(e){var r=this._private.renderer;return e=e||{},r.png(e)},"png"),jpg:o(function(e){var r=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",r.jpg(e)},"jpg")};ZM.jpeg=ZM.jpg;Uk={layout:o(function(e){var r=this;if(e==null){Kn("Layout options must be specified to make a layout");return}if(e.name==null){Kn("A `name` must be specified to make a layout");return}var n=e.name,i=r.extension("layout",n);if(i==null){Kn("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var a;Jt(e.eles)?a=r.$(e.eles):a=e.eles!=null?e.eles:r.$();var s=new i(ir({},e,{cy:r,eles:a}));return s},"layout")};Uk.createLayout=Uk.makeLayout=Uk.layout;BUe={notify:o(function(e,r){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var i=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();r!=null&&i.merge(r);return}if(n.notificationsEnabled){var a=this.renderer();this.destroyed()||!a||a.notify(e,r)}},"notify"),notifications:o(function(e){var r=this._private;return e===void 0?r.notificationsEnabled:(r.notificationsEnabled=!!e,this)},"notifications"),noNotifications:o(function(e){this.notifications(!1),e(),this.notifications(!0)},"noNotifications"),batching:o(function(){return this._private.batchCount>0},"batching"),startBatch:o(function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},"startBatch"),endBatch:o(function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var r=this.renderer();Object.keys(e.batchNotifications).forEach(function(n){var i=e.batchNotifications[n];i.empty()?r.notify(n):r.notify(n,i)})}return this},"endBatch"),batch:o(function(e){return this.startBatch(),e(),this.endBatch(),this},"batch"),batchData:o(function(e){var r=this;return this.batch(function(){for(var n=Object.keys(e),i=0;i0;)r.removeChild(r.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(n){var i=n._private;i.rscratch={},i.rstyle={},i.animation.current=[],i.animation.queue=[]})},"destroyRenderer"),onRender:o(function(e){return this.on("render",e)},"onRender"),offRender:o(function(e){return this.off("render",e)},"offRender")};JM.invalidateDimensions=JM.resize;Hk={collection:o(function(e,r){return Jt(e)?this.$(e):fo(e)?e.collection():An(e)?(r||(r={}),new va(this,e,r.unique,r.removed)):new va(this)},"collection"),nodes:o(function(e){var r=this.$(function(n){return n.isNode()});return e?r.filter(e):r},"nodes"),edges:o(function(e){var r=this.$(function(n){return n.isEdge()});return e?r.filter(e):r},"edges"),$:o(function(e){var r=this._private.elements;return e?r.filter(e):r.spawnSelf()},"$"),mutableElements:o(function(){return this._private.elements},"mutableElements")};Hk.elements=Hk.filter=Hk.$;na={},tx="t",$Ue="f";na.apply=function(t){for(var e=this,r=e._private,n=r.cy,i=n.collection(),a=0;a0;if(p||d&&m){var g=void 0;p&&m||p?g=h.properties:m&&(g=h.mappedProperties);for(var y=0;y1&&(S=1),l.color){var k=n.valueMin[0],A=n.valueMax[0],C=n.valueMin[1],R=n.valueMax[1],I=n.valueMin[2],L=n.valueMax[2],E=n.valueMin[3]==null?1:n.valueMin[3],D=n.valueMax[3]==null?1:n.valueMax[3],_=[Math.round(k+(A-k)*S),Math.round(C+(R-C)*S),Math.round(I+(L-I)*S),Math.round(E+(D-E)*S)];a={bypass:n.bypass,name:n.name,value:_,strValue:"rgb("+_[0]+", "+_[1]+", "+_[2]+")"}}else if(l.number){var O=n.valueMin+(n.valueMax-n.valueMin)*S;a=this.parse(n.name,O,n.bypass,p)}else return!1;if(!a)return y(),!1;a.mapping=n,n=a;break}case s.data:{for(var M=n.field.split("."),P=d.data,B=0;B0&&a>0){for(var l={},u=!1,h=0;h0?t.delayAnimation(s).play().promise().then(T):T()}).then(function(){return t.animation({style:l,duration:a,easing:t.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){r.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1})}else n.transitioning&&(this.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1)};na.checkTrigger=function(t,e,r,n,i,a){var s=this.properties[e],l=i(s);t.removed()||l!=null&&l(r,n,t)&&a(s)};na.checkZOrderTrigger=function(t,e,r,n){var i=this;this.checkTrigger(t,e,r,n,function(a){return a.triggersZOrder},function(){i._private.cy.notify("zorder",t)})};na.checkBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBounds},function(i){t.dirtyCompoundBoundsCache(),t.dirtyBoundingBoxCache()})};na.checkConnectedEdgesBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBoundsOfConnectedEdges},function(i){t.connectedEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};na.checkParallelEdgesBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBoundsOfParallelEdges},function(i){t.parallelEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};na.checkTriggers=function(t,e,r,n){t.dirtyStyleCache(),this.checkZOrderTrigger(t,e,r,n),this.checkBoundsTrigger(t,e,r,n),this.checkConnectedEdgesBoundsTrigger(t,e,r,n),this.checkParallelEdgesBoundsTrigger(t,e,r,n)};wx={};wx.applyBypass=function(t,e,r,n){var i=this,a=[],s=!0;if(e==="*"||e==="**"){if(r!==void 0)for(var l=0;li.length?n=n.substr(i.length):n=""}o(l,"removeSelAndBlockFromRemaining");function u(){a.length>s.length?a=a.substr(s.length):a=""}for(o(u,"removePropAndValFromRem");;){var h=n.match(/^\s*$/);if(h)break;var f=n.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!f){hn("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+n);break}i=f[0];var d=f[1];if(d!=="core"){var p=new Ef(d);if(p.invalid){hn("Skipping parsing of block: Invalid selector found in string stylesheet: "+d),l();continue}}var m=f[2],g=!1;a=m;for(var y=[];;){var v=a.match(/^\s*$/);if(v)break;var x=a.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!x){hn("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+m),g=!0;break}s=x[0];var b=x[1],T=x[2],S=e.properties[b];if(!S){hn("Skipping property: Invalid property name in: "+s),u();continue}var w=r.parse(b,T);if(!w){hn("Skipping property: Invalid property definition in: "+s),u();continue}y.push({name:b,val:T}),u()}if(g){l();break}r.selector(d);for(var k=0;k=7&&e[0]==="d"&&(f=new RegExp(l.data.regex).exec(e))){if(r)return!1;var p=l.data;return{name:t,value:f,strValue:""+e,mapped:p,field:f[1],bypass:r}}else if(e.length>=10&&e[0]==="m"&&(d=new RegExp(l.mapData.regex).exec(e))){if(r||h.multiple)return!1;var m=l.mapData;if(!(h.color||h.number))return!1;var g=this.parse(t,d[4]);if(!g||g.mapped)return!1;var y=this.parse(t,d[5]);if(!y||y.mapped)return!1;if(g.pfValue===y.pfValue||g.strValue===y.strValue)return hn("`"+t+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+t+": "+g.strValue+"`"),this.parse(t,g.strValue);if(h.color){var v=g.value,x=y.value,b=v[0]===x[0]&&v[1]===x[1]&&v[2]===x[2]&&(v[3]===x[3]||(v[3]==null||v[3]===1)&&(x[3]==null||x[3]===1));if(b)return!1}return{name:t,value:d,strValue:""+e,mapped:m,field:d[1],fieldMin:parseFloat(d[2]),fieldMax:parseFloat(d[3]),valueMin:g.value,valueMax:y.value,bypass:r}}}if(h.multiple&&n!=="multiple"){var T;if(u?T=e.split(/\s+/):An(e)?T=e:T=[e],h.evenMultiple&&T.length%2!==0)return null;for(var S=[],w=[],k=[],A="",C=!1,R=0;R0?" ":"")+I.strValue}return h.validate&&!h.validate(S,w)?null:h.singleEnum&&C?S.length===1&&Jt(S[0])?{name:t,value:S[0],strValue:S[0],bypass:r}:null:{name:t,value:S,pfValue:k,strValue:A,bypass:r,units:w}}var L=o(function(){for(var re=0;reh.max||h.strictMax&&e===h.max))return null;var M={name:t,value:e,strValue:""+e+(E||""),units:E,bypass:r};return h.unitless||E!=="px"&&E!=="em"?M.pfValue=e:M.pfValue=E==="px"||!E?e:this.getEmSizeInPixels()*e,(E==="ms"||E==="s")&&(M.pfValue=E==="ms"?e:1e3*e),(E==="deg"||E==="rad")&&(M.pfValue=E==="rad"?e:Pze(e)),E==="%"&&(M.pfValue=e/100),M}else if(h.propList){var P=[],B=""+e;if(B!=="none"){for(var F=B.split(/\s*,\s*|\s+/),G=0;G0&&l>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0){u=Math.min((s-2*r)/n.w,(l-2*r)/n.h),u=u>this._private.maxZoom?this._private.maxZoom:u,u=u=n.minZoom&&(n.maxZoom=r),this},"zoomRange"),minZoom:o(function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},"minZoom"),maxZoom:o(function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},"maxZoom"),getZoomedViewport:o(function(e){var r=this._private,n=r.pan,i=r.zoom,a,s,l=!1;if(r.zoomingEnabled||(l=!0),At(e)?s=e:Yr(e)&&(s=e.level,e.position!=null?a=hE(e.position,i,n):e.renderedPosition!=null&&(a=e.renderedPosition),a!=null&&!r.panningEnabled&&(l=!0)),s=s>r.maxZoom?r.maxZoom:s,s=sr.maxZoom||!r.zoomingEnabled?s=!0:(r.zoom=u,a.push("zoom"))}if(i&&(!s||!e.cancelOnFailedZoom)&&r.panningEnabled){var h=e.pan;At(h.x)&&(r.pan.x=h.x,l=!1),At(h.y)&&(r.pan.y=h.y,l=!1),l||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},"viewport"),center:o(function(e){var r=this.getCenterPan(e);return r&&(this._private.pan=r,this.emit("pan viewport"),this.notify("viewport")),this},"center"),getCenterPan:o(function(e,r){if(this._private.panningEnabled){if(Jt(e)){var n=e;e=this.mutableElements().filter(n)}else fo(e)||(e=this.mutableElements());if(e.length!==0){var i=e.boundingBox(),a=this.width(),s=this.height();r=r===void 0?this._private.zoom:r;var l={x:(a-r*(i.x1+i.x2))/2,y:(s-r*(i.y1+i.y2))/2};return l}}},"getCenterPan"),reset:o(function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},"reset"),invalidateSize:o(function(){this._private.sizeCache=null},"invalidateSize"),size:o(function(){var e=this._private,r=e.container,n=this;return e.sizeCache=e.sizeCache||(r?(function(){var i=n.window().getComputedStyle(r),a=o(function(l){return parseFloat(i.getPropertyValue(l))},"val");return{width:r.clientWidth-a("padding-left")-a("padding-right"),height:r.clientHeight-a("padding-top")-a("padding-bottom")}})():{width:1,height:1})},"size"),width:o(function(){return this.size().width},"width"),height:o(function(){return this.size().height},"height"),extent:o(function(){var e=this._private.pan,r=this._private.zoom,n=this.renderedExtent(),i={x1:(n.x1-e.x)/r,x2:(n.x2-e.x)/r,y1:(n.y1-e.y)/r,y2:(n.y2-e.y)/r};return i.w=i.x2-i.x1,i.h=i.y2-i.y1,i},"extent"),renderedExtent:o(function(){var e=this.width(),r=this.height();return{x1:0,y1:0,x2:e,y2:r,w:e,h:r}},"renderedExtent"),multiClickDebounceTime:o(function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this},"multiClickDebounceTime")};kp.centre=kp.center;kp.autolockNodes=kp.autolock;kp.autoungrabifyNodes=kp.autoungrabify;hx={data:un.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:un.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:un.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:un.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};hx.attr=hx.data;hx.removeAttr=hx.removeData;fx=o(function(e){var r=this;e=ir({},e);var n=e.container;n&&!jk(n)&&jk(n[0])&&(n=n[0]);var i=n?n._cyreg:null;i=i||{},i&&i.cy&&(i.cy.destroy(),i={});var a=i.readies=i.readies||[];n&&(n._cyreg=i),i.cy=r;var s=Bi!==void 0&&n!==void 0&&!e.headless,l=e;l.layout=ir({name:s?"grid":"null"},l.layout),l.renderer=ir({name:s?"canvas":"null"},l.renderer);var u=o(function(g,y,v){return y!==void 0?y:v!==void 0?v:g},"defVal"),h=this._private={container:n,ready:!1,options:l,elements:new va(this),listeners:[],aniEles:new va(this),data:l.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:u(!0,l.zoomingEnabled),userZoomingEnabled:u(!0,l.userZoomingEnabled),panningEnabled:u(!0,l.panningEnabled),userPanningEnabled:u(!0,l.userPanningEnabled),boxSelectionEnabled:u(!0,l.boxSelectionEnabled),autolock:u(!1,l.autolock,l.autolockNodes),autoungrabify:u(!1,l.autoungrabify,l.autoungrabifyNodes),autounselectify:u(!1,l.autounselectify),styleEnabled:l.styleEnabled===void 0?s:l.styleEnabled,zoom:At(l.zoom)?l.zoom:1,pan:{x:Yr(l.pan)&&At(l.pan.x)?l.pan.x:0,y:Yr(l.pan)&&At(l.pan.y)?l.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:u(250,l.multiClickDebounceTime)};this.createEmitter(),this.selectionType(l.selectionType),this.zoomRange({min:l.minZoom,max:l.maxZoom});var f=o(function(g,y){var v=g.some(L$e);if(v)return fg.all(g).then(y);y(g)},"loadExtData");h.styleEnabled&&r.setStyle([]);var d=ir({},l,l.renderer);r.initRenderer(d);var p=o(function(g,y,v){r.notifications(!1);var x=r.mutableElements();x.length>0&&x.remove(),g!=null&&(Yr(g)||An(g))&&r.add(g),r.one("layoutready",function(T){r.notifications(!0),r.emit(T),r.one("load",y),r.emitAndNotify("load")}).one("layoutstop",function(){r.one("done",v),r.emit("done")});var b=ir({},r._private.options.layout);b.eles=r.elements(),r.layout(b).run()},"setElesAndLayout");f([l.style,l.elements],function(m){var g=m[0],y=m[1];h.styleEnabled&&r.style().append(g),p(y,function(){r.startAnimationLoop(),h.ready=!0,oi(l.ready)&&r.on("ready",l.ready);for(var v=0;v0,l=!!t.boundingBox,u=cs(l?t.boundingBox:structuredClone(e.extent())),h;if(fo(t.roots))h=t.roots;else if(An(t.roots)){for(var f=[],d=0;d0;){var _=D(),O=R(_,L);if(O)_.outgoers().filter(function(Ve){return Ve.isNode()&&r.has(Ve)}).forEach(E);else if(O===null){hn("Detected double maximal shift for node `"+_.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var M=0;if(t.avoidOverlap)for(var P=0;P0&&x[0].length<=3?Le/2:0),Ne=2*Math.PI/x[Ye].length*He;return Ye===0&&x[0].length===1&&(Ie=1),{x:K.x+Ie*Math.cos(Ne),y:K.y+Ie*Math.sin(Ne)}}else{var Ce=x[Ye].length,Fe=Math.max(Ce===1?0:l?(u.w-t.padding*2-ae.w)/((t.grid?de:Ce)-1):(u.w-t.padding*2-ae.w)/((t.grid?de:Ce)+1),M),fe={x:K.x+(He+1-(Ce+1)/2)*Fe,y:K.y+(Ye+1-(Y+1)/2)*Q};return fe}},"getPositionTopBottom"),Te={downward:0,leftward:90,upward:180,rightward:-90};Object.keys(Te).indexOf(t.direction)===-1&&Kn("Invalid direction '".concat(t.direction,"' specified for breadthfirst layout. Valid values are: ").concat(Object.keys(Te).join(", ")));var q=o(function(pe){return aze(ne(pe),u,Te[t.direction])},"getPosition");return r.nodes().layoutPositions(this,t,q),this};HUe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(fhe,"CircleLayout");fhe.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=n.nodes().not(":parent");e.sort&&(a=a.sort(e.sort));for(var s=cs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=e.sweep===void 0?2*Math.PI-2*Math.PI/a.length:e.sweep,h=u/Math.max(1,a.length-1),f,d=0,p=0;p1&&e.avoidOverlap){d*=1.75;var x=Math.cos(h)-Math.cos(0),b=Math.sin(h)-Math.sin(0),T=Math.sqrt(d*d/(x*x+b*b));f=Math.max(T,f)}var S=o(function(k,A){var C=e.startAngle+A*h*(i?1:-1),R=f*Math.cos(C),I=f*Math.sin(C),L={x:l.x+R,y:l.y+I};return L},"getPos");return n.nodes().layoutPositions(this,e,S),this};qUe={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:o(function(e){return e.degree()},"concentric"),levelWidth:o(function(e){return e.maxDegree()/4},"levelWidth"),animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(dhe,"ConcentricLayout");dhe.prototype.run=function(){for(var t=this.options,e=t,r=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,n=t.cy,i=e.eles,a=i.nodes().not(":parent"),s=cs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=[],h=0,f=0;f0){var w=Math.abs(b[0].value-S.value);w>=v&&(b=[],x.push(b))}b.push(S)}var k=h+e.minNodeSpacing;if(!e.avoidOverlap){var A=x.length>0&&x[0].length>1,C=Math.min(s.w,s.h)/2-k,R=C/(x.length+A?1:0);k=Math.min(k,R)}for(var I=0,L=0;L1&&e.avoidOverlap){var O=Math.cos(_)-Math.cos(0),M=Math.sin(_)-Math.sin(0),P=Math.sqrt(k*k/(O*O+M*M));I=Math.max(P,I)}E.r=I,I+=k}if(e.equidistant){for(var B=0,F=0,G=0;G=t.numIter||(ZUe(n,t),n.temperature=n.temperature*t.coolingFactor,n.temperature=t.animationThreshold&&a(),Kk(f)}},"frame");f()}else{for(;h;)h=s(u),u++;Ice(n,t),l()}return this};kE.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};kE.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};YUe=o(function(e,r,n){for(var i=n.eles.edges(),a=n.eles.nodes(),s=cs(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),l={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:i.size(),temperature:n.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},u=n.eles.components(),h={},f=0;f0){l.graphSet.push(C);for(var f=0;fi.count?0:i.graph},"findLCA"),phe=o(function(e,r,n,i){var a=i.graphSet[n];if(-10)var d=i.nodeOverlap*f,p=Math.sqrt(l*l+u*u),m=d*l/p,g=d*u/p;else var y=nE(e,l,u),v=nE(r,-1*l,-1*u),x=v.x-y.x,b=v.y-y.y,T=x*x+b*b,p=Math.sqrt(T),d=(e.nodeRepulsion+r.nodeRepulsion)/T,m=d*x/p,g=d*b/p;e.isLocked||(e.offsetX-=m,e.offsetY-=g),r.isLocked||(r.offsetX+=m,r.offsetY+=g)}},"nodeRepulsion"),tHe=o(function(e,r,n,i){if(n>0)var a=e.maxX-r.minX;else var a=r.maxX-e.minX;if(i>0)var s=e.maxY-r.minY;else var s=r.maxY-e.minY;return a>=0&&s>=0?Math.sqrt(a*a+s*s):0},"nodesOverlap"),nE=o(function(e,r,n){var i=e.positionX,a=e.positionY,s=e.height||1,l=e.width||1,u=n/r,h=s/l,f={};return r===0&&0n?(f.x=i,f.y=a+s/2,f):0r&&-1*h<=u&&u<=h?(f.x=i-l/2,f.y=a-l*n/2/r,f):0=h)?(f.x=i+s*r/2/n,f.y=a+s/2,f):(0>n&&(u<=-1*h||u>=h)&&(f.x=i-s*r/2/n,f.y=a-s/2),f)},"findClippingPoint"),rHe=o(function(e,r){for(var n=0;nn){var v=r.gravity*m/y,x=r.gravity*g/y;p.offsetX+=v,p.offsetY+=x}}}}},"calculateGravityForces"),iHe=o(function(e,r){var n=[],i=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;i<=a;){var s=n[i++],l=e.idToIndex[s],u=e.layoutNodes[l],h=u.children;if(0n)var a={x:n*e/i,y:n*r/i};else var a={x:e,y:r};return a},"limitForce"),ghe=o(function(e,r){var n=e.parentId;if(n!=null){var i=r.layoutNodes[r.idToIndex[n]],a=!1;if((i.maxX==null||e.maxX+i.padRight>i.maxX)&&(i.maxX=e.maxX+i.padRight,a=!0),(i.minX==null||e.minX-i.padLefti.maxY)&&(i.maxY=e.maxY+i.padBottom,a=!0),(i.minY==null||e.minY-i.padTopx&&(g+=v+r.componentSpacing,m=0,y=0,v=0)}}},"separateComponents"),oHe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:o(function(e){},"position"),sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(yhe,"GridLayout");yhe.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=n.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));var a=cs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(a.h===0||a.w===0)n.nodes().layoutPositions(this,e,function(j){return{x:a.x1,y:a.y1}});else{var s=i.size(),l=Math.sqrt(s*a.h/a.w),u=Math.round(l),h=Math.round(a.w/a.h*l),f=o(function(te){if(te==null)return Math.min(u,h);var Y=Math.min(u,h);Y==u?u=te:h=te},"small"),d=o(function(te){if(te==null)return Math.max(u,h);var Y=Math.max(u,h);Y==u?u=te:h=te},"large"),p=e.rows,m=e.cols!=null?e.cols:e.columns;if(p!=null&&m!=null)u=p,h=m;else if(p!=null&&m==null)u=p,h=Math.ceil(s/u);else if(p==null&&m!=null)h=m,u=Math.ceil(s/h);else if(h*u>s){var g=f(),y=d();(g-1)*y>=s?f(g-1):(y-1)*g>=s&&d(y-1)}else for(;h*u=s?d(x+1):f(v+1)}var b=a.w/h,T=a.h/u;if(e.condense&&(b=0,T=0),e.avoidOverlap)for(var S=0;S=h&&(O=0,_++)},"moveToNextCell"),P={},B=0;B(O=Kze(t,e,M[P],M[P+1],M[P+2],M[P+3])))return v(A,O),!0}else if(R.edgeType==="bezier"||R.edgeType==="multibezier"||R.edgeType==="self"||R.edgeType==="compound"){for(var M=R.allpts,P=0;P+5(O=jze(t,e,M[P],M[P+1],M[P+2],M[P+3],M[P+4],M[P+5])))return v(A,O),!0}for(var B=B||C.source,F=F||C.target,G=i.getArrowWidth(I,L),$=[{name:"source",x:R.arrowStartX,y:R.arrowStartY,angle:R.srcArrowAngle},{name:"target",x:R.arrowEndX,y:R.arrowEndY,angle:R.tgtArrowAngle},{name:"mid-source",x:R.midX,y:R.midY,angle:R.midsrcArrowAngle},{name:"mid-target",x:R.midX,y:R.midY,angle:R.midtgtArrowAngle}],P=0;P<$.length;P++){var U=$[P],j=a.arrowShapes[A.pstyle(U.name+"-arrow-shape").value],te=A.pstyle("width").pfValue;if(j.roughCollide(t,e,G,U.angle,{x:U.x,y:U.y},te,f)&&j.collide(t,e,G,U.angle,{x:U.x,y:U.y},te,f))return v(A),!0}h&&l.length>0&&(x(B),x(F))}o(b,"checkEdge");function T(A,C,R){return Us(A,C,R)}o(T,"preprop");function S(A,C){var R=A._private,I=p,L;C?L=C+"-":L="",A.boundingBox();var E=R.labelBounds[C||"main"],D=A.pstyle(L+"label").value,_=A.pstyle("text-events").strValue==="yes";if(!(!_||!D)){var O=T(R.rscratch,"labelX",C),M=T(R.rscratch,"labelY",C),P=T(R.rscratch,"labelAngle",C),B=A.pstyle(L+"text-margin-x").pfValue,F=A.pstyle(L+"text-margin-y").pfValue,G=E.x1-I-B,$=E.x2+I-B,U=E.y1-I-F,j=E.y2+I-F;if(P){var te=Math.cos(P),Y=Math.sin(P),oe=o(function(ae,Q){return ae=ae-O,Q=Q-M,{x:ae*te-Q*Y+O,y:ae*Y+Q*te+M}},"rotate"),J=oe(G,U),ue=oe(G,j),re=oe($,U),ee=oe($,j),Z=[J.x+B,J.y+F,re.x+B,re.y+F,ee.x+B,ee.y+F,ue.x+B,ue.y+F];if(Hs(t,e,Z))return v(A),!0}else if(yf(E,t,e))return v(A),!0}}o(S,"checkLabel");for(var w=s.length-1;w>=0;w--){var k=s[w];k.isNode()?x(k)||S(k):b(k)||S(k)||S(k,"source")||S(k,"target")}return l};Sp.getAllInBox=function(t,e,r,n){var i=this.getCachedZSortedEles().interactive,a=this.cy.zoom(),s=2/a,l=[],u=Math.min(t,r),h=Math.max(t,r),f=Math.min(e,n),d=Math.max(e,n);t=u,r=h,e=f,n=d;var p=cs({x1:t,y1:e,x2:r,y2:n}),m=[{x:p.x1,y:p.y1},{x:p.x2,y:p.y1},{x:p.x2,y:p.y2},{x:p.x1,y:p.y2}],g=[[m[0],m[1]],[m[1],m[2]],[m[2],m[3]],[m[3],m[0]]];function y(ae,Q,de){return Us(ae,Q,de)}o(y,"preprop");function v(ae,Q){var de=ae._private,ne=s,Te="";ae.boundingBox();var q=de.labelBounds.main;if(!q)return null;var Ve=y(de.rscratch,"labelX",Q),pe=y(de.rscratch,"labelY",Q),Be=y(de.rscratch,"labelAngle",Q),Ye=ae.pstyle(Te+"text-margin-x").pfValue,He=ae.pstyle(Te+"text-margin-y").pfValue,Le=q.x1-ne-Ye,Ie=q.x2+ne-Ye,Ne=q.y1-ne-He,Ce=q.y2+ne-He;if(Be){var Fe=Math.cos(Be),fe=Math.sin(Be),xe=o(function(he,z){return he=he-Ve,z=z-pe,{x:he*Fe-z*fe+Ve,y:he*fe+z*Fe+pe}},"rotate");return[xe(Le,Ne),xe(Ie,Ne),xe(Ie,Ce),xe(Le,Ce)]}else return[{x:Le,y:Ne},{x:Ie,y:Ne},{x:Ie,y:Ce},{x:Le,y:Ce}]}o(v,"getRotatedLabelBox");function x(ae,Q,de,ne){function Te(q,Ve,pe){return(pe.y-q.y)*(Ve.x-q.x)>(Ve.y-q.y)*(pe.x-q.x)}return o(Te,"ccw"),Te(ae,de,ne)!==Te(Q,de,ne)&&Te(ae,Q,de)!==Te(ae,Q,ne)}o(x,"doLinesIntersect");for(var b=0;b0?-(Math.PI-e.ang):Math.PI+e.ang},"invertVec"),dHe=o(function(e,r,n,i,a){if(e!==$ce?zce(r,e,Ic):fHe(Yo,Ic),zce(r,n,Yo),Bce=Ic.nx*Yo.ny-Ic.ny*Yo.nx,Fce=Ic.nx*Yo.nx-Ic.ny*-Yo.ny,Fu=Math.asin(Math.max(-1,Math.min(1,Bce))),Math.abs(Fu)<1e-6){eI=r.x,tI=r.y,gp=Qm=0;return}vp=1,qk=!1,Fce<0?Fu<0?Fu=Math.PI+Fu:(Fu=Math.PI-Fu,vp=-1,qk=!0):Fu>0&&(vp=-1,qk=!0),r.radius!==void 0?Qm=r.radius:Qm=i,fp=Fu/2,Ik=Math.min(Ic.len/2,Yo.len/2),a?(Nc=Math.abs(Math.cos(fp)*Qm/Math.sin(fp)),Nc>Ik?(Nc=Ik,gp=Math.abs(Nc*Math.sin(fp)/Math.cos(fp))):gp=Qm):(Nc=Math.min(Ik,Qm),gp=Math.abs(Nc*Math.sin(fp)/Math.cos(fp))),rI=r.x+Yo.nx*Nc,nI=r.y+Yo.ny*Nc,eI=rI-Yo.ny*gp*vp,tI=nI+Yo.nx*gp*vp,The=r.x+Ic.nx*Nc,whe=r.y+Ic.ny*Nc,$ce=r},"calcCornerArc");o(khe,"drawPreparedRoundCorner");o(LI,"getRoundCorner");dx=.01,pHe=Math.sqrt(2*dx),$a={};$a.findMidptPtsEtc=function(t,e){var r=e.posPts,n=e.intersectionPts,i=e.vectorNormInverse,a,s=t.pstyle("source-endpoint"),l=t.pstyle("target-endpoint"),u=s.units!=null&&l.units!=null,h=o(function(w,k,A,C){var R=C-k,I=A-w,L=Math.sqrt(I*I+R*R);return{x:-R/L,y:I/L}},"recalcVectorNormInverse"),f=t.pstyle("edge-distances").value;switch(f){case"node-position":a=r;break;case"intersection":a=n;break;case"endpoints":{if(u){var d=this.manualEndptToPx(t.source()[0],s),p=_i(d,2),m=p[0],g=p[1],y=this.manualEndptToPx(t.target()[0],l),v=_i(y,2),x=v[0],b=v[1],T={x1:m,y1:g,x2:x,y2:b};i=h(m,g,x,b),a=T}else hn("Edge ".concat(t.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),a=n;break}}return{midptPts:a,vectorNormInverse:i}};$a.findHaystackPoints=function(t){for(var e=0;e0?Math.max(z-se,0):Math.min(z+se,0)},"subDWH"),D=E(I,C),_=E(L,R),O=!1;b===h?x=Math.abs(D)>Math.abs(_)?i:n:b===u||b===l?(x=n,O=!0):(b===a||b===s)&&(x=i,O=!0);var M=x===n,P=M?_:D,B=M?L:I,F=yI(B),G=!1;!(O&&(S||k))&&(b===l&&B<0||b===u&&B>0||b===a&&B>0||b===s&&B<0)&&(F*=-1,P=F*Math.abs(P),G=!0);var $;if(S){var U=w<0?1+w:w;$=U*P}else{var j=w<0?P:0;$=j+w*F}var te=o(function(z){return Math.abs(z)=Math.abs(P)},"getIsTooClose"),Y=te($),oe=te(Math.abs(P)-Math.abs($)),J=Y||oe;if(J&&!G)if(M){var ue=Math.abs(B)<=p/2,re=Math.abs(I)<=m/2;if(ue){var ee=(f.x1+f.x2)/2,Z=f.y1,K=f.y2;r.segpts=[ee,Z,ee,K]}else if(re){var ae=(f.y1+f.y2)/2,Q=f.x1,de=f.x2;r.segpts=[Q,ae,de,ae]}else r.segpts=[f.x1,f.y2]}else{var ne=Math.abs(B)<=d/2,Te=Math.abs(L)<=g/2;if(ne){var q=(f.y1+f.y2)/2,Ve=f.x1,pe=f.x2;r.segpts=[Ve,q,pe,q]}else if(Te){var Be=(f.x1+f.x2)/2,Ye=f.y1,He=f.y2;r.segpts=[Be,Ye,Be,He]}else r.segpts=[f.x2,f.y1]}else if(M){var Le=f.y1+$+(v?p/2*F:0),Ie=f.x1,Ne=f.x2;r.segpts=[Ie,Le,Ne,Le]}else{var Ce=f.x1+$+(v?d/2*F:0),Fe=f.y1,fe=f.y2;r.segpts=[Ce,Fe,Ce,fe]}if(r.isRound){var xe=t.pstyle("taxi-radius").value,W=t.pstyle("radius-type").value[0]==="arc-radius";r.radii=new Array(r.segpts.length/2).fill(xe),r.isArcRadius=new Array(r.segpts.length/2).fill(W)}};$a.tryToCorrectInvalidPoints=function(t,e){var r=t._private.rscratch;if(r.edgeType==="bezier"){var n=e.srcPos,i=e.tgtPos,a=e.srcW,s=e.srcH,l=e.tgtW,u=e.tgtH,h=e.srcShape,f=e.tgtShape,d=e.srcCornerRadius,p=e.tgtCornerRadius,m=e.srcRs,g=e.tgtRs,y=!At(r.startX)||!At(r.startY),v=!At(r.arrowStartX)||!At(r.arrowStartY),x=!At(r.endX)||!At(r.endY),b=!At(r.arrowEndX)||!At(r.arrowEndY),T=3,S=this.getArrowWidth(t.pstyle("width").pfValue,t.pstyle("arrow-scale").value)*this.arrowShapeWidth,w=T*S,k=Tp({x:r.ctrlpts[0],y:r.ctrlpts[1]},{x:r.startX,y:r.startY}),A=kB.poolIndex()){var F=P;P=B,B=F}var G=D.srcPos=P.position(),$=D.tgtPos=B.position(),U=D.srcW=P.outerWidth(),j=D.srcH=P.outerHeight(),te=D.tgtW=B.outerWidth(),Y=D.tgtH=B.outerHeight(),oe=D.srcShape=r.nodeShapes[e.getNodeShape(P)],J=D.tgtShape=r.nodeShapes[e.getNodeShape(B)],ue=D.srcCornerRadius=P.pstyle("corner-radius").value==="auto"?"auto":P.pstyle("corner-radius").pfValue,re=D.tgtCornerRadius=B.pstyle("corner-radius").value==="auto"?"auto":B.pstyle("corner-radius").pfValue,ee=D.tgtRs=B._private.rscratch,Z=D.srcRs=P._private.rscratch;D.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var K=0;K=pHe||(Ne=Math.sqrt(Math.max(Ie*Ie,dx)+Math.max(Le*Le,dx)));var Ce=D.vector={x:Ie,y:Le},Fe=D.vectorNorm={x:Ce.x/Ne,y:Ce.y/Ne},fe={x:-Fe.y,y:Fe.x};D.nodesOverlap=!At(Ne)||J.checkPoint(q[0],q[1],0,te,Y,$.x,$.y,re,ee)||oe.checkPoint(pe[0],pe[1],0,U,j,G.x,G.y,ue,Z),D.vectorNormInverse=fe,_={nodesOverlap:D.nodesOverlap,dirCounts:D.dirCounts,calculatedIntersection:!0,hasBezier:D.hasBezier,hasUnbundled:D.hasUnbundled,eles:D.eles,srcPos:$,srcRs:ee,tgtPos:G,tgtRs:Z,srcW:te,srcH:Y,tgtW:U,tgtH:j,srcIntn:Be,tgtIntn:Ve,srcShape:J,tgtShape:oe,posPts:{x1:He.x2,y1:He.y2,x2:He.x1,y2:He.y1},intersectionPts:{x1:Ye.x2,y1:Ye.y2,x2:Ye.x1,y2:Ye.y1},vector:{x:-Ce.x,y:-Ce.y},vectorNorm:{x:-Fe.x,y:-Fe.y},vectorNormInverse:{x:-fe.x,y:-fe.y}}}var xe=Te?_:D;Q.nodesOverlap=xe.nodesOverlap,Q.srcIntn=xe.srcIntn,Q.tgtIntn=xe.tgtIntn,Q.isRound=de.startsWith("round"),i&&(P.isParent()||P.isChild()||B.isParent()||B.isChild())&&(P.parents().anySame(B)||B.parents().anySame(P)||P.same(B)&&P.isParent())?e.findCompoundLoopPoints(ae,xe,K,ne):P===B?e.findLoopPoints(ae,xe,K,ne):de.endsWith("segments")?e.findSegmentsPoints(ae,xe):de.endsWith("taxi")?e.findTaxiPoints(ae,xe):de==="straight"||!ne&&D.eles.length%2===1&&K===Math.floor(D.eles.length/2)?e.findStraightEdgePoints(ae):e.findBezierPoints(ae,xe,K,ne,Te),e.findEndpoints(ae),e.tryToCorrectInvalidPoints(ae,xe),e.checkForInvalidEdgeWarning(ae),e.storeAllpts(ae),e.storeEdgeProjections(ae),e.calculateArrowAngles(ae),e.recalculateEdgeLabelProjections(ae),e.calculateLabelAngles(ae)}},"_loop"),A=0;A0){var q=h,Ve=mp(q,tg(s)),pe=mp(q,tg(Te)),Be=Ve;if(pe2){var Ye=mp(q,{x:Te[2],y:Te[3]});Ye0){var le=f,ke=mp(le,tg(s)),ve=mp(le,tg(se)),ye=ke;if(ve2){var Re=mp(le,{x:se[2],y:se[3]});Re=g||A){v={cp:S,segment:k};break}}if(v)break}var C=v.cp,R=v.segment,I=(g-x)/R.length,L=R.t1-R.t0,E=m?R.t0+L*I:R.t1-L*I;E=ox(0,E,1),e=ig(C.p0,C.p1,C.p2,E),p=gHe(C.p0,C.p1,C.p2,E);break}case"straight":case"segments":case"haystack":{for(var D=0,_,O,M,P,B=n.allpts.length,F=0;F+3=g));F+=2);var G=g-O,$=G/_;$=ox(0,$,1),e=Fze(M,P,$),p=Che(M,P);break}}s("labelX",d,e.x),s("labelY",d,e.y),s("labelAutoAngle",d,p)}},"calculateEndProjection");h("source"),h("target"),this.applyLabelDimensions(t)}};Bc.applyLabelDimensions=function(t){this.applyPrefixedLabelDimensions(t),t.isEdge()&&(this.applyPrefixedLabelDimensions(t,"source"),this.applyPrefixedLabelDimensions(t,"target"))};Bc.applyPrefixedLabelDimensions=function(t,e){var r=t._private,n=this.getLabelText(t,e),i=bp(n,t._private.labelDimsKey);if(Us(r.rscratch,"prefixedLabelDimsKey",e)!==i){$u(r.rscratch,"prefixedLabelDimsKey",e,i);var a=this.calculateLabelDimensions(t,n),s=t.pstyle("line-height").pfValue,l=t.pstyle("text-wrap").strValue,u=Us(r.rscratch,"labelWrapCachedLines",e)||[],h=l!=="wrap"?1:Math.max(u.length,1),f=a.height/h,d=f*s,p=a.width,m=a.height+(h-1)*(s-1)*f;$u(r.rstyle,"labelWidth",e,p),$u(r.rscratch,"labelWidth",e,p),$u(r.rstyle,"labelHeight",e,m),$u(r.rscratch,"labelHeight",e,m),$u(r.rscratch,"labelLineHeight",e,d)}};Bc.getLabelText=function(t,e){var r=t._private,n=e?e+"-":"",i=t.pstyle(n+"label").strValue,a=t.pstyle("text-transform").value,s=o(function(j,te){return te?($u(r.rscratch,j,e,te),te):Us(r.rscratch,j,e)},"rscratch");if(!i)return"";a=="none"||(a=="uppercase"?i=i.toUpperCase():a=="lowercase"&&(i=i.toLowerCase()));var l=t.pstyle("text-wrap").value;if(l==="wrap"){var u=s("labelKey");if(u!=null&&s("labelWrapKey")===u)return s("labelWrapCachedText");for(var h="\u200B",f=i.split(` +`),d=t.pstyle("text-max-width").pfValue,p=t.pstyle("text-overflow-wrap").value,m=p==="anywhere",g=[],y=/[\s\u200b]+|$/g,v=0;vd){var w=x.matchAll(y),k="",A=0,C=qs(w),R;try{for(C.s();!(R=C.n()).done;){var I=R.value,L=I[0],E=x.substring(A,I.index);A=I.index+L.length;var D=k.length===0?E:k+E+L,_=this.calculateLabelDimensions(t,D),O=_.width;O<=d?k+=E+L:(k&&g.push(k),k=E+L)}}catch(U){C.e(U)}finally{C.f()}k.match(/^[\s\u200b]+$/)||g.push(k)}else g.push(x)}s("labelWrapCachedLines",g),i=s("labelWrapCachedText",g.join(` +`)),s("labelWrapKey",u)}else if(l==="ellipsis"){var M=t.pstyle("text-max-width").pfValue,P="",B="\u2026",F=!1;if(this.calculateLabelDimensions(t,i).widthM)break;P+=i[G],G===i.length-1&&(F=!0)}return F||(P+=B),P}return i};Bc.getLabelJustification=function(t){var e=t.pstyle("text-justification").strValue,r=t.pstyle("text-halign").strValue;if(e==="auto")if(t.isNode())switch(r){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};Bc.calculateLabelDimensions=function(t,e){var r=this,n=r.cy.window(),i=n.document,a=0,s=t.pstyle("font-style").strValue,l=t.pstyle("font-size").pfValue,u=t.pstyle("font-family").strValue,h=t.pstyle("font-weight").strValue,f=this.labelCalcCanvas,d=this.labelCalcCanvasContext;if(!f){f=this.labelCalcCanvas=i.createElement("canvas"),d=this.labelCalcCanvasContext=f.getContext("2d");var p=f.style;p.position="absolute",p.left="-9999px",p.top="-9999px",p.zIndex="-1",p.visibility="hidden",p.pointerEvents="none"}d.font="".concat(s," ").concat(h," ").concat(l,"px ").concat(u);for(var m=0,g=0,y=e.split(` +`),v=0;v1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),l)for(var u=0;u=t.desktopTapThreshold2}var bt=a(z);lt&&(t.hoverData.tapholdCancelled=!0);var wt=o(function(){var Se=t.hoverData.dragDelta=t.hoverData.dragDelta||[];Se.length===0?(Se.push(et[0]),Se.push(et[1])):(Se[0]+=et[0],Se[1]+=et[1])},"updateDragDelta");le=!0,i(xt,["mousemove","vmousemove","tapdrag"],z,{x:Re[0],y:Re[1]});var yt=o(function(Se){return{originalEvent:z,type:Se,position:{x:Re[0],y:Re[1]}}},"makeEvent"),ft=o(function(){t.data.bgActivePosistion=void 0,t.hoverData.selecting||ke.emit(yt("boxstart")),Ke[4]=1,t.hoverData.selecting=!0,t.redrawHint("select",!0),t.redraw()},"goIntoBoxMode");if(t.hoverData.which===3){if(lt){var Ur=yt("cxtdrag");Oe?Oe.emit(Ur):ke.emit(Ur),t.hoverData.cxtDragged=!0,(!t.hoverData.cxtOver||xt!==t.hoverData.cxtOver)&&(t.hoverData.cxtOver&&t.hoverData.cxtOver.emit(yt("cxtdragout")),t.hoverData.cxtOver=xt,xt&&xt.emit(yt("cxtdragover")))}}else if(t.hoverData.dragging){if(le=!0,ke.panningEnabled()&&ke.userPanningEnabled()){var _t;if(t.hoverData.justStartedPan){var bn=t.hoverData.mdownPos;_t={x:(Re[0]-bn[0])*ve,y:(Re[1]-bn[1])*ve},t.hoverData.justStartedPan=!1}else _t={x:et[0]*ve,y:et[1]*ve};ke.panBy(_t),ke.emit(yt("dragpan")),t.hoverData.dragged=!0}Re=t.projectIntoViewport(z.clientX,z.clientY)}else if(Ke[4]==1&&(Oe==null||Oe.pannable())){if(lt){if(!t.hoverData.dragging&&ke.boxSelectionEnabled()&&(bt||!ke.panningEnabled()||!ke.userPanningEnabled()))ft();else if(!t.hoverData.selecting&&ke.panningEnabled()&&ke.userPanningEnabled()){var Br=s(Oe,t.hoverData.downs);Br&&(t.hoverData.dragging=!0,t.hoverData.justStartedPan=!0,Ke[4]=0,t.data.bgActivePosistion=tg(_e),t.redrawHint("select",!0),t.redraw())}Oe&&Oe.pannable()&&Oe.active()&&Oe.unactivate()}}else{if(Oe&&Oe.pannable()&&Oe.active()&&Oe.unactivate(),(!Oe||!Oe.grabbed())&&xt!=We&&(We&&i(We,["mouseout","tapdragout"],z,{x:Re[0],y:Re[1]}),xt&&i(xt,["mouseover","tapdragover"],z,{x:Re[0],y:Re[1]}),t.hoverData.last=xt),Oe)if(lt){if(ke.boxSelectionEnabled()&&bt)Oe&&Oe.grabbed()&&(x(Ue),Oe.emit(yt("freeon")),Ue.emit(yt("free")),t.dragData.didDrag&&(Oe.emit(yt("dragfreeon")),Ue.emit(yt("dragfree")))),ft();else if(Oe&&Oe.grabbed()&&t.nodeIsDraggable(Oe)){var cr=!t.dragData.didDrag;cr&&t.redrawHint("eles",!0),t.dragData.didDrag=!0,t.hoverData.draggingEles||y(Ue,{inDragLayer:!0});var ar={x:0,y:0};if(At(et[0])&&At(et[1])&&(ar.x+=et[0],ar.y+=et[1],cr)){var _r=t.hoverData.dragDelta;_r&&At(_r[0])&&At(_r[1])&&(ar.x+=_r[0],ar.y+=_r[1])}t.hoverData.draggingEles=!0,Ue.silentShift(ar).emit(yt("position")).emit(yt("drag")),t.redrawHint("drag",!0),t.redraw()}}else wt();le=!0}if(Ke[2]=Re[0],Ke[3]=Re[1],le)return z.stopPropagation&&z.stopPropagation(),z.preventDefault&&z.preventDefault(),!1}},"mousemoveHandler"),!1);var E,D,_;t.registerBinding(e,"mouseup",o(function(z){if(!(t.hoverData.which===1&&z.which!==1&&t.hoverData.capture)){var se=t.hoverData.capture;if(se){t.hoverData.capture=!1;var le=t.cy,ke=t.projectIntoViewport(z.clientX,z.clientY),ve=t.selection,ye=t.findNearestElement(ke[0],ke[1],!0,!1),Re=t.dragData.possibleDragElements,_e=t.hoverData.down,ze=a(z);t.data.bgActivePosistion&&(t.redrawHint("select",!0),t.redraw()),t.hoverData.tapholdCancelled=!0,t.data.bgActivePosistion=void 0,_e&&_e.unactivate();var Ke=o(function(Gt){return{originalEvent:z,type:Gt,position:{x:ke[0],y:ke[1]}}},"makeEvent");if(t.hoverData.which===3){var xt=Ke("cxttapend");if(_e?_e.emit(xt):le.emit(xt),!t.hoverData.cxtDragged){var We=Ke("cxttap");_e?_e.emit(We):le.emit(We)}t.hoverData.cxtDragged=!1,t.hoverData.which=null}else if(t.hoverData.which===1){if(i(ye,["mouseup","tapend","vmouseup"],z,{x:ke[0],y:ke[1]}),!t.dragData.didDrag&&!t.hoverData.dragged&&!t.hoverData.selecting&&!t.hoverData.isOverThresholdDrag&&(i(_e,["click","tap","vclick"],z,{x:ke[0],y:ke[1]}),D=!1,z.timeStamp-_<=le.multiClickDebounceTime()?(E&&clearTimeout(E),D=!0,_=null,i(_e,["dblclick","dbltap","vdblclick"],z,{x:ke[0],y:ke[1]})):(E=setTimeout(function(){D||i(_e,["oneclick","onetap","voneclick"],z,{x:ke[0],y:ke[1]})},le.multiClickDebounceTime()),_=z.timeStamp)),_e==null&&!t.dragData.didDrag&&!t.hoverData.selecting&&!t.hoverData.dragged&&!a(z)&&(le.$(r).unselect(["tapunselect"]),Re.length>0&&t.redrawHint("eles",!0),t.dragData.possibleDragElements=Re=le.collection()),ye==_e&&!t.dragData.didDrag&&!t.hoverData.selecting&&ye!=null&&ye._private.selectable&&(t.hoverData.dragging||(le.selectionType()==="additive"||ze?ye.selected()?ye.unselect(["tapunselect"]):ye.select(["tapselect"]):ze||(le.$(r).unmerge(ye).unselect(["tapunselect"]),ye.select(["tapselect"]))),t.redrawHint("eles",!0)),t.hoverData.selecting){var Oe=le.collection(t.getAllInBox(ve[0],ve[1],ve[2],ve[3]));t.redrawHint("select",!0),Oe.length>0&&t.redrawHint("eles",!0),le.emit(Ke("boxend"));var et=o(function(Gt){return Gt.selectable()&&!Gt.selected()},"eleWouldBeSelected");le.selectionType()==="additive"||ze||le.$(r).unmerge(Oe).unselect(),Oe.emit(Ke("box")).stdFilter(et).select().emit(Ke("boxselect")),t.redraw()}if(t.hoverData.dragging&&(t.hoverData.dragging=!1,t.redrawHint("select",!0),t.redrawHint("eles",!0),t.redraw()),!ve[4]){t.redrawHint("drag",!0),t.redrawHint("eles",!0);var Ue=_e&&_e.grabbed();x(Re),Ue&&(_e.emit(Ke("freeon")),Re.emit(Ke("free")),t.dragData.didDrag&&(_e.emit(Ke("dragfreeon")),Re.emit(Ke("dragfree"))))}}ve[4]=0,t.hoverData.down=null,t.hoverData.cxtStarted=!1,t.hoverData.draggingEles=!1,t.hoverData.selecting=!1,t.hoverData.isOverThresholdDrag=!1,t.dragData.didDrag=!1,t.hoverData.dragged=!1,t.hoverData.dragDelta=[],t.hoverData.mdownPos=null,t.hoverData.mdownGPos=null,t.hoverData.which=null}}},"mouseupHandler"),!1);var O=[],M=4,P,B=1e5,F=o(function(z,se){for(var le=0;le=M){var ke=O;if(P=F(ke,5),!P){var ve=Math.abs(ke[0]);P=G(ke)&&ve>5}if(P)for(var ye=0;ye5&&(le=yI(le)*5),We=le/-250,P&&(We/=B,We*=3),We=We*t.wheelSensitivity;var Oe=z.deltaMode===1;Oe&&(We*=33);var et=Re.zoom()*Math.pow(10,We);z.type==="gesturechange"&&(et=t.gestureStartZoom*z.scale),Re.zoom({level:et,renderedPosition:{x:xt[0],y:xt[1]}}),Re.emit({type:z.type==="gesturechange"?"pinchzoom":"scrollzoom",originalEvent:z,position:{x:Ke[0],y:Ke[1]}})}}}},"wheelHandler");t.registerBinding(t.container,"wheel",$,!0),t.registerBinding(e,"scroll",o(function(z){t.scrollingPage=!0,clearTimeout(t.scrollingPageTimeout),t.scrollingPageTimeout=setTimeout(function(){t.scrollingPage=!1},250)},"scrollHandler"),!0),t.registerBinding(t.container,"gesturestart",o(function(z){t.gestureStartZoom=t.cy.zoom(),t.hasTouchStarted||z.preventDefault()},"gestureStartHandler"),!0),t.registerBinding(t.container,"gesturechange",function(he){t.hasTouchStarted||$(he)},!0),t.registerBinding(t.container,"mouseout",o(function(z){var se=t.projectIntoViewport(z.clientX,z.clientY);t.cy.emit({originalEvent:z,type:"mouseout",position:{x:se[0],y:se[1]}})},"mouseOutHandler"),!1),t.registerBinding(t.container,"mouseover",o(function(z){var se=t.projectIntoViewport(z.clientX,z.clientY);t.cy.emit({originalEvent:z,type:"mouseover",position:{x:se[0],y:se[1]}})},"mouseOverHandler"),!1);var U,j,te,Y,oe,J,ue,re,ee,Z,K,ae,Q,de=o(function(z,se,le,ke){return Math.sqrt((le-z)*(le-z)+(ke-se)*(ke-se))},"distance"),ne=o(function(z,se,le,ke){return(le-z)*(le-z)+(ke-se)*(ke-se)},"distanceSq"),Te;t.registerBinding(t.container,"touchstart",Te=o(function(z){if(t.hasTouchStarted=!0,!!I(z)){T(),t.touchData.capture=!0,t.data.bgActivePosistion=void 0;var se=t.cy,le=t.touchData.now,ke=t.touchData.earlier;if(z.touches[0]){var ve=t.projectIntoViewport(z.touches[0].clientX,z.touches[0].clientY);le[0]=ve[0],le[1]=ve[1]}if(z.touches[1]){var ve=t.projectIntoViewport(z.touches[1].clientX,z.touches[1].clientY);le[2]=ve[0],le[3]=ve[1]}if(z.touches[2]){var ve=t.projectIntoViewport(z.touches[2].clientX,z.touches[2].clientY);le[4]=ve[0],le[5]=ve[1]}var ye=o(function(bt){return{originalEvent:z,type:bt,position:{x:le[0],y:le[1]}}},"makeEvent");if(z.touches[1]){t.touchData.singleTouchMoved=!0,x(t.dragData.touchDragEles);var Re=t.findContainerClientCoords();ee=Re[0],Z=Re[1],K=Re[2],ae=Re[3],U=z.touches[0].clientX-ee,j=z.touches[0].clientY-Z,te=z.touches[1].clientX-ee,Y=z.touches[1].clientY-Z,Q=0<=U&&U<=K&&0<=te&&te<=K&&0<=j&&j<=ae&&0<=Y&&Y<=ae;var _e=se.pan(),ze=se.zoom();oe=de(U,j,te,Y),J=ne(U,j,te,Y),ue=[(U+te)/2,(j+Y)/2],re=[(ue[0]-_e.x)/ze,(ue[1]-_e.y)/ze];var Ke=200,xt=Ke*Ke;if(J=1){for(var vt=t.touchData.startPosition=[null,null,null,null,null,null],Lt=0;Lt=t.touchTapThreshold2}if(se&&t.touchData.cxt){z.preventDefault();var Lt=z.touches[0].clientX-ee,dt=z.touches[0].clientY-Z,nt=z.touches[1].clientX-ee,bt=z.touches[1].clientY-Z,wt=ne(Lt,dt,nt,bt),yt=wt/J,ft=150,Ur=ft*ft,_t=1.5,bn=_t*_t;if(yt>=bn||wt>=Ur){t.touchData.cxt=!1,t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var Br=ze("cxttapend");t.touchData.start?(t.touchData.start.unactivate().emit(Br),t.touchData.start=null):ke.emit(Br)}}if(se&&t.touchData.cxt){var Br=ze("cxtdrag");t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.touchData.start?t.touchData.start.emit(Br):ke.emit(Br),t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxtDragged=!0;var cr=t.findNearestElement(ve[0],ve[1],!0,!0);(!t.touchData.cxtOver||cr!==t.touchData.cxtOver)&&(t.touchData.cxtOver&&t.touchData.cxtOver.emit(ze("cxtdragout")),t.touchData.cxtOver=cr,cr&&cr.emit(ze("cxtdragover")))}else if(se&&z.touches[2]&&ke.boxSelectionEnabled())z.preventDefault(),t.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,t.touchData.selecting||ke.emit(ze("boxstart")),t.touchData.selecting=!0,t.touchData.didSelect=!0,le[4]=1,!le||le.length===0||le[0]===void 0?(le[0]=(ve[0]+ve[2]+ve[4])/3,le[1]=(ve[1]+ve[3]+ve[5])/3,le[2]=(ve[0]+ve[2]+ve[4])/3+1,le[3]=(ve[1]+ve[3]+ve[5])/3+1):(le[2]=(ve[0]+ve[2]+ve[4])/3,le[3]=(ve[1]+ve[3]+ve[5])/3),t.redrawHint("select",!0),t.redraw();else if(se&&z.touches[1]&&!t.touchData.didSelect&&ke.zoomingEnabled()&&ke.panningEnabled()&&ke.userZoomingEnabled()&&ke.userPanningEnabled()){z.preventDefault(),t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var ar=t.dragData.touchDragEles;if(ar){t.redrawHint("drag",!0);for(var _r=0;_r0&&!t.hoverData.draggingEles&&!t.swipePanning&&t.data.bgActivePosistion!=null&&(t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.redraw())}},"touchmoveHandler"),!1);var Ve;t.registerBinding(e,"touchcancel",Ve=o(function(z){var se=t.touchData.start;t.touchData.capture=!1,se&&se.unactivate()},"touchcancelHandler"));var pe,Be,Ye,He;if(t.registerBinding(e,"touchend",pe=o(function(z){var se=t.touchData.start,le=t.touchData.capture;if(le)z.touches.length===0&&(t.touchData.capture=!1),z.preventDefault();else return;var ke=t.selection;t.swipePanning=!1,t.hoverData.draggingEles=!1;var ve=t.cy,ye=ve.zoom(),Re=t.touchData.now,_e=t.touchData.earlier;if(z.touches[0]){var ze=t.projectIntoViewport(z.touches[0].clientX,z.touches[0].clientY);Re[0]=ze[0],Re[1]=ze[1]}if(z.touches[1]){var ze=t.projectIntoViewport(z.touches[1].clientX,z.touches[1].clientY);Re[2]=ze[0],Re[3]=ze[1]}if(z.touches[2]){var ze=t.projectIntoViewport(z.touches[2].clientX,z.touches[2].clientY);Re[4]=ze[0],Re[5]=ze[1]}var Ke=o(function(Ur){return{originalEvent:z,type:Ur,position:{x:Re[0],y:Re[1]}}},"makeEvent");se&&se.unactivate();var xt;if(t.touchData.cxt){if(xt=Ke("cxttapend"),se?se.emit(xt):ve.emit(xt),!t.touchData.cxtDragged){var We=Ke("cxttap");se?se.emit(We):ve.emit(We)}t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxt=!1,t.touchData.start=null,t.redraw();return}if(!z.touches[2]&&ve.boxSelectionEnabled()&&t.touchData.selecting){t.touchData.selecting=!1;var Oe=ve.collection(t.getAllInBox(ke[0],ke[1],ke[2],ke[3]));ke[0]=void 0,ke[1]=void 0,ke[2]=void 0,ke[3]=void 0,ke[4]=0,t.redrawHint("select",!0),ve.emit(Ke("boxend"));var et=o(function(Ur){return Ur.selectable()&&!Ur.selected()},"eleWouldBeSelected");Oe.emit(Ke("box")).stdFilter(et).select().emit(Ke("boxselect")),Oe.nonempty()&&t.redrawHint("eles",!0),t.redraw()}if(se?.unactivate(),z.touches[2])t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);else if(!z.touches[1]){if(!z.touches[0]){if(!z.touches[0]){t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var Ue=t.dragData.touchDragEles;if(se!=null){var lt=se._private.grabbed;x(Ue),t.redrawHint("drag",!0),t.redrawHint("eles",!0),lt&&(se.emit(Ke("freeon")),Ue.emit(Ke("free")),t.dragData.didDrag&&(se.emit(Ke("dragfreeon")),Ue.emit(Ke("dragfree")))),i(se,["touchend","tapend","vmouseup","tapdragout"],z,{x:Re[0],y:Re[1]}),se.unactivate(),t.touchData.start=null}else{var Gt=t.findNearestElement(Re[0],Re[1],!0,!0);i(Gt,["touchend","tapend","vmouseup","tapdragout"],z,{x:Re[0],y:Re[1]})}var vt=t.touchData.startPosition[0]-Re[0],Lt=vt*vt,dt=t.touchData.startPosition[1]-Re[1],nt=dt*dt,bt=Lt+nt,wt=bt*ye*ye;t.touchData.singleTouchMoved||(se||ve.$(":selected").unselect(["tapunselect"]),i(se,["tap","vclick"],z,{x:Re[0],y:Re[1]}),Be=!1,z.timeStamp-He<=ve.multiClickDebounceTime()?(Ye&&clearTimeout(Ye),Be=!0,He=null,i(se,["dbltap","vdblclick"],z,{x:Re[0],y:Re[1]})):(Ye=setTimeout(function(){Be||i(se,["onetap","voneclick"],z,{x:Re[0],y:Re[1]})},ve.multiClickDebounceTime()),He=z.timeStamp)),se!=null&&!t.dragData.didDrag&&se._private.selectable&&wt"u"){var Le=[],Ie=o(function(z){return{clientX:z.clientX,clientY:z.clientY,force:1,identifier:z.pointerId,pageX:z.pageX,pageY:z.pageY,radiusX:z.width/2,radiusY:z.height/2,screenX:z.screenX,screenY:z.screenY,target:z.target}},"makeTouch"),Ne=o(function(z){return{event:z,touch:Ie(z)}},"makePointer"),Ce=o(function(z){Le.push(Ne(z))},"addPointer"),Fe=o(function(z){for(var se=0;se0)return U[0]}return null},"getCurveT"),g=Object.keys(p),y=0;y0?m:_ue(a,s,e,r,n,i,l,u)},"intersectLine"),checkPoint:o(function(e,r,n,i,a,s,l,u){u=u==="auto"?kf(i,a):u;var h=2*u;if(Vu(e,r,this.points,s,l,i,a-h,[0,-1],n)||Vu(e,r,this.points,s,l,i-h,a,[0,-1],n))return!0;var f=i/2+2*n,d=a/2+2*n,p=[s-f,l-d,s-f,l,s+f,l,s+f,l-d];return!!(Hs(e,r,p)||xp(e,r,h,h,s+i/2-u,l+a/2-u,n)||xp(e,r,h,h,s-i/2+u,l+a/2-u,n))},"checkPoint")}};Uu.registerNodeShapes=function(){var t=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",ls(3,0)),this.generateRoundPolygon("round-triangle",ls(3,0)),this.generatePolygon("rectangle",ls(4,0)),t.square=t.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var r=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",r),this.generateRoundPolygon("round-diamond",r)}this.generatePolygon("pentagon",ls(5,0)),this.generateRoundPolygon("round-pentagon",ls(5,0)),this.generatePolygon("hexagon",ls(6,0)),this.generateRoundPolygon("round-hexagon",ls(6,0)),this.generatePolygon("heptagon",ls(7,0)),this.generateRoundPolygon("round-heptagon",ls(7,0)),this.generatePolygon("octagon",ls(8,0)),this.generateRoundPolygon("round-octagon",ls(8,0));var n=new Array(20);{var i=HM(5,0),a=HM(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var l=0;l=e.deqFastCost*S)break}else if(h){if(b>=e.deqCost*m||b>=e.deqAvgCost*p)break}else if(T>=e.deqNoDrawCost*OM)break;var w=e.deq(n,v,y);if(w.length>0)for(var k=0;k0&&(e.onDeqd(n,g),!h&&e.shouldRedraw(n,g,v,y)&&a())},"dequeue"),l=e.priority||pI;i.beforeRender(s,l(n))}},"setupDequeueingImpl")},"setupDequeueing")},vHe=(function(){function t(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Qk;Af(this,t),this.idsByKey=new zu,this.keyForId=new zu,this.cachesByLvl=new zu,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=r}return o(t,"ElementTextureCacheLookup"),_f(t,[{key:"getIdsFor",value:o(function(r){r==null&&Kn("Can not get id list for null key");var n=this.idsByKey,i=this.idsByKey.get(r);return i||(i=new hg,n.set(r,i)),i},"getIdsFor")},{key:"addIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).add(n)},"addIdForKey")},{key:"deleteIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).delete(n)},"deleteIdForKey")},{key:"getNumberOfIdsForKey",value:o(function(r){return r==null?0:this.getIdsFor(r).size},"getNumberOfIdsForKey")},{key:"updateKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);this.deleteIdForKey(i,n),this.addIdForKey(a,n),this.keyForId.set(n,a)},"updateKeyMappingFor")},{key:"deleteKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteIdForKey(i,n),this.keyForId.delete(n)},"deleteKeyMappingFor")},{key:"keyHasChangedFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);return i!==a},"keyHasChangedFor")},{key:"isInvalid",value:o(function(r){return this.keyHasChangedFor(r)||this.doesEleInvalidateKey(r)},"isInvalid")},{key:"getCachesAt",value:o(function(r){var n=this.cachesByLvl,i=this.lvls,a=n.get(r);return a||(a=new zu,n.set(r,a),i.push(r)),a},"getCachesAt")},{key:"getCache",value:o(function(r,n){return this.getCachesAt(n).get(r)},"getCache")},{key:"get",value:o(function(r,n){var i=this.getKey(r),a=this.getCache(i,n);return a!=null&&this.updateKeyMappingFor(r),a},"get")},{key:"getForCachedKey",value:o(function(r,n){var i=this.keyForId.get(r.id()),a=this.getCache(i,n);return a},"getForCachedKey")},{key:"hasCache",value:o(function(r,n){return this.getCachesAt(n).has(r)},"hasCache")},{key:"has",value:o(function(r,n){var i=this.getKey(r);return this.hasCache(i,n)},"has")},{key:"setCache",value:o(function(r,n,i){i.key=r,this.getCachesAt(n).set(r,i)},"setCache")},{key:"set",value:o(function(r,n,i){var a=this.getKey(r);this.setCache(a,n,i),this.updateKeyMappingFor(r)},"set")},{key:"deleteCache",value:o(function(r,n){this.getCachesAt(n).delete(r)},"deleteCache")},{key:"delete",value:o(function(r,n){var i=this.getKey(r);this.deleteCache(i,n)},"_delete")},{key:"invalidateKey",value:o(function(r){var n=this;this.lvls.forEach(function(i){return n.deleteCache(r,i)})},"invalidateKey")},{key:"invalidate",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteKeyMappingFor(r);var a=this.doesEleInvalidateKey(r);return a&&this.invalidateKey(i),a||this.getNumberOfIdsForKey(i)===0},"invalidate")}])})(),Hce=25,Ok=50,Wk=-4,iI=3,Nhe=7.99,xHe=8,bHe=1024,THe=1024,wHe=1024,kHe=.2,EHe=.8,SHe=10,CHe=.15,AHe=.1,_He=.9,DHe=.9,LHe=100,RHe=1,ng={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},NHe=xa({getKey:null,doesEleInvalidateKey:Qk,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:Tue,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),ex=o(function(e,r){var n=this;n.renderer=e,n.onDequeues=[];var i=NHe(r);ir(n,i),n.lookup=new vHe(i.getKey,i.doesEleInvalidateKey),n.setupDequeueing()},"ElementTextureCache"),zi=ex.prototype;zi.reasons=ng;zi.getTextureQueue=function(t){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[t]=e.eleImgCaches[t]||[]};zi.getRetiredTextureQueue=function(t){var e=this,r=e.eleImgCaches.retired=e.eleImgCaches.retired||{},n=r[t]=r[t]||[];return n};zi.getElementQueue=function(){var t=this,e=t.eleCacheQueue=t.eleCacheQueue||new bx(function(r,n){return n.reqs-r.reqs});return e};zi.getElementKeyToQueue=function(){var t=this,e=t.eleKeyToCacheQueue=t.eleKeyToCacheQueue||{};return e};zi.getElement=function(t,e,r,n,i){var a=this,s=this.renderer,l=s.cy.zoom(),u=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!t.visible()||t.removed()||!a.allowEdgeTxrCaching&&t.isEdge()||!a.allowParentTxrCaching&&t.isParent())return null;if(n==null&&(n=Math.ceil(gI(l*r))),n=Nhe||n>iI)return null;var h=Math.pow(2,n),f=e.h*h,d=e.w*h,p=s.eleTextBiggerThanMin(t,h);if(!this.isVisible(t,p))return null;var m=u.get(t,n);if(m&&m.invalidated&&(m.invalidated=!1,m.texture.invalidatedWidth-=m.width),m)return m;var g;if(f<=Hce?g=Hce:f<=Ok?g=Ok:g=Math.ceil(f/Ok)*Ok,f>wHe||d>THe)return null;var y=a.getTextureQueue(g),v=y[y.length-2],x=o(function(){return a.recycleTexture(g,d)||a.addTexture(g,d)},"addNewTxr");v||(v=y[y.length-1]),v||(v=x()),v.width-v.usedWidthn;L--)R=a.getElement(t,e,r,L,ng.downscale);I()}else return a.queueElement(t,k.level-1),k;else{var E;if(!T&&!S&&!w)for(var D=n-1;D>=Wk;D--){var _=u.get(t,D);if(_){E=_;break}}if(b(E))return a.queueElement(t,n),E;v.context.translate(v.usedWidth,0),v.context.scale(h,h),this.drawElement(v.context,t,e,p,!1),v.context.scale(1/h,1/h),v.context.translate(-v.usedWidth,0)}return m={x:v.usedWidth,texture:v,level:n,scale:h,width:d,height:f,scaledLabelShown:p},v.usedWidth+=Math.ceil(d+xHe),v.eleCaches.push(m),u.set(t,n,m),a.checkTextureFullness(v),m};zi.invalidateElements=function(t){for(var e=0;e=kHe*t.width&&this.retireTexture(t)};zi.checkTextureFullness=function(t){var e=this,r=e.getTextureQueue(t.height);t.usedWidth/t.width>EHe&&t.fullnessChecks>=SHe?wf(r,t):t.fullnessChecks++};zi.retireTexture=function(t){var e=this,r=t.height,n=e.getTextureQueue(r),i=this.lookup;wf(n,t),t.retired=!0;for(var a=t.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,mI(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),wf(i,s),n.push(s),s}};zi.queueElement=function(t,e){var r=this,n=r.getElementQueue(),i=r.getElementKeyToQueue(),a=this.getKey(t),s=i[a];if(s)s.level=Math.max(s.level,e),s.eles.merge(t),s.reqs++,n.updateItem(s);else{var l={eles:t.spawn().merge(t),level:e,reqs:1,key:a};n.push(l),i[a]=l}};zi.dequeue=function(t){for(var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=[],a=e.lookup,s=0;s0;s++){var l=r.pop(),u=l.key,h=l.eles[0],f=a.hasCache(h,l.level);if(n[u]=null,f)continue;i.push(l);var d=e.getBoundingBox(h);e.getElement(h,d,t,l.level,ng.dequeue)}return i};zi.removeFromQueue=function(t){var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=this.getKey(t),a=n[i];a!=null&&(a.eles.length===1?(a.reqs=dI,r.updateItem(a),r.pop(),n[i]=null):a.eles.unmerge(t))};zi.onDequeue=function(t){this.onDequeues.push(t)};zi.offDequeue=function(t){wf(this.onDequeues,t)};zi.setupDequeueing=Rhe.setupDequeueing({deqRedrawThreshold:LHe,deqCost:CHe,deqAvgCost:AHe,deqNoDrawCost:_He,deqFastCost:DHe,deq:o(function(e,r,n){return e.dequeue(r,n)},"deq"),onDeqd:o(function(e,r){for(var n=0;n=IHe||r>aE)return null}n.validateLayersElesOrdering(r,t);var u=n.layersByLevel,h=Math.pow(2,r),f=u[r]=u[r]||[],d,p=n.levelIsComplete(r,t),m,g=o(function(){var I=o(function(O){if(n.validateLayersElesOrdering(O,t),n.levelIsComplete(O,t))return m=u[O],!0},"canUseAsTmpLvl"),L=o(function(O){if(!m)for(var M=r+O;rx<=M&&M<=aE&&!I(M);M+=O);},"checkLvls");L(1),L(-1);for(var E=f.length-1;E>=0;E--){var D=f[E];D.invalid&&wf(f,D)}},"checkTempLevels");if(!p)g();else return f;var y=o(function(){if(!d){d=cs();for(var I=0;IWce||D>Wce)return null;var _=E*D;if(_>VHe)return null;var O=n.makeLayer(d,r);if(L!=null){var M=f.indexOf(L)+1;f.splice(M,0,O)}else(I.insert===void 0||I.insert)&&f.unshift(O);return O},"makeLayer");if(n.skipping&&!l)return null;for(var x=null,b=t.length/MHe,T=!l,S=0;S=b||!Aue(x.bb,w.boundingBox()))&&(x=v({insert:!0,after:x}),!x))return null;m||T?n.queueLayer(x,w):n.drawEleInLayer(x,w,r,e),x.eles.push(w),A[r]=x}return m||(T?null:f)};ba.getEleLevelForLayerLevel=function(t,e){return t};ba.drawEleInLayer=function(t,e,r,n){var i=this,a=this.renderer,s=t.context,l=e.boundingBox();l.w===0||l.h===0||!e.visible()||(r=i.getEleLevelForLayerLevel(r,n),a.setImgSmoothing(s,!1),a.drawCachedElement(s,e,null,null,r,UHe),a.setImgSmoothing(s,!0))};ba.levelIsComplete=function(t,e){var r=this,n=r.layersByLevel[t];if(!n||n.length===0)return!1;for(var i=0,a=0;a0||s.invalid)return!1;i+=s.eles.length}return i===e.length};ba.validateLayersElesOrdering=function(t,e){var r=this.layersByLevel[t];if(r)for(var n=0;n0){e=!0;break}}return e};ba.invalidateElements=function(t){var e=this;t.length!==0&&(e.lastInvalidationTime=Gu(),!(t.length===0||!e.haveLayers())&&e.updateElementsInLayers(t,o(function(n,i,a){e.invalidateLayer(n)},"invalAssocLayers")))};ba.invalidateLayer=function(t){if(this.lastInvalidationTime=Gu(),!t.invalid){var e=t.level,r=t.eles,n=this.layersByLevel[e];wf(n,t),t.elesQueue=[],t.invalid=!0,t.replacement&&(t.replacement.invalid=!0);for(var i=0;i3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l=e._private.rscratch;if(!(a&&!e.visible())&&!(l.badLine||l.allpts==null||isNaN(l.allpts[0]))){var u;r&&(u=r,t.translate(-u.x1,-u.y1));var h=a?e.pstyle("opacity").value:1,f=a?e.pstyle("line-opacity").value:1,d=e.pstyle("curve-style").value,p=e.pstyle("line-style").value,m=e.pstyle("width").pfValue,g=e.pstyle("line-cap").value,y=e.pstyle("line-outline-width").value,v=e.pstyle("line-outline-color").value,x=h*f,b=h*f,T=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;d==="straight-triangle"?(s.eleStrokeStyle(t,e,O),s.drawEdgeTrianglePath(e,t,l.allpts)):(t.lineWidth=m,t.lineCap=g,s.eleStrokeStyle(t,e,O),s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLine"),S=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;if(t.lineWidth=m+y,t.lineCap=g,y>0)s.colorStrokeStyle(t,v[0],v[1],v[2],O);else{t.lineCap="butt";return}d==="straight-triangle"?s.drawEdgeTrianglePath(e,t,l.allpts):(s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLineOutline"),w=o(function(){i&&s.drawEdgeOverlay(t,e)},"drawOverlay"),k=o(function(){i&&s.drawEdgeUnderlay(t,e)},"drawUnderlay"),A=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:b;s.drawArrowheads(t,e,O)},"drawArrows"),C=o(function(){s.drawElementText(t,e,null,n)},"drawText");t.lineJoin="round";var R=e.pstyle("ghost").value==="yes";if(R){var I=e.pstyle("ghost-offset-x").pfValue,L=e.pstyle("ghost-offset-y").pfValue,E=e.pstyle("ghost-opacity").value,D=x*E;t.translate(I,L),T(D),A(D),t.translate(-I,-L)}else S();k(),T(),A(),w(),C(),r&&t.translate(u.x1,u.y1)}};Ohe=o(function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(r,n){if(n.visible()){var i=n.pstyle("".concat(e,"-opacity")).value;if(i!==0){var a=this,s=a.usePaths(),l=n._private.rscratch,u=n.pstyle("".concat(e,"-padding")).pfValue,h=2*u,f=n.pstyle("".concat(e,"-color")).value;r.lineWidth=h,l.edgeType==="self"&&!s?r.lineCap="butt":r.lineCap="round",a.colorStrokeStyle(r,f[0],f[1],f[2],i),a.drawEdgePath(n,r,l.allpts,"solid")}}}},"drawEdgeOverlayUnderlay");Hu.drawEdgeOverlay=Ohe("overlay");Hu.drawEdgeUnderlay=Ohe("underlay");Hu.drawEdgePath=function(t,e,r,n){var i=t._private.rscratch,a=e,s,l=!1,u=this.usePaths(),h=t.pstyle("line-dash-pattern").pfValue,f=t.pstyle("line-dash-offset").pfValue;if(u){var d=r.join("$"),p=i.pathCacheKey&&i.pathCacheKey===d;p?(s=e=i.pathCache,l=!0):(s=e=new Path2D,i.pathCacheKey=d,i.pathCache=s)}if(a.setLineDash)switch(n){case"dotted":a.setLineDash([1,1]);break;case"dashed":a.setLineDash(h),a.lineDashOffset=f;break;case"solid":a.setLineDash([]);break}if(!l&&!i.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(r[0],r[1]),i.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var m=2;m+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(n==null){if(a&&!s.eleTextBiggerThanMin(e))return}else if(n===!1)return;if(e.isNode()){var l=e.pstyle("label");if(!l||!l.value)return;var u=s.getLabelJustification(e);t.textAlign=u,t.textBaseline="bottom"}else{var h=e.element()._private.rscratch.badLine,f=e.pstyle("label"),d=e.pstyle("source-label"),p=e.pstyle("target-label");if(h||(!f||!f.value)&&(!d||!d.value)&&(!p||!p.value))return;t.textAlign="center",t.textBaseline="bottom"}var m=!r,g;r&&(g=r,t.translate(-g.x1,-g.y1)),i==null?(s.drawText(t,e,null,m,a),e.isEdge()&&(s.drawText(t,e,"source",m,a),s.drawText(t,e,"target",m,a))):s.drawText(t,e,i,m,a),r&&t.translate(g.x1,g.y1)};Cp.getFontCache=function(t){var e;this.fontCaches=this.fontCaches||[];for(var r=0;r2&&arguments[2]!==void 0?arguments[2]:!0,n=e.pstyle("font-style").strValue,i=e.pstyle("font-size").pfValue+"px",a=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,l=r?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,u=e.pstyle("text-outline-opacity").value*l,h=e.pstyle("color").value,f=e.pstyle("text-outline-color").value;t.font=n+" "+s+" "+i+" "+a,t.lineJoin="round",this.colorFillStyle(t,h[0],h[1],h[2],l),this.colorStrokeStyle(t,f[0],f[1],f[2],u)};o(eqe,"circle");o(Kce,"roundRect");Cp.getTextAngle=function(t,e){var r,n=t._private,i=n.rscratch,a=e?e+"-":"",s=t.pstyle(a+"text-rotation");if(s.strValue==="autorotate"){var l=Us(i,"labelAngle",e);r=t.isEdge()?l:0}else s.strValue==="none"?r=0:r=s.pfValue;return r};Cp.drawText=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=e._private,s=a.rscratch,l=i?e.effectiveOpacity():1;if(!(i&&(l===0||e.pstyle("text-opacity").value===0))){r==="main"&&(r=null);var u=Us(s,"labelX",r),h=Us(s,"labelY",r),f,d,p=this.getLabelText(e,r);if(p!=null&&p!==""&&!isNaN(u)&&!isNaN(h)){this.setupTextStyle(t,e,i);var m=r?r+"-":"",g=Us(s,"labelWidth",r),y=Us(s,"labelHeight",r),v=e.pstyle(m+"text-margin-x").pfValue,x=e.pstyle(m+"text-margin-y").pfValue,b=e.isEdge(),T=e.pstyle("text-halign").value,S=e.pstyle("text-valign").value;b&&(T="center",S="center"),u+=v,h+=x;var w;switch(n?w=this.getTextAngle(e,r):w=0,w!==0&&(f=u,d=h,t.translate(f,d),t.rotate(w),u=0,h=0),S){case"top":break;case"center":h+=y/2;break;case"bottom":h+=y;break}var k=e.pstyle("text-background-opacity").value,A=e.pstyle("text-border-opacity").value,C=e.pstyle("text-border-width").pfValue,R=e.pstyle("text-background-padding").pfValue,I=e.pstyle("text-background-shape").strValue,L=I==="round-rectangle"||I==="roundrectangle",E=I==="circle",D=2;if(k>0||C>0&&A>0){var _=t.fillStyle,O=t.strokeStyle,M=t.lineWidth,P=e.pstyle("text-background-color").value,B=e.pstyle("text-border-color").value,F=e.pstyle("text-border-style").value,G=k>0,$=C>0&&A>0,U=u-R;switch(T){case"left":U-=g;break;case"center":U-=g/2;break}var j=h-y-R,te=g+2*R,Y=y+2*R;if(G&&(t.fillStyle="rgba(".concat(P[0],",").concat(P[1],",").concat(P[2],",").concat(k*l,")")),$&&(t.strokeStyle="rgba(".concat(B[0],",").concat(B[1],",").concat(B[2],",").concat(A*l,")"),t.lineWidth=C,t.setLineDash))switch(F){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"double":t.lineWidth=C/4,t.setLineDash([]);break;case"solid":default:t.setLineDash([]);break}if(L?(t.beginPath(),Kce(t,U,j,te,Y,D)):E?(t.beginPath(),eqe(t,U,j,te,Y)):(t.beginPath(),t.rect(U,j,te,Y)),G&&t.fill(),$&&t.stroke(),$&&F==="double"){var oe=C/2;t.beginPath(),L?Kce(t,U+oe,j+oe,te-2*oe,Y-2*oe,D):t.rect(U+oe,j+oe,te-2*oe,Y-2*oe),t.stroke()}t.fillStyle=_,t.strokeStyle=O,t.lineWidth=M,t.setLineDash&&t.setLineDash([])}var J=2*e.pstyle("text-outline-width").pfValue;if(J>0&&(t.lineWidth=J),e.pstyle("text-wrap").value==="wrap"){var ue=Us(s,"labelWrapCachedLines",r),re=Us(s,"labelLineHeight",r),ee=g/2,Z=this.getLabelJustification(e);switch(Z==="auto"||(T==="left"?Z==="left"?u+=-g:Z==="center"&&(u+=-ee):T==="center"?Z==="left"?u+=-ee:Z==="right"&&(u+=ee):T==="right"&&(Z==="center"?u+=ee:Z==="right"&&(u+=g))),S){case"top":h-=(ue.length-1)*re;break;case"center":case"bottom":h-=(ue.length-1)*re;break}for(var K=0;K0&&t.strokeText(ue[K],u,h),t.fillText(ue[K],u,h),h+=re}else J>0&&t.strokeText(p,u,h),t.fillText(p,u,h);w!==0&&(t.rotate(-w),t.translate(-f,-d))}}};Lf={};Lf.drawNode=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l,u,h=e._private,f=h.rscratch,d=e.position();if(!(!At(d.x)||!At(d.y))&&!(a&&!e.visible())){var p=a?e.effectiveOpacity():1,m=s.usePaths(),g,y=!1,v=e.padding();l=e.width()+2*v,u=e.height()+2*v;var x;r&&(x=r,t.translate(-x.x1,-x.y1));for(var b=e.pstyle("background-image"),T=b.value,S=new Array(T.length),w=new Array(T.length),k=0,A=0;A0&&arguments[0]!==void 0?arguments[0]:D;s.eleFillStyle(t,e,W)},"setupShapeColor"),re=o(function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:$;s.colorStrokeStyle(t,_[0],_[1],_[2],W)},"setupBorderColor"),ee=o(function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Y;s.colorStrokeStyle(t,j[0],j[1],j[2],W)},"setupOutlineColor"),Z=o(function(W,he,z,se){var le=s.nodePathCache=s.nodePathCache||[],ke=bue(z==="polygon"?z+","+se.join(","):z,""+he,""+W,""+J),ve=le[ke],ye,Re=!1;return ve!=null?(ye=ve,Re=!0,f.pathCache=ye):(ye=new Path2D,le[ke]=f.pathCache=ye),{path:ye,cacheHit:Re}},"getPath"),K=e.pstyle("shape").strValue,ae=e.pstyle("shape-polygon-points").pfValue;if(m){t.translate(d.x,d.y);var Q=Z(l,u,K,ae);g=Q.path,y=Q.cacheHit}var de=o(function(){if(!y){var W=d;m&&(W={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(g||t,W.x,W.y,l,u,J,f)}m?t.fill(g):t.fill()},"drawShape"),ne=o(function(){for(var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,he=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,z=h.backgrounding,se=0,le=0;le0&&arguments[0]!==void 0?arguments[0]:!1,he=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p;s.hasPie(e)&&(s.drawPie(t,e,he),W&&(m||s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,J,f)))},"drawPie"),q=o(function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,he=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p;s.hasStripe(e)&&(t.save(),m?t.clip(f.pathCache):(s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,J,f),t.clip()),s.drawStripe(t,e,he),t.restore(),W&&(m||s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,J,f)))},"drawStripe"),Ve=o(function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,he=(L>0?L:-L)*W,z=L>0?0:255;L!==0&&(s.colorFillStyle(t,z,z,z,he),m?t.fill(g):t.fill())},"darken"),pe=o(function(){if(E>0){if(t.lineWidth=E,t.lineCap=P,t.lineJoin=M,t.setLineDash)switch(O){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash(F),t.lineDashOffset=G;break;case"solid":case"double":t.setLineDash([]);break}if(B!=="center"){if(t.save(),t.lineWidth*=2,B==="inside")m?t.clip(g):t.clip();else{var W=new Path2D;W.rect(-l/2-E,-u/2-E,l+2*E,u+2*E),W.addPath(g),t.clip(W,"evenodd")}m?t.stroke(g):t.stroke(),t.restore()}else m?t.stroke(g):t.stroke();if(O==="double"){t.lineWidth=E/3;var he=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",m?t.stroke(g):t.stroke(),t.globalCompositeOperation=he}t.setLineDash&&t.setLineDash([])}},"drawBorder"),Be=o(function(){if(U>0){if(t.lineWidth=U,t.lineCap="butt",t.setLineDash)switch(te){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"solid":case"double":t.setLineDash([]);break}var W=d;m&&(W={x:0,y:0});var he=s.getNodeShape(e),z=E;B==="inside"&&(z=0),B==="outside"&&(z*=2);var se=(l+z+(U+oe))/l,le=(u+z+(U+oe))/u,ke=l*se,ve=u*le,ye=s.nodeShapes[he].points,Re;if(m){var _e=Z(ke,ve,he,ye);Re=_e.path}if(he==="ellipse")s.drawEllipsePath(Re||t,W.x,W.y,ke,ve);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(he)){var ze=0,Ke=0,xt=0;he==="round-diamond"?ze=(z+oe+U)*1.4:he==="round-heptagon"?(ze=(z+oe+U)*1.075,xt=-(z/2+oe+U)/35):he==="round-hexagon"?ze=(z+oe+U)*1.12:he==="round-pentagon"?(ze=(z+oe+U)*1.13,xt=-(z/2+oe+U)/15):he==="round-tag"?(ze=(z+oe+U)*1.12,Ke=(z/2+U+oe)*.07):he==="round-triangle"&&(ze=(z+oe+U)*(Math.PI/2),xt=-(z+oe/2+U)/Math.PI),ze!==0&&(se=(l+ze)/l,ke=l*se,["round-hexagon","round-tag"].includes(he)||(le=(u+ze)/u,ve=u*le)),J=J==="auto"?Lue(ke,ve):J;for(var We=ke/2,Oe=ve/2,et=J+(z+U+oe)/2,Ue=new Array(ye.length/2),lt=new Array(ye.length/2),Gt=0;Gt0){if(i=i||n.position(),a==null||s==null){var m=n.padding();a=n.width()+2*m,s=n.height()+2*m}l.colorFillStyle(r,f[0],f[1],f[2],h),l.nodeShapes[d].draw(r,i.x,i.y,a+u*2,s+u*2,p),r.fill()}}}},"drawNodeOverlayUnderlay");Lf.drawNodeOverlay=Phe("overlay");Lf.drawNodeUnderlay=Phe("underlay");Lf.hasPie=function(t){return t=t[0],t._private.hasPie};Lf.hasStripe=function(t){return t=t[0],t._private.hasStripe};Lf.drawPie=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=e.pstyle("pie-size"),s=e.pstyle("pie-hole"),l=e.pstyle("pie-start-angle").pfValue,u=n.x,h=n.y,f=e.width(),d=e.height(),p=Math.min(f,d)/2,m,g=0,y=this.usePaths();if(y&&(u=0,h=0),a.units==="%"?p=p*a.pfValue:a.pfValue!==void 0&&(p=a.pfValue/2),s.units==="%"?m=p*s.pfValue:s.pfValue!==void 0&&(m=s.pfValue/2),!(m>=p))for(var v=1;v<=i.pieBackgroundN;v++){var x=e.pstyle("pie-"+v+"-background-size").value,b=e.pstyle("pie-"+v+"-background-color").value,T=e.pstyle("pie-"+v+"-background-opacity").value*r,S=x/100;S+g>1&&(S=1-g);var w=1.5*Math.PI+2*Math.PI*g;w+=l;var k=2*Math.PI*S,A=w+k;x===0||g>=1||g+S>1||(m===0?(t.beginPath(),t.moveTo(u,h),t.arc(u,h,p,w,A),t.closePath()):(t.beginPath(),t.arc(u,h,p,w,A),t.arc(u,h,m,A,w,!0),t.closePath()),this.colorFillStyle(t,b[0],b[1],b[2],T),t.fill(),g+=S)}};Lf.drawStripe=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=n.x,s=n.y,l=e.width(),u=e.height(),h=0,f=this.usePaths();t.save();var d=e.pstyle("stripe-direction").value,p=e.pstyle("stripe-size");switch(d){case"vertical":break;case"righward":t.rotate(-Math.PI/2);break}var m=l,g=u;p.units==="%"?(m=m*p.pfValue,g=g*p.pfValue):p.pfValue!==void 0&&(m=p.pfValue,g=p.pfValue),f&&(a=0,s=0),s-=m/2,a-=g/2;for(var y=1;y<=i.stripeBackgroundN;y++){var v=e.pstyle("stripe-"+y+"-background-size").value,x=e.pstyle("stripe-"+y+"-background-color").value,b=e.pstyle("stripe-"+y+"-background-opacity").value*r,T=v/100;T+h>1&&(T=1-h),!(v===0||h>=1||h+T>1)&&(t.beginPath(),t.rect(a,s+g*h,m,g*T),t.closePath(),this.colorFillStyle(t,x[0],x[1],x[2],b),t.fill(),h+=T)}t.restore()};us={},tqe=100;us.getPixelRatio=function(){var t=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),r=t.backingStorePixelRatio||t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/r};us.paintCache=function(t){for(var e=this.paintCaches=this.paintCaches||[],r=!0,n,i=0;ie.minMbLowQualFrames&&(e.motionBlurPxRatio=e.mbPxRBlurry)),e.clearingMotionBlur&&(e.motionBlurPxRatio=1),e.textureDrawLastFrame&&!d&&(f[e.NODE]=!0,f[e.SELECT_BOX]=!0);var b=r.style(),T=r.zoom(),S=s!==void 0?s:T,w=r.pan(),k={x:w.x,y:w.y},A={zoom:T,pan:{x:w.x,y:w.y}},C=e.prevViewport,R=C===void 0||A.zoom!==C.zoom||A.pan.x!==C.pan.x||A.pan.y!==C.pan.y;!R&&!(y&&!g)&&(e.motionBlurPxRatio=1),l&&(k=l),S*=u,k.x*=u,k.y*=u;var I=e.getCachedZSortedEles();function L(re,ee,Z,K,ae){var Q=re.globalCompositeOperation;re.globalCompositeOperation="destination-out",e.colorFillStyle(re,255,255,255,e.motionBlurTransparency),re.fillRect(ee,Z,K,ae),re.globalCompositeOperation=Q}o(L,"mbclear");function E(re,ee){var Z,K,ae,Q;!e.clearingMotionBlur&&(re===h.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]||re===h.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG])?(Z={x:w.x*m,y:w.y*m},K=T*m,ae=e.canvasWidth*m,Q=e.canvasHeight*m):(Z=k,K=S,ae=e.canvasWidth,Q=e.canvasHeight),re.setTransform(1,0,0,1,0,0),ee==="motionBlur"?L(re,0,0,ae,Q):!n&&(ee===void 0||ee)&&re.clearRect(0,0,ae,Q),i||(re.translate(Z.x,Z.y),re.scale(K,K)),l&&re.translate(l.x,l.y),s&&re.scale(s,s)}if(o(E,"setContextTransform"),d||(e.textureDrawLastFrame=!1),d){if(e.textureDrawLastFrame=!0,!e.textureCache){e.textureCache={},e.textureCache.bb=r.mutableElements().boundingBox(),e.textureCache.texture=e.data.bufferCanvases[e.TEXTURE_BUFFER];var D=e.data.bufferContexts[e.TEXTURE_BUFFER];D.setTransform(1,0,0,1,0,0),D.clearRect(0,0,e.canvasWidth*e.textureMult,e.canvasHeight*e.textureMult),e.render({forcedContext:D,drawOnlyNodeLayer:!0,forcedPxRatio:u*e.textureMult});var A=e.textureCache.viewport={zoom:r.zoom(),pan:r.pan(),width:e.canvasWidth,height:e.canvasHeight};A.mpan={x:(0-A.pan.x)/A.zoom,y:(0-A.pan.y)/A.zoom}}f[e.DRAG]=!1,f[e.NODE]=!1;var _=h.contexts[e.NODE],O=e.textureCache.texture,A=e.textureCache.viewport;_.setTransform(1,0,0,1,0,0),p?L(_,0,0,A.width,A.height):_.clearRect(0,0,A.width,A.height);var M=b.core("outside-texture-bg-color").value,P=b.core("outside-texture-bg-opacity").value;e.colorFillStyle(_,M[0],M[1],M[2],P),_.fillRect(0,0,A.width,A.height);var T=r.zoom();E(_,!1),_.clearRect(A.mpan.x,A.mpan.y,A.width/A.zoom/u,A.height/A.zoom/u),_.drawImage(O,A.mpan.x,A.mpan.y,A.width/A.zoom/u,A.height/A.zoom/u)}else e.textureOnViewport&&!n&&(e.textureCache=null);var B=r.extent(),F=e.pinching||e.hoverData.dragging||e.swipePanning||e.data.wheelZooming||e.hoverData.draggingEles||e.cy.animated(),G=e.hideEdgesOnViewport&&F,$=[];if($[e.NODE]=!f[e.NODE]&&p&&!e.clearedForMotionBlur[e.NODE]||e.clearingMotionBlur,$[e.NODE]&&(e.clearedForMotionBlur[e.NODE]=!0),$[e.DRAG]=!f[e.DRAG]&&p&&!e.clearedForMotionBlur[e.DRAG]||e.clearingMotionBlur,$[e.DRAG]&&(e.clearedForMotionBlur[e.DRAG]=!0),f[e.NODE]||i||a||$[e.NODE]){var U=p&&!$[e.NODE]&&m!==1,_=n||(U?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]:h.contexts[e.NODE]),j=p&&!U?"motionBlur":void 0;E(_,j),G?e.drawCachedNodes(_,I.nondrag,u,B):e.drawLayeredElements(_,I.nondrag,u,B),e.debug&&e.drawDebugPoints(_,I.nondrag),!i&&!p&&(f[e.NODE]=!1)}if(!a&&(f[e.DRAG]||i||$[e.DRAG])){var U=p&&!$[e.DRAG]&&m!==1,_=n||(U?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG]:h.contexts[e.DRAG]);E(_,p&&!U?"motionBlur":void 0),G?e.drawCachedNodes(_,I.drag,u,B):e.drawCachedElements(_,I.drag,u,B),e.debug&&e.drawDebugPoints(_,I.drag),!i&&!p&&(f[e.DRAG]=!1)}if(this.drawSelectionRectangle(t,E),p&&m!==1){var te=h.contexts[e.NODE],Y=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_NODE],oe=h.contexts[e.DRAG],J=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_DRAG],ue=o(function(ee,Z,K){ee.setTransform(1,0,0,1,0,0),K||!x?ee.clearRect(0,0,e.canvasWidth,e.canvasHeight):L(ee,0,0,e.canvasWidth,e.canvasHeight);var ae=m;ee.drawImage(Z,0,0,e.canvasWidth*ae,e.canvasHeight*ae,0,0,e.canvasWidth,e.canvasHeight)},"drawMotionBlur");(f[e.NODE]||$[e.NODE])&&(ue(te,Y,$[e.NODE]),f[e.NODE]=!1),(f[e.DRAG]||$[e.DRAG])&&(ue(oe,J,$[e.DRAG]),f[e.DRAG]=!1)}e.prevViewport=A,e.clearingMotionBlur&&(e.clearingMotionBlur=!1,e.motionBlurCleared=!0,e.motionBlur=!0),p&&(e.motionBlurTimeout=setTimeout(function(){e.motionBlurTimeout=null,e.clearedForMotionBlur[e.NODE]=!1,e.clearedForMotionBlur[e.DRAG]=!1,e.motionBlur=!1,e.clearingMotionBlur=!d,e.mbFrames=0,f[e.NODE]=!0,f[e.DRAG]=!0,e.redraw()},tqe)),n||r.emit("render")};us.drawSelectionRectangle=function(t,e){var r=this,n=r.cy,i=r.data,a=n.style(),s=t.drawOnlyNodeLayer,l=t.drawAllLayers,u=i.canvasNeedsRedraw,h=t.forcedContext;if(r.showFps||!s&&u[r.SELECT_BOX]&&!l){var f=h||i.contexts[r.SELECT_BOX];if(e(f),r.selection[4]==1&&(r.hoverData.selecting||r.touchData.selecting)){var d=r.cy.zoom(),p=a.core("selection-box-border-width").value/d;f.lineWidth=p,f.fillStyle="rgba("+a.core("selection-box-color").value[0]+","+a.core("selection-box-color").value[1]+","+a.core("selection-box-color").value[2]+","+a.core("selection-box-opacity").value+")",f.fillRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]),p>0&&(f.strokeStyle="rgba("+a.core("selection-box-border-color").value[0]+","+a.core("selection-box-border-color").value[1]+","+a.core("selection-box-border-color").value[2]+","+a.core("selection-box-opacity").value+")",f.strokeRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]))}if(i.bgActivePosistion&&!r.hoverData.selecting){var d=r.cy.zoom(),m=i.bgActivePosistion;f.fillStyle="rgba("+a.core("active-bg-color").value[0]+","+a.core("active-bg-color").value[1]+","+a.core("active-bg-color").value[2]+","+a.core("active-bg-opacity").value+")",f.beginPath(),f.arc(m.x,m.y,a.core("active-bg-size").pfValue/d,0,2*Math.PI),f.fill()}var g=r.lastRedrawTime;if(r.showFps&&g){g=Math.round(g);var y=Math.round(1e3/g),v="1 frame = "+g+" ms = "+y+" fps";if(f.setTransform(1,0,0,1,0,0),f.fillStyle="rgba(255, 0, 0, 0.75)",f.strokeStyle="rgba(255, 0, 0, 0.75)",f.font="30px Arial",!j2){var x=f.measureText(v);j2=x.actualBoundingBoxAscent}f.fillText(v,0,j2);var b=60;f.strokeRect(0,j2+10,250,20),f.fillRect(0,j2+10,250*Math.min(y/b,1),20)}l||(u[r.SELECT_BOX]=!1)}};o(Qce,"compileShader");o(rqe,"createProgram");o(nqe,"createTextureCanvas");o(MI,"getEffectivePanZoom");o(iqe,"getEffectiveZoom");o(aqe,"modelToRenderedPosition");o(sqe,"isSimpleShape");o(oqe,"arrayEqual");o(dp,"toWebGLColor");o(Zm,"indexToVec4");o(lqe,"vec4ToIndex");o(cqe,"createTexture");o(Bhe,"getTypeInfo");o(Fhe,"createTypedArray");o(uqe,"createTypedArrayView");o(hqe,"createBufferStaticDraw");o(Mc,"createBufferDynamicDraw");o(fqe,"create3x3MatrixBufferDynamicDraw");o(dqe,"createPickingFrameBuffer");Zce=typeof Float32Array<"u"?Float32Array:Array;Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});o(BM,"create");o(Jce,"identity");o(pqe,"multiply");o(Yk,"translate");o(eue,"rotate");o(aI,"scale");o(mqe,"projection");gqe=(function(){function t(e,r,n,i){Af(this,t),this.debugID=Math.floor(Math.random()*1e4),this.r=e,this.texSize=r,this.texRows=n,this.texHeight=Math.floor(r/n),this.enableWrapping=!0,this.locked=!1,this.texture=null,this.needsBuffer=!0,this.freePointer={x:0,row:0},this.keyToLocation=new Map,this.canvas=i(e,r,r),this.scratch=i(e,r,this.texHeight,"scratch")}return o(t,"Atlas"),_f(t,[{key:"lock",value:o(function(){this.locked=!0},"lock")},{key:"getKeys",value:o(function(){return new Set(this.keyToLocation.keys())},"getKeys")},{key:"getScale",value:o(function(r){var n=r.w,i=r.h,a=this.texHeight,s=this.texSize,l=a/i,u=n*l,h=i*l;return u>s&&(l=s/n,u=n*l,h=i*l),{scale:l,texW:u,texH:h}},"getScale")},{key:"draw",value:o(function(r,n,i){var a=this;if(this.locked)throw new Error("can't draw, atlas is locked");var s=this.texSize,l=this.texRows,u=this.texHeight,h=this.getScale(n),f=h.scale,d=h.texW,p=h.texH,m=o(function(T,S){if(i&&S){var w=S.context,k=T.x,A=T.row,C=k,R=u*A;w.save(),w.translate(C,R),w.scale(f,f),i(w,n),w.restore()}},"drawAt"),g=[null,null],y=o(function(){m(a.freePointer,a.canvas),g[0]={x:a.freePointer.x,y:a.freePointer.row*u,w:d,h:p},g[1]={x:a.freePointer.x+d,y:a.freePointer.row*u,w:0,h:p},a.freePointer.x+=d,a.freePointer.x==s&&(a.freePointer.x=0,a.freePointer.row++)},"drawNormal"),v=o(function(){var T=a.scratch,S=a.canvas;T.clear(),m({x:0,row:0},T);var w=s-a.freePointer.x,k=d-w,A=u;{var C=a.freePointer.x,R=a.freePointer.row*u,I=w;S.context.drawImage(T,0,0,I,A,C,R,I,A),g[0]={x:C,y:R,w:I,h:p}}{var L=w,E=(a.freePointer.row+1)*u,D=k;S&&S.context.drawImage(T,L,0,D,A,0,E,D,A),g[1]={x:0,y:E,w:D,h:p}}a.freePointer.x=k,a.freePointer.row++},"drawWrapped"),x=o(function(){a.freePointer.x=0,a.freePointer.row++},"moveToStartOfNextRow");if(this.freePointer.x+d<=s)y();else{if(this.freePointer.row>=l-1)return!1;this.freePointer.x===s?(x(),y()):this.enableWrapping?v():(x(),y())}return this.keyToLocation.set(r,g),this.needsBuffer=!0,g},"draw")},{key:"getOffsets",value:o(function(r){return this.keyToLocation.get(r)},"getOffsets")},{key:"isEmpty",value:o(function(){return this.freePointer.x===0&&this.freePointer.row===0},"isEmpty")},{key:"canFit",value:o(function(r){if(this.locked)return!1;var n=this.texSize,i=this.texRows,a=this.getScale(r),s=a.texW;return this.freePointer.x+s>n?this.freePointer.row1&&arguments[1]!==void 0?arguments[1]:{},a=i.forceRedraw,s=a===void 0?!1:a,l=i.filterEle,u=l===void 0?function(){return!0}:l,h=i.filterType,f=h===void 0?function(){return!0}:h,d=!1,p=!1,m=qs(r),g;try{for(m.s();!(g=m.n()).done;){var y=g.value;if(u(y)){var v=qs(this.renderTypes.values()),x;try{var b=o(function(){var S=x.value,w=S.type;if(f(w)){var k=n.collections.get(S.collection),A=S.getKey(y),C=Array.isArray(A)?A:[A];if(s)C.forEach(function(E){return k.markKeyForGC(E)}),p=!0;else{var R=S.getID?S.getID(y):y.id(),I=n._key(w,R),L=n.typeAndIdToKey.get(I);L!==void 0&&!oqe(C,L)&&(d=!0,n.typeAndIdToKey.delete(I),L.forEach(function(E){return k.markKeyForGC(E)}))}}},"_loop2");for(v.s();!(x=v.n()).done;)b()}catch(T){v.e(T)}finally{v.f()}}}}catch(T){m.e(T)}finally{m.f()}return p&&(this.gc(),d=!1),d},"invalidate")},{key:"gc",value:o(function(){var r=qs(this.collections.values()),n;try{for(r.s();!(n=r.n()).done;){var i=n.value;i.gc()}}catch(a){r.e(a)}finally{r.f()}},"gc")},{key:"getOrCreateAtlas",value:o(function(r,n,i,a){var s=this.renderTypes.get(n),l=this.collections.get(s.collection),u=!1,h=l.draw(a,i,function(p){s.drawClipped?(p.save(),p.beginPath(),p.rect(0,0,i.w,i.h),p.clip(),s.drawElement(p,r,i,!0,!0),p.restore()):s.drawElement(p,r,i,!0,!0),u=!0});if(u){var f=s.getID?s.getID(r):r.id(),d=this._key(n,f);this.typeAndIdToKey.has(d)?this.typeAndIdToKey.get(d).push(a):this.typeAndIdToKey.set(d,[a])}return h},"getOrCreateAtlas")},{key:"getAtlasInfo",value:o(function(r,n){var i=this,a=this.renderTypes.get(n),s=a.getKey(r),l=Array.isArray(s)?s:[s];return l.map(function(u){var h=a.getBoundingBox(r,u),f=i.getOrCreateAtlas(r,n,h,u),d=f.getOffsets(u),p=_i(d,2),m=p[0],g=p[1];return{atlas:f,tex:m,tex1:m,tex2:g,bb:h}})},"getAtlasInfo")},{key:"getDebugInfo",value:o(function(){var r=[],n=qs(this.collections),i;try{for(n.s();!(i=n.n()).done;){var a=_i(i.value,2),s=a[0],l=a[1],u=l.getCounts(),h=u.keyCount,f=u.atlasCount;r.push({type:s,keyCount:h,atlasCount:f})}}catch(d){n.e(d)}finally{n.f()}return r},"getDebugInfo")}])})(),bqe=(function(){function t(e){Af(this,t),this.globalOptions=e,this.atlasSize=e.webglTexSize,this.maxAtlasesPerBatch=e.webglTexPerBatch,this.batchAtlases=[]}return o(t,"AtlasBatchManager"),_f(t,[{key:"getMaxAtlasesPerBatch",value:o(function(){return this.maxAtlasesPerBatch},"getMaxAtlasesPerBatch")},{key:"getAtlasSize",value:o(function(){return this.atlasSize},"getAtlasSize")},{key:"getIndexArray",value:o(function(){return Array.from({length:this.maxAtlasesPerBatch},function(r,n){return n})},"getIndexArray")},{key:"startBatch",value:o(function(){this.batchAtlases=[]},"startBatch")},{key:"getAtlasCount",value:o(function(){return this.batchAtlases.length},"getAtlasCount")},{key:"getAtlases",value:o(function(){return this.batchAtlases},"getAtlases")},{key:"canAddToCurrentBatch",value:o(function(r){return this.batchAtlases.length===this.maxAtlasesPerBatch?this.batchAtlases.includes(r):!0},"canAddToCurrentBatch")},{key:"getAtlasIndexForBatch",value:o(function(r){var n=this.batchAtlases.indexOf(r);if(n<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)throw new Error("cannot add more atlases to batch");this.batchAtlases.push(r),n=this.batchAtlases.length-1}return n},"getAtlasIndexForBatch")}])})(),Tqe=` + float circleSD(vec2 p, float r) { + return distance(vec2(0), p) - r; // signed distance + } +`,wqe=` + float rectangleSD(vec2 p, vec2 b) { + vec2 d = abs(p)-b; + return distance(vec2(0),max(d,0.0)) + min(max(d.x,d.y),0.0); + } +`,kqe=` + float roundRectangleSD(vec2 p, vec2 b, vec4 cr) { + cr.xy = (p.x > 0.0) ? cr.xy : cr.zw; + cr.x = (p.y > 0.0) ? cr.x : cr.y; + vec2 q = abs(p) - b + cr.x; + return min(max(q.x, q.y), 0.0) + distance(vec2(0), max(q, 0.0)) - cr.x; + } +`,Eqe=` + float ellipseSD(vec2 p, vec2 ab) { + p = abs( p ); // symmetry + + // find root with Newton solver + vec2 q = ab*(p-ab); + float w = (q.x1.0) ? d : -d; + } +`,nx={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},sE={IGNORE:1,USE_BB:2},FM=0,tue=1,rue=2,$M=3,Jm=4,Pk=5,K2=6,Q2=7,Sqe=(function(){function t(e,r,n){Af(this,t),this.r=e,this.gl=r,this.maxInstances=n.webglBatchSize,this.atlasSize=n.webglTexSize,this.bgColor=n.bgColor,this.debug=n.webglDebug,this.batchDebugInfo=[],n.enableWrapping=!0,n.createTextureCanvas=nqe,this.atlasManager=new xqe(e,n),this.batchManager=new bqe(n),this.simpleShapeOptions=new Map,this.program=this._createShaderProgram(nx.SCREEN),this.pickingProgram=this._createShaderProgram(nx.PICKING),this.vao=this._createVAO()}return o(t,"ElementDrawingWebGL"),_f(t,[{key:"addAtlasCollection",value:o(function(r,n){this.atlasManager.addAtlasCollection(r,n)},"addAtlasCollection")},{key:"addTextureAtlasRenderType",value:o(function(r,n){this.atlasManager.addRenderType(r,n)},"addTextureAtlasRenderType")},{key:"addSimpleShapeRenderType",value:o(function(r,n){this.simpleShapeOptions.set(r,n)},"addSimpleShapeRenderType")},{key:"invalidate",value:o(function(r){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=n.type,a=this.atlasManager;return i?a.invalidate(r,{filterType:o(function(l){return l===i},"filterType"),forceRedraw:!0}):a.invalidate(r)},"invalidate")},{key:"gc",value:o(function(){this.atlasManager.gc()},"gc")},{key:"_createShaderProgram",value:o(function(r){var n=this.gl,i=`#version 300 es + precision highp float; + + uniform mat3 uPanZoomMatrix; + uniform int uAtlasSize; + + // instanced + in vec2 aPosition; // a vertex from the unit square + + in mat3 aTransform; // used to transform verticies, eg into a bounding box + in int aVertType; // the type of thing we are rendering + + // the z-index that is output when using picking mode + in vec4 aIndex; + + // For textures + in int aAtlasId; // which shader unit/atlas to use + in vec4 aTex; // x/y/w/h of texture in atlas + + // for edges + in vec4 aPointAPointB; + in vec4 aPointCPointD; + in vec2 aLineWidth; // also used for node border width + + // simple shapes + in vec4 aCornerRadius; // for round-rectangle [top-right, bottom-right, top-left, bottom-left] + in vec4 aColor; // also used for edges + in vec4 aBorderColor; // aLineWidth is used for border width + + // output values passed to the fragment shader + out vec2 vTexCoord; + out vec4 vColor; + out vec2 vPosition; + // flat values are not interpolated + flat out int vAtlasId; + flat out int vVertType; + flat out vec2 vTopRight; + flat out vec2 vBotLeft; + flat out vec4 vCornerRadius; + flat out vec4 vBorderColor; + flat out vec2 vBorderWidth; + flat out vec4 vIndex; + + void main(void) { + int vid = gl_VertexID; + vec2 position = aPosition; // TODO make this a vec3, simplifies some code below + + if(aVertType == `.concat(FM,`) { + float texX = aTex.x; // texture coordinates + float texY = aTex.y; + float texW = aTex.z; + float texH = aTex.w; + + if(vid == 1 || vid == 2 || vid == 4) { + texX += texW; + } + if(vid == 2 || vid == 4 || vid == 5) { + texY += texH; + } + + float d = float(uAtlasSize); + vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1 + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + } + else if(aVertType == `).concat(Jm," || aVertType == ").concat(Q2,` + || aVertType == `).concat(Pk," || aVertType == ").concat(K2,`) { // simple shapes + + // the bounding box is needed by the fragment shader + vBotLeft = (aTransform * vec3(0, 0, 1)).xy; // flat + vTopRight = (aTransform * vec3(1, 1, 1)).xy; // flat + vPosition = (aTransform * vec3(position, 1)).xy; // will be interpolated + + // calculations are done in the fragment shader, just pass these along + vColor = aColor; + vCornerRadius = aCornerRadius; + vBorderColor = aBorderColor; + vBorderWidth = aLineWidth; + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + } + else if(aVertType == `).concat(tue,`) { + vec2 source = aPointAPointB.xy; + vec2 target = aPointAPointB.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + // stretch the unit square into a long skinny rectangle + vec2 xBasis = target - source; + vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x)); + vec2 point = source + xBasis * position.x + yBasis * aLineWidth[0] * position.y; + + gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0); + vColor = aColor; + } + else if(aVertType == `).concat(rue,`) { + vec2 pointA = aPointAPointB.xy; + vec2 pointB = aPointAPointB.zw; + vec2 pointC = aPointCPointD.xy; + vec2 pointD = aPointCPointD.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + vec2 p0, p1, p2, pos; + if(position.x == 0.0) { // The left side of the unit square + p0 = pointA; + p1 = pointB; + p2 = pointC; + pos = position; + } else { // The right side of the unit square, use same approach but flip the geometry upside down + p0 = pointD; + p1 = pointC; + p2 = pointB; + pos = vec2(0.0, -position.y); + } + + vec2 p01 = p1 - p0; + vec2 p12 = p2 - p1; + vec2 p21 = p1 - p2; + + // Find the normal vector. + vec2 tangent = normalize(normalize(p12) + normalize(p01)); + vec2 normal = vec2(-tangent.y, tangent.x); + + // Find the vector perpendicular to p0 -> p1. + vec2 p01Norm = normalize(vec2(-p01.y, p01.x)); + + // Determine the bend direction. + float sigma = sign(dot(p01 + p21, normal)); + float width = aLineWidth[0]; + + if(sign(pos.y) == -sigma) { + // This is an intersecting vertex. Adjust the position so that there's no overlap. + vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } else { + // This is a non-intersecting vertex. Treat it like a mitre join. + vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } + + vColor = aColor; + } + else if(aVertType == `).concat($M,` && vid < 3) { + // massage the first triangle into an edge arrow + if(vid == 0) + position = vec2(-0.15, -0.3); + if(vid == 1) + position = vec2( 0.0, 0.0); + if(vid == 2) + position = vec2( 0.15, -0.3); + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + vColor = aColor; + } + else { + gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space + } + + vAtlasId = aAtlasId; + vVertType = aVertType; + vIndex = aIndex; + } + `),a=this.batchManager.getIndexArray(),s=`#version 300 es + precision highp float; + + // declare texture unit for each texture atlas in the batch + `.concat(a.map(function(h){return"uniform sampler2D uTexture".concat(h,";")}).join(` + `),` + + uniform vec4 uBGColor; + uniform float uZoom; + + in vec2 vTexCoord; + in vec4 vColor; + in vec2 vPosition; // model coordinates + + flat in int vAtlasId; + flat in vec4 vIndex; + flat in int vVertType; + flat in vec2 vTopRight; + flat in vec2 vBotLeft; + flat in vec4 vCornerRadius; + flat in vec4 vBorderColor; + flat in vec2 vBorderWidth; + + out vec4 outColor; + + `).concat(Tqe,` + `).concat(wqe,` + `).concat(kqe,` + `).concat(Eqe,` + + vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha + return vec4( + top.rgb + (bot.rgb * (1.0 - top.a)), + top.a + (bot.a * (1.0 - top.a)) + ); + } + + vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance + // scale to the zoom level so that borders don't look blurry when zoomed in + // note 1.5 is an aribitrary value chosen because it looks good + return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); + } + + void main(void) { + if(vVertType == `).concat(FM,`) { + // look up the texel from the texture unit + `).concat(a.map(function(h){return"if(vAtlasId == ".concat(h,") outColor = texture(uTexture").concat(h,", vTexCoord);")}).join(` + else `),` + } + else if(vVertType == `).concat($M,`) { + // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out'; + outColor = blend(vColor, uBGColor); + outColor.a = 1.0; // make opaque, masks out line under arrow + } + else if(vVertType == `).concat(Jm,` && vBorderWidth == vec2(0.0)) { // simple rectangle with no border + outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done + } + else if(vVertType == `).concat(Jm," || vVertType == ").concat(Q2,` + || vVertType == `).concat(Pk," || vVertType == ").concat(K2,`) { // use SDF + + float outerBorder = vBorderWidth[0]; + float innerBorder = vBorderWidth[1]; + float borderPadding = outerBorder * 2.0; + float w = vTopRight.x - vBotLeft.x - borderPadding; + float h = vTopRight.y - vBotLeft.y - borderPadding; + vec2 b = vec2(w/2.0, h/2.0); // half width, half height + vec2 p = vPosition - vec2(vTopRight.x - b[0] - outerBorder, vTopRight.y - b[1] - outerBorder); // translate to center + + float d; // signed distance + if(vVertType == `).concat(Jm,`) { + d = rectangleSD(p, b); + } else if(vVertType == `).concat(Q2,` && w == h) { + d = circleSD(p, b.x); // faster than ellipse + } else if(vVertType == `).concat(Q2,`) { + d = ellipseSD(p, b); + } else { + d = roundRectangleSD(p, b, vCornerRadius.wzyx); + } + + // use the distance to interpolate a color to smooth the edges of the shape, doesn't need multisampling + // we must smooth colors inwards, because we can't change pixels outside the shape's bounding box + if(d > 0.0) { + if(d > outerBorder) { + discard; + } else { + outColor = distInterp(vBorderColor, vec4(0), d - outerBorder); + } + } else { + if(d > innerBorder) { + vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor; + vec4 innerBorderColor = blend(vBorderColor, vColor); + outColor = distInterp(innerBorderColor, outerColor, d); + } + else { + vec4 outerColor; + if(innerBorder == 0.0 && outerBorder == 0.0) { + outerColor = vec4(0); + } else if(innerBorder == 0.0) { + outerColor = vBorderColor; + } else { + outerColor = blend(vBorderColor, vColor); + } + outColor = distInterp(vColor, outerColor, d - innerBorder); + } + } + } + else { + outColor = vColor; + } + + `).concat(r.picking?`if(outColor.a == 0.0) discard; + else outColor = vIndex;`:"",` + } + `),l=rqe(n,i,s);l.aPosition=n.getAttribLocation(l,"aPosition"),l.aIndex=n.getAttribLocation(l,"aIndex"),l.aVertType=n.getAttribLocation(l,"aVertType"),l.aTransform=n.getAttribLocation(l,"aTransform"),l.aAtlasId=n.getAttribLocation(l,"aAtlasId"),l.aTex=n.getAttribLocation(l,"aTex"),l.aPointAPointB=n.getAttribLocation(l,"aPointAPointB"),l.aPointCPointD=n.getAttribLocation(l,"aPointCPointD"),l.aLineWidth=n.getAttribLocation(l,"aLineWidth"),l.aColor=n.getAttribLocation(l,"aColor"),l.aCornerRadius=n.getAttribLocation(l,"aCornerRadius"),l.aBorderColor=n.getAttribLocation(l,"aBorderColor"),l.uPanZoomMatrix=n.getUniformLocation(l,"uPanZoomMatrix"),l.uAtlasSize=n.getUniformLocation(l,"uAtlasSize"),l.uBGColor=n.getUniformLocation(l,"uBGColor"),l.uZoom=n.getUniformLocation(l,"uZoom"),l.uTextures=[];for(var u=0;u1&&arguments[1]!==void 0?arguments[1]:nx.SCREEN;this.panZoomMatrix=r,this.renderTarget=n,this.batchDebugInfo=[],this.wrappedCount=0,this.simpleCount=0,this.startBatch()},"startFrame")},{key:"startBatch",value:o(function(){this.instanceCount=0,this.batchManager.startBatch()},"startBatch")},{key:"endFrame",value:o(function(){this.endBatch()},"endFrame")},{key:"_isVisible",value:o(function(r,n){return r.visible()?n&&n.isVisible?n.isVisible(r):!0:!1},"_isVisible")},{key:"drawTexture",value:o(function(r,n,i){var a=this.atlasManager,s=this.batchManager,l=a.getRenderTypeOpts(i);if(this._isVisible(r,l)&&!(r.isEdge()&&!this._isValidEdge(r))){if(this.renderTarget.picking&&l.getTexPickingMode){var u=l.getTexPickingMode(r);if(u===sE.IGNORE)return;if(u==sE.USE_BB){this.drawPickingRectangle(r,n,i);return}}var h=a.getAtlasInfo(r,i),f=qs(h),d;try{for(f.s();!(d=f.n()).done;){var p=d.value,m=p.atlas,g=p.tex1,y=p.tex2;s.canAddToCurrentBatch(m)||this.endBatch();for(var v=s.getAtlasIndexForBatch(m),x=0,b=[[g,!0],[y,!1]];x=this.maxInstances&&this.endBatch()}}}}catch(L){f.e(L)}finally{f.f()}}},"drawTexture")},{key:"setTransformMatrix",value:o(function(r,n,i,a){var s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,l=0;if(i.shapeProps&&i.shapeProps.padding&&(l=r.pstyle(i.shapeProps.padding).pfValue),a){var u=a.bb,h=a.tex1,f=a.tex2,d=h.w/(h.w+f.w);s||(d=1-d);var p=this._getAdjustedBB(u,l,s,d);this._applyTransformMatrix(n,p,i,r)}else{var m=i.getBoundingBox(r),g=this._getAdjustedBB(m,l,!0,1);this._applyTransformMatrix(n,g,i,r)}},"setTransformMatrix")},{key:"_applyTransformMatrix",value:o(function(r,n,i,a){var s,l;Jce(r);var u=i.getRotation?i.getRotation(a):0;if(u!==0){var h=i.getRotationPoint(a),f=h.x,d=h.y;Yk(r,r,[f,d]),eue(r,r,u);var p=i.getRotationOffset(a);s=p.x+(n.xOffset||0),l=p.y+(n.yOffset||0)}else s=n.x1,l=n.y1;Yk(r,r,[s,l]),aI(r,r,[n.w,n.h])},"_applyTransformMatrix")},{key:"_getAdjustedBB",value:o(function(r,n,i,a){var s=r.x1,l=r.y1,u=r.w,h=r.h,f=r.yOffset;n&&(s-=n,l-=n,u+=2*n,h+=2*n);var d=0,p=u*a;return i&&a<1?u=p:!i&&a<1&&(d=u-p,s+=d,u=p),{x1:s,y1:l,w:u,h,xOffset:d,yOffset:f}},"_getAdjustedBB")},{key:"drawPickingRectangle",value:o(function(r,n,i){var a=this.atlasManager.getRenderTypeOpts(i),s=this.instanceCount;this.vertTypeBuffer.getView(s)[0]=Jm;var l=this.indexBuffer.getView(s);Zm(n,l);var u=this.colorBuffer.getView(s);dp([0,0,0],1,u);var h=this.transformBuffer.getMatrixView(s);this.setTransformMatrix(r,h,a),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()},"drawPickingRectangle")},{key:"drawNode",value:o(function(r,n,i){var a=this.simpleShapeOptions.get(i);if(this._isVisible(r,a)){var s=a.shapeProps,l=this._getVertTypeForShape(r,s.shape);if(l===void 0||a.isSimple&&!a.isSimple(r)){this.drawTexture(r,n,i);return}var u=this.instanceCount;if(this.vertTypeBuffer.getView(u)[0]=l,l===Pk||l===K2){var h=a.getBoundingBox(r),f=this._getCornerRadius(r,s.radius,h),d=this.cornerRadiusBuffer.getView(u);d[0]=f,d[1]=f,d[2]=f,d[3]=f,l===K2&&(d[0]=0,d[2]=0)}var p=this.indexBuffer.getView(u);Zm(n,p);var m=r.pstyle(s.color).value,g=r.pstyle(s.opacity).value,y=this.colorBuffer.getView(u);dp(m,g,y);var v=this.lineWidthBuffer.getView(u);if(v[0]=0,v[1]=0,s.border){var x=r.pstyle("border-width").value;if(x>0){var b=r.pstyle("border-color").value,T=r.pstyle("border-opacity").value,S=this.borderColorBuffer.getView(u);dp(b,T,S);var w=r.pstyle("border-position").value;if(w==="inside")v[0]=0,v[1]=-x;else if(w==="outside")v[0]=x,v[1]=0;else{var k=x/2;v[0]=k,v[1]=-k}}}var A=this.transformBuffer.getMatrixView(u);this.setTransformMatrix(r,A,a),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}},"drawNode")},{key:"_getVertTypeForShape",value:o(function(r,n){var i=r.pstyle(n).value;switch(i){case"rectangle":return Jm;case"ellipse":return Q2;case"roundrectangle":case"round-rectangle":return Pk;case"bottom-round-rectangle":return K2;default:return}},"_getVertTypeForShape")},{key:"_getCornerRadius",value:o(function(r,n,i){var a=i.w,s=i.h;if(r.pstyle(n).value==="auto")return kf(a,s);var l=r.pstyle(n).pfValue,u=a/2,h=s/2;return Math.min(l,h,u)},"_getCornerRadius")},{key:"drawEdgeArrow",value:o(function(r,n,i){if(r.visible()){var a=r._private.rscratch,s,l,u;if(i==="source"?(s=a.arrowStartX,l=a.arrowStartY,u=a.srcArrowAngle):(s=a.arrowEndX,l=a.arrowEndY,u=a.tgtArrowAngle),!(isNaN(s)||s==null||isNaN(l)||l==null||isNaN(u)||u==null)){var h=r.pstyle(i+"-arrow-shape").value;if(h!=="none"){var f=r.pstyle(i+"-arrow-color").value,d=r.pstyle("opacity").value,p=r.pstyle("line-opacity").value,m=d*p,g=r.pstyle("width").pfValue,y=r.pstyle("arrow-scale").value,v=this.r.getArrowWidth(g,y),x=this.instanceCount,b=this.transformBuffer.getMatrixView(x);Jce(b),Yk(b,b,[s,l]),aI(b,b,[v,v]),eue(b,b,u),this.vertTypeBuffer.getView(x)[0]=$M;var T=this.indexBuffer.getView(x);Zm(n,T);var S=this.colorBuffer.getView(x);dp(f,m,S),this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},"drawEdgeArrow")},{key:"drawEdgeLine",value:o(function(r,n){if(r.visible()){var i=this._getEdgePoints(r);if(i){var a=r.pstyle("opacity").value,s=r.pstyle("line-opacity").value,l=r.pstyle("width").pfValue,u=r.pstyle("line-color").value,h=a*s;if(i.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),i.length==4){var f=this.instanceCount;this.vertTypeBuffer.getView(f)[0]=tue;var d=this.indexBuffer.getView(f);Zm(n,d);var p=this.colorBuffer.getView(f);dp(u,h,p);var m=this.lineWidthBuffer.getView(f);m[0]=l;var g=this.pointAPointBBuffer.getView(f);g[0]=i[0],g[1]=i[1],g[2]=i[2],g[3]=i[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var y=0;y=this.maxInstances&&this.endBatch()}}}},"drawEdgeLine")},{key:"_isValidEdge",value:o(function(r){var n=r._private.rscratch;return!(n.badLine||n.allpts==null||isNaN(n.allpts[0]))},"_isValidEdge")},{key:"_getEdgePoints",value:o(function(r){var n=r._private.rscratch;if(this._isValidEdge(r)){var i=n.allpts;if(i.length==4)return i;var a=this._getNumSegments(r);return this._getCurveSegmentPoints(i,a)}},"_getEdgePoints")},{key:"_getNumSegments",value:o(function(r){var n=15;return Math.min(Math.max(n,5),this.maxInstances)},"_getNumSegments")},{key:"_getCurveSegmentPoints",value:o(function(r,n){if(r.length==4)return r;for(var i=Array((n+1)*2),a=0;a<=n;a++)if(a==0)i[0]=r[0],i[1]=r[1];else if(a==n)i[a*2]=r[r.length-2],i[a*2+1]=r[r.length-1];else{var s=a/n;this._setCurvePoint(r,s,i,a*2)}return i},"_getCurveSegmentPoints")},{key:"_setCurvePoint",value:o(function(r,n,i,a){if(r.length<=2)i[a]=r[0],i[a+1]=r[1];else{for(var s=Array(r.length-2),l=0;l0}},"isLayerVisible"),l=o(function(d){var p=d.pstyle("text-events").strValue==="yes";return p?sE.USE_BB:sE.IGNORE},"getTexPickingMode"),u=o(function(d){var p=d.position(),m=p.x,g=p.y,y=d.outerWidth(),v=d.outerHeight();return{w:y,h:v,x1:m-y/2,y1:g-v/2}},"getBBForSimpleShape");r.drawing.addAtlasCollection("node",{texRows:t.webglTexRowsNodes}),r.drawing.addAtlasCollection("label",{texRows:t.webglTexRows}),r.drawing.addTextureAtlasRenderType("node-body",{collection:"node",getKey:e.getStyleKey,getBoundingBox:e.getElementBox,drawElement:e.drawElement}),r.drawing.addSimpleShapeRenderType("node-body",{getBoundingBox:u,isSimple:sqe,shapeProps:{shape:"shape",color:"background-color",opacity:"background-opacity",radius:"corner-radius",border:!0}}),r.drawing.addSimpleShapeRenderType("node-overlay",{getBoundingBox:u,isVisible:s("overlay"),shapeProps:{shape:"overlay-shape",color:"overlay-color",opacity:"overlay-opacity",padding:"overlay-padding",radius:"overlay-corner-radius"}}),r.drawing.addSimpleShapeRenderType("node-underlay",{getBoundingBox:u,isVisible:s("underlay"),shapeProps:{shape:"underlay-shape",color:"underlay-color",opacity:"underlay-opacity",padding:"underlay-padding",radius:"underlay-corner-radius"}}),r.drawing.addTextureAtlasRenderType("label",{collection:"label",getTexPickingMode:l,getKey:zM(e.getLabelKey,null),getBoundingBox:GM(e.getLabelBox,null),drawClipped:!0,drawElement:e.drawLabel,getRotation:i(null),getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:a("label")}),r.drawing.addTextureAtlasRenderType("edge-source-label",{collection:"label",getTexPickingMode:l,getKey:zM(e.getSourceLabelKey,"source"),getBoundingBox:GM(e.getSourceLabelBox,"source"),drawClipped:!0,drawElement:e.drawSourceLabel,getRotation:i("source"),getRotationPoint:e.getSourceLabelRotationPoint,getRotationOffset:e.getSourceLabelRotationOffset,isVisible:a("source-label")}),r.drawing.addTextureAtlasRenderType("edge-target-label",{collection:"label",getTexPickingMode:l,getKey:zM(e.getTargetLabelKey,"target"),getBoundingBox:GM(e.getTargetLabelBox,"target"),drawClipped:!0,drawElement:e.drawTargetLabel,getRotation:i("target"),getRotationPoint:e.getTargetLabelRotationPoint,getRotationOffset:e.getTargetLabelRotationOffset,isVisible:a("target-label")});var h=xx(function(){console.log("garbage collect flag set"),r.data.gc=!0},1e4);r.onUpdateEleCalcs(function(f,d){var p=!1;d&&d.length>0&&(p|=r.drawing.invalidate(d)),p&&h()}),Aqe(r)};o(Cqe,"getBGColor");o(zhe,"getLabelLines");zM=o(function(e,r){return function(n){var i=e(n),a=zhe(n,r);return a.length>1?a.map(function(s,l){return"".concat(i,"_").concat(l)}):i}},"getStyleKeysForLabel"),GM=o(function(e,r){return function(n,i){var a=e(n);if(typeof i=="string"){var s=i.indexOf("_");if(s>0){var l=Number(i.substring(s+1)),u=zhe(n,r),h=a.h/u.length,f=h*l,d=a.y1+f;return{x1:a.x1,w:a.w,y1:d,h,yOffset:f}}}return a}},"getBoundingBoxForLabel");o(Aqe,"overrideCanvasRendererFunctions");o(_qe,"clearWebgl");o(Dqe,"clearCanvas");o(Lqe,"createPanZoomMatrix");o(Ghe,"setContextTransform");o(Rqe,"drawSelectionRectangle");o(Nqe,"drawAxes");o(Mqe,"drawAtlases");o(Iqe,"getPickingIndexes");o(Oqe,"findNearestElementsWebgl");o(VM,"drawEle");o(Vhe,"renderWebgl");Rf={};Rf.drawPolygonPath=function(t,e,r,n,i,a){var s=n/2,l=i/2;t.beginPath&&t.beginPath(),t.moveTo(e+s*a[0],r+l*a[1]);for(var u=1;u0&&s>0){m.clearRect(0,0,a,s),m.globalCompositeOperation="source-over";var g=this.getCachedZSortedEles();if(t.full)m.translate(-n.x1*h,-n.y1*h),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(n.x1*h,n.y1*h);else{var y=e.pan(),v={x:y.x*h,y:y.y*h};h*=e.zoom(),m.translate(v.x,v.y),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(-v.x,-v.y)}t.bg&&(m.globalCompositeOperation="destination-over",m.fillStyle=t.bg,m.rect(0,0,a,s),m.fill())}return p};o(Pqe,"b64ToBlob");o(aue,"b64UriToB64");o(Hhe,"output");Sx.png=function(t){return Hhe(t,this.bufferCanvasImage(t),"image/png")};Sx.jpg=function(t){return Hhe(t,this.bufferCanvasImage(t),"image/jpeg")};qhe={};qhe.nodeShapeImpl=function(t,e,r,n,i,a,s,l){switch(t){case"ellipse":return this.drawEllipsePath(e,r,n,i,a);case"polygon":return this.drawPolygonPath(e,r,n,i,a,s);case"round-polygon":return this.drawRoundPolygonPath(e,r,n,i,a,s,l);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(e,r,n,i,a,l);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(e,r,n,i,a,s,l);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(e,r,n,i,a,l);case"barrel":return this.drawBarrelPath(e,r,n,i,a)}};Bqe=Whe,Cr=Whe.prototype;Cr.CANVAS_LAYERS=3;Cr.SELECT_BOX=0;Cr.DRAG=1;Cr.NODE=2;Cr.WEBGL=3;Cr.CANVAS_TYPES=["2d","2d","2d","webgl2"];Cr.BUFFER_COUNT=3;Cr.TEXTURE_BUFFER=0;Cr.MOTIONBLUR_BUFFER_NODE=1;Cr.MOTIONBLUR_BUFFER_DRAG=2;o(Whe,"CanvasRenderer");Cr.redrawHint=function(t,e){var r=this;switch(t){case"eles":r.data.canvasNeedsRedraw[Cr.NODE]=e;break;case"drag":r.data.canvasNeedsRedraw[Cr.DRAG]=e;break;case"select":r.data.canvasNeedsRedraw[Cr.SELECT_BOX]=e;break;case"gc":r.data.gc=!0;break}};Fqe=typeof Path2D<"u";Cr.path2dEnabled=function(t){if(t===void 0)return this.pathsEnabled;this.pathsEnabled=!!t};Cr.usePaths=function(){return Fqe&&this.pathsEnabled};Cr.setImgSmoothing=function(t,e){t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled=e:(t.webkitImageSmoothingEnabled=e,t.mozImageSmoothingEnabled=e,t.msImageSmoothingEnabled=e)};Cr.getImgSmoothing=function(t){return t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled:t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled};Cr.makeOffscreenCanvas=function(t,e){var r;if((typeof OffscreenCanvas>"u"?"undefined":$i(OffscreenCanvas))!=="undefined")r=new OffscreenCanvas(t,e);else{var n=this.cy.window(),i=n.document;r=i.createElement("canvas"),r.width=t,r.height=e}return r};[Ihe,Fc,Hu,NI,Cp,Lf,us,$he,Rf,Sx,qhe].forEach(function(t){ir(Cr,t)});$qe=[{name:"null",impl:bhe},{name:"base",impl:Lhe},{name:"canvas",impl:Bqe}],zqe=[{type:"layout",extensions:hHe},{type:"renderer",extensions:$qe}],Yhe={},Xhe={};o(jhe,"setExtension");o(Khe,"getExtension");o(Gqe,"setModule");o(Vqe,"getModule");lI=o(function(){if(arguments.length===2)return Khe.apply(null,arguments);if(arguments.length===3)return jhe.apply(null,arguments);if(arguments.length===4)return Vqe.apply(null,arguments);if(arguments.length===5)return Gqe.apply(null,arguments);Kn("Invalid extension access syntax")},"extension");fx.prototype.extension=lI;zqe.forEach(function(t){t.extensions.forEach(function(e){jhe(t.type,e.name,e.impl)})});oE=o(function(){if(!(this instanceof oE))return new oE;this.length=0},"Stylesheet"),Ep=oE.prototype;Ep.instanceString=function(){return"stylesheet"};Ep.selector=function(t){var e=this.length++;return this[e]={selector:t,properties:[]},this};Ep.css=function(t,e){var r=this.length-1;if(Jt(t))this[r].properties.push({name:t,value:e});else if(Yr(t))for(var n=t,i=Object.keys(n),a=0;a{"use strict";o((function(e,r){typeof Cx=="object"&&typeof OI=="object"?OI.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Cx=="object"?Cx.layoutBase=r():e.layoutBase=r()}),"webpackUniversalModuleDefinition")(Cx,function(){return(function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=26)})([(function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s}),(function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(4);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp&&(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)),this.labelHeight>m&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-m)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-m),this.setHeight(this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h}),(function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(6),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,T=0;T-1&&k>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(w,1),x.target!=x.source&&x.target.edges.splice(k,1);var S=x.source.owner.getEdges().indexOf(x);if(S==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(S,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,T=this.getNodes(),S=T.length,w=0;wv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?b=T[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,T,S,w,k,A,C=this.nodes,R=C.length,I=0;IT&&(y=T),vw&&(x=w),bT&&(y=T),vw&&(x=w),b=this.nodes.length){var R=0;v.forEach(function(I){I.owner==g&&R++}),R==this.nodes.length&&(this.isConnected=!0)}},t.exports=p}),(function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(5),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=C,!1;if(hf)return l[0]=p,l[1]=h,l[2]=k,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,E=!0):(l[0]=g,l[1]=m,E=!0):_===M&&(u>f?(l[0]=p,l[1]=m,E=!0):(l[0]=x,l[1]=v,E=!0)),-O===M?f>u?(l[2]=A,l[3]=C,D=!0):(l[2]=k,l[3]=w,D=!0):O===M&&(f>u?(l[2]=S,l[3]=w,D=!0):(l[2]=R,l[3]=C,D=!0)),E&&D)return!1;if(u>f?h>d?(P=this.getCardinalDirection(_,M,4),B=this.getCardinalDirection(O,M,2)):(P=this.getCardinalDirection(-_,M,3),B=this.getCardinalDirection(-O,M,1)):h>d?(P=this.getCardinalDirection(-_,M,1),B=this.getCardinalDirection(-O,M,3)):(P=this.getCardinalDirection(_,M,2),B=this.getCardinalDirection(O,M,4)),!E)switch(P){case 1:G=m,F=u+-T/M,l[0]=F,l[1]=G;break;case 2:F=x,G=h+b*M,l[0]=F,l[1]=G;break;case 3:G=v,F=u+T/M,l[0]=F,l[1]=G;break;case 4:F=y,G=h+-b*M,l[0]=F,l[1]=G;break}if(!D)switch(B){case 1:U=w,$=f+-L/M,l[2]=$,l[3]=U;break;case 2:$=R,U=d+I*M,l[2]=$,l[3]=U;break;case 3:U=C,$=f+L/M,l[2]=$,l[3]=U;break;case 4:$=A,U=d+-I*M,l[2]=$,l[3]=U;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,T=void 0,S=void 0,w=void 0,k=void 0,A=void 0,C=void 0,R=void 0;return T=p-f,w=h-d,A=d*f-h*p,S=v-g,k=m-y,C=y*g-m*v,R=T*k-S*w,R===0?null:(x=(w*C-k*A)/R,b=(S*A-T*C)/R,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n}),(function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n}),(function(t,e,r){"use strict";var n=(function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i}),(function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(T.push(w[0]);T.length>0&&g;){var k=T[0];T.splice(0,1),b.add(k);for(var A=k.getEdges(),x=0;x-1&&w.splice(L,1)}b=new Set,S=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(C,1);var R=S.getNeighborsList();R.forEach(function(E){if(y.indexOf(E)<0){var D=v.get(E),_=D-1;_==1&&k.push(E),v.set(E,_)}})}y=y.concat(k),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p}),(function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n}),(function(t,e,r){"use strict";var n=r(4);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i}),(function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mT||b>T)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(T=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>T||b>T)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||T>=x[0].length)){for(var S=0;Sh},"_defaultCompareFunction")}]),l})();t.exports=s}),(function(t,e,r){"use strict";var n=(function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o((function(e,r){typeof Ax=="object"&&typeof BI=="object"?BI.exports=r(PI()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof Ax=="object"?Ax.coseBase=r(PI()):e.coseBase=r(e.layoutBase)}),"webpackUniversalModuleDefinition")(Ax,function(t){return(function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=7)})([(function(e,r){e.exports=t}),(function(e,r,n){"use strict";var i=n(0).FDLayoutConstants;function a(){}o(a,"CoSEConstants");for(var s in i)a[s]=i[s];a.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,a.DEFAULT_RADIAL_SEPARATION=i.DEFAULT_EDGE_LENGTH,a.DEFAULT_COMPONENT_SEPERATION=60,a.TILE=!0,a.TILING_PADDING_VERTICAL=10,a.TILING_PADDING_HORIZONTAL=10,a.TREE_REDUCTION_ON_INCREMENTAL=!1,e.exports=a}),(function(e,r,n){"use strict";var i=n(0).FDLayoutEdge;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEEdge"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a}),(function(e,r,n){"use strict";var i=n(0).LGraph;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEGraph"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a}),(function(e,r,n){"use strict";var i=n(0).LGraphManager;function a(l){i.call(this,l)}o(a,"CoSEGraphManager"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a}),(function(e,r,n){"use strict";var i=n(0).FDLayoutNode,a=n(0).IMath;function s(u,h,f,d){i.call(this,u,h,f,d)}o(s,"CoSENode"),s.prototype=Object.create(i.prototype);for(var l in i)s[l]=i[l];s.prototype.move=function(){var u=this.graphManager.getLayout();this.displacementX=u.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=u.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementX=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementX)),Math.abs(this.displacementY)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementY=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),u.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},s.prototype.propogateDisplacementToChildren=function(u,h){for(var f=this.getChild().getNodes(),d,p=0;p0)this.positionNodesRadially(w);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var k=new Set(this.getAllNodes()),A=this.nodesWithGravity.filter(function(C){return k.has(C)});this.graphManager.setAllNodesToApplyGravitation(A),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},T.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%f.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var w=new Set(this.getAllNodes()),k=this.nodesWithGravity.filter(function(R){return w.has(R)});this.graphManager.setAllNodesToApplyGravitation(k),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var A=!this.isTreeGrowing&&!this.isGrowthFinished,C=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(A,C),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},T.prototype.getPositionsData=function(){for(var w=this.graphManager.getAllNodes(),k={},A=0;A1){var E;for(E=0;EC&&(C=Math.floor(L.y)),I=Math.floor(L.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new m(d.WORLD_CENTER_X-L.x/2,d.WORLD_CENTER_Y-L.y/2))},T.radialLayout=function(w,k,A){var C=Math.max(this.maxDiagonalInTree(w),h.DEFAULT_RADIAL_SEPARATION);T.branchRadialLayout(k,null,0,359,0,C);var R=x.calculateBounds(w),I=new b;I.setDeviceOrgX(R.getMinX()),I.setDeviceOrgY(R.getMinY()),I.setWorldOrgX(A.x),I.setWorldOrgY(A.y);for(var L=0;L1;){var j=U[0];U.splice(0,1);var te=P.indexOf(j);te>=0&&P.splice(te,1),G--,B--}k!=null?$=(P.indexOf(U[0])+1)%G:$=0;for(var Y=Math.abs(C-A)/B,oe=$;F!=B;oe=++oe%G){var J=P[oe].getOtherEnd(w);if(J!=k){var ue=(A+F*Y)%360,re=(ue+Y)%360;T.branchRadialLayout(J,w,ue,re,R+I,I),F++}}},T.maxDiagonalInTree=function(w){for(var k=y.MIN_VALUE,A=0;Ak&&(k=R)}return k},T.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},T.prototype.groupZeroDegreeMembers=function(){var w=this,k={};this.memberGroups={},this.idToDummyNode={};for(var A=[],C=this.graphManager.getAllNodes(),R=0;R"u"&&(k[E]=[]),k[E]=k[E].concat(I)}Object.keys(k).forEach(function(D){if(k[D].length>1){var _="DummyCompound_"+D;w.memberGroups[_]=k[D];var O=k[D][0].getParent(),M=new l(w.graphManager);M.id=_,M.paddingLeft=O.paddingLeft||0,M.paddingRight=O.paddingRight||0,M.paddingBottom=O.paddingBottom||0,M.paddingTop=O.paddingTop||0,w.idToDummyNode[_]=M;var P=w.getGraphManager().add(w.newGraph(),M),B=O.getChild();B.add(M);for(var F=0;F=0;w--){var k=this.compoundOrder[w],A=k.id,C=k.paddingLeft,R=k.paddingTop;this.adjustLocations(this.tiledMemberPack[A],k.rect.x,k.rect.y,C,R)}},T.prototype.repopulateZeroDegreeMembers=function(){var w=this,k=this.tiledZeroDegreePack;Object.keys(k).forEach(function(A){var C=w.idToDummyNode[A],R=C.paddingLeft,I=C.paddingTop;w.adjustLocations(k[A],C.rect.x,C.rect.y,R,I)})},T.prototype.getToBeTiled=function(w){var k=w.id;if(this.toBeTiled[k]!=null)return this.toBeTiled[k];var A=w.getChild();if(A==null)return this.toBeTiled[k]=!1,!1;for(var C=A.getNodes(),R=0;R0)return this.toBeTiled[k]=!1,!1;if(I.getChild()==null){this.toBeTiled[I.id]=!1;continue}if(!this.getToBeTiled(I))return this.toBeTiled[k]=!1,!1}return this.toBeTiled[k]=!0,!0},T.prototype.getNodeDegree=function(w){for(var k=w.id,A=w.getEdges(),C=0,R=0;RD&&(D=O.rect.height)}A+=D+w.verticalPadding}},T.prototype.tileCompoundMembers=function(w,k){var A=this;this.tiledMemberPack=[],Object.keys(w).forEach(function(C){var R=k[C];A.tiledMemberPack[C]=A.tileNodes(w[C],R.paddingLeft+R.paddingRight),R.rect.width=A.tiledMemberPack[C].width,R.rect.height=A.tiledMemberPack[C].height})},T.prototype.tileNodes=function(w,k){var A=h.TILING_PADDING_VERTICAL,C=h.TILING_PADDING_HORIZONTAL,R={rows:[],rowWidth:[],rowHeight:[],width:0,height:k,verticalPadding:A,horizontalPadding:C};w.sort(function(E,D){return E.rect.width*E.rect.height>D.rect.width*D.rect.height?-1:E.rect.width*E.rect.height0&&(L+=w.horizontalPadding),w.rowWidth[A]=L,w.width0&&(E+=w.verticalPadding);var D=0;E>w.rowHeight[A]&&(D=w.rowHeight[A],w.rowHeight[A]=E,D=w.rowHeight[A]-D),w.height+=D,w.rows[A].push(k)},T.prototype.getShortestRowIndex=function(w){for(var k=-1,A=Number.MAX_VALUE,C=0;CA&&(k=C,A=w.rowWidth[C]);return k},T.prototype.canAddHorizontal=function(w,k,A){var C=this.getShortestRowIndex(w);if(C<0)return!0;var R=w.rowWidth[C];if(R+w.horizontalPadding+k<=w.width)return!0;var I=0;w.rowHeight[C]0&&(I=A+w.verticalPadding-w.rowHeight[C]);var L;w.width-R>=k+w.horizontalPadding?L=(w.height+I)/(R+k+w.horizontalPadding):L=(w.height+I)/w.width,I=A+w.verticalPadding;var E;return w.widthI&&k!=A){C.splice(-1,1),w.rows[A].push(R),w.rowWidth[k]=w.rowWidth[k]-I,w.rowWidth[A]=w.rowWidth[A]+I,w.width=w.rowWidth[instance.getLongestRowIndex(w)];for(var L=Number.MIN_VALUE,E=0;EL&&(L=C[E].height);k>0&&(L+=w.verticalPadding);var D=w.rowHeight[k]+w.rowHeight[A];w.rowHeight[k]=L,w.rowHeight[A]0)for(var B=R;B<=I;B++)P[0]+=this.grid[B][L-1].length+this.grid[B][L].length-1;if(I0)for(var B=L;B<=E;B++)P[3]+=this.grid[R-1][B].length+this.grid[R][B].length-1;for(var F=y.MAX_VALUE,G,$,U=0;U{"use strict";o((function(e,r){typeof _x=="object"&&typeof $I=="object"?$I.exports=r(FI()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof _x=="object"?_x.cytoscapeCoseBilkent=r(FI()):e.cytoscapeCoseBilkent=r(e.coseBase)}),"webpackUniversalModuleDefinition")(_x,function(t){return(function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=1)})([(function(e,r){e.exports=t}),(function(e,r,n){"use strict";var i=n(0).layoutBase.LayoutConstants,a=n(0).layoutBase.FDLayoutConstants,s=n(0).CoSEConstants,l=n(0).CoSELayout,u=n(0).CoSENode,h=n(0).layoutBase.PointD,f=n(0).layoutBase.DimensionD,d={ready:o(function(){},"ready"),stop:o(function(){},"stop"),quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function p(v,x){var b={};for(var T in v)b[T]=v[T];for(var T in x)b[T]=x[T];return b}o(p,"extend");function m(v){this.options=p(d,v),g(this.options)}o(m,"_CoSELayout");var g=o(function(x){x.nodeRepulsion!=null&&(s.DEFAULT_REPULSION_STRENGTH=a.DEFAULT_REPULSION_STRENGTH=x.nodeRepulsion),x.idealEdgeLength!=null&&(s.DEFAULT_EDGE_LENGTH=a.DEFAULT_EDGE_LENGTH=x.idealEdgeLength),x.edgeElasticity!=null&&(s.DEFAULT_SPRING_STRENGTH=a.DEFAULT_SPRING_STRENGTH=x.edgeElasticity),x.nestingFactor!=null&&(s.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=a.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=x.nestingFactor),x.gravity!=null&&(s.DEFAULT_GRAVITY_STRENGTH=a.DEFAULT_GRAVITY_STRENGTH=x.gravity),x.numIter!=null&&(s.MAX_ITERATIONS=a.MAX_ITERATIONS=x.numIter),x.gravityRange!=null&&(s.DEFAULT_GRAVITY_RANGE_FACTOR=a.DEFAULT_GRAVITY_RANGE_FACTOR=x.gravityRange),x.gravityCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_STRENGTH=a.DEFAULT_COMPOUND_GRAVITY_STRENGTH=x.gravityCompound),x.gravityRangeCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=a.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=x.gravityRangeCompound),x.initialEnergyOnIncremental!=null&&(s.DEFAULT_COOLING_FACTOR_INCREMENTAL=a.DEFAULT_COOLING_FACTOR_INCREMENTAL=x.initialEnergyOnIncremental),x.quality=="draft"?i.QUALITY=0:x.quality=="proof"?i.QUALITY=2:i.QUALITY=1,s.NODE_DIMENSIONS_INCLUDE_LABELS=a.NODE_DIMENSIONS_INCLUDE_LABELS=i.NODE_DIMENSIONS_INCLUDE_LABELS=x.nodeDimensionsIncludeLabels,s.DEFAULT_INCREMENTAL=a.DEFAULT_INCREMENTAL=i.DEFAULT_INCREMENTAL=!x.randomize,s.ANIMATE=a.ANIMATE=i.ANIMATE=x.animate,s.TILE=x.tile,s.TILING_PADDING_VERTICAL=typeof x.tilingPaddingVertical=="function"?x.tilingPaddingVertical.call():x.tilingPaddingVertical,s.TILING_PADDING_HORIZONTAL=typeof x.tilingPaddingHorizontal=="function"?x.tilingPaddingHorizontal.call():x.tilingPaddingHorizontal},"getUserOptions");m.prototype.run=function(){var v,x,b=this.options,T=this.idToLNode={},S=this.layout=new l,w=this;w.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var k=S.newGraphManager();this.gm=k;var A=this.options.eles.nodes(),C=this.options.eles.edges();this.root=k.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(A),S);for(var R=0;R0){var E;E=b.getGraphManager().add(b.newGraph(),A),this.processChildrenList(E,k,b)}}},m.prototype.stop=function(){return this.stopped=!0,this};var y=o(function(x){x("layout","cose-bilkent",m)},"register");typeof cytoscape<"u"&&y(cytoscape),e.exports=y})])})});function Hqe(t,e){t.forEach(r=>{let n={id:r.id,labelText:r.label,height:r.height,width:r.width,padding:r.padding??0};Object.keys(r).forEach(i=>{["id","label","height","width","padding","x","y"].includes(i)||(n[i]=r[i])}),e.add({group:"nodes",data:n,position:{x:r.x??0,y:r.y??0}})})}function qqe(t,e){t.forEach(r=>{let n={id:r.id,source:r.start,target:r.end};Object.keys(r).forEach(i=>{["id","start","end"].includes(i)||(n[i]=r[i])}),e.add({group:"edges",data:n})})}function Jhe(t){return new Promise(e=>{let r=qe("body").append("div").attr("id","cy").attr("style","display:none"),n=Ko({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});r.remove(),Hqe(t.nodes,n),qqe(t.edges,n),n.nodes().forEach(function(a){a.layoutDimensions=()=>{let s=a.data();return{w:s.width,h:s.height}}});let i={name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1};n.layout(i).run(),n.ready(a=>{X.info("Cytoscape ready",a),e(n)})})}function efe(t){return t.nodes().map(e=>{let r=e.data(),n=e.position(),i={id:r.id,x:n.x,y:n.y};return Object.keys(r).forEach(a=>{a!=="id"&&(i[a]=r[a])}),i})}function tfe(t){return t.edges().map(e=>{let r=e.data(),n=e._private.rscratch,i={id:r.id,source:r.source,target:r.target,startX:n.startX,startY:n.startY,midX:n.midX,midY:n.midY,endX:n.endX,endY:n.endY};return Object.keys(r).forEach(a=>{["id","source","target"].includes(a)||(i[a]=r[a])}),i})}var Zhe,rfe=N(()=>{"use strict";II();Zhe=ja(Qhe(),1);yr();pt();Ko.use(Zhe.default);o(Hqe,"addNodes");o(qqe,"addEdges");o(Jhe,"createCytoscapeInstance");o(efe,"extractPositionedNodes");o(tfe,"extractPositionedEdges")});async function nfe(t,e){X.debug("Starting cose-bilkent layout algorithm");try{Wqe(t);let r=await Jhe(t),n=efe(r),i=tfe(r);return X.debug(`Layout completed: ${n.length} nodes, ${i.length} edges`),{nodes:n,edges:i}}catch(r){throw X.error("Error in cose-bilkent layout algorithm:",r),r}}function Wqe(t){if(!t)throw new Error("Layout data is required");if(!t.config)throw new Error("Configuration is required in layout data");if(!t.rootNode)throw new Error("Root node is required");if(!t.nodes||!Array.isArray(t.nodes))throw new Error("No nodes found in layout data");if(!Array.isArray(t.edges))throw new Error("Edges array is required in layout data");return!0}var ife=N(()=>{"use strict";pt();rfe();o(nfe,"executeCoseBilkentLayout");o(Wqe,"validateLayoutData")});var afe,sfe=N(()=>{"use strict";ife();afe=o(async(t,e,{insertCluster:r,insertEdge:n,insertEdgeLabel:i,insertMarkers:a,insertNode:s,log:l,positionEdgeLabel:u},{algorithm:h})=>{let f={},d={},p=e.select("g");a(p,t.markers,t.type,t.diagramId);let m=p.insert("g").attr("class","subgraphs"),g=p.insert("g").attr("class","edgePaths"),y=p.insert("g").attr("class","edgeLabels"),v=p.insert("g").attr("class","nodes");l.debug("Inserting nodes into DOM for dimension calculation"),await Promise.all(t.nodes.map(async T=>{if(T.isGroup){let S={...T};d[T.id]=S,f[T.id]=S,await r(m,T)}else{let S={...T};f[T.id]=S;let w=await s(v,T,{config:t.config,dir:t.direction||"TB"}),k=w.node().getBBox();S.width=k.width,S.height=k.height,S.domId=w,l.debug(`Node ${T.id} dimensions: ${k.width}x${k.height}`)}})),l.debug("Running cose-bilkent layout algorithm");let x={...t,nodes:t.nodes.map(T=>{let S=f[T.id];return{...T,width:S.width,height:S.height}})},b=await nfe(x,t.config);l.debug("Positioning nodes based on layout results"),b.nodes.forEach(T=>{let S=f[T.id];S?.domId&&(S.domId.attr("transform",`translate(${T.x}, ${T.y})`),S.x=T.x,S.y=T.y,l.debug(`Positioned node ${S.id} at center (${T.x}, ${T.y})`))}),b.edges.forEach(T=>{let S=t.edges.find(w=>w.id===T.id);S&&(S.points=[{x:T.startX,y:T.startY},{x:T.midX,y:T.midY},{x:T.endX,y:T.endY}])}),l.debug("Inserting and positioning edges"),await Promise.all(t.edges.map(async T=>{let S=await i(y,T),w=f[T.start??""],k=f[T.end??""];if(w&&k){let A=b.edges.find(C=>C.id===T.id);if(A){l.debug("APA01 positionedEdge",A);let C={...T},R=n(g,C,d,t.type,w,k,t.diagramId);u(C,R)}else{let C={...T,points:[{x:w.x||0,y:w.y||0},{x:k.x||0,y:k.y||0}]},R=n(g,C,d,t.type,w,k,t.diagramId);u(C,R)}}})),l.debug("Cose-bilkent rendering completed")},"render")});var ofe={};dr(ofe,{render:()=>Yqe});var Yqe,lfe=N(()=>{"use strict";sfe();Yqe=afe});var Dx,zI,Xqe,Qo,$c,Nf=N(()=>{"use strict";Qte();pt();Dx={},zI=o(t=>{for(let e of t)Dx[e.name]=e},"registerLayoutLoaders"),Xqe=o(()=>{zI([{name:"dagre",loader:o(async()=>await Promise.resolve().then(()=>(Roe(),Loe)),"loader")},{name:"cose-bilkent",loader:o(async()=>await Promise.resolve().then(()=>(lfe(),ofe)),"loader")}])},"registerDefaultLayoutLoaders");Xqe();Qo=o(async(t,e)=>{if(!(t.layoutAlgorithm in Dx))throw new Error(`Unknown layout algorithm: ${t.layoutAlgorithm}`);let r=Dx[t.layoutAlgorithm];return(await r.loader()).render(t,e,Kte,{algorithm:r.algorithm})},"render"),$c=o((t="",{fallback:e="dagre"}={})=>{if(t in Dx)return t;if(e in Dx)return X.warn(`Layout algorithm ${t} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${t} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm")});var Ws,jqe,Kqe,Mf=N(()=>{"use strict";Ei();pt();Ws=o((t,e,r,n)=>{t.attr("class",r);let{width:i,height:a,x:s,y:l}=jqe(t,e);mn(t,a,i,n);let u=Kqe(s,l,i,a,e);t.attr("viewBox",u),X.debug(`viewBox configured: ${u} with padding: ${e}`)},"setupViewPortForSVG"),jqe=o((t,e)=>{let r=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:r.width+e*2,height:r.height+e*2,x:r.x,y:r.y}},"calculateDimensionsWithPadding"),Kqe=o((t,e,r,n,i)=>`${t-i} ${e-i} ${r} ${n}`,"createViewBox")});var Qqe,Zqe,cfe,ufe=N(()=>{"use strict";yr();Xt();pt();ep();Nf();Mf();tr();Qqe=o(function(t,e){return e.db.getClasses()},"getClasses"),Zqe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing state diagram (v2)",e);let{securityLevel:i,flowchart:a,layout:s}=ge(),l;i==="sandbox"&&(l=qe("#i"+e));let u=i==="sandbox"?l.nodes()[0].contentDocument:document;X.debug("Before getData: ");let h=n.db.getData();X.debug("Data: ",h);let f=Vo(e,i),d=n.db.getDirection();h.type=n.type,h.layoutAlgorithm=$c(s),h.layoutAlgorithm==="dagre"&&s==="elk"&&X.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),h.direction=d,h.nodeSpacing=a?.nodeSpacing||50,h.rankSpacing=a?.rankSpacing||50,h.markers=["point","circle","cross"],h.diagramId=e,X.debug("REF1:",h),await Qo(h,f);let p=h.config.flowchart?.diagramPadding??8;qt.insertTitle(f,"flowchartTitleText",a?.titleTopMargin||0,n.db.getDiagramTitle()),Ws(f,p,"flowchart",a?.useMaxWidth||!1);for(let m of h.nodes){let g=qe(`#${e} [id="${m.id}"]`);if(!g||!m.link)continue;let y=u.createElementNS("http://www.w3.org/2000/svg","a");y.setAttributeNS("http://www.w3.org/2000/svg","class",m.cssClasses),y.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),i==="sandbox"?y.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):m.linkTarget&&y.setAttributeNS("http://www.w3.org/2000/svg","target",m.linkTarget);let v=g.insert(function(){return y},":first-child"),x=g.select(".label-container");x&&v.append(function(){return x.node()});let b=g.select(".label");b&&v.append(function(){return b.node()})}},"draw"),cfe={getClasses:Qqe,draw:Zqe}});var GI,VI,hfe=N(()=>{"use strict";GI=(function(){var t=o(function(fr,it,kt,jt){for(kt=kt||{},jt=fr.length;jt--;kt[fr[jt]]=it);return kt},"o"),e=[1,4],r=[1,3],n=[1,5],i=[1,8,9,10,11,27,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],a=[2,2],s=[1,13],l=[1,14],u=[1,15],h=[1,16],f=[1,23],d=[1,25],p=[1,26],m=[1,27],g=[1,49],y=[1,48],v=[1,29],x=[1,30],b=[1,31],T=[1,32],S=[1,33],w=[1,44],k=[1,46],A=[1,42],C=[1,47],R=[1,43],I=[1,50],L=[1,45],E=[1,51],D=[1,52],_=[1,34],O=[1,35],M=[1,36],P=[1,37],B=[1,57],F=[1,8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],G=[1,61],$=[1,60],U=[1,62],j=[8,9,11,75,77,78],te=[1,78],Y=[1,91],oe=[1,96],J=[1,95],ue=[1,92],re=[1,88],ee=[1,94],Z=[1,90],K=[1,97],ae=[1,93],Q=[1,98],de=[1,89],ne=[8,9,10,11,40,75,77,78],Te=[8,9,10,11,40,46,75,77,78],q=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,78,89,102,105,106,109,111,114,115,116],Ve=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],pe=[44,60,89,102,105,106,109,111,114,115,116],Be=[1,121],Ye=[1,122],He=[1,124],Le=[1,123],Ie=[44,60,62,74,89,102,105,106,109,111,114,115,116],Ne=[1,133],Ce=[1,147],Fe=[1,148],fe=[1,149],xe=[1,150],W=[1,135],he=[1,137],z=[1,141],se=[1,142],le=[1,143],ke=[1,144],ve=[1,145],ye=[1,146],Re=[1,151],_e=[1,152],ze=[1,131],Ke=[1,132],xt=[1,139],We=[1,134],Oe=[1,138],et=[1,136],Ue=[8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],lt=[1,154],Gt=[1,156],vt=[8,9,11],Lt=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],dt=[1,176],nt=[1,172],bt=[1,173],wt=[1,177],yt=[1,174],ft=[1,175],Ur=[77,116,119],_t=[8,9,10,11,12,14,27,29,32,44,60,75,84,85,86,87,88,89,90,105,109,111,114,115,116],bn=[10,106],Br=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],cr=[1,247],ar=[1,245],_r=[1,249],Ct=[1,243],Se=[1,244],at=[1,246],Nt=[1,248],wr=[1,250],Tn=[1,268],yn=[8,9,11,106],sn=[8,9,10,11,60,84,105,106,109,110,111,112],Hi={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,LINK_ID:78,edgeTextToken:79,STR:80,MD_STR:81,textToken:82,keywords:83,STYLE:84,LINKSTYLE:85,CLASSDEF:86,CLASS:87,CLICK:88,DOWN:89,UP:90,textNoTagsToken:91,stylesOpt:92,"idString[vertex]":93,"idString[class]":94,CALLBACKNAME:95,CALLBACKARGS:96,HREF:97,LINK_TARGET:98,"STR[link]":99,"STR[tooltip]":100,alphaNum:101,DEFAULT:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,NODE_STRING:109,UNIT:110,BRKT:111,PCT:112,idStringToken:113,MINUS:114,MULT:115,UNICODE_TEXT:116,TEXT:117,TAGSTART:118,EDGE_TEXT:119,alphaNumToken:120,direction_tb:121,direction_bt:122,direction_rl:123,direction_lr:124,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",78:"LINK_ID",80:"STR",81:"MD_STR",84:"STYLE",85:"LINKSTYLE",86:"CLASSDEF",87:"CLASS",88:"CLICK",89:"DOWN",90:"UP",93:"idString[vertex]",94:"idString[class]",95:"CALLBACKNAME",96:"CALLBACKARGS",97:"HREF",98:"LINK_TARGET",99:"STR[link]",100:"STR[tooltip]",102:"DEFAULT",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"NODE_STRING",110:"UNIT",111:"BRKT",112:"PCT",114:"MINUS",115:"MULT",116:"UNICODE_TEXT",117:"TEXT",118:"TAGSTART",119:"EDGE_TEXT",121:"direction_tb",122:"direction_bt",123:"direction_rl",124:"direction_lr"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[41,4],[76,1],[76,2],[76,1],[76,1],[72,1],[72,2],[73,3],[30,1],[30,2],[30,1],[30,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[103,1],[103,3],[92,1],[92,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[82,1],[82,1],[82,1],[82,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[79,1],[79,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[47,1],[47,2],[101,1],[101,2],[33,1],[33,1],[33,1],[33,1]],performAction:o(function(it,kt,jt,ht,Dr,me,Yl){var be=me.length-1;switch(Dr){case 2:this.$=[];break;case 3:(!Array.isArray(me[be])||me[be].length>0)&&me[be-1].push(me[be]),this.$=me[be-1];break;case 4:case 183:this.$=me[be];break;case 11:ht.setDirection("TB"),this.$="TB";break;case 12:ht.setDirection(me[be-1]),this.$=me[be-1];break;case 27:this.$=me[be-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=ht.addSubGraph(me[be-6],me[be-1],me[be-4]);break;case 34:this.$=ht.addSubGraph(me[be-3],me[be-1],me[be-3]);break;case 35:this.$=ht.addSubGraph(void 0,me[be-1],void 0);break;case 37:this.$=me[be].trim(),ht.setAccTitle(this.$);break;case 38:case 39:this.$=me[be].trim(),ht.setAccDescription(this.$);break;case 43:this.$=me[be-1]+me[be];break;case 44:this.$=me[be];break;case 45:ht.addVertex(me[be-1][me[be-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,me[be]),ht.addLink(me[be-3].stmt,me[be-1],me[be-2]),this.$={stmt:me[be-1],nodes:me[be-1].concat(me[be-3].nodes)};break;case 46:ht.addLink(me[be-2].stmt,me[be],me[be-1]),this.$={stmt:me[be],nodes:me[be].concat(me[be-2].nodes)};break;case 47:ht.addLink(me[be-3].stmt,me[be-1],me[be-2]),this.$={stmt:me[be-1],nodes:me[be-1].concat(me[be-3].nodes)};break;case 48:this.$={stmt:me[be-1],nodes:me[be-1]};break;case 49:ht.addVertex(me[be-1][me[be-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,me[be]),this.$={stmt:me[be-1],nodes:me[be-1],shapeData:me[be]};break;case 50:this.$={stmt:me[be],nodes:me[be]};break;case 51:this.$=[me[be]];break;case 52:ht.addVertex(me[be-5][me[be-5].length-1],void 0,void 0,void 0,void 0,void 0,void 0,me[be-4]),this.$=me[be-5].concat(me[be]);break;case 53:this.$=me[be-4].concat(me[be]);break;case 54:this.$=me[be];break;case 55:this.$=me[be-2],ht.setClass(me[be-2],me[be]);break;case 56:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"square");break;case 57:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"doublecircle");break;case 58:this.$=me[be-5],ht.addVertex(me[be-5],me[be-2],"circle");break;case 59:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"ellipse");break;case 60:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"stadium");break;case 61:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"subroutine");break;case 62:this.$=me[be-7],ht.addVertex(me[be-7],me[be-1],"rect",void 0,void 0,void 0,Object.fromEntries([[me[be-5],me[be-3]]]));break;case 63:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"cylinder");break;case 64:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"round");break;case 65:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"diamond");break;case 66:this.$=me[be-5],ht.addVertex(me[be-5],me[be-2],"hexagon");break;case 67:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"odd");break;case 68:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"trapezoid");break;case 69:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"inv_trapezoid");break;case 70:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"lean_right");break;case 71:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"lean_left");break;case 72:this.$=me[be],ht.addVertex(me[be]);break;case 73:me[be-1].text=me[be],this.$=me[be-1];break;case 74:case 75:me[be-2].text=me[be-1],this.$=me[be-2];break;case 76:this.$=me[be];break;case 77:var jr=ht.destructLink(me[be],me[be-2]);this.$={type:jr.type,stroke:jr.stroke,length:jr.length,text:me[be-1]};break;case 78:var jr=ht.destructLink(me[be],me[be-2]);this.$={type:jr.type,stroke:jr.stroke,length:jr.length,text:me[be-1],id:me[be-3]};break;case 79:this.$={text:me[be],type:"text"};break;case 80:this.$={text:me[be-1].text+""+me[be],type:me[be-1].type};break;case 81:this.$={text:me[be],type:"string"};break;case 82:this.$={text:me[be],type:"markdown"};break;case 83:var jr=ht.destructLink(me[be]);this.$={type:jr.type,stroke:jr.stroke,length:jr.length};break;case 84:var jr=ht.destructLink(me[be]);this.$={type:jr.type,stroke:jr.stroke,length:jr.length,id:me[be-1]};break;case 85:this.$=me[be-1];break;case 86:this.$={text:me[be],type:"text"};break;case 87:this.$={text:me[be-1].text+""+me[be],type:me[be-1].type};break;case 88:this.$={text:me[be],type:"string"};break;case 89:case 104:this.$={text:me[be],type:"markdown"};break;case 101:this.$={text:me[be],type:"text"};break;case 102:this.$={text:me[be-1].text+""+me[be],type:me[be-1].type};break;case 103:this.$={text:me[be],type:"text"};break;case 105:this.$=me[be-4],ht.addClass(me[be-2],me[be]);break;case 106:this.$=me[be-4],ht.setClass(me[be-2],me[be]);break;case 107:case 115:this.$=me[be-1],ht.setClickEvent(me[be-1],me[be]);break;case 108:case 116:this.$=me[be-3],ht.setClickEvent(me[be-3],me[be-2]),ht.setTooltip(me[be-3],me[be]);break;case 109:this.$=me[be-2],ht.setClickEvent(me[be-2],me[be-1],me[be]);break;case 110:this.$=me[be-4],ht.setClickEvent(me[be-4],me[be-3],me[be-2]),ht.setTooltip(me[be-4],me[be]);break;case 111:this.$=me[be-2],ht.setLink(me[be-2],me[be]);break;case 112:this.$=me[be-4],ht.setLink(me[be-4],me[be-2]),ht.setTooltip(me[be-4],me[be]);break;case 113:this.$=me[be-4],ht.setLink(me[be-4],me[be-2],me[be]);break;case 114:this.$=me[be-6],ht.setLink(me[be-6],me[be-4],me[be]),ht.setTooltip(me[be-6],me[be-2]);break;case 117:this.$=me[be-1],ht.setLink(me[be-1],me[be]);break;case 118:this.$=me[be-3],ht.setLink(me[be-3],me[be-2]),ht.setTooltip(me[be-3],me[be]);break;case 119:this.$=me[be-3],ht.setLink(me[be-3],me[be-2],me[be]);break;case 120:this.$=me[be-5],ht.setLink(me[be-5],me[be-4],me[be]),ht.setTooltip(me[be-5],me[be-2]);break;case 121:this.$=me[be-4],ht.addVertex(me[be-2],void 0,void 0,me[be]);break;case 122:this.$=me[be-4],ht.updateLink([me[be-2]],me[be]);break;case 123:this.$=me[be-4],ht.updateLink(me[be-2],me[be]);break;case 124:this.$=me[be-8],ht.updateLinkInterpolate([me[be-6]],me[be-2]),ht.updateLink([me[be-6]],me[be]);break;case 125:this.$=me[be-8],ht.updateLinkInterpolate(me[be-6],me[be-2]),ht.updateLink(me[be-6],me[be]);break;case 126:this.$=me[be-6],ht.updateLinkInterpolate([me[be-4]],me[be]);break;case 127:this.$=me[be-6],ht.updateLinkInterpolate(me[be-4],me[be]);break;case 128:case 130:this.$=[me[be]];break;case 129:case 131:me[be-2].push(me[be]),this.$=me[be-2];break;case 133:this.$=me[be-1]+me[be];break;case 181:this.$=me[be];break;case 182:this.$=me[be-1]+""+me[be];break;case 184:this.$=me[be-1]+""+me[be];break;case 185:this.$={stmt:"dir",value:"TB"};break;case 186:this.$={stmt:"dir",value:"BT"};break;case 187:this.$={stmt:"dir",value:"RL"};break;case 188:this.$={stmt:"dir",value:"LR"};break}},"anonymous"),table:[{3:1,4:2,9:e,10:r,12:n},{1:[3]},t(i,a,{5:6}),{4:7,9:e,10:r,12:n},{4:8,9:e,10:r,12:n},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D,121:_,122:O,123:M,124:P},t(i,[2,9]),t(i,[2,10]),t(i,[2,11]),{8:[1,54],9:[1,55],10:B,15:53,18:56},t(F,[2,3]),t(F,[2,4]),t(F,[2,5]),t(F,[2,6]),t(F,[2,7]),t(F,[2,8]),{8:G,9:$,11:U,21:58,41:59,72:63,75:[1,64],77:[1,66],78:[1,65]},{8:G,9:$,11:U,21:67},{8:G,9:$,11:U,21:68},{8:G,9:$,11:U,21:69},{8:G,9:$,11:U,21:70},{8:G,9:$,11:U,21:71},{8:G,9:$,10:[1,72],11:U,21:73},t(F,[2,36]),{35:[1,74]},{37:[1,75]},t(F,[2,39]),t(j,[2,50],{18:76,39:77,10:B,40:te}),{10:[1,79]},{10:[1,80]},{10:[1,81]},{10:[1,82]},{14:Y,44:oe,60:J,80:[1,86],89:ue,95:[1,83],97:[1,84],101:85,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de,120:87},t(F,[2,185]),t(F,[2,186]),t(F,[2,187]),t(F,[2,188]),t(ne,[2,51]),t(ne,[2,54],{46:[1,99]}),t(Te,[2,72],{113:112,29:[1,100],44:g,48:[1,101],50:[1,102],52:[1,103],54:[1,104],56:[1,105],58:[1,106],60:y,63:[1,107],65:[1,108],67:[1,109],68:[1,110],70:[1,111],89:w,102:k,105:A,106:C,109:R,111:I,114:L,115:E,116:D}),t(q,[2,181]),t(q,[2,142]),t(q,[2,143]),t(q,[2,144]),t(q,[2,145]),t(q,[2,146]),t(q,[2,147]),t(q,[2,148]),t(q,[2,149]),t(q,[2,150]),t(q,[2,151]),t(q,[2,152]),t(i,[2,12]),t(i,[2,18]),t(i,[2,19]),{9:[1,113]},t(Ve,[2,26],{18:114,10:B}),t(F,[2,27]),{42:115,43:38,44:g,45:39,47:40,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},t(F,[2,40]),t(F,[2,41]),t(F,[2,42]),t(pe,[2,76],{73:116,62:[1,118],74:[1,117]}),{76:119,79:120,80:Be,81:Ye,116:He,119:Le},{75:[1,125],77:[1,126]},t(Ie,[2,83]),t(F,[2,28]),t(F,[2,29]),t(F,[2,30]),t(F,[2,31]),t(F,[2,32]),{10:Ne,12:Ce,14:Fe,27:fe,28:127,32:xe,44:W,60:he,75:z,80:[1,129],81:[1,130],83:140,84:se,85:le,86:ke,87:ve,88:ye,89:Re,90:_e,91:128,105:ze,109:Ke,111:xt,114:We,115:Oe,116:et},t(Ue,a,{5:153}),t(F,[2,37]),t(F,[2,38]),t(j,[2,48],{44:lt}),t(j,[2,49],{18:155,10:B,40:Gt}),t(ne,[2,44]),{44:g,47:157,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},{102:[1,158],103:159,105:[1,160]},{44:g,47:161,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},{44:g,47:162,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},t(vt,[2,107],{10:[1,163],96:[1,164]}),{80:[1,165]},t(vt,[2,115],{120:167,10:[1,166],14:Y,44:oe,60:J,89:ue,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de}),t(vt,[2,117],{10:[1,168]}),t(Lt,[2,183]),t(Lt,[2,170]),t(Lt,[2,171]),t(Lt,[2,172]),t(Lt,[2,173]),t(Lt,[2,174]),t(Lt,[2,175]),t(Lt,[2,176]),t(Lt,[2,177]),t(Lt,[2,178]),t(Lt,[2,179]),t(Lt,[2,180]),{44:g,47:169,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},{30:170,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:178,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:180,50:[1,179],67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:181,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:182,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:183,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{109:[1,184]},{30:185,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:186,65:[1,187],67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:188,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:189,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:190,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},t(q,[2,182]),t(i,[2,20]),t(Ve,[2,25]),t(j,[2,46],{39:191,18:192,10:B,40:te}),t(pe,[2,73],{10:[1,193]}),{10:[1,194]},{30:195,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{77:[1,196],79:197,116:He,119:Le},t(Ur,[2,79]),t(Ur,[2,81]),t(Ur,[2,82]),t(Ur,[2,168]),t(Ur,[2,169]),{76:198,79:120,80:Be,81:Ye,116:He,119:Le},t(Ie,[2,84]),{8:G,9:$,10:Ne,11:U,12:Ce,14:Fe,21:200,27:fe,29:[1,199],32:xe,44:W,60:he,75:z,83:140,84:se,85:le,86:ke,87:ve,88:ye,89:Re,90:_e,91:201,105:ze,109:Ke,111:xt,114:We,115:Oe,116:et},t(_t,[2,101]),t(_t,[2,103]),t(_t,[2,104]),t(_t,[2,157]),t(_t,[2,158]),t(_t,[2,159]),t(_t,[2,160]),t(_t,[2,161]),t(_t,[2,162]),t(_t,[2,163]),t(_t,[2,164]),t(_t,[2,165]),t(_t,[2,166]),t(_t,[2,167]),t(_t,[2,90]),t(_t,[2,91]),t(_t,[2,92]),t(_t,[2,93]),t(_t,[2,94]),t(_t,[2,95]),t(_t,[2,96]),t(_t,[2,97]),t(_t,[2,98]),t(_t,[2,99]),t(_t,[2,100]),{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,202],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D,121:_,122:O,123:M,124:P},{10:B,18:203},{44:[1,204]},t(ne,[2,43]),{10:[1,205],44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:112,114:L,115:E,116:D},{10:[1,206]},{10:[1,207],106:[1,208]},t(bn,[2,128]),{10:[1,209],44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:112,114:L,115:E,116:D},{10:[1,210],44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:112,114:L,115:E,116:D},{80:[1,211]},t(vt,[2,109],{10:[1,212]}),t(vt,[2,111],{10:[1,213]}),{80:[1,214]},t(Lt,[2,184]),{80:[1,215],98:[1,216]},t(ne,[2,55],{113:112,44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,114:L,115:E,116:D}),{31:[1,217],67:dt,82:218,116:wt,117:yt,118:ft},t(Br,[2,86]),t(Br,[2,88]),t(Br,[2,89]),t(Br,[2,153]),t(Br,[2,154]),t(Br,[2,155]),t(Br,[2,156]),{49:[1,219],67:dt,82:218,116:wt,117:yt,118:ft},{30:220,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{51:[1,221],67:dt,82:218,116:wt,117:yt,118:ft},{53:[1,222],67:dt,82:218,116:wt,117:yt,118:ft},{55:[1,223],67:dt,82:218,116:wt,117:yt,118:ft},{57:[1,224],67:dt,82:218,116:wt,117:yt,118:ft},{60:[1,225]},{64:[1,226],67:dt,82:218,116:wt,117:yt,118:ft},{66:[1,227],67:dt,82:218,116:wt,117:yt,118:ft},{30:228,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{31:[1,229],67:dt,82:218,116:wt,117:yt,118:ft},{67:dt,69:[1,230],71:[1,231],82:218,116:wt,117:yt,118:ft},{67:dt,69:[1,233],71:[1,232],82:218,116:wt,117:yt,118:ft},t(j,[2,45],{18:155,10:B,40:Gt}),t(j,[2,47],{44:lt}),t(pe,[2,75]),t(pe,[2,74]),{62:[1,234],67:dt,82:218,116:wt,117:yt,118:ft},t(pe,[2,77]),t(Ur,[2,80]),{77:[1,235],79:197,116:He,119:Le},{30:236,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},t(Ue,a,{5:237}),t(_t,[2,102]),t(F,[2,35]),{43:238,44:g,45:39,47:40,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},{10:B,18:239},{10:cr,60:ar,84:_r,92:240,105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{10:cr,60:ar,84:_r,92:251,104:[1,252],105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{10:cr,60:ar,84:_r,92:253,104:[1,254],105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{105:[1,255]},{10:cr,60:ar,84:_r,92:256,105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{44:g,47:257,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},t(vt,[2,108]),{80:[1,258]},{80:[1,259],98:[1,260]},t(vt,[2,116]),t(vt,[2,118],{10:[1,261]}),t(vt,[2,119]),t(Te,[2,56]),t(Br,[2,87]),t(Te,[2,57]),{51:[1,262],67:dt,82:218,116:wt,117:yt,118:ft},t(Te,[2,64]),t(Te,[2,59]),t(Te,[2,60]),t(Te,[2,61]),{109:[1,263]},t(Te,[2,63]),t(Te,[2,65]),{66:[1,264],67:dt,82:218,116:wt,117:yt,118:ft},t(Te,[2,67]),t(Te,[2,68]),t(Te,[2,70]),t(Te,[2,69]),t(Te,[2,71]),t([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),t(pe,[2,78]),{31:[1,265],67:dt,82:218,116:wt,117:yt,118:ft},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,266],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D,121:_,122:O,123:M,124:P},t(ne,[2,53]),{43:267,44:g,45:39,47:40,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},t(vt,[2,121],{106:Tn}),t(yn,[2,130],{108:269,10:cr,60:ar,84:_r,105:Ct,109:Se,110:at,111:Nt,112:wr}),t(sn,[2,132]),t(sn,[2,134]),t(sn,[2,135]),t(sn,[2,136]),t(sn,[2,137]),t(sn,[2,138]),t(sn,[2,139]),t(sn,[2,140]),t(sn,[2,141]),t(vt,[2,122],{106:Tn}),{10:[1,270]},t(vt,[2,123],{106:Tn}),{10:[1,271]},t(bn,[2,129]),t(vt,[2,105],{106:Tn}),t(vt,[2,106],{113:112,44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,114:L,115:E,116:D}),t(vt,[2,110]),t(vt,[2,112],{10:[1,272]}),t(vt,[2,113]),{98:[1,273]},{51:[1,274]},{62:[1,275]},{66:[1,276]},{8:G,9:$,11:U,21:277},t(F,[2,34]),t(ne,[2,52]),{10:cr,60:ar,84:_r,105:Ct,107:278,108:242,109:Se,110:at,111:Nt,112:wr},t(sn,[2,133]),{14:Y,44:oe,60:J,89:ue,101:279,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de,120:87},{14:Y,44:oe,60:J,89:ue,101:280,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de,120:87},{98:[1,281]},t(vt,[2,120]),t(Te,[2,58]),{30:282,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},t(Te,[2,66]),t(Ue,a,{5:283}),t(yn,[2,131],{108:269,10:cr,60:ar,84:_r,105:Ct,109:Se,110:at,111:Nt,112:wr}),t(vt,[2,126],{120:167,10:[1,284],14:Y,44:oe,60:J,89:ue,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de}),t(vt,[2,127],{120:167,10:[1,285],14:Y,44:oe,60:J,89:ue,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de}),t(vt,[2,114]),{31:[1,286],67:dt,82:218,116:wt,117:yt,118:ft},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,287],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D,121:_,122:O,123:M,124:P},{10:cr,60:ar,84:_r,92:288,105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{10:cr,60:ar,84:_r,92:289,105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},t(Te,[2,62]),t(F,[2,33]),t(vt,[2,124],{106:Tn}),t(vt,[2,125],{106:Tn})],defaultActions:{},parseError:o(function(it,kt){if(kt.recoverable)this.trace(it);else{var jt=new Error(it);throw jt.hash=kt,jt}},"parseError"),parse:o(function(it){var kt=this,jt=[0],ht=[],Dr=[null],me=[],Yl=this.table,be="",jr=0,V4=0,XC=0,jC=2,Gz=1,$3e=me.slice.call(arguments,1),qi=Object.create(this.lexer),ad={yy:{}};for(var KC in this.yy)Object.prototype.hasOwnProperty.call(this.yy,KC)&&(ad.yy[KC]=this.yy[KC]);qi.setInput(it,ad.yy),ad.yy.lexer=qi,ad.yy.parser=this,typeof qi.yylloc>"u"&&(qi.yylloc={});var QC=qi.yylloc;me.push(QC);var z3e=qi.options&&qi.options.ranges;typeof ad.yy.parseError=="function"?this.parseError=ad.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Pat(Js){jt.length=jt.length-2*Js,Dr.length=Dr.length-Js,me.length=me.length-Js}o(Pat,"popStack");function G3e(){var Js;return Js=ht.pop()||qi.lex()||Gz,typeof Js!="number"&&(Js instanceof Array&&(ht=Js,Js=ht.pop()),Js=kt.symbols_[Js]||Js),Js}o(G3e,"lex");for(var Xa,ZC,sd,ko,Bat,JC,g0={},U4,iu,Vz,H4;;){if(sd=jt[jt.length-1],this.defaultActions[sd]?ko=this.defaultActions[sd]:((Xa===null||typeof Xa>"u")&&(Xa=G3e()),ko=Yl[sd]&&Yl[sd][Xa]),typeof ko>"u"||!ko.length||!ko[0]){var e7="";H4=[];for(U4 in Yl[sd])this.terminals_[U4]&&U4>jC&&H4.push("'"+this.terminals_[U4]+"'");qi.showPosition?e7="Parse error on line "+(jr+1)+`: +`+qi.showPosition()+` +Expecting `+H4.join(", ")+", got '"+(this.terminals_[Xa]||Xa)+"'":e7="Parse error on line "+(jr+1)+": Unexpected "+(Xa==Gz?"end of input":"'"+(this.terminals_[Xa]||Xa)+"'"),this.parseError(e7,{text:qi.match,token:this.terminals_[Xa]||Xa,line:qi.yylineno,loc:QC,expected:H4})}if(ko[0]instanceof Array&&ko.length>1)throw new Error("Parse Error: multiple actions possible at state: "+sd+", token: "+Xa);switch(ko[0]){case 1:jt.push(Xa),Dr.push(qi.yytext),me.push(qi.yylloc),jt.push(ko[1]),Xa=null,ZC?(Xa=ZC,ZC=null):(V4=qi.yyleng,be=qi.yytext,jr=qi.yylineno,QC=qi.yylloc,XC>0&&XC--);break;case 2:if(iu=this.productions_[ko[1]][1],g0.$=Dr[Dr.length-iu],g0._$={first_line:me[me.length-(iu||1)].first_line,last_line:me[me.length-1].last_line,first_column:me[me.length-(iu||1)].first_column,last_column:me[me.length-1].last_column},z3e&&(g0._$.range=[me[me.length-(iu||1)].range[0],me[me.length-1].range[1]]),JC=this.performAction.apply(g0,[be,V4,jr,ad.yy,ko[1],Dr,me].concat($3e)),typeof JC<"u")return JC;iu&&(jt=jt.slice(0,-1*iu*2),Dr=Dr.slice(0,-1*iu),me=me.slice(0,-1*iu)),jt.push(this.productions_[ko[1]][0]),Dr.push(g0.$),me.push(g0._$),Vz=Yl[jt[jt.length-2]][jt[jt.length-1]],jt.push(Vz);break;case 3:return!0}}return!0},"parse")},Zs=(function(){var fr={EOF:1,parseError:o(function(kt,jt){if(this.yy.parser)this.yy.parser.parseError(kt,jt);else throw new Error(kt)},"parseError"),setInput:o(function(it,kt){return this.yy=kt||this.yy||{},this._input=it,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var it=this._input[0];this.yytext+=it,this.yyleng++,this.offset++,this.match+=it,this.matched+=it;var kt=it.match(/(?:\r\n?|\n).*/g);return kt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),it},"input"),unput:o(function(it){var kt=it.length,jt=it.split(/(?:\r\n?|\n)/g);this._input=it+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-kt),this.offset-=kt;var ht=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),jt.length-1&&(this.yylineno-=jt.length-1);var Dr=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:jt?(jt.length===ht.length?this.yylloc.first_column:0)+ht[ht.length-jt.length].length-jt[0].length:this.yylloc.first_column-kt},this.options.ranges&&(this.yylloc.range=[Dr[0],Dr[0]+this.yyleng-kt]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(it){this.unput(this.match.slice(it))},"less"),pastInput:o(function(){var it=this.matched.substr(0,this.matched.length-this.match.length);return(it.length>20?"...":"")+it.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var it=this.match;return it.length<20&&(it+=this._input.substr(0,20-it.length)),(it.substr(0,20)+(it.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var it=this.pastInput(),kt=new Array(it.length+1).join("-");return it+this.upcomingInput()+` +`+kt+"^"},"showPosition"),test_match:o(function(it,kt){var jt,ht,Dr;if(this.options.backtrack_lexer&&(Dr={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Dr.yylloc.range=this.yylloc.range.slice(0))),ht=it[0].match(/(?:\r\n?|\n).*/g),ht&&(this.yylineno+=ht.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ht?ht[ht.length-1].length-ht[ht.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+it[0].length},this.yytext+=it[0],this.match+=it[0],this.matches=it,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(it[0].length),this.matched+=it[0],jt=this.performAction.call(this,this.yy,this,kt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),jt)return jt;if(this._backtrack){for(var me in Dr)this[me]=Dr[me];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var it,kt,jt,ht;this._more||(this.yytext="",this.match="");for(var Dr=this._currentRules(),me=0;mekt[0].length)){if(kt=jt,ht=me,this.options.backtrack_lexer){if(it=this.test_match(jt,Dr[me]),it!==!1)return it;if(this._backtrack){kt=!1;continue}else return!1}else if(!this.options.flex)break}return kt?(it=this.test_match(kt,Dr[ht]),it!==!1?it:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var kt=this.next();return kt||this.lex()},"lex"),begin:o(function(kt){this.conditionStack.push(kt)},"begin"),popState:o(function(){var kt=this.conditionStack.length-1;return kt>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(kt){return kt=this.conditionStack.length-1-Math.abs(kt||0),kt>=0?this.conditionStack[kt]:"INITIAL"},"topState"),pushState:o(function(kt){this.begin(kt)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(kt,jt,ht,Dr){var me=Dr;switch(ht){case 0:return this.begin("acc_title"),34;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),36;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),jt.yytext="",40;break;case 8:return this.pushState("shapeDataStr"),40;break;case 9:return this.popState(),40;break;case 10:let Yl=/\n\s*/g;return jt.yytext=jt.yytext.replace(Yl,"
    "),40;break;case 11:return 40;case 12:this.popState();break;case 13:this.begin("callbackname");break;case 14:this.popState();break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 95;case 17:this.popState();break;case 18:return 96;case 19:return"MD_STR";case 20:this.popState();break;case 21:this.begin("md_string");break;case 22:return"STR";case 23:this.popState();break;case 24:this.pushState("string");break;case 25:return 84;case 26:return 102;case 27:return 85;case 28:return 104;case 29:return 86;case 30:return 87;case 31:return 97;case 32:this.begin("click");break;case 33:this.popState();break;case 34:return 88;case 35:return kt.lex.firstGraph()&&this.begin("dir"),12;break;case 36:return kt.lex.firstGraph()&&this.begin("dir"),12;break;case 37:return kt.lex.firstGraph()&&this.begin("dir"),12;break;case 38:return 27;case 39:return 32;case 40:return 98;case 41:return 98;case 42:return 98;case 43:return 98;case 44:return this.popState(),13;break;case 45:return this.popState(),14;break;case 46:return this.popState(),14;break;case 47:return this.popState(),14;break;case 48:return this.popState(),14;break;case 49:return this.popState(),14;break;case 50:return this.popState(),14;break;case 51:return this.popState(),14;break;case 52:return this.popState(),14;break;case 53:return this.popState(),14;break;case 54:return this.popState(),14;break;case 55:return 121;case 56:return 122;case 57:return 123;case 58:return 124;case 59:return 78;case 60:return 105;case 61:return 111;case 62:return 46;case 63:return 60;case 64:return 44;case 65:return 8;case 66:return 106;case 67:return 115;case 68:return this.popState(),77;break;case 69:return this.pushState("edgeText"),75;break;case 70:return 119;case 71:return this.popState(),77;break;case 72:return this.pushState("thickEdgeText"),75;break;case 73:return 119;case 74:return this.popState(),77;break;case 75:return this.pushState("dottedEdgeText"),75;break;case 76:return 119;case 77:return 77;case 78:return this.popState(),53;break;case 79:return"TEXT";case 80:return this.pushState("ellipseText"),52;break;case 81:return this.popState(),55;break;case 82:return this.pushState("text"),54;break;case 83:return this.popState(),57;break;case 84:return this.pushState("text"),56;break;case 85:return 58;case 86:return this.pushState("text"),67;break;case 87:return this.popState(),64;break;case 88:return this.pushState("text"),63;break;case 89:return this.popState(),49;break;case 90:return this.pushState("text"),48;break;case 91:return this.popState(),69;break;case 92:return this.popState(),71;break;case 93:return 117;case 94:return this.pushState("trapText"),68;break;case 95:return this.pushState("trapText"),70;break;case 96:return 118;case 97:return 67;case 98:return 90;case 99:return"SEP";case 100:return 89;case 101:return 115;case 102:return 111;case 103:return 44;case 104:return 109;case 105:return 114;case 106:return 116;case 107:return this.popState(),62;break;case 108:return this.pushState("text"),62;break;case 109:return this.popState(),51;break;case 110:return this.pushState("text"),50;break;case 111:return this.popState(),31;break;case 112:return this.pushState("text"),29;break;case 113:return this.popState(),66;break;case 114:return this.pushState("text"),65;break;case 115:return"TEXT";case 116:return"QUOTE";case 117:return 9;case 118:return 10;case 119:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[^\s\"]+@(?=[^\{\"]))/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeData:{rules:[8,11,12,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackargs:{rules:[17,18,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackname:{rules:[14,15,16,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},href:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},click:{rules:[21,24,33,34,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dottedEdgeText:{rules:[21,24,74,76,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},thickEdgeText:{rules:[21,24,71,73,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},edgeText:{rules:[21,24,68,70,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},trapText:{rules:[21,24,77,80,82,84,88,90,91,92,93,94,95,108,110,112,114],inclusive:!1},ellipseText:{rules:[21,24,77,78,79,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},text:{rules:[21,24,77,80,81,82,83,84,87,88,89,90,94,95,107,108,109,110,111,112,113,114,115],inclusive:!1},vertex:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr:{rules:[3,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_title:{rules:[1,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},md_string:{rules:[19,20,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},string:{rules:[21,22,23,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,71,72,74,75,77,80,82,84,85,86,88,90,94,95,96,97,98,99,100,101,102,103,104,105,106,108,110,112,114,116,117,118,119],inclusive:!0}}};return fr})();Hi.lexer=Zs;function _a(){this.yy={}}return o(_a,"Parser"),_a.prototype=Hi,Hi.Parser=_a,new _a})();GI.parser=GI;VI=GI});var ffe,dfe,pfe=N(()=>{"use strict";hfe();ffe=Object.assign({},VI);ffe.parse=t=>{let e=t.replace(/}\s*\n/g,`} +`);return VI.parse(e)};dfe=ffe});var zc,yg=N(()=>{"use strict";zc=o(()=>` + /* Font Awesome icon styling - consolidated */ + .label-icon { + display: inline-block; + height: 1em; + overflow: visible; + vertical-align: -0.125em; + } + + .node .label-icon path { + fill: currentColor; + stroke: revert; + stroke-width: revert; + } +`,"getIconStyles")});var Jqe,eWe,mfe,gfe=N(()=>{"use strict";eo();yg();Jqe=o((t,e)=>{let r=ld,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Ka(n,i,a,e)},"fade"),eWe=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .cluster-label text { + fill: ${t.titleColor}; + } + .cluster-label span { + color: ${t.titleColor}; + } + .cluster-label span p { + background-color: transparent; + } + + .label text,span { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .katex path { + fill: #000; + stroke: #000; + stroke-width: 1px; + } + + .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + + .root .anchor path { + fill: ${t.lineColor} !important; + stroke-width: 0; + stroke: ${t.lineColor}; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${Jqe(t.edgeLabelBackground,.5)}; + // background-color: + } + + .cluster rect { + fill: ${t.clusterBkg}; + stroke: ${t.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${t.titleColor}; + } + + .cluster span { + color: ${t.titleColor}; + } + /* .cluster div { + color: ${t.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } + + rect.text { + fill: none; + stroke-width: 0; + } + + .icon-shape, .image-shape { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + padding: 2px; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + ${zc()} +`,"getStyles"),mfe=eWe});var CE={};dr(CE,{diagram:()=>tWe});var tWe,AE=N(()=>{"use strict";Xt();Bte();ufe();pfe();gfe();tWe={parser:dfe,get db(){return new lw},renderer:cfe,styles:mfe,init:o(t=>{t.flowchart||(t.flowchart={}),t.layout&&nv({layout:t.layout}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,nv({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}})},"init")}});var UI,Tfe,wfe=N(()=>{"use strict";UI=(function(){var t=o(function(K,ae,Q,de){for(Q=Q||{},de=K.length;de--;Q[K[de]]=ae);return Q},"o"),e=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,50],r=[1,10],n=[1,11],i=[1,12],a=[1,13],s=[1,20],l=[1,21],u=[1,22],h=[1,23],f=[1,24],d=[1,19],p=[1,25],m=[1,26],g=[1,18],y=[1,33],v=[1,34],x=[1,35],b=[1,36],T=[1,37],S=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,50,63,64,65,66,67],w=[1,42],k=[1,43],A=[1,52],C=[40,50,68,69],R=[1,63],I=[1,61],L=[1,58],E=[1,62],D=[1,64],_=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,63,64,65,66,67],O=[63,64,65,66,67],M=[1,81],P=[1,80],B=[1,78],F=[1,79],G=[6,10,42,47],$=[6,10,13,41,42,47,48,49],U=[1,89],j=[1,88],te=[1,87],Y=[19,56],oe=[1,98],J=[1,97],ue=[19,56,58,60],re={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,COLON:13,role:14,STYLE_SEPARATOR:15,idList:16,BLOCK_START:17,attributes:18,BLOCK_STOP:19,SQS:20,SQE:21,title:22,title_value:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,direction:29,classDefStatement:30,classStatement:31,styleStatement:32,direction_tb:33,direction_bt:34,direction_rl:35,direction_lr:36,CLASSDEF:37,stylesOpt:38,separator:39,UNICODE_TEXT:40,STYLE_TEXT:41,COMMA:42,CLASS:43,STYLE:44,style:45,styleComponent:46,SEMI:47,NUM:48,BRKT:49,ENTITY_NAME:50,attribute:51,attributeType:52,attributeName:53,attributeKeyTypeList:54,attributeComment:55,ATTRIBUTE_WORD:56,attributeKeyType:57,",":58,ATTRIBUTE_KEY:59,COMMENT:60,cardinality:61,relType:62,ZERO_OR_ONE:63,ZERO_OR_MORE:64,ONE_OR_MORE:65,ONLY_ONE:66,MD_PARENT:67,NON_IDENTIFYING:68,IDENTIFYING:69,WORD:70,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:"COLON",15:"STYLE_SEPARATOR",17:"BLOCK_START",19:"BLOCK_STOP",20:"SQS",21:"SQE",22:"title",23:"title_value",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"direction_tb",34:"direction_bt",35:"direction_rl",36:"direction_lr",37:"CLASSDEF",40:"UNICODE_TEXT",41:"STYLE_TEXT",42:"COMMA",43:"CLASS",44:"STYLE",47:"SEMI",48:"NUM",49:"BRKT",50:"ENTITY_NAME",56:"ATTRIBUTE_WORD",58:",",59:"ATTRIBUTE_KEY",60:"COMMENT",63:"ZERO_OR_ONE",64:"ZERO_OR_MORE",65:"ONE_OR_MORE",66:"ONLY_ONE",67:"MD_PARENT",68:"NON_IDENTIFYING",69:"IDENTIFYING",70:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[18,1],[18,2],[51,2],[51,3],[51,3],[51,4],[52,1],[53,1],[54,1],[54,3],[57,1],[55,1],[12,3],[61,1],[61,1],[61,1],[61,1],[61,1],[62,1],[62,1],[14,1],[14,1],[14,1]],performAction:o(function(ae,Q,de,ne,Te,q,Ve){var pe=q.length-1;switch(Te){case 1:break;case 2:this.$=[];break;case 3:q[pe-1].push(q[pe]),this.$=q[pe-1];break;case 4:case 5:this.$=q[pe];break;case 6:case 7:this.$=[];break;case 8:ne.addEntity(q[pe-4]),ne.addEntity(q[pe-2]),ne.addRelationship(q[pe-4],q[pe],q[pe-2],q[pe-3]);break;case 9:ne.addEntity(q[pe-8]),ne.addEntity(q[pe-4]),ne.addRelationship(q[pe-8],q[pe],q[pe-4],q[pe-5]),ne.setClass([q[pe-8]],q[pe-6]),ne.setClass([q[pe-4]],q[pe-2]);break;case 10:ne.addEntity(q[pe-6]),ne.addEntity(q[pe-2]),ne.addRelationship(q[pe-6],q[pe],q[pe-2],q[pe-3]),ne.setClass([q[pe-6]],q[pe-4]);break;case 11:ne.addEntity(q[pe-6]),ne.addEntity(q[pe-4]),ne.addRelationship(q[pe-6],q[pe],q[pe-4],q[pe-5]),ne.setClass([q[pe-4]],q[pe-2]);break;case 12:ne.addEntity(q[pe-3]),ne.addAttributes(q[pe-3],q[pe-1]);break;case 13:ne.addEntity(q[pe-5]),ne.addAttributes(q[pe-5],q[pe-1]),ne.setClass([q[pe-5]],q[pe-3]);break;case 14:ne.addEntity(q[pe-2]);break;case 15:ne.addEntity(q[pe-4]),ne.setClass([q[pe-4]],q[pe-2]);break;case 16:ne.addEntity(q[pe]);break;case 17:ne.addEntity(q[pe-2]),ne.setClass([q[pe-2]],q[pe]);break;case 18:ne.addEntity(q[pe-6],q[pe-4]),ne.addAttributes(q[pe-6],q[pe-1]);break;case 19:ne.addEntity(q[pe-8],q[pe-6]),ne.addAttributes(q[pe-8],q[pe-1]),ne.setClass([q[pe-8]],q[pe-3]);break;case 20:ne.addEntity(q[pe-5],q[pe-3]);break;case 21:ne.addEntity(q[pe-7],q[pe-5]),ne.setClass([q[pe-7]],q[pe-2]);break;case 22:ne.addEntity(q[pe-3],q[pe-1]);break;case 23:ne.addEntity(q[pe-5],q[pe-3]),ne.setClass([q[pe-5]],q[pe]);break;case 24:case 25:this.$=q[pe].trim(),ne.setAccTitle(this.$);break;case 26:case 27:this.$=q[pe].trim(),ne.setAccDescription(this.$);break;case 32:ne.setDirection("TB");break;case 33:ne.setDirection("BT");break;case 34:ne.setDirection("RL");break;case 35:ne.setDirection("LR");break;case 36:this.$=q[pe-3],ne.addClass(q[pe-2],q[pe-1]);break;case 37:case 38:case 56:case 64:this.$=[q[pe]];break;case 39:case 40:this.$=q[pe-2].concat([q[pe]]);break;case 41:this.$=q[pe-2],ne.setClass(q[pe-1],q[pe]);break;case 42:this.$=q[pe-3],ne.addCssStyles(q[pe-2],q[pe-1]);break;case 43:this.$=[q[pe]];break;case 44:q[pe-2].push(q[pe]),this.$=q[pe-2];break;case 46:this.$=q[pe-1]+q[pe];break;case 54:case 76:case 77:this.$=q[pe].replace(/"/g,"");break;case 55:case 78:this.$=q[pe];break;case 57:q[pe].push(q[pe-1]),this.$=q[pe];break;case 58:this.$={type:q[pe-1],name:q[pe]};break;case 59:this.$={type:q[pe-2],name:q[pe-1],keys:q[pe]};break;case 60:this.$={type:q[pe-2],name:q[pe-1],comment:q[pe]};break;case 61:this.$={type:q[pe-3],name:q[pe-2],keys:q[pe-1],comment:q[pe]};break;case 62:case 63:case 66:this.$=q[pe];break;case 65:q[pe-2].push(q[pe]),this.$=q[pe-2];break;case 67:this.$=q[pe].replace(/"/g,"");break;case 68:this.$={cardA:q[pe],relType:q[pe-1],cardB:q[pe-2]};break;case 69:this.$=ne.Cardinality.ZERO_OR_ONE;break;case 70:this.$=ne.Cardinality.ZERO_OR_MORE;break;case 71:this.$=ne.Cardinality.ONE_OR_MORE;break;case 72:this.$=ne.Cardinality.ONLY_ONE;break;case 73:this.$=ne.Cardinality.MD_PARENT;break;case 74:this.$=ne.Identification.NON_IDENTIFYING;break;case 75:this.$=ne.Identification.IDENTIFYING;break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,50:g},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:27,11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,50:g},t(e,[2,5]),t(e,[2,6]),t(e,[2,16],{12:28,61:32,15:[1,29],17:[1,30],20:[1,31],63:y,64:v,65:x,66:b,67:T}),{23:[1,38]},{25:[1,39]},{27:[1,40]},t(e,[2,27]),t(e,[2,28]),t(e,[2,29]),t(e,[2,30]),t(e,[2,31]),t(S,[2,54]),t(S,[2,55]),t(e,[2,32]),t(e,[2,33]),t(e,[2,34]),t(e,[2,35]),{16:41,40:w,41:k},{16:44,40:w,41:k},{16:45,40:w,41:k},t(e,[2,4]),{11:46,40:d,50:g},{16:47,40:w,41:k},{18:48,19:[1,49],51:50,52:51,56:A},{11:53,40:d,50:g},{62:54,68:[1,55],69:[1,56]},t(C,[2,69]),t(C,[2,70]),t(C,[2,71]),t(C,[2,72]),t(C,[2,73]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),{13:R,38:57,41:I,42:L,45:59,46:60,48:E,49:D},t(_,[2,37]),t(_,[2,38]),{16:65,40:w,41:k,42:L},{13:R,38:66,41:I,42:L,45:59,46:60,48:E,49:D},{13:[1,67],15:[1,68]},t(e,[2,17],{61:32,12:69,17:[1,70],42:L,63:y,64:v,65:x,66:b,67:T}),{19:[1,71]},t(e,[2,14]),{18:72,19:[2,56],51:50,52:51,56:A},{53:73,56:[1,74]},{56:[2,62]},{21:[1,75]},{61:76,63:y,64:v,65:x,66:b,67:T},t(O,[2,74]),t(O,[2,75]),{6:M,10:P,39:77,42:B,47:F},{40:[1,82],41:[1,83]},t(G,[2,43],{46:84,13:R,41:I,48:E,49:D}),t($,[2,45]),t($,[2,50]),t($,[2,51]),t($,[2,52]),t($,[2,53]),t(e,[2,41],{42:L}),{6:M,10:P,39:85,42:B,47:F},{14:86,40:U,50:j,70:te},{16:90,40:w,41:k},{11:91,40:d,50:g},{18:92,19:[1,93],51:50,52:51,56:A},t(e,[2,12]),{19:[2,57]},t(Y,[2,58],{54:94,55:95,57:96,59:oe,60:J}),t([19,56,59,60],[2,63]),t(e,[2,22],{15:[1,100],17:[1,99]}),t([40,50],[2,68]),t(e,[2,36]),{13:R,41:I,45:101,46:60,48:E,49:D},t(e,[2,47]),t(e,[2,48]),t(e,[2,49]),t(_,[2,39]),t(_,[2,40]),t($,[2,46]),t(e,[2,42]),t(e,[2,8]),t(e,[2,76]),t(e,[2,77]),t(e,[2,78]),{13:[1,102],42:L},{13:[1,104],15:[1,103]},{19:[1,105]},t(e,[2,15]),t(Y,[2,59],{55:106,58:[1,107],60:J}),t(Y,[2,60]),t(ue,[2,64]),t(Y,[2,67]),t(ue,[2,66]),{18:108,19:[1,109],51:50,52:51,56:A},{16:110,40:w,41:k},t(G,[2,44],{46:84,13:R,41:I,48:E,49:D}),{14:111,40:U,50:j,70:te},{16:112,40:w,41:k},{14:113,40:U,50:j,70:te},t(e,[2,13]),t(Y,[2,61]),{57:114,59:oe},{19:[1,115]},t(e,[2,20]),t(e,[2,23],{17:[1,116],42:L}),t(e,[2,11]),{13:[1,117],42:L},t(e,[2,10]),t(ue,[2,65]),t(e,[2,18]),{18:118,19:[1,119],51:50,52:51,56:A},{14:120,40:U,50:j,70:te},{19:[1,121]},t(e,[2,21]),t(e,[2,9]),t(e,[2,19])],defaultActions:{52:[2,62],72:[2,57]},parseError:o(function(ae,Q){if(Q.recoverable)this.trace(ae);else{var de=new Error(ae);throw de.hash=Q,de}},"parseError"),parse:o(function(ae){var Q=this,de=[0],ne=[],Te=[null],q=[],Ve=this.table,pe="",Be=0,Ye=0,He=0,Le=2,Ie=1,Ne=q.slice.call(arguments,1),Ce=Object.create(this.lexer),Fe={yy:{}};for(var fe in this.yy)Object.prototype.hasOwnProperty.call(this.yy,fe)&&(Fe.yy[fe]=this.yy[fe]);Ce.setInput(ae,Fe.yy),Fe.yy.lexer=Ce,Fe.yy.parser=this,typeof Ce.yylloc>"u"&&(Ce.yylloc={});var xe=Ce.yylloc;q.push(xe);var W=Ce.options&&Ce.options.ranges;typeof Fe.yy.parseError=="function"?this.parseError=Fe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function he(et){de.length=de.length-2*et,Te.length=Te.length-et,q.length=q.length-et}o(he,"popStack");function z(){var et;return et=ne.pop()||Ce.lex()||Ie,typeof et!="number"&&(et instanceof Array&&(ne=et,et=ne.pop()),et=Q.symbols_[et]||et),et}o(z,"lex");for(var se,le,ke,ve,ye,Re,_e={},ze,Ke,xt,We;;){if(ke=de[de.length-1],this.defaultActions[ke]?ve=this.defaultActions[ke]:((se===null||typeof se>"u")&&(se=z()),ve=Ve[ke]&&Ve[ke][se]),typeof ve>"u"||!ve.length||!ve[0]){var Oe="";We=[];for(ze in Ve[ke])this.terminals_[ze]&&ze>Le&&We.push("'"+this.terminals_[ze]+"'");Ce.showPosition?Oe="Parse error on line "+(Be+1)+`: +`+Ce.showPosition()+` +Expecting `+We.join(", ")+", got '"+(this.terminals_[se]||se)+"'":Oe="Parse error on line "+(Be+1)+": Unexpected "+(se==Ie?"end of input":"'"+(this.terminals_[se]||se)+"'"),this.parseError(Oe,{text:Ce.match,token:this.terminals_[se]||se,line:Ce.yylineno,loc:xe,expected:We})}if(ve[0]instanceof Array&&ve.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ke+", token: "+se);switch(ve[0]){case 1:de.push(se),Te.push(Ce.yytext),q.push(Ce.yylloc),de.push(ve[1]),se=null,le?(se=le,le=null):(Ye=Ce.yyleng,pe=Ce.yytext,Be=Ce.yylineno,xe=Ce.yylloc,He>0&&He--);break;case 2:if(Ke=this.productions_[ve[1]][1],_e.$=Te[Te.length-Ke],_e._$={first_line:q[q.length-(Ke||1)].first_line,last_line:q[q.length-1].last_line,first_column:q[q.length-(Ke||1)].first_column,last_column:q[q.length-1].last_column},W&&(_e._$.range=[q[q.length-(Ke||1)].range[0],q[q.length-1].range[1]]),Re=this.performAction.apply(_e,[pe,Ye,Be,Fe.yy,ve[1],Te,q].concat(Ne)),typeof Re<"u")return Re;Ke&&(de=de.slice(0,-1*Ke*2),Te=Te.slice(0,-1*Ke),q=q.slice(0,-1*Ke)),de.push(this.productions_[ve[1]][0]),Te.push(_e.$),q.push(_e._$),xt=Ve[de[de.length-2]][de[de.length-1]],de.push(xt);break;case 3:return!0}}return!0},"parse")},ee=(function(){var K={EOF:1,parseError:o(function(Q,de){if(this.yy.parser)this.yy.parser.parseError(Q,de);else throw new Error(Q)},"parseError"),setInput:o(function(ae,Q){return this.yy=Q||this.yy||{},this._input=ae,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var ae=this._input[0];this.yytext+=ae,this.yyleng++,this.offset++,this.match+=ae,this.matched+=ae;var Q=ae.match(/(?:\r\n?|\n).*/g);return Q?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ae},"input"),unput:o(function(ae){var Q=ae.length,de=ae.split(/(?:\r\n?|\n)/g);this._input=ae+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Q),this.offset-=Q;var ne=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),de.length-1&&(this.yylineno-=de.length-1);var Te=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:de?(de.length===ne.length?this.yylloc.first_column:0)+ne[ne.length-de.length].length-de[0].length:this.yylloc.first_column-Q},this.options.ranges&&(this.yylloc.range=[Te[0],Te[0]+this.yyleng-Q]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(ae){this.unput(this.match.slice(ae))},"less"),pastInput:o(function(){var ae=this.matched.substr(0,this.matched.length-this.match.length);return(ae.length>20?"...":"")+ae.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var ae=this.match;return ae.length<20&&(ae+=this._input.substr(0,20-ae.length)),(ae.substr(0,20)+(ae.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var ae=this.pastInput(),Q=new Array(ae.length+1).join("-");return ae+this.upcomingInput()+` +`+Q+"^"},"showPosition"),test_match:o(function(ae,Q){var de,ne,Te;if(this.options.backtrack_lexer&&(Te={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Te.yylloc.range=this.yylloc.range.slice(0))),ne=ae[0].match(/(?:\r\n?|\n).*/g),ne&&(this.yylineno+=ne.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ne?ne[ne.length-1].length-ne[ne.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+ae[0].length},this.yytext+=ae[0],this.match+=ae[0],this.matches=ae,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(ae[0].length),this.matched+=ae[0],de=this.performAction.call(this,this.yy,this,Q,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),de)return de;if(this._backtrack){for(var q in Te)this[q]=Te[q];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var ae,Q,de,ne;this._more||(this.yytext="",this.match="");for(var Te=this._currentRules(),q=0;qQ[0].length)){if(Q=de,ne=q,this.options.backtrack_lexer){if(ae=this.test_match(de,Te[q]),ae!==!1)return ae;if(this._backtrack){Q=!1;continue}else return!1}else if(!this.options.flex)break}return Q?(ae=this.test_match(Q,Te[ne]),ae!==!1?ae:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Q=this.next();return Q||this.lex()},"lex"),begin:o(function(Q){this.conditionStack.push(Q)},"begin"),popState:o(function(){var Q=this.conditionStack.length-1;return Q>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Q){return Q=this.conditionStack.length-1-Math.abs(Q||0),Q>=0?this.conditionStack[Q]:"INITIAL"},"topState"),pushState:o(function(Q){this.begin(Q)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(Q,de,ne,Te){var q=Te;switch(ne){case 0:return this.begin("acc_title"),24;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),26;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 33;case 8:return 34;case 9:return 35;case 10:return 36;case 11:return 10;case 12:break;case 13:return 8;case 14:return 50;case 15:return 70;case 16:return 4;case 17:return this.begin("block"),17;break;case 18:return 49;case 19:return 49;case 20:return 42;case 21:return 15;case 22:return 13;case 23:break;case 24:return 59;case 25:return 56;case 26:return 56;case 27:return 60;case 28:break;case 29:return this.popState(),19;break;case 30:return de.yytext[0];case 31:return 20;case 32:return 21;case 33:return this.begin("style"),44;break;case 34:return this.popState(),10;break;case 35:break;case 36:return 13;case 37:return 42;case 38:return 49;case 39:return this.begin("style"),37;break;case 40:return 43;case 41:return 63;case 42:return 65;case 43:return 65;case 44:return 65;case 45:return 63;case 46:return 63;case 47:return 64;case 48:return 64;case 49:return 64;case 50:return 64;case 51:return 64;case 52:return 65;case 53:return 64;case 54:return 65;case 55:return 66;case 56:return 66;case 57:return 66;case 58:return 66;case 59:return 63;case 60:return 64;case 61:return 65;case 62:return 67;case 63:return 68;case 64:return 69;case 65:return 69;case 66:return 68;case 67:return 68;case 68:return 68;case 69:return 41;case 70:return 47;case 71:return 40;case 72:return 48;case 73:return de.yytext[0];case 74:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:([^\s]*)[~].*[~]([^\s]*))/i,/^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:style\b)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\s*u\b)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:;)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:[0-9])/i,/^(?:.)/i,/^(?:$)/i],conditions:{style:{rules:[34,35,36,37,38,69,70],inclusive:!1},acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[23,24,25,26,27,28,29,30],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,71,72,73,74],inclusive:!0}}};return K})();re.lexer=ee;function Z(){this.yy={}}return o(Z,"Parser"),Z.prototype=re,re.Parser=Z,new Z})();UI.parser=UI;Tfe=UI});var _E,kfe=N(()=>{"use strict";pt();Xt();ci();tr();_E=class{constructor(){this.entities=new Map;this.relationships=[];this.classes=new Map;this.direction="TB";this.Cardinality={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"};this.Identification={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"};this.setAccTitle=Rr;this.getAccTitle=Mr;this.setAccDescription=Ir;this.getAccDescription=Or;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getConfig=o(()=>ge().er,"getConfig");this.clear(),this.addEntity=this.addEntity.bind(this),this.addAttributes=this.addAttributes.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setDirection=this.setDirection.bind(this),this.addCssStyles=this.addCssStyles.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"ErDB")}addEntity(e,r=""){return this.entities.has(e)?!this.entities.get(e)?.alias&&r&&(this.entities.get(e).alias=r,X.info(`Add alias '${r}' to entity '${e}'`)):(this.entities.set(e,{id:`entity-${e}-${this.entities.size}`,label:e,attributes:[],alias:r,shape:"erBox",look:ge().look??"default",cssClasses:"default",cssStyles:[]}),X.info("Added new entity :",e)),this.entities.get(e)}getEntity(e){return this.entities.get(e)}getEntities(){return this.entities}getClasses(){return this.classes}addAttributes(e,r){let n=this.addEntity(e),i;for(i=r.length-1;i>=0;i--)r[i].keys||(r[i].keys=[]),r[i].comment||(r[i].comment=""),n.attributes.push(r[i]),X.debug("Added attribute ",r[i].name)}addRelationship(e,r,n,i){let a=this.entities.get(e),s=this.entities.get(n);if(!a||!s)return;let l={entityA:a.id,roleA:r,entityB:s.id,relSpec:i};this.relationships.push(l),X.debug("Added new relationship :",l)}getRelationships(){return this.relationships}getDirection(){return this.direction}setDirection(e){this.direction=e}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}addCssStyles(e,r){for(let n of e){let i=this.entities.get(n);if(!r||!i)return;for(let a of r)i.cssStyles.push(a)}}addClass(e,r){e.forEach(n=>{let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)})})}setClass(e,r){for(let n of e){let i=this.entities.get(n);if(i)for(let a of r)i.cssClasses+=" "+a}}clear(){this.entities=new Map,this.classes=new Map,this.relationships=[],Sr()}getData(){let e=[],r=[],n=ge();for(let a of this.entities.keys()){let s=this.entities.get(a);s&&(s.cssCompiledStyles=this.getCompiledStyles(s.cssClasses.split(" ")),e.push(s))}let i=0;for(let a of this.relationships){let s={id:xc(a.entityA,a.entityB,{prefix:"id",counter:i++}),type:"normal",curve:"basis",start:a.entityA,end:a.entityB,label:a.roleA,labelpos:"c",thickness:"normal",classes:"relationshipLine",arrowTypeStart:a.relSpec.cardB.toLowerCase(),arrowTypeEnd:a.relSpec.cardA.toLowerCase(),pattern:a.relSpec.relType=="IDENTIFYING"?"solid":"dashed",look:n.look};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:"TB"}}}});var HI={};dr(HI,{draw:()=>lWe});var lWe,Efe=N(()=>{"use strict";Xt();pt();ep();Nf();Mf();tr();yr();lWe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing er diagram (unified)",e);let{securityLevel:i,er:a,layout:s}=ge(),l=n.db.getData(),u=Vo(e,i);l.type=n.type,l.layoutAlgorithm=$c(s),l.config.flowchart.nodeSpacing=a?.nodeSpacing||140,l.config.flowchart.rankSpacing=a?.rankSpacing||80,l.direction=n.db.getDirection(),l.markers=["only_one","zero_or_one","one_or_more","zero_or_more"],l.diagramId=e,await Qo(l,u),l.layoutAlgorithm==="elk"&&u.select(".edges").lower();let h=u.selectAll('[id*="-background"]');Array.from(h).length>0&&h.each(function(){let d=qe(this),m=d.attr("id").replace("-background",""),g=u.select(`#${CSS.escape(m)}`);if(!g.empty()){let y=g.attr("transform");d.attr("transform",y)}});let f=8;qt.insertTitle(u,"erDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ws(u,f,"erDiagram",a?.useMaxWidth??!0)},"draw")});var cWe,uWe,Sfe,Cfe=N(()=>{"use strict";eo();cWe=o((t,e)=>{let r=ld,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Ka(n,i,a,e)},"fade"),uWe=o(t=>` + .entityBox { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + } + + .relationshipLabelBox { + fill: ${t.tertiaryColor}; + opacity: 0.7; + background-color: ${t.tertiaryColor}; + rect { + opacity: 0.5; + } + } + + .labelBkg { + background-color: ${cWe(t.tertiaryColor,.5)}; + } + + .edgeLabel .label { + fill: ${t.nodeBorder}; + font-size: 14px; + } + + .label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + + .edge-pattern-dashed { + stroke-dasharray: 8,8; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon + { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + .relationshipLine { + stroke: ${t.lineColor}; + stroke-width: 1; + fill: none; + } + + .marker { + fill: none !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; + } +`,"getStyles"),Sfe=uWe});var Afe={};dr(Afe,{diagram:()=>hWe});var hWe,_fe=N(()=>{"use strict";wfe();kfe();Efe();Cfe();hWe={parser:Tfe,get db(){return new _E},renderer:HI,styles:Sfe}});function li(t){return typeof t=="object"&&t!==null&&typeof t.$type=="string"}function Ta(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"}function qI(t){return typeof t=="object"&&t!==null&&typeof t.name=="string"&&typeof t.type=="string"&&typeof t.path=="string"}function _p(t){return typeof t=="object"&&t!==null&&li(t.container)&&Ta(t.reference)&&typeof t.message=="string"}function Ol(t){return typeof t=="object"&&t!==null&&Array.isArray(t.content)}function If(t){return typeof t=="object"&&t!==null&&typeof t.tokenType=="object"}function Lx(t){return Ol(t)&&typeof t.fullText=="string"}var Ap,Pl=N(()=>{"use strict";o(li,"isAstNode");o(Ta,"isReference");o(qI,"isAstNodeDescription");o(_p,"isLinkingError");Ap=class{static{o(this,"AbstractAstReflection")}constructor(){this.subtypes={},this.allSubtypes={}}isInstance(e,r){return li(e)&&this.isSubtype(e.$type,r)}isSubtype(e,r){if(e===r)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[r];if(i!==void 0)return i;{let a=this.computeIsSubtype(e,r);return n[r]=a,a}}getAllSubTypes(e){let r=this.allSubtypes[e];if(r)return r;{let n=this.getAllTypes(),i=[];for(let a of n)this.isSubtype(a,e)&&i.push(a);return this.allSubtypes[e]=i,i}}};o(Ol,"isCompositeCstNode");o(If,"isLeafCstNode");o(Lx,"isRootCstNode")});function mWe(t){return typeof t=="string"?t:typeof t>"u"?"undefined":typeof t.toString=="function"?t.toString():Object.prototype.toString.call(t)}function DE(t){return!!t&&typeof t[Symbol.iterator]=="function"}function an(...t){if(t.length===1){let e=t[0];if(e instanceof po)return e;if(DE(e))return new po(()=>e[Symbol.iterator](),r=>r.next());if(typeof e.length=="number")return new po(()=>({index:0}),r=>r.index1?new po(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let r=e.iterator.next();if(!r.done)return r;e.iterator=void 0}if(e.array){if(e.arrIndex{"use strict";po=class t{static{o(this,"StreamImpl")}constructor(e,r){this.startFn=e,this.nextFn=r}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),r=0,n=e.next();for(;!n.done;)r++,n=e.next();return r}toArray(){let e=[],r=this.iterator(),n;do n=r.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,r){let n=this.map(i=>[e?e(i):i,r?r(i):i]);return new Map(n)}toString(){return this.join()}concat(e){return new t(()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()}),r=>{let n;if(!r.firstDone){do if(n=this.nextFn(r.first),!n.done)return n;while(!n.done);r.firstDone=!0}do if(n=r.iterator.next(),!n.done)return n;while(!n.done);return za})}join(e=","){let r=this.iterator(),n="",i,a=!1;do i=r.next(),i.done||(a&&(n+=e),n+=mWe(i.value)),a=!0;while(!i.done);return n}indexOf(e,r=0){let n=this.iterator(),i=0,a=n.next();for(;!a.done;){if(i>=r&&a.value===e)return i;a=n.next(),i++}return-1}every(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(!e(n.value))return!1;n=r.next()}return!0}some(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return!0;n=r.next()}return!1}forEach(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;)e(i.value,n),i=r.next(),n++}map(e){return new t(this.startFn,r=>{let{done:n,value:i}=this.nextFn(r);return n?za:{done:!1,value:e(i)}})}filter(e){return new t(this.startFn,r=>{let n;do if(n=this.nextFn(r),!n.done&&e(n.value))return n;while(!n.done);return za})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,r){let n=this.iterator(),i=r,a=n.next();for(;!a.done;)i===void 0?i=a.value:i=e(i,a.value),a=n.next();return i}reduceRight(e,r){return this.recursiveReduce(this.iterator(),e,r)}recursiveReduce(e,r,n){let i=e.next();if(i.done)return n;let a=this.recursiveReduce(e,r,n);return a===void 0?i.value:r(a,i.value)}find(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return n.value;n=r.next()}}findIndex(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;){if(e(i.value))return n;i=r.next(),n++}return-1}includes(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(n.value===e)return!0;n=r.next()}return!1}flatMap(e){return new t(()=>({this:this.startFn()}),r=>{do{if(r.iterator){let a=r.iterator.next();if(a.done)r.iterator=void 0;else return a}let{done:n,value:i}=this.nextFn(r.this);if(!n){let a=e(i);if(DE(a))r.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}}while(r.iterator);return za})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let r=e>1?this.flat(e-1):this;return new t(()=>({this:r.startFn()}),n=>{do{if(n.iterator){let s=n.iterator.next();if(s.done)n.iterator=void 0;else return s}let{done:i,value:a}=r.nextFn(n.this);if(!i)if(DE(a))n.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}while(n.iterator);return za})}head(){let r=this.iterator().next();if(!r.done)return r.value}tail(e=1){return new t(()=>{let r=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),r=>(r.size++,r.size>e?za:this.nextFn(r.state)))}distinct(e){return new t(()=>({set:new Set,internalState:this.startFn()}),r=>{let n;do if(n=this.nextFn(r.internalState),!n.done){let i=e?e(n.value):n.value;if(!r.set.has(i))return r.set.add(i),n}while(!n.done);return za})}exclude(e,r){let n=new Set;for(let i of e){let a=r?r(i):i;n.add(a)}return this.filter(i=>{let a=r?r(i):i;return!n.has(a)})}};o(mWe,"toString");o(DE,"isIterable");Rx=new po(()=>{},()=>za),za=Object.freeze({done:!0,value:void 0});o(an,"stream");Gc=class extends po{static{o(this,"TreeStreamImpl")}constructor(e,r,n){super(()=>({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[r(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let s=i.iterators[i.iterators.length-1].next();if(s.done)i.iterators.pop();else return i.iterators.push(r(s.value)[Symbol.iterator]()),s}return za})}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),prune:o(()=>{e.state.pruned=!0},"prune"),[Symbol.iterator]:()=>e};return e}};(function(t){function e(a){return a.reduce((s,l)=>s+l,0)}o(e,"sum"),t.sum=e;function r(a){return a.reduce((s,l)=>s*l,0)}o(r,"product"),t.product=r;function n(a){return a.reduce((s,l)=>Math.min(s,l))}o(n,"min"),t.min=n;function i(a){return a.reduce((s,l)=>Math.max(s,l))}o(i,"max"),t.max=i})(vg||(vg={}))});var RE={};dr(RE,{DefaultNameRegexp:()=>LE,RangeComparison:()=>Vc,compareRange:()=>Rfe,findCommentNode:()=>jI,findDeclarationNodeAtOffset:()=>yWe,findLeafNodeAtOffset:()=>KI,findLeafNodeBeforeOffset:()=>Nfe,flattenCst:()=>gWe,getInteriorNodes:()=>bWe,getNextNode:()=>vWe,getPreviousNode:()=>Ife,getStartlineNode:()=>xWe,inRange:()=>XI,isChildNode:()=>YI,isCommentNode:()=>WI,streamCst:()=>Dp,toDocumentSegment:()=>Lp,tokenToRange:()=>xg});function Dp(t){return new Gc(t,e=>Ol(e)?e.content:[],{includeRoot:!0})}function gWe(t){return Dp(t).filter(If)}function YI(t,e){for(;t.container;)if(t=t.container,t===e)return!0;return!1}function xg(t){return{start:{character:t.startColumn-1,line:t.startLine-1},end:{character:t.endColumn,line:t.endLine-1}}}function Lp(t){if(!t)return;let{offset:e,end:r,range:n}=t;return{range:n,offset:e,end:r,length:r-e}}function Rfe(t,e){if(t.end.linee.end.line||t.start.line===e.end.line&&t.start.character>=e.end.character)return Vc.After;let r=t.start.line>e.start.line||t.start.line===e.start.line&&t.start.character>=e.start.character,n=t.end.lineVc.After}function yWe(t,e,r=LE){if(t){if(e>0){let n=e-t.offset,i=t.text.charAt(n);r.test(i)||e--}return KI(t,e)}}function jI(t,e){if(t){let r=Ife(t,!0);if(r&&WI(r,e))return r;if(Lx(t)){let n=t.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let a=t.content[i];if(WI(a,e))return a}}}}function WI(t,e){return If(t)&&e.includes(t.tokenType.name)}function KI(t,e){if(If(t))return t;if(Ol(t)){let r=Mfe(t,e,!1);if(r)return KI(r,e)}}function Nfe(t,e){if(If(t))return t;if(Ol(t)){let r=Mfe(t,e,!0);if(r)return Nfe(r,e)}}function Mfe(t,e,r){let n=0,i=t.content.length-1,a;for(;n<=i;){let s=Math.floor((n+i)/2),l=t.content[s];if(l.offset<=e&&l.end>e)return l;l.end<=e?(a=r?l:void 0,n=s+1):i=s-1}return a}function Ife(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t);for(;n>0;){n--;let i=r.content[n];if(e||!i.hidden)return i}t=r}}function vWe(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t),i=r.content.length-1;for(;n{"use strict";Pl();Ys();o(Dp,"streamCst");o(gWe,"flattenCst");o(YI,"isChildNode");o(xg,"tokenToRange");o(Lp,"toDocumentSegment");(function(t){t[t.Before=0]="Before",t[t.After=1]="After",t[t.OverlapFront=2]="OverlapFront",t[t.OverlapBack=3]="OverlapBack",t[t.Inside=4]="Inside",t[t.Outside=5]="Outside"})(Vc||(Vc={}));o(Rfe,"compareRange");o(XI,"inRange");LE=/^[\w\p{L}]$/u;o(yWe,"findDeclarationNodeAtOffset");o(jI,"findCommentNode");o(WI,"isCommentNode");o(KI,"findLeafNodeAtOffset");o(Nfe,"findLeafNodeBeforeOffset");o(Mfe,"binarySearch");o(Ife,"getPreviousNode");o(vWe,"getNextNode");o(xWe,"getStartlineNode");o(bWe,"getInteriorNodes");o(TWe,"getCommonParent");o(Lfe,"getParentChain")});function Uc(t){throw new Error("Error! The input value was not handled.")}var Rp,NE=N(()=>{"use strict";Rp=class extends Error{static{o(this,"ErrorWithLocation")}constructor(e,r){super(e?`${r} at ${e.range.start.line}:${e.range.start.character}`:r)}};o(Uc,"assertUnreachable")});var zx={};dr(zx,{AbstractElement:()=>wg,AbstractRule:()=>bg,AbstractType:()=>Tg,Action:()=>Gg,Alternatives:()=>Vg,ArrayLiteral:()=>kg,ArrayType:()=>Eg,Assignment:()=>Ug,BooleanLiteral:()=>Sg,CharacterRange:()=>Hg,Condition:()=>Nx,Conjunction:()=>Cg,CrossReference:()=>qg,Disjunction:()=>Ag,EndOfFile:()=>Wg,Grammar:()=>_g,GrammarImport:()=>Ix,Group:()=>Yg,InferredType:()=>Dg,Interface:()=>Lg,Keyword:()=>Xg,LangiumGrammarAstReflection:()=>i1,LangiumGrammarTerminals:()=>wWe,NamedArgument:()=>Ox,NegatedToken:()=>jg,Negation:()=>Rg,NumberLiteral:()=>Ng,Parameter:()=>Mg,ParameterReference:()=>Ig,ParserRule:()=>Og,ReferenceType:()=>Pg,RegexToken:()=>Kg,ReturnType:()=>Px,RuleCall:()=>Qg,SimpleType:()=>Bg,StringLiteral:()=>Fg,TerminalAlternatives:()=>Zg,TerminalGroup:()=>Jg,TerminalRule:()=>Np,TerminalRuleCall:()=>e1,Type:()=>$g,TypeAttribute:()=>Bx,TypeDefinition:()=>ME,UnionType:()=>zg,UnorderedGroup:()=>t1,UntilToken:()=>r1,ValueLiteral:()=>Mx,Wildcard:()=>n1,isAbstractElement:()=>Fx,isAbstractRule:()=>kWe,isAbstractType:()=>EWe,isAction:()=>qu,isAlternatives:()=>BE,isArrayLiteral:()=>DWe,isArrayType:()=>QI,isAssignment:()=>Fl,isBooleanLiteral:()=>ZI,isCharacterRange:()=>sO,isCondition:()=>SWe,isConjunction:()=>JI,isCrossReference:()=>Mp,isDisjunction:()=>eO,isEndOfFile:()=>oO,isFeatureName:()=>CWe,isGrammar:()=>LWe,isGrammarImport:()=>RWe,isGroup:()=>Of,isInferredType:()=>IE,isInterface:()=>OE,isKeyword:()=>Zo,isNamedArgument:()=>NWe,isNegatedToken:()=>lO,isNegation:()=>tO,isNumberLiteral:()=>MWe,isParameter:()=>IWe,isParameterReference:()=>rO,isParserRule:()=>Ga,isPrimitiveType:()=>Ofe,isReferenceType:()=>nO,isRegexToken:()=>cO,isReturnType:()=>iO,isRuleCall:()=>$l,isSimpleType:()=>PE,isStringLiteral:()=>OWe,isTerminalAlternatives:()=>uO,isTerminalGroup:()=>hO,isTerminalRule:()=>mo,isTerminalRuleCall:()=>FE,isType:()=>$x,isTypeAttribute:()=>PWe,isTypeDefinition:()=>AWe,isUnionType:()=>aO,isUnorderedGroup:()=>$E,isUntilToken:()=>fO,isValueLiteral:()=>_We,isWildcard:()=>dO,reflection:()=>pr});function kWe(t){return pr.isInstance(t,bg)}function EWe(t){return pr.isInstance(t,Tg)}function SWe(t){return pr.isInstance(t,Nx)}function CWe(t){return Ofe(t)||t==="current"||t==="entry"||t==="extends"||t==="false"||t==="fragment"||t==="grammar"||t==="hidden"||t==="import"||t==="interface"||t==="returns"||t==="terminal"||t==="true"||t==="type"||t==="infer"||t==="infers"||t==="with"||typeof t=="string"&&/\^?[_a-zA-Z][\w_]*/.test(t)}function Ofe(t){return t==="string"||t==="number"||t==="boolean"||t==="Date"||t==="bigint"}function AWe(t){return pr.isInstance(t,ME)}function _We(t){return pr.isInstance(t,Mx)}function Fx(t){return pr.isInstance(t,wg)}function DWe(t){return pr.isInstance(t,kg)}function QI(t){return pr.isInstance(t,Eg)}function ZI(t){return pr.isInstance(t,Sg)}function JI(t){return pr.isInstance(t,Cg)}function eO(t){return pr.isInstance(t,Ag)}function LWe(t){return pr.isInstance(t,_g)}function RWe(t){return pr.isInstance(t,Ix)}function IE(t){return pr.isInstance(t,Dg)}function OE(t){return pr.isInstance(t,Lg)}function NWe(t){return pr.isInstance(t,Ox)}function tO(t){return pr.isInstance(t,Rg)}function MWe(t){return pr.isInstance(t,Ng)}function IWe(t){return pr.isInstance(t,Mg)}function rO(t){return pr.isInstance(t,Ig)}function Ga(t){return pr.isInstance(t,Og)}function nO(t){return pr.isInstance(t,Pg)}function iO(t){return pr.isInstance(t,Px)}function PE(t){return pr.isInstance(t,Bg)}function OWe(t){return pr.isInstance(t,Fg)}function mo(t){return pr.isInstance(t,Np)}function $x(t){return pr.isInstance(t,$g)}function PWe(t){return pr.isInstance(t,Bx)}function aO(t){return pr.isInstance(t,zg)}function qu(t){return pr.isInstance(t,Gg)}function BE(t){return pr.isInstance(t,Vg)}function Fl(t){return pr.isInstance(t,Ug)}function sO(t){return pr.isInstance(t,Hg)}function Mp(t){return pr.isInstance(t,qg)}function oO(t){return pr.isInstance(t,Wg)}function Of(t){return pr.isInstance(t,Yg)}function Zo(t){return pr.isInstance(t,Xg)}function lO(t){return pr.isInstance(t,jg)}function cO(t){return pr.isInstance(t,Kg)}function $l(t){return pr.isInstance(t,Qg)}function uO(t){return pr.isInstance(t,Zg)}function hO(t){return pr.isInstance(t,Jg)}function FE(t){return pr.isInstance(t,e1)}function $E(t){return pr.isInstance(t,t1)}function fO(t){return pr.isInstance(t,r1)}function dO(t){return pr.isInstance(t,n1)}var wWe,bg,Tg,Nx,ME,Mx,wg,kg,Eg,Sg,Cg,Ag,_g,Ix,Dg,Lg,Ox,Rg,Ng,Mg,Ig,Og,Pg,Px,Bg,Fg,Np,$g,Bx,zg,Gg,Vg,Ug,Hg,qg,Wg,Yg,Xg,jg,Kg,Qg,Zg,Jg,e1,t1,r1,n1,i1,pr,Hc=N(()=>{"use strict";Pl();wWe={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},bg="AbstractRule";o(kWe,"isAbstractRule");Tg="AbstractType";o(EWe,"isAbstractType");Nx="Condition";o(SWe,"isCondition");o(CWe,"isFeatureName");o(Ofe,"isPrimitiveType");ME="TypeDefinition";o(AWe,"isTypeDefinition");Mx="ValueLiteral";o(_We,"isValueLiteral");wg="AbstractElement";o(Fx,"isAbstractElement");kg="ArrayLiteral";o(DWe,"isArrayLiteral");Eg="ArrayType";o(QI,"isArrayType");Sg="BooleanLiteral";o(ZI,"isBooleanLiteral");Cg="Conjunction";o(JI,"isConjunction");Ag="Disjunction";o(eO,"isDisjunction");_g="Grammar";o(LWe,"isGrammar");Ix="GrammarImport";o(RWe,"isGrammarImport");Dg="InferredType";o(IE,"isInferredType");Lg="Interface";o(OE,"isInterface");Ox="NamedArgument";o(NWe,"isNamedArgument");Rg="Negation";o(tO,"isNegation");Ng="NumberLiteral";o(MWe,"isNumberLiteral");Mg="Parameter";o(IWe,"isParameter");Ig="ParameterReference";o(rO,"isParameterReference");Og="ParserRule";o(Ga,"isParserRule");Pg="ReferenceType";o(nO,"isReferenceType");Px="ReturnType";o(iO,"isReturnType");Bg="SimpleType";o(PE,"isSimpleType");Fg="StringLiteral";o(OWe,"isStringLiteral");Np="TerminalRule";o(mo,"isTerminalRule");$g="Type";o($x,"isType");Bx="TypeAttribute";o(PWe,"isTypeAttribute");zg="UnionType";o(aO,"isUnionType");Gg="Action";o(qu,"isAction");Vg="Alternatives";o(BE,"isAlternatives");Ug="Assignment";o(Fl,"isAssignment");Hg="CharacterRange";o(sO,"isCharacterRange");qg="CrossReference";o(Mp,"isCrossReference");Wg="EndOfFile";o(oO,"isEndOfFile");Yg="Group";o(Of,"isGroup");Xg="Keyword";o(Zo,"isKeyword");jg="NegatedToken";o(lO,"isNegatedToken");Kg="RegexToken";o(cO,"isRegexToken");Qg="RuleCall";o($l,"isRuleCall");Zg="TerminalAlternatives";o(uO,"isTerminalAlternatives");Jg="TerminalGroup";o(hO,"isTerminalGroup");e1="TerminalRuleCall";o(FE,"isTerminalRuleCall");t1="UnorderedGroup";o($E,"isUnorderedGroup");r1="UntilToken";o(fO,"isUntilToken");n1="Wildcard";o(dO,"isWildcard");i1=class extends Ap{static{o(this,"LangiumGrammarAstReflection")}getAllTypes(){return[wg,bg,Tg,Gg,Vg,kg,Eg,Ug,Sg,Hg,Nx,Cg,qg,Ag,Wg,_g,Ix,Yg,Dg,Lg,Xg,Ox,jg,Rg,Ng,Mg,Ig,Og,Pg,Kg,Px,Qg,Bg,Fg,Zg,Jg,Np,e1,$g,Bx,ME,zg,t1,r1,Mx,n1]}computeIsSubtype(e,r){switch(e){case Gg:case Vg:case Ug:case Hg:case qg:case Wg:case Yg:case Xg:case jg:case Kg:case Qg:case Zg:case Jg:case e1:case t1:case r1:case n1:return this.isSubtype(wg,r);case kg:case Ng:case Fg:return this.isSubtype(Mx,r);case Eg:case Pg:case Bg:case zg:return this.isSubtype(ME,r);case Sg:return this.isSubtype(Nx,r)||this.isSubtype(Mx,r);case Cg:case Ag:case Rg:case Ig:return this.isSubtype(Nx,r);case Dg:case Lg:case $g:return this.isSubtype(Tg,r);case Og:return this.isSubtype(bg,r)||this.isSubtype(Tg,r);case Np:return this.isSubtype(bg,r);default:return!1}}getReferenceType(e){let r=`${e.container.$type}:${e.property}`;switch(r){case"Action:type":case"CrossReference:type":case"Interface:superTypes":case"ParserRule:returnType":case"SimpleType:typeRef":return Tg;case"Grammar:hiddenTokens":case"ParserRule:hiddenTokens":case"RuleCall:rule":return bg;case"Grammar:usedGrammars":return _g;case"NamedArgument:parameter":case"ParameterReference:parameter":return Mg;case"TerminalRuleCall:rule":return Np;default:throw new Error(`${r} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case wg:return{name:wg,properties:[{name:"cardinality"},{name:"lookahead"}]};case kg:return{name:kg,properties:[{name:"elements",defaultValue:[]}]};case Eg:return{name:Eg,properties:[{name:"elementType"}]};case Sg:return{name:Sg,properties:[{name:"true",defaultValue:!1}]};case Cg:return{name:Cg,properties:[{name:"left"},{name:"right"}]};case Ag:return{name:Ag,properties:[{name:"left"},{name:"right"}]};case _g:return{name:_g,properties:[{name:"definesHiddenTokens",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"imports",defaultValue:[]},{name:"interfaces",defaultValue:[]},{name:"isDeclared",defaultValue:!1},{name:"name"},{name:"rules",defaultValue:[]},{name:"types",defaultValue:[]},{name:"usedGrammars",defaultValue:[]}]};case Ix:return{name:Ix,properties:[{name:"path"}]};case Dg:return{name:Dg,properties:[{name:"name"}]};case Lg:return{name:Lg,properties:[{name:"attributes",defaultValue:[]},{name:"name"},{name:"superTypes",defaultValue:[]}]};case Ox:return{name:Ox,properties:[{name:"calledByName",defaultValue:!1},{name:"parameter"},{name:"value"}]};case Rg:return{name:Rg,properties:[{name:"value"}]};case Ng:return{name:Ng,properties:[{name:"value"}]};case Mg:return{name:Mg,properties:[{name:"name"}]};case Ig:return{name:Ig,properties:[{name:"parameter"}]};case Og:return{name:Og,properties:[{name:"dataType"},{name:"definesHiddenTokens",defaultValue:!1},{name:"definition"},{name:"entry",defaultValue:!1},{name:"fragment",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"inferredType"},{name:"name"},{name:"parameters",defaultValue:[]},{name:"returnType"},{name:"wildcard",defaultValue:!1}]};case Pg:return{name:Pg,properties:[{name:"referenceType"}]};case Px:return{name:Px,properties:[{name:"name"}]};case Bg:return{name:Bg,properties:[{name:"primitiveType"},{name:"stringType"},{name:"typeRef"}]};case Fg:return{name:Fg,properties:[{name:"value"}]};case Np:return{name:Np,properties:[{name:"definition"},{name:"fragment",defaultValue:!1},{name:"hidden",defaultValue:!1},{name:"name"},{name:"type"}]};case $g:return{name:$g,properties:[{name:"name"},{name:"type"}]};case Bx:return{name:Bx,properties:[{name:"defaultValue"},{name:"isOptional",defaultValue:!1},{name:"name"},{name:"type"}]};case zg:return{name:zg,properties:[{name:"types",defaultValue:[]}]};case Gg:return{name:Gg,properties:[{name:"cardinality"},{name:"feature"},{name:"inferredType"},{name:"lookahead"},{name:"operator"},{name:"type"}]};case Vg:return{name:Vg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Ug:return{name:Ug,properties:[{name:"cardinality"},{name:"feature"},{name:"lookahead"},{name:"operator"},{name:"terminal"}]};case Hg:return{name:Hg,properties:[{name:"cardinality"},{name:"left"},{name:"lookahead"},{name:"right"}]};case qg:return{name:qg,properties:[{name:"cardinality"},{name:"deprecatedSyntax",defaultValue:!1},{name:"lookahead"},{name:"terminal"},{name:"type"}]};case Wg:return{name:Wg,properties:[{name:"cardinality"},{name:"lookahead"}]};case Yg:return{name:Yg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"guardCondition"},{name:"lookahead"}]};case Xg:return{name:Xg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"value"}]};case jg:return{name:jg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case Kg:return{name:Kg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"regex"}]};case Qg:return{name:Qg,properties:[{name:"arguments",defaultValue:[]},{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case Zg:return{name:Zg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Jg:return{name:Jg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case e1:return{name:e1,properties:[{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case t1:return{name:t1,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case r1:return{name:r1,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case n1:return{name:n1,properties:[{name:"cardinality"},{name:"lookahead"}]};default:return{name:e,properties:[]}}}},pr=new i1});var GE={};dr(GE,{assignMandatoryProperties:()=>gO,copyAstNode:()=>mO,findLocalReferences:()=>FWe,findRootNode:()=>Gx,getContainerOfType:()=>Ip,getDocument:()=>Va,hasContainerOfType:()=>BWe,linkContentToContainer:()=>zE,streamAllContents:()=>qc,streamAst:()=>Jo,streamContents:()=>Vx,streamReferences:()=>a1});function zE(t){for(let[e,r]of Object.entries(t))e.startsWith("$")||(Array.isArray(r)?r.forEach((n,i)=>{li(n)&&(n.$container=t,n.$containerProperty=e,n.$containerIndex=i)}):li(r)&&(r.$container=t,r.$containerProperty=e))}function Ip(t,e){let r=t;for(;r;){if(e(r))return r;r=r.$container}}function BWe(t,e){let r=t;for(;r;){if(e(r))return!0;r=r.$container}return!1}function Va(t){let r=Gx(t).$document;if(!r)throw new Error("AST node has no document.");return r}function Gx(t){for(;t.$container;)t=t.$container;return t}function Vx(t,e){if(!t)throw new Error("Node must be an AstNode.");let r=e?.range;return new po(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndexVx(r,e))}function Jo(t,e){if(t){if(e?.range&&!pO(t,e.range))return new Gc(t,()=>[])}else throw new Error("Root node must be an AstNode.");return new Gc(t,r=>Vx(r,e),{includeRoot:!0})}function pO(t,e){var r;if(!e)return!0;let n=(r=t.$cstNode)===null||r===void 0?void 0:r.range;return n?XI(n,e):!1}function a1(t){return new po(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndex{a1(n).forEach(i=>{i.reference.ref===t&&r.push(i.reference)})}),an(r)}function gO(t,e){let r=t.getTypeMetaData(e.$type),n=e;for(let i of r.properties)i.defaultValue!==void 0&&n[i.name]===void 0&&(n[i.name]=Pfe(i.defaultValue))}function Pfe(t){return Array.isArray(t)?[...t.map(Pfe)]:t}function mO(t,e){let r={$type:t.$type};for(let[n,i]of Object.entries(t))if(!n.startsWith("$"))if(li(i))r[n]=mO(i,e);else if(Ta(i))r[n]=e(r,n,i.$refNode,i.$refText);else if(Array.isArray(i)){let a=[];for(let s of i)li(s)?a.push(mO(s,e)):Ta(s)?a.push(e(r,n,s.$refNode,s.$refText)):a.push(s);r[n]=a}else r[n]=i;return zE(r),r}var hs=N(()=>{"use strict";Pl();Ys();Bl();o(zE,"linkContentToContainer");o(Ip,"getContainerOfType");o(BWe,"hasContainerOfType");o(Va,"getDocument");o(Gx,"findRootNode");o(Vx,"streamContents");o(qc,"streamAllContents");o(Jo,"streamAst");o(pO,"isAstNodeInRange");o(a1,"streamReferences");o(FWe,"findLocalReferences");o(gO,"assignMandatoryProperties");o(Pfe,"copyDefaultValue");o(mO,"copyAstNode")});function lr(t){return t.charCodeAt(0)}function VE(t,e){Array.isArray(t)?t.forEach(function(r){e.push(r)}):e.push(t)}function s1(t,e){if(t[e]===!0)throw"duplicate flag "+e;let r=t[e];t[e]=!0}function Op(t){if(t===void 0)throw Error("Internal Error - Should never get here!");return!0}function Ux(){throw Error("Internal Error - Should never get here!")}function yO(t){return t.type==="Character"}var vO=N(()=>{"use strict";o(lr,"cc");o(VE,"insertToSet");o(s1,"addFlag");o(Op,"ASSERT_EXISTS");o(Ux,"ASSERT_NEVER_REACH_HERE");o(yO,"isCharacter")});var Hx,qx,xO,Bfe=N(()=>{"use strict";vO();Hx=[];for(let t=lr("0");t<=lr("9");t++)Hx.push(t);qx=[lr("_")].concat(Hx);for(let t=lr("a");t<=lr("z");t++)qx.push(t);for(let t=lr("A");t<=lr("Z");t++)qx.push(t);xO=[lr(" "),lr("\f"),lr(` +`),lr("\r"),lr(" "),lr("\v"),lr(" "),lr("\xA0"),lr("\u1680"),lr("\u2000"),lr("\u2001"),lr("\u2002"),lr("\u2003"),lr("\u2004"),lr("\u2005"),lr("\u2006"),lr("\u2007"),lr("\u2008"),lr("\u2009"),lr("\u200A"),lr("\u2028"),lr("\u2029"),lr("\u202F"),lr("\u205F"),lr("\u3000"),lr("\uFEFF")]});var $We,UE,zWe,Pp,Ffe=N(()=>{"use strict";vO();Bfe();$We=/[0-9a-fA-F]/,UE=/[0-9]/,zWe=/[1-9]/,Pp=class{static{o(this,"RegExpParser")}constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let r=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":s1(n,"global");break;case"i":s1(n,"ignoreCase");break;case"m":s1(n,"multiLine");break;case"u":s1(n,"unicode");break;case"y":s1(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:r,loc:this.loc(0)}}disjunction(){let e=[],r=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(r)}}alternative(){let e=[],r=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(r)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let r;switch(this.popChar()){case"=":r="Lookahead";break;case"!":r="NegativeLookahead";break}Op(r);let n=this.disjunction();return this.consumeChar(")"),{type:r,value:n,loc:this.loc(e)}}return Ux()}quantifier(e=!1){let r,n=this.idx;switch(this.popChar()){case"*":r={atLeast:0,atMost:1/0};break;case"+":r={atLeast:1,atMost:1/0};break;case"?":r={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":r={atLeast:i,atMost:i};break;case",":let a;this.isDigit()?(a=this.integerIncludingZero(),r={atLeast:i,atMost:a}):r={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&r===void 0)return;Op(r);break}if(!(e===!0&&r===void 0)&&Op(r))return this.peekChar(0)==="?"?(this.consumeChar("?"),r.greedy=!1):r.greedy=!0,r.type="Quantifier",r.loc=this.loc(n),r}atom(){let e,r=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),Op(e)?(e.loc=this.loc(r),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):Ux()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[lr(` +`),lr("\r"),lr("\u2028"),lr("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,r=!1;switch(this.popChar()){case"d":e=Hx;break;case"D":e=Hx,r=!0;break;case"s":e=xO;break;case"S":e=xO,r=!0;break;case"w":e=qx;break;case"W":e=qx,r=!0;break}return Op(e)?{type:"Set",value:e,complement:r}:Ux()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=lr("\f");break;case"n":e=lr(` +`);break;case"r":e=lr("\r");break;case"t":e=lr(" ");break;case"v":e=lr("\v");break}return Op(e)?{type:"Character",value:e}:Ux()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:lr("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:lr(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:lr(e)}}}characterClass(){let e=[],r=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),r=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(yO(n)&&this.isRangeDash()){this.consumeChar("-");let a=this.classAtom(),s=a.type==="Character";if(yO(a)){if(a.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}}});var Wc,$fe=N(()=>{"use strict";Wc=class{static{o(this,"BaseRegExpVisitor")}visitChildren(e){for(let r in e){let n=e[r];e.hasOwnProperty(r)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}}});var Wx=N(()=>{"use strict";Ffe();$fe()});var HE={};dr(HE,{NEWLINE_REGEXP:()=>TO,escapeRegExp:()=>Fp,getCaseInsensitivePattern:()=>kO,getTerminalParts:()=>GWe,isMultilineComment:()=>wO,isWhitespace:()=>o1,partialMatches:()=>EO,partialRegExp:()=>Vfe,whitespaceCharacters:()=>Gfe});function GWe(t){try{typeof t!="string"&&(t=t.source),t=`/${t}/`;let e=zfe.pattern(t),r=[];for(let n of e.value.value)Bp.reset(t),Bp.visit(n),r.push({start:Bp.startRegexp,end:Bp.endRegex});return r}catch{return[]}}function wO(t){try{return typeof t=="string"&&(t=new RegExp(t)),t=t.toString(),Bp.reset(t),Bp.visit(zfe.pattern(t)),Bp.multiline}catch{return!1}}function o1(t){let e=typeof t=="string"?new RegExp(t):t;return Gfe.some(r=>e.test(r))}function Fp(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kO(t){return Array.prototype.map.call(t,e=>/\w/.test(e)?`[${e.toLowerCase()}${e.toUpperCase()}]`:Fp(e)).join("")}function EO(t,e){let r=Vfe(t),n=e.match(r);return!!n&&n[0].length>0}function Vfe(t){typeof t=="string"&&(t=new RegExp(t));let e=t,r=t.source,n=0;function i(){let a="",s;function l(h){a+=r.substr(n,h),n+=h}o(l,"appendRaw");function u(h){a+="(?:"+r.substr(n,h)+"|$)",n+=h}for(o(u,"appendOptional");n",n)-n+1);break;default:u(2);break}break;case"[":s=/\[(?:\\.|.)*?\]/g,s.lastIndex=n,s=s.exec(r)||[],u(s[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":l(1);break;case"{":s=/\{\d+,?\d*\}/g,s.lastIndex=n,s=s.exec(r),s?l(s[0].length):u(1);break;case"(":if(r[n+1]==="?")switch(r[n+2]){case":":a+="(?:",n+=3,a+=i()+"|$)";break;case"=":a+="(?=",n+=3,a+=i()+")";break;case"!":s=n,n+=3,i(),a+=r.substr(s,n-s);break;case"<":switch(r[n+3]){case"=":case"!":s=n,n+=4,i(),a+=r.substr(s,n-s);break;default:l(r.indexOf(">",n)-n+1),a+=i()+"|$)";break}break}else l(1),a+=i()+"|$)";break;case")":return++n,a;default:u(1);break}return a}return o(i,"process"),new RegExp(i(),t.flags)}var TO,zfe,bO,Bp,Gfe,l1=N(()=>{"use strict";Wx();TO=/\r?\n/gm,zfe=new Pp,bO=class extends Wc{static{o(this,"TerminalRegExpVisitor")}constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let r=String.fromCharCode(e.value);if(!this.multiline&&r===` +`&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=Fp(r);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let r=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(r);this.multiline=!!` +`.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let r=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(r),this.isStarting&&(this.startRegexp+=r)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},Bp=new bO;o(GWe,"getTerminalParts");o(wO,"isMultilineComment");Gfe=`\f +\r \v \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF`.split("");o(o1,"isWhitespace");o(Fp,"escapeRegExp");o(kO,"getCaseInsensitivePattern");o(EO,"partialMatches");o(Vfe,"partialRegExp")});var WE={};dr(WE,{findAssignment:()=>MO,findNameAssignment:()=>qE,findNodeForKeyword:()=>RO,findNodeForProperty:()=>Xx,findNodesForKeyword:()=>VWe,findNodesForKeywordInternal:()=>NO,findNodesForProperty:()=>DO,getActionAtElement:()=>Yfe,getActionType:()=>jfe,getAllReachableRules:()=>Yx,getCrossReferenceTerminal:()=>AO,getEntryRule:()=>Ufe,getExplicitRuleType:()=>c1,getHiddenRules:()=>Hfe,getRuleType:()=>IO,getRuleTypeName:()=>YWe,getTypeName:()=>Kx,isArrayCardinality:()=>HWe,isArrayOperator:()=>qWe,isCommentTerminal:()=>_O,isDataType:()=>WWe,isDataTypeRule:()=>jx,isOptionalCardinality:()=>UWe,terminalRegex:()=>u1});function Ufe(t){return t.rules.find(e=>Ga(e)&&e.entry)}function Hfe(t){return t.rules.filter(e=>mo(e)&&e.hidden)}function Yx(t,e){let r=new Set,n=Ufe(t);if(!n)return new Set(t.rules);let i=[n].concat(Hfe(t));for(let s of i)qfe(s,r,e);let a=new Set;for(let s of t.rules)(r.has(s.name)||mo(s)&&s.hidden)&&a.add(s);return a}function qfe(t,e,r){e.add(t.name),qc(t).forEach(n=>{if($l(n)||r&&FE(n)){let i=n.rule.ref;i&&!e.has(i.name)&&qfe(i,e,r)}})}function AO(t){if(t.terminal)return t.terminal;if(t.type.ref){let e=qE(t.type.ref);return e?.terminal}}function _O(t){return t.hidden&&!o1(u1(t))}function DO(t,e){return!t||!e?[]:LO(t,e,t.astNode,!0)}function Xx(t,e,r){if(!t||!e)return;let n=LO(t,e,t.astNode,!0);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function LO(t,e,r,n){if(!n){let i=Ip(t.grammarSource,Fl);if(i&&i.feature===e)return[t]}return Ol(t)&&t.astNode===r?t.content.flatMap(i=>LO(i,e,r,!1)):[]}function VWe(t,e){return t?NO(t,e,t?.astNode):[]}function RO(t,e,r){if(!t)return;let n=NO(t,e,t?.astNode);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function NO(t,e,r){if(t.astNode!==r)return[];if(Zo(t.grammarSource)&&t.grammarSource.value===e)return[t];let n=Dp(t).iterator(),i,a=[];do if(i=n.next(),!i.done){let s=i.value;s.astNode===r?Zo(s.grammarSource)&&s.grammarSource.value===e&&a.push(s):n.prune()}while(!i.done);return a}function MO(t){var e;let r=t.astNode;for(;r===((e=t.container)===null||e===void 0?void 0:e.astNode);){let n=Ip(t.grammarSource,Fl);if(n)return n;t=t.container}}function qE(t){let e=t;return IE(e)&&(qu(e.$container)?e=e.$container.$container:Ga(e.$container)?e=e.$container:Uc(e.$container)),Wfe(t,e,new Map)}function Wfe(t,e,r){var n;function i(a,s){let l;return Ip(a,Fl)||(l=Wfe(s,s,r)),r.set(t,l),l}if(o(i,"go"),r.has(t))return r.get(t);r.set(t,void 0);for(let a of qc(e)){if(Fl(a)&&a.feature.toLowerCase()==="name")return r.set(t,a),a;if($l(a)&&Ga(a.rule.ref))return i(a,a.rule.ref);if(PE(a)&&(!((n=a.typeRef)===null||n===void 0)&&n.ref))return i(a,a.typeRef.ref)}}function Yfe(t){let e=t.$container;if(Of(e)){let r=e.elements,n=r.indexOf(t);for(let i=n-1;i>=0;i--){let a=r[i];if(qu(a))return a;{let s=qc(r[i]).find(qu);if(s)return s}}}if(Fx(e))return Yfe(e)}function UWe(t,e){return t==="?"||t==="*"||Of(e)&&!!e.guardCondition}function HWe(t){return t==="*"||t==="+"}function qWe(t){return t==="+="}function jx(t){return Xfe(t,new Set)}function Xfe(t,e){if(e.has(t))return!0;e.add(t);for(let r of qc(t))if($l(r)){if(!r.rule.ref||Ga(r.rule.ref)&&!Xfe(r.rule.ref,e))return!1}else{if(Fl(r))return!1;if(qu(r))return!1}return!!t.definition}function WWe(t){return CO(t.type,new Set)}function CO(t,e){if(e.has(t))return!0;if(e.add(t),QI(t))return!1;if(nO(t))return!1;if(aO(t))return t.types.every(r=>CO(r,e));if(PE(t)){if(t.primitiveType!==void 0)return!0;if(t.stringType!==void 0)return!0;if(t.typeRef!==void 0){let r=t.typeRef.ref;return $x(r)?CO(r.type,e):!1}else return!1}else return!1}function c1(t){if(t.inferredType)return t.inferredType.name;if(t.dataType)return t.dataType;if(t.returnType){let e=t.returnType.ref;if(e){if(Ga(e))return e.name;if(OE(e)||$x(e))return e.name}}}function Kx(t){var e;if(Ga(t))return jx(t)?t.name:(e=c1(t))!==null&&e!==void 0?e:t.name;if(OE(t)||$x(t)||iO(t))return t.name;if(qu(t)){let r=jfe(t);if(r)return r}else if(IE(t))return t.name;throw new Error("Cannot get name of Unknown Type")}function jfe(t){var e;if(t.inferredType)return t.inferredType.name;if(!((e=t.type)===null||e===void 0)&&e.ref)return Kx(t.type.ref)}function YWe(t){var e,r,n;return mo(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":jx(t)?t.name:(n=c1(t))!==null&&n!==void 0?n:t.name}function IO(t){var e,r,n;return mo(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":(n=c1(t))!==null&&n!==void 0?n:t.name}function u1(t){let e={s:!1,i:!1,u:!1},r=h1(t.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(r,n)}function h1(t,e){if(uO(t))return XWe(t);if(hO(t))return jWe(t);if(sO(t))return ZWe(t);if(FE(t)){let r=t.rule.ref;if(!r)throw new Error("Missing rule reference.");return Wu(h1(r.definition),{cardinality:t.cardinality,lookahead:t.lookahead})}else{if(lO(t))return QWe(t);if(fO(t))return KWe(t);if(cO(t)){let r=t.regex.lastIndexOf("/"),n=t.regex.substring(1,r),i=t.regex.substring(r+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),Wu(n,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}else{if(dO(t))return Wu(OO,{cardinality:t.cardinality,lookahead:t.lookahead});throw new Error(`Invalid terminal element: ${t?.$type}`)}}}function XWe(t){return Wu(t.elements.map(e=>h1(e)).join("|"),{cardinality:t.cardinality,lookahead:t.lookahead})}function jWe(t){return Wu(t.elements.map(e=>h1(e)).join(""),{cardinality:t.cardinality,lookahead:t.lookahead})}function KWe(t){return Wu(`${OO}*?${h1(t.terminal)}`,{cardinality:t.cardinality,lookahead:t.lookahead})}function QWe(t){return Wu(`(?!${h1(t.terminal)})${OO}*?`,{cardinality:t.cardinality,lookahead:t.lookahead})}function ZWe(t){return t.right?Wu(`[${SO(t.left)}-${SO(t.right)}]`,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1}):Wu(SO(t.left),{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}function SO(t){return Fp(t.value)}function Wu(t,e){var r;return(e.wrap!==!1||e.lookahead)&&(t=`(${(r=e.lookahead)!==null&&r!==void 0?r:""}${t})`),e.cardinality?`${t}${e.cardinality}`:t}var OO,zl=N(()=>{"use strict";NE();Hc();Pl();hs();Bl();l1();o(Ufe,"getEntryRule");o(Hfe,"getHiddenRules");o(Yx,"getAllReachableRules");o(qfe,"ruleDfs");o(AO,"getCrossReferenceTerminal");o(_O,"isCommentTerminal");o(DO,"findNodesForProperty");o(Xx,"findNodeForProperty");o(LO,"findNodesForPropertyInternal");o(VWe,"findNodesForKeyword");o(RO,"findNodeForKeyword");o(NO,"findNodesForKeywordInternal");o(MO,"findAssignment");o(qE,"findNameAssignment");o(Wfe,"findNameAssignmentInternal");o(Yfe,"getActionAtElement");o(UWe,"isOptionalCardinality");o(HWe,"isArrayCardinality");o(qWe,"isArrayOperator");o(jx,"isDataTypeRule");o(Xfe,"isDataTypeRuleInternal");o(WWe,"isDataType");o(CO,"isDataTypeInternal");o(c1,"getExplicitRuleType");o(Kx,"getTypeName");o(jfe,"getActionType");o(YWe,"getRuleTypeName");o(IO,"getRuleType");o(u1,"terminalRegex");OO=/[\s\S]/.source;o(h1,"abstractElementToRegex");o(XWe,"terminalAlternativesToRegex");o(jWe,"terminalGroupToRegex");o(KWe,"untilTokenToRegex");o(QWe,"negateTokenToRegex");o(ZWe,"characterRangeToRegex");o(SO,"keywordToRegex");o(Wu,"withCardinality")});function PO(t){let e=[],r=t.Grammar;for(let n of r.rules)mo(n)&&_O(n)&&wO(u1(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:LE}}var BO=N(()=>{"use strict";Bl();zl();l1();Hc();o(PO,"createGrammarConfig")});var FO=N(()=>{"use strict"});function f1(t){console&&console.error&&console.error(`Error: ${t}`)}function Qx(t){console&&console.warn&&console.warn(`Warning: ${t}`)}var Kfe=N(()=>{"use strict";o(f1,"PRINT_ERROR");o(Qx,"PRINT_WARNING")});function Zx(t){let e=new Date().getTime(),r=t();return{time:new Date().getTime()-e,value:r}}var Qfe=N(()=>{"use strict";o(Zx,"timer")});function Jx(t){function e(){}o(e,"FakeConstructor"),e.prototype=t;let r=new e;function n(){return typeof r.bar}return o(n,"fakeAccess"),n(),n(),t;(0,eval)(t)}var Zfe=N(()=>{"use strict";o(Jx,"toFastProperties")});var d1=N(()=>{"use strict";Kfe();Qfe();Zfe()});function JWe(t){return eYe(t)?t.LABEL:t.name}function eYe(t){return xi(t.LABEL)&&t.LABEL!==""}function YE(t){return rt(t,p1)}function p1(t){function e(r){return rt(r,p1)}if(o(e,"convertDefinition"),t instanceof fn){let r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return xi(t.label)&&(r.label=t.label),r}else{if(t instanceof Pn)return{type:"Alternative",definition:e(t.definition)};if(t instanceof dn)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof Bn)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof Fn)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:p1(new Ar({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof _n)return{type:"RepetitionWithSeparator",idx:t.idx,separator:p1(new Ar({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof zr)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof Dn)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof Ar){let r={type:"Terminal",name:t.terminalType.name,label:JWe(t.terminalType),idx:t.idx};xi(t.label)&&(r.terminalLabel=t.label);let n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=Uo(n)?n.source:n),r}else{if(t instanceof fs)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}var go,fn,fs,Pn,dn,Bn,Fn,zr,_n,Dn,Ar,XE=N(()=>{"use strict";Yt();o(JWe,"tokenLabel");o(eYe,"hasTokenLabel");go=class{static{o(this,"AbstractProduction")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),Ae(this.definition,r=>{r.accept(e)})}},fn=class extends go{static{o(this,"NonTerminal")}constructor(e){super([]),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},fs=class extends go{static{o(this,"Rule")}constructor(e){super(e.definition),this.orgText="",pa(this,Vs(e,r=>r!==void 0))}},Pn=class extends go{static{o(this,"Alternative")}constructor(e){super(e.definition),this.ignoreAmbiguities=!1,pa(this,Vs(e,r=>r!==void 0))}},dn=class extends go{static{o(this,"Option")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},Bn=class extends go{static{o(this,"RepetitionMandatory")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},Fn=class extends go{static{o(this,"RepetitionMandatoryWithSeparator")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},zr=class extends go{static{o(this,"Repetition")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},_n=class extends go{static{o(this,"RepetitionWithSeparator")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},Dn=class extends go{static{o(this,"Alternation")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,pa(this,Vs(e,r=>r!==void 0))}},Ar=class{static{o(this,"Terminal")}constructor(e){this.idx=1,pa(this,Vs(e,r=>r!==void 0))}accept(e){e.visit(this)}};o(YE,"serializeGrammar");o(p1,"serializeProduction")});var ds,Jfe=N(()=>{"use strict";XE();ds=class{static{o(this,"GAstVisitor")}visit(e){let r=e;switch(r.constructor){case fn:return this.visitNonTerminal(r);case Pn:return this.visitAlternative(r);case dn:return this.visitOption(r);case Bn:return this.visitRepetitionMandatory(r);case Fn:return this.visitRepetitionMandatoryWithSeparator(r);case _n:return this.visitRepetitionWithSeparator(r);case zr:return this.visitRepetition(r);case Dn:return this.visitAlternation(r);case Ar:return this.visitTerminal(r);case fs:return this.visitRule(r);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}}});function $O(t){return t instanceof Pn||t instanceof dn||t instanceof zr||t instanceof Bn||t instanceof Fn||t instanceof _n||t instanceof Ar||t instanceof fs}function $p(t,e=[]){return t instanceof dn||t instanceof zr||t instanceof _n?!0:t instanceof Dn?z2(t.definition,n=>$p(n,e)):t instanceof fn&&jn(e,t)?!1:t instanceof go?(t instanceof fn&&e.push(t),Pa(t.definition,n=>$p(n,e))):!1}function zO(t){return t instanceof Dn}function Xs(t){if(t instanceof fn)return"SUBRULE";if(t instanceof dn)return"OPTION";if(t instanceof Dn)return"OR";if(t instanceof Bn)return"AT_LEAST_ONE";if(t instanceof Fn)return"AT_LEAST_ONE_SEP";if(t instanceof _n)return"MANY_SEP";if(t instanceof zr)return"MANY";if(t instanceof Ar)return"CONSUME";throw Error("non exhaustive match")}var ede=N(()=>{"use strict";Yt();XE();o($O,"isSequenceProd");o($p,"isOptionalProd");o(zO,"isBranchingProd");o(Xs,"getProductionDslName")});var ps=N(()=>{"use strict";XE();Jfe();ede()});function tde(t,e,r){return[new dn({definition:[new Ar({terminalType:t.separator})].concat(t.definition)})].concat(e,r)}var Yu,jE=N(()=>{"use strict";Yt();ps();Yu=class{static{o(this,"RestWalker")}walk(e,r=[]){Ae(e.definition,(n,i)=>{let a=yi(e.definition,i+1);if(n instanceof fn)this.walkProdRef(n,a,r);else if(n instanceof Ar)this.walkTerminal(n,a,r);else if(n instanceof Pn)this.walkFlat(n,a,r);else if(n instanceof dn)this.walkOption(n,a,r);else if(n instanceof Bn)this.walkAtLeastOne(n,a,r);else if(n instanceof Fn)this.walkAtLeastOneSep(n,a,r);else if(n instanceof _n)this.walkManySep(n,a,r);else if(n instanceof zr)this.walkMany(n,a,r);else if(n instanceof Dn)this.walkOr(n,a,r);else throw Error("non exhaustive match")})}walkTerminal(e,r,n){}walkProdRef(e,r,n){}walkFlat(e,r,n){let i=r.concat(n);this.walk(e,i)}walkOption(e,r,n){let i=r.concat(n);this.walk(e,i)}walkAtLeastOne(e,r,n){let i=[new dn({definition:e.definition})].concat(r,n);this.walk(e,i)}walkAtLeastOneSep(e,r,n){let i=tde(e,r,n);this.walk(e,i)}walkMany(e,r,n){let i=[new dn({definition:e.definition})].concat(r,n);this.walk(e,i)}walkManySep(e,r,n){let i=tde(e,r,n);this.walk(e,i)}walkOr(e,r,n){let i=r.concat(n);Ae(e.definition,a=>{let s=new Pn({definition:[a]});this.walk(s,i)})}};o(tde,"restForRepetitionWithSeparator")});function zp(t){if(t instanceof fn)return zp(t.referencedRule);if(t instanceof Ar)return nYe(t);if($O(t))return tYe(t);if(zO(t))return rYe(t);throw Error("non exhaustive match")}function tYe(t){let e=[],r=t.definition,n=0,i=r.length>n,a,s=!0;for(;i&&s;)a=r[n],s=$p(a),e=e.concat(zp(a)),n=n+1,i=r.length>n;return qm(e)}function rYe(t){let e=rt(t.definition,r=>zp(r));return qm(Qr(e))}function nYe(t){return[t.terminalType]}var GO=N(()=>{"use strict";Yt();ps();o(zp,"first");o(tYe,"firstForSequence");o(rYe,"firstForBranching");o(nYe,"firstForTerminal")});var KE,VO=N(()=>{"use strict";KE="_~IN~_"});function rde(t){let e={};return Ae(t,r=>{let n=new UO(r).startWalking();pa(e,n)}),e}function iYe(t,e){return t.name+e+KE}var UO,nde=N(()=>{"use strict";jE();GO();Yt();VO();ps();UO=class extends Yu{static{o(this,"ResyncFollowsWalker")}constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,r,n){}walkProdRef(e,r,n){let i=iYe(e.referencedRule,e.idx)+this.topProd.name,a=r.concat(n),s=new Pn({definition:a}),l=zp(s);this.follows[i]=l}};o(rde,"computeAllProdsFollows");o(iYe,"buildBetweenProdsFollowPrefix")});function m1(t){let e=t.toString();if(QE.hasOwnProperty(e))return QE[e];{let r=aYe.pattern(e);return QE[e]=r,r}}function ide(){QE={}}var QE,aYe,ZE=N(()=>{"use strict";Wx();QE={},aYe=new Pp;o(m1,"getRegExpAst");o(ide,"clearRegExpParserCache")});function ode(t,e=!1){try{let r=m1(t);return HO(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===sde)e&&Qx(`${eb} Unable to optimize: < ${t.toString()} > + Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),f1(`${eb} + Failed parsing: < ${t.toString()} > + Using the @chevrotain/regexp-to-ast library + Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function HO(t,e,r){switch(t.type){case"Disjunction":for(let i=0;i{if(typeof u=="number")JE(u,e,r);else{let h=u;if(r===!0)for(let f=h.from;f<=h.to;f++)JE(f,e,r);else{for(let f=h.from;f<=h.to&&f=g1){let f=h.from>=g1?h.from:g1,d=h.to,p=Yc(f),m=Yc(d);for(let g=p;g<=m;g++)e[g]=g}}}});break;case"Group":HO(s.value,e,r);break;default:throw Error("Non Exhaustive Match")}let l=s.quantifier!==void 0&&s.quantifier.atLeast===0;if(s.type==="Group"&&qO(s)===!1||s.type!=="Group"&&l===!1)break}break;default:throw Error("non exhaustive match!")}return kr(e)}function JE(t,e,r){let n=Yc(t);e[n]=n,r===!0&&sYe(t,e)}function sYe(t,e){let r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){let i=Yc(n.charCodeAt(0));e[i]=i}else{let i=r.toLowerCase();if(i!==r){let a=Yc(i.charCodeAt(0));e[a]=a}}}function ade(t,e){return os(t.value,r=>{if(typeof r=="number")return jn(e,r);{let n=r;return os(e,i=>n.from<=i&&i<=n.to)!==void 0}})}function qO(t){let e=t.quantifier;return e&&e.atLeast===0?!0:t.value?Bt(t.value)?Pa(t.value,qO):qO(t.value):!1}function eS(t,e){if(e instanceof RegExp){let r=m1(e),n=new WO(t);return n.visit(r),n.found}else return os(e,r=>jn(t,r.charCodeAt(0)))!==void 0}var sde,eb,WO,lde=N(()=>{"use strict";Wx();Yt();d1();ZE();YO();sde="Complement Sets are not supported for first char optimization",eb=`Unable to use "first char" lexer optimizations: +`;o(ode,"getOptimizedStartCodesIndices");o(HO,"firstCharOptimizedIndices");o(JE,"addOptimizedIdxToResult");o(sYe,"handleIgnoreCase");o(ade,"findCode");o(qO,"isWholeOptional");WO=class extends Wc{static{o(this,"CharCodeFinder")}constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return}super.visitChildren(e)}}visitCharacter(e){jn(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?ade(e,this.targetCharCodes)===void 0&&(this.found=!0):ade(e,this.targetCharCodes)!==void 0&&(this.found=!0)}};o(eS,"canMatchCharCode")});function hde(t,e){e=of(e,{useSticky:jO,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:o((b,T)=>T(),"tracer")});let r=e.tracer;r("initCharCodeToOptimizedIndexMap",()=>{EYe()});let n;r("Reject Lexer.NA",()=>{n=cf(t,b=>b[Gp]===Zn.NA)});let i=!1,a;r("Transform Patterns",()=>{i=!1,a=rt(n,b=>{let T=b[Gp];if(Uo(T)){let S=T.source;return S.length===1&&S!=="^"&&S!=="$"&&S!=="."&&!T.ignoreCase?S:S.length===2&&S[0]==="\\"&&!jn(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],S[1])?S[1]:e.useSticky?ude(T):cde(T)}else{if(Si(T))return i=!0,{exec:T};if(typeof T=="object")return i=!0,T;if(typeof T=="string"){if(T.length===1)return T;{let S=T.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),w=new RegExp(S);return e.useSticky?ude(w):cde(w)}}else throw Error("non exhaustive match")}})});let s,l,u,h,f;r("misc mapping",()=>{s=rt(n,b=>b.tokenTypeIdx),l=rt(n,b=>{let T=b.GROUP;if(T!==Zn.SKIPPED){if(xi(T))return T;if(xr(T))return!1;throw Error("non exhaustive match")}}),u=rt(n,b=>{let T=b.LONGER_ALT;if(T)return Bt(T)?rt(T,w=>ck(n,w)):[ck(n,T)]}),h=rt(n,b=>b.PUSH_MODE),f=rt(n,b=>Ft(b,"POP_MODE"))});let d;r("Line Terminator Handling",()=>{let b=xde(e.lineTerminatorCharacters);d=rt(n,T=>!1),e.positionTracking!=="onlyOffset"&&(d=rt(n,T=>Ft(T,"LINE_BREAKS")?!!T.LINE_BREAKS:vde(T,b)===!1&&eS(b,T.PATTERN)))});let p,m,g,y;r("Misc Mapping #2",()=>{p=rt(n,gde),m=rt(a,wYe),g=Jr(n,(b,T)=>{let S=T.GROUP;return xi(S)&&S!==Zn.SKIPPED&&(b[S]=[]),b},{}),y=rt(a,(b,T)=>({pattern:a[T],longerAlt:u[T],canLineTerminator:d[T],isCustom:p[T],short:m[T],group:l[T],push:h[T],pop:f[T],tokenTypeIdx:s[T],tokenType:n[T]}))});let v=!0,x=[];return e.safeMode||r("First Char Optimization",()=>{x=Jr(n,(b,T,S)=>{if(typeof T.PATTERN=="string"){let w=T.PATTERN.charCodeAt(0),k=Yc(w);XO(b,k,y[S])}else if(Bt(T.START_CHARS_HINT)){let w;Ae(T.START_CHARS_HINT,k=>{let A=typeof k=="string"?k.charCodeAt(0):k,C=Yc(A);w!==C&&(w=C,XO(b,C,y[S]))})}else if(Uo(T.PATTERN))if(T.PATTERN.unicode)v=!1,e.ensureOptimizations&&f1(`${eb} Unable to analyze < ${T.PATTERN.toString()} > pattern. + The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let w=ode(T.PATTERN,e.ensureOptimizations);mr(w)&&(v=!1),Ae(w,k=>{XO(b,k,y[S])})}else e.ensureOptimizations&&f1(`${eb} TokenType: <${T.name}> is using a custom token pattern without providing parameter. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),v=!1;return b},[])}),{emptyGroups:g,patternIdxToConfig:y,charCodeToPatternIdxToConfig:x,hasCustom:i,canBeOptimized:v}}function fde(t,e){let r=[],n=lYe(t);r=r.concat(n.errors);let i=cYe(n.valid),a=i.valid;return r=r.concat(i.errors),r=r.concat(oYe(a)),r=r.concat(yYe(a)),r=r.concat(vYe(a,e)),r=r.concat(xYe(a)),r}function oYe(t){let e=[],r=Zr(t,n=>Uo(n[Gp]));return e=e.concat(hYe(r)),e=e.concat(pYe(r)),e=e.concat(mYe(r)),e=e.concat(gYe(r)),e=e.concat(fYe(r)),e}function lYe(t){let e=Zr(t,i=>!Ft(i,Gp)),r=rt(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:Qn.MISSING_PATTERN,tokenTypes:[i]})),n=lf(t,e);return{errors:r,valid:n}}function cYe(t){let e=Zr(t,i=>{let a=i[Gp];return!Uo(a)&&!Si(a)&&!Ft(a,"exec")&&!xi(a)}),r=rt(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Qn.INVALID_PATTERN,tokenTypes:[i]})),n=lf(t,e);return{errors:r,valid:n}}function hYe(t){class e extends Wc{static{o(this,"EndAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitEndAnchor(a){this.found=!0}}let r=Zr(t,i=>{let a=i.PATTERN;try{let s=m1(a),l=new e;return l.visit(s),l.found}catch{return uYe.test(a.source)}});return rt(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Qn.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}function fYe(t){let e=Zr(t,n=>n.PATTERN.test(""));return rt(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:Qn.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}function pYe(t){class e extends Wc{static{o(this,"StartAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitStartAnchor(a){this.found=!0}}let r=Zr(t,i=>{let a=i.PATTERN;try{let s=m1(a),l=new e;return l.visit(s),l.found}catch{return dYe.test(a.source)}});return rt(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Qn.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}function mYe(t){let e=Zr(t,n=>{let i=n[Gp];return i instanceof RegExp&&(i.multiline||i.global)});return rt(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Qn.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}function gYe(t){let e=[],r=rt(t,a=>Jr(t,(s,l)=>(a.PATTERN.source===l.PATTERN.source&&!jn(e,l)&&l.PATTERN!==Zn.NA&&(e.push(l),s.push(l)),s),[]));r=_c(r);let n=Zr(r,a=>a.length>1);return rt(n,a=>{let s=rt(a,u=>u.name);return{message:`The same RegExp pattern ->${ea(a).PATTERN}<-has been used in all of the following Token Types: ${s.join(", ")} <-`,type:Qn.DUPLICATE_PATTERNS_FOUND,tokenTypes:a}})}function yYe(t){let e=Zr(t,n=>{if(!Ft(n,"GROUP"))return!1;let i=n.GROUP;return i!==Zn.SKIPPED&&i!==Zn.NA&&!xi(i)});return rt(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Qn.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}function vYe(t,e){let r=Zr(t,i=>i.PUSH_MODE!==void 0&&!jn(e,i.PUSH_MODE));return rt(r,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:Qn.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}function xYe(t){let e=[],r=Jr(t,(n,i,a)=>{let s=i.PATTERN;return s===Zn.NA||(xi(s)?n.push({str:s,idx:a,tokenType:i}):Uo(s)&&TYe(s)&&n.push({str:s.source,idx:a,tokenType:i})),n},[]);return Ae(t,(n,i)=>{Ae(r,({str:a,idx:s,tokenType:l})=>{if(i${l.name}<- can never be matched. +Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:u,type:Qn.UNREACHABLE_PATTERN,tokenTypes:[n,l]})}})}),e}function bYe(t,e){if(Uo(e)){let r=e.exec(t);return r!==null&&r.index===0}else{if(Si(e))return e(t,0,[],{});if(Ft(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function TYe(t){return os([".","\\","[","]","|","^","$","(",")","?","*","+","{"],r=>t.source.indexOf(r)!==-1)===void 0}function cde(t){let e=t.ignoreCase?"i":"";return new RegExp(`^(?:${t.source})`,e)}function ude(t){let e=t.ignoreCase?"iy":"y";return new RegExp(`${t.source}`,e)}function dde(t,e,r){let n=[];return Ft(t,y1)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+y1+`> property in its definition +`,type:Qn.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),Ft(t,tS)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+tS+`> property in its definition +`,type:Qn.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),Ft(t,tS)&&Ft(t,y1)&&!Ft(t.modes,t.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${y1}: <${t.defaultMode}>which does not exist +`,type:Qn.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),Ft(t,tS)&&Ae(t.modes,(i,a)=>{Ae(i,(s,l)=>{if(xr(s))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${a}> at index: <${l}> +`,type:Qn.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(Ft(s,"LONGER_ALT")){let u=Bt(s.LONGER_ALT)?s.LONGER_ALT:[s.LONGER_ALT];Ae(u,h=>{!xr(h)&&!jn(i,h)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${h.name}> on token <${s.name}> outside of mode <${a}> +`,type:Qn.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function pde(t,e,r){let n=[],i=!1,a=_c(Qr(kr(t.modes))),s=cf(a,u=>u[Gp]===Zn.NA),l=xde(r);return e&&Ae(s,u=>{let h=vde(u,l);if(h!==!1){let d={message:kYe(u,h),type:h.issue,tokenType:u};n.push(d)}else Ft(u,"LINE_BREAKS")?u.LINE_BREAKS===!0&&(i=!0):eS(l,u.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:Qn.NO_LINE_BREAKS_FLAGS}),n}function mde(t){let e={},r=qr(t);return Ae(r,n=>{let i=t[n];if(Bt(i))e[n]=[];else throw Error("non exhaustive match")}),e}function gde(t){let e=t.PATTERN;if(Uo(e))return!1;if(Si(e))return!0;if(Ft(e,"exec"))return!0;if(xi(e))return!1;throw Error("non exhaustive match")}function wYe(t){return xi(t)&&t.length===1?t.charCodeAt(0):!1}function vde(t,e){if(Ft(t,"LINE_BREAKS"))return!1;if(Uo(t.PATTERN)){try{eS(e,t.PATTERN)}catch(r){return{issue:Qn.IDENTIFY_TERMINATOR,errMsg:r.message}}return!1}else{if(xi(t.PATTERN))return!1;if(gde(t))return{issue:Qn.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}}function kYe(t,e){if(e.issue===Qn.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern. + The problem is in the <${t.name}> Token Type + Root cause: ${e.errMsg}. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===Qn.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. + The problem is in the <${t.name}> Token Type + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}function xde(t){return rt(t,r=>xi(r)?r.charCodeAt(0):r)}function XO(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}function Yc(t){return t255?255+~~(t/255):t}}var Gp,y1,tS,jO,uYe,dYe,yde,g1,rS,YO=N(()=>{"use strict";Wx();tb();Yt();d1();lde();ZE();Gp="PATTERN",y1="defaultMode",tS="modes",jO=typeof new RegExp("(?:)").sticky=="boolean";o(hde,"analyzeTokenTypes");o(fde,"validatePatterns");o(oYe,"validateRegExpPattern");o(lYe,"findMissingPatterns");o(cYe,"findInvalidPatterns");uYe=/[^\\][$]/;o(hYe,"findEndOfInputAnchor");o(fYe,"findEmptyMatchRegExps");dYe=/[^\\[][\^]|^\^/;o(pYe,"findStartOfInputAnchor");o(mYe,"findUnsupportedFlags");o(gYe,"findDuplicatePatterns");o(yYe,"findInvalidGroupType");o(vYe,"findModesThatDoNotExist");o(xYe,"findUnreachablePatterns");o(bYe,"testTokenType");o(TYe,"noMetaChar");o(cde,"addStartOfInput");o(ude,"addStickyFlag");o(dde,"performRuntimeChecks");o(pde,"performWarningRuntimeChecks");o(mde,"cloneEmptyGroups");o(gde,"isCustomPattern");o(wYe,"isShortPattern");yde={test:o(function(t){let e=t.length;for(let r=this.lastIndex;r{r.isParent=r.categoryMatches.length>0})}function SYe(t){let e=ln(t),r=t,n=!0;for(;n;){r=_c(Qr(rt(r,a=>a.CATEGORIES)));let i=lf(r,e);e=e.concat(i),mr(i)?n=!1:r=i}return e}function CYe(t){Ae(t,e=>{KO(e)||(wde[bde]=e,e.tokenTypeIdx=bde++),Tde(e)&&!Bt(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Tde(e)||(e.CATEGORIES=[]),DYe(e)||(e.categoryMatches=[]),LYe(e)||(e.categoryMatchesMap={})})}function AYe(t){Ae(t,e=>{e.categoryMatches=[],Ae(e.categoryMatchesMap,(r,n)=>{e.categoryMatches.push(wde[n].tokenTypeIdx)})})}function _Ye(t){Ae(t,e=>{kde([],e)})}function kde(t,e){Ae(t,r=>{e.categoryMatchesMap[r.tokenTypeIdx]=!0}),Ae(e.CATEGORIES,r=>{let n=t.concat(e);jn(n,r)||kde(n,r)})}function KO(t){return Ft(t,"tokenTypeIdx")}function Tde(t){return Ft(t,"CATEGORIES")}function DYe(t){return Ft(t,"categoryMatches")}function LYe(t){return Ft(t,"categoryMatchesMap")}function Ede(t){return Ft(t,"tokenTypeIdx")}var bde,wde,Vp=N(()=>{"use strict";Yt();o(Xu,"tokenStructuredMatcher");o(v1,"tokenStructuredMatcherNoCategories");bde=1,wde={};o(ju,"augmentTokenTypes");o(SYe,"expandCategories");o(CYe,"assignTokenDefaultProps");o(AYe,"assignCategoriesTokensProp");o(_Ye,"assignCategoriesMapProp");o(kde,"singleAssignCategoriesToksMap");o(KO,"hasShortKeyProperty");o(Tde,"hasCategoriesProperty");o(DYe,"hasExtendingTokensTypesProperty");o(LYe,"hasExtendingTokensTypesMapProperty");o(Ede,"isTokenType")});var x1,QO=N(()=>{"use strict";x1={buildUnableToPopLexerModeMessage(t){return`Unable to pop Lexer Mode after encountering Token ->${t.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(t,e,r,n,i){return`unexpected character: ->${t.charAt(e)}<- at offset: ${e}, skipped ${r} characters.`}}});var Qn,rb,Zn,tb=N(()=>{"use strict";YO();Yt();d1();Vp();QO();ZE();(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",t[t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"})(Qn||(Qn={}));rb={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:x1,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(rb);Zn=class{static{o(this,"Lexer")}constructor(e,r=rb){if(this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(i,a)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let s=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${i}>`);let{time:l,value:u}=Zx(a),h=l>10?console.warn:console.log;return this.traceInitIndent time: ${l}ms`),this.traceInitIndent--,u}else return a()},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=pa({},rb,r);let n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let i,a=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===rb.lineTerminatorsPattern)this.config.lineTerminatorsPattern=yde;else if(this.config.lineTerminatorCharacters===rb.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),Bt(e)?i={modes:{defaultMode:ln(e)},defaultMode:y1}:(a=!1,i=ln(e))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(dde(i,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(pde(i,this.trackStartLines,this.config.lineTerminatorCharacters))})),i.modes=i.modes?i.modes:{},Ae(i.modes,(l,u)=>{i.modes[u]=cf(l,h=>xr(h))});let s=qr(i.modes);if(Ae(i.modes,(l,u)=>{this.TRACE_INIT(`Mode: <${u}> processing`,()=>{if(this.modes.push(u),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(fde(l,s))}),mr(this.lexerDefinitionErrors)){ju(l);let h;this.TRACE_INIT("analyzeTokenTypes",()=>{h=hde(l,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[u]=h.patternIdxToConfig,this.charCodeToPatternIdxToConfig[u]=h.charCodeToPatternIdxToConfig,this.emptyGroups=pa({},this.emptyGroups,h.emptyGroups),this.hasCustom=h.hasCustom||this.hasCustom,this.canModeBeOptimized[u]=h.canBeOptimized}})}),this.defaultMode=i.defaultMode,!mr(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let u=rt(this.lexerDefinitionErrors,h=>h.message).join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+u)}Ae(this.lexerDefinitionWarning,l=>{Qx(l.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(jO?(this.chopInput=Qi,this.match=this.matchWithTest):(this.updateLastIndex=si,this.match=this.matchWithExec),a&&(this.handleModes=si),this.trackStartLines===!1&&(this.computeNewColumn=Qi),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=si),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let l=Jr(this.canModeBeOptimized,(u,h,f)=>(h===!1&&u.push(f),u),[]);if(r.ensureOptimizations&&!mr(l))throw Error(`Lexer Modes: < ${l.join(", ")} > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{ide()}),this.TRACE_INIT("toFastProperties",()=>{Jx(this)})})}tokenize(e,r=this.defaultMode){if(!mr(this.lexerDefinitionErrors)){let i=rt(this.lexerDefinitionErrors,a=>a.message).join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+i)}return this.tokenizeInternal(e,r)}tokenizeInternal(e,r){let n,i,a,s,l,u,h,f,d,p,m,g,y,v,x,b,T=e,S=T.length,w=0,k=0,A=this.hasCustom?0:Math.floor(e.length/10),C=new Array(A),R=[],I=this.trackStartLines?1:void 0,L=this.trackStartLines?1:void 0,E=mde(this.emptyGroups),D=this.trackStartLines,_=this.config.lineTerminatorsPattern,O=0,M=[],P=[],B=[],F=[];Object.freeze(F);let G;function $(){return M}o($,"getPossiblePatternsSlow");function U(J){let ue=Yc(J),re=P[ue];return re===void 0?F:re}o(U,"getPossiblePatternsOptimized");let j=o(J=>{if(B.length===1&&J.tokenType.PUSH_MODE===void 0){let ue=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(J);R.push({offset:J.startOffset,line:J.startLine,column:J.startColumn,length:J.image.length,message:ue})}else{B.pop();let ue=ma(B);M=this.patternIdxToConfig[ue],P=this.charCodeToPatternIdxToConfig[ue],O=M.length;let re=this.canModeBeOptimized[ue]&&this.config.safeMode===!1;P&&re?G=U:G=$}},"pop_mode");function te(J){B.push(J),P=this.charCodeToPatternIdxToConfig[J],M=this.patternIdxToConfig[J],O=M.length,O=M.length;let ue=this.canModeBeOptimized[J]&&this.config.safeMode===!1;P&&ue?G=U:G=$}o(te,"push_mode"),te.call(this,r);let Y,oe=this.config.recoveryEnabled;for(;wu.length){u=s,h=f,Y=ae;break}}}break}}if(u!==null){if(d=u.length,p=Y.group,p!==void 0&&(m=Y.tokenTypeIdx,g=this.createTokenInstance(u,w,m,Y.tokenType,I,L,d),this.handlePayload(g,h),p===!1?k=this.addToken(C,k,g):E[p].push(g)),e=this.chopInput(e,d),w=w+d,L=this.computeNewColumn(L,d),D===!0&&Y.canLineTerminator===!0){let ee=0,Z,K;_.lastIndex=0;do Z=_.test(u),Z===!0&&(K=_.lastIndex-1,ee++);while(Z===!0);ee!==0&&(I=I+ee,L=d-K,this.updateTokenEndLineColumnLocation(g,p,K,ee,I,L,d))}this.handleModes(Y,j,te,g)}else{let ee=w,Z=I,K=L,ae=oe===!1;for(;ae===!1&&w{"use strict";Yt();tb();Vp();o(Ku,"tokenLabel");o(ZO,"hasTokenLabel");RYe="parent",Sde="categories",Cde="label",Ade="group",_de="push_mode",Dde="pop_mode",Lde="longer_alt",Rde="line_breaks",Nde="start_chars_hint";o(Pf,"createToken");o(NYe,"createTokenInternal");yo=Pf({name:"EOF",pattern:Zn.NA});ju([yo]);o(Qu,"createTokenInstance");o(nb,"tokenMatcher")});var Zu,Mde,Gl,b1=N(()=>{"use strict";Up();Yt();ps();Zu={buildMismatchTokenMessage({expected:t,actual:e,previous:r,ruleName:n}){return`Expecting ${ZO(t)?`--> ${Ku(t)} <--`:`token of type --> ${t.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:t,ruleName:e}){return"Redundant input, expecting EOF but found: "+t.image},buildNoViableAltMessage({expectedPathsPerAlt:t,actual:e,previous:r,customUserDescription:n,ruleName:i}){let a="Expecting: ",l=` +but found: '`+ea(e).image+"'";if(n)return a+n+l;{let u=Jr(t,(p,m)=>p.concat(m),[]),h=rt(u,p=>`[${rt(p,m=>Ku(m)).join(", ")}]`),d=`one of these possible Token sequences: +${rt(h,(p,m)=>` ${m+1}. ${p}`).join(` +`)}`;return a+d+l}},buildEarlyExitMessage({expectedIterationPaths:t,actual:e,customUserDescription:r,ruleName:n}){let i="Expecting: ",s=` +but found: '`+ea(e).image+"'";if(r)return i+r+s;{let u=`expecting at least one iteration which starts with one of these possible Token sequences:: + <${rt(t,h=>`[${rt(h,f=>Ku(f)).join(",")}]`).join(" ,")}>`;return i+u+s}}};Object.freeze(Zu);Mde={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+t.name+"<-"}},Gl={buildDuplicateFoundError(t,e){function r(f){return f instanceof Ar?f.terminalType.name:f instanceof fn?f.nonTerminalName:""}o(r,"getExtraProductionArgument");let n=t.name,i=ea(e),a=i.idx,s=Xs(i),l=r(i),u=a>0,h=`->${s}${u?a:""}<- ${l?`with argument: ->${l}<-`:""} + appears more than once (${e.length} times) in the top level rule: ->${n}<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return h=h.replace(/[ \t]+/g," "),h=h.replace(/\s\s+/g,` +`),h},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. +The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. +To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(t){let e=rt(t.prefixPath,i=>Ku(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx;return`Ambiguous alternatives: <${t.ambiguityIndices.join(" ,")}> due to common lookahead prefix +in inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`},buildAlternationAmbiguityError(t){let e=rt(t.prefixPath,i=>Ku(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(" ,")}> in inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n},buildEmptyRepetitionError(t){let e=Xs(t.repetition);return t.repetition.idx!==0&&(e+=t.repetition.idx),`The repetition <${e}> within Rule <${t.topLevelRule.name}> can never consume any tokens. +This could lead to an infinite loop.`},buildTokenNameError(t){return"deprecated"},buildEmptyAlternationError(t){return`Ambiguous empty alternative: <${t.emptyChoiceIdx+1}> in inside <${t.topLevelRule.name}> Rule. +Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(t){return`An Alternation cannot have more than 256 alternatives: + inside <${t.topLevelRule.name}> Rule. + has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=rt(t.leftRecursionPath,a=>a.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. +rule: <${e}> can be invoked from itself (directly or indirectly) +without consuming any Tokens. The grammar path that causes this is: + ${n} + To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof fs?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}}});function Ide(t,e){let r=new JO(t,e);return r.resolveRefs(),r.errors}var JO,Ode=N(()=>{"use strict";js();Yt();ps();o(Ide,"resolveGrammar");JO=class extends ds{static{o(this,"GastRefResolverVisitor")}constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){Ae(kr(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:Gi.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}}});function sS(t,e,r=[]){r=ln(r);let n=[],i=0;function a(l){return l.concat(yi(t,i+1))}o(a,"remainingPathWith");function s(l){let u=sS(a(l),e,r);return n.concat(u)}for(o(s,"getAlternativesForProd");r.length{mr(u.definition)===!1&&(n=s(u.definition))}),n;if(l instanceof Ar)r.push(l.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:yi(t,i)}),n}function oS(t,e,r,n){let i="EXIT_NONE_TERMINAL",a=[i],s="EXIT_ALTERNATIVE",l=!1,u=e.length,h=u-n-1,f=[],d=[];for(d.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!mr(d);){let p=d.pop();if(p===s){l&&ma(d).idx<=h&&d.pop();continue}let m=p.def,g=p.idx,y=p.ruleStack,v=p.occurrenceStack;if(mr(m))continue;let x=m[0];if(x===i){let b={idx:g,def:yi(m),ruleStack:Bu(y),occurrenceStack:Bu(v)};d.push(b)}else if(x instanceof Ar)if(g=0;b--){let T=x.definition[b],S={idx:g,def:T.definition.concat(yi(m)),ruleStack:y,occurrenceStack:v};d.push(S),d.push(s)}else if(x instanceof Pn)d.push({idx:g,def:x.definition.concat(yi(m)),ruleStack:y,occurrenceStack:v});else if(x instanceof fs)d.push(MYe(x,g,y,v));else throw Error("non exhaustive match")}return f}function MYe(t,e,r,n){let i=ln(r);i.push(t.name);let a=ln(n);return a.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:a}}var eP,nS,T1,iS,ib,aS,ab,sb=N(()=>{"use strict";Yt();GO();jE();ps();eP=class extends Yu{static{o(this,"AbstractNextPossibleTokensWalker")}constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=ln(this.path.ruleStack).reverse(),this.occurrenceStack=ln(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){mr(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},nS=class extends eP{static{o(this,"NextAfterTokenWalker")}constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),a=new Pn({definition:i});this.possibleTokTypes=zp(a),this.found=!0}}},T1=class extends Yu{static{o(this,"AbstractNextTerminalAfterProductionWalker")}constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},iS=class extends T1{static{o(this,"NextTerminalAfterManyWalker")}walkMany(e,r,n){if(e.idx===this.occurrence){let i=ea(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Ar&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},ib=class extends T1{static{o(this,"NextTerminalAfterManySepWalker")}walkManySep(e,r,n){if(e.idx===this.occurrence){let i=ea(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Ar&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},aS=class extends T1{static{o(this,"NextTerminalAfterAtLeastOneWalker")}walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=ea(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Ar&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},ab=class extends T1{static{o(this,"NextTerminalAfterAtLeastOneSepWalker")}walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=ea(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Ar&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}};o(sS,"possiblePathsFrom");o(oS,"nextPossibleTokensAfter");o(MYe,"expandTopLevelRule")});function ob(t){if(t instanceof dn||t==="Option")return Jn.OPTION;if(t instanceof zr||t==="Repetition")return Jn.REPETITION;if(t instanceof Bn||t==="RepetitionMandatory")return Jn.REPETITION_MANDATORY;if(t instanceof Fn||t==="RepetitionMandatoryWithSeparator")return Jn.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof _n||t==="RepetitionWithSeparator")return Jn.REPETITION_WITH_SEPARATOR;if(t instanceof Dn||t==="Alternation")return Jn.ALTERNATION;throw Error("non exhaustive match")}function cS(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,a=ob(n);return a===Jn.ALTERNATION?w1(e,r,i):k1(e,r,a,i)}function Bde(t,e,r,n,i,a){let s=w1(t,e,r),l=Ude(s)?v1:Xu;return a(s,n,l,i)}function Fde(t,e,r,n,i,a){let s=k1(t,e,i,r),l=Ude(s)?v1:Xu;return a(s[0],l,n)}function $de(t,e,r,n){let i=t.length,a=Pa(t,s=>Pa(s,l=>l.length===1));if(e)return function(s){let l=rt(s,u=>u.GATE);for(let u=0;uQr(u)),l=Jr(s,(u,h,f)=>(Ae(h,d=>{Ft(u,d.tokenTypeIdx)||(u[d.tokenTypeIdx]=f),Ae(d.categoryMatches,p=>{Ft(u,p)||(u[p]=f)})}),u),{});return function(){let u=this.LA(1);return l[u.tokenTypeIdx]}}else return function(){for(let s=0;sa.length===1),i=t.length;if(n&&!r){let a=Qr(t);if(a.length===1&&mr(a[0].categoryMatches)){let l=a[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===l}}else{let s=Jr(a,(l,u,h)=>(l[u.tokenTypeIdx]=!0,Ae(u.categoryMatches,f=>{l[f]=!0}),l),[]);return function(){let l=this.LA(1);return s[l.tokenTypeIdx]===!0}}}else return function(){e:for(let a=0;asS([s],1)),n=Pde(r.length),i=rt(r,s=>{let l={};return Ae(s,u=>{let h=tP(u.partialPath);Ae(h,f=>{l[f]=!0})}),l}),a=r;for(let s=1;s<=e;s++){let l=a;a=Pde(l.length);for(let u=0;u{let x=tP(v.partialPath);Ae(x,b=>{i[u][b]=!0})})}}}}return n}function w1(t,e,r,n){let i=new lS(t,Jn.ALTERNATION,n);return e.accept(i),Gde(i.result,r)}function k1(t,e,r,n){let i=new lS(t,r);e.accept(i);let a=i.result,l=new rP(e,t,r).startWalking(),u=new Pn({definition:a}),h=new Pn({definition:l});return Gde([u,h],n)}function uS(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function Ude(t){return Pa(t,e=>Pa(e,r=>Pa(r,n=>mr(n.categoryMatches))))}var Jn,rP,lS,E1=N(()=>{"use strict";Yt();sb();jE();Vp();ps();(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(Jn||(Jn={}));o(ob,"getProdType");o(cS,"getLookaheadPaths");o(Bde,"buildLookaheadFuncForOr");o(Fde,"buildLookaheadFuncForOptionalProd");o($de,"buildAlternativesLookAheadFunc");o(zde,"buildSingleAlternativeLookaheadFunction");rP=class extends Yu{static{o(this,"RestDefinitionFinderWalker")}constructor(e,r,n){super(),this.topProd=e,this.targetOccurrence=r,this.targetProdType=n}startWalking(){return this.walk(this.topProd),this.restDef}checkIsTarget(e,r,n,i){return e.idx===this.targetOccurrence&&this.targetProdType===r?(this.restDef=n.concat(i),!0):!1}walkOption(e,r,n){this.checkIsTarget(e,Jn.OPTION,r,n)||super.walkOption(e,r,n)}walkAtLeastOne(e,r,n){this.checkIsTarget(e,Jn.REPETITION_MANDATORY,r,n)||super.walkOption(e,r,n)}walkAtLeastOneSep(e,r,n){this.checkIsTarget(e,Jn.REPETITION_MANDATORY_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}walkMany(e,r,n){this.checkIsTarget(e,Jn.REPETITION,r,n)||super.walkOption(e,r,n)}walkManySep(e,r,n){this.checkIsTarget(e,Jn.REPETITION_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}},lS=class extends ds{static{o(this,"InsideDefinitionFinderVisitor")}constructor(e,r,n){super(),this.targetOccurrence=e,this.targetProdType=r,this.targetRef=n,this.result=[]}checkIsTarget(e,r){e.idx===this.targetOccurrence&&this.targetProdType===r&&(this.targetRef===void 0||e===this.targetRef)&&(this.result=e.definition)}visitOption(e){this.checkIsTarget(e,Jn.OPTION)}visitRepetition(e){this.checkIsTarget(e,Jn.REPETITION)}visitRepetitionMandatory(e){this.checkIsTarget(e,Jn.REPETITION_MANDATORY)}visitRepetitionMandatoryWithSeparator(e){this.checkIsTarget(e,Jn.REPETITION_MANDATORY_WITH_SEPARATOR)}visitRepetitionWithSeparator(e){this.checkIsTarget(e,Jn.REPETITION_WITH_SEPARATOR)}visitAlternation(e){this.checkIsTarget(e,Jn.ALTERNATION)}};o(Pde,"initializeArrayOfArrays");o(tP,"pathToHashKeys");o(IYe,"isUniquePrefixHash");o(Gde,"lookAheadSequenceFromAlternatives");o(w1,"getLookaheadPathsForOr");o(k1,"getLookaheadPathsForOptionalProd");o(uS,"containsPath");o(Vde,"isStrictPrefixOfPath");o(Ude,"areTokenCategoriesNotUsed")});function Hde(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return rt(e,r=>Object.assign({type:Gi.CUSTOM_LOOKAHEAD_VALIDATION},r))}function qde(t,e,r,n){let i=ga(t,u=>OYe(u,r)),a=GYe(t,e,r),s=ga(t,u=>FYe(u,r)),l=ga(t,u=>BYe(u,t,n,r));return i.concat(a,s,l)}function OYe(t,e){let r=new nP;t.accept(r);let n=r.allProductions,i=DR(n,PYe),a=Vs(i,l=>l.length>1);return rt(kr(a),l=>{let u=ea(l),h=e.buildDuplicateFoundError(t,l),f=Xs(u),d={message:h,type:Gi.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:f,occurrence:u.idx},p=Wde(u);return p&&(d.parameter=p),d})}function PYe(t){return`${Xs(t)}_#_${t.idx}_#_${Wde(t)}`}function Wde(t){return t instanceof Ar?t.terminalType.name:t instanceof fn?t.nonTerminalName:""}function BYe(t,e,r,n){let i=[];if(Jr(e,(s,l)=>l.name===t.name?s+1:s,0)>1){let s=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:s,type:Gi.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function Yde(t,e,r){let n=[],i;return jn(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:Gi.INVALID_RULE_OVERRIDE,ruleName:t})),n}function aP(t,e,r,n=[]){let i=[],a=hS(e.definition);if(mr(a))return[];{let s=t.name;jn(a,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:Gi.LEFT_RECURSION,ruleName:s});let u=lf(a,n.concat([t])),h=ga(u,f=>{let d=ln(n);return d.push(f),aP(t,f,r,d)});return i.concat(h)}}function hS(t){let e=[];if(mr(t))return e;let r=ea(t);if(r instanceof fn)e.push(r.referencedRule);else if(r instanceof Pn||r instanceof dn||r instanceof Bn||r instanceof Fn||r instanceof _n||r instanceof zr)e=e.concat(hS(r.definition));else if(r instanceof Dn)e=Qr(rt(r.definition,a=>hS(a.definition)));else if(!(r instanceof Ar))throw Error("non exhaustive match");let n=$p(r),i=t.length>1;if(n&&i){let a=yi(t);return e.concat(hS(a))}else return e}function Xde(t,e){let r=new lb;t.accept(r);let n=r.alternations;return ga(n,a=>{let s=Bu(a.definition);return ga(s,(l,u)=>{let h=oS([l],[],Xu,1);return mr(h)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:a,emptyChoiceIdx:u}),type:Gi.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:a.idx,alternative:u+1}]:[]})})}function jde(t,e,r){let n=new lb;t.accept(n);let i=n.alternations;return i=cf(i,s=>s.ignoreAmbiguities===!0),ga(i,s=>{let l=s.idx,u=s.maxLookahead||e,h=w1(l,t,u,s),f=$Ye(h,s,t,r),d=zYe(h,s,t,r);return f.concat(d)})}function FYe(t,e){let r=new lb;t.accept(r);let n=r.alternations;return ga(n,a=>a.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:a}),type:Gi.TOO_MANY_ALTS,ruleName:t.name,occurrence:a.idx}]:[])}function Kde(t,e,r){let n=[];return Ae(t,i=>{let a=new iP;i.accept(a);let s=a.allProductions;Ae(s,l=>{let u=ob(l),h=l.maxLookahead||e,f=l.idx,p=k1(f,i,u,h)[0];if(mr(Qr(p))){let m=r.buildEmptyRepetitionError({topLevelRule:i,repetition:l});n.push({message:m,type:Gi.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function $Ye(t,e,r,n){let i=[],a=Jr(t,(l,u,h)=>(e.definition[h].ignoreAmbiguities===!0||Ae(u,f=>{let d=[h];Ae(t,(p,m)=>{h!==m&&uS(p,f)&&e.definition[m].ignoreAmbiguities!==!0&&d.push(m)}),d.length>1&&!uS(i,f)&&(i.push(f),l.push({alts:d,path:f}))}),l),[]);return rt(a,l=>{let u=rt(l.alts,f=>f+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:u,prefixPath:l.path}),type:Gi.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:l.alts}})}function zYe(t,e,r,n){let i=Jr(t,(s,l,u)=>{let h=rt(l,f=>({idx:u,path:f}));return s.concat(h)},[]);return _c(ga(i,s=>{if(e.definition[s.idx].ignoreAmbiguities===!0)return[];let u=s.idx,h=s.path,f=Zr(i,p=>e.definition[p.idx].ignoreAmbiguities!==!0&&p.idx{let m=[p.idx+1,u+1],g=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:m,prefixPath:p.path}),type:Gi.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:g,alternatives:m}})}))}function GYe(t,e,r){let n=[],i=rt(e,a=>a.name);return Ae(t,a=>{let s=a.name;if(jn(i,s)){let l=r.buildNamespaceConflictError(a);n.push({message:l,type:Gi.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:s})}}),n}var nP,lb,iP,cb=N(()=>{"use strict";Yt();js();ps();E1();sb();Vp();o(Hde,"validateLookahead");o(qde,"validateGrammar");o(OYe,"validateDuplicateProductions");o(PYe,"identifyProductionForDuplicates");o(Wde,"getExtraProductionArgument");nP=class extends ds{static{o(this,"OccurrenceValidationCollector")}constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};o(BYe,"validateRuleDoesNotAlreadyExist");o(Yde,"validateRuleIsOverridden");o(aP,"validateNoLeftRecursion");o(hS,"getFirstNoneTerminal");lb=class extends ds{static{o(this,"OrCollector")}constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};o(Xde,"validateEmptyOrAlternative");o(jde,"validateAmbiguousAlternationAlternatives");iP=class extends ds{static{o(this,"RepetitionCollector")}constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};o(FYe,"validateTooManyAlts");o(Kde,"validateSomeNonEmptyLookaheadPath");o($Ye,"checkAlternativesAmbiguities");o(zYe,"checkPrefixAlternativesAmbiguities");o(GYe,"checkTerminalAndNoneTerminalsNameSpace")});function Qde(t){let e=of(t,{errMsgProvider:Mde}),r={};return Ae(t.rules,n=>{r[n.name]=n}),Ide(r,e.errMsgProvider)}function Zde(t){return t=of(t,{errMsgProvider:Gl}),qde(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var Jde=N(()=>{"use strict";Yt();Ode();cb();b1();o(Qde,"resolveGrammar");o(Zde,"validateGrammar")});function Bf(t){return jn(ipe,t.name)}var epe,tpe,rpe,npe,ipe,S1,Hp,ub,hb,fb,C1=N(()=>{"use strict";Yt();epe="MismatchedTokenException",tpe="NoViableAltException",rpe="EarlyExitException",npe="NotAllInputParsedException",ipe=[epe,tpe,rpe,npe];Object.freeze(ipe);o(Bf,"isRecognitionException");S1=class extends Error{static{o(this,"RecognitionException")}constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},Hp=class extends S1{static{o(this,"MismatchedTokenException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=epe}},ub=class extends S1{static{o(this,"NoViableAltException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=tpe}},hb=class extends S1{static{o(this,"NotAllInputParsedException")}constructor(e,r){super(e,r),this.name=npe}},fb=class extends S1{static{o(this,"EarlyExitException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=rpe}}});function VYe(t,e,r,n,i,a,s){let l=this.getKeyForAutomaticLookahead(n,i),u=this.firstAfterRepMap[l];if(u===void 0){let p=this.getCurrRuleFullName(),m=this.getGAstProductions()[p];u=new a(m,i).startWalking(),this.firstAfterRepMap[l]=u}let h=u.token,f=u.occurrence,d=u.isEndOfRule;this.RULE_STACK.length===1&&d&&h===void 0&&(h=yo,f=1),!(h===void 0||f===void 0)&&this.shouldInRepetitionRecoveryBeTried(h,f,s)&&this.tryInRepetitionRecovery(t,e,r,h)}var sP,lP,oP,fS,cP=N(()=>{"use strict";Up();Yt();C1();VO();js();sP={},lP="InRuleRecoveryException",oP=class extends Error{static{o(this,"InRuleRecoveryException")}constructor(e){super(e),this.name=lP}},fS=class{static{o(this,"Recoverable")}initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=Ft(e,"recoveryEnabled")?e.recoveryEnabled:ms.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=VYe)}getTokenToInsert(e){let r=Qu(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let a=this.findReSyncTokenType(),s=this.exportLexerState(),l=[],u=!1,h=this.LA(1),f=this.LA(1),d=o(()=>{let p=this.LA(0),m=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:h,previous:p,ruleName:this.getCurrRuleFullName()}),g=new Hp(m,h,this.LA(0));g.resyncedTokens=Bu(l),this.SAVE_ERROR(g)},"generateErrorMessage");for(;!u;)if(this.tokenMatcher(f,i)){d();return}else if(n.call(this)){d(),e.apply(this,r);return}else this.tokenMatcher(f,a)?u=!0:(f=this.SKIP_TOKEN(),this.addToResyncTokens(f,l));this.importLexerState(s)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new oP("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||mr(r))return!1;let n=this.LA(1);return os(r,a=>this.tokenMatcher(n,a))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return jn(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=os(e,a=>nb(r,a));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return sP;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return rt(e,(n,i)=>i===0?sP:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=rt(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return Qr(e)}getFollowSetFromFollowKey(e){if(e===sP)return[yo];let r=e.ruleName+e.idxInCallingRule+KE+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,yo)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return Bu(r)}attemptInRepetitionRecovery(e,r,n,i,a,s,l){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=ln(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return rt(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};o(VYe,"attemptInRepetitionRecovery")});function dS(t,e,r){return r|e|t}var pS=N(()=>{"use strict";o(dS,"getKeyForAutomaticLookahead")});var Ju,uP=N(()=>{"use strict";Yt();b1();js();cb();E1();Ju=class{static{o(this,"LLkLookaheadStrategy")}constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:ms.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(mr(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),a=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...a]}return r}validateNoLeftRecursion(e){return ga(e,r=>aP(r,r,Gl))}validateEmptyOrAlternatives(e){return ga(e,r=>Xde(r,Gl))}validateAmbiguousAlternationAlternatives(e,r){return ga(e,n=>jde(n,r,Gl))}validateSomeNonEmptyLookaheadPath(e,r){return Kde(e,r,Gl)}buildLookaheadForAlternation(e){return Bde(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,$de)}buildLookaheadForOptional(e){return Fde(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,ob(e.prodType),zde)}}});function UYe(t){mS.reset(),t.accept(mS);let e=mS.dslMethods;return mS.reset(),e}var gS,hP,mS,ape=N(()=>{"use strict";Yt();js();pS();ps();uP();gS=class{static{o(this,"LooksAhead")}initLooksAhead(e){this.dynamicTokensEnabled=Ft(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:ms.dynamicTokensEnabled,this.maxLookahead=Ft(e,"maxLookahead")?e.maxLookahead:ms.maxLookahead,this.lookaheadStrategy=Ft(e,"lookaheadStrategy")?e.lookaheadStrategy:new Ju({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){Ae(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:a,repetitionMandatory:s,repetitionMandatoryWithSeparator:l,repetitionWithSeparator:u}=UYe(r);Ae(n,h=>{let f=h.idx===0?"":h.idx;this.TRACE_INIT(`${Xs(h)}${f}`,()=>{let d=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:h.idx,rule:r,maxLookahead:h.maxLookahead||this.maxLookahead,hasPredicates:h.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),p=dS(this.fullRuleNameToShort[r.name],256,h.idx);this.setLaFuncCache(p,d)})}),Ae(i,h=>{this.computeLookaheadFunc(r,h.idx,768,"Repetition",h.maxLookahead,Xs(h))}),Ae(a,h=>{this.computeLookaheadFunc(r,h.idx,512,"Option",h.maxLookahead,Xs(h))}),Ae(s,h=>{this.computeLookaheadFunc(r,h.idx,1024,"RepetitionMandatory",h.maxLookahead,Xs(h))}),Ae(l,h=>{this.computeLookaheadFunc(r,h.idx,1536,"RepetitionMandatoryWithSeparator",h.maxLookahead,Xs(h))}),Ae(u,h=>{this.computeLookaheadFunc(r,h.idx,1280,"RepetitionWithSeparator",h.maxLookahead,Xs(h))})})})}computeLookaheadFunc(e,r,n,i,a,s){this.TRACE_INIT(`${s}${r===0?"":r}`,()=>{let l=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:a||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),u=dS(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(u,l)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return dS(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},hP=class extends ds{static{o(this,"DslMethodsCollectorVisitor")}constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},mS=new hP;o(UYe,"collectMethods")});function pP(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";o(pP,"setNodeLocationOnlyOffset");o(mP,"setNodeLocationFull");o(spe,"addTerminalToCst");o(ope,"addNoneTerminalToCst")});function gP(t,e){Object.defineProperty(t,HYe,{enumerable:!1,configurable:!0,writable:!1,value:e})}var HYe,cpe=N(()=>{"use strict";HYe="name";o(gP,"defineNameProp")});function qYe(t,e){let r=qr(t),n=r.length;for(let i=0;is.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: + ${a.join(` + +`).replace(/\n/g,` + `)}`)}},"validateVisitor")};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}function hpe(t,e,r){let n=o(function(){},"derivedConstructor");gP(n,t+"BaseSemanticsWithDefaults");let i=Object.create(r.prototype);return Ae(e,a=>{i[a]=qYe}),n.prototype=i,n.prototype.constructor=n,n}function WYe(t,e){return YYe(t,e)}function YYe(t,e){let r=Zr(e,i=>Si(t[i])===!1),n=rt(r,i=>({msg:`Missing visitor method: <${i}> on ${t.constructor.name} CST Visitor.`,type:yP.MISSING_METHOD,methodName:i}));return _c(n)}var yP,fpe=N(()=>{"use strict";Yt();cpe();o(qYe,"defaultVisit");o(upe,"createBaseSemanticVisitorConstructor");o(hpe,"createBaseVisitorConstructorWithDefaults");(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(yP||(yP={}));o(WYe,"validateVisitor");o(YYe,"validateMissingCstMethods")});var bS,dpe=N(()=>{"use strict";lpe();Yt();fpe();js();bS=class{static{o(this,"TreeBuilder")}initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=Ft(e,"nodeLocationTracking")?e.nodeLocationTracking:ms.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=si,this.cstFinallyStateUpdate=si,this.cstPostTerminal=si,this.cstPostNonTerminal=si,this.cstPostRule=si;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=mP,this.setNodeLocationFromNode=mP,this.cstPostRule=si,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=si,this.setNodeLocationFromNode=si,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=pP,this.setNodeLocationFromNode=pP,this.cstPostRule=si,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=si,this.setNodeLocationFromNode=si,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=si,this.setNodeLocationFromNode=si,this.cstPostRule=si,this.setInitialNodeLocation=si;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let r={name:e,children:Object.create(null)};this.setInitialNodeLocation(r),this.CST_STACK.push(r)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN}cstPostTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];spe(n,r,e),this.setNodeLocationFromToken(n.location,r)}cstPostNonTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];ope(n,r,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if(xr(this.baseCstVisitorConstructor)){let e=upe(this.className,qr(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if(xr(this.baseCstVisitorWithDefaultsConstructor)){let e=hpe(this.className,qr(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}}});var TS,ppe=N(()=>{"use strict";js();TS=class{static{o(this,"LexerAdapter")}initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):A1}LA(e){let r=this.currIdx+e;return r<0||this.tokVectorLength<=r?A1:this.tokVector[r]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}}});var wS,mpe=N(()=>{"use strict";Yt();C1();js();b1();cb();ps();wS=class{static{o(this,"RecognizerApi")}ACTION(e){return e.call(this)}consume(e,r,n){return this.consumeInternal(r,e,n)}subrule(e,r,n){return this.subruleInternal(r,e,n)}option(e,r){return this.optionInternal(r,e)}or(e,r){return this.orInternal(r,e)}many(e,r){return this.manyInternal(e,r)}atLeastOne(e,r){return this.atLeastOneInternal(e,r)}CONSUME(e,r){return this.consumeInternal(e,0,r)}CONSUME1(e,r){return this.consumeInternal(e,1,r)}CONSUME2(e,r){return this.consumeInternal(e,2,r)}CONSUME3(e,r){return this.consumeInternal(e,3,r)}CONSUME4(e,r){return this.consumeInternal(e,4,r)}CONSUME5(e,r){return this.consumeInternal(e,5,r)}CONSUME6(e,r){return this.consumeInternal(e,6,r)}CONSUME7(e,r){return this.consumeInternal(e,7,r)}CONSUME8(e,r){return this.consumeInternal(e,8,r)}CONSUME9(e,r){return this.consumeInternal(e,9,r)}SUBRULE(e,r){return this.subruleInternal(e,0,r)}SUBRULE1(e,r){return this.subruleInternal(e,1,r)}SUBRULE2(e,r){return this.subruleInternal(e,2,r)}SUBRULE3(e,r){return this.subruleInternal(e,3,r)}SUBRULE4(e,r){return this.subruleInternal(e,4,r)}SUBRULE5(e,r){return this.subruleInternal(e,5,r)}SUBRULE6(e,r){return this.subruleInternal(e,6,r)}SUBRULE7(e,r){return this.subruleInternal(e,7,r)}SUBRULE8(e,r){return this.subruleInternal(e,8,r)}SUBRULE9(e,r){return this.subruleInternal(e,9,r)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,r,n=_1){if(jn(this.definedRulesNames,e)){let s={message:Gl.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:Gi.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);let i=this.defineRule(e,r,n);return this[e]=i,i}OVERRIDE_RULE(e,r,n=_1){let i=Yde(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let a=this.defineRule(e,r,n);return this[e]=a,a}BACKTRACK(e,r){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(Bf(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return YE(kr(this.gastProductionsCache))}}});var kS,gpe=N(()=>{"use strict";Yt();pS();C1();E1();sb();js();cP();Up();Vp();kS=class{static{o(this,"RecognizerEngine")}initRecognizerEngine(e,r){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=v1,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},Ft(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if(Bt(e)){if(mr(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if(Bt(e))this.tokensMap=Jr(e,(a,s)=>(a[s.name]=s,a),{});else if(Ft(e,"modes")&&Pa(Qr(kr(e.modes)),Ede)){let a=Qr(kr(e.modes)),s=qm(a);this.tokensMap=Jr(s,(l,u)=>(l[u.name]=u,l),{})}else if(Sn(e))this.tokensMap=ln(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=yo;let n=Ft(e,"modes")?Qr(kr(e.modes)):kr(e),i=Pa(n,a=>mr(a.categoryMatches));this.tokenMatcher=i?v1:Xu,ju(kr(this.tokensMap))}defineRule(e,r,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=Ft(n,"resyncEnabled")?n.resyncEnabled:_1.resyncEnabled,a=Ft(n,"recoveryValueFunc")?n.recoveryValueFunc:_1.recoveryValueFunc,s=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[s]=e,this.fullRuleNameToShort[e]=s;let l;return this.outputCst===!0?l=o(function(...f){try{this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f);let d=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(d),d}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTry"):l=o(function(...f){try{return this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f)}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTryCst"),Object.assign(l,{ruleName:e,originalGrammarAction:r})}invokeRuleCatch(e,r,n){let i=this.RULE_STACK.length===1,a=r&&!this.isBackTracking()&&this.recoveryEnabled;if(Bf(e)){let s=e;if(a){let l=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(l))if(s.resyncedTokens=this.reSyncTo(l),this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];return u.recoveredNode=!0,u}else return n(e);else{if(this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];u.recoveredNode=!0,s.partialCstResult=u}throw s}}else{if(i)return this.moveToTerminatedState(),n(e);throw s}}else throw e}optionInternal(e,r){let n=this.getKeyForAutomaticLookahead(512,r);return this.optionInternalLogic(e,r,n)}optionInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof e!="function"){a=e.DEF;let s=e.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=e;if(i.call(this)===!0)return a.call(this)}atLeastOneInternal(e,r){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,r,n)}atLeastOneInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let s=r.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=r;if(i.call(this)===!0){let s=this.doSingleRepetition(a);for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a)}else throw this.raiseEarlyExitException(e,Jn.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],i,1024,e,aS)}atLeastOneSepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,r,n)}atLeastOneSepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,ab],l,1536,e,ab)}else throw this.raiseEarlyExitException(e,Jn.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)}manyInternal(e,r){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,r,n)}manyInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let l=r.GATE;if(l!==void 0){let u=i;i=o(()=>l.call(this)&&u.call(this),"lookaheadFunction")}}else a=r;let s=!0;for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],i,768,e,iS,s)}manySepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,r,n)}manySepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,ib],l,1280,e,ib)}}repetitionSepSecondInternal(e,r,n,i,a){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,a],n,1536,e,a)}doSingleRepetition(e){let r=this.getLexerPosition();return e.call(this),this.getLexerPosition()>r}orInternal(e,r){let n=this.getKeyForAutomaticLookahead(256,r),i=Bt(e)?e:e.DEF,s=this.getLaFuncFromCache(n).call(this,i);if(s!==void 0)return i[s].ALT.call(this);this.raiseNoAltException(r,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new hb(r,e))}}subruleInternal(e,r,n){let i;try{let a=n!==void 0?n.ARGS:void 0;return this.subruleIdx=r,i=e.apply(this,a),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(a){throw this.subruleInternalError(a,n,e.ruleName)}}subruleInternalError(e,r,n){throw Bf(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,r,n){let i;try{let a=this.LA(1);this.tokenMatcher(a,e)===!0?(this.consumeToken(),i=a):this.consumeInternalError(e,a,n)}catch(a){i=this.consumeInternalRecovery(e,r,a)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,r,n){let i,a=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:a,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new Hp(i,r,a))}consumeInternalRecovery(e,r,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(a){throw a.name===lP?n:a}}else throw n}saveRecogState(){let e=this.errors,r=ln(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),yo)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}}});var ES,ype=N(()=>{"use strict";C1();Yt();E1();js();ES=class{static{o(this,"ErrorHandler")}initErrorHandler(e){this._errors=[],this.errorMessageProvider=Ft(e,"errorMessageProvider")?e.errorMessageProvider:ms.errorMessageProvider}SAVE_ERROR(e){if(Bf(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:ln(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return ln(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,r,n){let i=this.getCurrRuleFullName(),a=this.getGAstProductions()[i],l=k1(e,a,r,this.maxLookahead)[0],u=[];for(let f=1;f<=this.maxLookahead;f++)u.push(this.LA(f));let h=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:l,actual:u,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new fb(h,this.LA(1),this.LA(0)))}raiseNoAltException(e,r){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],a=w1(e,i,this.maxLookahead),s=[];for(let h=1;h<=this.maxLookahead;h++)s.push(this.LA(h));let l=this.LA(0),u=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:a,actual:s,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new ub(u,this.LA(1),l))}}});var SS,vpe=N(()=>{"use strict";sb();Yt();SS=class{static{o(this,"ContentAssist")}initContentAssist(){}computeContentAssist(e,r){let n=this.gastProductionsCache[e];if(xr(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return oS([n],r,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let r=ea(e.ruleStack),i=this.getGAstProductions()[r];return new nS(i,e).startWalking()}}});function pb(t,e,r,n=!1){AS(r);let i=ma(this.recordingProdStack),a=Si(e)?e:e.DEF,s=new t({definition:[],idx:r});return n&&(s.separator=e.SEP),Ft(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),_S}function KYe(t,e){AS(e);let r=ma(this.recordingProdStack),n=Bt(t)===!1,i=n===!1?t:t.DEF,a=new Dn({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});Ft(t,"MAX_LOOKAHEAD")&&(a.maxLookahead=t.MAX_LOOKAHEAD);let s=z2(i,l=>Si(l.GATE));return a.hasPredicates=s,r.definition.push(a),Ae(i,l=>{let u=new Pn({definition:[]});a.definition.push(u),Ft(l,"IGNORE_AMBIGUITIES")?u.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:Ft(l,"GATE")&&(u.ignoreAmbiguities=!0),this.recordingProdStack.push(u),l.ALT.call(this),this.recordingProdStack.pop()}),_S}function Tpe(t){return t===0?"":`${t}`}function AS(t){if(t<0||t>bpe){let e=new Error(`Invalid DSL Method idx value: <${t}> + Idx value must be a none negative value smaller than ${bpe+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}var _S,xpe,bpe,wpe,kpe,jYe,CS,Epe=N(()=>{"use strict";Yt();ps();tb();Vp();Up();js();pS();_S={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(_S);xpe=!0,bpe=Math.pow(2,8)-1,wpe=Pf({name:"RECORDING_PHASE_TOKEN",pattern:Zn.NA});ju([wpe]);kpe=Qu(wpe,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(kpe);jYe={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},CS=class{static{o(this,"GastRecorder")}initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let r=e>0?e:"";this[`CONSUME${r}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${r}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${r}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${r}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${r}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${r}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${r}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${r}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,r,n){return this.consumeInternalRecord(r,e,n)},this.subrule=function(e,r,n){return this.subruleInternalRecord(r,e,n)},this.option=function(e,r){return this.optionInternalRecord(r,e)},this.or=function(e,r){return this.orInternalRecord(r,e)},this.many=function(e,r){this.manyInternalRecord(e,r)},this.atLeastOne=function(e,r){this.atLeastOneInternalRecord(e,r)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let r=0;r<10;r++){let n=r>0?r:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,r){return()=>!0}LA_RECORD(e){return A1}topLevelRuleRecord(e,r){try{let n=new fs({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}}optionInternalRecord(e,r){return pb.call(this,dn,e,r)}atLeastOneInternalRecord(e,r){pb.call(this,Bn,r,e)}atLeastOneSepFirstInternalRecord(e,r){pb.call(this,Fn,r,e,xpe)}manyInternalRecord(e,r){pb.call(this,zr,r,e)}manySepFirstInternalRecord(e,r){pb.call(this,_n,r,e,xpe)}orInternalRecord(e,r){return KYe.call(this,e,r)}subruleInternalRecord(e,r,n){if(AS(r),!e||Ft(e,"ruleName")===!1){let l=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw l.KNOWN_RECORDER_ERROR=!0,l}let i=ma(this.recordingProdStack),a=e.ruleName,s=new fn({idx:r,nonTerminalName:a,label:n?.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?jYe:_S}consumeInternalRecord(e,r,n){if(AS(r),!KO(e)){let s=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw s.KNOWN_RECORDER_ERROR=!0,s}let i=ma(this.recordingProdStack),a=new Ar({idx:r,terminalType:e,label:n?.LABEL});return i.definition.push(a),kpe}};o(pb,"recordProd");o(KYe,"recordOrProd");o(Tpe,"getIdxSuffix");o(AS,"assertMethodIdxIsValid")});var DS,Spe=N(()=>{"use strict";Yt();d1();js();DS=class{static{o(this,"PerformanceTracer")}initPerformanceTracer(e){if(Ft(e,"traceInitPerf")){let r=e.traceInitPerf,n=typeof r=="number";this.traceInitMaxIdent=n?r:1/0,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=ms.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:a}=Zx(r),s=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,a}else return r()}}});function Cpe(t,e){e.forEach(r=>{let n=r.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let a=Object.getOwnPropertyDescriptor(n,i);a&&(a.get||a.set)?Object.defineProperty(t.prototype,i,a):t.prototype[i]=r.prototype[i]})})}var Ape=N(()=>{"use strict";o(Cpe,"applyMixins")});function LS(t=void 0){return function(){return t}}var A1,ms,_1,Gi,mb,gb,js=N(()=>{"use strict";Yt();d1();nde();Up();b1();Jde();cP();ape();dpe();ppe();mpe();gpe();ype();vpe();Epe();Spe();Ape();cb();A1=Qu(yo,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(A1);ms=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Zu,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),_1=Object.freeze({recoveryValueFunc:o(()=>{},"recoveryValueFunc"),resyncEnabled:!0});(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",t[t.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"})(Gi||(Gi={}));o(LS,"EMPTY_ALT");mb=class t{static{o(this,"Parser")}static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let e;this.selfAnalysisDone=!0;let r=this.className;this.TRACE_INIT("toFastProps",()=>{Jx(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),Ae(this.definedRulesNames,i=>{let s=this[i].originalGrammarAction,l;this.TRACE_INIT(`${i} Rule`,()=>{l=this.topLevelRuleRecord(i,s)}),this.gastProductionsCache[i]=l})}finally{this.disableRecording()}});let n=[];if(this.TRACE_INIT("Grammar Resolving",()=>{n=Qde({rules:kr(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)}),this.TRACE_INIT("Grammar Validations",()=>{if(mr(n)&&this.skipValidations===!1){let i=Zde({rules:kr(this.gastProductionsCache),tokenTypes:kr(this.tokensMap),errMsgProvider:Gl,grammarName:r}),a=Hde({lookaheadStrategy:this.lookaheadStrategy,rules:kr(this.gastProductionsCache),tokenTypes:kr(this.tokensMap),grammarName:r});this.definitionErrors=this.definitionErrors.concat(i,a)}}),mr(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let i=rde(kr(this.gastProductionsCache));this.resyncFollows=i}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var i,a;(a=(i=this.lookaheadStrategy).initialize)===null||a===void 0||a.call(i,{rules:kr(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(kr(this.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!mr(this.definitionErrors))throw e=rt(this.definitionErrors,i=>i.message),new Error(`Parser Definition Errors detected: + ${e.join(` +------------------------------- +`)}`)})}constructor(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;let n=this;if(n.initErrorHandler(r),n.initLexerAdapter(),n.initLooksAhead(r),n.initRecognizerEngine(e,r),n.initRecoverable(r),n.initTreeBuilder(r),n.initContentAssist(),n.initGastRecorder(r),n.initPerformanceTracer(r),Ft(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=Ft(r,"skipValidations")?r.skipValidations:ms.skipValidations}};mb.DEFER_DEFINITION_ERRORS_HANDLING=!1;Cpe(mb,[fS,gS,bS,TS,kS,wS,ES,SS,CS,DS]);gb=class extends mb{static{o(this,"EmbeddedActionsParser")}constructor(e,r=ms){let n=ln(r);n.outputCst=!1,super(e,n)}}});var _pe=N(()=>{"use strict";ps()});var Dpe=N(()=>{"use strict"});var Lpe=N(()=>{"use strict";_pe();Dpe()});var Rpe=N(()=>{"use strict";FO()});var Ff=N(()=>{"use strict";FO();js();tb();Up();E1();uP();b1();C1();QO();ps();ps();Lpe();Rpe()});function qp(t,e,r){return`${t.name}_${e}_${r}`}function Ope(t){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};nXe(e,t);let r=t.length;for(let n=0;nPpe(t,e,s));return N1(t,e,n,r,...i)}function cXe(t,e,r){let n=ia(t,e,r,{type:$f});zf(t,n);let i=N1(t,e,n,r,Wp(t,e,r));return uXe(t,e,r,i)}function Wp(t,e,r){let n=Zr(rt(r.definition,i=>Ppe(t,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:fXe(t,n)}function Bpe(t,e,r,n,i){let a=n.left,s=n.right,l=ia(t,e,r,{type:rXe});zf(t,l);let u=ia(t,e,r,{type:Ipe});return a.loopback=l,u.loopback=l,t.decisionMap[qp(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",r.idx)]=l,Di(s,l),i===void 0?(Di(l,a),Di(l,u)):(Di(l,u),Di(l,i.left),Di(i.right,a)),{left:a,right:u}}function Fpe(t,e,r,n,i){let a=n.left,s=n.right,l=ia(t,e,r,{type:tXe});zf(t,l);let u=ia(t,e,r,{type:Ipe}),h=ia(t,e,r,{type:eXe});return l.loopback=h,u.loopback=h,Di(l,a),Di(l,u),Di(s,h),i!==void 0?(Di(h,u),Di(h,i.left),Di(i.right,a)):Di(h,l),t.decisionMap[qp(e,i?"RepetitionWithSeparator":"Repetition",r.idx)]=l,{left:l,right:u}}function uXe(t,e,r,n){let i=n.left,a=n.right;return Di(i,a),t.decisionMap[qp(e,"Option",r.idx)]=i,n}function zf(t,e){return t.decisionStates.push(e),e.decision=t.decisionStates.length-1,e.decision}function N1(t,e,r,n,...i){let a=ia(t,e,n,{type:JYe,start:r});r.end=a;for(let l of i)l!==void 0?(Di(r,l.left),Di(l.right,a)):Di(r,a);let s={left:r,right:a};return t.decisionMap[qp(e,hXe(n),n.idx)]=r,s}function hXe(t){if(t instanceof Dn)return"Alternation";if(t instanceof dn)return"Option";if(t instanceof zr)return"Repetition";if(t instanceof _n)return"RepetitionWithSeparator";if(t instanceof Bn)return"RepetitionMandatory";if(t instanceof Fn)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}function fXe(t,e){let r=e.length;for(let a=0;a{"use strict";Vm();ER();Ff();o(qp,"buildATNKey");$f=1,ZYe=2,Npe=4,Mpe=5,R1=7,JYe=8,eXe=9,tXe=10,rXe=11,Ipe=12,yb=class{static{o(this,"AbstractTransition")}constructor(e){this.target=e}isEpsilon(){return!1}},D1=class extends yb{static{o(this,"AtomTransition")}constructor(e,r){super(e),this.tokenType=r}},vb=class extends yb{static{o(this,"EpsilonTransition")}constructor(e){super(e)}isEpsilon(){return!0}},L1=class extends yb{static{o(this,"RuleTransition")}constructor(e,r,n){super(e),this.rule=r,this.followState=n}isEpsilon(){return!0}};o(Ope,"createATN");o(nXe,"createRuleStartAndStopATNStates");o(Ppe,"atom");o(iXe,"repetition");o(aXe,"repetitionSep");o(sXe,"repetitionMandatory");o(oXe,"repetitionMandatorySep");o(lXe,"alternation");o(cXe,"option");o(Wp,"block");o(Bpe,"plus");o(Fpe,"star");o(uXe,"optional");o(zf,"defineDecisionState");o(N1,"makeAlts");o(hXe,"getProdType");o(fXe,"makeBlock");o(xP,"tokenRef");o(dXe,"ruleRef");o(pXe,"buildRuleHandle");o(Di,"epsilon");o(ia,"newState");o(bP,"addTransition");o(mXe,"removeState")});function TP(t,e=!0){return`${e?`a${t.alt}`:""}s${t.state.stateNumber}:${t.stack.map(r=>r.stateNumber.toString()).join("_")}`}var xb,M1,zpe=N(()=>{"use strict";Vm();xb={},M1=class{static{o(this,"ATNConfigSet")}constructor(){this.map={},this.configs=[]}get size(){return this.configs.length}finalize(){this.map={}}add(e){let r=TP(e);r in this.map||(this.map[r]=this.configs.length,this.configs.push(e))}get elements(){return this.configs}get alts(){return rt(this.configs,e=>e.alt)}get key(){let e="";for(let r in this.map)e+=r+":";return e}};o(TP,"getATNConfigKey")});function gXe(t,e){let r={};return n=>{let i=n.toString(),a=r[i];return a!==void 0||(a={atnStartState:t,decision:e,states:{}},r[i]=a),a}}function Vpe(t,e=!0){let r=new Set;for(let n of t){let i=new Set;for(let a of n){if(a===void 0){if(e)break;return!1}let s=[a.tokenTypeIdx].concat(a.categoryMatches);for(let l of s)if(r.has(l)){if(!i.has(l))return!1}else r.add(l),i.add(l)}}return!0}function yXe(t){let e=t.decisionStates.length,r=Array(e);for(let n=0;nKu(i)).join(", "),r=t.production.idx===0?"":t.production.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(", ")}> in <${wXe(t.production)}${r}> inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n}function wXe(t){if(t instanceof fn)return"SUBRULE";if(t instanceof dn)return"OPTION";if(t instanceof Dn)return"OR";if(t instanceof Bn)return"AT_LEAST_ONE";if(t instanceof Fn)return"AT_LEAST_ONE_SEP";if(t instanceof _n)return"MANY_SEP";if(t instanceof zr)return"MANY";if(t instanceof Ar)return"CONSUME";throw Error("non exhaustive match")}function kXe(t,e,r){let n=ga(e.configs.elements,a=>a.state.transitions),i=Uae(n.filter(a=>a instanceof D1).map(a=>a.tokenType),a=>a.tokenTypeIdx);return{actualToken:r,possibleTokenTypes:i,tokenPath:t}}function EXe(t,e){return t.edges[e.tokenTypeIdx]}function SXe(t,e,r){let n=new M1,i=[];for(let s of t.elements){if(r.is(s.alt)===!1)continue;if(s.state.type===R1){i.push(s);continue}let l=s.state.transitions.length;for(let u=0;u0&&!LXe(a))for(let s of i)a.add(s);return a}function CXe(t,e){if(t instanceof D1&&nb(e,t.tokenType))return t.target}function AXe(t,e){let r;for(let n of t.elements)if(e.is(n.alt)===!0){if(r===void 0)r=n.alt;else if(r!==n.alt)return}return r}function Hpe(t){return{configs:t,edges:{},isAcceptState:!1,prediction:-1}}function Upe(t,e,r,n){return n=qpe(t,n),e.edges[r.tokenTypeIdx]=n,n}function qpe(t,e){if(e===xb)return e;let r=e.configs.key,n=t.states[r];return n!==void 0?n:(e.configs.finalize(),t.states[r]=e,e)}function _Xe(t){let e=new M1,r=t.transitions.length;for(let n=0;n0){let i=[...t.stack],s={state:i.pop(),alt:t.alt,stack:i};NS(s,e)}else e.add(t);return}r.epsilonOnlyTransitions||e.add(t);let n=r.transitions.length;for(let i=0;i1)return!0;return!1}function OXe(t){for(let e of Array.from(t.values()))if(Object.keys(e).length===1)return!0;return!1}var RS,Gpe,bb,Wpe=N(()=>{"use strict";Ff();$pe();zpe();NR();CR();Hae();Vm();Lw();ak();uk();PR();o(gXe,"createDFACache");RS=class{static{o(this,"PredicateSet")}constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,r){this.predicates[e]=r}toString(){let e="",r=this.predicates.length;for(let n=0;nconsole.log(n))}initialize(e){this.atn=Ope(e.rules),this.dfas=yXe(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:r,rule:n,hasPredicates:i,dynamicTokensEnabled:a}=e,s=this.dfas,l=this.logging,u=qp(n,"Alternation",r),f=this.atn.decisionMap[u].decision,d=rt(cS({maxLookahead:1,occurrence:r,prodType:"Alternation",rule:n}),p=>rt(p,m=>m[0]));if(Vpe(d,!1)&&!a){let p=Jr(d,(m,g,y)=>(Ae(g,v=>{v&&(m[v.tokenTypeIdx]=y,Ae(v.categoryMatches,x=>{m[x]=y}))}),m),{});return i?function(m){var g;let y=this.LA(1),v=p[y.tokenTypeIdx];if(m!==void 0&&v!==void 0){let x=(g=m[v])===null||g===void 0?void 0:g.GATE;if(x!==void 0&&x.call(this)===!1)return}return v}:function(){let m=this.LA(1);return p[m.tokenTypeIdx]}}else return i?function(p){let m=new RS,g=p===void 0?0:p.length;for(let v=0;vrt(p,m=>m[0]));if(Vpe(d)&&d[0][0]&&!a){let p=d[0],m=Qr(p);if(m.length===1&&mr(m[0].categoryMatches)){let y=m[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===y}}else{let g=Jr(m,(y,v)=>(v!==void 0&&(y[v.tokenTypeIdx]=!0,Ae(v.categoryMatches,x=>{y[x]=!0})),y),{});return function(){let y=this.LA(1);return g[y.tokenTypeIdx]===!0}}}return function(){let p=wP.call(this,s,f,Gpe,l);return typeof p=="object"?!1:p===0}}};o(Vpe,"isLL1Sequence");o(yXe,"initATNSimulator");o(wP,"adaptivePredict");o(vXe,"performLookahead");o(xXe,"computeLookaheadTarget");o(bXe,"reportLookaheadAmbiguity");o(TXe,"buildAmbiguityError");o(wXe,"getProductionDslName");o(kXe,"buildAdaptivePredictError");o(EXe,"getExistingTargetState");o(SXe,"computeReachSet");o(CXe,"getReachableTarget");o(AXe,"getUniqueAlt");o(Hpe,"newDFAState");o(Upe,"addDFAEdge");o(qpe,"addDFAState");o(_Xe,"computeStartState");o(NS,"closure");o(DXe,"getEpsilonTarget");o(LXe,"hasConfigInRuleStopState");o(RXe,"allConfigsInRuleStopStates");o(NXe,"hasConflictTerminatingPrediction");o(MXe,"getConflictingAltSets");o(IXe,"hasConflictingAltSet");o(OXe,"hasStateAssociatedWithOneAlt")});var Ype=N(()=>{"use strict";Wpe()});var Xpe,kP,jpe,MS,tn,Gr,IS,Kpe,EP,Qpe,Zpe,Jpe,e0e,SP,t0e,r0e,n0e,OS,I1,O1,CP,P1,i0e,AP,_P,DP,LP,RP,a0e,s0e,NP,o0e,MP,Tb,l0e,c0e,u0e,h0e,f0e,d0e,p0e,m0e,PS,g0e,y0e,v0e,x0e,b0e,T0e,w0e,k0e,E0e,S0e,C0e,BS,A0e,_0e,D0e,L0e,R0e,N0e,M0e,I0e,O0e,P0e,B0e,F0e,$0e,IP,OP,z0e,G0e,V0e,U0e,H0e,q0e,W0e,Y0e,X0e,PP,Ge,BP=N(()=>{"use strict";(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(Xpe||(Xpe={}));(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(kP||(kP={}));(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(jpe||(jpe={}));(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(MS||(MS={}));(function(t){function e(n,i){return n===Number.MAX_VALUE&&(n=MS.MAX_VALUE),i===Number.MAX_VALUE&&(i=MS.MAX_VALUE),{line:n,character:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.uinteger(i.line)&&Ge.uinteger(i.character)}o(r,"is"),t.is=r})(tn||(tn={}));(function(t){function e(n,i,a,s){if(Ge.uinteger(n)&&Ge.uinteger(i)&&Ge.uinteger(a)&&Ge.uinteger(s))return{start:tn.create(n,i),end:tn.create(a,s)};if(tn.is(n)&&tn.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${a}, ${s}]`)}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&tn.is(i.start)&&tn.is(i.end)}o(r,"is"),t.is=r})(Gr||(Gr={}));(function(t){function e(n,i){return{uri:n,range:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Gr.is(i.range)&&(Ge.string(i.uri)||Ge.undefined(i.uri))}o(r,"is"),t.is=r})(IS||(IS={}));(function(t){function e(n,i,a,s){return{targetUri:n,targetRange:i,targetSelectionRange:a,originSelectionRange:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Gr.is(i.targetRange)&&Ge.string(i.targetUri)&&Gr.is(i.targetSelectionRange)&&(Gr.is(i.originSelectionRange)||Ge.undefined(i.originSelectionRange))}o(r,"is"),t.is=r})(Kpe||(Kpe={}));(function(t){function e(n,i,a,s){return{red:n,green:i,blue:a,alpha:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.numberRange(i.red,0,1)&&Ge.numberRange(i.green,0,1)&&Ge.numberRange(i.blue,0,1)&&Ge.numberRange(i.alpha,0,1)}o(r,"is"),t.is=r})(EP||(EP={}));(function(t){function e(n,i){return{range:n,color:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Gr.is(i.range)&&EP.is(i.color)}o(r,"is"),t.is=r})(Qpe||(Qpe={}));(function(t){function e(n,i,a){return{label:n,textEdit:i,additionalTextEdits:a}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.string(i.label)&&(Ge.undefined(i.textEdit)||O1.is(i))&&(Ge.undefined(i.additionalTextEdits)||Ge.typedArray(i.additionalTextEdits,O1.is))}o(r,"is"),t.is=r})(Zpe||(Zpe={}));(function(t){t.Comment="comment",t.Imports="imports",t.Region="region"})(Jpe||(Jpe={}));(function(t){function e(n,i,a,s,l,u){let h={startLine:n,endLine:i};return Ge.defined(a)&&(h.startCharacter=a),Ge.defined(s)&&(h.endCharacter=s),Ge.defined(l)&&(h.kind=l),Ge.defined(u)&&(h.collapsedText=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.uinteger(i.startLine)&&Ge.uinteger(i.startLine)&&(Ge.undefined(i.startCharacter)||Ge.uinteger(i.startCharacter))&&(Ge.undefined(i.endCharacter)||Ge.uinteger(i.endCharacter))&&(Ge.undefined(i.kind)||Ge.string(i.kind))}o(r,"is"),t.is=r})(e0e||(e0e={}));(function(t){function e(n,i){return{location:n,message:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&IS.is(i.location)&&Ge.string(i.message)}o(r,"is"),t.is=r})(SP||(SP={}));(function(t){t.Error=1,t.Warning=2,t.Information=3,t.Hint=4})(t0e||(t0e={}));(function(t){t.Unnecessary=1,t.Deprecated=2})(r0e||(r0e={}));(function(t){function e(r){let n=r;return Ge.objectLiteral(n)&&Ge.string(n.href)}o(e,"is"),t.is=e})(n0e||(n0e={}));(function(t){function e(n,i,a,s,l,u){let h={range:n,message:i};return Ge.defined(a)&&(h.severity=a),Ge.defined(s)&&(h.code=s),Ge.defined(l)&&(h.source=l),Ge.defined(u)&&(h.relatedInformation=u),h}o(e,"create"),t.create=e;function r(n){var i;let a=n;return Ge.defined(a)&&Gr.is(a.range)&&Ge.string(a.message)&&(Ge.number(a.severity)||Ge.undefined(a.severity))&&(Ge.integer(a.code)||Ge.string(a.code)||Ge.undefined(a.code))&&(Ge.undefined(a.codeDescription)||Ge.string((i=a.codeDescription)===null||i===void 0?void 0:i.href))&&(Ge.string(a.source)||Ge.undefined(a.source))&&(Ge.undefined(a.relatedInformation)||Ge.typedArray(a.relatedInformation,SP.is))}o(r,"is"),t.is=r})(OS||(OS={}));(function(t){function e(n,i,...a){let s={title:n,command:i};return Ge.defined(a)&&a.length>0&&(s.arguments=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.title)&&Ge.string(i.command)}o(r,"is"),t.is=r})(I1||(I1={}));(function(t){function e(a,s){return{range:a,newText:s}}o(e,"replace"),t.replace=e;function r(a,s){return{range:{start:a,end:a},newText:s}}o(r,"insert"),t.insert=r;function n(a){return{range:a,newText:""}}o(n,"del"),t.del=n;function i(a){let s=a;return Ge.objectLiteral(s)&&Ge.string(s.newText)&&Gr.is(s.range)}o(i,"is"),t.is=i})(O1||(O1={}));(function(t){function e(n,i,a){let s={label:n};return i!==void 0&&(s.needsConfirmation=i),a!==void 0&&(s.description=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.string(i.label)&&(Ge.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(Ge.string(i.description)||i.description===void 0)}o(r,"is"),t.is=r})(CP||(CP={}));(function(t){function e(r){let n=r;return Ge.string(n)}o(e,"is"),t.is=e})(P1||(P1={}));(function(t){function e(a,s,l){return{range:a,newText:s,annotationId:l}}o(e,"replace"),t.replace=e;function r(a,s,l){return{range:{start:a,end:a},newText:s,annotationId:l}}o(r,"insert"),t.insert=r;function n(a,s){return{range:a,newText:"",annotationId:s}}o(n,"del"),t.del=n;function i(a){let s=a;return O1.is(s)&&(CP.is(s.annotationId)||P1.is(s.annotationId))}o(i,"is"),t.is=i})(i0e||(i0e={}));(function(t){function e(n,i){return{textDocument:n,edits:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&NP.is(i.textDocument)&&Array.isArray(i.edits)}o(r,"is"),t.is=r})(AP||(AP={}));(function(t){function e(n,i,a){let s={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="create"&&Ge.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||Ge.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||Ge.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||P1.is(i.annotationId))}o(r,"is"),t.is=r})(_P||(_P={}));(function(t){function e(n,i,a,s){let l={kind:"rename",oldUri:n,newUri:i};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(l.options=a),s!==void 0&&(l.annotationId=s),l}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="rename"&&Ge.string(i.oldUri)&&Ge.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||Ge.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||Ge.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||P1.is(i.annotationId))}o(r,"is"),t.is=r})(DP||(DP={}));(function(t){function e(n,i,a){let s={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="delete"&&Ge.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||Ge.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||Ge.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||P1.is(i.annotationId))}o(r,"is"),t.is=r})(LP||(LP={}));(function(t){function e(r){let n=r;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>Ge.string(i.kind)?_P.is(i)||DP.is(i)||LP.is(i):AP.is(i)))}o(e,"is"),t.is=e})(RP||(RP={}));(function(t){function e(n){return{uri:n}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.uri)}o(r,"is"),t.is=r})(a0e||(a0e={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.uri)&&Ge.integer(i.version)}o(r,"is"),t.is=r})(s0e||(s0e={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.uri)&&(i.version===null||Ge.integer(i.version))}o(r,"is"),t.is=r})(NP||(NP={}));(function(t){function e(n,i,a,s){return{uri:n,languageId:i,version:a,text:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.uri)&&Ge.string(i.languageId)&&Ge.integer(i.version)&&Ge.string(i.text)}o(r,"is"),t.is=r})(o0e||(o0e={}));(function(t){t.PlainText="plaintext",t.Markdown="markdown";function e(r){let n=r;return n===t.PlainText||n===t.Markdown}o(e,"is"),t.is=e})(MP||(MP={}));(function(t){function e(r){let n=r;return Ge.objectLiteral(r)&&MP.is(n.kind)&&Ge.string(n.value)}o(e,"is"),t.is=e})(Tb||(Tb={}));(function(t){t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25})(l0e||(l0e={}));(function(t){t.PlainText=1,t.Snippet=2})(c0e||(c0e={}));(function(t){t.Deprecated=1})(u0e||(u0e={}));(function(t){function e(n,i,a){return{newText:n,insert:i,replace:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Ge.string(i.newText)&&Gr.is(i.insert)&&Gr.is(i.replace)}o(r,"is"),t.is=r})(h0e||(h0e={}));(function(t){t.asIs=1,t.adjustIndentation=2})(f0e||(f0e={}));(function(t){function e(r){let n=r;return n&&(Ge.string(n.detail)||n.detail===void 0)&&(Ge.string(n.description)||n.description===void 0)}o(e,"is"),t.is=e})(d0e||(d0e={}));(function(t){function e(r){return{label:r}}o(e,"create"),t.create=e})(p0e||(p0e={}));(function(t){function e(r,n){return{items:r||[],isIncomplete:!!n}}o(e,"create"),t.create=e})(m0e||(m0e={}));(function(t){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}o(e,"fromPlainText"),t.fromPlainText=e;function r(n){let i=n;return Ge.string(i)||Ge.objectLiteral(i)&&Ge.string(i.language)&&Ge.string(i.value)}o(r,"is"),t.is=r})(PS||(PS={}));(function(t){function e(r){let n=r;return!!n&&Ge.objectLiteral(n)&&(Tb.is(n.contents)||PS.is(n.contents)||Ge.typedArray(n.contents,PS.is))&&(r.range===void 0||Gr.is(r.range))}o(e,"is"),t.is=e})(g0e||(g0e={}));(function(t){function e(r,n){return n?{label:r,documentation:n}:{label:r}}o(e,"create"),t.create=e})(y0e||(y0e={}));(function(t){function e(r,n,...i){let a={label:r};return Ge.defined(n)&&(a.documentation=n),Ge.defined(i)?a.parameters=i:a.parameters=[],a}o(e,"create"),t.create=e})(v0e||(v0e={}));(function(t){t.Text=1,t.Read=2,t.Write=3})(x0e||(x0e={}));(function(t){function e(r,n){let i={range:r};return Ge.number(n)&&(i.kind=n),i}o(e,"create"),t.create=e})(b0e||(b0e={}));(function(t){t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26})(T0e||(T0e={}));(function(t){t.Deprecated=1})(w0e||(w0e={}));(function(t){function e(r,n,i,a,s){let l={name:r,kind:n,location:{uri:a,range:i}};return s&&(l.containerName=s),l}o(e,"create"),t.create=e})(k0e||(k0e={}));(function(t){function e(r,n,i,a){return a!==void 0?{name:r,kind:n,location:{uri:i,range:a}}:{name:r,kind:n,location:{uri:i}}}o(e,"create"),t.create=e})(E0e||(E0e={}));(function(t){function e(n,i,a,s,l,u){let h={name:n,detail:i,kind:a,range:s,selectionRange:l};return u!==void 0&&(h.children=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Ge.string(i.name)&&Ge.number(i.kind)&&Gr.is(i.range)&&Gr.is(i.selectionRange)&&(i.detail===void 0||Ge.string(i.detail))&&(i.deprecated===void 0||Ge.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}o(r,"is"),t.is=r})(S0e||(S0e={}));(function(t){t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll"})(C0e||(C0e={}));(function(t){t.Invoked=1,t.Automatic=2})(BS||(BS={}));(function(t){function e(n,i,a){let s={diagnostics:n};return i!=null&&(s.only=i),a!=null&&(s.triggerKind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.typedArray(i.diagnostics,OS.is)&&(i.only===void 0||Ge.typedArray(i.only,Ge.string))&&(i.triggerKind===void 0||i.triggerKind===BS.Invoked||i.triggerKind===BS.Automatic)}o(r,"is"),t.is=r})(A0e||(A0e={}));(function(t){function e(n,i,a){let s={title:n},l=!0;return typeof i=="string"?(l=!1,s.kind=i):I1.is(i)?s.command=i:s.edit=i,l&&a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Ge.string(i.title)&&(i.diagnostics===void 0||Ge.typedArray(i.diagnostics,OS.is))&&(i.kind===void 0||Ge.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||I1.is(i.command))&&(i.isPreferred===void 0||Ge.boolean(i.isPreferred))&&(i.edit===void 0||RP.is(i.edit))}o(r,"is"),t.is=r})(_0e||(_0e={}));(function(t){function e(n,i){let a={range:n};return Ge.defined(i)&&(a.data=i),a}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Gr.is(i.range)&&(Ge.undefined(i.command)||I1.is(i.command))}o(r,"is"),t.is=r})(D0e||(D0e={}));(function(t){function e(n,i){return{tabSize:n,insertSpaces:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.uinteger(i.tabSize)&&Ge.boolean(i.insertSpaces)}o(r,"is"),t.is=r})(L0e||(L0e={}));(function(t){function e(n,i,a){return{range:n,target:i,data:a}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Gr.is(i.range)&&(Ge.undefined(i.target)||Ge.string(i.target))}o(r,"is"),t.is=r})(R0e||(R0e={}));(function(t){function e(n,i){return{range:n,parent:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Gr.is(i.range)&&(i.parent===void 0||t.is(i.parent))}o(r,"is"),t.is=r})(N0e||(N0e={}));(function(t){t.namespace="namespace",t.type="type",t.class="class",t.enum="enum",t.interface="interface",t.struct="struct",t.typeParameter="typeParameter",t.parameter="parameter",t.variable="variable",t.property="property",t.enumMember="enumMember",t.event="event",t.function="function",t.method="method",t.macro="macro",t.keyword="keyword",t.modifier="modifier",t.comment="comment",t.string="string",t.number="number",t.regexp="regexp",t.operator="operator",t.decorator="decorator"})(M0e||(M0e={}));(function(t){t.declaration="declaration",t.definition="definition",t.readonly="readonly",t.static="static",t.deprecated="deprecated",t.abstract="abstract",t.async="async",t.modification="modification",t.documentation="documentation",t.defaultLibrary="defaultLibrary"})(I0e||(I0e={}));(function(t){function e(r){let n=r;return Ge.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}o(e,"is"),t.is=e})(O0e||(O0e={}));(function(t){function e(n,i){return{range:n,text:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Gr.is(i.range)&&Ge.string(i.text)}o(r,"is"),t.is=r})(P0e||(P0e={}));(function(t){function e(n,i,a){return{range:n,variableName:i,caseSensitiveLookup:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Gr.is(i.range)&&Ge.boolean(i.caseSensitiveLookup)&&(Ge.string(i.variableName)||i.variableName===void 0)}o(r,"is"),t.is=r})(B0e||(B0e={}));(function(t){function e(n,i){return{range:n,expression:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Gr.is(i.range)&&(Ge.string(i.expression)||i.expression===void 0)}o(r,"is"),t.is=r})(F0e||(F0e={}));(function(t){function e(n,i){return{frameId:n,stoppedLocation:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Gr.is(n.stoppedLocation)}o(r,"is"),t.is=r})($0e||($0e={}));(function(t){t.Type=1,t.Parameter=2;function e(r){return r===1||r===2}o(e,"is"),t.is=e})(IP||(IP={}));(function(t){function e(n){return{value:n}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&(i.tooltip===void 0||Ge.string(i.tooltip)||Tb.is(i.tooltip))&&(i.location===void 0||IS.is(i.location))&&(i.command===void 0||I1.is(i.command))}o(r,"is"),t.is=r})(OP||(OP={}));(function(t){function e(n,i,a){let s={position:n,label:i};return a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&tn.is(i.position)&&(Ge.string(i.label)||Ge.typedArray(i.label,OP.is))&&(i.kind===void 0||IP.is(i.kind))&&i.textEdits===void 0||Ge.typedArray(i.textEdits,O1.is)&&(i.tooltip===void 0||Ge.string(i.tooltip)||Tb.is(i.tooltip))&&(i.paddingLeft===void 0||Ge.boolean(i.paddingLeft))&&(i.paddingRight===void 0||Ge.boolean(i.paddingRight))}o(r,"is"),t.is=r})(z0e||(z0e={}));(function(t){function e(r){return{kind:"snippet",value:r}}o(e,"createSnippet"),t.createSnippet=e})(G0e||(G0e={}));(function(t){function e(r,n,i,a){return{insertText:r,filterText:n,range:i,command:a}}o(e,"create"),t.create=e})(V0e||(V0e={}));(function(t){function e(r){return{items:r}}o(e,"create"),t.create=e})(U0e||(U0e={}));(function(t){t.Invoked=0,t.Automatic=1})(H0e||(H0e={}));(function(t){function e(r,n){return{range:r,text:n}}o(e,"create"),t.create=e})(q0e||(q0e={}));(function(t){function e(r,n){return{triggerKind:r,selectedCompletionInfo:n}}o(e,"create"),t.create=e})(W0e||(W0e={}));(function(t){function e(r){let n=r;return Ge.objectLiteral(n)&&kP.is(n.uri)&&Ge.string(n.name)}o(e,"is"),t.is=e})(Y0e||(Y0e={}));(function(t){function e(a,s,l,u){return new PP(a,s,l,u)}o(e,"create"),t.create=e;function r(a){let s=a;return!!(Ge.defined(s)&&Ge.string(s.uri)&&(Ge.undefined(s.languageId)||Ge.string(s.languageId))&&Ge.uinteger(s.lineCount)&&Ge.func(s.getText)&&Ge.func(s.positionAt)&&Ge.func(s.offsetAt))}o(r,"is"),t.is=r;function n(a,s){let l=a.getText(),u=i(s,(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),h=l.length;for(let f=u.length-1;f>=0;f--){let d=u[f],p=a.offsetAt(d.range.start),m=a.offsetAt(d.range.end);if(m<=h)l=l.substring(0,p)+d.newText+l.substring(m,l.length);else throw new Error("Overlapping edit");h=p}return l}o(n,"applyEdits"),t.applyEdits=n;function i(a,s){if(a.length<=1)return a;let l=a.length/2|0,u=a.slice(0,l),h=a.slice(l);i(u,s),i(h,s);let f=0,d=0,p=0;for(;f0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),n=0,i=r.length;if(i===0)return tn.create(0,e);for(;ne?i=s:n=s+1}let a=n-1;return tn.create(a,e-r[a])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line],i=e.line+1"u"}o(n,"undefined"),t.undefined=n;function i(m){return m===!0||m===!1}o(i,"boolean"),t.boolean=i;function a(m){return e.call(m)==="[object String]"}o(a,"string"),t.string=a;function s(m){return e.call(m)==="[object Number]"}o(s,"number"),t.number=s;function l(m,g,y){return e.call(m)==="[object Number]"&&g<=m&&m<=y}o(l,"numberRange"),t.numberRange=l;function u(m){return e.call(m)==="[object Number]"&&-2147483648<=m&&m<=2147483647}o(u,"integer"),t.integer=u;function h(m){return e.call(m)==="[object Number]"&&0<=m&&m<=2147483647}o(h,"uinteger"),t.uinteger=h;function f(m){return e.call(m)==="[object Function]"}o(f,"func"),t.func=f;function d(m){return m!==null&&typeof m=="object"}o(d,"objectLiteral"),t.objectLiteral=d;function p(m,g){return Array.isArray(m)&&m.every(g)}o(p,"typedArray"),t.typedArray=p})(Ge||(Ge={}))});var wb,kb,Yp,Xp,FP,B1,FS=N(()=>{"use strict";BP();Bl();wb=class{static{o(this,"CstNodeBuilder")}constructor(){this.nodeStack=[]}get current(){var e;return(e=this.nodeStack[this.nodeStack.length-1])!==null&&e!==void 0?e:this.rootNode}buildRootNode(e){return this.rootNode=new B1(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let r=new Xp;return r.grammarSource=e,r.root=this.rootNode,this.current.content.push(r),this.nodeStack.push(r),r}buildLeafNode(e,r){let n=new Yp(e.startOffset,e.image.length,xg(e),e.tokenType,!r);return n.grammarSource=r,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let r=e.container;if(r){let n=r.content.indexOf(e);n>=0&&r.content.splice(n,1)}}addHiddenNodes(e){let r=[];for(let a of e){let s=new Yp(a.startOffset,a.image.length,xg(a),a.tokenType,!0);s.root=this.rootNode,r.push(s)}let n=this.current,i=!1;if(n.content.length>0){n.content.push(...r);return}for(;n.container;){let a=n.container.content.indexOf(n);if(a>0){n.container.content.splice(a,0,...r),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...r)}construct(e){let r=this.current;typeof e.$type=="string"&&(this.current.astNode=e),e.$cstNode=r;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}},kb=class{static{o(this,"AbstractCstNode")}get parent(){return this.container}get feature(){return this.grammarSource}get hidden(){return!1}get astNode(){var e,r;let n=typeof((e=this._astNode)===null||e===void 0?void 0:e.$type)=="string"?this._astNode:(r=this.container)===null||r===void 0?void 0:r.astNode;if(!n)throw new Error("This node has no associated AST element");return n}set astNode(e){this._astNode=e}get element(){return this.astNode}get text(){return this.root.fullText.substring(this.offset,this.end)}},Yp=class extends kb{static{o(this,"LeafCstNodeImpl")}get offset(){return this._offset}get length(){return this._length}get end(){return this._offset+this._length}get hidden(){return this._hidden}get tokenType(){return this._tokenType}get range(){return this._range}constructor(e,r,n,i,a=!1){super(),this._hidden=a,this._offset=e,this._tokenType=i,this._length=r,this._range=n}},Xp=class extends kb{static{o(this,"CompositeCstNodeImpl")}constructor(){super(...arguments),this.content=new FP(this)}get children(){return this.content}get offset(){var e,r;return(r=(e=this.firstNonHiddenNode)===null||e===void 0?void 0:e.offset)!==null&&r!==void 0?r:0}get length(){return this.end-this.offset}get end(){var e,r;return(r=(e=this.lastNonHiddenNode)===null||e===void 0?void 0:e.end)!==null&&r!==void 0?r:0}get range(){let e=this.firstNonHiddenNode,r=this.lastNonHiddenNode;if(e&&r){if(this._rangeCache===void 0){let{range:n}=e,{range:i}=r;this._rangeCache={start:n.start,end:i.end.line=0;e--){let r=this.content[e];if(!r.hidden)return r}return this.content[this.content.length-1]}},FP=class t extends Array{static{o(this,"CstNodeContainer")}constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,t.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,r,...n){return this.addParents(n),super.splice(e,r,...n)}addParents(e){for(let r of e)r.container=this.parent}},B1=class extends Xp{static{o(this,"RootCstNodeImpl")}get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}}});function $P(t){return t.$type===$S}var $S,j0e,K0e,Eb,Sb,zS,F1,Cb,PXe,zP,Ab=N(()=>{"use strict";Ff();Ype();Hc();zl();hs();FS();$S=Symbol("Datatype");o($P,"isDataTypeNode");j0e="\u200B",K0e=o(t=>t.endsWith(j0e)?t:t+j0e,"withRuleSuffix"),Eb=class{static{o(this,"AbstractLangiumParser")}constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;let r=this.lexer.definition,n=e.LanguageMetaData.mode==="production";this.wrapper=new zP(r,Object.assign(Object.assign({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,r){this.wrapper.wrapOr(e,r)}optional(e,r){this.wrapper.wrapOption(e,r)}many(e,r){this.wrapper.wrapMany(e,r)}atLeastOne(e,r){this.wrapper.wrapAtLeastOne(e,r)}getRule(e){return this.allRules.get(e)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},Sb=class extends Eb{static{o(this,"LangiumParser")}get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new wb,this.stack=[],this.assignmentMap=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,r){let n=this.computeRuleType(e),i=this.wrapper.DEFINE_RULE(K0e(e.name),this.startImplementation(n,r).bind(this));return this.allRules.set(e.name,i),e.entry&&(this.mainRule=i),i}computeRuleType(e){if(!e.fragment){if(jx(e))return $S;{let r=c1(e);return r??e.name}}}parse(e,r={}){this.nodeBuilder.buildRootNode(e);let n=this.lexerResult=this.lexer.tokenize(e);this.wrapper.input=n.tokens;let i=r.rule?this.allRules.get(r.rule):this.mainRule;if(!i)throw new Error(r.rule?`No rule found with name '${r.rule}'`:"No main rule available.");let a=i.call(this.wrapper,{});return this.nodeBuilder.addHiddenNodes(n.hidden),this.unorderedGroups.clear(),this.lexerResult=void 0,{value:a,lexerErrors:n.errors,lexerReport:n.report,parserErrors:this.wrapper.errors}}startImplementation(e,r){return n=>{let i=!this.isRecording()&&e!==void 0;if(i){let s={$type:e};this.stack.push(s),e===$S&&(s.value="")}let a;try{a=r(n)}catch{a=void 0}return a===void 0&&i&&(a=this.construct()),a}}extractHiddenTokens(e){let r=this.lexerResult.hidden;if(!r.length)return[];let n=e.startOffset;for(let i=0;in)return r.splice(0,i);return r.splice(0,r.length)}consume(e,r,n){let i=this.wrapper.wrapConsume(e,r);if(!this.isRecording()&&this.isValidToken(i)){let a=this.extractHiddenTokens(i);this.nodeBuilder.addHiddenNodes(a);let s=this.nodeBuilder.buildLeafNode(i,n),{assignment:l,isCrossRef:u}=this.getAssignment(n),h=this.current;if(l){let f=Zo(n)?i.image:this.converter.convert(i.image,s);this.assign(l.operator,l.feature,f,s,u)}else if($P(h)){let f=i.image;Zo(n)||(f=this.converter.convert(f,s).toString()),h.value+=f}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,r,n,i,a){let s;!this.isRecording()&&!n&&(s=this.nodeBuilder.buildCompositeNode(i));let l=this.wrapper.wrapSubrule(e,r,a);!this.isRecording()&&s&&s.length>0&&this.performSubruleAssignment(l,i,s)}performSubruleAssignment(e,r,n){let{assignment:i,isCrossRef:a}=this.getAssignment(r);if(i)this.assign(i.operator,i.feature,e,n,a);else if(!i){let s=this.current;if($P(s))s.value+=e.toString();else if(typeof e=="object"&&e){let u=this.assignWithoutOverride(e,s);this.stack.pop(),this.stack.push(u)}}}action(e,r){if(!this.isRecording()){let n=this.current;if(r.feature&&r.operator){n=this.construct(),this.nodeBuilder.removeNode(n.$cstNode),this.nodeBuilder.buildCompositeNode(r).content.push(n.$cstNode);let a={$type:e};this.stack.push(a),this.assign(r.operator,r.feature,n,n.$cstNode,!1)}else n.$type=e}}construct(){if(this.isRecording())return;let e=this.current;return zE(e),this.nodeBuilder.construct(e),this.stack.pop(),$P(e)?this.converter.convert(e.value,e.$cstNode):(gO(this.astReflection,e),e)}getAssignment(e){if(!this.assignmentMap.has(e)){let r=Ip(e,Fl);this.assignmentMap.set(e,{assignment:r,isCrossRef:r?Mp(r.terminal):!1})}return this.assignmentMap.get(e)}assign(e,r,n,i,a){let s=this.current,l;switch(a&&typeof n=="string"?l=this.linker.buildReference(s,r,i,n):l=n,e){case"=":{s[r]=l;break}case"?=":{s[r]=!0;break}case"+=":Array.isArray(s[r])||(s[r]=[]),s[r].push(l)}}assignWithoutOverride(e,r){for(let[i,a]of Object.entries(r)){let s=e[i];s===void 0?e[i]=a:Array.isArray(s)&&Array.isArray(a)&&(a.push(...s),e[i]=a)}let n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}},zS=class{static{o(this,"AbstractParserErrorMessageProvider")}buildMismatchTokenMessage(e){return Zu.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return Zu.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return Zu.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return Zu.buildEarlyExitMessage(e)}},F1=class extends zS{static{o(this,"LangiumParserErrorMessageProvider")}buildMismatchTokenMessage({expected:e,actual:r}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${r.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},Cb=class extends Eb{static{o(this,"LangiumCompletionParser")}constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let r=this.lexer.tokenize(e,{mode:"partial"});return this.tokens=r.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,r){let n=this.wrapper.DEFINE_RULE(K0e(e.name),this.startImplementation(r).bind(this));return this.allRules.set(e.name,n),e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return r=>{let n=this.keepStackSize();try{e(r)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,r,n){this.wrapper.wrapConsume(e,r),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,r,n,i,a){this.before(i),this.wrapper.wrapSubrule(e,r,a),this.after(i)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let r=this.elementStack.lastIndexOf(e);r>=0&&this.elementStack.splice(r)}}get currIdx(){return this.wrapper.currIdx}},PXe={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new F1},zP=class extends gb{static{o(this,"ChevrotainWrapper")}constructor(e,r){let n=r&&"maxLookahead"in r;super(e,Object.assign(Object.assign(Object.assign({},PXe),{lookaheadStrategy:n?new Ju({maxLookahead:r.maxLookahead}):new bb({logging:r.skipValidations?()=>{}:void 0})}),r))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,r){return this.RULE(e,r)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,r){return this.consume(e,r)}wrapSubrule(e,r,n){return this.subrule(e,r,{ARGS:[n]})}wrapOr(e,r){this.or(e,r)}wrapOption(e,r){this.option(e,r)}wrapMany(e,r){this.many(e,r)}wrapAtLeastOne(e,r){this.atLeastOne(e,r)}}});function _b(t,e,r){return BXe({parser:e,tokens:r,ruleNames:new Map},t),e}function BXe(t,e){let r=Yx(e,!1),n=an(e.rules).filter(Ga).filter(i=>r.has(i));for(let i of n){let a=Object.assign(Object.assign({},t),{consume:1,optional:1,subrule:1,many:1,or:1});t.parser.rule(i,jp(a,i.definition))}}function jp(t,e,r=!1){let n;if(Zo(e))n=HXe(t,e);else if(qu(e))n=FXe(t,e);else if(Fl(e))n=jp(t,e.terminal);else if(Mp(e))n=Q0e(t,e);else if($l(e))n=$Xe(t,e);else if(BE(e))n=GXe(t,e);else if($E(e))n=VXe(t,e);else if(Of(e))n=UXe(t,e);else if(oO(e)){let i=t.consume++;n=o(()=>t.parser.consume(i,yo,e),"method")}else throw new Rp(e.$cstNode,`Unexpected element type: ${e.$type}`);return Z0e(t,r?void 0:GS(e),n,e.cardinality)}function FXe(t,e){let r=Kx(e);return()=>t.parser.action(r,e)}function $Xe(t,e){let r=e.rule.ref;if(Ga(r)){let n=t.subrule++,i=r.fragment,a=e.arguments.length>0?zXe(r,e.arguments):()=>({});return s=>t.parser.subrule(n,J0e(t,r),i,e,a(s))}else if(mo(r)){let n=t.consume++,i=GP(t,r.name);return()=>t.parser.consume(n,i,e)}else if(r)Uc(r);else throw new Rp(e.$cstNode,`Undefined rule: ${e.rule.$refText}`)}function zXe(t,e){let r=e.map(n=>eh(n.value));return n=>{let i={};for(let a=0;ae(n)||r(n)}else if(JI(t)){let e=eh(t.left),r=eh(t.right);return n=>e(n)&&r(n)}else if(tO(t)){let e=eh(t.value);return r=>!e(r)}else if(rO(t)){let e=t.parameter.ref.name;return r=>r!==void 0&&r[e]===!0}else if(ZI(t)){let e=!!t.true;return()=>e}Uc(t)}function GXe(t,e){if(e.elements.length===1)return jp(t,e.elements[0]);{let r=[];for(let i of e.elements){let a={ALT:jp(t,i,!0)},s=GS(i);s&&(a.GATE=eh(s)),r.push(a)}let n=t.or++;return i=>t.parser.alternatives(n,r.map(a=>{let s={ALT:o(()=>a.ALT(i),"ALT")},l=a.GATE;return l&&(s.GATE=()=>l(i)),s}))}}function VXe(t,e){if(e.elements.length===1)return jp(t,e.elements[0]);let r=[];for(let l of e.elements){let u={ALT:jp(t,l,!0)},h=GS(l);h&&(u.GATE=eh(h)),r.push(u)}let n=t.or++,i=o((l,u)=>{let h=u.getRuleStack().join("-");return`uGroup_${l}_${h}`},"idFunc"),a=o(l=>t.parser.alternatives(n,r.map((u,h)=>{let f={ALT:o(()=>!0,"ALT")},d=t.parser;f.ALT=()=>{if(u.ALT(l),!d.isRecording()){let m=i(n,d);d.unorderedGroups.get(m)||d.unorderedGroups.set(m,[]);let g=d.unorderedGroups.get(m);typeof g?.[h]>"u"&&(g[h]=!0)}};let p=u.GATE;return p?f.GATE=()=>p(l):f.GATE=()=>{let m=d.unorderedGroups.get(i(n,d));return!m?.[h]},f})),"alternatives"),s=Z0e(t,GS(e),a,"*");return l=>{s(l),t.parser.isRecording()||t.parser.unorderedGroups.delete(i(n,t.parser))}}function UXe(t,e){let r=e.elements.map(n=>jp(t,n));return n=>r.forEach(i=>i(n))}function GS(t){if(Of(t))return t.guardCondition}function Q0e(t,e,r=e.terminal){if(r)if($l(r)&&Ga(r.rule.ref)){let n=r.rule.ref,i=t.subrule++;return a=>t.parser.subrule(i,J0e(t,n),!1,e,a)}else if($l(r)&&mo(r.rule.ref)){let n=t.consume++,i=GP(t,r.rule.ref.name);return()=>t.parser.consume(n,i,e)}else if(Zo(r)){let n=t.consume++,i=GP(t,r.value);return()=>t.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let n=qE(e.type.ref),i=n?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+Kx(e.type.ref));return Q0e(t,e,i)}}function HXe(t,e){let r=t.consume++,n=t.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>t.parser.consume(r,n,e)}function Z0e(t,e,r,n){let i=e&&eh(e);if(!n)if(i){let a=t.or++;return s=>t.parser.alternatives(a,[{ALT:o(()=>r(s),"ALT"),GATE:o(()=>i(s),"GATE")},{ALT:LS(),GATE:o(()=>!i(s),"GATE")}])}else return r;if(n==="*"){let a=t.many++;return s=>t.parser.many(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else if(n==="+"){let a=t.many++;if(i){let s=t.or++;return l=>t.parser.alternatives(s,[{ALT:o(()=>t.parser.atLeastOne(a,{DEF:o(()=>r(l),"DEF")}),"ALT"),GATE:o(()=>i(l),"GATE")},{ALT:LS(),GATE:o(()=>!i(l),"GATE")}])}else return s=>t.parser.atLeastOne(a,{DEF:o(()=>r(s),"DEF")})}else if(n==="?"){let a=t.optional++;return s=>t.parser.optional(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else Uc(n)}function J0e(t,e){let r=qXe(t,e),n=t.parser.getRule(r);if(!n)throw new Error(`Rule "${r}" not found."`);return n}function qXe(t,e){if(Ga(e))return e.name;if(t.ruleNames.has(e))return t.ruleNames.get(e);{let r=e,n=r.$container,i=e.$type;for(;!Ga(n);)(Of(n)||BE(n)||$E(n))&&(i=n.elements.indexOf(r).toString()+":"+i),r=n,n=n.$container;return i=n.name+":"+i,t.ruleNames.set(e,i),i}}function GP(t,e){let r=t.tokens[e];if(!r)throw new Error(`Token "${e}" not found."`);return r}var VS=N(()=>{"use strict";Ff();Hc();NE();Ys();zl();o(_b,"createParser");o(BXe,"buildRules");o(jp,"buildElement");o(FXe,"buildAction");o($Xe,"buildRuleCall");o(zXe,"buildRuleCallPredicate");o(eh,"buildPredicate");o(GXe,"buildAlternatives");o(VXe,"buildUnorderedGroup");o(UXe,"buildGroup");o(GS,"getGuardCondition");o(Q0e,"buildCrossReference");o(HXe,"buildKeyword");o(Z0e,"wrap");o(J0e,"getRule");o(qXe,"getRuleName");o(GP,"getToken")});function VP(t){let e=t.Grammar,r=t.parser.Lexer,n=new Cb(t);return _b(e,n,r.definition),n.finalize(),n}var UP=N(()=>{"use strict";Ab();VS();o(VP,"createCompletionParser")});function HP(t){let e=eme(t);return e.finalize(),e}function eme(t){let e=t.Grammar,r=t.parser.Lexer,n=new Sb(t);return _b(e,n,r.definition)}var qP=N(()=>{"use strict";Ab();VS();o(HP,"createLangiumParser");o(eme,"prepareLangiumParser")});var th,US=N(()=>{"use strict";Ff();Hc();hs();zl();l1();Ys();th=class{static{o(this,"DefaultTokenBuilder")}constructor(){this.diagnostics=[]}buildTokens(e,r){let n=an(Yx(e,!1)),i=this.buildTerminalTokens(n),a=this.buildKeywordTokens(n,i,r);return i.forEach(s=>{let l=s.PATTERN;typeof l=="object"&&l&&"test"in l&&o1(l)?a.unshift(s):a.push(s)}),a}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){let e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(mo).filter(r=>!r.fragment).map(r=>this.buildTerminalToken(r)).toArray()}buildTerminalToken(e){let r=u1(e),n=this.requiresCustomPattern(r)?this.regexPatternFunction(r):r,i={name:e.name,PATTERN:n};return typeof n=="function"&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=o1(r)?Zn.SKIPPED:"hidden"),i}requiresCustomPattern(e){return e.flags.includes("u")||e.flags.includes("s")?!0:!!(e.source.includes("?<=")||e.source.includes("?(r.lastIndex=i,r.exec(n))}buildKeywordTokens(e,r,n){return e.filter(Ga).flatMap(i=>qc(i).filter(Zo)).distinct(i=>i.value).toArray().sort((i,a)=>a.value.length-i.value.length).map(i=>this.buildKeywordToken(i,r,!!n?.caseInsensitive))}buildKeywordToken(e,r,n){let i=this.buildKeywordPattern(e,n),a={name:e.value,PATTERN:i,LONGER_ALT:this.findLongerAlt(e,r)};return typeof i=="function"&&(a.LINE_BREAKS=!0),a}buildKeywordPattern(e,r){return r?new RegExp(kO(e.value)):e.value}findLongerAlt(e,r){return r.reduce((n,i)=>{let a=i?.PATTERN;return a?.source&&EO("^"+a.source+"$",e.value)&&n.push(i),n},[])}}});var Kp,Xc,WP=N(()=>{"use strict";Hc();zl();Kp=class{static{o(this,"DefaultValueConverter")}convert(e,r){let n=r.grammarSource;if(Mp(n)&&(n=AO(n)),$l(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,r)}return e}runConverter(e,r,n){var i;switch(e.name.toUpperCase()){case"INT":return Xc.convertInt(r);case"STRING":return Xc.convertString(r);case"ID":return Xc.convertID(r)}switch((i=IO(e))===null||i===void 0?void 0:i.toLowerCase()){case"number":return Xc.convertNumber(r);case"boolean":return Xc.convertBoolean(r);case"bigint":return Xc.convertBigint(r);case"date":return Xc.convertDate(r);default:return r}}};(function(t){function e(h){let f="";for(let d=1;d{"use strict";Object.defineProperty(jP,"__esModule",{value:!0});var YP;function XP(){if(YP===void 0)throw new Error("No runtime abstraction layer installed");return YP}o(XP,"RAL");(function(t){function e(r){if(r===void 0)throw new Error("No runtime abstraction layer provided");YP=r}o(e,"install"),t.install=e})(XP||(XP={}));jP.default=XP});var nme=Da(Ua=>{"use strict";Object.defineProperty(Ua,"__esModule",{value:!0});Ua.stringArray=Ua.array=Ua.func=Ua.error=Ua.number=Ua.string=Ua.boolean=void 0;function WXe(t){return t===!0||t===!1}o(WXe,"boolean");Ua.boolean=WXe;function tme(t){return typeof t=="string"||t instanceof String}o(tme,"string");Ua.string=tme;function YXe(t){return typeof t=="number"||t instanceof Number}o(YXe,"number");Ua.number=YXe;function XXe(t){return t instanceof Error}o(XXe,"error");Ua.error=XXe;function jXe(t){return typeof t=="function"}o(jXe,"func");Ua.func=jXe;function rme(t){return Array.isArray(t)}o(rme,"array");Ua.array=rme;function KXe(t){return rme(t)&&t.every(e=>tme(e))}o(KXe,"stringArray");Ua.stringArray=KXe});var ZP=Da($1=>{"use strict";Object.defineProperty($1,"__esModule",{value:!0});$1.Emitter=$1.Event=void 0;var QXe=KP(),ime;(function(t){let e={dispose(){}};t.None=function(){return e}})(ime||($1.Event=ime={}));var QP=class{static{o(this,"CallbackList")}add(e,r=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(r),Array.isArray(n)&&n.push({dispose:o(()=>this.remove(e,r),"dispose")})}remove(e,r=null){if(!this._callbacks)return;let n=!1;for(let i=0,a=this._callbacks.length;i{this._callbacks||(this._callbacks=new QP),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,r);let i={dispose:o(()=>{this._callbacks&&(this._callbacks.remove(e,r),i.dispose=t._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))},"dispose")};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};$1.Emitter=HS;HS._noop=function(){}});var ame=Da(z1=>{"use strict";Object.defineProperty(z1,"__esModule",{value:!0});z1.CancellationTokenSource=z1.CancellationToken=void 0;var ZXe=KP(),JXe=nme(),JP=ZP(),qS;(function(t){t.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:JP.Event.None}),t.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:JP.Event.None});function e(r){let n=r;return n&&(n===t.None||n===t.Cancelled||JXe.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}o(e,"is"),t.is=e})(qS||(z1.CancellationToken=qS={}));var eje=Object.freeze(function(t,e){let r=(0,ZXe.default)().timer.setTimeout(t.bind(e),0);return{dispose(){r.dispose()}}}),WS=class{static{o(this,"MutableToken")}constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?eje:(this._emitter||(this._emitter=new JP.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},eB=class{static{o(this,"CancellationTokenSource")}get token(){return this._token||(this._token=new WS),this._token}cancel(){this._token?this._token.cancel():this._token=qS.Cancelled}dispose(){this._token?this._token instanceof WS&&this._token.dispose():this._token=qS.None}};z1.CancellationTokenSource=eB});var br={};var el=N(()=>{"use strict";Lr(br,ja(ame(),1))});function tB(){return new Promise(t=>{typeof setImmediate>"u"?setTimeout(t,0):setImmediate(t)})}function XS(){return YS=performance.now(),new br.CancellationTokenSource}function ome(t){sme=t}function Kc(t){return t===jc}async function bi(t){if(t===br.CancellationToken.None)return;let e=performance.now();if(e-YS>=sme&&(YS=e,await tB(),YS=performance.now()),t.isCancellationRequested)throw jc}var YS,sme,jc,gs,tl=N(()=>{"use strict";el();o(tB,"delayNextTick");YS=0,sme=10;o(XS,"startCancelableOperation");o(ome,"setInterruptionPeriod");jc=Symbol("OperationCancelled");o(Kc,"isOperationCancelled");o(bi,"interruptAndCheck");gs=class{static{o(this,"Deferred")}constructor(){this.promise=new Promise((e,r)=>{this.resolve=n=>(e(n),this),this.reject=n=>(r(n),this)})}}});function rB(t,e){if(t.length<=1)return t;let r=t.length/2|0,n=t.slice(0,r),i=t.slice(r);rB(n,e),rB(i,e);let a=0,s=0,l=0;for(;ar.line||e.line===r.line&&e.character>r.character?{start:r,end:e}:t}function tje(t){let e=ume(t.range);return e!==t.range?{newText:t.newText,range:e}:t}var jS,G1,hme=N(()=>{"use strict";jS=class t{static{o(this,"FullTextDocument")}constructor(e,r,n,i){this._uri=e,this._languageId=r,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let r=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(r,n)}return this._content}update(e,r){for(let n of e)if(t.isIncremental(n)){let i=ume(n.range),a=this.offsetAt(i.start),s=this.offsetAt(i.end);this._content=this._content.substring(0,a)+n.text+this._content.substring(s,this._content.length);let l=Math.max(i.start.line,0),u=Math.max(i.end.line,0),h=this._lineOffsets,f=lme(n.text,!1,a);if(u-l===f.length)for(let p=0,m=f.length;pe?i=s:n=s+1}let a=n-1;return e=this.ensureBeforeEOL(e,r[a]),{line:a,character:e-r[a]}}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line];if(e.character<=0)return n;let i=e.line+1r&&cme(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range!==void 0&&(r.rangeLength===void 0||typeof r.rangeLength=="number")}static isFull(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range===void 0&&r.rangeLength===void 0}};(function(t){function e(i,a,s,l){return new jS(i,a,s,l)}o(e,"create"),t.create=e;function r(i,a,s){if(i instanceof jS)return i.update(a,s),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}o(r,"update"),t.update=r;function n(i,a){let s=i.getText(),l=rB(a.map(tje),(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),u=0,h=[];for(let f of l){let d=i.offsetAt(f.range.start);if(du&&h.push(s.substring(u,d)),f.newText.length&&h.push(f.newText),u=i.offsetAt(f.range.end)}return h.push(s.substr(u)),h.join("")}o(n,"applyEdits"),t.applyEdits=n})(G1||(G1={}));o(rB,"mergeSort");o(lme,"computeLineOffsets");o(cme,"isEOL");o(ume,"getWellformedRange");o(tje,"getWellformedEdit")});var fme,ys,V1,nB=N(()=>{"use strict";(()=>{"use strict";var t={470:i=>{function a(u){if(typeof u!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(u))}o(a,"e");function s(u,h){for(var f,d="",p=0,m=-1,g=0,y=0;y<=u.length;++y){if(y2){var v=d.lastIndexOf("/");if(v!==d.length-1){v===-1?(d="",p=0):p=(d=d.slice(0,v)).length-1-d.lastIndexOf("/"),m=y,g=0;continue}}else if(d.length===2||d.length===1){d="",p=0,m=y,g=0;continue}}h&&(d.length>0?d+="/..":d="..",p=2)}else d.length>0?d+="/"+u.slice(m+1,y):d=u.slice(m+1,y),p=y-m-1;m=y,g=0}else f===46&&g!==-1?++g:g=-1}return d}o(s,"r");var l={resolve:o(function(){for(var u,h="",f=!1,d=arguments.length-1;d>=-1&&!f;d--){var p;d>=0?p=arguments[d]:(u===void 0&&(u=process.cwd()),p=u),a(p),p.length!==0&&(h=p+"/"+h,f=p.charCodeAt(0)===47)}return h=s(h,!f),f?h.length>0?"/"+h:"/":h.length>0?h:"."},"resolve"),normalize:o(function(u){if(a(u),u.length===0)return".";var h=u.charCodeAt(0)===47,f=u.charCodeAt(u.length-1)===47;return(u=s(u,!h)).length!==0||h||(u="."),u.length>0&&f&&(u+="/"),h?"/"+u:u},"normalize"),isAbsolute:o(function(u){return a(u),u.length>0&&u.charCodeAt(0)===47},"isAbsolute"),join:o(function(){if(arguments.length===0)return".";for(var u,h=0;h0&&(u===void 0?u=f:u+="/"+f)}return u===void 0?".":l.normalize(u)},"join"),relative:o(function(u,h){if(a(u),a(h),u===h||(u=l.resolve(u))===(h=l.resolve(h)))return"";for(var f=1;fy){if(h.charCodeAt(m+x)===47)return h.slice(m+x+1);if(x===0)return h.slice(m+x)}else p>y&&(u.charCodeAt(f+x)===47?v=x:x===0&&(v=0));break}var b=u.charCodeAt(f+x);if(b!==h.charCodeAt(m+x))break;b===47&&(v=x)}var T="";for(x=f+v+1;x<=d;++x)x!==d&&u.charCodeAt(x)!==47||(T.length===0?T+="..":T+="/..");return T.length>0?T+h.slice(m+v):(m+=v,h.charCodeAt(m)===47&&++m,h.slice(m))},"relative"),_makeLong:o(function(u){return u},"_makeLong"),dirname:o(function(u){if(a(u),u.length===0)return".";for(var h=u.charCodeAt(0),f=h===47,d=-1,p=!0,m=u.length-1;m>=1;--m)if((h=u.charCodeAt(m))===47){if(!p){d=m;break}}else p=!1;return d===-1?f?"/":".":f&&d===1?"//":u.slice(0,d)},"dirname"),basename:o(function(u,h){if(h!==void 0&&typeof h!="string")throw new TypeError('"ext" argument must be a string');a(u);var f,d=0,p=-1,m=!0;if(h!==void 0&&h.length>0&&h.length<=u.length){if(h.length===u.length&&h===u)return"";var g=h.length-1,y=-1;for(f=u.length-1;f>=0;--f){var v=u.charCodeAt(f);if(v===47){if(!m){d=f+1;break}}else y===-1&&(m=!1,y=f+1),g>=0&&(v===h.charCodeAt(g)?--g==-1&&(p=f):(g=-1,p=y))}return d===p?p=y:p===-1&&(p=u.length),u.slice(d,p)}for(f=u.length-1;f>=0;--f)if(u.charCodeAt(f)===47){if(!m){d=f+1;break}}else p===-1&&(m=!1,p=f+1);return p===-1?"":u.slice(d,p)},"basename"),extname:o(function(u){a(u);for(var h=-1,f=0,d=-1,p=!0,m=0,g=u.length-1;g>=0;--g){var y=u.charCodeAt(g);if(y!==47)d===-1&&(p=!1,d=g+1),y===46?h===-1?h=g:m!==1&&(m=1):h!==-1&&(m=-1);else if(!p){f=g+1;break}}return h===-1||d===-1||m===0||m===1&&h===d-1&&h===f+1?"":u.slice(h,d)},"extname"),format:o(function(u){if(u===null||typeof u!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof u);return(function(h,f){var d=f.dir||f.root,p=f.base||(f.name||"")+(f.ext||"");return d?d===f.root?d+p:d+"/"+p:p})(0,u)},"format"),parse:o(function(u){a(u);var h={root:"",dir:"",base:"",ext:"",name:""};if(u.length===0)return h;var f,d=u.charCodeAt(0),p=d===47;p?(h.root="/",f=1):f=0;for(var m=-1,g=0,y=-1,v=!0,x=u.length-1,b=0;x>=f;--x)if((d=u.charCodeAt(x))!==47)y===-1&&(v=!1,y=x+1),d===46?m===-1?m=x:b!==1&&(b=1):m!==-1&&(b=-1);else if(!v){g=x+1;break}return m===-1||y===-1||b===0||b===1&&m===y-1&&m===g+1?y!==-1&&(h.base=h.name=g===0&&p?u.slice(1,y):u.slice(g,y)):(g===0&&p?(h.name=u.slice(1,m),h.base=u.slice(1,y)):(h.name=u.slice(g,m),h.base=u.slice(g,y)),h.ext=u.slice(m,y)),g>0?h.dir=u.slice(0,g-1):p&&(h.dir="/"),h},"parse"),sep:"/",delimiter:":",win32:null,posix:null};l.posix=l,i.exports=l}},e={};function r(i){var a=e[i];if(a!==void 0)return a.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,r),s.exports}o(r,"r"),r.d=(i,a)=>{for(var s in a)r.o(a,s)&&!r.o(i,s)&&Object.defineProperty(i,s,{enumerable:!0,get:a[s]})},r.o=(i,a)=>Object.prototype.hasOwnProperty.call(i,a),r.r=i=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var n={};(()=>{let i;r.r(n),r.d(n,{URI:o(()=>p,"URI"),Utils:o(()=>I,"Utils")}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let a=/^\w[\w\d+.-]*$/,s=/^\//,l=/^\/\//;function u(L,E){if(!L.scheme&&E)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${L.authority}", path: "${L.path}", query: "${L.query}", fragment: "${L.fragment}"}`);if(L.scheme&&!a.test(L.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(L.path){if(L.authority){if(!s.test(L.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(l.test(L.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}o(u,"s");let h="",f="/",d=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class p{static{o(this,"f")}static isUri(E){return E instanceof p||!!E&&typeof E.authority=="string"&&typeof E.fragment=="string"&&typeof E.path=="string"&&typeof E.query=="string"&&typeof E.scheme=="string"&&typeof E.fsPath=="string"&&typeof E.with=="function"&&typeof E.toString=="function"}scheme;authority;path;query;fragment;constructor(E,D,_,O,M,P=!1){typeof E=="object"?(this.scheme=E.scheme||h,this.authority=E.authority||h,this.path=E.path||h,this.query=E.query||h,this.fragment=E.fragment||h):(this.scheme=(function(B,F){return B||F?B:"file"})(E,P),this.authority=D||h,this.path=(function(B,F){switch(B){case"https":case"http":case"file":F?F[0]!==f&&(F=f+F):F=f}return F})(this.scheme,_||h),this.query=O||h,this.fragment=M||h,u(this,P))}get fsPath(){return b(this,!1)}with(E){if(!E)return this;let{scheme:D,authority:_,path:O,query:M,fragment:P}=E;return D===void 0?D=this.scheme:D===null&&(D=h),_===void 0?_=this.authority:_===null&&(_=h),O===void 0?O=this.path:O===null&&(O=h),M===void 0?M=this.query:M===null&&(M=h),P===void 0?P=this.fragment:P===null&&(P=h),D===this.scheme&&_===this.authority&&O===this.path&&M===this.query&&P===this.fragment?this:new g(D,_,O,M,P)}static parse(E,D=!1){let _=d.exec(E);return _?new g(_[2]||h,k(_[4]||h),k(_[5]||h),k(_[7]||h),k(_[9]||h),D):new g(h,h,h,h,h)}static file(E){let D=h;if(i&&(E=E.replace(/\\/g,f)),E[0]===f&&E[1]===f){let _=E.indexOf(f,2);_===-1?(D=E.substring(2),E=f):(D=E.substring(2,_),E=E.substring(_)||f)}return new g("file",D,E,h,h)}static from(E){let D=new g(E.scheme,E.authority,E.path,E.query,E.fragment);return u(D,!0),D}toString(E=!1){return T(this,E)}toJSON(){return this}static revive(E){if(E){if(E instanceof p)return E;{let D=new g(E);return D._formatted=E.external,D._fsPath=E._sep===m?E.fsPath:null,D}}return E}}let m=i?1:void 0;class g extends p{static{o(this,"l")}_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(E=!1){return E?T(this,!0):(this._formatted||(this._formatted=T(this,!1)),this._formatted)}toJSON(){let E={$mid:1};return this._fsPath&&(E.fsPath=this._fsPath,E._sep=m),this._formatted&&(E.external=this._formatted),this.path&&(E.path=this.path),this.scheme&&(E.scheme=this.scheme),this.authority&&(E.authority=this.authority),this.query&&(E.query=this.query),this.fragment&&(E.fragment=this.fragment),E}}let y={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function v(L,E,D){let _,O=-1;for(let M=0;M=97&&P<=122||P>=65&&P<=90||P>=48&&P<=57||P===45||P===46||P===95||P===126||E&&P===47||D&&P===91||D&&P===93||D&&P===58)O!==-1&&(_+=encodeURIComponent(L.substring(O,M)),O=-1),_!==void 0&&(_+=L.charAt(M));else{_===void 0&&(_=L.substr(0,M));let B=y[P];B!==void 0?(O!==-1&&(_+=encodeURIComponent(L.substring(O,M)),O=-1),_+=B):O===-1&&(O=M)}}return O!==-1&&(_+=encodeURIComponent(L.substring(O))),_!==void 0?_:L}o(v,"d");function x(L){let E;for(let D=0;D1&&L.scheme==="file"?`//${L.authority}${L.path}`:L.path.charCodeAt(0)===47&&(L.path.charCodeAt(1)>=65&&L.path.charCodeAt(1)<=90||L.path.charCodeAt(1)>=97&&L.path.charCodeAt(1)<=122)&&L.path.charCodeAt(2)===58?E?L.path.substr(1):L.path[1].toLowerCase()+L.path.substr(2):L.path,i&&(D=D.replace(/\//g,"\\")),D}o(b,"m");function T(L,E){let D=E?x:v,_="",{scheme:O,authority:M,path:P,query:B,fragment:F}=L;if(O&&(_+=O,_+=":"),(M||O==="file")&&(_+=f,_+=f),M){let G=M.indexOf("@");if(G!==-1){let $=M.substr(0,G);M=M.substr(G+1),G=$.lastIndexOf(":"),G===-1?_+=D($,!1,!1):(_+=D($.substr(0,G),!1,!1),_+=":",_+=D($.substr(G+1),!1,!0)),_+="@"}M=M.toLowerCase(),G=M.lastIndexOf(":"),G===-1?_+=D(M,!1,!0):(_+=D(M.substr(0,G),!1,!0),_+=M.substr(G))}if(P){if(P.length>=3&&P.charCodeAt(0)===47&&P.charCodeAt(2)===58){let G=P.charCodeAt(1);G>=65&&G<=90&&(P=`/${String.fromCharCode(G+32)}:${P.substr(3)}`)}else if(P.length>=2&&P.charCodeAt(1)===58){let G=P.charCodeAt(0);G>=65&&G<=90&&(P=`${String.fromCharCode(G+32)}:${P.substr(2)}`)}_+=D(P,!0,!1)}return B&&(_+="?",_+=D(B,!1,!1)),F&&(_+="#",_+=E?F:v(F,!1,!1)),_}o(T,"y");function S(L){try{return decodeURIComponent(L)}catch{return L.length>3?L.substr(0,3)+S(L.substr(3)):L}}o(S,"v");let w=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function k(L){return L.match(w)?L.replace(w,(E=>S(E))):L}o(k,"C");var A=r(470);let C=A.posix||A,R="/";var I;(function(L){L.joinPath=function(E,...D){return E.with({path:C.join(E.path,...D)})},L.resolvePath=function(E,...D){let _=E.path,O=!1;_[0]!==R&&(_=R+_,O=!0);let M=C.resolve(_,...D);return O&&M[0]===R&&!E.authority&&(M=M.substring(1)),E.with({path:M})},L.dirname=function(E){if(E.path.length===0||E.path===R)return E;let D=C.dirname(E.path);return D.length===1&&D.charCodeAt(0)===46&&(D=""),E.with({path:D})},L.basename=function(E){return C.basename(E.path)},L.extname=function(E){return C.extname(E.path)}})(I||(I={}))})(),fme=n})();({URI:ys,Utils:V1}=fme)});var vs,Qc=N(()=>{"use strict";nB();(function(t){t.basename=V1.basename,t.dirname=V1.dirname,t.extname=V1.extname,t.joinPath=V1.joinPath,t.resolvePath=V1.resolvePath;function e(i,a){return i?.toString()===a?.toString()}o(e,"equals"),t.equals=e;function r(i,a){let s=typeof i=="string"?i:i.path,l=typeof a=="string"?a:a.path,u=s.split("/").filter(m=>m.length>0),h=l.split("/").filter(m=>m.length>0),f=0;for(;f{"use strict";hme();U1();el();Ys();Qc();(function(t){t[t.Changed=0]="Changed",t[t.Parsed=1]="Parsed",t[t.IndexedContent=2]="IndexedContent",t[t.ComputedScopes=3]="ComputedScopes",t[t.Linked=4]="Linked",t[t.IndexedReferences=5]="IndexedReferences",t[t.Validated=6]="Validated"})(Ln||(Ln={}));Db=class{static{o(this,"DefaultLangiumDocumentFactory")}constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}async fromUri(e,r=br.CancellationToken.None){let n=await this.fileSystemProvider.readFile(e);return this.createAsync(e,n,r)}fromTextDocument(e,r,n){return r=r??ys.parse(e.uri),br.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromString(e,r,n){return br.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromModel(e,r){return this.create(r,{$model:e})}create(e,r,n){if(typeof r=="string"){let i=this.parse(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else if("$model"in r){let i={value:r.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(i,e)}else{let i=this.parse(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}async createAsync(e,r,n){if(typeof r=="string"){let i=await this.parseAsync(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else{let i=await this.parseAsync(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}createLangiumDocument(e,r,n,i){let a;if(n)a={parseResult:e,uri:r,state:Ln.Parsed,references:[],textDocument:n};else{let s=this.createTextDocumentGetter(r,i);a={parseResult:e,uri:r,state:Ln.Parsed,references:[],get textDocument(){return s()}}}return e.value.$document=a,a}async update(e,r){var n,i;let a=(n=e.parseResult.value.$cstNode)===null||n===void 0?void 0:n.root.fullText,s=(i=this.textDocuments)===null||i===void 0?void 0:i.get(e.uri.toString()),l=s?s.getText():await this.fileSystemProvider.readFile(e.uri);if(s)Object.defineProperty(e,"textDocument",{value:s});else{let u=this.createTextDocumentGetter(e.uri,l);Object.defineProperty(e,"textDocument",{get:u})}return a!==l&&(e.parseResult=await this.parseAsync(e.uri,l,r),e.parseResult.value.$document=e),e.state=Ln.Parsed,e}parse(e,r,n){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(r,n)}parseAsync(e,r,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(r,n)}createTextDocumentGetter(e,r){let n=this.serviceRegistry,i;return()=>i??(i=G1.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,r??""))}},Lb=class{static{o(this,"DefaultLangiumDocuments")}constructor(e){this.documentMap=new Map,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.serviceRegistry=e.ServiceRegistry}get all(){return an(this.documentMap.values())}addDocument(e){let r=e.uri.toString();if(this.documentMap.has(r))throw new Error(`A document with the URI '${r}' is already present.`);this.documentMap.set(r,e)}getDocument(e){let r=e.toString();return this.documentMap.get(r)}async getOrCreateDocument(e,r){let n=this.getDocument(e);return n||(n=await this.langiumDocumentFactory.fromUri(e,r),this.addDocument(n),n)}createDocument(e,r,n){if(n)return this.langiumDocumentFactory.fromString(r,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(r,e);return this.addDocument(i),i}}hasDocument(e){return this.documentMap.has(e.toString())}invalidateDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(this.serviceRegistry.getServices(e).references.Linker.unlink(n),n.state=Ln.Changed,n.precomputedScopes=void 0,n.diagnostics=void 0),n}deleteDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(n.state=Ln.Changed,this.documentMap.delete(r)),n}}});var iB,Rb,aB=N(()=>{"use strict";el();Pl();hs();tl();U1();iB=Symbol("ref_resolving"),Rb=class{static{o(this,"DefaultLinker")}constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator}async link(e,r=br.CancellationToken.None){for(let n of Jo(e.parseResult.value))await bi(r),a1(n).forEach(i=>this.doLink(i,e))}doLink(e,r){var n;let i=e.reference;if(i._ref===void 0){i._ref=iB;try{let a=this.getCandidate(e);if(_p(a))i._ref=a;else if(i._nodeDescription=a,this.langiumDocuments().hasDocument(a.documentUri)){let s=this.loadAstNode(a);i._ref=s??this.createLinkingError(e,a)}else i._ref=void 0}catch(a){console.error(`An error occurred while resolving reference to '${i.$refText}':`,a);let s=(n=a.message)!==null&&n!==void 0?n:String(a);i._ref=Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${i.$refText}': ${s}`})}r.references.push(i)}}unlink(e){for(let r of e.references)delete r._ref,delete r._nodeDescription;e.references=[]}getCandidate(e){let n=this.scopeProvider.getScope(e).getElement(e.reference.$refText);return n??this.createLinkingError(e)}buildReference(e,r,n,i){let a=this,s={$refNode:n,$refText:i,get ref(){var l;if(li(this._ref))return this._ref;if(qI(this._nodeDescription)){let u=a.loadAstNode(this._nodeDescription);this._ref=u??a.createLinkingError({reference:s,container:e,property:r},this._nodeDescription)}else if(this._ref===void 0){this._ref=iB;let u=Gx(e).$document,h=a.getLinkedNode({reference:s,container:e,property:r});if(h.error&&u&&u.state{"use strict";zl();o(dme,"isNamed");Nb=class{static{o(this,"DefaultNameProvider")}getName(e){if(dme(e))return e.name}getNameNode(e){return Xx(e.$cstNode,"name")}}});var Mb,oB=N(()=>{"use strict";zl();Pl();hs();Bl();Ys();Qc();Mb=class{static{o(this,"DefaultReferences")}constructor(e){this.nameProvider=e.references.NameProvider,this.index=e.shared.workspace.IndexManager,this.nodeLocator=e.workspace.AstNodeLocator}findDeclaration(e){if(e){let r=MO(e),n=e.astNode;if(r&&n){let i=n[r.feature];if(Ta(i))return i.ref;if(Array.isArray(i)){for(let a of i)if(Ta(a)&&a.$refNode&&a.$refNode.offset<=e.offset&&a.$refNode.end>=e.end)return a.ref}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||YI(e,i)))return n}}}findDeclarationNode(e){let r=this.findDeclaration(e);if(r?.$cstNode){let n=this.nameProvider.getNameNode(r);return n??r.$cstNode}}findReferences(e,r){let n=[];if(r.includeDeclaration){let a=this.getReferenceToSelf(e);a&&n.push(a)}let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return r.documentUri&&(i=i.filter(a=>vs.equals(a.sourceUri,r.documentUri))),n.push(...i),an(n)}getReferenceToSelf(e){let r=this.nameProvider.getNameNode(e);if(r){let n=Va(e),i=this.nodeLocator.getAstNodePath(e);return{sourceUri:n.uri,sourcePath:i,targetUri:n.uri,targetPath:i,segment:Lp(r),local:!0}}}}});var Vl,Qp,H1=N(()=>{"use strict";Ys();Vl=class{static{o(this,"MultiMap")}constructor(e){if(this.map=new Map,e)for(let[r,n]of e)this.add(r,n)}get size(){return vg.sum(an(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,r){if(r===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(r);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){var r;return(r=this.map.get(e))!==null&&r!==void 0?r:[]}has(e,r){if(r===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(r)>=0:!1}}add(e,r){return this.map.has(e)?this.map.get(e).push(r):this.map.set(e,[r]),this}addAll(e,r){return this.map.has(e)?this.map.get(e).push(...r):this.map.set(e,Array.from(r)),this}forEach(e){this.map.forEach((r,n)=>r.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return an(this.map.entries()).flatMap(([e,r])=>r.map(n=>[e,n]))}keys(){return an(this.map.keys())}values(){return an(this.map.values()).flat()}entriesGroupedByKey(){return an(this.map.entries())}},Qp=class{static{o(this,"BiMap")}get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[r,n]of e)this.set(r,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,r){return this.map.set(e,r),this.inverse.set(r,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let r=this.map.get(e);return r!==void 0?(this.map.delete(e),this.inverse.delete(r),!0):!1}}});var Ib,lB=N(()=>{"use strict";el();hs();H1();tl();Ib=class{static{o(this,"DefaultScopeComputation")}constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async computeExports(e,r=br.CancellationToken.None){return this.computeExportsForNode(e.parseResult.value,e,void 0,r)}async computeExportsForNode(e,r,n=Vx,i=br.CancellationToken.None){let a=[];this.exportNode(e,a,r);for(let s of n(e))await bi(i),this.exportNode(s,a,r);return a}exportNode(e,r,n){let i=this.nameProvider.getName(e);i&&r.push(this.descriptions.createDescription(e,i,n))}async computeLocalScopes(e,r=br.CancellationToken.None){let n=e.parseResult.value,i=new Vl;for(let a of qc(n))await bi(r),this.processNode(a,e,i);return i}processNode(e,r,n){let i=e.$container;if(i){let a=this.nameProvider.getName(e);a&&n.add(i,this.descriptions.createDescription(e,a,r))}}}});var q1,Ob,rje,cB=N(()=>{"use strict";Ys();q1=class{static{o(this,"StreamScope")}constructor(e,r,n){var i;this.elements=e,this.outerScope=r,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let r=this.caseInsensitive?this.elements.find(n=>n.name.toLowerCase()===e.toLowerCase()):this.elements.find(n=>n.name===e);if(r)return r;if(this.outerScope)return this.outerScope.getElement(e)}},Ob=class{static{o(this,"MapScope")}constructor(e,r,n){var i;this.elements=new Map,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1;for(let a of e){let s=this.caseInsensitive?a.name.toLowerCase():a.name;this.elements.set(s,a)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getAllElements(){let e=an(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},rje={getElement(){},getAllElements(){return Rx}}});var W1,Pb,Zp,KS,Y1,QS=N(()=>{"use strict";W1=class{static{o(this,"DisposableCache")}constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},Pb=class extends W1{static{o(this,"SimpleCache")}constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,r){this.throwIfDisposed(),this.cache.set(e,r)}get(e,r){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(r){let n=r();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},Zp=class extends W1{static{o(this,"ContextCache")}constructor(e){super(),this.cache=new Map,this.converter=e??(r=>r)}has(e,r){return this.throwIfDisposed(),this.cacheForContext(e).has(r)}set(e,r,n){this.throwIfDisposed(),this.cacheForContext(e).set(r,n)}get(e,r,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(r))return i.get(r);if(n){let a=n();return i.set(r,a),a}else return}delete(e,r){return this.throwIfDisposed(),this.cacheForContext(e).delete(r)}clear(e){if(this.throwIfDisposed(),e){let r=this.converter(e);this.cache.delete(r)}else this.cache.clear()}cacheForContext(e){let r=this.converter(e),n=this.cache.get(r);return n||(n=new Map,this.cache.set(r,n)),n}},KS=class extends Zp{static{o(this,"DocumentCache")}constructor(e,r){super(n=>n.toString()),r?(this.toDispose.push(e.workspace.DocumentBuilder.onDocumentPhase(r,n=>{this.clear(n.uri.toString())})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{for(let a of i)this.clear(a)}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{let a=n.concat(i);for(let s of a)this.clear(s)}))}},Y1=class extends Pb{static{o(this,"WorkspaceCache")}constructor(e,r){super(),r?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(r,()=>{this.clear()})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{i.length>0&&this.clear()}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}}});var Bb,uB=N(()=>{"use strict";cB();hs();Ys();QS();Bb=class{static{o(this,"DefaultScopeProvider")}constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new Y1(e.shared)}getScope(e){let r=[],n=this.reflection.getReferenceType(e),i=Va(e.container).precomputedScopes;if(i){let s=e.container;do{let l=i.get(s);l.length>0&&r.push(an(l).filter(u=>this.reflection.isSubtype(u.type,n))),s=s.$container}while(s)}let a=this.getGlobalScope(n,e);for(let s=r.length-1;s>=0;s--)a=this.createScope(r[s],a);return a}createScope(e,r,n){return new q1(an(e),r,n)}createScopeForNodes(e,r,n){let i=an(e).map(a=>{let s=this.nameProvider.getName(a);if(s)return this.descriptions.createDescription(a,s)}).nonNullable();return new q1(i,r,n)}getGlobalScope(e,r){return this.globalScopeCache.get(e,()=>new Ob(this.indexManager.allElements(e)))}}});function hB(t){return typeof t.$comment=="string"}function pme(t){return typeof t=="object"&&!!t&&("$ref"in t||"$error"in t)}var Fb,ZS=N(()=>{"use strict";nB();Pl();hs();zl();o(hB,"isAstNodeWithComment");o(pme,"isIntermediateReference");Fb=class{static{o(this,"DefaultJsonSerializer")}constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,r){let n=r??{},i=r?.replacer,a=o((l,u)=>this.replacer(l,u,n),"defaultReplacer"),s=i?(l,u)=>i(l,u,a):a;try{return this.currentDocument=Va(e),JSON.stringify(e,s,r?.space)}finally{this.currentDocument=void 0}}deserialize(e,r){let n=r??{},i=JSON.parse(e);return this.linkNode(i,i,n),i}replacer(e,r,{refText:n,sourceText:i,textRegions:a,comments:s,uriConverter:l}){var u,h,f,d;if(!this.ignoreProperties.has(e))if(Ta(r)){let p=r.ref,m=n?r.$refText:void 0;if(p){let g=Va(p),y="";this.currentDocument&&this.currentDocument!==g&&(l?y=l(g.uri,r):y=g.uri.toString());let v=this.astNodeLocator.getAstNodePath(p);return{$ref:`${y}#${v}`,$refText:m}}else return{$error:(h=(u=r.error)===null||u===void 0?void 0:u.message)!==null&&h!==void 0?h:"Could not resolve reference",$refText:m}}else if(li(r)){let p;if(a&&(p=this.addAstNodeRegionWithAssignmentsTo(Object.assign({},r)),(!e||r.$document)&&p?.$textRegion&&(p.$textRegion.documentURI=(f=this.currentDocument)===null||f===void 0?void 0:f.uri.toString())),i&&!e&&(p??(p=Object.assign({},r)),p.$sourceText=(d=r.$cstNode)===null||d===void 0?void 0:d.text),s){p??(p=Object.assign({},r));let m=this.commentProvider.getComment(r);m&&(p.$comment=m.replace(/\r/g,""))}return p??r}else return r}addAstNodeRegionWithAssignmentsTo(e){let r=o(n=>({offset:n.offset,end:n.end,length:n.length,range:n.range}),"createDocumentSegment");if(e.$cstNode){let n=e.$textRegion=r(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(a=>!a.startsWith("$")).forEach(a=>{let s=DO(e.$cstNode,a).map(r);s.length!==0&&(i[a]=s)}),e}}linkNode(e,r,n,i,a,s){for(let[u,h]of Object.entries(e))if(Array.isArray(h))for(let f=0;f{"use strict";Qc();$b=class{static{o(this,"DefaultServiceRegistry")}get map(){return this.fileExtensionMap}constructor(e){this.languageIdMap=new Map,this.fileExtensionMap=new Map,this.textDocuments=e?.workspace.TextDocuments}register(e){let r=e.LanguageMetaData;for(let n of r.fileExtensions)this.fileExtensionMap.has(n)&&console.warn(`The file extension ${n} is used by multiple languages. It is now assigned to '${r.languageId}'.`),this.fileExtensionMap.set(n,e);this.languageIdMap.set(r.languageId,e),this.languageIdMap.size===1?this.singleton=e:this.singleton=void 0}getServices(e){var r,n;if(this.singleton!==void 0)return this.singleton;if(this.languageIdMap.size===0)throw new Error("The service registry is empty. Use `register` to register the services of a language.");let i=(n=(r=this.textDocuments)===null||r===void 0?void 0:r.get(e))===null||n===void 0?void 0:n.languageId;if(i!==void 0){let l=this.languageIdMap.get(i);if(l)return l}let a=vs.extname(e),s=this.fileExtensionMap.get(a);if(!s)throw i?new Error(`The service registry contains no services for the extension '${a}' for language '${i}'.`):new Error(`The service registry contains no services for the extension '${a}'.`);return s}hasServices(e){try{return this.getServices(e),!0}catch{return!1}}get all(){return Array.from(this.languageIdMap.values())}}});function Jp(t){return{code:t}}var X1,zb,Gb=N(()=>{"use strict";vo();H1();tl();Ys();o(Jp,"diagnosticData");(function(t){t.all=["fast","slow","built-in"]})(X1||(X1={}));zb=class{static{o(this,"ValidationRegistry")}constructor(e){this.entries=new Vl,this.entriesBefore=[],this.entriesAfter=[],this.reflection=e.shared.AstReflection}register(e,r=this,n="fast"){if(n==="built-in")throw new Error("The 'built-in' category is reserved for lexer, parser, and linker errors.");for(let[i,a]of Object.entries(e)){let s=a;if(Array.isArray(s))for(let l of s){let u={check:this.wrapValidationException(l,r),category:n};this.addEntry(i,u)}else if(typeof s=="function"){let l={check:this.wrapValidationException(s,r),category:n};this.addEntry(i,l)}else Uc(s)}}wrapValidationException(e,r){return async(n,i,a)=>{await this.handleException(()=>e.call(r,n,i,a),"An error occurred during validation",i,n)}}async handleException(e,r,n,i){try{await e()}catch(a){if(Kc(a))throw a;console.error(`${r}:`,a),a instanceof Error&&a.stack&&console.error(a.stack);let s=a instanceof Error?a.message:String(a);n("error",`${r}: ${s}`,{node:i})}}addEntry(e,r){if(e==="AstNode"){this.entries.add("AstNode",r);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,r)}getChecks(e,r){let n=an(this.entries.get(e)).concat(this.entries.get("AstNode"));return r&&(n=n.filter(i=>r.includes(i.category))),n.map(i=>i.check)}registerBeforeDocument(e,r=this){this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",r))}registerAfterDocument(e,r=this){this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",r))}wrapPreparationException(e,r,n){return async(i,a,s,l)=>{await this.handleException(()=>e.call(n,i,a,s,l),r,a,i)}}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}}});function mme(t){if(t.range)return t.range;let e;return typeof t.property=="string"?e=Xx(t.node.$cstNode,t.property,t.index):typeof t.keyword=="string"&&(e=RO(t.node.$cstNode,t.keyword,t.index)),e??(e=t.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}function JS(t){switch(t){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+t)}}function gme(t){switch(t){case"error":return Jp(rl.LexingError);case"warning":return Jp(rl.LexingWarning);case"info":return Jp(rl.LexingInfo);case"hint":return Jp(rl.LexingHint);default:throw new Error("Invalid diagnostic severity: "+t)}}var Vb,rl,dB=N(()=>{"use strict";el();zl();hs();Bl();tl();Gb();Vb=class{static{o(this,"DefaultDocumentValidator")}constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData}async validateDocument(e,r={},n=br.CancellationToken.None){let i=e.parseResult,a=[];if(await bi(n),(!r.categories||r.categories.includes("built-in"))&&(this.processLexingErrors(i,a,r),r.stopAfterLexingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===rl.LexingError})||(this.processParsingErrors(i,a,r),r.stopAfterParsingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===rl.ParsingError}))||(this.processLinkingErrors(e,a,r),r.stopAfterLinkingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===rl.LinkingError}))))return a;try{a.push(...await this.validateAst(i.value,r,n))}catch(s){if(Kc(s))throw s;console.error("An error occurred during validation:",s)}return await bi(n),a}processLexingErrors(e,r,n){var i,a,s;let l=[...e.lexerErrors,...(a=(i=e.lexerReport)===null||i===void 0?void 0:i.diagnostics)!==null&&a!==void 0?a:[]];for(let u of l){let h=(s=u.severity)!==null&&s!==void 0?s:"error",f={severity:JS(h),range:{start:{line:u.line-1,character:u.column-1},end:{line:u.line-1,character:u.column+u.length-1}},message:u.message,data:gme(h),source:this.getSource()};r.push(f)}}processParsingErrors(e,r,n){for(let i of e.parserErrors){let a;if(isNaN(i.token.startOffset)){if("previousToken"in i){let s=i.previousToken;if(isNaN(s.startOffset)){let l={line:0,character:0};a={start:l,end:l}}else{let l={line:s.endLine-1,character:s.endColumn};a={start:l,end:l}}}}else a=xg(i.token);if(a){let s={severity:JS("error"),range:a,message:i.message,data:Jp(rl.ParsingError),source:this.getSource()};r.push(s)}}}processLinkingErrors(e,r,n){for(let i of e.references){let a=i.error;if(a){let s={node:a.container,property:a.property,index:a.index,data:{code:rl.LinkingError,containerType:a.container.$type,property:a.property,refText:a.reference.$refText}};r.push(this.toDiagnostic("error",a.message,s))}}}async validateAst(e,r,n=br.CancellationToken.None){let i=[],a=o((s,l,u)=>{i.push(this.toDiagnostic(s,l,u))},"acceptor");return await this.validateAstBefore(e,r,a,n),await this.validateAstNodes(e,r,a,n),await this.validateAstAfter(e,r,a,n),i}async validateAstBefore(e,r,n,i=br.CancellationToken.None){var a;let s=this.validationRegistry.checksBefore;for(let l of s)await bi(i),await l(e,n,(a=r.categories)!==null&&a!==void 0?a:[],i)}async validateAstNodes(e,r,n,i=br.CancellationToken.None){await Promise.all(Jo(e).map(async a=>{await bi(i);let s=this.validationRegistry.getChecks(a.$type,r.categories);for(let l of s)await l(a,n,i)}))}async validateAstAfter(e,r,n,i=br.CancellationToken.None){var a;let s=this.validationRegistry.checksAfter;for(let l of s)await bi(i),await l(e,n,(a=r.categories)!==null&&a!==void 0?a:[],i)}toDiagnostic(e,r,n){return{message:r,range:mme(n),severity:JS(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};o(mme,"getDiagnosticRange");o(JS,"toDiagnosticSeverity");o(gme,"toDiagnosticData");(function(t){t.LexingError="lexing-error",t.LexingWarning="lexing-warning",t.LexingInfo="lexing-info",t.LexingHint="lexing-hint",t.ParsingError="parsing-error",t.LinkingError="linking-error"})(rl||(rl={}))});var Ub,Hb,pB=N(()=>{"use strict";el();Pl();hs();Bl();tl();Qc();Ub=class{static{o(this,"DefaultAstNodeDescriptionProvider")}constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,r,n){let i=n??Va(e);r??(r=this.nameProvider.getName(e));let a=this.astNodeLocator.getAstNodePath(e);if(!r)throw new Error(`Node at path ${a} has no name.`);let s,l=o(()=>{var u;return s??(s=Lp((u=this.nameProvider.getNameNode(e))!==null&&u!==void 0?u:e.$cstNode))},"nameSegmentGetter");return{node:e,name:r,get nameSegment(){return l()},selectionSegment:Lp(e.$cstNode),type:e.$type,documentUri:i.uri,path:a}}},Hb=class{static{o(this,"DefaultReferenceDescriptionProvider")}constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e,r=br.CancellationToken.None){let n=[],i=e.parseResult.value;for(let a of Jo(i))await bi(r),a1(a).filter(s=>!_p(s)).forEach(s=>{let l=this.createDescription(s);l&&n.push(l)});return n}createDescription(e){let r=e.reference.$nodeDescription,n=e.reference.$refNode;if(!r||!n)return;let i=Va(e.container).uri;return{sourceUri:i,sourcePath:this.nodeLocator.getAstNodePath(e.container),targetUri:r.documentUri,targetPath:r.path,segment:Lp(n),local:vs.equals(r.documentUri,i)}}}});var qb,mB=N(()=>{"use strict";qb=class{static{o(this,"DefaultAstNodeLocator")}constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let r=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return r+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:r}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return r!==void 0?e+this.indexSeparator+r:e}getAstNode(e,r){return r.split(this.segmentSeparator).reduce((i,a)=>{if(!i||a.length===0)return i;let s=a.indexOf(this.indexSeparator);if(s>0){let l=a.substring(0,s),u=parseInt(a.substring(s+1)),h=i[l];return h?.[u]}return i[a]},e)}}});var ei={};var e6=N(()=>{"use strict";Lr(ei,ja(ZP(),1))});var Wb,gB=N(()=>{"use strict";e6();tl();Wb=class{static{o(this,"DefaultConfigurationProvider")}constructor(e){this._ready=new gs,this.settings={},this.workspaceConfig=!1,this.onConfigurationSectionUpdateEmitter=new ei.Emitter,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){var r,n;this.workspaceConfig=(n=(r=e.capabilities.workspace)===null||r===void 0?void 0:r.configuration)!==null&&n!==void 0?n:!1}async initialized(e){if(this.workspaceConfig){if(e.register){let r=this.serviceRegistry.all;e.register({section:r.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let r=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=await e.fetchConfiguration(r);r.forEach((i,a)=>{this.updateSectionConfiguration(i.section,n[a])})}}this._ready.resolve()}updateConfiguration(e){e.settings&&Object.keys(e.settings).forEach(r=>{let n=e.settings[r];this.updateSectionConfiguration(r,n),this.onConfigurationSectionUpdateEmitter.fire({section:r,configuration:n})})}updateSectionConfiguration(e,r){this.settings[e]=r}async getConfiguration(e,r){await this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][r]}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}}});var Gf,yB=N(()=>{"use strict";(function(t){function e(r){return{dispose:o(async()=>await r(),"dispose")}}o(e,"create"),t.create=e})(Gf||(Gf={}))});var Yb,vB=N(()=>{"use strict";el();yB();H1();tl();Ys();Gb();U1();Yb=class{static{o(this,"DefaultDocumentBuilder")}constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new Vl,this.documentPhaseListeners=new Vl,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=Ln.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.textDocuments=e.workspace.TextDocuments,this.indexManager=e.workspace.IndexManager,this.serviceRegistry=e.ServiceRegistry}async build(e,r={},n=br.CancellationToken.None){var i,a;for(let s of e){let l=s.uri.toString();if(s.state===Ln.Validated){if(typeof r.validation=="boolean"&&r.validation)s.state=Ln.IndexedReferences,s.diagnostics=void 0,this.buildState.delete(l);else if(typeof r.validation=="object"){let u=this.buildState.get(l),h=(i=u?.result)===null||i===void 0?void 0:i.validationChecks;if(h){let d=((a=r.validation.categories)!==null&&a!==void 0?a:X1.all).filter(p=>!h.includes(p));d.length>0&&(this.buildState.set(l,{completed:!1,options:{validation:Object.assign(Object.assign({},r.validation),{categories:d})},result:u.result}),s.state=Ln.IndexedReferences)}}}else this.buildState.delete(l)}this.currentState=Ln.Changed,await this.emitUpdate(e.map(s=>s.uri),[]),await this.buildDocuments(e,r,n)}async update(e,r,n=br.CancellationToken.None){this.currentState=Ln.Changed;for(let s of r)this.langiumDocuments.deleteDocument(s),this.buildState.delete(s.toString()),this.indexManager.remove(s);for(let s of e){if(!this.langiumDocuments.invalidateDocument(s)){let u=this.langiumDocumentFactory.fromModel({$type:"INVALID"},s);u.state=Ln.Changed,this.langiumDocuments.addDocument(u)}this.buildState.delete(s.toString())}let i=an(e).concat(r).map(s=>s.toString()).toSet();this.langiumDocuments.all.filter(s=>!i.has(s.uri.toString())&&this.shouldRelink(s,i)).forEach(s=>{this.serviceRegistry.getServices(s.uri).references.Linker.unlink(s),s.state=Math.min(s.state,Ln.ComputedScopes),s.diagnostics=void 0}),await this.emitUpdate(e,r),await bi(n);let a=this.sortDocuments(this.langiumDocuments.all.filter(s=>{var l;return s.staten(e,r)))}sortDocuments(e){let r=0,n=e.length-1;for(;r=0&&!this.hasTextDocument(e[n]);)n--;rn.error!==void 0)?!0:this.indexManager.isAffected(e,r)}onUpdate(e){return this.updateListeners.push(e),Gf.create(()=>{let r=this.updateListeners.indexOf(e);r>=0&&this.updateListeners.splice(r,1)})}async buildDocuments(e,r,n){this.prepareBuild(e,r),await this.runCancelable(e,Ln.Parsed,n,a=>this.langiumDocumentFactory.update(a,n)),await this.runCancelable(e,Ln.IndexedContent,n,a=>this.indexManager.updateContent(a,n)),await this.runCancelable(e,Ln.ComputedScopes,n,async a=>{let s=this.serviceRegistry.getServices(a.uri).references.ScopeComputation;a.precomputedScopes=await s.computeLocalScopes(a,n)}),await this.runCancelable(e,Ln.Linked,n,a=>this.serviceRegistry.getServices(a.uri).references.Linker.link(a,n)),await this.runCancelable(e,Ln.IndexedReferences,n,a=>this.indexManager.updateReferences(a,n));let i=e.filter(a=>this.shouldValidate(a));await this.runCancelable(i,Ln.Validated,n,a=>this.validate(a,n));for(let a of e){let s=this.buildState.get(a.uri.toString());s&&(s.completed=!0)}}prepareBuild(e,r){for(let n of e){let i=n.uri.toString(),a=this.buildState.get(i);(!a||a.completed)&&this.buildState.set(i,{completed:!1,options:r,result:a?.result})}}async runCancelable(e,r,n,i){let a=e.filter(l=>l.statel.state===r);await this.notifyBuildPhase(s,r,n),this.currentState=r}onBuildPhase(e,r){return this.buildPhaseListeners.add(e,r),Gf.create(()=>{this.buildPhaseListeners.delete(e,r)})}onDocumentPhase(e,r){return this.documentPhaseListeners.add(e,r),Gf.create(()=>{this.documentPhaseListeners.delete(e,r)})}waitUntil(e,r,n){let i;if(r&&"path"in r?i=r:n=r,n??(n=br.CancellationToken.None),i){let a=this.langiumDocuments.getDocument(i);if(a&&a.state>e)return Promise.resolve(i)}return this.currentState>=e?Promise.resolve(void 0):n.isCancellationRequested?Promise.reject(jc):new Promise((a,s)=>{let l=this.onBuildPhase(e,()=>{if(l.dispose(),u.dispose(),i){let h=this.langiumDocuments.getDocument(i);a(h?.uri)}else a(void 0)}),u=n.onCancellationRequested(()=>{l.dispose(),u.dispose(),s(jc)})})}async notifyDocumentPhase(e,r,n){let a=this.documentPhaseListeners.get(r).slice();for(let s of a)try{await s(e,n)}catch(l){if(!Kc(l))throw l}}async notifyBuildPhase(e,r,n){if(e.length===0)return;let a=this.buildPhaseListeners.get(r).slice();for(let s of a)await bi(n),await s(e,n)}shouldValidate(e){return!!this.getBuildOptions(e).validation}async validate(e,r){var n,i;let a=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,s=this.getBuildOptions(e).validation,l=typeof s=="object"?s:void 0,u=await a.validateDocument(e,l,r);e.diagnostics?e.diagnostics.push(...u):e.diagnostics=u;let h=this.buildState.get(e.uri.toString());if(h){(n=h.result)!==null&&n!==void 0||(h.result={});let f=(i=l?.categories)!==null&&i!==void 0?i:X1.all;h.result.validationChecks?h.result.validationChecks.push(...f):h.result.validationChecks=[...f]}}getBuildOptions(e){var r,n;return(n=(r=this.buildState.get(e.uri.toString()))===null||r===void 0?void 0:r.options)!==null&&n!==void 0?n:{}}}});var Xb,xB=N(()=>{"use strict";hs();QS();el();Ys();Qc();Xb=class{static{o(this,"DefaultIndexManager")}constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new Zp,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,r){let n=Va(e).uri,i=[];return this.referenceIndex.forEach(a=>{a.forEach(s=>{vs.equals(s.targetUri,n)&&s.targetPath===r&&i.push(s)})}),an(i)}allElements(e,r){let n=an(this.symbolIndex.keys());return r&&(n=n.filter(i=>!r||r.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,r){var n;return r?this.symbolByTypeIndex.get(e,r,()=>{var a;return((a=this.symbolIndex.get(e))!==null&&a!==void 0?a:[]).filter(l=>this.astReflection.isSubtype(l.type,r))}):(n=this.symbolIndex.get(e))!==null&&n!==void 0?n:[]}remove(e){let r=e.toString();this.symbolIndex.delete(r),this.symbolByTypeIndex.clear(r),this.referenceIndex.delete(r)}async updateContent(e,r=br.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).references.ScopeComputation.computeExports(e,r),a=e.uri.toString();this.symbolIndex.set(a,i),this.symbolByTypeIndex.clear(a)}async updateReferences(e,r=br.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,r);this.referenceIndex.set(e.uri.toString(),i)}isAffected(e,r){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&r.has(i.targetUri.toString())):!1}}});var jb,bB=N(()=>{"use strict";el();tl();Qc();jb=class{static{o(this,"DefaultWorkspaceManager")}constructor(e){this.initialBuildOptions={},this._ready=new gs,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}get workspaceFolders(){return this.folders}initialize(e){var r;this.folders=(r=e.workspaceFolders)!==null&&r!==void 0?r:void 0}initialized(e){return this.mutex.write(r=>{var n;return this.initializeWorkspace((n=this.folders)!==null&&n!==void 0?n:[],r)})}async initializeWorkspace(e,r=br.CancellationToken.None){let n=await this.performStartup(e);await bi(r),await this.documentBuilder.build(n,this.initialBuildOptions,r)}async performStartup(e){let r=this.serviceRegistry.all.flatMap(a=>a.LanguageMetaData.fileExtensions),n=[],i=o(a=>{n.push(a),this.langiumDocuments.hasDocument(a.uri)||this.langiumDocuments.addDocument(a)},"collector");return await this.loadAdditionalDocuments(e,i),await Promise.all(e.map(a=>[a,this.getRootFolder(a)]).map(async a=>this.traverseFolder(...a,r,i))),this._ready.resolve(),n}loadAdditionalDocuments(e,r){return Promise.resolve()}getRootFolder(e){return ys.parse(e.uri)}async traverseFolder(e,r,n,i){let a=await this.fileSystemProvider.readDirectory(r);await Promise.all(a.map(async s=>{if(this.includeEntry(e,s,n)){if(s.isDirectory)await this.traverseFolder(e,s.uri,n,i);else if(s.isFile){let l=await this.langiumDocuments.getOrCreateDocument(s.uri);i(l)}}}))}includeEntry(e,r,n){let i=vs.basename(r.uri);if(i.startsWith("."))return!1;if(r.isDirectory)return i!=="node_modules"&&i!=="out";if(r.isFile){let a=vs.extname(r.uri);return n.includes(a)}return!1}}});function r6(t){return Array.isArray(t)&&(t.length===0||"name"in t[0])}function wB(t){return t&&"modes"in t&&"defaultMode"in t}function TB(t){return!r6(t)&&!wB(t)}var Kb,t6,e0,n6=N(()=>{"use strict";Ff();Kb=class{static{o(this,"DefaultLexerErrorMessageProvider")}buildUnexpectedCharactersMessage(e,r,n,i,a){return x1.buildUnexpectedCharactersMessage(e,r,n,i,a)}buildUnableToPopLexerModeMessage(e){return x1.buildUnableToPopLexerModeMessage(e)}},t6={mode:"full"},e0=class{static{o(this,"DefaultLexer")}constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;let r=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(r);let n=TB(r)?Object.values(r):r,i=e.LanguageMetaData.mode==="production";this.chevrotainLexer=new Zn(n,{positionTracking:"full",skipValidations:i,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e,r=t6){var n,i,a;let s=this.chevrotainLexer.tokenize(e);return{tokens:s.tokens,errors:s.errors,hidden:(n=s.groups.hidden)!==null&&n!==void 0?n:[],report:(a=(i=this.tokenBuilder).flushLexingReport)===null||a===void 0?void 0:a.call(i,e)}}toTokenTypeDictionary(e){if(TB(e))return e;let r=wB(e)?Object.values(e.modes).flat():e,n={};return r.forEach(i=>n[i.name]=i),n}};o(r6,"isTokenTypeArray");o(wB,"isIMultiModeLexerDefinition");o(TB,"isTokenTypeDictionary")});function SB(t,e,r){let n,i;typeof t=="string"?(i=e,n=r):(i=t.range.start,n=e),i||(i=tn.create(0,0));let a=xme(t),s=AB(n),l=ije({lines:a,position:i,options:s});return cje({index:0,tokens:l,position:i})}function CB(t,e){let r=AB(e),n=xme(t);if(n.length===0)return!1;let i=n[0],a=n[n.length-1],s=r.start,l=r.end;return!!s?.exec(i)&&!!l?.exec(a)}function xme(t){let e="";return typeof t=="string"?e=t:e=t.text,e.split(TO)}function ije(t){var e,r,n;let i=[],a=t.position.line,s=t.position.character;for(let l=0;l=f.length){if(i.length>0){let m=tn.create(a,s);i.push({type:"break",content:"",range:Gr.create(m,m)})}}else{yme.lastIndex=d;let m=yme.exec(f);if(m){let g=m[0],y=m[1],v=tn.create(a,s+d),x=tn.create(a,s+d+g.length);i.push({type:"tag",content:y,range:Gr.create(v,x)}),d+=g.length,d=EB(f,d)}if(d0&&i[i.length-1].type==="break"?i.slice(0,-1):i}function aje(t,e,r,n){let i=[];if(t.length===0){let a=tn.create(r,n),s=tn.create(r,n+e.length);i.push({type:"text",content:e,range:Gr.create(a,s)})}else{let a=0;for(let l of t){let u=l.index,h=e.substring(a,u);h.length>0&&i.push({type:"text",content:e.substring(a,u),range:Gr.create(tn.create(r,a+n),tn.create(r,u+n))});let f=h.length+1,d=l[1];if(i.push({type:"inline-tag",content:d,range:Gr.create(tn.create(r,a+f+n),tn.create(r,a+f+d.length+n))}),f+=d.length,l.length===4){f+=l[2].length;let p=l[3];i.push({type:"text",content:p,range:Gr.create(tn.create(r,a+f+n),tn.create(r,a+f+p.length+n))})}else i.push({type:"text",content:"",range:Gr.create(tn.create(r,a+f+n),tn.create(r,a+f+n))});a=u+l[0].length}let s=e.substring(a);s.length>0&&i.push({type:"text",content:s,range:Gr.create(tn.create(r,a+n),tn.create(r,a+n+s.length))})}return i}function EB(t,e){let r=t.substring(e).match(sje);return r?e+r.index:t.length}function lje(t){let e=t.match(oje);if(e&&typeof e.index=="number")return e.index}function cje(t){var e,r,n,i;let a=tn.create(t.position.line,t.position.character);if(t.tokens.length===0)return new i6([],Gr.create(a,a));let s=[];for(;t.index0){let u=EB(e,a);s=e.substring(u),e=e.substring(0,a)}return(t==="linkcode"||t==="link"&&r.link==="code")&&(s=`\`${s}\``),(i=(n=r.renderLink)===null||n===void 0?void 0:n.call(r,e,s))!==null&&i!==void 0?i:pje(e,s)}}function pje(t,e){try{return ys.parse(t,!0),`[${e}](${t})`}catch{return t}}function vme(t){return t.endsWith(` +`)?` +`:` + +`}var yme,nje,sje,oje,i6,Qb,Zb,a6,_B=N(()=>{"use strict";BP();l1();Qc();o(SB,"parseJSDoc");o(CB,"isJSDoc");o(xme,"getLines");yme=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,nje=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;o(ije,"tokenize");o(aje,"buildInlineTokens");sje=/\S/,oje=/\s*$/;o(EB,"skipWhitespace");o(lje,"lastCharacter");o(cje,"parseJSDocComment");o(uje,"parseJSDocElement");o(hje,"appendEmptyLine");o(bme,"parseJSDocText");o(fje,"parseJSDocInline");o(Tme,"parseJSDocTag");o(wme,"parseJSDocLine");o(AB,"normalizeOptions");o(kB,"normalizeOption");i6=class{static{o(this,"JSDocCommentImpl")}constructor(e,r){this.elements=e,this.range=r}getTag(e){return this.getAllTags().find(r=>r.name===e)}getTags(e){return this.getAllTags().filter(r=>r.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let r of this.elements)if(e.length===0)e=r.toString();else{let n=r.toString();e+=vme(e)+n}return e.trim()}toMarkdown(e){let r="";for(let n of this.elements)if(r.length===0)r=n.toMarkdown(e);else{let i=n.toMarkdown(e);r+=vme(r)+i}return r.trim()}},Qb=class{static{o(this,"JSDocTagImpl")}constructor(e,r,n,i){this.name=e,this.content=r,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,r=this.content.toString();return this.content.inlines.length===1?e=`${e} ${r}`:this.content.inlines.length>1&&(e=`${e} +${r}`),this.inline?`{${e}}`:e}toMarkdown(e){var r,n;return(n=(r=e?.renderTag)===null||r===void 0?void 0:r.call(e,this))!==null&&n!==void 0?n:this.toMarkdownDefault(e)}toMarkdownDefault(e){let r=this.content.toMarkdown(e);if(this.inline){let a=dje(this.name,r,e??{});if(typeof a=="string")return a}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${r}`:this.content.inlines.length>1&&(i=`${i} +${r}`),this.inline?`{${i}}`:i}};o(dje,"renderInlineTag");o(pje,"renderLinkDefault");Zb=class{static{o(this,"JSDocTextImpl")}constructor(e,r){this.inlines=e,this.range=r}toString(){let e="";for(let r=0;rn.range.start.line&&(e+=` +`)}return e}toMarkdown(e){let r="";for(let n=0;ni.range.start.line&&(r+=` +`)}return r}},a6=class{static{o(this,"JSDocLineImpl")}constructor(e,r){this.text=e,this.range=r}toString(){return this.text}toMarkdown(){return this.text}};o(vme,"fillNewlines")});var Jb,DB=N(()=>{"use strict";hs();_B();Jb=class{static{o(this,"JSDocDocumentationProvider")}constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let r=this.commentProvider.getComment(e);if(r&&CB(r))return SB(r).toMarkdown({renderLink:o((i,a)=>this.documentationLinkRenderer(e,i,a),"renderLink"),renderTag:o(i=>this.documentationTagRenderer(e,i),"renderTag")})}documentationLinkRenderer(e,r,n){var i;let a=(i=this.findNameInPrecomputedScopes(e,r))!==null&&i!==void 0?i:this.findNameInGlobalScope(e,r);if(a&&a.nameSegment){let s=a.nameSegment.range.start.line+1,l=a.nameSegment.range.start.character+1,u=a.documentUri.with({fragment:`L${s},${l}`});return`[${n}](${u.toString()})`}else return}documentationTagRenderer(e,r){}findNameInPrecomputedScopes(e,r){let i=Va(e).precomputedScopes;if(!i)return;let a=e;do{let l=i.get(a).find(u=>u.name===r);if(l)return l;a=a.$container}while(a)}findNameInGlobalScope(e,r){return this.indexManager.allElements().find(i=>i.name===r)}}});var e4,LB=N(()=>{"use strict";ZS();Bl();e4=class{static{o(this,"DefaultCommentProvider")}constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){var r;return hB(e)?e.$comment:(r=jI(e.$cstNode,this.grammarConfig().multilineCommentRules))===null||r===void 0?void 0:r.text}}});var t4,RB,NB,MB=N(()=>{"use strict";tl();e6();t4=class{static{o(this,"DefaultAsyncParser")}constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,r){return Promise.resolve(this.syncParser.parse(e))}},RB=class{static{o(this,"AbstractThreadedAsyncParser")}constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let r=this.queue.shift();r&&(e.lock(),r.resolve(e))}}),this.workerPool.push(e)}}async parse(e,r){let n=await this.acquireParserWorker(r),i=new gs,a,s=r.onCancellationRequested(()=>{a=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(l=>{let u=this.hydrator.hydrate(l);i.resolve(u)}).catch(l=>{i.reject(l)}).finally(()=>{s.dispose(),clearTimeout(a)}),i.promise}terminateWorker(e){e.terminate();let r=this.workerPool.indexOf(e);r>=0&&this.workerPool.splice(r,1)}async acquireParserWorker(e){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let r=new gs;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(r);n>=0&&this.queue.splice(n,1),r.reject(jc)}),this.queue.push(r),r.promise}},NB=class{static{o(this,"ParserWorker")}get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,r,n,i){this.onReadyEmitter=new ei.Emitter,this.deferred=new gs,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,r(a=>{let s=a;this.deferred.resolve(s),this.unlock()}),n(a=>{this.deferred.reject(a),this.unlock()})}terminate(){this.deferred.reject(jc),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new gs,this.sendMessage(e),this.deferred.promise}}});var r4,IB=N(()=>{"use strict";el();tl();r4=class{static{o(this,"DefaultWorkspaceLock")}constructor(){this.previousTokenSource=new br.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let r=XS();return this.previousTokenSource=r,this.enqueue(this.writeQueue,e,r.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,r,n=br.CancellationToken.None){let i=new gs,a={action:r,deferred:i,cancellationToken:n};return e.push(a),this.performNextOperation(),i.promise}async performNextOperation(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,await Promise.all(e.map(async({action:r,deferred:n,cancellationToken:i})=>{try{let a=await Promise.resolve().then(()=>r(i));n.resolve(a)}catch(a){Kc(a)?n.resolve(void 0):n.reject(a)}})),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}}});var n4,OB=N(()=>{"use strict";FS();Hc();Pl();hs();H1();Bl();n4=class{static{o(this,"DefaultHydrator")}constructor(e){this.grammarElementIdMap=new Qp,this.tokenTypeIdMap=new Qp,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport?this.dehydrateLexerReport(e.lexerReport):void 0,parserErrors:e.parserErrors.map(r=>Object.assign(Object.assign({},r),{message:r.message})),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){let r=new Map,n=new Map;for(let i of Jo(e))r.set(i,{});if(e.$cstNode)for(let i of Dp(e.$cstNode))n.set(i,{});return{astNodes:r,cstNodes:n}}dehydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,r));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)li(l)?s.push(this.dehydrateAstNode(l,r)):Ta(l)?s.push(this.dehydrateReference(l,r)):s.push(l)}else li(a)?n[i]=this.dehydrateAstNode(a,r):Ta(a)?n[i]=this.dehydrateReference(a,r):a!==void 0&&(n[i]=a);return n}dehydrateReference(e,r){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=r.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,r){let n=r.cstNodes.get(e);return Lx(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=r.astNodes.get(e.astNode),Ol(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,r)):If(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let r=e.value,n=this.createHydrationContext(r);return"$cstNode"in r&&this.hydrateCstNode(r.$cstNode,n),{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport,parserErrors:e.parserErrors,value:this.hydrateAstNode(r,n)}}createHydrationContext(e){let r=new Map,n=new Map;for(let a of Jo(e))r.set(a,{});let i;if(e.$cstNode)for(let a of Dp(e.$cstNode)){let s;"fullText"in a?(s=new B1(a.fullText),i=s):"content"in a?s=new Xp:"tokenType"in a&&(s=this.hydrateCstLeafNode(a)),s&&(n.set(a,s),s.root=i)}return{astNodes:r,cstNodes:n}}hydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=r.cstNodes.get(e.$cstNode));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)li(l)?s.push(this.setParent(this.hydrateAstNode(l,r),n)):Ta(l)?s.push(this.hydrateReference(l,n,i,r)):s.push(l)}else li(a)?n[i]=this.setParent(this.hydrateAstNode(a,r),n):Ta(a)?n[i]=this.hydrateReference(a,n,i,r):a!==void 0&&(n[i]=a);return n}setParent(e,r){return e.$container=r,e}hydrateReference(e,r,n,i){return this.linker.buildReference(r,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,r,n=0){let i=r.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=r.astNodes.get(e.astNode),Ol(i))for(let a of e.content){let s=this.hydrateCstNode(a,r,n++);i.content.push(s)}return i}hydrateCstLeafNode(e){let r=this.getTokenType(e.tokenType),n=e.offset,i=e.length,a=e.startLine,s=e.startColumn,l=e.endLine,u=e.endColumn,h=e.hidden;return new Yp(n,i,{start:{line:a,character:s},end:{line:l,character:u}},r,h)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(let r of Jo(this.grammar))Fx(r)&&this.grammarElementIdMap.set(r,e++)}}});function wa(t){return{documentation:{CommentProvider:o(e=>new e4(e),"CommentProvider"),DocumentationProvider:o(e=>new Jb(e),"DocumentationProvider")},parser:{AsyncParser:o(e=>new t4(e),"AsyncParser"),GrammarConfig:o(e=>PO(e),"GrammarConfig"),LangiumParser:o(e=>HP(e),"LangiumParser"),CompletionParser:o(e=>VP(e),"CompletionParser"),ValueConverter:o(()=>new Kp,"ValueConverter"),TokenBuilder:o(()=>new th,"TokenBuilder"),Lexer:o(e=>new e0(e),"Lexer"),ParserErrorMessageProvider:o(()=>new F1,"ParserErrorMessageProvider"),LexerErrorMessageProvider:o(()=>new Kb,"LexerErrorMessageProvider")},workspace:{AstNodeLocator:o(()=>new qb,"AstNodeLocator"),AstNodeDescriptionProvider:o(e=>new Ub(e),"AstNodeDescriptionProvider"),ReferenceDescriptionProvider:o(e=>new Hb(e),"ReferenceDescriptionProvider")},references:{Linker:o(e=>new Rb(e),"Linker"),NameProvider:o(()=>new Nb,"NameProvider"),ScopeProvider:o(e=>new Bb(e),"ScopeProvider"),ScopeComputation:o(e=>new Ib(e),"ScopeComputation"),References:o(e=>new Mb(e),"References")},serializer:{Hydrator:o(e=>new n4(e),"Hydrator"),JsonSerializer:o(e=>new Fb(e),"JsonSerializer")},validation:{DocumentValidator:o(e=>new Vb(e),"DocumentValidator"),ValidationRegistry:o(e=>new zb(e),"ValidationRegistry")},shared:o(()=>t.shared,"shared")}}function ka(t){return{ServiceRegistry:o(e=>new $b(e),"ServiceRegistry"),workspace:{LangiumDocuments:o(e=>new Lb(e),"LangiumDocuments"),LangiumDocumentFactory:o(e=>new Db(e),"LangiumDocumentFactory"),DocumentBuilder:o(e=>new Yb(e),"DocumentBuilder"),IndexManager:o(e=>new Xb(e),"IndexManager"),WorkspaceManager:o(e=>new jb(e),"WorkspaceManager"),FileSystemProvider:o(e=>t.fileSystemProvider(e),"FileSystemProvider"),WorkspaceLock:o(()=>new r4,"WorkspaceLock"),ConfigurationProvider:o(e=>new Wb(e),"ConfigurationProvider")}}}var PB=N(()=>{"use strict";BO();UP();qP();US();WP();aB();sB();oB();lB();uB();ZS();fB();dB();Gb();pB();mB();gB();vB();U1();xB();bB();n6();DB();LB();Ab();MB();IB();OB();o(wa,"createDefaultCoreModule");o(ka,"createDefaultSharedCoreModule")});function Hn(t,e,r,n,i,a,s,l,u){let h=[t,e,r,n,i,a,s,l,u].reduce(s6,{});return Ame(h)}function Cme(t){if(t&&t[Sme])for(let e of Object.values(t))Cme(e);return t}function Ame(t,e){let r=new Proxy({},{deleteProperty:o(()=>!1,"deleteProperty"),set:o(()=>{throw new Error("Cannot set property on injected service container")},"set"),get:o((n,i)=>i===Sme?!0:Eme(n,i,t,e||r),"get"),getOwnPropertyDescriptor:o((n,i)=>(Eme(n,i,t,e||r),Object.getOwnPropertyDescriptor(n,i)),"getOwnPropertyDescriptor"),has:o((n,i)=>i in t,"has"),ownKeys:o(()=>[...Object.getOwnPropertyNames(t)],"ownKeys")});return r}function Eme(t,e,r,n){if(e in t){if(t[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable.",{cause:t[e]});if(t[e]===kme)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return t[e]}else if(e in r){let i=r[e];t[e]=kme;try{t[e]=typeof i=="function"?i(n):Ame(i,n)}catch(a){throw t[e]=a instanceof Error?a:void 0,a}return t[e]}else return}function s6(t,e){if(e){for(let[r,n]of Object.entries(e))if(n!==void 0){let i=t[r];i!==null&&n!==null&&typeof i=="object"&&typeof n=="object"?t[r]=s6(i,n):t[r]=n}}return t}var BB,Sme,kme,FB=N(()=>{"use strict";(function(t){t.merge=(e,r)=>s6(s6({},e),r)})(BB||(BB={}));o(Hn,"inject");Sme=Symbol("isProxy");o(Cme,"eagerLoad");o(Ame,"_inject");kme=Symbol();o(Eme,"_resolve");o(s6,"_merge")});var _me=N(()=>{"use strict"});var Dme=N(()=>{"use strict";LB();DB();_B()});var Lme=N(()=>{"use strict"});var Rme=N(()=>{"use strict";BO();Lme()});var $B,t0,o6,zB,Nme=N(()=>{"use strict";Ff();US();n6();$B={indentTokenName:"INDENT",dedentTokenName:"DEDENT",whitespaceTokenName:"WS",ignoreIndentationDelimiters:[]};(function(t){t.REGULAR="indentation-sensitive",t.IGNORE_INDENTATION="ignore-indentation"})(t0||(t0={}));o6=class extends th{static{o(this,"IndentationAwareTokenBuilder")}constructor(e=$B){super(),this.indentationStack=[0],this.whitespaceRegExp=/[ \t]+/y,this.options=Object.assign(Object.assign({},$B),e),this.indentTokenType=Pf({name:this.options.indentTokenName,pattern:this.indentMatcher.bind(this),line_breaks:!1}),this.dedentTokenType=Pf({name:this.options.dedentTokenName,pattern:this.dedentMatcher.bind(this),line_breaks:!1})}buildTokens(e,r){let n=super.buildTokens(e,r);if(!r6(n))throw new Error("Invalid tokens built by default builder");let{indentTokenName:i,dedentTokenName:a,whitespaceTokenName:s,ignoreIndentationDelimiters:l}=this.options,u,h,f,d=[];for(let p of n){for(let[m,g]of l)p.name===m?p.PUSH_MODE=t0.IGNORE_INDENTATION:p.name===g&&(p.POP_MODE=!0);p.name===a?u=p:p.name===i?h=p:p.name===s?f=p:d.push(p)}if(!u||!h||!f)throw new Error("Some indentation/whitespace tokens not found!");return l.length>0?{modes:{[t0.REGULAR]:[u,h,...d,f],[t0.IGNORE_INDENTATION]:[...d,f]},defaultMode:t0.REGULAR}:[u,h,f,...d]}flushLexingReport(e){let r=super.flushLexingReport(e);return Object.assign(Object.assign({},r),{remainingDedents:this.flushRemainingDedents(e)})}isStartOfLine(e,r){return r===0||`\r +`.includes(e[r-1])}matchWhitespace(e,r,n,i){var a;this.whitespaceRegExp.lastIndex=r;let s=this.whitespaceRegExp.exec(e);return{currIndentLevel:(a=s?.[0].length)!==null&&a!==void 0?a:0,prevIndentLevel:this.indentationStack.at(-1),match:s}}createIndentationTokenInstance(e,r,n,i){let a=this.getLineNumber(r,i);return Qu(e,n,i,i+n.length,a,a,1,n.length)}getLineNumber(e,r){return e.substring(0,r).split(/\r\n|\r|\n/).length}indentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:a,prevIndentLevel:s,match:l}=this.matchWhitespace(e,r,n,i);return a<=s?null:(this.indentationStack.push(a),l)}dedentMatcher(e,r,n,i){var a,s,l,u;if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:h,prevIndentLevel:f,match:d}=this.matchWhitespace(e,r,n,i);if(h>=f)return null;let p=this.indentationStack.lastIndexOf(h);if(p===-1)return this.diagnostics.push({severity:"error",message:`Invalid dedent level ${h} at offset: ${r}. Current indentation stack: ${this.indentationStack}`,offset:r,length:(s=(a=d?.[0])===null||a===void 0?void 0:a.length)!==null&&s!==void 0?s:0,line:this.getLineNumber(e,r),column:1}),null;let m=this.indentationStack.length-p-1,g=(u=(l=e.substring(0,r).match(/[\r\n]+$/))===null||l===void 0?void 0:l[0].length)!==null&&u!==void 0?u:1;for(let y=0;y1;)r.push(this.createIndentationTokenInstance(this.dedentTokenType,e,"",e.length)),this.indentationStack.pop();return this.indentationStack=[0],r}},zB=class extends e0{static{o(this,"IndentationAwareLexer")}constructor(e){if(super(e),e.parser.TokenBuilder instanceof o6)this.indentationTokenBuilder=e.parser.TokenBuilder;else throw new Error("IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder")}tokenize(e,r=t6){let n=super.tokenize(e),i=n.report;r?.mode==="full"&&n.tokens.push(...i.remainingDedents),i.remainingDedents=[];let{indentTokenType:a,dedentTokenType:s}=this.indentationTokenBuilder,l=a.tokenTypeIdx,u=s.tokenTypeIdx,h=[],f=n.tokens.length-1;for(let d=0;d=0&&h.push(n.tokens[f]),n.tokens=h,n}}});var Mme=N(()=>{"use strict"});var Ime=N(()=>{"use strict";MB();UP();FS();Nme();qP();Ab();n6();VS();Mme();US();WP()});var Ome=N(()=>{"use strict";aB();sB();oB();cB();lB();uB()});var Pme=N(()=>{"use strict";OB();ZS()});var l6,Ea,GB=N(()=>{"use strict";l6=class{static{o(this,"EmptyFileSystemProvider")}readFile(){throw new Error("No file system is available.")}async readDirectory(){return[]}},Ea={fileSystemProvider:o(()=>new l6,"fileSystemProvider")}});function yje(){let t=Hn(ka(Ea),gje),e=Hn(wa({shared:t}),mje);return t.ServiceRegistry.register(e),e}function Zc(t){var e;let r=yje(),n=r.serializer.JsonSerializer.deserialize(t);return r.shared.workspace.LangiumDocumentFactory.fromModel(n,ys.parse(`memory://${(e=n.name)!==null&&e!==void 0?e:"grammar"}.langium`)),n}var mje,gje,Bme=N(()=>{"use strict";PB();FB();Hc();GB();Qc();mje={Grammar:o(()=>{},"Grammar"),LanguageMetaData:o(()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"}),"LanguageMetaData")},gje={AstReflection:o(()=>new i1,"AstReflection")};o(yje,"createMinimalGrammarServices");o(Zc,"loadGrammarFromJson")});var Xr={};dr(Xr,{AstUtils:()=>GE,BiMap:()=>Qp,Cancellation:()=>br,ContextCache:()=>Zp,CstUtils:()=>RE,DONE_RESULT:()=>za,Deferred:()=>gs,Disposable:()=>Gf,DisposableCache:()=>W1,DocumentCache:()=>KS,EMPTY_STREAM:()=>Rx,ErrorWithLocation:()=>Rp,GrammarUtils:()=>WE,MultiMap:()=>Vl,OperationCancelled:()=>jc,Reduction:()=>vg,RegExpUtils:()=>HE,SimpleCache:()=>Pb,StreamImpl:()=>po,TreeStreamImpl:()=>Gc,URI:()=>ys,UriUtils:()=>vs,WorkspaceCache:()=>Y1,assertUnreachable:()=>Uc,delayNextTick:()=>tB,interruptAndCheck:()=>bi,isOperationCancelled:()=>Kc,loadGrammarFromJson:()=>Zc,setInterruptionPeriod:()=>ome,startCancelableOperation:()=>XS,stream:()=>an});var Fme=N(()=>{"use strict";QS();e6();Lr(Xr,ei);H1();yB();NE();Bme();tl();Ys();Qc();hs();el();Bl();zl();l1()});var $me=N(()=>{"use strict";dB();Gb()});var zme=N(()=>{"use strict";pB();mB();gB();vB();U1();GB();xB();IB();bB()});var Sa={};dr(Sa,{AbstractAstReflection:()=>Ap,AbstractCstNode:()=>kb,AbstractLangiumParser:()=>Eb,AbstractParserErrorMessageProvider:()=>zS,AbstractThreadedAsyncParser:()=>RB,AstUtils:()=>GE,BiMap:()=>Qp,Cancellation:()=>br,CompositeCstNodeImpl:()=>Xp,ContextCache:()=>Zp,CstNodeBuilder:()=>wb,CstUtils:()=>RE,DEFAULT_TOKENIZE_OPTIONS:()=>t6,DONE_RESULT:()=>za,DatatypeSymbol:()=>$S,DefaultAstNodeDescriptionProvider:()=>Ub,DefaultAstNodeLocator:()=>qb,DefaultAsyncParser:()=>t4,DefaultCommentProvider:()=>e4,DefaultConfigurationProvider:()=>Wb,DefaultDocumentBuilder:()=>Yb,DefaultDocumentValidator:()=>Vb,DefaultHydrator:()=>n4,DefaultIndexManager:()=>Xb,DefaultJsonSerializer:()=>Fb,DefaultLangiumDocumentFactory:()=>Db,DefaultLangiumDocuments:()=>Lb,DefaultLexer:()=>e0,DefaultLexerErrorMessageProvider:()=>Kb,DefaultLinker:()=>Rb,DefaultNameProvider:()=>Nb,DefaultReferenceDescriptionProvider:()=>Hb,DefaultReferences:()=>Mb,DefaultScopeComputation:()=>Ib,DefaultScopeProvider:()=>Bb,DefaultServiceRegistry:()=>$b,DefaultTokenBuilder:()=>th,DefaultValueConverter:()=>Kp,DefaultWorkspaceLock:()=>r4,DefaultWorkspaceManager:()=>jb,Deferred:()=>gs,Disposable:()=>Gf,DisposableCache:()=>W1,DocumentCache:()=>KS,DocumentState:()=>Ln,DocumentValidator:()=>rl,EMPTY_SCOPE:()=>rje,EMPTY_STREAM:()=>Rx,EmptyFileSystem:()=>Ea,EmptyFileSystemProvider:()=>l6,ErrorWithLocation:()=>Rp,GrammarAST:()=>zx,GrammarUtils:()=>WE,IndentationAwareLexer:()=>zB,IndentationAwareTokenBuilder:()=>o6,JSDocDocumentationProvider:()=>Jb,LangiumCompletionParser:()=>Cb,LangiumParser:()=>Sb,LangiumParserErrorMessageProvider:()=>F1,LeafCstNodeImpl:()=>Yp,LexingMode:()=>t0,MapScope:()=>Ob,Module:()=>BB,MultiMap:()=>Vl,OperationCancelled:()=>jc,ParserWorker:()=>NB,Reduction:()=>vg,RegExpUtils:()=>HE,RootCstNodeImpl:()=>B1,SimpleCache:()=>Pb,StreamImpl:()=>po,StreamScope:()=>q1,TextDocument:()=>G1,TreeStreamImpl:()=>Gc,URI:()=>ys,UriUtils:()=>vs,ValidationCategory:()=>X1,ValidationRegistry:()=>zb,ValueConverter:()=>Xc,WorkspaceCache:()=>Y1,assertUnreachable:()=>Uc,createCompletionParser:()=>VP,createDefaultCoreModule:()=>wa,createDefaultSharedCoreModule:()=>ka,createGrammarConfig:()=>PO,createLangiumParser:()=>HP,createParser:()=>_b,delayNextTick:()=>tB,diagnosticData:()=>Jp,eagerLoad:()=>Cme,getDiagnosticRange:()=>mme,indentationBuilderDefaultOptions:()=>$B,inject:()=>Hn,interruptAndCheck:()=>bi,isAstNode:()=>li,isAstNodeDescription:()=>qI,isAstNodeWithComment:()=>hB,isCompositeCstNode:()=>Ol,isIMultiModeLexerDefinition:()=>wB,isJSDoc:()=>CB,isLeafCstNode:()=>If,isLinkingError:()=>_p,isNamed:()=>dme,isOperationCancelled:()=>Kc,isReference:()=>Ta,isRootCstNode:()=>Lx,isTokenTypeArray:()=>r6,isTokenTypeDictionary:()=>TB,loadGrammarFromJson:()=>Zc,parseJSDoc:()=>SB,prepareLangiumParser:()=>eme,setInterruptionPeriod:()=>ome,startCancelableOperation:()=>XS,stream:()=>an,toDiagnosticData:()=>gme,toDiagnosticSeverity:()=>JS});var vo=N(()=>{"use strict";PB();FB();fB();_me();Pl();Dme();Rme();Ime();Ome();Pme();Fme();Lr(Sa,Xr);$me();zme();Hc()});function Xme(t){return Ul.isInstance(t,i4)}function jme(t){return Ul.isInstance(t,j1)}function Kme(t){return Ul.isInstance(t,K1)}function Qme(t){return Ul.isInstance(t,Q1)}function Zme(t){return Ul.isInstance(t,a4)}function Jme(t){return Ul.isInstance(t,Z1)}function ege(t){return Ul.isInstance(t,s4)}function tge(t){return Ul.isInstance(t,o4)}function rge(t){return Ul.isInstance(t,l4)}function nge(t){return Ul.isInstance(t,c4)}function ige(t){return Ul.isInstance(t,u4)}var vje,Tt,QB,i4,c6,j1,u6,h6,VB,K1,UB,HB,qB,Q1,WB,a4,f6,YB,Z1,XB,s4,o4,l4,c4,g6,jB,u4,KB,d6,p6,m6,age,Ul,Gme,xje,Vme,bje,Ume,Tje,Hme,wje,qme,kje,Wme,Eje,Yme,Sje,Cje,Aje,_je,Dje,Lje,Rje,Nje,xs,ZB,JB,eF,tF,rF,nF,iF,Mje,Ije,Oje,Pje,Vf,rh,Ha,Bje,qa=N(()=>{"use strict";vo();vo();vo();vo();vje=Object.defineProperty,Tt=o((t,e)=>vje(t,"name",{value:e,configurable:!0}),"__name"),QB="Statement",i4="Architecture";o(Xme,"isArchitecture");Tt(Xme,"isArchitecture");c6="Axis",j1="Branch";o(jme,"isBranch");Tt(jme,"isBranch");u6="Checkout",h6="CherryPicking",VB="ClassDefStatement",K1="Commit";o(Kme,"isCommit");Tt(Kme,"isCommit");UB="Curve",HB="Edge",qB="Entry",Q1="GitGraph";o(Qme,"isGitGraph");Tt(Qme,"isGitGraph");WB="Group",a4="Info";o(Zme,"isInfo");Tt(Zme,"isInfo");f6="Item",YB="Junction",Z1="Merge";o(Jme,"isMerge");Tt(Jme,"isMerge");XB="Option",s4="Packet";o(ege,"isPacket");Tt(ege,"isPacket");o4="PacketBlock";o(tge,"isPacketBlock");Tt(tge,"isPacketBlock");l4="Pie";o(rge,"isPie");Tt(rge,"isPie");c4="PieSection";o(nge,"isPieSection");Tt(nge,"isPieSection");g6="Radar",jB="Service",u4="Treemap";o(ige,"isTreemap");Tt(ige,"isTreemap");KB="TreemapRow",d6="Direction",p6="Leaf",m6="Section",age=class extends Ap{static{o(this,"MermaidAstReflection")}static{Tt(this,"MermaidAstReflection")}getAllTypes(){return[i4,c6,j1,u6,h6,VB,K1,UB,d6,HB,qB,Q1,WB,a4,f6,YB,p6,Z1,XB,s4,o4,l4,c4,g6,m6,jB,QB,u4,KB]}computeIsSubtype(t,e){switch(t){case j1:case u6:case h6:case K1:case Z1:return this.isSubtype(QB,e);case d6:return this.isSubtype(Q1,e);case p6:case m6:return this.isSubtype(f6,e);default:return!1}}getReferenceType(t){let e=`${t.container.$type}:${t.property}`;switch(e){case"Entry:axis":return c6;default:throw new Error(`${e} is not a valid reference id.`)}}getTypeMetaData(t){switch(t){case i4:return{name:i4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"edges",defaultValue:[]},{name:"groups",defaultValue:[]},{name:"junctions",defaultValue:[]},{name:"services",defaultValue:[]},{name:"title"}]};case c6:return{name:c6,properties:[{name:"label"},{name:"name"}]};case j1:return{name:j1,properties:[{name:"name"},{name:"order"}]};case u6:return{name:u6,properties:[{name:"branch"}]};case h6:return{name:h6,properties:[{name:"id"},{name:"parent"},{name:"tags",defaultValue:[]}]};case VB:return{name:VB,properties:[{name:"className"},{name:"styleText"}]};case K1:return{name:K1,properties:[{name:"id"},{name:"message"},{name:"tags",defaultValue:[]},{name:"type"}]};case UB:return{name:UB,properties:[{name:"entries",defaultValue:[]},{name:"label"},{name:"name"}]};case HB:return{name:HB,properties:[{name:"lhsDir"},{name:"lhsGroup",defaultValue:!1},{name:"lhsId"},{name:"lhsInto",defaultValue:!1},{name:"rhsDir"},{name:"rhsGroup",defaultValue:!1},{name:"rhsId"},{name:"rhsInto",defaultValue:!1},{name:"title"}]};case qB:return{name:qB,properties:[{name:"axis"},{name:"value"}]};case Q1:return{name:Q1,properties:[{name:"accDescr"},{name:"accTitle"},{name:"statements",defaultValue:[]},{name:"title"}]};case WB:return{name:WB,properties:[{name:"icon"},{name:"id"},{name:"in"},{name:"title"}]};case a4:return{name:a4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case f6:return{name:f6,properties:[{name:"classSelector"},{name:"name"}]};case YB:return{name:YB,properties:[{name:"id"},{name:"in"}]};case Z1:return{name:Z1,properties:[{name:"branch"},{name:"id"},{name:"tags",defaultValue:[]},{name:"type"}]};case XB:return{name:XB,properties:[{name:"name"},{name:"value",defaultValue:!1}]};case s4:return{name:s4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"blocks",defaultValue:[]},{name:"title"}]};case o4:return{name:o4,properties:[{name:"bits"},{name:"end"},{name:"label"},{name:"start"}]};case l4:return{name:l4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"sections",defaultValue:[]},{name:"showData",defaultValue:!1},{name:"title"}]};case c4:return{name:c4,properties:[{name:"label"},{name:"value"}]};case g6:return{name:g6,properties:[{name:"accDescr"},{name:"accTitle"},{name:"axes",defaultValue:[]},{name:"curves",defaultValue:[]},{name:"options",defaultValue:[]},{name:"title"}]};case jB:return{name:jB,properties:[{name:"icon"},{name:"iconText"},{name:"id"},{name:"in"},{name:"title"}]};case u4:return{name:u4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"},{name:"TreemapRows",defaultValue:[]}]};case KB:return{name:KB,properties:[{name:"indent"},{name:"item"}]};case d6:return{name:d6,properties:[{name:"accDescr"},{name:"accTitle"},{name:"dir"},{name:"statements",defaultValue:[]},{name:"title"}]};case p6:return{name:p6,properties:[{name:"classSelector"},{name:"name"},{name:"value"}]};case m6:return{name:m6,properties:[{name:"classSelector"},{name:"name"}]};default:return{name:t,properties:[]}}}},Ul=new age,xje=Tt(()=>Gme??(Gme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Info","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@7"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"InfoGrammar"),bje=Tt(()=>Vme??(Vme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Packet","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"packet"},{"$type":"Keyword","value":"packet-beta"}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"+"},{"$type":"Assignment","feature":"bits","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]}]},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"PacketGrammar"),Tje=Tt(()=>Ume??(Ume=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Pie","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"FLOAT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?(0|[1-9][0-9]*)(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@2"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@3"}}]},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@11"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@12"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"PieGrammar"),wje=Tt(()=>Hme??(Hme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Architecture","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"LeftPort","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"RightPort","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Arrow","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/"},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@18"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@19"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[[\\\\w ]+\\\\]/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"ArchitectureGrammar"),kje=Tt(()=>qme??(qme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"GitGraph","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@14"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"REFERENCE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"GitGraphGrammar"),Eje=Tt(()=>Wme??(Wme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Radar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":"radar-beta:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Label","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Axis","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Curve","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Entries","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Option","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"showLegend"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"ticks"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"max"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"min"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"graticule"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"GRATICULE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"circle"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"polygon"}}]},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@16"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"interfaces":[{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@2"}}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"types":[],"usedGrammars":[]}`)),"RadarGrammar"),Sje=Tt(()=>Yme??(Yme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Treemap","rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"ParserRule","entry":true,"name":"Treemap","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"TreemapRows","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"TREEMAP_KEYWORD","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap-beta"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"CLASS_DEF","definition":{"$type":"RegexToken","regex":"/classDef\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\s+([^;\\\\r\\\\n]*))?(?:;)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STYLE_SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":::"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"COMMA","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":","}},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[ \\\\t]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"ML_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\%\\\\%[^\\\\n]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false},{"$type":"ParserRule","name":"TreemapRow","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"indent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"item","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ClassDef","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Item","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Section","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Leaf","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INDENTATION","definition":{"$type":"RegexToken","regex":"/[ \\\\t]{1,}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID2","definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9_]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER2","definition":{"$type":"RegexToken","regex":"/[0-9_\\\\.\\\\,]+/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"MyNumber","dataType":"number","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"STRING2","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"Item","attributes":[{"$type":"TypeAttribute","name":"name","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"classSelector","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Section","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[]},{"$type":"Interface","name":"Leaf","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}]},{"$type":"Interface","name":"ClassDefStatement","attributes":[{"$type":"TypeAttribute","name":"className","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"styleText","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"Treemap","attributes":[{"$type":"TypeAttribute","name":"TreemapRows","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@14"}}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[],"$comment":"/**\\n * Treemap grammar for Langium\\n * Converted from mindmap grammar\\n *\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\n * before the treemap keyword, allowing for empty lines and comments before the\\n * treemap declaration.\\n */"}`)),"TreemapGrammar"),Cje={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Aje={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},_je={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Dje={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Lje={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Rje={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Nje={languageId:"treemap",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},xs={AstReflection:Tt(()=>new age,"AstReflection")},ZB={Grammar:Tt(()=>xje(),"Grammar"),LanguageMetaData:Tt(()=>Cje,"LanguageMetaData"),parser:{}},JB={Grammar:Tt(()=>bje(),"Grammar"),LanguageMetaData:Tt(()=>Aje,"LanguageMetaData"),parser:{}},eF={Grammar:Tt(()=>Tje(),"Grammar"),LanguageMetaData:Tt(()=>_je,"LanguageMetaData"),parser:{}},tF={Grammar:Tt(()=>wje(),"Grammar"),LanguageMetaData:Tt(()=>Dje,"LanguageMetaData"),parser:{}},rF={Grammar:Tt(()=>kje(),"Grammar"),LanguageMetaData:Tt(()=>Lje,"LanguageMetaData"),parser:{}},nF={Grammar:Tt(()=>Eje(),"Grammar"),LanguageMetaData:Tt(()=>Rje,"LanguageMetaData"),parser:{}},iF={Grammar:Tt(()=>Sje(),"Grammar"),LanguageMetaData:Tt(()=>Nje,"LanguageMetaData"),parser:{}},Mje=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,Ije=/accTitle[\t ]*:([^\n\r]*)/,Oje=/title([\t ][^\n\r]*|)/,Pje={ACC_DESCR:Mje,ACC_TITLE:Ije,TITLE:Oje},Vf=class extends Kp{static{o(this,"AbstractMermaidValueConverter")}static{Tt(this,"AbstractMermaidValueConverter")}runConverter(t,e,r){let n=this.runCommonConverter(t,e,r);return n===void 0&&(n=this.runCustomConverter(t,e,r)),n===void 0?super.runConverter(t,e,r):n}runCommonConverter(t,e,r){let n=Pje[t.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` +`)}}},rh=class extends Vf{static{o(this,"CommonValueConverter")}static{Tt(this,"CommonValueConverter")}runCustomConverter(t,e,r){}},Ha=class extends th{static{o(this,"AbstractMermaidTokenBuilder")}static{Tt(this,"AbstractMermaidTokenBuilder")}constructor(t){super(),this.keywords=new Set(t)}buildKeywordTokens(t,e,r){let n=super.buildKeywordTokens(t,e,r);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},Bje=class extends Ha{static{o(this,"CommonTokenBuilder")}static{Tt(this,"CommonTokenBuilder")}}});function v6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),rF,y6);return e.ServiceRegistry.register(r),{shared:e,GitGraph:r}}var Fje,y6,aF=N(()=>{"use strict";qa();vo();Fje=class extends Ha{static{o(this,"GitGraphTokenBuilder")}static{Tt(this,"GitGraphTokenBuilder")}constructor(){super(["gitGraph"])}},y6={parser:{TokenBuilder:Tt(()=>new Fje,"TokenBuilder"),ValueConverter:Tt(()=>new rh,"ValueConverter")}};o(v6,"createGitGraphServices");Tt(v6,"createGitGraphServices")});function b6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),ZB,x6);return e.ServiceRegistry.register(r),{shared:e,Info:r}}var $je,x6,sF=N(()=>{"use strict";qa();vo();$je=class extends Ha{static{o(this,"InfoTokenBuilder")}static{Tt(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},x6={parser:{TokenBuilder:Tt(()=>new $je,"TokenBuilder"),ValueConverter:Tt(()=>new rh,"ValueConverter")}};o(b6,"createInfoServices");Tt(b6,"createInfoServices")});function w6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),JB,T6);return e.ServiceRegistry.register(r),{shared:e,Packet:r}}var zje,T6,oF=N(()=>{"use strict";qa();vo();zje=class extends Ha{static{o(this,"PacketTokenBuilder")}static{Tt(this,"PacketTokenBuilder")}constructor(){super(["packet"])}},T6={parser:{TokenBuilder:Tt(()=>new zje,"TokenBuilder"),ValueConverter:Tt(()=>new rh,"ValueConverter")}};o(w6,"createPacketServices");Tt(w6,"createPacketServices")});function E6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),eF,k6);return e.ServiceRegistry.register(r),{shared:e,Pie:r}}var Gje,Vje,k6,lF=N(()=>{"use strict";qa();vo();Gje=class extends Ha{static{o(this,"PieTokenBuilder")}static{Tt(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},Vje=class extends Vf{static{o(this,"PieValueConverter")}static{Tt(this,"PieValueConverter")}runCustomConverter(t,e,r){if(t.name==="PIE_SECTION_LABEL")return e.replace(/"/g,"").trim()}},k6={parser:{TokenBuilder:Tt(()=>new Gje,"TokenBuilder"),ValueConverter:Tt(()=>new Vje,"ValueConverter")}};o(E6,"createPieServices");Tt(E6,"createPieServices")});function C6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),tF,S6);return e.ServiceRegistry.register(r),{shared:e,Architecture:r}}var Uje,Hje,S6,cF=N(()=>{"use strict";qa();vo();Uje=class extends Ha{static{o(this,"ArchitectureTokenBuilder")}static{Tt(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},Hje=class extends Vf{static{o(this,"ArchitectureValueConverter")}static{Tt(this,"ArchitectureValueConverter")}runCustomConverter(t,e,r){if(t.name==="ARCH_ICON")return e.replace(/[()]/g,"").trim();if(t.name==="ARCH_TEXT_ICON")return e.replace(/["()]/g,"");if(t.name==="ARCH_TITLE")return e.replace(/[[\]]/g,"").trim()}},S6={parser:{TokenBuilder:Tt(()=>new Uje,"TokenBuilder"),ValueConverter:Tt(()=>new Hje,"ValueConverter")}};o(C6,"createArchitectureServices");Tt(C6,"createArchitectureServices")});function _6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),nF,A6);return e.ServiceRegistry.register(r),{shared:e,Radar:r}}var qje,A6,uF=N(()=>{"use strict";qa();vo();qje=class extends Ha{static{o(this,"RadarTokenBuilder")}static{Tt(this,"RadarTokenBuilder")}constructor(){super(["radar-beta"])}},A6={parser:{TokenBuilder:Tt(()=>new qje,"TokenBuilder"),ValueConverter:Tt(()=>new rh,"ValueConverter")}};o(_6,"createRadarServices");Tt(_6,"createRadarServices")});function sge(t){let e=t.validation.TreemapValidator,r=t.validation.ValidationRegistry;if(r){let n={Treemap:e.checkSingleRoot.bind(e)};r.register(n,e)}}function L6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),iF,D6);return e.ServiceRegistry.register(r),sge(r),{shared:e,Treemap:r}}var Wje,Yje,Xje,jje,D6,hF=N(()=>{"use strict";qa();vo();Wje=class extends Ha{static{o(this,"TreemapTokenBuilder")}static{Tt(this,"TreemapTokenBuilder")}constructor(){super(["treemap"])}},Yje=/classDef\s+([A-Z_a-z]\w+)(?:\s+([^\n\r;]*))?;?/,Xje=class extends Vf{static{o(this,"TreemapValueConverter")}static{Tt(this,"TreemapValueConverter")}runCustomConverter(t,e,r){if(t.name==="NUMBER2")return parseFloat(e.replace(/,/g,""));if(t.name==="SEPARATOR")return e.substring(1,e.length-1);if(t.name==="STRING2")return e.substring(1,e.length-1);if(t.name==="INDENTATION")return e.length;if(t.name==="ClassDef"){if(typeof e!="string")return e;let n=Yje.exec(e);if(n)return{$type:"ClassDefStatement",className:n[1],styleText:n[2]||void 0}}}};o(sge,"registerValidationChecks");Tt(sge,"registerValidationChecks");jje=class{static{o(this,"TreemapValidator")}static{Tt(this,"TreemapValidator")}checkSingleRoot(t,e){let r;for(let n of t.TreemapRows)n.item&&(r===void 0&&n.indent===void 0?r=0:n.indent===void 0?e("error","Multiple root nodes are not allowed in a treemap.",{node:n,property:"item"}):r!==void 0&&r>=parseInt(n.indent,10)&&e("error","Multiple root nodes are not allowed in a treemap.",{node:n,property:"item"}))}},D6={parser:{TokenBuilder:Tt(()=>new Wje,"TokenBuilder"),ValueConverter:Tt(()=>new Xje,"ValueConverter")},validation:{TreemapValidator:Tt(()=>new jje,"TreemapValidator")}};o(L6,"createTreemapServices");Tt(L6,"createTreemapServices")});var oge={};dr(oge,{InfoModule:()=>x6,createInfoServices:()=>b6});var lge=N(()=>{"use strict";sF();qa()});var cge={};dr(cge,{PacketModule:()=>T6,createPacketServices:()=>w6});var uge=N(()=>{"use strict";oF();qa()});var hge={};dr(hge,{PieModule:()=>k6,createPieServices:()=>E6});var fge=N(()=>{"use strict";lF();qa()});var dge={};dr(dge,{ArchitectureModule:()=>S6,createArchitectureServices:()=>C6});var pge=N(()=>{"use strict";cF();qa()});var mge={};dr(mge,{GitGraphModule:()=>y6,createGitGraphServices:()=>v6});var gge=N(()=>{"use strict";aF();qa()});var yge={};dr(yge,{RadarModule:()=>A6,createRadarServices:()=>_6});var vge=N(()=>{"use strict";uF();qa()});var xge={};dr(xge,{TreemapModule:()=>D6,createTreemapServices:()=>L6});var bge=N(()=>{"use strict";hF();qa()});async function bs(t,e){let r=Kje[t];if(!r)throw new Error(`Unknown diagram type: ${t}`);nh[t]||await r();let i=nh[t].parse(e);if(i.lexerErrors.length>0||i.parserErrors.length>0)throw new Qje(i);return i.value}var nh,Kje,Qje,Uf=N(()=>{"use strict";aF();sF();oF();lF();cF();uF();hF();qa();nh={},Kje={info:Tt(async()=>{let{createInfoServices:t}=await Promise.resolve().then(()=>(lge(),oge)),e=t().Info.parser.LangiumParser;nh.info=e},"info"),packet:Tt(async()=>{let{createPacketServices:t}=await Promise.resolve().then(()=>(uge(),cge)),e=t().Packet.parser.LangiumParser;nh.packet=e},"packet"),pie:Tt(async()=>{let{createPieServices:t}=await Promise.resolve().then(()=>(fge(),hge)),e=t().Pie.parser.LangiumParser;nh.pie=e},"pie"),architecture:Tt(async()=>{let{createArchitectureServices:t}=await Promise.resolve().then(()=>(pge(),dge)),e=t().Architecture.parser.LangiumParser;nh.architecture=e},"architecture"),gitGraph:Tt(async()=>{let{createGitGraphServices:t}=await Promise.resolve().then(()=>(gge(),mge)),e=t().GitGraph.parser.LangiumParser;nh.gitGraph=e},"gitGraph"),radar:Tt(async()=>{let{createRadarServices:t}=await Promise.resolve().then(()=>(vge(),yge)),e=t().Radar.parser.LangiumParser;nh.radar=e},"radar"),treemap:Tt(async()=>{let{createTreemapServices:t}=await Promise.resolve().then(()=>(bge(),xge)),e=t().Treemap.parser.LangiumParser;nh.treemap=e},"treemap")};o(bs,"parse");Tt(bs,"parse");Qje=class extends Error{static{o(this,"MermaidParseError")}constructor(t){let e=t.lexerErrors.map(n=>n.message).join(` +`),r=t.parserErrors.map(n=>n.message).join(` +`);super(`Parsing failed: ${e} ${r}`),this.result=t}static{Tt(this,"MermaidParseError")}}});function nl(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}var r0=N(()=>{"use strict";o(nl,"populateCommonDb")});var rn,R6=N(()=>{"use strict";rn={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4}});var J1,fF=N(()=>{"use strict";J1=class{constructor(e){this.init=e;this.records=this.init()}static{o(this,"ImperativeState")}reset(){this.records=this.init()}}});function dF(){return VL({length:7})}function Jje(t,e){let r=Object.create(null);return t.reduce((n,i)=>{let a=e(i);return r[a]||(r[a]=!0,n.push(i)),n},[])}function Tge(t,e,r){let n=t.indexOf(e);n===-1?t.push(r):t.splice(n,1,r)}function kge(t){let e=t.reduce((i,a)=>i.seq>a.seq?i:a,t[0]),r="";t.forEach(function(i){i===e?r+=" *":r+=" |"});let n=[r,e.id,e.seq];for(let i in Dt.records.branches)Dt.records.branches.get(i)===e.id&&n.push(i);if(X.debug(n.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let i=Dt.records.commits.get(e.parents[0]);Tge(t,e,i),e.parents[1]&&t.push(Dt.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let i=Dt.records.commits.get(e.parents[0]);Tge(t,e,i)}}t=Jje(t,i=>i.id),kge(t)}var Zje,n0,Dt,eKe,tKe,rKe,nKe,iKe,aKe,sKe,wge,oKe,lKe,cKe,uKe,hKe,Ege,fKe,dKe,pKe,N6,pF=N(()=>{"use strict";pt();tr();qn();gr();ci();R6();fF();La();Zje=ur.gitGraph,n0=o(()=>Vn({...Zje,...Qt().gitGraph}),"getConfig"),Dt=new J1(()=>{let t=n0(),e=t.mainBranchName,r=t.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:r}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});o(dF,"getID");o(Jje,"uniqBy");eKe=o(function(t){Dt.records.direction=t},"setDirection"),tKe=o(function(t){X.debug("options str",t),t=t?.trim(),t=t||"{}";try{Dt.records.options=JSON.parse(t)}catch(e){X.error("error while parsing gitGraph options",e.message)}},"setOptions"),rKe=o(function(){return Dt.records.options},"getOptions"),nKe=o(function(t){let e=t.msg,r=t.id,n=t.type,i=t.tags;X.info("commit",e,r,n,i),X.debug("Entering commit:",e,r,n,i);let a=n0();r=tt.sanitizeText(r,a),e=tt.sanitizeText(e,a),i=i?.map(l=>tt.sanitizeText(l,a));let s={id:r||Dt.records.seq+"-"+dF(),message:e,seq:Dt.records.seq++,type:n??rn.NORMAL,tags:i??[],parents:Dt.records.head==null?[]:[Dt.records.head.id],branch:Dt.records.currBranch};Dt.records.head=s,X.info("main branch",a.mainBranchName),Dt.records.commits.has(s.id)&&X.warn(`Commit ID ${s.id} already exists`),Dt.records.commits.set(s.id,s),Dt.records.branches.set(Dt.records.currBranch,s.id),X.debug("in pushCommit "+s.id)},"commit"),iKe=o(function(t){let e=t.name,r=t.order;if(e=tt.sanitizeText(e,n0()),Dt.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);Dt.records.branches.set(e,Dt.records.head!=null?Dt.records.head.id:null),Dt.records.branchConfig.set(e,{name:e,order:r}),wge(e),X.debug("in createBranch")},"branch"),aKe=o(t=>{let e=t.branch,r=t.id,n=t.type,i=t.tags,a=n0();e=tt.sanitizeText(e,a),r&&(r=tt.sanitizeText(r,a));let s=Dt.records.branches.get(Dt.records.currBranch),l=Dt.records.branches.get(e),u=s?Dt.records.commits.get(s):void 0,h=l?Dt.records.commits.get(l):void 0;if(u&&h&&u.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(Dt.records.currBranch===e){let p=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(u===void 0||!u){let p=new Error(`Incorrect usage of "merge". Current branch (${Dt.records.currBranch})has no commits`);throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},p}if(!Dt.records.branches.has(e)){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},p}if(h===void 0||!h){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},p}if(u===h){let p=new Error('Incorrect usage of "merge". Both branches have same head');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(r&&Dt.records.commits.has(r)){let p=new Error('Incorrect usage of "merge". Commit with id:'+r+" already exists, use different custom id");throw p.hash={text:`merge ${e} ${r} ${n} ${i?.join(" ")}`,token:`merge ${e} ${r} ${n} ${i?.join(" ")}`,expected:[`merge ${e} ${r}_UNIQUE ${n} ${i?.join(" ")}`]},p}let f=l||"",d={id:r||`${Dt.records.seq}-${dF()}`,message:`merged branch ${e} into ${Dt.records.currBranch}`,seq:Dt.records.seq++,parents:Dt.records.head==null?[]:[Dt.records.head.id,f],branch:Dt.records.currBranch,type:rn.MERGE,customType:n,customId:!!r,tags:i??[]};Dt.records.head=d,Dt.records.commits.set(d.id,d),Dt.records.branches.set(Dt.records.currBranch,d.id),X.debug(Dt.records.branches),X.debug("in mergeBranch")},"merge"),sKe=o(function(t){let e=t.id,r=t.targetId,n=t.tags,i=t.parent;X.debug("Entering cherryPick:",e,r,n);let a=n0();if(e=tt.sanitizeText(e,a),r=tt.sanitizeText(r,a),n=n?.map(u=>tt.sanitizeText(u,a)),i=tt.sanitizeText(i,a),!e||!Dt.records.commits.has(e)){let u=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw u.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},u}let s=Dt.records.commits.get(e);if(s===void 0||!s)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(i&&!(Array.isArray(s.parents)&&s.parents.includes(i)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let l=s.branch;if(s.type===rn.MERGE&&!i)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!r||!Dt.records.commits.has(r)){if(l===Dt.records.currBranch){let d=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let u=Dt.records.branches.get(Dt.records.currBranch);if(u===void 0||!u){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${Dt.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let h=Dt.records.commits.get(u);if(h===void 0||!h){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${Dt.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let f={id:Dt.records.seq+"-"+dF(),message:`cherry-picked ${s?.message} into ${Dt.records.currBranch}`,seq:Dt.records.seq++,parents:Dt.records.head==null?[]:[Dt.records.head.id,s.id],branch:Dt.records.currBranch,type:rn.CHERRY_PICK,tags:n?n.filter(Boolean):[`cherry-pick:${s.id}${s.type===rn.MERGE?`|parent:${i}`:""}`]};Dt.records.head=f,Dt.records.commits.set(f.id,f),Dt.records.branches.set(Dt.records.currBranch,f.id),X.debug(Dt.records.branches),X.debug("in cherryPick")}},"cherryPick"),wge=o(function(t){if(t=tt.sanitizeText(t,n0()),Dt.records.branches.has(t)){Dt.records.currBranch=t;let e=Dt.records.branches.get(Dt.records.currBranch);e===void 0||!e?Dt.records.head=null:Dt.records.head=Dt.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${t}")`);throw e.hash={text:`checkout ${t}`,token:`checkout ${t}`,expected:[`branch ${t}`]},e}},"checkout");o(Tge,"upsert");o(kge,"prettyPrintCommitHistory");oKe=o(function(){X.debug(Dt.records.commits);let t=Ege()[0];kge([t])},"prettyPrint"),lKe=o(function(){Dt.reset(),Sr()},"clear"),cKe=o(function(){return[...Dt.records.branchConfig.values()].map((e,r)=>e.order!==null&&e.order!==void 0?e:{...e,order:parseFloat(`0.${r}`)}).sort((e,r)=>(e.order??0)-(r.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),uKe=o(function(){return Dt.records.branches},"getBranches"),hKe=o(function(){return Dt.records.commits},"getCommits"),Ege=o(function(){let t=[...Dt.records.commits.values()];return t.forEach(function(e){X.debug(e.id)}),t.sort((e,r)=>e.seq-r.seq),t},"getCommitsArray"),fKe=o(function(){return Dt.records.currBranch},"getCurrentBranch"),dKe=o(function(){return Dt.records.direction},"getDirection"),pKe=o(function(){return Dt.records.head},"getHead"),N6={commitType:rn,getConfig:n0,setDirection:eKe,setOptions:tKe,getOptions:rKe,commit:nKe,branch:iKe,merge:aKe,cherryPick:sKe,checkout:wge,prettyPrint:oKe,clear:lKe,getBranchesAsObjArray:cKe,getBranches:uKe,getCommits:hKe,getCommitsArray:Ege,getCurrentBranch:fKe,getDirection:dKe,getHead:pKe,setAccTitle:Rr,getAccTitle:Mr,getAccDescription:Or,setAccDescription:Ir,setDiagramTitle:$r,getDiagramTitle:Pr}});var mKe,gKe,yKe,vKe,xKe,bKe,TKe,Sge,Cge=N(()=>{"use strict";Uf();pt();r0();pF();R6();mKe=o((t,e)=>{nl(t,e),t.dir&&e.setDirection(t.dir);for(let r of t.statements)gKe(r,e)},"populate"),gKe=o((t,e)=>{let n={Commit:o(i=>e.commit(yKe(i)),"Commit"),Branch:o(i=>e.branch(vKe(i)),"Branch"),Merge:o(i=>e.merge(xKe(i)),"Merge"),Checkout:o(i=>e.checkout(bKe(i)),"Checkout"),CherryPicking:o(i=>e.cherryPick(TKe(i)),"CherryPicking")}[t.$type];n?n(t):X.error(`Unknown statement type: ${t.$type}`)},"parseStatement"),yKe=o(t=>({id:t.id,msg:t.message??"",type:t.type!==void 0?rn[t.type]:rn.NORMAL,tags:t.tags??void 0}),"parseCommit"),vKe=o(t=>({name:t.name,order:t.order??0}),"parseBranch"),xKe=o(t=>({branch:t.branch,id:t.id??"",type:t.type!==void 0?rn[t.type]:void 0,tags:t.tags??void 0}),"parseMerge"),bKe=o(t=>t.branch,"parseCheckout"),TKe=o(t=>({id:t.id,targetId:"",tags:t.tags?.length===0?void 0:t.tags,parent:t.parent}),"parseCherryPicking"),Sge={parse:o(async t=>{let e=await bs("gitGraph",t);X.debug(e),mKe(e,N6)},"parse")}});var wKe,il,qf,Wf,Jc,ih,i0,Ks,Qs,M6,h4,I6,Hf,Vr,kKe,_ge,Dge,EKe,SKe,CKe,AKe,_Ke,DKe,LKe,RKe,NKe,MKe,IKe,OKe,Age,PKe,f4,BKe,FKe,$Ke,zKe,GKe,Lge,Rge=N(()=>{"use strict";yr();Xt();pt();tr();R6();wKe=ge(),il=wKe?.gitGraph,qf=10,Wf=40,Jc=4,ih=2,i0=8,Ks=new Map,Qs=new Map,M6=30,h4=new Map,I6=[],Hf=0,Vr="LR",kKe=o(()=>{Ks.clear(),Qs.clear(),h4.clear(),Hf=0,I6=[],Vr="LR"},"clear"),_ge=o(t=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof t=="string"?t.split(/\\n|\n|/gi):t).forEach(n=>{let i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),i.setAttribute("class","row"),i.textContent=n.trim(),e.appendChild(i)}),e},"drawText"),Dge=o(t=>{let e,r,n;return Vr==="BT"?(r=o((i,a)=>i<=a,"comparisonFunc"),n=1/0):(r=o((i,a)=>i>=a,"comparisonFunc"),n=0),t.forEach(i=>{let a=Vr==="TB"||Vr=="BT"?Qs.get(i)?.y:Qs.get(i)?.x;a!==void 0&&r(a,n)&&(e=i,n=a)}),e},"findClosestParent"),EKe=o(t=>{let e="",r=1/0;return t.forEach(n=>{let i=Qs.get(n).y;i<=r&&(e=n,r=i)}),e||void 0},"findClosestParentBT"),SKe=o((t,e,r)=>{let n=r,i=r,a=[];t.forEach(s=>{let l=e.get(s);if(!l)throw new Error(`Commit not found for key ${s}`);l.parents.length?(n=AKe(l),i=Math.max(n,i)):a.push(l),_Ke(l,n)}),n=i,a.forEach(s=>{DKe(s,n,r)}),t.forEach(s=>{let l=e.get(s);if(l?.parents.length){let u=EKe(l.parents);n=Qs.get(u).y-Wf,n<=i&&(i=n);let h=Ks.get(l.branch).pos,f=n-qf;Qs.set(l.id,{x:h,y:f})}})},"setParallelBTPos"),CKe=o(t=>{let e=Dge(t.parents.filter(n=>n!==null));if(!e)throw new Error(`Closest parent not found for commit ${t.id}`);let r=Qs.get(e)?.y;if(r===void 0)throw new Error(`Closest parent position not found for commit ${t.id}`);return r},"findClosestParentPos"),AKe=o(t=>CKe(t)+Wf,"calculateCommitPosition"),_Ke=o((t,e)=>{let r=Ks.get(t.branch);if(!r)throw new Error(`Branch not found for commit ${t.id}`);let n=r.pos,i=e+qf;return Qs.set(t.id,{x:n,y:i}),{x:n,y:i}},"setCommitPosition"),DKe=o((t,e,r)=>{let n=Ks.get(t.branch);if(!n)throw new Error(`Branch not found for commit ${t.id}`);let i=e+r,a=n.pos;Qs.set(t.id,{x:a,y:i})},"setRootPosition"),LKe=o((t,e,r,n,i,a)=>{if(a===rn.HIGHLIGHT)t.append("rect").attr("x",r.x-10).attr("y",r.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${i%i0} ${n}-outer`),t.append("rect").attr("x",r.x-6).attr("y",r.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${i%i0} ${n}-inner`);else if(a===rn.CHERRY_PICK)t.append("circle").attr("cx",r.x).attr("cy",r.y).attr("r",10).attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x-3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x+3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x+3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x-3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`);else{let s=t.append("circle");if(s.attr("cx",r.x),s.attr("cy",r.y),s.attr("r",e.type===rn.MERGE?9:10),s.attr("class",`commit ${e.id} commit${i%i0}`),a===rn.MERGE){let l=t.append("circle");l.attr("cx",r.x),l.attr("cy",r.y),l.attr("r",6),l.attr("class",`commit ${n} ${e.id} commit${i%i0}`)}a===rn.REVERSE&&t.append("path").attr("d",`M ${r.x-5},${r.y-5}L${r.x+5},${r.y+5}M${r.x-5},${r.y+5}L${r.x+5},${r.y-5}`).attr("class",`commit ${n} ${e.id} commit${i%i0}`)}},"drawCommitBullet"),RKe=o((t,e,r,n)=>{if(e.type!==rn.CHERRY_PICK&&(e.customId&&e.type===rn.MERGE||e.type!==rn.MERGE)&&il?.showCommitLabel){let i=t.append("g"),a=i.insert("rect").attr("class","commit-label-bkg"),s=i.append("text").attr("x",n).attr("y",r.y+25).attr("class","commit-label").text(e.id),l=s.node()?.getBBox();if(l&&(a.attr("x",r.posWithOffset-l.width/2-ih).attr("y",r.y+13.5).attr("width",l.width+2*ih).attr("height",l.height+2*ih),Vr==="TB"||Vr==="BT"?(a.attr("x",r.x-(l.width+4*Jc+5)).attr("y",r.y-12),s.attr("x",r.x-(l.width+4*Jc)).attr("y",r.y+l.height-12)):s.attr("x",r.posWithOffset-l.width/2),il.rotateCommitLabel))if(Vr==="TB"||Vr==="BT")s.attr("transform","rotate(-45, "+r.x+", "+r.y+")"),a.attr("transform","rotate(-45, "+r.x+", "+r.y+")");else{let u=-7.5-(l.width+10)/25*9.5,h=10+l.width/25*8.5;i.attr("transform","translate("+u+", "+h+") rotate(-45, "+n+", "+r.y+")")}}},"drawCommitLabel"),NKe=o((t,e,r,n)=>{if(e.tags.length>0){let i=0,a=0,s=0,l=[];for(let u of e.tags.reverse()){let h=t.insert("polygon"),f=t.append("circle"),d=t.append("text").attr("y",r.y-16-i).attr("class","tag-label").text(u),p=d.node()?.getBBox();if(!p)throw new Error("Tag bbox not found");a=Math.max(a,p.width),s=Math.max(s,p.height),d.attr("x",r.posWithOffset-p.width/2),l.push({tag:d,hole:f,rect:h,yOffset:i}),i+=20}for(let{tag:u,hole:h,rect:f,yOffset:d}of l){let p=s/2,m=r.y-19.2-d;if(f.attr("class","tag-label-bkg").attr("points",` + ${n-a/2-Jc/2},${m+ih} + ${n-a/2-Jc/2},${m-ih} + ${r.posWithOffset-a/2-Jc},${m-p-ih} + ${r.posWithOffset+a/2+Jc},${m-p-ih} + ${r.posWithOffset+a/2+Jc},${m+p+ih} + ${r.posWithOffset-a/2-Jc},${m+p+ih}`),h.attr("cy",m).attr("cx",n-a/2+Jc/2).attr("r",1.5).attr("class","tag-hole"),Vr==="TB"||Vr==="BT"){let g=n+d;f.attr("class","tag-label-bkg").attr("points",` + ${r.x},${g+2} + ${r.x},${g-2} + ${r.x+qf},${g-p-2} + ${r.x+qf+a+4},${g-p-2} + ${r.x+qf+a+4},${g+p+2} + ${r.x+qf},${g+p+2}`).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),h.attr("cx",r.x+Jc/2).attr("cy",g).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),u.attr("x",r.x+5).attr("y",g+3).attr("transform","translate(14,14) rotate(45, "+r.x+","+n+")")}}}},"drawCommitTags"),MKe=o(t=>{switch(t.customType??t.type){case rn.NORMAL:return"commit-normal";case rn.REVERSE:return"commit-reverse";case rn.HIGHLIGHT:return"commit-highlight";case rn.MERGE:return"commit-merge";case rn.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),IKe=o((t,e,r,n)=>{let i={x:0,y:0};if(t.parents.length>0){let a=Dge(t.parents);if(a){let s=n.get(a)??i;return e==="TB"?s.y+Wf:e==="BT"?(n.get(t.id)??i).y-Wf:s.x+Wf}}else return e==="TB"?M6:e==="BT"?(n.get(t.id)??i).y-Wf:0;return 0},"calculatePosition"),OKe=o((t,e,r)=>{let n=Vr==="BT"&&r?e:e+qf,i=Vr==="TB"||Vr==="BT"?n:Ks.get(t.branch)?.pos,a=Vr==="TB"||Vr==="BT"?Ks.get(t.branch)?.pos:n;if(a===void 0||i===void 0)throw new Error(`Position were undefined for commit ${t.id}`);return{x:a,y:i,posWithOffset:n}},"getCommitPosition"),Age=o((t,e,r)=>{if(!il)throw new Error("GitGraph config not found");let n=t.append("g").attr("class","commit-bullets"),i=t.append("g").attr("class","commit-labels"),a=Vr==="TB"||Vr==="BT"?M6:0,s=[...e.keys()],l=il?.parallelCommits??!1,u=o((f,d)=>{let p=e.get(f)?.seq,m=e.get(d)?.seq;return p!==void 0&&m!==void 0?p-m:0},"sortKeys"),h=s.sort(u);Vr==="BT"&&(l&&SKe(h,e,a),h=h.reverse()),h.forEach(f=>{let d=e.get(f);if(!d)throw new Error(`Commit not found for key ${f}`);l&&(a=IKe(d,Vr,a,Qs));let p=OKe(d,a,l);if(r){let m=MKe(d),g=d.customType??d.type,y=Ks.get(d.branch)?.index??0;LKe(n,d,p,m,y,g),RKe(i,d,p,a),NKe(i,d,p,a)}Vr==="TB"||Vr==="BT"?Qs.set(d.id,{x:p.x,y:p.posWithOffset}):Qs.set(d.id,{x:p.posWithOffset,y:p.y}),a=Vr==="BT"&&l?a+Wf:a+Wf+qf,a>Hf&&(Hf=a)})},"drawCommits"),PKe=o((t,e,r,n,i)=>{let s=(Vr==="TB"||Vr==="BT"?r.xh.branch===s,"isOnBranchToGetCurve"),u=o(h=>h.seq>t.seq&&h.sequ(h)&&l(h))},"shouldRerouteArrow"),f4=o((t,e,r=0)=>{let n=t+Math.abs(t-e)/2;if(r>5)return n;if(I6.every(s=>Math.abs(s-n)>=10))return I6.push(n),n;let a=Math.abs(t-e);return f4(t,e-a/5,r+1)},"findLane"),BKe=o((t,e,r,n)=>{let i=Qs.get(e.id),a=Qs.get(r.id);if(i===void 0||a===void 0)throw new Error(`Commit positions not found for commits ${e.id} and ${r.id}`);let s=PKe(e,r,i,a,n),l="",u="",h=0,f=0,d=Ks.get(r.branch)?.index;r.type===rn.MERGE&&e.id!==r.parents[0]&&(d=Ks.get(e.branch)?.index);let p;if(s){l="A 10 10, 0, 0, 0,",u="A 10 10, 0, 0, 1,",h=10,f=10;let m=i.ya.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===rn.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y-h} ${u} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x+h} ${i.y} ${l} ${a.x} ${i.y+f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):Vr==="BT"?(i.xa.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===rn.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${l} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):(i.ya.y&&(r.type===rn.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${u} ${i.x+f} ${a.y} L ${a.x} ${a.y}`),i.y===a.y&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`));if(p===void 0)throw new Error("Line definition not found");t.append("path").attr("d",p).attr("class","arrow arrow"+d%i0)},"drawArrow"),FKe=o((t,e)=>{let r=t.append("g").attr("class","commit-arrows");[...e.keys()].forEach(n=>{let i=e.get(n);i.parents&&i.parents.length>0&&i.parents.forEach(a=>{BKe(r,e.get(a),i,e)})})},"drawArrows"),$Ke=o((t,e)=>{let r=t.append("g");e.forEach((n,i)=>{let a=i%i0,s=Ks.get(n.name)?.pos;if(s===void 0)throw new Error(`Position not found for branch ${n.name}`);let l=r.append("line");l.attr("x1",0),l.attr("y1",s),l.attr("x2",Hf),l.attr("y2",s),l.attr("class","branch branch"+a),Vr==="TB"?(l.attr("y1",M6),l.attr("x1",s),l.attr("y2",Hf),l.attr("x2",s)):Vr==="BT"&&(l.attr("y1",Hf),l.attr("x1",s),l.attr("y2",M6),l.attr("x2",s)),I6.push(s);let u=n.name,h=_ge(u),f=r.insert("rect"),p=r.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+a);p.node().appendChild(h);let m=h.getBBox();f.attr("class","branchLabelBkg label"+a).attr("rx",4).attr("ry",4).attr("x",-m.width-4-(il?.rotateCommitLabel===!0?30:0)).attr("y",-m.height/2+8).attr("width",m.width+18).attr("height",m.height+4),p.attr("transform","translate("+(-m.width-14-(il?.rotateCommitLabel===!0?30:0))+", "+(s-m.height/2-1)+")"),Vr==="TB"?(f.attr("x",s-m.width/2-10).attr("y",0),p.attr("transform","translate("+(s-m.width/2-5)+", 0)")):Vr==="BT"?(f.attr("x",s-m.width/2-10).attr("y",Hf),p.attr("transform","translate("+(s-m.width/2-5)+", "+Hf+")")):f.attr("transform","translate(-19, "+(s-m.height/2)+")")})},"drawBranches"),zKe=o(function(t,e,r,n,i){return Ks.set(t,{pos:e,index:r}),e+=50+(i?40:0)+(Vr==="TB"||Vr==="BT"?n.width/2:0),e},"setBranchPosition"),GKe=o(function(t,e,r,n){if(kKe(),X.debug("in gitgraph renderer",t+` +`,"id:",e,r),!il)throw new Error("GitGraph config not found");let i=il.rotateCommitLabel??!1,a=n.db;h4=a.getCommits();let s=a.getBranchesAsObjArray();Vr=a.getDirection();let l=qe(`[id="${e}"]`),u=0;s.forEach((h,f)=>{let d=_ge(h.name),p=l.append("g"),m=p.insert("g").attr("class","branchLabel"),g=m.insert("g").attr("class","label branch-label");g.node()?.appendChild(d);let y=d.getBBox();u=zKe(h.name,u,f,y,i),g.remove(),m.remove(),p.remove()}),Age(l,h4,!1),il.showBranches&&$Ke(l,s),FKe(l,h4),Age(l,h4,!0),qt.insertTitle(l,"gitTitleText",il.titleTopMargin??0,a.getDiagramTitle()),FA(void 0,l,il.diagramPadding,il.useMaxWidth)},"draw"),Lge={draw:GKe}});var VKe,Nge,Mge=N(()=>{"use strict";VKe=o(t=>` + .commit-id, + .commit-msg, + .branch-label { + fill: lightgrey; + color: lightgrey; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } + ${[0,1,2,3,4,5,6,7].map(e=>` + .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; } + .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; } + .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; } + .label${e} { fill: ${t["git"+e]}; } + .arrow${e} { stroke: ${t["git"+e]}; } + `).join(` +`)} + + .branch { + stroke-width: 1; + stroke: ${t.lineColor}; + stroke-dasharray: 2; + } + .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};} + .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; } + .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};} + .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; } + .tag-hole { fill: ${t.textColor}; } + + .commit-merge { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + } + .commit-reverse { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + stroke-width: 3; + } + .commit-highlight-outer { + } + .commit-highlight-inner { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + } + + .arrow { stroke-width: 8; stroke-linecap: round; fill: none} + .gitTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } +`,"getStyles"),Nge=VKe});var Ige={};dr(Ige,{diagram:()=>UKe});var UKe,Oge=N(()=>{"use strict";Cge();pF();Rge();Mge();UKe={parser:Sge,db:N6,renderer:Lge,styles:Nge}});var mF,Fge,$ge=N(()=>{"use strict";mF=(function(){var t=o(function(D,_,O,M){for(O=O||{},M=D.length;M--;O[D[M]]=_);return O},"o"),e=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],r=[1,26],n=[1,27],i=[1,28],a=[1,29],s=[1,30],l=[1,31],u=[1,32],h=[1,33],f=[1,34],d=[1,9],p=[1,10],m=[1,11],g=[1,12],y=[1,13],v=[1,14],x=[1,15],b=[1,16],T=[1,19],S=[1,20],w=[1,21],k=[1,22],A=[1,23],C=[1,25],R=[1,35],I={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:o(function(_,O,M,P,B,F,G){var $=F.length-1;switch(B){case 1:return F[$-1];case 2:this.$=[];break;case 3:F[$-1].push(F[$]),this.$=F[$-1];break;case 4:case 5:this.$=F[$];break;case 6:case 7:this.$=[];break;case 8:P.setWeekday("monday");break;case 9:P.setWeekday("tuesday");break;case 10:P.setWeekday("wednesday");break;case 11:P.setWeekday("thursday");break;case 12:P.setWeekday("friday");break;case 13:P.setWeekday("saturday");break;case 14:P.setWeekday("sunday");break;case 15:P.setWeekend("friday");break;case 16:P.setWeekend("saturday");break;case 17:P.setDateFormat(F[$].substr(11)),this.$=F[$].substr(11);break;case 18:P.enableInclusiveEndDates(),this.$=F[$].substr(18);break;case 19:P.TopAxis(),this.$=F[$].substr(8);break;case 20:P.setAxisFormat(F[$].substr(11)),this.$=F[$].substr(11);break;case 21:P.setTickInterval(F[$].substr(13)),this.$=F[$].substr(13);break;case 22:P.setExcludes(F[$].substr(9)),this.$=F[$].substr(9);break;case 23:P.setIncludes(F[$].substr(9)),this.$=F[$].substr(9);break;case 24:P.setTodayMarker(F[$].substr(12)),this.$=F[$].substr(12);break;case 27:P.setDiagramTitle(F[$].substr(6)),this.$=F[$].substr(6);break;case 28:this.$=F[$].trim(),P.setAccTitle(this.$);break;case 29:case 30:this.$=F[$].trim(),P.setAccDescription(this.$);break;case 31:P.addSection(F[$].substr(8)),this.$=F[$].substr(8);break;case 33:P.addTask(F[$-1],F[$]),this.$="task";break;case 34:this.$=F[$-1],P.setClickEvent(F[$-1],F[$],null);break;case 35:this.$=F[$-2],P.setClickEvent(F[$-2],F[$-1],F[$]);break;case 36:this.$=F[$-2],P.setClickEvent(F[$-2],F[$-1],null),P.setLink(F[$-2],F[$]);break;case 37:this.$=F[$-3],P.setClickEvent(F[$-3],F[$-2],F[$-1]),P.setLink(F[$-3],F[$]);break;case 38:this.$=F[$-2],P.setClickEvent(F[$-2],F[$],null),P.setLink(F[$-2],F[$-1]);break;case 39:this.$=F[$-3],P.setClickEvent(F[$-3],F[$-1],F[$]),P.setLink(F[$-3],F[$-2]);break;case 40:this.$=F[$-1],P.setLink(F[$-1],F[$]);break;case 41:case 47:this.$=F[$-1]+" "+F[$];break;case 42:case 43:case 45:this.$=F[$-2]+" "+F[$-1]+" "+F[$];break;case 44:case 46:this.$=F[$-3]+" "+F[$-2]+" "+F[$-1]+" "+F[$];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:T,31:S,33:w,35:k,36:A,37:24,38:C,40:R},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:36,11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:T,31:S,33:w,35:k,36:A,37:24,38:C,40:R},t(e,[2,5]),t(e,[2,6]),t(e,[2,17]),t(e,[2,18]),t(e,[2,19]),t(e,[2,20]),t(e,[2,21]),t(e,[2,22]),t(e,[2,23]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),t(e,[2,27]),{32:[1,37]},{34:[1,38]},t(e,[2,30]),t(e,[2,31]),t(e,[2,32]),{39:[1,39]},t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),{41:[1,40],43:[1,41]},t(e,[2,4]),t(e,[2,28]),t(e,[2,29]),t(e,[2,33]),t(e,[2,34],{42:[1,42],43:[1,43]}),t(e,[2,40],{41:[1,44]}),t(e,[2,35],{43:[1,45]}),t(e,[2,36]),t(e,[2,38],{42:[1,46]}),t(e,[2,37]),t(e,[2,39])],defaultActions:{},parseError:o(function(_,O){if(O.recoverable)this.trace(_);else{var M=new Error(_);throw M.hash=O,M}},"parseError"),parse:o(function(_){var O=this,M=[0],P=[],B=[null],F=[],G=this.table,$="",U=0,j=0,te=0,Y=2,oe=1,J=F.slice.call(arguments,1),ue=Object.create(this.lexer),re={yy:{}};for(var ee in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ee)&&(re.yy[ee]=this.yy[ee]);ue.setInput(_,re.yy),re.yy.lexer=ue,re.yy.parser=this,typeof ue.yylloc>"u"&&(ue.yylloc={});var Z=ue.yylloc;F.push(Z);var K=ue.options&&ue.options.ranges;typeof re.yy.parseError=="function"?this.parseError=re.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ae(Ce){M.length=M.length-2*Ce,B.length=B.length-Ce,F.length=F.length-Ce}o(ae,"popStack");function Q(){var Ce;return Ce=P.pop()||ue.lex()||oe,typeof Ce!="number"&&(Ce instanceof Array&&(P=Ce,Ce=P.pop()),Ce=O.symbols_[Ce]||Ce),Ce}o(Q,"lex");for(var de,ne,Te,q,Ve,pe,Be={},Ye,He,Le,Ie;;){if(Te=M[M.length-1],this.defaultActions[Te]?q=this.defaultActions[Te]:((de===null||typeof de>"u")&&(de=Q()),q=G[Te]&&G[Te][de]),typeof q>"u"||!q.length||!q[0]){var Ne="";Ie=[];for(Ye in G[Te])this.terminals_[Ye]&&Ye>Y&&Ie.push("'"+this.terminals_[Ye]+"'");ue.showPosition?Ne="Parse error on line "+(U+1)+`: +`+ue.showPosition()+` +Expecting `+Ie.join(", ")+", got '"+(this.terminals_[de]||de)+"'":Ne="Parse error on line "+(U+1)+": Unexpected "+(de==oe?"end of input":"'"+(this.terminals_[de]||de)+"'"),this.parseError(Ne,{text:ue.match,token:this.terminals_[de]||de,line:ue.yylineno,loc:Z,expected:Ie})}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Te+", token: "+de);switch(q[0]){case 1:M.push(de),B.push(ue.yytext),F.push(ue.yylloc),M.push(q[1]),de=null,ne?(de=ne,ne=null):(j=ue.yyleng,$=ue.yytext,U=ue.yylineno,Z=ue.yylloc,te>0&&te--);break;case 2:if(He=this.productions_[q[1]][1],Be.$=B[B.length-He],Be._$={first_line:F[F.length-(He||1)].first_line,last_line:F[F.length-1].last_line,first_column:F[F.length-(He||1)].first_column,last_column:F[F.length-1].last_column},K&&(Be._$.range=[F[F.length-(He||1)].range[0],F[F.length-1].range[1]]),pe=this.performAction.apply(Be,[$,j,U,re.yy,q[1],B,F].concat(J)),typeof pe<"u")return pe;He&&(M=M.slice(0,-1*He*2),B=B.slice(0,-1*He),F=F.slice(0,-1*He)),M.push(this.productions_[q[1]][0]),B.push(Be.$),F.push(Be._$),Le=G[M[M.length-2]][M[M.length-1]],M.push(Le);break;case 3:return!0}}return!0},"parse")},L=(function(){var D={EOF:1,parseError:o(function(O,M){if(this.yy.parser)this.yy.parser.parseError(O,M);else throw new Error(O)},"parseError"),setInput:o(function(_,O){return this.yy=O||this.yy||{},this._input=_,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var _=this._input[0];this.yytext+=_,this.yyleng++,this.offset++,this.match+=_,this.matched+=_;var O=_.match(/(?:\r\n?|\n).*/g);return O?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),_},"input"),unput:o(function(_){var O=_.length,M=_.split(/(?:\r\n?|\n)/g);this._input=_+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-O),this.offset-=O;var P=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),M.length-1&&(this.yylineno-=M.length-1);var B=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:M?(M.length===P.length?this.yylloc.first_column:0)+P[P.length-M.length].length-M[0].length:this.yylloc.first_column-O},this.options.ranges&&(this.yylloc.range=[B[0],B[0]+this.yyleng-O]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(_){this.unput(this.match.slice(_))},"less"),pastInput:o(function(){var _=this.matched.substr(0,this.matched.length-this.match.length);return(_.length>20?"...":"")+_.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var _=this.match;return _.length<20&&(_+=this._input.substr(0,20-_.length)),(_.substr(0,20)+(_.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var _=this.pastInput(),O=new Array(_.length+1).join("-");return _+this.upcomingInput()+` +`+O+"^"},"showPosition"),test_match:o(function(_,O){var M,P,B;if(this.options.backtrack_lexer&&(B={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(B.yylloc.range=this.yylloc.range.slice(0))),P=_[0].match(/(?:\r\n?|\n).*/g),P&&(this.yylineno+=P.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:P?P[P.length-1].length-P[P.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+_[0].length},this.yytext+=_[0],this.match+=_[0],this.matches=_,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(_[0].length),this.matched+=_[0],M=this.performAction.call(this,this.yy,this,O,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),M)return M;if(this._backtrack){for(var F in B)this[F]=B[F];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var _,O,M,P;this._more||(this.yytext="",this.match="");for(var B=this._currentRules(),F=0;FO[0].length)){if(O=M,P=F,this.options.backtrack_lexer){if(_=this.test_match(M,B[F]),_!==!1)return _;if(this._backtrack){O=!1;continue}else return!1}else if(!this.options.flex)break}return O?(_=this.test_match(O,B[P]),_!==!1?_:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var O=this.next();return O||this.lex()},"lex"),begin:o(function(O){this.conditionStack.push(O)},"begin"),popState:o(function(){var O=this.conditionStack.length-1;return O>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(O){return O=this.conditionStack.length-1-Math.abs(O||0),O>=0?this.conditionStack[O]:"INITIAL"},"topState"),pushState:o(function(O){this.begin(O)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(O,M,P,B){var F=B;switch(P){case 0:return this.begin("open_directive"),"open_directive";break;case 1:return this.begin("acc_title"),31;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),33;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:this.begin("href");break;case 15:this.popState();break;case 16:return 43;case 17:this.begin("callbackname");break;case 18:this.popState();break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 21:this.popState();break;case 22:return 42;case 23:this.begin("click");break;case 24:this.popState();break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}};return D})();I.lexer=L;function E(){this.yy={}}return o(E,"Parser"),E.prototype=I,I.Parser=E,new E})();mF.parser=mF;Fge=mF});var zge=Da((gF,yF)=>{"use strict";(function(t,e){typeof gF=="object"&&typeof yF<"u"?yF.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_isoWeek=e()})(gF,(function(){"use strict";var t="day";return function(e,r,n){var i=o(function(l){return l.add(4-l.isoWeekday(),t)},"a"),a=r.prototype;a.isoWeekYear=function(){return i(this).year()},a.isoWeek=function(l){if(!this.$utils().u(l))return this.add(7*(l-this.isoWeek()),t);var u,h,f,d,p=i(this),m=(u=this.isoWeekYear(),h=this.$u,f=(h?n.utc:n)().year(u).startOf("year"),d=4-f.isoWeekday(),f.isoWeekday()>4&&(d+=7),f.add(d,t));return p.diff(m,"week")+1},a.isoWeekday=function(l){return this.$utils().u(l)?this.day()||7:this.day(this.day()%7?l:l-7)};var s=a.startOf;a.startOf=function(l,u){var h=this.$utils(),f=!!h.u(u)||u;return h.p(l)==="isoweek"?f?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(l,u)}}}))});var Gge=Da((vF,xF)=>{"use strict";(function(t,e){typeof vF=="object"&&typeof xF<"u"?xF.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_customParseFormat=e()})(vF,(function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,r=/\d/,n=/\d\d/,i=/\d\d?/,a=/\d*[^-_:/,()\s\d]+/,s={},l=o(function(g){return(g=+g)+(g>68?1900:2e3)},"a"),u=o(function(g){return function(y){this[g]=+y}},"f"),h=[/[+-]\d\d:?(\d\d)?|Z/,function(g){(this.zone||(this.zone={})).offset=(function(y){if(!y||y==="Z")return 0;var v=y.match(/([+-]|\d\d)/g),x=60*v[1]+(+v[2]||0);return x===0?0:v[0]==="+"?-x:x})(g)}],f=o(function(g){var y=s[g];return y&&(y.indexOf?y:y.s.concat(y.f))},"u"),d=o(function(g,y){var v,x=s.meridiem;if(x){for(var b=1;b<=24;b+=1)if(g.indexOf(x(b,0,y))>-1){v=b>12;break}}else v=g===(y?"pm":"PM");return v},"d"),p={A:[a,function(g){this.afternoon=d(g,!1)}],a:[a,function(g){this.afternoon=d(g,!0)}],Q:[r,function(g){this.month=3*(g-1)+1}],S:[r,function(g){this.milliseconds=100*+g}],SS:[n,function(g){this.milliseconds=10*+g}],SSS:[/\d{3}/,function(g){this.milliseconds=+g}],s:[i,u("seconds")],ss:[i,u("seconds")],m:[i,u("minutes")],mm:[i,u("minutes")],H:[i,u("hours")],h:[i,u("hours")],HH:[i,u("hours")],hh:[i,u("hours")],D:[i,u("day")],DD:[n,u("day")],Do:[a,function(g){var y=s.ordinal,v=g.match(/\d+/);if(this.day=v[0],y)for(var x=1;x<=31;x+=1)y(x).replace(/\[|\]/g,"")===g&&(this.day=x)}],w:[i,u("week")],ww:[n,u("week")],M:[i,u("month")],MM:[n,u("month")],MMM:[a,function(g){var y=f("months"),v=(f("monthsShort")||y.map((function(x){return x.slice(0,3)}))).indexOf(g)+1;if(v<1)throw new Error;this.month=v%12||v}],MMMM:[a,function(g){var y=f("months").indexOf(g)+1;if(y<1)throw new Error;this.month=y%12||y}],Y:[/[+-]?\d+/,u("year")],YY:[n,function(g){this.year=l(g)}],YYYY:[/\d{4}/,u("year")],Z:h,ZZ:h};function m(g){var y,v;y=g,v=s&&s.formats;for(var x=(g=y.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(C,R,I){var L=I&&I.toUpperCase();return R||v[I]||t[I]||v[L].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(E,D,_){return D||_.slice(1)}))}))).match(e),b=x.length,T=0;T-1)return new Date((M==="X"?1e3:1)*O);var F=m(M)(O),G=F.year,$=F.month,U=F.day,j=F.hours,te=F.minutes,Y=F.seconds,oe=F.milliseconds,J=F.zone,ue=F.week,re=new Date,ee=U||(G||$?1:re.getDate()),Z=G||re.getFullYear(),K=0;G&&!$||(K=$>0?$-1:re.getMonth());var ae,Q=j||0,de=te||0,ne=Y||0,Te=oe||0;return J?new Date(Date.UTC(Z,K,ee,Q,de,ne,Te+60*J.offset*1e3)):P?new Date(Date.UTC(Z,K,ee,Q,de,ne,Te)):(ae=new Date(Z,K,ee,Q,de,ne,Te),ue&&(ae=B(ae).week(ue).toDate()),ae)}catch{return new Date("")}})(S,A,w,v),this.init(),L&&L!==!0&&(this.$L=this.locale(L).$L),I&&S!=this.format(A)&&(this.$d=new Date("")),s={}}else if(A instanceof Array)for(var E=A.length,D=1;D<=E;D+=1){k[1]=A[D-1];var _=v.apply(this,k);if(_.isValid()){this.$d=_.$d,this.$L=_.$L,this.init();break}D===E&&(this.$d=new Date(""))}else b.call(this,T)}}}))});var Vge=Da((bF,TF)=>{"use strict";(function(t,e){typeof bF=="object"&&typeof TF<"u"?TF.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_advancedFormat=e()})(bF,(function(){"use strict";return function(t,e){var r=e.prototype,n=r.format;r.format=function(i){var a=this,s=this.$locale();if(!this.isValid())return n.bind(this)(i);var l=this.$utils(),u=(i||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(h){switch(h){case"Q":return Math.ceil((a.$M+1)/3);case"Do":return s.ordinal(a.$D);case"gggg":return a.weekYear();case"GGGG":return a.isoWeekYear();case"wo":return s.ordinal(a.week(),"W");case"w":case"ww":return l.s(a.week(),h==="w"?1:2,"0");case"W":case"WW":return l.s(a.isoWeek(),h==="W"?1:2,"0");case"k":case"kk":return l.s(String(a.$H===0?24:a.$H),h==="k"?1:2,"0");case"X":return Math.floor(a.$d.getTime()/1e3);case"x":return a.$d.getTime();case"z":return"["+a.offsetName()+"]";case"zzz":return"["+a.offsetName("long")+"]";default:return h}}));return n.bind(this)(u)}}}))});function i1e(t,e,r){let n=!0;for(;n;)n=!1,r.forEach(function(i){let a="^\\s*"+i+"\\s*$",s=new RegExp(a);t[0].match(s)&&(e[i]=!0,t.shift(1),n=!0)})}var qge,xo,Wge,Yge,Xge,Uge,eu,SF,CF,AF,d4,p4,_F,DF,B6,ty,LF,jge,RF,m4,NF,MF,F6,wF,YKe,XKe,jKe,KKe,QKe,ZKe,JKe,eQe,tQe,rQe,nQe,iQe,aQe,sQe,oQe,lQe,cQe,uQe,hQe,fQe,dQe,pQe,mQe,Kge,gQe,yQe,vQe,Qge,xQe,kF,Zge,Jge,O6,ey,bQe,TQe,EF,P6,Vi,e1e,wQe,a0,kQe,Hge,EQe,t1e,SQe,r1e,CQe,AQe,n1e,a1e=N(()=>{"use strict";qge=ja(tm(),1),xo=ja(X4(),1),Wge=ja(zge(),1),Yge=ja(Gge(),1),Xge=ja(Vge(),1);pt();Xt();tr();ci();xo.default.extend(Wge.default);xo.default.extend(Yge.default);xo.default.extend(Xge.default);Uge={friday:5,saturday:6},eu="",SF="",AF="",d4=[],p4=[],_F=new Map,DF=[],B6=[],ty="",LF="",jge=["active","done","crit","milestone","vert"],RF=[],m4=!1,NF=!1,MF="sunday",F6="saturday",wF=0,YKe=o(function(){DF=[],B6=[],ty="",RF=[],O6=0,EF=void 0,P6=void 0,Vi=[],eu="",SF="",LF="",CF=void 0,AF="",d4=[],p4=[],m4=!1,NF=!1,wF=0,_F=new Map,Sr(),MF="sunday",F6="saturday"},"clear"),XKe=o(function(t){SF=t},"setAxisFormat"),jKe=o(function(){return SF},"getAxisFormat"),KKe=o(function(t){CF=t},"setTickInterval"),QKe=o(function(){return CF},"getTickInterval"),ZKe=o(function(t){AF=t},"setTodayMarker"),JKe=o(function(){return AF},"getTodayMarker"),eQe=o(function(t){eu=t},"setDateFormat"),tQe=o(function(){m4=!0},"enableInclusiveEndDates"),rQe=o(function(){return m4},"endDatesAreInclusive"),nQe=o(function(){NF=!0},"enableTopAxis"),iQe=o(function(){return NF},"topAxisEnabled"),aQe=o(function(t){LF=t},"setDisplayMode"),sQe=o(function(){return LF},"getDisplayMode"),oQe=o(function(){return eu},"getDateFormat"),lQe=o(function(t){d4=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),cQe=o(function(){return d4},"getIncludes"),uQe=o(function(t){p4=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),hQe=o(function(){return p4},"getExcludes"),fQe=o(function(){return _F},"getLinks"),dQe=o(function(t){ty=t,DF.push(t)},"addSection"),pQe=o(function(){return DF},"getSections"),mQe=o(function(){let t=Hge(),e=10,r=0;for(;!t&&r[\d\w- ]+)/.exec(r);if(i!==null){let s=null;for(let u of i.groups.ids.split(" ")){let h=a0(u);h!==void 0&&(!s||h.endTime>s.endTime)&&(s=h)}if(s)return s.endTime;let l=new Date;return l.setHours(0,0,0,0),l}let a=(0,xo.default)(r,e.trim(),!0);if(a.isValid())return a.toDate();{X.debug("Invalid date:"+r),X.debug("With date format:"+e.trim());let s=new Date(r);if(s===void 0||isNaN(s.getTime())||s.getFullYear()<-1e4||s.getFullYear()>1e4)throw new Error("Invalid date:"+r);return s}},"getStartDate"),Zge=o(function(t){let e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return e!==null?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},"parseDuration"),Jge=o(function(t,e,r,n=!1){r=r.trim();let a=/^until\s+(?[\d\w- ]+)/.exec(r);if(a!==null){let f=null;for(let p of a.groups.ids.split(" ")){let m=a0(p);m!==void 0&&(!f||m.startTime{window.open(r,"_self")}),_F.set(n,r))}),t1e(t,"clickable")},"setLink"),t1e=o(function(t,e){t.split(",").forEach(function(r){let n=a0(r);n!==void 0&&n.classes.push(e)})},"setClass"),SQe=o(function(t,e,r){if(ge().securityLevel!=="loose"||e===void 0)return;let n=[];if(typeof r=="string"){n=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let a=0;a{qt.runFunc(e,...n)})},"setClickFun"),r1e=o(function(t,e){RF.push(function(){let r=document.querySelector(`[id="${t}"]`);r!==null&&r.addEventListener("click",function(){e()})},function(){let r=document.querySelector(`[id="${t}-text"]`);r!==null&&r.addEventListener("click",function(){e()})})},"pushFun"),CQe=o(function(t,e,r){t.split(",").forEach(function(n){SQe(n,e,r)}),t1e(t,"clickable")},"setClickEvent"),AQe=o(function(t){RF.forEach(function(e){e(t)})},"bindFunctions"),n1e={getConfig:o(()=>ge().gantt,"getConfig"),clear:YKe,setDateFormat:eQe,getDateFormat:oQe,enableInclusiveEndDates:tQe,endDatesAreInclusive:rQe,enableTopAxis:nQe,topAxisEnabled:iQe,setAxisFormat:XKe,getAxisFormat:jKe,setTickInterval:KKe,getTickInterval:QKe,setTodayMarker:ZKe,getTodayMarker:JKe,setAccTitle:Rr,getAccTitle:Mr,setDiagramTitle:$r,getDiagramTitle:Pr,setDisplayMode:aQe,getDisplayMode:sQe,setAccDescription:Ir,getAccDescription:Or,addSection:dQe,getSections:pQe,getTasks:mQe,addTask:wQe,findTaskById:a0,addTaskOrg:kQe,setIncludes:lQe,getIncludes:cQe,setExcludes:uQe,getExcludes:hQe,setClickEvent:CQe,setLink:EQe,getLinks:fQe,bindFunctions:AQe,parseDuration:Zge,isInvalidDate:Kge,setWeekday:gQe,getWeekday:yQe,setWeekend:vQe};o(i1e,"getTaskTags")});var $6,_Qe,s1e,DQe,ah,LQe,o1e,l1e=N(()=>{"use strict";$6=ja(X4(),1);pt();yr();gr();Xt();Ei();_Qe=o(function(){X.debug("Something is calling, setConf, remove the call")},"setConf"),s1e={monday:Ih,tuesday:P5,wednesday:B5,thursday:fc,friday:F5,saturday:$5,sunday:wl},DQe=o((t,e)=>{let r=[...t].map(()=>-1/0),n=[...t].sort((a,s)=>a.startTime-s.startTime||a.order-s.order),i=0;for(let a of n)for(let s=0;s=r[s]){r[s]=a.endTime,a.order=s+e,s>i&&(i=s);break}return i},"getMaxIntersections"),LQe=o(function(t,e,r,n){let i=ge().gantt,a=ge().securityLevel,s;a==="sandbox"&&(s=qe("#i"+e));let l=a==="sandbox"?qe(s.nodes()[0].contentDocument.body):qe("body"),u=a==="sandbox"?s.nodes()[0].contentDocument:document,h=u.getElementById(e);ah=h.parentElement.offsetWidth,ah===void 0&&(ah=1200),i.useWidth!==void 0&&(ah=i.useWidth);let f=n.db.getTasks(),d=[];for(let C of f)d.push(C.type);d=A(d);let p={},m=2*i.topPadding;if(n.db.getDisplayMode()==="compact"||i.displayMode==="compact"){let C={};for(let I of f)C[I.section]===void 0?C[I.section]=[I]:C[I.section].push(I);let R=0;for(let I of Object.keys(C)){let L=DQe(C[I],R)+1;R+=L,m+=L*(i.barHeight+i.barGap),p[I]=L}}else{m+=f.length*(i.barHeight+i.barGap);for(let C of d)p[C]=f.filter(R=>R.type===C).length}h.setAttribute("viewBox","0 0 "+ah+" "+m);let g=l.select(`[id="${e}"]`),y=V5().domain([Y3(f,function(C){return C.startTime}),W3(f,function(C){return C.endTime})]).rangeRound([0,ah-i.leftPadding-i.rightPadding]);function v(C,R){let I=C.startTime,L=R.startTime,E=0;return I>L?E=1:IG.vert===$.vert?0:G.vert?1:-1);let M=[...new Set(C.map(G=>G.order))].map(G=>C.find($=>$.order===G));g.append("g").selectAll("rect").data(M).enter().append("rect").attr("x",0).attr("y",function(G,$){return $=G.order,$*R+I-2}).attr("width",function(){return _-i.rightPadding/2}).attr("height",R).attr("class",function(G){for(let[$,U]of d.entries())if(G.type===U)return"section section"+$%i.numberSectionStyles;return"section section0"}).enter();let P=g.append("g").selectAll("rect").data(C).enter(),B=n.db.getLinks();if(P.append("rect").attr("id",function(G){return G.id}).attr("rx",3).attr("ry",3).attr("x",function(G){return G.milestone?y(G.startTime)+L+.5*(y(G.endTime)-y(G.startTime))-.5*E:y(G.startTime)+L}).attr("y",function(G,$){return $=G.order,G.vert?i.gridLineStartPadding:$*R+I}).attr("width",function(G){return G.milestone?E:G.vert?.08*E:y(G.renderEndTime||G.endTime)-y(G.startTime)}).attr("height",function(G){return G.vert?f.length*(i.barHeight+i.barGap)+i.barHeight*2:E}).attr("transform-origin",function(G,$){return $=G.order,(y(G.startTime)+L+.5*(y(G.endTime)-y(G.startTime))).toString()+"px "+($*R+I+.5*E).toString()+"px"}).attr("class",function(G){let $="task",U="";G.classes.length>0&&(U=G.classes.join(" "));let j=0;for(let[Y,oe]of d.entries())G.type===oe&&(j=Y%i.numberSectionStyles);let te="";return G.active?G.crit?te+=" activeCrit":te=" active":G.done?G.crit?te=" doneCrit":te=" done":G.crit&&(te+=" crit"),te.length===0&&(te=" task"),G.milestone&&(te=" milestone "+te),G.vert&&(te=" vert "+te),te+=j,te+=" "+U,$+te}),P.append("text").attr("id",function(G){return G.id+"-text"}).text(function(G){return G.task}).attr("font-size",i.fontSize).attr("x",function(G){let $=y(G.startTime),U=y(G.renderEndTime||G.endTime);if(G.milestone&&($+=.5*(y(G.endTime)-y(G.startTime))-.5*E,U=$+E),G.vert)return y(G.startTime)+L;let j=this.getBBox().width;return j>U-$?U+j+1.5*i.leftPadding>_?$+L-5:U+L+5:(U-$)/2+$+L}).attr("y",function(G,$){return G.vert?i.gridLineStartPadding+f.length*(i.barHeight+i.barGap)+60:($=G.order,$*R+i.barHeight/2+(i.fontSize/2-2)+I)}).attr("text-height",E).attr("class",function(G){let $=y(G.startTime),U=y(G.endTime);G.milestone&&(U=$+E);let j=this.getBBox().width,te="";G.classes.length>0&&(te=G.classes.join(" "));let Y=0;for(let[J,ue]of d.entries())G.type===ue&&(Y=J%i.numberSectionStyles);let oe="";return G.active&&(G.crit?oe="activeCritText"+Y:oe="activeText"+Y),G.done?G.crit?oe=oe+" doneCritText"+Y:oe=oe+" doneText"+Y:G.crit&&(oe=oe+" critText"+Y),G.milestone&&(oe+=" milestoneText"),G.vert&&(oe+=" vertText"),j>U-$?U+j+1.5*i.leftPadding>_?te+" taskTextOutsideLeft taskTextOutside"+Y+" "+oe:te+" taskTextOutsideRight taskTextOutside"+Y+" "+oe+" width-"+j:te+" taskText taskText"+Y+" "+oe+" width-"+j}),ge().securityLevel==="sandbox"){let G;G=qe("#i"+e);let $=G.nodes()[0].contentDocument;P.filter(function(U){return B.has(U.id)}).each(function(U){var j=$.querySelector("#"+U.id),te=$.querySelector("#"+U.id+"-text");let Y=j.parentNode;var oe=$.createElement("a");oe.setAttribute("xlink:href",B.get(U.id)),oe.setAttribute("target","_top"),Y.appendChild(oe),oe.appendChild(j),oe.appendChild(te)})}}o(b,"drawRects");function T(C,R,I,L,E,D,_,O){if(_.length===0&&O.length===0)return;let M,P;for(let{startTime:j,endTime:te}of D)(M===void 0||jP)&&(P=te);if(!M||!P)return;if((0,$6.default)(P).diff((0,$6.default)(M),"year")>5){X.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}let B=n.db.getDateFormat(),F=[],G=null,$=(0,$6.default)(M);for(;$.valueOf()<=P;)n.db.isInvalidDate($,B,_,O)?G?G.end=$:G={start:$,end:$}:G&&(F.push(G),G=null),$=$.add(1,"d");g.append("g").selectAll("rect").data(F).enter().append("rect").attr("id",j=>"exclude-"+j.start.format("YYYY-MM-DD")).attr("x",j=>y(j.start.startOf("day"))+I).attr("y",i.gridLineStartPadding).attr("width",j=>y(j.end.endOf("day"))-y(j.start.startOf("day"))).attr("height",E-R-i.gridLineStartPadding).attr("transform-origin",function(j,te){return(y(j.start)+I+.5*(y(j.end)-y(j.start))).toString()+"px "+(te*C+.5*E).toString()+"px"}).attr("class","exclude-range")}o(T,"drawExcludeDays");function S(C,R,I,L){let E=n.db.getDateFormat(),D=n.db.getAxisFormat(),_;D?_=D:E==="D"?_="%d":_=i.axisFormat??"%Y-%m-%d";let O=QA(y).tickSize(-L+R+i.gridLineStartPadding).tickFormat(Pd(_)),P=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(n.db.getTickInterval()||i.tickInterval);if(P!==null){let B=P[1],F=P[2],G=n.db.getWeekday()||i.weekday;switch(F){case"millisecond":O.ticks(uc.every(B));break;case"second":O.ticks(io.every(B));break;case"minute":O.ticks(ku.every(B));break;case"hour":O.ticks(Eu.every(B));break;case"day":O.ticks(Ro.every(B));break;case"week":O.ticks(s1e[G].every(B));break;case"month":O.ticks(Su.every(B));break}}if(g.append("g").attr("class","grid").attr("transform","translate("+C+", "+(L-50)+")").call(O).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),n.db.topAxisEnabled()||i.topAxis){let B=KA(y).tickSize(-L+R+i.gridLineStartPadding).tickFormat(Pd(_));if(P!==null){let F=P[1],G=P[2],$=n.db.getWeekday()||i.weekday;switch(G){case"millisecond":B.ticks(uc.every(F));break;case"second":B.ticks(io.every(F));break;case"minute":B.ticks(ku.every(F));break;case"hour":B.ticks(Eu.every(F));break;case"day":B.ticks(Ro.every(F));break;case"week":B.ticks(s1e[$].every(F));break;case"month":B.ticks(Su.every(F));break}}g.append("g").attr("class","grid").attr("transform","translate("+C+", "+R+")").call(B).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}o(S,"makeGrid");function w(C,R){let I=0,L=Object.keys(p).map(E=>[E,p[E]]);g.append("g").selectAll("text").data(L).enter().append(function(E){let D=E[0].split(tt.lineBreakRegex),_=-(D.length-1)/2,O=u.createElementNS("http://www.w3.org/2000/svg","text");O.setAttribute("dy",_+"em");for(let[M,P]of D.entries()){let B=u.createElementNS("http://www.w3.org/2000/svg","tspan");B.setAttribute("alignment-baseline","central"),B.setAttribute("x","10"),M>0&&B.setAttribute("dy","1em"),B.textContent=P,O.appendChild(B)}return O}).attr("x",10).attr("y",function(E,D){if(D>0)for(let _=0;_{"use strict";RQe=o(t=>` + .mermaid-main-font { + font-family: ${t.fontFamily}; + } + + .exclude-range { + fill: ${t.excludeBkgColor}; + } + + .section { + stroke: none; + opacity: 0.2; + } + + .section0 { + fill: ${t.sectionBkgColor}; + } + + .section2 { + fill: ${t.sectionBkgColor2}; + } + + .section1, + .section3 { + fill: ${t.altSectionBkgColor}; + opacity: 0.2; + } + + .sectionTitle0 { + fill: ${t.titleColor}; + } + + .sectionTitle1 { + fill: ${t.titleColor}; + } + + .sectionTitle2 { + fill: ${t.titleColor}; + } + + .sectionTitle3 { + fill: ${t.titleColor}; + } + + .sectionTitle { + text-anchor: start; + font-family: ${t.fontFamily}; + } + + + /* Grid and axis */ + + .grid .tick { + stroke: ${t.gridColor}; + opacity: 0.8; + shape-rendering: crispEdges; + } + + .grid .tick text { + font-family: ${t.fontFamily}; + fill: ${t.textColor}; + } + + .grid path { + stroke-width: 0; + } + + + /* Today line */ + + .today { + fill: none; + stroke: ${t.todayLineColor}; + stroke-width: 2px; + } + + + /* Task styling */ + + /* Default task */ + + .task { + stroke-width: 2; + } + + .taskText { + text-anchor: middle; + font-family: ${t.fontFamily}; + } + + .taskTextOutsideRight { + fill: ${t.taskTextDarkColor}; + text-anchor: start; + font-family: ${t.fontFamily}; + } + + .taskTextOutsideLeft { + fill: ${t.taskTextDarkColor}; + text-anchor: end; + } + + + /* Special case clickable */ + + .task.clickable { + cursor: pointer; + } + + .taskText.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideLeft.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideRight.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + + /* Specific task settings for the sections*/ + + .taskText0, + .taskText1, + .taskText2, + .taskText3 { + fill: ${t.taskTextColor}; + } + + .task0, + .task1, + .task2, + .task3 { + fill: ${t.taskBkgColor}; + stroke: ${t.taskBorderColor}; + } + + .taskTextOutside0, + .taskTextOutside2 + { + fill: ${t.taskTextOutsideColor}; + } + + .taskTextOutside1, + .taskTextOutside3 { + fill: ${t.taskTextOutsideColor}; + } + + + /* Active task */ + + .active0, + .active1, + .active2, + .active3 { + fill: ${t.activeTaskBkgColor}; + stroke: ${t.activeTaskBorderColor}; + } + + .activeText0, + .activeText1, + .activeText2, + .activeText3 { + fill: ${t.taskTextDarkColor} !important; + } + + + /* Completed task */ + + .done0, + .done1, + .done2, + .done3 { + stroke: ${t.doneTaskBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + } + + .doneText0, + .doneText1, + .doneText2, + .doneText3 { + fill: ${t.taskTextDarkColor} !important; + } + + + /* Tasks on the critical line */ + + .crit0, + .crit1, + .crit2, + .crit3 { + stroke: ${t.critBorderColor}; + fill: ${t.critBkgColor}; + stroke-width: 2; + } + + .activeCrit0, + .activeCrit1, + .activeCrit2, + .activeCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.activeTaskBkgColor}; + stroke-width: 2; + } + + .doneCrit0, + .doneCrit1, + .doneCrit2, + .doneCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + cursor: pointer; + shape-rendering: crispEdges; + } + + .milestone { + transform: rotate(45deg) scale(0.8,0.8); + } + + .milestoneText { + font-style: italic; + } + .doneCritText0, + .doneCritText1, + .doneCritText2, + .doneCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + .vert { + stroke: ${t.vertLineColor}; + } + + .vertText { + font-size: 15px; + text-anchor: middle; + fill: ${t.vertLineColor} !important; + } + + .activeCritText0, + .activeCritText1, + .activeCritText2, + .activeCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + .titleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.titleColor||t.textColor}; + font-family: ${t.fontFamily}; + } +`,"getStyles"),c1e=RQe});var h1e={};dr(h1e,{diagram:()=>NQe});var NQe,f1e=N(()=>{"use strict";$ge();a1e();l1e();u1e();NQe={parser:Fge,db:n1e,renderer:o1e,styles:c1e}});var m1e,g1e=N(()=>{"use strict";Uf();pt();m1e={parse:o(async t=>{let e=await bs("info",t);X.debug(e)},"parse")}});var g4,IF=N(()=>{g4={name:"mermaid",version:"11.12.1",description:"Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.",type:"module",module:"./dist/mermaid.core.mjs",types:"./dist/mermaid.d.ts",exports:{".":{types:"./dist/mermaid.d.ts",import:"./dist/mermaid.core.mjs",default:"./dist/mermaid.core.mjs"},"./*":"./*"},keywords:["diagram","markdown","flowchart","sequence diagram","gantt","class diagram","git graph","mindmap","packet diagram","c4 diagram","er diagram","pie chart","pie diagram","quadrant chart","requirement diagram","graph"],scripts:{clean:"rimraf dist",dev:"pnpm -w dev","docs:code":"typedoc src/defaultConfig.ts src/config.ts src/mermaid.ts && prettier --write ./src/docs/config/setup","docs:build":"rimraf ../../docs && pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts","docs:verify":"pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts --verify","docs:pre:vitepress":"pnpm --filter ./src/docs prefetch && rimraf src/vitepress && pnpm docs:code && tsx scripts/docs.cli.mts --vitepress && pnpm --filter ./src/vitepress install --no-frozen-lockfile --ignore-scripts","docs:build:vitepress":"pnpm docs:pre:vitepress && (cd src/vitepress && pnpm run build) && cpy --flat src/docs/landing/ ./src/vitepress/.vitepress/dist/landing","docs:dev":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:dev:docker":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev:docker" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:serve":"pnpm docs:build:vitepress && vitepress serve src/vitepress","docs:spellcheck":'cspell "src/docs/**/*.md"',"docs:release-version":"tsx scripts/update-release-version.mts","docs:verify-version":"tsx scripts/update-release-version.mts --verify","types:build-config":"tsx scripts/create-types-from-json-schema.mts","types:verify-config":"tsx scripts/create-types-from-json-schema.mts --verify",checkCircle:"npx madge --circular ./src",prepublishOnly:"pnpm docs:verify-version"},repository:{type:"git",url:"https://github.com/mermaid-js/mermaid"},author:"Knut Sveidqvist",license:"MIT",standard:{ignore:["**/parser/*.js","dist/**/*.js","cypress/**/*.js"],globals:["page"]},dependencies:{"@braintree/sanitize-url":"^7.1.1","@iconify/utils":"^3.0.1","@mermaid-js/parser":"workspace:^","@types/d3":"^7.4.3",cytoscape:"^3.29.3","cytoscape-cose-bilkent":"^4.1.0","cytoscape-fcose":"^2.2.0",d3:"^7.9.0","d3-sankey":"^0.12.3","dagre-d3-es":"7.0.13",dayjs:"^1.11.18",dompurify:"^3.2.5",katex:"^0.16.22",khroma:"^2.1.0","lodash-es":"^4.17.21",marked:"^16.2.1",roughjs:"^4.6.6",stylis:"^4.3.6","ts-dedent":"^2.2.0",uuid:"^11.1.0"},devDependencies:{"@adobe/jsonschema2md":"^8.0.5","@iconify/types":"^2.0.0","@types/cytoscape":"^3.21.9","@types/cytoscape-fcose":"^2.2.4","@types/d3-sankey":"^0.12.4","@types/d3-scale":"^4.0.9","@types/d3-scale-chromatic":"^3.1.0","@types/d3-selection":"^3.0.11","@types/d3-shape":"^3.1.7","@types/jsdom":"^21.1.7","@types/katex":"^0.16.7","@types/lodash-es":"^4.17.12","@types/micromatch":"^4.0.9","@types/stylis":"^4.2.7","@types/uuid":"^10.0.0",ajv:"^8.17.1",canvas:"^3.1.2",chokidar:"3.6.0",concurrently:"^9.1.2","csstree-validator":"^4.0.1",globby:"^14.1.0",jison:"^0.4.18","js-base64":"^3.7.8",jsdom:"^26.1.0","json-schema-to-typescript":"^15.0.4",micromatch:"^4.0.8","path-browserify":"^1.0.1",prettier:"^3.5.3",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-gfm":"^4.0.1",rimraf:"^6.0.1","start-server-and-test":"^2.0.13","type-fest":"^4.35.0",typedoc:"^0.28.12","typedoc-plugin-markdown":"^4.8.1",typescript:"~5.7.3","unist-util-flatmap":"^1.0.0","unist-util-visit":"^5.0.0",vitepress:"^1.6.4","vitepress-plugin-search":"1.0.4-alpha.22"},files:["dist/","README.md"],publishConfig:{access:"public"}}});var BQe,FQe,y1e,v1e=N(()=>{"use strict";IF();BQe={version:g4.version+""},FQe=o(()=>BQe.version,"getVersion"),y1e={getVersion:FQe}});var aa,tu=N(()=>{"use strict";yr();Xt();aa=o(t=>{let{securityLevel:e}=ge(),r=qe("body");if(e==="sandbox"){let a=qe(`#i${t}`).node()?.contentDocument??document;r=qe(a.body)}return r.select(`#${t}`)},"selectSvgElement")});var $Qe,x1e,b1e=N(()=>{"use strict";pt();tu();Ei();$Qe=o((t,e,r)=>{X.debug(`rendering info diagram +`+t);let n=aa(e);mn(n,100,400,!0),n.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${r}`)},"draw"),x1e={draw:$Qe}});var T1e={};dr(T1e,{diagram:()=>zQe});var zQe,w1e=N(()=>{"use strict";g1e();v1e();b1e();zQe={parser:m1e,db:y1e,renderer:x1e}});var S1e,OF,z6,PF,UQe,HQe,qQe,WQe,YQe,XQe,jQe,G6,BF=N(()=>{"use strict";pt();ci();La();S1e=ur.pie,OF={sections:new Map,showData:!1,config:S1e},z6=OF.sections,PF=OF.showData,UQe=structuredClone(S1e),HQe=o(()=>structuredClone(UQe),"getConfig"),qQe=o(()=>{z6=new Map,PF=OF.showData,Sr()},"clear"),WQe=o(({label:t,value:e})=>{if(e<0)throw new Error(`"${t}" has invalid value: ${e}. Negative values are not allowed in pie charts. All slice values must be >= 0.`);z6.has(t)||(z6.set(t,e),X.debug(`added new section: ${t}, with value: ${e}`))},"addSection"),YQe=o(()=>z6,"getSections"),XQe=o(t=>{PF=t},"setShowData"),jQe=o(()=>PF,"getShowData"),G6={getConfig:HQe,clear:qQe,setDiagramTitle:$r,getDiagramTitle:Pr,setAccTitle:Rr,getAccTitle:Mr,setAccDescription:Ir,getAccDescription:Or,addSection:WQe,getSections:YQe,setShowData:XQe,getShowData:jQe}});var KQe,C1e,A1e=N(()=>{"use strict";Uf();pt();r0();BF();KQe=o((t,e)=>{nl(t,e),e.setShowData(t.showData),t.sections.map(e.addSection)},"populateDb"),C1e={parse:o(async t=>{let e=await bs("pie",t);X.debug(e),KQe(e,G6)},"parse")}});var QQe,_1e,D1e=N(()=>{"use strict";QQe=o(t=>` + .pieCircle{ + stroke: ${t.pieStrokeColor}; + stroke-width : ${t.pieStrokeWidth}; + opacity : ${t.pieOpacity}; + } + .pieOuterCircle{ + stroke: ${t.pieOuterStrokeColor}; + stroke-width: ${t.pieOuterStrokeWidth}; + fill: none; + } + .pieTitleText { + text-anchor: middle; + font-size: ${t.pieTitleTextSize}; + fill: ${t.pieTitleTextColor}; + font-family: ${t.fontFamily}; + } + .slice { + font-family: ${t.fontFamily}; + fill: ${t.pieSectionTextColor}; + font-size:${t.pieSectionTextSize}; + // fill: white; + } + .legend text { + fill: ${t.pieLegendTextColor}; + font-family: ${t.fontFamily}; + font-size: ${t.pieLegendTextSize}; + } +`,"getStyles"),_1e=QQe});var ZQe,JQe,L1e,R1e=N(()=>{"use strict";yr();Xt();pt();tu();Ei();tr();ZQe=o(t=>{let e=[...t.values()].reduce((i,a)=>i+a,0),r=[...t.entries()].map(([i,a])=>({label:i,value:a})).filter(i=>i.value/e*100>=1).sort((i,a)=>a.value-i.value);return X5().value(i=>i.value)(r)},"createPieArcs"),JQe=o((t,e,r,n)=>{X.debug(`rendering pie chart +`+t);let i=n.db,a=ge(),s=Vn(i.getConfig(),a.pie),l=40,u=18,h=4,f=450,d=f,p=aa(e),m=p.append("g");m.attr("transform","translate("+d/2+","+f/2+")");let{themeVariables:g}=a,[y]=vc(g.pieOuterStrokeWidth);y??=2;let v=s.textPosition,x=Math.min(d,f)/2-l,b=Sl().innerRadius(0).outerRadius(x),T=Sl().innerRadius(x*v).outerRadius(x*v);m.append("circle").attr("cx",0).attr("cy",0).attr("r",x+y/2).attr("class","pieOuterCircle");let S=i.getSections(),w=ZQe(S),k=[g.pie1,g.pie2,g.pie3,g.pie4,g.pie5,g.pie6,g.pie7,g.pie8,g.pie9,g.pie10,g.pie11,g.pie12],A=0;S.forEach(_=>{A+=_});let C=w.filter(_=>(_.data.value/A*100).toFixed(0)!=="0"),R=no(k);m.selectAll("mySlices").data(C).enter().append("path").attr("d",b).attr("fill",_=>R(_.data.label)).attr("class","pieCircle"),m.selectAll("mySlices").data(C).enter().append("text").text(_=>(_.data.value/A*100).toFixed(0)+"%").attr("transform",_=>"translate("+T.centroid(_)+")").style("text-anchor","middle").attr("class","slice"),m.append("text").text(i.getDiagramTitle()).attr("x",0).attr("y",-(f-50)/2).attr("class","pieTitleText");let I=[...S.entries()].map(([_,O])=>({label:_,value:O})),L=m.selectAll(".legend").data(I).enter().append("g").attr("class","legend").attr("transform",(_,O)=>{let M=u+h,P=M*I.length/2,B=12*u,F=O*M-P;return"translate("+B+","+F+")"});L.append("rect").attr("width",u).attr("height",u).style("fill",_=>R(_.label)).style("stroke",_=>R(_.label)),L.append("text").attr("x",u+h).attr("y",u-h).text(_=>i.getShowData()?`${_.label} [${_.value}]`:_.label);let E=Math.max(...L.selectAll("text").nodes().map(_=>_?.getBoundingClientRect().width??0)),D=d+l+u+h+E;p.attr("viewBox",`0 0 ${D} ${f}`),mn(p,f,D,s.useMaxWidth)},"draw"),L1e={draw:JQe}});var N1e={};dr(N1e,{diagram:()=>eZe});var eZe,M1e=N(()=>{"use strict";A1e();BF();D1e();R1e();eZe={parser:C1e,db:G6,renderer:L1e,styles:_1e}});var FF,O1e,P1e=N(()=>{"use strict";FF=(function(){var t=o(function(he,z,se,le){for(se=se||{},le=he.length;le--;se[he[le]]=z);return se},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[1,7],s=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],l=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],u=[55,56,57],h=[2,36],f=[1,37],d=[1,36],p=[1,38],m=[1,35],g=[1,43],y=[1,41],v=[1,14],x=[1,23],b=[1,18],T=[1,19],S=[1,20],w=[1,21],k=[1,22],A=[1,24],C=[1,25],R=[1,26],I=[1,27],L=[1,28],E=[1,29],D=[1,32],_=[1,33],O=[1,34],M=[1,39],P=[1,40],B=[1,42],F=[1,44],G=[1,62],$=[1,61],U=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],j=[1,65],te=[1,66],Y=[1,67],oe=[1,68],J=[1,69],ue=[1,70],re=[1,71],ee=[1,72],Z=[1,73],K=[1,74],ae=[1,75],Q=[1,76],de=[4,5,6,7,8,9,10,11,12,13,14,15,18],ne=[1,90],Te=[1,91],q=[1,92],Ve=[1,99],pe=[1,93],Be=[1,96],Ye=[1,94],He=[1,95],Le=[1,97],Ie=[1,98],Ne=[1,102],Ce=[10,55,56,57],Fe=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],fe={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:o(function(z,se,le,ke,ve,ye,Re){var _e=ye.length-1;switch(ve){case 23:this.$=ye[_e];break;case 24:this.$=ye[_e-1]+""+ye[_e];break;case 26:this.$=ye[_e-1]+ye[_e];break;case 27:this.$=[ye[_e].trim()];break;case 28:ye[_e-2].push(ye[_e].trim()),this.$=ye[_e-2];break;case 29:this.$=ye[_e-4],ke.addClass(ye[_e-2],ye[_e]);break;case 37:this.$=[];break;case 42:this.$=ye[_e].trim(),ke.setDiagramTitle(this.$);break;case 43:this.$=ye[_e].trim(),ke.setAccTitle(this.$);break;case 44:case 45:this.$=ye[_e].trim(),ke.setAccDescription(this.$);break;case 46:ke.addSection(ye[_e].substr(8)),this.$=ye[_e].substr(8);break;case 47:ke.addPoint(ye[_e-3],"",ye[_e-1],ye[_e],[]);break;case 48:ke.addPoint(ye[_e-4],ye[_e-3],ye[_e-1],ye[_e],[]);break;case 49:ke.addPoint(ye[_e-4],"",ye[_e-2],ye[_e-1],ye[_e]);break;case 50:ke.addPoint(ye[_e-5],ye[_e-4],ye[_e-2],ye[_e-1],ye[_e]);break;case 51:ke.setXAxisLeftText(ye[_e-2]),ke.setXAxisRightText(ye[_e]);break;case 52:ye[_e-1].text+=" \u27F6 ",ke.setXAxisLeftText(ye[_e-1]);break;case 53:ke.setXAxisLeftText(ye[_e]);break;case 54:ke.setYAxisBottomText(ye[_e-2]),ke.setYAxisTopText(ye[_e]);break;case 55:ye[_e-1].text+=" \u27F6 ",ke.setYAxisBottomText(ye[_e-1]);break;case 56:ke.setYAxisBottomText(ye[_e]);break;case 57:ke.setQuadrant1Text(ye[_e]);break;case 58:ke.setQuadrant2Text(ye[_e]);break;case 59:ke.setQuadrant3Text(ye[_e]);break;case 60:ke.setQuadrant4Text(ye[_e]);break;case 64:this.$={text:ye[_e],type:"text"};break;case 65:this.$={text:ye[_e-1].text+""+ye[_e],type:ye[_e-1].type};break;case 66:this.$={text:ye[_e],type:"text"};break;case 67:this.$={text:ye[_e],type:"markdown"};break;case 68:this.$=ye[_e];break;case 69:this.$=ye[_e-1]+""+ye[_e];break}},"anonymous"),table:[{18:e,26:1,27:2,28:r,55:n,56:i,57:a},{1:[3]},{18:e,26:8,27:2,28:r,55:n,56:i,57:a},{18:e,26:9,27:2,28:r,55:n,56:i,57:a},t(s,[2,33],{29:10}),t(l,[2,61]),t(l,[2,62]),t(l,[2,63]),{1:[2,30]},{1:[2,31]},t(u,h,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:T,39:S,41:w,42:k,48:A,50:C,51:R,52:I,53:L,54:E,60:D,61:_,63:O,64:M,65:P,66:B,67:F}),t(s,[2,34]),{27:45,55:n,56:i,57:a},t(u,[2,37]),t(u,h,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:T,39:S,41:w,42:k,48:A,50:C,51:R,52:I,53:L,54:E,60:D,61:_,63:O,64:M,65:P,66:B,67:F}),t(u,[2,39]),t(u,[2,40]),t(u,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(u,[2,45]),t(u,[2,46]),{18:[1,50]},{4:f,5:d,10:p,12:m,13:g,14:y,43:51,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:52,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:53,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:54,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:55,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:56,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,44:[1,57],47:[1,58],58:60,59:59,63:O,64:M,65:P,66:B,67:F},t(U,[2,64]),t(U,[2,66]),t(U,[2,67]),t(U,[2,70]),t(U,[2,71]),t(U,[2,72]),t(U,[2,73]),t(U,[2,74]),t(U,[2,75]),t(U,[2,76]),t(U,[2,77]),t(U,[2,78]),t(U,[2,79]),t(U,[2,80]),t(s,[2,35]),t(u,[2,38]),t(u,[2,42]),t(u,[2,43]),t(u,[2,44]),{3:64,4:j,5:te,6:Y,7:oe,8:J,9:ue,10:re,11:ee,12:Z,13:K,14:ae,15:Q,21:63},t(u,[2,53],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,49:[1,77],63:O,64:M,65:P,66:B,67:F}),t(u,[2,56],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,49:[1,78],63:O,64:M,65:P,66:B,67:F}),t(u,[2,57],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,58],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,59],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,60],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),{45:[1,79]},{44:[1,80]},t(U,[2,65]),t(U,[2,81]),t(U,[2,82]),t(U,[2,83]),{3:82,4:j,5:te,6:Y,7:oe,8:J,9:ue,10:re,11:ee,12:Z,13:K,14:ae,15:Q,18:[1,81]},t(de,[2,23]),t(de,[2,1]),t(de,[2,2]),t(de,[2,3]),t(de,[2,4]),t(de,[2,5]),t(de,[2,6]),t(de,[2,7]),t(de,[2,8]),t(de,[2,9]),t(de,[2,10]),t(de,[2,11]),t(de,[2,12]),t(u,[2,52],{58:31,43:83,4:f,5:d,10:p,12:m,13:g,14:y,60:D,61:_,63:O,64:M,65:P,66:B,67:F}),t(u,[2,55],{58:31,43:84,4:f,5:d,10:p,12:m,13:g,14:y,60:D,61:_,63:O,64:M,65:P,66:B,67:F}),{46:[1,85]},{45:[1,86]},{4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,16:89,17:Ye,18:He,19:Le,20:Ie,22:88,23:87},t(de,[2,24]),t(u,[2,51],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,54],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,47],{22:88,16:89,23:100,4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,17:Ye,18:He,19:Le,20:Ie}),{46:[1,101]},t(u,[2,29],{10:Ne}),t(Ce,[2,27],{16:103,4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,17:Ye,18:He,19:Le,20:Ie}),t(Fe,[2,25]),t(Fe,[2,13]),t(Fe,[2,14]),t(Fe,[2,15]),t(Fe,[2,16]),t(Fe,[2,17]),t(Fe,[2,18]),t(Fe,[2,19]),t(Fe,[2,20]),t(Fe,[2,21]),t(Fe,[2,22]),t(u,[2,49],{10:Ne}),t(u,[2,48],{22:88,16:89,23:104,4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,17:Ye,18:He,19:Le,20:Ie}),{4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,16:89,17:Ye,18:He,19:Le,20:Ie,22:105},t(Fe,[2,26]),t(u,[2,50],{10:Ne}),t(Ce,[2,28],{16:103,4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,17:Ye,18:He,19:Le,20:Ie})],defaultActions:{8:[2,30],9:[2,31]},parseError:o(function(z,se){if(se.recoverable)this.trace(z);else{var le=new Error(z);throw le.hash=se,le}},"parseError"),parse:o(function(z){var se=this,le=[0],ke=[],ve=[null],ye=[],Re=this.table,_e="",ze=0,Ke=0,xt=0,We=2,Oe=1,et=ye.slice.call(arguments,1),Ue=Object.create(this.lexer),lt={yy:{}};for(var Gt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Gt)&&(lt.yy[Gt]=this.yy[Gt]);Ue.setInput(z,lt.yy),lt.yy.lexer=Ue,lt.yy.parser=this,typeof Ue.yylloc>"u"&&(Ue.yylloc={});var vt=Ue.yylloc;ye.push(vt);var Lt=Ue.options&&Ue.options.ranges;typeof lt.yy.parseError=="function"?this.parseError=lt.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function dt(Se){le.length=le.length-2*Se,ve.length=ve.length-Se,ye.length=ye.length-Se}o(dt,"popStack");function nt(){var Se;return Se=ke.pop()||Ue.lex()||Oe,typeof Se!="number"&&(Se instanceof Array&&(ke=Se,Se=ke.pop()),Se=se.symbols_[Se]||Se),Se}o(nt,"lex");for(var bt,wt,yt,ft,Ur,_t,bn={},Br,cr,ar,_r;;){if(yt=le[le.length-1],this.defaultActions[yt]?ft=this.defaultActions[yt]:((bt===null||typeof bt>"u")&&(bt=nt()),ft=Re[yt]&&Re[yt][bt]),typeof ft>"u"||!ft.length||!ft[0]){var Ct="";_r=[];for(Br in Re[yt])this.terminals_[Br]&&Br>We&&_r.push("'"+this.terminals_[Br]+"'");Ue.showPosition?Ct="Parse error on line "+(ze+1)+`: +`+Ue.showPosition()+` +Expecting `+_r.join(", ")+", got '"+(this.terminals_[bt]||bt)+"'":Ct="Parse error on line "+(ze+1)+": Unexpected "+(bt==Oe?"end of input":"'"+(this.terminals_[bt]||bt)+"'"),this.parseError(Ct,{text:Ue.match,token:this.terminals_[bt]||bt,line:Ue.yylineno,loc:vt,expected:_r})}if(ft[0]instanceof Array&&ft.length>1)throw new Error("Parse Error: multiple actions possible at state: "+yt+", token: "+bt);switch(ft[0]){case 1:le.push(bt),ve.push(Ue.yytext),ye.push(Ue.yylloc),le.push(ft[1]),bt=null,wt?(bt=wt,wt=null):(Ke=Ue.yyleng,_e=Ue.yytext,ze=Ue.yylineno,vt=Ue.yylloc,xt>0&&xt--);break;case 2:if(cr=this.productions_[ft[1]][1],bn.$=ve[ve.length-cr],bn._$={first_line:ye[ye.length-(cr||1)].first_line,last_line:ye[ye.length-1].last_line,first_column:ye[ye.length-(cr||1)].first_column,last_column:ye[ye.length-1].last_column},Lt&&(bn._$.range=[ye[ye.length-(cr||1)].range[0],ye[ye.length-1].range[1]]),_t=this.performAction.apply(bn,[_e,Ke,ze,lt.yy,ft[1],ve,ye].concat(et)),typeof _t<"u")return _t;cr&&(le=le.slice(0,-1*cr*2),ve=ve.slice(0,-1*cr),ye=ye.slice(0,-1*cr)),le.push(this.productions_[ft[1]][0]),ve.push(bn.$),ye.push(bn._$),ar=Re[le[le.length-2]][le[le.length-1]],le.push(ar);break;case 3:return!0}}return!0},"parse")},xe=(function(){var he={EOF:1,parseError:o(function(se,le){if(this.yy.parser)this.yy.parser.parseError(se,le);else throw new Error(se)},"parseError"),setInput:o(function(z,se){return this.yy=se||this.yy||{},this._input=z,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var z=this._input[0];this.yytext+=z,this.yyleng++,this.offset++,this.match+=z,this.matched+=z;var se=z.match(/(?:\r\n?|\n).*/g);return se?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),z},"input"),unput:o(function(z){var se=z.length,le=z.split(/(?:\r\n?|\n)/g);this._input=z+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-se),this.offset-=se;var ke=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),le.length-1&&(this.yylineno-=le.length-1);var ve=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:le?(le.length===ke.length?this.yylloc.first_column:0)+ke[ke.length-le.length].length-le[0].length:this.yylloc.first_column-se},this.options.ranges&&(this.yylloc.range=[ve[0],ve[0]+this.yyleng-se]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(z){this.unput(this.match.slice(z))},"less"),pastInput:o(function(){var z=this.matched.substr(0,this.matched.length-this.match.length);return(z.length>20?"...":"")+z.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var z=this.match;return z.length<20&&(z+=this._input.substr(0,20-z.length)),(z.substr(0,20)+(z.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var z=this.pastInput(),se=new Array(z.length+1).join("-");return z+this.upcomingInput()+` +`+se+"^"},"showPosition"),test_match:o(function(z,se){var le,ke,ve;if(this.options.backtrack_lexer&&(ve={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ve.yylloc.range=this.yylloc.range.slice(0))),ke=z[0].match(/(?:\r\n?|\n).*/g),ke&&(this.yylineno+=ke.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ke?ke[ke.length-1].length-ke[ke.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+z[0].length},this.yytext+=z[0],this.match+=z[0],this.matches=z,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(z[0].length),this.matched+=z[0],le=this.performAction.call(this,this.yy,this,se,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),le)return le;if(this._backtrack){for(var ye in ve)this[ye]=ve[ye];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var z,se,le,ke;this._more||(this.yytext="",this.match="");for(var ve=this._currentRules(),ye=0;yese[0].length)){if(se=le,ke=ye,this.options.backtrack_lexer){if(z=this.test_match(le,ve[ye]),z!==!1)return z;if(this._backtrack){se=!1;continue}else return!1}else if(!this.options.flex)break}return se?(z=this.test_match(se,ve[ke]),z!==!1?z:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var se=this.next();return se||this.lex()},"lex"),begin:o(function(se){this.conditionStack.push(se)},"begin"),popState:o(function(){var se=this.conditionStack.length-1;return se>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(se){return se=this.conditionStack.length-1-Math.abs(se||0),se>=0?this.conditionStack[se]:"INITIAL"},"topState"),pushState:o(function(se){this.begin(se)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(se,le,ke,ve){var ye=ve;switch(ke){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;break;case 5:return this.popState(),"title_value";break;case 6:return this.begin("acc_title"),37;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),39;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;break;case 29:return this.begin("point_start"),44;break;case 30:return this.begin("point_x"),45;break;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;break;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return he})();fe.lexer=xe;function W(){this.yy={}}return o(W,"Parser"),W.prototype=fe,fe.Parser=W,new W})();FF.parser=FF;O1e=FF});var Ts,V6,B1e=N(()=>{"use strict";yr();La();pt();Oy();Ts=mh(),V6=class{constructor(){this.classes=new Map;this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{o(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:ur.quadrantChart?.chartWidth||500,chartWidth:ur.quadrantChart?.chartHeight||500,titlePadding:ur.quadrantChart?.titlePadding||10,titleFontSize:ur.quadrantChart?.titleFontSize||20,quadrantPadding:ur.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:ur.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:ur.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:ur.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:ur.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:ur.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:ur.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:ur.quadrantChart?.pointTextPadding||5,pointLabelFontSize:ur.quadrantChart?.pointLabelFontSize||12,pointRadius:ur.quadrantChart?.pointRadius||5,xAxisPosition:ur.quadrantChart?.xAxisPosition||"top",yAxisPosition:ur.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:ur.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:ur.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:Ts.quadrant1Fill,quadrant2Fill:Ts.quadrant2Fill,quadrant3Fill:Ts.quadrant3Fill,quadrant4Fill:Ts.quadrant4Fill,quadrant1TextFill:Ts.quadrant1TextFill,quadrant2TextFill:Ts.quadrant2TextFill,quadrant3TextFill:Ts.quadrant3TextFill,quadrant4TextFill:Ts.quadrant4TextFill,quadrantPointFill:Ts.quadrantPointFill,quadrantPointTextFill:Ts.quadrantPointTextFill,quadrantXAxisTextFill:Ts.quadrantXAxisTextFill,quadrantYAxisTextFill:Ts.quadrantYAxisTextFill,quadrantTitleFill:Ts.quadrantTitleFill,quadrantInternalBorderStrokeFill:Ts.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:Ts.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,X.info("clear called")}setData(e){this.data={...this.data,...e}}addPoints(e){this.data.points=[...e,...this.data.points]}addClass(e,r){this.classes.set(e,r)}setConfig(e){X.trace("setConfig called with: ",e),this.config={...this.config,...e}}setThemeConfig(e){X.trace("setThemeConfig called with: ",e),this.themeConfig={...this.themeConfig,...e}}calculateSpace(e,r,n,i){let a=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,s={top:e==="top"&&r?a:0,bottom:e==="bottom"&&r?a:0},l=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,u={left:this.config.yAxisPosition==="left"&&n?l:0,right:this.config.yAxisPosition==="right"&&n?l:0},h=this.config.titleFontSize+this.config.titlePadding*2,f={top:i?h:0},d=this.config.quadrantPadding+u.left,p=this.config.quadrantPadding+s.top+f.top,m=this.config.chartWidth-this.config.quadrantPadding*2-u.left-u.right,g=this.config.chartHeight-this.config.quadrantPadding*2-s.top-s.bottom-f.top,y=m/2,v=g/2;return{xAxisSpace:s,yAxisSpace:u,titleSpace:f,quadrantSpace:{quadrantLeft:d,quadrantTop:p,quadrantWidth:m,quadrantHalfWidth:y,quadrantHeight:g,quadrantHalfHeight:v}}}getAxisLabels(e,r,n,i){let{quadrantSpace:a,titleSpace:s}=i,{quadrantHalfHeight:l,quadrantHeight:u,quadrantLeft:h,quadrantHalfWidth:f,quadrantTop:d,quadrantWidth:p}=a,m=!!this.data.xAxisRightText,g=!!this.data.yAxisTopText,y=[];return this.data.xAxisLeftText&&r&&y.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&r&&y.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+f+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&n&&y.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+u-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&n&&y.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+l-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),y}getQuadrants(e){let{quadrantSpace:r}=e,{quadrantHalfHeight:n,quadrantLeft:i,quadrantHalfWidth:a,quadrantTop:s}=r,l=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s,width:a,height:n,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s,width:a,height:n,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant4Fill}];for(let u of l)u.text.x=u.x+u.width/2,this.data.points.length===0?(u.text.y=u.y+u.height/2,u.text.horizontalPos="middle"):(u.text.y=u.y+this.config.quadrantTextTopPadding,u.text.horizontalPos="top");return l}getQuadrantPoints(e){let{quadrantSpace:r}=e,{quadrantHeight:n,quadrantLeft:i,quadrantTop:a,quadrantWidth:s}=r,l=Tl().domain([0,1]).range([i,s+i]),u=Tl().domain([0,1]).range([n+a,a]);return this.data.points.map(f=>{let d=this.classes.get(f.className);return d&&(f={...d,...f}),{x:l(f.x),y:u(f.y),fill:f.color??this.themeConfig.quadrantPointFill,radius:f.radius??this.config.pointRadius,text:{text:f.text,fill:this.themeConfig.quadrantPointTextFill,x:l(f.x),y:u(f.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:f.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:f.strokeWidth??"0px"}})}getBorders(e){let r=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:n}=e,{quadrantHalfHeight:i,quadrantHeight:a,quadrantLeft:s,quadrantHalfWidth:l,quadrantTop:u,quadrantWidth:h}=n;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u,x2:s+h+r,y2:u},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s+h,y1:u+r,x2:s+h,y2:u+a-r},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u+a,x2:s+h+r,y2:u+a},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s,y1:u+r,x2:s,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+l,y1:u+r,x2:s+l,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+r,y1:u+i,x2:s+h-r,y2:u+i}]}getTitle(e){if(e)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){let e=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),r=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),n=this.config.showTitle&&!!this.data.titleText,i=this.data.points.length>0?"bottom":this.config.xAxisPosition,a=this.calculateSpace(i,e,r,n);return{points:this.getQuadrantPoints(a),quadrants:this.getQuadrants(a),axisLabels:this.getAxisLabels(i,e,r,a),borderLines:this.getBorders(a),title:this.getTitle(n)}}}});function $F(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function F1e(t){return!/^\d+$/.test(t)}function $1e(t){return!/^\d+px$/.test(t)}var s0,z1e=N(()=>{"use strict";s0=class extends Error{static{o(this,"InvalidStyleError")}constructor(e,r,n){super(`value for ${e} ${r} is invalid, please use a valid ${n}`),this.name="InvalidStyleError"}};o($F,"validateHexCode");o(F1e,"validateNumber");o($1e,"validateSizeInPixels")});function sh(t){return sr(t.trim(),nZe)}function iZe(t){Ca.setData({quadrant1Text:sh(t.text)})}function aZe(t){Ca.setData({quadrant2Text:sh(t.text)})}function sZe(t){Ca.setData({quadrant3Text:sh(t.text)})}function oZe(t){Ca.setData({quadrant4Text:sh(t.text)})}function lZe(t){Ca.setData({xAxisLeftText:sh(t.text)})}function cZe(t){Ca.setData({xAxisRightText:sh(t.text)})}function uZe(t){Ca.setData({yAxisTopText:sh(t.text)})}function hZe(t){Ca.setData({yAxisBottomText:sh(t.text)})}function zF(t){let e={};for(let r of t){let[n,i]=r.trim().split(/\s*:\s*/);if(n==="radius"){if(F1e(i))throw new s0(n,i,"number");e.radius=parseInt(i)}else if(n==="color"){if($F(i))throw new s0(n,i,"hex code");e.color=i}else if(n==="stroke-color"){if($F(i))throw new s0(n,i,"hex code");e.strokeColor=i}else if(n==="stroke-width"){if($1e(i))throw new s0(n,i,"number of pixels (eg. 10px)");e.strokeWidth=i}else throw new Error(`style named ${n} is not supported.`)}return e}function fZe(t,e,r,n,i){let a=zF(i);Ca.addPoints([{x:r,y:n,text:sh(t.text),className:e,...a}])}function dZe(t,e){Ca.addClass(t,zF(e))}function pZe(t){Ca.setConfig({chartWidth:t})}function mZe(t){Ca.setConfig({chartHeight:t})}function gZe(){let t=ge(),{themeVariables:e,quadrantChart:r}=t;return r&&Ca.setConfig(r),Ca.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),Ca.setData({titleText:Pr()}),Ca.build()}var nZe,Ca,yZe,G1e,V1e=N(()=>{"use strict";Xt();gr();ci();B1e();z1e();nZe=ge();o(sh,"textSanitizer");Ca=new V6;o(iZe,"setQuadrant1Text");o(aZe,"setQuadrant2Text");o(sZe,"setQuadrant3Text");o(oZe,"setQuadrant4Text");o(lZe,"setXAxisLeftText");o(cZe,"setXAxisRightText");o(uZe,"setYAxisTopText");o(hZe,"setYAxisBottomText");o(zF,"parseStyles");o(fZe,"addPoint");o(dZe,"addClass");o(pZe,"setWidth");o(mZe,"setHeight");o(gZe,"getQuadrantData");yZe=o(function(){Ca.clear(),Sr()},"clear"),G1e={setWidth:pZe,setHeight:mZe,setQuadrant1Text:iZe,setQuadrant2Text:aZe,setQuadrant3Text:sZe,setQuadrant4Text:oZe,setXAxisLeftText:lZe,setXAxisRightText:cZe,setYAxisTopText:uZe,setYAxisBottomText:hZe,parseStyles:zF,addPoint:fZe,addClass:dZe,getQuadrantData:gZe,clear:yZe,setAccTitle:Rr,getAccTitle:Mr,setDiagramTitle:$r,getDiagramTitle:Pr,getAccDescription:Or,setAccDescription:Ir}});var vZe,U1e,H1e=N(()=>{"use strict";yr();Xt();pt();Ei();vZe=o((t,e,r,n)=>{function i(C){return C==="top"?"hanging":"middle"}o(i,"getDominantBaseLine");function a(C){return C==="left"?"start":"middle"}o(a,"getTextAnchor");function s(C){return`translate(${C.x}, ${C.y}) rotate(${C.rotation||0})`}o(s,"getTransformation");let l=ge();X.debug(`Rendering quadrant chart +`+t);let u=l.securityLevel,h;u==="sandbox"&&(h=qe("#i"+e));let d=(u==="sandbox"?qe(h.nodes()[0].contentDocument.body):qe("body")).select(`[id="${e}"]`),p=d.append("g").attr("class","main"),m=l.quadrantChart?.chartWidth??500,g=l.quadrantChart?.chartHeight??500;mn(d,g,m,l.quadrantChart?.useMaxWidth??!0),d.attr("viewBox","0 0 "+m+" "+g),n.db.setHeight(g),n.db.setWidth(m);let y=n.db.getQuadrantData(),v=p.append("g").attr("class","quadrants"),x=p.append("g").attr("class","border"),b=p.append("g").attr("class","data-points"),T=p.append("g").attr("class","labels"),S=p.append("g").attr("class","title");y.title&&S.append("text").attr("x",0).attr("y",0).attr("fill",y.title.fill).attr("font-size",y.title.fontSize).attr("dominant-baseline",i(y.title.horizontalPos)).attr("text-anchor",a(y.title.verticalPos)).attr("transform",s(y.title)).text(y.title.text),y.borderLines&&x.selectAll("line").data(y.borderLines).enter().append("line").attr("x1",C=>C.x1).attr("y1",C=>C.y1).attr("x2",C=>C.x2).attr("y2",C=>C.y2).style("stroke",C=>C.strokeFill).style("stroke-width",C=>C.strokeWidth);let w=v.selectAll("g.quadrant").data(y.quadrants).enter().append("g").attr("class","quadrant");w.append("rect").attr("x",C=>C.x).attr("y",C=>C.y).attr("width",C=>C.width).attr("height",C=>C.height).attr("fill",C=>C.fill),w.append("text").attr("x",0).attr("y",0).attr("fill",C=>C.text.fill).attr("font-size",C=>C.text.fontSize).attr("dominant-baseline",C=>i(C.text.horizontalPos)).attr("text-anchor",C=>a(C.text.verticalPos)).attr("transform",C=>s(C.text)).text(C=>C.text.text),T.selectAll("g.label").data(y.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(C=>C.text).attr("fill",C=>C.fill).attr("font-size",C=>C.fontSize).attr("dominant-baseline",C=>i(C.horizontalPos)).attr("text-anchor",C=>a(C.verticalPos)).attr("transform",C=>s(C));let A=b.selectAll("g.data-point").data(y.points).enter().append("g").attr("class","data-point");A.append("circle").attr("cx",C=>C.x).attr("cy",C=>C.y).attr("r",C=>C.radius).attr("fill",C=>C.fill).attr("stroke",C=>C.strokeColor).attr("stroke-width",C=>C.strokeWidth),A.append("text").attr("x",0).attr("y",0).text(C=>C.text.text).attr("fill",C=>C.text.fill).attr("font-size",C=>C.text.fontSize).attr("dominant-baseline",C=>i(C.text.horizontalPos)).attr("text-anchor",C=>a(C.text.verticalPos)).attr("transform",C=>s(C.text))},"draw"),U1e={draw:vZe}});var q1e={};dr(q1e,{diagram:()=>xZe});var xZe,W1e=N(()=>{"use strict";P1e();V1e();H1e();xZe={parser:O1e,db:G1e,renderer:U1e,styles:o(()=>"","styles")}});var GF,j1e,K1e=N(()=>{"use strict";GF=(function(){var t=o(function(O,M,P,B){for(P=P||{},B=O.length;B--;P[O[B]]=M);return P},"o"),e=[1,10,12,14,16,18,19,21,23],r=[2,6],n=[1,3],i=[1,5],a=[1,6],s=[1,7],l=[1,5,10,12,14,16,18,19,21,23,34,35,36],u=[1,25],h=[1,26],f=[1,28],d=[1,29],p=[1,30],m=[1,31],g=[1,32],y=[1,33],v=[1,34],x=[1,35],b=[1,36],T=[1,37],S=[1,43],w=[1,42],k=[1,47],A=[1,50],C=[1,10,12,14,16,18,19,21,23,34,35,36],R=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],I=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],L=[1,64],E={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:o(function(M,P,B,F,G,$,U){var j=$.length-1;switch(G){case 5:F.setOrientation($[j]);break;case 9:F.setDiagramTitle($[j].text.trim());break;case 12:F.setLineData({text:"",type:"text"},$[j]);break;case 13:F.setLineData($[j-1],$[j]);break;case 14:F.setBarData({text:"",type:"text"},$[j]);break;case 15:F.setBarData($[j-1],$[j]);break;case 16:this.$=$[j].trim(),F.setAccTitle(this.$);break;case 17:case 18:this.$=$[j].trim(),F.setAccDescription(this.$);break;case 19:this.$=$[j-1];break;case 20:this.$=[Number($[j-2]),...$[j]];break;case 21:this.$=[Number($[j])];break;case 22:F.setXAxisTitle($[j]);break;case 23:F.setXAxisTitle($[j-1]);break;case 24:F.setXAxisTitle({type:"text",text:""});break;case 25:F.setXAxisBand($[j]);break;case 26:F.setXAxisRangeData(Number($[j-2]),Number($[j]));break;case 27:this.$=$[j-1];break;case 28:this.$=[$[j-2],...$[j]];break;case 29:this.$=[$[j]];break;case 30:F.setYAxisTitle($[j]);break;case 31:F.setYAxisTitle($[j-1]);break;case 32:F.setYAxisTitle({type:"text",text:""});break;case 33:F.setYAxisRangeData(Number($[j-2]),Number($[j]));break;case 37:this.$={text:$[j],type:"text"};break;case 38:this.$={text:$[j],type:"text"};break;case 39:this.$={text:$[j],type:"markdown"};break;case 40:this.$=$[j];break;case 41:this.$=$[j-1]+""+$[j];break}},"anonymous"),table:[t(e,r,{3:1,4:2,7:4,5:n,34:i,35:a,36:s}),{1:[3]},t(e,r,{4:2,7:4,3:8,5:n,34:i,35:a,36:s}),t(e,r,{4:2,7:4,6:9,3:10,5:n,8:[1,11],34:i,35:a,36:s}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(l,[2,34]),t(l,[2,35]),t(l,[2,36]),{1:[2,1]},t(e,r,{4:2,7:4,3:21,5:n,34:i,35:a,36:s}),{1:[2,3]},t(l,[2,5]),t(e,[2,7],{4:22,34:i,35:a,36:s}),{11:23,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:39,13:38,24:S,27:w,29:40,30:41,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:45,15:44,27:k,33:46,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:49,17:48,24:A,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:52,17:51,24:A,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{20:[1,53]},{22:[1,54]},t(C,[2,18]),{1:[2,2]},t(C,[2,8]),t(C,[2,9]),t(R,[2,37],{40:55,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T}),t(R,[2,38]),t(R,[2,39]),t(I,[2,40]),t(I,[2,42]),t(I,[2,43]),t(I,[2,44]),t(I,[2,45]),t(I,[2,46]),t(I,[2,47]),t(I,[2,48]),t(I,[2,49]),t(I,[2,50]),t(I,[2,51]),t(C,[2,10]),t(C,[2,22],{30:41,29:56,24:S,27:w}),t(C,[2,24]),t(C,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},t(C,[2,11]),t(C,[2,30],{33:60,27:k}),t(C,[2,32]),{31:[1,61]},t(C,[2,12]),{17:62,24:A},{25:63,27:L},t(C,[2,14]),{17:65,24:A},t(C,[2,16]),t(C,[2,17]),t(I,[2,41]),t(C,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(C,[2,31]),{27:[1,69]},t(C,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(C,[2,15]),t(C,[2,26]),t(C,[2,27]),{11:59,32:72,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},t(C,[2,33]),t(C,[2,19]),{25:73,27:L},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:o(function(M,P){if(P.recoverable)this.trace(M);else{var B=new Error(M);throw B.hash=P,B}},"parseError"),parse:o(function(M){var P=this,B=[0],F=[],G=[null],$=[],U=this.table,j="",te=0,Y=0,oe=0,J=2,ue=1,re=$.slice.call(arguments,1),ee=Object.create(this.lexer),Z={yy:{}};for(var K in this.yy)Object.prototype.hasOwnProperty.call(this.yy,K)&&(Z.yy[K]=this.yy[K]);ee.setInput(M,Z.yy),Z.yy.lexer=ee,Z.yy.parser=this,typeof ee.yylloc>"u"&&(ee.yylloc={});var ae=ee.yylloc;$.push(ae);var Q=ee.options&&ee.options.ranges;typeof Z.yy.parseError=="function"?this.parseError=Z.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function de(fe){B.length=B.length-2*fe,G.length=G.length-fe,$.length=$.length-fe}o(de,"popStack");function ne(){var fe;return fe=F.pop()||ee.lex()||ue,typeof fe!="number"&&(fe instanceof Array&&(F=fe,fe=F.pop()),fe=P.symbols_[fe]||fe),fe}o(ne,"lex");for(var Te,q,Ve,pe,Be,Ye,He={},Le,Ie,Ne,Ce;;){if(Ve=B[B.length-1],this.defaultActions[Ve]?pe=this.defaultActions[Ve]:((Te===null||typeof Te>"u")&&(Te=ne()),pe=U[Ve]&&U[Ve][Te]),typeof pe>"u"||!pe.length||!pe[0]){var Fe="";Ce=[];for(Le in U[Ve])this.terminals_[Le]&&Le>J&&Ce.push("'"+this.terminals_[Le]+"'");ee.showPosition?Fe="Parse error on line "+(te+1)+`: +`+ee.showPosition()+` +Expecting `+Ce.join(", ")+", got '"+(this.terminals_[Te]||Te)+"'":Fe="Parse error on line "+(te+1)+": Unexpected "+(Te==ue?"end of input":"'"+(this.terminals_[Te]||Te)+"'"),this.parseError(Fe,{text:ee.match,token:this.terminals_[Te]||Te,line:ee.yylineno,loc:ae,expected:Ce})}if(pe[0]instanceof Array&&pe.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ve+", token: "+Te);switch(pe[0]){case 1:B.push(Te),G.push(ee.yytext),$.push(ee.yylloc),B.push(pe[1]),Te=null,q?(Te=q,q=null):(Y=ee.yyleng,j=ee.yytext,te=ee.yylineno,ae=ee.yylloc,oe>0&&oe--);break;case 2:if(Ie=this.productions_[pe[1]][1],He.$=G[G.length-Ie],He._$={first_line:$[$.length-(Ie||1)].first_line,last_line:$[$.length-1].last_line,first_column:$[$.length-(Ie||1)].first_column,last_column:$[$.length-1].last_column},Q&&(He._$.range=[$[$.length-(Ie||1)].range[0],$[$.length-1].range[1]]),Ye=this.performAction.apply(He,[j,Y,te,Z.yy,pe[1],G,$].concat(re)),typeof Ye<"u")return Ye;Ie&&(B=B.slice(0,-1*Ie*2),G=G.slice(0,-1*Ie),$=$.slice(0,-1*Ie)),B.push(this.productions_[pe[1]][0]),G.push(He.$),$.push(He._$),Ne=U[B[B.length-2]][B[B.length-1]],B.push(Ne);break;case 3:return!0}}return!0},"parse")},D=(function(){var O={EOF:1,parseError:o(function(P,B){if(this.yy.parser)this.yy.parser.parseError(P,B);else throw new Error(P)},"parseError"),setInput:o(function(M,P){return this.yy=P||this.yy||{},this._input=M,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var M=this._input[0];this.yytext+=M,this.yyleng++,this.offset++,this.match+=M,this.matched+=M;var P=M.match(/(?:\r\n?|\n).*/g);return P?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),M},"input"),unput:o(function(M){var P=M.length,B=M.split(/(?:\r\n?|\n)/g);this._input=M+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-P),this.offset-=P;var F=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),B.length-1&&(this.yylineno-=B.length-1);var G=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:B?(B.length===F.length?this.yylloc.first_column:0)+F[F.length-B.length].length-B[0].length:this.yylloc.first_column-P},this.options.ranges&&(this.yylloc.range=[G[0],G[0]+this.yyleng-P]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(M){this.unput(this.match.slice(M))},"less"),pastInput:o(function(){var M=this.matched.substr(0,this.matched.length-this.match.length);return(M.length>20?"...":"")+M.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var M=this.match;return M.length<20&&(M+=this._input.substr(0,20-M.length)),(M.substr(0,20)+(M.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var M=this.pastInput(),P=new Array(M.length+1).join("-");return M+this.upcomingInput()+` +`+P+"^"},"showPosition"),test_match:o(function(M,P){var B,F,G;if(this.options.backtrack_lexer&&(G={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(G.yylloc.range=this.yylloc.range.slice(0))),F=M[0].match(/(?:\r\n?|\n).*/g),F&&(this.yylineno+=F.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:F?F[F.length-1].length-F[F.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+M[0].length},this.yytext+=M[0],this.match+=M[0],this.matches=M,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(M[0].length),this.matched+=M[0],B=this.performAction.call(this,this.yy,this,P,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),B)return B;if(this._backtrack){for(var $ in G)this[$]=G[$];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var M,P,B,F;this._more||(this.yytext="",this.match="");for(var G=this._currentRules(),$=0;$P[0].length)){if(P=B,F=$,this.options.backtrack_lexer){if(M=this.test_match(B,G[$]),M!==!1)return M;if(this._backtrack){P=!1;continue}else return!1}else if(!this.options.flex)break}return P?(M=this.test_match(P,G[F]),M!==!1?M:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var P=this.next();return P||this.lex()},"lex"),begin:o(function(P){this.conditionStack.push(P)},"begin"),popState:o(function(){var P=this.conditionStack.length-1;return P>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(P){return P=this.conditionStack.length-1-Math.abs(P||0),P>=0?this.conditionStack[P]:"INITIAL"},"topState"),pushState:o(function(P){this.begin(P)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(P,B,F,G){var $=G;switch(F){case 0:break;case 1:break;case 2:return this.popState(),34;break;case 3:return this.popState(),34;break;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.pushState("acc_descr"),21;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 5;case 16:return 8;case 17:return this.pushState("axis_data"),"X_AXIS";break;case 18:return this.pushState("axis_data"),"Y_AXIS";break;case 19:return this.pushState("axis_band_data"),24;break;case 20:return 31;case 21:return this.pushState("data"),16;break;case 22:return this.pushState("data"),18;break;case 23:return this.pushState("data_inner"),24;break;case 24:return 27;case 25:return this.popState(),26;break;case 26:this.popState();break;case 27:this.pushState("string");break;case 28:this.popState();break;case 29:return"STR";case 30:return 24;case 31:return 26;case 32:return 43;case 33:return"COLON";case 34:return 44;case 35:return 28;case 36:return 45;case 37:return 46;case 38:return 48;case 39:return 50;case 40:return 47;case 41:return 41;case 42:return 49;case 43:return 42;case 44:break;case 45:return 35;case 46:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\{)/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:xychart\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,24,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,18,21,22,23,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,22,24,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[28,29],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0}}};return O})();E.lexer=D;function _(){this.yy={}}return o(_,"Parser"),_.prototype=E,E.Parser=_,new _})();GF.parser=GF;j1e=GF});function VF(t){return t.type==="bar"}function U6(t){return t.type==="band"}function ry(t){return t.type==="linear"}var H6=N(()=>{"use strict";o(VF,"isBarPlot");o(U6,"isBandAxisData");o(ry,"isLinearAxisData")});var ny,UF=N(()=>{"use strict";zo();ny=class{constructor(e){this.parentGroup=e}static{o(this,"TextDimensionCalculatorWithFont")}getMaxDimension(e,r){if(!this.parentGroup)return{width:e.reduce((a,s)=>Math.max(s.length,a),0)*r,height:r};let n={width:0,height:0},i=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",r);for(let a of e){let s=qZ(i,1,a),l=s?s.width:a.length*r,u=s?s.height:r;n.width=Math.max(n.width,l),n.height=Math.max(n.height,u)}return i.remove(),n}}});var iy,HF=N(()=>{"use strict";iy=class{constructor(e,r,n,i){this.axisConfig=e;this.title=r;this.textDimensionCalculator=n;this.axisThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0};this.axisPosition="left";this.showTitle=!1;this.showLabel=!1;this.showTick=!1;this.showAxisLine=!1;this.outerPadding=0;this.titleTextHeight=0;this.labelTextHeight=0;this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{o(this,"BaseAxis")}setRange(e){this.range=e,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=e[1]-e[0]:this.boundingRect.width=e[1]-e[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(e){this.axisPosition=e,this.setRange(this.range)}getTickDistance(){let e=this.getRange();return Math.abs(e[0]-e[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(e=>e.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){.7*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor(.7*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(e){let r=e.height;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.width;this.outerPadding=Math.min(n.width/2,i);let a=n.height+this.axisConfig.labelPadding*2;this.labelTextHeight=n.height,a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width,this.boundingRect.height=e.height-r}calculateSpaceIfDrawnVertical(e){let r=e.width;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.height;this.outerPadding=Math.min(n.height/2,i);let a=n.width+this.axisConfig.labelPadding*2;a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width-r,this.boundingRect.height=e.height}calculateSpace(e){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(e):this.calculateSpaceIfDrawnHorizontally(e),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}getDrawableElementsForLeftAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${r},${this.boundingRect.y} L ${r},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(r),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){let r=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${r},${this.getScaleValue(n)} L ${r-this.axisConfig.tickLength},${this.getScaleValue(n)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForBottomAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r} L ${this.getScaleValue(n)},${r+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForTopAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y;e.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(n)},${r+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}}});var q6,Q1e=N(()=>{"use strict";yr();pt();HF();q6=class extends iy{static{o(this,"BandAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.categories=n,this.scale=q0().domain(this.categories).range(this.getRange())}setRange(e){super.setRange(e)}recalculateScale(){this.scale=q0().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),X.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(e){return this.scale(e)??this.getRange()[0]}}});var W6,Z1e=N(()=>{"use strict";yr();HF();W6=class extends iy{static{o(this,"LinearAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.domain=n,this.scale=Tl().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let e=[...this.domain];this.axisPosition==="left"&&e.reverse(),this.scale=Tl().domain(e).range(this.getRange())}getScaleValue(e){return this.scale(e)}}});function qF(t,e,r,n){let i=new ny(n);return U6(t)?new q6(e,r,t.categories,t.title,i):new W6(e,r,[t.min,t.max],t.title,i)}var J1e=N(()=>{"use strict";H6();UF();Q1e();Z1e();o(qF,"getAxis")});function eye(t,e,r,n){let i=new ny(n);return new WF(i,t,e,r)}var WF,tye=N(()=>{"use strict";UF();WF=class{constructor(e,r,n,i){this.textDimensionCalculator=e;this.chartConfig=r;this.chartData=n;this.chartThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{o(this,"ChartTitle")}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){let r=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),n=Math.max(r.width,e.width),i=r.height+2*this.chartConfig.titlePadding;return r.width<=n&&r.height<=i&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=n,this.boundingRect.height=i,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){let e=[];return this.showChartTitle&&e.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),e}};o(eye,"getChartTitleComponent")});var Y6,rye=N(()=>{"use strict";yr();Y6=class{constructor(e,r,n,i,a){this.plotData=e;this.xAxis=r;this.yAxis=n;this.orientation=i;this.plotIndex=a}static{o(this,"LinePlot")}getDrawableElement(){let e=this.plotData.data.map(n=>[this.xAxis.getScaleValue(n[0]),this.yAxis.getScaleValue(n[1])]),r;return this.orientation==="horizontal"?r=Cl().y(n=>n[0]).x(n=>n[1])(e):r=Cl().x(n=>n[0]).y(n=>n[1])(e),r?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:r,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}}});var X6,nye=N(()=>{"use strict";X6=class{constructor(e,r,n,i,a,s){this.barData=e;this.boundingRect=r;this.xAxis=n;this.yAxis=i;this.orientation=a;this.plotIndex=s}static{o(this,"BarPlot")}getDrawableElement(){let e=this.barData.data.map(a=>[this.xAxis.getScaleValue(a[0]),this.yAxis.getScaleValue(a[1])]),n=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-.05),i=n/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:this.boundingRect.x,y:a[0]-i,height:n,width:a[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:a[0]-i,y:a[1],width:n,height:this.boundingRect.y+this.boundingRect.height-a[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}}});function iye(t,e,r){return new YF(t,e,r)}var YF,aye=N(()=>{"use strict";rye();nye();YF=class{constructor(e,r,n){this.chartConfig=e;this.chartData=r;this.chartThemeConfig=n;this.boundingRect={x:0,y:0,width:0,height:0}}static{o(this,"BasePlot")}setAxes(e,r){this.xAxis=e,this.yAxis=r}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){return this.boundingRect.width=e.width,this.boundingRect.height=e.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");let e=[];for(let[r,n]of this.chartData.plots.entries())switch(n.type){case"line":{let i=new Y6(n,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break;case"bar":{let i=new X6(n,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break}return e}};o(iye,"getPlotComponent")});var j6,sye=N(()=>{"use strict";J1e();tye();aye();H6();j6=class{constructor(e,r,n,i){this.chartConfig=e;this.chartData=r;this.componentStore={title:eye(e,r,n,i),plot:iye(e,r,n),xAxis:qF(r.xAxis,e.xAxis,{titleColor:n.xAxisTitleColor,labelColor:n.xAxisLabelColor,tickColor:n.xAxisTickColor,axisLineColor:n.xAxisLineColor},i),yAxis:qF(r.yAxis,e.yAxis,{titleColor:n.yAxisTitleColor,labelColor:n.yAxisLabelColor,tickColor:n.yAxisTickColor,axisLineColor:n.yAxisLineColor},i)}}static{o(this,"Orchestrator")}calculateVerticalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),s=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),l=this.componentStore.plot.calculateSpace({width:a,height:s});e-=l.width,r-=l.height,l=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),i=l.height,r-=l.height,this.componentStore.xAxis.setAxisPosition("bottom"),l=this.componentStore.xAxis.calculateSpace({width:e,height:r}),r-=l.height,this.componentStore.yAxis.setAxisPosition("left"),l=this.componentStore.yAxis.calculateSpace({width:e,height:r}),n=l.width,e-=l.width,e>0&&(a+=e,e=0),r>0&&(s+=r,r=0),this.componentStore.plot.calculateSpace({width:a,height:s}),this.componentStore.plot.setBoundingBoxXY({x:n,y:i}),this.componentStore.xAxis.setRange([n,n+a]),this.componentStore.xAxis.setBoundingBoxXY({x:n,y:i+s}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:i}),this.chartData.plots.some(u=>VF(u))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=0,s=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),l=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),u=this.componentStore.plot.calculateSpace({width:s,height:l});e-=u.width,r-=u.height,u=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),n=u.height,r-=u.height,this.componentStore.xAxis.setAxisPosition("left"),u=this.componentStore.xAxis.calculateSpace({width:e,height:r}),e-=u.width,i=u.width,this.componentStore.yAxis.setAxisPosition("top"),u=this.componentStore.yAxis.calculateSpace({width:e,height:r}),r-=u.height,a=n+u.height,e>0&&(s+=e,e=0),r>0&&(l+=r,r=0),this.componentStore.plot.calculateSpace({width:s,height:l}),this.componentStore.plot.setBoundingBoxXY({x:i,y:a}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:i,y:n}),this.componentStore.xAxis.setRange([a,a+l]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:a}),this.chartData.plots.some(h=>VF(h))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let e=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let r of Object.values(this.componentStore))e.push(...r.getDrawableElements());return e}}});var K6,oye=N(()=>{"use strict";sye();K6=class{static{o(this,"XYChartBuilder")}static build(e,r,n,i){return new j6(e,r,n,i).getDrawableElement()}}});function cye(){let t=mh(),e=Qt();return Vn(t.xyChart,e.themeVariables.xyChart)}function uye(){let t=Qt();return Vn(ur.xyChart,t.xyChart)}function hye(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function KF(t){let e=Qt();return sr(t.trim(),e)}function kZe(t){lye=t}function EZe(t){t==="horizontal"?v4.chartOrientation="horizontal":v4.chartOrientation="vertical"}function SZe(t){pn.xAxis.title=KF(t.text)}function fye(t,e){pn.xAxis={type:"linear",title:pn.xAxis.title,min:t,max:e},Q6=!0}function CZe(t){pn.xAxis={type:"band",title:pn.xAxis.title,categories:t.map(e=>KF(e.text))},Q6=!0}function AZe(t){pn.yAxis.title=KF(t.text)}function _Ze(t,e){pn.yAxis={type:"linear",title:pn.yAxis.title,min:t,max:e},jF=!0}function DZe(t){let e=Math.min(...t),r=Math.max(...t),n=ry(pn.yAxis)?pn.yAxis.min:1/0,i=ry(pn.yAxis)?pn.yAxis.max:-1/0;pn.yAxis={type:"linear",title:pn.yAxis.title,min:Math.min(n,e),max:Math.max(i,r)}}function dye(t){let e=[];if(t.length===0)return e;if(!Q6){let r=ry(pn.xAxis)?pn.xAxis.min:1/0,n=ry(pn.xAxis)?pn.xAxis.max:-1/0;fye(Math.min(r,1),Math.max(n,t.length))}if(jF||DZe(t),U6(pn.xAxis)&&(e=pn.xAxis.categories.map((r,n)=>[r,t[n]])),ry(pn.xAxis)){let r=pn.xAxis.min,n=pn.xAxis.max,i=(n-r)/(t.length-1),a=[];for(let s=r;s<=n;s+=i)a.push(`${s}`);e=a.map((s,l)=>[s,t[l]])}return e}function pye(t){return XF[t===0?0:t%XF.length]}function LZe(t,e){let r=dye(e);pn.plots.push({type:"line",strokeFill:pye(y4),strokeWidth:2,data:r}),y4++}function RZe(t,e){let r=dye(e);pn.plots.push({type:"bar",fill:pye(y4),data:r}),y4++}function NZe(){if(pn.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return pn.title=Pr(),K6.build(v4,pn,x4,lye)}function MZe(){return x4}function IZe(){return v4}function OZe(){return pn}var y4,lye,v4,x4,pn,XF,Q6,jF,PZe,mye,gye=N(()=>{"use strict";qn();La();Oy();tr();gr();ci();oye();H6();y4=0,v4=uye(),x4=cye(),pn=hye(),XF=x4.plotColorPalette.split(",").map(t=>t.trim()),Q6=!1,jF=!1;o(cye,"getChartDefaultThemeConfig");o(uye,"getChartDefaultConfig");o(hye,"getChartDefaultData");o(KF,"textSanitizer");o(kZe,"setTmpSVGG");o(EZe,"setOrientation");o(SZe,"setXAxisTitle");o(fye,"setXAxisRangeData");o(CZe,"setXAxisBand");o(AZe,"setYAxisTitle");o(_Ze,"setYAxisRangeData");o(DZe,"setYAxisRangeFromPlotData");o(dye,"transformDataWithoutCategory");o(pye,"getPlotColorFromPalette");o(LZe,"setLineData");o(RZe,"setBarData");o(NZe,"getDrawableElem");o(MZe,"getChartThemeConfig");o(IZe,"getChartConfig");o(OZe,"getXYChartData");PZe=o(function(){Sr(),y4=0,v4=uye(),pn=hye(),x4=cye(),XF=x4.plotColorPalette.split(",").map(t=>t.trim()),Q6=!1,jF=!1},"clear"),mye={getDrawableElem:NZe,clear:PZe,setAccTitle:Rr,getAccTitle:Mr,setDiagramTitle:$r,getDiagramTitle:Pr,getAccDescription:Or,setAccDescription:Ir,setOrientation:EZe,setXAxisTitle:SZe,setXAxisRangeData:fye,setXAxisBand:CZe,setYAxisTitle:AZe,setYAxisRangeData:_Ze,setLineData:LZe,setBarData:RZe,setTmpSVGG:kZe,getChartThemeConfig:MZe,getChartConfig:IZe,getXYChartData:OZe}});var BZe,yye,vye=N(()=>{"use strict";pt();tu();Ei();BZe=o((t,e,r,n)=>{let i=n.db,a=i.getChartThemeConfig(),s=i.getChartConfig(),l=i.getXYChartData().plots[0].data.map(T=>T[1]);function u(T){return T==="top"?"text-before-edge":"middle"}o(u,"getDominantBaseLine");function h(T){return T==="left"?"start":T==="right"?"end":"middle"}o(h,"getTextAnchor");function f(T){return`translate(${T.x}, ${T.y}) rotate(${T.rotation||0})`}o(f,"getTextTransformation"),X.debug(`Rendering xychart chart +`+t);let d=aa(e),p=d.append("g").attr("class","main"),m=p.append("rect").attr("width",s.width).attr("height",s.height).attr("class","background");mn(d,s.height,s.width,!0),d.attr("viewBox",`0 0 ${s.width} ${s.height}`),m.attr("fill",a.backgroundColor),i.setTmpSVGG(d.append("g").attr("class","mermaid-tmp-group"));let g=i.getDrawableElem(),y={};function v(T){let S=p,w="";for(let[k]of T.entries()){let A=p;k>0&&y[w]&&(A=y[w]),w+=T[k],S=y[w],S||(S=y[w]=A.append("g").attr("class",T[k]))}return S}o(v,"getGroup");for(let T of g){if(T.data.length===0)continue;let S=v(T.groupTexts);switch(T.type){case"rect":if(S.selectAll("rect").data(T.data).enter().append("rect").attr("x",w=>w.x).attr("y",w=>w.y).attr("width",w=>w.width).attr("height",w=>w.height).attr("fill",w=>w.fill).attr("stroke",w=>w.strokeFill).attr("stroke-width",w=>w.strokeWidth),s.showDataLabel)if(s.chartOrientation==="horizontal"){let A=function(I,L){let{data:E,label:D}=I;return L*D.length*.7<=E.width-10};var x=A;o(A,"fitsHorizontally");let w=.7,k=T.data.map((I,L)=>({data:I,label:l[L].toString()})).filter(I=>I.data.width>0&&I.data.height>0),C=k.map(I=>{let{data:L}=I,E=L.height*.7;for(;!A(I,E)&&E>0;)E-=1;return E}),R=Math.floor(Math.min(...C));S.selectAll("text").data(k).enter().append("text").attr("x",I=>I.data.x+I.data.width-10).attr("y",I=>I.data.y+I.data.height/2).attr("text-anchor","end").attr("dominant-baseline","middle").attr("fill","black").attr("font-size",`${R}px`).text(I=>I.label)}else{let A=function(I,L,E){let{data:D,label:_}=I,M=L*_.length*.7,P=D.x+D.width/2,B=P-M/2,F=P+M/2,G=B>=D.x&&F<=D.x+D.width,$=D.y+E+L<=D.y+D.height;return G&&$};var b=A;o(A,"fitsInBar");let w=10,k=T.data.map((I,L)=>({data:I,label:l[L].toString()})).filter(I=>I.data.width>0&&I.data.height>0),C=k.map(I=>{let{data:L,label:E}=I,D=L.width/(E.length*.7);for(;!A(I,D,10)&&D>0;)D-=1;return D}),R=Math.floor(Math.min(...C));S.selectAll("text").data(k).enter().append("text").attr("x",I=>I.data.x+I.data.width/2).attr("y",I=>I.data.y+10).attr("text-anchor","middle").attr("dominant-baseline","hanging").attr("fill","black").attr("font-size",`${R}px`).text(I=>I.label)}break;case"text":S.selectAll("text").data(T.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",w=>w.fill).attr("font-size",w=>w.fontSize).attr("dominant-baseline",w=>u(w.verticalPos)).attr("text-anchor",w=>h(w.horizontalPos)).attr("transform",w=>f(w)).text(w=>w.text);break;case"path":S.selectAll("path").data(T.data).enter().append("path").attr("d",w=>w.path).attr("fill",w=>w.fill?w.fill:"none").attr("stroke",w=>w.strokeFill).attr("stroke-width",w=>w.strokeWidth);break}}},"draw"),yye={draw:BZe}});var xye={};dr(xye,{diagram:()=>FZe});var FZe,bye=N(()=>{"use strict";K1e();gye();vye();FZe={parser:j1e,db:mye,renderer:yye}});var QF,kye,Eye=N(()=>{"use strict";QF=(function(){var t=o(function(fe,xe,W,he){for(W=W||{},he=fe.length;he--;W[fe[he]]=xe);return W},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],s=[1,22],l=[2,7],u=[1,26],h=[1,27],f=[1,28],d=[1,29],p=[1,33],m=[1,34],g=[1,35],y=[1,36],v=[1,37],x=[1,38],b=[1,24],T=[1,31],S=[1,32],w=[1,30],k=[1,39],A=[1,40],C=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],R=[1,61],I=[89,90],L=[5,8,9,11,13,21,22,23,24,27,29,41,42,43,44,45,46,54,61,63,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],E=[27,29],D=[1,70],_=[1,71],O=[1,72],M=[1,73],P=[1,74],B=[1,75],F=[1,76],G=[1,83],$=[1,80],U=[1,84],j=[1,85],te=[1,86],Y=[1,87],oe=[1,88],J=[1,89],ue=[1,90],re=[1,91],ee=[1,92],Z=[5,8,9,11,13,21,22,23,24,27,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],K=[63,64],ae=[1,101],Q=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],de=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],ne=[1,110],Te=[1,106],q=[1,107],Ve=[1,108],pe=[1,109],Be=[1,111],Ye=[1,116],He=[1,117],Le=[1,114],Ie=[1,115],Ne={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,direction:17,styleStatement:18,classDefStatement:19,classStatement:20,direction_tb:21,direction_bt:22,direction_rl:23,direction_lr:24,requirementType:25,requirementName:26,STRUCT_START:27,requirementBody:28,STYLE_SEPARATOR:29,idList:30,ID:31,COLONSEP:32,id:33,TEXT:34,text:35,RISK:36,riskLevel:37,VERIFYMTHD:38,verifyType:39,STRUCT_STOP:40,REQUIREMENT:41,FUNCTIONAL_REQUIREMENT:42,INTERFACE_REQUIREMENT:43,PERFORMANCE_REQUIREMENT:44,PHYSICAL_REQUIREMENT:45,DESIGN_CONSTRAINT:46,LOW_RISK:47,MED_RISK:48,HIGH_RISK:49,VERIFY_ANALYSIS:50,VERIFY_DEMONSTRATION:51,VERIFY_INSPECTION:52,VERIFY_TEST:53,ELEMENT:54,elementName:55,elementBody:56,TYPE:57,type:58,DOCREF:59,ref:60,END_ARROW_L:61,relationship:62,LINE:63,END_ARROW_R:64,CONTAINS:65,COPIES:66,DERIVES:67,SATISFIES:68,VERIFIES:69,REFINES:70,TRACES:71,CLASSDEF:72,stylesOpt:73,CLASS:74,ALPHA:75,COMMA:76,STYLE:77,style:78,styleComponent:79,NUM:80,COLON:81,UNIT:82,SPACE:83,BRKT:84,PCT:85,MINUS:86,LABEL:87,SEMICOLON:88,unqString:89,qString:90,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",21:"direction_tb",22:"direction_bt",23:"direction_rl",24:"direction_lr",27:"STRUCT_START",29:"STYLE_SEPARATOR",31:"ID",32:"COLONSEP",34:"TEXT",36:"RISK",38:"VERIFYMTHD",40:"STRUCT_STOP",41:"REQUIREMENT",42:"FUNCTIONAL_REQUIREMENT",43:"INTERFACE_REQUIREMENT",44:"PERFORMANCE_REQUIREMENT",45:"PHYSICAL_REQUIREMENT",46:"DESIGN_CONSTRAINT",47:"LOW_RISK",48:"MED_RISK",49:"HIGH_RISK",50:"VERIFY_ANALYSIS",51:"VERIFY_DEMONSTRATION",52:"VERIFY_INSPECTION",53:"VERIFY_TEST",54:"ELEMENT",57:"TYPE",59:"DOCREF",61:"END_ARROW_L",63:"LINE",64:"END_ARROW_R",65:"CONTAINS",66:"COPIES",67:"DERIVES",68:"SATISFIES",69:"VERIFIES",70:"REFINES",71:"TRACES",72:"CLASSDEF",74:"CLASS",75:"ALPHA",76:"COMMA",77:"STYLE",80:"NUM",81:"COLON",82:"UNIT",83:"SPACE",84:"BRKT",85:"PCT",86:"MINUS",87:"LABEL",88:"SEMICOLON",89:"unqString",90:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[17,1],[17,1],[17,1],[17,1],[14,5],[14,7],[28,5],[28,5],[28,5],[28,5],[28,2],[28,1],[25,1],[25,1],[25,1],[25,1],[25,1],[25,1],[37,1],[37,1],[37,1],[39,1],[39,1],[39,1],[39,1],[15,5],[15,7],[56,5],[56,5],[56,2],[56,1],[16,5],[16,5],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[19,3],[20,3],[20,3],[30,1],[30,3],[30,1],[30,3],[18,3],[73,1],[73,3],[78,1],[78,2],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[26,1],[26,1],[33,1],[33,1],[35,1],[35,1],[55,1],[55,1],[58,1],[58,1],[60,1],[60,1]],performAction:o(function(xe,W,he,z,se,le,ke){var ve=le.length-1;switch(se){case 4:this.$=le[ve].trim(),z.setAccTitle(this.$);break;case 5:case 6:this.$=le[ve].trim(),z.setAccDescription(this.$);break;case 7:this.$=[];break;case 17:z.setDirection("TB");break;case 18:z.setDirection("BT");break;case 19:z.setDirection("RL");break;case 20:z.setDirection("LR");break;case 21:z.addRequirement(le[ve-3],le[ve-4]);break;case 22:z.addRequirement(le[ve-5],le[ve-6]),z.setClass([le[ve-5]],le[ve-3]);break;case 23:z.setNewReqId(le[ve-2]);break;case 24:z.setNewReqText(le[ve-2]);break;case 25:z.setNewReqRisk(le[ve-2]);break;case 26:z.setNewReqVerifyMethod(le[ve-2]);break;case 29:this.$=z.RequirementType.REQUIREMENT;break;case 30:this.$=z.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 31:this.$=z.RequirementType.INTERFACE_REQUIREMENT;break;case 32:this.$=z.RequirementType.PERFORMANCE_REQUIREMENT;break;case 33:this.$=z.RequirementType.PHYSICAL_REQUIREMENT;break;case 34:this.$=z.RequirementType.DESIGN_CONSTRAINT;break;case 35:this.$=z.RiskLevel.LOW_RISK;break;case 36:this.$=z.RiskLevel.MED_RISK;break;case 37:this.$=z.RiskLevel.HIGH_RISK;break;case 38:this.$=z.VerifyType.VERIFY_ANALYSIS;break;case 39:this.$=z.VerifyType.VERIFY_DEMONSTRATION;break;case 40:this.$=z.VerifyType.VERIFY_INSPECTION;break;case 41:this.$=z.VerifyType.VERIFY_TEST;break;case 42:z.addElement(le[ve-3]);break;case 43:z.addElement(le[ve-5]),z.setClass([le[ve-5]],le[ve-3]);break;case 44:z.setNewElementType(le[ve-2]);break;case 45:z.setNewElementDocRef(le[ve-2]);break;case 48:z.addRelationship(le[ve-2],le[ve],le[ve-4]);break;case 49:z.addRelationship(le[ve-2],le[ve-4],le[ve]);break;case 50:this.$=z.Relationships.CONTAINS;break;case 51:this.$=z.Relationships.COPIES;break;case 52:this.$=z.Relationships.DERIVES;break;case 53:this.$=z.Relationships.SATISFIES;break;case 54:this.$=z.Relationships.VERIFIES;break;case 55:this.$=z.Relationships.REFINES;break;case 56:this.$=z.Relationships.TRACES;break;case 57:this.$=le[ve-2],z.defineClass(le[ve-1],le[ve]);break;case 58:z.setClass(le[ve-1],le[ve]);break;case 59:z.setClass([le[ve-2]],le[ve]);break;case 60:case 62:this.$=[le[ve]];break;case 61:case 63:this.$=le[ve-2].concat([le[ve]]);break;case 64:this.$=le[ve-2],z.setCssStyle(le[ve-1],le[ve]);break;case 65:this.$=[le[ve]];break;case 66:le[ve-2].push(le[ve]),this.$=le[ve-2];break;case 68:this.$=le[ve-1]+le[ve];break}},"anonymous"),table:[{3:1,4:2,6:e,9:r,11:n,13:i},{1:[3]},{3:8,4:2,5:[1,7],6:e,9:r,11:n,13:i},{5:[1,9]},{10:[1,10]},{12:[1,11]},t(a,[2,6]),{3:12,4:2,6:e,9:r,11:n,13:i},{1:[2,2]},{4:17,5:s,7:13,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},t(a,[2,4]),t(a,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:s,7:42,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:43,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:44,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:45,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:46,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:47,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:48,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:49,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:50,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{26:51,89:[1,52],90:[1,53]},{55:54,89:[1,55],90:[1,56]},{29:[1,59],61:[1,57],63:[1,58]},t(C,[2,17]),t(C,[2,18]),t(C,[2,19]),t(C,[2,20]),{30:60,33:62,75:R,89:k,90:A},{30:63,33:62,75:R,89:k,90:A},{30:64,33:62,75:R,89:k,90:A},t(I,[2,29]),t(I,[2,30]),t(I,[2,31]),t(I,[2,32]),t(I,[2,33]),t(I,[2,34]),t(L,[2,81]),t(L,[2,82]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{8:[2,13]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{27:[1,65],29:[1,66]},t(E,[2,79]),t(E,[2,80]),{27:[1,67],29:[1,68]},t(E,[2,85]),t(E,[2,86]),{62:69,65:D,66:_,67:O,68:M,69:P,70:B,71:F},{62:77,65:D,66:_,67:O,68:M,69:P,70:B,71:F},{30:78,33:62,75:R,89:k,90:A},{73:79,75:G,76:$,78:81,79:82,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee},t(Z,[2,60]),t(Z,[2,62]),{73:93,75:G,76:$,78:81,79:82,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee},{30:94,33:62,75:R,76:$,89:k,90:A},{5:[1,95]},{30:96,33:62,75:R,89:k,90:A},{5:[1,97]},{30:98,33:62,75:R,89:k,90:A},{63:[1,99]},t(K,[2,50]),t(K,[2,51]),t(K,[2,52]),t(K,[2,53]),t(K,[2,54]),t(K,[2,55]),t(K,[2,56]),{64:[1,100]},t(C,[2,59],{76:$}),t(C,[2,64],{76:ae}),{33:103,75:[1,102],89:k,90:A},t(Q,[2,65],{79:104,75:G,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee}),t(de,[2,67]),t(de,[2,69]),t(de,[2,70]),t(de,[2,71]),t(de,[2,72]),t(de,[2,73]),t(de,[2,74]),t(de,[2,75]),t(de,[2,76]),t(de,[2,77]),t(de,[2,78]),t(C,[2,57],{76:ae}),t(C,[2,58],{76:$}),{5:ne,28:105,31:Te,34:q,36:Ve,38:pe,40:Be},{27:[1,112],76:$},{5:Ye,40:He,56:113,57:Le,59:Ie},{27:[1,118],76:$},{33:119,89:k,90:A},{33:120,89:k,90:A},{75:G,78:121,79:82,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee},t(Z,[2,61]),t(Z,[2,63]),t(de,[2,68]),t(C,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:ne,28:126,31:Te,34:q,36:Ve,38:pe,40:Be},t(C,[2,28]),{5:[1,127]},t(C,[2,42]),{32:[1,128]},{32:[1,129]},{5:Ye,40:He,56:130,57:Le,59:Ie},t(C,[2,47]),{5:[1,131]},t(C,[2,48]),t(C,[2,49]),t(Q,[2,66],{79:104,75:G,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee}),{33:132,89:k,90:A},{35:133,89:[1,134],90:[1,135]},{37:136,47:[1,137],48:[1,138],49:[1,139]},{39:140,50:[1,141],51:[1,142],52:[1,143],53:[1,144]},t(C,[2,27]),{5:ne,28:145,31:Te,34:q,36:Ve,38:pe,40:Be},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},t(C,[2,46]),{5:Ye,40:He,56:152,57:Le,59:Ie},{5:[1,153]},{5:[1,154]},{5:[2,83]},{5:[2,84]},{5:[1,155]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[1,156]},{5:[2,38]},{5:[2,39]},{5:[2,40]},{5:[2,41]},t(C,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},t(C,[2,43]),{5:ne,28:159,31:Te,34:q,36:Ve,38:pe,40:Be},{5:ne,28:160,31:Te,34:q,36:Ve,38:pe,40:Be},{5:ne,28:161,31:Te,34:q,36:Ve,38:pe,40:Be},{5:ne,28:162,31:Te,34:q,36:Ve,38:pe,40:Be},{5:Ye,40:He,56:163,57:Le,59:Ie},{5:Ye,40:He,56:164,57:Le,59:Ie},t(C,[2,23]),t(C,[2,24]),t(C,[2,25]),t(C,[2,26]),t(C,[2,44]),t(C,[2,45])],defaultActions:{8:[2,2],12:[2,1],41:[2,3],42:[2,8],43:[2,9],44:[2,10],45:[2,11],46:[2,12],47:[2,13],48:[2,14],49:[2,15],50:[2,16],134:[2,83],135:[2,84],137:[2,35],138:[2,36],139:[2,37],141:[2,38],142:[2,39],143:[2,40],144:[2,41],147:[2,87],148:[2,88],150:[2,89],151:[2,90]},parseError:o(function(xe,W){if(W.recoverable)this.trace(xe);else{var he=new Error(xe);throw he.hash=W,he}},"parseError"),parse:o(function(xe){var W=this,he=[0],z=[],se=[null],le=[],ke=this.table,ve="",ye=0,Re=0,_e=0,ze=2,Ke=1,xt=le.slice.call(arguments,1),We=Object.create(this.lexer),Oe={yy:{}};for(var et in this.yy)Object.prototype.hasOwnProperty.call(this.yy,et)&&(Oe.yy[et]=this.yy[et]);We.setInput(xe,Oe.yy),Oe.yy.lexer=We,Oe.yy.parser=this,typeof We.yylloc>"u"&&(We.yylloc={});var Ue=We.yylloc;le.push(Ue);var lt=We.options&&We.options.ranges;typeof Oe.yy.parseError=="function"?this.parseError=Oe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Gt(ar){he.length=he.length-2*ar,se.length=se.length-ar,le.length=le.length-ar}o(Gt,"popStack");function vt(){var ar;return ar=z.pop()||We.lex()||Ke,typeof ar!="number"&&(ar instanceof Array&&(z=ar,ar=z.pop()),ar=W.symbols_[ar]||ar),ar}o(vt,"lex");for(var Lt,dt,nt,bt,wt,yt,ft={},Ur,_t,bn,Br;;){if(nt=he[he.length-1],this.defaultActions[nt]?bt=this.defaultActions[nt]:((Lt===null||typeof Lt>"u")&&(Lt=vt()),bt=ke[nt]&&ke[nt][Lt]),typeof bt>"u"||!bt.length||!bt[0]){var cr="";Br=[];for(Ur in ke[nt])this.terminals_[Ur]&&Ur>ze&&Br.push("'"+this.terminals_[Ur]+"'");We.showPosition?cr="Parse error on line "+(ye+1)+`: +`+We.showPosition()+` +Expecting `+Br.join(", ")+", got '"+(this.terminals_[Lt]||Lt)+"'":cr="Parse error on line "+(ye+1)+": Unexpected "+(Lt==Ke?"end of input":"'"+(this.terminals_[Lt]||Lt)+"'"),this.parseError(cr,{text:We.match,token:this.terminals_[Lt]||Lt,line:We.yylineno,loc:Ue,expected:Br})}if(bt[0]instanceof Array&&bt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+nt+", token: "+Lt);switch(bt[0]){case 1:he.push(Lt),se.push(We.yytext),le.push(We.yylloc),he.push(bt[1]),Lt=null,dt?(Lt=dt,dt=null):(Re=We.yyleng,ve=We.yytext,ye=We.yylineno,Ue=We.yylloc,_e>0&&_e--);break;case 2:if(_t=this.productions_[bt[1]][1],ft.$=se[se.length-_t],ft._$={first_line:le[le.length-(_t||1)].first_line,last_line:le[le.length-1].last_line,first_column:le[le.length-(_t||1)].first_column,last_column:le[le.length-1].last_column},lt&&(ft._$.range=[le[le.length-(_t||1)].range[0],le[le.length-1].range[1]]),yt=this.performAction.apply(ft,[ve,Re,ye,Oe.yy,bt[1],se,le].concat(xt)),typeof yt<"u")return yt;_t&&(he=he.slice(0,-1*_t*2),se=se.slice(0,-1*_t),le=le.slice(0,-1*_t)),he.push(this.productions_[bt[1]][0]),se.push(ft.$),le.push(ft._$),bn=ke[he[he.length-2]][he[he.length-1]],he.push(bn);break;case 3:return!0}}return!0},"parse")},Ce=(function(){var fe={EOF:1,parseError:o(function(W,he){if(this.yy.parser)this.yy.parser.parseError(W,he);else throw new Error(W)},"parseError"),setInput:o(function(xe,W){return this.yy=W||this.yy||{},this._input=xe,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var xe=this._input[0];this.yytext+=xe,this.yyleng++,this.offset++,this.match+=xe,this.matched+=xe;var W=xe.match(/(?:\r\n?|\n).*/g);return W?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),xe},"input"),unput:o(function(xe){var W=xe.length,he=xe.split(/(?:\r\n?|\n)/g);this._input=xe+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-W),this.offset-=W;var z=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),he.length-1&&(this.yylineno-=he.length-1);var se=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:he?(he.length===z.length?this.yylloc.first_column:0)+z[z.length-he.length].length-he[0].length:this.yylloc.first_column-W},this.options.ranges&&(this.yylloc.range=[se[0],se[0]+this.yyleng-W]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(xe){this.unput(this.match.slice(xe))},"less"),pastInput:o(function(){var xe=this.matched.substr(0,this.matched.length-this.match.length);return(xe.length>20?"...":"")+xe.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var xe=this.match;return xe.length<20&&(xe+=this._input.substr(0,20-xe.length)),(xe.substr(0,20)+(xe.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var xe=this.pastInput(),W=new Array(xe.length+1).join("-");return xe+this.upcomingInput()+` +`+W+"^"},"showPosition"),test_match:o(function(xe,W){var he,z,se;if(this.options.backtrack_lexer&&(se={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(se.yylloc.range=this.yylloc.range.slice(0))),z=xe[0].match(/(?:\r\n?|\n).*/g),z&&(this.yylineno+=z.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:z?z[z.length-1].length-z[z.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+xe[0].length},this.yytext+=xe[0],this.match+=xe[0],this.matches=xe,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(xe[0].length),this.matched+=xe[0],he=this.performAction.call(this,this.yy,this,W,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),he)return he;if(this._backtrack){for(var le in se)this[le]=se[le];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var xe,W,he,z;this._more||(this.yytext="",this.match="");for(var se=this._currentRules(),le=0;leW[0].length)){if(W=he,z=le,this.options.backtrack_lexer){if(xe=this.test_match(he,se[le]),xe!==!1)return xe;if(this._backtrack){W=!1;continue}else return!1}else if(!this.options.flex)break}return W?(xe=this.test_match(W,se[z]),xe!==!1?xe:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var W=this.next();return W||this.lex()},"lex"),begin:o(function(W){this.conditionStack.push(W)},"begin"),popState:o(function(){var W=this.conditionStack.length-1;return W>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(W){return W=this.conditionStack.length-1-Math.abs(W||0),W>=0?this.conditionStack[W]:"INITIAL"},"topState"),pushState:o(function(W){this.begin(W)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(W,he,z,se){var le=se;switch(z){case 0:return"title";case 1:return this.begin("acc_title"),9;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),11;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 21;case 9:return 22;case 10:return 23;case 11:return 24;case 12:return 5;case 13:break;case 14:break;case 15:break;case 16:return 8;case 17:return 6;case 18:return 27;case 19:return 40;case 20:return 29;case 21:return 32;case 22:return 31;case 23:return 34;case 24:return 36;case 25:return 38;case 26:return 41;case 27:return 42;case 28:return 43;case 29:return 44;case 30:return 45;case 31:return 46;case 32:return 47;case 33:return 48;case 34:return 49;case 35:return 50;case 36:return 51;case 37:return 52;case 38:return 53;case 39:return 54;case 40:return 65;case 41:return 66;case 42:return 67;case 43:return 68;case 44:return 69;case 45:return 70;case 46:return 71;case 47:return 57;case 48:return 59;case 49:return this.begin("style"),77;break;case 50:return 75;case 51:return 81;case 52:return 88;case 53:return"PERCENT";case 54:return 86;case 55:return 84;case 56:break;case 57:this.begin("string");break;case 58:this.popState();break;case 59:return this.begin("style"),72;break;case 60:return this.begin("style"),74;break;case 61:return 61;case 62:return 64;case 63:return 63;case 64:this.begin("string");break;case 65:this.popState();break;case 66:return"qString";case 67:return he.yytext=he.yytext.trim(),89;break;case 68:return 75;case 69:return 80;case 70:return 76}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::{3})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:style\b)/i,/^(?:\w+)/i,/^(?::)/i,/^(?:;)/i,/^(?:%)/i,/^(?:-)/i,/^(?:#)/i,/^(?: )/i,/^(?:["])/i,/^(?:\n)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^:,\r\n\{\<\>\-\=]*)/i,/^(?:\w+)/i,/^(?:[0-9]+)/i,/^(?:,)/i],conditions:{acc_descr_multiline:{rules:[6,7,68,69,70],inclusive:!1},acc_descr:{rules:[4,68,69,70],inclusive:!1},acc_title:{rules:[2,68,69,70],inclusive:!1},style:{rules:[50,51,52,53,54,55,56,57,58,68,69,70],inclusive:!1},unqString:{rules:[68,69,70],inclusive:!1},token:{rules:[68,69,70],inclusive:!1},string:{rules:[65,66,68,69,70],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,59,60,61,62,63,64,67,68,69,70],inclusive:!0}}};return fe})();Ne.lexer=Ce;function Fe(){this.yy={}}return o(Fe,"Parser"),Fe.prototype=Ne,Ne.Parser=Fe,new Fe})();QF.parser=QF;kye=QF});var Z6,Sye=N(()=>{"use strict";Xt();pt();ci();Z6=class{constructor(){this.relations=[];this.latestRequirement=this.getInitialRequirement();this.requirements=new Map;this.latestElement=this.getInitialElement();this.elements=new Map;this.classes=new Map;this.direction="TB";this.RequirementType={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"};this.RiskLevel={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"};this.VerifyType={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"};this.Relationships={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"};this.setAccTitle=Rr;this.getAccTitle=Mr;this.setAccDescription=Ir;this.getAccDescription=Or;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getConfig=o(()=>ge().requirement,"getConfig");this.clear(),this.setDirection=this.setDirection.bind(this),this.addRequirement=this.addRequirement.bind(this),this.setNewReqId=this.setNewReqId.bind(this),this.setNewReqRisk=this.setNewReqRisk.bind(this),this.setNewReqText=this.setNewReqText.bind(this),this.setNewReqVerifyMethod=this.setNewReqVerifyMethod.bind(this),this.addElement=this.addElement.bind(this),this.setNewElementType=this.setNewElementType.bind(this),this.setNewElementDocRef=this.setNewElementDocRef.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setCssStyle=this.setCssStyle.bind(this),this.setClass=this.setClass.bind(this),this.defineClass=this.defineClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"RequirementDB")}getDirection(){return this.direction}setDirection(e){this.direction=e}resetLatestRequirement(){this.latestRequirement=this.getInitialRequirement()}resetLatestElement(){this.latestElement=this.getInitialElement()}getInitialRequirement(){return{requirementId:"",text:"",risk:"",verifyMethod:"",name:"",type:"",cssStyles:[],classes:["default"]}}getInitialElement(){return{name:"",type:"",docRef:"",cssStyles:[],classes:["default"]}}addRequirement(e,r){return this.requirements.has(e)||this.requirements.set(e,{name:e,type:r,requirementId:this.latestRequirement.requirementId,text:this.latestRequirement.text,risk:this.latestRequirement.risk,verifyMethod:this.latestRequirement.verifyMethod,cssStyles:[],classes:["default"]}),this.resetLatestRequirement(),this.requirements.get(e)}getRequirements(){return this.requirements}setNewReqId(e){this.latestRequirement!==void 0&&(this.latestRequirement.requirementId=e)}setNewReqText(e){this.latestRequirement!==void 0&&(this.latestRequirement.text=e)}setNewReqRisk(e){this.latestRequirement!==void 0&&(this.latestRequirement.risk=e)}setNewReqVerifyMethod(e){this.latestRequirement!==void 0&&(this.latestRequirement.verifyMethod=e)}addElement(e){return this.elements.has(e)||(this.elements.set(e,{name:e,type:this.latestElement.type,docRef:this.latestElement.docRef,cssStyles:[],classes:["default"]}),X.info("Added new element: ",e)),this.resetLatestElement(),this.elements.get(e)}getElements(){return this.elements}setNewElementType(e){this.latestElement!==void 0&&(this.latestElement.type=e)}setNewElementDocRef(e){this.latestElement!==void 0&&(this.latestElement.docRef=e)}addRelationship(e,r,n){this.relations.push({type:e,src:r,dst:n})}getRelationships(){return this.relations}clear(){this.relations=[],this.resetLatestRequirement(),this.requirements=new Map,this.resetLatestElement(),this.elements=new Map,this.classes=new Map,Sr()}setCssStyle(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(!r||!i)return;for(let a of r)a.includes(",")?i.cssStyles.push(...a.split(",")):i.cssStyles.push(a)}}setClass(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(i)for(let a of r){i.classes.push(a);let s=this.classes.get(a)?.styles;s&&i.cssStyles.push(...s)}}}defineClass(e,r){for(let n of e){let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.requirements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))}),this.elements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))})}}getClasses(){return this.classes}getData(){let e=ge(),r=[],n=[];for(let i of this.requirements.values()){let a=i;a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),a.shape="requirementBox",a.look=e.look,r.push(a)}for(let i of this.elements.values()){let a=i;a.shape="requirementBox",a.look=e.look,a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),r.push(a)}for(let i of this.relations){let a=0,s=i.type===this.Relationships.CONTAINS,l={id:`${i.src}-${i.dst}-${a}`,start:this.requirements.get(i.src)?.name??this.elements.get(i.src)?.name,end:this.requirements.get(i.dst)?.name??this.elements.get(i.dst)?.name,label:`<<${i.type}>>`,classes:"relationshipLine",style:["fill:none",s?"":"stroke-dasharray: 10,7"],labelpos:"c",thickness:"normal",type:"normal",pattern:s?"normal":"dashed",arrowTypeStart:s?"requirement_contains":"",arrowTypeEnd:s?"":"requirement_arrow",look:e.look};n.push(l),a++}return{nodes:r,edges:n,other:{},config:e,direction:this.getDirection()}}}});var VZe,Cye,Aye=N(()=>{"use strict";VZe=o(t=>` + + marker { + fill: ${t.relationColor}; + stroke: ${t.relationColor}; + } + + marker.cross { + stroke: ${t.lineColor}; + } + + svg { + font-family: ${t.fontFamily}; + font-size: ${t.fontSize}; + } + + .reqBox { + fill: ${t.requirementBackground}; + fill-opacity: 1.0; + stroke: ${t.requirementBorderColor}; + stroke-width: ${t.requirementBorderSize}; + } + + .reqTitle, .reqLabel{ + fill: ${t.requirementTextColor}; + } + .reqLabelBox { + fill: ${t.relationLabelBackground}; + fill-opacity: 1.0; + } + + .req-title-line { + stroke: ${t.requirementBorderColor}; + stroke-width: ${t.requirementBorderSize}; + } + .relationshipLine { + stroke: ${t.relationColor}; + stroke-width: 1; + } + .relationshipLabel { + fill: ${t.relationLabelColor}; + } + .divider { + stroke: ${t.nodeBorder}; + stroke-width: 1; + } + .label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .label text,span { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + .labelBkg { + background-color: ${t.edgeLabelBackground}; + } + +`,"getStyles"),Cye=VZe});var ZF={};dr(ZF,{draw:()=>UZe});var UZe,_ye=N(()=>{"use strict";Xt();pt();ep();Nf();Mf();tr();UZe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing requirement diagram (unified)",e);let{securityLevel:i,state:a,layout:s}=ge(),l=n.db.getData(),u=Vo(e,i);l.type=n.type,l.layoutAlgorithm=$c(s),l.nodeSpacing=a?.nodeSpacing??50,l.rankSpacing=a?.rankSpacing??50,l.markers=["requirement_contains","requirement_arrow"],l.diagramId=e,await Qo(l,u);let h=8;qt.insertTitle(u,"requirementDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ws(u,h,"requirementDiagram",a?.useMaxWidth??!0)},"draw")});var Dye={};dr(Dye,{diagram:()=>HZe});var HZe,Lye=N(()=>{"use strict";Eye();Sye();Aye();_ye();HZe={parser:kye,get db(){return new Z6},renderer:ZF,styles:Cye}});var JF,Mye,Iye=N(()=>{"use strict";JF=(function(){var t=o(function(ee,Z,K,ae){for(K=K||{},ae=ee.length;ae--;K[ee[ae]]=Z);return K},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,13],u=[1,14],h=[1,16],f=[1,17],d=[1,18],p=[1,24],m=[1,25],g=[1,26],y=[1,27],v=[1,28],x=[1,29],b=[1,30],T=[1,31],S=[1,32],w=[1,33],k=[1,34],A=[1,35],C=[1,36],R=[1,37],I=[1,38],L=[1,39],E=[1,41],D=[1,42],_=[1,43],O=[1,44],M=[1,45],P=[1,46],B=[1,4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,48,49,50,52,53,55,60,61,62,63,71],F=[2,71],G=[4,5,16,50,52,53],$=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,55,60,61,62,63,71],U=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,49,50,52,53,55,60,61,62,63,71],j=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,48,50,52,53,55,60,61,62,63,71],te=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,50,52,53,55,60,61,62,63,71],Y=[69,70,71],oe=[1,127],J={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,box_section:10,box_line:11,participant_statement:12,create:13,box:14,restOfLine:15,end:16,signal:17,autonumber:18,NUM:19,off:20,activate:21,actor:22,deactivate:23,note_statement:24,links_statement:25,link_statement:26,properties_statement:27,details_statement:28,title:29,legacy_title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,loop:36,rect:37,opt:38,alt:39,else_sections:40,par:41,par_sections:42,par_over:43,critical:44,option_sections:45,break:46,option:47,and:48,else:49,participant:50,AS:51,participant_actor:52,destroy:53,actor_with_config:54,note:55,placement:56,text2:57,over:58,actor_pair:59,links:60,link:61,properties:62,details:63,spaceList:64,",":65,left_of:66,right_of:67,signaltype:68,"+":69,"-":70,ACTOR:71,config_object:72,CONFIG_START:73,CONFIG_CONTENT:74,CONFIG_END:75,SOLID_OPEN_ARROW:76,DOTTED_OPEN_ARROW:77,SOLID_ARROW:78,BIDIRECTIONAL_SOLID_ARROW:79,DOTTED_ARROW:80,BIDIRECTIONAL_DOTTED_ARROW:81,SOLID_CROSS:82,DOTTED_CROSS:83,SOLID_POINT:84,DOTTED_POINT:85,TXT:86,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",13:"create",14:"box",15:"restOfLine",16:"end",18:"autonumber",19:"NUM",20:"off",21:"activate",23:"deactivate",29:"title",30:"legacy_title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"loop",37:"rect",38:"opt",39:"alt",41:"par",43:"par_over",44:"critical",46:"break",47:"option",48:"and",49:"else",50:"participant",51:"AS",52:"participant_actor",53:"destroy",55:"note",58:"over",60:"links",61:"link",62:"properties",63:"details",65:",",66:"left_of",67:"right_of",69:"+",70:"-",71:"ACTOR",73:"CONFIG_START",74:"CONFIG_CONTENT",75:"CONFIG_END",76:"SOLID_OPEN_ARROW",77:"DOTTED_OPEN_ARROW",78:"SOLID_ARROW",79:"BIDIRECTIONAL_SOLID_ARROW",80:"DOTTED_ARROW",81:"BIDIRECTIONAL_DOTTED_ARROW",82:"SOLID_CROSS",83:"DOTTED_CROSS",84:"SOLID_POINT",85:"DOTTED_POINT",86:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[10,0],[10,2],[11,2],[11,1],[11,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[45,1],[45,4],[42,1],[42,4],[40,1],[40,4],[12,5],[12,3],[12,5],[12,3],[12,3],[12,3],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[64,2],[64,1],[59,3],[59,1],[56,1],[56,1],[17,5],[17,5],[17,4],[54,2],[72,3],[22,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[57,1]],performAction:o(function(Z,K,ae,Q,de,ne,Te){var q=ne.length-1;switch(de){case 3:return Q.apply(ne[q]),ne[q];break;case 4:case 9:this.$=[];break;case 5:case 10:ne[q-1].push(ne[q]),this.$=ne[q-1];break;case 6:case 7:case 11:case 12:this.$=ne[q];break;case 8:case 13:this.$=[];break;case 15:ne[q].type="createParticipant",this.$=ne[q];break;case 16:ne[q-1].unshift({type:"boxStart",boxData:Q.parseBoxData(ne[q-2])}),ne[q-1].push({type:"boxEnd",boxText:ne[q-2]}),this.$=ne[q-1];break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(ne[q-2]),sequenceIndexStep:Number(ne[q-1]),sequenceVisible:!0,signalType:Q.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(ne[q-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:Q.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:Q.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:Q.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"activeStart",signalType:Q.LINETYPE.ACTIVE_START,actor:ne[q-1].actor};break;case 23:this.$={type:"activeEnd",signalType:Q.LINETYPE.ACTIVE_END,actor:ne[q-1].actor};break;case 29:Q.setDiagramTitle(ne[q].substring(6)),this.$=ne[q].substring(6);break;case 30:Q.setDiagramTitle(ne[q].substring(7)),this.$=ne[q].substring(7);break;case 31:this.$=ne[q].trim(),Q.setAccTitle(this.$);break;case 32:case 33:this.$=ne[q].trim(),Q.setAccDescription(this.$);break;case 34:ne[q-1].unshift({type:"loopStart",loopText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.LOOP_START}),ne[q-1].push({type:"loopEnd",loopText:ne[q-2],signalType:Q.LINETYPE.LOOP_END}),this.$=ne[q-1];break;case 35:ne[q-1].unshift({type:"rectStart",color:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.RECT_START}),ne[q-1].push({type:"rectEnd",color:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.RECT_END}),this.$=ne[q-1];break;case 36:ne[q-1].unshift({type:"optStart",optText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.OPT_START}),ne[q-1].push({type:"optEnd",optText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.OPT_END}),this.$=ne[q-1];break;case 37:ne[q-1].unshift({type:"altStart",altText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.ALT_START}),ne[q-1].push({type:"altEnd",signalType:Q.LINETYPE.ALT_END}),this.$=ne[q-1];break;case 38:ne[q-1].unshift({type:"parStart",parText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.PAR_START}),ne[q-1].push({type:"parEnd",signalType:Q.LINETYPE.PAR_END}),this.$=ne[q-1];break;case 39:ne[q-1].unshift({type:"parStart",parText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.PAR_OVER_START}),ne[q-1].push({type:"parEnd",signalType:Q.LINETYPE.PAR_END}),this.$=ne[q-1];break;case 40:ne[q-1].unshift({type:"criticalStart",criticalText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.CRITICAL_START}),ne[q-1].push({type:"criticalEnd",signalType:Q.LINETYPE.CRITICAL_END}),this.$=ne[q-1];break;case 41:ne[q-1].unshift({type:"breakStart",breakText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.BREAK_START}),ne[q-1].push({type:"breakEnd",optText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.BREAK_END}),this.$=ne[q-1];break;case 43:this.$=ne[q-3].concat([{type:"option",optionText:Q.parseMessage(ne[q-1]),signalType:Q.LINETYPE.CRITICAL_OPTION},ne[q]]);break;case 45:this.$=ne[q-3].concat([{type:"and",parText:Q.parseMessage(ne[q-1]),signalType:Q.LINETYPE.PAR_AND},ne[q]]);break;case 47:this.$=ne[q-3].concat([{type:"else",altText:Q.parseMessage(ne[q-1]),signalType:Q.LINETYPE.ALT_ELSE},ne[q]]);break;case 48:ne[q-3].draw="participant",ne[q-3].type="addParticipant",ne[q-3].description=Q.parseMessage(ne[q-1]),this.$=ne[q-3];break;case 49:ne[q-1].draw="participant",ne[q-1].type="addParticipant",this.$=ne[q-1];break;case 50:ne[q-3].draw="actor",ne[q-3].type="addParticipant",ne[q-3].description=Q.parseMessage(ne[q-1]),this.$=ne[q-3];break;case 51:ne[q-1].draw="actor",ne[q-1].type="addParticipant",this.$=ne[q-1];break;case 52:ne[q-1].type="destroyParticipant",this.$=ne[q-1];break;case 53:ne[q-1].draw="participant",ne[q-1].type="addParticipant",this.$=ne[q-1];break;case 54:this.$=[ne[q-1],{type:"addNote",placement:ne[q-2],actor:ne[q-1].actor,text:ne[q]}];break;case 55:ne[q-2]=[].concat(ne[q-1],ne[q-1]).slice(0,2),ne[q-2][0]=ne[q-2][0].actor,ne[q-2][1]=ne[q-2][1].actor,this.$=[ne[q-1],{type:"addNote",placement:Q.PLACEMENT.OVER,actor:ne[q-2].slice(0,2),text:ne[q]}];break;case 56:this.$=[ne[q-1],{type:"addLinks",actor:ne[q-1].actor,text:ne[q]}];break;case 57:this.$=[ne[q-1],{type:"addALink",actor:ne[q-1].actor,text:ne[q]}];break;case 58:this.$=[ne[q-1],{type:"addProperties",actor:ne[q-1].actor,text:ne[q]}];break;case 59:this.$=[ne[q-1],{type:"addDetails",actor:ne[q-1].actor,text:ne[q]}];break;case 62:this.$=[ne[q-2],ne[q]];break;case 63:this.$=ne[q];break;case 64:this.$=Q.PLACEMENT.LEFTOF;break;case 65:this.$=Q.PLACEMENT.RIGHTOF;break;case 66:this.$=[ne[q-4],ne[q-1],{type:"addMessage",from:ne[q-4].actor,to:ne[q-1].actor,signalType:ne[q-3],msg:ne[q],activate:!0},{type:"activeStart",signalType:Q.LINETYPE.ACTIVE_START,actor:ne[q-1].actor}];break;case 67:this.$=[ne[q-4],ne[q-1],{type:"addMessage",from:ne[q-4].actor,to:ne[q-1].actor,signalType:ne[q-3],msg:ne[q]},{type:"activeEnd",signalType:Q.LINETYPE.ACTIVE_END,actor:ne[q-4].actor}];break;case 68:this.$=[ne[q-3],ne[q-1],{type:"addMessage",from:ne[q-3].actor,to:ne[q-1].actor,signalType:ne[q-2],msg:ne[q]}];break;case 69:this.$={type:"addParticipant",actor:ne[q-1],config:ne[q]};break;case 70:this.$=ne[q-1].trim();break;case 71:this.$={type:"addParticipant",actor:ne[q]};break;case 72:this.$=Q.LINETYPE.SOLID_OPEN;break;case 73:this.$=Q.LINETYPE.DOTTED_OPEN;break;case 74:this.$=Q.LINETYPE.SOLID;break;case 75:this.$=Q.LINETYPE.BIDIRECTIONAL_SOLID;break;case 76:this.$=Q.LINETYPE.DOTTED;break;case 77:this.$=Q.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 78:this.$=Q.LINETYPE.SOLID_CROSS;break;case 79:this.$=Q.LINETYPE.DOTTED_CROSS;break;case 80:this.$=Q.LINETYPE.SOLID_POINT;break;case 81:this.$=Q.LINETYPE.DOTTED_POINT;break;case 82:this.$=Q.parseMessage(ne[q].trim().substring(1));break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,55,60,61,62,63,71],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},t(B,[2,5]),{9:47,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},t(B,[2,7]),t(B,[2,8]),t(B,[2,14]),{12:48,50:R,52:I,53:L},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,71:P},{22:55,71:P},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},t(B,[2,29]),t(B,[2,30]),{32:[1,61]},{34:[1,62]},t(B,[2,33]),{15:[1,63]},{15:[1,64]},{15:[1,65]},{15:[1,66]},{15:[1,67]},{15:[1,68]},{15:[1,69]},{15:[1,70]},{22:71,54:72,71:[1,73]},{22:74,71:P},{22:75,71:P},{68:76,76:[1,77],77:[1,78],78:[1,79],79:[1,80],80:[1,81],81:[1,82],82:[1,83],83:[1,84],84:[1,85],85:[1,86]},{56:87,58:[1,88],66:[1,89],67:[1,90]},{22:91,71:P},{22:92,71:P},{22:93,71:P},{22:94,71:P},t([5,51,65,76,77,78,79,80,81,82,83,84,85,86],F),t(B,[2,6]),t(B,[2,15]),t(G,[2,9],{10:95}),t(B,[2,17]),{5:[1,97],19:[1,96]},{5:[1,98]},t(B,[2,21]),{5:[1,99]},{5:[1,100]},t(B,[2,24]),t(B,[2,25]),t(B,[2,26]),t(B,[2,27]),t(B,[2,28]),t(B,[2,31]),t(B,[2,32]),t($,i,{7:101}),t($,i,{7:102}),t($,i,{7:103}),t(U,i,{40:104,7:105}),t(j,i,{42:106,7:107}),t(j,i,{7:107,42:108}),t(te,i,{45:109,7:110}),t($,i,{7:111}),{5:[1,113],51:[1,112]},{5:[1,114]},t([5,51],F,{72:115,73:[1,116]}),{5:[1,118],51:[1,117]},{5:[1,119]},{22:122,69:[1,120],70:[1,121],71:P},t(Y,[2,72]),t(Y,[2,73]),t(Y,[2,74]),t(Y,[2,75]),t(Y,[2,76]),t(Y,[2,77]),t(Y,[2,78]),t(Y,[2,79]),t(Y,[2,80]),t(Y,[2,81]),{22:123,71:P},{22:125,59:124,71:P},{71:[2,64]},{71:[2,65]},{57:126,86:oe},{57:128,86:oe},{57:129,86:oe},{57:130,86:oe},{4:[1,133],5:[1,135],11:132,12:134,16:[1,131],50:R,52:I,53:L},{5:[1,136]},t(B,[2,19]),t(B,[2,20]),t(B,[2,22]),t(B,[2,23]),{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,137],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,138],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,139],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{16:[1,140]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,46],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,49:[1,141],50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{16:[1,142]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,44],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,48:[1,143],50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{16:[1,144]},{16:[1,145]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,42],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,47:[1,146],50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,147],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{15:[1,148]},t(B,[2,49]),t(B,[2,53]),{5:[2,69]},{74:[1,149]},{15:[1,150]},t(B,[2,51]),t(B,[2,52]),{22:151,71:P},{22:152,71:P},{57:153,86:oe},{57:154,86:oe},{57:155,86:oe},{65:[1,156],86:[2,63]},{5:[2,56]},{5:[2,82]},{5:[2,57]},{5:[2,58]},{5:[2,59]},t(B,[2,16]),t(G,[2,10]),{12:157,50:R,52:I,53:L},t(G,[2,12]),t(G,[2,13]),t(B,[2,18]),t(B,[2,34]),t(B,[2,35]),t(B,[2,36]),t(B,[2,37]),{15:[1,158]},t(B,[2,38]),{15:[1,159]},t(B,[2,39]),t(B,[2,40]),{15:[1,160]},t(B,[2,41]),{5:[1,161]},{75:[1,162]},{5:[1,163]},{57:164,86:oe},{57:165,86:oe},{5:[2,68]},{5:[2,54]},{5:[2,55]},{22:166,71:P},t(G,[2,11]),t(U,i,{7:105,40:167}),t(j,i,{7:107,42:168}),t(te,i,{7:110,45:169}),t(B,[2,48]),{5:[2,70]},t(B,[2,50]),{5:[2,66]},{5:[2,67]},{86:[2,62]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],defaultActions:{5:[2,1],6:[2,2],89:[2,64],90:[2,65],115:[2,69],126:[2,56],127:[2,82],128:[2,57],129:[2,58],130:[2,59],153:[2,68],154:[2,54],155:[2,55],162:[2,70],164:[2,66],165:[2,67],166:[2,62],167:[2,47],168:[2,45],169:[2,43]},parseError:o(function(Z,K){if(K.recoverable)this.trace(Z);else{var ae=new Error(Z);throw ae.hash=K,ae}},"parseError"),parse:o(function(Z){var K=this,ae=[0],Q=[],de=[null],ne=[],Te=this.table,q="",Ve=0,pe=0,Be=0,Ye=2,He=1,Le=ne.slice.call(arguments,1),Ie=Object.create(this.lexer),Ne={yy:{}};for(var Ce in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ce)&&(Ne.yy[Ce]=this.yy[Ce]);Ie.setInput(Z,Ne.yy),Ne.yy.lexer=Ie,Ne.yy.parser=this,typeof Ie.yylloc>"u"&&(Ie.yylloc={});var Fe=Ie.yylloc;ne.push(Fe);var fe=Ie.options&&Ie.options.ranges;typeof Ne.yy.parseError=="function"?this.parseError=Ne.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xe(We){ae.length=ae.length-2*We,de.length=de.length-We,ne.length=ne.length-We}o(xe,"popStack");function W(){var We;return We=Q.pop()||Ie.lex()||He,typeof We!="number"&&(We instanceof Array&&(Q=We,We=Q.pop()),We=K.symbols_[We]||We),We}o(W,"lex");for(var he,z,se,le,ke,ve,ye={},Re,_e,ze,Ke;;){if(se=ae[ae.length-1],this.defaultActions[se]?le=this.defaultActions[se]:((he===null||typeof he>"u")&&(he=W()),le=Te[se]&&Te[se][he]),typeof le>"u"||!le.length||!le[0]){var xt="";Ke=[];for(Re in Te[se])this.terminals_[Re]&&Re>Ye&&Ke.push("'"+this.terminals_[Re]+"'");Ie.showPosition?xt="Parse error on line "+(Ve+1)+`: +`+Ie.showPosition()+` +Expecting `+Ke.join(", ")+", got '"+(this.terminals_[he]||he)+"'":xt="Parse error on line "+(Ve+1)+": Unexpected "+(he==He?"end of input":"'"+(this.terminals_[he]||he)+"'"),this.parseError(xt,{text:Ie.match,token:this.terminals_[he]||he,line:Ie.yylineno,loc:Fe,expected:Ke})}if(le[0]instanceof Array&&le.length>1)throw new Error("Parse Error: multiple actions possible at state: "+se+", token: "+he);switch(le[0]){case 1:ae.push(he),de.push(Ie.yytext),ne.push(Ie.yylloc),ae.push(le[1]),he=null,z?(he=z,z=null):(pe=Ie.yyleng,q=Ie.yytext,Ve=Ie.yylineno,Fe=Ie.yylloc,Be>0&&Be--);break;case 2:if(_e=this.productions_[le[1]][1],ye.$=de[de.length-_e],ye._$={first_line:ne[ne.length-(_e||1)].first_line,last_line:ne[ne.length-1].last_line,first_column:ne[ne.length-(_e||1)].first_column,last_column:ne[ne.length-1].last_column},fe&&(ye._$.range=[ne[ne.length-(_e||1)].range[0],ne[ne.length-1].range[1]]),ve=this.performAction.apply(ye,[q,pe,Ve,Ne.yy,le[1],de,ne].concat(Le)),typeof ve<"u")return ve;_e&&(ae=ae.slice(0,-1*_e*2),de=de.slice(0,-1*_e),ne=ne.slice(0,-1*_e)),ae.push(this.productions_[le[1]][0]),de.push(ye.$),ne.push(ye._$),ze=Te[ae[ae.length-2]][ae[ae.length-1]],ae.push(ze);break;case 3:return!0}}return!0},"parse")},ue=(function(){var ee={EOF:1,parseError:o(function(K,ae){if(this.yy.parser)this.yy.parser.parseError(K,ae);else throw new Error(K)},"parseError"),setInput:o(function(Z,K){return this.yy=K||this.yy||{},this._input=Z,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Z=this._input[0];this.yytext+=Z,this.yyleng++,this.offset++,this.match+=Z,this.matched+=Z;var K=Z.match(/(?:\r\n?|\n).*/g);return K?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Z},"input"),unput:o(function(Z){var K=Z.length,ae=Z.split(/(?:\r\n?|\n)/g);this._input=Z+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-K),this.offset-=K;var Q=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ae.length-1&&(this.yylineno-=ae.length-1);var de=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ae?(ae.length===Q.length?this.yylloc.first_column:0)+Q[Q.length-ae.length].length-ae[0].length:this.yylloc.first_column-K},this.options.ranges&&(this.yylloc.range=[de[0],de[0]+this.yyleng-K]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Z){this.unput(this.match.slice(Z))},"less"),pastInput:o(function(){var Z=this.matched.substr(0,this.matched.length-this.match.length);return(Z.length>20?"...":"")+Z.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Z=this.match;return Z.length<20&&(Z+=this._input.substr(0,20-Z.length)),(Z.substr(0,20)+(Z.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Z=this.pastInput(),K=new Array(Z.length+1).join("-");return Z+this.upcomingInput()+` +`+K+"^"},"showPosition"),test_match:o(function(Z,K){var ae,Q,de;if(this.options.backtrack_lexer&&(de={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(de.yylloc.range=this.yylloc.range.slice(0))),Q=Z[0].match(/(?:\r\n?|\n).*/g),Q&&(this.yylineno+=Q.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Q?Q[Q.length-1].length-Q[Q.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Z[0].length},this.yytext+=Z[0],this.match+=Z[0],this.matches=Z,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Z[0].length),this.matched+=Z[0],ae=this.performAction.call(this,this.yy,this,K,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ae)return ae;if(this._backtrack){for(var ne in de)this[ne]=de[ne];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Z,K,ae,Q;this._more||(this.yytext="",this.match="");for(var de=this._currentRules(),ne=0;neK[0].length)){if(K=ae,Q=ne,this.options.backtrack_lexer){if(Z=this.test_match(ae,de[ne]),Z!==!1)return Z;if(this._backtrack){K=!1;continue}else return!1}else if(!this.options.flex)break}return K?(Z=this.test_match(K,de[Q]),Z!==!1?Z:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var K=this.next();return K||this.lex()},"lex"),begin:o(function(K){this.conditionStack.push(K)},"begin"),popState:o(function(){var K=this.conditionStack.length-1;return K>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(K){return K=this.conditionStack.length-1-Math.abs(K||0),K>=0?this.conditionStack[K]:"INITIAL"},"topState"),pushState:o(function(K){this.begin(K)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(K,ae,Q,de){var ne=de;switch(Q){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 19;case 7:return this.begin("CONFIG"),73;break;case 8:return 74;case 9:return this.popState(),this.popState(),75;break;case 10:return ae.yytext=ae.yytext.trim(),71;break;case 11:return ae.yytext=ae.yytext.trim(),this.begin("ALIAS"),71;break;case 12:return this.begin("LINE"),14;break;case 13:return this.begin("ID"),50;break;case 14:return this.begin("ID"),52;break;case 15:return 13;case 16:return this.begin("ID"),53;break;case 17:return ae.yytext=ae.yytext.trim(),this.begin("ALIAS"),71;break;case 18:return this.popState(),this.popState(),this.begin("LINE"),51;break;case 19:return this.popState(),this.popState(),5;break;case 20:return this.begin("LINE"),36;break;case 21:return this.begin("LINE"),37;break;case 22:return this.begin("LINE"),38;break;case 23:return this.begin("LINE"),39;break;case 24:return this.begin("LINE"),49;break;case 25:return this.begin("LINE"),41;break;case 26:return this.begin("LINE"),43;break;case 27:return this.begin("LINE"),48;break;case 28:return this.begin("LINE"),44;break;case 29:return this.begin("LINE"),47;break;case 30:return this.begin("LINE"),46;break;case 31:return this.popState(),15;break;case 32:return 16;case 33:return 66;case 34:return 67;case 35:return 60;case 36:return 61;case 37:return 62;case 38:return 63;case 39:return 58;case 40:return 55;case 41:return this.begin("ID"),21;break;case 42:return this.begin("ID"),23;break;case 43:return 29;case 44:return 30;case 45:return this.begin("acc_title"),31;break;case 46:return this.popState(),"acc_title_value";break;case 47:return this.begin("acc_descr"),33;break;case 48:return this.popState(),"acc_descr_value";break;case 49:this.begin("acc_descr_multiline");break;case 50:this.popState();break;case 51:return"acc_descr_multiline_value";case 52:return 6;case 53:return 18;case 54:return 20;case 55:return 65;case 56:return 5;case 57:return ae.yytext=ae.yytext.trim(),71;break;case 58:return 78;case 59:return 79;case 60:return 80;case 61:return 81;case 62:return 76;case 63:return 77;case 64:return 82;case 65:return 83;case 66:return 84;case 67:return 85;case 68:return 86;case 69:return 86;case 70:return 69;case 71:return 70;case 72:return 5;case 73:return"INVALID"}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:@\{)/i,/^(?:[^\}]+)/i,/^(?:\})/i,/^(?:[^\<->\->:\n,;@\s]+(?=@\{))/i,/^(?:[^\<->\->:\n,;@]+?([\-]*[^\<->\->:\n,;@]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:[^<\->\->:\n,;]+?([\-]*[^<\->\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^+<\->\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+<\->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]*)/i,/^(?::)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[50,51],inclusive:!1},acc_descr:{rules:[48],inclusive:!1},acc_title:{rules:[46],inclusive:!1},ID:{rules:[2,3,7,10,11,17],inclusive:!1},ALIAS:{rules:[2,3,18,19],inclusive:!1},LINE:{rules:[2,3,31],inclusive:!1},CONFIG:{rules:[8,9],inclusive:!1},CONFIG_DATA:{rules:[],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,12,13,14,15,16,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,47,49,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73],inclusive:!0}}};return ee})();J.lexer=ue;function re(){this.yy={}}return o(re,"Parser"),re.prototype=J,J.Parser=re,new re})();JF.parser=JF;Mye=JF});var XZe,jZe,KZe,b4,J6,e$=N(()=>{"use strict";Xt();w2();pt();fF();gr();ci();XZe={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34},jZe={FILLED:0,OPEN:1},KZe={LEFTOF:0,RIGHTOF:1,OVER:2},b4={ACTOR:"actor",BOUNDARY:"boundary",COLLECTIONS:"collections",CONTROL:"control",DATABASE:"database",ENTITY:"entity",PARTICIPANT:"participant",QUEUE:"queue"},J6=class{constructor(){this.state=new J1(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0}));this.setAccTitle=Rr;this.setAccDescription=Ir;this.setDiagramTitle=$r;this.getAccTitle=Mr;this.getAccDescription=Or;this.getDiagramTitle=Pr;this.apply=this.apply.bind(this),this.parseBoxData=this.parseBoxData.bind(this),this.parseMessage=this.parseMessage.bind(this),this.clear(),this.setWrap(ge().wrap),this.LINETYPE=XZe,this.ARROWTYPE=jZe,this.PLACEMENT=KZe}static{o(this,"SequenceDB")}addBox(e){this.state.records.boxes.push({name:e.text,wrap:e.wrap??this.autoWrap(),fill:e.color,actorKeys:[]}),this.state.records.currentBox=this.state.records.boxes.slice(-1)[0]}addActor(e,r,n,i,a){let s=this.state.records.currentBox,l;if(a!==void 0){let h;a.includes(` +`)?h=a+` +`:h=`{ +`+a+` +}`,l=Kh(h,{schema:jh})}i=l?.type??i;let u=this.state.records.actors.get(e);if(u){if(this.state.records.currentBox&&u.box&&this.state.records.currentBox!==u.box)throw new Error(`A same participant should only be defined in one Box: ${u.name} can't be in '${u.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`);if(s=u.box?u.box:this.state.records.currentBox,u.box=s,u&&r===u.name&&n==null)return}if(n?.text==null&&(n={text:r,type:i}),(i==null||n.text==null)&&(n={text:r,type:i}),this.state.records.actors.set(e,{box:s,name:r,description:n.text,wrap:n.wrap??this.autoWrap(),prevActor:this.state.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:i??"participant"}),this.state.records.prevActor){let h=this.state.records.actors.get(this.state.records.prevActor);h&&(h.nextActor=e)}this.state.records.currentBox&&this.state.records.currentBox.actorKeys.push(e),this.state.records.prevActor=e}activationCount(e){let r,n=0;if(!e)return 0;for(r=0;r>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},l}return this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:e,to:r,message:n?.text??"",wrap:n?.wrap??this.autoWrap(),type:i,activate:a}),!0}hasAtLeastOneBox(){return this.state.records.boxes.length>0}hasAtLeastOneBoxWithTitle(){return this.state.records.boxes.some(e=>e.name)}getMessages(){return this.state.records.messages}getBoxes(){return this.state.records.boxes}getActors(){return this.state.records.actors}getCreatedActors(){return this.state.records.createdActors}getDestroyedActors(){return this.state.records.destroyedActors}getActor(e){return this.state.records.actors.get(e)}getActorKeys(){return[...this.state.records.actors.keys()]}enableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!0}disableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!1}showSequenceNumbers(){return this.state.records.sequenceNumbersEnabled}setWrap(e){this.state.records.wrapEnabled=e}extractWrap(e){if(e===void 0)return{};e=e.trim();let r=/^:?wrap:/.exec(e)!==null?!0:/^:?nowrap:/.exec(e)!==null?!1:void 0;return{cleanedText:(r===void 0?e:e.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:r}}autoWrap(){return this.state.records.wrapEnabled!==void 0?this.state.records.wrapEnabled:ge().sequence?.wrap??!1}clear(){this.state.reset(),Sr()}parseMessage(e){let r=e.trim(),{wrap:n,cleanedText:i}=this.extractWrap(r),a={text:i,wrap:n};return X.debug(`parseMessage: ${JSON.stringify(a)}`),a}parseBoxData(e){let r=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(e),n=r?.[1]?r[1].trim():"transparent",i=r?.[2]?r[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",n)||(n="transparent",i=e.trim());else{let l=new Option().style;l.color=n,l.color!==n&&(n="transparent",i=e.trim())}let{wrap:a,cleanedText:s}=this.extractWrap(i);return{text:s?sr(s,ge()):void 0,color:n,wrap:a}}addNote(e,r,n){let i={actor:e,placement:r,message:n.text,wrap:n.wrap??this.autoWrap()},a=[].concat(e,e);this.state.records.notes.push(i),this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:a[0],to:a[1],message:n.text,wrap:n.wrap??this.autoWrap(),type:this.LINETYPE.NOTE,placement:r})}addLinks(e,r){let n=this.getActor(e);try{let i=sr(r.text,ge());i=i.replace(/=/g,"="),i=i.replace(/&/g,"&");let a=JSON.parse(i);this.insertLinks(n,a)}catch(i){X.error("error while parsing actor link text",i)}}addALink(e,r){let n=this.getActor(e);try{let i={},a=sr(r.text,ge()),s=a.indexOf("@");a=a.replace(/=/g,"="),a=a.replace(/&/g,"&");let l=a.slice(0,s-1).trim(),u=a.slice(s+1).trim();i[l]=u,this.insertLinks(n,i)}catch(i){X.error("error while parsing actor link text",i)}}insertLinks(e,r){if(e.links==null)e.links=r;else for(let n in r)e.links[n]=r[n]}addProperties(e,r){let n=this.getActor(e);try{let i=sr(r.text,ge()),a=JSON.parse(i);this.insertProperties(n,a)}catch(i){X.error("error while parsing actor properties text",i)}}insertProperties(e,r){if(e.properties==null)e.properties=r;else for(let n in r)e.properties[n]=r[n]}boxEnd(){this.state.records.currentBox=void 0}addDetails(e,r){let n=this.getActor(e),i=document.getElementById(r.text);try{let a=i.innerHTML,s=JSON.parse(a);s.properties&&this.insertProperties(n,s.properties),s.links&&this.insertLinks(n,s.links)}catch(a){X.error("error while parsing actor details text",a)}}getActorProperty(e,r){if(e?.properties!==void 0)return e.properties[r]}apply(e){if(Array.isArray(e))e.forEach(r=>{this.apply(r)});else switch(e.type){case"sequenceIndex":this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:void 0,to:void 0,message:{start:e.sequenceIndex,step:e.sequenceIndexStep,visible:e.sequenceVisible},wrap:!1,type:e.signalType});break;case"addParticipant":this.addActor(e.actor,e.actor,e.description,e.draw,e.config);break;case"createParticipant":if(this.state.records.actors.has(e.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");this.state.records.lastCreated=e.actor,this.addActor(e.actor,e.actor,e.description,e.draw,e.config),this.state.records.createdActors.set(e.actor,this.state.records.messages.length);break;case"destroyParticipant":this.state.records.lastDestroyed=e.actor,this.state.records.destroyedActors.set(e.actor,this.state.records.messages.length);break;case"activeStart":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"activeEnd":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"addNote":this.addNote(e.actor,e.placement,e.text);break;case"addLinks":this.addLinks(e.actor,e.text);break;case"addALink":this.addALink(e.actor,e.text);break;case"addProperties":this.addProperties(e.actor,e.text);break;case"addDetails":this.addDetails(e.actor,e.text);break;case"addMessage":if(this.state.records.lastCreated){if(e.to!==this.state.records.lastCreated)throw new Error("The created participant "+this.state.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");this.state.records.lastCreated=void 0}else if(this.state.records.lastDestroyed){if(e.to!==this.state.records.lastDestroyed&&e.from!==this.state.records.lastDestroyed)throw new Error("The destroyed participant "+this.state.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");this.state.records.lastDestroyed=void 0}this.addSignal(e.from,e.to,e.msg,e.signalType,e.activate);break;case"boxStart":this.addBox(e.boxData);break;case"boxEnd":this.boxEnd();break;case"loopStart":this.addSignal(void 0,void 0,e.loopText,e.signalType);break;case"loopEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"rectStart":this.addSignal(void 0,void 0,e.color,e.signalType);break;case"rectEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"optStart":this.addSignal(void 0,void 0,e.optText,e.signalType);break;case"optEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"altStart":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"else":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"altEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"setAccTitle":Rr(e.text);break;case"parStart":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"and":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"parEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"criticalStart":this.addSignal(void 0,void 0,e.criticalText,e.signalType);break;case"option":this.addSignal(void 0,void 0,e.optionText,e.signalType);break;case"criticalEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"breakStart":this.addSignal(void 0,void 0,e.breakText,e.signalType);break;case"breakEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break}}getConfig(){return ge().sequence}}});var QZe,Oye,Pye=N(()=>{"use strict";QZe=o(t=>`.actor { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + } + + text.actor > tspan { + fill: ${t.actorTextColor}; + stroke: none; + } + + .actor-line { + stroke: ${t.actorLineColor}; + } + + .innerArc { + stroke-width: 1.5; + stroke-dasharray: none; + } + + .messageLine0 { + stroke-width: 1.5; + stroke-dasharray: none; + stroke: ${t.signalColor}; + } + + .messageLine1 { + stroke-width: 1.5; + stroke-dasharray: 2, 2; + stroke: ${t.signalColor}; + } + + #arrowhead path { + fill: ${t.signalColor}; + stroke: ${t.signalColor}; + } + + .sequenceNumber { + fill: ${t.sequenceNumberColor}; + } + + #sequencenumber { + fill: ${t.signalColor}; + } + + #crosshead path { + fill: ${t.signalColor}; + stroke: ${t.signalColor}; + } + + .messageText { + fill: ${t.signalTextColor}; + stroke: none; + } + + .labelBox { + stroke: ${t.labelBoxBorderColor}; + fill: ${t.labelBoxBkgColor}; + } + + .labelText, .labelText > tspan { + fill: ${t.labelTextColor}; + stroke: none; + } + + .loopText, .loopText > tspan { + fill: ${t.loopTextColor}; + stroke: none; + } + + .loopLine { + stroke-width: 2px; + stroke-dasharray: 2, 2; + stroke: ${t.labelBoxBorderColor}; + fill: ${t.labelBoxBorderColor}; + } + + .note { + //stroke: #decc93; + stroke: ${t.noteBorderColor}; + fill: ${t.noteBkgColor}; + } + + .noteText, .noteText > tspan { + fill: ${t.noteTextColor}; + stroke: none; + } + + .activation0 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .activation1 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .activation2 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .actorPopupMenu { + position: absolute; + } + + .actorPopupMenuPanel { + position: absolute; + fill: ${t.actorBkg}; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); +} + .actor-man line { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + } + .actor-man circle, line { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + stroke-width: 2px; + } + +`,"getStyles"),Oye=QZe});var t$,Yf,jf,Kf,eC,Xf,T4,ZZe,tC,w4,o0,Bye,Fr,r$,JZe,eJe,tJe,rJe,nJe,iJe,aJe,sJe,oJe,lJe,cJe,uJe,hJe,Fye,fJe,dJe,pJe,mJe,gJe,yJe,vJe,$ye,xJe,oh,bJe,mi,zye=N(()=>{"use strict";t$=ja(tm(),1);qn();tr();gr();r2();Yf=36,jf="actor-top",Kf="actor-bottom",eC="actor-box",Xf="actor-man",T4=o(function(t,e){return Fd(t,e)},"drawRect"),ZZe=o(function(t,e,r,n,i){if(e.links===void 0||e.links===null||Object.keys(e.links).length===0)return{height:0,width:0};let a=e.links,s=e.actorCnt,l=e.rectData;var u="none";i&&(u="block !important");let h=t.append("g");h.attr("id","actor"+s+"_popup"),h.attr("class","actorPopupMenu"),h.attr("display",u);var f="";l.class!==void 0&&(f=" "+l.class);let d=l.width>r?l.width:r,p=h.append("rect");if(p.attr("class","actorPopupMenuPanel"+f),p.attr("x",l.x),p.attr("y",l.height),p.attr("fill",l.fill),p.attr("stroke",l.stroke),p.attr("width",d),p.attr("height",l.height),p.attr("rx",l.rx),p.attr("ry",l.ry),a!=null){var m=20;for(let v in a){var g=h.append("a"),y=(0,t$.sanitizeUrl)(a[v]);g.attr("xlink:href",y),g.attr("target","_blank"),bJe(n)(v,g,l.x+10,l.height+m,d,20,{class:"actor"},n),m+=30}}return p.attr("height",m),{height:l.height+m,width:d}},"drawPopup"),tC=o(function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),w4=o(async function(t,e,r=null){let n=t.append("foreignObject"),i=await kh(e.text,Qt()),s=n.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(i).node().getBoundingClientRect();if(n.attr("height",Math.round(s.height)).attr("width",Math.round(s.width)),e.class==="noteText"){let l=t.node().firstChild;l.setAttribute("height",s.height+2*e.textMargin);let u=l.getBBox();n.attr("x",Math.round(u.x+u.width/2-s.width/2)).attr("y",Math.round(u.y+u.height/2-s.height/2))}else if(r){let{startx:l,stopx:u,starty:h}=r;if(l>u){let f=l;l=u,u=f}n.attr("x",Math.round(l+Math.abs(l-u)/2-s.width/2)),e.class==="loopText"?n.attr("y",Math.round(h)):n.attr("y",Math.round(h-s.height))}return[n]},"drawKatex"),o0=o(function(t,e){let r=0,n=0,i=e.text.split(tt.lineBreakRegex),[a,s]=vc(e.fontSize),l=[],u=0,h=o(()=>e.y,"yfunc");if(e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0)switch(e.valign){case"top":case"start":h=o(()=>Math.round(e.y+e.textMargin),"yfunc");break;case"middle":case"center":h=o(()=>Math.round(e.y+(r+n+e.textMargin)/2),"yfunc");break;case"bottom":case"end":h=o(()=>Math.round(e.y+(r+n+2*e.textMargin)-e.textMargin),"yfunc");break}if(e.anchor!==void 0&&e.textMargin!==void 0&&e.width!==void 0)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle";break}for(let[f,d]of i.entries()){e.textMargin!==void 0&&e.textMargin===0&&a!==void 0&&(u=f*a);let p=t.append("text");p.attr("x",e.x),p.attr("y",h()),e.anchor!==void 0&&p.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),e.fontFamily!==void 0&&p.style("font-family",e.fontFamily),s!==void 0&&p.style("font-size",s),e.fontWeight!==void 0&&p.style("font-weight",e.fontWeight),e.fill!==void 0&&p.attr("fill",e.fill),e.class!==void 0&&p.attr("class",e.class),e.dy!==void 0?p.attr("dy",e.dy):u!==0&&p.attr("dy",u);let m=d||BL;if(e.tspan){let g=p.append("tspan");g.attr("x",e.x),e.fill!==void 0&&g.attr("fill",e.fill),g.text(m)}else p.text(m);e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0&&(n+=(p._groups||p)[0][0].getBBox().height,r=n),l.push(p)}return l},"drawText"),Bye=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");return n.attr("points",r(e.x,e.y,e.width,e.height,7)),n.attr("class","labelBox"),e.y=e.y+e.height/2,o0(t,e),n},"drawLabel"),Fr=-1,r$=o((t,e,r,n)=>{t.select&&r.forEach(i=>{let a=e.get(i),s=t.select("#actor"+a.actorCnt);!n.mirrorActors&&a.stopy?s.attr("y2",a.stopy+a.height/2):n.mirrorActors&&s.attr("y2",a.stopy)})},"fixLifeLineHeights"),JZe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower();var u=l;n||(Fr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",tC(`actor${Fr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Fr,e.links!=null&&u.attr("id","root-"+Fr));let h=ua();var f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${Kf}`:f+=` ${jf}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.rx=3,h.ry=3,h.name=e.name;let d=T4(u,h);if(e.rectData=h,e.properties?.icon){let m=e.properties.icon.trim();m.charAt(0)==="@"?lT(u,h.x+h.width-20,h.y+10,m.substr(1)):oT(u,h.x+h.width-20,h.y+10,m)}oh(r,kn(e.description))(e.description,u,h.x,h.y,h.width,h.height,{class:`actor ${eC}`},r);let p=e.height;if(d.node){let m=d.node().getBBox();e.height=m.height,p=m.height}return p},"drawActorTypeParticipant"),eJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower();var u=l;n||(Fr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",tC(`actor${Fr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Fr,e.links!=null&&u.attr("id","root-"+Fr));let h=ua();var f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${Kf}`:f+=` ${jf}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.name=e.name;let d=6,p={...h,x:h.x+-d,y:h.y+ +d,class:"actor"},m=T4(u,h);if(T4(u,p),e.rectData=h,e.properties?.icon){let y=e.properties.icon.trim();y.charAt(0)==="@"?lT(u,h.x+h.width-20,h.y+10,y.substr(1)):oT(u,h.x+h.width-20,h.y+10,y)}oh(r,kn(e.description))(e.description,u,h.x-d,h.y+d,h.width,h.height,{class:`actor ${eC}`},r);let g=e.height;if(m.node){let y=m.node().getBBox();e.height=y.height,g=y.height}return g},"drawActorTypeCollections"),tJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower(),u=l;n||(Fr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",tC(`actor${Fr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Fr,e.links!=null&&u.attr("id","root-"+Fr));let h=ua(),f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${Kf}`:f+=` ${jf}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.name=e.name;let d=h.height/2,p=d/(2.5+h.height/50),m=u.append("g"),g=u.append("g");if(m.append("path").attr("d",`M ${h.x},${h.y+d} + a ${p},${d} 0 0 0 0,${h.height} + h ${h.width-2*p} + a ${p},${d} 0 0 0 0,-${h.height} + Z + `).attr("class",f),g.append("path").attr("d",`M ${h.x},${h.y+d} + a ${p},${d} 0 0 0 0,${h.height}`).attr("stroke","#666").attr("stroke-width","1px").attr("class",f),m.attr("transform",`translate(${p}, ${-(h.height/2)})`),g.attr("transform",`translate(${h.width-p}, ${-h.height/2})`),e.rectData=h,e.properties?.icon){let x=e.properties.icon.trim(),b=h.x+h.width-20,T=h.y+10;x.charAt(0)==="@"?lT(u,b,T,x.substr(1)):oT(u,b,T,x)}oh(r,kn(e.description))(e.description,u,h.x,h.y,h.width,h.height,{class:`actor ${eC}`},r);let y=e.height,v=m.select("path:last-child");if(v.node()){let x=v.node().getBBox();e.height=x.height,y=x.height}return y},"drawActorTypeQueue"),rJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+75,l=t.append("g").lower();n||(Fr++,l.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Fr);let u=t.append("g"),h=Xf;n?h+=` ${Kf}`:h+=` ${jf}`,u.attr("class",h),u.attr("name",e.name);let f=ua();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor";let d=e.x+e.width/2,p=i+30,m=18;u.append("defs").append("marker").attr("id","filled-head-control").attr("refX",11).attr("refY",5.8).attr("markerWidth",20).attr("markerHeight",28).attr("orient","172.5").append("path").attr("d","M 14.4 5.6 L 7.2 10.4 L 8.8 5.6 L 7.2 0.8 Z"),u.append("circle").attr("cx",d).attr("cy",p).attr("r",m).attr("fill","#eaeaf7").attr("stroke","#666").attr("stroke-width",1.2),u.append("line").attr("marker-end","url(#filled-head-control)").attr("transform",`translate(${d}, ${p-m})`);let g=u.node().getBBox();return e.height=g.height+2*(r?.sequence?.labelBoxHeight??0),oh(r,kn(e.description))(e.description,u,f.x,f.y+m+(n?5:10),f.width,f.height,{class:`actor ${Xf}`},r),e.height},"drawActorTypeControl"),nJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+75,l=t.append("g").lower(),u=t.append("g"),h=Xf;n?h+=` ${Kf}`:h+=` ${jf}`,u.attr("class",h),u.attr("name",e.name);let f=ua();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor";let d=e.x+e.width/2,p=i+(n?10:25),m=18;u.append("circle").attr("cx",d).attr("cy",p).attr("r",m).attr("width",e.width).attr("height",e.height),u.append("line").attr("x1",d-m).attr("x2",d+m).attr("y1",p+m).attr("y2",p+m).attr("stroke","#333").attr("stroke-width",2);let g=u.node().getBBox();return e.height=g.height+(r?.sequence?.labelBoxHeight??0),n||(Fr++,l.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Fr),oh(r,kn(e.description))(e.description,u,f.x,f.y+(n?(p-i+m-5)/2:(p+m-i)/2),f.width,f.height,{class:`actor ${Xf}`},r),n?u.attr("transform",`translate(0, ${m/2})`):u.attr("transform",`translate(0, ${m/2})`),e.height},"drawActorTypeEntity"),iJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height+2*r.boxTextMargin,l=t.append("g").lower(),u=l;n||(Fr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",tC(`actor${Fr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Fr,e.links!=null&&u.attr("id","root-"+Fr));let h=ua(),f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${Kf}`:f+=` ${jf}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.name=e.name,h.x=e.x,h.y=i;let d=h.width/4,p=h.width/4,m=d/2,g=m/(2.5+d/50),y=u.append("g"),v=` + M ${h.x},${h.y+g} + a ${m},${g} 0 0 0 ${d},0 + a ${m},${g} 0 0 0 -${d},0 + l 0,${p-2*g} + a ${m},${g} 0 0 0 ${d},0 + l 0,-${p-2*g} +`;y.append("path").attr("d",v).attr("fill","#eaeaea").attr("stroke","#000").attr("stroke-width",1).attr("class",f),n?y.attr("transform",`translate(${d*1.5}, ${h.height/4-2*g})`):y.attr("transform",`translate(${d*1.5}, ${(h.height+g)/4})`),e.rectData=h,oh(r,kn(e.description))(e.description,u,h.x,h.y+(n?(h.height+p)/4:(h.height+g)/2),h.width,h.height,{class:`actor ${eC}`},r);let x=y.select("path:last-child");if(x.node()){let b=x.node().getBBox();e.height=b.height+(r.sequence.labelBoxHeight??0)}return e.height},"drawActorTypeDatabase"),aJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,l=30,u=t.append("g").lower();n||(Fr++,u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Fr);let h=t.append("g"),f=Xf;n?f+=` ${Kf}`:f+=` ${jf}`,h.attr("class",f),h.attr("name",e.name);let d=ua();d.x=e.x,d.y=i,d.fill="#eaeaea",d.width=e.width,d.height=e.height,d.class="actor",h.append("line").attr("id","actor-man-torso"+Fr).attr("x1",e.x+e.width/2-l*2.5).attr("y1",i+10).attr("x2",e.x+e.width/2-15).attr("y2",i+10),h.append("line").attr("id","actor-man-arms"+Fr).attr("x1",e.x+e.width/2-l*2.5).attr("y1",i+0).attr("x2",e.x+e.width/2-l*2.5).attr("y2",i+20),h.append("circle").attr("cx",e.x+e.width/2).attr("cy",i+10).attr("r",l);let p=h.node().getBBox();return e.height=p.height+(r.sequence.labelBoxHeight??0),oh(r,kn(e.description))(e.description,h,d.x,d.y+(n?l/2-4:l/2+3),d.width,d.height,{class:`actor ${Xf}`},r),n?h.attr("transform",`translate(0,${l/2+7})`):h.attr("transform",`translate(0,${l/2+7})`),e.height},"drawActorTypeBoundary"),sJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,l=t.append("g").lower();n||(Fr++,l.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Fr);let u=t.append("g"),h=Xf;n?h+=` ${Kf}`:h+=` ${jf}`,u.attr("class",h),u.attr("name",e.name);let f=ua();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor",f.rx=3,f.ry=3,u.append("line").attr("id","actor-man-torso"+Fr).attr("x1",a).attr("y1",i+25).attr("x2",a).attr("y2",i+45),u.append("line").attr("id","actor-man-arms"+Fr).attr("x1",a-Yf/2).attr("y1",i+33).attr("x2",a+Yf/2).attr("y2",i+33),u.append("line").attr("x1",a-Yf/2).attr("y1",i+60).attr("x2",a).attr("y2",i+45),u.append("line").attr("x1",a).attr("y1",i+45).attr("x2",a+Yf/2-2).attr("y2",i+60);let d=u.append("circle");d.attr("cx",e.x+e.width/2),d.attr("cy",i+10),d.attr("r",15),d.attr("width",e.width),d.attr("height",e.height);let p=u.node().getBBox();return e.height=p.height,oh(r,kn(e.description))(e.description,u,f.x,f.y+35,f.width,f.height,{class:`actor ${Xf}`},r),e.height},"drawActorTypeActor"),oJe=o(async function(t,e,r,n){switch(e.type){case"actor":return await sJe(t,e,r,n);case"participant":return await JZe(t,e,r,n);case"boundary":return await aJe(t,e,r,n);case"control":return await rJe(t,e,r,n);case"entity":return await nJe(t,e,r,n);case"database":return await iJe(t,e,r,n);case"collections":return await eJe(t,e,r,n);case"queue":return await tJe(t,e,r,n)}},"drawActor"),lJe=o(function(t,e,r){let i=t.append("g");Fye(i,e),e.name&&oh(r)(e.name,i,e.x,e.y+r.boxTextMargin+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},r),i.lower()},"drawBox"),cJe=o(function(t){return t.append("g")},"anchorElement"),uJe=o(function(t,e,r,n,i){let a=ua(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+i%3,a.width=e.stopx-e.startx,a.height=r-e.starty,T4(s,a)},"drawActivation"),hJe=o(async function(t,e,r,n){let{boxMargin:i,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:l,messageFontFamily:u,messageFontSize:h,messageFontWeight:f}=n,d=t.append("g"),p=o(function(y,v,x,b){return d.append("line").attr("x1",y).attr("y1",v).attr("x2",x).attr("y2",b).attr("class","loopLine")},"drawLoopLine");p(e.startx,e.starty,e.stopx,e.starty),p(e.stopx,e.starty,e.stopx,e.stopy),p(e.startx,e.stopy,e.stopx,e.stopy),p(e.startx,e.starty,e.startx,e.stopy),e.sections!==void 0&&e.sections.forEach(function(y){p(e.startx,y.y,e.stopx,y.y).style("stroke-dasharray","3, 3")});let m=t2();m.text=r,m.x=e.startx,m.y=e.starty,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.anchor="middle",m.valign="middle",m.tspan=!1,m.width=l||50,m.height=s||20,m.textMargin=a,m.class="labelText",Bye(d,m),m=$ye(),m.text=e.title,m.x=e.startx+l/2+(e.stopx-e.startx)/2,m.y=e.starty+i+a,m.anchor="middle",m.valign="middle",m.textMargin=a,m.class="loopText",m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=!0;let g=kn(m.text)?await w4(d,m,e):o0(d,m);if(e.sectionTitles!==void 0){for(let[y,v]of Object.entries(e.sectionTitles))if(v.message){m.text=v.message,m.x=e.startx+(e.stopx-e.startx)/2,m.y=e.sections[y].y+i+a,m.class="loopText",m.anchor="middle",m.valign="middle",m.tspan=!1,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=e.wrap,kn(m.text)?(e.starty=e.sections[y].y,await w4(d,m,e)):o0(d,m);let x=Math.round(g.map(b=>(b._groups||b)[0][0].getBBox().height).reduce((b,T)=>b+T));e.sections[y].height+=x-(i+a)}}return e.height=Math.round(e.stopy-e.starty),d},"drawLoop"),Fye=o(function(t,e){sT(t,e)},"drawBackgroundRect"),fJe=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),dJe=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),pJe=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),mJe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),gJe=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),yJe=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),vJe=o(function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),$ye=o(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),xJe=o(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),oh=(function(){function t(a,s,l,u,h,f,d){let p=s.append("text").attr("x",l+h/2).attr("y",u+f/2+5).style("text-anchor","middle").text(a);i(p,d)}o(t,"byText");function e(a,s,l,u,h,f,d,p){let{actorFontSize:m,actorFontFamily:g,actorFontWeight:y}=p,[v,x]=vc(m),b=a.split(tt.lineBreakRegex);for(let T=0;T{let s=l0(Me),l=a.actorKeys.reduce((d,p)=>d+=t.get(p).width+(t.get(p).margin||0),0),u=Me.boxMargin*8;l+=u,l-=2*Me.boxTextMargin,a.wrap&&(a.name=qt.wrapLabel(a.name,l-2*Me.wrapPadding,s));let h=qt.calculateTextDimensions(a.name,s);i=tt.getMax(h.height,i);let f=tt.getMax(l,h.width+2*Me.wrapPadding);if(a.margin=Me.boxTextMargin,la.textMaxHeight=i),tt.getMax(n,Me.height)}var Me,ot,TJe,l0,ay,n$,kJe,EJe,i$,Vye,Uye,rC,Gye,CJe,_Je,LJe,RJe,NJe,Hye,qye=N(()=>{"use strict";yr();zye();pt();gr();gr();r2();Xt();v0();tr();Ei();e$();Me={},ot={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:o(function(){return Math.max.apply(null,this.actors.length===0?[0]:this.actors.map(t=>t.height||0))+(this.loops.length===0?0:this.loops.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.messages.length===0?0:this.messages.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.notes.length===0?0:this.notes.map(t=>t.height||0).reduce((t,e)=>t+e))},"getHeight"),clear:o(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:o(function(t){this.boxes.push(t)},"addBox"),addActor:o(function(t){this.actors.push(t)},"addActor"),addLoop:o(function(t){this.loops.push(t)},"addLoop"),addMessage:o(function(t){this.messages.push(t)},"addMessage"),addNote:o(function(t){this.notes.push(t)},"addNote"),lastActor:o(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:o(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:o(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:o(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:o(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,Uye(ge())},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=this,a=0;function s(l){return o(function(h){a++;let f=i.sequenceItems.length-a+1;i.updateVal(h,"starty",e-f*Me.boxMargin,Math.min),i.updateVal(h,"stopy",n+f*Me.boxMargin,Math.max),i.updateVal(ot.data,"startx",t-f*Me.boxMargin,Math.min),i.updateVal(ot.data,"stopx",r+f*Me.boxMargin,Math.max),l!=="activation"&&(i.updateVal(h,"startx",t-f*Me.boxMargin,Math.min),i.updateVal(h,"stopx",r+f*Me.boxMargin,Math.max),i.updateVal(ot.data,"starty",e-f*Me.boxMargin,Math.min),i.updateVal(ot.data,"stopy",n+f*Me.boxMargin,Math.max))},"updateItemBounds")}o(s,"updateFn"),this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},"updateBounds"),insert:o(function(t,e,r,n){let i=tt.getMin(t,r),a=tt.getMax(t,r),s=tt.getMin(e,n),l=tt.getMax(e,n);this.updateVal(ot.data,"startx",i,Math.min),this.updateVal(ot.data,"starty",s,Math.min),this.updateVal(ot.data,"stopx",a,Math.max),this.updateVal(ot.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),newActivation:o(function(t,e,r){let n=r.get(t.from),i=rC(t.from).length||0,a=n.x+n.width/2+(i-1)*Me.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+Me.activationWidth,stopy:void 0,actor:t.from,anchored:mi.anchorElement(e)})},"newActivation"),endActivation:o(function(t){let e=this.activations.map(function(r){return r.actor}).lastIndexOf(t.from);return this.activations.splice(e,1)[0]},"endActivation"),createLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},"createLoop"),newLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},"newLoop"),endLoop:o(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:o(function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},"isLoopOverlap"),addSectionToLoop:o(function(t){let e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:ot.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},"addSectionToLoop"),saveVerticalPos:o(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:o(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=tt.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return{bounds:this.data,models:this.models}},"getBounds")},TJe=o(async function(t,e){ot.bumpVerticalPos(Me.boxMargin),e.height=Me.boxMargin,e.starty=ot.getVerticalPos();let r=ua();r.x=e.startx,r.y=e.starty,r.width=e.width||Me.width,r.class="note";let n=t.append("g"),i=mi.drawRect(n,r),a=t2();a.x=e.startx,a.y=e.starty,a.width=r.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=Me.noteFontFamily,a.fontSize=Me.noteFontSize,a.fontWeight=Me.noteFontWeight,a.anchor=Me.noteAlign,a.textMargin=Me.noteMargin,a.valign="center";let s=kn(a.text)?await w4(n,a):o0(n,a),l=Math.round(s.map(u=>(u._groups||u)[0][0].getBBox().height).reduce((u,h)=>u+h));i.attr("height",l+2*Me.noteMargin),e.height+=l+2*Me.noteMargin,ot.bumpVerticalPos(l+2*Me.noteMargin),e.stopy=e.starty+l+2*Me.noteMargin,e.stopx=e.startx+r.width,ot.insert(e.startx,e.starty,e.stopx,e.stopy),ot.models.addNote(e)},"drawNote"),l0=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont"),ay=o(t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),"noteFont"),n$=o(t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight}),"actorFont");o(wJe,"boundMessage");kJe=o(async function(t,e,r,n){let{startx:i,stopx:a,starty:s,message:l,type:u,sequenceIndex:h,sequenceVisible:f}=e,d=qt.calculateTextDimensions(l,l0(Me)),p=t2();p.x=i,p.y=s+10,p.width=a-i,p.class="messageText",p.dy="1em",p.text=l,p.fontFamily=Me.messageFontFamily,p.fontSize=Me.messageFontSize,p.fontWeight=Me.messageFontWeight,p.anchor=Me.messageAlign,p.valign="center",p.textMargin=Me.wrapPadding,p.tspan=!1,kn(p.text)?await w4(t,p,{startx:i,stopx:a,starty:r}):o0(t,p);let m=d.width,g;i===a?Me.rightAngles?g=t.append("path").attr("d",`M ${i},${r} H ${i+tt.getMax(Me.width/2,m/2)} V ${r+25} H ${i}`):g=t.append("path").attr("d","M "+i+","+r+" C "+(i+60)+","+(r-10)+" "+(i+60)+","+(r+30)+" "+i+","+(r+20)):(g=t.append("line"),g.attr("x1",i),g.attr("y1",r),g.attr("x2",a),g.attr("y2",r)),u===n.db.LINETYPE.DOTTED||u===n.db.LINETYPE.DOTTED_CROSS||u===n.db.LINETYPE.DOTTED_POINT||u===n.db.LINETYPE.DOTTED_OPEN||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED?(g.style("stroke-dasharray","3, 3"),g.attr("class","messageLine1")):g.attr("class","messageLine0");let y="";Me.arrowMarkerAbsolute&&(y=md(!0)),g.attr("stroke-width",2),g.attr("stroke","none"),g.style("fill","none"),(u===n.db.LINETYPE.SOLID||u===n.db.LINETYPE.DOTTED)&&g.attr("marker-end","url("+y+"#arrowhead)"),(u===n.db.LINETYPE.BIDIRECTIONAL_SOLID||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(g.attr("marker-start","url("+y+"#arrowhead)"),g.attr("marker-end","url("+y+"#arrowhead)")),(u===n.db.LINETYPE.SOLID_POINT||u===n.db.LINETYPE.DOTTED_POINT)&&g.attr("marker-end","url("+y+"#filled-head)"),(u===n.db.LINETYPE.SOLID_CROSS||u===n.db.LINETYPE.DOTTED_CROSS)&&g.attr("marker-end","url("+y+"#crosshead)"),(f||Me.showSequenceNumbers)&&((u===n.db.LINETYPE.BIDIRECTIONAL_SOLID||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(ii&&(i=h.height),h.width+l.x>a&&(a=h.width+l.x)}return{maxHeight:i,maxWidth:a}},"drawActorsPopup"),Uye=o(function(t){Rn(Me,t),t.fontFamily&&(Me.actorFontFamily=Me.noteFontFamily=Me.messageFontFamily=t.fontFamily),t.fontSize&&(Me.actorFontSize=Me.noteFontSize=Me.messageFontSize=t.fontSize),t.fontWeight&&(Me.actorFontWeight=Me.noteFontWeight=Me.messageFontWeight=t.fontWeight)},"setConf"),rC=o(function(t){return ot.activations.filter(function(e){return e.actor===t})},"actorActivations"),Gye=o(function(t,e){let r=e.get(t),n=rC(t),i=n.reduce(function(s,l){return tt.getMin(s,l.startx)},r.x+r.width/2-1),a=n.reduce(function(s,l){return tt.getMax(s,l.stopx)},r.x+r.width/2+1);return[i,a]},"activationBounds");o(ru,"adjustLoopHeightForWrap");o(SJe,"adjustCreatedDestroyedData");CJe=o(async function(t,e,r,n){let{securityLevel:i,sequence:a}=ge();Me=a;let s;i==="sandbox"&&(s=qe("#i"+e));let l=i==="sandbox"?qe(s.nodes()[0].contentDocument.body):qe("body"),u=i==="sandbox"?s.nodes()[0].contentDocument:document;ot.init(),X.debug(n.db);let h=i==="sandbox"?l.select(`[id="${e}"]`):qe(`[id="${e}"]`),f=n.db.getActors(),d=n.db.getCreatedActors(),p=n.db.getDestroyedActors(),m=n.db.getBoxes(),g=n.db.getActorKeys(),y=n.db.getMessages(),v=n.db.getDiagramTitle(),x=n.db.hasAtLeastOneBox(),b=n.db.hasAtLeastOneBoxWithTitle(),T=await AJe(f,y,n);if(Me.height=await DJe(f,T,m),mi.insertComputerIcon(h),mi.insertDatabaseIcon(h),mi.insertClockIcon(h),x&&(ot.bumpVerticalPos(Me.boxMargin),b&&ot.bumpVerticalPos(m[0].textMaxHeight)),Me.hideUnusedParticipants===!0){let B=new Set;y.forEach(F=>{B.add(F.from),B.add(F.to)}),g=g.filter(F=>B.has(F))}EJe(h,f,d,g,0,y,!1);let S=await NJe(y,f,T,n);mi.insertArrowHead(h),mi.insertArrowCrossHead(h),mi.insertArrowFilledHead(h),mi.insertSequenceNumber(h);function w(B,F){let G=ot.endActivation(B);G.starty+18>F&&(G.starty=F-6,F+=12),mi.drawActivation(h,G,F,Me,rC(B.from).length),ot.insert(G.startx,F-10,G.stopx,F)}o(w,"activeEnd");let k=1,A=1,C=[],R=[],I=0;for(let B of y){let F,G,$;switch(B.type){case n.db.LINETYPE.NOTE:ot.resetVerticalPos(),G=B.noteModel,await TJe(h,G);break;case n.db.LINETYPE.ACTIVE_START:ot.newActivation(B,h,f);break;case n.db.LINETYPE.ACTIVE_END:w(B,ot.getVerticalPos());break;case n.db.LINETYPE.LOOP_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.LOOP_END:F=ot.endLoop(),await mi.drawLoop(h,F,"loop",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.RECT_START:ru(S,B,Me.boxMargin,Me.boxMargin,U=>ot.newLoop(void 0,U.message));break;case n.db.LINETYPE.RECT_END:F=ot.endLoop(),R.push(F),ot.models.addLoop(F),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos());break;case n.db.LINETYPE.OPT_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.OPT_END:F=ot.endLoop(),await mi.drawLoop(h,F,"opt",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.ALT_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.ALT_ELSE:ru(S,B,Me.boxMargin+Me.boxTextMargin,Me.boxMargin,U=>ot.addSectionToLoop(U));break;case n.db.LINETYPE.ALT_END:F=ot.endLoop(),await mi.drawLoop(h,F,"alt",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U)),ot.saveVerticalPos();break;case n.db.LINETYPE.PAR_AND:ru(S,B,Me.boxMargin+Me.boxTextMargin,Me.boxMargin,U=>ot.addSectionToLoop(U));break;case n.db.LINETYPE.PAR_END:F=ot.endLoop(),await mi.drawLoop(h,F,"par",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.AUTONUMBER:k=B.message.start||k,A=B.message.step||A,B.message.visible?n.db.enableSequenceNumbers():n.db.disableSequenceNumbers();break;case n.db.LINETYPE.CRITICAL_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.CRITICAL_OPTION:ru(S,B,Me.boxMargin+Me.boxTextMargin,Me.boxMargin,U=>ot.addSectionToLoop(U));break;case n.db.LINETYPE.CRITICAL_END:F=ot.endLoop(),await mi.drawLoop(h,F,"critical",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.BREAK_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.BREAK_END:F=ot.endLoop(),await mi.drawLoop(h,F,"break",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;default:try{$=B.msgModel,$.starty=ot.getVerticalPos(),$.sequenceIndex=k,$.sequenceVisible=n.db.showSequenceNumbers();let U=await wJe(h,$);SJe(B,$,U,I,f,d,p),C.push({messageModel:$,lineStartY:U}),ot.models.addMessage($)}catch(U){X.error("error while drawing message",U)}}[n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT,n.db.LINETYPE.BIDIRECTIONAL_SOLID,n.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(B.type)&&(k=k+A),I++}X.debug("createdActors",d),X.debug("destroyedActors",p),await i$(h,f,g,!1);for(let B of C)await kJe(h,B.messageModel,B.lineStartY,n);Me.mirrorActors&&await i$(h,f,g,!0),R.forEach(B=>mi.drawBackgroundRect(h,B)),r$(h,f,g,Me);for(let B of ot.models.boxes){B.height=ot.getVerticalPos()-B.y,ot.insert(B.x,B.y,B.x+B.width,B.height);let F=Me.boxMargin*2;B.startx=B.x-F,B.starty=B.y-F*.25,B.stopx=B.startx+B.width+2*F,B.stopy=B.starty+B.height+F*.75,B.stroke="rgb(0,0,0, 0.5)",mi.drawBox(h,B,Me)}x&&ot.bumpVerticalPos(Me.boxMargin);let L=Vye(h,f,g,u),{bounds:E}=ot.getBounds();E.startx===void 0&&(E.startx=0),E.starty===void 0&&(E.starty=0),E.stopx===void 0&&(E.stopx=0),E.stopy===void 0&&(E.stopy=0);let D=E.stopy-E.starty;D2,d=o(y=>l?-y:y,"adjustValue");t.from===t.to?h=u:(t.activate&&!f&&(h+=d(Me.activationWidth/2-1)),[r.db.LINETYPE.SOLID_OPEN,r.db.LINETYPE.DOTTED_OPEN].includes(t.type)||(h+=d(3)),[r.db.LINETYPE.BIDIRECTIONAL_SOLID,r.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(t.type)&&(u-=d(3)));let p=[n,i,a,s],m=Math.abs(u-h);t.wrap&&t.message&&(t.message=qt.wrapLabel(t.message,tt.getMax(m+2*Me.wrapPadding,Me.width),l0(Me)));let g=qt.calculateTextDimensions(t.message,l0(Me));return{width:tt.getMax(t.wrap?0:g.width+2*Me.wrapPadding,m+2*Me.wrapPadding,Me.width),height:0,startx:u,stopx:h,starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,p),toBounds:Math.max.apply(null,p)}},"buildMessageModel"),NJe=o(async function(t,e,r,n){let i={},a=[],s,l,u;for(let h of t){switch(h.type){case n.db.LINETYPE.LOOP_START:case n.db.LINETYPE.ALT_START:case n.db.LINETYPE.OPT_START:case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:case n.db.LINETYPE.CRITICAL_START:case n.db.LINETYPE.BREAK_START:a.push({id:h.id,msg:h.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case n.db.LINETYPE.ALT_ELSE:case n.db.LINETYPE.PAR_AND:case n.db.LINETYPE.CRITICAL_OPTION:h.message&&(s=a.pop(),i[s.id]=s,i[h.id]=s,a.push(s));break;case n.db.LINETYPE.LOOP_END:case n.db.LINETYPE.ALT_END:case n.db.LINETYPE.OPT_END:case n.db.LINETYPE.PAR_END:case n.db.LINETYPE.CRITICAL_END:case n.db.LINETYPE.BREAK_END:s=a.pop(),i[s.id]=s;break;case n.db.LINETYPE.ACTIVE_START:{let d=e.get(h.from?h.from:h.to.actor),p=rC(h.from?h.from:h.to.actor).length,m=d.x+d.width/2+(p-1)*Me.activationWidth/2,g={startx:m,stopx:m+Me.activationWidth,actor:h.from,enabled:!0};ot.activations.push(g)}break;case n.db.LINETYPE.ACTIVE_END:{let d=ot.activations.map(p=>p.actor).lastIndexOf(h.from);ot.activations.splice(d,1).splice(0,1)}break}h.placement!==void 0?(l=await LJe(h,e,n),h.noteModel=l,a.forEach(d=>{s=d,s.from=tt.getMin(s.from,l.startx),s.to=tt.getMax(s.to,l.startx+l.width),s.width=tt.getMax(s.width,Math.abs(s.from-s.to))-Me.labelBoxWidth})):(u=RJe(h,e,n),h.msgModel=u,u.startx&&u.stopx&&a.length>0&&a.forEach(d=>{if(s=d,u.startx===u.stopx){let p=e.get(h.from),m=e.get(h.to);s.from=tt.getMin(p.x-u.width/2,p.x-p.width/2,s.from),s.to=tt.getMax(m.x+u.width/2,m.x+p.width/2,s.to),s.width=tt.getMax(s.width,Math.abs(s.to-s.from))-Me.labelBoxWidth}else s.from=tt.getMin(u.startx,s.from),s.to=tt.getMax(u.stopx,s.to),s.width=tt.getMax(s.width,u.width)-Me.labelBoxWidth}))}return ot.activations=[],X.debug("Loop type widths:",i),i},"calculateLoopBounds"),Hye={bounds:ot,drawActors:i$,drawActorsPopup:Vye,setConf:Uye,draw:CJe}});var Wye={};dr(Wye,{diagram:()=>MJe});var MJe,Yye=N(()=>{"use strict";Iye();e$();Pye();Xt();qye();MJe={parser:Mye,get db(){return new J6},renderer:Hye,styles:Oye,init:o(t=>{t.sequence||(t.sequence={}),t.wrap&&(t.sequence.wrap=t.wrap,nv({sequence:{wrap:t.wrap}}))},"init")}});var a$,nC,s$=N(()=>{"use strict";a$=(function(){var t=o(function(Ie,Ne,Ce,Fe){for(Ce=Ce||{},Fe=Ie.length;Fe--;Ce[Ie[Fe]]=Ne);return Ce},"o"),e=[1,18],r=[1,19],n=[1,20],i=[1,41],a=[1,42],s=[1,26],l=[1,24],u=[1,25],h=[1,32],f=[1,33],d=[1,34],p=[1,45],m=[1,35],g=[1,36],y=[1,37],v=[1,38],x=[1,27],b=[1,28],T=[1,29],S=[1,30],w=[1,31],k=[1,44],A=[1,46],C=[1,43],R=[1,47],I=[1,9],L=[1,8,9],E=[1,58],D=[1,59],_=[1,60],O=[1,61],M=[1,62],P=[1,63],B=[1,64],F=[1,8,9,41],G=[1,76],$=[1,8,9,12,13,22,39,41,44,68,69,70,71,72,73,74,79,81],U=[1,8,9,12,13,18,20,22,39,41,44,50,60,68,69,70,71,72,73,74,79,81,86,100,102,103],j=[13,60,86,100,102,103],te=[13,60,73,74,86,100,102,103],Y=[13,60,68,69,70,71,72,86,100,102,103],oe=[1,100],J=[1,117],ue=[1,113],re=[1,109],ee=[1,115],Z=[1,110],K=[1,111],ae=[1,112],Q=[1,114],de=[1,116],ne=[22,48,60,61,82,86,87,88,89,90],Te=[1,8,9,39,41,44],q=[1,8,9,22],Ve=[1,145],pe=[1,8,9,61],Be=[1,8,9,22,48,60,61,82,86,87,88,89,90],Ye={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,classLiteralName:17,DOT:18,className:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,emptyBody:47,SPACE:48,ANNOTATION_START:49,ANNOTATION_END:50,MEMBER:51,SEPARATOR:52,relation:53,NOTE_FOR:54,noteText:55,NOTE:56,CLASSDEF:57,classList:58,stylesOpt:59,ALPHA:60,COMMA:61,direction_tb:62,direction_bt:63,direction_rl:64,direction_lr:65,relationType:66,lineType:67,AGGREGATION:68,EXTENSION:69,COMPOSITION:70,DEPENDENCY:71,LOLLIPOP:72,LINE:73,DOTTED_LINE:74,CALLBACK:75,LINK:76,LINK_TARGET:77,CLICK:78,CALLBACK_NAME:79,CALLBACK_ARGS:80,HREF:81,STYLE:82,CSSCLASS:83,style:84,styleComponent:85,NUM:86,COLON:87,UNIT:88,BRKT:89,PCT:90,commentToken:91,textToken:92,graphCodeTokens:93,textNoTagsToken:94,TAGSTART:95,TAGEND:96,"==":97,"--":98,DEFAULT:99,MINUS:100,keywords:101,UNICODE_TEXT:102,BQUOTE_STR:103,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",18:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",48:"SPACE",49:"ANNOTATION_START",50:"ANNOTATION_END",51:"MEMBER",52:"SEPARATOR",54:"NOTE_FOR",56:"NOTE",57:"CLASSDEF",60:"ALPHA",61:"COMMA",62:"direction_tb",63:"direction_bt",64:"direction_rl",65:"direction_lr",68:"AGGREGATION",69:"EXTENSION",70:"COMPOSITION",71:"DEPENDENCY",72:"LOLLIPOP",73:"LINE",74:"DOTTED_LINE",75:"CALLBACK",76:"LINK",77:"LINK_TARGET",78:"CLICK",79:"CALLBACK_NAME",80:"CALLBACK_ARGS",81:"HREF",82:"STYLE",83:"CSSCLASS",86:"NUM",87:"COLON",88:"UNIT",89:"BRKT",90:"PCT",93:"graphCodeTokens",95:"TAGSTART",96:"TAGEND",97:"==",98:"--",99:"DEFAULT",100:"MINUS",101:"keywords",102:"UNICODE_TEXT",103:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,1],[15,3],[15,2],[19,1],[19,3],[19,1],[19,2],[19,2],[19,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,3],[24,6],[43,2],[43,3],[47,0],[47,2],[47,2],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[58,1],[58,3],[32,1],[32,1],[32,1],[32,1],[53,3],[53,2],[53,2],[53,1],[66,1],[66,1],[66,1],[66,1],[66,1],[67,1],[67,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[59,1],[59,3],[84,1],[84,2],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[91,1],[91,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[94,1],[94,1],[94,1],[94,1],[16,1],[16,1],[16,1],[16,1],[17,1],[55,1]],performAction:o(function(Ne,Ce,Fe,fe,xe,W,he){var z=W.length-1;switch(xe){case 8:this.$=W[z-1];break;case 9:case 10:case 13:case 15:this.$=W[z];break;case 11:case 14:this.$=W[z-2]+"."+W[z];break;case 12:case 16:this.$=W[z-1]+W[z];break;case 17:case 18:this.$=W[z-1]+"~"+W[z]+"~";break;case 19:fe.addRelation(W[z]);break;case 20:W[z-1].title=fe.cleanupLabel(W[z]),fe.addRelation(W[z-1]);break;case 31:this.$=W[z].trim(),fe.setAccTitle(this.$);break;case 32:case 33:this.$=W[z].trim(),fe.setAccDescription(this.$);break;case 34:fe.addClassesToNamespace(W[z-3],W[z-1]);break;case 35:fe.addClassesToNamespace(W[z-4],W[z-1]);break;case 36:this.$=W[z],fe.addNamespace(W[z]);break;case 37:this.$=[W[z]];break;case 38:this.$=[W[z-1]];break;case 39:W[z].unshift(W[z-2]),this.$=W[z];break;case 41:fe.setCssClass(W[z-2],W[z]);break;case 42:fe.addMembers(W[z-3],W[z-1]);break;case 44:fe.setCssClass(W[z-5],W[z-3]),fe.addMembers(W[z-5],W[z-1]);break;case 45:this.$=W[z],fe.addClass(W[z]);break;case 46:this.$=W[z-1],fe.addClass(W[z-1]),fe.setClassLabel(W[z-1],W[z]);break;case 50:fe.addAnnotation(W[z],W[z-2]);break;case 51:case 64:this.$=[W[z]];break;case 52:W[z].push(W[z-1]),this.$=W[z];break;case 53:break;case 54:fe.addMember(W[z-1],fe.cleanupLabel(W[z]));break;case 55:break;case 56:break;case 57:this.$={id1:W[z-2],id2:W[z],relation:W[z-1],relationTitle1:"none",relationTitle2:"none"};break;case 58:this.$={id1:W[z-3],id2:W[z],relation:W[z-1],relationTitle1:W[z-2],relationTitle2:"none"};break;case 59:this.$={id1:W[z-3],id2:W[z],relation:W[z-2],relationTitle1:"none",relationTitle2:W[z-1]};break;case 60:this.$={id1:W[z-4],id2:W[z],relation:W[z-2],relationTitle1:W[z-3],relationTitle2:W[z-1]};break;case 61:fe.addNote(W[z],W[z-1]);break;case 62:fe.addNote(W[z]);break;case 63:this.$=W[z-2],fe.defineClass(W[z-1],W[z]);break;case 65:this.$=W[z-2].concat([W[z]]);break;case 66:fe.setDirection("TB");break;case 67:fe.setDirection("BT");break;case 68:fe.setDirection("RL");break;case 69:fe.setDirection("LR");break;case 70:this.$={type1:W[z-2],type2:W[z],lineType:W[z-1]};break;case 71:this.$={type1:"none",type2:W[z],lineType:W[z-1]};break;case 72:this.$={type1:W[z-1],type2:"none",lineType:W[z]};break;case 73:this.$={type1:"none",type2:"none",lineType:W[z]};break;case 74:this.$=fe.relationType.AGGREGATION;break;case 75:this.$=fe.relationType.EXTENSION;break;case 76:this.$=fe.relationType.COMPOSITION;break;case 77:this.$=fe.relationType.DEPENDENCY;break;case 78:this.$=fe.relationType.LOLLIPOP;break;case 79:this.$=fe.lineType.LINE;break;case 80:this.$=fe.lineType.DOTTED_LINE;break;case 81:case 87:this.$=W[z-2],fe.setClickEvent(W[z-1],W[z]);break;case 82:case 88:this.$=W[z-3],fe.setClickEvent(W[z-2],W[z-1]),fe.setTooltip(W[z-2],W[z]);break;case 83:this.$=W[z-2],fe.setLink(W[z-1],W[z]);break;case 84:this.$=W[z-3],fe.setLink(W[z-2],W[z-1],W[z]);break;case 85:this.$=W[z-3],fe.setLink(W[z-2],W[z-1]),fe.setTooltip(W[z-2],W[z]);break;case 86:this.$=W[z-4],fe.setLink(W[z-3],W[z-2],W[z]),fe.setTooltip(W[z-3],W[z-1]);break;case 89:this.$=W[z-3],fe.setClickEvent(W[z-2],W[z-1],W[z]);break;case 90:this.$=W[z-4],fe.setClickEvent(W[z-3],W[z-2],W[z-1]),fe.setTooltip(W[z-3],W[z]);break;case 91:this.$=W[z-3],fe.setLink(W[z-2],W[z]);break;case 92:this.$=W[z-4],fe.setLink(W[z-3],W[z-1],W[z]);break;case 93:this.$=W[z-4],fe.setLink(W[z-3],W[z-1]),fe.setTooltip(W[z-3],W[z]);break;case 94:this.$=W[z-5],fe.setLink(W[z-4],W[z-2],W[z]),fe.setTooltip(W[z-4],W[z-1]);break;case 95:this.$=W[z-2],fe.setCssStyle(W[z-1],W[z]);break;case 96:fe.setCssClass(W[z-1],W[z]);break;case 97:this.$=[W[z]];break;case 98:W[z-2].push(W[z]),this.$=W[z-2];break;case 100:this.$=W[z-1]+W[z];break}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,49:s,51:l,52:u,54:h,56:f,57:d,60:p,62:m,63:g,64:y,65:v,75:x,76:b,78:T,82:S,83:w,86:k,100:A,102:C,103:R},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},t(I,[2,5],{8:[1,48]}),{8:[1,49]},t(L,[2,19],{22:[1,50]}),t(L,[2,21]),t(L,[2,22]),t(L,[2,23]),t(L,[2,24]),t(L,[2,25]),t(L,[2,26]),t(L,[2,27]),t(L,[2,28]),t(L,[2,29]),t(L,[2,30]),{34:[1,51]},{36:[1,52]},t(L,[2,33]),t(L,[2,53],{53:53,66:56,67:57,13:[1,54],22:[1,55],68:E,69:D,70:_,71:O,72:M,73:P,74:B}),{39:[1,65]},t(F,[2,40],{39:[1,67],44:[1,66]}),t(L,[2,55]),t(L,[2,56]),{16:68,60:p,86:k,100:A,102:C},{16:39,17:40,19:69,60:p,86:k,100:A,102:C,103:R},{16:39,17:40,19:70,60:p,86:k,100:A,102:C,103:R},{16:39,17:40,19:71,60:p,86:k,100:A,102:C,103:R},{60:[1,72]},{13:[1,73]},{16:39,17:40,19:74,60:p,86:k,100:A,102:C,103:R},{13:G,55:75},{58:77,60:[1,78]},t(L,[2,66]),t(L,[2,67]),t(L,[2,68]),t(L,[2,69]),t($,[2,13],{16:39,17:40,19:80,18:[1,79],20:[1,81],60:p,86:k,100:A,102:C,103:R}),t($,[2,15],{20:[1,82]}),{15:83,16:84,17:85,60:p,86:k,100:A,102:C,103:R},{16:39,17:40,19:86,60:p,86:k,100:A,102:C,103:R},t(U,[2,123]),t(U,[2,124]),t(U,[2,125]),t(U,[2,126]),t([1,8,9,12,13,20,22,39,41,44,68,69,70,71,72,73,74,79,81],[2,127]),t(I,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,19:21,38:22,43:23,16:39,17:40,5:87,33:e,35:r,37:n,42:i,46:a,49:s,51:l,52:u,54:h,56:f,57:d,60:p,62:m,63:g,64:y,65:v,75:x,76:b,78:T,82:S,83:w,86:k,100:A,102:C,103:R}),{5:88,10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,49:s,51:l,52:u,54:h,56:f,57:d,60:p,62:m,63:g,64:y,65:v,75:x,76:b,78:T,82:S,83:w,86:k,100:A,102:C,103:R},t(L,[2,20]),t(L,[2,31]),t(L,[2,32]),{13:[1,90],16:39,17:40,19:89,60:p,86:k,100:A,102:C,103:R},{53:91,66:56,67:57,68:E,69:D,70:_,71:O,72:M,73:P,74:B},t(L,[2,54]),{67:92,73:P,74:B},t(j,[2,73],{66:93,68:E,69:D,70:_,71:O,72:M}),t(te,[2,74]),t(te,[2,75]),t(te,[2,76]),t(te,[2,77]),t(te,[2,78]),t(Y,[2,79]),t(Y,[2,80]),{8:[1,95],24:96,40:94,43:23,46:a},{16:97,60:p,86:k,100:A,102:C},{41:[1,99],45:98,51:oe},{50:[1,101]},{13:[1,102]},{13:[1,103]},{79:[1,104],81:[1,105]},{22:J,48:ue,59:106,60:re,82:ee,84:107,85:108,86:Z,87:K,88:ae,89:Q,90:de},{60:[1,118]},{13:G,55:119},t(L,[2,62]),t(L,[2,128]),{22:J,48:ue,59:120,60:re,61:[1,121],82:ee,84:107,85:108,86:Z,87:K,88:ae,89:Q,90:de},t(ne,[2,64]),{16:39,17:40,19:122,60:p,86:k,100:A,102:C,103:R},t($,[2,16]),t($,[2,17]),t($,[2,18]),{39:[2,36]},{15:124,16:84,17:85,18:[1,123],39:[2,9],60:p,86:k,100:A,102:C,103:R},{39:[2,10]},t(Te,[2,45],{11:125,12:[1,126]}),t(I,[2,7]),{9:[1,127]},t(q,[2,57]),{16:39,17:40,19:128,60:p,86:k,100:A,102:C,103:R},{13:[1,130],16:39,17:40,19:129,60:p,86:k,100:A,102:C,103:R},t(j,[2,72],{66:131,68:E,69:D,70:_,71:O,72:M}),t(j,[2,71]),{41:[1,132]},{24:96,40:133,43:23,46:a},{8:[1,134],41:[2,37]},t(F,[2,41],{39:[1,135]}),{41:[1,136]},t(F,[2,43]),{41:[2,51],45:137,51:oe},{16:39,17:40,19:138,60:p,86:k,100:A,102:C,103:R},t(L,[2,81],{13:[1,139]}),t(L,[2,83],{13:[1,141],77:[1,140]}),t(L,[2,87],{13:[1,142],80:[1,143]}),{13:[1,144]},t(L,[2,95],{61:Ve}),t(pe,[2,97],{85:146,22:J,48:ue,60:re,82:ee,86:Z,87:K,88:ae,89:Q,90:de}),t(Be,[2,99]),t(Be,[2,101]),t(Be,[2,102]),t(Be,[2,103]),t(Be,[2,104]),t(Be,[2,105]),t(Be,[2,106]),t(Be,[2,107]),t(Be,[2,108]),t(Be,[2,109]),t(L,[2,96]),t(L,[2,61]),t(L,[2,63],{61:Ve}),{60:[1,147]},t($,[2,14]),{15:148,16:84,17:85,60:p,86:k,100:A,102:C,103:R},{39:[2,12]},t(Te,[2,46]),{13:[1,149]},{1:[2,4]},t(q,[2,59]),t(q,[2,58]),{16:39,17:40,19:150,60:p,86:k,100:A,102:C,103:R},t(j,[2,70]),t(L,[2,34]),{41:[1,151]},{24:96,40:152,41:[2,38],43:23,46:a},{45:153,51:oe},t(F,[2,42]),{41:[2,52]},t(L,[2,50]),t(L,[2,82]),t(L,[2,84]),t(L,[2,85],{77:[1,154]}),t(L,[2,88]),t(L,[2,89],{13:[1,155]}),t(L,[2,91],{13:[1,157],77:[1,156]}),{22:J,48:ue,60:re,82:ee,84:158,85:108,86:Z,87:K,88:ae,89:Q,90:de},t(Be,[2,100]),t(ne,[2,65]),{39:[2,11]},{14:[1,159]},t(q,[2,60]),t(L,[2,35]),{41:[2,39]},{41:[1,160]},t(L,[2,86]),t(L,[2,90]),t(L,[2,92]),t(L,[2,93],{77:[1,161]}),t(pe,[2,98],{85:146,22:J,48:ue,60:re,82:ee,86:Z,87:K,88:ae,89:Q,90:de}),t(Te,[2,8]),t(F,[2,44]),t(L,[2,94])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,36],85:[2,10],124:[2,12],127:[2,4],137:[2,52],148:[2,11],152:[2,39]},parseError:o(function(Ne,Ce){if(Ce.recoverable)this.trace(Ne);else{var Fe=new Error(Ne);throw Fe.hash=Ce,Fe}},"parseError"),parse:o(function(Ne){var Ce=this,Fe=[0],fe=[],xe=[null],W=[],he=this.table,z="",se=0,le=0,ke=0,ve=2,ye=1,Re=W.slice.call(arguments,1),_e=Object.create(this.lexer),ze={yy:{}};for(var Ke in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ke)&&(ze.yy[Ke]=this.yy[Ke]);_e.setInput(Ne,ze.yy),ze.yy.lexer=_e,ze.yy.parser=this,typeof _e.yylloc>"u"&&(_e.yylloc={});var xt=_e.yylloc;W.push(xt);var We=_e.options&&_e.options.ranges;typeof ze.yy.parseError=="function"?this.parseError=ze.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Oe(_t){Fe.length=Fe.length-2*_t,xe.length=xe.length-_t,W.length=W.length-_t}o(Oe,"popStack");function et(){var _t;return _t=fe.pop()||_e.lex()||ye,typeof _t!="number"&&(_t instanceof Array&&(fe=_t,_t=fe.pop()),_t=Ce.symbols_[_t]||_t),_t}o(et,"lex");for(var Ue,lt,Gt,vt,Lt,dt,nt={},bt,wt,yt,ft;;){if(Gt=Fe[Fe.length-1],this.defaultActions[Gt]?vt=this.defaultActions[Gt]:((Ue===null||typeof Ue>"u")&&(Ue=et()),vt=he[Gt]&&he[Gt][Ue]),typeof vt>"u"||!vt.length||!vt[0]){var Ur="";ft=[];for(bt in he[Gt])this.terminals_[bt]&&bt>ve&&ft.push("'"+this.terminals_[bt]+"'");_e.showPosition?Ur="Parse error on line "+(se+1)+`: +`+_e.showPosition()+` +Expecting `+ft.join(", ")+", got '"+(this.terminals_[Ue]||Ue)+"'":Ur="Parse error on line "+(se+1)+": Unexpected "+(Ue==ye?"end of input":"'"+(this.terminals_[Ue]||Ue)+"'"),this.parseError(Ur,{text:_e.match,token:this.terminals_[Ue]||Ue,line:_e.yylineno,loc:xt,expected:ft})}if(vt[0]instanceof Array&&vt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Gt+", token: "+Ue);switch(vt[0]){case 1:Fe.push(Ue),xe.push(_e.yytext),W.push(_e.yylloc),Fe.push(vt[1]),Ue=null,lt?(Ue=lt,lt=null):(le=_e.yyleng,z=_e.yytext,se=_e.yylineno,xt=_e.yylloc,ke>0&&ke--);break;case 2:if(wt=this.productions_[vt[1]][1],nt.$=xe[xe.length-wt],nt._$={first_line:W[W.length-(wt||1)].first_line,last_line:W[W.length-1].last_line,first_column:W[W.length-(wt||1)].first_column,last_column:W[W.length-1].last_column},We&&(nt._$.range=[W[W.length-(wt||1)].range[0],W[W.length-1].range[1]]),dt=this.performAction.apply(nt,[z,le,se,ze.yy,vt[1],xe,W].concat(Re)),typeof dt<"u")return dt;wt&&(Fe=Fe.slice(0,-1*wt*2),xe=xe.slice(0,-1*wt),W=W.slice(0,-1*wt)),Fe.push(this.productions_[vt[1]][0]),xe.push(nt.$),W.push(nt._$),yt=he[Fe[Fe.length-2]][Fe[Fe.length-1]],Fe.push(yt);break;case 3:return!0}}return!0},"parse")},He=(function(){var Ie={EOF:1,parseError:o(function(Ce,Fe){if(this.yy.parser)this.yy.parser.parseError(Ce,Fe);else throw new Error(Ce)},"parseError"),setInput:o(function(Ne,Ce){return this.yy=Ce||this.yy||{},this._input=Ne,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Ne=this._input[0];this.yytext+=Ne,this.yyleng++,this.offset++,this.match+=Ne,this.matched+=Ne;var Ce=Ne.match(/(?:\r\n?|\n).*/g);return Ce?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Ne},"input"),unput:o(function(Ne){var Ce=Ne.length,Fe=Ne.split(/(?:\r\n?|\n)/g);this._input=Ne+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ce),this.offset-=Ce;var fe=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Fe.length-1&&(this.yylineno-=Fe.length-1);var xe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Fe?(Fe.length===fe.length?this.yylloc.first_column:0)+fe[fe.length-Fe.length].length-Fe[0].length:this.yylloc.first_column-Ce},this.options.ranges&&(this.yylloc.range=[xe[0],xe[0]+this.yyleng-Ce]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Ne){this.unput(this.match.slice(Ne))},"less"),pastInput:o(function(){var Ne=this.matched.substr(0,this.matched.length-this.match.length);return(Ne.length>20?"...":"")+Ne.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Ne=this.match;return Ne.length<20&&(Ne+=this._input.substr(0,20-Ne.length)),(Ne.substr(0,20)+(Ne.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Ne=this.pastInput(),Ce=new Array(Ne.length+1).join("-");return Ne+this.upcomingInput()+` +`+Ce+"^"},"showPosition"),test_match:o(function(Ne,Ce){var Fe,fe,xe;if(this.options.backtrack_lexer&&(xe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(xe.yylloc.range=this.yylloc.range.slice(0))),fe=Ne[0].match(/(?:\r\n?|\n).*/g),fe&&(this.yylineno+=fe.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:fe?fe[fe.length-1].length-fe[fe.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Ne[0].length},this.yytext+=Ne[0],this.match+=Ne[0],this.matches=Ne,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Ne[0].length),this.matched+=Ne[0],Fe=this.performAction.call(this,this.yy,this,Ce,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Fe)return Fe;if(this._backtrack){for(var W in xe)this[W]=xe[W];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Ne,Ce,Fe,fe;this._more||(this.yytext="",this.match="");for(var xe=this._currentRules(),W=0;WCe[0].length)){if(Ce=Fe,fe=W,this.options.backtrack_lexer){if(Ne=this.test_match(Fe,xe[W]),Ne!==!1)return Ne;if(this._backtrack){Ce=!1;continue}else return!1}else if(!this.options.flex)break}return Ce?(Ne=this.test_match(Ce,xe[fe]),Ne!==!1?Ne:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ce=this.next();return Ce||this.lex()},"lex"),begin:o(function(Ce){this.conditionStack.push(Ce)},"begin"),popState:o(function(){var Ce=this.conditionStack.length-1;return Ce>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ce){return Ce=this.conditionStack.length-1-Math.abs(Ce||0),Ce>=0?this.conditionStack[Ce]:"INITIAL"},"topState"),pushState:o(function(Ce){this.begin(Ce)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Ce,Fe,fe,xe){var W=xe;switch(fe){case 0:return 62;case 1:return 63;case 2:return 64;case 3:return 65;case 4:break;case 5:break;case 6:return this.begin("acc_title"),33;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),35;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 79;case 22:this.popState();break;case 23:return 80;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return 82;case 28:return 57;case 29:return this.begin("namespace"),42;break;case 30:return this.popState(),8;break;case 31:break;case 32:return this.begin("namespace-body"),39;break;case 33:return this.popState(),41;break;case 34:return"EOF_IN_STRUCT";case 35:return 8;case 36:break;case 37:return"EDGE_STATE";case 38:return this.begin("class"),46;break;case 39:return this.popState(),8;break;case 40:break;case 41:return this.popState(),this.popState(),41;break;case 42:return this.begin("class-body"),39;break;case 43:return this.popState(),41;break;case 44:return"EOF_IN_STRUCT";case 45:return"EDGE_STATE";case 46:return"OPEN_IN_STRUCT";case 47:break;case 48:return"MEMBER";case 49:return 83;case 50:return 75;case 51:return 76;case 52:return 78;case 53:return 54;case 54:return 56;case 55:return 49;case 56:return 50;case 57:return 81;case 58:this.popState();break;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 61:this.popState();break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:return 77;case 65:return 77;case 66:return 77;case 67:return 77;case 68:return 69;case 69:return 69;case 70:return 71;case 71:return 71;case 72:return 70;case 73:return 68;case 74:return 72;case 75:return 73;case 76:return 74;case 77:return 22;case 78:return 44;case 79:return 100;case 80:return 18;case 81:return"PLUS";case 82:return 87;case 83:return 61;case 84:return 89;case 85:return 89;case 86:return 90;case 87:return"EQUALS";case 88:return"EQUALS";case 89:return 60;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 86;case 94:return 102;case 95:return 48;case 96:return 48;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}};return Ie})();Ye.lexer=He;function Le(){this.yy={}}return o(Le,"Parser"),Le.prototype=Ye,Ye.Parser=Le,new Le})();a$.parser=a$;nC=a$});var Kye,k4,Qye=N(()=>{"use strict";Xt();gr();Kye=["#","+","~","-",""],k4=class{static{o(this,"ClassMember")}constructor(e,r){this.memberType=r,this.visibility="",this.classifier="",this.text="";let n=sr(e,ge());this.parseMember(n)}getDisplayDetails(){let e=this.visibility+rc(this.id);this.memberType==="method"&&(e+=`(${rc(this.parameters.trim())})`,this.returnType&&(e+=" : "+rc(this.returnType))),e=e.trim();let r=this.parseClassifier();return{displayText:e,cssStyle:r}}parseMember(e){let r="";if(this.memberType==="method"){let a=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(e);if(a){let s=a[1]?a[1].trim():"";if(Kye.includes(s)&&(this.visibility=s),this.id=a[2],this.parameters=a[3]?a[3].trim():"",r=a[4]?a[4].trim():"",this.returnType=a[5]?a[5].trim():"",r===""){let l=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(l)&&(r=l,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{let i=e.length,a=e.substring(0,1),s=e.substring(i-1);Kye.includes(a)&&(this.visibility=a),/[$*]/.exec(s)&&(r=s),this.id=e.substring(this.visibility===""?0:1,r===""?i:i-1)}this.classifier=r,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();let n=`${this.visibility?"\\"+this.visibility:""}${rc(this.id)}${this.memberType==="method"?`(${rc(this.parameters)})${this.returnType?" : "+rc(this.returnType):""}`:""}`;this.text=n.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}}});var iC,Zye,c0,sy,o$=N(()=>{"use strict";yr();pt();Xt();gr();tr();ci();Qye();iC="classId-",Zye=0,c0=o(t=>tt.sanitizeText(t,ge()),"sanitizeText"),sy=class{constructor(){this.relations=[];this.classes=new Map;this.styleClasses=new Map;this.notes=[];this.interfaces=[];this.namespaces=new Map;this.namespaceCounter=0;this.functions=[];this.lineType={LINE:0,DOTTED_LINE:1};this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4};this.setupToolTips=o(e=>{let r=qe(".mermaidTooltip");(r._groups||r)[0][0]===null&&(r=qe("body").append("div").attr("class","mermaidTooltip").style("opacity",0)),qe(e).select("svg").selectAll("g.node").on("mouseover",a=>{let s=qe(a.currentTarget);if(s.attr("title")===null)return;let u=this.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.text(s.attr("title")).style("left",window.scrollX+u.left+(u.right-u.left)/2+"px").style("top",window.scrollY+u.top-14+document.body.scrollTop+"px"),r.html(r.html().replace(/<br\/>/g,"
    ")),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),qe(a.currentTarget).classed("hover",!1)})},"setupToolTips");this.direction="TB";this.setAccTitle=Rr;this.getAccTitle=Mr;this.setAccDescription=Ir;this.getAccDescription=Or;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getConfig=o(()=>ge().class,"getConfig");this.functions.push(this.setupToolTips.bind(this)),this.clear(),this.addRelation=this.addRelation.bind(this),this.addClassesToNamespace=this.addClassesToNamespace.bind(this),this.addNamespace=this.addNamespace.bind(this),this.setCssClass=this.setCssClass.bind(this),this.addMembers=this.addMembers.bind(this),this.addClass=this.addClass.bind(this),this.setClassLabel=this.setClassLabel.bind(this),this.addAnnotation=this.addAnnotation.bind(this),this.addMember=this.addMember.bind(this),this.cleanupLabel=this.cleanupLabel.bind(this),this.addNote=this.addNote.bind(this),this.defineClass=this.defineClass.bind(this),this.setDirection=this.setDirection.bind(this),this.setLink=this.setLink.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.clear=this.clear.bind(this),this.setTooltip=this.setTooltip.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setCssStyle=this.setCssStyle.bind(this)}static{o(this,"ClassDB")}splitClassNameAndType(e){let r=tt.sanitizeText(e,ge()),n="",i=r;if(r.indexOf("~")>0){let a=r.split("~");i=c0(a[0]),n=c0(a[1])}return{className:i,type:n}}setClassLabel(e,r){let n=tt.sanitizeText(e,ge());r&&(r=c0(r));let{className:i}=this.splitClassNameAndType(n);this.classes.get(i).label=r,this.classes.get(i).text=`${r}${this.classes.get(i).type?`<${this.classes.get(i).type}>`:""}`}addClass(e){let r=tt.sanitizeText(e,ge()),{className:n,type:i}=this.splitClassNameAndType(r);if(this.classes.has(n))return;let a=tt.sanitizeText(n,ge());this.classes.set(a,{id:a,type:i,label:a,text:`${a}${i?`<${i}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:iC+a+"-"+Zye}),Zye++}addInterface(e,r){let n={id:`interface${this.interfaces.length}`,label:e,classId:r};this.interfaces.push(n)}lookUpDomId(e){let r=tt.sanitizeText(e,ge());if(this.classes.has(r))return this.classes.get(r).domId;throw new Error("Class not found: "+r)}clear(){this.relations=[],this.classes=new Map,this.notes=[],this.interfaces=[],this.functions=[],this.functions.push(this.setupToolTips.bind(this)),this.namespaces=new Map,this.namespaceCounter=0,this.direction="TB",Sr()}getClass(e){return this.classes.get(e)}getClasses(){return this.classes}getRelations(){return this.relations}getNotes(){return this.notes}addRelation(e){X.debug("Adding relation: "+JSON.stringify(e));let r=[this.relationType.LOLLIPOP,this.relationType.AGGREGATION,this.relationType.COMPOSITION,this.relationType.DEPENDENCY,this.relationType.EXTENSION];e.relation.type1===this.relationType.LOLLIPOP&&!r.includes(e.relation.type2)?(this.addClass(e.id2),this.addInterface(e.id1,e.id2),e.id1=`interface${this.interfaces.length-1}`):e.relation.type2===this.relationType.LOLLIPOP&&!r.includes(e.relation.type1)?(this.addClass(e.id1),this.addInterface(e.id2,e.id1),e.id2=`interface${this.interfaces.length-1}`):(this.addClass(e.id1),this.addClass(e.id2)),e.id1=this.splitClassNameAndType(e.id1).className,e.id2=this.splitClassNameAndType(e.id2).className,e.relationTitle1=tt.sanitizeText(e.relationTitle1.trim(),ge()),e.relationTitle2=tt.sanitizeText(e.relationTitle2.trim(),ge()),this.relations.push(e)}addAnnotation(e,r){let n=this.splitClassNameAndType(e).className;this.classes.get(n).annotations.push(r)}addMember(e,r){this.addClass(e);let n=this.splitClassNameAndType(e).className,i=this.classes.get(n);if(typeof r=="string"){let a=r.trim();a.startsWith("<<")&&a.endsWith(">>")?i.annotations.push(c0(a.substring(2,a.length-2))):a.indexOf(")")>0?i.methods.push(new k4(a,"method")):a&&i.members.push(new k4(a,"attribute"))}}addMembers(e,r){Array.isArray(r)&&(r.reverse(),r.forEach(n=>this.addMember(e,n)))}addNote(e,r){let n={id:`note${this.notes.length}`,class:r,text:e};this.notes.push(n)}cleanupLabel(e){return e.startsWith(":")&&(e=e.substring(1)),c0(e.trim())}setCssClass(e,r){e.split(",").forEach(n=>{let i=n;/\d/.exec(n[0])&&(i=iC+i);let a=this.classes.get(i);a&&(a.cssClasses+=" "+r)})}defineClass(e,r){for(let n of e){let i=this.styleClasses.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.styleClasses.set(n,i)),r&&r.forEach(a=>{if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.classes.forEach(a=>{a.cssClasses.includes(n)&&a.styles.push(...r.flatMap(s=>s.split(",")))})}}setTooltip(e,r){e.split(",").forEach(n=>{r!==void 0&&(this.classes.get(n).tooltip=c0(r))})}getTooltip(e,r){return r&&this.namespaces.has(r)?this.namespaces.get(r).classes.get(e).tooltip:this.classes.get(e).tooltip}setLink(e,r,n){let i=ge();e.split(",").forEach(a=>{let s=a;/\d/.exec(a[0])&&(s=iC+s);let l=this.classes.get(s);l&&(l.link=qt.formatUrl(r,i),i.securityLevel==="sandbox"?l.linkTarget="_top":typeof n=="string"?l.linkTarget=c0(n):l.linkTarget="_blank")}),this.setCssClass(e,"clickable")}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFunc(i,r,n),this.classes.get(i).haveCallback=!0}),this.setCssClass(e,"clickable")}setClickFunc(e,r,n){let i=tt.sanitizeText(e,ge());if(ge().securityLevel!=="loose"||r===void 0)return;let s=i;if(this.classes.has(s)){let l=this.lookUpDomId(s),u=[];if(typeof n=="string"){u=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let h=0;h{let h=document.querySelector(`[id="${l}"]`);h!==null&&h.addEventListener("click",()=>{qt.runFunc(r,...u)},!1)})}}bindFunctions(e){this.functions.forEach(r=>{r(e)})}getDirection(){return this.direction}setDirection(e){this.direction=e}addNamespace(e){this.namespaces.has(e)||(this.namespaces.set(e,{id:e,classes:new Map,children:{},domId:iC+e+"-"+this.namespaceCounter}),this.namespaceCounter++)}getNamespace(e){return this.namespaces.get(e)}getNamespaces(){return this.namespaces}addClassesToNamespace(e,r){if(this.namespaces.has(e))for(let n of r){let{className:i}=this.splitClassNameAndType(n);this.classes.get(i).parent=e,this.namespaces.get(e).classes.set(i,this.classes.get(i))}}setCssStyle(e,r){let n=this.classes.get(e);if(!(!r||!n))for(let i of r)i.includes(",")?n.styles.push(...i.split(",")):n.styles.push(i)}getArrowMarker(e){let r;switch(e){case 0:r="aggregation";break;case 1:r="extension";break;case 2:r="composition";break;case 3:r="dependency";break;case 4:r="lollipop";break;default:r="none"}return r}getData(){let e=[],r=[],n=ge();for(let a of this.namespaces.keys()){let s=this.namespaces.get(a);if(s){let l={id:s.id,label:s.id,isGroup:!0,padding:n.class.padding??16,shape:"rect",cssStyles:["fill: none","stroke: black"],look:n.look};e.push(l)}}for(let a of this.classes.keys()){let s=this.classes.get(a);if(s){let l=s;l.parentId=s.parent,l.look=n.look,e.push(l)}}let i=0;for(let a of this.notes){i++;let s={id:a.id,label:a.text,isGroup:!1,shape:"note",padding:n.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${n.themeVariables.noteBkgColor}`,`stroke: ${n.themeVariables.noteBorderColor}`],look:n.look};e.push(s);let l=this.classes.get(a.class)?.id??"";if(l){let u={id:`edgeNote${i}`,start:a.id,end:l,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:n.look};r.push(u)}}for(let a of this.interfaces){let s={id:a.id,label:a.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:n.look};e.push(s)}i=0;for(let a of this.relations){i++;let s={id:xc(a.id1,a.id2,{prefix:"id",counter:i}),start:a.id1,end:a.id2,type:"normal",label:a.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:this.getArrowMarker(a.relation.type1),arrowTypeEnd:this.getArrowMarker(a.relation.type2),startLabelRight:a.relationTitle1==="none"?"":a.relationTitle1,endLabelLeft:a.relationTitle2==="none"?"":a.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:a.style||"",pattern:a.relation.lineType==1?"dashed":"solid",look:n.look};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:this.getDirection()}}}});var BJe,aC,l$=N(()=>{"use strict";yg();BJe=o(t=>`g.classGroup text { + fill: ${t.nodeBorder||t.classText}; + stroke: none; + font-family: ${t.fontFamily}; + font-size: 10px; + + .title { + font-weight: bolder; + } + +} + +.nodeLabel, .edgeLabel { + color: ${t.classText}; +} +.edgeLabel .label rect { + fill: ${t.mainBkg}; +} +.label text { + fill: ${t.classText}; +} + +.labelBkg { + background: ${t.mainBkg}; +} +.edgeLabel .label span { + background: ${t.mainBkg}; +} + +.classTitle { + font-weight: bolder; +} +.node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + +.divider { + stroke: ${t.nodeBorder}; + stroke-width: 1; +} + +g.clickable { + cursor: pointer; +} + +g.classGroup rect { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; +} + +g.classGroup line { + stroke: ${t.nodeBorder}; + stroke-width: 1; +} + +.classLabel .box { + stroke: none; + stroke-width: 0; + fill: ${t.mainBkg}; + opacity: 0.5; +} + +.classLabel .label { + fill: ${t.nodeBorder}; + font-size: 10px; +} + +.relation { + stroke: ${t.lineColor}; + stroke-width: 1; + fill: none; +} + +.dashed-line{ + stroke-dasharray: 3; +} + +.dotted-line{ + stroke-dasharray: 1 2; +} + +#compositionStart, .composition { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#compositionEnd, .composition { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#extensionStart, .extension { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#extensionEnd, .extension { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#aggregationStart, .aggregation { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#aggregationEnd, .aggregation { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#lollipopStart, .lollipop { + fill: ${t.mainBkg} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#lollipopEnd, .lollipop { + fill: ${t.mainBkg} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +.edgeTerminals { + font-size: 11px; + line-height: initial; +} + +.classTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; +} + ${zc()} +`,"getStyles"),aC=BJe});var FJe,$Je,zJe,sC,c$=N(()=>{"use strict";Xt();pt();ep();Nf();Mf();tr();FJe=o((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),$Je=o(function(t,e){return e.db.getClasses()},"getClasses"),zJe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing class diagram (v3)",e);let{securityLevel:i,state:a,layout:s}=ge(),l=n.db.getData(),u=Vo(e,i);l.type=n.type,l.layoutAlgorithm=$c(s),l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["aggregation","extension","composition","dependency","lollipop"],l.diagramId=e,await Qo(l,u);let h=8;qt.insertTitle(u,"classDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ws(u,h,"classDiagram",a?.useMaxWidth??!0)},"draw"),sC={getClasses:$Je,draw:zJe,getDir:FJe}});var Jye={};dr(Jye,{diagram:()=>GJe});var GJe,eve=N(()=>{"use strict";s$();o$();l$();c$();GJe={parser:nC,get db(){return new sy},renderer:sC,styles:aC,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var nve={};dr(nve,{diagram:()=>qJe});var qJe,ive=N(()=>{"use strict";s$();o$();l$();c$();qJe={parser:nC,get db(){return new sy},renderer:sC,styles:aC,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var u$,oC,h$=N(()=>{"use strict";u$=(function(){var t=o(function(F,G,$,U){for($=$||{},U=F.length;U--;$[F[U]]=G);return $},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,16],u=[1,17],h=[1,18],f=[1,19],d=[1,33],p=[1,20],m=[1,21],g=[1,22],y=[1,23],v=[1,24],x=[1,26],b=[1,27],T=[1,28],S=[1,29],w=[1,30],k=[1,31],A=[1,32],C=[1,35],R=[1,36],I=[1,37],L=[1,38],E=[1,34],D=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],_=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,39,40,41,45,48,51,52,53,54,57],O=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],M={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"-->":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,CLICK:38,STRING:39,HREF:40,classDef:41,CLASSDEF_ID:42,CLASSDEF_STYLEOPTS:43,DEFAULT:44,style:45,STYLE_IDS:46,STYLEDEF_STYLEOPTS:47,class:48,CLASSENTITY_IDS:49,STYLECLASS:50,direction_tb:51,direction_bt:52,direction_rl:53,direction_lr:54,eol:55,";":56,EDGE_STATE:57,STYLE_SEPARATOR:58,left_of:59,right_of:60,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"CLICK",39:"STRING",40:"HREF",41:"classDef",42:"CLASSDEF_ID",43:"CLASSDEF_STYLEOPTS",44:"DEFAULT",45:"style",46:"STYLE_IDS",47:"STYLEDEF_STYLEOPTS",48:"class",49:"CLASSENTITY_IDS",50:"STYLECLASS",51:"direction_tb",52:"direction_bt",53:"direction_rl",54:"direction_lr",56:";",57:"EDGE_STATE",58:"STYLE_SEPARATOR",59:"left_of",60:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[9,5],[9,5],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[55,1],[55,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:o(function(G,$,U,j,te,Y,oe){var J=Y.length-1;switch(te){case 3:return j.setRootDoc(Y[J]),Y[J];break;case 4:this.$=[];break;case 5:Y[J]!="nl"&&(Y[J-1].push(Y[J]),this.$=Y[J-1]);break;case 6:case 7:this.$=Y[J];break;case 8:this.$="nl";break;case 12:this.$=Y[J];break;case 13:let Z=Y[J-1];Z.description=j.trimColon(Y[J]),this.$=Z;break;case 14:this.$={stmt:"relation",state1:Y[J-2],state2:Y[J]};break;case 15:let K=j.trimColon(Y[J]);this.$={stmt:"relation",state1:Y[J-3],state2:Y[J-1],description:K};break;case 19:this.$={stmt:"state",id:Y[J-3],type:"default",description:"",doc:Y[J-1]};break;case 20:var ue=Y[J],re=Y[J-2].trim();if(Y[J].match(":")){var ee=Y[J].split(":");ue=ee[0],re=[re,ee[1]]}this.$={stmt:"state",id:ue,type:"default",description:re};break;case 21:this.$={stmt:"state",id:Y[J-3],type:"default",description:Y[J-5],doc:Y[J-1]};break;case 22:this.$={stmt:"state",id:Y[J],type:"fork"};break;case 23:this.$={stmt:"state",id:Y[J],type:"join"};break;case 24:this.$={stmt:"state",id:Y[J],type:"choice"};break;case 25:this.$={stmt:"state",id:j.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:Y[J-1].trim(),note:{position:Y[J-2].trim(),text:Y[J].trim()}};break;case 29:this.$=Y[J].trim(),j.setAccTitle(this.$);break;case 30:case 31:this.$=Y[J].trim(),j.setAccDescription(this.$);break;case 32:this.$={stmt:"click",id:Y[J-3],url:Y[J-2],tooltip:Y[J-1]};break;case 33:this.$={stmt:"click",id:Y[J-3],url:Y[J-1],tooltip:""};break;case 34:case 35:this.$={stmt:"classDef",id:Y[J-1].trim(),classes:Y[J].trim()};break;case 36:this.$={stmt:"style",id:Y[J-1].trim(),styleClass:Y[J].trim()};break;case 37:this.$={stmt:"applyClass",id:Y[J-1].trim(),styleClass:Y[J].trim()};break;case 38:j.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:j.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:j.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:j.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:Y[J].trim(),type:"default",description:""};break;case 46:this.$={stmt:"state",id:Y[J-2].trim(),classes:[Y[J].trim()],type:"default",description:""};break;case 47:this.$={stmt:"state",id:Y[J-2].trim(),classes:[Y[J].trim()],type:"default",description:""};break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:k,48:A,51:C,52:R,53:I,54:L,57:E},t(D,[2,5]),{9:39,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:k,48:A,51:C,52:R,53:I,54:L,57:E},t(D,[2,7]),t(D,[2,8]),t(D,[2,9]),t(D,[2,10]),t(D,[2,11]),t(D,[2,12],{14:[1,40],15:[1,41]}),t(D,[2,16]),{18:[1,42]},t(D,[2,18],{20:[1,43]}),{23:[1,44]},t(D,[2,22]),t(D,[2,23]),t(D,[2,24]),t(D,[2,25]),{30:45,31:[1,46],59:[1,47],60:[1,48]},t(D,[2,28]),{34:[1,49]},{36:[1,50]},t(D,[2,31]),{13:51,24:d,57:E},{42:[1,52],44:[1,53]},{46:[1,54]},{49:[1,55]},t(_,[2,44],{58:[1,56]}),t(_,[2,45],{58:[1,57]}),t(D,[2,38]),t(D,[2,39]),t(D,[2,40]),t(D,[2,41]),t(D,[2,6]),t(D,[2,13]),{13:58,24:d,57:E},t(D,[2,17]),t(O,i,{7:59}),{24:[1,60]},{24:[1,61]},{23:[1,62]},{24:[2,48]},{24:[2,49]},t(D,[2,29]),t(D,[2,30]),{39:[1,63],40:[1,64]},{43:[1,65]},{43:[1,66]},{47:[1,67]},{50:[1,68]},{24:[1,69]},{24:[1,70]},t(D,[2,14],{14:[1,71]}),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,72],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:k,48:A,51:C,52:R,53:I,54:L,57:E},t(D,[2,20],{20:[1,73]}),{31:[1,74]},{24:[1,75]},{39:[1,76]},{39:[1,77]},t(D,[2,34]),t(D,[2,35]),t(D,[2,36]),t(D,[2,37]),t(_,[2,46]),t(_,[2,47]),t(D,[2,15]),t(D,[2,19]),t(O,i,{7:78}),t(D,[2,26]),t(D,[2,27]),{5:[1,79]},{5:[1,80]},{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,81],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:k,48:A,51:C,52:R,53:I,54:L,57:E},t(D,[2,32]),t(D,[2,33]),t(D,[2,21])],defaultActions:{5:[2,1],6:[2,2],47:[2,48],48:[2,49]},parseError:o(function(G,$){if($.recoverable)this.trace(G);else{var U=new Error(G);throw U.hash=$,U}},"parseError"),parse:o(function(G){var $=this,U=[0],j=[],te=[null],Y=[],oe=this.table,J="",ue=0,re=0,ee=0,Z=2,K=1,ae=Y.slice.call(arguments,1),Q=Object.create(this.lexer),de={yy:{}};for(var ne in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ne)&&(de.yy[ne]=this.yy[ne]);Q.setInput(G,de.yy),de.yy.lexer=Q,de.yy.parser=this,typeof Q.yylloc>"u"&&(Q.yylloc={});var Te=Q.yylloc;Y.push(Te);var q=Q.options&&Q.options.ranges;typeof de.yy.parseError=="function"?this.parseError=de.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ve(z){U.length=U.length-2*z,te.length=te.length-z,Y.length=Y.length-z}o(Ve,"popStack");function pe(){var z;return z=j.pop()||Q.lex()||K,typeof z!="number"&&(z instanceof Array&&(j=z,z=j.pop()),z=$.symbols_[z]||z),z}o(pe,"lex");for(var Be,Ye,He,Le,Ie,Ne,Ce={},Fe,fe,xe,W;;){if(He=U[U.length-1],this.defaultActions[He]?Le=this.defaultActions[He]:((Be===null||typeof Be>"u")&&(Be=pe()),Le=oe[He]&&oe[He][Be]),typeof Le>"u"||!Le.length||!Le[0]){var he="";W=[];for(Fe in oe[He])this.terminals_[Fe]&&Fe>Z&&W.push("'"+this.terminals_[Fe]+"'");Q.showPosition?he="Parse error on line "+(ue+1)+`: +`+Q.showPosition()+` +Expecting `+W.join(", ")+", got '"+(this.terminals_[Be]||Be)+"'":he="Parse error on line "+(ue+1)+": Unexpected "+(Be==K?"end of input":"'"+(this.terminals_[Be]||Be)+"'"),this.parseError(he,{text:Q.match,token:this.terminals_[Be]||Be,line:Q.yylineno,loc:Te,expected:W})}if(Le[0]instanceof Array&&Le.length>1)throw new Error("Parse Error: multiple actions possible at state: "+He+", token: "+Be);switch(Le[0]){case 1:U.push(Be),te.push(Q.yytext),Y.push(Q.yylloc),U.push(Le[1]),Be=null,Ye?(Be=Ye,Ye=null):(re=Q.yyleng,J=Q.yytext,ue=Q.yylineno,Te=Q.yylloc,ee>0&&ee--);break;case 2:if(fe=this.productions_[Le[1]][1],Ce.$=te[te.length-fe],Ce._$={first_line:Y[Y.length-(fe||1)].first_line,last_line:Y[Y.length-1].last_line,first_column:Y[Y.length-(fe||1)].first_column,last_column:Y[Y.length-1].last_column},q&&(Ce._$.range=[Y[Y.length-(fe||1)].range[0],Y[Y.length-1].range[1]]),Ne=this.performAction.apply(Ce,[J,re,ue,de.yy,Le[1],te,Y].concat(ae)),typeof Ne<"u")return Ne;fe&&(U=U.slice(0,-1*fe*2),te=te.slice(0,-1*fe),Y=Y.slice(0,-1*fe)),U.push(this.productions_[Le[1]][0]),te.push(Ce.$),Y.push(Ce._$),xe=oe[U[U.length-2]][U[U.length-1]],U.push(xe);break;case 3:return!0}}return!0},"parse")},P=(function(){var F={EOF:1,parseError:o(function($,U){if(this.yy.parser)this.yy.parser.parseError($,U);else throw new Error($)},"parseError"),setInput:o(function(G,$){return this.yy=$||this.yy||{},this._input=G,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var G=this._input[0];this.yytext+=G,this.yyleng++,this.offset++,this.match+=G,this.matched+=G;var $=G.match(/(?:\r\n?|\n).*/g);return $?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),G},"input"),unput:o(function(G){var $=G.length,U=G.split(/(?:\r\n?|\n)/g);this._input=G+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-$),this.offset-=$;var j=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),U.length-1&&(this.yylineno-=U.length-1);var te=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:U?(U.length===j.length?this.yylloc.first_column:0)+j[j.length-U.length].length-U[0].length:this.yylloc.first_column-$},this.options.ranges&&(this.yylloc.range=[te[0],te[0]+this.yyleng-$]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(G){this.unput(this.match.slice(G))},"less"),pastInput:o(function(){var G=this.matched.substr(0,this.matched.length-this.match.length);return(G.length>20?"...":"")+G.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var G=this.match;return G.length<20&&(G+=this._input.substr(0,20-G.length)),(G.substr(0,20)+(G.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var G=this.pastInput(),$=new Array(G.length+1).join("-");return G+this.upcomingInput()+` +`+$+"^"},"showPosition"),test_match:o(function(G,$){var U,j,te;if(this.options.backtrack_lexer&&(te={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(te.yylloc.range=this.yylloc.range.slice(0))),j=G[0].match(/(?:\r\n?|\n).*/g),j&&(this.yylineno+=j.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:j?j[j.length-1].length-j[j.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+G[0].length},this.yytext+=G[0],this.match+=G[0],this.matches=G,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(G[0].length),this.matched+=G[0],U=this.performAction.call(this,this.yy,this,$,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),U)return U;if(this._backtrack){for(var Y in te)this[Y]=te[Y];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var G,$,U,j;this._more||(this.yytext="",this.match="");for(var te=this._currentRules(),Y=0;Y$[0].length)){if($=U,j=Y,this.options.backtrack_lexer){if(G=this.test_match(U,te[Y]),G!==!1)return G;if(this._backtrack){$=!1;continue}else return!1}else if(!this.options.flex)break}return $?(G=this.test_match($,te[j]),G!==!1?G:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var $=this.next();return $||this.lex()},"lex"),begin:o(function($){this.conditionStack.push($)},"begin"),popState:o(function(){var $=this.conditionStack.length-1;return $>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function($){return $=this.conditionStack.length-1-Math.abs($||0),$>=0?this.conditionStack[$]:"INITIAL"},"topState"),pushState:o(function($){this.begin($)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function($,U,j,te){var Y=te;switch(j){case 0:return 38;case 1:return 40;case 2:return 39;case 3:return 44;case 4:return 51;case 5:return 52;case 6:return 53;case 7:return 54;case 8:break;case 9:break;case 10:return 5;case 11:break;case 12:break;case 13:break;case 14:break;case 15:return this.pushState("SCALE"),17;break;case 16:return 18;case 17:this.popState();break;case 18:return this.begin("acc_title"),33;break;case 19:return this.popState(),"acc_title_value";break;case 20:return this.begin("acc_descr"),35;break;case 21:return this.popState(),"acc_descr_value";break;case 22:this.begin("acc_descr_multiline");break;case 23:this.popState();break;case 24:return"acc_descr_multiline_value";case 25:return this.pushState("CLASSDEF"),41;break;case 26:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 27:return this.popState(),this.pushState("CLASSDEFID"),42;break;case 28:return this.popState(),43;break;case 29:return this.pushState("CLASS"),48;break;case 30:return this.popState(),this.pushState("CLASS_STYLE"),49;break;case 31:return this.popState(),50;break;case 32:return this.pushState("STYLE"),45;break;case 33:return this.popState(),this.pushState("STYLEDEF_STYLES"),46;break;case 34:return this.popState(),47;break;case 35:return this.pushState("SCALE"),17;break;case 36:return 18;case 37:this.popState();break;case 38:this.pushState("STATE");break;case 39:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),25;break;case 40:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),26;break;case 41:return this.popState(),U.yytext=U.yytext.slice(0,-10).trim(),27;break;case 42:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),25;break;case 43:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),26;break;case 44:return this.popState(),U.yytext=U.yytext.slice(0,-10).trim(),27;break;case 45:return 51;case 46:return 52;case 47:return 53;case 48:return 54;case 49:this.pushState("STATE_STRING");break;case 50:return this.pushState("STATE_ID"),"AS";break;case 51:return this.popState(),"ID";break;case 52:this.popState();break;case 53:return"STATE_DESCR";case 54:return 19;case 55:this.popState();break;case 56:return this.popState(),this.pushState("struct"),20;break;case 57:break;case 58:return this.popState(),21;break;case 59:break;case 60:return this.begin("NOTE"),29;break;case 61:return this.popState(),this.pushState("NOTE_ID"),59;break;case 62:return this.popState(),this.pushState("NOTE_ID"),60;break;case 63:this.popState(),this.pushState("FLOATING_NOTE");break;case 64:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";break;case 65:break;case 66:return"NOTE_TEXT";case 67:return this.popState(),"ID";break;case 68:return this.popState(),this.pushState("NOTE_TEXT"),24;break;case 69:return this.popState(),U.yytext=U.yytext.substr(2).trim(),31;break;case 70:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),31;break;case 71:return 6;case 72:return 6;case 73:return 16;case 74:return 57;case 75:return 24;case 76:return U.yytext=U.yytext.trim(),14;break;case 77:return 15;case 78:return 28;case 79:return 58;case 80:return 5;case 81:return"INVALID"}},"anonymous"),rules:[/^(?:click\b)/i,/^(?:href\b)/i,/^(?:"[^"]*")/i,/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[12,13],inclusive:!1},struct:{rules:[12,13,25,29,32,38,45,46,47,48,57,58,59,60,74,75,76,77,78],inclusive:!1},FLOATING_NOTE_ID:{rules:[67],inclusive:!1},FLOATING_NOTE:{rules:[64,65,66],inclusive:!1},NOTE_TEXT:{rules:[69,70],inclusive:!1},NOTE_ID:{rules:[68],inclusive:!1},NOTE:{rules:[61,62,63],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[34],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[33],inclusive:!1},CLASS_STYLE:{rules:[31],inclusive:!1},CLASS:{rules:[30],inclusive:!1},CLASSDEFID:{rules:[28],inclusive:!1},CLASSDEF:{rules:[26,27],inclusive:!1},acc_descr_multiline:{rules:[23,24],inclusive:!1},acc_descr:{rules:[21],inclusive:!1},acc_title:{rules:[19],inclusive:!1},SCALE:{rules:[16,17,36,37],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[51],inclusive:!1},STATE_STRING:{rules:[52,53],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[12,13,39,40,41,42,43,44,49,50,54,55,56],inclusive:!1},ID:{rules:[12,13],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,18,20,22,25,29,32,35,38,56,60,71,72,73,74,75,76,77,79,80,81],inclusive:!0}}};return F})();M.lexer=P;function B(){this.yy={}}return o(B,"Parser"),B.prototype=M,M.Parser=B,new B})();u$.parser=u$;oC=u$});var Qf,u0,E4,ove,lve,cve,h0,lC,f$,d$,p$,m$,cC,uC,uve,hve,g$,y$,fve,dve,oy,jJe,pve,v$,KJe,QJe,mve,gve,ZJe,yve,JJe,vve,x$,b$,xve,hC,bve,T$,fC=N(()=>{"use strict";Qf="state",u0="root",E4="relation",ove="classDef",lve="style",cve="applyClass",h0="default",lC="divider",f$="fill:none",d$="fill: #333",p$="text",m$="normal",cC="rect",uC="rectWithTitle",uve="stateStart",hve="stateEnd",g$="divider",y$="roundedWithTitle",fve="note",dve="noteGroup",oy="statediagram",jJe="state",pve=`${oy}-${jJe}`,v$="transition",KJe="note",QJe="note-edge",mve=`${v$} ${QJe}`,gve=`${oy}-${KJe}`,ZJe="cluster",yve=`${oy}-${ZJe}`,JJe="cluster-alt",vve=`${oy}-${JJe}`,x$="parent",b$="note",xve="state",hC="----",bve=`${hC}${b$}`,T$=`${hC}${x$}`});function w$(t="",e=0,r="",n=hC){let i=r!==null&&r.length>0?`${n}${r}`:"";return`${xve}-${t}${i}-${e}`}function dC(t,e,r){if(!e.id||e.id===""||e.id==="")return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(i=>{let a=r.get(i);a&&(e.cssCompiledStyles=[...e.cssCompiledStyles??[],...a.styles])}));let n=t.find(i=>i.id===e.id);n?Object.assign(n,e):t.push(e)}function tet(t){return t?.classes?.join(" ")??""}function ret(t){return t?.styles??[]}var pC,Zf,eet,Tve,ly,kve,Eve=N(()=>{"use strict";Xt();pt();gr();fC();pC=new Map,Zf=0;o(w$,"stateDomId");eet=o((t,e,r,n,i,a,s,l)=>{X.trace("items",e),e.forEach(u=>{switch(u.stmt){case Qf:ly(t,u,r,n,i,a,s,l);break;case h0:ly(t,u,r,n,i,a,s,l);break;case E4:{ly(t,u.state1,r,n,i,a,s,l),ly(t,u.state2,r,n,i,a,s,l);let h={id:"edge"+Zf,start:u.state1.id,end:u.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:f$,labelStyle:"",label:tt.sanitizeText(u.description??"",ge()),arrowheadStyle:d$,labelpos:"c",labelType:p$,thickness:m$,classes:v$,look:s};i.push(h),Zf++}break}})},"setupDoc"),Tve=o((t,e="TB")=>{let r=e;if(t.doc)for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir");o(dC,"insertOrUpdateNode");o(tet,"getClassesFromDbInfo");o(ret,"getStylesFromDbInfo");ly=o((t,e,r,n,i,a,s,l)=>{let u=e.id,h=r.get(u),f=tet(h),d=ret(h),p=ge();if(X.info("dataFetcher parsedItem",e,h,d),u!=="root"){let m=cC;e.start===!0?m=uve:e.start===!1&&(m=hve),e.type!==h0&&(m=e.type),pC.get(u)||pC.set(u,{id:u,shape:m,description:tt.sanitizeText(u,p),cssClasses:`${f} ${pve}`,cssStyles:d});let g=pC.get(u);e.description&&(Array.isArray(g.description)?(g.shape=uC,g.description.push(e.description)):g.description?.length&&g.description.length>0?(g.shape=uC,g.description===u?g.description=[e.description]:g.description=[g.description,e.description]):(g.shape=cC,g.description=e.description),g.description=tt.sanitizeTextOrArray(g.description,p)),g.description?.length===1&&g.shape===uC&&(g.type==="group"?g.shape=y$:g.shape=cC),!g.type&&e.doc&&(X.info("Setting cluster for XCX",u,Tve(e)),g.type="group",g.isGroup=!0,g.dir=Tve(e),g.shape=e.type===lC?g$:y$,g.cssClasses=`${g.cssClasses} ${yve} ${a?vve:""}`);let y={labelStyle:"",shape:g.shape,label:g.description,cssClasses:g.cssClasses,cssCompiledStyles:[],cssStyles:g.cssStyles,id:u,dir:g.dir,domId:w$(u,Zf),type:g.type,isGroup:g.type==="group",padding:8,rx:10,ry:10,look:s};if(y.shape===g$&&(y.label=""),t&&t.id!=="root"&&(X.trace("Setting node ",u," to be child of its parent ",t.id),y.parentId=t.id),y.centerLabel=!0,e.note){let v={labelStyle:"",shape:fve,label:e.note.text,cssClasses:gve,cssStyles:[],cssCompiledStyles:[],id:u+bve+"-"+Zf,domId:w$(u,Zf,b$),type:g.type,isGroup:g.type==="group",padding:p.flowchart?.padding,look:s,position:e.note.position},x=u+T$,b={labelStyle:"",shape:dve,label:e.note.text,cssClasses:g.cssClasses,cssStyles:[],id:u+T$,domId:w$(u,Zf,x$),type:"group",isGroup:!0,padding:16,look:s,position:e.note.position};Zf++,b.id=x,v.parentId=x,dC(n,b,l),dC(n,v,l),dC(n,y,l);let T=u,S=v.id;e.note.position==="left of"&&(T=v.id,S=u),i.push({id:T+"-"+S,start:T,end:S,arrowhead:"none",arrowTypeEnd:"",style:f$,labelStyle:"",classes:mve,arrowheadStyle:d$,labelpos:"c",labelType:p$,thickness:m$,look:s})}else dC(n,y,l)}e.doc&&(X.trace("Adding nodes children "),eet(e,e.doc,r,n,i,!a,s,l))},"dataFetcher"),kve=o(()=>{pC.clear(),Zf=0},"reset")});var E$,net,iet,Sve,S$=N(()=>{"use strict";Xt();pt();ep();Nf();Mf();tr();fC();E$=o((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),net=o(function(t,e){return e.db.getClasses()},"getClasses"),iet=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing state diagram (v2)",e);let{securityLevel:i,state:a,layout:s}=ge();n.db.extract(n.db.getRootDocV2());let l=n.db.getData(),u=Vo(e,i);l.type=n.type,l.layoutAlgorithm=s,l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["barb"],l.diagramId=e,await Qo(l,u);let h=8;try{(typeof n.db.getLinks=="function"?n.db.getLinks():new Map).forEach((d,p)=>{let m=typeof p=="string"?p:typeof p?.id=="string"?p.id:"";if(!m){X.warn("\u26A0\uFE0F Invalid or missing stateId from key:",JSON.stringify(p));return}let g=u.node()?.querySelectorAll("g"),y;if(g?.forEach(T=>{T.textContent?.trim()===m&&(y=T)}),!y){X.warn("\u26A0\uFE0F Could not find node matching text:",m);return}let v=y.parentNode;if(!v){X.warn("\u26A0\uFE0F Node has no parent, cannot wrap:",m);return}let x=document.createElementNS("http://www.w3.org/2000/svg","a"),b=d.url.replace(/^"+|"+$/g,"");if(x.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",b),x.setAttribute("target","_blank"),d.tooltip){let T=d.tooltip.replace(/^"+|"+$/g,"");x.setAttribute("title",T)}v.replaceChild(x,y),x.appendChild(y),X.info("\u{1F517} Wrapped node in
    tag for:",m,d.url)})}catch(f){X.error("\u274C Error injecting clickable links:",f)}qt.insertTitle(u,"statediagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ws(u,h,oy,a?.useMaxWidth??!0)},"draw"),Sve={getClasses:net,draw:iet,getDir:E$}});var ws,Ave,_ve,mC,al,gC=N(()=>{"use strict";Xt();pt();tr();gr();ci();Eve();S$();fC();ws={START_NODE:"[*]",START_TYPE:"start",END_NODE:"[*]",END_TYPE:"end",COLOR_KEYWORD:"color",FILL_KEYWORD:"fill",BG_FILL:"bgFill",STYLECLASS_SEP:","},Ave=o(()=>new Map,"newClassesList"),_ve=o(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),mC=o(t=>JSON.parse(JSON.stringify(t)),"clone"),al=class{constructor(e){this.version=e;this.nodes=[];this.edges=[];this.rootDoc=[];this.classes=Ave();this.documents={root:_ve()};this.currentDocument=this.documents.root;this.startEndCount=0;this.dividerCnt=0;this.links=new Map;this.getAccTitle=Mr;this.setAccTitle=Rr;this.getAccDescription=Or;this.setAccDescription=Ir;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.clear(),this.setRootDoc=this.setRootDoc.bind(this),this.getDividerId=this.getDividerId.bind(this),this.setDirection=this.setDirection.bind(this),this.trimColon=this.trimColon.bind(this)}static{o(this,"StateDB")}static{this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3}}extract(e){this.clear(!0);for(let i of Array.isArray(e)?e:e.doc)switch(i.stmt){case Qf:this.addState(i.id.trim(),i.type,i.doc,i.description,i.note);break;case E4:this.addRelation(i.state1,i.state2,i.description);break;case ove:this.addStyleClass(i.id.trim(),i.classes);break;case lve:this.handleStyleDef(i);break;case cve:this.setCssClass(i.id.trim(),i.styleClass);break;case"click":this.addLink(i.id,i.url,i.tooltip);break}let r=this.getStates(),n=ge();kve(),ly(void 0,this.getRootDocV2(),r,this.nodes,this.edges,!0,n.look,this.classes);for(let i of this.nodes)if(Array.isArray(i.label)){if(i.description=i.label.slice(1),i.isGroup&&i.description.length>0)throw new Error(`Group nodes can only have label. Remove the additional description for node [${i.id}]`);i.label=i.label[0]}}handleStyleDef(e){let r=e.id.trim().split(","),n=e.styleClass.split(",");for(let i of r){let a=this.getState(i);if(!a){let s=i.trim();this.addState(s),a=this.getState(s)}a&&(a.styles=n.map(s=>s.replace(/;/g,"")?.trim()))}}setRootDoc(e){X.info("Setting root doc",e),this.rootDoc=e,this.version===1?this.extract(e):this.extract(this.getRootDocV2())}docTranslator(e,r,n){if(r.stmt===E4){this.docTranslator(e,r.state1,!0),this.docTranslator(e,r.state2,!1);return}if(r.stmt===Qf&&(r.id===ws.START_NODE?(r.id=e.id+(n?"_start":"_end"),r.start=n):r.id=r.id.trim()),r.stmt!==u0&&r.stmt!==Qf||!r.doc)return;let i=[],a=[];for(let s of r.doc)if(s.type===lC){let l=mC(s);l.doc=mC(a),i.push(l),a=[]}else a.push(s);if(i.length>0&&a.length>0){let s={stmt:Qf,id:GL(),type:"divider",doc:mC(a)};i.push(mC(s)),r.doc=i}r.doc.forEach(s=>this.docTranslator(r,s,!0))}getRootDocV2(){return this.docTranslator({id:u0,stmt:u0},{id:u0,stmt:u0,doc:this.rootDoc},!0),{id:u0,doc:this.rootDoc}}addState(e,r=h0,n=void 0,i=void 0,a=void 0,s=void 0,l=void 0,u=void 0){let h=e?.trim();if(!this.currentDocument.states.has(h))X.info("Adding state ",h,i),this.currentDocument.states.set(h,{stmt:Qf,id:h,descriptions:[],type:r,doc:n,note:a,classes:[],styles:[],textStyles:[]});else{let f=this.currentDocument.states.get(h);if(!f)throw new Error(`State not found: ${h}`);f.doc||(f.doc=n),f.type||(f.type=r)}if(i&&(X.info("Setting state description",h,i),(Array.isArray(i)?i:[i]).forEach(d=>this.addDescription(h,d.trim()))),a){let f=this.currentDocument.states.get(h);if(!f)throw new Error(`State not found: ${h}`);f.note=a,f.note.text=tt.sanitizeText(f.note.text,ge())}s&&(X.info("Setting state classes",h,s),(Array.isArray(s)?s:[s]).forEach(d=>this.setCssClass(h,d.trim()))),l&&(X.info("Setting state styles",h,l),(Array.isArray(l)?l:[l]).forEach(d=>this.setStyle(h,d.trim()))),u&&(X.info("Setting state styles",h,l),(Array.isArray(u)?u:[u]).forEach(d=>this.setTextStyle(h,d.trim())))}clear(e){this.nodes=[],this.edges=[],this.documents={root:_ve()},this.currentDocument=this.documents.root,this.startEndCount=0,this.classes=Ave(),e||(this.links=new Map,Sr())}getState(e){return this.currentDocument.states.get(e)}getStates(){return this.currentDocument.states}logDocuments(){X.info("Documents = ",this.documents)}getRelations(){return this.currentDocument.relations}addLink(e,r,n){this.links.set(e,{url:r,tooltip:n}),X.warn("Adding link",e,r,n)}getLinks(){return this.links}startIdIfNeeded(e=""){return e===ws.START_NODE?(this.startEndCount++,`${ws.START_TYPE}${this.startEndCount}`):e}startTypeIfNeeded(e="",r=h0){return e===ws.START_NODE?ws.START_TYPE:r}endIdIfNeeded(e=""){return e===ws.END_NODE?(this.startEndCount++,`${ws.END_TYPE}${this.startEndCount}`):e}endTypeIfNeeded(e="",r=h0){return e===ws.END_NODE?ws.END_TYPE:r}addRelationObjs(e,r,n=""){let i=this.startIdIfNeeded(e.id.trim()),a=this.startTypeIfNeeded(e.id.trim(),e.type),s=this.startIdIfNeeded(r.id.trim()),l=this.startTypeIfNeeded(r.id.trim(),r.type);this.addState(i,a,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),this.addState(s,l,r.doc,r.description,r.note,r.classes,r.styles,r.textStyles),this.currentDocument.relations.push({id1:i,id2:s,relationTitle:tt.sanitizeText(n,ge())})}addRelation(e,r,n){if(typeof e=="object"&&typeof r=="object")this.addRelationObjs(e,r,n);else if(typeof e=="string"&&typeof r=="string"){let i=this.startIdIfNeeded(e.trim()),a=this.startTypeIfNeeded(e),s=this.endIdIfNeeded(r.trim()),l=this.endTypeIfNeeded(r);this.addState(i,a),this.addState(s,l),this.currentDocument.relations.push({id1:i,id2:s,relationTitle:n?tt.sanitizeText(n,ge()):void 0})}}addDescription(e,r){let n=this.currentDocument.states.get(e),i=r.startsWith(":")?r.replace(":","").trim():r;n?.descriptions?.push(tt.sanitizeText(i,ge()))}cleanupLabel(e){return e.startsWith(":")?e.slice(2).trim():e.trim()}getDividerId(){return this.dividerCnt++,`divider-id-${this.dividerCnt}`}addStyleClass(e,r=""){this.classes.has(e)||this.classes.set(e,{id:e,styles:[],textStyles:[]});let n=this.classes.get(e);r&&n&&r.split(ws.STYLECLASS_SEP).forEach(i=>{let a=i.replace(/([^;]*);/,"$1").trim();if(RegExp(ws.COLOR_KEYWORD).exec(i)){let l=a.replace(ws.FILL_KEYWORD,ws.BG_FILL).replace(ws.COLOR_KEYWORD,ws.FILL_KEYWORD);n.textStyles.push(l)}n.styles.push(a)})}getClasses(){return this.classes}setCssClass(e,r){e.split(",").forEach(n=>{let i=this.getState(n);if(!i){let a=n.trim();this.addState(a),i=this.getState(a)}i?.classes?.push(r)})}setStyle(e,r){this.getState(e)?.styles?.push(r)}setTextStyle(e,r){this.getState(e)?.textStyles?.push(r)}getDirectionStatement(){return this.rootDoc.find(e=>e.stmt==="dir")}getDirection(){return this.getDirectionStatement()?.value??"TB"}setDirection(e){let r=this.getDirectionStatement();r?r.value=e:this.rootDoc.unshift({stmt:"dir",value:e})}trimColon(e){return e.startsWith(":")?e.slice(1).trim():e.trim()}getData(){let e=ge();return{nodes:this.nodes,edges:this.edges,other:{},config:e,direction:E$(this.getRootDocV2())}}getConfig(){return ge().state}}});var set,yC,C$=N(()=>{"use strict";set=o(t=>` +defs #statediagram-barbEnd { + fill: ${t.transitionColor}; + stroke: ${t.transitionColor}; + } +g.stateGroup text { + fill: ${t.nodeBorder}; + stroke: none; + font-size: 10px; +} +g.stateGroup text { + fill: ${t.textColor}; + stroke: none; + font-size: 10px; + +} +g.stateGroup .state-title { + font-weight: bolder; + fill: ${t.stateLabelColor}; +} + +g.stateGroup rect { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; +} + +g.stateGroup line { + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.transition { + stroke: ${t.transitionColor}; + stroke-width: 1; + fill: none; +} + +.stateGroup .composit { + fill: ${t.background}; + border-bottom: 1px +} + +.stateGroup .alt-composit { + fill: #e0e0e0; + border-bottom: 1px +} + +.state-note { + stroke: ${t.noteBorderColor}; + fill: ${t.noteBkgColor}; + + text { + fill: ${t.noteTextColor}; + stroke: none; + font-size: 10px; + } +} + +.stateLabel .box { + stroke: none; + stroke-width: 0; + fill: ${t.mainBkg}; + opacity: 0.5; +} + +.edgeLabel .label rect { + fill: ${t.labelBackgroundColor}; + opacity: 0.5; +} +.edgeLabel { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; +} +.edgeLabel .label text { + fill: ${t.transitionLabelColor||t.tertiaryTextColor}; +} +.label div .edgeLabel { + color: ${t.transitionLabelColor||t.tertiaryTextColor}; +} + +.stateLabel text { + fill: ${t.stateLabelColor}; + font-size: 10px; + font-weight: bold; +} + +.node circle.state-start { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node .fork-join { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node circle.state-end { + fill: ${t.innerEndBackground}; + stroke: ${t.background}; + stroke-width: 1.5 +} +.end-state-inner { + fill: ${t.compositeBackground||t.background}; + // stroke: ${t.background}; + stroke-width: 1.5 +} + +.node rect { + fill: ${t.stateBkg||t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} +.node polygon { + fill: ${t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder};; + stroke-width: 1px; +} +#statediagram-barbEnd { + fill: ${t.lineColor}; +} + +.statediagram-cluster rect { + fill: ${t.compositeTitleBackground}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} + +.cluster-label, .nodeLabel { + color: ${t.stateLabelColor}; + // line-height: 1; +} + +.statediagram-cluster rect.outer { + rx: 5px; + ry: 5px; +} +.statediagram-state .divider { + stroke: ${t.stateBorder||t.nodeBorder}; +} + +.statediagram-state .title-state { + rx: 5px; + ry: 5px; +} +.statediagram-cluster.statediagram-cluster .inner { + fill: ${t.compositeBackground||t.background}; +} +.statediagram-cluster.statediagram-cluster-alt .inner { + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.statediagram-cluster .inner { + rx:0; + ry:0; +} + +.statediagram-state rect.basic { + rx: 5px; + ry: 5px; +} +.statediagram-state rect.divider { + stroke-dasharray: 10,10; + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.note-edge { + stroke-dasharray: 5; +} + +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} + +.statediagram-note text { + fill: ${t.noteTextColor}; +} + +.statediagram-note .nodeLabel { + color: ${t.noteTextColor}; +} +.statediagram .edgeLabel { + color: red; // ${t.noteTextColor}; +} + +#dependencyStart, #dependencyEnd { + fill: ${t.lineColor}; + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.statediagramTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; +} +`,"getStyles"),yC=set});var oet,cet,uet,het,Lve,fet,det,pet,met,A$,Dve,Rve,Nve=N(()=>{"use strict";yr();gC();tr();gr();Xt();pt();oet=o(t=>t.append("circle").attr("class","start-state").attr("r",ge().state.sizeUnit).attr("cx",ge().state.padding+ge().state.sizeUnit).attr("cy",ge().state.padding+ge().state.sizeUnit),"drawStartState"),cet=o(t=>t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",ge().state.textHeight).attr("class","divider").attr("x2",ge().state.textHeight*2).attr("y1",0).attr("y2",0),"drawDivider"),uet=o((t,e)=>{let r=t.append("text").attr("x",2*ge().state.padding).attr("y",ge().state.textHeight+2*ge().state.padding).attr("font-size",ge().state.fontSize).attr("class","state-title").text(e.id),n=r.node().getBBox();return t.insert("rect",":first-child").attr("x",ge().state.padding).attr("y",ge().state.padding).attr("width",n.width+2*ge().state.padding).attr("height",n.height+2*ge().state.padding).attr("rx",ge().state.radius),r},"drawSimpleState"),het=o((t,e)=>{let r=o(function(p,m,g){let y=p.append("tspan").attr("x",2*ge().state.padding).text(m);g||y.attr("dy",ge().state.textHeight)},"addTspan"),i=t.append("text").attr("x",2*ge().state.padding).attr("y",ge().state.textHeight+1.3*ge().state.padding).attr("font-size",ge().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),a=i.height,s=t.append("text").attr("x",ge().state.padding).attr("y",a+ge().state.padding*.4+ge().state.dividerMargin+ge().state.textHeight).attr("class","state-description"),l=!0,u=!0;e.descriptions.forEach(function(p){l||(r(s,p,u),u=!1),l=!1});let h=t.append("line").attr("x1",ge().state.padding).attr("y1",ge().state.padding+a+ge().state.dividerMargin/2).attr("y2",ge().state.padding+a+ge().state.dividerMargin/2).attr("class","descr-divider"),f=s.node().getBBox(),d=Math.max(f.width,i.width);return h.attr("x2",d+3*ge().state.padding),t.insert("rect",":first-child").attr("x",ge().state.padding).attr("y",ge().state.padding).attr("width",d+2*ge().state.padding).attr("height",f.height+a+2*ge().state.padding).attr("rx",ge().state.radius),t},"drawDescrState"),Lve=o((t,e,r)=>{let n=ge().state.padding,i=2*ge().state.padding,a=t.node().getBBox(),s=a.width,l=a.x,u=t.append("text").attr("x",0).attr("y",ge().state.titleShift).attr("font-size",ge().state.fontSize).attr("class","state-title").text(e.id),f=u.node().getBBox().width+i,d=Math.max(f,s);d===s&&(d=d+i);let p,m=t.node().getBBox();e.doc,p=l-n,f>s&&(p=(s-d)/2+n),Math.abs(l-m.x)s&&(p=l-(f-s)/2);let g=1-ge().state.textHeight;return t.insert("rect",":first-child").attr("x",p).attr("y",g).attr("class",r?"alt-composit":"composit").attr("width",d).attr("height",m.height+ge().state.textHeight+ge().state.titleShift+1).attr("rx","0"),u.attr("x",p+n),f<=s&&u.attr("x",l+(d-i)/2-f/2+n),t.insert("rect",":first-child").attr("x",p).attr("y",ge().state.titleShift-ge().state.textHeight-ge().state.padding).attr("width",d).attr("height",ge().state.textHeight*3).attr("rx",ge().state.radius),t.insert("rect",":first-child").attr("x",p).attr("y",ge().state.titleShift-ge().state.textHeight-ge().state.padding).attr("width",d).attr("height",m.height+3+2*ge().state.textHeight).attr("rx",ge().state.radius),t},"addTitleAndBox"),fet=o(t=>(t.append("circle").attr("class","end-state-outer").attr("r",ge().state.sizeUnit+ge().state.miniPadding).attr("cx",ge().state.padding+ge().state.sizeUnit+ge().state.miniPadding).attr("cy",ge().state.padding+ge().state.sizeUnit+ge().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",ge().state.sizeUnit).attr("cx",ge().state.padding+ge().state.sizeUnit+2).attr("cy",ge().state.padding+ge().state.sizeUnit+2)),"drawEndState"),det=o((t,e)=>{let r=ge().state.forkWidth,n=ge().state.forkHeight;if(e.parentId){let i=r;r=n,n=i}return t.append("rect").style("stroke","black").style("fill","black").attr("width",r).attr("height",n).attr("x",ge().state.padding).attr("y",ge().state.padding)},"drawForkJoinState"),pet=o((t,e,r,n)=>{let i=0,a=n.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"
    ");s=s.replace(/\n/g,"
    ");let l=s.split(tt.lineBreakRegex),u=1.25*ge().state.noteMargin;for(let h of l){let f=h.trim();if(f.length>0){let d=a.append("tspan");if(d.text(f),u===0){let p=d.node().getBBox();u+=p.height}i+=u,d.attr("x",e+ge().state.noteMargin),d.attr("y",r+i+1.25*ge().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:i}},"_drawLongText"),met=o((t,e)=>{e.attr("class","state-note");let r=e.append("rect").attr("x",0).attr("y",ge().state.padding),n=e.append("g"),{textWidth:i,textHeight:a}=pet(t,0,0,n);return r.attr("height",a+2*ge().state.noteMargin),r.attr("width",i+ge().state.noteMargin*2),r},"drawNote"),A$=o(function(t,e){let r=e.id,n={id:r,label:e.id,width:0,height:0},i=t.append("g").attr("id",r).attr("class","stateGroup");e.type==="start"&&oet(i),e.type==="end"&&fet(i),(e.type==="fork"||e.type==="join")&&det(i,e),e.type==="note"&&met(e.note.text,i),e.type==="divider"&&cet(i),e.type==="default"&&e.descriptions.length===0&&uet(i,e),e.type==="default"&&e.descriptions.length>0&&het(i,e);let a=i.node().getBBox();return n.width=a.width+2*ge().state.padding,n.height=a.height+2*ge().state.padding,n},"drawState"),Dve=0,Rve=o(function(t,e,r){let n=o(function(u){switch(u){case al.relationType.AGGREGATION:return"aggregation";case al.relationType.EXTENSION:return"extension";case al.relationType.COMPOSITION:return"composition";case al.relationType.DEPENDENCY:return"dependency"}},"getRelationType");e.points=e.points.filter(u=>!Number.isNaN(u.y));let i=e.points,a=Cl().x(function(u){return u.x}).y(function(u){return u.y}).curve(No),s=t.append("path").attr("d",a(i)).attr("id","edge"+Dve).attr("class","transition"),l="";if(ge().state.arrowMarkerAbsolute&&(l=md(!0)),s.attr("marker-end","url("+l+"#"+n(al.relationType.DEPENDENCY)+"End)"),r.title!==void 0){let u=t.append("g").attr("class","stateLabel"),{x:h,y:f}=qt.calcLabelPosition(e.points),d=tt.getRows(r.title),p=0,m=[],g=0,y=0;for(let b=0;b<=d.length;b++){let T=u.append("text").attr("text-anchor","middle").text(d[b]).attr("x",h).attr("y",f+p),S=T.node().getBBox();g=Math.max(g,S.width),y=Math.min(y,S.x),X.info(S.x,h,f+p),p===0&&(p=T.node().getBBox().height,X.info("Title height",p,f)),m.push(T)}let v=p*d.length;if(d.length>1){let b=(d.length-1)*p*.5;m.forEach((T,S)=>T.attr("y",f+S*p-b)),v=p*d.length}let x=u.node().getBBox();u.insert("rect",":first-child").attr("class","box").attr("x",h-g/2-ge().state.padding/2).attr("y",f-v/2-ge().state.padding/2-3.5).attr("width",g+ge().state.padding).attr("height",v+ge().state.padding),X.info(x)}Dve++},"drawEdge")});var bo,_$,get,yet,vet,xet,Mve,Ive,Ove=N(()=>{"use strict";yr();hN();qo();pt();gr();Nve();Xt();Ei();_$={},get=o(function(){},"setConf"),yet=o(function(t){t.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),vet=o(function(t,e,r,n){bo=ge().state;let i=ge().securityLevel,a;i==="sandbox"&&(a=qe("#i"+e));let s=i==="sandbox"?qe(a.nodes()[0].contentDocument.body):qe("body"),l=i==="sandbox"?a.nodes()[0].contentDocument:document;X.debug("Rendering diagram "+t);let u=s.select(`[id='${e}']`);yet(u);let h=n.db.getRootDoc();Mve(h,u,void 0,!1,s,l,n);let f=bo.padding,d=u.node().getBBox(),p=d.width+f*2,m=d.height+f*2,g=p*1.75;mn(u,m,g,bo.useMaxWidth),u.attr("viewBox",`${d.x-bo.padding} ${d.y-bo.padding} `+p+" "+m)},"draw"),xet=o(t=>t?t.length*bo.fontSizeFactor:1,"getLabelWidth"),Mve=o((t,e,r,n,i,a,s)=>{let l=new cn({compound:!0,multigraph:!0}),u,h=!0;for(u=0;u{let w=S.parentElement,k=0,A=0;w&&(w.parentElement&&(k=w.parentElement.getBBox().width),A=parseInt(w.getAttribute("data-x-shift"),10),Number.isNaN(A)&&(A=0)),S.setAttribute("x1",0-A+8),S.setAttribute("x2",k-A-8)})):X.debug("No Node "+b+": "+JSON.stringify(l.node(b)))});let v=y.getBBox();l.edges().forEach(function(b){b!==void 0&&l.edge(b)!==void 0&&(X.debug("Edge "+b.v+" -> "+b.w+": "+JSON.stringify(l.edge(b))),Rve(e,l.edge(b),l.edge(b).relation))}),v=y.getBBox();let x={id:r||"root",label:r||"root",width:0,height:0};return x.width=v.width+2*bo.padding,x.height=v.height+2*bo.padding,X.debug("Doc rendered",x,l),x},"renderDoc"),Ive={setConf:get,draw:vet}});var Pve={};dr(Pve,{diagram:()=>bet});var bet,Bve=N(()=>{"use strict";h$();gC();C$();Ove();bet={parser:oC,get db(){return new al(1)},renderer:Ive,styles:yC,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var zve={};dr(zve,{diagram:()=>Eet});var Eet,Gve=N(()=>{"use strict";h$();gC();C$();S$();Eet={parser:oC,get db(){return new al(2)},renderer:Sve,styles:yC,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var D$,Hve,qve=N(()=>{"use strict";D$=(function(){var t=o(function(d,p,m,g){for(m=m||{},g=d.length;g--;m[d[g]]=p);return m},"o"),e=[6,8,10,11,12,14,16,17,18],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,14],u={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:o(function(p,m,g,y,v,x,b){var T=x.length-1;switch(v){case 1:return x[T-1];case 2:this.$=[];break;case 3:x[T-1].push(x[T]),this.$=x[T-1];break;case 4:case 5:this.$=x[T];break;case 6:case 7:this.$=[];break;case 8:y.setDiagramTitle(x[T].substr(6)),this.$=x[T].substr(6);break;case 9:this.$=x[T].trim(),y.setAccTitle(this.$);break;case 10:case 11:this.$=x[T].trim(),y.setAccDescription(this.$);break;case 12:y.addSection(x[T].substr(8)),this.$=x[T].substr(8);break;case 13:y.addTask(x[T-1],x[T]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:o(function(p,m){if(m.recoverable)this.trace(p);else{var g=new Error(p);throw g.hash=m,g}},"parseError"),parse:o(function(p){var m=this,g=[0],y=[],v=[null],x=[],b=this.table,T="",S=0,w=0,k=0,A=2,C=1,R=x.slice.call(arguments,1),I=Object.create(this.lexer),L={yy:{}};for(var E in this.yy)Object.prototype.hasOwnProperty.call(this.yy,E)&&(L.yy[E]=this.yy[E]);I.setInput(p,L.yy),L.yy.lexer=I,L.yy.parser=this,typeof I.yylloc>"u"&&(I.yylloc={});var D=I.yylloc;x.push(D);var _=I.options&&I.options.ranges;typeof L.yy.parseError=="function"?this.parseError=L.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function O(re){g.length=g.length-2*re,v.length=v.length-re,x.length=x.length-re}o(O,"popStack");function M(){var re;return re=y.pop()||I.lex()||C,typeof re!="number"&&(re instanceof Array&&(y=re,re=y.pop()),re=m.symbols_[re]||re),re}o(M,"lex");for(var P,B,F,G,$,U,j={},te,Y,oe,J;;){if(F=g[g.length-1],this.defaultActions[F]?G=this.defaultActions[F]:((P===null||typeof P>"u")&&(P=M()),G=b[F]&&b[F][P]),typeof G>"u"||!G.length||!G[0]){var ue="";J=[];for(te in b[F])this.terminals_[te]&&te>A&&J.push("'"+this.terminals_[te]+"'");I.showPosition?ue="Parse error on line "+(S+1)+`: +`+I.showPosition()+` +Expecting `+J.join(", ")+", got '"+(this.terminals_[P]||P)+"'":ue="Parse error on line "+(S+1)+": Unexpected "+(P==C?"end of input":"'"+(this.terminals_[P]||P)+"'"),this.parseError(ue,{text:I.match,token:this.terminals_[P]||P,line:I.yylineno,loc:D,expected:J})}if(G[0]instanceof Array&&G.length>1)throw new Error("Parse Error: multiple actions possible at state: "+F+", token: "+P);switch(G[0]){case 1:g.push(P),v.push(I.yytext),x.push(I.yylloc),g.push(G[1]),P=null,B?(P=B,B=null):(w=I.yyleng,T=I.yytext,S=I.yylineno,D=I.yylloc,k>0&&k--);break;case 2:if(Y=this.productions_[G[1]][1],j.$=v[v.length-Y],j._$={first_line:x[x.length-(Y||1)].first_line,last_line:x[x.length-1].last_line,first_column:x[x.length-(Y||1)].first_column,last_column:x[x.length-1].last_column},_&&(j._$.range=[x[x.length-(Y||1)].range[0],x[x.length-1].range[1]]),U=this.performAction.apply(j,[T,w,S,L.yy,G[1],v,x].concat(R)),typeof U<"u")return U;Y&&(g=g.slice(0,-1*Y*2),v=v.slice(0,-1*Y),x=x.slice(0,-1*Y)),g.push(this.productions_[G[1]][0]),v.push(j.$),x.push(j._$),oe=b[g[g.length-2]][g[g.length-1]],g.push(oe);break;case 3:return!0}}return!0},"parse")},h=(function(){var d={EOF:1,parseError:o(function(m,g){if(this.yy.parser)this.yy.parser.parseError(m,g);else throw new Error(m)},"parseError"),setInput:o(function(p,m){return this.yy=m||this.yy||{},this._input=p,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var p=this._input[0];this.yytext+=p,this.yyleng++,this.offset++,this.match+=p,this.matched+=p;var m=p.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),p},"input"),unput:o(function(p){var m=p.length,g=p.split(/(?:\r\n?|\n)/g);this._input=p+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var v=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===y.length?this.yylloc.first_column:0)+y[y.length-g.length].length-g[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[v[0],v[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(p){this.unput(this.match.slice(p))},"less"),pastInput:o(function(){var p=this.matched.substr(0,this.matched.length-this.match.length);return(p.length>20?"...":"")+p.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var p=this.match;return p.length<20&&(p+=this._input.substr(0,20-p.length)),(p.substr(0,20)+(p.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var p=this.pastInput(),m=new Array(p.length+1).join("-");return p+this.upcomingInput()+` +`+m+"^"},"showPosition"),test_match:o(function(p,m){var g,y,v;if(this.options.backtrack_lexer&&(v={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(v.yylloc.range=this.yylloc.range.slice(0))),y=p[0].match(/(?:\r\n?|\n).*/g),y&&(this.yylineno+=y.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:y?y[y.length-1].length-y[y.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+p[0].length},this.yytext+=p[0],this.match+=p[0],this.matches=p,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(p[0].length),this.matched+=p[0],g=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),g)return g;if(this._backtrack){for(var x in v)this[x]=v[x];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var p,m,g,y;this._more||(this.yytext="",this.match="");for(var v=this._currentRules(),x=0;xm[0].length)){if(m=g,y=x,this.options.backtrack_lexer){if(p=this.test_match(g,v[x]),p!==!1)return p;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(p=this.test_match(m,v[y]),p!==!1?p:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var m=this.next();return m||this.lex()},"lex"),begin:o(function(m){this.conditionStack.push(m)},"begin"),popState:o(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:o(function(m){this.begin(m)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(m,g,y,v){var x=v;switch(y){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return d})();u.lexer=h;function f(){this.yy={}}return o(f,"Parser"),f.prototype=u,u.Parser=f,new f})();D$.parser=D$;Hve=D$});var cy,L$,S4,C4,Det,Let,Ret,Net,Met,Iet,Oet,Wve,Pet,R$,Yve=N(()=>{"use strict";Xt();ci();cy="",L$=[],S4=[],C4=[],Det=o(function(){L$.length=0,S4.length=0,cy="",C4.length=0,Sr()},"clear"),Let=o(function(t){cy=t,L$.push(t)},"addSection"),Ret=o(function(){return L$},"getSections"),Net=o(function(){let t=Wve(),e=100,r=0;for(;!t&&r{r.people&&t.push(...r.people)}),[...new Set(t)].sort()},"updateActors"),Iet=o(function(t,e){let r=e.substr(1).split(":"),n=0,i=[];r.length===1?(n=Number(r[0]),i=[]):(n=Number(r[0]),i=r[1].split(","));let a=i.map(l=>l.trim()),s={section:cy,type:cy,people:a,task:t,score:n};C4.push(s)},"addTask"),Oet=o(function(t){let e={section:cy,type:cy,description:t,task:t,classes:[]};S4.push(e)},"addTaskOrg"),Wve=o(function(){let t=o(function(r){return C4[r].processed},"compileTask"),e=!0;for(let[r,n]of C4.entries())t(r),e=e&&n.processed;return e},"compileTasks"),Pet=o(function(){return Met()},"getActors"),R$={getConfig:o(()=>ge().journey,"getConfig"),clear:Det,setDiagramTitle:$r,getDiagramTitle:Pr,setAccTitle:Rr,getAccTitle:Mr,setAccDescription:Ir,getAccDescription:Or,addSection:Let,getSections:Ret,getTasks:Net,addTask:Iet,addTaskOrg:Oet,getActors:Pet}});var Bet,Xve,jve=N(()=>{"use strict";yg();Bet=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.textColor}; + } + .mouth { + stroke: #666; + } + + line { + stroke: ${t.textColor} + } + + .legend { + fill: ${t.textColor}; + font-family: ${t.fontFamily}; + } + + .label text { + fill: #333; + } + .label { + color: ${t.textColor} + } + + .face { + ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"}; + stroke: #999; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 1.5px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + rect { + opacity: 0.5; + } + text-align: center; + } + + .cluster rect { + } + + .cluster text { + fill: ${t.titleColor}; + } + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .task-type-0, .section-type-0 { + ${t.fillType0?`fill: ${t.fillType0}`:""}; + } + .task-type-1, .section-type-1 { + ${t.fillType0?`fill: ${t.fillType1}`:""}; + } + .task-type-2, .section-type-2 { + ${t.fillType0?`fill: ${t.fillType2}`:""}; + } + .task-type-3, .section-type-3 { + ${t.fillType0?`fill: ${t.fillType3}`:""}; + } + .task-type-4, .section-type-4 { + ${t.fillType0?`fill: ${t.fillType4}`:""}; + } + .task-type-5, .section-type-5 { + ${t.fillType0?`fill: ${t.fillType5}`:""}; + } + .task-type-6, .section-type-6 { + ${t.fillType0?`fill: ${t.fillType6}`:""}; + } + .task-type-7, .section-type-7 { + ${t.fillType0?`fill: ${t.fillType7}`:""}; + } + + .actor-0 { + ${t.actor0?`fill: ${t.actor0}`:""}; + } + .actor-1 { + ${t.actor1?`fill: ${t.actor1}`:""}; + } + .actor-2 { + ${t.actor2?`fill: ${t.actor2}`:""}; + } + .actor-3 { + ${t.actor3?`fill: ${t.actor3}`:""}; + } + .actor-4 { + ${t.actor4?`fill: ${t.actor4}`:""}; + } + .actor-5 { + ${t.actor5?`fill: ${t.actor5}`:""}; + } + ${zc()} +`,"getStyles"),Xve=Bet});var N$,Fet,Qve,Zve,$et,zet,Kve,Get,Vet,Jve,Uet,uy,e2e=N(()=>{"use strict";yr();r2();N$=o(function(t,e){return Fd(t,e)},"drawRect"),Fet=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=Sl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=Sl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),Qve=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),Zve=o(function(t,e){return bj(t,e)},"drawText"),$et=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,Zve(t,e)},"drawLabel"),zet=o(function(t,e,r){let n=t.append("g"),i=ua();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width*e.taskCount+r.diagramMarginX*(e.taskCount-1),i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,N$(n,i),Jve(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),Kve=-1,Get=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");Kve++,i.append("line").attr("id","task"+Kve).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),Fet(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=ua();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,N$(i,s);let l=e.x+14;e.people.forEach(u=>{let h=e.actors[u].color,f={cx:l,cy:e.y,r:7,fill:h,stroke:"#000",title:u,pos:e.actors[u].position};Qve(i,f),l+=10}),Jve(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),Vet=o(function(t,e){sT(t,e)},"drawBackgroundRect"),Jve=(function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{let a=lh[i].color,s={cx:20,cy:n,r:7,fill:a,stroke:"#000",pos:lh[i].position};uy.drawCircle(t,s);let l=t.append("text").attr("visibility","hidden").text(i),u=l.node().getBoundingClientRect().width;l.remove();let h=[];if(u<=r)h=[i];else{let f=i.split(" "),d="";l=t.append("text").attr("visibility","hidden"),f.forEach(p=>{let m=d?`${d} ${p}`:p;if(l.text(m),l.node().getBoundingClientRect().width>r){if(d&&h.push(d),d=p,l.text(p),l.node().getBoundingClientRect().width>r){let y="";for(let v of p)y+=v,l.text(y+"-"),l.node().getBoundingClientRect().width>r&&(h.push(y.slice(0,-1)+"-"),y=v);d=y}}else d=m}),d&&h.push(d),l.remove()}h.forEach((f,d)=>{let p={x:40,y:n+7+d*20,fill:"#666",text:f,textMargin:e.boxTextMargin??5},g=uy.drawText(t,p).node().getBoundingClientRect().width;g>vC&&g>e.leftMargin-g&&(vC=g)}),n+=Math.max(20,h.length*20)})}var Het,lh,vC,Hl,Jf,Wet,sl,M$,t2e,Yet,I$,r2e=N(()=>{"use strict";yr();e2e();Xt();Ei();Het=o(function(t){Object.keys(t).forEach(function(r){Hl[r]=t[r]})},"setConf"),lh={},vC=0;o(qet,"drawActorLegend");Hl=ge().journey,Jf=0,Wet=o(function(t,e,r,n){let i=ge(),a=i.journey.titleColor,s=i.journey.titleFontSize,l=i.journey.titleFontFamily,u=i.securityLevel,h;u==="sandbox"&&(h=qe("#i"+e));let f=u==="sandbox"?qe(h.nodes()[0].contentDocument.body):qe("body");sl.init();let d=f.select("#"+e);uy.initGraphics(d);let p=n.db.getTasks(),m=n.db.getDiagramTitle(),g=n.db.getActors();for(let S in lh)delete lh[S];let y=0;g.forEach(S=>{lh[S]={color:Hl.actorColours[y%Hl.actorColours.length],position:y},y++}),qet(d),Jf=Hl.leftMargin+vC,sl.insert(0,0,Jf,Object.keys(lh).length*50),Yet(d,p,0);let v=sl.getBounds();m&&d.append("text").text(m).attr("x",Jf).attr("font-size",s).attr("font-weight","bold").attr("y",25).attr("fill",a).attr("font-family",l);let x=v.stopy-v.starty+2*Hl.diagramMarginY,b=Jf+v.stopx+2*Hl.diagramMarginX;mn(d,x,b,Hl.useMaxWidth),d.append("line").attr("x1",Jf).attr("y1",Hl.height*4).attr("x2",b-Jf-4).attr("y2",Hl.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");let T=m?70:0;d.attr("viewBox",`${v.startx} -25 ${b} ${x+T}`),d.attr("preserveAspectRatio","xMinYMin meet"),d.attr("height",x+T+25)},"draw"),sl={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:o(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=ge().journey,a=this,s=0;function l(u){return o(function(f){s++;let d=a.sequenceItems.length-s+1;a.updateVal(f,"starty",e-d*i.boxMargin,Math.min),a.updateVal(f,"stopy",n+d*i.boxMargin,Math.max),a.updateVal(sl.data,"startx",t-d*i.boxMargin,Math.min),a.updateVal(sl.data,"stopx",r+d*i.boxMargin,Math.max),u!=="activation"&&(a.updateVal(f,"startx",t-d*i.boxMargin,Math.min),a.updateVal(f,"stopx",r+d*i.boxMargin,Math.max),a.updateVal(sl.data,"starty",e-d*i.boxMargin,Math.min),a.updateVal(sl.data,"stopy",n+d*i.boxMargin,Math.max))},"updateItemBounds")}o(l,"updateFn"),this.sequenceItems.forEach(l())},"updateBounds"),insert:o(function(t,e,r,n){let i=Math.min(t,r),a=Math.max(t,r),s=Math.min(e,n),l=Math.max(e,n);this.updateVal(sl.data,"startx",i,Math.min),this.updateVal(sl.data,"starty",s,Math.min),this.updateVal(sl.data,"stopx",a,Math.max),this.updateVal(sl.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return this.data},"getBounds")},M$=Hl.sectionFills,t2e=Hl.sectionColours,Yet=o(function(t,e,r){let n=ge().journey,i="",a=n.height*2+n.diagramMarginY,s=r+a,l=0,u="#CCC",h="black",f=0;for(let[d,p]of e.entries()){if(i!==p.section){u=M$[l%M$.length],f=l%M$.length,h=t2e[l%t2e.length];let g=0,y=p.section;for(let x=d;x(lh[y]&&(g[y]=lh[y]),g),{});p.x=d*n.taskMargin+d*n.width+Jf,p.y=s,p.width=n.diagramMarginX,p.height=n.diagramMarginY,p.colour=h,p.fill=u,p.num=f,p.actors=m,uy.drawTask(t,p,n),sl.insert(p.x,p.y,p.x+p.width+n.taskMargin,450)}},"drawTasks"),I$={setConf:Het,draw:Wet}});var n2e={};dr(n2e,{diagram:()=>Xet});var Xet,i2e=N(()=>{"use strict";qve();Yve();jve();r2e();Xet={parser:Hve,db:R$,renderer:I$,styles:Xve,init:o(t=>{I$.setConf(t.journey),R$.clear()},"init")}});var P$,h2e,f2e=N(()=>{"use strict";P$=(function(){var t=o(function(p,m,g,y){for(g=g||{},y=p.length;y--;g[p[y]]=m);return g},"o"),e=[6,8,10,11,12,14,16,17,20,21],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,16],u=[1,17],h={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,period_statement:18,event_statement:19,period:20,event:21,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",20:"period",21:"event"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],performAction:o(function(m,g,y,v,x,b,T){var S=b.length-1;switch(x){case 1:return b[S-1];case 2:this.$=[];break;case 3:b[S-1].push(b[S]),this.$=b[S-1];break;case 4:case 5:this.$=b[S];break;case 6:case 7:this.$=[];break;case 8:v.getCommonDb().setDiagramTitle(b[S].substr(6)),this.$=b[S].substr(6);break;case 9:this.$=b[S].trim(),v.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=b[S].trim(),v.getCommonDb().setAccDescription(this.$);break;case 12:v.addSection(b[S].substr(8)),this.$=b[S].substr(8);break;case 15:v.addTask(b[S],0,""),this.$=b[S];break;case 16:v.addEvent(b[S].substr(2)),this.$=b[S];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:18,11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,19]},{15:[1,20]},t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),t(e,[2,4]),t(e,[2,9]),t(e,[2,10])],defaultActions:{},parseError:o(function(m,g){if(g.recoverable)this.trace(m);else{var y=new Error(m);throw y.hash=g,y}},"parseError"),parse:o(function(m){var g=this,y=[0],v=[],x=[null],b=[],T=this.table,S="",w=0,k=0,A=0,C=2,R=1,I=b.slice.call(arguments,1),L=Object.create(this.lexer),E={yy:{}};for(var D in this.yy)Object.prototype.hasOwnProperty.call(this.yy,D)&&(E.yy[D]=this.yy[D]);L.setInput(m,E.yy),E.yy.lexer=L,E.yy.parser=this,typeof L.yylloc>"u"&&(L.yylloc={});var _=L.yylloc;b.push(_);var O=L.options&&L.options.ranges;typeof E.yy.parseError=="function"?this.parseError=E.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function M(ee){y.length=y.length-2*ee,x.length=x.length-ee,b.length=b.length-ee}o(M,"popStack");function P(){var ee;return ee=v.pop()||L.lex()||R,typeof ee!="number"&&(ee instanceof Array&&(v=ee,ee=v.pop()),ee=g.symbols_[ee]||ee),ee}o(P,"lex");for(var B,F,G,$,U,j,te={},Y,oe,J,ue;;){if(G=y[y.length-1],this.defaultActions[G]?$=this.defaultActions[G]:((B===null||typeof B>"u")&&(B=P()),$=T[G]&&T[G][B]),typeof $>"u"||!$.length||!$[0]){var re="";ue=[];for(Y in T[G])this.terminals_[Y]&&Y>C&&ue.push("'"+this.terminals_[Y]+"'");L.showPosition?re="Parse error on line "+(w+1)+`: +`+L.showPosition()+` +Expecting `+ue.join(", ")+", got '"+(this.terminals_[B]||B)+"'":re="Parse error on line "+(w+1)+": Unexpected "+(B==R?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(re,{text:L.match,token:this.terminals_[B]||B,line:L.yylineno,loc:_,expected:ue})}if($[0]instanceof Array&&$.length>1)throw new Error("Parse Error: multiple actions possible at state: "+G+", token: "+B);switch($[0]){case 1:y.push(B),x.push(L.yytext),b.push(L.yylloc),y.push($[1]),B=null,F?(B=F,F=null):(k=L.yyleng,S=L.yytext,w=L.yylineno,_=L.yylloc,A>0&&A--);break;case 2:if(oe=this.productions_[$[1]][1],te.$=x[x.length-oe],te._$={first_line:b[b.length-(oe||1)].first_line,last_line:b[b.length-1].last_line,first_column:b[b.length-(oe||1)].first_column,last_column:b[b.length-1].last_column},O&&(te._$.range=[b[b.length-(oe||1)].range[0],b[b.length-1].range[1]]),j=this.performAction.apply(te,[S,k,w,E.yy,$[1],x,b].concat(I)),typeof j<"u")return j;oe&&(y=y.slice(0,-1*oe*2),x=x.slice(0,-1*oe),b=b.slice(0,-1*oe)),y.push(this.productions_[$[1]][0]),x.push(te.$),b.push(te._$),J=T[y[y.length-2]][y[y.length-1]],y.push(J);break;case 3:return!0}}return!0},"parse")},f=(function(){var p={EOF:1,parseError:o(function(g,y){if(this.yy.parser)this.yy.parser.parseError(g,y);else throw new Error(g)},"parseError"),setInput:o(function(m,g){return this.yy=g||this.yy||{},this._input=m,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var m=this._input[0];this.yytext+=m,this.yyleng++,this.offset++,this.match+=m,this.matched+=m;var g=m.match(/(?:\r\n?|\n).*/g);return g?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),m},"input"),unput:o(function(m){var g=m.length,y=m.split(/(?:\r\n?|\n)/g);this._input=m+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-g),this.offset-=g;var v=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),y.length-1&&(this.yylineno-=y.length-1);var x=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:y?(y.length===v.length?this.yylloc.first_column:0)+v[v.length-y.length].length-y[0].length:this.yylloc.first_column-g},this.options.ranges&&(this.yylloc.range=[x[0],x[0]+this.yyleng-g]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(m){this.unput(this.match.slice(m))},"less"),pastInput:o(function(){var m=this.matched.substr(0,this.matched.length-this.match.length);return(m.length>20?"...":"")+m.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var m=this.match;return m.length<20&&(m+=this._input.substr(0,20-m.length)),(m.substr(0,20)+(m.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var m=this.pastInput(),g=new Array(m.length+1).join("-");return m+this.upcomingInput()+` +`+g+"^"},"showPosition"),test_match:o(function(m,g){var y,v,x;if(this.options.backtrack_lexer&&(x={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(x.yylloc.range=this.yylloc.range.slice(0))),v=m[0].match(/(?:\r\n?|\n).*/g),v&&(this.yylineno+=v.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:v?v[v.length-1].length-v[v.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+m[0].length},this.yytext+=m[0],this.match+=m[0],this.matches=m,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(m[0].length),this.matched+=m[0],y=this.performAction.call(this,this.yy,this,g,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),y)return y;if(this._backtrack){for(var b in x)this[b]=x[b];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var m,g,y,v;this._more||(this.yytext="",this.match="");for(var x=this._currentRules(),b=0;bg[0].length)){if(g=y,v=b,this.options.backtrack_lexer){if(m=this.test_match(y,x[b]),m!==!1)return m;if(this._backtrack){g=!1;continue}else return!1}else if(!this.options.flex)break}return g?(m=this.test_match(g,x[v]),m!==!1?m:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var g=this.next();return g||this.lex()},"lex"),begin:o(function(g){this.conditionStack.push(g)},"begin"),popState:o(function(){var g=this.conditionStack.length-1;return g>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(g){return g=this.conditionStack.length-1-Math.abs(g||0),g>=0?this.conditionStack[g]:"INITIAL"},"topState"),pushState:o(function(g){this.begin(g)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(g,y,v,x){var b=x;switch(v){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s(?:[^:\n]|:(?!\s))+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return p})();h.lexer=f;function d(){this.yy={}}return o(d,"Parser"),d.prototype=h,h.Parser=d,new d})();P$.parser=P$;h2e=P$});var F$={};dr(F$,{addEvent:()=>T2e,addSection:()=>y2e,addTask:()=>b2e,addTaskOrg:()=>w2e,clear:()=>g2e,default:()=>ntt,getCommonDb:()=>m2e,getSections:()=>v2e,getTasks:()=>x2e});var hy,p2e,B$,xC,fy,m2e,g2e,y2e,v2e,x2e,b2e,T2e,w2e,d2e,ntt,k2e=N(()=>{"use strict";ci();hy="",p2e=0,B$=[],xC=[],fy=[],m2e=o(()=>rv,"getCommonDb"),g2e=o(function(){B$.length=0,xC.length=0,hy="",fy.length=0,Sr()},"clear"),y2e=o(function(t){hy=t,B$.push(t)},"addSection"),v2e=o(function(){return B$},"getSections"),x2e=o(function(){let t=d2e(),e=100,r=0;for(;!t&&rr.id===p2e-1).events.push(t)},"addEvent"),w2e=o(function(t){let e={section:hy,type:hy,description:t,task:t,classes:[]};xC.push(e)},"addTaskOrg"),d2e=o(function(){let t=o(function(r){return fy[r].processed},"compileTask"),e=!0;for(let[r,n]of fy.entries())t(r),e=e&&n.processed;return e},"compileTasks"),ntt={clear:g2e,getCommonDb:m2e,addSection:y2e,getSections:v2e,getTasks:x2e,addTask:b2e,addTaskOrg:w2e,addEvent:T2e}});function A2e(t,e){t.each(function(){var r=qe(this),n=r.text().split(/(\s+|
    )/).reverse(),i,a=[],s=1.1,l=r.attr("y"),u=parseFloat(r.attr("dy")),h=r.text(null).append("tspan").attr("x",0).attr("y",l).attr("dy",u+"em");for(let f=0;fe||i==="
    ")&&(a.pop(),h.text(a.join(" ").trim()),i==="
    "?a=[""]:a=[i],h=r.append("tspan").attr("x",0).attr("y",l).attr("dy",s+"em").text(i))})}var itt,bC,att,stt,S2e,ott,ltt,E2e,ctt,utt,htt,$$,C2e,ftt,dtt,ptt,mtt,ed,_2e=N(()=>{"use strict";yr();itt=12,bC=o(function(t,e){let r=t.append("rect");return r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),r.attr("rx",e.rx),r.attr("ry",e.ry),e.class!==void 0&&r.attr("class",e.class),r},"drawRect"),att=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=Sl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=Sl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),stt=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),S2e=o(function(t,e){let r=e.text.replace(//gi," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class!==void 0&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),ott=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,S2e(t,e)},"drawLabel"),ltt=o(function(t,e,r){let n=t.append("g"),i=$$();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width,i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,bC(n,i),C2e(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),E2e=-1,ctt=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");E2e++,i.append("line").attr("id","task"+E2e).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),att(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=$$();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,bC(i,s),C2e(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),utt=o(function(t,e){bC(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},"drawBackgroundRect"),htt=o(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),$$=o(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),C2e=(function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{"use strict";yr();_2e();pt();Xt();Ei();gtt=o(function(t,e,r,n){let i=ge(),a=i.timeline?.leftMargin??50;X.debug("timeline",n.db);let s=i.securityLevel,l;s==="sandbox"&&(l=qe("#i"+e));let h=(s==="sandbox"?qe(l.nodes()[0].contentDocument.body):qe("body")).select("#"+e);h.append("g");let f=n.db.getTasks(),d=n.db.getCommonDb().getDiagramTitle();X.debug("task",f),ed.initGraphics(h);let p=n.db.getSections();X.debug("sections",p);let m=0,g=0,y=0,v=0,x=50+a,b=50;v=50;let T=0,S=!0;p.forEach(function(R){let I={number:T,descr:R,section:T,width:150,padding:20,maxHeight:m},L=ed.getVirtualNodeHeight(h,I,i);X.debug("sectionHeight before draw",L),m=Math.max(m,L+20)});let w=0,k=0;X.debug("tasks.length",f.length);for(let[R,I]of f.entries()){let L={number:R,descr:I,section:I.section,width:150,padding:20,maxHeight:g},E=ed.getVirtualNodeHeight(h,L,i);X.debug("taskHeight before draw",E),g=Math.max(g,E+20),w=Math.max(w,I.events.length);let D=0;for(let _ of I.events){let O={descr:_,section:I.section,number:I.section,width:150,padding:20,maxHeight:50};D+=ed.getVirtualNodeHeight(h,O,i)}I.events.length>0&&(D+=(I.events.length-1)*10),k=Math.max(k,D)}X.debug("maxSectionHeight before draw",m),X.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach(R=>{let I=f.filter(_=>_.section===R),L={number:T,descr:R,section:T,width:200*Math.max(I.length,1)-50,padding:20,maxHeight:m};X.debug("sectionNode",L);let E=h.append("g"),D=ed.drawNode(E,L,T,i);X.debug("sectionNode output",D),E.attr("transform",`translate(${x}, ${v})`),b+=m+50,I.length>0&&D2e(h,I,T,x,b,g,i,w,k,m,!1),x+=200*Math.max(I.length,1),b=v,T++}):(S=!1,D2e(h,f,T,x,b,g,i,w,k,m,!0));let A=h.node().getBBox();X.debug("bounds",A),d&&h.append("text").text(d).attr("x",A.width/2-a).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),y=S?m+g+150:g+100,h.append("g").attr("class","lineWrapper").append("line").attr("x1",a).attr("y1",y).attr("x2",A.width+3*a).attr("y2",y).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),ic(void 0,h,i.timeline?.padding??50,i.timeline?.useMaxWidth??!1)},"draw"),D2e=o(function(t,e,r,n,i,a,s,l,u,h,f){for(let d of e){let p={descr:d.task,section:r,number:r,width:150,padding:20,maxHeight:a};X.debug("taskNode",p);let m=t.append("g").attr("class","taskWrapper"),y=ed.drawNode(m,p,r,s).height;if(X.debug("taskHeight after draw",y),m.attr("transform",`translate(${n}, ${i})`),a=Math.max(a,y),d.events){let v=t.append("g").attr("class","lineWrapper"),x=a;i+=100,x=x+ytt(t,d.events,r,n,i,s),i-=100,v.append("line").attr("x1",n+190/2).attr("y1",i+a).attr("x2",n+190/2).attr("y2",i+a+100+u+100).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}n=n+200,f&&!s.timeline?.disableMulticolor&&r++}i=i-10},"drawTasks"),ytt=o(function(t,e,r,n,i,a){let s=0,l=i;i=i+100;for(let u of e){let h={descr:u,section:r,number:r,width:150,padding:20,maxHeight:50};X.debug("eventNode",h);let f=t.append("g").attr("class","eventWrapper"),p=ed.drawNode(f,h,r,a).height;s=s+p,f.attr("transform",`translate(${n}, ${i})`),i=i+10+p}return i=l,s},"drawEvents"),L2e={setConf:o(()=>{},"setConf"),draw:gtt}});var vtt,xtt,N2e,M2e=N(()=>{"use strict";eo();vtt=o(t=>{let e="";for(let r=0;r` + .edge { + stroke-width: 3; + } + ${vtt(t)} + .section-root rect, .section-root path, .section-root circle { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + } +`,"getStyles"),N2e=xtt});var I2e={};dr(I2e,{diagram:()=>btt});var btt,O2e=N(()=>{"use strict";f2e();k2e();R2e();M2e();btt={db:F$,renderer:L2e,parser:h2e,styles:N2e}});var z$,F2e,$2e=N(()=>{"use strict";z$=(function(){var t=o(function(S,w,k,A){for(k=k||{},A=S.length;A--;k[S[A]]=w);return k},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,6,13,15,16,19,22],g=[1,33],y=[1,34],v=[1,6,7,11,13,15,16,19,22],x={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:o(function(w,k,A,C,R,I,L){var E=I.length-1;switch(R){case 6:case 7:return C;case 8:C.getLogger().trace("Stop NL ");break;case 9:C.getLogger().trace("Stop EOF ");break;case 11:C.getLogger().trace("Stop NL2 ");break;case 12:C.getLogger().trace("Stop EOF2 ");break;case 15:C.getLogger().info("Node: ",I[E].id),C.addNode(I[E-1].length,I[E].id,I[E].descr,I[E].type);break;case 16:C.getLogger().trace("Icon: ",I[E]),C.decorateNode({icon:I[E]});break;case 17:case 21:C.decorateNode({class:I[E]});break;case 18:C.getLogger().trace("SPACELIST");break;case 19:C.getLogger().trace("Node: ",I[E].id),C.addNode(0,I[E].id,I[E].descr,I[E].type);break;case 20:C.decorateNode({icon:I[E]});break;case 25:C.getLogger().trace("node found ..",I[E-2]),this.$={id:I[E-1],descr:I[E-1],type:C.getType(I[E-2],I[E])};break;case 26:this.$={id:I[E],descr:I[E],type:C.nodeType.DEFAULT};break;case 27:C.getLogger().trace("node found ..",I[E-3]),this.$={id:I[E-3],descr:I[E-1],type:C.getType(I[E-2],I[E])};break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:r,9:22,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:h,7:f,10:23,11:d},t(p,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:s,22:l}),t(p,[2,18]),t(p,[2,19]),t(p,[2,20]),t(p,[2,21]),t(p,[2,23]),t(p,[2,24]),t(p,[2,26],{19:[1,30]}),{20:[1,31]},{6:h,7:f,10:32,11:d},{1:[2,7],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(m,[2,14],{7:g,11:y}),t(v,[2,8]),t(v,[2,9]),t(v,[2,10]),t(p,[2,15]),t(p,[2,16]),t(p,[2,17]),{20:[1,35]},{21:[1,36]},t(m,[2,13],{7:g,11:y}),t(v,[2,11]),t(v,[2,12]),{21:[1,37]},t(p,[2,25]),t(p,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(w,k){if(k.recoverable)this.trace(w);else{var A=new Error(w);throw A.hash=k,A}},"parseError"),parse:o(function(w){var k=this,A=[0],C=[],R=[null],I=[],L=this.table,E="",D=0,_=0,O=0,M=2,P=1,B=I.slice.call(arguments,1),F=Object.create(this.lexer),G={yy:{}};for(var $ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,$)&&(G.yy[$]=this.yy[$]);F.setInput(w,G.yy),G.yy.lexer=F,G.yy.parser=this,typeof F.yylloc>"u"&&(F.yylloc={});var U=F.yylloc;I.push(U);var j=F.options&&F.options.ranges;typeof G.yy.parseError=="function"?this.parseError=G.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function te(q){A.length=A.length-2*q,R.length=R.length-q,I.length=I.length-q}o(te,"popStack");function Y(){var q;return q=C.pop()||F.lex()||P,typeof q!="number"&&(q instanceof Array&&(C=q,q=C.pop()),q=k.symbols_[q]||q),q}o(Y,"lex");for(var oe,J,ue,re,ee,Z,K={},ae,Q,de,ne;;){if(ue=A[A.length-1],this.defaultActions[ue]?re=this.defaultActions[ue]:((oe===null||typeof oe>"u")&&(oe=Y()),re=L[ue]&&L[ue][oe]),typeof re>"u"||!re.length||!re[0]){var Te="";ne=[];for(ae in L[ue])this.terminals_[ae]&&ae>M&&ne.push("'"+this.terminals_[ae]+"'");F.showPosition?Te="Parse error on line "+(D+1)+`: +`+F.showPosition()+` +Expecting `+ne.join(", ")+", got '"+(this.terminals_[oe]||oe)+"'":Te="Parse error on line "+(D+1)+": Unexpected "+(oe==P?"end of input":"'"+(this.terminals_[oe]||oe)+"'"),this.parseError(Te,{text:F.match,token:this.terminals_[oe]||oe,line:F.yylineno,loc:U,expected:ne})}if(re[0]instanceof Array&&re.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ue+", token: "+oe);switch(re[0]){case 1:A.push(oe),R.push(F.yytext),I.push(F.yylloc),A.push(re[1]),oe=null,J?(oe=J,J=null):(_=F.yyleng,E=F.yytext,D=F.yylineno,U=F.yylloc,O>0&&O--);break;case 2:if(Q=this.productions_[re[1]][1],K.$=R[R.length-Q],K._$={first_line:I[I.length-(Q||1)].first_line,last_line:I[I.length-1].last_line,first_column:I[I.length-(Q||1)].first_column,last_column:I[I.length-1].last_column},j&&(K._$.range=[I[I.length-(Q||1)].range[0],I[I.length-1].range[1]]),Z=this.performAction.apply(K,[E,_,D,G.yy,re[1],R,I].concat(B)),typeof Z<"u")return Z;Q&&(A=A.slice(0,-1*Q*2),R=R.slice(0,-1*Q),I=I.slice(0,-1*Q)),A.push(this.productions_[re[1]][0]),R.push(K.$),I.push(K._$),de=L[A[A.length-2]][A[A.length-1]],A.push(de);break;case 3:return!0}}return!0},"parse")},b=(function(){var S={EOF:1,parseError:o(function(k,A){if(this.yy.parser)this.yy.parser.parseError(k,A);else throw new Error(k)},"parseError"),setInput:o(function(w,k){return this.yy=k||this.yy||{},this._input=w,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var w=this._input[0];this.yytext+=w,this.yyleng++,this.offset++,this.match+=w,this.matched+=w;var k=w.match(/(?:\r\n?|\n).*/g);return k?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),w},"input"),unput:o(function(w){var k=w.length,A=w.split(/(?:\r\n?|\n)/g);this._input=w+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-k),this.offset-=k;var C=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),A.length-1&&(this.yylineno-=A.length-1);var R=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:A?(A.length===C.length?this.yylloc.first_column:0)+C[C.length-A.length].length-A[0].length:this.yylloc.first_column-k},this.options.ranges&&(this.yylloc.range=[R[0],R[0]+this.yyleng-k]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(w){this.unput(this.match.slice(w))},"less"),pastInput:o(function(){var w=this.matched.substr(0,this.matched.length-this.match.length);return(w.length>20?"...":"")+w.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var w=this.match;return w.length<20&&(w+=this._input.substr(0,20-w.length)),(w.substr(0,20)+(w.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var w=this.pastInput(),k=new Array(w.length+1).join("-");return w+this.upcomingInput()+` +`+k+"^"},"showPosition"),test_match:o(function(w,k){var A,C,R;if(this.options.backtrack_lexer&&(R={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(R.yylloc.range=this.yylloc.range.slice(0))),C=w[0].match(/(?:\r\n?|\n).*/g),C&&(this.yylineno+=C.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:C?C[C.length-1].length-C[C.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+w[0].length},this.yytext+=w[0],this.match+=w[0],this.matches=w,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(w[0].length),this.matched+=w[0],A=this.performAction.call(this,this.yy,this,k,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),A)return A;if(this._backtrack){for(var I in R)this[I]=R[I];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var w,k,A,C;this._more||(this.yytext="",this.match="");for(var R=this._currentRules(),I=0;Ik[0].length)){if(k=A,C=I,this.options.backtrack_lexer){if(w=this.test_match(A,R[I]),w!==!1)return w;if(this._backtrack){k=!1;continue}else return!1}else if(!this.options.flex)break}return k?(w=this.test_match(k,R[C]),w!==!1?w:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var k=this.next();return k||this.lex()},"lex"),begin:o(function(k){this.conditionStack.push(k)},"begin"),popState:o(function(){var k=this.conditionStack.length-1;return k>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(k){return k=this.conditionStack.length-1-Math.abs(k||0),k>=0?this.conditionStack[k]:"INITIAL"},"topState"),pushState:o(function(k){this.begin(k)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(k,A,C,R){var I=R;switch(C){case 0:return k.getLogger().trace("Found comment",A.yytext),6;break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;break;case 4:this.popState();break;case 5:k.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return k.getLogger().trace("SPACELINE"),6;break;case 7:return 7;case 8:return 15;case 9:k.getLogger().trace("end icon"),this.popState();break;case 10:return k.getLogger().trace("Exploding node"),this.begin("NODE"),19;break;case 11:return k.getLogger().trace("Cloud"),this.begin("NODE"),19;break;case 12:return k.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;break;case 13:return k.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;break;case 14:return this.begin("NODE"),19;break;case 15:return this.begin("NODE"),19;break;case 16:return this.begin("NODE"),19;break;case 17:return this.begin("NODE"),19;break;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:k.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return k.getLogger().trace("description:",A.yytext),"NODE_DESCR";break;case 26:this.popState();break;case 27:return this.popState(),k.getLogger().trace("node end ))"),"NODE_DEND";break;case 28:return this.popState(),k.getLogger().trace("node end )"),"NODE_DEND";break;case 29:return this.popState(),k.getLogger().trace("node end ...",A.yytext),"NODE_DEND";break;case 30:return this.popState(),k.getLogger().trace("node end (("),"NODE_DEND";break;case 31:return this.popState(),k.getLogger().trace("node end (-"),"NODE_DEND";break;case 32:return this.popState(),k.getLogger().trace("node end (-"),"NODE_DEND";break;case 33:return this.popState(),k.getLogger().trace("node end (("),"NODE_DEND";break;case 34:return this.popState(),k.getLogger().trace("node end (("),"NODE_DEND";break;case 35:return k.getLogger().trace("Long description:",A.yytext),20;break;case 36:return k.getLogger().trace("Long description:",A.yytext),20;break}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return S})();x.lexer=b;function T(){this.yy={}}return o(T,"Parser"),T.prototype=x,x.Parser=T,new T})();z$.parser=z$;F2e=z$});function z2e(t,e=0){return(Aa[t[e+0]]+Aa[t[e+1]]+Aa[t[e+2]]+Aa[t[e+3]]+"-"+Aa[t[e+4]]+Aa[t[e+5]]+"-"+Aa[t[e+6]]+Aa[t[e+7]]+"-"+Aa[t[e+8]]+Aa[t[e+9]]+"-"+Aa[t[e+10]]+Aa[t[e+11]]+Aa[t[e+12]]+Aa[t[e+13]]+Aa[t[e+14]]+Aa[t[e+15]]).toLowerCase()}var Aa,G2e=N(()=>{"use strict";Aa=[];for(let t=0;t<256;++t)Aa.push((t+256).toString(16).slice(1));o(z2e,"unsafeStringify")});function V$(){if(!G$){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");G$=crypto.getRandomValues.bind(crypto)}return G$(Ett)}var G$,Ett,V2e=N(()=>{"use strict";Ett=new Uint8Array(16);o(V$,"rng")});var Stt,U$,U2e=N(()=>{"use strict";Stt=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),U$={randomUUID:Stt}});function Ctt(t,e,r){if(U$.randomUUID&&!e&&!t)return U$.randomUUID();t=t||{};let n=t.random??t.rng?.()??V$();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,e){if(r=r||0,r<0||r+16>e.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let i=0;i<16;++i)e[r+i]=n[i];return e}return z2e(n)}var H$,H2e=N(()=>{"use strict";U2e();V2e();G2e();o(Ctt,"v4");H$=Ctt});var q2e=N(()=>{"use strict";H2e()});var ch,TC,W2e=N(()=>{"use strict";Xt();q2e();gr();pt();La();qn();ch={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},TC=class{constructor(){this.nodes=[];this.count=0;this.elements={};this.getLogger=this.getLogger.bind(this),this.nodeType=ch,this.clear(),this.getType=this.getType.bind(this),this.getElementById=this.getElementById.bind(this),this.getParent=this.getParent.bind(this),this.getMindmap=this.getMindmap.bind(this),this.addNode=this.addNode.bind(this),this.decorateNode=this.decorateNode.bind(this)}static{o(this,"MindmapDB")}clear(){this.nodes=[],this.count=0,this.elements={},this.baseLevel=void 0}getParent(e){for(let r=this.nodes.length-1;r>=0;r--)if(this.nodes[r].level0?this.nodes[0]:null}addNode(e,r,n,i){X.info("addNode",e,r,n,i);let a=!1;this.nodes.length===0?(this.baseLevel=e,e=0,a=!0):this.baseLevel!==void 0&&(e=e-this.baseLevel,a=!1);let s=ge(),l=s.mindmap?.padding??ur.mindmap.padding;switch(i){case this.nodeType.ROUNDED_RECT:case this.nodeType.RECT:case this.nodeType.HEXAGON:l*=2;break}let u={id:this.count++,nodeId:sr(r,s),level:e,descr:sr(n,s),type:i,children:[],width:s.mindmap?.maxNodeWidth??ur.mindmap.maxNodeWidth,padding:l,isRoot:a},h=this.getParent(e);if(h)h.children.push(u),this.nodes.push(u);else if(a)this.nodes.push(u);else throw new Error(`There can be only one root. No parent could be found for ("${u.descr}")`)}getType(e,r){switch(X.debug("In get type",e,r),e){case"[":return this.nodeType.RECT;case"(":return r===")"?this.nodeType.ROUNDED_RECT:this.nodeType.CLOUD;case"((":return this.nodeType.CIRCLE;case")":return this.nodeType.CLOUD;case"))":return this.nodeType.BANG;case"{{":return this.nodeType.HEXAGON;default:return this.nodeType.DEFAULT}}setElementForId(e,r){this.elements[e]=r}getElementById(e){return this.elements[e]}decorateNode(e){if(!e)return;let r=ge(),n=this.nodes[this.nodes.length-1];e.icon&&(n.icon=sr(e.icon,r)),e.class&&(n.class=sr(e.class,r))}type2Str(e){switch(e){case this.nodeType.DEFAULT:return"no-border";case this.nodeType.RECT:return"rect";case this.nodeType.ROUNDED_RECT:return"rounded-rect";case this.nodeType.CIRCLE:return"circle";case this.nodeType.CLOUD:return"cloud";case this.nodeType.BANG:return"bang";case this.nodeType.HEXAGON:return"hexgon";default:return"no-border"}}assignSections(e,r){if(e.level===0?e.section=void 0:e.section=r,e.children)for(let[n,i]of e.children.entries()){let a=e.level===0?n:r;this.assignSections(i,a)}}flattenNodes(e,r){let n=["mindmap-node"];e.isRoot===!0?n.push("section-root","section--1"):e.section!==void 0&&n.push(`section-${e.section}`),e.class&&n.push(e.class);let i=n.join(" "),a=o(l=>{switch(l){case ch.CIRCLE:return"mindmapCircle";case ch.RECT:return"rect";case ch.ROUNDED_RECT:return"rounded";case ch.CLOUD:return"cloud";case ch.BANG:return"bang";case ch.HEXAGON:return"hexagon";case ch.DEFAULT:return"defaultMindmapNode";case ch.NO_BORDER:default:return"rect"}},"getShapeFromType"),s={id:e.id.toString(),domId:"node_"+e.id.toString(),label:e.descr,isGroup:!1,shape:a(e.type),width:e.width,height:e.height??0,padding:e.padding,cssClasses:i,cssStyles:[],look:"default",icon:e.icon,x:e.x,y:e.y,level:e.level,nodeId:e.nodeId,type:e.type,section:e.section};if(r.push(s),e.children)for(let l of e.children)this.flattenNodes(l,r)}generateEdges(e,r){if(e.children)for(let n of e.children){let i="edge";n.section!==void 0&&(i+=` section-edge-${n.section}`);let a=e.level+1;i+=` edge-depth-${a}`;let s={id:`edge_${e.id}_${n.id}`,start:e.id.toString(),end:n.id.toString(),type:"normal",curve:"basis",thickness:"normal",look:"default",classes:i,depth:e.level,section:n.section};r.push(s),this.generateEdges(n,r)}}getData(){let e=this.getMindmap(),r=ge(),i=eV().layout!==void 0,a=r;if(i||(a.layout="cose-bilkent"),!e)return{nodes:[],edges:[],config:a};X.debug("getData: mindmapRoot",e,r),this.assignSections(e);let s=[],l=[];this.flattenNodes(e,s),this.generateEdges(e,l),X.debug(`getData: processed ${s.length} nodes and ${l.length} edges`);let u=new Map;for(let h of s)u.set(h.id,{shape:h.shape,width:h.width,height:h.height,padding:h.padding});return{nodes:s,edges:l,config:a,rootNode:e,markers:["point"],direction:"TB",nodeSpacing:50,rankSpacing:50,shapes:Object.fromEntries(u),type:"mindmap",diagramId:"mindmap-"+H$()}}getLogger(){return X}}});var Att,Y2e,X2e=N(()=>{"use strict";pt();ep();Nf();Mf();La();Att=o(async(t,e,r,n)=>{X.debug(`Rendering mindmap diagram +`+t);let i=n.db,a=i.getData(),s=Vo(e,a.config.securityLevel);a.type=n.type,a.layoutAlgorithm=$c(a.config.layout,{fallback:"cose-bilkent"}),a.diagramId=e,i.getMindmap()&&(a.nodes.forEach(u=>{u.shape==="rounded"?(u.radius=15,u.taper=15,u.stroke="none",u.width=0,u.padding=15):u.shape==="circle"?u.padding=10:u.shape==="rect"&&(u.width=0,u.padding=10)}),await Qo(a,s),Ws(s,a.config.mindmap?.padding??ur.mindmap.padding,"mindmapDiagram",a.config.mindmap?.useMaxWidth??ur.mindmap.useMaxWidth))},"draw"),Y2e={draw:Att}});var _tt,Dtt,j2e,K2e=N(()=>{"use strict";eo();_tt=o(t=>{let e="";for(let r=0;r` + .edge { + stroke-width: 3; + } + ${_tt(t)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .section-root span { + color: ${t.gitBranchLabel0}; + } + .section-2 span { + color: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .mindmap-node-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } +`,"getStyles"),j2e=Dtt});var Q2e={};dr(Q2e,{diagram:()=>Ltt});var Ltt,Z2e=N(()=>{"use strict";$2e();W2e();X2e();K2e();Ltt={get db(){return new TC},renderer:Y2e,parser:F2e,styles:j2e}});var q$,txe,rxe=N(()=>{"use strict";q$=(function(){var t=o(function(A,C,R,I){for(R=R||{},I=A.length;I--;R[A[I]]=C);return R},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,31],g=[6,7,11,24],y=[1,6,13,16,17,20,23],v=[1,35],x=[1,36],b=[1,6,7,11,13,16,17,20,23],T=[1,38],S={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:o(function(C,R,I,L,E,D,_){var O=D.length-1;switch(E){case 6:case 7:return L;case 8:L.getLogger().trace("Stop NL ");break;case 9:L.getLogger().trace("Stop EOF ");break;case 11:L.getLogger().trace("Stop NL2 ");break;case 12:L.getLogger().trace("Stop EOF2 ");break;case 15:L.getLogger().info("Node: ",D[O-1].id),L.addNode(D[O-2].length,D[O-1].id,D[O-1].descr,D[O-1].type,D[O]);break;case 16:L.getLogger().info("Node: ",D[O].id),L.addNode(D[O-1].length,D[O].id,D[O].descr,D[O].type);break;case 17:L.getLogger().trace("Icon: ",D[O]),L.decorateNode({icon:D[O]});break;case 18:case 23:L.decorateNode({class:D[O]});break;case 19:L.getLogger().trace("SPACELIST");break;case 20:L.getLogger().trace("Node: ",D[O-1].id),L.addNode(0,D[O-1].id,D[O-1].descr,D[O-1].type,D[O]);break;case 21:L.getLogger().trace("Node: ",D[O].id),L.addNode(0,D[O].id,D[O].descr,D[O].type);break;case 22:L.decorateNode({icon:D[O]});break;case 27:L.getLogger().trace("node found ..",D[O-2]),this.$={id:D[O-1],descr:D[O-1],type:L.getType(D[O-2],D[O])};break;case 28:this.$={id:D[O],descr:D[O],type:0};break;case 29:L.getLogger().trace("node found ..",D[O-3]),this.$={id:D[O-3],descr:D[O-1],type:L.getType(D[O-2],D[O])};break;case 30:this.$=D[O-1]+D[O];break;case 31:this.$=D[O];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:r,9:22,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:h,7:f,10:23,11:d},t(p,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:s,23:l}),t(p,[2,19]),t(p,[2,21],{15:30,24:m}),t(p,[2,22]),t(p,[2,23]),t(g,[2,25]),t(g,[2,26]),t(g,[2,28],{20:[1,32]}),{21:[1,33]},{6:h,7:f,10:34,11:d},{1:[2,7],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(y,[2,14],{7:v,11:x}),t(b,[2,8]),t(b,[2,9]),t(b,[2,10]),t(p,[2,16],{15:37,24:m}),t(p,[2,17]),t(p,[2,18]),t(p,[2,20],{24:T}),t(g,[2,31]),{21:[1,39]},{22:[1,40]},t(y,[2,13],{7:v,11:x}),t(b,[2,11]),t(b,[2,12]),t(p,[2,15],{24:T}),t(g,[2,30]),{22:[1,41]},t(g,[2,27]),t(g,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(C,R){if(R.recoverable)this.trace(C);else{var I=new Error(C);throw I.hash=R,I}},"parseError"),parse:o(function(C){var R=this,I=[0],L=[],E=[null],D=[],_=this.table,O="",M=0,P=0,B=0,F=2,G=1,$=D.slice.call(arguments,1),U=Object.create(this.lexer),j={yy:{}};for(var te in this.yy)Object.prototype.hasOwnProperty.call(this.yy,te)&&(j.yy[te]=this.yy[te]);U.setInput(C,j.yy),j.yy.lexer=U,j.yy.parser=this,typeof U.yylloc>"u"&&(U.yylloc={});var Y=U.yylloc;D.push(Y);var oe=U.options&&U.options.ranges;typeof j.yy.parseError=="function"?this.parseError=j.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function J(Be){I.length=I.length-2*Be,E.length=E.length-Be,D.length=D.length-Be}o(J,"popStack");function ue(){var Be;return Be=L.pop()||U.lex()||G,typeof Be!="number"&&(Be instanceof Array&&(L=Be,Be=L.pop()),Be=R.symbols_[Be]||Be),Be}o(ue,"lex");for(var re,ee,Z,K,ae,Q,de={},ne,Te,q,Ve;;){if(Z=I[I.length-1],this.defaultActions[Z]?K=this.defaultActions[Z]:((re===null||typeof re>"u")&&(re=ue()),K=_[Z]&&_[Z][re]),typeof K>"u"||!K.length||!K[0]){var pe="";Ve=[];for(ne in _[Z])this.terminals_[ne]&&ne>F&&Ve.push("'"+this.terminals_[ne]+"'");U.showPosition?pe="Parse error on line "+(M+1)+`: +`+U.showPosition()+` +Expecting `+Ve.join(", ")+", got '"+(this.terminals_[re]||re)+"'":pe="Parse error on line "+(M+1)+": Unexpected "+(re==G?"end of input":"'"+(this.terminals_[re]||re)+"'"),this.parseError(pe,{text:U.match,token:this.terminals_[re]||re,line:U.yylineno,loc:Y,expected:Ve})}if(K[0]instanceof Array&&K.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Z+", token: "+re);switch(K[0]){case 1:I.push(re),E.push(U.yytext),D.push(U.yylloc),I.push(K[1]),re=null,ee?(re=ee,ee=null):(P=U.yyleng,O=U.yytext,M=U.yylineno,Y=U.yylloc,B>0&&B--);break;case 2:if(Te=this.productions_[K[1]][1],de.$=E[E.length-Te],de._$={first_line:D[D.length-(Te||1)].first_line,last_line:D[D.length-1].last_line,first_column:D[D.length-(Te||1)].first_column,last_column:D[D.length-1].last_column},oe&&(de._$.range=[D[D.length-(Te||1)].range[0],D[D.length-1].range[1]]),Q=this.performAction.apply(de,[O,P,M,j.yy,K[1],E,D].concat($)),typeof Q<"u")return Q;Te&&(I=I.slice(0,-1*Te*2),E=E.slice(0,-1*Te),D=D.slice(0,-1*Te)),I.push(this.productions_[K[1]][0]),E.push(de.$),D.push(de._$),q=_[I[I.length-2]][I[I.length-1]],I.push(q);break;case 3:return!0}}return!0},"parse")},w=(function(){var A={EOF:1,parseError:o(function(R,I){if(this.yy.parser)this.yy.parser.parseError(R,I);else throw new Error(R)},"parseError"),setInput:o(function(C,R){return this.yy=R||this.yy||{},this._input=C,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var C=this._input[0];this.yytext+=C,this.yyleng++,this.offset++,this.match+=C,this.matched+=C;var R=C.match(/(?:\r\n?|\n).*/g);return R?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),C},"input"),unput:o(function(C){var R=C.length,I=C.split(/(?:\r\n?|\n)/g);this._input=C+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-R),this.offset-=R;var L=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),I.length-1&&(this.yylineno-=I.length-1);var E=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:I?(I.length===L.length?this.yylloc.first_column:0)+L[L.length-I.length].length-I[0].length:this.yylloc.first_column-R},this.options.ranges&&(this.yylloc.range=[E[0],E[0]+this.yyleng-R]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(C){this.unput(this.match.slice(C))},"less"),pastInput:o(function(){var C=this.matched.substr(0,this.matched.length-this.match.length);return(C.length>20?"...":"")+C.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var C=this.match;return C.length<20&&(C+=this._input.substr(0,20-C.length)),(C.substr(0,20)+(C.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var C=this.pastInput(),R=new Array(C.length+1).join("-");return C+this.upcomingInput()+` +`+R+"^"},"showPosition"),test_match:o(function(C,R){var I,L,E;if(this.options.backtrack_lexer&&(E={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(E.yylloc.range=this.yylloc.range.slice(0))),L=C[0].match(/(?:\r\n?|\n).*/g),L&&(this.yylineno+=L.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:L?L[L.length-1].length-L[L.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+C[0].length},this.yytext+=C[0],this.match+=C[0],this.matches=C,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(C[0].length),this.matched+=C[0],I=this.performAction.call(this,this.yy,this,R,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),I)return I;if(this._backtrack){for(var D in E)this[D]=E[D];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var C,R,I,L;this._more||(this.yytext="",this.match="");for(var E=this._currentRules(),D=0;DR[0].length)){if(R=I,L=D,this.options.backtrack_lexer){if(C=this.test_match(I,E[D]),C!==!1)return C;if(this._backtrack){R=!1;continue}else return!1}else if(!this.options.flex)break}return R?(C=this.test_match(R,E[L]),C!==!1?C:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var R=this.next();return R||this.lex()},"lex"),begin:o(function(R){this.conditionStack.push(R)},"begin"),popState:o(function(){var R=this.conditionStack.length-1;return R>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(R){return R=this.conditionStack.length-1-Math.abs(R||0),R>=0?this.conditionStack[R]:"INITIAL"},"topState"),pushState:o(function(R){this.begin(R)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(R,I,L,E){var D=E;switch(L){case 0:return this.pushState("shapeData"),I.yytext="",24;break;case 1:return this.pushState("shapeDataStr"),24;break;case 2:return this.popState(),24;break;case 3:let _=/\n\s*/g;return I.yytext=I.yytext.replace(_,"
    "),24;break;case 4:return 24;case 5:this.popState();break;case 6:return R.getLogger().trace("Found comment",I.yytext),6;break;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;break;case 10:this.popState();break;case 11:R.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return R.getLogger().trace("SPACELINE"),6;break;case 13:return 7;case 14:return 16;case 15:R.getLogger().trace("end icon"),this.popState();break;case 16:return R.getLogger().trace("Exploding node"),this.begin("NODE"),20;break;case 17:return R.getLogger().trace("Cloud"),this.begin("NODE"),20;break;case 18:return R.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;break;case 19:return R.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;break;case 20:return this.begin("NODE"),20;break;case 21:return this.begin("NODE"),20;break;case 22:return this.begin("NODE"),20;break;case 23:return this.begin("NODE"),20;break;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 29:this.popState();break;case 30:R.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return R.getLogger().trace("description:",I.yytext),"NODE_DESCR";break;case 32:this.popState();break;case 33:return this.popState(),R.getLogger().trace("node end ))"),"NODE_DEND";break;case 34:return this.popState(),R.getLogger().trace("node end )"),"NODE_DEND";break;case 35:return this.popState(),R.getLogger().trace("node end ...",I.yytext),"NODE_DEND";break;case 36:return this.popState(),R.getLogger().trace("node end (("),"NODE_DEND";break;case 37:return this.popState(),R.getLogger().trace("node end (-"),"NODE_DEND";break;case 38:return this.popState(),R.getLogger().trace("node end (-"),"NODE_DEND";break;case 39:return this.popState(),R.getLogger().trace("node end (("),"NODE_DEND";break;case 40:return this.popState(),R.getLogger().trace("node end (("),"NODE_DEND";break;case 41:return R.getLogger().trace("Long description:",I.yytext),21;break;case 42:return R.getLogger().trace("Long description:",I.yytext),21;break}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}};return A})();S.lexer=w;function k(){this.yy={}}return o(k,"Parser"),k.prototype=S,S.Parser=k,new k})();q$.parser=q$;txe=q$});var ol,Y$,W$,X$,Itt,Ott,nxe,Ptt,Btt,Ui,Ftt,$tt,ztt,Gtt,Vtt,Utt,Htt,ixe,axe=N(()=>{"use strict";Xt();gr();pt();La();w2();ol=[],Y$=[],W$=0,X$={},Itt=o(()=>{ol=[],Y$=[],W$=0,X$={}},"clear"),Ott=o(t=>{if(ol.length===0)return null;let e=ol[0].level,r=null;for(let n=ol.length-1;n>=0;n--)if(ol[n].level===e&&!r&&(r=ol[n]),ol[n].levell.parentId===i.id);for(let l of s){let u={id:l.id,parentId:i.id,label:sr(l.label??"",n),isGroup:!1,ticket:l?.ticket,priority:l?.priority,assigned:l?.assigned,icon:l?.icon,shape:"kanbanItem",level:l.level,rx:5,ry:5,cssStyles:["text-align: left"]};e.push(u)}}return{nodes:e,edges:t,other:{},config:ge()}},"getData"),Btt=o((t,e,r,n,i)=>{let a=ge(),s=a.mindmap?.padding??ur.mindmap.padding;switch(n){case Ui.ROUNDED_RECT:case Ui.RECT:case Ui.HEXAGON:s*=2}let l={id:sr(e,a)||"kbn"+W$++,level:t,label:sr(r,a),width:a.mindmap?.maxNodeWidth??ur.mindmap.maxNodeWidth,padding:s,isGroup:!1};if(i!==void 0){let h;i.includes(` +`)?h=i+` +`:h=`{ +`+i+` +}`;let f=Kh(h,{schema:jh});if(f.shape&&(f.shape!==f.shape.toLowerCase()||f.shape.includes("_")))throw new Error(`No such shape: ${f.shape}. Shape names should be lowercase.`);f?.shape&&f.shape==="kanbanItem"&&(l.shape=f?.shape),f?.label&&(l.label=f?.label),f?.icon&&(l.icon=f?.icon.toString()),f?.assigned&&(l.assigned=f?.assigned.toString()),f?.ticket&&(l.ticket=f?.ticket.toString()),f?.priority&&(l.priority=f?.priority)}let u=Ott(t);u?l.parentId=u.id||"kbn"+W$++:Y$.push(l),ol.push(l)},"addNode"),Ui={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},Ftt=o((t,e)=>{switch(X.debug("In get type",t,e),t){case"[":return Ui.RECT;case"(":return e===")"?Ui.ROUNDED_RECT:Ui.CLOUD;case"((":return Ui.CIRCLE;case")":return Ui.CLOUD;case"))":return Ui.BANG;case"{{":return Ui.HEXAGON;default:return Ui.DEFAULT}},"getType"),$tt=o((t,e)=>{X$[t]=e},"setElementForId"),ztt=o(t=>{if(!t)return;let e=ge(),r=ol[ol.length-1];t.icon&&(r.icon=sr(t.icon,e)),t.class&&(r.cssClasses=sr(t.class,e))},"decorateNode"),Gtt=o(t=>{switch(t){case Ui.DEFAULT:return"no-border";case Ui.RECT:return"rect";case Ui.ROUNDED_RECT:return"rounded-rect";case Ui.CIRCLE:return"circle";case Ui.CLOUD:return"cloud";case Ui.BANG:return"bang";case Ui.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),Vtt=o(()=>X,"getLogger"),Utt=o(t=>X$[t],"getElementById"),Htt={clear:Itt,addNode:Btt,getSections:nxe,getData:Ptt,nodeType:Ui,getType:Ftt,setElementForId:$tt,decorateNode:ztt,type2Str:Gtt,getLogger:Vtt,getElementById:Utt},ixe=Htt});var qtt,sxe,oxe=N(()=>{"use strict";Xt();pt();tu();Ei();La();cw();bw();qtt=o(async(t,e,r,n)=>{X.debug(`Rendering kanban diagram +`+t);let a=n.db.getData(),s=ge();s.htmlLabels=!1;let l=aa(e),u=l.append("g");u.attr("class","sections");let h=l.append("g");h.attr("class","items");let f=a.nodes.filter(v=>v.isGroup),d=0,p=10,m=[],g=25;for(let v of f){let x=s?.kanban?.sectionWidth||200;d=d+1,v.x=x*d+(d-1)*p/2,v.width=x,v.y=0,v.height=x*3,v.rx=5,v.ry=5,v.cssClasses=v.cssClasses+" section-"+d;let b=await Sm(u,v);g=Math.max(g,b?.labelBBox?.height),m.push(b)}let y=0;for(let v of f){let x=m[y];y=y+1;let b=s?.kanban?.sectionWidth||200,T=-b*3/2+g,S=T,w=a.nodes.filter(C=>C.parentId===v.id);for(let C of w){if(C.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");C.x=v.x,C.width=b-1.5*p;let I=(await Cm(h,C,{config:s})).node().getBBox();C.y=S+I.height/2,await P2(C),S=C.y+I.height/2+p/2}let k=x.cluster.select("rect"),A=Math.max(S-T+3*p,50)+(g-25);k.attr("height",A)}ic(void 0,l,s.mindmap?.padding??ur.kanban.padding,s.mindmap?.useMaxWidth??ur.kanban.useMaxWidth)},"draw"),sxe={draw:qtt}});var Wtt,Ytt,lxe,cxe=N(()=>{"use strict";eo();yg();Wtt=o(t=>{let e="";for(let n=0;nt.darkMode?Pt(n,i):Rt(n,i),"adjuster");for(let n=0;n` + .edge { + stroke-width: 3; + } + ${Wtt(t)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .cluster-label, .label { + color: ${t.textColor}; + fill: ${t.textColor}; + } + .kanban-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } + ${zc()} +`,"getStyles"),lxe=Ytt});var uxe={};dr(uxe,{diagram:()=>Xtt});var Xtt,hxe=N(()=>{"use strict";rxe();axe();oxe();cxe();Xtt={db:ixe,renderer:sxe,parser:txe,styles:lxe}});var j$,A4,pxe=N(()=>{"use strict";j$=(function(){var t=o(function(l,u,h,f){for(h=h||{},f=l.length;f--;h[l[f]]=u);return h},"o"),e=[1,9],r=[1,10],n=[1,5,10,12],i={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:o(function(u,h,f,d,p,m,g){var y=m.length-1;switch(p){case 7:let v=d.findOrCreateNode(m[y-4].trim().replaceAll('""','"')),x=d.findOrCreateNode(m[y-2].trim().replaceAll('""','"')),b=parseFloat(m[y].trim());d.addLink(v,x,b);break;case 8:case 9:case 11:this.$=m[y];break;case 10:this.$=m[y-1];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:e,20:r},{1:[2,6],7:11,10:[1,12]},t(r,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(n,[2,8]),t(n,[2,9]),{19:[1,16]},t(n,[2,11]),{1:[2,1]},{1:[2,5]},t(r,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:e,20:r},{15:18,16:7,17:8,18:e,20:r},{18:[1,19]},t(r,[2,3]),{12:[1,20]},t(n,[2,10]),{15:21,16:7,17:8,18:e,20:r},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:o(function(u,h){if(h.recoverable)this.trace(u);else{var f=new Error(u);throw f.hash=h,f}},"parseError"),parse:o(function(u){var h=this,f=[0],d=[],p=[null],m=[],g=this.table,y="",v=0,x=0,b=0,T=2,S=1,w=m.slice.call(arguments,1),k=Object.create(this.lexer),A={yy:{}};for(var C in this.yy)Object.prototype.hasOwnProperty.call(this.yy,C)&&(A.yy[C]=this.yy[C]);k.setInput(u,A.yy),A.yy.lexer=k,A.yy.parser=this,typeof k.yylloc>"u"&&(k.yylloc={});var R=k.yylloc;m.push(R);var I=k.options&&k.options.ranges;typeof A.yy.parseError=="function"?this.parseError=A.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function L(Y){f.length=f.length-2*Y,p.length=p.length-Y,m.length=m.length-Y}o(L,"popStack");function E(){var Y;return Y=d.pop()||k.lex()||S,typeof Y!="number"&&(Y instanceof Array&&(d=Y,Y=d.pop()),Y=h.symbols_[Y]||Y),Y}o(E,"lex");for(var D,_,O,M,P,B,F={},G,$,U,j;;){if(O=f[f.length-1],this.defaultActions[O]?M=this.defaultActions[O]:((D===null||typeof D>"u")&&(D=E()),M=g[O]&&g[O][D]),typeof M>"u"||!M.length||!M[0]){var te="";j=[];for(G in g[O])this.terminals_[G]&&G>T&&j.push("'"+this.terminals_[G]+"'");k.showPosition?te="Parse error on line "+(v+1)+`: +`+k.showPosition()+` +Expecting `+j.join(", ")+", got '"+(this.terminals_[D]||D)+"'":te="Parse error on line "+(v+1)+": Unexpected "+(D==S?"end of input":"'"+(this.terminals_[D]||D)+"'"),this.parseError(te,{text:k.match,token:this.terminals_[D]||D,line:k.yylineno,loc:R,expected:j})}if(M[0]instanceof Array&&M.length>1)throw new Error("Parse Error: multiple actions possible at state: "+O+", token: "+D);switch(M[0]){case 1:f.push(D),p.push(k.yytext),m.push(k.yylloc),f.push(M[1]),D=null,_?(D=_,_=null):(x=k.yyleng,y=k.yytext,v=k.yylineno,R=k.yylloc,b>0&&b--);break;case 2:if($=this.productions_[M[1]][1],F.$=p[p.length-$],F._$={first_line:m[m.length-($||1)].first_line,last_line:m[m.length-1].last_line,first_column:m[m.length-($||1)].first_column,last_column:m[m.length-1].last_column},I&&(F._$.range=[m[m.length-($||1)].range[0],m[m.length-1].range[1]]),B=this.performAction.apply(F,[y,x,v,A.yy,M[1],p,m].concat(w)),typeof B<"u")return B;$&&(f=f.slice(0,-1*$*2),p=p.slice(0,-1*$),m=m.slice(0,-1*$)),f.push(this.productions_[M[1]][0]),p.push(F.$),m.push(F._$),U=g[f[f.length-2]][f[f.length-1]],f.push(U);break;case 3:return!0}}return!0},"parse")},a=(function(){var l={EOF:1,parseError:o(function(h,f){if(this.yy.parser)this.yy.parser.parseError(h,f);else throw new Error(h)},"parseError"),setInput:o(function(u,h){return this.yy=h||this.yy||{},this._input=u,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var u=this._input[0];this.yytext+=u,this.yyleng++,this.offset++,this.match+=u,this.matched+=u;var h=u.match(/(?:\r\n?|\n).*/g);return h?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),u},"input"),unput:o(function(u){var h=u.length,f=u.split(/(?:\r\n?|\n)/g);this._input=u+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-h),this.offset-=h;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),f.length-1&&(this.yylineno-=f.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:f?(f.length===d.length?this.yylloc.first_column:0)+d[d.length-f.length].length-f[0].length:this.yylloc.first_column-h},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-h]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(u){this.unput(this.match.slice(u))},"less"),pastInput:o(function(){var u=this.matched.substr(0,this.matched.length-this.match.length);return(u.length>20?"...":"")+u.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var u=this.match;return u.length<20&&(u+=this._input.substr(0,20-u.length)),(u.substr(0,20)+(u.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var u=this.pastInput(),h=new Array(u.length+1).join("-");return u+this.upcomingInput()+` +`+h+"^"},"showPosition"),test_match:o(function(u,h){var f,d,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),d=u[0].match(/(?:\r\n?|\n).*/g),d&&(this.yylineno+=d.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:d?d[d.length-1].length-d[d.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+u[0].length},this.yytext+=u[0],this.match+=u[0],this.matches=u,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(u[0].length),this.matched+=u[0],f=this.performAction.call(this,this.yy,this,h,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),f)return f;if(this._backtrack){for(var m in p)this[m]=p[m];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var u,h,f,d;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),m=0;mh[0].length)){if(h=f,d=m,this.options.backtrack_lexer){if(u=this.test_match(f,p[m]),u!==!1)return u;if(this._backtrack){h=!1;continue}else return!1}else if(!this.options.flex)break}return h?(u=this.test_match(h,p[d]),u!==!1?u:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var h=this.next();return h||this.lex()},"lex"),begin:o(function(h){this.conditionStack.push(h)},"begin"),popState:o(function(){var h=this.conditionStack.length-1;return h>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(h){return h=this.conditionStack.length-1-Math.abs(h||0),h>=0?this.conditionStack[h]:"INITIAL"},"topState"),pushState:o(function(h){this.begin(h)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(h,f,d,p){var m=p;switch(d){case 0:return this.pushState("csv"),4;break;case 1:return this.pushState("csv"),4;break;case 2:return 10;case 3:return 5;case 4:return 12;case 5:return this.pushState("escaped_text"),18;break;case 6:return 20;case 7:return this.popState("escaped_text"),18;break;case 8:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:sankey\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[2,3,4,5,6,7,8],inclusive:!1},escaped_text:{rules:[7,8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8],inclusive:!0}}};return l})();i.lexer=a;function s(){this.yy={}}return o(s,"Parser"),s.prototype=i,i.Parser=s,new s})();j$.parser=j$;A4=j$});var kC,EC,wC,Ztt,K$,Jtt,Q$,ert,trt,rrt,nrt,mxe,gxe=N(()=>{"use strict";Xt();gr();ci();kC=[],EC=[],wC=new Map,Ztt=o(()=>{kC=[],EC=[],wC=new Map,Sr()},"clear"),K$=class{constructor(e,r,n=0){this.source=e;this.target=r;this.value=n}static{o(this,"SankeyLink")}},Jtt=o((t,e,r)=>{kC.push(new K$(t,e,r))},"addLink"),Q$=class{constructor(e){this.ID=e}static{o(this,"SankeyNode")}},ert=o(t=>{t=tt.sanitizeText(t,ge());let e=wC.get(t);return e===void 0&&(e=new Q$(t),wC.set(t,e),EC.push(e)),e},"findOrCreateNode"),trt=o(()=>EC,"getNodes"),rrt=o(()=>kC,"getLinks"),nrt=o(()=>({nodes:EC.map(t=>({id:t.ID})),links:kC.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),mxe={nodesMap:wC,getConfig:o(()=>ge().sankey,"getConfig"),getNodes:trt,getLinks:rrt,getGraph:nrt,addLink:Jtt,findOrCreateNode:ert,getAccTitle:Mr,setAccTitle:Rr,getAccDescription:Or,setAccDescription:Ir,getDiagramTitle:Pr,setDiagramTitle:$r,clear:Ztt}});function _4(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var yxe=N(()=>{"use strict";o(_4,"max")});function dy(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var vxe=N(()=>{"use strict";o(dy,"min")});function py(t,e){let r=0;if(e===void 0)for(let n of t)(n=+n)&&(r+=n);else{let n=-1;for(let i of t)(i=+e(i,++n,t))&&(r+=i)}return r}var xxe=N(()=>{"use strict";o(py,"sum")});var Z$=N(()=>{"use strict";yxe();vxe();xxe()});function irt(t){return t.target.depth}function J$(t){return t.depth}function ez(t,e){return e-1-t.height}function D4(t,e){return t.sourceLinks.length?t.depth:e-1}function tz(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?dy(t.sourceLinks,irt)-1:0}var rz=N(()=>{"use strict";Z$();o(irt,"targetDepth");o(J$,"left");o(ez,"right");o(D4,"justify");o(tz,"center")});function my(t){return function(){return t}}var bxe=N(()=>{"use strict";o(my,"constant")});function Txe(t,e){return SC(t.source,e.source)||t.index-e.index}function wxe(t,e){return SC(t.target,e.target)||t.index-e.index}function SC(t,e){return t.y0-e.y0}function nz(t){return t.value}function art(t){return t.index}function srt(t){return t.nodes}function ort(t){return t.links}function kxe(t,e){let r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function Exe({nodes:t}){for(let e of t){let r=e.y0,n=r;for(let i of e.sourceLinks)i.y0=r+i.width/2,r+=i.width;for(let i of e.targetLinks)i.y1=n+i.width/2,n+=i.width}}function CC(){let t=0,e=0,r=1,n=1,i=24,a=8,s,l=art,u=D4,h,f,d=srt,p=ort,m=6;function g(){let O={nodes:d.apply(null,arguments),links:p.apply(null,arguments)};return y(O),v(O),x(O),b(O),w(O),Exe(O),O}o(g,"sankey"),g.update=function(O){return Exe(O),O},g.nodeId=function(O){return arguments.length?(l=typeof O=="function"?O:my(O),g):l},g.nodeAlign=function(O){return arguments.length?(u=typeof O=="function"?O:my(O),g):u},g.nodeSort=function(O){return arguments.length?(h=O,g):h},g.nodeWidth=function(O){return arguments.length?(i=+O,g):i},g.nodePadding=function(O){return arguments.length?(a=s=+O,g):a},g.nodes=function(O){return arguments.length?(d=typeof O=="function"?O:my(O),g):d},g.links=function(O){return arguments.length?(p=typeof O=="function"?O:my(O),g):p},g.linkSort=function(O){return arguments.length?(f=O,g):f},g.size=function(O){return arguments.length?(t=e=0,r=+O[0],n=+O[1],g):[r-t,n-e]},g.extent=function(O){return arguments.length?(t=+O[0][0],r=+O[1][0],e=+O[0][1],n=+O[1][1],g):[[t,e],[r,n]]},g.iterations=function(O){return arguments.length?(m=+O,g):m};function y({nodes:O,links:M}){for(let[B,F]of O.entries())F.index=B,F.sourceLinks=[],F.targetLinks=[];let P=new Map(O.map((B,F)=>[l(B,F,O),B]));for(let[B,F]of M.entries()){F.index=B;let{source:G,target:$}=F;typeof G!="object"&&(G=F.source=kxe(P,G)),typeof $!="object"&&($=F.target=kxe(P,$)),G.sourceLinks.push(F),$.targetLinks.push(F)}if(f!=null)for(let{sourceLinks:B,targetLinks:F}of O)B.sort(f),F.sort(f)}o(y,"computeNodeLinks");function v({nodes:O}){for(let M of O)M.value=M.fixedValue===void 0?Math.max(py(M.sourceLinks,nz),py(M.targetLinks,nz)):M.fixedValue}o(v,"computeNodeValues");function x({nodes:O}){let M=O.length,P=new Set(O),B=new Set,F=0;for(;P.size;){for(let G of P){G.depth=F;for(let{target:$}of G.sourceLinks)B.add($)}if(++F>M)throw new Error("circular link");P=B,B=new Set}}o(x,"computeNodeDepths");function b({nodes:O}){let M=O.length,P=new Set(O),B=new Set,F=0;for(;P.size;){for(let G of P){G.height=F;for(let{source:$}of G.targetLinks)B.add($)}if(++F>M)throw new Error("circular link");P=B,B=new Set}}o(b,"computeNodeHeights");function T({nodes:O}){let M=_4(O,F=>F.depth)+1,P=(r-t-i)/(M-1),B=new Array(M);for(let F of O){let G=Math.max(0,Math.min(M-1,Math.floor(u.call(null,F,M))));F.layer=G,F.x0=t+G*P,F.x1=F.x0+i,B[G]?B[G].push(F):B[G]=[F]}if(h)for(let F of B)F.sort(h);return B}o(T,"computeNodeLayers");function S(O){let M=dy(O,P=>(n-e-(P.length-1)*s)/py(P,nz));for(let P of O){let B=e;for(let F of P){F.y0=B,F.y1=B+F.value*M,B=F.y1+s;for(let G of F.sourceLinks)G.width=G.value*M}B=(n-B+s)/(P.length+1);for(let F=0;FP.length)-1)),S(M);for(let P=0;P0))continue;let te=(U/j-$.y0)*M;$.y0+=te,$.y1+=te,L($)}h===void 0&&G.sort(SC),C(G,P)}}o(k,"relaxLeftToRight");function A(O,M,P){for(let B=O.length,F=B-2;F>=0;--F){let G=O[F];for(let $ of G){let U=0,j=0;for(let{target:Y,value:oe}of $.sourceLinks){let J=oe*(Y.layer-$.layer);U+=_($,Y)*J,j+=J}if(!(j>0))continue;let te=(U/j-$.y0)*M;$.y0+=te,$.y1+=te,L($)}h===void 0&&G.sort(SC),C(G,P)}}o(A,"relaxRightToLeft");function C(O,M){let P=O.length>>1,B=O[P];I(O,B.y0-s,P-1,M),R(O,B.y1+s,P+1,M),I(O,n,O.length-1,M),R(O,e,0,M)}o(C,"resolveCollisions");function R(O,M,P,B){for(;P1e-6&&(F.y0+=G,F.y1+=G),M=F.y1+s}}o(R,"resolveCollisionsTopToBottom");function I(O,M,P,B){for(;P>=0;--P){let F=O[P],G=(F.y1-M)*B;G>1e-6&&(F.y0-=G,F.y1-=G),M=F.y0-s}}o(I,"resolveCollisionsBottomToTop");function L({sourceLinks:O,targetLinks:M}){if(f===void 0){for(let{source:{sourceLinks:P}}of M)P.sort(wxe);for(let{target:{targetLinks:P}}of O)P.sort(Txe)}}o(L,"reorderNodeLinks");function E(O){if(f===void 0)for(let{sourceLinks:M,targetLinks:P}of O)M.sort(wxe),P.sort(Txe)}o(E,"reorderLinks");function D(O,M){let P=O.y0-(O.sourceLinks.length-1)*s/2;for(let{target:B,width:F}of O.sourceLinks){if(B===M)break;P+=F+s}for(let{source:B,width:F}of M.targetLinks){if(B===O)break;P-=F}return P}o(D,"targetTop");function _(O,M){let P=M.y0-(M.targetLinks.length-1)*s/2;for(let{source:B,width:F}of M.targetLinks){if(B===O)break;P+=F+s}for(let{target:B,width:F}of O.sourceLinks){if(B===M)break;P-=F}return P}return o(_,"sourceTop"),g}var Sxe=N(()=>{"use strict";Z$();rz();bxe();o(Txe,"ascendingSourceBreadth");o(wxe,"ascendingTargetBreadth");o(SC,"ascendingBreadth");o(nz,"value");o(art,"defaultId");o(srt,"defaultNodes");o(ort,"defaultLinks");o(kxe,"find");o(Exe,"computeLinkBreadths");o(CC,"Sankey")});function sz(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function Cxe(){return new sz}var iz,az,f0,lrt,oz,Axe=N(()=>{"use strict";iz=Math.PI,az=2*iz,f0=1e-6,lrt=az-f0;o(sz,"Path");o(Cxe,"path");sz.prototype=Cxe.prototype={constructor:sz,moveTo:o(function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},"moveTo"),closePath:o(function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},"closePath"),lineTo:o(function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},"lineTo"),quadraticCurveTo:o(function(t,e,r,n){this._+="Q"+ +t+","+ +e+","+(this._x1=+r)+","+(this._y1=+n)},"quadraticCurveTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._+="C"+ +t+","+ +e+","+ +r+","+ +n+","+(this._x1=+i)+","+(this._y1=+a)},"bezierCurveTo"),arcTo:o(function(t,e,r,n,i){t=+t,e=+e,r=+r,n=+n,i=+i;var a=this._x1,s=this._y1,l=r-t,u=n-e,h=a-t,f=s-e,d=h*h+f*f;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(d>f0)if(!(Math.abs(f*l-u*h)>f0)||!i)this._+="L"+(this._x1=t)+","+(this._y1=e);else{var p=r-a,m=n-s,g=l*l+u*u,y=p*p+m*m,v=Math.sqrt(g),x=Math.sqrt(d),b=i*Math.tan((iz-Math.acos((g+d-y)/(2*v*x)))/2),T=b/x,S=b/v;Math.abs(T-1)>f0&&(this._+="L"+(t+T*h)+","+(e+T*f)),this._+="A"+i+","+i+",0,0,"+ +(f*p>h*m)+","+(this._x1=t+S*l)+","+(this._y1=e+S*u)}},"arcTo"),arc:o(function(t,e,r,n,i,a){t=+t,e=+e,r=+r,a=!!a;var s=r*Math.cos(n),l=r*Math.sin(n),u=t+s,h=e+l,f=1^a,d=a?n-i:i-n;if(r<0)throw new Error("negative radius: "+r);this._x1===null?this._+="M"+u+","+h:(Math.abs(this._x1-u)>f0||Math.abs(this._y1-h)>f0)&&(this._+="L"+u+","+h),r&&(d<0&&(d=d%az+az),d>lrt?this._+="A"+r+","+r+",0,1,"+f+","+(t-s)+","+(e-l)+"A"+r+","+r+",0,1,"+f+","+(this._x1=u)+","+(this._y1=h):d>f0&&(this._+="A"+r+","+r+",0,"+ +(d>=iz)+","+f+","+(this._x1=t+r*Math.cos(i))+","+(this._y1=e+r*Math.sin(i))))},"arc"),rect:o(function(t,e,r,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +r+"v"+ +n+"h"+-r+"Z"},"rect"),toString:o(function(){return this._},"toString")};oz=Cxe});var _xe=N(()=>{"use strict";Axe()});function AC(t){return o(function(){return t},"constant")}var Dxe=N(()=>{"use strict";o(AC,"default")});function Lxe(t){return t[0]}function Rxe(t){return t[1]}var Nxe=N(()=>{"use strict";o(Lxe,"x");o(Rxe,"y")});var Mxe,Ixe=N(()=>{"use strict";Mxe=Array.prototype.slice});function crt(t){return t.source}function urt(t){return t.target}function hrt(t){var e=crt,r=urt,n=Lxe,i=Rxe,a=null;function s(){var l,u=Mxe.call(arguments),h=e.apply(this,u),f=r.apply(this,u);if(a||(a=l=oz()),t(a,+n.apply(this,(u[0]=h,u)),+i.apply(this,u),+n.apply(this,(u[0]=f,u)),+i.apply(this,u)),l)return a=null,l+""||null}return o(s,"link"),s.source=function(l){return arguments.length?(e=l,s):e},s.target=function(l){return arguments.length?(r=l,s):r},s.x=function(l){return arguments.length?(n=typeof l=="function"?l:AC(+l),s):n},s.y=function(l){return arguments.length?(i=typeof l=="function"?l:AC(+l),s):i},s.context=function(l){return arguments.length?(a=l??null,s):a},s}function frt(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function lz(){return hrt(frt)}var Oxe=N(()=>{"use strict";_xe();Ixe();Dxe();Nxe();o(crt,"linkSource");o(urt,"linkTarget");o(hrt,"link");o(frt,"curveHorizontal");o(lz,"linkHorizontal")});var Pxe=N(()=>{"use strict";Oxe()});function drt(t){return[t.source.x1,t.y0]}function prt(t){return[t.target.x0,t.y1]}function _C(){return lz().source(drt).target(prt)}var Bxe=N(()=>{"use strict";Pxe();o(drt,"horizontalSource");o(prt,"horizontalTarget");o(_C,"default")});var Fxe=N(()=>{"use strict";Sxe();rz();Bxe()});var L4,$xe=N(()=>{"use strict";L4=class t{static{o(this,"Uid")}static{this.count=0}static next(e){return new t(e+ ++t.count)}constructor(e){this.id=e,this.href=`#${e}`}toString(){return"url("+this.href+")"}}});var mrt,grt,zxe,Gxe=N(()=>{"use strict";Xt();yr();Fxe();Ei();$xe();mrt={left:J$,right:ez,center:tz,justify:D4},grt=o(function(t,e,r,n){let{securityLevel:i,sankey:a}=ge(),s=G3.sankey,l;i==="sandbox"&&(l=qe("#i"+e));let u=i==="sandbox"?qe(l.nodes()[0].contentDocument.body):qe("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):qe(`[id="${e}"]`),f=a?.width??s.width,d=a?.height??s.width,p=a?.useMaxWidth??s.useMaxWidth,m=a?.nodeAlignment??s.nodeAlignment,g=a?.prefix??s.prefix,y=a?.suffix??s.suffix,v=a?.showValues??s.showValues,x=n.db.getGraph(),b=mrt[m];CC().nodeId(I=>I.id).nodeWidth(10).nodePadding(10+(v?15:0)).nodeAlign(b).extent([[0,0],[f,d]])(x);let w=no(YD);h.append("g").attr("class","nodes").selectAll(".node").data(x.nodes).join("g").attr("class","node").attr("id",I=>(I.uid=L4.next("node-")).id).attr("transform",function(I){return"translate("+I.x0+","+I.y0+")"}).attr("x",I=>I.x0).attr("y",I=>I.y0).append("rect").attr("height",I=>I.y1-I.y0).attr("width",I=>I.x1-I.x0).attr("fill",I=>w(I.id));let k=o(({id:I,value:L})=>v?`${I} +${g}${Math.round(L*100)/100}${y}`:I,"getText");h.append("g").attr("class","node-labels").attr("font-size",14).selectAll("text").data(x.nodes).join("text").attr("x",I=>I.x0(I.y1+I.y0)/2).attr("dy",`${v?"0":"0.35"}em`).attr("text-anchor",I=>I.x0(L.uid=L4.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",L=>L.source.x1).attr("x2",L=>L.target.x0);I.append("stop").attr("offset","0%").attr("stop-color",L=>w(L.source.id)),I.append("stop").attr("offset","100%").attr("stop-color",L=>w(L.target.id))}let R;switch(C){case"gradient":R=o(I=>I.uid,"coloring");break;case"source":R=o(I=>w(I.source.id),"coloring");break;case"target":R=o(I=>w(I.target.id),"coloring");break;default:R=C}A.append("path").attr("d",_C()).attr("stroke",R).attr("stroke-width",I=>Math.max(1,I.width)),ic(void 0,h,0,p)},"draw"),zxe={draw:grt}});var Vxe,Uxe=N(()=>{"use strict";Vxe=o(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` +`).trim(),"prepareTextForParsing")});var yrt,Hxe,qxe=N(()=>{"use strict";yrt=o(t=>`.label { + font-family: ${t.fontFamily}; + }`,"getStyles"),Hxe=yrt});var Wxe={};dr(Wxe,{diagram:()=>xrt});var vrt,xrt,Yxe=N(()=>{"use strict";pxe();gxe();Gxe();Uxe();qxe();vrt=A4.parse.bind(A4);A4.parse=t=>vrt(Vxe(t));xrt={styles:Hxe,parser:A4,db:mxe,renderer:zxe}});var krt,gy,cz=N(()=>{"use strict";qn();La();tr();ci();krt=ur.packet,gy=class{constructor(){this.packet=[];this.setAccTitle=Rr;this.getAccTitle=Mr;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getAccDescription=Or;this.setAccDescription=Ir}static{o(this,"PacketDB")}getConfig(){let e=Vn({...krt,...Qt().packet});return e.showBits&&(e.paddingY+=10),e}getPacket(){return this.packet}pushWord(e){e.length>0&&this.packet.push(e)}clear(){Sr(),this.packet=[]}}});var Ert,Srt,Crt,uz,Kxe=N(()=>{"use strict";Uf();pt();r0();cz();Ert=1e4,Srt=o((t,e)=>{nl(t,e);let r=-1,n=[],i=1,{bitsPerRow:a}=e.getConfig();for(let{start:s,end:l,bits:u,label:h}of t.blocks){if(s!==void 0&&l!==void 0&&l{if(t.start===void 0)throw new Error("start should have been set during first phase");if(t.end===void 0)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*r)return[t,void 0];let n=e*r-1,i=e*r;return[{start:t.start,end:n,label:t.label,bits:n-t.start},{start:i,end:t.end,label:t.label,bits:t.end-i}]},"getNextFittingBlock"),uz={parser:{yy:void 0},parse:o(async t=>{let e=await bs("packet",t),r=uz.parser?.yy;if(!(r instanceof gy))throw new Error("parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");X.debug(e),Srt(e,r)},"parse")}});var Art,_rt,Qxe,Zxe=N(()=>{"use strict";tu();Ei();Art=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),{rowHeight:s,paddingY:l,bitWidth:u,bitsPerRow:h}=a,f=i.getPacket(),d=i.getDiagramTitle(),p=s+l,m=p*(f.length+1)-(d?0:s),g=u*h+2,y=aa(e);y.attr("viewbox",`0 0 ${g} ${m}`),mn(y,m,g,a.useMaxWidth);for(let[v,x]of f.entries())_rt(y,x,v,a);y.append("text").text(d).attr("x",g/2).attr("y",m-p/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),_rt=o((t,e,r,{rowHeight:n,paddingX:i,paddingY:a,bitWidth:s,bitsPerRow:l,showBits:u})=>{let h=t.append("g"),f=r*(n+a)+a;for(let d of e){let p=d.start%l*s+1,m=(d.end-d.start+1)*s-i;if(h.append("rect").attr("x",p).attr("y",f).attr("width",m).attr("height",n).attr("class","packetBlock"),h.append("text").attr("x",p+m/2).attr("y",f+n/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(d.label),!u)continue;let g=d.end===d.start,y=f-2;h.append("text").attr("x",p+(g?m/2:0)).attr("y",y).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",g?"middle":"start").text(d.start),g||h.append("text").attr("x",p+m).attr("y",y).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(d.end)}},"drawWord"),Qxe={draw:Art}});var Drt,Jxe,ebe=N(()=>{"use strict";tr();Drt={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},Jxe=o(({packet:t}={})=>{let e=Vn(Drt,t);return` + .packetByte { + font-size: ${e.byteFontSize}; + } + .packetByte.start { + fill: ${e.startByteColor}; + } + .packetByte.end { + fill: ${e.endByteColor}; + } + .packetLabel { + fill: ${e.labelColor}; + font-size: ${e.labelFontSize}; + } + .packetTitle { + fill: ${e.titleColor}; + font-size: ${e.titleFontSize}; + } + .packetBlock { + stroke: ${e.blockStrokeColor}; + stroke-width: ${e.blockStrokeWidth}; + fill: ${e.blockFillColor}; + } + `},"styles")});var tbe={};dr(tbe,{diagram:()=>Lrt});var Lrt,rbe=N(()=>{"use strict";cz();Kxe();Zxe();ebe();Lrt={parser:uz,get db(){return new gy},renderer:Qxe,styles:Jxe}});var yy,abe,d0,Mrt,Irt,sbe,Ort,Prt,Brt,Frt,$rt,zrt,Grt,p0,hz=N(()=>{"use strict";qn();La();tr();ci();yy={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},abe={axes:[],curves:[],options:yy},d0=structuredClone(abe),Mrt=ur.radar,Irt=o(()=>Vn({...Mrt,...Qt().radar}),"getConfig"),sbe=o(()=>d0.axes,"getAxes"),Ort=o(()=>d0.curves,"getCurves"),Prt=o(()=>d0.options,"getOptions"),Brt=o(t=>{d0.axes=t.map(e=>({name:e.name,label:e.label??e.name}))},"setAxes"),Frt=o(t=>{d0.curves=t.map(e=>({name:e.name,label:e.label??e.name,entries:$rt(e.entries)}))},"setCurves"),$rt=o(t=>{if(t[0].axis==null)return t.map(r=>r.value);let e=sbe();if(e.length===0)throw new Error("Axes must be populated before curves for reference entries");return e.map(r=>{let n=t.find(i=>i.axis?.$refText===r.name);if(n===void 0)throw new Error("Missing entry for axis "+r.label);return n.value})},"computeCurveEntries"),zrt=o(t=>{let e=t.reduce((r,n)=>(r[n.name]=n,r),{});d0.options={showLegend:e.showLegend?.value??yy.showLegend,ticks:e.ticks?.value??yy.ticks,max:e.max?.value??yy.max,min:e.min?.value??yy.min,graticule:e.graticule?.value??yy.graticule}},"setOptions"),Grt=o(()=>{Sr(),d0=structuredClone(abe)},"clear"),p0={getAxes:sbe,getCurves:Ort,getOptions:Prt,setAxes:Brt,setCurves:Frt,setOptions:zrt,getConfig:Irt,clear:Grt,setAccTitle:Rr,getAccTitle:Mr,setDiagramTitle:$r,getDiagramTitle:Pr,getAccDescription:Or,setAccDescription:Ir}});var Vrt,obe,lbe=N(()=>{"use strict";Uf();pt();r0();hz();Vrt=o(t=>{nl(t,p0);let{axes:e,curves:r,options:n}=t;p0.setAxes(e),p0.setCurves(r),p0.setOptions(n)},"populate"),obe={parse:o(async t=>{let e=await bs("radar",t);X.debug(e),Vrt(e)},"parse")}});function Yrt(t,e,r,n,i,a,s){let l=e.length,u=Math.min(s.width,s.height)/2;r.forEach((h,f)=>{if(h.entries.length!==l)return;let d=h.entries.map((p,m)=>{let g=2*Math.PI*m/l-Math.PI/2,y=Xrt(p,n,i,u),v=y*Math.cos(g),x=y*Math.sin(g);return{x:v,y:x}});a==="circle"?t.append("path").attr("d",jrt(d,s.curveTension)).attr("class",`radarCurve-${f}`):a==="polygon"&&t.append("polygon").attr("points",d.map(p=>`${p.x},${p.y}`).join(" ")).attr("class",`radarCurve-${f}`)})}function Xrt(t,e,r,n){let i=Math.min(Math.max(t,e),r);return n*(i-e)/(r-e)}function jrt(t,e){let r=t.length,n=`M${t[0].x},${t[0].y}`;for(let i=0;i{let h=t.append("g").attr("transform",`translate(${i}, ${a+u*s})`);h.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${u}`),h.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(l.label)})}var Urt,Hrt,qrt,Wrt,cbe,ube=N(()=>{"use strict";tu();Urt=o((t,e,r,n)=>{let i=n.db,a=i.getAxes(),s=i.getCurves(),l=i.getOptions(),u=i.getConfig(),h=i.getDiagramTitle(),f=aa(e),d=Hrt(f,u),p=l.max??Math.max(...s.map(y=>Math.max(...y.entries))),m=l.min,g=Math.min(u.width,u.height)/2;qrt(d,a,g,l.ticks,l.graticule),Wrt(d,a,g,u),Yrt(d,a,s,m,p,l.graticule,u),Krt(d,s,l.showLegend,u),d.append("text").attr("class","radarTitle").text(h).attr("x",0).attr("y",-u.height/2-u.marginTop)},"draw"),Hrt=o((t,e)=>{let r=e.width+e.marginLeft+e.marginRight,n=e.height+e.marginTop+e.marginBottom,i={x:e.marginLeft+e.width/2,y:e.marginTop+e.height/2};return t.attr("viewbox",`0 0 ${r} ${n}`).attr("width",r).attr("height",n),t.append("g").attr("transform",`translate(${i.x}, ${i.y})`)},"drawFrame"),qrt=o((t,e,r,n,i)=>{if(i==="circle")for(let a=0;a{let d=2*f*Math.PI/a-Math.PI/2,p=l*Math.cos(d),m=l*Math.sin(d);return`${p},${m}`}).join(" ");t.append("polygon").attr("points",u).attr("class","radarGraticule")}}},"drawGraticule"),Wrt=o((t,e,r,n)=>{let i=e.length;for(let a=0;a{"use strict";tr();Oy();qn();Qrt=o((t,e)=>{let r="";for(let n=0;n{let e=mh(),r=Qt(),n=Vn(e,r.themeVariables),i=Vn(n.radar,t);return{themeVariables:n,radarOptions:i}},"buildRadarStyleOptions"),hbe=o(({radar:t}={})=>{let{themeVariables:e,radarOptions:r}=Zrt(t);return` + .radarTitle { + font-size: ${e.fontSize}; + color: ${e.titleColor}; + dominant-baseline: hanging; + text-anchor: middle; + } + .radarAxisLine { + stroke: ${r.axisColor}; + stroke-width: ${r.axisStrokeWidth}; + } + .radarAxisLabel { + dominant-baseline: middle; + text-anchor: middle; + font-size: ${r.axisLabelFontSize}px; + color: ${r.axisColor}; + } + .radarGraticule { + fill: ${r.graticuleColor}; + fill-opacity: ${r.graticuleOpacity}; + stroke: ${r.graticuleColor}; + stroke-width: ${r.graticuleStrokeWidth}; + } + .radarLegendText { + text-anchor: start; + font-size: ${r.legendFontSize}px; + dominant-baseline: hanging; + } + ${Qrt(e,r)} + `},"styles")});var dbe={};dr(dbe,{diagram:()=>Jrt});var Jrt,pbe=N(()=>{"use strict";hz();lbe();ube();fbe();Jrt={parser:obe,db:p0,renderer:cbe,styles:hbe}});var fz,ybe,vbe=N(()=>{"use strict";fz=(function(){var t=o(function(T,S,w,k){for(w=w||{},k=T.length;k--;w[T[k]]=S);return w},"o"),e=[1,15],r=[1,7],n=[1,13],i=[1,14],a=[1,19],s=[1,16],l=[1,17],u=[1,18],h=[8,30],f=[8,10,21,28,29,30,31,39,43,46],d=[1,23],p=[1,24],m=[8,10,15,16,21,28,29,30,31,39,43,46],g=[8,10,15,16,21,27,28,29,30,31,39,43,46],y=[1,49],v={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,NODE_ID:31,nodeShapeNLabel:32,dirList:33,DIR:34,NODE_DSTART:35,NODE_DEND:36,BLOCK_ARROW_START:37,BLOCK_ARROW_END:38,classDef:39,CLASSDEF_ID:40,CLASSDEF_STYLEOPTS:41,DEFAULT:42,class:43,CLASSENTITY_IDS:44,STYLECLASS:45,style:46,STYLE_ENTITY_IDS:47,STYLE_DEFINITION_DATA:48,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"NODE_ID",34:"DIR",35:"NODE_DSTART",36:"NODE_DEND",37:"BLOCK_ARROW_START",38:"BLOCK_ARROW_END",39:"classDef",40:"CLASSDEF_ID",41:"CLASSDEF_STYLEOPTS",42:"DEFAULT",43:"class",44:"CLASSENTITY_IDS",45:"STYLECLASS",46:"style",47:"STYLE_ENTITY_IDS",48:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],performAction:o(function(S,w,k,A,C,R,I){var L=R.length-1;switch(C){case 4:A.getLogger().debug("Rule: separator (NL) ");break;case 5:A.getLogger().debug("Rule: separator (Space) ");break;case 6:A.getLogger().debug("Rule: separator (EOF) ");break;case 7:A.getLogger().debug("Rule: hierarchy: ",R[L-1]),A.setHierarchy(R[L-1]);break;case 8:A.getLogger().debug("Stop NL ");break;case 9:A.getLogger().debug("Stop EOF ");break;case 10:A.getLogger().debug("Stop NL2 ");break;case 11:A.getLogger().debug("Stop EOF2 ");break;case 12:A.getLogger().debug("Rule: statement: ",R[L]),typeof R[L].length=="number"?this.$=R[L]:this.$=[R[L]];break;case 13:A.getLogger().debug("Rule: statement #2: ",R[L-1]),this.$=[R[L-1]].concat(R[L]);break;case 14:A.getLogger().debug("Rule: link: ",R[L],S),this.$={edgeTypeStr:R[L],label:""};break;case 15:A.getLogger().debug("Rule: LABEL link: ",R[L-3],R[L-1],R[L]),this.$={edgeTypeStr:R[L],label:R[L-1]};break;case 18:let E=parseInt(R[L]),D=A.generateId();this.$={id:D,type:"space",label:"",width:E,children:[]};break;case 23:A.getLogger().debug("Rule: (nodeStatement link node) ",R[L-2],R[L-1],R[L]," typestr: ",R[L-1].edgeTypeStr);let _=A.edgeStrToEdgeData(R[L-1].edgeTypeStr);this.$=[{id:R[L-2].id,label:R[L-2].label,type:R[L-2].type,directions:R[L-2].directions},{id:R[L-2].id+"-"+R[L].id,start:R[L-2].id,end:R[L].id,label:R[L-1].label,type:"edge",directions:R[L].directions,arrowTypeEnd:_,arrowTypeStart:"arrow_open"},{id:R[L].id,label:R[L].label,type:A.typeStr2Type(R[L].typeStr),directions:R[L].directions}];break;case 24:A.getLogger().debug("Rule: nodeStatement (abc88 node size) ",R[L-1],R[L]),this.$={id:R[L-1].id,label:R[L-1].label,type:A.typeStr2Type(R[L-1].typeStr),directions:R[L-1].directions,widthInColumns:parseInt(R[L],10)};break;case 25:A.getLogger().debug("Rule: nodeStatement (node) ",R[L]),this.$={id:R[L].id,label:R[L].label,type:A.typeStr2Type(R[L].typeStr),directions:R[L].directions,widthInColumns:1};break;case 26:A.getLogger().debug("APA123",this?this:"na"),A.getLogger().debug("COLUMNS: ",R[L]),this.$={type:"column-setting",columns:R[L]==="auto"?-1:parseInt(R[L])};break;case 27:A.getLogger().debug("Rule: id-block statement : ",R[L-2],R[L-1]);let O=A.generateId();this.$={...R[L-2],type:"composite",children:R[L-1]};break;case 28:A.getLogger().debug("Rule: blockStatement : ",R[L-2],R[L-1],R[L]);let M=A.generateId();this.$={id:M,type:"composite",label:"",children:R[L-1]};break;case 29:A.getLogger().debug("Rule: node (NODE_ID separator): ",R[L]),this.$={id:R[L]};break;case 30:A.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",R[L-1],R[L]),this.$={id:R[L-1],label:R[L].label,typeStr:R[L].typeStr,directions:R[L].directions};break;case 31:A.getLogger().debug("Rule: dirList: ",R[L]),this.$=[R[L]];break;case 32:A.getLogger().debug("Rule: dirList: ",R[L-1],R[L]),this.$=[R[L-1]].concat(R[L]);break;case 33:A.getLogger().debug("Rule: nodeShapeNLabel: ",R[L-2],R[L-1],R[L]),this.$={typeStr:R[L-2]+R[L],label:R[L-1]};break;case 34:A.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",R[L-3],R[L-2]," #3:",R[L-1],R[L]),this.$={typeStr:R[L-3]+R[L],label:R[L-2],directions:R[L-1]};break;case 35:case 36:this.$={type:"classDef",id:R[L-1].trim(),css:R[L].trim()};break;case 37:this.$={type:"applyClass",id:R[L-1].trim(),styleClass:R[L].trim()};break;case 38:this.$={type:"applyStyles",id:R[L-1].trim(),stylesStr:R[L].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{10:e,11:3,13:4,19:5,20:6,21:r,22:8,23:9,24:10,25:11,26:12,28:n,29:i,31:a,39:s,43:l,46:u},{8:[1,20]},t(h,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:e,21:r,28:n,29:i,31:a,39:s,43:l,46:u}),t(f,[2,16],{14:22,15:d,16:p}),t(f,[2,17]),t(f,[2,18]),t(f,[2,19]),t(f,[2,20]),t(f,[2,21]),t(f,[2,22]),t(m,[2,25],{27:[1,25]}),t(f,[2,26]),{19:26,26:12,31:a},{10:e,11:27,13:4,19:5,20:6,21:r,22:8,23:9,24:10,25:11,26:12,28:n,29:i,31:a,39:s,43:l,46:u},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},t(g,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},t(h,[2,13]),{26:35,31:a},{31:[2,14]},{17:[1,36]},t(m,[2,24]),{10:e,11:37,13:4,14:22,15:d,16:p,19:5,20:6,21:r,22:8,23:9,24:10,25:11,26:12,28:n,29:i,31:a,39:s,43:l,46:u},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},t(g,[2,30]),{18:[1,43]},{18:[1,44]},t(m,[2,23]),{18:[1,45]},{30:[1,46]},t(f,[2,28]),t(f,[2,35]),t(f,[2,36]),t(f,[2,37]),t(f,[2,38]),{36:[1,47]},{33:48,34:y},{15:[1,50]},t(f,[2,27]),t(g,[2,33]),{38:[1,51]},{33:52,34:y,38:[2,31]},{31:[2,15]},t(g,[2,34]),{38:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:o(function(S,w){if(w.recoverable)this.trace(S);else{var k=new Error(S);throw k.hash=w,k}},"parseError"),parse:o(function(S){var w=this,k=[0],A=[],C=[null],R=[],I=this.table,L="",E=0,D=0,_=0,O=2,M=1,P=R.slice.call(arguments,1),B=Object.create(this.lexer),F={yy:{}};for(var G in this.yy)Object.prototype.hasOwnProperty.call(this.yy,G)&&(F.yy[G]=this.yy[G]);B.setInput(S,F.yy),F.yy.lexer=B,F.yy.parser=this,typeof B.yylloc>"u"&&(B.yylloc={});var $=B.yylloc;R.push($);var U=B.options&&B.options.ranges;typeof F.yy.parseError=="function"?this.parseError=F.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function j(Te){k.length=k.length-2*Te,C.length=C.length-Te,R.length=R.length-Te}o(j,"popStack");function te(){var Te;return Te=A.pop()||B.lex()||M,typeof Te!="number"&&(Te instanceof Array&&(A=Te,Te=A.pop()),Te=w.symbols_[Te]||Te),Te}o(te,"lex");for(var Y,oe,J,ue,re,ee,Z={},K,ae,Q,de;;){if(J=k[k.length-1],this.defaultActions[J]?ue=this.defaultActions[J]:((Y===null||typeof Y>"u")&&(Y=te()),ue=I[J]&&I[J][Y]),typeof ue>"u"||!ue.length||!ue[0]){var ne="";de=[];for(K in I[J])this.terminals_[K]&&K>O&&de.push("'"+this.terminals_[K]+"'");B.showPosition?ne="Parse error on line "+(E+1)+`: +`+B.showPosition()+` +Expecting `+de.join(", ")+", got '"+(this.terminals_[Y]||Y)+"'":ne="Parse error on line "+(E+1)+": Unexpected "+(Y==M?"end of input":"'"+(this.terminals_[Y]||Y)+"'"),this.parseError(ne,{text:B.match,token:this.terminals_[Y]||Y,line:B.yylineno,loc:$,expected:de})}if(ue[0]instanceof Array&&ue.length>1)throw new Error("Parse Error: multiple actions possible at state: "+J+", token: "+Y);switch(ue[0]){case 1:k.push(Y),C.push(B.yytext),R.push(B.yylloc),k.push(ue[1]),Y=null,oe?(Y=oe,oe=null):(D=B.yyleng,L=B.yytext,E=B.yylineno,$=B.yylloc,_>0&&_--);break;case 2:if(ae=this.productions_[ue[1]][1],Z.$=C[C.length-ae],Z._$={first_line:R[R.length-(ae||1)].first_line,last_line:R[R.length-1].last_line,first_column:R[R.length-(ae||1)].first_column,last_column:R[R.length-1].last_column},U&&(Z._$.range=[R[R.length-(ae||1)].range[0],R[R.length-1].range[1]]),ee=this.performAction.apply(Z,[L,D,E,F.yy,ue[1],C,R].concat(P)),typeof ee<"u")return ee;ae&&(k=k.slice(0,-1*ae*2),C=C.slice(0,-1*ae),R=R.slice(0,-1*ae)),k.push(this.productions_[ue[1]][0]),C.push(Z.$),R.push(Z._$),Q=I[k[k.length-2]][k[k.length-1]],k.push(Q);break;case 3:return!0}}return!0},"parse")},x=(function(){var T={EOF:1,parseError:o(function(w,k){if(this.yy.parser)this.yy.parser.parseError(w,k);else throw new Error(w)},"parseError"),setInput:o(function(S,w){return this.yy=w||this.yy||{},this._input=S,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var S=this._input[0];this.yytext+=S,this.yyleng++,this.offset++,this.match+=S,this.matched+=S;var w=S.match(/(?:\r\n?|\n).*/g);return w?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),S},"input"),unput:o(function(S){var w=S.length,k=S.split(/(?:\r\n?|\n)/g);this._input=S+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-w),this.offset-=w;var A=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),k.length-1&&(this.yylineno-=k.length-1);var C=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:k?(k.length===A.length?this.yylloc.first_column:0)+A[A.length-k.length].length-k[0].length:this.yylloc.first_column-w},this.options.ranges&&(this.yylloc.range=[C[0],C[0]+this.yyleng-w]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(S){this.unput(this.match.slice(S))},"less"),pastInput:o(function(){var S=this.matched.substr(0,this.matched.length-this.match.length);return(S.length>20?"...":"")+S.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var S=this.match;return S.length<20&&(S+=this._input.substr(0,20-S.length)),(S.substr(0,20)+(S.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var S=this.pastInput(),w=new Array(S.length+1).join("-");return S+this.upcomingInput()+` +`+w+"^"},"showPosition"),test_match:o(function(S,w){var k,A,C;if(this.options.backtrack_lexer&&(C={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(C.yylloc.range=this.yylloc.range.slice(0))),A=S[0].match(/(?:\r\n?|\n).*/g),A&&(this.yylineno+=A.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:A?A[A.length-1].length-A[A.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+S[0].length},this.yytext+=S[0],this.match+=S[0],this.matches=S,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(S[0].length),this.matched+=S[0],k=this.performAction.call(this,this.yy,this,w,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),k)return k;if(this._backtrack){for(var R in C)this[R]=C[R];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var S,w,k,A;this._more||(this.yytext="",this.match="");for(var C=this._currentRules(),R=0;Rw[0].length)){if(w=k,A=R,this.options.backtrack_lexer){if(S=this.test_match(k,C[R]),S!==!1)return S;if(this._backtrack){w=!1;continue}else return!1}else if(!this.options.flex)break}return w?(S=this.test_match(w,C[A]),S!==!1?S:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var w=this.next();return w||this.lex()},"lex"),begin:o(function(w){this.conditionStack.push(w)},"begin"),popState:o(function(){var w=this.conditionStack.length-1;return w>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(w){return w=this.conditionStack.length-1-Math.abs(w||0),w>=0?this.conditionStack[w]:"INITIAL"},"topState"),pushState:o(function(w){this.begin(w)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(w,k,A,C){var R=C;switch(A){case 0:return w.getLogger().debug("Found block-beta"),10;break;case 1:return w.getLogger().debug("Found id-block"),29;break;case 2:return w.getLogger().debug("Found block"),10;break;case 3:w.getLogger().debug(".",k.yytext);break;case 4:w.getLogger().debug("_",k.yytext);break;case 5:return 5;case 6:return k.yytext=-1,28;break;case 7:return k.yytext=k.yytext.replace(/columns\s+/,""),w.getLogger().debug("COLUMNS (LEX)",k.yytext),28;break;case 8:this.pushState("md_string");break;case 9:return"MD_STR";case 10:this.popState();break;case 11:this.pushState("string");break;case 12:w.getLogger().debug("LEX: POPPING STR:",k.yytext),this.popState();break;case 13:return w.getLogger().debug("LEX: STR end:",k.yytext),"STR";break;case 14:return k.yytext=k.yytext.replace(/space\:/,""),w.getLogger().debug("SPACE NUM (LEX)",k.yytext),21;break;case 15:return k.yytext="1",w.getLogger().debug("COLUMNS (LEX)",k.yytext),21;break;case 16:return 42;case 17:return"LINKSTYLE";case 18:return"INTERPOLATE";case 19:return this.pushState("CLASSDEF"),39;break;case 20:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 21:return this.popState(),this.pushState("CLASSDEFID"),40;break;case 22:return this.popState(),41;break;case 23:return this.pushState("CLASS"),43;break;case 24:return this.popState(),this.pushState("CLASS_STYLE"),44;break;case 25:return this.popState(),45;break;case 26:return this.pushState("STYLE_STMNT"),46;break;case 27:return this.popState(),this.pushState("STYLE_DEFINITION"),47;break;case 28:return this.popState(),48;break;case 29:return this.pushState("acc_title"),"acc_title";break;case 30:return this.popState(),"acc_title_value";break;case 31:return this.pushState("acc_descr"),"acc_descr";break;case 32:return this.popState(),"acc_descr_value";break;case 33:this.pushState("acc_descr_multiline");break;case 34:this.popState();break;case 35:return"acc_descr_multiline_value";case 36:return 30;case 37:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 38:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),w.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 40:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 41:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),w.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 43:return this.popState(),w.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 44:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 45:return this.popState(),w.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 46:return this.popState(),w.getLogger().debug("Lex: ("),"NODE_DEND";break;case 47:return this.popState(),w.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 48:return this.popState(),w.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 49:return this.popState(),w.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),w.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 51:return this.popState(),w.getLogger().debug("Lex: )"),"NODE_DEND";break;case 52:return this.popState(),w.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 53:return this.popState(),w.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 54:return w.getLogger().debug("Lexa: -)"),this.pushState("NODE"),35;break;case 55:return w.getLogger().debug("Lexa: (-"),this.pushState("NODE"),35;break;case 56:return w.getLogger().debug("Lexa: ))"),this.pushState("NODE"),35;break;case 57:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 58:return w.getLogger().debug("Lex: ((("),this.pushState("NODE"),35;break;case 59:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 60:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 61:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 62:return w.getLogger().debug("Lexc: >"),this.pushState("NODE"),35;break;case 63:return w.getLogger().debug("Lexa: (["),this.pushState("NODE"),35;break;case 64:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 65:return this.pushState("NODE"),35;break;case 66:return this.pushState("NODE"),35;break;case 67:return this.pushState("NODE"),35;break;case 68:return this.pushState("NODE"),35;break;case 69:return this.pushState("NODE"),35;break;case 70:return this.pushState("NODE"),35;break;case 71:return this.pushState("NODE"),35;break;case 72:return w.getLogger().debug("Lexa: ["),this.pushState("NODE"),35;break;case 73:return this.pushState("BLOCK_ARROW"),w.getLogger().debug("LEX ARR START"),37;break;case 74:return w.getLogger().debug("Lex: NODE_ID",k.yytext),31;break;case 75:return w.getLogger().debug("Lex: EOF",k.yytext),8;break;case 76:this.pushState("md_string");break;case 77:this.pushState("md_string");break;case 78:return"NODE_DESCR";case 79:this.popState();break;case 80:w.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 81:w.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 82:return w.getLogger().debug("LEX: NODE_DESCR:",k.yytext),"NODE_DESCR";break;case 83:w.getLogger().debug("LEX POPPING"),this.popState();break;case 84:w.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 85:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (right): dir:",k.yytext),"DIR";break;case 86:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (left):",k.yytext),"DIR";break;case 87:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (x):",k.yytext),"DIR";break;case 88:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (y):",k.yytext),"DIR";break;case 89:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (up):",k.yytext),"DIR";break;case 90:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (down):",k.yytext),"DIR";break;case 91:return k.yytext="]>",w.getLogger().debug("Lex (ARROW_DIR end):",k.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 92:return w.getLogger().debug("Lex: LINK","#"+k.yytext+"#"),15;break;case 93:return w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 94:return w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 95:return w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 96:return w.getLogger().debug("Lex: START_LINK",k.yytext),this.pushState("LLABEL"),16;break;case 97:return w.getLogger().debug("Lex: START_LINK",k.yytext),this.pushState("LLABEL"),16;break;case 98:return w.getLogger().debug("Lex: START_LINK",k.yytext),this.pushState("LLABEL"),16;break;case 99:this.pushState("md_string");break;case 100:return w.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 101:return this.popState(),w.getLogger().debug("Lex: LINK","#"+k.yytext+"#"),15;break;case 102:return this.popState(),w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 103:return this.popState(),w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 104:return w.getLogger().debug("Lex: COLON",k.yytext),k.yytext=k.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block:)/,/^(?:block\b)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[28],inclusive:!1},STYLE_STMNT:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[22],inclusive:!1},CLASSDEF:{rules:[20,21],inclusive:!1},CLASS_STYLE:{rules:[25],inclusive:!1},CLASS:{rules:[24],inclusive:!1},LLABEL:{rules:[99,100,101,102,103],inclusive:!1},ARROW_DIR:{rules:[85,86,87,88,89,90,91],inclusive:!1},BLOCK_ARROW:{rules:[76,81,84],inclusive:!1},NODE:{rules:[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,77,80],inclusive:!1},md_string:{rules:[9,10,78,79],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[12,13,82,83],inclusive:!1},acc_descr_multiline:{rules:[34,35],inclusive:!1},acc_descr:{rules:[32],inclusive:!1},acc_title:{rules:[30],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,11,14,15,16,17,18,19,23,26,29,31,33,36,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,92,93,94,95,96,97,98,104],inclusive:!0}}};return T})();v.lexer=x;function b(){this.yy={}}return o(b,"Parser"),b.prototype=v,v.Parser=b,new b})();fz.parser=fz;ybe=fz});function cnt(t){switch(X.debug("typeStr2Type",t),t){case"[]":return"square";case"()":return X.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}function unt(t){switch(X.debug("typeStr2Type",t),t){case"==":return"thick";default:return"normal"}}function hnt(t){switch(t.replace(/^[\s-]+|[\s-]+$/g,"")){case"x":return"arrow_cross";case"o":return"arrow_circle";case">":return"arrow_point";default:return""}}var ql,pz,dz,xbe,bbe,rnt,wbe,nnt,DC,int,ant,snt,ont,kbe,mz,R4,lnt,Tbe,fnt,dnt,pnt,mnt,gnt,ynt,vnt,xnt,bnt,Tnt,wnt,Ebe,Sbe=N(()=>{"use strict";hR();qn();Xt();pt();gr();ci();ql=new Map,pz=[],dz=new Map,xbe="color",bbe="fill",rnt="bgFill",wbe=",",nnt=ge(),DC=new Map,int=o(t=>tt.sanitizeText(t,nnt),"sanitizeText"),ant=o(function(t,e=""){let r=DC.get(t);r||(r={id:t,styles:[],textStyles:[]},DC.set(t,r)),e?.split(wbe).forEach(n=>{let i=n.replace(/([^;]*);/,"$1").trim();if(RegExp(xbe).exec(n)){let s=i.replace(bbe,rnt).replace(xbe,bbe);r.textStyles.push(s)}r.styles.push(i)})},"addStyleClass"),snt=o(function(t,e=""){let r=ql.get(t);e!=null&&(r.styles=e.split(wbe))},"addStyle2Node"),ont=o(function(t,e){t.split(",").forEach(function(r){let n=ql.get(r);if(n===void 0){let i=r.trim();n={id:i,type:"na",children:[]},ql.set(i,n)}n.classes||(n.classes=[]),n.classes.push(e)})},"setCssClass"),kbe=o((t,e)=>{let r=t.flat(),n=[],a=r.find(s=>s?.type==="column-setting")?.columns??-1;for(let s of r){if(typeof a=="number"&&a>0&&s.type!=="column-setting"&&typeof s.widthInColumns=="number"&&s.widthInColumns>a&&X.warn(`Block ${s.id} width ${s.widthInColumns} exceeds configured column width ${a}`),s.label&&(s.label=int(s.label)),s.type==="classDef"){ant(s.id,s.css);continue}if(s.type==="applyClass"){ont(s.id,s?.styleClass??"");continue}if(s.type==="applyStyles"){s?.stylesStr&&snt(s.id,s?.stylesStr);continue}if(s.type==="column-setting")e.columns=s.columns??-1;else if(s.type==="edge"){let l=(dz.get(s.id)??0)+1;dz.set(s.id,l),s.id=l+"-"+s.id,pz.push(s)}else{s.label||(s.type==="composite"?s.label="":s.label=s.id);let l=ql.get(s.id);if(l===void 0?ql.set(s.id,s):(s.type!=="na"&&(l.type=s.type),s.label!==s.id&&(l.label=s.label)),s.children&&kbe(s.children,s),s.type==="space"){let u=s.width??1;for(let h=0;h{X.debug("Clear called"),Sr(),R4={id:"root",type:"composite",children:[],columns:-1},ql=new Map([["root",R4]]),mz=[],DC=new Map,pz=[],dz=new Map},"clear");o(cnt,"typeStr2Type");o(unt,"edgeTypeStr2Type");o(hnt,"edgeStrToEdgeData");Tbe=0,fnt=o(()=>(Tbe++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Tbe),"generateId"),dnt=o(t=>{R4.children=t,kbe(t,R4),mz=R4.children},"setHierarchy"),pnt=o(t=>{let e=ql.get(t);return e?e.columns?e.columns:e.children?e.children.length:-1:-1},"getColumns"),mnt=o(()=>[...ql.values()],"getBlocksFlat"),gnt=o(()=>mz||[],"getBlocks"),ynt=o(()=>pz,"getEdges"),vnt=o(t=>ql.get(t),"getBlock"),xnt=o(t=>{ql.set(t.id,t)},"setBlock"),bnt=o(()=>X,"getLogger"),Tnt=o(function(){return DC},"getClasses"),wnt={getConfig:o(()=>Qt().block,"getConfig"),typeStr2Type:cnt,edgeTypeStr2Type:unt,edgeStrToEdgeData:hnt,getLogger:bnt,getBlocksFlat:mnt,getBlocks:gnt,getEdges:ynt,setHierarchy:dnt,getBlock:vnt,setBlock:xnt,getColumns:pnt,getClasses:Tnt,clear:lnt,generateId:fnt},Ebe=wnt});var LC,knt,Cbe,Abe=N(()=>{"use strict";eo();yg();LC=o((t,e)=>{let r=ld,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Ka(n,i,a,e)},"fade"),knt=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .cluster-label text { + fill: ${t.titleColor}; + } + .cluster-label span,p { + color: ${t.titleColor}; + } + + + + .label text,span,p { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${LC(t.edgeLabelBackground,.5)}; + // background-color: + } + + .node .cluster { + // fill: ${LC(t.mainBkg,.5)}; + fill: ${LC(t.clusterBkg,.5)}; + stroke: ${LC(t.clusterBorder,.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${t.titleColor}; + } + + .cluster span,p { + color: ${t.titleColor}; + } + /* .cluster div { + color: ${t.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } + ${zc()} +`,"getStyles"),Cbe=knt});var Ent,Snt,Cnt,Ant,_nt,Dnt,Lnt,Rnt,Nnt,Mnt,Int,_be,Dbe=N(()=>{"use strict";pt();Ent=o((t,e,r,n)=>{e.forEach(i=>{Int[i](t,r,n)})},"insertMarkers"),Snt=o((t,e,r)=>{X.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),Cnt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),Ant=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),_nt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),Dnt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),Lnt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),Rnt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),Nnt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),Mnt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),Int={extension:Snt,composition:Cnt,aggregation:Ant,dependency:_nt,lollipop:Dnt,point:Lnt,circle:Rnt,cross:Nnt,barb:Mnt},_be=Ent});function Ont(t,e){if(t===0||!Number.isInteger(t))throw new Error("Columns must be an integer !== 0.");if(e<0||!Number.isInteger(e))throw new Error("Position must be a non-negative integer."+e);if(t<0)return{px:e,py:0};if(t===1)return{px:0,py:e};let r=e%t,n=Math.floor(e/t);return{px:r,py:n}}function gz(t,e,r=0,n=0){X.debug("setBlockSizes abc95 (start)",t.id,t?.size?.x,"block width =",t?.size,"siblingWidth",r),t?.size?.width||(t.size={width:r,height:n,x:0,y:0});let i=0,a=0;if(t.children?.length>0){for(let m of t.children)gz(m,e);let s=Pnt(t);i=s.width,a=s.height,X.debug("setBlockSizes abc95 maxWidth of",t.id,":s children is ",i,a);for(let m of t.children)m.size&&(X.debug(`abc95 Setting size of children of ${t.id} id=${m.id} ${i} ${a} ${JSON.stringify(m.size)}`),m.size.width=i*(m.widthInColumns??1)+Ti*((m.widthInColumns??1)-1),m.size.height=a,m.size.x=0,m.size.y=0,X.debug(`abc95 updating size of ${t.id} children child:${m.id} maxWidth:${i} maxHeight:${a}`));for(let m of t.children)gz(m,e,i,a);let l=t.columns??-1,u=0;for(let m of t.children)u+=m.widthInColumns??1;let h=t.children.length;l>0&&l0?Math.min(t.children.length,l):t.children.length;if(m>0){let g=(d-m*Ti-Ti)/m;X.debug("abc95 (growing to fit) width",t.id,d,t.size?.width,g);for(let y of t.children)y.size&&(y.size.width=g)}}t.size={width:d,height:p,x:0,y:0}}X.debug("setBlockSizes abc94 (done)",t.id,t?.size?.x,t?.size?.width,t?.size?.y,t?.size?.height)}function Lbe(t,e){X.debug(`abc85 layout blocks (=>layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`);let r=t.columns??-1;if(X.debug("layoutBlocks columns abc95",t.id,"=>",r,t),t.children&&t.children.length>0){let n=t?.children[0]?.size?.width??0,i=t.children.length*n+(t.children.length-1)*Ti;X.debug("widthOfChildren 88",i,"posX");let a=0;X.debug("abc91 block?.size?.x",t.id,t?.size?.x);let s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-Ti,l=0;for(let u of t.children){let h=t;if(!u.size)continue;let{width:f,height:d}=u.size,{px:p,py:m}=Ont(r,a);if(m!=l&&(l=m,s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-Ti,X.debug("New row in layout for block",t.id," and child ",u.id,l)),X.debug(`abc89 layout blocks (child) id: ${u.id} Pos: ${a} (px, py) ${p},${m} (${h?.size?.x},${h?.size?.y}) parent: ${h.id} width: ${f}${Ti}`),h.size){let y=f/2;u.size.x=s+Ti+y,X.debug(`abc91 layout blocks (calc) px, pyid:${u.id} startingPos=X${s} new startingPosX${u.size.x} ${y} padding=${Ti} width=${f} halfWidth=${y} => x:${u.size.x} y:${u.size.y} ${u.widthInColumns} (width * (child?.w || 1)) / 2 ${f*(u?.widthInColumns??1)/2}`),s=u.size.x+y,u.size.y=h.size.y-h.size.height/2+m*(d+Ti)+d/2+Ti,X.debug(`abc88 layout blocks (calc) px, pyid:${u.id}startingPosX${s}${Ti}${y}=>x:${u.size.x}y:${u.size.y}${u.widthInColumns}(width * (child?.w || 1)) / 2${f*(u?.widthInColumns??1)/2}`)}u.children&&Lbe(u,e);let g=u?.widthInColumns??1;r>0&&(g=Math.min(g,r-a%r)),a+=g,X.debug("abc88 columnsPos",u,a)}}X.debug(`layout blocks (<==layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`)}function Rbe(t,{minX:e,minY:r,maxX:n,maxY:i}={minX:0,minY:0,maxX:0,maxY:0}){if(t.size&&t.id!=="root"){let{x:a,y:s,width:l,height:u}=t.size;a-l/2n&&(n=a+l/2),s+u/2>i&&(i=s+u/2)}if(t.children)for(let a of t.children)({minX:e,minY:r,maxX:n,maxY:i}=Rbe(a,{minX:e,minY:r,maxX:n,maxY:i}));return{minX:e,minY:r,maxX:n,maxY:i}}function Nbe(t){let e=t.getBlock("root");if(!e)return;gz(e,t,0,0),Lbe(e,t),X.debug("getBlocks",JSON.stringify(e,null,2));let{minX:r,minY:n,maxX:i,maxY:a}=Rbe(e),s=a-n,l=i-r;return{x:r,y:n,width:l,height:s}}var Ti,Pnt,Mbe=N(()=>{"use strict";pt();Xt();Ti=ge()?.block?.padding??8;o(Ont,"calculateBlockPosition");Pnt=o(t=>{let e=0,r=0;for(let n of t.children){let{width:i,height:a,x:s,y:l}=n.size??{width:0,height:0,x:0,y:0};X.debug("getMaxChildSize abc95 child:",n.id,"width:",i,"height:",a,"x:",s,"y:",l,n.type),n.type!=="space"&&(i>e&&(e=i/(t.widthInColumns??1)),a>r&&(r=a))}return{width:e,height:r}},"getMaxChildSize");o(gz,"setBlockSizes");o(Lbe,"layoutBlocks");o(Rbe,"findBounds");o(Nbe,"layout")});function Ibe(t,e){e&&t.attr("style",e)}function Bnt(t,e){let r=qe(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),n=r.append("xhtml:div"),i=t.label,a=t.isNode?"nodeLabel":"edgeLabel",s=n.append("span");return s.html(sr(i,e)),Ibe(s,t.labelStyle),s.attr("class",a),Ibe(n,t.labelStyle),n.style("display","inline-block"),n.style("white-space","nowrap"),n.attr("xmlns","http://www.w3.org/1999/xhtml"),r.node()}var Fnt,ks,RC=N(()=>{"use strict";yr();Xt();gr();pt();zo();tr();o(Ibe,"applyStyle");o(Bnt,"addHtmlLabel");Fnt=o(async(t,e,r,n)=>{let i=t||"";typeof i=="object"&&(i=i[0]);let a=ge();if(vr(a.flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),X.debug("vertexText"+i);let s=await k9(Ji(i)),l={isNode:n,label:s,labelStyle:e.replace("fill:","color:")};return Bnt(l,a)}else{let s=document.createElementNS("http://www.w3.org/2000/svg","text");s.setAttribute("style",e.replace("color:","fill:"));let l=[];typeof i=="string"?l=i.split(/\\n|\n|/gi):Array.isArray(i)?l=i:l=[];for(let u of l){let h=document.createElementNS("http://www.w3.org/2000/svg","tspan");h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),h.setAttribute("dy","1em"),h.setAttribute("x","0"),r?h.setAttribute("class","title-row"):h.setAttribute("class","row"),h.textContent=u.trim(),s.appendChild(h)}return s}},"createLabel"),ks=Fnt});var Pbe,$nt,Obe,Bbe=N(()=>{"use strict";pt();Pbe=o((t,e,r,n,i)=>{e.arrowTypeStart&&Obe(t,"start",e.arrowTypeStart,r,n,i),e.arrowTypeEnd&&Obe(t,"end",e.arrowTypeEnd,r,n,i)},"addEdgeMarkers"),$nt={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},Obe=o((t,e,r,n,i,a)=>{let s=$nt[r];if(!s){X.warn(`Unknown arrow type: ${r}`);return}let l=e==="start"?"Start":"End";t.attr(`marker-${e}`,`url(${n}#${i}_${a}-${s}${l})`)},"addEdgeMarker")});function NC(t,e){ge().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}var yz,Wa,$be,zbe,znt,Gnt,Fbe,Gbe,Vbe=N(()=>{"use strict";pt();RC();zo();yr();Xt();tr();gr();X9();O2();Bbe();yz={},Wa={},$be=o(async(t,e)=>{let r=ge(),n=vr(r.flowchart.htmlLabels),i=e.labelType==="markdown"?di(t,e.label,{style:e.labelStyle,useHtmlLabels:n,addSvgBackground:!0},r):await ks(e.label,e.labelStyle),a=t.insert("g").attr("class","edgeLabel"),s=a.insert("g").attr("class","label");s.node().appendChild(i);let l=i.getBBox();if(n){let h=i.children[0],f=qe(i);l=h.getBoundingClientRect(),f.attr("width",l.width),f.attr("height",l.height)}s.attr("transform","translate("+-l.width/2+", "+-l.height/2+")"),yz[e.id]=a,e.width=l.width,e.height=l.height;let u;if(e.startLabelLeft){let h=await ks(e.startLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Wa[e.id]||(Wa[e.id]={}),Wa[e.id].startLeft=f,NC(u,e.startLabelLeft)}if(e.startLabelRight){let h=await ks(e.startLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=f.node().appendChild(h),d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Wa[e.id]||(Wa[e.id]={}),Wa[e.id].startRight=f,NC(u,e.startLabelRight)}if(e.endLabelLeft){let h=await ks(e.endLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Wa[e.id]||(Wa[e.id]={}),Wa[e.id].endLeft=f,NC(u,e.endLabelLeft)}if(e.endLabelRight){let h=await ks(e.endLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Wa[e.id]||(Wa[e.id]={}),Wa[e.id].endRight=f,NC(u,e.endLabelRight)}return i},"insertEdgeLabel");o(NC,"setTerminalWidth");zbe=o((t,e)=>{X.debug("Moving label abc88 ",t.id,t.label,yz[t.id],e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=ge(),{subGraphTitleTotalMargin:i}=Pu(n);if(t.label){let a=yz[t.id],s=t.x,l=t.y;if(r){let u=qt.calcLabelPosition(r);X.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=Wa[t.id].startLeft,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=Wa[t.id].startRight,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=Wa[t.id].endLeft,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=Wa[t.id].endRight,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),znt=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),Gnt=o((t,e,r)=>{X.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(e)} + insidePoint : ${JSON.stringify(r)} + node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{X.debug("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(!znt(e,a)&&!i){let s=Gnt(e,n,a),l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)||r.push(s),i=!0}else n=a,i||r.push(a)}),r},"cutPathAtIntersect"),Gbe=o(function(t,e,r,n,i,a,s){let l=r.points;X.debug("abc88 InsertEdge: edge=",r,"e=",e);let u=!1,h=a.node(e.v);var f=a.node(e.w);f?.intersect&&h?.intersect&&(l=l.slice(1,r.points.length-1),l.unshift(h.intersect(l[0])),l.push(f.intersect(l[l.length-1]))),r.toCluster&&(X.debug("to cluster abc88",n[r.toCluster]),l=Fbe(r.points,n[r.toCluster].node),u=!0),r.fromCluster&&(X.debug("from cluster abc88",n[r.fromCluster]),l=Fbe(l.reverse(),n[r.fromCluster].node).reverse(),u=!0);let d=l.filter(S=>!Number.isNaN(S.y)),p=No;r.curve&&(i==="graph"||i==="flowchart")&&(p=r.curve);let{x:m,y:g}=hw(r),y=Cl().x(m).y(g).curve(p),v;switch(r.thickness){case"normal":v="edge-thickness-normal";break;case"thick":v="edge-thickness-thick";break;case"invisible":v="edge-thickness-thick";break;default:v=""}switch(r.pattern){case"solid":v+=" edge-pattern-solid";break;case"dotted":v+=" edge-pattern-dotted";break;case"dashed":v+=" edge-pattern-dashed";break}let x=t.append("path").attr("d",y(d)).attr("id",r.id).attr("class"," "+v+(r.classes?" "+r.classes:"")).attr("style",r.style),b="";(ge().flowchart.arrowMarkerAbsolute||ge().state.arrowMarkerAbsolute)&&(b=md(!0)),Pbe(x,r,b,s,i);let T={};return u&&(T.updatedPath=l),T.originalPath=r.points,T},"insertEdge")});var Vnt,Ube,Hbe=N(()=>{"use strict";Vnt=o(t=>{let e=new Set;for(let r of t)switch(r){case"x":e.add("right"),e.add("left");break;case"y":e.add("up"),e.add("down");break;default:e.add(r);break}return e},"expandAndDeduplicateDirections"),Ube=o((t,e,r)=>{let n=Vnt(t),i=2,a=e.height+2*r.padding,s=a/i,l=e.width+2*s+r.padding,u=r.padding/2;return n.has("right")&&n.has("left")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:s,y:0},{x:l/2,y:2*u},{x:l-s,y:0},{x:l,y:0},{x:l,y:-a/3},{x:l+2*u,y:-a/2},{x:l,y:-2*a/3},{x:l,y:-a},{x:l-s,y:-a},{x:l/2,y:-a-2*u},{x:s,y:-a},{x:0,y:-a},{x:0,y:-2*a/3},{x:-2*u,y:-a/2},{x:0,y:-a/3}]:n.has("right")&&n.has("left")&&n.has("up")?[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}]:n.has("right")&&n.has("left")&&n.has("down")?[{x:0,y:0},{x:s,y:-a},{x:l-s,y:-a},{x:l,y:0}]:n.has("right")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:l,y:-s},{x:l,y:-a+s},{x:0,y:-a}]:n.has("left")&&n.has("up")&&n.has("down")?[{x:l,y:0},{x:0,y:-s},{x:0,y:-a+s},{x:l,y:-a}]:n.has("right")&&n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")&&n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:n.has("right")&&n.has("up")?[{x:0,y:0},{x:l,y:-s},{x:0,y:-a}]:n.has("right")&&n.has("down")?[{x:0,y:0},{x:l,y:0},{x:0,y:-a}]:n.has("left")&&n.has("up")?[{x:l,y:0},{x:0,y:-s},{x:l,y:-a}]:n.has("left")&&n.has("down")?[{x:l,y:0},{x:0,y:0},{x:l,y:-a}]:n.has("right")?[{x:s,y:-u},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a+u}]:n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")?[{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u}]:n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:[{x:0,y:0}]},"getArrowPoints")});function Unt(t,e){return t.intersect(e)}var qbe,Wbe=N(()=>{"use strict";o(Unt,"intersectNode");qbe=Unt});function Hnt(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(Hnt,"intersectEllipse");MC=Hnt});function qnt(t,e,r){return MC(t,e,e,r)}var Ybe,Xbe=N(()=>{"use strict";vz();o(qnt,"intersectCircle");Ybe=qnt});function Wnt(t,e,r,n){var i,a,s,l,u,h,f,d,p,m,g,y,v,x,b;if(i=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,p=i*r.x+s*r.y+u,m=i*n.x+s*n.y+u,!(p!==0&&m!==0&&jbe(p,m))&&(a=n.y-r.y,l=r.x-n.x,h=n.x*r.y-r.x*n.y,f=a*t.x+l*t.y+h,d=a*e.x+l*e.y+h,!(f!==0&&d!==0&&jbe(f,d))&&(g=i*l-a*s,g!==0)))return y=Math.abs(g/2),v=s*h-l*u,x=v<0?(v-y)/g:(v+y)/g,v=a*u-i*h,b=v<0?(v-y)/g:(v+y)/g,{x,y:b}}function jbe(t,e){return t*e>0}var Kbe,Qbe=N(()=>{"use strict";o(Wnt,"intersectLine");o(jbe,"sameSign");Kbe=Wnt});function Ynt(t,e,r){var n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(g){s=Math.min(s,g.x),l=Math.min(l,g.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));for(var u=n-t.width/2-s,h=i-t.height/2-l,f=0;f1&&a.sort(function(g,y){var v=g.x-r.x,x=g.y-r.y,b=Math.sqrt(v*v+x*x),T=y.x-r.x,S=y.y-r.y,w=Math.sqrt(T*T+S*S);return b{"use strict";Qbe();Zbe=Ynt;o(Ynt,"intersectPolygon")});var Xnt,e4e,t4e=N(()=>{"use strict";Xnt=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),e4e=Xnt});var $n,xz=N(()=>{"use strict";Wbe();Xbe();vz();Jbe();t4e();$n={node:qbe,circle:Ybe,ellipse:MC,polygon:Zbe,rect:e4e}});function Wl(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var Li,ti,bz=N(()=>{"use strict";RC();zo();Xt();yr();gr();tr();Li=o(async(t,e,r,n)=>{let i=ge(),a,s=e.useHtmlLabels||vr(i.flowchart.htmlLabels);r?a=r:a="node default";let l=t.insert("g").attr("class",a).attr("id",e.domId||e.id),u=l.insert("g").attr("class","label").attr("style",e.labelStyle),h;e.labelText===void 0?h="":h=typeof e.labelText=="string"?e.labelText:e.labelText[0];let f=u.node(),d;e.labelType==="markdown"?d=di(u,sr(Ji(h),i),{useHtmlLabels:s,width:e.width||i.flowchart.wrappingWidth,classes:"markdown-node-label"},i):d=f.appendChild(await ks(sr(Ji(h),i),e.labelStyle,!1,n));let p=d.getBBox(),m=e.padding/2;if(vr(i.flowchart.htmlLabels)){let g=d.children[0],y=qe(d),v=g.getElementsByTagName("img");if(v){let x=h.replace(/]*>/g,"").trim()==="";await Promise.all([...v].map(b=>new Promise(T=>{function S(){if(b.style.display="flex",b.style.flexDirection="column",x){let w=i.fontSize?i.fontSize:window.getComputedStyle(document.body).fontSize,A=parseInt(w,10)*5+"px";b.style.minWidth=A,b.style.maxWidth=A}else b.style.width="100%";T(b)}o(S,"setupImage"),setTimeout(()=>{b.complete&&S()}),b.addEventListener("error",S),b.addEventListener("load",S)})))}p=g.getBoundingClientRect(),y.attr("width",p.width),y.attr("height",p.height)}return s?u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"):u.attr("transform","translate(0, "+-p.height/2+")"),e.centerLabel&&u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),u.insert("rect",":first-child"),{shapeSvg:l,bbox:p,halfPadding:m,label:u}},"labelHelper"),ti=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds");o(Wl,"insertPolygonShape")});var jnt,r4e,n4e=N(()=>{"use strict";bz();pt();Xt();xz();jnt=o(async(t,e)=>{e.useHtmlLabels||ge().flowchart.htmlLabels||(e.centerLabel=!0);let{shapeSvg:n,bbox:i,halfPadding:a}=await Li(t,e,"node "+e.classes,!0);X.info("Classes = ",e.classes);let s=n.insert("rect",":first-child");return s.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-a).attr("y",-i.height/2-a).attr("width",i.width+e.padding).attr("height",i.height+e.padding),ti(e,s),e.intersect=function(l){return $n.rect(e,l)},n},"note"),r4e=jnt});function Tz(t,e,r,n){let i=[],a=o(l=>{i.push(l,0)},"addBorder"),s=o(l=>{i.push(0,l)},"skipBorder");e.includes("t")?(X.debug("add top border"),a(r)):s(r),e.includes("r")?(X.debug("add right border"),a(n)):s(n),e.includes("b")?(X.debug("add bottom border"),a(r)):s(r),e.includes("l")?(X.debug("add left border"),a(n)):s(n),t.attr("stroke-dasharray",i.join(" "))}var i4e,To,a4e,Knt,Qnt,Znt,Jnt,eit,tit,rit,nit,iit,ait,sit,oit,lit,cit,uit,hit,fit,dit,pit,s4e,mit,git,o4e,IC,wz,l4e,c4e=N(()=>{"use strict";yr();Xt();gr();pt();Hbe();RC();xz();n4e();bz();i4e=o(t=>t?" "+t:"","formatClass"),To=o((t,e)=>`${e||"node default"}${i4e(t.classes)} ${i4e(t.class)}`,"getClassesFromNode"),a4e=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=i+a,l=[{x:s/2,y:0},{x:s,y:-s/2},{x:s/2,y:-s},{x:0,y:-s/2}];X.info("Question main (Circle)");let u=Wl(r,s,s,l);return u.attr("style",e.style),ti(e,u),e.intersect=function(h){return X.warn("Intersect called"),$n.polygon(e,l,h)},r},"question"),Knt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=28,i=[{x:0,y:n/2},{x:n/2,y:0},{x:0,y:-n/2},{x:-n/2,y:0}];return r.insert("polygon",":first-child").attr("points",i.map(function(s){return s.x+","+s.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(s){return $n.circle(e,14,s)},r},"choice"),Qnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=4,a=n.height+e.padding,s=a/i,l=n.width+2*s+e.padding,u=[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}],h=Wl(r,l,a,u);return h.attr("style",e.style),ti(e,h),e.intersect=function(f){return $n.polygon(e,u,f)},r},"hexagon"),Znt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,void 0,!0),i=2,a=n.height+2*e.padding,s=a/i,l=n.width+2*s+e.padding,u=Ube(e.directions,n,e),h=Wl(r,l,a,u);return h.attr("style",e.style),ti(e,h),e.intersect=function(f){return $n.polygon(e,u,f)},r},"block_arrow"),Jnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-a/2,y:0},{x:i,y:0},{x:i,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return Wl(r,i,a,s).attr("style",e.style),e.width=i+a,e.height=a,e.intersect=function(u){return $n.polygon(e,s,u)},r},"rect_left_inv_arrow"),eit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:a/6,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"lean_right"),tit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:2*a/6,y:0},{x:i+a/6,y:0},{x:i-2*a/6,y:-a},{x:-a/6,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"lean_left"),rit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i+2*a/6,y:0},{x:i-a/6,y:-a},{x:a/6,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"trapezoid"),nit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:-2*a/6,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"inv_trapezoid"),iit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i+a/2,y:0},{x:i,y:-a/2},{x:i+a/2,y:-a},{x:0,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"rect_right_inv_arrow"),ait=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=i/2,s=a/(2.5+i/50),l=n.height+s+e.padding,u="M 0,"+s+" a "+a+","+s+" 0,0,0 "+i+" 0 a "+a+","+s+" 0,0,0 "+-i+" 0 l 0,"+l+" a "+a+","+s+" 0,0,0 "+i+" 0 l 0,"+-l,h=r.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",u).attr("transform","translate("+-i/2+","+-(l/2+s)+")");return ti(e,h),e.intersect=function(f){let d=$n.rect(e,f),p=d.x-e.x;if(a!=0&&(Math.abs(p)e.height/2-s)){let m=s*s*(1-p*p/(a*a));m!=0&&(m=Math.sqrt(m)),m=s-m,f.y-e.y>0&&(m=-m),d.y+=m}return d},r},"cylinder"),sit=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Li(t,e,"node "+e.classes+" "+e.class,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(Tz(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{X.warn(`Unknown node property ${d}`)})}return ti(e,a),e.intersect=function(f){return $n.rect(e,f)},r},"rect"),oit=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Li(t,e,"node "+e.classes,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic cluster composite label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(Tz(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{X.warn(`Unknown node property ${d}`)})}return ti(e,a),e.intersect=function(f){return $n.rect(e,f)},r},"composite"),lit=o(async(t,e)=>{let{shapeSvg:r}=await Li(t,e,"label",!0);X.trace("Classes = ",e.class);let n=r.insert("rect",":first-child"),i=0,a=0;if(n.attr("width",i).attr("height",a),r.attr("class","label edgeLabel"),e.props){let s=new Set(Object.keys(e.props));e.props.borders&&(Tz(n,e.props.borders,i,a),s.delete("borders")),s.forEach(l=>{X.warn(`Unknown node property ${l}`)})}return ti(e,n),e.intersect=function(s){return $n.rect(e,s)},r},"labelRect");o(Tz,"applyNodePropertyBorders");cit=o(async(t,e)=>{let r;e.classes?r="node "+e.classes:r="node default";let n=t.insert("g").attr("class",r).attr("id",e.domId||e.id),i=n.insert("rect",":first-child"),a=n.insert("line"),s=n.insert("g").attr("class","label"),l=e.labelText.flat?e.labelText.flat():e.labelText,u="";typeof l=="object"?u=l[0]:u=l,X.info("Label text abc79",u,l,typeof l=="object");let h=s.node().appendChild(await ks(u,e.labelStyle,!0,!0)),f={width:0,height:0};if(vr(ge().flowchart.htmlLabels)){let y=h.children[0],v=qe(h);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}X.info("Text 2",l);let d=l.slice(1,l.length),p=h.getBBox(),m=s.node().appendChild(await ks(d.join?d.join("
    "):d,e.labelStyle,!0,!0));if(vr(ge().flowchart.htmlLabels)){let y=m.children[0],v=qe(m);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}let g=e.padding/2;return qe(m).attr("transform","translate( "+(f.width>p.width?0:(p.width-f.width)/2)+", "+(p.height+g+5)+")"),qe(h).attr("transform","translate( "+(f.width{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.height+e.padding,a=n.width+i/4+e.padding,s=r.insert("rect",":first-child").attr("style",e.style).attr("rx",i/2).attr("ry",i/2).attr("x",-a/2).attr("y",-i/2).attr("width",a).attr("height",i);return ti(e,s),e.intersect=function(l){return $n.rect(e,l)},r},"stadium"),hit=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Li(t,e,To(e,void 0),!0),a=r.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),X.info("Circle main"),ti(e,a),e.intersect=function(s){return X.info("Circle intersect",e,n.width/2+i,s),$n.circle(e,n.width/2+i,s)},r},"circle"),fit=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Li(t,e,To(e,void 0),!0),a=5,s=r.insert("g",":first-child"),l=s.insert("circle"),u=s.insert("circle");return s.attr("class",e.class),l.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i+a).attr("width",n.width+e.padding+a*2).attr("height",n.height+e.padding+a*2),u.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),X.info("DoubleCircle main"),ti(e,l),e.intersect=function(h){return X.info("DoubleCircle intersect",e,n.width/2+i+a,h),$n.circle(e,n.width/2+i+a,h)},r},"doublecircle"),dit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i,y:0},{x:i,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:i+8,y:0},{x:i+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"subroutine"),pit=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child");return n.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),ti(e,n),e.intersect=function(i){return $n.circle(e,7,i)},r},"start"),s4e=o((t,e,r)=>{let n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=70,a=10;r==="LR"&&(i=10,a=70);let s=n.append("rect").attr("x",-1*i/2).attr("y",-1*a/2).attr("width",i).attr("height",a).attr("class","fork-join");return ti(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(l){return $n.rect(e,l)},n},"forkJoin"),mit=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child"),i=r.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),n.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),ti(e,i),e.intersect=function(a){return $n.circle(e,7,a)},r},"end"),git=o(async(t,e)=>{let r=e.padding/2,n=4,i=8,a;e.classes?a="node "+e.classes:a="node default";let s=t.insert("g").attr("class",a).attr("id",e.domId||e.id),l=s.insert("rect",":first-child"),u=s.insert("line"),h=s.insert("line"),f=0,d=n,p=s.insert("g").attr("class","label"),m=0,g=e.classData.annotations?.[0],y=e.classData.annotations[0]?"\xAB"+e.classData.annotations[0]+"\xBB":"",v=p.node().appendChild(await ks(y,e.labelStyle,!0,!0)),x=v.getBBox();if(vr(ge().flowchart.htmlLabels)){let C=v.children[0],R=qe(v);x=C.getBoundingClientRect(),R.attr("width",x.width),R.attr("height",x.height)}e.classData.annotations[0]&&(d+=x.height+n,f+=x.width);let b=e.classData.label;e.classData.type!==void 0&&e.classData.type!==""&&(ge().flowchart.htmlLabels?b+="<"+e.classData.type+">":b+="<"+e.classData.type+">");let T=p.node().appendChild(await ks(b,e.labelStyle,!0,!0));qe(T).attr("class","classTitle");let S=T.getBBox();if(vr(ge().flowchart.htmlLabels)){let C=T.children[0],R=qe(T);S=C.getBoundingClientRect(),R.attr("width",S.width),R.attr("height",S.height)}d+=S.height+n,S.width>f&&(f=S.width);let w=[];e.classData.members.forEach(async C=>{let R=C.getDisplayDetails(),I=R.displayText;ge().flowchart.htmlLabels&&(I=I.replace(//g,">"));let L=p.node().appendChild(await ks(I,R.cssStyle?R.cssStyle:e.labelStyle,!0,!0)),E=L.getBBox();if(vr(ge().flowchart.htmlLabels)){let D=L.children[0],_=qe(L);E=D.getBoundingClientRect(),_.attr("width",E.width),_.attr("height",E.height)}E.width>f&&(f=E.width),d+=E.height+n,w.push(L)}),d+=i;let k=[];if(e.classData.methods.forEach(async C=>{let R=C.getDisplayDetails(),I=R.displayText;ge().flowchart.htmlLabels&&(I=I.replace(//g,">"));let L=p.node().appendChild(await ks(I,R.cssStyle?R.cssStyle:e.labelStyle,!0,!0)),E=L.getBBox();if(vr(ge().flowchart.htmlLabels)){let D=L.children[0],_=qe(L);E=D.getBoundingClientRect(),_.attr("width",E.width),_.attr("height",E.height)}E.width>f&&(f=E.width),d+=E.height+n,k.push(L)}),d+=i,g){let C=(f-x.width)/2;qe(v).attr("transform","translate( "+(-1*f/2+C)+", "+-1*d/2+")"),m=x.height+n}let A=(f-S.width)/2;return qe(T).attr("transform","translate( "+(-1*f/2+A)+", "+(-1*d/2+m)+")"),m+=S.height+n,u.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,w.forEach(C=>{qe(C).attr("transform","translate( "+-f/2+", "+(-1*d/2+m+i/2)+")");let R=C?.getBBox();m+=(R?.height??0)+n}),m+=i,h.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,k.forEach(C=>{qe(C).attr("transform","translate( "+-f/2+", "+(-1*d/2+m)+")");let R=C?.getBBox();m+=(R?.height??0)+n}),l.attr("style",e.style).attr("class","outer title-state").attr("x",-f/2-r).attr("y",-(d/2)-r).attr("width",f+e.padding).attr("height",d+e.padding),ti(e,l),e.intersect=function(C){return $n.rect(e,C)},s},"class_box"),o4e={rhombus:a4e,composite:oit,question:a4e,rect:sit,labelRect:lit,rectWithTitle:cit,choice:Knt,circle:hit,doublecircle:fit,stadium:uit,hexagon:Qnt,block_arrow:Znt,rect_left_inv_arrow:Jnt,lean_right:eit,lean_left:tit,trapezoid:rit,inv_trapezoid:nit,rect_right_inv_arrow:iit,cylinder:ait,start:pit,end:mit,note:r4e,subroutine:dit,fork:s4e,join:s4e,class_box:git},IC={},wz=o(async(t,e,r)=>{let n,i;if(e.link){let a;ge().securityLevel==="sandbox"?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),i=await o4e[e.shape](n,e,r)}else i=await o4e[e.shape](t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),e.class&&i.attr("class","node default "+e.class),IC[e.id]=n,e.haveCallback&&IC[e.id].attr("class",IC[e.id].attr("class")+" clickable"),n},"insertNode"),l4e=o(t=>{let e=IC[t.id];X.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});function u4e(t,e,r=!1){let n=t,i="default";(n?.classes?.length||0)>0&&(i=(n?.classes??[]).join(" ")),i=i+" flowchart-label";let a=0,s="",l;switch(n.type){case"round":a=5,s="rect";break;case"composite":a=0,s="composite",l=0;break;case"square":s="rect";break;case"diamond":s="question";break;case"hexagon":s="hexagon";break;case"block_arrow":s="block_arrow";break;case"odd":s="rect_left_inv_arrow";break;case"lean_right":s="lean_right";break;case"lean_left":s="lean_left";break;case"trapezoid":s="trapezoid";break;case"inv_trapezoid":s="inv_trapezoid";break;case"rect_left_inv_arrow":s="rect_left_inv_arrow";break;case"circle":s="circle";break;case"ellipse":s="ellipse";break;case"stadium":s="stadium";break;case"subroutine":s="subroutine";break;case"cylinder":s="cylinder";break;case"group":s="rect";break;case"doublecircle":s="doublecircle";break;default:s="rect"}let u=zL(n?.styles??[]),h=n.label,f=n.size??{width:0,height:0,x:0,y:0};return{labelStyle:u.labelStyle,shape:s,labelText:h,rx:a,ry:a,class:i,style:u.style,id:n.id,directions:n.directions,width:f.width,height:f.height,x:f.x,y:f.y,positioned:r,intersect:void 0,type:n.type,padding:l??Qt()?.block?.padding??0}}async function yit(t,e,r){let n=u4e(e,r,!1);if(n.type==="group")return;let i=Qt(),a=await wz(t,n,{config:i}),s=a.node().getBBox(),l=r.getBlock(n.id);l.size={width:s.width,height:s.height,x:0,y:0,node:a},r.setBlock(l),a.remove()}async function vit(t,e,r){let n=u4e(e,r,!0);if(r.getBlock(n.id).type!=="space"){let a=Qt();await wz(t,n,{config:a}),e.intersect=n?.intersect,l4e(n)}}async function kz(t,e,r,n){for(let i of e)await n(t,i,r),i.children&&await kz(t,i.children,r,n)}async function h4e(t,e,r){await kz(t,e,r,yit)}async function f4e(t,e,r){await kz(t,e,r,vit)}async function d4e(t,e,r,n,i){let a=new cn({multigraph:!0,compound:!0});a.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let s of r)s.size&&a.setNode(s.id,{width:s.size.width,height:s.size.height,intersect:s.intersect});for(let s of e)if(s.start&&s.end){let l=n.getBlock(s.start),u=n.getBlock(s.end);if(l?.size&&u?.size){let h=l.size,f=u.size,d=[{x:h.x,y:h.y},{x:h.x+(f.x-h.x)/2,y:h.y+(f.y-h.y)/2},{x:f.x,y:f.y}];Gbe(t,{v:s.start,w:s.end,name:s.id},{...s,arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",a,i),s.label&&(await $be(t,{...s,label:s.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),zbe({...s,x:d[1].x,y:d[1].y},{originalPath:d}))}}}var p4e=N(()=>{"use strict";qo();qn();Vbe();c4e();tr();o(u4e,"getNodeFromBlock");o(yit,"calculateBlockSize");o(vit,"insertBlockPositioned");o(kz,"performOperations");o(h4e,"calculateBlockSizes");o(f4e,"insertBlocks");o(d4e,"insertEdges")});var xit,bit,m4e,g4e=N(()=>{"use strict";yr();qn();Dbe();pt();Ei();Mbe();p4e();xit=o(function(t,e){return e.db.getClasses()},"getClasses"),bit=o(async function(t,e,r,n){let{securityLevel:i,block:a}=Qt(),s=n.db,l;i==="sandbox"&&(l=qe("#i"+e));let u=i==="sandbox"?qe(l.nodes()[0].contentDocument.body):qe("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):qe(`[id="${e}"]`);_be(h,["point","circle","cross"],n.type,e);let d=s.getBlocks(),p=s.getBlocksFlat(),m=s.getEdges(),g=h.insert("g").attr("class","block");await h4e(g,d,s);let y=Nbe(s);if(await f4e(g,d,s),await d4e(g,m,p,s,e),y){let v=y,x=Math.max(1,Math.round(.125*(v.width/v.height))),b=v.height+x+10,T=v.width+10,{useMaxWidth:S}=a;mn(h,b,T,!!S),X.debug("Here Bounds",y,v),h.attr("viewBox",`${v.x-5} ${v.y-5} ${v.width+10} ${v.height+10}`)}},"draw"),m4e={draw:bit,getClasses:xit}});var y4e={};dr(y4e,{diagram:()=>Tit});var Tit,v4e=N(()=>{"use strict";vbe();Sbe();Abe();g4e();Tit={parser:ybe,db:Ebe,renderer:m4e,styles:Cbe}});var Ez,Sz,N4,T4e,Cz,Ya,nu,M4,w4e,Sit,I4,k4e,E4e,S4e,C4e,A4e,OC,td,PC=N(()=>{"use strict";Ez={L:"left",R:"right",T:"top",B:"bottom"},Sz={L:o(t=>`${t},${t/2} 0,${t} 0,0`,"L"),R:o(t=>`0,${t/2} ${t},0 ${t},${t}`,"R"),T:o(t=>`0,0 ${t},0 ${t/2},${t}`,"T"),B:o(t=>`${t/2},0 ${t},${t} 0,${t}`,"B")},N4={L:o((t,e)=>t-e+2,"L"),R:o((t,e)=>t-2,"R"),T:o((t,e)=>t-e+2,"T"),B:o((t,e)=>t-2,"B")},T4e=o(function(t){return Ya(t)?t==="L"?"R":"L":t==="T"?"B":"T"},"getOppositeArchitectureDirection"),Cz=o(function(t){let e=t;return e==="L"||e==="R"||e==="T"||e==="B"},"isArchitectureDirection"),Ya=o(function(t){let e=t;return e==="L"||e==="R"},"isArchitectureDirectionX"),nu=o(function(t){let e=t;return e==="T"||e==="B"},"isArchitectureDirectionY"),M4=o(function(t,e){let r=Ya(t)&&nu(e),n=nu(t)&&Ya(e);return r||n},"isArchitectureDirectionXY"),w4e=o(function(t){let e=t[0],r=t[1],n=Ya(e)&&nu(r),i=nu(e)&&Ya(r);return n||i},"isArchitecturePairXY"),Sit=o(function(t){return t!=="LL"&&t!=="RR"&&t!=="TT"&&t!=="BB"},"isValidArchitectureDirectionPair"),I4=o(function(t,e){let r=`${t}${e}`;return Sit(r)?r:void 0},"getArchitectureDirectionPair"),k4e=o(function([t,e],r){let n=r[0],i=r[1];return Ya(n)?nu(i)?[t+(n==="L"?-1:1),e+(i==="T"?1:-1)]:[t+(n==="L"?-1:1),e]:Ya(i)?[t+(i==="L"?1:-1),e+(n==="T"?1:-1)]:[t,e+(n==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),E4e=o(function(t){return t==="LT"||t==="TL"?[1,1]:t==="BL"||t==="LB"?[1,-1]:t==="BR"||t==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),S4e=o(function(t,e){return M4(t,e)?"bend":Ya(t)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),C4e=o(function(t){return t.type==="service"},"isArchitectureService"),A4e=o(function(t){return t.type==="junction"},"isArchitectureJunction"),OC=o(t=>t.data(),"edgeData"),td=o(t=>t.data(),"nodeData")});var Cit,vy,Az=N(()=>{"use strict";qn();La();tr();ci();PC();Cit=ur.architecture,vy=class{constructor(){this.nodes={};this.groups={};this.edges=[];this.registeredIds={};this.elements={};this.setAccTitle=Rr;this.getAccTitle=Mr;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getAccDescription=Or;this.setAccDescription=Ir;this.clear()}static{o(this,"ArchitectureDB")}clear(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},Sr()}addService({id:e,icon:r,in:n,title:i,iconText:a}){if(this.registeredIds[e]!==void 0)throw new Error(`The service id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw new Error(`The service [${e}] cannot be placed within itself`);if(this.registeredIds[n]===void 0)throw new Error(`The service [${e}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[n]==="node")throw new Error(`The service [${e}]'s parent is not a group`)}this.registeredIds[e]="node",this.nodes[e]={id:e,type:"service",icon:r,iconText:a,title:i,edges:[],in:n}}getServices(){return Object.values(this.nodes).filter(C4e)}addJunction({id:e,in:r}){this.registeredIds[e]="node",this.nodes[e]={id:e,type:"junction",edges:[],in:r}}getJunctions(){return Object.values(this.nodes).filter(A4e)}getNodes(){return Object.values(this.nodes)}getNode(e){return this.nodes[e]??null}addGroup({id:e,icon:r,in:n,title:i}){if(this.registeredIds?.[e]!==void 0)throw new Error(`The group id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw new Error(`The group [${e}] cannot be placed within itself`);if(this.registeredIds?.[n]===void 0)throw new Error(`The group [${e}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[n]==="node")throw new Error(`The group [${e}]'s parent is not a group`)}this.registeredIds[e]="group",this.groups[e]={id:e,icon:r,title:i,in:n}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:e,rhsId:r,lhsDir:n,rhsDir:i,lhsInto:a,rhsInto:s,lhsGroup:l,rhsGroup:u,title:h}){if(!Cz(n))throw new Error(`Invalid direction given for left hand side of edge ${e}--${r}. Expected (L,R,T,B) got ${String(n)}`);if(!Cz(i))throw new Error(`Invalid direction given for right hand side of edge ${e}--${r}. Expected (L,R,T,B) got ${String(i)}`);if(this.nodes[e]===void 0&&this.groups[e]===void 0)throw new Error(`The left-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[r]===void 0&&this.groups[r]===void 0)throw new Error(`The right-hand id [${r}] does not yet exist. Please create the service/group before declaring an edge to it.`);let f=this.nodes[e].in,d=this.nodes[r].in;if(l&&f&&d&&f==d)throw new Error(`The left-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(u&&f&&d&&f==d)throw new Error(`The right-hand id [${r}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let p={lhsId:e,lhsDir:n,lhsInto:a,lhsGroup:l,rhsId:r,rhsDir:i,rhsInto:s,rhsGroup:u,title:h};this.edges.push(p),this.nodes[e]&&this.nodes[r]&&(this.nodes[e].edges.push(this.edges[this.edges.length-1]),this.nodes[r].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}getDataStructures(){if(this.dataStructures===void 0){let e={},r=Object.entries(this.nodes).reduce((u,[h,f])=>(u[h]=f.edges.reduce((d,p)=>{let m=this.getNode(p.lhsId)?.in,g=this.getNode(p.rhsId)?.in;if(m&&g&&m!==g){let y=S4e(p.lhsDir,p.rhsDir);y!=="bend"&&(e[m]??={},e[m][g]=y,e[g]??={},e[g][m]=y)}if(p.lhsId===h){let y=I4(p.lhsDir,p.rhsDir);y&&(d[y]=p.rhsId)}else{let y=I4(p.rhsDir,p.lhsDir);y&&(d[y]=p.lhsId)}return d},{}),u),{}),n=Object.keys(r)[0],i={[n]:1},a=Object.keys(r).reduce((u,h)=>h===n?u:{...u,[h]:1},{}),s=o(u=>{let h={[u]:[0,0]},f=[u];for(;f.length>0;){let d=f.shift();if(d){i[d]=1,delete a[d];let p=r[d],[m,g]=h[d];Object.entries(p).forEach(([y,v])=>{i[v]||(h[v]=k4e([m,g],y),f.push(v))})}}return h},"BFS"),l=[s(n)];for(;Object.keys(a).length>0;)l.push(s(Object.keys(a)[0]));this.dataStructures={adjList:r,spatialMaps:l,groupAlignments:e}}return this.dataStructures}setElementForId(e,r){this.elements[e]=r}getElementById(e){return this.elements[e]}getConfig(){return Vn({...Cit,...Qt().architecture})}getConfigField(e){return this.getConfig()[e]}}});var Ait,_z,_4e=N(()=>{"use strict";Uf();pt();r0();Az();Ait=o((t,e)=>{nl(t,e),t.groups.map(r=>e.addGroup(r)),t.services.map(r=>e.addService({...r,type:"service"})),t.junctions.map(r=>e.addJunction({...r,type:"junction"})),t.edges.map(r=>e.addEdge(r))},"populateDb"),_z={parser:{yy:void 0},parse:o(async t=>{let e=await bs("architecture",t);X.debug(e);let r=_z.parser?.yy;if(!(r instanceof vy))throw new Error("parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Ait(e,r)},"parse")}});var _it,D4e,L4e=N(()=>{"use strict";_it=o(t=>` + .edge { + stroke-width: ${t.archEdgeWidth}; + stroke: ${t.archEdgeColor}; + fill: none; + } + + .arrow { + fill: ${t.archEdgeArrowColor}; + } + + .node-bkg { + fill: none; + stroke: ${t.archGroupBorderColor}; + stroke-width: ${t.archGroupBorderWidth}; + stroke-dasharray: 8; + } + .node-icon-text { + display: flex; + align-items: center; + } + + .node-icon-text > div { + color: #fff; + margin: 1px; + height: fit-content; + text-align: center; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + } +`,"getStyles"),D4e=_it});var Lz=Da((O4,Dz)=>{"use strict";o((function(e,r){typeof O4=="object"&&typeof Dz=="object"?Dz.exports=r():typeof define=="function"&&define.amd?define([],r):typeof O4=="object"?O4.layoutBase=r():e.layoutBase=r()}),"webpackUniversalModuleDefinition")(O4,function(){return(function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=28)})([(function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s}),(function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(5);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp?(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(p+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(m+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>m?(this.rect.y-=(this.labelHeight-m)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(m+this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h}),(function(t,e,r){"use strict";var n=r(0);function i(){}o(i,"FDLayoutConstants");for(var a in n)i[a]=n[a];i.MAX_ITERATIONS=2500,i.DEFAULT_EDGE_LENGTH=50,i.DEFAULT_SPRING_STRENGTH=.45,i.DEFAULT_REPULSION_STRENGTH=4500,i.DEFAULT_GRAVITY_STRENGTH=.4,i.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,i.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,i.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,i.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,i.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,i.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,i.COOLING_ADAPTATION_FACTOR=.33,i.ADAPTATION_LOWER_NODE_LIMIT=1e3,i.ADAPTATION_UPPER_NODE_LIMIT=5e3,i.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,i.MAX_NODE_DISPLACEMENT=i.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,i.MIN_REPULSION_DIST=i.DEFAULT_EDGE_LENGTH/10,i.CONVERGENCE_CHECK_PERIOD=100,i.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,i.MIN_EDGE_LENGTH=1,i.GRID_CALCULATION_CHECK_PERIOD=10,t.exports=i}),(function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(7),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,T=0;T-1&&k>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(w,1),x.target!=x.source&&x.target.edges.splice(k,1);var S=x.source.owner.getEdges().indexOf(x);if(S==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(S,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,T=this.getNodes(),S=T.length,w=0;wv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?b=T[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,T,S,w,k,A,C=this.nodes,R=C.length,I=0;IT&&(y=T),vw&&(x=w),bT&&(y=T),vw&&(x=w),b=this.nodes.length){var R=0;v.forEach(function(I){I.owner==g&&R++}),R==this.nodes.length&&(this.isConnected=!0)}},t.exports=p}),(function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(6),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=C,!1;if(hf)return l[0]=p,l[1]=h,l[2]=k,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,E=!0):(l[0]=g,l[1]=m,E=!0):_===M&&(u>f?(l[0]=p,l[1]=m,E=!0):(l[0]=x,l[1]=v,E=!0)),-O===M?f>u?(l[2]=A,l[3]=C,D=!0):(l[2]=k,l[3]=w,D=!0):O===M&&(f>u?(l[2]=S,l[3]=w,D=!0):(l[2]=R,l[3]=C,D=!0)),E&&D)return!1;if(u>f?h>d?(P=this.getCardinalDirection(_,M,4),B=this.getCardinalDirection(O,M,2)):(P=this.getCardinalDirection(-_,M,3),B=this.getCardinalDirection(-O,M,1)):h>d?(P=this.getCardinalDirection(-_,M,1),B=this.getCardinalDirection(-O,M,3)):(P=this.getCardinalDirection(_,M,2),B=this.getCardinalDirection(O,M,4)),!E)switch(P){case 1:G=m,F=u+-T/M,l[0]=F,l[1]=G;break;case 2:F=x,G=h+b*M,l[0]=F,l[1]=G;break;case 3:G=v,F=u+T/M,l[0]=F,l[1]=G;break;case 4:F=y,G=h+-b*M,l[0]=F,l[1]=G;break}if(!D)switch(B){case 1:U=w,$=f+-L/M,l[2]=$,l[3]=U;break;case 2:$=R,U=d+I*M,l[2]=$,l[3]=U;break;case 3:U=C,$=f+L/M,l[2]=$,l[3]=U;break;case 4:$=A,U=d+-I*M,l[2]=$,l[3]=U;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,T=void 0,S=void 0,w=void 0,k=void 0,A=void 0,C=void 0,R=void 0;return T=p-f,w=h-d,A=d*f-h*p,S=v-g,k=m-y,C=y*g-m*v,R=T*k-S*w,R===0?null:(x=(w*C-k*A)/R,b=(S*A-T*C)/R,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l=0){var v=(-m+Math.sqrt(m*m-4*p*g))/(2*p),x=(-m-Math.sqrt(m*m-4*p*g))/(2*p),b=null;return v>=0&&v<=1?[v]:x>=0&&x<=1?[x]:b}else return null},i.HALF_PI=.5*Math.PI,i.ONE_AND_HALF_PI=1.5*Math.PI,i.TWO_PI=2*Math.PI,i.THREE_PI=3*Math.PI,t.exports=i}),(function(t,e,r){"use strict";function n(){}o(n,"IMath"),n.sign=function(i){return i>0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n}),(function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n}),(function(t,e,r){"use strict";var n=(function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i}),(function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(T.push(w[0]);T.length>0&&g;){var k=T[0];T.splice(0,1),b.add(k);for(var A=k.getEdges(),x=0;x-1&&w.splice(L,1)}b=new Set,S=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(C,1);var R=S.getNeighborsList();R.forEach(function(E){if(y.indexOf(E)<0){var D=v.get(E),_=D-1;_==1&&k.push(E),v.set(E,_)}})}y=y.concat(k),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p}),(function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n}),(function(t,e,r){"use strict";var n=r(5);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i}),(function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mT||b>T)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(T=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>T||b>T)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||T>=x[0].length)){for(var S=0;Sh},"_defaultCompareFunction")}]),l})();t.exports=s}),(function(t,e,r){"use strict";function n(){}o(n,"SVD"),n.svd=function(i){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=i.length,this.n=i[0].length;var a=Math.min(this.m,this.n);this.s=(function(dt){for(var nt=[];dt-- >0;)nt.push(0);return nt})(Math.min(this.m+1,this.n)),this.U=(function(dt){var nt=o(function bt(wt){if(wt.length==0)return 0;for(var yt=[],ft=0;ft0;)nt.push(0);return nt})(this.n),l=(function(dt){for(var nt=[];dt-- >0;)nt.push(0);return nt})(this.m),u=!0,h=!0,f=Math.min(this.m-1,this.n),d=Math.max(0,Math.min(this.n-2,this.m)),p=0;p=0;M--)if(this.s[M]!==0){for(var P=M+1;P=0;te--){if((function(dt,nt){return dt&&nt})(te0;){var Q=void 0,de=void 0;for(Q=D-2;Q>=-1&&Q!==-1;Q--)if(Math.abs(s[Q])<=ae+K*(Math.abs(this.s[Q])+Math.abs(this.s[Q+1]))){s[Q]=0;break}if(Q===D-2)de=4;else{var ne=void 0;for(ne=D-1;ne>=Q&&ne!==Q;ne--){var Te=(ne!==D?Math.abs(s[ne]):0)+(ne!==Q+1?Math.abs(s[ne-1]):0);if(Math.abs(this.s[ne])<=ae+K*Te){this.s[ne]=0;break}}ne===Q?de=3:ne===D-1?de=1:(de=2,Q=ne)}switch(Q++,de){case 1:{var q=s[D-2];s[D-2]=0;for(var Ve=D-2;Ve>=Q;Ve--){var pe=n.hypot(this.s[Ve],q),Be=this.s[Ve]/pe,Ye=q/pe;if(this.s[Ve]=pe,Ve!==Q&&(q=-Ye*s[Ve-1],s[Ve-1]=Be*s[Ve-1]),h)for(var He=0;He=this.s[Q+1]);){var lt=this.s[Q];if(this.s[Q]=this.s[Q+1],this.s[Q+1]=lt,h&&QMath.abs(a)?(s=a/i,s=Math.abs(i)*Math.sqrt(1+s*s)):a!=0?(s=i/a,s=Math.abs(a)*Math.sqrt(1+s*s)):s=0,s},t.exports=n}),(function(t,e,r){"use strict";var n=(function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o((function(e,r){typeof P4=="object"&&typeof Rz=="object"?Rz.exports=r(Lz()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof P4=="object"?P4.coseBase=r(Lz()):e.coseBase=r(e.layoutBase)}),"webpackUniversalModuleDefinition")(P4,function(t){return(()=>{"use strict";var e={45:((a,s,l)=>{var u={};u.layoutBase=l(551),u.CoSEConstants=l(806),u.CoSEEdge=l(767),u.CoSEGraph=l(880),u.CoSEGraphManager=l(578),u.CoSELayout=l(765),u.CoSENode=l(991),u.ConstraintHandler=l(902),a.exports=u}),806:((a,s,l)=>{var u=l(551).FDLayoutConstants;function h(){}o(h,"CoSEConstants");for(var f in u)h[f]=u[f];h.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,h.DEFAULT_RADIAL_SEPARATION=u.DEFAULT_EDGE_LENGTH,h.DEFAULT_COMPONENT_SEPERATION=60,h.TILE=!0,h.TILING_PADDING_VERTICAL=10,h.TILING_PADDING_HORIZONTAL=10,h.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,h.ENFORCE_CONSTRAINTS=!0,h.APPLY_LAYOUT=!0,h.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,h.TREE_REDUCTION_ON_INCREMENTAL=!0,h.PURE_INCREMENTAL=h.DEFAULT_INCREMENTAL,a.exports=h}),767:((a,s,l)=>{var u=l(551).FDLayoutEdge;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEEdge"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h}),880:((a,s,l)=>{var u=l(551).LGraph;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEGraph"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h}),578:((a,s,l)=>{var u=l(551).LGraphManager;function h(d){u.call(this,d)}o(h,"CoSEGraphManager"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h}),765:((a,s,l)=>{var u=l(551).FDLayout,h=l(578),f=l(880),d=l(991),p=l(767),m=l(806),g=l(902),y=l(551).FDLayoutConstants,v=l(551).LayoutConstants,x=l(551).Point,b=l(551).PointD,T=l(551).DimensionD,S=l(551).Layout,w=l(551).Integer,k=l(551).IGeometry,A=l(551).LGraph,C=l(551).Transform,R=l(551).LinkedList;function I(){u.call(this),this.toBeTiled={},this.constraints={}}o(I,"CoSELayout"),I.prototype=Object.create(u.prototype);for(var L in u)I[L]=u[L];I.prototype.newGraphManager=function(){var E=new h(this);return this.graphManager=E,E},I.prototype.newGraph=function(E){return new f(null,this.graphManager,E)},I.prototype.newNode=function(E){return new d(this.graphManager,E)},I.prototype.newEdge=function(E){return new p(null,null,E)},I.prototype.initParameters=function(){u.prototype.initParameters.call(this,arguments),this.isSubLayout||(m.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=m.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=m.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=y.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=y.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=y.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},I.prototype.initSpringEmbedder=function(){u.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/y.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},I.prototype.layout=function(){var E=v.DEFAULT_CREATE_BENDS_AS_NEEDED;return E&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},I.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(m.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var D=new Set(this.getAllNodes()),_=this.nodesWithGravity.filter(function(P){return D.has(P)});this.graphManager.setAllNodesToApplyGravitation(_)}}else{var E=this.getFlatForest();if(E.length>0)this.positionNodesRadially(E);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var D=new Set(this.getAllNodes()),_=this.nodesWithGravity.filter(function(O){return D.has(O)});this.graphManager.setAllNodesToApplyGravitation(_),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(g.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),m.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},I.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%y.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var E=new Set(this.getAllNodes()),D=this.nodesWithGravity.filter(function(M){return E.has(M)});this.graphManager.setAllNodesToApplyGravitation(D),this.graphManager.updateBounds(),this.updateGrid(),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var _=!this.isTreeGrowing&&!this.isGrowthFinished,O=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(_,O),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},I.prototype.getPositionsData=function(){for(var E=this.graphManager.getAllNodes(),D={},_=0;_0&&this.updateDisplacements();for(var _=0;_0&&(O.fixedNodeWeight=P)}}if(this.constraints.relativePlacementConstraint){var B=new Map,F=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(J){E.fixedNodesOnHorizontal.add(J),E.fixedNodesOnVertical.add(J)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var G=this.constraints.alignmentConstraint.vertical,_=0;_=2*J.length/3;ee--)ue=Math.floor(Math.random()*(ee+1)),re=J[ee],J[ee]=J[ue],J[ue]=re;return J},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(J){if(J.left){var ue=B.has(J.left)?B.get(J.left):J.left,re=B.has(J.right)?B.get(J.right):J.right;E.nodesInRelativeHorizontal.includes(ue)||(E.nodesInRelativeHorizontal.push(ue),E.nodeToRelativeConstraintMapHorizontal.set(ue,[]),E.dummyToNodeForVerticalAlignment.has(ue)?E.nodeToTempPositionMapHorizontal.set(ue,E.idToNodeMap.get(E.dummyToNodeForVerticalAlignment.get(ue)[0]).getCenterX()):E.nodeToTempPositionMapHorizontal.set(ue,E.idToNodeMap.get(ue).getCenterX())),E.nodesInRelativeHorizontal.includes(re)||(E.nodesInRelativeHorizontal.push(re),E.nodeToRelativeConstraintMapHorizontal.set(re,[]),E.dummyToNodeForVerticalAlignment.has(re)?E.nodeToTempPositionMapHorizontal.set(re,E.idToNodeMap.get(E.dummyToNodeForVerticalAlignment.get(re)[0]).getCenterX()):E.nodeToTempPositionMapHorizontal.set(re,E.idToNodeMap.get(re).getCenterX())),E.nodeToRelativeConstraintMapHorizontal.get(ue).push({right:re,gap:J.gap}),E.nodeToRelativeConstraintMapHorizontal.get(re).push({left:ue,gap:J.gap})}else{var ee=F.has(J.top)?F.get(J.top):J.top,Z=F.has(J.bottom)?F.get(J.bottom):J.bottom;E.nodesInRelativeVertical.includes(ee)||(E.nodesInRelativeVertical.push(ee),E.nodeToRelativeConstraintMapVertical.set(ee,[]),E.dummyToNodeForHorizontalAlignment.has(ee)?E.nodeToTempPositionMapVertical.set(ee,E.idToNodeMap.get(E.dummyToNodeForHorizontalAlignment.get(ee)[0]).getCenterY()):E.nodeToTempPositionMapVertical.set(ee,E.idToNodeMap.get(ee).getCenterY())),E.nodesInRelativeVertical.includes(Z)||(E.nodesInRelativeVertical.push(Z),E.nodeToRelativeConstraintMapVertical.set(Z,[]),E.dummyToNodeForHorizontalAlignment.has(Z)?E.nodeToTempPositionMapVertical.set(Z,E.idToNodeMap.get(E.dummyToNodeForHorizontalAlignment.get(Z)[0]).getCenterY()):E.nodeToTempPositionMapVertical.set(Z,E.idToNodeMap.get(Z).getCenterY())),E.nodeToRelativeConstraintMapVertical.get(ee).push({bottom:Z,gap:J.gap}),E.nodeToRelativeConstraintMapVertical.get(Z).push({top:ee,gap:J.gap})}});else{var U=new Map,j=new Map;this.constraints.relativePlacementConstraint.forEach(function(J){if(J.left){var ue=B.has(J.left)?B.get(J.left):J.left,re=B.has(J.right)?B.get(J.right):J.right;U.has(ue)?U.get(ue).push(re):U.set(ue,[re]),U.has(re)?U.get(re).push(ue):U.set(re,[ue])}else{var ee=F.has(J.top)?F.get(J.top):J.top,Z=F.has(J.bottom)?F.get(J.bottom):J.bottom;j.has(ee)?j.get(ee).push(Z):j.set(ee,[Z]),j.has(Z)?j.get(Z).push(ee):j.set(Z,[ee])}});var te=o(function(ue,re){var ee=[],Z=[],K=new R,ae=new Set,Q=0;return ue.forEach(function(de,ne){if(!ae.has(ne)){ee[Q]=[],Z[Q]=!1;var Te=ne;for(K.push(Te),ae.add(Te),ee[Q].push(Te);K.length!=0;){Te=K.shift(),re.has(Te)&&(Z[Q]=!0);var q=ue.get(Te);q.forEach(function(Ve){ae.has(Ve)||(K.push(Ve),ae.add(Ve),ee[Q].push(Ve))})}Q++}}),{components:ee,isFixed:Z}},"constructComponents"),Y=te(U,E.fixedNodesOnHorizontal);this.componentsOnHorizontal=Y.components,this.fixedComponentsOnHorizontal=Y.isFixed;var oe=te(j,E.fixedNodesOnVertical);this.componentsOnVertical=oe.components,this.fixedComponentsOnVertical=oe.isFixed}}},I.prototype.updateDisplacements=function(){var E=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(oe){var J=E.idToNodeMap.get(oe.nodeId);J.displacementX=0,J.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var D=this.constraints.alignmentConstraint.vertical,_=0;_1){var F;for(F=0;FO&&(O=Math.floor(B.y)),P=Math.floor(B.x+m.DEFAULT_COMPONENT_SEPERATION)}this.transform(new b(v.WORLD_CENTER_X-B.x/2,v.WORLD_CENTER_Y-B.y/2))},I.radialLayout=function(E,D,_){var O=Math.max(this.maxDiagonalInTree(E),m.DEFAULT_RADIAL_SEPARATION);I.branchRadialLayout(D,null,0,359,0,O);var M=A.calculateBounds(E),P=new C;P.setDeviceOrgX(M.getMinX()),P.setDeviceOrgY(M.getMinY()),P.setWorldOrgX(_.x),P.setWorldOrgY(_.y);for(var B=0;B1;){var ee=re[0];re.splice(0,1);var Z=te.indexOf(ee);Z>=0&&te.splice(Z,1),J--,Y--}D!=null?ue=(te.indexOf(re[0])+1)%J:ue=0;for(var K=Math.abs(O-_)/Y,ae=ue;oe!=Y;ae=++ae%J){var Q=te[ae].getOtherEnd(E);if(Q!=D){var de=(_+oe*K)%360,ne=(de+K)%360;I.branchRadialLayout(Q,E,de,ne,M+P,P),oe++}}},I.maxDiagonalInTree=function(E){for(var D=w.MIN_VALUE,_=0;_D&&(D=M)}return D},I.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},I.prototype.groupZeroDegreeMembers=function(){var E=this,D={};this.memberGroups={},this.idToDummyNode={};for(var _=[],O=this.graphManager.getAllNodes(),M=0;M"u"&&(D[F]=[]),D[F]=D[F].concat(P)}Object.keys(D).forEach(function(G){if(D[G].length>1){var $="DummyCompound_"+G;E.memberGroups[$]=D[G];var U=D[G][0].getParent(),j=new d(E.graphManager);j.id=$,j.paddingLeft=U.paddingLeft||0,j.paddingRight=U.paddingRight||0,j.paddingBottom=U.paddingBottom||0,j.paddingTop=U.paddingTop||0,E.idToDummyNode[$]=j;var te=E.getGraphManager().add(E.newGraph(),j),Y=U.getChild();Y.add(j);for(var oe=0;oeM?(O.rect.x-=(O.labelWidth-M)/2,O.setWidth(O.labelWidth),O.labelMarginLeft=(O.labelWidth-M)/2):O.labelPosHorizontal=="right"&&O.setWidth(M+O.labelWidth)),O.labelHeight&&(O.labelPosVertical=="top"?(O.rect.y-=O.labelHeight,O.setHeight(P+O.labelHeight),O.labelMarginTop=O.labelHeight):O.labelPosVertical=="center"&&O.labelHeight>P?(O.rect.y-=(O.labelHeight-P)/2,O.setHeight(O.labelHeight),O.labelMarginTop=(O.labelHeight-P)/2):O.labelPosVertical=="bottom"&&O.setHeight(P+O.labelHeight))}})},I.prototype.repopulateCompounds=function(){for(var E=this.compoundOrder.length-1;E>=0;E--){var D=this.compoundOrder[E],_=D.id,O=D.paddingLeft,M=D.paddingTop,P=D.labelMarginLeft,B=D.labelMarginTop;this.adjustLocations(this.tiledMemberPack[_],D.rect.x,D.rect.y,O,M,P,B)}},I.prototype.repopulateZeroDegreeMembers=function(){var E=this,D=this.tiledZeroDegreePack;Object.keys(D).forEach(function(_){var O=E.idToDummyNode[_],M=O.paddingLeft,P=O.paddingTop,B=O.labelMarginLeft,F=O.labelMarginTop;E.adjustLocations(D[_],O.rect.x,O.rect.y,M,P,B,F)})},I.prototype.getToBeTiled=function(E){var D=E.id;if(this.toBeTiled[D]!=null)return this.toBeTiled[D];var _=E.getChild();if(_==null)return this.toBeTiled[D]=!1,!1;for(var O=_.getNodes(),M=0;M0)return this.toBeTiled[D]=!1,!1;if(P.getChild()==null){this.toBeTiled[P.id]=!1;continue}if(!this.getToBeTiled(P))return this.toBeTiled[D]=!1,!1}return this.toBeTiled[D]=!0,!0},I.prototype.getNodeDegree=function(E){for(var D=E.id,_=E.getEdges(),O=0,M=0;M<_.length;M++){var P=_[M];P.getSource().id!==P.getTarget().id&&(O=O+1)}return O},I.prototype.getNodeDegreeWithChildren=function(E){var D=this.getNodeDegree(E);if(E.getChild()==null)return D;for(var _=E.getChild().getNodes(),O=0;O<_.length;O++){var M=_[O];D+=this.getNodeDegreeWithChildren(M)}return D},I.prototype.performDFSOnCompounds=function(){this.compoundOrder=[],this.fillCompexOrderByDFS(this.graphManager.getRoot().getNodes())},I.prototype.fillCompexOrderByDFS=function(E){for(var D=0;DU&&(U=te.rect.height)}_+=U+E.verticalPadding}},I.prototype.tileCompoundMembers=function(E,D){var _=this;this.tiledMemberPack=[],Object.keys(E).forEach(function(O){var M=D[O];if(_.tiledMemberPack[O]=_.tileNodes(E[O],M.paddingLeft+M.paddingRight),M.rect.width=_.tiledMemberPack[O].width,M.rect.height=_.tiledMemberPack[O].height,M.setCenter(_.tiledMemberPack[O].centerX,_.tiledMemberPack[O].centerY),M.labelMarginLeft=0,M.labelMarginTop=0,m.NODE_DIMENSIONS_INCLUDE_LABELS){var P=M.rect.width,B=M.rect.height;M.labelWidth&&(M.labelPosHorizontal=="left"?(M.rect.x-=M.labelWidth,M.setWidth(P+M.labelWidth),M.labelMarginLeft=M.labelWidth):M.labelPosHorizontal=="center"&&M.labelWidth>P?(M.rect.x-=(M.labelWidth-P)/2,M.setWidth(M.labelWidth),M.labelMarginLeft=(M.labelWidth-P)/2):M.labelPosHorizontal=="right"&&M.setWidth(P+M.labelWidth)),M.labelHeight&&(M.labelPosVertical=="top"?(M.rect.y-=M.labelHeight,M.setHeight(B+M.labelHeight),M.labelMarginTop=M.labelHeight):M.labelPosVertical=="center"&&M.labelHeight>B?(M.rect.y-=(M.labelHeight-B)/2,M.setHeight(M.labelHeight),M.labelMarginTop=(M.labelHeight-B)/2):M.labelPosVertical=="bottom"&&M.setHeight(B+M.labelHeight))}})},I.prototype.tileNodes=function(E,D){var _=this.tileNodesByFavoringDim(E,D,!0),O=this.tileNodesByFavoringDim(E,D,!1),M=this.getOrgRatio(_),P=this.getOrgRatio(O),B;return PF&&(F=oe.getWidth())});var G=P/M,$=B/M,U=Math.pow(_-O,2)+4*(G+O)*($+_)*M,j=(O-_+Math.sqrt(U))/(2*(G+O)),te;D?(te=Math.ceil(j),te==j&&te++):te=Math.floor(j);var Y=te*(G+O)-O;return F>Y&&(Y=F),Y+=O*2,Y},I.prototype.tileNodesByFavoringDim=function(E,D,_){var O=m.TILING_PADDING_VERTICAL,M=m.TILING_PADDING_HORIZONTAL,P=m.TILING_COMPARE_BY,B={rows:[],rowWidth:[],rowHeight:[],width:0,height:D,verticalPadding:O,horizontalPadding:M,centerX:0,centerY:0};P&&(B.idealRowWidth=this.calcIdealRowWidth(E,_));var F=o(function(J){return J.rect.width*J.rect.height},"getNodeArea"),G=o(function(J,ue){return F(ue)-F(J)},"areaCompareFcn");E.sort(function(oe,J){var ue=G;return B.idealRowWidth?(ue=P,ue(oe.id,J.id)):ue(oe,J)});for(var $=0,U=0,j=0;j0&&(B+=E.horizontalPadding),E.rowWidth[_]=B,E.width0&&(F+=E.verticalPadding);var G=0;F>E.rowHeight[_]&&(G=E.rowHeight[_],E.rowHeight[_]=F,G=E.rowHeight[_]-G),E.height+=G,E.rows[_].push(D)},I.prototype.getShortestRowIndex=function(E){for(var D=-1,_=Number.MAX_VALUE,O=0;O_&&(D=O,_=E.rowWidth[O]);return D},I.prototype.canAddHorizontal=function(E,D,_){if(E.idealRowWidth){var O=E.rows.length-1,M=E.rowWidth[O];return M+D+E.horizontalPadding<=E.idealRowWidth}var P=this.getShortestRowIndex(E);if(P<0)return!0;var B=E.rowWidth[P];if(B+E.horizontalPadding+D<=E.width)return!0;var F=0;E.rowHeight[P]<_&&P>0&&(F=_+E.verticalPadding-E.rowHeight[P]);var G;E.width-B>=D+E.horizontalPadding?G=(E.height+F)/(B+D+E.horizontalPadding):G=(E.height+F)/E.width,F=_+E.verticalPadding;var $;return E.widthP&&D!=_){O.splice(-1,1),E.rows[_].push(M),E.rowWidth[D]=E.rowWidth[D]-P,E.rowWidth[_]=E.rowWidth[_]+P,E.width=E.rowWidth[instance.getLongestRowIndex(E)];for(var B=Number.MIN_VALUE,F=0;FB&&(B=O[F].height);D>0&&(B+=E.verticalPadding);var G=E.rowHeight[D]+E.rowHeight[_];E.rowHeight[D]=B,E.rowHeight[_]0)for(var Y=M;Y<=P;Y++)te[0]+=this.grid[Y][B-1].length+this.grid[Y][B].length-1;if(P0)for(var Y=B;Y<=F;Y++)te[3]+=this.grid[M-1][Y].length+this.grid[M][Y].length-1;for(var oe=w.MAX_VALUE,J,ue,re=0;re{var u=l(551).FDLayoutNode,h=l(551).IMath;function f(p,m,g,y){u.call(this,p,m,g,y)}o(f,"CoSENode"),f.prototype=Object.create(u.prototype);for(var d in u)f[d]=u[d];f.prototype.calculateDisplacement=function(){var p=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementX=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementX)),Math.abs(this.displacementY)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementY=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},f.prototype.propogateDisplacementToChildren=function(p,m){for(var g=this.getChild().getNodes(),y,v=0;v{function u(g){if(Array.isArray(g)){for(var y=0,v=Array(g.length);y0){var et=0;Oe.forEach(function(lt){he=="horizontal"?(ye.set(lt,x.has(lt)?b[x.get(lt)]:se.get(lt)),et+=ye.get(lt)):(ye.set(lt,x.has(lt)?T[x.get(lt)]:se.get(lt)),et+=ye.get(lt))}),et=et/Oe.length,We.forEach(function(lt){z.has(lt)||ye.set(lt,et)})}else{var Ue=0;We.forEach(function(lt){he=="horizontal"?Ue+=x.has(lt)?b[x.get(lt)]:se.get(lt):Ue+=x.has(lt)?T[x.get(lt)]:se.get(lt)}),Ue=Ue/We.length,We.forEach(function(lt){ye.set(lt,Ue)})}});for(var ze=o(function(){var Oe=_e.shift(),et=W.get(Oe);et.forEach(function(Ue){if(ye.get(Ue.id)lt&&(lt=yt),ftGt&&(Gt=ft)}}catch(Ct){Lt=!0,dt=Ct}finally{try{!vt&&nt.return&&nt.return()}finally{if(Lt)throw dt}}var Ur=(et+lt)/2-(Ue+Gt)/2,_t=!0,bn=!1,Br=void 0;try{for(var cr=We[Symbol.iterator](),ar;!(_t=(ar=cr.next()).done);_t=!0){var _r=ar.value;ye.set(_r,ye.get(_r)+Ur)}}catch(Ct){bn=!0,Br=Ct}finally{try{!_t&&cr.return&&cr.return()}finally{if(bn)throw Br}}})}return ye},"findAppropriatePositionForRelativePlacement"),L=o(function(W){var he=0,z=0,se=0,le=0;if(W.forEach(function(Re){Re.left?b[x.get(Re.left)]-b[x.get(Re.right)]>=0?he++:z++:T[x.get(Re.top)]-T[x.get(Re.bottom)]>=0?se++:le++}),he>z&&se>le)for(var ke=0;kez)for(var ve=0;vele)for(var ye=0;ye1)y.fixedNodeConstraint.forEach(function(xe,W){O[W]=[xe.position.x,xe.position.y],M[W]=[b[x.get(xe.nodeId)],T[x.get(xe.nodeId)]]}),P=!0;else if(y.alignmentConstraint)(function(){var xe=0;if(y.alignmentConstraint.vertical){for(var W=y.alignmentConstraint.vertical,he=o(function(ye){var Re=new Set;W[ye].forEach(function(Ke){Re.add(Ke)});var _e=new Set([].concat(u(Re)).filter(function(Ke){return F.has(Ke)})),ze=void 0;_e.size>0?ze=b[x.get(_e.values().next().value)]:ze=R(Re).x,W[ye].forEach(function(Ke){O[xe]=[ze,T[x.get(Ke)]],M[xe]=[b[x.get(Ke)],T[x.get(Ke)]],xe++})},"_loop2"),z=0;z0?ze=b[x.get(_e.values().next().value)]:ze=R(Re).y,se[ye].forEach(function(Ke){O[xe]=[b[x.get(Ke)],ze],M[xe]=[b[x.get(Ke)],T[x.get(Ke)]],xe++})},"_loop3"),ke=0;kej&&(j=U[Y].length,te=Y);if(j<$.size/2)L(y.relativePlacementConstraint),P=!1,B=!1;else{var oe=new Map,J=new Map,ue=[];U[te].forEach(function(xe){G.get(xe).forEach(function(W){W.direction=="horizontal"?(oe.has(xe)?oe.get(xe).push(W):oe.set(xe,[W]),oe.has(W.id)||oe.set(W.id,[]),ue.push({left:xe,right:W.id})):(J.has(xe)?J.get(xe).push(W):J.set(xe,[W]),J.has(W.id)||J.set(W.id,[]),ue.push({top:xe,bottom:W.id}))})}),L(ue),B=!1;var re=I(oe,"horizontal"),ee=I(J,"vertical");U[te].forEach(function(xe,W){M[W]=[b[x.get(xe)],T[x.get(xe)]],O[W]=[],re.has(xe)?O[W][0]=re.get(xe):O[W][0]=b[x.get(xe)],ee.has(xe)?O[W][1]=ee.get(xe):O[W][1]=T[x.get(xe)]}),P=!0}}if(P){for(var Z=void 0,K=d.transpose(O),ae=d.transpose(M),Q=0;Q0){var Be={x:0,y:0};y.fixedNodeConstraint.forEach(function(xe,W){var he={x:b[x.get(xe.nodeId)],y:T[x.get(xe.nodeId)]},z=xe.position,se=C(z,he);Be.x+=se.x,Be.y+=se.y}),Be.x/=y.fixedNodeConstraint.length,Be.y/=y.fixedNodeConstraint.length,b.forEach(function(xe,W){b[W]+=Be.x}),T.forEach(function(xe,W){T[W]+=Be.y}),y.fixedNodeConstraint.forEach(function(xe){b[x.get(xe.nodeId)]=xe.position.x,T[x.get(xe.nodeId)]=xe.position.y})}if(y.alignmentConstraint){if(y.alignmentConstraint.vertical)for(var Ye=y.alignmentConstraint.vertical,He=o(function(W){var he=new Set;Ye[W].forEach(function(le){he.add(le)});var z=new Set([].concat(u(he)).filter(function(le){return F.has(le)})),se=void 0;z.size>0?se=b[x.get(z.values().next().value)]:se=R(he).x,he.forEach(function(le){F.has(le)||(b[x.get(le)]=se)})},"_loop4"),Le=0;Le0?se=T[x.get(z.values().next().value)]:se=R(he).y,he.forEach(function(le){F.has(le)||(T[x.get(le)]=se)})},"_loop5"),Ce=0;Ce{a.exports=t})},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(45);return i})()})});var R4e=Da((B4,Mz)=>{"use strict";o((function(e,r){typeof B4=="object"&&typeof Mz=="object"?Mz.exports=r(Nz()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof B4=="object"?B4.cytoscapeFcose=r(Nz()):e.cytoscapeFcose=r(e.coseBase)}),"webpackUniversalModuleDefinition")(B4,function(t){return(()=>{"use strict";var e={658:(a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(s){for(var l=arguments.length,u=Array(l>1?l-1:0),h=1;h{var u=(function(){function d(p,m){var g=[],y=!0,v=!1,x=void 0;try{for(var b=p[Symbol.iterator](),T;!(y=(T=b.next()).done)&&(g.push(T.value),!(m&&g.length===m));y=!0);}catch(S){v=!0,x=S}finally{try{!y&&b.return&&b.return()}finally{if(v)throw x}}return g}return o(d,"sliceIterator"),function(p,m){if(Array.isArray(p))return p;if(Symbol.iterator in Object(p))return d(p,m);throw new TypeError("Invalid attempt to destructure non-iterable instance")}})(),h=l(140).layoutBase.LinkedList,f={};f.getTopMostNodes=function(d){for(var p={},m=0;m0&&P.merge($)});for(var B=0;B1){T=x[0],S=T.connectedEdges().length,x.forEach(function(M){M.connectedEdges().length0&&g.set("dummy"+(g.size+1),A),C},f.relocateComponent=function(d,p,m){if(!m.fixedNodeConstraint){var g=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY,v=Number.POSITIVE_INFINITY,x=Number.NEGATIVE_INFINITY;if(m.quality=="draft"){var b=!0,T=!1,S=void 0;try{for(var w=p.nodeIndexes[Symbol.iterator](),k;!(b=(k=w.next()).done);b=!0){var A=k.value,C=u(A,2),R=C[0],I=C[1],L=m.cy.getElementById(R);if(L){var E=L.boundingBox(),D=p.xCoords[I]-E.w/2,_=p.xCoords[I]+E.w/2,O=p.yCoords[I]-E.h/2,M=p.yCoords[I]+E.h/2;Dy&&(y=_),Ox&&(x=M)}}}catch($){T=!0,S=$}finally{try{!b&&w.return&&w.return()}finally{if(T)throw S}}var P=d.x-(y+g)/2,B=d.y-(x+v)/2;p.xCoords=p.xCoords.map(function($){return $+P}),p.yCoords=p.yCoords.map(function($){return $+B})}else{Object.keys(p).forEach(function($){var U=p[$],j=U.getRect().x,te=U.getRect().x+U.getRect().width,Y=U.getRect().y,oe=U.getRect().y+U.getRect().height;jy&&(y=te),Yx&&(x=oe)});var F=d.x-(y+g)/2,G=d.y-(x+v)/2;Object.keys(p).forEach(function($){var U=p[$];U.setCenter(U.getCenterX()+F,U.getCenterY()+G)})}}},f.calcBoundingBox=function(d,p,m,g){for(var y=Number.MAX_SAFE_INTEGER,v=Number.MIN_SAFE_INTEGER,x=Number.MAX_SAFE_INTEGER,b=Number.MIN_SAFE_INTEGER,T=void 0,S=void 0,w=void 0,k=void 0,A=d.descendants().not(":parent"),C=A.length,R=0;RT&&(y=T),vw&&(x=w),b{var u=l(548),h=l(140).CoSELayout,f=l(140).CoSENode,d=l(140).layoutBase.PointD,p=l(140).layoutBase.DimensionD,m=l(140).layoutBase.LayoutConstants,g=l(140).layoutBase.FDLayoutConstants,y=l(140).CoSEConstants,v=o(function(b,T){var S=b.cy,w=b.eles,k=w.nodes(),A=w.edges(),C=void 0,R=void 0,I=void 0,L={};b.randomize&&(C=T.nodeIndexes,R=T.xCoords,I=T.yCoords);var E=o(function($){return typeof $=="function"},"isFn"),D=o(function($,U){return E($)?$(U):$},"optFn"),_=u.calcParentsWithoutChildren(S,w),O=o(function G($,U,j,te){for(var Y=U.length,oe=0;oe0){var K=void 0;K=j.getGraphManager().add(j.newGraph(),re),G(K,ue,j,te)}}},"processChildrenList"),M=o(function($,U,j){for(var te=0,Y=0,oe=0;oe0?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=te/Y:E(b.idealEdgeLength)?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=50:y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=b.idealEdgeLength,y.MIN_REPULSION_DIST=g.MIN_REPULSION_DIST=g.DEFAULT_EDGE_LENGTH/10,y.DEFAULT_RADIAL_SEPARATION=g.DEFAULT_EDGE_LENGTH)},"processEdges"),P=o(function($,U){U.fixedNodeConstraint&&($.constraints.fixedNodeConstraint=U.fixedNodeConstraint),U.alignmentConstraint&&($.constraints.alignmentConstraint=U.alignmentConstraint),U.relativePlacementConstraint&&($.constraints.relativePlacementConstraint=U.relativePlacementConstraint)},"processConstraints");b.nestingFactor!=null&&(y.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=g.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=b.nestingFactor),b.gravity!=null&&(y.DEFAULT_GRAVITY_STRENGTH=g.DEFAULT_GRAVITY_STRENGTH=b.gravity),b.numIter!=null&&(y.MAX_ITERATIONS=g.MAX_ITERATIONS=b.numIter),b.gravityRange!=null&&(y.DEFAULT_GRAVITY_RANGE_FACTOR=g.DEFAULT_GRAVITY_RANGE_FACTOR=b.gravityRange),b.gravityCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_STRENGTH=g.DEFAULT_COMPOUND_GRAVITY_STRENGTH=b.gravityCompound),b.gravityRangeCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=g.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=b.gravityRangeCompound),b.initialEnergyOnIncremental!=null&&(y.DEFAULT_COOLING_FACTOR_INCREMENTAL=g.DEFAULT_COOLING_FACTOR_INCREMENTAL=b.initialEnergyOnIncremental),b.tilingCompareBy!=null&&(y.TILING_COMPARE_BY=b.tilingCompareBy),b.quality=="proof"?m.QUALITY=2:m.QUALITY=0,y.NODE_DIMENSIONS_INCLUDE_LABELS=g.NODE_DIMENSIONS_INCLUDE_LABELS=m.NODE_DIMENSIONS_INCLUDE_LABELS=b.nodeDimensionsIncludeLabels,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!b.randomize,y.ANIMATE=g.ANIMATE=m.ANIMATE=b.animate,y.TILE=b.tile,y.TILING_PADDING_VERTICAL=typeof b.tilingPaddingVertical=="function"?b.tilingPaddingVertical.call():b.tilingPaddingVertical,y.TILING_PADDING_HORIZONTAL=typeof b.tilingPaddingHorizontal=="function"?b.tilingPaddingHorizontal.call():b.tilingPaddingHorizontal,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!0,y.PURE_INCREMENTAL=!b.randomize,m.DEFAULT_UNIFORM_LEAF_NODE_SIZES=b.uniformNodeDimensions,b.step=="transformed"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!1),b.step=="enforced"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!1),b.step=="cose"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!0),b.step=="all"&&(b.randomize?y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!0),b.fixedNodeConstraint||b.alignmentConstraint||b.relativePlacementConstraint?y.TREE_REDUCTION_ON_INCREMENTAL=!1:y.TREE_REDUCTION_ON_INCREMENTAL=!0;var B=new h,F=B.newGraphManager();return O(F.addRoot(),u.getTopMostNodes(k),B,b),M(B,F,A),P(B,b),B.runLayout(),L},"coseLayout");a.exports={coseLayout:v}}),212:((a,s,l)=>{var u=(function(){function b(T,S){for(var w=0;w0)if(M){var F=d.getTopMostNodes(w.eles.nodes());if(E=d.connectComponents(k,w.eles,F),E.forEach(function(Te){var q=Te.boundingBox();D.push({x:q.x1+q.w/2,y:q.y1+q.h/2})}),w.randomize&&E.forEach(function(Te){w.eles=Te,C.push(m(w))}),w.quality=="default"||w.quality=="proof"){var G=k.collection();if(w.tile){var $=new Map,U=[],j=[],te=0,Y={nodeIndexes:$,xCoords:U,yCoords:j},oe=[];if(E.forEach(function(Te,q){Te.edges().length==0&&(Te.nodes().forEach(function(Ve,pe){G.merge(Te.nodes()[pe]),Ve.isParent()||(Y.nodeIndexes.set(Te.nodes()[pe].id(),te++),Y.xCoords.push(Te.nodes()[0].position().x),Y.yCoords.push(Te.nodes()[0].position().y))}),oe.push(q))}),G.length>1){var J=G.boundingBox();D.push({x:J.x1+J.w/2,y:J.y1+J.h/2}),E.push(G),C.push(Y);for(var ue=oe.length-1;ue>=0;ue--)E.splice(oe[ue],1),C.splice(oe[ue],1),D.splice(oe[ue],1)}}E.forEach(function(Te,q){w.eles=Te,L.push(y(w,C[q])),d.relocateComponent(D[q],L[q],w)})}else E.forEach(function(Te,q){d.relocateComponent(D[q],C[q],w)});var re=new Set;if(E.length>1){var ee=[],Z=A.filter(function(Te){return Te.css("display")=="none"});E.forEach(function(Te,q){var Ve=void 0;if(w.quality=="draft"&&(Ve=C[q].nodeIndexes),Te.nodes().not(Z).length>0){var pe={};pe.edges=[],pe.nodes=[];var Be=void 0;Te.nodes().not(Z).forEach(function(Ye){if(w.quality=="draft")if(!Ye.isParent())Be=Ve.get(Ye.id()),pe.nodes.push({x:C[q].xCoords[Be]-Ye.boundingbox().w/2,y:C[q].yCoords[Be]-Ye.boundingbox().h/2,width:Ye.boundingbox().w,height:Ye.boundingbox().h});else{var He=d.calcBoundingBox(Ye,C[q].xCoords,C[q].yCoords,Ve);pe.nodes.push({x:He.topLeftX,y:He.topLeftY,width:He.width,height:He.height})}else L[q][Ye.id()]&&pe.nodes.push({x:L[q][Ye.id()].getLeft(),y:L[q][Ye.id()].getTop(),width:L[q][Ye.id()].getWidth(),height:L[q][Ye.id()].getHeight()})}),Te.edges().forEach(function(Ye){var He=Ye.source(),Le=Ye.target();if(He.css("display")!="none"&&Le.css("display")!="none")if(w.quality=="draft"){var Ie=Ve.get(He.id()),Ne=Ve.get(Le.id()),Ce=[],Fe=[];if(He.isParent()){var fe=d.calcBoundingBox(He,C[q].xCoords,C[q].yCoords,Ve);Ce.push(fe.topLeftX+fe.width/2),Ce.push(fe.topLeftY+fe.height/2)}else Ce.push(C[q].xCoords[Ie]),Ce.push(C[q].yCoords[Ie]);if(Le.isParent()){var xe=d.calcBoundingBox(Le,C[q].xCoords,C[q].yCoords,Ve);Fe.push(xe.topLeftX+xe.width/2),Fe.push(xe.topLeftY+xe.height/2)}else Fe.push(C[q].xCoords[Ne]),Fe.push(C[q].yCoords[Ne]);pe.edges.push({startX:Ce[0],startY:Ce[1],endX:Fe[0],endY:Fe[1]})}else L[q][He.id()]&&L[q][Le.id()]&&pe.edges.push({startX:L[q][He.id()].getCenterX(),startY:L[q][He.id()].getCenterY(),endX:L[q][Le.id()].getCenterX(),endY:L[q][Le.id()].getCenterY()})}),pe.nodes.length>0&&(ee.push(pe),re.add(q))}});var K=O.packComponents(ee,w.randomize).shifts;if(w.quality=="draft")C.forEach(function(Te,q){var Ve=Te.xCoords.map(function(Be){return Be+K[q].dx}),pe=Te.yCoords.map(function(Be){return Be+K[q].dy});Te.xCoords=Ve,Te.yCoords=pe});else{var ae=0;re.forEach(function(Te){Object.keys(L[Te]).forEach(function(q){var Ve=L[Te][q];Ve.setCenter(Ve.getCenterX()+K[ae].dx,Ve.getCenterY()+K[ae].dy)}),ae++})}}}else{var P=w.eles.boundingBox();if(D.push({x:P.x1+P.w/2,y:P.y1+P.h/2}),w.randomize){var B=m(w);C.push(B)}w.quality=="default"||w.quality=="proof"?(L.push(y(w,C[0])),d.relocateComponent(D[0],L[0],w)):d.relocateComponent(D[0],C[0],w)}var Q=o(function(q,Ve){if(w.quality=="default"||w.quality=="proof"){typeof q=="number"&&(q=Ve);var pe=void 0,Be=void 0,Ye=q.data("id");return L.forEach(function(Le){Ye in Le&&(pe={x:Le[Ye].getRect().getCenterX(),y:Le[Ye].getRect().getCenterY()},Be=Le[Ye])}),w.nodeDimensionsIncludeLabels&&(Be.labelWidth&&(Be.labelPosHorizontal=="left"?pe.x+=Be.labelWidth/2:Be.labelPosHorizontal=="right"&&(pe.x-=Be.labelWidth/2)),Be.labelHeight&&(Be.labelPosVertical=="top"?pe.y+=Be.labelHeight/2:Be.labelPosVertical=="bottom"&&(pe.y-=Be.labelHeight/2))),pe==null&&(pe={x:q.position("x"),y:q.position("y")}),{x:pe.x,y:pe.y}}else{var He=void 0;return C.forEach(function(Le){var Ie=Le.nodeIndexes.get(q.id());Ie!=null&&(He={x:Le.xCoords[Ie],y:Le.yCoords[Ie]})}),He==null&&(He={x:q.position("x"),y:q.position("y")}),{x:He.x,y:He.y}}},"getPositions");if(w.quality=="default"||w.quality=="proof"||w.randomize){var de=d.calcParentsWithoutChildren(k,A),ne=A.filter(function(Te){return Te.css("display")=="none"});w.eles=A.not(ne),A.nodes().not(":parent").not(ne).layoutPositions(S,w,Q),de.length>0&&de.forEach(function(Te){Te.position(Q(Te))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")},"run")}]),b})();a.exports=x}),657:((a,s,l)=>{var u=l(548),h=l(140).layoutBase.Matrix,f=l(140).layoutBase.SVD,d=o(function(m){var g=m.cy,y=m.eles,v=y.nodes(),x=y.nodes(":parent"),b=new Map,T=new Map,S=new Map,w=[],k=[],A=[],C=[],R=[],I=[],L=[],E=[],D=void 0,_=void 0,O=1e8,M=1e-9,P=m.piTol,B=m.samplingType,F=m.nodeSeparation,G=void 0,$=o(function(){for(var he=0,z=0,se=!1;z=ke;){ye=le[ke++];for(var We=w[ye],Oe=0;Oeze&&(ze=R[Ue],Ke=Ue)}return Ke},"BFS"),j=o(function(he){var z=void 0;if(he){z=Math.floor(Math.random()*_),D=z;for(var le=0;le<_;le++)R[le]=O;for(var ke=0;ke=1)break;ze=_e}for(var We=0;We<_;We++)ke[We]=se[We];for(Re=0,ze=M;;){Re++;for(var Oe=0;Oe<_;Oe++)ve[Oe]=le[Oe];if(ve=h.minusOp(ve,h.multCons(ke,h.dotProduct(ke,ve))),le=h.multGamma(h.multL(h.multGamma(ve),I,E)),z=h.dotProduct(ve,le),le=h.normalize(le),_e=h.dotProduct(ve,le),Ke=Math.abs(_e/ze),Ke<=1+P&&Ke>=1)break;ze=_e}for(var et=0;et<_;et++)ve[et]=le[et];k=h.multCons(ke,Math.sqrt(Math.abs(he))),A=h.multCons(ve,Math.sqrt(Math.abs(z)))},"powerIteration");u.connectComponents(g,y,u.getTopMostNodes(v),b),x.forEach(function(W){u.connectComponents(g,y,u.getTopMostNodes(W.descendants().intersection(y)),b)});for(var oe=0,J=0;J0&&(z.isParent()?w[he].push(S.get(z.id())):w[he].push(z.id()))})});var de=o(function(he){var z=T.get(he),se=void 0;b.get(he).forEach(function(le){g.getElementById(le).isParent()?se=S.get(le):se=le,w[z].push(se),w[T.get(se)].push(he)})},"_loop"),ne=!0,Te=!1,q=void 0;try{for(var Ve=b.keys()[Symbol.iterator](),pe;!(ne=(pe=Ve.next()).done);ne=!0){var Be=pe.value;de(Be)}}catch(W){Te=!0,q=W}finally{try{!ne&&Ve.return&&Ve.return()}finally{if(Te)throw q}}_=T.size;var Ye=void 0;if(_>2){G=_{var u=l(212),h=o(function(d){d&&d("layout","fcose",u)},"register");typeof cytoscape<"u"&&h(cytoscape),a.exports=h}),140:(a=>{a.exports=t})},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(579);return i})()})});var xy,m0,Iz=N(()=>{"use strict";nc();xy=o(t=>`${t}`,"wrapIcon"),m0={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:xy('')},server:{body:xy('')},disk:{body:xy('')},internet:{body:xy('')},cloud:{body:xy('')},unknown:AA,blank:{body:xy("")}}}});var N4e,M4e,I4e,O4e,P4e=N(()=>{"use strict";Xt();zo();nc();gr();Iz();PC();tr();N4e=o(async function(t,e,r){let n=r.getConfigField("padding"),i=r.getConfigField("iconSize"),a=i/2,s=i/6,l=s/2;await Promise.all(e.edges().map(async u=>{let{source:h,sourceDir:f,sourceArrow:d,sourceGroup:p,target:m,targetDir:g,targetArrow:y,targetGroup:v,label:x}=OC(u),{x:b,y:T}=u[0].sourceEndpoint(),{x:S,y:w}=u[0].midpoint(),{x:k,y:A}=u[0].targetEndpoint(),C=n+4;if(p&&(Ya(f)?b+=f==="L"?-C:C:T+=f==="T"?-C:C+18),v&&(Ya(g)?k+=g==="L"?-C:C:A+=g==="T"?-C:C+18),!p&&r.getNode(h)?.type==="junction"&&(Ya(f)?b+=f==="L"?a:-a:T+=f==="T"?a:-a),!v&&r.getNode(m)?.type==="junction"&&(Ya(g)?k+=g==="L"?a:-a:A+=g==="T"?a:-a),u[0]._private.rscratch){let R=t.insert("g");if(R.insert("path").attr("d",`M ${b},${T} L ${S},${w} L${k},${A} `).attr("class","edge").attr("id",xc(h,m,{prefix:"L"})),d){let I=Ya(f)?N4[f](b,s):b-l,L=nu(f)?N4[f](T,s):T-l;R.insert("polygon").attr("points",Sz[f](s)).attr("transform",`translate(${I},${L})`).attr("class","arrow")}if(y){let I=Ya(g)?N4[g](k,s):k-l,L=nu(g)?N4[g](A,s):A-l;R.insert("polygon").attr("points",Sz[g](s)).attr("transform",`translate(${I},${L})`).attr("class","arrow")}if(x){let I=M4(f,g)?"XY":Ya(f)?"X":"Y",L=0;I==="X"?L=Math.abs(b-k):I==="Y"?L=Math.abs(T-A)/1.5:L=Math.abs(b-k)/2;let E=R.append("g");if(await di(E,x,{useHtmlLabels:!1,width:L,classes:"architecture-service-label"},ge()),E.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),I==="X")E.attr("transform","translate("+S+", "+w+")");else if(I==="Y")E.attr("transform","translate("+S+", "+w+") rotate(-90)");else if(I==="XY"){let D=I4(f,g);if(D&&w4e(D)){let _=E.node().getBoundingClientRect(),[O,M]=E4e(D);E.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*O*M*45})`);let P=E.node().getBoundingClientRect();E.attr("transform",` + translate(${S}, ${w-_.height/2}) + translate(${O*P.width/2}, ${M*P.height/2}) + rotate(${-1*O*M*45}, 0, ${_.height/2}) + `)}}}}}))},"drawEdges"),M4e=o(async function(t,e,r){let i=r.getConfigField("padding")*.75,a=r.getConfigField("fontSize"),l=r.getConfigField("iconSize")/2;await Promise.all(e.nodes().map(async u=>{let h=td(u);if(h.type==="group"){let{h:f,w:d,x1:p,y1:m}=u.boundingBox(),g=t.append("rect");g.attr("id",`group-${h.id}`).attr("x",p+l).attr("y",m+l).attr("width",d).attr("height",f).attr("class","node-bkg");let y=t.append("g"),v=p,x=m;if(h.icon){let b=y.append("g");b.html(`${await _s(h.icon,{height:i,width:i,fallbackPrefix:m0.prefix})}`),b.attr("transform","translate("+(v+l+1)+", "+(x+l+1)+")"),v+=i,x+=a/2-1-2}if(h.label){let b=y.append("g");await di(b,h.label,{useHtmlLabels:!1,width:d,classes:"architecture-service-label"},ge()),b.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),b.attr("transform","translate("+(v+l+4)+", "+(x+l+2)+")")}r.setElementForId(h.id,g)}}))},"drawGroups"),I4e=o(async function(t,e,r){let n=ge();for(let i of r){let a=e.append("g"),s=t.getConfigField("iconSize");if(i.title){let f=a.append("g");await di(f,i.title,{useHtmlLabels:!1,width:s*1.5,classes:"architecture-service-label"},n),f.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),f.attr("transform","translate("+s/2+", "+s+")")}let l=a.append("g");if(i.icon)l.html(`${await _s(i.icon,{height:s,width:s,fallbackPrefix:m0.prefix})}`);else if(i.iconText){l.html(`${await _s("blank",{height:s,width:s,fallbackPrefix:m0.prefix})}`);let p=l.append("g").append("foreignObject").attr("width",s).attr("height",s).append("div").attr("class","node-icon-text").attr("style",`height: ${s}px;`).append("div").html(sr(i.iconText,n)),m=parseInt(window.getComputedStyle(p.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;p.attr("style",`-webkit-line-clamp: ${Math.floor((s-2)/m)};`)}else l.append("path").attr("class","node-bkg").attr("id","node-"+i.id).attr("d",`M0 ${s} v${-s} q0,-5 5,-5 h${s} q5,0 5,5 v${s} H0 Z`);a.attr("id",`service-${i.id}`).attr("class","architecture-service");let{width:u,height:h}=a.node().getBBox();i.width=u,i.height=h,t.setElementForId(i.id,a)}return 0},"drawServices"),O4e=o(function(t,e,r){r.forEach(n=>{let i=e.append("g"),a=t.getConfigField("iconSize");i.append("g").append("rect").attr("id","node-"+n.id).attr("fill-opacity","0").attr("width",a).attr("height",a),i.attr("class","architecture-junction");let{width:l,height:u}=i._groups[0][0].getBBox();i.width=l,i.height=u,t.setElementForId(n.id,i)})},"drawJunctions")});function Dit(t,e,r){t.forEach(n=>{e.add({group:"nodes",data:{type:"service",id:n.id,icon:n.icon,label:n.title,parent:n.in,width:r.getConfigField("iconSize"),height:r.getConfigField("iconSize")},classes:"node-service"})})}function Lit(t,e,r){t.forEach(n=>{e.add({group:"nodes",data:{type:"junction",id:n.id,parent:n.in,width:r.getConfigField("iconSize"),height:r.getConfigField("iconSize")},classes:"node-junction"})})}function Rit(t,e){e.nodes().map(r=>{let n=td(r);if(n.type==="group")return;n.x=r.position().x,n.y=r.position().y,t.getElementById(n.id).attr("transform","translate("+(n.x||0)+","+(n.y||0)+")")})}function Nit(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"group",id:r.id,icon:r.icon,label:r.title,parent:r.in},classes:"node-group"})})}function Mit(t,e){t.forEach(r=>{let{lhsId:n,rhsId:i,lhsInto:a,lhsGroup:s,rhsInto:l,lhsDir:u,rhsDir:h,rhsGroup:f,title:d}=r,p=M4(r.lhsDir,r.rhsDir)?"segments":"straight",m={id:`${n}-${i}`,label:d,source:n,sourceDir:u,sourceArrow:a,sourceGroup:s,sourceEndpoint:u==="L"?"0 50%":u==="R"?"100% 50%":u==="T"?"50% 0":"50% 100%",target:i,targetDir:h,targetArrow:l,targetGroup:f,targetEndpoint:h==="L"?"0 50%":h==="R"?"100% 50%":h==="T"?"50% 0":"50% 100%"};e.add({group:"edges",data:m,classes:p})})}function Iit(t,e,r){let n=o((l,u)=>Object.entries(l).reduce((h,[f,d])=>{let p=0,m=Object.entries(d);if(m.length===1)return h[f]=m[0][1],h;for(let g=0;g{let u={},h={};return Object.entries(l).forEach(([f,[d,p]])=>{let m=t.getNode(f)?.in??"default";u[p]??={},u[p][m]??=[],u[p][m].push(f),h[d]??={},h[d][m]??=[],h[d][m].push(f)}),{horiz:Object.values(n(u,"horizontal")).filter(f=>f.length>1),vert:Object.values(n(h,"vertical")).filter(f=>f.length>1)}}),[a,s]=i.reduce(([l,u],{horiz:h,vert:f})=>[[...l,...h],[...u,...f]],[[],[]]);return{horizontal:a,vertical:s}}function Oit(t,e){let r=[],n=o(a=>`${a[0]},${a[1]}`,"posToStr"),i=o(a=>a.split(",").map(s=>parseInt(s)),"strToPos");return t.forEach(a=>{let s=Object.fromEntries(Object.entries(a).map(([f,d])=>[n(d),f])),l=[n([0,0])],u={},h={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;l.length>0;){let f=l.shift();if(f){u[f]=1;let d=s[f];if(d){let p=i(f);Object.entries(h).forEach(([m,g])=>{let y=n([p[0]+g[0],p[1]+g[1]]),v=s[y];v&&!u[y]&&(l.push(y),r.push({[Ez[m]]:v,[Ez[T4e(m)]]:d,gap:1.5*e.getConfigField("iconSize")}))})}}}}),r}function Pit(t,e,r,n,i,{spatialMaps:a,groupAlignments:s}){return new Promise(l=>{let u=qe("body").append("div").attr("id","cy").attr("style","display:none"),h=Ko({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${i.getConfigField("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${i.getConfigField("padding")}px`}}],layout:{name:"grid",boundingBox:{x1:0,x2:100,y1:0,y2:100}}});u.remove(),Nit(r,h),Dit(t,h,i),Lit(e,h,i),Mit(n,h);let f=Iit(i,a,s),d=Oit(a,i),p=h.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(m){let[g,y]=m.connectedNodes(),{parent:v}=td(g),{parent:x}=td(y);return v===x?1.5*i.getConfigField("iconSize"):.5*i.getConfigField("iconSize")},edgeElasticity(m){let[g,y]=m.connectedNodes(),{parent:v}=td(g),{parent:x}=td(y);return v===x?.45:.001},alignmentConstraint:f,relativePlacementConstraint:d});p.one("layoutstop",()=>{function m(g,y,v,x){let b,T,{x:S,y:w}=g,{x:k,y:A}=y;T=(x-w+(S-v)*(w-A)/(S-k))/Math.sqrt(1+Math.pow((w-A)/(S-k),2)),b=Math.sqrt(Math.pow(x-w,2)+Math.pow(v-S,2)-Math.pow(T,2));let C=Math.sqrt(Math.pow(k-S,2)+Math.pow(A-w,2));b=b/C;let R=(k-S)*(x-w)-(A-w)*(v-S);switch(!0){case R>=0:R=1;break;case R<0:R=-1;break}let I=(k-S)*(v-S)+(A-w)*(x-w);switch(!0){case I>=0:I=1;break;case I<0:I=-1;break}return T=Math.abs(T)*R,b=b*I,{distances:T,weights:b}}o(m,"getSegmentWeights"),h.startBatch();for(let g of Object.values(h.edges()))if(g.data?.()){let{x:y,y:v}=g.source().position(),{x,y:b}=g.target().position();if(y!==x&&v!==b){let T=g.sourceEndpoint(),S=g.targetEndpoint(),{sourceDir:w}=OC(g),[k,A]=nu(w)?[T.x,S.y]:[S.x,T.y],{weights:C,distances:R}=m(T,S,k,A);g.style("segment-distances",R),g.style("segment-weights",C)}}h.endBatch(),p.run()}),p.run(),h.ready(m=>{X.info("Ready",m),l(h)})})}var B4e,Bit,F4e,$4e=N(()=>{"use strict";II();B4e=ja(R4e(),1);yr();pt();nc();tu();Ei();Iz();PC();P4e();O3([{name:m0.prefix,icons:m0}]);Ko.use(B4e.default);o(Dit,"addServices");o(Lit,"addJunctions");o(Rit,"positionNodes");o(Nit,"addGroups");o(Mit,"addEdges");o(Iit,"getAlignments");o(Oit,"getRelativeConstraints");o(Pit,"layoutArchitecture");Bit=o(async(t,e,r,n)=>{let i=n.db,a=i.getServices(),s=i.getJunctions(),l=i.getGroups(),u=i.getEdges(),h=i.getDataStructures(),f=aa(e),d=f.append("g");d.attr("class","architecture-edges");let p=f.append("g");p.attr("class","architecture-services");let m=f.append("g");m.attr("class","architecture-groups"),await I4e(i,p,a),O4e(i,p,s);let g=await Pit(a,s,l,u,i,h);await N4e(d,g,i),await M4e(m,g,i),Rit(i,g),ic(void 0,f,i.getConfigField("padding"),i.getConfigField("useMaxWidth"))},"draw"),F4e={draw:Bit}});var z4e={};dr(z4e,{diagram:()=>Fit});var Fit,G4e=N(()=>{"use strict";_4e();Az();L4e();$4e();Fit={parser:_z,get db(){return new vy},renderer:F4e,styles:D4e}});var by,Oz=N(()=>{"use strict";La();qn();tr();$t();ci();by=class{constructor(){this.nodes=[];this.levels=new Map;this.outerNodes=[];this.classes=new Map;this.setAccTitle=Rr;this.getAccTitle=Mr;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getAccDescription=Or;this.setAccDescription=Ir}static{o(this,"TreeMapDB")}getNodes(){return this.nodes}getConfig(){let e=ur,r=Qt();return Vn({...e.treemap,...r.treemap??{}})}addNode(e,r){this.nodes.push(e),this.levels.set(e,r),r===0&&(this.outerNodes.push(e),this.root??=e)}getRoot(){return{name:"",children:this.outerNodes}}addClass(e,r){let n=this.classes.get(e)??{id:e,styles:[],textStyles:[]},i=r.replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");i&&i.forEach(a=>{_2(a)&&(n?.textStyles?n.textStyles.push(a):n.textStyles=[a]),n?.styles?n.styles.push(a):n.styles=[a]}),this.classes.set(e,n)}getClasses(){return this.classes}getStylesForClass(e){return this.classes.get(e)?.styles??[]}clear(){Sr(),this.nodes=[],this.levels=new Map,this.outerNodes=[],this.classes=new Map,this.root=void 0}}});function H4e(t){if(!t.length)return[];let e=[],r=[];return t.forEach(n=>{let i={name:n.name,children:n.type==="Leaf"?void 0:[]};for(i.classSelector=n?.classSelector,n?.cssCompiledStyles&&(i.cssCompiledStyles=[n.cssCompiledStyles]),n.type==="Leaf"&&n.value!==void 0&&(i.value=n.value);r.length>0&&r[r.length-1].level>=n.level;)r.pop();if(r.length===0)e.push(i);else{let a=r[r.length-1].node;a.children?a.children.push(i):a.children=[i]}n.type!=="Leaf"&&r.push({node:i,level:n.level})}),e}var q4e=N(()=>{"use strict";o(H4e,"buildHierarchy")});var Vit,Uit,Pz,W4e=N(()=>{"use strict";Uf();pt();r0();q4e();Oz();Vit=o((t,e)=>{nl(t,e);let r=[];for(let a of t.TreemapRows??[])a.$type==="ClassDefStatement"&&e.addClass(a.className??"",a.styleText??"");for(let a of t.TreemapRows??[]){let s=a.item;if(!s)continue;let l=a.indent?parseInt(a.indent):0,u=Uit(s),h=s.classSelector?e.getStylesForClass(s.classSelector):[],f=h.length>0?h.join(";"):void 0,d={level:l,name:u,type:s.$type,value:s.value,classSelector:s.classSelector,cssCompiledStyles:f};r.push(d)}let n=H4e(r),i=o((a,s)=>{for(let l of a)e.addNode(l,s),l.children&&l.children.length>0&&i(l.children,s+1)},"addNodesRecursively");i(n,0)},"populate"),Uit=o(t=>t.name?String(t.name):"","getItemName"),Pz={parser:{yy:void 0},parse:o(async t=>{try{let r=await bs("treemap",t);X.debug("Treemap AST:",r);let n=Pz.parser?.yy;if(!(n instanceof by))throw new Error("parser.parser?.yy was not a TreemapDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Vit(r,n)}catch(e){throw X.error("Error parsing treemap:",e),e}},"parse")}});var Hit,Ty,F4,qit,Wit,Y4e,X4e=N(()=>{"use strict";tu();Mf();Ei();yr();$t();qn();pt();Hit=10,Ty=10,F4=25,qit=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),s=a.padding??Hit,l=i.getDiagramTitle(),u=i.getRoot(),{themeVariables:h}=Qt();if(!u)return;let f=l?30:0,d=aa(e),p=a.nodeWidth?a.nodeWidth*Ty:960,m=a.nodeHeight?a.nodeHeight*Ty:500,g=p,y=m+f;d.attr("viewBox",`0 0 ${g} ${y}`),mn(d,y,g,a.useMaxWidth);let v;try{let _=a.valueFormat||",";if(_==="$0,0")v=o(O=>"$"+cc(",")(O),"valueFormat");else if(_.startsWith("$")&&_.includes(",")){let O=/\.\d+/.exec(_),M=O?O[0]:"";v=o(P=>"$"+cc(","+M)(P),"valueFormat")}else if(_.startsWith("$")){let O=_.substring(1);v=o(M=>"$"+cc(O||"")(M),"valueFormat")}else v=cc(_)}catch(_){X.error("Error creating format function:",_),v=cc(",")}let x=no().range(["transparent",h.cScale0,h.cScale1,h.cScale2,h.cScale3,h.cScale4,h.cScale5,h.cScale6,h.cScale7,h.cScale8,h.cScale9,h.cScale10,h.cScale11]),b=no().range(["transparent",h.cScalePeer0,h.cScalePeer1,h.cScalePeer2,h.cScalePeer3,h.cScalePeer4,h.cScalePeer5,h.cScalePeer6,h.cScalePeer7,h.cScalePeer8,h.cScalePeer9,h.cScalePeer10,h.cScalePeer11]),T=no().range([h.cScaleLabel0,h.cScaleLabel1,h.cScaleLabel2,h.cScaleLabel3,h.cScaleLabel4,h.cScaleLabel5,h.cScaleLabel6,h.cScaleLabel7,h.cScaleLabel8,h.cScaleLabel9,h.cScaleLabel10,h.cScaleLabel11]);l&&d.append("text").attr("x",g/2).attr("y",f/2).attr("class","treemapTitle").attr("text-anchor","middle").attr("dominant-baseline","middle").text(l);let S=d.append("g").attr("transform",`translate(0, ${f})`).attr("class","treemapContainer"),w=U0(u).sum(_=>_.value??0).sort((_,O)=>(O.value??0)-(_.value??0)),A=R5().size([p,m]).paddingTop(_=>_.children&&_.children.length>0?F4+Ty:0).paddingInner(s).paddingLeft(_=>_.children&&_.children.length>0?Ty:0).paddingRight(_=>_.children&&_.children.length>0?Ty:0).paddingBottom(_=>_.children&&_.children.length>0?Ty:0).round(!0)(w),C=A.descendants().filter(_=>_.children&&_.children.length>0),R=S.selectAll(".treemapSection").data(C).enter().append("g").attr("class","treemapSection").attr("transform",_=>`translate(${_.x0},${_.y0})`);R.append("rect").attr("width",_=>_.x1-_.x0).attr("height",F4).attr("class","treemapSectionHeader").attr("fill","none").attr("fill-opacity",.6).attr("stroke-width",.6).attr("style",_=>_.depth===0?"display: none;":""),R.append("clipPath").attr("id",(_,O)=>`clip-section-${e}-${O}`).append("rect").attr("width",_=>Math.max(0,_.x1-_.x0-12)).attr("height",F4),R.append("rect").attr("width",_=>_.x1-_.x0).attr("height",_=>_.y1-_.y0).attr("class",(_,O)=>`treemapSection section${O}`).attr("fill",_=>x(_.data.name)).attr("fill-opacity",.6).attr("stroke",_=>b(_.data.name)).attr("stroke-width",2).attr("stroke-opacity",.4).attr("style",_=>{if(_.depth===0)return"display: none;";let O=je({cssCompiledStyles:_.data.cssCompiledStyles});return O.nodeStyles+";"+O.borderStyles.join(";")}),R.append("text").attr("class","treemapSectionLabel").attr("x",6).attr("y",F4/2).attr("dominant-baseline","middle").text(_=>_.depth===0?"":_.data.name).attr("font-weight","bold").attr("style",_=>{if(_.depth===0)return"display: none;";let O="dominant-baseline: middle; font-size: 12px; fill:"+T(_.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",M=je({cssCompiledStyles:_.data.cssCompiledStyles});return O+M.labelStyles.replace("color:","fill:")}).each(function(_){if(_.depth===0)return;let O=qe(this),M=_.data.name;O.text(M);let P=_.x1-_.x0,B=6,F;a.showValues!==!1&&_.value?F=P-10-30-10-B:F=P-B-6;let $=Math.max(15,F),U=O.node();if(U.getComputedTextLength()>$){let Y=M;for(;Y.length>0;){if(Y=M.substring(0,Y.length-1),Y.length===0){O.text("..."),U.getComputedTextLength()>$&&O.text("");break}if(O.text(Y+"..."),U.getComputedTextLength()<=$)break}}}),a.showValues!==!1&&R.append("text").attr("class","treemapSectionValue").attr("x",_=>_.x1-_.x0-10).attr("y",F4/2).attr("text-anchor","end").attr("dominant-baseline","middle").text(_=>_.value?v(_.value):"").attr("font-style","italic").attr("style",_=>{if(_.depth===0)return"display: none;";let O="text-anchor: end; dominant-baseline: middle; font-size: 10px; fill:"+T(_.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",M=je({cssCompiledStyles:_.data.cssCompiledStyles});return O+M.labelStyles.replace("color:","fill:")});let I=A.leaves(),L=S.selectAll(".treemapLeafGroup").data(I).enter().append("g").attr("class",(_,O)=>`treemapNode treemapLeafGroup leaf${O}${_.data.classSelector?` ${_.data.classSelector}`:""}x`).attr("transform",_=>`translate(${_.x0},${_.y0})`);L.append("rect").attr("width",_=>_.x1-_.x0).attr("height",_=>_.y1-_.y0).attr("class","treemapLeaf").attr("fill",_=>_.parent?x(_.parent.data.name):x(_.data.name)).attr("style",_=>je({cssCompiledStyles:_.data.cssCompiledStyles}).nodeStyles).attr("fill-opacity",.3).attr("stroke",_=>_.parent?x(_.parent.data.name):x(_.data.name)).attr("stroke-width",3),L.append("clipPath").attr("id",(_,O)=>`clip-${e}-${O}`).append("rect").attr("width",_=>Math.max(0,_.x1-_.x0-4)).attr("height",_=>Math.max(0,_.y1-_.y0-4)),L.append("text").attr("class","treemapLabel").attr("x",_=>(_.x1-_.x0)/2).attr("y",_=>(_.y1-_.y0)/2).attr("style",_=>{let O="text-anchor: middle; dominant-baseline: middle; font-size: 38px;fill:"+T(_.data.name)+";",M=je({cssCompiledStyles:_.data.cssCompiledStyles});return O+M.labelStyles.replace("color:","fill:")}).attr("clip-path",(_,O)=>`url(#clip-${e}-${O})`).text(_=>_.data.name).each(function(_){let O=qe(this),M=_.x1-_.x0,P=_.y1-_.y0,B=O.node(),F=4,G=M-2*F,$=P-2*F;if(G<10||$<10){O.style("display","none");return}let U=parseInt(O.style("font-size"),10),j=8,te=28,Y=.6,oe=6,J=2;for(;B.getComputedTextLength()>G&&U>j;)U--,O.style("font-size",`${U}px`);let ue=Math.max(oe,Math.min(te,Math.round(U*Y))),re=U+J+ue;for(;re>$&&U>j&&(U--,ue=Math.max(oe,Math.min(te,Math.round(U*Y))),!(ue$;O.style("font-size",`${U}px`),(B.getComputedTextLength()>G||U(O.x1-O.x0)/2).attr("y",function(O){return(O.y1-O.y0)/2}).attr("style",O=>{let M="text-anchor: middle; dominant-baseline: hanging; font-size: 28px;fill:"+T(O.data.name)+";",P=je({cssCompiledStyles:O.data.cssCompiledStyles});return M+P.labelStyles.replace("color:","fill:")}).attr("clip-path",(O,M)=>`url(#clip-${e}-${M})`).text(O=>O.value?v(O.value):"").each(function(O){let M=qe(this),P=this.parentNode;if(!P){M.style("display","none");return}let B=qe(P).select(".treemapLabel");if(B.empty()||B.style("display")==="none"){M.style("display","none");return}let F=parseFloat(B.style("font-size")),G=28,$=.6,U=6,j=2,te=Math.max(U,Math.min(G,Math.round(F*$)));M.style("font-size",`${te}px`);let oe=(O.y1-O.y0)/2+F/2+j;M.attr("y",oe);let J=O.x1-O.x0,ee=O.y1-O.y0-4,Z=J-8;M.node().getComputedTextLength()>Z||oe+te>ee||te{"use strict";tr();Yit={sectionStrokeColor:"black",sectionStrokeWidth:"1",sectionFillColor:"#efefef",leafStrokeColor:"black",leafStrokeWidth:"1",leafFillColor:"#efefef",labelColor:"black",labelFontSize:"12px",valueFontSize:"10px",valueColor:"black",titleColor:"black",titleFontSize:"14px"},Xit=o(({treemap:t}={})=>{let e=Vn(Yit,t);return` + .treemapNode.section { + stroke: ${e.sectionStrokeColor}; + stroke-width: ${e.sectionStrokeWidth}; + fill: ${e.sectionFillColor}; + } + .treemapNode.leaf { + stroke: ${e.leafStrokeColor}; + stroke-width: ${e.leafStrokeWidth}; + fill: ${e.leafFillColor}; + } + .treemapLabel { + fill: ${e.labelColor}; + font-size: ${e.labelFontSize}; + } + .treemapValue { + fill: ${e.valueColor}; + font-size: ${e.valueFontSize}; + } + .treemapTitle { + fill: ${e.titleColor}; + font-size: ${e.titleFontSize}; + } + `},"getStyles"),j4e=Xit});var Q4e={};dr(Q4e,{diagram:()=>jit});var jit,Z4e=N(()=>{"use strict";Oz();W4e();X4e();K4e();jit={parser:Pz,get db(){return new by},renderer:Y4e,styles:j4e}});var Oat={};dr(Oat,{default:()=>Iat});nc();_A();vd();var O_e=o(t=>/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(t),"detector"),P_e=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(NQ(),RQ));return{id:"c4",diagram:t}},"loader"),B_e={id:"c4",detector:O_e,loader:P_e},MQ=B_e;var yfe="flowchart",rWe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-wrapper"||e?.flowchart?.defaultRenderer==="elk"?!1:/^\s*graph/.test(t),"detector"),nWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(AE(),CE));return{id:yfe,diagram:t}},"loader"),iWe={id:yfe,detector:rWe,loader:nWe},vfe=iWe;var xfe="flowchart-v2",aWe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-d3"?!1:(e?.flowchart?.defaultRenderer==="elk"&&(e.layout="elk"),/^\s*graph/.test(t)&&e?.flowchart?.defaultRenderer==="dagre-wrapper"?!0:/^\s*flowchart/.test(t)),"detector"),sWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(AE(),CE));return{id:xfe,diagram:t}},"loader"),oWe={id:xfe,detector:aWe,loader:sWe},bfe=oWe;var fWe=o(t=>/^\s*erDiagram/.test(t),"detector"),dWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(_fe(),Afe));return{id:"er",diagram:t}},"loader"),pWe={id:"er",detector:fWe,loader:dWe},Dfe=pWe;var Pge="gitGraph",HKe=o(t=>/^\s*gitGraph/.test(t),"detector"),qKe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Oge(),Ige));return{id:Pge,diagram:t}},"loader"),WKe={id:Pge,detector:HKe,loader:qKe},Bge=WKe;var d1e="gantt",MQe=o(t=>/^\s*gantt/.test(t),"detector"),IQe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(f1e(),h1e));return{id:d1e,diagram:t}},"loader"),OQe={id:d1e,detector:MQe,loader:IQe},p1e=OQe;var k1e="info",GQe=o(t=>/^\s*info/.test(t),"detector"),VQe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(w1e(),T1e));return{id:k1e,diagram:t}},"loader"),E1e={id:k1e,detector:GQe,loader:VQe};var tZe=o(t=>/^\s*pie/.test(t),"detector"),rZe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(M1e(),N1e));return{id:"pie",diagram:t}},"loader"),I1e={id:"pie",detector:tZe,loader:rZe};var Y1e="quadrantChart",bZe=o(t=>/^\s*quadrantChart/.test(t),"detector"),TZe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(W1e(),q1e));return{id:Y1e,diagram:t}},"loader"),wZe={id:Y1e,detector:bZe,loader:TZe},X1e=wZe;var Tye="xychart",$Ze=o(t=>/^\s*xychart(-beta)?/.test(t),"detector"),zZe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(bye(),xye));return{id:Tye,diagram:t}},"loader"),GZe={id:Tye,detector:$Ze,loader:zZe},wye=GZe;var Rye="requirement",qZe=o(t=>/^\s*requirement(Diagram)?/.test(t),"detector"),WZe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Lye(),Dye));return{id:Rye,diagram:t}},"loader"),YZe={id:Rye,detector:qZe,loader:WZe},Nye=YZe;var Xye="sequence",IJe=o(t=>/^\s*sequenceDiagram/.test(t),"detector"),OJe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Yye(),Wye));return{id:Xye,diagram:t}},"loader"),PJe={id:Xye,detector:IJe,loader:OJe},jye=PJe;var tve="class",VJe=o((t,e)=>e?.class?.defaultRenderer==="dagre-wrapper"?!1:/^\s*classDiagram/.test(t),"detector"),UJe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(eve(),Jye));return{id:tve,diagram:t}},"loader"),HJe={id:tve,detector:VJe,loader:UJe},rve=HJe;var ave="classDiagram",WJe=o((t,e)=>/^\s*classDiagram/.test(t)&&e?.class?.defaultRenderer==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(t),"detector"),YJe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ive(),nve));return{id:ave,diagram:t}},"loader"),XJe={id:ave,detector:WJe,loader:YJe},sve=XJe;var Fve="state",Tet=o((t,e)=>e?.state?.defaultRenderer==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(t),"detector"),wet=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Bve(),Pve));return{id:Fve,diagram:t}},"loader"),ket={id:Fve,detector:Tet,loader:wet},$ve=ket;var Vve="stateDiagram",Cet=o((t,e)=>!!(/^\s*stateDiagram-v2/.test(t)||/^\s*stateDiagram/.test(t)&&e?.state?.defaultRenderer==="dagre-wrapper"),"detector"),Aet=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Gve(),zve));return{id:Vve,diagram:t}},"loader"),_et={id:Vve,detector:Cet,loader:Aet},Uve=_et;var a2e="journey",jet=o(t=>/^\s*journey/.test(t),"detector"),Ket=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(i2e(),n2e));return{id:a2e,diagram:t}},"loader"),Qet={id:a2e,detector:jet,loader:Ket},s2e=Qet;pt();tu();Ei();var Zet=o((t,e,r)=>{X.debug(`rendering svg for syntax error +`);let n=aa(e),i=n.append("g");n.attr("viewBox","0 0 2412 512"),mn(n,100,512,!0),i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${r}`)},"draw"),O$={draw:Zet},o2e=O$;var Jet={db:{},renderer:O$,parser:{parse:o(()=>{},"parse")}},l2e=Jet;var c2e="flowchart-elk",ett=o((t,e={})=>/^\s*flowchart-elk/.test(t)||/^\s*(flowchart|graph)/.test(t)&&e?.flowchart?.defaultRenderer==="elk"?(e.layout="elk",!0):!1,"detector"),ttt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(AE(),CE));return{id:c2e,diagram:t}},"loader"),rtt={id:c2e,detector:ett,loader:ttt},u2e=rtt;var P2e="timeline",Ttt=o(t=>/^\s*timeline/.test(t),"detector"),wtt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(O2e(),I2e));return{id:P2e,diagram:t}},"loader"),ktt={id:P2e,detector:Ttt,loader:wtt},B2e=ktt;var J2e="mindmap",Rtt=o(t=>/^\s*mindmap/.test(t),"detector"),Ntt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Z2e(),Q2e));return{id:J2e,diagram:t}},"loader"),Mtt={id:J2e,detector:Rtt,loader:Ntt},exe=Mtt;var fxe="kanban",jtt=o(t=>/^\s*kanban/.test(t),"detector"),Ktt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(hxe(),uxe));return{id:fxe,diagram:t}},"loader"),Qtt={id:fxe,detector:jtt,loader:Ktt},dxe=Qtt;var Xxe="sankey",brt=o(t=>/^\s*sankey(-beta)?/.test(t),"detector"),Trt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Yxe(),Wxe));return{id:Xxe,diagram:t}},"loader"),wrt={id:Xxe,detector:brt,loader:Trt},jxe=wrt;var nbe="packet",Rrt=o(t=>/^\s*packet(-beta)?/.test(t),"detector"),Nrt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(rbe(),tbe));return{id:nbe,diagram:t}},"loader"),ibe={id:nbe,detector:Rrt,loader:Nrt};var mbe="radar",ent=o(t=>/^\s*radar-beta/.test(t),"detector"),tnt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(pbe(),dbe));return{id:mbe,diagram:t}},"loader"),gbe={id:mbe,detector:ent,loader:tnt};var x4e="block",wit=o(t=>/^\s*block(-beta)?/.test(t),"detector"),kit=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(v4e(),y4e));return{id:x4e,diagram:t}},"loader"),Eit={id:x4e,detector:wit,loader:kit},b4e=Eit;var V4e="architecture",$it=o(t=>/^\s*architecture/.test(t),"detector"),zit=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(G4e(),z4e));return{id:V4e,diagram:t}},"loader"),Git={id:V4e,detector:$it,loader:zit},U4e=Git;vd();Xt();var J4e="treemap",Kit=o(t=>/^\s*treemap/.test(t),"detector"),Qit=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Z4e(),Q4e));return{id:J4e,diagram:t}},"loader"),e3e={id:J4e,detector:Kit,loader:Qit};var t3e=!1,wy=o(()=>{t3e||(t3e=!0,xd("error",l2e,t=>t.toLowerCase().trim()==="error"),xd("---",{db:{clear:o(()=>{},"clear")},styles:{},renderer:{draw:o(()=>{},"draw")},parser:{parse:o(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:o(()=>null,"init")},t=>t.toLowerCase().trimStart().startsWith("---")),ev(u2e,exe,U4e),ev(MQ,dxe,sve,rve,Dfe,p1e,E1e,I1e,Nye,jye,bfe,vfe,B2e,Bge,Uve,$ve,s2e,X1e,jxe,ibe,wye,b4e,gbe,e3e))},"addDiagrams");pt();vd();Xt();var r3e=o(async()=>{X.debug("Loading registered diagrams");let e=(await Promise.allSettled(Object.entries(gu).map(async([r,{detector:n,loader:i}])=>{if(i)try{av(r)}catch{try{let{diagram:a,id:s}=await i();xd(s,a,n)}catch(a){throw X.error(`Failed to load external diagram with key ${r}. Removing from detectors.`),delete gu[r],a}}}))).filter(r=>r.status==="rejected");if(e.length>0){X.error(`Failed to load ${e.length} external diagrams`);for(let r of e)X.error(r);throw new Error(`Failed to load ${e.length} external diagrams`)}},"loadRegisteredDiagrams");pt();yr();var BC="comm",FC="rule",$C="decl";var n3e="@import";var i3e="@namespace",a3e="@keyframes";var s3e="@layer";var Bz=Math.abs,$4=String.fromCharCode;function zC(t){return t.trim()}o(zC,"trim");function z4(t,e,r){return t.replace(e,r)}o(z4,"replace");function o3e(t,e,r){return t.indexOf(e,r)}o(o3e,"indexof");function rd(t,e){return t.charCodeAt(e)|0}o(rd,"charat");function nd(t,e,r){return t.slice(e,r)}o(nd,"substr");function wo(t){return t.length}o(wo,"strlen");function l3e(t){return t.length}o(l3e,"sizeof");function ky(t,e){return e.push(t),t}o(ky,"append");var GC=1,Ey=1,c3e=0,ll=0,Ri=0,Cy="";function VC(t,e,r,n,i,a,s,l){return{value:t,root:e,parent:r,type:n,props:i,children:a,line:GC,column:Ey,length:s,return:"",siblings:l}}o(VC,"node");function u3e(){return Ri}o(u3e,"char");function h3e(){return Ri=ll>0?rd(Cy,--ll):0,Ey--,Ri===10&&(Ey=1,GC--),Ri}o(h3e,"prev");function cl(){return Ri=ll2||Sy(Ri)>3?"":" "}o(p3e,"whitespace");function m3e(t,e){for(;--e&&cl()&&!(Ri<48||Ri>102||Ri>57&&Ri<65||Ri>70&&Ri<97););return UC(t,G4()+(e<6&&uh()==32&&cl()==32))}o(m3e,"escaping");function Fz(t){for(;cl();)switch(Ri){case t:return ll;case 34:case 39:t!==34&&t!==39&&Fz(Ri);break;case 40:t===41&&Fz(t);break;case 92:cl();break}return ll}o(Fz,"delimiter");function g3e(t,e){for(;cl()&&t+Ri!==57;)if(t+Ri===84&&uh()===47)break;return"/*"+UC(e,ll-1)+"*"+$4(t===47?t:cl())}o(g3e,"commenter");function y3e(t){for(;!Sy(uh());)cl();return UC(t,ll)}o(y3e,"identifier");function b3e(t){return d3e(qC("",null,null,null,[""],t=f3e(t),0,[0],t))}o(b3e,"compile");function qC(t,e,r,n,i,a,s,l,u){for(var h=0,f=0,d=s,p=0,m=0,g=0,y=1,v=1,x=1,b=0,T="",S=i,w=a,k=n,A=T;v;)switch(g=b,b=cl()){case 40:if(g!=108&&rd(A,d-1)==58){o3e(A+=z4(HC(b),"&","&\f"),"&\f",Bz(h?l[h-1]:0))!=-1&&(x=-1);break}case 34:case 39:case 91:A+=HC(b);break;case 9:case 10:case 13:case 32:A+=p3e(g);break;case 92:A+=m3e(G4()-1,7);continue;case 47:switch(uh()){case 42:case 47:ky(Zit(g3e(cl(),G4()),e,r,u),u),(Sy(g||1)==5||Sy(uh()||1)==5)&&wo(A)&&nd(A,-1,void 0)!==" "&&(A+=" ");break;default:A+="/"}break;case 123*y:l[h++]=wo(A)*x;case 125*y:case 59:case 0:switch(b){case 0:case 125:v=0;case 59+f:x==-1&&(A=z4(A,/\f/g,"")),m>0&&(wo(A)-d||y===0&&g===47)&&ky(m>32?x3e(A+";",n,r,d-1,u):x3e(z4(A," ","")+";",n,r,d-2,u),u);break;case 59:A+=";";default:if(ky(k=v3e(A,e,r,h,f,i,l,T,S=[],w=[],d,a),a),b===123)if(f===0)qC(A,e,k,k,S,a,d,l,w);else{switch(p){case 99:if(rd(A,3)===110)break;case 108:if(rd(A,2)===97)break;default:f=0;case 100:case 109:case 115:}f?qC(t,k,k,n&&ky(v3e(t,k,k,0,0,i,l,T,i,S=[],d,w),w),i,w,d,l,n?S:w):qC(A,k,k,k,[""],w,0,l,w)}}h=f=m=0,y=x=1,T=A="",d=s;break;case 58:d=1+wo(A),m=g;default:if(y<1){if(b==123)--y;else if(b==125&&y++==0&&h3e()==125)continue}switch(A+=$4(b),b*y){case 38:x=f>0?1:(A+="\f",-1);break;case 44:l[h++]=(wo(A)-1)*x,x=1;break;case 64:uh()===45&&(A+=HC(cl())),p=uh(),f=d=wo(T=A+=y3e(G4())),b++;break;case 45:g===45&&wo(A)==2&&(y=0)}}return a}o(qC,"parse");function v3e(t,e,r,n,i,a,s,l,u,h,f,d){for(var p=i-1,m=i===0?a:[""],g=l3e(m),y=0,v=0,x=0;y0?m[b]+" "+T:z4(T,/&\f/g,m[b])))&&(u[x++]=S);return VC(t,e,r,i===0?FC:l,u,h,f,d)}o(v3e,"ruleset");function Zit(t,e,r,n){return VC(t,e,r,BC,$4(u3e()),nd(t,2,-2),0,n)}o(Zit,"comment");function x3e(t,e,r,n,i){return VC(t,e,r,$C,nd(t,0,n),nd(t,n+1,-1),n,i)}o(x3e,"declaration");function WC(t,e){for(var r="",n=0;n{E3e.forEach(t=>{t()}),E3e=[]},"attachFunctions");pt();var C3e=o(t=>t.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");F3();w2();function A3e(t){let e=t.match(B3);if(!e)return{text:t,metadata:{}};let r=Kh(e[1],{schema:jh})??{};r=typeof r=="object"&&!Array.isArray(r)?r:{};let n={};return r.displayMode&&(n.displayMode=r.displayMode.toString()),r.title&&(n.title=r.title.toString()),r.config&&(n.config=r.config),{text:t.slice(e[0].length),metadata:n}}o(A3e,"extractFrontMatter");tr();var eat=o(t=>t.replace(/\r\n?/g,` +`).replace(/<(\w+)([^>]*)>/g,(e,r,n)=>"<"+r+n.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),tat=o(t=>{let{text:e,metadata:r}=A3e(t),{displayMode:n,title:i,config:a={}}=r;return n&&(a.gantt||(a.gantt={}),a.gantt.displayMode=n),{title:i,config:a,text:e}},"processFrontmatter"),rat=o(t=>{let e=qt.detectInit(t)??{},r=qt.detectDirective(t,"wrap");return Array.isArray(r)?e.wrap=r.some(({type:n})=>n==="wrap"):r?.type==="wrap"&&(e.wrap=!0),{text:bQ(t),directive:e}},"processDirectives");function $z(t){let e=eat(t),r=tat(e),n=rat(r.text),i=Vn(r.config,n.directive);return t=C3e(n.text),{code:t,title:r.title,config:i}}o($z,"preprocessDiagram");NA();e3();tr();function _3e(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCodePoint(n)).join("");return btoa(r)}o(_3e,"toBase64");var nat=5e4,iat="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",aat="sandbox",sat="loose",oat="http://www.w3.org/2000/svg",lat="http://www.w3.org/1999/xlink",cat="http://www.w3.org/1999/xhtml",uat="100%",hat="100%",fat="border:0;margin:0;",dat="margin:0",pat="allow-top-navigation-by-user-activation allow-popups",mat='The "iframe" tag is not supported by your browser.',gat=["foreignobject"],yat=["dominant-baseline"];function N3e(t){let e=$z(t);return By(),ZG(e.config??{}),e}o(N3e,"processAndSetConfigs");async function vat(t,e){wy();try{let{code:r,config:n}=N3e(t);return{diagramType:(await M3e(r)).type,config:n}}catch(r){if(e?.suppressErrors)return!1;throw r}}o(vat,"parse");var D3e=o((t,e,r=[])=>` +.${t} ${e} { ${r.join(" !important; ")} !important; }`,"cssImportantStyles"),xat=o((t,e=new Map)=>{let r="";if(t.themeCSS!==void 0&&(r+=` +${t.themeCSS}`),t.fontFamily!==void 0&&(r+=` +:root { --mermaid-font-family: ${t.fontFamily}}`),t.altFontFamily!==void 0&&(r+=` +:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),e instanceof Map){let s=t.htmlLabels??t.flowchart?.htmlLabels?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(l=>{mr(l.styles)||s.forEach(u=>{r+=D3e(l.id,u,l.styles)}),mr(l.textStyles)||(r+=D3e(l.id,"tspan",(l?.textStyles||[]).map(u=>u.replace("color","fill"))))})}return r},"createCssStyles"),bat=o((t,e,r,n)=>{let i=xat(t,r),a=aH(e,i,t.themeVariables);return WC(b3e(`${n}{${a}}`),T3e)},"createUserStyles"),Tat=o((t="",e,r)=>{let n=t;return!r&&!e&&(n=n.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),n=Ji(n),n=n.replace(/
    /g,"
    "),n},"cleanUpSvgCode"),wat=o((t="",e)=>{let r=e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":hat,n=_3e(`${t}`);return``},"putIntoIFrame"),L3e=o((t,e,r,n,i)=>{let a=t.append("div");a.attr("id",r),n&&a.attr("style",n);let s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns",oat);return i&&s.attr("xmlns:xlink",i),s.append("g"),t},"appendDivSvgG");function R3e(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}o(R3e,"sandboxedIframe");var kat=o((t,e,r,n)=>{t.getElementById(e)?.remove(),t.getElementById(r)?.remove(),t.getElementById(n)?.remove()},"removeExistingElements"),Eat=o(async function(t,e,r){wy();let n=N3e(e);e=n.code;let i=Qt();X.debug(i),e.length>(i?.maxTextSize??nat)&&(e=iat);let a="#"+t,s="i"+t,l="#"+s,u="d"+t,h="#"+u,f=o(()=>{let D=qe(p?l:h).node();D&&"remove"in D&&D.remove()},"removeTempElements"),d=qe("body"),p=i.securityLevel===aat,m=i.securityLevel===sat,g=i.fontFamily;if(r!==void 0){if(r&&(r.innerHTML=""),p){let E=R3e(qe(r),s);d=qe(E.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=qe(r);L3e(d,t,u,`font-family: ${g}`,lat)}else{if(kat(document,t,u,s),p){let E=R3e(qe("body"),s);d=qe(E.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=qe("body");L3e(d,t,u)}let y,v;try{y=await Ay.fromText(e,{title:n.title})}catch(E){if(i.suppressErrorRendering)throw f(),E;y=await Ay.fromText("error"),v=E}let x=d.select(h).node(),b=y.type,T=x.firstChild,S=T.firstChild,w=y.renderer.getClasses?.(e,y),k=bat(i,b,w,a),A=document.createElement("style");A.innerHTML=k,T.insertBefore(A,S);try{await y.renderer.draw(e,t,g4.version,y)}catch(E){throw i.suppressErrorRendering?f():o2e.draw(e,t,g4.version),E}let C=d.select(`${h} svg`),R=y.db.getAccTitle?.(),I=y.db.getAccDescription?.();Cat(b,C,R,I),d.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",cat);let L=d.select(h).node().innerHTML;if(X.debug("config.arrowMarkerAbsolute",i.arrowMarkerAbsolute),L=Tat(L,p,vr(i.arrowMarkerAbsolute)),p){let E=d.select(h+" svg").node();L=wat(L,E)}else m||(L=yh.sanitize(L,{ADD_TAGS:gat,ADD_ATTR:yat,HTML_INTEGRATION_POINTS:{foreignobject:!0}}));if(S3e(),v)throw v;return f(),{diagramType:b,svg:L,bindFunctions:y.db.bindFunctions}},"render");function Sat(t={}){let e=Rn({},t);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),jG(e),e?.theme&&e.theme in So?e.themeVariables=So[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=So.default.getThemeVariables(e.themeVariables));let r=typeof e=="object"?C7(e):A7();Dy(r.logLevel),wy()}o(Sat,"initialize");var M3e=o((t,e={})=>{let{code:r}=$z(t);return Ay.fromText(r,e)},"getDiagramFromText");function Cat(t,e,r,n){w3e(e,t),k3e(e,r,n,e.attr("id"))}o(Cat,"addA11yInfo");var id=Object.freeze({render:Eat,parse:vat,getDiagramFromText:M3e,initialize:Sat,getConfig:Qt,setConfig:n3,getSiteConfig:A7,updateSiteConfig:KG,reset:o(()=>{By()},"reset"),globalReset:o(()=>{By(gh)},"globalReset"),defaultConfig:gh});Dy(Qt().logLevel);By(Qt());Nf();tr();var Aat=o((t,e,r)=>{X.warn(t),qL(t)?(r&&r(t.str,t.hash),e.push({...t,message:t.str,error:t})):(r&&r(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},"handleError"),I3e=o(async function(t={querySelector:".mermaid"}){try{await _at(t)}catch(e){if(qL(e)&&X.error(e.str),hh.parseError&&hh.parseError(e),!t.suppressErrors)throw X.error("Use the suppressErrors option to suppress these errors"),e}},"run"),_at=o(async function({postRenderCallback:t,querySelector:e,nodes:r}={querySelector:".mermaid"}){let n=id.getConfig();X.debug(`${t?"":"No "}Callback function found`);let i;if(r)i=r;else if(e)i=document.querySelectorAll(e);else throw new Error("Nodes and querySelector are both undefined");X.debug(`Found ${i.length} diagrams`),n?.startOnLoad!==void 0&&(X.debug("Start On Load: "+n?.startOnLoad),id.updateSiteConfig({startOnLoad:n?.startOnLoad}));let a=new qt.InitIDGenerator(n.deterministicIds,n.deterministicIDSeed),s,l=[];for(let u of Array.from(i)){X.info("Rendering diagram: "+u.id);if(u.getAttribute("data-processed"))continue;u.setAttribute("data-processed","true");let h=`mermaid-${a.next()}`;s=u.innerHTML,s=P3(qt.entityDecode(s)).trim().replace(//gi,"
    ");let f=qt.detectInit(s);f&&X.debug("Detected early reinit: ",f);try{let{svg:d,bindFunctions:p}=await F3e(h,s,u);u.innerHTML=d,t&&await t(h),p&&p(u)}catch(d){Aat(d,l,hh.parseError)}}if(l.length>0)throw l[0]},"runThrowsErrors"),O3e=o(function(t){id.initialize(t)},"initialize"),Dat=o(async function(t,e,r){X.warn("mermaid.init is deprecated. Please use run instead."),t&&O3e(t);let n={postRenderCallback:r,querySelector:".mermaid"};typeof e=="string"?n.querySelector=e:e&&(e instanceof HTMLElement?n.nodes=[e]:n.nodes=e),await I3e(n)},"init"),Lat=o(async(t,{lazyLoad:e=!0}={})=>{wy(),ev(...t),e===!1&&await r3e()},"registerExternalDiagrams"),P3e=o(function(){if(hh.startOnLoad){let{startOnLoad:t}=id.getConfig();t&&hh.run().catch(e=>X.error("Mermaid failed to initialize",e))}},"contentLoaded");if(typeof document<"u"){window.addEventListener("load",P3e,!1)}var Rat=o(function(t){hh.parseError=t},"setParseErrorHandler"),YC=[],zz=!1,B3e=o(async()=>{if(!zz){for(zz=!0;YC.length>0;){let t=YC.shift();if(t)try{await t()}catch(e){X.error("Error executing queue",e)}}zz=!1}},"executeQueue"),Nat=o(async(t,e)=>new Promise((r,n)=>{let i=o(()=>new Promise((a,s)=>{id.parse(t,e).then(l=>{a(l),r(l)},l=>{X.error("Error parsing",l),hh.parseError?.(l),s(l),n(l)})}),"performCall");YC.push(i),B3e().catch(n)}),"parse"),F3e=o((t,e,r)=>new Promise((n,i)=>{let a=o(()=>new Promise((s,l)=>{id.render(t,e,r).then(u=>{s(u),n(u)},u=>{X.error("Error parsing",u),hh.parseError?.(u),l(u),i(u)})}),"performCall");YC.push(a),B3e().catch(i)}),"render"),Mat=o(()=>Object.keys(gu).map(t=>({id:t})),"getRegisteredDiagramsMetadata"),hh={startOnLoad:!0,mermaidAPI:id,parse:Nat,render:F3e,init:Dat,run:I3e,registerExternalDiagrams:Lat,registerLayoutLoaders:zI,initialize:O3e,parseError:void 0,contentLoaded:P3e,setParseErrorHandler:Rat,detectType:_0,registerIconPacks:O3,getRegisteredDiagramsMetadata:Mat},Iat=hh;return Y3e(Oat);})(); +/*! Check if previously processed */ +/*! + * Wait for document loaded before starting the execution + */ +/*! Bundled license information: + +dompurify/dist/purify.es.mjs: + (*! @license DOMPurify 3.2.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.6/LICENSE *) + +js-yaml/dist/js-yaml.mjs: + (*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT *) + +lodash-es/lodash.js: + (** + * @license + * Lodash (Custom Build) + * Build: `lodash modularize exports="es" -o ./` + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + *) + +cytoscape/dist/cytoscape.esm.mjs: + (*! + Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable + Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) + Licensed under The MIT License (http://opensource.org/licenses/MIT) + *) + (*! + Event object based on jQuery events, MIT license + + https://jquery.org/license/ + https://tldrlegal.com/license/mit-license + https://github.com/jquery/jquery/blob/master/src/event.js + *) + (*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License *) + (*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License *) +*/ +globalThis["mermaid"] = globalThis.__esbuild_esm_mermaid_nm["mermaid"].default; diff --git a/public/plugins/notebookjs-0.4.2/notebook.min.js b/public/plugins/notebookjs-0.4.2/notebook.min.js new file mode 100755 index 00000000000..2799270590b --- /dev/null +++ b/public/plugins/notebookjs-0.4.2/notebook.min.js @@ -0,0 +1 @@ +(function(){var root=this;var VERSION="0.4.2";var doc=root.document;if(!doc){var jsdom=require("jsdom");doc=(new jsdom.JSDOM).window.document}var ident=function(x){return x};var makeElement=function(tag,classNames){var el=doc.createElement(tag);el.className=(classNames||[]).map(function(cn){return nb.prefix+cn}).join(" ");return el};var escapeHTML=function(raw){var replaced=raw.replace(//g,">");return replaced};var joinText=function(text){if(text.join){return text.map(joinText).join("")}else{return text}};var condRequire=function(module_name){return typeof require==="function"&&require(module_name)};var getMarkdown=function(){return root.marked||condRequire("marked")};var getAnsi=function(){var lib=root.ansi_up||condRequire("ansi_up");return lib&&lib.ansi_to_html};var nb={prefix:"nb-",markdown:getMarkdown()||ident,ansi:getAnsi()||ident,highlighter:ident,VERSION:VERSION};nb.Input=function(raw,cell){this.raw=raw;this.cell=cell};nb.Input.prototype.render=function(){if(!this.raw.length){return makeElement("div")}var holder=makeElement("div",["input"]);var cell=this.cell;if(typeof cell.number==="number"){holder.setAttribute("data-prompt-number",this.cell.number)}var pre_el=makeElement("pre");var code_el=makeElement("code");var notebook=cell.worksheet.notebook;var m=notebook.metadata;var lang=this.cell.raw.language||m.language||m.kernelspec&&m.kernelspec.language||m.language_info&&m.language_info.name;code_el.setAttribute("data-language",lang);code_el.className="lang-"+lang;code_el.innerHTML=nb.highlighter(escapeHTML(joinText(this.raw)),pre_el,code_el,lang);pre_el.appendChild(code_el);holder.appendChild(pre_el);this.el=holder;return holder};var imageCreator=function(format){return function(data){var el=makeElement("img",["image-output"]);el.src="data:image/"+format+";base64,"+joinText(data).replace(/\n/g,"");return el}};nb.display={};nb.display.text=function(text){var el=makeElement("pre",["text-output"]);el.innerHTML=escapeHTML(joinText(text));return el};nb.display["text/plain"]=nb.display.text;nb.display.html=function(html){var el=makeElement("div",["html-output"]);el.innerHTML=joinText(html);return el};nb.display["text/html"]=nb.display.html;nb.display.marked=function(md){return nb.display.html(nb.markdown(joinText(md)))};nb.display["text/markdown"]=nb.display.marked;nb.display.svg=function(svg){var el=makeElement("div",["svg-output"]);el.innerHTML=joinText(svg);return el};nb.display["text/svg+xml"]=nb.display.svg;nb.display["image/svg+xml"]=nb.display.svg;nb.display.latex=function(latex){var el=makeElement("div",["latex-output"]);el.innerHTML=joinText(latex);return el};nb.display["text/latex"]=nb.display.latex;nb.display.javascript=function(js){var el=makeElement("script");el.innerHTML=joinText(js);return el};nb.display["application/javascript"]=nb.display.javascript;nb.display.png=imageCreator("png");nb.display["image/png"]=nb.display.png;nb.display.jpeg=imageCreator("jpeg");nb.display["image/jpeg"]=nb.display.jpeg;nb.display_priority=["png","image/png","jpeg","image/jpeg","svg","image/svg+xml","text/svg+xml","html","text/html","text/markdown","latex","text/latex","javascript","application/javascript","text","text/plain"];var render_display_data=function(){var o=this;var formats=nb.display_priority.filter(function(d){return o.raw.data?o.raw.data[d]:o.raw[d]});var format=formats[0];if(format){if(nb.display[format]){return nb.display[format](o.raw[format]||o.raw.data[format])}}return makeElement("div",["empty-output"])};var render_error=function(){var el=makeElement("pre",["pyerr"]);var raw=this.raw.traceback.join("\n");el.innerHTML=nb.highlighter(nb.ansi(escapeHTML(raw)),el);return el};nb.Output=function(raw,cell){this.raw=raw;this.cell=cell;this.type=raw.output_type};nb.Output.prototype.renderers={display_data:render_display_data,execute_result:render_display_data,pyout:render_display_data,pyerr:render_error,error:render_error,stream:function(){var el=makeElement("pre",[this.raw.stream||this.raw.name]);var raw=joinText(this.raw.text);el.innerHTML=nb.highlighter(nb.ansi(escapeHTML(raw)),el);return el}};nb.Output.prototype.render=function(){var outer=makeElement("div",["output"]);if(typeof this.cell.number==="number"){outer.setAttribute("data-prompt-number",this.cell.number)}var inner=this.renderers[this.type].call(this);outer.appendChild(inner);this.el=outer;return outer};nb.coalesceStreams=function(outputs){if(!outputs.length){return outputs}var last=outputs[0];var new_outputs=[last];outputs.slice(1).forEach(function(o){if(o.raw.output_type==="stream"&&last.raw.output_type==="stream"&&o.raw.stream===last.raw.stream){last.raw.text=last.raw.text.concat(o.raw.text)}else{new_outputs.push(o);last=o}});return new_outputs};nb.Cell=function(raw,worksheet){var cell=this;cell.raw=raw;cell.worksheet=worksheet;cell.type=raw.cell_type;if(cell.type==="code"){cell.number=raw.prompt_number>-1?raw.prompt_number:raw.execution_count;var source=raw.input||[raw.source];cell.input=new nb.Input(source,cell);var raw_outputs=(cell.raw.outputs||[]).map(function(o){return new nb.Output(o,cell)});cell.outputs=nb.coalesceStreams(raw_outputs)}};nb.Cell.prototype.renderers={markdown:function(){var el=makeElement("div",["cell","markdown-cell"]);el.innerHTML=nb.markdown(joinText(this.raw.source));if(root.renderMathInElement!=null){root.renderMathInElement(el,{delimiters:[{left:"$$",right:"$$",display:true},{left:"\\[",right:"\\]",display:true},{left:"\\(",right:"\\)",display:false},{left:"$",right:"$",display:false}]})}return el},heading:function(){var el=makeElement("h"+this.raw.level,["cell","heading-cell"]);el.innerHTML=joinText(this.raw.source);return el},raw:function(){var el=makeElement("div",["cell","raw-cell"]);el.innerHTML=joinText(this.raw.source);return el},code:function(){var cell_el=makeElement("div",["cell","code-cell"]);cell_el.appendChild(this.input.render());var output_els=this.outputs.forEach(function(o){cell_el.appendChild(o.render())});return cell_el}};nb.Cell.prototype.render=function(){var el=this.renderers[this.type].call(this);this.el=el;return el};nb.Worksheet=function(raw,notebook){var worksheet=this;this.raw=raw;this.notebook=notebook;this.cells=raw.cells.map(function(c){return new nb.Cell(c,worksheet)});this.render=function(){var worksheet_el=makeElement("div",["worksheet"]);worksheet.cells.forEach(function(c){worksheet_el.appendChild(c.render())});this.el=worksheet_el;return worksheet_el}};nb.Notebook=function(raw,config){var notebook=this;this.raw=raw;this.config=config;var meta=this.metadata=raw.metadata||{};this.title=meta.title||meta.name;var _worksheets=raw.worksheets||[{cells:raw.cells}];this.worksheets=_worksheets.map(function(ws){return new nb.Worksheet(ws,notebook)});this.sheet=this.worksheets[0]};nb.Notebook.prototype.render=function(){var notebook_el=makeElement("div",["notebook"]);this.worksheets.forEach(function(w){notebook_el.appendChild(w.render())});this.el=notebook_el;return notebook_el};nb.parse=function(nbjson,config){return new nb.Notebook(nbjson,config)};if(typeof define==="function"&&define.amd){define(function(){return nb})}if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=nb}exports.nb=nb}else{root.nb=nb}}).call(this); diff --git a/public/plugins/pdfjs-1.4.20/build/pdf.js b/public/plugins/pdfjs-1.4.20/build/pdf.js deleted file mode 100644 index c8877d51075..00000000000 --- a/public/plugins/pdfjs-1.4.20/build/pdf.js +++ /dev/null @@ -1,10375 +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', ['exports'], factory); - } else if (typeof exports !== 'undefined') { - factory(exports); - } else { -factory((root.pdfjsDistBuildPdf = {})); - } -}(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.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.pdfjsDisplayDOMUtils = {}), root.pdfjsSharedGlobal); - } -}(this, function (exports, sharedGlobal) { - -var PDFJS = sharedGlobal.PDFJS; - -/** - * Optimised CSS custom property getter/setter. - * @class - */ -var CustomStyle = (function CustomStyleClosure() { - - // As noted on: http://www.zachstronaut.com/posts/2009/02/17/ - // animate-css-transforms-firefox-webkit.html - // in some versions of IE9 it is critical that ms appear in this list - // before Moz - var prefixes = ['ms', 'Moz', 'Webkit', 'O']; - var _cache = {}; - - function CustomStyle() {} - - CustomStyle.getProp = function get(propName, element) { - // check cache only when no element is given - if (arguments.length === 1 && typeof _cache[propName] === 'string') { - return _cache[propName]; - } - - element = element || document.documentElement; - var style = element.style, prefixed, uPropName; - - // test standard property first - if (typeof style[propName] === 'string') { - return (_cache[propName] = propName); - } - - // capitalize - uPropName = propName.charAt(0).toUpperCase() + propName.slice(1); - - // test vendor specific properties - for (var i = 0, l = prefixes.length; i < l; i++) { - prefixed = prefixes[i] + uPropName; - if (typeof style[prefixed] === 'string') { - return (_cache[propName] = prefixed); - } - } - - //if all fails then set to undefined - return (_cache[propName] = 'undefined'); - }; - - CustomStyle.setProp = function set(propName, element, str) { - var prop = this.getProp(propName); - if (prop !== 'undefined') { - element.style[prop] = str; - } - }; - - return CustomStyle; -})(); - -PDFJS.CustomStyle = CustomStyle; - -exports.CustomStyle = CustomStyle; -})); - - -(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.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 821ceac93c5..00000000000 --- 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 1119a2742ae..00000000000 --- 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 9c35b63d79d..00000000000 --- 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/findbarButton-next-rtl.png b/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next-rtl.png deleted file mode 100644 index bef02743fc1..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next-rtl.png and /dev/null differ 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 1da6dc949cd..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next-rtl@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next.png b/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next.png deleted file mode 100644 index de1d0fc901c..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next.png and /dev/null differ 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 0250307c0d1..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous-rtl.png b/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous-rtl.png deleted file mode 100644 index de1d0fc901c..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous-rtl.png and /dev/null differ 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 0250307c0d1..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous-rtl@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous.png b/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous.png deleted file mode 100644 index bef02743fc1..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous.png and /dev/null differ 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 1da6dc949cd..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/grab.cur b/public/plugins/pdfjs-1.4.20/web/images/grab.cur deleted file mode 100644 index db7ad5aed3e..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/grab.cur and /dev/null differ 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 e0dfd04e4d3..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/grabbing.cur and /dev/null differ 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 8831a80588d..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/loading-small.png and /dev/null differ 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 b25b4452aa1..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/loading-small@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-documentProperties.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-documentProperties.png deleted file mode 100644 index 40925e25ace..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-documentProperties.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-documentProperties@2x.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-documentProperties@2x.png deleted file mode 100644 index adb240eaad3..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-documentProperties@2x.png and /dev/null differ 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 e68846aa5f6..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-firstPage.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-firstPage@2x.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-firstPage@2x.png deleted file mode 100644 index 3ad8af51738..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-firstPage@2x.png and /dev/null differ 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 cb85a841b18..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-handTool.png and /dev/null differ 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 5c13f77ff00..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-handTool@2x.png and /dev/null differ 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 be763e0c4a0..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-lastPage.png and /dev/null differ 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 8570984f2d9..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-lastPage@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCcw.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCcw.png deleted file mode 100644 index 675d6da2c09..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCcw.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCcw@2x.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCcw@2x.png deleted file mode 100644 index b9e74312270..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCcw@2x.png and /dev/null differ 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 e1c7598886b..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCw.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCw@2x.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCw@2x.png deleted file mode 100644 index cb257b41c53..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCw@2x.png and /dev/null differ 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 31d3bdb14f1..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/shadow.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/texture.png b/public/plugins/pdfjs-1.4.20/web/images/texture.png deleted file mode 100644 index eb5ccb5ec3c..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/texture.png and /dev/null differ 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 a187be6c9ba..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-bookmark.png and /dev/null differ 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 4efbaa6758d..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-bookmark@2x.png and /dev/null differ 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 eaab35f09e1..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-download.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-download@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-download@2x.png deleted file mode 100644 index 896face455a..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-download@2x.png and /dev/null differ 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 306eb43b868..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-menuArrows.png and /dev/null differ 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 f7570bc0d30..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-menuArrows@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-openFile.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-openFile.png deleted file mode 100644 index b5cf1bd0613..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-openFile.png and /dev/null differ 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 91ab76593ea..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-openFile@2x.png and /dev/null differ 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 1957f79ab95..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown-rtl.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown-rtl@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown-rtl@2x.png deleted file mode 100644 index 16ebcb8ef1e..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown-rtl@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown.png deleted file mode 100644 index 8219ecf83c6..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown.png and /dev/null differ 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 758c01d8364..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp-rtl.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp-rtl.png deleted file mode 100644 index 98e7ce481c1..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp-rtl.png and /dev/null differ 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 a01b02380b9..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp-rtl@2x.png and /dev/null differ 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 fb9daa33765..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp@2x.png deleted file mode 100644 index a5cfd755b0b..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp@2x.png and /dev/null differ 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 3ac21244dff..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-presentationMode.png and /dev/null differ 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 cada9e7918d..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-presentationMode@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-print.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-print.png deleted file mode 100644 index 51275e54bee..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-print.png and /dev/null differ 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 53d18daf782..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-print@2x.png and /dev/null differ 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 f9b75579b1e..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-search.png and /dev/null differ 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 456b133248f..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-search@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle-rtl.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle-rtl.png deleted file mode 100644 index 8437095273c..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle-rtl.png and /dev/null differ 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 9d9bfa4f63d..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle.png deleted file mode 100644 index 1f90f83da74..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle@2x.png deleted file mode 100644 index b066fe5cb0e..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle@2x.png and /dev/null differ 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 6f85ec061ea..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle-rtl.png and /dev/null differ 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 291e006797f..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle-rtl@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle.png deleted file mode 100644 index 025dc9040e5..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle@2x.png deleted file mode 100644 index 7f834df9400..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewAttachments.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewAttachments.png deleted file mode 100644 index fcd0b268a47..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewAttachments.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewAttachments@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewAttachments@2x.png deleted file mode 100644 index b979e523e74..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewAttachments@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline-rtl.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline-rtl.png deleted file mode 100644 index aaa9430211e..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline-rtl.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline-rtl@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline-rtl@2x.png deleted file mode 100644 index 3410f70dfa6..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline-rtl@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline.png deleted file mode 100644 index 976365a5061..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline@2x.png deleted file mode 100644 index b6a197fdf33..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline@2x.png and /dev/null differ 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 584ba55881f..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewThumbnail.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewThumbnail@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewThumbnail@2x.png deleted file mode 100644 index fb7db938366..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewThumbnail@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomIn.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomIn.png deleted file mode 100644 index 513d081bc2d..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomIn.png and /dev/null differ 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 d5d49d5ff10..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomIn@2x.png and /dev/null differ 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 156c26b941c..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomOut.png and /dev/null differ 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 959e1919d5a..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomOut@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed-rtl.png b/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed-rtl.png deleted file mode 100644 index 1c8b9f7010c..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed-rtl.png and /dev/null differ 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 84279368d98..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed-rtl@2x.png and /dev/null differ 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 06d4d376967..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed@2x.png b/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed@2x.png deleted file mode 100644 index eec1e58c125..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed@2x.png and /dev/null differ 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 c8d557351cd..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/treeitem-expanded.png and /dev/null differ 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 3b3b6103b35..00000000000 Binary files a/public/plugins/pdfjs-1.4.20/web/images/treeitem-expanded@2x.png and /dev/null differ diff --git a/public/plugins/pdfjs-1.4.20/web/viewer.css b/public/plugins/pdfjs-1.4.20/web/viewer.css deleted file mode 100644 index da2cf653300..00000000000 --- a/public/plugins/pdfjs-1.4.20/web/viewer.css +++ /dev/null @@ -1,2122 +0,0 @@ -/* Copyright 2014 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. - */ - -.textLayer { - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - overflow: hidden; - opacity: 0.2; - line-height: 1.0; -} - -.textLayer > 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 1fc9d7bfe96..00000000000 --- 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/pdfjs-1.4.20/LICENSE b/public/plugins/pdfjs-5.2.133/LICENSE similarity index 100% rename from public/plugins/pdfjs-1.4.20/LICENSE rename to public/plugins/pdfjs-5.2.133/LICENSE diff --git a/public/plugins/pdfjs-5.2.133/build/pdf.mjs b/public/plugins/pdfjs-5.2.133/build/pdf.mjs new file mode 100644 index 00000000000..e6ab4ec31d6 --- /dev/null +++ b/public/plugins/pdfjs-5.2.133/build/pdf.mjs @@ -0,0 +1,22614 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 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. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + + +;// ./src/shared/util.js +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, + OPLIST: 0x100 +}; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15, + SIGNATURE: 101 +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_DEFAULT_COLOR: 32, + HIGHLIGHT_THICKNESS: 33, + HIGHLIGHT_FREE: 34, + HIGHLIGHT_SHOW_ALL: 35, + DRAW_STEP: 41 +}; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +const 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 +}; +const util_ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +const 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 +}; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +}; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +const OPS = { + 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, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93, + rawFillPath: 94 +}; +const DrawOPS = { + moveTo: 0, + lineTo: 1, + curveTo: 2, + closePath: 3 +}; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.log(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.log(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + switch (url?.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url, baseUrl = null, options = null) { + if (!url) { + return null; + } + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return _isValidProtocol(absoluteUrl) ? absoluteUrl : null; +} +function updateUrlHash(url, hash, allowRel = false) { + const res = URL.parse(url); + if (res) { + res.hash = hash; + return res.href; + } + if (allowRel && createValidAbsoluteUrl(url, "http://example.com")) { + return url.split("#", 1)[0] + `${hash ? `#${hash}` : ""}`; + } + return ""; +} +function shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + this.message = message; + this.name = name; + } + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +class ResponseException extends BaseException { + constructor(msg, status, missing) { + super(msg, "ResponseException"); + this.status = status; + this.missing = missing; + } +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let 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 objectSize(obj) { + return Object.keys(obj).length; +} +function isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch { + return false; + } +} +class util_FeatureTest { + static get isLittleEndian() { + return shadow(this, "isLittleEndian", isLittleEndian()); + } + static get isEvalSupported() { + return shadow(this, "isEvalSupported", isEvalSupported()); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get isImageDecoderSupported() { + return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get platform() { + if (typeof navigator !== "undefined" && typeof navigator?.platform === "string" && typeof navigator?.userAgent === "string") { + const { + platform, + userAgent + } = navigator; + return shadow(this, "platform", { + isAndroid: userAgent.includes("Android"), + isLinux: platform.includes("Linux"), + isMac: platform.includes("Mac"), + isWindows: platform.includes("Win"), + isFirefox: userAgent.includes("Firefox") + }); + } + return shadow(this, "platform", { + isAndroid: false, + isLinux: false, + isMac: false, + isWindows: false, + isFirefox: false + }); + } + static get isCSSRoundSupported() { + return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); + } +} +const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); +class Util { + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + } + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[0]; + minMax[2] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[3]; + minMax[3] *= transform[3]; + } else { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[2]; + minMax[2] *= transform[2]; + } + minMax[0] += transform[4]; + minMax[1] += transform[5]; + minMax[2] += transform[4]; + minMax[3] += transform[5]; + } + static 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]]; + } + static applyTransform(p, m, pos = 0) { + const p0 = p[pos]; + const p1 = p[pos + 1]; + p[pos] = p0 * m[0] + p1 * m[2] + m[4]; + p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5]; + } + static applyTransformToBezier(p, transform, pos = 0) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + for (let i = 0; i < 6; i += 2) { + const pI = p[pos + i]; + const pI1 = p[pos + i + 1]; + p[pos + i] = pI * m0 + pI1 * m2 + m4; + p[pos + i + 1] = pI * m1 + pI1 * m3 + m5; + } + } + static applyInverseTransform(p, m) { + const p0 = p[0]; + const p1 = p[1]; + const d = m[0] * m[3] - m[1] * m[2]; + p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + } + static axialAlignedBoundingBox(rect, transform, output) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + const r0 = rect[0]; + const r1 = rect[1]; + const r2 = rect[2]; + const r3 = rect[3]; + let a0 = m0 * r0 + m4; + let a2 = a0; + let a1 = m0 * r2 + m4; + let a3 = a1; + let b0 = m3 * r1 + m5; + let b2 = b0; + let b1 = m3 * r3 + m5; + let b3 = b1; + if (m1 !== 0 || m2 !== 0) { + const m1r0 = m1 * r0; + const m1r2 = m1 * r2; + const m2r1 = m2 * r1; + const m2r3 = m2 * r3; + a0 += m2r1; + a3 += m2r1; + a1 += m2r3; + a2 += m2r3; + b0 += m1r0; + b3 += m1r0; + b1 += m1r2; + b2 += m1r2; + } + output[0] = Math.min(output[0], a0, a1, a2, a3); + output[1] = Math.min(output[1], b0, b1, b2, b3); + output[2] = Math.max(output[2], a0, a1, a2, a3); + output[3] = Math.max(output[3], b0, b1, b2, b3); + } + static inverseTransform(m) { + const 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]; + } + static singularValueDecompose2dScale(matrix, output) { + const m0 = matrix[0]; + const m1 = matrix[1]; + const m2 = matrix[2]; + const m3 = matrix[3]; + const a = m0 ** 2 + m1 ** 2; + const b = m0 * m2 + m1 * m3; + const c = m2 ** 2 + m3 ** 2; + const first = (a + c) / 2; + const second = Math.sqrt(first ** 2 - (a * c - b ** 2)); + output[0] = Math.sqrt(first + second || 1); + output[1] = Math.sqrt(first - second || 1); + } + static normalizeRect(rect) { + const r = rect.slice(0); + 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; + } + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; + } + static pointBoundingBox(x, y, minMax) { + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static rectBoundingBox(x0, y0, x1, y1, minMax) { + minMax[0] = Math.min(minMax[0], x0, x1); + minMax[1] = Math.min(minMax[1], y0, y1); + minMax[2] = Math.max(minMax[2], x0, x1); + minMax[3] = Math.max(minMax[3], y0, y1); + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + const mt = 1 - t; + const tt = t * t; + const ttt = tt * t; + const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; + const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) >= 1e-12) { + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); + } + return; + } + const delta = b ** 2 - 4 * c * a; + if (delta < 0) { + return; + } + const sqrtDelta = Math.sqrt(delta); + const a2 = 2 * a; + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); + } +} +const PDFStringTranslateTable = (/* unused pure expression or super */ null && ([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) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + if (!decoded.includes("\x1b")) { + return decoded; + } + return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} + continue; + } + const code = PDFStringTranslateTable[charCode]; + 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 isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} +function getModificationDate(date = new Date()) { + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); +} +let NormalizeRegex = null; +let NormalizationMap = null; +function normalizeUnicode(str) { + if (!NormalizeRegex) { + NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizationMap = new Map([["ſt", "ſt"]]); + } + return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); +} +function getUuid() { + if (typeof crypto.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +const AnnotationPrefix = "pdfjs_internal_id_"; +function _isValidExplicitDest(validRef, validName, dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!validRef(page) && !Number.isInteger(page)) { + return false; + } + if (!validName(zoom)) { + return false; + } + const argsLen = args.length; + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (argsLen < 2 || argsLen > 3) { + return false; + } + break; + case "Fit": + case "FitB": + return argsLen === 0; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (argsLen > 1) { + return false; + } + break; + case "FitR": + if (argsLen !== 4) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (const arg of args) { + if (typeof arg === "number" || allowNull && arg === null) { + continue; + } + return false; + } + return true; +} +function MathClamp(v, min, max) { + return Math.min(Math.max(v, min), max); +} +function toHexUtil(arr) { + if (Uint8Array.prototype.toHex) { + return arr.toHex(); + } + return Array.from(arr, num => hexNumbers[num]).join(""); +} +function toBase64Util(arr) { + if (Uint8Array.prototype.toBase64) { + return arr.toBase64(); + } + return btoa(bytesToString(arr)); +} +function fromBase64Util(str) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(str); + } + return stringToBytes(atob(str)); +} +if (typeof Promise.try !== "function") { + Promise.try = function (fn, ...args) { + return new Promise(resolve => { + resolve(fn(...args)); + }); + }; +} +if (typeof Math.sumPrecise !== "function") { + Math.sumPrecise = function (numbers) { + return numbers.reduce((a, b) => a + b, 0); + }; +} + +;// ./src/display/display_utils.js + +const SVG_NS = "http://www.w3.org/2000/svg"; +class PixelsPerInch { + static CSS = 96.0; + static PDF = 72.0; + static PDF_TO_CSS_UNITS = this.CSS / this.PDF; +} +async function fetchData(url, type = "text") { + if (isValidFetchUrl(url, document.baseURI)) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(response.statusText); + } + switch (type) { + case "arraybuffer": + return response.arrayBuffer(); + case "blob": + return response.blob(); + case "json": + return response.json(); + } + return response.text(); + } + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.open("GET", url, true); + request.responseType = type; + request.onreadystatechange = () => { + if (request.readyState !== XMLHttpRequest.DONE) { + return; + } + if (request.status === 200 || request.status === 0) { + switch (type) { + case "arraybuffer": + case "blob": + case "json": + resolve(request.response); + return; + } + resolve(request.responseText); + return; + } + reject(new Error(request.statusText)); + }; + request.send(null); + }); +} +class PageViewport { + constructor({ + viewBox, + userUnit, + scale, + rotation, + offsetX = 0, + offsetY = 0, + dontFlip = false + }) { + this.viewBox = viewBox; + this.userUnit = userUnit; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + scale *= userUnit; + const centerX = (viewBox[2] + viewBox[0]) / 2; + const centerY = (viewBox[3] + viewBox[1]) / 2; + let rotateA, rotateB, rotateC, rotateD; + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + 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: + rotateA = 1; + rotateB = 0; + rotateC = 0; + rotateD = -1; + break; + default: + throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees."); + } + if (dontFlip) { + rotateC = -rotateC; + rotateD = -rotateD; + } + let offsetCanvasX, offsetCanvasY; + let width, height; + if (rotateA === 0) { + offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; + offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; + width = (viewBox[3] - viewBox[1]) * scale; + height = (viewBox[2] - viewBox[0]) * scale; + } else { + offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; + offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; + width = (viewBox[2] - viewBox[0]) * scale; + height = (viewBox[3] - viewBox[1]) * scale; + } + 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; + } + get rawDims() { + const dims = this.viewBox; + return shadow(this, "rawDims", { + pageWidth: dims[2] - dims[0], + pageHeight: dims[3] - dims[1], + pageX: dims[0], + pageY: dims[1] + }); + } + clone({ + scale = this.scale, + rotation = this.rotation, + offsetX = this.offsetX, + offsetY = this.offsetY, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.viewBox.slice(), + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + convertToViewportPoint(x, y) { + const p = [x, y]; + Util.applyTransform(p, this.transform); + return p; + } + convertToViewportRectangle(rect) { + const topLeft = [rect[0], rect[1]]; + Util.applyTransform(topLeft, this.transform); + const bottomRight = [rect[2], rect[3]]; + Util.applyTransform(bottomRight, this.transform); + return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]]; + } + convertToPdfPoint(x, y) { + const p = [x, y]; + Util.applyInverseTransform(p, this.transform); + return p; + } +} +class RenderingCancelledException extends BaseException { + constructor(msg, extraDelay = 0) { + super(msg, "RenderingCancelledException"); + this.extraDelay = extraDelay; + } +} +function isDataScheme(url) { + const ii = url.length; + let i = 0; + while (i < ii && url[i].trim() === "") { + i++; + } + return url.substring(i, i + 5).toLowerCase() === "data:"; +} +function isPdfFile(filename) { + return typeof filename === "string" && /\.pdf$/i.test(filename); +} +function getFilenameFromUrl(url) { + [url] = url.split(/[#?]/, 1); + return url.substring(url.lastIndexOf("/") + 1); +} +function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") { + if (typeof url !== "string") { + return defaultFilename; + } + if (isDataScheme(url)) { + warn('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); + return defaultFilename; + } + const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; + const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i; + const splitURI = reURI.exec(url); + let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); + if (suggestedFilename) { + suggestedFilename = suggestedFilename[0]; + if (suggestedFilename.includes("%")) { + try { + suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; + } catch {} + } + } + return suggestedFilename || defaultFilename; +} +class StatTimer { + started = Object.create(null); + times = []; + time(name) { + if (name in this.started) { + warn(`Timer is already running for ${name}`); + } + this.started[name] = Date.now(); + } + timeEnd(name) { + if (!(name in this.started)) { + warn(`Timer has not been started for ${name}`); + } + this.times.push({ + name, + start: this.started[name], + end: Date.now() + }); + delete this.started[name]; + } + toString() { + const outBuf = []; + let longest = 0; + for (const { + name + } of this.times) { + longest = Math.max(name.length, longest); + } + for (const { + name, + start, + end + } of this.times) { + outBuf.push(`${name.padEnd(longest)} ${end - start}ms\n`); + } + return outBuf.join(""); + } +} +function isValidFetchUrl(url, baseUrl) { + const res = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return res?.protocol === "http:" || res?.protocol === "https:"; +} +function noContextMenu(e) { + e.preventDefault(); +} +function stopEvent(e) { + e.preventDefault(); + e.stopPropagation(); +} +function deprecated(details) { + console.log("Deprecated API usage: " + details); +} +class PDFDateString { + static #regex; + static toDateObject(input) { + if (!input || typeof input !== "string") { + return null; + } + this.#regex ||= new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+|-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); + const matches = this.#regex.exec(input); + if (!matches) { + return null; + } + const year = parseInt(matches[1], 10); + let month = parseInt(matches[2], 10); + month = month >= 1 && month <= 12 ? month - 1 : 0; + let day = parseInt(matches[3], 10); + day = day >= 1 && day <= 31 ? day : 1; + let hour = parseInt(matches[4], 10); + hour = hour >= 0 && hour <= 23 ? hour : 0; + let minute = parseInt(matches[5], 10); + minute = minute >= 0 && minute <= 59 ? minute : 0; + let second = parseInt(matches[6], 10); + second = second >= 0 && second <= 59 ? second : 0; + const universalTimeRelation = matches[7] || "Z"; + let offsetHour = parseInt(matches[8], 10); + offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; + let offsetMinute = parseInt(matches[9], 10) || 0; + offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; + if (universalTimeRelation === "-") { + hour += offsetHour; + minute += offsetMinute; + } else if (universalTimeRelation === "+") { + hour -= offsetHour; + minute -= offsetMinute; + } + return new Date(Date.UTC(year, month, day, hour, minute, second)); + } +} +function getXfaPageViewport(xfaPage, { + scale = 1, + rotation = 0 +}) { + const { + width, + height + } = xfaPage.attributes.style; + const viewBox = [0, 0, parseInt(width), parseInt(height)]; + return new PageViewport({ + viewBox, + userUnit: 1, + scale, + rotation + }); +} +function getRGB(color) { + if (color.startsWith("#")) { + const colorRGB = parseInt(color.slice(1), 16); + return [(colorRGB & 0xff0000) >> 16, (colorRGB & 0x00ff00) >> 8, colorRGB & 0x0000ff]; + } + if (color.startsWith("rgb(")) { + return color.slice(4, -1).split(",").map(x => parseInt(x)); + } + if (color.startsWith("rgba(")) { + return color.slice(5, -1).split(",").map(x => parseInt(x)).slice(0, 3); + } + warn(`Not a valid color format: "${color}"`); + return [0, 0, 0]; +} +function getColorValues(colors) { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + span.style.colorScheme = "only light"; + document.body.append(span); + for (const name of colors.keys()) { + span.style.color = name; + const computedColor = window.getComputedStyle(span).color; + colors.set(name, getRGB(computedColor)); + } + span.remove(); +} +function getCurrentTransform(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform(); + return [a, b, c, d, e, f]; +} +function getCurrentTransformInverse(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform().invertSelf(); + return [a, b, c, d, e, f]; +} +function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) { + if (viewport instanceof PageViewport) { + const { + pageWidth, + pageHeight + } = viewport.rawDims; + const { + style + } = div; + const useRound = util_FeatureTest.isCSSRoundSupported; + const w = `var(--total-scale-factor) * ${pageWidth}px`, + h = `var(--total-scale-factor) * ${pageHeight}px`; + const widthStr = useRound ? `round(down, ${w}, var(--scale-round-x))` : `calc(${w})`, + heightStr = useRound ? `round(down, ${h}, var(--scale-round-y))` : `calc(${h})`; + if (!mustFlip || viewport.rotation % 180 === 0) { + style.width = widthStr; + style.height = heightStr; + } else { + style.width = heightStr; + style.height = widthStr; + } + } + if (mustRotate) { + div.setAttribute("data-main-rotation", viewport.rotation); + } +} +class OutputScale { + constructor() { + const { + pixelRatio + } = OutputScale; + this.sx = pixelRatio; + this.sy = pixelRatio; + } + get scaled() { + return this.sx !== 1 || this.sy !== 1; + } + get symmetric() { + return this.sx === this.sy; + } + limitCanvas(width, height, maxPixels, maxDim) { + let maxAreaScale = Infinity, + maxWidthScale = Infinity, + maxHeightScale = Infinity; + if (maxPixels > 0) { + maxAreaScale = Math.sqrt(maxPixels / (width * height)); + } + if (maxDim !== -1) { + maxWidthScale = maxDim / width; + maxHeightScale = maxDim / height; + } + const maxScale = Math.min(maxAreaScale, maxWidthScale, maxHeightScale); + if (this.sx > maxScale || this.sy > maxScale) { + this.sx = maxScale; + this.sy = maxScale; + return true; + } + return false; + } + static get pixelRatio() { + return globalThis.devicePixelRatio || 1; + } +} +const SupportedImageMimeTypes = ["image/apng", "image/avif", "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp", "image/x-icon"]; + +;// ./src/display/editor/toolbar.js + +class EditorToolbar { + #toolbar = null; + #colorPicker = null; + #editor; + #buttons = null; + #altText = null; + #signatureDescriptionButton = null; + static #l10nRemove = null; + constructor(editor) { + this.#editor = editor; + EditorToolbar.#l10nRemove ||= Object.freeze({ + freetext: "pdfjs-editor-remove-freetext-button", + highlight: "pdfjs-editor-remove-highlight-button", + ink: "pdfjs-editor-remove-ink-button", + stamp: "pdfjs-editor-remove-stamp-button", + signature: "pdfjs-editor-remove-signature-button" + }); + } + render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.classList.add("editToolbar", "hidden"); + editToolbar.setAttribute("role", "toolbar"); + const signal = this.#editor._uiManager._signal; + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown, { + signal + }); + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + const position = this.#editor.toolbarPosition; + if (position) { + const { + style + } = editToolbar; + const x = this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0]; + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`; + } + this.#addDeleteButton(); + return editToolbar; + } + get div() { + return this.#toolbar; + } + static #pointerDown(e) { + e.stopPropagation(); + } + #focusIn(e) { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + } + #focusOut(e) { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + } + #addListenersToElement(element) { + const signal = this.#editor._uiManager._signal; + element.addEventListener("focusin", this.#focusIn.bind(this), { + capture: true, + signal + }); + element.addEventListener("focusout", this.#focusOut.bind(this), { + capture: true, + signal + }); + element.addEventListener("contextmenu", noContextMenu, { + signal + }); + } + hide() { + this.#toolbar.classList.add("hidden"); + this.#colorPicker?.hideDropdown(); + } + show() { + this.#toolbar.classList.remove("hidden"); + this.#altText?.shown(); + } + #addDeleteButton() { + const { + editorType, + _uiManager + } = this.#editor; + const button = document.createElement("button"); + button.className = "delete"; + button.tabIndex = 0; + button.setAttribute("data-l10n-id", EditorToolbar.#l10nRemove[editorType]); + this.#addListenersToElement(button); + button.addEventListener("click", e => { + _uiManager.delete(); + }, { + signal: _uiManager._signal + }); + this.#buttons.append(button); + } + get #divider() { + const divider = document.createElement("div"); + divider.className = "divider"; + return divider; + } + async addAltText(altText) { + const button = await altText.render(); + this.#addListenersToElement(button); + this.#buttons.prepend(button, this.#divider); + this.#altText = altText; + } + addColorPicker(colorPicker) { + this.#colorPicker = colorPicker; + const button = colorPicker.renderButton(); + this.#addListenersToElement(button); + this.#buttons.prepend(button, this.#divider); + } + async addEditSignatureButton(signatureManager) { + const button = this.#signatureDescriptionButton = await signatureManager.renderEditButton(this.#editor); + this.#addListenersToElement(button); + this.#buttons.prepend(button, this.#divider); + } + updateEditSignatureButton(description) { + if (this.#signatureDescriptionButton) { + this.#signatureDescriptionButton.title = description; + } + } + remove() { + this.#toolbar.remove(); + this.#colorPicker?.destroy(); + this.#colorPicker = null; + } +} +class HighlightToolbar { + #buttons = null; + #toolbar = null; + #uiManager; + constructor(uiManager) { + this.#uiManager = uiManager; + } + #render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.className = "editToolbar"; + editToolbar.setAttribute("role", "toolbar"); + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal: this.#uiManager._signal + }); + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + this.#addHighlightButton(); + return editToolbar; + } + #getLastPoint(boxes, isLTR) { + let lastY = 0; + let lastX = 0; + for (const box of boxes) { + const y = box.y + box.height; + if (y < lastY) { + continue; + } + const x = box.x + (isLTR ? box.width : 0); + if (y > lastY) { + lastX = x; + lastY = y; + continue; + } + if (isLTR) { + if (x > lastX) { + lastX = x; + } + } else if (x < lastX) { + lastX = x; + } + } + return [isLTR ? 1 - lastX : lastX, lastY]; + } + show(parent, boxes, isLTR) { + const [x, y] = this.#getLastPoint(boxes, isLTR); + const { + style + } = this.#toolbar ||= this.#render(); + parent.append(this.#toolbar); + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`; + } + hide() { + this.#toolbar.remove(); + } + #addHighlightButton() { + const button = document.createElement("button"); + button.className = "highlightButton"; + button.tabIndex = 0; + button.setAttribute("data-l10n-id", `pdfjs-highlight-floating-button1`); + const span = document.createElement("span"); + button.append(span); + span.className = "visuallyHidden"; + span.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label"); + const signal = this.#uiManager._signal; + button.addEventListener("contextmenu", noContextMenu, { + signal + }); + button.addEventListener("click", () => { + this.#uiManager.highlightSelection("floating_button"); + }, { + signal + }); + this.#buttons.append(button); + } +} + +;// ./src/display/editor/tools.js + + + +function bindEvents(obj, element, names) { + for (const name of names) { + element.addEventListener(name, obj[name].bind(obj)); + } +} +class IdManager { + #id = 0; + get id() { + return `${AnnotationEditorPrefix}${this.#id++}`; + } +} +class ImageManager { + #baseId = getUuid(); + #id = 0; + #cache = null; + static get _isSVGFittingCanvas() { + const svg = `data:image/svg+xml;charset=UTF-8,`; + const canvas = new OffscreenCanvas(1, 3); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + const image = new Image(); + image.src = svg; + const promise = image.decode().then(() => { + ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3); + return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0; + }); + return shadow(this, "_isSVGFittingCanvas", promise); + } + async #get(key, rawData) { + this.#cache ||= new Map(); + let data = this.#cache.get(key); + if (data === null) { + return null; + } + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + try { + data ||= { + bitmap: null, + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 0, + isSvg: false + }; + let image; + if (typeof rawData === "string") { + data.url = rawData; + image = await fetchData(rawData, "blob"); + } else if (rawData instanceof File) { + image = data.file = rawData; + } else if (rawData instanceof Blob) { + image = rawData; + } + if (image.type === "image/svg+xml") { + const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas; + const fileReader = new FileReader(); + const imageElement = new Image(); + const imagePromise = new Promise((resolve, reject) => { + imageElement.onload = () => { + data.bitmap = imageElement; + data.isSvg = true; + resolve(); + }; + fileReader.onload = async () => { + const url = data.svgUrl = fileReader.result; + imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url; + }; + imageElement.onerror = fileReader.onerror = reject; + }); + fileReader.readAsDataURL(image); + await imagePromise; + } else { + data.bitmap = await createImageBitmap(image); + } + data.refCounter = 1; + } catch (e) { + warn(e); + data = null; + } + this.#cache.set(key, data); + if (data) { + this.#cache.set(data.id, data); + } + return data; + } + async getFromFile(file) { + const { + lastModified, + name, + size, + type + } = file; + return this.#get(`${lastModified}_${name}_${size}_${type}`, file); + } + async getFromUrl(url) { + return this.#get(url, url); + } + async getFromBlob(id, blobPromise) { + const blob = await blobPromise; + return this.#get(id, blob); + } + async getFromId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return null; + } + if (data.bitmap) { + data.refCounter += 1; + return data; + } + if (data.file) { + return this.getFromFile(data.file); + } + if (data.blobPromise) { + const { + blobPromise + } = data; + delete data.blobPromise; + return this.getFromBlob(data.id, blobPromise); + } + return this.getFromUrl(data.url); + } + getFromCanvas(id, canvas) { + this.#cache ||= new Map(); + let data = this.#cache.get(id); + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + const offscreen = new OffscreenCanvas(canvas.width, canvas.height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(canvas, 0, 0); + data = { + bitmap: offscreen.transferToImageBitmap(), + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 1, + isSvg: false + }; + this.#cache.set(id, data); + this.#cache.set(data.id, data); + return data; + } + getSvgUrl(id) { + const data = this.#cache.get(id); + if (!data?.isSvg) { + return null; + } + return data.svgUrl; + } + deleteId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return; + } + data.refCounter -= 1; + if (data.refCounter !== 0) { + return; + } + const { + bitmap + } = data; + if (!data.url && !data.file) { + const canvas = new OffscreenCanvas(bitmap.width, bitmap.height); + const ctx = canvas.getContext("bitmaprenderer"); + ctx.transferFromImageBitmap(bitmap); + data.blobPromise = canvas.convertToBlob(); + } + bitmap.close?.(); + data.bitmap = null; + } + isValidId(id) { + return id.startsWith(`image_${this.#baseId}_`); + } +} +class CommandManager { + #commands = []; + #locked = false; + #maxSize; + #position = -1; + constructor(maxSize = 128) { + this.#maxSize = maxSize; + } + add({ + cmd, + undo, + post, + mustExec, + type = NaN, + overwriteIfSameType = false, + keepUndo = false + }) { + if (mustExec) { + cmd(); + } + if (this.#locked) { + return; + } + const save = { + cmd, + undo, + post, + type + }; + if (this.#position === -1) { + if (this.#commands.length > 0) { + this.#commands.length = 0; + } + this.#position = 0; + this.#commands.push(save); + return; + } + if (overwriteIfSameType && this.#commands[this.#position].type === type) { + if (keepUndo) { + save.undo = this.#commands[this.#position].undo; + } + this.#commands[this.#position] = save; + return; + } + const next = this.#position + 1; + if (next === this.#maxSize) { + this.#commands.splice(0, 1); + } else { + this.#position = next; + if (next < this.#commands.length) { + this.#commands.splice(next); + } + } + this.#commands.push(save); + } + undo() { + if (this.#position === -1) { + return; + } + this.#locked = true; + const { + undo, + post + } = this.#commands[this.#position]; + undo(); + post?.(); + this.#locked = false; + this.#position -= 1; + } + redo() { + if (this.#position < this.#commands.length - 1) { + this.#position += 1; + this.#locked = true; + const { + cmd, + post + } = this.#commands[this.#position]; + cmd(); + post?.(); + this.#locked = false; + } + } + hasSomethingToUndo() { + return this.#position !== -1; + } + hasSomethingToRedo() { + return this.#position < this.#commands.length - 1; + } + cleanType(type) { + if (this.#position === -1) { + return; + } + for (let i = this.#position; i >= 0; i--) { + if (this.#commands[i].type !== type) { + this.#commands.splice(i + 1, this.#position - i); + this.#position = i; + return; + } + } + this.#commands.length = 0; + this.#position = -1; + } + destroy() { + this.#commands = null; + } +} +class KeyboardManager { + constructor(callbacks) { + this.buffer = []; + this.callbacks = new Map(); + this.allKeys = new Set(); + const { + isMac + } = util_FeatureTest.platform; + for (const [keys, callback, options = {}] of callbacks) { + for (const key of keys) { + const isMacKey = key.startsWith("mac+"); + if (isMac && isMacKey) { + this.callbacks.set(key.slice(4), { + callback, + options + }); + this.allKeys.add(key.split("+").at(-1)); + } else if (!isMac && !isMacKey) { + this.callbacks.set(key, { + callback, + options + }); + this.allKeys.add(key.split("+").at(-1)); + } + } + } + } + #serialize(event) { + if (event.altKey) { + this.buffer.push("alt"); + } + if (event.ctrlKey) { + this.buffer.push("ctrl"); + } + if (event.metaKey) { + this.buffer.push("meta"); + } + if (event.shiftKey) { + this.buffer.push("shift"); + } + this.buffer.push(event.key); + const str = this.buffer.join("+"); + this.buffer.length = 0; + return str; + } + exec(self, event) { + if (!this.allKeys.has(event.key)) { + return; + } + const info = this.callbacks.get(this.#serialize(event)); + if (!info) { + return; + } + const { + callback, + options: { + bubbles = false, + args = [], + checker = null + } + } = info; + if (checker && !checker(self, event)) { + return; + } + callback.bind(self, ...args, event)(); + if (!bubbles) { + stopEvent(event); + } + } +} +class ColorManager { + static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]); + get _colors() { + const colors = new Map([["CanvasText", null], ["Canvas", null]]); + getColorValues(colors); + return shadow(this, "_colors", colors); + } + convert(color) { + const rgb = getRGB(color); + if (!window.matchMedia("(forced-colors: active)").matches) { + return rgb; + } + for (const [name, RGB] of this._colors) { + if (RGB.every((x, i) => x === rgb[i])) { + return ColorManager._colorsMapping.get(name); + } + } + return rgb; + } + getHexCode(name) { + const rgb = this._colors.get(name); + if (!rgb) { + return name; + } + return Util.makeHexColor(...rgb); + } +} +class AnnotationEditorUIManager { + #abortController = new AbortController(); + #activeEditor = null; + #allEditors = new Map(); + #allLayers = new Map(); + #altTextManager = null; + #annotationStorage = null; + #changedExistingAnnotations = null; + #commandManager = new CommandManager(); + #copyPasteAC = null; + #currentDrawingSession = null; + #currentPageIndex = 0; + #deletedAnnotationsElementIds = new Set(); + #draggingEditors = null; + #editorTypes = null; + #editorsToRescale = new Set(); + _editorUndoBar = null; + #enableHighlightFloatingButton = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #filterFactory = null; + #focusMainContainerTimeoutId = null; + #focusManagerAC = null; + #highlightColors = null; + #highlightWhenShiftUp = false; + #highlightToolbar = null; + #idManager = new IdManager(); + #isEnabled = false; + #isWaiting = false; + #keyboardManagerAC = null; + #lastActiveElement = null; + #mainHighlightColorPicker = null; + #missingCanvases = null; + #mlManager = null; + #mode = AnnotationEditorType.NONE; + #selectedEditors = new Set(); + #selectedTextNode = null; + #signatureManager = null; + #pageColors = null; + #showAllStates = null; + #previousStates = { + isEditing: false, + isEmpty: true, + hasSomethingToUndo: false, + hasSomethingToRedo: false, + hasSelectedEditor: false, + hasSelectedText: false + }; + #translation = [0, 0]; + #translationTimeoutId = null; + #container = null; + #viewer = null; + #updateModeCapability = null; + static TRANSLATE_SMALL = 1; + static TRANSLATE_BIG = 10; + static get _keyboardManager() { + const proto = AnnotationEditorUIManager.prototype; + const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl(); + const textInputChecker = (_self, { + target: el + }) => { + if (el instanceof HTMLInputElement) { + const { + type + } = el; + return type !== "text" && type !== "number"; + } + return true; + }; + const small = this.TRANSLATE_SMALL; + const big = this.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, { + checker: textInputChecker + }], [["ctrl+z", "mac+meta+z"], proto.undo, { + checker: textInputChecker + }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.redo, { + checker: textInputChecker + }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], proto.delete, { + checker: textInputChecker + }], [["Enter", "mac+Enter"], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled + }], [[" ", "mac+ "], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement) + }], [["Escape", "mac+Escape"], proto.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], proto.translateSelectedEditors, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto.translateSelectedEditors, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto.translateSelectedEditors, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, { + args: [0, big], + checker: arrowChecker + }]])); + } + constructor(container, viewer, altTextManager, signatureManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, enableNewAltTextWhenAddingImage, mlManager, editorUndoBar, supportsPinchToZoom) { + const signal = this._signal = this.#abortController.signal; + this.#container = container; + this.#viewer = viewer; + this.#altTextManager = altTextManager; + this.#signatureManager = signatureManager; + this._eventBus = eventBus; + eventBus._on("editingaction", this.onEditingAction.bind(this), { + signal + }); + eventBus._on("pagechanging", this.onPageChanging.bind(this), { + signal + }); + eventBus._on("scalechanging", this.onScaleChanging.bind(this), { + signal + }); + eventBus._on("rotationchanging", this.onRotationChanging.bind(this), { + signal + }); + eventBus._on("setpreference", this.onSetPreference.bind(this), { + signal + }); + eventBus._on("switchannotationeditorparams", evt => this.updateParams(evt.type, evt.value), { + signal + }); + this.#addSelectionListener(); + this.#addDragAndDropListeners(); + this.#addKeyboardManager(); + this.#annotationStorage = pdfDocument.annotationStorage; + this.#filterFactory = pdfDocument.filterFactory; + this.#pageColors = pageColors; + this.#highlightColors = highlightColors || null; + this.#enableHighlightFloatingButton = enableHighlightFloatingButton; + this.#enableUpdatedAddImage = enableUpdatedAddImage; + this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage; + this.#mlManager = mlManager || null; + this.viewParameters = { + realScale: PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: 0 + }; + this.isShiftKeyDown = false; + this._editorUndoBar = editorUndoBar || null; + this._supportsPinchToZoom = supportsPinchToZoom !== false; + } + destroy() { + this.#updateModeCapability?.resolve(); + this.#updateModeCapability = null; + this.#abortController?.abort(); + this.#abortController = null; + this._signal = null; + for (const layer of this.#allLayers.values()) { + layer.destroy(); + } + this.#allLayers.clear(); + this.#allEditors.clear(); + this.#editorsToRescale.clear(); + this.#missingCanvases?.clear(); + this.#activeEditor = null; + this.#selectedEditors.clear(); + this.#commandManager.destroy(); + this.#altTextManager?.destroy(); + this.#signatureManager?.destroy(); + this.#highlightToolbar?.hide(); + this.#highlightToolbar = null; + this.#mainHighlightColorPicker?.destroy(); + this.#mainHighlightColorPicker = null; + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + this.#focusMainContainerTimeoutId = null; + } + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + this.#translationTimeoutId = null; + } + this._editorUndoBar?.destroy(); + } + combinedSignal(ac) { + return AbortSignal.any([this._signal, ac.signal]); + } + get mlManager() { + return this.#mlManager; + } + get useNewAltTextFlow() { + return this.#enableUpdatedAddImage; + } + get useNewAltTextWhenAddingImage() { + return this.#enableNewAltTextWhenAddingImage; + } + get hcmFilter() { + return shadow(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none"); + } + get direction() { + return shadow(this, "direction", getComputedStyle(this.#container).direction); + } + get highlightColors() { + return shadow(this, "highlightColors", this.#highlightColors ? new Map(this.#highlightColors.split(",").map(pair => pair.split("=").map(x => x.trim()))) : null); + } + get highlightColorNames() { + return shadow(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null); + } + setCurrentDrawingSession(layer) { + if (layer) { + this.unselectAll(); + this.disableUserSelect(true); + } else { + this.disableUserSelect(false); + } + this.#currentDrawingSession = layer; + } + setMainHighlightColorPicker(colorPicker) { + this.#mainHighlightColorPicker = colorPicker; + } + editAltText(editor, firstTime = false) { + this.#altTextManager?.editAltText(this, editor, firstTime); + } + getSignature(editor) { + this.#signatureManager?.getSignature({ + uiManager: this, + editor + }); + } + get signatureManager() { + return this.#signatureManager; + } + switchToMode(mode, callback) { + this._eventBus.on("annotationeditormodechanged", callback, { + once: true, + signal: this._signal + }); + this._eventBus.dispatch("showannotationeditorui", { + source: this, + mode + }); + } + setPreference(name, value) { + this._eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + onSetPreference({ + name, + value + }) { + switch (name) { + case "enableNewAltTextWhenAddingImage": + this.#enableNewAltTextWhenAddingImage = value; + break; + } + } + onPageChanging({ + pageNumber + }) { + this.#currentPageIndex = pageNumber - 1; + } + focusMainContainer() { + this.#container.focus(); + } + findParent(x, y) { + for (const layer of this.#allLayers.values()) { + const { + x: layerX, + y: layerY, + width, + height + } = layer.div.getBoundingClientRect(); + if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) { + return layer; + } + } + return null; + } + disableUserSelect(value = false) { + this.#viewer.classList.toggle("noUserSelect", value); + } + addShouldRescale(editor) { + this.#editorsToRescale.add(editor); + } + removeShouldRescale(editor) { + this.#editorsToRescale.delete(editor); + } + onScaleChanging({ + scale + }) { + this.commitOrRemove(); + this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS; + for (const editor of this.#editorsToRescale) { + editor.onScaleChanging(); + } + this.#currentDrawingSession?.onScaleChanging(); + } + onRotationChanging({ + pagesRotation + }) { + this.commitOrRemove(); + this.viewParameters.rotation = pagesRotation; + } + #getAnchorElementForSelection({ + anchorNode + }) { + return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode; + } + #getLayerForTextLayer(textLayer) { + const { + currentLayer + } = this; + if (currentLayer.hasTextLayer(textLayer)) { + return currentLayer; + } + for (const layer of this.#allLayers.values()) { + if (layer.hasTextLayer(textLayer)) { + return layer; + } + } + return null; + } + highlightSelection(methodOfCreation = "") { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const { + anchorNode, + anchorOffset, + focusNode, + focusOffset + } = selection; + const text = selection.toString(); + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + selection.empty(); + const layer = this.#getLayerForTextLayer(textLayer); + const isNoneMode = this.#mode === AnnotationEditorType.NONE; + const callback = () => { + layer?.createAndAddNewEditor({ + x: 0, + y: 0 + }, false, { + methodOfCreation, + boxes, + anchorNode, + anchorOffset, + focusNode, + focusOffset, + text + }); + if (isNoneMode) { + this.showAllEditors("highlight", true, true); + } + }; + if (isNoneMode) { + this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback); + return; + } + callback(); + } + #displayHighlightToolbar() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + this.#highlightToolbar ||= new HighlightToolbar(this); + this.#highlightToolbar.show(textLayer, boxes, this.direction === "ltr"); + } + addToAnnotationStorage(editor) { + if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) { + this.#annotationStorage.setValue(editor.id, editor); + } + } + #selectionChange() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + if (this.#selectedTextNode) { + this.#highlightToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + const { + anchorNode + } = selection; + if (anchorNode === this.#selectedTextNode) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + if (!textLayer) { + if (this.#selectedTextNode) { + this.#highlightToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + this.#highlightToolbar?.hide(); + this.#selectedTextNode = anchorNode; + this.#dispatchUpdateStates({ + hasSelectedText: true + }); + if (this.#mode !== AnnotationEditorType.HIGHLIGHT && this.#mode !== AnnotationEditorType.NONE) { + return; + } + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.showAllEditors("highlight", true, true); + } + this.#highlightWhenShiftUp = this.isShiftKeyDown; + if (!this.isShiftKeyDown) { + const activeLayer = this.#mode === AnnotationEditorType.HIGHLIGHT ? this.#getLayerForTextLayer(textLayer) : null; + activeLayer?.toggleDrawing(); + const ac = new AbortController(); + const signal = this.combinedSignal(ac); + const pointerup = e => { + if (e.type === "pointerup" && e.button !== 0) { + return; + } + ac.abort(); + activeLayer?.toggleDrawing(true); + if (e.type === "pointerup") { + this.#onSelectEnd("main_toolbar"); + } + }; + window.addEventListener("pointerup", pointerup, { + signal + }); + window.addEventListener("blur", pointerup, { + signal + }); + } + } + #onSelectEnd(methodOfCreation = "") { + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.highlightSelection(methodOfCreation); + } else if (this.#enableHighlightFloatingButton) { + this.#displayHighlightToolbar(); + } + } + #addSelectionListener() { + document.addEventListener("selectionchange", this.#selectionChange.bind(this), { + signal: this._signal + }); + } + #addFocusManager() { + if (this.#focusManagerAC) { + return; + } + this.#focusManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#focusManagerAC); + window.addEventListener("focus", this.focus.bind(this), { + signal + }); + window.addEventListener("blur", this.blur.bind(this), { + signal + }); + } + #removeFocusManager() { + this.#focusManagerAC?.abort(); + this.#focusManagerAC = null; + } + blur() { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + if (!this.hasSelection) { + return; + } + const { + activeElement + } = document; + for (const editor of this.#selectedEditors) { + if (editor.div.contains(activeElement)) { + this.#lastActiveElement = [editor, activeElement]; + editor._focusEventsAllowed = false; + break; + } + } + } + focus() { + if (!this.#lastActiveElement) { + return; + } + const [lastEditor, lastActiveElement] = this.#lastActiveElement; + this.#lastActiveElement = null; + lastActiveElement.addEventListener("focusin", () => { + lastEditor._focusEventsAllowed = true; + }, { + once: true, + signal: this._signal + }); + lastActiveElement.focus(); + } + #addKeyboardManager() { + if (this.#keyboardManagerAC) { + return; + } + this.#keyboardManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#keyboardManagerAC); + window.addEventListener("keydown", this.keydown.bind(this), { + signal + }); + window.addEventListener("keyup", this.keyup.bind(this), { + signal + }); + } + #removeKeyboardManager() { + this.#keyboardManagerAC?.abort(); + this.#keyboardManagerAC = null; + } + #addCopyPasteListeners() { + if (this.#copyPasteAC) { + return; + } + this.#copyPasteAC = new AbortController(); + const signal = this.combinedSignal(this.#copyPasteAC); + document.addEventListener("copy", this.copy.bind(this), { + signal + }); + document.addEventListener("cut", this.cut.bind(this), { + signal + }); + document.addEventListener("paste", this.paste.bind(this), { + signal + }); + } + #removeCopyPasteListeners() { + this.#copyPasteAC?.abort(); + this.#copyPasteAC = null; + } + #addDragAndDropListeners() { + const signal = this._signal; + document.addEventListener("dragover", this.dragOver.bind(this), { + signal + }); + document.addEventListener("drop", this.drop.bind(this), { + signal + }); + } + addEditListeners() { + this.#addKeyboardManager(); + this.#addCopyPasteListeners(); + } + removeEditListeners() { + this.#removeKeyboardManager(); + this.#removeCopyPasteListeners(); + } + dragOver(event) { + for (const { + type + } of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(type)) { + event.dataTransfer.dropEffect = "copy"; + event.preventDefault(); + return; + } + } + } + } + drop(event) { + for (const item of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + event.preventDefault(); + return; + } + } + } + } + copy(event) { + event.preventDefault(); + this.#activeEditor?.commitOrRemove(); + if (!this.hasSelection) { + return; + } + const editors = []; + for (const editor of this.#selectedEditors) { + const serialized = editor.serialize(true); + if (serialized) { + editors.push(serialized); + } + } + if (editors.length === 0) { + return; + } + event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); + } + cut(event) { + this.copy(event); + this.delete(); + } + async paste(event) { + event.preventDefault(); + const { + clipboardData + } = event; + for (const item of clipboardData.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + return; + } + } + } + let data = clipboardData.getData("application/pdfjs"); + if (!data) { + return; + } + try { + data = JSON.parse(data); + } catch (ex) { + warn(`paste: "${ex.message}".`); + return; + } + if (!Array.isArray(data)) { + return; + } + this.unselectAll(); + const layer = this.currentLayer; + try { + const newEditors = []; + for (const editor of data) { + const deserializedEditor = await layer.deserialize(editor); + if (!deserializedEditor) { + return; + } + newEditors.push(deserializedEditor); + } + const cmd = () => { + for (const editor of newEditors) { + this.#addEditorToLayer(editor); + } + this.#selectEditors(newEditors); + }; + const undo = () => { + for (const editor of newEditors) { + editor.remove(); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } catch (ex) { + warn(`paste: "${ex.message}".`); + } + } + keydown(event) { + if (!this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = true; + } + if (this.#mode !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) { + AnnotationEditorUIManager._keyboardManager.exec(this, event); + } + } + keyup(event) { + if (this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + } + } + onEditingAction({ + name + }) { + switch (name) { + case "undo": + case "redo": + case "delete": + case "selectAll": + this[name](); + break; + case "highlightSelection": + this.highlightSelection("context_menu"); + break; + } + } + #dispatchUpdateStates(details) { + const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value); + if (hasChanged) { + this._eventBus.dispatch("annotationeditorstateschanged", { + source: this, + details: Object.assign(this.#previousStates, details) + }); + if (this.#mode === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]); + } + } + } + #dispatchUpdateUI(details) { + this._eventBus.dispatch("annotationeditorparamschanged", { + source: this, + details + }); + } + setEditingState(isEditing) { + if (isEditing) { + this.#addFocusManager(); + this.#addCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: this.#mode !== AnnotationEditorType.NONE, + isEmpty: this.#isEmpty(), + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + hasSelectedEditor: false + }); + } else { + this.#removeFocusManager(); + this.#removeCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: false + }); + this.disableUserSelect(false); + } + } + registerEditorTypes(types) { + if (this.#editorTypes) { + return; + } + this.#editorTypes = types; + for (const editorType of this.#editorTypes) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + } + getId() { + return this.#idManager.id; + } + get currentLayer() { + return this.#allLayers.get(this.#currentPageIndex); + } + getLayer(pageIndex) { + return this.#allLayers.get(pageIndex); + } + get currentPageIndex() { + return this.#currentPageIndex; + } + addLayer(layer) { + this.#allLayers.set(layer.pageIndex, layer); + if (this.#isEnabled) { + layer.enable(); + } else { + layer.disable(); + } + } + removeLayer(layer) { + this.#allLayers.delete(layer.pageIndex); + } + async updateMode(mode, editId = null, isFromKeyboard = false) { + if (this.#mode === mode) { + return; + } + if (this.#updateModeCapability) { + await this.#updateModeCapability.promise; + if (!this.#updateModeCapability) { + return; + } + } + this.#updateModeCapability = Promise.withResolvers(); + this.#currentDrawingSession?.commitOrRemove(); + this.#mode = mode; + if (mode === AnnotationEditorType.NONE) { + this.setEditingState(false); + this.#disableAll(); + this._editorUndoBar?.hide(); + this.#updateModeCapability.resolve(); + return; + } + if (mode === AnnotationEditorType.SIGNATURE) { + await this.#signatureManager?.loadSignatures(); + } + this.setEditingState(true); + await this.#enableAll(); + this.unselectAll(); + for (const layer of this.#allLayers.values()) { + layer.updateMode(mode); + } + if (!editId) { + if (isFromKeyboard) { + this.addNewEditorFromKeyboard(); + } + this.#updateModeCapability.resolve(); + return; + } + for (const editor of this.#allEditors.values()) { + if (editor.annotationElementId === editId) { + this.setSelected(editor); + editor.enterInEditMode(); + } else { + editor.unselect(); + } + } + this.#updateModeCapability.resolve(); + } + addNewEditorFromKeyboard() { + if (this.currentLayer.canCreateNewEmptyEditor()) { + this.currentLayer.addNewEditor(); + } + } + updateToolbar(mode) { + if (mode === this.#mode) { + return; + } + this._eventBus.dispatch("switchannotationeditormode", { + source: this, + mode + }); + } + updateParams(type, value) { + if (!this.#editorTypes) { + return; + } + switch (type) { + case AnnotationEditorParamsType.CREATE: + this.currentLayer.addNewEditor(value); + return; + case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: + this.#mainHighlightColorPicker?.updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + this._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + type: "highlight", + action: "toggle_visibility" + } + } + }); + (this.#showAllStates ||= new Map()).set(type, value); + this.showAllEditors("highlight", value); + break; + } + for (const editor of this.#selectedEditors) { + editor.updateParams(type, value); + } + for (const editorType of this.#editorTypes) { + editorType.updateDefaultParams(type, value); + } + } + showAllEditors(type, visible, updateButton = false) { + for (const editor of this.#allEditors.values()) { + if (editor.editorType === type) { + editor.show(visible); + } + } + const state = this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true; + if (state !== visible) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]); + } + } + enableWaiting(mustWait = false) { + if (this.#isWaiting === mustWait) { + return; + } + this.#isWaiting = mustWait; + for (const layer of this.#allLayers.values()) { + if (mustWait) { + layer.disableClick(); + } else { + layer.enableClick(); + } + layer.div.classList.toggle("waiting", mustWait); + } + } + async #enableAll() { + if (!this.#isEnabled) { + this.#isEnabled = true; + const promises = []; + for (const layer of this.#allLayers.values()) { + promises.push(layer.enable()); + } + await Promise.all(promises); + for (const editor of this.#allEditors.values()) { + editor.enable(); + } + } + } + #disableAll() { + this.unselectAll(); + if (this.#isEnabled) { + this.#isEnabled = false; + for (const layer of this.#allLayers.values()) { + layer.disable(); + } + for (const editor of this.#allEditors.values()) { + editor.disable(); + } + } + } + getEditors(pageIndex) { + const editors = []; + for (const editor of this.#allEditors.values()) { + if (editor.pageIndex === pageIndex) { + editors.push(editor); + } + } + return editors; + } + getEditor(id) { + return this.#allEditors.get(id); + } + addEditor(editor) { + this.#allEditors.set(editor.id, editor); + } + removeEditor(editor) { + if (editor.div.contains(document.activeElement)) { + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + } + this.#focusMainContainerTimeoutId = setTimeout(() => { + this.focusMainContainer(); + this.#focusMainContainerTimeoutId = null; + }, 0); + } + this.#allEditors.delete(editor.id); + if (editor.annotationElementId) { + this.#missingCanvases?.delete(editor.annotationElementId); + } + this.unselect(editor); + if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) { + this.#annotationStorage?.remove(editor.id); + } + } + addDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.add(editor.annotationElementId); + this.addChangedExistingAnnotation(editor); + editor.deleted = true; + } + isDeletedAnnotationElement(annotationElementId) { + return this.#deletedAnnotationsElementIds.has(annotationElementId); + } + removeDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.delete(editor.annotationElementId); + this.removeChangedExistingAnnotation(editor); + editor.deleted = false; + } + #addEditorToLayer(editor) { + const layer = this.#allLayers.get(editor.pageIndex); + if (layer) { + layer.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + } + } + setActiveEditor(editor) { + if (this.#activeEditor === editor) { + return; + } + this.#activeEditor = editor; + if (editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + get #lastSelectedEditor() { + let ed = null; + for (ed of this.#selectedEditors) {} + return ed; + } + updateUI(editor) { + if (this.#lastSelectedEditor === editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + updateUIForDefaultProperties(editorType) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + toggleSelected(editor) { + if (this.#selectedEditors.has(editor)) { + this.#selectedEditors.delete(editor); + editor.unselect(); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + return; + } + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + setSelected(editor) { + this.#currentDrawingSession?.commitOrRemove(); + for (const ed of this.#selectedEditors) { + if (ed !== editor) { + ed.unselect(); + } + } + this.#selectedEditors.clear(); + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); + } + isSelected(editor) { + return this.#selectedEditors.has(editor); + } + get firstSelectedEditor() { + return this.#selectedEditors.values().next().value; + } + unselect(editor) { + editor.unselect(); + this.#selectedEditors.delete(editor); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + get hasSelection() { + return this.#selectedEditors.size !== 0; + } + get isEnterHandled() { + return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled; + } + undo() { + this.#commandManager.undo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: true, + isEmpty: this.#isEmpty() + }); + this._editorUndoBar?.hide(); + } + redo() { + this.#commandManager.redo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + isEmpty: this.#isEmpty() + }); + } + addCommands(params) { + this.#commandManager.add(params); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: false, + isEmpty: this.#isEmpty() + }); + } + cleanUndoStack(type) { + this.#commandManager.cleanType(type); + } + #isEmpty() { + if (this.#allEditors.size === 0) { + return true; + } + if (this.#allEditors.size === 1) { + for (const editor of this.#allEditors.values()) { + return editor.isEmpty(); + } + } + return false; + } + delete() { + this.commitOrRemove(); + const drawingEditor = this.currentLayer?.endDrawingSession(true); + if (!this.hasSelection && !drawingEditor) { + return; + } + const editors = drawingEditor ? [drawingEditor] : [...this.#selectedEditors]; + const cmd = () => { + this._editorUndoBar?.show(undo, editors.length === 1 ? editors[0].editorType : editors.length); + for (const editor of editors) { + editor.remove(); + } + }; + const undo = () => { + for (const editor of editors) { + this.#addEditorToLayer(editor); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } + commitOrRemove() { + this.#activeEditor?.commitOrRemove(); + } + hasSomethingToControl() { + return this.#activeEditor || this.hasSelection; + } + #selectEditors(editors) { + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + for (const editor of editors) { + if (editor.isEmpty()) { + continue; + } + this.#selectedEditors.add(editor); + editor.select(); + } + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + selectAll() { + for (const editor of this.#selectedEditors) { + editor.commit(); + } + this.#selectEditors(this.#allEditors.values()); + } + unselectAll() { + if (this.#activeEditor) { + this.#activeEditor.commitOrRemove(); + if (this.#mode !== AnnotationEditorType.NONE) { + return; + } + } + if (this.#currentDrawingSession?.commitOrRemove()) { + return; + } + if (!this.hasSelection) { + return; + } + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + this.#dispatchUpdateStates({ + hasSelectedEditor: false + }); + } + translateSelectedEditors(x, y, noCommit = false) { + if (!noCommit) { + this.commitOrRemove(); + } + if (!this.hasSelection) { + return; + } + this.#translation[0] += x; + this.#translation[1] += y; + const [totalX, totalY] = this.#translation; + const editors = [...this.#selectedEditors]; + const TIME_TO_WAIT = 1000; + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + } + this.#translationTimeoutId = setTimeout(() => { + this.#translationTimeoutId = null; + this.#translation[0] = this.#translation[1] = 0; + this.addCommands({ + cmd: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(totalX, totalY); + editor.translationDone(); + } + } + }, + undo: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(-totalX, -totalY); + editor.translationDone(); + } + } + }, + mustExec: false + }); + }, TIME_TO_WAIT); + for (const editor of editors) { + editor.translateInPage(x, y); + editor.translationDone(); + } + } + setUpDragSession() { + if (!this.hasSelection) { + return; + } + this.disableUserSelect(true); + this.#draggingEditors = new Map(); + for (const editor of this.#selectedEditors) { + this.#draggingEditors.set(editor, { + savedX: editor.x, + savedY: editor.y, + savedPageIndex: editor.pageIndex, + newX: 0, + newY: 0, + newPageIndex: -1 + }); + } + } + endDragSession() { + if (!this.#draggingEditors) { + return false; + } + this.disableUserSelect(false); + const map = this.#draggingEditors; + this.#draggingEditors = null; + let mustBeAddedInUndoStack = false; + for (const [{ + x, + y, + pageIndex + }, value] of map) { + value.newX = x; + value.newY = y; + value.newPageIndex = pageIndex; + mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex; + } + if (!mustBeAddedInUndoStack) { + return false; + } + const move = (editor, x, y, pageIndex) => { + if (this.#allEditors.has(editor.id)) { + const parent = this.#allLayers.get(pageIndex); + if (parent) { + editor._setParentAndPosition(parent, x, y); + } else { + editor.pageIndex = pageIndex; + editor.x = x; + editor.y = y; + } + } + }; + this.addCommands({ + cmd: () => { + for (const [editor, { + newX, + newY, + newPageIndex + }] of map) { + move(editor, newX, newY, newPageIndex); + } + }, + undo: () => { + for (const [editor, { + savedX, + savedY, + savedPageIndex + }] of map) { + move(editor, savedX, savedY, savedPageIndex); + } + }, + mustExec: true + }); + return true; + } + dragSelectedEditors(tx, ty) { + if (!this.#draggingEditors) { + return; + } + for (const editor of this.#draggingEditors.keys()) { + editor.drag(tx, ty); + } + } + rebuild(editor) { + if (editor.parent === null) { + const parent = this.getLayer(editor.pageIndex); + if (parent) { + parent.changeParent(editor); + parent.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + editor.rebuild(); + } + } else { + editor.parent.addOrRebuild(editor); + } + } + get isEditorHandlingKeyboard() { + return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents(); + } + isActive(editor) { + return this.#activeEditor === editor; + } + getActive() { + return this.#activeEditor; + } + getMode() { + return this.#mode; + } + get imageManager() { + return shadow(this, "imageManager", new ImageManager()); + } + getSelectionBoxes(textLayer) { + if (!textLayer) { + return null; + } + const selection = document.getSelection(); + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) { + return null; + } + } + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + let rotator; + switch (textLayer.getAttribute("data-main-rotation")) { + case "90": + rotator = (x, y, w, h) => ({ + x: (y - layerY) / parentHeight, + y: 1 - (x + w - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + case "180": + rotator = (x, y, w, h) => ({ + x: 1 - (x + w - layerX) / parentWidth, + y: 1 - (y + h - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + case "270": + rotator = (x, y, w, h) => ({ + x: 1 - (y + h - layerY) / parentHeight, + y: (x - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + default: + rotator = (x, y, w, h) => ({ + x: (x - layerX) / parentWidth, + y: (y - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + } + const boxes = []; + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + const range = selection.getRangeAt(i); + if (range.collapsed) { + continue; + } + for (const { + x, + y, + width, + height + } of range.getClientRects()) { + if (width === 0 || height === 0) { + continue; + } + boxes.push(rotator(x, y, width, height)); + } + } + return boxes.length === 0 ? null : boxes; + } + addChangedExistingAnnotation({ + annotationElementId, + id + }) { + (this.#changedExistingAnnotations ||= new Map()).set(annotationElementId, id); + } + removeChangedExistingAnnotation({ + annotationElementId + }) { + this.#changedExistingAnnotations?.delete(annotationElementId); + } + renderAnnotationElement(annotation) { + const editorId = this.#changedExistingAnnotations?.get(annotation.data.id); + if (!editorId) { + return; + } + const editor = this.#annotationStorage.getRawValue(editorId); + if (!editor) { + return; + } + if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) { + return; + } + editor.renderAnnotationElement(annotation); + } + setMissingCanvas(annotationId, annotationElementId, canvas) { + const editor = this.#missingCanvases?.get(annotationId); + if (!editor) { + return; + } + editor.setCanvas(annotationElementId, canvas); + this.#missingCanvases.delete(annotationId); + } + addMissingCanvas(annotationId, editor) { + (this.#missingCanvases ||= new Map()).set(annotationId, editor); + } +} + +;// ./src/display/editor/alt_text.js + +class AltText { + #altText = null; + #altTextDecorative = false; + #altTextButton = null; + #altTextButtonLabel = null; + #altTextTooltip = null; + #altTextTooltipTimeout = null; + #altTextWasFromKeyBoard = false; + #badge = null; + #editor = null; + #guessedText = null; + #textWithDisclaimer = null; + #useNewAltTextFlow = false; + static #l10nNewButton = null; + static _l10n = null; + constructor(editor) { + this.#editor = editor; + this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow; + AltText.#l10nNewButton ||= Object.freeze({ + added: "pdfjs-editor-new-alt-text-added-button", + "added-label": "pdfjs-editor-new-alt-text-added-button-label", + missing: "pdfjs-editor-new-alt-text-missing-button", + "missing-label": "pdfjs-editor-new-alt-text-missing-button-label", + review: "pdfjs-editor-new-alt-text-to-review-button", + "review-label": "pdfjs-editor-new-alt-text-to-review-button-label" + }); + } + static initialize(l10n) { + AltText._l10n ??= l10n; + } + async render() { + const altText = this.#altTextButton = document.createElement("button"); + altText.className = "altText"; + altText.tabIndex = "0"; + const label = this.#altTextButtonLabel = document.createElement("span"); + altText.append(label); + if (this.#useNewAltTextFlow) { + altText.classList.add("new"); + altText.setAttribute("data-l10n-id", AltText.#l10nNewButton.missing); + label.setAttribute("data-l10n-id", AltText.#l10nNewButton["missing-label"]); + } else { + altText.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button"); + label.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label"); + } + const signal = this.#editor._uiManager._signal; + altText.addEventListener("contextmenu", noContextMenu, { + signal + }); + altText.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); + const onClick = event => { + event.preventDefault(); + this.#editor._uiManager.editAltText(this.#editor); + if (this.#useNewAltTextFlow) { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_clicked", + data: { + label: this.#label + } + }); + } + }; + altText.addEventListener("click", onClick, { + capture: true, + signal + }); + altText.addEventListener("keydown", event => { + if (event.target === altText && event.key === "Enter") { + this.#altTextWasFromKeyBoard = true; + onClick(event); + } + }, { + signal + }); + await this.#setState(); + return altText; + } + get #label() { + return this.#altText && "added" || this.#altText === null && this.guessedText && "review" || "missing"; + } + finish() { + if (!this.#altTextButton) { + return; + } + this.#altTextButton.focus({ + focusVisible: this.#altTextWasFromKeyBoard + }); + this.#altTextWasFromKeyBoard = false; + } + isEmpty() { + if (this.#useNewAltTextFlow) { + return this.#altText === null; + } + return !this.#altText && !this.#altTextDecorative; + } + hasData() { + if (this.#useNewAltTextFlow) { + return this.#altText !== null || !!this.#guessedText; + } + return this.isEmpty(); + } + get guessedText() { + return this.#guessedText; + } + async setGuessedText(guessedText) { + if (this.#altText !== null) { + return; + } + this.#guessedText = guessedText; + this.#textWithDisclaimer = await AltText._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", { + generatedAltText: guessedText + }); + this.#setState(); + } + toggleAltTextBadge(visibility = false) { + if (!this.#useNewAltTextFlow || this.#altText) { + this.#badge?.remove(); + this.#badge = null; + return; + } + if (!this.#badge) { + const badge = this.#badge = document.createElement("div"); + badge.className = "noAltTextBadge"; + this.#editor.div.append(badge); + } + this.#badge.classList.toggle("hidden", !visibility); + } + serialize(isForCopying) { + let altText = this.#altText; + if (!isForCopying && this.#guessedText === altText) { + altText = this.#textWithDisclaimer; + } + return { + altText, + decorative: this.#altTextDecorative, + guessedText: this.#guessedText, + textWithDisclaimer: this.#textWithDisclaimer + }; + } + get data() { + return { + altText: this.#altText, + decorative: this.#altTextDecorative + }; + } + set data({ + altText, + decorative, + guessedText, + textWithDisclaimer, + cancel = false + }) { + if (guessedText) { + this.#guessedText = guessedText; + this.#textWithDisclaimer = textWithDisclaimer; + } + if (this.#altText === altText && this.#altTextDecorative === decorative) { + return; + } + if (!cancel) { + this.#altText = altText; + this.#altTextDecorative = decorative; + } + this.#setState(); + } + toggle(enabled = false) { + if (!this.#altTextButton) { + return; + } + if (!enabled && this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextButton.disabled = !enabled; + } + shown() { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_displayed", + data: { + label: this.#label + } + }); + } + destroy() { + this.#altTextButton?.remove(); + this.#altTextButton = null; + this.#altTextButtonLabel = null; + this.#altTextTooltip = null; + this.#badge?.remove(); + this.#badge = null; + } + async #setState() { + const button = this.#altTextButton; + if (!button) { + return; + } + if (this.#useNewAltTextFlow) { + button.classList.toggle("done", !!this.#altText); + button.setAttribute("data-l10n-id", AltText.#l10nNewButton[this.#label]); + this.#altTextButtonLabel?.setAttribute("data-l10n-id", AltText.#l10nNewButton[`${this.#label}-label`]); + if (!this.#altText) { + this.#altTextTooltip?.remove(); + return; + } + } else { + if (!this.#altText && !this.#altTextDecorative) { + button.classList.remove("done"); + this.#altTextTooltip?.remove(); + return; + } + button.classList.add("done"); + button.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button"); + } + let tooltip = this.#altTextTooltip; + if (!tooltip) { + this.#altTextTooltip = tooltip = document.createElement("span"); + tooltip.className = "tooltip"; + tooltip.setAttribute("role", "tooltip"); + tooltip.id = `alt-text-tooltip-${this.#editor.id}`; + const DELAY_TO_SHOW_TOOLTIP = 100; + const signal = this.#editor._uiManager._signal; + signal.addEventListener("abort", () => { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + }, { + once: true + }); + button.addEventListener("mouseenter", () => { + this.#altTextTooltipTimeout = setTimeout(() => { + this.#altTextTooltipTimeout = null; + this.#altTextTooltip.classList.add("show"); + this.#editor._reportTelemetry({ + action: "alt_text_tooltip" + }); + }, DELAY_TO_SHOW_TOOLTIP); + }, { + signal + }); + button.addEventListener("mouseleave", () => { + if (this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextTooltip?.classList.remove("show"); + }, { + signal + }); + } + if (this.#altTextDecorative) { + tooltip.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip"); + } else { + tooltip.removeAttribute("data-l10n-id"); + tooltip.textContent = this.#altText; + } + if (!tooltip.parentNode) { + button.append(tooltip); + } + const element = this.#editor.getElementForAltText(); + element?.setAttribute("aria-describedby", tooltip.id); + } +} + +;// ./src/display/touch_manager.js + +class TouchManager { + #container; + #isPinching = false; + #isPinchingStopped = null; + #isPinchingDisabled; + #onPinchStart; + #onPinching; + #onPinchEnd; + #pointerDownAC = null; + #signal; + #touchInfo = null; + #touchManagerAC; + #touchMoveAC = null; + constructor({ + container, + isPinchingDisabled = null, + isPinchingStopped = null, + onPinchStart = null, + onPinching = null, + onPinchEnd = null, + signal + }) { + this.#container = container; + this.#isPinchingStopped = isPinchingStopped; + this.#isPinchingDisabled = isPinchingDisabled; + this.#onPinchStart = onPinchStart; + this.#onPinching = onPinching; + this.#onPinchEnd = onPinchEnd; + this.#touchManagerAC = new AbortController(); + this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]); + container.addEventListener("touchstart", this.#onTouchStart.bind(this), { + passive: false, + signal: this.#signal + }); + } + get MIN_TOUCH_DISTANCE_TO_PINCH() { + return 35 / OutputScale.pixelRatio; + } + #onTouchStart(evt) { + if (this.#isPinchingDisabled?.()) { + return; + } + if (evt.touches.length === 1) { + if (this.#pointerDownAC) { + return; + } + const pointerDownAC = this.#pointerDownAC = new AbortController(); + const signal = AbortSignal.any([this.#signal, pointerDownAC.signal]); + const container = this.#container; + const opts = { + capture: true, + signal, + passive: false + }; + const cancelPointerDown = e => { + if (e.pointerType === "touch") { + this.#pointerDownAC?.abort(); + this.#pointerDownAC = null; + } + }; + container.addEventListener("pointerdown", e => { + if (e.pointerType === "touch") { + stopEvent(e); + cancelPointerDown(e); + } + }, opts); + container.addEventListener("pointerup", cancelPointerDown, opts); + container.addEventListener("pointercancel", cancelPointerDown, opts); + return; + } + if (!this.#touchMoveAC) { + this.#touchMoveAC = new AbortController(); + const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]); + const container = this.#container; + const opt = { + signal, + capture: false, + passive: false + }; + container.addEventListener("touchmove", this.#onTouchMove.bind(this), opt); + const onTouchEnd = this.#onTouchEnd.bind(this); + container.addEventListener("touchend", onTouchEnd, opt); + container.addEventListener("touchcancel", onTouchEnd, opt); + opt.capture = true; + container.addEventListener("pointerdown", stopEvent, opt); + container.addEventListener("pointermove", stopEvent, opt); + container.addEventListener("pointercancel", stopEvent, opt); + container.addEventListener("pointerup", stopEvent, opt); + this.#onPinchStart?.(); + } + stopEvent(evt); + if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) { + this.#touchInfo = null; + return; + } + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + this.#touchInfo = { + touch0X: touch0.screenX, + touch0Y: touch0.screenY, + touch1X: touch1.screenX, + touch1Y: touch1.screenY + }; + } + #onTouchMove(evt) { + if (!this.#touchInfo || evt.touches.length !== 2) { + return; + } + stopEvent(evt); + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + const { + screenX: screen0X, + screenY: screen0Y + } = touch0; + const { + screenX: screen1X, + screenY: screen1Y + } = touch1; + const touchInfo = this.#touchInfo; + const { + touch0X: pTouch0X, + touch0Y: pTouch0Y, + touch1X: pTouch1X, + touch1Y: pTouch1Y + } = touchInfo; + const prevGapX = pTouch1X - pTouch0X; + const prevGapY = pTouch1Y - pTouch0Y; + const currGapX = screen1X - screen0X; + const currGapY = screen1Y - screen0Y; + const distance = Math.hypot(currGapX, currGapY) || 1; + const pDistance = Math.hypot(prevGapX, prevGapY) || 1; + if (!this.#isPinching && Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH) { + return; + } + touchInfo.touch0X = screen0X; + touchInfo.touch0Y = screen0Y; + touchInfo.touch1X = screen1X; + touchInfo.touch1Y = screen1Y; + if (!this.#isPinching) { + this.#isPinching = true; + return; + } + const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2]; + this.#onPinching?.(origin, pDistance, distance); + } + #onTouchEnd(evt) { + if (evt.touches.length >= 2) { + return; + } + if (this.#touchMoveAC) { + this.#touchMoveAC.abort(); + this.#touchMoveAC = null; + this.#onPinchEnd?.(); + } + if (!this.#touchInfo) { + return; + } + stopEvent(evt); + this.#touchInfo = null; + this.#isPinching = false; + } + destroy() { + this.#touchManagerAC?.abort(); + this.#touchManagerAC = null; + this.#pointerDownAC?.abort(); + this.#pointerDownAC = null; + } +} + +;// ./src/display/editor/editor.js + + + + + + +class AnnotationEditor { + #accessibilityData = null; + #allResizerDivs = null; + #altText = null; + #disabled = false; + #dragPointerId = null; + #dragPointerType = ""; + #keepAspectRatio = false; + #resizersDiv = null; + #lastPointerCoords = null; + #savedDimensions = null; + #focusAC = null; + #focusedResizerName = ""; + #hasBeenClicked = false; + #initialRect = null; + #isEditing = false; + #isInEditMode = false; + #isResizerEnabledForKeyboard = false; + #moveInDOMTimeout = null; + #prevDragX = 0; + #prevDragY = 0; + #telemetryTimeouts = null; + #touchManager = null; + _isCopy = false; + _editToolbar = null; + _initialOptions = Object.create(null); + _initialData = null; + _isVisible = true; + _uiManager = null; + _focusEventsAllowed = true; + static _l10n = null; + static _l10nResizer = null; + #isDraggable = false; + #zIndex = AnnotationEditor._zIndex++; + static _borderLineWidth = -1; + static _colorManager = new ColorManager(); + static _zIndex = 1; + static _telemetryTimeout = 1000; + static get _resizerKeyboardManager() { + const resize = AnnotationEditor.prototype._resizeWithKeyboard; + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_resizerKeyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], resize, { + args: [-small, 0] + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, { + args: [-big, 0] + }], [["ArrowRight", "mac+ArrowRight"], resize, { + args: [small, 0] + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, { + args: [big, 0] + }], [["ArrowUp", "mac+ArrowUp"], resize, { + args: [0, -small] + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, { + args: [0, -big] + }], [["ArrowDown", "mac+ArrowDown"], resize, { + args: [0, small] + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, { + args: [0, big] + }], [["Escape", "mac+Escape"], AnnotationEditor.prototype._stopResizingWithKeyboard]])); + } + constructor(parameters) { + this.parent = parameters.parent; + this.id = parameters.id; + this.width = this.height = null; + this.pageIndex = parameters.parent.pageIndex; + this.name = parameters.name; + this.div = null; + this._uiManager = parameters.uiManager; + this.annotationElementId = null; + this._willKeepAspectRatio = false; + this._initialOptions.isCentered = parameters.isCentered; + this._structTreeParentId = null; + const { + rotation, + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = this.parent.viewport; + this.rotation = rotation; + this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360; + this.pageDimensions = [pageWidth, pageHeight]; + this.pageTranslation = [pageX, pageY]; + const [width, height] = this.parentDimensions; + this.x = parameters.x / width; + this.y = parameters.y / height; + this.isAttachedToDOM = false; + this.deleted = false; + } + get editorType() { + return Object.getPrototypeOf(this).constructor._type; + } + static get isDrawer() { + return false; + } + static get _defaultLineColor() { + return shadow(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); + } + static deleteAnnotationElement(editor) { + const fakeEditor = new FakeEditor({ + id: editor.parent.getNextId(), + parent: editor.parent, + uiManager: editor._uiManager + }); + fakeEditor.annotationElementId = editor.annotationElementId; + fakeEditor.deleted = true; + fakeEditor._uiManager.addToAnnotationStorage(fakeEditor); + } + static initialize(l10n, _uiManager) { + AnnotationEditor._l10n ??= l10n; + AnnotationEditor._l10nResizer ||= Object.freeze({ + topLeft: "pdfjs-editor-resizer-top-left", + topMiddle: "pdfjs-editor-resizer-top-middle", + topRight: "pdfjs-editor-resizer-top-right", + middleRight: "pdfjs-editor-resizer-middle-right", + bottomRight: "pdfjs-editor-resizer-bottom-right", + bottomMiddle: "pdfjs-editor-resizer-bottom-middle", + bottomLeft: "pdfjs-editor-resizer-bottom-left", + middleLeft: "pdfjs-editor-resizer-middle-left" + }); + if (AnnotationEditor._borderLineWidth !== -1) { + return; + } + const style = getComputedStyle(document.documentElement); + AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0; + } + static updateDefaultParams(_type, _value) {} + static get defaultPropertiesToUpdate() { + return []; + } + static isHandlingMimeForPasting(mime) { + return false; + } + static paste(item, parent) { + unreachable("Not implemented"); + } + get propertiesToUpdate() { + return []; + } + get _isDraggable() { + return this.#isDraggable; + } + set _isDraggable(value) { + this.#isDraggable = value; + this.div?.classList.toggle("draggable", value); + } + get isEnterHandled() { + return true; + } + center() { + const [pageWidth, pageHeight] = this.pageDimensions; + switch (this.parentRotation) { + case 90: + this.x -= this.height * pageHeight / (pageWidth * 2); + this.y += this.width * pageWidth / (pageHeight * 2); + break; + case 180: + this.x += this.width / 2; + this.y += this.height / 2; + break; + case 270: + this.x += this.height * pageHeight / (pageWidth * 2); + this.y -= this.width * pageWidth / (pageHeight * 2); + break; + default: + this.x -= this.width / 2; + this.y -= this.height / 2; + break; + } + this.fixAndSetPosition(); + } + addCommands(params) { + this._uiManager.addCommands(params); + } + get currentLayer() { + return this._uiManager.currentLayer; + } + setInBackground() { + this.div.style.zIndex = 0; + } + setInForeground() { + this.div.style.zIndex = this.#zIndex; + } + setParent(parent) { + if (parent !== null) { + this.pageIndex = parent.pageIndex; + this.pageDimensions = parent.pageDimensions; + } else { + this.#stopResizing(); + } + this.parent = parent; + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.#hasBeenClicked) { + this.parent.setSelected(this); + } else { + this.#hasBeenClicked = false; + } + } + focusout(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.isAttachedToDOM) { + return; + } + const target = event.relatedTarget; + if (target?.closest(`#${this.id}`)) { + return; + } + event.preventDefault(); + if (!this.parent?.isMultipleSelection) { + this.commitOrRemove(); + } + } + commitOrRemove() { + if (this.isEmpty()) { + this.remove(); + } else { + this.commit(); + } + } + commit() { + this.addToAnnotationStorage(); + } + addToAnnotationStorage() { + this._uiManager.addToAnnotationStorage(this); + } + setAt(x, y, tx, ty) { + const [width, height] = this.parentDimensions; + [tx, ty] = this.screenToPageTranslation(tx, ty); + this.x = (x + tx) / width; + this.y = (y + ty) / height; + this.fixAndSetPosition(); + } + _moveAfterPaste(baseX, baseY) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + this._onTranslated(); + } + #translate([width, height], x, y) { + [x, y] = this.screenToPageTranslation(x, y); + this.x += x / width; + this.y += y / height; + this._onTranslating(this.x, this.y); + this.fixAndSetPosition(); + } + translate(x, y) { + this.#translate(this.parentDimensions, x, y); + } + translateInPage(x, y) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.#translate(this.pageDimensions, x, y); + this.div.scrollIntoView({ + block: "nearest" + }); + } + translationDone() { + this._onTranslated(this.x, this.y); + } + drag(tx, ty) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + const { + div, + parentDimensions: [parentWidth, parentHeight] + } = this; + this.x += tx / parentWidth; + this.y += ty / parentHeight; + if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) { + const { + x, + y + } = this.div.getBoundingClientRect(); + if (this.parent.findNewParent(this, x, y)) { + this.x -= Math.floor(this.x); + this.y -= Math.floor(this.y); + } + } + let { + x, + y + } = this; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + const { + style + } = div; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this._onTranslating(x, y); + div.scrollIntoView({ + block: "nearest" + }); + } + _onTranslating(x, y) {} + _onTranslated(x, y) {} + get _hasBeenMoved() { + return !!this.#initialRect && (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y); + } + get _hasBeenResized() { + return !!this.#initialRect && (this.#initialRect[2] !== this.width || this.#initialRect[3] !== this.height); + } + getBaseTranslation() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + _borderLineWidth + } = AnnotationEditor; + const x = _borderLineWidth / parentWidth; + const y = _borderLineWidth / parentHeight; + switch (this.rotation) { + case 90: + return [-x, y]; + case 180: + return [x, y]; + case 270: + return [x, -y]; + default: + return [-x, -y]; + } + } + get _mustFixPosition() { + return true; + } + fixAndSetPosition(rotation = this.rotation) { + const { + div: { + style + }, + pageDimensions: [pageWidth, pageHeight] + } = this; + let { + x, + y, + width, + height + } = this; + width *= pageWidth; + height *= pageHeight; + x *= pageWidth; + y *= pageHeight; + if (this._mustFixPosition) { + switch (rotation) { + case 0: + x = MathClamp(x, 0, pageWidth - width); + y = MathClamp(y, 0, pageHeight - height); + break; + case 90: + x = MathClamp(x, 0, pageWidth - height); + y = MathClamp(y, width, pageHeight); + break; + case 180: + x = MathClamp(x, width, pageWidth); + y = MathClamp(y, height, pageHeight); + break; + case 270: + x = MathClamp(x, height, pageWidth); + y = MathClamp(y, 0, pageHeight - width); + break; + } + } + this.x = x /= pageWidth; + this.y = y /= pageHeight; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this.moveInDOM(); + } + static #rotatePoint(x, y, angle) { + switch (angle) { + case 90: + return [y, -x]; + case 180: + return [-x, -y]; + case 270: + return [-y, x]; + default: + return [x, y]; + } + } + screenToPageTranslation(x, y) { + return AnnotationEditor.#rotatePoint(x, y, this.parentRotation); + } + pageTranslationToScreen(x, y) { + return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation); + } + #getRotationMatrix(rotation) { + switch (rotation) { + case 90: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0]; + } + case 180: + return [-1, 0, 0, -1]; + case 270: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0]; + } + default: + return [1, 0, 0, 1]; + } + } + get parentScale() { + return this._uiManager.viewParameters.realScale; + } + get parentRotation() { + return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360; + } + get parentDimensions() { + const { + parentScale, + pageDimensions: [pageWidth, pageHeight] + } = this; + return [pageWidth * parentScale, pageHeight * parentScale]; + } + setDims(width, height) { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + style + } = this.div; + style.width = `${(100 * width / parentWidth).toFixed(2)}%`; + if (!this.#keepAspectRatio) { + style.height = `${(100 * height / parentHeight).toFixed(2)}%`; + } + } + fixDims() { + const { + style + } = this.div; + const { + height, + width + } = style; + const widthPercent = width.endsWith("%"); + const heightPercent = !this.#keepAspectRatio && height.endsWith("%"); + if (widthPercent && heightPercent) { + return; + } + const [parentWidth, parentHeight] = this.parentDimensions; + if (!widthPercent) { + style.width = `${(100 * parseFloat(width) / parentWidth).toFixed(2)}%`; + } + if (!this.#keepAspectRatio && !heightPercent) { + style.height = `${(100 * parseFloat(height) / parentHeight).toFixed(2)}%`; + } + } + getInitialTranslation() { + return [0, 0]; + } + #createResizers() { + if (this.#resizersDiv) { + return; + } + this.#resizersDiv = document.createElement("div"); + this.#resizersDiv.classList.add("resizers"); + const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"]; + const signal = this._uiManager._signal; + for (const name of classes) { + const div = document.createElement("div"); + this.#resizersDiv.append(div); + div.classList.add("resizer", name); + div.setAttribute("data-resizer-name", name); + div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name), { + signal + }); + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.tabIndex = -1; + } + this.div.prepend(this.#resizersDiv); + } + #resizerPointerdown(name, event) { + event.preventDefault(); + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#altText?.toggle(false); + const savedDraggable = this._isDraggable; + this._isDraggable = false; + this.#lastPointerCoords = [event.screenX, event.screenY]; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + this.parent.togglePointerEvents(false); + window.addEventListener("pointermove", this.#resizerPointermove.bind(this, name), { + passive: true, + capture: true, + signal + }); + window.addEventListener("touchmove", stopEvent, { + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const savedParentCursor = this.parent.div.style.cursor; + const savedCursor = this.div.style.cursor; + this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor; + const pointerUpCallback = () => { + ac.abort(); + this.parent.togglePointerEvents(true); + this.#altText?.toggle(true); + this._isDraggable = savedDraggable; + this.parent.div.style.cursor = savedParentCursor; + this.div.style.cursor = savedCursor; + this.#addResizeToUndoStack(); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + #resize(x, y, width, height) { + this.width = width; + this.height = height; + this.x = x; + this.y = y; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(parentWidth * width, parentHeight * height); + this.fixAndSetPosition(); + this._onResized(); + } + _onResized() {} + #addResizeToUndoStack() { + if (!this.#savedDimensions) { + return; + } + const { + savedX, + savedY, + savedWidth, + savedHeight + } = this.#savedDimensions; + this.#savedDimensions = null; + const newX = this.x; + const newY = this.y; + const newWidth = this.width; + const newHeight = this.height; + if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.addCommands({ + cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight), + undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight), + mustExec: true + }); + } + static _round(x) { + return Math.round(x * 10000) / 10000; + } + #resizerPointermove(name, event) { + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation); + const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y]; + let getPoint; + let getOpposite; + let isDiagonal = false; + let isHorizontal = false; + switch (name) { + case "topLeft": + isDiagonal = true; + getPoint = (w, h) => [0, 0]; + getOpposite = (w, h) => [w, h]; + break; + case "topMiddle": + getPoint = (w, h) => [w / 2, 0]; + getOpposite = (w, h) => [w / 2, h]; + break; + case "topRight": + isDiagonal = true; + getPoint = (w, h) => [w, 0]; + getOpposite = (w, h) => [0, h]; + break; + case "middleRight": + isHorizontal = true; + getPoint = (w, h) => [w, h / 2]; + getOpposite = (w, h) => [0, h / 2]; + break; + case "bottomRight": + isDiagonal = true; + getPoint = (w, h) => [w, h]; + getOpposite = (w, h) => [0, 0]; + break; + case "bottomMiddle": + getPoint = (w, h) => [w / 2, h]; + getOpposite = (w, h) => [w / 2, 0]; + break; + case "bottomLeft": + isDiagonal = true; + getPoint = (w, h) => [0, h]; + getOpposite = (w, h) => [w, 0]; + break; + case "middleLeft": + isHorizontal = true; + getPoint = (w, h) => [0, h / 2]; + getOpposite = (w, h) => [w, h / 2]; + break; + } + const point = getPoint(savedWidth, savedHeight); + const oppositePoint = getOpposite(savedWidth, savedHeight); + let transfOppositePoint = transf(...oppositePoint); + const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]); + const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]); + let ratioX = 1; + let ratioY = 1; + let deltaX, deltaY; + if (!event.fromKeyboard) { + const { + screenX, + screenY + } = event; + const [lastScreenX, lastScreenY] = this.#lastPointerCoords; + [deltaX, deltaY] = this.screenToPageTranslation(screenX - lastScreenX, screenY - lastScreenY); + this.#lastPointerCoords[0] = screenX; + this.#lastPointerCoords[1] = screenY; + } else { + ({ + deltaX, + deltaY + } = event); + } + [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight); + if (isDiagonal) { + const oldDiag = Math.hypot(savedWidth, savedHeight); + ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + } else if (isHorizontal) { + ratioX = MathClamp(Math.abs(oppositePoint[0] - point[0] - deltaX), minWidth, 1) / savedWidth; + } else { + ratioY = MathClamp(Math.abs(oppositePoint[1] - point[1] - deltaY), minHeight, 1) / savedHeight; + } + const newWidth = AnnotationEditor._round(savedWidth * ratioX); + const newHeight = AnnotationEditor._round(savedHeight * ratioY); + transfOppositePoint = transf(...getOpposite(newWidth, newHeight)); + const newX = oppositeX - transfOppositePoint[0]; + const newY = oppositeY - transfOppositePoint[1]; + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.width = newWidth; + this.height = newHeight; + this.x = newX; + this.y = newY; + this.setDims(parentWidth * newWidth, parentHeight * newHeight); + this.fixAndSetPosition(); + this._onResizing(); + } + _onResizing() {} + altTextFinish() { + this.#altText?.finish(); + } + async addEditToolbar() { + if (this._editToolbar || this.#isInEditMode) { + return this._editToolbar; + } + this._editToolbar = new EditorToolbar(this); + this.div.append(this._editToolbar.render()); + if (this.#altText) { + await this._editToolbar.addAltText(this.#altText); + } + return this._editToolbar; + } + removeEditToolbar() { + if (!this._editToolbar) { + return; + } + this._editToolbar.remove(); + this._editToolbar = null; + this.#altText?.destroy(); + } + addContainer(container) { + const editToolbarDiv = this._editToolbar?.div; + if (editToolbarDiv) { + editToolbarDiv.before(container); + } else { + this.div.append(container); + } + } + getClientDimensions() { + return this.div.getBoundingClientRect(); + } + async addAltTextButton() { + if (this.#altText) { + return; + } + AltText.initialize(AnnotationEditor._l10n); + this.#altText = new AltText(this); + if (this.#accessibilityData) { + this.#altText.data = this.#accessibilityData; + this.#accessibilityData = null; + } + await this.addEditToolbar(); + } + get altTextData() { + return this.#altText?.data; + } + set altTextData(data) { + if (!this.#altText) { + return; + } + this.#altText.data = data; + } + get guessedAltText() { + return this.#altText?.guessedText; + } + async setGuessedAltText(text) { + await this.#altText?.setGuessedText(text); + } + serializeAltText(isForCopying) { + return this.#altText?.serialize(isForCopying); + } + hasAltText() { + return !!this.#altText && !this.#altText.isEmpty(); + } + hasAltTextData() { + return this.#altText?.hasData() ?? false; + } + render() { + const div = this.div = document.createElement("div"); + div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); + div.className = this.name; + div.setAttribute("id", this.id); + div.tabIndex = this.#disabled ? -1 : 0; + div.setAttribute("role", "application"); + if (this.defaultL10nId) { + div.setAttribute("data-l10n-id", this.defaultL10nId); + } + if (!this._isVisible) { + div.classList.add("hidden"); + } + this.setInForeground(); + this.#addFocusListeners(); + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.parentRotation % 180 !== 0) { + div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`; + div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`; + } + const [tx, ty] = this.getInitialTranslation(); + this.translate(tx, ty); + bindEvents(this, div, ["keydown", "pointerdown"]); + if (this.isResizable && this._uiManager._supportsPinchToZoom) { + this.#touchManager ||= new TouchManager({ + container: div, + isPinchingDisabled: () => !this.isSelected, + onPinchStart: this.#touchPinchStartCallback.bind(this), + onPinching: this.#touchPinchCallback.bind(this), + onPinchEnd: this.#touchPinchEndCallback.bind(this), + signal: this._uiManager._signal + }); + } + this._uiManager._editorUndoBar?.hide(); + return div; + } + #touchPinchStartCallback() { + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + this.#altText?.toggle(false); + this.parent.togglePointerEvents(false); + } + #touchPinchCallback(_origin, prevDistance, distance) { + const slowDownFactor = 0.7; + let factor = slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor; + if (factor === 1) { + return; + } + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + factor = Math.max(Math.min(factor, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + const newWidth = AnnotationEditor._round(savedWidth * factor); + const newHeight = AnnotationEditor._round(savedHeight * factor); + if (newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight]; + const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2); + const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]); + const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]); + const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2); + this.x = centerX - newTransfCenterPoint[0]; + this.y = centerY - newTransfCenterPoint[1]; + this.width = newWidth; + this.height = newHeight; + this.setDims(parentWidth * newWidth, parentHeight * newHeight); + this.fixAndSetPosition(); + this._onResizing(); + } + #touchPinchEndCallback() { + this.#altText?.toggle(true); + this.parent.togglePointerEvents(true); + this.#addResizeToUndoStack(); + } + pointerdown(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + event.preventDefault(); + return; + } + this.#hasBeenClicked = true; + if (this._isDraggable) { + this.#setUpDragSession(event); + return; + } + this.#selectOnPointerEvent(event); + } + get isSelected() { + return this._uiManager.isSelected(this); + } + #selectOnPointerEvent(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { + this.parent.toggleSelected(this); + } else { + this.parent.setSelected(this); + } + } + #setUpDragSession(event) { + const { + isSelected + } = this; + this._uiManager.setUpDragSession(); + let hasDraggingStarted = false; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + const opts = { + capture: true, + passive: false, + signal + }; + const cancelDrag = e => { + ac.abort(); + this.#dragPointerId = null; + this.#hasBeenClicked = false; + if (!this._uiManager.endDragSession()) { + this.#selectOnPointerEvent(e); + } + if (hasDraggingStarted) { + this._onStopDragging(); + } + }; + if (isSelected) { + this.#prevDragX = event.clientX; + this.#prevDragY = event.clientY; + this.#dragPointerId = event.pointerId; + this.#dragPointerType = event.pointerType; + window.addEventListener("pointermove", e => { + if (!hasDraggingStarted) { + hasDraggingStarted = true; + this._onStartDragging(); + } + const { + clientX: x, + clientY: y, + pointerId + } = e; + if (pointerId !== this.#dragPointerId) { + stopEvent(e); + return; + } + const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY); + this.#prevDragX = x; + this.#prevDragY = y; + this._uiManager.dragSelectedEditors(tx, ty); + }, opts); + window.addEventListener("touchmove", stopEvent, opts); + window.addEventListener("pointerdown", e => { + if (e.pointerType === this.#dragPointerType) { + if (this.#touchManager || e.isPrimary) { + cancelDrag(e); + } + } + stopEvent(e); + }, opts); + } + const pointerUpCallback = e => { + if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) { + cancelDrag(e); + return; + } + stopEvent(e); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + _onStartDragging() {} + _onStopDragging() {} + moveInDOM() { + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + } + this.#moveInDOMTimeout = setTimeout(() => { + this.#moveInDOMTimeout = null; + this.parent?.moveEditorInDOM(this); + }, 0); + } + _setParentAndPosition(parent, x, y) { + parent.changeParent(this); + this.x = x; + this.y = y; + this.fixAndSetPosition(); + this._onTranslated(); + } + getRect(tx, ty, rotation = this.rotation) { + const scale = this.parentScale; + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const shiftX = tx / scale; + const shiftY = ty / scale; + const x = this.x * pageWidth; + const y = this.y * pageHeight; + const width = this.width * pageWidth; + const height = this.height * pageHeight; + switch (rotation) { + case 0: + return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY]; + case 90: + return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY]; + case 180: + return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY]; + case 270: + return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY]; + default: + throw new Error("Invalid rotation"); + } + } + getRectInCurrentCoords(rect, pageHeight) { + const [x1, y1, x2, y2] = rect; + const width = x2 - x1; + const height = y2 - y1; + switch (this.rotation) { + case 0: + return [x1, pageHeight - y2, width, height]; + case 90: + return [x1, pageHeight - y1, height, width]; + case 180: + return [x2, pageHeight - y1, width, height]; + case 270: + return [x2, pageHeight - y2, height, width]; + default: + throw new Error("Invalid rotation"); + } + } + onceAdded(focus) {} + isEmpty() { + return false; + } + enableEditMode() { + this.#isInEditMode = true; + } + disableEditMode() { + this.#isInEditMode = false; + } + isInEditMode() { + return this.#isInEditMode; + } + shouldGetKeyboardEvents() { + return this.#isResizerEnabledForKeyboard; + } + needsToBeRebuilt() { + return this.div && !this.isAttachedToDOM; + } + get isOnScreen() { + const { + top, + left, + bottom, + right + } = this.getClientDimensions(); + const { + innerHeight, + innerWidth + } = window; + return left < innerWidth && right > 0 && top < innerHeight && bottom > 0; + } + #addFocusListeners() { + if (this.#focusAC || !this.div) { + return; + } + this.#focusAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#focusAC); + this.div.addEventListener("focusin", this.focusin.bind(this), { + signal + }); + this.div.addEventListener("focusout", this.focusout.bind(this), { + signal + }); + } + rebuild() { + this.#addFocusListeners(); + } + rotate(_angle) {} + resize() {} + serializeDeleted() { + return { + id: this.annotationElementId, + deleted: true, + pageIndex: this.pageIndex, + popupRef: this._initialData?.popupRef || "" + }; + } + serialize(isForCopying = false, context = null) { + unreachable("An editor must be serializable"); + } + static async deserialize(data, parent, uiManager) { + const editor = new this.prototype.constructor({ + parent, + id: parent.getNextId(), + uiManager + }); + editor.rotation = data.rotation; + editor.#accessibilityData = data.accessibilityData; + editor._isCopy = data.isCopy || false; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); + editor.x = x / pageWidth; + editor.y = y / pageHeight; + editor.width = width / pageWidth; + editor.height = height / pageHeight; + return editor; + } + get hasBeenModified() { + return !!this.annotationElementId && (this.deleted || this.serialize() !== null); + } + remove() { + this.#focusAC?.abort(); + this.#focusAC = null; + if (!this.isEmpty()) { + this.commit(); + } + if (this.parent) { + this.parent.remove(this); + } else { + this._uiManager.removeEditor(this); + } + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + this.#moveInDOMTimeout = null; + } + this.#stopResizing(); + this.removeEditToolbar(); + if (this.#telemetryTimeouts) { + for (const timeout of this.#telemetryTimeouts.values()) { + clearTimeout(timeout); + } + this.#telemetryTimeouts = null; + } + this.parent = null; + this.#touchManager?.destroy(); + this.#touchManager = null; + } + get isResizable() { + return false; + } + makeResizable() { + if (this.isResizable) { + this.#createResizers(); + this.#resizersDiv.classList.remove("hidden"); + } + } + get toolbarPosition() { + return null; + } + keydown(event) { + if (!this.isResizable || event.target !== this.div || event.key !== "Enter") { + return; + } + this._uiManager.setSelected(this); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const children = this.#resizersDiv.children; + if (!this.#allResizerDivs) { + this.#allResizerDivs = Array.from(children); + const boundResizerKeydown = this.#resizerKeydown.bind(this); + const boundResizerBlur = this.#resizerBlur.bind(this); + const signal = this._uiManager._signal; + for (const div of this.#allResizerDivs) { + const name = div.getAttribute("data-resizer-name"); + div.setAttribute("role", "spinbutton"); + div.addEventListener("keydown", boundResizerKeydown, { + signal + }); + div.addEventListener("blur", boundResizerBlur, { + signal + }); + div.addEventListener("focus", this.#resizerFocus.bind(this, name), { + signal + }); + div.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + const first = this.#allResizerDivs[0]; + let firstPosition = 0; + for (const div of children) { + if (div === first) { + break; + } + firstPosition++; + } + const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4); + if (nextFirstPosition !== firstPosition) { + if (nextFirstPosition < firstPosition) { + for (let i = 0; i < firstPosition - nextFirstPosition; i++) { + this.#resizersDiv.append(this.#resizersDiv.firstChild); + } + } else if (nextFirstPosition > firstPosition) { + for (let i = 0; i < nextFirstPosition - firstPosition; i++) { + this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild); + } + } + let i = 0; + for (const child of children) { + const div = this.#allResizerDivs[i++]; + const name = div.getAttribute("data-resizer-name"); + child.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + this.#setResizerTabIndex(0); + this.#isResizerEnabledForKeyboard = true; + this.#resizersDiv.firstChild.focus({ + focusVisible: true + }); + event.preventDefault(); + event.stopImmediatePropagation(); + } + #resizerKeydown(event) { + AnnotationEditor._resizerKeyboardManager.exec(this, event); + } + #resizerBlur(event) { + if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) { + this.#stopResizing(); + } + } + #resizerFocus(name) { + this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : ""; + } + #setResizerTabIndex(value) { + if (!this.#allResizerDivs) { + return; + } + for (const div of this.#allResizerDivs) { + div.tabIndex = value; + } + } + _resizeWithKeyboard(x, y) { + if (!this.#isResizerEnabledForKeyboard) { + return; + } + this.#resizerPointermove(this.#focusedResizerName, { + deltaX: x, + deltaY: y, + fromKeyboard: true + }); + } + #stopResizing() { + this.#isResizerEnabledForKeyboard = false; + this.#setResizerTabIndex(-1); + this.#addResizeToUndoStack(); + } + _stopResizingWithKeyboard() { + this.#stopResizing(); + this.div.focus(); + } + select() { + this.makeResizable(); + this.div?.classList.add("selectedEditor"); + if (!this._editToolbar) { + this.addEditToolbar().then(() => { + if (this.div?.classList.contains("selectedEditor")) { + this._editToolbar?.show(); + } + }); + return; + } + this._editToolbar?.show(); + this.#altText?.toggleAltTextBadge(false); + } + unselect() { + this.#resizersDiv?.classList.add("hidden"); + this.div?.classList.remove("selectedEditor"); + if (this.div?.contains(document.activeElement)) { + this._uiManager.currentLayer.div.focus({ + preventScroll: true + }); + } + this._editToolbar?.hide(); + this.#altText?.toggleAltTextBadge(true); + } + updateParams(type, value) {} + disableEditing() {} + enableEditing() {} + enterInEditMode() {} + getElementForAltText() { + return this.div; + } + get contentDiv() { + return this.div; + } + get isEditing() { + return this.#isEditing; + } + set isEditing(value) { + this.#isEditing = value; + if (!this.parent) { + return; + } + if (value) { + this.parent.setSelected(this); + this.parent.setActiveEditor(this); + } else { + this.parent.setActiveEditor(null); + } + } + setAspectRatio(width, height) { + this.#keepAspectRatio = true; + const aspectRatio = width / height; + const { + style + } = this.div; + style.aspectRatio = aspectRatio; + style.height = "auto"; + } + static get MIN_SIZE() { + return 16; + } + static canCreateNewEmptyEditor() { + return true; + } + get telemetryInitialData() { + return { + action: "added" + }; + } + get telemetryFinalData() { + return null; + } + _reportTelemetry(data, mustWait = false) { + if (mustWait) { + this.#telemetryTimeouts ||= new Map(); + const { + action + } = data; + let timeout = this.#telemetryTimeouts.get(action); + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(() => { + this._reportTelemetry(data); + this.#telemetryTimeouts.delete(action); + if (this.#telemetryTimeouts.size === 0) { + this.#telemetryTimeouts = null; + } + }, AnnotationEditor._telemetryTimeout); + this.#telemetryTimeouts.set(action, timeout); + return; + } + data.type ||= this.editorType; + this._uiManager._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + show(visible = this._isVisible) { + this.div.classList.toggle("hidden", !visible); + this._isVisible = visible; + } + enable() { + if (this.div) { + this.div.tabIndex = 0; + } + this.#disabled = false; + } + disable() { + if (this.div) { + this.div.tabIndex = -1; + } + this.#disabled = true; + } + renderAnnotationElement(annotation) { + let content = annotation.container.querySelector(".annotationContent"); + if (!content) { + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + annotation.container.prepend(content); + } else if (content.nodeName === "CANVAS") { + const canvas = content; + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + canvas.before(content); + } + return content; + } + resetAnnotationElement(annotation) { + const { + firstChild + } = annotation.container; + if (firstChild?.nodeName === "DIV" && firstChild.classList.contains("annotationContent")) { + firstChild.remove(); + } + } +} +class FakeEditor extends AnnotationEditor { + constructor(params) { + super(params); + this.annotationElementId = params.annotationElementId; + this.deleted = true; + } + serialize() { + return this.serializeDeleted(); + } +} + +;// ./src/shared/murmurhash3.js +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if (ArrayBuffer.isView(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let 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; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + 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; + } + hexdigest() { + let h1 = this.h1, + 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; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} + +;// ./src/display/annotation_storage.js + + + +const SerializableEmpty = Object.freeze({ + map: null, + hash: "", + transfer: undefined +}); +class AnnotationStorage { + #modified = false; + #modifiedIds = null; + #storage = new Map(); + constructor() { + this.onSetModified = null; + this.onResetModified = null; + this.onAnnotationEditor = null; + } + getValue(key, defaultValue) { + const value = this.#storage.get(key); + if (value === undefined) { + return defaultValue; + } + return Object.assign(defaultValue, value); + } + getRawValue(key) { + return this.#storage.get(key); + } + remove(key) { + this.#storage.delete(key); + if (this.#storage.size === 0) { + this.resetModified(); + } + if (typeof this.onAnnotationEditor === "function") { + for (const value of this.#storage.values()) { + if (value instanceof AnnotationEditor) { + return; + } + } + this.onAnnotationEditor(null); + } + } + setValue(key, value) { + const obj = this.#storage.get(key); + let modified = false; + if (obj !== undefined) { + for (const [entry, val] of Object.entries(value)) { + if (obj[entry] !== val) { + modified = true; + obj[entry] = val; + } + } + } else { + modified = true; + this.#storage.set(key, value); + } + if (modified) { + this.#setModified(); + } + if (value instanceof AnnotationEditor && typeof this.onAnnotationEditor === "function") { + this.onAnnotationEditor(value.constructor._type); + } + } + has(key) { + return this.#storage.has(key); + } + get size() { + return this.#storage.size; + } + #setModified() { + if (!this.#modified) { + this.#modified = true; + if (typeof this.onSetModified === "function") { + this.onSetModified(); + } + } + } + resetModified() { + if (this.#modified) { + this.#modified = false; + if (typeof this.onResetModified === "function") { + this.onResetModified(); + } + } + } + get print() { + return new PrintAnnotationStorage(this); + } + get serializable() { + if (this.#storage.size === 0) { + return SerializableEmpty; + } + const map = new Map(), + hash = new MurmurHash3_64(), + transfer = []; + const context = Object.create(null); + let hasBitmap = false; + for (const [key, val] of this.#storage) { + const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val; + if (serialized) { + map.set(key, serialized); + hash.update(`${key}:${JSON.stringify(serialized)}`); + hasBitmap ||= !!serialized.bitmap; + } + } + if (hasBitmap) { + for (const value of map.values()) { + if (value.bitmap) { + transfer.push(value.bitmap); + } + } + } + return map.size > 0 ? { + map, + hash: hash.hexdigest(), + transfer + } : SerializableEmpty; + } + get editorStats() { + let stats = null; + const typeToEditor = new Map(); + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor)) { + continue; + } + const editorStats = value.telemetryFinalData; + if (!editorStats) { + continue; + } + const { + type + } = editorStats; + if (!typeToEditor.has(type)) { + typeToEditor.set(type, Object.getPrototypeOf(value).constructor); + } + stats ||= Object.create(null); + const map = stats[type] ||= new Map(); + for (const [key, val] of Object.entries(editorStats)) { + if (key === "type") { + continue; + } + let counters = map.get(key); + if (!counters) { + counters = new Map(); + map.set(key, counters); + } + const count = counters.get(val) ?? 0; + counters.set(val, count + 1); + } + } + for (const [type, editor] of typeToEditor) { + stats[type] = editor.computeTelemetryFinalData(stats[type]); + } + return stats; + } + resetModifiedIds() { + this.#modifiedIds = null; + } + get modifiedIds() { + if (this.#modifiedIds) { + return this.#modifiedIds; + } + const ids = []; + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor) || !value.annotationElementId || !value.serialize()) { + continue; + } + ids.push(value.annotationElementId); + } + return this.#modifiedIds = { + ids: new Set(ids), + hash: ids.join(",") + }; + } + [Symbol.iterator]() { + return this.#storage.entries(); + } +} +class PrintAnnotationStorage extends AnnotationStorage { + #serializable; + constructor(parent) { + super(); + const { + map, + hash, + transfer + } = parent.serializable; + const clone = structuredClone(map, transfer ? { + transfer + } : null); + this.#serializable = { + map: clone, + hash, + transfer + }; + } + get print() { + unreachable("Should not call PrintAnnotationStorage.print"); + } + get serializable() { + return this.#serializable; + } + get modifiedIds() { + return shadow(this, "modifiedIds", { + ids: new Set(), + hash: "" + }); + } +} + +;// ./src/display/font_loader.js + +class FontLoader { + #systemFonts = new Set(); + constructor({ + ownerDocument = globalThis.document, + styleElement = null + }) { + this._document = ownerDocument; + this.nativeFontFaces = new Set(); + this.styleElement = null; + this.loadingRequests = []; + this.loadTestFontId = 0; + } + addNativeFontFace(nativeFontFace) { + this.nativeFontFaces.add(nativeFontFace); + this._document.fonts.add(nativeFontFace); + } + removeNativeFontFace(nativeFontFace) { + this.nativeFontFaces.delete(nativeFontFace); + this._document.fonts.delete(nativeFontFace); + } + insertRule(rule) { + if (!this.styleElement) { + this.styleElement = this._document.createElement("style"); + this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement); + } + const styleSheet = this.styleElement.sheet; + styleSheet.insertRule(rule, styleSheet.cssRules.length); + } + clear() { + for (const nativeFontFace of this.nativeFontFaces) { + this._document.fonts.delete(nativeFontFace); + } + this.nativeFontFaces.clear(); + this.#systemFonts.clear(); + if (this.styleElement) { + this.styleElement.remove(); + this.styleElement = null; + } + } + async loadSystemFont({ + systemFontInfo: info, + disableFontFace, + _inspectFont + }) { + if (!info || this.#systemFonts.has(info.loadedName)) { + return; + } + assert(!disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set."); + if (this.isFontLoadingAPISupported) { + const { + loadedName, + src, + style + } = info; + const fontFace = new FontFace(loadedName, src, style); + this.addNativeFontFace(fontFace); + try { + await fontFace.load(); + this.#systemFonts.add(loadedName); + _inspectFont?.(info); + } catch { + warn(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`); + this.removeNativeFontFace(fontFace); + } + return; + } + unreachable("Not implemented: loadSystemFont without the Font Loading API."); + } + async bind(font) { + if (font.attached || font.missingFile && !font.systemFontInfo) { + return; + } + font.attached = true; + if (font.systemFontInfo) { + await this.loadSystemFont(font); + return; + } + if (this.isFontLoadingAPISupported) { + const nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + this.addNativeFontFace(nativeFontFace); + try { + await nativeFontFace.loaded; + } catch (ex) { + warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); + font.disableFontFace = true; + throw ex; + } + } + return; + } + const rule = font.createFontFaceRule(); + if (rule) { + this.insertRule(rule); + if (this.isSyncFontLoadingSupported) { + return; + } + await new Promise(resolve => { + const request = this._queueLoadingCallback(resolve); + this._prepareFontLoadEvent(font, request); + }); + } + } + get isFontLoadingAPISupported() { + const hasFonts = !!this._document?.fonts; + return shadow(this, "isFontLoadingAPISupported", hasFonts); + } + get isSyncFontLoadingSupported() { + return shadow(this, "isSyncFontLoadingSupported", isNodeJS || util_FeatureTest.platform.isFirefox); + } + _queueLoadingCallback(callback) { + function completeRequest() { + assert(!request.done, "completeRequest() cannot be called twice."); + request.done = true; + while (loadingRequests.length > 0 && loadingRequests[0].done) { + const otherRequest = loadingRequests.shift(); + setTimeout(otherRequest.callback, 0); + } + } + const { + loadingRequests + } = this; + const request = { + done: false, + complete: completeRequest, + callback + }; + loadingRequests.push(request); + return request; + } + get _loadTestFont() { + const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="); + return shadow(this, "_loadTestFont", testFont); + } + _prepareFontLoadEvent(font, request) { + 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) { + const chunk1 = s.substring(0, offset); + const chunk2 = s.substring(offset + remove); + return chunk1 + insert + chunk2; + } + let i, ii; + const canvas = this._document.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext("2d"); + let called = 0; + function isFontReady(name, callback) { + if (++called > 30) { + warn("Load test font never loaded."); + callback(); + return; + } + ctx.font = "30px " + name; + ctx.fillText(".", 0, 20); + const imageData = ctx.getImageData(0, 0, 1, 1); + if (imageData.data[3] > 0) { + callback(); + return; + } + setTimeout(isFontReady.bind(null, name, callback)); + } + const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`; + let data = this._loadTestFont; + const COMMENT_OFFSET = 976; + data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); + const CFF_CHECKSUM_OFFSET = 16; + const XXXX_VALUE = 0x58585858; + let 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) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0; + } + data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); + const url = `url(data:font/opentype;base64,${btoa(data)});`; + const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`; + this.insertRule(rule); + const div = this._document.createElement("div"); + div.style.visibility = "hidden"; + div.style.width = div.style.height = "10px"; + div.style.position = "absolute"; + div.style.top = div.style.left = "0px"; + for (const name of [font.loadedName, loadTestFontId]) { + const span = this._document.createElement("span"); + span.textContent = "Hi"; + span.style.fontFamily = name; + div.append(span); + } + this._document.body.append(div); + isFontReady(loadTestFontId, () => { + div.remove(); + request.complete(); + }); + } +} +class FontFaceObject { + constructor(translatedData, inspectFont = null) { + this.compiledGlyphs = Object.create(null); + for (const i in translatedData) { + this[i] = translatedData[i]; + } + this._inspectFont = inspectFont; + } + createNativeFontFace() { + if (!this.data || this.disableFontFace) { + return null; + } + let nativeFontFace; + if (!this.cssFontInfo) { + nativeFontFace = new FontFace(this.loadedName, this.data, {}); + } else { + const css = { + weight: this.cssFontInfo.fontWeight + }; + if (this.cssFontInfo.italicAngle) { + css.style = `oblique ${this.cssFontInfo.italicAngle}deg`; + } + nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css); + } + this._inspectFont?.(this); + return nativeFontFace; + } + createFontFaceRule() { + if (!this.data || this.disableFontFace) { + return null; + } + const url = `url(data:${this.mimetype};base64,${toBase64Util(this.data)});`; + let rule; + if (!this.cssFontInfo) { + rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; + } else { + let css = `font-weight: ${this.cssFontInfo.fontWeight};`; + if (this.cssFontInfo.italicAngle) { + css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`; + } + rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`; + } + this._inspectFont?.(this, url); + return rule; + } + getPathGenerator(objs, character) { + if (this.compiledGlyphs[character] !== undefined) { + return this.compiledGlyphs[character]; + } + const objId = this.loadedName + "_path_" + character; + let cmds; + try { + cmds = objs.get(objId); + } catch (ex) { + warn(`getPathGenerator - ignoring character: "${ex}".`); + } + const path = new Path2D(cmds || ""); + if (!this.fontExtraProperties) { + objs.delete(objId); + } + return this.compiledGlyphs[character] = path; + } +} + +;// ./src/shared/message_handler.js + +const CallbackKind = { + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function onFn() {} +function wrapReason(ex) { + if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) { + return ex; + } + if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (ex.name) { + case "AbortException": + return new AbortException(ex.message); + case "InvalidPDFException": + return new InvalidPDFException(ex.message); + case "PasswordException": + return new PasswordException(ex.message, ex.code); + case "ResponseException": + return new ResponseException(ex.message, ex.status, ex.missing); + case "UnknownErrorException": + return new UnknownErrorException(ex.message, ex.details); + } + return new UnknownErrorException(ex.message, ex.toString()); +} +class MessageHandler { + #messageAC = new AbortController(); + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data + }) { + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + Promise.try(action, data.data).then(function (result) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this.#createStreamSink(data); + return; + } + action(data.data); + } + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = Promise.withResolvers(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk, size = 1, transfers) { + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = Promise.withResolvers(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + assert(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: Promise.withResolvers(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + Promise.try(action, data.data, streamSink).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + Promise.try(streamSink.onPull || onFn).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(dataReason); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); + } + } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.#messageAC?.abort(); + this.#messageAC = null; + } +} + +;// ./src/display/canvas_factory.js + +class BaseCanvasFactory { + #enableHWA = false; + constructor({ + enableHWA = false + }) { + this.#enableHWA = enableHWA; + } + create(width, height) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + const canvas = this._createCanvas(width, height); + return { + canvas, + context: canvas.getContext("2d", { + willReadFrequently: !this.#enableHWA + }) + }; + } + reset(canvasAndContext, width, height) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + if (width <= 0 || height <= 0) { + throw new Error("Invalid canvas size"); + } + canvasAndContext.canvas.width = width; + canvasAndContext.canvas.height = height; + } + destroy(canvasAndContext) { + if (!canvasAndContext.canvas) { + throw new Error("Canvas is not specified"); + } + canvasAndContext.canvas.width = 0; + canvasAndContext.canvas.height = 0; + canvasAndContext.canvas = null; + canvasAndContext.context = null; + } + _createCanvas(width, height) { + unreachable("Abstract method `_createCanvas` called."); + } +} +class DOMCanvasFactory extends BaseCanvasFactory { + constructor({ + ownerDocument = globalThis.document, + enableHWA = false + }) { + super({ + enableHWA + }); + this._document = ownerDocument; + } + _createCanvas(width, height) { + const canvas = this._document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; + } +} + +;// ./src/display/cmap_reader_factory.js + + +class BaseCMapReaderFactory { + constructor({ + baseUrl = null, + isCompressed = true + }) { + this.baseUrl = baseUrl; + this.isCompressed = isCompressed; + } + async fetch({ + name + }) { + if (!this.baseUrl) { + throw new Error("Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided."); + } + if (!name) { + throw new Error("CMap name must be specified."); + } + const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : ""); + return this._fetch(url).then(cMapData => ({ + cMapData, + isCompressed: this.isCompressed + })).catch(reason => { + throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMCMapReaderFactory extends BaseCMapReaderFactory { + async _fetch(url) { + const data = await fetchData(url, this.isCompressed ? "arraybuffer" : "text"); + return data instanceof ArrayBuffer ? new Uint8Array(data) : stringToBytes(data); + } +} + +;// ./src/display/filter_factory.js + + +class BaseFilterFactory { + addFilter(maps) { + return "none"; + } + addHCMFilter(fgColor, bgColor) { + return "none"; + } + addAlphaFilter(map) { + return "none"; + } + addLuminosityFilter(map) { + return "none"; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + return "none"; + } + destroy(keepHCM = false) {} +} +class DOMFilterFactory extends BaseFilterFactory { + #baseUrl; + #_cache; + #_defs; + #docId; + #document; + #_hcmCache; + #id = 0; + constructor({ + docId, + ownerDocument = globalThis.document + }) { + super(); + this.#docId = docId; + this.#document = ownerDocument; + } + get #cache() { + return this.#_cache ||= new Map(); + } + get #hcmCache() { + return this.#_hcmCache ||= new Map(); + } + get #defs() { + if (!this.#_defs) { + const div = this.#document.createElement("div"); + const { + style + } = div; + style.visibility = "hidden"; + style.contain = "strict"; + style.width = style.height = 0; + style.position = "absolute"; + style.top = style.left = 0; + style.zIndex = -1; + const svg = this.#document.createElementNS(SVG_NS, "svg"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + this.#_defs = this.#document.createElementNS(SVG_NS, "defs"); + div.append(svg); + svg.append(this.#_defs); + this.#document.body.append(div); + } + return this.#_defs; + } + #createTables(maps) { + if (maps.length === 1) { + const mapR = maps[0]; + const buffer = new Array(256); + for (let i = 0; i < 256; i++) { + buffer[i] = mapR[i] / 255; + } + const table = buffer.join(","); + return [table, table, table]; + } + const [mapR, mapG, mapB] = maps; + const bufferR = new Array(256); + const bufferG = new Array(256); + const bufferB = new Array(256); + for (let i = 0; i < 256; i++) { + bufferR[i] = mapR[i] / 255; + bufferG[i] = mapG[i] / 255; + bufferB[i] = mapB[i] / 255; + } + return [bufferR.join(","), bufferG.join(","), bufferB.join(",")]; + } + #createUrl(id) { + if (this.#baseUrl === undefined) { + this.#baseUrl = ""; + const url = this.#document.URL; + if (url !== this.#document.baseURI) { + if (isDataScheme(url)) { + warn('#createUrl: ignore "data:"-URL for performance reasons.'); + } else { + this.#baseUrl = updateUrlHash(url, ""); + } + } + } + return `url(${this.#baseUrl}#${id})`; + } + addFilter(maps) { + if (!maps) { + return "none"; + } + let value = this.#cache.get(maps); + if (value) { + return value; + } + const [tableR, tableG, tableB] = this.#createTables(maps); + const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(maps, value); + return value; + } + const id = `g_${this.#docId}_transfer_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(maps, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapConversion(tableR, tableG, tableB, filter); + return url; + } + addHCMFilter(fgColor, bgColor) { + const key = `${fgColor}-${bgColor}`; + const filterName = "base"; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const fgRGB = this.#getRGB(fgColor); + fgColor = Util.makeHexColor(...fgRGB); + const bgRGB = this.#getRGB(bgColor); + bgColor = Util.makeHexColor(...bgRGB); + this.#defs.style.color = ""; + if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) { + return info.url; + } + const map = new Array(256); + for (let i = 0; i <= 255; i++) { + const x = i / 255; + map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; + } + const table = map.join(","); + const id = `g_${this.#docId}_hcm_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addTransferMapConversion(table, table, table, filter); + this.#addGrayConversion(filter); + const getSteps = (c, n) => { + const start = fgRGB[c] / 255; + const end = bgRGB[c] / 255; + const arr = new Array(n + 1); + for (let i = 0; i <= n; i++) { + arr[i] = start + i / n * (end - start); + } + return arr.join(","); + }; + this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + addAlphaFilter(map) { + let value = this.#cache.get(map); + if (value) { + return value; + } + const [tableA] = this.#createTables([map]); + const key = `alpha_${tableA}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_alpha_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapAlphaConversion(tableA, filter); + return url; + } + addLuminosityFilter(map) { + let value = this.#cache.get(map || "luminosity"); + if (value) { + return value; + } + let tableA, key; + if (map) { + [tableA] = this.#createTables([map]); + key = `luminosity_${tableA}`; + } else { + key = "luminosity"; + } + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addLuminosityConversion(filter); + if (map) { + this.#addTransferMapAlphaConversion(tableA, filter); + } + return url; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this)); + let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]); + let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]); + let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getRGB.bind(this)); + if (bgGray < fgGray) { + [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB]; + } + this.#defs.style.color = ""; + const getSteps = (fg, bg, n) => { + const arr = new Array(256); + const step = (bgGray - fgGray) / n; + const newStart = fg / 255; + const newStep = (bg - fg) / (255 * n); + let prev = 0; + for (let i = 0; i <= n; i++) { + const k = Math.round(fgGray + i * step); + const value = newStart + i * newStep; + for (let j = prev; j <= k; j++) { + arr[j] = value; + } + prev = k + 1; + } + for (let i = prev; i < 256; i++) { + arr[i] = arr[prev - 1]; + } + return arr.join(","); + }; + const id = `g_${this.#docId}_hcm_${filterName}_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addGrayConversion(filter); + this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + destroy(keepHCM = false) { + if (keepHCM && this.#_hcmCache?.size) { + return; + } + this.#_defs?.parentNode.parentNode.remove(); + this.#_defs = null; + this.#_cache?.clear(); + this.#_cache = null; + this.#_hcmCache?.clear(); + this.#_hcmCache = null; + this.#id = 0; + } + #addLuminosityConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"); + filter.append(feColorMatrix); + } + #addGrayConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"); + filter.append(feColorMatrix); + } + #createFilter(id) { + const filter = this.#document.createElementNS(SVG_NS, "filter"); + filter.setAttribute("color-interpolation-filters", "sRGB"); + filter.setAttribute("id", id); + this.#defs.append(filter); + return filter; + } + #appendFeFunc(feComponentTransfer, func, table) { + const feFunc = this.#document.createElementNS(SVG_NS, func); + feFunc.setAttribute("type", "discrete"); + feFunc.setAttribute("tableValues", table); + feComponentTransfer.append(feFunc); + } + #addTransferMapConversion(rTable, gTable, bTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncR", rTable); + this.#appendFeFunc(feComponentTransfer, "feFuncG", gTable); + this.#appendFeFunc(feComponentTransfer, "feFuncB", bTable); + } + #addTransferMapAlphaConversion(aTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncA", aTable); + } + #getRGB(color) { + this.#defs.style.color = color; + return getRGB(getComputedStyle(this.#defs).getPropertyValue("color")); + } +} + +;// ./src/display/standard_fontdata_factory.js + + +class BaseStandardFontDataFactory { + constructor({ + baseUrl = null + }) { + this.baseUrl = baseUrl; + } + async fetch({ + filename + }) { + if (!this.baseUrl) { + throw new Error("Ensure that the `standardFontDataUrl` API parameter is provided."); + } + if (!filename) { + throw new Error("Font filename must be specified."); + } + const url = `${this.baseUrl}${filename}`; + return this._fetch(url).catch(reason => { + throw new Error(`Unable to load font data at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMStandardFontDataFactory extends BaseStandardFontDataFactory { + async _fetch(url) { + const data = await fetchData(url, "arraybuffer"); + return new Uint8Array(data); + } +} + +;// ./src/display/wasm_factory.js + + +class BaseWasmFactory { + constructor({ + baseUrl = null + }) { + this.baseUrl = baseUrl; + } + async fetch({ + filename + }) { + if (!this.baseUrl) { + throw new Error("Ensure that the `wasmUrl` API parameter is provided."); + } + if (!filename) { + throw new Error("Wasm filename must be specified."); + } + const url = `${this.baseUrl}${filename}`; + return this._fetch(url).catch(reason => { + throw new Error(`Unable to load wasm data at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMWasmFactory extends BaseWasmFactory { + async _fetch(url) { + const data = await fetchData(url, "arraybuffer"); + return new Uint8Array(data); + } +} + +;// ./src/display/node_utils.js + + + + + + +if (isNodeJS) { + warn("Please use the `legacy` build in Node.js environments."); +} +async function node_utils_fetchData(url) { + const fs = process.getBuiltinModule("fs"); + const data = await fs.promises.readFile(url); + return new Uint8Array(data); +} +class NodeFilterFactory extends BaseFilterFactory {} +class NodeCanvasFactory extends BaseCanvasFactory { + _createCanvas(width, height) { + const require = process.getBuiltinModule("module").createRequire(import.meta.url); + const canvas = require("@napi-rs/canvas"); + return canvas.createCanvas(width, height); + } +} +class NodeCMapReaderFactory extends BaseCMapReaderFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} +class NodeStandardFontDataFactory extends BaseStandardFontDataFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} +class NodeWasmFactory extends BaseWasmFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} + +;// ./src/display/pattern_helper.js + + +const PathType = { + FILL: "Fill", + STROKE: "Stroke", + SHADING: "Shading" +}; +function applyBoundingBox(ctx, bbox) { + if (!bbox) { + return; + } + const width = bbox[2] - bbox[0]; + const height = bbox[3] - bbox[1]; + const region = new Path2D(); + region.rect(bbox[0], bbox[1], width, height); + ctx.clip(region); +} +class BaseShadingPattern { + isModifyingCurrentTransform() { + return false; + } + getPattern() { + unreachable("Abstract method `getPattern` called."); + } +} +class RadialAxialShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._type = IR[1]; + this._bbox = IR[2]; + this._colorStops = IR[3]; + this._p0 = IR[4]; + this._p1 = IR[5]; + this._r0 = IR[6]; + this._r1 = IR[7]; + this.matrix = null; + } + _createGradient(ctx) { + let grad; + if (this._type === "axial") { + grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]); + } else if (this._type === "radial") { + grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1); + } + for (const colorStop of this._colorStops) { + grad.addColorStop(colorStop[0], colorStop[1]); + } + return grad; + } + getPattern(ctx, owner, inverse, pathType) { + let pattern; + if (pathType === PathType.STROKE || pathType === PathType.FILL) { + const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, getCurrentTransform(ctx)) || [0, 0, 0, 0]; + const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1; + const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1; + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.beginPath(); + tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); + tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]); + inverse = Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]); + tmpCtx.transform(...owner.baseTransform); + if (this.matrix) { + tmpCtx.transform(...this.matrix); + } + applyBoundingBox(tmpCtx, this._bbox); + tmpCtx.fillStyle = this._createGradient(tmpCtx); + tmpCtx.fill(); + pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat"); + const domMatrix = new DOMMatrix(inverse); + pattern.setTransform(domMatrix); + } else { + applyBoundingBox(ctx, this._bbox); + pattern = this._createGradient(ctx); + } + return pattern; + } +} +function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { + const coords = context.coords, + colors = context.colors; + const bytes = data.data, + rowSize = data.width * 4; + let 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; + } + const x1 = (coords[p1] + context.offsetX) * context.scaleX; + const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; + const x2 = (coords[p2] + context.offsetX) * context.scaleX; + const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; + const x3 = (coords[p3] + context.offsetX) * context.scaleX; + const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; + if (y1 >= y3) { + return; + } + const c1r = colors[c1], + c1g = colors[c1 + 1], + c1b = colors[c1 + 2]; + const c2r = colors[c2], + c2g = colors[c2 + 1], + c2b = colors[c2 + 2]; + const c3r = colors[c3], + c3g = colors[c3 + 1], + c3b = colors[c3 + 2]; + const minY = Math.round(y1), + maxY = Math.round(y3); + let xa, car, cag, cab; + let xb, cbr, cbg, cbb; + for (let y = minY; y <= maxY; y++) { + if (y < y2) { + const k = y < y1 ? 0 : (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 { + let k; + if (y > y3) { + k = 1; + } else if (y2 === y3) { + k = 0; + } else { + k = (y2 - y) / (y2 - y3); + } + xa = x2 - (x2 - x3) * k; + car = c2r - (c2r - c3r) * k; + cag = c2g - (c2g - c3g) * k; + cab = c2b - (c2b - c3b) * k; + } + let k; + if (y < y1) { + k = 0; + } else if (y > y3) { + k = 1; + } else { + k = (y1 - y) / (y1 - y3); + } + xb = x1 - (x1 - x3) * k; + cbr = c1r - (c1r - c3r) * k; + cbg = c1g - (c1g - c3g) * k; + cbb = c1b - (c1b - c3b) * k; + const x1_ = Math.round(Math.min(xa, xb)); + const x2_ = Math.round(Math.max(xa, xb)); + let j = rowSize * y + x1_ * 4; + for (let x = x1_; x <= x2_; x++) { + k = (xa - x) / (xa - xb); + if (k < 0) { + k = 0; + } else if (k > 1) { + k = 1; + } + 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) { + const ps = figure.coords; + const cs = figure.colors; + let i, ii; + switch (figure.type) { + case "lattice": + const verticesPerRow = figure.verticesPerRow; + const rows = Math.floor(ps.length / verticesPerRow) - 1; + const cols = verticesPerRow - 1; + for (i = 0; i < rows; i++) { + let q = i * verticesPerRow; + for (let 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: + throw new Error("illegal figure"); + } +} +class MeshShadingPattern extends BaseShadingPattern { + constructor(IR) { + super(); + this._coords = IR[2]; + this._colors = IR[3]; + this._figures = IR[4]; + this._bounds = IR[5]; + this._bbox = IR[6]; + this._background = IR[7]; + this.matrix = null; + } + _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) { + const EXPECTED_SCALE = 1.1; + const MAX_PATTERN_SIZE = 3000; + const BORDER_SIZE = 2; + const offsetX = Math.floor(this._bounds[0]); + const offsetY = Math.floor(this._bounds[1]); + const boundsWidth = Math.ceil(this._bounds[2]) - offsetX; + const boundsHeight = Math.ceil(this._bounds[3]) - offsetY; + const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + const scaleX = boundsWidth / width; + const scaleY = boundsHeight / height; + const context = { + coords: this._coords, + colors: this._colors, + offsetX: -offsetX, + offsetY: -offsetY, + scaleX: 1 / scaleX, + scaleY: 1 / scaleY + }; + const paddedWidth = width + BORDER_SIZE * 2; + const paddedHeight = height + BORDER_SIZE * 2; + const tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight); + const tmpCtx = tmpCanvas.context; + const data = tmpCtx.createImageData(width, height); + if (backgroundColor) { + const bytes = data.data; + for (let 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 (const figure of this._figures) { + drawFigure(data, figure, context); + } + tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); + const canvas = tmpCanvas.canvas; + return { + canvas, + offsetX: offsetX - BORDER_SIZE * scaleX, + offsetY: offsetY - BORDER_SIZE * scaleY, + scaleX, + scaleY + }; + } + isModifyingCurrentTransform() { + return true; + } + getPattern(ctx, owner, inverse, pathType) { + applyBoundingBox(ctx, this._bbox); + const scale = new Float32Array(2); + if (pathType === PathType.SHADING) { + Util.singularValueDecompose2dScale(getCurrentTransform(ctx), scale); + } else if (this.matrix) { + Util.singularValueDecompose2dScale(this.matrix, scale); + const [matrixScaleX, matrixScaleY] = scale; + Util.singularValueDecompose2dScale(owner.baseTransform, scale); + scale[0] *= matrixScaleX; + scale[1] *= matrixScaleY; + } else { + Util.singularValueDecompose2dScale(owner.baseTransform, scale); + } + const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.cachedCanvases); + if (pathType !== PathType.SHADING) { + ctx.setTransform(...owner.baseTransform); + if (this.matrix) { + ctx.transform(...this.matrix); + } + } + ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); + return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat"); + } +} +class DummyShadingPattern extends BaseShadingPattern { + getPattern() { + return "hotpink"; + } +} +function getShadingPattern(IR) { + switch (IR[0]) { + case "RadialAxial": + return new RadialAxialShadingPattern(IR); + case "Mesh": + return new MeshShadingPattern(IR); + case "Dummy": + return new DummyShadingPattern(); + } + throw new Error(`Unknown IR type: ${IR[0]}`); +} +const PaintType = { + COLORED: 1, + UNCOLORED: 2 +}; +class TilingPattern { + static MAX_PATTERN_SIZE = 3000; + constructor(IR, ctx, canvasGraphicsFactory, baseTransform) { + this.color = IR[1]; + this.operatorList = IR[2]; + this.matrix = IR[3]; + this.bbox = IR[4]; + this.xstep = IR[5]; + this.ystep = IR[6]; + this.paintType = IR[7]; + this.tilingType = IR[8]; + this.ctx = ctx; + this.canvasGraphicsFactory = canvasGraphicsFactory; + this.baseTransform = baseTransform; + } + createPatternCanvas(owner) { + const { + bbox, + operatorList, + paintType, + tilingType, + color, + canvasGraphicsFactory + } = this; + let { + xstep, + ystep + } = this; + xstep = Math.abs(xstep); + ystep = Math.abs(ystep); + info("TilingType: " + tilingType); + const x0 = bbox[0], + y0 = bbox[1], + x1 = bbox[2], + y1 = bbox[3]; + const width = x1 - x0; + const height = y1 - y0; + const scale = new Float32Array(2); + Util.singularValueDecompose2dScale(this.matrix, scale); + const [matrixScaleX, matrixScaleY] = scale; + Util.singularValueDecompose2dScale(this.baseTransform, scale); + const combinedScaleX = matrixScaleX * scale[0]; + const combinedScaleY = matrixScaleY * scale[1]; + let canvasWidth = width, + canvasHeight = height, + redrawHorizontally = false, + redrawVertically = false; + const xScaledStep = Math.ceil(xstep * combinedScaleX); + const yScaledStep = Math.ceil(ystep * combinedScaleY); + const xScaledWidth = Math.ceil(width * combinedScaleX); + const yScaledHeight = Math.ceil(height * combinedScaleY); + if (xScaledStep >= xScaledWidth) { + canvasWidth = xstep; + } else { + redrawHorizontally = true; + } + if (yScaledStep >= yScaledHeight) { + canvasHeight = ystep; + } else { + redrawVertically = true; + } + const dimx = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size); + const tmpCtx = tmpCanvas.context; + const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); + graphics.groupLevel = owner.groupLevel; + this.setFillAndStrokeStyleToContext(graphics, paintType, color); + tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0); + graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0); + tmpCtx.save(); + this.clipBbox(graphics, x0, y0, x1, y1); + graphics.baseTransform = getCurrentTransform(graphics.ctx); + graphics.executeOperatorList(operatorList); + graphics.endDrawing(); + tmpCtx.restore(); + if (redrawHorizontally || redrawVertically) { + const image = tmpCanvas.canvas; + if (redrawHorizontally) { + canvasWidth = xstep; + } + if (redrawVertically) { + canvasHeight = ystep; + } + const dimx2 = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy2 = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const xSize = dimx2.size; + const ySize = dimy2.size; + const tmpCanvas2 = owner.cachedCanvases.getCanvas("pattern-workaround", xSize, ySize); + const tmpCtx2 = tmpCanvas2.context; + const ii = redrawHorizontally ? Math.floor(width / xstep) : 0; + const jj = redrawVertically ? Math.floor(height / ystep) : 0; + for (let i = 0; i <= ii; i++) { + for (let j = 0; j <= jj; j++) { + tmpCtx2.drawImage(image, xSize * i, ySize * j, xSize, ySize, 0, 0, xSize, ySize); + } + } + return { + canvas: tmpCanvas2.canvas, + scaleX: dimx2.scale, + scaleY: dimy2.scale, + offsetX: x0, + offsetY: y0 + }; + } + return { + canvas: tmpCanvas.canvas, + scaleX: dimx.scale, + scaleY: dimy.scale, + offsetX: x0, + offsetY: y0 + }; + } + getSizeAndScale(step, realOutputSize, scale) { + const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize); + let size = Math.ceil(step * scale); + if (size >= maxSize) { + size = maxSize; + } else { + scale = size / step; + } + return { + scale, + size + }; + } + clipBbox(graphics, x0, y0, x1, y1) { + const bboxWidth = x1 - x0; + const bboxHeight = y1 - y0; + graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); + Util.axialAlignedBoundingBox([x0, y0, x1, y1], getCurrentTransform(graphics.ctx), graphics.current.minMax); + graphics.clip(); + graphics.endPath(); + } + setFillAndStrokeStyleToContext(graphics, paintType, color) { + const context = graphics.ctx, + current = graphics.current; + switch (paintType) { + case PaintType.COLORED: + const ctx = this.ctx; + context.fillStyle = ctx.fillStyle; + context.strokeStyle = ctx.strokeStyle; + current.fillColor = ctx.fillStyle; + current.strokeColor = ctx.strokeStyle; + break; + case PaintType.UNCOLORED: + const cssColor = Util.makeHexColor(color[0], color[1], color[2]); + context.fillStyle = cssColor; + context.strokeStyle = cssColor; + current.fillColor = cssColor; + current.strokeColor = cssColor; + break; + default: + throw new FormatError(`Unsupported paint type: ${paintType}`); + } + } + isModifyingCurrentTransform() { + return false; + } + getPattern(ctx, owner, inverse, pathType) { + let matrix = inverse; + if (pathType !== PathType.SHADING) { + matrix = Util.transform(matrix, owner.baseTransform); + if (this.matrix) { + matrix = Util.transform(matrix, this.matrix); + } + } + const temporaryPatternCanvas = this.createPatternCanvas(owner); + let domMatrix = new DOMMatrix(matrix); + domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY); + const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat"); + pattern.setTransform(domMatrix); + return pattern; + } +} + +;// ./src/shared/image_utils.js + +function convertToRGBA(params) { + switch (params.kind) { + case ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; + dest[destPos + 3] = s3 >>> 8 | 0xff000000; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; + dest[destPos + 3] = s3 << 8 | 0xff; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; + } + } + return { + srcPos: srcPos + len, + destPos + }; +} +function grayToRGBA(src, dest) { + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +;// ./src/display/canvas.js + + + + +const MIN_FONT_SIZE = 16; +const MAX_FONT_SIZE = 100; +const EXECUTION_TIME = 15; +const EXECUTION_STEPS = 10; +const FULL_CHUNK_HEIGHT = 16; +const SCALE_MATRIX = new DOMMatrix(); +const XY = new Float32Array(2); +const MIN_MAX_INIT = new Float32Array([Infinity, Infinity, -Infinity, -Infinity]); +function mirrorContextOperations(ctx, destCtx) { + if (ctx._removeMirroring) { + throw new Error("Context is already forwarding operations."); + } + 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.__originalResetTransform = ctx.resetTransform; + ctx.__originalClip = ctx.clip; + ctx.__originalMoveTo = ctx.moveTo; + ctx.__originalLineTo = ctx.lineTo; + ctx.__originalBezierCurveTo = ctx.bezierCurveTo; + ctx.__originalRect = ctx.rect; + ctx.__originalClosePath = ctx.closePath; + ctx.__originalBeginPath = ctx.beginPath; + ctx._removeMirroring = () => { + ctx.save = ctx.__originalSave; + ctx.restore = ctx.__originalRestore; + ctx.rotate = ctx.__originalRotate; + ctx.scale = ctx.__originalScale; + ctx.translate = ctx.__originalTranslate; + ctx.transform = ctx.__originalTransform; + ctx.setTransform = ctx.__originalSetTransform; + ctx.resetTransform = ctx.__originalResetTransform; + ctx.clip = ctx.__originalClip; + ctx.moveTo = ctx.__originalMoveTo; + ctx.lineTo = ctx.__originalLineTo; + ctx.bezierCurveTo = ctx.__originalBezierCurveTo; + ctx.rect = ctx.__originalRect; + ctx.closePath = ctx.__originalClosePath; + ctx.beginPath = ctx.__originalBeginPath; + delete ctx._removeMirroring; + }; + ctx.save = function () { + destCtx.save(); + this.__originalSave(); + }; + ctx.restore = function () { + destCtx.restore(); + this.__originalRestore(); + }; + ctx.translate = function (x, y) { + destCtx.translate(x, y); + this.__originalTranslate(x, y); + }; + ctx.scale = function (x, y) { + destCtx.scale(x, y); + this.__originalScale(x, y); + }; + ctx.transform = function (a, b, c, d, e, f) { + destCtx.transform(a, b, c, d, e, f); + this.__originalTransform(a, b, c, d, e, f); + }; + ctx.setTransform = function (a, b, c, d, e, f) { + destCtx.setTransform(a, b, c, d, e, f); + this.__originalSetTransform(a, b, c, d, e, f); + }; + ctx.resetTransform = function () { + destCtx.resetTransform(); + this.__originalResetTransform(); + }; + ctx.rotate = function (angle) { + destCtx.rotate(angle); + this.__originalRotate(angle); + }; + ctx.clip = function (rule) { + destCtx.clip(rule); + this.__originalClip(rule); + }; + ctx.moveTo = function (x, y) { + destCtx.moveTo(x, y); + this.__originalMoveTo(x, y); + }; + ctx.lineTo = function (x, y) { + destCtx.lineTo(x, y); + this.__originalLineTo(x, y); + }; + ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { + destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + }; + ctx.rect = function (x, y, width, height) { + destCtx.rect(x, y, width, height); + this.__originalRect(x, y, width, height); + }; + ctx.closePath = function () { + destCtx.closePath(); + this.__originalClosePath(); + }; + ctx.beginPath = function () { + destCtx.beginPath(); + this.__originalBeginPath(); + }; +} +class CachedCanvases { + constructor(canvasFactory) { + this.canvasFactory = canvasFactory; + this.cache = Object.create(null); + } + getCanvas(id, width, height) { + let canvasEntry; + if (this.cache[id] !== undefined) { + canvasEntry = this.cache[id]; + this.canvasFactory.reset(canvasEntry, width, height); + } else { + canvasEntry = this.canvasFactory.create(width, height); + this.cache[id] = canvasEntry; + } + return canvasEntry; + } + delete(id) { + delete this.cache[id]; + } + clear() { + for (const id in this.cache) { + const canvasEntry = this.cache[id]; + this.canvasFactory.destroy(canvasEntry); + delete this.cache[id]; + } + } +} +function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) { + const [a, b, c, d, tx, ty] = getCurrentTransform(ctx); + if (b === 0 && c === 0) { + const tlX = destX * a + tx; + const rTlX = Math.round(tlX); + const tlY = destY * d + ty; + const rTlY = Math.round(tlY); + const brX = (destX + destW) * a + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destY + destH) * d + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight); + ctx.setTransform(a, b, c, d, tx, ty); + return [rWidth, rHeight]; + } + if (a === 0 && d === 0) { + const tlX = destY * c + tx; + const rTlX = Math.round(tlX); + const tlY = destX * b + ty; + const rTlY = Math.round(tlY); + const brX = (destY + destH) * c + tx; + const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; + const brY = (destX + destW) * b + ty; + const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; + ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY); + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth); + ctx.setTransform(a, b, c, d, tx, ty); + return [rHeight, rWidth]; + } + ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH); + const scaleX = Math.hypot(a, b); + const scaleY = Math.hypot(c, d); + return [scaleX * destW, scaleY * destH]; +} +class CanvasExtraState { + alphaIsShape = false; + fontSize = 0; + fontSizeScale = 1; + textMatrix = null; + textMatrixScale = 1; + fontMatrix = FONT_IDENTITY_MATRIX; + leading = 0; + x = 0; + y = 0; + lineX = 0; + lineY = 0; + charSpacing = 0; + wordSpacing = 0; + textHScale = 1; + textRenderingMode = TextRenderingMode.FILL; + textRise = 0; + fillColor = "#000000"; + strokeColor = "#000000"; + patternFill = false; + patternStroke = false; + fillAlpha = 1; + strokeAlpha = 1; + lineWidth = 1; + activeSMask = null; + transferMaps = "none"; + constructor(width, height) { + this.clipBox = new Float32Array([0, 0, width, height]); + this.minMax = MIN_MAX_INIT.slice(); + } + clone() { + const clone = Object.create(this); + clone.clipBox = this.clipBox.slice(); + clone.minMax = this.minMax.slice(); + return clone; + } + getPathBoundingBox(pathType = PathType.FILL, transform = null) { + const box = this.minMax.slice(); + if (pathType === PathType.STROKE) { + if (!transform) { + unreachable("Stroke bounding box must include transform."); + } + Util.singularValueDecompose2dScale(transform, XY); + const xStrokePad = XY[0] * this.lineWidth / 2; + const yStrokePad = XY[1] * this.lineWidth / 2; + box[0] -= xStrokePad; + box[1] -= yStrokePad; + box[2] += xStrokePad; + box[3] += yStrokePad; + } + return box; + } + updateClipFromPath() { + const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox()); + this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]); + } + isEmptyClip() { + return this.minMax[0] === Infinity; + } + startNewPathAndClipBox(box) { + this.clipBox.set(box, 0); + this.minMax.set(MIN_MAX_INIT, 0); + } + getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) { + return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); + } +} +function putBinaryImageData(ctx, imgData) { + if (imgData instanceof ImageData) { + ctx.putImageData(imgData, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0, + destPos; + const src = imgData.data; + const dest = chunkImgData.data; + let i, j, thisChunkHeight, elemsInThisChunk; + if (imgData.kind === util_ImageKind.GRAYSCALE_1BPP) { + const srcLength = src.byteLength; + const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2); + const dest32DataLength = dest32.length; + const fullSrcDiff = width + 7 >> 3; + const white = 0xffffffff; + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + for (i = 0; i < totalChunks; i++) { + thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + destPos = 0; + for (j = 0; j < thisChunkHeight; j++) { + const srcDiff = srcLength - srcPos; + let k = 0; + const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; + const kEndUnrolled = kEnd & ~7; + let mask = 0; + let 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; + } + } + while (destPos < dest32DataLength) { + dest32[destPos++] = 0; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else if (imgData.kind === util_ImageKind.RGBA_32BPP) { + 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 === util_ImageKind.RGB_24BPP) { + 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 { + throw new Error(`bad image kind: ${imgData.kind}`); + } +} +function putBinaryImageMask(ctx, imgData) { + if (imgData.bitmap) { + ctx.drawImage(imgData.bitmap, 0, 0); + return; + } + const height = imgData.height, + width = imgData.width; + const partialChunkHeight = height % FULL_CHUNK_HEIGHT; + const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + let srcPos = 0; + const src = imgData.data; + const dest = chunkImgData.data; + for (let i = 0; i < totalChunks; i++) { + const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + ({ + srcPos + } = convertBlackAndWhiteToRGBA({ + src, + srcPos, + dest, + width, + height: thisChunkHeight, + nonBlackColor: 0 + })); + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } +} +function copyCtxState(sourceCtx, destCtx) { + const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"]; + for (const property of properties) { + if (sourceCtx[property] !== undefined) { + destCtx[property] = sourceCtx[property]; + } + } + if (sourceCtx.setLineDash !== undefined) { + destCtx.setLineDash(sourceCtx.getLineDash()); + destCtx.lineDashOffset = sourceCtx.lineDashOffset; + } +} +function resetCtxToDefault(ctx) { + ctx.strokeStyle = ctx.fillStyle = "#000000"; + ctx.fillRule = "nonzero"; + ctx.globalAlpha = 1; + ctx.lineWidth = 1; + ctx.lineCap = "butt"; + ctx.lineJoin = "miter"; + ctx.miterLimit = 10; + ctx.globalCompositeOperation = "source-over"; + ctx.font = "10px sans-serif"; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash([]); + ctx.lineDashOffset = 0; + } + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } +} +function getImageSmoothingEnabled(transform, interpolate) { + if (interpolate) { + return true; + } + Util.singularValueDecompose2dScale(transform, XY); + const actualScale = Math.fround(OutputScale.pixelRatio * PixelsPerInch.PDF_TO_CSS_UNITS); + return XY[0] <= actualScale && XY[1] <= actualScale; +} +const LINE_CAP_STYLES = ["butt", "round", "square"]; +const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; +const NORMAL_CLIP = {}; +const EO_CLIP = {}; +class CanvasGraphics { + constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, { + optionalContentConfig, + markedContentStack = null + }, annotationCanvasMap, pageColors) { + this.ctx = canvasCtx; + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.stateStack = []; + this.pendingClip = null; + this.pendingEOFill = false; + this.res = null; + this.xobjs = null; + this.commonObjs = commonObjs; + this.objs = objs; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this.groupStack = []; + this.baseTransform = null; + this.baseTransformStack = []; + this.groupLevel = 0; + this.smaskStack = []; + this.smaskCounter = 0; + this.tempSMask = null; + this.suspendedCtx = null; + this.contentVisible = true; + this.markedContentStack = markedContentStack || []; + this.optionalContentConfig = optionalContentConfig; + this.cachedCanvases = new CachedCanvases(this.canvasFactory); + this.cachedPatterns = new Map(); + this.annotationCanvasMap = annotationCanvasMap; + this.viewportScale = 1; + this.outputScaleX = 1; + this.outputScaleY = 1; + this.pageColors = pageColors; + this._cachedScaleForStroking = [-1, 0]; + this._cachedGetSinglePixelWidth = null; + this._cachedBitmapsMap = new Map(); + } + getObject(data, fallback = null) { + if (typeof data === "string") { + return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); + } + return fallback; + } + beginDrawing({ + transform, + viewport, + transparency = false, + background = null + }) { + const width = this.ctx.canvas.width; + const height = this.ctx.canvas.height; + const savedFillStyle = this.ctx.fillStyle; + this.ctx.fillStyle = background || "#ffffff"; + this.ctx.fillRect(0, 0, width, height); + this.ctx.fillStyle = savedFillStyle; + if (transparency) { + const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height); + this.compositeCtx = this.ctx; + this.transparentCanvas = transparentCanvas.canvas; + this.ctx = transparentCanvas.context; + this.ctx.save(); + this.ctx.transform(...getCurrentTransform(this.compositeCtx)); + } + this.ctx.save(); + resetCtxToDefault(this.ctx); + if (transform) { + this.ctx.transform(...transform); + this.outputScaleX = transform[0]; + this.outputScaleY = transform[0]; + } + this.ctx.transform(...viewport.transform); + this.viewportScale = viewport.scale; + this.baseTransform = getCurrentTransform(this.ctx); + } + executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) { + const argsArray = operatorList.argsArray; + const fnArray = operatorList.fnArray; + let i = executionStartIdx || 0; + const argsArrayLen = argsArray.length; + if (argsArrayLen === i) { + return i; + } + const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function"; + const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; + let steps = 0; + const commonObjs = this.commonObjs; + const objs = this.objs; + let 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 { + for (const depObjId of argsArray[i]) { + const objsPool = depObjId.startsWith("g_") ? commonObjs : objs; + if (!objsPool.has(depObjId)) { + objsPool.get(depObjId, continueCallback); + return i; + } + } + } + i++; + if (i === argsArrayLen) { + return i; + } + if (chunkOperations && ++steps > EXECUTION_STEPS) { + if (Date.now() > endTime) { + continueCallback(); + return i; + } + steps = 0; + } + } + } + #restoreInitialState() { + while (this.stateStack.length || this.inSMaskMode) { + this.restore(); + } + this.current.activeSMask = null; + this.ctx.restore(); + if (this.transparentCanvas) { + this.ctx = this.compositeCtx; + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.drawImage(this.transparentCanvas, 0, 0); + this.ctx.restore(); + this.transparentCanvas = null; + } + } + endDrawing() { + this.#restoreInitialState(); + this.cachedCanvases.clear(); + this.cachedPatterns.clear(); + for (const cache of this._cachedBitmapsMap.values()) { + for (const canvas of cache.values()) { + if (typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement) { + canvas.width = canvas.height = 0; + } + } + cache.clear(); + } + this._cachedBitmapsMap.clear(); + this.#drawFilter(); + } + #drawFilter() { + if (this.pageColors) { + const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background); + if (hcmFilterId !== "none") { + const savedFilter = this.ctx.filter; + this.ctx.filter = hcmFilterId; + this.ctx.drawImage(this.ctx.canvas, 0, 0); + this.ctx.filter = savedFilter; + } + } + } + _scaleImage(img, inverseTransform) { + const width = img.width ?? img.displayWidth; + const height = img.height ?? img.displayHeight; + let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1); + let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1); + let paintWidth = width, + paintHeight = height; + let tmpCanvasId = "prescale1"; + let tmpCanvas, tmpCtx; + while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) { + let newWidth = paintWidth, + newHeight = paintHeight; + if (widthScale > 2 && paintWidth > 1) { + newWidth = paintWidth >= 16384 ? Math.floor(paintWidth / 2) - 1 || 1 : Math.ceil(paintWidth / 2); + widthScale /= paintWidth / newWidth; + } + if (heightScale > 2 && paintHeight > 1) { + newHeight = paintHeight >= 16384 ? Math.floor(paintHeight / 2) - 1 || 1 : 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(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); + img = tmpCanvas.canvas; + paintWidth = newWidth; + paintHeight = newHeight; + tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1"; + } + return { + img, + paintWidth, + paintHeight + }; + } + _createMaskCanvas(img) { + const ctx = this.ctx; + const { + width, + height + } = img; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + const currentTransform = getCurrentTransform(ctx); + let cache, cacheKey, scaled, maskCanvas; + if ((img.bitmap || img.data) && img.count > 1) { + const mainKey = img.bitmap || img.data.buffer; + cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]); + cache = this._cachedBitmapsMap.get(mainKey); + if (!cache) { + cache = new Map(); + this._cachedBitmapsMap.set(mainKey, cache); + } + const cachedImage = cache.get(cacheKey); + if (cachedImage && !isPatternFill) { + const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]); + const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]); + return { + canvas: cachedImage, + offsetX, + offsetY + }; + } + scaled = cachedImage; + } + if (!scaled) { + maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + putBinaryImageMask(maskCanvas.context, img); + } + let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); + maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); + const minMax = MIN_MAX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, width, height], maskToCanvas, minMax); + const [minX, minY, maxX, maxY] = minMax; + const drawnWidth = Math.round(maxX - minX) || 1; + const drawnHeight = Math.round(maxY - minY) || 1; + const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight); + const fillCtx = fillCanvas.context; + const offsetX = minX; + const offsetY = minY; + fillCtx.translate(-offsetX, -offsetY); + fillCtx.transform(...maskToCanvas); + if (!scaled) { + scaled = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx)); + scaled = scaled.img; + if (cache && isPatternFill) { + cache.set(cacheKey, scaled); + } + } + fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate); + drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height); + fillCtx.globalCompositeOperation = "source-in"; + const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); + fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL) : fillColor; + fillCtx.fillRect(0, 0, width, height); + if (cache && !isPatternFill) { + this.cachedCanvases.delete("fillCanvas"); + cache.set(cacheKey, fillCanvas.canvas); + } + return { + canvas: fillCanvas.canvas, + offsetX: Math.round(offsetX), + offsetY: Math.round(offsetY) + }; + } + setLineWidth(width) { + if (width !== this.current.lineWidth) { + this._cachedScaleForStroking[0] = -1; + } + this.current.lineWidth = width; + this.ctx.lineWidth = width; + } + setLineCap(style) { + this.ctx.lineCap = LINE_CAP_STYLES[style]; + } + setLineJoin(style) { + this.ctx.lineJoin = LINE_JOIN_STYLES[style]; + } + setMiterLimit(limit) { + this.ctx.miterLimit = limit; + } + setDash(dashArray, dashPhase) { + const ctx = this.ctx; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash(dashArray); + ctx.lineDashOffset = dashPhase; + } + } + setRenderingIntent(intent) {} + setFlatness(flatness) {} + setGState(states) { + for (const [key, value] of states) { + 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 = value; + break; + case "ca": + this.ctx.globalAlpha = this.current.fillAlpha = value; + break; + case "BM": + this.ctx.globalCompositeOperation = value; + break; + case "SMask": + this.current.activeSMask = value ? this.tempSMask : null; + this.tempSMask = null; + this.checkSMaskState(); + break; + case "TR": + this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value); + break; + } + } + } + get inSMaskMode() { + return !!this.suspendedCtx; + } + checkSMaskState() { + const inSMaskMode = this.inSMaskMode; + if (this.current.activeSMask && !inSMaskMode) { + this.beginSMaskMode(); + } else if (!this.current.activeSMask && inSMaskMode) { + this.endSMaskMode(); + } + } + beginSMaskMode() { + if (this.inSMaskMode) { + throw new Error("beginSMaskMode called while already in smask mode"); + } + const drawnWidth = this.ctx.canvas.width; + const drawnHeight = this.ctx.canvas.height; + const cacheId = "smaskGroupAt" + this.groupLevel; + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + this.suspendedCtx = this.ctx; + const ctx = this.ctx = scratchCanvas.context; + ctx.setTransform(this.suspendedCtx.getTransform()); + copyCtxState(this.suspendedCtx, ctx); + mirrorContextOperations(ctx, this.suspendedCtx); + this.setGState([["BM", "source-over"]]); + } + endSMaskMode() { + if (!this.inSMaskMode) { + throw new Error("endSMaskMode called while not in smask mode"); + } + this.ctx._removeMirroring(); + copyCtxState(this.ctx, this.suspendedCtx); + this.ctx = this.suspendedCtx; + this.suspendedCtx = null; + } + compose(dirtyBox) { + if (!this.current.activeSMask) { + return; + } + if (!dirtyBox) { + dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height]; + } else { + dirtyBox[0] = Math.floor(dirtyBox[0]); + dirtyBox[1] = Math.floor(dirtyBox[1]); + dirtyBox[2] = Math.ceil(dirtyBox[2]); + dirtyBox[3] = Math.ceil(dirtyBox[3]); + } + const smask = this.current.activeSMask; + const suspendedCtx = this.suspendedCtx; + this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox); + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); + this.ctx.restore(); + } + composeSMask(ctx, smask, layerCtx, layerBox) { + const layerOffsetX = layerBox[0]; + const layerOffsetY = layerBox[1]; + const layerWidth = layerBox[2] - layerOffsetX; + const layerHeight = layerBox[3] - layerOffsetY; + if (layerWidth === 0 || layerHeight === 0) { + return; + } + this.genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, smask.subtype, smask.backdrop, smask.transferMap, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY); + ctx.save(); + ctx.globalAlpha = 1; + ctx.globalCompositeOperation = "source-over"; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(layerCtx.canvas, 0, 0); + ctx.restore(); + } + genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) { + let maskCanvas = maskCtx.canvas; + let maskX = layerOffsetX - maskOffsetX; + let maskY = layerOffsetY - maskOffsetY; + if (backdrop) { + const backdropRGB = Util.makeHexColor(...backdrop); + if (maskX < 0 || maskY < 0 || maskX + width > maskCanvas.width || maskY + height > maskCanvas.height) { + const canvas = this.cachedCanvases.getCanvas("maskExtension", width, height); + const ctx = canvas.context; + ctx.drawImage(maskCanvas, -maskX, -maskY); + ctx.globalCompositeOperation = "destination-atop"; + ctx.fillStyle = backdropRGB; + ctx.fillRect(0, 0, width, height); + ctx.globalCompositeOperation = "source-over"; + maskCanvas = canvas.canvas; + maskX = maskY = 0; + } else { + maskCtx.save(); + maskCtx.globalAlpha = 1; + maskCtx.setTransform(1, 0, 0, 1, 0, 0); + const clip = new Path2D(); + clip.rect(maskX, maskY, width, height); + maskCtx.clip(clip); + maskCtx.globalCompositeOperation = "destination-atop"; + maskCtx.fillStyle = backdropRGB; + maskCtx.fillRect(maskX, maskY, width, height); + maskCtx.restore(); + } + } + layerCtx.save(); + layerCtx.globalAlpha = 1; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + if (subtype === "Alpha" && transferMap) { + layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap); + } else if (subtype === "Luminosity") { + layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap); + } + const clip = new Path2D(); + clip.rect(layerOffsetX, layerOffsetY, width, height); + layerCtx.clip(clip); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.drawImage(maskCanvas, maskX, maskY, width, height, layerOffsetX, layerOffsetY, width, height); + layerCtx.restore(); + } + save() { + if (this.inSMaskMode) { + copyCtxState(this.ctx, this.suspendedCtx); + } + this.ctx.save(); + const old = this.current; + this.stateStack.push(old); + this.current = old.clone(); + } + restore() { + if (this.stateStack.length === 0) { + if (this.inSMaskMode) { + this.endSMaskMode(); + } + return; + } + this.current = this.stateStack.pop(); + this.ctx.restore(); + if (this.inSMaskMode) { + copyCtxState(this.suspendedCtx, this.ctx); + } + this.checkSMaskState(); + this.pendingClip = null; + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + transform(a, b, c, d, e, f) { + this.ctx.transform(a, b, c, d, e, f); + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + constructPath(op, data, minMax) { + let [path] = data; + if (!minMax) { + path ||= data[0] = new Path2D(); + this[op](path); + return; + } + if (!(path instanceof Path2D)) { + const path2d = data[0] = new Path2D(); + for (let i = 0, ii = path.length; i < ii;) { + switch (path[i++]) { + case DrawOPS.moveTo: + path2d.moveTo(path[i++], path[i++]); + break; + case DrawOPS.lineTo: + path2d.lineTo(path[i++], path[i++]); + break; + case DrawOPS.curveTo: + path2d.bezierCurveTo(path[i++], path[i++], path[i++], path[i++], path[i++], path[i++]); + break; + case DrawOPS.closePath: + path2d.closePath(); + break; + default: + warn(`Unrecognized drawing path operator: ${path[i - 1]}`); + break; + } + } + path = path2d; + } + Util.axialAlignedBoundingBox(minMax, getCurrentTransform(this.ctx), this.current.minMax); + this[op](path); + } + closePath() { + this.ctx.closePath(); + } + stroke(path, consumePath = true) { + const ctx = this.ctx; + const strokeColor = this.current.strokeColor; + ctx.globalAlpha = this.current.strokeAlpha; + if (this.contentVisible) { + if (typeof strokeColor === "object" && strokeColor?.getPattern) { + const baseTransform = strokeColor.isModifyingCurrentTransform() ? ctx.getTransform() : null; + ctx.save(); + ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE); + if (baseTransform) { + const newPath = new Path2D(); + newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform)); + path = newPath; + } + this.rescaleAndStroke(path, false); + ctx.restore(); + } else { + this.rescaleAndStroke(path, true); + } + } + if (consumePath) { + this.consumePath(path, this.current.getClippedPathBoundingBox(PathType.STROKE, getCurrentTransform(this.ctx))); + } + ctx.globalAlpha = this.current.fillAlpha; + } + closeStroke(path) { + this.stroke(path); + } + fill(path, consumePath = true) { + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + let needRestore = false; + if (isPatternFill) { + const baseTransform = fillColor.isModifyingCurrentTransform() ? ctx.getTransform() : null; + ctx.save(); + ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL); + if (baseTransform) { + const newPath = new Path2D(); + newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform)); + path = newPath; + } + needRestore = true; + } + const intersect = this.current.getClippedPathBoundingBox(); + if (this.contentVisible && intersect !== null) { + if (this.pendingEOFill) { + ctx.fill(path, "evenodd"); + this.pendingEOFill = false; + } else { + ctx.fill(path); + } + } + if (needRestore) { + ctx.restore(); + } + if (consumePath) { + this.consumePath(path, intersect); + } + } + eoFill(path) { + this.pendingEOFill = true; + this.fill(path); + } + fillStroke(path) { + this.fill(path, false); + this.stroke(path, false); + this.consumePath(path); + } + eoFillStroke(path) { + this.pendingEOFill = true; + this.fillStroke(path); + } + closeFillStroke(path) { + this.fillStroke(path); + } + closeEOFillStroke(path) { + this.pendingEOFill = true; + this.fillStroke(path); + } + endPath(path) { + this.consumePath(path); + } + rawFillPath(path) { + this.ctx.fill(path); + } + clip() { + this.pendingClip = NORMAL_CLIP; + } + eoClip() { + this.pendingClip = EO_CLIP; + } + beginText() { + this.current.textMatrix = null; + this.current.textMatrixScale = 1; + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + } + endText() { + const paths = this.pendingTextPaths; + const ctx = this.ctx; + if (paths === undefined) { + return; + } + const newPath = new Path2D(); + const invTransf = ctx.getTransform().invertSelf(); + for (const { + transform, + x, + y, + fontSize, + path + } of paths) { + newPath.addPath(path, new DOMMatrix(transform).preMultiplySelf(invTransf).translate(x, y).scale(fontSize, -fontSize)); + } + ctx.clip(newPath); + delete this.pendingTextPaths; + } + setCharSpacing(spacing) { + this.current.charSpacing = spacing; + } + setWordSpacing(spacing) { + this.current.wordSpacing = spacing; + } + setHScale(scale) { + this.current.textHScale = scale / 100; + } + setLeading(leading) { + this.current.leading = -leading; + } + setFont(fontRefName, size) { + const fontObj = this.commonObjs.get(fontRefName); + const current = this.current; + if (!fontObj) { + throw new Error(`Can't find font for ${fontRefName}`); + } + current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX; + if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { + warn("Invalid font matrix for font " + fontRefName); + } + if (size < 0) { + size = -size; + current.fontDirection = -1; + } else { + current.fontDirection = 1; + } + this.current.font = fontObj; + this.current.fontSize = size; + if (fontObj.isType3Font) { + return; + } + const name = fontObj.loadedName || "sans-serif"; + const typeface = fontObj.systemFontInfo?.css || `"${name}", ${fontObj.fallbackName}`; + let bold = "normal"; + if (fontObj.black) { + bold = "900"; + } else if (fontObj.bold) { + bold = "bold"; + } + const italic = fontObj.italic ? "italic" : "normal"; + let browserFontSize = size; + if (size < MIN_FONT_SIZE) { + browserFontSize = MIN_FONT_SIZE; + } else if (size > MAX_FONT_SIZE) { + browserFontSize = MAX_FONT_SIZE; + } + this.current.fontSizeScale = size / browserFontSize; + this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`; + } + setTextRenderingMode(mode) { + this.current.textRenderingMode = mode; + } + setTextRise(rise) { + this.current.textRise = rise; + } + moveText(x, y) { + this.current.x = this.current.lineX += x; + this.current.y = this.current.lineY += y; + } + setLeadingMoveText(x, y) { + this.setLeading(-y); + this.moveText(x, y); + } + setTextMatrix(matrix) { + const { + current + } = this; + current.textMatrix = matrix; + current.textMatrixScale = Math.hypot(matrix[0], matrix[1]); + current.x = current.lineX = 0; + current.y = current.lineY = 0; + } + nextLine() { + this.moveText(0, this.current.leading); + } + #getScaledPath(path, currentTransform, transform) { + const newPath = new Path2D(); + newPath.addPath(path, new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform)); + return newPath; + } + paintChar(character, x, y, patternFillTransform, patternStrokeTransform) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const textRenderingMode = current.textRenderingMode; + const fontSize = current.fontSize / current.fontSizeScale; + const fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + const patternFill = current.patternFill && !font.missingFile; + const patternStroke = current.patternStroke && !font.missingFile; + let path; + if (font.disableFontFace || isAddToPathSet || patternFill || patternStroke) { + path = font.getPathGenerator(this.commonObjs, character); + } + if (font.disableFontFace || patternFill || patternStroke) { + ctx.save(); + ctx.translate(x, y); + ctx.scale(fontSize, -fontSize); + let currentTransform; + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternFillTransform) { + currentTransform = ctx.getTransform(); + ctx.setTransform(...patternFillTransform); + ctx.fill(this.#getScaledPath(path, currentTransform, patternFillTransform)); + } else { + ctx.fill(path); + } + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternStrokeTransform) { + currentTransform ||= ctx.getTransform(); + ctx.setTransform(...patternStrokeTransform); + const { + a, + b, + c, + d + } = currentTransform; + const invPatternTransform = Util.inverseTransform(patternStrokeTransform); + const transf = Util.transform([a, b, c, d, 0, 0], invPatternTransform); + Util.singularValueDecompose2dScale(transf, XY); + ctx.lineWidth *= Math.max(XY[0], XY[1]) / fontSize; + ctx.stroke(this.#getScaledPath(path, currentTransform, patternStrokeTransform)); + } else { + ctx.lineWidth /= fontSize; + ctx.stroke(path); + } + } + 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) { + const paths = this.pendingTextPaths ||= []; + paths.push({ + transform: getCurrentTransform(ctx), + x, + y, + fontSize, + path + }); + } + } + get isFontSubpixelAAEnabled() { + const { + context: ctx + } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10); + ctx.scale(1.5, 1); + ctx.fillText("I", 0, 10); + const data = ctx.getImageData(0, 0, 10, 10).data; + let enabled = false; + for (let i = 3; i < data.length; i += 4) { + if (data[i] > 0 && data[i] < 255) { + enabled = true; + break; + } + } + return shadow(this, "isFontSubpixelAAEnabled", enabled); + } + showText(glyphs) { + const current = this.current; + const font = current.font; + if (font.isType3Font) { + return this.showType3Text(glyphs); + } + const fontSize = current.fontSize; + if (fontSize === 0) { + return undefined; + } + const ctx = this.ctx; + const fontSizeScale = current.fontSizeScale; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const fontDirection = current.fontDirection; + const textHScale = current.textHScale * fontDirection; + const glyphsLength = glyphs.length; + const vertical = font.vertical; + const spacingDir = vertical ? 1 : -1; + const defaultVMetrics = font.defaultVMetrics; + const widthAdvanceScale = fontSize * current.fontMatrix[0]; + const simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; + ctx.save(); + if (current.textMatrix) { + ctx.transform(...current.textMatrix); + } + ctx.translate(current.x, current.y + current.textRise); + if (fontDirection > 0) { + ctx.scale(textHScale, -1); + } else { + ctx.scale(textHScale, 1); + } + let patternFillTransform, patternStrokeTransform; + if (current.patternFill) { + ctx.save(); + const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL); + patternFillTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.fillStyle = pattern; + } + if (current.patternStroke) { + ctx.save(); + const pattern = current.strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE); + patternStrokeTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.strokeStyle = pattern; + } + let lineWidth = current.lineWidth; + const scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + lineWidth = this.getSinglePixelWidth(); + } + } else { + lineWidth /= scale; + } + if (fontSizeScale !== 1.0) { + ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } + ctx.lineWidth = lineWidth; + if (font.isInvalidPDFjsFont) { + const chars = []; + let width = 0; + for (const glyph of glyphs) { + chars.push(glyph.unicode); + width += glyph.width; + } + ctx.fillText(chars.join(""), 0, 0); + current.x += width * widthAdvanceScale * textHScale; + ctx.restore(); + this.compose(); + return undefined; + } + let x = 0, + i; + for (i = 0; i < glyphsLength; ++i) { + const glyph = glyphs[i]; + if (typeof glyph === "number") { + x += spacingDir * glyph * fontSize / 1000; + continue; + } + let restoreNeeded = false; + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const character = glyph.fontChar; + const accent = glyph.accent; + let scaledX, scaledY; + let width = glyph.width; + if (vertical) { + const vmetric = glyph.vmetric || defaultVMetrics; + const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale; + const 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) { + const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; + if (width < measuredWidth && this.isFontSubpixelAAEnabled) { + const characterScaleX = width / measuredWidth; + restoreNeeded = true; + ctx.save(); + ctx.scale(characterScaleX, 1); + scaledX /= characterScaleX; + } else if (width !== measuredWidth) { + scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale; + } + } + if (this.contentVisible && (glyph.isInFont || font.missingFile)) { + if (simpleFillText && !accent) { + ctx.fillText(character, scaledX, scaledY); + } else { + this.paintChar(character, scaledX, scaledY, patternFillTransform, patternStrokeTransform); + if (accent) { + const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; + const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; + this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternFillTransform, patternStrokeTransform); + } + } + } + const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection; + x += charWidth; + if (restoreNeeded) { + ctx.restore(); + } + } + if (vertical) { + current.y -= x; + } else { + current.x += x * textHScale; + } + ctx.restore(); + this.compose(); + return undefined; + } + showType3Text(glyphs) { + const ctx = this.ctx; + const current = this.current; + const font = current.font; + const fontSize = current.fontSize; + const fontDirection = current.fontDirection; + const spacingDir = font.vertical ? 1 : -1; + const charSpacing = current.charSpacing; + const wordSpacing = current.wordSpacing; + const textHScale = current.textHScale * fontDirection; + const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + const glyphsLength = glyphs.length; + const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE; + let i, glyph, width, spacingLength; + if (isTextInvisible || fontSize === 0) { + return; + } + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + ctx.save(); + if (current.textMatrix) { + ctx.transform(...current.textMatrix); + } + ctx.translate(current.x, current.y + current.textRise); + ctx.scale(textHScale, fontDirection); + for (i = 0; i < glyphsLength; ++i) { + glyph = glyphs[i]; + if (typeof glyph === "number") { + spacingLength = spacingDir * glyph * fontSize / 1000; + this.ctx.translate(spacingLength, 0); + current.x += spacingLength * textHScale; + continue; + } + const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + const operatorList = font.charProcOperatorList[glyph.operatorListId]; + if (!operatorList) { + warn(`Type3 character "${glyph.operatorListId}" is not available.`); + } else if (this.contentVisible) { + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform(...fontMatrix); + this.executeOperatorList(operatorList); + this.restore(); + } + const p = [glyph.width, 0]; + Util.applyTransform(p, fontMatrix); + width = p[0] * fontSize + spacing; + ctx.translate(width, 0); + current.x += width * textHScale; + } + ctx.restore(); + } + setCharWidth(xWidth, yWidth) {} + setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { + const clip = new Path2D(); + clip.rect(llx, lly, urx - llx, ury - lly); + this.ctx.clip(clip); + this.endPath(); + } + getColorN_Pattern(IR) { + let pattern; + if (IR[0] === "TilingPattern") { + const baseTransform = this.baseTransform || getCurrentTransform(this.ctx); + const canvasGraphicsFactory = { + createCanvasGraphics: ctx => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig: this.optionalContentConfig, + markedContentStack: this.markedContentStack + }) + }; + pattern = new TilingPattern(IR, this.ctx, canvasGraphicsFactory, baseTransform); + } else { + pattern = this._getPattern(IR[1], IR[2]); + } + return pattern; + } + setStrokeColorN() { + this.current.strokeColor = this.getColorN_Pattern(arguments); + this.current.patternStroke = true; + } + setFillColorN() { + this.current.fillColor = this.getColorN_Pattern(arguments); + this.current.patternFill = true; + } + setStrokeRGBColor(r, g, b) { + this.ctx.strokeStyle = this.current.strokeColor = Util.makeHexColor(r, g, b); + this.current.patternStroke = false; + } + setStrokeTransparent() { + this.ctx.strokeStyle = this.current.strokeColor = "transparent"; + this.current.patternStroke = false; + } + setFillRGBColor(r, g, b) { + this.ctx.fillStyle = this.current.fillColor = Util.makeHexColor(r, g, b); + this.current.patternFill = false; + } + setFillTransparent() { + this.ctx.fillStyle = this.current.fillColor = "transparent"; + this.current.patternFill = false; + } + _getPattern(objId, matrix = null) { + let pattern; + if (this.cachedPatterns.has(objId)) { + pattern = this.cachedPatterns.get(objId); + } else { + pattern = getShadingPattern(this.getObject(objId)); + this.cachedPatterns.set(objId, pattern); + } + if (matrix) { + pattern.matrix = matrix; + } + return pattern; + } + shadingFill(objId) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + this.save(); + const pattern = this._getPattern(objId); + ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING); + const inv = getCurrentTransformInverse(ctx); + if (inv) { + const { + width, + height + } = ctx.canvas; + const minMax = MIN_MAX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, width, height], inv, minMax); + const [x0, y0, x1, y1] = minMax; + this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); + } else { + this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + } + this.compose(this.current.getClippedPathBoundingBox()); + this.restore(); + } + beginInlineImage() { + unreachable("Should not call beginInlineImage"); + } + beginImageData() { + unreachable("Should not call beginImageData"); + } + paintFormXObjectBegin(matrix, bbox) { + if (!this.contentVisible) { + return; + } + this.save(); + this.baseTransformStack.push(this.baseTransform); + if (matrix) { + this.transform(...matrix); + } + this.baseTransform = getCurrentTransform(this.ctx); + if (bbox) { + Util.axialAlignedBoundingBox(bbox, this.baseTransform, this.current.minMax); + const [x0, y0, x1, y1] = bbox; + const clip = new Path2D(); + clip.rect(x0, y0, x1 - x0, y1 - y0); + this.ctx.clip(clip); + this.endPath(); + } + } + paintFormXObjectEnd() { + if (!this.contentVisible) { + return; + } + this.restore(); + this.baseTransform = this.baseTransformStack.pop(); + } + beginGroup(group) { + if (!this.contentVisible) { + return; + } + this.save(); + if (this.inSMaskMode) { + this.endSMaskMode(); + this.current.activeSMask = null; + } + const currentCtx = this.ctx; + if (!group.isolated) { + info("TODO: Support non-isolated groups."); + } + if (group.knockout) { + warn("Knockout groups not supported."); + } + const currentTransform = getCurrentTransform(currentCtx); + if (group.matrix) { + currentCtx.transform(...group.matrix); + } + if (!group.bbox) { + throw new Error("Bounding box is required."); + } + let bounds = MIN_MAX_INIT.slice(); + Util.axialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx), bounds); + const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; + bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; + const offsetX = Math.floor(bounds[0]); + const offsetY = Math.floor(bounds[1]); + const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); + this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]); + let cacheId = "groupAt" + this.groupLevel; + if (group.smask) { + cacheId += "_smask_" + this.smaskCounter++ % 2; + } + const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + const groupCtx = scratchCanvas.context; + groupCtx.translate(-offsetX, -offsetY); + groupCtx.transform(...currentTransform); + let clip = new Path2D(); + const [x0, y0, x1, y1] = group.bbox; + clip.rect(x0, y0, x1 - x0, y1 - y0); + if (group.matrix) { + const path = new Path2D(); + path.addPath(clip, new DOMMatrix(group.matrix)); + clip = path; + } + groupCtx.clip(clip); + if (group.smask) { + this.smaskStack.push({ + canvas: scratchCanvas.canvas, + context: groupCtx, + offsetX, + offsetY, + subtype: group.smask.subtype, + backdrop: group.smask.backdrop, + transferMap: group.smask.transferMap || null, + startTransformInverse: null + }); + } else { + currentCtx.setTransform(1, 0, 0, 1, 0, 0); + currentCtx.translate(offsetX, offsetY); + currentCtx.save(); + } + copyCtxState(currentCtx, groupCtx); + this.ctx = groupCtx; + this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + this.groupStack.push(currentCtx); + this.groupLevel++; + } + endGroup(group) { + if (!this.contentVisible) { + return; + } + this.groupLevel--; + const groupCtx = this.ctx; + const ctx = this.groupStack.pop(); + this.ctx = ctx; + this.ctx.imageSmoothingEnabled = false; + if (group.smask) { + this.tempSMask = this.smaskStack.pop(); + this.restore(); + } else { + this.ctx.restore(); + const currentMtx = getCurrentTransform(this.ctx); + this.restore(); + this.ctx.save(); + this.ctx.setTransform(...currentMtx); + const dirtyBox = MIN_MAX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx, dirtyBox); + this.ctx.drawImage(groupCtx.canvas, 0, 0); + this.ctx.restore(); + this.compose(dirtyBox); + } + } + beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) { + this.#restoreInitialState(); + resetCtxToDefault(this.ctx); + this.ctx.save(); + this.save(); + if (this.baseTransform) { + this.ctx.setTransform(...this.baseTransform); + } + if (rect) { + const width = rect[2] - rect[0]; + const height = rect[3] - rect[1]; + if (hasOwnCanvas && this.annotationCanvasMap) { + transform = transform.slice(); + transform[4] -= rect[0]; + transform[5] -= rect[1]; + rect = rect.slice(); + rect[0] = rect[1] = 0; + rect[2] = width; + rect[3] = height; + Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx), XY); + const { + viewportScale + } = this; + const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale); + const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale); + this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight); + const { + canvas, + context + } = this.annotationCanvas; + this.annotationCanvasMap.set(id, canvas); + this.annotationCanvas.savedCtx = this.ctx; + this.ctx = context; + this.ctx.save(); + this.ctx.setTransform(XY[0], 0, 0, -XY[1], 0, height * XY[1]); + resetCtxToDefault(this.ctx); + } else { + resetCtxToDefault(this.ctx); + this.endPath(); + const clip = new Path2D(); + clip.rect(rect[0], rect[1], width, height); + this.ctx.clip(clip); + } + } + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.transform(...transform); + this.transform(...matrix); + } + endAnnotation() { + if (this.annotationCanvas) { + this.ctx.restore(); + this.#drawFilter(); + this.ctx = this.annotationCanvas.savedCtx; + delete this.annotationCanvas.savedCtx; + delete this.annotationCanvas; + } + } + paintImageMaskXObject(img) { + if (!this.contentVisible) { + return; + } + const count = img.count; + img = this.getObject(img.data, img); + img.count = count; + const ctx = this.ctx; + const mask = this._createMaskCanvas(img); + const maskCanvas = mask.canvas; + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY); + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectRepeat(img, scaleX, skewX = 0, skewY = 0, scaleY, positions) { + if (!this.contentVisible) { + return; + } + img = this.getObject(img.data, img); + const ctx = this.ctx; + ctx.save(); + const currentTransform = getCurrentTransform(ctx); + ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0); + const mask = this._createMaskCanvas(img); + ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); + ctx.drawImage(mask.canvas, trans[4], trans[5]); + } + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectGroup(images) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + for (const image of images) { + const { + data, + width, + height, + transform + } = image; + const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + const maskCtx = maskCanvas.context; + maskCtx.save(); + const img = this.getObject(data, image); + putBinaryImageMask(maskCtx, img); + maskCtx.globalCompositeOperation = "source-in"; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL) : fillColor; + maskCtx.fillRect(0, 0, width, height); + maskCtx.restore(); + ctx.save(); + ctx.transform(...transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintImageXObject(objId) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + this.paintInlineImageXObject(imgData); + } + paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + const width = imgData.width; + const height = imgData.height; + const map = []; + for (let 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); + } + applyTransferMapsToCanvas(ctx) { + if (this.current.transferMaps !== "none") { + ctx.filter = this.current.transferMaps; + ctx.drawImage(ctx.canvas, 0, 0); + ctx.filter = "none"; + } + return ctx.canvas; + } + applyTransferMapsToBitmap(imgData) { + if (this.current.transferMaps === "none") { + return imgData.bitmap; + } + const { + bitmap, + width, + height + } = imgData; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.filter = this.current.transferMaps; + tmpCtx.drawImage(bitmap, 0, 0); + tmpCtx.filter = "none"; + return tmpCanvas.canvas; + } + paintInlineImageXObject(imgData) { + if (!this.contentVisible) { + return; + } + const width = imgData.width; + const height = imgData.height; + const ctx = this.ctx; + this.save(); + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } + ctx.scale(1 / width, -1 / height); + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = this.applyTransferMapsToBitmap(imgData); + } else if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { + imgToPaint = imgData; + } else { + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx)); + ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate); + drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height); + this.compose(); + this.restore(); + } + paintInlineImageXObjectGroup(imgData, map) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = imgData.bitmap; + } else { + const w = imgData.width; + const h = imgData.height; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + for (const entry of map) { + ctx.save(); + ctx.transform(...entry.transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); + ctx.restore(); + } + this.compose(); + } + paintSolidColorImageMask() { + if (!this.contentVisible) { + return; + } + this.ctx.fillRect(0, 0, 1, 1); + this.compose(); + } + markPoint(tag) {} + markPointProps(tag, properties) {} + beginMarkedContent(tag) { + this.markedContentStack.push({ + visible: true + }); + } + beginMarkedContentProps(tag, properties) { + if (tag === "OC") { + this.markedContentStack.push({ + visible: this.optionalContentConfig.isVisible(properties) + }); + } else { + this.markedContentStack.push({ + visible: true + }); + } + this.contentVisible = this.isContentVisible(); + } + endMarkedContent() { + this.markedContentStack.pop(); + this.contentVisible = this.isContentVisible(); + } + beginCompat() {} + endCompat() {} + consumePath(path, clipBox) { + const isEmpty = this.current.isEmptyClip(); + if (this.pendingClip) { + this.current.updateClipFromPath(); + } + if (!this.pendingClip) { + this.compose(clipBox); + } + const ctx = this.ctx; + if (this.pendingClip) { + if (!isEmpty) { + if (this.pendingClip === EO_CLIP) { + ctx.clip(path, "evenodd"); + } else { + ctx.clip(path); + } + } + this.pendingClip = null; + } + this.current.startNewPathAndClipBox(this.current.clipBox); + } + getSinglePixelWidth() { + if (!this._cachedGetSinglePixelWidth) { + const m = getCurrentTransform(this.ctx); + if (m[1] === 0 && m[2] === 0) { + this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3])); + } else { + const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); + const normX = Math.hypot(m[0], m[2]); + const normY = Math.hypot(m[1], m[3]); + this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet; + } + } + return this._cachedGetSinglePixelWidth; + } + getScaleForStroking() { + if (this._cachedScaleForStroking[0] === -1) { + const { + lineWidth + } = this.current; + const { + a, + b, + c, + d + } = this.ctx.getTransform(); + let scaleX, scaleY; + if (b === 0 && c === 0) { + const normX = Math.abs(a); + const normY = Math.abs(d); + if (normX === normY) { + if (lineWidth === 0) { + scaleX = scaleY = 1 / normX; + } else { + const scaledLineWidth = normX * lineWidth; + scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1; + } + } else if (lineWidth === 0) { + scaleX = 1 / normX; + scaleY = 1 / normY; + } else { + const scaledXLineWidth = normX * lineWidth; + const scaledYLineWidth = normY * lineWidth; + scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1; + scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1; + } + } else { + const absDet = Math.abs(a * d - b * c); + const normX = Math.hypot(a, b); + const normY = Math.hypot(c, d); + if (lineWidth === 0) { + scaleX = normY / absDet; + scaleY = normX / absDet; + } else { + const baseArea = lineWidth * absDet; + scaleX = normY > baseArea ? normY / baseArea : 1; + scaleY = normX > baseArea ? normX / baseArea : 1; + } + } + this._cachedScaleForStroking[0] = scaleX; + this._cachedScaleForStroking[1] = scaleY; + } + return this._cachedScaleForStroking; + } + rescaleAndStroke(path, saveRestore) { + const { + ctx, + current: { + lineWidth + } + } = this; + const [scaleX, scaleY] = this.getScaleForStroking(); + if (scaleX === scaleY) { + ctx.lineWidth = (lineWidth || 1) * scaleX; + ctx.stroke(path); + return; + } + const dashes = ctx.getLineDash(); + if (saveRestore) { + ctx.save(); + } + ctx.scale(scaleX, scaleY); + SCALE_MATRIX.a = 1 / scaleX; + SCALE_MATRIX.d = 1 / scaleY; + const newPath = new Path2D(); + newPath.addPath(path, SCALE_MATRIX); + if (dashes.length > 0) { + const scale = Math.max(scaleX, scaleY); + ctx.setLineDash(dashes.map(x => x / scale)); + ctx.lineDashOffset /= scale; + } + ctx.lineWidth = lineWidth || 1; + ctx.stroke(newPath); + if (saveRestore) { + ctx.restore(); + } + } + isContentVisible() { + for (let i = this.markedContentStack.length - 1; i >= 0; i--) { + if (!this.markedContentStack[i].visible) { + return false; + } + } + return true; + } +} +for (const op in OPS) { + if (CanvasGraphics.prototype[op] !== undefined) { + CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; + } +} + +;// ./src/display/worker_options.js +class GlobalWorkerOptions { + static #port = null; + static #src = ""; + static get workerPort() { + return this.#port; + } + static set workerPort(val) { + if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) { + throw new Error("Invalid `workerPort` type."); + } + this.#port = val; + } + static get workerSrc() { + return this.#src; + } + static set workerSrc(val) { + if (typeof val !== "string") { + throw new Error("Invalid `workerSrc` type."); + } + this.#src = val; + } +} + +;// ./src/display/metadata.js +class Metadata { + #map; + #data; + constructor({ + parsedData, + rawData + }) { + this.#map = parsedData; + this.#data = rawData; + } + getRaw() { + return this.#data; + } + get(name) { + return this.#map.get(name) ?? null; + } + [Symbol.iterator]() { + return this.#map.entries(); + } +} + +;// ./src/display/optional_content_config.js + + +const INTERNAL = Symbol("INTERNAL"); +class OptionalContentGroup { + #isDisplay = false; + #isPrint = false; + #userSet = false; + #visible = true; + constructor(renderingIntent, { + name, + intent, + usage, + rbGroups + }) { + this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY); + this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + this.name = name; + this.intent = intent; + this.usage = usage; + this.rbGroups = rbGroups; + } + get visible() { + if (this.#userSet) { + return this.#visible; + } + if (!this.#visible) { + return false; + } + const { + print, + view + } = this.usage; + if (this.#isDisplay) { + return view?.viewState !== "OFF"; + } else if (this.#isPrint) { + return print?.printState !== "OFF"; + } + return true; + } + _setVisible(internal, visible, userSet = false) { + if (internal !== INTERNAL) { + unreachable("Internal method `_setVisible` called."); + } + this.#userSet = userSet; + this.#visible = visible; + } +} +class OptionalContentConfig { + #cachedGetHash = null; + #groups = new Map(); + #initialHash = null; + #order = null; + constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) { + this.renderingIntent = renderingIntent; + this.name = null; + this.creator = null; + if (data === null) { + return; + } + this.name = data.name; + this.creator = data.creator; + this.#order = data.order; + for (const group of data.groups) { + this.#groups.set(group.id, new OptionalContentGroup(renderingIntent, group)); + } + if (data.baseState === "OFF") { + for (const group of this.#groups.values()) { + group._setVisible(INTERNAL, false); + } + } + for (const on of data.on) { + this.#groups.get(on)._setVisible(INTERNAL, true); + } + for (const off of data.off) { + this.#groups.get(off)._setVisible(INTERNAL, false); + } + this.#initialHash = this.getHash(); + } + #evaluateVisibilityExpression(array) { + const length = array.length; + if (length < 2) { + return true; + } + const operator = array[0]; + for (let i = 1; i < length; i++) { + const element = array[i]; + let state; + if (Array.isArray(element)) { + state = this.#evaluateVisibilityExpression(element); + } else if (this.#groups.has(element)) { + state = this.#groups.get(element).visible; + } else { + warn(`Optional content group not found: ${element}`); + return true; + } + switch (operator) { + case "And": + if (!state) { + return false; + } + break; + case "Or": + if (state) { + return true; + } + break; + case "Not": + return !state; + default: + return true; + } + } + return operator === "And"; + } + isVisible(group) { + if (this.#groups.size === 0) { + return true; + } + if (!group) { + info("Optional content group not defined."); + return true; + } + if (group.type === "OCG") { + if (!this.#groups.has(group.id)) { + warn(`Optional content group not found: ${group.id}`); + return true; + } + return this.#groups.get(group.id).visible; + } else if (group.type === "OCMD") { + if (group.expression) { + return this.#evaluateVisibilityExpression(group.expression); + } + if (!group.policy || group.policy === "AnyOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return false; + } + } + return true; + } else if (group.policy === "AnyOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return false; + } + } + return true; + } + warn(`Unknown optional content policy ${group.policy}.`); + return true; + } + warn(`Unknown group type ${group.type}.`); + return true; + } + setVisibility(id, visible = true, preserveRB = true) { + const group = this.#groups.get(id); + if (!group) { + warn(`Optional content group not found: ${id}`); + return; + } + if (preserveRB && visible && group.rbGroups.length) { + for (const rbGroup of group.rbGroups) { + for (const otherId of rbGroup) { + if (otherId !== id) { + this.#groups.get(otherId)?._setVisible(INTERNAL, false, true); + } + } + } + } + group._setVisible(INTERNAL, !!visible, true); + this.#cachedGetHash = null; + } + setOCGState({ + state, + preserveRB + }) { + let operator; + for (const elem of state) { + switch (elem) { + case "ON": + case "OFF": + case "Toggle": + operator = elem; + continue; + } + const group = this.#groups.get(elem); + if (!group) { + continue; + } + switch (operator) { + case "ON": + this.setVisibility(elem, true, preserveRB); + break; + case "OFF": + this.setVisibility(elem, false, preserveRB); + break; + case "Toggle": + this.setVisibility(elem, !group.visible, preserveRB); + break; + } + } + this.#cachedGetHash = null; + } + get hasInitialVisibility() { + return this.#initialHash === null || this.getHash() === this.#initialHash; + } + getOrder() { + if (!this.#groups.size) { + return null; + } + if (this.#order) { + return this.#order.slice(); + } + return [...this.#groups.keys()]; + } + getGroup(id) { + return this.#groups.get(id) || null; + } + getHash() { + if (this.#cachedGetHash !== null) { + return this.#cachedGetHash; + } + const hash = new MurmurHash3_64(); + for (const [id, group] of this.#groups) { + hash.update(`${id}:${group.visible}`); + } + return this.#cachedGetHash = hash.hexdigest(); + } + [Symbol.iterator]() { + return this.#groups.entries(); + } +} + +;// ./src/display/transport_stream.js + + +class PDFDataTransportStream { + constructor(pdfDataRangeTransport, { + disableRange = false, + disableStream = false + }) { + assert(pdfDataRangeTransport, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.'); + const { + length, + initialData, + progressiveDone, + contentDispositionFilename + } = pdfDataRangeTransport; + this._queuedChunks = []; + this._progressiveDone = progressiveDone; + this._contentDispositionFilename = contentDispositionFilename; + if (initialData?.length > 0) { + const buffer = initialData instanceof Uint8Array && initialData.byteLength === initialData.buffer.byteLength ? initialData.buffer : new Uint8Array(initialData).buffer; + this._queuedChunks.push(buffer); + } + this._pdfDataRangeTransport = pdfDataRangeTransport; + this._isStreamingSupported = !disableStream; + this._isRangeSupported = !disableRange; + this._contentLength = length; + this._fullRequestReader = null; + this._rangeReaders = []; + pdfDataRangeTransport.addRangeListener((begin, chunk) => { + this._onReceiveData({ + begin, + chunk + }); + }); + pdfDataRangeTransport.addProgressListener((loaded, total) => { + this._onProgress({ + loaded, + total + }); + }); + pdfDataRangeTransport.addProgressiveReadListener(chunk => { + this._onReceiveData({ + chunk + }); + }); + pdfDataRangeTransport.addProgressiveDoneListener(() => { + this._onProgressiveDone(); + }); + pdfDataRangeTransport.transportReady(); + } + _onReceiveData({ + begin, + chunk + }) { + const buffer = chunk instanceof Uint8Array && chunk.byteLength === chunk.buffer.byteLength ? chunk.buffer : new Uint8Array(chunk).buffer; + if (begin === undefined) { + if (this._fullRequestReader) { + this._fullRequestReader._enqueue(buffer); + } else { + this._queuedChunks.push(buffer); + } + } else { + const found = this._rangeReaders.some(function (rangeReader) { + if (rangeReader._begin !== begin) { + return false; + } + rangeReader._enqueue(buffer); + return true; + }); + assert(found, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."); + } + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + _onProgress(evt) { + if (evt.total === undefined) { + this._rangeReaders[0]?.onProgress?.({ + loaded: evt.loaded + }); + } else { + this._fullRequestReader?.onProgress?.({ + loaded: evt.loaded, + total: evt.total + }); + } + } + _onProgressiveDone() { + this._fullRequestReader?.progressiveDone(); + this._progressiveDone = true; + } + _removeRangeReader(reader) { + const i = this._rangeReaders.indexOf(reader); + if (i >= 0) { + this._rangeReaders.splice(i, 1); + } + } + getFullReader() { + assert(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once."); + const queuedChunks = this._queuedChunks; + this._queuedChunks = null; + return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename); + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFDataTransportStreamRangeReader(this, begin, end); + this._pdfDataRangeTransport.requestDataRange(begin, end); + this._rangeReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeReaders.slice(0)) { + reader.cancel(reason); + } + this._pdfDataRangeTransport.abort(); + } +} +class PDFDataTransportStreamReader { + constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) { + this._stream = stream; + this._done = progressiveDone || false; + this._filename = isPdfFile(contentDispositionFilename) ? contentDispositionFilename : null; + this._queuedChunks = queuedChunks || []; + this._loaded = 0; + for (const chunk of this._queuedChunks) { + this._loaded += chunk.byteLength; + } + this._requests = []; + this._headersReady = Promise.resolve(); + stream._fullRequestReader = this; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunks.push(chunk); + } + this._loaded += chunk.byteLength; + } + get headersReady() { + return this._headersReady; + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._stream._isRangeSupported; + } + get isStreamingSupported() { + return this._stream._isStreamingSupported; + } + get contentLength() { + return this._stream._contentLength; + } + async read() { + if (this._queuedChunks.length > 0) { + const chunk = this._queuedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + progressiveDone() { + if (this._done) { + return; + } + this._done = true; + } +} +class PDFDataTransportStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._begin = begin; + this._end = end; + this._queuedChunk = null; + this._requests = []; + this._done = false; + this.onProgress = null; + } + _enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length === 0) { + this._queuedChunk = chunk; + } else { + const requestsCapability = this._requests.shift(); + requestsCapability.resolve({ + value: chunk, + done: false + }); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + this._done = true; + this._stream._removeRangeReader(this); + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._queuedChunk) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._stream._removeRangeReader(this); + } +} + +;// ./src/display/content_disposition.js + +function getFilenameFromContentDispositionHeader(contentDisposition) { + let needsEncodingFixup = true; + let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = unescape(filename); + filename = rfc5987decode(filename); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + tmp = rfc2231getparam(contentDisposition); + if (tmp) { + const filename = rfc2047decode(tmp); + return fixupEncoding(filename); + } + tmp = toParamRegExp("filename", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + function toParamRegExp(attributePattern, flags) { + return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags); + } + function textdecode(encoding, value) { + if (encoding) { + if (!/^[\x00-\xFF]+$/.test(value)) { + return value; + } + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(value); + value = decoder.decode(buffer); + needsEncodingFixup = false; + } catch {} + } + return value; + } + function fixupEncoding(value) { + if (needsEncodingFixup && /[\x80-\xff]/.test(value)) { + value = textdecode("utf-8", value); + if (needsEncodingFixup) { + value = textdecode("iso-8859-1", value); + } + } + return value; + } + function rfc2231getparam(contentDispositionStr) { + const matches = []; + let match; + const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); + while ((match = iter.exec(contentDispositionStr)) !== null) { + let [, n, quot, part] = match; + n = parseInt(n, 10); + if (n in matches) { + if (n === 0) { + break; + } + continue; + } + matches[n] = [quot, part]; + } + const parts = []; + for (let n = 0; n < matches.length; ++n) { + if (!(n in matches)) { + break; + } + let [quot, part] = matches[n]; + part = rfc2616unquote(part); + if (quot) { + part = unescape(part); + if (n === 0) { + part = rfc5987decode(part); + } + } + parts.push(part); + } + return parts.join(""); + } + function rfc2616unquote(value) { + if (value.startsWith('"')) { + const parts = value.slice(1).split('\\"'); + for (let i = 0; i < parts.length; ++i) { + const quotindex = parts[i].indexOf('"'); + if (quotindex !== -1) { + parts[i] = parts[i].slice(0, quotindex); + parts.length = i + 1; + } + parts[i] = parts[i].replaceAll(/\\(.)/g, "$1"); + } + value = parts.join('"'); + } + return value; + } + function rfc5987decode(extvalue) { + const encodingend = extvalue.indexOf("'"); + if (encodingend === -1) { + return extvalue; + } + const encoding = extvalue.slice(0, encodingend); + const langvalue = extvalue.slice(encodingend + 1); + const value = langvalue.replace(/^[^']*'/, ""); + return textdecode(encoding, value); + } + function rfc2047decode(value) { + if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { + return value; + } + return value.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { + if (encoding === "q" || encoding === "Q") { + text = text.replaceAll("_", " "); + text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) { + return String.fromCharCode(parseInt(hex, 16)); + }); + return textdecode(charset, text); + } + try { + text = atob(text); + } catch {} + return textdecode(charset, text); + }); + } + return ""; +} + +;// ./src/display/network_utils.js + + + +function createHeaders(isHttp, httpHeaders) { + const headers = new Headers(); + if (!isHttp || !httpHeaders || typeof httpHeaders !== "object") { + return headers; + } + for (const key in httpHeaders) { + const val = httpHeaders[key]; + if (val !== undefined) { + headers.append(key, val); + } + } + return headers; +} +function getResponseOrigin(url) { + return URL.parse(url)?.origin ?? null; +} +function validateRangeRequestCapabilities({ + responseHeaders, + isHttp, + rangeChunkSize, + disableRange +}) { + const returnValues = { + allowRangeRequests: false, + suggestedLength: undefined + }; + const length = parseInt(responseHeaders.get("Content-Length"), 10); + if (!Number.isInteger(length)) { + return returnValues; + } + returnValues.suggestedLength = length; + if (length <= 2 * rangeChunkSize) { + return returnValues; + } + if (disableRange || !isHttp) { + return returnValues; + } + if (responseHeaders.get("Accept-Ranges") !== "bytes") { + return returnValues; + } + const contentEncoding = responseHeaders.get("Content-Encoding") || "identity"; + if (contentEncoding !== "identity") { + return returnValues; + } + returnValues.allowRangeRequests = true; + return returnValues; +} +function extractFilenameFromHeader(responseHeaders) { + const contentDisposition = responseHeaders.get("Content-Disposition"); + if (contentDisposition) { + let filename = getFilenameFromContentDispositionHeader(contentDisposition); + if (filename.includes("%")) { + try { + filename = decodeURIComponent(filename); + } catch {} + } + if (isPdfFile(filename)) { + return filename; + } + } + return null; +} +function createResponseError(status, url) { + return new ResponseException(`Unexpected server response (${status}) while retrieving PDF "${url}".`, status, status === 404 || status === 0 && url.startsWith("file:")); +} +function validateResponseStatus(status) { + return status === 200 || status === 206; +} + +;// ./src/display/fetch_stream.js + + +function createFetchOptions(headers, withCredentials, abortController) { + return { + method: "GET", + headers, + signal: abortController.signal, + mode: "cors", + credentials: withCredentials ? "include" : "same-origin", + redirect: "follow" + }; +} +function getArrayBuffer(val) { + if (val instanceof Uint8Array) { + return val.buffer; + } + if (val instanceof ArrayBuffer) { + return val; + } + warn(`getArrayBuffer - unexpected data format: ${val}`); + return new Uint8Array(val).buffer; +} +class PDFFetchStream { + _responseOrigin = null; + constructor(source) { + this.source = source; + this.isHttp = /^https?:/i.test(source.url); + this.headers = createHeaders(this.isHttp, source.httpHeaders); + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFFetchStreamReader(this); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new PDFFetchStreamRangeReader(this, begin, end); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFFetchStreamReader { + constructor(stream) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + this._filename = null; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._contentLength = source.length; + this._headersCapability = Promise.withResolvers(); + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._abortController = new AbortController(); + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + const headers = new Headers(stream.headers); + const url = source.url; + fetch(url, createFetchOptions(headers, this._withCredentials, this._abortController)).then(response => { + stream._responseOrigin = getResponseOrigin(response.url); + if (!validateResponseStatus(response.status)) { + throw createResponseError(response.status, url); + } + this._reader = response.body.getReader(); + this._headersCapability.resolve(); + const responseHeaders = response.headers; + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: stream.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + this._isRangeSupported = allowRangeRequests; + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(responseHeaders); + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException("Streaming is disabled.")); + } + }).catch(this._headersCapability.reject); + this.onProgress = null; + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._headersCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} +class PDFFetchStreamRangeReader { + constructor(stream, begin, end) { + this._stream = stream; + this._reader = null; + this._loaded = 0; + const source = stream.source; + this._withCredentials = source.withCredentials || false; + this._readCapability = Promise.withResolvers(); + this._isStreamingSupported = !source.disableStream; + this._abortController = new AbortController(); + const headers = new Headers(stream.headers); + headers.append("Range", `bytes=${begin}-${end - 1}`); + const url = source.url; + fetch(url, createFetchOptions(headers, this._withCredentials, this._abortController)).then(response => { + const responseOrigin = getResponseOrigin(response.url); + if (responseOrigin !== stream._responseOrigin) { + throw new Error(`Expected range response-origin "${responseOrigin}" to match "${stream._responseOrigin}".`); + } + if (!validateResponseStatus(response.status)) { + throw createResponseError(response.status, url); + } + this._readCapability.resolve(); + this._reader = response.body.getReader(); + }).catch(this._readCapability.reject); + this.onProgress = null; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this.onProgress?.({ + loaded: this._loaded + }); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } +} + +;// ./src/display/network.js + + +const OK_RESPONSE = 200; +const PARTIAL_CONTENT_RESPONSE = 206; +function network_getArrayBuffer(xhr) { + const data = xhr.response; + if (typeof data !== "string") { + return data; + } + return stringToBytes(data).buffer; +} +class NetworkManager { + _responseOrigin = null; + constructor({ + url, + httpHeaders, + withCredentials + }) { + this.url = url; + this.isHttp = /^https?:/i.test(url); + this.headers = createHeaders(this.isHttp, httpHeaders); + this.withCredentials = withCredentials || false; + this.currXhrId = 0; + this.pendingRequests = Object.create(null); + } + request(args) { + const xhr = new XMLHttpRequest(); + const xhrId = this.currXhrId++; + const pendingRequest = this.pendingRequests[xhrId] = { + xhr + }; + xhr.open("GET", this.url); + xhr.withCredentials = this.withCredentials; + for (const [key, val] of this.headers) { + xhr.setRequestHeader(key, val); + } + if (this.isHttp && "begin" in args && "end" in args) { + xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); + pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE; + } else { + pendingRequest.expectedStatus = OK_RESPONSE; + } + xhr.responseType = "arraybuffer"; + assert(args.onError, "Expected `onError` callback to be provided."); + xhr.onerror = () => { + 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(xhrId, evt) { + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + pendingRequest.onProgress?.(evt); + } + onStateChange(xhrId, evt) { + const pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + const xhr = pendingRequest.xhr; + if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { + pendingRequest.onHeadersReceived(); + delete pendingRequest.onHeadersReceived; + } + if (xhr.readyState !== 4) { + return; + } + if (!(xhrId in this.pendingRequests)) { + return; + } + delete this.pendingRequests[xhrId]; + if (xhr.status === 0 && this.isHttp) { + pendingRequest.onError(xhr.status); + return; + } + const xhrStatus = xhr.status || OK_RESPONSE; + const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; + if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { + pendingRequest.onError(xhr.status); + return; + } + const chunk = network_getArrayBuffer(xhr); + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + const rangeHeader = xhr.getResponseHeader("Content-Range"); + const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); + if (matches) { + pendingRequest.onDone({ + begin: parseInt(matches[1], 10), + chunk + }); + } else { + warn(`Missing or invalid "Content-Range" header.`); + pendingRequest.onError(0); + } + } else if (chunk) { + pendingRequest.onDone({ + begin: 0, + chunk + }); + } else { + pendingRequest.onError(xhr.status); + } + } + getRequestXhr(xhrId) { + return this.pendingRequests[xhrId].xhr; + } + isPendingRequest(xhrId) { + return xhrId in this.pendingRequests; + } + abortRequest(xhrId) { + const xhr = this.pendingRequests[xhrId].xhr; + delete this.pendingRequests[xhrId]; + xhr.abort(); + } +} +class PDFNetworkStream { + constructor(source) { + this._source = source; + this._manager = new NetworkManager(source); + this._rangeChunkSize = source.rangeChunkSize; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + _onRangeRequestReaderClosed(reader) { + const i = this._rangeRequestReaders.indexOf(reader); + if (i >= 0) { + this._rangeRequestReaders.splice(i, 1); + } + } + getFullReader() { + assert(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source); + return this._fullRequestReader; + } + getRangeReader(begin, end) { + const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); + reader.onClosed = this._onRangeRequestReaderClosed.bind(this); + this._rangeRequestReaders.push(reader); + return reader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFNetworkStreamFullRequestReader { + constructor(manager, source) { + this._manager = manager; + this._url = source.url; + this._fullRequestId = manager.request({ + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }); + this._headersCapability = Promise.withResolvers(); + this._disableRange = source.disableRange || false; + this._contentLength = source.length; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = false; + this._isRangeSupported = false; + this._cachedChunks = []; + this._requests = []; + this._done = false; + this._storedError = undefined; + this._filename = null; + this.onProgress = null; + } + _onHeadersReceived() { + const fullRequestXhrId = this._fullRequestId; + const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); + this._manager._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL); + const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders(); + const responseHeaders = new Headers(rawResponseHeaders ? rawResponseHeaders.trimStart().replace(/[^\S ]+$/, "").split(/[\r\n]+/).map(x => { + const [key, ...val] = x.split(": "); + return [key, val.join(": ")]; + }) : []); + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: this._manager.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + if (allowRangeRequests) { + this._isRangeSupported = true; + } + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(responseHeaders); + if (this._isRangeSupported) { + this._manager.abortRequest(fullRequestXhrId); + } + this._headersCapability.resolve(); + } + _onDone(data) { + if (data) { + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: data.chunk, + done: false + }); + } else { + this._cachedChunks.push(data.chunk); + } + } + this._done = true; + if (this._cachedChunks.length > 0) { + return; + } + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + } + _onError(status) { + this._storedError = createResponseError(status, this._url); + this._headersCapability.reject(this._storedError); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._cachedChunks.length = 0; + } + _onProgress(evt) { + this.onProgress?.({ + loaded: evt.loaded, + total: evt.lengthComputable ? evt.total : this._contentLength + }); + } + get filename() { + return this._filename; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + get contentLength() { + return this._contentLength; + } + get headersReady() { + return this._headersCapability.promise; + } + async read() { + await this._headersCapability.promise; + if (this._storedError) { + throw this._storedError; + } + if (this._cachedChunks.length > 0) { + const chunk = this._cachedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + this._headersCapability.reject(reason); + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._fullRequestId)) { + this._manager.abortRequest(this._fullRequestId); + } + this._fullRequestReader = null; + } +} +class PDFNetworkStreamRangeRequestReader { + constructor(manager, begin, end) { + this._manager = manager; + this._url = manager.url; + this._requestId = manager.request({ + begin, + end, + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }); + this._requests = []; + this._queuedChunk = null; + this._done = false; + this._storedError = undefined; + this.onProgress = null; + this.onClosed = null; + } + _onHeadersReceived() { + const responseOrigin = getResponseOrigin(this._manager.getRequestXhr(this._requestId)?.responseURL); + if (responseOrigin !== this._manager._responseOrigin) { + this._storedError = new Error(`Expected range response-origin "${responseOrigin}" to match "${this._manager._responseOrigin}".`); + this._onError(0); + } + } + _close() { + this.onClosed?.(this); + } + _onDone(data) { + const chunk = data.chunk; + if (this._requests.length > 0) { + const requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunk = chunk; + } + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + this._close(); + } + _onError(status) { + this._storedError ??= createResponseError(status, this._url); + for (const requestCapability of this._requests) { + requestCapability.reject(this._storedError); + } + this._requests.length = 0; + this._queuedChunk = null; + } + _onProgress(evt) { + if (!this.isStreamingSupported) { + this.onProgress?.({ + loaded: evt.loaded + }); + } + } + get isStreamingSupported() { + return false; + } + async read() { + if (this._storedError) { + throw this._storedError; + } + if (this._queuedChunk !== null) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const requestCapability = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + for (const requestCapability of this._requests) { + requestCapability.resolve({ + value: undefined, + done: true + }); + } + this._requests.length = 0; + if (this._manager.isPendingRequest(this._requestId)) { + this._manager.abortRequest(this._requestId); + } + this._close(); + } +} + +;// ./src/display/node_stream.js + + +const urlRegex = /^[a-z][a-z0-9\-+.]+:/i; +function parseUrlOrPath(sourceUrl) { + if (urlRegex.test(sourceUrl)) { + return new URL(sourceUrl); + } + const url = process.getBuiltinModule("url"); + return new URL(url.pathToFileURL(sourceUrl)); +} +class PDFNodeStream { + constructor(source) { + this.source = source; + this.url = parseUrlOrPath(source.url); + assert(this.url.protocol === "file:", "PDFNodeStream only supports file:// URLs."); + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFNodeStreamFsFullReader(this); + return this._fullRequestReader; + } + getRangeReader(start, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const rangeReader = new PDFNodeStreamFsRangeReader(this, start, end); + this._rangeRequestReaders.push(rangeReader); + return rangeReader; + } + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } + } +} +class PDFNodeStreamFsFullReader { + constructor(stream) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + const source = stream.source; + this._contentLength = source.length; + this._loaded = 0; + this._filename = null; + this._disableRange = source.disableRange || false; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = !source.disableStream; + this._isRangeSupported = !source.disableRange; + this._readableStream = null; + this._readCapability = Promise.withResolvers(); + this._headersCapability = Promise.withResolvers(); + const fs = process.getBuiltinModule("fs"); + fs.promises.lstat(this._url).then(stat => { + this._contentLength = stat.size; + this._setReadableStream(fs.createReadStream(this._url)); + this._headersCapability.resolve(); + }, error => { + if (error.code === "ENOENT") { + error = createResponseError(0, this._url.href); + } + this._storedError = error; + this._headersCapability.reject(error); + }); + } + get headersReady() { + return this._headersCapability.promise; + } + get filename() { + return this._filename; + } + get contentLength() { + return this._contentLength; + } + get isRangeSupported() { + return this._isRangeSupported; + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = Promise.withResolvers(); + return this.read(); + } + this._loaded += chunk.length; + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (!this._isStreamingSupported && this._isRangeSupported) { + this._error(new AbortException("streaming is disabled")); + } + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} +class PDFNodeStreamFsRangeReader { + constructor(stream, start, end) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + this._loaded = 0; + this._readableStream = null; + this._readCapability = Promise.withResolvers(); + const source = stream.source; + this._isStreamingSupported = !source.disableStream; + const fs = process.getBuiltinModule("fs"); + this._setReadableStream(fs.createReadStream(this._url, { + start, + end: end - 1 + })); + } + get isStreamingSupported() { + return this._isStreamingSupported; + } + async read() { + await this._readCapability.promise; + if (this._done) { + return { + value: undefined, + done: true + }; + } + if (this._storedError) { + throw this._storedError; + } + const chunk = this._readableStream.read(); + if (chunk === null) { + this._readCapability = Promise.withResolvers(); + return this.read(); + } + this._loaded += chunk.length; + this.onProgress?.({ + loaded: this._loaded + }); + const buffer = new Uint8Array(chunk).buffer; + return { + value: buffer, + done: false + }; + } + cancel(reason) { + if (!this._readableStream) { + this._error(reason); + return; + } + this._readableStream.destroy(reason); + } + _error(reason) { + this._storedError = reason; + this._readCapability.resolve(); + } + _setReadableStream(readableStream) { + this._readableStream = readableStream; + readableStream.on("readable", () => { + this._readCapability.resolve(); + }); + readableStream.on("end", () => { + readableStream.destroy(); + this._done = true; + this._readCapability.resolve(); + }); + readableStream.on("error", reason => { + this._error(reason); + }); + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} + +;// ./src/display/text_layer.js + + +const MAX_TEXT_DIVS_TO_RENDER = 100000; +const DEFAULT_FONT_SIZE = 30; +class TextLayer { + #capability = Promise.withResolvers(); + #container = null; + #disableProcessItems = false; + #fontInspectorEnabled = !!globalThis.FontInspector?.enabled; + #lang = null; + #layoutTextParams = null; + #pageHeight = 0; + #pageWidth = 0; + #reader = null; + #rootContainer = null; + #rotation = 0; + #scale = 0; + #styleCache = Object.create(null); + #textContentItemsStr = []; + #textContentSource = null; + #textDivs = []; + #textDivProperties = new WeakMap(); + #transform = null; + static #ascentCache = new Map(); + static #canvasContexts = new Map(); + static #canvasCtxFonts = new WeakMap(); + static #minFontSize = null; + static #pendingTextLayers = new Set(); + constructor({ + textContentSource, + container, + viewport + }) { + if (textContentSource instanceof ReadableStream) { + this.#textContentSource = textContentSource; + } else if (typeof textContentSource === "object") { + this.#textContentSource = new ReadableStream({ + start(controller) { + controller.enqueue(textContentSource); + controller.close(); + } + }); + } else { + throw new Error('No "textContentSource" parameter specified.'); + } + this.#container = this.#rootContainer = container; + this.#scale = viewport.scale * OutputScale.pixelRatio; + this.#rotation = viewport.rotation; + this.#layoutTextParams = { + div: null, + properties: null, + ctx: null + }; + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; + this.#pageWidth = pageWidth; + this.#pageHeight = pageHeight; + TextLayer.#ensureMinFontSizeComputed(); + setLayerDimensions(container, viewport); + this.#capability.promise.finally(() => { + TextLayer.#pendingTextLayers.delete(this); + this.#layoutTextParams = null; + this.#styleCache = null; + }).catch(() => {}); + } + static get fontFamilyMap() { + const { + isWindows, + isFirefox + } = util_FeatureTest.platform; + return shadow(this, "fontFamilyMap", new Map([["sans-serif", `${isWindows && isFirefox ? "Calibri, " : ""}sans-serif`], ["monospace", `${isWindows && isFirefox ? "Lucida Console, " : ""}monospace`]])); + } + render() { + const pump = () => { + this.#reader.read().then(({ + value, + done + }) => { + if (done) { + this.#capability.resolve(); + return; + } + this.#lang ??= value.lang; + Object.assign(this.#styleCache, value.styles); + this.#processItems(value.items); + pump(); + }, this.#capability.reject); + }; + this.#reader = this.#textContentSource.getReader(); + TextLayer.#pendingTextLayers.add(this); + pump(); + return this.#capability.promise; + } + update({ + viewport, + onBefore = null + }) { + const scale = viewport.scale * OutputScale.pixelRatio; + const rotation = viewport.rotation; + if (rotation !== this.#rotation) { + onBefore?.(); + this.#rotation = rotation; + setLayerDimensions(this.#rootContainer, { + rotation + }); + } + if (scale !== this.#scale) { + onBefore?.(); + this.#scale = scale; + const params = { + div: null, + properties: null, + ctx: TextLayer.#getCtx(this.#lang) + }; + for (const div of this.#textDivs) { + params.properties = this.#textDivProperties.get(div); + params.div = div; + this.#layout(params); + } + } + } + cancel() { + const abortEx = new AbortException("TextLayer task cancelled."); + this.#reader?.cancel(abortEx).catch(() => {}); + this.#reader = null; + this.#capability.reject(abortEx); + } + get textDivs() { + return this.#textDivs; + } + get textContentItemsStr() { + return this.#textContentItemsStr; + } + #processItems(items) { + if (this.#disableProcessItems) { + return; + } + this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang); + const textDivs = this.#textDivs, + textContentItemsStr = this.#textContentItemsStr; + for (const item of items) { + if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) { + warn("Ignoring additional textDivs for performance reasons."); + this.#disableProcessItems = true; + return; + } + if (item.str === undefined) { + if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") { + const parent = this.#container; + this.#container = document.createElement("span"); + this.#container.classList.add("markedContent"); + if (item.id !== null) { + this.#container.setAttribute("id", `${item.id}`); + } + parent.append(this.#container); + } else if (item.type === "endMarkedContent") { + this.#container = this.#container.parentNode; + } + continue; + } + textContentItemsStr.push(item.str); + this.#appendText(item); + } + } + #appendText(geom) { + const textDiv = document.createElement("span"); + const textDivProperties = { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + fontSize: 0 + }; + this.#textDivs.push(textDiv); + const tx = Util.transform(this.#transform, geom.transform); + let angle = Math.atan2(tx[1], tx[0]); + const style = this.#styleCache[geom.fontName]; + if (style.vertical) { + angle += Math.PI / 2; + } + let fontFamily = this.#fontInspectorEnabled && style.fontSubstitution || style.fontFamily; + fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily; + const fontHeight = Math.hypot(tx[2], tx[3]); + const fontAscent = fontHeight * TextLayer.#getAscent(fontFamily, style, this.#lang); + let left, 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); + } + const scaleFactorStr = "calc(var(--total-scale-factor) *"; + const divStyle = textDiv.style; + if (this.#container === this.#rootContainer) { + divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`; + divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`; + } else { + divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; + divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; + } + divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`; + divStyle.fontFamily = fontFamily; + textDivProperties.fontSize = fontHeight; + textDiv.setAttribute("role", "presentation"); + textDiv.textContent = geom.str; + textDiv.dir = geom.dir; + if (this.#fontInspectorEnabled) { + textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName; + } + if (angle !== 0) { + textDivProperties.angle = angle * (180 / Math.PI); + } + let shouldScaleText = false; + if (geom.str.length > 1) { + shouldScaleText = true; + } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) { + const absScaleX = Math.abs(geom.transform[0]), + absScaleY = Math.abs(geom.transform[3]); + if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) { + shouldScaleText = true; + } + } + if (shouldScaleText) { + textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width; + } + this.#textDivProperties.set(textDiv, textDivProperties); + this.#layoutTextParams.div = textDiv; + this.#layoutTextParams.properties = textDivProperties; + this.#layout(this.#layoutTextParams); + if (textDivProperties.hasText) { + this.#container.append(textDiv); + } + if (textDivProperties.hasEOL) { + const br = document.createElement("br"); + br.setAttribute("role", "presentation"); + this.#container.append(br); + } + } + #layout(params) { + const { + div, + properties, + ctx + } = params; + const { + style + } = div; + let transform = ""; + if (TextLayer.#minFontSize > 1) { + transform = `scale(${1 / TextLayer.#minFontSize})`; + } + if (properties.canvasWidth !== 0 && properties.hasText) { + const { + fontFamily + } = style; + const { + canvasWidth, + fontSize + } = properties; + TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily); + const { + width + } = ctx.measureText(div.textContent); + if (width > 0) { + transform = `scaleX(${canvasWidth * this.#scale / width}) ${transform}`; + } + } + if (properties.angle !== 0) { + transform = `rotate(${properties.angle}deg) ${transform}`; + } + if (transform.length > 0) { + style.transform = transform; + } + } + static cleanup() { + if (this.#pendingTextLayers.size > 0) { + return; + } + this.#ascentCache.clear(); + for (const { + canvas + } of this.#canvasContexts.values()) { + canvas.remove(); + } + this.#canvasContexts.clear(); + } + static #getCtx(lang = null) { + let ctx = this.#canvasContexts.get(lang ||= ""); + if (!ctx) { + const canvas = document.createElement("canvas"); + canvas.className = "hiddenCanvasElement"; + canvas.lang = lang; + document.body.append(canvas); + ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: true + }); + this.#canvasContexts.set(lang, ctx); + this.#canvasCtxFonts.set(ctx, { + size: 0, + family: "" + }); + } + return ctx; + } + static #ensureCtxFont(ctx, size, family) { + const cached = this.#canvasCtxFonts.get(ctx); + if (size === cached.size && family === cached.family) { + return; + } + ctx.font = `${size}px ${family}`; + cached.size = size; + cached.family = family; + } + static #ensureMinFontSizeComputed() { + if (this.#minFontSize !== null) { + return; + } + const div = document.createElement("div"); + div.style.opacity = 0; + div.style.lineHeight = 1; + div.style.fontSize = "1px"; + div.style.position = "absolute"; + div.textContent = "X"; + document.body.append(div); + this.#minFontSize = div.getBoundingClientRect().height; + div.remove(); + } + static #getAscent(fontFamily, style, lang) { + const cachedAscent = this.#ascentCache.get(fontFamily); + if (cachedAscent) { + return cachedAscent; + } + const ctx = this.#getCtx(lang); + ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE; + this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily); + const metrics = ctx.measureText(""); + const ascent = metrics.fontBoundingBoxAscent; + const descent = Math.abs(metrics.fontBoundingBoxDescent); + ctx.canvas.width = ctx.canvas.height = 0; + let ratio = 0.8; + if (ascent) { + ratio = ascent / (ascent + descent); + } else { + if (util_FeatureTest.platform.isFirefox) { + warn("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference " + "in `about:config` to improve TextLayer rendering."); + } + if (style.ascent) { + ratio = style.ascent; + } else if (style.descent) { + ratio = 1 + style.descent; + } + } + this.#ascentCache.set(fontFamily, ratio); + return ratio; + } +} + +;// ./src/display/xfa_text.js +class XfaText { + static textContent(xfa) { + const items = []; + const output = { + items, + styles: Object.create(null) + }; + function walk(node) { + if (!node) { + return; + } + let str = null; + const name = node.name; + if (name === "#text") { + str = node.value; + } else if (!XfaText.shouldBuildText(name)) { + return; + } else if (node?.attributes?.textContent) { + str = node.attributes.textContent; + } else if (node.value) { + str = node.value; + } + if (str !== null) { + items.push({ + str + }); + } + if (!node.children) { + return; + } + for (const child of node.children) { + walk(child); + } + } + walk(xfa); + return output; + } + static shouldBuildText(name) { + return !(name === "textarea" || name === "input" || name === "option" || name === "select"); + } +} + +;// ./src/display/api.js + + + + + + + + + + + + + + + + + + + + + +const DEFAULT_RANGE_CHUNK_SIZE = 65536; +const RENDERING_CANCELLED_TIMEOUT = 100; +function getDocument(src = {}) { + if (typeof src === "string" || src instanceof URL) { + src = { + url: src + }; + } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) { + src = { + data: src + }; + } + const task = new PDFDocumentLoadingTask(); + const { + docId + } = task; + const url = src.url ? getUrlProp(src.url) : null; + const data = src.data ? getDataProp(src.data) : null; + const httpHeaders = src.httpHeaders || null; + const withCredentials = src.withCredentials === true; + const password = src.password ?? null; + const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null; + const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : DEFAULT_RANGE_CHUNK_SIZE; + let worker = src.worker instanceof PDFWorker ? src.worker : null; + const verbosity = src.verbosity; + const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null; + const cMapUrl = getFactoryUrlProp(src.cMapUrl); + const cMapPacked = src.cMapPacked !== false; + const CMapReaderFactory = src.CMapReaderFactory || (isNodeJS ? NodeCMapReaderFactory : DOMCMapReaderFactory); + const iccUrl = getFactoryUrlProp(src.iccUrl); + const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl); + const StandardFontDataFactory = src.StandardFontDataFactory || (isNodeJS ? NodeStandardFontDataFactory : DOMStandardFontDataFactory); + const wasmUrl = getFactoryUrlProp(src.wasmUrl); + const WasmFactory = src.WasmFactory || (isNodeJS ? NodeWasmFactory : DOMWasmFactory); + const ignoreErrors = src.stopAtErrors !== true; + const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; + const isEvalSupported = src.isEvalSupported !== false; + const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS; + const isImageDecoderSupported = typeof src.isImageDecoderSupported === "boolean" ? src.isImageDecoderSupported : !isNodeJS && (util_FeatureTest.platform.isFirefox || !globalThis.chrome); + const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; + const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : isNodeJS; + const fontExtraProperties = src.fontExtraProperties === true; + const enableXfa = src.enableXfa === true; + const ownerDocument = src.ownerDocument || globalThis.document; + const disableRange = src.disableRange === true; + const disableStream = src.disableStream === true; + const disableAutoFetch = src.disableAutoFetch === true; + const pdfBug = src.pdfBug === true; + const CanvasFactory = src.CanvasFactory || (isNodeJS ? NodeCanvasFactory : DOMCanvasFactory); + const FilterFactory = src.FilterFactory || (isNodeJS ? NodeFilterFactory : DOMFilterFactory); + const enableHWA = src.enableHWA === true; + const useWasm = src.useWasm !== false; + const length = rangeTransport ? rangeTransport.length : src.length ?? NaN; + const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace; + const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : !!(CMapReaderFactory === DOMCMapReaderFactory && StandardFontDataFactory === DOMStandardFontDataFactory && WasmFactory === DOMWasmFactory && cMapUrl && standardFontDataUrl && wasmUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI) && isValidFetchUrl(wasmUrl, document.baseURI)); + const styleElement = null; + setVerbosityLevel(verbosity); + const transportFactory = { + canvasFactory: new CanvasFactory({ + ownerDocument, + enableHWA + }), + filterFactory: new FilterFactory({ + docId, + ownerDocument + }), + cMapReaderFactory: useWorkerFetch ? null : new CMapReaderFactory({ + baseUrl: cMapUrl, + isCompressed: cMapPacked + }), + standardFontDataFactory: useWorkerFetch ? null : new StandardFontDataFactory({ + baseUrl: standardFontDataUrl + }), + wasmFactory: useWorkerFetch ? null : new WasmFactory({ + baseUrl: wasmUrl + }) + }; + if (!worker) { + const workerParams = { + verbosity, + port: GlobalWorkerOptions.workerPort + }; + worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams); + task._worker = worker; + } + const docParams = { + docId, + apiVersion: "5.2.133", + data, + password, + disableAutoFetch, + rangeChunkSize, + length, + docBaseUrl, + enableXfa, + evaluatorOptions: { + maxImageSize, + disableFontFace, + ignoreErrors, + isEvalSupported, + isOffscreenCanvasSupported, + isImageDecoderSupported, + canvasMaxAreaInBytes, + fontExtraProperties, + useSystemFonts, + useWasm, + useWorkerFetch, + cMapUrl, + iccUrl, + standardFontDataUrl, + wasmUrl + } + }; + const transportParams = { + ownerDocument, + pdfBug, + styleElement, + loadingParams: { + disableAutoFetch, + enableXfa + } + }; + worker.promise.then(function () { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const workerIdPromise = worker.messageHandler.sendWithPromise("GetDocRequest", docParams, data ? [data.buffer] : null); + let networkStream; + if (rangeTransport) { + networkStream = new PDFDataTransportStream(rangeTransport, { + disableRange, + disableStream + }); + } else if (!data) { + if (!url) { + throw new Error("getDocument - no `url` parameter provided."); + } + let NetworkStream; + if (isNodeJS) { + if (isValidFetchUrl(url)) { + if (typeof fetch === "undefined" || typeof Response === "undefined" || !("body" in Response.prototype)) { + throw new Error("getDocument - the Fetch API was disabled in Node.js, see `--no-experimental-fetch`."); + } + NetworkStream = PDFFetchStream; + } else { + NetworkStream = PDFNodeStream; + } + } else { + NetworkStream = isValidFetchUrl(url) ? PDFFetchStream : PDFNetworkStream; + } + networkStream = new NetworkStream({ + url, + length, + httpHeaders, + withCredentials, + rangeChunkSize, + disableRange, + disableStream + }); + } + return workerIdPromise.then(workerId => { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const messageHandler = new MessageHandler(docId, workerId, worker.port); + const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory); + task._transport = transport; + messageHandler.send("Ready", null); + }); + }).catch(task._capability.reject); + return task; +} +function getUrlProp(val) { + if (val instanceof URL) { + return val.href; + } + if (typeof val === "string") { + if (isNodeJS) { + return val; + } + const url = URL.parse(val, window.location); + if (url) { + return url.href; + } + } + throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); +} +function getDataProp(val) { + if (isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) { + throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`."); + } + if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) { + return val; + } + if (typeof val === "string") { + return stringToBytes(val); + } + if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val?.length)) { + return new Uint8Array(val); + } + throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); +} +function getFactoryUrlProp(val) { + if (typeof val !== "string") { + return null; + } + if (val.endsWith("/")) { + return val; + } + throw new Error(`Invalid factory url: "${val}" must include trailing slash.`); +} +const isRefProxy = v => typeof v === "object" && Number.isInteger(v?.num) && v.num >= 0 && Number.isInteger(v?.gen) && v.gen >= 0; +const isNameProxy = v => typeof v === "object" && typeof v?.name === "string"; +const isValidExplicitDest = _isValidExplicitDest.bind(null, isRefProxy, isNameProxy); +class PDFDocumentLoadingTask { + static #docId = 0; + _capability = Promise.withResolvers(); + _transport = null; + _worker = null; + docId = `d${PDFDocumentLoadingTask.#docId++}`; + destroyed = false; + onPassword = null; + onProgress = null; + get promise() { + return this._capability.promise; + } + async destroy() { + this.destroyed = true; + try { + if (this._worker?.port) { + this._worker._pendingDestroy = true; + } + await this._transport?.destroy(); + } catch (ex) { + if (this._worker?.port) { + delete this._worker._pendingDestroy; + } + throw ex; + } + this._transport = null; + this._worker?.destroy(); + this._worker = null; + } + async getData() { + return this._transport.getData(); + } +} +class PDFDataRangeTransport { + constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) { + this.length = length; + this.initialData = initialData; + this.progressiveDone = progressiveDone; + this.contentDispositionFilename = contentDispositionFilename; + this._rangeListeners = []; + this._progressListeners = []; + this._progressiveReadListeners = []; + this._progressiveDoneListeners = []; + this._readyCapability = Promise.withResolvers(); + } + addRangeListener(listener) { + this._rangeListeners.push(listener); + } + addProgressListener(listener) { + this._progressListeners.push(listener); + } + addProgressiveReadListener(listener) { + this._progressiveReadListeners.push(listener); + } + addProgressiveDoneListener(listener) { + this._progressiveDoneListeners.push(listener); + } + onDataRange(begin, chunk) { + for (const listener of this._rangeListeners) { + listener(begin, chunk); + } + } + onDataProgress(loaded, total) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressListeners) { + listener(loaded, total); + } + }); + } + onDataProgressiveRead(chunk) { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveReadListeners) { + listener(chunk); + } + }); + } + onDataProgressiveDone() { + this._readyCapability.promise.then(() => { + for (const listener of this._progressiveDoneListeners) { + listener(); + } + }); + } + transportReady() { + this._readyCapability.resolve(); + } + requestDataRange(begin, end) { + unreachable("Abstract method PDFDataRangeTransport.requestDataRange"); + } + abort() {} +} +class PDFDocumentProxy { + constructor(pdfInfo, transport) { + this._pdfInfo = pdfInfo; + this._transport = transport; + } + get annotationStorage() { + return this._transport.annotationStorage; + } + get canvasFactory() { + return this._transport.canvasFactory; + } + get filterFactory() { + return this._transport.filterFactory; + } + get numPages() { + return this._pdfInfo.numPages; + } + get fingerprints() { + return this._pdfInfo.fingerprints; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + get allXfaHtml() { + return this._transport._htmlForXfa; + } + getPage(pageNumber) { + return this._transport.getPage(pageNumber); + } + getPageIndex(ref) { + return this._transport.getPageIndex(ref); + } + getDestinations() { + return this._transport.getDestinations(); + } + getDestination(id) { + return this._transport.getDestination(id); + } + getPageLabels() { + return this._transport.getPageLabels(); + } + getPageLayout() { + return this._transport.getPageLayout(); + } + getPageMode() { + return this._transport.getPageMode(); + } + getViewerPreferences() { + return this._transport.getViewerPreferences(); + } + getOpenAction() { + return this._transport.getOpenAction(); + } + getAttachments() { + return this._transport.getAttachments(); + } + getJSActions() { + return this._transport.getDocJSActions(); + } + getOutline() { + return this._transport.getOutline(); + } + getOptionalContentConfig({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getOptionalContentConfig(renderingIntent); + } + getPermissions() { + return this._transport.getPermissions(); + } + getMetadata() { + return this._transport.getMetadata(); + } + getMarkInfo() { + return this._transport.getMarkInfo(); + } + getData() { + return this._transport.getData(); + } + saveDocument() { + return this._transport.saveDocument(); + } + getDownloadInfo() { + return this._transport.downloadInfoCapability.promise; + } + cleanup(keepLoadedFonts = false) { + return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa); + } + destroy() { + return this.loadingTask.destroy(); + } + cachedPageNumber(ref) { + return this._transport.cachedPageNumber(ref); + } + get loadingParams() { + return this._transport.loadingParams; + } + get loadingTask() { + return this._transport.loadingTask; + } + getFieldObjects() { + return this._transport.getFieldObjects(); + } + hasJSActions() { + return this._transport.hasJSActions(); + } + getCalculationOrderIds() { + return this._transport.getCalculationOrderIds(); + } +} +class PDFPageProxy { + #pendingCleanup = false; + constructor(pageIndex, pageInfo, transport, pdfBug = false) { + this._pageIndex = pageIndex; + this._pageInfo = pageInfo; + this._transport = transport; + this._stats = pdfBug ? new StatTimer() : null; + this._pdfBug = pdfBug; + this.commonObjs = transport.commonObjs; + this.objs = new PDFObjects(); + this._intentStates = new Map(); + this.destroyed = false; + } + get pageNumber() { + return this._pageIndex + 1; + } + get rotate() { + return this._pageInfo.rotate; + } + get ref() { + return this._pageInfo.ref; + } + get userUnit() { + return this._pageInfo.userUnit; + } + get view() { + return this._pageInfo.view; + } + getViewport({ + scale, + rotation = this.rotate, + offsetX = 0, + offsetY = 0, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.view, + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + getAnnotations({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getAnnotations(this._pageIndex, renderingIntent); + } + getJSActions() { + return this._transport.getPageJSActions(this._pageIndex); + } + get filterFactory() { + return this._transport.filterFactory; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + async getXfa() { + return this._transport._htmlForXfa?.children[this._pageIndex] || null; + } + render({ + canvasContext, + viewport, + intent = "display", + annotationMode = AnnotationMode.ENABLE, + transform = null, + background = null, + optionalContentConfigPromise = null, + annotationCanvasMap = null, + pageColors = null, + printAnnotationStorage = null, + isEditing = false + }) { + this._stats?.time("Overall"); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing); + const { + renderingIntent, + cacheKey + } = intentArgs; + this.#pendingCleanup = false; + optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent); + let intentState = this._intentStates.get(cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(cacheKey, intentState); + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + if (!intentState.displayReadyCapability) { + intentState.displayReadyCapability = Promise.withResolvers(); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + const complete = error => { + intentState.renderTasks.delete(internalRenderTask); + if (intentPrint) { + this.#pendingCleanup = true; + } + this.#tryCleanup(); + if (error) { + internalRenderTask.capability.reject(error); + this._abortOperatorList({ + intentState, + reason: error instanceof Error ? error : new Error(error) + }); + } else { + internalRenderTask.capability.resolve(); + } + if (this._stats) { + this._stats.timeEnd("Rendering"); + this._stats.timeEnd("Overall"); + if (globalThis.Stats?.enabled) { + globalThis.Stats.add(this.pageNumber, this._stats); + } + } + }; + const internalRenderTask = new InternalRenderTask({ + callback: complete, + params: { + canvasContext, + viewport, + transform, + background + }, + objs: this.objs, + commonObjs: this.commonObjs, + annotationCanvasMap, + operatorList: intentState.operatorList, + pageIndex: this._pageIndex, + canvasFactory: this._transport.canvasFactory, + filterFactory: this._transport.filterFactory, + useRequestAnimationFrame: !intentPrint, + pdfBug: this._pdfBug, + pageColors + }); + (intentState.renderTasks ||= new Set()).add(internalRenderTask); + const renderTask = internalRenderTask.task; + Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { + if (this.destroyed) { + complete(); + return; + } + this._stats?.time("Rendering"); + if (!(optionalContentConfig.renderingIntent & renderingIntent)) { + throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` " + "and `PDFDocumentProxy.getOptionalContentConfig` methods."); + } + internalRenderTask.initializeGraphics({ + transparency, + optionalContentConfig + }); + internalRenderTask.operatorListChanged(); + }).catch(complete); + return renderTask; + } + getOperatorList({ + intent = "display", + annotationMode = AnnotationMode.ENABLE, + printAnnotationStorage = null, + isEditing = false + } = {}) { + function operatorListChanged() { + if (intentState.operatorList.lastChunk) { + intentState.opListReadCapability.resolve(intentState.operatorList); + intentState.renderTasks.delete(opListTask); + } + } + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, true); + let intentState = this._intentStates.get(intentArgs.cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(intentArgs.cacheKey, intentState); + } + let opListTask; + if (!intentState.opListReadCapability) { + opListTask = Object.create(null); + opListTask.operatorListChanged = operatorListChanged; + intentState.opListReadCapability = Promise.withResolvers(); + (intentState.renderTasks ||= new Set()).add(opListTask); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + return intentState.opListReadCapability.promise; + } + streamTextContent({ + includeMarkedContent = false, + disableNormalization = false + } = {}) { + const TEXT_CONTENT_CHUNK_SIZE = 100; + return this._transport.messageHandler.sendWithStream("GetTextContent", { + pageIndex: this._pageIndex, + includeMarkedContent: includeMarkedContent === true, + disableNormalization: disableNormalization === true + }, { + highWaterMark: TEXT_CONTENT_CHUNK_SIZE, + size(textContent) { + return textContent.items.length; + } + }); + } + getTextContent(params = {}) { + if (this._transport._htmlForXfa) { + return this.getXfa().then(xfa => XfaText.textContent(xfa)); + } + const readableStream = this.streamTextContent(params); + return new Promise(function (resolve, reject) { + function pump() { + reader.read().then(function ({ + value, + done + }) { + if (done) { + resolve(textContent); + return; + } + textContent.lang ??= value.lang; + Object.assign(textContent.styles, value.styles); + textContent.items.push(...value.items); + pump(); + }, reject); + } + const reader = readableStream.getReader(); + const textContent = { + items: [], + styles: Object.create(null), + lang: null + }; + pump(); + }); + } + getStructTree() { + return this._transport.getStructTree(this._pageIndex); + } + _destroy() { + this.destroyed = true; + const waitOn = []; + for (const intentState of this._intentStates.values()) { + this._abortOperatorList({ + intentState, + reason: new Error("Page was destroyed."), + force: true + }); + if (intentState.opListReadCapability) { + continue; + } + for (const internalRenderTask of intentState.renderTasks) { + waitOn.push(internalRenderTask.completed); + internalRenderTask.cancel(); + } + } + this.objs.clear(); + this.#pendingCleanup = false; + return Promise.all(waitOn); + } + cleanup(resetStats = false) { + this.#pendingCleanup = true; + const success = this.#tryCleanup(); + if (resetStats && success) { + this._stats &&= new StatTimer(); + } + return success; + } + #tryCleanup() { + if (!this.#pendingCleanup || this.destroyed) { + return false; + } + for (const { + renderTasks, + operatorList + } of this._intentStates.values()) { + if (renderTasks.size > 0 || !operatorList.lastChunk) { + return false; + } + } + this._intentStates.clear(); + this.objs.clear(); + this.#pendingCleanup = false; + return true; + } + _startRenderPage(transparency, cacheKey) { + const intentState = this._intentStates.get(cacheKey); + if (!intentState) { + return; + } + this._stats?.timeEnd("Page Request"); + intentState.displayReadyCapability?.resolve(transparency); + } + _renderPageChunk(operatorListChunk, intentState) { + for (let 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; + intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + if (operatorListChunk.lastChunk) { + this.#tryCleanup(); + } + } + _pumpOperatorList({ + renderingIntent, + cacheKey, + annotationStorageSerializable, + modifiedIds + }) { + const { + map, + transfer + } = annotationStorageSerializable; + const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { + pageIndex: this._pageIndex, + intent: renderingIntent, + cacheKey, + annotationStorage: map, + modifiedIds + }, transfer); + const reader = readableStream.getReader(); + const intentState = this._intentStates.get(cacheKey); + intentState.streamReader = reader; + const pump = () => { + reader.read().then(({ + value, + done + }) => { + if (done) { + intentState.streamReader = null; + return; + } + if (this._transport.destroyed) { + return; + } + this._renderPageChunk(value, intentState); + pump(); + }, reason => { + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + if (intentState.operatorList) { + intentState.operatorList.lastChunk = true; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + this.#tryCleanup(); + } + if (intentState.displayReadyCapability) { + intentState.displayReadyCapability.reject(reason); + } else if (intentState.opListReadCapability) { + intentState.opListReadCapability.reject(reason); + } else { + throw reason; + } + }); + }; + pump(); + } + _abortOperatorList({ + intentState, + reason, + force = false + }) { + if (!intentState.streamReader) { + return; + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + if (!force) { + if (intentState.renderTasks.size > 0) { + return; + } + if (reason instanceof RenderingCancelledException) { + let delay = RENDERING_CANCELLED_TIMEOUT; + if (reason.extraDelay > 0 && reason.extraDelay < 1000) { + delay += reason.extraDelay; + } + intentState.streamReaderCancelTimeout = setTimeout(() => { + intentState.streamReaderCancelTimeout = null; + this._abortOperatorList({ + intentState, + reason, + force: true + }); + }, delay); + return; + } + } + intentState.streamReader.cancel(new AbortException(reason.message)).catch(() => {}); + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + for (const [curCacheKey, curIntentState] of this._intentStates) { + if (curIntentState === intentState) { + this._intentStates.delete(curCacheKey); + break; + } + } + this.cleanup(); + } + get stats() { + return this._stats; + } +} +class LoopbackPort { + #listeners = new Map(); + #deferred = Promise.resolve(); + postMessage(obj, transfer) { + const event = { + data: structuredClone(obj, transfer ? { + transfer + } : null) + }; + this.#deferred.then(() => { + for (const [listener] of this.#listeners) { + listener.call(this, event); + } + }); + } + addEventListener(name, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + warn("LoopbackPort - cannot use an `aborted` signal."); + return; + } + const onAbort = () => this.removeEventListener(name, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + this.#listeners.set(listener, rmAbort); + } + removeEventListener(name, listener) { + const rmAbort = this.#listeners.get(listener); + rmAbort?.(); + this.#listeners.delete(listener); + } + terminate() { + for (const [, rmAbort] of this.#listeners) { + rmAbort?.(); + } + this.#listeners.clear(); + } +} +class PDFWorker { + static #fakeWorkerId = 0; + static #isWorkerDisabled = false; + static #workerPorts; + static { + if (isNodeJS) { + this.#isWorkerDisabled = true; + GlobalWorkerOptions.workerSrc ||= "./pdf.worker.mjs"; + } + this._isSameOrigin = (baseUrl, otherUrl) => { + const base = URL.parse(baseUrl); + if (!base?.origin || base.origin === "null") { + return false; + } + const other = new URL(otherUrl, base); + return base.origin === other.origin; + }; + this._createCDNWrapper = url => { + const wrapper = `await import("${url}");`; + return URL.createObjectURL(new Blob([wrapper], { + type: "text/javascript" + })); + }; + } + constructor({ + name = null, + port = null, + verbosity = getVerbosityLevel() + } = {}) { + this.name = name; + this.destroyed = false; + this.verbosity = verbosity; + this._readyCapability = Promise.withResolvers(); + this._port = null; + this._webWorker = null; + this._messageHandler = null; + if (port) { + if (PDFWorker.#workerPorts?.has(port)) { + throw new Error("Cannot use more than one PDFWorker per port."); + } + (PDFWorker.#workerPorts ||= new WeakMap()).set(port, this); + this._initializeFromPort(port); + return; + } + this._initialize(); + } + get promise() { + return this._readyCapability.promise; + } + #resolve() { + this._readyCapability.resolve(); + this._messageHandler.send("configure", { + verbosity: this.verbosity + }); + } + get port() { + return this._port; + } + get messageHandler() { + return this._messageHandler; + } + _initializeFromPort(port) { + this._port = port; + this._messageHandler = new MessageHandler("main", "worker", port); + this._messageHandler.on("ready", function () {}); + this.#resolve(); + } + _initialize() { + if (PDFWorker.#isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) { + this._setupFakeWorker(); + return; + } + let { + workerSrc + } = PDFWorker; + try { + if (!PDFWorker._isSameOrigin(window.location, workerSrc)) { + workerSrc = PDFWorker._createCDNWrapper(new URL(workerSrc, window.location).href); + } + const worker = new Worker(workerSrc, { + type: "module" + }); + const messageHandler = new MessageHandler("main", "worker", worker); + const terminateEarly = () => { + ac.abort(); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + } else { + this._setupFakeWorker(); + } + }; + const ac = new AbortController(); + worker.addEventListener("error", () => { + if (!this._webWorker) { + terminateEarly(); + } + }, { + signal: ac.signal + }); + messageHandler.on("test", data => { + ac.abort(); + if (this.destroyed || !data) { + terminateEarly(); + return; + } + this._messageHandler = messageHandler; + this._port = worker; + this._webWorker = worker; + this.#resolve(); + }); + messageHandler.on("ready", data => { + ac.abort(); + if (this.destroyed) { + terminateEarly(); + return; + } + try { + sendTest(); + } catch { + this._setupFakeWorker(); + } + }); + const sendTest = () => { + const testObj = new Uint8Array(); + messageHandler.send("test", testObj, [testObj.buffer]); + }; + sendTest(); + return; + } catch { + info("The worker has been disabled."); + } + this._setupFakeWorker(); + } + _setupFakeWorker() { + if (!PDFWorker.#isWorkerDisabled) { + warn("Setting up fake worker."); + PDFWorker.#isWorkerDisabled = true; + } + PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + return; + } + const port = new LoopbackPort(); + this._port = port; + const id = `fake${PDFWorker.#fakeWorkerId++}`; + const workerHandler = new MessageHandler(id + "_worker", id, port); + WorkerMessageHandler.setup(workerHandler, port); + this._messageHandler = new MessageHandler(id, id + "_worker", port); + this.#resolve(); + }).catch(reason => { + this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); + }); + } + destroy() { + this.destroyed = true; + this._webWorker?.terminate(); + this._webWorker = null; + PDFWorker.#workerPorts?.delete(this._port); + this._port = null; + this._messageHandler?.destroy(); + this._messageHandler = null; + } + static fromPort(params) { + if (!params?.port) { + throw new Error("PDFWorker.fromPort - invalid method signature."); + } + const cachedPort = this.#workerPorts?.get(params.port); + if (cachedPort) { + if (cachedPort._pendingDestroy) { + throw new Error("PDFWorker.fromPort - the worker is being destroyed.\n" + "Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."); + } + return cachedPort; + } + return new PDFWorker(params); + } + static get workerSrc() { + if (GlobalWorkerOptions.workerSrc) { + return GlobalWorkerOptions.workerSrc; + } + throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); + } + static get #mainThreadWorkerMessageHandler() { + try { + return globalThis.pdfjsWorker?.WorkerMessageHandler || null; + } catch { + return null; + } + } + static get _setupFakeWorkerGlobal() { + const loader = async () => { + if (this.#mainThreadWorkerMessageHandler) { + return this.#mainThreadWorkerMessageHandler; + } + const worker = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + this.workerSrc); + return worker.WorkerMessageHandler; + }; + return shadow(this, "_setupFakeWorkerGlobal", loader()); + } +} +class WorkerTransport { + #methodPromises = new Map(); + #pageCache = new Map(); + #pagePromises = new Map(); + #pageRefCache = new Map(); + #passwordCapability = null; + constructor(messageHandler, loadingTask, networkStream, params, factory) { + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; + this.commonObjs = new PDFObjects(); + this.fontLoader = new FontLoader({ + ownerDocument: params.ownerDocument, + styleElement: params.styleElement + }); + this.loadingParams = params.loadingParams; + this._params = params; + this.canvasFactory = factory.canvasFactory; + this.filterFactory = factory.filterFactory; + this.cMapReaderFactory = factory.cMapReaderFactory; + this.standardFontDataFactory = factory.standardFontDataFactory; + this.wasmFactory = factory.wasmFactory; + this.destroyed = false; + this.destroyCapability = null; + this._networkStream = networkStream; + this._fullReader = null; + this._lastProgress = null; + this.downloadInfoCapability = Promise.withResolvers(); + this.setupMessageHandler(); + } + #cacheSimpleMethod(name, data = null) { + const cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, data); + this.#methodPromises.set(name, promise); + return promise; + } + get annotationStorage() { + return shadow(this, "annotationStorage", new AnnotationStorage()); + } + getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) { + let renderingIntent = RenderingIntentFlag.DISPLAY; + let annotationStorageSerializable = SerializableEmpty; + switch (intent) { + case "any": + renderingIntent = RenderingIntentFlag.ANY; + break; + case "display": + break; + case "print": + renderingIntent = RenderingIntentFlag.PRINT; + break; + default: + warn(`getRenderingIntent - invalid intent: ${intent}`); + } + const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; + switch (annotationMode) { + case AnnotationMode.DISABLE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE; + break; + case AnnotationMode.ENABLE: + break; + case AnnotationMode.ENABLE_FORMS: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS; + break; + case AnnotationMode.ENABLE_STORAGE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE; + annotationStorageSerializable = annotationStorage.serializable; + break; + default: + warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); + } + if (isEditing) { + renderingIntent += RenderingIntentFlag.IS_EDITING; + } + if (isOpList) { + renderingIntent += RenderingIntentFlag.OPLIST; + } + const { + ids: modifiedIds, + hash: modifiedIdsHash + } = annotationStorage.modifiedIds; + const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash]; + return { + renderingIntent, + cacheKey: cacheKeyBuf.join("_"), + annotationStorageSerializable, + modifiedIds + }; + } + destroy() { + if (this.destroyCapability) { + return this.destroyCapability.promise; + } + this.destroyed = true; + this.destroyCapability = Promise.withResolvers(); + this.#passwordCapability?.reject(new Error("Worker was destroyed during onPassword callback")); + const waitOn = []; + for (const page of this.#pageCache.values()) { + waitOn.push(page._destroy()); + } + this.#pageCache.clear(); + this.#pagePromises.clear(); + this.#pageRefCache.clear(); + if (this.hasOwnProperty("annotationStorage")) { + this.annotationStorage.resetModified(); + } + const terminated = this.messageHandler.sendWithPromise("Terminate", null); + waitOn.push(terminated); + Promise.all(waitOn).then(() => { + this.commonObjs.clear(); + this.fontLoader.clear(); + this.#methodPromises.clear(); + this.filterFactory.destroy(); + TextLayer.cleanup(); + this._networkStream?.cancelAllRequests(new AbortException("Worker was terminated.")); + this.messageHandler?.destroy(); + this.messageHandler = null; + this.destroyCapability.resolve(); + }, this.destroyCapability.reject); + return this.destroyCapability.promise; + } + setupMessageHandler() { + const { + messageHandler, + loadingTask + } = this; + messageHandler.on("GetReader", (data, sink) => { + assert(this._networkStream, "GetReader - no `IPDFStream` instance available."); + this._fullReader = this._networkStream.getFullReader(); + this._fullReader.onProgress = evt => { + this._lastProgress = { + loaded: evt.loaded, + total: evt.total + }; + }; + sink.onPull = () => { + this._fullReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + this._fullReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("ReaderHeadersReady", async data => { + await this._fullReader.headersReady; + const { + isStreamingSupported, + isRangeSupported, + contentLength + } = this._fullReader; + if (!isStreamingSupported || !isRangeSupported) { + if (this._lastProgress) { + loadingTask.onProgress?.(this._lastProgress); + } + this._fullReader.onProgress = evt => { + loadingTask.onProgress?.({ + loaded: evt.loaded, + total: evt.total + }); + }; + } + return { + isStreamingSupported, + isRangeSupported, + contentLength + }; + }); + messageHandler.on("GetRangeReader", (data, sink) => { + assert(this._networkStream, "GetRangeReader - no `IPDFStream` instance available."); + const rangeReader = this._networkStream.getRangeReader(data.begin, data.end); + if (!rangeReader) { + sink.close(); + return; + } + sink.onPull = () => { + rangeReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + rangeReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("GetDoc", ({ + pdfInfo + }) => { + this._numPages = pdfInfo.numPages; + this._htmlForXfa = pdfInfo.htmlForXfa; + delete pdfInfo.htmlForXfa; + loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); + }); + messageHandler.on("DocException", ex => { + loadingTask._capability.reject(wrapReason(ex)); + }); + messageHandler.on("PasswordRequest", ex => { + this.#passwordCapability = Promise.withResolvers(); + try { + if (!loadingTask.onPassword) { + throw wrapReason(ex); + } + const updatePassword = password => { + if (password instanceof Error) { + this.#passwordCapability.reject(password); + } else { + this.#passwordCapability.resolve({ + password + }); + } + }; + loadingTask.onPassword(updatePassword, ex.code); + } catch (err) { + this.#passwordCapability.reject(err); + } + return this.#passwordCapability.promise; + }); + messageHandler.on("DataLoaded", data => { + loadingTask.onProgress?.({ + loaded: data.length, + total: data.length + }); + this.downloadInfoCapability.resolve(data); + }); + messageHandler.on("StartRenderPage", data => { + if (this.destroyed) { + return; + } + const page = this.#pageCache.get(data.pageIndex); + page._startRenderPage(data.transparency, data.cacheKey); + }); + messageHandler.on("commonobj", ([id, type, exportedData]) => { + if (this.destroyed) { + return null; + } + if (this.commonObjs.has(id)) { + return null; + } + switch (type) { + case "Font": + if ("error" in exportedData) { + const exportedError = exportedData.error; + warn(`Error during font loading: ${exportedError}`); + this.commonObjs.resolve(id, exportedError); + break; + } + const inspectFont = this._params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; + const font = new FontFaceObject(exportedData, inspectFont); + this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", { + id + })).finally(() => { + if (!font.fontExtraProperties && font.data) { + font.data = null; + } + this.commonObjs.resolve(id, font); + }); + break; + case "CopyLocalImage": + const { + imageRef + } = exportedData; + assert(imageRef, "The imageRef must be defined."); + for (const pageProxy of this.#pageCache.values()) { + for (const [, data] of pageProxy.objs) { + if (data?.ref !== imageRef) { + continue; + } + if (!data.dataLen) { + return null; + } + this.commonObjs.resolve(id, structuredClone(data)); + return data.dataLen; + } + } + break; + case "FontPath": + case "Image": + case "Pattern": + this.commonObjs.resolve(id, exportedData); + break; + default: + throw new Error(`Got unknown common object type ${type}`); + } + return null; + }); + messageHandler.on("obj", ([id, pageIndex, type, imageData]) => { + if (this.destroyed) { + return; + } + const pageProxy = this.#pageCache.get(pageIndex); + if (pageProxy.objs.has(id)) { + return; + } + if (pageProxy._intentStates.size === 0) { + imageData?.bitmap?.close(); + return; + } + switch (type) { + case "Image": + case "Pattern": + pageProxy.objs.resolve(id, imageData); + break; + default: + throw new Error(`Got unknown object type ${type}`); + } + }); + messageHandler.on("DocProgress", data => { + if (this.destroyed) { + return; + } + loadingTask.onProgress?.({ + loaded: data.loaded, + total: data.total + }); + }); + messageHandler.on("FetchBinaryData", async data => { + if (this.destroyed) { + throw new Error("Worker was destroyed."); + } + const factory = this[data.type]; + if (!factory) { + throw new Error(`${data.type} not initialized, see the \`useWorkerFetch\` parameter.`); + } + return factory.fetch(data); + }); + } + getData() { + return this.messageHandler.sendWithPromise("GetData", null); + } + saveDocument() { + if (this.annotationStorage.size <= 0) { + warn("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); + } + const { + map, + transfer + } = this.annotationStorage.serializable; + return this.messageHandler.sendWithPromise("SaveDocument", { + isPureXfa: !!this._htmlForXfa, + numPages: this._numPages, + annotationStorage: map, + filename: this._fullReader?.filename ?? null + }, transfer).finally(() => { + this.annotationStorage.resetModified(); + }); + } + getPage(pageNumber) { + if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) { + return Promise.reject(new Error("Invalid page request.")); + } + const pageIndex = pageNumber - 1, + cachedPromise = this.#pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise("GetPage", { + pageIndex + }).then(pageInfo => { + if (this.destroyed) { + throw new Error("Transport destroyed"); + } + if (pageInfo.refStr) { + this.#pageRefCache.set(pageInfo.refStr, pageNumber); + } + const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.pdfBug); + this.#pageCache.set(pageIndex, page); + return page; + }); + this.#pagePromises.set(pageIndex, promise); + return promise; + } + getPageIndex(ref) { + if (!isRefProxy(ref)) { + return Promise.reject(new Error("Invalid pageIndex request.")); + } + return this.messageHandler.sendWithPromise("GetPageIndex", { + num: ref.num, + gen: ref.gen + }); + } + getAnnotations(pageIndex, intent) { + return this.messageHandler.sendWithPromise("GetAnnotations", { + pageIndex, + intent + }); + } + getFieldObjects() { + return this.#cacheSimpleMethod("GetFieldObjects"); + } + hasJSActions() { + return this.#cacheSimpleMethod("HasJSActions"); + } + getCalculationOrderIds() { + return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); + } + getDestinations() { + return this.messageHandler.sendWithPromise("GetDestinations", null); + } + getDestination(id) { + if (typeof id !== "string") { + return Promise.reject(new Error("Invalid destination request.")); + } + return this.messageHandler.sendWithPromise("GetDestination", { + id + }); + } + getPageLabels() { + return this.messageHandler.sendWithPromise("GetPageLabels", null); + } + getPageLayout() { + return this.messageHandler.sendWithPromise("GetPageLayout", null); + } + getPageMode() { + return this.messageHandler.sendWithPromise("GetPageMode", null); + } + getViewerPreferences() { + return this.messageHandler.sendWithPromise("GetViewerPreferences", null); + } + getOpenAction() { + return this.messageHandler.sendWithPromise("GetOpenAction", null); + } + getAttachments() { + return this.messageHandler.sendWithPromise("GetAttachments", null); + } + getDocJSActions() { + return this.#cacheSimpleMethod("GetDocJSActions"); + } + getPageJSActions(pageIndex) { + return this.messageHandler.sendWithPromise("GetPageJSActions", { + pageIndex + }); + } + getStructTree(pageIndex) { + return this.messageHandler.sendWithPromise("GetStructTree", { + pageIndex + }); + } + getOutline() { + return this.messageHandler.sendWithPromise("GetOutline", null); + } + getOptionalContentConfig(renderingIntent) { + return this.#cacheSimpleMethod("GetOptionalContentConfig").then(data => new OptionalContentConfig(data, renderingIntent)); + } + getPermissions() { + return this.messageHandler.sendWithPromise("GetPermissions", null); + } + getMetadata() { + const name = "GetMetadata", + cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, null).then(results => ({ + info: results[0], + metadata: results[1] ? new Metadata(results[1]) : null, + contentDispositionFilename: this._fullReader?.filename ?? null, + contentLength: this._fullReader?.contentLength ?? null + })); + this.#methodPromises.set(name, promise); + return promise; + } + getMarkInfo() { + return this.messageHandler.sendWithPromise("GetMarkInfo", null); + } + async startCleanup(keepLoadedFonts = false) { + if (this.destroyed) { + return; + } + await this.messageHandler.sendWithPromise("Cleanup", null); + for (const page of this.#pageCache.values()) { + const cleanupSuccessful = page.cleanup(); + if (!cleanupSuccessful) { + throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`); + } + } + this.commonObjs.clear(); + if (!keepLoadedFonts) { + this.fontLoader.clear(); + } + this.#methodPromises.clear(); + this.filterFactory.destroy(true); + TextLayer.cleanup(); + } + cachedPageNumber(ref) { + if (!isRefProxy(ref)) { + return null; + } + const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`; + return this.#pageRefCache.get(refStr) ?? null; + } +} +const INITIAL_DATA = Symbol("INITIAL_DATA"); +class PDFObjects { + #objs = Object.create(null); + #ensureObj(objId) { + return this.#objs[objId] ||= { + ...Promise.withResolvers(), + data: INITIAL_DATA + }; + } + get(objId, callback = null) { + if (callback) { + const obj = this.#ensureObj(objId); + obj.promise.then(() => callback(obj.data)); + return null; + } + const obj = this.#objs[objId]; + if (!obj || obj.data === INITIAL_DATA) { + throw new Error(`Requesting object that isn't resolved yet ${objId}.`); + } + return obj.data; + } + has(objId) { + const obj = this.#objs[objId]; + return !!obj && obj.data !== INITIAL_DATA; + } + delete(objId) { + const obj = this.#objs[objId]; + if (!obj || obj.data === INITIAL_DATA) { + return false; + } + delete this.#objs[objId]; + return true; + } + resolve(objId, data = null) { + const obj = this.#ensureObj(objId); + obj.data = data; + obj.resolve(); + } + clear() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + data?.bitmap?.close(); + } + this.#objs = Object.create(null); + } + *[Symbol.iterator]() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + if (data === INITIAL_DATA) { + continue; + } + yield [objId, data]; + } + } +} +class RenderTask { + #internalRenderTask = null; + onContinue = null; + onError = null; + constructor(internalRenderTask) { + this.#internalRenderTask = internalRenderTask; + } + get promise() { + return this.#internalRenderTask.capability.promise; + } + cancel(extraDelay = 0) { + this.#internalRenderTask.cancel(null, extraDelay); + } + get separateAnnots() { + const { + separateAnnots + } = this.#internalRenderTask.operatorList; + if (!separateAnnots) { + return false; + } + const { + annotationCanvasMap + } = this.#internalRenderTask; + return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0; + } +} +class InternalRenderTask { + #rAF = null; + static #canvasInUse = new WeakSet(); + constructor({ + callback, + params, + objs, + commonObjs, + annotationCanvasMap, + operatorList, + pageIndex, + canvasFactory, + filterFactory, + useRequestAnimationFrame = false, + pdfBug = false, + pageColors = null + }) { + this.callback = callback; + this.params = params; + this.objs = objs; + this.commonObjs = commonObjs; + this.annotationCanvasMap = annotationCanvasMap; + this.operatorListIdx = null; + this.operatorList = operatorList; + this._pageIndex = pageIndex; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this._pdfBug = pdfBug; + this.pageColors = pageColors; + this.running = false; + this.graphicsReadyCallback = null; + this.graphicsReady = false; + this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined"; + this.cancelled = false; + this.capability = Promise.withResolvers(); + this.task = new RenderTask(this); + this._cancelBound = this.cancel.bind(this); + this._continueBound = this._continue.bind(this); + this._scheduleNextBound = this._scheduleNext.bind(this); + this._nextBound = this._next.bind(this); + this._canvas = params.canvasContext.canvas; + } + get completed() { + return this.capability.promise.catch(function () {}); + } + initializeGraphics({ + transparency = false, + optionalContentConfig + }) { + if (this.cancelled) { + return; + } + if (this._canvas) { + if (InternalRenderTask.#canvasInUse.has(this._canvas)) { + throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed."); + } + InternalRenderTask.#canvasInUse.add(this._canvas); + } + if (this._pdfBug && globalThis.StepperManager?.enabled) { + this.stepper = globalThis.StepperManager.create(this._pageIndex); + this.stepper.init(this.operatorList); + this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); + } + const { + canvasContext, + viewport, + transform, + background + } = this.params; + this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig + }, this.annotationCanvasMap, this.pageColors); + this.gfx.beginDrawing({ + transform, + viewport, + transparency, + background + }); + this.operatorListIdx = 0; + this.graphicsReady = true; + this.graphicsReadyCallback?.(); + } + cancel(error = null, extraDelay = 0) { + this.running = false; + this.cancelled = true; + this.gfx?.endDrawing(); + if (this.#rAF) { + window.cancelAnimationFrame(this.#rAF); + this.#rAF = null; + } + InternalRenderTask.#canvasInUse.delete(this._canvas); + error ||= new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay); + this.callback(error); + this.task.onError?.(error); + } + operatorListChanged() { + if (!this.graphicsReady) { + this.graphicsReadyCallback ||= this._continueBound; + return; + } + this.stepper?.updateOperatorList(this.operatorList); + if (this.running) { + return; + } + this._continue(); + } + _continue() { + this.running = true; + if (this.cancelled) { + return; + } + if (this.task.onContinue) { + this.task.onContinue(this._scheduleNextBound); + } else { + this._scheduleNext(); + } + } + _scheduleNext() { + if (this._useRequestAnimationFrame) { + this.#rAF = window.requestAnimationFrame(() => { + this.#rAF = null; + this._nextBound().catch(this._cancelBound); + }); + } else { + Promise.resolve().then(this._nextBound).catch(this._cancelBound); + } + } + async _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(); + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(); + } + } + } +} +const version = "5.2.133"; +const build = "4f7761353"; + +;// ./src/shared/scripting_utils.js +function makeColorComp(n) { + return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); +} +function scaleAndClamp(x) { + return Math.max(0, Math.min(255, 255 * x)); +} +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + static G_rgb([g]) { + g = scaleAndClamp(g); + return [g, g, g]; + } + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_rgb(color) { + return color.map(scaleAndClamp); + } + static RGB_HTML(color) { + return `#${color.map(makeColorComp).join("")}`; + } + static T_HTML() { + return "#00000000"; + } + static T_rgb() { + return [null]; + } + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_rgb([c, y, m, k]) { + return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } +} + +;// ./src/display/svg_factory.js + + +class BaseSVGFactory { + create(width, height, skipDimensions = false) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid SVG dimensions"); + } + const svg = this._createSVG("svg:svg"); + svg.setAttribute("version", "1.1"); + if (!skipDimensions) { + svg.setAttribute("width", `${width}px`); + svg.setAttribute("height", `${height}px`); + } + svg.setAttribute("preserveAspectRatio", "none"); + svg.setAttribute("viewBox", `0 0 ${width} ${height}`); + return svg; + } + createElement(type) { + if (typeof type !== "string") { + throw new Error("Invalid SVG element type"); + } + return this._createSVG(type); + } + _createSVG(type) { + unreachable("Abstract method `_createSVG` called."); + } +} +class DOMSVGFactory extends BaseSVGFactory { + _createSVG(type) { + return document.createElementNS(SVG_NS, type); + } +} + +;// ./src/display/xfa_layer.js + +class XfaLayer { + static setupStorage(html, id, element, storage, intent) { + const storedData = storage.getValue(id, { + value: null + }); + switch (element.name) { + case "textarea": + if (storedData.value !== null) { + html.textContent = storedData.value; + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + break; + case "input": + if (element.attributes.type === "radio" || element.attributes.type === "checkbox") { + if (storedData.value === element.attributes.xfaOn) { + html.setAttribute("checked", true); + } else if (storedData.value === element.attributes.xfaOff) { + html.removeAttribute("checked"); + } + if (intent === "print") { + break; + } + html.addEventListener("change", event => { + storage.setValue(id, { + value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff") + }); + }); + } else { + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + } + break; + case "select": + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + for (const option of element.children) { + if (option.attributes.value === storedData.value) { + option.attributes.selected = true; + } else if (option.attributes.hasOwnProperty("selected")) { + delete option.attributes.selected; + } + } + } + html.addEventListener("input", event => { + const options = event.target.options; + const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value; + storage.setValue(id, { + value + }); + }); + break; + } + } + static setAttributes({ + html, + element, + storage = null, + intent, + linkService + }) { + const { + attributes + } = element; + const isHTMLAnchorElement = html instanceof HTMLAnchorElement; + if (attributes.type === "radio") { + attributes.name = `${attributes.name}-${intent}`; + } + for (const [key, value] of Object.entries(attributes)) { + if (value === null || value === undefined) { + continue; + } + switch (key) { + case "class": + if (value.length) { + html.setAttribute(key, value.join(" ")); + } + break; + case "dataId": + break; + case "id": + html.setAttribute("data-element-id", value); + break; + case "style": + Object.assign(html.style, value); + break; + case "textContent": + html.textContent = value; + break; + default: + if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") { + html.setAttribute(key, value); + } + } + } + if (isHTMLAnchorElement) { + linkService.addLinkAttributes(html, attributes.href, attributes.newWindow); + } + if (storage && attributes.dataId) { + this.setupStorage(html, attributes.dataId, element, storage); + } + } + static render(parameters) { + const storage = parameters.annotationStorage; + const linkService = parameters.linkService; + const root = parameters.xfaHtml; + const intent = parameters.intent || "display"; + const rootHtml = document.createElement(root.name); + if (root.attributes) { + this.setAttributes({ + html: rootHtml, + element: root, + intent, + linkService + }); + } + const isNotForRichText = intent !== "richText"; + const rootDiv = parameters.div; + rootDiv.append(rootHtml); + if (parameters.viewport) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + rootDiv.style.transform = transform; + } + if (isNotForRichText) { + rootDiv.setAttribute("class", "xfaLayer xfaFont"); + } + const textDivs = []; + if (root.children.length === 0) { + if (root.value) { + const node = document.createTextNode(root.value); + rootHtml.append(node); + if (isNotForRichText && XfaText.shouldBuildText(root.name)) { + textDivs.push(node); + } + } + return { + textDivs + }; + } + const stack = [[root, -1, rootHtml]]; + while (stack.length > 0) { + const [parent, i, html] = stack.at(-1); + if (i + 1 === parent.children.length) { + stack.pop(); + continue; + } + const child = parent.children[++stack.at(-1)[1]]; + if (child === null) { + continue; + } + const { + name + } = child; + if (name === "#text") { + const node = document.createTextNode(child.value); + textDivs.push(node); + html.append(node); + continue; + } + const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name); + html.append(childHtml); + if (child.attributes) { + this.setAttributes({ + html: childHtml, + element: child, + storage, + intent, + linkService + }); + } + if (child.children?.length > 0) { + stack.push([child, -1, childHtml]); + } else if (child.value) { + const node = document.createTextNode(child.value); + if (isNotForRichText && XfaText.shouldBuildText(name)) { + textDivs.push(node); + } + childHtml.append(node); + } + } + for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) { + el.setAttribute("readOnly", true); + } + return { + textDivs + }; + } + static update(parameters) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + parameters.div.style.transform = transform; + parameters.div.hidden = false; + } +} + +;// ./src/display/annotation_layer.js + + + + + + +const DEFAULT_TAB_INDEX = 1000; +const annotation_layer_DEFAULT_FONT_SIZE = 9; +const GetElementsByNameSet = new WeakSet(); +class AnnotationElementFactory { + static create(parameters) { + const subtype = parameters.data.annotationType; + switch (subtype) { + case AnnotationType.LINK: + return new LinkAnnotationElement(parameters); + case AnnotationType.TEXT: + return new TextAnnotationElement(parameters); + case AnnotationType.WIDGET: + const fieldType = parameters.data.fieldType; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotationElement(parameters); + case "Btn": + if (parameters.data.radioButton) { + return new RadioButtonWidgetAnnotationElement(parameters); + } else if (parameters.data.checkBox) { + return new CheckboxWidgetAnnotationElement(parameters); + } + return new PushButtonWidgetAnnotationElement(parameters); + case "Ch": + return new ChoiceWidgetAnnotationElement(parameters); + case "Sig": + return new SignatureWidgetAnnotationElement(parameters); + } + return new WidgetAnnotationElement(parameters); + case AnnotationType.POPUP: + return new PopupAnnotationElement(parameters); + case AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case AnnotationType.LINE: + return new LineAnnotationElement(parameters); + case AnnotationType.SQUARE: + return new SquareAnnotationElement(parameters); + case AnnotationType.CIRCLE: + return new CircleAnnotationElement(parameters); + case AnnotationType.POLYLINE: + return new PolylineAnnotationElement(parameters); + case AnnotationType.CARET: + return new CaretAnnotationElement(parameters); + case AnnotationType.INK: + return new InkAnnotationElement(parameters); + case AnnotationType.POLYGON: + return new PolygonAnnotationElement(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); + case AnnotationType.STAMP: + return new StampAnnotationElement(parameters); + case AnnotationType.FILEATTACHMENT: + return new FileAttachmentAnnotationElement(parameters); + default: + return new AnnotationElement(parameters); + } + } +} +class AnnotationElement { + #updates = null; + #hasBorder = false; + #popupElement = null; + constructor(parameters, { + isRenderable = false, + ignoreBorder = false, + createQuadrilaterals = false + } = {}) { + this.isRenderable = isRenderable; + this.data = parameters.data; + this.layer = parameters.layer; + this.linkService = parameters.linkService; + this.downloadManager = parameters.downloadManager; + this.imageResourcesPath = parameters.imageResourcesPath; + this.renderForms = parameters.renderForms; + this.svgFactory = parameters.svgFactory; + this.annotationStorage = parameters.annotationStorage; + this.enableScripting = parameters.enableScripting; + this.hasJSActions = parameters.hasJSActions; + this._fieldObjects = parameters.fieldObjects; + this.parent = parameters.parent; + if (isRenderable) { + this.container = this._createContainer(ignoreBorder); + } + if (createQuadrilaterals) { + this._createQuadrilaterals(); + } + } + static _hasPopupData({ + titleObj, + contentsObj, + richText + }) { + return !!(titleObj?.str || contentsObj?.str || richText?.str); + } + get _isEditable() { + return this.data.isEditable; + } + get hasPopupData() { + return AnnotationElement._hasPopupData(this.data); + } + updateEdited(params) { + if (!this.container) { + return; + } + this.#updates ||= { + rect: this.data.rect.slice(0) + }; + const { + rect + } = params; + if (rect) { + this.#setRectEdited(rect); + } + this.#popupElement?.popup.updateEdited(params); + } + resetEdited() { + if (!this.#updates) { + return; + } + this.#setRectEdited(this.#updates.rect); + this.#popupElement?.popup.resetEdited(); + this.#updates = null; + } + #setRectEdited(rect) { + const { + container: { + style + }, + data: { + rect: currentRect, + rotation + }, + parent: { + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } + } = this; + currentRect?.splice(0, 4, ...rect); + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`; + if (rotation === 0) { + style.width = `${100 * (rect[2] - rect[0]) / pageWidth}%`; + style.height = `${100 * (rect[3] - rect[1]) / pageHeight}%`; + } else { + this.setRotation(rotation); + } + } + _createContainer(ignoreBorder) { + const { + data, + parent: { + page, + viewport + } + } = this; + const container = document.createElement("section"); + container.setAttribute("data-annotation-id", data.id); + if (!(this instanceof WidgetAnnotationElement)) { + container.tabIndex = DEFAULT_TAB_INDEX; + } + const { + style + } = container; + style.zIndex = this.parent.zIndex++; + if (data.alternativeText) { + container.title = data.alternativeText; + } + if (data.noRotate) { + container.classList.add("norotate"); + } + if (!data.rect || this instanceof PopupAnnotationElement) { + const { + rotation + } = data; + if (!data.hasOwnCanvas && rotation !== 0) { + this.setRotation(rotation, container); + } + return container; + } + const { + width, + height + } = this; + if (!ignoreBorder && data.borderStyle.width > 0) { + style.borderWidth = `${data.borderStyle.width}px`; + const horizontalRadius = data.borderStyle.horizontalCornerRadius; + const verticalRadius = data.borderStyle.verticalCornerRadius; + if (horizontalRadius > 0 || verticalRadius > 0) { + const radius = `calc(${horizontalRadius}px * var(--total-scale-factor)) / calc(${verticalRadius}px * var(--total-scale-factor))`; + style.borderRadius = radius; + } else if (this instanceof RadioButtonWidgetAnnotationElement) { + const radius = `calc(${width}px * var(--total-scale-factor)) / calc(${height}px * var(--total-scale-factor))`; + style.borderRadius = radius; + } + switch (data.borderStyle.style) { + case AnnotationBorderStyleType.SOLID: + style.borderStyle = "solid"; + break; + case AnnotationBorderStyleType.DASHED: + 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: + style.borderBottomStyle = "solid"; + break; + default: + break; + } + const borderColor = data.borderColor || null; + if (borderColor) { + this.#hasBorder = true; + style.borderColor = Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0); + } else { + style.borderWidth = 0; + } + } + const 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]]); + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; + const { + rotation + } = data; + if (data.hasOwnCanvas || rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation, container); + } + return container; + } + setRotation(angle, container = this.container) { + if (!this.data.rect) { + return; + } + const { + pageWidth, + pageHeight + } = this.parent.viewport.rawDims; + let { + width, + height + } = this; + if (angle % 180 !== 0) { + [width, height] = [height, width]; + } + container.style.width = `${100 * width / pageWidth}%`; + container.style.height = `${100 * height / pageHeight}%`; + container.setAttribute("data-main-rotation", (360 - angle) % 360); + } + get _commonActions() { + const setColor = (jsName, styleName, event) => { + const color = event.detail[jsName]; + const colorType = color[0]; + const colorArray = color.slice(1); + event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray); + this.annotationStorage.setValue(this.data.id, { + [styleName]: ColorConverters[`${colorType}_rgb`](colorArray) + }); + }; + return shadow(this, "_commonActions", { + display: event => { + const { + display + } = event.detail; + const hidden = display % 2 === 1; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noView: hidden, + noPrint: display === 1 || display === 2 + }); + }, + print: event => { + this.annotationStorage.setValue(this.data.id, { + noPrint: !event.detail.print + }); + }, + hidden: event => { + const { + hidden + } = event.detail; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noPrint: hidden, + noView: hidden + }); + }, + focus: event => { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + userName: event => { + event.target.title = event.detail.userName; + }, + readonly: event => { + event.target.disabled = event.detail.readonly; + }, + required: event => { + this._setRequired(event.target, event.detail.required); + }, + bgColor: event => { + setColor("bgColor", "backgroundColor", event); + }, + fillColor: event => { + setColor("fillColor", "backgroundColor", event); + }, + fgColor: event => { + setColor("fgColor", "color", event); + }, + textColor: event => { + setColor("textColor", "color", event); + }, + borderColor: event => { + setColor("borderColor", "borderColor", event); + }, + strokeColor: event => { + setColor("strokeColor", "borderColor", event); + }, + rotation: event => { + const angle = event.detail.rotation; + this.setRotation(angle); + this.annotationStorage.setValue(this.data.id, { + rotation: angle + }); + } + }); + } + _dispatchEventFromSandbox(actions, jsEvent) { + const commonActions = this._commonActions; + for (const name of Object.keys(jsEvent.detail)) { + const action = actions[name] || commonActions[name]; + action?.(jsEvent); + } + } + _setDefaultPropertiesFromJS(element) { + if (!this.enableScripting) { + return; + } + const storedData = this.annotationStorage.getRawValue(this.data.id); + if (!storedData) { + return; + } + const commonActions = this._commonActions; + for (const [actionName, detail] of Object.entries(storedData)) { + const action = commonActions[actionName]; + if (action) { + const eventProxy = { + detail: { + [actionName]: detail + }, + target: element + }; + action(eventProxy); + delete storedData[actionName]; + } + } + } + _createQuadrilaterals() { + if (!this.container) { + return; + } + const { + quadPoints + } = this.data; + if (!quadPoints) { + return; + } + const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x => Math.fround(x)); + if (quadPoints.length === 8) { + const [trX, trY, blX, blY] = quadPoints.subarray(2, 6); + if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) { + return; + } + } + const { + style + } = this.container; + let svgBuffer; + if (this.#hasBorder) { + const { + borderColor, + borderWidth + } = style; + style.borderWidth = 0; + svgBuffer = ["url('data:image/svg+xml;utf8,", ``, ``]; + this.container.classList.add("hasBorder"); + } + const width = rectTrX - rectBlX; + const height = rectTrY - rectBlY; + const { + svgFactory + } = this; + const svg = svgFactory.createElement("svg"); + svg.classList.add("quadrilateralsContainer"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const clipPath = svgFactory.createElement("clipPath"); + const id = `clippath_${this.data.id}`; + clipPath.setAttribute("id", id); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + defs.append(clipPath); + for (let i = 2, ii = quadPoints.length; i < ii; i += 8) { + const trX = quadPoints[i]; + const trY = quadPoints[i + 1]; + const blX = quadPoints[i + 2]; + const blY = quadPoints[i + 3]; + const rect = svgFactory.createElement("rect"); + const x = (blX - rectBlX) / width; + const y = (rectTrY - trY) / height; + const rectWidth = (trX - blX) / width; + const rectHeight = (trY - blY) / height; + rect.setAttribute("x", x); + rect.setAttribute("y", y); + rect.setAttribute("width", rectWidth); + rect.setAttribute("height", rectHeight); + clipPath.append(rect); + svgBuffer?.push(``); + } + if (this.#hasBorder) { + svgBuffer.push(`')`); + style.backgroundImage = svgBuffer.join(""); + } + this.container.append(svg); + this.container.style.clipPath = `url(#${id})`; + } + _createPopup() { + const { + data + } = this; + const popup = this.#popupElement = new PopupAnnotationElement({ + data: { + color: data.color, + titleObj: data.titleObj, + modificationDate: data.modificationDate, + contentsObj: data.contentsObj, + richText: data.richText, + parentRect: data.rect, + borderStyle: 0, + id: `popup_${data.id}`, + rotation: data.rotation + }, + parent: this.parent, + elements: [this] + }); + this.parent.div.append(popup.render()); + } + render() { + unreachable("Abstract method `AnnotationElement.render` called"); + } + _getElementsByName(name, skipId = null) { + const fields = []; + if (this._fieldObjects) { + const fieldObj = this._fieldObjects[name]; + if (fieldObj) { + for (const { + page, + id, + exportValues + } of fieldObj) { + if (page === -1) { + continue; + } + if (id === skipId) { + continue; + } + const exportValue = typeof exportValues === "string" ? exportValues : null; + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (domElement && !GetElementsByNameSet.has(domElement)) { + warn(`_getElementsByName - element not allowed: ${id}`); + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + } + return fields; + } + for (const domElement of document.getElementsByName(name)) { + const { + exportValue + } = domElement; + const id = domElement.getAttribute("data-element-id"); + if (id === skipId) { + continue; + } + if (!GetElementsByNameSet.has(domElement)) { + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + return fields; + } + show() { + if (this.container) { + this.container.hidden = false; + } + this.popup?.maybeShow(); + } + hide() { + if (this.container) { + this.container.hidden = true; + } + this.popup?.forceHide(); + } + getElementsToTriggerPopup() { + return this.container; + } + addHighlightArea() { + const triggers = this.getElementsToTriggerPopup(); + if (Array.isArray(triggers)) { + for (const element of triggers) { + element.classList.add("highlightArea"); + } + } else { + triggers.classList.add("highlightArea"); + } + } + _editOnDoubleClick() { + if (!this._isEditable) { + return; + } + const { + annotationEditorType: mode, + data: { + id: editId + } + } = this; + this.container.addEventListener("dblclick", () => { + this.linkService.eventBus?.dispatch("switchannotationeditormode", { + source: this, + mode, + editId + }); + }); + } + get width() { + return this.data.rect[2] - this.data.rect[0]; + } + get height() { + return this.data.rect[3] - this.data.rect[1]; + } +} +class LinkAnnotationElement extends AnnotationElement { + constructor(parameters, options = null) { + super(parameters, { + isRenderable: true, + ignoreBorder: !!options?.ignoreBorder, + createQuadrilaterals: true + }); + this.isTooltipOnly = parameters.data.isTooltipOnly; + } + render() { + const { + data, + linkService + } = this; + const link = document.createElement("a"); + link.setAttribute("data-element-id", data.id); + let isBound = false; + if (data.url) { + linkService.addLinkAttributes(link, data.url, data.newWindow); + isBound = true; + } else if (data.action) { + this._bindNamedAction(link, data.action); + isBound = true; + } else if (data.attachment) { + this.#bindAttachment(link, data.attachment, data.attachmentDest); + isBound = true; + } else if (data.setOCGState) { + this.#bindSetOCGState(link, data.setOCGState); + isBound = true; + } else if (data.dest) { + this._bindLink(link, data.dest); + isBound = true; + } else { + if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) { + this._bindJSAction(link, data); + isBound = true; + } + if (data.resetForm) { + this._bindResetFormAction(link, data.resetForm); + isBound = true; + } else if (this.isTooltipOnly && !isBound) { + this._bindLink(link, ""); + isBound = true; + } + } + this.container.classList.add("linkAnnotation"); + if (isBound) { + this.container.append(link); + } + return this.container; + } + #setInternalLink() { + this.container.setAttribute("data-internal-link", ""); + } + _bindLink(link, destination) { + link.href = this.linkService.getDestinationHash(destination); + link.onclick = () => { + if (destination) { + this.linkService.goToDestination(destination); + } + return false; + }; + if (destination || destination === "") { + this.#setInternalLink(); + } + } + _bindNamedAction(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeNamedAction(action); + return false; + }; + this.#setInternalLink(); + } + #bindAttachment(link, attachment, dest = null) { + link.href = this.linkService.getAnchorUrl(""); + if (attachment.description) { + link.title = attachment.description; + } + link.onclick = () => { + this.downloadManager?.openOrDownloadData(attachment.content, attachment.filename, dest); + return false; + }; + this.#setInternalLink(); + } + #bindSetOCGState(link, action) { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeSetOCGState(action); + return false; + }; + this.#setInternalLink(); + } + _bindJSAction(link, data) { + link.href = this.linkService.getAnchorUrl(""); + const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); + for (const name of Object.keys(data.actions)) { + const jsName = map.get(name); + if (!jsName) { + continue; + } + link[jsName] = () => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: data.id, + name + } + }); + return false; + }; + } + if (!link.onclick) { + link.onclick = () => false; + } + this.#setInternalLink(); + } + _bindResetFormAction(link, resetForm) { + const otherClickAction = link.onclick; + if (!otherClickAction) { + link.href = this.linkService.getAnchorUrl(""); + } + this.#setInternalLink(); + if (!this._fieldObjects) { + warn(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided."); + if (!otherClickAction) { + link.onclick = () => false; + } + return; + } + link.onclick = () => { + otherClickAction?.(); + const { + fields: resetFormFields, + refs: resetFormRefs, + include + } = resetForm; + const allFields = []; + if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) { + const fieldIds = new Set(resetFormRefs); + for (const fieldName of resetFormFields) { + const fields = this._fieldObjects[fieldName] || []; + for (const { + id + } of fields) { + fieldIds.add(id); + } + } + for (const fields of Object.values(this._fieldObjects)) { + for (const field of fields) { + if (fieldIds.has(field.id) === include) { + allFields.push(field); + } + } + } + } else { + for (const fields of Object.values(this._fieldObjects)) { + allFields.push(...fields); + } + } + const storage = this.annotationStorage; + const allIds = []; + for (const field of allFields) { + const { + id + } = field; + allIds.push(id); + switch (field.type) { + case "text": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + case "checkbox": + case "radiobutton": + { + const value = field.defaultValue === field.exportValues; + storage.setValue(id, { + value + }); + break; + } + case "combobox": + case "listbox": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + default: + continue; + } + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (!domElement) { + continue; + } else if (!GetElementsByNameSet.has(domElement)) { + warn(`_bindResetFormAction - element not allowed: ${id}`); + continue; + } + domElement.dispatchEvent(new Event("resetform")); + } + if (this.enableScripting) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: "app", + ids: allIds, + name: "ResetForm" + } + }); + } + return false; + }; + } +} +class TextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + } + render() { + this.container.classList.add("textAnnotation"); + const image = document.createElement("img"); + image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; + image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"); + image.setAttribute("data-l10n-args", JSON.stringify({ + type: this.data.name + })); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.append(image); + return this.container; + } +} +class WidgetAnnotationElement extends AnnotationElement { + render() { + return this.container; + } + showElementAndHideCanvas(element) { + if (this.data.hasOwnCanvas) { + if (element.previousSibling?.nodeName === "CANVAS") { + element.previousSibling.hidden = true; + } + element.hidden = false; + } + } + _getKeyModifier(event) { + return util_FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey; + } + _setEventListener(element, elementData, baseName, eventName, valueGetter) { + if (baseName.includes("mouse")) { + element.addEventListener(baseName, event => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event), + shift: event.shiftKey, + modifier: this._getKeyModifier(event) + } + }); + }); + } else { + element.addEventListener(baseName, event => { + if (baseName === "blur") { + if (!elementData.focused || !event.relatedTarget) { + return; + } + elementData.focused = false; + } else if (baseName === "focus") { + if (elementData.focused) { + return; + } + elementData.focused = true; + } + if (!valueGetter) { + return; + } + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event) + } + }); + }); + } + } + _setEventListeners(element, elementData, names, getter) { + for (const [baseName, eventName] of names) { + if (eventName === "Action" || this.data.actions?.[eventName]) { + if (eventName === "Focus" || eventName === "Blur") { + elementData ||= { + focused: false + }; + } + this._setEventListener(element, elementData, baseName, eventName, getter); + if (eventName === "Focus" && !this.data.actions?.Blur) { + this._setEventListener(element, elementData, "blur", "Blur", null); + } else if (eventName === "Blur" && !this.data.actions?.Focus) { + this._setEventListener(element, elementData, "focus", "Focus", null); + } + } + } + } + _setBackgroundColor(element) { + const color = this.data.backgroundColor || null; + element.style.backgroundColor = color === null ? "transparent" : Util.makeHexColor(color[0], color[1], color[2]); + } + _setTextStyle(element) { + const TEXT_ALIGNMENT = ["left", "center", "right"]; + const { + fontColor + } = this.data.defaultAppearanceData; + const fontSize = this.data.defaultAppearanceData.fontSize || annotation_layer_DEFAULT_FONT_SIZE; + const style = element.style; + let computedFontSize; + const BORDER_SIZE = 2; + const roundToOneDecimal = x => Math.round(10 * x) / 10; + if (this.data.multiLine) { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1; + const lineHeight = height / numberOfLines; + computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / LINE_FACTOR)); + } else { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + computedFontSize = Math.min(fontSize, roundToOneDecimal(height / LINE_FACTOR)); + } + style.fontSize = `calc(${computedFontSize}px * var(--total-scale-factor))`; + style.color = Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]); + if (this.data.textAlignment !== null) { + style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } + } + _setRequired(element, isRequired) { + if (isRequired) { + element.setAttribute("required", true); + } else { + element.removeAttribute("required"); + } + element.setAttribute("aria-required", isRequired); + } +} +class TextWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue; + super(parameters, { + isRenderable + }); + } + setPropertyOnSiblings(base, key, value, keyInStorage) { + const storage = this.annotationStorage; + for (const element of this._getElementsByName(base.name, base.id)) { + if (element.domElement) { + element.domElement[key] = value; + } + storage.setValue(element.id, { + [keyInStorage]: value + }); + } + } + render() { + const storage = this.annotationStorage; + const id = this.data.id; + this.container.classList.add("textWidgetAnnotation"); + let element = null; + if (this.renderForms) { + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + let textContent = storedData.value || ""; + const maxLen = storage.getValue(id, { + charLimit: this.data.maxLen + }).charLimit; + if (maxLen && textContent.length > maxLen) { + textContent = textContent.slice(0, maxLen); + } + let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join("\n") || null; + if (fieldFormattedValues && this.data.comb) { + fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, ""); + } + const elementData = { + userValue: textContent, + formattedValue: fieldFormattedValues, + lastCommittedValue: null, + commitKey: 1, + focused: false + }; + if (this.data.multiLine) { + element = document.createElement("textarea"); + element.textContent = fieldFormattedValues ?? textContent; + if (this.data.doNotScroll) { + element.style.overflowY = "hidden"; + } + } else { + element = document.createElement("input"); + element.type = this.data.password ? "password" : "text"; + element.setAttribute("value", fieldFormattedValues ?? textContent); + if (this.data.doNotScroll) { + element.style.overflowX = "hidden"; + } + } + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = this.data.readOnly; + element.name = this.data.fieldName; + element.tabIndex = DEFAULT_TAB_INDEX; + this._setRequired(element, this.data.required); + if (maxLen) { + element.maxLength = maxLen; + } + element.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + this.setPropertyOnSiblings(element, "value", event.target.value, "value"); + elementData.formattedValue = null; + }); + element.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue ?? ""; + element.value = elementData.userValue = defaultValue; + elementData.formattedValue = null; + }); + let blurListener = event => { + const { + formattedValue + } = elementData; + if (formattedValue !== null && formattedValue !== undefined) { + event.target.value = formattedValue; + } + event.target.scrollLeft = 0; + }; + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("focus", event => { + if (elementData.focused) { + return; + } + const { + target + } = event; + if (elementData.userValue) { + target.value = elementData.userValue; + } + elementData.lastCommittedValue = target.value; + elementData.commitKey = 1; + if (!this.data.actions?.Focus) { + elementData.focused = true; + } + }); + element.addEventListener("updatefromsandbox", jsEvent => { + this.showElementAndHideCanvas(jsEvent.target); + const actions = { + value(event) { + elementData.userValue = event.detail.value ?? ""; + storage.setValue(id, { + value: elementData.userValue.toString() + }); + event.target.value = elementData.userValue; + }, + formattedValue(event) { + const { + formattedValue + } = event.detail; + elementData.formattedValue = formattedValue; + if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) { + event.target.value = formattedValue; + } + storage.setValue(id, { + formattedValue + }); + }, + selRange(event) { + event.target.setSelectionRange(...event.detail.selRange); + }, + charLimit: event => { + const { + charLimit + } = event.detail; + const { + target + } = event; + if (charLimit === 0) { + target.removeAttribute("maxLength"); + return; + } + target.setAttribute("maxLength", charLimit); + let value = elementData.userValue; + if (!value || value.length <= charLimit) { + return; + } + value = value.slice(0, charLimit); + target.value = elementData.userValue = value; + storage.setValue(id, { + value + }); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: 1, + selStart: target.selectionStart, + selEnd: target.selectionEnd + } + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + element.addEventListener("keydown", event => { + elementData.commitKey = 1; + let commitKey = -1; + if (event.key === "Escape") { + commitKey = 0; + } else if (event.key === "Enter" && !this.data.multiLine) { + commitKey = 2; + } else if (event.key === "Tab") { + elementData.commitKey = 3; + } + if (commitKey === -1) { + return; + } + const { + value + } = event.target; + if (elementData.lastCommittedValue === value) { + return; + } + elementData.lastCommittedValue = value; + elementData.userValue = value; + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + }); + const _blurListener = blurListener; + blurListener = null; + element.addEventListener("blur", event => { + if (!elementData.focused || !event.relatedTarget) { + return; + } + if (!this.data.actions?.Blur) { + elementData.focused = false; + } + const { + value + } = event.target; + elementData.userValue = value; + if (elementData.lastCommittedValue !== value) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: elementData.commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + } + _blurListener(event); + }); + if (this.data.actions?.Keystroke) { + element.addEventListener("beforeinput", event => { + elementData.lastCommittedValue = null; + const { + data, + target + } = event; + const { + value, + selectionStart, + selectionEnd + } = target; + let selStart = selectionStart, + selEnd = selectionEnd; + switch (event.inputType) { + case "deleteWordBackward": + { + const match = value.substring(0, selectionStart).match(/\w*[^\w]*$/); + if (match) { + selStart -= match[0].length; + } + break; + } + case "deleteWordForward": + { + const match = value.substring(selectionStart).match(/^[^\w]*\w*/); + if (match) { + selEnd += match[0].length; + } + break; + } + case "deleteContentBackward": + if (selectionStart === selectionEnd) { + selStart -= 1; + } + break; + case "deleteContentForward": + if (selectionStart === selectionEnd) { + selEnd += 1; + } + break; + } + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + change: data || "", + willCommit: false, + selStart, + selEnd + } + }); + }); + } + this._setEventListeners(element, elementData, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); + } + if (blurListener) { + element.addEventListener("blur", blurListener); + } + if (this.data.comb) { + const fieldWidth = this.data.rect[2] - this.data.rect[0]; + const combWidth = fieldWidth / maxLen; + element.classList.add("comb"); + element.style.letterSpacing = `calc(${combWidth}px * var(--total-scale-factor) - 1ch)`; + } + } else { + element = document.createElement("div"); + element.textContent = this.data.fieldValue; + element.style.verticalAlign = "middle"; + element.style.display = "table-cell"; + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + } + this._setTextStyle(element); + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class SignatureWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: !!parameters.data.hasOwnCanvas + }); + } +} +class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.exportValue === data.fieldValue + }).value; + if (typeof value === "string") { + value = value !== "Off"; + storage.setValue(id, { + value + }); + } + this.container.classList.add("buttonWidgetAnnotation", "checkBox"); + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "checkbox"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.setAttribute("exportValue", data.exportValue); + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const checkbox of this._getElementsByName(name, id)) { + const curChecked = checked && checkbox.exportValue === data.exportValue; + if (checkbox.domElement) { + checkbox.domElement.checked = curChecked; + } + storage.setValue(checkbox.id, { + value: curChecked + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue || "Off"; + event.target.checked = defaultValue === data.exportValue; + }); + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + event.target.checked = event.detail.value !== "Off"; + storage.setValue(id, { + value: event.target.checked + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("buttonWidgetAnnotation", "radioButton"); + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.fieldValue === data.buttonValue + }).value; + if (typeof value === "string") { + value = value !== data.buttonValue; + storage.setValue(id, { + value + }); + } + if (value) { + for (const radio of this._getElementsByName(data.fieldName, id)) { + storage.setValue(radio.id, { + value: false + }); + } + } + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "radio"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.tabIndex = DEFAULT_TAB_INDEX; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const radio of this._getElementsByName(name, id)) { + storage.setValue(radio.id, { + value: false + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue; + event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue; + }); + if (this.enableScripting && this.hasJSActions) { + const pdfButtonValue = data.buttonValue; + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value: event => { + const checked = pdfButtonValue === event.detail.value; + for (const radio of this._getElementsByName(event.target.name)) { + const curChecked = checked && radio.id === id; + if (radio.domElement) { + radio.domElement.checked = curChecked; + } + storage.setValue(radio.id, { + value: curChecked + }); + } + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { + constructor(parameters) { + super(parameters, { + ignoreBorder: parameters.data.hasAppearance + }); + } + render() { + const container = super.render(); + container.classList.add("buttonWidgetAnnotation", "pushButton"); + const linkElement = container.lastChild; + if (this.enableScripting && this.hasJSActions && linkElement) { + this._setDefaultPropertiesFromJS(linkElement); + linkElement.addEventListener("updatefromsandbox", jsEvent => { + this._dispatchEventFromSandbox({}, jsEvent); + }); + } + return container; + } +} +class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("choiceWidgetAnnotation"); + const storage = this.annotationStorage; + const id = this.data.id; + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + const selectElement = document.createElement("select"); + GetElementsByNameSet.add(selectElement); + selectElement.setAttribute("data-element-id", id); + selectElement.disabled = this.data.readOnly; + this._setRequired(selectElement, this.data.required); + selectElement.name = this.data.fieldName; + selectElement.tabIndex = DEFAULT_TAB_INDEX; + let addAnEmptyEntry = this.data.combo && this.data.options.length > 0; + if (!this.data.combo) { + selectElement.size = this.data.options.length; + if (this.data.multiSelect) { + selectElement.multiple = true; + } + } + selectElement.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue; + for (const option of selectElement.options) { + option.selected = option.value === defaultValue; + } + }); + for (const option of this.data.options) { + const optionElement = document.createElement("option"); + optionElement.textContent = option.displayValue; + optionElement.value = option.exportValue; + if (storedData.value.includes(option.exportValue)) { + optionElement.setAttribute("selected", true); + addAnEmptyEntry = false; + } + selectElement.append(optionElement); + } + let removeEmptyEntry = null; + if (addAnEmptyEntry) { + const noneOptionElement = document.createElement("option"); + noneOptionElement.value = " "; + noneOptionElement.setAttribute("hidden", true); + noneOptionElement.setAttribute("selected", true); + selectElement.prepend(noneOptionElement); + removeEmptyEntry = () => { + noneOptionElement.remove(); + selectElement.removeEventListener("input", removeEmptyEntry); + removeEmptyEntry = null; + }; + selectElement.addEventListener("input", removeEmptyEntry); + } + const getValue = isExport => { + const name = isExport ? "value" : "textContent"; + const { + options, + multiple + } = selectElement; + if (!multiple) { + return options.selectedIndex === -1 ? null : options[options.selectedIndex][name]; + } + return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]); + }; + let selectedValues = getValue(false); + const getItems = event => { + const options = event.target.options; + return Array.prototype.map.call(options, option => ({ + displayValue: option.textContent, + exportValue: option.value + })); + }; + if (this.enableScripting && this.hasJSActions) { + selectElement.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + removeEmptyEntry?.(); + const value = event.detail.value; + const values = new Set(Array.isArray(value) ? value : [value]); + for (const option of selectElement.options) { + option.selected = values.has(option.value); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + multipleSelection(event) { + selectElement.multiple = true; + }, + remove(event) { + const options = selectElement.options; + const index = event.detail.remove; + options[index].selected = false; + selectElement.remove(index); + if (options.length > 0) { + const i = Array.prototype.findIndex.call(options, option => option.selected); + if (i === -1) { + options[0].selected = true; + } + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + clear(event) { + while (selectElement.length !== 0) { + selectElement.remove(0); + } + storage.setValue(id, { + value: null, + items: [] + }); + selectedValues = getValue(false); + }, + insert(event) { + const { + index, + displayValue, + exportValue + } = event.detail.insert; + const selectChild = selectElement.children[index]; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + if (selectChild) { + selectChild.before(optionElement); + } else { + selectElement.append(optionElement); + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + items(event) { + const { + items + } = event.detail; + while (selectElement.length !== 0) { + selectElement.remove(0); + } + for (const item of items) { + const { + displayValue, + exportValue + } = item; + const optionElement = document.createElement("option"); + optionElement.textContent = displayValue; + optionElement.value = exportValue; + selectElement.append(optionElement); + } + if (selectElement.options.length > 0) { + selectElement.options[0].selected = true; + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + indices(event) { + const indices = new Set(event.detail.indices); + for (const option of event.target.options) { + option.selected = indices.has(option.index); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + editable(event) { + event.target.disabled = !event.detail.editable; + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + selectElement.addEventListener("input", event => { + const exportValue = getValue(true); + const change = getValue(false); + storage.setValue(id, { + value: exportValue + }); + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: selectedValues, + change, + changeEx: exportValue, + willCommit: false, + commitKey: 1, + keyDown: false + } + }); + }); + this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], event => event.target.value); + } else { + selectElement.addEventListener("input", function (event) { + storage.setValue(id, { + value: getValue(true) + }); + }); + } + if (this.data.combo) { + this._setTextStyle(selectElement); + } else {} + this._setBackgroundColor(selectElement); + this._setDefaultPropertiesFromJS(selectElement); + this.container.append(selectElement); + return this.container; + } +} +class PopupAnnotationElement extends AnnotationElement { + constructor(parameters) { + const { + data, + elements + } = parameters; + super(parameters, { + isRenderable: AnnotationElement._hasPopupData(data) + }); + this.elements = elements; + this.popup = null; + } + render() { + this.container.classList.add("popupAnnotation"); + const popup = this.popup = new PopupElement({ + container: this.container, + color: this.data.color, + titleObj: this.data.titleObj, + modificationDate: this.data.modificationDate, + contentsObj: this.data.contentsObj, + richText: this.data.richText, + rect: this.data.rect, + parentRect: this.data.parentRect || null, + parent: this.parent, + elements: this.elements, + open: this.data.open + }); + const elementIds = []; + for (const element of this.elements) { + element.popup = popup; + element.container.ariaHasPopup = "dialog"; + elementIds.push(element.data.id); + element.addHighlightArea(); + } + this.container.setAttribute("aria-controls", elementIds.map(id => `${AnnotationPrefix}${id}`).join(",")); + return this.container; + } +} +class PopupElement { + #boundKeyDown = this.#keyDown.bind(this); + #boundHide = this.#hide.bind(this); + #boundShow = this.#show.bind(this); + #boundToggle = this.#toggle.bind(this); + #color = null; + #container = null; + #contentsObj = null; + #dateObj = null; + #elements = null; + #parent = null; + #parentRect = null; + #pinned = false; + #popup = null; + #position = null; + #rect = null; + #richText = null; + #titleObj = null; + #updates = null; + #wasVisible = false; + constructor({ + container, + color, + elements, + titleObj, + modificationDate, + contentsObj, + richText, + parent, + rect, + parentRect, + open + }) { + this.#container = container; + this.#titleObj = titleObj; + this.#contentsObj = contentsObj; + this.#richText = richText; + this.#parent = parent; + this.#color = color; + this.#rect = rect; + this.#parentRect = parentRect; + this.#elements = elements; + this.#dateObj = PDFDateString.toDateObject(modificationDate); + this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup()); + for (const element of this.trigger) { + element.addEventListener("click", this.#boundToggle); + element.addEventListener("mouseenter", this.#boundShow); + element.addEventListener("mouseleave", this.#boundHide); + element.classList.add("popupTriggerArea"); + } + for (const element of elements) { + element.container?.addEventListener("keydown", this.#boundKeyDown); + } + this.#container.hidden = true; + if (open) { + this.#toggle(); + } + } + render() { + if (this.#popup) { + return; + } + const popup = this.#popup = document.createElement("div"); + popup.className = "popup"; + if (this.#color) { + const baseColor = popup.style.outlineColor = Util.makeHexColor(...this.#color); + popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`; + } + const header = document.createElement("span"); + header.className = "header"; + const title = document.createElement("h1"); + header.append(title); + ({ + dir: title.dir, + str: title.textContent + } = this.#titleObj); + popup.append(header); + if (this.#dateObj) { + const modificationDate = document.createElement("span"); + modificationDate.classList.add("popupDate"); + modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string"); + modificationDate.setAttribute("data-l10n-args", JSON.stringify({ + dateObj: this.#dateObj.valueOf() + })); + header.append(modificationDate); + } + const html = this.#html; + if (html) { + XfaLayer.render({ + xfaHtml: html, + intent: "richText", + div: popup + }); + popup.lastChild.classList.add("richText", "popupContent"); + } else { + const contents = this._formatContents(this.#contentsObj); + popup.append(contents); + } + this.#container.append(popup); + } + get #html() { + const richText = this.#richText; + const contentsObj = this.#contentsObj; + if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) { + return this.#richText.html || null; + } + return null; + } + get #fontSize() { + return this.#html?.attributes?.style?.fontSize || 0; + } + get #fontColor() { + return this.#html?.attributes?.style?.color || null; + } + #makePopupContent(text) { + const popupLines = []; + const popupContent = { + str: text, + html: { + name: "div", + attributes: { + dir: "auto" + }, + children: [{ + name: "p", + children: popupLines + }] + } + }; + const lineAttributes = { + style: { + color: this.#fontColor, + fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--total-scale-factor))` : "" + } + }; + for (const line of text.split("\n")) { + popupLines.push({ + name: "span", + value: line, + attributes: lineAttributes + }); + } + return popupContent; + } + _formatContents({ + str, + dir + }) { + const p = document.createElement("p"); + p.classList.add("popupContent"); + p.dir = dir; + const lines = str.split(/(?:\r\n?|\n)/); + for (let i = 0, ii = lines.length; i < ii; ++i) { + const line = lines[i]; + p.append(document.createTextNode(line)); + if (i < ii - 1) { + p.append(document.createElement("br")); + } + } + return p; + } + #keyDown(event) { + if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { + return; + } + if (event.key === "Enter" || event.key === "Escape" && this.#pinned) { + this.#toggle(); + } + } + updateEdited({ + rect, + popupContent + }) { + this.#updates ||= { + contentsObj: this.#contentsObj, + richText: this.#richText + }; + if (rect) { + this.#position = null; + } + if (popupContent) { + this.#richText = this.#makePopupContent(popupContent); + this.#contentsObj = null; + } + this.#popup?.remove(); + this.#popup = null; + } + resetEdited() { + if (!this.#updates) { + return; + } + ({ + contentsObj: this.#contentsObj, + richText: this.#richText + } = this.#updates); + this.#updates = null; + this.#popup?.remove(); + this.#popup = null; + this.#position = null; + } + #setPosition() { + if (this.#position !== null) { + return; + } + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.#parent; + let useParentRect = !!this.#parentRect; + let rect = useParentRect ? this.#parentRect : this.#rect; + for (const element of this.#elements) { + if (!rect || Util.intersect(element.data.rect, rect) !== null) { + rect = element.data.rect; + useParentRect = true; + break; + } + } + const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]); + const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5; + const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0; + const popupLeft = normalizedRect[0] + parentWidth; + const popupTop = normalizedRect[1]; + this.#position = [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight]; + const { + style + } = this.#container; + style.left = `${this.#position[0]}%`; + style.top = `${this.#position[1]}%`; + } + #toggle() { + this.#pinned = !this.#pinned; + if (this.#pinned) { + this.#show(); + this.#container.addEventListener("click", this.#boundToggle); + this.#container.addEventListener("keydown", this.#boundKeyDown); + } else { + this.#hide(); + this.#container.removeEventListener("click", this.#boundToggle); + this.#container.removeEventListener("keydown", this.#boundKeyDown); + } + } + #show() { + if (!this.#popup) { + this.render(); + } + if (!this.isVisible) { + this.#setPosition(); + this.#container.hidden = false; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) + 1000; + } else if (this.#pinned) { + this.#container.classList.add("focused"); + } + } + #hide() { + this.#container.classList.remove("focused"); + if (this.#pinned || !this.isVisible) { + return; + } + this.#container.hidden = true; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) - 1000; + } + forceHide() { + this.#wasVisible = this.isVisible; + if (!this.#wasVisible) { + return; + } + this.#container.hidden = true; + } + maybeShow() { + if (!this.#wasVisible) { + return; + } + if (!this.#popup) { + this.#show(); + } + this.#wasVisible = false; + this.#container.hidden = false; + } + get isVisible() { + return this.#container.hidden === false; + } +} +class FreeTextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.textContent = parameters.data.textContent; + this.textPosition = parameters.data.textPosition; + this.annotationEditorType = AnnotationEditorType.FREETEXT; + } + render() { + this.container.classList.add("freeTextAnnotation"); + if (this.textContent) { + const content = document.createElement("div"); + content.classList.add("annotationTextContent"); + content.setAttribute("role", "comment"); + for (const line of this.textContent) { + const lineSpan = document.createElement("span"); + lineSpan.textContent = line; + content.append(lineSpan); + } + this.container.append(content); + } + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class LineAnnotationElement extends AnnotationElement { + #line = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("lineAnnotation"); + const { + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const line = this.#line = this.svgFactory.createElement("svg:line"); + line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]); + line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]); + line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]); + line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]); + line.setAttribute("stroke-width", data.borderStyle.width || 1); + line.setAttribute("stroke", "transparent"); + line.setAttribute("fill", "transparent"); + svg.append(line); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#line; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class SquareAnnotationElement extends AnnotationElement { + #square = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("squareAnnotation"); + const { + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const square = this.#square = this.svgFactory.createElement("svg:rect"); + square.setAttribute("x", borderWidth / 2); + square.setAttribute("y", borderWidth / 2); + square.setAttribute("width", width - borderWidth); + square.setAttribute("height", height - borderWidth); + square.setAttribute("stroke-width", borderWidth || 1); + square.setAttribute("stroke", "transparent"); + square.setAttribute("fill", "transparent"); + svg.append(square); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#square; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class CircleAnnotationElement extends AnnotationElement { + #circle = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("circleAnnotation"); + const { + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const circle = this.#circle = this.svgFactory.createElement("svg:ellipse"); + circle.setAttribute("cx", width / 2); + circle.setAttribute("cy", height / 2); + circle.setAttribute("rx", width / 2 - borderWidth / 2); + circle.setAttribute("ry", height / 2 - borderWidth / 2); + circle.setAttribute("stroke-width", borderWidth || 1); + circle.setAttribute("stroke", "transparent"); + circle.setAttribute("fill", "transparent"); + svg.append(circle); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#circle; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolylineAnnotationElement extends AnnotationElement { + #polyline = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "polylineAnnotation"; + this.svgElementName = "svg:polyline"; + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + vertices, + borderStyle, + popupRef + }, + width, + height + } = this; + if (!vertices) { + return this.container; + } + const svg = this.svgFactory.create(width, height, true); + let points = []; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + const x = vertices[i] - rect[0]; + const y = rect[3] - vertices[i + 1]; + points.push(`${x},${y}`); + } + points = points.join(" "); + const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + svg.append(polyline); + this.container.append(svg); + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#polyline; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolygonAnnotationElement extends PolylineAnnotationElement { + constructor(parameters) { + super(parameters); + this.containerClassName = "polygonAnnotation"; + this.svgElementName = "svg:polygon"; + } +} +class CaretAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("caretAnnotation"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } +} +class InkAnnotationElement extends AnnotationElement { + #polylinesGroupElement = null; + #polylines = []; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "inkAnnotation"; + this.svgElementName = "svg:polyline"; + this.annotationEditorType = this.data.it === "InkHighlight" ? AnnotationEditorType.HIGHLIGHT : AnnotationEditorType.INK; + } + #getTransform(rotation, rect) { + switch (rotation) { + case 90: + return { + transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + case 180: + return { + transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + case 270: + return { + transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + default: + return { + transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + } + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + rotation, + inkLists, + borderStyle, + popupRef + } + } = this; + const { + transform, + width, + height + } = this.#getTransform(rotation, rect); + const svg = this.svgFactory.create(width, height, true); + const g = this.#polylinesGroupElement = this.svgFactory.createElement("svg:g"); + svg.append(g); + g.setAttribute("stroke-width", borderStyle.width || 1); + g.setAttribute("stroke-linecap", "round"); + g.setAttribute("stroke-linejoin", "round"); + g.setAttribute("stroke-miterlimit", 10); + g.setAttribute("stroke", "transparent"); + g.setAttribute("fill", "transparent"); + g.setAttribute("transform", transform); + for (let i = 0, ii = inkLists.length; i < ii; i++) { + const polyline = this.svgFactory.createElement(this.svgElementName); + this.#polylines.push(polyline); + polyline.setAttribute("points", inkLists[i].join(",")); + g.append(polyline); + } + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.append(svg); + this._editOnDoubleClick(); + return this.container; + } + updateEdited(params) { + super.updateEdited(params); + const { + thickness, + points, + rect + } = params; + const g = this.#polylinesGroupElement; + if (thickness >= 0) { + g.setAttribute("stroke-width", thickness || 1); + } + if (points) { + for (let i = 0, ii = this.#polylines.length; i < ii; i++) { + this.#polylines[i].setAttribute("points", points[i].join(",")); + } + } + if (rect) { + const { + transform, + width, + height + } = this.#getTransform(this.data.rotation, rect); + const root = g.parentElement; + root.setAttribute("viewBox", `0 0 ${width} ${height}`); + g.setAttribute("transform", transform); + } + } + getElementsToTriggerPopup() { + return this.#polylines; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class HighlightAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + this.annotationEditorType = AnnotationEditorType.HIGHLIGHT; + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("highlightAnnotation"); + this._editOnDoubleClick(); + return this.container; + } +} +class UnderlineAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("underlineAnnotation"); + return this.container; + } +} +class SquigglyAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("squigglyAnnotation"); + return this.container; + } +} +class StrikeOutAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("strikeoutAnnotation"); + return this.container; + } +} +class StampAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.annotationEditorType = AnnotationEditorType.STAMP; + } + render() { + this.container.classList.add("stampAnnotation"); + this.container.setAttribute("role", "img"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class FileAttachmentAnnotationElement extends AnnotationElement { + #trigger = null; + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + const { + file + } = this.data; + this.filename = file.filename; + this.content = file.content; + this.linkService.eventBus?.dispatch("fileattachmentannotation", { + source: this, + ...file + }); + } + render() { + this.container.classList.add("fileAttachmentAnnotation"); + const { + container, + data + } = this; + let trigger; + if (data.hasAppearance || data.fillAlpha === 0) { + trigger = document.createElement("div"); + } else { + trigger = document.createElement("img"); + trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`; + if (data.fillAlpha && data.fillAlpha < 1) { + trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`; + } + } + trigger.addEventListener("dblclick", this.#download.bind(this)); + this.#trigger = trigger; + const { + isMac + } = util_FeatureTest.platform; + container.addEventListener("keydown", evt => { + if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) { + this.#download(); + } + }); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } else { + trigger.classList.add("popupTriggerArea"); + } + container.append(trigger); + return container; + } + getElementsToTriggerPopup() { + return this.#trigger; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } + #download() { + this.downloadManager?.openOrDownloadData(this.content, this.filename); + } +} +class AnnotationLayer { + #accessibilityManager = null; + #annotationCanvasMap = null; + #editableAnnotations = new Map(); + #structTreeLayer = null; + constructor({ + div, + accessibilityManager, + annotationCanvasMap, + annotationEditorUIManager, + page, + viewport, + structTreeLayer + }) { + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationCanvasMap = annotationCanvasMap; + this.#structTreeLayer = structTreeLayer || null; + this.page = page; + this.viewport = viewport; + this.zIndex = 0; + this._annotationEditorUIManager = annotationEditorUIManager; + } + hasEditableAnnotations() { + return this.#editableAnnotations.size > 0; + } + async #appendElement(element, id) { + const contentElement = element.firstChild || element; + const annotationId = contentElement.id = `${AnnotationPrefix}${id}`; + const ariaAttributes = await this.#structTreeLayer?.getAriaAttributes(annotationId); + if (ariaAttributes) { + for (const [key, value] of ariaAttributes) { + contentElement.setAttribute(key, value); + } + } + this.div.append(element); + this.#accessibilityManager?.moveElementInDOM(this.div, element, contentElement, false); + } + async render(params) { + const { + annotations + } = params; + const layer = this.div; + setLayerDimensions(layer, this.viewport); + const popupToElements = new Map(); + const elementParams = { + data: null, + layer, + linkService: params.linkService, + downloadManager: params.downloadManager, + imageResourcesPath: params.imageResourcesPath || "", + renderForms: params.renderForms !== false, + svgFactory: new DOMSVGFactory(), + annotationStorage: params.annotationStorage || new AnnotationStorage(), + enableScripting: params.enableScripting === true, + hasJSActions: params.hasJSActions, + fieldObjects: params.fieldObjects, + parent: this, + elements: null + }; + for (const data of annotations) { + if (data.noHTML) { + continue; + } + const isPopupAnnotation = data.annotationType === AnnotationType.POPUP; + if (!isPopupAnnotation) { + if (data.rect[2] === data.rect[0] || data.rect[3] === data.rect[1]) { + continue; + } + } else { + const elements = popupToElements.get(data.id); + if (!elements) { + continue; + } + elementParams.elements = elements; + } + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + if (!isPopupAnnotation && data.popupRef) { + const elements = popupToElements.get(data.popupRef); + if (!elements) { + popupToElements.set(data.popupRef, [element]); + } else { + elements.push(element); + } + } + const rendered = element.render(); + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + await this.#appendElement(rendered, data.id); + if (element._isEditable) { + this.#editableAnnotations.set(element.data.id, element); + this._annotationEditorUIManager?.renderAnnotationElement(element); + } + } + this.#setAnnotationCanvasMap(); + } + async addLinkAnnotations(annotations, linkService) { + const elementParams = { + data: null, + layer: this.div, + linkService, + svgFactory: new DOMSVGFactory(), + parent: this + }; + for (const data of annotations) { + data.borderStyle ||= AnnotationLayer._defaultBorderStyle; + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + const rendered = element.render(); + await this.#appendElement(rendered, data.id); + } + } + update({ + viewport + }) { + const layer = this.div; + this.viewport = viewport; + setLayerDimensions(layer, { + rotation: viewport.rotation + }); + this.#setAnnotationCanvasMap(); + layer.hidden = false; + } + #setAnnotationCanvasMap() { + if (!this.#annotationCanvasMap) { + return; + } + const layer = this.div; + for (const [id, canvas] of this.#annotationCanvasMap) { + const element = layer.querySelector(`[data-annotation-id="${id}"]`); + if (!element) { + continue; + } + canvas.className = "annotationContent"; + const { + firstChild + } = element; + if (!firstChild) { + element.append(canvas); + } else if (firstChild.nodeName === "CANVAS") { + firstChild.replaceWith(canvas); + } else if (!firstChild.classList.contains("annotationContent")) { + firstChild.before(canvas); + } else { + firstChild.after(canvas); + } + const editableAnnotation = this.#editableAnnotations.get(id); + if (!editableAnnotation) { + continue; + } + if (editableAnnotation._hasNoCanvas) { + this._annotationEditorUIManager?.setMissingCanvas(id, element.id, canvas); + editableAnnotation._hasNoCanvas = false; + } else { + editableAnnotation.canvas = canvas; + } + } + this.#annotationCanvasMap.clear(); + } + getEditableAnnotations() { + return Array.from(this.#editableAnnotations.values()); + } + getEditableAnnotation(id) { + return this.#editableAnnotations.get(id); + } + static get _defaultBorderStyle() { + return shadow(this, "_defaultBorderStyle", Object.freeze({ + width: 1, + rawWidth: 1, + style: AnnotationBorderStyleType.SOLID, + dashArray: [3], + horizontalCornerRadius: 0, + verticalCornerRadius: 0 + })); + } +} + +;// ./src/display/editor/freetext.js + + + + +const EOL_PATTERN = /\r\n?|\n/g; +class FreeTextEditor extends AnnotationEditor { + #color; + #content = ""; + #editorDivId = `${this.id}-editor`; + #editModeAC = null; + #fontSize; + static _freeTextDefaultContent = ""; + static _internalPadding = 0; + static _defaultColor = null; + static _defaultFontSize = 10; + static get _keyboardManager() { + const proto = FreeTextEditor.prototype; + const arrowChecker = self => self.isEmpty(); + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, { + bubbles: true + }], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], proto.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], proto._translateEmpty, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto._translateEmpty, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto._translateEmpty, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto._translateEmpty, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, { + args: [0, big], + checker: arrowChecker + }]])); + } + static _type = "freetext"; + static _editorType = AnnotationEditorType.FREETEXT; + constructor(params) { + super({ + ...params, + name: "freeTextEditor" + }); + this.#color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor; + this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + const style = getComputedStyle(document.documentElement); + this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + FreeTextEditor._defaultFontSize = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + FreeTextEditor._defaultColor = value; + break; + } + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + this.#updateFontSize(value); + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + this.#updateColor(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, this.#color]]; + } + #updateFontSize(fontSize) { + const setFontsize = size => { + this.editorDiv.style.fontSize = `calc(${size}px * var(--total-scale-factor))`; + this.translate(0, -(size - this.#fontSize) * this.parentScale); + this.#fontSize = size; + this.#setEditorDimensions(); + }; + const savedFontsize = this.#fontSize; + this.addCommands({ + cmd: setFontsize.bind(this, fontSize), + undo: setFontsize.bind(this, savedFontsize), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_SIZE, + overwriteIfSameType: true, + keepUndo: true + }); + } + #updateColor(color) { + const setColor = col => { + this.#color = this.editorDiv.style.color = col; + }; + const savedColor = this.#color; + this.addCommands({ + cmd: setColor.bind(this, color), + undo: setColor.bind(this, savedColor), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + } + _translateEmpty(x, y) { + this._uiManager.translateSelectedEditors(x, y, true); + } + getInitialTranslation() { + const scale = this.parentScale; + return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale]; + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + enableEditMode() { + if (this.isInEditMode()) { + return; + } + this.parent.setEditingState(false); + this.parent.updateToolbar(AnnotationEditorType.FREETEXT); + super.enableEditMode(); + this.overlayDiv.classList.remove("enabled"); + this.editorDiv.contentEditable = true; + this._isDraggable = false; + this.div.removeAttribute("aria-activedescendant"); + this.#editModeAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#editModeAC); + this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), { + signal + }); + this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), { + signal + }); + this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), { + signal + }); + this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), { + signal + }); + this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), { + signal + }); + } + disableEditMode() { + if (!this.isInEditMode()) { + return; + } + this.parent.setEditingState(true); + super.disableEditMode(); + this.overlayDiv.classList.add("enabled"); + this.editorDiv.contentEditable = false; + this.div.setAttribute("aria-activedescendant", this.#editorDivId); + this._isDraggable = true; + this.#editModeAC?.abort(); + this.#editModeAC = null; + this.div.focus({ + preventScroll: true + }); + this.isEditing = false; + this.parent.div.classList.add("freetextEditing"); + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + super.focusin(event); + if (event.target !== this.editorDiv) { + this.editorDiv.focus(); + } + } + onceAdded(focus) { + if (this.width) { + return; + } + this.enableEditMode(); + if (focus) { + this.editorDiv.focus(); + } + if (this._initialOptions?.isCentered) { + this.center(); + } + this._initialOptions = null; + } + isEmpty() { + return !this.editorDiv || this.editorDiv.innerText.trim() === ""; + } + remove() { + this.isEditing = false; + if (this.parent) { + this.parent.setEditingState(true); + this.parent.div.classList.add("freetextEditing"); + } + super.remove(); + } + #extractText() { + const buffer = []; + this.editorDiv.normalize(); + let prevChild = null; + for (const child of this.editorDiv.childNodes) { + if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === "BR") { + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + prevChild = child; + } + return buffer.join("\n"); + } + #setEditorDimensions() { + const [parentWidth, parentHeight] = this.parentDimensions; + let rect; + if (this.isAttachedToDOM) { + rect = this.div.getBoundingClientRect(); + } else { + const { + currentLayer, + div + } = this; + const savedDisplay = div.style.display; + const savedVisibility = div.classList.contains("hidden"); + div.classList.remove("hidden"); + div.style.display = "hidden"; + currentLayer.div.append(this.div); + rect = div.getBoundingClientRect(); + div.remove(); + div.style.display = savedDisplay; + div.classList.toggle("hidden", savedVisibility); + } + if (this.rotation % 180 === this.parentRotation % 180) { + this.width = rect.width / parentWidth; + this.height = rect.height / parentHeight; + } else { + this.width = rect.height / parentWidth; + this.height = rect.width / parentHeight; + } + this.fixAndSetPosition(); + } + commit() { + if (!this.isInEditMode()) { + return; + } + super.commit(); + this.disableEditMode(); + const savedText = this.#content; + const newText = this.#content = this.#extractText().trimEnd(); + if (savedText === newText) { + return; + } + const setText = text => { + this.#content = text; + if (!text) { + this.remove(); + return; + } + this.#setContent(); + this._uiManager.rebuild(this); + this.#setEditorDimensions(); + }; + this.addCommands({ + cmd: () => { + setText(newText); + }, + undo: () => { + setText(savedText); + }, + mustExec: false + }); + this.#setEditorDimensions(); + } + shouldGetKeyboardEvents() { + return this.isInEditMode(); + } + enterInEditMode() { + this.enableEditMode(); + this.editorDiv.focus(); + } + dblclick(event) { + this.enterInEditMode(); + } + keydown(event) { + if (event.target === this.div && event.key === "Enter") { + this.enterInEditMode(); + event.preventDefault(); + } + } + editorDivKeydown(event) { + FreeTextEditor._keyboardManager.exec(this, event); + } + editorDivFocus(event) { + this.isEditing = true; + } + editorDivBlur(event) { + this.isEditing = false; + } + editorDivInput(event) { + this.parent.div.classList.toggle("freetextEditing", this.isEmpty()); + } + disableEditing() { + this.editorDiv.setAttribute("role", "comment"); + this.editorDiv.removeAttribute("aria-multiline"); + } + enableEditing() { + this.editorDiv.setAttribute("role", "textbox"); + this.editorDiv.setAttribute("aria-multiline", true); + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy || this.annotationElementId) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.editorDiv = document.createElement("div"); + this.editorDiv.className = "internal"; + this.editorDiv.setAttribute("id", this.#editorDivId); + this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2"); + this.editorDiv.setAttribute("data-l10n-attrs", "default-content"); + this.enableEditing(); + this.editorDiv.contentEditable = true; + const { + style + } = this.editorDiv; + style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`; + style.color = this.#color; + this.div.append(this.editorDiv); + this.overlayDiv = document.createElement("div"); + this.overlayDiv.classList.add("overlay", "enabled"); + this.div.append(this.overlayDiv); + bindEvents(this, this.div, ["dblclick", "keydown"]); + if (this._isCopy || this.annotationElementId) { + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.annotationElementId) { + const { + position + } = this._initialData; + let [tx, ty] = this.getInitialTranslation(); + [tx, ty] = this.pageTranslationToScreen(tx, ty); + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + let posX, posY; + switch (this.rotation) { + case 0: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY + this.height - (position[1] - pageY) / pageHeight; + break; + case 90: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [ty, -tx]; + break; + case 180: + posX = baseX - this.width + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [-tx, -ty]; + break; + case 270: + posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth; + posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight; + [tx, ty] = [-ty, tx]; + break; + } + this.setAt(posX * parentWidth, posY * parentHeight, tx, ty); + } else { + this._moveAfterPaste(baseX, baseY); + } + this.#setContent(); + this._isDraggable = true; + this.editorDiv.contentEditable = false; + } else { + this._isDraggable = false; + this.editorDiv.contentEditable = true; + } + return this.div; + } + static #getNodeContent(node) { + return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, ""); + } + editorDivPaste(event) { + const clipboardData = event.clipboardData || window.clipboardData; + const { + types + } = clipboardData; + if (types.length === 1 && types[0] === "text/plain") { + return; + } + event.preventDefault(); + const paste = FreeTextEditor.#deserializeContent(clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n"); + if (!paste) { + return; + } + const selection = window.getSelection(); + if (!selection.rangeCount) { + return; + } + this.editorDiv.normalize(); + selection.deleteFromDocument(); + const range = selection.getRangeAt(0); + if (!paste.includes("\n")) { + range.insertNode(document.createTextNode(paste)); + this.editorDiv.normalize(); + selection.collapseToStart(); + return; + } + const { + startContainer, + startOffset + } = range; + const bufferBefore = []; + const bufferAfter = []; + if (startContainer.nodeType === Node.TEXT_NODE) { + const parent = startContainer.parentElement; + bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, "")); + if (parent !== this.editorDiv) { + let buffer = bufferBefore; + for (const child of this.editorDiv.childNodes) { + if (child === parent) { + buffer = bufferAfter; + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, "")); + } else if (startContainer === this.editorDiv) { + let buffer = bufferBefore; + let i = 0; + for (const child of this.editorDiv.childNodes) { + if (i++ === startOffset) { + buffer = bufferAfter; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + this.#content = `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`; + this.#setContent(); + const newRange = new Range(); + let beforeLength = Math.sumPrecise(bufferBefore.map(line => line.length)); + for (const { + firstChild + } of this.editorDiv.childNodes) { + if (firstChild.nodeType === Node.TEXT_NODE) { + const length = firstChild.nodeValue.length; + if (beforeLength <= length) { + newRange.setStart(firstChild, beforeLength); + newRange.setEnd(firstChild, beforeLength); + break; + } + beforeLength -= length; + } + } + selection.removeAllRanges(); + selection.addRange(newRange); + } + #setContent() { + this.editorDiv.replaceChildren(); + if (!this.#content) { + return; + } + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + this.editorDiv.append(div); + } + } + #serializeContent() { + return this.#content.replaceAll("\xa0", " "); + } + static #deserializeContent(content) { + return content.replaceAll(" ", "\xa0"); + } + get contentDiv() { + return this.editorDiv; + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof FreeTextAnnotationElement) { + const { + data: { + defaultAppearanceData: { + fontSize, + fontColor + }, + rect, + rotation, + id, + popupRef + }, + textContent, + textPosition, + parent: { + page: { + pageNumber + } + } + } = data; + if (!textContent || textContent.length === 0) { + return null; + } + initialData = data = { + annotationType: AnnotationEditorType.FREETEXT, + color: Array.from(fontColor), + fontSize, + value: textContent.join("\n"), + position: textPosition, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor.#fontSize = data.fontSize; + editor.#color = Util.makeHexColor(...data.color); + editor.#content = FreeTextEditor.#deserializeContent(data.value); + editor.annotationElementId = data.id || null; + editor._initialData = initialData; + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const padding = FreeTextEditor._internalPadding * this.parentScale; + const rect = this.getRect(padding, padding); + const color = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.#color); + const serialized = { + annotationType: AnnotationEditorType.FREETEXT, + color, + fontSize: this.#fontSize, + value: this.#serializeContent(), + pageIndex: this.pageIndex, + rect, + rotation: this.rotation, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + serialized.isCopy = true; + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + value, + fontSize, + color, + pageIndex + } = this._initialData; + return this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const content = super.renderAnnotationElement(annotation); + if (this.deleted) { + return content; + } + const { + style + } = content; + style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`; + style.color = this.#color; + content.replaceChildren(); + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + content.append(div); + } + const padding = FreeTextEditor._internalPadding * this.parentScale; + annotation.updateEdited({ + rect: this.getRect(padding, padding), + popupContent: this.#content + }); + return content; + } + resetAnnotationElement(annotation) { + super.resetAnnotationElement(annotation); + annotation.resetEdited(); + } +} + +;// ./src/display/editor/drawers/outline.js + +class Outline { + static PRECISION = 1e-4; + toSVGPath() { + unreachable("Abstract method `toSVGPath` must be implemented."); + } + get box() { + unreachable("Abstract getter `box` must be implemented."); + } + serialize(_bbox, _rotation) { + unreachable("Abstract method `serialize` must be implemented."); + } + static _rescale(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i] * sx; + dest[i + 1] = ty + src[i + 1] * sy; + } + return dest; + } + static _rescaleAndSwap(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i + 1] * sx; + dest[i + 1] = ty + src[i] * sy; + } + return dest; + } + static _translate(src, tx, ty, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i]; + dest[i + 1] = ty + src[i + 1]; + } + return dest; + } + static svgRound(x) { + return Math.round(x * 10000); + } + static _normalizePoint(x, y, parentWidth, parentHeight, rotation) { + switch (rotation) { + case 90: + return [1 - y / parentWidth, x / parentHeight]; + case 180: + return [1 - x / parentWidth, 1 - y / parentHeight]; + case 270: + return [y / parentWidth, 1 - x / parentHeight]; + default: + return [x / parentWidth, y / parentHeight]; + } + } + static _normalizePagePoint(x, y, rotation) { + switch (rotation) { + case 90: + return [1 - y, x]; + case 180: + return [1 - x, 1 - y]; + case 270: + return [y, 1 - x]; + default: + return [x, y]; + } + } + static createBezierPoints(x1, y1, x2, y2, x3, y3) { + return [(x1 + 5 * x2) / 6, (y1 + 5 * y2) / 6, (5 * x2 + x3) / 6, (5 * y2 + y3) / 6, (x2 + x3) / 2, (y2 + y3) / 2]; + } +} + +;// ./src/display/editor/drawers/freedraw.js + + +class FreeDrawOutliner { + #box; + #bottom = []; + #innerMargin; + #isLTR; + #top = []; + #last = new Float32Array(18); + #lastX; + #lastY; + #min; + #min_dist; + #scaleFactor; + #thickness; + #points = []; + static #MIN_DIST = 8; + static #MIN_DIFF = 2; + static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF; + constructor({ + x, + y + }, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + this.#box = box; + this.#thickness = thickness * scaleFactor; + this.#isLTR = isLTR; + this.#last.set([NaN, NaN, NaN, NaN, x, y], 6); + this.#innerMargin = innerMargin; + this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor; + this.#min = FreeDrawOutliner.#MIN * scaleFactor; + this.#scaleFactor = scaleFactor; + this.#points.push(x, y); + } + isEmpty() { + return isNaN(this.#last[8]); + } + #getLastCoords() { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [x, y, width, height] = this.#box; + return [(this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width, (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height, (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width, (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height]; + } + add({ + x, + y + }) { + this.#lastX = x; + this.#lastY = y; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + let [x1, y1, x2, y2] = this.#last.subarray(8, 12); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(diffX, diffY); + if (d < this.#min) { + return false; + } + const diffD = d - this.#min_dist; + const K = diffD / d; + const shiftX = K * diffX; + const shiftY = K * diffY; + let x0 = x1; + let y0 = y1; + x1 = x2; + y1 = y2; + x2 += shiftX; + y2 += shiftY; + this.#points?.push(x, y); + const nX = -shiftY / diffD; + const nY = shiftX / diffD; + const thX = nX * this.#thickness; + const thY = nY * this.#thickness; + this.#last.set(this.#last.subarray(2, 8), 0); + this.#last.set([x2 + thX, y2 + thY], 4); + this.#last.set(this.#last.subarray(14, 18), 12); + this.#last.set([x2 - thX, y2 - thY], 16); + if (isNaN(this.#last[6])) { + if (this.#top.length === 0) { + this.#last.set([x1 + thX, y1 + thY], 2); + this.#top.push(NaN, NaN, NaN, NaN, (x1 + thX - layerX) / layerWidth, (y1 + thY - layerY) / layerHeight); + this.#last.set([x1 - thX, y1 - thY], 14); + this.#bottom.push(NaN, NaN, NaN, NaN, (x1 - thX - layerX) / layerWidth, (y1 - thY - layerY) / layerHeight); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + return !this.isEmpty(); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + const angle = Math.abs(Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX)); + if (angle < Math.PI / 2) { + [x1, y1, x2, y2] = this.#last.subarray(2, 6); + this.#top.push(NaN, NaN, NaN, NaN, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x1, y1, x0, y0] = this.#last.subarray(14, 18); + this.#bottom.push(NaN, NaN, NaN, NaN, ((x0 + x1) / 2 - layerX) / layerWidth, ((y0 + y1) / 2 - layerY) / layerHeight); + return true; + } + [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6); + this.#top.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18); + this.#bottom.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + return true; + } + toSVGPath() { + if (this.isEmpty()) { + return ""; + } + const top = this.#top; + const bottom = this.#bottom; + if (isNaN(this.#last[6]) && !this.isEmpty()) { + return this.#toSVGPathTwoPoints(); + } + const buffer = []; + buffer.push(`M${top[4]} ${top[5]}`); + for (let i = 6; i < top.length; i += 6) { + if (isNaN(top[i])) { + buffer.push(`L${top[i + 4]} ${top[i + 5]}`); + } else { + buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`); + } + } + this.#toSVGPathEnd(buffer); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + if (isNaN(bottom[i])) { + buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`); + } else { + buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`); + } + } + this.#toSVGPathStart(buffer); + return buffer.join(" "); + } + #toSVGPathTwoPoints() { + const [x, y, width, height] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`; + } + #toSVGPathStart(buffer) { + const bottom = this.#bottom; + buffer.push(`L${bottom[4]} ${bottom[5]} Z`); + } + #toSVGPathEnd(buffer) { + const [x, y, width, height] = this.#box; + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`); + } + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } + getOutlines() { + const top = this.#top; + const bottom = this.#bottom; + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const points = new Float32Array((this.#points?.length ?? 0) + 2); + for (let i = 0, ii = points.length - 2; i < ii; i += 2) { + points[i] = (this.#points[i] - layerX) / layerWidth; + points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight; + } + points[points.length - 2] = (this.#lastX - layerX) / layerWidth; + points[points.length - 1] = (this.#lastY - layerY) / layerHeight; + if (isNaN(last[6]) && !this.isEmpty()) { + return this.#getOutlineTwoPoints(points); + } + const outline = new Float32Array(this.#top.length + 24 + this.#bottom.length); + let N = top.length; + for (let i = 0; i < N; i += 2) { + if (isNaN(top[i])) { + outline[i] = outline[i + 1] = NaN; + continue; + } + outline[i] = top[i]; + outline[i + 1] = top[i + 1]; + } + N = this.#getOutlineEnd(outline, N); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + for (let j = 0; j < 6; j += 2) { + if (isNaN(bottom[i + j])) { + outline[N] = outline[N + 1] = NaN; + N += 2; + continue; + } + outline[N] = bottom[i + j]; + outline[N + 1] = bottom[i + j + 1]; + N += 2; + } + } + this.#getOutlineStart(outline, N); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineTwoPoints(points) { + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + const outline = new Float32Array(36); + outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineStart(outline, pos) { + const bottom = this.#bottom; + outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos); + return pos += 6; + } + #getOutlineEnd(outline, pos) { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], pos); + return pos += 24; + } +} +class FreeDrawOutline extends Outline { + #box; + #bbox = new Float32Array(4); + #innerMargin; + #isLTR; + #points; + #scaleFactor; + #outline; + constructor(outline, points, box, scaleFactor, innerMargin, isLTR) { + super(); + this.#outline = outline; + this.#points = points; + this.#box = box; + this.#scaleFactor = scaleFactor; + this.#innerMargin = innerMargin; + this.#isLTR = isLTR; + this.lastPoint = [NaN, NaN]; + this.#computeMinMax(isLTR); + const [x, y, width, height] = this.#bbox; + for (let i = 0, ii = outline.length; i < ii; i += 2) { + outline[i] = (outline[i] - x) / width; + outline[i + 1] = (outline[i + 1] - y) / height; + } + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] = (points[i] - x) / width; + points[i + 1] = (points[i + 1] - y) / height; + } + } + toSVGPath() { + const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`]; + for (let i = 6, ii = this.#outline.length; i < ii; i += 6) { + if (isNaN(this.#outline[i])) { + buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + continue; + } + buffer.push(`C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${this.#outline[i + 3]} ${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + } + buffer.push("Z"); + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], rotation) { + const width = trX - blX; + const height = trY - blY; + let outline; + let points; + switch (rotation) { + case 0: + outline = Outline._rescale(this.#outline, blX, trY, width, -height); + points = Outline._rescale(this.#points, blX, trY, width, -height); + break; + case 90: + outline = Outline._rescaleAndSwap(this.#outline, blX, blY, width, height); + points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height); + break; + case 180: + outline = Outline._rescale(this.#outline, trX, blY, -width, height); + points = Outline._rescale(this.#points, trX, blY, -width, height); + break; + case 270: + outline = Outline._rescaleAndSwap(this.#outline, trX, trY, -width, -height); + points = Outline._rescaleAndSwap(this.#points, trX, trY, -width, -height); + break; + } + return { + outline: Array.from(outline), + points: [Array.from(points)] + }; + } + #computeMinMax(isLTR) { + const outline = this.#outline; + let lastX = outline[4]; + let lastY = outline[5]; + const minMax = [lastX, lastY, lastX, lastY]; + let lastPointX = lastX; + let lastPointY = lastY; + const ltrCallback = isLTR ? Math.max : Math.min; + for (let i = 6, ii = outline.length; i < ii; i += 6) { + const x = outline[i + 4], + y = outline[i + 5]; + if (isNaN(outline[i])) { + Util.pointBoundingBox(x, y, minMax); + if (lastPointY < y) { + lastPointX = x; + lastPointY = y; + } else if (lastPointY === y) { + lastPointX = ltrCallback(lastPointX, x); + } + } else { + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6), bbox); + Util.rectBoundingBox(...bbox, minMax); + if (lastPointY < bbox[3]) { + lastPointX = bbox[2]; + lastPointY = bbox[3]; + } else if (lastPointY === bbox[3]) { + lastPointX = ltrCallback(lastPointX, bbox[2]); + } + } + lastX = x; + lastY = y; + } + const bbox = this.#bbox; + bbox[0] = minMax[0] - this.#innerMargin; + bbox[1] = minMax[1] - this.#innerMargin; + bbox[2] = minMax[2] - minMax[0] + 2 * this.#innerMargin; + bbox[3] = minMax[3] - minMax[1] + 2 * this.#innerMargin; + this.lastPoint = [lastPointX, lastPointY]; + } + get box() { + return this.#bbox; + } + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeDrawOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); + } + getNewOutline(thickness, innerMargin) { + const [x, y, width, height] = this.#bbox; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const sx = width * layerWidth; + const sy = height * layerHeight; + const tx = x * layerWidth + layerX; + const ty = y * layerHeight + layerY; + const outliner = this.newOutliner({ + x: this.#points[0] * sx + tx, + y: this.#points[1] * sy + ty + }, this.#box, this.#scaleFactor, thickness, this.#isLTR, innerMargin ?? this.#innerMargin); + for (let i = 2; i < this.#points.length; i += 2) { + outliner.add({ + x: this.#points[i] * sx + tx, + y: this.#points[i + 1] * sy + ty + }); + } + return outliner.getOutlines(); + } +} + +;// ./src/display/editor/drawers/highlight.js + + + +class HighlightOutliner { + #box; + #lastPoint; + #verticalEdges = []; + #intervals = []; + constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) { + const minMax = [Infinity, Infinity, -Infinity, -Infinity]; + const NUMBER_OF_DIGITS = 4; + const EPSILON = 10 ** -NUMBER_OF_DIGITS; + for (const { + x, + y, + width, + height + } of boxes) { + const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON; + const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON; + const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON; + const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON; + const left = [x1, y1, y2, true]; + const right = [x2, y1, y2, false]; + this.#verticalEdges.push(left, right); + Util.rectBoundingBox(x1, y1, x2, y2, minMax); + } + const bboxWidth = minMax[2] - minMax[0] + 2 * innerMargin; + const bboxHeight = minMax[3] - minMax[1] + 2 * innerMargin; + const shiftedMinX = minMax[0] - innerMargin; + const shiftedMinY = minMax[1] - innerMargin; + const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2); + const lastPoint = [lastEdge[0], lastEdge[2]]; + for (const edge of this.#verticalEdges) { + const [x, y1, y2] = edge; + edge[0] = (x - shiftedMinX) / bboxWidth; + edge[1] = (y1 - shiftedMinY) / bboxHeight; + edge[2] = (y2 - shiftedMinY) / bboxHeight; + } + this.#box = new Float32Array([shiftedMinX, shiftedMinY, bboxWidth, bboxHeight]); + this.#lastPoint = lastPoint; + } + getOutlines() { + this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]); + const outlineVerticalEdges = []; + for (const edge of this.#verticalEdges) { + if (edge[3]) { + outlineVerticalEdges.push(...this.#breakEdge(edge)); + this.#insert(edge); + } else { + this.#remove(edge); + outlineVerticalEdges.push(...this.#breakEdge(edge)); + } + } + return this.#getOutlines(outlineVerticalEdges); + } + #getOutlines(outlineVerticalEdges) { + const edges = []; + const allEdges = new Set(); + for (const edge of outlineVerticalEdges) { + const [x, y1, y2] = edge; + edges.push([x, y1, edge], [x, y2, edge]); + } + edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]); + for (let i = 0, ii = edges.length; i < ii; i += 2) { + const edge1 = edges[i][2]; + const edge2 = edges[i + 1][2]; + edge1.push(edge2); + edge2.push(edge1); + allEdges.add(edge1); + allEdges.add(edge2); + } + const outlines = []; + let outline; + while (allEdges.size > 0) { + const edge = allEdges.values().next().value; + let [x, y1, y2, edge1, edge2] = edge; + allEdges.delete(edge); + let lastPointX = x; + let lastPointY = y1; + outline = [x, y2]; + outlines.push(outline); + while (true) { + let e; + if (allEdges.has(edge1)) { + e = edge1; + } else if (allEdges.has(edge2)) { + e = edge2; + } else { + break; + } + allEdges.delete(e); + [x, y1, y2, edge1, edge2] = e; + if (lastPointX !== x) { + outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2); + lastPointX = x; + } + lastPointY = lastPointY === y1 ? y2 : y1; + } + outline.push(lastPointX, lastPointY); + } + return new HighlightOutline(outlines, this.#box, this.#lastPoint); + } + #binarySearch(y) { + const array = this.#intervals; + let start = 0; + let end = array.length - 1; + while (start <= end) { + const middle = start + end >> 1; + const y1 = array[middle][0]; + if (y1 === y) { + return middle; + } + if (y1 < y) { + start = middle + 1; + } else { + end = middle - 1; + } + } + return end + 1; + } + #insert([, y1, y2]) { + const index = this.#binarySearch(y1); + this.#intervals.splice(index, 0, [y1, y2]); + } + #remove([, y1, y2]) { + const index = this.#binarySearch(y1); + for (let i = index; i < this.#intervals.length; i++) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + for (let i = index - 1; i >= 0; i--) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + } + #breakEdge(edge) { + const [x, y1, y2] = edge; + const results = [[x, y1, y2]]; + const index = this.#binarySearch(y2); + for (let i = 0; i < index; i++) { + const [start, end] = this.#intervals[i]; + for (let j = 0, jj = results.length; j < jj; j++) { + const [, y3, y4] = results[j]; + if (end <= y3 || y4 <= start) { + continue; + } + if (y3 >= start) { + if (y4 > end) { + results[j][1] = end; + } else { + if (jj === 1) { + return []; + } + results.splice(j, 1); + j--; + jj--; + } + continue; + } + results[j][2] = start; + if (y4 > end) { + results.push([x, end, y4]); + } + } + } + return results; + } +} +class HighlightOutline extends Outline { + #box; + #outlines; + constructor(outlines, box, lastPoint) { + super(); + this.#outlines = outlines; + this.#box = box; + this.lastPoint = lastPoint; + } + toSVGPath() { + const buffer = []; + for (const polygon of this.#outlines) { + let [prevX, prevY] = polygon; + buffer.push(`M${prevX} ${prevY}`); + for (let i = 2; i < polygon.length; i += 2) { + const x = polygon[i]; + const y = polygon[i + 1]; + if (x === prevX) { + buffer.push(`V${y}`); + prevY = y; + } else if (y === prevY) { + buffer.push(`H${x}`); + prevX = x; + } + } + buffer.push("Z"); + } + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], _rotation) { + const outlines = []; + const width = trX - blX; + const height = trY - blY; + for (const outline of this.#outlines) { + const points = new Array(outline.length); + for (let i = 0; i < outline.length; i += 2) { + points[i] = blX + outline[i] * width; + points[i + 1] = trY - outline[i + 1] * height; + } + outlines.push(points); + } + return outlines; + } + get box() { + return this.#box; + } + get classNamesForOutlining() { + return ["highlightOutline"]; + } +} +class FreeHighlightOutliner extends FreeDrawOutliner { + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeHighlightOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } +} +class FreeHighlightOutline extends FreeDrawOutline { + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeHighlightOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); + } +} + +;// ./src/display/editor/color_picker.js + + + +class ColorPicker { + #button = null; + #buttonSwatch = null; + #defaultColor; + #dropdown = null; + #dropdownWasFromKeyboard = false; + #isMainColorPicker = false; + #editor = null; + #eventBus; + #openDropdownAC = null; + #uiManager = null; + #type; + static #l10nColor = null; + static get _keyboardManager() { + return shadow(this, "_keyboardManager", new KeyboardManager([[["Escape", "mac+Escape"], ColorPicker.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], ColorPicker.prototype._moveToPrevious], [["Home", "mac+Home"], ColorPicker.prototype._moveToBeginning], [["End", "mac+End"], ColorPicker.prototype._moveToEnd]])); + } + constructor({ + editor = null, + uiManager = null + }) { + if (editor) { + this.#isMainColorPicker = false; + this.#type = AnnotationEditorParamsType.HIGHLIGHT_COLOR; + this.#editor = editor; + } else { + this.#isMainColorPicker = true; + this.#type = AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR; + } + this.#uiManager = editor?._uiManager || uiManager; + this.#eventBus = this.#uiManager._eventBus; + this.#defaultColor = editor?.color || this.#uiManager?.highlightColors.values().next().value || "#FFFF98"; + ColorPicker.#l10nColor ||= Object.freeze({ + blue: "pdfjs-editor-colorpicker-blue", + green: "pdfjs-editor-colorpicker-green", + pink: "pdfjs-editor-colorpicker-pink", + red: "pdfjs-editor-colorpicker-red", + yellow: "pdfjs-editor-colorpicker-yellow" + }); + } + renderButton() { + const button = this.#button = document.createElement("button"); + button.className = "colorPicker"; + button.tabIndex = "0"; + button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"); + button.setAttribute("aria-haspopup", true); + const signal = this.#uiManager._signal; + button.addEventListener("click", this.#openDropdown.bind(this), { + signal + }); + button.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + const swatch = this.#buttonSwatch = document.createElement("span"); + swatch.className = "swatch"; + swatch.setAttribute("aria-hidden", true); + swatch.style.backgroundColor = this.#defaultColor; + button.append(swatch); + return button; + } + renderMainDropdown() { + const dropdown = this.#dropdown = this.#getDropdownRoot(); + dropdown.setAttribute("aria-orientation", "horizontal"); + dropdown.setAttribute("aria-labelledby", "highlightColorPickerLabel"); + return dropdown; + } + #getDropdownRoot() { + const div = document.createElement("div"); + const signal = this.#uiManager._signal; + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.className = "dropdown"; + div.role = "listbox"; + div.setAttribute("aria-multiselectable", false); + div.setAttribute("aria-orientation", "vertical"); + div.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown"); + for (const [name, color] of this.#uiManager.highlightColors) { + const button = document.createElement("button"); + button.tabIndex = "0"; + button.role = "option"; + button.setAttribute("data-color", color); + button.title = name; + button.setAttribute("data-l10n-id", ColorPicker.#l10nColor[name]); + const swatch = document.createElement("span"); + button.append(swatch); + swatch.className = "swatch"; + swatch.style.backgroundColor = color; + button.setAttribute("aria-selected", color === this.#defaultColor); + button.addEventListener("click", this.#colorSelect.bind(this, color), { + signal + }); + div.append(button); + } + div.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + return div; + } + #colorSelect(color, event) { + event.stopPropagation(); + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: this.#type, + value: color + }); + } + _colorSelectFromKeyboard(event) { + if (event.target === this.#button) { + this.#openDropdown(event); + return; + } + const color = event.target.getAttribute("data-color"); + if (!color) { + return; + } + this.#colorSelect(color, event); + } + _moveToNext(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + if (event.target === this.#button) { + this.#dropdown.firstChild?.focus(); + return; + } + event.target.nextSibling?.focus(); + } + _moveToPrevious(event) { + if (event.target === this.#dropdown?.firstChild || event.target === this.#button) { + if (this.#isDropdownVisible) { + this._hideDropdownFromKeyboard(); + } + return; + } + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + } + event.target.previousSibling?.focus(); + } + _moveToBeginning(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.firstChild?.focus(); + } + _moveToEnd(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.lastChild?.focus(); + } + #keyDown(event) { + ColorPicker._keyboardManager.exec(this, event); + } + #openDropdown(event) { + if (this.#isDropdownVisible) { + this.hideDropdown(); + return; + } + this.#dropdownWasFromKeyboard = event.detail === 0; + if (!this.#openDropdownAC) { + this.#openDropdownAC = new AbortController(); + window.addEventListener("pointerdown", this.#pointerDown.bind(this), { + signal: this.#uiManager.combinedSignal(this.#openDropdownAC) + }); + } + if (this.#dropdown) { + this.#dropdown.classList.remove("hidden"); + return; + } + const root = this.#dropdown = this.#getDropdownRoot(); + this.#button.append(root); + } + #pointerDown(event) { + if (this.#dropdown?.contains(event.target)) { + return; + } + this.hideDropdown(); + } + hideDropdown() { + this.#dropdown?.classList.add("hidden"); + this.#openDropdownAC?.abort(); + this.#openDropdownAC = null; + } + get #isDropdownVisible() { + return this.#dropdown && !this.#dropdown.classList.contains("hidden"); + } + _hideDropdownFromKeyboard() { + if (this.#isMainColorPicker) { + return; + } + if (!this.#isDropdownVisible) { + this.#editor?.unselect(); + return; + } + this.hideDropdown(); + this.#button.focus({ + preventScroll: true, + focusVisible: this.#dropdownWasFromKeyboard + }); + } + updateColor(color) { + if (this.#buttonSwatch) { + this.#buttonSwatch.style.backgroundColor = color; + } + if (!this.#dropdown) { + return; + } + const i = this.#uiManager.highlightColors.values(); + for (const child of this.#dropdown.children) { + child.setAttribute("aria-selected", i.next().value === color); + } + } + destroy() { + this.#button?.remove(); + this.#button = null; + this.#buttonSwatch = null; + this.#dropdown?.remove(); + this.#dropdown = null; + } +} + +;// ./src/display/editor/highlight.js + + + + + + + +class HighlightEditor extends AnnotationEditor { + #anchorNode = null; + #anchorOffset = 0; + #boxes; + #clipPathId = null; + #colorPicker = null; + #focusOutlines = null; + #focusNode = null; + #focusOffset = 0; + #highlightDiv = null; + #highlightOutlines = null; + #id = null; + #isFreeHighlight = false; + #lastPoint = null; + #opacity; + #outlineId = null; + #text = ""; + #thickness; + #methodOfCreation = ""; + static _defaultColor = null; + static _defaultOpacity = 1; + static _defaultThickness = 12; + static _type = "highlight"; + static _editorType = AnnotationEditorType.HIGHLIGHT; + static _freeHighlightId = -1; + static _freeHighlight = null; + static _freeHighlightClipId = ""; + static get _keyboardManager() { + const proto = HighlightEditor.prototype; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], proto._moveCaret, { + args: [0] + }], [["ArrowRight", "mac+ArrowRight"], proto._moveCaret, { + args: [1] + }], [["ArrowUp", "mac+ArrowUp"], proto._moveCaret, { + args: [2] + }], [["ArrowDown", "mac+ArrowDown"], proto._moveCaret, { + args: [3] + }]])); + } + constructor(params) { + super({ + ...params, + name: "highlightEditor" + }); + this.color = params.color || HighlightEditor._defaultColor; + this.#thickness = params.thickness || HighlightEditor._defaultThickness; + this.#opacity = params.opacity || HighlightEditor._defaultOpacity; + this.#boxes = params.boxes || null; + this.#methodOfCreation = params.methodOfCreation || ""; + this.#text = params.text || ""; + this._isDraggable = false; + this.defaultL10nId = "pdfjs-editor-highlight-editor"; + if (params.highlightId > -1) { + this.#isFreeHighlight = true; + this.#createFreeOutlines(params); + this.#addToDrawLayer(); + } else if (this.#boxes) { + this.#anchorNode = params.anchorNode; + this.#anchorOffset = params.anchorOffset; + this.#focusNode = params.focusNode; + this.#focusOffset = params.focusOffset; + this.#createOutlines(); + this.#addToDrawLayer(); + this.rotate(this.rotation); + } + } + get telemetryInitialData() { + return { + action: "added", + type: this.#isFreeHighlight ? "free_highlight" : "highlight", + color: this._uiManager.highlightColorNames.get(this.color), + thickness: this.#thickness, + methodOfCreation: this.#methodOfCreation + }; + } + get telemetryFinalData() { + return { + type: "highlight", + color: this._uiManager.highlightColorNames.get(this.color) + }; + } + static computeTelemetryFinalData(data) { + return { + numberOfColors: data.get("color").size + }; + } + #createOutlines() { + const outliner = new HighlightOutliner(this.#boxes, 0.001); + this.#highlightOutlines = outliner.getOutlines(); + [this.x, this.y, this.width, this.height] = this.#highlightOutlines.box; + const outlinerForOutline = new HighlightOutliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === "ltr"); + this.#focusOutlines = outlinerForOutline.getOutlines(); + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height]; + } + #createFreeOutlines({ + highlightOutlines, + highlightId, + clipPathId + }) { + this.#highlightOutlines = highlightOutlines; + const extraThickness = 1.5; + this.#focusOutlines = highlightOutlines.getNewOutline(this.#thickness / 2 + extraThickness, 0.0025); + if (highlightId >= 0) { + this.#id = highlightId; + this.#clipPathId = clipPathId; + this.parent.drawLayer.finalizeDraw(highlightId, { + bbox: highlightOutlines.box, + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.#outlineId = this.parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: true + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() + } + }, true); + } else if (this.parent) { + const angle = this.parent.viewport.rotation; + this.parent.drawLayer.updateProperties(this.#id, { + bbox: HighlightEditor.#rotateBbox(this.#highlightOutlines.box, (angle - this.rotation + 360) % 360), + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.parent.drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + path: { + d: this.#focusOutlines.toSVGPath() + } + }); + } + const [x, y, width, height] = highlightOutlines.box; + switch (this.rotation) { + case 0: + this.x = x; + this.y = y; + this.width = width; + this.height = height; + break; + case 90: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = y; + this.y = 1 - x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + case 180: + this.x = 1 - x; + this.y = 1 - y; + this.width = width; + this.height = height; + break; + case 270: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = 1 - y; + this.y = x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + } + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height]; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + HighlightEditor._defaultColor ||= uiManager.highlightColors?.values().next().value || "#fff066"; + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: + HighlightEditor._defaultColor = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + HighlightEditor._defaultThickness = value; + break; + } + } + translateInPage(x, y) {} + get toolbarPosition() { + return this.#lastPoint; + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + this.#updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + this.#updateThickness(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR, HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, HighlightEditor._defaultThickness]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, this.#thickness || HighlightEditor._defaultThickness], [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight]]; + } + #updateColor(color) { + const setColorAndOpacity = (col, opa) => { + this.color = col; + this.#opacity = opa; + this.parent?.drawLayer.updateProperties(this.#id, { + root: { + fill: col, + "fill-opacity": opa + } + }); + this.#colorPicker?.updateColor(col); + }; + const savedColor = this.color; + const savedOpacity = this.#opacity; + this.addCommands({ + cmd: setColorAndOpacity.bind(this, color, HighlightEditor._defaultOpacity), + undo: setColorAndOpacity.bind(this, savedColor, savedOpacity), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.HIGHLIGHT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "color_changed", + color: this._uiManager.highlightColorNames.get(color) + }, true); + } + #updateThickness(thickness) { + const savedThickness = this.#thickness; + const setThickness = th => { + this.#thickness = th; + this.#changeThickness(th); + }; + this.addCommands({ + cmd: setThickness.bind(this, thickness), + undo: setThickness.bind(this, savedThickness), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_THICKNESS, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "thickness_changed", + thickness + }, true); + } + async addEditToolbar() { + const toolbar = await super.addEditToolbar(); + if (!toolbar) { + return null; + } + if (this._uiManager.highlightColors) { + this.#colorPicker = new ColorPicker({ + editor: this + }); + toolbar.addColorPicker(this.#colorPicker); + } + return toolbar; + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + fixAndSetPosition() { + return super.fixAndSetPosition(this.#getRotation()); + } + getBaseTranslation() { + return [0, 0]; + } + getRect(tx, ty) { + return super.getRect(tx, ty, this.#getRotation()); + } + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + if (focus) { + this.div.focus(); + } + } + remove() { + this.#cleanDrawLayer(); + this._reportTelemetry({ + action: "deleted" + }); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this.#cleanDrawLayer(); + } else if (parent) { + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + this.show(this._isVisible); + if (mustBeSelected) { + this.select(); + } + } + #changeThickness(thickness) { + if (!this.#isFreeHighlight) { + return; + } + this.#createFreeOutlines({ + highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2) + }); + this.fixAndSetPosition(); + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + } + #cleanDrawLayer() { + if (this.#id === null || !this.parent) { + return; + } + this.parent.drawLayer.remove(this.#id); + this.#id = null; + this.parent.drawLayer.remove(this.#outlineId); + this.#outlineId = null; + } + #addToDrawLayer(parent = this.parent) { + if (this.#id !== null) { + return; + } + ({ + id: this.#id, + clipPathId: this.#clipPathId + } = parent.drawLayer.draw({ + bbox: this.#highlightOutlines.box, + root: { + viewBox: "0 0 1 1", + fill: this.color, + "fill-opacity": this.#opacity + }, + rootClass: { + highlight: true, + free: this.#isFreeHighlight + }, + path: { + d: this.#highlightOutlines.toSVGPath() + } + }, false, true)); + this.#outlineId = parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: this.#isFreeHighlight + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() + } + }, this.#isFreeHighlight); + if (this.#highlightDiv) { + this.#highlightDiv.style.clipPath = this.#clipPathId; + } + } + static #rotateBbox([x, y, width, height], angle) { + switch (angle) { + case 90: + return [1 - y - height, x, height, width]; + case 180: + return [1 - x - width, 1 - y - height, width, height]; + case 270: + return [y, 1 - x - width, height, width]; + } + return [x, y, width, height]; + } + rotate(angle) { + const { + drawLayer + } = this.parent; + let box; + if (this.#isFreeHighlight) { + angle = (angle - this.rotation + 360) % 360; + box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle); + } else { + box = HighlightEditor.#rotateBbox([this.x, this.y, this.width, this.height], angle); + } + drawLayer.updateProperties(this.#id, { + bbox: box, + root: { + "data-main-rotation": angle + } + }); + drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + root: { + "data-main-rotation": angle + } + }); + } + render() { + if (this.div) { + return this.div; + } + const div = super.render(); + if (this.#text) { + div.setAttribute("aria-label", this.#text); + div.setAttribute("role", "mark"); + } + if (this.#isFreeHighlight) { + div.classList.add("free"); + } else { + this.div.addEventListener("keydown", this.#keydown.bind(this), { + signal: this._uiManager._signal + }); + } + const highlightDiv = this.#highlightDiv = document.createElement("div"); + div.append(highlightDiv); + highlightDiv.setAttribute("aria-hidden", "true"); + highlightDiv.className = "internal"; + highlightDiv.style.clipPath = this.#clipPathId; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + bindEvents(this, this.#highlightDiv, ["pointerover", "pointerleave"]); + this.enableEditing(); + return div; + } + pointerover() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: true + } + }); + } + } + pointerleave() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false + } + }); + } + } + #keydown(event) { + HighlightEditor._keyboardManager.exec(this, event); + } + _moveCaret(direction) { + this.parent.unselect(this); + switch (direction) { + case 0: + case 2: + this.#setCaret(true); + break; + case 1: + case 3: + this.#setCaret(false); + break; + } + } + #setCaret(start) { + if (!this.#anchorNode) { + return; + } + const selection = window.getSelection(); + if (start) { + selection.setPosition(this.#anchorNode, this.#anchorOffset); + } else { + selection.setPosition(this.#focusNode, this.#focusOffset); + } + } + select() { + super.select(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false, + selected: true + } + }); + } + unselect() { + super.unselect(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + selected: false + } + }); + if (!this.#isFreeHighlight) { + this.#setCaret(false); + } + } + get _mustFixPosition() { + return !this.#isFreeHighlight; + } + show(visible = this._isVisible) { + super.show(visible); + if (this.parent) { + this.parent.drawLayer.updateProperties(this.#id, { + rootClass: { + hidden: !visible + } + }); + this.parent.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hidden: !visible + } + }); + } + } + #getRotation() { + return this.#isFreeHighlight ? this.rotation : 0; + } + #serializeBoxes() { + if (this.#isFreeHighlight) { + return null; + } + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const boxes = this.#boxes; + const quadPoints = new Float32Array(boxes.length * 8); + let i = 0; + for (const { + x, + y, + width, + height + } of boxes) { + const sx = x * pageWidth + pageX; + const sy = (1 - y) * pageHeight + pageY; + quadPoints[i] = quadPoints[i + 4] = sx; + quadPoints[i + 1] = quadPoints[i + 3] = sy; + quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth; + quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight; + i += 8; + } + return quadPoints; + } + #serializeOutlines(rect) { + return this.#highlightOutlines.serialize(rect, this.#getRotation()); + } + static startHighlighting(parent, isLTR, { + target: textLayer, + x, + y + }) { + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + const ac = new AbortController(); + const signal = parent.combinedSignal(ac); + const pointerUpCallback = e => { + ac.abort(); + this.#endHighlight(parent, e); + }; + window.addEventListener("blur", pointerUpCallback, { + signal + }); + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("pointerdown", stopEvent, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + textLayer.addEventListener("pointermove", this.#highlightMove.bind(this, parent), { + signal + }); + this._freeHighlight = new FreeHighlightOutliner({ + x, + y + }, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 0.001); + ({ + id: this._freeHighlightId, + clipPathId: this._freeHighlightClipId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: this._defaultColor, + "fill-opacity": this._defaultOpacity + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: this._freeHighlight.toSVGPath() + } + }, true, true)); + } + static #highlightMove(parent, event) { + if (this._freeHighlight.add(event)) { + parent.drawLayer.updateProperties(this._freeHighlightId, { + path: { + d: this._freeHighlight.toSVGPath() + } + }); + } + } + static #endHighlight(parent, event) { + if (!this._freeHighlight.isEmpty()) { + parent.createAndAddNewEditor(event, false, { + highlightId: this._freeHighlightId, + highlightOutlines: this._freeHighlight.getOutlines(), + clipPathId: this._freeHighlightClipId, + methodOfCreation: "main_toolbar" + }); + } else { + parent.drawLayer.remove(this._freeHighlightId); + } + this._freeHighlightId = -1; + this._freeHighlight = null; + this._freeHighlightClipId = ""; + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof HighlightAnnotationElement) { + const { + data: { + quadPoints, + rect, + rotation, + id, + color, + opacity, + popupRef + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + opacity, + quadPoints, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } else if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + borderStyle: { + rawWidth: thickness + }, + popupRef + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + thickness, + inkLists, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } + const { + color, + quadPoints, + inkLists, + opacity + } = data; + const editor = await super.deserialize(data, parent, uiManager); + editor.color = Util.makeHexColor(...color); + editor.#opacity = opacity || 1; + if (inkLists) { + editor.#thickness = data.thickness; + } + editor.annotationElementId = data.id || null; + editor._initialData = initialData; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [pageX, pageY] = editor.pageTranslation; + if (quadPoints) { + const boxes = editor.#boxes = []; + for (let i = 0; i < quadPoints.length; i += 8) { + boxes.push({ + x: (quadPoints[i] - pageX) / pageWidth, + y: 1 - (quadPoints[i + 1] - pageY) / pageHeight, + width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth, + height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight + }); + } + editor.#createOutlines(); + editor.#addToDrawLayer(); + editor.rotate(editor.rotation); + } else if (inkLists) { + editor.#isFreeHighlight = true; + const points = inkLists[0]; + const point = { + x: points[0] - pageX, + y: pageHeight - (points[1] - pageY) + }; + const outliner = new FreeHighlightOutliner(point, [0, 0, pageWidth, pageHeight], 1, editor.#thickness / 2, true, 0.001); + for (let i = 0, ii = points.length; i < ii; i += 2) { + point.x = points[i] - pageX; + point.y = pageHeight - (points[i + 1] - pageY); + outliner.add(point); + } + const { + id, + clipPathId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: editor.color, + "fill-opacity": editor._defaultOpacity + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: outliner.toSVGPath() + } + }, true, true); + editor.#createFreeOutlines({ + highlightOutlines: outliner.getOutlines(), + highlightId: id, + clipPathId + }); + editor.#addToDrawLayer(); + editor.rotate(editor.parentRotation); + } + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty() || isForCopying) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const rect = this.getRect(0, 0); + const color = AnnotationEditor._colorManager.convert(this.color); + const serialized = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color, + opacity: this.#opacity, + thickness: this.#thickness, + quadPoints: this.#serializeBoxes(), + outlines: this.#serializeOutlines(rect), + pageIndex: this.pageIndex, + rect, + rotation: this.#getRotation(), + structTreeParentId: this._structTreeParentId + }; + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color + } = this._initialData; + return serialized.color.some((c, i) => c !== color[i]); + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getRect(0, 0) + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// ./src/display/editor/draw.js + + + +class DrawingOptions { + #svgProperties = Object.create(null); + updateProperty(name, value) { + this[name] = value; + this.updateSVGProperty(name, value); + } + updateProperties(properties) { + if (!properties) { + return; + } + for (const [name, value] of Object.entries(properties)) { + if (!name.startsWith("_")) { + this.updateProperty(name, value); + } + } + } + updateSVGProperty(name, value) { + this.#svgProperties[name] = value; + } + toSVGProperties() { + const root = this.#svgProperties; + this.#svgProperties = Object.create(null); + return { + root + }; + } + reset() { + this.#svgProperties = Object.create(null); + } + updateAll(options = this) { + this.updateProperties(options); + } + clone() { + unreachable("Not implemented"); + } +} +class DrawingEditor extends AnnotationEditor { + #drawOutlines = null; + #mustBeCommitted; + _drawId = null; + static _currentDrawId = -1; + static _currentParent = null; + static #currentDraw = null; + static #currentDrawingAC = null; + static #currentDrawingOptions = null; + static #currentPointerId = NaN; + static #currentPointerType = null; + static #currentPointerIds = null; + static #currentMoveTimestamp = NaN; + static _INNER_MARGIN = 3; + constructor(params) { + super(params); + this.#mustBeCommitted = params.mustBeCommitted || false; + this._addOutlines(params); + } + _addOutlines(params) { + if (params.drawOutlines) { + this.#createDrawOutlines(params); + this.#addToDrawLayer(); + } + } + #createDrawOutlines({ + drawOutlines, + drawId, + drawingOptions + }) { + this.#drawOutlines = drawOutlines; + this._drawingOptions ||= drawingOptions; + if (drawId >= 0) { + this._drawId = drawId; + this.parent.drawLayer.finalizeDraw(drawId, drawOutlines.defaultProperties); + } else { + this._drawId = this.#createDrawing(drawOutlines, this.parent); + } + this.#updateBbox(drawOutlines.box); + } + #createDrawing(drawOutlines, parent) { + const { + id + } = parent.drawLayer.draw(DrawingEditor._mergeSVGProperties(this._drawingOptions.toSVGProperties(), drawOutlines.defaultSVGProperties), false, false); + return id; + } + static _mergeSVGProperties(p1, p2) { + const p1Keys = new Set(Object.keys(p1)); + for (const [key, value] of Object.entries(p2)) { + if (p1Keys.has(key)) { + Object.assign(p1[key], value); + } else { + p1[key] = value; + } + } + return p1; + } + static getDefaultDrawingOptions(_options) { + unreachable("Not implemented"); + } + static get typesMap() { + unreachable("Not implemented"); + } + static get isDrawer() { + return true; + } + static get supportMultipleDrawings() { + return false; + } + static updateDefaultParams(type, value) { + const propertyName = this.typesMap.get(type); + if (propertyName) { + this._defaultDrawingOptions.updateProperty(propertyName, value); + } + if (this._currentParent) { + DrawingEditor.#currentDraw.updateProperty(propertyName, value); + this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + } + updateParams(type, value) { + const propertyName = this.constructor.typesMap.get(type); + if (propertyName) { + this._updateProperty(type, propertyName, value); + } + } + static get defaultPropertiesToUpdate() { + const properties = []; + const options = this._defaultDrawingOptions; + for (const [type, name] of this.typesMap) { + properties.push([type, options[name]]); + } + return properties; + } + get propertiesToUpdate() { + const properties = []; + const { + _drawingOptions + } = this; + for (const [type, name] of this.constructor.typesMap) { + properties.push([type, _drawingOptions[name]]); + } + return properties; + } + _updateProperty(type, name, value) { + const options = this._drawingOptions; + const savedValue = options[name]; + const setter = val => { + options.updateProperty(name, val); + const bbox = this.#drawOutlines.updateProperty(name, val); + if (bbox) { + this.#updateBbox(bbox); + } + this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties()); + }; + this.addCommands({ + cmd: setter.bind(this, value), + undo: setter.bind(this, savedValue), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type, + overwriteIfSameType: true, + keepUndo: true + }); + } + _onResizing() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizingSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + } + _onResized() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizedSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + } + _onTranslating(_x, _y) { + this.parent?.drawLayer.updateProperties(this._drawId, { + bbox: this.#rotateBox() + }); + } + _onTranslated() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathTranslatedSVGProperties(this.#convertToDrawSpace(), this.parentDimensions), { + bbox: this.#rotateBox() + })); + } + _onStartDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: true + } + }); + } + _onStopDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: false + } + }); + } + commit() { + super.commit(); + this.disableEditMode(); + this.disableEditing(); + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + getBaseTranslation() { + return [0, 0]; + } + get isResizable() { + return true; + } + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + this._isDraggable = true; + if (this.#mustBeCommitted) { + this.#mustBeCommitted = false; + this.commit(); + this.parent.setSelected(this); + if (focus && this.isOnScreen) { + this.div.focus(); + } + } + } + remove() { + this.#cleanDrawLayer(); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + this.#updateBbox(this.#drawOutlines.box); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this._uiManager.removeShouldRescale(this); + this.#cleanDrawLayer(); + } else if (parent) { + this._uiManager.addShouldRescale(this); + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + if (mustBeSelected) { + this.select(); + } + } + #cleanDrawLayer() { + if (this._drawId === null || !this.parent) { + return; + } + this.parent.drawLayer.remove(this._drawId); + this._drawId = null; + this._drawingOptions.reset(); + } + #addToDrawLayer(parent = this.parent) { + if (this._drawId !== null && this.parent === parent) { + return; + } + if (this._drawId !== null) { + this.parent.drawLayer.updateParent(this._drawId, parent.drawLayer); + return; + } + this._drawingOptions.updateAll(); + this._drawId = this.#createDrawing(this.#drawOutlines, parent); + } + #convertToParentSpace([x, y, width, height]) { + const { + parentDimensions: [pW, pH], + rotation + } = this; + switch (rotation) { + case 90: + return [y, 1 - x, width * (pH / pW), height * (pW / pH)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [1 - y, x, width * (pH / pW), height * (pW / pH)]; + default: + return [x, y, width, height]; + } + } + #convertToDrawSpace() { + const { + x, + y, + width, + height, + parentDimensions: [pW, pH], + rotation + } = this; + switch (rotation) { + case 90: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + #updateBbox(bbox) { + [this.x, this.y, this.width, this.height] = this.#convertToParentSpace(bbox); + if (this.div) { + this.fixAndSetPosition(); + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + } + this._onResized(); + } + #rotateBox() { + const { + x, + y, + width, + height, + rotation, + parentRotation, + parentDimensions: [pW, pH] + } = this; + switch ((rotation * 4 + parentRotation) / 90) { + case 1: + return [1 - y - height, x, height, width]; + case 2: + return [1 - x - width, 1 - y - height, width, height]; + case 3: + return [y, 1 - x - width, height, width]; + case 4: + return [x, y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 5: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 6: + return [1 - x - height * (pH / pW), 1 - y, height * (pH / pW), width * (pW / pH)]; + case 7: + return [y - width * (pW / pH), 1 - x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 8: + return [x - width, y - height, width, height]; + case 9: + return [1 - y, x - width, height, width]; + case 10: + return [1 - x, 1 - y, width, height]; + case 11: + return [y - height, 1 - x, height, width]; + case 12: + return [x - height * (pH / pW), y, height * (pH / pW), width * (pW / pH)]; + case 13: + return [1 - y - width * (pW / pH), x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 14: + return [1 - x, 1 - y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 15: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + rotate() { + if (!this.parent) { + return; + } + this.parent.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties({ + bbox: this.#rotateBox() + }, this.#drawOutlines.updateRotation((this.parentRotation - this.rotation + 360) % 360))); + } + onScaleChanging() { + if (!this.parent) { + return; + } + this.#updateBbox(this.#drawOutlines.updateParentDimensions(this.parentDimensions, this.parent.scale)); + } + static onScaleChangingWhenDrawing() {} + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy) { + baseX = this.x; + baseY = this.y; + } + const div = super.render(); + div.classList.add("draw"); + const drawDiv = document.createElement("div"); + div.append(drawDiv); + drawDiv.setAttribute("aria-hidden", "true"); + drawDiv.className = "internal"; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(this.width * parentWidth, this.height * parentHeight); + this._uiManager.addShouldRescale(this); + this.disableEditing(); + if (this._isCopy) { + this._moveAfterPaste(baseX, baseY); + } + return div; + } + static createDrawerInstance(_x, _y, _parentWidth, _parentHeight, _rotation) { + unreachable("Not implemented"); + } + static startDrawing(parent, uiManager, _isLTR, event) { + const { + target, + offsetX: x, + offsetY: y, + pointerId, + pointerType + } = event; + if (DrawingEditor.#currentPointerType && DrawingEditor.#currentPointerType !== pointerType) { + return; + } + const { + viewport: { + rotation + } + } = parent; + const { + width: parentWidth, + height: parentHeight + } = target.getBoundingClientRect(); + const ac = DrawingEditor.#currentDrawingAC = new AbortController(); + const signal = parent.combinedSignal(ac); + DrawingEditor.#currentPointerId ||= pointerId; + DrawingEditor.#currentPointerType ??= pointerType; + window.addEventListener("pointerup", e => { + if (DrawingEditor.#currentPointerId === e.pointerId) { + this._endDraw(e); + } else { + DrawingEditor.#currentPointerIds?.delete(e.pointerId); + } + }, { + signal + }); + window.addEventListener("pointercancel", e => { + if (DrawingEditor.#currentPointerId === e.pointerId) { + this._currentParent.endDrawingSession(); + } else { + DrawingEditor.#currentPointerIds?.delete(e.pointerId); + } + }, { + signal + }); + window.addEventListener("pointerdown", e => { + if (DrawingEditor.#currentPointerType !== e.pointerType) { + return; + } + (DrawingEditor.#currentPointerIds ||= new Set()).add(e.pointerId); + if (DrawingEditor.#currentDraw.isCancellable()) { + DrawingEditor.#currentDraw.removeLastElement(); + if (DrawingEditor.#currentDraw.isEmpty()) { + this._currentParent.endDrawingSession(true); + } else { + this._endDraw(null); + } + } + }, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + target.addEventListener("pointermove", this._drawMove.bind(this), { + signal + }); + target.addEventListener("touchmove", e => { + if (e.timeStamp === DrawingEditor.#currentMoveTimestamp) { + stopEvent(e); + } + }, { + signal + }); + parent.toggleDrawing(); + uiManager._editorUndoBar?.hide(); + if (DrawingEditor.#currentDraw) { + parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.startNew(x, y, parentWidth, parentHeight, rotation)); + return; + } + uiManager.updateUIForDefaultProperties(this); + DrawingEditor.#currentDraw = this.createDrawerInstance(x, y, parentWidth, parentHeight, rotation); + DrawingEditor.#currentDrawingOptions = this.getDefaultDrawingOptions(); + this._currentParent = parent; + ({ + id: this._currentDrawId + } = parent.drawLayer.draw(this._mergeSVGProperties(DrawingEditor.#currentDrawingOptions.toSVGProperties(), DrawingEditor.#currentDraw.defaultSVGProperties), true, false)); + } + static _drawMove(event) { + DrawingEditor.#currentMoveTimestamp = -1; + if (!DrawingEditor.#currentDraw) { + return; + } + const { + offsetX, + offsetY, + pointerId + } = event; + if (DrawingEditor.#currentPointerId !== pointerId) { + return; + } + if (DrawingEditor.#currentPointerIds?.size >= 1) { + this._endDraw(event); + return; + } + this._currentParent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.add(offsetX, offsetY)); + DrawingEditor.#currentMoveTimestamp = event.timeStamp; + stopEvent(event); + } + static _cleanup(all) { + if (all) { + this._currentDrawId = -1; + this._currentParent = null; + DrawingEditor.#currentDraw = null; + DrawingEditor.#currentDrawingOptions = null; + DrawingEditor.#currentPointerType = null; + DrawingEditor.#currentMoveTimestamp = NaN; + } + if (DrawingEditor.#currentDrawingAC) { + DrawingEditor.#currentDrawingAC.abort(); + DrawingEditor.#currentDrawingAC = null; + DrawingEditor.#currentPointerId = NaN; + DrawingEditor.#currentPointerIds = null; + } + } + static _endDraw(event) { + const parent = this._currentParent; + if (!parent) { + return; + } + parent.toggleDrawing(true); + this._cleanup(false); + if (event?.target === parent.div) { + parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.end(event.offsetX, event.offsetY)); + } + if (this.supportMultipleDrawings) { + const draw = DrawingEditor.#currentDraw; + const drawId = this._currentDrawId; + const lastElement = draw.getLastElement(); + parent.addCommands({ + cmd: () => { + parent.drawLayer.updateProperties(drawId, draw.setLastElement(lastElement)); + }, + undo: () => { + parent.drawLayer.updateProperties(drawId, draw.removeLastElement()); + }, + mustExec: false, + type: AnnotationEditorParamsType.DRAW_STEP + }); + return; + } + this.endDrawing(false); + } + static endDrawing(isAborted) { + const parent = this._currentParent; + if (!parent) { + return null; + } + parent.toggleDrawing(true); + parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP); + if (!DrawingEditor.#currentDraw.isEmpty()) { + const { + pageDimensions: [pageWidth, pageHeight], + scale + } = parent; + const editor = parent.createAndAddNewEditor({ + offsetX: 0, + offsetY: 0 + }, false, { + drawId: this._currentDrawId, + drawOutlines: DrawingEditor.#currentDraw.getOutlines(pageWidth * scale, pageHeight * scale, scale, this._INNER_MARGIN), + drawingOptions: DrawingEditor.#currentDrawingOptions, + mustBeCommitted: !isAborted + }); + this._cleanup(true); + return editor; + } + parent.drawLayer.remove(this._currentDrawId); + this._cleanup(true); + return null; + } + createDrawingOptions(_data) {} + static deserializeDraw(_pageX, _pageY, _pageWidth, _pageHeight, _innerWidth, _data) { + unreachable("Not implemented"); + } + static async deserialize(data, parent, uiManager) { + const { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = parent.viewport; + const drawOutlines = this.deserializeDraw(pageX, pageY, pageWidth, pageHeight, this._INNER_MARGIN, data); + const editor = await super.deserialize(data, parent, uiManager); + editor.createDrawingOptions(data); + editor.#createDrawOutlines({ + drawOutlines + }); + editor.#addToDrawLayer(); + editor.onScaleChanging(); + editor.rotate(); + return editor; + } + serializeDraw(isForCopying) { + const [pageX, pageY] = this.pageTranslation; + const [pageWidth, pageHeight] = this.pageDimensions; + return this.#drawOutlines.serialize([pageX, pageY, pageWidth, pageHeight], isForCopying); + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getRect(0, 0) + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// ./src/display/editor/drawers/inkdraw.js + + +class InkDrawOutliner { + #last = new Float64Array(6); + #line; + #lines; + #rotation; + #thickness; + #points; + #lastSVGPath = ""; + #lastIndex = 0; + #outlines = new InkDrawOutline(); + #parentWidth; + #parentHeight; + constructor(x, y, parentWidth, parentHeight, rotation, thickness) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + this.#thickness = thickness; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + this.#lines = [{ + line, + points: this.#points + }]; + this.#last.set(line, 0); + } + updateProperty(name, value) { + if (name === "stroke-width") { + this.#thickness = value; + } + } + #normalizePoint(x, y) { + return Outline._normalizePoint(x, y, this.#parentWidth, this.#parentHeight, this.#rotation); + } + isEmpty() { + return !this.#lines || this.#lines.length === 0; + } + isCancellable() { + return this.#points.length <= 10; + } + add(x, y) { + [x, y] = this.#normalizePoint(x, y); + const [x1, y1, x2, y2] = this.#last.subarray(2, 6); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY); + if (d <= 2) { + return null; + } + this.#points.push(x, y); + if (isNaN(x1)) { + this.#last.set([x2, y2, x, y], 2); + this.#line.push(NaN, NaN, NaN, NaN, x, y); + return { + path: { + d: this.toSVGPath() + } + }; + } + if (isNaN(this.#last[0])) { + this.#line.splice(6, 6); + } + this.#last.set([x1, y1, x2, y2, x, y], 0); + this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y)); + return { + path: { + d: this.toSVGPath() + } + }; + } + end(x, y) { + const change = this.add(x, y); + if (change) { + return change; + } + if (this.#points.length === 2) { + return { + path: { + d: this.toSVGPath() + } + }; + } + return null; + } + startNew(x, y, parentWidth, parentHeight, rotation) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + const last = this.#lines.at(-1); + if (last) { + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + } + this.#lines.push({ + line, + points: this.#points + }); + this.#last.set(line, 0); + this.#lastIndex = 0; + this.toSVGPath(); + return null; + } + getLastElement() { + return this.#lines.at(-1); + } + setLastElement(element) { + if (!this.#lines) { + return this.#outlines.setLastElement(element); + } + this.#lines.push(element); + this.#line = element.line; + this.#points = element.points; + this.#lastIndex = 0; + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + if (!this.#lines) { + return this.#outlines.removeLastElement(); + } + this.#lines.pop(); + this.#lastSVGPath = ""; + for (let i = 0, ii = this.#lines.length; i < ii; i++) { + const { + line, + points + } = this.#lines[i]; + this.#line = line; + this.#points = points; + this.#lastIndex = 0; + this.toSVGPath(); + } + return { + path: { + d: this.#lastSVGPath + } + }; + } + toSVGPath() { + const firstX = Outline.svgRound(this.#line[4]); + const firstY = Outline.svgRound(this.#line[5]); + if (this.#points.length === 2) { + this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`; + return this.#lastSVGPath; + } + if (this.#points.length <= 6) { + const i = this.#lastSVGPath.lastIndexOf("M"); + this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`; + this.#lastIndex = 6; + } + if (this.#points.length === 4) { + const secondX = Outline.svgRound(this.#line[10]); + const secondY = Outline.svgRound(this.#line[11]); + this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`; + this.#lastIndex = 12; + return this.#lastSVGPath; + } + const buffer = []; + if (this.#lastIndex === 0) { + buffer.push(`M ${firstX} ${firstY}`); + this.#lastIndex = 6; + } + for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = this.#line.slice(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + this.#lastSVGPath += buffer.join(" "); + this.#lastIndex = this.#line.length; + return this.#lastSVGPath; + } + getOutlines(parentWidth, parentHeight, scale, innerMargin) { + const last = this.#lines.at(-1); + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + this.#outlines.build(this.#lines, parentWidth, parentHeight, scale, this.#rotation, this.#thickness, innerMargin); + this.#last = null; + this.#line = null; + this.#lines = null; + this.#lastSVGPath = null; + return this.#outlines; + } + get defaultSVGProperties() { + return { + root: { + viewBox: "0 0 10000 10000" + }, + rootClass: { + draw: true + }, + bbox: [0, 0, 1, 1] + }; + } +} +class InkDrawOutline extends Outline { + #bbox; + #currentRotation = 0; + #innerMargin; + #lines; + #parentWidth; + #parentHeight; + #parentScale; + #rotation; + #thickness; + build(lines, parentWidth, parentHeight, parentScale, rotation, thickness, innerMargin) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#parentScale = parentScale; + this.#rotation = rotation; + this.#thickness = thickness; + this.#innerMargin = innerMargin ?? 0; + this.#lines = lines; + this.#computeBbox(); + } + get thickness() { + return this.#thickness; + } + setLastElement(element) { + this.#lines.push(element); + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + this.#lines.pop(); + return { + path: { + d: this.toSVGPath() + } + }; + } + toSVGPath() { + const buffer = []; + for (const { + line + } of this.#lines) { + buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`); + if (line.length === 6) { + buffer.push("Z"); + continue; + } + if (line.length === 12 && isNaN(line[6])) { + buffer.push(`L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`); + continue; + } + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + } + return buffer.join(""); + } + serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) { + const serializedLines = []; + const serializedPoints = []; + const [x, y, width, height] = this.#getBBoxWithNoMargin(); + let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn; + switch (this.#rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = pageX; + ty = pageY + pageHeight; + sx = pageWidth; + sy = -pageHeight; + x1 = pageX + x * pageWidth; + y1 = pageY + (1 - y - height) * pageHeight; + x2 = pageX + (x + width) * pageWidth; + y2 = pageY + (1 - y) * pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX; + ty = pageY; + sx = pageWidth; + sy = pageHeight; + x1 = pageX + y * pageWidth; + y1 = pageY + x * pageHeight; + x2 = pageX + (y + height) * pageWidth; + y2 = pageY + (x + width) * pageHeight; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX + pageWidth; + ty = pageY; + sx = -pageWidth; + sy = pageHeight; + x1 = pageX + (1 - x - width) * pageWidth; + y1 = pageY + y * pageHeight; + x2 = pageX + (1 - x) * pageWidth; + y2 = pageY + (y + height) * pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX + pageWidth; + ty = pageY + pageHeight; + sx = -pageWidth; + sy = -pageHeight; + x1 = pageX + (1 - y - height) * pageWidth; + y1 = pageY + (1 - x - width) * pageHeight; + x2 = pageX + (1 - y) * pageWidth; + y2 = pageY + (1 - x) * pageHeight; + break; + } + for (const { + line, + points + } of this.#lines) { + serializedLines.push(rescaleFn(line, tx, ty, sx, sy, isForCopying ? new Array(line.length) : null)); + serializedPoints.push(rescaleFn(points, tx, ty, sx, sy, isForCopying ? new Array(points.length) : null)); + } + return { + lines: serializedLines, + points: serializedPoints, + rect: [x1, y1, x2, y2] + }; + } + static deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, { + paths: { + lines, + points + }, + rotation, + thickness + }) { + const newLines = []; + let tx, ty, sx, sy, rescaleFn; + switch (rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = -pageX / pageWidth; + ty = pageY / pageHeight + 1; + sx = 1 / pageWidth; + sy = -1 / pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = -pageY / pageHeight; + ty = -pageX / pageWidth; + sx = 1 / pageHeight; + sy = 1 / pageWidth; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX / pageWidth + 1; + ty = -pageY / pageHeight; + sx = -1 / pageWidth; + sy = 1 / pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageY / pageHeight + 1; + ty = pageX / pageWidth + 1; + sx = -1 / pageHeight; + sy = -1 / pageWidth; + break; + } + if (!lines) { + lines = []; + for (const point of points) { + const len = point.length; + if (len === 2) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]])); + continue; + } + if (len === 4) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1], NaN, NaN, NaN, NaN, point[2], point[3]])); + continue; + } + const line = new Float32Array(3 * (len - 2)); + lines.push(line); + let [x1, y1, x2, y2] = point.subarray(0, 4); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = point[i]; + const y = point[i + 1]; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; + } + } + } + for (let i = 0, ii = lines.length; i < ii; i++) { + newLines.push({ + line: rescaleFn(lines[i].map(x => x ?? NaN), tx, ty, sx, sy), + points: rescaleFn(points[i].map(x => x ?? NaN), tx, ty, sx, sy) + }); + } + const outlines = new this.prototype.constructor(); + outlines.build(newLines, pageWidth, pageHeight, 1, rotation, thickness, innerMargin); + return outlines; + } + #getMarginComponents(thickness = this.#thickness) { + const margin = this.#innerMargin + thickness / 2 * this.#parentScale; + return this.#rotation % 180 === 0 ? [margin / this.#parentWidth, margin / this.#parentHeight] : [margin / this.#parentHeight, margin / this.#parentWidth]; + } + #getBBoxWithNoMargin() { + const [x, y, width, height] = this.#bbox; + const [marginX, marginY] = this.#getMarginComponents(0); + return [x + marginX, y + marginY, width - 2 * marginX, height - 2 * marginY]; + } + #computeBbox() { + const bbox = this.#bbox = new Float32Array([Infinity, Infinity, -Infinity, -Infinity]); + for (const { + line + } of this.#lines) { + if (line.length <= 12) { + for (let i = 4, ii = line.length; i < ii; i += 6) { + Util.pointBoundingBox(line[i], line[i + 1], bbox); + } + continue; + } + let lastX = line[4], + lastY = line[5]; + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6); + Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox); + lastX = x; + lastY = y; + } + } + const [marginX, marginY] = this.#getMarginComponents(); + bbox[0] = MathClamp(bbox[0] - marginX, 0, 1); + bbox[1] = MathClamp(bbox[1] - marginY, 0, 1); + bbox[2] = MathClamp(bbox[2] + marginX, 0, 1); + bbox[3] = MathClamp(bbox[3] + marginY, 0, 1); + bbox[2] -= bbox[0]; + bbox[3] -= bbox[1]; + } + get box() { + return this.#bbox; + } + updateProperty(name, value) { + if (name === "stroke-width") { + return this.#updateThickness(value); + } + return null; + } + #updateThickness(thickness) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#thickness = thickness; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const [diffMarginX, diffMarginY] = [newMarginX - oldMarginX, newMarginY - oldMarginY]; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateParentDimensions([width, height], scale) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#parentWidth = width; + this.#parentHeight = height; + this.#parentScale = scale; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const diffMarginX = newMarginX - oldMarginX; + const diffMarginY = newMarginY - oldMarginY; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateRotation(rotation) { + this.#currentRotation = rotation; + return { + path: { + transform: this.rotationTransform + } + }; + } + get viewBox() { + return this.#bbox.map(Outline.svgRound).join(" "); + } + get defaultProperties() { + const [x, y] = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}` + } + }; + } + get rotationTransform() { + const [,, width, height] = this.#bbox; + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0; + switch (this.#currentRotation) { + case 90: + b = height / width; + c = -width / height; + e = width; + break; + case 180: + a = -1; + d = -1; + e = width; + f = height; + break; + case 270: + b = -height / width; + c = width / height; + f = height; + break; + default: + return ""; + } + return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`; + } + getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const [x, y, width, height] = this.#bbox; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + return { + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: `${this.rotationTransform} translate(${tx} ${ty})` + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const s2x = width / newWidth; + const s2y = height / newHeight; + return { + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`, + transform: `${this.rotationTransform} scale(${s2x} ${s2y}) ` + `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` + `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})` + } + }; + } + getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const bbox = this.#bbox; + const [x, y, width, height] = bbox; + bbox[0] = newX; + bbox[1] = newY; + bbox[2] = newWidth; + bbox[3] = newHeight; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const tx = -s1x * (x + marginX) + newX + marginX; + const ty = -s1y * (y + marginY) + newY + marginY; + if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) { + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, s1x, s1y, line); + Outline._rescale(points, tx, ty, s1x, s1y, points); + } + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + getPathTranslatedSVGProperties([newX, newY], parentDimensions) { + const [newParentWidth, newParentHeight] = parentDimensions; + const bbox = this.#bbox; + const tx = newX - bbox[0]; + const ty = newY - bbox[1]; + if (this.#parentWidth === newParentWidth && this.#parentHeight === newParentHeight) { + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + } else { + const sx = this.#parentWidth / newParentWidth; + const sy = this.#parentHeight / newParentHeight; + this.#parentWidth = newParentWidth; + this.#parentHeight = newParentHeight; + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, sx, sy, line); + Outline._rescale(points, tx, ty, sx, sy, points); + } + bbox[2] *= sx; + bbox[3] *= sy; + } + bbox[0] = newX; + bbox[1] = newY; + return { + root: { + viewBox: this.viewBox + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}` + } + }; + } + get defaultSVGProperties() { + const bbox = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + rootClass: { + draw: true + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`, + transform: this.rotationTransform || null + }, + bbox + }; + } +} + +;// ./src/display/editor/ink.js + + + + + +class InkDrawingOptions extends DrawingOptions { + constructor(viewerParameters) { + super(); + this._viewParameters = viewerParameters; + super.updateProperties({ + fill: "none", + stroke: AnnotationEditor._defaultLineColor, + "stroke-opacity": 1, + "stroke-width": 1, + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-miterlimit": 10 + }); + } + updateSVGProperty(name, value) { + if (name === "stroke-width") { + value ??= this["stroke-width"]; + value *= this._viewParameters.realScale; + } + super.updateSVGProperty(name, value); + } + clone() { + const clone = new InkDrawingOptions(this._viewParameters); + clone.updateAll(this); + return clone; + } +} +class InkEditor extends DrawingEditor { + static _type = "ink"; + static _editorType = AnnotationEditorType.INK; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + name: "inkEditor" + }); + this._willKeepAspectRatio = true; + this.defaultL10nId = "pdfjs-editor-ink-editor"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new InkDrawingOptions(uiManager.viewParameters); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; + } + static get supportMultipleDrawings() { + return true; + } + static get typesMap() { + return shadow(this, "typesMap", new Map([[AnnotationEditorParamsType.INK_THICKNESS, "stroke-width"], [AnnotationEditorParamsType.INK_COLOR, "stroke"], [AnnotationEditorParamsType.INK_OPACITY, "stroke-opacity"]])); + } + static createDrawerInstance(x, y, parentWidth, parentHeight, rotation) { + return new InkDrawOutliner(x, y, parentWidth, parentHeight, rotation, this._defaultDrawingOptions["stroke-width"]); + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + opacity, + borderStyle: { + rawWidth: thickness + }, + popupRef + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.INK, + color: Array.from(color), + thickness, + opacity, + paths: { + points: inkLists + }, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + popupRef + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor.annotationElementId = data.id || null; + editor._initialData = initialData; + return editor; + } + onScaleChanging() { + if (!this.parent) { + return; + } + super.onScaleChanging(); + const { + _drawId, + _drawingOptions, + parent + } = this; + _drawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(_drawId, _drawingOptions.toSVGProperties()); + } + static onScaleChangingWhenDrawing() { + const parent = this._currentParent; + if (!parent) { + return; + } + super.onScaleChangingWhenDrawing(); + this._defaultDrawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + createDrawingOptions({ + color, + thickness, + opacity + }) { + this._drawingOptions = InkEditor.getDefaultDrawingOptions({ + stroke: Util.makeHexColor(...color), + "stroke-width": thickness, + "stroke-opacity": opacity + }); + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const { + lines, + points, + rect + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + stroke, + "stroke-opacity": opacity, + "stroke-width": thickness + } + } = this; + const serialized = { + annotationType: AnnotationEditorType.INK, + color: AnnotationEditor._colorManager.convert(stroke), + opacity, + thickness, + paths: { + lines, + points + }, + pageIndex: this.pageIndex, + rect, + rotation: this.rotation, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + serialized.isCopy = true; + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color, + thickness, + opacity, + pageIndex + } = this._initialData; + return this._hasBeenMoved || this._hasBeenResized || serialized.color.some((c, i) => c !== color[i]) || serialized.thickness !== thickness || serialized.opacity !== opacity || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const { + points, + rect + } = this.serializeDraw(false); + annotation.updateEdited({ + rect, + thickness: this._drawingOptions["stroke-width"], + points + }); + return null; + } +} + +;// ./src/display/editor/drawers/contour.js + +class ContourDrawOutline extends InkDrawOutline { + toSVGPath() { + let path = super.toSVGPath(); + if (!path.endsWith("Z")) { + path += "Z"; + } + return path; + } +} + +;// ./src/display/editor/drawers/signaturedraw.js + + + + +const BASE_HEADER_LENGTH = 8; +const POINTS_PROPERTIES_NUMBER = 3; +class SignatureExtractor { + static #PARAMETERS = { + maxDim: 512, + sigmaSFactor: 0.02, + sigmaR: 25, + kernelSize: 16 + }; + static #neighborIndexToId(i0, j0, i, j) { + i -= i0; + j -= j0; + if (i === 0) { + return j > 0 ? 0 : 4; + } + if (i === 1) { + return j + 6; + } + return 2 - j; + } + static #neighborIdToIndex = new Int32Array([0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1]); + static #clockwiseNonZero(buf, width, i0, j0, i, j, offset) { + const id = this.#neighborIndexToId(i0, j0, i, j); + for (let k = 0; k < 8; k++) { + const kk = (-k + id - offset + 16) % 8; + const shiftI = this.#neighborIdToIndex[2 * kk]; + const shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) { + return kk; + } + } + return -1; + } + static #counterClockwiseNonZero(buf, width, i0, j0, i, j, offset) { + const id = this.#neighborIndexToId(i0, j0, i, j); + for (let k = 0; k < 8; k++) { + const kk = (k + id + offset + 16) % 8; + const shiftI = this.#neighborIdToIndex[2 * kk]; + const shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) { + return kk; + } + } + return -1; + } + static #findContours(buf, width, height, threshold) { + const N = buf.length; + const types = new Int32Array(N); + for (let i = 0; i < N; i++) { + types[i] = buf[i] <= threshold ? 1 : 0; + } + for (let i = 1; i < height - 1; i++) { + types[i * width] = types[i * width + width - 1] = 0; + } + for (let i = 0; i < width; i++) { + types[i] = types[width * height - 1 - i] = 0; + } + let nbd = 1; + let lnbd; + const contours = []; + for (let i = 1; i < height - 1; i++) { + lnbd = 1; + for (let j = 1; j < width - 1; j++) { + const ij = i * width + j; + const pix = types[ij]; + if (pix === 0) { + continue; + } + let i2 = i; + let j2 = j; + if (pix === 1 && types[ij - 1] === 0) { + nbd += 1; + j2 -= 1; + } else if (pix >= 1 && types[ij + 1] === 0) { + nbd += 1; + j2 += 1; + if (pix > 1) { + lnbd = pix; + } + } else { + if (pix !== 1) { + lnbd = Math.abs(pix); + } + continue; + } + const points = [j, i]; + const isHole = j2 === j + 1; + const contour = { + isHole, + points, + id: nbd, + parent: 0 + }; + contours.push(contour); + let contour0; + for (const c of contours) { + if (c.id === lnbd) { + contour0 = c; + break; + } + } + if (!contour0) { + contour.parent = isHole ? lnbd : 0; + } else if (contour0.isHole) { + contour.parent = isHole ? contour0.parent : lnbd; + } else { + contour.parent = isHole ? lnbd : contour0.parent; + } + const k = this.#clockwiseNonZero(types, width, i, j, i2, j2, 0); + if (k === -1) { + types[ij] = -nbd; + if (types[ij] !== 1) { + lnbd = Math.abs(types[ij]); + } + continue; + } + let shiftI = this.#neighborIdToIndex[2 * k]; + let shiftJ = this.#neighborIdToIndex[2 * k + 1]; + const i1 = i + shiftI; + const j1 = j + shiftJ; + i2 = i1; + j2 = j1; + let i3 = i; + let j3 = j; + while (true) { + const kk = this.#counterClockwiseNonZero(types, width, i3, j3, i2, j2, 1); + shiftI = this.#neighborIdToIndex[2 * kk]; + shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + const i4 = i3 + shiftI; + const j4 = j3 + shiftJ; + points.push(j4, i4); + const ij3 = i3 * width + j3; + if (types[ij3 + 1] === 0) { + types[ij3] = -nbd; + } else if (types[ij3] === 1) { + types[ij3] = nbd; + } + if (i4 === i && j4 === j && i3 === i1 && j3 === j1) { + if (types[ij] !== 1) { + lnbd = Math.abs(types[ij]); + } + break; + } else { + i2 = i3; + j2 = j3; + i3 = i4; + j3 = j4; + } + } + } + } + return contours; + } + static #douglasPeuckerHelper(points, start, end, output) { + if (end - start <= 4) { + for (let i = start; i < end - 2; i += 2) { + output.push(points[i], points[i + 1]); + } + return; + } + const ax = points[start]; + const ay = points[start + 1]; + const abx = points[end - 4] - ax; + const aby = points[end - 3] - ay; + const dist = Math.hypot(abx, aby); + const nabx = abx / dist; + const naby = aby / dist; + const aa = nabx * ay - naby * ax; + const m = aby / abx; + const invS = 1 / dist; + const phi = Math.atan(m); + const cosPhi = Math.cos(phi); + const sinPhi = Math.sin(phi); + const tmax = invS * (Math.abs(cosPhi) + Math.abs(sinPhi)); + const poly = invS * (1 - tmax + tmax ** 2); + const partialPhi = Math.max(Math.atan(Math.abs(sinPhi + cosPhi) * poly), Math.atan(Math.abs(sinPhi - cosPhi) * poly)); + let dmax = 0; + let index = start; + for (let i = start + 2; i < end - 2; i += 2) { + const d = Math.abs(aa - nabx * points[i + 1] + naby * points[i]); + if (d > dmax) { + index = i; + dmax = d; + } + } + if (dmax > (dist * partialPhi) ** 2) { + this.#douglasPeuckerHelper(points, start, index + 2, output); + this.#douglasPeuckerHelper(points, index, end, output); + } else { + output.push(ax, ay); + } + } + static #douglasPeucker(points) { + const output = []; + const len = points.length; + this.#douglasPeuckerHelper(points, 0, len, output); + output.push(points[len - 2], points[len - 1]); + return output.length <= 4 ? null : output; + } + static #bilateralFilter(buf, width, height, sigmaS, sigmaR, kernelSize) { + const kernel = new Float32Array(kernelSize ** 2); + const sigmaS2 = -2 * sigmaS ** 2; + const halfSize = kernelSize >> 1; + for (let i = 0; i < kernelSize; i++) { + const x = (i - halfSize) ** 2; + for (let j = 0; j < kernelSize; j++) { + kernel[i * kernelSize + j] = Math.exp((x + (j - halfSize) ** 2) / sigmaS2); + } + } + const rangeValues = new Float32Array(256); + const sigmaR2 = -2 * sigmaR ** 2; + for (let i = 0; i < 256; i++) { + rangeValues[i] = Math.exp(i ** 2 / sigmaR2); + } + const N = buf.length; + const out = new Uint8Array(N); + const histogram = new Uint32Array(256); + for (let i = 0; i < height; i++) { + for (let j = 0; j < width; j++) { + const ij = i * width + j; + const center = buf[ij]; + let sum = 0; + let norm = 0; + for (let k = 0; k < kernelSize; k++) { + const y = i + k - halfSize; + if (y < 0 || y >= height) { + continue; + } + for (let l = 0; l < kernelSize; l++) { + const x = j + l - halfSize; + if (x < 0 || x >= width) { + continue; + } + const neighbour = buf[y * width + x]; + const w = kernel[k * kernelSize + l] * rangeValues[Math.abs(neighbour - center)]; + sum += neighbour * w; + norm += w; + } + } + const pix = out[ij] = Math.round(sum / norm); + histogram[pix]++; + } + } + return [out, histogram]; + } + static #getHistogram(buf) { + const histogram = new Uint32Array(256); + for (const g of buf) { + histogram[g]++; + } + return histogram; + } + static #toUint8(buf) { + const N = buf.length; + const out = new Uint8ClampedArray(N >> 2); + let max = -Infinity; + let min = Infinity; + for (let i = 0, ii = out.length; i < ii; i++) { + const A = buf[(i << 2) + 3]; + if (A === 0) { + max = out[i] = 0xff; + continue; + } + const pix = out[i] = buf[i << 2]; + if (pix > max) { + max = pix; + } + if (pix < min) { + min = pix; + } + } + const ratio = 255 / (max - min); + for (let i = 0; i < N; i++) { + out[i] = (out[i] - min) * ratio; + } + return out; + } + static #guessThreshold(histogram) { + let i; + let M = -Infinity; + let L = -Infinity; + const min = histogram.findIndex(v => v !== 0); + let pos = min; + let spos = min; + for (i = min; i < 256; i++) { + const v = histogram[i]; + if (v > M) { + if (i - pos > L) { + L = i - pos; + spos = i - 1; + } + M = v; + pos = i; + } + } + for (i = spos - 1; i >= 0; i--) { + if (histogram[i] > histogram[i + 1]) { + break; + } + } + return i; + } + static #getGrayPixels(bitmap) { + const originalBitmap = bitmap; + const { + width, + height + } = bitmap; + const { + maxDim + } = this.#PARAMETERS; + let newWidth = width; + let newHeight = height; + if (width > maxDim || height > maxDim) { + let prevWidth = width; + let prevHeight = height; + let steps = Math.log2(Math.max(width, height) / maxDim); + const isteps = Math.floor(steps); + steps = steps === isteps ? isteps - 1 : isteps; + for (let i = 0; i < steps; i++) { + newWidth = prevWidth; + newHeight = prevHeight; + if (newWidth > maxDim) { + newWidth = Math.ceil(newWidth / 2); + } + if (newHeight > maxDim) { + newHeight = Math.ceil(newHeight / 2); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + prevWidth = newWidth; + prevHeight = newHeight; + if (bitmap !== originalBitmap) { + bitmap.close(); + } + bitmap = offscreen.transferToImageBitmap(); + } + const ratio = Math.min(maxDim / newWidth, maxDim / newHeight); + newWidth = Math.round(newWidth * ratio); + newHeight = Math.round(newHeight * ratio); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d", { + willReadFrequently: true + }); + ctx.filter = "grayscale(1)"; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, newWidth, newHeight); + const grayImage = ctx.getImageData(0, 0, newWidth, newHeight).data; + const uint8Buf = this.#toUint8(grayImage); + return [uint8Buf, newWidth, newHeight]; + } + static extractContoursFromText(text, { + fontFamily, + fontStyle, + fontWeight + }, pageWidth, pageHeight, rotation, innerMargin) { + let canvas = new OffscreenCanvas(1, 1); + let ctx = canvas.getContext("2d", { + alpha: false + }); + const fontSize = 200; + const font = ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`; + const { + actualBoundingBoxLeft, + actualBoundingBoxRight, + actualBoundingBoxAscent, + actualBoundingBoxDescent, + fontBoundingBoxAscent, + fontBoundingBoxDescent, + width + } = ctx.measureText(text); + const SCALE = 1.5; + const canvasWidth = Math.ceil(Math.max(Math.abs(actualBoundingBoxLeft) + Math.abs(actualBoundingBoxRight) || 0, width) * SCALE); + const canvasHeight = Math.ceil(Math.max(Math.abs(actualBoundingBoxAscent) + Math.abs(actualBoundingBoxDescent) || fontSize, Math.abs(fontBoundingBoxAscent) + Math.abs(fontBoundingBoxDescent) || fontSize) * SCALE); + canvas = new OffscreenCanvas(canvasWidth, canvasHeight); + ctx = canvas.getContext("2d", { + alpha: true, + willReadFrequently: true + }); + ctx.font = font; + ctx.filter = "grayscale(1)"; + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, canvasWidth, canvasHeight); + ctx.fillStyle = "black"; + ctx.fillText(text, canvasWidth * (SCALE - 1) / 2, canvasHeight * (3 - SCALE) / 2); + const uint8Buf = this.#toUint8(ctx.getImageData(0, 0, canvasWidth, canvasHeight).data); + const histogram = this.#getHistogram(uint8Buf); + const threshold = this.#guessThreshold(histogram); + const contourList = this.#findContours(uint8Buf, canvasWidth, canvasHeight, threshold); + return this.processDrawnLines({ + lines: { + curves: contourList, + width: canvasWidth, + height: canvasHeight + }, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth: true, + areContours: true + }); + } + static process(bitmap, pageWidth, pageHeight, rotation, innerMargin) { + const [uint8Buf, width, height] = this.#getGrayPixels(bitmap); + const [buffer, histogram] = this.#bilateralFilter(uint8Buf, width, height, Math.hypot(width, height) * this.#PARAMETERS.sigmaSFactor, this.#PARAMETERS.sigmaR, this.#PARAMETERS.kernelSize); + const threshold = this.#guessThreshold(histogram); + const contourList = this.#findContours(buffer, width, height, threshold); + return this.processDrawnLines({ + lines: { + curves: contourList, + width, + height + }, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth: true, + areContours: true + }); + } + static processDrawnLines({ + lines, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth, + areContours + }) { + if (rotation % 180 !== 0) { + [pageWidth, pageHeight] = [pageHeight, pageWidth]; + } + const { + curves, + width, + height + } = lines; + const thickness = lines.thickness ?? 0; + const linesAndPoints = []; + const ratio = Math.min(pageWidth / width, pageHeight / height); + const xScale = ratio / pageWidth; + const yScale = ratio / pageHeight; + const newCurves = []; + for (const { + points + } of curves) { + const reducedPoints = mustSmooth ? this.#douglasPeucker(points) : points; + if (!reducedPoints) { + continue; + } + newCurves.push(reducedPoints); + const len = reducedPoints.length; + const newPoints = new Float32Array(len); + const line = new Float32Array(3 * (len === 2 ? 2 : len - 2)); + linesAndPoints.push({ + line, + points: newPoints + }); + if (len === 2) { + newPoints[0] = reducedPoints[0] * xScale; + newPoints[1] = reducedPoints[1] * yScale; + line.set([NaN, NaN, NaN, NaN, newPoints[0], newPoints[1]], 0); + continue; + } + let [x1, y1, x2, y2] = reducedPoints; + x1 *= xScale; + y1 *= yScale; + x2 *= xScale; + y2 *= yScale; + newPoints.set([x1, y1, x2, y2], 0); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = newPoints[i] = reducedPoints[i] * xScale; + const y = newPoints[i + 1] = reducedPoints[i + 1] * yScale; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; + } + } + if (linesAndPoints.length === 0) { + return null; + } + const outline = areContours ? new ContourDrawOutline() : new InkDrawOutline(); + outline.build(linesAndPoints, pageWidth, pageHeight, 1, rotation, areContours ? 0 : thickness, innerMargin); + return { + outline, + newCurves, + areContours, + thickness, + width, + height + }; + } + static async compressSignature({ + outlines, + areContours, + thickness, + width, + height + }) { + let minDiff = Infinity; + let maxDiff = -Infinity; + let outlinesLength = 0; + for (const points of outlines) { + outlinesLength += points.length; + for (let i = 2, ii = points.length; i < ii; i++) { + const dx = points[i] - points[i - 2]; + minDiff = Math.min(minDiff, dx); + maxDiff = Math.max(maxDiff, dx); + } + } + let bufferType; + if (minDiff >= -128 && maxDiff <= 127) { + bufferType = Int8Array; + } else if (minDiff >= -32768 && maxDiff <= 32767) { + bufferType = Int16Array; + } else { + bufferType = Int32Array; + } + const len = outlines.length; + const headerLength = BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * len; + const header = new Uint32Array(headerLength); + let offset = 0; + header[offset++] = headerLength * Uint32Array.BYTES_PER_ELEMENT + (outlinesLength - 2 * len) * bufferType.BYTES_PER_ELEMENT; + header[offset++] = 0; + header[offset++] = width; + header[offset++] = height; + header[offset++] = areContours ? 0 : 1; + header[offset++] = Math.max(0, Math.floor(thickness ?? 0)); + header[offset++] = len; + header[offset++] = bufferType.BYTES_PER_ELEMENT; + for (const points of outlines) { + header[offset++] = points.length - 2; + header[offset++] = points[0]; + header[offset++] = points[1]; + } + const cs = new CompressionStream("deflate-raw"); + const writer = cs.writable.getWriter(); + await writer.ready; + writer.write(header); + const BufferCtor = bufferType.prototype.constructor; + for (const points of outlines) { + const diffs = new BufferCtor(points.length - 2); + for (let i = 2, ii = points.length; i < ii; i++) { + diffs[i - 2] = points[i] - points[i - 2]; + } + writer.write(diffs); + } + writer.close(); + const buf = await new Response(cs.readable).arrayBuffer(); + const bytes = new Uint8Array(buf); + return toBase64Util(bytes); + } + static async decompressSignature(signatureData) { + try { + const bytes = fromBase64Util(signatureData); + const { + readable, + writable + } = new DecompressionStream("deflate-raw"); + const writer = writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + let data = null; + let offset = 0; + for await (const chunk of readable) { + data ||= new Uint8Array(new Uint32Array(chunk.buffer, 0, 4)[0]); + data.set(chunk, offset); + offset += chunk.length; + } + const header = new Uint32Array(data.buffer, 0, data.length >> 2); + const version = header[1]; + if (version !== 0) { + throw new Error(`Invalid version: ${version}`); + } + const width = header[2]; + const height = header[3]; + const areContours = header[4] === 0; + const thickness = header[5]; + const numberOfDrawings = header[6]; + const bufferType = header[7]; + const outlines = []; + const diffsOffset = (BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * numberOfDrawings) * Uint32Array.BYTES_PER_ELEMENT; + let diffs; + switch (bufferType) { + case Int8Array.BYTES_PER_ELEMENT: + diffs = new Int8Array(data.buffer, diffsOffset); + break; + case Int16Array.BYTES_PER_ELEMENT: + diffs = new Int16Array(data.buffer, diffsOffset); + break; + case Int32Array.BYTES_PER_ELEMENT: + diffs = new Int32Array(data.buffer, diffsOffset); + break; + } + offset = 0; + for (let i = 0; i < numberOfDrawings; i++) { + const len = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH]; + const points = new Float32Array(len + 2); + outlines.push(points); + for (let j = 0; j < POINTS_PROPERTIES_NUMBER - 1; j++) { + points[j] = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH + j + 1]; + } + for (let j = 0; j < len; j++) { + points[j + 2] = points[j] + diffs[offset++]; + } + } + return { + areContours, + thickness, + outlines, + width, + height + }; + } catch (e) { + warn(`decompressSignature: ${e}`); + return null; + } + } +} + +;// ./src/display/editor/signature.js + + + + + + + +class SignatureOptions extends DrawingOptions { + constructor() { + super(); + super.updateProperties({ + fill: AnnotationEditor._defaultLineColor, + "stroke-width": 0 + }); + } + clone() { + const clone = new SignatureOptions(); + clone.updateAll(this); + return clone; + } +} +class DrawnSignatureOptions extends InkDrawingOptions { + constructor(viewerParameters) { + super(viewerParameters); + super.updateProperties({ + stroke: AnnotationEditor._defaultLineColor, + "stroke-width": 1 + }); + } + clone() { + const clone = new DrawnSignatureOptions(this._viewParameters); + clone.updateAll(this); + return clone; + } +} +class SignatureEditor extends DrawingEditor { + #isExtracted = false; + #description = null; + #signatureData = null; + #signatureUUID = null; + static _type = "signature"; + static _editorType = AnnotationEditorType.SIGNATURE; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + mustBeCommitted: true, + name: "signatureEditor" + }); + this._willKeepAspectRatio = true; + this.#signatureData = params.signatureData || null; + this.#description = null; + this.defaultL10nId = "pdfjs-editor-signature-editor1"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new SignatureOptions(); + this._defaultDrawnSignatureOptions = new DrawnSignatureOptions(uiManager.viewParameters); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; + } + static get supportMultipleDrawings() { + return false; + } + static get typesMap() { + return shadow(this, "typesMap", new Map()); + } + static get isDrawer() { + return false; + } + get telemetryFinalData() { + return { + type: "signature", + hasDescription: !!this.#description + }; + } + static computeTelemetryFinalData(data) { + const hasDescriptionStats = data.get("hasDescription"); + return { + hasAltText: hasDescriptionStats.get(true) ?? 0, + hasNoAltText: hasDescriptionStats.get(false) ?? 0 + }; + } + get isResizable() { + return true; + } + onScaleChanging() { + if (this._drawId === null) { + return; + } + super.onScaleChanging(); + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + const { + _isCopy + } = this; + if (_isCopy) { + this._isCopy = false; + baseX = this.x; + baseY = this.y; + } + super.render(); + if (this._drawId === null) { + if (this.#signatureData) { + const { + lines, + mustSmooth, + areContours, + description, + uuid, + heightInPage + } = this.#signatureData; + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + const outline = SignatureExtractor.processDrawnLines({ + lines, + pageWidth, + pageHeight, + rotation, + innerMargin: SignatureEditor._INNER_MARGIN, + mustSmooth, + areContours + }); + this.addSignature(outline, heightInPage, description, uuid); + } else { + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description: "" + })); + this.div.hidden = true; + this._uiManager.getSignature(this); + } + } + if (_isCopy) { + this._isCopy = true; + this._moveAfterPaste(baseX, baseY); + } + return this.div; + } + setUuid(uuid) { + this.#signatureUUID = uuid; + this.addEditToolbar(); + } + getUuid() { + return this.#signatureUUID; + } + get description() { + return this.#description; + } + set description(description) { + this.#description = description; + super.addEditToolbar().then(toolbar => { + toolbar?.updateEditSignatureButton(description); + }); + } + getSignaturePreview() { + const { + newCurves, + areContours, + thickness, + width, + height + } = this.#signatureData; + const maxDim = Math.max(width, height); + const outlineData = SignatureExtractor.processDrawnLines({ + lines: { + curves: newCurves.map(points => ({ + points + })), + thickness, + width, + height + }, + pageWidth: maxDim, + pageHeight: maxDim, + rotation: 0, + innerMargin: 0, + mustSmooth: false, + areContours + }); + return { + areContours, + outline: outlineData.outline + }; + } + async addEditToolbar() { + const toolbar = await super.addEditToolbar(); + if (!toolbar) { + return null; + } + if (this._uiManager.signatureManager && this.#description !== null) { + await toolbar.addEditSignatureButton(this._uiManager.signatureManager, this.#signatureUUID, this.#description); + toolbar.show(); + } + return toolbar; + } + addSignature(data, heightInPage, description, uuid) { + const { + x: savedX, + y: savedY + } = this; + const { + outline + } = this.#signatureData = data; + this.#isExtracted = outline instanceof ContourDrawOutline; + this.#description = description; + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description + })); + let drawingOptions; + if (this.#isExtracted) { + drawingOptions = SignatureEditor.getDefaultDrawingOptions(); + } else { + drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone(); + drawingOptions.updateProperties({ + "stroke-width": outline.thickness + }); + } + this._addOutlines({ + drawOutlines: outline, + drawingOptions + }); + const [parentWidth, parentHeight] = this.parentDimensions; + const [, pageHeight] = this.pageDimensions; + let newHeight = heightInPage / pageHeight; + newHeight = newHeight >= 1 ? 0.5 : newHeight; + this.width *= newHeight / this.height; + if (this.width >= 1) { + newHeight *= 0.9 / this.width; + this.width = 0.9; + } + this.height = newHeight; + this.setDims(parentWidth * this.width, parentHeight * this.height); + this.x = savedX; + this.y = savedY; + this.center(); + this._onResized(); + this.onScaleChanging(); + this.rotate(); + this._uiManager.addToAnnotationStorage(this); + this.setUuid(uuid); + this._reportTelemetry({ + action: "pdfjs.signature.inserted", + data: { + hasBeenSaved: !!uuid, + hasDescription: !!description + } + }); + this.div.hidden = false; + } + getFromImage(bitmap) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.process(bitmap, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN); + } + getFromText(text, fontInfo) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.extractContoursFromText(text, fontInfo, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN); + } + getDrawnSignature(curves) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.processDrawnLines({ + lines: curves, + pageWidth, + pageHeight, + rotation, + innerMargin: SignatureEditor._INNER_MARGIN, + mustSmooth: false, + areContours: false + }); + } + createDrawingOptions({ + areContours, + thickness + }) { + if (areContours) { + this._drawingOptions = SignatureEditor.getDefaultDrawingOptions(); + } else { + this._drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone(); + this._drawingOptions.updateProperties({ + "stroke-width": thickness + }); + } + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + const { + lines, + points, + rect + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + "stroke-width": thickness + } + } = this; + const serialized = { + annotationType: AnnotationEditorType.SIGNATURE, + isSignature: true, + areContours: this.#isExtracted, + color: [0, 0, 0], + thickness: this.#isExtracted ? 0 : thickness, + pageIndex: this.pageIndex, + rect, + rotation: this.rotation, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + serialized.paths = { + lines, + points + }; + serialized.uuid = this.#signatureUUID; + serialized.isCopy = true; + } else { + serialized.lines = lines; + } + if (this.#description) { + serialized.accessibilityData = { + type: "Figure", + alt: this.#description + }; + } + return serialized; + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + if (data.areContours) { + return ContourDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + static async deserialize(data, parent, uiManager) { + const editor = await super.deserialize(data, parent, uiManager); + editor.#isExtracted = data.areContours; + editor.#description = data.accessibilityData?.alt || ""; + editor.#signatureUUID = data.uuid; + return editor; + } +} + +;// ./src/display/editor/stamp.js + + + + +class StampEditor extends AnnotationEditor { + #bitmap = null; + #bitmapId = null; + #bitmapPromise = null; + #bitmapUrl = null; + #bitmapFile = null; + #bitmapFileName = ""; + #canvas = null; + #missingCanvas = false; + #resizeTimeoutId = null; + #isSvg = false; + #hasBeenAddedInUndoStack = false; + static _type = "stamp"; + static _editorType = AnnotationEditorType.STAMP; + constructor(params) { + super({ + ...params, + name: "stampEditor" + }); + this.#bitmapUrl = params.bitmapUrl; + this.#bitmapFile = params.bitmapFile; + this.defaultL10nId = "pdfjs-editor-stamp-editor"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + } + static isHandlingMimeForPasting(mime) { + return SupportedImageMimeTypes.includes(mime); + } + static paste(item, parent) { + parent.pasteEditor(AnnotationEditorType.STAMP, { + bitmapFile: item.getAsFile() + }); + } + altTextFinish() { + if (this._uiManager.useNewAltTextFlow) { + this.div.hidden = false; + } + super.altTextFinish(); + } + get telemetryFinalData() { + return { + type: "stamp", + hasAltText: !!this.altTextData?.altText + }; + } + static computeTelemetryFinalData(data) { + const hasAltTextStats = data.get("hasAltText"); + return { + hasAltText: hasAltTextStats.get(true) ?? 0, + hasNoAltText: hasAltTextStats.get(false) ?? 0 + }; + } + #getBitmapFetched(data, fromId = false) { + if (!data) { + this.remove(); + return; + } + this.#bitmap = data.bitmap; + if (!fromId) { + this.#bitmapId = data.id; + this.#isSvg = data.isSvg; + } + if (data.file) { + this.#bitmapFileName = data.file.name; + } + this.#createCanvas(); + } + #getBitmapDone() { + this.#bitmapPromise = null; + this._uiManager.enableWaiting(false); + if (!this.#canvas) { + return; + } + if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this._editToolbar.hide(); + this._uiManager.editAltText(this, true); + return; + } + if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: false, + alt_text_type: "empty" + } + }); + try { + this.mlGuessAltText(); + } catch {} + } + this.div.focus(); + } + async mlGuessAltText(imageData = null, updateAltTextData = true) { + if (this.hasAltTextData()) { + return null; + } + const { + mlManager + } = this._uiManager; + if (!mlManager) { + throw new Error("No ML."); + } + if (!(await mlManager.isEnabledFor("altText"))) { + throw new Error("ML isn't enabled for alt text."); + } + const { + data, + width, + height + } = imageData || this.copyCanvas(null, null, true).imageData; + const response = await mlManager.guess({ + name: "altText", + request: { + data, + width, + height, + channels: data.length / (width * height) + } + }); + if (!response) { + throw new Error("No response from the AI service."); + } + if (response.error) { + throw new Error("Error from the AI service."); + } + if (response.cancel) { + return null; + } + if (!response.output) { + throw new Error("No valid response from the AI service."); + } + const altText = response.output; + await this.setGuessedAltText(altText); + if (updateAltTextData && !this.hasAltTextData()) { + this.altTextData = { + alt: altText, + decorative: false + }; + } + return altText; + } + #getBitmap() { + if (this.#bitmapId) { + this._uiManager.enableWaiting(true); + this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapUrl) { + const url = this.#bitmapUrl; + this.#bitmapUrl = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapFile) { + const file = this.#bitmapFile; + this.#bitmapFile = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + const input = document.createElement("input"); + input.type = "file"; + input.accept = SupportedImageMimeTypes.join(","); + const signal = this._uiManager._signal; + this.#bitmapPromise = new Promise(resolve => { + input.addEventListener("change", async () => { + if (!input.files || input.files.length === 0) { + this.remove(); + } else { + this._uiManager.enableWaiting(true); + const data = await this._uiManager.imageManager.getFromFile(input.files[0]); + this._reportTelemetry({ + action: "pdfjs.image.image_selected", + data: { + alt_text_modal: this._uiManager.useNewAltTextFlow + } + }); + this.#getBitmapFetched(data); + } + resolve(); + }, { + signal + }); + input.addEventListener("cancel", () => { + this.remove(); + resolve(); + }, { + signal + }); + }).finally(() => this.#getBitmapDone()); + input.click(); + } + remove() { + if (this.#bitmapId) { + this.#bitmap = null; + this._uiManager.imageManager.deleteId(this.#bitmapId); + this.#canvas?.remove(); + this.#canvas = null; + if (this.#resizeTimeoutId) { + clearTimeout(this.#resizeTimeoutId); + this.#resizeTimeoutId = null; + } + } + super.remove(); + } + rebuild() { + if (!this.parent) { + if (this.#bitmapId) { + this.#getBitmap(); + } + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (this.#bitmapId && this.#canvas === null) { + this.#getBitmap(); + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + onceAdded(focus) { + this._isDraggable = true; + if (focus) { + this.div.focus(); + } + } + isEmpty() { + return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId || this.#missingCanvas); + } + get isResizable() { + return true; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.div.hidden = true; + this.addAltTextButton(); + if (!this.#missingCanvas) { + if (this.#bitmap) { + this.#createCanvas(); + } else { + this.#getBitmap(); + } + } + if (this._isCopy) { + this._moveAfterPaste(baseX, baseY); + } + this._uiManager.addShouldRescale(this); + return this.div; + } + setCanvas(annotationElementId, canvas) { + const { + id: bitmapId, + bitmap + } = this._uiManager.imageManager.getFromCanvas(annotationElementId, canvas); + canvas.remove(); + if (bitmapId && this._uiManager.imageManager.isValidId(bitmapId)) { + this.#bitmapId = bitmapId; + if (bitmap) { + this.#bitmap = bitmap; + } + this.#missingCanvas = false; + this.#createCanvas(); + } + } + _onResized() { + this.onScaleChanging(); + } + onScaleChanging() { + if (!this.parent) { + return; + } + if (this.#resizeTimeoutId !== null) { + clearTimeout(this.#resizeTimeoutId); + } + const TIME_TO_WAIT = 200; + this.#resizeTimeoutId = setTimeout(() => { + this.#resizeTimeoutId = null; + this.#drawBitmap(); + }, TIME_TO_WAIT); + } + #createCanvas() { + const { + div + } = this; + let { + width, + height + } = this.#bitmap; + const [pageWidth, pageHeight] = this.pageDimensions; + const MAX_RATIO = 0.75; + if (this.width) { + width = this.width * pageWidth; + height = this.height * pageHeight; + } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) { + const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height); + width *= factor; + height *= factor; + } + const [parentWidth, parentHeight] = this.parentDimensions; + this.setDims(width * parentWidth / pageWidth, height * parentHeight / pageHeight); + this._uiManager.enableWaiting(false); + const canvas = this.#canvas = document.createElement("canvas"); + canvas.setAttribute("role", "img"); + this.addContainer(canvas); + this.width = width / pageWidth; + this.height = height / pageHeight; + if (this._initialOptions?.isCentered) { + this.center(); + } else { + this.fixAndSetPosition(); + } + this._initialOptions = null; + if (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) { + div.hidden = false; + } + this.#drawBitmap(); + if (!this.#hasBeenAddedInUndoStack) { + this.parent.addUndoableEditor(this); + this.#hasBeenAddedInUndoStack = true; + } + this._reportTelemetry({ + action: "inserted_image" + }); + if (this.#bitmapFileName) { + this.div.setAttribute("aria-description", this.#bitmapFileName); + } + } + copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) { + if (!maxDataDimension) { + maxDataDimension = 224; + } + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + const outputScale = new OutputScale(); + let bitmap = this.#bitmap; + let width = bitmapWidth, + height = bitmapHeight; + let canvas = null; + if (maxPreviewDimension) { + if (bitmapWidth > maxPreviewDimension || bitmapHeight > maxPreviewDimension) { + const ratio = Math.min(maxPreviewDimension / bitmapWidth, maxPreviewDimension / bitmapHeight); + width = Math.floor(bitmapWidth * ratio); + height = Math.floor(bitmapHeight * ratio); + } + canvas = document.createElement("canvas"); + const scaledWidth = canvas.width = Math.ceil(width * outputScale.sx); + const scaledHeight = canvas.height = Math.ceil(height * outputScale.sy); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(scaledWidth, scaledHeight); + } + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + let white = "white", + black = "#cfcfd8"; + if (this._uiManager.hcmFilter !== "none") { + black = "black"; + } else if (window.matchMedia?.("(prefers-color-scheme: dark)").matches) { + white = "#8f8f9d"; + black = "#42414d"; + } + const boxDim = 15; + const boxDimWidth = boxDim * outputScale.sx; + const boxDimHeight = boxDim * outputScale.sy; + const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2); + const patternCtx = pattern.getContext("2d"); + patternCtx.fillStyle = white; + patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2); + patternCtx.fillStyle = black; + patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight); + patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight); + ctx.fillStyle = ctx.createPattern(pattern, "repeat"); + ctx.fillRect(0, 0, scaledWidth, scaledHeight); + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + let imageData = null; + if (createImageData) { + let dataWidth, dataHeight; + if (outputScale.symmetric && bitmap.width < maxDataDimension && bitmap.height < maxDataDimension) { + dataWidth = bitmap.width; + dataHeight = bitmap.height; + } else { + bitmap = this.#bitmap; + if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) { + const ratio = Math.min(maxDataDimension / bitmapWidth, maxDataDimension / bitmapHeight); + dataWidth = Math.floor(bitmapWidth * ratio); + dataHeight = Math.floor(bitmapHeight * ratio); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(dataWidth, dataHeight); + } + } + } + const offscreen = new OffscreenCanvas(dataWidth, dataHeight); + const offscreenCtx = offscreen.getContext("2d", { + willReadFrequently: true + }); + offscreenCtx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, dataWidth, dataHeight); + imageData = { + width: dataWidth, + height: dataHeight, + data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data + }; + } + return { + canvas, + width, + height, + imageData + }; + } + #scaleBitmap(width, height) { + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + let newWidth = bitmapWidth; + let newHeight = bitmapHeight; + let bitmap = this.#bitmap; + while (newWidth > 2 * width || newHeight > 2 * height) { + const prevWidth = newWidth; + const prevHeight = newHeight; + if (newWidth > 2 * width) { + newWidth = newWidth >= 16384 ? Math.floor(newWidth / 2) - 1 : Math.ceil(newWidth / 2); + } + if (newHeight > 2 * height) { + newHeight = newHeight >= 16384 ? Math.floor(newHeight / 2) - 1 : Math.ceil(newHeight / 2); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap = offscreen.transferToImageBitmap(); + } + return bitmap; + } + #drawBitmap() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + width, + height + } = this; + const outputScale = new OutputScale(); + const scaledWidth = Math.ceil(width * parentWidth * outputScale.sx); + const scaledHeight = Math.ceil(height * parentHeight * outputScale.sy); + const canvas = this.#canvas; + if (!canvas || canvas.width === scaledWidth && canvas.height === scaledHeight) { + return; + } + canvas.width = scaledWidth; + canvas.height = scaledHeight; + const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(scaledWidth, scaledHeight); + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + #serializeBitmap(toUrl) { + if (toUrl) { + if (this.#isSvg) { + const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId); + if (url) { + return url; + } + } + const canvas = document.createElement("canvas"); + ({ + width: canvas.width, + height: canvas.height + } = this.#bitmap); + const ctx = canvas.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0); + return canvas.toDataURL(); + } + if (this.#isSvg) { + const [pageWidth, pageHeight] = this.pageDimensions; + const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS); + const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS); + const offscreen = new OffscreenCanvas(width, height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height); + return offscreen.transferToImageBitmap(); + } + return structuredClone(this.#bitmap); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + let missingCanvas = false; + if (data instanceof StampAnnotationElement) { + const { + data: { + rect, + rotation, + id, + structParent, + popupRef + }, + container, + parent: { + page: { + pageNumber + } + }, + canvas + } = data; + let bitmapId, bitmap; + if (canvas) { + delete data.canvas; + ({ + id: bitmapId, + bitmap + } = uiManager.imageManager.getFromCanvas(container.id, canvas)); + canvas.remove(); + } else { + missingCanvas = true; + data._hasNoCanvas = true; + } + const altText = (await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`))?.get("aria-label") || ""; + initialData = data = { + annotationType: AnnotationEditorType.STAMP, + bitmapId, + bitmap, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + id, + deleted: false, + accessibilityData: { + decorative: false, + altText + }, + isSvg: false, + structParent, + popupRef + }; + } + const editor = await super.deserialize(data, parent, uiManager); + const { + rect, + bitmap, + bitmapUrl, + bitmapId, + isSvg, + accessibilityData + } = data; + if (missingCanvas) { + uiManager.addMissingCanvas(data.id, editor); + editor.#missingCanvas = true; + } else if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) { + editor.#bitmapId = bitmapId; + if (bitmap) { + editor.#bitmap = bitmap; + } + } else { + editor.#bitmapUrl = bitmapUrl; + } + editor.#isSvg = isSvg; + const [parentWidth, parentHeight] = editor.pageDimensions; + editor.width = (rect[2] - rect[0]) / parentWidth; + editor.height = (rect[3] - rect[1]) / parentHeight; + editor.annotationElementId = data.id || null; + if (accessibilityData) { + editor.altTextData = accessibilityData; + } + editor._initialData = initialData; + editor.#hasBeenAddedInUndoStack = !!initialData; + return editor; + } + serialize(isForCopying = false, context = null) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const serialized = { + annotationType: AnnotationEditorType.STAMP, + bitmapId: this.#bitmapId, + pageIndex: this.pageIndex, + rect: this.getRect(0, 0), + rotation: this.rotation, + isSvg: this.#isSvg, + structTreeParentId: this._structTreeParentId + }; + if (isForCopying) { + serialized.bitmapUrl = this.#serializeBitmap(true); + serialized.accessibilityData = this.serializeAltText(true); + serialized.isCopy = true; + return serialized; + } + const { + decorative, + altText + } = this.serializeAltText(false); + if (!decorative && altText) { + serialized.accessibilityData = { + type: "Figure", + alt: altText + }; + } + if (this.annotationElementId) { + const changes = this.#hasElementChanged(serialized); + if (changes.isSame) { + return null; + } + if (changes.isSameAltText) { + delete serialized.accessibilityData; + } else { + serialized.accessibilityData.structParent = this._initialData.structParent ?? -1; + } + } + serialized.id = this.annotationElementId; + if (context === null) { + return serialized; + } + context.stamps ||= new Map(); + const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null; + if (!context.stamps.has(this.#bitmapId)) { + context.stamps.set(this.#bitmapId, { + area, + serialized + }); + serialized.bitmap = this.#serializeBitmap(false); + } else if (this.#isSvg) { + const prevData = context.stamps.get(this.#bitmapId); + if (area > prevData.area) { + prevData.area = area; + prevData.serialized.bitmap.close(); + prevData.serialized.bitmap = this.#serializeBitmap(false); + } + } + return serialized; + } + #hasElementChanged(serialized) { + const { + pageIndex, + accessibilityData: { + altText + } + } = this._initialData; + const isSamePageIndex = serialized.pageIndex === pageIndex; + const isSameAltText = (serialized.accessibilityData?.alt || "") === altText; + return { + isSame: !this._hasBeenMoved && !this._hasBeenResized && isSamePageIndex && isSameAltText, + isSameAltText + }; + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getRect(0, 0) + }); + return null; + } +} + +;// ./src/display/editor/annotation_editor_layer.js + + + + + + + + +class AnnotationEditorLayer { + #accessibilityManager; + #allowClick = false; + #annotationLayer = null; + #clickAC = null; + #editorFocusTimeoutId = null; + #editors = new Map(); + #hadPointerDown = false; + #isDisabling = false; + #isEnabling = false; + #drawingAC = null; + #focusedElement = null; + #textLayer = null; + #textSelectionAC = null; + #uiManager; + static _initialized = false; + static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor, SignatureEditor].map(type => [type._editorType, type])); + constructor({ + uiManager, + pageIndex, + div, + structTreeLayer, + accessibilityManager, + annotationLayer, + drawLayer, + textLayer, + viewport, + l10n + }) { + const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()]; + if (!AnnotationEditorLayer._initialized) { + AnnotationEditorLayer._initialized = true; + for (const editorType of editorTypes) { + editorType.initialize(l10n, uiManager); + } + } + uiManager.registerEditorTypes(editorTypes); + this.#uiManager = uiManager; + this.pageIndex = pageIndex; + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationLayer = annotationLayer; + this.viewport = viewport; + this.#textLayer = textLayer; + this.drawLayer = drawLayer; + this._structTree = structTreeLayer; + this.#uiManager.addLayer(this); + } + get isEmpty() { + return this.#editors.size === 0; + } + get isInvisible() { + return this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE; + } + updateToolbar(mode) { + this.#uiManager.updateToolbar(mode); + } + updateMode(mode = this.#uiManager.getMode()) { + this.#cleanup(); + switch (mode) { + case AnnotationEditorType.NONE: + this.disableTextSelection(); + this.togglePointerEvents(false); + this.toggleAnnotationLayerPointerEvents(true); + this.disableClick(); + return; + case AnnotationEditorType.INK: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + break; + case AnnotationEditorType.HIGHLIGHT: + this.enableTextSelection(); + this.togglePointerEvents(false); + this.disableClick(); + break; + default: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + } + this.toggleAnnotationLayerPointerEvents(false); + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType); + } + this.div.hidden = false; + } + hasTextLayer(textLayer) { + return textLayer === this.#textLayer?.div; + } + setEditingState(isEditing) { + this.#uiManager.setEditingState(isEditing); + } + addCommands(params) { + this.#uiManager.addCommands(params); + } + cleanUndoStack(type) { + this.#uiManager.cleanUndoStack(type); + } + toggleDrawing(enabled = false) { + this.div.classList.toggle("drawing", !enabled); + } + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + toggleAnnotationLayerPointerEvents(enabled = false) { + this.#annotationLayer?.div.classList.toggle("disabled", !enabled); + } + async enable() { + this.#isEnabling = true; + this.div.tabIndex = 0; + this.togglePointerEvents(true); + const annotationElementIds = new Set(); + for (const editor of this.#editors.values()) { + editor.enableEditing(); + editor.show(true); + if (editor.annotationElementId) { + this.#uiManager.removeChangedExistingAnnotation(editor); + annotationElementIds.add(editor.annotationElementId); + } + } + if (!this.#annotationLayer) { + this.#isEnabling = false; + return; + } + const editables = this.#annotationLayer.getEditableAnnotations(); + for (const editable of editables) { + editable.hide(); + if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) { + continue; + } + if (annotationElementIds.has(editable.data.id)) { + continue; + } + const editor = await this.deserialize(editable); + if (!editor) { + continue; + } + this.addOrRebuild(editor); + editor.enableEditing(); + } + this.#isEnabling = false; + } + disable() { + this.#isDisabling = true; + this.div.tabIndex = -1; + this.togglePointerEvents(false); + const changedAnnotations = new Map(); + const resetAnnotations = new Map(); + for (const editor of this.#editors.values()) { + editor.disableEditing(); + if (!editor.annotationElementId) { + continue; + } + if (editor.serialize() !== null) { + changedAnnotations.set(editor.annotationElementId, editor); + continue; + } else { + resetAnnotations.set(editor.annotationElementId, editor); + } + this.getEditableAnnotation(editor.annotationElementId)?.show(); + editor.remove(); + } + if (this.#annotationLayer) { + const editables = this.#annotationLayer.getEditableAnnotations(); + for (const editable of editables) { + const { + id + } = editable.data; + if (this.#uiManager.isDeletedAnnotationElement(id)) { + continue; + } + let editor = resetAnnotations.get(id); + if (editor) { + editor.resetAnnotationElement(editable); + editor.show(false); + editable.show(); + continue; + } + editor = changedAnnotations.get(id); + if (editor) { + this.#uiManager.addChangedExistingAnnotation(editor); + if (editor.renderAnnotationElement(editable)) { + editor.show(false); + } + } + editable.show(); + } + } + this.#cleanup(); + if (this.isEmpty) { + this.div.hidden = true; + } + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.remove(`${editorType._type}Editing`); + } + this.disableTextSelection(); + this.toggleAnnotationLayerPointerEvents(true); + this.#isDisabling = false; + } + getEditableAnnotation(id) { + return this.#annotationLayer?.getEditableAnnotation(id) || null; + } + setActiveEditor(editor) { + const currentActive = this.#uiManager.getActive(); + if (currentActive === editor) { + return; + } + this.#uiManager.setActiveEditor(editor); + } + enableTextSelection() { + this.div.tabIndex = -1; + if (this.#textLayer?.div && !this.#textSelectionAC) { + this.#textSelectionAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#textSelectionAC); + this.#textLayer.div.addEventListener("pointerdown", this.#textLayerPointerDown.bind(this), { + signal + }); + this.#textLayer.div.classList.add("highlighting"); + } + } + disableTextSelection() { + this.div.tabIndex = 0; + if (this.#textLayer?.div && this.#textSelectionAC) { + this.#textSelectionAC.abort(); + this.#textSelectionAC = null; + this.#textLayer.div.classList.remove("highlighting"); + } + } + #textLayerPointerDown(event) { + this.#uiManager.unselectAll(); + const { + target + } = event; + if (target === this.#textLayer.div || (target.getAttribute("role") === "img" || target.classList.contains("endOfContent")) && this.#textLayer.div.contains(target)) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#uiManager.showAllEditors("highlight", true, true); + this.#textLayer.div.classList.add("free"); + this.toggleDrawing(); + HighlightEditor.startHighlighting(this, this.#uiManager.direction === "ltr", { + target: this.#textLayer.div, + x: event.x, + y: event.y + }); + this.#textLayer.div.addEventListener("pointerup", () => { + this.#textLayer.div.classList.remove("free"); + this.toggleDrawing(true); + }, { + once: true, + signal: this.#uiManager._signal + }); + event.preventDefault(); + } + } + enableClick() { + if (this.#clickAC) { + return; + } + this.#clickAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#clickAC); + this.div.addEventListener("pointerdown", this.pointerdown.bind(this), { + signal + }); + const pointerup = this.pointerup.bind(this); + this.div.addEventListener("pointerup", pointerup, { + signal + }); + this.div.addEventListener("pointercancel", pointerup, { + signal + }); + } + disableClick() { + this.#clickAC?.abort(); + this.#clickAC = null; + } + attach(editor) { + this.#editors.set(editor.id, editor); + const { + annotationElementId + } = editor; + if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) { + this.#uiManager.removeDeletedAnnotationElement(editor); + } + } + detach(editor) { + this.#editors.delete(editor.id); + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + if (!this.#isDisabling && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor); + } + } + remove(editor) { + this.detach(editor); + this.#uiManager.removeEditor(editor); + editor.div.remove(); + editor.isAttachedToDOM = false; + } + changeParent(editor) { + if (editor.parent === this) { + return; + } + if (editor.parent && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId); + AnnotationEditor.deleteAnnotationElement(editor); + editor.annotationElementId = null; + } + this.attach(editor); + editor.parent?.detach(editor); + editor.setParent(this); + if (editor.div && editor.isAttachedToDOM) { + editor.div.remove(); + this.div.append(editor.div); + } + } + add(editor) { + if (editor.parent === this && editor.isAttachedToDOM) { + return; + } + this.changeParent(editor); + this.#uiManager.addEditor(editor); + this.attach(editor); + if (!editor.isAttachedToDOM) { + const div = editor.render(); + this.div.append(div); + editor.isAttachedToDOM = true; + } + editor.fixAndSetPosition(); + editor.onceAdded(!this.#isEnabling); + this.#uiManager.addToAnnotationStorage(editor); + editor._reportTelemetry(editor.telemetryInitialData); + } + moveEditorInDOM(editor) { + if (!editor.isAttachedToDOM) { + return; + } + const { + activeElement + } = document; + if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) { + editor._focusEventsAllowed = false; + this.#editorFocusTimeoutId = setTimeout(() => { + this.#editorFocusTimeoutId = null; + if (!editor.div.contains(document.activeElement)) { + editor.div.addEventListener("focusin", () => { + editor._focusEventsAllowed = true; + }, { + once: true, + signal: this.#uiManager._signal + }); + activeElement.focus(); + } else { + editor._focusEventsAllowed = true; + } + }, 0); + } + editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); + } + addOrRebuild(editor) { + if (editor.needsToBeRebuilt()) { + editor.parent ||= this; + editor.rebuild(); + editor.show(); + } else { + this.add(editor); + } + } + addUndoableEditor(editor) { + const cmd = () => editor._uiManager.rebuild(editor); + const undo = () => { + editor.remove(); + }; + this.addCommands({ + cmd, + undo, + mustExec: false + }); + } + getNextId() { + return this.#uiManager.getId(); + } + get #currentEditorType() { + return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode()); + } + combinedSignal(ac) { + return this.#uiManager.combinedSignal(ac); + } + #createNewEditor(params) { + const editorType = this.#currentEditorType; + return editorType ? new editorType.prototype.constructor(params) : null; + } + canCreateNewEmptyEditor() { + return this.#currentEditorType?.canCreateNewEmptyEditor(); + } + async pasteEditor(mode, params) { + this.#uiManager.updateToolbar(mode); + await this.#uiManager.updateMode(mode); + const { + offsetX, + offsetY + } = this.#getCenterPoint(); + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: offsetX, + y: offsetY, + uiManager: this.#uiManager, + isCentered: true, + ...params + }); + if (editor) { + this.add(editor); + } + } + async deserialize(data) { + return (await AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager)) || null; + } + createAndAddNewEditor(event, isCentered, data = {}) { + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: event.offsetX, + y: event.offsetY, + uiManager: this.#uiManager, + isCentered, + ...data + }); + if (editor) { + this.add(editor); + } + return editor; + } + #getCenterPoint() { + const { + x, + y, + width, + height + } = this.div.getBoundingClientRect(); + const tlX = Math.max(0, x); + const tlY = Math.max(0, y); + const brX = Math.min(window.innerWidth, x + width); + const brY = Math.min(window.innerHeight, y + height); + const centerX = (tlX + brX) / 2 - x; + const centerY = (tlY + brY) / 2 - y; + const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX]; + return { + offsetX, + offsetY + }; + } + addNewEditor(data = {}) { + this.createAndAddNewEditor(this.#getCenterPoint(), true, data); + } + setSelected(editor) { + this.#uiManager.setSelected(editor); + } + toggleSelected(editor) { + this.#uiManager.toggleSelected(editor); + } + unselect(editor) { + this.#uiManager.unselect(editor); + } + pointerup(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + if (!this.#hadPointerDown) { + return; + } + this.#hadPointerDown = false; + if (this.#currentEditorType?.isDrawer && this.#currentEditorType.supportMultipleDrawings) { + return; + } + if (!this.#allowClick) { + this.#allowClick = true; + return; + } + const currentMode = this.#uiManager.getMode(); + if (currentMode === AnnotationEditorType.STAMP || currentMode === AnnotationEditorType.SIGNATURE) { + this.#uiManager.unselectAll(); + return; + } + this.createAndAddNewEditor(event, false); + } + pointerdown(event) { + if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) { + this.enableTextSelection(); + } + if (this.#hadPointerDown) { + this.#hadPointerDown = false; + return; + } + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + this.#hadPointerDown = true; + if (this.#currentEditorType?.isDrawer) { + this.startDrawingSession(event); + return; + } + const editor = this.#uiManager.getActive(); + this.#allowClick = !editor || editor.isEmpty(); + } + startDrawingSession(event) { + this.div.focus({ + preventScroll: true + }); + if (this.#drawingAC) { + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + return; + } + this.#uiManager.setCurrentDrawingSession(this); + this.#drawingAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#drawingAC); + this.div.addEventListener("blur", ({ + relatedTarget + }) => { + if (relatedTarget && !this.div.contains(relatedTarget)) { + this.#focusedElement = null; + this.commitOrRemove(); + } + }, { + signal + }); + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + } + pause(on) { + if (on) { + const { + activeElement + } = document; + if (this.div.contains(activeElement)) { + this.#focusedElement = activeElement; + } + return; + } + if (this.#focusedElement) { + setTimeout(() => { + this.#focusedElement?.focus(); + this.#focusedElement = null; + }, 0); + } + } + endDrawingSession(isAborted = false) { + if (!this.#drawingAC) { + return null; + } + this.#uiManager.setCurrentDrawingSession(null); + this.#drawingAC.abort(); + this.#drawingAC = null; + this.#focusedElement = null; + return this.#currentEditorType.endDrawing(isAborted); + } + findNewParent(editor, x, y) { + const layer = this.#uiManager.findParent(x, y); + if (layer === null || layer === this) { + return false; + } + layer.changeParent(editor); + return true; + } + commitOrRemove() { + if (this.#drawingAC) { + this.endDrawingSession(); + return true; + } + return false; + } + onScaleChanging() { + if (!this.#drawingAC) { + return; + } + this.#currentEditorType.onScaleChangingWhenDrawing(this); + } + destroy() { + this.commitOrRemove(); + if (this.#uiManager.getActive()?.parent === this) { + this.#uiManager.commitOrRemove(); + this.#uiManager.setActiveEditor(null); + } + if (this.#editorFocusTimeoutId) { + clearTimeout(this.#editorFocusTimeoutId); + this.#editorFocusTimeoutId = null; + } + for (const editor of this.#editors.values()) { + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + editor.setParent(null); + editor.isAttachedToDOM = false; + editor.div.remove(); + } + this.div = null; + this.#editors.clear(); + this.#uiManager.removeLayer(this); + } + #cleanup() { + for (const editor of this.#editors.values()) { + if (editor.isEmpty()) { + editor.remove(); + } + } + } + render({ + viewport + }) { + this.viewport = viewport; + setLayerDimensions(this.div, viewport); + for (const editor of this.#uiManager.getEditors(this.pageIndex)) { + this.add(editor); + editor.rebuild(); + } + this.updateMode(); + } + update({ + viewport + }) { + this.#uiManager.commitOrRemove(); + this.#cleanup(); + const oldRotation = this.viewport.rotation; + const rotation = viewport.rotation; + this.viewport = viewport; + setLayerDimensions(this.div, { + rotation + }); + if (oldRotation !== rotation) { + for (const editor of this.#editors.values()) { + editor.rotate(rotation); + } + } + } + get pageDimensions() { + const { + pageWidth, + pageHeight + } = this.viewport.rawDims; + return [pageWidth, pageHeight]; + } + get scale() { + return this.#uiManager.viewParameters.realScale; + } +} + +;// ./src/display/draw_layer.js + + +class DrawLayer { + #parent = null; + #mapping = new Map(); + #toUpdate = new Map(); + static #id = 0; + constructor({ + pageIndex + }) { + this.pageIndex = pageIndex; + } + setParent(parent) { + if (!this.#parent) { + this.#parent = parent; + return; + } + if (this.#parent !== parent) { + if (this.#mapping.size > 0) { + for (const root of this.#mapping.values()) { + root.remove(); + parent.append(root); + } + } + this.#parent = parent; + } + } + static get _svgFactory() { + return shadow(this, "_svgFactory", new DOMSVGFactory()); + } + static #setBox(element, [x, y, width, height]) { + const { + style + } = element; + style.top = `${100 * y}%`; + style.left = `${100 * x}%`; + style.width = `${100 * width}%`; + style.height = `${100 * height}%`; + } + #createSVG() { + const svg = DrawLayer._svgFactory.create(1, 1, true); + this.#parent.append(svg); + svg.setAttribute("aria-hidden", true); + return svg; + } + #createClipPath(defs, pathId) { + const clipPath = DrawLayer._svgFactory.createElement("clipPath"); + defs.append(clipPath); + const clipPathId = `clip_${pathId}`; + clipPath.setAttribute("id", clipPathId); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + const clipPathUse = DrawLayer._svgFactory.createElement("use"); + clipPath.append(clipPathUse); + clipPathUse.setAttribute("href", `#${pathId}`); + clipPathUse.classList.add("clip"); + return clipPathId; + } + #updateProperties(element, properties) { + for (const [key, value] of Object.entries(properties)) { + if (value === null) { + element.removeAttribute(key); + } else { + element.setAttribute(key, value); + } + } + } + draw(properties, isPathUpdatable = false, hasClip = false) { + const id = DrawLayer.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + if (isPathUpdatable) { + this.#toUpdate.set(id, path); + } + const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null; + const use = DrawLayer._svgFactory.createElement("use"); + root.append(use); + use.setAttribute("href", `#${pathId}`); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return { + id, + clipPathId: `url(#${clipPathId})` + }; + } + drawOutline(properties, mustRemoveSelfIntersections) { + const id = DrawLayer.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + let maskId; + if (mustRemoveSelfIntersections) { + const mask = DrawLayer._svgFactory.createElement("mask"); + defs.append(mask); + maskId = `mask_p${this.pageIndex}_${id}`; + mask.setAttribute("id", maskId); + mask.setAttribute("maskUnits", "objectBoundingBox"); + const rect = DrawLayer._svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("fill", "white"); + const use = DrawLayer._svgFactory.createElement("use"); + mask.append(use); + use.setAttribute("href", `#${pathId}`); + use.setAttribute("stroke", "none"); + use.setAttribute("fill", "black"); + use.setAttribute("fill-rule", "nonzero"); + use.classList.add("mask"); + } + const use1 = DrawLayer._svgFactory.createElement("use"); + root.append(use1); + use1.setAttribute("href", `#${pathId}`); + if (maskId) { + use1.setAttribute("mask", `url(#${maskId})`); + } + const use2 = use1.cloneNode(); + root.append(use2); + use1.classList.add("mainOutline"); + use2.classList.add("secondaryOutline"); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return id; + } + finalizeDraw(id, properties) { + this.#toUpdate.delete(id); + this.updateProperties(id, properties); + } + updateProperties(elementOrId, properties) { + if (!properties) { + return; + } + const { + root, + bbox, + rootClass, + path + } = properties; + const element = typeof elementOrId === "number" ? this.#mapping.get(elementOrId) : elementOrId; + if (!element) { + return; + } + if (root) { + this.#updateProperties(element, root); + } + if (bbox) { + DrawLayer.#setBox(element, bbox); + } + if (rootClass) { + const { + classList + } = element; + for (const [className, value] of Object.entries(rootClass)) { + classList.toggle(className, value); + } + } + if (path) { + const defs = element.firstChild; + const pathElement = defs.firstChild; + this.#updateProperties(pathElement, path); + } + } + updateParent(id, layer) { + if (layer === this) { + return; + } + const root = this.#mapping.get(id); + if (!root) { + return; + } + layer.#parent.append(root); + this.#mapping.delete(id); + layer.#mapping.set(id, root); + } + remove(id) { + this.#toUpdate.delete(id); + if (this.#parent === null) { + return; + } + this.#mapping.get(id).remove(); + this.#mapping.delete(id); + } + destroy() { + this.#parent = null; + for (const root of this.#mapping.values()) { + root.remove(); + } + this.#mapping.clear(); + this.#toUpdate.clear(); + } +} + +;// ./src/pdf.js + + + + + + + + + + + + + + + +const pdfjsVersion = "5.2.133"; +const pdfjsBuild = "4f7761353"; +{ + globalThis.pdfjsTestingUtils = { + HighlightOutliner: HighlightOutliner + }; +} +globalThis.pdfjsLib = { + AbortException: AbortException, + AnnotationEditorLayer: AnnotationEditorLayer, + AnnotationEditorParamsType: AnnotationEditorParamsType, + AnnotationEditorType: AnnotationEditorType, + AnnotationEditorUIManager: AnnotationEditorUIManager, + AnnotationLayer: AnnotationLayer, + AnnotationMode: AnnotationMode, + AnnotationType: AnnotationType, + build: build, + ColorPicker: ColorPicker, + createValidAbsoluteUrl: createValidAbsoluteUrl, + DOMSVGFactory: DOMSVGFactory, + DrawLayer: DrawLayer, + FeatureTest: util_FeatureTest, + fetchData: fetchData, + getDocument: getDocument, + getFilenameFromUrl: getFilenameFromUrl, + getPdfFilenameFromUrl: getPdfFilenameFromUrl, + getUuid: getUuid, + getXfaPageViewport: getXfaPageViewport, + GlobalWorkerOptions: GlobalWorkerOptions, + ImageKind: util_ImageKind, + InvalidPDFException: InvalidPDFException, + isDataScheme: isDataScheme, + isPdfFile: isPdfFile, + isValidExplicitDest: isValidExplicitDest, + MathClamp: MathClamp, + noContextMenu: noContextMenu, + normalizeUnicode: normalizeUnicode, + OPS: OPS, + OutputScale: OutputScale, + PasswordResponses: PasswordResponses, + PDFDataRangeTransport: PDFDataRangeTransport, + PDFDateString: PDFDateString, + PDFWorker: PDFWorker, + PermissionFlag: PermissionFlag, + PixelsPerInch: PixelsPerInch, + RenderingCancelledException: RenderingCancelledException, + ResponseException: ResponseException, + setLayerDimensions: setLayerDimensions, + shadow: shadow, + SignatureExtractor: SignatureExtractor, + stopEvent: stopEvent, + SupportedImageMimeTypes: SupportedImageMimeTypes, + TextLayer: TextLayer, + TouchManager: TouchManager, + updateUrlHash: updateUrlHash, + Util: Util, + VerbosityLevel: VerbosityLevel, + version: version, + XfaLayer: XfaLayer +}; + +export { AbortException, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, AnnotationType, ColorPicker, DOMSVGFactory, DrawLayer, util_FeatureTest as FeatureTest, GlobalWorkerOptions, util_ImageKind as ImageKind, InvalidPDFException, MathClamp, OPS, OutputScale, PDFDataRangeTransport, PDFDateString, PDFWorker, PasswordResponses, PermissionFlag, PixelsPerInch, RenderingCancelledException, ResponseException, SignatureExtractor, SupportedImageMimeTypes, TextLayer, TouchManager, Util, VerbosityLevel, XfaLayer, build, createValidAbsoluteUrl, fetchData, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, getUuid, getXfaPageViewport, isDataScheme, isPdfFile, isValidExplicitDest, noContextMenu, normalizeUnicode, setLayerDimensions, shadow, stopEvent, updateUrlHash, version }; + +//# sourceMappingURL=pdf.mjs.map \ No newline at end of file diff --git a/public/plugins/pdfjs-5.2.133/build/pdf.mjs.map b/public/plugins/pdfjs-5.2.133/build/pdf.mjs.map new file mode 100644 index 00000000000..e681e9b2467 --- /dev/null +++ b/public/plugins/pdfjs-5.2.133/build/pdf.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"pdf.mjs","mappings":"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,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAC7E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAA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","sources":["webpack://pdf.js/./src/shared/util.js","webpack://pdf.js/./src/display/display_utils.js","webpack://pdf.js/./src/display/editor/toolbar.js","webpack://pdf.js/./src/display/editor/tools.js","webpack://pdf.js/./src/display/editor/alt_text.js","webpack://pdf.js/./src/display/touch_manager.js","webpack://pdf.js/./src/display/editor/editor.js","webpack://pdf.js/./src/shared/murmurhash3.js","webpack://pdf.js/./src/display/annotation_storage.js","webpack://pdf.js/./src/display/font_loader.js","webpack://pdf.js/./src/shared/message_handler.js","webpack://pdf.js/./src/display/canvas_factory.js","webpack://pdf.js/./src/display/cmap_reader_factory.js","webpack://pdf.js/./src/display/filter_factory.js","webpack://pdf.js/./src/display/standard_fontdata_factory.js","webpack://pdf.js/./src/display/wasm_factory.js","webpack://pdf.js/./src/display/node_utils.js","webpack://pdf.js/./src/display/pattern_helper.js","webpack://pdf.js/./src/shared/image_utils.js","webpack://pdf.js/./src/display/canvas.js","webpack://pdf.js/./src/display/worker_options.js","webpack://pdf.js/./src/display/metadata.js","webpack://pdf.js/./src/display/optional_content_config.js","webpack://pdf.js/./src/display/transport_stream.js","webpack://pdf.js/./src/display/content_disposition.js","webpack://pdf.js/./src/display/network_utils.js","webpack://pdf.js/./src/display/fetch_stream.js","webpack://pdf.js/./src/display/network.js","webpack://pdf.js/./src/display/node_stream.js","webpack://pdf.js/./src/display/text_layer.js","webpack://pdf.js/./src/display/xfa_text.js","webpack://pdf.js/./src/display/api.js","webpack://pdf.js/./src/shared/scripting_utils.js","webpack://pdf.js/./src/display/svg_factory.js","webpack://pdf.js/./src/display/xfa_layer.js","webpack://pdf.js/./src/display/annotation_layer.js","webpack://pdf.js/./src/display/editor/freetext.js","webpack://pdf.js/./src/display/editor/drawers/outline.js","webpack://pdf.js/./src/display/editor/drawers/freedraw.js","webpack://pdf.js/./src/display/editor/drawers/highlight.js","webpack://pdf.js/./src/display/editor/color_picker.js","webpack://pdf.js/./src/display/editor/highlight.js","webpack://pdf.js/./src/display/editor/draw.js","webpack://pdf.js/./src/display/editor/drawers/inkdraw.js","webpack://pdf.js/./src/display/editor/ink.js","webpack://pdf.js/./src/display/editor/drawers/contour.js","webpack://pdf.js/./src/display/editor/drawers/signaturedraw.js","webpack://pdf.js/./src/display/editor/signature.js","webpack://pdf.js/./src/display/editor/stamp.js","webpack://pdf.js/./src/display/editor/annotation_editor_layer.js","webpack://pdf.js/./src/display/draw_layer.js","webpack://pdf.js/./src/pdf.js"],"sourcesContent":["/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\n// NW.js / Electron is a browser context, but copies some Node.js objects; see\n// http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/#access-nodejs-and-nwjs-api-in-browser-context\n// https://www.electronjs.org/docs/api/process#processversionselectron-readonly\n// https://www.electronjs.org/docs/api/process#processtype-readonly\nconst isNodeJS =\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n typeof process === \"object\" &&\n process + \"\" === \"[object process]\" &&\n !process.versions.nw &&\n !(process.versions.electron && process.type && process.type !== \"browser\");\n\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\n// Represent the percentage of the height of a single-line field over\n// the font size. Acrobat seems to use this value.\nconst LINE_FACTOR = 1.35;\nconst LINE_DESCENT_FACTOR = 0.35;\nconst BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;\n\n/**\n * Refer to the `WorkerTransport.getRenderingIntent`-method in the API, to see\n * how these flags are being used:\n * - ANY, DISPLAY, and PRINT are the normal rendering intents, note the\n * `PDFPageProxy.{render, getOperatorList, getAnnotations}`-methods.\n * - SAVE is used, on the worker-thread, when saving modified annotations.\n * - ANNOTATIONS_FORMS, ANNOTATIONS_STORAGE, ANNOTATIONS_DISABLE control which\n * annotations are rendered onto the canvas (i.e. by being included in the\n * operatorList), note the `PDFPageProxy.{render, getOperatorList}`-methods\n * and their `annotationMode`-option.\n * - IS_EDITING is used when editing is active in the viewer.\n * - OPLIST is used with the `PDFPageProxy.getOperatorList`-method, note the\n * `OperatorList`-constructor (on the worker-thread).\n */\nconst RenderingIntentFlag = {\n ANY: 0x01,\n DISPLAY: 0x02,\n PRINT: 0x04,\n SAVE: 0x08,\n ANNOTATIONS_FORMS: 0x10,\n ANNOTATIONS_STORAGE: 0x20,\n ANNOTATIONS_DISABLE: 0x40,\n IS_EDITING: 0x80,\n OPLIST: 0x100,\n};\n\nconst AnnotationMode = {\n DISABLE: 0,\n ENABLE: 1,\n ENABLE_FORMS: 2,\n ENABLE_STORAGE: 3,\n};\n\nconst AnnotationEditorPrefix = \"pdfjs_internal_editor_\";\n\nconst AnnotationEditorType = {\n DISABLE: -1,\n NONE: 0,\n FREETEXT: 3,\n HIGHLIGHT: 9,\n STAMP: 13,\n INK: 15,\n SIGNATURE: 101,\n};\n\nconst AnnotationEditorParamsType = {\n RESIZE: 1,\n CREATE: 2,\n FREETEXT_SIZE: 11,\n FREETEXT_COLOR: 12,\n FREETEXT_OPACITY: 13,\n INK_COLOR: 21,\n INK_THICKNESS: 22,\n INK_OPACITY: 23,\n HIGHLIGHT_COLOR: 31,\n HIGHLIGHT_DEFAULT_COLOR: 32,\n HIGHLIGHT_THICKNESS: 33,\n HIGHLIGHT_FREE: 34,\n HIGHLIGHT_SHOW_ALL: 35,\n DRAW_STEP: 41,\n};\n\n// Permission flags from Table 22, Section 7.6.3.2 of the PDF specification.\nconst PermissionFlag = {\n PRINT: 0x04,\n MODIFY_CONTENTS: 0x08,\n COPY: 0x10,\n MODIFY_ANNOTATIONS: 0x20,\n FILL_INTERACTIVE_FORMS: 0x100,\n COPY_FOR_ACCESSIBILITY: 0x200,\n ASSEMBLE: 0x400,\n PRINT_HIGH_QUALITY: 0x800,\n};\n\nconst TextRenderingMode = {\n FILL: 0,\n STROKE: 1,\n FILL_STROKE: 2,\n INVISIBLE: 3,\n FILL_ADD_TO_PATH: 4,\n STROKE_ADD_TO_PATH: 5,\n FILL_STROKE_ADD_TO_PATH: 6,\n ADD_TO_PATH: 7,\n FILL_STROKE_MASK: 3,\n ADD_TO_PATH_FLAG: 4,\n};\n\nconst ImageKind = {\n GRAYSCALE_1BPP: 1,\n RGB_24BPP: 2,\n RGBA_32BPP: 3,\n};\n\nconst AnnotationType = {\n TEXT: 1,\n LINK: 2,\n FREETEXT: 3,\n LINE: 4,\n SQUARE: 5,\n CIRCLE: 6,\n POLYGON: 7,\n POLYLINE: 8,\n HIGHLIGHT: 9,\n UNDERLINE: 10,\n SQUIGGLY: 11,\n STRIKEOUT: 12,\n STAMP: 13,\n CARET: 14,\n INK: 15,\n POPUP: 16,\n FILEATTACHMENT: 17,\n SOUND: 18,\n MOVIE: 19,\n WIDGET: 20,\n SCREEN: 21,\n PRINTERMARK: 22,\n TRAPNET: 23,\n WATERMARK: 24,\n THREED: 25,\n REDACT: 26,\n};\n\nconst AnnotationReplyType = {\n GROUP: \"Group\",\n REPLY: \"R\",\n};\n\nconst AnnotationFlag = {\n INVISIBLE: 0x01,\n HIDDEN: 0x02,\n PRINT: 0x04,\n NOZOOM: 0x08,\n NOROTATE: 0x10,\n NOVIEW: 0x20,\n READONLY: 0x40,\n LOCKED: 0x80,\n TOGGLENOVIEW: 0x100,\n LOCKEDCONTENTS: 0x200,\n};\n\nconst AnnotationFieldFlag = {\n READONLY: 0x0000001,\n REQUIRED: 0x0000002,\n NOEXPORT: 0x0000004,\n MULTILINE: 0x0001000,\n PASSWORD: 0x0002000,\n NOTOGGLETOOFF: 0x0004000,\n RADIO: 0x0008000,\n PUSHBUTTON: 0x0010000,\n COMBO: 0x0020000,\n EDIT: 0x0040000,\n SORT: 0x0080000,\n FILESELECT: 0x0100000,\n MULTISELECT: 0x0200000,\n DONOTSPELLCHECK: 0x0400000,\n DONOTSCROLL: 0x0800000,\n COMB: 0x1000000,\n RICHTEXT: 0x2000000,\n RADIOSINUNISON: 0x2000000,\n COMMITONSELCHANGE: 0x4000000,\n};\n\nconst AnnotationBorderStyleType = {\n SOLID: 1,\n DASHED: 2,\n BEVELED: 3,\n INSET: 4,\n UNDERLINE: 5,\n};\n\nconst AnnotationActionEventType = {\n E: \"Mouse Enter\",\n X: \"Mouse Exit\",\n D: \"Mouse Down\",\n U: \"Mouse Up\",\n Fo: \"Focus\",\n Bl: \"Blur\",\n PO: \"PageOpen\",\n PC: \"PageClose\",\n PV: \"PageVisible\",\n PI: \"PageInvisible\",\n K: \"Keystroke\",\n F: \"Format\",\n V: \"Validate\",\n C: \"Calculate\",\n};\n\nconst DocumentActionEventType = {\n WC: \"WillClose\",\n WS: \"WillSave\",\n DS: \"DidSave\",\n WP: \"WillPrint\",\n DP: \"DidPrint\",\n};\n\nconst PageActionEventType = {\n O: \"PageOpen\",\n C: \"PageClose\",\n};\n\nconst VerbosityLevel = {\n ERRORS: 0,\n WARNINGS: 1,\n INFOS: 5,\n};\n\n// All the possible operations for an operator list.\nconst OPS = {\n // Intentionally start from 1 so it is easy to spot bad operators that will be\n // 0's.\n // PLEASE NOTE: We purposely keep any removed operators commented out, since\n // re-numbering the list would risk breaking third-party users.\n dependency: 1,\n setLineWidth: 2,\n setLineCap: 3,\n setLineJoin: 4,\n setMiterLimit: 5,\n setDash: 6,\n setRenderingIntent: 7,\n setFlatness: 8,\n setGState: 9,\n save: 10,\n restore: 11,\n transform: 12,\n moveTo: 13,\n lineTo: 14,\n curveTo: 15,\n curveTo2: 16,\n curveTo3: 17,\n closePath: 18,\n rectangle: 19,\n stroke: 20,\n closeStroke: 21,\n fill: 22,\n eoFill: 23,\n fillStroke: 24,\n eoFillStroke: 25,\n closeFillStroke: 26,\n closeEOFillStroke: 27,\n endPath: 28,\n clip: 29,\n eoClip: 30,\n beginText: 31,\n endText: 32,\n setCharSpacing: 33,\n setWordSpacing: 34,\n setHScale: 35,\n setLeading: 36,\n setFont: 37,\n setTextRenderingMode: 38,\n setTextRise: 39,\n moveText: 40,\n setLeadingMoveText: 41,\n setTextMatrix: 42,\n nextLine: 43,\n showText: 44,\n showSpacedText: 45,\n nextLineShowText: 46,\n nextLineSetSpacingShowText: 47,\n setCharWidth: 48,\n setCharWidthAndBounds: 49,\n setStrokeColorSpace: 50,\n setFillColorSpace: 51,\n setStrokeColor: 52,\n setStrokeColorN: 53,\n setFillColor: 54,\n setFillColorN: 55,\n setStrokeGray: 56,\n setFillGray: 57,\n setStrokeRGBColor: 58,\n setFillRGBColor: 59,\n setStrokeCMYKColor: 60,\n setFillCMYKColor: 61,\n shadingFill: 62,\n beginInlineImage: 63,\n beginImageData: 64,\n endInlineImage: 65,\n paintXObject: 66,\n markPoint: 67,\n markPointProps: 68,\n beginMarkedContent: 69,\n beginMarkedContentProps: 70,\n endMarkedContent: 71,\n beginCompat: 72,\n endCompat: 73,\n paintFormXObjectBegin: 74,\n paintFormXObjectEnd: 75,\n beginGroup: 76,\n endGroup: 77,\n // beginAnnotations: 78,\n // endAnnotations: 79,\n beginAnnotation: 80,\n endAnnotation: 81,\n // paintJpegXObject: 82,\n paintImageMaskXObject: 83,\n paintImageMaskXObjectGroup: 84,\n paintImageXObject: 85,\n paintInlineImageXObject: 86,\n paintInlineImageXObjectGroup: 87,\n paintImageXObjectRepeat: 88,\n paintImageMaskXObjectRepeat: 89,\n paintSolidColorImageMask: 90,\n constructPath: 91,\n setStrokeTransparent: 92,\n setFillTransparent: 93,\n rawFillPath: 94,\n};\n\n// In order to have a switch statement that is fast (i.e. which use a jump\n// table), we need to have the OPS in a contiguous range.\nconst DrawOPS = {\n moveTo: 0,\n lineTo: 1,\n curveTo: 2,\n closePath: 3,\n};\n\nconst PasswordResponses = {\n NEED_PASSWORD: 1,\n INCORRECT_PASSWORD: 2,\n};\n\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n if (Number.isInteger(level)) {\n verbosity = level;\n }\n}\n\nfunction getVerbosityLevel() {\n return verbosity;\n}\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n if (verbosity >= VerbosityLevel.INFOS) {\n // eslint-disable-next-line no-console\n console.log(`Info: ${msg}`);\n }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n if (verbosity >= VerbosityLevel.WARNINGS) {\n // eslint-disable-next-line no-console\n console.log(`Warning: ${msg}`);\n }\n}\n\nfunction unreachable(msg) {\n throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n if (!cond) {\n unreachable(msg);\n }\n}\n\n// Checks if URLs use one of the allowed protocols, e.g. to avoid XSS.\nfunction _isValidProtocol(url) {\n switch (url?.protocol) {\n case \"http:\":\n case \"https:\":\n case \"ftp:\":\n case \"mailto:\":\n case \"tel:\":\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Attempts to create a valid absolute URL.\n *\n * @param {URL|string} url - An absolute, or relative, URL.\n * @param {URL|string} [baseUrl] - An absolute URL.\n * @param {Object} [options]\n * @returns Either a valid {URL}, or `null` otherwise.\n */\nfunction createValidAbsoluteUrl(url, baseUrl = null, options = null) {\n if (!url) {\n return null;\n }\n if (options && typeof url === \"string\") {\n // Let URLs beginning with \"www.\" default to using the \"http://\" protocol.\n if (options.addDefaultProtocol && url.startsWith(\"www.\")) {\n const dots = url.match(/\\./g);\n // Avoid accidentally matching a *relative* URL pointing to a file named\n // e.g. \"www.pdf\" or similar.\n if (dots?.length >= 2) {\n url = `http://${url}`;\n }\n }\n\n // According to ISO 32000-1:2008, section 12.6.4.7, URIs should be encoded\n // in 7-bit ASCII. Some bad PDFs use UTF-8 encoding; see bug 1122280.\n if (options.tryConvertEncoding) {\n try {\n url = stringToUTF8String(url);\n } catch {}\n }\n }\n\n const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);\n return _isValidProtocol(absoluteUrl) ? absoluteUrl : null;\n}\n\n/**\n * Remove, or replace, the hash property of the URL.\n *\n * @param {URL|string} url - The absolute, or relative, URL.\n * @param {string} hash - The hash property (use an empty string to remove it).\n * @param {boolean} [allowRel] - Allow relative URLs.\n * @returns {string} The resulting URL string.\n */\nfunction updateUrlHash(url, hash, allowRel = false) {\n const res = URL.parse(url);\n if (res) {\n res.hash = hash;\n return res.href;\n }\n // Support well-formed relative URLs, necessary for `web/app.js` in GENERIC\n // builds, by optionally falling back to string parsing.\n if (allowRel && createValidAbsoluteUrl(url, \"http://example.com\")) {\n return url.split(\"#\", 1)[0] + `${hash ? `#${hash}` : \"\"}`;\n }\n return \"\";\n}\n\nfunction shadow(obj, prop, value, nonSerializable = false) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n prop in obj,\n `shadow: Property \"${prop && prop.toString()}\" not found in object.`\n );\n }\n Object.defineProperty(obj, prop, {\n value,\n enumerable: !nonSerializable,\n configurable: true,\n writable: false,\n });\n return value;\n}\n\n/**\n * @type {any}\n */\nconst BaseException = (function BaseExceptionClosure() {\n // eslint-disable-next-line no-shadow\n function BaseException(message, name) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseException\n ) {\n unreachable(\"Cannot initialize BaseException.\");\n }\n this.message = message;\n this.name = name;\n }\n BaseException.prototype = new Error();\n BaseException.constructor = BaseException;\n\n return BaseException;\n})();\n\nclass PasswordException extends BaseException {\n constructor(msg, code) {\n super(msg, \"PasswordException\");\n this.code = code;\n }\n}\n\nclass UnknownErrorException extends BaseException {\n constructor(msg, details) {\n super(msg, \"UnknownErrorException\");\n this.details = details;\n }\n}\n\nclass InvalidPDFException extends BaseException {\n constructor(msg) {\n super(msg, \"InvalidPDFException\");\n }\n}\n\nclass ResponseException extends BaseException {\n constructor(msg, status, missing) {\n super(msg, \"ResponseException\");\n this.status = status;\n this.missing = missing;\n }\n}\n\n/**\n * Error caused during parsing PDF data.\n */\nclass FormatError extends BaseException {\n constructor(msg) {\n super(msg, \"FormatError\");\n }\n}\n\n/**\n * Error used to indicate task cancellation.\n */\nclass AbortException extends BaseException {\n constructor(msg) {\n super(msg, \"AbortException\");\n }\n}\n\nfunction bytesToString(bytes) {\n if (typeof bytes !== \"object\" || bytes?.length === undefined) {\n unreachable(\"Invalid argument for bytesToString\");\n }\n const length = bytes.length;\n const MAX_ARGUMENT_COUNT = 8192;\n if (length < MAX_ARGUMENT_COUNT) {\n return String.fromCharCode.apply(null, bytes);\n }\n const strBuf = [];\n for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n const chunk = bytes.subarray(i, chunkEnd);\n strBuf.push(String.fromCharCode.apply(null, chunk));\n }\n return strBuf.join(\"\");\n}\n\nfunction stringToBytes(str) {\n if (typeof str !== \"string\") {\n unreachable(\"Invalid argument for stringToBytes\");\n }\n const length = str.length;\n const bytes = new Uint8Array(length);\n for (let i = 0; i < length; ++i) {\n bytes[i] = str.charCodeAt(i) & 0xff;\n }\n return bytes;\n}\n\nfunction string32(value) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n typeof value === \"number\" && Math.abs(value) < 2 ** 32,\n `string32: Unexpected input \"${value}\".`\n );\n }\n return String.fromCharCode(\n (value >> 24) & 0xff,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff\n );\n}\n\nfunction objectSize(obj) {\n return Object.keys(obj).length;\n}\n\n// Checks the endianness of the platform.\nfunction isLittleEndian() {\n const buffer8 = new Uint8Array(4);\n buffer8[0] = 1;\n const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n return view32[0] === 1;\n}\n\n// Checks if it's possible to eval JS expressions.\nfunction isEvalSupported() {\n try {\n new Function(\"\"); // eslint-disable-line no-new, no-new-func\n return true;\n } catch {\n return false;\n }\n}\n\nclass FeatureTest {\n static get isLittleEndian() {\n return shadow(this, \"isLittleEndian\", isLittleEndian());\n }\n\n static get isEvalSupported() {\n return shadow(this, \"isEvalSupported\", isEvalSupported());\n }\n\n static get isOffscreenCanvasSupported() {\n return shadow(\n this,\n \"isOffscreenCanvasSupported\",\n typeof OffscreenCanvas !== \"undefined\"\n );\n }\n\n static get isImageDecoderSupported() {\n return shadow(\n this,\n \"isImageDecoderSupported\",\n typeof ImageDecoder !== \"undefined\"\n );\n }\n\n static get platform() {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n (typeof navigator !== \"undefined\" &&\n typeof navigator?.platform === \"string\" &&\n typeof navigator?.userAgent === \"string\")\n ) {\n const { platform, userAgent } = navigator;\n\n return shadow(this, \"platform\", {\n isAndroid: userAgent.includes(\"Android\"),\n isLinux: platform.includes(\"Linux\"),\n isMac: platform.includes(\"Mac\"),\n isWindows: platform.includes(\"Win\"),\n isFirefox:\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n userAgent.includes(\"Firefox\"),\n });\n }\n return shadow(this, \"platform\", {\n isAndroid: false,\n isLinux: false,\n isMac: false,\n isWindows: false,\n isFirefox: false,\n });\n }\n\n static get isCSSRoundSupported() {\n return shadow(\n this,\n \"isCSSRoundSupported\",\n globalThis.CSS?.supports?.(\"width: round(1.5px, 1px)\")\n );\n }\n}\n\nconst hexNumbers = Array.from(Array(256).keys(), n =>\n n.toString(16).padStart(2, \"0\")\n);\n\nclass Util {\n static makeHexColor(r, g, b) {\n return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;\n }\n\n // Apply a scaling matrix to some min/max values.\n // If a scaling factor is negative then min and max must be\n // swapped.\n static scaleMinMax(transform, minMax) {\n let temp;\n if (transform[0]) {\n if (transform[0] < 0) {\n temp = minMax[0];\n minMax[0] = minMax[2];\n minMax[2] = temp;\n }\n minMax[0] *= transform[0];\n minMax[2] *= transform[0];\n\n if (transform[3] < 0) {\n temp = minMax[1];\n minMax[1] = minMax[3];\n minMax[3] = temp;\n }\n minMax[1] *= transform[3];\n minMax[3] *= transform[3];\n } else {\n temp = minMax[0];\n minMax[0] = minMax[1];\n minMax[1] = temp;\n temp = minMax[2];\n minMax[2] = minMax[3];\n minMax[3] = temp;\n\n if (transform[1] < 0) {\n temp = minMax[1];\n minMax[1] = minMax[3];\n minMax[3] = temp;\n }\n minMax[1] *= transform[1];\n minMax[3] *= transform[1];\n\n if (transform[2] < 0) {\n temp = minMax[0];\n minMax[0] = minMax[2];\n minMax[2] = temp;\n }\n minMax[0] *= transform[2];\n minMax[2] *= transform[2];\n }\n minMax[0] += transform[4];\n minMax[1] += transform[5];\n minMax[2] += transform[4];\n minMax[3] += transform[5];\n }\n\n // Concatenates two transformation matrices together and returns the result.\n static transform(m1, m2) {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5],\n ];\n }\n\n // For 2d affine transforms\n static applyTransform(p, m, pos = 0) {\n const p0 = p[pos];\n const p1 = p[pos + 1];\n p[pos] = p0 * m[0] + p1 * m[2] + m[4];\n p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5];\n }\n\n static applyTransformToBezier(p, transform, pos = 0) {\n const m0 = transform[0];\n const m1 = transform[1];\n const m2 = transform[2];\n const m3 = transform[3];\n const m4 = transform[4];\n const m5 = transform[5];\n for (let i = 0; i < 6; i += 2) {\n const pI = p[pos + i];\n const pI1 = p[pos + i + 1];\n p[pos + i] = pI * m0 + pI1 * m2 + m4;\n p[pos + i + 1] = pI * m1 + pI1 * m3 + m5;\n }\n }\n\n static applyInverseTransform(p, m) {\n const p0 = p[0];\n const p1 = p[1];\n const d = m[0] * m[3] - m[1] * m[2];\n p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n }\n\n // Applies the transform to the rectangle and finds the minimum axially\n // aligned bounding box.\n static axialAlignedBoundingBox(rect, transform, output) {\n const m0 = transform[0];\n const m1 = transform[1];\n const m2 = transform[2];\n const m3 = transform[3];\n const m4 = transform[4];\n const m5 = transform[5];\n const r0 = rect[0];\n const r1 = rect[1];\n const r2 = rect[2];\n const r3 = rect[3];\n\n let a0 = m0 * r0 + m4;\n let a2 = a0;\n let a1 = m0 * r2 + m4;\n let a3 = a1;\n let b0 = m3 * r1 + m5;\n let b2 = b0;\n let b1 = m3 * r3 + m5;\n let b3 = b1;\n\n if (m1 !== 0 || m2 !== 0) {\n // Non-scaling matrix: shouldn't be frequent.\n const m1r0 = m1 * r0;\n const m1r2 = m1 * r2;\n const m2r1 = m2 * r1;\n const m2r3 = m2 * r3;\n a0 += m2r1;\n a3 += m2r1;\n a1 += m2r3;\n a2 += m2r3;\n b0 += m1r0;\n b3 += m1r0;\n b1 += m1r2;\n b2 += m1r2;\n }\n\n output[0] = Math.min(output[0], a0, a1, a2, a3);\n output[1] = Math.min(output[1], b0, b1, b2, b3);\n output[2] = Math.max(output[2], a0, a1, a2, a3);\n output[3] = Math.max(output[3], b0, b1, b2, b3);\n }\n\n static inverseTransform(m) {\n const d = m[0] * m[3] - m[1] * m[2];\n return [\n m[3] / d,\n -m[1] / d,\n -m[2] / d,\n m[0] / d,\n (m[2] * m[5] - m[4] * m[3]) / d,\n (m[4] * m[1] - m[5] * m[0]) / d,\n ];\n }\n\n // This calculation uses Singular Value Decomposition.\n // The SVD can be represented with formula A = USV. We are interested in the\n // matrix S here because it represents the scale values.\n static singularValueDecompose2dScale(matrix, output) {\n const m0 = matrix[0];\n const m1 = matrix[1];\n const m2 = matrix[2];\n const m3 = matrix[3];\n // Multiply matrix m with its transpose.\n const a = m0 ** 2 + m1 ** 2;\n const b = m0 * m2 + m1 * m3;\n const c = m2 ** 2 + m3 ** 2;\n\n // Solve the second degree polynomial to get roots.\n const first = (a + c) / 2;\n const second = Math.sqrt(first ** 2 - (a * c - b ** 2));\n output[0] = Math.sqrt(first + second || 1);\n output[1] = Math.sqrt(first - second || 1);\n }\n\n // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n // For coordinate systems whose origin lies in the bottom-left, this\n // means normalization to (BL,TR) ordering. For systems with origin in the\n // top-left, this means (TL,BR) ordering.\n static normalizeRect(rect) {\n const r = rect.slice(0); // clone rect\n if (rect[0] > rect[2]) {\n r[0] = rect[2];\n r[2] = rect[0];\n }\n if (rect[1] > rect[3]) {\n r[1] = rect[3];\n r[3] = rect[1];\n }\n return r;\n }\n\n // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n // intersection of rect1 and rect2. If no intersection, returns 'null'\n // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n static intersect(rect1, rect2) {\n const xLow = Math.max(\n Math.min(rect1[0], rect1[2]),\n Math.min(rect2[0], rect2[2])\n );\n const xHigh = Math.min(\n Math.max(rect1[0], rect1[2]),\n Math.max(rect2[0], rect2[2])\n );\n if (xLow > xHigh) {\n return null;\n }\n const yLow = Math.max(\n Math.min(rect1[1], rect1[3]),\n Math.min(rect2[1], rect2[3])\n );\n const yHigh = Math.min(\n Math.max(rect1[1], rect1[3]),\n Math.max(rect2[1], rect2[3])\n );\n if (yLow > yHigh) {\n return null;\n }\n\n return [xLow, yLow, xHigh, yHigh];\n }\n\n static pointBoundingBox(x, y, minMax) {\n minMax[0] = Math.min(minMax[0], x);\n minMax[1] = Math.min(minMax[1], y);\n minMax[2] = Math.max(minMax[2], x);\n minMax[3] = Math.max(minMax[3], y);\n }\n\n static rectBoundingBox(x0, y0, x1, y1, minMax) {\n minMax[0] = Math.min(minMax[0], x0, x1);\n minMax[1] = Math.min(minMax[1], y0, y1);\n minMax[2] = Math.max(minMax[2], x0, x1);\n minMax[3] = Math.max(minMax[3], y0, y1);\n }\n\n static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {\n if (t <= 0 || t >= 1) {\n return;\n }\n const mt = 1 - t;\n const tt = t * t;\n const ttt = tt * t;\n const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;\n const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;\n minMax[0] = Math.min(minMax[0], x);\n minMax[1] = Math.min(minMax[1], y);\n minMax[2] = Math.max(minMax[2], x);\n minMax[3] = Math.max(minMax[3], y);\n }\n\n static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) >= 1e-12) {\n this.#getExtremumOnCurve(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n -c / b,\n minMax\n );\n }\n return;\n }\n\n const delta = b ** 2 - 4 * c * a;\n if (delta < 0) {\n return;\n }\n const sqrtDelta = Math.sqrt(delta);\n const a2 = 2 * a;\n this.#getExtremumOnCurve(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n (-b + sqrtDelta) / a2,\n minMax\n );\n this.#getExtremumOnCurve(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n (-b - sqrtDelta) / a2,\n minMax\n );\n }\n\n // From https://github.com/adobe-webplatform/Snap.svg/blob/b365287722a72526000ac4bfcf0ce4cac2faa015/src/path.js#L852\n static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {\n minMax[0] = Math.min(minMax[0], x0, x3);\n minMax[1] = Math.min(minMax[1], y0, y3);\n minMax[2] = Math.max(minMax[2], x0, x3);\n minMax[3] = Math.max(minMax[3], y0, y3);\n\n this.#getExtremum(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n 3 * (-x0 + 3 * (x1 - x2) + x3),\n 6 * (x0 - 2 * x1 + x2),\n 3 * (x1 - x0),\n minMax\n );\n this.#getExtremum(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n 3 * (-y0 + 3 * (y1 - y2) + y3),\n 6 * (y0 - 2 * y1 + y2),\n 3 * (y1 - y0),\n minMax\n );\n }\n}\n\nconst PDFStringTranslateTable = [\n 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,\n 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 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,\n 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,\n 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,\n 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192,\n 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,\n 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d,\n 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac,\n];\n\nfunction stringToPDFString(str) {\n // See section 7.9.2.2 Text String Type.\n // The string can contain some language codes bracketed with 0x0b,\n // so we must remove them.\n if (str[0] >= \"\\xEF\") {\n let encoding;\n if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n encoding = \"utf-16be\";\n if (str.length % 2 === 1) {\n str = str.slice(0, -1);\n }\n } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n encoding = \"utf-16le\";\n if (str.length % 2 === 1) {\n str = str.slice(0, -1);\n }\n } else if (str[0] === \"\\xEF\" && str[1] === \"\\xBB\" && str[2] === \"\\xBF\") {\n encoding = \"utf-8\";\n }\n\n if (encoding) {\n try {\n const decoder = new TextDecoder(encoding, { fatal: true });\n const buffer = stringToBytes(str);\n const decoded = decoder.decode(buffer);\n if (!decoded.includes(\"\\x1b\")) {\n return decoded;\n }\n return decoded.replaceAll(/\\x1b[^\\x1b]*(?:\\x1b|$)/g, \"\");\n } catch (ex) {\n warn(`stringToPDFString: \"${ex}\".`);\n }\n }\n }\n // ISO Latin 1\n const strBuf = [];\n for (let i = 0, ii = str.length; i < ii; i++) {\n const charCode = str.charCodeAt(i);\n if (charCode === 0x1b) {\n // eslint-disable-next-line no-empty\n while (++i < ii && str.charCodeAt(i) !== 0x1b) {}\n continue;\n }\n const code = PDFStringTranslateTable[charCode];\n strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n }\n return strBuf.join(\"\");\n}\n\nfunction stringToUTF8String(str) {\n return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n return unescape(encodeURIComponent(str));\n}\n\nfunction isArrayEqual(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n for (let i = 0, ii = arr1.length; i < ii; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction getModificationDate(date = new Date()) {\n const buffer = [\n date.getUTCFullYear().toString(),\n (date.getUTCMonth() + 1).toString().padStart(2, \"0\"),\n date.getUTCDate().toString().padStart(2, \"0\"),\n date.getUTCHours().toString().padStart(2, \"0\"),\n date.getUTCMinutes().toString().padStart(2, \"0\"),\n date.getUTCSeconds().toString().padStart(2, \"0\"),\n ];\n\n return buffer.join(\"\");\n}\n\nlet NormalizeRegex = null;\nlet NormalizationMap = null;\nfunction normalizeUnicode(str) {\n if (!NormalizeRegex) {\n // In order to generate the following regex:\n // - create a PDF containing all the chars in the range 0000-FFFF with\n // a NFKC which is different of the char.\n // - copy and paste all those chars and get the ones where NFKC is\n // required.\n // It appears that most the chars here contain some ligatures.\n NormalizeRegex =\n /([\\u00a0\\u00b5\\u037e\\u0eb3\\u2000-\\u200a\\u202f\\u2126\\ufb00-\\ufb04\\ufb06\\ufb20-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufba1\\ufba4-\\ufba9\\ufbae-\\ufbb1\\ufbd3-\\ufbdc\\ufbde-\\ufbe7\\ufbea-\\ufbf8\\ufbfc-\\ufbfd\\ufc00-\\ufc5d\\ufc64-\\ufcf1\\ufcf5-\\ufd3d\\ufd88\\ufdf4\\ufdfa-\\ufdfb\\ufe71\\ufe77\\ufe79\\ufe7b\\ufe7d]+)|(\\ufb05+)/gu;\n NormalizationMap = new Map([[\"ſt\", \"ſt\"]]);\n }\n return str.replaceAll(NormalizeRegex, (_, p1, p2) =>\n p1 ? p1.normalize(\"NFKC\") : NormalizationMap.get(p2)\n );\n}\n\nfunction getUuid() {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n const buf = new Uint8Array(32);\n crypto.getRandomValues(buf);\n return bytesToString(buf);\n}\n\nconst AnnotationPrefix = \"pdfjs_internal_id_\";\n\nfunction _isValidExplicitDest(validRef, validName, dest) {\n if (!Array.isArray(dest) || dest.length < 2) {\n return false;\n }\n const [page, zoom, ...args] = dest;\n if (!validRef(page) && !Number.isInteger(page)) {\n return false;\n }\n if (!validName(zoom)) {\n return false;\n }\n const argsLen = args.length;\n let allowNull = true;\n switch (zoom.name) {\n case \"XYZ\":\n if (argsLen < 2 || argsLen > 3) {\n return false;\n }\n break;\n case \"Fit\":\n case \"FitB\":\n return argsLen === 0;\n case \"FitH\":\n case \"FitBH\":\n case \"FitV\":\n case \"FitBV\":\n if (argsLen > 1) {\n return false;\n }\n break;\n case \"FitR\":\n if (argsLen !== 4) {\n return false;\n }\n allowNull = false;\n break;\n default:\n return false;\n }\n for (const arg of args) {\n if (typeof arg === \"number\" || (allowNull && arg === null)) {\n continue;\n }\n return false;\n }\n return true;\n}\n\n// TOOD: Replace all occurrences of this function with `Math.clamp` once\n// https://github.com/tc39/proposal-math-clamp/ is generally available.\nfunction MathClamp(v, min, max) {\n return Math.min(Math.max(v, min), max);\n}\n\n// TODO: Remove this once `Uint8Array.prototype.toHex` is generally available.\nfunction toHexUtil(arr) {\n if (Uint8Array.prototype.toHex) {\n return arr.toHex();\n }\n return Array.from(arr, num => hexNumbers[num]).join(\"\");\n}\n\n// TODO: Remove this once `Uint8Array.prototype.toBase64` is generally\n// available.\nfunction toBase64Util(arr) {\n if (Uint8Array.prototype.toBase64) {\n return arr.toBase64();\n }\n return btoa(bytesToString(arr));\n}\n\n// TODO: Remove this once `Uint8Array.fromBase64` is generally available.\nfunction fromBase64Util(str) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(str);\n }\n return stringToBytes(atob(str));\n}\n\n// TODO: Remove this once https://bugzilla.mozilla.org/show_bug.cgi?id=1928493\n// is fixed.\nif (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"SKIP_BABEL\")) &&\n typeof Promise.try !== \"function\"\n) {\n Promise.try = function (fn, ...args) {\n return new Promise(resolve => {\n resolve(fn(...args));\n });\n };\n}\n\n// TODO: Remove this once the `javascript.options.experimental.math_sumprecise`\n// preference is removed from Firefox.\nif (typeof Math.sumPrecise !== \"function\") {\n // Note that this isn't a \"proper\" polyfill, but since we're only using it to\n // replace `Array.prototype.reduce()` invocations it should be fine.\n Math.sumPrecise = function (numbers) {\n return numbers.reduce((a, b) => a + b, 0);\n };\n}\n\nif (\n typeof PDFJSDev !== \"undefined\" &&\n !PDFJSDev.test(\"SKIP_BABEL\") &&\n typeof AbortSignal.any !== \"function\"\n) {\n AbortSignal.any = function (iterable) {\n const ac = new AbortController();\n const { signal } = ac;\n\n // Return immediately if any of the signals are already aborted.\n for (const s of iterable) {\n if (s.aborted) {\n ac.abort(s.reason);\n return signal;\n }\n }\n // Register \"abort\" listeners for all signals.\n for (const s of iterable) {\n s.addEventListener(\n \"abort\",\n () => {\n ac.abort(s.reason);\n },\n { signal } // Automatically remove the listener.\n );\n }\n\n return signal;\n };\n}\n\nexport {\n _isValidExplicitDest,\n AbortException,\n AnnotationActionEventType,\n AnnotationBorderStyleType,\n AnnotationEditorParamsType,\n AnnotationEditorPrefix,\n AnnotationEditorType,\n AnnotationFieldFlag,\n AnnotationFlag,\n AnnotationMode,\n AnnotationPrefix,\n AnnotationReplyType,\n AnnotationType,\n assert,\n BaseException,\n BASELINE_FACTOR,\n bytesToString,\n createValidAbsoluteUrl,\n DocumentActionEventType,\n DrawOPS,\n FeatureTest,\n FONT_IDENTITY_MATRIX,\n FormatError,\n fromBase64Util,\n getModificationDate,\n getUuid,\n getVerbosityLevel,\n hexNumbers,\n ImageKind,\n info,\n InvalidPDFException,\n isArrayEqual,\n isNodeJS,\n LINE_DESCENT_FACTOR,\n LINE_FACTOR,\n MathClamp,\n normalizeUnicode,\n objectSize,\n OPS,\n PageActionEventType,\n PasswordException,\n PasswordResponses,\n PermissionFlag,\n RenderingIntentFlag,\n ResponseException,\n setVerbosityLevel,\n shadow,\n string32,\n stringToBytes,\n stringToPDFString,\n stringToUTF8String,\n TextRenderingMode,\n toBase64Util,\n toHexUtil,\n UnknownErrorException,\n unreachable,\n updateUrlHash,\n utf8StringToString,\n Util,\n VerbosityLevel,\n warn,\n};\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BaseException,\n FeatureTest,\n shadow,\n Util,\n warn,\n} from \"../shared/util.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nclass PixelsPerInch {\n static CSS = 96.0;\n\n static PDF = 72.0;\n\n static PDF_TO_CSS_UNITS = this.CSS / this.PDF;\n}\n\nasync function fetchData(url, type = \"text\") {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n isValidFetchUrl(url, document.baseURI)\n ) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n switch (type) {\n case \"arraybuffer\":\n return response.arrayBuffer();\n case \"blob\":\n return response.blob();\n case \"json\":\n return response.json();\n }\n return response.text();\n }\n\n // The Fetch API is not supported.\n return new Promise((resolve, reject) => {\n const request = new XMLHttpRequest();\n request.open(\"GET\", url, /* async = */ true);\n request.responseType = type;\n\n request.onreadystatechange = () => {\n if (request.readyState !== XMLHttpRequest.DONE) {\n return;\n }\n if (request.status === 200 || request.status === 0) {\n switch (type) {\n case \"arraybuffer\":\n case \"blob\":\n case \"json\":\n resolve(request.response);\n return;\n }\n resolve(request.responseText);\n return;\n }\n reject(new Error(request.statusText));\n };\n\n request.send(null);\n });\n}\n\n/**\n * @typedef {Object} PageViewportParameters\n * @property {Array} viewBox - The xMin, yMin, xMax and\n * yMax coordinates.\n * @property {number} userUnit - The size of units.\n * @property {number} scale - The scale of the viewport.\n * @property {number} rotation - The rotation, in degrees, of the viewport.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset. The\n * default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset. The\n * default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be flipped.\n * The default value is `false`.\n */\n\n/**\n * @typedef {Object} PageViewportCloneParameters\n * @property {number} [scale] - The scale, overriding the one in the cloned\n * viewport. The default value is `this.scale`.\n * @property {number} [rotation] - The rotation, in degrees, overriding the one\n * in the cloned viewport. The default value is `this.rotation`.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n * The default value is `this.offsetX`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n * The default value is `this.offsetY`.\n * @property {boolean} [dontFlip] - If true, the x-axis will not be flipped.\n * The default value is `false`.\n */\n\n/**\n * PDF page viewport created based on scale, rotation and offset.\n */\nclass PageViewport {\n /**\n * @param {PageViewportParameters}\n */\n constructor({\n viewBox,\n userUnit,\n scale,\n rotation,\n offsetX = 0,\n offsetY = 0,\n dontFlip = false,\n }) {\n this.viewBox = viewBox;\n this.userUnit = userUnit;\n this.scale = scale;\n this.rotation = rotation;\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n scale *= userUnit; // Take the userUnit into account.\n\n // creating transform to convert pdf coordinate system to the normal\n // canvas like coordinates taking in account scale and rotation\n const centerX = (viewBox[2] + viewBox[0]) / 2;\n const centerY = (viewBox[3] + viewBox[1]) / 2;\n let rotateA, rotateB, rotateC, rotateD;\n // Normalize the rotation, by clamping it to the [0, 360) range.\n rotation %= 360;\n if (rotation < 0) {\n rotation += 360;\n }\n switch (rotation) {\n case 180:\n rotateA = -1;\n rotateB = 0;\n rotateC = 0;\n rotateD = 1;\n break;\n case 90:\n rotateA = 0;\n rotateB = 1;\n rotateC = 1;\n rotateD = 0;\n break;\n case 270:\n rotateA = 0;\n rotateB = -1;\n rotateC = -1;\n rotateD = 0;\n break;\n case 0:\n rotateA = 1;\n rotateB = 0;\n rotateC = 0;\n rotateD = -1;\n break;\n default:\n throw new Error(\n \"PageViewport: Invalid rotation, must be a multiple of 90 degrees.\"\n );\n }\n\n if (dontFlip) {\n rotateC = -rotateC;\n rotateD = -rotateD;\n }\n\n let offsetCanvasX, offsetCanvasY;\n let width, height;\n if (rotateA === 0) {\n offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n width = (viewBox[3] - viewBox[1]) * scale;\n height = (viewBox[2] - viewBox[0]) * scale;\n } else {\n offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n width = (viewBox[2] - viewBox[0]) * scale;\n height = (viewBox[3] - viewBox[1]) * scale;\n }\n // creating transform for the following operations:\n // translate(-centerX, -centerY), rotate and flip vertically,\n // scale, and translate(offsetCanvasX, offsetCanvasY)\n this.transform = [\n rotateA * scale,\n rotateB * scale,\n rotateC * scale,\n rotateD * scale,\n offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,\n offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY,\n ];\n\n this.width = width;\n this.height = height;\n }\n\n /**\n * The original, un-scaled, viewport dimensions.\n * @type {Object}\n */\n get rawDims() {\n const dims = this.viewBox;\n\n return shadow(this, \"rawDims\", {\n pageWidth: dims[2] - dims[0],\n pageHeight: dims[3] - dims[1],\n pageX: dims[0],\n pageY: dims[1],\n });\n }\n\n /**\n * Clones viewport, with optional additional properties.\n * @param {PageViewportCloneParameters} [params]\n * @returns {PageViewport} Cloned viewport.\n */\n clone({\n scale = this.scale,\n rotation = this.rotation,\n offsetX = this.offsetX,\n offsetY = this.offsetY,\n dontFlip = false,\n } = {}) {\n return new PageViewport({\n viewBox: this.viewBox.slice(),\n userUnit: this.userUnit,\n scale,\n rotation,\n offsetX,\n offsetY,\n dontFlip,\n });\n }\n\n /**\n * Converts PDF point to the viewport coordinates. For examples, useful for\n * converting PDF location into canvas pixel coordinates.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @returns {Array} Array containing `x`- and `y`-coordinates of the\n * point in the viewport coordinate space.\n * @see {@link convertToPdfPoint}\n * @see {@link convertToViewportRectangle}\n */\n convertToViewportPoint(x, y) {\n const p = [x, y];\n Util.applyTransform(p, this.transform);\n return p;\n }\n\n /**\n * Converts PDF rectangle to the viewport coordinates.\n * @param {Array} rect - The xMin, yMin, xMax and yMax coordinates.\n * @returns {Array} Array containing corresponding coordinates of the\n * rectangle in the viewport coordinate space.\n * @see {@link convertToViewportPoint}\n */\n convertToViewportRectangle(rect) {\n const topLeft = [rect[0], rect[1]];\n Util.applyTransform(topLeft, this.transform);\n const bottomRight = [rect[2], rect[3]];\n Util.applyTransform(bottomRight, this.transform);\n return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];\n }\n\n /**\n * Converts viewport coordinates to the PDF location. For examples, useful\n * for converting canvas pixel location into PDF one.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @returns {Array} Array containing `x`- and `y`-coordinates of the\n * point in the PDF coordinate space.\n * @see {@link convertToViewportPoint}\n */\n convertToPdfPoint(x, y) {\n const p = [x, y];\n Util.applyInverseTransform(p, this.transform);\n return p;\n }\n}\n\nclass RenderingCancelledException extends BaseException {\n constructor(msg, extraDelay = 0) {\n super(msg, \"RenderingCancelledException\");\n this.extraDelay = extraDelay;\n }\n}\n\nfunction isDataScheme(url) {\n const ii = url.length;\n let i = 0;\n while (i < ii && url[i].trim() === \"\") {\n i++;\n }\n return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\n\nfunction isPdfFile(filename) {\n return typeof filename === \"string\" && /\\.pdf$/i.test(filename);\n}\n\n/**\n * Gets the filename from a given URL.\n * @param {string} url\n * @returns {string}\n */\nfunction getFilenameFromUrl(url) {\n [url] = url.split(/[#?]/, 1);\n return url.substring(url.lastIndexOf(\"/\") + 1);\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * @param {string} url - The original PDF location.\n * @param {string} defaultFilename - The value returned if the filename is\n * unknown, or the protocol is unsupported.\n * @returns {string} Guessed PDF filename.\n */\nfunction getPdfFilenameFromUrl(url, defaultFilename = \"document.pdf\") {\n if (typeof url !== \"string\") {\n return defaultFilename;\n }\n if (isDataScheme(url)) {\n warn('getPdfFilenameFromUrl: ignore \"data:\"-URL for performance reasons.');\n return defaultFilename;\n }\n const reURI = /^(?:(?:[^:]+:)?\\/\\/[^/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n // SCHEME HOST 1.PATH 2.QUERY 3.REF\n // Pattern to get last matching NAME.pdf\n const reFilename = /[^/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n const splitURI = reURI.exec(url);\n let suggestedFilename =\n reFilename.exec(splitURI[1]) ||\n reFilename.exec(splitURI[2]) ||\n reFilename.exec(splitURI[3]);\n if (suggestedFilename) {\n suggestedFilename = suggestedFilename[0];\n if (suggestedFilename.includes(\"%\")) {\n // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf\n try {\n suggestedFilename = reFilename.exec(\n decodeURIComponent(suggestedFilename)\n )[0];\n } catch {\n // Possible (extremely rare) errors:\n // URIError \"Malformed URI\", e.g. for \"%AA.pdf\"\n // TypeError \"null has no properties\", e.g. for \"%2F.pdf\"\n }\n }\n }\n return suggestedFilename || defaultFilename;\n}\n\nclass StatTimer {\n started = Object.create(null);\n\n times = [];\n\n time(name) {\n if (name in this.started) {\n warn(`Timer is already running for ${name}`);\n }\n this.started[name] = Date.now();\n }\n\n timeEnd(name) {\n if (!(name in this.started)) {\n warn(`Timer has not been started for ${name}`);\n }\n this.times.push({\n name,\n start: this.started[name],\n end: Date.now(),\n });\n // Remove timer from started so it can be called again.\n delete this.started[name];\n }\n\n toString() {\n // Find the longest name for padding purposes.\n const outBuf = [];\n let longest = 0;\n for (const { name } of this.times) {\n longest = Math.max(name.length, longest);\n }\n for (const { name, start, end } of this.times) {\n outBuf.push(`${name.padEnd(longest)} ${end - start}ms\\n`);\n }\n return outBuf.join(\"\");\n }\n}\n\nfunction isValidFetchUrl(url, baseUrl) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: isValidFetchUrl\");\n }\n const res = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);\n // The Fetch API only supports the http/https protocols, and not file/ftp.\n return res?.protocol === \"http:\" || res?.protocol === \"https:\";\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenu(e) {\n e.preventDefault();\n}\n\nfunction stopEvent(e) {\n e.preventDefault();\n e.stopPropagation();\n}\n\n// Deprecated API function -- display regardless of the `verbosity` setting.\nfunction deprecated(details) {\n // eslint-disable-next-line no-console\n console.log(\"Deprecated API usage: \" + details);\n}\n\nclass PDFDateString {\n static #regex;\n\n /**\n * Convert a PDF date string to a JavaScript `Date` object.\n *\n * The PDF date string format is described in section 7.9.4 of the official\n * PDF 32000-1:2008 specification. However, in the PDF 1.7 reference (sixth\n * edition) Adobe describes the same format including a trailing apostrophe.\n * This syntax in incorrect, but Adobe Acrobat creates PDF files that contain\n * them. We ignore all apostrophes as they are not necessary for date parsing.\n *\n * Moreover, Adobe Acrobat doesn't handle changing the date to universal time\n * and doesn't use the user's time zone (effectively ignoring the HH' and mm'\n * parts of the date string).\n *\n * @param {string} input\n * @returns {Date|null}\n */\n static toDateObject(input) {\n if (!input || typeof input !== \"string\") {\n return null;\n }\n\n // Lazily initialize the regular expression.\n this.#regex ||= new RegExp(\n \"^D:\" + // Prefix (required)\n \"(\\\\d{4})\" + // Year (required)\n \"(\\\\d{2})?\" + // Month (optional)\n \"(\\\\d{2})?\" + // Day (optional)\n \"(\\\\d{2})?\" + // Hour (optional)\n \"(\\\\d{2})?\" + // Minute (optional)\n \"(\\\\d{2})?\" + // Second (optional)\n \"([Z|+|-])?\" + // Universal time relation (optional)\n \"(\\\\d{2})?\" + // Offset hour (optional)\n \"'?\" + // Splitting apostrophe (optional)\n \"(\\\\d{2})?\" + // Offset minute (optional)\n \"'?\" // Trailing apostrophe (optional)\n );\n\n // Optional fields that don't satisfy the requirements from the regular\n // expression (such as incorrect digit counts or numbers that are out of\n // range) will fall back the defaults from the specification.\n const matches = this.#regex.exec(input);\n if (!matches) {\n return null;\n }\n\n // JavaScript's `Date` object expects the month to be between 0 and 11\n // instead of 1 and 12, so we have to correct for that.\n const year = parseInt(matches[1], 10);\n let month = parseInt(matches[2], 10);\n month = month >= 1 && month <= 12 ? month - 1 : 0;\n let day = parseInt(matches[3], 10);\n day = day >= 1 && day <= 31 ? day : 1;\n let hour = parseInt(matches[4], 10);\n hour = hour >= 0 && hour <= 23 ? hour : 0;\n let minute = parseInt(matches[5], 10);\n minute = minute >= 0 && minute <= 59 ? minute : 0;\n let second = parseInt(matches[6], 10);\n second = second >= 0 && second <= 59 ? second : 0;\n const universalTimeRelation = matches[7] || \"Z\";\n let offsetHour = parseInt(matches[8], 10);\n offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;\n let offsetMinute = parseInt(matches[9], 10) || 0;\n offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;\n\n // Universal time relation 'Z' means that the local time is equal to the\n // universal time, whereas the relations '+'/'-' indicate that the local\n // time is later respectively earlier than the universal time. Every date\n // is normalized to universal time.\n if (universalTimeRelation === \"-\") {\n hour += offsetHour;\n minute += offsetMinute;\n } else if (universalTimeRelation === \"+\") {\n hour -= offsetHour;\n minute -= offsetMinute;\n }\n\n return new Date(Date.UTC(year, month, day, hour, minute, second));\n }\n}\n\n/**\n * NOTE: This is (mostly) intended to support printing of XFA forms.\n */\nfunction getXfaPageViewport(xfaPage, { scale = 1, rotation = 0 }) {\n const { width, height } = xfaPage.attributes.style;\n const viewBox = [0, 0, parseInt(width), parseInt(height)];\n\n return new PageViewport({\n viewBox,\n userUnit: 1,\n scale,\n rotation,\n });\n}\n\nfunction getRGB(color) {\n if (color.startsWith(\"#\")) {\n const colorRGB = parseInt(color.slice(1), 16);\n return [\n (colorRGB & 0xff0000) >> 16,\n (colorRGB & 0x00ff00) >> 8,\n colorRGB & 0x0000ff,\n ];\n }\n\n if (color.startsWith(\"rgb(\")) {\n // getComputedStyle(...).color returns a `rgb(R, G, B)` color.\n return color\n .slice(/* \"rgb(\".length */ 4, -1) // Strip out \"rgb(\" and \")\".\n .split(\",\")\n .map(x => parseInt(x));\n }\n\n if (color.startsWith(\"rgba(\")) {\n return color\n .slice(/* \"rgba(\".length */ 5, -1) // Strip out \"rgba(\" and \")\".\n .split(\",\")\n .map(x => parseInt(x))\n .slice(0, 3);\n }\n\n warn(`Not a valid color format: \"${color}\"`);\n return [0, 0, 0];\n}\n\nfunction getColorValues(colors) {\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n // NOTE: The following does *not* affect `forced-colors: active` mode.\n span.style.colorScheme = \"only light\";\n document.body.append(span);\n for (const name of colors.keys()) {\n span.style.color = name;\n const computedColor = window.getComputedStyle(span).color;\n colors.set(name, getRGB(computedColor));\n }\n span.remove();\n}\n\nfunction getCurrentTransform(ctx) {\n const { a, b, c, d, e, f } = ctx.getTransform();\n return [a, b, c, d, e, f];\n}\n\nfunction getCurrentTransformInverse(ctx) {\n const { a, b, c, d, e, f } = ctx.getTransform().invertSelf();\n return [a, b, c, d, e, f];\n}\n\n/**\n * @param {HTMLDivElement} div\n * @param {PageViewport} viewport\n * @param {boolean} mustFlip\n * @param {boolean} mustRotate\n */\nfunction setLayerDimensions(\n div,\n viewport,\n mustFlip = false,\n mustRotate = true\n) {\n if (viewport instanceof PageViewport) {\n const { pageWidth, pageHeight } = viewport.rawDims;\n const { style } = div;\n const useRound = FeatureTest.isCSSRoundSupported;\n\n const w = `var(--total-scale-factor) * ${pageWidth}px`,\n h = `var(--total-scale-factor) * ${pageHeight}px`;\n const widthStr = useRound\n ? `round(down, ${w}, var(--scale-round-x))`\n : `calc(${w})`,\n heightStr = useRound\n ? `round(down, ${h}, var(--scale-round-y))`\n : `calc(${h})`;\n\n if (!mustFlip || viewport.rotation % 180 === 0) {\n style.width = widthStr;\n style.height = heightStr;\n } else {\n style.width = heightStr;\n style.height = widthStr;\n }\n }\n\n if (mustRotate) {\n div.setAttribute(\"data-main-rotation\", viewport.rotation);\n }\n}\n\n/**\n * Scale factors for the canvas, necessary with HiDPI displays.\n */\nclass OutputScale {\n constructor() {\n const { pixelRatio } = OutputScale;\n\n /**\n * @type {number} Horizontal scale.\n */\n this.sx = pixelRatio;\n\n /**\n * @type {number} Vertical scale.\n */\n this.sy = pixelRatio;\n }\n\n /**\n * @type {boolean} Returns `true` when scaling is required, `false` otherwise.\n */\n get scaled() {\n return this.sx !== 1 || this.sy !== 1;\n }\n\n /**\n * @type {boolean} Returns `true` when scaling is symmetric,\n * `false` otherwise.\n */\n get symmetric() {\n return this.sx === this.sy;\n }\n\n /**\n * @returns {boolean} Returns `true` if scaling was limited,\n * `false` otherwise.\n */\n limitCanvas(width, height, maxPixels, maxDim) {\n let maxAreaScale = Infinity,\n maxWidthScale = Infinity,\n maxHeightScale = Infinity;\n\n if (maxPixels > 0) {\n maxAreaScale = Math.sqrt(maxPixels / (width * height));\n }\n if (maxDim !== -1) {\n maxWidthScale = maxDim / width;\n maxHeightScale = maxDim / height;\n }\n const maxScale = Math.min(maxAreaScale, maxWidthScale, maxHeightScale);\n\n if (this.sx > maxScale || this.sy > maxScale) {\n this.sx = maxScale;\n this.sy = maxScale;\n return true;\n }\n return false;\n }\n\n static get pixelRatio() {\n return globalThis.devicePixelRatio || 1;\n }\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types\n// to know which types are supported by the browser.\nconst SupportedImageMimeTypes = [\n \"image/apng\",\n \"image/avif\",\n \"image/bmp\",\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/svg+xml\",\n \"image/webp\",\n \"image/x-icon\",\n];\n\nexport {\n deprecated,\n fetchData,\n getColorValues,\n getCurrentTransform,\n getCurrentTransformInverse,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n getRGB,\n getXfaPageViewport,\n isDataScheme,\n isPdfFile,\n isValidFetchUrl,\n noContextMenu,\n OutputScale,\n PageViewport,\n PDFDateString,\n PixelsPerInch,\n RenderingCancelledException,\n setLayerDimensions,\n StatTimer,\n stopEvent,\n SupportedImageMimeTypes,\n SVG_NS,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\n\nclass EditorToolbar {\n #toolbar = null;\n\n #colorPicker = null;\n\n #editor;\n\n #buttons = null;\n\n #altText = null;\n\n #signatureDescriptionButton = null;\n\n static #l10nRemove = null;\n\n constructor(editor) {\n this.#editor = editor;\n\n EditorToolbar.#l10nRemove ||= Object.freeze({\n freetext: \"pdfjs-editor-remove-freetext-button\",\n highlight: \"pdfjs-editor-remove-highlight-button\",\n ink: \"pdfjs-editor-remove-ink-button\",\n stamp: \"pdfjs-editor-remove-stamp-button\",\n signature: \"pdfjs-editor-remove-signature-button\",\n });\n }\n\n render() {\n const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n editToolbar.classList.add(\"editToolbar\", \"hidden\");\n editToolbar.setAttribute(\"role\", \"toolbar\");\n const signal = this.#editor._uiManager._signal;\n editToolbar.addEventListener(\"contextmenu\", noContextMenu, { signal });\n editToolbar.addEventListener(\"pointerdown\", EditorToolbar.#pointerDown, {\n signal,\n });\n\n const buttons = (this.#buttons = document.createElement(\"div\"));\n buttons.className = \"buttons\";\n editToolbar.append(buttons);\n\n const position = this.#editor.toolbarPosition;\n if (position) {\n const { style } = editToolbar;\n const x =\n this.#editor._uiManager.direction === \"ltr\"\n ? 1 - position[0]\n : position[0];\n style.insetInlineEnd = `${100 * x}%`;\n style.top = `calc(${\n 100 * position[1]\n }% + var(--editor-toolbar-vert-offset))`;\n }\n\n this.#addDeleteButton();\n\n return editToolbar;\n }\n\n get div() {\n return this.#toolbar;\n }\n\n static #pointerDown(e) {\n e.stopPropagation();\n }\n\n #focusIn(e) {\n this.#editor._focusEventsAllowed = false;\n stopEvent(e);\n }\n\n #focusOut(e) {\n this.#editor._focusEventsAllowed = true;\n stopEvent(e);\n }\n\n #addListenersToElement(element) {\n // If we're clicking on a button with the keyboard or with\n // the mouse, we don't want to trigger any focus events on\n // the editor.\n const signal = this.#editor._uiManager._signal;\n element.addEventListener(\"focusin\", this.#focusIn.bind(this), {\n capture: true,\n signal,\n });\n element.addEventListener(\"focusout\", this.#focusOut.bind(this), {\n capture: true,\n signal,\n });\n element.addEventListener(\"contextmenu\", noContextMenu, { signal });\n }\n\n hide() {\n this.#toolbar.classList.add(\"hidden\");\n this.#colorPicker?.hideDropdown();\n }\n\n show() {\n this.#toolbar.classList.remove(\"hidden\");\n this.#altText?.shown();\n }\n\n #addDeleteButton() {\n const { editorType, _uiManager } = this.#editor;\n\n const button = document.createElement(\"button\");\n button.className = \"delete\";\n button.tabIndex = 0;\n button.setAttribute(\"data-l10n-id\", EditorToolbar.#l10nRemove[editorType]);\n this.#addListenersToElement(button);\n button.addEventListener(\n \"click\",\n e => {\n _uiManager.delete();\n },\n { signal: _uiManager._signal }\n );\n this.#buttons.append(button);\n }\n\n get #divider() {\n const divider = document.createElement(\"div\");\n divider.className = \"divider\";\n return divider;\n }\n\n async addAltText(altText) {\n const button = await altText.render();\n this.#addListenersToElement(button);\n this.#buttons.prepend(button, this.#divider);\n this.#altText = altText;\n }\n\n addColorPicker(colorPicker) {\n this.#colorPicker = colorPicker;\n const button = colorPicker.renderButton();\n this.#addListenersToElement(button);\n this.#buttons.prepend(button, this.#divider);\n }\n\n async addEditSignatureButton(signatureManager) {\n const button = (this.#signatureDescriptionButton =\n await signatureManager.renderEditButton(this.#editor));\n this.#addListenersToElement(button);\n this.#buttons.prepend(button, this.#divider);\n }\n\n updateEditSignatureButton(description) {\n if (this.#signatureDescriptionButton) {\n this.#signatureDescriptionButton.title = description;\n }\n }\n\n remove() {\n this.#toolbar.remove();\n this.#colorPicker?.destroy();\n this.#colorPicker = null;\n }\n}\n\nclass HighlightToolbar {\n #buttons = null;\n\n #toolbar = null;\n\n #uiManager;\n\n constructor(uiManager) {\n this.#uiManager = uiManager;\n }\n\n #render() {\n const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n editToolbar.className = \"editToolbar\";\n editToolbar.setAttribute(\"role\", \"toolbar\");\n editToolbar.addEventListener(\"contextmenu\", noContextMenu, {\n signal: this.#uiManager._signal,\n });\n\n const buttons = (this.#buttons = document.createElement(\"div\"));\n buttons.className = \"buttons\";\n editToolbar.append(buttons);\n\n this.#addHighlightButton();\n\n return editToolbar;\n }\n\n #getLastPoint(boxes, isLTR) {\n let lastY = 0;\n let lastX = 0;\n for (const box of boxes) {\n const y = box.y + box.height;\n if (y < lastY) {\n continue;\n }\n const x = box.x + (isLTR ? box.width : 0);\n if (y > lastY) {\n lastX = x;\n lastY = y;\n continue;\n }\n if (isLTR) {\n if (x > lastX) {\n lastX = x;\n }\n } else if (x < lastX) {\n lastX = x;\n }\n }\n return [isLTR ? 1 - lastX : lastX, lastY];\n }\n\n show(parent, boxes, isLTR) {\n const [x, y] = this.#getLastPoint(boxes, isLTR);\n const { style } = (this.#toolbar ||= this.#render());\n parent.append(this.#toolbar);\n style.insetInlineEnd = `${100 * x}%`;\n style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`;\n }\n\n hide() {\n this.#toolbar.remove();\n }\n\n #addHighlightButton() {\n const button = document.createElement(\"button\");\n button.className = \"highlightButton\";\n button.tabIndex = 0;\n button.setAttribute(\"data-l10n-id\", `pdfjs-highlight-floating-button1`);\n const span = document.createElement(\"span\");\n button.append(span);\n span.className = \"visuallyHidden\";\n span.setAttribute(\"data-l10n-id\", \"pdfjs-highlight-floating-button-label\");\n const signal = this.#uiManager._signal;\n button.addEventListener(\"contextmenu\", noContextMenu, { signal });\n button.addEventListener(\n \"click\",\n () => {\n this.#uiManager.highlightSelection(\"floating_button\");\n },\n { signal }\n );\n this.#buttons.append(button);\n }\n}\n\nexport { EditorToolbar, HighlightToolbar };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./editor.js\").AnnotationEditor} AnnotationEditor */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n AnnotationEditorParamsType,\n AnnotationEditorPrefix,\n AnnotationEditorType,\n FeatureTest,\n getUuid,\n shadow,\n Util,\n warn,\n} from \"../../shared/util.js\";\nimport {\n fetchData,\n getColorValues,\n getRGB,\n PixelsPerInch,\n stopEvent,\n} from \"../display_utils.js\";\nimport { HighlightToolbar } from \"./toolbar.js\";\n\nfunction bindEvents(obj, element, names) {\n for (const name of names) {\n element.addEventListener(name, obj[name].bind(obj));\n }\n}\n\n/**\n * Class to create some unique ids for the different editors.\n */\nclass IdManager {\n #id = 0;\n\n constructor() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n Object.defineProperty(this, \"reset\", {\n value: () => (this.#id = 0),\n });\n }\n }\n\n /**\n * Get a unique id.\n * @returns {string}\n */\n get id() {\n return `${AnnotationEditorPrefix}${this.#id++}`;\n }\n}\n\n/**\n * Class to manage the images used by the editors.\n * The main idea is to try to minimize the memory used by the images.\n * The images are cached and reused when possible\n * We use a refCounter to know when an image is not used anymore but we need to\n * be able to restore an image after a remove+undo, so we keep a file reference\n * or an url one.\n */\nclass ImageManager {\n #baseId = getUuid();\n\n #id = 0;\n\n #cache = null;\n\n static get _isSVGFittingCanvas() {\n // By default, Firefox doesn't rescale without preserving the aspect ratio\n // when drawing an SVG image on a canvas, see https://bugzilla.mozilla.org/1547776.\n // The \"workaround\" is to append \"svgView(preserveAspectRatio(none))\" to the\n // url, but according to comment #15, it seems that it leads to unexpected\n // behavior in Safari.\n const svg = `data:image/svg+xml;charset=UTF-8,`;\n const canvas = new OffscreenCanvas(1, 3);\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n const image = new Image();\n image.src = svg;\n const promise = image.decode().then(() => {\n ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3);\n return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0;\n });\n\n return shadow(this, \"_isSVGFittingCanvas\", promise);\n }\n\n async #get(key, rawData) {\n this.#cache ||= new Map();\n let data = this.#cache.get(key);\n if (data === null) {\n // We already tried to load the image but it failed.\n return null;\n }\n if (data?.bitmap) {\n data.refCounter += 1;\n return data;\n }\n try {\n data ||= {\n bitmap: null,\n id: `image_${this.#baseId}_${this.#id++}`,\n refCounter: 0,\n isSvg: false,\n };\n let image;\n if (typeof rawData === \"string\") {\n data.url = rawData;\n image = await fetchData(rawData, \"blob\");\n } else if (rawData instanceof File) {\n image = data.file = rawData;\n } else if (rawData instanceof Blob) {\n image = rawData;\n }\n\n if (image.type === \"image/svg+xml\") {\n // Unfortunately, createImageBitmap doesn't work with SVG images.\n // (see https://bugzilla.mozilla.org/1841972).\n const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas;\n const fileReader = new FileReader();\n const imageElement = new Image();\n const imagePromise = new Promise((resolve, reject) => {\n imageElement.onload = () => {\n data.bitmap = imageElement;\n data.isSvg = true;\n resolve();\n };\n fileReader.onload = async () => {\n const url = (data.svgUrl = fileReader.result);\n // We need to set the preserveAspectRatio to none in order to let\n // the image fits the canvas when resizing.\n imageElement.src = (await mustRemoveAspectRatioPromise)\n ? `${url}#svgView(preserveAspectRatio(none))`\n : url;\n };\n imageElement.onerror = fileReader.onerror = reject;\n });\n fileReader.readAsDataURL(image);\n await imagePromise;\n } else {\n data.bitmap = await createImageBitmap(image);\n }\n data.refCounter = 1;\n } catch (e) {\n warn(e);\n data = null;\n }\n this.#cache.set(key, data);\n if (data) {\n this.#cache.set(data.id, data);\n }\n return data;\n }\n\n async getFromFile(file) {\n const { lastModified, name, size, type } = file;\n return this.#get(`${lastModified}_${name}_${size}_${type}`, file);\n }\n\n async getFromUrl(url) {\n return this.#get(url, url);\n }\n\n async getFromBlob(id, blobPromise) {\n const blob = await blobPromise;\n return this.#get(id, blob);\n }\n\n async getFromId(id) {\n this.#cache ||= new Map();\n const data = this.#cache.get(id);\n if (!data) {\n return null;\n }\n if (data.bitmap) {\n data.refCounter += 1;\n return data;\n }\n\n if (data.file) {\n return this.getFromFile(data.file);\n }\n if (data.blobPromise) {\n const { blobPromise } = data;\n delete data.blobPromise;\n return this.getFromBlob(data.id, blobPromise);\n }\n return this.getFromUrl(data.url);\n }\n\n getFromCanvas(id, canvas) {\n this.#cache ||= new Map();\n let data = this.#cache.get(id);\n if (data?.bitmap) {\n data.refCounter += 1;\n return data;\n }\n const offscreen = new OffscreenCanvas(canvas.width, canvas.height);\n const ctx = offscreen.getContext(\"2d\");\n ctx.drawImage(canvas, 0, 0);\n data = {\n bitmap: offscreen.transferToImageBitmap(),\n id: `image_${this.#baseId}_${this.#id++}`,\n refCounter: 1,\n isSvg: false,\n };\n this.#cache.set(id, data);\n this.#cache.set(data.id, data);\n return data;\n }\n\n getSvgUrl(id) {\n const data = this.#cache.get(id);\n if (!data?.isSvg) {\n return null;\n }\n return data.svgUrl;\n }\n\n deleteId(id) {\n this.#cache ||= new Map();\n const data = this.#cache.get(id);\n if (!data) {\n return;\n }\n data.refCounter -= 1;\n if (data.refCounter !== 0) {\n return;\n }\n const { bitmap } = data;\n if (!data.url && !data.file) {\n // The image has no way to be restored (ctrl+z) so we must fix that.\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext(\"bitmaprenderer\");\n ctx.transferFromImageBitmap(bitmap);\n data.blobPromise = canvas.convertToBlob();\n }\n\n bitmap.close?.();\n data.bitmap = null;\n }\n\n // We can use the id only if it belongs this manager.\n // We must take care of having the right manager because we can copy/paste\n // some images from other documents, hence it'd be a pity to use an id from an\n // other manager.\n isValidId(id) {\n return id.startsWith(`image_${this.#baseId}_`);\n }\n}\n\n/**\n * Class to handle undo/redo.\n * Commands are just saved in a buffer.\n * If we hit some memory issues we could likely use a circular buffer.\n * It has to be used as a singleton.\n */\nclass CommandManager {\n #commands = [];\n\n #locked = false;\n\n #maxSize;\n\n #position = -1;\n\n constructor(maxSize = 128) {\n this.#maxSize = maxSize;\n }\n\n /**\n * @typedef {Object} addOptions\n * @property {function} cmd\n * @property {function} undo\n * @property {function} [post]\n * @property {boolean} mustExec\n * @property {number} type\n * @property {boolean} overwriteIfSameType\n * @property {boolean} keepUndo\n */\n\n /**\n * Add a new couple of commands to be used in case of redo/undo.\n * @param {addOptions} options\n */\n add({\n cmd,\n undo,\n post,\n mustExec,\n type = NaN,\n overwriteIfSameType = false,\n keepUndo = false,\n }) {\n if (mustExec) {\n cmd();\n }\n\n if (this.#locked) {\n return;\n }\n\n const save = { cmd, undo, post, type };\n if (this.#position === -1) {\n if (this.#commands.length > 0) {\n // All the commands have been undone and then a new one is added\n // hence we clear the queue.\n this.#commands.length = 0;\n }\n this.#position = 0;\n this.#commands.push(save);\n return;\n }\n\n if (overwriteIfSameType && this.#commands[this.#position].type === type) {\n // For example when we change a color we don't want to\n // be able to undo all the steps, hence we only want to\n // keep the last undoable action in this sequence of actions.\n if (keepUndo) {\n save.undo = this.#commands[this.#position].undo;\n }\n this.#commands[this.#position] = save;\n return;\n }\n\n const next = this.#position + 1;\n if (next === this.#maxSize) {\n this.#commands.splice(0, 1);\n } else {\n this.#position = next;\n if (next < this.#commands.length) {\n this.#commands.splice(next);\n }\n }\n\n this.#commands.push(save);\n }\n\n /**\n * Undo the last command.\n */\n undo() {\n if (this.#position === -1) {\n // Nothing to undo.\n return;\n }\n\n // Avoid to insert something during the undo execution.\n this.#locked = true;\n const { undo, post } = this.#commands[this.#position];\n undo();\n post?.();\n this.#locked = false;\n\n this.#position -= 1;\n }\n\n /**\n * Redo the last command.\n */\n redo() {\n if (this.#position < this.#commands.length - 1) {\n this.#position += 1;\n\n // Avoid to insert something during the redo execution.\n this.#locked = true;\n const { cmd, post } = this.#commands[this.#position];\n cmd();\n post?.();\n this.#locked = false;\n }\n }\n\n /**\n * Check if there is something to undo.\n * @returns {boolean}\n */\n hasSomethingToUndo() {\n return this.#position !== -1;\n }\n\n /**\n * Check if there is something to redo.\n * @returns {boolean}\n */\n hasSomethingToRedo() {\n return this.#position < this.#commands.length - 1;\n }\n\n cleanType(type) {\n if (this.#position === -1) {\n return;\n }\n for (let i = this.#position; i >= 0; i--) {\n if (this.#commands[i].type !== type) {\n this.#commands.splice(i + 1, this.#position - i);\n this.#position = i;\n return;\n }\n }\n this.#commands.length = 0;\n this.#position = -1;\n }\n\n destroy() {\n this.#commands = null;\n }\n}\n\n/**\n * Class to handle the different keyboards shortcuts we can have on mac or\n * non-mac OSes.\n */\nclass KeyboardManager {\n /**\n * Create a new keyboard manager class.\n * @param {Array} callbacks - an array containing an array of shortcuts\n * and a callback to call.\n * A shortcut is a string like `ctrl+c` or `mac+ctrl+c` for mac OS.\n */\n constructor(callbacks) {\n this.buffer = [];\n this.callbacks = new Map();\n this.allKeys = new Set();\n\n const { isMac } = FeatureTest.platform;\n for (const [keys, callback, options = {}] of callbacks) {\n for (const key of keys) {\n const isMacKey = key.startsWith(\"mac+\");\n if (isMac && isMacKey) {\n this.callbacks.set(key.slice(4), { callback, options });\n this.allKeys.add(key.split(\"+\").at(-1));\n } else if (!isMac && !isMacKey) {\n this.callbacks.set(key, { callback, options });\n this.allKeys.add(key.split(\"+\").at(-1));\n }\n }\n }\n }\n\n /**\n * Serialize an event into a string in order to match a\n * potential key for a callback.\n * @param {KeyboardEvent} event\n * @returns {string}\n */\n #serialize(event) {\n if (event.altKey) {\n this.buffer.push(\"alt\");\n }\n if (event.ctrlKey) {\n this.buffer.push(\"ctrl\");\n }\n if (event.metaKey) {\n this.buffer.push(\"meta\");\n }\n if (event.shiftKey) {\n this.buffer.push(\"shift\");\n }\n this.buffer.push(event.key);\n const str = this.buffer.join(\"+\");\n this.buffer.length = 0;\n\n return str;\n }\n\n /**\n * Execute a callback, if any, for a given keyboard event.\n * The self is used as `this` in the callback.\n * @param {Object} self\n * @param {KeyboardEvent} event\n * @returns\n */\n exec(self, event) {\n if (!this.allKeys.has(event.key)) {\n return;\n }\n const info = this.callbacks.get(this.#serialize(event));\n if (!info) {\n return;\n }\n const {\n callback,\n options: { bubbles = false, args = [], checker = null },\n } = info;\n\n if (checker && !checker(self, event)) {\n return;\n }\n callback.bind(self, ...args, event)();\n\n // For example, ctrl+s in a FreeText must be handled by the viewer, hence\n // the event must bubble.\n if (!bubbles) {\n stopEvent(event);\n }\n }\n}\n\nclass ColorManager {\n static _colorsMapping = new Map([\n [\"CanvasText\", [0, 0, 0]],\n [\"Canvas\", [255, 255, 255]],\n ]);\n\n get _colors() {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof document === \"undefined\"\n ) {\n return shadow(this, \"_colors\", ColorManager._colorsMapping);\n }\n\n const colors = new Map([\n [\"CanvasText\", null],\n [\"Canvas\", null],\n ]);\n getColorValues(colors);\n return shadow(this, \"_colors\", colors);\n }\n\n /**\n * In High Contrast Mode, the color on the screen is not always the\n * real color used in the pdf.\n * For example in some cases white can appear to be black but when saving\n * we want to have white.\n * @param {string} color\n * @returns {Array}\n */\n convert(color) {\n const rgb = getRGB(color);\n if (!window.matchMedia(\"(forced-colors: active)\").matches) {\n return rgb;\n }\n\n for (const [name, RGB] of this._colors) {\n if (RGB.every((x, i) => x === rgb[i])) {\n return ColorManager._colorsMapping.get(name);\n }\n }\n return rgb;\n }\n\n /**\n * An input element must have its color value as a hex string\n * and not as color name.\n * So this function converts a name into an hex string.\n * @param {string} name\n * @returns {string}\n */\n getHexCode(name) {\n const rgb = this._colors.get(name);\n if (!rgb) {\n return name;\n }\n return Util.makeHexColor(...rgb);\n }\n}\n\n/**\n * A pdf has several pages and each of them when it will rendered\n * will have an AnnotationEditorLayer which will contain the some\n * new Annotations associated to an editor in order to modify them.\n *\n * This class is used to manage all the different layers, editors and\n * some action like copy/paste, undo/redo, ...\n */\nclass AnnotationEditorUIManager {\n #abortController = new AbortController();\n\n #activeEditor = null;\n\n #allEditors = new Map();\n\n #allLayers = new Map();\n\n #altTextManager = null;\n\n #annotationStorage = null;\n\n #changedExistingAnnotations = null;\n\n #commandManager = new CommandManager();\n\n #copyPasteAC = null;\n\n #currentDrawingSession = null;\n\n #currentPageIndex = 0;\n\n #deletedAnnotationsElementIds = new Set();\n\n #draggingEditors = null;\n\n #editorTypes = null;\n\n #editorsToRescale = new Set();\n\n _editorUndoBar = null;\n\n #enableHighlightFloatingButton = false;\n\n #enableUpdatedAddImage = false;\n\n #enableNewAltTextWhenAddingImage = false;\n\n #filterFactory = null;\n\n #focusMainContainerTimeoutId = null;\n\n #focusManagerAC = null;\n\n #highlightColors = null;\n\n #highlightWhenShiftUp = false;\n\n #highlightToolbar = null;\n\n #idManager = new IdManager();\n\n #isEnabled = false;\n\n #isWaiting = false;\n\n #keyboardManagerAC = null;\n\n #lastActiveElement = null;\n\n #mainHighlightColorPicker = null;\n\n #missingCanvases = null;\n\n #mlManager = null;\n\n #mode = AnnotationEditorType.NONE;\n\n #selectedEditors = new Set();\n\n #selectedTextNode = null;\n\n #signatureManager = null;\n\n #pageColors = null;\n\n #showAllStates = null;\n\n #previousStates = {\n isEditing: false,\n isEmpty: true,\n hasSomethingToUndo: false,\n hasSomethingToRedo: false,\n hasSelectedEditor: false,\n hasSelectedText: false,\n };\n\n #translation = [0, 0];\n\n #translationTimeoutId = null;\n\n #container = null;\n\n #viewer = null;\n\n #updateModeCapability = null;\n\n static TRANSLATE_SMALL = 1; // page units.\n\n static TRANSLATE_BIG = 10; // page units.\n\n static get _keyboardManager() {\n const proto = AnnotationEditorUIManager.prototype;\n\n /**\n * If the focused element is an input, we don't want to handle the arrow.\n * For example, sliders can be controlled with the arrow keys.\n */\n const arrowChecker = self =>\n self.#container.contains(document.activeElement) &&\n document.activeElement.tagName !== \"BUTTON\" &&\n self.hasSomethingToControl();\n\n const textInputChecker = (_self, { target: el }) => {\n if (el instanceof HTMLInputElement) {\n const { type } = el;\n return type !== \"text\" && type !== \"number\";\n }\n return true;\n };\n\n const small = this.TRANSLATE_SMALL;\n const big = this.TRANSLATE_BIG;\n\n return shadow(\n this,\n \"_keyboardManager\",\n new KeyboardManager([\n [\n [\"ctrl+a\", \"mac+meta+a\"],\n proto.selectAll,\n { checker: textInputChecker },\n ],\n [[\"ctrl+z\", \"mac+meta+z\"], proto.undo, { checker: textInputChecker }],\n [\n // On mac, depending of the OS version, the event.key is either \"z\" or\n // \"Z\" when the user presses \"meta+shift+z\".\n [\n \"ctrl+y\",\n \"ctrl+shift+z\",\n \"mac+meta+shift+z\",\n \"ctrl+shift+Z\",\n \"mac+meta+shift+Z\",\n ],\n proto.redo,\n { checker: textInputChecker },\n ],\n [\n [\n \"Backspace\",\n \"alt+Backspace\",\n \"ctrl+Backspace\",\n \"shift+Backspace\",\n \"mac+Backspace\",\n \"mac+alt+Backspace\",\n \"mac+ctrl+Backspace\",\n \"Delete\",\n \"ctrl+Delete\",\n \"shift+Delete\",\n \"mac+Delete\",\n ],\n proto.delete,\n { checker: textInputChecker },\n ],\n [\n [\"Enter\", \"mac+Enter\"],\n proto.addNewEditorFromKeyboard,\n {\n // Those shortcuts can be used in the toolbar for some other actions\n // like zooming, hence we need to check if the container has the\n // focus.\n checker: (self, { target: el }) =>\n !(el instanceof HTMLButtonElement) &&\n self.#container.contains(el) &&\n !self.isEnterHandled,\n },\n ],\n [\n [\" \", \"mac+ \"],\n proto.addNewEditorFromKeyboard,\n {\n // Those shortcuts can be used in the toolbar for some other actions\n // like zooming, hence we need to check if the container has the\n // focus.\n checker: (self, { target: el }) =>\n !(el instanceof HTMLButtonElement) &&\n self.#container.contains(document.activeElement),\n },\n ],\n [[\"Escape\", \"mac+Escape\"], proto.unselectAll],\n [\n [\"ArrowLeft\", \"mac+ArrowLeft\"],\n proto.translateSelectedEditors,\n { args: [-small, 0], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n proto.translateSelectedEditors,\n { args: [-big, 0], checker: arrowChecker },\n ],\n [\n [\"ArrowRight\", \"mac+ArrowRight\"],\n proto.translateSelectedEditors,\n { args: [small, 0], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n proto.translateSelectedEditors,\n { args: [big, 0], checker: arrowChecker },\n ],\n [\n [\"ArrowUp\", \"mac+ArrowUp\"],\n proto.translateSelectedEditors,\n { args: [0, -small], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"],\n proto.translateSelectedEditors,\n { args: [0, -big], checker: arrowChecker },\n ],\n [\n [\"ArrowDown\", \"mac+ArrowDown\"],\n proto.translateSelectedEditors,\n { args: [0, small], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"],\n proto.translateSelectedEditors,\n { args: [0, big], checker: arrowChecker },\n ],\n ])\n );\n }\n\n constructor(\n container,\n viewer,\n altTextManager,\n signatureManager,\n eventBus,\n pdfDocument,\n pageColors,\n highlightColors,\n enableHighlightFloatingButton,\n enableUpdatedAddImage,\n enableNewAltTextWhenAddingImage,\n mlManager,\n editorUndoBar,\n supportsPinchToZoom\n ) {\n const signal = (this._signal = this.#abortController.signal);\n this.#container = container;\n this.#viewer = viewer;\n this.#altTextManager = altTextManager;\n this.#signatureManager = signatureManager;\n this._eventBus = eventBus;\n eventBus._on(\"editingaction\", this.onEditingAction.bind(this), { signal });\n eventBus._on(\"pagechanging\", this.onPageChanging.bind(this), { signal });\n eventBus._on(\"scalechanging\", this.onScaleChanging.bind(this), { signal });\n eventBus._on(\"rotationchanging\", this.onRotationChanging.bind(this), {\n signal,\n });\n eventBus._on(\"setpreference\", this.onSetPreference.bind(this), { signal });\n eventBus._on(\n \"switchannotationeditorparams\",\n evt => this.updateParams(evt.type, evt.value),\n { signal }\n );\n this.#addSelectionListener();\n this.#addDragAndDropListeners();\n this.#addKeyboardManager();\n this.#annotationStorage = pdfDocument.annotationStorage;\n this.#filterFactory = pdfDocument.filterFactory;\n this.#pageColors = pageColors;\n this.#highlightColors = highlightColors || null;\n this.#enableHighlightFloatingButton = enableHighlightFloatingButton;\n this.#enableUpdatedAddImage = enableUpdatedAddImage;\n this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage;\n this.#mlManager = mlManager || null;\n this.viewParameters = {\n realScale: PixelsPerInch.PDF_TO_CSS_UNITS,\n rotation: 0,\n };\n this.isShiftKeyDown = false;\n this._editorUndoBar = editorUndoBar || null;\n this._supportsPinchToZoom = supportsPinchToZoom !== false;\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n Object.defineProperty(this, \"reset\", {\n value: () => {\n this.selectAll();\n this.delete();\n this.#idManager.reset();\n },\n });\n }\n }\n\n destroy() {\n this.#updateModeCapability?.resolve();\n this.#updateModeCapability = null;\n\n this.#abortController?.abort();\n this.#abortController = null;\n this._signal = null;\n\n for (const layer of this.#allLayers.values()) {\n layer.destroy();\n }\n this.#allLayers.clear();\n this.#allEditors.clear();\n this.#editorsToRescale.clear();\n this.#missingCanvases?.clear();\n this.#activeEditor = null;\n this.#selectedEditors.clear();\n this.#commandManager.destroy();\n this.#altTextManager?.destroy();\n this.#signatureManager?.destroy();\n this.#highlightToolbar?.hide();\n this.#highlightToolbar = null;\n this.#mainHighlightColorPicker?.destroy();\n this.#mainHighlightColorPicker = null;\n if (this.#focusMainContainerTimeoutId) {\n clearTimeout(this.#focusMainContainerTimeoutId);\n this.#focusMainContainerTimeoutId = null;\n }\n if (this.#translationTimeoutId) {\n clearTimeout(this.#translationTimeoutId);\n this.#translationTimeoutId = null;\n }\n this._editorUndoBar?.destroy();\n }\n\n combinedSignal(ac) {\n return AbortSignal.any([this._signal, ac.signal]);\n }\n\n get mlManager() {\n return this.#mlManager;\n }\n\n get useNewAltTextFlow() {\n return this.#enableUpdatedAddImage;\n }\n\n get useNewAltTextWhenAddingImage() {\n return this.#enableNewAltTextWhenAddingImage;\n }\n\n get hcmFilter() {\n return shadow(\n this,\n \"hcmFilter\",\n this.#pageColors\n ? this.#filterFactory.addHCMFilter(\n this.#pageColors.foreground,\n this.#pageColors.background\n )\n : \"none\"\n );\n }\n\n get direction() {\n return shadow(\n this,\n \"direction\",\n getComputedStyle(this.#container).direction\n );\n }\n\n get highlightColors() {\n return shadow(\n this,\n \"highlightColors\",\n this.#highlightColors\n ? new Map(\n this.#highlightColors\n .split(\",\")\n .map(pair => pair.split(\"=\").map(x => x.trim()))\n )\n : null\n );\n }\n\n get highlightColorNames() {\n return shadow(\n this,\n \"highlightColorNames\",\n this.highlightColors\n ? new Map(Array.from(this.highlightColors, e => e.reverse()))\n : null\n );\n }\n\n /**\n * Set the current drawing session.\n * @param {AnnotationEditorLayer} layer\n */\n setCurrentDrawingSession(layer) {\n if (layer) {\n this.unselectAll();\n this.disableUserSelect(true);\n } else {\n this.disableUserSelect(false);\n }\n this.#currentDrawingSession = layer;\n }\n\n setMainHighlightColorPicker(colorPicker) {\n this.#mainHighlightColorPicker = colorPicker;\n }\n\n editAltText(editor, firstTime = false) {\n this.#altTextManager?.editAltText(this, editor, firstTime);\n }\n\n getSignature(editor) {\n this.#signatureManager?.getSignature({ uiManager: this, editor });\n }\n\n get signatureManager() {\n return this.#signatureManager;\n }\n\n switchToMode(mode, callback) {\n // Switching to a mode can be asynchronous.\n this._eventBus.on(\"annotationeditormodechanged\", callback, {\n once: true,\n signal: this._signal,\n });\n this._eventBus.dispatch(\"showannotationeditorui\", {\n source: this,\n mode,\n });\n }\n\n setPreference(name, value) {\n this._eventBus.dispatch(\"setpreference\", {\n source: this,\n name,\n value,\n });\n }\n\n onSetPreference({ name, value }) {\n switch (name) {\n case \"enableNewAltTextWhenAddingImage\":\n this.#enableNewAltTextWhenAddingImage = value;\n break;\n }\n }\n\n onPageChanging({ pageNumber }) {\n this.#currentPageIndex = pageNumber - 1;\n }\n\n focusMainContainer() {\n this.#container.focus();\n }\n\n findParent(x, y) {\n for (const layer of this.#allLayers.values()) {\n const {\n x: layerX,\n y: layerY,\n width,\n height,\n } = layer.div.getBoundingClientRect();\n if (\n x >= layerX &&\n x <= layerX + width &&\n y >= layerY &&\n y <= layerY + height\n ) {\n return layer;\n }\n }\n return null;\n }\n\n disableUserSelect(value = false) {\n this.#viewer.classList.toggle(\"noUserSelect\", value);\n }\n\n addShouldRescale(editor) {\n this.#editorsToRescale.add(editor);\n }\n\n removeShouldRescale(editor) {\n this.#editorsToRescale.delete(editor);\n }\n\n onScaleChanging({ scale }) {\n this.commitOrRemove();\n this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS;\n for (const editor of this.#editorsToRescale) {\n editor.onScaleChanging();\n }\n this.#currentDrawingSession?.onScaleChanging();\n }\n\n onRotationChanging({ pagesRotation }) {\n this.commitOrRemove();\n this.viewParameters.rotation = pagesRotation;\n }\n\n #getAnchorElementForSelection({ anchorNode }) {\n return anchorNode.nodeType === Node.TEXT_NODE\n ? anchorNode.parentElement\n : anchorNode;\n }\n\n #getLayerForTextLayer(textLayer) {\n const { currentLayer } = this;\n if (currentLayer.hasTextLayer(textLayer)) {\n return currentLayer;\n }\n for (const layer of this.#allLayers.values()) {\n if (layer.hasTextLayer(textLayer)) {\n return layer;\n }\n }\n return null;\n }\n\n highlightSelection(methodOfCreation = \"\") {\n const selection = document.getSelection();\n if (!selection || selection.isCollapsed) {\n return;\n }\n const { anchorNode, anchorOffset, focusNode, focusOffset } = selection;\n const text = selection.toString();\n const anchorElement = this.#getAnchorElementForSelection(selection);\n const textLayer = anchorElement.closest(\".textLayer\");\n const boxes = this.getSelectionBoxes(textLayer);\n if (!boxes) {\n return;\n }\n selection.empty();\n\n const layer = this.#getLayerForTextLayer(textLayer);\n const isNoneMode = this.#mode === AnnotationEditorType.NONE;\n const callback = () => {\n layer?.createAndAddNewEditor({ x: 0, y: 0 }, false, {\n methodOfCreation,\n boxes,\n anchorNode,\n anchorOffset,\n focusNode,\n focusOffset,\n text,\n });\n if (isNoneMode) {\n this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n }\n };\n if (isNoneMode) {\n this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback);\n return;\n }\n callback();\n }\n\n #displayHighlightToolbar() {\n const selection = document.getSelection();\n if (!selection || selection.isCollapsed) {\n return;\n }\n const anchorElement = this.#getAnchorElementForSelection(selection);\n const textLayer = anchorElement.closest(\".textLayer\");\n const boxes = this.getSelectionBoxes(textLayer);\n if (!boxes) {\n return;\n }\n this.#highlightToolbar ||= new HighlightToolbar(this);\n this.#highlightToolbar.show(textLayer, boxes, this.direction === \"ltr\");\n }\n\n /**\n * Add an editor in the annotation storage.\n * @param {AnnotationEditor} editor\n */\n addToAnnotationStorage(editor) {\n if (\n !editor.isEmpty() &&\n this.#annotationStorage &&\n !this.#annotationStorage.has(editor.id)\n ) {\n this.#annotationStorage.setValue(editor.id, editor);\n }\n }\n\n #selectionChange() {\n const selection = document.getSelection();\n if (!selection || selection.isCollapsed) {\n if (this.#selectedTextNode) {\n this.#highlightToolbar?.hide();\n this.#selectedTextNode = null;\n this.#dispatchUpdateStates({\n hasSelectedText: false,\n });\n }\n return;\n }\n const { anchorNode } = selection;\n if (anchorNode === this.#selectedTextNode) {\n return;\n }\n\n const anchorElement = this.#getAnchorElementForSelection(selection);\n const textLayer = anchorElement.closest(\".textLayer\");\n if (!textLayer) {\n if (this.#selectedTextNode) {\n this.#highlightToolbar?.hide();\n this.#selectedTextNode = null;\n this.#dispatchUpdateStates({\n hasSelectedText: false,\n });\n }\n return;\n }\n\n this.#highlightToolbar?.hide();\n this.#selectedTextNode = anchorNode;\n this.#dispatchUpdateStates({\n hasSelectedText: true,\n });\n\n if (\n this.#mode !== AnnotationEditorType.HIGHLIGHT &&\n this.#mode !== AnnotationEditorType.NONE\n ) {\n return;\n }\n\n if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n }\n\n this.#highlightWhenShiftUp = this.isShiftKeyDown;\n if (!this.isShiftKeyDown) {\n const activeLayer =\n this.#mode === AnnotationEditorType.HIGHLIGHT\n ? this.#getLayerForTextLayer(textLayer)\n : null;\n activeLayer?.toggleDrawing();\n\n const ac = new AbortController();\n const signal = this.combinedSignal(ac);\n\n const pointerup = e => {\n if (e.type === \"pointerup\" && e.button !== 0) {\n // Do nothing on right click.\n return;\n }\n ac.abort();\n activeLayer?.toggleDrawing(true);\n if (e.type === \"pointerup\") {\n this.#onSelectEnd(\"main_toolbar\");\n }\n };\n window.addEventListener(\"pointerup\", pointerup, { signal });\n window.addEventListener(\"blur\", pointerup, { signal });\n }\n }\n\n #onSelectEnd(methodOfCreation = \"\") {\n if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n this.highlightSelection(methodOfCreation);\n } else if (this.#enableHighlightFloatingButton) {\n this.#displayHighlightToolbar();\n }\n }\n\n #addSelectionListener() {\n document.addEventListener(\n \"selectionchange\",\n this.#selectionChange.bind(this),\n { signal: this._signal }\n );\n }\n\n #addFocusManager() {\n if (this.#focusManagerAC) {\n return;\n }\n this.#focusManagerAC = new AbortController();\n const signal = this.combinedSignal(this.#focusManagerAC);\n\n window.addEventListener(\"focus\", this.focus.bind(this), { signal });\n window.addEventListener(\"blur\", this.blur.bind(this), { signal });\n }\n\n #removeFocusManager() {\n this.#focusManagerAC?.abort();\n this.#focusManagerAC = null;\n }\n\n blur() {\n this.isShiftKeyDown = false;\n if (this.#highlightWhenShiftUp) {\n this.#highlightWhenShiftUp = false;\n this.#onSelectEnd(\"main_toolbar\");\n }\n if (!this.hasSelection) {\n return;\n }\n // When several editors are selected and the window loses focus, we want to\n // keep the last active element in order to be able to focus it again when\n // the window gets the focus back but we don't want to trigger any focus\n // callbacks else only one editor will be selected.\n const { activeElement } = document;\n for (const editor of this.#selectedEditors) {\n if (editor.div.contains(activeElement)) {\n this.#lastActiveElement = [editor, activeElement];\n editor._focusEventsAllowed = false;\n break;\n }\n }\n }\n\n focus() {\n if (!this.#lastActiveElement) {\n return;\n }\n const [lastEditor, lastActiveElement] = this.#lastActiveElement;\n this.#lastActiveElement = null;\n lastActiveElement.addEventListener(\n \"focusin\",\n () => {\n lastEditor._focusEventsAllowed = true;\n },\n { once: true, signal: this._signal }\n );\n lastActiveElement.focus();\n }\n\n #addKeyboardManager() {\n if (this.#keyboardManagerAC) {\n return;\n }\n this.#keyboardManagerAC = new AbortController();\n const signal = this.combinedSignal(this.#keyboardManagerAC);\n\n // The keyboard events are caught at the container level in order to be able\n // to execute some callbacks even if the current page doesn't have focus.\n window.addEventListener(\"keydown\", this.keydown.bind(this), { signal });\n window.addEventListener(\"keyup\", this.keyup.bind(this), { signal });\n }\n\n #removeKeyboardManager() {\n this.#keyboardManagerAC?.abort();\n this.#keyboardManagerAC = null;\n }\n\n #addCopyPasteListeners() {\n if (this.#copyPasteAC) {\n return;\n }\n this.#copyPasteAC = new AbortController();\n const signal = this.combinedSignal(this.#copyPasteAC);\n\n document.addEventListener(\"copy\", this.copy.bind(this), { signal });\n document.addEventListener(\"cut\", this.cut.bind(this), { signal });\n document.addEventListener(\"paste\", this.paste.bind(this), { signal });\n }\n\n #removeCopyPasteListeners() {\n this.#copyPasteAC?.abort();\n this.#copyPasteAC = null;\n }\n\n #addDragAndDropListeners() {\n const signal = this._signal;\n document.addEventListener(\"dragover\", this.dragOver.bind(this), { signal });\n document.addEventListener(\"drop\", this.drop.bind(this), { signal });\n }\n\n addEditListeners() {\n this.#addKeyboardManager();\n this.#addCopyPasteListeners();\n }\n\n removeEditListeners() {\n this.#removeKeyboardManager();\n this.#removeCopyPasteListeners();\n }\n\n dragOver(event) {\n for (const { type } of event.dataTransfer.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(type)) {\n event.dataTransfer.dropEffect = \"copy\";\n event.preventDefault();\n return;\n }\n }\n }\n }\n\n /**\n * Drop callback.\n * @param {DragEvent} event\n */\n drop(event) {\n for (const item of event.dataTransfer.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(item.type)) {\n editorType.paste(item, this.currentLayer);\n event.preventDefault();\n return;\n }\n }\n }\n }\n\n /**\n * Copy callback.\n * @param {ClipboardEvent} event\n */\n copy(event) {\n event.preventDefault();\n\n // An editor is being edited so just commit it.\n this.#activeEditor?.commitOrRemove();\n\n if (!this.hasSelection) {\n return;\n }\n\n const editors = [];\n for (const editor of this.#selectedEditors) {\n const serialized = editor.serialize(/* isForCopying = */ true);\n if (serialized) {\n editors.push(serialized);\n }\n }\n if (editors.length === 0) {\n return;\n }\n\n event.clipboardData.setData(\"application/pdfjs\", JSON.stringify(editors));\n }\n\n /**\n * Cut callback.\n * @param {ClipboardEvent} event\n */\n cut(event) {\n this.copy(event);\n this.delete();\n }\n\n /**\n * Paste callback.\n * @param {ClipboardEvent} event\n */\n async paste(event) {\n event.preventDefault();\n const { clipboardData } = event;\n for (const item of clipboardData.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(item.type)) {\n editorType.paste(item, this.currentLayer);\n return;\n }\n }\n }\n\n let data = clipboardData.getData(\"application/pdfjs\");\n if (!data) {\n return;\n }\n\n try {\n data = JSON.parse(data);\n } catch (ex) {\n warn(`paste: \"${ex.message}\".`);\n return;\n }\n\n if (!Array.isArray(data)) {\n return;\n }\n\n this.unselectAll();\n const layer = this.currentLayer;\n\n try {\n const newEditors = [];\n for (const editor of data) {\n const deserializedEditor = await layer.deserialize(editor);\n if (!deserializedEditor) {\n return;\n }\n newEditors.push(deserializedEditor);\n }\n\n const cmd = () => {\n for (const editor of newEditors) {\n this.#addEditorToLayer(editor);\n }\n this.#selectEditors(newEditors);\n };\n const undo = () => {\n for (const editor of newEditors) {\n editor.remove();\n }\n };\n this.addCommands({ cmd, undo, mustExec: true });\n } catch (ex) {\n warn(`paste: \"${ex.message}\".`);\n }\n }\n\n /**\n * Keydown callback.\n * @param {KeyboardEvent} event\n */\n keydown(event) {\n if (!this.isShiftKeyDown && event.key === \"Shift\") {\n this.isShiftKeyDown = true;\n }\n if (\n this.#mode !== AnnotationEditorType.NONE &&\n !this.isEditorHandlingKeyboard\n ) {\n AnnotationEditorUIManager._keyboardManager.exec(this, event);\n }\n }\n\n /**\n * Keyup callback.\n * @param {KeyboardEvent} event\n */\n keyup(event) {\n if (this.isShiftKeyDown && event.key === \"Shift\") {\n this.isShiftKeyDown = false;\n if (this.#highlightWhenShiftUp) {\n this.#highlightWhenShiftUp = false;\n this.#onSelectEnd(\"main_toolbar\");\n }\n }\n }\n\n /**\n * Execute an action for a given name.\n * For example, the user can click on the \"Undo\" entry in the context menu\n * and it'll trigger the undo action.\n */\n onEditingAction({ name }) {\n switch (name) {\n case \"undo\":\n case \"redo\":\n case \"delete\":\n case \"selectAll\":\n this[name]();\n break;\n case \"highlightSelection\":\n this.highlightSelection(\"context_menu\");\n break;\n }\n }\n\n /**\n * Update the different possible states of this manager, e.g. is there\n * something to undo, redo, ...\n * @param {Object} details\n */\n #dispatchUpdateStates(details) {\n const hasChanged = Object.entries(details).some(\n ([key, value]) => this.#previousStates[key] !== value\n );\n\n if (hasChanged) {\n this._eventBus.dispatch(\"annotationeditorstateschanged\", {\n source: this,\n details: Object.assign(this.#previousStates, details),\n });\n // We could listen on our own event but it sounds like a bit weird and\n // it's a way to simpler to handle that stuff here instead of having to\n // add something in every place where an editor can be unselected.\n if (\n this.#mode === AnnotationEditorType.HIGHLIGHT &&\n details.hasSelectedEditor === false\n ) {\n this.#dispatchUpdateUI([\n [AnnotationEditorParamsType.HIGHLIGHT_FREE, true],\n ]);\n }\n }\n }\n\n #dispatchUpdateUI(details) {\n this._eventBus.dispatch(\"annotationeditorparamschanged\", {\n source: this,\n details,\n });\n }\n\n /**\n * Set the editing state.\n * It can be useful to temporarily disable it when the user is editing a\n * FreeText annotation.\n * @param {boolean} isEditing\n */\n setEditingState(isEditing) {\n if (isEditing) {\n this.#addFocusManager();\n this.#addCopyPasteListeners();\n this.#dispatchUpdateStates({\n isEditing: this.#mode !== AnnotationEditorType.NONE,\n isEmpty: this.#isEmpty(),\n hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n hasSelectedEditor: false,\n });\n } else {\n this.#removeFocusManager();\n this.#removeCopyPasteListeners();\n this.#dispatchUpdateStates({\n isEditing: false,\n });\n this.disableUserSelect(false);\n }\n }\n\n registerEditorTypes(types) {\n if (this.#editorTypes) {\n return;\n }\n this.#editorTypes = types;\n for (const editorType of this.#editorTypes) {\n this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n }\n }\n\n /**\n * Get an id.\n * @returns {string}\n */\n getId() {\n return this.#idManager.id;\n }\n\n get currentLayer() {\n return this.#allLayers.get(this.#currentPageIndex);\n }\n\n getLayer(pageIndex) {\n return this.#allLayers.get(pageIndex);\n }\n\n get currentPageIndex() {\n return this.#currentPageIndex;\n }\n\n /**\n * Add a new layer for a page which will contains the editors.\n * @param {AnnotationEditorLayer} layer\n */\n addLayer(layer) {\n this.#allLayers.set(layer.pageIndex, layer);\n if (this.#isEnabled) {\n layer.enable();\n } else {\n layer.disable();\n }\n }\n\n /**\n * Remove a layer.\n * @param {AnnotationEditorLayer} layer\n */\n removeLayer(layer) {\n this.#allLayers.delete(layer.pageIndex);\n }\n\n /**\n * Change the editor mode (None, FreeText, Ink, ...)\n * @param {number} mode\n * @param {string|null} editId\n * @param {boolean} [isFromKeyboard] - true if the mode change is due to a\n * keyboard action.\n */\n async updateMode(mode, editId = null, isFromKeyboard = false) {\n if (this.#mode === mode) {\n return;\n }\n\n if (this.#updateModeCapability) {\n await this.#updateModeCapability.promise;\n if (!this.#updateModeCapability) {\n // This ui manager has been destroyed.\n return;\n }\n }\n\n this.#updateModeCapability = Promise.withResolvers();\n this.#currentDrawingSession?.commitOrRemove();\n\n this.#mode = mode;\n if (mode === AnnotationEditorType.NONE) {\n this.setEditingState(false);\n this.#disableAll();\n\n this._editorUndoBar?.hide();\n\n this.#updateModeCapability.resolve();\n return;\n }\n if (mode === AnnotationEditorType.SIGNATURE) {\n await this.#signatureManager?.loadSignatures();\n }\n this.setEditingState(true);\n await this.#enableAll();\n this.unselectAll();\n for (const layer of this.#allLayers.values()) {\n layer.updateMode(mode);\n }\n if (!editId) {\n if (isFromKeyboard) {\n this.addNewEditorFromKeyboard();\n }\n\n this.#updateModeCapability.resolve();\n return;\n }\n\n for (const editor of this.#allEditors.values()) {\n if (editor.annotationElementId === editId) {\n this.setSelected(editor);\n editor.enterInEditMode();\n } else {\n editor.unselect();\n }\n }\n\n this.#updateModeCapability.resolve();\n }\n\n addNewEditorFromKeyboard() {\n if (this.currentLayer.canCreateNewEmptyEditor()) {\n this.currentLayer.addNewEditor();\n }\n }\n\n /**\n * Update the toolbar if it's required to reflect the tool currently used.\n * @param {number} mode\n * @returns {undefined}\n */\n updateToolbar(mode) {\n if (mode === this.#mode) {\n return;\n }\n this._eventBus.dispatch(\"switchannotationeditormode\", {\n source: this,\n mode,\n });\n }\n\n /**\n * Update a parameter in the current editor or globally.\n * @param {number} type\n * @param {*} value\n */\n updateParams(type, value) {\n if (!this.#editorTypes) {\n return;\n }\n\n switch (type) {\n case AnnotationEditorParamsType.CREATE:\n this.currentLayer.addNewEditor(value);\n return;\n case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR:\n this.#mainHighlightColorPicker?.updateColor(value);\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n this._eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data: {\n type: \"highlight\",\n action: \"toggle_visibility\",\n },\n },\n });\n (this.#showAllStates ||= new Map()).set(type, value);\n this.showAllEditors(\"highlight\", value);\n break;\n }\n\n for (const editor of this.#selectedEditors) {\n editor.updateParams(type, value);\n }\n\n for (const editorType of this.#editorTypes) {\n editorType.updateDefaultParams(type, value);\n }\n }\n\n showAllEditors(type, visible, updateButton = false) {\n for (const editor of this.#allEditors.values()) {\n if (editor.editorType === type) {\n editor.show(visible);\n }\n }\n const state =\n this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ??\n true;\n if (state !== visible) {\n this.#dispatchUpdateUI([\n [AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible],\n ]);\n }\n }\n\n enableWaiting(mustWait = false) {\n if (this.#isWaiting === mustWait) {\n return;\n }\n this.#isWaiting = mustWait;\n for (const layer of this.#allLayers.values()) {\n if (mustWait) {\n layer.disableClick();\n } else {\n layer.enableClick();\n }\n layer.div.classList.toggle(\"waiting\", mustWait);\n }\n }\n\n /**\n * Enable all the layers.\n */\n async #enableAll() {\n if (!this.#isEnabled) {\n this.#isEnabled = true;\n const promises = [];\n for (const layer of this.#allLayers.values()) {\n promises.push(layer.enable());\n }\n await Promise.all(promises);\n for (const editor of this.#allEditors.values()) {\n editor.enable();\n }\n }\n }\n\n /**\n * Disable all the layers.\n */\n #disableAll() {\n this.unselectAll();\n if (this.#isEnabled) {\n this.#isEnabled = false;\n for (const layer of this.#allLayers.values()) {\n layer.disable();\n }\n for (const editor of this.#allEditors.values()) {\n editor.disable();\n }\n }\n }\n\n /**\n * Get all the editors belonging to a given page.\n * @param {number} pageIndex\n * @returns {Array}\n */\n getEditors(pageIndex) {\n const editors = [];\n for (const editor of this.#allEditors.values()) {\n if (editor.pageIndex === pageIndex) {\n editors.push(editor);\n }\n }\n return editors;\n }\n\n /**\n * Get an editor with the given id.\n * @param {string} id\n * @returns {AnnotationEditor}\n */\n getEditor(id) {\n return this.#allEditors.get(id);\n }\n\n /**\n * Add a new editor.\n * @param {AnnotationEditor} editor\n */\n addEditor(editor) {\n this.#allEditors.set(editor.id, editor);\n }\n\n /**\n * Remove an editor.\n * @param {AnnotationEditor} editor\n */\n removeEditor(editor) {\n if (editor.div.contains(document.activeElement)) {\n if (this.#focusMainContainerTimeoutId) {\n clearTimeout(this.#focusMainContainerTimeoutId);\n }\n this.#focusMainContainerTimeoutId = setTimeout(() => {\n // When the div is removed from DOM the focus can move on the\n // document.body, so we need to move it back to the main container.\n this.focusMainContainer();\n this.#focusMainContainerTimeoutId = null;\n }, 0);\n }\n this.#allEditors.delete(editor.id);\n if (editor.annotationElementId) {\n this.#missingCanvases?.delete(editor.annotationElementId);\n }\n this.unselect(editor);\n if (\n !editor.annotationElementId ||\n !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)\n ) {\n this.#annotationStorage?.remove(editor.id);\n }\n }\n\n /**\n * The annotation element with the given id has been deleted.\n * @param {AnnotationEditor} editor\n */\n addDeletedAnnotationElement(editor) {\n this.#deletedAnnotationsElementIds.add(editor.annotationElementId);\n this.addChangedExistingAnnotation(editor);\n editor.deleted = true;\n }\n\n /**\n * Check if the annotation element with the given id has been deleted.\n * @param {string} annotationElementId\n * @returns {boolean}\n */\n isDeletedAnnotationElement(annotationElementId) {\n return this.#deletedAnnotationsElementIds.has(annotationElementId);\n }\n\n /**\n * The annotation element with the given id have been restored.\n * @param {AnnotationEditor} editor\n */\n removeDeletedAnnotationElement(editor) {\n this.#deletedAnnotationsElementIds.delete(editor.annotationElementId);\n this.removeChangedExistingAnnotation(editor);\n editor.deleted = false;\n }\n\n /**\n * Add an editor to the layer it belongs to or add it to the global map.\n * @param {AnnotationEditor} editor\n */\n #addEditorToLayer(editor) {\n const layer = this.#allLayers.get(editor.pageIndex);\n if (layer) {\n layer.addOrRebuild(editor);\n } else {\n this.addEditor(editor);\n this.addToAnnotationStorage(editor);\n }\n }\n\n /**\n * Set the given editor as the active one.\n * @param {AnnotationEditor} editor\n */\n setActiveEditor(editor) {\n if (this.#activeEditor === editor) {\n return;\n }\n\n this.#activeEditor = editor;\n if (editor) {\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n }\n }\n\n get #lastSelectedEditor() {\n let ed = null;\n for (ed of this.#selectedEditors) {\n // Iterate to get the last element.\n }\n return ed;\n }\n\n /**\n * Update the UI of the active editor.\n * @param {AnnotationEditor} editor\n */\n updateUI(editor) {\n if (this.#lastSelectedEditor === editor) {\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n }\n }\n\n updateUIForDefaultProperties(editorType) {\n this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n }\n\n /**\n * Add or remove an editor the current selection.\n * @param {AnnotationEditor} editor\n */\n toggleSelected(editor) {\n if (this.#selectedEditors.has(editor)) {\n this.#selectedEditors.delete(editor);\n editor.unselect();\n this.#dispatchUpdateStates({\n hasSelectedEditor: this.hasSelection,\n });\n return;\n }\n this.#selectedEditors.add(editor);\n editor.select();\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n this.#dispatchUpdateStates({\n hasSelectedEditor: true,\n });\n }\n\n /**\n * Set the last selected editor.\n * @param {AnnotationEditor} editor\n */\n setSelected(editor) {\n this.#currentDrawingSession?.commitOrRemove();\n for (const ed of this.#selectedEditors) {\n if (ed !== editor) {\n ed.unselect();\n }\n }\n this.#selectedEditors.clear();\n\n this.#selectedEditors.add(editor);\n editor.select();\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n this.#dispatchUpdateStates({\n hasSelectedEditor: true,\n });\n }\n\n /**\n * Check if the editor is selected.\n * @param {AnnotationEditor} editor\n */\n isSelected(editor) {\n return this.#selectedEditors.has(editor);\n }\n\n get firstSelectedEditor() {\n return this.#selectedEditors.values().next().value;\n }\n\n /**\n * Unselect an editor.\n * @param {AnnotationEditor} editor\n */\n unselect(editor) {\n editor.unselect();\n this.#selectedEditors.delete(editor);\n this.#dispatchUpdateStates({\n hasSelectedEditor: this.hasSelection,\n });\n }\n\n get hasSelection() {\n return this.#selectedEditors.size !== 0;\n }\n\n get isEnterHandled() {\n return (\n this.#selectedEditors.size === 1 &&\n this.firstSelectedEditor.isEnterHandled\n );\n }\n\n /**\n * Undo the last command.\n */\n undo() {\n this.#commandManager.undo();\n this.#dispatchUpdateStates({\n hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n hasSomethingToRedo: true,\n isEmpty: this.#isEmpty(),\n });\n this._editorUndoBar?.hide();\n }\n\n /**\n * Redo the last undoed command.\n */\n redo() {\n this.#commandManager.redo();\n this.#dispatchUpdateStates({\n hasSomethingToUndo: true,\n hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n isEmpty: this.#isEmpty(),\n });\n }\n\n /**\n * Add a command to execute (cmd) and another one to undo it.\n * @param {Object} params\n */\n addCommands(params) {\n this.#commandManager.add(params);\n this.#dispatchUpdateStates({\n hasSomethingToUndo: true,\n hasSomethingToRedo: false,\n isEmpty: this.#isEmpty(),\n });\n }\n\n cleanUndoStack(type) {\n this.#commandManager.cleanType(type);\n }\n\n #isEmpty() {\n if (this.#allEditors.size === 0) {\n return true;\n }\n\n if (this.#allEditors.size === 1) {\n for (const editor of this.#allEditors.values()) {\n return editor.isEmpty();\n }\n }\n\n return false;\n }\n\n /**\n * Delete the current editor or all.\n */\n delete() {\n this.commitOrRemove();\n const drawingEditor = this.currentLayer?.endDrawingSession(\n /* isAborted = */ true\n );\n if (!this.hasSelection && !drawingEditor) {\n return;\n }\n\n const editors = drawingEditor\n ? [drawingEditor]\n : [...this.#selectedEditors];\n const cmd = () => {\n this._editorUndoBar?.show(\n undo,\n editors.length === 1 ? editors[0].editorType : editors.length\n );\n for (const editor of editors) {\n editor.remove();\n }\n };\n const undo = () => {\n for (const editor of editors) {\n this.#addEditorToLayer(editor);\n }\n };\n\n this.addCommands({ cmd, undo, mustExec: true });\n }\n\n commitOrRemove() {\n // An editor is being edited so just commit it.\n this.#activeEditor?.commitOrRemove();\n }\n\n hasSomethingToControl() {\n return this.#activeEditor || this.hasSelection;\n }\n\n /**\n * Select the editors.\n * @param {Array} editors\n */\n #selectEditors(editors) {\n for (const editor of this.#selectedEditors) {\n editor.unselect();\n }\n this.#selectedEditors.clear();\n for (const editor of editors) {\n if (editor.isEmpty()) {\n continue;\n }\n this.#selectedEditors.add(editor);\n editor.select();\n }\n this.#dispatchUpdateStates({ hasSelectedEditor: this.hasSelection });\n }\n\n /**\n * Select all the editors.\n */\n selectAll() {\n for (const editor of this.#selectedEditors) {\n editor.commit();\n }\n this.#selectEditors(this.#allEditors.values());\n }\n\n /**\n * Unselect all the selected editors.\n */\n unselectAll() {\n if (this.#activeEditor) {\n // An editor is being edited so just commit it.\n this.#activeEditor.commitOrRemove();\n if (this.#mode !== AnnotationEditorType.NONE) {\n // If the mode is NONE, we want to really unselect the editor, hence we\n // mustn't return here.\n return;\n }\n }\n\n if (this.#currentDrawingSession?.commitOrRemove()) {\n return;\n }\n\n if (!this.hasSelection) {\n return;\n }\n for (const editor of this.#selectedEditors) {\n editor.unselect();\n }\n this.#selectedEditors.clear();\n this.#dispatchUpdateStates({\n hasSelectedEditor: false,\n });\n }\n\n translateSelectedEditors(x, y, noCommit = false) {\n if (!noCommit) {\n this.commitOrRemove();\n }\n if (!this.hasSelection) {\n return;\n }\n\n this.#translation[0] += x;\n this.#translation[1] += y;\n const [totalX, totalY] = this.#translation;\n const editors = [...this.#selectedEditors];\n\n // We don't want to have an undo/redo for each translation so we wait a bit\n // before adding the command to the command manager.\n const TIME_TO_WAIT = 1000;\n\n if (this.#translationTimeoutId) {\n clearTimeout(this.#translationTimeoutId);\n }\n\n this.#translationTimeoutId = setTimeout(() => {\n this.#translationTimeoutId = null;\n this.#translation[0] = this.#translation[1] = 0;\n\n this.addCommands({\n cmd: () => {\n for (const editor of editors) {\n if (this.#allEditors.has(editor.id)) {\n editor.translateInPage(totalX, totalY);\n editor.translationDone();\n }\n }\n },\n undo: () => {\n for (const editor of editors) {\n if (this.#allEditors.has(editor.id)) {\n editor.translateInPage(-totalX, -totalY);\n editor.translationDone();\n }\n }\n },\n mustExec: false,\n });\n }, TIME_TO_WAIT);\n\n for (const editor of editors) {\n editor.translateInPage(x, y);\n editor.translationDone();\n }\n }\n\n /**\n * Set up the drag session for moving the selected editors.\n */\n setUpDragSession() {\n // Note: don't use any references to the editor's parent which can be null\n // if the editor belongs to a destroyed page.\n if (!this.hasSelection) {\n return;\n }\n // Avoid to have spurious text selection in the text layer when dragging.\n this.disableUserSelect(true);\n this.#draggingEditors = new Map();\n for (const editor of this.#selectedEditors) {\n this.#draggingEditors.set(editor, {\n savedX: editor.x,\n savedY: editor.y,\n savedPageIndex: editor.pageIndex,\n newX: 0,\n newY: 0,\n newPageIndex: -1,\n });\n }\n }\n\n /**\n * Ends the drag session.\n * @returns {boolean} true if at least one editor has been moved.\n */\n endDragSession() {\n if (!this.#draggingEditors) {\n return false;\n }\n this.disableUserSelect(false);\n const map = this.#draggingEditors;\n this.#draggingEditors = null;\n let mustBeAddedInUndoStack = false;\n\n for (const [{ x, y, pageIndex }, value] of map) {\n value.newX = x;\n value.newY = y;\n value.newPageIndex = pageIndex;\n mustBeAddedInUndoStack ||=\n x !== value.savedX ||\n y !== value.savedY ||\n pageIndex !== value.savedPageIndex;\n }\n\n if (!mustBeAddedInUndoStack) {\n return false;\n }\n\n const move = (editor, x, y, pageIndex) => {\n if (this.#allEditors.has(editor.id)) {\n // The editor can be undone/redone on a page which is not visible (and\n // which potentially has no annotation editor layer), hence we need to\n // use the pageIndex instead of the parent.\n const parent = this.#allLayers.get(pageIndex);\n if (parent) {\n editor._setParentAndPosition(parent, x, y);\n } else {\n editor.pageIndex = pageIndex;\n editor.x = x;\n editor.y = y;\n }\n }\n };\n\n this.addCommands({\n cmd: () => {\n for (const [editor, { newX, newY, newPageIndex }] of map) {\n move(editor, newX, newY, newPageIndex);\n }\n },\n undo: () => {\n for (const [editor, { savedX, savedY, savedPageIndex }] of map) {\n move(editor, savedX, savedY, savedPageIndex);\n }\n },\n mustExec: true,\n });\n\n return true;\n }\n\n /**\n * Drag the set of selected editors.\n * @param {number} tx\n * @param {number} ty\n */\n dragSelectedEditors(tx, ty) {\n if (!this.#draggingEditors) {\n return;\n }\n for (const editor of this.#draggingEditors.keys()) {\n editor.drag(tx, ty);\n }\n }\n\n /**\n * Rebuild the editor (usually on undo/redo actions) on a potentially\n * non-rendered page.\n * @param {AnnotationEditor} editor\n */\n rebuild(editor) {\n if (editor.parent === null) {\n const parent = this.getLayer(editor.pageIndex);\n if (parent) {\n parent.changeParent(editor);\n parent.addOrRebuild(editor);\n } else {\n this.addEditor(editor);\n this.addToAnnotationStorage(editor);\n editor.rebuild();\n }\n } else {\n editor.parent.addOrRebuild(editor);\n }\n }\n\n get isEditorHandlingKeyboard() {\n return (\n this.getActive()?.shouldGetKeyboardEvents() ||\n (this.#selectedEditors.size === 1 &&\n this.firstSelectedEditor.shouldGetKeyboardEvents())\n );\n }\n\n /**\n * Is the current editor the one passed as argument?\n * @param {AnnotationEditor} editor\n * @returns\n */\n isActive(editor) {\n return this.#activeEditor === editor;\n }\n\n /**\n * Get the current active editor.\n * @returns {AnnotationEditor|null}\n */\n getActive() {\n return this.#activeEditor;\n }\n\n /**\n * Get the current editor mode.\n * @returns {number}\n */\n getMode() {\n return this.#mode;\n }\n\n get imageManager() {\n return shadow(this, \"imageManager\", new ImageManager());\n }\n\n getSelectionBoxes(textLayer) {\n if (!textLayer) {\n return null;\n }\n const selection = document.getSelection();\n for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n if (\n !textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)\n ) {\n return null;\n }\n }\n\n const {\n x: layerX,\n y: layerY,\n width: parentWidth,\n height: parentHeight,\n } = textLayer.getBoundingClientRect();\n\n // We must rotate the boxes because we want to have them in the non-rotated\n // page coordinates.\n let rotator;\n switch (textLayer.getAttribute(\"data-main-rotation\")) {\n case \"90\":\n rotator = (x, y, w, h) => ({\n x: (y - layerY) / parentHeight,\n y: 1 - (x + w - layerX) / parentWidth,\n width: h / parentHeight,\n height: w / parentWidth,\n });\n break;\n case \"180\":\n rotator = (x, y, w, h) => ({\n x: 1 - (x + w - layerX) / parentWidth,\n y: 1 - (y + h - layerY) / parentHeight,\n width: w / parentWidth,\n height: h / parentHeight,\n });\n break;\n case \"270\":\n rotator = (x, y, w, h) => ({\n x: 1 - (y + h - layerY) / parentHeight,\n y: (x - layerX) / parentWidth,\n width: h / parentHeight,\n height: w / parentWidth,\n });\n break;\n default:\n rotator = (x, y, w, h) => ({\n x: (x - layerX) / parentWidth,\n y: (y - layerY) / parentHeight,\n width: w / parentWidth,\n height: h / parentHeight,\n });\n break;\n }\n\n const boxes = [];\n for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n const range = selection.getRangeAt(i);\n if (range.collapsed) {\n continue;\n }\n for (const { x, y, width, height } of range.getClientRects()) {\n if (width === 0 || height === 0) {\n continue;\n }\n boxes.push(rotator(x, y, width, height));\n }\n }\n return boxes.length === 0 ? null : boxes;\n }\n\n addChangedExistingAnnotation({ annotationElementId, id }) {\n (this.#changedExistingAnnotations ||= new Map()).set(\n annotationElementId,\n id\n );\n }\n\n removeChangedExistingAnnotation({ annotationElementId }) {\n this.#changedExistingAnnotations?.delete(annotationElementId);\n }\n\n renderAnnotationElement(annotation) {\n const editorId = this.#changedExistingAnnotations?.get(annotation.data.id);\n if (!editorId) {\n return;\n }\n const editor = this.#annotationStorage.getRawValue(editorId);\n if (!editor) {\n return;\n }\n if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) {\n return;\n }\n editor.renderAnnotationElement(annotation);\n }\n\n setMissingCanvas(annotationId, annotationElementId, canvas) {\n const editor = this.#missingCanvases?.get(annotationId);\n if (!editor) {\n return;\n }\n editor.setCanvas(annotationElementId, canvas);\n this.#missingCanvases.delete(annotationId);\n }\n\n addMissingCanvas(annotationId, editor) {\n (this.#missingCanvases ||= new Map()).set(annotationId, editor);\n }\n}\n\nexport {\n AnnotationEditorUIManager,\n bindEvents,\n ColorManager,\n CommandManager,\n KeyboardManager,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu } from \"../display_utils.js\";\n\nclass AltText {\n #altText = null;\n\n #altTextDecorative = false;\n\n #altTextButton = null;\n\n #altTextButtonLabel = null;\n\n #altTextTooltip = null;\n\n #altTextTooltipTimeout = null;\n\n #altTextWasFromKeyBoard = false;\n\n #badge = null;\n\n #editor = null;\n\n #guessedText = null;\n\n #textWithDisclaimer = null;\n\n #useNewAltTextFlow = false;\n\n static #l10nNewButton = null;\n\n static _l10n = null;\n\n constructor(editor) {\n this.#editor = editor;\n this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow;\n\n AltText.#l10nNewButton ||= Object.freeze({\n added: \"pdfjs-editor-new-alt-text-added-button\",\n \"added-label\": \"pdfjs-editor-new-alt-text-added-button-label\",\n missing: \"pdfjs-editor-new-alt-text-missing-button\",\n \"missing-label\": \"pdfjs-editor-new-alt-text-missing-button-label\",\n review: \"pdfjs-editor-new-alt-text-to-review-button\",\n \"review-label\": \"pdfjs-editor-new-alt-text-to-review-button-label\",\n });\n }\n\n static initialize(l10n) {\n AltText._l10n ??= l10n;\n }\n\n async render() {\n const altText = (this.#altTextButton = document.createElement(\"button\"));\n altText.className = \"altText\";\n altText.tabIndex = \"0\";\n\n const label = (this.#altTextButtonLabel = document.createElement(\"span\"));\n altText.append(label);\n\n if (this.#useNewAltTextFlow) {\n altText.classList.add(\"new\");\n altText.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton.missing);\n label.setAttribute(\n \"data-l10n-id\",\n AltText.#l10nNewButton[\"missing-label\"]\n );\n } else {\n altText.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button\");\n label.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button-label\");\n }\n\n const signal = this.#editor._uiManager._signal;\n altText.addEventListener(\"contextmenu\", noContextMenu, { signal });\n altText.addEventListener(\"pointerdown\", event => event.stopPropagation(), {\n signal,\n });\n\n const onClick = event => {\n event.preventDefault();\n this.#editor._uiManager.editAltText(this.#editor);\n if (this.#useNewAltTextFlow) {\n this.#editor._reportTelemetry({\n action: \"pdfjs.image.alt_text.image_status_label_clicked\",\n data: { label: this.#label },\n });\n }\n };\n altText.addEventListener(\"click\", onClick, { capture: true, signal });\n altText.addEventListener(\n \"keydown\",\n event => {\n if (event.target === altText && event.key === \"Enter\") {\n this.#altTextWasFromKeyBoard = true;\n onClick(event);\n }\n },\n { signal }\n );\n await this.#setState();\n\n return altText;\n }\n\n get #label() {\n return (\n (this.#altText && \"added\") ||\n (this.#altText === null && this.guessedText && \"review\") ||\n \"missing\"\n );\n }\n\n finish() {\n if (!this.#altTextButton) {\n return;\n }\n this.#altTextButton.focus({ focusVisible: this.#altTextWasFromKeyBoard });\n this.#altTextWasFromKeyBoard = false;\n }\n\n isEmpty() {\n if (this.#useNewAltTextFlow) {\n return this.#altText === null;\n }\n return !this.#altText && !this.#altTextDecorative;\n }\n\n hasData() {\n if (this.#useNewAltTextFlow) {\n return this.#altText !== null || !!this.#guessedText;\n }\n return this.isEmpty();\n }\n\n get guessedText() {\n return this.#guessedText;\n }\n\n async setGuessedText(guessedText) {\n if (this.#altText !== null) {\n // The user provided their own alt text, so we don't want to overwrite it.\n return;\n }\n this.#guessedText = guessedText;\n this.#textWithDisclaimer = await AltText._l10n.get(\n \"pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer\",\n { generatedAltText: guessedText }\n );\n this.#setState();\n }\n\n toggleAltTextBadge(visibility = false) {\n if (!this.#useNewAltTextFlow || this.#altText) {\n this.#badge?.remove();\n this.#badge = null;\n return;\n }\n if (!this.#badge) {\n const badge = (this.#badge = document.createElement(\"div\"));\n badge.className = \"noAltTextBadge\";\n this.#editor.div.append(badge);\n }\n this.#badge.classList.toggle(\"hidden\", !visibility);\n }\n\n serialize(isForCopying) {\n let altText = this.#altText;\n if (!isForCopying && this.#guessedText === altText) {\n altText = this.#textWithDisclaimer;\n }\n return {\n altText,\n decorative: this.#altTextDecorative,\n guessedText: this.#guessedText,\n textWithDisclaimer: this.#textWithDisclaimer,\n };\n }\n\n get data() {\n return {\n altText: this.#altText,\n decorative: this.#altTextDecorative,\n };\n }\n\n /**\n * Set the alt text data.\n */\n set data({\n altText,\n decorative,\n guessedText,\n textWithDisclaimer,\n cancel = false,\n }) {\n if (guessedText) {\n this.#guessedText = guessedText;\n this.#textWithDisclaimer = textWithDisclaimer;\n }\n if (this.#altText === altText && this.#altTextDecorative === decorative) {\n return;\n }\n if (!cancel) {\n this.#altText = altText;\n this.#altTextDecorative = decorative;\n }\n this.#setState();\n }\n\n toggle(enabled = false) {\n if (!this.#altTextButton) {\n return;\n }\n if (!enabled && this.#altTextTooltipTimeout) {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n }\n this.#altTextButton.disabled = !enabled;\n }\n\n shown() {\n this.#editor._reportTelemetry({\n action: \"pdfjs.image.alt_text.image_status_label_displayed\",\n data: { label: this.#label },\n });\n }\n\n destroy() {\n this.#altTextButton?.remove();\n this.#altTextButton = null;\n this.#altTextButtonLabel = null;\n this.#altTextTooltip = null;\n this.#badge?.remove();\n this.#badge = null;\n }\n\n async #setState() {\n const button = this.#altTextButton;\n if (!button) {\n return;\n }\n\n if (this.#useNewAltTextFlow) {\n button.classList.toggle(\"done\", !!this.#altText);\n button.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton[this.#label]);\n\n this.#altTextButtonLabel?.setAttribute(\n \"data-l10n-id\",\n AltText.#l10nNewButton[`${this.#label}-label`]\n );\n if (!this.#altText) {\n this.#altTextTooltip?.remove();\n return;\n }\n } else {\n if (!this.#altText && !this.#altTextDecorative) {\n button.classList.remove(\"done\");\n this.#altTextTooltip?.remove();\n return;\n }\n button.classList.add(\"done\");\n button.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-edit-button\");\n }\n\n let tooltip = this.#altTextTooltip;\n if (!tooltip) {\n this.#altTextTooltip = tooltip = document.createElement(\"span\");\n tooltip.className = \"tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n tooltip.id = `alt-text-tooltip-${this.#editor.id}`;\n\n const DELAY_TO_SHOW_TOOLTIP = 100;\n const signal = this.#editor._uiManager._signal;\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n },\n { once: true }\n );\n button.addEventListener(\n \"mouseenter\",\n () => {\n this.#altTextTooltipTimeout = setTimeout(() => {\n this.#altTextTooltipTimeout = null;\n this.#altTextTooltip.classList.add(\"show\");\n this.#editor._reportTelemetry({\n action: \"alt_text_tooltip\",\n });\n }, DELAY_TO_SHOW_TOOLTIP);\n },\n { signal }\n );\n button.addEventListener(\n \"mouseleave\",\n () => {\n if (this.#altTextTooltipTimeout) {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n }\n this.#altTextTooltip?.classList.remove(\"show\");\n },\n { signal }\n );\n }\n if (this.#altTextDecorative) {\n tooltip.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-alt-text-decorative-tooltip\"\n );\n } else {\n tooltip.removeAttribute(\"data-l10n-id\");\n tooltip.textContent = this.#altText;\n }\n\n if (!tooltip.parentNode) {\n button.append(tooltip);\n }\n\n const element = this.#editor.getElementForAltText();\n element?.setAttribute(\"aria-describedby\", tooltip.id);\n }\n}\n\nexport { AltText };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { OutputScale, stopEvent } from \"./display_utils.js\";\n\nclass TouchManager {\n #container;\n\n #isPinching = false;\n\n #isPinchingStopped = null;\n\n #isPinchingDisabled;\n\n #onPinchStart;\n\n #onPinching;\n\n #onPinchEnd;\n\n #pointerDownAC = null;\n\n #signal;\n\n #touchInfo = null;\n\n #touchManagerAC;\n\n #touchMoveAC = null;\n\n constructor({\n container,\n isPinchingDisabled = null,\n isPinchingStopped = null,\n onPinchStart = null,\n onPinching = null,\n onPinchEnd = null,\n signal,\n }) {\n this.#container = container;\n this.#isPinchingStopped = isPinchingStopped;\n this.#isPinchingDisabled = isPinchingDisabled;\n this.#onPinchStart = onPinchStart;\n this.#onPinching = onPinching;\n this.#onPinchEnd = onPinchEnd;\n this.#touchManagerAC = new AbortController();\n this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]);\n\n container.addEventListener(\"touchstart\", this.#onTouchStart.bind(this), {\n passive: false,\n signal: this.#signal,\n });\n }\n\n /**\n * NOTE: Don't shadow this value since `devicePixelRatio` may change if the\n * window resolution changes, e.g. if the viewer is moved to another monitor.\n */\n get MIN_TOUCH_DISTANCE_TO_PINCH() {\n // The 35 is coming from:\n // https://searchfox.org/mozilla-central/source/gfx/layers/apz/src/GestureEventListener.cpp#36\n //\n // The properties TouchEvent::screenX/Y are in screen CSS pixels:\n // https://developer.mozilla.org/en-US/docs/Web/API/Touch/screenX#examples\n // MIN_TOUCH_DISTANCE_TO_PINCH is in CSS pixels.\n return 35 / OutputScale.pixelRatio;\n }\n\n #onTouchStart(evt) {\n if (this.#isPinchingDisabled?.()) {\n return;\n }\n\n if (evt.touches.length === 1) {\n if (this.#pointerDownAC) {\n return;\n }\n const pointerDownAC = (this.#pointerDownAC = new AbortController());\n const signal = AbortSignal.any([this.#signal, pointerDownAC.signal]);\n const container = this.#container;\n\n // We want to have the events at the capture phase to make sure we can\n // cancel them.\n const opts = { capture: true, signal, passive: false };\n const cancelPointerDown = e => {\n if (e.pointerType === \"touch\") {\n this.#pointerDownAC?.abort();\n this.#pointerDownAC = null;\n }\n };\n container.addEventListener(\n \"pointerdown\",\n e => {\n if (e.pointerType === \"touch\") {\n // This is the second finger so we don't want it select something\n // or whatever.\n stopEvent(e);\n cancelPointerDown(e);\n }\n },\n opts\n );\n container.addEventListener(\"pointerup\", cancelPointerDown, opts);\n container.addEventListener(\"pointercancel\", cancelPointerDown, opts);\n return;\n }\n\n if (!this.#touchMoveAC) {\n this.#touchMoveAC = new AbortController();\n const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]);\n const container = this.#container;\n\n const opt = { signal, capture: false, passive: false };\n container.addEventListener(\n \"touchmove\",\n this.#onTouchMove.bind(this),\n opt\n );\n const onTouchEnd = this.#onTouchEnd.bind(this);\n container.addEventListener(\"touchend\", onTouchEnd, opt);\n container.addEventListener(\"touchcancel\", onTouchEnd, opt);\n\n opt.capture = true;\n container.addEventListener(\"pointerdown\", stopEvent, opt);\n container.addEventListener(\"pointermove\", stopEvent, opt);\n container.addEventListener(\"pointercancel\", stopEvent, opt);\n container.addEventListener(\"pointerup\", stopEvent, opt);\n this.#onPinchStart?.();\n }\n\n stopEvent(evt);\n\n if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) {\n this.#touchInfo = null;\n return;\n }\n\n let [touch0, touch1] = evt.touches;\n if (touch0.identifier > touch1.identifier) {\n [touch0, touch1] = [touch1, touch0];\n }\n this.#touchInfo = {\n touch0X: touch0.screenX,\n touch0Y: touch0.screenY,\n touch1X: touch1.screenX,\n touch1Y: touch1.screenY,\n };\n }\n\n #onTouchMove(evt) {\n if (!this.#touchInfo || evt.touches.length !== 2) {\n return;\n }\n\n stopEvent(evt);\n\n let [touch0, touch1] = evt.touches;\n if (touch0.identifier > touch1.identifier) {\n [touch0, touch1] = [touch1, touch0];\n }\n const { screenX: screen0X, screenY: screen0Y } = touch0;\n const { screenX: screen1X, screenY: screen1Y } = touch1;\n const touchInfo = this.#touchInfo;\n const {\n touch0X: pTouch0X,\n touch0Y: pTouch0Y,\n touch1X: pTouch1X,\n touch1Y: pTouch1Y,\n } = touchInfo;\n\n const prevGapX = pTouch1X - pTouch0X;\n const prevGapY = pTouch1Y - pTouch0Y;\n const currGapX = screen1X - screen0X;\n const currGapY = screen1Y - screen0Y;\n\n const distance = Math.hypot(currGapX, currGapY) || 1;\n const pDistance = Math.hypot(prevGapX, prevGapY) || 1;\n if (\n !this.#isPinching &&\n Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH\n ) {\n return;\n }\n\n touchInfo.touch0X = screen0X;\n touchInfo.touch0Y = screen0Y;\n touchInfo.touch1X = screen1X;\n touchInfo.touch1Y = screen1Y;\n\n if (!this.#isPinching) {\n // Start pinching.\n this.#isPinching = true;\n\n // We return here else the first pinch is a bit too much\n return;\n }\n\n const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2];\n this.#onPinching?.(origin, pDistance, distance);\n }\n\n #onTouchEnd(evt) {\n if (evt.touches.length >= 2) {\n return;\n }\n // #touchMoveAC shouldn't be null but it seems that irl it can (see #19793).\n if (this.#touchMoveAC) {\n this.#touchMoveAC.abort();\n this.#touchMoveAC = null;\n this.#onPinchEnd?.();\n }\n\n if (!this.#touchInfo) {\n return;\n }\n stopEvent(evt);\n this.#touchInfo = null;\n this.#isPinching = false;\n }\n\n destroy() {\n this.#touchManagerAC?.abort();\n this.#touchManagerAC = null;\n this.#pointerDownAC?.abort();\n this.#pointerDownAC = null;\n }\n}\n\nexport { TouchManager };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n AnnotationEditorUIManager,\n bindEvents,\n ColorManager,\n KeyboardManager,\n} from \"./tools.js\";\nimport {\n FeatureTest,\n MathClamp,\n shadow,\n unreachable,\n} from \"../../shared/util.js\";\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\nimport { AltText } from \"./alt_text.js\";\nimport { EditorToolbar } from \"./toolbar.js\";\nimport { TouchManager } from \"../touch_manager.js\";\n\n/**\n * @typedef {Object} AnnotationEditorParameters\n * @property {AnnotationEditorUIManager} uiManager - the global manager\n * @property {AnnotationEditorLayer} parent - the layer containing this editor\n * @property {string} id - editor id\n * @property {number} x - x-coordinate\n * @property {number} y - y-coordinate\n */\n\n/**\n * Base class for editors.\n */\nclass AnnotationEditor {\n #accessibilityData = null;\n\n #allResizerDivs = null;\n\n #altText = null;\n\n #disabled = false;\n\n #dragPointerId = null;\n\n #dragPointerType = \"\";\n\n #keepAspectRatio = false;\n\n #resizersDiv = null;\n\n #lastPointerCoords = null;\n\n #savedDimensions = null;\n\n #focusAC = null;\n\n #focusedResizerName = \"\";\n\n #hasBeenClicked = false;\n\n #initialRect = null;\n\n #isEditing = false;\n\n #isInEditMode = false;\n\n #isResizerEnabledForKeyboard = false;\n\n #moveInDOMTimeout = null;\n\n #prevDragX = 0;\n\n #prevDragY = 0;\n\n #telemetryTimeouts = null;\n\n #touchManager = null;\n\n _isCopy = false;\n\n _editToolbar = null;\n\n _initialOptions = Object.create(null);\n\n _initialData = null;\n\n _isVisible = true;\n\n _uiManager = null;\n\n _focusEventsAllowed = true;\n\n static _l10n = null;\n\n static _l10nResizer = null;\n\n #isDraggable = false;\n\n #zIndex = AnnotationEditor._zIndex++;\n\n static _borderLineWidth = -1;\n\n static _colorManager = new ColorManager();\n\n static _zIndex = 1;\n\n // Time to wait (in ms) before sending the telemetry data.\n // We wait a bit to avoid sending too many requests when changing something\n // like the thickness of a line.\n static _telemetryTimeout = 1000;\n\n static get _resizerKeyboardManager() {\n const resize = AnnotationEditor.prototype._resizeWithKeyboard;\n const small = AnnotationEditorUIManager.TRANSLATE_SMALL;\n const big = AnnotationEditorUIManager.TRANSLATE_BIG;\n\n return shadow(\n this,\n \"_resizerKeyboardManager\",\n new KeyboardManager([\n [[\"ArrowLeft\", \"mac+ArrowLeft\"], resize, { args: [-small, 0] }],\n [\n [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n resize,\n { args: [-big, 0] },\n ],\n [[\"ArrowRight\", \"mac+ArrowRight\"], resize, { args: [small, 0] }],\n [\n [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n resize,\n { args: [big, 0] },\n ],\n [[\"ArrowUp\", \"mac+ArrowUp\"], resize, { args: [0, -small] }],\n [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], resize, { args: [0, -big] }],\n [[\"ArrowDown\", \"mac+ArrowDown\"], resize, { args: [0, small] }],\n [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], resize, { args: [0, big] }],\n [\n [\"Escape\", \"mac+Escape\"],\n AnnotationEditor.prototype._stopResizingWithKeyboard,\n ],\n ])\n );\n }\n\n /**\n * @param {AnnotationEditorParameters} parameters\n */\n constructor(parameters) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === AnnotationEditor\n ) {\n unreachable(\"Cannot initialize AnnotationEditor.\");\n }\n\n this.parent = parameters.parent;\n this.id = parameters.id;\n this.width = this.height = null;\n this.pageIndex = parameters.parent.pageIndex;\n this.name = parameters.name;\n this.div = null;\n this._uiManager = parameters.uiManager;\n this.annotationElementId = null;\n this._willKeepAspectRatio = false;\n this._initialOptions.isCentered = parameters.isCentered;\n this._structTreeParentId = null;\n\n const {\n rotation,\n rawDims: { pageWidth, pageHeight, pageX, pageY },\n } = this.parent.viewport;\n\n this.rotation = rotation;\n this.pageRotation =\n (360 + rotation - this._uiManager.viewParameters.rotation) % 360;\n this.pageDimensions = [pageWidth, pageHeight];\n this.pageTranslation = [pageX, pageY];\n\n const [width, height] = this.parentDimensions;\n this.x = parameters.x / width;\n this.y = parameters.y / height;\n\n this.isAttachedToDOM = false;\n this.deleted = false;\n }\n\n get editorType() {\n return Object.getPrototypeOf(this).constructor._type;\n }\n\n static get isDrawer() {\n return false;\n }\n\n static get _defaultLineColor() {\n return shadow(\n this,\n \"_defaultLineColor\",\n this._colorManager.getHexCode(\"CanvasText\")\n );\n }\n\n static deleteAnnotationElement(editor) {\n const fakeEditor = new FakeEditor({\n id: editor.parent.getNextId(),\n parent: editor.parent,\n uiManager: editor._uiManager,\n });\n fakeEditor.annotationElementId = editor.annotationElementId;\n fakeEditor.deleted = true;\n fakeEditor._uiManager.addToAnnotationStorage(fakeEditor);\n }\n\n /**\n * Initialize the l10n stuff for this type of editor.\n * @param {Object} l10n\n */\n static initialize(l10n, _uiManager) {\n AnnotationEditor._l10n ??= l10n;\n\n AnnotationEditor._l10nResizer ||= Object.freeze({\n topLeft: \"pdfjs-editor-resizer-top-left\",\n topMiddle: \"pdfjs-editor-resizer-top-middle\",\n topRight: \"pdfjs-editor-resizer-top-right\",\n middleRight: \"pdfjs-editor-resizer-middle-right\",\n bottomRight: \"pdfjs-editor-resizer-bottom-right\",\n bottomMiddle: \"pdfjs-editor-resizer-bottom-middle\",\n bottomLeft: \"pdfjs-editor-resizer-bottom-left\",\n middleLeft: \"pdfjs-editor-resizer-middle-left\",\n });\n\n if (AnnotationEditor._borderLineWidth !== -1) {\n return;\n }\n const style = getComputedStyle(document.documentElement);\n AnnotationEditor._borderLineWidth =\n parseFloat(style.getPropertyValue(\"--outline-width\")) || 0;\n }\n\n /**\n * Update the default parameters for this type of editor.\n * @param {number} _type\n * @param {*} _value\n */\n static updateDefaultParams(_type, _value) {}\n\n /**\n * Get the default properties to set in the UI for this type of editor.\n * @returns {Array}\n */\n static get defaultPropertiesToUpdate() {\n return [];\n }\n\n /**\n * Check if this kind of editor is able to handle the given mime type for\n * pasting.\n * @param {string} mime\n * @returns {boolean}\n */\n static isHandlingMimeForPasting(mime) {\n return false;\n }\n\n /**\n * Extract the data from the clipboard item and delegate the creation of the\n * editor to the parent.\n * @param {DataTransferItem} item\n * @param {AnnotationEditorLayer} parent\n */\n static paste(item, parent) {\n unreachable(\"Not implemented\");\n }\n\n /**\n * Get the properties to update in the UI for this editor.\n * @returns {Array}\n */\n get propertiesToUpdate() {\n return [];\n }\n\n get _isDraggable() {\n return this.#isDraggable;\n }\n\n set _isDraggable(value) {\n this.#isDraggable = value;\n this.div?.classList.toggle(\"draggable\", value);\n }\n\n /**\n * @returns {boolean} true if the editor handles the Enter key itself.\n */\n get isEnterHandled() {\n return true;\n }\n\n center() {\n const [pageWidth, pageHeight] = this.pageDimensions;\n switch (this.parentRotation) {\n case 90:\n this.x -= (this.height * pageHeight) / (pageWidth * 2);\n this.y += (this.width * pageWidth) / (pageHeight * 2);\n break;\n case 180:\n this.x += this.width / 2;\n this.y += this.height / 2;\n break;\n case 270:\n this.x += (this.height * pageHeight) / (pageWidth * 2);\n this.y -= (this.width * pageWidth) / (pageHeight * 2);\n break;\n default:\n this.x -= this.width / 2;\n this.y -= this.height / 2;\n break;\n }\n this.fixAndSetPosition();\n }\n\n /**\n * Add some commands into the CommandManager (undo/redo stuff).\n * @param {Object} params\n */\n addCommands(params) {\n this._uiManager.addCommands(params);\n }\n\n get currentLayer() {\n return this._uiManager.currentLayer;\n }\n\n /**\n * This editor will be behind the others.\n */\n setInBackground() {\n this.div.style.zIndex = 0;\n }\n\n /**\n * This editor will be in the foreground.\n */\n setInForeground() {\n this.div.style.zIndex = this.#zIndex;\n }\n\n setParent(parent) {\n if (parent !== null) {\n this.pageIndex = parent.pageIndex;\n this.pageDimensions = parent.pageDimensions;\n } else {\n // The editor is being removed from the DOM, so we need to stop resizing.\n this.#stopResizing();\n }\n this.parent = parent;\n }\n\n /**\n * onfocus callback.\n */\n focusin(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n if (!this.#hasBeenClicked) {\n this.parent.setSelected(this);\n } else {\n this.#hasBeenClicked = false;\n }\n }\n\n /**\n * onblur callback.\n * @param {FocusEvent} event\n */\n focusout(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n\n if (!this.isAttachedToDOM) {\n return;\n }\n\n // In case of focusout, the relatedTarget is the element which\n // is grabbing the focus.\n // So if the related target is an element under the div for this\n // editor, then the editor isn't unactive.\n const target = event.relatedTarget;\n if (target?.closest(`#${this.id}`)) {\n return;\n }\n\n event.preventDefault();\n\n if (!this.parent?.isMultipleSelection) {\n this.commitOrRemove();\n }\n }\n\n commitOrRemove() {\n if (this.isEmpty()) {\n this.remove();\n } else {\n this.commit();\n }\n }\n\n /**\n * Commit the data contained in this editor.\n */\n commit() {\n this.addToAnnotationStorage();\n }\n\n addToAnnotationStorage() {\n this._uiManager.addToAnnotationStorage(this);\n }\n\n /**\n * Set the editor position within its parent.\n * @param {number} x\n * @param {number} y\n * @param {number} tx - x-translation in screen coordinates.\n * @param {number} ty - y-translation in screen coordinates.\n */\n setAt(x, y, tx, ty) {\n const [width, height] = this.parentDimensions;\n [tx, ty] = this.screenToPageTranslation(tx, ty);\n\n this.x = (x + tx) / width;\n this.y = (y + ty) / height;\n\n this.fixAndSetPosition();\n }\n\n _moveAfterPaste(baseX, baseY) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setAt(\n baseX * parentWidth,\n baseY * parentHeight,\n this.width * parentWidth,\n this.height * parentHeight\n );\n this._onTranslated();\n }\n\n #translate([width, height], x, y) {\n [x, y] = this.screenToPageTranslation(x, y);\n\n this.x += x / width;\n this.y += y / height;\n\n this._onTranslating(this.x, this.y);\n\n this.fixAndSetPosition();\n }\n\n /**\n * Translate the editor position within its parent.\n * @param {number} x - x-translation in screen coordinates.\n * @param {number} y - y-translation in screen coordinates.\n */\n translate(x, y) {\n // We don't change the initial position because the move here hasn't been\n // done by the user.\n this.#translate(this.parentDimensions, x, y);\n }\n\n /**\n * Translate the editor position within its page and adjust the scroll\n * in order to have the editor in the view.\n * @param {number} x - x-translation in page coordinates.\n * @param {number} y - y-translation in page coordinates.\n */\n translateInPage(x, y) {\n this.#initialRect ||= [this.x, this.y, this.width, this.height];\n this.#translate(this.pageDimensions, x, y);\n this.div.scrollIntoView({ block: \"nearest\" });\n }\n\n translationDone() {\n this._onTranslated(this.x, this.y);\n }\n\n drag(tx, ty) {\n this.#initialRect ||= [this.x, this.y, this.width, this.height];\n const {\n div,\n parentDimensions: [parentWidth, parentHeight],\n } = this;\n this.x += tx / parentWidth;\n this.y += ty / parentHeight;\n if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {\n // It's possible to not have a parent: for example, when the user is\n // dragging all the selected editors but this one on a page which has been\n // destroyed.\n // It's why we need to check for it. In such a situation, it isn't really\n // a problem to not find a new parent: it's something which is related to\n // what the user is seeing, hence it depends on how pages are layed out.\n\n // The element will be outside of its parent so change the parent.\n const { x, y } = this.div.getBoundingClientRect();\n if (this.parent.findNewParent(this, x, y)) {\n this.x -= Math.floor(this.x);\n this.y -= Math.floor(this.y);\n }\n }\n\n // The editor can be moved wherever the user wants, so we don't need to fix\n // the position: it'll be done when the user will release the mouse button.\n\n let { x, y } = this;\n const [bx, by] = this.getBaseTranslation();\n x += bx;\n y += by;\n\n const { style } = div;\n style.left = `${(100 * x).toFixed(2)}%`;\n style.top = `${(100 * y).toFixed(2)}%`;\n\n this._onTranslating(x, y);\n\n div.scrollIntoView({ block: \"nearest\" });\n }\n\n /**\n * Called when the editor is being translated.\n * @param {number} x - in page coordinates.\n * @param {number} y - in page coordinates.\n */\n _onTranslating(x, y) {}\n\n /**\n * Called when the editor has been translated.\n * @param {number} x - in page coordinates.\n * @param {number} y - in page coordinates.\n */\n _onTranslated(x, y) {}\n\n get _hasBeenMoved() {\n return (\n !!this.#initialRect &&\n (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y)\n );\n }\n\n get _hasBeenResized() {\n return (\n !!this.#initialRect &&\n (this.#initialRect[2] !== this.width ||\n this.#initialRect[3] !== this.height)\n );\n }\n\n /**\n * Get the translation to take into account the editor border.\n * The CSS engine positions the element by taking the border into account so\n * we must apply the opposite translation to have the editor in the right\n * position.\n * @returns {Array}\n */\n getBaseTranslation() {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const { _borderLineWidth } = AnnotationEditor;\n const x = _borderLineWidth / parentWidth;\n const y = _borderLineWidth / parentHeight;\n switch (this.rotation) {\n case 90:\n return [-x, y];\n case 180:\n return [x, y];\n case 270:\n return [x, -y];\n default:\n return [-x, -y];\n }\n }\n\n /**\n * @returns {boolean} true if position must be fixed (i.e. make the x and y\n * living in the page).\n */\n get _mustFixPosition() {\n return true;\n }\n\n /**\n * Fix the position of the editor in order to keep it inside its parent page.\n * @param {number} [rotation] - the rotation of the page.\n */\n fixAndSetPosition(rotation = this.rotation) {\n const {\n div: { style },\n pageDimensions: [pageWidth, pageHeight],\n } = this;\n let { x, y, width, height } = this;\n width *= pageWidth;\n height *= pageHeight;\n x *= pageWidth;\n y *= pageHeight;\n\n if (this._mustFixPosition) {\n switch (rotation) {\n case 0:\n x = MathClamp(x, 0, pageWidth - width);\n y = MathClamp(y, 0, pageHeight - height);\n break;\n case 90:\n x = MathClamp(x, 0, pageWidth - height);\n y = MathClamp(y, width, pageHeight);\n break;\n case 180:\n x = MathClamp(x, width, pageWidth);\n y = MathClamp(y, height, pageHeight);\n break;\n case 270:\n x = MathClamp(x, height, pageWidth);\n y = MathClamp(y, 0, pageHeight - width);\n break;\n }\n }\n\n this.x = x /= pageWidth;\n this.y = y /= pageHeight;\n\n const [bx, by] = this.getBaseTranslation();\n x += bx;\n y += by;\n\n style.left = `${(100 * x).toFixed(2)}%`;\n style.top = `${(100 * y).toFixed(2)}%`;\n\n this.moveInDOM();\n }\n\n static #rotatePoint(x, y, angle) {\n switch (angle) {\n case 90:\n return [y, -x];\n case 180:\n return [-x, -y];\n case 270:\n return [-y, x];\n default:\n return [x, y];\n }\n }\n\n /**\n * Convert a screen translation into a page one.\n * @param {number} x\n * @param {number} y\n */\n screenToPageTranslation(x, y) {\n return AnnotationEditor.#rotatePoint(x, y, this.parentRotation);\n }\n\n /**\n * Convert a page translation into a screen one.\n * @param {number} x\n * @param {number} y\n */\n pageTranslationToScreen(x, y) {\n return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation);\n }\n\n #getRotationMatrix(rotation) {\n switch (rotation) {\n case 90: {\n const [pageWidth, pageHeight] = this.pageDimensions;\n return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0];\n }\n case 180:\n return [-1, 0, 0, -1];\n case 270: {\n const [pageWidth, pageHeight] = this.pageDimensions;\n return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0];\n }\n default:\n return [1, 0, 0, 1];\n }\n }\n\n get parentScale() {\n return this._uiManager.viewParameters.realScale;\n }\n\n get parentRotation() {\n return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;\n }\n\n get parentDimensions() {\n const {\n parentScale,\n pageDimensions: [pageWidth, pageHeight],\n } = this;\n return [pageWidth * parentScale, pageHeight * parentScale];\n }\n\n /**\n * Set the dimensions of this editor.\n * @param {number} width\n * @param {number} height\n */\n setDims(width, height) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const { style } = this.div;\n style.width = `${((100 * width) / parentWidth).toFixed(2)}%`;\n if (!this.#keepAspectRatio) {\n style.height = `${((100 * height) / parentHeight).toFixed(2)}%`;\n }\n }\n\n fixDims() {\n const { style } = this.div;\n const { height, width } = style;\n const widthPercent = width.endsWith(\"%\");\n const heightPercent = !this.#keepAspectRatio && height.endsWith(\"%\");\n if (widthPercent && heightPercent) {\n return;\n }\n\n const [parentWidth, parentHeight] = this.parentDimensions;\n if (!widthPercent) {\n style.width = `${((100 * parseFloat(width)) / parentWidth).toFixed(2)}%`;\n }\n if (!this.#keepAspectRatio && !heightPercent) {\n style.height = `${((100 * parseFloat(height)) / parentHeight).toFixed(2)}%`;\n }\n }\n\n /**\n * Get the translation used to position this editor when it's created.\n * @returns {Array}\n */\n getInitialTranslation() {\n return [0, 0];\n }\n\n #createResizers() {\n if (this.#resizersDiv) {\n return;\n }\n this.#resizersDiv = document.createElement(\"div\");\n this.#resizersDiv.classList.add(\"resizers\");\n // When the resizers are used with the keyboard, they're focusable, hence\n // we want to have them in this order (top left, top middle, top right, ...)\n // in the DOM to have the focus order correct.\n const classes = this._willKeepAspectRatio\n ? [\"topLeft\", \"topRight\", \"bottomRight\", \"bottomLeft\"]\n : [\n \"topLeft\",\n \"topMiddle\",\n \"topRight\",\n \"middleRight\",\n \"bottomRight\",\n \"bottomMiddle\",\n \"bottomLeft\",\n \"middleLeft\",\n ];\n const signal = this._uiManager._signal;\n for (const name of classes) {\n const div = document.createElement(\"div\");\n this.#resizersDiv.append(div);\n div.classList.add(\"resizer\", name);\n div.setAttribute(\"data-resizer-name\", name);\n div.addEventListener(\n \"pointerdown\",\n this.#resizerPointerdown.bind(this, name),\n { signal }\n );\n div.addEventListener(\"contextmenu\", noContextMenu, { signal });\n div.tabIndex = -1;\n }\n this.div.prepend(this.#resizersDiv);\n }\n\n #resizerPointerdown(name, event) {\n event.preventDefault();\n const { isMac } = FeatureTest.platform;\n if (event.button !== 0 || (event.ctrlKey && isMac)) {\n return;\n }\n\n this.#altText?.toggle(false);\n\n const savedDraggable = this._isDraggable;\n this._isDraggable = false;\n this.#lastPointerCoords = [event.screenX, event.screenY];\n\n const ac = new AbortController();\n const signal = this._uiManager.combinedSignal(ac);\n\n this.parent.togglePointerEvents(false);\n window.addEventListener(\n \"pointermove\",\n this.#resizerPointermove.bind(this, name),\n { passive: true, capture: true, signal }\n );\n window.addEventListener(\n \"touchmove\",\n stopEvent /* Prevent the page from scrolling */,\n { passive: false, signal }\n );\n window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n this.#savedDimensions = {\n savedX: this.x,\n savedY: this.y,\n savedWidth: this.width,\n savedHeight: this.height,\n };\n const savedParentCursor = this.parent.div.style.cursor;\n const savedCursor = this.div.style.cursor;\n this.div.style.cursor = this.parent.div.style.cursor =\n window.getComputedStyle(event.target).cursor;\n\n const pointerUpCallback = () => {\n ac.abort();\n this.parent.togglePointerEvents(true);\n this.#altText?.toggle(true);\n this._isDraggable = savedDraggable;\n this.parent.div.style.cursor = savedParentCursor;\n this.div.style.cursor = savedCursor;\n\n this.#addResizeToUndoStack();\n };\n window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n // If the user switches to another window (with alt+tab), then we end the\n // resize session.\n window.addEventListener(\"blur\", pointerUpCallback, { signal });\n }\n\n #resize(x, y, width, height) {\n this.width = width;\n this.height = height;\n this.x = x;\n this.y = y;\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setDims(parentWidth * width, parentHeight * height);\n this.fixAndSetPosition();\n this._onResized();\n }\n\n /**\n * Called when the editor has been resized.\n */\n _onResized() {}\n\n #addResizeToUndoStack() {\n if (!this.#savedDimensions) {\n return;\n }\n const { savedX, savedY, savedWidth, savedHeight } = this.#savedDimensions;\n this.#savedDimensions = null;\n\n const newX = this.x;\n const newY = this.y;\n const newWidth = this.width;\n const newHeight = this.height;\n if (\n newX === savedX &&\n newY === savedY &&\n newWidth === savedWidth &&\n newHeight === savedHeight\n ) {\n return;\n }\n\n this.addCommands({\n cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight),\n undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight),\n mustExec: true,\n });\n }\n\n static _round(x) {\n // 10000 because we multiply by 100 and use toFixed(2) in fixAndSetPosition.\n // Without rounding, the positions of the corners other than the top left\n // one can be slightly wrong.\n return Math.round(x * 10000) / 10000;\n }\n\n #resizerPointermove(name, event) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const savedX = this.x;\n const savedY = this.y;\n const savedWidth = this.width;\n const savedHeight = this.height;\n const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n\n const rotationMatrix = this.#getRotationMatrix(this.rotation);\n const transf = (x, y) => [\n rotationMatrix[0] * x + rotationMatrix[2] * y,\n rotationMatrix[1] * x + rotationMatrix[3] * y,\n ];\n const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation);\n const invTransf = (x, y) => [\n invRotationMatrix[0] * x + invRotationMatrix[2] * y,\n invRotationMatrix[1] * x + invRotationMatrix[3] * y,\n ];\n let getPoint;\n let getOpposite;\n let isDiagonal = false;\n let isHorizontal = false;\n\n switch (name) {\n case \"topLeft\":\n isDiagonal = true;\n getPoint = (w, h) => [0, 0];\n getOpposite = (w, h) => [w, h];\n break;\n case \"topMiddle\":\n getPoint = (w, h) => [w / 2, 0];\n getOpposite = (w, h) => [w / 2, h];\n break;\n case \"topRight\":\n isDiagonal = true;\n getPoint = (w, h) => [w, 0];\n getOpposite = (w, h) => [0, h];\n break;\n case \"middleRight\":\n isHorizontal = true;\n getPoint = (w, h) => [w, h / 2];\n getOpposite = (w, h) => [0, h / 2];\n break;\n case \"bottomRight\":\n isDiagonal = true;\n getPoint = (w, h) => [w, h];\n getOpposite = (w, h) => [0, 0];\n break;\n case \"bottomMiddle\":\n getPoint = (w, h) => [w / 2, h];\n getOpposite = (w, h) => [w / 2, 0];\n break;\n case \"bottomLeft\":\n isDiagonal = true;\n getPoint = (w, h) => [0, h];\n getOpposite = (w, h) => [w, 0];\n break;\n case \"middleLeft\":\n isHorizontal = true;\n getPoint = (w, h) => [0, h / 2];\n getOpposite = (w, h) => [w, h / 2];\n break;\n }\n\n const point = getPoint(savedWidth, savedHeight);\n const oppositePoint = getOpposite(savedWidth, savedHeight);\n let transfOppositePoint = transf(...oppositePoint);\n const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]);\n const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]);\n let ratioX = 1;\n let ratioY = 1;\n\n let deltaX, deltaY;\n\n if (!event.fromKeyboard) {\n // We can't use event.movementX/Y because they're not reliable:\n // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX\n // (it was buggy on a laptop with a touch screen).\n const { screenX, screenY } = event;\n const [lastScreenX, lastScreenY] = this.#lastPointerCoords;\n [deltaX, deltaY] = this.screenToPageTranslation(\n screenX - lastScreenX,\n screenY - lastScreenY\n );\n this.#lastPointerCoords[0] = screenX;\n this.#lastPointerCoords[1] = screenY;\n } else {\n ({ deltaX, deltaY } = event);\n }\n [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight);\n\n if (isDiagonal) {\n const oldDiag = Math.hypot(savedWidth, savedHeight);\n ratioX = ratioY = Math.max(\n Math.min(\n Math.hypot(\n oppositePoint[0] - point[0] - deltaX,\n oppositePoint[1] - point[1] - deltaY\n ) / oldDiag,\n // Avoid the editor to be larger than the page.\n 1 / savedWidth,\n 1 / savedHeight\n ),\n // Avoid the editor to be smaller than the minimum size.\n minWidth / savedWidth,\n minHeight / savedHeight\n );\n } else if (isHorizontal) {\n ratioX =\n MathClamp(Math.abs(oppositePoint[0] - point[0] - deltaX), minWidth, 1) /\n savedWidth;\n } else {\n ratioY =\n MathClamp(\n Math.abs(oppositePoint[1] - point[1] - deltaY),\n minHeight,\n 1\n ) / savedHeight;\n }\n\n const newWidth = AnnotationEditor._round(savedWidth * ratioX);\n const newHeight = AnnotationEditor._round(savedHeight * ratioY);\n transfOppositePoint = transf(...getOpposite(newWidth, newHeight));\n const newX = oppositeX - transfOppositePoint[0];\n const newY = oppositeY - transfOppositePoint[1];\n\n this.#initialRect ||= [this.x, this.y, this.width, this.height];\n this.width = newWidth;\n this.height = newHeight;\n this.x = newX;\n this.y = newY;\n\n this.setDims(parentWidth * newWidth, parentHeight * newHeight);\n this.fixAndSetPosition();\n\n this._onResizing();\n }\n\n /**\n * Called when the editor is being resized.\n */\n _onResizing() {}\n\n /**\n * Called when the alt text dialog is closed.\n */\n altTextFinish() {\n this.#altText?.finish();\n }\n\n /**\n * Add a toolbar for this editor.\n * @returns {Promise}\n */\n async addEditToolbar() {\n if (this._editToolbar || this.#isInEditMode) {\n return this._editToolbar;\n }\n this._editToolbar = new EditorToolbar(this);\n this.div.append(this._editToolbar.render());\n if (this.#altText) {\n await this._editToolbar.addAltText(this.#altText);\n }\n\n return this._editToolbar;\n }\n\n removeEditToolbar() {\n if (!this._editToolbar) {\n return;\n }\n this._editToolbar.remove();\n this._editToolbar = null;\n\n // We destroy the alt text but we don't null it because we want to be able\n // to restore it in case the user undoes the deletion.\n this.#altText?.destroy();\n }\n\n addContainer(container) {\n const editToolbarDiv = this._editToolbar?.div;\n if (editToolbarDiv) {\n editToolbarDiv.before(container);\n } else {\n this.div.append(container);\n }\n }\n\n getClientDimensions() {\n return this.div.getBoundingClientRect();\n }\n\n async addAltTextButton() {\n if (this.#altText) {\n return;\n }\n AltText.initialize(AnnotationEditor._l10n);\n this.#altText = new AltText(this);\n if (this.#accessibilityData) {\n this.#altText.data = this.#accessibilityData;\n this.#accessibilityData = null;\n }\n await this.addEditToolbar();\n }\n\n get altTextData() {\n return this.#altText?.data;\n }\n\n /**\n * Set the alt text data.\n */\n set altTextData(data) {\n if (!this.#altText) {\n return;\n }\n this.#altText.data = data;\n }\n\n get guessedAltText() {\n return this.#altText?.guessedText;\n }\n\n async setGuessedAltText(text) {\n await this.#altText?.setGuessedText(text);\n }\n\n serializeAltText(isForCopying) {\n return this.#altText?.serialize(isForCopying);\n }\n\n hasAltText() {\n return !!this.#altText && !this.#altText.isEmpty();\n }\n\n hasAltTextData() {\n return this.#altText?.hasData() ?? false;\n }\n\n /**\n * Render this editor in a div.\n * @returns {HTMLDivElement | null}\n */\n render() {\n const div = (this.div = document.createElement(\"div\"));\n div.setAttribute(\"data-editor-rotation\", (360 - this.rotation) % 360);\n div.className = this.name;\n div.setAttribute(\"id\", this.id);\n div.tabIndex = this.#disabled ? -1 : 0;\n div.setAttribute(\"role\", \"application\");\n if (this.defaultL10nId) {\n div.setAttribute(\"data-l10n-id\", this.defaultL10nId);\n }\n if (!this._isVisible) {\n div.classList.add(\"hidden\");\n }\n\n this.setInForeground();\n this.#addFocusListeners();\n\n const [parentWidth, parentHeight] = this.parentDimensions;\n if (this.parentRotation % 180 !== 0) {\n div.style.maxWidth = `${((100 * parentHeight) / parentWidth).toFixed(\n 2\n )}%`;\n div.style.maxHeight = `${((100 * parentWidth) / parentHeight).toFixed(\n 2\n )}%`;\n }\n\n const [tx, ty] = this.getInitialTranslation();\n this.translate(tx, ty);\n\n bindEvents(this, div, [\"keydown\", \"pointerdown\"]);\n\n if (this.isResizable && this._uiManager._supportsPinchToZoom) {\n this.#touchManager ||= new TouchManager({\n container: div,\n isPinchingDisabled: () => !this.isSelected,\n onPinchStart: this.#touchPinchStartCallback.bind(this),\n onPinching: this.#touchPinchCallback.bind(this),\n onPinchEnd: this.#touchPinchEndCallback.bind(this),\n signal: this._uiManager._signal,\n });\n }\n\n this._uiManager._editorUndoBar?.hide();\n\n return div;\n }\n\n #touchPinchStartCallback() {\n this.#savedDimensions = {\n savedX: this.x,\n savedY: this.y,\n savedWidth: this.width,\n savedHeight: this.height,\n };\n this.#altText?.toggle(false);\n this.parent.togglePointerEvents(false);\n }\n\n #touchPinchCallback(_origin, prevDistance, distance) {\n // Slightly slow down the zooming because the editor could be small and the\n // user could have difficulties to rescale it as they want.\n const slowDownFactor = 0.7;\n let factor =\n slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor;\n if (factor === 1) {\n return;\n }\n\n const rotationMatrix = this.#getRotationMatrix(this.rotation);\n const transf = (x, y) => [\n rotationMatrix[0] * x + rotationMatrix[2] * y,\n rotationMatrix[1] * x + rotationMatrix[3] * y,\n ];\n\n // The center of the editor is the fixed point.\n const [parentWidth, parentHeight] = this.parentDimensions;\n const savedX = this.x;\n const savedY = this.y;\n const savedWidth = this.width;\n const savedHeight = this.height;\n\n const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n factor = Math.max(\n Math.min(factor, 1 / savedWidth, 1 / savedHeight),\n minWidth / savedWidth,\n minHeight / savedHeight\n );\n const newWidth = AnnotationEditor._round(savedWidth * factor);\n const newHeight = AnnotationEditor._round(savedHeight * factor);\n if (newWidth === savedWidth && newHeight === savedHeight) {\n return;\n }\n\n this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight];\n const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2);\n const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]);\n const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]);\n const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2);\n\n this.x = centerX - newTransfCenterPoint[0];\n this.y = centerY - newTransfCenterPoint[1];\n this.width = newWidth;\n this.height = newHeight;\n\n this.setDims(parentWidth * newWidth, parentHeight * newHeight);\n this.fixAndSetPosition();\n\n this._onResizing();\n }\n\n #touchPinchEndCallback() {\n this.#altText?.toggle(true);\n this.parent.togglePointerEvents(true);\n this.#addResizeToUndoStack();\n }\n\n /**\n * Onpointerdown callback.\n * @param {PointerEvent} event\n */\n pointerdown(event) {\n const { isMac } = FeatureTest.platform;\n if (event.button !== 0 || (event.ctrlKey && isMac)) {\n // Avoid to focus this editor because of a non-left click.\n event.preventDefault();\n return;\n }\n this.#hasBeenClicked = true;\n\n if (this._isDraggable) {\n this.#setUpDragSession(event);\n return;\n }\n\n this.#selectOnPointerEvent(event);\n }\n\n get isSelected() {\n return this._uiManager.isSelected(this);\n }\n\n #selectOnPointerEvent(event) {\n const { isMac } = FeatureTest.platform;\n if (\n (event.ctrlKey && !isMac) ||\n event.shiftKey ||\n (event.metaKey && isMac)\n ) {\n this.parent.toggleSelected(this);\n } else {\n this.parent.setSelected(this);\n }\n }\n\n #setUpDragSession(event) {\n const { isSelected } = this;\n this._uiManager.setUpDragSession();\n let hasDraggingStarted = false;\n\n const ac = new AbortController();\n const signal = this._uiManager.combinedSignal(ac);\n const opts = { capture: true, passive: false, signal };\n const cancelDrag = e => {\n ac.abort();\n\n this.#dragPointerId = null;\n this.#hasBeenClicked = false;\n if (!this._uiManager.endDragSession()) {\n this.#selectOnPointerEvent(e);\n }\n if (hasDraggingStarted) {\n this._onStopDragging();\n }\n };\n\n if (isSelected) {\n this.#prevDragX = event.clientX;\n this.#prevDragY = event.clientY;\n this.#dragPointerId = event.pointerId;\n this.#dragPointerType = event.pointerType;\n window.addEventListener(\n \"pointermove\",\n e => {\n if (!hasDraggingStarted) {\n hasDraggingStarted = true;\n this._onStartDragging();\n }\n const { clientX: x, clientY: y, pointerId } = e;\n if (pointerId !== this.#dragPointerId) {\n stopEvent(e);\n return;\n }\n const [tx, ty] = this.screenToPageTranslation(\n x - this.#prevDragX,\n y - this.#prevDragY\n );\n this.#prevDragX = x;\n this.#prevDragY = y;\n this._uiManager.dragSelectedEditors(tx, ty);\n },\n opts\n );\n window.addEventListener(\n \"touchmove\",\n stopEvent /* Prevent the page from scrolling */,\n opts\n );\n window.addEventListener(\n \"pointerdown\",\n // If the user drags with one finger and then clicks with another.\n e => {\n if (e.pointerType === this.#dragPointerType) {\n // We've a pinch to zoom session.\n // We cannot have two primaries at the same time.\n // It's possible to be in this state with Firefox and Gnome when\n // trying to drag with three fingers (see bug 1933716).\n if (this.#touchManager || e.isPrimary) {\n cancelDrag(e);\n }\n }\n stopEvent(e);\n },\n opts\n );\n }\n\n const pointerUpCallback = e => {\n if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) {\n cancelDrag(e);\n return;\n }\n stopEvent(e);\n };\n window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n // If the user is using alt+tab during the dragging session, the pointerup\n // event could be not fired, but a blur event is fired so we can use it in\n // order to interrupt the dragging session.\n window.addEventListener(\"blur\", pointerUpCallback, { signal });\n }\n\n _onStartDragging() {}\n\n _onStopDragging() {}\n\n moveInDOM() {\n // Moving the editor in the DOM can be expensive, so we wait a bit before.\n // It's important to not block the UI (for example when changing the font\n // size in a FreeText).\n if (this.#moveInDOMTimeout) {\n clearTimeout(this.#moveInDOMTimeout);\n }\n this.#moveInDOMTimeout = setTimeout(() => {\n this.#moveInDOMTimeout = null;\n this.parent?.moveEditorInDOM(this);\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n this._uiManager._eventBus.dispatch(\"editormovedindom\", {\n source: this,\n });\n }\n }, 0);\n }\n\n _setParentAndPosition(parent, x, y) {\n parent.changeParent(this);\n this.x = x;\n this.y = y;\n this.fixAndSetPosition();\n this._onTranslated();\n }\n\n /**\n * Convert the current rect into a page one.\n * @param {number} tx - x-translation in screen coordinates.\n * @param {number} ty - y-translation in screen coordinates.\n * @param {number} [rotation] - the rotation of the page.\n */\n getRect(tx, ty, rotation = this.rotation) {\n const scale = this.parentScale;\n const [pageWidth, pageHeight] = this.pageDimensions;\n const [pageX, pageY] = this.pageTranslation;\n const shiftX = tx / scale;\n const shiftY = ty / scale;\n const x = this.x * pageWidth;\n const y = this.y * pageHeight;\n const width = this.width * pageWidth;\n const height = this.height * pageHeight;\n\n switch (rotation) {\n case 0:\n return [\n x + shiftX + pageX,\n pageHeight - y - shiftY - height + pageY,\n x + shiftX + width + pageX,\n pageHeight - y - shiftY + pageY,\n ];\n case 90:\n return [\n x + shiftY + pageX,\n pageHeight - y + shiftX + pageY,\n x + shiftY + height + pageX,\n pageHeight - y + shiftX + width + pageY,\n ];\n case 180:\n return [\n x - shiftX - width + pageX,\n pageHeight - y + shiftY + pageY,\n x - shiftX + pageX,\n pageHeight - y + shiftY + height + pageY,\n ];\n case 270:\n return [\n x - shiftY - height + pageX,\n pageHeight - y - shiftX - width + pageY,\n x - shiftY + pageX,\n pageHeight - y - shiftX + pageY,\n ];\n default:\n throw new Error(\"Invalid rotation\");\n }\n }\n\n getRectInCurrentCoords(rect, pageHeight) {\n const [x1, y1, x2, y2] = rect;\n\n const width = x2 - x1;\n const height = y2 - y1;\n\n switch (this.rotation) {\n case 0:\n return [x1, pageHeight - y2, width, height];\n case 90:\n return [x1, pageHeight - y1, height, width];\n case 180:\n return [x2, pageHeight - y1, width, height];\n case 270:\n return [x2, pageHeight - y2, height, width];\n default:\n throw new Error(\"Invalid rotation\");\n }\n }\n\n /**\n * Executed once this editor has been rendered.\n * @param {boolean} focus - true if the editor should be focused.\n */\n onceAdded(focus) {}\n\n /**\n * Check if the editor contains something.\n * @returns {boolean}\n */\n isEmpty() {\n return false;\n }\n\n /**\n * Enable edit mode.\n */\n enableEditMode() {\n this.#isInEditMode = true;\n }\n\n /**\n * Disable edit mode.\n */\n disableEditMode() {\n this.#isInEditMode = false;\n }\n\n /**\n * Check if the editor is edited.\n * @returns {boolean}\n */\n isInEditMode() {\n return this.#isInEditMode;\n }\n\n /**\n * If it returns true, then this editor handles the keyboard\n * events itself.\n * @returns {boolean}\n */\n shouldGetKeyboardEvents() {\n return this.#isResizerEnabledForKeyboard;\n }\n\n /**\n * Check if this editor needs to be rebuilt or not.\n * @returns {boolean}\n */\n needsToBeRebuilt() {\n return this.div && !this.isAttachedToDOM;\n }\n\n get isOnScreen() {\n const { top, left, bottom, right } = this.getClientDimensions();\n const { innerHeight, innerWidth } = window;\n return left < innerWidth && right > 0 && top < innerHeight && bottom > 0;\n }\n\n #addFocusListeners() {\n if (this.#focusAC || !this.div) {\n return;\n }\n this.#focusAC = new AbortController();\n const signal = this._uiManager.combinedSignal(this.#focusAC);\n\n this.div.addEventListener(\"focusin\", this.focusin.bind(this), { signal });\n this.div.addEventListener(\"focusout\", this.focusout.bind(this), { signal });\n }\n\n /**\n * Rebuild the editor in case it has been removed on undo.\n *\n * To implement in subclasses.\n */\n rebuild() {\n this.#addFocusListeners();\n }\n\n /**\n * Rotate the editor when the page is rotated.\n * @param {number} angle\n */\n rotate(_angle) {}\n\n /**\n * Resize the editor when the page is resized.\n */\n resize() {}\n\n /**\n * Serialize the editor when it has been deleted.\n * @returns {Object}\n */\n serializeDeleted() {\n return {\n id: this.annotationElementId,\n deleted: true,\n pageIndex: this.pageIndex,\n popupRef: this._initialData?.popupRef || \"\",\n };\n }\n\n /**\n * Serialize the editor.\n * The result of the serialization will be used to construct a\n * new annotation to add to the pdf document.\n *\n * To implement in subclasses.\n * @param {boolean} [isForCopying]\n * @param {Object | null} [context]\n * @returns {Object | null}\n */\n serialize(isForCopying = false, context = null) {\n unreachable(\"An editor must be serializable\");\n }\n\n /**\n * Deserialize the editor.\n * The result of the deserialization is a new editor.\n *\n * @param {Object} data\n * @param {AnnotationEditorLayer} parent\n * @param {AnnotationEditorUIManager} uiManager\n * @returns {Promise}\n */\n static async deserialize(data, parent, uiManager) {\n const editor = new this.prototype.constructor({\n parent,\n id: parent.getNextId(),\n uiManager,\n });\n editor.rotation = data.rotation;\n editor.#accessibilityData = data.accessibilityData;\n editor._isCopy = data.isCopy || false;\n\n const [pageWidth, pageHeight] = editor.pageDimensions;\n const [x, y, width, height] = editor.getRectInCurrentCoords(\n data.rect,\n pageHeight\n );\n\n editor.x = x / pageWidth;\n editor.y = y / pageHeight;\n editor.width = width / pageWidth;\n editor.height = height / pageHeight;\n\n return editor;\n }\n\n /**\n * Check if an existing annotation associated with this editor has been\n * modified.\n * @returns {boolean}\n */\n get hasBeenModified() {\n return (\n !!this.annotationElementId && (this.deleted || this.serialize() !== null)\n );\n }\n\n /**\n * Remove this editor.\n * It's used on ctrl+backspace action.\n */\n remove() {\n this.#focusAC?.abort();\n this.#focusAC = null;\n\n if (!this.isEmpty()) {\n // The editor is removed but it can be back at some point thanks to\n // undo/redo so we must commit it before.\n this.commit();\n }\n if (this.parent) {\n this.parent.remove(this);\n } else {\n this._uiManager.removeEditor(this);\n }\n\n if (this.#moveInDOMTimeout) {\n clearTimeout(this.#moveInDOMTimeout);\n this.#moveInDOMTimeout = null;\n }\n this.#stopResizing();\n this.removeEditToolbar();\n if (this.#telemetryTimeouts) {\n for (const timeout of this.#telemetryTimeouts.values()) {\n clearTimeout(timeout);\n }\n this.#telemetryTimeouts = null;\n }\n this.parent = null;\n this.#touchManager?.destroy();\n this.#touchManager = null;\n }\n\n /**\n * @returns {boolean} true if this editor can be resized.\n */\n get isResizable() {\n return false;\n }\n\n /**\n * Add the resizers to this editor.\n */\n makeResizable() {\n if (this.isResizable) {\n this.#createResizers();\n this.#resizersDiv.classList.remove(\"hidden\");\n }\n }\n\n get toolbarPosition() {\n return null;\n }\n\n /**\n * onkeydown callback.\n * @param {KeyboardEvent} event\n */\n keydown(event) {\n if (\n !this.isResizable ||\n event.target !== this.div ||\n event.key !== \"Enter\"\n ) {\n return;\n }\n this._uiManager.setSelected(this);\n this.#savedDimensions = {\n savedX: this.x,\n savedY: this.y,\n savedWidth: this.width,\n savedHeight: this.height,\n };\n const children = this.#resizersDiv.children;\n if (!this.#allResizerDivs) {\n this.#allResizerDivs = Array.from(children);\n const boundResizerKeydown = this.#resizerKeydown.bind(this);\n const boundResizerBlur = this.#resizerBlur.bind(this);\n const signal = this._uiManager._signal;\n for (const div of this.#allResizerDivs) {\n const name = div.getAttribute(\"data-resizer-name\");\n div.setAttribute(\"role\", \"spinbutton\");\n div.addEventListener(\"keydown\", boundResizerKeydown, { signal });\n div.addEventListener(\"blur\", boundResizerBlur, { signal });\n div.addEventListener(\"focus\", this.#resizerFocus.bind(this, name), {\n signal,\n });\n div.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n }\n }\n\n // We want to have the resizers in the visual order, so we move the first\n // (top-left) to the right place.\n const first = this.#allResizerDivs[0];\n let firstPosition = 0;\n for (const div of children) {\n if (div === first) {\n break;\n }\n firstPosition++;\n }\n const nextFirstPosition =\n (((360 - this.rotation + this.parentRotation) % 360) / 90) *\n (this.#allResizerDivs.length / 4);\n\n if (nextFirstPosition !== firstPosition) {\n // We need to reorder the resizers in the DOM in order to have the focus\n // on the top-left one.\n if (nextFirstPosition < firstPosition) {\n for (let i = 0; i < firstPosition - nextFirstPosition; i++) {\n this.#resizersDiv.append(this.#resizersDiv.firstChild);\n }\n } else if (nextFirstPosition > firstPosition) {\n for (let i = 0; i < nextFirstPosition - firstPosition; i++) {\n this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild);\n }\n }\n\n let i = 0;\n for (const child of children) {\n const div = this.#allResizerDivs[i++];\n const name = div.getAttribute(\"data-resizer-name\");\n child.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n }\n }\n\n this.#setResizerTabIndex(0);\n this.#isResizerEnabledForKeyboard = true;\n this.#resizersDiv.firstChild.focus({ focusVisible: true });\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n #resizerKeydown(event) {\n AnnotationEditor._resizerKeyboardManager.exec(this, event);\n }\n\n #resizerBlur(event) {\n if (\n this.#isResizerEnabledForKeyboard &&\n event.relatedTarget?.parentNode !== this.#resizersDiv\n ) {\n this.#stopResizing();\n }\n }\n\n #resizerFocus(name) {\n this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : \"\";\n }\n\n #setResizerTabIndex(value) {\n if (!this.#allResizerDivs) {\n return;\n }\n for (const div of this.#allResizerDivs) {\n div.tabIndex = value;\n }\n }\n\n _resizeWithKeyboard(x, y) {\n if (!this.#isResizerEnabledForKeyboard) {\n return;\n }\n this.#resizerPointermove(this.#focusedResizerName, {\n deltaX: x,\n deltaY: y,\n fromKeyboard: true,\n });\n }\n\n #stopResizing() {\n this.#isResizerEnabledForKeyboard = false;\n this.#setResizerTabIndex(-1);\n this.#addResizeToUndoStack();\n }\n\n _stopResizingWithKeyboard() {\n this.#stopResizing();\n this.div.focus();\n }\n\n /**\n * Select this editor.\n */\n select() {\n this.makeResizable();\n this.div?.classList.add(\"selectedEditor\");\n if (!this._editToolbar) {\n this.addEditToolbar().then(() => {\n if (this.div?.classList.contains(\"selectedEditor\")) {\n // The editor can have been unselected while we were waiting for the\n // edit toolbar to be created, hence we want to be sure that this\n // editor is still selected.\n this._editToolbar?.show();\n }\n });\n return;\n }\n this._editToolbar?.show();\n this.#altText?.toggleAltTextBadge(false);\n }\n\n /**\n * Unselect this editor.\n */\n unselect() {\n this.#resizersDiv?.classList.add(\"hidden\");\n this.div?.classList.remove(\"selectedEditor\");\n if (this.div?.contains(document.activeElement)) {\n // Don't use this.div.blur() because we don't know where the focus will\n // go.\n this._uiManager.currentLayer.div.focus({\n preventScroll: true,\n });\n }\n this._editToolbar?.hide();\n this.#altText?.toggleAltTextBadge(true);\n }\n\n /**\n * Update some parameters which have been changed through the UI.\n * @param {number} type\n * @param {*} value\n */\n updateParams(type, value) {}\n\n /**\n * When the user disables the editing mode some editors can change some of\n * their properties.\n */\n disableEditing() {}\n\n /**\n * When the user enables the editing mode some editors can change some of\n * their properties.\n */\n enableEditing() {}\n\n /**\n * The editor is about to be edited.\n */\n enterInEditMode() {}\n\n /**\n * @returns {HTMLElement | null} the element requiring an alt text.\n */\n getElementForAltText() {\n return this.div;\n }\n\n /**\n * Get the div which really contains the displayed content.\n * @returns {HTMLDivElement | undefined}\n */\n get contentDiv() {\n return this.div;\n }\n\n /**\n * If true then the editor is currently edited.\n * @type {boolean}\n */\n get isEditing() {\n return this.#isEditing;\n }\n\n /**\n * When set to true, it means that this editor is currently edited.\n * @param {boolean} value\n */\n set isEditing(value) {\n this.#isEditing = value;\n if (!this.parent) {\n return;\n }\n if (value) {\n this.parent.setSelected(this);\n this.parent.setActiveEditor(this);\n } else {\n this.parent.setActiveEditor(null);\n }\n }\n\n /**\n * Set the aspect ratio to use when resizing.\n * @param {number} width\n * @param {number} height\n */\n setAspectRatio(width, height) {\n this.#keepAspectRatio = true;\n const aspectRatio = width / height;\n const { style } = this.div;\n style.aspectRatio = aspectRatio;\n style.height = \"auto\";\n }\n\n static get MIN_SIZE() {\n return 16;\n }\n\n static canCreateNewEmptyEditor() {\n return true;\n }\n\n /**\n * Get the data to report to the telemetry when the editor is added.\n * @returns {Object}\n */\n get telemetryInitialData() {\n return { action: \"added\" };\n }\n\n /**\n * The telemetry data to use when saving/printing.\n * @returns {Object|null}\n */\n get telemetryFinalData() {\n return null;\n }\n\n _reportTelemetry(data, mustWait = false) {\n if (mustWait) {\n this.#telemetryTimeouts ||= new Map();\n const { action } = data;\n let timeout = this.#telemetryTimeouts.get(action);\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n this._reportTelemetry(data);\n this.#telemetryTimeouts.delete(action);\n if (this.#telemetryTimeouts.size === 0) {\n this.#telemetryTimeouts = null;\n }\n }, AnnotationEditor._telemetryTimeout);\n this.#telemetryTimeouts.set(action, timeout);\n return;\n }\n data.type ||= this.editorType;\n this._uiManager._eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data,\n },\n });\n }\n\n /**\n * Show or hide this editor.\n * @param {boolean|undefined} visible\n */\n show(visible = this._isVisible) {\n this.div.classList.toggle(\"hidden\", !visible);\n this._isVisible = visible;\n }\n\n enable() {\n if (this.div) {\n this.div.tabIndex = 0;\n }\n this.#disabled = false;\n }\n\n disable() {\n if (this.div) {\n this.div.tabIndex = -1;\n }\n this.#disabled = true;\n }\n\n /**\n * Render an annotation in the annotation layer.\n * @param {Object} annotation\n * @returns {HTMLElement|null}\n */\n renderAnnotationElement(annotation) {\n let content = annotation.container.querySelector(\".annotationContent\");\n if (!content) {\n content = document.createElement(\"div\");\n content.classList.add(\"annotationContent\", this.editorType);\n annotation.container.prepend(content);\n } else if (content.nodeName === \"CANVAS\") {\n const canvas = content;\n content = document.createElement(\"div\");\n content.classList.add(\"annotationContent\", this.editorType);\n canvas.before(content);\n }\n\n return content;\n }\n\n resetAnnotationElement(annotation) {\n const { firstChild } = annotation.container;\n if (\n firstChild?.nodeName === \"DIV\" &&\n firstChild.classList.contains(\"annotationContent\")\n ) {\n firstChild.remove();\n }\n }\n}\n\n// This class is used to fake an editor which has been deleted.\nclass FakeEditor extends AnnotationEditor {\n constructor(params) {\n super(params);\n this.annotationElementId = params.annotationElementId;\n this.deleted = true;\n }\n\n serialize() {\n return this.serializeDeleted();\n }\n}\n\nexport { AnnotationEditor };\n","/* Copyright 2014 Opera Software ASA\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n *\n * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.\n * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.\n */\n\nconst SEED = 0xc3d2e1f0;\n// Workaround for missing math precision in JS.\nconst MASK_HIGH = 0xffff0000;\nconst MASK_LOW = 0xffff;\n\nclass MurmurHash3_64 {\n constructor(seed) {\n this.h1 = seed ? seed & 0xffffffff : SEED;\n this.h2 = seed ? seed & 0xffffffff : SEED;\n }\n\n update(input) {\n let data, length;\n if (typeof input === \"string\") {\n data = new Uint8Array(input.length * 2);\n length = 0;\n for (let i = 0, ii = input.length; i < ii; i++) {\n const code = input.charCodeAt(i);\n if (code <= 0xff) {\n data[length++] = code;\n } else {\n data[length++] = code >>> 8;\n data[length++] = code & 0xff;\n }\n }\n } else if (ArrayBuffer.isView(input)) {\n data = input.slice();\n length = data.byteLength;\n } else {\n throw new Error(\"Invalid data format, must be a string or TypedArray.\");\n }\n\n const blockCounts = length >> 2;\n const tailLength = length - blockCounts * 4;\n // We don't care about endianness here.\n const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n let k1 = 0,\n k2 = 0;\n let h1 = this.h1,\n h2 = this.h2;\n const C1 = 0xcc9e2d51,\n C2 = 0x1b873593;\n const C1_LOW = C1 & MASK_LOW,\n C2_LOW = C2 & MASK_LOW;\n\n for (let i = 0; i < blockCounts; i++) {\n if (i & 1) {\n k1 = dataUint32[i];\n k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1 = h1 * 5 + 0xe6546b64;\n } else {\n k2 = dataUint32[i];\n k2 = ((k2 * C1) & MASK_HIGH) | ((k2 * C1_LOW) & MASK_LOW);\n k2 = (k2 << 15) | (k2 >>> 17);\n k2 = ((k2 * C2) & MASK_HIGH) | ((k2 * C2_LOW) & MASK_LOW);\n h2 ^= k2;\n h2 = (h2 << 13) | (h2 >>> 19);\n h2 = h2 * 5 + 0xe6546b64;\n }\n }\n\n k1 = 0;\n\n switch (tailLength) {\n case 3:\n k1 ^= data[blockCounts * 4 + 2] << 16;\n /* falls through */\n case 2:\n k1 ^= data[blockCounts * 4 + 1] << 8;\n /* falls through */\n case 1:\n k1 ^= data[blockCounts * 4];\n /* falls through */\n\n k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n if (blockCounts & 1) {\n h1 ^= k1;\n } else {\n h2 ^= k1;\n }\n }\n\n this.h1 = h1;\n this.h2 = h2;\n }\n\n hexdigest() {\n let h1 = this.h1,\n h2 = this.h2;\n\n h1 ^= h2 >>> 1;\n h1 = ((h1 * 0xed558ccd) & MASK_HIGH) | ((h1 * 0x8ccd) & MASK_LOW);\n h2 =\n ((h2 * 0xff51afd7) & MASK_HIGH) |\n (((((h2 << 16) | (h1 >>> 16)) * 0xafd7ed55) & MASK_HIGH) >>> 16);\n h1 ^= h2 >>> 1;\n h1 = ((h1 * 0x1a85ec53) & MASK_HIGH) | ((h1 * 0xec53) & MASK_LOW);\n h2 =\n ((h2 * 0xc4ceb9fe) & MASK_HIGH) |\n (((((h2 << 16) | (h1 >>> 16)) * 0xb9fe1a85) & MASK_HIGH) >>> 16);\n h1 ^= h2 >>> 1;\n\n return (\n (h1 >>> 0).toString(16).padStart(8, \"0\") +\n (h2 >>> 0).toString(16).padStart(8, \"0\")\n );\n }\n}\n\nexport { MurmurHash3_64 };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { shadow, unreachable } from \"../shared/util.js\";\nimport { AnnotationEditor } from \"./editor/editor.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst SerializableEmpty = Object.freeze({\n map: null,\n hash: \"\",\n transfer: undefined,\n});\n\n/**\n * Key/value storage for annotation data in forms.\n */\nclass AnnotationStorage {\n #modified = false;\n\n #modifiedIds = null;\n\n #storage = new Map();\n\n constructor() {\n // Callbacks to signal when the modification state is set or reset.\n // This is used by the viewer to only bind on `beforeunload` if forms\n // are actually edited to prevent doing so unconditionally since that\n // can have undesirable effects.\n this.onSetModified = null;\n this.onResetModified = null;\n this.onAnnotationEditor = null;\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // For testing purposes.\n Object.defineProperty(this, \"_setValues\", {\n value: obj => {\n for (const [key, val] of Object.entries(obj)) {\n this.setValue(key, val);\n }\n },\n });\n }\n }\n\n /**\n * Get the value for a given key if it exists, or return the default value.\n * @param {string} key\n * @param {Object} defaultValue\n * @returns {Object}\n */\n getValue(key, defaultValue) {\n const value = this.#storage.get(key);\n if (value === undefined) {\n return defaultValue;\n }\n\n return Object.assign(defaultValue, value);\n }\n\n /**\n * Get the value for a given key.\n * @param {string} key\n * @returns {Object}\n */\n getRawValue(key) {\n return this.#storage.get(key);\n }\n\n /**\n * Remove a value from the storage.\n * @param {string} key\n */\n remove(key) {\n this.#storage.delete(key);\n\n if (this.#storage.size === 0) {\n this.resetModified();\n }\n\n if (typeof this.onAnnotationEditor === \"function\") {\n for (const value of this.#storage.values()) {\n if (value instanceof AnnotationEditor) {\n return;\n }\n }\n this.onAnnotationEditor(null);\n }\n }\n\n /**\n * Set the value for a given key\n * @param {string} key\n * @param {Object} value\n */\n setValue(key, value) {\n const obj = this.#storage.get(key);\n let modified = false;\n if (obj !== undefined) {\n for (const [entry, val] of Object.entries(value)) {\n if (obj[entry] !== val) {\n modified = true;\n obj[entry] = val;\n }\n }\n } else {\n modified = true;\n this.#storage.set(key, value);\n }\n if (modified) {\n this.#setModified();\n }\n\n if (\n value instanceof AnnotationEditor &&\n typeof this.onAnnotationEditor === \"function\"\n ) {\n this.onAnnotationEditor(value.constructor._type);\n }\n }\n\n /**\n * Check if the storage contains the given key.\n * @param {string} key\n * @returns {boolean}\n */\n has(key) {\n return this.#storage.has(key);\n }\n\n get size() {\n return this.#storage.size;\n }\n\n #setModified() {\n if (!this.#modified) {\n this.#modified = true;\n if (typeof this.onSetModified === \"function\") {\n this.onSetModified();\n }\n }\n }\n\n resetModified() {\n if (this.#modified) {\n this.#modified = false;\n if (typeof this.onResetModified === \"function\") {\n this.onResetModified();\n }\n }\n }\n\n /**\n * @returns {PrintAnnotationStorage}\n */\n get print() {\n return new PrintAnnotationStorage(this);\n }\n\n /**\n * PLEASE NOTE: Only intended for usage within the API itself.\n * @ignore\n */\n get serializable() {\n if (this.#storage.size === 0) {\n return SerializableEmpty;\n }\n const map = new Map(),\n hash = new MurmurHash3_64(),\n transfer = [];\n const context = Object.create(null);\n let hasBitmap = false;\n\n for (const [key, val] of this.#storage) {\n const serialized =\n val instanceof AnnotationEditor\n ? val.serialize(/* isForCopying = */ false, context)\n : val;\n if (serialized) {\n map.set(key, serialized);\n\n hash.update(`${key}:${JSON.stringify(serialized)}`);\n hasBitmap ||= !!serialized.bitmap;\n }\n }\n\n if (hasBitmap) {\n // We must transfer the bitmap data separately, since it can be changed\n // during serialization with SVG images.\n for (const value of map.values()) {\n if (value.bitmap) {\n transfer.push(value.bitmap);\n }\n }\n }\n\n return map.size > 0\n ? { map, hash: hash.hexdigest(), transfer }\n : SerializableEmpty;\n }\n\n get editorStats() {\n let stats = null;\n const typeToEditor = new Map();\n for (const value of this.#storage.values()) {\n if (!(value instanceof AnnotationEditor)) {\n continue;\n }\n const editorStats = value.telemetryFinalData;\n if (!editorStats) {\n continue;\n }\n const { type } = editorStats;\n if (!typeToEditor.has(type)) {\n typeToEditor.set(type, Object.getPrototypeOf(value).constructor);\n }\n stats ||= Object.create(null);\n const map = (stats[type] ||= new Map());\n for (const [key, val] of Object.entries(editorStats)) {\n if (key === \"type\") {\n continue;\n }\n let counters = map.get(key);\n if (!counters) {\n counters = new Map();\n map.set(key, counters);\n }\n const count = counters.get(val) ?? 0;\n counters.set(val, count + 1);\n }\n }\n for (const [type, editor] of typeToEditor) {\n stats[type] = editor.computeTelemetryFinalData(stats[type]);\n }\n return stats;\n }\n\n resetModifiedIds() {\n this.#modifiedIds = null;\n }\n\n /**\n * @returns {{ids: Set, hash: string}}\n */\n get modifiedIds() {\n if (this.#modifiedIds) {\n return this.#modifiedIds;\n }\n const ids = [];\n for (const value of this.#storage.values()) {\n if (\n !(value instanceof AnnotationEditor) ||\n !value.annotationElementId ||\n !value.serialize()\n ) {\n continue;\n }\n ids.push(value.annotationElementId);\n }\n return (this.#modifiedIds = {\n ids: new Set(ids),\n hash: ids.join(\",\"),\n });\n }\n\n [Symbol.iterator]() {\n return this.#storage.entries();\n }\n}\n\n/**\n * A special `AnnotationStorage` for use during printing, where the serializable\n * data is *frozen* upon initialization, to prevent scripting from modifying its\n * contents. (Necessary since printing is triggered synchronously in browsers.)\n */\nclass PrintAnnotationStorage extends AnnotationStorage {\n #serializable;\n\n constructor(parent) {\n super();\n const { map, hash, transfer } = parent.serializable;\n // Create a *copy* of the data, since Objects are passed by reference in JS.\n const clone = structuredClone(map, transfer ? { transfer } : null);\n\n this.#serializable = { map: clone, hash, transfer };\n }\n\n /**\n * @returns {PrintAnnotationStorage}\n */\n // eslint-disable-next-line getter-return\n get print() {\n unreachable(\"Should not call PrintAnnotationStorage.print\");\n }\n\n /**\n * PLEASE NOTE: Only intended for usage within the API itself.\n * @ignore\n */\n get serializable() {\n return this.#serializable;\n }\n\n get modifiedIds() {\n return shadow(this, \"modifiedIds\", {\n ids: new Set(),\n hash: \"\",\n });\n }\n}\n\nexport { AnnotationStorage, PrintAnnotationStorage, SerializableEmpty };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n assert,\n FeatureTest,\n isNodeJS,\n shadow,\n string32,\n toBase64Util,\n unreachable,\n warn,\n} from \"../shared/util.js\";\n\nclass FontLoader {\n #systemFonts = new Set();\n\n constructor({\n ownerDocument = globalThis.document,\n styleElement = null, // For testing only.\n }) {\n this._document = ownerDocument;\n\n this.nativeFontFaces = new Set();\n this.styleElement =\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n ? styleElement\n : null;\n\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n this.loadingRequests = [];\n this.loadTestFontId = 0;\n }\n }\n\n addNativeFontFace(nativeFontFace) {\n this.nativeFontFaces.add(nativeFontFace);\n this._document.fonts.add(nativeFontFace);\n }\n\n removeNativeFontFace(nativeFontFace) {\n this.nativeFontFaces.delete(nativeFontFace);\n this._document.fonts.delete(nativeFontFace);\n }\n\n insertRule(rule) {\n if (!this.styleElement) {\n this.styleElement = this._document.createElement(\"style\");\n this._document.documentElement\n .getElementsByTagName(\"head\")[0]\n .append(this.styleElement);\n }\n const styleSheet = this.styleElement.sheet;\n styleSheet.insertRule(rule, styleSheet.cssRules.length);\n }\n\n clear() {\n for (const nativeFontFace of this.nativeFontFaces) {\n this._document.fonts.delete(nativeFontFace);\n }\n this.nativeFontFaces.clear();\n this.#systemFonts.clear();\n\n if (this.styleElement) {\n // Note: ChildNode.remove doesn't throw if the parentNode is undefined.\n this.styleElement.remove();\n this.styleElement = null;\n }\n }\n\n async loadSystemFont({\n systemFontInfo: info,\n disableFontFace,\n _inspectFont,\n }) {\n if (!info || this.#systemFonts.has(info.loadedName)) {\n return;\n }\n assert(\n !disableFontFace,\n \"loadSystemFont shouldn't be called when `disableFontFace` is set.\"\n );\n\n if (this.isFontLoadingAPISupported) {\n const { loadedName, src, style } = info;\n const fontFace = new FontFace(loadedName, src, style);\n this.addNativeFontFace(fontFace);\n try {\n await fontFace.load();\n this.#systemFonts.add(loadedName);\n _inspectFont?.(info);\n } catch {\n warn(\n `Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`\n );\n\n this.removeNativeFontFace(fontFace);\n }\n return;\n }\n\n unreachable(\n \"Not implemented: loadSystemFont without the Font Loading API.\"\n );\n }\n\n async bind(font) {\n // Add the font to the DOM only once; skip if the font is already loaded.\n if (font.attached || (font.missingFile && !font.systemFontInfo)) {\n return;\n }\n font.attached = true;\n\n if (font.systemFontInfo) {\n await this.loadSystemFont(font);\n return;\n }\n\n if (this.isFontLoadingAPISupported) {\n const nativeFontFace = font.createNativeFontFace();\n if (nativeFontFace) {\n this.addNativeFontFace(nativeFontFace);\n try {\n await nativeFontFace.loaded;\n } catch (ex) {\n warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);\n\n // When font loading failed, fall back to the built-in font renderer.\n font.disableFontFace = true;\n throw ex;\n }\n }\n return; // The font was, asynchronously, loaded.\n }\n\n // !this.isFontLoadingAPISupported\n const rule = font.createFontFaceRule();\n if (rule) {\n this.insertRule(rule);\n\n if (this.isSyncFontLoadingSupported) {\n return; // The font was, synchronously, loaded.\n }\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: async font loading\");\n }\n await new Promise(resolve => {\n const request = this._queueLoadingCallback(resolve);\n this._prepareFontLoadEvent(font, request);\n });\n // The font was, asynchronously, loaded.\n }\n }\n\n get isFontLoadingAPISupported() {\n const hasFonts = !!this._document?.fonts;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n return shadow(\n this,\n \"isFontLoadingAPISupported\",\n hasFonts && !this.styleElement\n );\n }\n return shadow(this, \"isFontLoadingAPISupported\", hasFonts);\n }\n\n get isSyncFontLoadingSupported() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return shadow(this, \"isSyncFontLoadingSupported\", true);\n }\n\n // Node.js - we can pretend that sync font loading is supported.\n // Firefox, from version 14, supports synchronous font loading.\n return shadow(\n this,\n \"isSyncFontLoadingSupported\",\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\")) &&\n (isNodeJS || FeatureTest.platform.isFirefox)\n );\n }\n\n _queueLoadingCallback(callback) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _queueLoadingCallback\");\n }\n\n function completeRequest() {\n assert(!request.done, \"completeRequest() cannot be called twice.\");\n request.done = true;\n\n // Sending all completed requests in order of how they were queued.\n while (loadingRequests.length > 0 && loadingRequests[0].done) {\n const otherRequest = loadingRequests.shift();\n setTimeout(otherRequest.callback, 0);\n }\n }\n\n const { loadingRequests } = this;\n const request = {\n done: false,\n complete: completeRequest,\n callback,\n };\n loadingRequests.push(request);\n return request;\n }\n\n get _loadTestFont() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _loadTestFont\");\n }\n\n // This is a CFF font with 1 glyph for '.' that fills its entire width\n // and height.\n const testFont = atob(\n \"T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA\" +\n \"FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA\" +\n \"ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA\" +\n \"AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1\" +\n \"AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD\" +\n \"6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM\" +\n \"AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D\" +\n \"IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA\" +\n \"AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA\" +\n \"AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB\" +\n \"AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY\" +\n \"AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA\" +\n \"AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA\" +\n \"AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC\" +\n \"AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3\" +\n \"Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj\" +\n \"FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==\"\n );\n return shadow(this, \"_loadTestFont\", testFont);\n }\n\n _prepareFontLoadEvent(font, request) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _prepareFontLoadEvent\");\n }\n\n /** Hack begin */\n // There's currently no event when a font has finished downloading so the\n // following code is a dirty hack to 'guess' when a font is ready.\n // It's assumed fonts are loaded in order, so add a known test font after\n // the desired fonts and then test for the loading of that test font.\n\n function int32(data, offset) {\n return (\n (data.charCodeAt(offset) << 24) |\n (data.charCodeAt(offset + 1) << 16) |\n (data.charCodeAt(offset + 2) << 8) |\n (data.charCodeAt(offset + 3) & 0xff)\n );\n }\n function spliceString(s, offset, remove, insert) {\n const chunk1 = s.substring(0, offset);\n const chunk2 = s.substring(offset + remove);\n return chunk1 + insert + chunk2;\n }\n let i, ii;\n\n // The temporary canvas is used to determine if fonts are loaded.\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n\n let called = 0;\n function isFontReady(name, callback) {\n // With setTimeout clamping this gives the font ~100ms to load.\n if (++called > 30) {\n warn(\"Load test font never loaded.\");\n callback();\n return;\n }\n ctx.font = \"30px \" + name;\n ctx.fillText(\".\", 0, 20);\n const imageData = ctx.getImageData(0, 0, 1, 1);\n if (imageData.data[3] > 0) {\n callback();\n return;\n }\n setTimeout(isFontReady.bind(null, name, callback));\n }\n\n const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;\n // Chromium seems to cache fonts based on a hash of the actual font data,\n // so the font must be modified for each load test else it will appear to\n // be loaded already.\n // TODO: This could maybe be made faster by avoiding the btoa of the full\n // font by splitting it in chunks before hand and padding the font id.\n let data = this._loadTestFont;\n const COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)\n data = spliceString(\n data,\n COMMENT_OFFSET,\n loadTestFontId.length,\n loadTestFontId\n );\n // CFF checksum is important for IE, adjusting it\n const CFF_CHECKSUM_OFFSET = 16;\n const XXXX_VALUE = 0x58585858; // the \"comment\" filled with 'X'\n let checksum = int32(data, CFF_CHECKSUM_OFFSET);\n for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;\n }\n if (i < loadTestFontId.length) {\n // align to 4 bytes boundary\n checksum = (checksum - XXXX_VALUE + int32(loadTestFontId + \"XXX\", i)) | 0;\n }\n data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));\n\n const url = `url(data:font/opentype;base64,${btoa(data)});`;\n const rule = `@font-face {font-family:\"${loadTestFontId}\";src:${url}}`;\n this.insertRule(rule);\n\n const div = this._document.createElement(\"div\");\n div.style.visibility = \"hidden\";\n div.style.width = div.style.height = \"10px\";\n div.style.position = \"absolute\";\n div.style.top = div.style.left = \"0px\";\n\n for (const name of [font.loadedName, loadTestFontId]) {\n const span = this._document.createElement(\"span\");\n span.textContent = \"Hi\";\n span.style.fontFamily = name;\n div.append(span);\n }\n this._document.body.append(div);\n\n isFontReady(loadTestFontId, () => {\n div.remove();\n request.complete();\n });\n /** Hack end */\n }\n}\n\nclass FontFaceObject {\n constructor(translatedData, inspectFont = null) {\n this.compiledGlyphs = Object.create(null);\n // importing translated data\n for (const i in translatedData) {\n this[i] = translatedData[i];\n }\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n if (typeof this.disableFontFace !== \"boolean\") {\n unreachable(\"disableFontFace must be available.\");\n }\n if (typeof this.fontExtraProperties !== \"boolean\") {\n unreachable(\"fontExtraProperties must be available.\");\n }\n }\n this._inspectFont = inspectFont;\n }\n\n createNativeFontFace() {\n if (!this.data || this.disableFontFace) {\n return null;\n }\n let nativeFontFace;\n if (!this.cssFontInfo) {\n nativeFontFace = new FontFace(this.loadedName, this.data, {});\n } else {\n const css = {\n weight: this.cssFontInfo.fontWeight,\n };\n if (this.cssFontInfo.italicAngle) {\n css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;\n }\n nativeFontFace = new FontFace(\n this.cssFontInfo.fontFamily,\n this.data,\n css\n );\n }\n\n this._inspectFont?.(this);\n return nativeFontFace;\n }\n\n createFontFaceRule() {\n if (!this.data || this.disableFontFace) {\n return null;\n }\n // Add the @font-face rule to the document.\n const url = `url(data:${this.mimetype};base64,${toBase64Util(this.data)});`;\n let rule;\n if (!this.cssFontInfo) {\n rule = `@font-face {font-family:\"${this.loadedName}\";src:${url}}`;\n } else {\n let css = `font-weight: ${this.cssFontInfo.fontWeight};`;\n if (this.cssFontInfo.italicAngle) {\n css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;\n }\n rule = `@font-face {font-family:\"${this.cssFontInfo.fontFamily}\";${css}src:${url}}`;\n }\n\n this._inspectFont?.(this, url);\n return rule;\n }\n\n getPathGenerator(objs, character) {\n if (this.compiledGlyphs[character] !== undefined) {\n return this.compiledGlyphs[character];\n }\n\n const objId = this.loadedName + \"_path_\" + character;\n let cmds;\n try {\n cmds = objs.get(objId);\n } catch (ex) {\n warn(`getPathGenerator - ignoring character: \"${ex}\".`);\n }\n const path = new Path2D(cmds || \"\");\n\n if (!this.fontExtraProperties) {\n // Remove the raw path-string, since we don't need it anymore.\n objs.delete(objId);\n }\n return (this.compiledGlyphs[character] = path);\n }\n}\n\nexport { FontFaceObject, FontLoader };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AbortException,\n assert,\n InvalidPDFException,\n PasswordException,\n ResponseException,\n UnknownErrorException,\n unreachable,\n} from \"./util.js\";\n\nconst CallbackKind = {\n DATA: 1,\n ERROR: 2,\n};\n\nconst StreamKind = {\n CANCEL: 1,\n CANCEL_COMPLETE: 2,\n CLOSE: 3,\n ENQUEUE: 4,\n ERROR: 5,\n PULL: 6,\n PULL_COMPLETE: 7,\n START_COMPLETE: 8,\n};\n\nfunction onFn() {}\n\nfunction wrapReason(ex) {\n if (\n ex instanceof AbortException ||\n ex instanceof InvalidPDFException ||\n ex instanceof PasswordException ||\n ex instanceof ResponseException ||\n ex instanceof UnknownErrorException\n ) {\n // Avoid re-creating the exception when its type is already correct.\n return ex;\n }\n\n if (!(ex instanceof Error || (typeof ex === \"object\" && ex !== null))) {\n unreachable(\n 'wrapReason: Expected \"reason\" to be a (possibly cloned) Error.'\n );\n }\n switch (ex.name) {\n case \"AbortException\":\n return new AbortException(ex.message);\n case \"InvalidPDFException\":\n return new InvalidPDFException(ex.message);\n case \"PasswordException\":\n return new PasswordException(ex.message, ex.code);\n case \"ResponseException\":\n return new ResponseException(ex.message, ex.status, ex.missing);\n case \"UnknownErrorException\":\n return new UnknownErrorException(ex.message, ex.details);\n }\n return new UnknownErrorException(ex.message, ex.toString());\n}\n\nclass MessageHandler {\n #messageAC = new AbortController();\n\n constructor(sourceName, targetName, comObj) {\n this.sourceName = sourceName;\n this.targetName = targetName;\n this.comObj = comObj;\n this.callbackId = 1;\n this.streamId = 1;\n this.streamSinks = Object.create(null);\n this.streamControllers = Object.create(null);\n this.callbackCapabilities = Object.create(null);\n this.actionHandler = Object.create(null);\n\n comObj.addEventListener(\"message\", this.#onMessage.bind(this), {\n signal: this.#messageAC.signal,\n });\n }\n\n #onMessage({ data }) {\n if (data.targetName !== this.sourceName) {\n return;\n }\n if (data.stream) {\n this.#processStreamMessage(data);\n return;\n }\n if (data.callback) {\n const callbackId = data.callbackId;\n const capability = this.callbackCapabilities[callbackId];\n if (!capability) {\n throw new Error(`Cannot resolve callback ${callbackId}`);\n }\n delete this.callbackCapabilities[callbackId];\n\n if (data.callback === CallbackKind.DATA) {\n capability.resolve(data.data);\n } else if (data.callback === CallbackKind.ERROR) {\n capability.reject(wrapReason(data.reason));\n } else {\n throw new Error(\"Unexpected callback case\");\n }\n return;\n }\n const action = this.actionHandler[data.action];\n if (!action) {\n throw new Error(`Unknown action from worker: ${data.action}`);\n }\n if (data.callbackId) {\n const sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n\n Promise.try(action, data.data).then(\n function (result) {\n comObj.postMessage({\n sourceName,\n targetName,\n callback: CallbackKind.DATA,\n callbackId: data.callbackId,\n data: result,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n callback: CallbackKind.ERROR,\n callbackId: data.callbackId,\n reason: wrapReason(reason),\n });\n }\n );\n return;\n }\n if (data.streamId) {\n this.#createStreamSink(data);\n return;\n }\n action(data.data);\n }\n\n on(actionName, handler) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n typeof handler === \"function\",\n 'MessageHandler.on: Expected \"handler\" to be a function.'\n );\n }\n const ah = this.actionHandler;\n if (ah[actionName]) {\n throw new Error(`There is already an actionName called \"${actionName}\"`);\n }\n ah[actionName] = handler;\n }\n\n /**\n * Sends a message to the comObj to invoke the action with the supplied data.\n * @param {string} actionName - Action to call.\n * @param {JSON} data - JSON data to send.\n * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n */\n send(actionName, data, transfers) {\n this.comObj.postMessage(\n {\n sourceName: this.sourceName,\n targetName: this.targetName,\n action: actionName,\n data,\n },\n transfers\n );\n }\n\n /**\n * Sends a message to the comObj to invoke the action with the supplied data.\n * Expects that the other side will callback with the response.\n * @param {string} actionName - Action to call.\n * @param {JSON} data - JSON data to send.\n * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n * @returns {Promise} Promise to be resolved with response data.\n */\n sendWithPromise(actionName, data, transfers) {\n const callbackId = this.callbackId++;\n const capability = Promise.withResolvers();\n this.callbackCapabilities[callbackId] = capability;\n try {\n this.comObj.postMessage(\n {\n sourceName: this.sourceName,\n targetName: this.targetName,\n action: actionName,\n callbackId,\n data,\n },\n transfers\n );\n } catch (ex) {\n capability.reject(ex);\n }\n return capability.promise;\n }\n\n /**\n * Sends a message to the comObj to invoke the action with the supplied data.\n * Expect that the other side will callback to signal 'start_complete'.\n * @param {string} actionName - Action to call.\n * @param {JSON} data - JSON data to send.\n * @param {Object} queueingStrategy - Strategy to signal backpressure based on\n * internal queue.\n * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n * @returns {ReadableStream} ReadableStream to read data in chunks.\n */\n sendWithStream(actionName, data, queueingStrategy, transfers) {\n const streamId = this.streamId++,\n sourceName = this.sourceName,\n targetName = this.targetName,\n comObj = this.comObj;\n\n return new ReadableStream(\n {\n start: controller => {\n const startCapability = Promise.withResolvers();\n this.streamControllers[streamId] = {\n controller,\n startCall: startCapability,\n pullCall: null,\n cancelCall: null,\n isClosed: false,\n };\n comObj.postMessage(\n {\n sourceName,\n targetName,\n action: actionName,\n streamId,\n data,\n desiredSize: controller.desiredSize,\n },\n transfers\n );\n // Return Promise for Async process, to signal success/failure.\n return startCapability.promise;\n },\n\n pull: controller => {\n const pullCapability = Promise.withResolvers();\n this.streamControllers[streamId].pullCall = pullCapability;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL,\n streamId,\n desiredSize: controller.desiredSize,\n });\n // Returning Promise will not call \"pull\"\n // again until current pull is resolved.\n return pullCapability.promise;\n },\n\n cancel: reason => {\n assert(reason instanceof Error, \"cancel must have a valid reason\");\n const cancelCapability = Promise.withResolvers();\n this.streamControllers[streamId].cancelCall = cancelCapability;\n this.streamControllers[streamId].isClosed = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL,\n streamId,\n reason: wrapReason(reason),\n });\n // Return Promise to signal success or failure.\n return cancelCapability.promise;\n },\n },\n queueingStrategy\n );\n }\n\n #createStreamSink(data) {\n const streamId = data.streamId,\n sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n const self = this,\n action = this.actionHandler[data.action];\n\n const streamSink = {\n enqueue(chunk, size = 1, transfers) {\n if (this.isCancelled) {\n return;\n }\n const lastDesiredSize = this.desiredSize;\n this.desiredSize -= size;\n // Enqueue decreases the desiredSize property of sink,\n // so when it changes from positive to negative,\n // set ready as unresolved promise.\n if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n this.sinkCapability = Promise.withResolvers();\n this.ready = this.sinkCapability.promise;\n }\n comObj.postMessage(\n {\n sourceName,\n targetName,\n stream: StreamKind.ENQUEUE,\n streamId,\n chunk,\n },\n transfers\n );\n },\n\n close() {\n if (this.isCancelled) {\n return;\n }\n this.isCancelled = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CLOSE,\n streamId,\n });\n delete self.streamSinks[streamId];\n },\n\n error(reason) {\n assert(reason instanceof Error, \"error must have a valid reason\");\n if (this.isCancelled) {\n return;\n }\n this.isCancelled = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.ERROR,\n streamId,\n reason: wrapReason(reason),\n });\n },\n\n sinkCapability: Promise.withResolvers(),\n onPull: null,\n onCancel: null,\n isCancelled: false,\n desiredSize: data.desiredSize,\n ready: null,\n };\n\n streamSink.sinkCapability.resolve();\n streamSink.ready = streamSink.sinkCapability.promise;\n this.streamSinks[streamId] = streamSink;\n\n Promise.try(action, data.data, streamSink).then(\n function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.START_COMPLETE,\n streamId,\n success: true,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.START_COMPLETE,\n streamId,\n reason: wrapReason(reason),\n });\n }\n );\n }\n\n #processStreamMessage(data) {\n const streamId = data.streamId,\n sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n const streamController = this.streamControllers[streamId],\n streamSink = this.streamSinks[streamId];\n\n switch (data.stream) {\n case StreamKind.START_COMPLETE:\n if (data.success) {\n streamController.startCall.resolve();\n } else {\n streamController.startCall.reject(wrapReason(data.reason));\n }\n break;\n case StreamKind.PULL_COMPLETE:\n if (data.success) {\n streamController.pullCall.resolve();\n } else {\n streamController.pullCall.reject(wrapReason(data.reason));\n }\n break;\n case StreamKind.PULL:\n // Ignore any pull after close is called.\n if (!streamSink) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n success: true,\n });\n break;\n }\n // Pull increases the desiredSize property of sink, so when it changes\n // from negative to positive, set ready property as resolved promise.\n if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {\n streamSink.sinkCapability.resolve();\n }\n // Reset desiredSize property of sink on every pull.\n streamSink.desiredSize = data.desiredSize;\n\n Promise.try(streamSink.onPull || onFn).then(\n function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n success: true,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n reason: wrapReason(reason),\n });\n }\n );\n break;\n case StreamKind.ENQUEUE:\n assert(streamController, \"enqueue should have stream controller\");\n if (streamController.isClosed) {\n break;\n }\n streamController.controller.enqueue(data.chunk);\n break;\n case StreamKind.CLOSE:\n assert(streamController, \"close should have stream controller\");\n if (streamController.isClosed) {\n break;\n }\n streamController.isClosed = true;\n streamController.controller.close();\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.ERROR:\n assert(streamController, \"error should have stream controller\");\n streamController.controller.error(wrapReason(data.reason));\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.CANCEL_COMPLETE:\n if (data.success) {\n streamController.cancelCall.resolve();\n } else {\n streamController.cancelCall.reject(wrapReason(data.reason));\n }\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.CANCEL:\n if (!streamSink) {\n break;\n }\n const dataReason = wrapReason(data.reason);\n\n Promise.try(streamSink.onCancel || onFn, dataReason).then(\n function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL_COMPLETE,\n streamId,\n success: true,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL_COMPLETE,\n streamId,\n reason: wrapReason(reason),\n });\n }\n );\n streamSink.sinkCapability.reject(dataReason);\n streamSink.isCancelled = true;\n delete this.streamSinks[streamId];\n break;\n default:\n throw new Error(\"Unexpected stream case\");\n }\n }\n\n async #deleteStreamController(streamController, streamId) {\n // Delete the `streamController` only when the start, pull, and cancel\n // capabilities have settled, to prevent `TypeError`s.\n await Promise.allSettled([\n streamController.startCall?.promise,\n streamController.pullCall?.promise,\n streamController.cancelCall?.promise,\n ]);\n delete this.streamControllers[streamId];\n }\n\n destroy() {\n this.#messageAC?.abort();\n this.#messageAC = null;\n }\n}\n\nexport { MessageHandler, wrapReason };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseCanvasFactory {\n #enableHWA = false;\n\n constructor({ enableHWA = false }) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseCanvasFactory\n ) {\n unreachable(\"Cannot initialize BaseCanvasFactory.\");\n }\n this.#enableHWA = enableHWA;\n }\n\n create(width, height) {\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid canvas size\");\n }\n const canvas = this._createCanvas(width, height);\n return {\n canvas,\n context: canvas.getContext(\"2d\", {\n willReadFrequently: !this.#enableHWA,\n }),\n };\n }\n\n reset(canvasAndContext, width, height) {\n if (!canvasAndContext.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid canvas size\");\n }\n canvasAndContext.canvas.width = width;\n canvasAndContext.canvas.height = height;\n }\n\n destroy(canvasAndContext) {\n if (!canvasAndContext.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n // Zeroing the width and height cause Firefox to release graphics\n // resources immediately, which can greatly reduce memory consumption.\n canvasAndContext.canvas.width = 0;\n canvasAndContext.canvas.height = 0;\n canvasAndContext.canvas = null;\n canvasAndContext.context = null;\n }\n\n /**\n * @ignore\n */\n _createCanvas(width, height) {\n unreachable(\"Abstract method `_createCanvas` called.\");\n }\n}\n\nclass DOMCanvasFactory extends BaseCanvasFactory {\n constructor({ ownerDocument = globalThis.document, enableHWA = false }) {\n super({ enableHWA });\n this._document = ownerDocument;\n }\n\n /**\n * @ignore\n */\n _createCanvas(width, height) {\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n}\n\nexport { BaseCanvasFactory, DOMCanvasFactory };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToBytes, unreachable } from \"../shared/util.js\";\nimport { fetchData } from \"./display_utils.js\";\n\nclass BaseCMapReaderFactory {\n constructor({ baseUrl = null, isCompressed = true }) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseCMapReaderFactory\n ) {\n unreachable(\"Cannot initialize BaseCMapReaderFactory.\");\n }\n this.baseUrl = baseUrl;\n this.isCompressed = isCompressed;\n }\n\n async fetch({ name }) {\n if (!this.baseUrl) {\n throw new Error(\n \"Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided.\"\n );\n }\n if (!name) {\n throw new Error(\"CMap name must be specified.\");\n }\n const url = this.baseUrl + name + (this.isCompressed ? \".bcmap\" : \"\");\n\n return this._fetch(url)\n .then(cMapData => ({ cMapData, isCompressed: this.isCompressed }))\n .catch(reason => {\n throw new Error(\n `Unable to load ${this.isCompressed ? \"binary \" : \"\"}CMap at: ${url}`\n );\n });\n }\n\n /**\n * @ignore\n * @returns {Promise}\n */\n async _fetch(url) {\n unreachable(\"Abstract method `_fetch` called.\");\n }\n}\n\nclass DOMCMapReaderFactory extends BaseCMapReaderFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n const data = await fetchData(\n url,\n /* type = */ this.isCompressed ? \"arraybuffer\" : \"text\"\n );\n return data instanceof ArrayBuffer\n ? new Uint8Array(data)\n : stringToBytes(data);\n }\n}\n\nexport { BaseCMapReaderFactory, DOMCMapReaderFactory };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getRGB, isDataScheme, SVG_NS } from \"./display_utils.js\";\nimport { unreachable, updateUrlHash, Util, warn } from \"../shared/util.js\";\n\nclass BaseFilterFactory {\n constructor() {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseFilterFactory\n ) {\n unreachable(\"Cannot initialize BaseFilterFactory.\");\n }\n }\n\n addFilter(maps) {\n return \"none\";\n }\n\n addHCMFilter(fgColor, bgColor) {\n return \"none\";\n }\n\n addAlphaFilter(map) {\n return \"none\";\n }\n\n addLuminosityFilter(map) {\n return \"none\";\n }\n\n addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n return \"none\";\n }\n\n destroy(keepHCM = false) {}\n}\n\n/**\n * FilterFactory aims to create some SVG filters we can use when drawing an\n * image (or whatever) on a canvas.\n * Filters aren't applied with ctx.putImageData because it just overwrites the\n * underlying pixels.\n * With these filters, it's possible for example to apply some transfer maps on\n * an image without the need to apply them on the pixel arrays: the renderer\n * does the magic for us.\n */\nclass DOMFilterFactory extends BaseFilterFactory {\n #baseUrl;\n\n #_cache;\n\n #_defs;\n\n #docId;\n\n #document;\n\n #_hcmCache;\n\n #id = 0;\n\n constructor({ docId, ownerDocument = globalThis.document }) {\n super();\n this.#docId = docId;\n this.#document = ownerDocument;\n }\n\n get #cache() {\n return (this.#_cache ||= new Map());\n }\n\n get #hcmCache() {\n return (this.#_hcmCache ||= new Map());\n }\n\n get #defs() {\n if (!this.#_defs) {\n const div = this.#document.createElement(\"div\");\n const { style } = div;\n style.visibility = \"hidden\";\n style.contain = \"strict\";\n style.width = style.height = 0;\n style.position = \"absolute\";\n style.top = style.left = 0;\n style.zIndex = -1;\n\n const svg = this.#document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"width\", 0);\n svg.setAttribute(\"height\", 0);\n this.#_defs = this.#document.createElementNS(SVG_NS, \"defs\");\n div.append(svg);\n svg.append(this.#_defs);\n this.#document.body.append(div);\n }\n return this.#_defs;\n }\n\n #createTables(maps) {\n if (maps.length === 1) {\n const mapR = maps[0];\n const buffer = new Array(256);\n for (let i = 0; i < 256; i++) {\n buffer[i] = mapR[i] / 255;\n }\n\n const table = buffer.join(\",\");\n return [table, table, table];\n }\n\n const [mapR, mapG, mapB] = maps;\n const bufferR = new Array(256);\n const bufferG = new Array(256);\n const bufferB = new Array(256);\n for (let i = 0; i < 256; i++) {\n bufferR[i] = mapR[i] / 255;\n bufferG[i] = mapG[i] / 255;\n bufferB[i] = mapB[i] / 255;\n }\n return [bufferR.join(\",\"), bufferG.join(\",\"), bufferB.join(\",\")];\n }\n\n #createUrl(id) {\n if (this.#baseUrl === undefined) {\n // Unless a ``-element is present a relative URL should work.\n this.#baseUrl = \"\";\n\n const url = this.#document.URL;\n if (url !== this.#document.baseURI) {\n if (isDataScheme(url)) {\n warn('#createUrl: ignore \"data:\"-URL for performance reasons.');\n } else {\n this.#baseUrl = updateUrlHash(url, \"\");\n }\n }\n }\n return `url(${this.#baseUrl}#${id})`;\n }\n\n addFilter(maps) {\n if (!maps) {\n return \"none\";\n }\n\n // When a page is zoomed the page is re-drawn but the maps are likely\n // the same.\n let value = this.#cache.get(maps);\n if (value) {\n return value;\n }\n\n const [tableR, tableG, tableB] = this.#createTables(maps);\n const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`;\n\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(maps, value);\n return value;\n }\n\n // We create a SVG filter: feComponentTransferElement\n // https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement\n\n const id = `g_${this.#docId}_transfer_map_${this.#id++}`;\n const url = this.#createUrl(id);\n this.#cache.set(maps, url);\n this.#cache.set(key, url);\n\n const filter = this.#createFilter(id);\n this.#addTransferMapConversion(tableR, tableG, tableB, filter);\n\n return url;\n }\n\n addHCMFilter(fgColor, bgColor) {\n const key = `${fgColor}-${bgColor}`;\n const filterName = \"base\";\n let info = this.#hcmCache.get(filterName);\n if (info?.key === key) {\n return info.url;\n }\n\n if (info) {\n info.filter?.remove();\n info.key = key;\n info.url = \"none\";\n info.filter = null;\n } else {\n info = {\n key,\n url: \"none\",\n filter: null,\n };\n this.#hcmCache.set(filterName, info);\n }\n\n if (!fgColor || !bgColor) {\n return info.url;\n }\n\n const fgRGB = this.#getRGB(fgColor);\n fgColor = Util.makeHexColor(...fgRGB);\n const bgRGB = this.#getRGB(bgColor);\n bgColor = Util.makeHexColor(...bgRGB);\n this.#defs.style.color = \"\";\n\n if (\n (fgColor === \"#000000\" && bgColor === \"#ffffff\") ||\n fgColor === bgColor\n ) {\n return info.url;\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_Colors_and_Luminance\n //\n // Relative luminance:\n // https://www.w3.org/TR/WCAG20/#relativeluminancedef\n //\n // We compute the rounded luminance of the default background color.\n // Then for every color in the pdf, if its rounded luminance is the\n // same as the background one then it's replaced by the new\n // background color else by the foreground one.\n const map = new Array(256);\n for (let i = 0; i <= 255; i++) {\n const x = i / 255;\n map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n }\n const table = map.join(\",\");\n\n const id = `g_${this.#docId}_hcm_filter`;\n const filter = (info.filter = this.#createFilter(id));\n this.#addTransferMapConversion(table, table, table, filter);\n this.#addGrayConversion(filter);\n\n const getSteps = (c, n) => {\n const start = fgRGB[c] / 255;\n const end = bgRGB[c] / 255;\n const arr = new Array(n + 1);\n for (let i = 0; i <= n; i++) {\n arr[i] = start + (i / n) * (end - start);\n }\n return arr.join(\",\");\n };\n this.#addTransferMapConversion(\n getSteps(0, 5),\n getSteps(1, 5),\n getSteps(2, 5),\n filter\n );\n\n info.url = this.#createUrl(id);\n return info.url;\n }\n\n addAlphaFilter(map) {\n // When a page is zoomed the page is re-drawn but the maps are likely\n // the same.\n let value = this.#cache.get(map);\n if (value) {\n return value;\n }\n\n const [tableA] = this.#createTables([map]);\n const key = `alpha_${tableA}`;\n\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(map, value);\n return value;\n }\n\n const id = `g_${this.#docId}_alpha_map_${this.#id++}`;\n const url = this.#createUrl(id);\n this.#cache.set(map, url);\n this.#cache.set(key, url);\n\n const filter = this.#createFilter(id);\n this.#addTransferMapAlphaConversion(tableA, filter);\n\n return url;\n }\n\n addLuminosityFilter(map) {\n // When a page is zoomed the page is re-drawn but the maps are likely\n // the same.\n let value = this.#cache.get(map || \"luminosity\");\n if (value) {\n return value;\n }\n\n let tableA, key;\n if (map) {\n [tableA] = this.#createTables([map]);\n key = `luminosity_${tableA}`;\n } else {\n key = \"luminosity\";\n }\n\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(map, value);\n return value;\n }\n\n const id = `g_${this.#docId}_luminosity_map_${this.#id++}`;\n const url = this.#createUrl(id);\n this.#cache.set(map, url);\n this.#cache.set(key, url);\n\n const filter = this.#createFilter(id);\n this.#addLuminosityConversion(filter);\n if (map) {\n this.#addTransferMapAlphaConversion(tableA, filter);\n }\n\n return url;\n }\n\n addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;\n let info = this.#hcmCache.get(filterName);\n if (info?.key === key) {\n return info.url;\n }\n\n if (info) {\n info.filter?.remove();\n info.key = key;\n info.url = \"none\";\n info.filter = null;\n } else {\n info = {\n key,\n url: \"none\",\n filter: null,\n };\n this.#hcmCache.set(filterName, info);\n }\n\n if (!fgColor || !bgColor) {\n return info.url;\n }\n\n const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this));\n let fgGray = Math.round(\n 0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]\n );\n let bgGray = Math.round(\n 0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]\n );\n let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(\n this.#getRGB.bind(this)\n );\n if (bgGray < fgGray) {\n [fgGray, bgGray, newFgRGB, newBgRGB] = [\n bgGray,\n fgGray,\n newBgRGB,\n newFgRGB,\n ];\n }\n this.#defs.style.color = \"\";\n\n // Now we can create the filters to highlight some canvas parts.\n // The colors in the pdf will almost be Canvas and CanvasText, hence we\n // want to filter them to finally get Highlight and HighlightText.\n // Since we're in HCM the background color and the foreground color should\n // be really different when converted to grayscale (if they're not then it\n // means that we've a poor contrast). Once the canvas colors are converted\n // to grayscale we can easily map them on their new colors.\n // The grayscale step is important because if we've something like:\n // fgColor = #FF....\n // bgColor = #FF....\n // then we are enable to map the red component on the new red components\n // which can be different.\n\n const getSteps = (fg, bg, n) => {\n const arr = new Array(256);\n const step = (bgGray - fgGray) / n;\n const newStart = fg / 255;\n const newStep = (bg - fg) / (255 * n);\n let prev = 0;\n for (let i = 0; i <= n; i++) {\n const k = Math.round(fgGray + i * step);\n const value = newStart + i * newStep;\n for (let j = prev; j <= k; j++) {\n arr[j] = value;\n }\n prev = k + 1;\n }\n for (let i = prev; i < 256; i++) {\n arr[i] = arr[prev - 1];\n }\n return arr.join(\",\");\n };\n\n const id = `g_${this.#docId}_hcm_${filterName}_filter`;\n const filter = (info.filter = this.#createFilter(id));\n\n this.#addGrayConversion(filter);\n this.#addTransferMapConversion(\n getSteps(newFgRGB[0], newBgRGB[0], 5),\n getSteps(newFgRGB[1], newBgRGB[1], 5),\n getSteps(newFgRGB[2], newBgRGB[2], 5),\n filter\n );\n\n info.url = this.#createUrl(id);\n return info.url;\n }\n\n destroy(keepHCM = false) {\n if (keepHCM && this.#_hcmCache?.size) {\n return;\n }\n this.#_defs?.parentNode.parentNode.remove();\n this.#_defs = null;\n\n this.#_cache?.clear();\n this.#_cache = null;\n\n this.#_hcmCache?.clear();\n this.#_hcmCache = null;\n\n this.#id = 0;\n }\n\n #addLuminosityConversion(filter) {\n const feColorMatrix = this.#document.createElementNS(\n SVG_NS,\n \"feColorMatrix\"\n );\n feColorMatrix.setAttribute(\"type\", \"matrix\");\n feColorMatrix.setAttribute(\n \"values\",\n \"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0\"\n );\n filter.append(feColorMatrix);\n }\n\n #addGrayConversion(filter) {\n const feColorMatrix = this.#document.createElementNS(\n SVG_NS,\n \"feColorMatrix\"\n );\n feColorMatrix.setAttribute(\"type\", \"matrix\");\n feColorMatrix.setAttribute(\n \"values\",\n \"0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0\"\n );\n filter.append(feColorMatrix);\n }\n\n #createFilter(id) {\n const filter = this.#document.createElementNS(SVG_NS, \"filter\");\n filter.setAttribute(\"color-interpolation-filters\", \"sRGB\");\n filter.setAttribute(\"id\", id);\n this.#defs.append(filter);\n\n return filter;\n }\n\n #appendFeFunc(feComponentTransfer, func, table) {\n const feFunc = this.#document.createElementNS(SVG_NS, func);\n feFunc.setAttribute(\"type\", \"discrete\");\n feFunc.setAttribute(\"tableValues\", table);\n feComponentTransfer.append(feFunc);\n }\n\n #addTransferMapConversion(rTable, gTable, bTable, filter) {\n const feComponentTransfer = this.#document.createElementNS(\n SVG_NS,\n \"feComponentTransfer\"\n );\n filter.append(feComponentTransfer);\n this.#appendFeFunc(feComponentTransfer, \"feFuncR\", rTable);\n this.#appendFeFunc(feComponentTransfer, \"feFuncG\", gTable);\n this.#appendFeFunc(feComponentTransfer, \"feFuncB\", bTable);\n }\n\n #addTransferMapAlphaConversion(aTable, filter) {\n const feComponentTransfer = this.#document.createElementNS(\n SVG_NS,\n \"feComponentTransfer\"\n );\n filter.append(feComponentTransfer);\n this.#appendFeFunc(feComponentTransfer, \"feFuncA\", aTable);\n }\n\n #getRGB(color) {\n this.#defs.style.color = color;\n return getRGB(getComputedStyle(this.#defs).getPropertyValue(\"color\"));\n }\n}\n\nexport { BaseFilterFactory, DOMFilterFactory };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { fetchData } from \"./display_utils.js\";\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseStandardFontDataFactory {\n constructor({ baseUrl = null }) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseStandardFontDataFactory\n ) {\n unreachable(\"Cannot initialize BaseStandardFontDataFactory.\");\n }\n this.baseUrl = baseUrl;\n }\n\n async fetch({ filename }) {\n if (!this.baseUrl) {\n throw new Error(\n \"Ensure that the `standardFontDataUrl` API parameter is provided.\"\n );\n }\n if (!filename) {\n throw new Error(\"Font filename must be specified.\");\n }\n const url = `${this.baseUrl}${filename}`;\n\n return this._fetch(url).catch(reason => {\n throw new Error(`Unable to load font data at: ${url}`);\n });\n }\n\n /**\n * @ignore\n * @returns {Promise}\n */\n async _fetch(url) {\n unreachable(\"Abstract method `_fetch` called.\");\n }\n}\n\nclass DOMStandardFontDataFactory extends BaseStandardFontDataFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n const data = await fetchData(url, /* type = */ \"arraybuffer\");\n return new Uint8Array(data);\n }\n}\n\nexport { BaseStandardFontDataFactory, DOMStandardFontDataFactory };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { fetchData } from \"./display_utils.js\";\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseWasmFactory {\n constructor({ baseUrl = null }) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseWasmFactory\n ) {\n unreachable(\"Cannot initialize BaseWasmFactory.\");\n }\n this.baseUrl = baseUrl;\n }\n\n async fetch({ filename }) {\n if (!this.baseUrl) {\n throw new Error(\"Ensure that the `wasmUrl` API parameter is provided.\");\n }\n if (!filename) {\n throw new Error(\"Wasm filename must be specified.\");\n }\n const url = `${this.baseUrl}${filename}`;\n\n return this._fetch(url).catch(reason => {\n throw new Error(`Unable to load wasm data at: ${url}`);\n });\n }\n\n /**\n * @ignore\n * @returns {Promise}\n */\n async _fetch(url) {\n unreachable(\"Abstract method `_fetch` called.\");\n }\n}\n\nclass DOMWasmFactory extends BaseWasmFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n const data = await fetchData(url, /* type = */ \"arraybuffer\");\n return new Uint8Array(data);\n }\n}\n\nexport { BaseWasmFactory, DOMWasmFactory };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\nimport { isNodeJS, warn } from \"../shared/util.js\";\nimport { BaseCanvasFactory } from \"./canvas_factory.js\";\nimport { BaseCMapReaderFactory } from \"./cmap_reader_factory.js\";\nimport { BaseFilterFactory } from \"./filter_factory.js\";\nimport { BaseStandardFontDataFactory } from \"./standard_fontdata_factory.js\";\nimport { BaseWasmFactory } from \"./wasm_factory.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./node_utils.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nif (isNodeJS) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"SKIP_BABEL\")) {\n warn(\"Please use the `legacy` build in Node.js environments.\");\n } else {\n let canvas;\n try {\n const require = process\n .getBuiltinModule(\"module\")\n .createRequire(import.meta.url);\n\n try {\n canvas = require(\"@napi-rs/canvas\");\n } catch (ex) {\n warn(`Cannot load \"@napi-rs/canvas\" package: \"${ex}\".`);\n }\n } catch (ex) {\n warn(`Cannot access the \\`require\\` function: \"${ex}\".`);\n }\n\n if (!globalThis.DOMMatrix) {\n if (canvas?.DOMMatrix) {\n globalThis.DOMMatrix = canvas.DOMMatrix;\n } else {\n warn(\"Cannot polyfill `DOMMatrix`, rendering may be broken.\");\n }\n }\n if (!globalThis.ImageData) {\n if (canvas?.ImageData) {\n globalThis.ImageData = canvas.ImageData;\n } else {\n warn(\"Cannot polyfill `ImageData`, rendering may be broken.\");\n }\n }\n if (!globalThis.Path2D) {\n if (canvas?.Path2D) {\n globalThis.Path2D = canvas.Path2D;\n } else {\n warn(\"Cannot polyfill `Path2D`, rendering may be broken.\");\n }\n }\n }\n}\n\nasync function fetchData(url) {\n const fs = process.getBuiltinModule(\"fs\");\n const data = await fs.promises.readFile(url);\n return new Uint8Array(data);\n}\n\nclass NodeFilterFactory extends BaseFilterFactory {}\n\nclass NodeCanvasFactory extends BaseCanvasFactory {\n /**\n * @ignore\n */\n _createCanvas(width, height) {\n const require = process\n .getBuiltinModule(\"module\")\n .createRequire(import.meta.url);\n const canvas = require(\"@napi-rs/canvas\");\n return canvas.createCanvas(width, height);\n }\n}\n\nclass NodeCMapReaderFactory extends BaseCMapReaderFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n return fetchData(url);\n }\n}\n\nclass NodeStandardFontDataFactory extends BaseStandardFontDataFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n return fetchData(url);\n }\n}\n\nclass NodeWasmFactory extends BaseWasmFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n return fetchData(url);\n }\n}\n\nexport {\n fetchData,\n NodeCanvasFactory,\n NodeCMapReaderFactory,\n NodeFilterFactory,\n NodeStandardFontDataFactory,\n NodeWasmFactory,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormatError, info, unreachable, Util } from \"../shared/util.js\";\nimport { getCurrentTransform } from \"./display_utils.js\";\n\nconst PathType = {\n FILL: \"Fill\",\n STROKE: \"Stroke\",\n SHADING: \"Shading\",\n};\n\nfunction applyBoundingBox(ctx, bbox) {\n if (!bbox) {\n return;\n }\n const width = bbox[2] - bbox[0];\n const height = bbox[3] - bbox[1];\n const region = new Path2D();\n region.rect(bbox[0], bbox[1], width, height);\n ctx.clip(region);\n}\n\nclass BaseShadingPattern {\n constructor() {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseShadingPattern\n ) {\n unreachable(\"Cannot initialize BaseShadingPattern.\");\n }\n }\n\n isModifyingCurrentTransform() {\n return false;\n }\n\n getPattern() {\n unreachable(\"Abstract method `getPattern` called.\");\n }\n}\n\nclass RadialAxialShadingPattern extends BaseShadingPattern {\n constructor(IR) {\n super();\n this._type = IR[1];\n this._bbox = IR[2];\n this._colorStops = IR[3];\n this._p0 = IR[4];\n this._p1 = IR[5];\n this._r0 = IR[6];\n this._r1 = IR[7];\n this.matrix = null;\n }\n\n _createGradient(ctx) {\n let grad;\n if (this._type === \"axial\") {\n grad = ctx.createLinearGradient(\n this._p0[0],\n this._p0[1],\n this._p1[0],\n this._p1[1]\n );\n } else if (this._type === \"radial\") {\n grad = ctx.createRadialGradient(\n this._p0[0],\n this._p0[1],\n this._r0,\n this._p1[0],\n this._p1[1],\n this._r1\n );\n }\n\n for (const colorStop of this._colorStops) {\n grad.addColorStop(colorStop[0], colorStop[1]);\n }\n return grad;\n }\n\n getPattern(ctx, owner, inverse, pathType) {\n let pattern;\n if (pathType === PathType.STROKE || pathType === PathType.FILL) {\n const ownerBBox = owner.current.getClippedPathBoundingBox(\n pathType,\n getCurrentTransform(ctx)\n ) || [0, 0, 0, 0];\n // Create a canvas that is only as big as the current path. This doesn't\n // allow us to cache the pattern, but it generally creates much smaller\n // canvases and saves memory use. See bug 1722807 for an example.\n const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1;\n const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1;\n\n const tmpCanvas = owner.cachedCanvases.getCanvas(\n \"pattern\",\n width,\n height\n );\n\n const tmpCtx = tmpCanvas.context;\n tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n tmpCtx.beginPath();\n tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n // Non shading fill patterns are positioned relative to the base transform\n // (usually the page's initial transform), but we may have created a\n // smaller canvas based on the path, so we must account for the shift.\n tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]);\n inverse = Util.transform(inverse, [\n 1,\n 0,\n 0,\n 1,\n ownerBBox[0],\n ownerBBox[1],\n ]);\n\n tmpCtx.transform(...owner.baseTransform);\n if (this.matrix) {\n tmpCtx.transform(...this.matrix);\n }\n applyBoundingBox(tmpCtx, this._bbox);\n\n tmpCtx.fillStyle = this._createGradient(tmpCtx);\n tmpCtx.fill();\n\n pattern = ctx.createPattern(tmpCanvas.canvas, \"no-repeat\");\n const domMatrix = new DOMMatrix(inverse);\n pattern.setTransform(domMatrix);\n } else {\n // Shading fills are applied relative to the current matrix which is also\n // how canvas gradients work, so there's no need to do anything special\n // here.\n applyBoundingBox(ctx, this._bbox);\n pattern = this._createGradient(ctx);\n }\n return pattern;\n }\n}\n\nfunction drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n // Very basic Gouraud-shaded triangle rasterization algorithm.\n const coords = context.coords,\n colors = context.colors;\n const bytes = data.data,\n rowSize = data.width * 4;\n let tmp;\n if (coords[p1 + 1] > coords[p2 + 1]) {\n tmp = p1;\n p1 = p2;\n p2 = tmp;\n tmp = c1;\n c1 = c2;\n c2 = tmp;\n }\n if (coords[p2 + 1] > coords[p3 + 1]) {\n tmp = p2;\n p2 = p3;\n p3 = tmp;\n tmp = c2;\n c2 = c3;\n c3 = tmp;\n }\n if (coords[p1 + 1] > coords[p2 + 1]) {\n tmp = p1;\n p1 = p2;\n p2 = tmp;\n tmp = c1;\n c1 = c2;\n c2 = tmp;\n }\n const x1 = (coords[p1] + context.offsetX) * context.scaleX;\n const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n const x2 = (coords[p2] + context.offsetX) * context.scaleX;\n const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n const x3 = (coords[p3] + context.offsetX) * context.scaleX;\n const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n if (y1 >= y3) {\n return;\n }\n const c1r = colors[c1],\n c1g = colors[c1 + 1],\n c1b = colors[c1 + 2];\n const c2r = colors[c2],\n c2g = colors[c2 + 1],\n c2b = colors[c2 + 2];\n const c3r = colors[c3],\n c3g = colors[c3 + 1],\n c3b = colors[c3 + 2];\n\n const minY = Math.round(y1),\n maxY = Math.round(y3);\n let xa, car, cag, cab;\n let xb, cbr, cbg, cbb;\n for (let y = minY; y <= maxY; y++) {\n if (y < y2) {\n const k = y < y1 ? 0 : (y1 - y) / (y1 - y2);\n xa = x1 - (x1 - x2) * k;\n car = c1r - (c1r - c2r) * k;\n cag = c1g - (c1g - c2g) * k;\n cab = c1b - (c1b - c2b) * k;\n } else {\n let k;\n if (y > y3) {\n k = 1;\n } else if (y2 === y3) {\n k = 0;\n } else {\n k = (y2 - y) / (y2 - y3);\n }\n xa = x2 - (x2 - x3) * k;\n car = c2r - (c2r - c3r) * k;\n cag = c2g - (c2g - c3g) * k;\n cab = c2b - (c2b - c3b) * k;\n }\n\n let k;\n if (y < y1) {\n k = 0;\n } else if (y > y3) {\n k = 1;\n } else {\n k = (y1 - y) / (y1 - y3);\n }\n xb = x1 - (x1 - x3) * k;\n cbr = c1r - (c1r - c3r) * k;\n cbg = c1g - (c1g - c3g) * k;\n cbb = c1b - (c1b - c3b) * k;\n const x1_ = Math.round(Math.min(xa, xb));\n const x2_ = Math.round(Math.max(xa, xb));\n let j = rowSize * y + x1_ * 4;\n for (let x = x1_; x <= x2_; x++) {\n k = (xa - x) / (xa - xb);\n if (k < 0) {\n k = 0;\n } else if (k > 1) {\n k = 1;\n }\n bytes[j++] = (car - (car - cbr) * k) | 0;\n bytes[j++] = (cag - (cag - cbg) * k) | 0;\n bytes[j++] = (cab - (cab - cbb) * k) | 0;\n bytes[j++] = 255;\n }\n }\n}\n\nfunction drawFigure(data, figure, context) {\n const ps = figure.coords;\n const cs = figure.colors;\n let i, ii;\n switch (figure.type) {\n case \"lattice\":\n const verticesPerRow = figure.verticesPerRow;\n const rows = Math.floor(ps.length / verticesPerRow) - 1;\n const cols = verticesPerRow - 1;\n for (i = 0; i < rows; i++) {\n let q = i * verticesPerRow;\n for (let j = 0; j < cols; j++, q++) {\n drawTriangle(\n data,\n context,\n ps[q],\n ps[q + 1],\n ps[q + verticesPerRow],\n cs[q],\n cs[q + 1],\n cs[q + verticesPerRow]\n );\n drawTriangle(\n data,\n context,\n ps[q + verticesPerRow + 1],\n ps[q + 1],\n ps[q + verticesPerRow],\n cs[q + verticesPerRow + 1],\n cs[q + 1],\n cs[q + verticesPerRow]\n );\n }\n }\n break;\n case \"triangles\":\n for (i = 0, ii = ps.length; i < ii; i += 3) {\n drawTriangle(\n data,\n context,\n ps[i],\n ps[i + 1],\n ps[i + 2],\n cs[i],\n cs[i + 1],\n cs[i + 2]\n );\n }\n break;\n default:\n throw new Error(\"illegal figure\");\n }\n}\n\nclass MeshShadingPattern extends BaseShadingPattern {\n constructor(IR) {\n super();\n this._coords = IR[2];\n this._colors = IR[3];\n this._figures = IR[4];\n this._bounds = IR[5];\n this._bbox = IR[6];\n this._background = IR[7];\n this.matrix = null;\n }\n\n _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) {\n // we will increase scale on some weird factor to let antialiasing take\n // care of \"rough\" edges\n const EXPECTED_SCALE = 1.1;\n // MAX_PATTERN_SIZE is used to avoid OOM situation.\n const MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough\n // We need to keep transparent border around our pattern for fill():\n // createPattern with 'no-repeat' will bleed edges across entire area.\n const BORDER_SIZE = 2;\n\n const offsetX = Math.floor(this._bounds[0]);\n const offsetY = Math.floor(this._bounds[1]);\n const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;\n const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;\n\n const width = Math.min(\n Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)),\n MAX_PATTERN_SIZE\n );\n const height = Math.min(\n Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)),\n MAX_PATTERN_SIZE\n );\n const scaleX = boundsWidth / width;\n const scaleY = boundsHeight / height;\n\n const context = {\n coords: this._coords,\n colors: this._colors,\n offsetX: -offsetX,\n offsetY: -offsetY,\n scaleX: 1 / scaleX,\n scaleY: 1 / scaleY,\n };\n\n const paddedWidth = width + BORDER_SIZE * 2;\n const paddedHeight = height + BORDER_SIZE * 2;\n\n const tmpCanvas = cachedCanvases.getCanvas(\n \"mesh\",\n paddedWidth,\n paddedHeight\n );\n const tmpCtx = tmpCanvas.context;\n\n const data = tmpCtx.createImageData(width, height);\n if (backgroundColor) {\n const bytes = data.data;\n for (let i = 0, ii = bytes.length; i < ii; i += 4) {\n bytes[i] = backgroundColor[0];\n bytes[i + 1] = backgroundColor[1];\n bytes[i + 2] = backgroundColor[2];\n bytes[i + 3] = 255;\n }\n }\n for (const figure of this._figures) {\n drawFigure(data, figure, context);\n }\n tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n const canvas = tmpCanvas.canvas;\n\n return {\n canvas,\n offsetX: offsetX - BORDER_SIZE * scaleX,\n offsetY: offsetY - BORDER_SIZE * scaleY,\n scaleX,\n scaleY,\n };\n }\n\n isModifyingCurrentTransform() {\n return true;\n }\n\n getPattern(ctx, owner, inverse, pathType) {\n applyBoundingBox(ctx, this._bbox);\n const scale = new Float32Array(2);\n if (pathType === PathType.SHADING) {\n Util.singularValueDecompose2dScale(getCurrentTransform(ctx), scale);\n } else if (this.matrix) {\n // Obtain scale from matrix and current transformation matrix.\n Util.singularValueDecompose2dScale(this.matrix, scale);\n const [matrixScaleX, matrixScaleY] = scale;\n Util.singularValueDecompose2dScale(owner.baseTransform, scale);\n scale[0] *= matrixScaleX;\n scale[1] *= matrixScaleY;\n } else {\n Util.singularValueDecompose2dScale(owner.baseTransform, scale);\n }\n\n // Rasterizing on the main thread since sending/queue large canvases\n // might cause OOM.\n const temporaryPatternCanvas = this._createMeshCanvas(\n scale,\n pathType === PathType.SHADING ? null : this._background,\n owner.cachedCanvases\n );\n\n if (pathType !== PathType.SHADING) {\n ctx.setTransform(...owner.baseTransform);\n if (this.matrix) {\n ctx.transform(...this.matrix);\n }\n }\n\n ctx.translate(\n temporaryPatternCanvas.offsetX,\n temporaryPatternCanvas.offsetY\n );\n ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n\n return ctx.createPattern(temporaryPatternCanvas.canvas, \"no-repeat\");\n }\n}\n\nclass DummyShadingPattern extends BaseShadingPattern {\n getPattern() {\n return \"hotpink\";\n }\n}\n\nfunction getShadingPattern(IR) {\n switch (IR[0]) {\n case \"RadialAxial\":\n return new RadialAxialShadingPattern(IR);\n case \"Mesh\":\n return new MeshShadingPattern(IR);\n case \"Dummy\":\n return new DummyShadingPattern();\n }\n throw new Error(`Unknown IR type: ${IR[0]}`);\n}\n\nconst PaintType = {\n COLORED: 1,\n UNCOLORED: 2,\n};\n\nclass TilingPattern {\n // 10in @ 300dpi shall be enough.\n static MAX_PATTERN_SIZE = 3000;\n\n constructor(IR, ctx, canvasGraphicsFactory, baseTransform) {\n this.color = IR[1];\n this.operatorList = IR[2];\n this.matrix = IR[3];\n this.bbox = IR[4];\n this.xstep = IR[5];\n this.ystep = IR[6];\n this.paintType = IR[7];\n this.tilingType = IR[8];\n this.ctx = ctx;\n this.canvasGraphicsFactory = canvasGraphicsFactory;\n this.baseTransform = baseTransform;\n }\n\n createPatternCanvas(owner) {\n const {\n bbox,\n operatorList,\n paintType,\n tilingType,\n color,\n canvasGraphicsFactory,\n } = this;\n let { xstep, ystep } = this;\n xstep = Math.abs(xstep);\n ystep = Math.abs(ystep);\n\n info(\"TilingType: \" + tilingType);\n\n // A tiling pattern as defined by PDF spec 8.7.2 is a cell whose size is\n // described by bbox, and may repeat regularly by shifting the cell by\n // xstep and ystep.\n // Because the HTML5 canvas API does not support pattern repetition with\n // gaps in between, we use the xstep/ystep instead of the bbox's size.\n //\n // This has the following consequences (similarly for ystep):\n //\n // - If xstep is the same as bbox, then there is no observable difference.\n //\n // - If xstep is larger than bbox, then the pattern canvas is partially\n // empty: the area bounded by bbox is painted, the outside area is void.\n //\n // - If xstep is smaller than bbox, then the pixels between xstep and the\n // bbox boundary will be missing. This is INCORRECT behavior.\n // \"Figures on adjacent tiles should not overlap\" (PDF spec 8.7.3.1),\n // but overlapping cells without common pixels are still valid.\n\n const x0 = bbox[0],\n y0 = bbox[1],\n x1 = bbox[2],\n y1 = bbox[3];\n const width = x1 - x0;\n const height = y1 - y0;\n\n // Obtain scale from matrix and current transformation matrix.\n const scale = new Float32Array(2);\n Util.singularValueDecompose2dScale(this.matrix, scale);\n const [matrixScaleX, matrixScaleY] = scale;\n Util.singularValueDecompose2dScale(this.baseTransform, scale);\n const combinedScaleX = matrixScaleX * scale[0];\n const combinedScaleY = matrixScaleY * scale[1];\n\n let canvasWidth = width,\n canvasHeight = height,\n redrawHorizontally = false,\n redrawVertically = false;\n\n const xScaledStep = Math.ceil(xstep * combinedScaleX);\n const yScaledStep = Math.ceil(ystep * combinedScaleY);\n const xScaledWidth = Math.ceil(width * combinedScaleX);\n const yScaledHeight = Math.ceil(height * combinedScaleY);\n\n if (xScaledStep >= xScaledWidth) {\n canvasWidth = xstep;\n } else {\n redrawHorizontally = true;\n }\n if (yScaledStep >= yScaledHeight) {\n canvasHeight = ystep;\n } else {\n redrawVertically = true;\n }\n\n // Use width and height values that are as close as possible to the end\n // result when the pattern is used. Too low value makes the pattern look\n // blurry. Too large value makes it look too crispy.\n const dimx = this.getSizeAndScale(\n canvasWidth,\n this.ctx.canvas.width,\n combinedScaleX\n );\n const dimy = this.getSizeAndScale(\n canvasHeight,\n this.ctx.canvas.height,\n combinedScaleY\n );\n\n const tmpCanvas = owner.cachedCanvases.getCanvas(\n \"pattern\",\n dimx.size,\n dimy.size\n );\n const tmpCtx = tmpCanvas.context;\n const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);\n graphics.groupLevel = owner.groupLevel;\n\n this.setFillAndStrokeStyleToContext(graphics, paintType, color);\n\n tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0);\n graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0);\n\n // To match CanvasGraphics beginDrawing we must save the context here or\n // else we end up with unbalanced save/restores.\n tmpCtx.save();\n\n this.clipBbox(graphics, x0, y0, x1, y1);\n\n graphics.baseTransform = getCurrentTransform(graphics.ctx);\n\n graphics.executeOperatorList(operatorList);\n\n graphics.endDrawing();\n\n tmpCtx.restore();\n\n if (redrawHorizontally || redrawVertically) {\n // The tile is overlapping itself, so we create a new tile with\n // dimensions xstep * ystep.\n // Then we draw the overlapping parts of the original tile on the new\n // tile.\n // Just as a side note, the code here works correctly even if we don't\n // have to redraw the tile horizontally or vertically. In that case, the\n // original tile is drawn on the new tile only once, but it's useless.\n const image = tmpCanvas.canvas;\n if (redrawHorizontally) {\n canvasWidth = xstep;\n }\n if (redrawVertically) {\n canvasHeight = ystep;\n }\n\n const dimx2 = this.getSizeAndScale(\n canvasWidth,\n this.ctx.canvas.width,\n combinedScaleX\n );\n const dimy2 = this.getSizeAndScale(\n canvasHeight,\n this.ctx.canvas.height,\n combinedScaleY\n );\n\n const xSize = dimx2.size;\n const ySize = dimy2.size;\n const tmpCanvas2 = owner.cachedCanvases.getCanvas(\n \"pattern-workaround\",\n xSize,\n ySize\n );\n const tmpCtx2 = tmpCanvas2.context;\n const ii = redrawHorizontally ? Math.floor(width / xstep) : 0;\n const jj = redrawVertically ? Math.floor(height / ystep) : 0;\n\n // Draw the overlapping parts of the original tile on the new tile.\n for (let i = 0; i <= ii; i++) {\n for (let j = 0; j <= jj; j++) {\n tmpCtx2.drawImage(\n image,\n xSize * i,\n ySize * j,\n xSize,\n ySize,\n 0,\n 0,\n xSize,\n ySize\n );\n }\n }\n return {\n canvas: tmpCanvas2.canvas,\n scaleX: dimx2.scale,\n scaleY: dimy2.scale,\n offsetX: x0,\n offsetY: y0,\n };\n }\n\n return {\n canvas: tmpCanvas.canvas,\n scaleX: dimx.scale,\n scaleY: dimy.scale,\n offsetX: x0,\n offsetY: y0,\n };\n }\n\n getSizeAndScale(step, realOutputSize, scale) {\n // MAX_PATTERN_SIZE is used to avoid OOM situation.\n // Use the destination canvas's size if it is bigger than the hard-coded\n // limit of MAX_PATTERN_SIZE to avoid clipping patterns that cover the\n // whole canvas.\n const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize);\n let size = Math.ceil(step * scale);\n if (size >= maxSize) {\n size = maxSize;\n } else {\n scale = size / step;\n }\n return { scale, size };\n }\n\n clipBbox(graphics, x0, y0, x1, y1) {\n const bboxWidth = x1 - x0;\n const bboxHeight = y1 - y0;\n graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n Util.axialAlignedBoundingBox(\n [x0, y0, x1, y1],\n getCurrentTransform(graphics.ctx),\n graphics.current.minMax\n );\n graphics.clip();\n graphics.endPath();\n }\n\n setFillAndStrokeStyleToContext(graphics, paintType, color) {\n const context = graphics.ctx,\n current = graphics.current;\n switch (paintType) {\n case PaintType.COLORED:\n const ctx = this.ctx;\n context.fillStyle = ctx.fillStyle;\n context.strokeStyle = ctx.strokeStyle;\n current.fillColor = ctx.fillStyle;\n current.strokeColor = ctx.strokeStyle;\n break;\n case PaintType.UNCOLORED:\n const cssColor = Util.makeHexColor(color[0], color[1], color[2]);\n context.fillStyle = cssColor;\n context.strokeStyle = cssColor;\n // Set color needed by image masks (fixes issues 3226 and 8741).\n current.fillColor = cssColor;\n current.strokeColor = cssColor;\n break;\n default:\n throw new FormatError(`Unsupported paint type: ${paintType}`);\n }\n }\n\n isModifyingCurrentTransform() {\n return false;\n }\n\n getPattern(ctx, owner, inverse, pathType) {\n // PDF spec 8.7.2 NOTE 1: pattern's matrix is relative to initial matrix.\n let matrix = inverse;\n if (pathType !== PathType.SHADING) {\n matrix = Util.transform(matrix, owner.baseTransform);\n if (this.matrix) {\n matrix = Util.transform(matrix, this.matrix);\n }\n }\n\n const temporaryPatternCanvas = this.createPatternCanvas(owner);\n\n let domMatrix = new DOMMatrix(matrix);\n // Rescale and so that the ctx.createPattern call generates a pattern with\n // the desired size.\n domMatrix = domMatrix.translate(\n temporaryPatternCanvas.offsetX,\n temporaryPatternCanvas.offsetY\n );\n domMatrix = domMatrix.scale(\n 1 / temporaryPatternCanvas.scaleX,\n 1 / temporaryPatternCanvas.scaleY\n );\n\n const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, \"repeat\");\n pattern.setTransform(domMatrix);\n\n return pattern;\n }\n}\n\nexport { getShadingPattern, PathType, TilingPattern };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest, ImageKind } from \"./util.js\";\n\nfunction convertToRGBA(params) {\n switch (params.kind) {\n case ImageKind.GRAYSCALE_1BPP:\n return convertBlackAndWhiteToRGBA(params);\n case ImageKind.RGB_24BPP:\n return convertRGBToRGBA(params);\n }\n\n return null;\n}\n\nfunction convertBlackAndWhiteToRGBA({\n src,\n srcPos = 0,\n dest,\n width,\n height,\n nonBlackColor = 0xffffffff,\n inverseDecode = false,\n}) {\n const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n const [zeroMapping, oneMapping] = inverseDecode\n ? [nonBlackColor, black]\n : [black, nonBlackColor];\n const widthInSource = width >> 3;\n const widthRemainder = width & 7;\n const srcLength = src.length;\n dest = new Uint32Array(dest.buffer);\n let destPos = 0;\n\n for (let i = 0; i < height; i++) {\n for (const max = srcPos + widthInSource; srcPos < max; srcPos++) {\n const elem = srcPos < srcLength ? src[srcPos] : 255;\n dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping;\n }\n if (widthRemainder === 0) {\n continue;\n }\n const elem = srcPos < srcLength ? src[srcPos++] : 255;\n for (let j = 0; j < widthRemainder; j++) {\n dest[destPos++] = elem & (1 << (7 - j)) ? oneMapping : zeroMapping;\n }\n }\n return { srcPos, destPos };\n}\n\nfunction convertRGBToRGBA({\n src,\n srcPos = 0,\n dest,\n destPos = 0,\n width,\n height,\n}) {\n let i = 0;\n const len = width * height * 3;\n const len32 = len >> 2;\n const src32 = new Uint32Array(src.buffer, srcPos, len32);\n\n if (FeatureTest.isLittleEndian) {\n // It's a way faster to do the shuffle manually instead of working\n // component by component with some Uint8 arrays.\n for (; i < len32 - 2; i += 3, destPos += 4) {\n const s1 = src32[i]; // R2B1G1R1\n const s2 = src32[i + 1]; // G3R3B2G2\n const s3 = src32[i + 2]; // B4G4R4B3\n\n dest[destPos] = s1 | 0xff000000;\n dest[destPos + 1] = (s1 >>> 24) | (s2 << 8) | 0xff000000;\n dest[destPos + 2] = (s2 >>> 16) | (s3 << 16) | 0xff000000;\n dest[destPos + 3] = (s3 >>> 8) | 0xff000000;\n }\n\n for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n dest[destPos++] =\n src[j] | (src[j + 1] << 8) | (src[j + 2] << 16) | 0xff000000;\n }\n } else {\n for (; i < len32 - 2; i += 3, destPos += 4) {\n const s1 = src32[i]; // R1G1B1R2\n const s2 = src32[i + 1]; // G2B2R3G3\n const s3 = src32[i + 2]; // B3R4G4B4\n\n dest[destPos] = s1 | 0xff;\n dest[destPos + 1] = (s1 << 24) | (s2 >>> 8) | 0xff;\n dest[destPos + 2] = (s2 << 16) | (s3 >>> 16) | 0xff;\n dest[destPos + 3] = (s3 << 8) | 0xff;\n }\n\n for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n dest[destPos++] =\n (src[j] << 24) | (src[j + 1] << 16) | (src[j + 2] << 8) | 0xff;\n }\n }\n\n return { srcPos: srcPos + len, destPos };\n}\n\nfunction grayToRGBA(src, dest) {\n if (FeatureTest.isLittleEndian) {\n for (let i = 0, ii = src.length; i < ii; i++) {\n dest[i] = (src[i] * 0x10101) | 0xff000000;\n }\n } else {\n for (let i = 0, ii = src.length; i < ii; i++) {\n dest[i] = (src[i] * 0x1010100) | 0x000000ff;\n }\n }\n}\n\nexport { convertBlackAndWhiteToRGBA, convertToRGBA, grayToRGBA };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DrawOPS,\n FeatureTest,\n FONT_IDENTITY_MATRIX,\n ImageKind,\n info,\n OPS,\n shadow,\n TextRenderingMode,\n unreachable,\n Util,\n warn,\n} from \"../shared/util.js\";\nimport {\n getCurrentTransform,\n getCurrentTransformInverse,\n OutputScale,\n PixelsPerInch,\n} from \"./display_utils.js\";\nimport {\n getShadingPattern,\n PathType,\n TilingPattern,\n} from \"./pattern_helper.js\";\nimport { convertBlackAndWhiteToRGBA } from \"../shared/image_utils.js\";\n\n// contexts store most of the state we need natively.\n// However, PDF needs a bit more state, which we store here.\n// Minimal font size that would be used during canvas fillText operations.\nconst MIN_FONT_SIZE = 16;\n// Maximum font size that would be used during canvas fillText operations.\nconst MAX_FONT_SIZE = 100;\n\n// Defines the time the `executeOperatorList`-method is going to be executing\n// before it stops and schedules a continue of execution.\nconst EXECUTION_TIME = 15; // ms\n// Defines the number of steps before checking the execution time.\nconst EXECUTION_STEPS = 10;\n\nconst FULL_CHUNK_HEIGHT = 16;\n\n// Only used in rescaleAndStroke. The goal is to avoid\n// creating a new DOMMatrix object each time we need it.\nconst SCALE_MATRIX = new DOMMatrix();\n\n// Used to get some coordinates.\nconst XY = new Float32Array(2);\n\n// Initial rectangle values for the minMax array.\nconst MIN_MAX_INIT = new Float32Array([\n Infinity,\n Infinity,\n -Infinity,\n -Infinity,\n]);\n\n/**\n * Overrides certain methods on a 2d ctx so that when they are called they\n * will also call the same method on the destCtx. The methods that are\n * overridden are all the transformation state modifiers, path creation, and\n * save/restore. We only forward these specific methods because they are the\n * only state modifiers that we cannot copy over when we switch contexts.\n *\n * To remove mirroring call `ctx._removeMirroring()`.\n *\n * @param {Object} ctx - The 2d canvas context that will duplicate its calls on\n * the destCtx.\n * @param {Object} destCtx - The 2d canvas context that will receive the\n * forwarded calls.\n */\nfunction mirrorContextOperations(ctx, destCtx) {\n if (ctx._removeMirroring) {\n throw new Error(\"Context is already forwarding operations.\");\n }\n ctx.__originalSave = ctx.save;\n ctx.__originalRestore = ctx.restore;\n ctx.__originalRotate = ctx.rotate;\n ctx.__originalScale = ctx.scale;\n ctx.__originalTranslate = ctx.translate;\n ctx.__originalTransform = ctx.transform;\n ctx.__originalSetTransform = ctx.setTransform;\n ctx.__originalResetTransform = ctx.resetTransform;\n ctx.__originalClip = ctx.clip;\n ctx.__originalMoveTo = ctx.moveTo;\n ctx.__originalLineTo = ctx.lineTo;\n ctx.__originalBezierCurveTo = ctx.bezierCurveTo;\n ctx.__originalRect = ctx.rect;\n ctx.__originalClosePath = ctx.closePath;\n ctx.__originalBeginPath = ctx.beginPath;\n\n ctx._removeMirroring = () => {\n ctx.save = ctx.__originalSave;\n ctx.restore = ctx.__originalRestore;\n ctx.rotate = ctx.__originalRotate;\n ctx.scale = ctx.__originalScale;\n ctx.translate = ctx.__originalTranslate;\n ctx.transform = ctx.__originalTransform;\n ctx.setTransform = ctx.__originalSetTransform;\n ctx.resetTransform = ctx.__originalResetTransform;\n\n ctx.clip = ctx.__originalClip;\n ctx.moveTo = ctx.__originalMoveTo;\n ctx.lineTo = ctx.__originalLineTo;\n ctx.bezierCurveTo = ctx.__originalBezierCurveTo;\n ctx.rect = ctx.__originalRect;\n ctx.closePath = ctx.__originalClosePath;\n ctx.beginPath = ctx.__originalBeginPath;\n delete ctx._removeMirroring;\n };\n\n ctx.save = function () {\n destCtx.save();\n this.__originalSave();\n };\n\n ctx.restore = function () {\n destCtx.restore();\n this.__originalRestore();\n };\n\n ctx.translate = function (x, y) {\n destCtx.translate(x, y);\n this.__originalTranslate(x, y);\n };\n\n ctx.scale = function (x, y) {\n destCtx.scale(x, y);\n this.__originalScale(x, y);\n };\n\n ctx.transform = function (a, b, c, d, e, f) {\n destCtx.transform(a, b, c, d, e, f);\n this.__originalTransform(a, b, c, d, e, f);\n };\n\n ctx.setTransform = function (a, b, c, d, e, f) {\n destCtx.setTransform(a, b, c, d, e, f);\n this.__originalSetTransform(a, b, c, d, e, f);\n };\n\n ctx.resetTransform = function () {\n destCtx.resetTransform();\n this.__originalResetTransform();\n };\n\n ctx.rotate = function (angle) {\n destCtx.rotate(angle);\n this.__originalRotate(angle);\n };\n\n ctx.clip = function (rule) {\n destCtx.clip(rule);\n this.__originalClip(rule);\n };\n\n ctx.moveTo = function (x, y) {\n destCtx.moveTo(x, y);\n this.__originalMoveTo(x, y);\n };\n\n ctx.lineTo = function (x, y) {\n destCtx.lineTo(x, y);\n this.__originalLineTo(x, y);\n };\n\n ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) {\n destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n };\n\n ctx.rect = function (x, y, width, height) {\n destCtx.rect(x, y, width, height);\n this.__originalRect(x, y, width, height);\n };\n\n ctx.closePath = function () {\n destCtx.closePath();\n this.__originalClosePath();\n };\n\n ctx.beginPath = function () {\n destCtx.beginPath();\n this.__originalBeginPath();\n };\n}\n\nclass CachedCanvases {\n constructor(canvasFactory) {\n this.canvasFactory = canvasFactory;\n this.cache = Object.create(null);\n }\n\n getCanvas(id, width, height) {\n let canvasEntry;\n if (this.cache[id] !== undefined) {\n canvasEntry = this.cache[id];\n this.canvasFactory.reset(canvasEntry, width, height);\n } else {\n canvasEntry = this.canvasFactory.create(width, height);\n this.cache[id] = canvasEntry;\n }\n return canvasEntry;\n }\n\n delete(id) {\n delete this.cache[id];\n }\n\n clear() {\n for (const id in this.cache) {\n const canvasEntry = this.cache[id];\n this.canvasFactory.destroy(canvasEntry);\n delete this.cache[id];\n }\n }\n}\n\nfunction drawImageAtIntegerCoords(\n ctx,\n srcImg,\n srcX,\n srcY,\n srcW,\n srcH,\n destX,\n destY,\n destW,\n destH\n) {\n const [a, b, c, d, tx, ty] = getCurrentTransform(ctx);\n if (b === 0 && c === 0) {\n // top-left corner is at (X, Y) and\n // bottom-right one is at (X + width, Y + height).\n\n // If leftX is 4.321 then it's rounded to 4.\n // If width is 10.432 then it's rounded to 11 because\n // rightX = leftX + width = 14.753 which is rounded to 15\n // so after rounding the total width is 11 (15 - 4).\n // It's why we can't just floor/ceil uniformly, it just depends\n // on the values we've.\n\n const tlX = destX * a + tx;\n const rTlX = Math.round(tlX);\n const tlY = destY * d + ty;\n const rTlY = Math.round(tlY);\n const brX = (destX + destW) * a + tx;\n\n // Some pdf contains images with 1x1 images so in case of 0-width after\n // scaling we must fallback on 1 to be sure there is something.\n const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n const brY = (destY + destH) * d + ty;\n const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n // We must apply a transformation in order to apply it on the image itself.\n // For example if a == 1 && d == -1, it means that the image itself is\n // mirrored w.r.t. the x-axis.\n ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY);\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight);\n ctx.setTransform(a, b, c, d, tx, ty);\n\n return [rWidth, rHeight];\n }\n\n if (a === 0 && d === 0) {\n // This path is taken in issue9462.pdf (page 3).\n const tlX = destY * c + tx;\n const rTlX = Math.round(tlX);\n const tlY = destX * b + ty;\n const rTlY = Math.round(tlY);\n const brX = (destY + destH) * c + tx;\n const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n const brY = (destX + destW) * b + ty;\n const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY);\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth);\n ctx.setTransform(a, b, c, d, tx, ty);\n\n return [rHeight, rWidth];\n }\n\n // Not a scale matrix so let the render handle the case without rounding.\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH);\n\n const scaleX = Math.hypot(a, b);\n const scaleY = Math.hypot(c, d);\n return [scaleX * destW, scaleY * destH];\n}\n\nclass CanvasExtraState {\n // Are soft masks and alpha values shapes or opacities?\n alphaIsShape = false;\n\n fontSize = 0;\n\n fontSizeScale = 1;\n\n textMatrix = null;\n\n textMatrixScale = 1;\n\n fontMatrix = FONT_IDENTITY_MATRIX;\n\n leading = 0;\n\n // Current point (in user coordinates)\n x = 0;\n\n y = 0;\n\n // Start of text line (in text coordinates)\n lineX = 0;\n\n lineY = 0;\n\n // Character and word spacing\n charSpacing = 0;\n\n wordSpacing = 0;\n\n textHScale = 1;\n\n textRenderingMode = TextRenderingMode.FILL;\n\n textRise = 0;\n\n // Default fore and background colors\n fillColor = \"#000000\";\n\n strokeColor = \"#000000\";\n\n patternFill = false;\n\n patternStroke = false;\n\n // Note: fill alpha applies to all non-stroking operations\n fillAlpha = 1;\n\n strokeAlpha = 1;\n\n lineWidth = 1;\n\n activeSMask = null;\n\n transferMaps = \"none\";\n\n constructor(width, height) {\n this.clipBox = new Float32Array([0, 0, width, height]);\n this.minMax = MIN_MAX_INIT.slice();\n }\n\n clone() {\n const clone = Object.create(this);\n clone.clipBox = this.clipBox.slice();\n clone.minMax = this.minMax.slice();\n return clone;\n }\n\n getPathBoundingBox(pathType = PathType.FILL, transform = null) {\n const box = this.minMax.slice();\n if (pathType === PathType.STROKE) {\n if (!transform) {\n unreachable(\"Stroke bounding box must include transform.\");\n }\n // Stroked paths can be outside of the path bounding box by 1/2 the line\n // width.\n Util.singularValueDecompose2dScale(transform, XY);\n const xStrokePad = (XY[0] * this.lineWidth) / 2;\n const yStrokePad = (XY[1] * this.lineWidth) / 2;\n box[0] -= xStrokePad;\n box[1] -= yStrokePad;\n box[2] += xStrokePad;\n box[3] += yStrokePad;\n }\n return box;\n }\n\n updateClipFromPath() {\n const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox());\n this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]);\n }\n\n isEmptyClip() {\n return this.minMax[0] === Infinity;\n }\n\n startNewPathAndClipBox(box) {\n this.clipBox.set(box, 0);\n this.minMax.set(MIN_MAX_INIT, 0);\n }\n\n getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) {\n return Util.intersect(\n this.clipBox,\n this.getPathBoundingBox(pathType, transform)\n );\n }\n}\n\nfunction putBinaryImageData(ctx, imgData) {\n if (imgData instanceof ImageData) {\n ctx.putImageData(imgData, 0, 0);\n return;\n }\n\n // Put the image data to the canvas in chunks, rather than putting the\n // whole image at once. This saves JS memory, because the ImageData object\n // is smaller. It also possibly saves C++ memory within the implementation\n // of putImageData(). (E.g. in Firefox we make two short-lived copies of\n // the data passed to putImageData()). |n| shouldn't be too small, however,\n // because too many putImageData() calls will slow things down.\n //\n // Note: as written, if the last chunk is partial, the putImageData() call\n // will (conceptually) put pixels past the bounds of the canvas. But\n // that's ok; any such pixels are ignored.\n\n const height = imgData.height,\n width = imgData.width;\n const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n let srcPos = 0,\n destPos;\n const src = imgData.data;\n const dest = chunkImgData.data;\n let i, j, thisChunkHeight, elemsInThisChunk;\n\n // There are multiple forms in which the pixel data can be passed, and\n // imgData.kind tells us which one this is.\n if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {\n // Grayscale, 1 bit per pixel (i.e. black-and-white).\n const srcLength = src.byteLength;\n const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n const dest32DataLength = dest32.length;\n const fullSrcDiff = (width + 7) >> 3;\n const white = 0xffffffff;\n const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n\n for (i = 0; i < totalChunks; i++) {\n thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n destPos = 0;\n for (j = 0; j < thisChunkHeight; j++) {\n const srcDiff = srcLength - srcPos;\n let k = 0;\n const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;\n const kEndUnrolled = kEnd & ~7;\n let mask = 0;\n let srcByte = 0;\n for (; k < kEndUnrolled; k += 8) {\n srcByte = src[srcPos++];\n dest32[destPos++] = srcByte & 128 ? white : black;\n dest32[destPos++] = srcByte & 64 ? white : black;\n dest32[destPos++] = srcByte & 32 ? white : black;\n dest32[destPos++] = srcByte & 16 ? white : black;\n dest32[destPos++] = srcByte & 8 ? white : black;\n dest32[destPos++] = srcByte & 4 ? white : black;\n dest32[destPos++] = srcByte & 2 ? white : black;\n dest32[destPos++] = srcByte & 1 ? white : black;\n }\n for (; k < kEnd; k++) {\n if (mask === 0) {\n srcByte = src[srcPos++];\n mask = 128;\n }\n\n dest32[destPos++] = srcByte & mask ? white : black;\n mask >>= 1;\n }\n }\n // We ran out of input. Make all remaining pixels transparent.\n while (destPos < dest32DataLength) {\n dest32[destPos++] = 0;\n }\n\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n } else if (imgData.kind === ImageKind.RGBA_32BPP) {\n // RGBA, 32-bits per pixel.\n j = 0;\n elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n for (i = 0; i < fullChunks; i++) {\n dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n srcPos += elemsInThisChunk;\n\n ctx.putImageData(chunkImgData, 0, j);\n j += FULL_CHUNK_HEIGHT;\n }\n if (i < totalChunks) {\n elemsInThisChunk = width * partialChunkHeight * 4;\n dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n\n ctx.putImageData(chunkImgData, 0, j);\n }\n } else if (imgData.kind === ImageKind.RGB_24BPP) {\n // RGB, 24-bits per pixel.\n thisChunkHeight = FULL_CHUNK_HEIGHT;\n elemsInThisChunk = width * thisChunkHeight;\n for (i = 0; i < totalChunks; i++) {\n if (i >= fullChunks) {\n thisChunkHeight = partialChunkHeight;\n elemsInThisChunk = width * thisChunkHeight;\n }\n\n destPos = 0;\n for (j = elemsInThisChunk; j--; ) {\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = 255;\n }\n\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n } else {\n throw new Error(`bad image kind: ${imgData.kind}`);\n }\n}\n\nfunction putBinaryImageMask(ctx, imgData) {\n if (imgData.bitmap) {\n // The bitmap has been created in the worker.\n ctx.drawImage(imgData.bitmap, 0, 0);\n return;\n }\n\n // Slow path: OffscreenCanvas isn't available in the worker.\n const height = imgData.height,\n width = imgData.width;\n const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n let srcPos = 0;\n const src = imgData.data;\n const dest = chunkImgData.data;\n\n for (let i = 0; i < totalChunks; i++) {\n const thisChunkHeight =\n i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n\n // Expand the mask so it can be used by the canvas. Any required\n // inversion has already been handled.\n\n ({ srcPos } = convertBlackAndWhiteToRGBA({\n src,\n srcPos,\n dest,\n width,\n height: thisChunkHeight,\n nonBlackColor: 0,\n }));\n\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n}\n\nfunction copyCtxState(sourceCtx, destCtx) {\n const properties = [\n \"strokeStyle\",\n \"fillStyle\",\n \"fillRule\",\n \"globalAlpha\",\n \"lineWidth\",\n \"lineCap\",\n \"lineJoin\",\n \"miterLimit\",\n \"globalCompositeOperation\",\n \"font\",\n \"filter\",\n ];\n for (const property of properties) {\n if (sourceCtx[property] !== undefined) {\n destCtx[property] = sourceCtx[property];\n }\n }\n if (sourceCtx.setLineDash !== undefined) {\n destCtx.setLineDash(sourceCtx.getLineDash());\n destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n }\n}\n\nfunction resetCtxToDefault(ctx) {\n ctx.strokeStyle = ctx.fillStyle = \"#000000\";\n ctx.fillRule = \"nonzero\";\n ctx.globalAlpha = 1;\n ctx.lineWidth = 1;\n ctx.lineCap = \"butt\";\n ctx.lineJoin = \"miter\";\n ctx.miterLimit = 10;\n ctx.globalCompositeOperation = \"source-over\";\n ctx.font = \"10px sans-serif\";\n if (ctx.setLineDash !== undefined) {\n ctx.setLineDash([]);\n ctx.lineDashOffset = 0;\n }\n const { filter } = ctx;\n if (filter !== \"none\" && filter !== \"\") {\n ctx.filter = \"none\";\n }\n}\n\nfunction getImageSmoothingEnabled(transform, interpolate) {\n // In section 8.9.5.3 of the PDF spec, it's mentioned that the interpolate\n // flag should be used when the image is upscaled.\n // In Firefox, smoothing is always used when downscaling images (bug 1360415).\n\n if (interpolate) {\n return true;\n }\n\n Util.singularValueDecompose2dScale(transform, XY);\n // Round to a 32bit float so that `<=` check below will pass for numbers that\n // are very close, but not exactly the same 64bit floats.\n const actualScale = Math.fround(\n OutputScale.pixelRatio * PixelsPerInch.PDF_TO_CSS_UNITS\n );\n // `XY` is a Float32Array.\n return XY[0] <= actualScale && XY[1] <= actualScale;\n}\n\nconst LINE_CAP_STYLES = [\"butt\", \"round\", \"square\"];\nconst LINE_JOIN_STYLES = [\"miter\", \"round\", \"bevel\"];\nconst NORMAL_CLIP = {};\nconst EO_CLIP = {};\n\nclass CanvasGraphics {\n constructor(\n canvasCtx,\n commonObjs,\n objs,\n canvasFactory,\n filterFactory,\n { optionalContentConfig, markedContentStack = null },\n annotationCanvasMap,\n pageColors\n ) {\n this.ctx = canvasCtx;\n this.current = new CanvasExtraState(\n this.ctx.canvas.width,\n this.ctx.canvas.height\n );\n this.stateStack = [];\n this.pendingClip = null;\n this.pendingEOFill = false;\n this.res = null;\n this.xobjs = null;\n this.commonObjs = commonObjs;\n this.objs = objs;\n this.canvasFactory = canvasFactory;\n this.filterFactory = filterFactory;\n this.groupStack = [];\n // Patterns are painted relative to the initial page/form transform, see\n // PDF spec 8.7.2 NOTE 1.\n this.baseTransform = null;\n this.baseTransformStack = [];\n this.groupLevel = 0;\n this.smaskStack = [];\n this.smaskCounter = 0;\n this.tempSMask = null;\n this.suspendedCtx = null;\n this.contentVisible = true;\n this.markedContentStack = markedContentStack || [];\n this.optionalContentConfig = optionalContentConfig;\n this.cachedCanvases = new CachedCanvases(this.canvasFactory);\n this.cachedPatterns = new Map();\n this.annotationCanvasMap = annotationCanvasMap;\n this.viewportScale = 1;\n this.outputScaleX = 1;\n this.outputScaleY = 1;\n this.pageColors = pageColors;\n\n this._cachedScaleForStroking = [-1, 0];\n this._cachedGetSinglePixelWidth = null;\n this._cachedBitmapsMap = new Map();\n }\n\n getObject(data, fallback = null) {\n if (typeof data === \"string\") {\n return data.startsWith(\"g_\")\n ? this.commonObjs.get(data)\n : this.objs.get(data);\n }\n return fallback;\n }\n\n beginDrawing({\n transform,\n viewport,\n transparency = false,\n background = null,\n }) {\n // For pdfs that use blend modes we have to clear the canvas else certain\n // blend modes can look wrong since we'd be blending with a white\n // backdrop. The problem with a transparent backdrop though is we then\n // don't get sub pixel anti aliasing on text, creating temporary\n // transparent canvas when we have blend modes.\n const width = this.ctx.canvas.width;\n const height = this.ctx.canvas.height;\n\n const savedFillStyle = this.ctx.fillStyle;\n this.ctx.fillStyle = background || \"#ffffff\";\n this.ctx.fillRect(0, 0, width, height);\n this.ctx.fillStyle = savedFillStyle;\n\n if (transparency) {\n const transparentCanvas = this.cachedCanvases.getCanvas(\n \"transparent\",\n width,\n height\n );\n this.compositeCtx = this.ctx;\n this.transparentCanvas = transparentCanvas.canvas;\n this.ctx = transparentCanvas.context;\n this.ctx.save();\n // The transform can be applied before rendering, transferring it to\n // the new canvas.\n this.ctx.transform(...getCurrentTransform(this.compositeCtx));\n }\n\n this.ctx.save();\n resetCtxToDefault(this.ctx);\n if (transform) {\n this.ctx.transform(...transform);\n this.outputScaleX = transform[0];\n this.outputScaleY = transform[0];\n }\n this.ctx.transform(...viewport.transform);\n this.viewportScale = viewport.scale;\n\n this.baseTransform = getCurrentTransform(this.ctx);\n }\n\n executeOperatorList(\n operatorList,\n executionStartIdx,\n continueCallback,\n stepper\n ) {\n const argsArray = operatorList.argsArray;\n const fnArray = operatorList.fnArray;\n let i = executionStartIdx || 0;\n const argsArrayLen = argsArray.length;\n\n // Sometimes the OperatorList to execute is empty.\n if (argsArrayLen === i) {\n return i;\n }\n\n const chunkOperations =\n argsArrayLen - i > EXECUTION_STEPS &&\n typeof continueCallback === \"function\";\n const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n let steps = 0;\n\n const commonObjs = this.commonObjs;\n const objs = this.objs;\n let fnId;\n\n while (true) {\n if (stepper !== undefined && i === stepper.nextBreakPoint) {\n stepper.breakIt(i, continueCallback);\n return i;\n }\n\n fnId = fnArray[i];\n\n if (fnId !== OPS.dependency) {\n // eslint-disable-next-line prefer-spread\n this[fnId].apply(this, argsArray[i]);\n } else {\n for (const depObjId of argsArray[i]) {\n const objsPool = depObjId.startsWith(\"g_\") ? commonObjs : objs;\n\n // If the promise isn't resolved yet, add the continueCallback\n // to the promise and bail out.\n if (!objsPool.has(depObjId)) {\n objsPool.get(depObjId, continueCallback);\n return i;\n }\n }\n }\n\n i++;\n\n // If the entire operatorList was executed, stop as were done.\n if (i === argsArrayLen) {\n return i;\n }\n\n // If the execution took longer then a certain amount of time and\n // `continueCallback` is specified, interrupt the execution.\n if (chunkOperations && ++steps > EXECUTION_STEPS) {\n if (Date.now() > endTime) {\n continueCallback();\n return i;\n }\n steps = 0;\n }\n\n // If the operatorList isn't executed completely yet OR the execution\n // time was short enough, do another execution round.\n }\n }\n\n #restoreInitialState() {\n // Finishing all opened operations such as SMask group painting.\n while (this.stateStack.length || this.inSMaskMode) {\n this.restore();\n }\n\n this.current.activeSMask = null;\n this.ctx.restore();\n\n if (this.transparentCanvas) {\n this.ctx = this.compositeCtx;\n this.ctx.save();\n this.ctx.setTransform(1, 0, 0, 1, 0, 0); // Avoid apply transform twice\n this.ctx.drawImage(this.transparentCanvas, 0, 0);\n this.ctx.restore();\n this.transparentCanvas = null;\n }\n }\n\n endDrawing() {\n this.#restoreInitialState();\n\n this.cachedCanvases.clear();\n this.cachedPatterns.clear();\n\n for (const cache of this._cachedBitmapsMap.values()) {\n for (const canvas of cache.values()) {\n if (\n typeof HTMLCanvasElement !== \"undefined\" &&\n canvas instanceof HTMLCanvasElement\n ) {\n canvas.width = canvas.height = 0;\n }\n }\n cache.clear();\n }\n this._cachedBitmapsMap.clear();\n this.#drawFilter();\n }\n\n #drawFilter() {\n if (this.pageColors) {\n const hcmFilterId = this.filterFactory.addHCMFilter(\n this.pageColors.foreground,\n this.pageColors.background\n );\n if (hcmFilterId !== \"none\") {\n const savedFilter = this.ctx.filter;\n this.ctx.filter = hcmFilterId;\n this.ctx.drawImage(this.ctx.canvas, 0, 0);\n this.ctx.filter = savedFilter;\n }\n }\n }\n\n _scaleImage(img, inverseTransform) {\n // Vertical or horizontal scaling shall not be more than 2 to not lose the\n // pixels during drawImage operation, painting on the temporary canvas(es)\n // that are twice smaller in size.\n\n // displayWidth and displayHeight are used for VideoFrame.\n const width = img.width ?? img.displayWidth;\n const height = img.height ?? img.displayHeight;\n let widthScale = Math.max(\n Math.hypot(inverseTransform[0], inverseTransform[1]),\n 1\n );\n let heightScale = Math.max(\n Math.hypot(inverseTransform[2], inverseTransform[3]),\n 1\n );\n\n let paintWidth = width,\n paintHeight = height;\n let tmpCanvasId = \"prescale1\";\n let tmpCanvas, tmpCtx;\n while (\n (widthScale > 2 && paintWidth > 1) ||\n (heightScale > 2 && paintHeight > 1)\n ) {\n let newWidth = paintWidth,\n newHeight = paintHeight;\n if (widthScale > 2 && paintWidth > 1) {\n // See bug 1820511 (Windows specific bug).\n // TODO: once the above bug is fixed we could revert to:\n // newWidth = Math.ceil(paintWidth / 2);\n newWidth =\n paintWidth >= 16384\n ? Math.floor(paintWidth / 2) - 1 || 1\n : Math.ceil(paintWidth / 2);\n widthScale /= paintWidth / newWidth;\n }\n if (heightScale > 2 && paintHeight > 1) {\n // TODO: see the comment above.\n newHeight =\n paintHeight >= 16384\n ? Math.floor(paintHeight / 2) - 1 || 1\n : Math.ceil(paintHeight) / 2;\n heightScale /= paintHeight / newHeight;\n }\n tmpCanvas = this.cachedCanvases.getCanvas(\n tmpCanvasId,\n newWidth,\n newHeight\n );\n tmpCtx = tmpCanvas.context;\n tmpCtx.clearRect(0, 0, newWidth, newHeight);\n tmpCtx.drawImage(\n img,\n 0,\n 0,\n paintWidth,\n paintHeight,\n 0,\n 0,\n newWidth,\n newHeight\n );\n img = tmpCanvas.canvas;\n paintWidth = newWidth;\n paintHeight = newHeight;\n tmpCanvasId = tmpCanvasId === \"prescale1\" ? \"prescale2\" : \"prescale1\";\n }\n return {\n img,\n paintWidth,\n paintHeight,\n };\n }\n\n _createMaskCanvas(img) {\n const ctx = this.ctx;\n const { width, height } = img;\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n const currentTransform = getCurrentTransform(ctx);\n\n let cache, cacheKey, scaled, maskCanvas;\n if ((img.bitmap || img.data) && img.count > 1) {\n const mainKey = img.bitmap || img.data.buffer;\n // We're reusing the same image several times, so we can cache it.\n // In case we've a pattern fill we just keep the scaled version of\n // the image.\n // Only the scaling part matters, the translation part is just used\n // to compute offsets (but not when filling patterns see #15573).\n // TODO: handle the case of a pattern fill if it's possible.\n cacheKey = JSON.stringify(\n isPatternFill\n ? currentTransform\n : [currentTransform.slice(0, 4), fillColor]\n );\n\n cache = this._cachedBitmapsMap.get(mainKey);\n if (!cache) {\n cache = new Map();\n this._cachedBitmapsMap.set(mainKey, cache);\n }\n const cachedImage = cache.get(cacheKey);\n if (cachedImage && !isPatternFill) {\n const offsetX = Math.round(\n Math.min(currentTransform[0], currentTransform[2]) +\n currentTransform[4]\n );\n const offsetY = Math.round(\n Math.min(currentTransform[1], currentTransform[3]) +\n currentTransform[5]\n );\n return {\n canvas: cachedImage,\n offsetX,\n offsetY,\n };\n }\n scaled = cachedImage;\n }\n\n if (!scaled) {\n maskCanvas = this.cachedCanvases.getCanvas(\"maskCanvas\", width, height);\n putBinaryImageMask(maskCanvas.context, img);\n }\n\n // Create the mask canvas at the size it will be drawn at and also set\n // its transform to match the current transform so if there are any\n // patterns applied they will be applied relative to the correct\n // transform.\n\n let maskToCanvas = Util.transform(currentTransform, [\n 1 / width,\n 0,\n 0,\n -1 / height,\n 0,\n 0,\n ]);\n maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);\n const minMax = MIN_MAX_INIT.slice();\n Util.axialAlignedBoundingBox([0, 0, width, height], maskToCanvas, minMax);\n const [minX, minY, maxX, maxY] = minMax;\n const drawnWidth = Math.round(maxX - minX) || 1;\n const drawnHeight = Math.round(maxY - minY) || 1;\n const fillCanvas = this.cachedCanvases.getCanvas(\n \"fillCanvas\",\n drawnWidth,\n drawnHeight\n );\n const fillCtx = fillCanvas.context;\n\n // The offset will be the top-left cordinate mask.\n // If objToCanvas is [a,b,c,d,e,f] then:\n // - offsetX = min(a, c) + e\n // - offsetY = min(b, d) + f\n const offsetX = minX;\n const offsetY = minY;\n fillCtx.translate(-offsetX, -offsetY);\n fillCtx.transform(...maskToCanvas);\n\n if (!scaled) {\n // Pre-scale if needed to improve image smoothing.\n scaled = this._scaleImage(\n maskCanvas.canvas,\n getCurrentTransformInverse(fillCtx)\n );\n scaled = scaled.img;\n if (cache && isPatternFill) {\n cache.set(cacheKey, scaled);\n }\n }\n\n fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(\n getCurrentTransform(fillCtx),\n img.interpolate\n );\n\n drawImageAtIntegerCoords(\n fillCtx,\n scaled,\n 0,\n 0,\n scaled.width,\n scaled.height,\n 0,\n 0,\n width,\n height\n );\n fillCtx.globalCompositeOperation = \"source-in\";\n\n const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [\n 1,\n 0,\n 0,\n 1,\n -offsetX,\n -offsetY,\n ]);\n fillCtx.fillStyle = isPatternFill\n ? fillColor.getPattern(ctx, this, inverse, PathType.FILL)\n : fillColor;\n\n fillCtx.fillRect(0, 0, width, height);\n\n if (cache && !isPatternFill) {\n // The fill canvas is put in the cache associated to the mask image\n // so we must remove from the cached canvas: it mustn't be used again.\n this.cachedCanvases.delete(\"fillCanvas\");\n cache.set(cacheKey, fillCanvas.canvas);\n }\n\n // Round the offsets to avoid drawing fractional pixels.\n return {\n canvas: fillCanvas.canvas,\n offsetX: Math.round(offsetX),\n offsetY: Math.round(offsetY),\n };\n }\n\n // Graphics state\n setLineWidth(width) {\n if (width !== this.current.lineWidth) {\n this._cachedScaleForStroking[0] = -1;\n }\n this.current.lineWidth = width;\n this.ctx.lineWidth = width;\n }\n\n setLineCap(style) {\n this.ctx.lineCap = LINE_CAP_STYLES[style];\n }\n\n setLineJoin(style) {\n this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n }\n\n setMiterLimit(limit) {\n this.ctx.miterLimit = limit;\n }\n\n setDash(dashArray, dashPhase) {\n const ctx = this.ctx;\n if (ctx.setLineDash !== undefined) {\n ctx.setLineDash(dashArray);\n ctx.lineDashOffset = dashPhase;\n }\n }\n\n setRenderingIntent(intent) {\n // This operation is ignored since we haven't found a use case for it yet.\n }\n\n setFlatness(flatness) {\n // This operation is ignored since we haven't found a use case for it yet.\n }\n\n setGState(states) {\n for (const [key, value] of states) {\n switch (key) {\n case \"LW\":\n this.setLineWidth(value);\n break;\n case \"LC\":\n this.setLineCap(value);\n break;\n case \"LJ\":\n this.setLineJoin(value);\n break;\n case \"ML\":\n this.setMiterLimit(value);\n break;\n case \"D\":\n this.setDash(value[0], value[1]);\n break;\n case \"RI\":\n this.setRenderingIntent(value);\n break;\n case \"FL\":\n this.setFlatness(value);\n break;\n case \"Font\":\n this.setFont(value[0], value[1]);\n break;\n case \"CA\":\n this.current.strokeAlpha = value;\n break;\n case \"ca\":\n this.ctx.globalAlpha = this.current.fillAlpha = value;\n break;\n case \"BM\":\n this.ctx.globalCompositeOperation = value;\n break;\n case \"SMask\":\n this.current.activeSMask = value ? this.tempSMask : null;\n this.tempSMask = null;\n this.checkSMaskState();\n break;\n case \"TR\":\n this.ctx.filter = this.current.transferMaps =\n this.filterFactory.addFilter(value);\n break;\n }\n }\n }\n\n get inSMaskMode() {\n return !!this.suspendedCtx;\n }\n\n checkSMaskState() {\n const inSMaskMode = this.inSMaskMode;\n if (this.current.activeSMask && !inSMaskMode) {\n this.beginSMaskMode();\n } else if (!this.current.activeSMask && inSMaskMode) {\n this.endSMaskMode();\n }\n // Else, the state is okay and nothing needs to be done.\n }\n\n /**\n * Soft mask mode takes the current main drawing canvas and replaces it with\n * a temporary canvas. Any drawing operations that happen on the temporary\n * canvas need to be composed with the main canvas that was suspended (see\n * `compose()`). The temporary canvas also duplicates many of its operations\n * on the suspended canvas to keep them in sync, so that when the soft mask\n * mode ends any clipping paths or transformations will still be active and in\n * the right order on the canvas' graphics state stack.\n */\n beginSMaskMode() {\n if (this.inSMaskMode) {\n throw new Error(\"beginSMaskMode called while already in smask mode\");\n }\n const drawnWidth = this.ctx.canvas.width;\n const drawnHeight = this.ctx.canvas.height;\n const cacheId = \"smaskGroupAt\" + this.groupLevel;\n const scratchCanvas = this.cachedCanvases.getCanvas(\n cacheId,\n drawnWidth,\n drawnHeight\n );\n this.suspendedCtx = this.ctx;\n const ctx = (this.ctx = scratchCanvas.context);\n ctx.setTransform(this.suspendedCtx.getTransform());\n copyCtxState(this.suspendedCtx, ctx);\n mirrorContextOperations(ctx, this.suspendedCtx);\n\n this.setGState([[\"BM\", \"source-over\"]]);\n }\n\n endSMaskMode() {\n if (!this.inSMaskMode) {\n throw new Error(\"endSMaskMode called while not in smask mode\");\n }\n // The soft mask is done, now restore the suspended canvas as the main\n // drawing canvas.\n this.ctx._removeMirroring();\n copyCtxState(this.ctx, this.suspendedCtx);\n this.ctx = this.suspendedCtx;\n\n this.suspendedCtx = null;\n }\n\n compose(dirtyBox) {\n if (!this.current.activeSMask) {\n return;\n }\n\n if (!dirtyBox) {\n dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];\n } else {\n dirtyBox[0] = Math.floor(dirtyBox[0]);\n dirtyBox[1] = Math.floor(dirtyBox[1]);\n dirtyBox[2] = Math.ceil(dirtyBox[2]);\n dirtyBox[3] = Math.ceil(dirtyBox[3]);\n }\n const smask = this.current.activeSMask;\n const suspendedCtx = this.suspendedCtx;\n\n this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox);\n // Whatever was drawn has been moved to the suspended canvas, now clear it\n // out of the current canvas.\n this.ctx.save();\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n this.ctx.restore();\n }\n\n composeSMask(ctx, smask, layerCtx, layerBox) {\n const layerOffsetX = layerBox[0];\n const layerOffsetY = layerBox[1];\n const layerWidth = layerBox[2] - layerOffsetX;\n const layerHeight = layerBox[3] - layerOffsetY;\n if (layerWidth === 0 || layerHeight === 0) {\n return;\n }\n this.genericComposeSMask(\n smask.context,\n layerCtx,\n layerWidth,\n layerHeight,\n smask.subtype,\n smask.backdrop,\n smask.transferMap,\n layerOffsetX,\n layerOffsetY,\n smask.offsetX,\n smask.offsetY\n );\n ctx.save();\n ctx.globalAlpha = 1;\n ctx.globalCompositeOperation = \"source-over\";\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(layerCtx.canvas, 0, 0);\n ctx.restore();\n }\n\n genericComposeSMask(\n maskCtx,\n layerCtx,\n width,\n height,\n subtype,\n backdrop,\n transferMap,\n layerOffsetX,\n layerOffsetY,\n maskOffsetX,\n maskOffsetY\n ) {\n let maskCanvas = maskCtx.canvas;\n let maskX = layerOffsetX - maskOffsetX;\n let maskY = layerOffsetY - maskOffsetY;\n\n if (backdrop) {\n const backdropRGB = Util.makeHexColor(...backdrop);\n if (\n maskX < 0 ||\n maskY < 0 ||\n maskX + width > maskCanvas.width ||\n maskY + height > maskCanvas.height\n ) {\n const canvas = this.cachedCanvases.getCanvas(\n \"maskExtension\",\n width,\n height\n );\n const ctx = canvas.context;\n ctx.drawImage(maskCanvas, -maskX, -maskY);\n ctx.globalCompositeOperation = \"destination-atop\";\n ctx.fillStyle = backdropRGB;\n ctx.fillRect(0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n\n maskCanvas = canvas.canvas;\n maskX = maskY = 0;\n } else {\n maskCtx.save();\n maskCtx.globalAlpha = 1;\n maskCtx.setTransform(1, 0, 0, 1, 0, 0);\n const clip = new Path2D();\n clip.rect(maskX, maskY, width, height);\n maskCtx.clip(clip);\n maskCtx.globalCompositeOperation = \"destination-atop\";\n maskCtx.fillStyle = backdropRGB;\n maskCtx.fillRect(maskX, maskY, width, height);\n maskCtx.restore();\n }\n }\n\n layerCtx.save();\n layerCtx.globalAlpha = 1;\n layerCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n if (subtype === \"Alpha\" && transferMap) {\n layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap);\n } else if (subtype === \"Luminosity\") {\n layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap);\n }\n\n const clip = new Path2D();\n clip.rect(layerOffsetX, layerOffsetY, width, height);\n layerCtx.clip(clip);\n layerCtx.globalCompositeOperation = \"destination-in\";\n layerCtx.drawImage(\n maskCanvas,\n maskX,\n maskY,\n width,\n height,\n layerOffsetX,\n layerOffsetY,\n width,\n height\n );\n layerCtx.restore();\n }\n\n save() {\n if (this.inSMaskMode) {\n // SMask mode may be turned on/off causing us to lose graphics state.\n // Copy the temporary canvas state to the main(suspended) canvas to keep\n // it in sync.\n copyCtxState(this.ctx, this.suspendedCtx);\n }\n this.ctx.save();\n const old = this.current;\n this.stateStack.push(old);\n this.current = old.clone();\n }\n\n restore() {\n if (this.stateStack.length === 0) {\n if (this.inSMaskMode) {\n this.endSMaskMode();\n }\n return;\n }\n\n this.current = this.stateStack.pop();\n this.ctx.restore();\n if (this.inSMaskMode) {\n // Graphics state is stored on the main(suspended) canvas. Restore its\n // state then copy it over to the temporary canvas.\n copyCtxState(this.suspendedCtx, this.ctx);\n }\n this.checkSMaskState();\n\n // Ensure that the clipping path is reset (fixes issue6413.pdf).\n this.pendingClip = null;\n\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n }\n\n transform(a, b, c, d, e, f) {\n this.ctx.transform(a, b, c, d, e, f);\n\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n }\n\n // Path\n constructPath(op, data, minMax) {\n let [path] = data;\n if (!minMax) {\n // The path is empty, so no need to update the current minMax.\n path ||= data[0] = new Path2D();\n this[op](path);\n return;\n }\n if (!(path instanceof Path2D)) {\n // Using a SVG string is slightly slower than using the following loop.\n const path2d = (data[0] = new Path2D());\n for (let i = 0, ii = path.length; i < ii; ) {\n switch (path[i++]) {\n case DrawOPS.moveTo:\n path2d.moveTo(path[i++], path[i++]);\n break;\n case DrawOPS.lineTo:\n path2d.lineTo(path[i++], path[i++]);\n break;\n case DrawOPS.curveTo:\n path2d.bezierCurveTo(\n path[i++],\n path[i++],\n path[i++],\n path[i++],\n path[i++],\n path[i++]\n );\n break;\n case DrawOPS.closePath:\n path2d.closePath();\n break;\n default:\n warn(`Unrecognized drawing path operator: ${path[i - 1]}`);\n break;\n }\n }\n path = path2d;\n }\n Util.axialAlignedBoundingBox(\n minMax,\n getCurrentTransform(this.ctx),\n this.current.minMax\n );\n this[op](path);\n }\n\n closePath() {\n this.ctx.closePath();\n }\n\n stroke(path, consumePath = true) {\n const ctx = this.ctx;\n const strokeColor = this.current.strokeColor;\n // For stroke we want to temporarily change the global alpha to the\n // stroking alpha.\n ctx.globalAlpha = this.current.strokeAlpha;\n if (this.contentVisible) {\n if (typeof strokeColor === \"object\" && strokeColor?.getPattern) {\n const baseTransform = strokeColor.isModifyingCurrentTransform()\n ? ctx.getTransform()\n : null;\n ctx.save();\n ctx.strokeStyle = strokeColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.STROKE\n );\n if (baseTransform) {\n const newPath = new Path2D();\n newPath.addPath(\n path,\n ctx.getTransform().invertSelf().multiplySelf(baseTransform)\n );\n path = newPath;\n }\n this.rescaleAndStroke(path, /* saveRestore */ false);\n ctx.restore();\n } else {\n this.rescaleAndStroke(path, /* saveRestore */ true);\n }\n }\n if (consumePath) {\n this.consumePath(\n path,\n this.current.getClippedPathBoundingBox(\n PathType.STROKE,\n getCurrentTransform(this.ctx)\n )\n );\n }\n // Restore the global alpha to the fill alpha\n ctx.globalAlpha = this.current.fillAlpha;\n }\n\n closeStroke(path) {\n this.stroke(path);\n }\n\n fill(path, consumePath = true) {\n const ctx = this.ctx;\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n let needRestore = false;\n\n if (isPatternFill) {\n const baseTransform = fillColor.isModifyingCurrentTransform()\n ? ctx.getTransform()\n : null;\n ctx.save();\n ctx.fillStyle = fillColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.FILL\n );\n if (baseTransform) {\n const newPath = new Path2D();\n newPath.addPath(\n path,\n ctx.getTransform().invertSelf().multiplySelf(baseTransform)\n );\n path = newPath;\n }\n needRestore = true;\n }\n\n const intersect = this.current.getClippedPathBoundingBox();\n if (this.contentVisible && intersect !== null) {\n if (this.pendingEOFill) {\n ctx.fill(path, \"evenodd\");\n this.pendingEOFill = false;\n } else {\n ctx.fill(path);\n }\n }\n\n if (needRestore) {\n ctx.restore();\n }\n if (consumePath) {\n this.consumePath(path, intersect);\n }\n }\n\n eoFill(path) {\n this.pendingEOFill = true;\n this.fill(path);\n }\n\n fillStroke(path) {\n this.fill(path, false);\n this.stroke(path, false);\n\n this.consumePath(path);\n }\n\n eoFillStroke(path) {\n this.pendingEOFill = true;\n this.fillStroke(path);\n }\n\n closeFillStroke(path) {\n this.fillStroke(path);\n }\n\n closeEOFillStroke(path) {\n this.pendingEOFill = true;\n this.fillStroke(path);\n }\n\n endPath(path) {\n this.consumePath(path);\n }\n\n rawFillPath(path) {\n this.ctx.fill(path);\n }\n\n // Clipping\n clip() {\n this.pendingClip = NORMAL_CLIP;\n }\n\n eoClip() {\n this.pendingClip = EO_CLIP;\n }\n\n // Text\n beginText() {\n this.current.textMatrix = null;\n this.current.textMatrixScale = 1;\n this.current.x = this.current.lineX = 0;\n this.current.y = this.current.lineY = 0;\n }\n\n endText() {\n const paths = this.pendingTextPaths;\n const ctx = this.ctx;\n if (paths === undefined) {\n return;\n }\n\n const newPath = new Path2D();\n const invTransf = ctx.getTransform().invertSelf();\n for (const { transform, x, y, fontSize, path } of paths) {\n newPath.addPath(\n path,\n new DOMMatrix(transform)\n .preMultiplySelf(invTransf)\n .translate(x, y)\n .scale(fontSize, -fontSize)\n );\n }\n\n ctx.clip(newPath);\n delete this.pendingTextPaths;\n }\n\n setCharSpacing(spacing) {\n this.current.charSpacing = spacing;\n }\n\n setWordSpacing(spacing) {\n this.current.wordSpacing = spacing;\n }\n\n setHScale(scale) {\n this.current.textHScale = scale / 100;\n }\n\n setLeading(leading) {\n this.current.leading = -leading;\n }\n\n setFont(fontRefName, size) {\n const fontObj = this.commonObjs.get(fontRefName);\n const current = this.current;\n\n if (!fontObj) {\n throw new Error(`Can't find font for ${fontRefName}`);\n }\n current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX;\n\n // A valid matrix needs all main diagonal elements to be non-zero\n // This also ensures we bypass FF bugzilla bug #719844.\n if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n warn(\"Invalid font matrix for font \" + fontRefName);\n }\n\n // The spec for Tf (setFont) says that 'size' specifies the font 'scale',\n // and in some docs this can be negative (inverted x-y axes).\n if (size < 0) {\n size = -size;\n current.fontDirection = -1;\n } else {\n current.fontDirection = 1;\n }\n\n this.current.font = fontObj;\n this.current.fontSize = size;\n\n if (fontObj.isType3Font) {\n return; // we don't need ctx.font for Type3 fonts\n }\n\n const name = fontObj.loadedName || \"sans-serif\";\n const typeface =\n fontObj.systemFontInfo?.css || `\"${name}\", ${fontObj.fallbackName}`;\n\n let bold = \"normal\";\n if (fontObj.black) {\n bold = \"900\";\n } else if (fontObj.bold) {\n bold = \"bold\";\n }\n const italic = fontObj.italic ? \"italic\" : \"normal\";\n\n // Some font backends cannot handle fonts below certain size.\n // Keeping the font at minimal size and using the fontSizeScale to change\n // the current transformation matrix before the fillText/strokeText.\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227\n let browserFontSize = size;\n if (size < MIN_FONT_SIZE) {\n browserFontSize = MIN_FONT_SIZE;\n } else if (size > MAX_FONT_SIZE) {\n browserFontSize = MAX_FONT_SIZE;\n }\n this.current.fontSizeScale = size / browserFontSize;\n\n this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;\n }\n\n setTextRenderingMode(mode) {\n this.current.textRenderingMode = mode;\n }\n\n setTextRise(rise) {\n this.current.textRise = rise;\n }\n\n moveText(x, y) {\n this.current.x = this.current.lineX += x;\n this.current.y = this.current.lineY += y;\n }\n\n setLeadingMoveText(x, y) {\n this.setLeading(-y);\n this.moveText(x, y);\n }\n\n setTextMatrix(matrix) {\n const { current } = this;\n current.textMatrix = matrix;\n current.textMatrixScale = Math.hypot(matrix[0], matrix[1]);\n\n current.x = current.lineX = 0;\n current.y = current.lineY = 0;\n }\n\n nextLine() {\n this.moveText(0, this.current.leading);\n }\n\n #getScaledPath(path, currentTransform, transform) {\n const newPath = new Path2D();\n newPath.addPath(\n path,\n new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform)\n );\n return newPath;\n }\n\n paintChar(character, x, y, patternFillTransform, patternStrokeTransform) {\n const ctx = this.ctx;\n const current = this.current;\n const font = current.font;\n const textRenderingMode = current.textRenderingMode;\n const fontSize = current.fontSize / current.fontSizeScale;\n const fillStrokeMode =\n textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n const isAddToPathSet = !!(\n textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG\n );\n const patternFill = current.patternFill && !font.missingFile;\n const patternStroke = current.patternStroke && !font.missingFile;\n\n let path;\n if (\n font.disableFontFace ||\n isAddToPathSet ||\n patternFill ||\n patternStroke\n ) {\n path = font.getPathGenerator(this.commonObjs, character);\n }\n\n if (font.disableFontFace || patternFill || patternStroke) {\n ctx.save();\n ctx.translate(x, y);\n ctx.scale(fontSize, -fontSize);\n let currentTransform;\n if (\n fillStrokeMode === TextRenderingMode.FILL ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n if (patternFillTransform) {\n currentTransform = ctx.getTransform();\n ctx.setTransform(...patternFillTransform);\n ctx.fill(\n this.#getScaledPath(path, currentTransform, patternFillTransform)\n );\n } else {\n ctx.fill(path);\n }\n }\n if (\n fillStrokeMode === TextRenderingMode.STROKE ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n if (patternStrokeTransform) {\n currentTransform ||= ctx.getTransform();\n ctx.setTransform(...patternStrokeTransform);\n const { a, b, c, d } = currentTransform;\n const invPatternTransform = Util.inverseTransform(\n patternStrokeTransform\n );\n const transf = Util.transform(\n [a, b, c, d, 0, 0],\n invPatternTransform\n );\n Util.singularValueDecompose2dScale(transf, XY);\n\n // Cancel the pattern scaling of the line width.\n // If sx and sy are different, unfortunately we can't do anything and\n // we'll have a rendering bug.\n ctx.lineWidth *= Math.max(XY[0], XY[1]) / fontSize;\n ctx.stroke(\n this.#getScaledPath(path, currentTransform, patternStrokeTransform)\n );\n } else {\n ctx.lineWidth /= fontSize;\n ctx.stroke(path);\n }\n }\n ctx.restore();\n } else {\n if (\n fillStrokeMode === TextRenderingMode.FILL ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n ctx.fillText(character, x, y);\n }\n if (\n fillStrokeMode === TextRenderingMode.STROKE ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n ctx.strokeText(character, x, y);\n }\n }\n\n if (isAddToPathSet) {\n const paths = (this.pendingTextPaths ||= []);\n paths.push({\n transform: getCurrentTransform(ctx),\n x,\n y,\n fontSize,\n path,\n });\n }\n }\n\n get isFontSubpixelAAEnabled() {\n // Checks if anti-aliasing is enabled when scaled text is painted.\n // On Windows GDI scaled fonts looks bad.\n const { context: ctx } = this.cachedCanvases.getCanvas(\n \"isFontSubpixelAAEnabled\",\n 10,\n 10\n );\n ctx.scale(1.5, 1);\n ctx.fillText(\"I\", 0, 10);\n const data = ctx.getImageData(0, 0, 10, 10).data;\n let enabled = false;\n for (let i = 3; i < data.length; i += 4) {\n if (data[i] > 0 && data[i] < 255) {\n enabled = true;\n break;\n }\n }\n return shadow(this, \"isFontSubpixelAAEnabled\", enabled);\n }\n\n showText(glyphs) {\n const current = this.current;\n const font = current.font;\n if (font.isType3Font) {\n return this.showType3Text(glyphs);\n }\n\n const fontSize = current.fontSize;\n if (fontSize === 0) {\n return undefined;\n }\n\n const ctx = this.ctx;\n const fontSizeScale = current.fontSizeScale;\n const charSpacing = current.charSpacing;\n const wordSpacing = current.wordSpacing;\n const fontDirection = current.fontDirection;\n const textHScale = current.textHScale * fontDirection;\n const glyphsLength = glyphs.length;\n const vertical = font.vertical;\n const spacingDir = vertical ? 1 : -1;\n const defaultVMetrics = font.defaultVMetrics;\n const widthAdvanceScale = fontSize * current.fontMatrix[0];\n\n const simpleFillText =\n current.textRenderingMode === TextRenderingMode.FILL &&\n !font.disableFontFace &&\n !current.patternFill;\n\n ctx.save();\n if (current.textMatrix) {\n ctx.transform(...current.textMatrix);\n }\n ctx.translate(current.x, current.y + current.textRise);\n\n if (fontDirection > 0) {\n ctx.scale(textHScale, -1);\n } else {\n ctx.scale(textHScale, 1);\n }\n\n let patternFillTransform, patternStrokeTransform;\n if (current.patternFill) {\n ctx.save();\n const pattern = current.fillColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.FILL\n );\n patternFillTransform = getCurrentTransform(ctx);\n ctx.restore();\n ctx.fillStyle = pattern;\n }\n\n if (current.patternStroke) {\n ctx.save();\n const pattern = current.strokeColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.STROKE\n );\n patternStrokeTransform = getCurrentTransform(ctx);\n ctx.restore();\n ctx.strokeStyle = pattern;\n }\n\n let lineWidth = current.lineWidth;\n const scale = current.textMatrixScale;\n if (scale === 0 || lineWidth === 0) {\n const fillStrokeMode =\n current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n if (\n fillStrokeMode === TextRenderingMode.STROKE ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n lineWidth = this.getSinglePixelWidth();\n }\n } else {\n lineWidth /= scale;\n }\n\n if (fontSizeScale !== 1.0) {\n ctx.scale(fontSizeScale, fontSizeScale);\n lineWidth /= fontSizeScale;\n }\n\n ctx.lineWidth = lineWidth;\n\n if (font.isInvalidPDFjsFont) {\n const chars = [];\n let width = 0;\n for (const glyph of glyphs) {\n chars.push(glyph.unicode);\n width += glyph.width;\n }\n ctx.fillText(chars.join(\"\"), 0, 0);\n current.x += width * widthAdvanceScale * textHScale;\n ctx.restore();\n this.compose();\n\n return undefined;\n }\n\n let x = 0,\n i;\n for (i = 0; i < glyphsLength; ++i) {\n const glyph = glyphs[i];\n if (typeof glyph === \"number\") {\n x += (spacingDir * glyph * fontSize) / 1000;\n continue;\n }\n\n let restoreNeeded = false;\n const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n const character = glyph.fontChar;\n const accent = glyph.accent;\n let scaledX, scaledY;\n let width = glyph.width;\n if (vertical) {\n const vmetric = glyph.vmetric || defaultVMetrics;\n const vx =\n -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;\n const vy = vmetric[2] * widthAdvanceScale;\n\n width = vmetric ? -vmetric[0] : width;\n scaledX = vx / fontSizeScale;\n scaledY = (x + vy) / fontSizeScale;\n } else {\n scaledX = x / fontSizeScale;\n scaledY = 0;\n }\n\n if (font.remeasure && width > 0) {\n // Some standard fonts may not have the exact width: rescale per\n // character if measured width is greater than expected glyph width\n // and subpixel-aa is enabled, otherwise just center the glyph.\n const measuredWidth =\n ((ctx.measureText(character).width * 1000) / fontSize) *\n fontSizeScale;\n if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n const characterScaleX = width / measuredWidth;\n restoreNeeded = true;\n ctx.save();\n ctx.scale(characterScaleX, 1);\n scaledX /= characterScaleX;\n } else if (width !== measuredWidth) {\n scaledX +=\n (((width - measuredWidth) / 2000) * fontSize) / fontSizeScale;\n }\n }\n\n // Only attempt to draw the glyph if it is actually in the embedded font\n // file or if there isn't a font file so the fallback font is shown.\n if (this.contentVisible && (glyph.isInFont || font.missingFile)) {\n if (simpleFillText && !accent) {\n // common case\n ctx.fillText(character, scaledX, scaledY);\n } else {\n this.paintChar(\n character,\n scaledX,\n scaledY,\n patternFillTransform,\n patternStrokeTransform\n );\n if (accent) {\n const scaledAccentX =\n scaledX + (fontSize * accent.offset.x) / fontSizeScale;\n const scaledAccentY =\n scaledY - (fontSize * accent.offset.y) / fontSizeScale;\n this.paintChar(\n accent.fontChar,\n scaledAccentX,\n scaledAccentY,\n patternFillTransform,\n patternStrokeTransform\n );\n }\n }\n }\n\n const charWidth = vertical\n ? width * widthAdvanceScale - spacing * fontDirection\n : width * widthAdvanceScale + spacing * fontDirection;\n x += charWidth;\n\n if (restoreNeeded) {\n ctx.restore();\n }\n }\n if (vertical) {\n current.y -= x;\n } else {\n current.x += x * textHScale;\n }\n ctx.restore();\n this.compose();\n\n return undefined;\n }\n\n showType3Text(glyphs) {\n // Type3 fonts - each glyph is a \"mini-PDF\"\n const ctx = this.ctx;\n const current = this.current;\n const font = current.font;\n const fontSize = current.fontSize;\n const fontDirection = current.fontDirection;\n const spacingDir = font.vertical ? 1 : -1;\n const charSpacing = current.charSpacing;\n const wordSpacing = current.wordSpacing;\n const textHScale = current.textHScale * fontDirection;\n const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;\n const glyphsLength = glyphs.length;\n const isTextInvisible =\n current.textRenderingMode === TextRenderingMode.INVISIBLE;\n let i, glyph, width, spacingLength;\n\n if (isTextInvisible || fontSize === 0) {\n return;\n }\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n\n ctx.save();\n if (current.textMatrix) {\n ctx.transform(...current.textMatrix);\n }\n ctx.translate(current.x, current.y + current.textRise);\n\n ctx.scale(textHScale, fontDirection);\n\n for (i = 0; i < glyphsLength; ++i) {\n glyph = glyphs[i];\n if (typeof glyph === \"number\") {\n spacingLength = (spacingDir * glyph * fontSize) / 1000;\n this.ctx.translate(spacingLength, 0);\n current.x += spacingLength * textHScale;\n continue;\n }\n\n const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n const operatorList = font.charProcOperatorList[glyph.operatorListId];\n if (!operatorList) {\n warn(`Type3 character \"${glyph.operatorListId}\" is not available.`);\n } else if (this.contentVisible) {\n this.save();\n ctx.scale(fontSize, fontSize);\n ctx.transform(...fontMatrix);\n this.executeOperatorList(operatorList);\n this.restore();\n }\n\n const p = [glyph.width, 0];\n Util.applyTransform(p, fontMatrix);\n width = p[0] * fontSize + spacing;\n\n ctx.translate(width, 0);\n current.x += width * textHScale;\n }\n ctx.restore();\n }\n\n // Type3 fonts\n setCharWidth(xWidth, yWidth) {\n // We can safely ignore this since the width should be the same\n // as the width in the Widths array.\n }\n\n setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {\n const clip = new Path2D();\n clip.rect(llx, lly, urx - llx, ury - lly);\n this.ctx.clip(clip);\n this.endPath();\n }\n\n // Color\n getColorN_Pattern(IR) {\n let pattern;\n if (IR[0] === \"TilingPattern\") {\n const baseTransform = this.baseTransform || getCurrentTransform(this.ctx);\n const canvasGraphicsFactory = {\n createCanvasGraphics: ctx =>\n new CanvasGraphics(\n ctx,\n this.commonObjs,\n this.objs,\n this.canvasFactory,\n this.filterFactory,\n {\n optionalContentConfig: this.optionalContentConfig,\n markedContentStack: this.markedContentStack,\n }\n ),\n };\n pattern = new TilingPattern(\n IR,\n this.ctx,\n canvasGraphicsFactory,\n baseTransform\n );\n } else {\n pattern = this._getPattern(IR[1], IR[2]);\n }\n return pattern;\n }\n\n setStrokeColorN() {\n this.current.strokeColor = this.getColorN_Pattern(arguments);\n this.current.patternStroke = true;\n }\n\n setFillColorN() {\n this.current.fillColor = this.getColorN_Pattern(arguments);\n this.current.patternFill = true;\n }\n\n setStrokeRGBColor(r, g, b) {\n this.ctx.strokeStyle = this.current.strokeColor = Util.makeHexColor(\n r,\n g,\n b\n );\n this.current.patternStroke = false;\n }\n\n setStrokeTransparent() {\n this.ctx.strokeStyle = this.current.strokeColor = \"transparent\";\n this.current.patternStroke = false;\n }\n\n setFillRGBColor(r, g, b) {\n this.ctx.fillStyle = this.current.fillColor = Util.makeHexColor(r, g, b);\n this.current.patternFill = false;\n }\n\n setFillTransparent() {\n this.ctx.fillStyle = this.current.fillColor = \"transparent\";\n this.current.patternFill = false;\n }\n\n _getPattern(objId, matrix = null) {\n let pattern;\n if (this.cachedPatterns.has(objId)) {\n pattern = this.cachedPatterns.get(objId);\n } else {\n pattern = getShadingPattern(this.getObject(objId));\n this.cachedPatterns.set(objId, pattern);\n }\n if (matrix) {\n pattern.matrix = matrix;\n }\n return pattern;\n }\n\n shadingFill(objId) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n\n this.save();\n const pattern = this._getPattern(objId);\n ctx.fillStyle = pattern.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.SHADING\n );\n\n const inv = getCurrentTransformInverse(ctx);\n if (inv) {\n const { width, height } = ctx.canvas;\n const minMax = MIN_MAX_INIT.slice();\n Util.axialAlignedBoundingBox([0, 0, width, height], inv, minMax);\n const [x0, y0, x1, y1] = minMax;\n\n this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n } else {\n // HACK to draw the gradient onto an infinite rectangle.\n // PDF gradients are drawn across the entire image while\n // Canvas only allows gradients to be drawn in a rectangle\n // The following bug should allow us to remove this.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=664884\n\n this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n }\n\n this.compose(this.current.getClippedPathBoundingBox());\n this.restore();\n }\n\n // Images\n beginInlineImage() {\n unreachable(\"Should not call beginInlineImage\");\n }\n\n beginImageData() {\n unreachable(\"Should not call beginImageData\");\n }\n\n paintFormXObjectBegin(matrix, bbox) {\n if (!this.contentVisible) {\n return;\n }\n this.save();\n this.baseTransformStack.push(this.baseTransform);\n\n if (matrix) {\n this.transform(...matrix);\n }\n this.baseTransform = getCurrentTransform(this.ctx);\n\n if (bbox) {\n Util.axialAlignedBoundingBox(\n bbox,\n this.baseTransform,\n this.current.minMax\n );\n const [x0, y0, x1, y1] = bbox;\n const clip = new Path2D();\n clip.rect(x0, y0, x1 - x0, y1 - y0);\n this.ctx.clip(clip);\n this.endPath();\n }\n }\n\n paintFormXObjectEnd() {\n if (!this.contentVisible) {\n return;\n }\n this.restore();\n this.baseTransform = this.baseTransformStack.pop();\n }\n\n beginGroup(group) {\n if (!this.contentVisible) {\n return;\n }\n\n this.save();\n // If there's an active soft mask we don't want it enabled for the group, so\n // clear it out. The mask and suspended canvas will be restored in endGroup.\n if (this.inSMaskMode) {\n this.endSMaskMode();\n this.current.activeSMask = null;\n }\n\n const currentCtx = this.ctx;\n // TODO non-isolated groups - according to Rik at adobe non-isolated\n // group results aren't usually that different and they even have tools\n // that ignore this setting. Notes from Rik on implementing:\n // - When you encounter an transparency group, create a new canvas with\n // the dimensions of the bbox\n // - copy the content from the previous canvas to the new canvas\n // - draw as usual\n // - remove the backdrop alpha:\n // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha\n // value of your transparency group and 'alphaBackdrop' the alpha of the\n // backdrop\n // - remove background color:\n // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)\n if (!group.isolated) {\n info(\"TODO: Support non-isolated groups.\");\n }\n\n // TODO knockout - supposedly possible with the clever use of compositing\n // modes.\n if (group.knockout) {\n warn(\"Knockout groups not supported.\");\n }\n\n const currentTransform = getCurrentTransform(currentCtx);\n if (group.matrix) {\n currentCtx.transform(...group.matrix);\n }\n if (!group.bbox) {\n throw new Error(\"Bounding box is required.\");\n }\n\n // Based on the current transform figure out how big the bounding box\n // will actually be.\n let bounds = MIN_MAX_INIT.slice();\n Util.axialAlignedBoundingBox(\n group.bbox,\n getCurrentTransform(currentCtx),\n bounds\n );\n\n // Clip the bounding box to the current canvas.\n const canvasBounds = [\n 0,\n 0,\n currentCtx.canvas.width,\n currentCtx.canvas.height,\n ];\n bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n // Use ceil in case we're between sizes so we don't create canvas that is\n // too small and make the canvas at least 1x1 pixels.\n const offsetX = Math.floor(bounds[0]);\n const offsetY = Math.floor(bounds[1]);\n const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n\n this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]);\n\n let cacheId = \"groupAt\" + this.groupLevel;\n if (group.smask) {\n // Using two cache entries is case if masks are used one after another.\n cacheId += \"_smask_\" + (this.smaskCounter++ % 2);\n }\n const scratchCanvas = this.cachedCanvases.getCanvas(\n cacheId,\n drawnWidth,\n drawnHeight\n );\n const groupCtx = scratchCanvas.context;\n\n // Since we created a new canvas that is just the size of the bounding box\n // we have to translate the group ctx.\n groupCtx.translate(-offsetX, -offsetY);\n groupCtx.transform(...currentTransform);\n\n // Apply the bbox to the group context.\n let clip = new Path2D();\n const [x0, y0, x1, y1] = group.bbox;\n clip.rect(x0, y0, x1 - x0, y1 - y0);\n if (group.matrix) {\n const path = new Path2D();\n path.addPath(clip, new DOMMatrix(group.matrix));\n clip = path;\n }\n groupCtx.clip(clip);\n\n if (group.smask) {\n // Saving state and cached mask to be used in setGState.\n this.smaskStack.push({\n canvas: scratchCanvas.canvas,\n context: groupCtx,\n offsetX,\n offsetY,\n subtype: group.smask.subtype,\n backdrop: group.smask.backdrop,\n transferMap: group.smask.transferMap || null,\n startTransformInverse: null, // used during suspend operation\n });\n } else {\n // Setup the current ctx so when the group is popped we draw it at the\n // right location.\n currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n currentCtx.translate(offsetX, offsetY);\n currentCtx.save();\n }\n // The transparency group inherits all off the current graphics state\n // except the blend mode, soft mask, and alpha constants.\n copyCtxState(currentCtx, groupCtx);\n this.ctx = groupCtx;\n this.setGState([\n [\"BM\", \"source-over\"],\n [\"ca\", 1],\n [\"CA\", 1],\n ]);\n this.groupStack.push(currentCtx);\n this.groupLevel++;\n }\n\n endGroup(group) {\n if (!this.contentVisible) {\n return;\n }\n this.groupLevel--;\n const groupCtx = this.ctx;\n const ctx = this.groupStack.pop();\n this.ctx = ctx;\n // Turn off image smoothing to avoid sub pixel interpolation which can\n // look kind of blurry for some pdfs.\n this.ctx.imageSmoothingEnabled = false;\n\n if (group.smask) {\n this.tempSMask = this.smaskStack.pop();\n this.restore();\n } else {\n this.ctx.restore();\n const currentMtx = getCurrentTransform(this.ctx);\n this.restore();\n this.ctx.save();\n this.ctx.setTransform(...currentMtx);\n const dirtyBox = MIN_MAX_INIT.slice();\n Util.axialAlignedBoundingBox(\n [0, 0, groupCtx.canvas.width, groupCtx.canvas.height],\n currentMtx,\n dirtyBox\n );\n this.ctx.drawImage(groupCtx.canvas, 0, 0);\n this.ctx.restore();\n this.compose(dirtyBox);\n }\n }\n\n beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) {\n // The annotations are drawn just after the page content.\n // The page content drawing can potentially have set a transform,\n // a clipping path, whatever...\n // So in order to have something clean, we restore the initial state.\n this.#restoreInitialState();\n resetCtxToDefault(this.ctx);\n\n this.ctx.save();\n this.save();\n\n if (this.baseTransform) {\n this.ctx.setTransform(...this.baseTransform);\n }\n\n if (rect) {\n const width = rect[2] - rect[0];\n const height = rect[3] - rect[1];\n\n if (hasOwnCanvas && this.annotationCanvasMap) {\n transform = transform.slice();\n transform[4] -= rect[0];\n transform[5] -= rect[1];\n\n rect = rect.slice();\n rect[0] = rect[1] = 0;\n rect[2] = width;\n rect[3] = height;\n\n Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx), XY);\n const { viewportScale } = this;\n const canvasWidth = Math.ceil(\n width * this.outputScaleX * viewportScale\n );\n const canvasHeight = Math.ceil(\n height * this.outputScaleY * viewportScale\n );\n\n this.annotationCanvas = this.canvasFactory.create(\n canvasWidth,\n canvasHeight\n );\n const { canvas, context } = this.annotationCanvas;\n this.annotationCanvasMap.set(id, canvas);\n this.annotationCanvas.savedCtx = this.ctx;\n this.ctx = context;\n this.ctx.save();\n this.ctx.setTransform(XY[0], 0, 0, -XY[1], 0, height * XY[1]);\n\n resetCtxToDefault(this.ctx);\n } else {\n resetCtxToDefault(this.ctx);\n\n // Consume a potential path before clipping.\n this.endPath();\n\n const clip = new Path2D();\n clip.rect(rect[0], rect[1], width, height);\n this.ctx.clip(clip);\n }\n }\n\n this.current = new CanvasExtraState(\n this.ctx.canvas.width,\n this.ctx.canvas.height\n );\n\n this.transform(...transform);\n this.transform(...matrix);\n }\n\n endAnnotation() {\n if (this.annotationCanvas) {\n this.ctx.restore();\n this.#drawFilter();\n\n this.ctx = this.annotationCanvas.savedCtx;\n delete this.annotationCanvas.savedCtx;\n delete this.annotationCanvas;\n }\n }\n\n paintImageMaskXObject(img) {\n if (!this.contentVisible) {\n return;\n }\n const count = img.count;\n img = this.getObject(img.data, img);\n img.count = count;\n\n const ctx = this.ctx;\n const mask = this._createMaskCanvas(img);\n const maskCanvas = mask.canvas;\n\n ctx.save();\n // The mask is drawn with the transform applied. Reset the current\n // transform to draw to the identity.\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);\n ctx.restore();\n this.compose();\n }\n\n paintImageMaskXObjectRepeat(\n img,\n scaleX,\n skewX = 0,\n skewY = 0,\n scaleY,\n positions\n ) {\n if (!this.contentVisible) {\n return;\n }\n\n img = this.getObject(img.data, img);\n\n const ctx = this.ctx;\n ctx.save();\n const currentTransform = getCurrentTransform(ctx);\n ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);\n const mask = this._createMaskCanvas(img);\n\n ctx.setTransform(\n 1,\n 0,\n 0,\n 1,\n mask.offsetX - currentTransform[4],\n mask.offsetY - currentTransform[5]\n );\n for (let i = 0, ii = positions.length; i < ii; i += 2) {\n const trans = Util.transform(currentTransform, [\n scaleX,\n skewX,\n skewY,\n scaleY,\n positions[i],\n positions[i + 1],\n ]);\n\n // Here we want to apply the transform at the origin,\n // hence no additional computation is necessary.\n ctx.drawImage(mask.canvas, trans[4], trans[5]);\n }\n ctx.restore();\n this.compose();\n }\n\n paintImageMaskXObjectGroup(images) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n\n for (const image of images) {\n const { data, width, height, transform } = image;\n\n const maskCanvas = this.cachedCanvases.getCanvas(\n \"maskCanvas\",\n width,\n height\n );\n const maskCtx = maskCanvas.context;\n maskCtx.save();\n\n const img = this.getObject(data, image);\n putBinaryImageMask(maskCtx, img);\n\n maskCtx.globalCompositeOperation = \"source-in\";\n\n maskCtx.fillStyle = isPatternFill\n ? fillColor.getPattern(\n maskCtx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.FILL\n )\n : fillColor;\n maskCtx.fillRect(0, 0, width, height);\n\n maskCtx.restore();\n\n ctx.save();\n ctx.transform(...transform);\n ctx.scale(1, -1);\n drawImageAtIntegerCoords(\n ctx,\n maskCanvas.canvas,\n 0,\n 0,\n width,\n height,\n 0,\n -1,\n 1,\n 1\n );\n ctx.restore();\n }\n this.compose();\n }\n\n paintImageXObject(objId) {\n if (!this.contentVisible) {\n return;\n }\n const imgData = this.getObject(objId);\n if (!imgData) {\n warn(\"Dependent image isn't ready yet\");\n return;\n }\n\n this.paintInlineImageXObject(imgData);\n }\n\n paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {\n if (!this.contentVisible) {\n return;\n }\n const imgData = this.getObject(objId);\n if (!imgData) {\n warn(\"Dependent image isn't ready yet\");\n return;\n }\n\n const width = imgData.width;\n const height = imgData.height;\n const map = [];\n for (let i = 0, ii = positions.length; i < ii; i += 2) {\n map.push({\n transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n x: 0,\n y: 0,\n w: width,\n h: height,\n });\n }\n this.paintInlineImageXObjectGroup(imgData, map);\n }\n\n applyTransferMapsToCanvas(ctx) {\n if (this.current.transferMaps !== \"none\") {\n ctx.filter = this.current.transferMaps;\n ctx.drawImage(ctx.canvas, 0, 0);\n ctx.filter = \"none\";\n }\n return ctx.canvas;\n }\n\n applyTransferMapsToBitmap(imgData) {\n if (this.current.transferMaps === \"none\") {\n return imgData.bitmap;\n }\n const { bitmap, width, height } = imgData;\n const tmpCanvas = this.cachedCanvases.getCanvas(\n \"inlineImage\",\n width,\n height\n );\n const tmpCtx = tmpCanvas.context;\n tmpCtx.filter = this.current.transferMaps;\n tmpCtx.drawImage(bitmap, 0, 0);\n tmpCtx.filter = \"none\";\n\n return tmpCanvas.canvas;\n }\n\n paintInlineImageXObject(imgData) {\n if (!this.contentVisible) {\n return;\n }\n const width = imgData.width;\n const height = imgData.height;\n const ctx = this.ctx;\n\n this.save();\n\n // The filter, if any, will be applied in applyTransferMapsToBitmap.\n // It must be applied to the image before rescaling else some artifacts\n // could appear.\n // The final restore will reset it to its value.\n const { filter } = ctx;\n if (filter !== \"none\" && filter !== \"\") {\n ctx.filter = \"none\";\n }\n\n // scale the image to the unit square\n ctx.scale(1 / width, -1 / height);\n\n let imgToPaint;\n if (imgData.bitmap) {\n imgToPaint = this.applyTransferMapsToBitmap(imgData);\n } else if (\n (typeof HTMLElement === \"function\" && imgData instanceof HTMLElement) ||\n !imgData.data\n ) {\n // typeof check is needed due to node.js support, see issue #8489\n imgToPaint = imgData;\n } else {\n const tmpCanvas = this.cachedCanvases.getCanvas(\n \"inlineImage\",\n width,\n height\n );\n const tmpCtx = tmpCanvas.context;\n putBinaryImageData(tmpCtx, imgData);\n imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n }\n\n const scaled = this._scaleImage(\n imgToPaint,\n getCurrentTransformInverse(ctx)\n );\n ctx.imageSmoothingEnabled = getImageSmoothingEnabled(\n getCurrentTransform(ctx),\n imgData.interpolate\n );\n\n drawImageAtIntegerCoords(\n ctx,\n scaled.img,\n 0,\n 0,\n scaled.paintWidth,\n scaled.paintHeight,\n 0,\n -height,\n width,\n height\n );\n this.compose();\n this.restore();\n }\n\n paintInlineImageXObjectGroup(imgData, map) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n let imgToPaint;\n if (imgData.bitmap) {\n imgToPaint = imgData.bitmap;\n } else {\n const w = imgData.width;\n const h = imgData.height;\n\n const tmpCanvas = this.cachedCanvases.getCanvas(\"inlineImage\", w, h);\n const tmpCtx = tmpCanvas.context;\n putBinaryImageData(tmpCtx, imgData);\n imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n }\n\n for (const entry of map) {\n ctx.save();\n ctx.transform(...entry.transform);\n ctx.scale(1, -1);\n drawImageAtIntegerCoords(\n ctx,\n imgToPaint,\n entry.x,\n entry.y,\n entry.w,\n entry.h,\n 0,\n -1,\n 1,\n 1\n );\n ctx.restore();\n }\n this.compose();\n }\n\n paintSolidColorImageMask() {\n if (!this.contentVisible) {\n return;\n }\n this.ctx.fillRect(0, 0, 1, 1);\n this.compose();\n }\n\n // Marked content\n\n markPoint(tag) {\n // TODO Marked content.\n }\n\n markPointProps(tag, properties) {\n // TODO Marked content.\n }\n\n beginMarkedContent(tag) {\n this.markedContentStack.push({\n visible: true,\n });\n }\n\n beginMarkedContentProps(tag, properties) {\n if (tag === \"OC\") {\n this.markedContentStack.push({\n visible: this.optionalContentConfig.isVisible(properties),\n });\n } else {\n this.markedContentStack.push({\n visible: true,\n });\n }\n this.contentVisible = this.isContentVisible();\n }\n\n endMarkedContent() {\n this.markedContentStack.pop();\n this.contentVisible = this.isContentVisible();\n }\n\n // Compatibility\n\n beginCompat() {\n // TODO ignore undefined operators (should we do that anyway?)\n }\n\n endCompat() {\n // TODO stop ignoring undefined operators\n }\n\n // Helper functions\n\n consumePath(path, clipBox) {\n const isEmpty = this.current.isEmptyClip();\n if (this.pendingClip) {\n this.current.updateClipFromPath();\n }\n if (!this.pendingClip) {\n this.compose(clipBox);\n }\n const ctx = this.ctx;\n if (this.pendingClip) {\n if (!isEmpty) {\n if (this.pendingClip === EO_CLIP) {\n ctx.clip(path, \"evenodd\");\n } else {\n ctx.clip(path);\n }\n }\n this.pendingClip = null;\n }\n this.current.startNewPathAndClipBox(this.current.clipBox);\n }\n\n getSinglePixelWidth() {\n if (!this._cachedGetSinglePixelWidth) {\n const m = getCurrentTransform(this.ctx);\n if (m[1] === 0 && m[2] === 0) {\n // Fast path\n this._cachedGetSinglePixelWidth =\n 1 / Math.min(Math.abs(m[0]), Math.abs(m[3]));\n } else {\n const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);\n const normX = Math.hypot(m[0], m[2]);\n const normY = Math.hypot(m[1], m[3]);\n this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet;\n }\n }\n return this._cachedGetSinglePixelWidth;\n }\n\n getScaleForStroking() {\n // A pixel has thicknessX = thicknessY = 1;\n // A transformed pixel is a parallelogram and the thicknesses\n // corresponds to the heights.\n // The goal of this function is to rescale before setting the\n // lineWidth in order to have both thicknesses greater or equal\n // to 1 after transform.\n if (this._cachedScaleForStroking[0] === -1) {\n const { lineWidth } = this.current;\n const { a, b, c, d } = this.ctx.getTransform();\n let scaleX, scaleY;\n\n if (b === 0 && c === 0) {\n // Fast path\n const normX = Math.abs(a);\n const normY = Math.abs(d);\n if (normX === normY) {\n if (lineWidth === 0) {\n scaleX = scaleY = 1 / normX;\n } else {\n const scaledLineWidth = normX * lineWidth;\n scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1;\n }\n } else if (lineWidth === 0) {\n scaleX = 1 / normX;\n scaleY = 1 / normY;\n } else {\n const scaledXLineWidth = normX * lineWidth;\n const scaledYLineWidth = normY * lineWidth;\n scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1;\n scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1;\n }\n } else {\n // A pixel (base (x, y)) is transformed by M into a parallelogram:\n // - its area is |det(M)|;\n // - heightY (orthogonal to Mx) has a length: |det(M)| / norm(Mx);\n // - heightX (orthogonal to My) has a length: |det(M)| / norm(My).\n // heightX and heightY are the thicknesses of the transformed pixel\n // and they must be both greater or equal to 1.\n const absDet = Math.abs(a * d - b * c);\n const normX = Math.hypot(a, b);\n const normY = Math.hypot(c, d);\n if (lineWidth === 0) {\n scaleX = normY / absDet;\n scaleY = normX / absDet;\n } else {\n const baseArea = lineWidth * absDet;\n scaleX = normY > baseArea ? normY / baseArea : 1;\n scaleY = normX > baseArea ? normX / baseArea : 1;\n }\n }\n this._cachedScaleForStroking[0] = scaleX;\n this._cachedScaleForStroking[1] = scaleY;\n }\n return this._cachedScaleForStroking;\n }\n\n // Rescale before stroking in order to have a final lineWidth\n // with both thicknesses greater or equal to 1.\n rescaleAndStroke(path, saveRestore) {\n const {\n ctx,\n current: { lineWidth },\n } = this;\n const [scaleX, scaleY] = this.getScaleForStroking();\n\n if (scaleX === scaleY) {\n ctx.lineWidth = (lineWidth || 1) * scaleX;\n ctx.stroke(path);\n return;\n }\n\n const dashes = ctx.getLineDash();\n if (saveRestore) {\n ctx.save();\n }\n\n ctx.scale(scaleX, scaleY);\n SCALE_MATRIX.a = 1 / scaleX;\n SCALE_MATRIX.d = 1 / scaleY;\n const newPath = new Path2D();\n newPath.addPath(path, SCALE_MATRIX);\n\n // How the dashed line is rendered depends on the current transform...\n // so we added a rescale to handle too thin lines and consequently\n // the way the line is dashed will be modified.\n // If scaleX === scaleY, the dashed lines will be rendered correctly\n // else we'll have some bugs (but only with too thin lines).\n // Here we take the max... why not taking the min... or something else.\n // Anyway, as said it's buggy when scaleX !== scaleY.\n if (dashes.length > 0) {\n const scale = Math.max(scaleX, scaleY);\n ctx.setLineDash(dashes.map(x => x / scale));\n ctx.lineDashOffset /= scale;\n }\n\n ctx.lineWidth = lineWidth || 1;\n ctx.stroke(newPath);\n\n if (saveRestore) {\n ctx.restore();\n }\n }\n\n isContentVisible() {\n for (let i = this.markedContentStack.length - 1; i >= 0; i--) {\n if (!this.markedContentStack[i].visible) {\n return false;\n }\n }\n return true;\n }\n}\n\nfor (const op in OPS) {\n if (CanvasGraphics.prototype[op] !== undefined) {\n CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];\n }\n}\n\nexport { CanvasGraphics };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass GlobalWorkerOptions {\n static #port = null;\n\n static #src = \"\";\n\n /**\n * @type {Worker | null}\n */\n static get workerPort() {\n return this.#port;\n }\n\n /**\n * @param {Worker | null} workerPort - Defines global port for worker process.\n * Overrides the `workerSrc` option.\n */\n static set workerPort(val) {\n if (\n !(typeof Worker !== \"undefined\" && val instanceof Worker) &&\n val !== null\n ) {\n throw new Error(\"Invalid `workerPort` type.\");\n }\n this.#port = val;\n }\n\n /**\n * @type {string}\n */\n static get workerSrc() {\n return this.#src;\n }\n\n /**\n * @param {string} workerSrc - A string containing the path and filename of\n * the worker file.\n *\n * NOTE: The `workerSrc` option should always be set, in order to prevent\n * any issues when using the PDF.js library.\n */\n static set workerSrc(val) {\n if (typeof val !== \"string\") {\n throw new Error(\"Invalid `workerSrc` type.\");\n }\n this.#src = val;\n }\n}\n\nexport { GlobalWorkerOptions };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass Metadata {\n #map;\n\n #data;\n\n constructor({ parsedData, rawData }) {\n this.#map = parsedData;\n this.#data = rawData;\n }\n\n getRaw() {\n return this.#data;\n }\n\n get(name) {\n return this.#map.get(name) ?? null;\n }\n\n [Symbol.iterator]() {\n return this.#map.entries();\n }\n}\n\nexport { Metadata };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n info,\n RenderingIntentFlag,\n unreachable,\n warn,\n} from \"../shared/util.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst INTERNAL = Symbol(\"INTERNAL\");\n\nclass OptionalContentGroup {\n #isDisplay = false;\n\n #isPrint = false;\n\n #userSet = false;\n\n #visible = true;\n\n constructor(renderingIntent, { name, intent, usage, rbGroups }) {\n this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY);\n this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n\n this.name = name;\n this.intent = intent;\n this.usage = usage;\n this.rbGroups = rbGroups;\n }\n\n /**\n * @type {boolean}\n */\n get visible() {\n if (this.#userSet) {\n return this.#visible;\n }\n if (!this.#visible) {\n return false;\n }\n const { print, view } = this.usage;\n\n if (this.#isDisplay) {\n return view?.viewState !== \"OFF\";\n } else if (this.#isPrint) {\n return print?.printState !== \"OFF\";\n }\n return true;\n }\n\n /**\n * @ignore\n */\n _setVisible(internal, visible, userSet = false) {\n if (internal !== INTERNAL) {\n unreachable(\"Internal method `_setVisible` called.\");\n }\n this.#userSet = userSet;\n this.#visible = visible;\n }\n}\n\nclass OptionalContentConfig {\n #cachedGetHash = null;\n\n #groups = new Map();\n\n #initialHash = null;\n\n #order = null;\n\n constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) {\n this.renderingIntent = renderingIntent;\n\n this.name = null;\n this.creator = null;\n\n if (data === null) {\n return;\n }\n this.name = data.name;\n this.creator = data.creator;\n this.#order = data.order;\n for (const group of data.groups) {\n this.#groups.set(\n group.id,\n new OptionalContentGroup(renderingIntent, group)\n );\n }\n\n if (data.baseState === \"OFF\") {\n for (const group of this.#groups.values()) {\n group._setVisible(INTERNAL, false);\n }\n }\n\n for (const on of data.on) {\n this.#groups.get(on)._setVisible(INTERNAL, true);\n }\n\n for (const off of data.off) {\n this.#groups.get(off)._setVisible(INTERNAL, false);\n }\n\n // The following code must always run *last* in the constructor.\n this.#initialHash = this.getHash();\n }\n\n #evaluateVisibilityExpression(array) {\n const length = array.length;\n if (length < 2) {\n return true;\n }\n const operator = array[0];\n for (let i = 1; i < length; i++) {\n const element = array[i];\n let state;\n if (Array.isArray(element)) {\n state = this.#evaluateVisibilityExpression(element);\n } else if (this.#groups.has(element)) {\n state = this.#groups.get(element).visible;\n } else {\n warn(`Optional content group not found: ${element}`);\n return true;\n }\n switch (operator) {\n case \"And\":\n if (!state) {\n return false;\n }\n break;\n case \"Or\":\n if (state) {\n return true;\n }\n break;\n case \"Not\":\n return !state;\n default:\n return true;\n }\n }\n return operator === \"And\";\n }\n\n isVisible(group) {\n if (this.#groups.size === 0) {\n return true;\n }\n if (!group) {\n info(\"Optional content group not defined.\");\n return true;\n }\n if (group.type === \"OCG\") {\n if (!this.#groups.has(group.id)) {\n warn(`Optional content group not found: ${group.id}`);\n return true;\n }\n return this.#groups.get(group.id).visible;\n } else if (group.type === \"OCMD\") {\n // Per the spec, the expression should be preferred if available.\n if (group.expression) {\n return this.#evaluateVisibilityExpression(group.expression);\n }\n if (!group.policy || group.policy === \"AnyOn\") {\n // Default\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (this.#groups.get(id).visible) {\n return true;\n }\n }\n return false;\n } else if (group.policy === \"AllOn\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (!this.#groups.get(id).visible) {\n return false;\n }\n }\n return true;\n } else if (group.policy === \"AnyOff\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (!this.#groups.get(id).visible) {\n return true;\n }\n }\n return false;\n } else if (group.policy === \"AllOff\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (this.#groups.get(id).visible) {\n return false;\n }\n }\n return true;\n }\n warn(`Unknown optional content policy ${group.policy}.`);\n return true;\n }\n warn(`Unknown group type ${group.type}.`);\n return true;\n }\n\n setVisibility(id, visible = true, preserveRB = true) {\n const group = this.#groups.get(id);\n if (!group) {\n warn(`Optional content group not found: ${id}`);\n return;\n }\n\n // If the visibility is about to be set to `true` and the group belongs to\n // any radiobutton groups, hide all other OCGs in these radiobutton groups,\n // provided that radiobutton state relationships are to be preserved.\n if (preserveRB && visible && group.rbGroups.length) {\n for (const rbGroup of group.rbGroups) {\n for (const otherId of rbGroup) {\n if (otherId !== id) {\n this.#groups.get(otherId)?._setVisible(INTERNAL, false, true);\n }\n }\n }\n }\n\n group._setVisible(INTERNAL, !!visible, /* userSet = */ true);\n\n this.#cachedGetHash = null;\n }\n\n setOCGState({ state, preserveRB }) {\n let operator;\n\n for (const elem of state) {\n switch (elem) {\n case \"ON\":\n case \"OFF\":\n case \"Toggle\":\n operator = elem;\n continue;\n }\n\n const group = this.#groups.get(elem);\n if (!group) {\n continue;\n }\n switch (operator) {\n case \"ON\":\n this.setVisibility(elem, true, preserveRB);\n break;\n case \"OFF\":\n this.setVisibility(elem, false, preserveRB);\n break;\n case \"Toggle\":\n this.setVisibility(elem, !group.visible, preserveRB);\n break;\n }\n }\n\n this.#cachedGetHash = null;\n }\n\n get hasInitialVisibility() {\n return this.#initialHash === null || this.getHash() === this.#initialHash;\n }\n\n getOrder() {\n if (!this.#groups.size) {\n return null;\n }\n if (this.#order) {\n return this.#order.slice();\n }\n return [...this.#groups.keys()];\n }\n\n getGroup(id) {\n return this.#groups.get(id) || null;\n }\n\n getHash() {\n if (this.#cachedGetHash !== null) {\n return this.#cachedGetHash;\n }\n const hash = new MurmurHash3_64();\n\n for (const [id, group] of this.#groups) {\n hash.update(`${id}:${group.visible}`);\n }\n return (this.#cachedGetHash = hash.hexdigest());\n }\n\n [Symbol.iterator]() {\n return this.#groups.entries();\n }\n}\n\nexport { OptionalContentConfig };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../interfaces\").IPDFStream} IPDFStream */\n/** @typedef {import(\"../interfaces\").IPDFStreamReader} IPDFStreamReader */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../interfaces\").IPDFStreamRangeReader} IPDFStreamRangeReader */\n\nimport { assert } from \"../shared/util.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\n/** @implements {IPDFStream} */\nclass PDFDataTransportStream {\n constructor(\n pdfDataRangeTransport,\n { disableRange = false, disableStream = false }\n ) {\n assert(\n pdfDataRangeTransport,\n 'PDFDataTransportStream - missing required \"pdfDataRangeTransport\" argument.'\n );\n const { length, initialData, progressiveDone, contentDispositionFilename } =\n pdfDataRangeTransport;\n\n this._queuedChunks = [];\n this._progressiveDone = progressiveDone;\n this._contentDispositionFilename = contentDispositionFilename;\n\n if (initialData?.length > 0) {\n // Prevent any possible issues by only transferring a Uint8Array that\n // completely \"utilizes\" its underlying ArrayBuffer.\n const buffer =\n initialData instanceof Uint8Array &&\n initialData.byteLength === initialData.buffer.byteLength\n ? initialData.buffer\n : new Uint8Array(initialData).buffer;\n this._queuedChunks.push(buffer);\n }\n\n this._pdfDataRangeTransport = pdfDataRangeTransport;\n this._isStreamingSupported = !disableStream;\n this._isRangeSupported = !disableRange;\n this._contentLength = length;\n\n this._fullRequestReader = null;\n this._rangeReaders = [];\n\n pdfDataRangeTransport.addRangeListener((begin, chunk) => {\n this._onReceiveData({ begin, chunk });\n });\n\n pdfDataRangeTransport.addProgressListener((loaded, total) => {\n this._onProgress({ loaded, total });\n });\n\n pdfDataRangeTransport.addProgressiveReadListener(chunk => {\n this._onReceiveData({ chunk });\n });\n\n pdfDataRangeTransport.addProgressiveDoneListener(() => {\n this._onProgressiveDone();\n });\n\n pdfDataRangeTransport.transportReady();\n }\n\n _onReceiveData({ begin, chunk }) {\n // Prevent any possible issues by only transferring a Uint8Array that\n // completely \"utilizes\" its underlying ArrayBuffer.\n const buffer =\n chunk instanceof Uint8Array &&\n chunk.byteLength === chunk.buffer.byteLength\n ? chunk.buffer\n : new Uint8Array(chunk).buffer;\n\n if (begin === undefined) {\n if (this._fullRequestReader) {\n this._fullRequestReader._enqueue(buffer);\n } else {\n this._queuedChunks.push(buffer);\n }\n } else {\n const found = this._rangeReaders.some(function (rangeReader) {\n if (rangeReader._begin !== begin) {\n return false;\n }\n rangeReader._enqueue(buffer);\n return true;\n });\n assert(\n found,\n \"_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.\"\n );\n }\n }\n\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n\n _onProgress(evt) {\n if (evt.total === undefined) {\n // Reporting to first range reader, if it exists.\n this._rangeReaders[0]?.onProgress?.({ loaded: evt.loaded });\n } else {\n this._fullRequestReader?.onProgress?.({\n loaded: evt.loaded,\n total: evt.total,\n });\n }\n }\n\n _onProgressiveDone() {\n this._fullRequestReader?.progressiveDone();\n this._progressiveDone = true;\n }\n\n _removeRangeReader(reader) {\n const i = this._rangeReaders.indexOf(reader);\n if (i >= 0) {\n this._rangeReaders.splice(i, 1);\n }\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFDataTransportStream.getFullReader can only be called once.\"\n );\n const queuedChunks = this._queuedChunks;\n this._queuedChunks = null;\n return new PDFDataTransportStreamReader(\n this,\n queuedChunks,\n this._progressiveDone,\n this._contentDispositionFilename\n );\n }\n\n getRangeReader(begin, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const reader = new PDFDataTransportStreamRangeReader(this, begin, end);\n this._pdfDataRangeTransport.requestDataRange(begin, end);\n this._rangeReaders.push(reader);\n return reader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeReaders.slice(0)) {\n reader.cancel(reason);\n }\n this._pdfDataRangeTransport.abort();\n }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFDataTransportStreamReader {\n constructor(\n stream,\n queuedChunks,\n progressiveDone = false,\n contentDispositionFilename = null\n ) {\n this._stream = stream;\n this._done = progressiveDone || false;\n this._filename = isPdfFile(contentDispositionFilename)\n ? contentDispositionFilename\n : null;\n this._queuedChunks = queuedChunks || [];\n this._loaded = 0;\n for (const chunk of this._queuedChunks) {\n this._loaded += chunk.byteLength;\n }\n this._requests = [];\n this._headersReady = Promise.resolve();\n stream._fullRequestReader = this;\n\n this.onProgress = null;\n }\n\n _enqueue(chunk) {\n if (this._done) {\n return; // Ignore new data.\n }\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({ value: chunk, done: false });\n } else {\n this._queuedChunks.push(chunk);\n }\n this._loaded += chunk.byteLength;\n }\n\n get headersReady() {\n return this._headersReady;\n }\n\n get filename() {\n return this._filename;\n }\n\n get isRangeSupported() {\n return this._stream._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._stream._isStreamingSupported;\n }\n\n get contentLength() {\n return this._stream._contentLength;\n }\n\n async read() {\n if (this._queuedChunks.length > 0) {\n const chunk = this._queuedChunks.shift();\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n }\n\n progressiveDone() {\n if (this._done) {\n return;\n }\n this._done = true;\n }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFDataTransportStreamRangeReader {\n constructor(stream, begin, end) {\n this._stream = stream;\n this._begin = begin;\n this._end = end;\n this._queuedChunk = null;\n this._requests = [];\n this._done = false;\n\n this.onProgress = null;\n }\n\n _enqueue(chunk) {\n if (this._done) {\n return; // ignore new data\n }\n if (this._requests.length === 0) {\n this._queuedChunk = chunk;\n } else {\n const requestsCapability = this._requests.shift();\n requestsCapability.resolve({ value: chunk, done: false });\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n }\n this._done = true;\n this._stream._removeRangeReader(this);\n }\n\n get isStreamingSupported() {\n return false;\n }\n\n async read() {\n if (this._queuedChunk) {\n const chunk = this._queuedChunk;\n this._queuedChunk = null;\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n this._stream._removeRangeReader(this);\n }\n}\n\nexport { PDFDataTransportStream };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToBytes } from \"../shared/util.js\";\n\n// This getFilenameFromContentDispositionHeader function is adapted from\n// https://github.com/Rob--W/open-in-browser/blob/7e2e35a38b8b4e981b11da7b2f01df0149049e92/extension/content-disposition.js\n// with the following changes:\n// - Modified to conform to PDF.js's coding style.\n// - Move return to the end of the function to prevent Babel from dropping the\n// function declarations.\n\n/**\n * Extract file name from the Content-Disposition HTTP response header.\n *\n * @param {string} contentDisposition\n * @returns {string} Filename, if found in the Content-Disposition header.\n */\nfunction getFilenameFromContentDispositionHeader(contentDisposition) {\n let needsEncodingFixup = true;\n\n // filename*=ext-value (\"ext-value\" from RFC 5987, referenced by RFC 6266).\n let tmp = toParamRegExp(\"filename\\\\*\", \"i\").exec(contentDisposition);\n if (tmp) {\n tmp = tmp[1];\n let filename = rfc2616unquote(tmp);\n filename = unescape(filename);\n filename = rfc5987decode(filename);\n filename = rfc2047decode(filename);\n return fixupEncoding(filename);\n }\n\n // Continuations (RFC 2231 section 3, referenced by RFC 5987 section 3.1).\n // filename*n*=part\n // filename*n=part\n tmp = rfc2231getparam(contentDisposition);\n if (tmp) {\n // RFC 2047, section\n const filename = rfc2047decode(tmp);\n return fixupEncoding(filename);\n }\n\n // filename=value (RFC 5987, section 4.1).\n tmp = toParamRegExp(\"filename\", \"i\").exec(contentDisposition);\n if (tmp) {\n tmp = tmp[1];\n let filename = rfc2616unquote(tmp);\n filename = rfc2047decode(filename);\n return fixupEncoding(filename);\n }\n\n // After this line there are only function declarations. We cannot put\n // \"return\" here for readability because babel would then drop the function\n // declarations...\n function toParamRegExp(attributePattern, flags) {\n return new RegExp(\n \"(?:^|;)\\\\s*\" +\n attributePattern +\n \"\\\\s*=\\\\s*\" +\n // Captures: value = token | quoted-string\n // (RFC 2616, section 3.6 and referenced by RFC 6266 4.1)\n \"(\" +\n '[^\";\\\\s][^;\\\\s]*' +\n \"|\" +\n '\"(?:[^\"\\\\\\\\]|\\\\\\\\\"?)+\"?' +\n \")\",\n flags\n );\n }\n function textdecode(encoding, value) {\n if (encoding) {\n if (!/^[\\x00-\\xFF]+$/.test(value)) {\n return value;\n }\n try {\n const decoder = new TextDecoder(encoding, { fatal: true });\n const buffer = stringToBytes(value);\n value = decoder.decode(buffer);\n needsEncodingFixup = false;\n } catch {\n // TextDecoder constructor threw - unrecognized encoding.\n }\n }\n return value;\n }\n function fixupEncoding(value) {\n if (needsEncodingFixup && /[\\x80-\\xff]/.test(value)) {\n // Maybe multi-byte UTF-8.\n value = textdecode(\"utf-8\", value);\n if (needsEncodingFixup) {\n // Try iso-8859-1 encoding.\n value = textdecode(\"iso-8859-1\", value);\n }\n }\n return value;\n }\n function rfc2231getparam(contentDispositionStr) {\n const matches = [];\n let match;\n // Iterate over all filename*n= and filename*n*= with n being an integer\n // of at least zero. Any non-zero number must not start with '0'.\n const iter = toParamRegExp(\"filename\\\\*((?!0\\\\d)\\\\d+)(\\\\*?)\", \"ig\");\n while ((match = iter.exec(contentDispositionStr)) !== null) {\n let [, n, quot, part] = match; // eslint-disable-line prefer-const\n n = parseInt(n, 10);\n if (n in matches) {\n // Ignore anything after the invalid second filename*0.\n if (n === 0) {\n break;\n }\n continue;\n }\n matches[n] = [quot, part];\n }\n const parts = [];\n for (let n = 0; n < matches.length; ++n) {\n if (!(n in matches)) {\n // Numbers must be consecutive. Truncate when there is a hole.\n break;\n }\n let [quot, part] = matches[n]; // eslint-disable-line prefer-const\n part = rfc2616unquote(part);\n if (quot) {\n part = unescape(part);\n if (n === 0) {\n part = rfc5987decode(part);\n }\n }\n parts.push(part);\n }\n return parts.join(\"\");\n }\n function rfc2616unquote(value) {\n if (value.startsWith('\"')) {\n const parts = value.slice(1).split('\\\\\"');\n // Find the first unescaped \" and terminate there.\n for (let i = 0; i < parts.length; ++i) {\n const quotindex = parts[i].indexOf('\"');\n if (quotindex !== -1) {\n parts[i] = parts[i].slice(0, quotindex);\n parts.length = i + 1; // Truncates and stop the iteration.\n }\n parts[i] = parts[i].replaceAll(/\\\\(.)/g, \"$1\");\n }\n value = parts.join('\"');\n }\n return value;\n }\n function rfc5987decode(extvalue) {\n // Decodes \"ext-value\" from RFC 5987.\n const encodingend = extvalue.indexOf(\"'\");\n if (encodingend === -1) {\n // Some servers send \"filename*=\" without encoding 'language' prefix,\n // e.g. in https://github.com/Rob--W/open-in-browser/issues/26\n // Let's accept the value like Firefox (57) (Chrome 62 rejects it).\n return extvalue;\n }\n const encoding = extvalue.slice(0, encodingend);\n const langvalue = extvalue.slice(encodingend + 1);\n // Ignore language (RFC 5987 section 3.2.1, and RFC 6266 section 4.1 ).\n const value = langvalue.replace(/^[^']*'/, \"\");\n return textdecode(encoding, value);\n }\n function rfc2047decode(value) {\n // RFC 2047-decode the result. Firefox tried to drop support for it, but\n // backed out because some servers use it - https://bugzil.la/875615\n // Firefox's condition for decoding is here: https://searchfox.org/mozilla-central/rev/4a590a5a15e35d88a3b23dd6ac3c471cf85b04a8/netwerk/mime/nsMIMEHeaderParamImpl.cpp#742-748\n\n // We are more strict and only recognize RFC 2047-encoding if the value\n // starts with \"=?\", since then it is likely that the full value is\n // RFC 2047-encoded.\n\n // Firefox also decodes words even where RFC 2047 section 5 states:\n // \"An 'encoded-word' MUST NOT appear within a 'quoted-string'.\"\n if (!value.startsWith(\"=?\") || /[\\x00-\\x19\\x80-\\xff]/.test(value)) {\n return value;\n }\n // RFC 2047, section 2.4\n // encoded-word = \"=?\" charset \"?\" encoding \"?\" encoded-text \"?=\"\n // charset = token (but let's restrict to characters that denote a\n // possibly valid encoding).\n // encoding = q or b\n // encoded-text = any printable ASCII character other than ? or space.\n // ... but Firefox permits ? and space.\n return value.replaceAll(\n /=\\?([\\w-]*)\\?([QqBb])\\?((?:[^?]|\\?(?!=))*)\\?=/g,\n function (matches, charset, encoding, text) {\n if (encoding === \"q\" || encoding === \"Q\") {\n // RFC 2047 section 4.2.\n text = text.replaceAll(\"_\", \" \");\n text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) {\n return String.fromCharCode(parseInt(hex, 16));\n });\n return textdecode(charset, text);\n } // else encoding is b or B - base64 (RFC 2047 section 4.1)\n try {\n text = atob(text);\n } catch {}\n return textdecode(charset, text);\n }\n );\n }\n\n return \"\";\n}\n\nexport { getFilenameFromContentDispositionHeader };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, ResponseException } from \"../shared/util.js\";\nimport { getFilenameFromContentDispositionHeader } from \"./content_disposition.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\nfunction createHeaders(isHttp, httpHeaders) {\n const headers = new Headers();\n\n if (!isHttp || !httpHeaders || typeof httpHeaders !== \"object\") {\n return headers;\n }\n for (const key in httpHeaders) {\n const val = httpHeaders[key];\n if (val !== undefined) {\n headers.append(key, val);\n }\n }\n return headers;\n}\n\nfunction getResponseOrigin(url) {\n // Notably, null is distinct from \"null\" string (e.g. from file:-URLs).\n return URL.parse(url)?.origin ?? null;\n}\n\nfunction validateRangeRequestCapabilities({\n responseHeaders,\n isHttp,\n rangeChunkSize,\n disableRange,\n}) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n Number.isInteger(rangeChunkSize) && rangeChunkSize > 0,\n \"rangeChunkSize must be an integer larger than zero.\"\n );\n }\n const returnValues = {\n allowRangeRequests: false,\n suggestedLength: undefined,\n };\n\n const length = parseInt(responseHeaders.get(\"Content-Length\"), 10);\n if (!Number.isInteger(length)) {\n return returnValues;\n }\n\n returnValues.suggestedLength = length;\n\n if (length <= 2 * rangeChunkSize) {\n // The file size is smaller than the size of two chunks, so it does not\n // make any sense to abort the request and retry with a range request.\n return returnValues;\n }\n\n if (disableRange || !isHttp) {\n return returnValues;\n }\n if (responseHeaders.get(\"Accept-Ranges\") !== \"bytes\") {\n return returnValues;\n }\n\n const contentEncoding = responseHeaders.get(\"Content-Encoding\") || \"identity\";\n if (contentEncoding !== \"identity\") {\n return returnValues;\n }\n\n returnValues.allowRangeRequests = true;\n return returnValues;\n}\n\nfunction extractFilenameFromHeader(responseHeaders) {\n const contentDisposition = responseHeaders.get(\"Content-Disposition\");\n if (contentDisposition) {\n let filename = getFilenameFromContentDispositionHeader(contentDisposition);\n if (filename.includes(\"%\")) {\n try {\n filename = decodeURIComponent(filename);\n } catch {}\n }\n if (isPdfFile(filename)) {\n return filename;\n }\n }\n return null;\n}\n\nfunction createResponseError(status, url) {\n return new ResponseException(\n `Unexpected server response (${status}) while retrieving PDF \"${url}\".`,\n status,\n /* missing = */ status === 404 || (status === 0 && url.startsWith(\"file:\"))\n );\n}\n\nfunction validateResponseStatus(status) {\n return status === 200 || status === 206;\n}\n\nexport {\n createHeaders,\n createResponseError,\n extractFilenameFromHeader,\n getResponseOrigin,\n validateRangeRequestCapabilities,\n validateResponseStatus,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AbortException, assert, warn } from \"../shared/util.js\";\nimport {\n createHeaders,\n createResponseError,\n extractFilenameFromHeader,\n getResponseOrigin,\n validateRangeRequestCapabilities,\n validateResponseStatus,\n} from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./fetch_stream.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nfunction createFetchOptions(headers, withCredentials, abortController) {\n return {\n method: \"GET\",\n headers,\n signal: abortController.signal,\n mode: \"cors\",\n credentials: withCredentials ? \"include\" : \"same-origin\",\n redirect: \"follow\",\n };\n}\n\nfunction getArrayBuffer(val) {\n if (val instanceof Uint8Array) {\n return val.buffer;\n }\n if (val instanceof ArrayBuffer) {\n return val;\n }\n warn(`getArrayBuffer - unexpected data format: ${val}`);\n return new Uint8Array(val).buffer;\n}\n\n/** @implements {IPDFStream} */\nclass PDFFetchStream {\n _responseOrigin = null;\n\n constructor(source) {\n this.source = source;\n this.isHttp = /^https?:/i.test(source.url);\n this.headers = createHeaders(this.isHttp, source.httpHeaders);\n\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFFetchStream.getFullReader can only be called once.\"\n );\n this._fullRequestReader = new PDFFetchStreamReader(this);\n return this._fullRequestReader;\n }\n\n getRangeReader(begin, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const reader = new PDFFetchStreamRangeReader(this, begin, end);\n this._rangeRequestReaders.push(reader);\n return reader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFFetchStreamReader {\n constructor(stream) {\n this._stream = stream;\n this._reader = null;\n this._loaded = 0;\n this._filename = null;\n const source = stream.source;\n this._withCredentials = source.withCredentials || false;\n this._contentLength = source.length;\n this._headersCapability = Promise.withResolvers();\n this._disableRange = source.disableRange || false;\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n\n this._abortController = new AbortController();\n this._isStreamingSupported = !source.disableStream;\n this._isRangeSupported = !source.disableRange;\n // Always create a copy of the headers.\n const headers = new Headers(stream.headers);\n\n const url = source.url;\n fetch(\n url,\n createFetchOptions(headers, this._withCredentials, this._abortController)\n )\n .then(response => {\n stream._responseOrigin = getResponseOrigin(response.url);\n\n if (!validateResponseStatus(response.status)) {\n throw createResponseError(response.status, url);\n }\n this._reader = response.body.getReader();\n this._headersCapability.resolve();\n\n const responseHeaders = response.headers;\n\n const { allowRangeRequests, suggestedLength } =\n validateRangeRequestCapabilities({\n responseHeaders,\n isHttp: stream.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange,\n });\n\n this._isRangeSupported = allowRangeRequests;\n // Setting right content length.\n this._contentLength = suggestedLength || this._contentLength;\n\n this._filename = extractFilenameFromHeader(responseHeaders);\n\n // We need to stop reading when range is supported and streaming is\n // disabled.\n if (!this._isStreamingSupported && this._isRangeSupported) {\n this.cancel(new AbortException(\"Streaming is disabled.\"));\n }\n })\n .catch(this._headersCapability.reject);\n\n this.onProgress = null;\n }\n\n get headersReady() {\n return this._headersCapability.promise;\n }\n\n get filename() {\n return this._filename;\n }\n\n get contentLength() {\n return this._contentLength;\n }\n\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._headersCapability.promise;\n const { value, done } = await this._reader.read();\n if (done) {\n return { value, done };\n }\n this._loaded += value.byteLength;\n this.onProgress?.({\n loaded: this._loaded,\n total: this._contentLength,\n });\n\n return { value: getArrayBuffer(value), done: false };\n }\n\n cancel(reason) {\n this._reader?.cancel(reason);\n this._abortController.abort();\n }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFFetchStreamRangeReader {\n constructor(stream, begin, end) {\n this._stream = stream;\n this._reader = null;\n this._loaded = 0;\n const source = stream.source;\n this._withCredentials = source.withCredentials || false;\n this._readCapability = Promise.withResolvers();\n this._isStreamingSupported = !source.disableStream;\n\n this._abortController = new AbortController();\n // Always create a copy of the headers.\n const headers = new Headers(stream.headers);\n headers.append(\"Range\", `bytes=${begin}-${end - 1}`);\n\n const url = source.url;\n fetch(\n url,\n createFetchOptions(headers, this._withCredentials, this._abortController)\n )\n .then(response => {\n const responseOrigin = getResponseOrigin(response.url);\n\n if (responseOrigin !== stream._responseOrigin) {\n throw new Error(\n `Expected range response-origin \"${responseOrigin}\" to match \"${stream._responseOrigin}\".`\n );\n }\n if (!validateResponseStatus(response.status)) {\n throw createResponseError(response.status, url);\n }\n this._readCapability.resolve();\n this._reader = response.body.getReader();\n })\n .catch(this._readCapability.reject);\n\n this.onProgress = null;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._readCapability.promise;\n const { value, done } = await this._reader.read();\n if (done) {\n return { value, done };\n }\n this._loaded += value.byteLength;\n this.onProgress?.({ loaded: this._loaded });\n\n return { value: getArrayBuffer(value), done: false };\n }\n\n cancel(reason) {\n this._reader?.cancel(reason);\n this._abortController.abort();\n }\n}\n\nexport { PDFFetchStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, stringToBytes, warn } from \"../shared/util.js\";\nimport {\n createHeaders,\n createResponseError,\n extractFilenameFromHeader,\n getResponseOrigin,\n validateRangeRequestCapabilities,\n} from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./network.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nconst OK_RESPONSE = 200;\nconst PARTIAL_CONTENT_RESPONSE = 206;\n\nfunction getArrayBuffer(xhr) {\n const data = xhr.response;\n if (typeof data !== \"string\") {\n return data;\n }\n return stringToBytes(data).buffer;\n}\n\nclass NetworkManager {\n _responseOrigin = null;\n\n constructor({ url, httpHeaders, withCredentials }) {\n this.url = url;\n this.isHttp = /^https?:/i.test(url);\n this.headers = createHeaders(this.isHttp, httpHeaders);\n this.withCredentials = withCredentials || false;\n\n this.currXhrId = 0;\n this.pendingRequests = Object.create(null);\n }\n\n request(args) {\n const xhr = new XMLHttpRequest();\n const xhrId = this.currXhrId++;\n const pendingRequest = (this.pendingRequests[xhrId] = { xhr });\n\n xhr.open(\"GET\", this.url);\n xhr.withCredentials = this.withCredentials;\n for (const [key, val] of this.headers) {\n xhr.setRequestHeader(key, val);\n }\n if (this.isHttp && \"begin\" in args && \"end\" in args) {\n xhr.setRequestHeader(\"Range\", `bytes=${args.begin}-${args.end - 1}`);\n pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE;\n } else {\n pendingRequest.expectedStatus = OK_RESPONSE;\n }\n xhr.responseType = \"arraybuffer\";\n\n assert(args.onError, \"Expected `onError` callback to be provided.\");\n xhr.onerror = () => {\n args.onError(xhr.status);\n };\n xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n xhr.onprogress = this.onProgress.bind(this, xhrId);\n\n pendingRequest.onHeadersReceived = args.onHeadersReceived;\n pendingRequest.onDone = args.onDone;\n pendingRequest.onError = args.onError;\n pendingRequest.onProgress = args.onProgress;\n\n xhr.send(null);\n\n return xhrId;\n }\n\n onProgress(xhrId, evt) {\n const pendingRequest = this.pendingRequests[xhrId];\n if (!pendingRequest) {\n return; // Maybe abortRequest was called...\n }\n pendingRequest.onProgress?.(evt);\n }\n\n onStateChange(xhrId, evt) {\n const pendingRequest = this.pendingRequests[xhrId];\n if (!pendingRequest) {\n return; // Maybe abortRequest was called...\n }\n\n const xhr = pendingRequest.xhr;\n if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n pendingRequest.onHeadersReceived();\n delete pendingRequest.onHeadersReceived;\n }\n\n if (xhr.readyState !== 4) {\n return;\n }\n\n if (!(xhrId in this.pendingRequests)) {\n // The XHR request might have been aborted in onHeadersReceived()\n // callback, in which case we should abort request.\n return;\n }\n\n delete this.pendingRequests[xhrId];\n\n // Success status == 0 can be on ftp, file and other protocols.\n if (xhr.status === 0 && this.isHttp) {\n pendingRequest.onError(xhr.status);\n return;\n }\n const xhrStatus = xhr.status || OK_RESPONSE;\n\n // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:\n // \"A server MAY ignore the Range header\". This means it's possible to\n // get a 200 rather than a 206 response from a range request.\n const ok_response_on_range_request =\n xhrStatus === OK_RESPONSE &&\n pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n\n if (\n !ok_response_on_range_request &&\n xhrStatus !== pendingRequest.expectedStatus\n ) {\n pendingRequest.onError(xhr.status);\n return;\n }\n\n const chunk = getArrayBuffer(xhr);\n if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n const rangeHeader = xhr.getResponseHeader(\"Content-Range\");\n const matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n if (matches) {\n pendingRequest.onDone({\n begin: parseInt(matches[1], 10),\n chunk,\n });\n } else {\n warn(`Missing or invalid \"Content-Range\" header.`);\n pendingRequest.onError(0);\n }\n } else if (chunk) {\n pendingRequest.onDone({\n begin: 0,\n chunk,\n });\n } else {\n pendingRequest.onError(xhr.status);\n }\n }\n\n getRequestXhr(xhrId) {\n return this.pendingRequests[xhrId].xhr;\n }\n\n isPendingRequest(xhrId) {\n return xhrId in this.pendingRequests;\n }\n\n abortRequest(xhrId) {\n const xhr = this.pendingRequests[xhrId].xhr;\n delete this.pendingRequests[xhrId];\n xhr.abort();\n }\n}\n\n/** @implements {IPDFStream} */\nclass PDFNetworkStream {\n constructor(source) {\n this._source = source;\n this._manager = new NetworkManager(source);\n this._rangeChunkSize = source.rangeChunkSize;\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n\n _onRangeRequestReaderClosed(reader) {\n const i = this._rangeRequestReaders.indexOf(reader);\n if (i >= 0) {\n this._rangeRequestReaders.splice(i, 1);\n }\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFNetworkStream.getFullReader can only be called once.\"\n );\n this._fullRequestReader = new PDFNetworkStreamFullRequestReader(\n this._manager,\n this._source\n );\n return this._fullRequestReader;\n }\n\n getRangeReader(begin, end) {\n const reader = new PDFNetworkStreamRangeRequestReader(\n this._manager,\n begin,\n end\n );\n reader.onClosed = this._onRangeRequestReaderClosed.bind(this);\n this._rangeRequestReaders.push(reader);\n return reader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFNetworkStreamFullRequestReader {\n constructor(manager, source) {\n this._manager = manager;\n\n this._url = source.url;\n this._fullRequestId = manager.request({\n onHeadersReceived: this._onHeadersReceived.bind(this),\n onDone: this._onDone.bind(this),\n onError: this._onError.bind(this),\n onProgress: this._onProgress.bind(this),\n });\n this._headersCapability = Promise.withResolvers();\n this._disableRange = source.disableRange || false;\n this._contentLength = source.length; // Optional\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n\n this._isStreamingSupported = false;\n this._isRangeSupported = false;\n\n this._cachedChunks = [];\n this._requests = [];\n this._done = false;\n this._storedError = undefined;\n this._filename = null;\n\n this.onProgress = null;\n }\n\n _onHeadersReceived() {\n const fullRequestXhrId = this._fullRequestId;\n const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);\n\n this._manager._responseOrigin = getResponseOrigin(\n fullRequestXhr.responseURL\n );\n\n const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders();\n const responseHeaders = new Headers(\n rawResponseHeaders\n ? rawResponseHeaders\n .trimStart()\n .replace(/[^\\S ]+$/, \"\") // Not `trimEnd`, to keep regular spaces.\n .split(/[\\r\\n]+/)\n .map(x => {\n const [key, ...val] = x.split(\": \");\n return [key, val.join(\": \")];\n })\n : []\n );\n\n const { allowRangeRequests, suggestedLength } =\n validateRangeRequestCapabilities({\n responseHeaders,\n isHttp: this._manager.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange,\n });\n\n if (allowRangeRequests) {\n this._isRangeSupported = true;\n }\n // Setting right content length.\n this._contentLength = suggestedLength || this._contentLength;\n\n this._filename = extractFilenameFromHeader(responseHeaders);\n\n if (this._isRangeSupported) {\n // NOTE: by cancelling the full request, and then issuing range\n // requests, there will be an issue for sites where you can only\n // request the pdf once. However, if this is the case, then the\n // server should not be returning that it can support range requests.\n this._manager.abortRequest(fullRequestXhrId);\n }\n\n this._headersCapability.resolve();\n }\n\n _onDone(data) {\n if (data) {\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({ value: data.chunk, done: false });\n } else {\n this._cachedChunks.push(data.chunk);\n }\n }\n this._done = true;\n if (this._cachedChunks.length > 0) {\n return;\n }\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n }\n\n _onError(status) {\n this._storedError = createResponseError(status, this._url);\n this._headersCapability.reject(this._storedError);\n for (const requestCapability of this._requests) {\n requestCapability.reject(this._storedError);\n }\n this._requests.length = 0;\n this._cachedChunks.length = 0;\n }\n\n _onProgress(evt) {\n this.onProgress?.({\n loaded: evt.loaded,\n total: evt.lengthComputable ? evt.total : this._contentLength,\n });\n }\n\n get filename() {\n return this._filename;\n }\n\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n get contentLength() {\n return this._contentLength;\n }\n\n get headersReady() {\n return this._headersCapability.promise;\n }\n\n async read() {\n await this._headersCapability.promise;\n\n if (this._storedError) {\n throw this._storedError;\n }\n if (this._cachedChunks.length > 0) {\n const chunk = this._cachedChunks.shift();\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n this._headersCapability.reject(reason);\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n if (this._manager.isPendingRequest(this._fullRequestId)) {\n this._manager.abortRequest(this._fullRequestId);\n }\n this._fullRequestReader = null;\n }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFNetworkStreamRangeRequestReader {\n constructor(manager, begin, end) {\n this._manager = manager;\n\n this._url = manager.url;\n this._requestId = manager.request({\n begin,\n end,\n onHeadersReceived: this._onHeadersReceived.bind(this),\n onDone: this._onDone.bind(this),\n onError: this._onError.bind(this),\n onProgress: this._onProgress.bind(this),\n });\n this._requests = [];\n this._queuedChunk = null;\n this._done = false;\n this._storedError = undefined;\n\n this.onProgress = null;\n this.onClosed = null;\n }\n\n _onHeadersReceived() {\n const responseOrigin = getResponseOrigin(\n this._manager.getRequestXhr(this._requestId)?.responseURL\n );\n\n if (responseOrigin !== this._manager._responseOrigin) {\n this._storedError = new Error(\n `Expected range response-origin \"${responseOrigin}\" to match \"${this._manager._responseOrigin}\".`\n );\n this._onError(0);\n }\n }\n\n _close() {\n this.onClosed?.(this);\n }\n\n _onDone(data) {\n const chunk = data.chunk;\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({ value: chunk, done: false });\n } else {\n this._queuedChunk = chunk;\n }\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n this._close();\n }\n\n _onError(status) {\n this._storedError ??= createResponseError(status, this._url);\n for (const requestCapability of this._requests) {\n requestCapability.reject(this._storedError);\n }\n this._requests.length = 0;\n this._queuedChunk = null;\n }\n\n _onProgress(evt) {\n if (!this.isStreamingSupported) {\n this.onProgress?.({ loaded: evt.loaded });\n }\n }\n\n get isStreamingSupported() {\n return false;\n }\n\n async read() {\n if (this._storedError) {\n throw this._storedError;\n }\n if (this._queuedChunk !== null) {\n const chunk = this._queuedChunk;\n this._queuedChunk = null;\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n if (this._manager.isPendingRequest(this._requestId)) {\n this._manager.abortRequest(this._requestId);\n }\n this._close();\n }\n}\n\nexport { PDFNetworkStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\nimport { AbortException, assert } from \"../shared/util.js\";\nimport { createResponseError } from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./node_stream.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nconst urlRegex = /^[a-z][a-z0-9\\-+.]+:/i;\n\nfunction parseUrlOrPath(sourceUrl) {\n if (urlRegex.test(sourceUrl)) {\n return new URL(sourceUrl);\n }\n const url = process.getBuiltinModule(\"url\");\n return new URL(url.pathToFileURL(sourceUrl));\n}\n\nclass PDFNodeStream {\n constructor(source) {\n this.source = source;\n this.url = parseUrlOrPath(source.url);\n assert(\n this.url.protocol === \"file:\",\n \"PDFNodeStream only supports file:// URLs.\"\n );\n\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFNodeStream.getFullReader can only be called once.\"\n );\n this._fullRequestReader = new PDFNodeStreamFsFullReader(this);\n return this._fullRequestReader;\n }\n\n getRangeReader(start, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const rangeReader = new PDFNodeStreamFsRangeReader(this, start, end);\n this._rangeRequestReaders.push(rangeReader);\n return rangeReader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\n\nclass PDFNodeStreamFsFullReader {\n constructor(stream) {\n this._url = stream.url;\n this._done = false;\n this._storedError = null;\n this.onProgress = null;\n const source = stream.source;\n this._contentLength = source.length; // optional\n this._loaded = 0;\n this._filename = null;\n\n this._disableRange = source.disableRange || false;\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n\n this._isStreamingSupported = !source.disableStream;\n this._isRangeSupported = !source.disableRange;\n\n this._readableStream = null;\n this._readCapability = Promise.withResolvers();\n this._headersCapability = Promise.withResolvers();\n\n const fs = process.getBuiltinModule(\"fs\");\n fs.promises.lstat(this._url).then(\n stat => {\n // Setting right content length.\n this._contentLength = stat.size;\n\n this._setReadableStream(fs.createReadStream(this._url));\n this._headersCapability.resolve();\n },\n error => {\n if (error.code === \"ENOENT\") {\n error = createResponseError(/* status = */ 0, this._url.href);\n }\n this._storedError = error;\n this._headersCapability.reject(error);\n }\n );\n }\n\n get headersReady() {\n return this._headersCapability.promise;\n }\n\n get filename() {\n return this._filename;\n }\n\n get contentLength() {\n return this._contentLength;\n }\n\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._readCapability.promise;\n if (this._done) {\n return { value: undefined, done: true };\n }\n if (this._storedError) {\n throw this._storedError;\n }\n\n const chunk = this._readableStream.read();\n if (chunk === null) {\n this._readCapability = Promise.withResolvers();\n return this.read();\n }\n this._loaded += chunk.length;\n this.onProgress?.({\n loaded: this._loaded,\n total: this._contentLength,\n });\n\n // Ensure that `read()` method returns ArrayBuffer.\n const buffer = new Uint8Array(chunk).buffer;\n return { value: buffer, done: false };\n }\n\n cancel(reason) {\n // Call `this._error()` method when cancel is called\n // before _readableStream is set.\n if (!this._readableStream) {\n this._error(reason);\n return;\n }\n this._readableStream.destroy(reason);\n }\n\n _error(reason) {\n this._storedError = reason;\n this._readCapability.resolve();\n }\n\n _setReadableStream(readableStream) {\n this._readableStream = readableStream;\n readableStream.on(\"readable\", () => {\n this._readCapability.resolve();\n });\n\n readableStream.on(\"end\", () => {\n // Destroy readable to minimize resource usage.\n readableStream.destroy();\n this._done = true;\n this._readCapability.resolve();\n });\n\n readableStream.on(\"error\", reason => {\n this._error(reason);\n });\n\n // We need to stop reading when range is supported and streaming is\n // disabled.\n if (!this._isStreamingSupported && this._isRangeSupported) {\n this._error(new AbortException(\"streaming is disabled\"));\n }\n\n // Destroy ReadableStream if already in errored state.\n if (this._storedError) {\n this._readableStream.destroy(this._storedError);\n }\n }\n}\n\nclass PDFNodeStreamFsRangeReader {\n constructor(stream, start, end) {\n this._url = stream.url;\n this._done = false;\n this._storedError = null;\n this.onProgress = null;\n this._loaded = 0;\n this._readableStream = null;\n this._readCapability = Promise.withResolvers();\n const source = stream.source;\n this._isStreamingSupported = !source.disableStream;\n\n const fs = process.getBuiltinModule(\"fs\");\n this._setReadableStream(\n fs.createReadStream(this._url, { start, end: end - 1 })\n );\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._readCapability.promise;\n if (this._done) {\n return { value: undefined, done: true };\n }\n if (this._storedError) {\n throw this._storedError;\n }\n\n const chunk = this._readableStream.read();\n if (chunk === null) {\n this._readCapability = Promise.withResolvers();\n return this.read();\n }\n this._loaded += chunk.length;\n this.onProgress?.({ loaded: this._loaded });\n\n // Ensure that `read()` method returns ArrayBuffer.\n const buffer = new Uint8Array(chunk).buffer;\n return { value: buffer, done: false };\n }\n\n cancel(reason) {\n // Call `this._error()` method when cancel is called\n // before _readableStream is set.\n if (!this._readableStream) {\n this._error(reason);\n return;\n }\n this._readableStream.destroy(reason);\n }\n\n _error(reason) {\n this._storedError = reason;\n this._readCapability.resolve();\n }\n\n _setReadableStream(readableStream) {\n this._readableStream = readableStream;\n readableStream.on(\"readable\", () => {\n this._readCapability.resolve();\n });\n\n readableStream.on(\"end\", () => {\n // Destroy readableStream to minimize resource usage.\n readableStream.destroy();\n this._done = true;\n this._readCapability.resolve();\n });\n\n readableStream.on(\"error\", reason => {\n this._error(reason);\n });\n\n // Destroy readableStream if already in errored state.\n if (this._storedError) {\n this._readableStream.destroy(this._storedError);\n }\n }\n}\n\nexport { PDFNodeStream };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./display_utils\").PageViewport} PageViewport */\n/** @typedef {import(\"./api\").TextContent} TextContent */\n\nimport {\n AbortException,\n FeatureTest,\n shadow,\n Util,\n warn,\n} from \"../shared/util.js\";\nimport { OutputScale, setLayerDimensions } from \"./display_utils.js\";\n\n/**\n * @typedef {Object} TextLayerParameters\n * @property {ReadableStream | TextContent} textContentSource - Text content to\n * render, i.e. the value returned by the page's `streamTextContent` or\n * `getTextContent` method.\n * @property {HTMLElement} container - The DOM node that will contain the text\n * runs.\n * @property {PageViewport} viewport - The target viewport to properly layout\n * the text runs.\n */\n\n/**\n * @typedef {Object} TextLayerUpdateParameters\n * @property {PageViewport} viewport - The target viewport to properly layout\n * the text runs.\n * @property {function} [onBefore] - Callback invoked before the textLayer is\n * updated in the DOM.\n */\n\nconst MAX_TEXT_DIVS_TO_RENDER = 100000;\nconst DEFAULT_FONT_SIZE = 30;\n\nclass TextLayer {\n #capability = Promise.withResolvers();\n\n #container = null;\n\n #disableProcessItems = false;\n\n #fontInspectorEnabled = !!globalThis.FontInspector?.enabled;\n\n #lang = null;\n\n #layoutTextParams = null;\n\n #pageHeight = 0;\n\n #pageWidth = 0;\n\n #reader = null;\n\n #rootContainer = null;\n\n #rotation = 0;\n\n #scale = 0;\n\n #styleCache = Object.create(null);\n\n #textContentItemsStr = [];\n\n #textContentSource = null;\n\n #textDivs = [];\n\n #textDivProperties = new WeakMap();\n\n #transform = null;\n\n static #ascentCache = new Map();\n\n static #canvasContexts = new Map();\n\n static #canvasCtxFonts = new WeakMap();\n\n static #minFontSize = null;\n\n static #pendingTextLayers = new Set();\n\n /**\n * @param {TextLayerParameters} options\n */\n constructor({ textContentSource, container, viewport }) {\n if (textContentSource instanceof ReadableStream) {\n this.#textContentSource = textContentSource;\n } else if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n typeof textContentSource === \"object\"\n ) {\n this.#textContentSource = new ReadableStream({\n start(controller) {\n controller.enqueue(textContentSource);\n controller.close();\n },\n });\n } else {\n throw new Error('No \"textContentSource\" parameter specified.');\n }\n this.#container = this.#rootContainer = container;\n\n this.#scale = viewport.scale * OutputScale.pixelRatio;\n this.#rotation = viewport.rotation;\n this.#layoutTextParams = {\n div: null,\n properties: null,\n ctx: null,\n };\n const { pageWidth, pageHeight, pageX, pageY } = viewport.rawDims;\n this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight];\n this.#pageWidth = pageWidth;\n this.#pageHeight = pageHeight;\n\n TextLayer.#ensureMinFontSizeComputed();\n\n setLayerDimensions(container, viewport);\n\n // Always clean-up the temporary canvas once rendering is no longer pending.\n this.#capability.promise\n .finally(() => {\n TextLayer.#pendingTextLayers.delete(this);\n this.#layoutTextParams = null;\n this.#styleCache = null;\n })\n .catch(() => {\n // Avoid \"Uncaught promise\" messages in the console.\n });\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // For testing purposes.\n Object.defineProperty(this, \"pageWidth\", {\n get() {\n return this.#pageWidth;\n },\n });\n Object.defineProperty(this, \"pageHeight\", {\n get() {\n return this.#pageHeight;\n },\n });\n }\n }\n\n static get fontFamilyMap() {\n const { isWindows, isFirefox } = FeatureTest.platform;\n return shadow(\n this,\n \"fontFamilyMap\",\n new Map([\n [\n \"sans-serif\",\n `${isWindows && isFirefox ? \"Calibri, \" : \"\"}sans-serif`,\n ],\n [\n \"monospace\",\n `${isWindows && isFirefox ? \"Lucida Console, \" : \"\"}monospace`,\n ],\n ])\n );\n }\n\n /**\n * Render the textLayer.\n * @returns {Promise}\n */\n render() {\n const pump = () => {\n this.#reader.read().then(({ value, done }) => {\n if (done) {\n this.#capability.resolve();\n return;\n }\n this.#lang ??= value.lang;\n Object.assign(this.#styleCache, value.styles);\n this.#processItems(value.items);\n pump();\n }, this.#capability.reject);\n };\n this.#reader = this.#textContentSource.getReader();\n TextLayer.#pendingTextLayers.add(this);\n pump();\n\n return this.#capability.promise;\n }\n\n /**\n * Update a previously rendered textLayer, if necessary.\n * @param {TextLayerUpdateParameters} options\n * @returns {undefined}\n */\n update({ viewport, onBefore = null }) {\n const scale = viewport.scale * OutputScale.pixelRatio;\n const rotation = viewport.rotation;\n\n if (rotation !== this.#rotation) {\n onBefore?.();\n this.#rotation = rotation;\n setLayerDimensions(this.#rootContainer, { rotation });\n }\n\n if (scale !== this.#scale) {\n onBefore?.();\n this.#scale = scale;\n const params = {\n div: null,\n properties: null,\n ctx: TextLayer.#getCtx(this.#lang),\n };\n for (const div of this.#textDivs) {\n params.properties = this.#textDivProperties.get(div);\n params.div = div;\n this.#layout(params);\n }\n }\n }\n\n /**\n * Cancel rendering of the textLayer.\n * @returns {undefined}\n */\n cancel() {\n const abortEx = new AbortException(\"TextLayer task cancelled.\");\n\n this.#reader?.cancel(abortEx).catch(() => {\n // Avoid \"Uncaught promise\" messages in the console.\n });\n this.#reader = null;\n\n this.#capability.reject(abortEx);\n }\n\n /**\n * @type {Array} HTML elements that correspond to the text items\n * of the textContent input.\n * This is output and will initially be set to an empty array.\n */\n get textDivs() {\n return this.#textDivs;\n }\n\n /**\n * @type {Array} Strings that correspond to the `str` property of\n * the text items of the textContent input.\n * This is output and will initially be set to an empty array\n */\n get textContentItemsStr() {\n return this.#textContentItemsStr;\n }\n\n #processItems(items) {\n if (this.#disableProcessItems) {\n return;\n }\n this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang);\n\n const textDivs = this.#textDivs,\n textContentItemsStr = this.#textContentItemsStr;\n\n for (const item of items) {\n // No point in rendering many divs as it would make the browser\n // unusable even after the divs are rendered.\n if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) {\n warn(\"Ignoring additional textDivs for performance reasons.\");\n\n this.#disableProcessItems = true; // Avoid multiple warnings for one page.\n return;\n }\n\n if (item.str === undefined) {\n if (\n item.type === \"beginMarkedContentProps\" ||\n item.type === \"beginMarkedContent\"\n ) {\n const parent = this.#container;\n this.#container = document.createElement(\"span\");\n this.#container.classList.add(\"markedContent\");\n if (item.id !== null) {\n this.#container.setAttribute(\"id\", `${item.id}`);\n }\n parent.append(this.#container);\n } else if (item.type === \"endMarkedContent\") {\n this.#container = this.#container.parentNode;\n }\n continue;\n }\n textContentItemsStr.push(item.str);\n this.#appendText(item);\n }\n }\n\n #appendText(geom) {\n // Initialize all used properties to keep the caches monomorphic.\n const textDiv = document.createElement(\"span\");\n const textDivProperties = {\n angle: 0,\n canvasWidth: 0,\n hasText: geom.str !== \"\",\n hasEOL: geom.hasEOL,\n fontSize: 0,\n };\n this.#textDivs.push(textDiv);\n\n const tx = Util.transform(this.#transform, geom.transform);\n let angle = Math.atan2(tx[1], tx[0]);\n const style = this.#styleCache[geom.fontName];\n if (style.vertical) {\n angle += Math.PI / 2;\n }\n\n let fontFamily =\n (this.#fontInspectorEnabled && style.fontSubstitution) ||\n style.fontFamily;\n\n // Workaround for bug 1922063.\n fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily;\n const fontHeight = Math.hypot(tx[2], tx[3]);\n const fontAscent =\n fontHeight * TextLayer.#getAscent(fontFamily, style, this.#lang);\n\n let left, top;\n if (angle === 0) {\n left = tx[4];\n top = tx[5] - fontAscent;\n } else {\n left = tx[4] + fontAscent * Math.sin(angle);\n top = tx[5] - fontAscent * Math.cos(angle);\n }\n\n const scaleFactorStr = \"calc(var(--total-scale-factor) *\";\n const divStyle = textDiv.style;\n // Setting the style properties individually, rather than all at once,\n // should be OK since the `textDiv` isn't appended to the document yet.\n if (this.#container === this.#rootContainer) {\n divStyle.left = `${((100 * left) / this.#pageWidth).toFixed(2)}%`;\n divStyle.top = `${((100 * top) / this.#pageHeight).toFixed(2)}%`;\n } else {\n // We're in a marked content span, hence we can't use percents.\n divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`;\n divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`;\n }\n // We multiply the font size by #minFontSize, and then #layout will\n // scale the element by 1/#minFontSize. This allows us to effectively\n // ignore the minimum font size enforced by the browser, so that the text\n // layer s can always match the size of the text in the canvas.\n divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`;\n divStyle.fontFamily = fontFamily;\n\n textDivProperties.fontSize = fontHeight;\n\n // Keeps screen readers from pausing on every new text span.\n textDiv.setAttribute(\"role\", \"presentation\");\n\n textDiv.textContent = geom.str;\n // geom.dir may be 'ttb' for vertical texts.\n textDiv.dir = geom.dir;\n\n // `fontName` is only used by the FontInspector, and we only use `dataset`\n // here to make the font name available in the debugger.\n if (this.#fontInspectorEnabled) {\n textDiv.dataset.fontName =\n style.fontSubstitutionLoadedName || geom.fontName;\n }\n if (angle !== 0) {\n textDivProperties.angle = angle * (180 / Math.PI);\n }\n // We don't bother scaling single-char text divs, because it has very\n // little effect on text highlighting. This makes scrolling on docs with\n // lots of such divs a lot faster.\n let shouldScaleText = false;\n if (geom.str.length > 1) {\n shouldScaleText = true;\n } else if (geom.str !== \" \" && geom.transform[0] !== geom.transform[3]) {\n const absScaleX = Math.abs(geom.transform[0]),\n absScaleY = Math.abs(geom.transform[3]);\n // When the horizontal/vertical scaling differs significantly, also scale\n // even single-char text to improve highlighting (fixes issue11713.pdf).\n if (\n absScaleX !== absScaleY &&\n Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5\n ) {\n shouldScaleText = true;\n }\n }\n if (shouldScaleText) {\n textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width;\n }\n this.#textDivProperties.set(textDiv, textDivProperties);\n\n // Finally, layout and append the text to the DOM.\n this.#layoutTextParams.div = textDiv;\n this.#layoutTextParams.properties = textDivProperties;\n this.#layout(this.#layoutTextParams);\n\n if (textDivProperties.hasText) {\n this.#container.append(textDiv);\n }\n if (textDivProperties.hasEOL) {\n const br = document.createElement(\"br\");\n br.setAttribute(\"role\", \"presentation\");\n this.#container.append(br);\n }\n }\n\n #layout(params) {\n const { div, properties, ctx } = params;\n const { style } = div;\n\n let transform = \"\";\n if (TextLayer.#minFontSize > 1) {\n transform = `scale(${1 / TextLayer.#minFontSize})`;\n }\n\n if (properties.canvasWidth !== 0 && properties.hasText) {\n const { fontFamily } = style;\n const { canvasWidth, fontSize } = properties;\n\n TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily);\n // Only measure the width for multi-char text divs, see `appendText`.\n const { width } = ctx.measureText(div.textContent);\n\n if (width > 0) {\n transform = `scaleX(${(canvasWidth * this.#scale) / width}) ${transform}`;\n }\n }\n if (properties.angle !== 0) {\n transform = `rotate(${properties.angle}deg) ${transform}`;\n }\n if (transform.length > 0) {\n style.transform = transform;\n }\n }\n\n /**\n * Clean-up global textLayer data.\n * @returns {undefined}\n */\n static cleanup() {\n if (this.#pendingTextLayers.size > 0) {\n return;\n }\n this.#ascentCache.clear();\n\n for (const { canvas } of this.#canvasContexts.values()) {\n canvas.remove();\n }\n this.#canvasContexts.clear();\n }\n\n static #getCtx(lang = null) {\n let ctx = this.#canvasContexts.get((lang ||= \"\"));\n if (!ctx) {\n // We don't use an OffscreenCanvas here because we use serif/sans serif\n // fonts with it and they depends on the locale.\n // In Firefox, the element get a lang attribute that depends on\n // what Fluent returns for the locale and the OffscreenCanvas uses\n // the OS locale.\n // Those two locales can be different and consequently the used fonts will\n // be different (see bug 1869001).\n // Ideally, we should use in the text layer the fonts we've in the pdf (or\n // their replacements when they aren't embedded) and then we can use an\n // OffscreenCanvas.\n const canvas = document.createElement(\"canvas\");\n canvas.className = \"hiddenCanvasElement\";\n canvas.lang = lang;\n document.body.append(canvas);\n ctx = canvas.getContext(\"2d\", {\n alpha: false,\n willReadFrequently: true,\n });\n this.#canvasContexts.set(lang, ctx);\n\n // Also, initialize state for the `#ensureCtxFont` method.\n this.#canvasCtxFonts.set(ctx, { size: 0, family: \"\" });\n }\n return ctx;\n }\n\n static #ensureCtxFont(ctx, size, family) {\n const cached = this.#canvasCtxFonts.get(ctx);\n if (size === cached.size && family === cached.family) {\n return; // The font is already set.\n }\n ctx.font = `${size}px ${family}`;\n cached.size = size;\n cached.family = family;\n }\n\n /**\n * Compute the minimum font size enforced by the browser.\n */\n static #ensureMinFontSizeComputed() {\n if (this.#minFontSize !== null) {\n return;\n }\n const div = document.createElement(\"div\");\n div.style.opacity = 0;\n div.style.lineHeight = 1;\n div.style.fontSize = \"1px\";\n div.style.position = \"absolute\";\n div.textContent = \"X\";\n document.body.append(div);\n // In `display:block` elements contain a single line of text,\n // the height matches the line height (which, when set to 1,\n // matches the actual font size).\n this.#minFontSize = div.getBoundingClientRect().height;\n div.remove();\n }\n\n static #getAscent(fontFamily, style, lang) {\n const cachedAscent = this.#ascentCache.get(fontFamily);\n if (cachedAscent) {\n return cachedAscent;\n }\n const ctx = this.#getCtx(lang);\n\n ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE;\n this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily);\n const metrics = ctx.measureText(\"\");\n\n const ascent = metrics.fontBoundingBoxAscent;\n const descent = Math.abs(metrics.fontBoundingBoxDescent);\n\n ctx.canvas.width = ctx.canvas.height = 0;\n let ratio = 0.8; // DEFAULT_FONT_ASCENT\n\n if (ascent) {\n ratio = ascent / (ascent + descent);\n } else {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n FeatureTest.platform.isFirefox\n ) {\n warn(\n \"Enable the `dom.textMetrics.fontBoundingBox.enabled` preference \" +\n \"in `about:config` to improve TextLayer rendering.\"\n );\n }\n if (style.ascent) {\n ratio = style.ascent;\n } else if (style.descent) {\n ratio = 1 + style.descent;\n }\n }\n\n this.#ascentCache.set(fontFamily, ratio);\n return ratio;\n }\n}\n\nexport { TextLayer };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./api\").TextContent} TextContent */\n\nclass XfaText {\n /**\n * Walk an XFA tree and create an array of text nodes that is compatible\n * with a regular PDFs TextContent. Currently, only TextItem.str is supported,\n * all other fields and styles haven't been implemented.\n *\n * @param {Object} xfa - An XFA fake DOM object.\n *\n * @returns {TextContent}\n */\n static textContent(xfa) {\n const items = [];\n const output = {\n items,\n styles: Object.create(null),\n };\n function walk(node) {\n if (!node) {\n return;\n }\n let str = null;\n const name = node.name;\n if (name === \"#text\") {\n str = node.value;\n } else if (!XfaText.shouldBuildText(name)) {\n return;\n } else if (node?.attributes?.textContent) {\n str = node.attributes.textContent;\n } else if (node.value) {\n str = node.value;\n }\n if (str !== null) {\n items.push({\n str,\n });\n }\n if (!node.children) {\n return;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n walk(xfa);\n return output;\n }\n\n /**\n * @param {string} name - DOM node name. (lower case)\n *\n * @returns {boolean} true if the DOM node should have a corresponding text\n * node.\n */\n static shouldBuildText(name) {\n return !(\n name === \"textarea\" ||\n name === \"input\" ||\n name === \"option\" ||\n name === \"select\"\n );\n }\n}\n\nexport { XfaText };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @module pdfjsLib\n */\n\nimport {\n _isValidExplicitDest,\n AbortException,\n AnnotationMode,\n assert,\n FeatureTest,\n getVerbosityLevel,\n info,\n isNodeJS,\n RenderingIntentFlag,\n setVerbosityLevel,\n shadow,\n stringToBytes,\n unreachable,\n warn,\n} from \"../shared/util.js\";\nimport {\n AnnotationStorage,\n PrintAnnotationStorage,\n SerializableEmpty,\n} from \"./annotation_storage.js\";\nimport { FontFaceObject, FontLoader } from \"./font_loader.js\";\nimport {\n isDataScheme,\n isValidFetchUrl,\n PageViewport,\n RenderingCancelledException,\n StatTimer,\n} from \"./display_utils.js\";\nimport { MessageHandler, wrapReason } from \"../shared/message_handler.js\";\nimport {\n NodeCanvasFactory,\n NodeCMapReaderFactory,\n NodeFilterFactory,\n NodeStandardFontDataFactory,\n NodeWasmFactory,\n} from \"display-node_utils\";\nimport { CanvasGraphics } from \"./canvas.js\";\nimport { DOMCanvasFactory } from \"./canvas_factory.js\";\nimport { DOMCMapReaderFactory } from \"display-cmap_reader_factory\";\nimport { DOMFilterFactory } from \"./filter_factory.js\";\nimport { DOMStandardFontDataFactory } from \"display-standard_fontdata_factory\";\nimport { DOMWasmFactory } from \"display-wasm_factory\";\nimport { GlobalWorkerOptions } from \"./worker_options.js\";\nimport { Metadata } from \"./metadata.js\";\nimport { OptionalContentConfig } from \"./optional_content_config.js\";\nimport { PDFDataTransportStream } from \"./transport_stream.js\";\nimport { PDFFetchStream } from \"display-fetch_stream\";\nimport { PDFNetworkStream } from \"display-network\";\nimport { PDFNodeStream } from \"display-node_stream\";\nimport { TextLayer } from \"./text_layer.js\";\nimport { XfaText } from \"./xfa_text.js\";\n\nconst DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536\nconst RENDERING_CANCELLED_TIMEOUT = 100; // ms\n\n/**\n * @typedef { Int8Array | Uint8Array | Uint8ClampedArray |\n * Int16Array | Uint16Array |\n * Int32Array | Uint32Array | Float32Array |\n * Float64Array\n * } TypedArray\n */\n\n/**\n * @typedef {Object} RefProxy\n * @property {number} num\n * @property {number} gen\n */\n\n/**\n * Document initialization / loading parameters object.\n *\n * @typedef {Object} DocumentInitParameters\n * @property {string | URL} [url] - The URL of the PDF.\n * @property {TypedArray | ArrayBuffer | Array | string} [data] -\n * Binary PDF data.\n * Use TypedArrays (Uint8Array) to improve the memory usage. If PDF data is\n * BASE64-encoded, use `atob()` to convert it to a binary string first.\n *\n * NOTE: If TypedArrays are used they will generally be transferred to the\n * worker-thread. This will help reduce main-thread memory usage, however\n * it will take ownership of the TypedArrays.\n * @property {Object} [httpHeaders] - Basic authentication headers.\n * @property {boolean} [withCredentials] - Indicates whether or not\n * cross-site Access-Control requests should be made using credentials such\n * as cookies or authorization headers. The default is `false`.\n * @property {string} [password] - For decrypting password-protected PDFs.\n * @property {number} [length] - The PDF file length. It's used for progress\n * reports and range requests operations.\n * @property {PDFDataRangeTransport} [range] - Allows for using a custom range\n * transport implementation.\n * @property {number} [rangeChunkSize] - Specify maximum number of bytes fetched\n * per range request. The default value is {@link DEFAULT_RANGE_CHUNK_SIZE}.\n * @property {PDFWorker} [worker] - The worker that will be used for loading and\n * parsing the PDF data.\n * @property {number} [verbosity] - Controls the logging level; the constants\n * from {@link VerbosityLevel} should be used.\n * @property {string} [docBaseUrl] - The base URL of the document, used when\n * attempting to recover valid absolute URLs for annotations, and outline\n * items, that (incorrectly) only specify relative URLs.\n * @property {string} [cMapUrl] - The URL where the predefined Adobe CMaps are\n * located. Include the trailing slash.\n * @property {boolean} [cMapPacked] - Specifies if the Adobe CMaps are binary\n * packed or not. The default value is `true`.\n * @property {Object} [CMapReaderFactory] - The factory that will be used when\n * reading built-in CMap files.\n * The default value is {DOMCMapReaderFactory}.\n * @property {string} [iccUrl] - The URL where the predefined ICC profiles are\n * located. Include the trailing slash.\n * @property {boolean} [useSystemFonts] - When `true`, fonts that aren't\n * embedded in the PDF document will fallback to a system font.\n * The default value is `true` in web environments and `false` in Node.js;\n * unless `disableFontFace === true` in which case this defaults to `false`\n * regardless of the environment (to prevent completely broken fonts).\n * @property {string} [standardFontDataUrl] - The URL where the standard font\n * files are located. Include the trailing slash.\n * @property {Object} [StandardFontDataFactory] - The factory that will be used\n * when reading the standard font files.\n * The default value is {DOMStandardFontDataFactory}.\n * @property {string} [wasmUrl] - The URL where the wasm files are located.\n * Include the trailing slash.\n * @property {Object} [WasmFactory] - The factory that will be used\n * when reading the wasm files.\n * The default value is {DOMWasmFactory}.\n * @property {boolean} [useWorkerFetch] - Enable using the Fetch API in the\n * worker-thread when reading CMap and standard font files. When `true`,\n * the `CMapReaderFactory`, `StandardFontDataFactory`, and `WasmFactory`\n * options are ignored.\n * The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [useWasm] - Attempt to use WebAssembly in order to\n * improve e.g. image decoding performance.\n * The default value is `true`.\n * @property {boolean} [stopAtErrors] - Reject certain promises, e.g.\n * `getOperatorList`, `getTextContent`, and `RenderTask`, when the associated\n * PDF data cannot be successfully parsed, instead of attempting to recover\n * whatever possible of the data. The default value is `false`.\n * @property {number} [maxImageSize] - The maximum allowed image size in total\n * pixels, i.e. width * height. Images above this value will not be rendered.\n * Use -1 for no limit, which is also the default value.\n * @property {boolean} [isEvalSupported] - Determines if we can evaluate strings\n * as JavaScript. Primarily used to improve performance of PDF functions.\n * The default value is `true`.\n * @property {boolean} [isOffscreenCanvasSupported] - Determines if we can use\n * `OffscreenCanvas` in the worker. Primarily used to improve performance of\n * image conversion/rendering.\n * The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [isImageDecoderSupported] - Determines if we can use\n * `ImageDecoder` in the worker. Primarily used to improve performance of\n * image conversion/rendering.\n * The default value is `true` in web environments and `false` in Node.js.\n *\n * NOTE: Also temporarily disabled in Chromium browsers, until we no longer\n * support the affected browser versions, because of various bugs:\n *\n * - Crashes when using the BMP decoder with huge images, e.g. issue6741.pdf;\n * see https://issues.chromium.org/issues/374807001\n *\n * - Broken images when using the JPEG decoder with images that have custom\n * colour profiles, e.g. GitHub discussion 19030;\n * see https://issues.chromium.org/issues/378869810\n *\n * @property {number} [canvasMaxAreaInBytes] - The integer value is used to\n * know when an image must be resized (uses `OffscreenCanvas` in the worker).\n * If it's -1 then a possibly slow algorithm is used to guess the max value.\n * @property {boolean} [disableFontFace] - By default fonts are converted to\n * OpenType fonts and loaded via the Font Loading API or `@font-face` rules.\n * If disabled, fonts will be rendered using a built-in font renderer that\n * constructs the glyphs with primitive path commands.\n * The default value is `false` in web environments and `true` in Node.js.\n * @property {boolean} [fontExtraProperties] - Include additional properties,\n * which are unused during rendering of PDF documents, when exporting the\n * parsed font data from the worker-thread. This may be useful for debugging\n * purposes (and backwards compatibility), but note that it will lead to\n * increased memory usage. The default value is `false`.\n * @property {boolean} [enableXfa] - Render Xfa forms if any.\n * The default value is `false`.\n * @property {HTMLDocument} [ownerDocument] - Specify an explicit document\n * context to create elements with and to load resources, such as fonts,\n * into. Defaults to the current document.\n * @property {boolean} [disableRange] - Disable range request loading of PDF\n * files. When enabled, and if the server supports partial content requests,\n * then the PDF will be fetched in chunks. The default value is `false`.\n * @property {boolean} [disableStream] - Disable streaming of PDF file data.\n * By default PDF.js attempts to load PDF files in chunks. The default value\n * is `false`.\n * @property {boolean} [disableAutoFetch] - Disable pre-fetching of PDF file\n * data. When range requests are enabled PDF.js will automatically keep\n * fetching more data even if it isn't needed to display the current page.\n * The default value is `false`.\n *\n * NOTE: It is also necessary to disable streaming, see above, in order for\n * disabling of pre-fetching to work correctly.\n * @property {boolean} [pdfBug] - Enables special hooks for debugging PDF.js\n * (see `web/debugger.js`). The default value is `false`.\n * @property {Object} [CanvasFactory] - The factory that will be used when\n * creating canvases. The default value is {DOMCanvasFactory}.\n * @property {Object} [FilterFactory] - The factory that will be used to\n * create SVG filters when rendering some images on the main canvas.\n * The default value is {DOMFilterFactory}.\n * @property {boolean} [enableHWA] - Enables hardware acceleration for\n * rendering. The default value is `false`.\n */\n\n/**\n * This is the main entry point for loading a PDF and interacting with it.\n *\n * NOTE: If a URL is used to fetch the PDF data a standard Fetch API call (or\n * XHR as fallback) is used, which means it must follow same origin rules,\n * e.g. no cross-domain requests without CORS.\n *\n * @param {string | URL | TypedArray | ArrayBuffer | DocumentInitParameters}\n * src - Can be a URL where a PDF file is located, a typed array (Uint8Array)\n * already populated with data, or a parameter object.\n * @returns {PDFDocumentLoadingTask}\n */\nfunction getDocument(src = {}) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n if (typeof src === \"string\" || src instanceof URL) {\n src = { url: src };\n } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) {\n src = { data: src };\n }\n }\n const task = new PDFDocumentLoadingTask();\n const { docId } = task;\n\n const url = src.url ? getUrlProp(src.url) : null;\n const data = src.data ? getDataProp(src.data) : null;\n const httpHeaders = src.httpHeaders || null;\n const withCredentials = src.withCredentials === true;\n const password = src.password ?? null;\n const rangeTransport =\n src.range instanceof PDFDataRangeTransport ? src.range : null;\n const rangeChunkSize =\n Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0\n ? src.rangeChunkSize\n : DEFAULT_RANGE_CHUNK_SIZE;\n let worker = src.worker instanceof PDFWorker ? src.worker : null;\n const verbosity = src.verbosity;\n // Ignore \"data:\"-URLs, since they can't be used to recover valid absolute\n // URLs anyway. We want to avoid sending them to the worker-thread, since\n // they contain the *entire* PDF document and can thus be arbitrarily long.\n const docBaseUrl =\n typeof src.docBaseUrl === \"string\" && !isDataScheme(src.docBaseUrl)\n ? src.docBaseUrl\n : null;\n const cMapUrl = getFactoryUrlProp(src.cMapUrl);\n const cMapPacked = src.cMapPacked !== false;\n const CMapReaderFactory =\n src.CMapReaderFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeCMapReaderFactory\n : DOMCMapReaderFactory);\n const iccUrl = getFactoryUrlProp(src.iccUrl);\n const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl);\n const StandardFontDataFactory =\n src.StandardFontDataFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeStandardFontDataFactory\n : DOMStandardFontDataFactory);\n const wasmUrl = getFactoryUrlProp(src.wasmUrl);\n const WasmFactory =\n src.WasmFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeWasmFactory\n : DOMWasmFactory);\n const ignoreErrors = src.stopAtErrors !== true;\n const maxImageSize =\n Number.isInteger(src.maxImageSize) && src.maxImageSize > -1\n ? src.maxImageSize\n : -1;\n const isEvalSupported = src.isEvalSupported !== false;\n const isOffscreenCanvasSupported =\n typeof src.isOffscreenCanvasSupported === \"boolean\"\n ? src.isOffscreenCanvasSupported\n : !isNodeJS;\n const isImageDecoderSupported =\n // eslint-disable-next-line no-nested-ternary\n typeof src.isImageDecoderSupported === \"boolean\"\n ? src.isImageDecoderSupported\n : // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? true\n : typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")\n ? false\n : !isNodeJS && (FeatureTest.platform.isFirefox || !globalThis.chrome);\n const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes)\n ? src.canvasMaxAreaInBytes\n : -1;\n const disableFontFace =\n typeof src.disableFontFace === \"boolean\" ? src.disableFontFace : isNodeJS;\n const fontExtraProperties = src.fontExtraProperties === true;\n const enableXfa = src.enableXfa === true;\n const ownerDocument = src.ownerDocument || globalThis.document;\n const disableRange = src.disableRange === true;\n const disableStream = src.disableStream === true;\n const disableAutoFetch = src.disableAutoFetch === true;\n const pdfBug = src.pdfBug === true;\n const CanvasFactory =\n src.CanvasFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeCanvasFactory\n : DOMCanvasFactory);\n const FilterFactory =\n src.FilterFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeFilterFactory\n : DOMFilterFactory);\n const enableHWA = src.enableHWA === true;\n const useWasm = src.useWasm !== false;\n\n // Parameters whose default values depend on other parameters.\n const length = rangeTransport ? rangeTransport.length : (src.length ?? NaN);\n const useSystemFonts =\n typeof src.useSystemFonts === \"boolean\"\n ? src.useSystemFonts\n : !isNodeJS && !disableFontFace;\n const useWorkerFetch =\n typeof src.useWorkerFetch === \"boolean\"\n ? src.useWorkerFetch\n : (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n !!(\n CMapReaderFactory === DOMCMapReaderFactory &&\n StandardFontDataFactory === DOMStandardFontDataFactory &&\n WasmFactory === DOMWasmFactory &&\n cMapUrl &&\n standardFontDataUrl &&\n wasmUrl &&\n isValidFetchUrl(cMapUrl, document.baseURI) &&\n isValidFetchUrl(standardFontDataUrl, document.baseURI) &&\n isValidFetchUrl(wasmUrl, document.baseURI)\n );\n\n // Parameters only intended for development/testing purposes.\n const styleElement =\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n ? src.styleElement\n : null;\n\n // Set the main-thread verbosity level.\n setVerbosityLevel(verbosity);\n\n // Ensure that the various factories can be initialized, when necessary,\n // since the user may provide *custom* ones.\n const transportFactory = {\n canvasFactory: new CanvasFactory({ ownerDocument, enableHWA }),\n filterFactory: new FilterFactory({ docId, ownerDocument }),\n cMapReaderFactory:\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n useWorkerFetch\n ? null\n : new CMapReaderFactory({ baseUrl: cMapUrl, isCompressed: cMapPacked }),\n standardFontDataFactory:\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n useWorkerFetch\n ? null\n : new StandardFontDataFactory({ baseUrl: standardFontDataUrl }),\n wasmFactory:\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n useWorkerFetch\n ? null\n : new WasmFactory({ baseUrl: wasmUrl }),\n };\n\n if (!worker) {\n const workerParams = {\n verbosity,\n port: GlobalWorkerOptions.workerPort,\n };\n // Worker was not provided -- creating and owning our own. If message port\n // is specified in global worker options, using it.\n worker = workerParams.port\n ? PDFWorker.fromPort(workerParams)\n : new PDFWorker(workerParams);\n task._worker = worker;\n }\n\n const docParams = {\n docId,\n apiVersion:\n typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"TESTING\")\n ? PDFJSDev.eval(\"BUNDLE_VERSION\")\n : null,\n data,\n password,\n disableAutoFetch,\n rangeChunkSize,\n length,\n docBaseUrl,\n enableXfa,\n evaluatorOptions: {\n maxImageSize,\n disableFontFace,\n ignoreErrors,\n isEvalSupported,\n isOffscreenCanvasSupported,\n isImageDecoderSupported,\n canvasMaxAreaInBytes,\n fontExtraProperties,\n useSystemFonts,\n useWasm,\n useWorkerFetch,\n cMapUrl,\n iccUrl,\n standardFontDataUrl,\n wasmUrl,\n },\n };\n const transportParams = {\n ownerDocument,\n pdfBug,\n styleElement,\n loadingParams: {\n disableAutoFetch,\n enableXfa,\n },\n };\n\n worker.promise\n .then(function () {\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n\n const workerIdPromise = worker.messageHandler.sendWithPromise(\n \"GetDocRequest\",\n docParams,\n data ? [data.buffer] : null\n );\n\n let networkStream;\n if (rangeTransport) {\n networkStream = new PDFDataTransportStream(rangeTransport, {\n disableRange,\n disableStream,\n });\n } else if (!data) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: NetworkStream\");\n }\n if (!url) {\n throw new Error(\"getDocument - no `url` parameter provided.\");\n }\n let NetworkStream;\n\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS\n ) {\n if (isValidFetchUrl(url)) {\n if (\n typeof fetch === \"undefined\" ||\n typeof Response === \"undefined\" ||\n !(\"body\" in Response.prototype)\n ) {\n throw new Error(\n \"getDocument - the Fetch API was disabled in Node.js, see `--no-experimental-fetch`.\"\n );\n }\n NetworkStream = PDFFetchStream;\n } else {\n NetworkStream = PDFNodeStream;\n }\n } else {\n NetworkStream = isValidFetchUrl(url)\n ? PDFFetchStream\n : PDFNetworkStream;\n }\n\n networkStream = new NetworkStream({\n url,\n length,\n httpHeaders,\n withCredentials,\n rangeChunkSize,\n disableRange,\n disableStream,\n });\n }\n\n return workerIdPromise.then(workerId => {\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n\n const messageHandler = new MessageHandler(docId, workerId, worker.port);\n const transport = new WorkerTransport(\n messageHandler,\n task,\n networkStream,\n transportParams,\n transportFactory\n );\n task._transport = transport;\n messageHandler.send(\"Ready\", null);\n });\n })\n .catch(task._capability.reject);\n\n return task;\n}\n\nfunction getUrlProp(val) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return null; // The 'url' is unused with `PDFDataRangeTransport`.\n }\n if (val instanceof URL) {\n return val.href;\n }\n if (typeof val === \"string\") {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS\n ) {\n return val; // Use the url as-is in Node.js environments.\n }\n\n // The full path is required in the 'url' field.\n const url = URL.parse(val, window.location);\n if (url) {\n return url.href;\n }\n }\n throw new Error(\n \"Invalid PDF url data: \" +\n \"either string or URL-object is expected in the url property.\"\n );\n}\n\nfunction getDataProp(val) {\n // Converting string or array-like data to Uint8Array.\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS &&\n typeof Buffer !== \"undefined\" && // eslint-disable-line no-undef\n val instanceof Buffer // eslint-disable-line no-undef\n ) {\n throw new Error(\n \"Please provide binary data as `Uint8Array`, rather than `Buffer`.\"\n );\n }\n if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) {\n // Use the data as-is when it's already a Uint8Array that completely\n // \"utilizes\" its underlying ArrayBuffer, to prevent any possible\n // issues when transferring it to the worker-thread.\n return val;\n }\n if (typeof val === \"string\") {\n return stringToBytes(val);\n }\n if (\n val instanceof ArrayBuffer ||\n ArrayBuffer.isView(val) ||\n (typeof val === \"object\" && !isNaN(val?.length))\n ) {\n return new Uint8Array(val);\n }\n throw new Error(\n \"Invalid PDF binary data: either TypedArray, \" +\n \"string, or array-like object is expected in the data property.\"\n );\n}\n\nfunction getFactoryUrlProp(val) {\n if (typeof val !== \"string\") {\n return null;\n }\n if (val.endsWith(\"/\")) {\n return val;\n }\n throw new Error(`Invalid factory url: \"${val}\" must include trailing slash.`);\n}\n\nconst isRefProxy = v =>\n typeof v === \"object\" &&\n Number.isInteger(v?.num) &&\n v.num >= 0 &&\n Number.isInteger(v?.gen) &&\n v.gen >= 0;\n\nconst isNameProxy = v => typeof v === \"object\" && typeof v?.name === \"string\";\n\nconst isValidExplicitDest = _isValidExplicitDest.bind(\n null,\n /* validRef = */ isRefProxy,\n /* validName = */ isNameProxy\n);\n\n/**\n * @typedef {Object} OnProgressParameters\n * @property {number} loaded - Currently loaded number of bytes.\n * @property {number} total - Total number of bytes in the PDF file.\n */\n\n/**\n * The loading task controls the operations required to load a PDF document\n * (such as network requests) and provides a way to listen for completion,\n * after which individual pages can be rendered.\n */\nclass PDFDocumentLoadingTask {\n static #docId = 0;\n\n /**\n * @private\n */\n _capability = Promise.withResolvers();\n\n /**\n * @private\n */\n _transport = null;\n\n /**\n * @private\n */\n _worker = null;\n\n /**\n * Unique identifier for the document loading task.\n * @type {string}\n */\n docId = `d${PDFDocumentLoadingTask.#docId++}`;\n\n /**\n * Whether the loading task is destroyed or not.\n * @type {boolean}\n */\n destroyed = false;\n\n /**\n * Callback to request a password if a wrong or no password was provided.\n * The callback receives two parameters: a function that should be called\n * with the new password, and a reason (see {@link PasswordResponses}).\n * @type {function}\n */\n onPassword = null;\n\n /**\n * Callback to be able to monitor the loading progress of the PDF file\n * (necessary to implement e.g. a loading bar).\n * The callback receives an {@link OnProgressParameters} argument.\n * @type {function}\n */\n onProgress = null;\n\n /**\n * Promise for document loading task completion.\n * @type {Promise}\n */\n get promise() {\n return this._capability.promise;\n }\n\n /**\n * Abort all network requests and destroy the worker.\n * @returns {Promise} A promise that is resolved when destruction is\n * completed.\n */\n async destroy() {\n this.destroyed = true;\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n await this._transport?.destroy();\n } else {\n try {\n if (this._worker?.port) {\n this._worker._pendingDestroy = true;\n }\n await this._transport?.destroy();\n } catch (ex) {\n if (this._worker?.port) {\n delete this._worker._pendingDestroy;\n }\n throw ex;\n }\n }\n this._transport = null;\n\n this._worker?.destroy();\n this._worker = null;\n }\n\n /**\n * Attempt to fetch the raw data of the PDF document, when e.g.\n * - An exception was thrown during document initialization.\n * - An `onPassword` callback is delaying initialization.\n * @returns {Promise}\n */\n async getData() {\n return this._transport.getData();\n }\n}\n\n/**\n * Abstract class to support range requests file loading.\n *\n * NOTE: The TypedArrays passed to the constructor and relevant methods below\n * will generally be transferred to the worker-thread. This will help reduce\n * main-thread memory usage, however it will take ownership of the TypedArrays.\n */\nclass PDFDataRangeTransport {\n /**\n * @param {number} length\n * @param {Uint8Array|null} initialData\n * @param {boolean} [progressiveDone]\n * @param {string} [contentDispositionFilename]\n */\n constructor(\n length,\n initialData,\n progressiveDone = false,\n contentDispositionFilename = null\n ) {\n this.length = length;\n this.initialData = initialData;\n this.progressiveDone = progressiveDone;\n this.contentDispositionFilename = contentDispositionFilename;\n\n this._rangeListeners = [];\n this._progressListeners = [];\n this._progressiveReadListeners = [];\n this._progressiveDoneListeners = [];\n this._readyCapability = Promise.withResolvers();\n }\n\n /**\n * @param {function} listener\n */\n addRangeListener(listener) {\n this._rangeListeners.push(listener);\n }\n\n /**\n * @param {function} listener\n */\n addProgressListener(listener) {\n this._progressListeners.push(listener);\n }\n\n /**\n * @param {function} listener\n */\n addProgressiveReadListener(listener) {\n this._progressiveReadListeners.push(listener);\n }\n\n /**\n * @param {function} listener\n */\n addProgressiveDoneListener(listener) {\n this._progressiveDoneListeners.push(listener);\n }\n\n /**\n * @param {number} begin\n * @param {Uint8Array|null} chunk\n */\n onDataRange(begin, chunk) {\n for (const listener of this._rangeListeners) {\n listener(begin, chunk);\n }\n }\n\n /**\n * @param {number} loaded\n * @param {number|undefined} total\n */\n onDataProgress(loaded, total) {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressListeners) {\n listener(loaded, total);\n }\n });\n }\n\n /**\n * @param {Uint8Array|null} chunk\n */\n onDataProgressiveRead(chunk) {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressiveReadListeners) {\n listener(chunk);\n }\n });\n }\n\n onDataProgressiveDone() {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressiveDoneListeners) {\n listener();\n }\n });\n }\n\n transportReady() {\n this._readyCapability.resolve();\n }\n\n /**\n * @param {number} begin\n * @param {number} end\n */\n requestDataRange(begin, end) {\n unreachable(\"Abstract method PDFDataRangeTransport.requestDataRange\");\n }\n\n abort() {}\n}\n\n/**\n * Proxy to a `PDFDocument` in the worker thread.\n */\nclass PDFDocumentProxy {\n constructor(pdfInfo, transport) {\n this._pdfInfo = pdfInfo;\n this._transport = transport;\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // For testing purposes.\n Object.defineProperty(this, \"getNetworkStreamName\", {\n value: () => this._transport.getNetworkStreamName(),\n });\n Object.defineProperty(this, \"getXFADatasets\", {\n value: () => this._transport.getXFADatasets(),\n });\n Object.defineProperty(this, \"getXRefPrevValue\", {\n value: () => this._transport.getXRefPrevValue(),\n });\n Object.defineProperty(this, \"getStartXRefPos\", {\n value: () => this._transport.getStartXRefPos(),\n });\n Object.defineProperty(this, \"getAnnotArray\", {\n value: pageIndex => this._transport.getAnnotArray(pageIndex),\n });\n }\n }\n\n /**\n * @type {AnnotationStorage} Storage for annotation data in forms.\n */\n get annotationStorage() {\n return this._transport.annotationStorage;\n }\n\n /**\n * @type {Object} The canvas factory instance.\n */\n get canvasFactory() {\n return this._transport.canvasFactory;\n }\n\n /**\n * @type {Object} The filter factory instance.\n */\n get filterFactory() {\n return this._transport.filterFactory;\n }\n\n /**\n * @type {number} Total number of pages in the PDF file.\n */\n get numPages() {\n return this._pdfInfo.numPages;\n }\n\n /**\n * @type {Array} A (not guaranteed to be) unique ID to identify\n * the PDF document.\n * NOTE: The first element will always be defined for all PDF documents,\n * whereas the second element is only defined for *modified* PDF documents.\n */\n get fingerprints() {\n return this._pdfInfo.fingerprints;\n }\n\n /**\n * @type {boolean} True if only XFA form.\n */\n get isPureXfa() {\n return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n }\n\n /**\n * NOTE: This is (mostly) intended to support printing of XFA forms.\n *\n * @type {Object | null} An object representing a HTML tree structure\n * to render the XFA, or `null` when no XFA form exists.\n */\n get allXfaHtml() {\n return this._transport._htmlForXfa;\n }\n\n /**\n * @param {number} pageNumber - The page number to get. The first page is 1.\n * @returns {Promise} A promise that is resolved with\n * a {@link PDFPageProxy} object.\n */\n getPage(pageNumber) {\n return this._transport.getPage(pageNumber);\n }\n\n /**\n * @param {RefProxy} ref - The page reference.\n * @returns {Promise} A promise that is resolved with the page index,\n * starting from zero, that is associated with the reference.\n */\n getPageIndex(ref) {\n return this._transport.getPageIndex(ref);\n }\n\n /**\n * @returns {Promise>>} A promise that is resolved\n * with a mapping from named destinations to references.\n *\n * This can be slow for large documents. Use `getDestination` instead.\n */\n getDestinations() {\n return this._transport.getDestinations();\n }\n\n /**\n * @param {string} id - The named destination to get.\n * @returns {Promise | null>} A promise that is resolved with all\n * information of the given named destination, or `null` when the named\n * destination is not present in the PDF file.\n */\n getDestination(id) {\n return this._transport.getDestination(id);\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with\n * an {Array} containing the page labels that correspond to the page\n * indexes, or `null` when no page labels are present in the PDF file.\n */\n getPageLabels() {\n return this._transport.getPageLabels();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a {string}\n * containing the page layout name.\n */\n getPageLayout() {\n return this._transport.getPageLayout();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a {string}\n * containing the page mode name.\n */\n getPageMode() {\n return this._transport.getPageMode();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with an\n * {Object} containing the viewer preferences, or `null` when no viewer\n * preferences are present in the PDF file.\n */\n getViewerPreferences() {\n return this._transport.getViewerPreferences();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with an {Array}\n * containing the destination, or `null` when no open action is present\n * in the PDF.\n */\n getOpenAction() {\n return this._transport.getOpenAction();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a lookup table\n * for mapping named attachments to their content.\n */\n getAttachments() {\n return this._transport.getAttachments();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with\n * an {Object} with the JavaScript actions:\n * - from the name tree.\n * - from A or AA entries in the catalog dictionary.\n * , or `null` if no JavaScript exists.\n */\n getJSActions() {\n return this._transport.getDocJSActions();\n }\n\n /**\n * @typedef {Object} OutlineNode\n * @property {string} title\n * @property {boolean} bold\n * @property {boolean} italic\n * @property {Uint8ClampedArray} color - The color in RGB format to use for\n * display purposes.\n * @property {string | Array | null} dest\n * @property {string | null} url\n * @property {string | undefined} unsafeUrl\n * @property {boolean | undefined} newWindow\n * @property {number | undefined} count\n * @property {Array} items\n */\n\n /**\n * @returns {Promise>} A promise that is resolved with an\n * {Array} that is a tree outline (if it has one) of the PDF file.\n */\n getOutline() {\n return this._transport.getOutline();\n }\n\n /**\n * @typedef {Object} GetOptionalContentConfigParameters\n * @property {string} [intent] - Determines the optional content groups that\n * are visible by default; valid values are:\n * - 'display' (viewable groups).\n * - 'print' (printable groups).\n * - 'any' (all groups).\n * The default value is 'display'.\n */\n\n /**\n * @param {GetOptionalContentConfigParameters} [params] - Optional content\n * config parameters.\n * @returns {Promise} A promise that is resolved with\n * an {@link OptionalContentConfig} that contains all the optional content\n * groups (assuming that the document has any).\n */\n getOptionalContentConfig({ intent = \"display\" } = {}) {\n const { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n return this._transport.getOptionalContentConfig(renderingIntent);\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with\n * an {Array} that contains the permission flags for the PDF document, or\n * `null` when no permissions are present in the PDF file.\n */\n getPermissions() {\n return this._transport.getPermissions();\n }\n\n /**\n * @returns {Promise<{ info: Object, metadata: Metadata }>} A promise that is\n * resolved with an {Object} that has `info` and `metadata` properties.\n * `info` is an {Object} filled with anything available in the information\n * dictionary and similarly `metadata` is a {Metadata} object with\n * information from the metadata section of the PDF.\n */\n getMetadata() {\n return this._transport.getMetadata();\n }\n\n /**\n * @typedef {Object} MarkInfo\n * Properties correspond to Table 321 of the PDF 32000-1:2008 spec.\n * @property {boolean} Marked\n * @property {boolean} UserProperties\n * @property {boolean} Suspects\n */\n\n /**\n * @returns {Promise} A promise that is resolved with\n * a {MarkInfo} object that contains the MarkInfo flags for the PDF\n * document, or `null` when no MarkInfo values are present in the PDF file.\n */\n getMarkInfo() {\n return this._transport.getMarkInfo();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a\n * {Uint8Array} containing the raw data of the PDF document.\n */\n getData() {\n return this._transport.getData();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a\n * {Uint8Array} containing the full data of the saved document.\n */\n saveDocument() {\n return this._transport.saveDocument();\n }\n\n /**\n * @returns {Promise<{ length: number }>} A promise that is resolved when the\n * document's data is loaded. It is resolved with an {Object} that contains\n * the `length` property that indicates size of the PDF data in bytes.\n */\n getDownloadInfo() {\n return this._transport.downloadInfoCapability.promise;\n }\n\n /**\n * Cleans up resources allocated by the document on both the main and worker\n * threads.\n *\n * NOTE: Do not, under any circumstances, call this method when rendering is\n * currently ongoing since that may lead to rendering errors.\n *\n * @param {boolean} [keepLoadedFonts] - Let fonts remain attached to the DOM.\n * NOTE: This will increase persistent memory usage, hence don't use this\n * option unless absolutely necessary. The default value is `false`.\n * @returns {Promise} A promise that is resolved when clean-up has finished.\n */\n cleanup(keepLoadedFonts = false) {\n return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);\n }\n\n /**\n * Destroys the current document instance and terminates the worker.\n */\n destroy() {\n return this.loadingTask.destroy();\n }\n\n /**\n * @param {RefProxy} ref - The page reference.\n * @returns {number | null} The page number, if it's cached.\n */\n cachedPageNumber(ref) {\n return this._transport.cachedPageNumber(ref);\n }\n\n /**\n * @type {DocumentInitParameters} A subset of the current\n * {DocumentInitParameters}, which are needed in the viewer.\n */\n get loadingParams() {\n return this._transport.loadingParams;\n }\n\n /**\n * @type {PDFDocumentLoadingTask} The loadingTask for the current document.\n */\n get loadingTask() {\n return this._transport.loadingTask;\n }\n\n /**\n * @returns {Promise> | null>} A promise that is\n * resolved with an {Object} containing /AcroForm field data for the JS\n * sandbox, or `null` when no field data is present in the PDF file.\n */\n getFieldObjects() {\n return this._transport.getFieldObjects();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with `true`\n * if some /AcroForm fields have JavaScript actions.\n */\n hasJSActions() {\n return this._transport.hasJSActions();\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with an\n * {Array} containing IDs of annotations that have a calculation\n * action, or `null` when no such annotations are present in the PDF file.\n */\n getCalculationOrderIds() {\n return this._transport.getCalculationOrderIds();\n }\n}\n\n/**\n * Page getViewport parameters.\n *\n * @typedef {Object} GetViewportParameters\n * @property {number} scale - The desired scale of the viewport.\n * @property {number} [rotation] - The desired rotation, in degrees, of\n * the viewport. If omitted it defaults to the page rotation.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n * The default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n * The default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be\n * flipped. The default value is `false`.\n */\n\n/**\n * Page getTextContent parameters.\n *\n * @typedef {Object} getTextContentParameters\n * @property {boolean} [includeMarkedContent] - When true include marked\n * content items in the items array of TextContent. The default is `false`.\n * @property {boolean} [disableNormalization] - When true the text is *not*\n * normalized in the worker-thread. The default is `false`.\n */\n\n/**\n * Page text content.\n *\n * @typedef {Object} TextContent\n * @property {Array} items - Array of\n * {@link TextItem} and {@link TextMarkedContent} objects. TextMarkedContent\n * items are included when includeMarkedContent is true.\n * @property {Object} styles - {@link TextStyle} objects,\n * indexed by font name.\n * @property {string | null} lang - The document /Lang attribute.\n */\n\n/**\n * Page text content part.\n *\n * @typedef {Object} TextItem\n * @property {string} str - Text content.\n * @property {string} dir - Text direction: 'ttb', 'ltr' or 'rtl'.\n * @property {Array} transform - Transformation matrix.\n * @property {number} width - Width in device space.\n * @property {number} height - Height in device space.\n * @property {string} fontName - Font name used by PDF.js for converted font.\n * @property {boolean} hasEOL - Indicating if the text content is followed by a\n * line-break.\n */\n\n/**\n * Page text marked content part.\n *\n * @typedef {Object} TextMarkedContent\n * @property {string} type - Either 'beginMarkedContent',\n * 'beginMarkedContentProps', or 'endMarkedContent'.\n * @property {string} id - The marked content identifier. Only used for type\n * 'beginMarkedContentProps'.\n */\n\n/**\n * Text style.\n *\n * @typedef {Object} TextStyle\n * @property {number} ascent - Font ascent.\n * @property {number} descent - Font descent.\n * @property {boolean} vertical - Whether or not the text is in vertical mode.\n * @property {string} fontFamily - The possible font family.\n */\n\n/**\n * Page annotation parameters.\n *\n * @typedef {Object} GetAnnotationsParameters\n * @property {string} [intent] - Determines the annotations that are fetched,\n * can be 'display' (viewable annotations), 'print' (printable annotations),\n * or 'any' (all annotations). The default value is 'display'.\n */\n\n/**\n * Page render parameters.\n *\n * @typedef {Object} RenderParameters\n * @property {CanvasRenderingContext2D} canvasContext - A 2D context of a DOM\n * Canvas object.\n * @property {PageViewport} viewport - Rendering viewport obtained by calling\n * the `PDFPageProxy.getViewport` method.\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n * or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are rendered\n * onto the canvas, for annotations with appearance-data; the values from\n * {@link AnnotationMode} should be used. The following values are supported:\n * - `AnnotationMode.DISABLE`, which disables all annotations.\n * - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n * it also depends on the `intent`-option, see above).\n * - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n * interactive form elements (those will be rendered in the display layer).\n * - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n * (as above) but where interactive form elements are updated with data\n * from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n * The default value is `AnnotationMode.ENABLE`.\n * @property {Array} [transform] - Additional transform, applied just\n * before viewport transform.\n * @property {CanvasGradient | CanvasPattern | string} [background] - Background\n * to use for the canvas.\n * Any valid `canvas.fillStyle` can be used: a `DOMString` parsed as CSS\n * value, a `CanvasGradient` object (a linear or radial gradient) or\n * a `CanvasPattern` object (a repetitive image). The default value is\n * 'rgb(255,255,255)'.\n *\n * NOTE: This option may be partially, or completely, ignored when the\n * `pageColors`-option is used.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n * with user defined ones in order to improve readability in high contrast\n * mode.\n * @property {Promise} [optionalContentConfigPromise] -\n * A promise that should resolve with an {@link OptionalContentConfig}\n * created from `PDFDocumentProxy.getOptionalContentConfig`. If `null`,\n * the configuration will be fetched automatically with the default visibility\n * states set.\n * @property {Map} [annotationCanvasMap] - Map some\n * annotation ids with canvases used to render them.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n * @property {boolean} [isEditing] - Render the page in editing mode.\n */\n\n/**\n * Page getOperatorList parameters.\n *\n * @typedef {Object} GetOperatorListParameters\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n * or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are included\n * in the operatorList, for annotations with appearance-data; the values from\n * {@link AnnotationMode} should be used. The following values are supported:\n * - `AnnotationMode.DISABLE`, which disables all annotations.\n * - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n * it also depends on the `intent`-option, see above).\n * - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n * interactive form elements (those will be rendered in the display layer).\n * - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n * (as above) but where interactive form elements are updated with data\n * from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n * The default value is `AnnotationMode.ENABLE`.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n * @property {boolean} [isEditing] - Render the page in editing mode.\n */\n\n/**\n * Structure tree node. The root node will have a role \"Root\".\n *\n * @typedef {Object} StructTreeNode\n * @property {Array} children - Array of\n * {@link StructTreeNode} and {@link StructTreeContent} objects.\n * @property {string} role - element's role, already mapped if a role map exists\n * in the PDF.\n */\n\n/**\n * Structure tree content.\n *\n * @typedef {Object} StructTreeContent\n * @property {string} type - either \"content\" for page and stream structure\n * elements or \"object\" for object references.\n * @property {string} id - unique id that will map to the text layer.\n */\n\n/**\n * PDF page operator list.\n *\n * @typedef {Object} PDFOperatorList\n * @property {Array} fnArray - Array containing the operator functions.\n * @property {Array} argsArray - Array containing the arguments of the\n * functions.\n */\n\n/**\n * Proxy to a `PDFPage` in the worker thread.\n */\nclass PDFPageProxy {\n #pendingCleanup = false;\n\n constructor(pageIndex, pageInfo, transport, pdfBug = false) {\n this._pageIndex = pageIndex;\n this._pageInfo = pageInfo;\n this._transport = transport;\n this._stats = pdfBug ? new StatTimer() : null;\n this._pdfBug = pdfBug;\n /** @type {PDFObjects} */\n this.commonObjs = transport.commonObjs;\n this.objs = new PDFObjects();\n\n this._intentStates = new Map();\n this.destroyed = false;\n }\n\n /**\n * @type {number} Page number of the page. First page is 1.\n */\n get pageNumber() {\n return this._pageIndex + 1;\n }\n\n /**\n * @type {number} The number of degrees the page is rotated clockwise.\n */\n get rotate() {\n return this._pageInfo.rotate;\n }\n\n /**\n * @type {RefProxy | null} The reference that points to this page.\n */\n get ref() {\n return this._pageInfo.ref;\n }\n\n /**\n * @type {number} The default size of units in 1/72nds of an inch.\n */\n get userUnit() {\n return this._pageInfo.userUnit;\n }\n\n /**\n * @type {Array} An array of the visible portion of the PDF page in\n * user space units [x1, y1, x2, y2].\n */\n get view() {\n return this._pageInfo.view;\n }\n\n /**\n * @param {GetViewportParameters} params - Viewport parameters.\n * @returns {PageViewport} Contains 'width' and 'height' properties\n * along with transforms required for rendering.\n */\n getViewport({\n scale,\n rotation = this.rotate,\n offsetX = 0,\n offsetY = 0,\n dontFlip = false,\n } = {}) {\n return new PageViewport({\n viewBox: this.view,\n userUnit: this.userUnit,\n scale,\n rotation,\n offsetX,\n offsetY,\n dontFlip,\n });\n }\n\n /**\n * @param {GetAnnotationsParameters} [params] - Annotation parameters.\n * @returns {Promise>} A promise that is resolved with an\n * {Array} of the annotation objects.\n */\n getAnnotations({ intent = \"display\" } = {}) {\n const { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n return this._transport.getAnnotations(this._pageIndex, renderingIntent);\n }\n\n /**\n * @returns {Promise} A promise that is resolved with an\n * {Object} with JS actions.\n */\n getJSActions() {\n return this._transport.getPageJSActions(this._pageIndex);\n }\n\n /**\n * @type {Object} The filter factory instance.\n */\n get filterFactory() {\n return this._transport.filterFactory;\n }\n\n /**\n * @type {boolean} True if only XFA form.\n */\n get isPureXfa() {\n return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n }\n\n /**\n * @returns {Promise} A promise that is resolved with\n * an {Object} with a fake DOM object (a tree structure where elements\n * are {Object} with a name, attributes (class, style, ...), value and\n * children, very similar to a HTML DOM tree), or `null` if no XFA exists.\n */\n async getXfa() {\n return this._transport._htmlForXfa?.children[this._pageIndex] || null;\n }\n\n /**\n * Begins the process of rendering a page to the desired context.\n *\n * @param {RenderParameters} params - Page render parameters.\n * @returns {RenderTask} An object that contains a promise that is\n * resolved when the page finishes rendering.\n */\n render({\n canvasContext,\n viewport,\n intent = \"display\",\n annotationMode = AnnotationMode.ENABLE,\n transform = null,\n background = null,\n optionalContentConfigPromise = null,\n annotationCanvasMap = null,\n pageColors = null,\n printAnnotationStorage = null,\n isEditing = false,\n }) {\n this._stats?.time(\"Overall\");\n\n const intentArgs = this._transport.getRenderingIntent(\n intent,\n annotationMode,\n printAnnotationStorage,\n isEditing\n );\n const { renderingIntent, cacheKey } = intentArgs;\n // If there was a pending destroy, cancel it so no cleanup happens during\n // this call to render.\n this.#pendingCleanup = false;\n\n optionalContentConfigPromise ||=\n this._transport.getOptionalContentConfig(renderingIntent);\n\n let intentState = this._intentStates.get(cacheKey);\n if (!intentState) {\n intentState = Object.create(null);\n this._intentStates.set(cacheKey, intentState);\n }\n\n // Ensure that a pending `streamReader` cancel timeout is always aborted.\n if (intentState.streamReaderCancelTimeout) {\n clearTimeout(intentState.streamReaderCancelTimeout);\n intentState.streamReaderCancelTimeout = null;\n }\n\n const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n\n // If there's no displayReadyCapability yet, then the operatorList\n // was never requested before. Make the request and create the promise.\n if (!intentState.displayReadyCapability) {\n intentState.displayReadyCapability = Promise.withResolvers();\n intentState.operatorList = {\n fnArray: [],\n argsArray: [],\n lastChunk: false,\n separateAnnots: null,\n };\n\n this._stats?.time(\"Page Request\");\n this._pumpOperatorList(intentArgs);\n }\n\n const complete = error => {\n intentState.renderTasks.delete(internalRenderTask);\n\n // Attempt to reduce memory usage during *printing*, by always running\n // cleanup immediately once rendering has finished.\n if (intentPrint) {\n this.#pendingCleanup = true;\n }\n this.#tryCleanup();\n\n if (error) {\n internalRenderTask.capability.reject(error);\n\n this._abortOperatorList({\n intentState,\n reason: error instanceof Error ? error : new Error(error),\n });\n } else {\n internalRenderTask.capability.resolve();\n }\n\n if (this._stats) {\n this._stats.timeEnd(\"Rendering\");\n this._stats.timeEnd(\"Overall\");\n\n if (globalThis.Stats?.enabled) {\n globalThis.Stats.add(this.pageNumber, this._stats);\n }\n }\n };\n\n const internalRenderTask = new InternalRenderTask({\n callback: complete,\n // Only include the required properties, and *not* the entire object.\n params: {\n canvasContext,\n viewport,\n transform,\n background,\n },\n objs: this.objs,\n commonObjs: this.commonObjs,\n annotationCanvasMap,\n operatorList: intentState.operatorList,\n pageIndex: this._pageIndex,\n canvasFactory: this._transport.canvasFactory,\n filterFactory: this._transport.filterFactory,\n useRequestAnimationFrame: !intentPrint,\n pdfBug: this._pdfBug,\n pageColors,\n });\n\n (intentState.renderTasks ||= new Set()).add(internalRenderTask);\n const renderTask = internalRenderTask.task;\n\n Promise.all([\n intentState.displayReadyCapability.promise,\n optionalContentConfigPromise,\n ])\n .then(([transparency, optionalContentConfig]) => {\n if (this.destroyed) {\n complete();\n return;\n }\n this._stats?.time(\"Rendering\");\n\n if (!(optionalContentConfig.renderingIntent & renderingIntent)) {\n throw new Error(\n \"Must use the same `intent`-argument when calling the `PDFPageProxy.render` \" +\n \"and `PDFDocumentProxy.getOptionalContentConfig` methods.\"\n );\n }\n internalRenderTask.initializeGraphics({\n transparency,\n optionalContentConfig,\n });\n internalRenderTask.operatorListChanged();\n })\n .catch(complete);\n\n return renderTask;\n }\n\n /**\n * @param {GetOperatorListParameters} params - Page getOperatorList\n * parameters.\n * @returns {Promise} A promise resolved with an\n * {@link PDFOperatorList} object that represents the page's operator list.\n */\n getOperatorList({\n intent = \"display\",\n annotationMode = AnnotationMode.ENABLE,\n printAnnotationStorage = null,\n isEditing = false,\n } = {}) {\n if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n throw new Error(\"Not implemented: getOperatorList\");\n }\n function operatorListChanged() {\n if (intentState.operatorList.lastChunk) {\n intentState.opListReadCapability.resolve(intentState.operatorList);\n\n intentState.renderTasks.delete(opListTask);\n }\n }\n\n const intentArgs = this._transport.getRenderingIntent(\n intent,\n annotationMode,\n printAnnotationStorage,\n isEditing,\n /* isOpList = */ true\n );\n let intentState = this._intentStates.get(intentArgs.cacheKey);\n if (!intentState) {\n intentState = Object.create(null);\n this._intentStates.set(intentArgs.cacheKey, intentState);\n }\n let opListTask;\n\n if (!intentState.opListReadCapability) {\n opListTask = Object.create(null);\n opListTask.operatorListChanged = operatorListChanged;\n intentState.opListReadCapability = Promise.withResolvers();\n (intentState.renderTasks ||= new Set()).add(opListTask);\n intentState.operatorList = {\n fnArray: [],\n argsArray: [],\n lastChunk: false,\n separateAnnots: null,\n };\n\n this._stats?.time(\"Page Request\");\n this._pumpOperatorList(intentArgs);\n }\n return intentState.opListReadCapability.promise;\n }\n\n /**\n * NOTE: All occurrences of whitespace will be replaced by\n * standard spaces (0x20).\n *\n * @param {getTextContentParameters} params - getTextContent parameters.\n * @returns {ReadableStream} Stream for reading text content chunks.\n */\n streamTextContent({\n includeMarkedContent = false,\n disableNormalization = false,\n } = {}) {\n const TEXT_CONTENT_CHUNK_SIZE = 100;\n\n return this._transport.messageHandler.sendWithStream(\n \"GetTextContent\",\n {\n pageIndex: this._pageIndex,\n includeMarkedContent: includeMarkedContent === true,\n disableNormalization: disableNormalization === true,\n },\n {\n highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n size(textContent) {\n return textContent.items.length;\n },\n }\n );\n }\n\n /**\n * NOTE: All occurrences of whitespace will be replaced by\n * standard spaces (0x20).\n *\n * @param {getTextContentParameters} params - getTextContent parameters.\n * @returns {Promise} A promise that is resolved with a\n * {@link TextContent} object that represents the page's text content.\n */\n getTextContent(params = {}) {\n if (this._transport._htmlForXfa) {\n // TODO: We need to revisit this once the XFA foreground patch lands and\n // only do this for non-foreground XFA.\n return this.getXfa().then(xfa => XfaText.textContent(xfa));\n }\n const readableStream = this.streamTextContent(params);\n\n return new Promise(function (resolve, reject) {\n function pump() {\n reader.read().then(function ({ value, done }) {\n if (done) {\n resolve(textContent);\n return;\n }\n textContent.lang ??= value.lang;\n Object.assign(textContent.styles, value.styles);\n textContent.items.push(...value.items);\n pump();\n }, reject);\n }\n\n const reader = readableStream.getReader();\n const textContent = {\n items: [],\n styles: Object.create(null),\n lang: null,\n };\n pump();\n });\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a\n * {@link StructTreeNode} object that represents the page's structure tree,\n * or `null` when no structure tree is present for the current page.\n */\n getStructTree() {\n return this._transport.getStructTree(this._pageIndex);\n }\n\n /**\n * Destroys the page object.\n * @private\n */\n _destroy() {\n this.destroyed = true;\n\n const waitOn = [];\n for (const intentState of this._intentStates.values()) {\n this._abortOperatorList({\n intentState,\n reason: new Error(\"Page was destroyed.\"),\n force: true,\n });\n\n if (intentState.opListReadCapability) {\n // Avoid errors below, since the renderTasks are just stubs.\n continue;\n }\n for (const internalRenderTask of intentState.renderTasks) {\n waitOn.push(internalRenderTask.completed);\n internalRenderTask.cancel();\n }\n }\n this.objs.clear();\n this.#pendingCleanup = false;\n\n return Promise.all(waitOn);\n }\n\n /**\n * Cleans up resources allocated by the page.\n *\n * @param {boolean} [resetStats] - Reset page stats, if enabled.\n * The default value is `false`.\n * @returns {boolean} Indicates if clean-up was successfully run.\n */\n cleanup(resetStats = false) {\n this.#pendingCleanup = true;\n const success = this.#tryCleanup();\n\n if (resetStats && success) {\n this._stats &&= new StatTimer();\n }\n return success;\n }\n\n /**\n * Attempts to clean up if rendering is in a state where that's possible.\n * @returns {boolean} Indicates if clean-up was successfully run.\n */\n #tryCleanup() {\n if (!this.#pendingCleanup || this.destroyed) {\n return false;\n }\n for (const { renderTasks, operatorList } of this._intentStates.values()) {\n if (renderTasks.size > 0 || !operatorList.lastChunk) {\n return false;\n }\n }\n this._intentStates.clear();\n this.objs.clear();\n this.#pendingCleanup = false;\n return true;\n }\n\n /**\n * @private\n */\n _startRenderPage(transparency, cacheKey) {\n const intentState = this._intentStates.get(cacheKey);\n if (!intentState) {\n return; // Rendering was cancelled.\n }\n this._stats?.timeEnd(\"Page Request\");\n\n // TODO Refactor RenderPageRequest to separate rendering\n // and operator list logic\n intentState.displayReadyCapability?.resolve(transparency);\n }\n\n /**\n * @private\n */\n _renderPageChunk(operatorListChunk, intentState) {\n // Add the new chunk to the current operator list.\n for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {\n intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n }\n intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots;\n\n // Notify all the rendering tasks there are more operators to be consumed.\n for (const internalRenderTask of intentState.renderTasks) {\n internalRenderTask.operatorListChanged();\n }\n\n if (operatorListChunk.lastChunk) {\n this.#tryCleanup();\n }\n }\n\n /**\n * @private\n */\n _pumpOperatorList({\n renderingIntent,\n cacheKey,\n annotationStorageSerializable,\n modifiedIds,\n }) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n Number.isInteger(renderingIntent) && renderingIntent > 0,\n '_pumpOperatorList: Expected valid \"renderingIntent\" argument.'\n );\n }\n const { map, transfer } = annotationStorageSerializable;\n\n const readableStream = this._transport.messageHandler.sendWithStream(\n \"GetOperatorList\",\n {\n pageIndex: this._pageIndex,\n intent: renderingIntent,\n cacheKey,\n annotationStorage: map,\n modifiedIds,\n },\n transfer\n );\n const reader = readableStream.getReader();\n\n const intentState = this._intentStates.get(cacheKey);\n intentState.streamReader = reader;\n\n const pump = () => {\n reader.read().then(\n ({ value, done }) => {\n if (done) {\n intentState.streamReader = null;\n return;\n }\n if (this._transport.destroyed) {\n return; // Ignore any pending requests if the worker was terminated.\n }\n this._renderPageChunk(value, intentState);\n pump();\n },\n reason => {\n intentState.streamReader = null;\n\n if (this._transport.destroyed) {\n return; // Ignore any pending requests if the worker was terminated.\n }\n if (intentState.operatorList) {\n // Mark operator list as complete.\n intentState.operatorList.lastChunk = true;\n\n for (const internalRenderTask of intentState.renderTasks) {\n internalRenderTask.operatorListChanged();\n }\n this.#tryCleanup();\n }\n\n if (intentState.displayReadyCapability) {\n intentState.displayReadyCapability.reject(reason);\n } else if (intentState.opListReadCapability) {\n intentState.opListReadCapability.reject(reason);\n } else {\n throw reason;\n }\n }\n );\n };\n pump();\n }\n\n /**\n * @private\n */\n _abortOperatorList({ intentState, reason, force = false }) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n reason instanceof Error,\n '_abortOperatorList: Expected valid \"reason\" argument.'\n );\n }\n\n if (!intentState.streamReader) {\n return;\n }\n // Ensure that a pending `streamReader` cancel timeout is always aborted.\n if (intentState.streamReaderCancelTimeout) {\n clearTimeout(intentState.streamReaderCancelTimeout);\n intentState.streamReaderCancelTimeout = null;\n }\n\n if (!force) {\n // Ensure that an Error occurring in *only* one `InternalRenderTask`, e.g.\n // multiple render() calls on the same canvas, won't break all rendering.\n if (intentState.renderTasks.size > 0) {\n return;\n }\n // Don't immediately abort parsing on the worker-thread when rendering is\n // cancelled, since that will unnecessarily delay re-rendering when (for\n // partially parsed pages) e.g. zooming/rotation occurs in the viewer.\n if (reason instanceof RenderingCancelledException) {\n let delay = RENDERING_CANCELLED_TIMEOUT;\n if (reason.extraDelay > 0 && reason.extraDelay < /* ms = */ 1000) {\n // Above, we prevent the total delay from becoming arbitrarily large.\n delay += reason.extraDelay;\n }\n\n intentState.streamReaderCancelTimeout = setTimeout(() => {\n intentState.streamReaderCancelTimeout = null;\n this._abortOperatorList({ intentState, reason, force: true });\n }, delay);\n return;\n }\n }\n intentState.streamReader\n .cancel(new AbortException(reason.message))\n .catch(() => {\n // Avoid \"Uncaught promise\" messages in the console.\n });\n intentState.streamReader = null;\n\n if (this._transport.destroyed) {\n return; // Ignore any pending requests if the worker was terminated.\n }\n // Remove the current `intentState`, since a cancelled `getOperatorList`\n // call on the worker-thread cannot be re-started...\n for (const [curCacheKey, curIntentState] of this._intentStates) {\n if (curIntentState === intentState) {\n this._intentStates.delete(curCacheKey);\n break;\n }\n }\n // ... and force clean-up to ensure that any old state is always removed.\n this.cleanup();\n }\n\n /**\n * @type {StatTimer | null} Returns page stats, if enabled; returns `null`\n * otherwise.\n */\n get stats() {\n return this._stats;\n }\n}\n\nclass LoopbackPort {\n #listeners = new Map();\n\n #deferred = Promise.resolve();\n\n postMessage(obj, transfer) {\n const event = {\n data: structuredClone(obj, transfer ? { transfer } : null),\n };\n\n this.#deferred.then(() => {\n for (const [listener] of this.#listeners) {\n listener.call(this, event);\n }\n });\n }\n\n addEventListener(name, listener, options = null) {\n let rmAbort = null;\n if (options?.signal instanceof AbortSignal) {\n const { signal } = options;\n if (signal.aborted) {\n warn(\"LoopbackPort - cannot use an `aborted` signal.\");\n return;\n }\n const onAbort = () => this.removeEventListener(name, listener);\n rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n\n signal.addEventListener(\"abort\", onAbort);\n }\n this.#listeners.set(listener, rmAbort);\n }\n\n removeEventListener(name, listener) {\n const rmAbort = this.#listeners.get(listener);\n rmAbort?.();\n\n this.#listeners.delete(listener);\n }\n\n terminate() {\n for (const [, rmAbort] of this.#listeners) {\n rmAbort?.();\n }\n this.#listeners.clear();\n }\n}\n\n/**\n * @typedef {Object} PDFWorkerParameters\n * @property {string} [name] - The name of the worker.\n * @property {Worker} [port] - The `workerPort` object.\n * @property {number} [verbosity] - Controls the logging level;\n * the constants from {@link VerbosityLevel} should be used.\n */\n\n/**\n * PDF.js web worker abstraction that controls the instantiation of PDF\n * documents. Message handlers are used to pass information from the main\n * thread to the worker thread and vice versa. If the creation of a web\n * worker is not possible, a \"fake\" worker will be used instead.\n *\n * @param {PDFWorkerParameters} params - The worker initialization parameters.\n */\nclass PDFWorker {\n static #fakeWorkerId = 0;\n\n static #isWorkerDisabled = false;\n\n static #workerPorts;\n\n static {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n if (isNodeJS) {\n // Workers aren't supported in Node.js, force-disabling them there.\n this.#isWorkerDisabled = true;\n\n GlobalWorkerOptions.workerSrc ||= PDFJSDev.test(\"LIB\")\n ? \"../pdf.worker.js\"\n : \"./pdf.worker.mjs\";\n }\n\n // Check if URLs have the same origin. For non-HTTP based URLs, returns\n // false.\n this._isSameOrigin = (baseUrl, otherUrl) => {\n const base = URL.parse(baseUrl);\n if (!base?.origin || base.origin === \"null\") {\n return false; // non-HTTP url\n }\n const other = new URL(otherUrl, base);\n return base.origin === other.origin;\n };\n\n this._createCDNWrapper = url => {\n // We will rely on blob URL's property to specify origin.\n // We want this function to fail in case if createObjectURL or Blob do\n // not exist or fail for some reason -- our Worker creation will fail\n // anyway.\n const wrapper = `await import(\"${url}\");`;\n return URL.createObjectURL(\n new Blob([wrapper], { type: \"text/javascript\" })\n );\n };\n }\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n this._resetGlobalState = () => {\n this.#isWorkerDisabled = false;\n delete globalThis.pdfjsWorker;\n };\n }\n }\n\n constructor({\n name = null,\n port = null,\n verbosity = getVerbosityLevel(),\n } = {}) {\n this.name = name;\n this.destroyed = false;\n this.verbosity = verbosity;\n\n this._readyCapability = Promise.withResolvers();\n this._port = null;\n this._webWorker = null;\n this._messageHandler = null;\n\n if (\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n port\n ) {\n if (PDFWorker.#workerPorts?.has(port)) {\n throw new Error(\"Cannot use more than one PDFWorker per port.\");\n }\n (PDFWorker.#workerPorts ||= new WeakMap()).set(port, this);\n this._initializeFromPort(port);\n return;\n }\n this._initialize();\n }\n\n /**\n * Promise for worker initialization completion.\n * @type {Promise}\n */\n get promise() {\n return this._readyCapability.promise;\n }\n\n #resolve() {\n this._readyCapability.resolve();\n // Send global setting, e.g. verbosity level.\n this._messageHandler.send(\"configure\", {\n verbosity: this.verbosity,\n });\n }\n\n /**\n * The current `workerPort`, when it exists.\n * @type {Worker}\n */\n get port() {\n return this._port;\n }\n\n /**\n * The current MessageHandler-instance.\n * @type {MessageHandler}\n */\n get messageHandler() {\n return this._messageHandler;\n }\n\n _initializeFromPort(port) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _initializeFromPort\");\n }\n this._port = port;\n this._messageHandler = new MessageHandler(\"main\", \"worker\", port);\n this._messageHandler.on(\"ready\", function () {\n // Ignoring \"ready\" event -- MessageHandler should already be initialized\n // and ready to accept messages.\n });\n this.#resolve();\n }\n\n _initialize() {\n // If worker support isn't disabled explicit and the browser has worker\n // support, create a new web worker and test if it/the browser fulfills\n // all requirements to run parts of pdf.js in a web worker.\n // Right now, the requirement is, that an Uint8Array is still an\n // Uint8Array as it arrives on the worker.\n if (\n PDFWorker.#isWorkerDisabled ||\n PDFWorker.#mainThreadWorkerMessageHandler\n ) {\n this._setupFakeWorker();\n return;\n }\n let { workerSrc } = PDFWorker;\n\n try {\n // Wraps workerSrc path into blob URL, if the former does not belong\n // to the same origin.\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n !PDFWorker._isSameOrigin(window.location, workerSrc)\n ) {\n workerSrc = PDFWorker._createCDNWrapper(\n new URL(workerSrc, window.location).href\n );\n }\n\n const worker = new Worker(workerSrc, { type: \"module\" });\n const messageHandler = new MessageHandler(\"main\", \"worker\", worker);\n const terminateEarly = () => {\n ac.abort();\n messageHandler.destroy();\n worker.terminate();\n if (this.destroyed) {\n this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n } else {\n // Fall back to fake worker if the termination is caused by an\n // error (e.g. NetworkError / SecurityError).\n this._setupFakeWorker();\n }\n };\n\n const ac = new AbortController();\n worker.addEventListener(\n \"error\",\n () => {\n if (!this._webWorker) {\n // Worker failed to initialize due to an error. Clean up and fall\n // back to the fake worker.\n terminateEarly();\n }\n },\n { signal: ac.signal }\n );\n\n messageHandler.on(\"test\", data => {\n ac.abort();\n if (this.destroyed || !data) {\n terminateEarly();\n return;\n }\n this._messageHandler = messageHandler;\n this._port = worker;\n this._webWorker = worker;\n\n this.#resolve();\n });\n\n messageHandler.on(\"ready\", data => {\n ac.abort();\n if (this.destroyed) {\n terminateEarly();\n return;\n }\n try {\n sendTest();\n } catch {\n // We need fallback to a faked worker.\n this._setupFakeWorker();\n }\n });\n\n const sendTest = () => {\n const testObj = new Uint8Array();\n // Ensure that we can use `postMessage` transfers.\n messageHandler.send(\"test\", testObj, [testObj.buffer]);\n };\n\n // It might take time for the worker to initialize. We will try to send\n // the \"test\" message immediately, and once the \"ready\" message arrives.\n // The worker shall process only the first received \"test\" message.\n sendTest();\n return;\n } catch {\n info(\"The worker has been disabled.\");\n }\n // Either workers are not supported or have thrown an exception.\n // Thus, we fallback to a faked worker.\n this._setupFakeWorker();\n }\n\n _setupFakeWorker() {\n if (!PDFWorker.#isWorkerDisabled) {\n warn(\"Setting up fake worker.\");\n PDFWorker.#isWorkerDisabled = true;\n }\n\n PDFWorker._setupFakeWorkerGlobal\n .then(WorkerMessageHandler => {\n if (this.destroyed) {\n this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n return;\n }\n const port = new LoopbackPort();\n this._port = port;\n\n // All fake workers use the same port, making id unique.\n const id = `fake${PDFWorker.#fakeWorkerId++}`;\n\n // If the main thread is our worker, setup the handling for the\n // messages -- the main thread sends to it self.\n const workerHandler = new MessageHandler(id + \"_worker\", id, port);\n WorkerMessageHandler.setup(workerHandler, port);\n\n this._messageHandler = new MessageHandler(id, id + \"_worker\", port);\n this.#resolve();\n })\n .catch(reason => {\n this._readyCapability.reject(\n new Error(`Setting up fake worker failed: \"${reason.message}\".`)\n );\n });\n }\n\n /**\n * Destroys the worker instance.\n */\n destroy() {\n this.destroyed = true;\n\n // We need to terminate only web worker created resource.\n this._webWorker?.terminate();\n this._webWorker = null;\n\n PDFWorker.#workerPorts?.delete(this._port);\n this._port = null;\n\n this._messageHandler?.destroy();\n this._messageHandler = null;\n }\n\n /**\n * @param {PDFWorkerParameters} params - The worker initialization parameters.\n * @returns {PDFWorker}\n */\n static fromPort(params) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: fromPort\");\n }\n if (!params?.port) {\n throw new Error(\"PDFWorker.fromPort - invalid method signature.\");\n }\n const cachedPort = this.#workerPorts?.get(params.port);\n if (cachedPort) {\n if (cachedPort._pendingDestroy) {\n throw new Error(\n \"PDFWorker.fromPort - the worker is being destroyed.\\n\" +\n \"Please remember to await `PDFDocumentLoadingTask.destroy()`-calls.\"\n );\n }\n return cachedPort;\n }\n return new PDFWorker(params);\n }\n\n /**\n * The current `workerSrc`, when it exists.\n * @type {string}\n */\n static get workerSrc() {\n if (GlobalWorkerOptions.workerSrc) {\n return GlobalWorkerOptions.workerSrc;\n }\n throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n }\n\n static get #mainThreadWorkerMessageHandler() {\n try {\n return globalThis.pdfjsWorker?.WorkerMessageHandler || null;\n } catch {\n return null;\n }\n }\n\n // Loads worker code into the main-thread.\n static get _setupFakeWorkerGlobal() {\n const loader = async () => {\n if (this.#mainThreadWorkerMessageHandler) {\n // The worker was already loaded using e.g. a ` + + + + + + + +
    + +
    +
    +
    +
    + + + + +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + + +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + + + + +
    +
    +
    +
    + +
    + +
    + + + +
    +
    +
    + +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    + +
    + + + +
    + +
    + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    + +

    -

    +
    +
    + +

    -

    +
    +
    +
    + +

    -

    +
    +
    + +

    -

    +
    +
    + +

    -

    +
    +
    + +

    -

    +
    +
    + +

    -

    +
    +
    + +

    -

    +
    +
    + +

    -

    +
    +
    +
    + +

    -

    +
    +
    + +

    -

    +
    +
    + +

    -

    +
    +
    + +

    -

    +
    +
    +
    + +

    -

    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + + +
    + +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    + + + +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + +
    + + + +
    +
    +
    +
    +
    + + + + + +
    + +
    +
    + + + + +
    +
    + +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + + +
    + +
    +
    + + +
    +
    +
    + + +
    + +
    +
    + + 0% +
    +
    + +
    +
    +
    + + + +
    +
    + + diff --git a/public/plugins/pdfjs-5.2.133/web/viewer.mjs b/public/plugins/pdfjs-5.2.133/web/viewer.mjs new file mode 100644 index 00000000000..e4570337903 --- /dev/null +++ b/public/plugins/pdfjs-5.2.133/web/viewer.mjs @@ -0,0 +1,16974 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 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. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + + +;// ./web/pdfjs.js +const { + AbortException, + AnnotationEditorLayer, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationEditorUIManager, + AnnotationLayer, + AnnotationMode, + AnnotationType, + build, + ColorPicker, + createValidAbsoluteUrl, + DOMSVGFactory, + DrawLayer, + FeatureTest, + fetchData, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl: pdfjs_getPdfFilenameFromUrl, + getUuid, + getXfaPageViewport, + GlobalWorkerOptions, + ImageKind, + InvalidPDFException, + isDataScheme, + isPdfFile, + isValidExplicitDest, + MathClamp, + noContextMenu, + normalizeUnicode, + OPS, + OutputScale, + PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, + PermissionFlag, + PixelsPerInch, + RenderingCancelledException, + ResponseException, + setLayerDimensions, + shadow, + SignatureExtractor, + stopEvent, + SupportedImageMimeTypes, + TextLayer, + TouchManager, + updateUrlHash, + Util, + VerbosityLevel, + version, + XfaLayer +} = globalThis.pdfjsLib; + +;// ./web/ui_utils.js + +const DEFAULT_SCALE_VALUE = "auto"; +const DEFAULT_SCALE = 1.0; +const DEFAULT_SCALE_DELTA = 1.1; +const MIN_SCALE = 0.1; +const MAX_SCALE = 10.0; +const UNKNOWN_SCALE = 0; +const MAX_AUTO_SCALE = 1.25; +const SCROLLBAR_PADDING = 40; +const VERTICAL_PADDING = 5; +const RenderingStates = { + INITIAL: 0, + RUNNING: 1, + PAUSED: 2, + FINISHED: 3 +}; +const PresentationModeState = { + UNKNOWN: 0, + NORMAL: 1, + CHANGING: 2, + FULLSCREEN: 3 +}; +const SidebarView = { + UNKNOWN: -1, + NONE: 0, + THUMBS: 1, + OUTLINE: 2, + ATTACHMENTS: 3, + LAYERS: 4 +}; +const TextLayerMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_PERMISSIONS: 2 +}; +const ScrollMode = { + UNKNOWN: -1, + VERTICAL: 0, + HORIZONTAL: 1, + WRAPPED: 2, + PAGE: 3 +}; +const SpreadMode = { + UNKNOWN: -1, + NONE: 0, + ODD: 1, + EVEN: 2 +}; +const CursorTool = { + SELECT: 0, + HAND: 1, + ZOOM: 2 +}; +const AutoPrintRegExp = /\bprint\s*\(/; +function scrollIntoView(element, spot, scrollMatches = false) { + let parent = element.offsetParent; + if (!parent) { + console.error("offsetParent is not set -- cannot scroll"); + return; + } + let offsetY = element.offsetTop + element.clientTop; + let offsetX = element.offsetLeft + element.clientLeft; + while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || scrollMatches && (parent.classList.contains("markedContent") || getComputedStyle(parent).overflow === "hidden")) { + offsetY += parent.offsetTop; + offsetX += parent.offsetLeft; + parent = parent.offsetParent; + if (!parent) { + return; + } + } + if (spot) { + if (spot.top !== undefined) { + offsetY += spot.top; + } + if (spot.left !== undefined) { + offsetX += spot.left; + parent.scrollLeft = offsetX; + } + } + parent.scrollTop = offsetY; +} +function watchScroll(viewAreaElement, callback, abortSignal = undefined) { + const debounceScroll = function (evt) { + if (rAF) { + return; + } + rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { + rAF = null; + const currentX = viewAreaElement.scrollLeft; + const lastX = state.lastX; + if (currentX !== lastX) { + state.right = currentX > lastX; + } + state.lastX = currentX; + const currentY = viewAreaElement.scrollTop; + const lastY = state.lastY; + if (currentY !== lastY) { + state.down = currentY > lastY; + } + state.lastY = currentY; + callback(state); + }); + }; + const state = { + right: true, + down: true, + lastX: viewAreaElement.scrollLeft, + lastY: viewAreaElement.scrollTop, + _eventHandler: debounceScroll + }; + let rAF = null; + viewAreaElement.addEventListener("scroll", debounceScroll, { + useCapture: true, + signal: abortSignal + }); + abortSignal?.addEventListener("abort", () => window.cancelAnimationFrame(rAF), { + once: true + }); + return state; +} +function parseQueryString(query) { + const params = new Map(); + for (const [key, value] of new URLSearchParams(query)) { + params.set(key.toLowerCase(), value); + } + return params; +} +const InvisibleCharsRegExp = /[\x00-\x1F]/g; +function removeNullCharacters(str, replaceInvisible = false) { + if (!InvisibleCharsRegExp.test(str)) { + return str; + } + if (replaceInvisible) { + return str.replaceAll(InvisibleCharsRegExp, m => m === "\x00" ? "" : " "); + } + return str.replaceAll("\x00", ""); +} +function binarySearchFirstItem(items, condition, start = 0) { + let minIndex = start; + let maxIndex = items.length - 1; + if (maxIndex < 0 || !condition(items[maxIndex])) { + return items.length; + } + if (condition(items[minIndex])) { + return minIndex; + } + while (minIndex < maxIndex) { + const currentIndex = minIndex + maxIndex >> 1; + const currentItem = items[currentIndex]; + if (condition(currentItem)) { + maxIndex = currentIndex; + } else { + minIndex = currentIndex + 1; + } + } + return minIndex; +} +function approximateFraction(x) { + if (Math.floor(x) === x) { + return [x, 1]; + } + const xinv = 1 / x; + const limit = 8; + if (xinv > limit) { + return [1, limit]; + } else if (Math.floor(xinv) === xinv) { + return [1, xinv]; + } + const x_ = x > 1 ? xinv : x; + let a = 0, + b = 1, + c = 1, + d = 1; + while (true) { + const p = a + c, + q = b + d; + if (q > limit) { + break; + } + if (x_ <= p / q) { + c = p; + d = q; + } else { + a = p; + b = q; + } + } + let result; + if (x_ - a / b < c / d - x_) { + result = x_ === x ? [a, b] : [b, a]; + } else { + result = x_ === x ? [c, d] : [d, c]; + } + return result; +} +function floorToDivide(x, div) { + return x - x % div; +} +function getPageSizeInches({ + view, + userUnit, + rotate +}) { + const [x1, y1, x2, y2] = view; + const changeOrientation = rotate % 180 !== 0; + const width = (x2 - x1) / 72 * userUnit; + const height = (y2 - y1) / 72 * userUnit; + return { + width: changeOrientation ? height : width, + height: changeOrientation ? width : height + }; +} +function backtrackBeforeAllVisibleElements(index, views, top) { + if (index < 2) { + return index; + } + let elt = views[index].div; + let pageTop = elt.offsetTop + elt.clientTop; + if (pageTop >= top) { + elt = views[index - 1].div; + pageTop = elt.offsetTop + elt.clientTop; + } + for (let i = index - 2; i >= 0; --i) { + elt = views[i].div; + if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) { + break; + } + index = i; + } + return index; +} +function getVisibleElements({ + scrollEl, + views, + sortByVisibility = false, + horizontal = false, + rtl = false +}) { + const top = scrollEl.scrollTop, + bottom = top + scrollEl.clientHeight; + const left = scrollEl.scrollLeft, + right = left + scrollEl.clientWidth; + function isElementBottomAfterViewTop(view) { + const element = view.div; + const elementBottom = element.offsetTop + element.clientTop + element.clientHeight; + return elementBottom > top; + } + function isElementNextAfterViewHorizontally(view) { + const element = view.div; + const elementLeft = element.offsetLeft + element.clientLeft; + const elementRight = elementLeft + element.clientWidth; + return rtl ? elementLeft < right : elementRight > left; + } + const visible = [], + ids = new Set(), + numViews = views.length; + let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop); + if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) { + firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top); + } + let lastEdge = horizontal ? right : -1; + for (let i = firstVisibleElementInd; i < numViews; i++) { + const view = views[i], + element = view.div; + const currentWidth = element.offsetLeft + element.clientLeft; + const currentHeight = element.offsetTop + element.clientTop; + const viewWidth = element.clientWidth, + viewHeight = element.clientHeight; + const viewRight = currentWidth + viewWidth; + const viewBottom = currentHeight + viewHeight; + if (lastEdge === -1) { + if (viewBottom >= bottom) { + lastEdge = viewBottom; + } + } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) { + break; + } + if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) { + continue; + } + const minY = Math.max(0, top - currentHeight); + const minX = Math.max(0, left - currentWidth); + const hiddenHeight = minY + Math.max(0, viewBottom - bottom); + const hiddenWidth = minX + Math.max(0, viewRight - right); + const fractionHeight = (viewHeight - hiddenHeight) / viewHeight, + fractionWidth = (viewWidth - hiddenWidth) / viewWidth; + const percent = fractionHeight * fractionWidth * 100 | 0; + visible.push({ + id: view.id, + x: currentWidth, + y: currentHeight, + visibleArea: percent === 100 ? null : { + minX, + minY, + maxX: Math.min(viewRight, right) - currentWidth, + maxY: Math.min(viewBottom, bottom) - currentHeight + }, + view, + percent, + widthPercent: fractionWidth * 100 | 0 + }); + ids.add(view.id); + } + const first = visible[0], + last = visible.at(-1); + if (sortByVisibility) { + visible.sort(function (a, b) { + const pc = a.percent - b.percent; + if (Math.abs(pc) > 0.001) { + return -pc; + } + return a.id - b.id; + }); + } + return { + first, + last, + views: visible, + ids + }; +} +function normalizeWheelEventDirection(evt) { + let delta = Math.hypot(evt.deltaX, evt.deltaY); + const angle = Math.atan2(evt.deltaY, evt.deltaX); + if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { + delta = -delta; + } + return delta; +} +function normalizeWheelEventDelta(evt) { + const deltaMode = evt.deltaMode; + let delta = normalizeWheelEventDirection(evt); + const MOUSE_PIXELS_PER_LINE = 30; + const MOUSE_LINES_PER_PAGE = 30; + if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) { + delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE; + } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) { + delta /= MOUSE_LINES_PER_PAGE; + } + return delta; +} +function isValidRotation(angle) { + return Number.isInteger(angle) && angle % 90 === 0; +} +function isValidScrollMode(mode) { + return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN; +} +function isValidSpreadMode(mode) { + return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN; +} +function isPortraitOrientation(size) { + return size.width <= size.height; +} +const animationStarted = new Promise(function (resolve) { + window.requestAnimationFrame(resolve); +}); +const docStyle = document.documentElement.style; +class ProgressBar { + #classList = null; + #disableAutoFetchTimeout = null; + #percent = 0; + #style = null; + #visible = true; + constructor(bar) { + this.#classList = bar.classList; + this.#style = bar.style; + } + get percent() { + return this.#percent; + } + set percent(val) { + this.#percent = MathClamp(val, 0, 100); + if (isNaN(val)) { + this.#classList.add("indeterminate"); + return; + } + this.#classList.remove("indeterminate"); + this.#style.setProperty("--progressBar-percent", `${this.#percent}%`); + } + setWidth(viewer) { + if (!viewer) { + return; + } + const container = viewer.parentNode; + const scrollbarWidth = container.offsetWidth - viewer.offsetWidth; + if (scrollbarWidth > 0) { + this.#style.setProperty("--progressBar-end-offset", `${scrollbarWidth}px`); + } + } + setDisableAutoFetch(delay = 5000) { + if (this.#percent === 100 || isNaN(this.#percent)) { + return; + } + if (this.#disableAutoFetchTimeout) { + clearTimeout(this.#disableAutoFetchTimeout); + } + this.show(); + this.#disableAutoFetchTimeout = setTimeout(() => { + this.#disableAutoFetchTimeout = null; + this.hide(); + }, delay); + } + hide() { + if (!this.#visible) { + return; + } + this.#visible = false; + this.#classList.add("hidden"); + } + show() { + if (this.#visible) { + return; + } + this.#visible = true; + this.#classList.remove("hidden"); + } +} +function getActiveOrFocusedElement() { + let curRoot = document; + let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + while (curActiveOrFocused?.shadowRoot) { + curRoot = curActiveOrFocused.shadowRoot; + curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + } + return curActiveOrFocused; +} +function apiPageLayoutToViewerModes(layout) { + let scrollMode = ScrollMode.VERTICAL, + spreadMode = SpreadMode.NONE; + switch (layout) { + case "SinglePage": + scrollMode = ScrollMode.PAGE; + break; + case "OneColumn": + break; + case "TwoPageLeft": + scrollMode = ScrollMode.PAGE; + case "TwoColumnLeft": + spreadMode = SpreadMode.ODD; + break; + case "TwoPageRight": + scrollMode = ScrollMode.PAGE; + case "TwoColumnRight": + spreadMode = SpreadMode.EVEN; + break; + } + return { + scrollMode, + spreadMode + }; +} +function apiPageModeToSidebarView(mode) { + switch (mode) { + case "UseNone": + return SidebarView.NONE; + case "UseThumbs": + return SidebarView.THUMBS; + case "UseOutlines": + return SidebarView.OUTLINE; + case "UseAttachments": + return SidebarView.ATTACHMENTS; + case "UseOC": + return SidebarView.LAYERS; + } + return SidebarView.NONE; +} +function toggleCheckedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-checked", toggle); + view?.classList.toggle("hidden", !toggle); +} +function toggleExpandedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-expanded", toggle); + view?.classList.toggle("hidden", !toggle); +} +const calcRound = function () { + const e = document.createElement("div"); + e.style.width = "round(down, calc(1.6666666666666665 * 792px), 1px)"; + return e.style.width === "calc(1320px)" ? Math.fround : x => x; +}(); + +;// ./web/app_options.js +{ + var compatParams = new Map(); + const userAgent = navigator.userAgent || ""; + const platform = navigator.platform || ""; + const maxTouchPoints = navigator.maxTouchPoints || 1; + const isAndroid = /Android/.test(userAgent); + const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1; + (function () { + if (isIOS || isAndroid) { + compatParams.set("maxCanvasPixels", 5242880); + } + })(); + (function () { + if (isAndroid) { + compatParams.set("useSystemFonts", false); + } + })(); +} +const OptionKind = { + BROWSER: 0x01, + VIEWER: 0x02, + API: 0x04, + WORKER: 0x08, + EVENT_DISPATCH: 0x10, + PREFERENCE: 0x80 +}; +const Type = { + BOOLEAN: 0x01, + NUMBER: 0x02, + OBJECT: 0x04, + STRING: 0x08, + UNDEFINED: 0x10 +}; +const defaultOptions = { + allowedGlobalEvents: { + value: null, + kind: OptionKind.BROWSER + }, + canvasMaxAreaInBytes: { + value: -1, + kind: OptionKind.BROWSER + OptionKind.API + }, + isInAutomation: { + value: false, + kind: OptionKind.BROWSER + }, + localeProperties: { + value: { + lang: navigator.language || "en-US" + }, + kind: OptionKind.BROWSER + }, + maxCanvasDim: { + value: 32767, + kind: OptionKind.BROWSER + OptionKind.VIEWER + }, + nimbusDataStr: { + value: "", + kind: OptionKind.BROWSER + }, + supportsCaretBrowsingMode: { + value: false, + kind: OptionKind.BROWSER + }, + supportsDocumentFonts: { + value: true, + kind: OptionKind.BROWSER + }, + supportsIntegratedFind: { + value: false, + kind: OptionKind.BROWSER + }, + supportsMouseWheelZoomCtrlKey: { + value: true, + kind: OptionKind.BROWSER + }, + supportsMouseWheelZoomMetaKey: { + value: true, + kind: OptionKind.BROWSER + }, + supportsPinchToZoom: { + value: true, + kind: OptionKind.BROWSER + }, + supportsPrinting: { + value: true, + kind: OptionKind.BROWSER + }, + toolbarDensity: { + value: 0, + kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH + }, + altTextLearnMoreUrl: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + annotationEditorMode: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + annotationMode: { + value: 2, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cursorToolOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + debuggerSrc: { + value: "./debugger.mjs", + kind: OptionKind.VIEWER + }, + defaultZoomDelay: { + value: 400, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + defaultZoomValue: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + disableHistory: { + value: false, + kind: OptionKind.VIEWER + }, + disablePageLabels: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableAltText: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableAltTextModelDownload: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH + }, + enableAutoLinking: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableDetailCanvas: { + value: true, + kind: OptionKind.VIEWER + }, + enableGuessAltText: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH + }, + enableHighlightFloatingButton: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableNewAltTextWhenAddingImage: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePermissions: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePrintAutoRotate: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableScripting: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableSignatureEditor: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableUpdatedAddImage: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + externalLinkRel: { + value: "noopener noreferrer nofollow", + kind: OptionKind.VIEWER + }, + externalLinkTarget: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + highlightEditorColors: { + value: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + historyUpdateUrl: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + ignoreDestinationZoom: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + imageResourcesPath: { + value: "./images/", + kind: OptionKind.VIEWER + }, + maxCanvasPixels: { + value: 2 ** 25, + kind: OptionKind.VIEWER + }, + forcePageColors: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsBackground: { + value: "Canvas", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsForeground: { + value: "CanvasText", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pdfBugEnabled: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + printResolution: { + value: 150, + kind: OptionKind.VIEWER + }, + sidebarViewOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + scrollModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + spreadModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + textLayerMode: { + value: 1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewerCssTheme: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cMapPacked: { + value: true, + kind: OptionKind.API + }, + cMapUrl: { + value: "../web/cmaps/", + kind: OptionKind.API + }, + disableAutoFetch: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableFontFace: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableRange: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableStream: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + docBaseUrl: { + value: "", + kind: OptionKind.API + }, + enableHWA: { + value: true, + kind: OptionKind.API + OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableXfa: { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + fontExtraProperties: { + value: false, + kind: OptionKind.API + }, + iccUrl: { + value: "../web/iccs/", + kind: OptionKind.API + }, + isEvalSupported: { + value: true, + kind: OptionKind.API + }, + isOffscreenCanvasSupported: { + value: true, + kind: OptionKind.API + }, + maxImageSize: { + value: -1, + kind: OptionKind.API + }, + pdfBug: { + value: false, + kind: OptionKind.API + }, + standardFontDataUrl: { + value: "../web/standard_fonts/", + kind: OptionKind.API + }, + useSystemFonts: { + value: undefined, + kind: OptionKind.API, + type: Type.BOOLEAN + Type.UNDEFINED + }, + verbosity: { + value: 1, + kind: OptionKind.API + }, + wasmUrl: { + value: "../web/wasm/", + kind: OptionKind.API + }, + workerPort: { + value: null, + kind: OptionKind.WORKER + }, + workerSrc: { + value: "../build/pdf.worker.mjs", + kind: OptionKind.WORKER + } +}; +{ + defaultOptions.defaultUrl = { + value: "compressed.tracemonkey-pldi-09.pdf", + kind: OptionKind.VIEWER + }; + defaultOptions.sandboxBundleSrc = { + value: "../build/pdf.sandbox.mjs", + kind: OptionKind.VIEWER + }; + defaultOptions.enableFakeMLManager = { + value: true, + kind: OptionKind.VIEWER + }; +} +{ + defaultOptions.disablePreferences = { + value: false, + kind: OptionKind.VIEWER + }; +} +class AppOptions { + static eventBus; + static #opts = new Map(); + static { + for (const name in defaultOptions) { + this.#opts.set(name, defaultOptions[name].value); + } + for (const [name, value] of compatParams) { + this.#opts.set(name, value); + } + this._hasInvokedSet = false; + this._checkDisablePreferences = () => { + if (this.get("disablePreferences")) { + return true; + } + if (this._hasInvokedSet) { + console.warn("The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option to prevent that.'); + } + return false; + }; + } + static get(name) { + return this.#opts.get(name); + } + static getAll(kind = null, defaultOnly = false) { + const options = Object.create(null); + for (const name in defaultOptions) { + const defaultOpt = defaultOptions[name]; + if (kind && !(kind & defaultOpt.kind)) { + continue; + } + options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value; + } + return options; + } + static set(name, value) { + this.setAll({ + [name]: value + }); + } + static setAll(options, prefs = false) { + this._hasInvokedSet ||= true; + let events; + for (const name in options) { + const defaultOpt = defaultOptions[name], + userOpt = options[name]; + if (!defaultOpt || !(typeof userOpt === typeof defaultOpt.value || Type[(typeof userOpt).toUpperCase()] & defaultOpt.type)) { + continue; + } + const { + kind + } = defaultOpt; + if (prefs && !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)) { + continue; + } + if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) { + (events ||= new Map()).set(name, userOpt); + } + this.#opts.set(name, userOpt); + } + if (events) { + for (const [name, value] of events) { + this.eventBus.dispatch(name.toLowerCase(), { + source: this, + value + }); + } + } + } +} + +;// ./web/pdf_link_service.js + + +const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; +const LinkTarget = { + NONE: 0, + SELF: 1, + BLANK: 2, + PARENT: 3, + TOP: 4 +}; +class PDFLinkService { + externalLinkEnabled = true; + constructor({ + eventBus, + externalLinkTarget = null, + externalLinkRel = null, + ignoreDestinationZoom = false + } = {}) { + this.eventBus = eventBus; + this.externalLinkTarget = externalLinkTarget; + this.externalLinkRel = externalLinkRel; + this._ignoreDestinationZoom = ignoreDestinationZoom; + this.baseUrl = null; + this.pdfDocument = null; + this.pdfViewer = null; + this.pdfHistory = null; + } + setDocument(pdfDocument, baseUrl = null) { + this.baseUrl = baseUrl; + this.pdfDocument = pdfDocument; + } + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + setHistory(pdfHistory) { + this.pdfHistory = pdfHistory; + } + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + } + get page() { + return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1; + } + set page(value) { + if (this.pdfDocument) { + this.pdfViewer.currentPageNumber = value; + } + } + get rotation() { + return this.pdfDocument ? this.pdfViewer.pagesRotation : 0; + } + set rotation(value) { + if (this.pdfDocument) { + this.pdfViewer.pagesRotation = value; + } + } + get isInPresentationMode() { + return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false; + } + async goToDestination(dest) { + if (!this.pdfDocument) { + return; + } + let namedDest, explicitDest, pageNumber; + if (typeof dest === "string") { + namedDest = dest; + explicitDest = await this.pdfDocument.getDestination(dest); + } else { + namedDest = null; + explicitDest = await dest; + } + if (!Array.isArray(explicitDest)) { + console.error(`goToDestination: "${explicitDest}" is not a valid destination array, for dest="${dest}".`); + return; + } + const [destRef] = explicitDest; + if (destRef && typeof destRef === "object") { + pageNumber = this.pdfDocument.cachedPageNumber(destRef); + if (!pageNumber) { + try { + pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1; + } catch { + console.error(`goToDestination: "${destRef}" is not a valid page reference, for dest="${dest}".`); + return; + } + } + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) { + console.error(`goToDestination: "${pageNumber}" is not a valid page number, for dest="${dest}".`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.push({ + namedDest, + explicitDest, + pageNumber + }); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber, + destArray: explicitDest, + ignoreDestinationZoom: this._ignoreDestinationZoom + }); + } + goToPage(val) { + if (!this.pdfDocument) { + return; + } + const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0; + if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { + console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.pushPage(pageNumber); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber + }); + } + addLinkAttributes(link, url, newWindow = false) { + if (!url || typeof url !== "string") { + throw new Error('A valid "url" parameter must provided.'); + } + const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget, + rel = this.externalLinkRel; + if (this.externalLinkEnabled) { + link.href = link.title = url; + } else { + link.href = ""; + link.title = `Disabled: ${url}`; + link.onclick = () => false; + } + let targetStr = ""; + switch (target) { + case LinkTarget.NONE: + break; + case LinkTarget.SELF: + targetStr = "_self"; + break; + case LinkTarget.BLANK: + targetStr = "_blank"; + break; + case LinkTarget.PARENT: + targetStr = "_parent"; + break; + case LinkTarget.TOP: + targetStr = "_top"; + break; + } + link.target = targetStr; + link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL; + } + getDestinationHash(dest) { + if (typeof dest === "string") { + if (dest.length > 0) { + return this.getAnchorUrl("#" + escape(dest)); + } + } else if (Array.isArray(dest)) { + const str = JSON.stringify(dest); + if (str.length > 0) { + return this.getAnchorUrl("#" + escape(str)); + } + } + return this.getAnchorUrl(""); + } + getAnchorUrl(anchor) { + return this.baseUrl ? this.baseUrl + anchor : anchor; + } + setHash(hash) { + if (!this.pdfDocument) { + return; + } + let pageNumber, dest; + if (hash.includes("=")) { + const params = parseQueryString(hash); + if (params.has("search")) { + const query = params.get("search").replaceAll('"', ""), + phrase = params.get("phrase") === "true"; + this.eventBus.dispatch("findfromurlhash", { + source: this, + query: phrase ? query : query.match(/\S+/g) + }); + } + if (params.has("page")) { + pageNumber = params.get("page") | 0 || 1; + } + if (params.has("zoom")) { + const zoomArgs = params.get("zoom").split(","); + const zoomArg = zoomArgs[0]; + const zoomArgNumber = parseFloat(zoomArg); + if (!zoomArg.includes("Fit")) { + 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: pageNumber || this.page, + destArray: dest, + allowNegativeOffset: true + }); + } else if (pageNumber) { + this.page = pageNumber; + } + if (params.has("pagemode")) { + this.eventBus.dispatch("pagemode", { + source: this, + mode: params.get("pagemode") + }); + } + if (params.has("nameddest")) { + this.goToDestination(params.get("nameddest")); + } + return; + } + dest = unescape(hash); + try { + dest = JSON.parse(dest); + if (!Array.isArray(dest)) { + dest = dest.toString(); + } + } catch {} + if (typeof dest === "string" || isValidExplicitDest(dest)) { + this.goToDestination(dest); + return; + } + console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`); + } + executeNamedAction(action) { + if (!this.pdfDocument) { + return; + } + switch (action) { + case "GoBack": + this.pdfHistory?.back(); + break; + case "GoForward": + this.pdfHistory?.forward(); + break; + case "NextPage": + this.pdfViewer.nextPage(); + break; + case "PrevPage": + this.pdfViewer.previousPage(); + break; + case "LastPage": + this.page = this.pagesCount; + break; + case "FirstPage": + this.page = 1; + break; + default: + break; + } + this.eventBus.dispatch("namedaction", { + source: this, + action + }); + } + async executeSetOCGState(action) { + if (!this.pdfDocument) { + return; + } + const pdfDocument = this.pdfDocument, + optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise; + if (pdfDocument !== this.pdfDocument) { + return; + } + optionalContentConfig.setOCGState(action); + this.pdfViewer.optionalContentConfigPromise = Promise.resolve(optionalContentConfig); + } +} +class SimpleLinkService extends PDFLinkService { + setDocument(pdfDocument, baseUrl = null) {} +} + +;// ./web/event_utils.js +const WaitOnType = { + EVENT: "event", + TIMEOUT: "timeout" +}; +async function waitOnEventOrTimeout({ + target, + name, + delay = 0 +}) { + if (typeof target !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) { + throw new Error("waitOnEventOrTimeout - invalid parameters."); + } + const { + promise, + resolve + } = Promise.withResolvers(); + const ac = new AbortController(); + function handler(type) { + ac.abort(); + clearTimeout(timeout); + resolve(type); + } + const evtMethod = target instanceof EventBus ? "_on" : "addEventListener"; + target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), { + signal: ac.signal + }); + const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay); + return promise; +} +class EventBus { + #listeners = Object.create(null); + on(eventName, listener, options = null) { + this._on(eventName, listener, { + external: true, + once: options?.once, + signal: options?.signal + }); + } + off(eventName, listener, options = null) { + this._off(eventName, listener); + } + dispatch(eventName, data) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners || eventListeners.length === 0) { + return; + } + let externalListeners; + for (const { + listener, + external, + once + } of eventListeners.slice(0)) { + if (once) { + this._off(eventName, listener); + } + if (external) { + (externalListeners ||= []).push(listener); + continue; + } + listener(data); + } + if (externalListeners) { + for (const listener of externalListeners) { + listener(data); + } + externalListeners = null; + } + } + _on(eventName, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + console.error("Cannot use an `aborted` signal."); + return; + } + const onAbort = () => this._off(eventName, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + const eventListeners = this.#listeners[eventName] ||= []; + eventListeners.push({ + listener, + external: options?.external === true, + once: options?.once === true, + rmAbort + }); + } + _off(eventName, listener, options = null) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners) { + return; + } + for (let i = 0, ii = eventListeners.length; i < ii; i++) { + const evt = eventListeners[i]; + if (evt.listener === listener) { + evt.rmAbort?.(); + eventListeners.splice(i, 1); + return; + } + } + } +} +class FirefoxEventBus extends EventBus { + #externalServices; + #globalEventNames; + #isInAutomation; + constructor(globalEventNames, externalServices, isInAutomation) { + super(); + this.#globalEventNames = globalEventNames; + this.#externalServices = externalServices; + this.#isInAutomation = isInAutomation; + } + dispatch(eventName, data) { + throw new Error("Not implemented: FirefoxEventBus.dispatch"); + } +} + +;// ./web/external_services.js +class BaseExternalServices { + updateFindControlState(data) {} + updateFindMatchesCount(data) {} + initPassiveLoading() {} + reportTelemetry(data) {} + async createL10n() { + throw new Error("Not implemented: createL10n"); + } + createScripting() { + throw new Error("Not implemented: createScripting"); + } + createSignatureStorage() { + throw new Error("Not implemented: createSignatureStorage"); + } + updateEditorStates(data) { + throw new Error("Not implemented: updateEditorStates"); + } + dispatchGlobalEvent(_event) {} +} + +;// ./web/preferences.js + +class BasePreferences { + #defaults = Object.freeze({ + altTextLearnMoreUrl: "", + annotationEditorMode: 0, + annotationMode: 2, + cursorToolOnLoad: 0, + defaultZoomDelay: 400, + defaultZoomValue: "", + disablePageLabels: false, + enableAltText: false, + enableAltTextModelDownload: true, + enableAutoLinking: true, + enableGuessAltText: true, + enableHighlightFloatingButton: false, + enableNewAltTextWhenAddingImage: true, + enablePermissions: false, + enablePrintAutoRotate: true, + enableScripting: true, + enableSignatureEditor: false, + enableUpdatedAddImage: false, + externalLinkTarget: 0, + highlightEditorColors: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F", + historyUpdateUrl: false, + ignoreDestinationZoom: false, + forcePageColors: false, + pageColorsBackground: "Canvas", + pageColorsForeground: "CanvasText", + pdfBugEnabled: false, + sidebarViewOnLoad: -1, + scrollModeOnLoad: -1, + spreadModeOnLoad: -1, + textLayerMode: 1, + viewerCssTheme: 0, + viewOnLoad: 0, + disableAutoFetch: false, + disableFontFace: false, + disableRange: false, + disableStream: false, + enableHWA: true, + enableXfa: true + }); + #initializedPromise = null; + constructor() { + this.#initializedPromise = this._readFromStorage(this.#defaults).then(({ + browserPrefs, + prefs + }) => { + if (AppOptions._checkDisablePreferences()) { + return; + } + AppOptions.setAll({ + ...browserPrefs, + ...prefs + }, true); + }); + } + async _writeToStorage(prefObj) { + throw new Error("Not implemented: _writeToStorage"); + } + async _readFromStorage(prefObj) { + throw new Error("Not implemented: _readFromStorage"); + } + async reset() { + await this.#initializedPromise; + AppOptions.setAll(this.#defaults, true); + await this._writeToStorage(this.#defaults); + } + async set(name, value) { + await this.#initializedPromise; + AppOptions.setAll({ + [name]: value + }, true); + await this._writeToStorage(AppOptions.getAll(OptionKind.PREFERENCE)); + } + async get(name) { + await this.#initializedPromise; + return AppOptions.get(name); + } + get initializedPromise() { + return this.#initializedPromise; + } +} + +;// ./node_modules/@fluent/bundle/esm/types.js +class FluentType { + constructor(value) { + this.value = value; + } + valueOf() { + return this.value; + } +} +class FluentNone extends FluentType { + constructor(value = "???") { + super(value); + } + toString(scope) { + return `{${this.value}}`; + } +} +class FluentNumber extends FluentType { + constructor(value, opts = {}) { + super(value); + this.opts = opts; + } + toString(scope) { + if (scope) { + try { + const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts); + return nf.format(this.value); + } catch (err) { + scope.reportError(err); + } + } + return this.value.toString(10); + } +} +class FluentDateTime extends FluentType { + static supportsValue(value) { + if (typeof value === "number") return true; + if (value instanceof Date) return true; + if (value instanceof FluentType) return FluentDateTime.supportsValue(value.valueOf()); + if ("Temporal" in globalThis) { + const _Temporal = globalThis.Temporal; + if (value instanceof _Temporal.Instant || value instanceof _Temporal.PlainDateTime || value instanceof _Temporal.PlainDate || value instanceof _Temporal.PlainMonthDay || value instanceof _Temporal.PlainTime || value instanceof _Temporal.PlainYearMonth) { + return true; + } + } + return false; + } + constructor(value, opts = {}) { + if (value instanceof FluentDateTime) { + opts = { + ...value.opts, + ...opts + }; + value = value.value; + } else if (value instanceof FluentType) { + value = value.valueOf(); + } + if (typeof value === "object" && "calendarId" in value && opts.calendar === undefined) { + opts = { + ...opts, + calendar: value.calendarId + }; + } + super(value); + this.opts = opts; + } + [Symbol.toPrimitive](hint) { + return hint === "string" ? this.toString() : this.toNumber(); + } + toNumber() { + const value = this.value; + if (typeof value === "number") return value; + if (value instanceof Date) return value.getTime(); + if ("epochMilliseconds" in value) { + return value.epochMilliseconds; + } + if ("toZonedDateTime" in value) { + return value.toZonedDateTime("UTC").epochMilliseconds; + } + throw new TypeError("Unwrapping a non-number value as a number"); + } + toString(scope) { + if (scope) { + try { + const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts); + return dtf.format(this.value); + } catch (err) { + scope.reportError(err); + } + } + if (typeof this.value === "number" || this.value instanceof Date) { + return new Date(this.value).toISOString(); + } + return this.value.toString(); + } +} +;// ./node_modules/@fluent/bundle/esm/resolver.js + +const MAX_PLACEABLES = 100; +const FSI = "\u2068"; +const PDI = "\u2069"; +function match(scope, selector, key) { + if (key === selector) { + return true; + } + if (key instanceof FluentNumber && selector instanceof FluentNumber && key.value === selector.value) { + return true; + } + if (selector instanceof FluentNumber && typeof key === "string") { + let category = scope.memoizeIntlObject(Intl.PluralRules, selector.opts).select(selector.value); + if (key === category) { + return true; + } + } + return false; +} +function getDefault(scope, variants, star) { + if (variants[star]) { + return resolvePattern(scope, variants[star].value); + } + scope.reportError(new RangeError("No default")); + return new FluentNone(); +} +function getArguments(scope, args) { + const positional = []; + const named = Object.create(null); + for (const arg of args) { + if (arg.type === "narg") { + named[arg.name] = resolveExpression(scope, arg.value); + } else { + positional.push(resolveExpression(scope, arg)); + } + } + return { + positional, + named + }; +} +function resolveExpression(scope, expr) { + switch (expr.type) { + case "str": + return expr.value; + case "num": + return new FluentNumber(expr.value, { + minimumFractionDigits: expr.precision + }); + case "var": + return resolveVariableReference(scope, expr); + case "mesg": + return resolveMessageReference(scope, expr); + case "term": + return resolveTermReference(scope, expr); + case "func": + return resolveFunctionReference(scope, expr); + case "select": + return resolveSelectExpression(scope, expr); + default: + return new FluentNone(); + } +} +function resolveVariableReference(scope, { + name +}) { + let arg; + if (scope.params) { + if (Object.prototype.hasOwnProperty.call(scope.params, name)) { + arg = scope.params[name]; + } else { + return new FluentNone(`$${name}`); + } + } else if (scope.args && Object.prototype.hasOwnProperty.call(scope.args, name)) { + arg = scope.args[name]; + } else { + scope.reportError(new ReferenceError(`Unknown variable: $${name}`)); + return new FluentNone(`$${name}`); + } + if (arg instanceof FluentType) { + return arg; + } + switch (typeof arg) { + case "string": + return arg; + case "number": + return new FluentNumber(arg); + case "object": + if (FluentDateTime.supportsValue(arg)) { + return new FluentDateTime(arg); + } + default: + scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`)); + return new FluentNone(`$${name}`); + } +} +function resolveMessageReference(scope, { + name, + attr +}) { + const message = scope.bundle._messages.get(name); + if (!message) { + scope.reportError(new ReferenceError(`Unknown message: ${name}`)); + return new FluentNone(name); + } + if (attr) { + const attribute = message.attributes[attr]; + if (attribute) { + return resolvePattern(scope, attribute); + } + scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`)); + return new FluentNone(`${name}.${attr}`); + } + if (message.value) { + return resolvePattern(scope, message.value); + } + scope.reportError(new ReferenceError(`No value: ${name}`)); + return new FluentNone(name); +} +function resolveTermReference(scope, { + name, + attr, + args +}) { + const id = `-${name}`; + const term = scope.bundle._terms.get(id); + if (!term) { + scope.reportError(new ReferenceError(`Unknown term: ${id}`)); + return new FluentNone(id); + } + if (attr) { + const attribute = term.attributes[attr]; + if (attribute) { + scope.params = getArguments(scope, args).named; + const resolved = resolvePattern(scope, attribute); + scope.params = null; + return resolved; + } + scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`)); + return new FluentNone(`${id}.${attr}`); + } + scope.params = getArguments(scope, args).named; + const resolved = resolvePattern(scope, term.value); + scope.params = null; + return resolved; +} +function resolveFunctionReference(scope, { + name, + args +}) { + let func = scope.bundle._functions[name]; + if (!func) { + scope.reportError(new ReferenceError(`Unknown function: ${name}()`)); + return new FluentNone(`${name}()`); + } + if (typeof func !== "function") { + scope.reportError(new TypeError(`Function ${name}() is not callable`)); + return new FluentNone(`${name}()`); + } + try { + let resolved = getArguments(scope, args); + return func(resolved.positional, resolved.named); + } catch (err) { + scope.reportError(err); + return new FluentNone(`${name}()`); + } +} +function resolveSelectExpression(scope, { + selector, + variants, + star +}) { + let sel = resolveExpression(scope, selector); + if (sel instanceof FluentNone) { + return getDefault(scope, variants, star); + } + for (const variant of variants) { + const key = resolveExpression(scope, variant.key); + if (match(scope, sel, key)) { + return resolvePattern(scope, variant.value); + } + } + return getDefault(scope, variants, star); +} +function resolveComplexPattern(scope, ptn) { + if (scope.dirty.has(ptn)) { + scope.reportError(new RangeError("Cyclic reference")); + return new FluentNone(); + } + scope.dirty.add(ptn); + const result = []; + const useIsolating = scope.bundle._useIsolating && ptn.length > 1; + for (const elem of ptn) { + if (typeof elem === "string") { + result.push(scope.bundle._transform(elem)); + continue; + } + scope.placeables++; + if (scope.placeables > MAX_PLACEABLES) { + scope.dirty.delete(ptn); + throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` + `max allowed is ${MAX_PLACEABLES}`); + } + if (useIsolating) { + result.push(FSI); + } + result.push(resolveExpression(scope, elem).toString(scope)); + if (useIsolating) { + result.push(PDI); + } + } + scope.dirty.delete(ptn); + return result.join(""); +} +function resolvePattern(scope, value) { + if (typeof value === "string") { + return scope.bundle._transform(value); + } + return resolveComplexPattern(scope, value); +} +;// ./node_modules/@fluent/bundle/esm/scope.js +class Scope { + constructor(bundle, errors, args) { + this.dirty = new WeakSet(); + this.params = null; + this.placeables = 0; + this.bundle = bundle; + this.errors = errors; + this.args = args; + } + reportError(error) { + if (!this.errors || !(error instanceof Error)) { + throw error; + } + this.errors.push(error); + } + memoizeIntlObject(ctor, opts) { + let cache = this.bundle._intls.get(ctor); + if (!cache) { + cache = {}; + this.bundle._intls.set(ctor, cache); + } + let id = JSON.stringify(opts); + if (!cache[id]) { + cache[id] = new ctor(this.bundle.locales, opts); + } + return cache[id]; + } +} +;// ./node_modules/@fluent/bundle/esm/builtins.js + +function values(opts, allowed) { + const unwrapped = Object.create(null); + for (const [name, opt] of Object.entries(opts)) { + if (allowed.includes(name)) { + unwrapped[name] = opt.valueOf(); + } + } + return unwrapped; +} +const NUMBER_ALLOWED = ["unitDisplay", "currencyDisplay", "useGrouping", "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits"]; +function NUMBER(args, opts) { + let arg = args[0]; + if (arg instanceof FluentNone) { + return new FluentNone(`NUMBER(${arg.valueOf()})`); + } + if (arg instanceof FluentNumber) { + return new FluentNumber(arg.valueOf(), { + ...arg.opts, + ...values(opts, NUMBER_ALLOWED) + }); + } + if (arg instanceof FluentDateTime) { + return new FluentNumber(arg.toNumber(), { + ...values(opts, NUMBER_ALLOWED) + }); + } + throw new TypeError("Invalid argument to NUMBER"); +} +const DATETIME_ALLOWED = ["dateStyle", "timeStyle", "fractionalSecondDigits", "dayPeriod", "hour12", "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName"]; +function DATETIME(args, opts) { + let arg = args[0]; + if (arg instanceof FluentNone) { + return new FluentNone(`DATETIME(${arg.valueOf()})`); + } + if (arg instanceof FluentDateTime || arg instanceof FluentNumber) { + return new FluentDateTime(arg, values(opts, DATETIME_ALLOWED)); + } + throw new TypeError("Invalid argument to DATETIME"); +} +;// ./node_modules/@fluent/bundle/esm/memoizer.js +const cache = new Map(); +function getMemoizerForLocale(locales) { + const stringLocale = Array.isArray(locales) ? locales.join(" ") : locales; + let memoizer = cache.get(stringLocale); + if (memoizer === undefined) { + memoizer = new Map(); + cache.set(stringLocale, memoizer); + } + return memoizer; +} +;// ./node_modules/@fluent/bundle/esm/bundle.js + + + + + +class FluentBundle { + constructor(locales, { + functions, + useIsolating = true, + transform = v => v + } = {}) { + this._terms = new Map(); + this._messages = new Map(); + this.locales = Array.isArray(locales) ? locales : [locales]; + this._functions = { + NUMBER: NUMBER, + DATETIME: DATETIME, + ...functions + }; + this._useIsolating = useIsolating; + this._transform = transform; + this._intls = getMemoizerForLocale(locales); + } + hasMessage(id) { + return this._messages.has(id); + } + getMessage(id) { + return this._messages.get(id); + } + addResource(res, { + allowOverrides = false + } = {}) { + const errors = []; + for (let i = 0; i < res.body.length; i++) { + let entry = res.body[i]; + if (entry.id.startsWith("-")) { + if (allowOverrides === false && this._terms.has(entry.id)) { + errors.push(new Error(`Attempt to override an existing term: "${entry.id}"`)); + continue; + } + this._terms.set(entry.id, entry); + } else { + if (allowOverrides === false && this._messages.has(entry.id)) { + errors.push(new Error(`Attempt to override an existing message: "${entry.id}"`)); + continue; + } + this._messages.set(entry.id, entry); + } + } + return errors; + } + formatPattern(pattern, args = null, errors = null) { + if (typeof pattern === "string") { + return this._transform(pattern); + } + let scope = new Scope(this, errors, args); + try { + let value = resolveComplexPattern(scope, pattern); + return value.toString(scope); + } catch (err) { + if (scope.errors && err instanceof Error) { + scope.errors.push(err); + return new FluentNone().toString(scope); + } + throw err; + } + } +} +;// ./node_modules/@fluent/bundle/esm/resource.js +const RE_MESSAGE_START = /^(-?[a-zA-Z][\w-]*) *= */gm; +const RE_ATTRIBUTE_START = /\.([a-zA-Z][\w-]*) *= */y; +const RE_VARIANT_START = /\*?\[/y; +const RE_NUMBER_LITERAL = /(-?[0-9]+(?:\.([0-9]+))?)/y; +const RE_IDENTIFIER = /([a-zA-Z][\w-]*)/y; +const RE_REFERENCE = /([$-])?([a-zA-Z][\w-]*)(?:\.([a-zA-Z][\w-]*))?/y; +const RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/; +const RE_TEXT_RUN = /([^{}\n\r]+)/y; +const RE_STRING_RUN = /([^\\"\n\r]*)/y; +const RE_STRING_ESCAPE = /\\([\\"])/y; +const RE_UNICODE_ESCAPE = /\\u([a-fA-F0-9]{4})|\\U([a-fA-F0-9]{6})/y; +const RE_LEADING_NEWLINES = /^\n+/; +const RE_TRAILING_SPACES = / +$/; +const RE_BLANK_LINES = / *\r?\n/g; +const RE_INDENT = /( *)$/; +const TOKEN_BRACE_OPEN = /{\s*/y; +const TOKEN_BRACE_CLOSE = /\s*}/y; +const TOKEN_BRACKET_OPEN = /\[\s*/y; +const TOKEN_BRACKET_CLOSE = /\s*] */y; +const TOKEN_PAREN_OPEN = /\s*\(\s*/y; +const TOKEN_ARROW = /\s*->\s*/y; +const TOKEN_COLON = /\s*:\s*/y; +const TOKEN_COMMA = /\s*,?\s*/y; +const TOKEN_BLANK = /\s+/y; +class FluentResource { + constructor(source) { + this.body = []; + RE_MESSAGE_START.lastIndex = 0; + let cursor = 0; + while (true) { + let next = RE_MESSAGE_START.exec(source); + if (next === null) { + break; + } + cursor = RE_MESSAGE_START.lastIndex; + try { + this.body.push(parseMessage(next[1])); + } catch (err) { + if (err instanceof SyntaxError) { + continue; + } + throw err; + } + } + function test(re) { + re.lastIndex = cursor; + return re.test(source); + } + function consumeChar(char, errorClass) { + if (source[cursor] === char) { + cursor++; + return true; + } + if (errorClass) { + throw new errorClass(`Expected ${char}`); + } + return false; + } + function consumeToken(re, errorClass) { + if (test(re)) { + cursor = re.lastIndex; + return true; + } + if (errorClass) { + throw new errorClass(`Expected ${re.toString()}`); + } + return false; + } + function match(re) { + re.lastIndex = cursor; + let result = re.exec(source); + if (result === null) { + throw new SyntaxError(`Expected ${re.toString()}`); + } + cursor = re.lastIndex; + return result; + } + function match1(re) { + return match(re)[1]; + } + function parseMessage(id) { + let value = parsePattern(); + let attributes = parseAttributes(); + if (value === null && Object.keys(attributes).length === 0) { + throw new SyntaxError("Expected message value or attributes"); + } + return { + id, + value, + attributes + }; + } + function parseAttributes() { + let attrs = Object.create(null); + while (test(RE_ATTRIBUTE_START)) { + let name = match1(RE_ATTRIBUTE_START); + let value = parsePattern(); + if (value === null) { + throw new SyntaxError("Expected attribute value"); + } + attrs[name] = value; + } + return attrs; + } + function parsePattern() { + let first; + if (test(RE_TEXT_RUN)) { + first = match1(RE_TEXT_RUN); + } + if (source[cursor] === "{" || source[cursor] === "}") { + return parsePatternElements(first ? [first] : [], Infinity); + } + let indent = parseIndent(); + if (indent) { + if (first) { + return parsePatternElements([first, indent], indent.length); + } + indent.value = trim(indent.value, RE_LEADING_NEWLINES); + return parsePatternElements([indent], indent.length); + } + if (first) { + return trim(first, RE_TRAILING_SPACES); + } + return null; + } + function parsePatternElements(elements = [], commonIndent) { + while (true) { + if (test(RE_TEXT_RUN)) { + elements.push(match1(RE_TEXT_RUN)); + continue; + } + if (source[cursor] === "{") { + elements.push(parsePlaceable()); + continue; + } + if (source[cursor] === "}") { + throw new SyntaxError("Unbalanced closing brace"); + } + let indent = parseIndent(); + if (indent) { + elements.push(indent); + commonIndent = Math.min(commonIndent, indent.length); + continue; + } + break; + } + let lastIndex = elements.length - 1; + let lastElement = elements[lastIndex]; + if (typeof lastElement === "string") { + elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES); + } + let baked = []; + for (let element of elements) { + if (element instanceof Indent) { + element = element.value.slice(0, element.value.length - commonIndent); + } + if (element) { + baked.push(element); + } + } + return baked; + } + function parsePlaceable() { + consumeToken(TOKEN_BRACE_OPEN, SyntaxError); + let selector = parseInlineExpression(); + if (consumeToken(TOKEN_BRACE_CLOSE)) { + return selector; + } + if (consumeToken(TOKEN_ARROW)) { + let variants = parseVariants(); + consumeToken(TOKEN_BRACE_CLOSE, SyntaxError); + return { + type: "select", + selector, + ...variants + }; + } + throw new SyntaxError("Unclosed placeable"); + } + function parseInlineExpression() { + if (source[cursor] === "{") { + return parsePlaceable(); + } + if (test(RE_REFERENCE)) { + let [, sigil, name, attr = null] = match(RE_REFERENCE); + if (sigil === "$") { + return { + type: "var", + name + }; + } + if (consumeToken(TOKEN_PAREN_OPEN)) { + let args = parseArguments(); + if (sigil === "-") { + return { + type: "term", + name, + attr, + args + }; + } + if (RE_FUNCTION_NAME.test(name)) { + return { + type: "func", + name, + args + }; + } + throw new SyntaxError("Function names must be all upper-case"); + } + if (sigil === "-") { + return { + type: "term", + name, + attr, + args: [] + }; + } + return { + type: "mesg", + name, + attr + }; + } + return parseLiteral(); + } + function parseArguments() { + let args = []; + while (true) { + switch (source[cursor]) { + case ")": + cursor++; + return args; + case undefined: + throw new SyntaxError("Unclosed argument list"); + } + args.push(parseArgument()); + consumeToken(TOKEN_COMMA); + } + } + function parseArgument() { + let expr = parseInlineExpression(); + if (expr.type !== "mesg") { + return expr; + } + if (consumeToken(TOKEN_COLON)) { + return { + type: "narg", + name: expr.name, + value: parseLiteral() + }; + } + return expr; + } + function parseVariants() { + let variants = []; + let count = 0; + let star; + while (test(RE_VARIANT_START)) { + if (consumeChar("*")) { + star = count; + } + let key = parseVariantKey(); + let value = parsePattern(); + if (value === null) { + throw new SyntaxError("Expected variant value"); + } + variants[count++] = { + key, + value + }; + } + if (count === 0) { + return null; + } + if (star === undefined) { + throw new SyntaxError("Expected default variant"); + } + return { + variants, + star + }; + } + function parseVariantKey() { + consumeToken(TOKEN_BRACKET_OPEN, SyntaxError); + let key; + if (test(RE_NUMBER_LITERAL)) { + key = parseNumberLiteral(); + } else { + key = { + type: "str", + value: match1(RE_IDENTIFIER) + }; + } + consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError); + return key; + } + function parseLiteral() { + if (test(RE_NUMBER_LITERAL)) { + return parseNumberLiteral(); + } + if (source[cursor] === '"') { + return parseStringLiteral(); + } + throw new SyntaxError("Invalid expression"); + } + function parseNumberLiteral() { + let [, value, fraction = ""] = match(RE_NUMBER_LITERAL); + let precision = fraction.length; + return { + type: "num", + value: parseFloat(value), + precision + }; + } + function parseStringLiteral() { + consumeChar('"', SyntaxError); + let value = ""; + while (true) { + value += match1(RE_STRING_RUN); + if (source[cursor] === "\\") { + value += parseEscapeSequence(); + continue; + } + if (consumeChar('"')) { + return { + type: "str", + value + }; + } + throw new SyntaxError("Unclosed string literal"); + } + } + function parseEscapeSequence() { + if (test(RE_STRING_ESCAPE)) { + return match1(RE_STRING_ESCAPE); + } + if (test(RE_UNICODE_ESCAPE)) { + let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE); + let codepoint = parseInt(codepoint4 || codepoint6, 16); + return codepoint <= 0xd7ff || 0xe000 <= codepoint ? String.fromCodePoint(codepoint) : "�"; + } + throw new SyntaxError("Unknown escape sequence"); + } + function parseIndent() { + let start = cursor; + consumeToken(TOKEN_BLANK); + switch (source[cursor]) { + case ".": + case "[": + case "*": + case "}": + case undefined: + return false; + case "{": + return makeIndent(source.slice(start, cursor)); + } + if (source[cursor - 1] === " ") { + return makeIndent(source.slice(start, cursor)); + } + return false; + } + function trim(text, re) { + return text.replace(re, ""); + } + function makeIndent(blank) { + let value = blank.replace(RE_BLANK_LINES, "\n"); + let length = RE_INDENT.exec(blank)[1].length; + return new Indent(value, length); + } + } +} +class Indent { + constructor(value, length) { + this.value = value; + this.length = length; + } +} +;// ./node_modules/@fluent/bundle/esm/index.js + + + +;// ./node_modules/@fluent/dom/esm/overlay.js +const reOverlay = /<|&#?\w+;/; +const TEXT_LEVEL_ELEMENTS = { + "http://www.w3.org/1999/xhtml": ["em", "strong", "small", "s", "cite", "q", "dfn", "abbr", "data", "time", "code", "var", "samp", "kbd", "sub", "sup", "i", "b", "u", "mark", "bdi", "bdo", "span", "br", "wbr"] +}; +const LOCALIZABLE_ATTRIBUTES = { + "http://www.w3.org/1999/xhtml": { + global: ["title", "aria-description", "aria-label", "aria-valuetext"], + a: ["download"], + area: ["download", "alt"], + input: ["alt", "placeholder"], + menuitem: ["label"], + menu: ["label"], + optgroup: ["label"], + option: ["label"], + track: ["label"], + img: ["alt"], + textarea: ["placeholder"], + th: ["abbr"] + }, + "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul": { + global: ["accesskey", "aria-label", "aria-valuetext", "label", "title", "tooltiptext"], + description: ["value"], + key: ["key", "keycode"], + label: ["value"], + textbox: ["placeholder", "value"] + } +}; +function translateElement(element, translation) { + const { + value + } = translation; + if (typeof value === "string") { + if (element.localName === "title" && element.namespaceURI === "http://www.w3.org/1999/xhtml") { + element.textContent = value; + } else if (!reOverlay.test(value)) { + element.textContent = value; + } else { + const templateElement = element.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml", "template"); + templateElement.innerHTML = value; + overlayChildNodes(templateElement.content, element); + } + } + overlayAttributes(translation, element); +} +function overlayChildNodes(fromFragment, toElement) { + for (const childNode of fromFragment.childNodes) { + if (childNode.nodeType === childNode.TEXT_NODE) { + continue; + } + if (childNode.hasAttribute("data-l10n-name")) { + const sanitized = getNodeForNamedElement(toElement, childNode); + fromFragment.replaceChild(sanitized, childNode); + continue; + } + if (isElementAllowed(childNode)) { + const sanitized = createSanitizedElement(childNode); + fromFragment.replaceChild(sanitized, childNode); + continue; + } + console.warn(`An element of forbidden type "${childNode.localName}" was found in ` + "the translation. Only safe text-level elements and elements with " + "data-l10n-name are allowed."); + fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode); + } + toElement.textContent = ""; + toElement.appendChild(fromFragment); +} +function hasAttribute(attributes, name) { + if (!attributes) { + return false; + } + for (let attr of attributes) { + if (attr.name === name) { + return true; + } + } + return false; +} +function overlayAttributes(fromElement, toElement) { + const explicitlyAllowed = toElement.hasAttribute("data-l10n-attrs") ? toElement.getAttribute("data-l10n-attrs").split(",").map(i => i.trim()) : null; + for (const attr of Array.from(toElement.attributes)) { + if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && !hasAttribute(fromElement.attributes, attr.name)) { + toElement.removeAttribute(attr.name); + } + } + if (!fromElement.attributes) { + return; + } + for (const attr of Array.from(fromElement.attributes)) { + if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && toElement.getAttribute(attr.name) !== attr.value) { + toElement.setAttribute(attr.name, attr.value); + } + } +} +function getNodeForNamedElement(sourceElement, translatedChild) { + const childName = translatedChild.getAttribute("data-l10n-name"); + const sourceChild = sourceElement.querySelector(`[data-l10n-name="${childName}"]`); + if (!sourceChild) { + console.warn(`An element named "${childName}" wasn't found in the source.`); + return createTextNodeFromTextContent(translatedChild); + } + if (sourceChild.localName !== translatedChild.localName) { + console.warn(`An element named "${childName}" was found in the translation ` + `but its type ${translatedChild.localName} didn't match the ` + `element found in the source (${sourceChild.localName}).`); + return createTextNodeFromTextContent(translatedChild); + } + sourceElement.removeChild(sourceChild); + const clone = sourceChild.cloneNode(false); + return shallowPopulateUsing(translatedChild, clone); +} +function createSanitizedElement(element) { + const clone = element.ownerDocument.createElement(element.localName); + return shallowPopulateUsing(element, clone); +} +function createTextNodeFromTextContent(element) { + return element.ownerDocument.createTextNode(element.textContent); +} +function isElementAllowed(element) { + const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI]; + return allowed && allowed.includes(element.localName); +} +function isAttrNameLocalizable(name, element, explicitlyAllowed = null) { + if (explicitlyAllowed && explicitlyAllowed.includes(name)) { + return true; + } + const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI]; + if (!allowed) { + return false; + } + const attrName = name.toLowerCase(); + const elemName = element.localName; + if (allowed.global.includes(attrName)) { + return true; + } + if (!allowed[elemName]) { + return false; + } + if (allowed[elemName].includes(attrName)) { + return true; + } + if (element.namespaceURI === "http://www.w3.org/1999/xhtml" && elemName === "input" && attrName === "value") { + const type = element.type.toLowerCase(); + if (type === "submit" || type === "button" || type === "reset") { + return true; + } + } + return false; +} +function shallowPopulateUsing(fromElement, toElement) { + toElement.textContent = fromElement.textContent; + overlayAttributes(fromElement, toElement); + return toElement; +} +;// ./node_modules/cached-iterable/src/cached_iterable.mjs +class CachedIterable extends Array { + static from(iterable) { + if (iterable instanceof this) { + return iterable; + } + return new this(iterable); + } +} +;// ./node_modules/cached-iterable/src/cached_sync_iterable.mjs + +class CachedSyncIterable extends CachedIterable { + constructor(iterable) { + super(); + if (Symbol.iterator in Object(iterable)) { + this.iterator = iterable[Symbol.iterator](); + } else { + throw new TypeError("Argument must implement the iteration protocol."); + } + } + [Symbol.iterator]() { + const cached = this; + let cur = 0; + return { + next() { + if (cached.length <= cur) { + cached.push(cached.iterator.next()); + } + return cached[cur++]; + } + }; + } + touchNext(count = 1) { + let idx = 0; + while (idx++ < count) { + const last = this[this.length - 1]; + if (last && last.done) { + break; + } + this.push(this.iterator.next()); + } + return this[this.length - 1]; + } +} +;// ./node_modules/cached-iterable/src/cached_async_iterable.mjs + +class CachedAsyncIterable extends CachedIterable { + constructor(iterable) { + super(); + if (Symbol.asyncIterator in Object(iterable)) { + this.iterator = iterable[Symbol.asyncIterator](); + } else if (Symbol.iterator in Object(iterable)) { + this.iterator = iterable[Symbol.iterator](); + } else { + throw new TypeError("Argument must implement the iteration protocol."); + } + } + [Symbol.asyncIterator]() { + const cached = this; + let cur = 0; + return { + async next() { + if (cached.length <= cur) { + cached.push(cached.iterator.next()); + } + return cached[cur++]; + } + }; + } + async touchNext(count = 1) { + let idx = 0; + while (idx++ < count) { + const last = this[this.length - 1]; + if (last && (await last).done) { + break; + } + this.push(this.iterator.next()); + } + return this[this.length - 1]; + } +} +;// ./node_modules/cached-iterable/src/index.mjs + + +;// ./node_modules/@fluent/dom/esm/localization.js + +class Localization { + constructor(resourceIds = [], generateBundles) { + this.resourceIds = resourceIds; + this.generateBundles = generateBundles; + this.onChange(true); + } + addResourceIds(resourceIds, eager = false) { + this.resourceIds.push(...resourceIds); + this.onChange(eager); + return this.resourceIds.length; + } + removeResourceIds(resourceIds) { + this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r)); + this.onChange(); + return this.resourceIds.length; + } + async formatWithFallback(keys, method) { + const translations = []; + let hasAtLeastOneBundle = false; + for await (const bundle of this.bundles) { + hasAtLeastOneBundle = true; + const missingIds = keysFromBundle(method, bundle, keys, translations); + if (missingIds.size === 0) { + break; + } + if (typeof console !== "undefined") { + const locale = bundle.locales[0]; + const ids = Array.from(missingIds).join(", "); + console.warn(`[fluent] Missing translations in ${locale}: ${ids}`); + } + } + if (!hasAtLeastOneBundle && typeof console !== "undefined") { + console.warn(`[fluent] Request for keys failed because no resource bundles got generated. + keys: ${JSON.stringify(keys)}. + resourceIds: ${JSON.stringify(this.resourceIds)}.`); + } + return translations; + } + formatMessages(keys) { + return this.formatWithFallback(keys, messageFromBundle); + } + formatValues(keys) { + return this.formatWithFallback(keys, valueFromBundle); + } + async formatValue(id, args) { + const [val] = await this.formatValues([{ + id, + args + }]); + return val; + } + handleEvent() { + this.onChange(); + } + onChange(eager = false) { + this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds)); + if (eager) { + this.bundles.touchNext(2); + } + } +} +function valueFromBundle(bundle, errors, message, args) { + if (message.value) { + return bundle.formatPattern(message.value, args, errors); + } + return null; +} +function messageFromBundle(bundle, errors, message, args) { + const formatted = { + value: null, + attributes: null + }; + if (message.value) { + formatted.value = bundle.formatPattern(message.value, args, errors); + } + let attrNames = Object.keys(message.attributes); + if (attrNames.length > 0) { + formatted.attributes = new Array(attrNames.length); + for (let [i, name] of attrNames.entries()) { + let value = bundle.formatPattern(message.attributes[name], args, errors); + formatted.attributes[i] = { + name, + value + }; + } + } + return formatted; +} +function keysFromBundle(method, bundle, keys, translations) { + const messageErrors = []; + const missingIds = new Set(); + keys.forEach(({ + id, + args + }, i) => { + if (translations[i] !== undefined) { + return; + } + let message = bundle.getMessage(id); + if (message) { + messageErrors.length = 0; + translations[i] = method(bundle, messageErrors, message, args); + if (messageErrors.length > 0 && typeof console !== "undefined") { + const locale = bundle.locales[0]; + const errors = messageErrors.join(", "); + console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`); + } + } else { + missingIds.add(id); + } + }); + return missingIds; +} +;// ./node_modules/@fluent/dom/esm/dom_localization.js + + +const L10NID_ATTR_NAME = "data-l10n-id"; +const L10NARGS_ATTR_NAME = "data-l10n-args"; +const L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`; +class DOMLocalization extends Localization { + constructor(resourceIds, generateBundles) { + super(resourceIds, generateBundles); + this.roots = new Set(); + this.pendingrAF = null; + this.pendingElements = new Set(); + this.windowElement = null; + this.mutationObserver = null; + this.observerConfig = { + attributes: true, + characterData: false, + childList: true, + subtree: true, + attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME] + }; + } + onChange(eager = false) { + super.onChange(eager); + if (this.roots) { + this.translateRoots(); + } + } + setAttributes(element, id, args) { + element.setAttribute(L10NID_ATTR_NAME, id); + if (args) { + element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args)); + } else { + element.removeAttribute(L10NARGS_ATTR_NAME); + } + return element; + } + getAttributes(element) { + return { + id: element.getAttribute(L10NID_ATTR_NAME), + args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null) + }; + } + connectRoot(newRoot) { + for (const root of this.roots) { + if (root === newRoot || root.contains(newRoot) || newRoot.contains(root)) { + throw new Error("Cannot add a root that overlaps with existing root."); + } + } + if (this.windowElement) { + if (this.windowElement !== newRoot.ownerDocument.defaultView) { + throw new Error(`Cannot connect a root: + DOMLocalization already has a root from a different window.`); + } + } else { + this.windowElement = newRoot.ownerDocument.defaultView; + this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations)); + } + this.roots.add(newRoot); + this.mutationObserver.observe(newRoot, this.observerConfig); + } + disconnectRoot(root) { + this.roots.delete(root); + this.pauseObserving(); + if (this.roots.size === 0) { + this.mutationObserver = null; + if (this.windowElement && this.pendingrAF) { + this.windowElement.cancelAnimationFrame(this.pendingrAF); + } + this.windowElement = null; + this.pendingrAF = null; + this.pendingElements.clear(); + return true; + } + this.resumeObserving(); + return false; + } + translateRoots() { + const roots = Array.from(this.roots); + return Promise.all(roots.map(root => this.translateFragment(root))); + } + pauseObserving() { + if (!this.mutationObserver) { + return; + } + this.translateMutations(this.mutationObserver.takeRecords()); + this.mutationObserver.disconnect(); + } + resumeObserving() { + if (!this.mutationObserver) { + return; + } + for (const root of this.roots) { + this.mutationObserver.observe(root, this.observerConfig); + } + } + translateMutations(mutations) { + for (const mutation of mutations) { + switch (mutation.type) { + case "attributes": + if (mutation.target.hasAttribute("data-l10n-id")) { + this.pendingElements.add(mutation.target); + } + break; + case "childList": + for (const addedNode of mutation.addedNodes) { + if (addedNode.nodeType === addedNode.ELEMENT_NODE) { + if (addedNode.childElementCount) { + for (const element of this.getTranslatables(addedNode)) { + this.pendingElements.add(element); + } + } else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) { + this.pendingElements.add(addedNode); + } + } + } + break; + } + } + if (this.pendingElements.size > 0) { + if (this.pendingrAF === null) { + this.pendingrAF = this.windowElement.requestAnimationFrame(() => { + this.translateElements(Array.from(this.pendingElements)); + this.pendingElements.clear(); + this.pendingrAF = null; + }); + } + } + } + translateFragment(frag) { + return this.translateElements(this.getTranslatables(frag)); + } + async translateElements(elements) { + if (!elements.length) { + return undefined; + } + const keys = elements.map(this.getKeysForElement); + const translations = await this.formatMessages(keys); + return this.applyTranslations(elements, translations); + } + applyTranslations(elements, translations) { + this.pauseObserving(); + for (let i = 0; i < elements.length; i++) { + if (translations[i] !== undefined) { + translateElement(elements[i], translations[i]); + } + } + this.resumeObserving(); + } + getTranslatables(element) { + const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY)); + if (typeof element.hasAttribute === "function" && element.hasAttribute(L10NID_ATTR_NAME)) { + nodes.push(element); + } + return nodes; + } + getKeysForElement(element) { + return { + id: element.getAttribute(L10NID_ATTR_NAME), + args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null) + }; + } +} +;// ./node_modules/@fluent/dom/esm/index.js + + +;// ./web/l10n.js +class L10n { + #dir; + #elements; + #lang; + #l10n; + constructor({ + lang, + isRTL + }, l10n = null) { + this.#lang = L10n.#fixupLangCode(lang); + this.#l10n = l10n; + this.#dir = isRTL ?? L10n.#isRTL(this.#lang) ? "rtl" : "ltr"; + } + _setL10n(l10n) { + this.#l10n = l10n; + } + getLanguage() { + return this.#lang; + } + getDirection() { + return this.#dir; + } + async get(ids, args = null, fallback) { + if (Array.isArray(ids)) { + ids = ids.map(id => ({ + id + })); + const messages = await this.#l10n.formatMessages(ids); + return messages.map(message => message.value); + } + const messages = await this.#l10n.formatMessages([{ + id: ids, + args + }]); + return messages[0]?.value || fallback; + } + async translate(element) { + (this.#elements ||= new Set()).add(element); + try { + this.#l10n.connectRoot(element); + await this.#l10n.translateRoots(); + } catch {} + } + async translateOnce(element) { + try { + await this.#l10n.translateElements([element]); + } catch (ex) { + console.error("translateOnce:", ex); + } + } + async destroy() { + if (this.#elements) { + for (const element of this.#elements) { + this.#l10n.disconnectRoot(element); + } + this.#elements.clear(); + this.#elements = null; + } + this.#l10n.pauseObserving(); + } + pause() { + this.#l10n.pauseObserving(); + } + resume() { + this.#l10n.resumeObserving(); + } + static #fixupLangCode(langCode) { + langCode = langCode?.toLowerCase() || "en-us"; + const PARTIAL_LANG_CODES = { + en: "en-us", + es: "es-es", + fy: "fy-nl", + ga: "ga-ie", + gu: "gu-in", + hi: "hi-in", + hy: "hy-am", + nb: "nb-no", + ne: "ne-np", + nn: "nn-no", + pa: "pa-in", + pt: "pt-pt", + sv: "sv-se", + zh: "zh-cn" + }; + return PARTIAL_LANG_CODES[langCode] || langCode; + } + static #isRTL(lang) { + const shortCode = lang.split("-", 1)[0]; + return ["ar", "he", "fa", "ps", "ur"].includes(shortCode); + } +} +const GenericL10n = null; + +;// ./web/genericl10n.js + + + + +function PLATFORM() { + const { + isAndroid, + isLinux, + isMac, + isWindows + } = FeatureTest.platform; + if (isLinux) { + return "linux"; + } + if (isWindows) { + return "windows"; + } + if (isMac) { + return "macos"; + } + if (isAndroid) { + return "android"; + } + return "other"; +} +function createBundle(lang, text) { + const resource = new FluentResource(text); + const bundle = new FluentBundle(lang, { + functions: { + PLATFORM + } + }); + const errors = bundle.addResource(resource); + if (errors.length) { + console.error("L10n errors", errors); + } + return bundle; +} +class genericl10n_GenericL10n extends L10n { + constructor(lang) { + super({ + lang + }); + const generateBundles = !lang ? genericl10n_GenericL10n.#generateBundlesFallback.bind(genericl10n_GenericL10n, this.getLanguage()) : genericl10n_GenericL10n.#generateBundles.bind(genericl10n_GenericL10n, "en-us", this.getLanguage()); + this._setL10n(new DOMLocalization([], generateBundles)); + } + static async *#generateBundles(defaultLang, baseLang) { + const { + baseURL, + paths + } = await this.#getPaths(); + const langs = [baseLang]; + if (defaultLang !== baseLang) { + const shortLang = baseLang.split("-", 1)[0]; + if (shortLang !== baseLang) { + langs.push(shortLang); + } + langs.push(defaultLang); + } + const bundles = langs.map(lang => [lang, this.#createBundle(lang, baseURL, paths)]); + for (const [lang, bundlePromise] of bundles) { + const bundle = await bundlePromise; + if (bundle) { + yield bundle; + } else if (lang === "en-us") { + yield this.#createBundleFallback(lang); + } + } + } + static async #createBundle(lang, baseURL, paths) { + const path = paths[lang]; + if (!path) { + return null; + } + const url = new URL(path, baseURL); + const text = await fetchData(url, "text"); + return createBundle(lang, text); + } + static async #getPaths() { + try { + const { + href + } = document.querySelector(`link[type="application/l10n"]`); + const paths = await fetchData(href, "json"); + return { + baseURL: href.substring(0, href.lastIndexOf("/") + 1) || "./", + paths + }; + } catch {} + return { + baseURL: "./", + paths: Object.create(null) + }; + } + static async *#generateBundlesFallback(lang) { + yield this.#createBundleFallback(lang); + } + static async #createBundleFallback(lang) { + const text = "pdfjs-previous-button =\n .title = Previous Page\npdfjs-previous-button-label = Previous\npdfjs-next-button =\n .title = Next Page\npdfjs-next-button-label = Next\npdfjs-page-input =\n .title = Page\npdfjs-of-pages = of { $pagesCount }\npdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })\npdfjs-zoom-out-button =\n .title = Zoom Out\npdfjs-zoom-out-button-label = Zoom Out\npdfjs-zoom-in-button =\n .title = Zoom In\npdfjs-zoom-in-button-label = Zoom In\npdfjs-zoom-select =\n .title = Zoom\npdfjs-presentation-mode-button =\n .title = Switch to Presentation Mode\npdfjs-presentation-mode-button-label = Presentation Mode\npdfjs-open-file-button =\n .title = Open File\npdfjs-open-file-button-label = Open\npdfjs-print-button =\n .title = Print\npdfjs-print-button-label = Print\npdfjs-save-button =\n .title = Save\npdfjs-save-button-label = Save\npdfjs-download-button =\n .title = Download\npdfjs-download-button-label = Download\npdfjs-bookmark-button =\n .title = Current Page (View URL from Current Page)\npdfjs-bookmark-button-label = Current Page\npdfjs-tools-button =\n .title = Tools\npdfjs-tools-button-label = Tools\npdfjs-first-page-button =\n .title = Go to First Page\npdfjs-first-page-button-label = Go to First Page\npdfjs-last-page-button =\n .title = Go to Last Page\npdfjs-last-page-button-label = Go to Last Page\npdfjs-page-rotate-cw-button =\n .title = Rotate Clockwise\npdfjs-page-rotate-cw-button-label = Rotate Clockwise\npdfjs-page-rotate-ccw-button =\n .title = Rotate Counterclockwise\npdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise\npdfjs-cursor-text-select-tool-button =\n .title = Enable Text Selection Tool\npdfjs-cursor-text-select-tool-button-label = Text Selection Tool\npdfjs-cursor-hand-tool-button =\n .title = Enable Hand Tool\npdfjs-cursor-hand-tool-button-label = Hand Tool\npdfjs-scroll-page-button =\n .title = Use Page Scrolling\npdfjs-scroll-page-button-label = Page Scrolling\npdfjs-scroll-vertical-button =\n .title = Use Vertical Scrolling\npdfjs-scroll-vertical-button-label = Vertical Scrolling\npdfjs-scroll-horizontal-button =\n .title = Use Horizontal Scrolling\npdfjs-scroll-horizontal-button-label = Horizontal Scrolling\npdfjs-scroll-wrapped-button =\n .title = Use Wrapped Scrolling\npdfjs-scroll-wrapped-button-label = Wrapped Scrolling\npdfjs-spread-none-button =\n .title = Do not join page spreads\npdfjs-spread-none-button-label = No Spreads\npdfjs-spread-odd-button =\n .title = Join page spreads starting with odd-numbered pages\npdfjs-spread-odd-button-label = Odd Spreads\npdfjs-spread-even-button =\n .title = Join page spreads starting with even-numbered pages\npdfjs-spread-even-button-label = Even Spreads\npdfjs-document-properties-button =\n .title = Document Properties\u2026\npdfjs-document-properties-button-label = Document Properties\u2026\npdfjs-document-properties-file-name = File name:\npdfjs-document-properties-file-size = File size:\npdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)\npdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)\npdfjs-document-properties-title = Title:\npdfjs-document-properties-author = Author:\npdfjs-document-properties-subject = Subject:\npdfjs-document-properties-keywords = Keywords:\npdfjs-document-properties-creation-date = Creation Date:\npdfjs-document-properties-modification-date = Modification Date:\npdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-document-properties-creator = Creator:\npdfjs-document-properties-producer = PDF Producer:\npdfjs-document-properties-version = PDF Version:\npdfjs-document-properties-page-count = Page Count:\npdfjs-document-properties-page-size = Page Size:\npdfjs-document-properties-page-size-unit-inches = in\npdfjs-document-properties-page-size-unit-millimeters = mm\npdfjs-document-properties-page-size-orientation-portrait = portrait\npdfjs-document-properties-page-size-orientation-landscape = landscape\npdfjs-document-properties-page-size-name-a-three = A3\npdfjs-document-properties-page-size-name-a-four = A4\npdfjs-document-properties-page-size-name-letter = Letter\npdfjs-document-properties-page-size-name-legal = Legal\npdfjs-document-properties-page-size-dimension-string = { $width } \xD7 { $height } { $unit } ({ $orientation })\npdfjs-document-properties-page-size-dimension-name-string = { $width } \xD7 { $height } { $unit } ({ $name }, { $orientation })\npdfjs-document-properties-linearized = Fast Web View:\npdfjs-document-properties-linearized-yes = Yes\npdfjs-document-properties-linearized-no = No\npdfjs-document-properties-close-button = Close\npdfjs-print-progress-message = Preparing document for printing\u2026\npdfjs-print-progress-percent = { $progress }%\npdfjs-print-progress-close-button = Cancel\npdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.\npdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.\npdfjs-toggle-sidebar-button =\n .title = Toggle Sidebar\npdfjs-toggle-sidebar-notification-button =\n .title = Toggle Sidebar (document contains outline/attachments/layers)\npdfjs-toggle-sidebar-button-label = Toggle Sidebar\npdfjs-document-outline-button =\n .title = Show Document Outline (double-click to expand/collapse all items)\npdfjs-document-outline-button-label = Document Outline\npdfjs-attachments-button =\n .title = Show Attachments\npdfjs-attachments-button-label = Attachments\npdfjs-layers-button =\n .title = Show Layers (double-click to reset all layers to the default state)\npdfjs-layers-button-label = Layers\npdfjs-thumbs-button =\n .title = Show Thumbnails\npdfjs-thumbs-button-label = Thumbnails\npdfjs-current-outline-item-button =\n .title = Find Current Outline Item\npdfjs-current-outline-item-button-label = Current Outline Item\npdfjs-findbar-button =\n .title = Find in Document\npdfjs-findbar-button-label = Find\npdfjs-additional-layers = Additional Layers\npdfjs-thumb-page-title =\n .title = Page { $page }\npdfjs-thumb-page-canvas =\n .aria-label = Thumbnail of Page { $page }\npdfjs-find-input =\n .title = Find\n .placeholder = Find in document\u2026\npdfjs-find-previous-button =\n .title = Find the previous occurrence of the phrase\npdfjs-find-previous-button-label = Previous\npdfjs-find-next-button =\n .title = Find the next occurrence of the phrase\npdfjs-find-next-button-label = Next\npdfjs-find-highlight-checkbox = Highlight All\npdfjs-find-match-case-checkbox-label = Match Case\npdfjs-find-match-diacritics-checkbox-label = Match Diacritics\npdfjs-find-entire-word-checkbox-label = Whole Words\npdfjs-find-reached-top = Reached top of document, continued from bottom\npdfjs-find-reached-bottom = Reached end of document, continued from top\npdfjs-find-match-count =\n { $total ->\n [one] { $current } of { $total } match\n *[other] { $current } of { $total } matches\n }\npdfjs-find-match-count-limit =\n { $limit ->\n [one] More than { $limit } match\n *[other] More than { $limit } matches\n }\npdfjs-find-not-found = Phrase not found\npdfjs-page-scale-width = Page Width\npdfjs-page-scale-fit = Page Fit\npdfjs-page-scale-auto = Automatic Zoom\npdfjs-page-scale-actual = Actual Size\npdfjs-page-scale-percent = { $scale }%\npdfjs-page-landmark =\n .aria-label = Page { $page }\npdfjs-loading-error = An error occurred while loading the PDF.\npdfjs-invalid-file-error = Invalid or corrupted PDF file.\npdfjs-missing-file-error = Missing PDF file.\npdfjs-unexpected-response-error = Unexpected server response.\npdfjs-rendering-error = An error occurred while rendering the page.\npdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-text-annotation-type =\n .alt = [{ $type } Annotation]\npdfjs-password-label = Enter the password to open this PDF file.\npdfjs-password-invalid = Invalid password. Please try again.\npdfjs-password-ok-button = OK\npdfjs-password-cancel-button = Cancel\npdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.\npdfjs-editor-free-text-button =\n .title = Text\npdfjs-editor-free-text-button-label = Text\npdfjs-editor-ink-button =\n .title = Draw\npdfjs-editor-ink-button-label = Draw\npdfjs-editor-stamp-button =\n .title = Add or edit images\npdfjs-editor-stamp-button-label = Add or edit images\npdfjs-editor-highlight-button =\n .title = Highlight\npdfjs-editor-highlight-button-label = Highlight\npdfjs-highlight-floating-button1 =\n .title = Highlight\n .aria-label = Highlight\npdfjs-highlight-floating-button-label = Highlight\npdfjs-editor-signature-button =\n .title = Add signature\npdfjs-editor-signature-button-label = Add signature\npdfjs-editor-highlight-editor =\n .aria-label = Highlight editor\npdfjs-editor-ink-editor =\n .aria-label = Drawing editor\npdfjs-editor-signature-editor1 =\n .aria-description = Signature editor: { $description }\npdfjs-editor-stamp-editor =\n .aria-label = Image editor\npdfjs-editor-remove-ink-button =\n .title = Remove drawing\npdfjs-editor-remove-freetext-button =\n .title = Remove text\npdfjs-editor-remove-stamp-button =\n .title = Remove image\npdfjs-editor-remove-highlight-button =\n .title = Remove highlight\npdfjs-editor-remove-signature-button =\n .title = Remove signature\npdfjs-editor-free-text-color-input = Color\npdfjs-editor-free-text-size-input = Size\npdfjs-editor-ink-color-input = Color\npdfjs-editor-ink-thickness-input = Thickness\npdfjs-editor-ink-opacity-input = Opacity\npdfjs-editor-stamp-add-image-button =\n .title = Add image\npdfjs-editor-stamp-add-image-button-label = Add image\npdfjs-editor-free-highlight-thickness-input = Thickness\npdfjs-editor-free-highlight-thickness-title =\n .title = Change thickness when highlighting items other than text\npdfjs-editor-add-signature-container =\n .aria-label = Signature controls and saved signatures\npdfjs-editor-signature-add-signature-button =\n .title = Add new signature\npdfjs-editor-signature-add-signature-button-label = Add new signature\npdfjs-editor-add-saved-signature-button =\n .title = Saved signature: { $description }\npdfjs-free-text2 =\n .aria-label = Text Editor\n .default-content = Start typing\u2026\npdfjs-editor-alt-text-button =\n .aria-label = Alt text\npdfjs-editor-alt-text-button-label = Alt text\npdfjs-editor-alt-text-edit-button =\n .aria-label = Edit alt text\npdfjs-editor-alt-text-dialog-label = Choose an option\npdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can\u2019t see the image or when it doesn\u2019t load.\npdfjs-editor-alt-text-add-description-label = Add a description\npdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.\npdfjs-editor-alt-text-mark-decorative-label = Mark as decorative\npdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.\npdfjs-editor-alt-text-cancel-button = Cancel\npdfjs-editor-alt-text-save-button = Save\npdfjs-editor-alt-text-decorative-tooltip = Marked as decorative\npdfjs-editor-alt-text-textarea =\n .placeholder = For example, \u201CA young man sits down at a table to eat a meal\u201D\npdfjs-editor-resizer-top-left =\n .aria-label = Top left corner \u2014 resize\npdfjs-editor-resizer-top-middle =\n .aria-label = Top middle \u2014 resize\npdfjs-editor-resizer-top-right =\n .aria-label = Top right corner \u2014 resize\npdfjs-editor-resizer-middle-right =\n .aria-label = Middle right \u2014 resize\npdfjs-editor-resizer-bottom-right =\n .aria-label = Bottom right corner \u2014 resize\npdfjs-editor-resizer-bottom-middle =\n .aria-label = Bottom middle \u2014 resize\npdfjs-editor-resizer-bottom-left =\n .aria-label = Bottom left corner \u2014 resize\npdfjs-editor-resizer-middle-left =\n .aria-label = Middle left \u2014 resize\npdfjs-editor-highlight-colorpicker-label = Highlight color\npdfjs-editor-colorpicker-button =\n .title = Change color\npdfjs-editor-colorpicker-dropdown =\n .aria-label = Color choices\npdfjs-editor-colorpicker-yellow =\n .title = Yellow\npdfjs-editor-colorpicker-green =\n .title = Green\npdfjs-editor-colorpicker-blue =\n .title = Blue\npdfjs-editor-colorpicker-pink =\n .title = Pink\npdfjs-editor-colorpicker-red =\n .title = Red\npdfjs-editor-highlight-show-all-button-label = Show all\npdfjs-editor-highlight-show-all-button =\n .title = Show all\npdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description)\npdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description)\npdfjs-editor-new-alt-text-textarea =\n .placeholder = Write your description here\u2026\npdfjs-editor-new-alt-text-description = Short description for people who can\u2019t see the image or when the image doesn\u2019t load.\npdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate.\npdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more\npdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically\npdfjs-editor-new-alt-text-not-now-button = Not now\npdfjs-editor-new-alt-text-error-title = Couldn\u2019t create alt text automatically\npdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later.\npdfjs-editor-new-alt-text-error-close-button = Close\npdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\n .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\npdfjs-editor-new-alt-text-added-button =\n .aria-label = Alt text added\npdfjs-editor-new-alt-text-added-button-label = Alt text added\npdfjs-editor-new-alt-text-missing-button =\n .aria-label = Missing alt text\npdfjs-editor-new-alt-text-missing-button-label = Missing alt text\npdfjs-editor-new-alt-text-to-review-button =\n .aria-label = Review alt text\npdfjs-editor-new-alt-text-to-review-button-label = Review alt text\npdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText }\npdfjs-image-alt-text-settings-button =\n .title = Image alt text settings\npdfjs-image-alt-text-settings-button-label = Image alt text settings\npdfjs-editor-alt-text-settings-dialog-label = Image alt text settings\npdfjs-editor-alt-text-settings-automatic-title = Automatic alt text\npdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically\npdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can\u2019t see the image or when the image doesn\u2019t load.\npdfjs-editor-alt-text-settings-download-model-label = Alt text AI model ({ $totalSize } MB)\npdfjs-editor-alt-text-settings-ai-model-description = Runs locally on your device so your data stays private. Required for automatic alt text.\npdfjs-editor-alt-text-settings-delete-model-button = Delete\npdfjs-editor-alt-text-settings-download-model-button = Download\npdfjs-editor-alt-text-settings-downloading-model-button = Downloading\u2026\npdfjs-editor-alt-text-settings-editor-title = Alt text editor\npdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image\npdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text.\npdfjs-editor-alt-text-settings-close-button = Close\npdfjs-editor-undo-bar-message-highlight = Highlight removed\npdfjs-editor-undo-bar-message-freetext = Text removed\npdfjs-editor-undo-bar-message-ink = Drawing removed\npdfjs-editor-undo-bar-message-stamp = Image removed\npdfjs-editor-undo-bar-message-signature = Signature removed\npdfjs-editor-undo-bar-message-multiple =\n { $count ->\n [one] { $count } annotation removed\n *[other] { $count } annotations removed\n }\npdfjs-editor-undo-bar-undo-button =\n .title = Undo\npdfjs-editor-undo-bar-undo-button-label = Undo\npdfjs-editor-undo-bar-close-button =\n .title = Close\npdfjs-editor-undo-bar-close-button-label = Close\npdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use.\npdfjs-editor-add-signature-dialog-title = Add a signature\npdfjs-editor-add-signature-type-button = Type\n .title = Type\npdfjs-editor-add-signature-draw-button = Draw\n .title = Draw\npdfjs-editor-add-signature-image-button = Image\n .title = Image\npdfjs-editor-add-signature-type-input =\n .aria-label = Type your signature\n .placeholder = Type your signature\npdfjs-editor-add-signature-draw-placeholder = Draw your signature\npdfjs-editor-add-signature-draw-thickness-range-label = Thickness\npdfjs-editor-add-signature-draw-thickness-range =\n .title = Drawing thickness: { $thickness }\npdfjs-editor-add-signature-image-placeholder = Drag a file here to upload\npdfjs-editor-add-signature-image-browse-link =\n { PLATFORM() ->\n [macos] Or choose image files\n *[other] Or browse image files\n }\npdfjs-editor-add-signature-description-label = Description (alt text)\npdfjs-editor-add-signature-description-input =\n .title = Description (alt text)\npdfjs-editor-add-signature-description-default-when-drawing = Signature\npdfjs-editor-add-signature-clear-button-label = Clear signature\npdfjs-editor-add-signature-clear-button =\n .title = Clear signature\npdfjs-editor-add-signature-save-checkbox = Save signature\npdfjs-editor-add-signature-save-warning-message = You\u2019ve reached the limit of 5 saved signatures. Remove one to save more.\npdfjs-editor-add-signature-image-upload-error-title = Couldn\u2019t upload image\npdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image.\npdfjs-editor-add-signature-error-close-button = Close\npdfjs-editor-add-signature-cancel-button = Cancel\npdfjs-editor-add-signature-add-button = Add\npdfjs-editor-delete-signature-button1 =\n .title = Remove saved signature\npdfjs-editor-delete-signature-button-label1 = Remove saved signature\npdfjs-editor-add-signature-edit-button-label = Edit description\npdfjs-editor-edit-signature-dialog-title = Edit description\npdfjs-editor-edit-signature-update-button = Update"; + return createBundle(lang, text); + } +} + +;// ./web/generic_scripting.js + +async function docProperties(pdfDocument) { + const url = "", + baseUrl = ""; + const { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + return { + ...info, + baseURL: baseUrl, + filesize: contentLength || (await pdfDocument.getDownloadInfo()).length, + filename: contentDispositionFilename || getPdfFilenameFromUrl(url), + metadata: metadata?.getRaw(), + authors: metadata?.get("dc:creator"), + numPages: pdfDocument.numPages, + URL: url + }; +} +class GenericScripting { + constructor(sandboxBundleSrc) { + this._ready = new Promise((resolve, reject) => { + const sandbox = import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + sandboxBundleSrc); + sandbox.then(pdfjsSandbox => { + resolve(pdfjsSandbox.QuickJSSandbox()); + }).catch(reject); + }); + } + async createSandbox(data) { + const sandbox = await this._ready; + sandbox.create(data); + } + async dispatchEventInSandbox(event) { + const sandbox = await this._ready; + setTimeout(() => sandbox.dispatchEvent(event), 0); + } + async destroySandbox() { + const sandbox = await this._ready; + sandbox.nukeSandbox(); + } +} + +;// ./web/generic_signature_storage.js + +const KEY_STORAGE = "pdfjs.signature"; +class SignatureStorage { + #eventBus; + #signatures = null; + #signal = null; + constructor(eventBus, signal) { + this.#eventBus = eventBus; + this.#signal = signal; + } + #save() { + localStorage.setItem(KEY_STORAGE, JSON.stringify(Object.fromEntries(this.#signatures))); + } + async getAll() { + if (this.#signal) { + window.addEventListener("storage", ({ + key + }) => { + if (key === KEY_STORAGE) { + this.#signatures = null; + this.#eventBus?.dispatch("storedsignatureschanged", { + source: this + }); + } + }, { + signal: this.#signal + }); + this.#signal = null; + } + if (!this.#signatures) { + this.#signatures = new Map(); + const data = localStorage.getItem(KEY_STORAGE); + if (data) { + for (const [key, value] of Object.entries(JSON.parse(data))) { + this.#signatures.set(key, value); + } + } + } + return this.#signatures; + } + async isFull() { + return (await this.size()) === 5; + } + async size() { + return (await this.getAll()).size; + } + async create(data) { + if (await this.isFull()) { + return null; + } + const uuid = getUuid(); + this.#signatures.set(uuid, data); + this.#save(); + return uuid; + } + async delete(uuid) { + const signatures = await this.getAll(); + if (!signatures.has(uuid)) { + return false; + } + signatures.delete(uuid); + this.#save(); + return true; + } +} + +;// ./web/genericcom.js + + + + + + +function initCom(app) {} +class Preferences extends BasePreferences { + async _writeToStorage(prefObj) { + localStorage.setItem("pdfjs.preferences", JSON.stringify(prefObj)); + } + async _readFromStorage(prefObj) { + return { + prefs: JSON.parse(localStorage.getItem("pdfjs.preferences")) + }; + } +} +class ExternalServices extends BaseExternalServices { + async createL10n() { + return new genericl10n_GenericL10n(AppOptions.get("localeProperties")?.lang); + } + createScripting() { + return new GenericScripting(AppOptions.get("sandboxBundleSrc")); + } + createSignatureStorage(eventBus, signal) { + return new SignatureStorage(eventBus, signal); + } +} +class MLManager { + async isEnabledFor(_name) { + return false; + } + async deleteModel(_service) { + return null; + } + isReady(_name) { + return false; + } + guess(_data) {} + toggleService(_name, _enabled) {} +} + +;// ./web/new_alt_text_manager.js + +class NewAltTextManager { + #boundCancel = this.#cancel.bind(this); + #createAutomaticallyButton; + #currentEditor = null; + #cancelButton; + #descriptionContainer; + #dialog; + #disclaimer; + #downloadModel; + #downloadModelDescription; + #eventBus; + #firstTime = false; + #guessedAltText; + #hasAI = null; + #isEditing = null; + #imagePreview; + #imageData; + #isAILoading = false; + #wasAILoading = false; + #learnMore; + #notNowButton; + #overlayManager; + #textarea; + #title; + #uiManager; + #previousAltText = null; + constructor({ + descriptionContainer, + dialog, + imagePreview, + cancelButton, + disclaimer, + notNowButton, + saveButton, + textarea, + learnMore, + errorCloseButton, + createAutomaticallyButton, + downloadModel, + downloadModelDescription, + title + }, overlayManager, eventBus) { + this.#cancelButton = cancelButton; + this.#createAutomaticallyButton = createAutomaticallyButton; + this.#descriptionContainer = descriptionContainer; + this.#dialog = dialog; + this.#disclaimer = disclaimer; + this.#notNowButton = notNowButton; + this.#imagePreview = imagePreview; + this.#textarea = textarea; + this.#learnMore = learnMore; + this.#title = title; + this.#downloadModel = downloadModel; + this.#downloadModelDescription = downloadModelDescription; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", event => { + if (event.target !== this.#textarea) { + event.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#boundCancel); + notNowButton.addEventListener("click", this.#boundCancel); + saveButton.addEventListener("click", this.#save.bind(this)); + errorCloseButton.addEventListener("click", () => { + this.#toggleError(false); + }); + createAutomaticallyButton.addEventListener("click", async () => { + const checked = createAutomaticallyButton.getAttribute("aria-pressed") !== "true"; + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.ai_generation_check", + data: { + status: checked + } + }); + if (this.#uiManager) { + this.#uiManager.setPreference("enableGuessAltText", checked); + await this.#uiManager.mlManager.toggleService("altText", checked); + } + this.#toggleGuessAltText(checked, false); + }); + textarea.addEventListener("focus", () => { + this.#wasAILoading = this.#isAILoading; + this.#toggleLoading(false); + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("blur", () => { + if (!textarea.value) { + this.#toggleLoading(this.#wasAILoading); + } + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("input", () => { + this.#toggleTitleAndDisclaimer(); + }); + eventBus._on("enableguessalttext", ({ + value + }) => { + this.#toggleGuessAltText(value, false); + }); + this.#overlayManager.register(dialog); + this.#learnMore.addEventListener("click", () => { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.info", + data: { + topic: "alt_text" + } + }); + }); + } + #toggleLoading(value) { + if (!this.#uiManager || this.#isAILoading === value) { + return; + } + this.#isAILoading = value; + this.#descriptionContainer.classList.toggle("loading", value); + } + #toggleError(value) { + if (!this.#uiManager) { + return; + } + this.#dialog.classList.toggle("error", value); + } + async #toggleGuessAltText(value, isInitial = false) { + if (!this.#uiManager) { + return; + } + this.#dialog.classList.toggle("aiDisabled", !value); + this.#createAutomaticallyButton.setAttribute("aria-pressed", value); + if (value) { + const { + altTextLearnMoreUrl + } = this.#uiManager.mlManager; + if (altTextLearnMoreUrl) { + this.#learnMore.href = altTextLearnMoreUrl; + } + this.#mlGuessAltText(isInitial); + } else { + this.#toggleLoading(false); + this.#isAILoading = false; + this.#toggleTitleAndDisclaimer(); + } + } + #toggleNotNow() { + this.#notNowButton.classList.toggle("hidden", !this.#firstTime); + this.#cancelButton.classList.toggle("hidden", this.#firstTime); + } + #toggleAI(value) { + if (!this.#uiManager || this.#hasAI === value) { + return; + } + this.#hasAI = value; + this.#dialog.classList.toggle("noAi", !value); + this.#toggleTitleAndDisclaimer(); + } + #toggleTitleAndDisclaimer() { + const visible = this.#isAILoading || this.#guessedAltText && this.#guessedAltText === this.#textarea.value; + this.#disclaimer.hidden = !visible; + const isEditing = this.#isAILoading || !!this.#textarea.value; + if (this.#isEditing === isEditing) { + return; + } + this.#isEditing = isEditing; + this.#title.setAttribute("data-l10n-id", isEditing ? "pdfjs-editor-new-alt-text-dialog-edit-label" : "pdfjs-editor-new-alt-text-dialog-add-label"); + } + async #mlGuessAltText(isInitial) { + if (this.#isAILoading) { + return; + } + if (this.#textarea.value) { + return; + } + if (isInitial && this.#previousAltText !== null) { + return; + } + this.#guessedAltText = this.#currentEditor.guessedAltText; + if (this.#previousAltText === null && this.#guessedAltText) { + this.#addAltText(this.#guessedAltText); + return; + } + this.#toggleLoading(true); + this.#toggleTitleAndDisclaimer(); + let hasError = false; + try { + const altText = await this.#currentEditor.mlGuessAltText(this.#imageData, false); + if (altText) { + this.#guessedAltText = altText; + this.#wasAILoading = this.#isAILoading; + if (this.#isAILoading) { + this.#addAltText(altText); + } + } + } catch (e) { + console.error(e); + hasError = true; + } + this.#toggleLoading(false); + this.#toggleTitleAndDisclaimer(); + if (hasError && this.#uiManager) { + this.#toggleError(true); + } + } + #addAltText(altText) { + if (!this.#uiManager || this.#textarea.value) { + return; + } + this.#textarea.value = altText; + this.#toggleTitleAndDisclaimer(); + } + #setProgress() { + this.#downloadModel.classList.toggle("hidden", false); + const callback = async ({ + detail: { + finished, + total, + totalLoaded + } + }) => { + const ONE_MEGA_BYTES = 1e6; + totalLoaded = Math.min(0.99 * total, totalLoaded); + const totalSize = this.#downloadModelDescription.ariaValueMax = Math.round(total / ONE_MEGA_BYTES); + const downloadedSize = this.#downloadModelDescription.ariaValueNow = Math.round(totalLoaded / ONE_MEGA_BYTES); + this.#downloadModelDescription.setAttribute("data-l10n-args", JSON.stringify({ + totalSize, + downloadedSize + })); + if (!finished) { + return; + } + this.#eventBus._off("loadaiengineprogress", callback); + this.#downloadModel.classList.toggle("hidden", true); + this.#toggleAI(true); + if (!this.#uiManager) { + return; + } + const { + mlManager + } = this.#uiManager; + mlManager.toggleService("altText", true); + this.#toggleGuessAltText(await mlManager.isEnabledFor("altText"), true); + }; + this.#eventBus._on("loadaiengineprogress", callback); + } + async editAltText(uiManager, editor, firstTime) { + if (this.#currentEditor || !editor) { + return; + } + if (firstTime && editor.hasAltTextData()) { + editor.altTextFinish(); + return; + } + this.#firstTime = firstTime; + let { + mlManager + } = uiManager; + let hasAI = !!mlManager; + this.#toggleTitleAndDisclaimer(); + if (mlManager && !mlManager.isReady("altText")) { + hasAI = false; + if (mlManager.hasProgress) { + this.#setProgress(); + } else { + mlManager = null; + } + } else { + this.#downloadModel.classList.toggle("hidden", true); + } + const isAltTextEnabledPromise = mlManager?.isEnabledFor("altText"); + this.#currentEditor = editor; + this.#uiManager = uiManager; + this.#uiManager.removeEditListeners(); + ({ + altText: this.#previousAltText + } = editor.altTextData); + this.#textarea.value = this.#previousAltText ?? ""; + const AI_MAX_IMAGE_DIMENSION = 224; + const MAX_PREVIEW_DIMENSION = 180; + let canvas, width, height; + if (mlManager) { + ({ + canvas, + width, + height, + imageData: this.#imageData + } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, true)); + if (hasAI) { + this.#toggleGuessAltText(await isAltTextEnabledPromise, true); + } + } else { + ({ + canvas, + width, + height + } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, false)); + } + canvas.setAttribute("role", "presentation"); + const { + style + } = canvas; + style.width = `${width}px`; + style.height = `${height}px`; + this.#imagePreview.append(canvas); + this.#toggleNotNow(); + this.#toggleAI(hasAI); + this.#toggleError(false); + try { + await this.#overlayManager.open(this.#dialog); + } catch (ex) { + this.#close(); + throw ex; + } + } + #cancel() { + this.#currentEditor.altTextData = { + cancel: true + }; + const altText = this.#textarea.value.trim(); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.dismiss", + data: { + alt_text_type: altText ? "present" : "empty", + flow: this.#firstTime ? "image_add" : "alt_text_edit" + } + }); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: true, + alt_text_type: "skipped" + } + }); + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + const canvas = this.#imagePreview.firstChild; + canvas.remove(); + canvas.width = canvas.height = 0; + this.#imageData = null; + this.#toggleLoading(false); + this.#uiManager?.addEditListeners(); + this.#currentEditor.altTextFinish(); + this.#uiManager?.setSelected(this.#currentEditor); + this.#currentEditor = null; + this.#uiManager = null; + } + #extractWords(text) { + return new Set(text.toLowerCase().split(/[^\p{L}\p{N}]+/gu).filter(x => !!x)); + } + #save() { + const altText = this.#textarea.value.trim(); + this.#currentEditor.altTextData = { + altText, + decorative: false + }; + this.#currentEditor.altTextData.guessedAltText = this.#guessedAltText; + if (this.#guessedAltText && this.#guessedAltText !== altText) { + const guessedWords = this.#extractWords(this.#guessedAltText); + const words = this.#extractWords(altText); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.user_edit", + data: { + total_words: guessedWords.size, + words_removed: guessedWords.difference(words).size, + words_added: words.difference(guessedWords).size + } + }); + } + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: true, + alt_text_type: altText ? "present" : "empty" + } + }); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.save", + data: { + alt_text_type: altText ? "present" : "empty", + flow: this.#firstTime ? "image_add" : "alt_text_edit" + } + }); + this.#finish(); + } + destroy() { + this.#uiManager = null; + this.#finish(); + } +} +class ImageAltTextSettings { + #aiModelSettings; + #createModelButton; + #downloadModelButton; + #dialog; + #eventBus; + #mlManager; + #overlayManager; + #showAltTextDialogButton; + constructor({ + dialog, + createModelButton, + aiModelSettings, + learnMore, + closeButton, + deleteModelButton, + downloadModelButton, + showAltTextDialogButton + }, overlayManager, eventBus, mlManager) { + this.#dialog = dialog; + this.#aiModelSettings = aiModelSettings; + this.#createModelButton = createModelButton; + this.#downloadModelButton = downloadModelButton; + this.#showAltTextDialogButton = showAltTextDialogButton; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#mlManager = mlManager; + const { + altTextLearnMoreUrl + } = mlManager; + if (altTextLearnMoreUrl) { + learnMore.href = altTextLearnMoreUrl; + } + dialog.addEventListener("contextmenu", noContextMenu); + createModelButton.addEventListener("click", async e => { + const checked = this.#togglePref("enableGuessAltText", e); + await mlManager.toggleService("altText", checked); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_ai_generation_check", + data: { + status: checked + } + }); + }); + showAltTextDialogButton.addEventListener("click", e => { + const checked = this.#togglePref("enableNewAltTextWhenAddingImage", e); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_edit_alt_text_check", + data: { + status: checked + } + }); + }); + deleteModelButton.addEventListener("click", this.#delete.bind(this, true)); + downloadModelButton.addEventListener("click", this.#download.bind(this, true)); + closeButton.addEventListener("click", this.#finish.bind(this)); + learnMore.addEventListener("click", () => { + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.info", + data: { + topic: "ai_generation" + } + }); + }); + eventBus._on("enablealttextmodeldownload", ({ + value + }) => { + if (value) { + this.#download(false); + } else { + this.#delete(false); + } + }); + this.#overlayManager.register(dialog); + } + #reportTelemetry(data) { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + async #download(isFromUI = false) { + if (isFromUI) { + this.#downloadModelButton.disabled = true; + const span = this.#downloadModelButton.firstChild; + span.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-settings-downloading-model-button"); + await this.#mlManager.downloadModel("altText"); + span.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-settings-download-model-button"); + this.#createModelButton.disabled = false; + this.#setPref("enableGuessAltText", true); + this.#mlManager.toggleService("altText", true); + this.#setPref("enableAltTextModelDownload", true); + this.#downloadModelButton.disabled = false; + } + this.#aiModelSettings.classList.toggle("download", false); + this.#createModelButton.setAttribute("aria-pressed", true); + } + async #delete(isFromUI = false) { + if (isFromUI) { + await this.#mlManager.deleteModel("altText"); + this.#setPref("enableGuessAltText", false); + this.#setPref("enableAltTextModelDownload", false); + } + this.#aiModelSettings.classList.toggle("download", true); + this.#createModelButton.disabled = true; + this.#createModelButton.setAttribute("aria-pressed", false); + } + async open({ + enableGuessAltText, + enableNewAltTextWhenAddingImage + }) { + const { + enableAltTextModelDownload + } = this.#mlManager; + this.#createModelButton.disabled = !enableAltTextModelDownload; + this.#createModelButton.setAttribute("aria-pressed", enableAltTextModelDownload && enableGuessAltText); + this.#showAltTextDialogButton.setAttribute("aria-pressed", enableNewAltTextWhenAddingImage); + this.#aiModelSettings.classList.toggle("download", !enableAltTextModelDownload); + await this.#overlayManager.open(this.#dialog); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_displayed" + }); + } + #togglePref(name, { + target + }) { + const checked = target.getAttribute("aria-pressed") !== "true"; + this.#setPref(name, checked); + target.setAttribute("aria-pressed", checked); + return checked; + } + #setPref(name, value) { + this.#eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } +} + +;// ./web/alt_text_manager.js + +class AltTextManager { + #clickAC = null; + #currentEditor = null; + #cancelButton; + #dialog; + #eventBus; + #hasUsedPointer = false; + #optionDescription; + #optionDecorative; + #overlayManager; + #saveButton; + #textarea; + #uiManager; + #previousAltText = null; + #resizeAC = null; + #svgElement = null; + #rectElement = null; + #container; + #telemetryData = null; + constructor({ + dialog, + optionDescription, + optionDecorative, + textarea, + cancelButton, + saveButton + }, container, overlayManager, eventBus) { + this.#dialog = dialog; + this.#optionDescription = optionDescription; + this.#optionDecorative = optionDecorative; + this.#textarea = textarea; + this.#cancelButton = cancelButton; + this.#saveButton = saveButton; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#container = container; + const onUpdateUIState = this.#updateUIState.bind(this); + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", event => { + if (event.target !== this.#textarea) { + event.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#finish.bind(this)); + saveButton.addEventListener("click", this.#save.bind(this)); + optionDescription.addEventListener("change", onUpdateUIState); + optionDecorative.addEventListener("change", onUpdateUIState); + this.#overlayManager.register(dialog); + } + #createSVGElement() { + if (this.#svgElement) { + return; + } + const svgFactory = new DOMSVGFactory(); + const svg = this.#svgElement = svgFactory.createElement("svg"); + svg.setAttribute("width", "0"); + svg.setAttribute("height", "0"); + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const mask = svgFactory.createElement("mask"); + defs.append(mask); + mask.setAttribute("id", "alttext-manager-mask"); + mask.setAttribute("maskContentUnits", "objectBoundingBox"); + let rect = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "white"); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("x", "0"); + rect.setAttribute("y", "0"); + rect = this.#rectElement = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "black"); + this.#dialog.append(svg); + } + async editAltText(uiManager, editor) { + if (this.#currentEditor || !editor) { + return; + } + this.#createSVGElement(); + this.#hasUsedPointer = false; + this.#clickAC = new AbortController(); + const clickOpts = { + signal: this.#clickAC.signal + }, + onClick = this.#onClick.bind(this); + for (const element of [this.#optionDescription, this.#optionDecorative, this.#textarea, this.#saveButton, this.#cancelButton]) { + element.addEventListener("click", onClick, clickOpts); + } + const { + altText, + decorative + } = editor.altTextData; + if (decorative === true) { + this.#optionDecorative.checked = true; + this.#optionDescription.checked = false; + } else { + this.#optionDecorative.checked = false; + this.#optionDescription.checked = true; + } + this.#previousAltText = this.#textarea.value = altText?.trim() || ""; + this.#updateUIState(); + this.#currentEditor = editor; + this.#uiManager = uiManager; + this.#uiManager.removeEditListeners(); + this.#resizeAC = new AbortController(); + this.#eventBus._on("resize", this.#setPosition.bind(this), { + signal: this.#resizeAC.signal + }); + try { + await this.#overlayManager.open(this.#dialog); + this.#setPosition(); + } catch (ex) { + this.#close(); + throw ex; + } + } + #setPosition() { + if (!this.#currentEditor) { + return; + } + const dialog = this.#dialog; + const { + style + } = dialog; + const { + x: containerX, + y: containerY, + width: containerW, + height: containerH + } = this.#container.getBoundingClientRect(); + const { + innerWidth: windowW, + innerHeight: windowH + } = window; + const { + width: dialogW, + height: dialogH + } = dialog.getBoundingClientRect(); + const { + x, + y, + width, + height + } = this.#currentEditor.getClientDimensions(); + const MARGIN = 10; + const isLTR = this.#uiManager.direction === "ltr"; + const xs = Math.max(x, containerX); + const xe = Math.min(x + width, containerX + containerW); + const ys = Math.max(y, containerY); + const ye = Math.min(y + height, containerY + containerH); + this.#rectElement.setAttribute("width", `${(xe - xs) / windowW}`); + this.#rectElement.setAttribute("height", `${(ye - ys) / windowH}`); + this.#rectElement.setAttribute("x", `${xs / windowW}`); + this.#rectElement.setAttribute("y", `${ys / windowH}`); + let left = null; + let top = Math.max(y, 0); + top += Math.min(windowH - (top + dialogH), 0); + if (isLTR) { + if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } else if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } + if (left === null) { + top = null; + left = Math.max(x, 0); + left += Math.min(windowW - (left + dialogW), 0); + if (y > dialogH + MARGIN) { + top = y - dialogH - MARGIN; + } else if (y + height + MARGIN + dialogH < windowH) { + top = y + height + MARGIN; + } + } + if (top !== null) { + dialog.classList.add("positioned"); + if (isLTR) { + style.left = `${left}px`; + } else { + style.right = `${windowW - left - dialogW}px`; + } + style.top = `${top}px`; + } else { + dialog.classList.remove("positioned"); + style.left = ""; + style.top = ""; + } + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + this.#currentEditor._reportTelemetry(this.#telemetryData || { + action: "alt_text_cancel", + alt_text_keyboard: !this.#hasUsedPointer + }); + this.#telemetryData = null; + this.#removeOnClickListeners(); + this.#uiManager?.addEditListeners(); + this.#resizeAC?.abort(); + this.#resizeAC = null; + this.#currentEditor.altTextFinish(); + this.#currentEditor = null; + this.#uiManager = null; + } + #updateUIState() { + this.#textarea.disabled = this.#optionDecorative.checked; + } + #save() { + const altText = this.#textarea.value.trim(); + const decorative = this.#optionDecorative.checked; + this.#currentEditor.altTextData = { + altText, + decorative + }; + this.#telemetryData = { + action: "alt_text_save", + alt_text_description: !!altText, + alt_text_edit: !!this.#previousAltText && this.#previousAltText !== altText, + alt_text_decorative: decorative, + alt_text_keyboard: !this.#hasUsedPointer + }; + this.#finish(); + } + #onClick(evt) { + if (evt.detail === 0) { + return; + } + this.#hasUsedPointer = true; + this.#removeOnClickListeners(); + } + #removeOnClickListeners() { + this.#clickAC?.abort(); + this.#clickAC = null; + } + destroy() { + this.#uiManager = null; + this.#finish(); + this.#svgElement?.remove(); + this.#svgElement = this.#rectElement = null; + } +} + +;// ./web/annotation_editor_params.js + +class AnnotationEditorParams { + constructor(options, eventBus) { + this.eventBus = eventBus; + this.#bindListeners(options); + } + #bindListeners({ + editorFreeTextFontSize, + editorFreeTextColor, + editorInkColor, + editorInkThickness, + editorInkOpacity, + editorStampAddImage, + editorFreeHighlightThickness, + editorHighlightShowAll, + editorSignatureAddSignature + }) { + const { + eventBus + } = this; + const dispatchEvent = (typeStr, value) => { + eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType[typeStr], + value + }); + }; + editorFreeTextFontSize.addEventListener("input", function () { + dispatchEvent("FREETEXT_SIZE", this.valueAsNumber); + }); + editorFreeTextColor.addEventListener("input", function () { + dispatchEvent("FREETEXT_COLOR", this.value); + }); + editorInkColor.addEventListener("input", function () { + dispatchEvent("INK_COLOR", this.value); + }); + editorInkThickness.addEventListener("input", function () { + dispatchEvent("INK_THICKNESS", this.valueAsNumber); + }); + editorInkOpacity.addEventListener("input", function () { + dispatchEvent("INK_OPACITY", this.valueAsNumber); + }); + editorStampAddImage.addEventListener("click", () => { + eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + action: "pdfjs.image.add_image_click" + } + } + }); + dispatchEvent("CREATE"); + }); + editorFreeHighlightThickness.addEventListener("input", function () { + dispatchEvent("HIGHLIGHT_THICKNESS", this.valueAsNumber); + }); + editorHighlightShowAll.addEventListener("click", function () { + const checked = this.getAttribute("aria-pressed") === "true"; + this.setAttribute("aria-pressed", !checked); + dispatchEvent("HIGHLIGHT_SHOW_ALL", !checked); + }); + editorSignatureAddSignature.addEventListener("click", () => { + dispatchEvent("CREATE"); + }); + eventBus._on("annotationeditorparamschanged", evt => { + for (const [type, value] of evt.details) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + editorFreeTextFontSize.value = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + editorFreeTextColor.value = value; + break; + case AnnotationEditorParamsType.INK_COLOR: + editorInkColor.value = value; + break; + case AnnotationEditorParamsType.INK_THICKNESS: + editorInkThickness.value = value; + break; + case AnnotationEditorParamsType.INK_OPACITY: + editorInkOpacity.value = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: + eventBus.dispatch("mainhighlightcolorpickerupdatecolor", { + source: this, + value + }); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + editorFreeHighlightThickness.value = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_FREE: + editorFreeHighlightThickness.disabled = !value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + editorHighlightShowAll.setAttribute("aria-pressed", value); + break; + } + } + }); + } +} + +;// ./web/caret_browsing.js +const PRECISION = 1e-1; +class CaretBrowsingMode { + #mainContainer; + #toolBarHeight = 0; + #viewerContainer; + constructor(abortSignal, mainContainer, viewerContainer, toolbarContainer) { + this.#mainContainer = mainContainer; + this.#viewerContainer = viewerContainer; + if (!toolbarContainer) { + return; + } + this.#toolBarHeight = toolbarContainer.getBoundingClientRect().height; + const toolbarObserver = new ResizeObserver(entries => { + for (const entry of entries) { + if (entry.target === toolbarContainer) { + this.#toolBarHeight = Math.floor(entry.borderBoxSize[0].blockSize); + break; + } + } + }); + toolbarObserver.observe(toolbarContainer); + abortSignal.addEventListener("abort", () => toolbarObserver.disconnect(), { + once: true + }); + } + #isOnSameLine(rect1, rect2) { + const top1 = rect1.y; + const bot1 = rect1.bottom; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.bottom; + const mid2 = rect2.y + rect2.height / 2; + return top1 <= mid2 && mid2 <= bot1 || top2 <= mid1 && mid1 <= bot2; + } + #isUnderOver(rect, x, y, isUp) { + const midY = rect.y + rect.height / 2; + return (isUp ? y >= midY : y <= midY) && rect.x - PRECISION <= x && x <= rect.right + PRECISION; + } + #isVisible(rect) { + return rect.top >= this.#toolBarHeight && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth); + } + #getCaretPosition(selection, isUp) { + const { + focusNode, + focusOffset + } = selection; + const range = document.createRange(); + range.setStart(focusNode, focusOffset); + range.setEnd(focusNode, focusOffset); + const rect = range.getBoundingClientRect(); + return [rect.x, isUp ? rect.top : rect.bottom]; + } + static #caretPositionFromPoint(x, y) { + if (!document.caretPositionFromPoint) { + const { + startContainer: offsetNode, + startOffset: offset + } = document.caretRangeFromPoint(x, y); + return { + offsetNode, + offset + }; + } + return document.caretPositionFromPoint(x, y); + } + #setCaretPositionHelper(selection, caretX, select, element, rect) { + rect ||= element.getBoundingClientRect(); + if (caretX <= rect.x + PRECISION) { + if (select) { + selection.extend(element.firstChild, 0); + } else { + selection.setPosition(element.firstChild, 0); + } + return; + } + if (rect.right - PRECISION <= caretX) { + const { + lastChild + } = element; + if (select) { + selection.extend(lastChild, lastChild.length); + } else { + selection.setPosition(lastChild, lastChild.length); + } + return; + } + const midY = rect.y + rect.height / 2; + let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY); + let parentElement = caretPosition.offsetNode?.parentElement; + if (parentElement && parentElement !== element) { + const elementsAtPoint = document.elementsFromPoint(caretX, midY); + const savedVisibilities = []; + for (const el of elementsAtPoint) { + if (el === element) { + break; + } + const { + style + } = el; + savedVisibilities.push([el, style.visibility]); + style.visibility = "hidden"; + } + caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY); + parentElement = caretPosition.offsetNode?.parentElement; + for (const [el, visibility] of savedVisibilities) { + el.style.visibility = visibility; + } + } + if (parentElement !== element) { + if (select) { + selection.extend(element.firstChild, 0); + } else { + selection.setPosition(element.firstChild, 0); + } + return; + } + if (select) { + selection.extend(caretPosition.offsetNode, caretPosition.offset); + } else { + selection.setPosition(caretPosition.offsetNode, caretPosition.offset); + } + } + #setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX) { + if (this.#isVisible(newLineElementRect)) { + this.#setCaretPositionHelper(selection, caretX, select, newLineElement, newLineElementRect); + return; + } + this.#mainContainer.addEventListener("scrollend", this.#setCaretPositionHelper.bind(this, selection, caretX, select, newLineElement, null), { + once: true + }); + newLineElement.scrollIntoView(); + } + #getNodeOnNextPage(textLayer, isUp) { + while (true) { + const page = textLayer.closest(".page"); + const pageNumber = parseInt(page.getAttribute("data-page-number")); + const nextPage = isUp ? pageNumber - 1 : pageNumber + 1; + textLayer = this.#viewerContainer.querySelector(`.page[data-page-number="${nextPage}"] .textLayer`); + if (!textLayer) { + return null; + } + const walker = document.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT); + const node = isUp ? walker.lastChild() : walker.firstChild(); + if (node) { + return node; + } + } + } + moveCaret(isUp, select) { + const selection = document.getSelection(); + if (selection.rangeCount === 0) { + return; + } + const { + focusNode + } = selection; + const focusElement = focusNode.nodeType !== Node.ELEMENT_NODE ? focusNode.parentElement : focusNode; + const root = focusElement.closest(".textLayer"); + if (!root) { + return; + } + const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT); + walker.currentNode = focusNode; + const focusRect = focusElement.getBoundingClientRect(); + let newLineElement = null; + const nodeIterator = (isUp ? walker.previousSibling : walker.nextSibling).bind(walker); + while (nodeIterator()) { + const element = walker.currentNode.parentElement; + if (!this.#isOnSameLine(focusRect, element.getBoundingClientRect())) { + newLineElement = element; + break; + } + } + if (!newLineElement) { + const node = this.#getNodeOnNextPage(root, isUp); + if (!node) { + return; + } + if (select) { + const lastNode = (isUp ? walker.firstChild() : walker.lastChild()) || focusNode; + selection.extend(lastNode, isUp ? 0 : lastNode.length); + const range = document.createRange(); + range.setStart(node, isUp ? node.length : 0); + range.setEnd(node, isUp ? node.length : 0); + selection.addRange(range); + return; + } + const [caretX] = this.#getCaretPosition(selection, isUp); + const { + parentElement + } = node; + this.#setCaretPosition(select, selection, parentElement, parentElement.getBoundingClientRect(), caretX); + return; + } + const [caretX, caretY] = this.#getCaretPosition(selection, isUp); + const newLineElementRect = newLineElement.getBoundingClientRect(); + if (this.#isUnderOver(newLineElementRect, caretX, caretY, isUp)) { + this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX); + return; + } + while (nodeIterator()) { + const element = walker.currentNode.parentElement; + const elementRect = element.getBoundingClientRect(); + if (!this.#isOnSameLine(newLineElementRect, elementRect)) { + break; + } + if (this.#isUnderOver(elementRect, caretX, caretY, isUp)) { + this.#setCaretPosition(select, selection, element, elementRect, caretX); + return; + } + } + this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX); + } +} + +;// ./web/download_manager.js + +function download(blobUrl, filename) { + const a = document.createElement("a"); + if (!a.click) { + throw new Error('DownloadManager: "a.click()" is not supported.'); + } + a.href = blobUrl; + a.target = "_parent"; + if ("download" in a) { + a.download = filename; + } + (document.body || document.documentElement).append(a); + a.click(); + a.remove(); +} +class DownloadManager { + #openBlobUrls = new WeakMap(); + downloadData(data, filename, contentType) { + const blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + download(blobUrl, filename); + } + openOrDownloadData(data, filename, dest = null) { + const isPdfData = isPdfFile(filename); + const contentType = isPdfData ? "application/pdf" : ""; + if (isPdfData) { + let blobUrl = this.#openBlobUrls.get(data); + if (!blobUrl) { + blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + this.#openBlobUrls.set(data, blobUrl); + } + let viewerUrl; + viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename); + if (dest) { + viewerUrl += `#${escape(dest)}`; + } + try { + window.open(viewerUrl); + return true; + } catch (ex) { + console.error("openOrDownloadData:", ex); + URL.revokeObjectURL(blobUrl); + this.#openBlobUrls.delete(data); + } + } + this.downloadData(data, filename, contentType); + return false; + } + download(data, url, filename) { + let blobUrl; + if (data) { + blobUrl = URL.createObjectURL(new Blob([data], { + type: "application/pdf" + })); + } else { + if (!createValidAbsoluteUrl(url, "http://example.com")) { + console.error(`download - not a valid URL: ${url}`); + return; + } + blobUrl = url + "#pdfjs.action=download"; + } + download(blobUrl, filename); + } +} + +;// ./web/editor_undo_bar.js + +class EditorUndoBar { + #closeButton = null; + #container; + #eventBus = null; + #focusTimeout = null; + #initController = null; + isOpen = false; + #message; + #showController = null; + #undoButton; + static #l10nMessages = Object.freeze({ + highlight: "pdfjs-editor-undo-bar-message-highlight", + freetext: "pdfjs-editor-undo-bar-message-freetext", + stamp: "pdfjs-editor-undo-bar-message-stamp", + ink: "pdfjs-editor-undo-bar-message-ink", + signature: "pdfjs-editor-undo-bar-message-signature", + _multiple: "pdfjs-editor-undo-bar-message-multiple" + }); + constructor({ + container, + message, + undoButton, + closeButton + }, eventBus) { + this.#container = container; + this.#message = message; + this.#undoButton = undoButton; + this.#closeButton = closeButton; + this.#eventBus = eventBus; + } + destroy() { + this.#initController?.abort(); + this.#initController = null; + this.hide(); + } + show(undoAction, messageData) { + if (!this.#initController) { + this.#initController = new AbortController(); + const opts = { + signal: this.#initController.signal + }; + const boundHide = this.hide.bind(this); + this.#container.addEventListener("contextmenu", noContextMenu, opts); + this.#closeButton.addEventListener("click", boundHide, opts); + this.#eventBus._on("beforeprint", boundHide, opts); + this.#eventBus._on("download", boundHide, opts); + } + this.hide(); + if (typeof messageData === "string") { + this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages[messageData]); + } else { + this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages._multiple); + this.#message.setAttribute("data-l10n-args", JSON.stringify({ + count: messageData + })); + } + this.isOpen = true; + this.#container.hidden = false; + this.#showController = new AbortController(); + this.#undoButton.addEventListener("click", () => { + undoAction(); + this.hide(); + }, { + signal: this.#showController.signal + }); + this.#focusTimeout = setTimeout(() => { + this.#container.focus(); + this.#focusTimeout = null; + }, 100); + } + hide() { + if (!this.isOpen) { + return; + } + this.isOpen = false; + this.#container.hidden = true; + this.#showController?.abort(); + this.#showController = null; + if (this.#focusTimeout) { + clearTimeout(this.#focusTimeout); + this.#focusTimeout = null; + } + } +} + +;// ./web/overlay_manager.js +class OverlayManager { + #overlays = new WeakMap(); + #active = null; + get active() { + return this.#active; + } + async register(dialog, canForceClose = false) { + if (typeof dialog !== "object") { + throw new Error("Not enough parameters."); + } else if (this.#overlays.has(dialog)) { + throw new Error("The overlay is already registered."); + } + this.#overlays.set(dialog, { + canForceClose + }); + dialog.addEventListener("cancel", ({ + target + }) => { + if (this.#active === target) { + this.#active = null; + } + }); + } + async open(dialog) { + if (!this.#overlays.has(dialog)) { + throw new Error("The overlay does not exist."); + } else if (this.#active) { + if (this.#active === dialog) { + throw new Error("The overlay is already active."); + } else if (this.#overlays.get(dialog).canForceClose) { + await this.close(); + } else { + throw new Error("Another overlay is currently active."); + } + } + this.#active = dialog; + dialog.showModal(); + } + async close(dialog = this.#active) { + if (!this.#overlays.has(dialog)) { + 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 !== dialog) { + throw new Error("Another overlay is currently active."); + } + dialog.close(); + this.#active = null; + } + async closeIfActive(dialog) { + if (this.#active === dialog) { + await this.close(dialog); + } + } +} + +;// ./web/password_prompt.js + +class PasswordPrompt { + #activeCapability = null; + #updateCallback = null; + #reason = null; + constructor(options, overlayManager, isViewerEmbedded = false) { + this.dialog = options.dialog; + this.label = options.label; + this.input = options.input; + this.submitButton = options.submitButton; + this.cancelButton = options.cancelButton; + this.overlayManager = overlayManager; + this._isViewerEmbedded = isViewerEmbedded; + this.submitButton.addEventListener("click", this.#verify.bind(this)); + this.cancelButton.addEventListener("click", this.close.bind(this)); + this.input.addEventListener("keydown", e => { + if (e.keyCode === 13) { + this.#verify(); + } + }); + this.overlayManager.register(this.dialog, true); + this.dialog.addEventListener("close", this.#cancel.bind(this)); + } + async open() { + await this.#activeCapability?.promise; + this.#activeCapability = Promise.withResolvers(); + try { + await this.overlayManager.open(this.dialog); + } catch (ex) { + this.#activeCapability.resolve(); + throw ex; + } + const passwordIncorrect = this.#reason === PasswordResponses.INCORRECT_PASSWORD; + if (!this._isViewerEmbedded || passwordIncorrect) { + this.input.focus(); + } + this.label.setAttribute("data-l10n-id", passwordIncorrect ? "pdfjs-password-invalid" : "pdfjs-password-label"); + } + async close() { + this.overlayManager.closeIfActive(this.dialog); + } + #verify() { + const password = this.input.value; + if (password?.length > 0) { + this.#invokeCallback(password); + } + } + #cancel() { + this.#invokeCallback(new Error("PasswordPrompt cancelled.")); + this.#activeCapability.resolve(); + } + #invokeCallback(password) { + if (!this.#updateCallback) { + return; + } + this.close(); + this.input.value = ""; + this.#updateCallback(password); + this.#updateCallback = null; + } + async setUpdateCallback(updateCallback, reason) { + if (this.#activeCapability) { + await this.#activeCapability.promise; + } + this.#updateCallback = updateCallback; + this.#reason = reason; + } +} + +;// ./web/base_tree_viewer.js + +const TREEITEM_OFFSET_TOP = -100; +const TREEITEM_SELECTED_CLASS = "selected"; +class BaseTreeViewer { + constructor(options) { + this.container = options.container; + this.eventBus = options.eventBus; + this._l10n = options.l10n; + this.reset(); + } + reset() { + this._pdfDocument = null; + this._lastToggleIsShow = true; + this._currentTreeItem = null; + this.container.textContent = ""; + this.container.classList.remove("treeWithDeepNesting"); + } + _dispatchEvent(count) { + throw new Error("Not implemented: _dispatchEvent"); + } + _bindLink(element, params) { + throw new Error("Not implemented: _bindLink"); + } + _normalizeTextContent(str) { + return removeNullCharacters(str, true) || "\u2013"; + } + _addToggleButton(div, hidden = false) { + const toggler = document.createElement("div"); + toggler.className = "treeItemToggler"; + if (hidden) { + toggler.classList.add("treeItemsHidden"); + } + toggler.onclick = evt => { + evt.stopPropagation(); + toggler.classList.toggle("treeItemsHidden"); + if (evt.shiftKey) { + const shouldShowAll = !toggler.classList.contains("treeItemsHidden"); + this._toggleTreeItem(div, shouldShowAll); + } + }; + div.prepend(toggler); + } + _toggleTreeItem(root, show = false) { + this._l10n.pause(); + this._lastToggleIsShow = show; + for (const toggler of root.querySelectorAll(".treeItemToggler")) { + toggler.classList.toggle("treeItemsHidden", !show); + } + this._l10n.resume(); + } + _toggleAllTreeItems() { + this._toggleTreeItem(this.container, !this._lastToggleIsShow); + } + _finishRendering(fragment, count, hasAnyNesting = false) { + if (hasAnyNesting) { + this.container.classList.add("treeWithDeepNesting"); + this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden"); + } + this._l10n.pause(); + this.container.append(fragment); + this._l10n.resume(); + this._dispatchEvent(count); + } + render(params) { + throw new Error("Not implemented: render"); + } + _updateCurrentTreeItem(treeItem = null) { + if (this._currentTreeItem) { + this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = null; + } + if (treeItem) { + treeItem.classList.add(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = treeItem; + } + } + _scrollToCurrentTreeItem(treeItem) { + if (!treeItem) { + return; + } + this._l10n.pause(); + let currentNode = treeItem.parentNode; + while (currentNode && currentNode !== this.container) { + if (currentNode.classList.contains("treeItem")) { + const toggler = currentNode.firstElementChild; + toggler?.classList.remove("treeItemsHidden"); + } + currentNode = currentNode.parentNode; + } + this._l10n.resume(); + this._updateCurrentTreeItem(treeItem); + this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP); + } +} + +;// ./web/pdf_attachment_viewer.js + + +class PDFAttachmentViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.downloadManager = options.downloadManager; + this.eventBus._on("fileattachmentannotation", this.#appendAttachment.bind(this)); + } + reset(keepRenderedCapability = false) { + super.reset(); + this._attachments = null; + if (!keepRenderedCapability) { + this._renderedCapability = Promise.withResolvers(); + } + this._pendingDispatchEvent = false; + } + async _dispatchEvent(attachmentsCount) { + this._renderedCapability.resolve(); + if (attachmentsCount === 0 && !this._pendingDispatchEvent) { + this._pendingDispatchEvent = true; + await waitOnEventOrTimeout({ + target: this.eventBus, + name: "annotationlayerrendered", + delay: 1000 + }); + if (!this._pendingDispatchEvent) { + return; + } + } + this._pendingDispatchEvent = false; + this.eventBus.dispatch("attachmentsloaded", { + source: this, + attachmentsCount + }); + } + _bindLink(element, { + content, + description, + filename + }) { + if (description) { + element.title = description; + } + element.onclick = () => { + this.downloadManager.openOrDownloadData(content, filename); + return false; + }; + } + render({ + attachments, + keepRenderedCapability = false + }) { + if (this._attachments) { + this.reset(keepRenderedCapability); + } + this._attachments = attachments || null; + if (!attachments) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + let attachmentsCount = 0; + for (const name in attachments) { + const item = attachments[name]; + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + this._bindLink(element, item); + element.textContent = this._normalizeTextContent(item.filename); + div.append(element); + fragment.append(div); + attachmentsCount++; + } + this._finishRendering(fragment, attachmentsCount); + } + #appendAttachment(item) { + const renderedPromise = this._renderedCapability.promise; + renderedPromise.then(() => { + if (renderedPromise !== this._renderedCapability.promise) { + return; + } + const attachments = this._attachments || Object.create(null); + for (const name in attachments) { + if (item.filename === name) { + return; + } + } + attachments[item.filename] = item; + this.render({ + attachments, + keepRenderedCapability: true + }); + }); + } +} + +;// ./web/grab_to_pan.js + +const CSS_CLASS_GRAB = "grab-to-pan-grab"; +class GrabToPan { + #activateAC = null; + #mouseDownAC = null; + #scrollAC = null; + constructor({ + element + }) { + this.element = element; + this.document = element.ownerDocument; + const overlay = this.overlay = document.createElement("div"); + overlay.className = "grab-to-pan-grabbing"; + } + activate() { + if (!this.#activateAC) { + this.#activateAC = new AbortController(); + this.element.addEventListener("mousedown", this.#onMouseDown.bind(this), { + capture: true, + signal: this.#activateAC.signal + }); + this.element.classList.add(CSS_CLASS_GRAB); + } + } + deactivate() { + if (this.#activateAC) { + this.#activateAC.abort(); + this.#activateAC = null; + this.#endPan(); + this.element.classList.remove(CSS_CLASS_GRAB); + } + } + toggle() { + if (this.#activateAC) { + this.deactivate(); + } else { + this.activate(); + } + } + ignoreTarget(node) { + return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option"); + } + #onMouseDown(event) { + if (event.button !== 0 || this.ignoreTarget(event.target)) { + return; + } + if (event.originalTarget) { + try { + event.originalTarget.tagName; + } catch { + return; + } + } + this.scrollLeftStart = this.element.scrollLeft; + this.scrollTopStart = this.element.scrollTop; + this.clientXStart = event.clientX; + this.clientYStart = event.clientY; + this.#mouseDownAC = new AbortController(); + const boundEndPan = this.#endPan.bind(this), + mouseOpts = { + capture: true, + signal: this.#mouseDownAC.signal + }; + this.document.addEventListener("mousemove", this.#onMouseMove.bind(this), mouseOpts); + this.document.addEventListener("mouseup", boundEndPan, mouseOpts); + this.#scrollAC = new AbortController(); + this.element.addEventListener("scroll", boundEndPan, { + capture: true, + signal: this.#scrollAC.signal + }); + stopEvent(event); + const focusedElement = document.activeElement; + if (focusedElement && !focusedElement.contains(event.target)) { + focusedElement.blur(); + } + } + #onMouseMove(event) { + this.#scrollAC?.abort(); + this.#scrollAC = null; + if (!(event.buttons & 1)) { + this.#endPan(); + return; + } + const xDiff = event.clientX - this.clientXStart; + const yDiff = event.clientY - this.clientYStart; + this.element.scrollTo({ + top: this.scrollTopStart - yDiff, + left: this.scrollLeftStart - xDiff, + behavior: "instant" + }); + if (!this.overlay.parentNode) { + document.body.append(this.overlay); + } + } + #endPan() { + this.#mouseDownAC?.abort(); + this.#mouseDownAC = null; + this.#scrollAC?.abort(); + this.#scrollAC = null; + this.overlay.remove(); + } +} + +;// ./web/pdf_cursor_tools.js + + + +class PDFCursorTools { + #active = CursorTool.SELECT; + #prevActive = null; + constructor({ + container, + eventBus, + cursorToolOnLoad = CursorTool.SELECT + }) { + this.container = container; + this.eventBus = eventBus; + this.#addEventListeners(); + Promise.resolve().then(() => { + this.switchTool(cursorToolOnLoad); + }); + } + get activeTool() { + return this.#active; + } + switchTool(tool) { + if (this.#prevActive !== null) { + return; + } + this.#switchTool(tool); + } + #switchTool(tool, disabled = false) { + if (tool === this.#active) { + if (this.#prevActive !== null) { + this.eventBus.dispatch("cursortoolchanged", { + source: this, + tool, + disabled + }); + } + return; + } + const disableActiveTool = () => { + switch (this.#active) { + case CursorTool.SELECT: + break; + case CursorTool.HAND: + this._handTool.deactivate(); + break; + case CursorTool.ZOOM: + } + }; + switch (tool) { + case CursorTool.SELECT: + disableActiveTool(); + break; + case CursorTool.HAND: + disableActiveTool(); + this._handTool.activate(); + break; + case CursorTool.ZOOM: + default: + console.error(`switchTool: "${tool}" is an unsupported value.`); + return; + } + this.#active = tool; + this.eventBus.dispatch("cursortoolchanged", { + source: this, + tool, + disabled + }); + } + #addEventListeners() { + this.eventBus._on("switchcursortool", evt => { + if (!evt.reset) { + this.switchTool(evt.tool); + } else if (this.#prevActive !== null) { + annotationEditorMode = AnnotationEditorType.NONE; + presentationModeState = PresentationModeState.NORMAL; + enableActive(); + } + }); + let annotationEditorMode = AnnotationEditorType.NONE, + presentationModeState = PresentationModeState.NORMAL; + const disableActive = () => { + this.#prevActive ??= this.#active; + this.#switchTool(CursorTool.SELECT, true); + }; + const enableActive = () => { + if (this.#prevActive !== null && annotationEditorMode === AnnotationEditorType.NONE && presentationModeState === PresentationModeState.NORMAL) { + this.#switchTool(this.#prevActive); + this.#prevActive = null; + } + }; + this.eventBus._on("annotationeditormodechanged", ({ + mode + }) => { + annotationEditorMode = mode; + if (mode === AnnotationEditorType.NONE) { + enableActive(); + } else { + disableActive(); + } + }); + this.eventBus._on("presentationmodechanged", ({ + state + }) => { + presentationModeState = state; + if (state === PresentationModeState.NORMAL) { + enableActive(); + } else if (state === PresentationModeState.FULLSCREEN) { + disableActive(); + } + }); + } + get _handTool() { + return shadow(this, "_handTool", new GrabToPan({ + element: this.container + })); + } +} + +;// ./web/pdf_document_properties.js + + +const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"]; +const US_PAGE_NAMES = { + "8.5x11": "pdfjs-document-properties-page-size-name-letter", + "8.5x14": "pdfjs-document-properties-page-size-name-legal" +}; +const METRIC_PAGE_NAMES = { + "297x420": "pdfjs-document-properties-page-size-name-a-three", + "210x297": "pdfjs-document-properties-page-size-name-a-four" +}; +function getPageName(size, isPortrait, pageNames) { + const width = isPortrait ? size.width : size.height; + const height = isPortrait ? size.height : size.width; + return pageNames[`${width}x${height}`]; +} +class PDFDocumentProperties { + #fieldData = null; + constructor({ + dialog, + fields, + closeButton + }, overlayManager, eventBus, l10n, fileNameLookup) { + this.dialog = dialog; + this.fields = fields; + this.overlayManager = overlayManager; + this.l10n = l10n; + this._fileNameLookup = fileNameLookup; + this.#reset(); + closeButton.addEventListener("click", this.close.bind(this)); + this.overlayManager.register(this.dialog); + eventBus._on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }); + eventBus._on("rotationchanging", evt => { + this._pagesRotation = evt.pagesRotation; + }); + } + async open() { + await Promise.all([this.overlayManager.open(this.dialog), this._dataAvailableCapability.promise]); + const currentPageNumber = this._currentPageNumber; + const pagesRotation = this._pagesRotation; + if (this.#fieldData && currentPageNumber === this.#fieldData._currentPageNumber && pagesRotation === this.#fieldData._pagesRotation) { + this.#updateUI(); + return; + } + const [{ + info, + contentLength + }, pdfPage] = await Promise.all([this.pdfDocument.getMetadata(), this.pdfDocument.getPage(currentPageNumber)]); + const [fileName, fileSize, creationDate, modificationDate, pageSize, isLinearized] = await Promise.all([this._fileNameLookup(), this.#parseFileSize(contentLength), this.#parseDate(info.CreationDate), this.#parseDate(info.ModDate), this.#parsePageSize(getPageSizeInches(pdfPage), pagesRotation), this.#parseLinearization(info.IsLinearized)]); + this.#fieldData = Object.freeze({ + fileName, + fileSize, + title: info.Title, + author: info.Author, + subject: info.Subject, + keywords: info.Keywords, + creationDate, + modificationDate, + creator: info.Creator, + producer: info.Producer, + version: info.PDFFormatVersion, + pageCount: this.pdfDocument.numPages, + pageSize, + linearized: isLinearized, + _currentPageNumber: currentPageNumber, + _pagesRotation: pagesRotation + }); + this.#updateUI(); + const { + length + } = await this.pdfDocument.getDownloadInfo(); + if (contentLength === length) { + return; + } + const data = Object.assign(Object.create(null), this.#fieldData); + data.fileSize = await this.#parseFileSize(length); + this.#fieldData = Object.freeze(data); + this.#updateUI(); + } + async close() { + this.overlayManager.close(this.dialog); + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#reset(); + this.#updateUI(); + } + if (!pdfDocument) { + return; + } + this.pdfDocument = pdfDocument; + this._dataAvailableCapability.resolve(); + } + #reset() { + this.pdfDocument = null; + this.#fieldData = null; + this._dataAvailableCapability = Promise.withResolvers(); + this._currentPageNumber = 1; + this._pagesRotation = 0; + } + #updateUI() { + if (this.#fieldData && this.overlayManager.active !== this.dialog) { + return; + } + for (const id in this.fields) { + const content = this.#fieldData?.[id]; + this.fields[id].textContent = content || content === 0 ? content : "-"; + } + } + async #parseFileSize(b = 0) { + const kb = b / 1024, + mb = kb / 1024; + return kb ? this.l10n.get(mb >= 1 ? "pdfjs-document-properties-size-mb" : "pdfjs-document-properties-size-kb", { + mb, + kb, + b + }) : undefined; + } + async #parsePageSize(pageSizeInches, pagesRotation) { + if (!pageSizeInches) { + return undefined; + } + if (pagesRotation % 180 !== 0) { + pageSizeInches = { + width: pageSizeInches.height, + height: pageSizeInches.width + }; + } + const isPortrait = isPortraitOrientation(pageSizeInches), + nonMetric = NON_METRIC_LOCALES.includes(this.l10n.getLanguage()); + let sizeInches = { + width: Math.round(pageSizeInches.width * 100) / 100, + height: Math.round(pageSizeInches.height * 100) / 100 + }; + let sizeMillimeters = { + width: Math.round(pageSizeInches.width * 25.4 * 10) / 10, + height: Math.round(pageSizeInches.height * 25.4 * 10) / 10 + }; + let nameId = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (!nameId && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) { + const exactMillimeters = { + width: pageSizeInches.width * 25.4, + height: pageSizeInches.height * 25.4 + }; + const intMillimeters = { + width: Math.round(sizeMillimeters.width), + height: Math.round(sizeMillimeters.height) + }; + if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) { + nameId = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (nameId) { + sizeInches = { + width: Math.round(intMillimeters.width / 25.4 * 100) / 100, + height: Math.round(intMillimeters.height / 25.4 * 100) / 100 + }; + sizeMillimeters = intMillimeters; + } + } + } + const [{ + width, + height + }, unit, name, orientation] = await Promise.all([nonMetric ? sizeInches : sizeMillimeters, this.l10n.get(nonMetric ? "pdfjs-document-properties-page-size-unit-inches" : "pdfjs-document-properties-page-size-unit-millimeters"), nameId && this.l10n.get(nameId), this.l10n.get(isPortrait ? "pdfjs-document-properties-page-size-orientation-portrait" : "pdfjs-document-properties-page-size-orientation-landscape")]); + return this.l10n.get(name ? "pdfjs-document-properties-page-size-dimension-name-string" : "pdfjs-document-properties-page-size-dimension-string", { + width, + height, + unit, + name, + orientation + }); + } + async #parseDate(inputDate) { + const dateObj = PDFDateString.toDateObject(inputDate); + return dateObj ? this.l10n.get("pdfjs-document-properties-date-time-string", { + dateObj: dateObj.valueOf() + }) : undefined; + } + #parseLinearization(isLinearized) { + return this.l10n.get(isLinearized ? "pdfjs-document-properties-linearized-yes" : "pdfjs-document-properties-linearized-no"); + } +} + +;// ./web/pdf_find_utils.js +const CharacterType = { + SPACE: 0, + ALPHA_LETTER: 1, + PUNCT: 2, + HAN_LETTER: 3, + KATAKANA_LETTER: 4, + HIRAGANA_LETTER: 5, + HALFWIDTH_KATAKANA_LETTER: 6, + THAI_LETTER: 7 +}; +function isAlphabeticalScript(charCode) { + return charCode < 0x2e80; +} +function isAscii(charCode) { + return (charCode & 0xff80) === 0; +} +function isAsciiAlpha(charCode) { + return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a; +} +function isAsciiDigit(charCode) { + return charCode >= 0x30 && charCode <= 0x39; +} +function isAsciiSpace(charCode) { + return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a; +} +function isHan(charCode) { + return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff; +} +function isKatakana(charCode) { + return charCode >= 0x30a0 && charCode <= 0x30ff; +} +function isHiragana(charCode) { + return charCode >= 0x3040 && charCode <= 0x309f; +} +function isHalfwidthKatakana(charCode) { + return charCode >= 0xff60 && charCode <= 0xff9f; +} +function isThai(charCode) { + return (charCode & 0xff80) === 0x0e00; +} +function getCharacterType(charCode) { + if (isAlphabeticalScript(charCode)) { + if (isAscii(charCode)) { + if (isAsciiSpace(charCode)) { + return CharacterType.SPACE; + } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) { + return CharacterType.ALPHA_LETTER; + } + return CharacterType.PUNCT; + } else if (isThai(charCode)) { + return CharacterType.THAI_LETTER; + } else if (charCode === 0xa0) { + return CharacterType.SPACE; + } + return CharacterType.ALPHA_LETTER; + } + if (isHan(charCode)) { + return CharacterType.HAN_LETTER; + } else if (isKatakana(charCode)) { + return CharacterType.KATAKANA_LETTER; + } else if (isHiragana(charCode)) { + return CharacterType.HIRAGANA_LETTER; + } else if (isHalfwidthKatakana(charCode)) { + return CharacterType.HALFWIDTH_KATAKANA_LETTER; + } + return CharacterType.ALPHA_LETTER; +} +let NormalizeWithNFKC; +function getNormalizeWithNFKC() { + NormalizeWithNFKC ||= ` ¨ª¯²-µ¸-º¼-¾IJ-ijĿ-ŀʼnſDŽ-njDZ-dzʰ-ʸ˘-˝ˠ-ˤʹͺ;΄-΅·ϐ-ϖϰ-ϲϴ-ϵϹևٵ-ٸक़-य़ড়-ঢ়য়ਲ਼ਸ਼ਖ਼-ਜ਼ਫ਼ଡ଼-ଢ଼ำຳໜ-ໝ༌གྷཌྷདྷབྷཛྷཀྵჼᴬ-ᴮᴰ-ᴺᴼ-ᵍᵏ-ᵪᵸᶛ-ᶿẚ-ẛάέήίόύώΆ᾽-῁ΈΉ῍-῏ΐΊ῝-῟ΰΎ῭-`ΌΏ´-῾ - ‑‗․-… ″-‴‶-‷‼‾⁇-⁉⁗ ⁰-ⁱ⁴-₎ₐ-ₜ₨℀-℃℅-ℇ℉-ℓℕ-№ℙ-ℝ℠-™ℤΩℨK-ℭℯ-ℱℳ-ℹ℻-⅀ⅅ-ⅉ⅐-ⅿ↉∬-∭∯-∰〈-〉①-⓪⨌⩴-⩶⫝̸ⱼ-ⱽⵯ⺟⻳⼀-⿕ 〶〸-〺゛-゜ゟヿㄱ-ㆎ㆒-㆟㈀-㈞㈠-㉇㉐-㉾㊀-㏿ꚜ-ꚝꝰꟲ-ꟴꟸ-ꟹꭜ-ꭟꭩ豈-嗀塚晴凞-羽蘒諸逸-都飯-舘並-龎ff-stﬓ-ﬗיִײַ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-﷼︐-︙︰-﹄﹇-﹒﹔-﹦﹨-﹫ﹰ-ﹲﹴﹶ-ﻼ!-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ¢-₩`; + return NormalizeWithNFKC; +} + +;// ./web/pdf_find_controller.js + + +const FindState = { + FOUND: 0, + NOT_FOUND: 1, + WRAPPED: 2, + PENDING: 3 +}; +const FIND_TIMEOUT = 250; +const MATCH_SCROLL_OFFSET_TOP = -50; +const MATCH_SCROLL_OFFSET_LEFT = -400; +const CHARACTERS_TO_NORMALIZE = { + "\u2010": "-", + "\u2018": "'", + "\u2019": "'", + "\u201A": "'", + "\u201B": "'", + "\u201C": '"', + "\u201D": '"', + "\u201E": '"', + "\u201F": '"', + "\u00BC": "1/4", + "\u00BD": "1/2", + "\u00BE": "3/4" +}; +const DIACRITICS_EXCEPTION = new Set([0x3099, 0x309a, 0x094d, 0x09cd, 0x0a4d, 0x0acd, 0x0b4d, 0x0bcd, 0x0c4d, 0x0ccd, 0x0d3b, 0x0d3c, 0x0d4d, 0x0dca, 0x0e3a, 0x0eba, 0x0f84, 0x1039, 0x103a, 0x1714, 0x1734, 0x17d2, 0x1a60, 0x1b44, 0x1baa, 0x1bab, 0x1bf2, 0x1bf3, 0x2d7f, 0xa806, 0xa82c, 0xa8c4, 0xa953, 0xa9c0, 0xaaf6, 0xabed, 0x0c56, 0x0f71, 0x0f72, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f80, 0x0f74]); +let DIACRITICS_EXCEPTION_STR; +const DIACRITICS_REG_EXP = /\p{M}+/gu; +const SPECIAL_CHARS_REG_EXP = /([.*+?^${}()|[\]\\])|(\p{P})|(\s+)|(\p{M})|(\p{L})/gu; +const NOT_DIACRITIC_FROM_END_REG_EXP = /([^\p{M}])\p{M}*$/u; +const NOT_DIACRITIC_FROM_START_REG_EXP = /^\p{M}*([^\p{M}])/u; +const SYLLABLES_REG_EXP = /[\uAC00-\uD7AF\uFA6C\uFACF-\uFAD1\uFAD5-\uFAD7]+/g; +const SYLLABLES_LENGTHS = new Map(); +const FIRST_CHAR_SYLLABLES_REG_EXP = "[\\u1100-\\u1112\\ud7a4-\\ud7af\\ud84a\\ud84c\\ud850\\ud854\\ud857\\ud85f]"; +const NFKC_CHARS_TO_NORMALIZE = new Map(); +let noSyllablesRegExp = null; +let withSyllablesRegExp = null; +function normalize(text) { + const syllablePositions = []; + let m; + while ((m = SYLLABLES_REG_EXP.exec(text)) !== null) { + let { + index + } = m; + for (const char of m[0]) { + let len = SYLLABLES_LENGTHS.get(char); + if (!len) { + len = char.normalize("NFD").length; + SYLLABLES_LENGTHS.set(char, len); + } + syllablePositions.push([len, index++]); + } + } + const hasSyllables = syllablePositions.length > 0; + let normalizationRegex; + if (!hasSyllables && noSyllablesRegExp) { + normalizationRegex = noSyllablesRegExp; + } else if (hasSyllables && withSyllablesRegExp) { + normalizationRegex = withSyllablesRegExp; + } else { + const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(""); + const toNormalizeWithNFKC = getNormalizeWithNFKC(); + const CJK = "(?:\\p{Ideographic}|[\u3040-\u30FF])"; + const HKDiacritics = "(?:\u3099|\u309A)"; + const BrokenWord = `\\p{Ll}-\\n(?=\\p{Ll})|\\p{Lu}-\\n(?=\\p{L})`; + const regexps = [`[${replace}]`, `[${toNormalizeWithNFKC}]`, `${HKDiacritics}\\n`, "\\p{M}+(?:-\\n)?", `${BrokenWord}`, "\\S-\\n", `${CJK}\\n`, "\\n", hasSyllables ? FIRST_CHAR_SYLLABLES_REG_EXP : "\\u0000"]; + normalizationRegex = new RegExp(regexps.map(r => `(${r})`).join("|"), "gum"); + if (hasSyllables) { + withSyllablesRegExp = normalizationRegex; + } else { + noSyllablesRegExp = normalizationRegex; + } + } + const rawDiacriticsPositions = []; + while ((m = DIACRITICS_REG_EXP.exec(text)) !== null) { + rawDiacriticsPositions.push([m[0].length, m.index]); + } + let normalized = text.normalize("NFD"); + const positions = [0, 0]; + let rawDiacriticsIndex = 0; + let syllableIndex = 0; + let shift = 0; + let shiftOrigin = 0; + let eol = 0; + let hasDiacritics = false; + normalized = normalized.replace(normalizationRegex, (match, p1, p2, p3, p4, p5, p6, p7, p8, p9, i) => { + i -= shiftOrigin; + if (p1) { + const replacement = CHARACTERS_TO_NORMALIZE[p1]; + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push(i - shift + j, shift - j); + } + shift -= jj - 1; + return replacement; + } + if (p2) { + let replacement = NFKC_CHARS_TO_NORMALIZE.get(p2); + if (!replacement) { + replacement = p2.normalize("NFKC"); + NFKC_CHARS_TO_NORMALIZE.set(p2, replacement); + } + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push(i - shift + j, shift - j); + } + shift -= jj - 1; + return replacement; + } + if (p3) { + hasDiacritics = true; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + ++rawDiacriticsIndex; + } else { + positions.push(i - 1 - shift + 1, shift - 1); + shift -= 1; + shiftOrigin += 1; + } + positions.push(i - shift + 1, shift); + shiftOrigin += 1; + eol += 1; + return p3.charAt(0); + } + if (p4) { + const hasTrailingDashEOL = p4.endsWith("\n"); + const len = hasTrailingDashEOL ? p4.length - 2 : p4.length; + hasDiacritics = true; + let jj = len; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + jj -= rawDiacriticsPositions[rawDiacriticsIndex][0]; + ++rawDiacriticsIndex; + } + for (let j = 1; j <= jj; j++) { + positions.push(i - 1 - shift + j, shift - j); + } + shift -= jj; + shiftOrigin += jj; + if (hasTrailingDashEOL) { + i += len - 1; + positions.push(i - shift + 1, 1 + shift); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p4.slice(0, len); + } + return p4; + } + if (p5) { + const len = p5.length - 2; + positions.push(i - shift + len, 1 + shift); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p5.slice(0, -2); + } + if (p6) { + shiftOrigin += 1; + eol += 1; + return p6.slice(0, -1); + } + if (p7) { + const len = p7.length - 1; + positions.push(i - shift + len, shift); + shiftOrigin += 1; + eol += 1; + return p7.slice(0, -1); + } + if (p8) { + positions.push(i - shift + 1, shift - 1); + shift -= 1; + shiftOrigin += 1; + eol += 1; + return " "; + } + if (i + eol === syllablePositions[syllableIndex]?.[1]) { + const newCharLen = syllablePositions[syllableIndex][0] - 1; + ++syllableIndex; + for (let j = 1; j <= newCharLen; j++) { + positions.push(i - (shift - j), shift - j); + } + shift -= newCharLen; + shiftOrigin += newCharLen; + } + return p9; + }); + positions.push(normalized.length, shift); + const starts = new Uint32Array(positions.length >> 1); + const shifts = new Int32Array(positions.length >> 1); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + starts[i >> 1] = positions[i]; + shifts[i >> 1] = positions[i + 1]; + } + return [normalized, [starts, shifts], hasDiacritics]; +} +function getOriginalIndex(diffs, pos, len) { + if (!diffs) { + return [pos, len]; + } + const [starts, shifts] = diffs; + const start = pos; + const end = pos + len - 1; + let i = binarySearchFirstItem(starts, x => x >= start); + if (starts[i] > start) { + --i; + } + let j = binarySearchFirstItem(starts, x => x >= end, i); + if (starts[j] > end) { + --j; + } + const oldStart = start + shifts[i]; + const oldEnd = end + shifts[j]; + const oldLen = oldEnd + 1 - oldStart; + return [oldStart, oldLen]; +} +class PDFFindController { + #state = null; + #updateMatchesCountOnProgress = true; + #visitedPagesCount = 0; + constructor({ + linkService, + eventBus, + updateMatchesCountOnProgress = true + }) { + this._linkService = linkService; + this._eventBus = eventBus; + this.#updateMatchesCountOnProgress = updateMatchesCountOnProgress; + this.onIsPageVisible = null; + this.#reset(); + eventBus._on("find", this.#onFind.bind(this)); + eventBus._on("findbarclose", this.#onFindBarClose.bind(this)); + } + get highlightMatches() { + return this._highlightMatches; + } + get pageMatches() { + return this._pageMatches; + } + get pageMatchesLength() { + return this._pageMatchesLength; + } + get selected() { + return this._selected; + } + get state() { + return this.#state; + } + setDocument(pdfDocument) { + if (this._pdfDocument) { + this.#reset(); + } + if (!pdfDocument) { + return; + } + this._pdfDocument = pdfDocument; + this._firstPageCapability.resolve(); + } + #onFind(state) { + if (!state) { + return; + } + const pdfDocument = this._pdfDocument; + const { + type + } = state; + if (this.#state === null || this.#shouldDirtyMatch(state)) { + this._dirtyMatch = true; + } + this.#state = state; + if (type !== "highlightallchange") { + this.#updateUIState(FindState.PENDING); + } + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + this.#extractText(); + const findbarClosed = !this._highlightMatches; + const pendingTimeout = !!this._findTimeout; + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (!type) { + this._findTimeout = setTimeout(() => { + this.#nextMatch(); + this._findTimeout = null; + }, FIND_TIMEOUT); + } else if (this._dirtyMatch) { + this.#nextMatch(); + } else if (type === "again") { + this.#nextMatch(); + if (findbarClosed && this.#state.highlightAll) { + this.#updateAllPages(); + } + } else if (type === "highlightallchange") { + if (pendingTimeout) { + this.#nextMatch(); + } else { + this._highlightMatches = true; + } + this.#updateAllPages(); + } else { + this.#nextMatch(); + } + }); + } + scrollMatchIntoView({ + element = null, + selectedLeft = 0, + pageIndex = -1, + matchIndex = -1 + }) { + if (!this._scrollMatches || !element) { + return; + } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) { + return; + } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) { + return; + } + this._scrollMatches = false; + const spot = { + top: MATCH_SCROLL_OFFSET_TOP, + left: selectedLeft + MATCH_SCROLL_OFFSET_LEFT + }; + scrollIntoView(element, spot, true); + } + #reset() { + this._highlightMatches = false; + this._scrollMatches = false; + this._pdfDocument = null; + this._pageMatches = []; + this._pageMatchesLength = []; + this.#visitedPagesCount = 0; + this.#state = null; + this._selected = { + pageIdx: -1, + matchIdx: -1 + }; + this._offset = { + pageIdx: null, + matchIdx: null, + wrapped: false + }; + this._extractTextPromises = []; + this._pageContents = []; + this._pageDiffs = []; + this._hasDiacritics = []; + this._matchesCountTotal = 0; + this._pagesToSearch = null; + this._pendingFindMatches = new Set(); + this._resumePageIdx = null; + this._dirtyMatch = false; + clearTimeout(this._findTimeout); + this._findTimeout = null; + this._firstPageCapability = Promise.withResolvers(); + } + get #query() { + const { + query + } = this.#state; + if (typeof query === "string") { + if (query !== this._rawQuery) { + this._rawQuery = query; + [this._normalizedQuery] = normalize(query); + } + return this._normalizedQuery; + } + return (query || []).filter(q => !!q).map(q => normalize(q)[0]); + } + #shouldDirtyMatch(state) { + const newQuery = state.query, + prevQuery = this.#state.query; + const newType = typeof newQuery, + prevType = typeof prevQuery; + if (newType !== prevType) { + return true; + } + if (newType === "string") { + if (newQuery !== prevQuery) { + return true; + } + } else if (JSON.stringify(newQuery) !== JSON.stringify(prevQuery)) { + return true; + } + switch (state.type) { + case "again": + const pageNumber = this._selected.pageIdx + 1; + const linkService = this._linkService; + return pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !(this.onIsPageVisible?.(pageNumber) ?? true); + case "highlightallchange": + return false; + } + return true; + } + #isEntireWord(content, startIdx, length) { + let match = content.slice(0, startIdx).match(NOT_DIACRITIC_FROM_END_REG_EXP); + if (match) { + const first = content.charCodeAt(startIdx); + const limit = match[1].charCodeAt(0); + if (getCharacterType(first) === getCharacterType(limit)) { + return false; + } + } + match = content.slice(startIdx + length).match(NOT_DIACRITIC_FROM_START_REG_EXP); + if (match) { + const last = content.charCodeAt(startIdx + length - 1); + const limit = match[1].charCodeAt(0); + if (getCharacterType(last) === getCharacterType(limit)) { + return false; + } + } + return true; + } + #convertToRegExpString(query, hasDiacritics) { + const { + matchDiacritics + } = this.#state; + let isUnicode = false; + query = query.replaceAll(SPECIAL_CHARS_REG_EXP, (match, p1, p2, p3, p4, p5) => { + if (p1) { + return `[ ]*\\${p1}[ ]*`; + } + if (p2) { + return `[ ]*${p2}[ ]*`; + } + if (p3) { + return "[ ]+"; + } + if (matchDiacritics) { + return p4 || p5; + } + if (p4) { + return DIACRITICS_EXCEPTION.has(p4.charCodeAt(0)) ? p4 : ""; + } + if (hasDiacritics) { + isUnicode = true; + return `${p5}\\p{M}*`; + } + return p5; + }); + const trailingSpaces = "[ ]*"; + if (query.endsWith(trailingSpaces)) { + query = query.slice(0, query.length - trailingSpaces.length); + } + if (matchDiacritics) { + if (hasDiacritics) { + DIACRITICS_EXCEPTION_STR ||= String.fromCharCode(...DIACRITICS_EXCEPTION); + isUnicode = true; + query = `${query}(?=[${DIACRITICS_EXCEPTION_STR}]|[^\\p{M}]|$)`; + } + } + return [isUnicode, query]; + } + #calculateMatch(pageIndex) { + if (!this.#state) { + return; + } + const query = this.#query; + if (query.length === 0) { + return; + } + const pageContent = this._pageContents[pageIndex]; + const matcherResult = this.match(query, pageContent, pageIndex); + const matches = this._pageMatches[pageIndex] = []; + const matchesLength = this._pageMatchesLength[pageIndex] = []; + const diffs = this._pageDiffs[pageIndex]; + matcherResult?.forEach(({ + index, + length + }) => { + const [matchPos, matchLen] = getOriginalIndex(diffs, index, length); + if (matchLen) { + matches.push(matchPos); + matchesLength.push(matchLen); + } + }); + if (this.#state.highlightAll) { + this.#updatePage(pageIndex); + } + if (this._resumePageIdx === pageIndex) { + this._resumePageIdx = null; + this.#nextPageMatch(); + } + const pageMatchesCount = matches.length; + this._matchesCountTotal += pageMatchesCount; + if (this.#updateMatchesCountOnProgress) { + if (pageMatchesCount > 0) { + this.#updateUIResultsCount(); + } + } else if (++this.#visitedPagesCount === this._linkService.pagesCount) { + this.#updateUIResultsCount(); + } + } + match(query, pageContent, pageIndex) { + const hasDiacritics = this._hasDiacritics[pageIndex]; + let isUnicode = false; + if (typeof query === "string") { + [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics); + } else { + query = query.sort().reverse().map(q => { + const [isUnicodePart, queryPart] = this.#convertToRegExpString(q, hasDiacritics); + isUnicode ||= isUnicodePart; + return `(${queryPart})`; + }).join("|"); + } + if (!query) { + return undefined; + } + const { + caseSensitive, + entireWord + } = this.#state; + const flags = `g${isUnicode ? "u" : ""}${caseSensitive ? "" : "i"}`; + query = new RegExp(query, flags); + const matches = []; + let match; + while ((match = query.exec(pageContent)) !== null) { + if (entireWord && !this.#isEntireWord(pageContent, match.index, match[0].length)) { + continue; + } + matches.push({ + index: match.index, + length: match[0].length + }); + } + return matches; + } + #extractText() { + if (this._extractTextPromises.length > 0) { + return; + } + let deferred = Promise.resolve(); + const textOptions = { + disableNormalization: true + }; + const pdfDoc = this._pdfDocument; + for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) { + const { + promise, + resolve + } = Promise.withResolvers(); + this._extractTextPromises[i] = promise; + deferred = deferred.then(async () => { + if (pdfDoc !== this._pdfDocument) { + resolve(); + return; + } + await pdfDoc.getPage(i + 1).then(pdfPage => pdfPage.getTextContent(textOptions)).then(textContent => { + const strBuf = []; + for (const textItem of textContent.items) { + strBuf.push(textItem.str); + if (textItem.hasEOL) { + strBuf.push("\n"); + } + } + [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = normalize(strBuf.join("")); + resolve(); + }, reason => { + console.error(`Unable to get text content for page ${i + 1}`, reason); + this._pageContents[i] = ""; + this._pageDiffs[i] = null; + this._hasDiacritics[i] = false; + resolve(); + }); + }); + } + } + #updatePage(index) { + if (this._scrollMatches && this._selected.pageIdx === index) { + this._linkService.page = index + 1; + } + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: index + }); + } + #updateAllPages() { + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: -1 + }); + } + #nextMatch() { + const previous = this.#state.findPrevious; + const currentPageIndex = this._linkService.page - 1; + const numPages = this._linkService.pagesCount; + this._highlightMatches = true; + if (this._dirtyMatch) { + this._dirtyMatch = false; + this._selected.pageIdx = this._selected.matchIdx = -1; + this._offset.pageIdx = currentPageIndex; + this._offset.matchIdx = null; + this._offset.wrapped = false; + this._resumePageIdx = null; + this._pageMatches.length = 0; + this._pageMatchesLength.length = 0; + this.#visitedPagesCount = 0; + this._matchesCountTotal = 0; + this.#updateAllPages(); + for (let i = 0; i < numPages; i++) { + if (this._pendingFindMatches.has(i)) { + continue; + } + this._pendingFindMatches.add(i); + this._extractTextPromises[i].then(() => { + this._pendingFindMatches.delete(i); + this.#calculateMatch(i); + }); + } + } + const query = this.#query; + if (query.length === 0) { + this.#updateUIState(FindState.FOUND); + return; + } + if (this._resumePageIdx) { + return; + } + const offset = this._offset; + this._pagesToSearch = numPages; + if (offset.matchIdx !== null) { + const numPageMatches = this._pageMatches[offset.pageIdx].length; + if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) { + offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1; + this.#updateMatch(true); + return; + } + this.#advanceOffsetPage(previous); + } + this.#nextPageMatch(); + } + #matchesReady(matches) { + const offset = this._offset; + const numMatches = matches.length; + const previous = this.#state.findPrevious; + if (numMatches) { + offset.matchIdx = previous ? numMatches - 1 : 0; + this.#updateMatch(true); + return true; + } + this.#advanceOffsetPage(previous); + if (offset.wrapped) { + offset.matchIdx = null; + if (this._pagesToSearch < 0) { + this.#updateMatch(false); + return true; + } + } + return false; + } + #nextPageMatch() { + if (this._resumePageIdx !== null) { + console.error("There can only be one pending page."); + } + let matches = null; + do { + const pageIdx = this._offset.pageIdx; + matches = this._pageMatches[pageIdx]; + if (!matches) { + this._resumePageIdx = pageIdx; + break; + } + } while (!this.#matchesReady(matches)); + } + #advanceOffsetPage(previous) { + const offset = this._offset; + const numPages = this._linkService.pagesCount; + 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(found = false) { + let state = FindState.NOT_FOUND; + const wrapped = this._offset.wrapped; + this._offset.wrapped = false; + if (found) { + const previousPage = this._selected.pageIdx; + this._selected.pageIdx = this._offset.pageIdx; + this._selected.matchIdx = this._offset.matchIdx; + state = wrapped ? FindState.WRAPPED : FindState.FOUND; + if (previousPage !== -1 && previousPage !== this._selected.pageIdx) { + this.#updatePage(previousPage); + } + } + this.#updateUIState(state, this.#state.findPrevious); + if (this._selected.pageIdx !== -1) { + this._scrollMatches = true; + this.#updatePage(this._selected.pageIdx); + } + } + #onFindBarClose(evt) { + const pdfDocument = this._pdfDocument; + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (this._resumePageIdx) { + this._resumePageIdx = null; + this._dirtyMatch = true; + } + this.#updateUIState(FindState.FOUND); + this._highlightMatches = false; + this.#updateAllPages(); + }); + } + #requestMatchesCount() { + const { + pageIdx, + matchIdx + } = this._selected; + let current = 0, + total = this._matchesCountTotal; + if (matchIdx !== -1) { + for (let i = 0; i < pageIdx; i++) { + current += this._pageMatches[i]?.length || 0; + } + current += matchIdx + 1; + } + if (current < 1 || current > total) { + current = total = 0; + } + return { + current, + total + }; + } + #updateUIResultsCount() { + this._eventBus.dispatch("updatefindmatchescount", { + source: this, + matchesCount: this.#requestMatchesCount() + }); + } + #updateUIState(state, previous = false) { + if (!this.#updateMatchesCountOnProgress && (this.#visitedPagesCount !== this._linkService.pagesCount || state === FindState.PENDING)) { + return; + } + this._eventBus.dispatch("updatefindcontrolstate", { + source: this, + state, + previous, + entireWord: this.#state?.entireWord ?? null, + matchesCount: this.#requestMatchesCount(), + rawQuery: this.#state?.query ?? null + }); + } +} + +;// ./web/pdf_find_bar.js + + +const MATCHES_COUNT_LIMIT = 1000; +class PDFFindBar { + #mainContainer; + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + constructor(options, mainContainer, eventBus) { + this.opened = false; + this.bar = options.bar; + this.toggleButton = options.toggleButton; + this.findField = options.findField; + this.highlightAll = options.highlightAllCheckbox; + this.caseSensitive = options.caseSensitiveCheckbox; + this.matchDiacritics = options.matchDiacriticsCheckbox; + this.entireWord = options.entireWordCheckbox; + this.findMsg = options.findMsg; + this.findResultsCount = options.findResultsCount; + this.findPreviousButton = options.findPreviousButton; + this.findNextButton = options.findNextButton; + this.eventBus = eventBus; + this.#mainContainer = mainContainer; + const checkedInputs = new Map([[this.highlightAll, "highlightallchange"], [this.caseSensitive, "casesensitivitychange"], [this.entireWord, "entirewordchange"], [this.matchDiacritics, "diacriticmatchingchange"]]); + this.toggleButton.addEventListener("click", () => { + this.toggle(); + }); + this.findField.addEventListener("input", () => { + this.dispatchEvent(""); + }); + this.bar.addEventListener("keydown", ({ + keyCode, + shiftKey, + target + }) => { + switch (keyCode) { + case 13: + if (target === this.findField) { + this.dispatchEvent("again", shiftKey); + } else if (checkedInputs.has(target)) { + target.checked = !target.checked; + this.dispatchEvent(checkedInputs.get(target)); + } + break; + case 27: + this.close(); + break; + } + }); + this.findPreviousButton.addEventListener("click", () => { + this.dispatchEvent("again", true); + }); + this.findNextButton.addEventListener("click", () => { + this.dispatchEvent("again", false); + }); + for (const [elem, evtName] of checkedInputs) { + elem.addEventListener("click", () => { + this.dispatchEvent(evtName); + }); + } + } + reset() { + this.updateUIState(); + } + dispatchEvent(type, findPrev = false) { + this.eventBus.dispatch("find", { + source: this, + type, + query: this.findField.value, + caseSensitive: this.caseSensitive.checked, + entireWord: this.entireWord.checked, + highlightAll: this.highlightAll.checked, + findPrevious: findPrev, + matchDiacritics: this.matchDiacritics.checked + }); + } + updateUIState(state, previous, matchesCount) { + const { + findField, + findMsg + } = this; + let findMsgId = "", + status = ""; + switch (state) { + case FindState.FOUND: + break; + case FindState.PENDING: + status = "pending"; + break; + case FindState.NOT_FOUND: + findMsgId = "pdfjs-find-not-found"; + status = "notFound"; + break; + case FindState.WRAPPED: + findMsgId = previous ? "pdfjs-find-reached-top" : "pdfjs-find-reached-bottom"; + break; + } + findField.setAttribute("data-status", status); + findField.setAttribute("aria-invalid", state === FindState.NOT_FOUND); + findMsg.setAttribute("data-status", status); + if (findMsgId) { + findMsg.setAttribute("data-l10n-id", findMsgId); + } else { + findMsg.removeAttribute("data-l10n-id"); + findMsg.textContent = ""; + } + this.updateResultsCount(matchesCount); + } + updateResultsCount({ + current = 0, + total = 0 + } = {}) { + const { + findResultsCount + } = this; + if (total > 0) { + const limit = MATCHES_COUNT_LIMIT; + findResultsCount.setAttribute("data-l10n-id", total > limit ? "pdfjs-find-match-count-limit" : "pdfjs-find-match-count"); + findResultsCount.setAttribute("data-l10n-args", JSON.stringify({ + limit, + current, + total + })); + } else { + findResultsCount.removeAttribute("data-l10n-id"); + findResultsCount.textContent = ""; + } + } + open() { + if (!this.opened) { + this.#resizeObserver.observe(this.#mainContainer); + this.#resizeObserver.observe(this.bar); + this.opened = true; + toggleExpandedBtn(this.toggleButton, true, this.bar); + } + this.findField.select(); + this.findField.focus(); + } + close() { + if (!this.opened) { + return; + } + this.#resizeObserver.disconnect(); + this.opened = false; + toggleExpandedBtn(this.toggleButton, false, this.bar); + this.eventBus.dispatch("findbarclose", { + source: this + }); + } + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + #resizeObserverCallback() { + const { + bar + } = this; + bar.classList.remove("wrapContainers"); + const findbarHeight = bar.clientHeight; + const inputContainerHeight = bar.firstElementChild.clientHeight; + if (findbarHeight > inputContainerHeight) { + bar.classList.add("wrapContainers"); + } + } +} + +;// ./web/pdf_history.js + + + +const HASH_CHANGE_TIMEOUT = 1000; +const POSITION_UPDATED_THRESHOLD = 50; +const UPDATE_VIEWAREA_TIMEOUT = 1000; +function getCurrentHash() { + return document.location.hash; +} +class PDFHistory { + #eventAbortController = null; + constructor({ + linkService, + eventBus + }) { + this.linkService = linkService; + this.eventBus = eventBus; + this._initialized = false; + this._fingerprint = ""; + this.reset(); + this.eventBus._on("pagesinit", () => { + this._isPagesLoaded = false; + this.eventBus._on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + }, { + once: true + }); + }); + } + initialize({ + fingerprint, + resetHistory = false, + updateUrl = false + }) { + if (!fingerprint || typeof fingerprint !== "string") { + console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.'); + return; + } + if (this._initialized) { + this.reset(); + } + const reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint; + this._fingerprint = fingerprint; + this._updateUrl = updateUrl === true; + this._initialized = true; + this.#bindEvents(); + const state = window.history.state; + this._popStateInProgress = false; + this._blockHashChange = 0; + this._currentHash = getCurrentHash(); + this._numPositionUpdates = 0; + this._uid = this._maxUid = 0; + this._destination = null; + this._position = null; + if (!this.#isValidState(state, true) || resetHistory) { + const { + hash, + page, + rotation + } = this.#parseCurrentHash(true); + if (!hash || reInitialized || resetHistory) { + this.#pushOrReplaceState(null, true); + return; + } + this.#pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + const destination = state.destination; + this.#updateInternalState(destination, state.uid, true); + if (destination.rotation !== undefined) { + this._initialRotation = destination.rotation; + } + if (destination.dest) { + this._initialBookmark = JSON.stringify(destination.dest); + this._destination.page = null; + } else if (destination.hash) { + this._initialBookmark = destination.hash; + } else if (destination.page) { + this._initialBookmark = `page=${destination.page}`; + } + } + reset() { + if (this._initialized) { + this.#pageHide(); + this._initialized = false; + this.#unbindEvents(); + } + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._initialBookmark = null; + this._initialRotation = null; + } + push({ + namedDest = null, + explicitDest, + pageNumber + }) { + if (!this._initialized) { + return; + } + if (namedDest && typeof namedDest !== "string") { + console.error("PDFHistory.push: " + `"${namedDest}" is not a valid namedDest parameter.`); + return; + } else if (!Array.isArray(explicitDest)) { + console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`); + return; + } else if (!this.#isValidPage(pageNumber)) { + if (pageNumber !== null || this._destination) { + console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + } + const hash = namedDest || JSON.stringify(explicitDest); + if (!hash) { + return; + } + let forceReplace = false; + if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) { + if (this._destination.page) { + return; + } + forceReplace = true; + } + if (this._popStateInProgress && !forceReplace) { + return; + } + this.#pushOrReplaceState({ + dest: explicitDest, + hash, + page: pageNumber, + rotation: this.linkService.rotation + }, forceReplace); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + pushPage(pageNumber) { + if (!this._initialized) { + return; + } + if (!this.#isValidPage(pageNumber)) { + console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`); + return; + } + if (this._destination?.page === pageNumber) { + return; + } + if (this._popStateInProgress) { + return; + } + this.#pushOrReplaceState({ + dest: null, + hash: `page=${pageNumber}`, + page: pageNumber, + rotation: this.linkService.rotation + }); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + pushCurrentPosition() { + if (!this._initialized || this._popStateInProgress) { + return; + } + this.#tryPushCurrentPosition(); + } + back() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this.#isValidState(state) && state.uid > 0) { + window.history.back(); + } + } + forward() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this.#isValidState(state) && state.uid < this._maxUid) { + window.history.forward(); + } + } + get popStateInProgress() { + return this._initialized && (this._popStateInProgress || this._blockHashChange > 0); + } + get initialBookmark() { + return this._initialized ? this._initialBookmark : null; + } + get initialRotation() { + return this._initialized ? this._initialRotation : null; + } + #pushOrReplaceState(destination, forceReplace = false) { + const shouldReplace = forceReplace || !this._destination; + const newState = { + fingerprint: this._fingerprint, + uid: shouldReplace ? this._uid : this._uid + 1, + destination + }; + this.#updateInternalState(destination, newState.uid); + let newUrl; + if (this._updateUrl && destination?.hash) { + const { + href, + protocol + } = document.location; + if (protocol !== "file:") { + newUrl = updateUrlHash(href, destination.hash); + } + } + if (shouldReplace) { + window.history.replaceState(newState, "", newUrl); + } else { + window.history.pushState(newState, "", newUrl); + } + } + #tryPushCurrentPosition(temporary = false) { + if (!this._position) { + return; + } + let position = this._position; + if (temporary) { + position = Object.assign(Object.create(null), this._position); + position.temporary = true; + } + if (!this._destination) { + this.#pushOrReplaceState(position); + return; + } + if (this._destination.temporary) { + this.#pushOrReplaceState(position, true); + return; + } + if (this._destination.hash === position.hash) { + return; + } + if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) { + return; + } + let forceReplace = false; + if (this._destination.page >= position.first && this._destination.page <= position.page) { + if (this._destination.dest !== undefined || !this._destination.first) { + return; + } + forceReplace = true; + } + this.#pushOrReplaceState(position, forceReplace); + } + #isValidPage(val) { + return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount; + } + #isValidState(state, checkReload = false) { + if (!state) { + return false; + } + if (state.fingerprint !== this._fingerprint) { + if (checkReload) { + if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) { + return false; + } + const [perfEntry] = performance.getEntriesByType("navigation"); + if (perfEntry?.type !== "reload") { + return false; + } + } else { + return false; + } + } + if (!Number.isInteger(state.uid) || state.uid < 0) { + return false; + } + if (state.destination === null || typeof state.destination !== "object") { + return false; + } + return true; + } + #updateInternalState(destination, uid, removeTemporary = false) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + if (removeTemporary && destination?.temporary) { + delete destination.temporary; + } + this._destination = destination; + this._uid = uid; + this._maxUid = Math.max(this._maxUid, uid); + this._numPositionUpdates = 0; + } + #parseCurrentHash(checkNameddest = false) { + const hash = unescape(getCurrentHash()).substring(1); + const params = parseQueryString(hash); + const nameddest = params.get("nameddest") || ""; + let page = params.get("page") | 0; + if (!this.#isValidPage(page) || checkNameddest && nameddest.length > 0) { + page = null; + } + return { + hash, + page, + rotation: this.linkService.rotation + }; + } + #updateViewarea({ + location + }) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._position = { + hash: location.pdfOpenParams.substring(1), + page: this.linkService.page, + first: location.pageNumber, + rotation: location.rotation + }; + if (this._popStateInProgress) { + return; + } + if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) { + this._numPositionUpdates++; + } + if (UPDATE_VIEWAREA_TIMEOUT > 0) { + this._updateViewareaTimeout = setTimeout(() => { + if (!this._popStateInProgress) { + this.#tryPushCurrentPosition(true); + } + this._updateViewareaTimeout = null; + }, UPDATE_VIEWAREA_TIMEOUT); + } + } + #popState({ + state + }) { + const newHash = getCurrentHash(), + hashChanged = this._currentHash !== newHash; + this._currentHash = newHash; + if (!state) { + this._uid++; + const { + hash, + page, + rotation + } = this.#parseCurrentHash(); + this.#pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + if (!this.#isValidState(state)) { + return; + } + this._popStateInProgress = true; + if (hashChanged) { + this._blockHashChange++; + waitOnEventOrTimeout({ + target: window, + name: "hashchange", + delay: HASH_CHANGE_TIMEOUT + }).then(() => { + this._blockHashChange--; + }); + } + const destination = state.destination; + this.#updateInternalState(destination, state.uid, true); + if (isValidRotation(destination.rotation)) { + this.linkService.rotation = destination.rotation; + } + if (destination.dest) { + this.linkService.goToDestination(destination.dest); + } else if (destination.hash) { + this.linkService.setHash(destination.hash); + } else if (destination.page) { + this.linkService.page = destination.page; + } + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + #pageHide() { + if (!this._destination || this._destination.temporary) { + this.#tryPushCurrentPosition(); + } + } + #bindEvents() { + if (this.#eventAbortController) { + return; + } + this.#eventAbortController = new AbortController(); + const { + signal + } = this.#eventAbortController; + this.eventBus._on("updateviewarea", this.#updateViewarea.bind(this), { + signal + }); + window.addEventListener("popstate", this.#popState.bind(this), { + signal + }); + window.addEventListener("pagehide", this.#pageHide.bind(this), { + signal + }); + } + #unbindEvents() { + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + } +} +function isDestHashesEqual(destHash, pushHash) { + if (typeof destHash !== "string" || typeof pushHash !== "string") { + return false; + } + if (destHash === pushHash) { + return true; + } + const nameddest = parseQueryString(destHash).get("nameddest"); + if (nameddest === pushHash) { + return true; + } + return false; +} +function isDestArraysEqual(firstDest, secondDest) { + function isEntryEqual(first, second) { + if (typeof first !== typeof second) { + return false; + } + if (Array.isArray(first) || Array.isArray(second)) { + return false; + } + if (first !== null && typeof first === "object" && second !== null) { + if (Object.keys(first).length !== Object.keys(second).length) { + return false; + } + for (const key in first) { + if (!isEntryEqual(first[key], second[key])) { + return false; + } + } + return true; + } + return first === second || Number.isNaN(first) && Number.isNaN(second); + } + if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) { + return false; + } + if (firstDest.length !== secondDest.length) { + return false; + } + for (let i = 0, ii = firstDest.length; i < ii; i++) { + if (!isEntryEqual(firstDest[i], secondDest[i])) { + return false; + } + } + return true; +} + +;// ./web/pdf_layer_viewer.js + +class PDFLayerViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.eventBus._on("optionalcontentconfigchanged", evt => { + this.#updateLayers(evt.promise); + }); + this.eventBus._on("resetlayers", () => { + this.#updateLayers(); + }); + this.eventBus._on("togglelayerstree", this._toggleAllTreeItems.bind(this)); + } + reset() { + super.reset(); + this._optionalContentConfig = null; + this._optionalContentVisibility?.clear(); + this._optionalContentVisibility = null; + } + _dispatchEvent(layersCount) { + this.eventBus.dispatch("layersloaded", { + source: this, + layersCount + }); + } + _bindLink(element, { + groupId, + input + }) { + const setVisibility = () => { + const visible = input.checked; + this._optionalContentConfig.setVisibility(groupId, visible); + const cached = this._optionalContentVisibility.get(groupId); + if (cached) { + cached.visible = visible; + } + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(this._optionalContentConfig) + }); + }; + element.onclick = evt => { + if (evt.target === input) { + setVisibility(); + return true; + } else if (evt.target !== element) { + return true; + } + input.checked = !input.checked; + setVisibility(); + return false; + }; + } + _setNestedName(element, { + name = null + }) { + if (typeof name === "string") { + element.textContent = this._normalizeTextContent(name); + return; + } + element.setAttribute("data-l10n-id", "pdfjs-additional-layers"); + element.style.fontStyle = "italic"; + this._l10n.translateOnce(element); + } + _addToggleButton(div, { + name = null + }) { + super._addToggleButton(div, name === null); + } + _toggleAllTreeItems() { + if (!this._optionalContentConfig) { + return; + } + super._toggleAllTreeItems(); + } + render({ + optionalContentConfig, + pdfDocument + }) { + if (this._optionalContentConfig) { + this.reset(); + } + this._optionalContentConfig = optionalContentConfig || null; + this._pdfDocument = pdfDocument || null; + const groups = optionalContentConfig?.getOrder(); + if (!groups) { + this._dispatchEvent(0); + return; + } + this._optionalContentVisibility = new Map(); + const fragment = document.createDocumentFragment(), + queue = [{ + parent: fragment, + groups + }]; + let layersCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const groupId of levelData.groups) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + div.append(element); + if (typeof groupId === "object") { + hasAnyNesting = true; + this._addToggleButton(div, groupId); + this._setNestedName(element, groupId); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + groups: groupId.order + }); + } else { + const group = optionalContentConfig.getGroup(groupId); + const input = document.createElement("input"); + this._bindLink(element, { + groupId, + input + }); + input.type = "checkbox"; + input.checked = group.visible; + this._optionalContentVisibility.set(groupId, { + input, + visible: input.checked + }); + const label = document.createElement("label"); + label.textContent = this._normalizeTextContent(group.name); + label.append(input); + element.append(label); + layersCount++; + } + levelData.parent.append(div); + } + } + this._finishRendering(fragment, layersCount, hasAnyNesting); + } + async #updateLayers(promise = null) { + if (!this._optionalContentConfig) { + return; + } + const pdfDocument = this._pdfDocument; + const optionalContentConfig = await (promise || pdfDocument.getOptionalContentConfig({ + intent: "display" + })); + if (pdfDocument !== this._pdfDocument) { + return; + } + if (promise) { + for (const [groupId, cached] of this._optionalContentVisibility) { + const group = optionalContentConfig.getGroup(groupId); + if (group && cached.visible !== group.visible) { + cached.input.checked = cached.visible = !cached.visible; + } + } + return; + } + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(optionalContentConfig) + }); + this.render({ + optionalContentConfig, + pdfDocument: this._pdfDocument + }); + } +} + +;// ./web/pdf_outline_viewer.js + + +class PDFOutlineViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.linkService = options.linkService; + this.downloadManager = options.downloadManager; + this.eventBus._on("toggleoutlinetree", this._toggleAllTreeItems.bind(this)); + this.eventBus._on("currentoutlineitem", this._currentOutlineItem.bind(this)); + this.eventBus._on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }); + this.eventBus._on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + this._currentOutlineItemCapability?.resolve(this._isPagesLoaded); + }); + this.eventBus._on("sidebarviewchanged", evt => { + this._sidebarView = evt.view; + }); + } + reset() { + super.reset(); + this._outline = null; + this._pageNumberToDestHashCapability = null; + this._currentPageNumber = 1; + this._isPagesLoaded = null; + this._currentOutlineItemCapability?.resolve(false); + this._currentOutlineItemCapability = null; + } + _dispatchEvent(outlineCount) { + this._currentOutlineItemCapability = Promise.withResolvers(); + if (outlineCount === 0 || this._pdfDocument?.loadingParams.disableAutoFetch) { + this._currentOutlineItemCapability.resolve(false); + } else if (this._isPagesLoaded !== null) { + this._currentOutlineItemCapability.resolve(this._isPagesLoaded); + } + this.eventBus.dispatch("outlineloaded", { + source: this, + outlineCount, + currentOutlineItemPromise: this._currentOutlineItemCapability.promise + }); + } + _bindLink(element, { + url, + newWindow, + action, + attachment, + dest, + setOCGState + }) { + const { + linkService + } = this; + if (url) { + linkService.addLinkAttributes(element, url, newWindow); + return; + } + if (action) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeNamedAction(action); + return false; + }; + return; + } + if (attachment) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + this.downloadManager.openOrDownloadData(attachment.content, attachment.filename); + return false; + }; + return; + } + if (setOCGState) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeSetOCGState(setOCGState); + return false; + }; + return; + } + element.href = linkService.getDestinationHash(dest); + element.onclick = evt => { + this._updateCurrentTreeItem(evt.target.parentNode); + if (dest) { + linkService.goToDestination(dest); + } + return false; + }; + } + _setStyles(element, { + bold, + italic + }) { + if (bold) { + element.style.fontWeight = "bold"; + } + if (italic) { + element.style.fontStyle = "italic"; + } + } + _addToggleButton(div, { + count, + items + }) { + let hidden = false; + if (count < 0) { + let totalCount = items.length; + if (totalCount > 0) { + const queue = [...items]; + while (queue.length > 0) { + const { + count: nestedCount, + items: nestedItems + } = queue.shift(); + if (nestedCount > 0 && nestedItems.length > 0) { + totalCount += nestedItems.length; + queue.push(...nestedItems); + } + } + } + if (Math.abs(count) === totalCount) { + hidden = true; + } + } + super._addToggleButton(div, hidden); + } + _toggleAllTreeItems() { + if (!this._outline) { + return; + } + super._toggleAllTreeItems(); + } + render({ + outline, + pdfDocument + }) { + if (this._outline) { + this.reset(); + } + this._outline = outline || null; + this._pdfDocument = pdfDocument || null; + if (!outline) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + const queue = [{ + parent: fragment, + items: outline + }]; + let outlineCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const item of levelData.items) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + this._bindLink(element, item); + this._setStyles(element, item); + element.textContent = this._normalizeTextContent(item.title); + div.append(element); + if (item.items.length > 0) { + hasAnyNesting = true; + this._addToggleButton(div, item); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + items: item.items + }); + } + levelData.parent.append(div); + outlineCount++; + } + } + this._finishRendering(fragment, outlineCount, hasAnyNesting); + } + async _currentOutlineItem() { + if (!this._isPagesLoaded) { + throw new Error("_currentOutlineItem: All pages have not been loaded."); + } + if (!this._outline || !this._pdfDocument) { + return; + } + const pageNumberToDestHash = await this._getPageNumberToDestHash(this._pdfDocument); + if (!pageNumberToDestHash) { + return; + } + this._updateCurrentTreeItem(null); + if (this._sidebarView !== SidebarView.OUTLINE) { + return; + } + for (let i = this._currentPageNumber; i > 0; i--) { + const destHash = pageNumberToDestHash.get(i); + if (!destHash) { + continue; + } + const linkElement = this.container.querySelector(`a[href="${destHash}"]`); + if (!linkElement) { + continue; + } + this._scrollToCurrentTreeItem(linkElement.parentNode); + break; + } + } + async _getPageNumberToDestHash(pdfDocument) { + if (this._pageNumberToDestHashCapability) { + return this._pageNumberToDestHashCapability.promise; + } + this._pageNumberToDestHashCapability = Promise.withResolvers(); + const pageNumberToDestHash = new Map(), + pageNumberNesting = new Map(); + const queue = [{ + nesting: 0, + items: this._outline + }]; + while (queue.length > 0) { + const levelData = queue.shift(), + currentNesting = levelData.nesting; + for (const { + dest, + items + } of levelData.items) { + let explicitDest, pageNumber; + if (typeof dest === "string") { + explicitDest = await pdfDocument.getDestination(dest); + if (pdfDocument !== this._pdfDocument) { + return null; + } + } else { + explicitDest = dest; + } + if (Array.isArray(explicitDest)) { + const [destRef] = explicitDest; + if (destRef && typeof destRef === "object") { + pageNumber = pdfDocument.cachedPageNumber(destRef); + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (Number.isInteger(pageNumber) && (!pageNumberToDestHash.has(pageNumber) || currentNesting > pageNumberNesting.get(pageNumber))) { + const destHash = this.linkService.getDestinationHash(dest); + pageNumberToDestHash.set(pageNumber, destHash); + pageNumberNesting.set(pageNumber, currentNesting); + } + } + if (items.length > 0) { + queue.push({ + nesting: currentNesting + 1, + items + }); + } + } + } + this._pageNumberToDestHashCapability.resolve(pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null); + return this._pageNumberToDestHashCapability.promise; + } +} + +;// ./web/pdf_presentation_mode.js + + +const DELAY_BEFORE_HIDING_CONTROLS = 3000; +const ACTIVE_SELECTOR = "pdfPresentationMode"; +const CONTROLS_SELECTOR = "pdfPresentationModeControls"; +const MOUSE_SCROLL_COOLDOWN_TIME = 50; +const PAGE_SWITCH_THRESHOLD = 0.1; +const SWIPE_MIN_DISTANCE_THRESHOLD = 50; +const SWIPE_ANGLE_THRESHOLD = Math.PI / 6; +class PDFPresentationMode { + #state = PresentationModeState.UNKNOWN; + #args = null; + #fullscreenChangeAbortController = null; + #windowAbortController = null; + constructor({ + container, + pdfViewer, + eventBus + }) { + this.container = container; + this.pdfViewer = pdfViewer; + this.eventBus = eventBus; + this.contextMenuOpen = false; + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + this.touchSwipeState = null; + } + async request() { + const { + container, + pdfViewer + } = this; + if (this.active || !pdfViewer.pagesCount || !container.requestFullscreen) { + return false; + } + this.#addFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.CHANGING); + const promise = container.requestFullscreen(); + this.#args = { + pageNumber: pdfViewer.currentPageNumber, + scaleValue: pdfViewer.currentScaleValue, + scrollMode: pdfViewer.scrollMode, + spreadMode: null, + annotationEditorMode: null + }; + if (pdfViewer.spreadMode !== SpreadMode.NONE && !(pdfViewer.pageViewsReady && pdfViewer.hasEqualPageSizes)) { + console.warn("Ignoring Spread modes when entering PresentationMode, " + "since the document may contain varying page sizes."); + this.#args.spreadMode = pdfViewer.spreadMode; + } + if (pdfViewer.annotationEditorMode !== AnnotationEditorType.DISABLE) { + this.#args.annotationEditorMode = pdfViewer.annotationEditorMode; + } + try { + await promise; + pdfViewer.focus(); + return true; + } catch { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.NORMAL); + } + return false; + } + get active() { + return this.#state === PresentationModeState.CHANGING || this.#state === PresentationModeState.FULLSCREEN; + } + #mouseWheel(evt) { + if (!this.active) { + return; + } + evt.preventDefault(); + const delta = normalizeWheelEventDelta(evt); + const currentTime = Date.now(); + const storedTime = this.mouseScrollTimeStamp; + if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { + return; + } + if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) { + this.#resetMouseScrollState(); + } + this.mouseScrollDelta += delta; + if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) { + const totalDelta = this.mouseScrollDelta; + this.#resetMouseScrollState(); + const success = totalDelta > 0 ? this.pdfViewer.previousPage() : this.pdfViewer.nextPage(); + if (success) { + this.mouseScrollTimeStamp = currentTime; + } + } + } + #notifyStateChange(state) { + this.#state = state; + this.eventBus.dispatch("presentationmodechanged", { + source: this, + state + }); + } + #enter() { + this.#notifyStateChange(PresentationModeState.FULLSCREEN); + this.container.classList.add(ACTIVE_SELECTOR); + setTimeout(() => { + this.pdfViewer.scrollMode = ScrollMode.PAGE; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = SpreadMode.NONE; + } + this.pdfViewer.currentPageNumber = this.#args.pageNumber; + this.pdfViewer.currentScaleValue = "page-fit"; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: AnnotationEditorType.NONE + }; + } + }, 0); + this.#addWindowListeners(); + this.#showControls(); + this.contextMenuOpen = false; + document.getSelection().empty(); + } + #exit() { + const pageNumber = this.pdfViewer.currentPageNumber; + this.container.classList.remove(ACTIVE_SELECTOR); + setTimeout(() => { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.NORMAL); + this.pdfViewer.scrollMode = this.#args.scrollMode; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = this.#args.spreadMode; + } + this.pdfViewer.currentScaleValue = this.#args.scaleValue; + this.pdfViewer.currentPageNumber = pageNumber; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: this.#args.annotationEditorMode + }; + } + this.#args = null; + }, 0); + this.#removeWindowListeners(); + this.#hideControls(); + this.#resetMouseScrollState(); + this.contextMenuOpen = false; + } + #mouseDown(evt) { + if (this.contextMenuOpen) { + this.contextMenuOpen = false; + evt.preventDefault(); + return; + } + if (evt.button !== 0) { + return; + } + if (evt.target.href && evt.target.parentNode?.hasAttribute("data-internal-link")) { + return; + } + evt.preventDefault(); + if (evt.shiftKey) { + this.pdfViewer.previousPage(); + } else { + this.pdfViewer.nextPage(); + } + } + #contextMenu() { + this.contextMenuOpen = true; + } + #showControls() { + if (this.controlsTimeout) { + clearTimeout(this.controlsTimeout); + } else { + this.container.classList.add(CONTROLS_SELECTOR); + } + this.controlsTimeout = setTimeout(() => { + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + }, DELAY_BEFORE_HIDING_CONTROLS); + } + #hideControls() { + if (!this.controlsTimeout) { + return; + } + clearTimeout(this.controlsTimeout); + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + } + #resetMouseScrollState() { + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + } + #touchSwipe(evt) { + if (!this.active) { + return; + } + if (evt.touches.length > 1) { + this.touchSwipeState = null; + return; + } + switch (evt.type) { + case "touchstart": + this.touchSwipeState = { + startX: evt.touches[0].pageX, + startY: evt.touches[0].pageY, + endX: evt.touches[0].pageX, + endY: evt.touches[0].pageY + }; + break; + case "touchmove": + if (this.touchSwipeState === null) { + return; + } + this.touchSwipeState.endX = evt.touches[0].pageX; + this.touchSwipeState.endY = evt.touches[0].pageY; + evt.preventDefault(); + break; + case "touchend": + if (this.touchSwipeState === null) { + return; + } + let delta = 0; + const dx = this.touchSwipeState.endX - this.touchSwipeState.startX; + const dy = this.touchSwipeState.endY - this.touchSwipeState.startY; + const absAngle = Math.abs(Math.atan2(dy, dx)); + if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) { + delta = dx; + } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) { + delta = dy; + } + if (delta > 0) { + this.pdfViewer.previousPage(); + } else if (delta < 0) { + this.pdfViewer.nextPage(); + } + break; + } + } + #addWindowListeners() { + if (this.#windowAbortController) { + return; + } + this.#windowAbortController = new AbortController(); + const { + signal + } = this.#windowAbortController; + const touchSwipeBind = this.#touchSwipe.bind(this); + window.addEventListener("mousemove", this.#showControls.bind(this), { + signal + }); + window.addEventListener("mousedown", this.#mouseDown.bind(this), { + signal + }); + window.addEventListener("wheel", this.#mouseWheel.bind(this), { + passive: false, + signal + }); + window.addEventListener("keydown", this.#resetMouseScrollState.bind(this), { + signal + }); + window.addEventListener("contextmenu", this.#contextMenu.bind(this), { + signal + }); + window.addEventListener("touchstart", touchSwipeBind, { + signal + }); + window.addEventListener("touchmove", touchSwipeBind, { + signal + }); + window.addEventListener("touchend", touchSwipeBind, { + signal + }); + } + #removeWindowListeners() { + this.#windowAbortController?.abort(); + this.#windowAbortController = null; + } + #addFullscreenChangeListeners() { + if (this.#fullscreenChangeAbortController) { + return; + } + this.#fullscreenChangeAbortController = new AbortController(); + window.addEventListener("fullscreenchange", () => { + if (document.fullscreenElement) { + this.#enter(); + } else { + this.#exit(); + } + }, { + signal: this.#fullscreenChangeAbortController.signal + }); + } + #removeFullscreenChangeListeners() { + this.#fullscreenChangeAbortController?.abort(); + this.#fullscreenChangeAbortController = null; + } +} + +;// ./web/xfa_layer_builder.js + +class XfaLayerBuilder { + constructor({ + pdfPage, + annotationStorage = null, + linkService, + xfaHtml = null + }) { + this.pdfPage = pdfPage; + this.annotationStorage = annotationStorage; + this.linkService = linkService; + this.xfaHtml = xfaHtml; + this.div = null; + this._cancelled = false; + } + async render({ + viewport, + intent = "display" + }) { + if (intent === "print") { + const parameters = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div, + xfaHtml: this.xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + this.div = document.createElement("div"); + parameters.div = this.div; + return XfaLayer.render(parameters); + } + const xfaHtml = await this.pdfPage.getXfa(); + if (this._cancelled || !xfaHtml) { + return { + textDivs: [] + }; + } + const parameters = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div, + xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + if (this.div) { + return XfaLayer.update(parameters); + } + this.div = document.createElement("div"); + parameters.div = this.div; + return XfaLayer.render(parameters); + } + cancel() { + this._cancelled = true; + } + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } +} + +;// ./web/print_utils.js + + + +function getXfaHtmlForPrinting(printContainer, pdfDocument) { + const xfaHtml = pdfDocument.allXfaHtml; + const linkService = new SimpleLinkService(); + const scale = Math.round(PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100; + for (const xfaPage of xfaHtml.children) { + const page = document.createElement("div"); + page.className = "xfaPrintedPage"; + printContainer.append(page); + const builder = new XfaLayerBuilder({ + pdfPage: null, + annotationStorage: pdfDocument.annotationStorage, + linkService, + xfaHtml: xfaPage + }); + const viewport = getXfaPageViewport(xfaPage, { + scale + }); + builder.render({ + viewport, + intent: "print" + }); + page.append(builder.div); + } +} + +;// ./web/pdf_print_service.js + + +let activeService = null; +let dialog = null; +let overlayManager = null; +let viewerApp = { + initialized: false +}; +function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise) { + const scratchCanvas = activeService.scratchCanvas; + const PRINT_UNITS = printResolution / PixelsPerInch.PDF; + scratchCanvas.width = Math.floor(size.width * PRINT_UNITS); + scratchCanvas.height = Math.floor(size.height * PRINT_UNITS); + const ctx = scratchCanvas.getContext("2d"); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height); + ctx.restore(); + return Promise.all([pdfDocument.getPage(pageNumber), printAnnotationStoragePromise]).then(function ([pdfPage, printAnnotationStorage]) { + const renderContext = { + canvasContext: ctx, + transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], + viewport: pdfPage.getViewport({ + scale: 1, + rotation: size.rotation + }), + intent: "print", + annotationMode: AnnotationMode.ENABLE_STORAGE, + optionalContentConfigPromise, + printAnnotationStorage + }; + const renderTask = pdfPage.render(renderContext); + return renderTask.promise.catch(reason => { + if (!(reason instanceof RenderingCancelledException)) { + console.error(reason); + } + throw reason; + }); + }); +} +class PDFPrintService { + constructor({ + pdfDocument, + pagesOverview, + printContainer, + printResolution, + printAnnotationStoragePromise = null + }) { + this.pdfDocument = pdfDocument; + this.pagesOverview = pagesOverview; + this.printContainer = printContainer; + this._printResolution = printResolution || 150; + this._optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "print" + }); + this._printAnnotationStoragePromise = printAnnotationStoragePromise || Promise.resolve(); + this.currentPage = -1; + this.scratchCanvas = document.createElement("canvas"); + } + layout() { + this.throwIfInactive(); + const body = document.querySelector("body"); + body.setAttribute("data-pdfjsprinting", true); + const { + width, + height + } = this.pagesOverview[0]; + const hasEqualPageSizes = this.pagesOverview.every(size => size.width === width && size.height === height); + if (!hasEqualPageSizes) { + console.warn("Not all pages have the same size. The printed result may be incorrect!"); + } + this.pageStyleSheet = document.createElement("style"); + this.pageStyleSheet.textContent = `@page { size: ${width}pt ${height}pt;}`; + body.append(this.pageStyleSheet); + } + destroy() { + if (activeService !== this) { + return; + } + this.printContainer.textContent = ""; + const body = document.querySelector("body"); + body.removeAttribute("data-pdfjsprinting"); + if (this.pageStyleSheet) { + this.pageStyleSheet.remove(); + this.pageStyleSheet = null; + } + this.scratchCanvas.width = this.scratchCanvas.height = 0; + this.scratchCanvas = null; + activeService = null; + ensureOverlay().then(function () { + overlayManager.closeIfActive(dialog); + }); + } + renderPages() { + if (this.pdfDocument.isPureXfa) { + getXfaHtmlForPrinting(this.printContainer, this.pdfDocument); + return Promise.resolve(); + } + const pageCount = this.pagesOverview.length; + const renderNextPage = (resolve, reject) => { + this.throwIfInactive(); + if (++this.currentPage >= pageCount) { + renderProgress(pageCount, pageCount); + resolve(); + return; + } + const index = this.currentPage; + renderProgress(index, pageCount); + renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index], this._printResolution, this._optionalContentConfigPromise, this._printAnnotationStoragePromise).then(this.useRenderedPage.bind(this)).then(function () { + renderNextPage(resolve, reject); + }, reject); + }; + return new Promise(renderNextPage); + } + useRenderedPage() { + this.throwIfInactive(); + const img = document.createElement("img"); + this.scratchCanvas.toBlob(blob => { + img.src = URL.createObjectURL(blob); + }); + const wrapper = document.createElement("div"); + wrapper.className = "printedPage"; + wrapper.append(img); + this.printContainer.append(wrapper); + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + img.onload = resolve; + img.onerror = reject; + promise.catch(() => {}).then(() => { + URL.revokeObjectURL(img.src); + }); + return promise; + } + performPrint() { + this.throwIfInactive(); + return new Promise(resolve => { + setTimeout(() => { + if (!this.active) { + resolve(); + return; + } + print.call(window); + setTimeout(resolve, 20); + }, 0); + }); + } + get active() { + return this === activeService; + } + throwIfInactive() { + if (!this.active) { + throw new Error("This print request was cancelled or completed."); + } + } +} +const print = window.print; +window.print = function () { + if (activeService) { + console.warn("Ignored window.print() because of a pending print job."); + return; + } + ensureOverlay().then(function () { + if (activeService) { + overlayManager.open(dialog); + } + }); + try { + dispatchEvent("beforeprint"); + } finally { + if (!activeService) { + console.error("Expected print service to be initialized."); + ensureOverlay().then(function () { + overlayManager.closeIfActive(dialog); + }); + } else { + const activeServiceOnEntry = activeService; + activeService.renderPages().then(() => activeServiceOnEntry.performPrint()).catch(() => {}).then(() => { + if (activeServiceOnEntry.active) { + abort(); + } + }); + } + } +}; +function dispatchEvent(eventType) { + const event = new CustomEvent(eventType, { + bubbles: false, + cancelable: false, + detail: "custom" + }); + window.dispatchEvent(event); +} +function abort() { + if (activeService) { + activeService.destroy(); + dispatchEvent("afterprint"); + } +} +function renderProgress(index, total) { + dialog ||= document.getElementById("printServiceDialog"); + const progress = Math.round(100 * index / total); + const progressBar = dialog.querySelector("progress"); + const progressPerc = dialog.querySelector(".relative-progress"); + progressBar.value = progress; + progressPerc.setAttribute("data-l10n-args", JSON.stringify({ + progress + })); +} +window.addEventListener("keydown", function (event) { + if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) { + window.print(); + event.preventDefault(); + event.stopImmediatePropagation(); + } +}, true); +if ("onbeforeprint" in window) { + const stopPropagationIfNeeded = function (event) { + if (event.detail !== "custom") { + event.stopImmediatePropagation(); + } + }; + window.addEventListener("beforeprint", stopPropagationIfNeeded); + window.addEventListener("afterprint", stopPropagationIfNeeded); +} +let overlayPromise; +function ensureOverlay() { + if (!overlayPromise) { + overlayManager = viewerApp.overlayManager; + if (!overlayManager) { + throw new Error("The overlay manager has not yet been initialized."); + } + dialog ||= document.getElementById("printServiceDialog"); + overlayPromise = overlayManager.register(dialog, true); + document.getElementById("printCancel").onclick = abort; + dialog.addEventListener("close", abort); + } + return overlayPromise; +} +class PDFPrintServiceFactory { + static initGlobals(app) { + viewerApp = app; + } + static get supportsPrinting() { + return shadow(this, "supportsPrinting", true); + } + static createPrintService(params) { + if (activeService) { + throw new Error("The print service is created and active."); + } + return activeService = new PDFPrintService(params); + } +} + +;// ./web/pdf_rendering_queue.js + + +const CLEANUP_TIMEOUT = 30000; +class PDFRenderingQueue { + constructor() { + this.pdfViewer = null; + this.pdfThumbnailViewer = null; + this.onIdle = null; + this.highestPriorityPage = null; + this.idleTimeout = null; + this.printing = false; + this.isThumbnailViewEnabled = false; + Object.defineProperty(this, "hasViewer", { + value: () => !!this.pdfViewer + }); + } + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + setThumbnailViewer(pdfThumbnailViewer) { + this.pdfThumbnailViewer = pdfThumbnailViewer; + } + isHighestPriority(view) { + return this.highestPriorityPage === view.renderingId; + } + renderHighestPriority(currentlyVisiblePages) { + if (this.idleTimeout) { + clearTimeout(this.idleTimeout); + this.idleTimeout = null; + } + if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { + return; + } + if (this.isThumbnailViewEnabled && this.pdfThumbnailViewer?.forceRendering()) { + return; + } + if (this.printing) { + return; + } + if (this.onIdle) { + this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); + } + } + getHighestPriority(visible, views, scrolledDown, preRenderExtra = false, ignoreDetailViews = false) { + const visibleViews = visible.views, + numVisible = visibleViews.length; + if (numVisible === 0) { + return null; + } + for (let i = 0; i < numVisible; i++) { + const view = visibleViews[i].view; + if (!this.isViewFinished(view)) { + return view; + } + } + if (!ignoreDetailViews) { + for (let i = 0; i < numVisible; i++) { + const { + detailView + } = visibleViews[i].view; + if (detailView && !this.isViewFinished(detailView)) { + return detailView; + } + } + } + const firstId = visible.first.id, + lastId = visible.last.id; + if (lastId - firstId + 1 > numVisible) { + const visibleIds = visible.ids; + for (let i = 1, ii = lastId - firstId; i < ii; i++) { + const holeId = scrolledDown ? firstId + i : lastId - i; + if (visibleIds.has(holeId)) { + continue; + } + const holeView = views[holeId - 1]; + if (!this.isViewFinished(holeView)) { + return holeView; + } + } + } + let preRenderIndex = scrolledDown ? lastId : firstId - 2; + let preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + if (preRenderExtra) { + preRenderIndex += scrolledDown ? 1 : -1; + preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + } + return null; + } + isViewFinished(view) { + return view.renderingState === RenderingStates.FINISHED; + } + renderView(view) { + switch (view.renderingState) { + 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; + view.draw().finally(() => { + this.renderHighestPriority(); + }).catch(reason => { + if (reason instanceof RenderingCancelledException) { + return; + } + console.error("renderView:", reason); + }); + break; + } + return true; + } +} + +;// ./web/pdf_scripting_manager.js + + +class PDFScriptingManager { + #closeCapability = null; + #destroyCapability = null; + #docProperties = null; + #eventAbortController = null; + #eventBus = null; + #externalServices = null; + #pdfDocument = null; + #pdfViewer = null; + #ready = false; + #scripting = null; + #willPrintCapability = null; + constructor({ + eventBus, + externalServices = null, + docProperties = null + }) { + this.#eventBus = eventBus; + this.#externalServices = externalServices; + this.#docProperties = docProperties; + } + setViewer(pdfViewer) { + this.#pdfViewer = pdfViewer; + } + async setDocument(pdfDocument) { + if (this.#pdfDocument) { + await this.#destroyScripting(); + } + this.#pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]); + if (!objects && !docActions) { + await this.#destroyScripting(); + return; + } + if (pdfDocument !== this.#pdfDocument) { + return; + } + try { + this.#scripting = this.#initScripting(); + } catch (error) { + console.error("setDocument:", error); + await this.#destroyScripting(); + return; + } + const eventBus = this.#eventBus; + this.#eventAbortController = new AbortController(); + const { + signal + } = this.#eventAbortController; + eventBus._on("updatefromsandbox", event => { + if (event?.source === window) { + this.#updateFromSandbox(event.detail); + } + }, { + signal + }); + eventBus._on("dispatcheventinsandbox", event => { + this.#scripting?.dispatchEventInSandbox(event.detail); + }, { + signal + }); + eventBus._on("pagechanging", ({ + pageNumber, + previous + }) => { + if (pageNumber === previous) { + return; + } + this.#dispatchPageClose(previous); + this.#dispatchPageOpen(pageNumber); + }, { + signal + }); + eventBus._on("pagerendered", ({ + pageNumber + }) => { + if (!this._pageOpenPending.has(pageNumber)) { + return; + } + if (pageNumber !== this.#pdfViewer.currentPageNumber) { + return; + } + this.#dispatchPageOpen(pageNumber); + }, { + signal + }); + eventBus._on("pagesdestroy", async () => { + await this.#dispatchPageClose(this.#pdfViewer.currentPageNumber); + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillClose" + }); + this.#closeCapability?.resolve(); + }, { + signal + }); + try { + const docProperties = await this.#docProperties(pdfDocument); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting.createSandbox({ + objects, + calculationOrder, + appInfo: { + platform: navigator.platform, + language: navigator.language + }, + docInfo: { + ...docProperties, + actions: docActions + } + }); + eventBus.dispatch("sandboxcreated", { + source: this + }); + } catch (error) { + console.error("setDocument:", error); + await this.#destroyScripting(); + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "Open" + }); + await this.#dispatchPageOpen(this.#pdfViewer.currentPageNumber, true); + Promise.resolve().then(() => { + if (pdfDocument === this.#pdfDocument) { + this.#ready = true; + } + }); + } + async dispatchWillSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillSave" + }); + } + async dispatchDidSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidSave" + }); + } + async dispatchWillPrint() { + if (!this.#scripting) { + return; + } + await this.#willPrintCapability?.promise; + this.#willPrintCapability = Promise.withResolvers(); + try { + await this.#scripting.dispatchEventInSandbox({ + id: "doc", + name: "WillPrint" + }); + } catch (ex) { + this.#willPrintCapability.resolve(); + this.#willPrintCapability = null; + throw ex; + } + await this.#willPrintCapability.promise; + } + async dispatchDidPrint() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidPrint" + }); + } + get destroyPromise() { + return this.#destroyCapability?.promise || null; + } + get ready() { + return this.#ready; + } + get _pageOpenPending() { + return shadow(this, "_pageOpenPending", new Set()); + } + get _visitedPages() { + return shadow(this, "_visitedPages", new Map()); + } + async #updateFromSandbox(detail) { + const pdfViewer = this.#pdfViewer; + const isInPresentationMode = pdfViewer.isInPresentationMode || pdfViewer.isChangingPresentationMode; + const { + id, + siblings, + command, + value + } = detail; + if (!id) { + switch (command) { + case "clear": + console.clear(); + break; + case "error": + console.error(value); + break; + case "layout": + if (!isInPresentationMode) { + const modes = apiPageLayoutToViewerModes(value); + pdfViewer.spreadMode = modes.spreadMode; + } + break; + case "page-num": + pdfViewer.currentPageNumber = value + 1; + break; + case "print": + await pdfViewer.pagesPromise; + this.#eventBus.dispatch("print", { + source: this + }); + break; + case "println": + console.log(value); + break; + case "zoom": + if (!isInPresentationMode) { + pdfViewer.currentScaleValue = value; + } + break; + case "SaveAs": + this.#eventBus.dispatch("download", { + source: this + }); + break; + case "FirstPage": + pdfViewer.currentPageNumber = 1; + break; + case "LastPage": + pdfViewer.currentPageNumber = pdfViewer.pagesCount; + break; + case "NextPage": + pdfViewer.nextPage(); + break; + case "PrevPage": + pdfViewer.previousPage(); + break; + case "ZoomViewIn": + if (!isInPresentationMode) { + pdfViewer.increaseScale(); + } + break; + case "ZoomViewOut": + if (!isInPresentationMode) { + pdfViewer.decreaseScale(); + } + break; + case "WillPrintFinished": + this.#willPrintCapability?.resolve(); + this.#willPrintCapability = null; + break; + } + return; + } + if (isInPresentationMode && detail.focus) { + return; + } + delete detail.id; + delete detail.siblings; + const ids = siblings ? [id, ...siblings] : [id]; + for (const elementId of ids) { + const element = document.querySelector(`[data-element-id="${elementId}"]`); + if (element) { + element.dispatchEvent(new CustomEvent("updatefromsandbox", { + detail + })); + } else { + this.#pdfDocument?.annotationStorage.setValue(elementId, detail); + } + } + } + async #dispatchPageOpen(pageNumber, initialize = false) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (initialize) { + this.#closeCapability = Promise.withResolvers(); + } + if (!this.#closeCapability) { + return; + } + const pageView = this.#pdfViewer.getPageView(pageNumber - 1); + if (pageView?.renderingState !== RenderingStates.FINISHED) { + this._pageOpenPending.add(pageNumber); + return; + } + this._pageOpenPending.delete(pageNumber); + const actionsPromise = (async () => { + const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageOpen", + pageNumber, + actions + }); + })(); + visitedPages.set(pageNumber, actionsPromise); + } + async #dispatchPageClose(pageNumber) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (!this.#closeCapability) { + return; + } + if (this._pageOpenPending.has(pageNumber)) { + return; + } + const actionsPromise = visitedPages.get(pageNumber); + if (!actionsPromise) { + return; + } + visitedPages.set(pageNumber, null); + await actionsPromise; + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageClose", + pageNumber + }); + } + #initScripting() { + this.#destroyCapability = Promise.withResolvers(); + if (this.#scripting) { + throw new Error("#initScripting: Scripting already exists."); + } + return this.#externalServices.createScripting(); + } + async #destroyScripting() { + if (!this.#scripting) { + this.#pdfDocument = null; + this.#destroyCapability?.resolve(); + return; + } + if (this.#closeCapability) { + await Promise.race([this.#closeCapability.promise, new Promise(resolve => { + setTimeout(resolve, 1000); + })]).catch(() => {}); + this.#closeCapability = null; + } + this.#pdfDocument = null; + try { + await this.#scripting.destroySandbox(); + } catch {} + this.#willPrintCapability?.reject(new Error("Scripting destroyed.")); + this.#willPrintCapability = null; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + this._pageOpenPending.clear(); + this._visitedPages.clear(); + this.#scripting = null; + this.#ready = false; + this.#destroyCapability?.resolve(); + } +} + +;// ./web/pdf_sidebar.js + +const SIDEBAR_WIDTH_VAR = "--sidebar-width"; +const SIDEBAR_MIN_WIDTH = 200; +const SIDEBAR_RESIZING_CLASS = "sidebarResizing"; +const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; +class PDFSidebar { + #isRTL = false; + #mouseAC = null; + #outerContainerWidth = null; + #width = null; + constructor({ + elements, + eventBus, + l10n + }) { + this.isOpen = false; + this.active = SidebarView.THUMBS; + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.onToggled = null; + this.onUpdateThumbnails = null; + this.outerContainer = elements.outerContainer; + this.sidebarContainer = elements.sidebarContainer; + this.toggleButton = elements.toggleButton; + this.resizer = elements.resizer; + this.thumbnailButton = elements.thumbnailButton; + this.outlineButton = elements.outlineButton; + this.attachmentsButton = elements.attachmentsButton; + this.layersButton = elements.layersButton; + this.thumbnailView = elements.thumbnailView; + this.outlineView = elements.outlineView; + this.attachmentsView = elements.attachmentsView; + this.layersView = elements.layersView; + this._currentOutlineItemButton = elements.currentOutlineItemButton; + this.eventBus = eventBus; + this.#isRTL = l10n.getDirection() === "rtl"; + this.#addEventListeners(); + } + reset() { + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.#hideUINotification(true); + this.switchView(SidebarView.THUMBS); + this.outlineButton.disabled = false; + this.attachmentsButton.disabled = false; + this.layersButton.disabled = false; + this._currentOutlineItemButton.disabled = true; + } + get visibleView() { + return this.isOpen ? this.active : SidebarView.NONE; + } + setInitialView(view = SidebarView.NONE) { + if (this.isInitialViewSet) { + return; + } + this.isInitialViewSet = true; + if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) { + this.#dispatchEvent(); + return; + } + this.switchView(view, true); + if (!this.isInitialEventDispatched) { + this.#dispatchEvent(); + } + } + switchView(view, forceOpen = false) { + const isViewChanged = view !== this.active; + let forceRendering = false; + switch (view) { + case SidebarView.NONE: + if (this.isOpen) { + this.close(); + } + return; + case SidebarView.THUMBS: + if (this.isOpen && isViewChanged) { + forceRendering = true; + } + break; + case SidebarView.OUTLINE: + if (this.outlineButton.disabled) { + return; + } + break; + case SidebarView.ATTACHMENTS: + if (this.attachmentsButton.disabled) { + return; + } + break; + case SidebarView.LAYERS: + if (this.layersButton.disabled) { + return; + } + break; + default: + console.error(`PDFSidebar.switchView: "${view}" is not a valid view.`); + return; + } + this.active = view; + toggleCheckedBtn(this.thumbnailButton, view === SidebarView.THUMBS, this.thumbnailView); + toggleCheckedBtn(this.outlineButton, view === SidebarView.OUTLINE, this.outlineView); + toggleCheckedBtn(this.attachmentsButton, view === SidebarView.ATTACHMENTS, this.attachmentsView); + toggleCheckedBtn(this.layersButton, view === SidebarView.LAYERS, this.layersView); + if (forceOpen && !this.isOpen) { + this.open(); + return; + } + if (forceRendering) { + this.onUpdateThumbnails(); + this.onToggled(); + } + if (isViewChanged) { + this.#dispatchEvent(); + } + } + open() { + if (this.isOpen) { + return; + } + this.isOpen = true; + toggleExpandedBtn(this.toggleButton, true); + this.outerContainer.classList.add("sidebarMoving", "sidebarOpen"); + if (this.active === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + this.onToggled(); + this.#dispatchEvent(); + this.#hideUINotification(); + } + close(evt = null) { + if (!this.isOpen) { + return; + } + this.isOpen = false; + toggleExpandedBtn(this.toggleButton, false); + this.outerContainer.classList.add("sidebarMoving"); + this.outerContainer.classList.remove("sidebarOpen"); + this.onToggled(); + this.#dispatchEvent(); + if (evt?.detail > 0) { + this.toggleButton.blur(); + } + } + toggle(evt = null) { + if (this.isOpen) { + this.close(evt); + } else { + this.open(); + } + } + #dispatchEvent() { + if (this.isInitialViewSet) { + this.isInitialEventDispatched ||= true; + } + this.eventBus.dispatch("sidebarviewchanged", { + source: this, + view: this.visibleView + }); + } + #showUINotification() { + this.toggleButton.setAttribute("data-l10n-id", "pdfjs-toggle-sidebar-notification-button"); + if (!this.isOpen) { + this.toggleButton.classList.add(UI_NOTIFICATION_CLASS); + } + } + #hideUINotification(reset = false) { + if (this.isOpen || reset) { + this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS); + } + if (reset) { + this.toggleButton.setAttribute("data-l10n-id", "pdfjs-toggle-sidebar-button"); + } + } + #addEventListeners() { + const { + eventBus, + outerContainer + } = this; + this.sidebarContainer.addEventListener("transitionend", evt => { + if (evt.target === this.sidebarContainer) { + outerContainer.classList.remove("sidebarMoving"); + eventBus.dispatch("resize", { + source: this + }); + } + }); + this.toggleButton.addEventListener("click", evt => { + this.toggle(evt); + }); + this.thumbnailButton.addEventListener("click", () => { + this.switchView(SidebarView.THUMBS); + }); + this.outlineButton.addEventListener("click", () => { + this.switchView(SidebarView.OUTLINE); + }); + this.outlineButton.addEventListener("dblclick", () => { + eventBus.dispatch("toggleoutlinetree", { + source: this + }); + }); + this.attachmentsButton.addEventListener("click", () => { + this.switchView(SidebarView.ATTACHMENTS); + }); + this.layersButton.addEventListener("click", () => { + this.switchView(SidebarView.LAYERS); + }); + this.layersButton.addEventListener("dblclick", () => { + eventBus.dispatch("resetlayers", { + source: this + }); + }); + this._currentOutlineItemButton.addEventListener("click", () => { + eventBus.dispatch("currentoutlineitem", { + source: this + }); + }); + const onTreeLoaded = (count, button, view) => { + button.disabled = !count; + if (count) { + this.#showUINotification(); + } else if (this.active === view) { + this.switchView(SidebarView.THUMBS); + } + }; + eventBus._on("outlineloaded", evt => { + onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE); + evt.currentOutlineItemPromise.then(enabled => { + if (!this.isInitialViewSet) { + return; + } + this._currentOutlineItemButton.disabled = !enabled; + }); + }); + eventBus._on("attachmentsloaded", evt => { + onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, SidebarView.ATTACHMENTS); + }); + eventBus._on("layersloaded", evt => { + onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS); + }); + eventBus._on("presentationmodechanged", evt => { + if (evt.state === PresentationModeState.NORMAL && this.visibleView === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + }); + this.resizer.addEventListener("mousedown", evt => { + if (evt.button !== 0) { + return; + } + outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); + this.#mouseAC = new AbortController(); + const opts = { + signal: this.#mouseAC.signal + }; + window.addEventListener("mousemove", this.#mouseMove.bind(this), opts); + window.addEventListener("mouseup", this.#mouseUp.bind(this), opts); + window.addEventListener("blur", this.#mouseUp.bind(this), opts); + }); + eventBus._on("resize", evt => { + if (evt.source !== window) { + return; + } + this.#outerContainerWidth = null; + if (!this.#width) { + return; + } + if (!this.isOpen) { + this.#updateWidth(this.#width); + return; + } + outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); + const updated = this.#updateWidth(this.#width); + Promise.resolve().then(() => { + outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + if (updated) { + eventBus.dispatch("resize", { + source: this + }); + } + }); + }); + } + get outerContainerWidth() { + return this.#outerContainerWidth ||= this.outerContainer.clientWidth; + } + #updateWidth(width = 0) { + const maxWidth = Math.floor(this.outerContainerWidth / 2); + if (width > maxWidth) { + width = maxWidth; + } + if (width < SIDEBAR_MIN_WIDTH) { + width = SIDEBAR_MIN_WIDTH; + } + if (width === this.#width) { + return false; + } + this.#width = width; + docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`); + return true; + } + #mouseMove(evt) { + let width = evt.clientX; + if (this.#isRTL) { + width = this.outerContainerWidth - width; + } + this.#updateWidth(width); + } + #mouseUp(evt) { + this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + this.eventBus.dispatch("resize", { + source: this + }); + this.#mouseAC?.abort(); + this.#mouseAC = null; + } +} + +;// ./web/pdf_thumbnail_view.js + + + +const DRAW_UPSCALE_FACTOR = 2; +const MAX_NUM_SCALING_STEPS = 3; +const THUMBNAIL_WIDTH = 98; +function zeroCanvas(c) { + c.width = 0; + c.height = 0; +} +class TempImageFactory { + static #tempCanvas = null; + static getCanvas(width, height) { + const tempCanvas = this.#tempCanvas ||= document.createElement("canvas"); + tempCanvas.width = width; + tempCanvas.height = height; + const ctx = tempCanvas.getContext("2d", { + alpha: false + }); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return [tempCanvas, tempCanvas.getContext("2d")]; + } + static destroyCanvas() { + if (this.#tempCanvas) { + zeroCanvas(this.#tempCanvas); + } + this.#tempCanvas = null; + } +} +class PDFThumbnailView { + constructor({ + container, + eventBus, + id, + defaultViewport, + optionalContentConfigPromise, + linkService, + renderingQueue, + maxCanvasPixels, + maxCanvasDim, + pageColors, + enableHWA + }) { + this.id = id; + this.renderingId = "thumbnail" + id; + this.pageLabel = null; + this.pdfPage = null; + this.rotation = 0; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = optionalContentConfigPromise || null; + this.maxCanvasPixels = maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); + this.maxCanvasDim = maxCanvasDim || AppOptions.get("maxCanvasDim"); + this.pageColors = pageColors || null; + this.enableHWA = enableHWA || false; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.renderTask = null; + this.renderingState = RenderingStates.INITIAL; + this.resume = null; + const anchor = document.createElement("a"); + anchor.href = linkService.getAnchorUrl("#page=" + id); + anchor.setAttribute("data-l10n-id", "pdfjs-thumb-page-title"); + anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); + anchor.onclick = function () { + linkService.goToPage(id); + return false; + }; + this.anchor = anchor; + const div = document.createElement("div"); + div.className = "thumbnail"; + div.setAttribute("data-page-number", this.id); + this.div = div; + this.#updateDims(); + const img = document.createElement("div"); + img.className = "thumbnailImage"; + this._placeholderImg = img; + div.append(img); + anchor.append(div); + container.append(anchor); + } + #updateDims() { + const { + width, + height + } = this.viewport; + const ratio = width / height; + this.canvasWidth = THUMBNAIL_WIDTH; + this.canvasHeight = this.canvasWidth / ratio | 0; + this.scale = this.canvasWidth / width; + const { + style + } = this.div; + style.setProperty("--thumbnail-width", `${this.canvasWidth}px`); + style.setProperty("--thumbnail-height", `${this.canvasHeight}px`); + } + setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + reset() { + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + this.div.removeAttribute("data-loaded"); + this.image?.replaceWith(this._placeholderImg); + this.#updateDims(); + if (this.image) { + this.image.removeAttribute("src"); + delete this.image; + } + } + update({ + rotation = null + }) { + if (typeof rotation === "number") { + this.rotation = rotation; + } + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + cancelRendering() { + if (this.renderTask) { + this.renderTask.cancel(); + this.renderTask = null; + } + this.resume = null; + } + #getPageDrawContext(upscaleFactor = 1, enableHWA = this.enableHWA) { + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: !enableHWA + }); + const outputScale = new OutputScale(); + const width = upscaleFactor * this.canvasWidth, + height = upscaleFactor * this.canvasHeight; + outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim); + canvas.width = width * outputScale.sx | 0; + canvas.height = height * outputScale.sy | 0; + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + return { + ctx, + canvas, + transform + }; + } + #convertCanvasToImage(canvas) { + if (this.renderingState !== RenderingStates.FINISHED) { + throw new Error("#convertCanvasToImage: Rendering has not finished."); + } + const reducedCanvas = this.#reduceImage(canvas); + const image = document.createElement("img"); + image.className = "thumbnailImage"; + image.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas"); + image.setAttribute("data-l10n-args", this.#pageL10nArgs); + image.src = reducedCanvas.toDataURL(); + this.image = image; + this.div.setAttribute("data-loaded", true); + this._placeholderImg.replaceWith(image); + zeroCanvas(reducedCanvas); + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + return; + } + const { + pageColors, + pdfPage + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const { + ctx, + canvas, + transform + } = this.#getPageDrawContext(DRAW_UPSCALE_FACTOR); + const drawViewport = this.viewport.clone({ + scale: DRAW_UPSCALE_FACTOR * this.scale + }); + const renderContinueCallback = cont => { + if (!this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + const renderContext = { + canvasContext: ctx, + transform, + viewport: drawViewport, + optionalContentConfigPromise: this._optionalContentConfigPromise, + pageColors + }; + const renderTask = this.renderTask = pdfPage.render(renderContext); + renderTask.onContinue = renderContinueCallback; + let error = null; + try { + await renderTask.promise; + } catch (e) { + if (e instanceof RenderingCancelledException) { + zeroCanvas(canvas); + return; + } + error = e; + } finally { + if (renderTask === this.renderTask) { + this.renderTask = null; + } + } + this.renderingState = RenderingStates.FINISHED; + this.#convertCanvasToImage(canvas); + zeroCanvas(canvas); + this.eventBus.dispatch("thumbnailrendered", { + source: this, + pageNumber: this.id, + pdfPage + }); + if (error) { + throw error; + } + } + setImage(pageView) { + if (this.renderingState !== RenderingStates.INITIAL) { + return; + } + const { + thumbnailCanvas: canvas, + pdfPage, + scale + } = pageView; + if (!canvas) { + return; + } + if (!this.pdfPage) { + this.setPdfPage(pdfPage); + } + if (scale < this.scale) { + return; + } + this.renderingState = RenderingStates.FINISHED; + this.#convertCanvasToImage(canvas); + } + #getReducedImageDims(canvas) { + const width = canvas.width << MAX_NUM_SCALING_STEPS, + height = canvas.height << MAX_NUM_SCALING_STEPS; + const outputScale = new OutputScale(); + outputScale.sx = outputScale.sy = 1; + outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim); + return [width * outputScale.sx | 0, height * outputScale.sy | 0]; + } + #reduceImage(img) { + const { + ctx, + canvas + } = this.#getPageDrawContext(1, true); + if (img.width <= 2 * canvas.width) { + ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); + return canvas; + } + let [reducedWidth, reducedHeight] = this.#getReducedImageDims(canvas); + const [reducedImage, reducedImageCtx] = TempImageFactory.getCanvas(reducedWidth, reducedHeight); + 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); + return canvas; + } + get #pageL10nArgs() { + return JSON.stringify({ + page: this.pageLabel ?? this.id + }); + } + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); + if (this.renderingState !== RenderingStates.FINISHED) { + return; + } + this.image?.setAttribute("data-l10n-args", this.#pageL10nArgs); + } +} + +;// ./web/pdf_thumbnail_viewer.js + + +const THUMBNAIL_SCROLL_MARGIN = -19; +const THUMBNAIL_SELECTED_CLASS = "selected"; +class PDFThumbnailViewer { + constructor({ + container, + eventBus, + linkService, + renderingQueue, + maxCanvasPixels, + maxCanvasDim, + pageColors, + abortSignal, + enableHWA + }) { + this.container = container; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.maxCanvasPixels = maxCanvasPixels; + this.maxCanvasDim = maxCanvasDim; + this.pageColors = pageColors || null; + this.enableHWA = enableHWA || false; + this.scroll = watchScroll(this.container, this.#scrollUpdated.bind(this), abortSignal); + this.#resetView(); + } + #scrollUpdated() { + this.renderingQueue.renderHighestPriority(); + } + getThumbnail(index) { + return this._thumbnails[index]; + } + #getVisibleThumbs() { + return getVisibleElements({ + scrollEl: this.container, + views: this._thumbnails + }); + } + scrollThumbnailIntoView(pageNumber) { + if (!this.pdfDocument) { + return; + } + const thumbnailView = this._thumbnails[pageNumber - 1]; + if (!thumbnailView) { + console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.'); + return; + } + if (pageNumber !== this._currentPageNumber) { + const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1]; + prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS); + thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + } + const { + first, + last, + views + } = this.#getVisibleThumbs(); + if (views.length > 0) { + let shouldScroll = false; + if (pageNumber <= first.id || pageNumber >= last.id) { + shouldScroll = true; + } else { + for (const { + id, + percent + } of views) { + if (id !== pageNumber) { + continue; + } + shouldScroll = percent < 100; + break; + } + } + if (shouldScroll) { + scrollIntoView(thumbnailView.div, { + top: THUMBNAIL_SCROLL_MARGIN + }); + } + } + this._currentPageNumber = pageNumber; + } + get pagesRotation() { + return this._pagesRotation; + } + set pagesRotation(rotation) { + if (!isValidRotation(rotation)) { + throw new Error("Invalid thumbnails rotation angle."); + } + if (!this.pdfDocument) { + return; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const updateArgs = { + rotation + }; + for (const thumbnail of this._thumbnails) { + thumbnail.update(updateArgs); + } + } + cleanup() { + for (const thumbnail of this._thumbnails) { + if (thumbnail.renderingState !== RenderingStates.FINISHED) { + thumbnail.reset(); + } + } + TempImageFactory.destroyCanvas(); + } + #resetView() { + this._thumbnails = []; + this._currentPageNumber = 1; + this._pageLabels = null; + this._pagesRotation = 0; + this.container.textContent = ""; + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#cancelRendering(); + this.#resetView(); + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + firstPagePromise.then(firstPdfPage => { + const pagesCount = pdfDocument.numPages; + const viewport = firstPdfPage.getViewport({ + scale: 1 + }); + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const thumbnail = new PDFThumbnailView({ + container: this.container, + eventBus: this.eventBus, + id: pageNum, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + linkService: this.linkService, + renderingQueue: this.renderingQueue, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + pageColors: this.pageColors, + enableHWA: this.enableHWA + }); + this._thumbnails.push(thumbnail); + } + this._thumbnails[0]?.setPdfPage(firstPdfPage); + const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; + thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + }).catch(reason => { + console.error("Unable to initialize thumbnail viewer", reason); + }); + } + #cancelRendering() { + for (const thumbnail of this._thumbnails) { + thumbnail.cancelRendering(); + } + } + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error("PDFThumbnailViewer_setPageLabels: Invalid page labels."); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { + this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + async #ensurePdfPageLoaded(thumbView) { + if (thumbView.pdfPage) { + return thumbView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(thumbView.id); + if (!thumbView.pdfPage) { + thumbView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for thumb view", reason); + return null; + } + } + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this._thumbnails.length) { + return false; + } + return this.scroll.down; + } + forceRendering() { + const visibleThumbs = this.#getVisibleThumbs(); + const scrollAhead = this.#getScrollAhead(visibleThumbs); + const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, scrollAhead, false, true); + if (thumbView) { + this.#ensurePdfPageLoaded(thumbView).then(() => { + this.renderingQueue.renderView(thumbView); + }); + return true; + } + return false; + } +} + +;// ./web/annotation_editor_layer_builder.js + + +class AnnotationEditorLayerBuilder { + #annotationLayer = null; + #drawLayer = null; + #onAppend = null; + #structTreeLayer = null; + #textLayer = null; + #uiManager; + constructor(options) { + this.pdfPage = options.pdfPage; + this.accessibilityManager = options.accessibilityManager; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.annotationEditorLayer = null; + this.div = null; + this._cancelled = false; + this.#uiManager = options.uiManager; + this.#annotationLayer = options.annotationLayer || null; + this.#textLayer = options.textLayer || null; + this.#drawLayer = options.drawLayer || null; + this.#onAppend = options.onAppend || null; + this.#structTreeLayer = options.structTreeLayer || null; + } + async render({ + viewport, + intent = "display" + }) { + if (intent !== "display") { + return; + } + if (this._cancelled) { + return; + } + const clonedViewport = viewport.clone({ + dontFlip: true + }); + if (this.div) { + this.annotationEditorLayer.update({ + viewport: clonedViewport + }); + this.show(); + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationEditorLayer"; + div.hidden = true; + div.dir = this.#uiManager.direction; + this.#onAppend?.(div); + this.annotationEditorLayer = new AnnotationEditorLayer({ + uiManager: this.#uiManager, + div, + structTreeLayer: this.#structTreeLayer, + accessibilityManager: this.accessibilityManager, + pageIndex: this.pdfPage.pageNumber - 1, + l10n: this.l10n, + viewport: clonedViewport, + annotationLayer: this.#annotationLayer, + textLayer: this.#textLayer, + drawLayer: this.#drawLayer + }); + const parameters = { + viewport: clonedViewport, + div, + annotations: null, + intent + }; + this.annotationEditorLayer.render(parameters); + this.show(); + } + cancel() { + this._cancelled = true; + if (!this.div) { + return; + } + this.annotationEditorLayer.destroy(); + } + hide() { + if (!this.div) { + return; + } + this.annotationEditorLayer.pause(true); + this.div.hidden = true; + } + show() { + if (!this.div || this.annotationEditorLayer.isInvisible) { + return; + } + this.div.hidden = false; + this.annotationEditorLayer.pause(false); + } +} + +;// ./web/annotation_layer_builder.js + + +class AnnotationLayerBuilder { + #annotations = null; + #externalHide = false; + #onAppend = null; + #eventAbortController = null; + #linksInjected = false; + constructor({ + pdfPage, + linkService, + downloadManager, + annotationStorage = null, + imageResourcesPath = "", + renderForms = true, + enableScripting = false, + hasJSActionsPromise = null, + fieldObjectsPromise = null, + annotationCanvasMap = null, + accessibilityManager = null, + annotationEditorUIManager = null, + onAppend = null + }) { + this.pdfPage = pdfPage; + this.linkService = linkService; + this.downloadManager = downloadManager; + this.imageResourcesPath = imageResourcesPath; + this.renderForms = renderForms; + this.annotationStorage = annotationStorage; + this.enableScripting = enableScripting; + this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false); + this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null); + this._annotationCanvasMap = annotationCanvasMap; + this._accessibilityManager = accessibilityManager; + this._annotationEditorUIManager = annotationEditorUIManager; + this.#onAppend = onAppend; + this.annotationLayer = null; + this.div = null; + this._cancelled = false; + this._eventBus = linkService.eventBus; + } + async render({ + viewport, + intent = "display", + structTreeLayer = null + }) { + if (this.div) { + if (this._cancelled || !this.annotationLayer) { + return; + } + this.annotationLayer.update({ + viewport: viewport.clone({ + dontFlip: true + }) + }); + return; + } + const [annotations, hasJSActions, fieldObjects] = await Promise.all([this.pdfPage.getAnnotations({ + intent + }), this._hasJSActionsPromise, this._fieldObjectsPromise]); + if (this._cancelled) { + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationLayer"; + this.#onAppend?.(div); + if (annotations.length === 0) { + this.#annotations = annotations; + this.hide(true); + return; + } + this.#initAnnotationLayer(viewport, structTreeLayer); + await this.annotationLayer.render({ + annotations, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.renderForms, + linkService: this.linkService, + downloadManager: this.downloadManager, + annotationStorage: this.annotationStorage, + enableScripting: this.enableScripting, + hasJSActions, + fieldObjects + }); + this.#annotations = annotations; + if (this.linkService.isInPresentationMode) { + this.#updatePresentationModeState(PresentationModeState.FULLSCREEN); + } + if (!this.#eventAbortController) { + this.#eventAbortController = new AbortController(); + this._eventBus?._on("presentationmodechanged", evt => { + this.#updatePresentationModeState(evt.state); + }, { + signal: this.#eventAbortController.signal + }); + } + } + #initAnnotationLayer(viewport, structTreeLayer) { + this.annotationLayer = new AnnotationLayer({ + div: this.div, + accessibilityManager: this._accessibilityManager, + annotationCanvasMap: this._annotationCanvasMap, + annotationEditorUIManager: this._annotationEditorUIManager, + page: this.pdfPage, + viewport: viewport.clone({ + dontFlip: true + }), + structTreeLayer + }); + } + cancel() { + this._cancelled = true; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + } + hide(internal = false) { + this.#externalHide = !internal; + if (!this.div) { + return; + } + this.div.hidden = true; + } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } + async injectLinkAnnotations({ + inferredLinks, + viewport, + structTreeLayer = null + }) { + if (this.#annotations === null) { + throw new Error("`render` method must be called before `injectLinkAnnotations`."); + } + if (this._cancelled || this.#linksInjected) { + return; + } + this.#linksInjected = true; + const newLinks = this.#annotations.length ? this.#checkInferredLinks(inferredLinks) : inferredLinks; + if (!newLinks.length) { + return; + } + if (!this.annotationLayer) { + this.#initAnnotationLayer(viewport, structTreeLayer); + setLayerDimensions(this.div, viewport); + } + await this.annotationLayer.addLinkAnnotations(newLinks, this.linkService); + if (!this.#externalHide) { + this.div.hidden = false; + } + } + #updatePresentationModeState(state) { + if (!this.div) { + return; + } + let disableFormElements = false; + switch (state) { + case PresentationModeState.FULLSCREEN: + disableFormElements = true; + break; + case PresentationModeState.NORMAL: + break; + default: + return; + } + for (const section of this.div.childNodes) { + if (section.hasAttribute("data-internal-link")) { + continue; + } + section.inert = disableFormElements; + } + } + #checkInferredLinks(inferredLinks) { + function annotationRects(annot) { + if (!annot.quadPoints) { + return [annot.rect]; + } + const rects = []; + for (let i = 2, ii = annot.quadPoints.length; i < ii; i += 8) { + const trX = annot.quadPoints[i]; + const trY = annot.quadPoints[i + 1]; + const blX = annot.quadPoints[i + 2]; + const blY = annot.quadPoints[i + 3]; + rects.push([blX, blY, trX, trY]); + } + return rects; + } + function intersectAnnotations(annot1, annot2) { + const intersections = []; + const annot1Rects = annotationRects(annot1); + const annot2Rects = annotationRects(annot2); + for (const rect1 of annot1Rects) { + for (const rect2 of annot2Rects) { + const intersection = Util.intersect(rect1, rect2); + if (intersection) { + intersections.push(intersection); + } + } + } + return intersections; + } + function areaRects(rects) { + let totalArea = 0; + for (const rect of rects) { + totalArea += Math.abs((rect[2] - rect[0]) * (rect[3] - rect[1])); + } + return totalArea; + } + return inferredLinks.filter(link => { + let linkAreaRects; + for (const annotation of this.#annotations) { + if (annotation.annotationType !== AnnotationType.LINK || !annotation.url) { + continue; + } + const intersections = intersectAnnotations(annotation, link); + if (intersections.length === 0) { + continue; + } + linkAreaRects ??= areaRects(annotationRects(link)); + if (areaRects(intersections) / linkAreaRects > 0.5) { + return false; + } + } + return true; + }); + } +} + +;// ./web/autolinker.js + + +function DOMRectToPDF({ + width, + height, + left, + top +}, pdfPageView) { + if (width === 0 || height === 0) { + return null; + } + const pageBox = pdfPageView.textLayer.div.getBoundingClientRect(); + const bottomLeft = pdfPageView.getPagePoint(left - pageBox.left, top - pageBox.top); + const topRight = pdfPageView.getPagePoint(left - pageBox.left + width, top - pageBox.top + height); + return Util.normalizeRect([bottomLeft[0], bottomLeft[1], topRight[0], topRight[1]]); +} +function calculateLinkPosition(range, pdfPageView) { + const rangeRects = range.getClientRects(); + if (rangeRects.length === 1) { + return { + rect: DOMRectToPDF(rangeRects[0], pdfPageView) + }; + } + const rect = [Infinity, Infinity, -Infinity, -Infinity]; + const quadPoints = []; + let i = 0; + for (const domRect of rangeRects) { + const normalized = DOMRectToPDF(domRect, pdfPageView); + if (normalized === null) { + continue; + } + quadPoints[i] = quadPoints[i + 4] = normalized[0]; + quadPoints[i + 1] = quadPoints[i + 3] = normalized[3]; + quadPoints[i + 2] = quadPoints[i + 6] = normalized[2]; + quadPoints[i + 5] = quadPoints[i + 7] = normalized[1]; + Util.rectBoundingBox(...normalized, rect); + i += 8; + } + return { + quadPoints, + rect + }; +} +function textPosition(container, offset) { + let currentContainer = container; + do { + if (currentContainer.nodeType === Node.TEXT_NODE) { + const currentLength = currentContainer.textContent.length; + if (offset <= currentLength) { + return [currentContainer, offset]; + } + offset -= currentLength; + } else if (currentContainer.firstChild) { + currentContainer = currentContainer.firstChild; + continue; + } + while (!currentContainer.nextSibling && currentContainer !== container) { + currentContainer = currentContainer.parentNode; + } + if (currentContainer !== container) { + currentContainer = currentContainer.nextSibling; + } + } while (currentContainer !== container); + throw new Error("Offset is bigger than container's contents length."); +} +function createLinkAnnotation({ + url, + index, + length +}, pdfPageView, id) { + const highlighter = pdfPageView._textHighlighter; + const [{ + begin, + end + }] = highlighter._convertMatches([index], [length]); + const range = new Range(); + range.setStart(...textPosition(highlighter.textDivs[begin.divIdx], begin.offset)); + range.setEnd(...textPosition(highlighter.textDivs[end.divIdx], end.offset)); + return { + id: `inferred_link_${id}`, + unsafeUrl: url, + url, + annotationType: AnnotationType.LINK, + rotation: 0, + ...calculateLinkPosition(range, pdfPageView), + borderStyle: null + }; +} +class Autolinker { + static #index = 0; + static #regex; + static findLinks(text) { + this.#regex ??= /\b(?:https?:\/\/|mailto:|www\.)(?:[\S--[\p{P}<>]]|\/|[\S--[\[\]]]+[\S--[\p{P}<>]])+|\b[\S--[@\p{Ps}\p{Pe}<>]]+@([\S--[\p{P}<>]]+(?:\.[\S--[\p{P}<>]]+)+)/gmv; + const [normalizedText, diffs] = normalize(text); + const matches = normalizedText.matchAll(this.#regex); + const links = []; + for (const match of matches) { + const [url, emailDomain] = match; + let raw; + if (url.startsWith("www.") || url.startsWith("http://") || url.startsWith("https://")) { + raw = url; + } else if (URL.canParse(`http://${emailDomain}`)) { + raw = url.startsWith("mailto:") ? url : `mailto:${url}`; + } else { + continue; + } + const absoluteURL = createValidAbsoluteUrl(raw, null, { + addDefaultProtocol: true + }); + if (absoluteURL) { + const [index, length] = getOriginalIndex(diffs, match.index, url.length); + links.push({ + url: absoluteURL.href, + index, + length + }); + } + } + return links; + } + static processLinks(pdfPageView) { + return this.findLinks(pdfPageView._textHighlighter.textContentItemsStr.join("\n")).map(link => createLinkAnnotation(link, pdfPageView, this.#index++)); + } +} + +;// ./web/base_pdf_page_view.js + + +class BasePDFPageView { + #enableHWA = false; + #loadingId = null; + #renderError = null; + #renderingState = RenderingStates.INITIAL; + #showCanvas = null; + canvas = null; + div = null; + eventBus = null; + id = null; + pageColors = null; + renderingQueue = null; + renderTask = null; + resume = null; + constructor(options) { + this.#enableHWA = #enableHWA in options ? options.#enableHWA : options.enableHWA || false; + this.eventBus = options.eventBus; + this.id = options.id; + this.pageColors = options.pageColors || null; + this.renderingQueue = options.renderingQueue; + } + get renderingState() { + return this.#renderingState; + } + set renderingState(state) { + if (state === this.#renderingState) { + return; + } + this.#renderingState = state; + if (this.#loadingId) { + clearTimeout(this.#loadingId); + this.#loadingId = null; + } + switch (state) { + case RenderingStates.PAUSED: + this.div.classList.remove("loading"); + break; + case RenderingStates.RUNNING: + this.div.classList.add("loadingIcon"); + this.#loadingId = setTimeout(() => { + this.div.classList.add("loading"); + this.#loadingId = null; + }, 0); + break; + case RenderingStates.INITIAL: + case RenderingStates.FINISHED: + this.div.classList.remove("loadingIcon", "loading"); + break; + } + } + _createCanvas(onShow, hideUntilComplete = false) { + const { + pageColors + } = this; + const hasHCM = !!(pageColors?.background && pageColors?.foreground); + const prevCanvas = this.canvas; + const updateOnFirstShow = !prevCanvas && !hasHCM && !hideUntilComplete; + const canvas = this.canvas = document.createElement("canvas"); + this.#showCanvas = isLastShow => { + if (updateOnFirstShow) { + onShow(canvas); + this.#showCanvas = null; + return; + } + if (!isLastShow) { + return; + } + if (prevCanvas) { + prevCanvas.replaceWith(canvas); + prevCanvas.width = prevCanvas.height = 0; + } else { + onShow(canvas); + } + }; + const ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: !this.#enableHWA + }); + return { + canvas, + prevCanvas, + ctx + }; + } + #renderContinueCallback = cont => { + this.#showCanvas?.(false); + if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + _resetCanvas() { + const { + canvas + } = this; + if (!canvas) { + return; + } + canvas.remove(); + canvas.width = canvas.height = 0; + this.canvas = null; + } + async _drawCanvas(options, onCancel, onFinish) { + const renderTask = this.renderTask = this.pdfPage.render(options); + renderTask.onContinue = this.#renderContinueCallback; + renderTask.onError = error => { + if (error instanceof RenderingCancelledException) { + onCancel(); + this.#renderError = null; + } + }; + let error = null; + try { + await renderTask.promise; + this.#showCanvas?.(true); + } catch (e) { + if (e instanceof RenderingCancelledException) { + return; + } + error = e; + this.#showCanvas?.(true); + } finally { + this.#renderError = error; + if (renderTask === this.renderTask) { + this.renderTask = null; + } + } + this.renderingState = RenderingStates.FINISHED; + onFinish(renderTask); + if (error) { + throw error; + } + } + cancelRendering({ + cancelExtraDelay = 0 + } = {}) { + if (this.renderTask) { + this.renderTask.cancel(cancelExtraDelay); + this.renderTask = null; + } + this.resume = null; + } + dispatchPageRender() { + this.eventBus.dispatch("pagerender", { + source: this, + pageNumber: this.id + }); + } + dispatchPageRendered(cssTransform, isDetailView) { + this.eventBus.dispatch("pagerendered", { + source: this, + pageNumber: this.id, + cssTransform, + isDetailView, + timestamp: performance.now(), + error: this.#renderError + }); + } +} + +;// ./web/draw_layer_builder.js + +class DrawLayerBuilder { + #drawLayer = null; + constructor(options) { + this.pageIndex = options.pageIndex; + } + async render({ + intent = "display" + }) { + if (intent !== "display" || this.#drawLayer || this._cancelled) { + return; + } + this.#drawLayer = new DrawLayer({ + pageIndex: this.pageIndex + }); + } + cancel() { + this._cancelled = true; + if (!this.#drawLayer) { + return; + } + this.#drawLayer.destroy(); + this.#drawLayer = null; + } + setParent(parent) { + this.#drawLayer?.setParent(parent); + } + getDrawLayer() { + return this.#drawLayer; + } +} + +;// ./web/pdf_page_detail_view.js + + + +class PDFPageDetailView extends BasePDFPageView { + #detailArea = null; + renderingCancelled = false; + constructor({ + pageView + }) { + super(pageView); + this.pageView = pageView; + this.renderingId = "detail" + this.id; + this.div = pageView.div; + } + setPdfPage(pdfPage) { + this.pageView.setPdfPage(pdfPage); + } + get pdfPage() { + return this.pageView.pdfPage; + } + get renderingState() { + return super.renderingState; + } + set renderingState(value) { + this.renderingCancelled = false; + super.renderingState = value; + } + reset({ + keepCanvas = false + } = {}) { + const renderingCancelled = this.renderingCancelled || this.renderingState === RenderingStates.RUNNING || this.renderingState === RenderingStates.PAUSED; + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + this.renderingCancelled = renderingCancelled; + if (!keepCanvas) { + this._resetCanvas(); + } + } + #shouldRenderDifferentArea(visibleArea) { + if (!this.#detailArea) { + return true; + } + const minDetailX = this.#detailArea.minX; + const minDetailY = this.#detailArea.minY; + const maxDetailX = this.#detailArea.width + minDetailX; + const maxDetailY = this.#detailArea.height + minDetailY; + if (visibleArea.minX < minDetailX || visibleArea.minY < minDetailY || visibleArea.maxX > maxDetailX || visibleArea.maxY > maxDetailY) { + return true; + } + const { + width: maxWidth, + height: maxHeight, + scale + } = this.pageView.viewport; + if (this.#detailArea.scale !== scale) { + return true; + } + const paddingLeftSize = visibleArea.minX - minDetailX; + const paddingRightSize = maxDetailX - visibleArea.maxX; + const paddingTopSize = visibleArea.minY - minDetailY; + const paddingBottomSize = maxDetailY - visibleArea.maxY; + const MOVEMENT_THRESHOLD = 0.5; + const ratio = (1 + MOVEMENT_THRESHOLD) / MOVEMENT_THRESHOLD; + if (minDetailX > 0 && paddingRightSize / paddingLeftSize > ratio || maxDetailX < maxWidth && paddingLeftSize / paddingRightSize > ratio || minDetailY > 0 && paddingBottomSize / paddingTopSize > ratio || maxDetailY < maxHeight && paddingTopSize / paddingBottomSize > ratio) { + return true; + } + return false; + } + update({ + visibleArea = null, + underlyingViewUpdated = false + } = {}) { + if (underlyingViewUpdated) { + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + return; + } + if (!this.#shouldRenderDifferentArea(visibleArea)) { + return; + } + const { + viewport, + maxCanvasPixels + } = this.pageView; + const visibleWidth = visibleArea.maxX - visibleArea.minX; + const visibleHeight = visibleArea.maxY - visibleArea.minY; + const visiblePixels = visibleWidth * visibleHeight * OutputScale.pixelRatio ** 2; + const maxDetailToVisibleLinearRatio = Math.sqrt(maxCanvasPixels / visiblePixels); + const maxOverflowScale = (maxDetailToVisibleLinearRatio - 1) / 2; + let overflowScale = Math.min(1, maxOverflowScale); + if (overflowScale < 0) { + overflowScale = 0; + } + const overflowWidth = visibleWidth * overflowScale; + const overflowHeight = visibleHeight * overflowScale; + const minX = Math.max(0, visibleArea.minX - overflowWidth); + const maxX = Math.min(viewport.width, visibleArea.maxX + overflowWidth); + const minY = Math.max(0, visibleArea.minY - overflowHeight); + const maxY = Math.min(viewport.height, visibleArea.maxY + overflowHeight); + const width = maxX - minX; + const height = maxY - minY; + this.#detailArea = { + minX, + minY, + width, + height, + scale: viewport.scale + }; + this.reset({ + keepCanvas: true + }); + } + async draw() { + if (this.pageView.detailView !== this) { + return undefined; + } + const hideUntilComplete = this.pageView.renderingState === RenderingStates.FINISHED || this.renderingState === RenderingStates.FINISHED; + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); + } + const { + div, + pdfPage, + viewport + } = this.pageView; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const canvasWrapper = this.pageView._ensureCanvasWrapper(); + const { + canvas, + prevCanvas, + ctx + } = this._createCanvas(newCanvas => { + if (canvasWrapper.firstElementChild?.tagName === "CANVAS") { + canvasWrapper.firstElementChild.after(newCanvas); + } else { + canvasWrapper.prepend(newCanvas); + } + }, hideUntilComplete); + canvas.setAttribute("aria-hidden", "true"); + const { + width, + height + } = viewport; + const area = this.#detailArea; + const { + pixelRatio + } = OutputScale; + const transform = [pixelRatio, 0, 0, pixelRatio, -area.minX * pixelRatio, -area.minY * pixelRatio]; + canvas.width = area.width * pixelRatio; + canvas.height = area.height * pixelRatio; + const { + style + } = canvas; + style.width = `${area.width * 100 / width}%`; + style.height = `${area.height * 100 / height}%`; + style.top = `${area.minY * 100 / height}%`; + style.left = `${area.minX * 100 / width}%`; + const renderingPromise = this._drawCanvas(this.pageView._getRenderingContext(ctx, transform), () => { + this.canvas?.remove(); + this.canvas = prevCanvas; + }, () => { + this.dispatchPageRendered(false, true); + }); + div.setAttribute("data-loaded", true); + this.dispatchPageRender(); + return renderingPromise; + } +} + +;// ./web/struct_tree_layer_builder.js + +const PDF_ROLE_TO_HTML_ROLE = { + Document: null, + DocumentFragment: null, + Part: "group", + Sect: "group", + Div: "group", + Aside: "note", + NonStruct: "none", + P: null, + H: "heading", + Title: null, + FENote: "note", + Sub: "group", + Lbl: null, + Span: null, + Em: null, + Strong: null, + Link: "link", + Annot: "note", + Form: "form", + Ruby: null, + RB: null, + RT: null, + RP: null, + Warichu: null, + WT: null, + WP: null, + L: "list", + LI: "listitem", + LBody: null, + Table: "table", + TR: "row", + TH: "columnheader", + TD: "cell", + THead: "columnheader", + TBody: null, + TFoot: null, + Caption: null, + Figure: "figure", + Formula: null, + Artifact: null +}; +const HEADING_PATTERN = /^H(\d+)$/; +class StructTreeLayerBuilder { + #promise; + #treeDom = null; + #treePromise; + #elementAttributes = new Map(); + #rawDims; + #elementsToAddToTextLayer = null; + constructor(pdfPage, rawDims) { + this.#promise = pdfPage.getStructTree(); + this.#rawDims = rawDims; + } + async render() { + if (this.#treePromise) { + return this.#treePromise; + } + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + this.#treePromise = promise; + try { + this.#treeDom = this.#walk(await this.#promise); + } catch (ex) { + reject(ex); + } + this.#promise = null; + this.#treeDom?.classList.add("structTree"); + resolve(this.#treeDom); + return promise; + } + async getAriaAttributes(annotationId) { + try { + await this.render(); + return this.#elementAttributes.get(annotationId); + } catch {} + return null; + } + hide() { + if (this.#treeDom && !this.#treeDom.hidden) { + this.#treeDom.hidden = true; + } + } + show() { + if (this.#treeDom?.hidden) { + this.#treeDom.hidden = false; + } + } + #setAttributes(structElement, htmlElement) { + const { + alt, + id, + lang + } = structElement; + if (alt !== undefined) { + let added = false; + const label = removeNullCharacters(alt); + for (const child of structElement.children) { + if (child.type === "annotation") { + let attrs = this.#elementAttributes.get(child.id); + if (!attrs) { + attrs = new Map(); + this.#elementAttributes.set(child.id, attrs); + } + attrs.set("aria-label", label); + added = true; + } + } + if (!added) { + htmlElement.setAttribute("aria-label", label); + } + } + if (id !== undefined) { + htmlElement.setAttribute("aria-owns", id); + } + if (lang !== undefined) { + htmlElement.setAttribute("lang", removeNullCharacters(lang, true)); + } + } + #addImageInTextLayer(node, element) { + const { + alt, + bbox, + children + } = node; + const child = children?.[0]; + if (!this.#rawDims || !alt || !bbox || child?.type !== "content") { + return false; + } + const { + id + } = child; + if (!id) { + return false; + } + element.setAttribute("aria-owns", id); + const img = document.createElement("span"); + (this.#elementsToAddToTextLayer ||= new Map()).set(id, img); + img.setAttribute("role", "img"); + img.setAttribute("aria-label", removeNullCharacters(alt)); + const { + pageHeight, + pageX, + pageY + } = this.#rawDims; + const calc = "calc(var(--total-scale-factor) *"; + const { + style + } = img; + style.width = `${calc}${bbox[2] - bbox[0]}px)`; + style.height = `${calc}${bbox[3] - bbox[1]}px)`; + style.left = `${calc}${bbox[0] - pageX}px)`; + style.top = `${calc}${pageHeight - bbox[3] + pageY}px)`; + return true; + } + addElementsToTextLayer() { + if (!this.#elementsToAddToTextLayer) { + return; + } + for (const [id, img] of this.#elementsToAddToTextLayer) { + document.getElementById(id)?.append(img); + } + this.#elementsToAddToTextLayer.clear(); + this.#elementsToAddToTextLayer = null; + } + #walk(node) { + if (!node) { + return null; + } + const element = document.createElement("span"); + if ("role" in node) { + const { + role + } = node; + const match = role.match(HEADING_PATTERN); + if (match) { + element.setAttribute("role", "heading"); + element.setAttribute("aria-level", match[1]); + } else if (PDF_ROLE_TO_HTML_ROLE[role]) { + element.setAttribute("role", PDF_ROLE_TO_HTML_ROLE[role]); + } + if (role === "Figure" && this.#addImageInTextLayer(node, element)) { + return element; + } + } + this.#setAttributes(node, element); + if (node.children) { + if (node.children.length === 1 && "id" in node.children[0]) { + this.#setAttributes(node.children[0], element); + } else { + for (const kid of node.children) { + element.append(this.#walk(kid)); + } + } + } + return element; + } +} + +;// ./web/text_accessibility.js + +class TextAccessibilityManager { + #enabled = false; + #textChildren = null; + #textNodes = new Map(); + #waitingElements = new Map(); + setTextMapping(textDivs) { + this.#textChildren = textDivs; + } + static #compareElementPositions(e1, e2) { + const rect1 = e1.getBoundingClientRect(); + const rect2 = e2.getBoundingClientRect(); + if (rect1.width === 0 && rect1.height === 0) { + return +1; + } + if (rect2.width === 0 && rect2.height === 0) { + return -1; + } + const top1 = rect1.y; + const bot1 = rect1.y + rect1.height; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.y + rect2.height; + const mid2 = rect2.y + rect2.height / 2; + if (mid1 <= top2 && mid2 >= bot1) { + return -1; + } + if (mid2 <= top1 && mid1 >= bot2) { + return +1; + } + const centerX1 = rect1.x + rect1.width / 2; + const centerX2 = rect2.x + rect2.width / 2; + return centerX1 - centerX2; + } + enable() { + if (this.#enabled) { + throw new Error("TextAccessibilityManager is already enabled."); + } + if (!this.#textChildren) { + throw new Error("Text divs and strings have not been set."); + } + this.#enabled = true; + this.#textChildren = this.#textChildren.slice(); + this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions); + if (this.#textNodes.size > 0) { + const textChildren = this.#textChildren; + for (const [id, nodeIndex] of this.#textNodes) { + const element = document.getElementById(id); + if (!element) { + this.#textNodes.delete(id); + continue; + } + this.#addIdToAriaOwns(id, textChildren[nodeIndex]); + } + } + for (const [element, isRemovable] of this.#waitingElements) { + this.addPointerInTextLayer(element, isRemovable); + } + this.#waitingElements.clear(); + } + disable() { + if (!this.#enabled) { + return; + } + this.#waitingElements.clear(); + this.#textChildren = null; + this.#enabled = false; + } + removePointerInTextLayer(element) { + if (!this.#enabled) { + this.#waitingElements.delete(element); + return; + } + const children = this.#textChildren; + if (!children || children.length === 0) { + return; + } + const { + id + } = element; + const nodeIndex = this.#textNodes.get(id); + if (nodeIndex === undefined) { + return; + } + const node = children[nodeIndex]; + this.#textNodes.delete(id); + let owns = node.getAttribute("aria-owns"); + if (owns?.includes(id)) { + owns = owns.split(" ").filter(x => x !== id).join(" "); + if (owns) { + node.setAttribute("aria-owns", owns); + } else { + node.removeAttribute("aria-owns"); + node.setAttribute("role", "presentation"); + } + } + } + #addIdToAriaOwns(id, node) { + const owns = node.getAttribute("aria-owns"); + if (!owns?.includes(id)) { + node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id); + } + node.removeAttribute("role"); + } + addPointerInTextLayer(element, isRemovable) { + const { + id + } = element; + if (!id) { + return null; + } + if (!this.#enabled) { + this.#waitingElements.set(element, isRemovable); + return null; + } + if (isRemovable) { + this.removePointerInTextLayer(element); + } + const children = this.#textChildren; + if (!children || children.length === 0) { + return null; + } + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0); + const nodeIndex = Math.max(0, index - 1); + const child = children[nodeIndex]; + this.#addIdToAriaOwns(id, child); + this.#textNodes.set(id, nodeIndex); + const parent = child.parentNode; + return parent?.classList.contains("markedContent") ? parent.id : null; + } + moveElementInDOM(container, element, contentElement, isRemovable) { + const id = this.addPointerInTextLayer(contentElement, isRemovable); + if (!container.hasChildNodes()) { + container.append(element); + return id; + } + const children = Array.from(container.childNodes).filter(node => node !== element); + if (children.length === 0) { + return id; + } + const elementToCompare = contentElement || element; + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(elementToCompare, node) < 0); + if (index === 0) { + children[0].before(element); + } else { + children[index - 1].after(element); + } + return id; + } +} + +;// ./web/text_highlighter.js +class TextHighlighter { + #eventAbortController = null; + constructor({ + findController, + eventBus, + pageIndex + }) { + this.findController = findController; + this.matches = []; + this.eventBus = eventBus; + this.pageIdx = pageIndex; + this.textDivs = null; + this.textContentItemsStr = null; + this.enabled = false; + } + setTextMapping(divs, texts) { + this.textDivs = divs; + this.textContentItemsStr = texts; + } + enable() { + if (!this.textDivs || !this.textContentItemsStr) { + throw new Error("Text divs and strings have not been set."); + } + if (this.enabled) { + throw new Error("TextHighlighter is already enabled."); + } + this.enabled = true; + if (!this.#eventAbortController) { + this.#eventAbortController = new AbortController(); + this.eventBus._on("updatetextlayermatches", evt => { + if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) { + this._updateMatches(); + } + }, { + signal: this.#eventAbortController.signal + }); + } + this._updateMatches(); + } + disable() { + if (!this.enabled) { + return; + } + this.enabled = false; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + this._updateMatches(true); + } + _convertMatches(matches, matchesLength) { + if (!matches) { + return []; + } + const { + textContentItemsStr + } = this; + let i = 0, + iIndex = 0; + const end = textContentItemsStr.length - 1; + const result = []; + for (let m = 0, mm = matches.length; m < mm; m++) { + let matchIdx = matches[m]; + while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + if (i === textContentItemsStr.length) { + console.error("Could not find a matching mapping"); + } + const match = { + begin: { + divIdx: i, + offset: matchIdx - iIndex + } + }; + matchIdx += matchesLength[m]; + while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + match.end = { + divIdx: i, + offset: matchIdx - iIndex + }; + result.push(match); + } + return result; + } + _renderMatches(matches) { + if (matches.length === 0) { + return; + } + const { + findController, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + const isSelectedPage = pageIdx === findController.selected.pageIdx; + const selectedMatchIdx = findController.selected.matchIdx; + const highlightAll = findController.state.highlightAll; + let prevEnd = null; + const infinity = { + divIdx: -1, + offset: undefined + }; + function beginText(begin, className) { + const divIdx = begin.divIdx; + textDivs[divIdx].textContent = ""; + return appendTextToDiv(divIdx, 0, begin.offset, className); + } + function appendTextToDiv(divIdx, fromOffset, toOffset, className) { + let div = textDivs[divIdx]; + if (div.nodeType === Node.TEXT_NODE) { + const span = document.createElement("span"); + div.before(span); + span.append(div); + textDivs[divIdx] = span; + div = span; + } + const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset); + const node = document.createTextNode(content); + if (className) { + const span = document.createElement("span"); + span.className = `${className} appended`; + span.append(node); + div.append(span); + if (className.includes("selected")) { + const { + left + } = span.getClientRects()[0]; + const parentLeft = div.getBoundingClientRect().left; + return left - parentLeft; + } + return 0; + } + div.append(node); + return 0; + } + let i0 = selectedMatchIdx, + i1 = i0 + 1; + if (highlightAll) { + i0 = 0; + i1 = matches.length; + } else if (!isSelectedPage) { + return; + } + let lastDivIdx = -1; + let lastOffset = -1; + for (let i = i0; i < i1; i++) { + const match = matches[i]; + const begin = match.begin; + if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) { + continue; + } + lastDivIdx = begin.divIdx; + lastOffset = begin.offset; + const end = match.end; + const isSelected = isSelectedPage && i === selectedMatchIdx; + const highlightSuffix = isSelected ? " selected" : ""; + let selectedLeft = 0; + if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { + if (prevEnd !== null) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + beginText(begin); + } else { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); + } + if (begin.divIdx === end.divIdx) { + selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix); + } else { + selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix); + for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { + textDivs[n0].className = "highlight middle" + highlightSuffix; + } + beginText(end, "highlight end" + highlightSuffix); + } + prevEnd = end; + if (isSelected) { + findController.scrollMatchIntoView({ + element: textDivs[begin.divIdx], + selectedLeft, + pageIndex: pageIdx, + matchIndex: selectedMatchIdx + }); + } + } + if (prevEnd) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + } + _updateMatches(reset = false) { + if (!this.enabled && !reset) { + return; + } + const { + findController, + matches, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + let clearedUntilDivIdx = -1; + for (const match of matches) { + const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); + for (let n = begin, end = match.end.divIdx; n <= end; n++) { + const div = textDivs[n]; + div.textContent = textContentItemsStr[n]; + div.className = ""; + } + clearedUntilDivIdx = match.end.divIdx + 1; + } + if (!findController?.highlightMatches || reset) { + return; + } + const pageMatches = findController.pageMatches[pageIdx] || null; + const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null; + this.matches = this._convertMatches(pageMatches, pageMatchesLength); + this._renderMatches(this.matches); + } +} + +;// ./web/text_layer_builder.js + + +class TextLayerBuilder { + #enablePermissions = false; + #onAppend = null; + #renderingDone = false; + #textLayer = null; + static #textLayers = new Map(); + static #selectionChangeAbortController = null; + constructor({ + pdfPage, + highlighter = null, + accessibilityManager = null, + enablePermissions = false, + onAppend = null + }) { + this.pdfPage = pdfPage; + this.highlighter = highlighter; + this.accessibilityManager = accessibilityManager; + this.#enablePermissions = enablePermissions === true; + this.#onAppend = onAppend; + this.div = document.createElement("div"); + this.div.tabIndex = 0; + this.div.className = "textLayer"; + } + async render({ + viewport, + textContentParams = null + }) { + if (this.#renderingDone && this.#textLayer) { + this.#textLayer.update({ + viewport, + onBefore: this.hide.bind(this) + }); + this.show(); + return; + } + this.cancel(); + this.#textLayer = new TextLayer({ + textContentSource: this.pdfPage.streamTextContent(textContentParams || { + includeMarkedContent: true, + disableNormalization: true + }), + container: this.div, + viewport + }); + const { + textDivs, + textContentItemsStr + } = this.#textLayer; + this.highlighter?.setTextMapping(textDivs, textContentItemsStr); + this.accessibilityManager?.setTextMapping(textDivs); + await this.#textLayer.render(); + this.#renderingDone = true; + const endOfContent = document.createElement("div"); + endOfContent.className = "endOfContent"; + this.div.append(endOfContent); + this.#bindMouse(endOfContent); + this.#onAppend?.(this.div); + this.highlighter?.enable(); + this.accessibilityManager?.enable(); + } + hide() { + if (!this.div.hidden && this.#renderingDone) { + this.highlighter?.disable(); + this.div.hidden = true; + } + } + show() { + if (this.div.hidden && this.#renderingDone) { + this.div.hidden = false; + this.highlighter?.enable(); + } + } + cancel() { + this.#textLayer?.cancel(); + this.#textLayer = null; + this.highlighter?.disable(); + this.accessibilityManager?.disable(); + TextLayerBuilder.#removeGlobalSelectionListener(this.div); + } + #bindMouse(end) { + const { + div + } = this; + div.addEventListener("mousedown", () => { + div.classList.add("selecting"); + }); + div.addEventListener("copy", event => { + if (!this.#enablePermissions) { + const selection = document.getSelection(); + event.clipboardData.setData("text/plain", removeNullCharacters(normalizeUnicode(selection.toString()))); + } + stopEvent(event); + }); + TextLayerBuilder.#textLayers.set(div, end); + TextLayerBuilder.#enableGlobalSelectionListener(); + } + static #removeGlobalSelectionListener(textLayerDiv) { + this.#textLayers.delete(textLayerDiv); + if (this.#textLayers.size === 0) { + this.#selectionChangeAbortController?.abort(); + this.#selectionChangeAbortController = null; + } + } + static #enableGlobalSelectionListener() { + if (this.#selectionChangeAbortController) { + return; + } + this.#selectionChangeAbortController = new AbortController(); + const { + signal + } = this.#selectionChangeAbortController; + const reset = (end, textLayer) => { + textLayer.append(end); + end.style.width = ""; + end.style.height = ""; + textLayer.classList.remove("selecting"); + }; + let isPointerDown = false; + document.addEventListener("pointerdown", () => { + isPointerDown = true; + }, { + signal + }); + document.addEventListener("pointerup", () => { + isPointerDown = false; + this.#textLayers.forEach(reset); + }, { + signal + }); + window.addEventListener("blur", () => { + isPointerDown = false; + this.#textLayers.forEach(reset); + }, { + signal + }); + document.addEventListener("keyup", () => { + if (!isPointerDown) { + this.#textLayers.forEach(reset); + } + }, { + signal + }); + var isFirefox, prevRange; + document.addEventListener("selectionchange", () => { + const selection = document.getSelection(); + if (selection.rangeCount === 0) { + this.#textLayers.forEach(reset); + return; + } + const activeTextLayers = new Set(); + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + for (const textLayerDiv of this.#textLayers.keys()) { + if (!activeTextLayers.has(textLayerDiv) && range.intersectsNode(textLayerDiv)) { + activeTextLayers.add(textLayerDiv); + } + } + } + for (const [textLayerDiv, endDiv] of this.#textLayers) { + if (activeTextLayers.has(textLayerDiv)) { + textLayerDiv.classList.add("selecting"); + } else { + reset(endDiv, textLayerDiv); + } + } + isFirefox ??= getComputedStyle(this.#textLayers.values().next().value).getPropertyValue("-moz-user-select") === "none"; + if (isFirefox) { + return; + } + const range = selection.getRangeAt(0); + const modifyStart = prevRange && (range.compareBoundaryPoints(Range.END_TO_END, prevRange) === 0 || range.compareBoundaryPoints(Range.START_TO_END, prevRange) === 0); + let anchor = modifyStart ? range.startContainer : range.endContainer; + if (anchor.nodeType === Node.TEXT_NODE) { + anchor = anchor.parentNode; + } + if (!modifyStart && range.endOffset === 0) { + do { + while (!anchor.previousSibling) { + anchor = anchor.parentNode; + } + anchor = anchor.previousSibling; + } while (!anchor.childNodes.length); + } + const parentTextLayer = anchor.parentElement?.closest(".textLayer"); + const endDiv = this.#textLayers.get(parentTextLayer); + if (endDiv) { + endDiv.style.width = parentTextLayer.style.width; + endDiv.style.height = parentTextLayer.style.height; + anchor.parentElement.insertBefore(endDiv, modifyStart ? anchor : anchor.nextSibling); + } + prevRange = range.cloneRange(); + }, { + signal + }); + } +} + +;// ./web/pdf_page_view.js + + + + + + + + + + + + + + + + +const DEFAULT_LAYER_PROPERTIES = null; +const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]); +class PDFPageView extends BasePDFPageView { + #annotationMode = AnnotationMode.ENABLE_FORMS; + #canvasWrapper = null; + #enableAutoLinking = true; + #hasRestrictedScaling = false; + #isEditing = false; + #layerProperties = null; + #needsRestrictedScaling = false; + #originalViewport = null; + #previousRotation = null; + #scaleRoundX = 1; + #scaleRoundY = 1; + #textLayerMode = TextLayerMode.ENABLE; + #userUnit = 1; + #useThumbnailCanvas = { + directDrawing: true, + initialOptionalContent: true, + regularAnnotations: true + }; + #layers = [null, null, null, null]; + constructor(options) { + super(options); + const container = options.container; + const defaultViewport = options.defaultViewport; + this.renderingId = "page" + this.id; + this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES; + this.pdfPage = null; + this.pageLabel = null; + this.rotation = 0; + this.scale = options.scale || DEFAULT_SCALE; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = options.optionalContentConfigPromise || null; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.enableDetailCanvas = options.enableDetailCanvas ?? true; + this.maxCanvasPixels = options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); + this.maxCanvasDim = options.maxCanvasDim || AppOptions.get("maxCanvasDim"); + this.#enableAutoLinking = options.enableAutoLinking !== false; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this._isStandalone = !this.renderingQueue?.hasViewer(); + this._container = container; + this._annotationCanvasMap = null; + this.annotationLayer = null; + this.annotationEditorLayer = null; + this.textLayer = null; + this.xfaLayer = null; + this.structTreeLayer = null; + this.drawLayer = null; + this.detailView = null; + const div = document.createElement("div"); + div.className = "page"; + div.setAttribute("data-page-number", this.id); + div.setAttribute("role", "region"); + div.setAttribute("data-l10n-id", "pdfjs-page-landmark"); + div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.id + })); + this.div = div; + this.#setDimensions(); + container?.append(div); + if (this._isStandalone) { + container?.style.setProperty("--scale-factor", this.scale * PixelsPerInch.PDF_TO_CSS_UNITS); + if (this.pageColors?.background) { + container?.style.setProperty("--page-bg-color", this.pageColors.background); + } + const { + optionalContentConfigPromise + } = options; + if (optionalContentConfigPromise) { + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + if (!options.l10n) { + this.l10n.translate(this.div); + } + } + } + #addLayer(div, name) { + const pos = LAYERS_ORDER.get(name); + const oldDiv = this.#layers[pos]; + this.#layers[pos] = div; + if (oldDiv) { + oldDiv.replaceWith(div); + return; + } + for (let i = pos - 1; i >= 0; i--) { + const layer = this.#layers[i]; + if (layer) { + layer.after(div); + return; + } + } + this.div.prepend(div); + } + #setDimensions() { + const { + div, + viewport + } = this; + if (viewport.userUnit !== this.#userUnit) { + if (viewport.userUnit !== 1) { + div.style.setProperty("--user-unit", viewport.userUnit); + } else { + div.style.removeProperty("--user-unit"); + } + this.#userUnit = viewport.userUnit; + } + if (this.pdfPage) { + if (this.#previousRotation === viewport.rotation) { + return; + } + this.#previousRotation = viewport.rotation; + } + setLayerDimensions(div, viewport, true, false); + } + setPdfPage(pdfPage) { + if (this._isStandalone && (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas")) { + this._container?.style.setProperty("--hcm-highlight-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + this._container?.style.setProperty("--hcm-highlight-selected-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "Highlight")); + } + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + this.reset(); + } + destroy() { + this.reset(); + this.pdfPage?.cleanup(); + } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } + get _textHighlighter() { + return shadow(this, "_textHighlighter", new TextHighlighter({ + pageIndex: this.id - 1, + eventBus: this.eventBus, + findController: this.#layerProperties.findController + })); + } + #dispatchLayerRendered(name, error) { + this.eventBus.dispatch(name, { + source: this, + pageNumber: this.id, + error + }); + } + async #renderAnnotationLayer() { + let error = null; + try { + await this.annotationLayer.render({ + viewport: this.viewport, + intent: "display", + structTreeLayer: this.structTreeLayer + }); + } catch (ex) { + console.error("#renderAnnotationLayer:", ex); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationlayerrendered", error); + } + } + async #renderAnnotationEditorLayer() { + let error = null; + try { + await this.annotationEditorLayer.render({ + viewport: this.viewport, + intent: "display" + }); + } catch (ex) { + console.error("#renderAnnotationEditorLayer:", ex); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationeditorlayerrendered", error); + } + } + async #renderDrawLayer() { + try { + await this.drawLayer.render({ + intent: "display" + }); + } catch (ex) { + console.error("#renderDrawLayer:", ex); + } + } + async #renderXfaLayer() { + let error = null; + try { + const result = await this.xfaLayer.render({ + viewport: this.viewport, + intent: "display" + }); + if (result?.textDivs && this._textHighlighter) { + this.#buildXfaTextContentItems(result.textDivs); + } + } catch (ex) { + console.error("#renderXfaLayer:", ex); + error = ex; + } finally { + if (this.xfaLayer?.div) { + this.l10n.pause(); + this.#addLayer(this.xfaLayer.div, "xfaLayer"); + this.l10n.resume(); + } + this.#dispatchLayerRendered("xfalayerrendered", error); + } + } + async #renderTextLayer() { + if (!this.textLayer) { + return; + } + let error = null; + try { + await this.textLayer.render({ + viewport: this.viewport + }); + } catch (ex) { + if (ex instanceof AbortException) { + return; + } + console.error("#renderTextLayer:", ex); + error = ex; + } + this.#dispatchLayerRendered("textlayerrendered", error); + this.#renderStructTreeLayer(); + } + async #renderStructTreeLayer() { + if (!this.textLayer) { + return; + } + const treeDom = await this.structTreeLayer?.render(); + if (treeDom) { + this.l10n.pause(); + this.structTreeLayer?.addElementsToTextLayer(); + if (this.canvas && treeDom.parentNode !== this.canvas) { + this.canvas.append(treeDom); + } + this.l10n.resume(); + } + this.structTreeLayer?.show(); + } + async #buildXfaTextContentItems(textDivs) { + const text = await this.pdfPage.getTextContent(); + const items = []; + for (const item of text.items) { + items.push(item.str); + } + this._textHighlighter.setTextMapping(textDivs, items); + this._textHighlighter.enable(); + } + async #injectLinkAnnotations(textLayerPromise) { + let error = null; + try { + await textLayerPromise; + if (!this.annotationLayer) { + return; + } + await this.annotationLayer.injectLinkAnnotations({ + inferredLinks: Autolinker.processLinks(this), + viewport: this.viewport, + structTreeLayer: this.structTreeLayer + }); + } catch (ex) { + console.error("#injectLinkAnnotations:", ex); + error = ex; + } + } + _resetCanvas() { + super._resetCanvas(); + this.#originalViewport = null; + } + reset({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + keepCanvasWrapper = false, + preserveDetailViewState = false + } = {}) { + this.cancelRendering({ + keepAnnotationLayer, + keepAnnotationEditorLayer, + keepXfaLayer, + keepTextLayer + }); + this.renderingState = RenderingStates.INITIAL; + const div = this.div; + const childNodes = div.childNodes, + annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null, + annotationEditorLayerNode = keepAnnotationEditorLayer && this.annotationEditorLayer?.div || null, + xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null, + textLayerNode = keepTextLayer && this.textLayer?.div || null, + canvasWrapperNode = keepCanvasWrapper && this.#canvasWrapper || null; + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + switch (node) { + case annotationLayerNode: + case annotationEditorLayerNode: + case xfaLayerNode: + case textLayerNode: + case canvasWrapperNode: + continue; + } + node.remove(); + const layerIndex = this.#layers.indexOf(node); + if (layerIndex >= 0) { + this.#layers[layerIndex] = null; + } + } + div.removeAttribute("data-loaded"); + if (annotationLayerNode) { + this.annotationLayer.hide(); + } + if (annotationEditorLayerNode) { + this.annotationEditorLayer.hide(); + } + if (xfaLayerNode) { + this.xfaLayer.hide(); + } + if (textLayerNode) { + this.textLayer.hide(); + } + this.structTreeLayer?.hide(); + if (!keepCanvasWrapper && this.#canvasWrapper) { + this.#canvasWrapper = null; + this._resetCanvas(); + } + if (!preserveDetailViewState) { + this.detailView?.reset({ + keepCanvas: keepCanvasWrapper + }); + if (!keepCanvasWrapper) { + this.detailView = null; + } + } + } + toggleEditingMode(isEditing) { + this.#isEditing = isEditing; + if (!this.hasEditableAnnotations()) { + return; + } + this.reset({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + keepCanvasWrapper: true + }); + } + updateVisibleArea(visibleArea) { + if (this.enableDetailCanvas) { + if (this.#needsRestrictedScaling && this.maxCanvasPixels > 0 && visibleArea) { + this.detailView ??= new PDFPageDetailView({ + pageView: this + }); + this.detailView.update({ + visibleArea + }); + } else if (this.detailView) { + this.detailView.reset(); + this.detailView = null; + } + } + } + update({ + scale = 0, + rotation = null, + optionalContentConfigPromise = null, + drawingDelay = -1 + }) { + this.scale = scale || this.scale; + if (typeof rotation === "number") { + this.rotation = rotation; + } + if (optionalContentConfigPromise instanceof Promise) { + this._optionalContentConfigPromise = optionalContentConfigPromise; + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + this.#useThumbnailCanvas.directDrawing = true; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + if (this._isStandalone) { + this._container?.style.setProperty("--scale-factor", this.viewport.scale); + } + this.#computeScale(); + if (this.canvas) { + const onlyCssZoom = this.#hasRestrictedScaling && this.#needsRestrictedScaling; + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + if (postponeDrawing || onlyCssZoom) { + if (postponeDrawing && !onlyCssZoom && this.renderingState !== RenderingStates.FINISHED) { + this.cancelRendering({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + cancelExtraDelay: drawingDelay + }); + this.renderingState = RenderingStates.FINISHED; + this.#useThumbnailCanvas.directDrawing = false; + } + this.cssTransform({ + redrawAnnotationLayer: true, + redrawAnnotationEditorLayer: true, + redrawXfaLayer: true, + redrawTextLayer: !postponeDrawing, + hideTextLayer: postponeDrawing + }); + if (!postponeDrawing) { + this.detailView?.update({ + underlyingViewUpdated: true + }); + this.dispatchPageRendered(true, false); + } + return; + } + } + this.cssTransform({}); + this.reset({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + keepCanvasWrapper: true, + preserveDetailViewState: true + }); + this.detailView?.update({ + underlyingViewUpdated: true + }); + } + #computeScale() { + const { + width, + height + } = this.viewport; + const outputScale = this.outputScale = new OutputScale(); + if (this.maxCanvasPixels === 0) { + const invScale = 1 / this.scale; + outputScale.sx *= invScale; + outputScale.sy *= invScale; + this.#needsRestrictedScaling = true; + } else { + this.#needsRestrictedScaling = outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim); + } + } + cancelRendering({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + cancelExtraDelay = 0 + } = {}) { + super.cancelRendering({ + cancelExtraDelay + }); + if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) { + this.textLayer.cancel(); + this.textLayer = null; + } + if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) { + this.annotationLayer.cancel(); + this.annotationLayer = null; + this._annotationCanvasMap = null; + } + if (this.structTreeLayer && !this.textLayer) { + this.structTreeLayer = null; + } + if (this.annotationEditorLayer && (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div)) { + if (this.drawLayer) { + this.drawLayer.cancel(); + this.drawLayer = null; + } + this.annotationEditorLayer.cancel(); + this.annotationEditorLayer = null; + } + if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) { + this.xfaLayer.cancel(); + this.xfaLayer = null; + this._textHighlighter?.disable(); + } + } + cssTransform({ + redrawAnnotationLayer = false, + redrawAnnotationEditorLayer = false, + redrawXfaLayer = false, + redrawTextLayer = false, + hideTextLayer = false + }) { + const { + canvas + } = this; + if (!canvas) { + return; + } + const originalViewport = this.#originalViewport; + if (this.viewport !== originalViewport) { + const relativeRotation = (360 + this.viewport.rotation - originalViewport.rotation) % 360; + if (relativeRotation === 90 || relativeRotation === 270) { + const { + width, + height + } = this.viewport; + const scaleX = height / width; + const scaleY = width / height; + canvas.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX},${scaleY})`; + } else { + canvas.style.transform = relativeRotation === 0 ? "" : `rotate(${relativeRotation}deg)`; + } + } + if (redrawAnnotationLayer && this.annotationLayer) { + this.#renderAnnotationLayer(); + } + if (redrawAnnotationEditorLayer && this.annotationEditorLayer) { + if (this.drawLayer) { + this.#renderDrawLayer(); + } + this.#renderAnnotationEditorLayer(); + } + if (redrawXfaLayer && this.xfaLayer) { + this.#renderXfaLayer(); + } + if (this.textLayer) { + if (hideTextLayer) { + this.textLayer.hide(); + this.structTreeLayer?.hide(); + } else if (redrawTextLayer) { + this.#renderTextLayer(); + } + } + } + get width() { + return this.viewport.width; + } + get height() { + return this.viewport.height; + } + getPagePoint(x, y) { + return this.viewport.convertToPdfPoint(x, y); + } + _ensureCanvasWrapper() { + let canvasWrapper = this.#canvasWrapper; + if (!canvasWrapper) { + canvasWrapper = this.#canvasWrapper = document.createElement("div"); + canvasWrapper.classList.add("canvasWrapper"); + this.#addLayer(canvasWrapper, "canvasWrapper"); + } + return canvasWrapper; + } + _getRenderingContext(canvasContext, transform) { + return { + canvasContext, + transform, + viewport: this.viewport, + annotationMode: this.#annotationMode, + optionalContentConfigPromise: this._optionalContentConfigPromise, + annotationCanvasMap: this._annotationCanvasMap, + pageColors: this.pageColors, + isEditing: this.#isEditing + }; + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); + } + const { + div, + l10n, + pdfPage, + viewport + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const canvasWrapper = this._ensureCanvasWrapper(); + if (!this.textLayer && this.#textLayerMode !== TextLayerMode.DISABLE && !pdfPage.isPureXfa) { + this._accessibilityManager ||= new TextAccessibilityManager(); + this.textLayer = new TextLayerBuilder({ + pdfPage, + highlighter: this._textHighlighter, + accessibilityManager: this._accessibilityManager, + enablePermissions: this.#textLayerMode === TextLayerMode.ENABLE_PERMISSIONS, + onAppend: textLayerDiv => { + this.l10n.pause(); + this.#addLayer(textLayerDiv, "textLayer"); + this.l10n.resume(); + } + }); + } + if (!this.annotationLayer && this.#annotationMode !== AnnotationMode.DISABLE) { + const { + annotationStorage, + annotationEditorUIManager, + downloadManager, + enableScripting, + fieldObjectsPromise, + hasJSActionsPromise, + linkService + } = this.#layerProperties; + this._annotationCanvasMap ||= new Map(); + this.annotationLayer = new AnnotationLayerBuilder({ + pdfPage, + annotationStorage, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.#annotationMode === AnnotationMode.ENABLE_FORMS, + linkService, + downloadManager, + enableScripting, + hasJSActionsPromise, + fieldObjectsPromise, + annotationCanvasMap: this._annotationCanvasMap, + accessibilityManager: this._accessibilityManager, + annotationEditorUIManager, + onAppend: annotationLayerDiv => { + this.#addLayer(annotationLayerDiv, "annotationLayer"); + } + }); + } + const { + width, + height + } = viewport; + this.#originalViewport = viewport; + const { + canvas, + prevCanvas, + ctx + } = this._createCanvas(newCanvas => { + canvasWrapper.prepend(newCanvas); + }); + canvas.setAttribute("role", "presentation"); + if (!this.outputScale) { + this.#computeScale(); + } + const { + outputScale + } = this; + this.#hasRestrictedScaling = this.#needsRestrictedScaling; + const sfx = approximateFraction(outputScale.sx); + const sfy = approximateFraction(outputScale.sy); + const canvasWidth = canvas.width = floorToDivide(calcRound(width * outputScale.sx), sfx[0]); + const canvasHeight = canvas.height = floorToDivide(calcRound(height * outputScale.sy), sfy[0]); + const pageWidth = floorToDivide(calcRound(width), sfx[1]); + const pageHeight = floorToDivide(calcRound(height), sfy[1]); + outputScale.sx = canvasWidth / pageWidth; + outputScale.sy = canvasHeight / pageHeight; + if (this.#scaleRoundX !== sfx[1]) { + div.style.setProperty("--scale-round-x", `${sfx[1]}px`); + this.#scaleRoundX = sfx[1]; + } + if (this.#scaleRoundY !== sfy[1]) { + div.style.setProperty("--scale-round-y", `${sfy[1]}px`); + this.#scaleRoundY = sfy[1]; + } + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + const resultPromise = this._drawCanvas(this._getRenderingContext(ctx, transform), () => { + prevCanvas?.remove(); + this._resetCanvas(); + }, renderTask => { + this.#useThumbnailCanvas.regularAnnotations = !renderTask.separateAnnots; + this.dispatchPageRendered(false, false); + }).then(async () => { + this.structTreeLayer ||= new StructTreeLayerBuilder(pdfPage, viewport.rawDims); + const textLayerPromise = this.#renderTextLayer(); + if (this.annotationLayer) { + await this.#renderAnnotationLayer(); + if (this.#enableAutoLinking && this.annotationLayer && this.textLayer) { + await this.#injectLinkAnnotations(textLayerPromise); + } + } + const { + annotationEditorUIManager + } = this.#layerProperties; + if (!annotationEditorUIManager) { + return; + } + this.drawLayer ||= new DrawLayerBuilder({ + pageIndex: this.id + }); + await this.#renderDrawLayer(); + this.drawLayer.setParent(canvasWrapper); + this.annotationEditorLayer ||= new AnnotationEditorLayerBuilder({ + uiManager: annotationEditorUIManager, + pdfPage, + l10n, + structTreeLayer: this.structTreeLayer, + accessibilityManager: this._accessibilityManager, + annotationLayer: this.annotationLayer?.annotationLayer, + textLayer: this.textLayer, + drawLayer: this.drawLayer.getDrawLayer(), + onAppend: annotationEditorLayerDiv => { + this.#addLayer(annotationEditorLayerDiv, "annotationEditorLayer"); + } + }); + this.#renderAnnotationEditorLayer(); + }); + if (pdfPage.isPureXfa) { + if (!this.xfaLayer) { + const { + annotationStorage, + linkService + } = this.#layerProperties; + this.xfaLayer = new XfaLayerBuilder({ + pdfPage, + annotationStorage, + linkService + }); + } + this.#renderXfaLayer(); + } + div.setAttribute("data-loaded", true); + this.dispatchPageRender(); + return resultPromise; + } + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.pageLabel ?? this.id + })); + if (this.pageLabel !== null) { + this.div.setAttribute("data-page-label", this.pageLabel); + } else { + this.div.removeAttribute("data-page-label"); + } + } + get thumbnailCanvas() { + const { + directDrawing, + initialOptionalContent, + regularAnnotations + } = this.#useThumbnailCanvas; + return directDrawing && initialOptionalContent && regularAnnotations ? this.canvas : null; + } +} + +;// ./web/pdf_viewer.js + + + + + + +const DEFAULT_CACHE_SIZE = 10; +const PagesCountLimit = { + FORCE_SCROLL_MODE_PAGE: 10000, + FORCE_LAZY_PAGE_INIT: 5000, + PAUSE_EAGER_PAGE_INIT: 250 +}; +function isValidAnnotationEditorMode(mode) { + return Object.values(AnnotationEditorType).includes(mode) && mode !== AnnotationEditorType.DISABLE; +} +class PDFPageViewBuffer { + #buf = new Set(); + #size = 0; + constructor(size) { + this.#size = size; + } + push(view) { + const buf = this.#buf; + if (buf.has(view)) { + buf.delete(view); + } + buf.add(view); + if (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + resize(newSize, idsToKeep = null) { + this.#size = newSize; + const buf = this.#buf; + if (idsToKeep) { + const ii = buf.size; + let i = 1; + for (const view of buf) { + if (idsToKeep.has(view.id)) { + buf.delete(view); + buf.add(view); + } + if (++i > ii) { + break; + } + } + } + while (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + has(view) { + return this.#buf.has(view); + } + [Symbol.iterator]() { + return this.#buf.keys(); + } + #destroyFirstView() { + const firstView = this.#buf.keys().next().value; + firstView?.destroy(); + this.#buf.delete(firstView); + } +} +class PDFViewer { + #buffer = null; + #altTextManager = null; + #annotationEditorHighlightColors = null; + #annotationEditorMode = AnnotationEditorType.NONE; + #annotationEditorUIManager = null; + #annotationMode = AnnotationMode.ENABLE_FORMS; + #containerTopLeft = null; + #editorUndoBar = null; + #enableHWA = false; + #enableHighlightFloatingButton = false; + #enablePermissions = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #enableAutoLinking = true; + #eventAbortController = null; + #mlManager = null; + #scrollTimeoutId = null; + #switchAnnotationEditorModeAC = null; + #switchAnnotationEditorModeTimeoutId = null; + #getAllTextInProgress = false; + #hiddenCopyElement = null; + #interruptCopyCondition = false; + #previousContainerHeight = 0; + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + #scrollModePageState = null; + #scaleTimeoutId = null; + #signatureManager = null; + #supportsPinchToZoom = true; + #textLayerMode = TextLayerMode.ENABLE; + constructor(options) { + const viewerVersion = "5.2.133"; + if (version !== viewerVersion) { + throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`); + } + this.container = options.container; + this.viewer = options.viewer || options.container.firstElementChild; + if (this.container?.tagName !== "DIV" || this.viewer?.tagName !== "DIV") { + throw new Error("Invalid `container` and/or `viewer` option."); + } + if (this.container.offsetParent && getComputedStyle(this.container).position !== "absolute") { + throw new Error("The `container` must be absolutely positioned."); + } + this.#resizeObserver.observe(this.container); + this.eventBus = options.eventBus; + this.linkService = options.linkService || new SimpleLinkService(); + this.downloadManager = options.downloadManager || null; + this.findController = options.findController || null; + this.#altTextManager = options.altTextManager || null; + this.#signatureManager = options.signatureManager || null; + this.#editorUndoBar = options.editorUndoBar || null; + if (this.findController) { + this.findController.onIsPageVisible = pageNumber => this._getVisiblePages().ids.has(pageNumber); + } + this._scriptingManager = options.scriptingManager || null; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.#annotationEditorMode = options.annotationEditorMode ?? AnnotationEditorType.NONE; + this.#annotationEditorHighlightColors = options.annotationEditorHighlightColors || null; + this.#enableHighlightFloatingButton = options.enableHighlightFloatingButton === true; + this.#enableUpdatedAddImage = options.enableUpdatedAddImage === true; + this.#enableNewAltTextWhenAddingImage = options.enableNewAltTextWhenAddingImage === true; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.enablePrintAutoRotate = options.enablePrintAutoRotate || false; + this.removePageBorders = options.removePageBorders || false; + this.maxCanvasPixels = options.maxCanvasPixels; + this.maxCanvasDim = options.maxCanvasDim; + this.enableDetailCanvas = options.enableDetailCanvas ?? true; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.#enablePermissions = options.enablePermissions || false; + this.pageColors = options.pageColors || null; + this.#mlManager = options.mlManager || null; + this.#enableHWA = options.enableHWA || false; + this.#supportsPinchToZoom = options.supportsPinchToZoom !== false; + this.#enableAutoLinking = options.enableAutoLinking !== false; + this.defaultRenderingQueue = !options.renderingQueue; + if (this.defaultRenderingQueue) { + this.renderingQueue = new PDFRenderingQueue(); + this.renderingQueue.setViewer(this); + } else { + this.renderingQueue = options.renderingQueue; + } + const { + abortSignal + } = options; + abortSignal?.addEventListener("abort", () => { + this.#resizeObserver.disconnect(); + this.#resizeObserver = null; + }, { + once: true + }); + this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this), abortSignal); + this.presentationModeState = PresentationModeState.UNKNOWN; + this._resetView(); + if (this.removePageBorders) { + this.viewer.classList.add("removePageBorders"); + } + this.#updateContainerHeightCss(); + this.eventBus._on("thumbnailrendered", ({ + pageNumber, + pdfPage + }) => { + const pageView = this._pages[pageNumber - 1]; + if (!this.#buffer.has(pageView)) { + pdfPage?.cleanup(); + } + }); + if (!options.l10n) { + this.l10n.translate(this.container); + } + } + get pagesCount() { + return this._pages.length; + } + getPageView(index) { + return this._pages[index]; + } + getCachedPageViews() { + return new Set(this.#buffer); + } + get pageViewsReady() { + return this._pages.every(pageView => pageView?.pdfPage); + } + get renderForms() { + return this.#annotationMode === AnnotationMode.ENABLE_FORMS; + } + get enableScripting() { + return !!this._scriptingManager; + } + get currentPageNumber() { + return this._currentPageNumber; + } + set currentPageNumber(val) { + if (!Number.isInteger(val)) { + throw new Error("Invalid page number."); + } + if (!this.pdfDocument) { + return; + } + if (!this._setCurrentPageNumber(val, true)) { + console.error(`currentPageNumber: "${val}" is not a valid page.`); + } + } + _setCurrentPageNumber(val, resetCurrentPageView = false) { + if (this._currentPageNumber === val) { + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + if (!(0 < val && val <= this.pagesCount)) { + return false; + } + const previous = this._currentPageNumber; + this._currentPageNumber = val; + this.eventBus.dispatch("pagechanging", { + source: this, + pageNumber: val, + pageLabel: this._pageLabels?.[val - 1] ?? null, + previous + }); + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + get currentPageLabel() { + return this._pageLabels?.[this._currentPageNumber - 1] ?? null; + } + set currentPageLabel(val) { + if (!this.pdfDocument) { + return; + } + let page = val | 0; + if (this._pageLabels) { + const i = this._pageLabels.indexOf(val); + if (i >= 0) { + page = i + 1; + } + } + if (!this._setCurrentPageNumber(page, true)) { + console.error(`currentPageLabel: "${val}" is not a valid page.`); + } + } + get currentScale() { + return this._currentScale !== UNKNOWN_SCALE ? this._currentScale : DEFAULT_SCALE; + } + set currentScale(val) { + if (isNaN(val)) { + throw new Error("Invalid numeric scale."); + } + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + get currentScaleValue() { + return this._currentScaleValue; + } + set currentScaleValue(val) { + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + get pagesRotation() { + return this._pagesRotation; + } + set pagesRotation(rotation) { + if (!isValidRotation(rotation)) { + throw new Error("Invalid pages rotation angle."); + } + if (!this.pdfDocument) { + return; + } + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const pageNumber = this._currentPageNumber; + this.refresh(true, { + rotation + }); + if (this._currentScaleValue) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.eventBus.dispatch("rotationchanging", { + source: this, + pagesRotation: rotation, + pageNumber + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + get firstPagePromise() { + return this.pdfDocument ? this._firstPageCapability.promise : null; + } + get onePageRendered() { + return this.pdfDocument ? this._onePageRenderedCapability.promise : null; + } + get pagesPromise() { + return this.pdfDocument ? this._pagesCapability.promise : null; + } + get _layerProperties() { + const self = this; + return shadow(this, "_layerProperties", { + get annotationEditorUIManager() { + return self.#annotationEditorUIManager; + }, + get annotationStorage() { + return self.pdfDocument?.annotationStorage; + }, + get downloadManager() { + return self.downloadManager; + }, + get enableScripting() { + return !!self._scriptingManager; + }, + get fieldObjectsPromise() { + return self.pdfDocument?.getFieldObjects(); + }, + get findController() { + return self.findController; + }, + get hasJSActionsPromise() { + return self.pdfDocument?.hasJSActions(); + }, + get linkService() { + return self.linkService; + } + }); + } + #initializePermissions(permissions) { + const params = { + annotationEditorMode: this.#annotationEditorMode, + annotationMode: this.#annotationMode, + textLayerMode: this.#textLayerMode + }; + if (!permissions) { + return params; + } + if (!permissions.includes(PermissionFlag.COPY) && this.#textLayerMode === TextLayerMode.ENABLE) { + params.textLayerMode = TextLayerMode.ENABLE_PERMISSIONS; + } + if (!permissions.includes(PermissionFlag.MODIFY_CONTENTS)) { + params.annotationEditorMode = AnnotationEditorType.DISABLE; + } + if (!permissions.includes(PermissionFlag.MODIFY_ANNOTATIONS) && !permissions.includes(PermissionFlag.FILL_INTERACTIVE_FORMS) && this.#annotationMode === AnnotationMode.ENABLE_FORMS) { + params.annotationMode = AnnotationMode.ENABLE; + } + return params; + } + async #onePageRenderedOrForceFetch(signal) { + if (document.visibilityState === "hidden" || !this.container.offsetParent || this._getVisiblePages().views.length === 0) { + return; + } + const hiddenCapability = Promise.withResolvers(), + ac = new AbortController(); + document.addEventListener("visibilitychange", () => { + if (document.visibilityState === "hidden") { + hiddenCapability.resolve(); + } + }, { + signal: AbortSignal.any([signal, ac.signal]) + }); + await Promise.race([this._onePageRenderedCapability.promise, hiddenCapability.promise]); + ac.abort(); + } + async getAllText() { + const texts = []; + const buffer = []; + for (let pageNum = 1, pagesCount = this.pdfDocument.numPages; pageNum <= pagesCount; ++pageNum) { + if (this.#interruptCopyCondition) { + return null; + } + buffer.length = 0; + const page = await this.pdfDocument.getPage(pageNum); + const { + items + } = await page.getTextContent(); + for (const item of items) { + if (item.str) { + buffer.push(item.str); + } + if (item.hasEOL) { + buffer.push("\n"); + } + } + texts.push(removeNullCharacters(buffer.join(""))); + } + return texts.join("\n"); + } + #copyCallback(textLayerMode, event) { + const selection = document.getSelection(); + const { + focusNode, + anchorNode + } = selection; + if (anchorNode && focusNode && selection.containsNode(this.#hiddenCopyElement)) { + if (this.#getAllTextInProgress || textLayerMode === TextLayerMode.ENABLE_PERMISSIONS) { + stopEvent(event); + return; + } + this.#getAllTextInProgress = true; + const { + classList + } = this.viewer; + classList.add("copyAll"); + const ac = new AbortController(); + window.addEventListener("keydown", ev => this.#interruptCopyCondition = ev.key === "Escape", { + signal: ac.signal + }); + this.getAllText().then(async text => { + if (text !== null) { + await navigator.clipboard.writeText(text); + } + }).catch(reason => { + console.warn(`Something goes wrong when extracting the text: ${reason.message}`); + }).finally(() => { + this.#getAllTextInProgress = false; + this.#interruptCopyCondition = false; + ac.abort(); + classList.remove("copyAll"); + }); + stopEvent(event); + } + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.eventBus.dispatch("pagesdestroy", { + source: this + }); + this._cancelRendering(); + this._resetView(); + this.findController?.setDocument(null); + this._scriptingManager?.setDocument(null); + this.#annotationEditorUIManager?.destroy(); + this.#annotationEditorUIManager = null; + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const pagesCount = pdfDocument.numPages; + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + const permissionsPromise = this.#enablePermissions ? pdfDocument.getPermissions() : Promise.resolve(); + const { + eventBus, + pageColors, + viewer + } = this; + this.#eventAbortController = new AbortController(); + const { + signal + } = this.#eventAbortController; + if (pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + console.warn("Forcing PAGE-scrolling for performance reasons, given the length of the document."); + const mode = this._scrollMode = ScrollMode.PAGE; + eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + } + this._pagesCapability.promise.then(() => { + eventBus.dispatch("pagesloaded", { + source: this, + pagesCount + }); + }, () => {}); + const onBeforeDraw = evt => { + const pageView = this._pages[evt.pageNumber - 1]; + if (!pageView) { + return; + } + this.#buffer.push(pageView); + }; + eventBus._on("pagerender", onBeforeDraw, { + signal + }); + const onAfterDraw = evt => { + if (evt.cssTransform || evt.isDetailView) { + return; + } + this._onePageRenderedCapability.resolve({ + timestamp: evt.timestamp + }); + eventBus._off("pagerendered", onAfterDraw); + }; + eventBus._on("pagerendered", onAfterDraw, { + signal + }); + Promise.all([firstPagePromise, permissionsPromise]).then(([firstPdfPage, permissions]) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this._firstPageCapability.resolve(firstPdfPage); + this._optionalContentConfigPromise = optionalContentConfigPromise; + const { + annotationEditorMode, + annotationMode, + textLayerMode + } = this.#initializePermissions(permissions); + if (textLayerMode !== TextLayerMode.DISABLE) { + const element = this.#hiddenCopyElement = document.createElement("div"); + element.id = "hiddenCopyElement"; + viewer.before(element); + } + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { + const mode = annotationEditorMode; + if (pdfDocument.isPureXfa) { + console.warn("Warning: XFA-editing is not implemented."); + } else if (isValidAnnotationEditorMode(mode)) { + this.#annotationEditorUIManager = new AnnotationEditorUIManager(this.container, viewer, this.#altTextManager, this.#signatureManager, eventBus, pdfDocument, pageColors, this.#annotationEditorHighlightColors, this.#enableHighlightFloatingButton, this.#enableUpdatedAddImage, this.#enableNewAltTextWhenAddingImage, this.#mlManager, this.#editorUndoBar, this.#supportsPinchToZoom); + eventBus.dispatch("annotationeditoruimanager", { + source: this, + uiManager: this.#annotationEditorUIManager + }); + if (mode !== AnnotationEditorType.NONE) { + this.#preloadEditingData(mode); + this.#annotationEditorUIManager.updateMode(mode); + } + } else { + console.error(`Invalid AnnotationEditor mode: ${mode}`); + } + } + const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : viewer; + const scale = this.currentScale; + const viewport = firstPdfPage.getViewport({ + scale: scale * PixelsPerInch.PDF_TO_CSS_UNITS + }); + viewer.style.setProperty("--scale-factor", viewport.scale); + if (pageColors?.background) { + viewer.style.setProperty("--page-bg-color", pageColors.background); + } + if (pageColors?.foreground === "CanvasText" || pageColors?.background === "Canvas") { + viewer.style.setProperty("--hcm-highlight-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + viewer.style.setProperty("--hcm-highlight-selected-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "ButtonText")); + } + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const pageView = new PDFPageView({ + container: viewerElement, + eventBus, + id: pageNum, + scale, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + renderingQueue: this.renderingQueue, + textLayerMode, + annotationMode, + imageResourcesPath: this.imageResourcesPath, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + enableDetailCanvas: this.enableDetailCanvas, + pageColors, + l10n: this.l10n, + layerProperties: this._layerProperties, + enableHWA: this.#enableHWA, + enableAutoLinking: this.#enableAutoLinking + }); + this._pages.push(pageView); + } + this._pages[0]?.setPdfPage(firstPdfPage); + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._spreadMode !== SpreadMode.NONE) { + this._updateSpreadMode(); + } + this.#onePageRenderedOrForceFetch(signal).then(async () => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.findController?.setDocument(pdfDocument); + this._scriptingManager?.setDocument(pdfDocument); + if (this.#hiddenCopyElement) { + document.addEventListener("copy", this.#copyCallback.bind(this, textLayerMode), { + signal + }); + } + if (this.#annotationEditorUIManager) { + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode: this.#annotationEditorMode + }); + } + if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > PagesCountLimit.FORCE_LAZY_PAGE_INIT) { + this._pagesCapability.resolve(); + return; + } + let getPagesLeft = pagesCount - 1; + if (getPagesLeft <= 0) { + this._pagesCapability.resolve(); + return; + } + for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) { + const promise = pdfDocument.getPage(pageNum).then(pdfPage => { + const pageView = this._pages[pageNum - 1]; + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }, reason => { + console.error(`Unable to get page ${pageNum} to initialize viewer`, reason); + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }); + if (pageNum % PagesCountLimit.PAUSE_EAGER_PAGE_INIT === 0) { + await promise; + } + } + }); + eventBus.dispatch("pagesinit", { + source: this + }); + pdfDocument.getMetadata().then(({ + info + }) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + if (info.Language) { + viewer.lang = info.Language; + } + }); + if (this.defaultRenderingQueue) { + this.update(); + } + }).catch(reason => { + console.error("Unable to initialize viewer", reason); + this._pagesCapability.reject(reason); + }); + } + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error(`setPageLabels: Invalid page labels.`); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._pages.length; i < ii; i++) { + this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + _resetView() { + this._pages = []; + this._currentPageNumber = 1; + this._currentScale = UNKNOWN_SCALE; + this._currentScaleValue = null; + this._pageLabels = null; + this.#buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); + this._location = null; + this._pagesRotation = 0; + this._optionalContentConfigPromise = null; + this._firstPageCapability = Promise.withResolvers(); + this._onePageRenderedCapability = Promise.withResolvers(); + this._pagesCapability = Promise.withResolvers(); + this._scrollMode = ScrollMode.VERTICAL; + this._previousScrollMode = ScrollMode.UNKNOWN; + this._spreadMode = SpreadMode.NONE; + this.#scrollModePageState = { + previousPageNumber: 1, + scrollDown: true, + pages: [] + }; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + this.viewer.textContent = ""; + this._updateScrollMode(); + this.viewer.removeAttribute("lang"); + this.#hiddenCopyElement?.remove(); + this.#hiddenCopyElement = null; + this.#cleanupTimeouts(); + this.#cleanupSwitchAnnotationEditorMode(); + } + #ensurePageViewVisible() { + if (this._scrollMode !== ScrollMode.PAGE) { + throw new Error("#ensurePageViewVisible: Invalid scrollMode value."); + } + const pageNumber = this._currentPageNumber, + state = this.#scrollModePageState, + viewer = this.viewer; + viewer.textContent = ""; + state.pages.length = 0; + if (this._spreadMode === SpreadMode.NONE && !this.isInPresentationMode) { + const pageView = this._pages[pageNumber - 1]; + viewer.append(pageView.div); + state.pages.push(pageView); + } else { + const pageIndexSet = new Set(), + parity = this._spreadMode - 1; + if (parity === -1) { + pageIndexSet.add(pageNumber - 1); + } else if (pageNumber % 2 !== parity) { + pageIndexSet.add(pageNumber - 1); + pageIndexSet.add(pageNumber); + } else { + pageIndexSet.add(pageNumber - 2); + pageIndexSet.add(pageNumber - 1); + } + const spread = document.createElement("div"); + spread.className = "spread"; + if (this.isInPresentationMode) { + const dummyPage = document.createElement("div"); + dummyPage.className = "dummyPage"; + spread.append(dummyPage); + } + for (const i of pageIndexSet) { + const pageView = this._pages[i]; + if (!pageView) { + continue; + } + spread.append(pageView.div); + state.pages.push(pageView); + } + viewer.append(spread); + } + state.scrollDown = pageNumber >= state.previousPageNumber; + state.previousPageNumber = pageNumber; + } + _scrollUpdate() { + if (this.pagesCount === 0) { + return; + } + if (this.#scrollTimeoutId) { + clearTimeout(this.#scrollTimeoutId); + } + this.#scrollTimeoutId = setTimeout(() => { + this.#scrollTimeoutId = null; + this.update(); + }, 100); + this.update(); + } + #scrollIntoView(pageView, pageSpot = null) { + const { + div, + id + } = pageView; + if (this._currentPageNumber !== id) { + this._setCurrentPageNumber(id); + } + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + this.update(); + } + if (!pageSpot && !this.isInPresentationMode) { + const left = div.offsetLeft + div.clientLeft, + right = left + div.clientWidth; + const { + scrollLeft, + clientWidth + } = this.container; + if (this._scrollMode === ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) { + pageSpot = { + left: 0, + top: 0 + }; + } + } + scrollIntoView(div, pageSpot); + if (!this._currentScaleValue && this._location) { + this._location = null; + } + } + #isSameScale(newScale) { + return newScale === this._currentScale || Math.abs(newScale - this._currentScale) < 1e-15; + } + #setScaleUpdatePages(newScale, newValue, { + noScroll = false, + preset = false, + drawingDelay = -1, + origin = null + }) { + this._currentScaleValue = newValue.toString(); + if (this.#isSameScale(newScale)) { + if (preset) { + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: newValue + }); + } + return; + } + this.viewer.style.setProperty("--scale-factor", newScale * PixelsPerInch.PDF_TO_CSS_UNITS); + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + this.refresh(true, { + scale: newScale, + drawingDelay: postponeDrawing ? drawingDelay : -1 + }); + if (postponeDrawing) { + this.#scaleTimeoutId = setTimeout(() => { + this.#scaleTimeoutId = null; + this.refresh(); + }, drawingDelay); + } + const previousScale = this._currentScale; + this._currentScale = newScale; + if (!noScroll) { + let page = this._currentPageNumber, + dest; + if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) { + page = this._location.pageNumber; + dest = [null, { + name: "XYZ" + }, this._location.left, this._location.top, null]; + } + this.scrollPageIntoView({ + pageNumber: page, + destArray: dest, + allowNegativeOffset: true + }); + if (Array.isArray(origin)) { + const scaleDiff = newScale / previousScale - 1; + const [top, left] = this.containerTopLeft; + this.container.scrollLeft += (origin[0] - left) * scaleDiff; + this.container.scrollTop += (origin[1] - top) * scaleDiff; + } + } + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: preset ? newValue : undefined + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + get #pageWidthScaleFactor() { + if (this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL) { + return 2; + } + return 1; + } + #setScale(value, options) { + let scale = parseFloat(value); + if (scale > 0) { + options.preset = false; + this.#setScaleUpdatePages(scale, value, options); + } else { + const currentPage = this._pages[this._currentPageNumber - 1]; + if (!currentPage) { + return; + } + let hPadding = SCROLLBAR_PADDING, + vPadding = VERTICAL_PADDING; + if (this.isInPresentationMode) { + hPadding = vPadding = 4; + if (this._spreadMode !== SpreadMode.NONE) { + hPadding *= 2; + } + } else if (this.removePageBorders) { + hPadding = vPadding = 0; + } else if (this._scrollMode === ScrollMode.HORIZONTAL) { + [hPadding, vPadding] = [vPadding, hPadding]; + } + const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this.#pageWidthScaleFactor; + const 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": + const horizontalScale = isPortraitOrientation(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale); + scale = Math.min(MAX_AUTO_SCALE, horizontalScale); + break; + default: + console.error(`#setScale: "${value}" is an unknown zoom value.`); + return; + } + options.preset = true; + this.#setScaleUpdatePages(scale, value, options); + } + } + #resetCurrentPageView() { + const pageView = this._pages[this._currentPageNumber - 1]; + if (this.isInPresentationMode) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.#scrollIntoView(pageView); + } + pageLabelToPageNumber(label) { + if (!this._pageLabels) { + return null; + } + const i = this._pageLabels.indexOf(label); + if (i < 0) { + return null; + } + return i + 1; + } + scrollPageIntoView({ + pageNumber, + destArray = null, + allowNegativeOffset = false, + ignoreDestinationZoom = false + }) { + if (!this.pdfDocument) { + return; + } + const pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1]; + if (!pageView) { + console.error(`scrollPageIntoView: "${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + if (this.isInPresentationMode || !destArray) { + this._setCurrentPageNumber(pageNumber, true); + return; + } + let x = 0, + y = 0; + let width = 0, + height = 0, + widthScale, + heightScale; + const changeOrientation = pageView.rotation % 180 !== 0; + const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; + const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; + let scale = 0; + switch (destArray[1].name) { + case "XYZ": + x = destArray[2]; + y = destArray[3]; + scale = destArray[4]; + x = x !== null ? x : 0; + y = y !== null ? y : pageHeight; + break; + case "Fit": + case "FitB": + scale = "page-fit"; + break; + case "FitH": + case "FitBH": + y = destArray[2]; + scale = "page-width"; + if (y === null && this._location) { + x = this._location.left; + y = this._location.top; + } else if (typeof y !== "number" || y < 0) { + y = pageHeight; + } + break; + case "FitV": + case "FitBV": + x = destArray[2]; + width = pageWidth; + height = pageHeight; + scale = "page-height"; + break; + case "FitR": + x = destArray[2]; + y = destArray[3]; + width = destArray[4] - x; + height = destArray[5] - y; + let hPadding = SCROLLBAR_PADDING, + vPadding = VERTICAL_PADDING; + if (this.removePageBorders) { + hPadding = vPadding = 0; + } + widthScale = (this.container.clientWidth - hPadding) / width / PixelsPerInch.PDF_TO_CSS_UNITS; + heightScale = (this.container.clientHeight - vPadding) / height / PixelsPerInch.PDF_TO_CSS_UNITS; + scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); + break; + default: + console.error(`scrollPageIntoView: "${destArray[1].name}" is not a valid destination type.`); + return; + } + if (!ignoreDestinationZoom) { + if (scale && scale !== this._currentScale) { + this.currentScaleValue = scale; + } else if (this._currentScale === UNKNOWN_SCALE) { + this.currentScaleValue = DEFAULT_SCALE_VALUE; + } + } + if (scale === "page-fit" && !destArray[4]) { + this.#scrollIntoView(pageView); + return; + } + const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)]; + let left = Math.min(boundingRect[0][0], boundingRect[1][0]); + let top = Math.min(boundingRect[0][1], boundingRect[1][1]); + if (!allowNegativeOffset) { + left = Math.max(left, 0); + top = Math.max(top, 0); + } + this.#scrollIntoView(pageView, { + left, + top + }); + } + _updateLocation(firstPage) { + const currentScale = this._currentScale; + const currentScaleValue = this._currentScaleValue; + const normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue; + const pageNumber = firstPage.id; + const currentPageView = this._pages[pageNumber - 1]; + const container = this.container; + const topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y); + const intLeft = Math.round(topLeft[0]); + const intTop = Math.round(topLeft[1]); + let pdfOpenParams = `#page=${pageNumber}`; + if (!this.isInPresentationMode) { + pdfOpenParams += `&zoom=${normalizedScaleValue},${intLeft},${intTop}`; + } + this._location = { + pageNumber, + scale: normalizedScaleValue, + top: intTop, + left: intLeft, + rotation: this._pagesRotation, + pdfOpenParams + }; + } + update() { + const visible = this._getVisiblePages(); + const visiblePages = visible.views, + numVisiblePages = visiblePages.length; + if (numVisiblePages === 0) { + return; + } + const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1); + this.#buffer.resize(newCacheSize, visible.ids); + for (const { + view, + visibleArea + } of visiblePages) { + view.updateVisibleArea(visibleArea); + } + for (const view of this.#buffer) { + if (!visible.ids.has(view.id)) { + view.updateVisibleArea(null); + } + } + this.renderingQueue.renderHighestPriority(visible); + const isSimpleLayout = this._spreadMode === SpreadMode.NONE && (this._scrollMode === ScrollMode.PAGE || this._scrollMode === ScrollMode.VERTICAL); + const currentId = this._currentPageNumber; + let stillFullyVisible = false; + for (const page of visiblePages) { + if (page.percent < 100) { + break; + } + if (page.id === currentId && isSimpleLayout) { + stillFullyVisible = true; + break; + } + } + this._setCurrentPageNumber(stillFullyVisible ? currentId : visiblePages[0].id); + this._updateLocation(visible.first); + this.eventBus.dispatch("updateviewarea", { + source: this, + location: this._location + }); + } + #switchToEditAnnotationMode() { + const visible = this._getVisiblePages(); + const pagesToRefresh = []; + const { + ids, + views + } = visible; + for (const page of views) { + const { + view + } = page; + if (!view.hasEditableAnnotations()) { + ids.delete(view.id); + continue; + } + pagesToRefresh.push(page); + } + if (pagesToRefresh.length === 0) { + return null; + } + this.renderingQueue.renderHighestPriority({ + first: pagesToRefresh[0], + last: pagesToRefresh.at(-1), + views: pagesToRefresh, + ids + }); + return ids; + } + containsElement(element) { + return this.container.contains(element); + } + focus() { + this.container.focus(); + } + get _isContainerRtl() { + return getComputedStyle(this.container).direction === "rtl"; + } + 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; + } + get isVerticalScrollbarEnabled() { + return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight; + } + _getVisiblePages() { + const views = this._scrollMode === ScrollMode.PAGE ? this.#scrollModePageState.pages : this._pages, + horizontal = this._scrollMode === ScrollMode.HORIZONTAL, + rtl = horizontal && this._isContainerRtl; + return getVisibleElements({ + scrollEl: this.container, + views, + sortByVisibility: true, + horizontal, + rtl + }); + } + cleanup() { + for (const pageView of this._pages) { + if (pageView.renderingState !== RenderingStates.FINISHED) { + pageView.reset(); + } + } + } + _cancelRendering() { + for (const pageView of this._pages) { + pageView.cancelRendering(); + } + } + async #ensurePdfPageLoaded(pageView) { + if (pageView.pdfPage) { + return pageView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(pageView.id); + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for page view", reason); + return null; + } + } + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this.pagesCount) { + return false; + } + switch (this._scrollMode) { + case ScrollMode.PAGE: + return this.#scrollModePageState.scrollDown; + case ScrollMode.HORIZONTAL: + return this.scroll.right; + } + return this.scroll.down; + } + forceRendering(currentlyVisiblePages) { + const visiblePages = currentlyVisiblePages || this._getVisiblePages(); + const scrollAhead = this.#getScrollAhead(visiblePages); + const preRenderExtra = this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL; + const ignoreDetailViews = this.#scaleTimeoutId !== null || this.#scrollTimeoutId !== null && visiblePages.views.some(page => page.detailView?.renderingCancelled); + const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead, preRenderExtra, ignoreDetailViews); + if (pageView) { + this.#ensurePdfPageLoaded(pageView).then(() => { + this.renderingQueue.renderView(pageView); + }); + return true; + } + return false; + } + get hasEqualPageSizes() { + const firstPageView = this._pages[0]; + for (let i = 1, ii = this._pages.length; i < ii; ++i) { + const pageView = this._pages[i]; + if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) { + return false; + } + } + return true; + } + getPagesOverview() { + let initialOrientation; + return this._pages.map(pageView => { + const viewport = pageView.pdfPage.getViewport({ + scale: 1 + }); + const orientation = isPortraitOrientation(viewport); + if (initialOrientation === undefined) { + initialOrientation = orientation; + } else if (this.enablePrintAutoRotate && orientation !== initialOrientation) { + return { + width: viewport.height, + height: viewport.width, + rotation: (viewport.rotation - 90) % 360 + }; + } + return { + width: viewport.width, + height: viewport.height, + rotation: viewport.rotation + }; + }); + } + get optionalContentConfigPromise() { + if (!this.pdfDocument) { + return Promise.resolve(null); + } + if (!this._optionalContentConfigPromise) { + console.error("optionalContentConfigPromise: Not initialized yet."); + return this.pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + } + return this._optionalContentConfigPromise; + } + set optionalContentConfigPromise(promise) { + if (!(promise instanceof Promise)) { + throw new Error(`Invalid optionalContentConfigPromise: ${promise}`); + } + if (!this.pdfDocument) { + return; + } + if (!this._optionalContentConfigPromise) { + return; + } + this._optionalContentConfigPromise = promise; + this.refresh(false, { + optionalContentConfigPromise: promise + }); + this.eventBus.dispatch("optionalcontentconfigchanged", { + source: this, + promise + }); + } + get scrollMode() { + return this._scrollMode; + } + set scrollMode(mode) { + if (this._scrollMode === mode) { + return; + } + if (!isValidScrollMode(mode)) { + throw new Error(`Invalid scroll mode: ${mode}`); + } + if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + return; + } + this._previousScrollMode = this._scrollMode; + this._scrollMode = mode; + this.eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + this._updateScrollMode(this._currentPageNumber); + } + _updateScrollMode(pageNumber = null) { + const scrollMode = this._scrollMode, + viewer = this.viewer; + viewer.classList.toggle("scrollHorizontal", scrollMode === ScrollMode.HORIZONTAL); + viewer.classList.toggle("scrollWrapped", scrollMode === ScrollMode.WRAPPED); + if (!this.pdfDocument || !pageNumber) { + return; + } + if (scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._previousScrollMode === ScrollMode.PAGE) { + this._updateSpreadMode(); + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + get spreadMode() { + return this._spreadMode; + } + set spreadMode(mode) { + if (this._spreadMode === mode) { + return; + } + if (!isValidSpreadMode(mode)) { + throw new Error(`Invalid spread mode: ${mode}`); + } + this._spreadMode = mode; + this.eventBus.dispatch("spreadmodechanged", { + source: this, + mode + }); + this._updateSpreadMode(this._currentPageNumber); + } + _updateSpreadMode(pageNumber = null) { + if (!this.pdfDocument) { + return; + } + const viewer = this.viewer, + pages = this._pages; + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else { + viewer.textContent = ""; + if (this._spreadMode === SpreadMode.NONE) { + for (const pageView of this._pages) { + viewer.append(pageView.div); + } + } else { + const parity = this._spreadMode - 1; + let spread = null; + for (let i = 0, ii = pages.length; i < ii; ++i) { + if (spread === null) { + spread = document.createElement("div"); + spread.className = "spread"; + viewer.append(spread); + } else if (i % 2 === parity) { + spread = spread.cloneNode(false); + viewer.append(spread); + } + spread.append(pages[i].div); + } + } + } + if (!pageNumber) { + return; + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + _getPageAdvance(currentPageNumber, previous = false) { + switch (this._scrollMode) { + case ScrollMode.WRAPPED: + { + const { + views + } = this._getVisiblePages(), + pageLayout = new Map(); + for (const { + id, + y, + percent, + widthPercent + } of views) { + if (percent === 0 || widthPercent < 100) { + continue; + } + let yArray = pageLayout.get(y); + if (!yArray) { + pageLayout.set(y, yArray ||= []); + } + yArray.push(id); + } + for (const yArray of pageLayout.values()) { + const currentIndex = yArray.indexOf(currentPageNumber); + if (currentIndex === -1) { + continue; + } + const numPages = yArray.length; + if (numPages === 1) { + break; + } + if (previous) { + for (let i = currentIndex - 1, ii = 0; i >= ii; i--) { + const currentId = yArray[i], + expectedId = yArray[i + 1] - 1; + if (currentId < expectedId) { + return currentPageNumber - expectedId; + } + } + } else { + for (let i = currentIndex + 1, ii = numPages; i < ii; i++) { + const currentId = yArray[i], + expectedId = yArray[i - 1] + 1; + if (currentId > expectedId) { + return expectedId - currentPageNumber; + } + } + } + if (previous) { + const firstId = yArray[0]; + if (firstId < currentPageNumber) { + return currentPageNumber - firstId + 1; + } + } else { + const lastId = yArray[numPages - 1]; + if (lastId > currentPageNumber) { + return lastId - currentPageNumber + 1; + } + } + break; + } + break; + } + case ScrollMode.HORIZONTAL: + { + break; + } + case ScrollMode.PAGE: + case ScrollMode.VERTICAL: + { + if (this._spreadMode === SpreadMode.NONE) { + break; + } + const parity = this._spreadMode - 1; + if (previous && currentPageNumber % 2 !== parity) { + break; + } else if (!previous && currentPageNumber % 2 === parity) { + break; + } + const { + views + } = this._getVisiblePages(), + expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1; + for (const { + id, + percent, + widthPercent + } of views) { + if (id !== expectedId) { + continue; + } + if (percent > 0 && widthPercent === 100) { + return 2; + } + break; + } + break; + } + } + return 1; + } + nextPage() { + const currentPageNumber = this._currentPageNumber, + pagesCount = this.pagesCount; + if (currentPageNumber >= pagesCount) { + return false; + } + const advance = this._getPageAdvance(currentPageNumber, false) || 1; + this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount); + return true; + } + previousPage() { + const currentPageNumber = this._currentPageNumber; + if (currentPageNumber <= 1) { + return false; + } + const advance = this._getPageAdvance(currentPageNumber, true) || 1; + this.currentPageNumber = Math.max(currentPageNumber - advance, 1); + return true; + } + updateScale({ + drawingDelay, + scaleFactor = null, + steps = null, + origin + }) { + if (steps === null && scaleFactor === null) { + throw new Error("Invalid updateScale options: either `steps` or `scaleFactor` must be provided."); + } + if (!this.pdfDocument) { + return; + } + let newScale = this._currentScale; + if (scaleFactor > 0 && scaleFactor !== 1) { + newScale = Math.round(newScale * scaleFactor * 100) / 100; + } else if (steps) { + const delta = steps > 0 ? DEFAULT_SCALE_DELTA : 1 / DEFAULT_SCALE_DELTA; + const round = steps > 0 ? Math.ceil : Math.floor; + steps = Math.abs(steps); + do { + newScale = round((newScale * delta).toFixed(2) * 10) / 10; + } while (--steps > 0); + } + newScale = MathClamp(newScale, MIN_SCALE, MAX_SCALE); + this.#setScale(newScale, { + noScroll: false, + drawingDelay, + origin + }); + } + increaseScale(options = {}) { + this.updateScale({ + ...options, + steps: options.steps ?? 1 + }); + } + decreaseScale(options = {}) { + this.updateScale({ + ...options, + steps: -(options.steps ?? 1) + }); + } + #updateContainerHeightCss(height = this.container.clientHeight) { + if (height !== this.#previousContainerHeight) { + this.#previousContainerHeight = height; + docStyle.setProperty("--viewer-container-height", `${height}px`); + } + } + #resizeObserverCallback(entries) { + for (const entry of entries) { + if (entry.target === this.container) { + this.#updateContainerHeightCss(Math.floor(entry.borderBoxSize[0].blockSize)); + this.#containerTopLeft = null; + break; + } + } + } + get containerTopLeft() { + return this.#containerTopLeft ||= [this.container.offsetTop, this.container.offsetLeft]; + } + #cleanupTimeouts() { + if (this.#scaleTimeoutId !== null) { + clearTimeout(this.#scaleTimeoutId); + this.#scaleTimeoutId = null; + } + if (this.#scrollTimeoutId !== null) { + clearTimeout(this.#scrollTimeoutId); + this.#scrollTimeoutId = null; + } + } + #cleanupSwitchAnnotationEditorMode() { + this.#switchAnnotationEditorModeAC?.abort(); + this.#switchAnnotationEditorModeAC = null; + if (this.#switchAnnotationEditorModeTimeoutId !== null) { + clearTimeout(this.#switchAnnotationEditorModeTimeoutId); + this.#switchAnnotationEditorModeTimeoutId = null; + } + } + #preloadEditingData(mode) { + switch (mode) { + case AnnotationEditorType.STAMP: + this.#mlManager?.loadModel("altText"); + break; + case AnnotationEditorType.SIGNATURE: + this.#signatureManager?.loadSignatures(); + break; + } + } + get annotationEditorMode() { + return this.#annotationEditorUIManager ? this.#annotationEditorMode : AnnotationEditorType.DISABLE; + } + set annotationEditorMode({ + mode, + editId = null, + isFromKeyboard = false + }) { + if (!this.#annotationEditorUIManager) { + throw new Error(`The AnnotationEditor is not enabled.`); + } + if (this.#annotationEditorMode === mode) { + return; + } + if (!isValidAnnotationEditorMode(mode)) { + throw new Error(`Invalid AnnotationEditor mode: ${mode}`); + } + if (!this.pdfDocument) { + return; + } + this.#preloadEditingData(mode); + const { + eventBus, + pdfDocument + } = this; + const updater = async () => { + this.#cleanupSwitchAnnotationEditorMode(); + this.#annotationEditorMode = mode; + await this.#annotationEditorUIManager.updateMode(mode, editId, isFromKeyboard); + if (mode !== this.#annotationEditorMode || pdfDocument !== this.pdfDocument) { + return; + } + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode + }); + }; + if (mode === AnnotationEditorType.NONE || this.#annotationEditorMode === AnnotationEditorType.NONE) { + const isEditing = mode !== AnnotationEditorType.NONE; + if (!isEditing) { + this.pdfDocument.annotationStorage.resetModifiedIds(); + } + for (const pageView of this._pages) { + pageView.toggleEditingMode(isEditing); + } + const idsToRefresh = this.#switchToEditAnnotationMode(); + if (isEditing && idsToRefresh) { + this.#cleanupSwitchAnnotationEditorMode(); + this.#switchAnnotationEditorModeAC = new AbortController(); + const signal = AbortSignal.any([this.#eventAbortController.signal, this.#switchAnnotationEditorModeAC.signal]); + eventBus._on("pagerendered", ({ + pageNumber + }) => { + idsToRefresh.delete(pageNumber); + if (idsToRefresh.size === 0) { + this.#switchAnnotationEditorModeTimeoutId = setTimeout(updater, 0); + } + }, { + signal + }); + return; + } + } + updater(); + } + refresh(noUpdate = false, updateArgs = Object.create(null)) { + if (!this.pdfDocument) { + return; + } + for (const pageView of this._pages) { + pageView.update(updateArgs); + } + this.#cleanupTimeouts(); + if (!noUpdate) { + this.update(); + } + } +} + +;// ./web/secondary_toolbar.js + + +class SecondaryToolbar { + #opts; + constructor(options, eventBus) { + this.#opts = options; + const buttons = [{ + element: options.presentationModeButton, + eventName: "presentationmode", + close: true + }, { + element: options.printButton, + eventName: "print", + close: true + }, { + element: options.downloadButton, + eventName: "download", + close: true + }, { + element: options.viewBookmarkButton, + eventName: null, + close: true + }, { + element: options.firstPageButton, + eventName: "firstpage", + close: true + }, { + element: options.lastPageButton, + eventName: "lastpage", + close: true + }, { + element: options.pageRotateCwButton, + eventName: "rotatecw", + close: false + }, { + element: options.pageRotateCcwButton, + eventName: "rotateccw", + close: false + }, { + element: options.cursorSelectToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: CursorTool.SELECT + }, + close: true + }, { + element: options.cursorHandToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: CursorTool.HAND + }, + close: true + }, { + element: options.scrollPageButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.PAGE + }, + close: true + }, { + element: options.scrollVerticalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.VERTICAL + }, + close: true + }, { + element: options.scrollHorizontalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.HORIZONTAL + }, + close: true + }, { + element: options.scrollWrappedButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.WRAPPED + }, + close: true + }, { + element: options.spreadNoneButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.NONE + }, + close: true + }, { + element: options.spreadOddButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.ODD + }, + close: true + }, { + element: options.spreadEvenButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.EVEN + }, + close: true + }, { + element: options.imageAltTextSettingsButton, + eventName: "imagealttextsettings", + close: true + }, { + element: options.documentPropertiesButton, + eventName: "documentproperties", + close: true + }]; + buttons.push({ + element: options.openFileButton, + eventName: "openfile", + close: true + }); + this.eventBus = eventBus; + this.opened = false; + this.#bindListeners(buttons); + this.reset(); + } + get isOpen() { + return this.opened; + } + setPageNumber(pageNumber) { + this.pageNumber = pageNumber; + this.#updateUIState(); + } + setPagesCount(pagesCount) { + this.pagesCount = pagesCount; + this.#updateUIState(); + } + reset() { + this.pageNumber = 0; + this.pagesCount = 0; + this.#updateUIState(); + this.eventBus.dispatch("switchcursortool", { + source: this, + reset: true + }); + this.#scrollModeChanged({ + mode: ScrollMode.VERTICAL + }); + this.#spreadModeChanged({ + mode: SpreadMode.NONE + }); + } + #updateUIState() { + const { + firstPageButton, + lastPageButton, + pageRotateCwButton, + pageRotateCcwButton + } = this.#opts; + firstPageButton.disabled = this.pageNumber <= 1; + lastPageButton.disabled = this.pageNumber >= this.pagesCount; + pageRotateCwButton.disabled = this.pagesCount === 0; + pageRotateCcwButton.disabled = this.pagesCount === 0; + } + #bindListeners(buttons) { + const { + eventBus + } = this; + const { + toggleButton + } = this.#opts; + toggleButton.addEventListener("click", this.toggle.bind(this)); + for (const { + element, + eventName, + close, + eventDetails + } of buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + eventBus.dispatch(eventName, { + source: this, + ...eventDetails + }); + } + if (close) { + this.close(); + } + eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "buttons", + data: { + id: element.id + } + } + }); + }); + } + eventBus._on("cursortoolchanged", this.#cursorToolChanged.bind(this)); + eventBus._on("scrollmodechanged", this.#scrollModeChanged.bind(this)); + eventBus._on("spreadmodechanged", this.#spreadModeChanged.bind(this)); + } + #cursorToolChanged({ + tool, + disabled + }) { + const { + cursorSelectToolButton, + cursorHandToolButton + } = this.#opts; + toggleCheckedBtn(cursorSelectToolButton, tool === CursorTool.SELECT); + toggleCheckedBtn(cursorHandToolButton, tool === CursorTool.HAND); + cursorSelectToolButton.disabled = disabled; + cursorHandToolButton.disabled = disabled; + } + #scrollModeChanged({ + mode + }) { + const { + scrollPageButton, + scrollVerticalButton, + scrollHorizontalButton, + scrollWrappedButton, + spreadNoneButton, + spreadOddButton, + spreadEvenButton + } = this.#opts; + toggleCheckedBtn(scrollPageButton, mode === ScrollMode.PAGE); + toggleCheckedBtn(scrollVerticalButton, mode === ScrollMode.VERTICAL); + toggleCheckedBtn(scrollHorizontalButton, mode === ScrollMode.HORIZONTAL); + toggleCheckedBtn(scrollWrappedButton, mode === ScrollMode.WRAPPED); + const forceScrollModePage = this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE; + scrollPageButton.disabled = forceScrollModePage; + scrollVerticalButton.disabled = forceScrollModePage; + scrollHorizontalButton.disabled = forceScrollModePage; + scrollWrappedButton.disabled = forceScrollModePage; + const isHorizontal = mode === ScrollMode.HORIZONTAL; + spreadNoneButton.disabled = isHorizontal; + spreadOddButton.disabled = isHorizontal; + spreadEvenButton.disabled = isHorizontal; + } + #spreadModeChanged({ + mode + }) { + const { + spreadNoneButton, + spreadOddButton, + spreadEvenButton + } = this.#opts; + toggleCheckedBtn(spreadNoneButton, mode === SpreadMode.NONE); + toggleCheckedBtn(spreadOddButton, mode === SpreadMode.ODD); + toggleCheckedBtn(spreadEvenButton, mode === SpreadMode.EVEN); + } + open() { + if (this.opened) { + return; + } + this.opened = true; + const { + toggleButton, + toolbar + } = this.#opts; + toggleExpandedBtn(toggleButton, true, toolbar); + } + close() { + if (!this.opened) { + return; + } + this.opened = false; + const { + toggleButton, + toolbar + } = this.#opts; + toggleExpandedBtn(toggleButton, false, toolbar); + } + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } +} + +;// ./web/signature_manager.js + +const DEFAULT_HEIGHT_IN_PAGE = 40; +class SignatureManager { + #addButton; + #tabsToAltText = null; + #clearButton; + #clearDescription; + #currentEditor; + #description; + #dialog; + #drawCurves = null; + #drawPlaceholder; + #drawPath = null; + #drawPathString = ""; + #drawPoints = null; + #drawSVG; + #drawThickness; + #errorBar; + #extractedSignatureData = null; + #imagePath = null; + #imagePicker; + #imagePickerLink; + #imagePlaceholder; + #imageSVG; + #saveCheckbox; + #saveContainer; + #tabButtons; + #addSignatureToolbarButton; + #loadSignaturesPromise = null; + #typeInput; + #currentTab = null; + #currentTabAC = null; + #hasDescriptionChanged = false; + #eventBus; + #l10n; + #overlayManager; + #editDescriptionDialog; + #signatureStorage; + #uiManager = null; + static #l10nDescription = null; + constructor({ + dialog, + panels, + typeButton, + typeInput, + drawButton, + drawPlaceholder, + drawSVG, + drawThickness, + imageButton, + imageSVG, + imagePlaceholder, + imagePicker, + imagePickerLink, + description, + clearButton, + cancelButton, + addButton, + errorCloseButton, + errorBar, + saveCheckbox, + saveContainer + }, editSignatureElements, addSignatureToolbarButton, overlayManager, l10n, signatureStorage, eventBus) { + this.#addButton = addButton; + this.#clearButton = clearButton; + this.#clearDescription = description.lastElementChild; + this.#description = description.firstElementChild; + this.#dialog = dialog; + this.#drawSVG = drawSVG; + this.#drawPlaceholder = drawPlaceholder; + this.#drawThickness = drawThickness; + this.#errorBar = errorBar; + this.#imageSVG = imageSVG; + this.#imagePlaceholder = imagePlaceholder; + this.#imagePicker = imagePicker; + this.#imagePickerLink = imagePickerLink; + this.#overlayManager = overlayManager; + this.#saveCheckbox = saveCheckbox; + this.#saveContainer = saveContainer; + this.#addSignatureToolbarButton = addSignatureToolbarButton; + this.#typeInput = typeInput; + this.#l10n = l10n; + this.#signatureStorage = signatureStorage; + this.#eventBus = eventBus; + this.#editDescriptionDialog = new EditDescriptionDialog(editSignatureElements, overlayManager); + SignatureManager.#l10nDescription ||= Object.freeze({ + signature: "pdfjs-editor-add-signature-description-default-when-drawing" + }); + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", e => { + const { + target + } = e; + if (target !== this.#typeInput && target !== this.#description) { + e.preventDefault(); + } + }); + dialog.addEventListener("drop", e => { + stopEvent(e); + }); + cancelButton.addEventListener("click", this.#cancel.bind(this)); + addButton.addEventListener("click", this.#add.bind(this)); + clearButton.addEventListener("click", () => { + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.clear", + data: { + type: this.#currentTab + } + }); + this.#initTab(null); + }, { + passive: true + }); + this.#description.addEventListener("input", () => { + this.#clearDescription.disabled = this.#description.value === ""; + }, { + passive: true + }); + this.#clearDescription.addEventListener("click", () => { + this.#description.value = ""; + this.#clearDescription.disabled = true; + }, { + passive: true + }); + errorCloseButton.addEventListener("click", () => { + errorBar.hidden = true; + }, { + passive: true + }); + this.#initTabButtons(typeButton, drawButton, imageButton, panels); + imagePicker.accept = SupportedImageMimeTypes.join(","); + eventBus._on("storedsignatureschanged", this.#signaturesChanged.bind(this)); + overlayManager.register(dialog); + } + #initTabButtons(typeButton, drawButton, imageButton, panels) { + const buttons = this.#tabButtons = new Map([["type", typeButton], ["draw", drawButton], ["image", imageButton]]); + const tabCallback = e => { + for (const [name, button] of buttons) { + if (button === e.target) { + button.setAttribute("aria-selected", true); + button.setAttribute("tabindex", 0); + panels.setAttribute("data-selected", name); + this.#initTab(name); + } else { + button.setAttribute("aria-selected", false); + button.setAttribute("tabindex", -1); + } + } + }; + const buttonsArray = Array.from(buttons.values()); + for (let i = 0, ii = buttonsArray.length; i < ii; i++) { + const button = buttonsArray[i]; + button.addEventListener("click", tabCallback, { + passive: true + }); + button.addEventListener("keydown", ({ + key + }) => { + if (key !== "ArrowLeft" && key !== "ArrowRight") { + return; + } + buttonsArray[i + (key === "ArrowLeft" ? -1 : 1)]?.focus(); + }, { + passive: true + }); + } + } + #resetCommon() { + this.#hasDescriptionChanged = false; + this.#description.value = ""; + if (this.#currentTab) { + this.#tabsToAltText.get(this.#currentTab).value = ""; + } + } + #resetTab(name) { + switch (name) { + case "type": + this.#typeInput.value = ""; + break; + case "draw": + this.#drawCurves = null; + this.#drawPoints = null; + this.#drawPathString = ""; + this.#drawPath?.remove(); + this.#drawPath = null; + this.#drawPlaceholder.hidden = false; + this.#drawThickness.value = 1; + break; + case "image": + this.#imagePlaceholder.hidden = false; + this.#imagePath?.remove(); + this.#imagePath = null; + break; + } + } + #initTab(name) { + if (name && this.#currentTab === name) { + return; + } + if (this.#currentTab) { + this.#tabsToAltText.get(this.#currentTab).value = this.#description.value; + } + if (name) { + this.#currentTab = name; + } + this.#errorBar.hidden = true; + const reset = !name; + if (reset) { + this.#resetCommon(); + } else { + this.#description.value = this.#tabsToAltText.get(this.#currentTab).value; + } + this.#clearDescription.disabled = this.#description.value === ""; + this.#currentTabAC?.abort(); + this.#currentTabAC = new AbortController(); + switch (this.#currentTab) { + case "type": + this.#initTypeTab(reset); + break; + case "draw": + this.#initDrawTab(reset); + break; + case "image": + this.#initImageTab(reset); + break; + } + } + #disableButtons(value) { + this.#saveCheckbox.disabled = this.#clearButton.disabled = this.#addButton.disabled = this.#description.disabled = !value; + } + #initTypeTab(reset) { + if (reset) { + this.#resetTab("type"); + } + this.#disableButtons(this.#typeInput.value); + const { + signal + } = this.#currentTabAC; + const options = { + passive: true, + signal + }; + this.#typeInput.addEventListener("input", () => { + const { + value + } = this.#typeInput; + if (!this.#hasDescriptionChanged) { + this.#tabsToAltText.get("type").default = this.#description.value = value; + this.#clearDescription.disabled = value === ""; + } + this.#disableButtons(value); + }, options); + this.#description.addEventListener("input", () => { + this.#hasDescriptionChanged = this.#typeInput.value !== this.#description.value; + }, options); + } + #initDrawTab(reset) { + if (reset) { + this.#resetTab("draw"); + } + this.#disableButtons(this.#drawPath); + const { + signal + } = this.#currentTabAC; + const options = { + signal + }; + let currentPointerId = NaN; + const drawCallback = e => { + const { + pointerId + } = e; + if (!isNaN(currentPointerId) && currentPointerId !== pointerId) { + return; + } + currentPointerId = pointerId; + e.preventDefault(); + this.#drawSVG.setPointerCapture(pointerId); + const { + width: drawWidth, + height: drawHeight + } = this.#drawSVG.getBoundingClientRect(); + let { + offsetX, + offsetY + } = e; + offsetX = Math.round(offsetX); + offsetY = Math.round(offsetY); + if (e.target === this.#drawPlaceholder) { + this.#drawPlaceholder.hidden = true; + } + if (!this.#drawCurves) { + this.#drawCurves = { + width: drawWidth, + height: drawHeight, + thickness: parseInt(this.#drawThickness.value), + curves: [] + }; + this.#disableButtons(true); + const svgFactory = new DOMSVGFactory(); + const path = this.#drawPath = svgFactory.createElement("path"); + path.setAttribute("stroke-width", this.#drawThickness.value); + this.#drawSVG.append(path); + this.#drawSVG.addEventListener("pointerdown", drawCallback, options); + this.#drawPlaceholder.removeEventListener("pointerdown", drawCallback); + if (this.#description.value === "") { + this.#l10n.get(SignatureManager.#l10nDescription.signature).then(description => { + this.#tabsToAltText.get("draw").default = description; + this.#description.value ||= description; + this.#clearDescription.disabled = this.#description.value === ""; + }); + } + } + this.#drawPoints = [offsetX, offsetY]; + this.#drawCurves.curves.push({ + points: this.#drawPoints + }); + this.#drawPathString += `M ${offsetX} ${offsetY}`; + this.#drawPath.setAttribute("d", this.#drawPathString); + const finishDrawAC = new AbortController(); + const listenerDrawOptions = { + signal: AbortSignal.any([signal, finishDrawAC.signal]) + }; + this.#drawSVG.addEventListener("contextmenu", noContextMenu, listenerDrawOptions); + this.#drawSVG.addEventListener("pointermove", evt => { + evt.preventDefault(); + let { + offsetX: x, + offsetY: y + } = evt; + x = Math.round(x); + y = Math.round(y); + const drawPoints = this.#drawPoints; + if (x < 0 || y < 0 || x > drawWidth || y > drawHeight || x === drawPoints.at(-2) && y === drawPoints.at(-1)) { + return; + } + if (drawPoints.length >= 4) { + const [x1, y1, x2, y2] = drawPoints.slice(-4); + this.#drawPathString += `C${(x1 + 5 * x2) / 6} ${(y1 + 5 * y2) / 6} ${(5 * x2 + x) / 6} ${(5 * y2 + y) / 6} ${(x2 + x) / 2} ${(y2 + y) / 2}`; + } else { + this.#drawPathString += `L${x} ${y}`; + } + drawPoints.push(x, y); + this.#drawPath.setAttribute("d", this.#drawPathString); + }, listenerDrawOptions); + this.#drawSVG.addEventListener("pointerup", evt => { + const { + pointerId: pId + } = evt; + if (!isNaN(currentPointerId) && currentPointerId !== pId) { + return; + } + currentPointerId = NaN; + evt.preventDefault(); + this.#drawSVG.releasePointerCapture(pId); + finishDrawAC.abort(); + if (this.#drawPoints.length === 2) { + this.#drawPathString += `L${this.#drawPoints[0]} ${this.#drawPoints[1]}`; + this.#drawPath.setAttribute("d", this.#drawPathString); + } + }, listenerDrawOptions); + }; + if (this.#drawCurves) { + this.#drawSVG.addEventListener("pointerdown", drawCallback, options); + } else { + this.#drawPlaceholder.addEventListener("pointerdown", drawCallback, options); + } + this.#drawThickness.addEventListener("input", () => { + const { + value: thickness + } = this.#drawThickness; + this.#drawThickness.setAttribute("data-l10n-args", JSON.stringify({ + thickness + })); + if (!this.#drawCurves) { + return; + } + this.#drawPath.setAttribute("stroke-width", thickness); + this.#drawCurves.thickness = thickness; + }, options); + } + #initImageTab(reset) { + if (reset) { + this.#resetTab("image"); + } + this.#disableButtons(this.#imagePath); + const { + signal + } = this.#currentTabAC; + const options = { + signal + }; + const passiveOptions = { + passive: true, + signal + }; + this.#imagePickerLink.addEventListener("keydown", e => { + const { + key + } = e; + if (key === "Enter" || key === " ") { + stopEvent(e); + this.#imagePicker.click(); + } + }, options); + this.#imagePicker.addEventListener("click", () => { + this.#dialog.classList.toggle("waiting", true); + }, passiveOptions); + this.#imagePicker.addEventListener("change", async () => { + const file = this.#imagePicker.files?.[0]; + if (!file || !SupportedImageMimeTypes.includes(file.type)) { + this.#errorBar.hidden = false; + this.#dialog.classList.toggle("waiting", false); + return; + } + await this.#extractSignature(file); + }, passiveOptions); + this.#imagePicker.addEventListener("cancel", () => { + this.#dialog.classList.toggle("waiting", false); + }, passiveOptions); + this.#imagePlaceholder.addEventListener("dragover", e => { + const { + dataTransfer + } = e; + for (const { + type + } of dataTransfer.items) { + if (!SupportedImageMimeTypes.includes(type)) { + continue; + } + dataTransfer.dropEffect = dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + stopEvent(e); + return; + } + dataTransfer.dropEffect = "none"; + }, options); + this.#imagePlaceholder.addEventListener("drop", e => { + const { + dataTransfer: { + files + } + } = e; + if (!files?.length) { + return; + } + for (const file of files) { + if (SupportedImageMimeTypes.includes(file.type)) { + this.#extractSignature(file); + break; + } + } + stopEvent(e); + this.#dialog.classList.toggle("waiting", true); + }, options); + } + async #extractSignature(file) { + let data; + try { + data = await this.#uiManager.imageManager.getFromFile(file); + } catch (e) { + console.error("SignatureManager.#extractSignature.", e); + } + if (!data) { + this.#errorBar.hidden = false; + this.#dialog.classList.toggle("waiting", false); + return; + } + const { + outline + } = this.#extractedSignatureData = this.#currentEditor.getFromImage(data.bitmap); + if (!outline) { + this.#dialog.classList.toggle("waiting", false); + return; + } + this.#imagePlaceholder.hidden = true; + this.#disableButtons(true); + const svgFactory = new DOMSVGFactory(); + const path = this.#imagePath = svgFactory.createElement("path"); + this.#imageSVG.setAttribute("viewBox", outline.viewBox); + this.#imageSVG.setAttribute("preserveAspectRatio", "xMidYMid meet"); + this.#imageSVG.append(path); + path.setAttribute("d", outline.toSVGPath()); + this.#tabsToAltText.get("image").default = file.name; + if (this.#description.value === "") { + this.#description.value = file.name || ""; + this.#clearDescription.disabled = this.#description.value === ""; + } + this.#dialog.classList.toggle("waiting", false); + } + #getOutlineForType() { + return this.#currentEditor.getFromText(this.#typeInput.value, window.getComputedStyle(this.#typeInput)); + } + #getOutlineForDraw() { + const { + width, + height + } = this.#drawSVG.getBoundingClientRect(); + return this.#currentEditor.getDrawnSignature(this.#drawCurves, width, height); + } + #reportTelemetry(data) { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + #addToolbarButton(signatureData, uuid, description) { + const { + curves, + areContours, + thickness, + width, + height + } = signatureData; + const maxDim = Math.max(width, height); + const outlineData = SignatureExtractor.processDrawnLines({ + lines: { + curves, + thickness, + width, + height + }, + pageWidth: maxDim, + pageHeight: maxDim, + rotation: 0, + innerMargin: 0, + mustSmooth: false, + areContours + }); + if (!outlineData) { + return; + } + const { + outline + } = outlineData; + const svgFactory = new DOMSVGFactory(); + const div = document.createElement("div"); + const button = document.createElement("button"); + button.addEventListener("click", () => { + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType.CREATE, + value: { + signatureData: { + lines: { + curves, + thickness, + width, + height + }, + mustSmooth: false, + areContours, + description, + uuid, + heightInPage: DEFAULT_HEIGHT_IN_PAGE + } + } + }); + }); + div.append(button); + div.classList.add("toolbarAddSignatureButtonContainer"); + const svg = svgFactory.create(1, 1, true); + button.append(svg); + const span = document.createElement("span"); + span.ariaHidden = true; + button.append(span); + button.classList.add("toolbarAddSignatureButton"); + button.type = "button"; + span.textContent = description; + button.setAttribute("data-l10n-id", "pdfjs-editor-add-saved-signature-button"); + button.setAttribute("data-l10n-args", JSON.stringify({ + description + })); + button.tabIndex = 0; + const path = svgFactory.createElement("path"); + svg.append(path); + svg.setAttribute("viewBox", outline.viewBox); + svg.setAttribute("preserveAspectRatio", "xMidYMid meet"); + if (areContours) { + path.classList.add("contours"); + } + path.setAttribute("d", outline.toSVGPath()); + const deleteButton = document.createElement("button"); + div.append(deleteButton); + deleteButton.classList.add("toolbarButton", "deleteButton"); + deleteButton.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button1"); + deleteButton.type = "button"; + deleteButton.tabIndex = 0; + deleteButton.addEventListener("click", async () => { + if (await this.#signatureStorage.delete(uuid)) { + div.remove(); + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.delete_saved", + data: { + savedCount: await this.#signatureStorage.size() + } + }); + } + }); + const deleteSpan = document.createElement("span"); + deleteButton.append(deleteSpan); + deleteSpan.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button-label1"); + this.#addSignatureToolbarButton.before(div); + } + async #signaturesChanged() { + const parent = this.#addSignatureToolbarButton.parentElement; + while (parent.firstElementChild !== this.#addSignatureToolbarButton) { + parent.firstElementChild.remove(); + } + this.#loadSignaturesPromise = null; + await this.loadSignatures(true); + } + getSignature(params) { + return this.open(params); + } + async loadSignatures(reload = false) { + if (!this.#addSignatureToolbarButton || !reload && this.#addSignatureToolbarButton.previousElementSibling || !this.#signatureStorage) { + return; + } + if (!this.#loadSignaturesPromise) { + this.#loadSignaturesPromise = this.#signatureStorage.getAll().then(async signatures => [signatures, await Promise.all(Array.from(signatures.values(), ({ + signatureData + }) => SignatureExtractor.decompressSignature(signatureData)))]); + if (!reload) { + return; + } + } + const [signatures, signaturesData] = await this.#loadSignaturesPromise; + this.#loadSignaturesPromise = null; + let i = 0; + for (const [uuid, { + description + }] of signatures) { + const data = signaturesData[i++]; + if (!data) { + continue; + } + data.curves = data.outlines.map(points => ({ + points + })); + delete data.outlines; + this.#addToolbarButton(data, uuid, description); + } + } + async renderEditButton(editor) { + const button = document.createElement("button"); + button.classList.add("altText", "editDescription"); + button.tabIndex = 0; + button.title = editor.description; + const span = document.createElement("span"); + button.append(span); + span.setAttribute("data-l10n-id", "pdfjs-editor-add-signature-edit-button-label"); + button.addEventListener("click", () => { + this.#editDescriptionDialog.open(editor); + }, { + passive: true + }); + return button; + } + async open({ + uiManager, + editor + }) { + this.#tabsToAltText ||= new Map(this.#tabButtons.keys().map(name => [name, { + value: "", + default: "" + }])); + this.#uiManager = uiManager; + this.#currentEditor = editor; + this.#uiManager.removeEditListeners(); + const isStorageFull = await this.#signatureStorage.isFull(); + this.#saveContainer.classList.toggle("fullStorage", isStorageFull); + this.#saveCheckbox.checked = !isStorageFull; + await this.#overlayManager.open(this.#dialog); + const tabType = this.#tabButtons.get("type"); + tabType.focus(); + tabType.click(); + } + #cancel() { + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + if (this.#currentEditor._drawId === null) { + this.#currentEditor.remove(); + } + this.#uiManager?.addEditListeners(); + this.#currentTabAC?.abort(); + this.#currentTabAC = null; + this.#uiManager = null; + this.#currentEditor = null; + this.#resetCommon(); + for (const [name] of this.#tabButtons) { + this.#resetTab(name); + } + this.#disableButtons(false); + this.#currentTab = null; + this.#tabsToAltText = null; + } + async #add() { + let data; + const type = this.#currentTab; + switch (type) { + case "type": + data = this.#getOutlineForType(); + break; + case "draw": + data = this.#getOutlineForDraw(); + break; + case "image": + data = this.#extractedSignatureData; + break; + } + let uuid = null; + const description = this.#description.value; + if (this.#saveCheckbox.checked) { + const { + newCurves, + areContours, + thickness, + width, + height + } = data; + const signatureData = await SignatureExtractor.compressSignature({ + outlines: newCurves, + areContours, + thickness, + width, + height + }); + uuid = await this.#signatureStorage.create({ + description, + signatureData + }); + if (uuid) { + this.#addToolbarButton({ + curves: newCurves.map(points => ({ + points + })), + areContours, + thickness, + width, + height + }, uuid, description); + } else { + console.warn("SignatureManager.add: cannot save the signature."); + } + } + const altText = this.#tabsToAltText.get(type); + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.created", + data: { + type, + saved: !!uuid, + savedCount: await this.#signatureStorage.size(), + descriptionChanged: description !== altText.default + } + }); + this.#currentEditor.addSignature(data, DEFAULT_HEIGHT_IN_PAGE, this.#description.value, uuid); + this.#finish(); + } + destroy() { + this.#uiManager = null; + this.#finish(); + } +} +class EditDescriptionDialog { + #currentEditor; + #previousDescription; + #description; + #dialog; + #overlayManager; + #signatureSVG; + #uiManager; + constructor({ + dialog, + description, + cancelButton, + updateButton, + editSignatureView + }, overlayManager) { + const descriptionInput = this.#description = description.firstElementChild; + this.#signatureSVG = editSignatureView; + this.#dialog = dialog; + this.#overlayManager = overlayManager; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", e => { + if (e.target !== this.#description) { + e.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#cancel.bind(this)); + updateButton.addEventListener("click", this.#update.bind(this)); + const clearDescription = description.lastElementChild; + clearDescription.addEventListener("click", () => { + descriptionInput.value = ""; + clearDescription.disabled = true; + updateButton.disabled = this.#previousDescription === ""; + }); + descriptionInput.addEventListener("input", () => { + const { + value + } = descriptionInput; + clearDescription.disabled = value === ""; + updateButton.disabled = value === this.#previousDescription; + editSignatureView.setAttribute("aria-label", value); + }, { + passive: true + }); + overlayManager.register(dialog); + } + async open(editor) { + this.#uiManager = editor._uiManager; + this.#currentEditor = editor; + this.#previousDescription = this.#description.value = editor.description; + this.#description.dispatchEvent(new Event("input")); + this.#uiManager.removeEditListeners(); + const { + areContours, + outline + } = editor.getSignaturePreview(); + const svgFactory = new DOMSVGFactory(); + const path = svgFactory.createElement("path"); + this.#signatureSVG.append(path); + this.#signatureSVG.setAttribute("viewBox", outline.viewBox); + path.setAttribute("d", outline.toSVGPath()); + if (areContours) { + path.classList.add("contours"); + } + await this.#overlayManager.open(this.#dialog); + } + async #update() { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.signature.edit_description", + data: { + hasBeenChanged: true + } + }); + this.#currentEditor.description = this.#description.value; + this.#finish(); + } + #cancel() { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.signature.edit_description", + data: { + hasBeenChanged: false + } + }); + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + this.#uiManager?.addEditListeners(); + this.#uiManager = null; + this.#currentEditor = null; + this.#signatureSVG.firstElementChild.remove(); + } +} + +;// ./web/toolbar.js + + +class Toolbar { + #colorPicker = null; + #opts; + constructor(options, eventBus, toolbarDensity = 0) { + this.#opts = options; + this.eventBus = eventBus; + const buttons = [{ + element: options.previous, + eventName: "previouspage" + }, { + element: options.next, + eventName: "nextpage" + }, { + element: options.zoomIn, + eventName: "zoomin" + }, { + element: options.zoomOut, + eventName: "zoomout" + }, { + element: options.print, + eventName: "print" + }, { + element: options.download, + eventName: "download" + }, { + element: options.editorFreeTextButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorFreeTextButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.FREETEXT; + } + } + }, { + element: options.editorHighlightButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorHighlightButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.HIGHLIGHT; + } + } + }, { + element: options.editorInkButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorInkButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.INK; + } + } + }, { + element: options.editorStampButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorStampButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.STAMP; + } + }, + telemetry: { + type: "editing", + data: { + action: "pdfjs.image.icon_click" + } + } + }, { + element: options.editorSignatureButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorSignatureButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.SIGNATURE; + } + } + }]; + this.#bindListeners(buttons); + this.#updateToolbarDensity({ + value: toolbarDensity + }); + this.reset(); + } + #updateToolbarDensity({ + value + }) { + let name = "normal"; + switch (value) { + case 1: + name = "compact"; + break; + case 2: + name = "touch"; + break; + } + document.documentElement.setAttribute("data-toolbar-density", name); + } + setPageNumber(pageNumber, pageLabel) { + this.pageNumber = pageNumber; + this.pageLabel = pageLabel; + this.#updateUIState(false); + } + setPagesCount(pagesCount, hasPageLabels) { + this.pagesCount = pagesCount; + this.hasPageLabels = hasPageLabels; + this.#updateUIState(true); + } + setPageScale(pageScaleValue, pageScale) { + this.pageScaleValue = (pageScaleValue || pageScale).toString(); + this.pageScale = pageScale; + this.#updateUIState(false); + } + reset() { + this.#colorPicker = null; + this.pageNumber = 0; + this.pageLabel = null; + this.hasPageLabels = false; + this.pagesCount = 0; + this.pageScaleValue = DEFAULT_SCALE_VALUE; + this.pageScale = DEFAULT_SCALE; + this.#updateUIState(true); + this.updateLoadingIndicatorState(); + this.#editorModeChanged({ + mode: AnnotationEditorType.DISABLE + }); + } + #bindListeners(buttons) { + const { + eventBus + } = this; + const { + editorHighlightColorPicker, + editorHighlightButton, + pageNumber, + scaleSelect + } = this.#opts; + const self = this; + for (const { + element, + eventName, + eventDetails, + telemetry + } of buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + eventBus.dispatch(eventName, { + source: this, + ...eventDetails, + isFromKeyboard: evt.detail === 0 + }); + } + if (telemetry) { + eventBus.dispatch("reporttelemetry", { + source: this, + details: telemetry + }); + } + }); + } + pageNumber.addEventListener("click", function () { + this.select(); + }); + pageNumber.addEventListener("change", function () { + eventBus.dispatch("pagenumberchanged", { + source: self, + value: this.value + }); + }); + scaleSelect.addEventListener("change", function () { + if (this.value === "custom") { + return; + } + eventBus.dispatch("scalechanged", { + source: self, + value: this.value + }); + }); + scaleSelect.addEventListener("click", function ({ + target + }) { + if (this.value === self.pageScaleValue && target.tagName.toUpperCase() === "OPTION") { + this.blur(); + } + }); + scaleSelect.oncontextmenu = noContextMenu; + eventBus._on("annotationeditormodechanged", this.#editorModeChanged.bind(this)); + eventBus._on("showannotationeditorui", ({ + mode + }) => { + switch (mode) { + case AnnotationEditorType.HIGHLIGHT: + editorHighlightButton.click(); + break; + } + }); + eventBus._on("toolbardensity", this.#updateToolbarDensity.bind(this)); + if (editorHighlightColorPicker) { + eventBus._on("annotationeditoruimanager", ({ + uiManager + }) => { + const cp = this.#colorPicker = new ColorPicker({ + uiManager + }); + uiManager.setMainHighlightColorPicker(cp); + editorHighlightColorPicker.append(cp.renderMainDropdown()); + }); + eventBus._on("mainhighlightcolorpickerupdatecolor", ({ + value + }) => { + this.#colorPicker?.updateColor(value); + }); + } + } + #editorModeChanged({ + mode + }) { + const { + editorFreeTextButton, + editorFreeTextParamsToolbar, + editorHighlightButton, + editorHighlightParamsToolbar, + editorInkButton, + editorInkParamsToolbar, + editorStampButton, + editorStampParamsToolbar, + editorSignatureButton, + editorSignatureParamsToolbar + } = this.#opts; + toggleExpandedBtn(editorFreeTextButton, mode === AnnotationEditorType.FREETEXT, editorFreeTextParamsToolbar); + toggleExpandedBtn(editorHighlightButton, mode === AnnotationEditorType.HIGHLIGHT, editorHighlightParamsToolbar); + toggleExpandedBtn(editorInkButton, mode === AnnotationEditorType.INK, editorInkParamsToolbar); + toggleExpandedBtn(editorStampButton, mode === AnnotationEditorType.STAMP, editorStampParamsToolbar); + toggleExpandedBtn(editorSignatureButton, mode === AnnotationEditorType.SIGNATURE, editorSignatureParamsToolbar); + const isDisable = mode === AnnotationEditorType.DISABLE; + editorFreeTextButton.disabled = isDisable; + editorHighlightButton.disabled = isDisable; + editorInkButton.disabled = isDisable; + editorStampButton.disabled = isDisable; + editorSignatureButton.disabled = isDisable; + } + #updateUIState(resetNumPages = false) { + const { + pageNumber, + pagesCount, + pageScaleValue, + pageScale + } = this; + const opts = this.#opts; + if (resetNumPages) { + if (this.hasPageLabels) { + opts.pageNumber.type = "text"; + opts.numPages.setAttribute("data-l10n-id", "pdfjs-page-of-pages"); + } else { + opts.pageNumber.type = "number"; + opts.numPages.setAttribute("data-l10n-id", "pdfjs-of-pages"); + opts.numPages.setAttribute("data-l10n-args", JSON.stringify({ + pagesCount + })); + } + opts.pageNumber.max = pagesCount; + } + if (this.hasPageLabels) { + opts.pageNumber.value = this.pageLabel; + opts.numPages.setAttribute("data-l10n-args", JSON.stringify({ + pageNumber, + pagesCount + })); + } else { + opts.pageNumber.value = pageNumber; + } + opts.previous.disabled = pageNumber <= 1; + opts.next.disabled = pageNumber >= pagesCount; + opts.zoomOut.disabled = pageScale <= MIN_SCALE; + opts.zoomIn.disabled = pageScale >= MAX_SCALE; + let predefinedValueFound = false; + for (const option of opts.scaleSelect.options) { + if (option.value !== pageScaleValue) { + option.selected = false; + continue; + } + option.selected = true; + predefinedValueFound = true; + } + if (!predefinedValueFound) { + opts.customScaleOption.selected = true; + opts.customScaleOption.setAttribute("data-l10n-args", JSON.stringify({ + scale: Math.round(pageScale * 10000) / 100 + })); + } + } + updateLoadingIndicatorState(loading = false) { + const { + pageNumber + } = this.#opts; + pageNumber.classList.toggle("loading", loading); + } +} + +;// ./web/view_history.js +const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; +class ViewHistory { + constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) { + this.fingerprint = fingerprint; + this.cacheSize = cacheSize; + this._initializedPromise = this._readFromStorage().then(databaseStr => { + const database = JSON.parse(databaseStr || "{}"); + let index = -1; + if (!Array.isArray(database.files)) { + database.files = []; + } else { + while (database.files.length >= this.cacheSize) { + database.files.shift(); + } + for (let i = 0, ii = database.files.length; i < ii; i++) { + const branch = database.files[i]; + if (branch.fingerprint === this.fingerprint) { + index = i; + break; + } + } + } + if (index === -1) { + index = database.files.push({ + fingerprint: this.fingerprint + }) - 1; + } + this.file = database.files[index]; + this.database = database; + }); + } + async _writeToStorage() { + const databaseStr = JSON.stringify(this.database); + localStorage.setItem("pdfjs.history", databaseStr); + } + async _readFromStorage() { + return localStorage.getItem("pdfjs.history"); + } + async set(name, val) { + await this._initializedPromise; + this.file[name] = val; + return this._writeToStorage(); + } + async setMultiple(properties) { + await this._initializedPromise; + for (const name in properties) { + this.file[name] = properties[name]; + } + return this._writeToStorage(); + } + async get(name, defaultValue) { + await this._initializedPromise; + const val = this.file[name]; + return val !== undefined ? val : defaultValue; + } + async getMultiple(properties) { + await this._initializedPromise; + const values = Object.create(null); + for (const name in properties) { + const val = this.file[name]; + values[name] = val !== undefined ? val : properties[name]; + } + return values; + } +} + +;// ./web/app.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const FORCE_PAGES_LOADED_TIMEOUT = 10000; +const ViewOnLoad = { + UNKNOWN: -1, + PREVIOUS: 0, + INITIAL: 1 +}; +const PDFViewerApplication = { + initialBookmark: document.location.hash.substring(1), + _initializedCapability: { + ...Promise.withResolvers(), + settled: false + }, + appConfig: null, + pdfDocument: null, + pdfLoadingTask: null, + printService: null, + pdfViewer: null, + pdfThumbnailViewer: null, + pdfRenderingQueue: null, + pdfPresentationMode: null, + pdfDocumentProperties: null, + pdfLinkService: null, + pdfHistory: null, + pdfSidebar: null, + pdfOutlineViewer: null, + pdfAttachmentViewer: null, + pdfLayerViewer: null, + pdfCursorTools: null, + pdfScriptingManager: null, + store: null, + downloadManager: null, + overlayManager: null, + preferences: new Preferences(), + toolbar: null, + secondaryToolbar: null, + eventBus: null, + l10n: null, + annotationEditorParams: null, + imageAltTextSettings: null, + isInitialViewSet: false, + isViewerEmbedded: window.parent !== window, + url: "", + baseUrl: "", + mlManager: null, + _downloadUrl: "", + _eventBusAbortController: null, + _windowAbortController: null, + _globalAbortController: new AbortController(), + documentInfo: null, + metadata: null, + _contentDispositionFilename: null, + _contentLength: null, + _saveInProgress: false, + _wheelUnusedTicks: 0, + _wheelUnusedFactor: 1, + _touchManager: null, + _touchUnusedTicks: 0, + _touchUnusedFactor: 1, + _PDFBug: null, + _hasAnnotationEditors: false, + _title: document.title, + _printAnnotationStoragePromise: null, + _isCtrlKeyDown: false, + _caretBrowsing: null, + _isScrolling: false, + editorUndoBar: null, + async initialize(appConfig) { + this.appConfig = appConfig; + try { + await this.preferences.initializedPromise; + } catch (ex) { + console.error("initialize:", ex); + } + if (AppOptions.get("pdfBugEnabled")) { + await this._parseHashParams(); + } + let mode; + switch (AppOptions.get("viewerCssTheme")) { + case 1: + mode = "light"; + break; + case 2: + mode = "dark"; + break; + } + if (mode) { + docStyle.setProperty("color-scheme", mode); + } + this.l10n = await this.externalServices.createL10n(); + document.getElementsByTagName("html")[0].dir = this.l10n.getDirection(); + this.l10n.translate(appConfig.appContainer || document.documentElement); + if (this.isViewerEmbedded && AppOptions.get("externalLinkTarget") === LinkTarget.NONE) { + AppOptions.set("externalLinkTarget", LinkTarget.TOP); + } + await this._initializeViewerComponents(); + this.bindEvents(); + this.bindWindowEvents(); + this._initializedCapability.settled = true; + this._initializedCapability.resolve(); + }, + async _parseHashParams() { + const hash = document.location.hash.substring(1); + if (!hash) { + return; + } + const { + mainContainer, + viewerContainer + } = this.appConfig, + params = parseQueryString(hash); + const loadPDFBug = async () => { + if (this._PDFBug) { + return; + } + const { + PDFBug + } = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + AppOptions.get("debuggerSrc")); + this._PDFBug = PDFBug; + }; + if (params.get("disableworker") === "true") { + try { + GlobalWorkerOptions.workerSrc ||= AppOptions.get("workerSrc"); + await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + PDFWorker.workerSrc); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + } + if (params.has("textlayer")) { + switch (params.get("textlayer")) { + case "off": + AppOptions.set("textLayerMode", TextLayerMode.DISABLE); + break; + case "visible": + case "shadow": + case "hover": + viewerContainer.classList.add(`textLayer-${params.get("textlayer")}`); + try { + await loadPDFBug(); + this._PDFBug.loadCSS(); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + break; + } + } + if (params.has("pdfbug")) { + AppOptions.setAll({ + pdfBug: true, + fontExtraProperties: true + }); + const enabled = params.get("pdfbug").split(","); + try { + await loadPDFBug(); + this._PDFBug.init(mainContainer, enabled); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + } + if (params.has("locale")) { + AppOptions.set("localeProperties", { + lang: params.get("locale") + }); + } + const opts = { + disableAutoFetch: x => x === "true", + disableFontFace: x => x === "true", + disableHistory: x => x === "true", + disableRange: x => x === "true", + disableStream: x => x === "true", + verbosity: x => x | 0 + }; + for (const name in opts) { + const check = opts[name], + key = name.toLowerCase(); + if (params.has(key)) { + AppOptions.set(name, check(params.get(key))); + } + } + }, + async _initializeViewerComponents() { + const { + appConfig, + externalServices, + l10n, + mlManager + } = this; + const abortSignal = this._globalAbortController.signal; + const eventBus = new EventBus(); + this.eventBus = AppOptions.eventBus = eventBus; + mlManager?.setEventBus(eventBus, abortSignal); + const overlayManager = this.overlayManager = new OverlayManager(); + const renderingQueue = this.pdfRenderingQueue = new PDFRenderingQueue(); + renderingQueue.onIdle = this._cleanup.bind(this); + const linkService = this.pdfLinkService = new PDFLinkService({ + eventBus, + externalLinkTarget: AppOptions.get("externalLinkTarget"), + externalLinkRel: AppOptions.get("externalLinkRel"), + ignoreDestinationZoom: AppOptions.get("ignoreDestinationZoom") + }); + const downloadManager = this.downloadManager = new DownloadManager(); + const findController = this.findController = new PDFFindController({ + linkService, + eventBus, + updateMatchesCountOnProgress: true + }); + const pdfScriptingManager = this.pdfScriptingManager = new PDFScriptingManager({ + eventBus, + externalServices, + docProperties: this._scriptingDocProperties.bind(this) + }); + const container = appConfig.mainContainer, + viewer = appConfig.viewerContainer; + const annotationEditorMode = AppOptions.get("annotationEditorMode"); + const pageColors = AppOptions.get("forcePageColors") || window.matchMedia("(forced-colors: active)").matches ? { + background: AppOptions.get("pageColorsBackground"), + foreground: AppOptions.get("pageColorsForeground") + } : null; + let altTextManager; + if (AppOptions.get("enableUpdatedAddImage")) { + altTextManager = appConfig.newAltTextDialog ? new NewAltTextManager(appConfig.newAltTextDialog, overlayManager, eventBus) : null; + } else { + altTextManager = appConfig.altTextDialog ? new AltTextManager(appConfig.altTextDialog, container, overlayManager, eventBus) : null; + } + if (appConfig.editorUndoBar) { + this.editorUndoBar = new EditorUndoBar(appConfig.editorUndoBar, eventBus); + } + const signatureManager = AppOptions.get("enableSignatureEditor") && appConfig.addSignatureDialog ? new SignatureManager(appConfig.addSignatureDialog, appConfig.editSignatureDialog, appConfig.annotationEditorParams?.editorSignatureAddSignature || null, overlayManager, l10n, externalServices.createSignatureStorage(eventBus, abortSignal), eventBus) : null; + const enableHWA = AppOptions.get("enableHWA"), + maxCanvasPixels = AppOptions.get("maxCanvasPixels"), + maxCanvasDim = AppOptions.get("maxCanvasDim"); + const pdfViewer = this.pdfViewer = new PDFViewer({ + container, + viewer, + eventBus, + renderingQueue, + linkService, + downloadManager, + altTextManager, + signatureManager, + editorUndoBar: this.editorUndoBar, + findController, + scriptingManager: AppOptions.get("enableScripting") && pdfScriptingManager, + l10n, + textLayerMode: AppOptions.get("textLayerMode"), + annotationMode: AppOptions.get("annotationMode"), + annotationEditorMode, + annotationEditorHighlightColors: AppOptions.get("highlightEditorColors"), + enableHighlightFloatingButton: AppOptions.get("enableHighlightFloatingButton"), + enableUpdatedAddImage: AppOptions.get("enableUpdatedAddImage"), + enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage"), + imageResourcesPath: AppOptions.get("imageResourcesPath"), + enablePrintAutoRotate: AppOptions.get("enablePrintAutoRotate"), + maxCanvasPixels, + maxCanvasDim, + enableDetailCanvas: AppOptions.get("enableDetailCanvas"), + enablePermissions: AppOptions.get("enablePermissions"), + pageColors, + mlManager, + abortSignal, + enableHWA, + supportsPinchToZoom: this.supportsPinchToZoom, + enableAutoLinking: AppOptions.get("enableAutoLinking") + }); + renderingQueue.setViewer(pdfViewer); + linkService.setViewer(pdfViewer); + pdfScriptingManager.setViewer(pdfViewer); + if (appConfig.sidebar?.thumbnailView) { + this.pdfThumbnailViewer = new PDFThumbnailViewer({ + container: appConfig.sidebar.thumbnailView, + eventBus, + renderingQueue, + linkService, + maxCanvasPixels, + maxCanvasDim, + pageColors, + abortSignal, + enableHWA + }); + renderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); + } + if (!this.isViewerEmbedded && !AppOptions.get("disableHistory")) { + this.pdfHistory = new PDFHistory({ + linkService, + eventBus + }); + linkService.setHistory(this.pdfHistory); + } + if (!this.supportsIntegratedFind && appConfig.findBar) { + this.findBar = new PDFFindBar(appConfig.findBar, appConfig.principalContainer, eventBus); + } + if (appConfig.annotationEditorParams) { + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { + const editorSignatureButton = appConfig.toolbar?.editorSignatureButton; + if (editorSignatureButton && AppOptions.get("enableSignatureEditor")) { + editorSignatureButton.parentElement.hidden = false; + } + this.annotationEditorParams = new AnnotationEditorParams(appConfig.annotationEditorParams, eventBus); + } else { + for (const id of ["editorModeButtons", "editorModeSeparator"]) { + document.getElementById(id)?.classList.add("hidden"); + } + } + } + if (mlManager && appConfig.secondaryToolbar?.imageAltTextSettingsButton) { + this.imageAltTextSettings = new ImageAltTextSettings(appConfig.altTextSettingsDialog, overlayManager, eventBus, mlManager); + } + if (appConfig.documentProperties) { + this.pdfDocumentProperties = new PDFDocumentProperties(appConfig.documentProperties, overlayManager, eventBus, l10n, () => this._docFilename); + } + if (appConfig.secondaryToolbar?.cursorHandToolButton) { + this.pdfCursorTools = new PDFCursorTools({ + container, + eventBus, + cursorToolOnLoad: AppOptions.get("cursorToolOnLoad") + }); + } + if (appConfig.toolbar) { + this.toolbar = new Toolbar(appConfig.toolbar, eventBus, AppOptions.get("toolbarDensity")); + } + if (appConfig.secondaryToolbar) { + if (AppOptions.get("enableAltText")) { + appConfig.secondaryToolbar.imageAltTextSettingsButton?.classList.remove("hidden"); + appConfig.secondaryToolbar.imageAltTextSettingsSeparator?.classList.remove("hidden"); + } + this.secondaryToolbar = new SecondaryToolbar(appConfig.secondaryToolbar, eventBus); + } + if (this.supportsFullscreen && appConfig.secondaryToolbar?.presentationModeButton) { + this.pdfPresentationMode = new PDFPresentationMode({ + container, + pdfViewer, + eventBus + }); + } + if (appConfig.passwordOverlay) { + this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay, overlayManager, this.isViewerEmbedded); + } + if (appConfig.sidebar?.outlineView) { + this.pdfOutlineViewer = new PDFOutlineViewer({ + container: appConfig.sidebar.outlineView, + eventBus, + l10n, + linkService, + downloadManager + }); + } + if (appConfig.sidebar?.attachmentsView) { + this.pdfAttachmentViewer = new PDFAttachmentViewer({ + container: appConfig.sidebar.attachmentsView, + eventBus, + l10n, + downloadManager + }); + } + if (appConfig.sidebar?.layersView) { + this.pdfLayerViewer = new PDFLayerViewer({ + container: appConfig.sidebar.layersView, + eventBus, + l10n + }); + } + if (appConfig.sidebar) { + this.pdfSidebar = new PDFSidebar({ + elements: appConfig.sidebar, + eventBus, + l10n + }); + this.pdfSidebar.onToggled = this.forceRendering.bind(this); + this.pdfSidebar.onUpdateThumbnails = () => { + for (const pageView of pdfViewer.getCachedPageViews()) { + if (pageView.renderingState === RenderingStates.FINISHED) { + this.pdfThumbnailViewer.getThumbnail(pageView.id - 1)?.setImage(pageView); + } + } + this.pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); + }; + } + }, + async run(config) { + await this.initialize(config); + const { + appConfig, + eventBus + } = this; + let file; + const queryString = document.location.search.substring(1); + const params = parseQueryString(queryString); + file = params.get("file") ?? AppOptions.get("defaultUrl"); + validateFileURL(file); + const fileInput = this._openFileInput = document.createElement("input"); + fileInput.id = "fileInput"; + fileInput.hidden = true; + fileInput.type = "file"; + fileInput.value = null; + document.body.append(fileInput); + fileInput.addEventListener("change", function (evt) { + const { + files + } = evt.target; + if (!files || files.length === 0) { + return; + } + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.target + }); + }); + appConfig.mainContainer.addEventListener("dragover", function (evt) { + for (const item of evt.dataTransfer.items) { + if (item.type === "application/pdf") { + evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + stopEvent(evt); + return; + } + } + }); + appConfig.mainContainer.addEventListener("drop", function (evt) { + if (evt.dataTransfer.files?.[0].type !== "application/pdf") { + return; + } + stopEvent(evt); + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.dataTransfer + }); + }); + if (!AppOptions.get("supportsDocumentFonts")) { + AppOptions.set("disableFontFace", true); + this.l10n.get("pdfjs-web-fonts-disabled").then(msg => { + console.warn(msg); + }); + } + if (!this.supportsPrinting) { + appConfig.toolbar?.print?.classList.add("hidden"); + appConfig.secondaryToolbar?.printButton.classList.add("hidden"); + } + if (!this.supportsFullscreen) { + appConfig.secondaryToolbar?.presentationModeButton.classList.add("hidden"); + } + if (this.supportsIntegratedFind) { + appConfig.findBar?.toggleButton?.classList.add("hidden"); + } + if (file) { + this.open({ + url: file + }); + } else { + this._hideViewBookmark(); + } + }, + get externalServices() { + return shadow(this, "externalServices", new ExternalServices()); + }, + get initialized() { + return this._initializedCapability.settled; + }, + get initializedPromise() { + return this._initializedCapability.promise; + }, + updateZoom(steps, scaleFactor, origin) { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.updateScale({ + drawingDelay: AppOptions.get("defaultZoomDelay"), + steps, + scaleFactor, + origin + }); + }, + zoomIn() { + this.updateZoom(1); + }, + zoomOut() { + this.updateZoom(-1); + }, + zoomReset() { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + }, + touchPinchCallback(origin, prevDistance, distance) { + if (this.supportsPinchToZoom) { + const newScaleFactor = this._accumulateFactor(this.pdfViewer.currentScale, distance / prevDistance, "_touchUnusedFactor"); + this.updateZoom(null, newScaleFactor, origin); + } else { + const PIXELS_PER_LINE_SCALE = 30; + const ticks = this._accumulateTicks((distance - prevDistance) / PIXELS_PER_LINE_SCALE, "_touchUnusedTicks"); + this.updateZoom(ticks, null, origin); + } + }, + touchPinchEndCallback() { + this._touchUnusedTicks = 0; + this._touchUnusedFactor = 1; + }, + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + }, + get page() { + return this.pdfViewer.currentPageNumber; + }, + set page(val) { + this.pdfViewer.currentPageNumber = val; + }, + get supportsPrinting() { + return shadow(this, "supportsPrinting", AppOptions.get("supportsPrinting") && PDFPrintServiceFactory.supportsPrinting); + }, + get supportsFullscreen() { + return shadow(this, "supportsFullscreen", document.fullscreenEnabled); + }, + get supportsPinchToZoom() { + return shadow(this, "supportsPinchToZoom", AppOptions.get("supportsPinchToZoom")); + }, + get supportsIntegratedFind() { + return shadow(this, "supportsIntegratedFind", AppOptions.get("supportsIntegratedFind")); + }, + get loadingBar() { + const barElement = document.getElementById("loadingBar"); + const bar = barElement ? new ProgressBar(barElement) : null; + return shadow(this, "loadingBar", bar); + }, + get supportsMouseWheelZoomCtrlKey() { + return shadow(this, "supportsMouseWheelZoomCtrlKey", AppOptions.get("supportsMouseWheelZoomCtrlKey")); + }, + get supportsMouseWheelZoomMetaKey() { + return shadow(this, "supportsMouseWheelZoomMetaKey", AppOptions.get("supportsMouseWheelZoomMetaKey")); + }, + get supportsCaretBrowsingMode() { + return AppOptions.get("supportsCaretBrowsingMode"); + }, + moveCaret(isUp, select) { + this._caretBrowsing ||= new CaretBrowsingMode(this._globalAbortController.signal, this.appConfig.mainContainer, this.appConfig.viewerContainer, this.appConfig.toolbar?.container); + this._caretBrowsing.moveCaret(isUp, select); + }, + setTitleUsingUrl(url = "", downloadUrl = null) { + this.url = url; + this.baseUrl = updateUrlHash(url, "", true); + if (downloadUrl) { + this._downloadUrl = downloadUrl === url ? this.baseUrl : updateUrlHash(downloadUrl, "", true); + } + if (isDataScheme(url)) { + this._hideViewBookmark(); + } + let title = pdfjs_getPdfFilenameFromUrl(url, ""); + if (!title) { + try { + title = decodeURIComponent(getFilenameFromUrl(url)); + } catch {} + } + this.setTitle(title || url); + }, + setTitle(title = this._title) { + this._title = title; + if (this.isViewerEmbedded) { + return; + } + const editorIndicator = this._hasAnnotationEditors && !this.pdfRenderingQueue.printing; + document.title = `${editorIndicator ? "* " : ""}${title}`; + }, + get _docFilename() { + return this._contentDispositionFilename || pdfjs_getPdfFilenameFromUrl(this.url); + }, + _hideViewBookmark() { + const { + secondaryToolbar + } = this.appConfig; + secondaryToolbar?.viewBookmarkButton.classList.add("hidden"); + if (secondaryToolbar?.presentationModeButton.classList.contains("hidden")) { + document.getElementById("viewBookmarkSeparator")?.classList.add("hidden"); + } + }, + async close() { + this._unblockDocumentLoadEvent(); + this._hideViewBookmark(); + if (!this.pdfLoadingTask) { + return; + } + if (this.pdfDocument?.annotationStorage.size > 0 && this._annotationStorageModified) { + try { + await this.save(); + } catch {} + } + const promises = []; + promises.push(this.pdfLoadingTask.destroy()); + this.pdfLoadingTask = null; + if (this.pdfDocument) { + this.pdfDocument = null; + this.pdfThumbnailViewer?.setDocument(null); + this.pdfViewer.setDocument(null); + this.pdfLinkService.setDocument(null); + this.pdfDocumentProperties?.setDocument(null); + } + this.pdfLinkService.externalLinkEnabled = true; + this.store = null; + this.isInitialViewSet = false; + this.url = ""; + this.baseUrl = ""; + this._downloadUrl = ""; + this.documentInfo = null; + this.metadata = null; + this._contentDispositionFilename = null; + this._contentLength = null; + this._saveInProgress = false; + this._hasAnnotationEditors = false; + promises.push(this.pdfScriptingManager.destroyPromise, this.passwordPrompt.close()); + this.setTitle(); + this.pdfSidebar?.reset(); + this.pdfOutlineViewer?.reset(); + this.pdfAttachmentViewer?.reset(); + this.pdfLayerViewer?.reset(); + this.pdfHistory?.reset(); + this.findBar?.reset(); + this.toolbar?.reset(); + this.secondaryToolbar?.reset(); + this._PDFBug?.cleanup(); + await Promise.all(promises); + }, + async open(args) { + if (this.pdfLoadingTask) { + await this.close(); + } + const workerParams = AppOptions.getAll(OptionKind.WORKER); + Object.assign(GlobalWorkerOptions, workerParams); + if (args.url) { + this.setTitleUsingUrl(args.originalUrl || args.url, args.url); + } + const apiParams = AppOptions.getAll(OptionKind.API); + const loadingTask = getDocument({ + ...apiParams, + ...args + }); + this.pdfLoadingTask = loadingTask; + loadingTask.onPassword = (updateCallback, reason) => { + if (this.isViewerEmbedded) { + this._unblockDocumentLoadEvent(); + } + this.pdfLinkService.externalLinkEnabled = false; + this.passwordPrompt.setUpdateCallback(updateCallback, reason); + this.passwordPrompt.open(); + }; + loadingTask.onProgress = ({ + loaded, + total + }) => { + this.progress(loaded / total); + }; + return loadingTask.promise.then(pdfDocument => { + this.load(pdfDocument); + }, reason => { + if (loadingTask !== this.pdfLoadingTask) { + return undefined; + } + let key = "pdfjs-loading-error"; + if (reason instanceof InvalidPDFException) { + key = "pdfjs-invalid-file-error"; + } else if (reason instanceof ResponseException) { + key = reason.missing ? "pdfjs-missing-file-error" : "pdfjs-unexpected-response-error"; + } + return this._documentError(key, { + message: reason.message + }).then(() => { + throw reason; + }); + }); + }, + async download() { + let data; + try { + data = await (this.pdfDocument ? this.pdfDocument.getData() : this.pdfLoadingTask.getData()); + } catch {} + this.downloadManager.download(data, this._downloadUrl, this._docFilename); + }, + async save() { + if (this._saveInProgress) { + return; + } + this._saveInProgress = true; + await this.pdfScriptingManager.dispatchWillSave(); + try { + const data = await this.pdfDocument.saveDocument(); + this.downloadManager.download(data, this._downloadUrl, this._docFilename); + } catch (reason) { + console.error(`Error when saving the document:`, reason); + await this.download(); + } finally { + await this.pdfScriptingManager.dispatchDidSave(); + this._saveInProgress = false; + } + if (this._hasAnnotationEditors) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "save", + stats: this.pdfDocument?.annotationStorage.editorStats + } + }); + } + }, + async downloadOrSave() { + const { + classList + } = this.appConfig.appContainer; + classList.add("wait"); + await (this.pdfDocument?.annotationStorage.size > 0 ? this.save() : this.download()); + classList.remove("wait"); + }, + async _documentError(key, moreInfo = null) { + this._unblockDocumentLoadEvent(); + const message = await this._otherError(key || "pdfjs-loading-error", moreInfo); + this.eventBus.dispatch("documenterror", { + source: this, + message, + reason: moreInfo?.message ?? null + }); + }, + async _otherError(key, moreInfo = null) { + const message = await this.l10n.get(key); + const moreInfoText = [`PDF.js v${version || "?"} (build: ${build || "?"})`]; + if (moreInfo) { + moreInfoText.push(`Message: ${moreInfo.message}`); + if (moreInfo.stack) { + moreInfoText.push(`Stack: ${moreInfo.stack}`); + } else { + if (moreInfo.filename) { + moreInfoText.push(`File: ${moreInfo.filename}`); + } + if (moreInfo.lineNumber) { + moreInfoText.push(`Line: ${moreInfo.lineNumber}`); + } + } + } + console.error(`${message}\n\n${moreInfoText.join("\n")}`); + return message; + }, + progress(level) { + const percent = Math.round(level * 100); + if (!this.loadingBar || percent <= this.loadingBar.percent) { + return; + } + this.loadingBar.percent = percent; + if (this.pdfDocument?.loadingParams.disableAutoFetch ?? AppOptions.get("disableAutoFetch")) { + this.loadingBar.setDisableAutoFetch(); + } + }, + load(pdfDocument) { + this.pdfDocument = pdfDocument; + pdfDocument.getDownloadInfo().then(({ + length + }) => { + this._contentLength = length; + this.loadingBar?.hide(); + firstPagePromise.then(() => { + this.eventBus.dispatch("documentloaded", { + source: this + }); + }); + }); + const pageLayoutPromise = pdfDocument.getPageLayout().catch(() => {}); + const pageModePromise = pdfDocument.getPageMode().catch(() => {}); + const openActionPromise = pdfDocument.getOpenAction().catch(() => {}); + this.toolbar?.setPagesCount(pdfDocument.numPages, false); + this.secondaryToolbar?.setPagesCount(pdfDocument.numPages); + this.pdfLinkService.setDocument(pdfDocument); + this.pdfDocumentProperties?.setDocument(pdfDocument); + const pdfViewer = this.pdfViewer; + pdfViewer.setDocument(pdfDocument); + const { + firstPagePromise, + onePageRendered, + pagesPromise + } = pdfViewer; + this.pdfThumbnailViewer?.setDocument(pdfDocument); + const storedPromise = (this.store = new ViewHistory(pdfDocument.fingerprints[0])).getMultiple({ + page: null, + zoom: DEFAULT_SCALE_VALUE, + scrollLeft: "0", + scrollTop: "0", + rotation: null, + sidebarView: SidebarView.UNKNOWN, + scrollMode: ScrollMode.UNKNOWN, + spreadMode: SpreadMode.UNKNOWN + }).catch(() => {}); + firstPagePromise.then(pdfPage => { + this.loadingBar?.setWidth(this.appConfig.viewerContainer); + this._initializeAnnotationStorageCallbacks(pdfDocument); + Promise.all([animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => { + const viewOnLoad = AppOptions.get("viewOnLoad"); + this._initializePdfHistory({ + fingerprint: pdfDocument.fingerprints[0], + viewOnLoad, + initialDest: openAction?.dest + }); + const initialBookmark = this.initialBookmark; + const zoom = AppOptions.get("defaultZoomValue"); + let hash = zoom ? `zoom=${zoom}` : null; + let rotation = null; + let sidebarView = AppOptions.get("sidebarViewOnLoad"); + let scrollMode = AppOptions.get("scrollModeOnLoad"); + let spreadMode = AppOptions.get("spreadModeOnLoad"); + if (stored?.page && viewOnLoad !== ViewOnLoad.INITIAL) { + hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`; + rotation = parseInt(stored.rotation, 10); + if (sidebarView === SidebarView.UNKNOWN) { + sidebarView = stored.sidebarView | 0; + } + if (scrollMode === ScrollMode.UNKNOWN) { + scrollMode = stored.scrollMode | 0; + } + if (spreadMode === SpreadMode.UNKNOWN) { + spreadMode = stored.spreadMode | 0; + } + } + if (pageMode && sidebarView === SidebarView.UNKNOWN) { + sidebarView = apiPageModeToSidebarView(pageMode); + } + if (pageLayout && scrollMode === ScrollMode.UNKNOWN && spreadMode === SpreadMode.UNKNOWN) { + const modes = apiPageLayoutToViewerModes(pageLayout); + spreadMode = modes.spreadMode; + } + this.setInitialView(hash, { + rotation, + sidebarView, + scrollMode, + spreadMode + }); + this.eventBus.dispatch("documentinit", { + source: this + }); + if (!this.isViewerEmbedded) { + pdfViewer.focus(); + } + await Promise.race([pagesPromise, new Promise(resolve => { + setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT); + })]); + if (!initialBookmark && !hash) { + return; + } + if (pdfViewer.hasEqualPageSizes) { + return; + } + this.initialBookmark = initialBookmark; + pdfViewer.currentScaleValue = pdfViewer.currentScaleValue; + this.setInitialView(hash); + }).catch(() => { + this.setInitialView(); + }).then(function () { + pdfViewer.update(); + }); + }); + pagesPromise.then(() => { + this._unblockDocumentLoadEvent(); + this._initializeAutoPrint(pdfDocument, openActionPromise); + }, reason => { + this._documentError("pdfjs-loading-error", { + message: reason.message + }); + }); + onePageRendered.then(data => { + this.externalServices.reportTelemetry({ + type: "pageInfo", + timestamp: data.timestamp + }); + if (this.pdfOutlineViewer) { + pdfDocument.getOutline().then(outline => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfOutlineViewer.render({ + outline, + pdfDocument + }); + }); + } + if (this.pdfAttachmentViewer) { + pdfDocument.getAttachments().then(attachments => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfAttachmentViewer.render({ + attachments + }); + }); + } + if (this.pdfLayerViewer) { + pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfLayerViewer.render({ + optionalContentConfig, + pdfDocument + }); + }); + } + }); + this._initializePageLabels(pdfDocument); + this._initializeMetadata(pdfDocument); + }, + async _scriptingDocProperties(pdfDocument) { + if (!this.documentInfo) { + await new Promise(resolve => { + this.eventBus._on("metadataloaded", resolve, { + once: true + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + if (!this._contentLength) { + await new Promise(resolve => { + this.eventBus._on("documentloaded", resolve, { + once: true + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + return { + ...this.documentInfo, + baseURL: this.baseUrl, + filesize: this._contentLength, + filename: this._docFilename, + metadata: this.metadata?.getRaw(), + authors: this.metadata?.get("dc:creator"), + numPages: this.pagesCount, + URL: this.url + }; + }, + async _initializeAutoPrint(pdfDocument, openActionPromise) { + const [openAction, jsActions] = await Promise.all([openActionPromise, this.pdfViewer.enableScripting ? null : pdfDocument.getJSActions()]); + if (pdfDocument !== this.pdfDocument) { + return; + } + let triggerAutoPrint = openAction?.action === "Print"; + if (jsActions) { + console.warn("Warning: JavaScript support is not enabled"); + for (const name in jsActions) { + if (triggerAutoPrint) { + break; + } + switch (name) { + case "WillClose": + case "WillSave": + case "DidSave": + case "WillPrint": + case "DidPrint": + continue; + } + triggerAutoPrint = jsActions[name].some(js => AutoPrintRegExp.test(js)); + } + } + if (triggerAutoPrint) { + this.triggerPrinting(); + } + }, + async _initializeMetadata(pdfDocument) { + const { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + if (pdfDocument !== this.pdfDocument) { + return; + } + this.documentInfo = info; + this.metadata = metadata; + this._contentDispositionFilename ??= contentDispositionFilename; + this._contentLength ??= contentLength; + console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(info.Producer || "-").trim()} / ${(info.Creator || "-").trim()}] ` + `(PDF.js: ${version || "?"} [${build || "?"}])`); + let pdfTitle = info.Title; + const metadataTitle = metadata?.get("dc:title"); + if (metadataTitle) { + if (metadataTitle !== "Untitled" && !/[\uFFF0-\uFFFF]/g.test(metadataTitle)) { + pdfTitle = metadataTitle; + } + } + if (pdfTitle) { + this.setTitle(`${pdfTitle} - ${this._contentDispositionFilename || this._title}`); + } else if (this._contentDispositionFilename) { + this.setTitle(this._contentDispositionFilename); + } + if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) { + if (pdfDocument.loadingParams.enableXfa) { + console.warn("Warning: XFA Foreground documents are not supported"); + } else { + console.warn("Warning: XFA support is not enabled"); + } + } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderForms) { + console.warn("Warning: Interactive form support is not enabled"); + } + if (info.IsSignaturesPresent) { + console.warn("Warning: Digital signatures validation is not supported"); + } + this.eventBus.dispatch("metadataloaded", { + source: this + }); + }, + async _initializePageLabels(pdfDocument) { + const labels = await pdfDocument.getPageLabels(); + if (pdfDocument !== this.pdfDocument) { + return; + } + if (!labels || AppOptions.get("disablePageLabels")) { + return; + } + const numLabels = labels.length; + let standardLabels = 0, + emptyLabels = 0; + for (let i = 0; i < numLabels; i++) { + const label = labels[i]; + if (label === (i + 1).toString()) { + standardLabels++; + } else if (label === "") { + emptyLabels++; + } else { + break; + } + } + if (standardLabels >= numLabels || emptyLabels >= numLabels) { + return; + } + const { + pdfViewer, + pdfThumbnailViewer, + toolbar + } = this; + pdfViewer.setPageLabels(labels); + pdfThumbnailViewer?.setPageLabels(labels); + toolbar?.setPagesCount(numLabels, true); + toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + }, + _initializePdfHistory({ + fingerprint, + viewOnLoad, + initialDest = null + }) { + if (!this.pdfHistory) { + return; + } + this.pdfHistory.initialize({ + fingerprint, + resetHistory: viewOnLoad === ViewOnLoad.INITIAL, + updateUrl: AppOptions.get("historyUpdateUrl") + }); + if (this.pdfHistory.initialBookmark) { + this.initialBookmark = this.pdfHistory.initialBookmark; + this.initialRotation = this.pdfHistory.initialRotation; + } + if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) { + this.initialBookmark = JSON.stringify(initialDest); + this.pdfHistory.push({ + explicitDest: initialDest, + pageNumber: null + }); + } + }, + _initializeAnnotationStorageCallbacks(pdfDocument) { + if (pdfDocument !== this.pdfDocument) { + return; + } + const { + annotationStorage + } = pdfDocument; + annotationStorage.onSetModified = () => { + window.addEventListener("beforeunload", beforeUnload); + this._annotationStorageModified = true; + }; + annotationStorage.onResetModified = () => { + window.removeEventListener("beforeunload", beforeUnload); + delete this._annotationStorageModified; + }; + annotationStorage.onAnnotationEditor = typeStr => { + this._hasAnnotationEditors = !!typeStr; + this.setTitle(); + }; + }, + setInitialView(storedHash, { + rotation, + sidebarView, + scrollMode, + spreadMode + } = {}) { + const setRotation = angle => { + if (isValidRotation(angle)) { + this.pdfViewer.pagesRotation = angle; + } + }; + const setViewerModes = (scroll, spread) => { + if (isValidScrollMode(scroll)) { + this.pdfViewer.scrollMode = scroll; + } + if (isValidSpreadMode(spread)) { + this.pdfViewer.spreadMode = spread; + } + }; + this.isInitialViewSet = true; + this.pdfSidebar?.setInitialView(sidebarView); + setViewerModes(scrollMode, spreadMode); + if (this.initialBookmark) { + setRotation(this.initialRotation); + delete this.initialRotation; + this.pdfLinkService.setHash(this.initialBookmark); + this.initialBookmark = null; + } else if (storedHash) { + setRotation(rotation); + this.pdfLinkService.setHash(storedHash); + } + this.toolbar?.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel); + this.secondaryToolbar?.setPageNumber(this.pdfViewer.currentPageNumber); + if (!this.pdfViewer.currentScaleValue) { + this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + } + }, + _cleanup() { + if (!this.pdfDocument) { + return; + } + this.pdfViewer.cleanup(); + this.pdfThumbnailViewer?.cleanup(); + this.pdfDocument.cleanup(AppOptions.get("fontExtraProperties")); + }, + forceRendering() { + this.pdfRenderingQueue.printing = !!this.printService; + this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar?.visibleView === SidebarView.THUMBS; + this.pdfRenderingQueue.renderHighestPriority(); + }, + beforePrint() { + this._printAnnotationStoragePromise = this.pdfScriptingManager.dispatchWillPrint().catch(() => {}).then(() => this.pdfDocument?.annotationStorage.print); + if (this.printService) { + return; + } + if (!this.supportsPrinting) { + this._otherError("pdfjs-printing-not-supported"); + return; + } + if (!this.pdfViewer.pageViewsReady) { + this.l10n.get("pdfjs-printing-not-ready").then(msg => { + window.alert(msg); + }); + return; + } + this.printService = PDFPrintServiceFactory.createPrintService({ + pdfDocument: this.pdfDocument, + pagesOverview: this.pdfViewer.getPagesOverview(), + printContainer: this.appConfig.printContainer, + printResolution: AppOptions.get("printResolution"), + printAnnotationStoragePromise: this._printAnnotationStoragePromise + }); + this.forceRendering(); + this.setTitle(); + this.printService.layout(); + if (this._hasAnnotationEditors) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "print", + stats: this.pdfDocument?.annotationStorage.editorStats + } + }); + } + }, + afterPrint() { + if (this._printAnnotationStoragePromise) { + this._printAnnotationStoragePromise.then(() => { + this.pdfScriptingManager.dispatchDidPrint(); + }); + this._printAnnotationStoragePromise = null; + } + if (this.printService) { + this.printService.destroy(); + this.printService = null; + this.pdfDocument?.annotationStorage.resetModified(); + } + this.forceRendering(); + this.setTitle(); + }, + rotatePages(delta) { + this.pdfViewer.pagesRotation += delta; + }, + requestPresentationMode() { + this.pdfPresentationMode?.request(); + }, + triggerPrinting() { + if (this.supportsPrinting) { + window.print(); + } + }, + bindEvents() { + if (this._eventBusAbortController) { + return; + } + const ac = this._eventBusAbortController = new AbortController(); + const opts = { + signal: ac.signal + }; + const { + eventBus, + externalServices, + pdfDocumentProperties, + pdfViewer, + preferences + } = this; + eventBus._on("resize", onResize.bind(this), opts); + eventBus._on("hashchange", onHashchange.bind(this), opts); + eventBus._on("beforeprint", this.beforePrint.bind(this), opts); + eventBus._on("afterprint", this.afterPrint.bind(this), opts); + eventBus._on("pagerender", onPageRender.bind(this), opts); + eventBus._on("pagerendered", onPageRendered.bind(this), opts); + eventBus._on("updateviewarea", onUpdateViewarea.bind(this), opts); + eventBus._on("pagechanging", onPageChanging.bind(this), opts); + eventBus._on("scalechanging", onScaleChanging.bind(this), opts); + eventBus._on("rotationchanging", onRotationChanging.bind(this), opts); + eventBus._on("sidebarviewchanged", onSidebarViewChanged.bind(this), opts); + eventBus._on("pagemode", onPageMode.bind(this), opts); + eventBus._on("namedaction", onNamedAction.bind(this), opts); + eventBus._on("presentationmodechanged", evt => pdfViewer.presentationModeState = evt.state, opts); + eventBus._on("presentationmode", this.requestPresentationMode.bind(this), opts); + eventBus._on("switchannotationeditormode", evt => pdfViewer.annotationEditorMode = evt, opts); + eventBus._on("print", this.triggerPrinting.bind(this), opts); + eventBus._on("download", this.downloadOrSave.bind(this), opts); + eventBus._on("firstpage", () => this.page = 1, opts); + eventBus._on("lastpage", () => this.page = this.pagesCount, opts); + eventBus._on("nextpage", () => pdfViewer.nextPage(), opts); + eventBus._on("previouspage", () => pdfViewer.previousPage(), opts); + eventBus._on("zoomin", this.zoomIn.bind(this), opts); + eventBus._on("zoomout", this.zoomOut.bind(this), opts); + eventBus._on("zoomreset", this.zoomReset.bind(this), opts); + eventBus._on("pagenumberchanged", onPageNumberChanged.bind(this), opts); + eventBus._on("scalechanged", evt => pdfViewer.currentScaleValue = evt.value, opts); + eventBus._on("rotatecw", this.rotatePages.bind(this, 90), opts); + eventBus._on("rotateccw", this.rotatePages.bind(this, -90), opts); + eventBus._on("optionalcontentconfig", evt => pdfViewer.optionalContentConfigPromise = evt.promise, opts); + eventBus._on("switchscrollmode", evt => pdfViewer.scrollMode = evt.mode, opts); + eventBus._on("scrollmodechanged", onViewerModesChanged.bind(this, "scrollMode"), opts); + eventBus._on("switchspreadmode", evt => pdfViewer.spreadMode = evt.mode, opts); + eventBus._on("spreadmodechanged", onViewerModesChanged.bind(this, "spreadMode"), opts); + eventBus._on("imagealttextsettings", onImageAltTextSettings.bind(this), opts); + eventBus._on("documentproperties", () => pdfDocumentProperties?.open(), opts); + eventBus._on("findfromurlhash", onFindFromUrlHash.bind(this), opts); + eventBus._on("updatefindmatchescount", onUpdateFindMatchesCount.bind(this), opts); + eventBus._on("updatefindcontrolstate", onUpdateFindControlState.bind(this), opts); + eventBus._on("fileinputchange", onFileInputChange.bind(this), opts); + eventBus._on("openfile", onOpenFile.bind(this), opts); + }, + bindWindowEvents() { + if (this._windowAbortController) { + return; + } + this._windowAbortController = new AbortController(); + const { + eventBus, + appConfig: { + mainContainer + }, + pdfViewer, + _windowAbortController: { + signal + } + } = this; + this._touchManager = new TouchManager({ + container: window, + isPinchingDisabled: () => pdfViewer.isInPresentationMode, + isPinchingStopped: () => this.overlayManager?.active, + onPinching: this.touchPinchCallback.bind(this), + onPinchEnd: this.touchPinchEndCallback.bind(this), + signal + }); + function addWindowResolutionChange(evt = null) { + if (evt) { + pdfViewer.refresh(); + } + const mediaQueryList = window.matchMedia(`(resolution: ${OutputScale.pixelRatio}dppx)`); + mediaQueryList.addEventListener("change", addWindowResolutionChange, { + once: true, + signal + }); + } + addWindowResolutionChange(); + window.addEventListener("wheel", onWheel.bind(this), { + passive: false, + signal + }); + window.addEventListener("click", onClick.bind(this), { + signal + }); + window.addEventListener("keydown", onKeyDown.bind(this), { + signal + }); + window.addEventListener("keyup", onKeyUp.bind(this), { + signal + }); + window.addEventListener("resize", () => eventBus.dispatch("resize", { + source: window + }), { + signal + }); + window.addEventListener("hashchange", () => { + eventBus.dispatch("hashchange", { + source: window, + hash: document.location.hash.substring(1) + }); + }, { + signal + }); + window.addEventListener("beforeprint", () => eventBus.dispatch("beforeprint", { + source: window + }), { + signal + }); + window.addEventListener("afterprint", () => eventBus.dispatch("afterprint", { + source: window + }), { + signal + }); + window.addEventListener("updatefromsandbox", evt => { + eventBus.dispatch("updatefromsandbox", { + source: window, + detail: evt.detail + }); + }, { + signal + }); + if (!("onscrollend" in document.documentElement)) { + return; + } + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + const scrollend = () => { + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + this._isScrolling = false; + mainContainer.addEventListener("scroll", scroll, { + passive: true, + signal + }); + mainContainer.removeEventListener("scrollend", scrollend); + mainContainer.removeEventListener("blur", scrollend); + }; + const scroll = () => { + if (this._isCtrlKeyDown) { + return; + } + if (this._lastScrollTop === mainContainer.scrollTop && this._lastScrollLeft === mainContainer.scrollLeft) { + return; + } + mainContainer.removeEventListener("scroll", scroll); + this._isScrolling = true; + mainContainer.addEventListener("scrollend", scrollend, { + signal + }); + mainContainer.addEventListener("blur", scrollend, { + signal + }); + }; + mainContainer.addEventListener("scroll", scroll, { + passive: true, + signal + }); + }, + unbindEvents() { + this._eventBusAbortController?.abort(); + this._eventBusAbortController = null; + }, + unbindWindowEvents() { + this._windowAbortController?.abort(); + this._windowAbortController = null; + this._touchManager = null; + }, + async testingClose() { + this.unbindEvents(); + this.unbindWindowEvents(); + this._globalAbortController?.abort(); + this._globalAbortController = null; + this.findBar?.close(); + await Promise.all([this.l10n?.destroy(), this.close()]); + }, + _accumulateTicks(ticks, prop) { + if (this[prop] > 0 && ticks < 0 || this[prop] < 0 && ticks > 0) { + this[prop] = 0; + } + this[prop] += ticks; + const wholeTicks = Math.trunc(this[prop]); + this[prop] -= wholeTicks; + return wholeTicks; + }, + _accumulateFactor(previousScale, factor, prop) { + if (factor === 1) { + return 1; + } + if (this[prop] > 1 && factor < 1 || this[prop] < 1 && factor > 1) { + this[prop] = 1; + } + const newFactor = Math.floor(previousScale * factor * this[prop] * 100) / (100 * previousScale); + this[prop] = factor / newFactor; + return newFactor; + }, + _unblockDocumentLoadEvent() { + document.blockUnblockOnload?.(false); + this._unblockDocumentLoadEvent = () => {}; + }, + get scriptingReady() { + return this.pdfScriptingManager.ready; + } +}; +initCom(PDFViewerApplication); +{ + PDFPrintServiceFactory.initGlobals(PDFViewerApplication); +} +{ + const HOSTED_VIEWER_ORIGINS = new Set(["null", "http://mozilla.github.io", "https://mozilla.github.io"]); + var validateFileURL = function (file) { + if (!file) { + return; + } + const viewerOrigin = URL.parse(window.location)?.origin || "null"; + if (HOSTED_VIEWER_ORIGINS.has(viewerOrigin)) { + return; + } + const fileOrigin = URL.parse(file, window.location)?.origin; + if (fileOrigin === viewerOrigin) { + return; + } + const ex = new Error("file origin does not match viewer's"); + PDFViewerApplication._documentError("pdfjs-loading-error", { + message: ex.message + }); + throw ex; + }; + var onFileInputChange = function (evt) { + if (this.pdfViewer?.isInPresentationMode) { + return; + } + const file = evt.fileInput.files[0]; + this.open({ + url: URL.createObjectURL(file), + originalUrl: file.name + }); + }; + var onOpenFile = function (evt) { + this._openFileInput?.click(); + }; +} +function onPageRender({ + pageNumber +}) { + if (pageNumber === this.page) { + this.toolbar?.updateLoadingIndicatorState(true); + } +} +function onPageRendered({ + pageNumber, + isDetailView, + error +}) { + if (pageNumber === this.page) { + this.toolbar?.updateLoadingIndicatorState(false); + } + if (!isDetailView && this.pdfSidebar?.visibleView === SidebarView.THUMBS) { + const pageView = this.pdfViewer.getPageView(pageNumber - 1); + const thumbnailView = this.pdfThumbnailViewer?.getThumbnail(pageNumber - 1); + if (pageView) { + thumbnailView?.setImage(pageView); + } + } + if (error) { + this._otherError("pdfjs-rendering-error", error); + } +} +function onPageMode({ + mode +}) { + let view; + switch (mode) { + case "thumbs": + view = SidebarView.THUMBS; + break; + case "bookmarks": + case "outline": + view = SidebarView.OUTLINE; + break; + case "attachments": + view = SidebarView.ATTACHMENTS; + break; + case "layers": + view = SidebarView.LAYERS; + break; + case "none": + view = SidebarView.NONE; + break; + default: + console.error('Invalid "pagemode" hash parameter: ' + mode); + return; + } + this.pdfSidebar?.switchView(view, true); +} +function onNamedAction(evt) { + switch (evt.action) { + case "GoToPage": + this.appConfig.toolbar?.pageNumber.select(); + break; + case "Find": + if (!this.supportsIntegratedFind) { + this.findBar?.toggle(); + } + break; + case "Print": + this.triggerPrinting(); + break; + case "SaveAs": + this.downloadOrSave(); + break; + } +} +function onSidebarViewChanged({ + view +}) { + this.pdfRenderingQueue.isThumbnailViewEnabled = view === SidebarView.THUMBS; + if (this.isInitialViewSet) { + this.store?.set("sidebarView", view).catch(() => {}); + } +} +function onUpdateViewarea({ + location +}) { + if (this.isInitialViewSet) { + this.store?.setMultiple({ + page: location.pageNumber, + zoom: location.scale, + scrollLeft: location.left, + scrollTop: location.top, + rotation: location.rotation + }).catch(() => {}); + } + if (this.appConfig.secondaryToolbar) { + this.appConfig.secondaryToolbar.viewBookmarkButton.href = this.pdfLinkService.getAnchorUrl(location.pdfOpenParams); + } +} +function onViewerModesChanged(name, evt) { + if (this.isInitialViewSet && !this.pdfViewer.isInPresentationMode) { + this.store?.set(name, evt.mode).catch(() => {}); + } +} +function onResize() { + const { + pdfDocument, + pdfViewer, + pdfRenderingQueue + } = this; + if (pdfRenderingQueue.printing && window.matchMedia("print").matches) { + return; + } + if (!pdfDocument) { + return; + } + const currentScaleValue = pdfViewer.currentScaleValue; + if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") { + pdfViewer.currentScaleValue = currentScaleValue; + } + pdfViewer.update(); +} +function onHashchange(evt) { + const hash = evt.hash; + if (!hash) { + return; + } + if (!this.isInitialViewSet) { + this.initialBookmark = hash; + } else if (!this.pdfHistory?.popStateInProgress) { + this.pdfLinkService.setHash(hash); + } +} +function onPageNumberChanged(evt) { + const { + pdfViewer + } = this; + if (evt.value !== "") { + this.pdfLinkService.goToPage(evt.value); + } + if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) { + this.toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + } +} +function onImageAltTextSettings() { + this.imageAltTextSettings?.open({ + enableGuessAltText: AppOptions.get("enableGuessAltText"), + enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage") + }); +} +function onFindFromUrlHash(evt) { + this.eventBus.dispatch("find", { + source: evt.source, + type: "", + query: evt.query, + caseSensitive: false, + entireWord: false, + highlightAll: true, + findPrevious: false, + matchDiacritics: true + }); +} +function onUpdateFindMatchesCount({ + matchesCount +}) { + if (this.supportsIntegratedFind) { + this.externalServices.updateFindMatchesCount(matchesCount); + } else { + this.findBar?.updateResultsCount(matchesCount); + } +} +function onUpdateFindControlState({ + state, + previous, + entireWord, + matchesCount, + rawQuery +}) { + if (this.supportsIntegratedFind) { + this.externalServices.updateFindControlState({ + result: state, + findPrevious: previous, + entireWord, + matchesCount, + rawQuery + }); + } else { + this.findBar?.updateUIState(state, previous, matchesCount); + } +} +function onScaleChanging(evt) { + this.toolbar?.setPageScale(evt.presetValue, evt.scale); + this.pdfViewer.update(); +} +function onRotationChanging(evt) { + if (this.pdfThumbnailViewer) { + this.pdfThumbnailViewer.pagesRotation = evt.pagesRotation; + } + this.forceRendering(); + this.pdfViewer.currentPageNumber = evt.pageNumber; +} +function onPageChanging({ + pageNumber, + pageLabel +}) { + this.toolbar?.setPageNumber(pageNumber, pageLabel); + this.secondaryToolbar?.setPageNumber(pageNumber); + if (this.pdfSidebar?.visibleView === SidebarView.THUMBS) { + this.pdfThumbnailViewer?.scrollThumbnailIntoView(pageNumber); + } + const currentPage = this.pdfViewer.getPageView(pageNumber - 1); + this.toolbar?.updateLoadingIndicatorState(currentPage?.renderingState === RenderingStates.RUNNING); +} +function onWheel(evt) { + const { + pdfViewer, + supportsMouseWheelZoomCtrlKey, + supportsMouseWheelZoomMetaKey, + supportsPinchToZoom + } = this; + if (pdfViewer.isInPresentationMode) { + return; + } + const deltaMode = evt.deltaMode; + let scaleFactor = Math.exp(-evt.deltaY / 100); + const isBuiltInMac = false; + const isPinchToZoom = evt.ctrlKey && !this._isCtrlKeyDown && deltaMode === WheelEvent.DOM_DELTA_PIXEL && evt.deltaX === 0 && (Math.abs(scaleFactor - 1) < 0.05 || isBuiltInMac) && evt.deltaZ === 0; + const origin = [evt.clientX, evt.clientY]; + if (isPinchToZoom || evt.ctrlKey && supportsMouseWheelZoomCtrlKey || evt.metaKey && supportsMouseWheelZoomMetaKey) { + evt.preventDefault(); + if (this._isScrolling || document.visibilityState === "hidden" || this.overlayManager.active) { + return; + } + if (isPinchToZoom && supportsPinchToZoom) { + scaleFactor = this._accumulateFactor(pdfViewer.currentScale, scaleFactor, "_wheelUnusedFactor"); + this.updateZoom(null, scaleFactor, origin); + } else { + const delta = normalizeWheelEventDirection(evt); + let ticks = 0; + if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) { + ticks = Math.abs(delta) >= 1 ? Math.sign(delta) : this._accumulateTicks(delta, "_wheelUnusedTicks"); + } else { + const PIXELS_PER_LINE_SCALE = 30; + ticks = this._accumulateTicks(delta / PIXELS_PER_LINE_SCALE, "_wheelUnusedTicks"); + } + this.updateZoom(ticks, null, origin); + } + } +} +function closeSecondaryToolbar({ + target +}) { + if (!this.secondaryToolbar?.isOpen) { + return; + } + const { + toolbar, + secondaryToolbar + } = this.appConfig; + if (this.pdfViewer.containsElement(target) || toolbar?.container.contains(target) && !secondaryToolbar?.toolbar.contains(target) && !secondaryToolbar?.toggleButton.contains(target)) { + this.secondaryToolbar.close(); + } +} +function closeEditorUndoBar(evt) { + if (!this.editorUndoBar?.isOpen) { + return; + } + if (this.appConfig.secondaryToolbar?.toolbar.contains(evt.target)) { + this.editorUndoBar.hide(); + } +} +function onClick(evt) { + closeSecondaryToolbar.call(this, evt); + closeEditorUndoBar.call(this, evt); +} +function onKeyUp(evt) { + if (evt.key === "Control") { + this._isCtrlKeyDown = false; + } +} +function onKeyDown(evt) { + this._isCtrlKeyDown = evt.key === "Control"; + if (this.editorUndoBar?.isOpen && evt.keyCode !== 9 && evt.keyCode !== 16 && !((evt.keyCode === 13 || evt.keyCode === 32) && getActiveOrFocusedElement() === this.appConfig.editorUndoBar.undoButton)) { + this.editorUndoBar.hide(); + } + if (this.overlayManager.active) { + return; + } + const { + eventBus, + pdfViewer + } = this; + const isViewerInPresentationMode = pdfViewer.isInPresentationMode; + let handled = false, + ensureViewerFocused = false; + const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); + if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { + switch (evt.keyCode) { + case 70: + if (!this.supportsIntegratedFind && !evt.shiftKey) { + this.findBar?.open(); + handled = true; + } + break; + case 71: + if (!this.supportsIntegratedFind) { + const { + state + } = this.findController; + if (state) { + const newState = { + source: window, + type: "again", + findPrevious: cmd === 5 || cmd === 12 + }; + eventBus.dispatch("find", { + ...state, + ...newState + }); + } + handled = true; + } + break; + case 61: + case 107: + case 187: + case 171: + this.zoomIn(); + handled = true; + break; + case 173: + case 109: + case 189: + this.zoomOut(); + handled = true; + break; + case 48: + case 96: + if (!isViewerInPresentationMode) { + setTimeout(() => { + this.zoomReset(); + }); + handled = false; + } + break; + case 38: + if (isViewerInPresentationMode || this.page > 1) { + this.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 40: + if (isViewerInPresentationMode || this.page < this.pagesCount) { + this.page = this.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + } + } + if (cmd === 1 || cmd === 8) { + switch (evt.keyCode) { + case 83: + eventBus.dispatch("download", { + source: window + }); + handled = true; + break; + case 79: + { + eventBus.dispatch("openfile", { + source: window + }); + handled = true; + } + break; + } + } + if (cmd === 3 || cmd === 10) { + switch (evt.keyCode) { + case 80: + this.requestPresentationMode(); + handled = true; + this.externalServices.reportTelemetry({ + type: "buttons", + data: { + id: "presentationModeKeyboard" + } + }); + break; + case 71: + if (this.appConfig.toolbar) { + this.appConfig.toolbar.pageNumber.select(); + handled = true; + } + break; + } + } + if (handled) { + if (ensureViewerFocused && !isViewerInPresentationMode) { + pdfViewer.focus(); + } + evt.preventDefault(); + return; + } + const curElement = getActiveOrFocusedElement(); + const curElementTagName = curElement?.tagName.toUpperCase(); + if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElementTagName === "BUTTON" && (evt.keyCode === 13 || evt.keyCode === 32) || curElement?.isContentEditable) { + if (evt.keyCode !== 27) { + return; + } + } + if (cmd === 0) { + let turnPage = 0, + turnOnlyIfPageFit = false; + switch (evt.keyCode) { + case 38: + if (this.supportsCaretBrowsingMode) { + this.moveCaret(true, false); + handled = true; + break; + } + case 33: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 8: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 37: + if (this.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 75: + case 80: + turnPage = -1; + break; + case 27: + if (this.secondaryToolbar?.isOpen) { + this.secondaryToolbar.close(); + handled = true; + } + if (!this.supportsIntegratedFind && this.findBar?.opened) { + this.findBar.close(); + handled = true; + } + break; + case 40: + if (this.supportsCaretBrowsingMode) { + this.moveCaret(false, false); + handled = true; + break; + } + case 34: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 13: + case 32: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 39: + if (this.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 74: + case 78: + turnPage = 1; + break; + case 36: + if (isViewerInPresentationMode || this.page > 1) { + this.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 35: + if (isViewerInPresentationMode || this.page < this.pagesCount) { + this.page = this.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + case 83: + this.pdfCursorTools?.switchTool(CursorTool.SELECT); + break; + case 72: + this.pdfCursorTools?.switchTool(CursorTool.HAND); + break; + case 82: + this.rotatePages(90); + break; + case 115: + this.pdfSidebar?.toggle(); + break; + } + if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) { + if (turnPage > 0) { + pdfViewer.nextPage(); + } else { + pdfViewer.previousPage(); + } + handled = true; + } + } + if (cmd === 4) { + switch (evt.keyCode) { + case 13: + case 32: + if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") { + break; + } + pdfViewer.previousPage(); + handled = true; + break; + case 38: + this.moveCaret(true, true); + handled = true; + break; + case 40: + this.moveCaret(false, true); + handled = true; + break; + case 82: + this.rotatePages(-90); + break; + } + } + if (!handled && !isViewerInPresentationMode) { + if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") { + ensureViewerFocused = true; + } + } + if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { + pdfViewer.focus(); + } + if (handled) { + evt.preventDefault(); + } +} +function beforeUnload(evt) { + evt.preventDefault(); + evt.returnValue = ""; + return false; +} + +;// ./web/viewer.js + + + + +const pdfjsVersion = "5.2.133"; +const pdfjsBuild = "4f7761353"; +const AppConstants = { + LinkTarget: LinkTarget, + RenderingStates: RenderingStates, + ScrollMode: ScrollMode, + SpreadMode: SpreadMode +}; +window.PDFViewerApplication = PDFViewerApplication; +window.PDFViewerApplicationConstants = AppConstants; +window.PDFViewerApplicationOptions = AppOptions; +function getViewerConfiguration() { + return { + appContainer: document.body, + principalContainer: document.getElementById("mainContainer"), + mainContainer: document.getElementById("viewerContainer"), + viewerContainer: document.getElementById("viewer"), + toolbar: { + container: document.getElementById("toolbarContainer"), + numPages: document.getElementById("numPages"), + pageNumber: document.getElementById("pageNumber"), + scaleSelect: document.getElementById("scaleSelect"), + customScaleOption: document.getElementById("customScaleOption"), + previous: document.getElementById("previous"), + next: document.getElementById("next"), + zoomIn: document.getElementById("zoomInButton"), + zoomOut: document.getElementById("zoomOutButton"), + print: document.getElementById("printButton"), + editorFreeTextButton: document.getElementById("editorFreeTextButton"), + editorFreeTextParamsToolbar: document.getElementById("editorFreeTextParamsToolbar"), + editorHighlightButton: document.getElementById("editorHighlightButton"), + editorHighlightParamsToolbar: document.getElementById("editorHighlightParamsToolbar"), + editorHighlightColorPicker: document.getElementById("editorHighlightColorPicker"), + editorInkButton: document.getElementById("editorInkButton"), + editorInkParamsToolbar: document.getElementById("editorInkParamsToolbar"), + editorStampButton: document.getElementById("editorStampButton"), + editorStampParamsToolbar: document.getElementById("editorStampParamsToolbar"), + editorSignatureButton: document.getElementById("editorSignatureButton"), + editorSignatureParamsToolbar: document.getElementById("editorSignatureParamsToolbar"), + download: document.getElementById("downloadButton") + }, + secondaryToolbar: { + toolbar: document.getElementById("secondaryToolbar"), + toggleButton: document.getElementById("secondaryToolbarToggleButton"), + presentationModeButton: document.getElementById("presentationMode"), + openFileButton: document.getElementById("secondaryOpenFile"), + printButton: document.getElementById("secondaryPrint"), + downloadButton: document.getElementById("secondaryDownload"), + viewBookmarkButton: document.getElementById("viewBookmark"), + firstPageButton: document.getElementById("firstPage"), + lastPageButton: document.getElementById("lastPage"), + pageRotateCwButton: document.getElementById("pageRotateCw"), + pageRotateCcwButton: document.getElementById("pageRotateCcw"), + cursorSelectToolButton: document.getElementById("cursorSelectTool"), + cursorHandToolButton: document.getElementById("cursorHandTool"), + scrollPageButton: document.getElementById("scrollPage"), + scrollVerticalButton: document.getElementById("scrollVertical"), + scrollHorizontalButton: document.getElementById("scrollHorizontal"), + scrollWrappedButton: document.getElementById("scrollWrapped"), + spreadNoneButton: document.getElementById("spreadNone"), + spreadOddButton: document.getElementById("spreadOdd"), + spreadEvenButton: document.getElementById("spreadEven"), + imageAltTextSettingsButton: document.getElementById("imageAltTextSettings"), + imageAltTextSettingsSeparator: document.getElementById("imageAltTextSettingsSeparator"), + documentPropertiesButton: document.getElementById("documentProperties") + }, + sidebar: { + outerContainer: document.getElementById("outerContainer"), + sidebarContainer: document.getElementById("sidebarContainer"), + toggleButton: document.getElementById("sidebarToggleButton"), + resizer: document.getElementById("sidebarResizer"), + thumbnailButton: document.getElementById("viewThumbnail"), + outlineButton: document.getElementById("viewOutline"), + attachmentsButton: document.getElementById("viewAttachments"), + layersButton: document.getElementById("viewLayers"), + thumbnailView: document.getElementById("thumbnailView"), + outlineView: document.getElementById("outlineView"), + attachmentsView: document.getElementById("attachmentsView"), + layersView: document.getElementById("layersView"), + currentOutlineItemButton: document.getElementById("currentOutlineItem") + }, + findBar: { + bar: document.getElementById("findbar"), + toggleButton: document.getElementById("viewFindButton"), + findField: document.getElementById("findInput"), + highlightAllCheckbox: document.getElementById("findHighlightAll"), + caseSensitiveCheckbox: document.getElementById("findMatchCase"), + matchDiacriticsCheckbox: document.getElementById("findMatchDiacritics"), + entireWordCheckbox: document.getElementById("findEntireWord"), + findMsg: document.getElementById("findMsg"), + findResultsCount: document.getElementById("findResultsCount"), + findPreviousButton: document.getElementById("findPreviousButton"), + findNextButton: document.getElementById("findNextButton") + }, + passwordOverlay: { + dialog: document.getElementById("passwordDialog"), + label: document.getElementById("passwordText"), + input: document.getElementById("password"), + submitButton: document.getElementById("passwordSubmit"), + cancelButton: document.getElementById("passwordCancel") + }, + documentProperties: { + dialog: document.getElementById("documentPropertiesDialog"), + 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"), + pageSize: document.getElementById("pageSizeField"), + linearized: document.getElementById("linearizedField") + } + }, + altTextDialog: { + dialog: document.getElementById("altTextDialog"), + optionDescription: document.getElementById("descriptionButton"), + optionDecorative: document.getElementById("decorativeButton"), + textarea: document.getElementById("descriptionTextarea"), + cancelButton: document.getElementById("altTextCancel"), + saveButton: document.getElementById("altTextSave") + }, + newAltTextDialog: { + dialog: document.getElementById("newAltTextDialog"), + title: document.getElementById("newAltTextTitle"), + descriptionContainer: document.getElementById("newAltTextDescriptionContainer"), + textarea: document.getElementById("newAltTextDescriptionTextarea"), + disclaimer: document.getElementById("newAltTextDisclaimer"), + learnMore: document.getElementById("newAltTextLearnMore"), + imagePreview: document.getElementById("newAltTextImagePreview"), + createAutomatically: document.getElementById("newAltTextCreateAutomatically"), + createAutomaticallyButton: document.getElementById("newAltTextCreateAutomaticallyButton"), + downloadModel: document.getElementById("newAltTextDownloadModel"), + downloadModelDescription: document.getElementById("newAltTextDownloadModelDescription"), + error: document.getElementById("newAltTextError"), + errorCloseButton: document.getElementById("newAltTextCloseButton"), + cancelButton: document.getElementById("newAltTextCancel"), + notNowButton: document.getElementById("newAltTextNotNow"), + saveButton: document.getElementById("newAltTextSave") + }, + altTextSettingsDialog: { + dialog: document.getElementById("altTextSettingsDialog"), + createModelButton: document.getElementById("createModelButton"), + aiModelSettings: document.getElementById("aiModelSettings"), + learnMore: document.getElementById("altTextSettingsLearnMore"), + deleteModelButton: document.getElementById("deleteModelButton"), + downloadModelButton: document.getElementById("downloadModelButton"), + showAltTextDialogButton: document.getElementById("showAltTextDialogButton"), + altTextSettingsCloseButton: document.getElementById("altTextSettingsCloseButton"), + closeButton: document.getElementById("altTextSettingsCloseButton") + }, + addSignatureDialog: { + dialog: document.getElementById("addSignatureDialog"), + panels: document.getElementById("addSignatureActionContainer"), + typeButton: document.getElementById("addSignatureTypeButton"), + typeInput: document.getElementById("addSignatureTypeInput"), + drawButton: document.getElementById("addSignatureDrawButton"), + drawSVG: document.getElementById("addSignatureDraw"), + drawPlaceholder: document.getElementById("addSignatureDrawPlaceholder"), + drawThickness: document.getElementById("addSignatureDrawThickness"), + imageButton: document.getElementById("addSignatureImageButton"), + imageSVG: document.getElementById("addSignatureImage"), + imagePlaceholder: document.getElementById("addSignatureImagePlaceholder"), + imagePicker: document.getElementById("addSignatureFilePicker"), + imagePickerLink: document.getElementById("addSignatureImageBrowse"), + description: document.getElementById("addSignatureDescription"), + clearButton: document.getElementById("clearSignatureButton"), + saveContainer: document.getElementById("addSignatureSaveContainer"), + saveCheckbox: document.getElementById("addSignatureSaveCheckbox"), + errorBar: document.getElementById("addSignatureError"), + errorCloseButton: document.getElementById("addSignatureErrorCloseButton"), + cancelButton: document.getElementById("addSignatureCancelButton"), + addButton: document.getElementById("addSignatureAddButton") + }, + editSignatureDialog: { + dialog: document.getElementById("editSignatureDescriptionDialog"), + description: document.getElementById("editSignatureDescription"), + editSignatureView: document.getElementById("editSignatureView"), + cancelButton: document.getElementById("editSignatureCancelButton"), + updateButton: document.getElementById("editSignatureUpdateButton") + }, + annotationEditorParams: { + editorFreeTextFontSize: document.getElementById("editorFreeTextFontSize"), + editorFreeTextColor: document.getElementById("editorFreeTextColor"), + editorInkColor: document.getElementById("editorInkColor"), + editorInkThickness: document.getElementById("editorInkThickness"), + editorInkOpacity: document.getElementById("editorInkOpacity"), + editorStampAddImage: document.getElementById("editorStampAddImage"), + editorSignatureAddSignature: document.getElementById("editorSignatureAddSignature"), + editorFreeHighlightThickness: document.getElementById("editorFreeHighlightThickness"), + editorHighlightShowAll: document.getElementById("editorHighlightShowAll") + }, + printContainer: document.getElementById("printContainer"), + editorUndoBar: { + container: document.getElementById("editorUndoBar"), + message: document.getElementById("editorUndoBarMessage"), + undoButton: document.getElementById("editorUndoBarUndoButton"), + closeButton: document.getElementById("editorUndoBarCloseButton") + } + }; +} +function webViewerLoad() { + const config = getViewerConfiguration(); + const event = new CustomEvent("webviewerloaded", { + bubbles: true, + cancelable: true, + detail: { + source: window + } + }); + try { + parent.document.dispatchEvent(event); + } catch (ex) { + console.error("webviewerloaded:", ex); + document.dispatchEvent(event); + } + PDFViewerApplication.run(config); +} +document.blockUnblockOnload?.(true); +if (document.readyState === "interactive" || document.readyState === "complete") { + webViewerLoad(); +} else { + document.addEventListener("DOMContentLoaded", webViewerLoad, true); +} + +export { PDFViewerApplication, AppConstants as PDFViewerApplicationConstants, AppOptions as PDFViewerApplicationOptions }; + +//# sourceMappingURL=viewer.mjs.map \ No newline at end of file diff --git a/public/plugins/pdfjs-5.2.133/web/viewer.mjs.map b/public/plugins/pdfjs-5.2.133/web/viewer.mjs.map new file mode 100644 index 00000000000..ec2061f9ac1 --- /dev/null +++ b/public/plugins/pdfjs-5.2.133/web/viewer.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"viewer.mjs","mappings":"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","sources":["webpack://pdf.js/./web/pdfjs.js","webpack://pdf.js/./web/ui_utils.js","webpack://pdf.js/./web/app_options.js","webpack://pdf.js/./web/pdf_link_service.js","webpack://pdf.js/./web/event_utils.js","webpack://pdf.js/./web/external_services.js","webpack://pdf.js/./web/preferences.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/types.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/resolver.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/scope.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/builtins.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/memoizer.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/bundle.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/resource.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/index.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/overlay.js","webpack://pdf.js/./node_modules/cached-iterable/src/cached_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/cached_sync_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/cached_async_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/index.mjs","webpack://pdf.js/./node_modules/@fluent/dom/esm/localization.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/dom_localization.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/index.js","webpack://pdf.js/./web/l10n.js","webpack://pdf.js/./web/genericl10n.js","webpack://pdf.js/./web/generic_scripting.js","webpack://pdf.js/./web/generic_signature_storage.js","webpack://pdf.js/./web/genericcom.js","webpack://pdf.js/./web/new_alt_text_manager.js","webpack://pdf.js/./web/alt_text_manager.js","webpack://pdf.js/./web/annotation_editor_params.js","webpack://pdf.js/./web/caret_browsing.js","webpack://pdf.js/./web/download_manager.js","webpack://pdf.js/./web/editor_undo_bar.js","webpack://pdf.js/./web/overlay_manager.js","webpack://pdf.js/./web/password_prompt.js","webpack://pdf.js/./web/base_tree_viewer.js","webpack://pdf.js/./web/pdf_attachment_viewer.js","webpack://pdf.js/./web/grab_to_pan.js","webpack://pdf.js/./web/pdf_cursor_tools.js","webpack://pdf.js/./web/pdf_document_properties.js","webpack://pdf.js/./web/pdf_find_utils.js","webpack://pdf.js/./web/pdf_find_controller.js","webpack://pdf.js/./web/pdf_find_bar.js","webpack://pdf.js/./web/pdf_history.js","webpack://pdf.js/./web/pdf_layer_viewer.js","webpack://pdf.js/./web/pdf_outline_viewer.js","webpack://pdf.js/./web/pdf_presentation_mode.js","webpack://pdf.js/./web/xfa_layer_builder.js","webpack://pdf.js/./web/print_utils.js","webpack://pdf.js/./web/pdf_print_service.js","webpack://pdf.js/./web/pdf_rendering_queue.js","webpack://pdf.js/./web/pdf_scripting_manager.js","webpack://pdf.js/./web/pdf_sidebar.js","webpack://pdf.js/./web/pdf_thumbnail_view.js","webpack://pdf.js/./web/pdf_thumbnail_viewer.js","webpack://pdf.js/./web/annotation_editor_layer_builder.js","webpack://pdf.js/./web/annotation_layer_builder.js","webpack://pdf.js/./web/autolinker.js","webpack://pdf.js/./web/base_pdf_page_view.js","webpack://pdf.js/./web/draw_layer_builder.js","webpack://pdf.js/./web/pdf_page_detail_view.js","webpack://pdf.js/./web/struct_tree_layer_builder.js","webpack://pdf.js/./web/text_accessibility.js","webpack://pdf.js/./web/text_highlighter.js","webpack://pdf.js/./web/text_layer_builder.js","webpack://pdf.js/./web/pdf_page_view.js","webpack://pdf.js/./web/pdf_viewer.js","webpack://pdf.js/./web/secondary_toolbar.js","webpack://pdf.js/./web/signature_manager.js","webpack://pdf.js/./web/toolbar.js","webpack://pdf.js/./web/view_history.js","webpack://pdf.js/./web/app.js","webpack://pdf.js/./web/viewer.js"],"sourcesContent":["/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst {\n AbortException,\n AnnotationEditorLayer,\n AnnotationEditorParamsType,\n AnnotationEditorType,\n AnnotationEditorUIManager,\n AnnotationLayer,\n AnnotationMode,\n AnnotationType,\n build,\n ColorPicker,\n createValidAbsoluteUrl,\n DOMSVGFactory,\n DrawLayer,\n FeatureTest,\n fetchData,\n getDocument,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n getUuid,\n getXfaPageViewport,\n GlobalWorkerOptions,\n ImageKind,\n InvalidPDFException,\n isDataScheme,\n isPdfFile,\n isValidExplicitDest,\n MathClamp,\n noContextMenu,\n normalizeUnicode,\n OPS,\n OutputScale,\n PasswordResponses,\n PDFDataRangeTransport,\n PDFDateString,\n PDFWorker,\n PermissionFlag,\n PixelsPerInch,\n RenderingCancelledException,\n ResponseException,\n setLayerDimensions,\n shadow,\n SignatureExtractor,\n stopEvent,\n SupportedImageMimeTypes,\n TextLayer,\n TouchManager,\n updateUrlHash,\n Util,\n VerbosityLevel,\n version,\n XfaLayer,\n} = globalThis.pdfjsLib;\n\nexport {\n AbortException,\n AnnotationEditorLayer,\n AnnotationEditorParamsType,\n AnnotationEditorType,\n AnnotationEditorUIManager,\n AnnotationLayer,\n AnnotationMode,\n AnnotationType,\n build,\n ColorPicker,\n createValidAbsoluteUrl,\n DOMSVGFactory,\n DrawLayer,\n FeatureTest,\n fetchData,\n getDocument,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n getUuid,\n getXfaPageViewport,\n GlobalWorkerOptions,\n ImageKind,\n InvalidPDFException,\n isDataScheme,\n isPdfFile,\n isValidExplicitDest,\n MathClamp,\n noContextMenu,\n normalizeUnicode,\n OPS,\n OutputScale,\n PasswordResponses,\n PDFDataRangeTransport,\n PDFDateString,\n PDFWorker,\n PermissionFlag,\n PixelsPerInch,\n RenderingCancelledException,\n ResponseException,\n setLayerDimensions,\n shadow,\n SignatureExtractor,\n stopEvent,\n SupportedImageMimeTypes,\n TextLayer,\n TouchManager,\n updateUrlHash,\n Util,\n VerbosityLevel,\n version,\n XfaLayer,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MathClamp } from \"pdfjs-lib\";\n\nconst DEFAULT_SCALE_VALUE = \"auto\";\nconst DEFAULT_SCALE = 1.0;\nconst DEFAULT_SCALE_DELTA = 1.1;\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 10.0;\nconst UNKNOWN_SCALE = 0;\nconst MAX_AUTO_SCALE = 1.25;\nconst SCROLLBAR_PADDING = 40;\nconst VERTICAL_PADDING = 5;\n\nconst RenderingStates = {\n INITIAL: 0,\n RUNNING: 1,\n PAUSED: 2,\n FINISHED: 3,\n};\n\nconst PresentationModeState = {\n UNKNOWN: 0,\n NORMAL: 1,\n CHANGING: 2,\n FULLSCREEN: 3,\n};\n\nconst SidebarView = {\n UNKNOWN: -1,\n NONE: 0,\n THUMBS: 1, // Default value.\n OUTLINE: 2,\n ATTACHMENTS: 3,\n LAYERS: 4,\n};\n\nconst TextLayerMode = {\n DISABLE: 0,\n ENABLE: 1,\n ENABLE_PERMISSIONS: 2,\n};\n\nconst ScrollMode = {\n UNKNOWN: -1,\n VERTICAL: 0, // Default value.\n HORIZONTAL: 1,\n WRAPPED: 2,\n PAGE: 3,\n};\n\nconst SpreadMode = {\n UNKNOWN: -1,\n NONE: 0, // Default value.\n ODD: 1,\n EVEN: 2,\n};\n\nconst CursorTool = {\n SELECT: 0, // The default value.\n HAND: 1,\n ZOOM: 2,\n};\n\n// Used by `PDFViewerApplication`, and by the API unit-tests.\nconst AutoPrintRegExp = /\\bprint\\s*\\(/;\n\n/**\n * Scrolls specified element into view of its parent.\n * @param {HTMLElement} element - The element to be visible.\n * @param {Object} [spot] - An object with optional top and left properties,\n * specifying the offset from the top left edge.\n * @param {number} [spot.left]\n * @param {number} [spot.top]\n * @param {boolean} [scrollMatches] - When scrolling search results into view,\n * ignore elements that either: Contains marked content identifiers,\n * or have the CSS-rule `overflow: hidden;` set. The default value is `false`.\n */\nfunction scrollIntoView(element, spot, scrollMatches = false) {\n // Assuming offsetParent is available (it's not available when viewer is in\n // hidden iframe or object). We have to scroll: if the offsetParent is not set\n // producing the error. See also animationStarted.\n let parent = element.offsetParent;\n if (!parent) {\n console.error(\"offsetParent is not set -- cannot scroll\");\n return;\n }\n let offsetY = element.offsetTop + element.clientTop;\n let offsetX = element.offsetLeft + element.clientLeft;\n while (\n (parent.clientHeight === parent.scrollHeight &&\n parent.clientWidth === parent.scrollWidth) ||\n (scrollMatches &&\n (parent.classList.contains(\"markedContent\") ||\n getComputedStyle(parent).overflow === \"hidden\"))\n ) {\n offsetY += parent.offsetTop;\n offsetX += parent.offsetLeft;\n\n parent = parent.offsetParent;\n if (!parent) {\n return; // no need to scroll\n }\n }\n if (spot) {\n if (spot.top !== undefined) {\n offsetY += spot.top;\n }\n if (spot.left !== undefined) {\n offsetX += spot.left;\n parent.scrollLeft = offsetX;\n }\n }\n parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback, abortSignal = undefined) {\n const debounceScroll = function (evt) {\n if (rAF) {\n return;\n }\n // schedule an invocation of scroll for next animation frame.\n rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n rAF = null;\n\n const currentX = viewAreaElement.scrollLeft;\n const lastX = state.lastX;\n if (currentX !== lastX) {\n state.right = currentX > lastX;\n }\n state.lastX = currentX;\n const currentY = viewAreaElement.scrollTop;\n const lastY = state.lastY;\n if (currentY !== lastY) {\n state.down = currentY > lastY;\n }\n state.lastY = currentY;\n callback(state);\n });\n };\n\n const state = {\n right: true,\n down: true,\n lastX: viewAreaElement.scrollLeft,\n lastY: viewAreaElement.scrollTop,\n _eventHandler: debounceScroll,\n };\n\n let rAF = null;\n viewAreaElement.addEventListener(\"scroll\", debounceScroll, {\n useCapture: true,\n signal: abortSignal,\n });\n abortSignal?.addEventListener(\n \"abort\",\n () => window.cancelAnimationFrame(rAF),\n { once: true }\n );\n return state;\n}\n\n/**\n * Helper function to parse query string (e.g. ?param1=value¶m2=...).\n * @param {string} query\n * @returns {Map}\n */\nfunction parseQueryString(query) {\n const params = new Map();\n for (const [key, value] of new URLSearchParams(query)) {\n params.set(key.toLowerCase(), value);\n }\n return params;\n}\n\nconst InvisibleCharsRegExp = /[\\x00-\\x1F]/g;\n\n/**\n * @param {string} str\n * @param {boolean} [replaceInvisible]\n */\nfunction removeNullCharacters(str, replaceInvisible = false) {\n if (!InvisibleCharsRegExp.test(str)) {\n return str;\n }\n if (replaceInvisible) {\n return str.replaceAll(InvisibleCharsRegExp, m => (m === \"\\x00\" ? \"\" : \" \"));\n }\n return str.replaceAll(\"\\x00\", \"\");\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {number} Index of the first array element to pass the test,\n * or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition, start = 0) {\n let minIndex = start;\n let maxIndex = items.length - 1;\n\n if (maxIndex < 0 || !condition(items[maxIndex])) {\n return items.length;\n }\n if (condition(items[minIndex])) {\n return minIndex;\n }\n\n while (minIndex < maxIndex) {\n const currentIndex = (minIndex + maxIndex) >> 1;\n const currentItem = items[currentIndex];\n if (condition(currentItem)) {\n maxIndex = currentIndex;\n } else {\n minIndex = currentIndex + 1;\n }\n }\n return minIndex; /* === maxIndex */\n}\n\n/**\n * Approximates float number as a fraction using Farey sequence (max order\n * of 8).\n * @param {number} x - Positive float number.\n * @returns {Array} Estimated fraction: the first array item is a numerator,\n * the second one is a denominator.\n * They are both natural numbers.\n */\nfunction approximateFraction(x) {\n // Fast paths for int numbers or their inversions.\n if (Math.floor(x) === x) {\n return [x, 1];\n }\n const xinv = 1 / x;\n const limit = 8;\n if (xinv > limit) {\n return [1, limit];\n } else if (Math.floor(xinv) === xinv) {\n return [1, xinv];\n }\n\n const x_ = x > 1 ? xinv : x;\n // a/b and c/d are neighbours in Farey sequence.\n let a = 0,\n b = 1,\n c = 1,\n d = 1;\n // Limiting search to order 8.\n while (true) {\n // Generating next term in sequence (order of q).\n const p = a + c,\n q = b + d;\n if (q > limit) {\n break;\n }\n if (x_ <= p / q) {\n c = p;\n d = q;\n } else {\n a = p;\n b = q;\n }\n }\n let result;\n // Select closest of the neighbours to x.\n if (x_ - a / b < c / d - x_) {\n result = x_ === x ? [a, b] : [b, a];\n } else {\n result = x_ === x ? [c, d] : [d, c];\n }\n return result;\n}\n\n/**\n * @param {number} x - A positive number to round to a multiple of `div`.\n * @param {number} div - A natural number.\n */\nfunction floorToDivide(x, div) {\n return x - (x % div);\n}\n\n/**\n * @typedef {Object} GetPageSizeInchesParameters\n * @property {number[]} view\n * @property {number} userUnit\n * @property {number} rotate\n */\n\n/**\n * @typedef {Object} PageSize\n * @property {number} width - In inches.\n * @property {number} height - In inches.\n */\n\n/**\n * Gets the size of the specified page, converted from PDF units to inches.\n * @param {GetPageSizeInchesParameters} params\n * @returns {PageSize}\n */\nfunction getPageSizeInches({ view, userUnit, rotate }) {\n const [x1, y1, x2, y2] = view;\n // We need to take the page rotation into account as well.\n const changeOrientation = rotate % 180 !== 0;\n\n const width = ((x2 - x1) / 72) * userUnit;\n const height = ((y2 - y1) / 72) * userUnit;\n\n return {\n width: changeOrientation ? height : width,\n height: changeOrientation ? width : height,\n };\n}\n\n/**\n * Helper function for getVisibleElements.\n *\n * @param {number} index - initial guess at the first visible element\n * @param {Array} views - array of pages, into which `index` is an index\n * @param {number} top - the top of the scroll pane\n * @returns {number} less than or equal to `index` that is definitely at or\n * before the first visible element in `views`, but not by too much. (Usually,\n * this will be the first element in the first partially visible row in\n * `views`, although sometimes it goes back one row further.)\n */\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n // binarySearchFirstItem's assumption is that the input is ordered, with only\n // one index where the conditions flips from false to true: [false ...,\n // true...]. With vertical scrolling and spreads, it is possible to have\n // [false ..., true, false, true ...]. With wrapped scrolling we can have a\n // similar sequence, with many more mixed true and false in the middle.\n //\n // So there is no guarantee that the binary search yields the index of the\n // first visible element. It could have been any of the other visible elements\n // that were preceded by a hidden element.\n\n // Of course, if either this element or the previous (hidden) element is also\n // the first element, there's nothing to worry about.\n if (index < 2) {\n return index;\n }\n\n // That aside, the possible cases are represented below.\n //\n // **** = fully hidden\n // A*B* = mix of partially visible and/or hidden pages\n // CDEF = fully visible\n //\n // (1) Binary search could have returned A, in which case we can stop.\n // (2) Binary search could also have returned B, in which case we need to\n // check the whole row.\n // (3) Binary search could also have returned C, in which case we need to\n // check the whole previous row.\n //\n // There's one other possibility:\n //\n // **** = fully hidden\n // ABCD = mix of fully and/or partially visible pages\n //\n // (4) Binary search could only have returned A.\n\n // Initially assume that we need to find the beginning of the current row\n // (case 1, 2, or 4), which means finding a page that is above the current\n // page's top. If the found page is partially visible, we're definitely not in\n // case 3, and this assumption is correct.\n let elt = views[index].div;\n let pageTop = elt.offsetTop + elt.clientTop;\n\n if (pageTop >= top) {\n // The found page is fully visible, so we're actually either in case 3 or 4,\n // and unfortunately we can't tell the difference between them without\n // scanning the entire previous row, so we just conservatively assume that\n // we do need to backtrack to that row. In both cases, the previous page is\n // in the previous row, so use its top instead.\n elt = views[index - 1].div;\n pageTop = elt.offsetTop + elt.clientTop;\n }\n\n // Now we backtrack to the first page that still has its bottom below\n // `pageTop`, which is the top of a page in the first visible row (unless\n // we're in case 4, in which case it's the row before that).\n // `index` is found by binary search, so the page at `index - 1` is\n // invisible and we can start looking for potentially visible pages from\n // `index - 2`. (However, if this loop terminates on its first iteration,\n // which is the case when pages are stacked vertically, `index` should remain\n // unchanged, so we use a distinct loop variable.)\n for (let i = index - 2; i >= 0; --i) {\n elt = views[i].div;\n if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n // We have reached the previous row, so stop now.\n // This loop is expected to terminate relatively quickly because the\n // number of pages per row is expected to be small.\n break;\n }\n index = i;\n }\n return index;\n}\n\n/**\n * @typedef {Object} GetVisibleElementsParameters\n * @property {HTMLElement} scrollEl - A container that can possibly scroll.\n * @property {Array} views - Objects with a `div` property that contains an\n * HTMLElement, which should all be descendants of `scrollEl` satisfying the\n * relevant layout assumptions.\n * @property {boolean} sortByVisibility - If `true`, the returned elements are\n * sorted in descending order of the percent of their padding box that is\n * visible. The default value is `false`.\n * @property {boolean} horizontal - If `true`, the elements are assumed to be\n * laid out horizontally instead of vertically. The default value is `false`.\n * @property {boolean} rtl - If `true`, the `scrollEl` container is assumed to\n * be in right-to-left mode. The default value is `false`.\n */\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n *\n * Well, pretty generic. There are some assumptions placed on the elements\n * referenced by `views`:\n * - If `horizontal`, no left of any earlier element is to the right of the\n * left of any later element.\n * - Otherwise, `views` can be split into contiguous rows where, within a row,\n * no top of any element is below the bottom of any other element, and\n * between rows, no bottom of any element in an earlier row is below the\n * top of any element in a later row.\n *\n * (Here, top, left, etc. all refer to the padding edge of the element in\n * question. For pages, that ends up being equivalent to the bounding box of the\n * rendering canvas. Earlier and later refer to index in `views`, not page\n * layout.)\n *\n * @param {GetVisibleElementsParameters} params\n * @returns {Object} `{ first, last, views: [{ id, x, y, view, percent }] }`\n */\nfunction getVisibleElements({\n scrollEl,\n views,\n sortByVisibility = false,\n horizontal = false,\n rtl = false,\n}) {\n const top = scrollEl.scrollTop,\n bottom = top + scrollEl.clientHeight;\n const left = scrollEl.scrollLeft,\n right = left + scrollEl.clientWidth;\n\n // Throughout this \"generic\" function, comments will assume we're working with\n // PDF document pages, which is the most important and complex case. In this\n // case, the visible elements we're actually interested is the page canvas,\n // which is contained in a wrapper which adds no padding/border/margin, which\n // is itself contained in `view.div` which adds no padding (but does add a\n // border). So, as specified in this function's doc comment, this function\n // does all of its work on the padding edge of the provided views, starting at\n // offsetLeft/Top (which includes margin) and adding clientLeft/Top (which is\n // the border). Adding clientWidth/Height gets us the bottom-right corner of\n // the padding edge.\n function isElementBottomAfterViewTop(view) {\n const element = view.div;\n const elementBottom =\n element.offsetTop + element.clientTop + element.clientHeight;\n return elementBottom > top;\n }\n function isElementNextAfterViewHorizontally(view) {\n const element = view.div;\n const elementLeft = element.offsetLeft + element.clientLeft;\n const elementRight = elementLeft + element.clientWidth;\n return rtl ? elementLeft < right : elementRight > left;\n }\n\n const visible = [],\n ids = new Set(),\n numViews = views.length;\n let firstVisibleElementInd = binarySearchFirstItem(\n views,\n horizontal\n ? isElementNextAfterViewHorizontally\n : isElementBottomAfterViewTop\n );\n\n // Please note the return value of the `binarySearchFirstItem` function when\n // no valid element is found (hence the `firstVisibleElementInd` check below).\n if (\n firstVisibleElementInd > 0 &&\n firstVisibleElementInd < numViews &&\n !horizontal\n ) {\n // In wrapped scrolling (or vertical scrolling with spreads), with some page\n // sizes, isElementBottomAfterViewTop doesn't satisfy the binary search\n // condition: there can be pages with bottoms above the view top between\n // pages with bottoms below. This function detects and corrects that error;\n // see it for more comments.\n firstVisibleElementInd = backtrackBeforeAllVisibleElements(\n firstVisibleElementInd,\n views,\n top\n );\n }\n\n // lastEdge acts as a cutoff for us to stop looping, because we know all\n // subsequent pages will be hidden.\n //\n // When using wrapped scrolling or vertical scrolling with spreads, we can't\n // simply stop the first time we reach a page below the bottom of the view;\n // the tops of subsequent pages on the same row could still be visible. In\n // horizontal scrolling, we don't have that issue, so we can stop as soon as\n // we pass `right`, without needing the code below that handles the -1 case.\n let lastEdge = horizontal ? right : -1;\n\n for (let i = firstVisibleElementInd; i < numViews; i++) {\n const view = views[i],\n element = view.div;\n const currentWidth = element.offsetLeft + element.clientLeft;\n const currentHeight = element.offsetTop + element.clientTop;\n const viewWidth = element.clientWidth,\n viewHeight = element.clientHeight;\n const viewRight = currentWidth + viewWidth;\n const viewBottom = currentHeight + viewHeight;\n\n if (lastEdge === -1) {\n // As commented above, this is only needed in non-horizontal cases.\n // Setting lastEdge to the bottom of the first page that is partially\n // visible ensures that the next page fully below lastEdge is on the\n // next row, which has to be fully hidden along with all subsequent rows.\n if (viewBottom >= bottom) {\n lastEdge = viewBottom;\n }\n } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n break;\n }\n\n if (\n viewBottom <= top ||\n currentHeight >= bottom ||\n viewRight <= left ||\n currentWidth >= right\n ) {\n continue;\n }\n\n const minY = Math.max(0, top - currentHeight);\n const minX = Math.max(0, left - currentWidth);\n\n const hiddenHeight = minY + Math.max(0, viewBottom - bottom);\n const hiddenWidth = minX + Math.max(0, viewRight - right);\n\n const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,\n fractionWidth = (viewWidth - hiddenWidth) / viewWidth;\n const percent = (fractionHeight * fractionWidth * 100) | 0;\n\n visible.push({\n id: view.id,\n x: currentWidth,\n y: currentHeight,\n visibleArea:\n // We only specify which part of the page is visible when it's not\n // the full page, as there is no point in handling a partial page\n // rendering otherwise.\n percent === 100\n ? null\n : {\n minX,\n minY,\n maxX: Math.min(viewRight, right) - currentWidth,\n maxY: Math.min(viewBottom, bottom) - currentHeight,\n },\n view,\n percent,\n widthPercent: (fractionWidth * 100) | 0,\n });\n ids.add(view.id);\n }\n\n const first = visible[0],\n last = visible.at(-1);\n\n if (sortByVisibility) {\n visible.sort(function (a, b) {\n const pc = a.percent - b.percent;\n if (Math.abs(pc) > 0.001) {\n return -pc;\n }\n return a.id - b.id; // ensure stability\n });\n }\n return { first, last, views: visible, ids };\n}\n\nfunction normalizeWheelEventDirection(evt) {\n let delta = Math.hypot(evt.deltaX, evt.deltaY);\n const angle = Math.atan2(evt.deltaY, evt.deltaX);\n if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n // All that is left-up oriented has to change the sign.\n delta = -delta;\n }\n return delta;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n const deltaMode = evt.deltaMode; // Avoid being affected by bug 1392460.\n let delta = normalizeWheelEventDirection(evt);\n\n const MOUSE_PIXELS_PER_LINE = 30;\n const MOUSE_LINES_PER_PAGE = 30;\n\n // Converts delta to per-page units\n if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) {\n delta /= MOUSE_LINES_PER_PAGE;\n }\n return delta;\n}\n\nfunction isValidRotation(angle) {\n return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n return (\n Number.isInteger(mode) &&\n Object.values(ScrollMode).includes(mode) &&\n mode !== ScrollMode.UNKNOWN\n );\n}\n\nfunction isValidSpreadMode(mode) {\n return (\n Number.isInteger(mode) &&\n Object.values(SpreadMode).includes(mode) &&\n mode !== SpreadMode.UNKNOWN\n );\n}\n\nfunction isPortraitOrientation(size) {\n return size.width <= size.height;\n}\n\n/**\n * Promise that is resolved when DOM window becomes visible.\n */\nconst animationStarted = new Promise(function (resolve) {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof window === \"undefined\"\n ) {\n // Prevent \"ReferenceError: window is not defined\" errors when running the\n // unit-tests in Node.js environments.\n setTimeout(resolve, 20);\n return;\n }\n window.requestAnimationFrame(resolve);\n});\n\nconst docStyle =\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof document === \"undefined\"\n ? null\n : document.documentElement.style;\n\nclass ProgressBar {\n #classList = null;\n\n #disableAutoFetchTimeout = null;\n\n #percent = 0;\n\n #style = null;\n\n #visible = true;\n\n constructor(bar) {\n this.#classList = bar.classList;\n this.#style = bar.style;\n }\n\n get percent() {\n return this.#percent;\n }\n\n set percent(val) {\n this.#percent = MathClamp(val, 0, 100);\n\n if (isNaN(val)) {\n this.#classList.add(\"indeterminate\");\n return;\n }\n this.#classList.remove(\"indeterminate\");\n\n this.#style.setProperty(\"--progressBar-percent\", `${this.#percent}%`);\n }\n\n setWidth(viewer) {\n if (!viewer) {\n return;\n }\n const container = viewer.parentNode;\n const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n if (scrollbarWidth > 0) {\n this.#style.setProperty(\n \"--progressBar-end-offset\",\n `${scrollbarWidth}px`\n );\n }\n }\n\n setDisableAutoFetch(delay = /* ms = */ 5000) {\n if (this.#percent === 100 || isNaN(this.#percent)) {\n return;\n }\n if (this.#disableAutoFetchTimeout) {\n clearTimeout(this.#disableAutoFetchTimeout);\n }\n this.show();\n\n this.#disableAutoFetchTimeout = setTimeout(() => {\n this.#disableAutoFetchTimeout = null;\n this.hide();\n }, delay);\n }\n\n hide() {\n if (!this.#visible) {\n return;\n }\n this.#visible = false;\n this.#classList.add(\"hidden\");\n }\n\n show() {\n if (this.#visible) {\n return;\n }\n this.#visible = true;\n this.#classList.remove(\"hidden\");\n }\n}\n\n/**\n * Get the active or focused element in current DOM.\n *\n * Recursively search for the truly active or focused element in case there are\n * shadow DOMs.\n *\n * @returns {Element} the truly active or focused element.\n */\nfunction getActiveOrFocusedElement() {\n let curRoot = document;\n let curActiveOrFocused =\n curRoot.activeElement || curRoot.querySelector(\":focus\");\n\n while (curActiveOrFocused?.shadowRoot) {\n curRoot = curActiveOrFocused.shadowRoot;\n curActiveOrFocused =\n curRoot.activeElement || curRoot.querySelector(\":focus\");\n }\n\n return curActiveOrFocused;\n}\n\n/**\n * Converts API PageLayout values to the format used by `BaseViewer`.\n * @param {string} layout - The API PageLayout value.\n * @returns {Object}\n */\nfunction apiPageLayoutToViewerModes(layout) {\n let scrollMode = ScrollMode.VERTICAL,\n spreadMode = SpreadMode.NONE;\n\n switch (layout) {\n case \"SinglePage\":\n scrollMode = ScrollMode.PAGE;\n break;\n case \"OneColumn\":\n break;\n case \"TwoPageLeft\":\n scrollMode = ScrollMode.PAGE;\n /* falls through */\n case \"TwoColumnLeft\":\n spreadMode = SpreadMode.ODD;\n break;\n case \"TwoPageRight\":\n scrollMode = ScrollMode.PAGE;\n /* falls through */\n case \"TwoColumnRight\":\n spreadMode = SpreadMode.EVEN;\n break;\n }\n return { scrollMode, spreadMode };\n}\n\n/**\n * Converts API PageMode values to the format used by `PDFSidebar`.\n * NOTE: There's also a \"FullScreen\" parameter which is not possible to support,\n * since the Fullscreen API used in browsers requires that entering\n * fullscreen mode only occurs as a result of a user-initiated event.\n * @param {string} mode - The API PageMode value.\n * @returns {number} A value from {SidebarView}.\n */\nfunction apiPageModeToSidebarView(mode) {\n switch (mode) {\n case \"UseNone\":\n return SidebarView.NONE;\n case \"UseThumbs\":\n return SidebarView.THUMBS;\n case \"UseOutlines\":\n return SidebarView.OUTLINE;\n case \"UseAttachments\":\n return SidebarView.ATTACHMENTS;\n case \"UseOC\":\n return SidebarView.LAYERS;\n }\n return SidebarView.NONE; // Default value.\n}\n\nfunction toggleCheckedBtn(button, toggle, view = null) {\n button.classList.toggle(\"toggled\", toggle);\n button.setAttribute(\"aria-checked\", toggle);\n\n view?.classList.toggle(\"hidden\", !toggle);\n}\n\nfunction toggleExpandedBtn(button, toggle, view = null) {\n button.classList.toggle(\"toggled\", toggle);\n button.setAttribute(\"aria-expanded\", toggle);\n\n view?.classList.toggle(\"hidden\", !toggle);\n}\n\n// In Firefox, the css calc function uses f32 precision but the Chrome or Safari\n// are using f64 one. So in order to have the same rendering in all browsers, we\n// need to use the right precision in order to have correct dimensions.\nconst calcRound =\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? Math.fround\n : (function () {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof document === \"undefined\"\n ) {\n return x => x;\n }\n const e = document.createElement(\"div\");\n e.style.width = \"round(down, calc(1.6666666666666665 * 792px), 1px)\";\n return e.style.width === \"calc(1320px)\" ? Math.fround : x => x;\n })();\n\nexport {\n animationStarted,\n apiPageLayoutToViewerModes,\n apiPageModeToSidebarView,\n approximateFraction,\n AutoPrintRegExp,\n backtrackBeforeAllVisibleElements, // only exported for testing\n binarySearchFirstItem,\n calcRound,\n CursorTool,\n DEFAULT_SCALE,\n DEFAULT_SCALE_DELTA,\n DEFAULT_SCALE_VALUE,\n docStyle,\n floorToDivide,\n getActiveOrFocusedElement,\n getPageSizeInches,\n getVisibleElements,\n isPortraitOrientation,\n isValidRotation,\n isValidScrollMode,\n isValidSpreadMode,\n MAX_AUTO_SCALE,\n MAX_SCALE,\n MIN_SCALE,\n normalizeWheelEventDelta,\n normalizeWheelEventDirection,\n parseQueryString,\n PresentationModeState,\n ProgressBar,\n removeNullCharacters,\n RenderingStates,\n SCROLLBAR_PADDING,\n scrollIntoView,\n ScrollMode,\n SidebarView,\n SpreadMode,\n TextLayerMode,\n toggleCheckedBtn,\n toggleExpandedBtn,\n UNKNOWN_SCALE,\n VERTICAL_PADDING,\n watchScroll,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // eslint-disable-next-line no-var\n var compatParams = new Map();\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof navigator === \"undefined\"\n ) {\n globalThis.navigator = Object.create(null);\n }\n const userAgent = navigator.userAgent || \"\";\n const platform = navigator.platform || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 1;\n\n const isAndroid = /Android/.test(userAgent);\n const isIOS =\n /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) ||\n (platform === \"MacIntel\" && maxTouchPoints > 1);\n\n // Limit canvas size to 5 mega-pixels on mobile.\n // Support: Android, iOS\n (function () {\n if (isIOS || isAndroid) {\n compatParams.set(\"maxCanvasPixels\", 5242880);\n }\n })();\n\n // Don't use system fonts on Android (issue 18210).\n // Support: Android\n (function () {\n if (isAndroid) {\n compatParams.set(\"useSystemFonts\", false);\n }\n })();\n}\n\nconst OptionKind = {\n BROWSER: 0x01,\n VIEWER: 0x02,\n API: 0x04,\n WORKER: 0x08,\n EVENT_DISPATCH: 0x10,\n PREFERENCE: 0x80,\n};\n\n// Should only be used with options that allow multiple types.\nconst Type = {\n BOOLEAN: 0x01,\n NUMBER: 0x02,\n OBJECT: 0x04,\n STRING: 0x08,\n UNDEFINED: 0x10,\n};\n\n/**\n * NOTE: These options are used to generate the `default_preferences.json` file,\n * see `OptionKind.PREFERENCE`, hence the values below must use only\n * primitive types and cannot rely on any imported types.\n */\nconst defaultOptions = {\n allowedGlobalEvents: {\n /** @type {Object} */\n value: null,\n kind: OptionKind.BROWSER,\n },\n canvasMaxAreaInBytes: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.BROWSER + OptionKind.API,\n },\n isInAutomation: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.BROWSER,\n },\n localeProperties: {\n /** @type {Object} */\n value:\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")\n ? { lang: navigator.language || \"en-US\" }\n : null,\n kind: OptionKind.BROWSER,\n },\n maxCanvasDim: {\n /** @type {number} */\n value: 32767,\n kind: OptionKind.BROWSER + OptionKind.VIEWER,\n },\n nimbusDataStr: {\n /** @type {string} */\n value: \"\",\n kind: OptionKind.BROWSER,\n },\n supportsCaretBrowsingMode: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.BROWSER,\n },\n supportsDocumentFonts: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsIntegratedFind: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.BROWSER,\n },\n supportsMouseWheelZoomCtrlKey: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsMouseWheelZoomMetaKey: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsPinchToZoom: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsPrinting: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n toolbarDensity: {\n /** @type {number} */\n value: 0, // 0 = \"normal\", 1 = \"compact\", 2 = \"touch\"\n kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH,\n },\n\n altTextLearnMoreUrl: {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? \"https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/pdf-alt-text\"\n : \"\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n annotationEditorMode: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n annotationMode: {\n /** @type {number} */\n value: 2,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n cursorToolOnLoad: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n debuggerSrc: {\n /** @type {string} */\n value: \"./debugger.mjs\",\n kind: OptionKind.VIEWER,\n },\n defaultZoomDelay: {\n /** @type {number} */\n value: 400,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n defaultZoomValue: {\n /** @type {string} */\n value: \"\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n disableHistory: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER,\n },\n disablePageLabels: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableAltText: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableAltTextModelDownload: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,\n },\n enableAutoLinking: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableDetailCanvas: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER,\n },\n enableGuessAltText: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,\n },\n enableHighlightFloatingButton: {\n // We'll probably want to make some experiments before enabling this\n // in Firefox release, but it has to be temporary.\n // TODO: remove it when unnecessary.\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableNewAltTextWhenAddingImage: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enablePermissions: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enablePrintAutoRotate: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableScripting: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableSignatureEditor: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableUpdatedAddImage: {\n // We'll probably want to make some experiments before enabling this\n // in Firefox release, but it has to be temporary.\n // TODO: remove it when unnecessary.\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n externalLinkRel: {\n /** @type {string} */\n value: \"noopener noreferrer nofollow\",\n kind: OptionKind.VIEWER,\n },\n externalLinkTarget: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n highlightEditorColors: {\n /** @type {string} */\n value: \"yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n historyUpdateUrl: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n ignoreDestinationZoom: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n imageResourcesPath: {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/images/\"\n : \"./images/\",\n kind: OptionKind.VIEWER,\n },\n maxCanvasPixels: {\n /** @type {number} */\n value: 2 ** 25,\n kind: OptionKind.VIEWER,\n },\n forcePageColors: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n pageColorsBackground: {\n /** @type {string} */\n value: \"Canvas\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n pageColorsForeground: {\n /** @type {string} */\n value: \"CanvasText\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n pdfBugEnabled: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n printResolution: {\n /** @type {number} */\n value: 150,\n kind: OptionKind.VIEWER,\n },\n sidebarViewOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n scrollModeOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n spreadModeOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n textLayerMode: {\n /** @type {number} */\n value: 1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n viewerCssTheme: {\n /** @type {number} */\n value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\") ? 2 : 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n viewOnLoad: {\n /** @type {boolean} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n\n cMapPacked: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n cMapUrl: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../external/bcmaps/\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/cmaps/\"\n : \"../web/cmaps/\",\n kind: OptionKind.API,\n },\n disableAutoFetch: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableFontFace: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableRange: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableStream: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n docBaseUrl: {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\"\n ? // NOTE: We cannot use the `updateUrlHash` function here, because of\n // the default preferences generation (see `gulpfile.mjs`).\n // However, the following line is *only* used in development mode.\n document.URL.split(\"#\", 1)[0]\n : \"\",\n kind: OptionKind.API,\n },\n enableHWA: {\n /** @type {boolean} */\n value: typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\"),\n kind: OptionKind.API + OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableXfa: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n fontExtraProperties: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API,\n },\n iccUrl: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../external/iccs/\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/iccs/\"\n : \"../web/iccs/\",\n kind: OptionKind.API,\n },\n isEvalSupported: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n isOffscreenCanvasSupported: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n maxImageSize: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.API,\n },\n pdfBug: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API,\n },\n standardFontDataUrl: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../external/standard_fonts/\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/standard_fonts/\"\n : \"../web/standard_fonts/\",\n kind: OptionKind.API,\n },\n useSystemFonts: {\n // On Android, there is almost no chance to have the font we want so we\n // don't use the system fonts in this case (bug 1882613).\n /** @type {boolean|undefined} */\n value: (\n typeof PDFJSDev === \"undefined\"\n ? window.isGECKOVIEW\n : PDFJSDev.test(\"GECKOVIEW\")\n )\n ? false\n : undefined,\n kind: OptionKind.API,\n type: Type.BOOLEAN + Type.UNDEFINED,\n },\n verbosity: {\n /** @type {number} */\n value: 1,\n kind: OptionKind.API,\n },\n wasmUrl: {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/wasm/\"\n : \"../web/wasm/\",\n kind: OptionKind.API,\n },\n\n workerPort: {\n /** @type {Object} */\n value: null,\n kind: OptionKind.WORKER,\n },\n workerSrc: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../src/pdf.worker.js\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/build/pdf.worker.mjs\"\n : \"../build/pdf.worker.mjs\",\n kind: OptionKind.WORKER,\n },\n};\nif (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n defaultOptions.defaultUrl = {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")\n ? \"\"\n : \"compressed.tracemonkey-pldi-09.pdf\",\n kind: OptionKind.VIEWER,\n };\n defaultOptions.sandboxBundleSrc = {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\"\n ? \"../build/dev-sandbox/pdf.sandbox.mjs\"\n : \"../build/pdf.sandbox.mjs\",\n kind: OptionKind.VIEWER,\n };\n defaultOptions.enableFakeMLManager = {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER,\n };\n}\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n defaultOptions.disablePreferences = {\n /** @type {boolean} */\n value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER,\n };\n} else if (PDFJSDev.test(\"CHROME\")) {\n defaultOptions.disableTelemetry = {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n };\n}\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING || LIB\")) {\n // Ensure that the `defaultOptions` are correctly specified.\n for (const name in defaultOptions) {\n const { value, kind, type } = defaultOptions[name];\n\n if (kind & OptionKind.PREFERENCE) {\n if (kind === OptionKind.PREFERENCE) {\n throw new Error(`Cannot use only \"PREFERENCE\" kind: ${name}`);\n }\n if (kind & OptionKind.BROWSER) {\n throw new Error(`Cannot mix \"PREFERENCE\" and \"BROWSER\" kind: ${name}`);\n }\n if (type !== undefined) {\n throw new Error(\n `Cannot have \\`type\\`-field for \"PREFERENCE\" kind: ${name}`\n );\n }\n if (typeof compatParams === \"object\" && compatParams.has(name)) {\n throw new Error(\n `Should not have compatibility-value for \"PREFERENCE\" kind: ${name}`\n );\n }\n // Only \"simple\" preference-values are allowed.\n if (\n typeof value !== \"boolean\" &&\n typeof value !== \"string\" &&\n !Number.isInteger(value)\n ) {\n throw new Error(`Invalid value for \"PREFERENCE\" kind: ${name}`);\n }\n } else if (kind & OptionKind.BROWSER) {\n if (type !== undefined) {\n throw new Error(\n `Cannot have \\`type\\`-field for \"BROWSER\" kind: ${name}`\n );\n }\n if (typeof compatParams === \"object\" && compatParams.has(name)) {\n throw new Error(\n `Should not have compatibility-value for \"BROWSER\" kind: ${name}`\n );\n }\n if (value === undefined) {\n throw new Error(`Invalid value for \"BROWSER\" kind: ${name}`);\n }\n }\n }\n}\n\nclass AppOptions {\n static eventBus;\n\n static #opts = new Map();\n\n static {\n // Initialize all the user-options.\n for (const name in defaultOptions) {\n this.#opts.set(name, defaultOptions[name].value);\n }\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // Apply any compatibility-values to the user-options.\n for (const [name, value] of compatParams) {\n this.#opts.set(name, value);\n }\n this._hasInvokedSet = false;\n\n this._checkDisablePreferences = () => {\n if (this.get(\"disablePreferences\")) {\n // Give custom implementations of the default viewer a simpler way to\n // opt-out of having the `Preferences` override existing `AppOptions`.\n return true;\n }\n if (this._hasInvokedSet) {\n console.warn(\n \"The Preferences may override manually set AppOptions; \" +\n 'please use the \"disablePreferences\"-option to prevent that.'\n );\n }\n return false;\n };\n }\n }\n\n constructor() {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n throw new Error(\"Cannot initialize AppOptions.\");\n }\n }\n\n static get(name) {\n return this.#opts.get(name);\n }\n\n static getAll(kind = null, defaultOnly = false) {\n const options = Object.create(null);\n for (const name in defaultOptions) {\n const defaultOpt = defaultOptions[name];\n\n if (kind && !(kind & defaultOpt.kind)) {\n continue;\n }\n options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value;\n }\n return options;\n }\n\n static set(name, value) {\n this.setAll({ [name]: value });\n }\n\n static setAll(options, prefs = false) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n this._hasInvokedSet ||= true;\n }\n let events;\n\n for (const name in options) {\n const defaultOpt = defaultOptions[name],\n userOpt = options[name];\n\n if (\n !defaultOpt ||\n !(\n typeof userOpt === typeof defaultOpt.value ||\n Type[(typeof userOpt).toUpperCase()] & defaultOpt.type\n )\n ) {\n continue;\n }\n const { kind } = defaultOpt;\n\n if (\n prefs &&\n !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)\n ) {\n continue;\n }\n if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) {\n (events ||= new Map()).set(name, userOpt);\n }\n this.#opts.set(name, userOpt);\n }\n\n if (events) {\n for (const [name, value] of events) {\n this.eventBus.dispatch(name.toLowerCase(), { source: this, value });\n }\n }\n }\n}\n\nexport { AppOptions, OptionKind };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./interfaces\").IPDFLinkService} IPDFLinkService */\n\nimport { isValidExplicitDest } from \"pdfjs-lib\";\nimport { parseQueryString } from \"./ui_utils.js\";\n\nconst DEFAULT_LINK_REL = \"noopener noreferrer nofollow\";\n\nconst LinkTarget = {\n NONE: 0, // Default value.\n SELF: 1,\n BLANK: 2,\n PARENT: 3,\n TOP: 4,\n};\n\n/**\n * @typedef {Object} PDFLinkServiceOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [externalLinkTarget] - Specifies the `target` attribute\n * for external links. Must use one of the values from {LinkTarget}.\n * Defaults to using no target.\n * @property {string} [externalLinkRel] - Specifies the `rel` attribute for\n * external links. Defaults to stripping the referrer.\n * @property {boolean} [ignoreDestinationZoom] - Ignores the zoom argument,\n * thus preserving the current zoom level in the viewer, when navigating\n * to internal destinations. The default value is `false`.\n */\n\n/**\n * Performs navigation functions inside PDF, such as opening specified page,\n * or destination.\n * @implements {IPDFLinkService}\n */\nclass PDFLinkService {\n externalLinkEnabled = true;\n\n /**\n * @param {PDFLinkServiceOptions} options\n */\n constructor({\n eventBus,\n externalLinkTarget = null,\n externalLinkRel = null,\n ignoreDestinationZoom = false,\n } = {}) {\n this.eventBus = eventBus;\n this.externalLinkTarget = externalLinkTarget;\n this.externalLinkRel = externalLinkRel;\n this._ignoreDestinationZoom = ignoreDestinationZoom;\n\n this.baseUrl = null;\n this.pdfDocument = null;\n this.pdfViewer = null;\n this.pdfHistory = null;\n }\n\n setDocument(pdfDocument, baseUrl = null) {\n this.baseUrl = baseUrl;\n this.pdfDocument = pdfDocument;\n }\n\n setViewer(pdfViewer) {\n this.pdfViewer = pdfViewer;\n }\n\n setHistory(pdfHistory) {\n this.pdfHistory = pdfHistory;\n }\n\n /**\n * @type {number}\n */\n get pagesCount() {\n return this.pdfDocument ? this.pdfDocument.numPages : 0;\n }\n\n /**\n * @type {number}\n */\n get page() {\n return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1;\n }\n\n /**\n * @param {number} value\n */\n set page(value) {\n if (this.pdfDocument) {\n this.pdfViewer.currentPageNumber = value;\n }\n }\n\n /**\n * @type {number}\n */\n get rotation() {\n return this.pdfDocument ? this.pdfViewer.pagesRotation : 0;\n }\n\n /**\n * @param {number} value\n */\n set rotation(value) {\n if (this.pdfDocument) {\n this.pdfViewer.pagesRotation = value;\n }\n }\n\n /**\n * @type {boolean}\n */\n get isInPresentationMode() {\n return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false;\n }\n\n /**\n * This method will, when available, also update the browser history.\n *\n * @param {string|Array} dest - The named, or explicit, PDF destination.\n */\n async goToDestination(dest) {\n if (!this.pdfDocument) {\n return;\n }\n let namedDest, explicitDest, pageNumber;\n if (typeof dest === \"string\") {\n namedDest = dest;\n explicitDest = await this.pdfDocument.getDestination(dest);\n } else {\n namedDest = null;\n explicitDest = await dest;\n }\n if (!Array.isArray(explicitDest)) {\n console.error(\n `goToDestination: \"${explicitDest}\" is not a valid destination array, for dest=\"${dest}\".`\n );\n return;\n }\n // Dest array looks like that: \n const [destRef] = explicitDest;\n\n if (destRef && typeof destRef === \"object\") {\n pageNumber = this.pdfDocument.cachedPageNumber(destRef);\n\n if (!pageNumber) {\n // Fetch the page reference if it's not yet available. This could\n // only occur during loading, before all pages have been resolved.\n try {\n pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1;\n } catch {\n console.error(\n `goToDestination: \"${destRef}\" is not a valid page reference, for dest=\"${dest}\".`\n );\n return;\n }\n }\n } else if (Number.isInteger(destRef)) {\n pageNumber = destRef + 1;\n }\n if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {\n console.error(\n `goToDestination: \"${pageNumber}\" is not a valid page number, for dest=\"${dest}\".`\n );\n return;\n }\n\n if (this.pdfHistory) {\n // Update the browser history before scrolling the new destination into\n // view, to be able to accurately capture the current document position.\n this.pdfHistory.pushCurrentPosition();\n this.pdfHistory.push({ namedDest, explicitDest, pageNumber });\n }\n\n this.pdfViewer.scrollPageIntoView({\n pageNumber,\n destArray: explicitDest,\n ignoreDestinationZoom: this._ignoreDestinationZoom,\n });\n }\n\n /**\n * This method will, when available, also update the browser history.\n *\n * @param {number|string} val - The page number, or page label.\n */\n goToPage(val) {\n if (!this.pdfDocument) {\n return;\n }\n const pageNumber =\n (typeof val === \"string\" && this.pdfViewer.pageLabelToPageNumber(val)) ||\n val | 0;\n if (\n !(\n Number.isInteger(pageNumber) &&\n pageNumber > 0 &&\n pageNumber <= this.pagesCount\n )\n ) {\n console.error(`PDFLinkService.goToPage: \"${val}\" is not a valid page.`);\n return;\n }\n\n if (this.pdfHistory) {\n // Update the browser history before scrolling the new page into view,\n // to be able to accurately capture the current document position.\n this.pdfHistory.pushCurrentPosition();\n this.pdfHistory.pushPage(pageNumber);\n }\n\n this.pdfViewer.scrollPageIntoView({ pageNumber });\n }\n\n /**\n * Adds various attributes (href, title, target, rel) to hyperlinks.\n * @param {HTMLAnchorElement} link\n * @param {string} url\n * @param {boolean} [newWindow]\n */\n addLinkAttributes(link, url, newWindow = false) {\n if (!url || typeof url !== \"string\") {\n throw new Error('A valid \"url\" parameter must provided.');\n }\n const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget,\n rel = this.externalLinkRel;\n\n if (this.externalLinkEnabled) {\n link.href = link.title = url;\n } else {\n link.href = \"\";\n link.title = `Disabled: ${url}`;\n link.onclick = () => false;\n }\n\n let targetStr = \"\"; // LinkTarget.NONE\n switch (target) {\n case LinkTarget.NONE:\n break;\n case LinkTarget.SELF:\n targetStr = \"_self\";\n break;\n case LinkTarget.BLANK:\n targetStr = \"_blank\";\n break;\n case LinkTarget.PARENT:\n targetStr = \"_parent\";\n break;\n case LinkTarget.TOP:\n targetStr = \"_top\";\n break;\n }\n link.target = targetStr;\n\n link.rel = typeof rel === \"string\" ? rel : DEFAULT_LINK_REL;\n }\n\n /**\n * @param {string|Array} dest - The PDF destination object.\n * @returns {string} The hyperlink to the PDF object.\n */\n getDestinationHash(dest) {\n if (typeof dest === \"string\") {\n if (dest.length > 0) {\n return this.getAnchorUrl(\"#\" + escape(dest));\n }\n } else if (Array.isArray(dest)) {\n const str = JSON.stringify(dest);\n if (str.length > 0) {\n return this.getAnchorUrl(\"#\" + escape(str));\n }\n }\n return this.getAnchorUrl(\"\");\n }\n\n /**\n * Prefix the full url on anchor links to make sure that links are resolved\n * relative to the current URL instead of the one defined in .\n * @param {string} anchor - The anchor hash, including the #.\n * @returns {string} The hyperlink to the PDF object.\n */\n getAnchorUrl(anchor) {\n return this.baseUrl ? this.baseUrl + anchor : anchor;\n }\n\n /**\n * @param {string} hash\n */\n setHash(hash) {\n if (!this.pdfDocument) {\n return;\n }\n let pageNumber, dest;\n if (hash.includes(\"=\")) {\n const params = parseQueryString(hash);\n if (params.has(\"search\")) {\n const query = params.get(\"search\").replaceAll('\"', \"\"),\n phrase = params.get(\"phrase\") === \"true\";\n\n this.eventBus.dispatch(\"findfromurlhash\", {\n source: this,\n query: phrase ? query : query.match(/\\S+/g),\n });\n }\n // borrowing syntax from \"Parameters for Opening PDF Files\"\n if (params.has(\"page\")) {\n pageNumber = params.get(\"page\") | 0 || 1;\n }\n if (params.has(\"zoom\")) {\n // Build the destination array.\n const zoomArgs = params.get(\"zoom\").split(\",\"); // scale,left,top\n const zoomArg = zoomArgs[0];\n const zoomArgNumber = parseFloat(zoomArg);\n\n if (!zoomArg.includes(\"Fit\")) {\n // If the zoomArg is a number, it has to get divided by 100. If it's\n // a string, it should stay as it is.\n dest = [\n null,\n { name: \"XYZ\" },\n zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n zoomArgs.length > 2 ? zoomArgs[2] | 0 : null,\n zoomArgNumber ? zoomArgNumber / 100 : zoomArg,\n ];\n } else if (zoomArg === \"Fit\" || zoomArg === \"FitB\") {\n dest = [null, { name: zoomArg }];\n } else if (\n zoomArg === \"FitH\" ||\n zoomArg === \"FitBH\" ||\n zoomArg === \"FitV\" ||\n zoomArg === \"FitBV\"\n ) {\n dest = [\n null,\n { name: zoomArg },\n zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n ];\n } else if (zoomArg === \"FitR\") {\n if (zoomArgs.length !== 5) {\n console.error(\n 'PDFLinkService.setHash: Not enough parameters for \"FitR\".'\n );\n } else {\n dest = [\n null,\n { name: zoomArg },\n zoomArgs[1] | 0,\n zoomArgs[2] | 0,\n zoomArgs[3] | 0,\n zoomArgs[4] | 0,\n ];\n }\n } else {\n console.error(\n `PDFLinkService.setHash: \"${zoomArg}\" is not a valid zoom value.`\n );\n }\n }\n if (dest) {\n this.pdfViewer.scrollPageIntoView({\n pageNumber: pageNumber || this.page,\n destArray: dest,\n allowNegativeOffset: true,\n });\n } else if (pageNumber) {\n this.page = pageNumber; // simple page\n }\n if (params.has(\"pagemode\")) {\n this.eventBus.dispatch(\"pagemode\", {\n source: this,\n mode: params.get(\"pagemode\"),\n });\n }\n // Ensure that this parameter is *always* handled last, in order to\n // guarantee that it won't be overridden (e.g. by the \"page\" parameter).\n if (params.has(\"nameddest\")) {\n this.goToDestination(params.get(\"nameddest\"));\n }\n\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n return;\n }\n // Support opening of PDF attachments in the Firefox PDF Viewer,\n // which uses a couple of non-standard hash parameters; refer to\n // `DownloadManager.openOrDownloadData` in the firefoxcom.js file.\n if (!params.has(\"filename\") || !params.has(\"filedest\")) {\n return;\n }\n hash = params.get(\"filedest\");\n }\n\n // Named (or explicit) destination.\n dest = unescape(hash);\n try {\n dest = JSON.parse(dest);\n\n if (!Array.isArray(dest)) {\n // Avoid incorrectly rejecting a valid named destination, such as\n // e.g. \"4.3\" or \"true\", because `JSON.parse` converted its type.\n dest = dest.toString();\n }\n } catch {}\n\n if (typeof dest === \"string\" || isValidExplicitDest(dest)) {\n this.goToDestination(dest);\n return;\n }\n console.error(\n `PDFLinkService.setHash: \"${unescape(hash)}\" is not a valid destination.`\n );\n }\n\n /**\n * @param {string} action\n */\n executeNamedAction(action) {\n if (!this.pdfDocument) {\n return;\n }\n // See PDF reference, table 8.45 - Named action\n switch (action) {\n case \"GoBack\":\n this.pdfHistory?.back();\n break;\n\n case \"GoForward\":\n this.pdfHistory?.forward();\n break;\n\n case \"NextPage\":\n this.pdfViewer.nextPage();\n break;\n\n case \"PrevPage\":\n this.pdfViewer.previousPage();\n break;\n\n case \"LastPage\":\n this.page = this.pagesCount;\n break;\n\n case \"FirstPage\":\n this.page = 1;\n break;\n\n default:\n break; // No action according to spec\n }\n\n this.eventBus.dispatch(\"namedaction\", {\n source: this,\n action,\n });\n }\n\n /**\n * @param {Object} action\n */\n async executeSetOCGState(action) {\n if (!this.pdfDocument) {\n return;\n }\n const pdfDocument = this.pdfDocument,\n optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise;\n\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the optional content resolved.\n }\n optionalContentConfig.setOCGState(action);\n\n this.pdfViewer.optionalContentConfigPromise = Promise.resolve(\n optionalContentConfig\n );\n }\n}\n\n/**\n * @implements {IPDFLinkService}\n */\nclass SimpleLinkService extends PDFLinkService {\n setDocument(pdfDocument, baseUrl = null) {}\n}\n\nexport { LinkTarget, PDFLinkService, SimpleLinkService };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst WaitOnType = {\n EVENT: \"event\",\n TIMEOUT: \"timeout\",\n};\n\n/**\n * @typedef {Object} WaitOnEventOrTimeoutParameters\n * @property {Object} target - The event target, can for example be:\n * `window`, `document`, a DOM element, or an {EventBus} instance.\n * @property {string} name - The name of the event.\n * @property {number} delay - The delay, in milliseconds, after which the\n * timeout occurs (if the event wasn't already dispatched).\n */\n\n/**\n * Allows waiting for an event or a timeout, whichever occurs first.\n * Can be used to ensure that an action always occurs, even when an event\n * arrives late or not at all.\n *\n * @param {WaitOnEventOrTimeoutParameters}\n * @returns {Promise} A promise that is resolved with a {WaitOnType} value.\n */\nasync function waitOnEventOrTimeout({ target, name, delay = 0 }) {\n if (\n typeof target !== \"object\" ||\n !(name && typeof name === \"string\") ||\n !(Number.isInteger(delay) && delay >= 0)\n ) {\n throw new Error(\"waitOnEventOrTimeout - invalid parameters.\");\n }\n const { promise, resolve } = Promise.withResolvers();\n const ac = new AbortController();\n\n function handler(type) {\n ac.abort(); // Remove event listener.\n clearTimeout(timeout);\n\n resolve(type);\n }\n\n const evtMethod = target instanceof EventBus ? \"_on\" : \"addEventListener\";\n target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), {\n signal: ac.signal,\n });\n\n const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay);\n\n return promise;\n}\n\n/**\n * Simple event bus for an application. Listeners are attached using the `on`\n * and `off` methods. To raise an event, the `dispatch` method shall be used.\n */\nclass EventBus {\n #listeners = Object.create(null);\n\n /**\n * @param {string} eventName\n * @param {function} listener\n * @param {Object} [options]\n */\n on(eventName, listener, options = null) {\n this._on(eventName, listener, {\n external: true,\n once: options?.once,\n signal: options?.signal,\n });\n }\n\n /**\n * @param {string} eventName\n * @param {function} listener\n * @param {Object} [options]\n */\n off(eventName, listener, options = null) {\n this._off(eventName, listener);\n }\n\n /**\n * @param {string} eventName\n * @param {Object} data\n */\n dispatch(eventName, data) {\n const eventListeners = this.#listeners[eventName];\n if (!eventListeners || eventListeners.length === 0) {\n return;\n }\n let externalListeners;\n // Making copy of the listeners array in case if it will be modified\n // during dispatch.\n for (const { listener, external, once } of eventListeners.slice(0)) {\n if (once) {\n this._off(eventName, listener);\n }\n if (external) {\n (externalListeners ||= []).push(listener);\n continue;\n }\n listener(data);\n }\n // Dispatch any \"external\" listeners *after* the internal ones, to give the\n // viewer components time to handle events and update their state first.\n if (externalListeners) {\n for (const listener of externalListeners) {\n listener(data);\n }\n externalListeners = null;\n }\n }\n\n /**\n * @ignore\n */\n _on(eventName, listener, options = null) {\n let rmAbort = null;\n if (options?.signal instanceof AbortSignal) {\n const { signal } = options;\n if (signal.aborted) {\n console.error(\"Cannot use an `aborted` signal.\");\n return;\n }\n const onAbort = () => this._off(eventName, listener);\n rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n\n signal.addEventListener(\"abort\", onAbort);\n }\n\n const eventListeners = (this.#listeners[eventName] ||= []);\n eventListeners.push({\n listener,\n external: options?.external === true,\n once: options?.once === true,\n rmAbort,\n });\n }\n\n /**\n * @ignore\n */\n _off(eventName, listener, options = null) {\n const eventListeners = this.#listeners[eventName];\n if (!eventListeners) {\n return;\n }\n for (let i = 0, ii = eventListeners.length; i < ii; i++) {\n const evt = eventListeners[i];\n if (evt.listener === listener) {\n evt.rmAbort?.(); // Ensure that the `AbortSignal` listener is removed.\n eventListeners.splice(i, 1);\n return;\n }\n }\n }\n}\n\n/**\n * NOTE: Only used in the Firefox build-in pdf viewer.\n */\nclass FirefoxEventBus extends EventBus {\n #externalServices;\n\n #globalEventNames;\n\n #isInAutomation;\n\n constructor(globalEventNames, externalServices, isInAutomation) {\n super();\n this.#globalEventNames = globalEventNames;\n this.#externalServices = externalServices;\n this.#isInAutomation = isInAutomation;\n }\n\n dispatch(eventName, data) {\n if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: FirefoxEventBus.dispatch\");\n }\n super.dispatch(eventName, data);\n\n if (this.#isInAutomation) {\n const detail = Object.create(null);\n if (data) {\n for (const key in data) {\n const value = data[key];\n if (key === \"source\") {\n if (value === window || value === document) {\n return; // No need to re-dispatch (already) global events.\n }\n continue; // Ignore the `source` property.\n }\n detail[key] = value;\n }\n }\n const event = new CustomEvent(eventName, {\n bubbles: true,\n cancelable: true,\n detail,\n });\n document.dispatchEvent(event);\n }\n\n if (this.#globalEventNames?.has(eventName)) {\n this.#externalServices.dispatchGlobalEvent({\n eventName,\n detail: data,\n });\n }\n }\n}\n\nexport { EventBus, FirefoxEventBus, waitOnEventOrTimeout, WaitOnType };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces.js\").IL10n} IL10n */\n\nclass BaseExternalServices {\n constructor() {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseExternalServices\n ) {\n throw new Error(\"Cannot initialize BaseExternalServices.\");\n }\n }\n\n updateFindControlState(data) {}\n\n updateFindMatchesCount(data) {}\n\n initPassiveLoading() {}\n\n reportTelemetry(data) {}\n\n /**\n * @returns {Promise}\n */\n async createL10n() {\n throw new Error(\"Not implemented: createL10n\");\n }\n\n createScripting() {\n throw new Error(\"Not implemented: createScripting\");\n }\n\n createSignatureStorage() {\n throw new Error(\"Not implemented: createSignatureStorage\");\n }\n\n updateEditorStates(data) {\n throw new Error(\"Not implemented: updateEditorStates\");\n }\n\n dispatchGlobalEvent(_event) {}\n}\n\nexport { BaseExternalServices };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppOptions, OptionKind } from \"./app_options.js\";\n\n/**\n * BasePreferences - Abstract base class for storing persistent settings.\n * Used for settings that should be applied to all opened documents,\n * or every time the viewer is loaded.\n */\nclass BasePreferences {\n #defaults = Object.freeze(\n typeof PDFJSDev === \"undefined\"\n ? AppOptions.getAll(OptionKind.PREFERENCE, /* defaultOnly = */ true)\n : PDFJSDev.eval(\"DEFAULT_PREFERENCES\")\n );\n\n #initializedPromise = null;\n\n constructor() {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BasePreferences\n ) {\n throw new Error(\"Cannot initialize BasePreferences.\");\n }\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")) {\n Object.defineProperty(this, \"defaults\", {\n get() {\n return this.#defaults;\n },\n });\n }\n\n this.#initializedPromise = this._readFromStorage(this.#defaults).then(\n ({ browserPrefs, prefs }) => {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n AppOptions._checkDisablePreferences()\n ) {\n return;\n }\n AppOptions.setAll({ ...browserPrefs, ...prefs }, /* prefs = */ true);\n }\n );\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n window.addEventListener(\n \"updatedPreference\",\n async ({ detail: { name, value } }) => {\n await this.#initializedPromise;\n AppOptions.setAll({ [name]: value }, /* prefs = */ true);\n }\n );\n }\n }\n\n /**\n * Stub function for writing preferences to storage.\n * @param {Object} prefObj The preferences that should be written to storage.\n * @returns {Promise} A promise that is resolved when the preference values\n * have been written.\n */\n async _writeToStorage(prefObj) {\n throw new Error(\"Not implemented: _writeToStorage\");\n }\n\n /**\n * Stub function for reading preferences from storage.\n * @param {Object} prefObj The preferences that should be read from storage.\n * @returns {Promise} A promise that is resolved with an {Object} containing\n * the preferences that have been read.\n */\n async _readFromStorage(prefObj) {\n throw new Error(\"Not implemented: _readFromStorage\");\n }\n\n /**\n * Reset the preferences to their default values and update storage.\n * @returns {Promise} A promise that is resolved when the preference values\n * have been reset.\n */\n async reset() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Please use `about:config` to change preferences.\");\n }\n await this.#initializedPromise;\n AppOptions.setAll(this.#defaults, /* prefs = */ true);\n\n await this._writeToStorage(this.#defaults);\n }\n\n /**\n * Set the value of a preference.\n * @param {string} name The name of the preference that should be changed.\n * @param {boolean|number|string} value The new value of the preference.\n * @returns {Promise} A promise that is resolved when the value has been set,\n * provided that the preference exists and the types match.\n */\n async set(name, value) {\n await this.#initializedPromise;\n AppOptions.setAll({ [name]: value }, /* prefs = */ true);\n\n await this._writeToStorage(\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? { [name]: AppOptions.get(name) }\n : AppOptions.getAll(OptionKind.PREFERENCE)\n );\n }\n\n /**\n * Get the value of a preference.\n * @param {string} name The name of the preference whose value is requested.\n * @returns {Promise} A promise resolved with a {boolean|number|string}\n * containing the value of the preference.\n */\n async get(name) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: get\");\n }\n await this.#initializedPromise;\n return AppOptions.get(name);\n }\n\n get initializedPromise() {\n return this.#initializedPromise;\n }\n}\n\nexport { BasePreferences };\n","/**\n * The `FluentType` class is the base of Fluent's type system.\n *\n * Fluent types wrap JavaScript values and store additional configuration for\n * them, which can then be used in the `toString` method together with a proper\n * `Intl` formatter.\n */\nexport class FluentType {\n /**\n * Create a `FluentType` instance.\n *\n * @param value The JavaScript value to wrap.\n */\n constructor(value) {\n this.value = value;\n }\n /**\n * Unwrap the raw value stored by this `FluentType`.\n */\n valueOf() {\n return this.value;\n }\n}\n/**\n * A {@link FluentType} representing no correct value.\n */\nexport class FluentNone extends FluentType {\n /**\n * Create an instance of `FluentNone` with an optional fallback value.\n * @param value The fallback value of this `FluentNone`.\n */\n constructor(value = \"???\") {\n super(value);\n }\n /**\n * Format this `FluentNone` to the fallback string.\n */\n toString(scope) {\n return `{${this.value}}`;\n }\n}\n/**\n * A {@link FluentType} representing a number.\n *\n * A `FluentNumber` instance stores the number value of the number it\n * represents. It may also store an option bag of options which will be passed\n * to `Intl.NumerFormat` when the `FluentNumber` is formatted to a string.\n */\nexport class FluentNumber extends FluentType {\n /**\n * Create an instance of `FluentNumber` with options to the\n * `Intl.NumberFormat` constructor.\n *\n * @param value The number value of this `FluentNumber`.\n * @param opts Options which will be passed to `Intl.NumberFormat`.\n */\n constructor(value, opts = {}) {\n super(value);\n this.opts = opts;\n }\n /**\n * Format this `FluentNumber` to a string.\n */\n toString(scope) {\n if (scope) {\n try {\n const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts);\n return nf.format(this.value);\n }\n catch (err) {\n scope.reportError(err);\n }\n }\n return this.value.toString(10);\n }\n}\n/**\n * A {@link FluentType} representing a date and time.\n *\n * A `FluentDateTime` instance stores a Date object, Temporal object, or a number\n * as a numerical timestamp in milliseconds. It may also store an\n * option bag of options which will be passed to `Intl.DateTimeFormat` when the\n * `FluentDateTime` is formatted to a string.\n */\nexport class FluentDateTime extends FluentType {\n static supportsValue(value) {\n if (typeof value === \"number\")\n return true;\n if (value instanceof Date)\n return true;\n if (value instanceof FluentType)\n return FluentDateTime.supportsValue(value.valueOf());\n // Temporary workaround to support environments without Temporal\n if (\"Temporal\" in globalThis) {\n // for TypeScript, which doesn't know about Temporal yet\n const _Temporal = globalThis.Temporal;\n if (value instanceof _Temporal.Instant ||\n value instanceof _Temporal.PlainDateTime ||\n value instanceof _Temporal.PlainDate ||\n value instanceof _Temporal.PlainMonthDay ||\n value instanceof _Temporal.PlainTime ||\n value instanceof _Temporal.PlainYearMonth) {\n return true;\n }\n }\n return false;\n }\n /**\n * Create an instance of `FluentDateTime` with options to the\n * `Intl.DateTimeFormat` constructor.\n *\n * @param value The number value of this `FluentDateTime`, in milliseconds.\n * @param opts Options which will be passed to `Intl.DateTimeFormat`.\n */\n constructor(value, opts = {}) {\n // unwrap any FluentType value, but only retain the opts from FluentDateTime\n if (value instanceof FluentDateTime) {\n opts = { ...value.opts, ...opts };\n value = value.value;\n }\n else if (value instanceof FluentType) {\n value = value.valueOf();\n }\n // Intl.DateTimeFormat defaults to gregorian calendar, but Temporal defaults to iso8601\n if (typeof value === \"object\" &&\n \"calendarId\" in value &&\n opts.calendar === undefined) {\n opts = { ...opts, calendar: value.calendarId };\n }\n super(value);\n this.opts = opts;\n }\n [Symbol.toPrimitive](hint) {\n return hint === \"string\" ? this.toString() : this.toNumber();\n }\n /**\n * Convert this `FluentDateTime` to a number.\n * Note that this isn't always possible due to the nature of Temporal objects.\n * In such cases, a TypeError will be thrown.\n */\n toNumber() {\n const value = this.value;\n if (typeof value === \"number\")\n return value;\n if (value instanceof Date)\n return value.getTime();\n if (\"epochMilliseconds\" in value) {\n return value.epochMilliseconds;\n }\n if (\"toZonedDateTime\" in value) {\n return value.toZonedDateTime(\"UTC\").epochMilliseconds;\n }\n throw new TypeError(\"Unwrapping a non-number value as a number\");\n }\n /**\n * Format this `FluentDateTime` to a string.\n */\n toString(scope) {\n if (scope) {\n try {\n const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts);\n return dtf.format(this.value);\n }\n catch (err) {\n scope.reportError(err);\n }\n }\n if (typeof this.value === \"number\" || this.value instanceof Date) {\n return new Date(this.value).toISOString();\n }\n return this.value.toString();\n }\n}\n","/**\n * The role of the Fluent resolver is to format a `Pattern` to an instance of\n * `FluentValue`. For performance reasons, primitive strings are considered\n * such instances, too.\n *\n * Translations can contain references to other messages or variables,\n * conditional logic in form of select expressions, traits which describe their\n * grammatical features, and can use Fluent builtins which make use of the\n * `Intl` formatters to format numbers and dates into the bundle's languages.\n * See the documentation of the Fluent syntax for more information.\n *\n * In case of errors the resolver will try to salvage as much of the\n * translation as possible. In rare situations where the resolver didn't know\n * how to recover from an error it will return an instance of `FluentNone`.\n *\n * All expressions resolve to an instance of `FluentValue`. The caller should\n * use the `toString` method to convert the instance to a native value.\n *\n * Functions in this file pass around an instance of the `Scope` class, which\n * stores the data required for successful resolution and error recovery.\n */\nimport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n/**\n * The maximum number of placeables which can be expanded in a single call to\n * `formatPattern`. The limit protects against the Billion Laughs and Quadratic\n * Blowup attacks. See https://msdn.microsoft.com/en-us/magazine/ee335713.aspx.\n */\nconst MAX_PLACEABLES = 100;\n/** Unicode bidi isolation characters. */\nconst FSI = \"\\u2068\";\nconst PDI = \"\\u2069\";\n/** Helper: match a variant key to the given selector. */\nfunction match(scope, selector, key) {\n if (key === selector) {\n // Both are strings.\n return true;\n }\n // XXX Consider comparing options too, e.g. minimumFractionDigits.\n if (key instanceof FluentNumber &&\n selector instanceof FluentNumber &&\n key.value === selector.value) {\n return true;\n }\n if (selector instanceof FluentNumber && typeof key === \"string\") {\n let category = scope\n .memoizeIntlObject(Intl.PluralRules, selector.opts)\n .select(selector.value);\n if (key === category) {\n return true;\n }\n }\n return false;\n}\n/** Helper: resolve the default variant from a list of variants. */\nfunction getDefault(scope, variants, star) {\n if (variants[star]) {\n return resolvePattern(scope, variants[star].value);\n }\n scope.reportError(new RangeError(\"No default\"));\n return new FluentNone();\n}\n/** Helper: resolve arguments to a call expression. */\nfunction getArguments(scope, args) {\n const positional = [];\n const named = Object.create(null);\n for (const arg of args) {\n if (arg.type === \"narg\") {\n named[arg.name] = resolveExpression(scope, arg.value);\n }\n else {\n positional.push(resolveExpression(scope, arg));\n }\n }\n return { positional, named };\n}\n/** Resolve an expression to a Fluent type. */\nfunction resolveExpression(scope, expr) {\n switch (expr.type) {\n case \"str\":\n return expr.value;\n case \"num\":\n return new FluentNumber(expr.value, {\n minimumFractionDigits: expr.precision,\n });\n case \"var\":\n return resolveVariableReference(scope, expr);\n case \"mesg\":\n return resolveMessageReference(scope, expr);\n case \"term\":\n return resolveTermReference(scope, expr);\n case \"func\":\n return resolveFunctionReference(scope, expr);\n case \"select\":\n return resolveSelectExpression(scope, expr);\n default:\n return new FluentNone();\n }\n}\n/** Resolve a reference to a variable. */\nfunction resolveVariableReference(scope, { name }) {\n let arg;\n if (scope.params) {\n // We're inside a TermReference. It's OK to reference undefined parameters.\n if (Object.prototype.hasOwnProperty.call(scope.params, name)) {\n arg = scope.params[name];\n }\n else {\n return new FluentNone(`$${name}`);\n }\n }\n else if (scope.args &&\n Object.prototype.hasOwnProperty.call(scope.args, name)) {\n // We're in the top-level Pattern or inside a MessageReference. Missing\n // variables references produce ReferenceErrors.\n arg = scope.args[name];\n }\n else {\n scope.reportError(new ReferenceError(`Unknown variable: $${name}`));\n return new FluentNone(`$${name}`);\n }\n // Return early if the argument already is an instance of FluentType.\n if (arg instanceof FluentType) {\n return arg;\n }\n // Convert the argument to a Fluent type.\n switch (typeof arg) {\n case \"string\":\n return arg;\n case \"number\":\n return new FluentNumber(arg);\n case \"object\":\n if (FluentDateTime.supportsValue(arg)) {\n return new FluentDateTime(arg);\n }\n // eslint-disable-next-line no-fallthrough\n default:\n scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`));\n return new FluentNone(`$${name}`);\n }\n}\n/** Resolve a reference to another message. */\nfunction resolveMessageReference(scope, { name, attr }) {\n const message = scope.bundle._messages.get(name);\n if (!message) {\n scope.reportError(new ReferenceError(`Unknown message: ${name}`));\n return new FluentNone(name);\n }\n if (attr) {\n const attribute = message.attributes[attr];\n if (attribute) {\n return resolvePattern(scope, attribute);\n }\n scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n return new FluentNone(`${name}.${attr}`);\n }\n if (message.value) {\n return resolvePattern(scope, message.value);\n }\n scope.reportError(new ReferenceError(`No value: ${name}`));\n return new FluentNone(name);\n}\n/** Resolve a call to a Term with key-value arguments. */\nfunction resolveTermReference(scope, { name, attr, args }) {\n const id = `-${name}`;\n const term = scope.bundle._terms.get(id);\n if (!term) {\n scope.reportError(new ReferenceError(`Unknown term: ${id}`));\n return new FluentNone(id);\n }\n if (attr) {\n const attribute = term.attributes[attr];\n if (attribute) {\n // Every TermReference has its own variables.\n scope.params = getArguments(scope, args).named;\n const resolved = resolvePattern(scope, attribute);\n scope.params = null;\n return resolved;\n }\n scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n return new FluentNone(`${id}.${attr}`);\n }\n scope.params = getArguments(scope, args).named;\n const resolved = resolvePattern(scope, term.value);\n scope.params = null;\n return resolved;\n}\n/** Resolve a call to a Function with positional and key-value arguments. */\nfunction resolveFunctionReference(scope, { name, args }) {\n // Some functions are built-in. Others may be provided by the runtime via\n // the `FluentBundle` constructor.\n let func = scope.bundle._functions[name];\n if (!func) {\n scope.reportError(new ReferenceError(`Unknown function: ${name}()`));\n return new FluentNone(`${name}()`);\n }\n if (typeof func !== \"function\") {\n scope.reportError(new TypeError(`Function ${name}() is not callable`));\n return new FluentNone(`${name}()`);\n }\n try {\n let resolved = getArguments(scope, args);\n return func(resolved.positional, resolved.named);\n }\n catch (err) {\n scope.reportError(err);\n return new FluentNone(`${name}()`);\n }\n}\n/** Resolve a select expression to the member object. */\nfunction resolveSelectExpression(scope, { selector, variants, star }) {\n let sel = resolveExpression(scope, selector);\n if (sel instanceof FluentNone) {\n return getDefault(scope, variants, star);\n }\n // Match the selector against keys of each variant, in order.\n for (const variant of variants) {\n const key = resolveExpression(scope, variant.key);\n if (match(scope, sel, key)) {\n return resolvePattern(scope, variant.value);\n }\n }\n return getDefault(scope, variants, star);\n}\n/** Resolve a pattern (a complex string with placeables). */\nexport function resolveComplexPattern(scope, ptn) {\n if (scope.dirty.has(ptn)) {\n scope.reportError(new RangeError(\"Cyclic reference\"));\n return new FluentNone();\n }\n // Tag the pattern as dirty for the purpose of the current resolution.\n scope.dirty.add(ptn);\n const result = [];\n // Wrap interpolations with Directional Isolate Formatting characters\n // only when the pattern has more than one element.\n const useIsolating = scope.bundle._useIsolating && ptn.length > 1;\n for (const elem of ptn) {\n if (typeof elem === \"string\") {\n result.push(scope.bundle._transform(elem));\n continue;\n }\n scope.placeables++;\n if (scope.placeables > MAX_PLACEABLES) {\n scope.dirty.delete(ptn);\n // This is a fatal error which causes the resolver to instantly bail out\n // on this pattern. The length check protects against excessive memory\n // usage, and throwing protects against eating up the CPU when long\n // placeables are deeply nested.\n throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` +\n `max allowed is ${MAX_PLACEABLES}`);\n }\n if (useIsolating) {\n result.push(FSI);\n }\n result.push(resolveExpression(scope, elem).toString(scope));\n if (useIsolating) {\n result.push(PDI);\n }\n }\n scope.dirty.delete(ptn);\n return result.join(\"\");\n}\n/**\n * Resolve a simple or a complex Pattern to a FluentString\n * (which is really the string primitive).\n */\nfunction resolvePattern(scope, value) {\n // Resolve a simple pattern.\n if (typeof value === \"string\") {\n return scope.bundle._transform(value);\n }\n return resolveComplexPattern(scope, value);\n}\n","export class Scope {\n constructor(bundle, errors, args) {\n /**\n * The Set of patterns already encountered during this resolution.\n * Used to detect and prevent cyclic resolutions.\n * @ignore\n */\n this.dirty = new WeakSet();\n /** A dict of parameters passed to a TermReference. */\n this.params = null;\n /**\n * The running count of placeables resolved so far.\n * Used to detect the Billion Laughs and Quadratic Blowup attacks.\n * @ignore\n */\n this.placeables = 0;\n this.bundle = bundle;\n this.errors = errors;\n this.args = args;\n }\n reportError(error) {\n if (!this.errors || !(error instanceof Error)) {\n throw error;\n }\n this.errors.push(error);\n }\n memoizeIntlObject(ctor, opts) {\n let cache = this.bundle._intls.get(ctor);\n if (!cache) {\n cache = {};\n this.bundle._intls.set(ctor, cache);\n }\n let id = JSON.stringify(opts);\n if (!cache[id]) {\n // @ts-expect-error This is fine.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n cache[id] = new ctor(this.bundle.locales, opts);\n }\n return cache[id];\n }\n}\n","/**\n * @overview\n *\n * The FTL resolver ships with a number of functions built-in.\n *\n * Each function take two arguments:\n * - args - an array of positional args\n * - opts - an object of key-value args\n *\n * Arguments to functions are guaranteed to already be instances of\n * `FluentValue`. Functions must return `FluentValues` as well.\n */\nimport { FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\nfunction values(opts, allowed) {\n const unwrapped = Object.create(null);\n for (const [name, opt] of Object.entries(opts)) {\n if (allowed.includes(name)) {\n unwrapped[name] = opt.valueOf();\n }\n }\n return unwrapped;\n}\nconst NUMBER_ALLOWED = [\n \"unitDisplay\",\n \"currencyDisplay\",\n \"useGrouping\",\n \"minimumIntegerDigits\",\n \"minimumFractionDigits\",\n \"maximumFractionDigits\",\n \"minimumSignificantDigits\",\n \"maximumSignificantDigits\",\n];\n/**\n * The implementation of the `NUMBER()` builtin available to translations.\n *\n * Translations may call the `NUMBER()` builtin in order to specify formatting\n * options of a number. For example:\n *\n * pi = The value of π is {NUMBER($pi, maximumFractionDigits: 2)}.\n *\n * The implementation expects an array of {@link FluentValue | FluentValues} representing the\n * positional arguments, and an object of named {@link FluentValue | FluentValues} representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n * unitDisplay\n * currencyDisplay\n * useGrouping\n * minimumIntegerDigits\n * minimumFractionDigits\n * maximumFractionDigits\n * minimumSignificantDigits\n * maximumSignificantDigits\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `NUMBER()`.\n * @param opts The named argments passed to this `NUMBER()`.\n */\nexport function NUMBER(args, opts) {\n let arg = args[0];\n if (arg instanceof FluentNone) {\n return new FluentNone(`NUMBER(${arg.valueOf()})`);\n }\n if (arg instanceof FluentNumber) {\n return new FluentNumber(arg.valueOf(), {\n ...arg.opts,\n ...values(opts, NUMBER_ALLOWED),\n });\n }\n if (arg instanceof FluentDateTime) {\n return new FluentNumber(arg.toNumber(), {\n ...values(opts, NUMBER_ALLOWED),\n });\n }\n throw new TypeError(\"Invalid argument to NUMBER\");\n}\nconst DATETIME_ALLOWED = [\n \"dateStyle\",\n \"timeStyle\",\n \"fractionalSecondDigits\",\n \"dayPeriod\",\n \"hour12\",\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n];\n/**\n * The implementation of the `DATETIME()` builtin available to translations.\n *\n * Translations may call the `DATETIME()` builtin in order to specify\n * formatting options of a number. For example:\n *\n * now = It's {DATETIME($today, month: \"long\")}.\n *\n * The implementation expects an array of {@link FluentValue | FluentValues} representing the\n * positional arguments, and an object of named {@link FluentValue | FluentValues} representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n * dateStyle\n * timeStyle\n * fractionalSecondDigits\n * dayPeriod\n * hour12\n * weekday\n * era\n * year\n * month\n * day\n * hour\n * minute\n * second\n * timeZoneName\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `DATETIME()`.\n * @param opts The named argments passed to this `DATETIME()`.\n */\nexport function DATETIME(args, opts) {\n let arg = args[0];\n if (arg instanceof FluentNone) {\n return new FluentNone(`DATETIME(${arg.valueOf()})`);\n }\n if (arg instanceof FluentDateTime || arg instanceof FluentNumber) {\n return new FluentDateTime(arg, values(opts, DATETIME_ALLOWED));\n }\n throw new TypeError(\"Invalid argument to DATETIME\");\n}\n","const cache = new Map();\nexport function getMemoizerForLocale(locales) {\n const stringLocale = Array.isArray(locales) ? locales.join(\" \") : locales;\n let memoizer = cache.get(stringLocale);\n if (memoizer === undefined) {\n memoizer = new Map();\n cache.set(stringLocale, memoizer);\n }\n return memoizer;\n}\n","import { resolveComplexPattern } from \"./resolver.js\";\nimport { Scope } from \"./scope.js\";\nimport { FluentNone } from \"./types.js\";\nimport { NUMBER, DATETIME } from \"./builtins.js\";\nimport { getMemoizerForLocale } from \"./memoizer.js\";\n/**\n * Message bundles are single-language stores of translation resources. They are\n * responsible for formatting message values and attributes to strings.\n */\nexport class FluentBundle {\n /**\n * Create an instance of `FluentBundle`.\n *\n * @example\n * ```js\n * let bundle = new FluentBundle([\"en-US\", \"en\"]);\n *\n * let bundle = new FluentBundle(locales, {useIsolating: false});\n *\n * let bundle = new FluentBundle(locales, {\n * useIsolating: true,\n * functions: {\n * NODE_ENV: () => process.env.NODE_ENV\n * }\n * });\n * ```\n *\n * @param locales - Used to instantiate `Intl` formatters used by translations.\n * @param options - Optional configuration for the bundle.\n */\n constructor(locales, { functions, useIsolating = true, transform = (v) => v, } = {}) {\n /** @ignore */\n this._terms = new Map();\n /** @ignore */\n this._messages = new Map();\n this.locales = Array.isArray(locales) ? locales : [locales];\n this._functions = {\n NUMBER,\n DATETIME,\n ...functions,\n };\n this._useIsolating = useIsolating;\n this._transform = transform;\n this._intls = getMemoizerForLocale(locales);\n }\n /**\n * Check if a message is present in the bundle.\n *\n * @param id - The identifier of the message to check.\n */\n hasMessage(id) {\n return this._messages.has(id);\n }\n /**\n * Return a raw unformatted message object from the bundle.\n *\n * Raw messages are `{value, attributes}` shapes containing translation units\n * called `Patterns`. `Patterns` are implementation-specific; they should be\n * treated as black boxes and formatted with `FluentBundle.formatPattern`.\n *\n * @param id - The identifier of the message to check.\n */\n getMessage(id) {\n return this._messages.get(id);\n }\n /**\n * Add a translation resource to the bundle.\n *\n * @example\n * ```js\n * let res = new FluentResource(\"foo = Foo\");\n * bundle.addResource(res);\n * bundle.getMessage(\"foo\");\n * // → {value: .., attributes: {..}}\n * ```\n *\n * @param res\n * @param options\n */\n addResource(res, { allowOverrides = false, } = {}) {\n const errors = [];\n for (let i = 0; i < res.body.length; i++) {\n let entry = res.body[i];\n if (entry.id.startsWith(\"-\")) {\n // Identifiers starting with a dash (-) define terms. Terms are private\n // and cannot be retrieved from FluentBundle.\n if (allowOverrides === false && this._terms.has(entry.id)) {\n errors.push(new Error(`Attempt to override an existing term: \"${entry.id}\"`));\n continue;\n }\n this._terms.set(entry.id, entry);\n }\n else {\n if (allowOverrides === false && this._messages.has(entry.id)) {\n errors.push(new Error(`Attempt to override an existing message: \"${entry.id}\"`));\n continue;\n }\n this._messages.set(entry.id, entry);\n }\n }\n return errors;\n }\n /**\n * Format a `Pattern` to a string.\n *\n * Format a raw `Pattern` into a string. `args` will be used to resolve\n * references to variables passed as arguments to the translation.\n *\n * In case of errors `formatPattern` will try to salvage as much of the\n * translation as possible and will still return a string. For performance\n * reasons, the encountered errors are not returned but instead are appended\n * to the `errors` array passed as the third argument.\n *\n * If `errors` is omitted, the first encountered error will be thrown.\n *\n * @example\n * ```js\n * let errors = [];\n * bundle.addResource(\n * new FluentResource(\"hello = Hello, {$name}!\"));\n *\n * let hello = bundle.getMessage(\"hello\");\n * if (hello.value) {\n * bundle.formatPattern(hello.value, {name: \"Jane\"}, errors);\n * // Returns \"Hello, Jane!\" and `errors` is empty.\n *\n * bundle.formatPattern(hello.value, undefined, errors);\n * // Returns \"Hello, {$name}!\" and `errors` is now:\n * // []\n * }\n * ```\n */\n formatPattern(pattern, args = null, errors = null) {\n // Resolve a simple pattern without creating a scope. No error handling is\n // required; by definition simple patterns don't have placeables.\n if (typeof pattern === \"string\") {\n return this._transform(pattern);\n }\n // Resolve a complex pattern.\n let scope = new Scope(this, errors, args);\n try {\n let value = resolveComplexPattern(scope, pattern);\n return value.toString(scope);\n }\n catch (err) {\n if (scope.errors && err instanceof Error) {\n scope.errors.push(err);\n return new FluentNone().toString(scope);\n }\n throw err;\n }\n }\n}\n","// This regex is used to iterate through the beginnings of messages and terms.\n// With the /m flag, the ^ matches at the beginning of every line.\nconst RE_MESSAGE_START = /^(-?[a-zA-Z][\\w-]*) *= */gm;\n// Both Attributes and Variants are parsed in while loops. These regexes are\n// used to break out of them.\nconst RE_ATTRIBUTE_START = /\\.([a-zA-Z][\\w-]*) *= */y;\nconst RE_VARIANT_START = /\\*?\\[/y;\nconst RE_NUMBER_LITERAL = /(-?[0-9]+(?:\\.([0-9]+))?)/y;\nconst RE_IDENTIFIER = /([a-zA-Z][\\w-]*)/y;\nconst RE_REFERENCE = /([$-])?([a-zA-Z][\\w-]*)(?:\\.([a-zA-Z][\\w-]*))?/y;\nconst RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/;\n// A \"run\" is a sequence of text or string literal characters which don't\n// require any special handling. For TextElements such special characters are: {\n// (starts a placeable), and line breaks which require additional logic to check\n// if the next line is indented. For StringLiterals they are: \\ (starts an\n// escape sequence), \" (ends the literal), and line breaks which are not allowed\n// in StringLiterals. Note that string runs may be empty; text runs may not.\nconst RE_TEXT_RUN = /([^{}\\n\\r]+)/y;\nconst RE_STRING_RUN = /([^\\\\\"\\n\\r]*)/y;\n// Escape sequences.\nconst RE_STRING_ESCAPE = /\\\\([\\\\\"])/y;\nconst RE_UNICODE_ESCAPE = /\\\\u([a-fA-F0-9]{4})|\\\\U([a-fA-F0-9]{6})/y;\n// Used for trimming TextElements and indents.\nconst RE_LEADING_NEWLINES = /^\\n+/;\nconst RE_TRAILING_SPACES = / +$/;\n// Used in makeIndent to strip spaces from blank lines and normalize CRLF to LF.\nconst RE_BLANK_LINES = / *\\r?\\n/g;\n// Used in makeIndent to measure the indentation.\nconst RE_INDENT = /( *)$/;\n// Common tokens.\nconst TOKEN_BRACE_OPEN = /{\\s*/y;\nconst TOKEN_BRACE_CLOSE = /\\s*}/y;\nconst TOKEN_BRACKET_OPEN = /\\[\\s*/y;\nconst TOKEN_BRACKET_CLOSE = /\\s*] */y;\nconst TOKEN_PAREN_OPEN = /\\s*\\(\\s*/y;\nconst TOKEN_ARROW = /\\s*->\\s*/y;\nconst TOKEN_COLON = /\\s*:\\s*/y;\n// Note the optional comma. As a deviation from the Fluent EBNF, the parser\n// doesn't enforce commas between call arguments.\nconst TOKEN_COMMA = /\\s*,?\\s*/y;\nconst TOKEN_BLANK = /\\s+/y;\n/**\n * Fluent Resource is a structure storing parsed localization entries.\n */\nexport class FluentResource {\n constructor(source) {\n this.body = [];\n RE_MESSAGE_START.lastIndex = 0;\n let cursor = 0;\n // Iterate over the beginnings of messages and terms to efficiently skip\n // comments and recover from errors.\n while (true) {\n let next = RE_MESSAGE_START.exec(source);\n if (next === null) {\n break;\n }\n cursor = RE_MESSAGE_START.lastIndex;\n try {\n this.body.push(parseMessage(next[1]));\n }\n catch (err) {\n if (err instanceof SyntaxError) {\n // Don't report any Fluent syntax errors. Skip directly to the\n // beginning of the next message or term.\n continue;\n }\n throw err;\n }\n }\n // The parser implementation is inlined below for performance reasons,\n // as well as for convenience of accessing `source` and `cursor`.\n // The parser focuses on minimizing the number of false negatives at the\n // expense of increasing the risk of false positives. In other words, it\n // aims at parsing valid Fluent messages with a success rate of 100%, but it\n // may also parse a few invalid messages which the reference parser would\n // reject. The parser doesn't perform any validation and may produce entries\n // which wouldn't make sense in the real world. For best results users are\n // advised to validate translations with the fluent-syntax parser\n // pre-runtime.\n // The parser makes an extensive use of sticky regexes which can be anchored\n // to any offset of the source string without slicing it. Errors are thrown\n // to bail out of parsing of ill-formed messages.\n function test(re) {\n re.lastIndex = cursor;\n return re.test(source);\n }\n // Advance the cursor by the char if it matches. May be used as a predicate\n // (was the match found?) or, if errorClass is passed, as an assertion.\n function consumeChar(char, errorClass) {\n if (source[cursor] === char) {\n cursor++;\n return true;\n }\n if (errorClass) {\n throw new errorClass(`Expected ${char}`);\n }\n return false;\n }\n // Advance the cursor by the token if it matches. May be used as a predicate\n // (was the match found?) or, if errorClass is passed, as an assertion.\n function consumeToken(re, errorClass) {\n if (test(re)) {\n cursor = re.lastIndex;\n return true;\n }\n if (errorClass) {\n throw new errorClass(`Expected ${re.toString()}`);\n }\n return false;\n }\n // Execute a regex, advance the cursor, and return all capture groups.\n function match(re) {\n re.lastIndex = cursor;\n let result = re.exec(source);\n if (result === null) {\n throw new SyntaxError(`Expected ${re.toString()}`);\n }\n cursor = re.lastIndex;\n return result;\n }\n // Execute a regex, advance the cursor, and return the capture group.\n function match1(re) {\n return match(re)[1];\n }\n function parseMessage(id) {\n let value = parsePattern();\n let attributes = parseAttributes();\n if (value === null && Object.keys(attributes).length === 0) {\n throw new SyntaxError(\"Expected message value or attributes\");\n }\n return { id, value, attributes };\n }\n function parseAttributes() {\n let attrs = Object.create(null);\n while (test(RE_ATTRIBUTE_START)) {\n let name = match1(RE_ATTRIBUTE_START);\n let value = parsePattern();\n if (value === null) {\n throw new SyntaxError(\"Expected attribute value\");\n }\n attrs[name] = value;\n }\n return attrs;\n }\n function parsePattern() {\n let first;\n // First try to parse any simple text on the same line as the id.\n if (test(RE_TEXT_RUN)) {\n first = match1(RE_TEXT_RUN);\n }\n // If there's a placeable on the first line, parse a complex pattern.\n if (source[cursor] === \"{\" || source[cursor] === \"}\") {\n // Re-use the text parsed above, if possible.\n return parsePatternElements(first ? [first] : [], Infinity);\n }\n // RE_TEXT_VALUE stops at newlines. Only continue parsing the pattern if\n // what comes after the newline is indented.\n let indent = parseIndent();\n if (indent) {\n if (first) {\n // If there's text on the first line, the blank block is part of the\n // translation content in its entirety.\n return parsePatternElements([first, indent], indent.length);\n }\n // Otherwise, we're dealing with a block pattern, i.e. a pattern which\n // starts on a new line. Discrad the leading newlines but keep the\n // inline indent; it will be used by the dedentation logic.\n indent.value = trim(indent.value, RE_LEADING_NEWLINES);\n return parsePatternElements([indent], indent.length);\n }\n if (first) {\n // It was just a simple inline text after all.\n return trim(first, RE_TRAILING_SPACES);\n }\n return null;\n }\n // Parse a complex pattern as an array of elements.\n function parsePatternElements(elements = [], commonIndent) {\n while (true) {\n if (test(RE_TEXT_RUN)) {\n elements.push(match1(RE_TEXT_RUN));\n continue;\n }\n if (source[cursor] === \"{\") {\n elements.push(parsePlaceable());\n continue;\n }\n if (source[cursor] === \"}\") {\n throw new SyntaxError(\"Unbalanced closing brace\");\n }\n let indent = parseIndent();\n if (indent) {\n elements.push(indent);\n commonIndent = Math.min(commonIndent, indent.length);\n continue;\n }\n break;\n }\n let lastIndex = elements.length - 1;\n let lastElement = elements[lastIndex];\n // Trim the trailing spaces in the last element if it's a TextElement.\n if (typeof lastElement === \"string\") {\n elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES);\n }\n let baked = [];\n for (let element of elements) {\n if (element instanceof Indent) {\n // Dedent indented lines by the maximum common indent.\n element = element.value.slice(0, element.value.length - commonIndent);\n }\n if (element) {\n baked.push(element);\n }\n }\n return baked;\n }\n function parsePlaceable() {\n consumeToken(TOKEN_BRACE_OPEN, SyntaxError);\n let selector = parseInlineExpression();\n if (consumeToken(TOKEN_BRACE_CLOSE)) {\n return selector;\n }\n if (consumeToken(TOKEN_ARROW)) {\n let variants = parseVariants();\n consumeToken(TOKEN_BRACE_CLOSE, SyntaxError);\n return {\n type: \"select\",\n selector,\n ...variants,\n };\n }\n throw new SyntaxError(\"Unclosed placeable\");\n }\n function parseInlineExpression() {\n if (source[cursor] === \"{\") {\n // It's a nested placeable.\n return parsePlaceable();\n }\n if (test(RE_REFERENCE)) {\n let [, sigil, name, attr = null] = match(RE_REFERENCE);\n if (sigil === \"$\") {\n return { type: \"var\", name };\n }\n if (consumeToken(TOKEN_PAREN_OPEN)) {\n let args = parseArguments();\n if (sigil === \"-\") {\n // A parameterized term: -term(...).\n return { type: \"term\", name, attr, args };\n }\n if (RE_FUNCTION_NAME.test(name)) {\n return { type: \"func\", name, args };\n }\n throw new SyntaxError(\"Function names must be all upper-case\");\n }\n if (sigil === \"-\") {\n // A non-parameterized term: -term.\n return {\n type: \"term\",\n name,\n attr,\n args: [],\n };\n }\n return { type: \"mesg\", name, attr };\n }\n return parseLiteral();\n }\n function parseArguments() {\n let args = [];\n while (true) {\n switch (source[cursor]) {\n case \")\": // End of the argument list.\n cursor++;\n return args;\n case undefined: // EOF\n throw new SyntaxError(\"Unclosed argument list\");\n }\n args.push(parseArgument());\n // Commas between arguments are treated as whitespace.\n consumeToken(TOKEN_COMMA);\n }\n }\n function parseArgument() {\n let expr = parseInlineExpression();\n if (expr.type !== \"mesg\") {\n return expr;\n }\n if (consumeToken(TOKEN_COLON)) {\n // The reference is the beginning of a named argument.\n return {\n type: \"narg\",\n name: expr.name,\n value: parseLiteral(),\n };\n }\n // It's a regular message reference.\n return expr;\n }\n function parseVariants() {\n let variants = [];\n let count = 0;\n let star;\n while (test(RE_VARIANT_START)) {\n if (consumeChar(\"*\")) {\n star = count;\n }\n let key = parseVariantKey();\n let value = parsePattern();\n if (value === null) {\n throw new SyntaxError(\"Expected variant value\");\n }\n variants[count++] = { key, value };\n }\n if (count === 0) {\n return null;\n }\n if (star === undefined) {\n throw new SyntaxError(\"Expected default variant\");\n }\n return { variants, star };\n }\n function parseVariantKey() {\n consumeToken(TOKEN_BRACKET_OPEN, SyntaxError);\n let key;\n if (test(RE_NUMBER_LITERAL)) {\n key = parseNumberLiteral();\n }\n else {\n key = {\n type: \"str\",\n value: match1(RE_IDENTIFIER),\n };\n }\n consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError);\n return key;\n }\n function parseLiteral() {\n if (test(RE_NUMBER_LITERAL)) {\n return parseNumberLiteral();\n }\n if (source[cursor] === '\"') {\n return parseStringLiteral();\n }\n throw new SyntaxError(\"Invalid expression\");\n }\n function parseNumberLiteral() {\n let [, value, fraction = \"\"] = match(RE_NUMBER_LITERAL);\n let precision = fraction.length;\n return {\n type: \"num\",\n value: parseFloat(value),\n precision,\n };\n }\n function parseStringLiteral() {\n consumeChar('\"', SyntaxError);\n let value = \"\";\n while (true) {\n value += match1(RE_STRING_RUN);\n if (source[cursor] === \"\\\\\") {\n value += parseEscapeSequence();\n continue;\n }\n if (consumeChar('\"')) {\n return { type: \"str\", value };\n }\n // We've reached an EOL of EOF.\n throw new SyntaxError(\"Unclosed string literal\");\n }\n }\n // Unescape known escape sequences.\n function parseEscapeSequence() {\n if (test(RE_STRING_ESCAPE)) {\n return match1(RE_STRING_ESCAPE);\n }\n if (test(RE_UNICODE_ESCAPE)) {\n let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE);\n let codepoint = parseInt(codepoint4 || codepoint6, 16);\n return codepoint <= 0xd7ff || 0xe000 <= codepoint\n ? // It's a Unicode scalar value.\n String.fromCodePoint(codepoint)\n : // Lonely surrogates can cause trouble when the parsing result is\n // saved using UTF-8. Use U+FFFD REPLACEMENT CHARACTER instead.\n \"�\";\n }\n throw new SyntaxError(\"Unknown escape sequence\");\n }\n // Parse blank space. Return it if it looks like indent before a pattern\n // line. Skip it othwerwise.\n function parseIndent() {\n let start = cursor;\n consumeToken(TOKEN_BLANK);\n // Check the first non-blank character after the indent.\n switch (source[cursor]) {\n case \".\":\n case \"[\":\n case \"*\":\n case \"}\":\n case undefined: // EOF\n // A special character. End the Pattern.\n return false;\n case \"{\":\n // Placeables don't require indentation (in EBNF: block-placeable).\n // Continue the Pattern.\n return makeIndent(source.slice(start, cursor));\n }\n // If the first character on the line is not one of the special characters\n // listed above, it's a regular text character. Check if there's at least\n // one space of indent before it.\n if (source[cursor - 1] === \" \") {\n // It's an indented text character (in EBNF: indented-char). Continue\n // the Pattern.\n return makeIndent(source.slice(start, cursor));\n }\n // A not-indented text character is likely the identifier of the next\n // message. End the Pattern.\n return false;\n }\n // Trim blanks in text according to the given regex.\n function trim(text, re) {\n return text.replace(re, \"\");\n }\n // Normalize a blank block and extract the indent details.\n function makeIndent(blank) {\n let value = blank.replace(RE_BLANK_LINES, \"\\n\");\n let length = RE_INDENT.exec(blank)[1].length;\n return new Indent(value, length);\n }\n }\n}\nclass Indent {\n constructor(value, length) {\n this.value = value;\n this.length = length;\n }\n}\n","/**\n * A JavaScript implementation of Project Fluent, a localization\n * framework designed to unleash the expressive power of the natural language.\n *\n * @module\n */\nexport { FluentBundle } from \"./bundle.js\";\nexport { FluentResource } from \"./resource.js\";\nexport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n","/* eslint no-console: [\"error\", {allow: [\"warn\"]}] */\n/* global console */\n// Match the opening angle bracket (<) in HTML tags, and HTML entities like\n// &, &, &.\nconst reOverlay = /<|&#?\\w+;/;\n/**\n * Elements allowed in translations even if they are not present in the source\n * HTML. They are text-level elements as defined by the HTML5 spec:\n * https://www.w3.org/TR/html5/text-level-semantics.html with the exception of:\n *\n * - a - because we don't allow href on it anyways,\n * - ruby, rt, rp - because we don't allow nested elements to be inserted.\n */\nconst TEXT_LEVEL_ELEMENTS = {\n \"http://www.w3.org/1999/xhtml\": [\n \"em\",\n \"strong\",\n \"small\",\n \"s\",\n \"cite\",\n \"q\",\n \"dfn\",\n \"abbr\",\n \"data\",\n \"time\",\n \"code\",\n \"var\",\n \"samp\",\n \"kbd\",\n \"sub\",\n \"sup\",\n \"i\",\n \"b\",\n \"u\",\n \"mark\",\n \"bdi\",\n \"bdo\",\n \"span\",\n \"br\",\n \"wbr\",\n ],\n};\nconst LOCALIZABLE_ATTRIBUTES = {\n \"http://www.w3.org/1999/xhtml\": {\n global: [\"title\", \"aria-description\", \"aria-label\", \"aria-valuetext\"],\n a: [\"download\"],\n area: [\"download\", \"alt\"],\n // value is special-cased in isAttrNameLocalizable\n input: [\"alt\", \"placeholder\"],\n menuitem: [\"label\"],\n menu: [\"label\"],\n optgroup: [\"label\"],\n option: [\"label\"],\n track: [\"label\"],\n img: [\"alt\"],\n textarea: [\"placeholder\"],\n th: [\"abbr\"],\n },\n \"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\": {\n global: [\n \"accesskey\",\n \"aria-label\",\n \"aria-valuetext\",\n \"label\",\n \"title\",\n \"tooltiptext\",\n ],\n description: [\"value\"],\n key: [\"key\", \"keycode\"],\n label: [\"value\"],\n textbox: [\"placeholder\", \"value\"],\n },\n};\n/**\n * Translate an element.\n *\n * Translate the element's text content and attributes. Some HTML markup is\n * allowed in the translation. The element's children with the data-l10n-name\n * attribute will be treated as arguments to the translation. If the\n * translation defines the same children, their attributes and text contents\n * will be used for translating the matching source child.\n *\n * @param {Element} element\n * @param {Object} translation\n * @private\n */\nexport default function translateElement(element, translation) {\n const { value } = translation;\n if (typeof value === \"string\") {\n if (element.localName === \"title\" &&\n element.namespaceURI === \"http://www.w3.org/1999/xhtml\") {\n // A special case for the HTML title element whose content must be text.\n element.textContent = value;\n }\n else if (!reOverlay.test(value)) {\n // If the translation doesn't contain any markup skip the overlay logic.\n element.textContent = value;\n }\n else {\n // Else parse the translation's HTML using an inert template element,\n // sanitize it and replace the element's content.\n const templateElement = element.ownerDocument.createElementNS(\"http://www.w3.org/1999/xhtml\", \"template\");\n templateElement.innerHTML = value;\n overlayChildNodes(templateElement.content, element);\n }\n }\n // Even if the translation doesn't define any localizable attributes, run\n // overlayAttributes to remove any localizable attributes set by previous\n // translations.\n overlayAttributes(translation, element);\n}\n/**\n * Replace child nodes of an element with child nodes of another element.\n *\n * The contents of the target element will be cleared and fully replaced with\n * sanitized contents of the source element.\n *\n * @param {DocumentFragment} fromFragment - The source of children to overlay.\n * @param {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayChildNodes(fromFragment, toElement) {\n for (const childNode of fromFragment.childNodes) {\n if (childNode.nodeType === childNode.TEXT_NODE) {\n // Keep the translated text node.\n continue;\n }\n if (childNode.hasAttribute(\"data-l10n-name\")) {\n const sanitized = getNodeForNamedElement(toElement, childNode);\n fromFragment.replaceChild(sanitized, childNode);\n continue;\n }\n if (isElementAllowed(childNode)) {\n const sanitized = createSanitizedElement(childNode);\n fromFragment.replaceChild(sanitized, childNode);\n continue;\n }\n console.warn(`An element of forbidden type \"${childNode.localName}\" was found in ` +\n \"the translation. Only safe text-level elements and elements with \" +\n \"data-l10n-name are allowed.\");\n // If all else fails, replace the element with its text content.\n fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode);\n }\n toElement.textContent = \"\";\n toElement.appendChild(fromFragment);\n}\nfunction hasAttribute(attributes, name) {\n if (!attributes) {\n return false;\n }\n for (let attr of attributes) {\n if (attr.name === name) {\n return true;\n }\n }\n return false;\n}\n/**\n * Transplant localizable attributes of an element to another element.\n *\n * Any localizable attributes already set on the target element will be\n * cleared.\n *\n * @param {Element|Object} fromElement - The source of child nodes to overlay.\n * @param {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayAttributes(fromElement, toElement) {\n const explicitlyAllowed = toElement.hasAttribute(\"data-l10n-attrs\")\n ? toElement\n .getAttribute(\"data-l10n-attrs\")\n .split(\",\")\n .map(i => i.trim())\n : null;\n // Remove existing localizable attributes if they\n // will not be used in the new translation.\n for (const attr of Array.from(toElement.attributes)) {\n if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n !hasAttribute(fromElement.attributes, attr.name)) {\n toElement.removeAttribute(attr.name);\n }\n }\n // fromElement might be a {value, attributes} object as returned by\n // Localization.messageFromBundle. In which case attributes may be null to\n // save GC cycles.\n if (!fromElement.attributes) {\n return;\n }\n // Set localizable attributes.\n for (const attr of Array.from(fromElement.attributes)) {\n if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n toElement.getAttribute(attr.name) !== attr.value) {\n toElement.setAttribute(attr.name, attr.value);\n }\n }\n}\n/**\n * Sanitize a child element created by the translation.\n *\n * Try to find a corresponding child in sourceElement and use it as the base\n * for the sanitization. This will preserve functional attribtues defined on\n * the child element in the source HTML.\n *\n * @param {Element} sourceElement - The source for data-l10n-name lookups.\n * @param {Element} translatedChild - The translated child to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction getNodeForNamedElement(sourceElement, translatedChild) {\n const childName = translatedChild.getAttribute(\"data-l10n-name\");\n const sourceChild = sourceElement.querySelector(`[data-l10n-name=\"${childName}\"]`);\n if (!sourceChild) {\n console.warn(`An element named \"${childName}\" wasn't found in the source.`);\n return createTextNodeFromTextContent(translatedChild);\n }\n if (sourceChild.localName !== translatedChild.localName) {\n console.warn(`An element named \"${childName}\" was found in the translation ` +\n `but its type ${translatedChild.localName} didn't match the ` +\n `element found in the source (${sourceChild.localName}).`);\n return createTextNodeFromTextContent(translatedChild);\n }\n // Remove it from sourceElement so that the translation cannot use\n // the same reference name again.\n sourceElement.removeChild(sourceChild);\n // We can't currently guarantee that a translation won't remove\n // sourceChild from the element completely, which could break the app if\n // it relies on an event handler attached to the sourceChild. Let's make\n // this limitation explicit for now by breaking the identitiy of the\n // sourceChild by cloning it. This will destroy all event handlers\n // attached to sourceChild via addEventListener and via on\n // properties.\n const clone = sourceChild.cloneNode(false);\n return shallowPopulateUsing(translatedChild, clone);\n}\n/**\n * Sanitize an allowed element.\n *\n * Text-level elements allowed in translations may only use safe attributes\n * and will have any nested markup stripped to text content.\n *\n * @param {Element} element - The element to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction createSanitizedElement(element) {\n // Start with an empty element of the same type to remove nested children\n // and non-localizable attributes defined by the translation.\n const clone = element.ownerDocument.createElement(element.localName);\n return shallowPopulateUsing(element, clone);\n}\n/**\n * Convert an element to a text node.\n *\n * @param {Element} element - The element to be sanitized.\n * @returns {Node}\n * @private\n */\nfunction createTextNodeFromTextContent(element) {\n return element.ownerDocument.createTextNode(element.textContent);\n}\n/**\n * Check if element is allowed in the translation.\n *\n * This method is used by the sanitizer when the translation markup contains\n * an element which is not present in the source code.\n *\n * @param {Element} element\n * @returns {boolean}\n * @private\n */\nfunction isElementAllowed(element) {\n const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI];\n return allowed && allowed.includes(element.localName);\n}\n/**\n * Check if attribute is allowed for the given element.\n *\n * This method is used by the sanitizer when the translation markup contains\n * DOM attributes, or when the translation has traits which map to DOM\n * attributes.\n *\n * `explicitlyAllowed` can be passed as a list of attributes explicitly\n * allowed on this element.\n *\n * @param {string} name\n * @param {Element} element\n * @param {Array} explicitlyAllowed\n * @returns {boolean}\n * @private\n */\nfunction isAttrNameLocalizable(name, element, explicitlyAllowed = null) {\n if (explicitlyAllowed && explicitlyAllowed.includes(name)) {\n return true;\n }\n const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI];\n if (!allowed) {\n return false;\n }\n const attrName = name.toLowerCase();\n const elemName = element.localName;\n // Is it a globally safe attribute?\n if (allowed.global.includes(attrName)) {\n return true;\n }\n // Are there no allowed attributes for this element?\n if (!allowed[elemName]) {\n return false;\n }\n // Is it allowed on this element?\n if (allowed[elemName].includes(attrName)) {\n return true;\n }\n // Special case for value on HTML inputs with type button, reset, submit\n if (element.namespaceURI === \"http://www.w3.org/1999/xhtml\" &&\n elemName === \"input\" &&\n attrName === \"value\") {\n const type = element.type.toLowerCase();\n if (type === \"submit\" || type === \"button\" || type === \"reset\") {\n return true;\n }\n }\n return false;\n}\n/**\n * Helper to set textContent and localizable attributes on an element.\n *\n * @param {Element} fromElement\n * @param {Element} toElement\n * @returns {Element}\n * @private\n */\nfunction shallowPopulateUsing(fromElement, toElement) {\n toElement.textContent = fromElement.textContent;\n overlayAttributes(fromElement, toElement);\n return toElement;\n}\n","/*\n * Base CachedIterable class.\n */\nexport default class CachedIterable extends Array {\n /**\n * Create a `CachedIterable` instance from an iterable or, if another\n * instance of `CachedIterable` is passed, return it without any\n * modifications.\n *\n * @param {Iterable} iterable\n * @returns {CachedIterable}\n */\n static from(iterable) {\n if (iterable instanceof this) {\n return iterable;\n }\n\n return new this(iterable);\n }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedSyncIterable caches the elements yielded by an iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedSyncIterable extends CachedIterable {\n /**\n * Create an `CachedSyncIterable` instance.\n *\n * @param {Iterable} iterable\n * @returns {CachedSyncIterable}\n */\n constructor(iterable) {\n super();\n\n if (Symbol.iterator in Object(iterable)) {\n this.iterator = iterable[Symbol.iterator]();\n } else {\n throw new TypeError(\"Argument must implement the iteration protocol.\");\n }\n }\n\n [Symbol.iterator]() {\n const cached = this;\n let cur = 0;\n\n return {\n next() {\n if (cached.length <= cur) {\n cached.push(cached.iterator.next());\n }\n return cached[cur++];\n }\n };\n }\n\n /**\n * This method allows user to consume the next element from the iterator\n * into the cache.\n *\n * @param {number} count - number of elements to consume\n */\n touchNext(count = 1) {\n let idx = 0;\n while (idx++ < count) {\n const last = this[this.length - 1];\n if (last && last.done) {\n break;\n }\n this.push(this.iterator.next());\n }\n // Return the last cached {value, done} object to allow the calling\n // code to decide if it needs to call touchNext again.\n return this[this.length - 1];\n }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedAsyncIterable caches the elements yielded by an async iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedAsyncIterable extends CachedIterable {\n /**\n * Create an `CachedAsyncIterable` instance.\n *\n * @param {Iterable} iterable\n * @returns {CachedAsyncIterable}\n */\n constructor(iterable) {\n super();\n\n if (Symbol.asyncIterator in Object(iterable)) {\n this.iterator = iterable[Symbol.asyncIterator]();\n } else if (Symbol.iterator in Object(iterable)) {\n this.iterator = iterable[Symbol.iterator]();\n } else {\n throw new TypeError(\"Argument must implement the iteration protocol.\");\n }\n }\n\n /**\n * Asynchronous iterator caching the yielded elements.\n *\n * Elements yielded by the original iterable will be cached and available\n * synchronously. Returns an async generator object implementing the\n * iterator protocol over the elements of the original (async or sync)\n * iterable.\n */\n [Symbol.asyncIterator]() {\n const cached = this;\n let cur = 0;\n\n return {\n async next() {\n if (cached.length <= cur) {\n cached.push(cached.iterator.next());\n }\n return cached[cur++];\n }\n };\n }\n\n /**\n * This method allows user to consume the next element from the iterator\n * into the cache.\n *\n * @param {number} count - number of elements to consume\n */\n async touchNext(count = 1) {\n let idx = 0;\n while (idx++ < count) {\n const last = this[this.length - 1];\n if (last && (await last).done) {\n break;\n }\n this.push(this.iterator.next());\n }\n // Return the last cached {value, done} object to allow the calling\n // code to decide if it needs to call touchNext again.\n return this[this.length - 1];\n }\n}\n","export {default as CachedSyncIterable} from \"./cached_sync_iterable.mjs\";\nexport {default as CachedAsyncIterable} from \"./cached_async_iterable.mjs\";\n","/* eslint no-console: [\"error\", { allow: [\"warn\", \"error\"] }] */\n/* global console */\nimport { CachedAsyncIterable } from \"cached-iterable\";\n/**\n * The `Localization` class is a central high-level API for vanilla\n * JavaScript use of Fluent.\n * It combines language negotiation, FluentBundle and I/O to\n * provide a scriptable API to format translations.\n */\nexport default class Localization {\n /**\n * @param {Array} resourceIds - List of resource IDs\n * @param {Function} generateBundles - Function that returns a\n * generator over FluentBundles\n *\n * @returns {Localization}\n */\n constructor(resourceIds = [], generateBundles) {\n this.resourceIds = resourceIds;\n this.generateBundles = generateBundles;\n this.onChange(true);\n }\n addResourceIds(resourceIds, eager = false) {\n this.resourceIds.push(...resourceIds);\n this.onChange(eager);\n return this.resourceIds.length;\n }\n removeResourceIds(resourceIds) {\n this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r));\n this.onChange();\n return this.resourceIds.length;\n }\n /**\n * Format translations and handle fallback if needed.\n *\n * Format translations for `keys` from `FluentBundle` instances on this\n * DOMLocalization. In case of errors, fetch the next context in the\n * fallback chain.\n *\n * @param {Array} keys - Translation keys to format.\n * @param {Function} method - Formatting function.\n * @returns {Promise>}\n * @private\n */\n async formatWithFallback(keys, method) {\n const translations = [];\n let hasAtLeastOneBundle = false;\n for await (const bundle of this.bundles) {\n hasAtLeastOneBundle = true;\n const missingIds = keysFromBundle(method, bundle, keys, translations);\n if (missingIds.size === 0) {\n break;\n }\n if (typeof console !== \"undefined\") {\n const locale = bundle.locales[0];\n const ids = Array.from(missingIds).join(\", \");\n console.warn(`[fluent] Missing translations in ${locale}: ${ids}`);\n }\n }\n if (!hasAtLeastOneBundle && typeof console !== \"undefined\") {\n console.warn(`[fluent] Request for keys failed because no resource bundles got generated.\n keys: ${JSON.stringify(keys)}.\n resourceIds: ${JSON.stringify(this.resourceIds)}.`);\n }\n return translations;\n }\n /**\n * Format translations into `{value, attributes}` objects.\n *\n * The fallback logic is the same as in `formatValues`\n * but it returns `{value, attributes}` objects\n * which are suitable for the translation of DOM elements.\n *\n * Returns a Promise resolving to an array of the translation strings.\n *\n * @example\n * ```js\n * docL10n.formatMessages([\n * {id: 'hello', args: { who: 'Mary' }},\n * {id: 'welcome'}\n * ]).then(console.log);\n *\n * // [\n * // { value: 'Hello, Mary!', attributes: null },\n * // {\n * // value: 'Welcome!',\n * // attributes: [ { name: \"title\", value: 'Hello' } ]\n * // }\n * // ]\n * ```\n *\n * @param {Array} keys\n * @returns {Promise>}\n * @private\n */\n formatMessages(keys) {\n return this.formatWithFallback(keys, messageFromBundle);\n }\n /**\n * Retrieve translations corresponding to the passed keys.\n *\n * A generalized version of `DOMLocalization.formatValue`. Keys must\n * be `{id, args}` objects.\n *\n * Returns a Promise resolving to an array of the translation strings.\n *\n * @example\n * ```js\n * docL10n.formatValues([\n * {id: 'hello', args: { who: 'Mary' }},\n * {id: 'hello', args: { who: 'John' }},\n * {id: 'welcome'}\n * ]).then(console.log);\n *\n * // ['Hello, Mary!', 'Hello, John!', 'Welcome!']\n * ```\n *\n * @param {Array} keys\n * @returns {Promise>}\n */\n formatValues(keys) {\n return this.formatWithFallback(keys, valueFromBundle);\n }\n /**\n * Retrieve the translation corresponding to the `id` identifier.\n *\n * If passed, `args` is a simple hash object with a list of variables that\n * will be interpolated in the value of the translation.\n *\n * Returns a Promise resolving to the translation string.\n *\n * Use this sparingly for one-off messages which don't need to be\n * retranslated when the user changes their language preferences, e.g. in\n * notifications.\n *\n * @example\n * ```js\n * docL10n.formatValue(\n * 'hello', { who: 'world' }\n * ).then(console.log);\n *\n * // 'Hello, world!'\n * ```\n *\n * @param {string} id - Identifier of the translation to format\n * @param {Object} [args] - Optional external arguments\n * @returns {Promise}\n */\n async formatValue(id, args) {\n const [val] = await this.formatValues([{ id, args }]);\n return val;\n }\n handleEvent() {\n this.onChange();\n }\n /**\n * This method should be called when there's a reason to believe\n * that language negotiation or available resources changed.\n */\n onChange(eager = false) {\n this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds));\n if (eager) {\n this.bundles.touchNext(2);\n }\n }\n}\n/**\n * Format the value of a message into a string or `null`.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a value of a single L10n Entity using provided `FluentBundle`.\n *\n * If the message doesn't have a value, return `null`.\n *\n * @param {FluentBundle} bundle\n * @param {Array} errors\n * @param {Object} message\n * @param {Object} args\n * @returns {string|null}\n * @private\n */\nfunction valueFromBundle(bundle, errors, message, args) {\n if (message.value) {\n return bundle.formatPattern(message.value, args, errors);\n }\n return null;\n}\n/**\n * Format all public values of a message into a {value, attributes} object.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a single L10n Entity using provided `FluentBundle`.\n *\n * The function will return an object with a value and attributes of the\n * entity.\n *\n * @param {FluentBundle} bundle\n * @param {Array} errors\n * @param {Object} message\n * @param {Object} args\n * @returns {Object}\n * @private\n */\nfunction messageFromBundle(bundle, errors, message, args) {\n const formatted = {\n value: null,\n attributes: null,\n };\n if (message.value) {\n formatted.value = bundle.formatPattern(message.value, args, errors);\n }\n let attrNames = Object.keys(message.attributes);\n if (attrNames.length > 0) {\n formatted.attributes = new Array(attrNames.length);\n for (let [i, name] of attrNames.entries()) {\n let value = bundle.formatPattern(message.attributes[name], args, errors);\n formatted.attributes[i] = { name, value };\n }\n }\n return formatted;\n}\n/**\n * This function is an inner function for `Localization.formatWithFallback`.\n *\n * It takes a `FluentBundle`, list of l10n-ids and a method to be used for\n * key resolution (either `valueFromBundle` or `messageFromBundle`) and\n * optionally a value returned from `keysFromBundle` executed against\n * another `FluentBundle`.\n *\n * The idea here is that if the previous `FluentBundle` did not resolve\n * all keys, we're calling this function with the next context to resolve\n * the remaining ones.\n *\n * In the function, we loop over `keys` and check if we have the `prev`\n * passed and if it has an error entry for the position we're in.\n *\n * If it doesn't, it means that we have a good translation for this key and\n * we return it. If it does, we'll try to resolve the key using the passed\n * `FluentBundle`.\n *\n * In the end, we fill the translations array, and return the Set with\n * missing ids.\n *\n * See `Localization.formatWithFallback` for more info on how this is used.\n *\n * @param {Function} method\n * @param {FluentBundle} bundle\n * @param {Array} keys\n * @param {{Array<{value: string, attributes: Object}>}} translations\n *\n * @returns {Set}\n * @private\n */\nfunction keysFromBundle(method, bundle, keys, translations) {\n const messageErrors = [];\n const missingIds = new Set();\n keys.forEach(({ id, args }, i) => {\n if (translations[i] !== undefined) {\n return;\n }\n let message = bundle.getMessage(id);\n if (message) {\n messageErrors.length = 0;\n translations[i] = method(bundle, messageErrors, message, args);\n if (messageErrors.length > 0 && typeof console !== \"undefined\") {\n const locale = bundle.locales[0];\n const errors = messageErrors.join(\", \");\n console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`);\n }\n }\n else {\n missingIds.add(id);\n }\n });\n return missingIds;\n}\n","import translateElement from \"./overlay.js\";\nimport Localization from \"./localization.js\";\nconst L10NID_ATTR_NAME = \"data-l10n-id\";\nconst L10NARGS_ATTR_NAME = \"data-l10n-args\";\nconst L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`;\n/**\n * The `DOMLocalization` class is responsible for fetching resources and\n * formatting translations.\n *\n * It implements the fallback strategy in case of errors encountered during the\n * formatting of translations and methods for observing DOM\n * trees with a `MutationObserver`.\n */\nexport default class DOMLocalization extends Localization {\n /**\n * @param {Array} resourceIds - List of resource IDs\n * @param {Function} generateBundles - Function that returns a\n * generator over FluentBundles\n * @returns {DOMLocalization}\n */\n constructor(resourceIds, generateBundles) {\n super(resourceIds, generateBundles);\n // A Set of DOM trees observed by the `MutationObserver`.\n this.roots = new Set();\n // requestAnimationFrame handler.\n this.pendingrAF = null;\n // list of elements pending for translation.\n this.pendingElements = new Set();\n this.windowElement = null;\n this.mutationObserver = null;\n this.observerConfig = {\n attributes: true,\n characterData: false,\n childList: true,\n subtree: true,\n attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME],\n };\n }\n onChange(eager = false) {\n super.onChange(eager);\n if (this.roots) {\n this.translateRoots();\n }\n }\n /**\n * Set the `data-l10n-id` and `data-l10n-args` attributes on DOM elements.\n * FluentDOM makes use of mutation observers to detect changes\n * to `data-l10n-*` attributes and translate elements asynchronously.\n * `setAttributes` is a convenience method which allows to translate\n * DOM elements declaratively.\n *\n * You should always prefer to use `data-l10n-id` on elements (statically in\n * HTML or dynamically via `setAttributes`) over manually retrieving\n * translations with `format`. The use of attributes ensures that the\n * elements can be retranslated when the user changes their language\n * preferences.\n *\n * ```javascript\n * localization.setAttributes(\n * document.querySelector('#welcome'), 'hello', { who: 'world' }\n * );\n * ```\n *\n * This will set the following attributes on the `#welcome` element.\n * The MutationObserver will pick up this change and will localize the element\n * asynchronously.\n *\n * ```html\n *

    \n *

    \n * ```\n *\n * @param {Element} element - Element to set attributes on\n * @param {string} id - l10n-id string\n * @param {Object} args - KVP list of l10n arguments\n * @returns {Element}\n */\n setAttributes(element, id, args) {\n element.setAttribute(L10NID_ATTR_NAME, id);\n if (args) {\n element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args));\n }\n else {\n element.removeAttribute(L10NARGS_ATTR_NAME);\n }\n return element;\n }\n /**\n * Get the `data-l10n-*` attributes from DOM elements.\n *\n * ```javascript\n * localization.getAttributes(\n * document.querySelector('#welcome')\n * );\n * // -> { id: 'hello', args: { who: 'world' } }\n * ```\n *\n * @param {Element} element - HTML element\n * @returns {{id: string, args: Object}}\n */\n getAttributes(element) {\n return {\n id: element.getAttribute(L10NID_ATTR_NAME),\n args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n };\n }\n /**\n * Add `newRoot` to the list of roots managed by this `DOMLocalization`.\n *\n * Additionally, if this `DOMLocalization` has an observer, start observing\n * `newRoot` in order to translate mutations in it.\n *\n * @param {Element} newRoot - Root to observe.\n */\n connectRoot(newRoot) {\n for (const root of this.roots) {\n if (root === newRoot ||\n root.contains(newRoot) ||\n newRoot.contains(root)) {\n throw new Error(\"Cannot add a root that overlaps with existing root.\");\n }\n }\n if (this.windowElement) {\n if (this.windowElement !== newRoot.ownerDocument.defaultView) {\n throw new Error(`Cannot connect a root:\n DOMLocalization already has a root from a different window.`);\n }\n }\n else {\n this.windowElement = newRoot.ownerDocument.defaultView;\n this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations));\n }\n this.roots.add(newRoot);\n this.mutationObserver.observe(newRoot, this.observerConfig);\n }\n /**\n * Remove `root` from the list of roots managed by this `DOMLocalization`.\n *\n * Additionally, if this `DOMLocalization` has an observer, stop observing\n * `root`.\n *\n * Returns `true` if the root was the last one managed by this\n * `DOMLocalization`.\n *\n * @param {Element} root - Root to disconnect.\n * @returns {boolean}\n */\n disconnectRoot(root) {\n this.roots.delete(root);\n // Pause the mutation observer to stop observing `root`.\n this.pauseObserving();\n if (this.roots.size === 0) {\n this.mutationObserver = null;\n if (this.windowElement && this.pendingrAF) {\n this.windowElement.cancelAnimationFrame(this.pendingrAF);\n }\n this.windowElement = null;\n this.pendingrAF = null;\n this.pendingElements.clear();\n return true;\n }\n // Resume observing all other roots.\n this.resumeObserving();\n return false;\n }\n /**\n * Translate all roots associated with this `DOMLocalization`.\n *\n * @returns {Promise}\n */\n translateRoots() {\n const roots = Array.from(this.roots);\n return Promise.all(roots.map(root => this.translateFragment(root)));\n }\n /**\n * Pauses the `MutationObserver`.\n */\n pauseObserving() {\n if (!this.mutationObserver) {\n return;\n }\n this.translateMutations(this.mutationObserver.takeRecords());\n this.mutationObserver.disconnect();\n }\n /**\n * Resumes the `MutationObserver`.\n */\n resumeObserving() {\n if (!this.mutationObserver) {\n return;\n }\n for (const root of this.roots) {\n this.mutationObserver.observe(root, this.observerConfig);\n }\n }\n /**\n * Translate mutations detected by the `MutationObserver`.\n *\n * @private\n */\n translateMutations(mutations) {\n for (const mutation of mutations) {\n switch (mutation.type) {\n case \"attributes\":\n if (mutation.target.hasAttribute(\"data-l10n-id\")) {\n this.pendingElements.add(mutation.target);\n }\n break;\n case \"childList\":\n for (const addedNode of mutation.addedNodes) {\n if (addedNode.nodeType === addedNode.ELEMENT_NODE) {\n if (addedNode.childElementCount) {\n for (const element of this.getTranslatables(addedNode)) {\n this.pendingElements.add(element);\n }\n }\n else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) {\n this.pendingElements.add(addedNode);\n }\n }\n }\n break;\n }\n }\n // This fragment allows us to coalesce all pending translations\n // into a single requestAnimationFrame.\n if (this.pendingElements.size > 0) {\n if (this.pendingrAF === null) {\n this.pendingrAF = this.windowElement.requestAnimationFrame(() => {\n this.translateElements(Array.from(this.pendingElements));\n this.pendingElements.clear();\n this.pendingrAF = null;\n });\n }\n }\n }\n /**\n * Translate a DOM element or fragment asynchronously using this\n * `DOMLocalization` object.\n *\n * Manually trigger the translation (or re-translation) of a DOM fragment.\n * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n * with information about which translations to use.\n *\n * Returns a `Promise` that gets resolved once the translation is complete.\n *\n * @param {DOMFragment} frag - Element or DocumentFragment to be translated\n * @returns {Promise}\n */\n translateFragment(frag) {\n return this.translateElements(this.getTranslatables(frag));\n }\n /**\n * Translate a list of DOM elements asynchronously using this\n * `DOMLocalization` object.\n *\n * Manually trigger the translation (or re-translation) of a list of elements.\n * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n * with information about which translations to use.\n *\n * Returns a `Promise` that gets resolved once the translation is complete.\n *\n * @param {Array} elements - List of elements to be translated\n * @returns {Promise}\n */\n async translateElements(elements) {\n if (!elements.length) {\n return undefined;\n }\n const keys = elements.map(this.getKeysForElement);\n const translations = await this.formatMessages(keys);\n return this.applyTranslations(elements, translations);\n }\n /**\n * Applies translations onto elements.\n *\n * @param {Array} elements\n * @param {Array} translations\n * @private\n */\n applyTranslations(elements, translations) {\n this.pauseObserving();\n for (let i = 0; i < elements.length; i++) {\n if (translations[i] !== undefined) {\n translateElement(elements[i], translations[i]);\n }\n }\n this.resumeObserving();\n }\n /**\n * Collects all translatable child elements of the element.\n *\n * @param {Element} element\n * @returns {Array}\n * @private\n */\n getTranslatables(element) {\n const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY));\n if (typeof element.hasAttribute === \"function\" &&\n element.hasAttribute(L10NID_ATTR_NAME)) {\n nodes.push(element);\n }\n return nodes;\n }\n /**\n * Get the `data-l10n-*` attributes from DOM elements as a two-element\n * array.\n *\n * @param {Element} element\n * @returns {Object}\n * @private\n */\n getKeysForElement(element) {\n return {\n id: element.getAttribute(L10NID_ATTR_NAME),\n args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n };\n }\n}\n","export { default as DOMLocalization } from \"./dom_localization.js\";\nexport { default as Localization } from \"./localization.js\";\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n\n/**\n * NOTE: The L10n-implementations should use lowercase language-codes\n * internally.\n * @implements {IL10n}\n */\nclass L10n {\n #dir;\n\n #elements;\n\n #lang;\n\n #l10n;\n\n constructor({ lang, isRTL }, l10n = null) {\n this.#lang = L10n.#fixupLangCode(lang);\n this.#l10n = l10n;\n this.#dir = (isRTL ?? L10n.#isRTL(this.#lang)) ? \"rtl\" : \"ltr\";\n }\n\n _setL10n(l10n) {\n this.#l10n = l10n;\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n document.l10n = l10n;\n }\n }\n\n /** @inheritdoc */\n getLanguage() {\n return this.#lang;\n }\n\n /** @inheritdoc */\n getDirection() {\n return this.#dir;\n }\n\n /** @inheritdoc */\n async get(ids, args = null, fallback) {\n if (Array.isArray(ids)) {\n ids = ids.map(id => ({ id }));\n const messages = await this.#l10n.formatMessages(ids);\n return messages.map(message => message.value);\n }\n\n const messages = await this.#l10n.formatMessages([\n {\n id: ids,\n args,\n },\n ]);\n return messages[0]?.value || fallback;\n }\n\n /** @inheritdoc */\n async translate(element) {\n (this.#elements ||= new Set()).add(element);\n try {\n this.#l10n.connectRoot(element);\n await this.#l10n.translateRoots();\n } catch {\n // Element is under an existing root, so there is no need to add it again.\n }\n }\n\n /** @inheritdoc */\n async translateOnce(element) {\n try {\n await this.#l10n.translateElements([element]);\n } catch (ex) {\n console.error(\"translateOnce:\", ex);\n }\n }\n\n /** @inheritdoc */\n async destroy() {\n if (this.#elements) {\n for (const element of this.#elements) {\n this.#l10n.disconnectRoot(element);\n }\n this.#elements.clear();\n this.#elements = null;\n }\n this.#l10n.pauseObserving();\n }\n\n /** @inheritdoc */\n pause() {\n this.#l10n.pauseObserving();\n }\n\n /** @inheritdoc */\n resume() {\n this.#l10n.resumeObserving();\n }\n\n static #fixupLangCode(langCode) {\n // Use only lowercase language-codes internally, and fallback to English.\n langCode = langCode?.toLowerCase() || \"en-us\";\n\n // Try to support \"incompletely\" specified language codes (see issue 13689).\n const PARTIAL_LANG_CODES = {\n en: \"en-us\",\n es: \"es-es\",\n fy: \"fy-nl\",\n ga: \"ga-ie\",\n gu: \"gu-in\",\n hi: \"hi-in\",\n hy: \"hy-am\",\n nb: \"nb-no\",\n ne: \"ne-np\",\n nn: \"nn-no\",\n pa: \"pa-in\",\n pt: \"pt-pt\",\n sv: \"sv-se\",\n zh: \"zh-cn\",\n };\n return PARTIAL_LANG_CODES[langCode] || langCode;\n }\n\n static #isRTL(lang) {\n const shortCode = lang.split(\"-\", 1)[0];\n return [\"ar\", \"he\", \"fa\", \"ps\", \"ur\"].includes(shortCode);\n }\n}\n\nconst GenericL10n = null;\n\nexport { GenericL10n, L10n };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n\nimport { FeatureTest, fetchData } from \"pdfjs-lib\";\nimport { FluentBundle, FluentResource } from \"fluent-bundle\";\nimport { DOMLocalization } from \"fluent-dom\";\nimport { L10n } from \"./l10n.js\";\n\nfunction PLATFORM() {\n const { isAndroid, isLinux, isMac, isWindows } = FeatureTest.platform;\n if (isLinux) {\n return \"linux\";\n }\n if (isWindows) {\n return \"windows\";\n }\n if (isMac) {\n return \"macos\";\n }\n if (isAndroid) {\n return \"android\";\n }\n return \"other\";\n}\n\nfunction createBundle(lang, text) {\n const resource = new FluentResource(text);\n const bundle = new FluentBundle(lang, {\n functions: { PLATFORM },\n });\n const errors = bundle.addResource(resource);\n if (errors.length) {\n console.error(\"L10n errors\", errors);\n }\n return bundle;\n}\n\n/**\n * @implements {IL10n}\n */\nclass GenericL10n extends L10n {\n constructor(lang) {\n super({ lang });\n\n const generateBundles = !lang\n ? GenericL10n.#generateBundlesFallback.bind(\n GenericL10n,\n this.getLanguage()\n )\n : GenericL10n.#generateBundles.bind(\n GenericL10n,\n \"en-us\",\n this.getLanguage()\n );\n this._setL10n(new DOMLocalization([], generateBundles));\n }\n\n /**\n * Generate the bundles for Fluent.\n * @param {String} defaultLang - The fallback language to use for\n * translations.\n * @param {String} baseLang - The base language to use for translations.\n */\n static async *#generateBundles(defaultLang, baseLang) {\n const { baseURL, paths } = await this.#getPaths();\n\n const langs = [baseLang];\n if (defaultLang !== baseLang) {\n // Also fallback to the short-format of the base language\n // (see issue 17269).\n const shortLang = baseLang.split(\"-\", 1)[0];\n\n if (shortLang !== baseLang) {\n langs.push(shortLang);\n }\n langs.push(defaultLang);\n }\n // Trigger fetching of bundles in parallel, to reduce overall load time.\n const bundles = langs.map(lang => [\n lang,\n this.#createBundle(lang, baseURL, paths),\n ]);\n\n for (const [lang, bundlePromise] of bundles) {\n const bundle = await bundlePromise;\n if (bundle) {\n yield bundle;\n } else if (lang === \"en-us\") {\n yield this.#createBundleFallback(lang);\n }\n }\n }\n\n static async #createBundle(lang, baseURL, paths) {\n const path = paths[lang];\n if (!path) {\n return null;\n }\n const url = new URL(path, baseURL);\n const text = await fetchData(url, /* type = */ \"text\");\n\n return createBundle(lang, text);\n }\n\n static async #getPaths() {\n try {\n const { href } = document.querySelector(`link[type=\"application/l10n\"]`);\n const paths = await fetchData(href, /* type = */ \"json\");\n\n return {\n baseURL: href.substring(0, href.lastIndexOf(\"/\") + 1) || \"./\",\n paths,\n };\n } catch {}\n return { baseURL: \"./\", paths: Object.create(null) };\n }\n\n static async *#generateBundlesFallback(lang) {\n yield this.#createBundleFallback(lang);\n }\n\n static async #createBundleFallback(lang) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n throw new Error(\"Not implemented: #createBundleFallback\");\n }\n const text =\n typeof PDFJSDev === \"undefined\"\n ? await fetchData(\n new URL(\"../l10n/en-US/viewer.ftl\", window.location.href),\n /* type = */ \"text\"\n )\n : PDFJSDev.eval(\"DEFAULT_FTL\");\n\n return createBundle(lang, text);\n }\n}\n\nexport { GenericL10n };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getPdfFilenameFromUrl } from \"pdfjs-lib\";\n\nasync function docProperties(pdfDocument) {\n const url = \"\",\n baseUrl = \"\";\n const { info, metadata, contentDispositionFilename, contentLength } =\n await pdfDocument.getMetadata();\n\n return {\n ...info,\n baseURL: baseUrl,\n filesize: contentLength || (await pdfDocument.getDownloadInfo()).length,\n filename: contentDispositionFilename || getPdfFilenameFromUrl(url),\n metadata: metadata?.getRaw(),\n authors: metadata?.get(\"dc:creator\"),\n numPages: pdfDocument.numPages,\n URL: url,\n };\n}\n\nclass GenericScripting {\n constructor(sandboxBundleSrc) {\n this._ready = new Promise((resolve, reject) => {\n const sandbox =\n typeof PDFJSDev === \"undefined\"\n ? import(sandboxBundleSrc) // eslint-disable-line no-unsanitized/method\n : __raw_import__(sandboxBundleSrc);\n sandbox\n .then(pdfjsSandbox => {\n resolve(pdfjsSandbox.QuickJSSandbox());\n })\n .catch(reject);\n });\n }\n\n async createSandbox(data) {\n const sandbox = await this._ready;\n sandbox.create(data);\n }\n\n async dispatchEventInSandbox(event) {\n const sandbox = await this._ready;\n setTimeout(() => sandbox.dispatchEvent(event), 0);\n }\n\n async destroySandbox() {\n const sandbox = await this._ready;\n sandbox.nukeSandbox();\n }\n}\n\nexport { docProperties, GenericScripting };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getUuid } from \"pdfjs-lib\";\n\nconst KEY_STORAGE = \"pdfjs.signature\";\n\nclass SignatureStorage {\n // TODO: Encrypt the data in using a password and add a UI for entering it.\n // We could use the Web Crypto API for this (see https://bradyjoslin.com/blog/encryption-webcrypto/\n // for an example).\n\n #eventBus;\n\n #signatures = null;\n\n #signal = null;\n\n constructor(eventBus, signal) {\n this.#eventBus = eventBus;\n this.#signal = signal;\n }\n\n #save() {\n localStorage.setItem(\n KEY_STORAGE,\n JSON.stringify(Object.fromEntries(this.#signatures))\n );\n }\n\n async getAll() {\n if (this.#signal) {\n window.addEventListener(\n \"storage\",\n ({ key }) => {\n if (key === KEY_STORAGE) {\n this.#signatures = null;\n this.#eventBus?.dispatch(\"storedsignatureschanged\", {\n source: this,\n });\n }\n },\n { signal: this.#signal }\n );\n this.#signal = null;\n }\n if (!this.#signatures) {\n this.#signatures = new Map();\n const data = localStorage.getItem(KEY_STORAGE);\n if (data) {\n for (const [key, value] of Object.entries(JSON.parse(data))) {\n this.#signatures.set(key, value);\n }\n }\n }\n return this.#signatures;\n }\n\n async isFull() {\n // Only allow 5 signatures to be saved.\n return (await this.size()) === 5;\n }\n\n async size() {\n return (await this.getAll()).size;\n }\n\n async create(data) {\n if (await this.isFull()) {\n return null;\n }\n const uuid = getUuid();\n this.#signatures.set(uuid, data);\n this.#save();\n\n return uuid;\n }\n\n async delete(uuid) {\n const signatures = await this.getAll();\n if (!signatures.has(uuid)) {\n return false;\n }\n signatures.delete(uuid);\n this.#save();\n\n return true;\n }\n}\n\nexport { SignatureStorage };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppOptions } from \"./app_options.js\";\nimport { BaseExternalServices } from \"./external_services.js\";\nimport { BasePreferences } from \"./preferences.js\";\nimport { GenericL10n } from \"./genericl10n.js\";\nimport { GenericScripting } from \"./generic_scripting.js\";\nimport { SignatureStorage } from \"./generic_signature_storage.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n throw new Error(\n 'Module \"pdfjs-web/genericcom\" shall not be used outside GENERIC build.'\n );\n}\n\nfunction initCom(app) {}\n\nclass Preferences extends BasePreferences {\n async _writeToStorage(prefObj) {\n localStorage.setItem(\"pdfjs.preferences\", JSON.stringify(prefObj));\n }\n\n async _readFromStorage(prefObj) {\n return { prefs: JSON.parse(localStorage.getItem(\"pdfjs.preferences\")) };\n }\n}\n\nclass ExternalServices extends BaseExternalServices {\n async createL10n() {\n return new GenericL10n(AppOptions.get(\"localeProperties\")?.lang);\n }\n\n createScripting() {\n return new GenericScripting(AppOptions.get(\"sandboxBundleSrc\"));\n }\n\n createSignatureStorage(eventBus, signal) {\n return new SignatureStorage(eventBus, signal);\n }\n}\n\nclass MLManager {\n static {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n this.getFakeMLManager = options => new FakeMLManager(options);\n }\n }\n\n async isEnabledFor(_name) {\n return false;\n }\n\n async deleteModel(_service) {\n return null;\n }\n\n isReady(_name) {\n return false;\n }\n\n guess(_data) {}\n\n toggleService(_name, _enabled) {}\n}\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // eslint-disable-next-line no-var\n var FakeMLManager = class {\n eventBus = null;\n\n hasProgress = false;\n\n constructor({ enableGuessAltText, enableAltTextModelDownload }) {\n this.enableGuessAltText = enableGuessAltText;\n this.enableAltTextModelDownload = enableAltTextModelDownload;\n }\n\n setEventBus(eventBus, abortSignal) {\n this.eventBus = eventBus;\n }\n\n async isEnabledFor(_name) {\n return this.enableGuessAltText;\n }\n\n async deleteModel(_name) {\n this.enableAltTextModelDownload = false;\n return null;\n }\n\n async loadModel(_name) {}\n\n async downloadModel(_name) {\n // Simulate downloading the model but with progress.\n // The progress can be seen in the new alt-text dialog.\n this.hasProgress = true;\n\n const { promise, resolve } = Promise.withResolvers();\n const total = 1e8;\n const end = 1.5 * total;\n const increment = 5e6;\n let loaded = 0;\n const id = setInterval(() => {\n loaded += increment;\n if (loaded <= end) {\n this.eventBus.dispatch(\"loadaiengineprogress\", {\n source: this,\n detail: {\n total,\n totalLoaded: loaded,\n finished: loaded + increment >= end,\n },\n });\n return;\n }\n clearInterval(id);\n this.hasProgress = false;\n this.enableAltTextModelDownload = true;\n resolve(true);\n }, 900);\n return promise;\n }\n\n isReady(_name) {\n return this.enableAltTextModelDownload;\n }\n\n guess({ request: { data } }) {\n return new Promise(resolve => {\n setTimeout(() => {\n resolve(data ? { output: \"Fake alt text.\" } : { error: true });\n }, 3000);\n });\n }\n\n toggleService(_name, enabled) {\n this.enableGuessAltText = enabled;\n }\n };\n}\n\nexport { ExternalServices, initCom, MLManager, Preferences };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu } from \"pdfjs-lib\";\n\nclass NewAltTextManager {\n #boundCancel = this.#cancel.bind(this);\n\n #createAutomaticallyButton;\n\n #currentEditor = null;\n\n #cancelButton;\n\n #descriptionContainer;\n\n #dialog;\n\n #disclaimer;\n\n #downloadModel;\n\n #downloadModelDescription;\n\n #eventBus;\n\n #firstTime = false;\n\n #guessedAltText;\n\n #hasAI = null;\n\n #isEditing = null;\n\n #imagePreview;\n\n #imageData;\n\n #isAILoading = false;\n\n #wasAILoading = false;\n\n #learnMore;\n\n #notNowButton;\n\n #overlayManager;\n\n #textarea;\n\n #title;\n\n #uiManager;\n\n #previousAltText = null;\n\n constructor(\n {\n descriptionContainer,\n dialog,\n imagePreview,\n cancelButton,\n disclaimer,\n notNowButton,\n saveButton,\n textarea,\n learnMore,\n errorCloseButton,\n createAutomaticallyButton,\n downloadModel,\n downloadModelDescription,\n title,\n },\n overlayManager,\n eventBus\n ) {\n this.#cancelButton = cancelButton;\n this.#createAutomaticallyButton = createAutomaticallyButton;\n this.#descriptionContainer = descriptionContainer;\n this.#dialog = dialog;\n this.#disclaimer = disclaimer;\n this.#notNowButton = notNowButton;\n this.#imagePreview = imagePreview;\n this.#textarea = textarea;\n this.#learnMore = learnMore;\n this.#title = title;\n this.#downloadModel = downloadModel;\n this.#downloadModelDescription = downloadModelDescription;\n this.#overlayManager = overlayManager;\n this.#eventBus = eventBus;\n\n dialog.addEventListener(\"close\", this.#close.bind(this));\n dialog.addEventListener(\"contextmenu\", event => {\n if (event.target !== this.#textarea) {\n event.preventDefault();\n }\n });\n cancelButton.addEventListener(\"click\", this.#boundCancel);\n notNowButton.addEventListener(\"click\", this.#boundCancel);\n saveButton.addEventListener(\"click\", this.#save.bind(this));\n errorCloseButton.addEventListener(\"click\", () => {\n this.#toggleError(false);\n });\n createAutomaticallyButton.addEventListener(\"click\", async () => {\n const checked =\n createAutomaticallyButton.getAttribute(\"aria-pressed\") !== \"true\";\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.ai_generation_check\",\n data: { status: checked },\n });\n\n if (this.#uiManager) {\n this.#uiManager.setPreference(\"enableGuessAltText\", checked);\n await this.#uiManager.mlManager.toggleService(\"altText\", checked);\n }\n this.#toggleGuessAltText(checked, /* isInitial = */ false);\n });\n textarea.addEventListener(\"focus\", () => {\n this.#wasAILoading = this.#isAILoading;\n this.#toggleLoading(false);\n this.#toggleTitleAndDisclaimer();\n });\n textarea.addEventListener(\"blur\", () => {\n if (!textarea.value) {\n this.#toggleLoading(this.#wasAILoading);\n }\n this.#toggleTitleAndDisclaimer();\n });\n textarea.addEventListener(\"input\", () => {\n this.#toggleTitleAndDisclaimer();\n });\n\n eventBus._on(\"enableguessalttext\", ({ value }) => {\n this.#toggleGuessAltText(value, /* isInitial = */ false);\n });\n\n this.#overlayManager.register(dialog);\n\n this.#learnMore.addEventListener(\"click\", () => {\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.info\",\n data: { topic: \"alt_text\" },\n });\n });\n }\n\n #toggleLoading(value) {\n if (!this.#uiManager || this.#isAILoading === value) {\n return;\n }\n this.#isAILoading = value;\n this.#descriptionContainer.classList.toggle(\"loading\", value);\n }\n\n #toggleError(value) {\n if (!this.#uiManager) {\n return;\n }\n this.#dialog.classList.toggle(\"error\", value);\n }\n\n async #toggleGuessAltText(value, isInitial = false) {\n if (!this.#uiManager) {\n return;\n }\n this.#dialog.classList.toggle(\"aiDisabled\", !value);\n this.#createAutomaticallyButton.setAttribute(\"aria-pressed\", value);\n\n if (value) {\n const { altTextLearnMoreUrl } = this.#uiManager.mlManager;\n if (altTextLearnMoreUrl) {\n this.#learnMore.href = altTextLearnMoreUrl;\n }\n this.#mlGuessAltText(isInitial);\n } else {\n this.#toggleLoading(false);\n this.#isAILoading = false;\n this.#toggleTitleAndDisclaimer();\n }\n }\n\n #toggleNotNow() {\n this.#notNowButton.classList.toggle(\"hidden\", !this.#firstTime);\n this.#cancelButton.classList.toggle(\"hidden\", this.#firstTime);\n }\n\n #toggleAI(value) {\n if (!this.#uiManager || this.#hasAI === value) {\n return;\n }\n this.#hasAI = value;\n this.#dialog.classList.toggle(\"noAi\", !value);\n this.#toggleTitleAndDisclaimer();\n }\n\n #toggleTitleAndDisclaimer() {\n // Disclaimer is visible when the AI is loading or the user didn't change\n // the guessed alt text.\n const visible =\n this.#isAILoading ||\n (this.#guessedAltText && this.#guessedAltText === this.#textarea.value);\n this.#disclaimer.hidden = !visible;\n\n // The title changes depending if the text area is empty or not.\n const isEditing = this.#isAILoading || !!this.#textarea.value;\n if (this.#isEditing === isEditing) {\n return;\n }\n this.#isEditing = isEditing;\n this.#title.setAttribute(\n \"data-l10n-id\",\n isEditing\n ? \"pdfjs-editor-new-alt-text-dialog-edit-label\"\n : \"pdfjs-editor-new-alt-text-dialog-add-label\"\n );\n }\n\n async #mlGuessAltText(isInitial) {\n if (this.#isAILoading) {\n // We're still loading the previous guess.\n return;\n }\n\n if (this.#textarea.value) {\n // The user has already set an alt text.\n return;\n }\n\n if (isInitial && this.#previousAltText !== null) {\n // The user has already set an alt text (empty or not).\n return;\n }\n\n this.#guessedAltText = this.#currentEditor.guessedAltText;\n if (this.#previousAltText === null && this.#guessedAltText) {\n // We have a guessed alt text and the user didn't change it.\n this.#addAltText(this.#guessedAltText);\n return;\n }\n\n this.#toggleLoading(true);\n this.#toggleTitleAndDisclaimer();\n\n let hasError = false;\n try {\n // When calling #mlGuessAltText we don't wait for it, so we must take care\n // that the alt text dialog can have been closed before the response is.\n\n const altText = await this.#currentEditor.mlGuessAltText(\n this.#imageData,\n /* updateAltTextData = */ false\n );\n if (altText) {\n this.#guessedAltText = altText;\n this.#wasAILoading = this.#isAILoading;\n if (this.#isAILoading) {\n this.#addAltText(altText);\n }\n }\n } catch (e) {\n console.error(e);\n hasError = true;\n }\n\n this.#toggleLoading(false);\n this.#toggleTitleAndDisclaimer();\n\n if (hasError && this.#uiManager) {\n this.#toggleError(true);\n }\n }\n\n #addAltText(altText) {\n if (!this.#uiManager || this.#textarea.value) {\n return;\n }\n this.#textarea.value = altText;\n this.#toggleTitleAndDisclaimer();\n }\n\n #setProgress() {\n // Show the download model progress.\n this.#downloadModel.classList.toggle(\"hidden\", false);\n\n const callback = async ({ detail: { finished, total, totalLoaded } }) => {\n const ONE_MEGA_BYTES = 1e6;\n // totalLoaded can be greater than total if the download is compressed.\n // So we cheat to avoid any confusion.\n totalLoaded = Math.min(0.99 * total, totalLoaded);\n\n // Update the progress.\n const totalSize = (this.#downloadModelDescription.ariaValueMax =\n Math.round(total / ONE_MEGA_BYTES));\n const downloadedSize = (this.#downloadModelDescription.ariaValueNow =\n Math.round(totalLoaded / ONE_MEGA_BYTES));\n this.#downloadModelDescription.setAttribute(\n \"data-l10n-args\",\n JSON.stringify({ totalSize, downloadedSize })\n );\n if (!finished) {\n return;\n }\n\n // We're done, remove the listener and hide the download model progress.\n this.#eventBus._off(\"loadaiengineprogress\", callback);\n this.#downloadModel.classList.toggle(\"hidden\", true);\n\n this.#toggleAI(true);\n if (!this.#uiManager) {\n return;\n }\n const { mlManager } = this.#uiManager;\n\n // The model has been downloaded, we can now enable the AI service.\n mlManager.toggleService(\"altText\", true);\n this.#toggleGuessAltText(\n await mlManager.isEnabledFor(\"altText\"),\n /* isInitial = */ true\n );\n };\n this.#eventBus._on(\"loadaiengineprogress\", callback);\n }\n\n async editAltText(uiManager, editor, firstTime) {\n if (this.#currentEditor || !editor) {\n return;\n }\n\n if (firstTime && editor.hasAltTextData()) {\n editor.altTextFinish();\n return;\n }\n\n this.#firstTime = firstTime;\n let { mlManager } = uiManager;\n let hasAI = !!mlManager;\n this.#toggleTitleAndDisclaimer();\n\n if (mlManager && !mlManager.isReady(\"altText\")) {\n hasAI = false;\n if (mlManager.hasProgress) {\n this.#setProgress();\n } else {\n mlManager = null;\n }\n } else {\n this.#downloadModel.classList.toggle(\"hidden\", true);\n }\n\n const isAltTextEnabledPromise = mlManager?.isEnabledFor(\"altText\");\n\n this.#currentEditor = editor;\n this.#uiManager = uiManager;\n this.#uiManager.removeEditListeners();\n\n ({ altText: this.#previousAltText } = editor.altTextData);\n this.#textarea.value = this.#previousAltText ?? \"\";\n\n // TODO: get this value from Firefox\n // (https://bugzilla.mozilla.org/show_bug.cgi?id=1908184)\n const AI_MAX_IMAGE_DIMENSION = 224;\n const MAX_PREVIEW_DIMENSION = 180;\n\n // The max dimension of the preview in the dialog is 180px, so we keep 224px\n // and rescale it thanks to css.\n\n let canvas, width, height;\n if (mlManager) {\n ({\n canvas,\n width,\n height,\n imageData: this.#imageData,\n } = editor.copyCanvas(\n AI_MAX_IMAGE_DIMENSION,\n MAX_PREVIEW_DIMENSION,\n /* createImageData = */ true\n ));\n if (hasAI) {\n this.#toggleGuessAltText(\n await isAltTextEnabledPromise,\n /* isInitial = */ true\n );\n }\n } else {\n ({ canvas, width, height } = editor.copyCanvas(\n AI_MAX_IMAGE_DIMENSION,\n MAX_PREVIEW_DIMENSION,\n /* createImageData = */ false\n ));\n }\n\n canvas.setAttribute(\"role\", \"presentation\");\n const { style } = canvas;\n style.width = `${width}px`;\n style.height = `${height}px`;\n this.#imagePreview.append(canvas);\n\n this.#toggleNotNow();\n this.#toggleAI(hasAI);\n this.#toggleError(false);\n\n try {\n await this.#overlayManager.open(this.#dialog);\n } catch (ex) {\n this.#close();\n throw ex;\n }\n }\n\n #cancel() {\n this.#currentEditor.altTextData = {\n cancel: true,\n };\n const altText = this.#textarea.value.trim();\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.dismiss\",\n data: {\n alt_text_type: altText ? \"present\" : \"empty\",\n flow: this.#firstTime ? \"image_add\" : \"alt_text_edit\",\n },\n });\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.image_added\",\n data: { alt_text_modal: true, alt_text_type: \"skipped\" },\n });\n this.#finish();\n }\n\n #finish() {\n this.#overlayManager.closeIfActive(this.#dialog);\n }\n\n #close() {\n const canvas = this.#imagePreview.firstChild;\n canvas.remove();\n canvas.width = canvas.height = 0;\n this.#imageData = null;\n\n this.#toggleLoading(false);\n\n this.#uiManager?.addEditListeners();\n this.#currentEditor.altTextFinish();\n this.#uiManager?.setSelected(this.#currentEditor);\n this.#currentEditor = null;\n this.#uiManager = null;\n }\n\n #extractWords(text) {\n return new Set(\n text\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/gu)\n .filter(x => !!x)\n );\n }\n\n #save() {\n const altText = this.#textarea.value.trim();\n this.#currentEditor.altTextData = {\n altText,\n decorative: false,\n };\n this.#currentEditor.altTextData.guessedAltText = this.#guessedAltText;\n\n if (this.#guessedAltText && this.#guessedAltText !== altText) {\n const guessedWords = this.#extractWords(this.#guessedAltText);\n const words = this.#extractWords(altText);\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.user_edit\",\n data: {\n total_words: guessedWords.size,\n words_removed: guessedWords.difference(words).size,\n words_added: words.difference(guessedWords).size,\n },\n });\n }\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.image_added\",\n data: {\n alt_text_modal: true,\n alt_text_type: altText ? \"present\" : \"empty\",\n },\n });\n\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.save\",\n data: {\n alt_text_type: altText ? \"present\" : \"empty\",\n flow: this.#firstTime ? \"image_add\" : \"alt_text_edit\",\n },\n });\n\n this.#finish();\n }\n\n destroy() {\n this.#uiManager = null; // Avoid re-adding the edit listeners.\n this.#finish();\n }\n}\n\nclass ImageAltTextSettings {\n #aiModelSettings;\n\n #createModelButton;\n\n #downloadModelButton;\n\n #dialog;\n\n #eventBus;\n\n #mlManager;\n\n #overlayManager;\n\n #showAltTextDialogButton;\n\n constructor(\n {\n dialog,\n createModelButton,\n aiModelSettings,\n learnMore,\n closeButton,\n deleteModelButton,\n downloadModelButton,\n showAltTextDialogButton,\n },\n overlayManager,\n eventBus,\n mlManager\n ) {\n this.#dialog = dialog;\n this.#aiModelSettings = aiModelSettings;\n this.#createModelButton = createModelButton;\n this.#downloadModelButton = downloadModelButton;\n this.#showAltTextDialogButton = showAltTextDialogButton;\n this.#overlayManager = overlayManager;\n this.#eventBus = eventBus;\n this.#mlManager = mlManager;\n\n const { altTextLearnMoreUrl } = mlManager;\n if (altTextLearnMoreUrl) {\n learnMore.href = altTextLearnMoreUrl;\n }\n\n dialog.addEventListener(\"contextmenu\", noContextMenu);\n\n createModelButton.addEventListener(\"click\", async e => {\n const checked = this.#togglePref(\"enableGuessAltText\", e);\n await mlManager.toggleService(\"altText\", checked);\n this.#reportTelemetry({\n type: \"stamp\",\n action: \"pdfjs.image.alt_text.settings_ai_generation_check\",\n data: { status: checked },\n });\n });\n\n showAltTextDialogButton.addEventListener(\"click\", e => {\n const checked = this.#togglePref(\"enableNewAltTextWhenAddingImage\", e);\n this.#reportTelemetry({\n type: \"stamp\",\n action: \"pdfjs.image.alt_text.settings_edit_alt_text_check\",\n data: { status: checked },\n });\n });\n\n deleteModelButton.addEventListener(\"click\", this.#delete.bind(this, true));\n downloadModelButton.addEventListener(\n \"click\",\n this.#download.bind(this, true)\n );\n\n closeButton.addEventListener(\"click\", this.#finish.bind(this));\n\n learnMore.addEventListener(\"click\", () => {\n this.#reportTelemetry({\n type: \"stamp\",\n action: \"pdfjs.image.alt_text.info\",\n data: { topic: \"ai_generation\" },\n });\n });\n\n eventBus._on(\"enablealttextmodeldownload\", ({ value }) => {\n if (value) {\n this.#download(false);\n } else {\n this.#delete(false);\n }\n });\n\n this.#overlayManager.register(dialog);\n }\n\n #reportTelemetry(data) {\n this.#eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data,\n },\n });\n }\n\n async #download(isFromUI = false) {\n if (isFromUI) {\n this.#downloadModelButton.disabled = true;\n const span = this.#downloadModelButton.firstChild;\n span.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-alt-text-settings-downloading-model-button\"\n );\n\n await this.#mlManager.downloadModel(\"altText\");\n\n span.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-alt-text-settings-download-model-button\"\n );\n\n this.#createModelButton.disabled = false;\n this.#setPref(\"enableGuessAltText\", true);\n this.#mlManager.toggleService(\"altText\", true);\n this.#setPref(\"enableAltTextModelDownload\", true);\n this.#downloadModelButton.disabled = false;\n }\n\n this.#aiModelSettings.classList.toggle(\"download\", false);\n this.#createModelButton.setAttribute(\"aria-pressed\", true);\n }\n\n async #delete(isFromUI = false) {\n if (isFromUI) {\n await this.#mlManager.deleteModel(\"altText\");\n this.#setPref(\"enableGuessAltText\", false);\n this.#setPref(\"enableAltTextModelDownload\", false);\n }\n\n this.#aiModelSettings.classList.toggle(\"download\", true);\n this.#createModelButton.disabled = true;\n this.#createModelButton.setAttribute(\"aria-pressed\", false);\n }\n\n async open({ enableGuessAltText, enableNewAltTextWhenAddingImage }) {\n const { enableAltTextModelDownload } = this.#mlManager;\n this.#createModelButton.disabled = !enableAltTextModelDownload;\n this.#createModelButton.setAttribute(\n \"aria-pressed\",\n enableAltTextModelDownload && enableGuessAltText\n );\n this.#showAltTextDialogButton.setAttribute(\n \"aria-pressed\",\n enableNewAltTextWhenAddingImage\n );\n this.#aiModelSettings.classList.toggle(\n \"download\",\n !enableAltTextModelDownload\n );\n\n await this.#overlayManager.open(this.#dialog);\n this.#reportTelemetry({\n type: \"stamp\",\n action: \"pdfjs.image.alt_text.settings_displayed\",\n });\n }\n\n #togglePref(name, { target }) {\n const checked = target.getAttribute(\"aria-pressed\") !== \"true\";\n this.#setPref(name, checked);\n target.setAttribute(\"aria-pressed\", checked);\n return checked;\n }\n\n #setPref(name, value) {\n this.#eventBus.dispatch(\"setpreference\", {\n source: this,\n name,\n value,\n });\n }\n\n #finish() {\n this.#overlayManager.closeIfActive(this.#dialog);\n }\n}\n\nexport { ImageAltTextSettings, NewAltTextManager };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DOMSVGFactory } from \"pdfjs-lib\";\n\nclass AltTextManager {\n #clickAC = null;\n\n #currentEditor = null;\n\n #cancelButton;\n\n #dialog;\n\n #eventBus;\n\n #hasUsedPointer = false;\n\n #optionDescription;\n\n #optionDecorative;\n\n #overlayManager;\n\n #saveButton;\n\n #textarea;\n\n #uiManager;\n\n #previousAltText = null;\n\n #resizeAC = null;\n\n #svgElement = null;\n\n #rectElement = null;\n\n #container;\n\n #telemetryData = null;\n\n constructor(\n {\n dialog,\n optionDescription,\n optionDecorative,\n textarea,\n cancelButton,\n saveButton,\n },\n container,\n overlayManager,\n eventBus\n ) {\n this.#dialog = dialog;\n this.#optionDescription = optionDescription;\n this.#optionDecorative = optionDecorative;\n this.#textarea = textarea;\n this.#cancelButton = cancelButton;\n this.#saveButton = saveButton;\n this.#overlayManager = overlayManager;\n this.#eventBus = eventBus;\n this.#container = container;\n\n const onUpdateUIState = this.#updateUIState.bind(this);\n\n dialog.addEventListener(\"close\", this.#close.bind(this));\n dialog.addEventListener(\"contextmenu\", event => {\n if (event.target !== this.#textarea) {\n event.preventDefault();\n }\n });\n cancelButton.addEventListener(\"click\", this.#finish.bind(this));\n saveButton.addEventListener(\"click\", this.#save.bind(this));\n optionDescription.addEventListener(\"change\", onUpdateUIState);\n optionDecorative.addEventListener(\"change\", onUpdateUIState);\n\n this.#overlayManager.register(dialog);\n }\n\n #createSVGElement() {\n if (this.#svgElement) {\n return;\n }\n\n // We create a mask to add to the dialog backdrop: the idea is to have a\n // darken background everywhere except on the editor to clearly see the\n // picture to describe.\n\n const svgFactory = new DOMSVGFactory();\n const svg = (this.#svgElement = svgFactory.createElement(\"svg\"));\n svg.setAttribute(\"width\", \"0\");\n svg.setAttribute(\"height\", \"0\");\n const defs = svgFactory.createElement(\"defs\");\n svg.append(defs);\n const mask = svgFactory.createElement(\"mask\");\n defs.append(mask);\n mask.setAttribute(\"id\", \"alttext-manager-mask\");\n mask.setAttribute(\"maskContentUnits\", \"objectBoundingBox\");\n let rect = svgFactory.createElement(\"rect\");\n mask.append(rect);\n rect.setAttribute(\"fill\", \"white\");\n rect.setAttribute(\"width\", \"1\");\n rect.setAttribute(\"height\", \"1\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n\n rect = this.#rectElement = svgFactory.createElement(\"rect\");\n mask.append(rect);\n rect.setAttribute(\"fill\", \"black\");\n this.#dialog.append(svg);\n }\n\n async editAltText(uiManager, editor) {\n if (this.#currentEditor || !editor) {\n return;\n }\n this.#createSVGElement();\n\n this.#hasUsedPointer = false;\n\n this.#clickAC = new AbortController();\n const clickOpts = { signal: this.#clickAC.signal },\n onClick = this.#onClick.bind(this);\n for (const element of [\n this.#optionDescription,\n this.#optionDecorative,\n this.#textarea,\n this.#saveButton,\n this.#cancelButton,\n ]) {\n element.addEventListener(\"click\", onClick, clickOpts);\n }\n\n const { altText, decorative } = editor.altTextData;\n if (decorative === true) {\n this.#optionDecorative.checked = true;\n this.#optionDescription.checked = false;\n } else {\n this.#optionDecorative.checked = false;\n this.#optionDescription.checked = true;\n }\n this.#previousAltText = this.#textarea.value = altText?.trim() || \"\";\n this.#updateUIState();\n\n this.#currentEditor = editor;\n this.#uiManager = uiManager;\n this.#uiManager.removeEditListeners();\n\n this.#resizeAC = new AbortController();\n this.#eventBus._on(\"resize\", this.#setPosition.bind(this), {\n signal: this.#resizeAC.signal,\n });\n\n try {\n await this.#overlayManager.open(this.#dialog);\n this.#setPosition();\n } catch (ex) {\n this.#close();\n throw ex;\n }\n }\n\n #setPosition() {\n if (!this.#currentEditor) {\n return;\n }\n const dialog = this.#dialog;\n const { style } = dialog;\n const {\n x: containerX,\n y: containerY,\n width: containerW,\n height: containerH,\n } = this.#container.getBoundingClientRect();\n const { innerWidth: windowW, innerHeight: windowH } = window;\n const { width: dialogW, height: dialogH } = dialog.getBoundingClientRect();\n const { x, y, width, height } = this.#currentEditor.getClientDimensions();\n const MARGIN = 10;\n const isLTR = this.#uiManager.direction === \"ltr\";\n\n const xs = Math.max(x, containerX);\n const xe = Math.min(x + width, containerX + containerW);\n const ys = Math.max(y, containerY);\n const ye = Math.min(y + height, containerY + containerH);\n this.#rectElement.setAttribute(\"width\", `${(xe - xs) / windowW}`);\n this.#rectElement.setAttribute(\"height\", `${(ye - ys) / windowH}`);\n this.#rectElement.setAttribute(\"x\", `${xs / windowW}`);\n this.#rectElement.setAttribute(\"y\", `${ys / windowH}`);\n\n let left = null;\n let top = Math.max(y, 0);\n top += Math.min(windowH - (top + dialogH), 0);\n\n if (isLTR) {\n // Prefer to position the dialog \"after\" (so on the right) the editor.\n if (x + width + MARGIN + dialogW < windowW) {\n left = x + width + MARGIN;\n } else if (x > dialogW + MARGIN) {\n left = x - dialogW - MARGIN;\n }\n } else if (x > dialogW + MARGIN) {\n left = x - dialogW - MARGIN;\n } else if (x + width + MARGIN + dialogW < windowW) {\n left = x + width + MARGIN;\n }\n\n if (left === null) {\n top = null;\n left = Math.max(x, 0);\n left += Math.min(windowW - (left + dialogW), 0);\n if (y > dialogH + MARGIN) {\n top = y - dialogH - MARGIN;\n } else if (y + height + MARGIN + dialogH < windowH) {\n top = y + height + MARGIN;\n }\n }\n\n if (top !== null) {\n dialog.classList.add(\"positioned\");\n if (isLTR) {\n style.left = `${left}px`;\n } else {\n style.right = `${windowW - left - dialogW}px`;\n }\n style.top = `${top}px`;\n } else {\n dialog.classList.remove(\"positioned\");\n style.left = \"\";\n style.top = \"\";\n }\n }\n\n #finish() {\n this.#overlayManager.closeIfActive(this.#dialog);\n }\n\n #close() {\n this.#currentEditor._reportTelemetry(\n this.#telemetryData || {\n action: \"alt_text_cancel\",\n alt_text_keyboard: !this.#hasUsedPointer,\n }\n );\n this.#telemetryData = null;\n\n this.#removeOnClickListeners();\n this.#uiManager?.addEditListeners();\n this.#resizeAC?.abort();\n this.#resizeAC = null;\n this.#currentEditor.altTextFinish();\n this.#currentEditor = null;\n this.#uiManager = null;\n }\n\n #updateUIState() {\n this.#textarea.disabled = this.#optionDecorative.checked;\n }\n\n #save() {\n const altText = this.#textarea.value.trim();\n const decorative = this.#optionDecorative.checked;\n this.#currentEditor.altTextData = {\n altText,\n decorative,\n };\n this.#telemetryData = {\n action: \"alt_text_save\",\n alt_text_description: !!altText,\n alt_text_edit:\n !!this.#previousAltText && this.#previousAltText !== altText,\n alt_text_decorative: decorative,\n alt_text_keyboard: !this.#hasUsedPointer,\n };\n this.#finish();\n }\n\n #onClick(evt) {\n if (evt.detail === 0) {\n return; // The keyboard was used.\n }\n this.#hasUsedPointer = true;\n this.#removeOnClickListeners();\n }\n\n #removeOnClickListeners() {\n this.#clickAC?.abort();\n this.#clickAC = null;\n }\n\n destroy() {\n this.#uiManager = null; // Avoid re-adding the edit listeners.\n this.#finish();\n this.#svgElement?.remove();\n this.#svgElement = this.#rectElement = null;\n }\n}\n\nexport { AltTextManager };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n\nimport { AnnotationEditorParamsType } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} AnnotationEditorParamsOptions\n * @property {HTMLInputElement} editorFreeTextFontSize\n * @property {HTMLInputElement} editorFreeTextColor\n * @property {HTMLInputElement} editorInkColor\n * @property {HTMLInputElement} editorInkThickness\n * @property {HTMLInputElement} editorInkOpacity\n * @property {HTMLButtonElement} editorStampAddImage\n * @property {HTMLInputElement} editorFreeHighlightThickness\n * @property {HTMLButtonElement} editorHighlightShowAll\n * @property {HTMLButtonElement} editorSignatureAddSignature\n */\n\nclass AnnotationEditorParams {\n /**\n * @param {AnnotationEditorParamsOptions} options\n * @param {EventBus} eventBus\n */\n constructor(options, eventBus) {\n this.eventBus = eventBus;\n this.#bindListeners(options);\n }\n\n /**\n * @param {AnnotationEditorParamsOptions} options\n */\n #bindListeners({\n editorFreeTextFontSize,\n editorFreeTextColor,\n editorInkColor,\n editorInkThickness,\n editorInkOpacity,\n editorStampAddImage,\n editorFreeHighlightThickness,\n editorHighlightShowAll,\n editorSignatureAddSignature,\n }) {\n const { eventBus } = this;\n\n const dispatchEvent = (typeStr, value) => {\n eventBus.dispatch(\"switchannotationeditorparams\", {\n source: this,\n type: AnnotationEditorParamsType[typeStr],\n value,\n });\n };\n editorFreeTextFontSize.addEventListener(\"input\", function () {\n dispatchEvent(\"FREETEXT_SIZE\", this.valueAsNumber);\n });\n editorFreeTextColor.addEventListener(\"input\", function () {\n dispatchEvent(\"FREETEXT_COLOR\", this.value);\n });\n editorInkColor.addEventListener(\"input\", function () {\n dispatchEvent(\"INK_COLOR\", this.value);\n });\n editorInkThickness.addEventListener(\"input\", function () {\n dispatchEvent(\"INK_THICKNESS\", this.valueAsNumber);\n });\n editorInkOpacity.addEventListener(\"input\", function () {\n dispatchEvent(\"INK_OPACITY\", this.valueAsNumber);\n });\n editorStampAddImage.addEventListener(\"click\", () => {\n eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data: { action: \"pdfjs.image.add_image_click\" },\n },\n });\n dispatchEvent(\"CREATE\");\n });\n editorFreeHighlightThickness.addEventListener(\"input\", function () {\n dispatchEvent(\"HIGHLIGHT_THICKNESS\", this.valueAsNumber);\n });\n editorHighlightShowAll.addEventListener(\"click\", function () {\n const checked = this.getAttribute(\"aria-pressed\") === \"true\";\n this.setAttribute(\"aria-pressed\", !checked);\n dispatchEvent(\"HIGHLIGHT_SHOW_ALL\", !checked);\n });\n editorSignatureAddSignature.addEventListener(\"click\", () => {\n dispatchEvent(\"CREATE\");\n });\n\n eventBus._on(\"annotationeditorparamschanged\", evt => {\n for (const [type, value] of evt.details) {\n switch (type) {\n case AnnotationEditorParamsType.FREETEXT_SIZE:\n editorFreeTextFontSize.value = value;\n break;\n case AnnotationEditorParamsType.FREETEXT_COLOR:\n editorFreeTextColor.value = value;\n break;\n case AnnotationEditorParamsType.INK_COLOR:\n editorInkColor.value = value;\n break;\n case AnnotationEditorParamsType.INK_THICKNESS:\n editorInkThickness.value = value;\n break;\n case AnnotationEditorParamsType.INK_OPACITY:\n editorInkOpacity.value = value;\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR:\n eventBus.dispatch(\"mainhighlightcolorpickerupdatecolor\", {\n source: this,\n value,\n });\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n editorFreeHighlightThickness.value = value;\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_FREE:\n editorFreeHighlightThickness.disabled = !value;\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n editorHighlightShowAll.setAttribute(\"aria-pressed\", value);\n break;\n }\n }\n });\n }\n}\n\nexport { AnnotationEditorParams };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Used to compare floats: there is no exact equality due to rounding errors.\nconst PRECISION = 1e-1;\n\nclass CaretBrowsingMode {\n #mainContainer;\n\n #toolBarHeight = 0;\n\n #viewerContainer;\n\n constructor(abortSignal, mainContainer, viewerContainer, toolbarContainer) {\n this.#mainContainer = mainContainer;\n this.#viewerContainer = viewerContainer;\n\n if (!toolbarContainer) {\n return;\n }\n this.#toolBarHeight = toolbarContainer.getBoundingClientRect().height;\n\n const toolbarObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n if (entry.target === toolbarContainer) {\n this.#toolBarHeight = Math.floor(entry.borderBoxSize[0].blockSize);\n break;\n }\n }\n });\n toolbarObserver.observe(toolbarContainer);\n\n abortSignal.addEventListener(\"abort\", () => toolbarObserver.disconnect(), {\n once: true,\n });\n }\n\n /**\n * Return true if the two rectangles are on the same line.\n * @param {DOMRect} rect1\n * @param {DOMRect} rect2\n * @returns {boolean}\n */\n #isOnSameLine(rect1, rect2) {\n const top1 = rect1.y;\n const bot1 = rect1.bottom;\n const mid1 = rect1.y + rect1.height / 2;\n\n const top2 = rect2.y;\n const bot2 = rect2.bottom;\n const mid2 = rect2.y + rect2.height / 2;\n\n return (top1 <= mid2 && mid2 <= bot1) || (top2 <= mid1 && mid1 <= bot2);\n }\n\n /**\n * Return `true` if the rectangle is:\n * - under the caret when `isUp === false`.\n * - over the caret when `isUp === true`.\n * @param {DOMRect} rect\n * @param {number} x\n * @param {number} y\n * @param {boolean} isUp\n * @returns {boolean}\n */\n #isUnderOver(rect, x, y, isUp) {\n const midY = rect.y + rect.height / 2;\n return (\n (isUp ? y >= midY : y <= midY) &&\n rect.x - PRECISION <= x &&\n x <= rect.right + PRECISION\n );\n }\n\n /**\n * Check if the rectangle is visible.\n * @param {DOMRect} rect\n * @returns {boolean}\n */\n #isVisible(rect) {\n return (\n rect.top >= this.#toolBarHeight &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n );\n }\n\n /**\n * Get the position of the caret.\n * @param {Selection} selection\n * @param {boolean} isUp\n * @returns {Array}\n */\n #getCaretPosition(selection, isUp) {\n const { focusNode, focusOffset } = selection;\n const range = document.createRange();\n range.setStart(focusNode, focusOffset);\n range.setEnd(focusNode, focusOffset);\n const rect = range.getBoundingClientRect();\n\n return [rect.x, isUp ? rect.top : rect.bottom];\n }\n\n static #caretPositionFromPoint(x, y) {\n if (\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n !document.caretPositionFromPoint\n ) {\n const { startContainer: offsetNode, startOffset: offset } =\n document.caretRangeFromPoint(x, y);\n return { offsetNode, offset };\n }\n return document.caretPositionFromPoint(x, y);\n }\n\n #setCaretPositionHelper(selection, caretX, select, element, rect) {\n rect ||= element.getBoundingClientRect();\n if (caretX <= rect.x + PRECISION) {\n if (select) {\n selection.extend(element.firstChild, 0);\n } else {\n selection.setPosition(element.firstChild, 0);\n }\n return;\n }\n if (rect.right - PRECISION <= caretX) {\n const { lastChild } = element;\n if (select) {\n selection.extend(lastChild, lastChild.length);\n } else {\n selection.setPosition(lastChild, lastChild.length);\n }\n return;\n }\n\n const midY = rect.y + rect.height / 2;\n let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);\n let parentElement = caretPosition.offsetNode?.parentElement;\n if (parentElement && parentElement !== element) {\n // There is an element on top of the one in the text layer, so we\n // need to hide all the elements (except the one in the text layer)\n // at this position in order to get the correct caret position.\n const elementsAtPoint = document.elementsFromPoint(caretX, midY);\n const savedVisibilities = [];\n for (const el of elementsAtPoint) {\n if (el === element) {\n break;\n }\n const { style } = el;\n savedVisibilities.push([el, style.visibility]);\n style.visibility = \"hidden\";\n }\n caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);\n parentElement = caretPosition.offsetNode?.parentElement;\n for (const [el, visibility] of savedVisibilities) {\n el.style.visibility = visibility;\n }\n }\n if (parentElement !== element) {\n // The element targeted by caretPositionFromPoint isn't in the text\n // layer.\n if (select) {\n selection.extend(element.firstChild, 0);\n } else {\n selection.setPosition(element.firstChild, 0);\n }\n return;\n }\n if (select) {\n selection.extend(caretPosition.offsetNode, caretPosition.offset);\n } else {\n selection.setPosition(caretPosition.offsetNode, caretPosition.offset);\n }\n }\n\n /**\n * Set the caret position or extend the selection (it depends on the select\n * parameter).\n * @param {boolean} select\n * @param {Selection} selection\n * @param {Element} newLineElement\n * @param {DOMRect} newLineElementRect\n * @param {number} caretX\n */\n #setCaretPosition(\n select,\n selection,\n newLineElement,\n newLineElementRect,\n caretX\n ) {\n if (this.#isVisible(newLineElementRect)) {\n this.#setCaretPositionHelper(\n selection,\n caretX,\n select,\n newLineElement,\n newLineElementRect\n );\n return;\n }\n this.#mainContainer.addEventListener(\n \"scrollend\",\n this.#setCaretPositionHelper.bind(\n this,\n selection,\n caretX,\n select,\n newLineElement,\n null\n ),\n { once: true }\n );\n newLineElement.scrollIntoView();\n }\n\n /**\n * Get the node on the next page.\n * @param {Element} textLayer\n * @param {boolean} isUp\n * @returns {Node}\n */\n #getNodeOnNextPage(textLayer, isUp) {\n while (true) {\n const page = textLayer.closest(\".page\");\n const pageNumber = parseInt(page.getAttribute(\"data-page-number\"));\n const nextPage = isUp ? pageNumber - 1 : pageNumber + 1;\n textLayer = this.#viewerContainer.querySelector(\n `.page[data-page-number=\"${nextPage}\"] .textLayer`\n );\n if (!textLayer) {\n return null;\n }\n const walker = document.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT);\n const node = isUp ? walker.lastChild() : walker.firstChild();\n if (node) {\n return node;\n }\n }\n }\n\n /**\n * Move the caret in the given direction.\n * @param {boolean} isUp\n * @param {boolean} select\n */\n moveCaret(isUp, select) {\n const selection = document.getSelection();\n if (selection.rangeCount === 0) {\n return;\n }\n const { focusNode } = selection;\n const focusElement =\n focusNode.nodeType !== Node.ELEMENT_NODE\n ? focusNode.parentElement\n : focusNode;\n const root = focusElement.closest(\".textLayer\");\n if (!root) {\n return;\n }\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n walker.currentNode = focusNode;\n\n // Move to the next element which is not on the same line as the focus\n // element.\n const focusRect = focusElement.getBoundingClientRect();\n let newLineElement = null;\n const nodeIterator = (\n isUp ? walker.previousSibling : walker.nextSibling\n ).bind(walker);\n while (nodeIterator()) {\n const element = walker.currentNode.parentElement;\n if (!this.#isOnSameLine(focusRect, element.getBoundingClientRect())) {\n newLineElement = element;\n break;\n }\n }\n\n if (!newLineElement) {\n // Need to find the next line on the next page.\n const node = this.#getNodeOnNextPage(root, isUp);\n if (!node) {\n return;\n }\n if (select) {\n const lastNode =\n (isUp ? walker.firstChild() : walker.lastChild()) || focusNode;\n selection.extend(lastNode, isUp ? 0 : lastNode.length);\n const range = document.createRange();\n range.setStart(node, isUp ? node.length : 0);\n range.setEnd(node, isUp ? node.length : 0);\n selection.addRange(range);\n return;\n }\n const [caretX] = this.#getCaretPosition(selection, isUp);\n const { parentElement } = node;\n this.#setCaretPosition(\n select,\n selection,\n parentElement,\n parentElement.getBoundingClientRect(),\n caretX\n );\n return;\n }\n\n // We've a candidate for the next line now we want to find the first element\n // which is under/over the caret.\n const [caretX, caretY] = this.#getCaretPosition(selection, isUp);\n const newLineElementRect = newLineElement.getBoundingClientRect();\n\n // Maybe the element on the new line is a valid candidate.\n if (this.#isUnderOver(newLineElementRect, caretX, caretY, isUp)) {\n this.#setCaretPosition(\n select,\n selection,\n newLineElement,\n newLineElementRect,\n caretX\n );\n return;\n }\n\n while (nodeIterator()) {\n // Search an element on the same line as newLineElement\n // which could be under/over the caret.\n const element = walker.currentNode.parentElement;\n const elementRect = element.getBoundingClientRect();\n if (!this.#isOnSameLine(newLineElementRect, elementRect)) {\n break;\n }\n if (this.#isUnderOver(elementRect, caretX, caretY, isUp)) {\n // We found the element.\n this.#setCaretPosition(select, selection, element, elementRect, caretX);\n return;\n }\n }\n\n // No element has been found so just put the caret on the element on the new\n // line.\n this.#setCaretPosition(\n select,\n selection,\n newLineElement,\n newLineElementRect,\n caretX\n );\n }\n}\n\nexport { CaretBrowsingMode };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./interfaces\").IDownloadManager} IDownloadManager */\n\nimport { createValidAbsoluteUrl, isPdfFile } from \"pdfjs-lib\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"CHROME || GENERIC\")) {\n throw new Error(\n 'Module \"pdfjs-web/download_manager\" shall not be used ' +\n \"outside CHROME and GENERIC builds.\"\n );\n}\n\nfunction download(blobUrl, filename) {\n const a = document.createElement(\"a\");\n if (!a.click) {\n throw new Error('DownloadManager: \"a.click()\" is not supported.');\n }\n a.href = blobUrl;\n a.target = \"_parent\";\n // Use a.download if available. This increases the likelihood that\n // the file is downloaded instead of opened by another PDF plugin.\n if (\"download\" in a) {\n a.download = filename;\n }\n // must be in the document for recent Firefox versions,\n // otherwise .click() is ignored.\n (document.body || document.documentElement).append(a);\n a.click();\n a.remove();\n}\n\n/**\n * @implements {IDownloadManager}\n */\nclass DownloadManager {\n #openBlobUrls = new WeakMap();\n\n downloadData(data, filename, contentType) {\n const blobUrl = URL.createObjectURL(\n new Blob([data], { type: contentType })\n );\n download(blobUrl, filename);\n }\n\n /**\n * @returns {boolean} Indicating if the data was opened.\n */\n openOrDownloadData(data, filename, dest = null) {\n const isPdfData = isPdfFile(filename);\n const contentType = isPdfData ? \"application/pdf\" : \"\";\n\n if (\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"COMPONENTS\")) &&\n isPdfData\n ) {\n let blobUrl = this.#openBlobUrls.get(data);\n if (!blobUrl) {\n blobUrl = URL.createObjectURL(new Blob([data], { type: contentType }));\n this.#openBlobUrls.set(data, blobUrl);\n }\n let viewerUrl;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // The current URL is the viewer, let's use it and append the file.\n viewerUrl = \"?file=\" + encodeURIComponent(blobUrl + \"#\" + filename);\n } else if (PDFJSDev.test(\"CHROME\")) {\n // In the Chrome extension, the URL is rewritten using the history API\n // in viewer.js, so an absolute URL must be generated.\n viewerUrl =\n // eslint-disable-next-line no-undef\n chrome.runtime.getURL(\"/content/web/viewer.html\") +\n \"?file=\" +\n encodeURIComponent(blobUrl + \"#\" + filename);\n }\n if (dest) {\n viewerUrl += `#${escape(dest)}`;\n }\n\n try {\n window.open(viewerUrl);\n return true;\n } catch (ex) {\n console.error(\"openOrDownloadData:\", ex);\n // Release the `blobUrl`, since opening it failed, and fallback to\n // downloading the PDF file.\n URL.revokeObjectURL(blobUrl);\n this.#openBlobUrls.delete(data);\n }\n }\n\n this.downloadData(data, filename, contentType);\n return false;\n }\n\n download(data, url, filename) {\n let blobUrl;\n if (data) {\n blobUrl = URL.createObjectURL(\n new Blob([data], { type: \"application/pdf\" })\n );\n } else {\n if (!createValidAbsoluteUrl(url, \"http://example.com\")) {\n console.error(`download - not a valid URL: ${url}`);\n return;\n }\n blobUrl = url + \"#pdfjs.action=download\";\n }\n download(blobUrl, filename);\n }\n}\n\nexport { DownloadManager };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu } from \"pdfjs-lib\";\n\nclass EditorUndoBar {\n #closeButton = null;\n\n #container;\n\n #eventBus = null;\n\n #focusTimeout = null;\n\n #initController = null;\n\n isOpen = false;\n\n #message;\n\n #showController = null;\n\n #undoButton;\n\n static #l10nMessages = Object.freeze({\n highlight: \"pdfjs-editor-undo-bar-message-highlight\",\n freetext: \"pdfjs-editor-undo-bar-message-freetext\",\n stamp: \"pdfjs-editor-undo-bar-message-stamp\",\n ink: \"pdfjs-editor-undo-bar-message-ink\",\n signature: \"pdfjs-editor-undo-bar-message-signature\",\n _multiple: \"pdfjs-editor-undo-bar-message-multiple\",\n });\n\n constructor({ container, message, undoButton, closeButton }, eventBus) {\n this.#container = container;\n this.#message = message;\n this.#undoButton = undoButton;\n this.#closeButton = closeButton;\n this.#eventBus = eventBus;\n }\n\n destroy() {\n this.#initController?.abort();\n this.#initController = null;\n\n this.hide();\n }\n\n show(undoAction, messageData) {\n if (!this.#initController) {\n this.#initController = new AbortController();\n const opts = { signal: this.#initController.signal };\n const boundHide = this.hide.bind(this);\n\n this.#container.addEventListener(\"contextmenu\", noContextMenu, opts);\n this.#closeButton.addEventListener(\"click\", boundHide, opts);\n this.#eventBus._on(\"beforeprint\", boundHide, opts);\n this.#eventBus._on(\"download\", boundHide, opts);\n }\n\n this.hide();\n\n if (typeof messageData === \"string\") {\n this.#message.setAttribute(\n \"data-l10n-id\",\n EditorUndoBar.#l10nMessages[messageData]\n );\n } else {\n this.#message.setAttribute(\n \"data-l10n-id\",\n EditorUndoBar.#l10nMessages._multiple\n );\n this.#message.setAttribute(\n \"data-l10n-args\",\n JSON.stringify({ count: messageData })\n );\n }\n this.isOpen = true;\n this.#container.hidden = false;\n\n this.#showController = new AbortController();\n\n this.#undoButton.addEventListener(\n \"click\",\n () => {\n undoAction();\n this.hide();\n },\n { signal: this.#showController.signal }\n );\n\n // Without the setTimeout, VoiceOver will read out the document title\n // instead of the popup label.\n this.#focusTimeout = setTimeout(() => {\n this.#container.focus();\n this.#focusTimeout = null;\n }, 100);\n }\n\n hide() {\n if (!this.isOpen) {\n return;\n }\n this.isOpen = false;\n this.#container.hidden = true;\n\n this.#showController?.abort();\n this.#showController = null;\n\n if (this.#focusTimeout) {\n clearTimeout(this.#focusTimeout);\n this.#focusTimeout = null;\n }\n }\n}\n\nexport { EditorUndoBar };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass OverlayManager {\n #overlays = new WeakMap();\n\n #active = null;\n\n get active() {\n return this.#active;\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @param {boolean} [canForceClose] - Indicates if opening the overlay closes\n * an active overlay. The default is `false`.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * registered.\n */\n async register(dialog, canForceClose = false) {\n if (typeof dialog !== \"object\") {\n throw new Error(\"Not enough parameters.\");\n } else if (this.#overlays.has(dialog)) {\n throw new Error(\"The overlay is already registered.\");\n }\n this.#overlays.set(dialog, { canForceClose });\n\n dialog.addEventListener(\"cancel\", ({ target }) => {\n if (this.#active === target) {\n this.#active = null;\n }\n });\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * opened.\n */\n async open(dialog) {\n if (!this.#overlays.has(dialog)) {\n throw new Error(\"The overlay does not exist.\");\n } else if (this.#active) {\n if (this.#active === dialog) {\n throw new Error(\"The overlay is already active.\");\n } else if (this.#overlays.get(dialog).canForceClose) {\n await this.close();\n } else {\n throw new Error(\"Another overlay is currently active.\");\n }\n }\n this.#active = dialog;\n dialog.showModal();\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * closed.\n */\n async close(dialog = this.#active) {\n if (!this.#overlays.has(dialog)) {\n throw new Error(\"The overlay does not exist.\");\n } else if (!this.#active) {\n throw new Error(\"The overlay is currently not active.\");\n } else if (this.#active !== dialog) {\n throw new Error(\"Another overlay is currently active.\");\n }\n dialog.close();\n this.#active = null;\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * closed.\n */\n async closeIfActive(dialog) {\n if (this.#active === dialog) {\n await this.close(dialog);\n }\n }\n}\n\nexport { OverlayManager };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./overlay_manager.js\").OverlayManager} OverlayManager */\n\nimport { PasswordResponses } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} PasswordPromptOptions\n * @property {HTMLDialogElement} dialog - The overlay's DOM element.\n * @property {HTMLParagraphElement} label - Label containing instructions for\n * entering the password.\n * @property {HTMLInputElement} input - Input field for entering the password.\n * @property {HTMLButtonElement} submitButton - Button for submitting the\n * password.\n * @property {HTMLButtonElement} cancelButton - Button for cancelling password\n * entry.\n */\n\nclass PasswordPrompt {\n #activeCapability = null;\n\n #updateCallback = null;\n\n #reason = null;\n\n /**\n * @param {PasswordPromptOptions} options\n * @param {OverlayManager} overlayManager - Manager for the viewer overlays.\n * @param {boolean} [isViewerEmbedded] - If the viewer is embedded, in e.g.\n * an + {{else}} {{.i18n.Tr "repo.file_view_raw"}} {{end}} diff --git a/templates/repo/view_list.tmpl b/templates/repo/view_list.tmpl index 0881ce99387..94f8dbfea4b 100644 --- a/templates/repo/view_list.tmpl +++ b/templates/repo/view_list.tmpl @@ -1,16 +1,16 @@ - +
    @@ -23,35 +23,32 @@ {{end}} - {{range $item := .Files}} - {{$entry := index $item 0}} - {{$commit := index $item 1}} + {{range .Files}} - {{if $entry.IsSubModule}} + {{if .Submodule}} {{else}} {{end}} - + {{end}}
    {{if .LatestCommitUser}} - - {{.LatestCommit.Author.Name}} + + {{.LatestCommit.Author.Name}} {{else}} {{.LatestCommit.Author.Name}} {{end}} - {{ShortSha .LatestCommit.ID.String}} - {{RenderCommitMessage false .LatestCommit.Summary .RepoLink $.Repository.ComposeMetas}} + {{ShortSHA1 .LatestCommit.ID.String}} + {{RenderCommitMessage false .LatestCommit.Summary .RepoLink $.Repository.ComposeMetas | Str2HTML}} ..
    - {{$refURL := $commit.RefURL AppUrl $.BranchLink}} - {{if $refURL}} - {{$entry.Name}} @ {{ShortSha $commit.RefID}} - {{else}} - {{$entry.Name}} @ {{ShortSha $commit.RefID}} - {{end}} + {{.Entry.Name}} {{if .Submodule.Commit}}@ {{ShortSHA1 .Submodule.Commit}}{{end}} - - {{$entry.Name}} + {{if .Entry.IsSymlink}} + + {{else}} + + {{end}} + {{.Entry.Name}} - {{ShortSha $commit.ID.String}} - {{RenderCommitMessage false $commit.Summary $.RepoLink $.Repository.ComposeMetas}} + {{ShortSHA1 .Commit.ID.String}} + {{RenderCommitMessage false .Commit.Summary $.RepoLink $.Repository.ComposeMetas | Str2HTML}} {{TimeSince $commit.Committer.When $.Lang}}{{TimeSince .Commit.Committer.When $.Lang}}
    -{{if .ReadmeExist}} +{{if and .ReadmeExist .IsTextFile}} {{template "repo/view_file" .}} {{end}} diff --git a/templates/repo/wiki/new.tmpl b/templates/repo/wiki/new.tmpl index af87e9c43d9..13ba3b9f00e 100644 --- a/templates/repo/wiki/new.tmpl +++ b/templates/repo/wiki/new.tmpl @@ -12,13 +12,13 @@ {{end}}
    - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}}
    - +
    diff --git a/templates/repo/wiki/view.tmpl b/templates/repo/wiki/view.tmpl index ff828789c81..f6020b94651 100644 --- a/templates/repo/wiki/view.tmpl +++ b/templates/repo/wiki/view.tmpl @@ -1,6 +1,7 @@ {{template "base/head" .}}
    {{template "repo/header" .}} + {{ $title := .title | Sanitize}}
    @@ -9,7 +10,7 @@
    {{.i18n.Tr "repo.wiki.page"}}: - {{.title}} + {{$title}}
    @@ -20,7 +21,7 @@
    @@ -29,15 +30,17 @@
    - + {{if not $.DisableHTTP}} + + {{end}} {{if not $.DisableSSH}} {{end}} - + @@ -45,21 +48,21 @@
    - {{.title}} + {{$title}} {{if and .IsRepositoryWriter (not .Repository.IsMirror)}} {{end}}
    {{$timeSince := TimeSince .Author.When $.Lang}} - {{.i18n.Tr "repo.wiki.last_commit_info" .Author.Name $timeSince | Safe}} + {{.i18n.Tr "repo.wiki.last_commit_info" (Sanitize .Author.Name) $timeSince | Safe}}
    -
    - {{.content | Str2html}} +
    + {{.content | Str2HTML}}
    @@ -70,7 +73,7 @@ {{.i18n.Tr "repo.wiki.delete_page_button"}}
    -

    {{.i18n.Tr "repo.wiki.delete_page_notice_1" .title | Safe}}

    +

    {{.i18n.Tr "repo.wiki.delete_page_notice_1" $title | Safe}}

    {{template "base/delete_modal_actions" .}} diff --git a/templates/status/404.tmpl b/templates/status/404.tmpl deleted file mode 100644 index 776f4fb78e9..00000000000 --- a/templates/status/404.tmpl +++ /dev/null @@ -1,9 +0,0 @@ -{{template "base/head" .}} -
    -

    404

    -
    -
    - {{if .ShowFooterVersion}}

    Application Version: {{AppVer}}

    {{end}} -

    If you think this is an error, please open an issue on GitHub.

    -
    -{{template "base/footer" .}} diff --git a/templates/status/500.tmpl b/templates/status/500.tmpl index fba069eeb1d..0bf11ab818a 100644 --- a/templates/status/500.tmpl +++ b/templates/status/500.tmpl @@ -1,9 +1,9 @@ {{template "base/head" .}}
    -

    500

    +

    500


    {{if .ErrorMsg}}

    An error has occurred : {{.ErrorMsg}}

    {{end}} - {{if .ShowFooterVersion}}

    Application Version: {{AppVer}}

    {{end}} + {{if .IsAdmin}}

    Application Version: {{AppVer}}

    {{end}}
    {{template "base/footer" .}} diff --git a/templates/user/auth/activate.tmpl b/templates/user/auth/activate.tmpl index 8bff54aaf4d..efcce9841a1 100644 --- a/templates/user/auth/activate.tmpl +++ b/templates/user/auth/activate.tmpl @@ -2,8 +2,8 @@
    - - {{.CsrfTokenHtml}} + + {{.CSRFTokenHTML}}

    {{.i18n.Tr "auth.active_your_account"}}

    @@ -15,15 +15,15 @@ {{else if .ResendLimited}}

    {{.i18n.Tr "auth.resent_limit_prompt"}}

    {{else}} -

    {{.i18n.Tr "auth.confirmation_mail_sent_prompt" .SignedUser.Email .Hours | Str2html}}

    +

    {{.i18n.Tr "auth.confirmation_mail_sent_prompt" .LoggedUser.Email .Hours | Str2HTML}}

    {{end}} {{else}} {{if .IsSendRegisterMail}} -

    {{.i18n.Tr "auth.confirmation_mail_sent_prompt" .Email .Hours | Str2html}}

    +

    {{.i18n.Tr "auth.confirmation_mail_sent_prompt" .Email .Hours | Str2HTML}}

    {{else if .IsActivateFailed}}

    {{.i18n.Tr "auth.invalid_code"}}

    {{else}} -

    {{.i18n.Tr "auth.has_unconfirmed_mail" .SignedUser.Name .SignedUser.Email | Str2html}}

    +

    {{.i18n.Tr "auth.has_unconfirmed_mail" .LoggedUser.Name .LoggedUser.Email | Str2HTML}}

    diff --git a/templates/user/auth/forgot_passwd.tmpl b/templates/user/auth/forgot_passwd.tmpl index f1c25df503d..9fada7fe34c 100644 --- a/templates/user/auth/forgot_passwd.tmpl +++ b/templates/user/auth/forgot_passwd.tmpl @@ -3,14 +3,14 @@
    - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}}

    {{.i18n.Tr "auth.forgot_password"}}

    {{template "base/alert" .}} {{if .IsResetSent}} -

    {{.i18n.Tr "auth.confirmation_mail_sent_prompt" .Email .Hours | Str2html}}

    +

    {{.i18n.Tr "auth.confirmation_mail_sent_prompt" .Email .Hours | Str2HTML}}

    {{else if .IsResetRequest}}
    diff --git a/templates/user/auth/reset_passwd.tmpl b/templates/user/auth/reset_passwd.tmpl index cb124f5b25f..801679e8c5a 100644 --- a/templates/user/auth/reset_passwd.tmpl +++ b/templates/user/auth/reset_passwd.tmpl @@ -3,7 +3,7 @@
    - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}}

    {{.i18n.Tr "auth.reset_password"}} diff --git a/templates/user/auth/signin.tmpl b/templates/user/auth/signin.tmpl deleted file mode 100644 index b928f2bdb59..00000000000 --- a/templates/user/auth/signin.tmpl +++ /dev/null @@ -1,44 +0,0 @@ -{{template "base/head" .}} - -{{template "base/footer" .}} diff --git a/templates/user/auth/signup.tmpl b/templates/user/auth/signup.tmpl index 86c020d6bbe..d8e956a00d7 100644 --- a/templates/user/auth/signup.tmpl +++ b/templates/user/auth/signup.tmpl @@ -3,9 +3,9 @@
    - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}}

    - {{if .IsSocialLogin}}{{.i18n.Tr "social_sign_in" | Str2html}}{{else}}{{.i18n.Tr "sign_up"}}{{end}} + {{.i18n.Tr "sign_up"}}

    {{template "base/alert" .}} @@ -45,7 +45,7 @@
    {{end}}
    diff --git a/templates/user/dashboard/dashboard.tmpl b/templates/user/dashboard/dashboard.tmpl index d2343972694..14af4a84d00 100644 --- a/templates/user/dashboard/dashboard.tmpl +++ b/templates/user/dashboard/dashboard.tmpl @@ -5,6 +5,9 @@
    {{template "user/dashboard/feeds" .}} + {{if .AfterID}} + + {{end}}
    -

    - {{.i18n.Tr "home.my_repos"}} {{.ContextUser.NumRepos}} +
    + {{.i18n.Tr "home.my_repos"}} {{.RepoCount}} -

    +
    @@ -53,7 +56,7 @@

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

    {{.i18n.Tr "settings.new_token_desc"}}

    diff --git a/templates/user/settings/avatar.tmpl b/templates/user/settings/avatar.tmpl index 93286c49577..1d7a0e4d8de 100644 --- a/templates/user/settings/avatar.tmpl +++ b/templates/user/settings/avatar.tmpl @@ -9,30 +9,29 @@ {{.i18n.Tr "settings.avatar"}}
    - - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}} {{if not DisableGravatar}}
    - +
    -
    +
    - +
    {{end}}
    - +
    -
    +
    diff --git a/templates/user/settings/delete.tmpl b/templates/user/settings/delete.tmpl index b95eb2105f1..d0ebb9bc07c 100644 --- a/templates/user/settings/delete.tmpl +++ b/templates/user/settings/delete.tmpl @@ -10,12 +10,12 @@
    -

    {{.i18n.Tr "settings.delete_prompt" | Str2html}}

    +

    {{.i18n.Tr "settings.delete_prompt" | Str2HTML}}

    - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}} -
    +
    diff --git a/templates/user/settings/email.tmpl b/templates/user/settings/email.tmpl index 558145302f3..dc137ed6d0c 100644 --- a/templates/user/settings/email.tmpl +++ b/templates/user/settings/email.tmpl @@ -17,20 +17,20 @@
    {{.Email}} - {{if .IsPrimary}}{{$.i18n.Tr "settings.primary"}}{{end}} + {{if .IsPrimary}}{{$.i18n.Tr "settings.primary"}}{{end}} {{if not .IsPrimary}}
    -
    {{if .IsActivated}} -
    +
    - {{$.CsrfTokenHtml}} + {{$.CSRFTokenHTML}} - - + +
    {{end}} @@ -42,7 +42,7 @@
    - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}}
    diff --git a/templates/user/settings/navbar.tmpl b/templates/user/settings/navbar.tmpl index 5166bafaba5..ec1205c27c7 100644 --- a/templates/user/settings/navbar.tmpl +++ b/templates/user/settings/navbar.tmpl @@ -1,25 +1,34 @@
    diff --git a/templates/user/settings/organizations.tmpl b/templates/user/settings/organizations.tmpl new file mode 100644 index 00000000000..e376e079b8d --- /dev/null +++ b/templates/user/settings/organizations.tmpl @@ -0,0 +1,50 @@ +{{template "base/head" .}} +
    +
    +
    + {{template "user/settings/navbar" .}} +
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "settings.orgs"}} + +

    +
    + {{if .Orgs}} +
    + {{range .Orgs}} +
    +
    + +
    + +
    + {{.Name}} +
    +
    + {{end}} +
    + {{else}} + {{.i18n.Tr "settings.orgs.none"}} + {{end}} +
    +
    +
    +
    +
    + + +{{template "base/footer" .}} diff --git a/templates/user/settings/password.tmpl b/templates/user/settings/password.tmpl index 644f4f93165..acab4958448 100644 --- a/templates/user/settings/password.tmpl +++ b/templates/user/settings/password.tmpl @@ -9,9 +9,9 @@ {{.i18n.Tr "settings.change_password"}}
    - {{if .SignedUser.IsLocal}} + {{if .LoggedUser.IsLocal}} - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}}
    diff --git a/templates/user/settings/profile.tmpl b/templates/user/settings/profile.tmpl index a42d9c49c3d..cc1eeb1748e 100644 --- a/templates/user/settings/profile.tmpl +++ b/templates/user/settings/profile.tmpl @@ -11,36 +11,31 @@

    {{.i18n.Tr "settings.profile_desc"}}

    - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}}
    - - - {{if not .SignedUser.IsLocal}} + + + {{if not .LoggedUser.IsLocal}}

    {{$.i18n.Tr "settings.password_username_disabled"}}

    {{end}}
    - -
    -
    - - +
    - +
    - +
    -
    diff --git a/templates/user/settings/repositories.tmpl b/templates/user/settings/repositories.tmpl new file mode 100644 index 00000000000..6500d1494fb --- /dev/null +++ b/templates/user/settings/repositories.tmpl @@ -0,0 +1,54 @@ +{{template "base/head" .}} +
    +
    +
    + {{template "user/settings/navbar" .}} +
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "settings.repos"}} +

    + +
    +
    + {{range .Repos}} +
    + + {{if .IsPrivate}} + + {{else if .IsFork}} + + {{else if .IsMirror}} + + {{else}} + + {{end}} + + + {{.Owner.Name}}/{{.Name}} + + {{.Size | FileSize}} + {{if not (eq .OwnerID $.LoggedUserID)}} + + {{end}} +
    + {{end}} +
    +
    +
    +
    +
    +
    + + +{{template "base/footer" .}} diff --git a/templates/user/settings/security.tmpl b/templates/user/settings/security.tmpl new file mode 100644 index 00000000000..d14ed315757 --- /dev/null +++ b/templates/user/settings/security.tmpl @@ -0,0 +1,53 @@ +{{template "base/head" .}} +
    +
    +
    + {{template "user/settings/navbar" .}} +
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "settings.two_factor"}} +

    +
    +

    + {{.i18n.Tr "settings.two_factor_status"}} + {{if .TwoFactor}} + {{.i18n.Tr "settings.two_factor_on"}} + + {{else}} + {{.i18n.Tr "settings.two_factor_off"}} + {{.i18n.Tr "settings.two_factor_enable"}} + {{end}} +

    +
    + {{if .TwoFactor}} +
    +

    {{.i18n.Tr "settings.two_factor_view_recovery_codes" AppSubURL "/user/settings/security/two_factor_recovery_codes" | Safe}}

    +

    {{.i18n.Tr "settings.two_factor_http" AppSubURL "/user/settings/applications" "https://{token}:x-access-token@try.gogs.io/user/repo.git" | Safe}}

    +

    {{.i18n.Tr "settings.access_token_tips"}}

    + {{end}} +
    +
    +
    +
    + + +{{template "base/footer" .}} diff --git a/templates/user/settings/sshkeys.tmpl b/templates/user/settings/sshkeys.tmpl index 33426fdc56a..0ff32c8fc1a 100644 --- a/templates/user/settings/sshkeys.tmpl +++ b/templates/user/settings/sshkeys.tmpl @@ -24,7 +24,7 @@
    -
    +
    {{.Name}}
    {{.Fingerprint}} @@ -33,8 +33,8 @@ {{$.i18n.Tr "settings.add_on"}} {{DateFmtShort .Created}} {{if .HasUsed}}{{$.i18n.Tr "settings.last_used"}} {{DateFmtShort .Updated}}{{else}}{{$.i18n.Tr "settings.no_activity"}}{{end}}
    -
    -
    @@ -43,14 +43,14 @@

    -

    {{.i18n.Tr "settings.ssh_helper" "https://help.github.com/articles/generating-ssh-keys" "https://help.github.com/ssh-issues/" | Str2html}}

    +

    {{.i18n.Tr "settings.ssh_helper" "https://help.github.com/articles/generating-ssh-keys" "https://help.github.com/ssh-issues/" | Str2HTML}}

    {{.i18n.Tr "settings.add_new_key"}}

    - {{.CsrfTokenHtml}} + {{.CSRFTokenHTML}}
    diff --git a/templates/user/settings/two_factor_enable.tmpl b/templates/user/settings/two_factor_enable.tmpl new file mode 100644 index 00000000000..aa551acad70 --- /dev/null +++ b/templates/user/settings/two_factor_enable.tmpl @@ -0,0 +1,28 @@ +{{template "base/head" .}} +
    +
    +
    + {{template "user/settings/navbar" .}} +
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "settings.two_factor_enable_title"}} +

    +
    +
    {{.i18n.Tr "settings.two_factor_scan_qr"}}
    + {{.TwoFactorSecret}} +

    {{.i18n.Tr "settings.two_factor_or_enter_secret"}} {{.TwoFactorSecret}}

    + + {{.CSRFTokenHTML}} +
    + {{.i18n.Tr "settings.two_factor_then_enter_passcode"}} + +
    + + +
    +
    +
    +
    +
    +{{template "base/footer" .}} \ No newline at end of file diff --git a/templates/user/settings/two_factor_recovery_codes.tmpl b/templates/user/settings/two_factor_recovery_codes.tmpl new file mode 100644 index 00000000000..5177cf8aff1 --- /dev/null +++ b/templates/user/settings/two_factor_recovery_codes.tmpl @@ -0,0 +1,36 @@ +{{template "base/head" .}} +
    +
    +
    + {{template "user/settings/navbar" .}} +
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "settings.two_factor_recovery_codes_title"}} +

    +
    +

    {{.i18n.Tr "settings.two_factor_recovery_codes_desc" | Safe}}

    +
      + {{range .RecoveryCodes}} +
    • + + {{if .IsUsed}} + {{.Code}} + {{else}} + {{.Code}} + {{end}} + +
    • + {{end}} +
    + +
    + {{.CSRFTokenHTML}} + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} \ No newline at end of file diff --git a/trivy.yaml b/trivy.yaml new file mode 100644 index 00000000000..273ff104f6a --- /dev/null +++ b/trivy.yaml @@ -0,0 +1,16 @@ +scan: + skip-files: + - "usr/sbin/gosu" # CVE patching is far behind and out of our control. + - "app/gogs/gogs" # False positives on main builds + +severity: + - CRITICAL + - HIGH + +vulnerability: + ignore-unfixed: true + type: + - os + - library + +format: "table" diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 00000000000..53ceb37d227 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,2 @@ +*.tsbuildinfo +.vite diff --git a/web/.prettierrc.js b/web/.prettierrc.js new file mode 100644 index 00000000000..5967f514883 --- /dev/null +++ b/web/.prettierrc.js @@ -0,0 +1,12 @@ +/** @type {import("prettier").Config} */ +export default { + useTabs: false, + tabWidth: 2, + singleQuote: false, + trailingComma: "all", + printWidth: 120, + plugins: ["@trivago/prettier-plugin-sort-imports"], + importOrder: ["", "", "^@/(.+)", "^[./]"], + importOrderSeparation: true, + importOrderSortSpecifiers: true, +}; diff --git a/web/DESIGN.md b/web/DESIGN.md new file mode 100644 index 00000000000..37e8af8dfc6 --- /dev/null +++ b/web/DESIGN.md @@ -0,0 +1,89 @@ +# Gogs web design notes + +A running record of design decisions made for the web frontend. Add an entry when a pattern is used in two places, or when a question caused a redo. Don't write aspirationally. Only capture what's already true in the code. + +## Typography + +Self-hosted via `@fontsource-variable`: + +- **Sans**: Geist Variable, with PingFang SC and Microsoft YaHei as CJK fallbacks. Used for body text, headings, and UI chrome. +- **Mono**: Geist Mono Variable, with the same CJK fallbacks. Used for code-shaped content (SHA, branch name, file path, shell command, terminal-style surfaces). + +The browser does per-glyph fallback via the font-family stack. Latin characters render in Geist (the designed personality). CJK characters render in the next available system font (PingFang SC, Microsoft YaHei). The result: English looks distinctively Gogs, other scripts look clean and native. + +Use mono only for content that **is** code, not for UI chrome (navbars, buttons, labels). Mono CJK fallbacks aren't truly monospace (CJK glyphs are wider than Latin), which is fine when the content is genuinely code, but reads as broken alignment if used decoratively for chrome. + +Don't mix sans and mono within the same UI surface for arbitrary reasons. If a component is showing code, all of it goes mono. + +## Color hierarchy + +Palettes are adapted from [Pierre Theme](https://github.com/pierrecomputer/theme)'s "Light" and "Dark" (non-soft) variants. The dark-mode input background is bumped slightly above Pierre's value (`#262626` instead of `#1d1d1d`) so form fields read as edged elements outside an IDE panel context. Dark mode is opt-in via the `.dark` class on `:root` (see `lib/theme.ts`), not media-query driven, so the user's stored preference always wins. The `@custom-variant dark` rule in `index.css` lets utilities like `dark:...` target the same class. + +Use these tokens. Don't introduce raw hex values in components. + +**Surfaces and content** + +- `--color-background`: page background. Body uses this by default. +- `--color-foreground`: primary content. Headings, active states, the main label of any item, body text on `--color-background`. +- `--color-muted-foreground`: secondary content. Metadata, helper text, terminal prompt characters, footer chrome, inactive items in a toggle group. +- `--color-surface`: subtle raised surface. Used for hover backgrounds (`hover:bg-(--color-surface)` on links, buttons, menu rows) and for the muted fill of the faux-terminal frame. +- `--color-card` / `--color-card-foreground`: card surface and its body text. Not currently used in components, but available for content cards. +- `--color-popover` / `--color-popover-foreground`: popover surface and body. Used by the Radix popover primitive. + +**Accents and state** + +- `--color-primary` / `--color-primary-foreground`: brand blue (`#009fff` in both modes). Reserved for genuine brand emphasis. Don't use it to mean "primary action" between two peer links (see the peer-item rule below). Note: white-on-primary contrast is 2.84:1, which is below WCAG AA in both modes since the token is identical light and dark. Avoid using primary as a fill for body-sized text. Use it for chrome accents, ring/focus, and large CTAs only. +- `--color-secondary` / `--color-secondary-foreground`: neutral support fill. Available for chips, tags, low-emphasis fills. +- `--color-destructive` / `--color-destructive-foreground`: error and danger. The 404 page uses `text-(--color-destructive)` on the `fatal:` token, always paired with the word itself (color is never the sole signal). +- `--color-ring`: keyboard focus ring color. Don't override per-component. If a default ring looks wrong, fix it at the token level. + +**Structure** + +- `--color-border`: soft container and divider lines. Used for the navbar bottom border, popover edges, card outlines, mobile-menu separators. Deliberately low-contrast (close to `--color-secondary`) so chrome reads as quiet boundary, not as a hard rule. +- `--color-input`: input field borders. Similar weight to `--color-border` but kept as a separate token so form fields can drift independently if needed. + +**The terminal frame is the exception.** `NotFound.tsx` wraps its faux-CLI output in a heavy outline so it actually looks like a terminal window — that frame uses `border-(--color-foreground)/80` (light) and the regular `--color-border` token (dark) directly, instead of the shared chrome token. Don't reuse this heavy outline elsewhere. If you need to introduce another heavy outline, promote a `--color-frame` token rather than inlining `--color-foreground`. + +**Peer-item rule** + +Don't use foreground vs muted-foreground to imply "primary action" vs "secondary action" between two peer items (e.g. Sign in vs Register). Peer items get the same color. Differentiation comes from positioning, weight, or affordance, not arbitrary contrast. Active vs inactive _states_ of the same control (e.g. the selected theme tile in `SettingsMenu`) are a different case and may use the foreground/muted-foreground split to communicate selection. + +**Ad-hoc colors** + +The traffic-light cluster in the faux-terminal frame uses one ad-hoc value: the amber dot falls back to `oklch(0.795 0.184 86.047)` via `bg-(--color-warning,...)`. There is no `--color-warning` token defined, so the fallback always wins. This is deliberate. Promoting it to a real token would invite reuse, and warning is not a system-wide concern in the current UI. Leave it inline until a second site needs warning semantics, then define the token in both light and dark palettes. + +## Surface chrome + +The 404 page wraps its content in a faux-terminal frame (rounded border, traffic-light dots, monospace body). Reuse the same frame for any page that represents a Git/CLI state: error pages, command-output stubs, raw diff fallbacks. Don't reuse it for normal content pages. + +Strings rendered inside a terminal frame stay in English across all locales, regardless of the active UI language. Real CLI output (`git`, `ls`, `cat`, etc.) doesn't localize. Faux-CLI that does loses authenticity and reads as a translated error page in a costume. Translate the surrounding prose (headings, descriptions, CTAs), but leave command names, prompts, error tokens like `fatal:`, and command output strings untouched. + +## File naming + +Two conventions coexist in `web/src/`: + +- **shadcn primitives** in `components/ui/` use **lowercase** filenames (`popover.tsx`). This matches the `shadcn` CLI output and lets dropped-in components stay byte-identical to upstream. +- **App components** anywhere else use **PascalCase** matching the exported component (`Footer.tsx`, `SettingsMenu.tsx`, `Landing.tsx`). This is the React community default. + +Library modules in `lib/` are plain `.ts` files in lowercase (`i18n.ts`, `theme.ts`, `utils.ts`). + +## Forms + +Disable the entire form while a submit is in flight, not just the submit button. Wrap the body in `
    ` — native `disabled` propagates to every nested input and button. + +Anchor links inside the form aren't covered by `disabled`. For each, set `tabIndex={submitting ? -1 : N}`, `aria-disabled={submitting || undefined}`, `className={submitting ? "pointer-events-none opacity-50" : undefined}`, and an `onClick` that calls `e.preventDefault()` when submitting. + +Swap the submit label to a present-continuous string ("Signing in…", "Verifying…") while submitting. Keep idle and active strings as separate locale keys. + +## Accessibility + +WCAG 2.2 AA is the floor. Apply these patterns in components: + +- **Icon-only buttons need an accessible name.** Set `aria-label` on every button or link whose visible content is purely a glyph (settings cog, hamburger, social icons in the footer, language switcher trigger). The label is the action, not the icon name (`aria-label="Settings"`, not `"Cog icon"`). +- **Decorative icons inside a labeled control** get `aria-hidden`. If the button already has visible text or a sibling label, mark the SVG `aria-hidden` so screen readers don't double-announce. +- **Interactive states must be reachable by keyboard.** Anything that handles `onClick` must also be focusable (use a ` + + + + ) : ( + <> + setOpen(false)}> + {t("home")} + + setOpen(false)}> + {t("explore")} + + setOpen(false)}> + {t("help")} + +
  • + setOpen(false)}> + {t("sign_in")} + + setOpen(false)}> + {t("register")} + + + )} + + + +
  • + + + ); +} + +function CreateMenu({ canCreateOrganization }: { canCreateOrganization: boolean }) { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + return ( + + + + + + e.preventDefault()}> + } onSelect={() => setOpen(false)}> + {t("new_repo")} + + } onSelect={() => setOpen(false)}> + {t("new_migrate")} + + {canCreateOrganization && ( + } + onSelect={() => setOpen(false)} + > + {t("new_org")} + + )} + + + ); +} + +function UserMenu({ user }: { user: UserInfo }) { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + return ( + + + {user.avatarURL ? ( + + ) : ( + + )} + + + e.preventDefault()}> +
    + {t("signed_in_as")} {user.username} +
    +
    + } + onSelect={() => setOpen(false)} + > + {t("your_profile")} + + } + onSelect={() => setOpen(false)} + > + {t("your_settings")} + + } + onSelect={() => setOpen(false)} + > + {t("help")} + + {user.isAdmin && ( + <> +
    + } + onSelect={() => setOpen(false)} + > + {t("admin_panel")} + + + )} +
    + + + + + + ); +} + +function MenuLink({ + href, + external, + icon, + onSelect, + children, +}: { + href: string; + external?: boolean; + icon?: React.ReactNode; + onSelect?: () => void; + children: React.ReactNode; +}) { + return ( + + {icon} + {children} + + ); +} + +function NavLink({ + href, + external, + spa, + children, +}: { + href: string; + external?: boolean; + spa?: boolean; + children: React.ReactNode; +}) { + const className = "inline-flex rounded-md px-3 py-1.5 text-(--color-foreground) hover:bg-(--color-surface)"; + if (spa) { + return ( + + {children} + + ); + } + return ( + + {children} + + ); +} + +function SignOutForm({ children }: { children: React.ReactNode }) { + return ( +
    { + event.preventDefault(); + void signOut(); + }} + > + {children} +
    + ); +} + +async function signOut() { + try { + await fetch(subUrl("/api/web/user/sign-out"), { + method: "POST", + credentials: "same-origin", + }); + } catch (err) { + console.error("signOut: request failed", err); + } + window.location.assign(subUrl("/")); +} + +function MobileLink({ + href, + external, + spa, + onClick, + children, +}: { + href: string; + external?: boolean; + spa?: boolean; + onClick?: () => void; + children: React.ReactNode; +}) { + const className = "flex w-full rounded-sm px-2 py-1.5 text-(--color-foreground) hover:bg-(--color-surface)"; + return ( +
  • + {spa ? ( + + {children} + + ) : ( + + {children} + + )} +
  • + ); +} diff --git a/web/src/components/SettingsMenu.tsx b/web/src/components/SettingsMenu.tsx new file mode 100644 index 00000000000..e0f3145199b --- /dev/null +++ b/web/src/components/SettingsMenu.tsx @@ -0,0 +1,118 @@ +import { Check, Monitor, Moon, Settings, Sun } from "lucide-react"; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; +import { webContext } from "@/lib/context"; +import { type Theme, useTheme } from "@/lib/theme"; +import { cn } from "@/lib/utils"; + +const LANGUAGES: { code: string; name: string }[] = [ + { code: "en-US", name: "English" }, + { code: "zh-CN", name: "简体中文" }, + { code: "zh-HK", name: "繁體中文(香港)" }, + { code: "zh-TW", name: "繁體中文(臺灣)" }, + { code: "de-DE", name: "Deutsch" }, + { code: "fr-FR", name: "français" }, + { code: "nl-NL", name: "Nederlands" }, + { code: "lv-LV", name: "latviešu" }, + { code: "ru-RU", name: "русский" }, + { code: "ja-JP", name: "日本語" }, + { code: "es-ES", name: "español" }, + { code: "pt-BR", name: "português do Brasil" }, + { code: "pl-PL", name: "polski" }, + { code: "bg-BG", name: "български" }, + { code: "it-IT", name: "italiano" }, + { code: "fi-FI", name: "suomi" }, + { code: "tr-TR", name: "Türkçe" }, + { code: "cs-CZ", name: "čeština" }, + { code: "sr-SP", name: "српски" }, + { code: "sv-SE", name: "svenska" }, + { code: "ko-KR", name: "한국어" }, + { code: "gl-ES", name: "galego" }, + { code: "uk-UA", name: "українська" }, + { code: "en-GB", name: "English (United Kingdom)" }, + { code: "hu-HU", name: "Magyar" }, + { code: "sk-SK", name: "Slovenčina" }, + { code: "id-ID", name: "Indonesian" }, + { code: "fa-IR", name: "Persian" }, + { code: "vi-VN", name: "Vietnamese" }, + { code: "pt-PT", name: "Português" }, + { code: "mn-MN", name: "Монгол" }, + { code: "ro-RO", name: "Română" }, +]; + +export function SettingsMenu() { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + const [currentLang] = useState(() => webContext.lang); + const { theme, setTheme } = useTheme(); + + return ( + + + + + e.preventDefault()}> +
    {t("theme")}
    +
    + v && setTheme(v as Theme)} + size="tile" + className="grid grid-cols-3 gap-1" + > + + + {t("theme_light")} + + + + {t("theme_dark")} + + + + {t("theme_system")} + + +
    + +
    + +
    {t("language")}
    +
      + {LANGUAGES.map((lang) => { + const isActive = lang.code === currentLang; + return ( +
    • + +
    • + ); + })} +
    + + + ); +} diff --git a/web/src/components/UserInfoProvider.tsx b/web/src/components/UserInfoProvider.tsx new file mode 100644 index 00000000000..e1a98bd003e --- /dev/null +++ b/web/src/components/UserInfoProvider.tsx @@ -0,0 +1,8 @@ +import type { ReactNode } from "react"; + +import type { UserInfo } from "@/lib/user-info"; +import { UserInfoContext } from "@/lib/user-info-context"; + +export function UserInfoProvider({ value, children }: { value: UserInfo | null; children: ReactNode }) { + return {children}; +} diff --git a/web/src/components/ui/button-variants.ts b/web/src/components/ui/button-variants.ts new file mode 100644 index 00000000000..8a90ed4d131 --- /dev/null +++ b/web/src/components/ui/button-variants.ts @@ -0,0 +1,27 @@ +import { cva } from "class-variance-authority"; + +export const buttonVariants = cva( + "inline-flex cursor-pointer items-center justify-center gap-2 rounded-md text-sm font-medium outline-none transition-colors focus-visible:ring-1 focus-visible:ring-(--color-ring) disabled:pointer-events-none disabled:opacity-60", + { + variants: { + variant: { + default: "bg-(--color-primary) text-(--color-primary-foreground) hover:opacity-90", + outline: + "border border-(--color-input) bg-(--color-background) text-(--color-foreground) hover:bg-(--color-surface)", + ghost: "text-(--color-foreground) hover:bg-(--color-surface)", + link: "text-(--color-foreground) underline-offset-4 hover:underline", + destructive: "bg-(--color-destructive) text-(--color-destructive-foreground) hover:opacity-90", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-8 px-3", + icon: "size-9", + inline: "h-auto p-0", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); diff --git a/web/src/components/ui/button.tsx b/web/src/components/ui/button.tsx new file mode 100644 index 00000000000..7c0887f58d1 --- /dev/null +++ b/web/src/components/ui/button.tsx @@ -0,0 +1,20 @@ +import { Slot } from "@radix-ui/react-slot"; +import { type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +import { buttonVariants } from "@/components/ui/button-variants"; +import { cn } from "@/lib/utils"; + +interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ; + }, +); +Button.displayName = "Button"; + +export { Button }; diff --git a/web/src/components/ui/card.tsx b/web/src/components/ui/card.tsx new file mode 100644 index 00000000000..2ca228ef442 --- /dev/null +++ b/web/src/components/ui/card.tsx @@ -0,0 +1,50 @@ +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Card = React.forwardRef>(({ className, ...props }, ref) => ( +
    +)); +Card.displayName = "Card"; + +const CardHeader = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + ), +); +CardHeader.displayName = "CardHeader"; + +const CardTitle = React.forwardRef>( + ({ className, ...props }, ref) => ( +

    + ), +); +CardTitle.displayName = "CardTitle"; + +const CardDescription = React.forwardRef>( + ({ className, ...props }, ref) => ( +

    + ), +); +CardDescription.displayName = "CardDescription"; + +const CardContent = React.forwardRef>( + ({ className, ...props }, ref) =>

    , +); +CardContent.displayName = "CardContent"; + +const CardFooter = React.forwardRef>( + ({ className, ...props }, ref) => ( +
    + ), +); +CardFooter.displayName = "CardFooter"; + +export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }; diff --git a/web/src/components/ui/checkbox.tsx b/web/src/components/ui/checkbox.tsx new file mode 100644 index 00000000000..194b53ecbac --- /dev/null +++ b/web/src/components/ui/checkbox.tsx @@ -0,0 +1,29 @@ +import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; +import { Check } from "lucide-react"; +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)); +Checkbox.displayName = CheckboxPrimitive.Root.displayName; + +export { Checkbox }; diff --git a/web/src/components/ui/input.tsx b/web/src/components/ui/input.tsx new file mode 100644 index 00000000000..f0eacc82a57 --- /dev/null +++ b/web/src/components/ui/input.tsx @@ -0,0 +1,23 @@ +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Input = React.forwardRef>( + ({ className, type, ...props }, ref) => ( + + ), +); +Input.displayName = "Input"; + +export { Input }; diff --git a/web/src/components/ui/label.tsx b/web/src/components/ui/label.tsx new file mode 100644 index 00000000000..97da8d49cb8 --- /dev/null +++ b/web/src/components/ui/label.tsx @@ -0,0 +1,21 @@ +import * as LabelPrimitive from "@radix-ui/react-label"; +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Label.displayName = LabelPrimitive.Root.displayName; + +export { Label }; diff --git a/web/src/components/ui/popover.tsx b/web/src/components/ui/popover.tsx new file mode 100644 index 00000000000..115b6da9da5 --- /dev/null +++ b/web/src/components/ui/popover.tsx @@ -0,0 +1,30 @@ +import * as PopoverPrimitive from "@radix-ui/react-popover"; +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Popover = PopoverPrimitive.Root; +const PopoverTrigger = PopoverPrimitive.Trigger; +const PopoverAnchor = PopoverPrimitive.Anchor; + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)); +PopoverContent.displayName = PopoverPrimitive.Content.displayName; + +export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger }; diff --git a/web/src/components/ui/select.tsx b/web/src/components/ui/select.tsx new file mode 100644 index 00000000000..673cccd9178 --- /dev/null +++ b/web/src/components/ui/select.tsx @@ -0,0 +1,79 @@ +import * as SelectPrimitive from "@radix-ui/react-select"; +import { Check, ChevronDown } from "lucide-react"; +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Select = SelectPrimitive.Root; +const SelectGroup = SelectPrimitive.Group; +const SelectValue = SelectPrimitive.Value; + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + + + + +)); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + {children} + + +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; + +export { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue }; diff --git a/web/src/components/ui/toggle-group.tsx b/web/src/components/ui/toggle-group.tsx new file mode 100644 index 00000000000..f03e4b1ab16 --- /dev/null +++ b/web/src/components/ui/toggle-group.tsx @@ -0,0 +1,48 @@ +import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group"; +import { type VariantProps } from "class-variance-authority"; +import * as React from "react"; + +import { toggleVariants } from "@/components/ui/toggle-variants"; +import { cn } from "@/lib/utils"; + +type ToggleVariantProps = VariantProps; + +const ToggleGroupContext = React.createContext({ + variant: "default", + size: "default", +}); + +const ToggleGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & ToggleVariantProps +>(({ className, variant, size, children, ...props }, ref) => ( + + {children} + +)); +ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName; + +const ToggleGroupItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & ToggleVariantProps +>(({ className, children, variant, size, ...props }, ref) => { + const context = React.useContext(ToggleGroupContext); + return ( + + {children} + + ); +}); +ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName; + +export { ToggleGroup, ToggleGroupItem }; diff --git a/web/src/components/ui/toggle-variants.ts b/web/src/components/ui/toggle-variants.ts new file mode 100644 index 00000000000..f5a60f6da36 --- /dev/null +++ b/web/src/components/ui/toggle-variants.ts @@ -0,0 +1,23 @@ +import { cva } from "class-variance-authority"; + +export const toggleVariants = cva( + "inline-flex cursor-pointer items-center justify-center gap-1 rounded-md text-sm font-medium text-(--color-muted-foreground) outline-none transition-colors hover:bg-(--color-surface) hover:text-(--color-foreground) focus-visible:ring-1 focus-visible:ring-(--color-ring) disabled:pointer-events-none disabled:opacity-60 data-[state=on]:bg-(--color-surface) data-[state=on]:text-(--color-foreground)", + { + variants: { + variant: { + default: "bg-transparent", + outline: + "border border-(--color-input) bg-transparent hover:bg-(--color-surface) data-[state=on]:border-(--color-ring)", + }, + size: { + default: "h-10 px-3", + sm: "h-8 px-2", + tile: "h-auto flex-col px-2 py-2 text-xs", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); diff --git a/web/src/index.css b/web/src/index.css new file mode 100644 index 00000000000..121e953d201 --- /dev/null +++ b/web/src/index.css @@ -0,0 +1,90 @@ +@import "tailwindcss"; +@import "tw-animate-css"; +@import "@fontsource-variable/geist"; +@import "@fontsource-variable/geist-mono"; + +@theme inline { + --font-sans: + "Geist Variable", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", system-ui, -apple-system, sans-serif; + --font-mono: "Geist Mono Variable", "PingFang SC", "Microsoft YaHei", Consolas, "Liberation Mono", Menlo, monospace; +} + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + --color-background: initial; + --color-foreground: initial; + --color-card: initial; + --color-card-foreground: initial; + --color-popover: initial; + --color-popover-foreground: initial; + --color-primary: initial; + --color-primary-foreground: initial; + --color-secondary: initial; + --color-secondary-foreground: initial; + --color-surface: initial; + --color-muted-foreground: initial; + --color-destructive: initial; + --color-destructive-foreground: initial; + --color-border: initial; + --color-input: initial; + --color-ring: initial; + --radius: 0.5rem; +} + +/* Theme palettes are adapted from Pierre Theme's "Light" and "Dark" + (non-soft) variants (https://github.com/pierrecomputer/theme). */ +:root { + color-scheme: light dark; + + --color-background: #ffffff; + --color-foreground: #0a0a0a; + --color-card: #ffffff; + --color-card-foreground: #0a0a0a; + --color-popover: #ffffff; + --color-popover-foreground: #0a0a0a; + --color-primary: #009fff; + --color-primary-foreground: #ffffff; + --color-secondary: #f5f5f5; + --color-secondary-foreground: #0a0a0a; + --color-surface: #f5f5f5; + --color-muted-foreground: #737373; + --color-destructive: #d52c36; + --color-destructive-foreground: #ffffff; + --color-border: #e5e5e5; + --color-input: #d4d4d4; + --color-ring: #009fff; +} + +:root.dark { + color-scheme: dark; + + --color-background: #0a0a0a; + --color-foreground: #fafafa; + --color-card: #171717; + --color-card-foreground: #fafafa; + --color-popover: #171717; + --color-popover-foreground: #fafafa; + --color-primary: #009fff; + --color-primary-foreground: #ffffff; + --color-secondary: #1d1d1d; + --color-secondary-foreground: #fafafa; + --color-surface: #1d1d1d; + --color-muted-foreground: #8a8a8a; + --color-destructive: #ff6762; + --color-destructive-foreground: #ffffff; + --color-border: #1d1d1d; + --color-input: #262626; + --color-ring: #009fff; +} + +@layer base { + html, + body { + background-color: var(--color-background); + color: var(--color-foreground); + } + body { + -webkit-font-smoothing: antialiased; + } +} diff --git a/web/src/lib/context.ts b/web/src/lib/context.ts new file mode 100644 index 00000000000..dfa0cbacd39 --- /dev/null +++ b/web/src/lib/context.ts @@ -0,0 +1,26 @@ +// WebContext mirrors the Go struct the server injects via +// at the top of index.html. +// Read it once at module load so callers get a stable snapshot. +export interface WebContext { + lang: string; + subURL: string; +} + +declare global { + interface Window { + __webContext?: Partial; + } +} + +function read(): WebContext { + if (typeof window === "undefined") { + return { lang: "en-US", subURL: "" }; + } + const ctx = window.__webContext ?? {}; + return { + lang: ctx.lang || "en-US", + subURL: ctx.subURL ?? "", + }; +} + +export const webContext: WebContext = read(); diff --git a/web/src/lib/i18n.ts b/web/src/lib/i18n.ts new file mode 100644 index 00000000000..9792eaf5dff --- /dev/null +++ b/web/src/lib/i18n.ts @@ -0,0 +1,80 @@ +import i18n from "i18next"; +import { initReactI18next } from "react-i18next"; + +import { webContext } from "@/lib/context"; +import bgBG from "@/locales/bg-BG.json"; +import csCZ from "@/locales/cs-CZ.json"; +import deDE from "@/locales/de-DE.json"; +import enGB from "@/locales/en-GB.json"; +import enUS from "@/locales/en-US.json"; +import esES from "@/locales/es-ES.json"; +import faIR from "@/locales/fa-IR.json"; +import fiFI from "@/locales/fi-FI.json"; +import frFR from "@/locales/fr-FR.json"; +import glES from "@/locales/gl-ES.json"; +import huHU from "@/locales/hu-HU.json"; +import idID from "@/locales/id-ID.json"; +import itIT from "@/locales/it-IT.json"; +import jaJP from "@/locales/ja-JP.json"; +import koKR from "@/locales/ko-KR.json"; +import lvLV from "@/locales/lv-LV.json"; +import mnMN from "@/locales/mn-MN.json"; +import nlNL from "@/locales/nl-NL.json"; +import plPL from "@/locales/pl-PL.json"; +import ptBR from "@/locales/pt-BR.json"; +import ptPT from "@/locales/pt-PT.json"; +import roRO from "@/locales/ro-RO.json"; +import ruRU from "@/locales/ru-RU.json"; +import skSK from "@/locales/sk-SK.json"; +import srSP from "@/locales/sr-SP.json"; +import svSE from "@/locales/sv-SE.json"; +import trTR from "@/locales/tr-TR.json"; +import ukUA from "@/locales/uk-UA.json"; +import viVN from "@/locales/vi-VN.json"; +import zhCN from "@/locales/zh-CN.json"; +import zhHK from "@/locales/zh-HK.json"; +import zhTW from "@/locales/zh-TW.json"; + +// eslint-disable-next-line import/no-named-as-default-member +void i18n.use(initReactI18next).init({ + resources: { + "bg-BG": { translation: bgBG }, + "cs-CZ": { translation: csCZ }, + "de-DE": { translation: deDE }, + "en-GB": { translation: enGB }, + "en-US": { translation: enUS }, + "es-ES": { translation: esES }, + "fa-IR": { translation: faIR }, + "fi-FI": { translation: fiFI }, + "fr-FR": { translation: frFR }, + "gl-ES": { translation: glES }, + "hu-HU": { translation: huHU }, + "id-ID": { translation: idID }, + "it-IT": { translation: itIT }, + "ja-JP": { translation: jaJP }, + "ko-KR": { translation: koKR }, + "lv-LV": { translation: lvLV }, + "mn-MN": { translation: mnMN }, + "nl-NL": { translation: nlNL }, + "pl-PL": { translation: plPL }, + "pt-BR": { translation: ptBR }, + "pt-PT": { translation: ptPT }, + "ro-RO": { translation: roRO }, + "ru-RU": { translation: ruRU }, + "sk-SK": { translation: skSK }, + "sr-SP": { translation: srSP }, + "sv-SE": { translation: svSE }, + "tr-TR": { translation: trTR }, + "uk-UA": { translation: ukUA }, + "vi-VN": { translation: viVN }, + "zh-CN": { translation: zhCN }, + "zh-HK": { translation: zhHK }, + "zh-TW": { translation: zhTW }, + }, + lng: webContext.lang, + fallbackLng: "en-US", + interpolation: { escapeValue: false, prefix: "{", suffix: "}" }, + returnNull: false, +}); + +export default i18n; diff --git a/web/src/lib/page-title.ts b/web/src/lib/page-title.ts new file mode 100644 index 00000000000..a959b0ee593 --- /dev/null +++ b/web/src/lib/page-title.ts @@ -0,0 +1,9 @@ +import { useEffect } from "react"; + +const APP_NAME = "Gogs"; + +export function usePageTitle(title?: string) { + useEffect(() => { + document.title = title ? `${title} - ${APP_NAME}` : APP_NAME; + }, [title]); +} diff --git a/web/src/lib/theme.ts b/web/src/lib/theme.ts new file mode 100644 index 00000000000..8adc355566b --- /dev/null +++ b/web/src/lib/theme.ts @@ -0,0 +1,41 @@ +import { useEffect, useState } from "react"; + +export type Theme = "light" | "dark" | "system"; + +const STORAGE_KEY = "gogs-theme"; + +function systemPrefersDark(): boolean { + return typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches; +} + +function readStoredTheme(): Theme { + if (typeof localStorage === "undefined") return "system"; + const v = localStorage.getItem(STORAGE_KEY); + return v === "light" || v === "dark" || v === "system" ? v : "system"; +} + +function applyTheme(theme: Theme) { + const dark = theme === "dark" || (theme === "system" && systemPrefersDark()); + document.documentElement.classList.toggle("dark", dark); +} + +export function useTheme() { + const [theme, setThemeState] = useState(readStoredTheme); + + useEffect(() => { + applyTheme(theme); + if (theme !== "system") return; + const mq = window.matchMedia("(prefers-color-scheme: dark)"); + const onChange = () => applyTheme("system"); + mq.addEventListener("change", onChange); + return () => mq.removeEventListener("change", onChange); + }, [theme]); + + const setTheme = (next: Theme) => { + localStorage.setItem(STORAGE_KEY, next); + setThemeState(next); + applyTheme(next); + }; + + return { theme, setTheme }; +} diff --git a/web/src/lib/url.ts b/web/src/lib/url.ts new file mode 100644 index 00000000000..87868291729 --- /dev/null +++ b/web/src/lib/url.ts @@ -0,0 +1,12 @@ +import { webContext } from "./context"; + +// subUrl prefixes an internal absolute path with the deployment subpath so +// links work whether Gogs is mounted at "/" or behind a reverse proxy on a +// prefix like "/gogs". Pass paths that start with "/" (e.g. "/user/login"). +// The result is canonicalized by trimming trailing slashes, so subUrl("/") +// returns "/gogs" (or "" at root), letting callers compare against +// location.pathname without juggling both "/gogs" and "/gogs/" forms. +export function subUrl(path: string): string { + const url = webContext.subURL + path; + return url.length > 1 ? url.replace(/\/+$/, "") : url; +} diff --git a/web/src/lib/use-user-info.ts b/web/src/lib/use-user-info.ts new file mode 100644 index 00000000000..abb3fbdcce7 --- /dev/null +++ b/web/src/lib/use-user-info.ts @@ -0,0 +1,12 @@ +import { useContext } from "react"; + +import type { UserInfo } from "./user-info"; +import { UserInfoContext } from "./user-info-context"; + +export function useUserInfo(): UserInfo | null { + const ctx = useContext(UserInfoContext); + if (ctx === undefined) { + throw new Error("useUserInfo must be used within UserInfoProvider"); + } + return ctx; +} diff --git a/web/src/lib/user-info-context.ts b/web/src/lib/user-info-context.ts new file mode 100644 index 00000000000..258c14f6682 --- /dev/null +++ b/web/src/lib/user-info-context.ts @@ -0,0 +1,5 @@ +import { createContext } from "react"; + +import type { UserInfo } from "./user-info"; + +export const UserInfoContext = createContext(undefined); diff --git a/web/src/lib/user-info.ts b/web/src/lib/user-info.ts new file mode 100644 index 00000000000..59614af558c --- /dev/null +++ b/web/src/lib/user-info.ts @@ -0,0 +1,23 @@ +import { subUrl } from "@/lib/url"; + +export interface UserInfo { + username: string; + avatarURL: string; + isAdmin: boolean; + canCreateOrganization: boolean; +} + +export async function fetchUserInfo(): Promise { + try { + const res = await fetch(subUrl("/api/web/user/info"), { credentials: "same-origin" }); + if (res.status === 204) return null; + if (!res.ok) { + console.error(`fetchUserInfo: unexpected status ${res.status}`); + return null; + } + return (await res.json()) as UserInfo; + } catch (err) { + console.error("fetchUserInfo: request failed", err); + return null; + } +} diff --git a/web/src/lib/utils.ts b/web/src/lib/utils.ts new file mode 100644 index 00000000000..365058cebd7 --- /dev/null +++ b/web/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/web/src/locales/bg-BG.json b/web/src/locales/bg-BG.json new file mode 100644 index 00000000000..6b9a66f24ad --- /dev/null +++ b/web/src/locales/bg-BG.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Безпроблемен собствен Git сървър", + "home": "Начало", + "dashboard": "Табло", + "issues": "Задачи", + "pull_requests": "Заявки за сливане", + "explore": "Каталог", + "help": "Помощ", + "register": "Регистрация", + "sign_in": "Вход", + "sign_out": "Изход", + "create_new": "Създаване...", + "new_repo": "Ново хранилище", + "new_migrate": "Нова миграция", + "new_org": "Нова организация", + "signed_in_as": "Вписан като", + "user_profile_and_more": "Потребителски профил и пр.", + "your_profile": "Вашият профил", + "your_settings": "Вашите настройки", + "admin_panel": "Административен панел", + "settings": "Настройки", + "language": "Език", + "page_not_found": "Страницата не е намерена", + "username": "Потребител", + "password": "Парола", + "auth_source": "Източник за удостоверяване", + "local": "Локален", + "remember_me": "Запомни ме", + "forget_password": "Забравена парола?", + "sign_up_now": "Нуждаете се от профил? Регистрирайте се сега." +} diff --git a/web/src/locales/cs-CZ.json b/web/src/locales/cs-CZ.json new file mode 100644 index 00000000000..86f0694d9e8 --- /dev/null +++ b/web/src/locales/cs-CZ.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Snadná soukromá služba Git", + "home": "Domů", + "dashboard": "Přehled", + "issues": "Úkoly", + "pull_requests": "Požadavky na natažení", + "explore": "Procházet", + "help": "Nápověda", + "register": "Registrovat se", + "sign_in": "Přihlásit se", + "sign_out": "Odhlásit se", + "create_new": "Vytvořit...", + "new_repo": "Nový repozitář", + "new_migrate": "Nové přenesení", + "new_org": "Nová organizace", + "signed_in_as": "Přihlášen jako", + "user_profile_and_more": "Uživatelský profil a další", + "your_profile": "Váš profil", + "your_settings": "Vaše nastavení", + "admin_panel": "Panel správce", + "settings": "Nastavení", + "language": "Jazyk", + "page_not_found": "Page Not Found", + "username": "Uživatelské jméno", + "password": "Heslo", + "auth_source": "Zdroj ověření", + "local": "Lokální", + "remember_me": "Zapamatovat si mne", + "forget_password": "Zapomněli jste heslo?", + "sign_up_now": "Potřebujete účet? Zaregistrujte se." +} diff --git a/web/src/locales/de-DE.json b/web/src/locales/de-DE.json new file mode 100644 index 00000000000..bbcf6c2316c --- /dev/null +++ b/web/src/locales/de-DE.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Ein einfacher, selbst gehosteter Git-Service", + "home": "Startseite", + "dashboard": "Übersicht", + "issues": "Issues", + "pull_requests": "Pull-Requests", + "explore": "Erkunden", + "help": "Hilfe", + "register": "Registrieren", + "sign_in": "Anmelden", + "sign_out": "Abmelden", + "create_new": "Erstellen...", + "new_repo": "Neues Repository", + "new_migrate": "Neue Migration", + "new_org": "Neue Organisation", + "signed_in_as": "Angemeldet als", + "user_profile_and_more": "Benutzerprofil und mehr", + "your_profile": "Ihr Profil", + "your_settings": "Ihre Einstellungen", + "admin_panel": "Administration", + "settings": "Einstellungen", + "language": "Sprache", + "page_not_found": "Seite nicht gefunden", + "username": "Benutzername", + "password": "Passwort", + "auth_source": "Authentifizierungsquelle", + "local": "Lokal", + "remember_me": "Angemeldet bleiben", + "forget_password": "Passwort vergessen?", + "sign_up_now": "Benötigen Sie ein Konto? Registrieren Sie sich jetzt." +} diff --git a/web/src/locales/en-GB.json b/web/src/locales/en-GB.json new file mode 100644 index 00000000000..5178f17f86c --- /dev/null +++ b/web/src/locales/en-GB.json @@ -0,0 +1,31 @@ +{ + "app_desc": "A painless self-hosted Git service", + "home": "Home", + "dashboard": "Dashboard", + "issues": "Issues", + "pull_requests": "Pull Requests", + "explore": "Explore", + "help": "Help", + "register": "Register", + "sign_in": "Sign In", + "sign_out": "Sign Out", + "create_new": "Create...", + "new_repo": "New Repository", + "new_migrate": "New Migration", + "new_org": "New Organisation", + "signed_in_as": "Signed in as", + "user_profile_and_more": "User profile and more", + "your_profile": "Your Profile", + "your_settings": "Your Settings", + "admin_panel": "Admin Panel", + "settings": "Settings", + "language": "Language", + "page_not_found": "Page Not Found", + "username": "Username", + "password": "Password", + "auth_source": "Authentication Source", + "local": "Local", + "remember_me": "Remember Me", + "forget_password": "Forgot password?", + "sign_up_now": "Need an account? Sign up now." +} diff --git a/web/src/locales/en-US.json b/web/src/locales/en-US.json new file mode 100644 index 00000000000..e1097bf35ed --- /dev/null +++ b/web/src/locales/en-US.json @@ -0,0 +1,52 @@ +{ + "app_desc": "The painless way to host your own Git service", + "home": "Home", + "dashboard": "Dashboard", + "issues": "Issues", + "pull_requests": "Pull requests", + "explore": "Explore", + "help": "Help", + "register": "Create account", + "sign_in": "Sign in", + "sign_out": "Sign out", + "create_new": "Create...", + "new_repo": "New repository", + "new_migrate": "New migration", + "new_org": "New organization", + "signed_in_as": "Signed in as", + "user_profile_and_more": "User profile and more", + "your_profile": "Your profile", + "your_settings": "Your settings", + "admin_panel": "Admin panel", + "settings": "Settings", + "language": "Language", + "page_not_found": "Page not found", + "theme": "Theme", + "theme_light": "Light", + "theme_dark": "Dark", + "theme_system": "System", + "username": "Username", + "username_placeholder": "Enter your username or email", + "password": "Password", + "password_placeholder": "Enter your password", + "auth_source": "Authentication source", + "local": "Local", + "forget_password": "Forgot password?", + "sign_up_now": "Create a new account", + "sign_in_submitting": "Signing in...", + "sign_in_failed": "Could not sign in, please try again.", + "show_password": "Show password", + "hide_password": "Hide password", + "back_to_sign_in": "Back to sign in", + "mfa_title": "Multi-factor authentication", + "mfa_passcode": "Passcode", + "mfa_passcode_placeholder": "Enter the 6-digit code from your authenticator", + "mfa_recovery_code": "Recovery code", + "mfa_recovery_code_placeholder": "Enter a recovery code", + "mfa_use_recovery_code": "Use a recovery code instead", + "mfa_use_passcode": "Use a passcode instead", + "mfa_verify": "Verify", + "mfa_verifying": "Verifying...", + "mfa_session_expired": "Your sign-in session has expired. Please sign in again.", + "mfa_verify_failed": "Verification failed. Please try again." +} diff --git a/web/src/locales/es-ES.json b/web/src/locales/es-ES.json new file mode 100644 index 00000000000..192b8eeee97 --- /dev/null +++ b/web/src/locales/es-ES.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Un servicio de Git auto alojado y sin complicaciones", + "home": "Inicio", + "dashboard": "Panel de control", + "issues": "Incidencias", + "pull_requests": "Pull Requests", + "explore": "Explorar", + "help": "Ayuda", + "register": "Registro", + "sign_in": "Iniciar sesión", + "sign_out": "Cerrar sesión", + "create_new": "Crear...", + "new_repo": "Nuevo repositorio", + "new_migrate": "Nueva migración", + "new_org": "Nueva organización", + "signed_in_as": "Identificado como", + "user_profile_and_more": "Perfil de usuario y más", + "your_profile": "Tu perfil", + "your_settings": "Tu configuración", + "admin_panel": "Panel de administración", + "settings": "Configuraciones", + "language": "Idioma", + "page_not_found": "Página no encontrada", + "username": "Nombre de usuario", + "password": "Contraseña", + "auth_source": "Authentication Source", + "local": "Local", + "remember_me": "Recuérdame", + "forget_password": "¿Has olvidado tu contraseña?", + "sign_up_now": "¿Necesitas una cuenta? Regístrate ahora." +} diff --git a/web/src/locales/fa-IR.json b/web/src/locales/fa-IR.json new file mode 100644 index 00000000000..cbf3d30ef98 --- /dev/null +++ b/web/src/locales/fa-IR.json @@ -0,0 +1,31 @@ +{ + "app_desc": "یک سرویس گیت بی‌درد سر و راحت", + "home": "صفحهٔ اصلی", + "dashboard": "میز کار", + "issues": "مسائل", + "pull_requests": "پول ریکوست", + "explore": "گشت‌و‌گذار", + "help": "راهنما", + "register": "ثبت نام", + "sign_in": "ورود", + "sign_out": "خروج", + "create_new": "ایجاد...", + "new_repo": "مخزن جدید", + "new_migrate": "انتقال جدید", + "new_org": "سازمان جدید", + "signed_in_as": "ورود به عنوان", + "user_profile_and_more": "پروفایل کاربر و …", + "your_profile": "پروفایل شما", + "your_settings": "تنظیمات شما", + "admin_panel": "پنل مدیریت", + "settings": "تنظيمات", + "language": "زبان", + "page_not_found": "صفحه مورد نظر یافت نشد.", + "username": "نام کاربری", + "password": "رمز عبور", + "auth_source": "محل احراز هویت", + "local": "محلی", + "remember_me": "مرا به خاطر بسپار", + "forget_password": "رمز عبور خود را فراموش کرده‌اید؟", + "sign_up_now": "نیاز به یک حساب دارید؟ هم‌اکنون ثبت نام کنید." +} diff --git a/web/src/locales/fi-FI.json b/web/src/locales/fi-FI.json new file mode 100644 index 00000000000..79640f692ea --- /dev/null +++ b/web/src/locales/fi-FI.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Kivuton itse-hostattu Git palvelu", + "home": "Etusivu", + "dashboard": "Kojelauta", + "issues": "Esitykset", + "pull_requests": "Vetopyynnöt", + "explore": "Tutki", + "help": "Apua", + "register": "Rekisteröidy", + "sign_in": "Kirjaudu sisään", + "sign_out": "Kirjaudu ulos", + "create_new": "Luo...", + "new_repo": "Uusi tietosäilö", + "new_migrate": "Uusi migraatio", + "new_org": "Uusi organisaatio", + "signed_in_as": "Kirjautuneena käyttäjänä", + "user_profile_and_more": "Käyttäjäprofiili ja lisää", + "your_profile": "Profiilisi", + "your_settings": "Asetuksesi", + "admin_panel": "Ylläpito paneeli", + "settings": "Asetukset", + "language": "Kieli", + "page_not_found": "Sivua ei löydy", + "username": "Käyttäjätunnus", + "password": "Salasana", + "auth_source": "Todennuslähde", + "local": "Paikallinen", + "remember_me": "Muista minut", + "forget_password": "Unohtuiko salasana?", + "sign_up_now": "Tarvitsetko tilin? Rekisteröidy nyt." +} diff --git a/web/src/locales/fr-FR.json b/web/src/locales/fr-FR.json new file mode 100644 index 00000000000..2bd298334ad --- /dev/null +++ b/web/src/locales/fr-FR.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Un service Git auto-hébergé et indolore.", + "home": "Accueil", + "dashboard": "Tableau de bord", + "issues": "Tickets", + "pull_requests": "Demandes d'admission", + "explore": "Explorer", + "help": "Aide", + "register": "S'inscrire", + "sign_in": "Connexion", + "sign_out": "Déconnexion", + "create_new": "Créer...", + "new_repo": "Nouveau dépôt", + "new_migrate": "Nouvelle migration", + "new_org": "Nouvelle organisation", + "signed_in_as": "Connecté en tant que", + "user_profile_and_more": "Profil utilisateur et plus", + "your_profile": "Votre profil", + "your_settings": "Vos paramètres", + "admin_panel": "Administration", + "settings": "Paramètres", + "language": "Langue", + "page_not_found": "Page non trouvée", + "username": "Nom d'utilisateur", + "password": "Mot de passe", + "auth_source": "Sources d'authentification", + "local": "Locale", + "remember_me": "Se souvenir de moi", + "forget_password": "Mot de passe oublié ?", + "sign_up_now": "Pas de compte ? Inscrivez-vous maintenant." +} diff --git a/web/src/locales/gl-ES.json b/web/src/locales/gl-ES.json new file mode 100644 index 00000000000..fe8493f1ea0 --- /dev/null +++ b/web/src/locales/gl-ES.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Un servizo de Git auto aloxado e sen complicacións", + "home": "Inicio", + "dashboard": "Panel de control", + "issues": "Incidencias", + "pull_requests": "Solicitudes de integración", + "explore": "Explorar", + "help": "Axuda", + "register": "Rexistro", + "sign_in": "Iniciar sesión", + "sign_out": "Cerrar sesión", + "create_new": "Crear…", + "new_repo": "Novo repositorio", + "new_migrate": "Nova migración", + "new_org": "Nova organización", + "signed_in_as": "Identificado/a como", + "user_profile_and_more": "Perfil de usuario/a e máis", + "your_profile": "O teu perfil", + "your_settings": "A túa configuración", + "admin_panel": "Panel de administración", + "settings": "Configuracións", + "language": "Idioma", + "page_not_found": "Page Not Found", + "username": "Nome da persoa usuaria", + "password": "Contrasinal", + "auth_source": "Fonte de Autenticación", + "local": "Configuración rexional", + "remember_me": "Recórdame", + "forget_password": "Esqueciches o teu contrasinal?", + "sign_up_now": "Necesitas unha conta? Rexístrate agora." +} diff --git a/web/src/locales/hu-HU.json b/web/src/locales/hu-HU.json new file mode 100644 index 00000000000..a25c58696d2 --- /dev/null +++ b/web/src/locales/hu-HU.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Fájdalommentes, saját gépre telepíthető Git szolgáltatás", + "home": "Kezdőlap", + "dashboard": "Áttekintés", + "issues": "Problémák", + "pull_requests": "Pull request-ek", + "explore": "Felfedezés", + "help": "Súgó", + "register": "Regisztráció", + "sign_in": "Bejelentkezés", + "sign_out": "Kijelentkezés", + "create_new": "Létrehozás...", + "new_repo": "Új tároló", + "new_migrate": "Új migráció", + "new_org": "Új szervezet", + "signed_in_as": "Bejelentkezve, mint", + "user_profile_and_more": "Felhasználói profil és egyebek", + "your_profile": "Profilom", + "your_settings": "Beállításaim", + "admin_panel": "Rendszergazdai felület", + "settings": "Beállítások", + "language": "Nyelv", + "page_not_found": "Az oldal nem található", + "username": "Felhasználónév", + "password": "Jelszó", + "auth_source": "Hitelesítési forrás", + "local": "Helyi", + "remember_me": "Emlékezz rám", + "forget_password": "Elfelejtette a jelszavát?", + "sign_up_now": "Szeretne bejelentkezni? Regisztráljon most." +} diff --git a/web/src/locales/id-ID.json b/web/src/locales/id-ID.json new file mode 100644 index 00000000000..9c0ebdd1fcc --- /dev/null +++ b/web/src/locales/id-ID.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Sebuah layanan Git hosting-pribadi yang mudah", + "home": "Halaman utama", + "dashboard": "Dasbor", + "issues": "Masalah", + "pull_requests": "Permintaan Tarik", + "explore": "Jelajahi", + "help": "Bantuan", + "register": "Daftar", + "sign_in": "Masuk", + "sign_out": "Keluar", + "create_new": "Buat...", + "new_repo": "Repositori Baru", + "new_migrate": "Migrasi Baru", + "new_org": "Organisasi Baru", + "signed_in_as": "Masuk sebagai", + "user_profile_and_more": "Profil pengguna dan lebih", + "your_profile": "Profile Anda", + "your_settings": "Pengaturanmu", + "admin_panel": "Panel Admin", + "settings": "Pengaturan", + "language": "Bahasa", + "page_not_found": "Halaman tidak ditemukan", + "username": "Nama pengguna", + "password": "Sandi", + "auth_source": "Sumber Autentikasi", + "local": "Lokal", + "remember_me": "Ingat saya", + "forget_password": "Lupa sandi?", + "sign_up_now": "Membutuhkan akun? Daftar sekarang." +} diff --git a/web/src/locales/it-IT.json b/web/src/locales/it-IT.json new file mode 100644 index 00000000000..67bb1330bc4 --- /dev/null +++ b/web/src/locales/it-IT.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Un servizio Git auto-ospitato pronto all'uso", + "home": "Home", + "dashboard": "Pannello di controllo", + "issues": "Problemi", + "pull_requests": "Pull Request", + "explore": "Esplora", + "help": "Aiuto", + "register": "Registrati", + "sign_in": "Accedi", + "sign_out": "Esci", + "create_new": "Crea...", + "new_repo": "Nuovo Repository", + "new_migrate": "Nuova Migrazione", + "new_org": "Nuova organizzazione", + "signed_in_as": "Accesso effettuato come", + "user_profile_and_more": "Profilo utente e altro", + "your_profile": "Il tuo profilo", + "your_settings": "Impostazioni", + "admin_panel": "Pannello di amministrazione", + "settings": "Impostazioni", + "language": "Lingua", + "page_not_found": "Pagina Non Trovata", + "username": "Nome utente", + "password": "Password", + "auth_source": "Fonte di autenticazione", + "local": "Locale", + "remember_me": "Ricordami", + "forget_password": "Password dimenticata?", + "sign_up_now": "Bisogno di un account? Iscriviti ora." +} diff --git a/web/src/locales/ja-JP.json b/web/src/locales/ja-JP.json new file mode 100644 index 00000000000..e3e47e9c48c --- /dev/null +++ b/web/src/locales/ja-JP.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Go言語で実装したセルフホストGitサービス", + "home": "ホーム", + "dashboard": "ダッシュボード", + "issues": "課題", + "pull_requests": "プルリクエスト", + "explore": "エクスプローラ", + "help": "ヘルプ", + "register": "登録", + "sign_in": "サインイン", + "sign_out": "サインアウト", + "create_new": "作成...", + "new_repo": "新しいリポジトリ", + "new_migrate": "新しい移行", + "new_org": "新しい組織", + "signed_in_as": "サインイン済み", + "user_profile_and_more": "ユーザープロフィールなど", + "your_profile": "プロフィール", + "your_settings": "設定", + "admin_panel": "管理者パネル", + "settings": "設定", + "language": "言語", + "page_not_found": "ページが見つかりません", + "username": "ユーザー名", + "password": "パスワード", + "auth_source": "認証ソース", + "local": "ローカル", + "remember_me": "ログインしたままにする", + "forget_password": "パスワードを忘れましたか?", + "sign_up_now": "アカウントが必要ですか?今すぐ登録しましょう!" +} diff --git a/web/src/locales/ko-KR.json b/web/src/locales/ko-KR.json new file mode 100644 index 00000000000..9a0804f2f58 --- /dev/null +++ b/web/src/locales/ko-KR.json @@ -0,0 +1,31 @@ +{ + "app_desc": "편리한 설치형 Git 서비스", + "home": "홈", + "dashboard": "대시보드", + "issues": "이슈", + "pull_requests": "풀 리퀘스트", + "explore": "탐색", + "help": "도움말", + "register": "가입하기", + "sign_in": "로그인", + "sign_out": "로그아웃", + "create_new": "만들기...", + "new_repo": "새 저장소", + "new_migrate": "새 마이그레이션", + "new_org": "새로운 조직", + "signed_in_as": "다음 사용자로 로그인됨", + "user_profile_and_more": "사용자 프로필 및 기타", + "your_profile": "프로필", + "your_settings": "설정", + "admin_panel": "관리자 패널", + "settings": "설정", + "language": "언어", + "page_not_found": "페이지를 찾을 수 없음", + "username": "사용자명", + "password": "비밀번호", + "auth_source": "인증 소스 편집", + "local": "로컬", + "remember_me": "자동 로그인", + "forget_password": "비밀번호를 잊으셨습니까?", + "sign_up_now": "계정이 필요하신가요? 지금 가입하세요." +} diff --git a/web/src/locales/lv-LV.json b/web/src/locales/lv-LV.json new file mode 100644 index 00000000000..6d2309270a6 --- /dev/null +++ b/web/src/locales/lv-LV.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Viegli uzstādāms Git serviss, kas rakstīts valodā Go", + "home": "Sākums", + "dashboard": "Infopanelis", + "issues": "Problēmas", + "pull_requests": "Izmaiņu pieprasījumi", + "explore": "Izpētīt", + "help": "Palīdzība", + "register": "Reģistrēties", + "sign_in": "Pierakstīties", + "sign_out": "Izrakstīties", + "create_new": "Izveidot...", + "new_repo": "Jauns repozitorijs", + "new_migrate": "Jauna migrācija", + "new_org": "Jauna organizācija", + "signed_in_as": "Pierakstījies kā", + "user_profile_and_more": "Lietotāja profilu un vairāk", + "your_profile": "Tavs profils", + "your_settings": "Tavi iestatījumi", + "admin_panel": "Admin panelis", + "settings": "Iestatījumi", + "language": "Valoda", + "page_not_found": "Page Not Found", + "username": "Lietotājvārds", + "password": "Parole", + "auth_source": "Autentificēšanas avots", + "local": "Local", + "remember_me": "Atcerēties mani", + "forget_password": "Aizmirsi paroli?", + "sign_up_now": "Nepieciešams konts? Reģistrējies tagad." +} diff --git a/web/src/locales/mn-MN.json b/web/src/locales/mn-MN.json new file mode 100644 index 00000000000..0322ec8b16e --- /dev/null +++ b/web/src/locales/mn-MN.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Хамгийн хялбар GIT үйлчилгээ", + "home": "Эхлэл", + "dashboard": "Удирдлага", + "issues": "Асуудал", + "pull_requests": "Татаж авах хүсэлтүүд", + "explore": "Бүгдийг харах", + "help": "Тусламж", + "register": "Бүртгүүлэх", + "sign_in": "Нэвтрэх", + "sign_out": "Гарах", + "create_new": "Шинээр нэмэх...", + "new_repo": "Шинэ Репо", + "new_migrate": "Шинэ", + "new_org": "Шинэ Байгууллага", + "signed_in_as": "Нэвтэрсэн хэрэглэгч", + "user_profile_and_more": "Хэрэглэгчийн профайл болон бусад", + "your_profile": "Таны профайл", + "your_settings": "Таны тохиргоо", + "admin_panel": "Админ удирдлага", + "settings": "Тохиргоо", + "language": "Хэл", + "page_not_found": "Хуудас олдсонгүй", + "username": "Нэвтрэх нэр", + "password": "Нууц үг", + "auth_source": "Баталгаажуулалтын эх сурвалж", + "local": "Локал", + "remember_me": "Сануулах", + "forget_password": "Нууц үг сэргээх?", + "sign_up_now": "Данс үүсгэх бол? Одоо бүртгүүлнэ үү." +} diff --git a/web/src/locales/nl-NL.json b/web/src/locales/nl-NL.json new file mode 100644 index 00000000000..dc057c74a63 --- /dev/null +++ b/web/src/locales/nl-NL.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Een eenvoudige zelfgehoste Git service geschreven in Go", + "home": "Home", + "dashboard": "Dashboard", + "issues": "Issues", + "pull_requests": "Pull requests", + "explore": "Verkennen", + "help": "Help", + "register": "Registreren", + "sign_in": "Inloggen", + "sign_out": "Uitloggen", + "create_new": "Toevoegen...", + "new_repo": "Nieuwe repository", + "new_migrate": "Nieuwe migratie", + "new_org": "Nieuwe organisatie", + "signed_in_as": "Aangemeld als", + "user_profile_and_more": "Gebruikersprofiel en meer", + "your_profile": "Uw profiel", + "your_settings": "Uw instellingen", + "admin_panel": "Adminpaneel", + "settings": "Instellingen", + "language": "Taal", + "page_not_found": "Pagina niet gevonden", + "username": "Gebruikersnaam", + "password": "Wachtwoord", + "auth_source": "Authenticatiebron", + "local": "Lokaal", + "remember_me": "Onthoud mij", + "forget_password": "Wachtwoord vergeten?", + "sign_up_now": "Een account nodig? Meld u nu aan." +} diff --git a/web/src/locales/pl-PL.json b/web/src/locales/pl-PL.json new file mode 100644 index 00000000000..273fd6ca6cb --- /dev/null +++ b/web/src/locales/pl-PL.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Bezbolesna usługa Git na własnym serwerze", + "home": "Strona główna", + "dashboard": "Pulpit", + "issues": "Problemy", + "pull_requests": "Oczekujące zmiany", + "explore": "Odkrywaj", + "help": "Pomoc", + "register": "Zarejestruj się", + "sign_in": "Zaloguj się", + "sign_out": "Wyloguj", + "create_new": "Utwórz...", + "new_repo": "Nowe repozytorium", + "new_migrate": "Nowa migracja", + "new_org": "Nowa organizacja", + "signed_in_as": "Zalogowany jako", + "user_profile_and_more": "Profil użytkownika i więcej", + "your_profile": "Twój profil", + "your_settings": "Twoje ustawienia", + "admin_panel": "Panel admina", + "settings": "Ustawienia", + "language": "Język", + "page_not_found": "Strona nie została znaleziona", + "username": "Nazwa użytkownika", + "password": "Hasło", + "auth_source": "Źródło uwierzytelniania", + "local": "Lokalne", + "remember_me": "Zapamiętaj mnie", + "forget_password": "Zapomniałeś hasła?", + "sign_up_now": "Potrzebujesz konta? Zarejestruj się teraz." +} diff --git a/web/src/locales/pt-BR.json b/web/src/locales/pt-BR.json new file mode 100644 index 00000000000..daf3c99195f --- /dev/null +++ b/web/src/locales/pt-BR.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Um serviço de Git auto-hospedado e amigável escrito em Go", + "home": "Página inicial", + "dashboard": "Painel de controle", + "issues": "Problemas", + "pull_requests": "Pull requests", + "explore": "Explorar", + "help": "Ajuda", + "register": "Registrar", + "sign_in": "Entrar", + "sign_out": "Sair", + "create_new": "Criar...", + "new_repo": "Novo repositório", + "new_migrate": "Nova migração", + "new_org": "Nova organização", + "signed_in_as": "Entrou como", + "user_profile_and_more": "Perfil do usuário e mais", + "your_profile": "Seu perfil", + "your_settings": "Suas configurações", + "admin_panel": "Painel do administrador", + "settings": "Configurações", + "language": "Idioma", + "page_not_found": "Página Não Encontrada", + "username": "Usuário", + "password": "Senha", + "auth_source": "Fonte de autenticação", + "local": "Local", + "remember_me": "Lembrar de mim", + "forget_password": "Esqueceu a senha?", + "sign_up_now": "Precisa de uma conta? Cadastre-se agora." +} diff --git a/web/src/locales/pt-PT.json b/web/src/locales/pt-PT.json new file mode 100644 index 00000000000..740457010b8 --- /dev/null +++ b/web/src/locales/pt-PT.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Um Serviço Git fácil e simples", + "home": "Página Principal", + "dashboard": "Painel de administração", + "issues": "Questões", + "pull_requests": "Pull requests", + "explore": "Explorar", + "help": "Ajuda", + "register": "Registe-se", + "sign_in": "Iniciar Sessão", + "sign_out": "Terminar Sessão", + "create_new": "Criar...", + "new_repo": "Novo repositório", + "new_migrate": "Nova migração", + "new_org": "Nova organização", + "signed_in_as": "Sessão iniciada como", + "user_profile_and_more": "Perfil do utilizador e mais", + "your_profile": "Perfil", + "your_settings": "Suas configurações", + "admin_panel": "Painel de Administração", + "settings": "Definições", + "language": "Língua", + "page_not_found": "Página Não Encontrada", + "username": "Nome de utilizador", + "password": "Palavra-chave", + "auth_source": "Tipo de autenticação", + "local": "Local", + "remember_me": "Manter sessão iniciada", + "forget_password": "Esqueceu a sua senha?", + "sign_up_now": "Precisa de uma conta? Inscreva-se agora." +} diff --git a/web/src/locales/ro-RO.json b/web/src/locales/ro-RO.json new file mode 100644 index 00000000000..f41b906e7cc --- /dev/null +++ b/web/src/locales/ro-RO.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Un serviciu Git auto-găzduit fără dureri de cap", + "home": "Acasă", + "dashboard": "Prezentare generală", + "issues": "Probleme", + "pull_requests": "Trageți solicitările", + "explore": "Explorează", + "help": "Ajutor", + "register": "Înregistrare", + "sign_in": "Autentificare", + "sign_out": "Deconectare", + "create_new": "Creare...", + "new_repo": "Repositoriu nou", + "new_migrate": "Migrare nouă", + "new_org": "Organizație nouă", + "signed_in_as": "Conectat ca", + "user_profile_and_more": "Profilul utilizatorului și multe altele", + "your_profile": "Profilul dumneavoastră", + "your_settings": "Setările tale", + "admin_panel": "Panou Administrator", + "settings": "Setări", + "language": "Limba", + "page_not_found": "Pagina nu a fost găsită", + "username": "Numele de utilizator", + "password": "Parolă", + "auth_source": "Sursa de autentificare", + "local": "Local", + "remember_me": "Ține-mă minte", + "forget_password": "Ați uitat parola?", + "sign_up_now": "Nevoie de un cont? Inscrie-te acum." +} diff --git a/web/src/locales/ru-RU.json b/web/src/locales/ru-RU.json new file mode 100644 index 00000000000..2d2a5f7ff68 --- /dev/null +++ b/web/src/locales/ru-RU.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Удобная служба для собственного Git-репозитория", + "home": "Главная", + "dashboard": "Панель управления", + "issues": "Задачи", + "pull_requests": "Запросы на слияние", + "explore": "Обзор", + "help": "Помощь", + "register": "Регистрация", + "sign_in": "Вход", + "sign_out": "Выход", + "create_new": "Создать...", + "new_repo": "Новый репозиторий", + "new_migrate": "Новая миграция", + "new_org": "Новая организация", + "signed_in_as": "Вы вошли как", + "user_profile_and_more": "Профиль пользователя и прочее", + "your_profile": "Ваш профиль", + "your_settings": "Ваши настройки", + "admin_panel": "Панель администратора", + "settings": "Настройки", + "language": "Язык", + "page_not_found": "Страница не найдена", + "username": "Имя пользователя", + "password": "Пароль", + "auth_source": "Тип аутентификации", + "local": "Локальный", + "remember_me": "Запомнить меня", + "forget_password": "Забыли пароль?", + "sign_up_now": "Нужен аккаунт? Зарегистрируйтесь." +} diff --git a/web/src/locales/sk-SK.json b/web/src/locales/sk-SK.json new file mode 100644 index 00000000000..51f5afa0825 --- /dev/null +++ b/web/src/locales/sk-SK.json @@ -0,0 +1,31 @@ +{ + "app_desc": "A painless self-hosted Git service", + "home": "Domovská stránka", + "dashboard": "Nástenka", + "issues": "Issues", + "pull_requests": "Pull Requesty", + "explore": "Prehľadávať", + "help": "Pomoc", + "register": "Registrovať", + "sign_in": "Prihlásiť sa", + "sign_out": "Odhlásiť sa", + "create_new": "Vytvoriť...", + "new_repo": "Nový repozitár", + "new_migrate": "Nová migrácia", + "new_org": "Nová organizácia", + "signed_in_as": "Prihlásený ako", + "user_profile_and_more": "Profil používateľa a ďalšie", + "your_profile": "Váš profil", + "your_settings": "Vaše Nastavenia", + "admin_panel": "Admin Panel", + "settings": "Nastavenia", + "language": "Jazyk", + "page_not_found": "Page Not Found", + "username": "Používateľské meno", + "password": "Heslo", + "auth_source": "Zdroj overovania", + "local": "Lokálny", + "remember_me": "Zapamätať prihlásenie", + "forget_password": "Zabudli ste heslo?", + "sign_up_now": "Potrebujete účet? Zaregistrujte sa teraz." +} diff --git a/web/src/locales/sr-SP.json b/web/src/locales/sr-SP.json new file mode 100644 index 00000000000..b021ad72530 --- /dev/null +++ b/web/src/locales/sr-SP.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Једноставан Git сервис", + "home": "Почетна", + "dashboard": "Контролни панел", + "issues": "Дискусије", + "pull_requests": "Захтеви за спајање", + "explore": "Преглед", + "help": "Помоћ", + "register": "Регистрација", + "sign_in": "Пријавите се", + "sign_out": "Одјава", + "create_new": "Креирај...", + "new_repo": "Ново спремиште", + "new_migrate": "Нова миграција", + "new_org": "Нова организација", + "signed_in_as": "Пријављени сте као", + "user_profile_and_more": "Профил корисника и остало", + "your_profile": "Ваш профил", + "your_settings": "Ваша подешавања", + "admin_panel": "Админ панела", + "settings": "Подешавања", + "language": "Језик", + "page_not_found": "Page Not Found", + "username": "Корисничко име", + "password": "Лозинка", + "auth_source": "Извор аутентикације", + "local": "Локално", + "remember_me": "Запамти ме", + "forget_password": "Заборавили сте лозинку?", + "sign_up_now": "Немате налог? Пријавите се." +} diff --git a/web/src/locales/sv-SE.json b/web/src/locales/sv-SE.json new file mode 100644 index 00000000000..fa1f6624cfc --- /dev/null +++ b/web/src/locales/sv-SE.json @@ -0,0 +1,31 @@ +{ + "app_desc": "En smidig Git-tjänst du kör själv skriven i Go", + "home": "Startsida", + "dashboard": "Instrumentpanel", + "issues": "Problem", + "pull_requests": "Pull förfrågningar", + "explore": "Utforska", + "help": "Hjälp", + "register": "Registrera dig", + "sign_in": "Logga in", + "sign_out": "Logga ut", + "create_new": "Skapa...", + "new_repo": "Ny utvecklingskatalog", + "new_migrate": "Ny migrering", + "new_org": "Ny organisation", + "signed_in_as": "Inloggad som", + "user_profile_and_more": "Användarprofil med mera", + "your_profile": "Din profil", + "your_settings": "Dina inställningar", + "admin_panel": "Admin-panel", + "settings": "inställningar", + "language": "Språk", + "page_not_found": "Sidan hittades inte", + "username": "Användarnamn", + "password": "Lösenord", + "auth_source": "Autentiseringskälla", + "local": "Lokal", + "remember_me": "Kom ihåg mig", + "forget_password": "Glömt lösenordet?", + "sign_up_now": "Behöver du ett konto? Registrera dig nu." +} diff --git a/web/src/locales/tr-TR.json b/web/src/locales/tr-TR.json new file mode 100644 index 00000000000..85958b5c913 --- /dev/null +++ b/web/src/locales/tr-TR.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Kendi sunucunuzda barındırabileceğiniz zahmetsiz bir Git servisi", + "home": "Ana Sayfa", + "dashboard": "Pano", + "issues": "Sorunlar", + "pull_requests": "Değişiklik İsteği", + "explore": "Keşfet", + "help": "Yardım", + "register": "Üye Ol", + "sign_in": "Giriş Yap", + "sign_out": "Çıkış Yap", + "create_new": "Oluştur...", + "new_repo": "Yeni Depo", + "new_migrate": "Yeni Göç", + "new_org": "Yeni Organizasyon", + "signed_in_as": "Giriş yapan:", + "user_profile_and_more": "Kullanıcı profili ve daha fazlası", + "your_profile": "Profiliniz", + "your_settings": "Ayarlarınız", + "admin_panel": "Yönetim Paneli", + "settings": "Ayarlar", + "language": "Dil", + "page_not_found": "Sayfa Bulunamadı", + "username": "Kullanıcı Adı", + "password": "Parola", + "auth_source": "Yetkilendirme Kaynağı", + "local": "Yerel", + "remember_me": "Beni Hatırla", + "forget_password": "Parolanızı mı unuttunuz?", + "sign_up_now": "Bir hesaba mı ihtiyacınız var? Şimdi kaydolun." +} diff --git a/web/src/locales/uk-UA.json b/web/src/locales/uk-UA.json new file mode 100644 index 00000000000..ed6ce0b986f --- /dev/null +++ b/web/src/locales/uk-UA.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Зручний сервіс власного Git хостингу", + "home": "Головна сторінка", + "dashboard": "Панель керування", + "issues": "Проблеми", + "pull_requests": "Запити на злиття", + "explore": "Огляд", + "help": "Довідка", + "register": "Реєстрація", + "sign_in": "Увійти", + "sign_out": "Вийти", + "create_new": "Створити...", + "new_repo": "Новий репозиторій", + "new_migrate": "Нова міграція", + "new_org": "Нова організація", + "signed_in_as": "Увійшов як", + "user_profile_and_more": "Профіль користувача та інше", + "your_profile": "Ваш профіль", + "your_settings": "Ваші налаштування", + "admin_panel": "Панель адміністратора", + "settings": "Налаштування", + "language": "Мова", + "page_not_found": "Сторінку не знайдено", + "username": "Ім'я користувача", + "password": "Пароль", + "auth_source": "Джерело автентифікації", + "local": "Локальний", + "remember_me": "Запам'ятати мене", + "forget_password": "Забули пароль?", + "sign_up_now": "Потрібен обліковий запис? Зареєструватися зараз." +} diff --git a/web/src/locales/vi-VN.json b/web/src/locales/vi-VN.json new file mode 100644 index 00000000000..d31bec353df --- /dev/null +++ b/web/src/locales/vi-VN.json @@ -0,0 +1,31 @@ +{ + "app_desc": "Một server lưu trữ Git tự host dễ dàng", + "home": "Trang chủ", + "dashboard": "Bảng điều khiển", + "issues": "Các vấn đề", + "pull_requests": "Yêu cầu khéo về", + "explore": "Khám phá", + "help": "Trợ giúp", + "register": "Đăng ký", + "sign_in": "Đăng nhập", + "sign_out": "Đăng xuất", + "create_new": "Tạo mới...", + "new_repo": "Kho mới", + "new_migrate": "Mốc mới", + "new_org": "Tổ chức mới", + "signed_in_as": "Đăng nhập như là", + "user_profile_and_more": "Thông tin người dùng và thêm nữa", + "your_profile": "Hồ sơ của bạn", + "your_settings": "Cài đặt của bạn", + "admin_panel": "Bảng quản trị", + "settings": "Cài đặt", + "language": "Ngôn ngữ", + "page_not_found": "Không tìm thấy trang này!", + "username": "Username", + "password": "Mật khẩu", + "auth_source": "Authentication Source", + "local": "Local", + "remember_me": "Ghi nhớ tôi", + "forget_password": "Quên mật khẩu?", + "sign_up_now": "Cần một tài khoản? Đăng ký bây giờ." +} diff --git a/web/src/locales/zh-CN.json b/web/src/locales/zh-CN.json new file mode 100644 index 00000000000..c6916775d52 --- /dev/null +++ b/web/src/locales/zh-CN.json @@ -0,0 +1,31 @@ +{ + "app_desc": "一款极易搭建的自助 Git 服务", + "home": "首页", + "dashboard": "控制面板", + "issues": "工单管理", + "pull_requests": "合并请求", + "explore": "发现", + "help": "帮助", + "register": "注册", + "sign_in": "登录", + "sign_out": "退出", + "create_new": "创建...", + "new_repo": "创建新的仓库", + "new_migrate": "迁移外部仓库", + "new_org": "创建新的组织", + "signed_in_as": "已登录用户", + "user_profile_and_more": "用户信息及更多", + "your_profile": "个人信息", + "your_settings": "用户设置", + "admin_panel": "管理面板", + "settings": "帐户设置", + "language": "语言选项", + "page_not_found": "页面未找到", + "username": "用户名", + "password": "密码", + "auth_source": "认证源", + "local": "本地", + "remember_me": "记住登录", + "forget_password": "忘记密码?", + "sign_up_now": "还没帐户?马上注册。" +} diff --git a/web/src/locales/zh-HK.json b/web/src/locales/zh-HK.json new file mode 100644 index 00000000000..99e86616e43 --- /dev/null +++ b/web/src/locales/zh-HK.json @@ -0,0 +1,31 @@ +{ + "app_desc": "基於 Go 語言的自助 Git 服務", + "home": "首頁", + "dashboard": "控制面版", + "issues": "問題", + "pull_requests": "合併請求", + "explore": "探索", + "help": "說明", + "register": "註冊", + "sign_in": "登入", + "sign_out": "登出", + "create_new": "創建...", + "new_repo": "新增儲存庫", + "new_migrate": "遷移外部倉庫", + "new_org": "新增組織", + "signed_in_as": "已登錄用戶", + "user_profile_and_more": "用戶信息及更多", + "your_profile": "個人資料", + "your_settings": "用戶設定", + "admin_panel": "管理面板", + "settings": "設定", + "language": "語言", + "page_not_found": "Page Not Found", + "username": "用戶名稱", + "password": "密碼", + "auth_source": "Authentication Source", + "local": "Local", + "remember_me": "記住登錄", + "forget_password": "忘記密碼?", + "sign_up_now": "還沒帳戶?馬上註冊。" +} diff --git a/web/src/locales/zh-TW.json b/web/src/locales/zh-TW.json new file mode 100644 index 00000000000..80fda9ce2ad --- /dev/null +++ b/web/src/locales/zh-TW.json @@ -0,0 +1,31 @@ +{ + "app_desc": "一款極易搭建的自助 Git 服務", + "home": "首頁", + "dashboard": "控制面板", + "issues": "問題", + "pull_requests": "合併請求", + "explore": "探索", + "help": "說明", + "register": "註冊", + "sign_in": "登入", + "sign_out": "登出", + "create_new": "創建...", + "new_repo": "新增儲存庫", + "new_migrate": "遷移外部倉庫", + "new_org": "新增組織", + "signed_in_as": "已登入用戶", + "user_profile_and_more": "用戶信息及更多", + "your_profile": "個人資訊", + "your_settings": "用戶設定", + "admin_panel": "管理面板", + "settings": "設定", + "language": "語言", + "page_not_found": "找不到頁面", + "username": "用戶名稱", + "password": "密碼", + "auth_source": "認證來源", + "local": "本地", + "remember_me": "記住登錄", + "forget_password": "忘記密碼?", + "sign_up_now": "還沒帳戶?馬上註冊。" +} diff --git a/web/src/main.tsx b/web/src/main.tsx new file mode 100644 index 00000000000..0934e74ac98 --- /dev/null +++ b/web/src/main.tsx @@ -0,0 +1,18 @@ +import { createRoot } from "react-dom/client"; + +import { App } from "./App"; +import { UserInfoProvider } from "./components/UserInfoProvider"; +import "./index.css"; +import "./lib/i18n"; +import { fetchUserInfo } from "./lib/user-info"; + +const userInfo = await fetchUserInfo(); + +const root = document.getElementById("root"); +if (root) { + createRoot(root).render( + + + , + ); +} diff --git a/web/src/pages/Landing.tsx b/web/src/pages/Landing.tsx new file mode 100644 index 00000000000..9c41defa758 --- /dev/null +++ b/web/src/pages/Landing.tsx @@ -0,0 +1,102 @@ +import { Link } from "@tanstack/react-router"; +import { useTranslation } from "react-i18next"; + +import { usePageTitle } from "@/lib/page-title"; +import { subUrl } from "@/lib/url"; + +export function Landing() { + const { t } = useTranslation(); + usePageTitle(); + return ( +
    +
    +
    +
    + + + + gogs — zsh +
    +
    +            $ 
    +            cat /etc/motd
    +            {"\n"}
    +            Gogs
    +            Gogs
    +            {"\n"}
    +            
    +              {t("app_desc")}
    +            
    +            {"\n"}
    +            $ 
    +            gogs help
    +            {"\n"}
    +            
    +            {"\n"}
    +            
    +            {"\n"}
    +            
    +            {"\n"}
    +            
    +            {"\n"}
    +            {"\n"}
    +            $ 
    +             
    +          
    +
    +
    +
    + ); +} + +function CmdLink({ + href, + cmd, + desc, + external, + spa, +}: { + href: string; + cmd: string; + desc: string; + external?: boolean; + spa?: boolean; +}) { + const className = + "group inline-flex items-baseline gap-2 rounded-sm hover:bg-(--color-surface) hover:text-(--color-foreground)"; + const inner = ( + <> + {cmd} + — {desc} + + + ); + if (spa) { + return ( + + {inner} + + ); + } + return ( + + {inner} + + ); +} diff --git a/web/src/pages/MFA.tsx b/web/src/pages/MFA.tsx new file mode 100644 index 00000000000..b20cc00a5cf --- /dev/null +++ b/web/src/pages/MFA.tsx @@ -0,0 +1,213 @@ +import { Link, getRouteApi, useNavigate } from "@tanstack/react-router"; +import { useEffect, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { usePageTitle } from "@/lib/page-title"; +import { subUrl } from "@/lib/url"; + +interface MFAErrorResponse { + error?: string; + fields?: Record; +} + +type Mode = "passcode" | "recovery"; + +const route = getRouteApi("/user/mfa"); + +export function MFA() { + const { t } = useTranslation(); + usePageTitle(t("mfa_title")); + const navigate = useNavigate(); + // When no challenge is pending the loader has already kicked off a full + // navigation away; the early return keeps this page from flashing. + const { pending } = route.useLoaderData(); + + const [mode, setMode] = useState("passcode"); + const [passcode, setPasscode] = useState(""); + const [recoveryCode, setRecoveryCode] = useState(""); + const [submitting, setSubmitting] = useState(false); + const [formError, setFormError] = useState(null); + const [fieldErrors, setFieldErrors] = useState>({}); + const passcodeRef = useRef(null); + const recoveryRef = useRef(null); + + // Focus the active input on initial render and on every mode swap. + // `autoFocus` on the JSX doesn't reliably fire when the route mounts via + // a TanStack navigate or when the conditional swaps which input is in the + // tree, so we drive focus explicitly off the mode. + useEffect(() => { + if (!pending) return; + if (mode === "passcode") passcodeRef.current?.focus(); + else recoveryRef.current?.focus(); + }, [mode, pending]); + + if (!pending) { + return null; + } + + function switchMode(next: Mode) { + setMode(next); + setFormError(null); + setFieldErrors({}); + } + + function onSubmit(event: React.FormEvent) { + event.preventDefault(); + setFormError(null); + setFieldErrors({}); + setSubmitting(true); + void (async () => { + try { + const url = mode === "passcode" ? subUrl("/api/web/user/mfa") : subUrl("/api/web/user/mfa/recovery"); + const body = mode === "passcode" ? JSON.stringify({ passcode }) : JSON.stringify({ recoveryCode }); + const res = await fetch(url, { + method: "POST", + credentials: "same-origin", + headers: { "Content-Type": "application/json" }, + body, + }); + if (!res.ok) { + const errBody = (await res.json().catch(() => ({}))) as MFAErrorResponse; + if (res.status === 401 && !errBody.fields) { + // Session-expired or missing 2FA session: send the user back to start. + await navigate({ to: "/user/sign-in" }); + return; + } + if (errBody.error) setFormError(errBody.error); + if (errBody.fields) setFieldErrors(errBody.fields); + if (!errBody.error && !errBody.fields) { + setFormError(t("mfa_verify_failed")); + } + setSubmitting(false); + // Focus after React re-enables the fieldset; .focus() is a no-op + // while the input is still inside a disabled fieldset, so we defer + // past the commit with rAF. + requestAnimationFrame(() => { + if (mode === "passcode") passcodeRef.current?.focus(); + else recoveryRef.current?.focus(); + }); + return; + } + const to = new URLSearchParams(window.location.search).get("redirect_to") ?? ""; + window.location.assign(subUrl("/redirect") + "?to=" + encodeURIComponent(to)); + } catch { + setFormError(t("mfa_verify_failed")); + setSubmitting(false); + } + })(); + } + + const isPasscode = mode === "passcode"; + const inputId = isPasscode ? "passcode" : "recovery_code"; + const inputErrorKey = isPasscode ? "passcode" : "recoveryCode"; + + return ( +
    + + + {t("mfa_title")} + + +
    +
    + {formError && ( +
    + {formError} +
    + )} + +
    + {isPasscode ? ( +
    + + setPasscode(e.target.value)} + aria-invalid={inputErrorKey in fieldErrors ? true : undefined} + aria-describedby={fieldErrors[inputErrorKey] ? `${inputId}-error` : undefined} + /> + {fieldErrors[inputErrorKey] && ( +

    + {fieldErrors[inputErrorKey]} +

    + )} +
    + ) : ( +
    + + setRecoveryCode(e.target.value)} + aria-invalid={inputErrorKey in fieldErrors ? true : undefined} + aria-describedby={fieldErrors[inputErrorKey] ? `${inputId}-error` : undefined} + /> + {fieldErrors[inputErrorKey] && ( +

    + {fieldErrors[inputErrorKey]} +

    + )} +
    + )} + +
    + + + +
    +
    +
    +
    +
    +
    +
    + ); +} diff --git a/web/src/pages/NotFound.tsx b/web/src/pages/NotFound.tsx new file mode 100644 index 00000000000..60c93ce6958 --- /dev/null +++ b/web/src/pages/NotFound.tsx @@ -0,0 +1,34 @@ +import { useTranslation } from "react-i18next"; + +import { usePageTitle } from "@/lib/page-title"; + +export function NotFound() { + const { t } = useTranslation(); + usePageTitle(t("page_not_found")); + const path = typeof window === "undefined" ? "/" : window.location.pathname; + return ( +
    +
    +
    +
    + + + + gogs — zsh +
    +
    +            $ 
    +            gogs show {path}
    +            {"\n"}
    +            fatal: pathspec '{path}' did not match any
    +            files known to gogs
    +            {"\n"}
    +            {"\n"}
    +            $ 
    +             
    +          
    +
    +
    +
    + ); +} diff --git a/web/src/pages/SignIn.tsx b/web/src/pages/SignIn.tsx new file mode 100644 index 00000000000..9ef6f48a8b2 --- /dev/null +++ b/web/src/pages/SignIn.tsx @@ -0,0 +1,257 @@ +import { getRouteApi, useNavigate } from "@tanstack/react-router"; +import { Eye, EyeOff } from "lucide-react"; +import { useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { usePageTitle } from "@/lib/page-title"; +import { subUrl } from "@/lib/url"; + +export interface LoginSource { + id: number; + name: string; + isDefault: boolean; +} + +export interface SignInPage { + loginSources: LoginSource[]; +} + +interface SignInResponse { + mfa?: boolean; +} + +interface SignInErrorResponse { + error?: string; + fields?: Record; +} + +// Field display order; the first key with a server-side error gets focus. +const FIELD_ORDER = ["username", "password"] as const; + +const route = getRouteApi("/user/sign-in"); + +export function SignIn() { + const { t } = useTranslation(); + usePageTitle(t("sign_in")); + const navigate = useNavigate(); + const { loginSources } = route.useLoaderData(); + const defaultSource = loginSources.find((s) => s.isDefault); + + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [loginSource, setLoginSource] = useState(defaultSource?.id ?? 0); + const [showPassword, setShowPassword] = useState(false); + const [submitting, setSubmitting] = useState(false); + const [formError, setFormError] = useState(null); + const [fieldErrors, setFieldErrors] = useState>({}); + const usernameRef = useRef(null); + const passwordRef = useRef(null); + + function onSubmit(event: React.FormEvent) { + event.preventDefault(); + setFormError(null); + setFieldErrors({}); + setSubmitting(true); + void (async () => { + try { + const res = await fetch(subUrl("/api/web/user/sign-in"), { + method: "POST", + credentials: "same-origin", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ username, password, loginSource }), + }); + if (!res.ok) { + const body = (await res.json().catch(() => ({}))) as SignInErrorResponse; + if (body.error) setFormError(body.error); + else setFormError(null); + let focusField: (typeof FIELD_ORDER)[number] | undefined; + if (body.fields) { + setFieldErrors(body.fields); + focusField = FIELD_ORDER.find((f) => f in (body.fields ?? {})); + } + if (!body.error && !body.fields) { + setFormError(t("sign_in_failed")); + } + setSubmitting(false); + // Defer focus past the React commit so the fieldset is re-enabled + // (.focus() is a no-op while the field is inside a disabled fieldset). + requestAnimationFrame(() => { + if (focusField === "username") usernameRef.current?.focus(); + else if (focusField === "password") passwordRef.current?.focus(); + }); + return; + } + const data = (await res.json()) as SignInResponse; + if (data.mfa) { + // Preserve ?redirect_to= so the MFA step can finalize the same target. + const search = new URLSearchParams(window.location.search); + const redirectTo = search.get("redirect_to"); + await navigate({ + to: "/user/mfa", + search: redirectTo ? { redirect_to: redirectTo } : {}, + }); + return; + } + const to = new URLSearchParams(window.location.search).get("redirect_to") ?? ""; + // /redirect is a server endpoint (303), must be a full navigation. + window.location.assign(subUrl("/redirect") + "?to=" + encodeURIComponent(to)); + } catch { + setFormError(t("sign_in_failed")); + setSubmitting(false); + } + })(); + } + + return ( +
    + + + {t("sign_in")} + + +
    +
    + {formError && ( +
    + {formError} +
    + )} + +
    +
    + + setUsername(e.target.value)} + aria-invalid={"username" in fieldErrors ? true : undefined} + aria-describedby={fieldErrors.username ? "username-error" : undefined} + /> + {fieldErrors.username && ( +

    + {fieldErrors.username} +

    + )} +
    + +
    + +
    + setPassword(e.target.value)} + aria-invalid={"password" in fieldErrors ? true : undefined} + aria-describedby={fieldErrors.password ? "password-error" : undefined} + className="pr-10" + /> + +
    + {fieldErrors.password && ( +

    + {fieldErrors.password} +

    + )} +
    + + {loginSources.length > 0 && ( +
    + + +
    + )} + +
    + + +
    +
    +
    +
    +
    +
    +
    + ); +} diff --git a/web/src/router.tsx b/web/src/router.tsx new file mode 100644 index 00000000000..7b0b3302b73 --- /dev/null +++ b/web/src/router.tsx @@ -0,0 +1,110 @@ +import { + Outlet, + RouterProvider, + createRootRouteWithContext, + createRoute, + createRouter, + redirect, +} from "@tanstack/react-router"; + +import { Footer } from "@/components/Footer"; +import { Navbar } from "@/components/Navbar"; +import { webContext } from "@/lib/context"; +import { subUrl } from "@/lib/url"; +import type { UserInfo } from "@/lib/user-info"; +import { Landing } from "@/pages/Landing"; +import { MFA } from "@/pages/MFA"; +import { NotFound } from "@/pages/NotFound"; +import { SignIn, type SignInPage } from "@/pages/SignIn"; + +interface RouterContext { + user: UserInfo | null; +} + +function RootLayout() { + return ( +
    + + +
    +
    + ); +} + +const rootRoute = createRootRouteWithContext()({ + component: RootLayout, + notFoundComponent: NotFound, +}); + +const landingRoute = createRoute({ + getParentRoute: () => rootRoute, + path: "/", + component: Landing, +}); + +const signInRoute = createRoute({ + getParentRoute: () => rootRoute, + path: "/user/sign-in", + beforeLoad: ({ context }) => { + if (context.user) { + // Full navigation to "/" so the server-rendered dashboard handler runs. + // A client-side TanStack redirect would render the SPA's "/" route + // (Landing, the anon page) and make an authed user look signed out. + window.location.assign(subUrl("/")); + // Throw to halt loader execution. TanStack treats the thrown redirect + // as a sentinel; we never reach a SPA navigation because the line + // above already started a document-level one. + // eslint-disable-next-line @typescript-eslint/only-throw-error -- TanStack's redirect() returns a sentinel that must be thrown. + throw redirect({ to: "/", replace: true }); + } + }, + loader: async (): Promise => { + const res = await fetch(subUrl("/api/web/user/sign-in"), { credentials: "same-origin" }); + if (!res.ok) { + return { loginSources: [] }; + } + return (await res.json()) as SignInPage; + }, + component: SignIn, +}); + +const mfaRoute = createRoute({ + getParentRoute: () => rootRoute, + path: "/user/mfa", + loader: async (): Promise<{ pending: boolean }> => { + const res = await fetch(subUrl("/api/web/user/mfa"), { credentials: "same-origin" }); + if (res.status === 404) { + // No pending MFA challenge — there is nothing to verify here, so fall + // through to the server-rendered home, which will redirect to sign-in + // for anonymous visitors and to the dashboard for signed-in ones. + window.location.assign(subUrl("/")); + return { pending: false }; + } + return { pending: res.ok }; + }, + component: MFA, +}); + +const routeTree = rootRoute.addChildren([landingRoute, signInRoute, mfaRoute]); + +function makeRouter(context: RouterContext) { + return createRouter({ + routeTree, + basepath: webContext.subURL || "/", + defaultNotFoundComponent: NotFound, + context, + }); +} + +type AppRouterInstance = ReturnType; + +declare module "@tanstack/react-router" { + interface Register { + router: AppRouterInstance; + } +} + +export function AppRouter({ user }: { user: UserInfo | null }) { + const router = makeRouter({ user }); + return ; +} diff --git a/web/src/vite-env.d.ts b/web/src/vite-env.d.ts new file mode 100644 index 00000000000..11f02fe2a00 --- /dev/null +++ b/web/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/web/tsconfig.app.json b/web/tsconfig.app.json new file mode 100644 index 00000000000..40f93874953 --- /dev/null +++ b/web/tsconfig.app.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"] +} diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 00000000000..d32ff682003 --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,4 @@ +{ + "files": [], + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] +} diff --git a/web/tsconfig.node.json b/web/tsconfig.node.json new file mode 100644 index 00000000000..1b2185a6ce4 --- /dev/null +++ b/web/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true, + "noEmit": true + }, + "include": ["vite.config.ts"] +} diff --git a/web/vite.config.ts b/web/vite.config.ts new file mode 100644 index 00000000000..fca1c0b7c73 --- /dev/null +++ b/web/vite.config.ts @@ -0,0 +1,21 @@ +import path from "node:path"; + +import tailwindcss from "@tailwindcss/vite"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [react(), tailwindcss()], + resolve: { + alias: { + "@": path.resolve(import.meta.dirname, "src"), + }, + }, + server: { + port: 5173, + }, + build: { + outDir: "../public/dist", + emptyOutDir: true, + }, +});